@randomorg/core
Version:
The official library to access the RANDOM.ORG JSON-RPC API
2 lines • 232 kB
JavaScript
var RandomOrgCore=function(e){"use strict";function t(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var s,r,a,n,i,u={};function c(){return s||(s=1,u.RandomOrgBadHTTPResponseError=class extends Error{constructor(e){super(e)}},u.RandomOrgInsufficientBitsError=class extends Error{#e=-1;constructor(e,t){super(e),this.#e=t}getBitsLeft(){return this.#e}},u.RandomOrgInsufficientRequestsError=class extends Error{constructor(e){super(e)}},u.RandomOrgJSONRPCError=class extends Error{constructor(e){super(e)}},u.RandomOrgKeyNotRunningError=class extends Error{constructor(e){super(e)}},u.RandomOrgRANDOMORGError=class extends Error{#t=-1;constructor(e,t=-1){super(e),this.#t=t}getCode(){return this.#t}},u.RandomOrgSendTimeoutError=class extends Error{constructor(e){super(e)}},u.RandomOrgCacheEmptyError=class extends Error{#s=!1;constructor(e,t=!1){super(e),this.#s=t}wasPaused(){return this.#s}}),u}function o(){if(a)return r;a=1;const{RandomOrgInsufficientBitsError:e,RandomOrgCacheEmptyError:t}=c();return r=class{#r=null;#a=null;#n=0;#i=0;#u=-1;#c=[];#o=10;#s=!1;#l=0;#h=0;#d=!1;#E=null;constructor(e,t,s,r,a,n){this.#r=e,this.#a=t,this.#o=s,this.#n=r,this.#i=a,this.#u=n,this.#g()}#g=async()=>{if(!this.#d&&!this.#s){this.#d=!0;let t=null;for(;null==this.#E;)if(this.#n>0){if(!(this.#c.length<=this.#o-this.#n))break;try{t=await this.#r(this.#a),this.#R(t,!0)}catch(s){if(s instanceof e){let e=s.getBitsLeft();if(e>this.#u){let s=Math.floor(e/this.#u);this.#a.params.n=s*this.#i,t=await this.#r(this.#a),this.#R(t,!0),this.#a.params.n=this.#n*this.#i}else this.#E=s}else this.#E=s}}else{if(!(this.#c.length<this.#o))break;try{t=await this.#r(this.#a),this.#R(t,!1)}catch(e){this.#E=e}}this.#d=!1}};stop(){this.#s=!0}resume(){this.#s=!1,this.#m()}isPaused(){return this.#s}get(){if(null!=this.#E)throw this.#E;if(this.#c&&0==this.#c.length)throw this.#s?new t("The RandomOrgCache stack is empty and the cache is paused. Please call resume() to restart populating the cache.",!0):new t("The RandomOrgCache stack is empty, please wait for it to repopulate itself.");{let e=this.#c.pop();return this.#m(),e}}async getOrWait(){try{return this.get()}catch(e){if(e instanceof t){if(this.#s)throw e;return 0==await this.#g()&&await new Promise(e=>setTimeout(e,50)),this.getOrWait()}}}getCachedValues(){return this.#c.length}getBitsUsed(){return this.#l}getRequestsUsed(){return this.#h}#m=()=>{(this.#n>0&&this.#c.length<=this.#o-this.#n||this.#n<=0&&this.#c.length<this.#o)&&this.#g()};#R=(e,t)=>{if(this.#h++,this.#l+=e.result.bitsUsed,t){let t=e.result.random.data;for(let e=0;e<t.length;e+=this.#i)this.#c.push(t.slice(e,e+this.#i))}else this.#c.push(e.result.random.data)}}}var l=function(){if(i)return n;i=1;const{RandomOrgBadHTTPResponseError:e,RandomOrgInsufficientBitsError:t,RandomOrgInsufficientRequestsError:s,RandomOrgJSONRPCError:r,RandomOrgKeyNotRunningError:a,RandomOrgRANDOMORGError:u,RandomOrgSendTimeoutError:l}=c(),h=o();return n=class n{static#T="generateIntegers";static#p="generateIntegerSequences";static#D="generateDecimalFractions";static#O="generateGaussians";static#f="generateStrings";static#_="generateUUIDs";static#S="generateBlobs";static#q="getUsage";static#I="generateSignedIntegers";static#y="generateSignedIntegerSequences";static#M="generateSignedDecimalFractions";static#b="generateSignedGaussians";static#A="generateSignedStrings";static#N="generateSignedUUIDs";static#U="generateSignedBlobs";static#x="getResult";static#L="createTickets";static#H="listTickets";static#k="revealTickets";static#C="getTicket";static#w="verifySignature";static BLOB_FORMAT_BASE64="base64";static BLOB_FORMAT_HEX="hex";static DEFAULT_REPLACEMENT=!0;static DEFAULT_BASE=10;static DEFAULT_USER_DATA=null;static DEFAULT_TICKET_ID=null;static DEFAULT_PREGENERATED_RANDOMIZATION=null;static DEFAULT_LICENSE_DATA=null;static UUID_SIZE=122;static DEFAULT_BLOCKING_TIMEOUT=864e5;static DEFAULT_HTTP_TIMEOUT=12e4;static MAX_URL_LENGTH=2046;static#G=1e3;static#B=36e5;#F=-1;#K=-1;#P=-1;#v="";#z="";#V=n.DEFAULT_BLOCKING_TIMEOUT;#j=n.DEFAULT_HTTP_TIMEOUT;#J=0;#Y=0;static#Z={};static#W=[100,101,200,201,202,203,204,300,301,302,303,304,305,306,307,400,401,402,403,404,405,420,421,422,423,424,425,426,500,32e3];constructor(e,t={}){if(n.#Z&&n.#Z[e])return n.#Z[e];this.#z=e,this.#V=t.blockingTimeout||864e5,this.#j=t.httpTimeout||12e4,n.#Z[e]=this}async generateIntegers(e,t,s,r={}){let a=this.#X(e,t,s,r);return this.#Q(this.#$(a))}async generateIntegerSequences(e,t,s,r,a={}){let n=this.#ee(e,t,s,r,a);return this.#Q(this.#$(n))}async generateDecimalFractions(e,t,s={}){let r=this.#te(e,t,s);return this.#Q(this.#$(r))}async generateGaussians(e,t,s,r,a={}){let n=this.#se(e,t,s,r,a);return this.#Q(this.#$(n))}async generateStrings(e,t,s,r={}){let a=this.#re(e,t,s,r);return this.#Q(this.#$(a))}async generateUUIDs(e,t={}){let s=this.#ae(e,t);return this.#Q(this.#$(s))}async generateBlobs(e,t,s={}){let r=this.#ne(e,t,s);return this.#Q(this.#$(r))}async generateSignedIntegers(e,t,s,r={}){let a=this.#X(e,t,s,r,!0);return this.#ie(this.#$(a))}async generateSignedIntegerSequences(e,t,s,r,a={}){let n=this.#ee(e,t,s,r,a,!0);return this.#ie(this.#$(n))}async generateSignedDecimalFractions(e,t,s={}){let r=this.#te(e,t,s,!0);return this.#ie(this.#$(r))}async generateSignedGaussians(e,t,s,r,a={}){let n=this.#se(e,t,s,r,a,!0);return this.#ie(this.#$(n))}async generateSignedStrings(e,t,s,r={}){let a=this.#re(e,t,s,r,!0);return this.#ie(this.#$(a))}async generateSignedUUIDs(e,t={}){let s=this.#ae(e,t,!0);return this.#ie(this.#$(s))}async generateSignedBlobs(e,t,s={}){let r=this.#ne(e,t,s,!0);return this.#ie(this.#$(r))}async verifySignature(e,t){let s={random:e,signature:t},r=this.#ue(n.#w,s);return this.#ce(this.#$(r))}async getBitsLeft(){let e=Date.now()>this.#Y+n.#B;return(this.#F<0||e)&&await this.#oe(),this.#F}async getRequestsLeft(){let e=Date.now()>this.#Y+n.#B;return(this.#K<0||e)&&await this.#oe(),this.#K}async getResult(e){let t={serialNumber:e},s=this.#le(n.#x,t);return this.#ie(this.#$(s))}async createTickets(e,t){let s={n:e,showResult:t},r=this.#le(n.#L,s);return this.#he(this.#$(r))}async revealTickets(e){let t={ticketId:e},s=this.#le(n.#k,t);return this.#he(this.#$(s))}async listTickets(e){let t={ticketType:e},s=this.#le(n.#H,t);return this.#he(this.#$(s))}async getTicket(e){let t={ticketId:e},s=this.#ue(n.#C,t);return this.#he(this.#$(s))}createUrl(e,t){let s="https://api.random.org/signatures/form?format=json";if(s+="&random="+this.#de(JSON.stringify(e)),s+="&signature="+this.#de(t),s.length>n.MAX_URL_LENGTH)throw new u("Error: URL exceeds maximum length("+n.MAX_URL_LENGTH+" characters).");return s}createHtml(e,t){let s="<form action='https://api.random.org/signatures/form' method='post'>\n";return s+=" "+this.#Ee("hidden","format","json")+"\n",s+=" "+this.#Ee("hidden","random",JSON.stringify(e))+"\n",s+=" "+this.#Ee("hidden","signature",t)+"\n",s+=" <input type='submit' value='Validate' />\n</form>",s}createIntegerCache(e,t,s,r={}){let a=r.cacheSize||20;a<2&&(a=2);let n=this.#X(e,t,s,r),i=Math.ceil(Math.log(s-t+1)/Math.log(2)*e),u=0;return"replacement"in r&&!0!==r.replacement||(u=a/2,n.params.n=e*u),new h(this.#$.bind(this),n,a,u,e,i)}createIntegerSequenceCache(e,t,s,r,a={}){let n=a.cacheSize||20;n<2&&(n=2);let i,u=Math.ceil(Math.log(this.#ge(r)-this.#Re(s),1)/Math.log(2)*e*this.#ge(t)),c=0;i=a.replacement&&Array.isArray(a.replacement)?a.replacement.every(e=>!0===e):a.replacement||!0,i&&(c=n/2,Array.isArray(t)&&(t=this.#me(t,c)),Array.isArray(s)&&(s=this.#me(s,c)),Array.isArray(r)&&(r=this.#me(r,c)),a.replacement&&Array.isArray(a.replacement)&&(a.replacement=this.#me(a.replacement,c)),a.base&&Array.isArray(a.base)&&(a.base=this.#me(a.base,c)));let o=this.#ee(e,t,s,r,a);return i&&(o.params.n=c*e),new h(this.#$.bind(this),o,n,c,e,u)}createDecimalFractionCache(e,t,s={}){let r=s.cacheSize||20;r<2&&(r=2);let a=this.#te(e,t,s),n=0;"replacement"in s&&!0!==s.replacement||(n=r/2,a.params.n=e*n);let i=Math.ceil(Math.log(10)/Math.log(2)*t*e);return new h(this.#$.bind(this),a,r,n,e,i)}createGaussianCache(e,t,s,r,a={}){let n=a.cacheSize||20;n<2&&(n=2);let i=Math.ceil(Math.log(Math.pow(10,r))/Math.log(2)*e),u=n/2,c=this.#se(e*u,t,s,r);return new h(this.#$.bind(this),c,n,u,e,i)}createStringCache(e,t,s,r={}){let a=r.cacheSize||20;a<2&&(a=2);let n=this.#re(e,t,s,r),i=Math.ceil(Math.log(s.length)/Math.log(2)*t*e),u=0;return"replacement"in r&&!0!==r.replacement||(u=a/2,n.params.n=e*u),new h(this.#$.bind(this),n,a,u,e,i)}createUUIDCache(e,t={}){let s=t.cacheSize||10;s<2&&(s=2);let r=e*n.UUID_SIZE,a=s/2,i=this.#ae(e*a);return new h(this.#$.bind(this),i,s,a,e,r)}createBlobCache(e,t,s={}){let r=s.cacheSize||10;r<2&&(r=2);let a=e*t,n=r/2,i=this.#ne(e*n,t,s);return new h(this.#$.bind(this),i,r,n,e,a)}#$=async function(i){if(-1!=this.#P){if(Date.now()<this.#P)throw new s(this.#v);this.#P=-1,this.#v=null}let c=this.#J-(Date.now()-this.#Y);if(-1!=this.#V&&c>this.#V)throw new l("The server advisory delay of "+c+"millis is greater than the defined maximum allowed blocking time of "+this.#V+"millis.");c>0&&await new Promise(e=>setTimeout(e,c));let o=this.#j;return new Promise(function(t){let s=new XMLHttpRequest;s.open("POST","https://api.random.org/json-rpc/4/invoke"),s.setRequestHeader("Content-Type","application/json"),s.ontimeout=function(){throw new l("The maximum allowed blocking time of "+o+"millis has been exceeded while waiting for the server to respond.")},s.onload=function(){if(!(this.status>=200&&this.status<300))throw new e("Error: "+s.status);t(s.responseText)},s.onerror=function(e){throw e instanceof Error?e:(console.info("** An error occurred during the transaction."),new Error(s.responseText))},s.timeout=o,s.send(JSON.stringify(i))}).then(e=>{if((e=JSON.parse(e)).error){let i=e.error.code,c=e.error.message,o=e.error.data;if(401==i)throw new a("Error "+i+": "+c);if(402==i){let e=(new Date).setUTCHours(0,0,0,0);throw this.#P=+e,this.#v="Error "+i+": "+c,this.#K=o[1],new s(this.#v)}throw 403==i?(this.#F=o[1],new t("Error"+i+": "+c,this.#F)):n.#W.includes(i)?new u("Error "+i+": "+c,i):new r("Error "+i+": "+c)}return[n.#w,n.#x,n.#L,n.#H,n.#C].includes(i.method)?this.#J=n.#G:(this.#K=e.result.requestsLeft,this.#F=e.result.bitsLeft,e.result.advisoryDelay?this.#J=e.result.advisoryDelay:this.#J=n.#G),this.#Y=Date.now(),e})};#oe=async()=>{let e=this.#le(n.#q,{});return this.#he(this.#$(e))};#ue=(e,t)=>({jsonrpc:"2.0",method:e,params:t,id:this.#Te()});#le=(e,t)=>(t.apiKey=this.#z,this.#ue(e,t));#Q=async e=>e.then(e=>e.result.random.data);#ie=async e=>e.then(e=>({data:e.result.random.data,random:e.result.random,signature:e.result.signature}));#ce=async e=>e.then(e=>e.result.authenticity);#he=async e=>e.then(e=>e.result);#X=(e,t,s,{replacement:r=!0,base:a=10,pregeneratedRandomization:i=null,licenseData:u=null,userData:c=null,ticketId:o=null}={},l=!1)=>{let h={n:e,min:t,max:s,replacement:r,base:a};h=this.#pe(h,i,u,c,o,l);let d=l?n.#I:n.#T;return this.#le(d,h)};#ee=(e,t,s,r,{replacement:a=!0,base:i=10,pregeneratedRandomization:u=null,licenseData:c=null,userData:o=null,ticketId:l=null}={},h=!1)=>{let d={n:e,length:t,min:s,max:r,replacement:a,base:i};d=this.#pe(d,u,c,o,l,h);let E=h?n.#y:n.#p;return this.#le(E,d)};#te=(e,t,{replacement:s=!0,pregeneratedRandomization:r=null,licenseData:a=null,userData:i=null,ticketId:u=null}={},c=!1)=>{let o={n:e,decimalPlaces:t,replacement:s};o=this.#pe(o,r,a,i,u,c);let l=c?n.#M:n.#D;return this.#le(l,o)};#se=(e,t,s,r,{pregeneratedRandomization:a=null,licenseData:i=null,userData:u=null,ticketId:c=null}={},o=!1)=>{let l={n:e,mean:t,standardDeviation:s,significantDigits:r};l=this.#pe(l,a,i,u,c,o);let h=o?n.#b:n.#O;return this.#le(h,l)};#re=(e,t,s,{replacement:r=!0,pregeneratedRandomization:a=null,licenseData:i=null,userData:u=null,ticketId:c=null}={},o=!1)=>{let l={n:e,length:t,characters:s,replacement:r};l=this.#pe(l,a,i,u,c,o);let h=o?n.#A:n.#f;return this.#le(h,l)};#ae=(e,{pregeneratedRandomization:t=null,licenseData:s=null,userData:r=null,ticketId:a=null}={},i=!1)=>{let u={n:e};u=this.#pe(u,t,s,r,a,i);let c=i?n.#N:n.#_;return this.#le(c,u)};#ne=(e,t,{format:s=this.BASE64,pregeneratedRandomization:r=null,licenseData:a=null,userData:i=null,ticketId:u=null},c=!1)=>{let o={n:e,size:t,format:s};o=this.#pe(o,r,a,i,u,c);let l=c?n.#U:n.#S;return this.#le(l,o)};#pe=(e,t,s,r,a,n=!1)=>(e.pregeneratedRandomization=t,n&&(e.licenseData=s,e.userData=r,e.ticketId=a),e);#me=(e,t)=>Array.from({length:t},()=>e).flat();#ge=e=>Array.isArray(e)?e.reduce(function(e,t){return Math.max(e,t)}):e;#Re=e=>Array.isArray(e)?e.reduce(function(e,t){return Math.min(e,t)}):e;#de=e=>{if(!/^([0-9a-zA-Z+/]{4})*(([0-9a-zA-Z+/]{2}==)|([0-9a-zA-Z+/]{3}=))?$/.test(e))try{window&&(e=btoa(e))}catch(t){t instanceof ReferenceError&&(e=Buffer.from(e).toString("base64"))}return e=(e=(e=e.replace(/=/g,"%3D")).replace(/\+/g,"%2B")).replace(/\//g,"%2F")};#Ee=(e,t,s)=>"<input type='"+e+"' name='"+t+"' value='"+s+"' />";#Te=()=>"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,function(e){var t=16*Math.random()|0;return("x"==e?t:3&t|8).toString(16)})},n}(),h=t(l),d=t(o()),E=t(c());let g=E.RandomOrgRANDOMORGError,R=E.RandomOrgBadHTTPResponseError,m=E.RandomOrgInsufficientBitsError,T=E.RandomOrgInsufficientRequestsError,p=E.RandomOrgJSONRPCError,D=E.RandomOrgKeyNotRunningError,O=E.RandomOrgSendTimeoutError,f=E.RandomOrgCacheEmptyError;return e.RandomOrgBadHTTPResponseError=R,e.RandomOrgCache=d,e.RandomOrgCacheEmptyError=f,e.RandomOrgClient=h,e.RandomOrgInsufficientBitsError=m,e.RandomOrgInsufficientRequestsError=T,e.RandomOrgJSONRPCError=p,e.RandomOrgKeyNotRunningError=D,e.RandomOrgRANDOMORGError=g,e.RandomOrgSendTimeoutError=O,e.default=h,Object.defineProperty(e,"__esModule",{value:!0}),e}({});
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmRvY29yZS5paWZlLm1pbi5qcyIsInNvdXJjZXMiOlsiLi4vUmFuZG9tT3JnRXJyb3JzLmpzIiwiLi4vUmFuZG9tT3JnQ2FjaGUuanMiLCIuLi9SYW5kb21PcmdDbGllbnQuanMiLCIuLi9lc20vaW5kZXguanMiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIEVycm9yIHRocm93biBieSB0aGUgUmFuZG9tT3JnQ2xpZW50IGNsYXNzIHdoZW4gdGhlIGNvbm5lY3Rpb24gZG9lc24ndCByZXR1cm5cbiAqIGEgSFRUUCAyMDAgT0sgcmVzcG9uc2UuXG4gKi9cbmV4cG9ydHMuUmFuZG9tT3JnQmFkSFRUUFJlc3BvbnNlRXJyb3IgPSBjbGFzcyBSYW5kb21PcmdCYWRIVFRQUmVzcG9uc2VFcnJvciBleHRlbmRzIEVycm9yXG57XG4gICAgLyoqXG4gICAgICogQ29uc3RydWN0cyBhIG5ldyBleGNlcHRpb24gd2l0aCB0aGUgc3BlY2lmaWVkIGRldGFpbCBtZXNzYWdlLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlIFRoZSBkZXRhaWwgbWVzc2FnZS5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihtZXNzYWdlKSB7XG4gICAgICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBFcnJvciB0aHJvd24gYnkgdGhlIFJhbmRvbU9yZ0NsaWVudCBjbGFzcyB3aGVuIGl0cyBBUEkga2V5J3MgcmVxdWVzdCBoYXNcbiAqIGV4Y2VlZGVkIGl0cyByZW1haW5pbmcgc2VydmVyIGJpdHMgYWxsb3dhbmNlLlxuICogXG4gKiBJZiB0aGUgY2xpZW50IGlzIGN1cnJlbnRseSBpc3N1aW5nIGxhcmdlIHJlcXVlc3RzIGl0IG1heSBiZSBwb3NzaWJsZSBzdWNjZWVkXG4gKiB3aXRoIHNtYWxsZXIgcmVxdWVzdHMuIFVzZSB0aGUgZ2V0Qml0c0xlZnQoKSBjYWxsIGluIHRoaXMgY2xhc3MgdG8gaGVscFxuICogZGV0ZXJtaW5lIGlmIGFuIGFsdGVybmF0aXZlIHJlcXVlc3Qgc2l6ZSBpcyBhcHByb3ByaWF0ZS5cbiAqL1xuIGV4cG9ydHMuUmFuZG9tT3JnSW5zdWZmaWNpZW50Qml0c0Vycm9yID0gY2xhc3MgUmFuZG9tT3JnSW5zdWZmaWNpZW50Qml0c0Vycm9yIGV4dGVuZHMgRXJyb3JcbntcbiAgICAvLyBTdG9yZXMgdGhlIG51bWJlciBvZiBiaXRzIHJlbWFpbmluZ1xuICAgICNiaXRzID0gLTE7XG4gICAgXG4gICAgLyoqXG4gICAgICogQ29uc3RydWN0cyBhIG5ldyBleGNlcHRpb24gd2l0aCB0aGUgc3BlY2lmaWVkIGRldGFpbCBtZXNzYWdlLlxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlIFRoZSBkZXRhaWwgbWVzc2FnZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gYml0cyBCaXRzIHJlbWFpbmluZyBqdXN0IGJlZm9yZSB0aGUgZXJyb3Igd2FzIHRocm93bi5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihtZXNzYWdlLCBiaXRzKSB7XG4gICAgICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgICAgICB0aGlzLiNiaXRzID0gYml0cztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBudW1iZXIgb2YgYml0cyByZW1haW5pbmcuXG4gICAgICogQHJldHVybnMge251bWJlcn0gVGhlIG51bWJlciBvZiBiaXRzIGxlZnQuXG4gICAgICovXG4gICAgZ2V0Qml0c0xlZnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNiaXRzO1xuICAgIH1cbn1cblxuLyoqXG4gKiBFcnJvciB0aHJvd24gYnkgdGhlIFJhbmRvbU9yZ0NsaWVudCBjbGFzcyB3aGVuIGl0cyBBUEkga2V5J3Mgc2VydmVyIHJlcXVlc3RzXG4gKiBhbGxvd2FuY2UgaGFzIGJlZW4gZXhjZWVkZWQuXG4gKiBcbiAqIFRoaXMgaW5kaWNhdGVzIHRoYXQgYSBiYWNrLW9mZiB1bnRpbCBtaWRuaWdodCBVVEMgaXMgaW4gZWZmZWN0LCBiZWZvcmUgd2hpY2hcbiAqIG5vIHJlcXVlc3RzIHdpbGwgYmUgc2VudCBieSB0aGUgY2xpZW50IGFzIG5vIG1lYW5pbmdmdWwgc2VydmVyIHJlc3BvbnNlcyB3aWxsXG4gKiBiZSByZXR1cm5lZC5cbiAqL1xuZXhwb3J0cy5SYW5kb21PcmdJbnN1ZmZpY2llbnRSZXF1ZXN0c0Vycm9yID0gY2xhc3MgUmFuZG9tT3JnSW5zdWZmaWNpZW50UmVxdWVzdHNFcnJvciBleHRlbmRzIEVycm9yXG57XG4gICAgLyoqXG4gICAgICogQ29uc3RydWN0cyBhIG5ldyBleGNlcHRpb24gd2l0aCB0aGUgc3BlY2lmaWVkIGRldGFpbCBtZXNzYWdlLlxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlIFRoZSBkZXRhaWwgbWVzc2FnZS5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihtZXNzYWdlKSB7XG4gICAgICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBFcnJvciB0aHJvd24gYnkgdGhlIFJhbmRvbU9yZ0NsaWVudCBjbGFzcyB3aGVuIHRoZSBzZXJ2ZXIgcmV0dXJucyBhIEpTT04tUlBDXG4gKiBFcnJvci4gU2VlIGh0dHBzOi8vYXBpLnJhbmRvbS5vcmcvanNvbi1ycGMvNC9lcnJvci1jb2Rlc1xuICovXG5leHBvcnRzLlJhbmRvbU9yZ0pTT05SUENFcnJvciA9IGNsYXNzIFJhbmRvbU9yZ0pTT05SUENFcnJvciBleHRlbmRzIEVycm9yXG57XG4gICAgLyoqXG4gICAgICogQ29uc3RydWN0cyBhIG5ldyBleGNlcHRpb24gd2l0aCB0aGUgc3BlY2lmaWVkIGRldGFpbCBtZXNzYWdlLlxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlIFRoZSBkZXRhaWwgbWVzc2FnZS5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihtZXNzYWdlKSB7XG4gICAgICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBFcnJvciB0aHJvd24gYnkgdGhlIFJhbmRvbU9yZ0NsaWVudCBjbGFzcyB3aGVuIGl0cyBBUEkga2V5IGhhcyBiZWVuIHN0b3BwZWQuXG4gKiBSZXF1ZXN0cyB3aWxsIG5vdCBjb21wbGV0ZSB3aGlsZSBBUEkga2V5IGlzIGluIHRoZSBzdG9wcGVkIHN0YXRlLlxuICovXG5leHBvcnRzLlJhbmRvbU9yZ0tleU5vdFJ1bm5pbmdFcnJvciA9IGNsYXNzIFJhbmRvbU9yZ0tleU5vdFJ1bm5pbmdFcnJvciBleHRlbmRzIEVycm9yXG57XG4gICAgLyoqXG4gICAgICogRXJyb3IgdGhyb3duIGJ5IHRoZSBSYW5kb21PcmdDbGllbnQgY2xhc3Mgd2hlbiBpdHMgQVBJIGtleSBoYXMgYmVlbiBzdG9wcGVkLlxuICAgICAqIFJlcXVlc3RzIHdpbGwgbm90IGNvbXBsZXRlIHdoaWxlIEFQSSBrZXkgaXMgaW4gdGhlIHN0b3BwZWQgc3RhdGUuXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2UgVGhlIGRldGFpbCBtZXNzYWdlLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKG1lc3NhZ2UpIHtcbiAgICAgICAgc3VwZXIobWVzc2FnZSk7XG4gICAgfVxufVxuXG4vKipcbiAqIEVycm9yIHRocm93biBieSB0aGUgUmFuZG9tT3JnQ2xpZW50IGNsYXNzIHdoZW4gdGhlIHNlcnZlciByZXR1cm5zIGFcbiAqIFJBTkRPTS5PUkcgRXJyb3IuIFNlZSBodHRwczovL2FwaS5yYW5kb20ub3JnL2pzb24tcnBjLzQvZXJyb3ItY29kZXNcbiAqL1xuZXhwb3J0cy5SYW5kb21PcmdSQU5ET01PUkdFcnJvciA9IGNsYXNzIFJhbmRvbU9yZ1JBTkRPTU9SR0Vycm9yIGV4dGVuZHMgRXJyb3JcbntcbiAgICAvLyBTdG9yZXMgdGhlIGNvZGUgb2YgdGhlIFJBTkRPTS5PUkcgZXJyb3JcbiAgICAjY29kZSA9IC0xO1xuXG4gICAgLyoqXG4gICAgICogRXJyb3IgdGhyb3duIGJ5IHRoZSBSYW5kb21PcmdDbGllbnQgY2xhc3Mgd2hlbiB0aGUgc2VydmVyIHJldHVybnMgYVxuICAgICAqIFJBTkRPTS5PUkcgRXJyb3IuIFNlZSBodHRwczovL2FwaS5yYW5kb20ub3JnL2pzb24tcnBjLzQvZXJyb3ItY29kZXNcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZSBUaGUgZGV0YWlsIG1lc3NhZ2UuXG4gICAgICogQHBhcmFtIHtudW1iZXI9fSBbY29kZT0tMV0gVGhlIGVycm9yIGNvZGUuXG4gICAgICovXG4gICAgY29uc3RydWN0b3IobWVzc2FnZSwgY29kZSA9IC0xKSB7XG4gICAgICAgIHN1cGVyKG1lc3NhZ2UpOyAgICBcbiAgICAgICAgdGhpcy4jY29kZSA9IGNvZGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgUkFORE9NLk9SRyBlcnJvciBjb2RlLCBzZWVcbiAgICAgKiBodHRwczovL2FwaS5yYW5kb20ub3JnL2pzb24tcnBjLzQvZXJyb3ItY29kZXNcbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBUaGUgZXJyb3IgY29kZS5cbiAgICAgKi9cbiAgICBnZXRDb2RlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jY29kZTtcbiAgICB9XG59XG5cbi8qKlxuICogRXJyb3IgdGhyb3duIGJ5IHRoZSBSYW5kb21PcmdDbGllbnQgY2xhc3Mgd2hlbiBpdHMgc2V0IGJsb2NraW5nIHRpbWVvdXQgaXNcbiAqIGV4Y2VlZGVkIGJlZm9yZSB0aGUgcmVxdWVzdCBjYW4gYmUgc2VudC5cbiAqL1xuZXhwb3J0cy5SYW5kb21PcmdTZW5kVGltZW91dEVycm9yID0gY2xhc3MgUmFuZG9tT3JnU2VuZFRpbWVvdXRFcnJvciBleHRlbmRzIEVycm9yXG57XG4gICAgLyoqXG4gICAgICogRXJyb3IgdGhyb3duIGJ5IHRoZSBSYW5kb21PcmdDbGllbnQgY2xhc3Mgd2hlbiBpdHMgc2V0IGJsb2NraW5nIHRpbWVvdXQgaXNcbiAgICAgKiBleGNlZWRlZCBiZWZvcmUgdGhlIHJlcXVlc3QgY2FuIGJlIHNlbnQuXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2UgVGhlIGRldGFpbCBtZXNzYWdlLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKG1lc3NhZ2UpIHtcbiAgICAgICAgc3VwZXIobWVzc2FnZSk7XG4gICAgfVxufVxuXG4vKipcbiAqIEVycm9yIHRocm93biB3aGVuIGRhdGEgcmV0cmlldmFsIGZyb20gYW4gZW10cHkgUmFuZG9tT3JnQ2FjaGUgaXMgYXR0ZW1wdGVkLlxuICovXG5leHBvcnRzLlJhbmRvbU9yZ0NhY2hlRW1wdHlFcnJvciA9IGNsYXNzIFJhbmRvbU9yZ0NhY2hlRW1wdHlFcnJvciBleHRlbmRzIEVycm9yXG57XG4gICAgI3BhdXNlZCA9IGZhbHNlO1xuXG4gICAgLyoqXG4gICAgICogRXJyb3IgdGhyb3duIHdoZW4gZGF0YSByZXRyaWV2YWwgZnJvbSBhbiBlbXRweSBSYW5kb21PcmdDYWNoZSBpcyBhdHRlbXB0ZWQuXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2UgVGhlIGRldGFpbCBtZXNzYWdlLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gcGF1c2VkIFJlZmxlY3RzIHdoZXRoZXIgdGhlIFJhbmRvbU9yZ0NhY2hlIGluc3RhbmNlIHdhc1xuICAgICAqICAgICBwYXVzZWQgd2hlbiB0aGlzIGVycm9yIHdhcyB0aHJvd24uXG4gICAgICovXG4gICAgY29uc3RydWN0b3IobWVzc2FnZSwgcGF1c2VkID0gZmFsc2UpIHtcbiAgICAgICAgc3VwZXIobWVzc2FnZSk7XG4gICAgICAgIHRoaXMuI3BhdXNlZCA9IHBhdXNlZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGNhY2hlIHdhcyBwYXVzZWQgYXQgdGhlIHRpbWUgd2hlbiB0aGVcbiAgICAgKiBlcnJvciB3YXMgdGhyb3duLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHBhdXNlZCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgICAqL1xuICAgIHdhc1BhdXNlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3BhdXNlZDtcbiAgICB9XG59IiwiJ3VzZSBzdHJpY3QnO1xuY29uc3Qge1xuICAgIFJhbmRvbU9yZ0luc3VmZmljaWVudEJpdHNFcnJvcixcbiAgICBSYW5kb21PcmdDYWNoZUVtcHR5RXJyb3Jcbn0gPSByZXF1aXJlKCcuL1JhbmRvbU9yZ0Vycm9ycy5qcycpO1xuLyoqXG4gKiBQcmVjYWNoZSBjbGFzcyBmb3IgZnJlcXVlbnRseSB1c2VkIHJlcXVlc3RzLlxuICovXG5tb2R1bGUuZXhwb3J0cyA9IGNsYXNzIFJhbmRvbU9yZ0NhY2hlIHtcbiAgICAvLyBmdW5jdGlvbiB1c2VkIHRvIHNlbmQgYSByZXF1ZXN0XG4gICAgI3JlcXVlc3RGdW5jdGlvbiA9IG51bGw7XG5cbiAgICAvLyByZXF1ZXN0IHRvIGJlIHNlbnRcbiAgICAjcmVxdWVzdCA9IG51bGw7XG5cbiAgICAvLyBuIGZvciBidWxrIHJlcXVlc3RzXG4gICAgI2J1bGtSZXF1ZXN0TnVtYmVyID0gMDtcbiAgICAvLyBuIGZvciBhIHNpbmdsZSByZXF1ZXN0XG4gICAgI3JlcXVlc3ROdW1iZXIgPSAwO1xuICAgIC8vIHNpemUgb2YgYSBzaW5nbGUgcmVxdWVzdCBpbiBiaXRzXG4gICAgI3JlcXVlc3RTaXplID0gLTE7XG5cbiAgICAvLyBzdG9yZXMgY2FjaGVkIGFycmF5cyBvZiB2YWx1ZXNcbiAgICAjc3RhY2sgPSBbXTtcbiAgICAvLyBudW1iZXIgb2YgYXJyYXlzIHRvIHRyeSB0byBtYWludGFpbiBpbiAjc3RhY2tcbiAgICAjY2FjaGVTaXplID0gMTA7XG5cbiAgICAvLyBzdGF0dXMgb2YgdGhlIGNhY2hlXG4gICAgI3BhdXNlZCA9IGZhbHNlO1xuICAgIC8vIGJpdHMgdXNlZCBieSB0aGlzIGNhY2hlXG4gICAgI2JpdHNVc2VkID0gMDtcbiAgICAvLyByZXF1ZXN0cyB1c2VkIGJ5IHRoaXMgY2FjaGVcbiAgICAjcmVxdWVzdHNVc2VkID0gMDtcbiAgICAvLyBlbnN1cmVzICNwb3B1bGF0ZSgpIGRvZXMgbm90IGlzc3VlIHBhcmFsbGVsIHJlcXVlc3RzXG4gICAgI2N1cnJlbnRseVBvcHVsYXRpbmcgPSBmYWxzZTtcblxuICAgIC8vIGFuIGVycm9yIHdoaWNoIHdpbGwgYmUgdGhyb3duIG9uIHRoZSBuZXh0IGNhbGwgdG8gZ2V0KCkgb3IgZ2V0T3JXYWl0KClcbiAgICAjZXJyb3IgPSBudWxsO1xuXG4gICAgLyoqXG4gICAgICogSW5pdGlhbGl6ZSBjbGFzcyBhbmQgc3RhcnQgc3RhY2sgcG9wdWxhdGlvblxuICAgICAqIFxuICAgICAqICoqIFdBUk5JTkcqKiBTaG91bGQgb25seSBiZSBjYWxsZWQgYnkgUmFuZG9tT3JnQ2xpZW50J3MgY3JlYXRlQ2FjaGUoKVxuICAgICAqIG1ldGhvZHMuXG4gICAgICogQHBhcmFtIHtmdW5jdGlvbihPYmplY3QpIDogT2JqZWN0fSByZXF1ZXN0RnVuY3Rpb24gRnVuY3Rpb24gdXNlZCB0byBzZW5kXG4gICAgICogICAgIHN1cHBsaWVkIHJlcXVlc3QgdG8gc2VydmVyLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSByZXF1ZXN0IFJlcXVlc3QgdG8gc2VuZCB0byBzZXJ2ZXIgdmlhIHJlcXVlc3RGdW5jdGlvbi5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gY2FjaGVTaXplIE51bWJlciBvZiByZXF1ZXN0IHJlc3BvbnNlcyB0byB0cnkgbWFpbnRhaW4uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGJ1bGtSZXF1ZXN0TnVtYmVyIElmIHJlcXVlc3QgaXMgc2V0IHRvIGJlIGlzc3VlZCBpbiBidWxrLFxuICAgICAqICAgICBudW1iZXIgb2YgcmVzdWx0IHNldHMgaW4gYSBidWxrIHJlcXVlc3QsIGVsc2UgMC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcmVxdWVzdE51bWJlciBJZiByZXF1ZXN0IGlzIHNldCB0byBiZSBpc3N1ZWQgaW4gYnVsayxcbiAgICAgKiAgICAgbnVtYmVyIG9mIHJlc3VsdHMgaW4gYSBzaW5nbGUgcmVxdWVzdCwgZWxzZSAwLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBzaW5nbGVSZXF1ZXN0U2l6ZSBTaXplIG9mIGEgc2luZ2xlIHJlcXVlc3QgaW4gYml0cyBmb3JcbiAgICAgKiAgICAgYWRqdXN0aW5nIGJ1bGsgcmVxdWVzdHMgaWYgYml0cyBhcmUgaW4gc2hvcnQgc3VwcGx5IG9uIHRoZSBzZXJ2ZXIuXG4gICAgICovXG4gICAgY29uc3RydWN0b3IocmVxdWVzdEZ1bmN0aW9uLCByZXF1ZXN0LCBjYWNoZVNpemUsIGJ1bGtSZXF1ZXN0TnVtYmVyLCByZXF1ZXN0TnVtYmVyLCBzaW5nbGVSZXF1ZXN0U2l6ZSkge1xuICAgICAgICB0aGlzLiNyZXF1ZXN0RnVuY3Rpb24gPSByZXF1ZXN0RnVuY3Rpb247XG5cbiAgICAgICAgdGhpcy4jcmVxdWVzdCA9IHJlcXVlc3Q7XG4gICAgICAgIFxuICAgICAgICB0aGlzLiNjYWNoZVNpemUgPSBjYWNoZVNpemU7XG5cbiAgICAgICAgdGhpcy4jYnVsa1JlcXVlc3ROdW1iZXIgPSBidWxrUmVxdWVzdE51bWJlcjtcbiAgICAgICAgdGhpcy4jcmVxdWVzdE51bWJlciA9IHJlcXVlc3ROdW1iZXI7XG4gICAgICAgIHRoaXMuI3JlcXVlc3RTaXplID0gc2luZ2xlUmVxdWVzdFNpemU7XG5cbiAgICAgICAgdGhpcy4jcG9wdWxhdGUoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGdW5jdGlvbiB0byBjb250aW51ZSBpc3N1aW5nIHJlcXVlc3RzIHVudGlsIHRoZSBzdGFjayBpcyBmdWxsLlxuICAgICAqIFxuICAgICAqIEtlZXAgaXNzdWluZyByZXF1ZXN0cyB0byBzZXJ2ZXIgdW50aWwgc3RhY2sgaXMgZnVsbC4gV2hlbiBzdGFjayBpcyBmdWxsXG4gICAgICogaWYgcmVxdWVzdHMgYXJlIGJlaW5nIGlzc3VlZCBpbiBidWxrLCB3YWl0IHVudGlsIHN0YWNrIGhhcyBlbm91Z2ggc3BhY2VcbiAgICAgKiB0byBhY2NvbW1vZGF0ZSBhbGwgb2YgYSBidWxrIHJlcXVlc3QgYmVmb3JlIGlzc3VpbmcgYSBuZXcgcmVxdWVzdCwgb3RoZXJ3aXNlXG4gICAgICogaXNzdWUgYSBuZXcgcmVxdWVzdCBldmVyeSB0aW1lIGFuIGl0ZW0gaW4gdGhlIHN0YWNrIGhhcyBiZWVuIGNvbnN1bWVkLiBOb3RlXG4gICAgICogdGhhdCByZXF1ZXN0cyBhcmUgYmxvY2tpbmcgKCdhd2FpdCcgaXMgdXNlZCB3aGVuIGNhbGxpbmcgdGhlIHJlcXVlc3RGdW5jdGlvbiksXG4gICAgICogaS5lLiwgb25seSBvbmUgcmVxdWVzdCB3aWxsIGJlIGlzc3VlZCBieSB0aGUgY2FjaGUgYXQgYW55IGdpdmVuIHRpbWUuXG4gICAgICovXG4gICAgI3BvcHVsYXRlID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICBpZiAoIXRoaXMuI2N1cnJlbnRseVBvcHVsYXRpbmcgJiYgIXRoaXMuI3BhdXNlZCkge1xuICAgICAgICAgICAgdGhpcy4jY3VycmVudGx5UG9wdWxhdGluZyA9IHRydWU7XG5cbiAgICAgICAgICAgIGxldCByZXNwb25zZSA9IG51bGw7XG5cbiAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuI2Vycm9yICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0aGlzLiNidWxrUmVxdWVzdE51bWJlciA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gSXMgdGhlcmUgc3BhY2UgZm9yIGEgYnVsayByZXNwb25zZSBpbiB0aGUgc3RhY2s/XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLiNzdGFjay5sZW5ndGggPD0gKHRoaXMuI2NhY2hlU2l6ZSAtIHRoaXMuI2J1bGtSZXF1ZXN0TnVtYmVyKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZSA9IGF3YWl0IHRoaXMuI3JlcXVlc3RGdW5jdGlvbih0aGlzLiNyZXF1ZXN0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiNhZGRSZXNwb25zZShyZXNwb25zZSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm90IGVub3VnaCBiaXRzIHJlbWFpbmluZyBmb3IgYSBidWxrIHJlcXVlc3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIFJhbmRvbU9yZ0luc3VmZmljaWVudEJpdHNFcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgYml0c0xlZnQgPSBlLmdldEJpdHNMZWZ0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiaXRzTGVmdCA+IHRoaXMuI3JlcXVlc3RTaXplKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiBwb3NzaWJsZSwgYWRqdXN0IHJlcXVlc3QgZm9yIHRoZSBsYXJnZXN0IHBvc3NpYmxlIHNpemVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhZGp1c3RlZEJ1bGsgPSBNYXRoLmZsb29yKGJpdHNMZWZ0L3RoaXMuI3JlcXVlc3RTaXplKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuI3JlcXVlc3QucGFyYW1zLm4gPSBhZGp1c3RlZEJ1bGsgKiB0aGlzLiNyZXF1ZXN0TnVtYmVyO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZSA9IGF3YWl0IHRoaXMuI3JlcXVlc3RGdW5jdGlvbih0aGlzLiNyZXF1ZXN0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuI2FkZFJlc3BvbnNlKHJlc3BvbnNlLCB0cnVlKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVzZXQgdG8gb3JpZ2luYWwgYnVsayByZXF1ZXN0IHNpemVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuI3JlcXVlc3QucGFyYW1zLm4gPSB0aGlzLiNidWxrUmVxdWVzdE51bWJlciAqIHRoaXMuI3JlcXVlc3ROdW1iZXI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXF1ZXN0IHNpemUgY2Fubm90IGJlIGFkanVzdGVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiNlcnJvciA9IGU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFueSBvdGhlciBlcnJvciB0aHJvd24gZHVyaW5nIGluIHRoZSByZXF1ZXN0IGZ1bmN0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuI2Vycm9yID0gZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBubyBzcGFjZSBmb3IgYSBidWxrIHJlcXVlc3RcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLiNzdGFjay5sZW5ndGggPCB0aGlzLiNjYWNoZVNpemUpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gaW5kaXZpZHVhbCByZXF1ZXN0c1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLiNyZXF1ZXN0RnVuY3Rpb24odGhpcy4jcmVxdWVzdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiNhZGRSZXNwb25zZShyZXNwb25zZSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuI2Vycm9yID0gZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHRoZSBzdGFjayBpcyBmdWxsXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gICAgICAgICAgICAgICBcblxuICAgICAgICAgICAgdGhpcy4jY3VycmVudGx5UG9wdWxhdGluZyA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGNhY2hlIHdpbGwgbm8gbG9uZ2VyIGNvbnRpbnVlIHRvIHBvcHVsYXRlIGl0c2VsZi5cbiAgICAgKi9cbiAgICBzdG9wKCkge1xuICAgICAgICB0aGlzLiNwYXVzZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBjYWNoZSB3aWxsIHJlc3VtZSBwb3B1bGF0aW5nIGl0c2VsZiBpZiBzdG9wcGVkLlxuICAgICAqL1xuICAgIHJlc3VtZSgpIHtcbiAgICAgICAgdGhpcy4jcGF1c2VkID0gZmFsc2U7XG5cbiAgICAgICAgLy8gY2hlY2sgaWYgaXQgbmVlZHMgdG8gYmUgcmVwb3B1bGF0ZWRcbiAgICAgICAgdGhpcy4jcmVmcmVzaCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiB0aGUgY2FjaGUgaXMgY3VycmVudGx5IG5vdCByZS1wb3B1bGF0aW5nIGl0c2VsZi5cbiAgICAgKiBcbiAgICAgKiBWYWx1ZXMgY3VycmVudGx5IGNhY2hlZCBtYXkgc3RpbGwgYmUgcmV0cmlldmVkIHdpdGggZ2V0KCkgYnV0IG5vIG5ld1xuICAgICAqIHZhbHVlcyBhcmUgYmVpbmcgZmV0Y2hlZCBmcm9tIHRoZSBzZXJ2ZXIuIFRoaXMgc3RhdGUgY2FuIGJlIGNoYW5nZWQgd2l0aFxuICAgICAqIHN0b3AoKSBhbmQgcmVzdW1lKCkuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgY2FjaGUgaXMgY3VycmVudGx5IG5vdCByZS1wb3B1bGF0aW5nIGl0c2VsZixcbiAgICAgKiAgICAgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgICAqL1xuICAgIGlzUGF1c2VkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jcGF1c2VkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIG5leHQgcmVzcG9uc2UuXG4gICAgICogTm90ZSB0aGF0IGlmIHRoZSBjYWNoZSBpcyBlbXB0eSwgaWYgd2FzIGNvbnN0cnVjdGVkIHdpdGggdW5zdWl0YWJsZSBwYXJhbWV0ZXJcbiAgICAgKiB2YWx1ZXMgb3IgaWYgdGhlIGRhaWx5IGFsbG93YW5jZSBvZiBiaXRzL3JlcXVlc3RzIGhhcyBiZWVuIHJlYWNoZWQsIHRoZSBhcHByb3ByaWF0ZVxuICAgICAqIGVycm9yIHdpbGwgYmUgdGhyb3duLlxuICAgICAqIEByZXR1cm5zIHthbnlbXX0gVGhlIG5leHQgYXBwcm9wcmlhdGUgcmVzcG9uc2UgZm9yIHRoZSByZXF1ZXN0IHRoaXMgUmFuZG9tT3JnQ2FjaGVcbiAgICAgKiAgICAgcmVwcmVzZW50cyBvciwgaWYgc3RhY2sgaXMgZW1wdHkgdGhyb3dzIGFuIGVycm9yLlxuICAgICAqIEB0aHJvd3MgUmFuZG9tT3JnQ2FjaGVFbXB0eUVycm9yIGlmIHRoZSBjYWNoZSBpcyBlbXB0eS5cbiAgICAgKi9cbiAgICBnZXQoKSB7XG4gICAgICAgIGlmICh0aGlzLiNlcnJvciAhPSBudWxsKSB7XG4gICAgICAgICAgICB0aHJvdyB0aGlzLiNlcnJvcjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy4jc3RhY2sgJiYgdGhpcy4jc3RhY2subGVuZ3RoID09IDApIHtcbiAgICAgICAgICAgIGlmICh0aGlzLiNwYXVzZWQpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmFuZG9tT3JnQ2FjaGVFbXB0eUVycm9yKCdUaGUgUmFuZG9tT3JnQ2FjaGUgc3RhY2sgJ1xuICAgICAgICAgICAgICAgICAgICArICdpcyBlbXB0eSBhbmQgdGhlIGNhY2hlIGlzIHBhdXNlZC4gUGxlYXNlIGNhbGwgcmVzdW1lKCkgdG8gJ1xuICAgICAgICAgICAgICAgICAgICArICdyZXN0YXJ0IHBvcHVsYXRpbmcgdGhlIGNhY2hlLicsIHRydWUpOyAgICAgICAgICAgIFxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmFuZG9tT3JnQ2FjaGVFbXB0eUVycm9yKCdUaGUgUmFuZG9tT3JnQ2FjaGUgc3RhY2sgJ1xuICAgICAgICAgICAgICAgICAgICArICdpcyBlbXB0eSwgcGxlYXNlIHdhaXQgZm9yIGl0IHRvIHJlcG9wdWxhdGUgaXRzZWxmLicpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGV0IGRhdGEgPSB0aGlzLiNzdGFjay5wb3AoKTtcblxuICAgICAgICAgICAgLy8gY2hlY2sgaWYgaXQgbmVlZHMgdG8gYmUgcmVwb3B1bGF0ZWRcbiAgICAgICAgICAgIHRoaXMuI3JlZnJlc2goKTtcblxuICAgICAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgbmV4dCByZXNwb25zZSBvciB3YWl0IHVudGlsIHRoZSBuZXh0IHZhbHVlIGlzIGF2YWlsYWJsZS4gVGhpcyBtZXRob2RcbiAgICAgKiB3aWxsIGJsb2NrIHVudGlsIGEgdmFsdWUgaXMgYXZhaWxhYmxlLiBOb3RlOiB0aGlzIG1ldGhvZCB3aWxsIHRocm93IGFuIGVycm9yXG4gICAgICogaWYgdGhlIGNhY2hlIGlzIGVtcHR5IGFuZCBoYXMgYmVlbiBwYXVzZWQsIGkuZS4gaXMgbm90IGJlaW5nIHBvcHVsYXRlZC4gSWZcbiAgICAgKiB0aGUgY2FjaGUgd2FzIGNvbnN0cnVjdGVkIHdpdGggdW5zdWl0YWJsZSBwYXJhbWV0ZXIgdmFsdWVzIG9yIHRoZSBkYWlseSBhbGxvd2FuY2VcbiAgICAgKiBvZiBiaXRzL3JlcXVlc3RzIGhhcyBiZWVuIHJlYWNoZWQsIHRoZSBhcHByb3ByaWF0ZSBlcnJvciB3aWxsIGFsc28gYmUgdGhyb3duLlxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPGFueVtdPn0gVGhlIG5leHQgYXBwcm9wcmlhdGUgcmVzcG9uc2UgZm9yIHRoZSByZXF1ZXN0IHRoaXNcbiAgICAgKiBSYW5kb21PcmdDYWNoZSByZXByZXNlbnRzLlxuICAgICAqIEB0aHJvd3MgUmFuZG9tT3JnQ2FjaGVFbXB0eUVycm9yIGlmIHRoZSBjYWNoZSBpcyBlbXB0eSBhbmQgaXMgcGF1c2VkLlxuICAgICAqL1xuICAgIGFzeW5jIGdldE9yV2FpdCgpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGxldCB2YWx1ZXMgPSB0aGlzLmdldCgpO1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlcztcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBSYW5kb21PcmdDYWNoZUVtcHR5RXJyb3IpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy4jcGF1c2VkKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFRoZSBjYWNoZSBpcyBwYXVzZWQgYW5kIHdpbGwgbm90IHJldHVybiBhbnkgdmFsdWVzXG4gICAgICAgICAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxldCBjYWNoZWRWYWx1ZXMgPSBhd2FpdCB0aGlzLiNwb3B1bGF0ZSgpO1xuICAgICAgICAgICAgICAgIGlmIChjYWNoZWRWYWx1ZXMgPT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBUaGUgY2FjaGUgaGFzIG5vdCB5ZXQgcmVwb3B1bGF0ZWQuXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKHIgPT4gc2V0VGltZW91dChyLCA1MCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRPcldhaXQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIG51bWJlciBvZiByZXN1bHQgc2V0cyByZW1haW5pbmcgaW4gdGhlIGNhY2hlLlxuICAgICAqIFxuICAgICAqIFRoaXMgZXNzZW50aWFsbHkgcmV0dXJucyBob3cgb2Z0ZW4gZ2V0KCkgbWF5IGJlIGNhbGxlZCB3aXRob3V0XG4gICAgICogYSBjYWNoZSByZWZpbGwuXG4gICAgICogQHJldHVybnMge251bWJlcn0gQ3VycmVudCBudW1iZXIgb2YgY2FjaGVkIHJlc3VsdHMuXG4gICAgICovXG4gICAgZ2V0Q2FjaGVkVmFsdWVzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jc3RhY2subGVuZ3RoO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIG51bWJlciBvZiBiaXRzIHVzZWQgYnkgdGhpcyBjYWNoZS5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBOdW1iZXIgb2YgYml0cyB1c2VkLlxuICAgICAqL1xuICAgIGdldEJpdHNVc2VkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jYml0c1VzZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyBudW1iZXIgb2YgcmVxdWVzdHMgdXNlZCBieSB0aGlzIGNhY2hlLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IE51bWJlciBvZiByZXF1ZXN0cyB1c2VkLlxuICAgICAqL1xuICAgIGdldFJlcXVlc3RzVXNlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3JlcXVlc3RzVXNlZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBIZWxwZXIgZnVuY3Rpb24gdG8gY2hlY2sgaWYgdGhlIGNhY2hlIG5lZWRzIHRvIGJlIHJlcG9wdWxhdGVkLlxuICAgICAqL1xuICAgICNyZWZyZXNoID0gKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy4jYnVsa1JlcXVlc3ROdW1iZXIgPiAwICYmIHRoaXMuI3N0YWNrLmxlbmd0aCA8PSAodGhpcy4jY2FjaGVTaXplIC0gdGhpcy4jYnVsa1JlcXVlc3ROdW1iZXIpKSB7XG4gICAgICAgICAgICAvLyBidWxrIHJlcXVlc3RzXG4gICAgICAgICAgICB0aGlzLiNwb3B1bGF0ZSgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRoaXMuI2J1bGtSZXF1ZXN0TnVtYmVyIDw9IDAgJiYgdGhpcy4jc3RhY2subGVuZ3RoIDwgdGhpcy4jY2FjaGVTaXplKSB7XG4gICAgICAgICAgICAvLyBpbmRpdmlkdWFsIHJlcXVlc3RzXG4gICAgICAgICAgICB0aGlzLiNwb3B1bGF0ZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSGVscGVyIGZ1bmN0aW9uIHRvIGFkZCBhIHJlc3BvbnNlIHRvIHRoZSBzdGFjay5cbiAgICAgKiBAcGFyYW0ge2FueVtdfSByZXNwb25zZSBUaGUgcmVzcG9uc2UgcmVjZWl2ZWQgZnJvbSB0aGUgc2VydmVyLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gYnVsayBUcnVlIGlmIHRoZSBjYWNoZSBpc3N1ZXMgYnVsayByZXF1ZXN0cywgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgICAqL1xuICAgICNhZGRSZXNwb25zZSA9IChyZXNwb25zZSwgYnVsaykgPT4ge1xuICAgICAgICB0aGlzLiNyZXF1ZXN0c1VzZWQrKztcbiAgICAgICAgdGhpcy4jYml0c1VzZWQgKz0gcmVzcG9uc2UucmVzdWx0LmJpdHNVc2VkO1xuXG4gICAgICAgIGlmIChidWxrKSB7XG4gICAgICAgICAgICBsZXQgZGF0YSA9IHJlc3BvbnNlLnJlc3VsdC5yYW5kb20uZGF0YTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkgKz0gdGhpcy4jcmVxdWVzdE51bWJlcikge1xuICAgICAgICAgICAgICAgIHRoaXMuI3N0YWNrLnB1c2goZGF0YS5zbGljZShpLCBpICsgdGhpcy4jcmVxdWVzdE51bWJlcikpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy4jc3RhY2sucHVzaChyZXNwb25zZS5yZXN1bHQucmFuZG9tLmRhdGEpO1xuICAgICAgICB9XG4gICAgfVxufSIsIid1c2Ugc3RyaWN0JztcblxuY29uc3Qge1xuICAgIFJhbmRvbU9yZ0JhZEhUVFBSZXNwb25zZUVycm9yLFxuICAgIFJhbmRvbU9yZ0luc3VmZmljaWVudEJpdHNFcnJvcixcbiAgICBSYW5kb21PcmdJbnN1ZmZpY2llbnRSZXF1ZXN0c0Vycm9yLFxuICAgIFJhbmRvbU9yZ0pTT05SUENFcnJvcixcbiAgICBSYW5kb21PcmdLZXlOb3RSdW5uaW5nRXJyb3IsXG4gICAgUmFuZG9tT3JnUkFORE9NT1JHRXJyb3IsXG4gICAgUmFuZG9tT3JnU2VuZFRpbWVvdXRFcnJvclxufSA9IHJlcXVpcmUoJy4vUmFuZG9tT3JnRXJyb3JzLmpzJyk7XG5jb25zdCBSYW5kb21PcmdDYWNoZSA9IHJlcXVpcmUoJy4vUmFuZG9tT3JnQ2FjaGUuanMnKTtcbi8qIG5vZGUtaW1wb3J0ICovXG5jb25zdCBYTUxIdHRwUmVxdWVzdCA9IHJlcXVpcmUoJ3htbGh0dHByZXF1ZXN0JykuWE1MSHR0cFJlcXVlc3Q7XG4vKiBlbmQtbm9kZS1pbXBvcnQgKi9cblxuLyoqXG4gKiBSYW5kb21PcmdDbGllbnQgbWFpbiBjbGFzcyB0aHJvdWdoIHdoaWNoIEFQSSBmdW5jdGlvbnMgYXJlIGFjY2Vzc2VkLlxuICogXG4gKiBUaGlzIGNsYXNzIHByb3ZpZGVzIGFjY2VzcyB0byBib3RoIHRoZSBzaWduZWQgYW5kIHVuc2lnbmVkIG1ldGhvZHMgb2YgdGhlXG4gKiBSQU5ET00uT1JHIEFQSS5cbiAqIFxuICogVGhlIGNsYXNzIGFsc28gcHJvdmlkZXMgYWNjZXNzIHRvIHRoZSBjcmVhdGlvbiBvZiBhIGNvbnZlbmllbmNlIGNsYXNzLCBSYW5kb21PcmdDYWNoZSxcbiAqIGZvciBwcmVjYWNoaW5nIEFQSSByZXNwb25zZXMgd2hlbiB0aGUgcmVxdWVzdCBpcyBrbm93biBpbiBhZHZhbmNlLlxuICogXG4gKiBUaGlzIGNsYXNzIHdpbGwgb25seSBhbGxvdyB0aGUgY3JlYXRpb24gb2Ygb25lIGluc3RhbmNlIHBlciBBUEkga2V5LiBJZiBhblxuICogaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBhbHJlYWR5IGV4aXN0cyBmb3IgYSBnaXZlbiBrZXksIHRoYXQgaW5zdGFuY2Ugd2lsbCBiZVxuICogcmV0dXJuZWQgaW5zdGVhZCBvZiBhIG5ldyBpbnN0YW5jZS5cbiAqIFxuICogVGhpcyBjbGFzcyBvYmV5cyBtb3N0IG9mIHRoZSBndWlkZWxpbmVzIHNldCBmb3J0aCBpbiBodHRwczovL2FwaS5yYW5kb20ub3JnL2pzb24tcnBjLzRcbiAqIEFsbCByZXF1ZXN0cyByZXNwZWN0IHRoZSBzZXJ2ZXIncyBhZHZpc29yeURlbGF5IHJldHVybmVkIGluIGFueSByZXNwb25zZXMsIG9yIHVzZVxuICogREVGQVVMVF9ERUxBWSBpZiBubyBhZHZpc29yeURlbGF5IGlzIHJldHVybmVkLiBJZiB0aGUgc3VwcGxpZWQgQVBJIGtleSBpcyBwYXVzZWQsIGkuZS4sXG4gKiBoYXMgZXhjZWVkZWQgaXRzIGRhaWx5IGJpdC9yZXF1ZXN0IGFsbG93YW5jZSwgdGhpcyBpbXBsZW1lbnRhdGlvbiB3aWxsIGJhY2sgb2ZmIHVudGlsXG4gKiBtaWRuaWdodCBVVEMuXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gY2xhc3MgUmFuZG9tT3JnQ2xpZW50IHtcbiAgICAvLyBCYXNpYyBBUElcbiAgICBzdGF0aWMgI0lOVEVHRVJfTUVUSE9EID0gJ2dlbmVyYXRlSW50ZWdlcnMnO1xuICAgIHN0YXRpYyAjSU5URUdFUl9TRVFVRU5DRV9NRVRIT0QgPSAnZ2VuZXJhdGVJbnRlZ2VyU2VxdWVuY2VzJztcbiAgICBzdGF0aWMgI0RFQ0lNQUxfRlJBQ1RJT05fTUVUSE9EID0gJ2dlbmVyYXRlRGVjaW1hbEZyYWN0aW9ucyc7XG4gICAgc3RhdGljICNHQVVTU0lBTl9NRVRIT0QgPSAnZ2VuZXJhdGVHYXVzc2lhbnMnO1xuICAgIHN0YXRpYyAjU1RSSU5HX01FVEhPRCA9ICdnZW5lcmF0ZVN0cmluZ3MnO1xuICAgIHN0YXRpYyAjVVVJRF9NRVRIT0QgPSAnZ2VuZXJhdGVVVUlEcyc7XG4gICAgc3RhdGljICNCTE9CX01FVEhPRCA9ICdnZW5lcmF0ZUJsb2JzJztcbiAgICBzdGF0aWMgI0dFVF9VU0FHRV9NRVRIT0QgPSAnZ2V0VXNhZ2UnO1xuXG4gICAgLy8gU2lnbmVkIEFQSVxuICAgIHN0YXRpYyAjU0lHTkVEX0lOVEVHRVJfTUVUSE9EID0gJ2dlbmVyYXRlU2lnbmVkSW50ZWdlcnMnO1xuICAgIHN0YXRpYyAjU0lHTkVEX0lOVEVHRVJfU0VRVUVOQ0VfTUVUSE9EID0gJ2dlbmVyYXRlU2lnbmVkSW50ZWdlclNlcXVlbmNlcyc7XG4gICAgc3RhdGljICNTSUdORURfREVDSU1BTF9GUkFDVElPTl9NRVRIT0QgPSAnZ2VuZXJhdGVTaWduZWREZWNpbWFsRnJhY3Rpb25zJztcbiAgICBzdGF0aWMgI1NJR05FRF9HQVVTU0lBTl9NRVRIT0QgPSAnZ2VuZXJhdGVTaWduZWRHYXVzc2lhbnMnO1xuICAgIHN0YXRpYyAjU0lHTkVEX1NUUklOR19NRVRIT0QgPSAnZ2VuZXJhdGVTaWduZWRTdHJpbmdzJztcbiAgICBzdGF0aWMgI1NJR05FRF9VVUlEX01FVEhPRCA9ICdnZW5lcmF0ZVNpZ25lZFVVSURzJztcbiAgICBzdGF0aWMgI1NJR05FRF9CTE9CX01FVEhPRCA9ICdnZW5lcmF0ZVNpZ25lZEJsb2JzJztcbiAgICBzdGF0aWMgI0dFVF9SRVNVTFRfTUVUSE9EID0gJ2dldFJlc3VsdCc7XG4gICAgc3RhdGljICNDUkVBVEVfVElDS0VUX01FVEhPRCA9ICdjcmVhdGVUaWNrZXRzJztcbiAgICBzdGF0aWMgI0xJU1RfVElDS0VUX01FVEhPRCA9ICdsaXN0VGlja2V0cyc7XG4gICAgc3RhdGljICNSRVZFQUxfVElDS0VUX01FVEhPRCA9ICdyZXZlYWxUaWNrZXRzJztcbiAgICBzdGF0aWMgI0dFVF9USUNLRVRfTUVUSE9EID0gJ2dldFRpY2tldCc7XG4gICAgc3RhdGljICNWRVJJRllfU0lHTkFUVVJFX01FVEhPRCA9ICd2ZXJpZnlTaWduYXR1cmUnO1xuXG4gICAgLy8gQmxvYiBmb3JtYXQgbGl0ZXJhbHNcbiAgICAvKiogQmxvYiBmb3JtYXQgbGl0ZXJhbCwgYmFzZTY0IGVuY29kaW5nIChkZWZhdWx0KS4gKi9cbiAgICBzdGF0aWMgQkxPQl9GT1JNQVRfQkFTRTY0ID0gJ2Jhc2U2NCc7XG4gICAgLyoqIEJsb2IgZm9ybWF0IGxpdGVyYWwsIGhleCBlbmNvZGluZy4gKi9cbiAgICBzdGF0aWMgQkxPQl9GT1JNQVRfSEVYID0gJ2hleCc7XG5cbiAgICAvLyBEZWZhdWx0IHZhbHVlc1xuICAgIC8qKiBEZWZhdWx0IHZhbHVlIGZvciB0aGUgcmVwbGFjZW1lbnQgcGFyYW1ldGVyICh0cnVlKS4gKi9cbiAgICBzdGF0aWMgREVGQVVMVF9SRVBMQUNFTUVOVCA9IHRydWU7XG4gICAgLyoqIERlZmF1bHQgdmFsdWUgZm9yIHRoZSBiYXNlIHBhcmFtZXRlciAoMTApLiAqL1xuICAgIHN0YXRpYyBERUZBVUxUX0JBU0UgPSAxMDtcbiAgICAvKiogRGVmYXVsdCB2YWx1ZSBmb3IgdGhlIHVzZXJEYXRhIHBhcmFtZXRlciAobnVsbCkuICovXG4gICAgc3RhdGljIERFRkFVTFRfVVNFUl9EQVRBID0gbnVsbDtcbiAgICAvKiogRGVmYXVsdCB2YWx1ZSBmb3IgdGhlIHRpY2tldElkIHBhcmFtZXRlciAobnVsbCkuICovXG4gICAgc3RhdGljIERFRkFVTFRfVElDS0VUX0lEID0gbnVsbDtcbiAgICAvKiogRGVmYXVsdCB2YWx1ZSBmb3IgdGhlIHByZWdlbmVyYXRlZFJhbmRvbWl6YXRpb24gcGFyYW1ldGVyIChudWxsKS4gKi9cbiAgICBzdGF0aWMgREVGQVVMVF9QUkVHRU5FUkFURURfUkFORE9NSVpBVElPTiA9IG51bGw7XG4gICAgLyoqIERlZmF1bHQgdmFsdWUgZm9yIHRoZSBsaWNlbnNlRGF0YSBwYXJhbWV0ZXIgKG51bGwpLiAqL1xuICAgIHN0YXRpYyBERUZBVUxUX0xJQ0VOU0VfREFUQSA9IG51bGw7XG5cbiAgICAvKiogU2l6ZSBvZiBhIHNpbmdsZSBVVUlEIGluIGJpdHMuICovXG4gICAgc3RhdGljIFVVSURfU0laRSA9IDEyMjtcbiAgICAvKiogRGVmYXVsdCB2YWx1ZSBmb3IgdGhlIGJsb2NraW5nVGltZW91dCBwYXJhbWV0ZXIgKDEgZGF5KS4gKi9cbiAgICBzdGF0aWMgREVGQVVMVF9CTE9DS0lOR19USU1FT1VUID0gMjQgKiA2MCAqIDYwICogMTAwMDtcbiAgICAvKiogRGVmYXVsdCB2YWx1ZSBmb3IgdGhlIGh0dHBUaW1lb3V0IHBhcmFtZXRlciAoMiBtaW51dGVzKS4gKi9cbiAgICBzdGF0aWMgREVGQVVMVF9IVFRQX1RJTUVPVVQgPSAxMjAgKiAxMDAwO1xuICAgIC8qKiBNYXhpbXVtIG51bWJlciBvZiBjaGFyYWN0ZXJzIGFsbG93ZWQgaW4gYSBzaWduYXR1cmUgdmVyZmljaWF0aW9uIFVSTC4gKi9cbiAgICBzdGF0aWMgTUFYX1VSTF9MRU5HVEggPSAyMDQ2O1xuXG4gICAgLy8gRGVmYXVsdCBiYWNrLW9mZiB0byB1c2UgaWYgbm8gYWR2aXNvcnlEZWxheSBiYWNrLW9mZiBzdXBwbGllZCBieSBzZXJ2ZXIgKDEgc2Vjb25kKVxuICAgIHN0YXRpYyAjREVGQVVMVF9ERUxBWSA9IDEqMTAwMDtcblxuICAgIC8vIE9uIHJlcXVlc3QgZmV0Y2ggZnJlc2ggYWxsb3dhbmNlIHN0YXRlIGlmIGN1cnJlbnQgc3RhdGUgZGF0YSBpcyBvbGRlciB0aGFuXG4gICAgLy8gdGhpcyB2YWx1ZSAoMSBob3VyKS5cbiAgICBzdGF0aWMgI0FMTE9XQU5DRV9TVEFURV9SRUZSRVNIX1NFQ09ORFMgPSAzNjAwICogMTAwMDtcblxuICAgIC8vIE1haW50YWlucyB1c2FnZSBzdGF0aXN0aWNzIGZyb20gc2VydmVyLlxuICAgICNiaXRzTGVmdCA9IC0xO1xuICAgICNyZXF1ZXN0c0xlZnQgPSAtMTtcblxuICAgIC8vIEJhY2stb2ZmIGluZm8gZm9yIHdoZW4gdGhlIEFQSSBrZXkgaXMgZGV0ZWN0ZWQgYXMgbm90IHJ1bm5pbmcsIHByb2JhYmx5XG4gICAgLy8gYmVjYXVzZSB0aGUga2V5IGhhcyBleGNlZWRlZCBpdHMgZGFpbHkgdXNhZ2UgbGltaXQuIEJhY2stb2ZmIHJ1bnMgdW50aWxcbiAgICAvLyBtaWRuaWdodCBVVEMuXG4gICAgI2JhY2tvZmYgPSAtMTtcbiAgICAjYmFja29mZkVycm9yID0gJyc7XG5cbiAgICAjYXBpS2V5ID0gJyc7XG4gICAgI2Jsb2NraW5nVGltZW91dCA9IFJhbmRvbU9yZ0NsaWVudC5ERUZBVUxUX0JMT0NLSU5HX1RJTUVPVVQ7XG4gICAgI2h0dHBUaW1lb3V0ID0gUmFuZG9tT3JnQ2xpZW50LkRFRkFVTFRfSFRUUF9USU1FT1VUO1xuXG4gICAgLy8gTWFpbnRhaW4gaW5mbyB0byBvYmV5IHNlcnZlciBhZHZpc29yeSBkZWxheVxuICAgICNhZHZpc29yeURlbGF5ID0gMDtcbiAgICAjbGFzdFJlc3BvbnNlUmVjZWl2ZWRUaW1lID0gMDtcblxuICAgIC8vIE1haW50YWlucyBhIGRpY3Rpb25hcnkgb2YgQVBJIGtleXMgYW5kIHRoZWlyIGluc3RhbmNlcy5cbiAgICBzdGF0aWMgI2tleUluZGV4ZWRJbnN0YW5jZXMgPSB7fTtcblxuICAgIHN0YXRpYyAjRVJST1JfQ09ERVMgPSBbIDEwMCwgMTAxLCAyMDAsIDIwMSwgMjAyLCAyMDMsIDIwNCwgMzAwLFxuICAgICAgICAzMDEsIDMwMiwgMzAzLCAzMDQsIDMwNSwgMzA2LCAzMDcsIDQwMCwgNDAxLCA0MDIsIDQwMywgNDA0LFxuICAgICAgICA0MDUsIDQyMCwgNDIxLCA0MjIsIDQyMywgNDI0LCA0MjUsIDQyNiwgNTAwLCAzMjAwMCBdO1xuXG4gICAgLyoqXG4gICAgICogQ29uc3RydWN0b3IuIEVuc3VyZXMgb25seSBvbmUgaW5zdGFuY2Ugb2YgUmFuZG9tT3JnQ2xpZW50IGV4aXN0cyBwZXIgQVBJXG4gICAgICoga2V5LiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIGlmIHRoZSBzdXBwbGllZCBrZXkgaXNuJ3QgYWxyZWFkeSBrbm93bixcbiAgICAgKiBvdGhlcndpc2UgcmV0dXJucyB0aGUgcHJldmlvdXNseSBpbnN0YW50aWF0ZWQgb25lLlxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBhcGlLZXkgQVBJIGtleSBvZiBpbnN0YW5jZSB0byBjcmVhdGUvZmluZCwgb2J0YWluZWQgZnJvbVxuICAgICAqICAgICBSQU5ET00uT1JHLCBzZWUgaHR0cHM6Ly9hcGkucmFuZG9tLm9yZy9hcGkta2V5c1xuICAgICAqIEBwYXJhbSB7e2Jsb2NraW5nVGltZW91dD86IG51bWJlciwgaHR0cFRpbWVvdXQ/OiBudW1iZXJ9fSBvcHRpb25zIEFuIG9iamVjdFxuICAgICAqICAgICB3aGljaCBtYXkgY29udGFpbnMgYW55IG9mIHRoZSBmb2xsb3dpbmcgb3B0aW9uYWwgcGFyYW1ldGVyczpcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMuYmxvY2tpbmdUaW1lb3V0ID0gMjQgKiA2MCAqIDYwICogMTAwMF0gTWF4aW11bVxuICAgICAqICAgICB0aW1lIGluIG1pbGxpc2Vjb25kcyB0byB3YWl0IGJlZm9yZSBiZWluZyBhbGxvd2VkIHRvIHNlbmQgYSByZXF1ZXN0LlxuICAgICAqICAgICBOb3RlIHRoaXMgaXMgYSBoaW50IG5vdCBhIGd1YXJhbnRlZS4gVGhlIGFkdmlzb3J5IGRlbGF5IGZyb20gc2VydmVyXG4gICAgICogICAgIG11c3QgYWx3YXlzIGJlIG9iZXllZC4gU3VwcGx5IGEgdmFsdWUgb2YgLTEgdG8gYWxsb3cgYmxvY2tpbmcgZm9yZXZlclxuICAgICAqICAgICAoZGVmYXVsdCAyNCAqIDYwICogNjAgKiAxMDAwLCBpLmUuLCAxIGRheSkuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLmh0dHBUaW1lb3V0ID0gMTIwICogMTAwMF0gTWF4aW11bSB0aW1lIGluXG4gICAgICogICAgIG1pbGxpc2Vjb25kcyB0byB3YWl0IGZvciB0aGUgc2VydmVyIHJlc3BvbnNlIHRvIGEgcmVxdWVzdCAoZGVmYXVsdFxuICAgICAqICAgICAxMjAqMTAwMCkuXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoYXBpS2V5LCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgaWYgKFJhbmRvbU9yZ0NsaWVudC4ja2V5SW5kZXhlZEluc3RhbmNlcyAmJiBSYW5kb21PcmdDbGllbnQuI2tleUluZGV4ZWRJbnN0YW5jZXNbYXBpS2V5XSkge1xuICAgICAgICAgICAgcmV0dXJuIFJhbmRvbU9yZ0NsaWVudC4ja2V5SW5kZXhlZEluc3RhbmNlc1thcGlLZXldO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy4jYXBpS2V5ID0gYXBpS2V5O1xuICAgICAgICAgICAgdGhpcy4jYmxvY2tpbmdUaW1lb3V0ID0gb3B0aW9ucy5ibG9ja2luZ1RpbWVvdXQgfHwgMjQgKiA2MCAqIDYwICogMTAwMDtcbiAgICAgICAgICAgIHRoaXMuI2h0dHBUaW1lb3V0ID0gb3B0aW9ucy5odHRwVGltZW91dCB8fCAxMjAgKiAxMDAwO1xuXG4gICAgICAgICAgICBSYW5kb21PcmdDbGllbnQuI2tleUluZGV4ZWRJbnN0YW5jZXNbYXBpS2V5XSA9IHRoaXM7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBCYXNpYyBBUElcblxuICAgIC8qKlxuICAgICAqIFJlcXVlc3RzIGFuZCByZXR1cm5zIGFuIGFycmF5IG9mIHRydWUgcmFuZG9tIGludGVnZXJzIHdpdGhpbiBhIHVzZXItZGVmaW5lZFxuICAgICAqIHJhbmdlIGZyb20gdGhlIHNlcnZlci5cbiAgICAgKiBcbiAgICAgKiBTZWU6IGh0dHBzOi8vYXBpLnJhbmRvbS5vcmcvanNvbi1ycGMvNC9iYXNpYyNnZW5lcmF0ZUludGVnZXJzXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG4gVGhlIG51bWJlciBvZiByYW5kb20gaW50ZWdlcnMgeW91IG5lZWQuIE11c3QgYmUgd2l0aGluXG4gICAgICogICAgIHRoZSBbMSwxZTRdIHJhbmdlLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBtaW4gVGhlIGxvd2VyIGJvdW5kYXJ5IGZvciB0aGUgcmFuZ2UgZnJvbSB3aGljaCB0aGUgcmFuZG9tXG4gICAgICogICAgIG51bWJlcnMgd2lsbCBiZSBwaWNrZWQuIE11c3QgYmUgd2l0aGluIHRoZSBbLTFlOSwxZTldIHJhbmdlLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBtYXggVGhlIHVwcGVyIGJvdW5kYXJ5IGZvciB0aGUgcmFuZ2UgZnJvbSB3aGljaCB0aGUgcmFuZG9tXG4gICAgICogICAgIG51bWJlcnMgd2lsbCBiZSBwaWNrZWQuIE11c3QgYmUgd2l0aGluIHRoZSBbLTFlOSwxZTldIHJhbmdlLlxuICAgICAqIEBwYXJhbSB7e3JlcGxhY2VtZW50PzogYm9vbGVhbiwgYmFzZT86IG51bWJlciwgcHJlZ2VuZXJhdGVkUmFuZG9taXphdGlvbj86XG4gICAgICogICAgIE9iamVjdH19IG9wdGlvbnMgQW4gb2JqZWN0IHdoaWNoIG1heSBjb250YWlucyBhbnkgb2YgdGhlIGZvbGxvd2luZ1xuICAgICAqICAgICBvcHRpb25hbCBwYXJhbWV0ZXJzOlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMucmVwbGFjZW1lbnQ9dHJ1ZV0gU3BlY2lmaWVzIHdoZXRoZXIgdGhlIHJhbmRvbVxuICAgICAqICAgICBudW1iZXJzIHNob3VsZCBiZSBwaWNrZWQgd2l0aCByZXBsYWNlbWVudC4gSWYgdHJ1ZSwgdGhlIHJlc3VsdGluZyBudW1iZXJzXG4gICAgICogICAgIG1heSBjb250YWluIGR1cGxpY2F0ZSB2YWx1ZXMsIG90aGVyd2lzZSB0aGUgbnVtYmVycyB3aWxsIGFsbCBiZSB1bmlxdWVcbiAgICAgKiAgICAgKGRlZmF1bHQgdHJ1ZSkuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLmJhc2U9MTBdIFRoZSBiYXNlIHRoYXQgd2lsbCBiZSB1c2VkIHRvIGRpc3BsYXlcbiAgICAgKiAgICAgdGhlIG51bWJlcnMuIFZhbHVlcyBhbGxvd2VkIGFyZSAyLCA4LCAxMCBhbmQgMTYgKGRlZmF1bHQgMTApLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucy5wcmVnZW5lcmF0ZWRSYW5kb21pemF0aW9uPW51bGxdIEEgZGljdGlvbmFyeSBvYmplY3RcbiAgICAgKiAgICAgd2hpY2ggYWxsb3dzIHRoZSBjbGllbnQgdG8gc3BlY2lmeSB0aGF0IHRoZSByYW5kb20gdmFsdWVzIHNob3VsZCBiZVxuICAgICAqICAgICBnZW5lcmF0ZWQgZnJvbSBhIHByZWdlbmVyYXRlZCwgaGlzdG9yaWNhbCByYW5kb21pemF0aW9uIGluc3RlYWQgb2YgYVxuICAgICAqICAgICBvbmUtdGltZSBvbi10aGUtZmx5IHJhbmRvbWl6YXRpb24uIFRoZXJlIGFyZSB0aHJlZSBwb3NzaWJsZSBjYXNlczpcbiAgICAgKiAqICoqbnVsbCoqOiBUaGUgc3RhbmRhcmQgd2F5IG9mIGNhbGxpbmcgZm9yIHJhbmRvbSB2YWx1ZXMsIGkuZS50cnVlXG4gICAgICogICAgICAgcmFuZG9tbmVzcyBpcyBnZW5lcmF0ZWQgYW5kIGRpc2NhcmRlZCBhZnRlcndhcmRzLlxuICAgICAqICogKipkYXRlKio6IFJBTkRPTS5PUkcgdXNlcyBoaXN0b3JpY2FsIHRydWUgcmFuZG9tbmVzcyBnZW5lcmF0ZWQgb24gdGhlXG4gICAgICogICAgICAgY29ycmVzcG9uZGluZyBkYXRlIChwYXN0IG9yIHByZXNlbnQsIGZvcm1hdDogeyAnZGF0ZScsICdZWVlZLU1NLUREJyB9KS5cbiAgICAgKiAqICoqaWQqKjogUkFORE9NLk9SRyB1c2VzIGhpc3RvcmljYWwgdHJ1ZSByYW5kb21uZXNzIGRlcml2ZWQgZnJvbSB0aGVcbiAgICAgKiAgICAgICBjb3JyZXNwb25kaW5nIGlkZW50aWZpZXIgaW4gYSBkZXRlcm1pbmlzdGljIG1hbm5lci4gRm9ybWF0OiB7ICdpZCcsXG4gICAgICogICAgICAgJ1BFUlNJU1RFTlQtSURFTlRJRklFUicgfSB3aGVyZSAnUEVSU0lTVEVOVC1JREVOVElGSUVSJyBpcyBhIHN0cmluZ1xuICAgICAqICAgICAgIHdpdGggbGVuZ3RoIGluIHRoZSBbMSwgNjRdIHJhbmdlLlxuICAgICAqIEByZXR1cm5zIHsoUHJvbWlzZTxudW1iZXJbXT58UHJvbWlzZTxzdHJpbmdbXT4pfSBBIFByb21pc2Ugd2hpY2gsIGlmXG4gICAgICogICAgIHJlc29sdmVkIHN1Y2Nlc3NmdWxseSwgcmVwcmVzZW50cyBhbiBhcnJheSBvZiB0cnVlIHJhbmRvbSBpbnRlZ2Vycy5cbiAgICAgKiBAdGhyb3dzIHtSYW5kb21PcmdTZW5kVGltZW91dEVycm9yfSBUaHJvd24gd2hlbiBibG9ja2luZyB0aW1lb3V0IGlzIGV4Y2VlZGVkXG4gICAgICogICAgIGJlZm9yZSB0aGUgcmVxdWVzdCBjYW4gYmUgc2VudC5cbiAgICAgKiBAdGhyb3dzIHtSYW5kb21PcmdLZXlOb3RSdW5uaW5nRXJyb3J9IFRocm93biB3aGVuIHRoZSBBUEkga2V5IGhhcyBiZWVuXG4gICAgICogICAgIHN0b3BwZWQuXG4gICAgICogQHRocm93cyB7UmFuZG9tT3JnSW5zdWZmaWNpZW50UmVxdWVzdHNFcnJvcn0gVGhyb3duIHdoZW4gdGhlIEFQSSBrZXkncyBzZXJ2ZXJcbiAgICAgKiAgICAgcmVxdWVzdHMgYWxsb3dhbmNlIGhhcyBiZWVuIGV4Y2VlZGVkLlxuICAgICAqIEB0aHJvd3Mge1JhbmRvbU9yZ0luc3VmZmljaWVudEJpdHNFcnJvcn0gVGhyb3duIHdoZW4gdGhlIEFQSSBrZXkncyBzZXJ2ZXJcbiAgICAgKiAgICAgYml0cyBhbGxvd2FuY2UgaGFzIGJlZW4gZXhjZWVkZWQuXG4gICAgICogQHRocm93cyB7UmFuZG9tT3JnQmFkSFRUUFJlc3BvbnNlRXJyb3J9IFRocm93biB3aGVuIGEgSFRUUCAyMDAgT0sgcmVzcG9uc2VcbiAgICAgKiAgICAgaXMgbm90IHJlY2VpdmVkLlxuICAgICAqIEB0aHJvd3Mge1JhbmRvbU9yZ1JBTkRPTU9SR0Vycm9yfSBUaHJvd24gd2hlbiB0aGUgc2VydmVyIHJldHVybnMgYSBSQU5ET00uT1JHXG4gICAgICogICAgIEVycm9yLlxuICAgICAqIEB0aHJvd3Mge1JhbmRvbU9yZ0pTT05SUENFcnJvcn0gVGhyb3duIHdoZW4gdGhlIHNlcnZlciByZXR1cm5zIGEgSlNPTi1SUEMgRXJyb3IuXG4gICAgICogKi9cbiAgICBhc3luYyBnZW5lcmF0ZUludGVnZXJzKG4sIG1pbiwgbWF4LCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgbGV0IHJlcXVlc3QgPSB0aGlzLiNpbnRlZ2VyUmVxdWVzdChuLCBtaW4sIG1heCwgb3B0aW9ucyk7XG4gICAgICAgIHJldHVybiB0aGlzLiNleHRyYWN0QmFzaWModGhpcy4jc2VuZFJlcXVlc3QocmVxdWVzdCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlcXVlc3RzIGFuZCByZXR1cm5zIGFuIGFycmF5IG9mIHRydWUgcmFuZG9tIGludGVnZXIgc2VxdWVuY2VzIHdpdGhpbiBhXG4gICAgICogdXNlci1kZWZpbmVkIHJhbmdlIGZyb20gdGhlIHNlcnZlci5cbiAgICAgKiBcbiAgICAgKiBTZWU6IGh0dHBzOi8vYXBpLnJhbmRvbS5vcmcvanNvbi1ycGMvNC9iYXNpYyNnZW5lcmF0ZUludGVnZXJTZXF1ZW5jZXNcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbiBIb3cgbWFueSBhcnJheXMgb2YgcmFuZG9tIGludGVnZXJzIHlvdSBuZWVkLiBNdXN0IGJlXG4gICAgICogICAgIHdpdGhpbiB0aGUgWzEsMWUzXSByYW5nZS5cbiAgICAgKiBAcGFyYW0geyhudW1iZXJ