forked from silverbulletmd/silverbullet-plug-template
-
Notifications
You must be signed in to change notification settings - Fork 8
/
Copy pathgraphview.plug.js
66 lines (59 loc) · 428 KB
/
graphview.plug.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
var mod=(()=>{var Zd=Object.defineProperty;var Yb=Object.getOwnPropertyDescriptor;var tb=Object.getOwnPropertyNames;var Vb=Object.prototype.hasOwnProperty;var P=(d,b)=>{for(var l in b)Zd(d,l,{get:b[l],enumerable:!0})},ab=(d,b,l,Z)=>{if(b&&typeof b=="object"||typeof b=="function")for(let m of tb(b))!Vb.call(d,m)&&m!==l&&Zd(d,m,{get:()=>b[m],enumerable:!(Z=Yb(b,m))||Z.enumerable});return d};var xb=d=>ab(Zd({},"__esModule",{value:!0}),d);var Hm={};P(Hm,{functionMapping:()=>Lb});function jd(d){let b=atob(d),l=b.length,Z=new Uint8Array(l);for(let m=0;m<l;m++)Z[m]=b.charCodeAt(m);return Z}function eb(d,b){return syscall("sandboxFetch.fetch",d,b)}function zd(){globalThis.fetch=async function(d,b){let l=await eb(d,b&&{method:b.method,headers:b.headers,body:b.body});return new Response(l.base64Body?jd(l.base64Body):null,{status:l.status,headers:l.headers})}}typeof Deno>"u"&&(self.Deno={args:[],build:{arch:"x86_64"},env:{get(){}}});var id=new Map,Gd=0;function B(d){self.postMessage(d)}self.syscall=async(d,...b)=>await new Promise((l,Z)=>{Gd++,id.set(Gd,{resolve:l,reject:Z}),B({type:"sys",id:Gd,name:d,args:b})});function Jd(d,b){self.addEventListener("message",l=>{(async()=>{let Z=l.data;switch(Z.type){case"inv":{let m=d[Z.name];if(!m)throw new Error(`Function not loaded: ${Z.name}`);try{let G=await Promise.resolve(m(...Z.args||[]));B({type:"invr",id:Z.id,result:G})}catch(G){console.error(G),B({type:"invr",id:Z.id,error:G.message})}}break;case"sysr":{let m=Z.id,G=id.get(m);if(!G)throw Error("Invalid request id");id.delete(m),Z.error?G.reject(new Error(Z.error)):G.resolve(Z.result)}break}})().catch(console.error)}),B({type:"manifest",manifest:b})}zd();var r={};P(r,{del:()=>Cb,get:()=>Ib,set:()=>Sb});typeof self>"u"&&(self={syscall:()=>{throw new Error("Not implemented here")}});var c=self.syscall;function Sb(d,b){return c("clientStore.set",d,b)}function Ib(d){return c("clientStore.get",d)}function Cb(d){return c("clientStore.delete",d)}var S={};P(S,{confirm:()=>Eb,dispatch:()=>Db,downloadFile:()=>zb,filterBox:()=>Qb,flashNotification:()=>Jb,getCurrentPage:()=>Mb,getCursor:()=>Hb,getSelection:()=>gb,getText:()=>Tb,getUiOption:()=>Ab,hidePanel:()=>Ub,insertAtCursor:()=>Bb,insertAtPos:()=>wb,moveCursor:()=>fb,navigate:()=>Pb,openUrl:()=>jb,prompt:()=>Ob,reloadPage:()=>rb,replaceRange:()=>vb,save:()=>Nb,setPage:()=>Rb,setSelection:()=>kb,setUiOption:()=>qb,showPanel:()=>Fb,vimEx:()=>_b});function Mb(){return c("editor.getCurrentPage")}function Rb(d){return c("editor.setPage",d)}function Tb(){return c("editor.getText")}function Hb(){return c("editor.getCursor")}function gb(){return c("editor.getSelection")}function kb(d,b){return c("editor.setSelection",d,b)}function Nb(){return c("editor.save")}function Pb(d,b,l=!1,Z=!1){return c("editor.navigate",d,b,l,Z)}function rb(){return c("editor.reloadPage")}function jb(d){return c("editor.openUrl",d)}function zb(d,b){return c("editor.downloadFile",d,b)}function Jb(d,b="info"){return c("editor.flashNotification",d,b)}function Qb(d,b,l="",Z=""){return c("editor.filterBox",d,b,l,Z)}function Fb(d,b,l,Z=""){return c("editor.showPanel",d,b,l,Z)}function Ub(d){return c("editor.hidePanel",d)}function wb(d,b){return c("editor.insertAtPos",d,b)}function vb(d,b,l){return c("editor.replaceRange",d,b,l)}function fb(d,b=!1){return c("editor.moveCursor",d,b)}function Bb(d){return c("editor.insertAtCursor",d)}function Db(d){return c("editor.dispatch",d)}function Ob(d,b=""){return c("editor.prompt",d,b)}function Eb(d){return c("editor.confirm",d)}function Ab(d){return c("editor.getUiOption",d)}function qb(d,b){return c("editor.setUiOption",d,b)}function _b(d){return c("editor.vimEx",d)}var C={};P(C,{batchSet:()=>dl,clearPageIndex:()=>ul,clearPageIndexForPage:()=>Gl,del:()=>ll,deletePrefixForPage:()=>il,get:()=>bl,query:()=>Zl,queryPrefix:()=>ml,set:()=>$b});function $b(d,b,l){return c("index.set",d,b,l)}function dl(d,b){return c("index.batchSet",d,b)}function bl(d,b){return c("index.get",d,b)}function ll(d,b){return c("index.delete",d,b)}function ml(d){return c("index.queryPrefix",d)}function Zl(d){return c("index.query",d)}function Gl(d){return c("index.clearPageIndexForPage",d)}function il(d,b){return c("index.deletePrefixForPage",d,b)}function ul(){return c("index.clearPageIndex")}var D={};P(D,{parseMarkdown:()=>pl});function pl(d){return c("markdown.parseMarkdown",d)}var ud=class{listPages(b=!1){return c("space.listPages",b)}getPageMeta(b){return c("space.getPageMeta",b)}readPage(b){return c("space.readPage",b)}writePage(b,l){return c("space.writePage",b,l)}deletePage(b){return c("space.deletePage",b)}listPlugs(){return c("space.listPlugs")}listAttachments(){return c("space.listAttachments")}getAttachmentMeta(b){return c("space.getAttachmentMeta",b)}readAttachment(b){return c("space.readAttachment",b)}writeAttachment(b,l,Z){return c("space.writeAttachment",b,l,Z)}deleteAttachment(b){return c("space.deleteAttachment",b)}readFile(b,l){return c("space.readFile",b,l)}getFileMeta(b){return c("space.getFileMeta",b)}writeFile(b,l,Z){return c("space.writeFile",b,l,Z)}deleteFile(b){return c("space.deleteFile",b)}listFiles(b){return c("space.listFiles",b)}},M=new ud;var k={};P(k,{readAsset:()=>ol});function Kl(d){let b=atob(d),l=b.length,Z=new Uint8Array(l);for(let m=0;m<l;m++)Z[m]=b.charCodeAt(m);return Z}function Qd(d){let b=d.split(",",2)[1];return Kl(b)}var g=self.syscall;async function ol(d,b="utf8"){let l=await g("asset.readAsset",d);switch(b){case"utf8":return new TextDecoder().decode(Qd(l));case"dataurl":return l}}var O=class{constructor(b){this.graphViewKey=b}async getGraphViewStatus(){return!!await r.get(this.graphViewKey)}async setGraphViewStatus(b){await r.set(this.graphViewKey,b)}async toggleGraphViewStatus(){await r.set(this.graphViewKey,!await this.getGraphViewStatus())}};function pd(d,b){if(b(d))return[d];let l=[];if(d.children)for(let Z of d.children)l=[...l,...pd(Z,b)];return l}function cd(d,b){return pd(d,l=>l.type===b)[0]}function Fd(d,b){pd(d,b)}var R=class extends Error{constructor(l="(unknown reason)",Z=""){super(`${l} ${Z}`);this.mark=Z;this.name=this.constructor.name}toString(l){return`${this.name}: ${this.message} ${this.mark}`}};function Ud(d){return typeof d=="boolean"||d instanceof Boolean}function wd(d){return d!==null&&typeof d=="object"}function e(d,b){let l="";for(let Z=0;Z<b;Z++)l+=d;return l}function Q(d){return d===0&&Number.NEGATIVE_INFINITY===1/d}var E=class{constructor(b,l,Z,m,G){this.name=b;this.buffer=l;this.position=Z;this.line=m;this.column=G}getSnippet(b=4,l=75){if(!this.buffer)return null;let Z="",m=this.position;for(;m>0&&`\0\r
\x85\u2028\u2029`.indexOf(this.buffer.charAt(m-1))===-1;)if(m-=1,this.position-m>l/2-1){Z=" ... ",m+=5;break}let G="",i=this.position;for(;i<this.buffer.length&&`\0\r
\x85\u2028\u2029`.indexOf(this.buffer.charAt(i))===-1;)if(i+=1,i-this.position>l/2-1){G=" ... ",i-=5;break}let u=this.buffer.slice(m,i);return`${e(" ",b)}${Z}${u}${G}
${e(" ",b+this.position-m+Z.length)}^`}toString(b){let l,Z="";return this.name&&(Z+=`in "${this.name}" `),Z+=`at line ${this.line+1}, column ${this.column+1}`,b||(l=this.getSnippet(),l&&(Z+=`:
${l}`)),Z}};function Wd(d,b,l){let Z=[];for(let m of d.include)l=Wd(m,b,l);for(let m of d[b]){for(let G=0;G<l.length;G++){let i=l[G];i.tag===m.tag&&i.kind===m.kind&&Z.push(G)}l.push(m)}return l.filter((m,G)=>!Z.includes(G))}function tl(...d){let b={fallback:{},mapping:{},scalar:{},sequence:{}};for(let l of d)for(let Z of l)Z.kind!==null&&(b[Z.kind][Z.tag]=b.fallback[Z.tag]=Z);return b}var t=class{constructor(b){this.explicit=b.explicit||[],this.implicit=b.implicit||[],this.include=b.include||[];for(let l of this.implicit)if(l.loadKind&&l.loadKind!=="scalar")throw new R("There is a non-scalar type in the implicit list of a schema. Implicit resolving of such types is not supported.");this.compiledImplicit=Wd(this,"implicit",[]),this.compiledExplicit=Wd(this,"explicit",[]),this.compiledTypeMap=tl(this.compiledImplicit,this.compiledExplicit)}extend(b){return new t({implicit:[...new Set([...this.implicit,...b?.implicit??[]])],explicit:[...new Set([...this.explicit,...b?.explicit??[]])],include:[...new Set([...this.include,...b?.include??[]])]})}static create(){}};var Vl=()=>!0,al=d=>d;var o=class{constructor(b,l){this.kind=null;this.resolve=()=>!0;this.construct=b=>b;this.tag=b,l&&(this.kind=l.kind,this.resolve=l.resolve||Vl,this.construct=l.construct||al,this.instanceOf=l.instanceOf,this.predicate=l.predicate,this.represent=l.represent,this.defaultStyle=l.defaultStyle,this.styleAliases=l.styleAliases)}};var Xd=class extends Error{constructor(b){super(b),this.name="DenoStdInternalError"}};function fd(d,b=""){if(!d)throw new Xd(b)}function F(d,b,l=0){l=Math.max(0,Math.min(l,b.byteLength));let Z=b.byteLength-l;return d.byteLength>Z&&(d=d.subarray(0,Z)),b.set(d,l),d.byteLength}var A=32*1024,sd=2**32-2,U=class{#d;#b=0;constructor(b){this.#d=b===void 0?new Uint8Array(0):new Uint8Array(b)}bytes(b={copy:!0}){return b.copy===!1?this.#d.subarray(this.#b):this.#d.slice(this.#b)}empty(){return this.#d.byteLength<=this.#b}get length(){return this.#d.byteLength-this.#b}get capacity(){return this.#d.buffer.byteLength}truncate(b){if(b===0){this.reset();return}if(b<0||b>this.length)throw Error("bytes.Buffer: truncation out of range");this.#l(this.#b+b)}reset(){this.#l(0),this.#b=0}#Z(b){let l=this.#d.byteLength;return b<=this.capacity-l?(this.#l(l+b),l):-1}#l(b){fd(b<=this.#d.buffer.byteLength),this.#d=new Uint8Array(this.#d.buffer,0,b)}readSync(b){if(this.empty())return this.reset(),b.byteLength===0?0:null;let l=F(this.#d.subarray(this.#b),b);return this.#b+=l,l}read(b){let l=this.readSync(b);return Promise.resolve(l)}writeSync(b){let l=this.#m(b.byteLength);return F(b,this.#d,l)}write(b){let l=this.writeSync(b);return Promise.resolve(l)}#m(b){let l=this.length;l===0&&this.#b!==0&&this.reset();let Z=this.#Z(b);if(Z>=0)return Z;let m=this.capacity;if(b<=Math.floor(m/2)-l)F(this.#d.subarray(this.#b),this.#d);else{if(m+b>sd)throw new Error("The buffer cannot be grown beyond the maximum size.");{let G=new Uint8Array(Math.min(2*m+b,sd));F(this.#d.subarray(this.#b),G),this.#d=G}}return this.#b=0,this.#l(Math.min(l+b,sd)),l}grow(b){if(b<0)throw Error("Buffer.grow: negative count");let l=this.#m(b);this.#l(l)}async readFrom(b){let l=0,Z=new Uint8Array(A);for(;;){let m=this.capacity-this.length<A,G=m?Z:new Uint8Array(this.#d.buffer,this.length),i=await b.read(G);if(i===null)return l;m?this.writeSync(G.subarray(0,i)):this.#l(this.length+i),l+=i}}readFromSync(b){let l=0,Z=new Uint8Array(A);for(;;){let m=this.capacity-this.length<A,G=m?Z:new Uint8Array(this.#d.buffer,this.length),i=b.readSync(G);if(i===null)return l;m?this.writeSync(G.subarray(0,i)):this.#l(this.length+i),l+=i}}};var Kd=`ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=
\r`;function xl(d){if(d===null)return!1;let b,l=0,Z=d.length,m=Kd;for(let G=0;G<Z;G++)if(b=m.indexOf(d.charAt(G)),!(b>64)){if(b<0)return!1;l+=6}return l%8===0}function el(d){let b=d.replace(/[\r\n=]/g,""),l=b.length,Z=Kd,m=[],G=0;for(let u=0;u<l;u++)u%4===0&&u&&(m.push(G>>16&255),m.push(G>>8&255),m.push(G&255)),G=G<<6|Z.indexOf(b.charAt(u));let i=l%4*6;return i===0?(m.push(G>>16&255),m.push(G>>8&255),m.push(G&255)):i===18?(m.push(G>>10&255),m.push(G>>2&255)):i===12&&m.push(G>>4&255),new U(new Uint8Array(m))}function Sl(d){let b=d.length,l=Kd,Z="",m=0;for(let i=0;i<b;i++)i%3===0&&i&&(Z+=l[m>>18&63],Z+=l[m>>12&63],Z+=l[m>>6&63],Z+=l[m&63]),m=(m<<8)+d[i];let G=b%3;return G===0?(Z+=l[m>>18&63],Z+=l[m>>12&63],Z+=l[m>>6&63],Z+=l[m&63]):G===2?(Z+=l[m>>10&63],Z+=l[m>>4&63],Z+=l[m<<2&63],Z+=l[64]):G===1&&(Z+=l[m>>2&63],Z+=l[m<<4&63],Z+=l[64],Z+=l[64]),Z}function Il(d){if(typeof d?.readSync!="function")return!1;let b=new U;try{return 0>b.readFromSync(d)}catch{return!1}finally{b.reset()}}var od=new o("tag:yaml.org,2002:binary",{construct:el,kind:"scalar",predicate:Il,represent:Sl,resolve:xl});function Cl(d){let b=d.length;return b===4&&(d==="true"||d==="True"||d==="TRUE")||b===5&&(d==="false"||d==="False"||d==="FALSE")}function Ml(d){return d==="true"||d==="True"||d==="TRUE"}var nd=new o("tag:yaml.org,2002:bool",{construct:Ml,defaultStyle:"lowercase",kind:"scalar",predicate:Ud,represent:{lowercase(d){return d?"true":"false"},uppercase(d){return d?"TRUE":"FALSE"},camelcase(d){return d?"True":"False"}},resolve:Cl});var Rl=new RegExp("^(?:[-+]?(?:0|[1-9][0-9_]*)(?:\\.[0-9_]*)?(?:[eE][-+]?[0-9]+)?|\\.[0-9_]+(?:[eE][-+]?[0-9]+)?|[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+\\.[0-9_]*|[-+]?\\.(?:inf|Inf|INF)|\\.(?:nan|NaN|NAN))$");function Tl(d){return!(!Rl.test(d)||d[d.length-1]==="_")}function Hl(d){let b=d.replace(/_/g,"").toLowerCase(),l=b[0]==="-"?-1:1,Z=[];if("+-".indexOf(b[0])>=0&&(b=b.slice(1)),b===".inf")return l===1?Number.POSITIVE_INFINITY:Number.NEGATIVE_INFINITY;if(b===".nan")return NaN;if(b.indexOf(":")>=0){b.split(":").forEach(i=>{Z.unshift(parseFloat(i))});let m=0,G=1;return Z.forEach(i=>{m+=i*G,G*=60}),l*m}return l*parseFloat(b)}var gl=/^[-+]?[0-9]+e/;function kl(d,b){if(isNaN(d))switch(b){case"lowercase":return".nan";case"uppercase":return".NAN";case"camelcase":return".NaN"}else if(Number.POSITIVE_INFINITY===d)switch(b){case"lowercase":return".inf";case"uppercase":return".INF";case"camelcase":return".Inf"}else if(Number.NEGATIVE_INFINITY===d)switch(b){case"lowercase":return"-.inf";case"uppercase":return"-.INF";case"camelcase":return"-.Inf"}else if(Q(d))return"-0.0";let l=d.toString(10);return gl.test(l)?l.replace("e",".e"):l}function Nl(d){return Object.prototype.toString.call(d)==="[object Number]"&&(d%1!==0||Q(d))}var yd=new o("tag:yaml.org,2002:float",{construct:Hl,defaultStyle:"lowercase",kind:"scalar",predicate:Nl,represent:kl,resolve:Tl});function Bd(d){let b=new Function(`return ${d}`)();if(!(b instanceof Function))throw new TypeError(`Expected function but got ${typeof b}: ${d}`);return b}var Pl=new o("tag:yaml.org,2002:js/function",{kind:"scalar",resolve(d){if(d===null)return!1;try{return Bd(`${d}`),!0}catch{return!1}},construct(d){return Bd(d)},predicate(d){return d instanceof Function},represent(d){return d.toString()}});function rl(d){return 48<=d&&d<=57||65<=d&&d<=70||97<=d&&d<=102}function jl(d){return 48<=d&&d<=55}function zl(d){return 48<=d&&d<=57}function Jl(d){let b=d.length,l=0,Z=!1;if(!b)return!1;let m=d[l];if((m==="-"||m==="+")&&(m=d[++l]),m==="0"){if(l+1===b)return!0;if(m=d[++l],m==="b"){for(l++;l<b;l++)if(m=d[l],m!=="_"){if(m!=="0"&&m!=="1")return!1;Z=!0}return Z&&m!=="_"}if(m==="x"){for(l++;l<b;l++)if(m=d[l],m!=="_"){if(!rl(d.charCodeAt(l)))return!1;Z=!0}return Z&&m!=="_"}for(;l<b;l++)if(m=d[l],m!=="_"){if(!jl(d.charCodeAt(l)))return!1;Z=!0}return Z&&m!=="_"}if(m==="_")return!1;for(;l<b;l++)if(m=d[l],m!=="_"){if(m===":")break;if(!zl(d.charCodeAt(l)))return!1;Z=!0}return!Z||m==="_"?!1:m!==":"?!0:/^(:[0-5]?[0-9])+$/.test(d.slice(l))}function Ql(d){let b=d,l=[];b.indexOf("_")!==-1&&(b=b.replace(/_/g,""));let Z=1,m=b[0];if((m==="-"||m==="+")&&(m==="-"&&(Z=-1),b=b.slice(1),m=b[0]),b==="0")return 0;if(m==="0")return b[1]==="b"?Z*parseInt(b.slice(2),2):b[1]==="x"?Z*parseInt(b,16):Z*parseInt(b,8);if(b.indexOf(":")!==-1){b.split(":").forEach(u=>{l.unshift(parseInt(u,10))});let G=0,i=1;return l.forEach(u=>{G+=u*i,i*=60}),Z*G}return Z*parseInt(b,10)}function Fl(d){return Object.prototype.toString.call(d)==="[object Number]"&&d%1===0&&!Q(d)}var hd=new o("tag:yaml.org,2002:int",{construct:Ql,defaultStyle:"decimal",kind:"scalar",predicate:Fl,represent:{binary(d){return d>=0?`0b${d.toString(2)}`:`-0b${d.toString(2).slice(1)}`},octal(d){return d>=0?`0${d.toString(8)}`:`-0${d.toString(8).slice(1)}`},decimal(d){return d.toString(10)},hexadecimal(d){return d>=0?`0x${d.toString(16).toUpperCase()}`:`-0x${d.toString(16).toUpperCase().slice(1)}`}},resolve:Jl,styleAliases:{binary:[2,"bin"],decimal:[10,"dec"],hexadecimal:[16,"hex"],octal:[8,"oct"]}});var Ld=new o("tag:yaml.org,2002:map",{construct(d){return d!==null?d:{}},kind:"mapping"});function Ul(d){return d==="<<"||d===null}var Yd=new o("tag:yaml.org,2002:merge",{kind:"scalar",resolve:Ul});function wl(d){let b=d.length;return b===1&&d==="~"||b===4&&(d==="null"||d==="Null"||d==="NULL")}function vl(){return null}function fl(d){return d===null}var td=new o("tag:yaml.org,2002:null",{construct:vl,defaultStyle:"lowercase",kind:"scalar",predicate:fl,represent:{canonical(){return"~"},lowercase(){return"null"},uppercase(){return"NULL"},camelcase(){return"Null"}},resolve:wl});var{hasOwn:Bl}=Object,Dl=Object.prototype.toString;function Ol(d){let b=[],l="",Z=!1;for(let m of d){if(Z=!1,Dl.call(m)!=="[object Object]")return!1;for(l in m)if(Bl(m,l))if(!Z)Z=!0;else return!1;if(!Z)return!1;if(b.indexOf(l)===-1)b.push(l);else return!1}return!0}function El(d){return d!==null?d:[]}var Vd=new o("tag:yaml.org,2002:omap",{construct:El,kind:"sequence",resolve:Ol});var Al=Object.prototype.toString;function ql(d){let b=Array.from({length:d.length});for(let l=0;l<d.length;l++){let Z=d[l];if(Al.call(Z)!=="[object Object]")return!1;let m=Object.keys(Z);if(m.length!==1)return!1;b[l]=[m[0],Z[m[0]]]}return!0}function _l(d){if(d===null)return[];let b=Array.from({length:d.length});for(let l=0;l<d.length;l+=1){let Z=d[l],m=Object.keys(Z);b[l]=[m[0],Z[m[0]]]}return b}var ad=new o("tag:yaml.org,2002:pairs",{construct:_l,kind:"sequence",resolve:ql});var xd=/^\/(?<regexp>[\s\S]+)\/(?<modifiers>[gismuy]*)$/,ed=new o("tag:yaml.org,2002:js/regexp",{kind:"scalar",resolve(d){if(d===null||!d.length)return!1;let b=`${d}`;if(b.charAt(0)==="/"){if(!xd.test(d))return!1;let l=[...b.match(xd)?.groups?.modifiers??""];if(new Set(l).size<l.length)return!1}return!0},construct(d){let{regexp:b=`${d}`,modifiers:l=""}=`${d}`.match(xd)?.groups??{};return new RegExp(b,l)},predicate(d){return d instanceof RegExp},represent(d){return d.toString()}});var Sd=new o("tag:yaml.org,2002:seq",{construct(d){return d!==null?d:[]},kind:"sequence"});var{hasOwn:$l}=Object;function dm(d){if(d===null)return!0;for(let b in d)if($l(d,b)&&d[b]!==null)return!1;return!0}function bm(d){return d!==null?d:{}}var Id=new o("tag:yaml.org,2002:set",{construct:bm,kind:"mapping",resolve:dm});var Cd=new o("tag:yaml.org,2002:str",{construct(d){return d!==null?d:""},kind:"scalar"});var Dd=new RegExp("^([0-9][0-9][0-9][0-9])-([0-9][0-9])-([0-9][0-9])$"),Od=new RegExp("^([0-9][0-9][0-9][0-9])-([0-9][0-9]?)-([0-9][0-9]?)(?:[Tt]|[ \\t]+)([0-9][0-9]?):([0-9][0-9]):([0-9][0-9])(?:\\.([0-9]*))?(?:[ \\t]*(Z|([-+])([0-9][0-9]?)(?::([0-9][0-9]))?))?$");function lm(d){return d===null?!1:Dd.exec(d)!==null||Od.exec(d)!==null}function mm(d){let b=Dd.exec(d);if(b===null&&(b=Od.exec(d)),b===null)throw new Error("Date resolve error");let l=+b[1],Z=+b[2]-1,m=+b[3];if(!b[4])return new Date(Date.UTC(l,Z,m));let G=+b[4],i=+b[5],u=+b[6],p=0;if(b[7]){let s=b[7].slice(0,3);for(;s.length<3;)s+="0";p=+s}let X=null;if(b[9]){let s=+b[10],n=+(b[11]||0);X=(s*60+n)*6e4,b[9]==="-"&&(X=-X)}let K=new Date(Date.UTC(l,Z,m,G,i,u,p));return X&&K.setTime(K.getTime()-X),K}function Zm(d){return d.toISOString()}var Md=new o("tag:yaml.org,2002:timestamp",{construct:mm,instanceOf:Date,kind:"scalar",represent:Zm,resolve:lm});var Rd=new o("tag:yaml.org,2002:js/undefined",{kind:"scalar",resolve(){return!0},construct(){},predicate(d){return typeof d>"u"},represent(){return""}});var Td=new t({explicit:[Cd,Sd,Ld]});var Hd=new t({implicit:[td,nd,hd,yd],include:[Td]});var gd=new t({include:[Hd]});var w=new t({explicit:[od,Vd,ad,Id],implicit:[Md,Yd],include:[gd]});var Gm=new t({explicit:[ed,Rd],include:[w]});var v=class{constructor(b=w){this.schema=b}};var q=class extends v{constructor(l,{filename:Z,schema:m,onWarning:G,legacy:i=!1,json:u=!1,listener:p=null}){super(m);this.input=l;this.documents=[];this.lineIndent=0;this.lineStart=0;this.position=0;this.line=0;this.result="";this.filename=Z,this.onWarning=G,this.legacy=i,this.json=u,this.listener=p,this.implicitTypes=this.schema.compiledImplicit,this.typeMap=this.schema.compiledTypeMap,this.length=l.length}};var{hasOwn:H}=Object,_=1,bb=2,lb=3,$=4,kd=1,im=2,Ed=3,um=/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F-\x84\x86-\x9F\uFFFE\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]/,pm=/[\x85\u2028\u2029]/,cm=/[,\[\]\{\}]/,mb=/^(?:!|!!|![a-z\-]+!)$/i,Zb=/^(?:!|[^,\[\]\{\}])(?:%[0-9a-f]{2}|[0-9a-z\-#;\/\?:@&=\+\$,_\.!~\*'\(\)\[\]])*$/i;function Ad(d){return Object.prototype.toString.call(d)}function I(d){return d===10||d===13}function N(d){return d===9||d===32}function V(d){return d===9||d===32||d===10||d===13}function j(d){return d===44||d===91||d===93||d===123||d===125}function Wm(d){if(48<=d&&d<=57)return d-48;let b=d|32;return 97<=b&&b<=102?b-97+10:-1}function Xm(d){return d===120?2:d===117?4:d===85?8:0}function sm(d){return 48<=d&&d<=57?d-48:-1}function qd(d){return d===48?"\0":d===97?"\x07":d===98?"\b":d===116||d===9?" ":d===110?`
`:d===118?"\v":d===102?"\f":d===114?"\r":d===101?"\x1B":d===32?" ":d===34?'"':d===47?"/":d===92?"\\":d===78?"\x85":d===95?"\xA0":d===76?"\u2028":d===80?"\u2029":""}function Km(d){return d<=65535?String.fromCharCode(d):String.fromCharCode((d-65536>>10)+55296,(d-65536&1023)+56320)}var Gb=Array.from({length:256}),ib=Array.from({length:256});for(let d=0;d<256;d++)Gb[d]=qd(d)?1:0,ib[d]=qd(d);function ub(d,b){return new R(b,new E(d.filename,d.input,d.position,d.line,d.position-d.lineStart))}function W(d,b){throw ub(d,b)}function dd(d,b){d.onWarning&&d.onWarning.call(null,ub(d,b))}var _d={YAML(d,b,...l){if(d.version!==null)return W(d,"duplication of %YAML directive");if(l.length!==1)return W(d,"YAML directive accepts exactly one argument");let Z=/^([0-9]+)\.([0-9]+)$/.exec(l[0]);if(Z===null)return W(d,"ill-formed argument of the YAML directive");let m=parseInt(Z[1],10),G=parseInt(Z[2],10);if(m!==1)return W(d,"unacceptable YAML version of the document");if(d.version=l[0],d.checkLineBreaks=G<2,G!==1&&G!==2)return dd(d,"unsupported YAML version of the document")},TAG(d,b,...l){if(l.length!==2)return W(d,"TAG directive accepts exactly two arguments");let Z=l[0],m=l[1];if(!mb.test(Z))return W(d,"ill-formed tag handle (first argument) of the TAG directive");if(d.tagMap&&H(d.tagMap,Z))return W(d,`there is a previously declared suffix for "${Z}" tag handle`);if(!Zb.test(m))return W(d,"ill-formed tag prefix (second argument) of the TAG directive");typeof d.tagMap>"u"&&(d.tagMap=Object.create(null)),d.tagMap[Z]=m}};function T(d,b,l,Z){let m;if(b<l){if(m=d.input.slice(b,l),Z)for(let G=0,i=m.length;G<i;G++){let u=m.charCodeAt(G);if(!(u===9||32<=u&&u<=1114111))return W(d,"expected valid JSON character")}else if(um.test(m))return W(d,"the stream contains non-printable characters");d.result+=m}}function $d(d,b,l,Z){if(!wd(l))return W(d,"cannot merge mappings; the provided source object is unacceptable");let m=Object.keys(l);for(let G=0,i=m.length;G<i;G++){let u=m[G];H(b,u)||(Object.defineProperty(b,u,{value:l[u],writable:!0,enumerable:!0,configurable:!0}),Z[u]=!0)}}function z(d,b,l,Z,m,G,i,u){if(Array.isArray(m)){m=Array.prototype.slice.call(m);for(let p=0,X=m.length;p<X;p++){if(Array.isArray(m[p]))return W(d,"nested arrays are not supported inside keys");typeof m=="object"&&Ad(m[p])==="[object Object]"&&(m[p]="[object Object]")}}if(typeof m=="object"&&Ad(m)==="[object Object]"&&(m="[object Object]"),m=String(m),b===null&&(b={}),Z==="tag:yaml.org,2002:merge")if(Array.isArray(G))for(let p=0,X=G.length;p<X;p++)$d(d,b,G[p],l);else $d(d,b,G,l);else{if(!d.json&&!H(l,m)&&H(b,m))return d.line=i||d.line,d.position=u||d.position,W(d,"duplicated mapping key");Object.defineProperty(b,m,{value:G,writable:!0,enumerable:!0,configurable:!0}),delete l[m]}return b}function Nd(d){let b=d.input.charCodeAt(d.position);if(b===10)d.position++;else if(b===13)d.position++,d.input.charCodeAt(d.position)===10&&d.position++;else return W(d,"a line break is expected");d.line+=1,d.lineStart=d.position}function y(d,b,l){let Z=0,m=d.input.charCodeAt(d.position);for(;m!==0;){for(;N(m);)m=d.input.charCodeAt(++d.position);if(b&&m===35)do m=d.input.charCodeAt(++d.position);while(m!==10&&m!==13&&m!==0);if(I(m))for(Nd(d),m=d.input.charCodeAt(d.position),Z++,d.lineIndent=0;m===32;)d.lineIndent++,m=d.input.charCodeAt(++d.position);else break}return l!==-1&&Z!==0&&d.lineIndent<l&&dd(d,"deficient indentation"),Z}function bd(d){let b=d.position,l=d.input.charCodeAt(b);return!!((l===45||l===46)&&l===d.input.charCodeAt(b+1)&&l===d.input.charCodeAt(b+2)&&(b+=3,l=d.input.charCodeAt(b),l===0||V(l)))}function Pd(d,b){b===1?d.result+=" ":b>1&&(d.result+=e(`
`,b-1))}function om(d,b,l){let Z=d.kind,m=d.result,G=d.input.charCodeAt(d.position);if(V(G)||j(G)||G===35||G===38||G===42||G===33||G===124||G===62||G===39||G===34||G===37||G===64||G===96)return!1;let i;if((G===63||G===45)&&(i=d.input.charCodeAt(d.position+1),V(i)||l&&j(i)))return!1;d.kind="scalar",d.result="";let u,p=u=d.position,X=!1,K=0;for(;G!==0;){if(G===58){if(i=d.input.charCodeAt(d.position+1),V(i)||l&&j(i))break}else if(G===35){let s=d.input.charCodeAt(d.position-1);if(V(s))break}else{if(d.position===d.lineStart&&bd(d)||l&&j(G))break;if(I(G)){K=d.line;let s=d.lineStart,n=d.lineIndent;if(y(d,!1,-1),d.lineIndent>=b){X=!0,G=d.input.charCodeAt(d.position);continue}else{d.position=u,d.line=K,d.lineStart=s,d.lineIndent=n;break}}}X&&(T(d,p,u,!1),Pd(d,d.line-K),p=u=d.position,X=!1),N(G)||(u=d.position+1),G=d.input.charCodeAt(++d.position)}return T(d,p,u,!1),d.result?!0:(d.kind=Z,d.result=m,!1)}function nm(d,b){let l,Z,m;if(l=d.input.charCodeAt(d.position),l!==39)return!1;for(d.kind="scalar",d.result="",d.position++,Z=m=d.position;(l=d.input.charCodeAt(d.position))!==0;)if(l===39)if(T(d,Z,d.position,!0),l=d.input.charCodeAt(++d.position),l===39)Z=d.position,d.position++,m=d.position;else return!0;else if(I(l))T(d,Z,m,!0),Pd(d,y(d,!1,b)),Z=m=d.position;else{if(d.position===d.lineStart&&bd(d))return W(d,"unexpected end of the document within a single quoted scalar");d.position++,m=d.position}return W(d,"unexpected end of the stream within a single quoted scalar")}function ym(d,b){let l=d.input.charCodeAt(d.position);if(l!==34)return!1;d.kind="scalar",d.result="",d.position++;let Z,m=Z=d.position,G;for(;(l=d.input.charCodeAt(d.position))!==0;){if(l===34)return T(d,m,d.position,!0),d.position++,!0;if(l===92){if(T(d,m,d.position,!0),l=d.input.charCodeAt(++d.position),I(l))y(d,!1,b);else if(l<256&&Gb[l])d.result+=ib[l],d.position++;else if((G=Xm(l))>0){let i=G,u=0;for(;i>0;i--)if(l=d.input.charCodeAt(++d.position),(G=Wm(l))>=0)u=(u<<4)+G;else return W(d,"expected hexadecimal character");d.result+=Km(u),d.position++}else return W(d,"unknown escape sequence");m=Z=d.position}else if(I(l))T(d,m,Z,!0),Pd(d,y(d,!1,b)),m=Z=d.position;else{if(d.position===d.lineStart&&bd(d))return W(d,"unexpected end of the document within a double quoted scalar");d.position++,Z=d.position}}return W(d,"unexpected end of the stream within a double quoted scalar")}function hm(d,b){let l=d.input.charCodeAt(d.position),Z,m=!0,G={};if(l===91)Z=93,m=!1,G=[];else if(l===123)Z=125;else return!1;d.anchor!==null&&typeof d.anchor<"u"&&typeof d.anchorMap<"u"&&(d.anchorMap[d.anchor]=G),l=d.input.charCodeAt(++d.position);let i=d.tag,u=d.anchor,p=!0,X,K,s=K=X=null,n,a=n=!1,h=0,x=0,L=Object.create(null);for(;l!==0;){if(y(d,!0,b),l=d.input.charCodeAt(d.position),l===Z)return d.position++,d.tag=i,d.anchor=u,d.kind=m?"mapping":"sequence",d.result=G,!0;if(!p)return W(d,"missed comma between flow collection entries");s=K=X=null,a=n=!1,l===63&&(h=d.input.charCodeAt(d.position+1),V(h)&&(a=n=!0,d.position++,y(d,!0,b))),x=d.line,J(d,b,_,!1,!0),s=d.tag||null,K=d.result,y(d,!0,b),l=d.input.charCodeAt(d.position),(n||d.line===x)&&l===58&&(a=!0,l=d.input.charCodeAt(++d.position),y(d,!0,b),J(d,b,_,!1,!0),X=d.result),m?z(d,G,L,s,K,X):a?G.push(z(d,null,L,s,K,X)):G.push(K),y(d,!0,b),l=d.input.charCodeAt(d.position),l===44?(p=!0,l=d.input.charCodeAt(++d.position)):p=!1}return W(d,"unexpected end of the stream within a flow collection")}function Lm(d,b){let l=kd,Z=!1,m=!1,G=b,i=0,u=!1,p=d.input.charCodeAt(d.position),X=!1;if(p===124)X=!1;else if(p===62)X=!0;else return!1;d.kind="scalar",d.result="";let K=0;for(;p!==0;)if(p=d.input.charCodeAt(++d.position),p===43||p===45)if(kd===l)l=p===43?Ed:im;else return W(d,"repeat of a chomping mode identifier");else if((K=sm(p))>=0){if(K===0)return W(d,"bad explicit indentation width of a block scalar; it cannot be less than one");if(!m)G=b+K-1,m=!0;else return W(d,"repeat of an indentation width identifier")}else break;if(N(p)){do p=d.input.charCodeAt(++d.position);while(N(p));if(p===35)do p=d.input.charCodeAt(++d.position);while(!I(p)&&p!==0)}for(;p!==0;){for(Nd(d),d.lineIndent=0,p=d.input.charCodeAt(d.position);(!m||d.lineIndent<G)&&p===32;)d.lineIndent++,p=d.input.charCodeAt(++d.position);if(!m&&d.lineIndent>G&&(G=d.lineIndent),I(p)){i++;continue}if(d.lineIndent<G){l===Ed?d.result+=e(`
`,Z?1+i:i):l===kd&&Z&&(d.result+=`
`);break}X?N(p)?(u=!0,d.result+=e(`
`,Z?1+i:i)):u?(u=!1,d.result+=e(`
`,i+1)):i===0?Z&&(d.result+=" "):d.result+=e(`
`,i):d.result+=e(`
`,Z?1+i:i),Z=!0,m=!0,i=0;let s=d.position;for(;!I(p)&&p!==0;)p=d.input.charCodeAt(++d.position);T(d,s,d.position,!1)}return!0}function db(d,b){let l,Z,m=!1,G,i=d.tag,u=d.anchor,p=[];for(d.anchor!==null&&typeof d.anchor<"u"&&typeof d.anchorMap<"u"&&(d.anchorMap[d.anchor]=p),G=d.input.charCodeAt(d.position);G!==0&&!(G!==45||(Z=d.input.charCodeAt(d.position+1),!V(Z)));){if(m=!0,d.position++,y(d,!0,-1)&&d.lineIndent<=b){p.push(null),G=d.input.charCodeAt(d.position);continue}if(l=d.line,J(d,b,lb,!1,!0),p.push(d.result),y(d,!0,-1),G=d.input.charCodeAt(d.position),(d.line===l||d.lineIndent>b)&&G!==0)return W(d,"bad indentation of a sequence entry");if(d.lineIndent<b)break}return m?(d.tag=i,d.anchor=u,d.kind="sequence",d.result=p,!0):!1}function Ym(d,b,l){let Z=d.tag,m=d.anchor,G={},i=Object.create(null),u,p=!1,X,K,s=null,n=null,a=null,h=!1,x=!1,L;for(d.anchor!==null&&typeof d.anchor<"u"&&typeof d.anchorMap<"u"&&(d.anchorMap[d.anchor]=G),L=d.input.charCodeAt(d.position);L!==0;){if(u=d.input.charCodeAt(d.position+1),X=d.line,K=d.position,(L===63||L===58)&&V(u)){if(L===63)h&&(z(d,G,i,s,n,null),s=n=a=null),x=!0,h=!0,p=!0;else if(h)h=!1,p=!0;else return W(d,"incomplete explicit mapping pair; a key node is missed; or followed by a non-tabulated empty line");d.position+=1,L=u}else if(J(d,l,bb,!1,!0))if(d.line===X){for(L=d.input.charCodeAt(d.position);N(L);)L=d.input.charCodeAt(++d.position);if(L===58){if(L=d.input.charCodeAt(++d.position),!V(L))return W(d,"a whitespace character is expected after the key-value separator within a block mapping");h&&(z(d,G,i,s,n,null),s=n=a=null),x=!0,h=!1,p=!1,s=d.tag,n=d.result}else return x?W(d,"can not read an implicit mapping pair; a colon is missed"):(d.tag=Z,d.anchor=m,!0)}else return x?W(d,"can not read a block mapping entry; a multiline key may not be an implicit key"):(d.tag=Z,d.anchor=m,!0);else break;if((d.line===X||d.lineIndent>b)&&(J(d,b,$,!0,p)&&(h?n=d.result:a=d.result),h||(z(d,G,i,s,n,a,X,K),s=n=a=null),y(d,!0,-1),L=d.input.charCodeAt(d.position)),d.lineIndent>b&&L!==0)return W(d,"bad indentation of a mapping entry");if(d.lineIndent<b)break}return h&&z(d,G,i,s,n,null),x&&(d.tag=Z,d.anchor=m,d.kind="mapping",d.result=G),x}function tm(d){let b,l=!1,Z=!1,m="",G,i;if(i=d.input.charCodeAt(d.position),i!==33)return!1;if(d.tag!==null)return W(d,"duplication of a tag property");if(i=d.input.charCodeAt(++d.position),i===60?(l=!0,i=d.input.charCodeAt(++d.position)):i===33?(Z=!0,m="!!",i=d.input.charCodeAt(++d.position)):m="!",b=d.position,l){do i=d.input.charCodeAt(++d.position);while(i!==0&&i!==62);if(d.position<d.length)G=d.input.slice(b,d.position),i=d.input.charCodeAt(++d.position);else return W(d,"unexpected end of the stream within a verbatim tag")}else{for(;i!==0&&!V(i);){if(i===33){if(Z)return W(d,"tag suffix cannot contain exclamation marks");if(m=d.input.slice(b-1,d.position+1),!mb.test(m))return W(d,"named tag handle cannot contain such characters");Z=!0,b=d.position+1}i=d.input.charCodeAt(++d.position)}if(G=d.input.slice(b,d.position),cm.test(G))return W(d,"tag suffix cannot contain flow indicator characters")}if(G&&!Zb.test(G))return W(d,`tag name cannot contain such characters: ${G}`);if(l)d.tag=G;else if(typeof d.tagMap<"u"&&H(d.tagMap,m))d.tag=d.tagMap[m]+G;else if(m==="!")d.tag=`!${G}`;else if(m==="!!")d.tag=`tag:yaml.org,2002:${G}`;else return W(d,`undeclared tag handle "${m}"`);return!0}function Vm(d){let b=d.input.charCodeAt(d.position);if(b!==38)return!1;if(d.anchor!==null)return W(d,"duplication of an anchor property");b=d.input.charCodeAt(++d.position);let l=d.position;for(;b!==0&&!V(b)&&!j(b);)b=d.input.charCodeAt(++d.position);return d.position===l?W(d,"name of an anchor node must contain at least one character"):(d.anchor=d.input.slice(l,d.position),!0)}function am(d){let b=d.input.charCodeAt(d.position);if(b!==42)return!1;b=d.input.charCodeAt(++d.position);let l=d.position;for(;b!==0&&!V(b)&&!j(b);)b=d.input.charCodeAt(++d.position);if(d.position===l)return W(d,"name of an alias node must contain at least one character");let Z=d.input.slice(l,d.position);return typeof d.anchorMap<"u"&&!H(d.anchorMap,Z)?W(d,`unidentified alias "${Z}"`):(typeof d.anchorMap<"u"&&(d.result=d.anchorMap[Z]),y(d,!0,-1),!0)}function J(d,b,l,Z,m){let G,i,u=1,p=!1,X=!1,K,s,n;d.listener&&d.listener!==null&&d.listener("open",d),d.tag=null,d.anchor=null,d.kind=null,d.result=null;let a=G=i=$===l||lb===l;if(Z&&y(d,!0,-1)&&(p=!0,d.lineIndent>b?u=1:d.lineIndent===b?u=0:d.lineIndent<b&&(u=-1)),u===1)for(;tm(d)||Vm(d);)y(d,!0,-1)?(p=!0,i=a,d.lineIndent>b?u=1:d.lineIndent===b?u=0:d.lineIndent<b&&(u=-1)):i=!1;if(i&&(i=p||m),u===1||$===l)if(s=_===l||bb===l?b:b+1,n=d.position-d.lineStart,u===1)if(i&&(db(d,n)||Ym(d,n,s))||hm(d,s))X=!0;else{if(G&&Lm(d,s)||nm(d,s)||ym(d,s))X=!0;else if(am(d)){if(X=!0,d.tag!==null||d.anchor!==null)return W(d,"alias node should not have Any properties")}else om(d,s,_===l)&&(X=!0,d.tag===null&&(d.tag="?"));d.anchor!==null&&typeof d.anchorMap<"u"&&(d.anchorMap[d.anchor]=d.result)}else u===0&&(X=i&&db(d,n));if(d.tag!==null&&d.tag!=="!")if(d.tag==="?"){for(let h=0,x=d.implicitTypes.length;h<x;h++)if(K=d.implicitTypes[h],K.resolve(d.result)){d.result=K.construct(d.result),d.tag=K.tag,d.anchor!==null&&typeof d.anchorMap<"u"&&(d.anchorMap[d.anchor]=d.result);break}}else if(H(d.typeMap[d.kind||"fallback"],d.tag)){if(K=d.typeMap[d.kind||"fallback"][d.tag],d.result!==null&&K.kind!==d.kind)return W(d,`unacceptable node kind for !<${d.tag}> tag; it should be "${K.kind}", not "${d.kind}"`);if(K.resolve(d.result))d.result=K.construct(d.result),d.anchor!==null&&typeof d.anchorMap<"u"&&(d.anchorMap[d.anchor]=d.result);else return W(d,`cannot resolve a node with !<${d.tag}> explicit tag`)}else return W(d,`unknown tag !<${d.tag}>`);return d.listener&&d.listener!==null&&d.listener("close",d),d.tag!==null||d.anchor!==null||X}function xm(d){let b=d.position,l,Z,m,G=!1,i;for(d.version=null,d.checkLineBreaks=d.legacy,d.tagMap=Object.create(null),d.anchorMap=Object.create(null);(i=d.input.charCodeAt(d.position))!==0&&(y(d,!0,-1),i=d.input.charCodeAt(d.position),!(d.lineIndent>0||i!==37));){for(G=!0,i=d.input.charCodeAt(++d.position),l=d.position;i!==0&&!V(i);)i=d.input.charCodeAt(++d.position);if(Z=d.input.slice(l,d.position),m=[],Z.length<1)return W(d,"directive name must not be less than one character in length");for(;i!==0;){for(;N(i);)i=d.input.charCodeAt(++d.position);if(i===35){do i=d.input.charCodeAt(++d.position);while(i!==0&&!I(i));break}if(I(i))break;for(l=d.position;i!==0&&!V(i);)i=d.input.charCodeAt(++d.position);m.push(d.input.slice(l,d.position))}i!==0&&Nd(d),H(_d,Z)?_d[Z](d,Z,...m):dd(d,`unknown document directive "${Z}"`)}if(y(d,!0,-1),d.lineIndent===0&&d.input.charCodeAt(d.position)===45&&d.input.charCodeAt(d.position+1)===45&&d.input.charCodeAt(d.position+2)===45)d.position+=3,y(d,!0,-1);else if(G)return W(d,"directives end mark is expected");if(J(d,d.lineIndent-1,$,!1,!0),y(d,!0,-1),d.checkLineBreaks&&pm.test(d.input.slice(b,d.position))&&dd(d,"non-ASCII line breaks are interpreted as content"),d.documents.push(d.result),d.position===d.lineStart&&bd(d)){d.input.charCodeAt(d.position)===46&&(d.position+=3,y(d,!0,-1));return}if(d.position<d.length-1)return W(d,"end of the stream or a document separator is expected")}function em(d,b){d=String(d),b=b||{},d.length!==0&&(d.charCodeAt(d.length-1)!==10&&d.charCodeAt(d.length-1)!==13&&(d+=`
`),d.charCodeAt(0)===65279&&(d=d.slice(1)));let l=new q(d,b);for(l.input+="\0";l.input.charCodeAt(l.position)===32;)l.lineIndent+=1,l.position+=1;for(;l.position<l.length-1;)xm(l);return l.documents}function pb(d,b){let l=em(d,b);if(l.length!==0){if(l.length===1)return l[0];throw new R("expected a single document in the stream, but found more")}}function cb(d,b){return pb(d,b)}var{hasOwn:XG}=Object;var{hasOwn:hG}=Object;var Y={};Y[0]="\\0";Y[7]="\\a";Y[8]="\\b";Y[9]="\\t";Y[10]="\\n";Y[11]="\\v";Y[12]="\\f";Y[13]="\\r";Y[27]="\\e";Y[34]='\\"';Y[92]="\\\\";Y[133]="\\N";Y[160]="\\_";Y[8232]="\\L";Y[8233]="\\P";async function Im(d,b){let l=await M.readPage(d),Z=await D.parseMarkdown(l),m;return Fd(Z,G=>{if(G.type!=="FencedCode")return!1;let i=cd(G,"CodeInfo");if(b&&!i||b&&!b.includes(i.children[0].text))return!1;let u=cd(G,"CodeText");return u?(m=u.children[0].text,!0):!1}),m}async function Xb(d,b=["yaml"]){let l=await Im(d,b);if(l!==void 0)try{return cb(l)}catch(Z){throw console.error("YAML Page parser error",Z),new Error(`YAML Error: ${Z.message}`)}}var Cm="SETTINGS";async function sb(d,b){try{let Z=(await Xb(Cm,["yaml"])||{})[d];return Z===void 0?b:Z}catch(l){if(l.message==="Page not found")return b;throw l}}async function f(d){let b=await sb("graphview",{});return b[d]!==void 0?b[d]:!1}async function Kb(d){if(d.length===0){console.log("no page name supplied, ignoring navigation");return}let[b,l]=d.split("@");console.log(`navigating to ${d}`),await S.navigate(b,+l)}var ld=class{async init(){this.colorMapSettings=await f("colormap"),console.log(this.colorMapSettings),this.colorMapPathSettings=this.colorMapSettings?this.colorMapSettings.path:[],this.colorMapTagSettings=this.colorMapSettings?this.colorMapSettings.tag:[],this.spacetags=await C.queryPrefix("tag:"),this.taggedPages=[...new Set(this.spacetags.map(b=>b.page))],this.individuallyTaggedPages=await C.queryPrefix("tag:node_color="),this.spacepages=await M.listPages(),this.default_color=await f("default_color")}build(){return this.spacepages.map(b=>{let l=this.spacetags.filter(Z=>Z.page===b.name);if(this.individuallyTaggedPages.find(Z=>Z.page===b.name))return{page:b.name,color:this.individuallyTaggedPages.find(Z=>Z.page===b.name).value.split("=")[1]};if(this.colorMapTagSettings){let Z=l.filter(m=>this.colorMapTagSettings[m.value]!==void 0);if(Z.length>0)return{page:b.name,color:this.colorMapTagSettings[Z[0].value]}}if(this.colorMapPathSettings){let Z=Object.keys(this.colorMapPathSettings).find(m=>b.name.startsWith(m));if(Z)return{page:b.name,color:this.colorMapPathSettings[Z]}}return{page:b.name,color:this.default_color?this.default_color:"000000"}})}};var md=class{constructor(b=[]){this.pagefilter=b=>!this.isIgnoredPage(b.name);this.linkfilter=b=>{let l=b.key.split(":").slice(1,-1).join(":");return!this.isIgnoredPage(b.page)&&!this.isIgnoredPage(l)};this.ignoredPages=b}async init(){this.ignoredPages=(await C.queryPrefix("tag:.graphignore")).map(b=>b.page)}isIgnoredPage(b){return this.ignoredPages.includes(b)}};var rd=new O("showGraphView"),ob=new ld;async function nb(){if(await rd.toggleGraphViewStatus(),await rd.getGraphViewStatus()){let d=await S.getCurrentPage();await hb(d)}else await S.hidePanel("lhs")}async function yb(){let d=await S.getCurrentPage();await hb(d)}async function hb(d){let b=await Rm(d),l=JSON.stringify(b),Z=await k.readAsset("style.css");await rd.getGraphViewStatus()&&await S.showPanel("lhs",1,`<html>
<head>
<style>${Z}</style>
</head>
<body>
<div id="graph" >
</div>
</body>
</html>`,await Mm(l))}async function Mm(d){let b=await k.readAsset("asset/d3.js","utf8"),l=await k.readAsset("asset/d3-force.js","utf8"),Z=await k.readAsset("asset/force-graph.js","utf8");return`
${b}
${l}
${Z}
const graph = ${d};
console.log(graph);
const graph_div = document.querySelector('#graph');
let chart;
function createChart() {
// Remove the existing chart object from the DOM
graph_div.innerHTML = '';
// Create a new chart object with the updated dimensions
chart = ForceGraph(graph, {
nodeId: d => d.id,
nodeTitle: d => d.id,
nodeStrokeOpacity: 0.75,
height: window.innerHeight,
width: window.innerWidth,
});
// Add the new chart object to the DOM
graph_div.appendChild(chart);
}
createChart();
function handleResize() {
// Check if the dimensions have actually changed
if (window.innerHeight-10 !== chart.height || window.innerWidth-10 !== chart.width) {
// Recreate/redraw the chart object
createChart();
}
}
let timeout = false;
// Add an event listener to the window object that listens for the resize event
window.addEventListener('resize', () => {
clearTimeout(timeout);
timeout = setTimeout(handleResize, 250);
});
`}async function Rm(d){let b=new md;await b.init();let Z=(await M.listPages()).filter(b.pagefilter).map(({name:X})=>X),G=(await C.queryPrefix("pl:")).filter(b.linkfilter).map(({key:X,page:K})=>{let s=X.split(":").slice(1,-1).join(":");return Z.includes(s)||Z.push(s),{source:K,target:s}});await ob.init();let i=ob.build(),u=await f("default_color");return{nodes:Z.map(X=>{let K=u||"000000";return i.find(s=>s.page===X)&&(K=i.find(s=>s.page===X).color),{id:X,color:K}}),links:G}}var Lb={toggle:nb,updateGraphView:yb,navigateTo:Kb},Tm={name:"graphview",imports:["https://get.silverbullet.md/global.plug.json"],version:.1,assets:{"asset/d3-force.js":{data:"data:application/javascript;base64,Ly8gaHR0cHM6Ly9kM2pzLm9yZy9kMy1mb3JjZS8gdjMuMC4wIENvcHlyaWdodCAyMDEwLTIwMjEgTWlrZSBCb3N0b2NrCiFmdW5jdGlvbihuLHQpeyJvYmplY3QiPT10eXBlb2YgZXhwb3J0cyYmInVuZGVmaW5lZCIhPXR5cGVvZiBtb2R1bGU/dChleHBvcnRzLHJlcXVpcmUoImQzLXF1YWR0cmVlIikscmVxdWlyZSgiZDMtZGlzcGF0Y2giKSxyZXF1aXJlKCJkMy10aW1lciIpKToiZnVuY3Rpb24iPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kP2RlZmluZShbImV4cG9ydHMiLCJkMy1xdWFkdHJlZSIsImQzLWRpc3BhdGNoIiwiZDMtdGltZXIiXSx0KTp0KChuPSJ1bmRlZmluZWQiIT10eXBlb2YgZ2xvYmFsVGhpcz9nbG9iYWxUaGlzOm58fHNlbGYpLmQzPW4uZDN8fHt9LG4uZDMsbi5kMyxuLmQzKX0odGhpcywoZnVuY3Rpb24obix0LGUscil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIGkobil7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIG59fWZ1bmN0aW9uIHUobil7cmV0dXJuIDFlLTYqKG4oKS0uNSl9ZnVuY3Rpb24gbyhuKXtyZXR1cm4gbi54K24udnh9ZnVuY3Rpb24gZihuKXtyZXR1cm4gbi55K24udnl9ZnVuY3Rpb24gYShuKXtyZXR1cm4gbi5pbmRleH1mdW5jdGlvbiBjKG4sdCl7dmFyIGU9bi5nZXQodCk7aWYoIWUpdGhyb3cgbmV3IEVycm9yKCJub2RlIG5vdCBmb3VuZDogIit0KTtyZXR1cm4gZX1jb25zdCBsPTQyOTQ5NjcyOTY7ZnVuY3Rpb24gaChuKXtyZXR1cm4gbi54fWZ1bmN0aW9uIHYobil7cmV0dXJuIG4ueX12YXIgeT1NYXRoLlBJKigzLU1hdGguc3FydCg1KSk7bi5mb3JjZUNlbnRlcj1mdW5jdGlvbihuLHQpe3ZhciBlLHI9MTtmdW5jdGlvbiBpKCl7dmFyIGksdSxvPWUubGVuZ3RoLGY9MCxhPTA7Zm9yKGk9MDtpPG87KytpKWYrPSh1PWVbaV0pLngsYSs9dS55O2ZvcihmPShmL28tbikqcixhPShhL28tdCkqcixpPTA7aTxvOysraSkodT1lW2ldKS54LT1mLHUueS09YX1yZXR1cm4gbnVsbD09biYmKG49MCksbnVsbD09dCYmKHQ9MCksaS5pbml0aWFsaXplPWZ1bmN0aW9uKG4pe2U9bn0saS54PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPSt0LGkpOm59LGkueT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD0rbixpKTp0fSxpLnN0cmVuZ3RoPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPStuLGkpOnJ9LGl9LG4uZm9yY2VDb2xsaWRlPWZ1bmN0aW9uKG4pe3ZhciBlLHIsYSxjPTEsbD0xO2Z1bmN0aW9uIGgoKXtmb3IodmFyIG4saSxoLHksZCxnLHgscz1lLmxlbmd0aCxwPTA7cDxsOysrcClmb3IoaT10LnF1YWR0cmVlKGUsbyxmKS52aXNpdEFmdGVyKHYpLG49MDtuPHM7KytuKWg9ZVtuXSxnPXJbaC5pbmRleF0seD1nKmcseT1oLngraC52eCxkPWgueStoLnZ5LGkudmlzaXQoTSk7ZnVuY3Rpb24gTShuLHQsZSxyLGkpe3ZhciBvPW4uZGF0YSxmPW4ucixsPWcrZjtpZighbylyZXR1cm4gdD55K2x8fHI8eS1sfHxlPmQrbHx8aTxkLWw7aWYoby5pbmRleD5oLmluZGV4KXt2YXIgdj15LW8ueC1vLnZ4LHM9ZC1vLnktby52eSxwPXYqditzKnM7cDxsKmwmJigwPT09diYmKHArPSh2PXUoYSkpKnYpLDA9PT1zJiYocCs9KHM9dShhKSkqcykscD0obC0ocD1NYXRoLnNxcnQocCkpKS9wKmMsaC52eCs9KHYqPXApKihsPShmKj1mKS8oeCtmKSksaC52eSs9KHMqPXApKmwsby52eC09dioobD0xLWwpLG8udnktPXMqbCl9fX1mdW5jdGlvbiB2KG4pe2lmKG4uZGF0YSlyZXR1cm4gbi5yPXJbbi5kYXRhLmluZGV4XTtmb3IodmFyIHQ9bi5yPTA7dDw0OysrdCluW3RdJiZuW3RdLnI+bi5yJiYobi5yPW5bdF0ucil9ZnVuY3Rpb24geSgpe2lmKGUpe3ZhciB0LGksdT1lLmxlbmd0aDtmb3Iocj1uZXcgQXJyYXkodSksdD0wO3Q8dTsrK3QpaT1lW3RdLHJbaS5pbmRleF09K24oaSx0LGUpfX1yZXR1cm4iZnVuY3Rpb24iIT10eXBlb2YgbiYmKG49aShudWxsPT1uPzE6K24pKSxoLmluaXRpYWxpemU9ZnVuY3Rpb24obix0KXtlPW4sYT10LHkoKX0saC5pdGVyYXRpb25zPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhsPStuLGgpOmx9LGguc3RyZW5ndGg9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGM9K24saCk6Y30saC5yYWRpdXM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDppKCt0KSx5KCksaCk6bn0saH0sbi5mb3JjZUxpbms9ZnVuY3Rpb24obil7dmFyIHQsZSxyLG8sZixsLGg9YSx2PWZ1bmN0aW9uKG4pe3JldHVybiAxL01hdGgubWluKG9bbi5zb3VyY2UuaW5kZXhdLG9bbi50YXJnZXQuaW5kZXhdKX0seT1pKDMwKSxkPTE7ZnVuY3Rpb24gZyhyKXtmb3IodmFyIGk9MCxvPW4ubGVuZ3RoO2k8ZDsrK2kpZm9yKHZhciBhLGMsaCx2LHksZyx4LHM9MDtzPG87KytzKWM9KGE9bltzXSkuc291cmNlLHY9KGg9YS50YXJnZXQpLngraC52eC1jLngtYy52eHx8dShsKSx5PWgueStoLnZ5LWMueS1jLnZ5fHx1KGwpLHYqPWc9KChnPU1hdGguc3FydCh2KnYreSp5KSktZVtzXSkvZypyKnRbc10seSo9ZyxoLnZ4LT12Kih4PWZbc10pLGgudnktPXkqeCxjLnZ4Kz12Kih4PTEteCksYy52eSs9eSp4fWZ1bmN0aW9uIHgoKXtpZihyKXt2YXIgaSx1LGE9ci5sZW5ndGgsbD1uLmxlbmd0aCx2PW5ldyBNYXAoci5tYXAoKChuLHQpPT5baChuLHQsciksbl0pKSk7Zm9yKGk9MCxvPW5ldyBBcnJheShhKTtpPGw7KytpKSh1PW5baV0pLmluZGV4PWksIm9iamVjdCIhPXR5cGVvZiB1LnNvdXJjZSYmKHUuc291cmNlPWModix1LnNvdXJjZSkpLCJvYmplY3QiIT10eXBlb2YgdS50YXJnZXQmJih1LnRhcmdldD1jKHYsdS50YXJnZXQpKSxvW3Uuc291cmNlLmluZGV4XT0ob1t1LnNvdXJjZS5pbmRleF18fDApKzEsb1t1LnRhcmdldC5pbmRleF09KG9bdS50YXJnZXQuaW5kZXhdfHwwKSsxO2ZvcihpPTAsZj1uZXcgQXJyYXkobCk7aTxsOysraSl1PW5baV0sZltpXT1vW3Uuc291cmNlLmluZGV4XS8ob1t1LnNvdXJjZS5pbmRleF0rb1t1LnRhcmdldC5pbmRleF0pO3Q9bmV3IEFycmF5KGwpLHMoKSxlPW5ldyBBcnJheShsKSxwKCl9fWZ1bmN0aW9uIHMoKXtpZihyKWZvcih2YXIgZT0wLGk9bi5sZW5ndGg7ZTxpOysrZSl0W2VdPSt2KG5bZV0sZSxuKX1mdW5jdGlvbiBwKCl7aWYocilmb3IodmFyIHQ9MCxpPW4ubGVuZ3RoO3Q8aTsrK3QpZVt0XT0reShuW3RdLHQsbil9cmV0dXJuIG51bGw9PW4mJihuPVtdKSxnLmluaXRpYWxpemU9ZnVuY3Rpb24obix0KXtyPW4sbD10LHgoKX0sZy5saW5rcz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj10LHgoKSxnKTpufSxnLmlkPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhoPW4sZyk6aH0sZy5pdGVyYXRpb25zPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhkPStuLGcpOmR9LGcuc3RyZW5ndGg9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHY9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjppKCtuKSxzKCksZyk6dn0sZy5kaXN0YW5jZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oeT0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOmkoK24pLHAoKSxnKTp5fSxnfSxuLmZvcmNlTWFueUJvZHk9ZnVuY3Rpb24oKXt2YXIgbixlLHIsbyxmLGE9aSgtMzApLGM9MSxsPTEvMCx5PS44MTtmdW5jdGlvbiBkKHIpe3ZhciBpLHU9bi5sZW5ndGgsZj10LnF1YWR0cmVlKG4saCx2KS52aXNpdEFmdGVyKHgpO2ZvcihvPXIsaT0wO2k8dTsrK2kpZT1uW2ldLGYudmlzaXQocyl9ZnVuY3Rpb24gZygpe2lmKG4pe3ZhciB0LGUscj1uLmxlbmd0aDtmb3IoZj1uZXcgQXJyYXkociksdD0wO3Q8cjsrK3QpZT1uW3RdLGZbZS5pbmRleF09K2EoZSx0LG4pfX1mdW5jdGlvbiB4KG4pe3ZhciB0LGUscixpLHUsbz0wLGE9MDtpZihuLmxlbmd0aCl7Zm9yKHI9aT11PTA7dTw0OysrdSkodD1uW3VdKSYmKGU9TWF0aC5hYnModC52YWx1ZSkpJiYobys9dC52YWx1ZSxhKz1lLHIrPWUqdC54LGkrPWUqdC55KTtuLng9ci9hLG4ueT1pL2F9ZWxzZXsodD1uKS54PXQuZGF0YS54LHQueT10LmRhdGEueTtkb3tvKz1mW3QuZGF0YS5pbmRleF19d2hpbGUodD10Lm5leHQpfW4udmFsdWU9b31mdW5jdGlvbiBzKG4sdCxpLGEpe2lmKCFuLnZhbHVlKXJldHVybiEwO3ZhciBoPW4ueC1lLngsdj1uLnktZS55LGQ9YS10LGc9aCpoK3YqdjtpZihkKmQveTxnKXJldHVybiBnPGwmJigwPT09aCYmKGcrPShoPXUocikpKmgpLDA9PT12JiYoZys9KHY9dShyKSkqdiksZzxjJiYoZz1NYXRoLnNxcnQoYypnKSksZS52eCs9aCpuLnZhbHVlKm8vZyxlLnZ5Kz12Km4udmFsdWUqby9nKSwhMDtpZighKG4ubGVuZ3RofHxnPj1sKSl7KG4uZGF0YSE9PWV8fG4ubmV4dCkmJigwPT09aCYmKGcrPShoPXUocikpKmgpLDA9PT12JiYoZys9KHY9dShyKSkqdiksZzxjJiYoZz1NYXRoLnNxcnQoYypnKSkpO2Rve24uZGF0YSE9PWUmJihkPWZbbi5kYXRhLmluZGV4XSpvL2csZS52eCs9aCpkLGUudnkrPXYqZCl9d2hpbGUobj1uLm5leHQpfX1yZXR1cm4gZC5pbml0aWFsaXplPWZ1bmN0aW9uKHQsZSl7bj10LHI9ZSxnKCl9LGQuc3RyZW5ndGg9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjppKCtuKSxnKCksZCk6YX0sZC5kaXN0YW5jZU1pbj1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYz1uKm4sZCk6TWF0aC5zcXJ0KGMpfSxkLmRpc3RhbmNlTWF4PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhsPW4qbixkKTpNYXRoLnNxcnQobCl9LGQudGhldGE9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHk9bipuLGQpOk1hdGguc3FydCh5KX0sZH0sbi5mb3JjZVJhZGlhbD1mdW5jdGlvbihuLHQsZSl7dmFyIHIsdSxvLGY9aSguMSk7ZnVuY3Rpb24gYShuKXtmb3IodmFyIGk9MCxmPXIubGVuZ3RoO2k8ZjsrK2kpe3ZhciBhPXJbaV0sYz1hLngtdHx8MWUtNixsPWEueS1lfHwxZS02LGg9TWF0aC5zcXJ0KGMqYytsKmwpLHY9KG9baV0taCkqdVtpXSpuL2g7YS52eCs9Yyp2LGEudnkrPWwqdn19ZnVuY3Rpb24gYygpe2lmKHIpe3ZhciB0LGU9ci5sZW5ndGg7Zm9yKHU9bmV3IEFycmF5KGUpLG89bmV3IEFycmF5KGUpLHQ9MDt0PGU7Kyt0KW9bdF09K24oclt0XSx0LHIpLHVbdF09aXNOYU4ob1t0XSk/MDorZihyW3RdLHQscil9fXJldHVybiJmdW5jdGlvbiIhPXR5cGVvZiBuJiYobj1pKCtuKSksbnVsbD09dCYmKHQ9MCksbnVsbD09ZSYmKGU9MCksYS5pbml0aWFsaXplPWZ1bmN0aW9uKG4pe3I9bixjKCl9LGEuc3RyZW5ndGg9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGY9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjppKCtuKSxjKCksYSk6Zn0sYS5yYWRpdXM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDppKCt0KSxjKCksYSk6bn0sYS54PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PStuLGEpOnR9LGEueT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT0rbixhKTplfSxhfSxuLmZvcmNlU2ltdWxhdGlvbj1mdW5jdGlvbihuKXt2YXIgdCxpPTEsdT0uMDAxLG89MS1NYXRoLnBvdyh1LDEvMzAwKSxmPTAsYT0uNixjPW5ldyBNYXAsaD1yLnRpbWVyKGcpLHY9ZS5kaXNwYXRjaCgidGljayIsImVuZCIpLGQ9ZnVuY3Rpb24oKXtsZXQgbj0xO3JldHVybigpPT4obj0oMTY2NDUyNSpuKzEwMTM5MDQyMjMpJWwpL2x9KCk7ZnVuY3Rpb24gZygpe3goKSx2LmNhbGwoInRpY2siLHQpLGk8dSYmKGguc3RvcCgpLHYuY2FsbCgiZW5kIix0KSl9ZnVuY3Rpb24geChlKXt2YXIgcix1LGw9bi5sZW5ndGg7dm9pZCAwPT09ZSYmKGU9MSk7Zm9yKHZhciBoPTA7aDxlOysraClmb3IoaSs9KGYtaSkqbyxjLmZvckVhY2goKGZ1bmN0aW9uKG4pe24oaSl9KSkscj0wO3I8bDsrK3IpbnVsbD09KHU9bltyXSkuZng/dS54Kz11LnZ4Kj1hOih1Lng9dS5meCx1LnZ4PTApLG51bGw9PXUuZnk/dS55Kz11LnZ5Kj1hOih1Lnk9dS5meSx1LnZ5PTApO3JldHVybiB0fWZ1bmN0aW9uIHMoKXtmb3IodmFyIHQsZT0wLHI9bi5sZW5ndGg7ZTxyOysrZSl7aWYoKHQ9bltlXSkuaW5kZXg9ZSxudWxsIT10LmZ4JiYodC54PXQuZngpLG51bGwhPXQuZnkmJih0Lnk9dC5meSksaXNOYU4odC54KXx8aXNOYU4odC55KSl7dmFyIGk9MTAqTWF0aC5zcXJ0KC41K2UpLHU9ZSp5O3QueD1pKk1hdGguY29zKHUpLHQueT1pKk1hdGguc2luKHUpfShpc05hTih0LnZ4KXx8aXNOYU4odC52eSkpJiYodC52eD10LnZ5PTApfX1mdW5jdGlvbiBwKHQpe3JldHVybiB0LmluaXRpYWxpemUmJnQuaW5pdGlhbGl6ZShuLGQpLHR9cmV0dXJuIG51bGw9PW4mJihuPVtdKSxzKCksdD17dGljazp4LHJlc3RhcnQ6ZnVuY3Rpb24oKXtyZXR1cm4gaC5yZXN0YXJ0KGcpLHR9LHN0b3A6ZnVuY3Rpb24oKXtyZXR1cm4gaC5zdG9wKCksdH0sbm9kZXM6ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49ZSxzKCksYy5mb3JFYWNoKHApLHQpOm59LGFscGhhOmZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPStuLHQpOml9LGFscGhhTWluOmZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PStuLHQpOnV9LGFscGhhRGVjYXk6ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89K24sdCk6K299LGFscGhhVGFyZ2V0OmZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhmPStuLHQpOmZ9LHZlbG9jaXR5RGVjYXk6ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9MS1uLHQpOjEtYX0scmFuZG9tU291cmNlOmZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhkPW4sYy5mb3JFYWNoKHApLHQpOmR9LGZvcmNlOmZ1bmN0aW9uKG4sZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg+MT8obnVsbD09ZT9jLmRlbGV0ZShuKTpjLnNldChuLHAoZSkpLHQpOmMuZ2V0KG4pfSxmaW5kOmZ1bmN0aW9uKHQsZSxyKXt2YXIgaSx1LG8sZixhLGM9MCxsPW4ubGVuZ3RoO2ZvcihudWxsPT1yP3I9MS8wOnIqPXIsYz0wO2M8bDsrK2MpKG89KGk9dC0oZj1uW2NdKS54KSppKyh1PWUtZi55KSp1KTxyJiYoYT1mLHI9byk7cmV0dXJuIGF9LG9uOmZ1bmN0aW9uKG4sZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg+MT8odi5vbihuLGUpLHQpOnYub24obil9fX0sbi5mb3JjZVg9ZnVuY3Rpb24obil7dmFyIHQsZSxyLHU9aSguMSk7ZnVuY3Rpb24gbyhuKXtmb3IodmFyIGksdT0wLG89dC5sZW5ndGg7dTxvOysrdSkoaT10W3VdKS52eCs9KHJbdV0taS54KSplW3VdKm59ZnVuY3Rpb24gZigpe2lmKHQpe3ZhciBpLG89dC5sZW5ndGg7Zm9yKGU9bmV3IEFycmF5KG8pLHI9bmV3IEFycmF5KG8pLGk9MDtpPG87KytpKWVbaV09aXNOYU4ocltpXT0rbih0W2ldLGksdCkpPzA6K3UodFtpXSxpLHQpfX1yZXR1cm4iZnVuY3Rpb24iIT10eXBlb2YgbiYmKG49aShudWxsPT1uPzA6K24pKSxvLmluaXRpYWxpemU9ZnVuY3Rpb24obil7dD1uLGYoKX0sby5zdHJlbmd0aD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOmkoK24pLGYoKSxvKTp1fSxvLng9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDppKCt0KSxmKCksbyk6bn0sb30sbi5mb3JjZVk9ZnVuY3Rpb24obil7dmFyIHQsZSxyLHU9aSguMSk7ZnVuY3Rpb24gbyhuKXtmb3IodmFyIGksdT0wLG89dC5sZW5ndGg7dTxvOysrdSkoaT10W3VdKS52eSs9KHJbdV0taS55KSplW3VdKm59ZnVuY3Rpb24gZigpe2lmKHQpe3ZhciBpLG89dC5sZW5ndGg7Zm9yKGU9bmV3IEFycmF5KG8pLHI9bmV3IEFycmF5KG8pLGk9MDtpPG87KytpKWVbaV09aXNOYU4ocltpXT0rbih0W2ldLGksdCkpPzA6K3UodFtpXSxpLHQpfX1yZXR1cm4iZnVuY3Rpb24iIT10eXBlb2YgbiYmKG49aShudWxsPT1uPzA6K24pKSxvLmluaXRpYWxpemU9ZnVuY3Rpb24obil7dD1uLGYoKX0sby5zdHJlbmd0aD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOmkoK24pLGYoKSxvKTp1fSxvLnk9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDppKCt0KSxmKCksbyk6bn0sb30sT2JqZWN0LmRlZmluZVByb3BlcnR5KG4sIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pfSkpOw==",mtime:1684830101937},"asset/d3.js":{data:"data:application/javascript;base64,Ly8gaHR0cHM6Ly9kM2pzLm9yZyB2Ny44LjQgQ29weXJpZ2h0IDIwMTAtMjAyMyBNaWtlIEJvc3RvY2sKIWZ1bmN0aW9uKHQsbil7Im9iamVjdCI9PXR5cGVvZiBleHBvcnRzJiYidW5kZWZpbmVkIiE9dHlwZW9mIG1vZHVsZT9uKGV4cG9ydHMpOiJmdW5jdGlvbiI9PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQ/ZGVmaW5lKFsiZXhwb3J0cyJdLG4pOm4oKHQ9InVuZGVmaW5lZCIhPXR5cGVvZiBnbG9iYWxUaGlzP2dsb2JhbFRoaXM6dHx8c2VsZikuZDM9dC5kM3x8e30pfSh0aGlzLChmdW5jdGlvbih0KXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0LG4pe3JldHVybiBudWxsPT10fHxudWxsPT1uP05hTjp0PG4/LTE6dD5uPzE6dD49bj8wOk5hTn1mdW5jdGlvbiBlKHQsbil7cmV0dXJuIG51bGw9PXR8fG51bGw9PW4/TmFOOm48dD8tMTpuPnQ/MTpuPj10PzA6TmFOfWZ1bmN0aW9uIHIodCl7bGV0IHIsbyxhO2Z1bmN0aW9uIHUodCxuLGU9MCxpPXQubGVuZ3RoKXtpZihlPGkpe2lmKDAhPT1yKG4sbikpcmV0dXJuIGk7ZG97Y29uc3Qgcj1lK2k+Pj4xO28odFtyXSxuKTwwP2U9cisxOmk9cn13aGlsZShlPGkpfXJldHVybiBlfXJldHVybiAyIT09dC5sZW5ndGg/KHI9bixvPShlLHIpPT5uKHQoZSksciksYT0obixlKT0+dChuKS1lKToocj10PT09bnx8dD09PWU/dDppLG89dCxhPXQpLHtsZWZ0OnUsY2VudGVyOmZ1bmN0aW9uKHQsbixlPTAscj10Lmxlbmd0aCl7Y29uc3QgaT11KHQsbixlLHItMSk7cmV0dXJuIGk+ZSYmYSh0W2ktMV0sbik+LWEodFtpXSxuKT9pLTE6aX0scmlnaHQ6ZnVuY3Rpb24odCxuLGU9MCxpPXQubGVuZ3RoKXtpZihlPGkpe2lmKDAhPT1yKG4sbikpcmV0dXJuIGk7ZG97Y29uc3Qgcj1lK2k+Pj4xO28odFtyXSxuKTw9MD9lPXIrMTppPXJ9d2hpbGUoZTxpKX1yZXR1cm4gZX19fWZ1bmN0aW9uIGkoKXtyZXR1cm4gMH1mdW5jdGlvbiBvKHQpe3JldHVybiBudWxsPT09dD9OYU46K3R9ZnVuY3Rpb24qYSh0LG4pe2lmKHZvaWQgMD09PW4pZm9yKGxldCBuIG9mIHQpbnVsbCE9biYmKG49K24pPj1uJiYoeWllbGQgbik7ZWxzZXtsZXQgZT0tMTtmb3IobGV0IHIgb2YgdCludWxsIT0ocj1uKHIsKytlLHQpKSYmKHI9K3IpPj1yJiYoeWllbGQgcil9fWNvbnN0IHU9cihuKSxjPXUucmlnaHQsZj11LmxlZnQscz1yKG8pLmNlbnRlcjt2YXIgbD1jO2NvbnN0IGg9cCh2KSxkPXAoKGZ1bmN0aW9uKHQpe2NvbnN0IG49dih0KTtyZXR1cm4odCxlLHIsaSxvKT0+e24odCxlLChyPDw9MikrMCwoaTw8PTIpKzAsbzw8PTIpLG4odCxlLHIrMSxpKzEsbyksbih0LGUscisyLGkrMixvKSxuKHQsZSxyKzMsaSszLG8pfX0pKTtmdW5jdGlvbiBwKHQpe3JldHVybiBmdW5jdGlvbihuLGUscj1lKXtpZighKChlPStlKT49MCkpdGhyb3cgbmV3IFJhbmdlRXJyb3IoImludmFsaWQgcngiKTtpZighKChyPStyKT49MCkpdGhyb3cgbmV3IFJhbmdlRXJyb3IoImludmFsaWQgcnkiKTtsZXR7ZGF0YTppLHdpZHRoOm8saGVpZ2h0OmF9PW47aWYoISgobz1NYXRoLmZsb29yKG8pKT49MCkpdGhyb3cgbmV3IFJhbmdlRXJyb3IoImludmFsaWQgd2lkdGgiKTtpZighKChhPU1hdGguZmxvb3Iodm9pZCAwIT09YT9hOmkubGVuZ3RoL28pKT49MCkpdGhyb3cgbmV3IFJhbmdlRXJyb3IoImludmFsaWQgaGVpZ2h0Iik7aWYoIW98fCFhfHwhZSYmIXIpcmV0dXJuIG47Y29uc3QgdT1lJiZ0KGUpLGM9ciYmdChyKSxmPWkuc2xpY2UoKTtyZXR1cm4gdSYmYz8oZyh1LGYsaSxvLGEpLGcodSxpLGYsbyxhKSxnKHUsZixpLG8sYSkseShjLGksZixvLGEpLHkoYyxmLGksbyxhKSx5KGMsaSxmLG8sYSkpOnU/KGcodSxpLGYsbyxhKSxnKHUsZixpLG8sYSksZyh1LGksZixvLGEpKTpjJiYoeShjLGksZixvLGEpLHkoYyxmLGksbyxhKSx5KGMsaSxmLG8sYSkpLG59fWZ1bmN0aW9uIGcodCxuLGUscixpKXtmb3IobGV0IG89MCxhPXIqaTtvPGE7KXQobixlLG8sbys9ciwxKX1mdW5jdGlvbiB5KHQsbixlLHIsaSl7Zm9yKGxldCBvPTAsYT1yKmk7bzxyOysrbyl0KG4sZSxvLG8rYSxyKX1mdW5jdGlvbiB2KHQpe2NvbnN0IG49TWF0aC5mbG9vcih0KTtpZihuPT09dClyZXR1cm4gZnVuY3Rpb24odCl7Y29uc3Qgbj0yKnQrMTtyZXR1cm4oZSxyLGksbyxhKT0+e2lmKCEoKG8tPWEpPj1pKSlyZXR1cm47bGV0IHU9dCpyW2ldO2NvbnN0IGM9YSp0O2ZvcihsZXQgdD1pLG49aStjO3Q8bjt0Kz1hKXUrPXJbTWF0aC5taW4obyx0KV07Zm9yKGxldCB0PWksZj1vO3Q8PWY7dCs9YSl1Kz1yW01hdGgubWluKG8sdCtjKV0sZVt0XT11L24sdS09cltNYXRoLm1heChpLHQtYyldfX0odCk7Y29uc3QgZT10LW4scj0yKnQrMTtyZXR1cm4odCxpLG8sYSx1KT0+e2lmKCEoKGEtPXUpPj1vKSlyZXR1cm47bGV0IGM9bippW29dO2NvbnN0IGY9dSpuLHM9Zit1O2ZvcihsZXQgdD1vLG49bytmO3Q8bjt0Kz11KWMrPWlbTWF0aC5taW4oYSx0KV07Zm9yKGxldCBuPW8sbD1hO248PWw7bis9dSljKz1pW01hdGgubWluKGEsbitmKV0sdFtuXT0oYytlKihpW01hdGgubWF4KG8sbi1zKV0raVtNYXRoLm1pbihhLG4rcyldKSkvcixjLT1pW01hdGgubWF4KG8sbi1mKV19fWZ1bmN0aW9uIF8odCxuKXtsZXQgZT0wO2lmKHZvaWQgMD09PW4pZm9yKGxldCBuIG9mIHQpbnVsbCE9biYmKG49K24pPj1uJiYrK2U7ZWxzZXtsZXQgcj0tMTtmb3IobGV0IGkgb2YgdCludWxsIT0oaT1uKGksKytyLHQpKSYmKGk9K2kpPj1pJiYrK2V9cmV0dXJuIGV9ZnVuY3Rpb24gYih0KXtyZXR1cm4gMHx0Lmxlbmd0aH1mdW5jdGlvbiBtKHQpe3JldHVybiEodD4wKX1mdW5jdGlvbiB4KHQpe3JldHVybiJvYmplY3QiIT10eXBlb2YgdHx8Imxlbmd0aCJpbiB0P3Q6QXJyYXkuZnJvbSh0KX1mdW5jdGlvbiB3KHQsbil7bGV0IGUscj0wLGk9MCxvPTA7aWYodm9pZCAwPT09bilmb3IobGV0IG4gb2YgdCludWxsIT1uJiYobj0rbik+PW4mJihlPW4taSxpKz1lLysrcixvKz1lKihuLWkpKTtlbHNle2xldCBhPS0xO2ZvcihsZXQgdSBvZiB0KW51bGwhPSh1PW4odSwrK2EsdCkpJiYodT0rdSk+PXUmJihlPXUtaSxpKz1lLysrcixvKz1lKih1LWkpKX1pZihyPjEpcmV0dXJuIG8vKHItMSl9ZnVuY3Rpb24gTSh0LG4pe2NvbnN0IGU9dyh0LG4pO3JldHVybiBlP01hdGguc3FydChlKTplfWZ1bmN0aW9uIFQodCxuKXtsZXQgZSxyO2lmKHZvaWQgMD09PW4pZm9yKGNvbnN0IG4gb2YgdCludWxsIT1uJiYodm9pZCAwPT09ZT9uPj1uJiYoZT1yPW4pOihlPm4mJihlPW4pLHI8biYmKHI9bikpKTtlbHNle2xldCBpPS0xO2ZvcihsZXQgbyBvZiB0KW51bGwhPShvPW4obywrK2ksdCkpJiYodm9pZCAwPT09ZT9vPj1vJiYoZT1yPW8pOihlPm8mJihlPW8pLHI8byYmKHI9bykpKX1yZXR1cm5bZSxyXX1jbGFzcyBBe2NvbnN0cnVjdG9yKCl7dGhpcy5fcGFydGlhbHM9bmV3IEZsb2F0NjRBcnJheSgzMiksdGhpcy5fbj0wfWFkZCh0KXtjb25zdCBuPXRoaXMuX3BhcnRpYWxzO2xldCBlPTA7Zm9yKGxldCByPTA7cjx0aGlzLl9uJiZyPDMyO3IrKyl7Y29uc3QgaT1uW3JdLG89dCtpLGE9TWF0aC5hYnModCk8TWF0aC5hYnMoaSk/dC0oby1pKTppLShvLXQpO2EmJihuW2UrK109YSksdD1vfXJldHVybiBuW2VdPXQsdGhpcy5fbj1lKzEsdGhpc312YWx1ZU9mKCl7Y29uc3QgdD10aGlzLl9wYXJ0aWFscztsZXQgbixlLHIsaT10aGlzLl9uLG89MDtpZihpPjApe2ZvcihvPXRbLS1pXTtpPjAmJihuPW8sZT10Wy0taV0sbz1uK2Uscj1lLShvLW4pLCFyKTspO2k+MCYmKHI8MCYmdFtpLTFdPDB8fHI+MCYmdFtpLTFdPjApJiYoZT0yKnIsbj1vK2UsZT09bi1vJiYobz1uKSl9cmV0dXJuIG99fWNsYXNzIEludGVybk1hcCBleHRlbmRzIE1hcHtjb25zdHJ1Y3Rvcih0LG49ayl7aWYoc3VwZXIoKSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0aGlzLHtfaW50ZXJuOnt2YWx1ZTpuZXcgTWFwfSxfa2V5Ont2YWx1ZTpufX0pLG51bGwhPXQpZm9yKGNvbnN0W24sZV1vZiB0KXRoaXMuc2V0KG4sZSl9Z2V0KHQpe3JldHVybiBzdXBlci5nZXQoUyh0aGlzLHQpKX1oYXModCl7cmV0dXJuIHN1cGVyLmhhcyhTKHRoaXMsdCkpfXNldCh0LG4pe3JldHVybiBzdXBlci5zZXQoRSh0aGlzLHQpLG4pfWRlbGV0ZSh0KXtyZXR1cm4gc3VwZXIuZGVsZXRlKE4odGhpcyx0KSl9fWNsYXNzIEludGVyblNldCBleHRlbmRzIFNldHtjb25zdHJ1Y3Rvcih0LG49ayl7aWYoc3VwZXIoKSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0aGlzLHtfaW50ZXJuOnt2YWx1ZTpuZXcgTWFwfSxfa2V5Ont2YWx1ZTpufX0pLG51bGwhPXQpZm9yKGNvbnN0IG4gb2YgdCl0aGlzLmFkZChuKX1oYXModCl7cmV0dXJuIHN1cGVyLmhhcyhTKHRoaXMsdCkpfWFkZCh0KXtyZXR1cm4gc3VwZXIuYWRkKEUodGhpcyx0KSl9ZGVsZXRlKHQpe3JldHVybiBzdXBlci5kZWxldGUoTih0aGlzLHQpKX19ZnVuY3Rpb24gUyh7X2ludGVybjp0LF9rZXk6bn0sZSl7Y29uc3Qgcj1uKGUpO3JldHVybiB0LmhhcyhyKT90LmdldChyKTplfWZ1bmN0aW9uIEUoe19pbnRlcm46dCxfa2V5Om59LGUpe2NvbnN0IHI9bihlKTtyZXR1cm4gdC5oYXMocik/dC5nZXQocik6KHQuc2V0KHIsZSksZSl9ZnVuY3Rpb24gTih7X2ludGVybjp0LF9rZXk6bn0sZSl7Y29uc3Qgcj1uKGUpO3JldHVybiB0LmhhcyhyKSYmKGU9dC5nZXQociksdC5kZWxldGUocikpLGV9ZnVuY3Rpb24gayh0KXtyZXR1cm4gbnVsbCE9PXQmJiJvYmplY3QiPT10eXBlb2YgdD90LnZhbHVlT2YoKTp0fWZ1bmN0aW9uIEModCl7cmV0dXJuIHR9ZnVuY3Rpb24gUCh0LC4uLm4pe3JldHVybiBxKHQsQyxDLG4pfWZ1bmN0aW9uIHoodCwuLi5uKXtyZXR1cm4gcSh0LEFycmF5LmZyb20sQyxuKX1mdW5jdGlvbiAkKHQsbil7Zm9yKGxldCBlPTEscj1uLmxlbmd0aDtlPHI7KytlKXQ9dC5mbGF0TWFwKCh0PT50LnBvcCgpLm1hcCgoKFtuLGVdKT0+Wy4uLnQsbixlXSkpKSk7cmV0dXJuIHR9ZnVuY3Rpb24gRCh0LG4sLi4uZSl7cmV0dXJuIHEodCxDLG4sZSl9ZnVuY3Rpb24gUih0LG4sLi4uZSl7cmV0dXJuIHEodCxBcnJheS5mcm9tLG4sZSl9ZnVuY3Rpb24gRih0KXtpZigxIT09dC5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJkdXBsaWNhdGUga2V5Iik7cmV0dXJuIHRbMF19ZnVuY3Rpb24gcSh0LG4sZSxyKXtyZXR1cm4gZnVuY3Rpb24gdChpLG8pe2lmKG8+PXIubGVuZ3RoKXJldHVybiBlKGkpO2NvbnN0IGE9bmV3IEludGVybk1hcCx1PXJbbysrXTtsZXQgYz0tMTtmb3IoY29uc3QgdCBvZiBpKXtjb25zdCBuPXUodCwrK2MsaSksZT1hLmdldChuKTtlP2UucHVzaCh0KTphLnNldChuLFt0XSl9Zm9yKGNvbnN0W24sZV1vZiBhKWEuc2V0KG4sdChlLG8pKTtyZXR1cm4gbihhKX0odCwwKX1mdW5jdGlvbiBVKHQsbil7cmV0dXJuIEFycmF5LmZyb20obiwobj0+dFtuXSkpfWZ1bmN0aW9uIEkodCwuLi5uKXtpZigiZnVuY3Rpb24iIT10eXBlb2YgdFtTeW1ib2wuaXRlcmF0b3JdKXRocm93IG5ldyBUeXBlRXJyb3IoInZhbHVlcyBpcyBub3QgaXRlcmFibGUiKTt0PUFycmF5LmZyb20odCk7bGV0W2VdPW47aWYoZSYmMiE9PWUubGVuZ3RofHxuLmxlbmd0aD4xKXtjb25zdCByPVVpbnQzMkFycmF5LmZyb20odCwoKHQsbik9Pm4pKTtyZXR1cm4gbi5sZW5ndGg+MT8obj1uLm1hcCgobj0+dC5tYXAobikpKSxyLnNvcnQoKCh0LGUpPT57Zm9yKGNvbnN0IHIgb2Ygbil7Y29uc3Qgbj1CKHJbdF0scltlXSk7aWYobilyZXR1cm4gbn19KSkpOihlPXQubWFwKGUpLHIuc29ydCgoKHQsbik9PkIoZVt0XSxlW25dKSkpKSxVKHQscil9cmV0dXJuIHQuc29ydChPKGUpKX1mdW5jdGlvbiBPKHQ9bil7aWYodD09PW4pcmV0dXJuIEI7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHQpdGhyb3cgbmV3IFR5cGVFcnJvcigiY29tcGFyZSBpcyBub3QgYSBmdW5jdGlvbiIpO3JldHVybihuLGUpPT57Y29uc3Qgcj10KG4sZSk7cmV0dXJuIHJ8fDA9PT1yP3I6KDA9PT10KGUsZSkpLSgwPT09dChuLG4pKX19ZnVuY3Rpb24gQih0LG4pe3JldHVybihudWxsPT10fHwhKHQ+PXQpKS0obnVsbD09bnx8IShuPj1uKSl8fCh0PG4/LTE6dD5uPzE6MCl9dmFyIFk9QXJyYXkucHJvdG90eXBlLnNsaWNlO2Z1bmN0aW9uIEwodCl7cmV0dXJuKCk9PnR9Y29uc3Qgaj1NYXRoLnNxcnQoNTApLEg9TWF0aC5zcXJ0KDEwKSxYPU1hdGguc3FydCgyKTtmdW5jdGlvbiBHKHQsbixlKXtjb25zdCByPShuLXQpL01hdGgubWF4KDAsZSksaT1NYXRoLmZsb29yKE1hdGgubG9nMTAocikpLG89ci9NYXRoLnBvdygxMCxpKSxhPW8+PWo/MTA6bz49SD81Om8+PVg/MjoxO2xldCB1LGMsZjtyZXR1cm4gaTwwPyhmPU1hdGgucG93KDEwLC1pKS9hLHU9TWF0aC5yb3VuZCh0KmYpLGM9TWF0aC5yb3VuZChuKmYpLHUvZjx0JiYrK3UsYy9mPm4mJi0tYyxmPS1mKTooZj1NYXRoLnBvdygxMCxpKSphLHU9TWF0aC5yb3VuZCh0L2YpLGM9TWF0aC5yb3VuZChuL2YpLHUqZjx0JiYrK3UsYypmPm4mJi0tYyksYzx1JiYuNTw9ZSYmZTwyP0codCxuLDIqZSk6W3UsYyxmXX1mdW5jdGlvbiBWKHQsbixlKXtpZighKChlPStlKT4wKSlyZXR1cm5bXTtpZigodD0rdCk9PT0obj0rbikpcmV0dXJuW3RdO2NvbnN0IHI9bjx0LFtpLG8sYV09cj9HKG4sdCxlKTpHKHQsbixlKTtpZighKG8+PWkpKXJldHVybltdO2NvbnN0IHU9by1pKzEsYz1uZXcgQXJyYXkodSk7aWYocilpZihhPDApZm9yKGxldCB0PTA7dDx1OysrdCljW3RdPShvLXQpLy1hO2Vsc2UgZm9yKGxldCB0PTA7dDx1OysrdCljW3RdPShvLXQpKmE7ZWxzZSBpZihhPDApZm9yKGxldCB0PTA7dDx1OysrdCljW3RdPShpK3QpLy1hO2Vsc2UgZm9yKGxldCB0PTA7dDx1OysrdCljW3RdPShpK3QpKmE7cmV0dXJuIGN9ZnVuY3Rpb24gVyh0LG4sZSl7cmV0dXJuIEcodD0rdCxuPStuLGU9K2UpWzJdfWZ1bmN0aW9uIFoodCxuLGUpe2U9K2U7Y29uc3Qgcj0obj0rbik8KHQ9K3QpLGk9cj9XKG4sdCxlKTpXKHQsbixlKTtyZXR1cm4ocj8tMToxKSooaTwwPzEvLWk6aSl9ZnVuY3Rpb24gSyh0LG4sZSl7bGV0IHI7Zm9yKDs7KXtjb25zdCBpPVcodCxuLGUpO2lmKGk9PT1yfHwwPT09aXx8IWlzRmluaXRlKGkpKXJldHVyblt0LG5dO2k+MD8odD1NYXRoLmZsb29yKHQvaSkqaSxuPU1hdGguY2VpbChuL2kpKmkpOmk8MCYmKHQ9TWF0aC5jZWlsKHQqaSkvaSxuPU1hdGguZmxvb3IobippKS9pKSxyPWl9fWZ1bmN0aW9uIFEodCl7cmV0dXJuIE1hdGgubWF4KDEsTWF0aC5jZWlsKE1hdGgubG9nKF8odCkpL01hdGguTE4yKSsxKX1mdW5jdGlvbiBKKCl7dmFyIHQ9QyxuPVQsZT1RO2Z1bmN0aW9uIHIocil7QXJyYXkuaXNBcnJheShyKXx8KHI9QXJyYXkuZnJvbShyKSk7dmFyIGksbyxhLHU9ci5sZW5ndGgsYz1uZXcgQXJyYXkodSk7Zm9yKGk9MDtpPHU7KytpKWNbaV09dChyW2ldLGkscik7dmFyIGY9bihjKSxzPWZbMF0saD1mWzFdLGQ9ZShjLHMsaCk7aWYoIUFycmF5LmlzQXJyYXkoZCkpe2NvbnN0IHQ9aCxlPStkO2lmKG49PT1UJiYoW3MsaF09SyhzLGgsZSkpLChkPVYocyxoLGUpKVswXTw9cyYmKGE9VyhzLGgsZSkpLGRbZC5sZW5ndGgtMV0+PWgpaWYodD49aCYmbj09PVQpe2NvbnN0IHQ9VyhzLGgsZSk7aXNGaW5pdGUodCkmJih0PjA/aD0oTWF0aC5mbG9vcihoL3QpKzEpKnQ6dDwwJiYoaD0oTWF0aC5jZWlsKGgqLXQpKzEpLy10KSl9ZWxzZSBkLnBvcCgpfWZvcih2YXIgcD1kLmxlbmd0aCxnPTAseT1wO2RbZ108PXM7KSsrZztmb3IoO2RbeS0xXT5oOyktLXk7KGd8fHk8cCkmJihkPWQuc2xpY2UoZyx5KSxwPXktZyk7dmFyIHYsXz1uZXcgQXJyYXkocCsxKTtmb3IoaT0wO2k8PXA7KytpKSh2PV9baV09W10pLngwPWk+MD9kW2ktMV06cyx2LngxPWk8cD9kW2ldOmg7aWYoaXNGaW5pdGUoYSkpe2lmKGE+MClmb3IoaT0wO2k8dTsrK2kpbnVsbCE9KG89Y1tpXSkmJnM8PW8mJm88PWgmJl9bTWF0aC5taW4ocCxNYXRoLmZsb29yKChvLXMpL2EpKV0ucHVzaChyW2ldKTtlbHNlIGlmKGE8MClmb3IoaT0wO2k8dTsrK2kpaWYobnVsbCE9KG89Y1tpXSkmJnM8PW8mJm88PWgpe2NvbnN0IHQ9TWF0aC5mbG9vcigocy1vKSphKTtfW01hdGgubWluKHAsdCsoZFt0XTw9bykpXS5wdXNoKHJbaV0pfX1lbHNlIGZvcihpPTA7aTx1OysraSludWxsIT0obz1jW2ldKSYmczw9byYmbzw9aCYmX1tsKGQsbywwLHApXS5wdXNoKHJbaV0pO3JldHVybiBffXJldHVybiByLnZhbHVlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PSJmdW5jdGlvbiI9PXR5cGVvZiBuP246TChuKSxyKTp0fSxyLmRvbWFpbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj0iZnVuY3Rpb24iPT10eXBlb2YgdD90OkwoW3RbMF0sdFsxXV0pLHIpOm59LHIudGhyZXNob2xkcz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT0iZnVuY3Rpb24iPT10eXBlb2YgdD90OkwoQXJyYXkuaXNBcnJheSh0KT9ZLmNhbGwodCk6dCkscik6ZX0scn1mdW5jdGlvbiB0dCh0LG4pe2xldCBlO2lmKHZvaWQgMD09PW4pZm9yKGNvbnN0IG4gb2YgdCludWxsIT1uJiYoZTxufHx2b2lkIDA9PT1lJiZuPj1uKSYmKGU9bik7ZWxzZXtsZXQgcj0tMTtmb3IobGV0IGkgb2YgdCludWxsIT0oaT1uKGksKytyLHQpKSYmKGU8aXx8dm9pZCAwPT09ZSYmaT49aSkmJihlPWkpfXJldHVybiBlfWZ1bmN0aW9uIG50KHQsbil7bGV0IGUscj0tMSxpPS0xO2lmKHZvaWQgMD09PW4pZm9yKGNvbnN0IG4gb2YgdCkrK2ksbnVsbCE9biYmKGU8bnx8dm9pZCAwPT09ZSYmbj49bikmJihlPW4scj1pKTtlbHNlIGZvcihsZXQgbyBvZiB0KW51bGwhPShvPW4obywrK2ksdCkpJiYoZTxvfHx2b2lkIDA9PT1lJiZvPj1vKSYmKGU9byxyPWkpO3JldHVybiByfWZ1bmN0aW9uIGV0KHQsbil7bGV0IGU7aWYodm9pZCAwPT09bilmb3IoY29uc3QgbiBvZiB0KW51bGwhPW4mJihlPm58fHZvaWQgMD09PWUmJm4+PW4pJiYoZT1uKTtlbHNle2xldCByPS0xO2ZvcihsZXQgaSBvZiB0KW51bGwhPShpPW4oaSwrK3IsdCkpJiYoZT5pfHx2b2lkIDA9PT1lJiZpPj1pKSYmKGU9aSl9cmV0dXJuIGV9ZnVuY3Rpb24gcnQodCxuKXtsZXQgZSxyPS0xLGk9LTE7aWYodm9pZCAwPT09bilmb3IoY29uc3QgbiBvZiB0KSsraSxudWxsIT1uJiYoZT5ufHx2b2lkIDA9PT1lJiZuPj1uKSYmKGU9bixyPWkpO2Vsc2UgZm9yKGxldCBvIG9mIHQpbnVsbCE9KG89bihvLCsraSx0KSkmJihlPm98fHZvaWQgMD09PWUmJm8+PW8pJiYoZT1vLHI9aSk7cmV0dXJuIHJ9ZnVuY3Rpb24gaXQodCxuLGU9MCxyPTEvMCxpKXtpZihuPU1hdGguZmxvb3IobiksZT1NYXRoLmZsb29yKE1hdGgubWF4KDAsZSkpLHI9TWF0aC5mbG9vcihNYXRoLm1pbih0Lmxlbmd0aC0xLHIpKSwhKGU8PW4mJm48PXIpKXJldHVybiB0O2ZvcihpPXZvaWQgMD09PWk/QjpPKGkpO3I+ZTspe2lmKHItZT42MDApe2NvbnN0IG89ci1lKzEsYT1uLWUrMSx1PU1hdGgubG9nKG8pLGM9LjUqTWF0aC5leHAoMip1LzMpLGY9LjUqTWF0aC5zcXJ0KHUqYyooby1jKS9vKSooYS1vLzI8MD8tMToxKTtpdCh0LG4sTWF0aC5tYXgoZSxNYXRoLmZsb29yKG4tYSpjL28rZikpLE1hdGgubWluKHIsTWF0aC5mbG9vcihuKyhvLWEpKmMvbytmKSksaSl9Y29uc3Qgbz10W25dO2xldCBhPWUsdT1yO2ZvcihvdCh0LGUsbiksaSh0W3JdLG8pPjAmJm90KHQsZSxyKTthPHU7KXtmb3Iob3QodCxhLHUpLCsrYSwtLXU7aSh0W2FdLG8pPDA7KSsrYTtmb3IoO2kodFt1XSxvKT4wOyktLXV9MD09PWkodFtlXSxvKT9vdCh0LGUsdSk6KCsrdSxvdCh0LHUscikpLHU8PW4mJihlPXUrMSksbjw9dSYmKHI9dS0xKX1yZXR1cm4gdH1mdW5jdGlvbiBvdCh0LG4sZSl7Y29uc3Qgcj10W25dO3Rbbl09dFtlXSx0W2VdPXJ9ZnVuY3Rpb24gYXQodCxlPW4pe2xldCByLGk9ITE7aWYoMT09PWUubGVuZ3RoKXtsZXQgbztmb3IoY29uc3QgYSBvZiB0KXtjb25zdCB0PWUoYSk7KGk/bih0LG8pPjA6MD09PW4odCx0KSkmJihyPWEsbz10LGk9ITApfX1lbHNlIGZvcihjb25zdCBuIG9mIHQpKGk/ZShuLHIpPjA6MD09PWUobixuKSkmJihyPW4saT0hMCk7cmV0dXJuIHJ9ZnVuY3Rpb24gdXQodCxuLGUpe2lmKChyPSh0PUZsb2F0NjRBcnJheS5mcm9tKGEodCxlKSkpLmxlbmd0aCkmJiFpc05hTihuPStuKSl7aWYobjw9MHx8cjwyKXJldHVybiBldCh0KTtpZihuPj0xKXJldHVybiB0dCh0KTt2YXIgcixpPShyLTEpKm4sbz1NYXRoLmZsb29yKGkpLHU9dHQoaXQodCxvKS5zdWJhcnJheSgwLG8rMSkpO3JldHVybiB1KyhldCh0LnN1YmFycmF5KG8rMSkpLXUpKihpLW8pfX1mdW5jdGlvbiBjdCh0LG4sZT1vKXtpZigocj10Lmxlbmd0aCkmJiFpc05hTihuPStuKSl7aWYobjw9MHx8cjwyKXJldHVybitlKHRbMF0sMCx0KTtpZihuPj0xKXJldHVybitlKHRbci0xXSxyLTEsdCk7dmFyIHIsaT0oci0xKSpuLGE9TWF0aC5mbG9vcihpKSx1PStlKHRbYV0sYSx0KTtyZXR1cm4gdSsoK2UodFthKzFdLGErMSx0KS11KSooaS1hKX19ZnVuY3Rpb24gZnQodCxuLGUpe2lmKChyPSh0PUZsb2F0NjRBcnJheS5mcm9tKGEodCxlKSkpLmxlbmd0aCkmJiFpc05hTihuPStuKSl7aWYobjw9MHx8cjwyKXJldHVybiBydCh0KTtpZihuPj0xKXJldHVybiBudCh0KTt2YXIgcixpPU1hdGguZmxvb3IoKHItMSkqbiksbz1pdChVaW50MzJBcnJheS5mcm9tKHQsKCh0LG4pPT5uKSksaSwwLHItMSwoKG4sZSk9PkIodFtuXSx0W2VdKSkpO3JldHVybiBhdChvLnN1YmFycmF5KDAsaSsxKSwobj0+dFtuXSkpfX1mdW5jdGlvbiBzdCh0KXtyZXR1cm4gQXJyYXkuZnJvbShmdW5jdGlvbioodCl7Zm9yKGNvbnN0IG4gb2YgdCl5aWVsZCpufSh0KSl9ZnVuY3Rpb24gbHQodCxuKXtyZXR1cm5bdCxuXX1mdW5jdGlvbiBodCh0LG4sZSl7dD0rdCxuPStuLGU9KGk9YXJndW1lbnRzLmxlbmd0aCk8Mj8obj10LHQ9MCwxKTppPDM/MTorZTtmb3IodmFyIHI9LTEsaT0wfE1hdGgubWF4KDAsTWF0aC5jZWlsKChuLXQpL2UpKSxvPW5ldyBBcnJheShpKTsrK3I8aTspb1tyXT10K3IqZTtyZXR1cm4gb31mdW5jdGlvbiBkdCh0LGU9bil7aWYoMT09PWUubGVuZ3RoKXJldHVybiBydCh0LGUpO2xldCByLGk9LTEsbz0tMTtmb3IoY29uc3QgbiBvZiB0KSsrbywoaTwwPzA9PT1lKG4sbik6ZShuLHIpPDApJiYocj1uLGk9byk7cmV0dXJuIGl9dmFyIHB0PWd0KE1hdGgucmFuZG9tKTtmdW5jdGlvbiBndCh0KXtyZXR1cm4gZnVuY3Rpb24obixlPTAscj1uLmxlbmd0aCl7bGV0IGk9ci0oZT0rZSk7Zm9yKDtpOyl7Y29uc3Qgcj10KCkqaS0tfDAsbz1uW2krZV07bltpK2VdPW5bcitlXSxuW3IrZV09b31yZXR1cm4gbn19ZnVuY3Rpb24geXQodCl7aWYoIShpPXQubGVuZ3RoKSlyZXR1cm5bXTtmb3IodmFyIG49LTEsZT1ldCh0LHZ0KSxyPW5ldyBBcnJheShlKTsrK248ZTspZm9yKHZhciBpLG89LTEsYT1yW25dPW5ldyBBcnJheShpKTsrK288aTspYVtvXT10W29dW25dO3JldHVybiByfWZ1bmN0aW9uIHZ0KHQpe3JldHVybiB0Lmxlbmd0aH1mdW5jdGlvbiBfdCh0KXtyZXR1cm4gdCBpbnN0YW5jZW9mIEludGVyblNldD90Om5ldyBJbnRlcm5TZXQodCl9ZnVuY3Rpb24gYnQodCxuKXtjb25zdCBlPXRbU3ltYm9sLml0ZXJhdG9yXSgpLHI9bmV3IFNldDtmb3IoY29uc3QgdCBvZiBuKXtjb25zdCBuPW10KHQpO2lmKHIuaGFzKG4pKWNvbnRpbnVlO2xldCBpLG87Zm9yKDsoe3ZhbHVlOmksZG9uZTpvfT1lLm5leHQoKSk7KXtpZihvKXJldHVybiExO2NvbnN0IHQ9bXQoaSk7aWYoci5hZGQodCksT2JqZWN0LmlzKG4sdCkpYnJlYWt9fXJldHVybiEwfWZ1bmN0aW9uIG10KHQpe3JldHVybiBudWxsIT09dCYmIm9iamVjdCI9PXR5cGVvZiB0P3QudmFsdWVPZigpOnR9ZnVuY3Rpb24geHQodCl7cmV0dXJuIHR9dmFyIHd0PTEsTXQ9MixUdD0zLEF0PTQsU3Q9MWUtNjtmdW5jdGlvbiBFdCh0KXtyZXR1cm4idHJhbnNsYXRlKCIrdCsiLDApIn1mdW5jdGlvbiBOdCh0KXtyZXR1cm4idHJhbnNsYXRlKDAsIit0KyIpIn1mdW5jdGlvbiBrdCh0KXtyZXR1cm4gbj0+K3Qobil9ZnVuY3Rpb24gQ3QodCxuKXtyZXR1cm4gbj1NYXRoLm1heCgwLHQuYmFuZHdpZHRoKCktMipuKS8yLHQucm91bmQoKSYmKG49TWF0aC5yb3VuZChuKSksZT0+K3QoZSkrbn1mdW5jdGlvbiBQdCgpe3JldHVybiF0aGlzLl9fYXhpc31mdW5jdGlvbiB6dCh0LG4pe3ZhciBlPVtdLHI9bnVsbCxpPW51bGwsbz02LGE9Nix1PTMsYz0idW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdyYmd2luZG93LmRldmljZVBpeGVsUmF0aW8+MT8wOi41LGY9dD09PXd0fHx0PT09QXQ/LTE6MSxzPXQ9PT1BdHx8dD09PU10PyJ4IjoieSIsbD10PT09d3R8fHQ9PT1UdD9FdDpOdDtmdW5jdGlvbiBoKGgpe3ZhciBkPW51bGw9PXI/bi50aWNrcz9uLnRpY2tzLmFwcGx5KG4sZSk6bi5kb21haW4oKTpyLHA9bnVsbD09aT9uLnRpY2tGb3JtYXQ/bi50aWNrRm9ybWF0LmFwcGx5KG4sZSk6eHQ6aSxnPU1hdGgubWF4KG8sMCkrdSx5PW4ucmFuZ2UoKSx2PSt5WzBdK2MsXz0reVt5Lmxlbmd0aC0xXStjLGI9KG4uYmFuZHdpZHRoP0N0Omt0KShuLmNvcHkoKSxjKSxtPWguc2VsZWN0aW9uP2guc2VsZWN0aW9uKCk6aCx4PW0uc2VsZWN0QWxsKCIuZG9tYWluIikuZGF0YShbbnVsbF0pLHc9bS5zZWxlY3RBbGwoIi50aWNrIikuZGF0YShkLG4pLm9yZGVyKCksTT13LmV4aXQoKSxUPXcuZW50ZXIoKS5hcHBlbmQoImciKS5hdHRyKCJjbGFzcyIsInRpY2siKSxBPXcuc2VsZWN0KCJsaW5lIiksUz13LnNlbGVjdCgidGV4dCIpO3g9eC5tZXJnZSh4LmVudGVyKCkuaW5zZXJ0KCJwYXRoIiwiLnRpY2siKS5hdHRyKCJjbGFzcyIsImRvbWFpbiIpLmF0dHIoInN0cm9rZSIsImN1cnJlbnRDb2xvciIpKSx3PXcubWVyZ2UoVCksQT1BLm1lcmdlKFQuYXBwZW5kKCJsaW5lIikuYXR0cigic3Ryb2tlIiwiY3VycmVudENvbG9yIikuYXR0cihzKyIyIixmKm8pKSxTPVMubWVyZ2UoVC5hcHBlbmQoInRleHQiKS5hdHRyKCJmaWxsIiwiY3VycmVudENvbG9yIikuYXR0cihzLGYqZykuYXR0cigiZHkiLHQ9PT13dD8iMGVtIjp0PT09VHQ/IjAuNzFlbSI6IjAuMzJlbSIpKSxoIT09bSYmKHg9eC50cmFuc2l0aW9uKGgpLHc9dy50cmFuc2l0aW9uKGgpLEE9QS50cmFuc2l0aW9uKGgpLFM9Uy50cmFuc2l0aW9uKGgpLE09TS50cmFuc2l0aW9uKGgpLmF0dHIoIm9wYWNpdHkiLFN0KS5hdHRyKCJ0cmFuc2Zvcm0iLChmdW5jdGlvbih0KXtyZXR1cm4gaXNGaW5pdGUodD1iKHQpKT9sKHQrYyk6dGhpcy5nZXRBdHRyaWJ1dGUoInRyYW5zZm9ybSIpfSkpLFQuYXR0cigib3BhY2l0eSIsU3QpLmF0dHIoInRyYW5zZm9ybSIsKGZ1bmN0aW9uKHQpe3ZhciBuPXRoaXMucGFyZW50Tm9kZS5fX2F4aXM7cmV0dXJuIGwoKG4mJmlzRmluaXRlKG49bih0KSk/bjpiKHQpKStjKX0pKSksTS5yZW1vdmUoKSx4LmF0dHIoImQiLHQ9PT1BdHx8dD09PU10P2E/Ik0iK2YqYSsiLCIrdisiSCIrYysiViIrXysiSCIrZiphOiJNIitjKyIsIit2KyJWIitfOmE/Ik0iK3YrIiwiK2YqYSsiViIrYysiSCIrXysiViIrZiphOiJNIit2KyIsIitjKyJIIitfKSx3LmF0dHIoIm9wYWNpdHkiLDEpLmF0dHIoInRyYW5zZm9ybSIsKGZ1bmN0aW9uKHQpe3JldHVybiBsKGIodCkrYyl9KSksQS5hdHRyKHMrIjIiLGYqbyksUy5hdHRyKHMsZipnKS50ZXh0KHApLG0uZmlsdGVyKFB0KS5hdHRyKCJmaWxsIiwibm9uZSIpLmF0dHIoImZvbnQtc2l6ZSIsMTApLmF0dHIoImZvbnQtZmFtaWx5Iiwic2Fucy1zZXJpZiIpLmF0dHIoInRleHQtYW5jaG9yIix0PT09TXQ/InN0YXJ0Ijp0PT09QXQ/ImVuZCI6Im1pZGRsZSIpLG0uZWFjaCgoZnVuY3Rpb24oKXt0aGlzLl9fYXhpcz1ifSkpfXJldHVybiBoLnNjYWxlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPXQsaCk6bn0saC50aWNrcz1mdW5jdGlvbigpe3JldHVybiBlPUFycmF5LmZyb20oYXJndW1lbnRzKSxofSxoLnRpY2tBcmd1bWVudHM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9bnVsbD09dD9bXTpBcnJheS5mcm9tKHQpLGgpOmUuc2xpY2UoKX0saC50aWNrVmFsdWVzPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPW51bGw9PXQ/bnVsbDpBcnJheS5mcm9tKHQpLGgpOnImJnIuc2xpY2UoKX0saC50aWNrRm9ybWF0PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPXQsaCk6aX0saC50aWNrU2l6ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz1hPSt0LGgpOm99LGgudGlja1NpemVJbm5lcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz0rdCxoKTpvfSxoLnRpY2tTaXplT3V0ZXI9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9K3QsaCk6YX0saC50aWNrUGFkZGluZz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT0rdCxoKTp1fSxoLm9mZnNldD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYz0rdCxoKTpjfSxofXZhciAkdD17dmFsdWU6KCk9Pnt9fTtmdW5jdGlvbiBEdCgpe2Zvcih2YXIgdCxuPTAsZT1hcmd1bWVudHMubGVuZ3RoLHI9e307bjxlOysrbil7aWYoISh0PWFyZ3VtZW50c1tuXSsiIil8fHQgaW4gcnx8L1tccy5dLy50ZXN0KHQpKXRocm93IG5ldyBFcnJvcigiaWxsZWdhbCB0eXBlOiAiK3QpO3JbdF09W119cmV0dXJuIG5ldyBSdChyKX1mdW5jdGlvbiBSdCh0KXt0aGlzLl89dH1mdW5jdGlvbiBGdCh0LG4pe2Zvcih2YXIgZSxyPTAsaT10Lmxlbmd0aDtyPGk7KytyKWlmKChlPXRbcl0pLm5hbWU9PT1uKXJldHVybiBlLnZhbHVlfWZ1bmN0aW9uIHF0KHQsbixlKXtmb3IodmFyIHI9MCxpPXQubGVuZ3RoO3I8aTsrK3IpaWYodFtyXS5uYW1lPT09bil7dFtyXT0kdCx0PXQuc2xpY2UoMCxyKS5jb25jYXQodC5zbGljZShyKzEpKTticmVha31yZXR1cm4gbnVsbCE9ZSYmdC5wdXNoKHtuYW1lOm4sdmFsdWU6ZX0pLHR9UnQucHJvdG90eXBlPUR0LnByb3RvdHlwZT17Y29uc3RydWN0b3I6UnQsb246ZnVuY3Rpb24odCxuKXt2YXIgZSxyLGk9dGhpcy5fLG89KHI9aSwodCsiIikudHJpbSgpLnNwbGl0KC9efFxzKy8pLm1hcCgoZnVuY3Rpb24odCl7dmFyIG49IiIsZT10LmluZGV4T2YoIi4iKTtpZihlPj0wJiYobj10LnNsaWNlKGUrMSksdD10LnNsaWNlKDAsZSkpLHQmJiFyLmhhc093blByb3BlcnR5KHQpKXRocm93IG5ldyBFcnJvcigidW5rbm93biB0eXBlOiAiK3QpO3JldHVybnt0eXBlOnQsbmFtZTpufX0pKSksYT0tMSx1PW8ubGVuZ3RoO2lmKCEoYXJndW1lbnRzLmxlbmd0aDwyKSl7aWYobnVsbCE9biYmImZ1bmN0aW9uIiE9dHlwZW9mIG4pdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIGNhbGxiYWNrOiAiK24pO2Zvcig7KythPHU7KWlmKGU9KHQ9b1thXSkudHlwZSlpW2VdPXF0KGlbZV0sdC5uYW1lLG4pO2Vsc2UgaWYobnVsbD09bilmb3IoZSBpbiBpKWlbZV09cXQoaVtlXSx0Lm5hbWUsbnVsbCk7cmV0dXJuIHRoaXN9Zm9yKDsrK2E8dTspaWYoKGU9KHQ9b1thXSkudHlwZSkmJihlPUZ0KGlbZV0sdC5uYW1lKSkpcmV0dXJuIGV9LGNvcHk6ZnVuY3Rpb24oKXt2YXIgdD17fSxuPXRoaXMuXztmb3IodmFyIGUgaW4gbil0W2VdPW5bZV0uc2xpY2UoKTtyZXR1cm4gbmV3IFJ0KHQpfSxjYWxsOmZ1bmN0aW9uKHQsbil7aWYoKGU9YXJndW1lbnRzLmxlbmd0aC0yKT4wKWZvcih2YXIgZSxyLGk9bmV3IEFycmF5KGUpLG89MDtvPGU7KytvKWlbb109YXJndW1lbnRzW28rMl07aWYoIXRoaXMuXy5oYXNPd25Qcm9wZXJ0eSh0KSl0aHJvdyBuZXcgRXJyb3IoInVua25vd24gdHlwZTogIit0KTtmb3Iobz0wLGU9KHI9dGhpcy5fW3RdKS5sZW5ndGg7bzxlOysrbylyW29dLnZhbHVlLmFwcGx5KG4saSl9LGFwcGx5OmZ1bmN0aW9uKHQsbixlKXtpZighdGhpcy5fLmhhc093blByb3BlcnR5KHQpKXRocm93IG5ldyBFcnJvcigidW5rbm93biB0eXBlOiAiK3QpO2Zvcih2YXIgcj10aGlzLl9bdF0saT0wLG89ci5sZW5ndGg7aTxvOysraSlyW2ldLnZhbHVlLmFwcGx5KG4sZSl9fTt2YXIgVXQ9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiLEl0PXtzdmc6Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIix4aHRtbDpVdCx4bGluazoiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIseG1sOiJodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UiLHhtbG5zOiJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3htbG5zLyJ9O2Z1bmN0aW9uIE90KHQpe3ZhciBuPXQrPSIiLGU9bi5pbmRleE9mKCI6Iik7cmV0dXJuIGU+PTAmJiJ4bWxucyIhPT0obj10LnNsaWNlKDAsZSkpJiYodD10LnNsaWNlKGUrMSkpLEl0Lmhhc093blByb3BlcnR5KG4pP3tzcGFjZTpJdFtuXSxsb2NhbDp0fTp0fWZ1bmN0aW9uIEJ0KHQpe3JldHVybiBmdW5jdGlvbigpe3ZhciBuPXRoaXMub3duZXJEb2N1bWVudCxlPXRoaXMubmFtZXNwYWNlVVJJO3JldHVybiBlPT09VXQmJm4uZG9jdW1lbnRFbGVtZW50Lm5hbWVzcGFjZVVSST09PVV0P24uY3JlYXRlRWxlbWVudCh0KTpuLmNyZWF0ZUVsZW1lbnROUyhlLHQpfX1mdW5jdGlvbiBZdCh0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyh0LnNwYWNlLHQubG9jYWwpfX1mdW5jdGlvbiBMdCh0KXt2YXIgbj1PdCh0KTtyZXR1cm4obi5sb2NhbD9ZdDpCdCkobil9ZnVuY3Rpb24ganQoKXt9ZnVuY3Rpb24gSHQodCl7cmV0dXJuIG51bGw9PXQ/anQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5xdWVyeVNlbGVjdG9yKHQpfX1mdW5jdGlvbiBYdCh0KXtyZXR1cm4gbnVsbD09dD9bXTpBcnJheS5pc0FycmF5KHQpP3Q6QXJyYXkuZnJvbSh0KX1mdW5jdGlvbiBHdCgpe3JldHVybltdfWZ1bmN0aW9uIFZ0KHQpe3JldHVybiBudWxsPT10P0d0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucXVlcnlTZWxlY3RvckFsbCh0KX19ZnVuY3Rpb24gV3QodCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWF0Y2hlcyh0KX19ZnVuY3Rpb24gWnQodCl7cmV0dXJuIGZ1bmN0aW9uKG4pe3JldHVybiBuLm1hdGNoZXModCl9fXZhciBLdD1BcnJheS5wcm90b3R5cGUuZmluZDtmdW5jdGlvbiBRdCgpe3JldHVybiB0aGlzLmZpcnN0RWxlbWVudENoaWxkfXZhciBKdD1BcnJheS5wcm90b3R5cGUuZmlsdGVyO2Z1bmN0aW9uIHRuKCl7cmV0dXJuIEFycmF5LmZyb20odGhpcy5jaGlsZHJlbil9ZnVuY3Rpb24gbm4odCl7cmV0dXJuIG5ldyBBcnJheSh0Lmxlbmd0aCl9ZnVuY3Rpb24gZW4odCxuKXt0aGlzLm93bmVyRG9jdW1lbnQ9dC5vd25lckRvY3VtZW50LHRoaXMubmFtZXNwYWNlVVJJPXQubmFtZXNwYWNlVVJJLHRoaXMuX25leHQ9bnVsbCx0aGlzLl9wYXJlbnQ9dCx0aGlzLl9fZGF0YV9fPW59ZnVuY3Rpb24gcm4odCxuLGUscixpLG8pe2Zvcih2YXIgYSx1PTAsYz1uLmxlbmd0aCxmPW8ubGVuZ3RoO3U8ZjsrK3UpKGE9blt1XSk/KGEuX19kYXRhX189b1t1XSxyW3VdPWEpOmVbdV09bmV3IGVuKHQsb1t1XSk7Zm9yKDt1PGM7Kyt1KShhPW5bdV0pJiYoaVt1XT1hKX1mdW5jdGlvbiBvbih0LG4sZSxyLGksbyxhKXt2YXIgdSxjLGYscz1uZXcgTWFwLGw9bi5sZW5ndGgsaD1vLmxlbmd0aCxkPW5ldyBBcnJheShsKTtmb3IodT0wO3U8bDsrK3UpKGM9blt1XSkmJihkW3VdPWY9YS5jYWxsKGMsYy5fX2RhdGFfXyx1LG4pKyIiLHMuaGFzKGYpP2lbdV09YzpzLnNldChmLGMpKTtmb3IodT0wO3U8aDsrK3UpZj1hLmNhbGwodCxvW3VdLHUsbykrIiIsKGM9cy5nZXQoZikpPyhyW3VdPWMsYy5fX2RhdGFfXz1vW3VdLHMuZGVsZXRlKGYpKTplW3VdPW5ldyBlbih0LG9bdV0pO2Zvcih1PTA7dTxsOysrdSkoYz1uW3VdKSYmcy5nZXQoZFt1XSk9PT1jJiYoaVt1XT1jKX1mdW5jdGlvbiBhbih0KXtyZXR1cm4gdC5fX2RhdGFfX31mdW5jdGlvbiB1bih0KXtyZXR1cm4ib2JqZWN0Ij09dHlwZW9mIHQmJiJsZW5ndGgiaW4gdD90OkFycmF5LmZyb20odCl9ZnVuY3Rpb24gY24odCxuKXtyZXR1cm4gdDxuPy0xOnQ+bj8xOnQ+PW4/MDpOYU59ZnVuY3Rpb24gZm4odCl7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpcy5yZW1vdmVBdHRyaWJ1dGUodCl9fWZ1bmN0aW9uIHNuKHQpe3JldHVybiBmdW5jdGlvbigpe3RoaXMucmVtb3ZlQXR0cmlidXRlTlModC5zcGFjZSx0LmxvY2FsKX19ZnVuY3Rpb24gbG4odCxuKXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLnNldEF0dHJpYnV0ZSh0LG4pfX1mdW5jdGlvbiBobih0LG4pe3JldHVybiBmdW5jdGlvbigpe3RoaXMuc2V0QXR0cmlidXRlTlModC5zcGFjZSx0LmxvY2FsLG4pfX1mdW5jdGlvbiBkbih0LG4pe3JldHVybiBmdW5jdGlvbigpe3ZhciBlPW4uYXBwbHkodGhpcyxhcmd1bWVudHMpO251bGw9PWU/dGhpcy5yZW1vdmVBdHRyaWJ1dGUodCk6dGhpcy5zZXRBdHRyaWJ1dGUodCxlKX19ZnVuY3Rpb24gcG4odCxuKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZT1uLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtudWxsPT1lP3RoaXMucmVtb3ZlQXR0cmlidXRlTlModC5zcGFjZSx0LmxvY2FsKTp0aGlzLnNldEF0dHJpYnV0ZU5TKHQuc3BhY2UsdC5sb2NhbCxlKX19ZnVuY3Rpb24gZ24odCl7cmV0dXJuIHQub3duZXJEb2N1bWVudCYmdC5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3fHx0LmRvY3VtZW50JiZ0fHx0LmRlZmF1bHRWaWV3fWZ1bmN0aW9uIHluKHQpe3JldHVybiBmdW5jdGlvbigpe3RoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkodCl9fWZ1bmN0aW9uIHZuKHQsbixlKXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLnN0eWxlLnNldFByb3BlcnR5KHQsbixlKX19ZnVuY3Rpb24gX24odCxuLGUpe3JldHVybiBmdW5jdGlvbigpe3ZhciByPW4uYXBwbHkodGhpcyxhcmd1bWVudHMpO251bGw9PXI/dGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eSh0KTp0aGlzLnN0eWxlLnNldFByb3BlcnR5KHQscixlKX19ZnVuY3Rpb24gYm4odCxuKXtyZXR1cm4gdC5zdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKG4pfHxnbih0KS5nZXRDb21wdXRlZFN0eWxlKHQsbnVsbCkuZ2V0UHJvcGVydHlWYWx1ZShuKX1mdW5jdGlvbiBtbih0KXtyZXR1cm4gZnVuY3Rpb24oKXtkZWxldGUgdGhpc1t0XX19ZnVuY3Rpb24geG4odCxuKXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzW3RdPW59fWZ1bmN0aW9uIHduKHQsbil7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGU9bi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7bnVsbD09ZT9kZWxldGUgdGhpc1t0XTp0aGlzW3RdPWV9fWZ1bmN0aW9uIE1uKHQpe3JldHVybiB0LnRyaW0oKS5zcGxpdCgvXnxccysvKX1mdW5jdGlvbiBUbih0KXtyZXR1cm4gdC5jbGFzc0xpc3R8fG5ldyBBbih0KX1mdW5jdGlvbiBBbih0KXt0aGlzLl9ub2RlPXQsdGhpcy5fbmFtZXM9TW4odC5nZXRBdHRyaWJ1dGUoImNsYXNzIil8fCIiKX1mdW5jdGlvbiBTbih0LG4pe2Zvcih2YXIgZT1Ubih0KSxyPS0xLGk9bi5sZW5ndGg7KytyPGk7KWUuYWRkKG5bcl0pfWZ1bmN0aW9uIEVuKHQsbil7Zm9yKHZhciBlPVRuKHQpLHI9LTEsaT1uLmxlbmd0aDsrK3I8aTspZS5yZW1vdmUobltyXSl9ZnVuY3Rpb24gTm4odCl7cmV0dXJuIGZ1bmN0aW9uKCl7U24odGhpcyx0KX19ZnVuY3Rpb24ga24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7RW4odGhpcyx0KX19ZnVuY3Rpb24gQ24odCxuKXtyZXR1cm4gZnVuY3Rpb24oKXsobi5hcHBseSh0aGlzLGFyZ3VtZW50cyk/U246RW4pKHRoaXMsdCl9fWZ1bmN0aW9uIFBuKCl7dGhpcy50ZXh0Q29udGVudD0iIn1mdW5jdGlvbiB6bih0KXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLnRleHRDb250ZW50PXR9fWZ1bmN0aW9uICRuKHQpe3JldHVybiBmdW5jdGlvbigpe3ZhciBuPXQuYXBwbHkodGhpcyxhcmd1bWVudHMpO3RoaXMudGV4dENvbnRlbnQ9bnVsbD09bj8iIjpufX1mdW5jdGlvbiBEbigpe3RoaXMuaW5uZXJIVE1MPSIifWZ1bmN0aW9uIFJuKHQpe3JldHVybiBmdW5jdGlvbigpe3RoaXMuaW5uZXJIVE1MPXR9fWZ1bmN0aW9uIEZuKHQpe3JldHVybiBmdW5jdGlvbigpe3ZhciBuPXQuYXBwbHkodGhpcyxhcmd1bWVudHMpO3RoaXMuaW5uZXJIVE1MPW51bGw9PW4/IiI6bn19ZnVuY3Rpb24gcW4oKXt0aGlzLm5leHRTaWJsaW5nJiZ0aGlzLnBhcmVudE5vZGUuYXBwZW5kQ2hpbGQodGhpcyl9ZnVuY3Rpb24gVW4oKXt0aGlzLnByZXZpb3VzU2libGluZyYmdGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZSh0aGlzLHRoaXMucGFyZW50Tm9kZS5maXJzdENoaWxkKX1mdW5jdGlvbiBJbigpe3JldHVybiBudWxsfWZ1bmN0aW9uIE9uKCl7dmFyIHQ9dGhpcy5wYXJlbnROb2RlO3QmJnQucmVtb3ZlQ2hpbGQodGhpcyl9ZnVuY3Rpb24gQm4oKXt2YXIgdD10aGlzLmNsb25lTm9kZSghMSksbj10aGlzLnBhcmVudE5vZGU7cmV0dXJuIG4/bi5pbnNlcnRCZWZvcmUodCx0aGlzLm5leHRTaWJsaW5nKTp0fWZ1bmN0aW9uIFluKCl7dmFyIHQ9dGhpcy5jbG9uZU5vZGUoITApLG49dGhpcy5wYXJlbnROb2RlO3JldHVybiBuP24uaW5zZXJ0QmVmb3JlKHQsdGhpcy5uZXh0U2libGluZyk6dH1mdW5jdGlvbiBMbih0KXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbj10aGlzLl9fb247aWYobil7Zm9yKHZhciBlLHI9MCxpPS0xLG89bi5sZW5ndGg7cjxvOysrcillPW5bcl0sdC50eXBlJiZlLnR5cGUhPT10LnR5cGV8fGUubmFtZSE9PXQubmFtZT9uWysraV09ZTp0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoZS50eXBlLGUubGlzdGVuZXIsZS5vcHRpb25zKTsrK2k/bi5sZW5ndGg9aTpkZWxldGUgdGhpcy5fX29ufX19ZnVuY3Rpb24gam4odCxuLGUpe3JldHVybiBmdW5jdGlvbigpe3ZhciByLGk9dGhpcy5fX29uLG89ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKG4pe3QuY2FsbCh0aGlzLG4sdGhpcy5fX2RhdGFfXyl9fShuKTtpZihpKWZvcih2YXIgYT0wLHU9aS5sZW5ndGg7YTx1OysrYSlpZigocj1pW2FdKS50eXBlPT09dC50eXBlJiZyLm5hbWU9PT10Lm5hbWUpcmV0dXJuIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcihyLnR5cGUsci5saXN0ZW5lcixyLm9wdGlvbnMpLHRoaXMuYWRkRXZlbnRMaXN0ZW5lcihyLnR5cGUsci5saXN0ZW5lcj1vLHIub3B0aW9ucz1lKSx2b2lkKHIudmFsdWU9bik7dGhpcy5hZGRFdmVudExpc3RlbmVyKHQudHlwZSxvLGUpLHI9e3R5cGU6dC50eXBlLG5hbWU6dC5uYW1lLHZhbHVlOm4sbGlzdGVuZXI6byxvcHRpb25zOmV9LGk/aS5wdXNoKHIpOnRoaXMuX19vbj1bcl19fWZ1bmN0aW9uIEhuKHQsbixlKXt2YXIgcj1nbih0KSxpPXIuQ3VzdG9tRXZlbnQ7ImZ1bmN0aW9uIj09dHlwZW9mIGk/aT1uZXcgaShuLGUpOihpPXIuZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50IiksZT8oaS5pbml0RXZlbnQobixlLmJ1YmJsZXMsZS5jYW5jZWxhYmxlKSxpLmRldGFpbD1lLmRldGFpbCk6aS5pbml0RXZlbnQobiwhMSwhMSkpLHQuZGlzcGF0Y2hFdmVudChpKX1mdW5jdGlvbiBYbih0LG4pe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBIbih0aGlzLHQsbil9fWZ1bmN0aW9uIEduKHQsbil7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIEhuKHRoaXMsdCxuLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl9fWVuLnByb3RvdHlwZT17Y29uc3RydWN0b3I6ZW4sYXBwZW5kQ2hpbGQ6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3BhcmVudC5pbnNlcnRCZWZvcmUodCx0aGlzLl9uZXh0KX0saW5zZXJ0QmVmb3JlOmZ1bmN0aW9uKHQsbil7cmV0dXJuIHRoaXMuX3BhcmVudC5pbnNlcnRCZWZvcmUodCxuKX0scXVlcnlTZWxlY3RvcjpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fcGFyZW50LnF1ZXJ5U2VsZWN0b3IodCl9LHF1ZXJ5U2VsZWN0b3JBbGw6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3BhcmVudC5xdWVyeVNlbGVjdG9yQWxsKHQpfX0sQW4ucHJvdG90eXBlPXthZGQ6ZnVuY3Rpb24odCl7dGhpcy5fbmFtZXMuaW5kZXhPZih0KTwwJiYodGhpcy5fbmFtZXMucHVzaCh0KSx0aGlzLl9ub2RlLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuX25hbWVzLmpvaW4oIiAiKSkpfSxyZW1vdmU6ZnVuY3Rpb24odCl7dmFyIG49dGhpcy5fbmFtZXMuaW5kZXhPZih0KTtuPj0wJiYodGhpcy5fbmFtZXMuc3BsaWNlKG4sMSksdGhpcy5fbm9kZS5zZXRBdHRyaWJ1dGUoImNsYXNzIix0aGlzLl9uYW1lcy5qb2luKCIgIikpKX0sY29udGFpbnM6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX25hbWVzLmluZGV4T2YodCk+PTB9fTt2YXIgVm49W251bGxdO2Z1bmN0aW9uIFduKHQsbil7dGhpcy5fZ3JvdXBzPXQsdGhpcy5fcGFyZW50cz1ufWZ1bmN0aW9uIFpuKCl7cmV0dXJuIG5ldyBXbihbW2RvY3VtZW50LmRvY3VtZW50RWxlbWVudF1dLFZuKX1mdW5jdGlvbiBLbih0KXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHQ/bmV3IFduKFtbZG9jdW1lbnQucXVlcnlTZWxlY3Rvcih0KV1dLFtkb2N1bWVudC5kb2N1bWVudEVsZW1lbnRdKTpuZXcgV24oW1t0XV0sVm4pfVduLnByb3RvdHlwZT1abi5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOlduLHNlbGVjdDpmdW5jdGlvbih0KXsiZnVuY3Rpb24iIT10eXBlb2YgdCYmKHQ9SHQodCkpO2Zvcih2YXIgbj10aGlzLl9ncm91cHMsZT1uLmxlbmd0aCxyPW5ldyBBcnJheShlKSxpPTA7aTxlOysraSlmb3IodmFyIG8sYSx1PW5baV0sYz11Lmxlbmd0aCxmPXJbaV09bmV3IEFycmF5KGMpLHM9MDtzPGM7KytzKShvPXVbc10pJiYoYT10LmNhbGwobyxvLl9fZGF0YV9fLHMsdSkpJiYoIl9fZGF0YV9fImluIG8mJihhLl9fZGF0YV9fPW8uX19kYXRhX18pLGZbc109YSk7cmV0dXJuIG5ldyBXbihyLHRoaXMuX3BhcmVudHMpfSxzZWxlY3RBbGw6ZnVuY3Rpb24odCl7dD0iZnVuY3Rpb24iPT10eXBlb2YgdD9mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gWHQodC5hcHBseSh0aGlzLGFyZ3VtZW50cykpfX0odCk6VnQodCk7Zm9yKHZhciBuPXRoaXMuX2dyb3VwcyxlPW4ubGVuZ3RoLHI9W10saT1bXSxvPTA7bzxlOysrbylmb3IodmFyIGEsdT1uW29dLGM9dS5sZW5ndGgsZj0wO2Y8YzsrK2YpKGE9dVtmXSkmJihyLnB1c2godC5jYWxsKGEsYS5fX2RhdGFfXyxmLHUpKSxpLnB1c2goYSkpO3JldHVybiBuZXcgV24ocixpKX0sc2VsZWN0Q2hpbGQ6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuc2VsZWN0KG51bGw9PXQ/UXQ6ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIEt0LmNhbGwodGhpcy5jaGlsZHJlbix0KX19KCJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6WnQodCkpKX0sc2VsZWN0Q2hpbGRyZW46ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuc2VsZWN0QWxsKG51bGw9PXQ/dG46ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIEp0LmNhbGwodGhpcy5jaGlsZHJlbix0KX19KCJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6WnQodCkpKX0sZmlsdGVyOmZ1bmN0aW9uKHQpeyJmdW5jdGlvbiIhPXR5cGVvZiB0JiYodD1XdCh0KSk7Zm9yKHZhciBuPXRoaXMuX2dyb3VwcyxlPW4ubGVuZ3RoLHI9bmV3IEFycmF5KGUpLGk9MDtpPGU7KytpKWZvcih2YXIgbyxhPW5baV0sdT1hLmxlbmd0aCxjPXJbaV09W10sZj0wO2Y8dTsrK2YpKG89YVtmXSkmJnQuY2FsbChvLG8uX19kYXRhX18sZixhKSYmYy5wdXNoKG8pO3JldHVybiBuZXcgV24ocix0aGlzLl9wYXJlbnRzKX0sZGF0YTpmdW5jdGlvbih0LG4pe2lmKCFhcmd1bWVudHMubGVuZ3RoKXJldHVybiBBcnJheS5mcm9tKHRoaXMsYW4pO3ZhciBlPW4/b246cm4scj10aGlzLl9wYXJlbnRzLGk9dGhpcy5fZ3JvdXBzOyJmdW5jdGlvbiIhPXR5cGVvZiB0JiYodD1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19KHQpKTtmb3IodmFyIG89aS5sZW5ndGgsYT1uZXcgQXJyYXkobyksdT1uZXcgQXJyYXkobyksYz1uZXcgQXJyYXkobyksZj0wO2Y8bzsrK2Ype3ZhciBzPXJbZl0sbD1pW2ZdLGg9bC5sZW5ndGgsZD11bih0LmNhbGwocyxzJiZzLl9fZGF0YV9fLGYscikpLHA9ZC5sZW5ndGgsZz11W2ZdPW5ldyBBcnJheShwKSx5PWFbZl09bmV3IEFycmF5KHApO2UocyxsLGcseSxjW2ZdPW5ldyBBcnJheShoKSxkLG4pO2Zvcih2YXIgdixfLGI9MCxtPTA7YjxwOysrYilpZih2PWdbYl0pe2ZvcihiPj1tJiYobT1iKzEpOyEoXz15W21dKSYmKyttPHA7KTt2Ll9uZXh0PV98fG51bGx9fXJldHVybihhPW5ldyBXbihhLHIpKS5fZW50ZXI9dSxhLl9leGl0PWMsYX0sZW50ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFduKHRoaXMuX2VudGVyfHx0aGlzLl9ncm91cHMubWFwKG5uKSx0aGlzLl9wYXJlbnRzKX0sZXhpdDpmdW5jdGlvbigpe3JldHVybiBuZXcgV24odGhpcy5fZXhpdHx8dGhpcy5fZ3JvdXBzLm1hcChubiksdGhpcy5fcGFyZW50cyl9LGpvaW46ZnVuY3Rpb24odCxuLGUpe3ZhciByPXRoaXMuZW50ZXIoKSxpPXRoaXMsbz10aGlzLmV4aXQoKTtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdD8ocj10KHIpKSYmKHI9ci5zZWxlY3Rpb24oKSk6cj1yLmFwcGVuZCh0KyIiKSxudWxsIT1uJiYoaT1uKGkpKSYmKGk9aS5zZWxlY3Rpb24oKSksbnVsbD09ZT9vLnJlbW92ZSgpOmUobyksciYmaT9yLm1lcmdlKGkpLm9yZGVyKCk6aX0sbWVyZ2U6ZnVuY3Rpb24odCl7Zm9yKHZhciBuPXQuc2VsZWN0aW9uP3Quc2VsZWN0aW9uKCk6dCxlPXRoaXMuX2dyb3VwcyxyPW4uX2dyb3VwcyxpPWUubGVuZ3RoLG89ci5sZW5ndGgsYT1NYXRoLm1pbihpLG8pLHU9bmV3IEFycmF5KGkpLGM9MDtjPGE7KytjKWZvcih2YXIgZixzPWVbY10sbD1yW2NdLGg9cy5sZW5ndGgsZD11W2NdPW5ldyBBcnJheShoKSxwPTA7cDxoOysrcCkoZj1zW3BdfHxsW3BdKSYmKGRbcF09Zik7Zm9yKDtjPGk7KytjKXVbY109ZVtjXTtyZXR1cm4gbmV3IFduKHUsdGhpcy5fcGFyZW50cyl9LHNlbGVjdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzfSxvcmRlcjpmdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLl9ncm91cHMsbj0tMSxlPXQubGVuZ3RoOysrbjxlOylmb3IodmFyIHIsaT10W25dLG89aS5sZW5ndGgtMSxhPWlbb107LS1vPj0wOykocj1pW29dKSYmKGEmJjReci5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihhKSYmYS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShyLGEpLGE9cik7cmV0dXJuIHRoaXN9LHNvcnQ6ZnVuY3Rpb24odCl7ZnVuY3Rpb24gbihuLGUpe3JldHVybiBuJiZlP3Qobi5fX2RhdGFfXyxlLl9fZGF0YV9fKTohbi0hZX10fHwodD1jbik7Zm9yKHZhciBlPXRoaXMuX2dyb3VwcyxyPWUubGVuZ3RoLGk9bmV3IEFycmF5KHIpLG89MDtvPHI7KytvKXtmb3IodmFyIGEsdT1lW29dLGM9dS5sZW5ndGgsZj1pW29dPW5ldyBBcnJheShjKSxzPTA7czxjOysrcykoYT11W3NdKSYmKGZbc109YSk7Zi5zb3J0KG4pfXJldHVybiBuZXcgV24oaSx0aGlzLl9wYXJlbnRzKS5vcmRlcigpfSxjYWxsOmZ1bmN0aW9uKCl7dmFyIHQ9YXJndW1lbnRzWzBdO3JldHVybiBhcmd1bWVudHNbMF09dGhpcyx0LmFwcGx5KG51bGwsYXJndW1lbnRzKSx0aGlzfSxub2RlczpmdW5jdGlvbigpe3JldHVybiBBcnJheS5mcm9tKHRoaXMpfSxub2RlOmZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMuX2dyb3VwcyxuPTAsZT10Lmxlbmd0aDtuPGU7KytuKWZvcih2YXIgcj10W25dLGk9MCxvPXIubGVuZ3RoO2k8bzsrK2kpe3ZhciBhPXJbaV07aWYoYSlyZXR1cm4gYX1yZXR1cm4gbnVsbH0sc2l6ZTpmdW5jdGlvbigpe2xldCB0PTA7Zm9yKGNvbnN0IG4gb2YgdGhpcykrK3Q7cmV0dXJuIHR9LGVtcHR5OmZ1bmN0aW9uKCl7cmV0dXJuIXRoaXMubm9kZSgpfSxlYWNoOmZ1bmN0aW9uKHQpe2Zvcih2YXIgbj10aGlzLl9ncm91cHMsZT0wLHI9bi5sZW5ndGg7ZTxyOysrZSlmb3IodmFyIGksbz1uW2VdLGE9MCx1PW8ubGVuZ3RoO2E8dTsrK2EpKGk9b1thXSkmJnQuY2FsbChpLGkuX19kYXRhX18sYSxvKTtyZXR1cm4gdGhpc30sYXR0cjpmdW5jdGlvbih0LG4pe3ZhciBlPU90KHQpO2lmKGFyZ3VtZW50cy5sZW5ndGg8Mil7dmFyIHI9dGhpcy5ub2RlKCk7cmV0dXJuIGUubG9jYWw/ci5nZXRBdHRyaWJ1dGVOUyhlLnNwYWNlLGUubG9jYWwpOnIuZ2V0QXR0cmlidXRlKGUpfXJldHVybiB0aGlzLmVhY2goKG51bGw9PW4/ZS5sb2NhbD9zbjpmbjoiZnVuY3Rpb24iPT10eXBlb2Ygbj9lLmxvY2FsP3BuOmRuOmUubG9jYWw/aG46bG4pKGUsbikpfSxzdHlsZTpmdW5jdGlvbih0LG4sZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg+MT90aGlzLmVhY2goKG51bGw9PW4/eW46ImZ1bmN0aW9uIj09dHlwZW9mIG4/X246dm4pKHQsbixudWxsPT1lPyIiOmUpKTpibih0aGlzLm5vZGUoKSx0KX0scHJvcGVydHk6ZnVuY3Rpb24odCxuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD4xP3RoaXMuZWFjaCgobnVsbD09bj9tbjoiZnVuY3Rpb24iPT10eXBlb2Ygbj93bjp4bikodCxuKSk6dGhpcy5ub2RlKClbdF19LGNsYXNzZWQ6ZnVuY3Rpb24odCxuKXt2YXIgZT1Nbih0KyIiKTtpZihhcmd1bWVudHMubGVuZ3RoPDIpe2Zvcih2YXIgcj1Ubih0aGlzLm5vZGUoKSksaT0tMSxvPWUubGVuZ3RoOysraTxvOylpZighci5jb250YWlucyhlW2ldKSlyZXR1cm4hMTtyZXR1cm4hMH1yZXR1cm4gdGhpcy5lYWNoKCgiZnVuY3Rpb24iPT10eXBlb2Ygbj9DbjpuP05uOmtuKShlLG4pKX0sdGV4dDpmdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD90aGlzLmVhY2gobnVsbD09dD9QbjooImZ1bmN0aW9uIj09dHlwZW9mIHQ/JG46em4pKHQpKTp0aGlzLm5vZGUoKS50ZXh0Q29udGVudH0saHRtbDpmdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD90aGlzLmVhY2gobnVsbD09dD9EbjooImZ1bmN0aW9uIj09dHlwZW9mIHQ/Rm46Um4pKHQpKTp0aGlzLm5vZGUoKS5pbm5lckhUTUx9LHJhaXNlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWFjaChxbil9LGxvd2VyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWFjaChVbil9LGFwcGVuZDpmdW5jdGlvbih0KXt2YXIgbj0iZnVuY3Rpb24iPT10eXBlb2YgdD90Okx0KHQpO3JldHVybiB0aGlzLnNlbGVjdCgoZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hcHBlbmRDaGlsZChuLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl9KSl9LGluc2VydDpmdW5jdGlvbih0LG4pe3ZhciBlPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6THQodCkscj1udWxsPT1uP0luOiJmdW5jdGlvbiI9PXR5cGVvZiBuP246SHQobik7cmV0dXJuIHRoaXMuc2VsZWN0KChmdW5jdGlvbigpe3JldHVybiB0aGlzLmluc2VydEJlZm9yZShlLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxyLmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8bnVsbCl9KSl9LHJlbW92ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhY2goT24pfSxjbG9uZTpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5zZWxlY3QodD9ZbjpCbil9LGRhdHVtOmZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3RoaXMucHJvcGVydHkoIl9fZGF0YV9fIix0KTp0aGlzLm5vZGUoKS5fX2RhdGFfX30sb246ZnVuY3Rpb24odCxuLGUpe3ZhciByLGksbz1mdW5jdGlvbih0KXtyZXR1cm4gdC50cmltKCkuc3BsaXQoL158XHMrLykubWFwKChmdW5jdGlvbih0KXt2YXIgbj0iIixlPXQuaW5kZXhPZigiLiIpO3JldHVybiBlPj0wJiYobj10LnNsaWNlKGUrMSksdD10LnNsaWNlKDAsZSkpLHt0eXBlOnQsbmFtZTpufX0pKX0odCsiIiksYT1vLmxlbmd0aDtpZighKGFyZ3VtZW50cy5sZW5ndGg8Mikpe2Zvcih1PW4/am46TG4scj0wO3I8YTsrK3IpdGhpcy5lYWNoKHUob1tyXSxuLGUpKTtyZXR1cm4gdGhpc312YXIgdT10aGlzLm5vZGUoKS5fX29uO2lmKHUpZm9yKHZhciBjLGY9MCxzPXUubGVuZ3RoO2Y8czsrK2YpZm9yKHI9MCxjPXVbZl07cjxhOysrcilpZigoaT1vW3JdKS50eXBlPT09Yy50eXBlJiZpLm5hbWU9PT1jLm5hbWUpcmV0dXJuIGMudmFsdWV9LGRpc3BhdGNoOmZ1bmN0aW9uKHQsbil7cmV0dXJuIHRoaXMuZWFjaCgoImZ1bmN0aW9uIj09dHlwZW9mIG4/R246WG4pKHQsbikpfSxbU3ltYm9sLml0ZXJhdG9yXTpmdW5jdGlvbiooKXtmb3IodmFyIHQ9dGhpcy5fZ3JvdXBzLG49MCxlPXQubGVuZ3RoO248ZTsrK24pZm9yKHZhciByLGk9dFtuXSxvPTAsYT1pLmxlbmd0aDtvPGE7KytvKShyPWlbb10pJiYoeWllbGQgcil9fTt2YXIgUW49MDtmdW5jdGlvbiBKbigpe3JldHVybiBuZXcgdGV9ZnVuY3Rpb24gdGUoKXt0aGlzLl89IkAiKygrK1FuKS50b1N0cmluZygzNil9ZnVuY3Rpb24gbmUodCl7bGV0IG47Zm9yKDtuPXQuc291cmNlRXZlbnQ7KXQ9bjtyZXR1cm4gdH1mdW5jdGlvbiBlZSh0LG4pe2lmKHQ9bmUodCksdm9pZCAwPT09biYmKG49dC5jdXJyZW50VGFyZ2V0KSxuKXt2YXIgZT1uLm93bmVyU1ZHRWxlbWVudHx8bjtpZihlLmNyZWF0ZVNWR1BvaW50KXt2YXIgcj1lLmNyZWF0ZVNWR1BvaW50KCk7cmV0dXJuIHIueD10LmNsaWVudFgsci55PXQuY2xpZW50WSxbKHI9ci5tYXRyaXhUcmFuc2Zvcm0obi5nZXRTY3JlZW5DVE0oKS5pbnZlcnNlKCkpKS54LHIueV19aWYobi5nZXRCb3VuZGluZ0NsaWVudFJlY3Qpe3ZhciBpPW4uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7cmV0dXJuW3QuY2xpZW50WC1pLmxlZnQtbi5jbGllbnRMZWZ0LHQuY2xpZW50WS1pLnRvcC1uLmNsaWVudFRvcF19fXJldHVyblt0LnBhZ2VYLHQucGFnZVldfXRlLnByb3RvdHlwZT1Kbi5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOnRlLGdldDpmdW5jdGlvbih0KXtmb3IodmFyIG49dGhpcy5fOyEobiBpbiB0KTspaWYoISh0PXQucGFyZW50Tm9kZSkpcmV0dXJuO3JldHVybiB0W25dfSxzZXQ6ZnVuY3Rpb24odCxuKXtyZXR1cm4gdFt0aGlzLl9dPW59LHJlbW92ZTpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fIGluIHQmJmRlbGV0ZSB0W3RoaXMuX119LHRvU3RyaW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX319O2NvbnN0IHJlPXtwYXNzaXZlOiExfSxpZT17Y2FwdHVyZTohMCxwYXNzaXZlOiExfTtmdW5jdGlvbiBvZSh0KXt0LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpfWZ1bmN0aW9uIGFlKHQpe3QucHJldmVudERlZmF1bHQoKSx0LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpfWZ1bmN0aW9uIHVlKHQpe3ZhciBuPXQuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LGU9S24odCkub24oImRyYWdzdGFydC5kcmFnIixhZSxpZSk7Im9uc2VsZWN0c3RhcnQiaW4gbj9lLm9uKCJzZWxlY3RzdGFydC5kcmFnIixhZSxpZSk6KG4uX19ub3NlbGVjdD1uLnN0eWxlLk1velVzZXJTZWxlY3Qsbi5zdHlsZS5Nb3pVc2VyU2VsZWN0PSJub25lIil9ZnVuY3Rpb24gY2UodCxuKXt2YXIgZT10LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudCxyPUtuKHQpLm9uKCJkcmFnc3RhcnQuZHJhZyIsbnVsbCk7biYmKHIub24oImNsaWNrLmRyYWciLGFlLGllKSxzZXRUaW1lb3V0KChmdW5jdGlvbigpe3Iub24oImNsaWNrLmRyYWciLG51bGwpfSksMCkpLCJvbnNlbGVjdHN0YXJ0ImluIGU/ci5vbigic2VsZWN0c3RhcnQuZHJhZyIsbnVsbCk6KGUuc3R5bGUuTW96VXNlclNlbGVjdD1lLl9fbm9zZWxlY3QsZGVsZXRlIGUuX19ub3NlbGVjdCl9dmFyIGZlPXQ9PigpPT50O2Z1bmN0aW9uIHNlKHQse3NvdXJjZUV2ZW50Om4sc3ViamVjdDplLHRhcmdldDpyLGlkZW50aWZpZXI6aSxhY3RpdmU6byx4OmEseTp1LGR4OmMsZHk6ZixkaXNwYXRjaDpzfSl7T2JqZWN0LmRlZmluZVByb3BlcnRpZXModGhpcyx7dHlwZTp7dmFsdWU6dCxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0sc291cmNlRXZlbnQ6e3ZhbHVlOm4sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9LHN1YmplY3Q6e3ZhbHVlOmUsZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9LHRhcmdldDp7dmFsdWU6cixlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0saWRlbnRpZmllcjp7dmFsdWU6aSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0sYWN0aXZlOnt2YWx1ZTpvLGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSx4Ont2YWx1ZTphLGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSx5Ont2YWx1ZTp1LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSxkeDp7dmFsdWU6YyxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0sZHk6e3ZhbHVlOmYsZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9LF86e3ZhbHVlOnN9fSl9ZnVuY3Rpb24gbGUodCl7cmV0dXJuIXQuY3RybEtleSYmIXQuYnV0dG9ufWZ1bmN0aW9uIGhlKCl7cmV0dXJuIHRoaXMucGFyZW50Tm9kZX1mdW5jdGlvbiBkZSh0LG4pe3JldHVybiBudWxsPT1uP3t4OnQueCx5OnQueX06bn1mdW5jdGlvbiBwZSgpe3JldHVybiBuYXZpZ2F0b3IubWF4VG91Y2hQb2ludHN8fCJvbnRvdWNoc3RhcnQiaW4gdGhpc31mdW5jdGlvbiBnZSh0LG4sZSl7dC5wcm90b3R5cGU9bi5wcm90b3R5cGU9ZSxlLmNvbnN0cnVjdG9yPXR9ZnVuY3Rpb24geWUodCxuKXt2YXIgZT1PYmplY3QuY3JlYXRlKHQucHJvdG90eXBlKTtmb3IodmFyIHIgaW4gbillW3JdPW5bcl07cmV0dXJuIGV9ZnVuY3Rpb24gdmUoKXt9c2UucHJvdG90eXBlLm9uPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fLm9uLmFwcGx5KHRoaXMuXyxhcmd1bWVudHMpO3JldHVybiB0PT09dGhpcy5fP3RoaXM6dH07dmFyIF9lPS43LGJlPTEvX2UsbWU9IlxccyooWystXT9cXGQrKVxccyoiLHhlPSJcXHMqKFsrLV0/KD86XFxkKlxcLik/XFxkKyg/OltlRV1bKy1dP1xcZCspPylcXHMqIix3ZT0iXFxzKihbKy1dPyg/OlxcZCpcXC4pP1xcZCsoPzpbZUVdWystXT9cXGQrKT8pJVxccyoiLE1lPS9eIyhbMC05YS1mXXszLDh9KSQvLFRlPW5ldyBSZWdFeHAoYF5yZ2JcXCgke21lfSwke21lfSwke21lfVxcKSRgKSxBZT1uZXcgUmVnRXhwKGBecmdiXFwoJHt3ZX0sJHt3ZX0sJHt3ZX1cXCkkYCksU2U9bmV3IFJlZ0V4cChgXnJnYmFcXCgke21lfSwke21lfSwke21lfSwke3hlfVxcKSRgKSxFZT1uZXcgUmVnRXhwKGBecmdiYVxcKCR7d2V9LCR7d2V9LCR7d2V9LCR7eGV9XFwpJGApLE5lPW5ldyBSZWdFeHAoYF5oc2xcXCgke3hlfSwke3dlfSwke3dlfVxcKSRgKSxrZT1uZXcgUmVnRXhwKGBeaHNsYVxcKCR7eGV9LCR7d2V9LCR7d2V9LCR7eGV9XFwpJGApLENlPXthbGljZWJsdWU6MTU3OTIzODMsYW50aXF1ZXdoaXRlOjE2NDQ0Mzc1LGFxdWE6NjU1MzUsYXF1YW1hcmluZTo4Mzg4NTY0LGF6dXJlOjE1Nzk0MTc1LGJlaWdlOjE2MTE5MjYwLGJpc3F1ZToxNjc3MDI0NCxibGFjazowLGJsYW5jaGVkYWxtb25kOjE2NzcyMDQ1LGJsdWU6MjU1LGJsdWV2aW9sZXQ6OTA1NTIwMixicm93bjoxMDgyNDIzNCxidXJseXdvb2Q6MTQ1OTYyMzEsY2FkZXRibHVlOjYyNjY1MjgsY2hhcnRyZXVzZTo4Mzg4MzUyLGNob2NvbGF0ZToxMzc4OTQ3MCxjb3JhbDoxNjc0NDI3Mixjb3JuZmxvd2VyYmx1ZTo2NTkxOTgxLGNvcm5zaWxrOjE2Nzc1Mzg4LGNyaW1zb246MTQ0MjMxMDAsY3lhbjo2NTUzNSxkYXJrYmx1ZToxMzksZGFya2N5YW46MzU3MjMsZGFya2dvbGRlbnJvZDoxMjA5MjkzOSxkYXJrZ3JheToxMTExOTAxNyxkYXJrZ3JlZW46MjU2MDAsZGFya2dyZXk6MTExMTkwMTcsZGFya2toYWtpOjEyNDMzMjU5LGRhcmttYWdlbnRhOjkxMDk2NDMsZGFya29saXZlZ3JlZW46NTU5Nzk5OSxkYXJrb3JhbmdlOjE2NzQ3NTIwLGRhcmtvcmNoaWQ6MTAwNDAwMTIsZGFya3JlZDo5MTA5NTA0LGRhcmtzYWxtb246MTUzMDg0MTAsZGFya3NlYWdyZWVuOjk0MTk5MTksZGFya3NsYXRlYmx1ZTo0NzM0MzQ3LGRhcmtzbGF0ZWdyYXk6MzEwMDQ5NSxkYXJrc2xhdGVncmV5OjMxMDA0OTUsZGFya3R1cnF1b2lzZTo1Mjk0NSxkYXJrdmlvbGV0Ojk2OTk1MzksZGVlcHBpbms6MTY3MTY5NDcsZGVlcHNreWJsdWU6NDkxNTEsZGltZ3JheTo2OTA4MjY1LGRpbWdyZXk6NjkwODI2NSxkb2RnZXJibHVlOjIwMDMxOTksZmlyZWJyaWNrOjExNjc0MTQ2LGZsb3JhbHdoaXRlOjE2Nzc1OTIwLGZvcmVzdGdyZWVuOjIyNjM4NDIsZnVjaHNpYToxNjcxMTkzNSxnYWluc2Jvcm86MTQ0NzQ0NjAsZ2hvc3R3aGl0ZToxNjMxNjY3MSxnb2xkOjE2NzY2NzIwLGdvbGRlbnJvZDoxNDMyOTEyMCxncmF5Ojg0MjE1MDQsZ3JlZW46MzI3NjgsZ3JlZW55ZWxsb3c6MTE0MDMwNTUsZ3JleTo4NDIxNTA0LGhvbmV5ZGV3OjE1Nzk0MTYwLGhvdHBpbms6MTY3Mzg3NDAsaW5kaWFucmVkOjEzNDU4NTI0LGluZGlnbzo0OTE1MzMwLGl2b3J5OjE2Nzc3MjAwLGtoYWtpOjE1Nzg3NjYwLGxhdmVuZGVyOjE1MTMyNDEwLGxhdmVuZGVyYmx1c2g6MTY3NzMzNjUsbGF3bmdyZWVuOjgxOTA5NzYsbGVtb25jaGlmZm9uOjE2Nzc1ODg1LGxpZ2h0Ymx1ZToxMTM5MzI1NCxsaWdodGNvcmFsOjE1NzYxNTM2LGxpZ2h0Y3lhbjoxNDc0NTU5OSxsaWdodGdvbGRlbnJvZHllbGxvdzoxNjQ0ODIxMCxsaWdodGdyYXk6MTM4ODIzMjMsbGlnaHRncmVlbjo5NDk4MjU2LGxpZ2h0Z3JleToxMzg4MjMyMyxsaWdodHBpbms6MTY3NTg0NjUsbGlnaHRzYWxtb246MTY3NTI3NjIsbGlnaHRzZWFncmVlbjoyMTQyODkwLGxpZ2h0c2t5Ymx1ZTo4OTAwMzQ2LGxpZ2h0c2xhdGVncmF5Ojc4MzM3NTMsbGlnaHRzbGF0ZWdyZXk6NzgzMzc1MyxsaWdodHN0ZWVsYmx1ZToxMTU4NDczNCxsaWdodHllbGxvdzoxNjc3NzE4NCxsaW1lOjY1MjgwLGxpbWVncmVlbjozMzI5MzMwLGxpbmVuOjE2NDQ1NjcwLG1hZ2VudGE6MTY3MTE5MzUsbWFyb29uOjgzODg2MDgsbWVkaXVtYXF1YW1hcmluZTo2NzM3MzIyLG1lZGl1bWJsdWU6MjA1LG1lZGl1bW9yY2hpZDoxMjIxMTY2NyxtZWRpdW1wdXJwbGU6OTY2MjY4MyxtZWRpdW1zZWFncmVlbjozOTc4MDk3LG1lZGl1bXNsYXRlYmx1ZTo4MDg3NzkwLG1lZGl1bXNwcmluZ2dyZWVuOjY0MTU0LG1lZGl1bXR1cnF1b2lzZTo0NzcyMzAwLG1lZGl1bXZpb2xldHJlZDoxMzA0NzE3MyxtaWRuaWdodGJsdWU6MTY0NDkxMixtaW50Y3JlYW06MTYxMjE4NTAsbWlzdHlyb3NlOjE2NzcwMjczLG1vY2Nhc2luOjE2NzcwMjI5LG5hdmFqb3doaXRlOjE2NzY4Njg1LG5hdnk6MTI4LG9sZGxhY2U6MTY2NDM1NTgsb2xpdmU6ODQyMTM3NixvbGl2ZWRyYWI6NzA0ODczOSxvcmFuZ2U6MTY3NTM5MjAsb3JhbmdlcmVkOjE2NzI5MzQ0LG9yY2hpZDoxNDMxNTczNCxwYWxlZ29sZGVucm9kOjE1NjU3MTMwLHBhbGVncmVlbjoxMDAyNTg4MCxwYWxldHVycXVvaXNlOjExNTI5OTY2LHBhbGV2aW9sZXRyZWQ6MTQzODEyMDMscGFwYXlhd2hpcDoxNjc3MzA3NyxwZWFjaHB1ZmY6MTY3Njc2NzMscGVydToxMzQ2ODk5MSxwaW5rOjE2NzYxMDM1LHBsdW06MTQ1MjQ2MzcscG93ZGVyYmx1ZToxMTU5MTkxMCxwdXJwbGU6ODM4ODczNixyZWJlY2NhcHVycGxlOjY2OTc4ODEscmVkOjE2NzExNjgwLHJvc3licm93bjoxMjM1NzUxOSxyb3lhbGJsdWU6NDI4Njk0NSxzYWRkbGVicm93bjo5MTI3MTg3LHNhbG1vbjoxNjQxNjg4MixzYW5keWJyb3duOjE2MDMyODY0LHNlYWdyZWVuOjMwNTAzMjcsc2Vhc2hlbGw6MTY3NzQ2Mzgsc2llbm5hOjEwNTA2Nzk3LHNpbHZlcjoxMjYzMjI1Nixza3libHVlOjg5MDAzMzEsc2xhdGVibHVlOjY5NzAwNjEsc2xhdGVncmF5OjczNzI5NDQsc2xhdGVncmV5OjczNzI5NDQsc25vdzoxNjc3NTkzMCxzcHJpbmdncmVlbjo2NTQwNyxzdGVlbGJsdWU6NDYyMDk4MCx0YW46MTM4MDg3ODAsdGVhbDozMjg5Nix0aGlzdGxlOjE0MjA0ODg4LHRvbWF0bzoxNjczNzA5NSx0dXJxdW9pc2U6NDI1MTg1Nix2aW9sZXQ6MTU2MzEwODYsd2hlYXQ6MTYxMTMzMzEsd2hpdGU6MTY3NzcyMTUsd2hpdGVzbW9rZToxNjExOTI4NSx5ZWxsb3c6MTY3NzY5NjAseWVsbG93Z3JlZW46MTAxNDUwNzR9O2Z1bmN0aW9uIFBlKCl7cmV0dXJuIHRoaXMucmdiKCkuZm9ybWF0SGV4KCl9ZnVuY3Rpb24gemUoKXtyZXR1cm4gdGhpcy5yZ2IoKS5mb3JtYXRSZ2IoKX1mdW5jdGlvbiAkZSh0KXt2YXIgbixlO3JldHVybiB0PSh0KyIiKS50cmltKCkudG9Mb3dlckNhc2UoKSwobj1NZS5leGVjKHQpKT8oZT1uWzFdLmxlbmd0aCxuPXBhcnNlSW50KG5bMV0sMTYpLDY9PT1lP0RlKG4pOjM9PT1lP25ldyBVZShuPj44JjE1fG4+PjQmMjQwLG4+PjQmMTV8MjQwJm4sKDE1Jm4pPDw0fDE1Jm4sMSk6OD09PWU/UmUobj4+MjQmMjU1LG4+PjE2JjI1NSxuPj44JjI1NSwoMjU1Jm4pLzI1NSk6ND09PWU/UmUobj4+MTImMTV8bj4+OCYyNDAsbj4+OCYxNXxuPj40JjI0MCxuPj40JjE1fDI0MCZuLCgoMTUmbik8PDR8MTUmbikvMjU1KTpudWxsKToobj1UZS5leGVjKHQpKT9uZXcgVWUoblsxXSxuWzJdLG5bM10sMSk6KG49QWUuZXhlYyh0KSk/bmV3IFVlKDI1NSpuWzFdLzEwMCwyNTUqblsyXS8xMDAsMjU1Km5bM10vMTAwLDEpOihuPVNlLmV4ZWModCkpP1JlKG5bMV0sblsyXSxuWzNdLG5bNF0pOihuPUVlLmV4ZWModCkpP1JlKDI1NSpuWzFdLzEwMCwyNTUqblsyXS8xMDAsMjU1Km5bM10vMTAwLG5bNF0pOihuPU5lLmV4ZWModCkpP2plKG5bMV0sblsyXS8xMDAsblszXS8xMDAsMSk6KG49a2UuZXhlYyh0KSk/amUoblsxXSxuWzJdLzEwMCxuWzNdLzEwMCxuWzRdKTpDZS5oYXNPd25Qcm9wZXJ0eSh0KT9EZShDZVt0XSk6InRyYW5zcGFyZW50Ij09PXQ/bmV3IFVlKE5hTixOYU4sTmFOLDApOm51bGx9ZnVuY3Rpb24gRGUodCl7cmV0dXJuIG5ldyBVZSh0Pj4xNiYyNTUsdD4+OCYyNTUsMjU1JnQsMSl9ZnVuY3Rpb24gUmUodCxuLGUscil7cmV0dXJuIHI8PTAmJih0PW49ZT1OYU4pLG5ldyBVZSh0LG4sZSxyKX1mdW5jdGlvbiBGZSh0KXtyZXR1cm4gdCBpbnN0YW5jZW9mIHZlfHwodD0kZSh0KSksdD9uZXcgVWUoKHQ9dC5yZ2IoKSkucix0LmcsdC5iLHQub3BhY2l0eSk6bmV3IFVlfWZ1bmN0aW9uIHFlKHQsbixlLHIpe3JldHVybiAxPT09YXJndW1lbnRzLmxlbmd0aD9GZSh0KTpuZXcgVWUodCxuLGUsbnVsbD09cj8xOnIpfWZ1bmN0aW9uIFVlKHQsbixlLHIpe3RoaXMucj0rdCx0aGlzLmc9K24sdGhpcy5iPStlLHRoaXMub3BhY2l0eT0rcn1mdW5jdGlvbiBJZSgpe3JldHVybmAjJHtMZSh0aGlzLnIpfSR7TGUodGhpcy5nKX0ke0xlKHRoaXMuYil9YH1mdW5jdGlvbiBPZSgpe2NvbnN0IHQ9QmUodGhpcy5vcGFjaXR5KTtyZXR1cm5gJHsxPT09dD8icmdiKCI6InJnYmEoIn0ke1llKHRoaXMucil9LCAke1llKHRoaXMuZyl9LCAke1llKHRoaXMuYil9JHsxPT09dD8iKSI6YCwgJHt0fSlgfWB9ZnVuY3Rpb24gQmUodCl7cmV0dXJuIGlzTmFOKHQpPzE6TWF0aC5tYXgoMCxNYXRoLm1pbigxLHQpKX1mdW5jdGlvbiBZZSh0KXtyZXR1cm4gTWF0aC5tYXgoMCxNYXRoLm1pbigyNTUsTWF0aC5yb3VuZCh0KXx8MCkpfWZ1bmN0aW9uIExlKHQpe3JldHVybigodD1ZZSh0KSk8MTY/IjAiOiIiKSt0LnRvU3RyaW5nKDE2KX1mdW5jdGlvbiBqZSh0LG4sZSxyKXtyZXR1cm4gcjw9MD90PW49ZT1OYU46ZTw9MHx8ZT49MT90PW49TmFOOm48PTAmJih0PU5hTiksbmV3IEdlKHQsbixlLHIpfWZ1bmN0aW9uIEhlKHQpe2lmKHQgaW5zdGFuY2VvZiBHZSlyZXR1cm4gbmV3IEdlKHQuaCx0LnMsdC5sLHQub3BhY2l0eSk7aWYodCBpbnN0YW5jZW9mIHZlfHwodD0kZSh0KSksIXQpcmV0dXJuIG5ldyBHZTtpZih0IGluc3RhbmNlb2YgR2UpcmV0dXJuIHQ7dmFyIG49KHQ9dC5yZ2IoKSkuci8yNTUsZT10LmcvMjU1LHI9dC5iLzI1NSxpPU1hdGgubWluKG4sZSxyKSxvPU1hdGgubWF4KG4sZSxyKSxhPU5hTix1PW8taSxjPShvK2kpLzI7cmV0dXJuIHU/KGE9bj09PW8/KGUtcikvdSs2KihlPHIpOmU9PT1vPyhyLW4pL3UrMjoobi1lKS91KzQsdS89YzwuNT9vK2k6Mi1vLWksYSo9NjApOnU9Yz4wJiZjPDE/MDphLG5ldyBHZShhLHUsYyx0Lm9wYWNpdHkpfWZ1bmN0aW9uIFhlKHQsbixlLHIpe3JldHVybiAxPT09YXJndW1lbnRzLmxlbmd0aD9IZSh0KTpuZXcgR2UodCxuLGUsbnVsbD09cj8xOnIpfWZ1bmN0aW9uIEdlKHQsbixlLHIpe3RoaXMuaD0rdCx0aGlzLnM9K24sdGhpcy5sPStlLHRoaXMub3BhY2l0eT0rcn1mdW5jdGlvbiBWZSh0KXtyZXR1cm4odD0odHx8MCklMzYwKTwwP3QrMzYwOnR9ZnVuY3Rpb24gV2UodCl7cmV0dXJuIE1hdGgubWF4KDAsTWF0aC5taW4oMSx0fHwwKSl9ZnVuY3Rpb24gWmUodCxuLGUpe3JldHVybiAyNTUqKHQ8NjA/bisoZS1uKSp0LzYwOnQ8MTgwP2U6dDwyNDA/bisoZS1uKSooMjQwLXQpLzYwOm4pfWdlKHZlLCRlLHtjb3B5KHQpe3JldHVybiBPYmplY3QuYXNzaWduKG5ldyB0aGlzLmNvbnN0cnVjdG9yLHRoaXMsdCl9LGRpc3BsYXlhYmxlKCl7cmV0dXJuIHRoaXMucmdiKCkuZGlzcGxheWFibGUoKX0saGV4OlBlLGZvcm1hdEhleDpQZSxmb3JtYXRIZXg4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmdiKCkuZm9ybWF0SGV4OCgpfSxmb3JtYXRIc2w6ZnVuY3Rpb24oKXtyZXR1cm4gSGUodGhpcykuZm9ybWF0SHNsKCl9LGZvcm1hdFJnYjp6ZSx0b1N0cmluZzp6ZX0pLGdlKFVlLHFlLHllKHZlLHticmlnaHRlcih0KXtyZXR1cm4gdD1udWxsPT10P2JlOk1hdGgucG93KGJlLHQpLG5ldyBVZSh0aGlzLnIqdCx0aGlzLmcqdCx0aGlzLmIqdCx0aGlzLm9wYWNpdHkpfSxkYXJrZXIodCl7cmV0dXJuIHQ9bnVsbD09dD9fZTpNYXRoLnBvdyhfZSx0KSxuZXcgVWUodGhpcy5yKnQsdGhpcy5nKnQsdGhpcy5iKnQsdGhpcy5vcGFjaXR5KX0scmdiKCl7cmV0dXJuIHRoaXN9LGNsYW1wKCl7cmV0dXJuIG5ldyBVZShZZSh0aGlzLnIpLFllKHRoaXMuZyksWWUodGhpcy5iKSxCZSh0aGlzLm9wYWNpdHkpKX0sZGlzcGxheWFibGUoKXtyZXR1cm4tLjU8PXRoaXMuciYmdGhpcy5yPDI1NS41JiYtLjU8PXRoaXMuZyYmdGhpcy5nPDI1NS41JiYtLjU8PXRoaXMuYiYmdGhpcy5iPDI1NS41JiYwPD10aGlzLm9wYWNpdHkmJnRoaXMub3BhY2l0eTw9MX0saGV4OkllLGZvcm1hdEhleDpJZSxmb3JtYXRIZXg4OmZ1bmN0aW9uKCl7cmV0dXJuYCMke0xlKHRoaXMucil9JHtMZSh0aGlzLmcpfSR7TGUodGhpcy5iKX0ke0xlKDI1NSooaXNOYU4odGhpcy5vcGFjaXR5KT8xOnRoaXMub3BhY2l0eSkpfWB9LGZvcm1hdFJnYjpPZSx0b1N0cmluZzpPZX0pKSxnZShHZSxYZSx5ZSh2ZSx7YnJpZ2h0ZXIodCl7cmV0dXJuIHQ9bnVsbD09dD9iZTpNYXRoLnBvdyhiZSx0KSxuZXcgR2UodGhpcy5oLHRoaXMucyx0aGlzLmwqdCx0aGlzLm9wYWNpdHkpfSxkYXJrZXIodCl7cmV0dXJuIHQ9bnVsbD09dD9fZTpNYXRoLnBvdyhfZSx0KSxuZXcgR2UodGhpcy5oLHRoaXMucyx0aGlzLmwqdCx0aGlzLm9wYWNpdHkpfSxyZ2IoKXt2YXIgdD10aGlzLmglMzYwKzM2MCoodGhpcy5oPDApLG49aXNOYU4odCl8fGlzTmFOKHRoaXMucyk/MDp0aGlzLnMsZT10aGlzLmwscj1lKyhlPC41P2U6MS1lKSpuLGk9MiplLXI7cmV0dXJuIG5ldyBVZShaZSh0Pj0yNDA/dC0yNDA6dCsxMjAsaSxyKSxaZSh0LGksciksWmUodDwxMjA/dCsyNDA6dC0xMjAsaSxyKSx0aGlzLm9wYWNpdHkpfSxjbGFtcCgpe3JldHVybiBuZXcgR2UoVmUodGhpcy5oKSxXZSh0aGlzLnMpLFdlKHRoaXMubCksQmUodGhpcy5vcGFjaXR5KSl9LGRpc3BsYXlhYmxlKCl7cmV0dXJuKDA8PXRoaXMucyYmdGhpcy5zPD0xfHxpc05hTih0aGlzLnMpKSYmMDw9dGhpcy5sJiZ0aGlzLmw8PTEmJjA8PXRoaXMub3BhY2l0eSYmdGhpcy5vcGFjaXR5PD0xfSxmb3JtYXRIc2woKXtjb25zdCB0PUJlKHRoaXMub3BhY2l0eSk7cmV0dXJuYCR7MT09PXQ/ImhzbCgiOiJoc2xhKCJ9JHtWZSh0aGlzLmgpfSwgJHsxMDAqV2UodGhpcy5zKX0lLCAkezEwMCpXZSh0aGlzLmwpfSUkezE9PT10PyIpIjpgLCAke3R9KWB9YH19KSk7Y29uc3QgS2U9TWF0aC5QSS8xODAsUWU9MTgwL01hdGguUEksSmU9Ljk2NDIyLHRyPTEsbnI9LjgyNTIxLGVyPTQvMjkscnI9Ni8yOSxpcj0zKnJyKnJyLG9yPXJyKnJyKnJyO2Z1bmN0aW9uIGFyKHQpe2lmKHQgaW5zdGFuY2VvZiBjcilyZXR1cm4gbmV3IGNyKHQubCx0LmEsdC5iLHQub3BhY2l0eSk7aWYodCBpbnN0YW5jZW9mIGdyKXJldHVybiB5cih0KTt0IGluc3RhbmNlb2YgVWV8fCh0PUZlKHQpKTt2YXIgbixlLHI9aHIodC5yKSxpPWhyKHQuZyksbz1ocih0LmIpLGE9ZnIoKC4yMjI1MDQ1KnIrLjcxNjg3ODYqaSsuMDYwNjE2OSpvKS90cik7cmV0dXJuIHI9PT1pJiZpPT09bz9uPWU9YToobj1mcigoLjQzNjA3NDcqcisuMzg1MDY0OSppKy4xNDMwODA0Km8pL0plKSxlPWZyKCguMDEzOTMyMipyKy4wOTcxMDQ1KmkrLjcxNDE3MzMqbykvbnIpKSxuZXcgY3IoMTE2KmEtMTYsNTAwKihuLWEpLDIwMCooYS1lKSx0Lm9wYWNpdHkpfWZ1bmN0aW9uIHVyKHQsbixlLHIpe3JldHVybiAxPT09YXJndW1lbnRzLmxlbmd0aD9hcih0KTpuZXcgY3IodCxuLGUsbnVsbD09cj8xOnIpfWZ1bmN0aW9uIGNyKHQsbixlLHIpe3RoaXMubD0rdCx0aGlzLmE9K24sdGhpcy5iPStlLHRoaXMub3BhY2l0eT0rcn1mdW5jdGlvbiBmcih0KXtyZXR1cm4gdD5vcj9NYXRoLnBvdyh0LDEvMyk6dC9pcitlcn1mdW5jdGlvbiBzcih0KXtyZXR1cm4gdD5ycj90KnQqdDppcioodC1lcil9ZnVuY3Rpb24gbHIodCl7cmV0dXJuIDI1NSoodDw9LjAwMzEzMDg/MTIuOTIqdDoxLjA1NSpNYXRoLnBvdyh0LDEvMi40KS0uMDU1KX1mdW5jdGlvbiBocih0KXtyZXR1cm4odC89MjU1KTw9LjA0MDQ1P3QvMTIuOTI6TWF0aC5wb3coKHQrLjA1NSkvMS4wNTUsMi40KX1mdW5jdGlvbiBkcih0KXtpZih0IGluc3RhbmNlb2YgZ3IpcmV0dXJuIG5ldyBncih0LmgsdC5jLHQubCx0Lm9wYWNpdHkpO2lmKHQgaW5zdGFuY2VvZiBjcnx8KHQ9YXIodCkpLDA9PT10LmEmJjA9PT10LmIpcmV0dXJuIG5ldyBncihOYU4sMDx0LmwmJnQubDwxMDA/MDpOYU4sdC5sLHQub3BhY2l0eSk7dmFyIG49TWF0aC5hdGFuMih0LmIsdC5hKSpRZTtyZXR1cm4gbmV3IGdyKG48MD9uKzM2MDpuLE1hdGguc3FydCh0LmEqdC5hK3QuYip0LmIpLHQubCx0Lm9wYWNpdHkpfWZ1bmN0aW9uIHByKHQsbixlLHIpe3JldHVybiAxPT09YXJndW1lbnRzLmxlbmd0aD9kcih0KTpuZXcgZ3IodCxuLGUsbnVsbD09cj8xOnIpfWZ1bmN0aW9uIGdyKHQsbixlLHIpe3RoaXMuaD0rdCx0aGlzLmM9K24sdGhpcy5sPStlLHRoaXMub3BhY2l0eT0rcn1mdW5jdGlvbiB5cih0KXtpZihpc05hTih0LmgpKXJldHVybiBuZXcgY3IodC5sLDAsMCx0Lm9wYWNpdHkpO3ZhciBuPXQuaCpLZTtyZXR1cm4gbmV3IGNyKHQubCxNYXRoLmNvcyhuKSp0LmMsTWF0aC5zaW4obikqdC5jLHQub3BhY2l0eSl9Z2UoY3IsdXIseWUodmUse2JyaWdodGVyKHQpe3JldHVybiBuZXcgY3IodGhpcy5sKzE4KihudWxsPT10PzE6dCksdGhpcy5hLHRoaXMuYix0aGlzLm9wYWNpdHkpfSxkYXJrZXIodCl7cmV0dXJuIG5ldyBjcih0aGlzLmwtMTgqKG51bGw9PXQ/MTp0KSx0aGlzLmEsdGhpcy5iLHRoaXMub3BhY2l0eSl9LHJnYigpe3ZhciB0PSh0aGlzLmwrMTYpLzExNixuPWlzTmFOKHRoaXMuYSk/dDp0K3RoaXMuYS81MDAsZT1pc05hTih0aGlzLmIpP3Q6dC10aGlzLmIvMjAwO3JldHVybiBuZXcgVWUobHIoMy4xMzM4NTYxKihuPUplKnNyKG4pKS0xLjYxNjg2NjcqKHQ9dHIqc3IodCkpLS40OTA2MTQ2KihlPW5yKnNyKGUpKSksbHIoLS45Nzg3Njg0Km4rMS45MTYxNDE1KnQrLjAzMzQ1NCplKSxsciguMDcxOTQ1MypuLS4yMjg5OTE0KnQrMS40MDUyNDI3KmUpLHRoaXMub3BhY2l0eSl9fSkpLGdlKGdyLHByLHllKHZlLHticmlnaHRlcih0KXtyZXR1cm4gbmV3IGdyKHRoaXMuaCx0aGlzLmMsdGhpcy5sKzE4KihudWxsPT10PzE6dCksdGhpcy5vcGFjaXR5KX0sZGFya2VyKHQpe3JldHVybiBuZXcgZ3IodGhpcy5oLHRoaXMuYyx0aGlzLmwtMTgqKG51bGw9PXQ/MTp0KSx0aGlzLm9wYWNpdHkpfSxyZ2IoKXtyZXR1cm4geXIodGhpcykucmdiKCl9fSkpO3ZhciB2cj0tLjE0ODYxLF9yPTEuNzgyNzcsYnI9LS4yOTIyNyxtcj0tLjkwNjQ5LHhyPTEuOTcyOTQsd3I9eHIqbXIsTXI9eHIqX3IsVHI9X3IqYnItbXIqdnI7ZnVuY3Rpb24gQXIodCxuLGUscil7cmV0dXJuIDE9PT1hcmd1bWVudHMubGVuZ3RoP2Z1bmN0aW9uKHQpe2lmKHQgaW5zdGFuY2VvZiBTcilyZXR1cm4gbmV3IFNyKHQuaCx0LnMsdC5sLHQub3BhY2l0eSk7dCBpbnN0YW5jZW9mIFVlfHwodD1GZSh0KSk7dmFyIG49dC5yLzI1NSxlPXQuZy8yNTUscj10LmIvMjU1LGk9KFRyKnIrd3Iqbi1NciplKS8oVHIrd3ItTXIpLG89ci1pLGE9KHhyKihlLWkpLWJyKm8pL21yLHU9TWF0aC5zcXJ0KGEqYStvKm8pLyh4cippKigxLWkpKSxjPXU/TWF0aC5hdGFuMihhLG8pKlFlLTEyMDpOYU47cmV0dXJuIG5ldyBTcihjPDA/YyszNjA6Yyx1LGksdC5vcGFjaXR5KX0odCk6bmV3IFNyKHQsbixlLG51bGw9PXI/MTpyKX1mdW5jdGlvbiBTcih0LG4sZSxyKXt0aGlzLmg9K3QsdGhpcy5zPStuLHRoaXMubD0rZSx0aGlzLm9wYWNpdHk9K3J9ZnVuY3Rpb24gRXIodCxuLGUscixpKXt2YXIgbz10KnQsYT1vKnQ7cmV0dXJuKCgxLTMqdCszKm8tYSkqbisoNC02Km8rMyphKSplKygxKzMqdCszKm8tMyphKSpyK2EqaSkvNn1mdW5jdGlvbiBOcih0KXt2YXIgbj10Lmxlbmd0aC0xO3JldHVybiBmdW5jdGlvbihlKXt2YXIgcj1lPD0wP2U9MDplPj0xPyhlPTEsbi0xKTpNYXRoLmZsb29yKGUqbiksaT10W3JdLG89dFtyKzFdLGE9cj4wP3Rbci0xXToyKmktbyx1PXI8bi0xP3RbcisyXToyKm8taTtyZXR1cm4gRXIoKGUtci9uKSpuLGEsaSxvLHUpfX1mdW5jdGlvbiBrcih0KXt2YXIgbj10Lmxlbmd0aDtyZXR1cm4gZnVuY3Rpb24oZSl7dmFyIHI9TWF0aC5mbG9vcigoKGUlPTEpPDA/KytlOmUpKm4pLGk9dFsocituLTEpJW5dLG89dFtyJW5dLGE9dFsocisxKSVuXSx1PXRbKHIrMiklbl07cmV0dXJuIEVyKChlLXIvbikqbixpLG8sYSx1KX19Z2UoU3IsQXIseWUodmUse2JyaWdodGVyKHQpe3JldHVybiB0PW51bGw9PXQ/YmU6TWF0aC5wb3coYmUsdCksbmV3IFNyKHRoaXMuaCx0aGlzLnMsdGhpcy5sKnQsdGhpcy5vcGFjaXR5KX0sZGFya2VyKHQpe3JldHVybiB0PW51bGw9PXQ/X2U6TWF0aC5wb3coX2UsdCksbmV3IFNyKHRoaXMuaCx0aGlzLnMsdGhpcy5sKnQsdGhpcy5vcGFjaXR5KX0scmdiKCl7dmFyIHQ9aXNOYU4odGhpcy5oKT8wOih0aGlzLmgrMTIwKSpLZSxuPSt0aGlzLmwsZT1pc05hTih0aGlzLnMpPzA6dGhpcy5zKm4qKDEtbikscj1NYXRoLmNvcyh0KSxpPU1hdGguc2luKHQpO3JldHVybiBuZXcgVWUoMjU1KihuK2UqKHZyKnIrX3IqaSkpLDI1NSoobitlKihicipyK21yKmkpKSwyNTUqKG4rZSooeHIqcikpLHRoaXMub3BhY2l0eSl9fSkpO3ZhciBDcj10PT4oKT0+dDtmdW5jdGlvbiBQcih0LG4pe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gdCtlKm59fWZ1bmN0aW9uIHpyKHQsbil7dmFyIGU9bi10O3JldHVybiBlP1ByKHQsZT4xODB8fGU8LTE4MD9lLTM2MCpNYXRoLnJvdW5kKGUvMzYwKTplKTpDcihpc05hTih0KT9uOnQpfWZ1bmN0aW9uICRyKHQpe3JldHVybiAxPT0odD0rdCk/RHI6ZnVuY3Rpb24obixlKXtyZXR1cm4gZS1uP2Z1bmN0aW9uKHQsbixlKXtyZXR1cm4gdD1NYXRoLnBvdyh0LGUpLG49TWF0aC5wb3cobixlKS10LGU9MS9lLGZ1bmN0aW9uKHIpe3JldHVybiBNYXRoLnBvdyh0K3IqbixlKX19KG4sZSx0KTpDcihpc05hTihuKT9lOm4pfX1mdW5jdGlvbiBEcih0LG4pe3ZhciBlPW4tdDtyZXR1cm4gZT9Qcih0LGUpOkNyKGlzTmFOKHQpP246dCl9dmFyIFJyPWZ1bmN0aW9uIHQobil7dmFyIGU9JHIobik7ZnVuY3Rpb24gcih0LG4pe3ZhciByPWUoKHQ9cWUodCkpLnIsKG49cWUobikpLnIpLGk9ZSh0Lmcsbi5nKSxvPWUodC5iLG4uYiksYT1Ecih0Lm9wYWNpdHksbi5vcGFjaXR5KTtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIHQucj1yKG4pLHQuZz1pKG4pLHQuYj1vKG4pLHQub3BhY2l0eT1hKG4pLHQrIiJ9fXJldHVybiByLmdhbW1hPXQscn0oMSk7ZnVuY3Rpb24gRnIodCl7cmV0dXJuIGZ1bmN0aW9uKG4pe3ZhciBlLHIsaT1uLmxlbmd0aCxvPW5ldyBBcnJheShpKSxhPW5ldyBBcnJheShpKSx1PW5ldyBBcnJheShpKTtmb3IoZT0wO2U8aTsrK2Upcj1xZShuW2VdKSxvW2VdPXIucnx8MCxhW2VdPXIuZ3x8MCx1W2VdPXIuYnx8MDtyZXR1cm4gbz10KG8pLGE9dChhKSx1PXQodSksci5vcGFjaXR5PTEsZnVuY3Rpb24odCl7cmV0dXJuIHIucj1vKHQpLHIuZz1hKHQpLHIuYj11KHQpLHIrIiJ9fX12YXIgcXI9RnIoTnIpLFVyPUZyKGtyKTtmdW5jdGlvbiBJcih0LG4pe258fChuPVtdKTt2YXIgZSxyPXQ/TWF0aC5taW4obi5sZW5ndGgsdC5sZW5ndGgpOjAsaT1uLnNsaWNlKCk7cmV0dXJuIGZ1bmN0aW9uKG8pe2ZvcihlPTA7ZTxyOysrZSlpW2VdPXRbZV0qKDEtbykrbltlXSpvO3JldHVybiBpfX1mdW5jdGlvbiBPcih0KXtyZXR1cm4gQXJyYXlCdWZmZXIuaXNWaWV3KHQpJiYhKHQgaW5zdGFuY2VvZiBEYXRhVmlldyl9ZnVuY3Rpb24gQnIodCxuKXt2YXIgZSxyPW4/bi5sZW5ndGg6MCxpPXQ/TWF0aC5taW4ocix0Lmxlbmd0aCk6MCxvPW5ldyBBcnJheShpKSxhPW5ldyBBcnJheShyKTtmb3IoZT0wO2U8aTsrK2Upb1tlXT1Wcih0W2VdLG5bZV0pO2Zvcig7ZTxyOysrZSlhW2VdPW5bZV07cmV0dXJuIGZ1bmN0aW9uKHQpe2ZvcihlPTA7ZTxpOysrZSlhW2VdPW9bZV0odCk7cmV0dXJuIGF9fWZ1bmN0aW9uIFlyKHQsbil7dmFyIGU9bmV3IERhdGU7cmV0dXJuIHQ9K3Qsbj0rbixmdW5jdGlvbihyKXtyZXR1cm4gZS5zZXRUaW1lKHQqKDEtcikrbipyKSxlfX1mdW5jdGlvbiBMcih0LG4pe3JldHVybiB0PSt0LG49K24sZnVuY3Rpb24oZSl7cmV0dXJuIHQqKDEtZSkrbiplfX1mdW5jdGlvbiBqcih0LG4pe3ZhciBlLHI9e30saT17fTtmb3IoZSBpbiBudWxsIT09dCYmIm9iamVjdCI9PXR5cGVvZiB0fHwodD17fSksbnVsbCE9PW4mJiJvYmplY3QiPT10eXBlb2Ygbnx8KG49e30pLG4pZSBpbiB0P3JbZV09VnIodFtlXSxuW2VdKTppW2VdPW5bZV07cmV0dXJuIGZ1bmN0aW9uKHQpe2ZvcihlIGluIHIpaVtlXT1yW2VdKHQpO3JldHVybiBpfX12YXIgSHI9L1stK10/KD86XGQrXC4/XGQqfFwuP1xkKykoPzpbZUVdWy0rXT9cZCspPy9nLFhyPW5ldyBSZWdFeHAoSHIuc291cmNlLCJnIik7ZnVuY3Rpb24gR3IodCxuKXt2YXIgZSxyLGksbz1Ici5sYXN0SW5kZXg9WHIubGFzdEluZGV4PTAsYT0tMSx1PVtdLGM9W107Zm9yKHQrPSIiLG4rPSIiOyhlPUhyLmV4ZWModCkpJiYocj1Yci5leGVjKG4pKTspKGk9ci5pbmRleCk+byYmKGk9bi5zbGljZShvLGkpLHVbYV0/dVthXSs9aTp1WysrYV09aSksKGU9ZVswXSk9PT0ocj1yWzBdKT91W2FdP3VbYV0rPXI6dVsrK2FdPXI6KHVbKythXT1udWxsLGMucHVzaCh7aTphLHg6THIoZSxyKX0pKSxvPVhyLmxhc3RJbmRleDtyZXR1cm4gbzxuLmxlbmd0aCYmKGk9bi5zbGljZShvKSx1W2FdP3VbYV0rPWk6dVsrK2FdPWkpLHUubGVuZ3RoPDI/Y1swXT9mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIHQobikrIiJ9fShjWzBdLngpOmZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0fX0obik6KG49Yy5sZW5ndGgsZnVuY3Rpb24odCl7Zm9yKHZhciBlLHI9MDtyPG47KytyKXVbKGU9Y1tyXSkuaV09ZS54KHQpO3JldHVybiB1LmpvaW4oIiIpfSl9ZnVuY3Rpb24gVnIodCxuKXt2YXIgZSxyPXR5cGVvZiBuO3JldHVybiBudWxsPT1ufHwiYm9vbGVhbiI9PT1yP0NyKG4pOigibnVtYmVyIj09PXI/THI6InN0cmluZyI9PT1yPyhlPSRlKG4pKT8obj1lLFJyKTpHcjpuIGluc3RhbmNlb2YgJGU/UnI6biBpbnN0YW5jZW9mIERhdGU/WXI6T3Iobik/SXI6QXJyYXkuaXNBcnJheShuKT9CcjoiZnVuY3Rpb24iIT10eXBlb2Ygbi52YWx1ZU9mJiYiZnVuY3Rpb24iIT10eXBlb2Ygbi50b1N0cmluZ3x8aXNOYU4obik/anI6THIpKHQsbil9ZnVuY3Rpb24gV3IodCxuKXtyZXR1cm4gdD0rdCxuPStuLGZ1bmN0aW9uKGUpe3JldHVybiBNYXRoLnJvdW5kKHQqKDEtZSkrbiplKX19dmFyIFpyLEtyPTE4MC9NYXRoLlBJLFFyPXt0cmFuc2xhdGVYOjAsdHJhbnNsYXRlWTowLHJvdGF0ZTowLHNrZXdYOjAsc2NhbGVYOjEsc2NhbGVZOjF9O2Z1bmN0aW9uIEpyKHQsbixlLHIsaSxvKXt2YXIgYSx1LGM7cmV0dXJuKGE9TWF0aC5zcXJ0KHQqdCtuKm4pKSYmKHQvPWEsbi89YSksKGM9dCplK24qcikmJihlLT10KmMsci09bipjKSwodT1NYXRoLnNxcnQoZSplK3IqcikpJiYoZS89dSxyLz11LGMvPXUpLHQqcjxuKmUmJih0PS10LG49LW4sYz0tYyxhPS1hKSx7dHJhbnNsYXRlWDppLHRyYW5zbGF0ZVk6byxyb3RhdGU6TWF0aC5hdGFuMihuLHQpKktyLHNrZXdYOk1hdGguYXRhbihjKSpLcixzY2FsZVg6YSxzY2FsZVk6dX19ZnVuY3Rpb24gdGkodCxuLGUscil7ZnVuY3Rpb24gaSh0KXtyZXR1cm4gdC5sZW5ndGg/dC5wb3AoKSsiICI6IiJ9cmV0dXJuIGZ1bmN0aW9uKG8sYSl7dmFyIHU9W10sYz1bXTtyZXR1cm4gbz10KG8pLGE9dChhKSxmdW5jdGlvbih0LHIsaSxvLGEsdSl7aWYodCE9PWl8fHIhPT1vKXt2YXIgYz1hLnB1c2goInRyYW5zbGF0ZSgiLG51bGwsbixudWxsLGUpO3UucHVzaCh7aTpjLTQseDpMcih0LGkpfSx7aTpjLTIseDpMcihyLG8pfSl9ZWxzZShpfHxvKSYmYS5wdXNoKCJ0cmFuc2xhdGUoIitpK24rbytlKX0oby50cmFuc2xhdGVYLG8udHJhbnNsYXRlWSxhLnRyYW5zbGF0ZVgsYS50cmFuc2xhdGVZLHUsYyksZnVuY3Rpb24odCxuLGUsbyl7dCE9PW4/KHQtbj4xODA/bis9MzYwOm4tdD4xODAmJih0Kz0zNjApLG8ucHVzaCh7aTplLnB1c2goaShlKSsicm90YXRlKCIsbnVsbCxyKS0yLHg6THIodCxuKX0pKTpuJiZlLnB1c2goaShlKSsicm90YXRlKCIrbityKX0oby5yb3RhdGUsYS5yb3RhdGUsdSxjKSxmdW5jdGlvbih0LG4sZSxvKXt0IT09bj9vLnB1c2goe2k6ZS5wdXNoKGkoZSkrInNrZXdYKCIsbnVsbCxyKS0yLHg6THIodCxuKX0pOm4mJmUucHVzaChpKGUpKyJza2V3WCgiK24rcil9KG8uc2tld1gsYS5za2V3WCx1LGMpLGZ1bmN0aW9uKHQsbixlLHIsbyxhKXtpZih0IT09ZXx8biE9PXIpe3ZhciB1PW8ucHVzaChpKG8pKyJzY2FsZSgiLG51bGwsIiwiLG51bGwsIikiKTthLnB1c2goe2k6dS00LHg6THIodCxlKX0se2k6dS0yLHg6THIobixyKX0pfWVsc2UgMT09PWUmJjE9PT1yfHxvLnB1c2goaShvKSsic2NhbGUoIitlKyIsIityKyIpIil9KG8uc2NhbGVYLG8uc2NhbGVZLGEuc2NhbGVYLGEuc2NhbGVZLHUsYyksbz1hPW51bGwsZnVuY3Rpb24odCl7Zm9yKHZhciBuLGU9LTEscj1jLmxlbmd0aDsrK2U8cjspdVsobj1jW2VdKS5pXT1uLngodCk7cmV0dXJuIHUuam9pbigiIil9fX12YXIgbmk9dGkoKGZ1bmN0aW9uKHQpe2NvbnN0IG49bmV3KCJmdW5jdGlvbiI9PXR5cGVvZiBET01NYXRyaXg/RE9NTWF0cml4OldlYktpdENTU01hdHJpeCkodCsiIik7cmV0dXJuIG4uaXNJZGVudGl0eT9RcjpKcihuLmEsbi5iLG4uYyxuLmQsbi5lLG4uZil9KSwicHgsICIsInB4KSIsImRlZykiKSxlaT10aSgoZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/UXI6KFpyfHwoWnI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIsImciKSksWnIuc2V0QXR0cmlidXRlKCJ0cmFuc2Zvcm0iLHQpLCh0PVpyLnRyYW5zZm9ybS5iYXNlVmFsLmNvbnNvbGlkYXRlKCkpP0pyKCh0PXQubWF0cml4KS5hLHQuYix0LmMsdC5kLHQuZSx0LmYpOlFyKX0pLCIsICIsIikiLCIpIik7ZnVuY3Rpb24gcmkodCl7cmV0dXJuKCh0PU1hdGguZXhwKHQpKSsxL3QpLzJ9dmFyIGlpPWZ1bmN0aW9uIHQobixlLHIpe2Z1bmN0aW9uIGkodCxpKXt2YXIgbyxhLHU9dFswXSxjPXRbMV0sZj10WzJdLHM9aVswXSxsPWlbMV0saD1pWzJdLGQ9cy11LHA9bC1jLGc9ZCpkK3AqcDtpZihnPDFlLTEyKWE9TWF0aC5sb2coaC9mKS9uLG89ZnVuY3Rpb24odCl7cmV0dXJuW3UrdCpkLGMrdCpwLGYqTWF0aC5leHAobip0KmEpXX07ZWxzZXt2YXIgeT1NYXRoLnNxcnQoZyksdj0oaCpoLWYqZityKmcpLygyKmYqZSp5KSxfPShoKmgtZipmLXIqZykvKDIqaCplKnkpLGI9TWF0aC5sb2coTWF0aC5zcXJ0KHYqdisxKS12KSxtPU1hdGgubG9nKE1hdGguc3FydChfKl8rMSktXyk7YT0obS1iKS9uLG89ZnVuY3Rpb24odCl7dmFyIHI9dCphLGk9cmkoYiksbz1mLyhlKnkpKihpKmZ1bmN0aW9uKHQpe3JldHVybigodD1NYXRoLmV4cCgyKnQpKS0xKS8odCsxKX0obipyK2IpLWZ1bmN0aW9uKHQpe3JldHVybigodD1NYXRoLmV4cCh0KSktMS90KS8yfShiKSk7cmV0dXJuW3UrbypkLGMrbypwLGYqaS9yaShuKnIrYildfX1yZXR1cm4gby5kdXJhdGlvbj0xZTMqYSpuL01hdGguU1FSVDIsb31yZXR1cm4gaS5yaG89ZnVuY3Rpb24obil7dmFyIGU9TWF0aC5tYXgoLjAwMSwrbikscj1lKmU7cmV0dXJuIHQoZSxyLHIqcil9LGl9KE1hdGguU1FSVDIsMiw0KTtmdW5jdGlvbiBvaSh0KXtyZXR1cm4gZnVuY3Rpb24obixlKXt2YXIgcj10KChuPVhlKG4pKS5oLChlPVhlKGUpKS5oKSxpPURyKG4ucyxlLnMpLG89RHIobi5sLGUubCksYT1EcihuLm9wYWNpdHksZS5vcGFjaXR5KTtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIG4uaD1yKHQpLG4ucz1pKHQpLG4ubD1vKHQpLG4ub3BhY2l0eT1hKHQpLG4rIiJ9fX12YXIgYWk9b2koenIpLHVpPW9pKERyKTtmdW5jdGlvbiBjaSh0KXtyZXR1cm4gZnVuY3Rpb24obixlKXt2YXIgcj10KChuPXByKG4pKS5oLChlPXByKGUpKS5oKSxpPURyKG4uYyxlLmMpLG89RHIobi5sLGUubCksYT1EcihuLm9wYWNpdHksZS5vcGFjaXR5KTtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIG4uaD1yKHQpLG4uYz1pKHQpLG4ubD1vKHQpLG4ub3BhY2l0eT1hKHQpLG4rIiJ9fX12YXIgZmk9Y2koenIpLHNpPWNpKERyKTtmdW5jdGlvbiBsaSh0KXtyZXR1cm4gZnVuY3Rpb24gbihlKXtmdW5jdGlvbiByKG4scil7dmFyIGk9dCgobj1BcihuKSkuaCwocj1BcihyKSkuaCksbz1EcihuLnMsci5zKSxhPURyKG4ubCxyLmwpLHU9RHIobi5vcGFjaXR5LHIub3BhY2l0eSk7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBuLmg9aSh0KSxuLnM9byh0KSxuLmw9YShNYXRoLnBvdyh0LGUpKSxuLm9wYWNpdHk9dSh0KSxuKyIifX1yZXR1cm4gZT0rZSxyLmdhbW1hPW4scn0oMSl9dmFyIGhpPWxpKHpyKSxkaT1saShEcik7ZnVuY3Rpb24gcGkodCxuKXt2b2lkIDA9PT1uJiYobj10LHQ9VnIpO2Zvcih2YXIgZT0wLHI9bi5sZW5ndGgtMSxpPW5bMF0sbz1uZXcgQXJyYXkocjwwPzA6cik7ZTxyOylvW2VdPXQoaSxpPW5bKytlXSk7cmV0dXJuIGZ1bmN0aW9uKHQpe3ZhciBuPU1hdGgubWF4KDAsTWF0aC5taW4oci0xLE1hdGguZmxvb3IodCo9cikpKTtyZXR1cm4gb1tuXSh0LW4pfX12YXIgZ2kseWksdmk9MCxfaT0wLGJpPTAsbWk9MWUzLHhpPTAsd2k9MCxNaT0wLFRpPSJvYmplY3QiPT10eXBlb2YgcGVyZm9ybWFuY2UmJnBlcmZvcm1hbmNlLm5vdz9wZXJmb3JtYW5jZTpEYXRlLEFpPSJvYmplY3QiPT10eXBlb2Ygd2luZG93JiZ3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lP3dpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUuYmluZCh3aW5kb3cpOmZ1bmN0aW9uKHQpe3NldFRpbWVvdXQodCwxNyl9O2Z1bmN0aW9uIFNpKCl7cmV0dXJuIHdpfHwoQWkoRWkpLHdpPVRpLm5vdygpK01pKX1mdW5jdGlvbiBFaSgpe3dpPTB9ZnVuY3Rpb24gTmkoKXt0aGlzLl9jYWxsPXRoaXMuX3RpbWU9dGhpcy5fbmV4dD1udWxsfWZ1bmN0aW9uIGtpKHQsbixlKXt2YXIgcj1uZXcgTmk7cmV0dXJuIHIucmVzdGFydCh0LG4sZSkscn1mdW5jdGlvbiBDaSgpe1NpKCksKyt2aTtmb3IodmFyIHQsbj1naTtuOykodD13aS1uLl90aW1lKT49MCYmbi5fY2FsbC5jYWxsKHZvaWQgMCx0KSxuPW4uX25leHQ7LS12aX1mdW5jdGlvbiBQaSgpe3dpPSh4aT1UaS5ub3coKSkrTWksdmk9X2k9MDt0cnl7Q2koKX1maW5hbGx5e3ZpPTAsZnVuY3Rpb24oKXt2YXIgdCxuLGU9Z2kscj0xLzA7Zm9yKDtlOyllLl9jYWxsPyhyPmUuX3RpbWUmJihyPWUuX3RpbWUpLHQ9ZSxlPWUuX25leHQpOihuPWUuX25leHQsZS5fbmV4dD1udWxsLGU9dD90Ll9uZXh0PW46Z2k9bik7eWk9dCwkaShyKX0oKSx3aT0wfX1mdW5jdGlvbiB6aSgpe3ZhciB0PVRpLm5vdygpLG49dC14aTtuPm1pJiYoTWktPW4seGk9dCl9ZnVuY3Rpb24gJGkodCl7dml8fChfaSYmKF9pPWNsZWFyVGltZW91dChfaSkpLHQtd2k+MjQ/KHQ8MS8wJiYoX2k9c2V0VGltZW91dChQaSx0LVRpLm5vdygpLU1pKSksYmkmJihiaT1jbGVhckludGVydmFsKGJpKSkpOihiaXx8KHhpPVRpLm5vdygpLGJpPXNldEludGVydmFsKHppLG1pKSksdmk9MSxBaShQaSkpKX1mdW5jdGlvbiBEaSh0LG4sZSl7dmFyIHI9bmV3IE5pO3JldHVybiBuPW51bGw9PW4/MDorbixyLnJlc3RhcnQoKGU9PntyLnN0b3AoKSx0KGUrbil9KSxuLGUpLHJ9TmkucHJvdG90eXBlPWtpLnByb3RvdHlwZT17Y29uc3RydWN0b3I6TmkscmVzdGFydDpmdW5jdGlvbih0LG4sZSl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHQpdGhyb3cgbmV3IFR5cGVFcnJvcigiY2FsbGJhY2sgaXMgbm90IGEgZnVuY3Rpb24iKTtlPShudWxsPT1lP1NpKCk6K2UpKyhudWxsPT1uPzA6K24pLHRoaXMuX25leHR8fHlpPT09dGhpc3x8KHlpP3lpLl9uZXh0PXRoaXM6Z2k9dGhpcyx5aT10aGlzKSx0aGlzLl9jYWxsPXQsdGhpcy5fdGltZT1lLCRpKCl9LHN0b3A6ZnVuY3Rpb24oKXt0aGlzLl9jYWxsJiYodGhpcy5fY2FsbD1udWxsLHRoaXMuX3RpbWU9MS8wLCRpKCkpfX07dmFyIFJpPUR0KCJzdGFydCIsImVuZCIsImNhbmNlbCIsImludGVycnVwdCIpLEZpPVtdLHFpPTAsVWk9MSxJaT0yLE9pPTMsQmk9NCxZaT01LExpPTY7ZnVuY3Rpb24gamkodCxuLGUscixpLG8pe3ZhciBhPXQuX190cmFuc2l0aW9uO2lmKGEpe2lmKGUgaW4gYSlyZXR1cm59ZWxzZSB0Ll9fdHJhbnNpdGlvbj17fTshZnVuY3Rpb24odCxuLGUpe3ZhciByLGk9dC5fX3RyYW5zaXRpb247ZnVuY3Rpb24gbyh0KXtlLnN0YXRlPVVpLGUudGltZXIucmVzdGFydChhLGUuZGVsYXksZS50aW1lKSxlLmRlbGF5PD10JiZhKHQtZS5kZWxheSl9ZnVuY3Rpb24gYShvKXt2YXIgZixzLGwsaDtpZihlLnN0YXRlIT09VWkpcmV0dXJuIGMoKTtmb3IoZiBpbiBpKWlmKChoPWlbZl0pLm5hbWU9PT1lLm5hbWUpe2lmKGguc3RhdGU9PT1PaSlyZXR1cm4gRGkoYSk7aC5zdGF0ZT09PUJpPyhoLnN0YXRlPUxpLGgudGltZXIuc3RvcCgpLGgub24uY2FsbCgiaW50ZXJydXB0Iix0LHQuX19kYXRhX18saC5pbmRleCxoLmdyb3VwKSxkZWxldGUgaVtmXSk6K2Y8biYmKGguc3RhdGU9TGksaC50aW1lci5zdG9wKCksaC5vbi5jYWxsKCJjYW5jZWwiLHQsdC5fX2RhdGFfXyxoLmluZGV4LGguZ3JvdXApLGRlbGV0ZSBpW2ZdKX1pZihEaSgoZnVuY3Rpb24oKXtlLnN0YXRlPT09T2kmJihlLnN0YXRlPUJpLGUudGltZXIucmVzdGFydCh1LGUuZGVsYXksZS50aW1lKSx1KG8pKX0pKSxlLnN0YXRlPUlpLGUub24uY2FsbCgic3RhcnQiLHQsdC5fX2RhdGFfXyxlLmluZGV4LGUuZ3JvdXApLGUuc3RhdGU9PT1JaSl7Zm9yKGUuc3RhdGU9T2kscj1uZXcgQXJyYXkobD1lLnR3ZWVuLmxlbmd0aCksZj0wLHM9LTE7ZjxsOysrZikoaD1lLnR3ZWVuW2ZdLnZhbHVlLmNhbGwodCx0Ll9fZGF0YV9fLGUuaW5kZXgsZS5ncm91cCkpJiYoclsrK3NdPWgpO3IubGVuZ3RoPXMrMX19ZnVuY3Rpb24gdShuKXtmb3IodmFyIGk9bjxlLmR1cmF0aW9uP2UuZWFzZS5jYWxsKG51bGwsbi9lLmR1cmF0aW9uKTooZS50aW1lci5yZXN0YXJ0KGMpLGUuc3RhdGU9WWksMSksbz0tMSxhPXIubGVuZ3RoOysrbzxhOylyW29dLmNhbGwodCxpKTtlLnN0YXRlPT09WWkmJihlLm9uLmNhbGwoImVuZCIsdCx0Ll9fZGF0YV9fLGUuaW5kZXgsZS5ncm91cCksYygpKX1mdW5jdGlvbiBjKCl7Zm9yKHZhciByIGluIGUuc3RhdGU9TGksZS50aW1lci5zdG9wKCksZGVsZXRlIGlbbl0saSlyZXR1cm47ZGVsZXRlIHQuX190cmFuc2l0aW9ufWlbbl09ZSxlLnRpbWVyPWtpKG8sMCxlLnRpbWUpfSh0LGUse25hbWU6bixpbmRleDpyLGdyb3VwOmksb246UmksdHdlZW46RmksdGltZTpvLnRpbWUsZGVsYXk6by5kZWxheSxkdXJhdGlvbjpvLmR1cmF0aW9uLGVhc2U6by5lYXNlLHRpbWVyOm51bGwsc3RhdGU6cWl9KX1mdW5jdGlvbiBIaSh0LG4pe3ZhciBlPUdpKHQsbik7aWYoZS5zdGF0ZT5xaSl0aHJvdyBuZXcgRXJyb3IoInRvbyBsYXRlOyBhbHJlYWR5IHNjaGVkdWxlZCIpO3JldHVybiBlfWZ1bmN0aW9uIFhpKHQsbil7dmFyIGU9R2kodCxuKTtpZihlLnN0YXRlPk9pKXRocm93IG5ldyBFcnJvcigidG9vIGxhdGU7IGFscmVhZHkgcnVubmluZyIpO3JldHVybiBlfWZ1bmN0aW9uIEdpKHQsbil7dmFyIGU9dC5fX3RyYW5zaXRpb247aWYoIWV8fCEoZT1lW25dKSl0aHJvdyBuZXcgRXJyb3IoInRyYW5zaXRpb24gbm90IGZvdW5kIik7cmV0dXJuIGV9ZnVuY3Rpb24gVmkodCxuKXt2YXIgZSxyLGksbz10Ll9fdHJhbnNpdGlvbixhPSEwO2lmKG8pe2ZvcihpIGluIG49bnVsbD09bj9udWxsOm4rIiIsbykoZT1vW2ldKS5uYW1lPT09bj8ocj1lLnN0YXRlPklpJiZlLnN0YXRlPFlpLGUuc3RhdGU9TGksZS50aW1lci5zdG9wKCksZS5vbi5jYWxsKHI/ImludGVycnVwdCI6ImNhbmNlbCIsdCx0Ll9fZGF0YV9fLGUuaW5kZXgsZS5ncm91cCksZGVsZXRlIG9baV0pOmE9ITE7YSYmZGVsZXRlIHQuX190cmFuc2l0aW9ufX1mdW5jdGlvbiBXaSh0LG4pe3ZhciBlLHI7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGk9WGkodGhpcyx0KSxvPWkudHdlZW47aWYobyE9PWUpZm9yKHZhciBhPTAsdT0ocj1lPW8pLmxlbmd0aDthPHU7KythKWlmKHJbYV0ubmFtZT09PW4peyhyPXIuc2xpY2UoKSkuc3BsaWNlKGEsMSk7YnJlYWt9aS50d2Vlbj1yfX1mdW5jdGlvbiBaaSh0LG4sZSl7dmFyIHIsaTtpZigiZnVuY3Rpb24iIT10eXBlb2YgZSl0aHJvdyBuZXcgRXJyb3I7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG89WGkodGhpcyx0KSxhPW8udHdlZW47aWYoYSE9PXIpe2k9KHI9YSkuc2xpY2UoKTtmb3IodmFyIHU9e25hbWU6bix2YWx1ZTplfSxjPTAsZj1pLmxlbmd0aDtjPGY7KytjKWlmKGlbY10ubmFtZT09PW4pe2lbY109dTticmVha31jPT09ZiYmaS5wdXNoKHUpfW8udHdlZW49aX19ZnVuY3Rpb24gS2kodCxuLGUpe3ZhciByPXQuX2lkO3JldHVybiB0LmVhY2goKGZ1bmN0aW9uKCl7dmFyIHQ9WGkodGhpcyxyKTsodC52YWx1ZXx8KHQudmFsdWU9e30pKVtuXT1lLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0pKSxmdW5jdGlvbih0KXtyZXR1cm4gR2kodCxyKS52YWx1ZVtuXX19ZnVuY3Rpb24gUWkodCxuKXt2YXIgZTtyZXR1cm4oIm51bWJlciI9PXR5cGVvZiBuP0xyOm4gaW5zdGFuY2VvZiAkZT9ScjooZT0kZShuKSk/KG49ZSxScik6R3IpKHQsbil9ZnVuY3Rpb24gSmkodCl7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpcy5yZW1vdmVBdHRyaWJ1dGUodCl9fWZ1bmN0aW9uIHRvKHQpe3JldHVybiBmdW5jdGlvbigpe3RoaXMucmVtb3ZlQXR0cmlidXRlTlModC5zcGFjZSx0LmxvY2FsKX19ZnVuY3Rpb24gbm8odCxuLGUpe3ZhciByLGksbz1lKyIiO3JldHVybiBmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0QXR0cmlidXRlKHQpO3JldHVybiBhPT09bz9udWxsOmE9PT1yP2k6aT1uKHI9YSxlKX19ZnVuY3Rpb24gZW8odCxuLGUpe3ZhciByLGksbz1lKyIiO3JldHVybiBmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0QXR0cmlidXRlTlModC5zcGFjZSx0LmxvY2FsKTtyZXR1cm4gYT09PW8/bnVsbDphPT09cj9pOmk9bihyPWEsZSl9fWZ1bmN0aW9uIHJvKHQsbixlKXt2YXIgcixpLG87cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGEsdSxjPWUodGhpcyk7aWYobnVsbCE9YylyZXR1cm4oYT10aGlzLmdldEF0dHJpYnV0ZSh0KSk9PT0odT1jKyIiKT9udWxsOmE9PT1yJiZ1PT09aT9vOihpPXUsbz1uKHI9YSxjKSk7dGhpcy5yZW1vdmVBdHRyaWJ1dGUodCl9fWZ1bmN0aW9uIGlvKHQsbixlKXt2YXIgcixpLG87cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGEsdSxjPWUodGhpcyk7aWYobnVsbCE9YylyZXR1cm4oYT10aGlzLmdldEF0dHJpYnV0ZU5TKHQuc3BhY2UsdC5sb2NhbCkpPT09KHU9YysiIik/bnVsbDphPT09ciYmdT09PWk/bzooaT11LG89bihyPWEsYykpO3RoaXMucmVtb3ZlQXR0cmlidXRlTlModC5zcGFjZSx0LmxvY2FsKX19ZnVuY3Rpb24gb28odCxuKXt2YXIgZSxyO2Z1bmN0aW9uIGkoKXt2YXIgaT1uLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtyZXR1cm4gaSE9PXImJihlPShyPWkpJiZmdW5jdGlvbih0LG4pe3JldHVybiBmdW5jdGlvbihlKXt0aGlzLnNldEF0dHJpYnV0ZU5TKHQuc3BhY2UsdC5sb2NhbCxuLmNhbGwodGhpcyxlKSl9fSh0LGkpKSxlfXJldHVybiBpLl92YWx1ZT1uLGl9ZnVuY3Rpb24gYW8odCxuKXt2YXIgZSxyO2Z1bmN0aW9uIGkoKXt2YXIgaT1uLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtyZXR1cm4gaSE9PXImJihlPShyPWkpJiZmdW5jdGlvbih0LG4pe3JldHVybiBmdW5jdGlvbihlKXt0aGlzLnNldEF0dHJpYnV0ZSh0LG4uY2FsbCh0aGlzLGUpKX19KHQsaSkpLGV9cmV0dXJuIGkuX3ZhbHVlPW4saX1mdW5jdGlvbiB1byh0LG4pe3JldHVybiBmdW5jdGlvbigpe0hpKHRoaXMsdCkuZGVsYXk9K24uYXBwbHkodGhpcyxhcmd1bWVudHMpfX1mdW5jdGlvbiBjbyh0LG4pe3JldHVybiBuPStuLGZ1bmN0aW9uKCl7SGkodGhpcyx0KS5kZWxheT1ufX1mdW5jdGlvbiBmbyh0LG4pe3JldHVybiBmdW5jdGlvbigpe1hpKHRoaXMsdCkuZHVyYXRpb249K24uYXBwbHkodGhpcyxhcmd1bWVudHMpfX1mdW5jdGlvbiBzbyh0LG4pe3JldHVybiBuPStuLGZ1bmN0aW9uKCl7WGkodGhpcyx0KS5kdXJhdGlvbj1ufX12YXIgbG89Wm4ucHJvdG90eXBlLmNvbnN0cnVjdG9yO2Z1bmN0aW9uIGhvKHQpe3JldHVybiBmdW5jdGlvbigpe3RoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkodCl9fXZhciBwbz0wO2Z1bmN0aW9uIGdvKHQsbixlLHIpe3RoaXMuX2dyb3Vwcz10LHRoaXMuX3BhcmVudHM9bix0aGlzLl9uYW1lPWUsdGhpcy5faWQ9cn1mdW5jdGlvbiB5byh0KXtyZXR1cm4gWm4oKS50cmFuc2l0aW9uKHQpfWZ1bmN0aW9uIHZvKCl7cmV0dXJuKytwb312YXIgX289Wm4ucHJvdG90eXBlO2dvLnByb3RvdHlwZT15by5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOmdvLHNlbGVjdDpmdW5jdGlvbih0KXt2YXIgbj10aGlzLl9uYW1lLGU9dGhpcy5faWQ7ImZ1bmN0aW9uIiE9dHlwZW9mIHQmJih0PUh0KHQpKTtmb3IodmFyIHI9dGhpcy5fZ3JvdXBzLGk9ci5sZW5ndGgsbz1uZXcgQXJyYXkoaSksYT0wO2E8aTsrK2EpZm9yKHZhciB1LGMsZj1yW2FdLHM9Zi5sZW5ndGgsbD1vW2FdPW5ldyBBcnJheShzKSxoPTA7aDxzOysraCkodT1mW2hdKSYmKGM9dC5jYWxsKHUsdS5fX2RhdGFfXyxoLGYpKSYmKCJfX2RhdGFfXyJpbiB1JiYoYy5fX2RhdGFfXz11Ll9fZGF0YV9fKSxsW2hdPWMsamkobFtoXSxuLGUsaCxsLEdpKHUsZSkpKTtyZXR1cm4gbmV3IGdvKG8sdGhpcy5fcGFyZW50cyxuLGUpfSxzZWxlY3RBbGw6ZnVuY3Rpb24odCl7dmFyIG49dGhpcy5fbmFtZSxlPXRoaXMuX2lkOyJmdW5jdGlvbiIhPXR5cGVvZiB0JiYodD1WdCh0KSk7Zm9yKHZhciByPXRoaXMuX2dyb3VwcyxpPXIubGVuZ3RoLG89W10sYT1bXSx1PTA7dTxpOysrdSlmb3IodmFyIGMsZj1yW3VdLHM9Zi5sZW5ndGgsbD0wO2w8czsrK2wpaWYoYz1mW2xdKXtmb3IodmFyIGgsZD10LmNhbGwoYyxjLl9fZGF0YV9fLGwsZikscD1HaShjLGUpLGc9MCx5PWQubGVuZ3RoO2c8eTsrK2cpKGg9ZFtnXSkmJmppKGgsbixlLGcsZCxwKTtvLnB1c2goZCksYS5wdXNoKGMpfXJldHVybiBuZXcgZ28obyxhLG4sZSl9LHNlbGVjdENoaWxkOl9vLnNlbGVjdENoaWxkLHNlbGVjdENoaWxkcmVuOl9vLnNlbGVjdENoaWxkcmVuLGZpbHRlcjpmdW5jdGlvbih0KXsiZnVuY3Rpb24iIT10eXBlb2YgdCYmKHQ9V3QodCkpO2Zvcih2YXIgbj10aGlzLl9ncm91cHMsZT1uLmxlbmd0aCxyPW5ldyBBcnJheShlKSxpPTA7aTxlOysraSlmb3IodmFyIG8sYT1uW2ldLHU9YS5sZW5ndGgsYz1yW2ldPVtdLGY9MDtmPHU7KytmKShvPWFbZl0pJiZ0LmNhbGwobyxvLl9fZGF0YV9fLGYsYSkmJmMucHVzaChvKTtyZXR1cm4gbmV3IGdvKHIsdGhpcy5fcGFyZW50cyx0aGlzLl9uYW1lLHRoaXMuX2lkKX0sbWVyZ2U6ZnVuY3Rpb24odCl7aWYodC5faWQhPT10aGlzLl9pZCl0aHJvdyBuZXcgRXJyb3I7Zm9yKHZhciBuPXRoaXMuX2dyb3VwcyxlPXQuX2dyb3VwcyxyPW4ubGVuZ3RoLGk9ZS5sZW5ndGgsbz1NYXRoLm1pbihyLGkpLGE9bmV3IEFycmF5KHIpLHU9MDt1PG87Kyt1KWZvcih2YXIgYyxmPW5bdV0scz1lW3VdLGw9Zi5sZW5ndGgsaD1hW3VdPW5ldyBBcnJheShsKSxkPTA7ZDxsOysrZCkoYz1mW2RdfHxzW2RdKSYmKGhbZF09Yyk7Zm9yKDt1PHI7Kyt1KWFbdV09blt1XTtyZXR1cm4gbmV3IGdvKGEsdGhpcy5fcGFyZW50cyx0aGlzLl9uYW1lLHRoaXMuX2lkKX0sc2VsZWN0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBsbyh0aGlzLl9ncm91cHMsdGhpcy5fcGFyZW50cyl9LHRyYW5zaXRpb246ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpcy5fbmFtZSxuPXRoaXMuX2lkLGU9dm8oKSxyPXRoaXMuX2dyb3VwcyxpPXIubGVuZ3RoLG89MDtvPGk7KytvKWZvcih2YXIgYSx1PXJbb10sYz11Lmxlbmd0aCxmPTA7ZjxjOysrZilpZihhPXVbZl0pe3ZhciBzPUdpKGEsbik7amkoYSx0LGUsZix1LHt0aW1lOnMudGltZStzLmRlbGF5K3MuZHVyYXRpb24sZGVsYXk6MCxkdXJhdGlvbjpzLmR1cmF0aW9uLGVhc2U6cy5lYXNlfSl9cmV0dXJuIG5ldyBnbyhyLHRoaXMuX3BhcmVudHMsdCxlKX0sY2FsbDpfby5jYWxsLG5vZGVzOl9vLm5vZGVzLG5vZGU6X28ubm9kZSxzaXplOl9vLnNpemUsZW1wdHk6X28uZW1wdHksZWFjaDpfby5lYWNoLG9uOmZ1bmN0aW9uKHQsbil7dmFyIGU9dGhpcy5faWQ7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg8Mj9HaSh0aGlzLm5vZGUoKSxlKS5vbi5vbih0KTp0aGlzLmVhY2goZnVuY3Rpb24odCxuLGUpe3ZhciByLGksbz1mdW5jdGlvbih0KXtyZXR1cm4odCsiIikudHJpbSgpLnNwbGl0KC9efFxzKy8pLmV2ZXJ5KChmdW5jdGlvbih0KXt2YXIgbj10LmluZGV4T2YoIi4iKTtyZXR1cm4gbj49MCYmKHQ9dC5zbGljZSgwLG4pKSwhdHx8InN0YXJ0Ij09PXR9KSl9KG4pP0hpOlhpO3JldHVybiBmdW5jdGlvbigpe3ZhciBhPW8odGhpcyx0KSx1PWEub247dSE9PXImJihpPShyPXUpLmNvcHkoKSkub24obixlKSxhLm9uPWl9fShlLHQsbikpfSxhdHRyOmZ1bmN0aW9uKHQsbil7dmFyIGU9T3QodCkscj0idHJhbnNmb3JtIj09PWU/ZWk6UWk7cmV0dXJuIHRoaXMuYXR0clR3ZWVuKHQsImZ1bmN0aW9uIj09dHlwZW9mIG4/KGUubG9jYWw/aW86cm8pKGUscixLaSh0aGlzLCJhdHRyLiIrdCxuKSk6bnVsbD09bj8oZS5sb2NhbD90bzpKaSkoZSk6KGUubG9jYWw/ZW86bm8pKGUscixuKSl9LGF0dHJUd2VlbjpmdW5jdGlvbih0LG4pe3ZhciBlPSJhdHRyLiIrdDtpZihhcmd1bWVudHMubGVuZ3RoPDIpcmV0dXJuKGU9dGhpcy50d2VlbihlKSkmJmUuX3ZhbHVlO2lmKG51bGw9PW4pcmV0dXJuIHRoaXMudHdlZW4oZSxudWxsKTtpZigiZnVuY3Rpb24iIT10eXBlb2Ygbil0aHJvdyBuZXcgRXJyb3I7dmFyIHI9T3QodCk7cmV0dXJuIHRoaXMudHdlZW4oZSwoci5sb2NhbD9vbzphbykocixuKSl9LHN0eWxlOmZ1bmN0aW9uKHQsbixlKXt2YXIgcj0idHJhbnNmb3JtIj09KHQrPSIiKT9uaTpRaTtyZXR1cm4gbnVsbD09bj90aGlzLnN0eWxlVHdlZW4odCxmdW5jdGlvbih0LG4pe3ZhciBlLHIsaTtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbz1ibih0aGlzLHQpLGE9KHRoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkodCksYm4odGhpcyx0KSk7cmV0dXJuIG89PT1hP251bGw6bz09PWUmJmE9PT1yP2k6aT1uKGU9byxyPWEpfX0odCxyKSkub24oImVuZC5zdHlsZS4iK3QsaG8odCkpOiJmdW5jdGlvbiI9PXR5cGVvZiBuP3RoaXMuc3R5bGVUd2Vlbih0LGZ1bmN0aW9uKHQsbixlKXt2YXIgcixpLG87cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGE9Ym4odGhpcyx0KSx1PWUodGhpcyksYz11KyIiO3JldHVybiBudWxsPT11JiYodGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eSh0KSxjPXU9Ym4odGhpcyx0KSksYT09PWM/bnVsbDphPT09ciYmYz09PWk/bzooaT1jLG89bihyPWEsdSkpfX0odCxyLEtpKHRoaXMsInN0eWxlLiIrdCxuKSkpLmVhY2goZnVuY3Rpb24odCxuKXt2YXIgZSxyLGksbyxhPSJzdHlsZS4iK24sdT0iZW5kLiIrYTtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgYz1YaSh0aGlzLHQpLGY9Yy5vbixzPW51bGw9PWMudmFsdWVbYV0/b3x8KG89aG8obikpOnZvaWQgMDtmPT09ZSYmaT09PXN8fChyPShlPWYpLmNvcHkoKSkub24odSxpPXMpLGMub249cn19KHRoaXMuX2lkLHQpKTp0aGlzLnN0eWxlVHdlZW4odCxmdW5jdGlvbih0LG4sZSl7dmFyIHIsaSxvPWUrIiI7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGE9Ym4odGhpcyx0KTtyZXR1cm4gYT09PW8/bnVsbDphPT09cj9pOmk9bihyPWEsZSl9fSh0LHIsbiksZSkub24oImVuZC5zdHlsZS4iK3QsbnVsbCl9LHN0eWxlVHdlZW46ZnVuY3Rpb24odCxuLGUpe3ZhciByPSJzdHlsZS4iKyh0Kz0iIik7aWYoYXJndW1lbnRzLmxlbmd0aDwyKXJldHVybihyPXRoaXMudHdlZW4ocikpJiZyLl92YWx1ZTtpZihudWxsPT1uKXJldHVybiB0aGlzLnR3ZWVuKHIsbnVsbCk7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIG4pdGhyb3cgbmV3IEVycm9yO3JldHVybiB0aGlzLnR3ZWVuKHIsZnVuY3Rpb24odCxuLGUpe3ZhciByLGk7ZnVuY3Rpb24gbygpe3ZhciBvPW4uYXBwbHkodGhpcyxhcmd1bWVudHMpO3JldHVybiBvIT09aSYmKHI9KGk9bykmJmZ1bmN0aW9uKHQsbixlKXtyZXR1cm4gZnVuY3Rpb24ocil7dGhpcy5zdHlsZS5zZXRQcm9wZXJ0eSh0LG4uY2FsbCh0aGlzLHIpLGUpfX0odCxvLGUpKSxyfXJldHVybiBvLl92YWx1ZT1uLG99KHQsbixudWxsPT1lPyIiOmUpKX0sdGV4dDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy50d2VlbigidGV4dCIsImZ1bmN0aW9uIj09dHlwZW9mIHQ/ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG49dCh0aGlzKTt0aGlzLnRleHRDb250ZW50PW51bGw9PW4/IiI6bn19KEtpKHRoaXMsInRleHQiLHQpKTpmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLnRleHRDb250ZW50PXR9fShudWxsPT10PyIiOnQrIiIpKX0sdGV4dFR3ZWVuOmZ1bmN0aW9uKHQpe3ZhciBuPSJ0ZXh0IjtpZihhcmd1bWVudHMubGVuZ3RoPDEpcmV0dXJuKG49dGhpcy50d2VlbihuKSkmJm4uX3ZhbHVlO2lmKG51bGw9PXQpcmV0dXJuIHRoaXMudHdlZW4obixudWxsKTtpZigiZnVuY3Rpb24iIT10eXBlb2YgdCl0aHJvdyBuZXcgRXJyb3I7cmV0dXJuIHRoaXMudHdlZW4obixmdW5jdGlvbih0KXt2YXIgbixlO2Z1bmN0aW9uIHIoKXt2YXIgcj10LmFwcGx5KHRoaXMsYXJndW1lbnRzKTtyZXR1cm4gciE9PWUmJihuPShlPXIpJiZmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24obil7dGhpcy50ZXh0Q29udGVudD10LmNhbGwodGhpcyxuKX19KHIpKSxufXJldHVybiByLl92YWx1ZT10LHJ9KHQpKX0scmVtb3ZlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub24oImVuZC5yZW1vdmUiLGZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3ZhciBuPXRoaXMucGFyZW50Tm9kZTtmb3IodmFyIGUgaW4gdGhpcy5fX3RyYW5zaXRpb24paWYoK2UhPT10KXJldHVybjtuJiZuLnJlbW92ZUNoaWxkKHRoaXMpfX0odGhpcy5faWQpKX0sdHdlZW46ZnVuY3Rpb24odCxuKXt2YXIgZT10aGlzLl9pZDtpZih0Kz0iIixhcmd1bWVudHMubGVuZ3RoPDIpe2Zvcih2YXIgcixpPUdpKHRoaXMubm9kZSgpLGUpLnR3ZWVuLG89MCxhPWkubGVuZ3RoO288YTsrK28paWYoKHI9aVtvXSkubmFtZT09PXQpcmV0dXJuIHIudmFsdWU7cmV0dXJuIG51bGx9cmV0dXJuIHRoaXMuZWFjaCgobnVsbD09bj9XaTpaaSkoZSx0LG4pKX0sZGVsYXk6ZnVuY3Rpb24odCl7dmFyIG49dGhpcy5faWQ7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dGhpcy5lYWNoKCgiZnVuY3Rpb24iPT10eXBlb2YgdD91bzpjbykobix0KSk6R2kodGhpcy5ub2RlKCksbikuZGVsYXl9LGR1cmF0aW9uOmZ1bmN0aW9uKHQpe3ZhciBuPXRoaXMuX2lkO3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3RoaXMuZWFjaCgoImZ1bmN0aW9uIj09dHlwZW9mIHQ/Zm86c28pKG4sdCkpOkdpKHRoaXMubm9kZSgpLG4pLmR1cmF0aW9ufSxlYXNlOmZ1bmN0aW9uKHQpe3ZhciBuPXRoaXMuX2lkO3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3RoaXMuZWFjaChmdW5jdGlvbih0LG4pe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBuKXRocm93IG5ldyBFcnJvcjtyZXR1cm4gZnVuY3Rpb24oKXtYaSh0aGlzLHQpLmVhc2U9bn19KG4sdCkpOkdpKHRoaXMubm9kZSgpLG4pLmVhc2V9LGVhc2VWYXJ5aW5nOmZ1bmN0aW9uKHQpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0KXRocm93IG5ldyBFcnJvcjtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKHQsbil7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGU9bi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIGUpdGhyb3cgbmV3IEVycm9yO1hpKHRoaXMsdCkuZWFzZT1lfX0odGhpcy5faWQsdCkpfSxlbmQ6ZnVuY3Rpb24oKXt2YXIgdCxuLGU9dGhpcyxyPWUuX2lkLGk9ZS5zaXplKCk7cmV0dXJuIG5ldyBQcm9taXNlKChmdW5jdGlvbihvLGEpe3ZhciB1PXt2YWx1ZTphfSxjPXt2YWx1ZTpmdW5jdGlvbigpezA9PS0taSYmbygpfX07ZS5lYWNoKChmdW5jdGlvbigpe3ZhciBlPVhpKHRoaXMsciksaT1lLm9uO2khPT10JiYoKG49KHQ9aSkuY29weSgpKS5fLmNhbmNlbC5wdXNoKHUpLG4uXy5pbnRlcnJ1cHQucHVzaCh1KSxuLl8uZW5kLnB1c2goYykpLGUub249bn0pKSwwPT09aSYmbygpfSkpfSxbU3ltYm9sLml0ZXJhdG9yXTpfb1tTeW1ib2wuaXRlcmF0b3JdfTtmdW5jdGlvbiBibyh0KXtyZXR1cm4oKHQqPTIpPD0xP3QqdDotLXQqKDItdCkrMSkvMn1mdW5jdGlvbiBtbyh0KXtyZXR1cm4oKHQqPTIpPD0xP3QqdCp0Oih0LT0yKSp0KnQrMikvMn12YXIgeG89ZnVuY3Rpb24gdChuKXtmdW5jdGlvbiBlKHQpe3JldHVybiBNYXRoLnBvdyh0LG4pfXJldHVybiBuPStuLGUuZXhwb25lbnQ9dCxlfSgzKSx3bz1mdW5jdGlvbiB0KG4pe2Z1bmN0aW9uIGUodCl7cmV0dXJuIDEtTWF0aC5wb3coMS10LG4pfXJldHVybiBuPStuLGUuZXhwb25lbnQ9dCxlfSgzKSxNbz1mdW5jdGlvbiB0KG4pe2Z1bmN0aW9uIGUodCl7cmV0dXJuKCh0Kj0yKTw9MT9NYXRoLnBvdyh0LG4pOjItTWF0aC5wb3coMi10LG4pKS8yfXJldHVybiBuPStuLGUuZXhwb25lbnQ9dCxlfSgzKSxUbz1NYXRoLlBJLEFvPVRvLzI7ZnVuY3Rpb24gU28odCl7cmV0dXJuKDEtTWF0aC5jb3MoVG8qdCkpLzJ9ZnVuY3Rpb24gRW8odCl7cmV0dXJuIDEuMDAwOTc3NTE3MTA2NTQ5NCooTWF0aC5wb3coMiwtMTAqdCktLjAwMDk3NjU2MjUpfWZ1bmN0aW9uIE5vKHQpe3JldHVybigodCo9Mik8PTE/RW8oMS10KToyLUVvKHQtMSkpLzJ9ZnVuY3Rpb24ga28odCl7cmV0dXJuKCh0Kj0yKTw9MT8xLU1hdGguc3FydCgxLXQqdCk6TWF0aC5zcXJ0KDEtKHQtPTIpKnQpKzEpLzJ9dmFyIENvPTQvMTEsUG89Ni8xMSx6bz04LzExLCRvPTMvNCxEbz05LzExLFJvPTEwLzExLEZvPTE1LzE2LHFvPTIxLzIyLFVvPTYzLzY0LElvPTEvQ28vQ287ZnVuY3Rpb24gT28odCl7cmV0dXJuKHQ9K3QpPENvP0lvKnQqdDp0PHpvP0lvKih0LT1QbykqdCskbzp0PFJvP0lvKih0LT1EbykqdCtGbzpJbyoodC09cW8pKnQrVW99dmFyIEJvPTEuNzAxNTgsWW89ZnVuY3Rpb24gdChuKXtmdW5jdGlvbiBlKHQpe3JldHVybih0PSt0KSp0KihuKih0LTEpK3QpfXJldHVybiBuPStuLGUub3ZlcnNob290PXQsZX0oQm8pLExvPWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0KXtyZXR1cm4tLXQqdCooKHQrMSkqbit0KSsxfXJldHVybiBuPStuLGUub3ZlcnNob290PXQsZX0oQm8pLGpvPWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0KXtyZXR1cm4oKHQqPTIpPDE/dCp0KigobisxKSp0LW4pOih0LT0yKSp0KigobisxKSp0K24pKzIpLzJ9cmV0dXJuIG49K24sZS5vdmVyc2hvb3Q9dCxlfShCbyksSG89MipNYXRoLlBJLFhvPWZ1bmN0aW9uIHQobixlKXt2YXIgcj1NYXRoLmFzaW4oMS8obj1NYXRoLm1heCgxLG4pKSkqKGUvPUhvKTtmdW5jdGlvbiBpKHQpe3JldHVybiBuKkVvKC0gLS10KSpNYXRoLnNpbigoci10KS9lKX1yZXR1cm4gaS5hbXBsaXR1ZGU9ZnVuY3Rpb24obil7cmV0dXJuIHQobixlKkhvKX0saS5wZXJpb2Q9ZnVuY3Rpb24oZSl7cmV0dXJuIHQobixlKX0saX0oMSwuMyksR289ZnVuY3Rpb24gdChuLGUpe3ZhciByPU1hdGguYXNpbigxLyhuPU1hdGgubWF4KDEsbikpKSooZS89SG8pO2Z1bmN0aW9uIGkodCl7cmV0dXJuIDEtbipFbyh0PSt0KSpNYXRoLnNpbigodCtyKS9lKX1yZXR1cm4gaS5hbXBsaXR1ZGU9ZnVuY3Rpb24obil7cmV0dXJuIHQobixlKkhvKX0saS5wZXJpb2Q9ZnVuY3Rpb24oZSl7cmV0dXJuIHQobixlKX0saX0oMSwuMyksVm89ZnVuY3Rpb24gdChuLGUpe3ZhciByPU1hdGguYXNpbigxLyhuPU1hdGgubWF4KDEsbikpKSooZS89SG8pO2Z1bmN0aW9uIGkodCl7cmV0dXJuKCh0PTIqdC0xKTwwP24qRW8oLXQpKk1hdGguc2luKChyLXQpL2UpOjItbipFbyh0KSpNYXRoLnNpbigocit0KS9lKSkvMn1yZXR1cm4gaS5hbXBsaXR1ZGU9ZnVuY3Rpb24obil7cmV0dXJuIHQobixlKkhvKX0saS5wZXJpb2Q9ZnVuY3Rpb24oZSl7cmV0dXJuIHQobixlKX0saX0oMSwuMyksV289e3RpbWU6bnVsbCxkZWxheTowLGR1cmF0aW9uOjI1MCxlYXNlOm1vfTtmdW5jdGlvbiBabyh0LG4pe2Zvcih2YXIgZTshKGU9dC5fX3RyYW5zaXRpb24pfHwhKGU9ZVtuXSk7KWlmKCEodD10LnBhcmVudE5vZGUpKXRocm93IG5ldyBFcnJvcihgdHJhbnNpdGlvbiAke259IG5vdCBmb3VuZGApO3JldHVybiBlfVpuLnByb3RvdHlwZS5pbnRlcnJ1cHQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZWFjaCgoZnVuY3Rpb24oKXtWaSh0aGlzLHQpfSkpfSxabi5wcm90b3R5cGUudHJhbnNpdGlvbj1mdW5jdGlvbih0KXt2YXIgbixlO3QgaW5zdGFuY2VvZiBnbz8obj10Ll9pZCx0PXQuX25hbWUpOihuPXZvKCksKGU9V28pLnRpbWU9U2koKSx0PW51bGw9PXQ/bnVsbDp0KyIiKTtmb3IodmFyIHI9dGhpcy5fZ3JvdXBzLGk9ci5sZW5ndGgsbz0wO288aTsrK28pZm9yKHZhciBhLHU9cltvXSxjPXUubGVuZ3RoLGY9MDtmPGM7KytmKShhPXVbZl0pJiZqaShhLHQsbixmLHUsZXx8Wm8oYSxuKSk7cmV0dXJuIG5ldyBnbyhyLHRoaXMuX3BhcmVudHMsdCxuKX07dmFyIEtvPVtudWxsXTt2YXIgUW89dD0+KCk9PnQ7ZnVuY3Rpb24gSm8odCx7c291cmNlRXZlbnQ6bix0YXJnZXQ6ZSxzZWxlY3Rpb246cixtb2RlOmksZGlzcGF0Y2g6b30pe09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRoaXMse3R5cGU6e3ZhbHVlOnQsZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9LHNvdXJjZUV2ZW50Ont2YWx1ZTpuLGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSx0YXJnZXQ6e3ZhbHVlOmUsZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9LHNlbGVjdGlvbjp7dmFsdWU6cixlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0sbW9kZTp7dmFsdWU6aSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0sXzp7dmFsdWU6b319KX1mdW5jdGlvbiB0YSh0KXt0LnByZXZlbnREZWZhdWx0KCksdC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKX12YXIgbmE9e25hbWU6ImRyYWcifSxlYT17bmFtZToic3BhY2UifSxyYT17bmFtZToiaGFuZGxlIn0saWE9e25hbWU6ImNlbnRlciJ9O2NvbnN0e2FiczpvYSxtYXg6YWEsbWluOnVhfT1NYXRoO2Z1bmN0aW9uIGNhKHQpe3JldHVyblsrdFswXSwrdFsxXV19ZnVuY3Rpb24gZmEodCl7cmV0dXJuW2NhKHRbMF0pLGNhKHRbMV0pXX12YXIgc2E9e25hbWU6IngiLGhhbmRsZXM6WyJ3IiwiZSJdLm1hcChfYSksaW5wdXQ6ZnVuY3Rpb24odCxuKXtyZXR1cm4gbnVsbD09dD9udWxsOltbK3RbMF0sblswXVsxXV0sWyt0WzFdLG5bMV1bMV1dXX0sb3V0cHV0OmZ1bmN0aW9uKHQpe3JldHVybiB0JiZbdFswXVswXSx0WzFdWzBdXX19LGxhPXtuYW1lOiJ5IixoYW5kbGVzOlsibiIsInMiXS5tYXAoX2EpLGlucHV0OmZ1bmN0aW9uKHQsbil7cmV0dXJuIG51bGw9PXQ/bnVsbDpbW25bMF1bMF0sK3RbMF1dLFtuWzFdWzBdLCt0WzFdXV19LG91dHB1dDpmdW5jdGlvbih0KXtyZXR1cm4gdCYmW3RbMF1bMV0sdFsxXVsxXV19fSxoYT17bmFtZToieHkiLGhhbmRsZXM6WyJuIiwidyIsImUiLCJzIiwibnciLCJuZSIsInN3Iiwic2UiXS5tYXAoX2EpLGlucHV0OmZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10P251bGw6ZmEodCl9LG91dHB1dDpmdW5jdGlvbih0KXtyZXR1cm4gdH19LGRhPXtvdmVybGF5OiJjcm9zc2hhaXIiLHNlbGVjdGlvbjoibW92ZSIsbjoibnMtcmVzaXplIixlOiJldy1yZXNpemUiLHM6Im5zLXJlc2l6ZSIsdzoiZXctcmVzaXplIixudzoibndzZS1yZXNpemUiLG5lOiJuZXN3LXJlc2l6ZSIsc2U6Im53c2UtcmVzaXplIixzdzoibmVzdy1yZXNpemUifSxwYT17ZToidyIsdzoiZSIsbnc6Im5lIixuZToibnciLHNlOiJzdyIsc3c6InNlIn0sZ2E9e246InMiLHM6Im4iLG53OiJzdyIsbmU6InNlIixzZToibmUiLHN3OiJudyJ9LHlhPXtvdmVybGF5OjEsc2VsZWN0aW9uOjEsbjpudWxsLGU6MSxzOm51bGwsdzotMSxudzotMSxuZToxLHNlOjEsc3c6LTF9LHZhPXtvdmVybGF5OjEsc2VsZWN0aW9uOjEsbjotMSxlOm51bGwsczoxLHc6bnVsbCxudzotMSxuZTotMSxzZToxLHN3OjF9O2Z1bmN0aW9uIF9hKHQpe3JldHVybnt0eXBlOnR9fWZ1bmN0aW9uIGJhKHQpe3JldHVybiF0LmN0cmxLZXkmJiF0LmJ1dHRvbn1mdW5jdGlvbiBtYSgpe3ZhciB0PXRoaXMub3duZXJTVkdFbGVtZW50fHx0aGlzO3JldHVybiB0Lmhhc0F0dHJpYnV0ZSgidmlld0JveCIpP1tbKHQ9dC52aWV3Qm94LmJhc2VWYWwpLngsdC55XSxbdC54K3Qud2lkdGgsdC55K3QuaGVpZ2h0XV06W1swLDBdLFt0LndpZHRoLmJhc2VWYWwudmFsdWUsdC5oZWlnaHQuYmFzZVZhbC52YWx1ZV1dfWZ1bmN0aW9uIHhhKCl7cmV0dXJuIG5hdmlnYXRvci5tYXhUb3VjaFBvaW50c3x8Im9udG91Y2hzdGFydCJpbiB0aGlzfWZ1bmN0aW9uIHdhKHQpe2Zvcig7IXQuX19icnVzaDspaWYoISh0PXQucGFyZW50Tm9kZSkpcmV0dXJuO3JldHVybiB0Ll9fYnJ1c2h9ZnVuY3Rpb24gTWEodCl7dmFyIG4sZT1tYSxyPWJhLGk9eGEsbz0hMCxhPUR0KCJzdGFydCIsImJydXNoIiwiZW5kIiksdT02O2Z1bmN0aW9uIGMobil7dmFyIGU9bi5wcm9wZXJ0eSgiX19icnVzaCIsZykuc2VsZWN0QWxsKCIub3ZlcmxheSIpLmRhdGEoW19hKCJvdmVybGF5IildKTtlLmVudGVyKCkuYXBwZW5kKCJyZWN0IikuYXR0cigiY2xhc3MiLCJvdmVybGF5IikuYXR0cigicG9pbnRlci1ldmVudHMiLCJhbGwiKS5hdHRyKCJjdXJzb3IiLGRhLm92ZXJsYXkpLm1lcmdlKGUpLmVhY2goKGZ1bmN0aW9uKCl7dmFyIHQ9d2EodGhpcykuZXh0ZW50O0tuKHRoaXMpLmF0dHIoIngiLHRbMF1bMF0pLmF0dHIoInkiLHRbMF1bMV0pLmF0dHIoIndpZHRoIix0WzFdWzBdLXRbMF1bMF0pLmF0dHIoImhlaWdodCIsdFsxXVsxXS10WzBdWzFdKX0pKSxuLnNlbGVjdEFsbCgiLnNlbGVjdGlvbiIpLmRhdGEoW19hKCJzZWxlY3Rpb24iKV0pLmVudGVyKCkuYXBwZW5kKCJyZWN0IikuYXR0cigiY2xhc3MiLCJzZWxlY3Rpb24iKS5hdHRyKCJjdXJzb3IiLGRhLnNlbGVjdGlvbikuYXR0cigiZmlsbCIsIiM3NzciKS5hdHRyKCJmaWxsLW9wYWNpdHkiLC4zKS5hdHRyKCJzdHJva2UiLCIjZmZmIikuYXR0cigic2hhcGUtcmVuZGVyaW5nIiwiY3Jpc3BFZGdlcyIpO3ZhciByPW4uc2VsZWN0QWxsKCIuaGFuZGxlIikuZGF0YSh0LmhhbmRsZXMsKGZ1bmN0aW9uKHQpe3JldHVybiB0LnR5cGV9KSk7ci5leGl0KCkucmVtb3ZlKCksci5lbnRlcigpLmFwcGVuZCgicmVjdCIpLmF0dHIoImNsYXNzIiwoZnVuY3Rpb24odCl7cmV0dXJuImhhbmRsZSBoYW5kbGUtLSIrdC50eXBlfSkpLmF0dHIoImN1cnNvciIsKGZ1bmN0aW9uKHQpe3JldHVybiBkYVt0LnR5cGVdfSkpLG4uZWFjaChmKS5hdHRyKCJmaWxsIiwibm9uZSIpLmF0dHIoInBvaW50ZXItZXZlbnRzIiwiYWxsIikub24oIm1vdXNlZG93bi5icnVzaCIsaCkuZmlsdGVyKGkpLm9uKCJ0b3VjaHN0YXJ0LmJydXNoIixoKS5vbigidG91Y2htb3ZlLmJydXNoIixkKS5vbigidG91Y2hlbmQuYnJ1c2ggdG91Y2hjYW5jZWwuYnJ1c2giLHApLnN0eWxlKCJ0b3VjaC1hY3Rpb24iLCJub25lIikuc3R5bGUoIi13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvciIsInJnYmEoMCwwLDAsMCkiKX1mdW5jdGlvbiBmKCl7dmFyIHQ9S24odGhpcyksbj13YSh0aGlzKS5zZWxlY3Rpb247bj8odC5zZWxlY3RBbGwoIi5zZWxlY3Rpb24iKS5zdHlsZSgiZGlzcGxheSIsbnVsbCkuYXR0cigieCIsblswXVswXSkuYXR0cigieSIsblswXVsxXSkuYXR0cigid2lkdGgiLG5bMV1bMF0tblswXVswXSkuYXR0cigiaGVpZ2h0IixuWzFdWzFdLW5bMF1bMV0pLHQuc2VsZWN0QWxsKCIuaGFuZGxlIikuc3R5bGUoImRpc3BsYXkiLG51bGwpLmF0dHIoIngiLChmdW5jdGlvbih0KXtyZXR1cm4iZSI9PT10LnR5cGVbdC50eXBlLmxlbmd0aC0xXT9uWzFdWzBdLXUvMjpuWzBdWzBdLXUvMn0pKS5hdHRyKCJ5IiwoZnVuY3Rpb24odCl7cmV0dXJuInMiPT09dC50eXBlWzBdP25bMV1bMV0tdS8yOm5bMF1bMV0tdS8yfSkpLmF0dHIoIndpZHRoIiwoZnVuY3Rpb24odCl7cmV0dXJuIm4iPT09dC50eXBlfHwicyI9PT10LnR5cGU/blsxXVswXS1uWzBdWzBdK3U6dX0pKS5hdHRyKCJoZWlnaHQiLChmdW5jdGlvbih0KXtyZXR1cm4iZSI9PT10LnR5cGV8fCJ3Ij09PXQudHlwZT9uWzFdWzFdLW5bMF1bMV0rdTp1fSkpKTp0LnNlbGVjdEFsbCgiLnNlbGVjdGlvbiwuaGFuZGxlIikuc3R5bGUoImRpc3BsYXkiLCJub25lIikuYXR0cigieCIsbnVsbCkuYXR0cigieSIsbnVsbCkuYXR0cigid2lkdGgiLG51bGwpLmF0dHIoImhlaWdodCIsbnVsbCl9ZnVuY3Rpb24gcyh0LG4sZSl7dmFyIHI9dC5fX2JydXNoLmVtaXR0ZXI7cmV0dXJuIXJ8fGUmJnIuY2xlYW4/bmV3IGwodCxuLGUpOnJ9ZnVuY3Rpb24gbCh0LG4sZSl7dGhpcy50aGF0PXQsdGhpcy5hcmdzPW4sdGhpcy5zdGF0ZT10Ll9fYnJ1c2gsdGhpcy5hY3RpdmU9MCx0aGlzLmNsZWFuPWV9ZnVuY3Rpb24gaChlKXtpZigoIW58fGUudG91Y2hlcykmJnIuYXBwbHkodGhpcyxhcmd1bWVudHMpKXt2YXIgaSxhLHUsYyxsLGgsZCxwLGcseSx2LF89dGhpcyxiPWUudGFyZ2V0Ll9fZGF0YV9fLnR5cGUsbT0ic2VsZWN0aW9uIj09PShvJiZlLm1ldGFLZXk/Yj0ib3ZlcmxheSI6Yik/bmE6byYmZS5hbHRLZXk/aWE6cmEseD10PT09bGE/bnVsbDp5YVtiXSx3PXQ9PT1zYT9udWxsOnZhW2JdLE09d2EoXyksVD1NLmV4dGVudCxBPU0uc2VsZWN0aW9uLFM9VFswXVswXSxFPVRbMF1bMV0sTj1UWzFdWzBdLGs9VFsxXVsxXSxDPTAsUD0wLHo9eCYmdyYmbyYmZS5zaGlmdEtleSwkPUFycmF5LmZyb20oZS50b3VjaGVzfHxbZV0sKHQ9Pntjb25zdCBuPXQuaWRlbnRpZmllcjtyZXR1cm4odD1lZSh0LF8pKS5wb2ludDA9dC5zbGljZSgpLHQuaWRlbnRpZmllcj1uLHR9KSk7VmkoXyk7dmFyIEQ9cyhfLGFyZ3VtZW50cywhMCkuYmVmb3Jlc3RhcnQoKTtpZigib3ZlcmxheSI9PT1iKXtBJiYoZz0hMCk7Y29uc3Qgbj1bJFswXSwkWzFdfHwkWzBdXTtNLnNlbGVjdGlvbj1BPVtbaT10PT09bGE/Uzp1YShuWzBdWzBdLG5bMV1bMF0pLHU9dD09PXNhP0U6dWEoblswXVsxXSxuWzFdWzFdKV0sW2w9dD09PWxhP046YWEoblswXVswXSxuWzFdWzBdKSxkPXQ9PT1zYT9rOmFhKG5bMF1bMV0sblsxXVsxXSldXSwkLmxlbmd0aD4xJiZJKGUpfWVsc2UgaT1BWzBdWzBdLHU9QVswXVsxXSxsPUFbMV1bMF0sZD1BWzFdWzFdO2E9aSxjPXUsaD1sLHA9ZDt2YXIgUj1LbihfKS5hdHRyKCJwb2ludGVyLWV2ZW50cyIsIm5vbmUiKSxGPVIuc2VsZWN0QWxsKCIub3ZlcmxheSIpLmF0dHIoImN1cnNvciIsZGFbYl0pO2lmKGUudG91Y2hlcylELm1vdmVkPVUsRC5lbmRlZD1PO2Vsc2V7dmFyIHE9S24oZS52aWV3KS5vbigibW91c2Vtb3ZlLmJydXNoIixVLCEwKS5vbigibW91c2V1cC5icnVzaCIsTywhMCk7byYmcS5vbigia2V5ZG93bi5icnVzaCIsKGZ1bmN0aW9uKHQpe3N3aXRjaCh0LmtleUNvZGUpe2Nhc2UgMTY6ej14JiZ3O2JyZWFrO2Nhc2UgMTg6bT09PXJhJiYoeCYmKGw9aC1DKngsaT1hK0MqeCksdyYmKGQ9cC1QKncsdT1jK1AqdyksbT1pYSxJKHQpKTticmVhaztjYXNlIDMyOm0hPT1yYSYmbSE9PWlhfHwoeDwwP2w9aC1DOng+MCYmKGk9YS1DKSx3PDA/ZD1wLVA6dz4wJiYodT1jLVApLG09ZWEsRi5hdHRyKCJjdXJzb3IiLGRhLnNlbGVjdGlvbiksSSh0KSk7YnJlYWs7ZGVmYXVsdDpyZXR1cm59dGEodCl9KSwhMCkub24oImtleXVwLmJydXNoIiwoZnVuY3Rpb24odCl7c3dpdGNoKHQua2V5Q29kZSl7Y2FzZSAxNjp6JiYoeT12PXo9ITEsSSh0KSk7YnJlYWs7Y2FzZSAxODptPT09aWEmJih4PDA/bD1oOng+MCYmKGk9YSksdzwwP2Q9cDp3PjAmJih1PWMpLG09cmEsSSh0KSk7YnJlYWs7Y2FzZSAzMjptPT09ZWEmJih0LmFsdEtleT8oeCYmKGw9aC1DKngsaT1hK0MqeCksdyYmKGQ9cC1QKncsdT1jK1AqdyksbT1pYSk6KHg8MD9sPWg6eD4wJiYoaT1hKSx3PDA/ZD1wOnc+MCYmKHU9YyksbT1yYSksRi5hdHRyKCJjdXJzb3IiLGRhW2JdKSxJKHQpKTticmVhaztkZWZhdWx0OnJldHVybn10YSh0KX0pLCEwKSx1ZShlLnZpZXcpfWYuY2FsbChfKSxELnN0YXJ0KGUsbS5uYW1lKX1mdW5jdGlvbiBVKHQpe2Zvcihjb25zdCBuIG9mIHQuY2hhbmdlZFRvdWNoZXN8fFt0XSlmb3IoY29uc3QgdCBvZiAkKXQuaWRlbnRpZmllcj09PW4uaWRlbnRpZmllciYmKHQuY3VyPWVlKG4sXykpO2lmKHomJiF5JiYhdiYmMT09PSQubGVuZ3RoKXtjb25zdCB0PSRbMF07b2EodC5jdXJbMF0tdFswXSk+b2EodC5jdXJbMV0tdFsxXSk/dj0hMDp5PSEwfWZvcihjb25zdCB0IG9mICQpdC5jdXImJih0WzBdPXQuY3VyWzBdLHRbMV09dC5jdXJbMV0pO2c9ITAsdGEodCksSSh0KX1mdW5jdGlvbiBJKHQpe2NvbnN0IG49JFswXSxlPW4ucG9pbnQwO3ZhciByO3N3aXRjaChDPW5bMF0tZVswXSxQPW5bMV0tZVsxXSxtKXtjYXNlIGVhOmNhc2UgbmE6eCYmKEM9YWEoUy1pLHVhKE4tbCxDKSksYT1pK0MsaD1sK0MpLHcmJihQPWFhKEUtdSx1YShrLWQsUCkpLGM9dStQLHA9ZCtQKTticmVhaztjYXNlIHJhOiRbMV0/KHgmJihhPWFhKFMsdWEoTiwkWzBdWzBdKSksaD1hYShTLHVhKE4sJFsxXVswXSkpLHg9MSksdyYmKGM9YWEoRSx1YShrLCRbMF1bMV0pKSxwPWFhKEUsdWEoaywkWzFdWzFdKSksdz0xKSk6KHg8MD8oQz1hYShTLWksdWEoTi1pLEMpKSxhPWkrQyxoPWwpOng+MCYmKEM9YWEoUy1sLHVhKE4tbCxDKSksYT1pLGg9bCtDKSx3PDA/KFA9YWEoRS11LHVhKGstdSxQKSksYz11K1AscD1kKTp3PjAmJihQPWFhKEUtZCx1YShrLWQsUCkpLGM9dSxwPWQrUCkpO2JyZWFrO2Nhc2UgaWE6eCYmKGE9YWEoUyx1YShOLGktQyp4KSksaD1hYShTLHVhKE4sbCtDKngpKSksdyYmKGM9YWEoRSx1YShrLHUtUCp3KSkscD1hYShFLHVhKGssZCtQKncpKSl9aDxhJiYoeCo9LTEscj1pLGk9bCxsPXIscj1hLGE9aCxoPXIsYiBpbiBwYSYmRi5hdHRyKCJjdXJzb3IiLGRhW2I9cGFbYl1dKSkscDxjJiYodyo9LTEscj11LHU9ZCxkPXIscj1jLGM9cCxwPXIsYiBpbiBnYSYmRi5hdHRyKCJjdXJzb3IiLGRhW2I9Z2FbYl1dKSksTS5zZWxlY3Rpb24mJihBPU0uc2VsZWN0aW9uKSx5JiYoYT1BWzBdWzBdLGg9QVsxXVswXSksdiYmKGM9QVswXVsxXSxwPUFbMV1bMV0pLEFbMF1bMF09PT1hJiZBWzBdWzFdPT09YyYmQVsxXVswXT09PWgmJkFbMV1bMV09PT1wfHwoTS5zZWxlY3Rpb249W1thLGNdLFtoLHBdXSxmLmNhbGwoXyksRC5icnVzaCh0LG0ubmFtZSkpfWZ1bmN0aW9uIE8odCl7aWYoZnVuY3Rpb24odCl7dC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKX0odCksdC50b3VjaGVzKXtpZih0LnRvdWNoZXMubGVuZ3RoKXJldHVybjtuJiZjbGVhclRpbWVvdXQobiksbj1zZXRUaW1lb3V0KChmdW5jdGlvbigpe249bnVsbH0pLDUwMCl9ZWxzZSBjZSh0LnZpZXcsZykscS5vbigia2V5ZG93bi5icnVzaCBrZXl1cC5icnVzaCBtb3VzZW1vdmUuYnJ1c2ggbW91c2V1cC5icnVzaCIsbnVsbCk7Ui5hdHRyKCJwb2ludGVyLWV2ZW50cyIsImFsbCIpLEYuYXR0cigiY3Vyc29yIixkYS5vdmVybGF5KSxNLnNlbGVjdGlvbiYmKEE9TS5zZWxlY3Rpb24pLGZ1bmN0aW9uKHQpe3JldHVybiB0WzBdWzBdPT09dFsxXVswXXx8dFswXVsxXT09PXRbMV1bMV19KEEpJiYoTS5zZWxlY3Rpb249bnVsbCxmLmNhbGwoXykpLEQuZW5kKHQsbS5uYW1lKX19ZnVuY3Rpb24gZCh0KXtzKHRoaXMsYXJndW1lbnRzKS5tb3ZlZCh0KX1mdW5jdGlvbiBwKHQpe3ModGhpcyxhcmd1bWVudHMpLmVuZGVkKHQpfWZ1bmN0aW9uIGcoKXt2YXIgbj10aGlzLl9fYnJ1c2h8fHtzZWxlY3Rpb246bnVsbH07cmV0dXJuIG4uZXh0ZW50PWZhKGUuYXBwbHkodGhpcyxhcmd1bWVudHMpKSxuLmRpbT10LG59cmV0dXJuIGMubW92ZT1mdW5jdGlvbihuLGUscil7bi50d2Vlbj9uLm9uKCJzdGFydC5icnVzaCIsKGZ1bmN0aW9uKHQpe3ModGhpcyxhcmd1bWVudHMpLmJlZm9yZXN0YXJ0KCkuc3RhcnQodCl9KSkub24oImludGVycnVwdC5icnVzaCBlbmQuYnJ1c2giLChmdW5jdGlvbih0KXtzKHRoaXMsYXJndW1lbnRzKS5lbmQodCl9KSkudHdlZW4oImJydXNoIiwoZnVuY3Rpb24oKXt2YXIgbj10aGlzLHI9bi5fX2JydXNoLGk9cyhuLGFyZ3VtZW50cyksbz1yLnNlbGVjdGlvbixhPXQuaW5wdXQoImZ1bmN0aW9uIj09dHlwZW9mIGU/ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk6ZSxyLmV4dGVudCksdT1WcihvLGEpO2Z1bmN0aW9uIGModCl7ci5zZWxlY3Rpb249MT09PXQmJm51bGw9PT1hP251bGw6dSh0KSxmLmNhbGwobiksaS5icnVzaCgpfXJldHVybiBudWxsIT09byYmbnVsbCE9PWE/YzpjKDEpfSkpOm4uZWFjaCgoZnVuY3Rpb24oKXt2YXIgbj10aGlzLGk9YXJndW1lbnRzLG89bi5fX2JydXNoLGE9dC5pbnB1dCgiZnVuY3Rpb24iPT10eXBlb2YgZT9lLmFwcGx5KG4saSk6ZSxvLmV4dGVudCksdT1zKG4saSkuYmVmb3Jlc3RhcnQoKTtWaShuKSxvLnNlbGVjdGlvbj1udWxsPT09YT9udWxsOmEsZi5jYWxsKG4pLHUuc3RhcnQocikuYnJ1c2gocikuZW5kKHIpfSkpfSxjLmNsZWFyPWZ1bmN0aW9uKHQsbil7Yy5tb3ZlKHQsbnVsbCxuKX0sbC5wcm90b3R5cGU9e2JlZm9yZXN0YXJ0OmZ1bmN0aW9uKCl7cmV0dXJuIDE9PSsrdGhpcy5hY3RpdmUmJih0aGlzLnN0YXRlLmVtaXR0ZXI9dGhpcyx0aGlzLnN0YXJ0aW5nPSEwKSx0aGlzfSxzdGFydDpmdW5jdGlvbih0LG4pe3JldHVybiB0aGlzLnN0YXJ0aW5nPyh0aGlzLnN0YXJ0aW5nPSExLHRoaXMuZW1pdCgic3RhcnQiLHQsbikpOnRoaXMuZW1pdCgiYnJ1c2giLHQpLHRoaXN9LGJydXNoOmZ1bmN0aW9uKHQsbil7cmV0dXJuIHRoaXMuZW1pdCgiYnJ1c2giLHQsbiksdGhpc30sZW5kOmZ1bmN0aW9uKHQsbil7cmV0dXJuIDA9PS0tdGhpcy5hY3RpdmUmJihkZWxldGUgdGhpcy5zdGF0ZS5lbWl0dGVyLHRoaXMuZW1pdCgiZW5kIix0LG4pKSx0aGlzfSxlbWl0OmZ1bmN0aW9uKG4sZSxyKXt2YXIgaT1Lbih0aGlzLnRoYXQpLmRhdHVtKCk7YS5jYWxsKG4sdGhpcy50aGF0LG5ldyBKbyhuLHtzb3VyY2VFdmVudDplLHRhcmdldDpjLHNlbGVjdGlvbjp0Lm91dHB1dCh0aGlzLnN0YXRlLnNlbGVjdGlvbiksbW9kZTpyLGRpc3BhdGNoOmF9KSxpKX19LGMuZXh0ZW50PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6UW8oZmEodCkpLGMpOmV9LGMuZmlsdGVyPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6UW8oISF0KSxjKTpyfSxjLnRvdWNoYWJsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0iZnVuY3Rpb24iPT10eXBlb2YgdD90OlFvKCEhdCksYyk6aX0sYy5oYW5kbGVTaXplPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PSt0LGMpOnV9LGMua2V5TW9kaWZpZXJzPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPSEhdCxjKTpvfSxjLm9uPWZ1bmN0aW9uKCl7dmFyIHQ9YS5vbi5hcHBseShhLGFyZ3VtZW50cyk7cmV0dXJuIHQ9PT1hP2M6dH0sY312YXIgVGE9TWF0aC5hYnMsQWE9TWF0aC5jb3MsU2E9TWF0aC5zaW4sRWE9TWF0aC5QSSxOYT1FYS8yLGthPTIqRWEsQ2E9TWF0aC5tYXgsUGE9MWUtMTI7ZnVuY3Rpb24gemEodCxuKXtyZXR1cm4gQXJyYXkuZnJvbSh7bGVuZ3RoOm4tdH0sKChuLGUpPT50K2UpKX1mdW5jdGlvbiAkYSh0LG4pe3ZhciBlPTAscj1udWxsLGk9bnVsbCxvPW51bGw7ZnVuY3Rpb24gYShhKXt2YXIgdSxjPWEubGVuZ3RoLGY9bmV3IEFycmF5KGMpLHM9emEoMCxjKSxsPW5ldyBBcnJheShjKmMpLGg9bmV3IEFycmF5KGMpLGQ9MDthPUZsb2F0NjRBcnJheS5mcm9tKHtsZW5ndGg6YypjfSxuPyh0LG4pPT5hW24lY11bbi9jfDBdOih0LG4pPT5hW24vY3wwXVtuJWNdKTtmb3IobGV0IG49MDtuPGM7KytuKXtsZXQgZT0wO2ZvcihsZXQgcj0wO3I8YzsrK3IpZSs9YVtuKmMrcl0rdCphW3IqYytuXTtkKz1mW25dPWV9dT0oZD1DYSgwLGthLWUqYykvZCk/ZTprYS9jO3tsZXQgbj0wO3ImJnMuc29ydCgoKHQsbik9PnIoZlt0XSxmW25dKSkpO2Zvcihjb25zdCBlIG9mIHMpe2NvbnN0IHI9bjtpZih0KXtjb25zdCB0PXphKDErfmMsYykuZmlsdGVyKCh0PT50PDA/YVt+dCpjK2VdOmFbZSpjK3RdKSk7aSYmdC5zb3J0KCgodCxuKT0+aSh0PDA/LWFbfnQqYytlXTphW2UqYyt0XSxuPDA/LWFbfm4qYytlXTphW2UqYytuXSkpKTtmb3IoY29uc3QgciBvZiB0KWlmKHI8MCl7KGxbfnIqYytlXXx8KGxbfnIqYytlXT17c291cmNlOm51bGwsdGFyZ2V0Om51bGx9KSkudGFyZ2V0PXtpbmRleDplLHN0YXJ0QW5nbGU6bixlbmRBbmdsZTpuKz1hW35yKmMrZV0qZCx2YWx1ZTphW35yKmMrZV19fWVsc2V7KGxbZSpjK3JdfHwobFtlKmMrcl09e3NvdXJjZTpudWxsLHRhcmdldDpudWxsfSkpLnNvdXJjZT17aW5kZXg6ZSxzdGFydEFuZ2xlOm4sZW5kQW5nbGU6bis9YVtlKmMrcl0qZCx2YWx1ZTphW2UqYytyXX19aFtlXT17aW5kZXg6ZSxzdGFydEFuZ2xlOnIsZW5kQW5nbGU6bix2YWx1ZTpmW2VdfX1lbHNle2NvbnN0IHQ9emEoMCxjKS5maWx0ZXIoKHQ9PmFbZSpjK3RdfHxhW3QqYytlXSkpO2kmJnQuc29ydCgoKHQsbik9PmkoYVtlKmMrdF0sYVtlKmMrbl0pKSk7Zm9yKGNvbnN0IHIgb2YgdCl7bGV0IHQ7aWYoZTxyPyh0PWxbZSpjK3JdfHwobFtlKmMrcl09e3NvdXJjZTpudWxsLHRhcmdldDpudWxsfSksdC5zb3VyY2U9e2luZGV4OmUsc3RhcnRBbmdsZTpuLGVuZEFuZ2xlOm4rPWFbZSpjK3JdKmQsdmFsdWU6YVtlKmMrcl19KToodD1sW3IqYytlXXx8KGxbcipjK2VdPXtzb3VyY2U6bnVsbCx0YXJnZXQ6bnVsbH0pLHQudGFyZ2V0PXtpbmRleDplLHN0YXJ0QW5nbGU6bixlbmRBbmdsZTpuKz1hW2UqYytyXSpkLHZhbHVlOmFbZSpjK3JdfSxlPT09ciYmKHQuc291cmNlPXQudGFyZ2V0KSksdC5zb3VyY2UmJnQudGFyZ2V0JiZ0LnNvdXJjZS52YWx1ZTx0LnRhcmdldC52YWx1ZSl7Y29uc3Qgbj10LnNvdXJjZTt0LnNvdXJjZT10LnRhcmdldCx0LnRhcmdldD1ufX1oW2VdPXtpbmRleDplLHN0YXJ0QW5nbGU6cixlbmRBbmdsZTpuLHZhbHVlOmZbZV19fW4rPXV9fXJldHVybihsPU9iamVjdC52YWx1ZXMobCkpLmdyb3Vwcz1oLG8/bC5zb3J0KG8pOmx9cmV0dXJuIGEucGFkQW5nbGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9Q2EoMCx0KSxhKTplfSxhLnNvcnRHcm91cHM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9dCxhKTpyfSxhLnNvcnRTdWJncm91cHM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9dCxhKTppfSxhLnNvcnRDaG9yZHM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG51bGw9PXQ/bz1udWxsOihuPXQsbz1mdW5jdGlvbih0LGUpe3JldHVybiBuKHQuc291cmNlLnZhbHVlK3QudGFyZ2V0LnZhbHVlLGUuc291cmNlLnZhbHVlK2UudGFyZ2V0LnZhbHVlKX0pLl89dCxhKTpvJiZvLl87dmFyIG59LGF9Y29uc3QgRGE9TWF0aC5QSSxSYT0yKkRhLEZhPTFlLTYscWE9UmEtRmE7ZnVuY3Rpb24gVWEodCl7dGhpcy5fKz10WzBdO2ZvcihsZXQgbj0xLGU9dC5sZW5ndGg7bjxlOysrbil0aGlzLl8rPWFyZ3VtZW50c1tuXSt0W25dfWxldCBJYT1jbGFzc3tjb25zdHJ1Y3Rvcih0KXt0aGlzLl94MD10aGlzLl95MD10aGlzLl94MT10aGlzLl95MT1udWxsLHRoaXMuXz0iIix0aGlzLl9hcHBlbmQ9bnVsbD09dD9VYTpmdW5jdGlvbih0KXtsZXQgbj1NYXRoLmZsb29yKHQpO2lmKCEobj49MCkpdGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIGRpZ2l0czogJHt0fWApO2lmKG4+MTUpcmV0dXJuIFVhO2NvbnN0IGU9MTAqKm47cmV0dXJuIGZ1bmN0aW9uKHQpe3RoaXMuXys9dFswXTtmb3IobGV0IG49MSxyPXQubGVuZ3RoO248cjsrK24pdGhpcy5fKz1NYXRoLnJvdW5kKGFyZ3VtZW50c1tuXSplKS9lK3Rbbl19fSh0KX1tb3ZlVG8odCxuKXt0aGlzLl9hcHBlbmRgTSR7dGhpcy5feDA9dGhpcy5feDE9K3R9LCR7dGhpcy5feTA9dGhpcy5feTE9K259YH1jbG9zZVBhdGgoKXtudWxsIT09dGhpcy5feDEmJih0aGlzLl94MT10aGlzLl94MCx0aGlzLl95MT10aGlzLl95MCx0aGlzLl9hcHBlbmRgWmApfWxpbmVUbyh0LG4pe3RoaXMuX2FwcGVuZGBMJHt0aGlzLl94MT0rdH0sJHt0aGlzLl95MT0rbn1gfXF1YWRyYXRpY0N1cnZlVG8odCxuLGUscil7dGhpcy5fYXBwZW5kYFEkeyt0fSwkeytufSwke3RoaXMuX3gxPStlfSwke3RoaXMuX3kxPStyfWB9YmV6aWVyQ3VydmVUbyh0LG4sZSxyLGksbyl7dGhpcy5fYXBwZW5kYEMkeyt0fSwkeytufSwkeytlfSwkeytyfSwke3RoaXMuX3gxPStpfSwke3RoaXMuX3kxPStvfWB9YXJjVG8odCxuLGUscixpKXtpZih0PSt0LG49K24sZT0rZSxyPStyLChpPStpKTwwKXRocm93IG5ldyBFcnJvcihgbmVnYXRpdmUgcmFkaXVzOiAke2l9YCk7bGV0IG89dGhpcy5feDEsYT10aGlzLl95MSx1PWUtdCxjPXItbixmPW8tdCxzPWEtbixsPWYqZitzKnM7aWYobnVsbD09PXRoaXMuX3gxKXRoaXMuX2FwcGVuZGBNJHt0aGlzLl94MT10fSwke3RoaXMuX3kxPW59YDtlbHNlIGlmKGw+RmEpaWYoTWF0aC5hYnMocyp1LWMqZik+RmEmJmkpe2xldCBoPWUtbyxkPXItYSxwPXUqdStjKmMsZz1oKmgrZCpkLHk9TWF0aC5zcXJ0KHApLHY9TWF0aC5zcXJ0KGwpLF89aSpNYXRoLnRhbigoRGEtTWF0aC5hY29zKChwK2wtZykvKDIqeSp2KSkpLzIpLGI9Xy92LG09Xy95O01hdGguYWJzKGItMSk+RmEmJnRoaXMuX2FwcGVuZGBMJHt0K2IqZn0sJHtuK2Iqc31gLHRoaXMuX2FwcGVuZGBBJHtpfSwke2l9LDAsMCwkeysocypoPmYqZCl9LCR7dGhpcy5feDE9dCttKnV9LCR7dGhpcy5feTE9bittKmN9YH1lbHNlIHRoaXMuX2FwcGVuZGBMJHt0aGlzLl94MT10fSwke3RoaXMuX3kxPW59YDtlbHNlO31hcmModCxuLGUscixpLG8pe2lmKHQ9K3Qsbj0rbixvPSEhbywoZT0rZSk8MCl0aHJvdyBuZXcgRXJyb3IoYG5lZ2F0aXZlIHJhZGl1czogJHtlfWApO2xldCBhPWUqTWF0aC5jb3MociksdT1lKk1hdGguc2luKHIpLGM9dCthLGY9bit1LHM9MV5vLGw9bz9yLWk6aS1yO251bGw9PT10aGlzLl94MT90aGlzLl9hcHBlbmRgTSR7Y30sJHtmfWA6KE1hdGguYWJzKHRoaXMuX3gxLWMpPkZhfHxNYXRoLmFicyh0aGlzLl95MS1mKT5GYSkmJnRoaXMuX2FwcGVuZGBMJHtjfSwke2Z9YCxlJiYobDwwJiYobD1sJVJhK1JhKSxsPnFhP3RoaXMuX2FwcGVuZGBBJHtlfSwke2V9LDAsMSwke3N9LCR7dC1hfSwke24tdX1BJHtlfSwke2V9LDAsMSwke3N9LCR7dGhpcy5feDE9Y30sJHt0aGlzLl95MT1mfWA6bD5GYSYmdGhpcy5fYXBwZW5kYEEke2V9LCR7ZX0sMCwkeysobD49RGEpfSwke3N9LCR7dGhpcy5feDE9dCtlKk1hdGguY29zKGkpfSwke3RoaXMuX3kxPW4rZSpNYXRoLnNpbihpKX1gKX1yZWN0KHQsbixlLHIpe3RoaXMuX2FwcGVuZGBNJHt0aGlzLl94MD10aGlzLl94MT0rdH0sJHt0aGlzLl95MD10aGlzLl95MT0rbn1oJHtlPStlfXYkeytyfWgkey1lfVpgfXRvU3RyaW5nKCl7cmV0dXJuIHRoaXMuX319O2Z1bmN0aW9uIE9hKCl7cmV0dXJuIG5ldyBJYX1PYS5wcm90b3R5cGU9SWEucHJvdG90eXBlO3ZhciBCYT1BcnJheS5wcm90b3R5cGUuc2xpY2U7ZnVuY3Rpb24gWWEodCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHR9fWZ1bmN0aW9uIExhKHQpe3JldHVybiB0LnNvdXJjZX1mdW5jdGlvbiBqYSh0KXtyZXR1cm4gdC50YXJnZXR9ZnVuY3Rpb24gSGEodCl7cmV0dXJuIHQucmFkaXVzfWZ1bmN0aW9uIFhhKHQpe3JldHVybiB0LnN0YXJ0QW5nbGV9ZnVuY3Rpb24gR2EodCl7cmV0dXJuIHQuZW5kQW5nbGV9ZnVuY3Rpb24gVmEoKXtyZXR1cm4gMH1mdW5jdGlvbiBXYSgpe3JldHVybiAxMH1mdW5jdGlvbiBaYSh0KXt2YXIgbj1MYSxlPWphLHI9SGEsaT1IYSxvPVhhLGE9R2EsdT1WYSxjPW51bGw7ZnVuY3Rpb24gZigpe3ZhciBmLHM9bi5hcHBseSh0aGlzLGFyZ3VtZW50cyksbD1lLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxoPXUuYXBwbHkodGhpcyxhcmd1bWVudHMpLzIsZD1CYS5jYWxsKGFyZ3VtZW50cykscD0rci5hcHBseSh0aGlzLChkWzBdPXMsZCkpLGc9by5hcHBseSh0aGlzLGQpLU5hLHk9YS5hcHBseSh0aGlzLGQpLU5hLHY9K2kuYXBwbHkodGhpcywoZFswXT1sLGQpKSxfPW8uYXBwbHkodGhpcyxkKS1OYSxiPWEuYXBwbHkodGhpcyxkKS1OYTtpZihjfHwoYz1mPU9hKCkpLGg+UGEmJihUYSh5LWcpPjIqaCtQYT95Pmc/KGcrPWgseS09aCk6KGctPWgseSs9aCk6Zz15PShnK3kpLzIsVGEoYi1fKT4yKmgrUGE/Yj5fPyhfKz1oLGItPWgpOihfLT1oLGIrPWgpOl89Yj0oXytiKS8yKSxjLm1vdmVUbyhwKkFhKGcpLHAqU2EoZykpLGMuYXJjKDAsMCxwLGcseSksZyE9PV98fHkhPT1iKWlmKHQpe3ZhciBtPXYtK3QuYXBwbHkodGhpcyxhcmd1bWVudHMpLHg9KF8rYikvMjtjLnF1YWRyYXRpY0N1cnZlVG8oMCwwLG0qQWEoXyksbSpTYShfKSksYy5saW5lVG8odipBYSh4KSx2KlNhKHgpKSxjLmxpbmVUbyhtKkFhKGIpLG0qU2EoYikpfWVsc2UgYy5xdWFkcmF0aWNDdXJ2ZVRvKDAsMCx2KkFhKF8pLHYqU2EoXykpLGMuYXJjKDAsMCx2LF8sYik7aWYoYy5xdWFkcmF0aWNDdXJ2ZVRvKDAsMCxwKkFhKGcpLHAqU2EoZykpLGMuY2xvc2VQYXRoKCksZilyZXR1cm4gYz1udWxsLGYrIiJ8fG51bGx9cmV0dXJuIHQmJihmLmhlYWRSYWRpdXM9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjpZYSgrbiksZik6dH0pLGYucmFkaXVzPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPWk9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpZYSgrdCksZik6cn0sZi5zb3VyY2VSYWRpdXM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpZYSgrdCksZik6cn0sZi50YXJnZXRSYWRpdXM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpZYSgrdCksZik6aX0sZi5zdGFydEFuZ2xlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6WWEoK3QpLGYpOm99LGYuZW5kQW5nbGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpZYSgrdCksZik6YX0sZi5wYWRBbmdsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT0iZnVuY3Rpb24iPT10eXBlb2YgdD90OllhKCt0KSxmKTp1fSxmLnNvdXJjZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj10LGYpOm59LGYudGFyZ2V0PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPXQsZik6ZX0sZi5jb250ZXh0PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhjPW51bGw9PXQ/bnVsbDp0LGYpOmN9LGZ9dmFyIEthPUFycmF5LnByb3RvdHlwZS5zbGljZTtmdW5jdGlvbiBRYSh0LG4pe3JldHVybiB0LW59dmFyIEphPXQ9PigpPT50O2Z1bmN0aW9uIHR1KHQsbil7Zm9yKHZhciBlLHI9LTEsaT1uLmxlbmd0aDsrK3I8aTspaWYoZT1udSh0LG5bcl0pKXJldHVybiBlO3JldHVybiAwfWZ1bmN0aW9uIG51KHQsbil7Zm9yKHZhciBlPW5bMF0scj1uWzFdLGk9LTEsbz0wLGE9dC5sZW5ndGgsdT1hLTE7bzxhO3U9bysrKXt2YXIgYz10W29dLGY9Y1swXSxzPWNbMV0sbD10W3VdLGg9bFswXSxkPWxbMV07aWYoZXUoYyxsLG4pKXJldHVybiAwO3M+ciE9ZD5yJiZlPChoLWYpKihyLXMpLyhkLXMpK2YmJihpPS1pKX1yZXR1cm4gaX1mdW5jdGlvbiBldSh0LG4sZSl7dmFyIHIsaSxvLGE7cmV0dXJuIGZ1bmN0aW9uKHQsbixlKXtyZXR1cm4oblswXS10WzBdKSooZVsxXS10WzFdKT09KGVbMF0tdFswXSkqKG5bMV0tdFsxXSl9KHQsbixlKSYmKGk9dFtyPSsodFswXT09PW5bMF0pXSxvPWVbcl0sYT1uW3JdLGk8PW8mJm88PWF8fGE8PW8mJm88PWkpfWZ1bmN0aW9uIHJ1KCl7fXZhciBpdT1bW10sW1tbMSwxLjVdLFsuNSwxXV1dLFtbWzEuNSwxXSxbMSwxLjVdXV0sW1tbMS41LDFdLFsuNSwxXV1dLFtbWzEsLjVdLFsxLjUsMV1dXSxbW1sxLDEuNV0sWy41LDFdXSxbWzEsLjVdLFsxLjUsMV1dXSxbW1sxLC41XSxbMSwxLjVdXV0sW1tbMSwuNV0sWy41LDFdXV0sW1tbLjUsMV0sWzEsLjVdXV0sW1tbMSwxLjVdLFsxLC41XV1dLFtbWy41LDFdLFsxLC41XV0sW1sxLjUsMV0sWzEsMS41XV1dLFtbWzEuNSwxXSxbMSwuNV1dXSxbW1suNSwxXSxbMS41LDFdXV0sW1tbMSwxLjVdLFsxLjUsMV1dXSxbW1suNSwxXSxbMSwxLjVdXV0sW11dO2Z1bmN0aW9uIG91KCl7dmFyIHQ9MSxuPTEsZT1RLHI9dTtmdW5jdGlvbiBpKHQpe3ZhciBuPWUodCk7aWYoQXJyYXkuaXNBcnJheShuKSluPW4uc2xpY2UoKS5zb3J0KFFhKTtlbHNle2NvbnN0IGU9VCh0LGF1KTtmb3Iobj1WKC4uLksoZVswXSxlWzFdLG4pLG4pO25bbi5sZW5ndGgtMV0+PWVbMV07KW4ucG9wKCk7Zm9yKDtuWzFdPGVbMF07KW4uc2hpZnQoKX1yZXR1cm4gbi5tYXAoKG49Pm8odCxuKSkpfWZ1bmN0aW9uIG8oZSxpKXtjb25zdCBvPW51bGw9PWk/TmFOOitpO2lmKGlzTmFOKG8pKXRocm93IG5ldyBFcnJvcihgaW52YWxpZCB2YWx1ZTogJHtpfWApO3ZhciB1PVtdLGM9W107cmV0dXJuIGZ1bmN0aW9uKGUscixpKXt2YXIgbyx1LGMsZixzLGwsaD1uZXcgQXJyYXksZD1uZXcgQXJyYXk7bz11PS0xLGY9dXUoZVswXSxyKSxpdVtmPDwxXS5mb3JFYWNoKHApO2Zvcig7KytvPHQtMTspYz1mLGY9dXUoZVtvKzFdLHIpLGl1W2N8Zjw8MV0uZm9yRWFjaChwKTtpdVtmPDwwXS5mb3JFYWNoKHApO2Zvcig7Kyt1PG4tMTspe2ZvcihvPS0xLGY9dXUoZVt1KnQrdF0scikscz11dShlW3UqdF0sciksaXVbZjw8MXxzPDwyXS5mb3JFYWNoKHApOysrbzx0LTE7KWM9ZixmPXV1KGVbdSp0K3QrbysxXSxyKSxsPXMscz11dShlW3UqdCtvKzFdLHIpLGl1W2N8Zjw8MXxzPDwyfGw8PDNdLmZvckVhY2gocCk7aXVbZnxzPDwzXS5mb3JFYWNoKHApfW89LTEscz1lW3UqdF0+PXIsaXVbczw8Ml0uZm9yRWFjaChwKTtmb3IoOysrbzx0LTE7KWw9cyxzPXV1KGVbdSp0K28rMV0sciksaXVbczw8MnxsPDwzXS5mb3JFYWNoKHApO2Z1bmN0aW9uIHAodCl7dmFyIG4sZSxyPVt0WzBdWzBdK28sdFswXVsxXSt1XSxjPVt0WzFdWzBdK28sdFsxXVsxXSt1XSxmPWEocikscz1hKGMpOyhuPWRbZl0pPyhlPWhbc10pPyhkZWxldGUgZFtuLmVuZF0sZGVsZXRlIGhbZS5zdGFydF0sbj09PWU/KG4ucmluZy5wdXNoKGMpLGkobi5yaW5nKSk6aFtuLnN0YXJ0XT1kW2UuZW5kXT17c3RhcnQ6bi5zdGFydCxlbmQ6ZS5lbmQscmluZzpuLnJpbmcuY29uY2F0KGUucmluZyl9KTooZGVsZXRlIGRbbi5lbmRdLG4ucmluZy5wdXNoKGMpLGRbbi5lbmQ9c109bik6KG49aFtzXSk/KGU9ZFtmXSk/KGRlbGV0ZSBoW24uc3RhcnRdLGRlbGV0ZSBkW2UuZW5kXSxuPT09ZT8obi5yaW5nLnB1c2goYyksaShuLnJpbmcpKTpoW2Uuc3RhcnRdPWRbbi5lbmRdPXtzdGFydDplLnN0YXJ0LGVuZDpuLmVuZCxyaW5nOmUucmluZy5jb25jYXQobi5yaW5nKX0pOihkZWxldGUgaFtuLnN0YXJ0XSxuLnJpbmcudW5zaGlmdChyKSxoW24uc3RhcnQ9Zl09bik6aFtmXT1kW3NdPXtzdGFydDpmLGVuZDpzLHJpbmc6W3IsY119fWl1W3M8PDNdLmZvckVhY2gocCl9KGUsbywoZnVuY3Rpb24odCl7cih0LGUsbyksZnVuY3Rpb24odCl7Zm9yKHZhciBuPTAsZT10Lmxlbmd0aCxyPXRbZS0xXVsxXSp0WzBdWzBdLXRbZS0xXVswXSp0WzBdWzFdOysrbjxlOylyKz10W24tMV1bMV0qdFtuXVswXS10W24tMV1bMF0qdFtuXVsxXTtyZXR1cm4gcn0odCk+MD91LnB1c2goW3RdKTpjLnB1c2godCl9KSksYy5mb3JFYWNoKChmdW5jdGlvbih0KXtmb3IodmFyIG4sZT0wLHI9dS5sZW5ndGg7ZTxyOysrZSlpZigtMSE9PXR1KChuPXVbZV0pWzBdLHQpKXJldHVybiB2b2lkIG4ucHVzaCh0KX0pKSx7dHlwZToiTXVsdGlQb2x5Z29uIix2YWx1ZTppLGNvb3JkaW5hdGVzOnV9fWZ1bmN0aW9uIGEobil7cmV0dXJuIDIqblswXStuWzFdKih0KzEpKjR9ZnVuY3Rpb24gdShlLHIsaSl7ZS5mb3JFYWNoKChmdW5jdGlvbihlKXt2YXIgbz1lWzBdLGE9ZVsxXSx1PTB8byxjPTB8YSxmPWN1KHJbYyp0K3VdKTtvPjAmJm88dCYmdT09PW8mJihlWzBdPWZ1KG8sY3UocltjKnQrdS0xXSksZixpKSksYT4wJiZhPG4mJmM9PT1hJiYoZVsxXT1mdShhLGN1KHJbKGMtMSkqdCt1XSksZixpKSl9KSl9cmV0dXJuIGkuY29udG91cj1vLGkuc2l6ZT1mdW5jdGlvbihlKXtpZighYXJndW1lbnRzLmxlbmd0aClyZXR1cm5bdCxuXTt2YXIgcj1NYXRoLmZsb29yKGVbMF0pLG89TWF0aC5mbG9vcihlWzFdKTtpZighKHI+PTAmJm8+PTApKXRocm93IG5ldyBFcnJvcigiaW52YWxpZCBzaXplIik7cmV0dXJuIHQ9cixuPW8saX0saS50aHJlc2hvbGRzPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6QXJyYXkuaXNBcnJheSh0KT9KYShLYS5jYWxsKHQpKTpKYSh0KSxpKTplfSxpLnNtb290aD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj10P3U6cnUsaSk6cj09PXV9LGl9ZnVuY3Rpb24gYXUodCl7cmV0dXJuIGlzRmluaXRlKHQpP3Q6TmFOfWZ1bmN0aW9uIHV1KHQsbil7cmV0dXJuIG51bGwhPXQmJit0Pj1ufWZ1bmN0aW9uIGN1KHQpe3JldHVybiBudWxsPT10fHxpc05hTih0PSt0KT8tMS8wOnR9ZnVuY3Rpb24gZnUodCxuLGUscil7Y29uc3QgaT1yLW4sbz1lLW4sYT1pc0Zpbml0ZShpKXx8aXNGaW5pdGUobyk/aS9vOk1hdGguc2lnbihpKS9NYXRoLnNpZ24obyk7cmV0dXJuIGlzTmFOKGEpP3Q6dCthLS41fWZ1bmN0aW9uIHN1KHQpe3JldHVybiB0WzBdfWZ1bmN0aW9uIGx1KHQpe3JldHVybiB0WzFdfWZ1bmN0aW9uIGh1KCl7cmV0dXJuIDF9Y29uc3QgZHU9MTM0MjE3NzI5LHB1PTMzMzA2NjkwNzM4NzU0NzA2ZS0zMjtmdW5jdGlvbiBndSh0LG4sZSxyLGkpe2xldCBvLGEsdSxjLGY9blswXSxzPXJbMF0sbD0wLGg9MDtzPmY9PXM+LWY/KG89ZixmPW5bKytsXSk6KG89cyxzPXJbKytoXSk7bGV0IGQ9MDtpZihsPHQmJmg8ZSlmb3Iocz5mPT1zPi1mPyhhPWYrbyx1PW8tKGEtZiksZj1uWysrbF0pOihhPXMrbyx1PW8tKGEtcykscz1yWysraF0pLG89YSwwIT09dSYmKGlbZCsrXT11KTtsPHQmJmg8ZTspcz5mPT1zPi1mPyhhPW8rZixjPWEtbyx1PW8tKGEtYykrKGYtYyksZj1uWysrbF0pOihhPW8rcyxjPWEtbyx1PW8tKGEtYykrKHMtYykscz1yWysraF0pLG89YSwwIT09dSYmKGlbZCsrXT11KTtmb3IoO2w8dDspYT1vK2YsYz1hLW8sdT1vLShhLWMpKyhmLWMpLGY9blsrK2xdLG89YSwwIT09dSYmKGlbZCsrXT11KTtmb3IoO2g8ZTspYT1vK3MsYz1hLW8sdT1vLShhLWMpKyhzLWMpLHM9clsrK2hdLG89YSwwIT09dSYmKGlbZCsrXT11KTtyZXR1cm4gMD09PW8mJjAhPT1kfHwoaVtkKytdPW8pLGR9ZnVuY3Rpb24geXUodCl7cmV0dXJuIG5ldyBGbG9hdDY0QXJyYXkodCl9Y29uc3QgdnU9MjIyMDQ0NjA0OTI1MDMxNDZlLTMyLF91PTExMDkzMzU2NDc5NjcwNDg3ZS00NyxidT15dSg0KSxtdT15dSg4KSx4dT15dSgxMiksd3U9eXUoMTYpLE11PXl1KDQpO2Z1bmN0aW9uIFR1KHQsbixlLHIsaSxvKXtjb25zdCBhPShuLW8pKihlLWkpLHU9KHQtaSkqKHItbyksYz1hLXU7aWYoMD09PWF8fDA9PT11fHxhPjAhPXU+MClyZXR1cm4gYztjb25zdCBmPU1hdGguYWJzKGErdSk7cmV0dXJuIE1hdGguYWJzKGMpPj0zMzMwNjY5MDczODc1NDcxNmUtMzIqZj9jOi1mdW5jdGlvbih0LG4sZSxyLGksbyxhKXtsZXQgdSxjLGYscyxsLGgsZCxwLGcseSx2LF8sYixtLHgsdyxNLFQ7Y29uc3QgQT10LWksUz1lLWksRT1uLW8sTj1yLW87bT1BKk4saD1kdSpBLGQ9aC0oaC1BKSxwPUEtZCxoPWR1Kk4sZz1oLShoLU4pLHk9Ti1nLHg9cCp5LShtLWQqZy1wKmctZCp5KSx3PUUqUyxoPWR1KkUsZD1oLShoLUUpLHA9RS1kLGg9ZHUqUyxnPWgtKGgtUykseT1TLWcsTT1wKnktKHctZCpnLXAqZy1kKnkpLHY9eC1NLGw9eC12LGJ1WzBdPXgtKHYrbCkrKGwtTSksXz1tK3YsbD1fLW0sYj1tLShfLWwpKyh2LWwpLHY9Yi13LGw9Yi12LGJ1WzFdPWItKHYrbCkrKGwtdyksVD1fK3YsbD1ULV8sYnVbMl09Xy0oVC1sKSsodi1sKSxidVszXT1UO2xldCBrPWZ1bmN0aW9uKHQsbil7bGV0IGU9blswXTtmb3IobGV0IHI9MTtyPHQ7cisrKWUrPW5bcl07cmV0dXJuIGV9KDQsYnUpLEM9dnUqYTtpZihrPj1DfHwtaz49QylyZXR1cm4gaztpZihsPXQtQSx1PXQtKEErbCkrKGwtaSksbD1lLVMsZj1lLShTK2wpKyhsLWkpLGw9bi1FLGM9bi0oRStsKSsobC1vKSxsPXItTixzPXItKE4rbCkrKGwtbyksMD09PXUmJjA9PT1jJiYwPT09ZiYmMD09PXMpcmV0dXJuIGs7aWYoQz1fdSphK3B1Kk1hdGguYWJzKGspLGsrPUEqcytOKnUtKEUqZitTKmMpLGs+PUN8fC1rPj1DKXJldHVybiBrO209dSpOLGg9ZHUqdSxkPWgtKGgtdSkscD11LWQsaD1kdSpOLGc9aC0oaC1OKSx5PU4tZyx4PXAqeS0obS1kKmctcCpnLWQqeSksdz1jKlMsaD1kdSpjLGQ9aC0oaC1jKSxwPWMtZCxoPWR1KlMsZz1oLShoLVMpLHk9Uy1nLE09cCp5LSh3LWQqZy1wKmctZCp5KSx2PXgtTSxsPXgtdixNdVswXT14LSh2K2wpKyhsLU0pLF89bSt2LGw9Xy1tLGI9bS0oXy1sKSsodi1sKSx2PWItdyxsPWItdixNdVsxXT1iLSh2K2wpKyhsLXcpLFQ9Xyt2LGw9VC1fLE11WzJdPV8tKFQtbCkrKHYtbCksTXVbM109VDtjb25zdCBQPWd1KDQsYnUsNCxNdSxtdSk7bT1BKnMsaD1kdSpBLGQ9aC0oaC1BKSxwPUEtZCxoPWR1KnMsZz1oLShoLXMpLHk9cy1nLHg9cCp5LShtLWQqZy1wKmctZCp5KSx3PUUqZixoPWR1KkUsZD1oLShoLUUpLHA9RS1kLGg9ZHUqZixnPWgtKGgtZikseT1mLWcsTT1wKnktKHctZCpnLXAqZy1kKnkpLHY9eC1NLGw9eC12LE11WzBdPXgtKHYrbCkrKGwtTSksXz1tK3YsbD1fLW0sYj1tLShfLWwpKyh2LWwpLHY9Yi13LGw9Yi12LE11WzFdPWItKHYrbCkrKGwtdyksVD1fK3YsbD1ULV8sTXVbMl09Xy0oVC1sKSsodi1sKSxNdVszXT1UO2NvbnN0IHo9Z3UoUCxtdSw0LE11LHh1KTttPXUqcyxoPWR1KnUsZD1oLShoLXUpLHA9dS1kLGg9ZHUqcyxnPWgtKGgtcykseT1zLWcseD1wKnktKG0tZCpnLXAqZy1kKnkpLHc9YypmLGg9ZHUqYyxkPWgtKGgtYykscD1jLWQsaD1kdSpmLGc9aC0oaC1mKSx5PWYtZyxNPXAqeS0ody1kKmctcCpnLWQqeSksdj14LU0sbD14LXYsTXVbMF09eC0oditsKSsobC1NKSxfPW0rdixsPV8tbSxiPW0tKF8tbCkrKHYtbCksdj1iLXcsbD1iLXYsTXVbMV09Yi0oditsKSsobC13KSxUPV8rdixsPVQtXyxNdVsyXT1fLShULWwpKyh2LWwpLE11WzNdPVQ7Y29uc3QgJD1ndSh6LHh1LDQsTXUsd3UpO3JldHVybiB3dVskLTFdfSh0LG4sZSxyLGksbyxmKX1jb25zdCBBdT1NYXRoLnBvdygyLC01MiksU3U9bmV3IFVpbnQzMkFycmF5KDUxMik7Y2xhc3MgRXV7c3RhdGljIGZyb20odCxuPSR1LGU9RHUpe2NvbnN0IHI9dC5sZW5ndGgsaT1uZXcgRmxvYXQ2NEFycmF5KDIqcik7Zm9yKGxldCBvPTA7bzxyO28rKyl7Y29uc3Qgcj10W29dO2lbMipvXT1uKHIpLGlbMipvKzFdPWUocil9cmV0dXJuIG5ldyBFdShpKX1jb25zdHJ1Y3Rvcih0KXtjb25zdCBuPXQubGVuZ3RoPj4xO2lmKG4+MCYmIm51bWJlciIhPXR5cGVvZiB0WzBdKXRocm93IG5ldyBFcnJvcigiRXhwZWN0ZWQgY29vcmRzIHRvIGNvbnRhaW4gbnVtYmVycy4iKTt0aGlzLmNvb3Jkcz10O2NvbnN0IGU9TWF0aC5tYXgoMipuLTUsMCk7dGhpcy5fdHJpYW5nbGVzPW5ldyBVaW50MzJBcnJheSgzKmUpLHRoaXMuX2hhbGZlZGdlcz1uZXcgSW50MzJBcnJheSgzKmUpLHRoaXMuX2hhc2hTaXplPU1hdGguY2VpbChNYXRoLnNxcnQobikpLHRoaXMuX2h1bGxQcmV2PW5ldyBVaW50MzJBcnJheShuKSx0aGlzLl9odWxsTmV4dD1uZXcgVWludDMyQXJyYXkobiksdGhpcy5faHVsbFRyaT1uZXcgVWludDMyQXJyYXkobiksdGhpcy5faHVsbEhhc2g9bmV3IEludDMyQXJyYXkodGhpcy5faGFzaFNpemUpLmZpbGwoLTEpLHRoaXMuX2lkcz1uZXcgVWludDMyQXJyYXkobiksdGhpcy5fZGlzdHM9bmV3IEZsb2F0NjRBcnJheShuKSx0aGlzLnVwZGF0ZSgpfXVwZGF0ZSgpe2NvbnN0e2Nvb3Jkczp0LF9odWxsUHJldjpuLF9odWxsTmV4dDplLF9odWxsVHJpOnIsX2h1bGxIYXNoOml9PXRoaXMsbz10Lmxlbmd0aD4+MTtsZXQgYT0xLzAsdT0xLzAsYz0tMS8wLGY9LTEvMDtmb3IobGV0IG49MDtuPG87bisrKXtjb25zdCBlPXRbMipuXSxyPXRbMipuKzFdO2U8YSYmKGE9ZSkscjx1JiYodT1yKSxlPmMmJihjPWUpLHI+ZiYmKGY9ciksdGhpcy5faWRzW25dPW59Y29uc3Qgcz0oYStjKS8yLGw9KHUrZikvMjtsZXQgaCxkLHAsZz0xLzA7Zm9yKGxldCBuPTA7bjxvO24rKyl7Y29uc3QgZT1OdShzLGwsdFsyKm5dLHRbMipuKzFdKTtlPGcmJihoPW4sZz1lKX1jb25zdCB5PXRbMipoXSx2PXRbMipoKzFdO2c9MS8wO2ZvcihsZXQgbj0wO248bztuKyspe2lmKG49PT1oKWNvbnRpbnVlO2NvbnN0IGU9TnUoeSx2LHRbMipuXSx0WzIqbisxXSk7ZTxnJiZlPjAmJihkPW4sZz1lKX1sZXQgXz10WzIqZF0sYj10WzIqZCsxXSxtPTEvMDtmb3IobGV0IG49MDtuPG87bisrKXtpZihuPT09aHx8bj09PWQpY29udGludWU7Y29uc3QgZT1DdSh5LHYsXyxiLHRbMipuXSx0WzIqbisxXSk7ZTxtJiYocD1uLG09ZSl9bGV0IHg9dFsyKnBdLHc9dFsyKnArMV07aWYobT09PTEvMCl7Zm9yKGxldCBuPTA7bjxvO24rKyl0aGlzLl9kaXN0c1tuXT10WzIqbl0tdFswXXx8dFsyKm4rMV0tdFsxXTtQdSh0aGlzLl9pZHMsdGhpcy5fZGlzdHMsMCxvLTEpO2NvbnN0IG49bmV3IFVpbnQzMkFycmF5KG8pO2xldCBlPTA7Zm9yKGxldCB0PTAscj0tMS8wO3Q8bzt0Kyspe2NvbnN0IGk9dGhpcy5faWRzW3RdO3RoaXMuX2Rpc3RzW2ldPnImJihuW2UrK109aSxyPXRoaXMuX2Rpc3RzW2ldKX1yZXR1cm4gdGhpcy5odWxsPW4uc3ViYXJyYXkoMCxlKSx0aGlzLnRyaWFuZ2xlcz1uZXcgVWludDMyQXJyYXkoMCksdm9pZCh0aGlzLmhhbGZlZGdlcz1uZXcgVWludDMyQXJyYXkoMCkpfWlmKFR1KHksdixfLGIseCx3KTwwKXtjb25zdCB0PWQsbj1fLGU9YjtkPXAsXz14LGI9dyxwPXQseD1uLHc9ZX1jb25zdCBNPWZ1bmN0aW9uKHQsbixlLHIsaSxvKXtjb25zdCBhPWUtdCx1PXItbixjPWktdCxmPW8tbixzPWEqYSt1KnUsbD1jKmMrZipmLGg9LjUvKGEqZi11KmMpLGQ9dCsoZipzLXUqbCkqaCxwPW4rKGEqbC1jKnMpKmg7cmV0dXJue3g6ZCx5OnB9fSh5LHYsXyxiLHgsdyk7dGhpcy5fY3g9TS54LHRoaXMuX2N5PU0ueTtmb3IobGV0IG49MDtuPG87bisrKXRoaXMuX2Rpc3RzW25dPU51KHRbMipuXSx0WzIqbisxXSxNLngsTS55KTtQdSh0aGlzLl9pZHMsdGhpcy5fZGlzdHMsMCxvLTEpLHRoaXMuX2h1bGxTdGFydD1oO2xldCBUPTM7ZVtoXT1uW3BdPWQsZVtkXT1uW2hdPXAsZVtwXT1uW2RdPWgscltoXT0wLHJbZF09MSxyW3BdPTIsaS5maWxsKC0xKSxpW3RoaXMuX2hhc2hLZXkoeSx2KV09aCxpW3RoaXMuX2hhc2hLZXkoXyxiKV09ZCxpW3RoaXMuX2hhc2hLZXkoeCx3KV09cCx0aGlzLnRyaWFuZ2xlc0xlbj0wLHRoaXMuX2FkZFRyaWFuZ2xlKGgsZCxwLC0xLC0xLC0xKTtmb3IobGV0IG8sYSx1PTA7dTx0aGlzLl9pZHMubGVuZ3RoO3UrKyl7Y29uc3QgYz10aGlzLl9pZHNbdV0sZj10WzIqY10scz10WzIqYysxXTtpZih1PjAmJk1hdGguYWJzKGYtbyk8PUF1JiZNYXRoLmFicyhzLWEpPD1BdSljb250aW51ZTtpZihvPWYsYT1zLGM9PT1ofHxjPT09ZHx8Yz09PXApY29udGludWU7bGV0IGw9MDtmb3IobGV0IHQ9MCxuPXRoaXMuX2hhc2hLZXkoZixzKTt0PHRoaXMuX2hhc2hTaXplJiYobD1pWyhuK3QpJXRoaXMuX2hhc2hTaXplXSwtMT09PWx8fGw9PT1lW2xdKTt0KyspO2w9bltsXTtsZXQgZyx5PWw7Zm9yKDtnPWVbeV0sVHUoZixzLHRbMip5XSx0WzIqeSsxXSx0WzIqZ10sdFsyKmcrMV0pPj0wOylpZih5PWcseT09PWwpe3k9LTE7YnJlYWt9aWYoLTE9PT15KWNvbnRpbnVlO2xldCB2PXRoaXMuX2FkZFRyaWFuZ2xlKHksYyxlW3ldLC0xLC0xLHJbeV0pO3JbY109dGhpcy5fbGVnYWxpemUodisyKSxyW3ldPXYsVCsrO2xldCBfPWVbeV07Zm9yKDtnPWVbX10sVHUoZixzLHRbMipfXSx0WzIqXysxXSx0WzIqZ10sdFsyKmcrMV0pPDA7KXY9dGhpcy5fYWRkVHJpYW5nbGUoXyxjLGcscltjXSwtMSxyW19dKSxyW2NdPXRoaXMuX2xlZ2FsaXplKHYrMiksZVtfXT1fLFQtLSxfPWc7aWYoeT09PWwpZm9yKDtnPW5beV0sVHUoZixzLHRbMipnXSx0WzIqZysxXSx0WzIqeV0sdFsyKnkrMV0pPDA7KXY9dGhpcy5fYWRkVHJpYW5nbGUoZyxjLHksLTEsclt5XSxyW2ddKSx0aGlzLl9sZWdhbGl6ZSh2KzIpLHJbZ109dixlW3ldPXksVC0tLHk9Zzt0aGlzLl9odWxsU3RhcnQ9bltjXT15LGVbeV09bltfXT1jLGVbY109XyxpW3RoaXMuX2hhc2hLZXkoZixzKV09YyxpW3RoaXMuX2hhc2hLZXkodFsyKnldLHRbMip5KzFdKV09eX10aGlzLmh1bGw9bmV3IFVpbnQzMkFycmF5KFQpO2ZvcihsZXQgdD0wLG49dGhpcy5faHVsbFN0YXJ0O3Q8VDt0KyspdGhpcy5odWxsW3RdPW4sbj1lW25dO3RoaXMudHJpYW5nbGVzPXRoaXMuX3RyaWFuZ2xlcy5zdWJhcnJheSgwLHRoaXMudHJpYW5nbGVzTGVuKSx0aGlzLmhhbGZlZGdlcz10aGlzLl9oYWxmZWRnZXMuc3ViYXJyYXkoMCx0aGlzLnRyaWFuZ2xlc0xlbil9X2hhc2hLZXkodCxuKXtyZXR1cm4gTWF0aC5mbG9vcihmdW5jdGlvbih0LG4pe2NvbnN0IGU9dC8oTWF0aC5hYnModCkrTWF0aC5hYnMobikpO3JldHVybihuPjA/My1lOjErZSkvNH0odC10aGlzLl9jeCxuLXRoaXMuX2N5KSp0aGlzLl9oYXNoU2l6ZSkldGhpcy5faGFzaFNpemV9X2xlZ2FsaXplKHQpe2NvbnN0e190cmlhbmdsZXM6bixfaGFsZmVkZ2VzOmUsY29vcmRzOnJ9PXRoaXM7bGV0IGk9MCxvPTA7Zm9yKDs7KXtjb25zdCBhPWVbdF0sdT10LXQlMztpZihvPXUrKHQrMiklMywtMT09PWEpe2lmKDA9PT1pKWJyZWFrO3Q9U3VbLS1pXTtjb250aW51ZX1jb25zdCBjPWEtYSUzLGY9dSsodCsxKSUzLHM9YysoYSsyKSUzLGw9bltvXSxoPW5bdF0sZD1uW2ZdLHA9bltzXTtpZihrdShyWzIqbF0sclsyKmwrMV0sclsyKmhdLHJbMipoKzFdLHJbMipkXSxyWzIqZCsxXSxyWzIqcF0sclsyKnArMV0pKXtuW3RdPXAsblthXT1sO2NvbnN0IHI9ZVtzXTtpZigtMT09PXIpe2xldCBuPXRoaXMuX2h1bGxTdGFydDtkb3tpZih0aGlzLl9odWxsVHJpW25dPT09cyl7dGhpcy5faHVsbFRyaVtuXT10O2JyZWFrfW49dGhpcy5faHVsbFByZXZbbl19d2hpbGUobiE9PXRoaXMuX2h1bGxTdGFydCl9dGhpcy5fbGluayh0LHIpLHRoaXMuX2xpbmsoYSxlW29dKSx0aGlzLl9saW5rKG8scyk7Y29uc3QgdT1jKyhhKzEpJTM7aTxTdS5sZW5ndGgmJihTdVtpKytdPXUpfWVsc2V7aWYoMD09PWkpYnJlYWs7dD1TdVstLWldfX1yZXR1cm4gb31fbGluayh0LG4pe3RoaXMuX2hhbGZlZGdlc1t0XT1uLC0xIT09biYmKHRoaXMuX2hhbGZlZGdlc1tuXT10KX1fYWRkVHJpYW5nbGUodCxuLGUscixpLG8pe2NvbnN0IGE9dGhpcy50cmlhbmdsZXNMZW47cmV0dXJuIHRoaXMuX3RyaWFuZ2xlc1thXT10LHRoaXMuX3RyaWFuZ2xlc1thKzFdPW4sdGhpcy5fdHJpYW5nbGVzW2ErMl09ZSx0aGlzLl9saW5rKGEsciksdGhpcy5fbGluayhhKzEsaSksdGhpcy5fbGluayhhKzIsbyksdGhpcy50cmlhbmdsZXNMZW4rPTMsYX19ZnVuY3Rpb24gTnUodCxuLGUscil7Y29uc3QgaT10LWUsbz1uLXI7cmV0dXJuIGkqaStvKm99ZnVuY3Rpb24ga3UodCxuLGUscixpLG8sYSx1KXtjb25zdCBjPXQtYSxmPW4tdSxzPWUtYSxsPXItdSxoPWktYSxkPW8tdSxwPXMqcytsKmwsZz1oKmgrZCpkO3JldHVybiBjKihsKmctcCpkKS1mKihzKmctcCpoKSsoYypjK2YqZikqKHMqZC1sKmgpPDB9ZnVuY3Rpb24gQ3UodCxuLGUscixpLG8pe2NvbnN0IGE9ZS10LHU9ci1uLGM9aS10LGY9by1uLHM9YSphK3UqdSxsPWMqYytmKmYsaD0uNS8oYSpmLXUqYyksZD0oZipzLXUqbCkqaCxwPShhKmwtYypzKSpoO3JldHVybiBkKmQrcCpwfWZ1bmN0aW9uIFB1KHQsbixlLHIpe2lmKHItZTw9MjApZm9yKGxldCBpPWUrMTtpPD1yO2krKyl7Y29uc3Qgcj10W2ldLG89bltyXTtsZXQgYT1pLTE7Zm9yKDthPj1lJiZuW3RbYV1dPm87KXRbYSsxXT10W2EtLV07dFthKzFdPXJ9ZWxzZXtsZXQgaT1lKzEsbz1yO3p1KHQsZStyPj4xLGkpLG5bdFtlXV0+blt0W3JdXSYmenUodCxlLHIpLG5bdFtpXV0+blt0W3JdXSYmenUodCxpLHIpLG5bdFtlXV0+blt0W2ldXSYmenUodCxlLGkpO2NvbnN0IGE9dFtpXSx1PW5bYV07Zm9yKDs7KXtkb3tpKyt9d2hpbGUoblt0W2ldXTx1KTtkb3tvLS19d2hpbGUoblt0W29dXT51KTtpZihvPGkpYnJlYWs7enUodCxpLG8pfXRbZSsxXT10W29dLHRbb109YSxyLWkrMT49by1lPyhQdSh0LG4saSxyKSxQdSh0LG4sZSxvLTEpKTooUHUodCxuLGUsby0xKSxQdSh0LG4saSxyKSl9fWZ1bmN0aW9uIHp1KHQsbixlKXtjb25zdCByPXRbbl07dFtuXT10W2VdLHRbZV09cn1mdW5jdGlvbiAkdSh0KXtyZXR1cm4gdFswXX1mdW5jdGlvbiBEdSh0KXtyZXR1cm4gdFsxXX1jb25zdCBSdT0xZS02O2NsYXNzIEZ1e2NvbnN0cnVjdG9yKCl7dGhpcy5feDA9dGhpcy5feTA9dGhpcy5feDE9dGhpcy5feTE9bnVsbCx0aGlzLl89IiJ9bW92ZVRvKHQsbil7dGhpcy5fKz1gTSR7dGhpcy5feDA9dGhpcy5feDE9K3R9LCR7dGhpcy5feTA9dGhpcy5feTE9K259YH1jbG9zZVBhdGgoKXtudWxsIT09dGhpcy5feDEmJih0aGlzLl94MT10aGlzLl94MCx0aGlzLl95MT10aGlzLl95MCx0aGlzLl8rPSJaIil9bGluZVRvKHQsbil7dGhpcy5fKz1gTCR7dGhpcy5feDE9K3R9LCR7dGhpcy5feTE9K259YH1hcmModCxuLGUpe2NvbnN0IHI9KHQ9K3QpKyhlPStlKSxpPW49K247aWYoZTwwKXRocm93IG5ldyBFcnJvcigibmVnYXRpdmUgcmFkaXVzIik7bnVsbD09PXRoaXMuX3gxP3RoaXMuXys9YE0ke3J9LCR7aX1gOihNYXRoLmFicyh0aGlzLl94MS1yKT5SdXx8TWF0aC5hYnModGhpcy5feTEtaSk+UnUpJiYodGhpcy5fKz0iTCIrcisiLCIraSksZSYmKHRoaXMuXys9YEEke2V9LCR7ZX0sMCwxLDEsJHt0LWV9LCR7bn1BJHtlfSwke2V9LDAsMSwxLCR7dGhpcy5feDE9cn0sJHt0aGlzLl95MT1pfWApfXJlY3QodCxuLGUscil7dGhpcy5fKz1gTSR7dGhpcy5feDA9dGhpcy5feDE9K3R9LCR7dGhpcy5feTA9dGhpcy5feTE9K259aCR7K2V9diR7K3J9aCR7LWV9WmB9dmFsdWUoKXtyZXR1cm4gdGhpcy5ffHxudWxsfX1jbGFzcyBxdXtjb25zdHJ1Y3Rvcigpe3RoaXMuXz1bXX1tb3ZlVG8odCxuKXt0aGlzLl8ucHVzaChbdCxuXSl9Y2xvc2VQYXRoKCl7dGhpcy5fLnB1c2godGhpcy5fWzBdLnNsaWNlKCkpfWxpbmVUbyh0LG4pe3RoaXMuXy5wdXNoKFt0LG5dKX12YWx1ZSgpe3JldHVybiB0aGlzLl8ubGVuZ3RoP3RoaXMuXzpudWxsfX1jbGFzcyBVdXtjb25zdHJ1Y3Rvcih0LFtuLGUscixpXT1bMCwwLDk2MCw1MDBdKXtpZighKChyPStyKT49KG49K24pJiYoaT0raSk+PShlPStlKSkpdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIGJvdW5kcyIpO3RoaXMuZGVsYXVuYXk9dCx0aGlzLl9jaXJjdW1jZW50ZXJzPW5ldyBGbG9hdDY0QXJyYXkoMip0LnBvaW50cy5sZW5ndGgpLHRoaXMudmVjdG9ycz1uZXcgRmxvYXQ2NEFycmF5KDIqdC5wb2ludHMubGVuZ3RoKSx0aGlzLnhtYXg9cix0aGlzLnhtaW49bix0aGlzLnltYXg9aSx0aGlzLnltaW49ZSx0aGlzLl9pbml0KCl9dXBkYXRlKCl7cmV0dXJuIHRoaXMuZGVsYXVuYXkudXBkYXRlKCksdGhpcy5faW5pdCgpLHRoaXN9X2luaXQoKXtjb25zdHtkZWxhdW5heTp7cG9pbnRzOnQsaHVsbDpuLHRyaWFuZ2xlczplfSx2ZWN0b3JzOnJ9PXRoaXM7bGV0IGksbztjb25zdCBhPXRoaXMuY2lyY3VtY2VudGVycz10aGlzLl9jaXJjdW1jZW50ZXJzLnN1YmFycmF5KDAsZS5sZW5ndGgvMyoyKTtmb3IobGV0IHIsdSxjPTAsZj0wLHM9ZS5sZW5ndGg7YzxzO2MrPTMsZis9Mil7Y29uc3Qgcz0yKmVbY10sbD0yKmVbYysxXSxoPTIqZVtjKzJdLGQ9dFtzXSxwPXRbcysxXSxnPXRbbF0seT10W2wrMV0sdj10W2hdLF89dFtoKzFdLGI9Zy1kLG09eS1wLHg9di1kLHc9Xy1wLE09MiooYip3LW0qeCk7aWYoTWF0aC5hYnMoTSk8MWUtOSl7aWYodm9pZCAwPT09aSl7aT1vPTA7Zm9yKGNvbnN0IGUgb2YgbilpKz10WzIqZV0sbys9dFsyKmUrMV07aS89bi5sZW5ndGgsby89bi5sZW5ndGh9Y29uc3QgZT0xZTkqTWF0aC5zaWduKChpLWQpKnctKG8tcCkqeCk7cj0oZCt2KS8yLWUqdyx1PShwK18pLzIrZSp4fWVsc2V7Y29uc3QgdD0xL00sbj1iKmIrbSptLGU9eCp4K3cqdztyPWQrKHcqbi1tKmUpKnQsdT1wKyhiKmUteCpuKSp0fWFbZl09cixhW2YrMV09dX1sZXQgdSxjLGYscz1uW24ubGVuZ3RoLTFdLGw9NCpzLGg9dFsyKnNdLGQ9dFsyKnMrMV07ci5maWxsKDApO2ZvcihsZXQgZT0wO2U8bi5sZW5ndGg7KytlKXM9bltlXSx1PWwsYz1oLGY9ZCxsPTQqcyxoPXRbMipzXSxkPXRbMipzKzFdLHJbdSsyXT1yW2xdPWYtZCxyW3UrM109cltsKzFdPWgtY31yZW5kZXIodCl7Y29uc3Qgbj1udWxsPT10P3Q9bmV3IEZ1OnZvaWQgMCx7ZGVsYXVuYXk6e2hhbGZlZGdlczplLGluZWRnZXM6cixodWxsOml9LGNpcmN1bWNlbnRlcnM6byx2ZWN0b3JzOmF9PXRoaXM7aWYoaS5sZW5ndGg8PTEpcmV0dXJuIG51bGw7Zm9yKGxldCBuPTAscj1lLmxlbmd0aDtuPHI7KytuKXtjb25zdCByPWVbbl07aWYocjxuKWNvbnRpbnVlO2NvbnN0IGk9MipNYXRoLmZsb29yKG4vMyksYT0yKk1hdGguZmxvb3Ioci8zKSx1PW9baV0sYz1vW2krMV0sZj1vW2FdLHM9b1thKzFdO3RoaXMuX3JlbmRlclNlZ21lbnQodSxjLGYscyx0KX1sZXQgdSxjPWlbaS5sZW5ndGgtMV07Zm9yKGxldCBuPTA7bjxpLmxlbmd0aDsrK24pe3U9YyxjPWlbbl07Y29uc3QgZT0yKk1hdGguZmxvb3IocltjXS8zKSxmPW9bZV0scz1vW2UrMV0sbD00KnUsaD10aGlzLl9wcm9qZWN0KGYscyxhW2wrMl0sYVtsKzNdKTtoJiZ0aGlzLl9yZW5kZXJTZWdtZW50KGYscyxoWzBdLGhbMV0sdCl9cmV0dXJuIG4mJm4udmFsdWUoKX1yZW5kZXJCb3VuZHModCl7Y29uc3Qgbj1udWxsPT10P3Q9bmV3IEZ1OnZvaWQgMDtyZXR1cm4gdC5yZWN0KHRoaXMueG1pbix0aGlzLnltaW4sdGhpcy54bWF4LXRoaXMueG1pbix0aGlzLnltYXgtdGhpcy55bWluKSxuJiZuLnZhbHVlKCl9cmVuZGVyQ2VsbCh0LG4pe2NvbnN0IGU9bnVsbD09bj9uPW5ldyBGdTp2b2lkIDAscj10aGlzLl9jbGlwKHQpO2lmKG51bGw9PT1yfHwhci5sZW5ndGgpcmV0dXJuO24ubW92ZVRvKHJbMF0sclsxXSk7bGV0IGk9ci5sZW5ndGg7Zm9yKDtyWzBdPT09cltpLTJdJiZyWzFdPT09cltpLTFdJiZpPjE7KWktPTI7Zm9yKGxldCB0PTI7dDxpO3QrPTIpclt0XT09PXJbdC0yXSYmclt0KzFdPT09clt0LTFdfHxuLmxpbmVUbyhyW3RdLHJbdCsxXSk7cmV0dXJuIG4uY2xvc2VQYXRoKCksZSYmZS52YWx1ZSgpfSpjZWxsUG9seWdvbnMoKXtjb25zdHtkZWxhdW5heTp7cG9pbnRzOnR9fT10aGlzO2ZvcihsZXQgbj0wLGU9dC5sZW5ndGgvMjtuPGU7KytuKXtjb25zdCB0PXRoaXMuY2VsbFBvbHlnb24obik7dCYmKHQuaW5kZXg9bix5aWVsZCB0KX19Y2VsbFBvbHlnb24odCl7Y29uc3Qgbj1uZXcgcXU7cmV0dXJuIHRoaXMucmVuZGVyQ2VsbCh0LG4pLG4udmFsdWUoKX1fcmVuZGVyU2VnbWVudCh0LG4sZSxyLGkpe2xldCBvO2NvbnN0IGE9dGhpcy5fcmVnaW9uY29kZSh0LG4pLHU9dGhpcy5fcmVnaW9uY29kZShlLHIpOzA9PT1hJiYwPT09dT8oaS5tb3ZlVG8odCxuKSxpLmxpbmVUbyhlLHIpKToobz10aGlzLl9jbGlwU2VnbWVudCh0LG4sZSxyLGEsdSkpJiYoaS5tb3ZlVG8ob1swXSxvWzFdKSxpLmxpbmVUbyhvWzJdLG9bM10pKX1jb250YWlucyh0LG4sZSl7cmV0dXJuKG49K24pPT1uJiYoZT0rZSk9PWUmJnRoaXMuZGVsYXVuYXkuX3N0ZXAodCxuLGUpPT09dH0qbmVpZ2hib3JzKHQpe2NvbnN0IG49dGhpcy5fY2xpcCh0KTtpZihuKWZvcihjb25zdCBlIG9mIHRoaXMuZGVsYXVuYXkubmVpZ2hib3JzKHQpKXtjb25zdCB0PXRoaXMuX2NsaXAoZSk7aWYodCl0OmZvcihsZXQgcj0wLGk9bi5sZW5ndGg7cjxpO3IrPTIpZm9yKGxldCBvPTAsYT10Lmxlbmd0aDtvPGE7bys9MilpZihuW3JdPT09dFtvXSYmbltyKzFdPT09dFtvKzFdJiZuWyhyKzIpJWldPT09dFsobythLTIpJWFdJiZuWyhyKzMpJWldPT09dFsobythLTEpJWFdKXt5aWVsZCBlO2JyZWFrIHR9fX1fY2VsbCh0KXtjb25zdHtjaXJjdW1jZW50ZXJzOm4sZGVsYXVuYXk6e2luZWRnZXM6ZSxoYWxmZWRnZXM6cix0cmlhbmdsZXM6aX19PXRoaXMsbz1lW3RdO2lmKC0xPT09bylyZXR1cm4gbnVsbDtjb25zdCBhPVtdO2xldCB1PW87ZG97Y29uc3QgZT1NYXRoLmZsb29yKHUvMyk7aWYoYS5wdXNoKG5bMiplXSxuWzIqZSsxXSksdT11JTM9PTI/dS0yOnUrMSxpW3VdIT09dClicmVhazt1PXJbdV19d2hpbGUodSE9PW8mJi0xIT09dSk7cmV0dXJuIGF9X2NsaXAodCl7aWYoMD09PXQmJjE9PT10aGlzLmRlbGF1bmF5Lmh1bGwubGVuZ3RoKXJldHVyblt0aGlzLnhtYXgsdGhpcy55bWluLHRoaXMueG1heCx0aGlzLnltYXgsdGhpcy54bWluLHRoaXMueW1heCx0aGlzLnhtaW4sdGhpcy55bWluXTtjb25zdCBuPXRoaXMuX2NlbGwodCk7aWYobnVsbD09PW4pcmV0dXJuIG51bGw7Y29uc3R7dmVjdG9yczplfT10aGlzLHI9NCp0O3JldHVybiB0aGlzLl9zaW1wbGlmeShlW3JdfHxlW3IrMV0/dGhpcy5fY2xpcEluZmluaXRlKHQsbixlW3JdLGVbcisxXSxlW3IrMl0sZVtyKzNdKTp0aGlzLl9jbGlwRmluaXRlKHQsbikpfV9jbGlwRmluaXRlKHQsbil7Y29uc3QgZT1uLmxlbmd0aDtsZXQgcixpLG8sYSx1PW51bGwsYz1uW2UtMl0sZj1uW2UtMV0scz10aGlzLl9yZWdpb25jb2RlKGMsZiksbD0wO2ZvcihsZXQgaD0wO2g8ZTtoKz0yKWlmKHI9YyxpPWYsYz1uW2hdLGY9bltoKzFdLG89cyxzPXRoaXMuX3JlZ2lvbmNvZGUoYyxmKSwwPT09byYmMD09PXMpYT1sLGw9MCx1P3UucHVzaChjLGYpOnU9W2MsZl07ZWxzZXtsZXQgbixlLGgsZCxwO2lmKDA9PT1vKXtpZihudWxsPT09KG49dGhpcy5fY2xpcFNlZ21lbnQocixpLGMsZixvLHMpKSljb250aW51ZTtbZSxoLGQscF09bn1lbHNle2lmKG51bGw9PT0obj10aGlzLl9jbGlwU2VnbWVudChjLGYscixpLHMsbykpKWNvbnRpbnVlO1tkLHAsZSxoXT1uLGE9bCxsPXRoaXMuX2VkZ2Vjb2RlKGUsaCksYSYmbCYmdGhpcy5fZWRnZSh0LGEsbCx1LHUubGVuZ3RoKSx1P3UucHVzaChlLGgpOnU9W2UsaF19YT1sLGw9dGhpcy5fZWRnZWNvZGUoZCxwKSxhJiZsJiZ0aGlzLl9lZGdlKHQsYSxsLHUsdS5sZW5ndGgpLHU/dS5wdXNoKGQscCk6dT1bZCxwXX1pZih1KWE9bCxsPXRoaXMuX2VkZ2Vjb2RlKHVbMF0sdVsxXSksYSYmbCYmdGhpcy5fZWRnZSh0LGEsbCx1LHUubGVuZ3RoKTtlbHNlIGlmKHRoaXMuY29udGFpbnModCwodGhpcy54bWluK3RoaXMueG1heCkvMiwodGhpcy55bWluK3RoaXMueW1heCkvMikpcmV0dXJuW3RoaXMueG1heCx0aGlzLnltaW4sdGhpcy54bWF4LHRoaXMueW1heCx0aGlzLnhtaW4sdGhpcy55bWF4LHRoaXMueG1pbix0aGlzLnltaW5dO3JldHVybiB1fV9jbGlwU2VnbWVudCh0LG4sZSxyLGksbyl7Y29uc3QgYT1pPG87Zm9yKGEmJihbdCxuLGUscixpLG9dPVtlLHIsdCxuLG8saV0pOzspe2lmKDA9PT1pJiYwPT09bylyZXR1cm4gYT9bZSxyLHQsbl06W3QsbixlLHJdO2lmKGkmbylyZXR1cm4gbnVsbDtsZXQgdSxjLGY9aXx8bzs4JmY/KHU9dCsoZS10KSoodGhpcy55bWF4LW4pLyhyLW4pLGM9dGhpcy55bWF4KTo0JmY/KHU9dCsoZS10KSoodGhpcy55bWluLW4pLyhyLW4pLGM9dGhpcy55bWluKToyJmY/KGM9bisoci1uKSoodGhpcy54bWF4LXQpLyhlLXQpLHU9dGhpcy54bWF4KTooYz1uKyhyLW4pKih0aGlzLnhtaW4tdCkvKGUtdCksdT10aGlzLnhtaW4pLGk/KHQ9dSxuPWMsaT10aGlzLl9yZWdpb25jb2RlKHQsbikpOihlPXUscj1jLG89dGhpcy5fcmVnaW9uY29kZShlLHIpKX19X2NsaXBJbmZpbml0ZSh0LG4sZSxyLGksbyl7bGV0IGEsdT1BcnJheS5mcm9tKG4pO2lmKChhPXRoaXMuX3Byb2plY3QodVswXSx1WzFdLGUscikpJiZ1LnVuc2hpZnQoYVswXSxhWzFdKSwoYT10aGlzLl9wcm9qZWN0KHVbdS5sZW5ndGgtMl0sdVt1Lmxlbmd0aC0xXSxpLG8pKSYmdS5wdXNoKGFbMF0sYVsxXSksdT10aGlzLl9jbGlwRmluaXRlKHQsdSkpZm9yKGxldCBuLGU9MCxyPXUubGVuZ3RoLGk9dGhpcy5fZWRnZWNvZGUodVtyLTJdLHVbci0xXSk7ZTxyO2UrPTIpbj1pLGk9dGhpcy5fZWRnZWNvZGUodVtlXSx1W2UrMV0pLG4mJmkmJihlPXRoaXMuX2VkZ2UodCxuLGksdSxlKSxyPXUubGVuZ3RoKTtlbHNlIHRoaXMuY29udGFpbnModCwodGhpcy54bWluK3RoaXMueG1heCkvMiwodGhpcy55bWluK3RoaXMueW1heCkvMikmJih1PVt0aGlzLnhtaW4sdGhpcy55bWluLHRoaXMueG1heCx0aGlzLnltaW4sdGhpcy54bWF4LHRoaXMueW1heCx0aGlzLnhtaW4sdGhpcy55bWF4XSk7cmV0dXJuIHV9X2VkZ2UodCxuLGUscixpKXtmb3IoO24hPT1lOyl7bGV0IGUsbztzd2l0Y2gobil7Y2FzZSA1Om49NDtjb250aW51ZTtjYXNlIDQ6bj02LGU9dGhpcy54bWF4LG89dGhpcy55bWluO2JyZWFrO2Nhc2UgNjpuPTI7Y29udGludWU7Y2FzZSAyOm49MTAsZT10aGlzLnhtYXgsbz10aGlzLnltYXg7YnJlYWs7Y2FzZSAxMDpuPTg7Y29udGludWU7Y2FzZSA4Om49OSxlPXRoaXMueG1pbixvPXRoaXMueW1heDticmVhaztjYXNlIDk6bj0xO2NvbnRpbnVlO2Nhc2UgMTpuPTUsZT10aGlzLnhtaW4sbz10aGlzLnltaW59cltpXT09PWUmJnJbaSsxXT09PW98fCF0aGlzLmNvbnRhaW5zKHQsZSxvKXx8KHIuc3BsaWNlKGksMCxlLG8pLGkrPTIpfXJldHVybiBpfV9wcm9qZWN0KHQsbixlLHIpe2xldCBpLG8sYSx1PTEvMDtpZihyPDApe2lmKG48PXRoaXMueW1pbilyZXR1cm4gbnVsbDsoaT0odGhpcy55bWluLW4pL3IpPHUmJihhPXRoaXMueW1pbixvPXQrKHU9aSkqZSl9ZWxzZSBpZihyPjApe2lmKG4+PXRoaXMueW1heClyZXR1cm4gbnVsbDsoaT0odGhpcy55bWF4LW4pL3IpPHUmJihhPXRoaXMueW1heCxvPXQrKHU9aSkqZSl9aWYoZT4wKXtpZih0Pj10aGlzLnhtYXgpcmV0dXJuIG51bGw7KGk9KHRoaXMueG1heC10KS9lKTx1JiYobz10aGlzLnhtYXgsYT1uKyh1PWkpKnIpfWVsc2UgaWYoZTwwKXtpZih0PD10aGlzLnhtaW4pcmV0dXJuIG51bGw7KGk9KHRoaXMueG1pbi10KS9lKTx1JiYobz10aGlzLnhtaW4sYT1uKyh1PWkpKnIpfXJldHVybltvLGFdfV9lZGdlY29kZSh0LG4pe3JldHVybih0PT09dGhpcy54bWluPzE6dD09PXRoaXMueG1heD8yOjApfChuPT09dGhpcy55bWluPzQ6bj09PXRoaXMueW1heD84OjApfV9yZWdpb25jb2RlKHQsbil7cmV0dXJuKHQ8dGhpcy54bWluPzE6dD50aGlzLnhtYXg/MjowKXwobjx0aGlzLnltaW4/NDpuPnRoaXMueW1heD84OjApfV9zaW1wbGlmeSh0KXtpZih0JiZ0Lmxlbmd0aD40KXtmb3IobGV0IG49MDtuPHQubGVuZ3RoO24rPTIpe2NvbnN0IGU9KG4rMikldC5sZW5ndGgscj0obis0KSV0Lmxlbmd0aDsodFtuXT09PXRbZV0mJnRbZV09PT10W3JdfHx0W24rMV09PT10W2UrMV0mJnRbZSsxXT09PXRbcisxXSkmJih0LnNwbGljZShlLDIpLG4tPTIpfXQubGVuZ3RofHwodD1udWxsKX1yZXR1cm4gdH19Y29uc3QgSXU9MipNYXRoLlBJLE91PU1hdGgucG93O2Z1bmN0aW9uIEJ1KHQpe3JldHVybiB0WzBdfWZ1bmN0aW9uIFl1KHQpe3JldHVybiB0WzFdfWZ1bmN0aW9uIEx1KHQsbixlKXtyZXR1cm5bdCtNYXRoLnNpbih0K24pKmUsbitNYXRoLmNvcyh0LW4pKmVdfWNsYXNzIGp1e3N0YXRpYyBmcm9tKHQsbj1CdSxlPVl1LHIpe3JldHVybiBuZXcganUoImxlbmd0aCJpbiB0P2Z1bmN0aW9uKHQsbixlLHIpe2NvbnN0IGk9dC5sZW5ndGgsbz1uZXcgRmxvYXQ2NEFycmF5KDIqaSk7Zm9yKGxldCBhPTA7YTxpOysrYSl7Y29uc3QgaT10W2FdO29bMiphXT1uLmNhbGwocixpLGEsdCksb1syKmErMV09ZS5jYWxsKHIsaSxhLHQpfXJldHVybiBvfSh0LG4sZSxyKTpGbG9hdDY0QXJyYXkuZnJvbShmdW5jdGlvbioodCxuLGUscil7bGV0IGk9MDtmb3IoY29uc3QgbyBvZiB0KXlpZWxkIG4uY2FsbChyLG8saSx0KSx5aWVsZCBlLmNhbGwocixvLGksdCksKytpfSh0LG4sZSxyKSkpfWNvbnN0cnVjdG9yKHQpe3RoaXMuX2RlbGF1bmF0b3I9bmV3IEV1KHQpLHRoaXMuaW5lZGdlcz1uZXcgSW50MzJBcnJheSh0Lmxlbmd0aC8yKSx0aGlzLl9odWxsSW5kZXg9bmV3IEludDMyQXJyYXkodC5sZW5ndGgvMiksdGhpcy5wb2ludHM9dGhpcy5fZGVsYXVuYXRvci5jb29yZHMsdGhpcy5faW5pdCgpfXVwZGF0ZSgpe3JldHVybiB0aGlzLl9kZWxhdW5hdG9yLnVwZGF0ZSgpLHRoaXMuX2luaXQoKSx0aGlzfV9pbml0KCl7Y29uc3QgdD10aGlzLl9kZWxhdW5hdG9yLG49dGhpcy5wb2ludHM7aWYodC5odWxsJiZ0Lmh1bGwubGVuZ3RoPjImJmZ1bmN0aW9uKHQpe2NvbnN0e3RyaWFuZ2xlczpuLGNvb3JkczplfT10O2ZvcihsZXQgdD0wO3Q8bi5sZW5ndGg7dCs9Myl7Y29uc3Qgcj0yKm5bdF0saT0yKm5bdCsxXSxvPTIqblt0KzJdO2lmKChlW29dLWVbcl0pKihlW2krMV0tZVtyKzFdKS0oZVtpXS1lW3JdKSooZVtvKzFdLWVbcisxXSk+MWUtMTApcmV0dXJuITF9cmV0dXJuITB9KHQpKXt0aGlzLmNvbGxpbmVhcj1JbnQzMkFycmF5LmZyb20oe2xlbmd0aDpuLmxlbmd0aC8yfSwoKHQsbik9Pm4pKS5zb3J0KCgodCxlKT0+blsyKnRdLW5bMiplXXx8blsyKnQrMV0tblsyKmUrMV0pKTtjb25zdCB0PXRoaXMuY29sbGluZWFyWzBdLGU9dGhpcy5jb2xsaW5lYXJbdGhpcy5jb2xsaW5lYXIubGVuZ3RoLTFdLHI9W25bMip0XSxuWzIqdCsxXSxuWzIqZV0sblsyKmUrMV1dLGk9MWUtOCpNYXRoLmh5cG90KHJbM10tclsxXSxyWzJdLXJbMF0pO2ZvcihsZXQgdD0wLGU9bi5sZW5ndGgvMjt0PGU7Kyt0KXtjb25zdCBlPUx1KG5bMip0XSxuWzIqdCsxXSxpKTtuWzIqdF09ZVswXSxuWzIqdCsxXT1lWzFdfXRoaXMuX2RlbGF1bmF0b3I9bmV3IEV1KG4pfWVsc2UgZGVsZXRlIHRoaXMuY29sbGluZWFyO2NvbnN0IGU9dGhpcy5oYWxmZWRnZXM9dGhpcy5fZGVsYXVuYXRvci5oYWxmZWRnZXMscj10aGlzLmh1bGw9dGhpcy5fZGVsYXVuYXRvci5odWxsLGk9dGhpcy50cmlhbmdsZXM9dGhpcy5fZGVsYXVuYXRvci50cmlhbmdsZXMsbz10aGlzLmluZWRnZXMuZmlsbCgtMSksYT10aGlzLl9odWxsSW5kZXguZmlsbCgtMSk7Zm9yKGxldCB0PTAsbj1lLmxlbmd0aDt0PG47Kyt0KXtjb25zdCBuPWlbdCUzPT0yP3QtMjp0KzFdOy0xIT09ZVt0XSYmLTEhPT1vW25dfHwob1tuXT10KX1mb3IobGV0IHQ9MCxuPXIubGVuZ3RoO3Q8bjsrK3QpYVtyW3RdXT10O3IubGVuZ3RoPD0yJiZyLmxlbmd0aD4wJiYodGhpcy50cmlhbmdsZXM9bmV3IEludDMyQXJyYXkoMykuZmlsbCgtMSksdGhpcy5oYWxmZWRnZXM9bmV3IEludDMyQXJyYXkoMykuZmlsbCgtMSksdGhpcy50cmlhbmdsZXNbMF09clswXSxvW3JbMF1dPTEsMj09PXIubGVuZ3RoJiYob1tyWzFdXT0wLHRoaXMudHJpYW5nbGVzWzFdPXJbMV0sdGhpcy50cmlhbmdsZXNbMl09clsxXSkpfXZvcm9ub2kodCl7cmV0dXJuIG5ldyBVdSh0aGlzLHQpfSpuZWlnaGJvcnModCl7Y29uc3R7aW5lZGdlczpuLGh1bGw6ZSxfaHVsbEluZGV4OnIsaGFsZmVkZ2VzOmksdHJpYW5nbGVzOm8sY29sbGluZWFyOmF9PXRoaXM7aWYoYSl7Y29uc3Qgbj1hLmluZGV4T2YodCk7cmV0dXJuIG4+MCYmKHlpZWxkIGFbbi0xXSksdm9pZChuPGEubGVuZ3RoLTEmJih5aWVsZCBhW24rMV0pKX1jb25zdCB1PW5bdF07aWYoLTE9PT11KXJldHVybjtsZXQgYz11LGY9LTE7ZG97aWYoeWllbGQgZj1vW2NdLGM9YyUzPT0yP2MtMjpjKzEsb1tjXSE9PXQpcmV0dXJuO2lmKGM9aVtjXSwtMT09PWMpe2NvbnN0IG49ZVsoclt0XSsxKSVlLmxlbmd0aF07cmV0dXJuIHZvaWQobiE9PWYmJih5aWVsZCBuKSl9fXdoaWxlKGMhPT11KX1maW5kKHQsbixlPTApe2lmKCh0PSt0KSE9dHx8KG49K24pIT1uKXJldHVybi0xO2NvbnN0IHI9ZTtsZXQgaTtmb3IoOyhpPXRoaXMuX3N0ZXAoZSx0LG4pKT49MCYmaSE9PWUmJmkhPT1yOyllPWk7cmV0dXJuIGl9X3N0ZXAodCxuLGUpe2NvbnN0e2luZWRnZXM6cixodWxsOmksX2h1bGxJbmRleDpvLGhhbGZlZGdlczphLHRyaWFuZ2xlczp1LHBvaW50czpjfT10aGlzO2lmKC0xPT09clt0XXx8IWMubGVuZ3RoKXJldHVybih0KzEpJShjLmxlbmd0aD4+MSk7bGV0IGY9dCxzPU91KG4tY1syKnRdLDIpK091KGUtY1syKnQrMV0sMik7Y29uc3QgbD1yW3RdO2xldCBoPWw7ZG97bGV0IHI9dVtoXTtjb25zdCBsPU91KG4tY1syKnJdLDIpK091KGUtY1syKnIrMV0sMik7aWYobDxzJiYocz1sLGY9ciksaD1oJTM9PTI/aC0yOmgrMSx1W2hdIT09dClicmVhaztpZihoPWFbaF0sLTE9PT1oKXtpZihoPWlbKG9bdF0rMSklaS5sZW5ndGhdLGghPT1yJiZPdShuLWNbMipoXSwyKStPdShlLWNbMipoKzFdLDIpPHMpcmV0dXJuIGg7YnJlYWt9fXdoaWxlKGghPT1sKTtyZXR1cm4gZn1yZW5kZXIodCl7Y29uc3Qgbj1udWxsPT10P3Q9bmV3IEZ1OnZvaWQgMCx7cG9pbnRzOmUsaGFsZmVkZ2VzOnIsdHJpYW5nbGVzOml9PXRoaXM7Zm9yKGxldCBuPTAsbz1yLmxlbmd0aDtuPG87KytuKXtjb25zdCBvPXJbbl07aWYobzxuKWNvbnRpbnVlO2NvbnN0IGE9MippW25dLHU9MippW29dO3QubW92ZVRvKGVbYV0sZVthKzFdKSx0LmxpbmVUbyhlW3VdLGVbdSsxXSl9cmV0dXJuIHRoaXMucmVuZGVySHVsbCh0KSxuJiZuLnZhbHVlKCl9cmVuZGVyUG9pbnRzKHQsbil7dm9pZCAwIT09bnx8dCYmImZ1bmN0aW9uIj09dHlwZW9mIHQubW92ZVRvfHwobj10LHQ9bnVsbCksbj1udWxsPT1uPzI6K247Y29uc3QgZT1udWxsPT10P3Q9bmV3IEZ1OnZvaWQgMCx7cG9pbnRzOnJ9PXRoaXM7Zm9yKGxldCBlPTAsaT1yLmxlbmd0aDtlPGk7ZSs9Mil7Y29uc3QgaT1yW2VdLG89cltlKzFdO3QubW92ZVRvKGkrbixvKSx0LmFyYyhpLG8sbiwwLEl1KX1yZXR1cm4gZSYmZS52YWx1ZSgpfXJlbmRlckh1bGwodCl7Y29uc3Qgbj1udWxsPT10P3Q9bmV3IEZ1OnZvaWQgMCx7aHVsbDplLHBvaW50czpyfT10aGlzLGk9MiplWzBdLG89ZS5sZW5ndGg7dC5tb3ZlVG8ocltpXSxyW2krMV0pO2ZvcihsZXQgbj0xO248bzsrK24pe2NvbnN0IGk9MiplW25dO3QubGluZVRvKHJbaV0scltpKzFdKX1yZXR1cm4gdC5jbG9zZVBhdGgoKSxuJiZuLnZhbHVlKCl9aHVsbFBvbHlnb24oKXtjb25zdCB0PW5ldyBxdTtyZXR1cm4gdGhpcy5yZW5kZXJIdWxsKHQpLHQudmFsdWUoKX1yZW5kZXJUcmlhbmdsZSh0LG4pe2NvbnN0IGU9bnVsbD09bj9uPW5ldyBGdTp2b2lkIDAse3BvaW50czpyLHRyaWFuZ2xlczppfT10aGlzLG89MippW3QqPTNdLGE9MippW3QrMV0sdT0yKmlbdCsyXTtyZXR1cm4gbi5tb3ZlVG8ocltvXSxyW28rMV0pLG4ubGluZVRvKHJbYV0sclthKzFdKSxuLmxpbmVUbyhyW3VdLHJbdSsxXSksbi5jbG9zZVBhdGgoKSxlJiZlLnZhbHVlKCl9KnRyaWFuZ2xlUG9seWdvbnMoKXtjb25zdHt0cmlhbmdsZXM6dH09dGhpcztmb3IobGV0IG49MCxlPXQubGVuZ3RoLzM7bjxlOysrbil5aWVsZCB0aGlzLnRyaWFuZ2xlUG9seWdvbihuKX10cmlhbmdsZVBvbHlnb24odCl7Y29uc3Qgbj1uZXcgcXU7cmV0dXJuIHRoaXMucmVuZGVyVHJpYW5nbGUodCxuKSxuLnZhbHVlKCl9fXZhciBIdT17fSxYdT17fSxHdT0zNCxWdT0xMCxXdT0xMztmdW5jdGlvbiBadSh0KXtyZXR1cm4gbmV3IEZ1bmN0aW9uKCJkIiwicmV0dXJuIHsiK3QubWFwKChmdW5jdGlvbih0LG4pe3JldHVybiBKU09OLnN0cmluZ2lmeSh0KSsiOiBkWyIrbisnXSB8fCAiIid9KSkuam9pbigiLCIpKyJ9Iil9ZnVuY3Rpb24gS3UodCl7dmFyIG49T2JqZWN0LmNyZWF0ZShudWxsKSxlPVtdO3JldHVybiB0LmZvckVhY2goKGZ1bmN0aW9uKHQpe2Zvcih2YXIgciBpbiB0KXIgaW4gbnx8ZS5wdXNoKG5bcl09cil9KSksZX1mdW5jdGlvbiBRdSh0LG4pe3ZhciBlPXQrIiIscj1lLmxlbmd0aDtyZXR1cm4gcjxuP25ldyBBcnJheShuLXIrMSkuam9pbigwKStlOmV9ZnVuY3Rpb24gSnUodCl7dmFyIG4sZT10LmdldFVUQ0hvdXJzKCkscj10LmdldFVUQ01pbnV0ZXMoKSxpPXQuZ2V0VVRDU2Vjb25kcygpLG89dC5nZXRVVENNaWxsaXNlY29uZHMoKTtyZXR1cm4gaXNOYU4odCk/IkludmFsaWQgRGF0ZSI6KChuPXQuZ2V0VVRDRnVsbFllYXIoKSk8MD8iLSIrUXUoLW4sNik6bj45OTk5PyIrIitRdShuLDYpOlF1KG4sNCkpKyItIitRdSh0LmdldFVUQ01vbnRoKCkrMSwyKSsiLSIrUXUodC5nZXRVVENEYXRlKCksMikrKG8/IlQiK1F1KGUsMikrIjoiK1F1KHIsMikrIjoiK1F1KGksMikrIi4iK1F1KG8sMykrIloiOmk/IlQiK1F1KGUsMikrIjoiK1F1KHIsMikrIjoiK1F1KGksMikrIloiOnJ8fGU/IlQiK1F1KGUsMikrIjoiK1F1KHIsMikrIloiOiIiKX1mdW5jdGlvbiB0Yyh0KXt2YXIgbj1uZXcgUmVnRXhwKCdbIicrdCsiXG5ccl0iKSxlPXQuY2hhckNvZGVBdCgwKTtmdW5jdGlvbiByKHQsbil7dmFyIHIsaT1bXSxvPXQubGVuZ3RoLGE9MCx1PTAsYz1vPD0wLGY9ITE7ZnVuY3Rpb24gcygpe2lmKGMpcmV0dXJuIFh1O2lmKGYpcmV0dXJuIGY9ITEsSHU7dmFyIG4scixpPWE7aWYodC5jaGFyQ29kZUF0KGkpPT09R3Upe2Zvcig7YSsrPG8mJnQuY2hhckNvZGVBdChhKSE9PUd1fHx0LmNoYXJDb2RlQXQoKythKT09PUd1Oyk7cmV0dXJuKG49YSk+PW8/Yz0hMDoocj10LmNoYXJDb2RlQXQoYSsrKSk9PT1WdT9mPSEwOnI9PT1XdSYmKGY9ITAsdC5jaGFyQ29kZUF0KGEpPT09VnUmJisrYSksdC5zbGljZShpKzEsbi0xKS5yZXBsYWNlKC8iIi9nLCciJyl9Zm9yKDthPG87KXtpZigocj10LmNoYXJDb2RlQXQobj1hKyspKT09PVZ1KWY9ITA7ZWxzZSBpZihyPT09V3UpZj0hMCx0LmNoYXJDb2RlQXQoYSk9PT1WdSYmKythO2Vsc2UgaWYociE9PWUpY29udGludWU7cmV0dXJuIHQuc2xpY2UoaSxuKX1yZXR1cm4gYz0hMCx0LnNsaWNlKGksbyl9Zm9yKHQuY2hhckNvZGVBdChvLTEpPT09VnUmJi0tbyx0LmNoYXJDb2RlQXQoby0xKT09PVd1JiYtLW87KHI9cygpKSE9PVh1Oyl7Zm9yKHZhciBsPVtdO3IhPT1IdSYmciE9PVh1OylsLnB1c2gocikscj1zKCk7biYmbnVsbD09KGw9bihsLHUrKykpfHxpLnB1c2gobCl9cmV0dXJuIGl9ZnVuY3Rpb24gaShuLGUpe3JldHVybiBuLm1hcCgoZnVuY3Rpb24obil7cmV0dXJuIGUubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gYShuW3RdKX0pKS5qb2luKHQpfSkpfWZ1bmN0aW9uIG8obil7cmV0dXJuIG4ubWFwKGEpLmpvaW4odCl9ZnVuY3Rpb24gYSh0KXtyZXR1cm4gbnVsbD09dD8iIjp0IGluc3RhbmNlb2YgRGF0ZT9KdSh0KTpuLnRlc3QodCs9IiIpPyciJyt0LnJlcGxhY2UoLyIvZywnIiInKSsnIic6dH1yZXR1cm57cGFyc2U6ZnVuY3Rpb24odCxuKXt2YXIgZSxpLG89cih0LChmdW5jdGlvbih0LHIpe2lmKGUpcmV0dXJuIGUodCxyLTEpO2k9dCxlPW4/ZnVuY3Rpb24odCxuKXt2YXIgZT1adSh0KTtyZXR1cm4gZnVuY3Rpb24ocixpKXtyZXR1cm4gbihlKHIpLGksdCl9fSh0LG4pOlp1KHQpfSkpO3JldHVybiBvLmNvbHVtbnM9aXx8W10sb30scGFyc2VSb3dzOnIsZm9ybWF0OmZ1bmN0aW9uKG4sZSl7cmV0dXJuIG51bGw9PWUmJihlPUt1KG4pKSxbZS5tYXAoYSkuam9pbih0KV0uY29uY2F0KGkobixlKSkuam9pbigiXG4iKX0sZm9ybWF0Qm9keTpmdW5jdGlvbih0LG4pe3JldHVybiBudWxsPT1uJiYobj1LdSh0KSksaSh0LG4pLmpvaW4oIlxuIil9LGZvcm1hdFJvd3M6ZnVuY3Rpb24odCl7cmV0dXJuIHQubWFwKG8pLmpvaW4oIlxuIil9LGZvcm1hdFJvdzpvLGZvcm1hdFZhbHVlOmF9fXZhciBuYz10YygiLCIpLGVjPW5jLnBhcnNlLHJjPW5jLnBhcnNlUm93cyxpYz1uYy5mb3JtYXQsb2M9bmMuZm9ybWF0Qm9keSxhYz1uYy5mb3JtYXRSb3dzLHVjPW5jLmZvcm1hdFJvdyxjYz1uYy5mb3JtYXRWYWx1ZSxmYz10YygiXHQiKSxzYz1mYy5wYXJzZSxsYz1mYy5wYXJzZVJvd3MsaGM9ZmMuZm9ybWF0LGRjPWZjLmZvcm1hdEJvZHkscGM9ZmMuZm9ybWF0Um93cyxnYz1mYy5mb3JtYXRSb3cseWM9ZmMuZm9ybWF0VmFsdWU7Y29uc3QgdmM9bmV3IERhdGUoIjIwMTktMDEtMDFUMDA6MDAiKS5nZXRIb3VycygpfHxuZXcgRGF0ZSgiMjAxOS0wNy0wMVQwMDowMCIpLmdldEhvdXJzKCk7ZnVuY3Rpb24gX2ModCl7aWYoIXQub2spdGhyb3cgbmV3IEVycm9yKHQuc3RhdHVzKyIgIit0LnN0YXR1c1RleHQpO3JldHVybiB0LmJsb2IoKX1mdW5jdGlvbiBiYyh0KXtpZighdC5vayl0aHJvdyBuZXcgRXJyb3IodC5zdGF0dXMrIiAiK3Quc3RhdHVzVGV4dCk7cmV0dXJuIHQuYXJyYXlCdWZmZXIoKX1mdW5jdGlvbiBtYyh0KXtpZighdC5vayl0aHJvdyBuZXcgRXJyb3IodC5zdGF0dXMrIiAiK3Quc3RhdHVzVGV4dCk7cmV0dXJuIHQudGV4dCgpfWZ1bmN0aW9uIHhjKHQsbil7cmV0dXJuIGZldGNoKHQsbikudGhlbihtYyl9ZnVuY3Rpb24gd2ModCl7cmV0dXJuIGZ1bmN0aW9uKG4sZSxyKXtyZXR1cm4gMj09PWFyZ3VtZW50cy5sZW5ndGgmJiJmdW5jdGlvbiI9PXR5cGVvZiBlJiYocj1lLGU9dm9pZCAwKSx4YyhuLGUpLnRoZW4oKGZ1bmN0aW9uKG4pe3JldHVybiB0KG4scil9KSl9fXZhciBNYz13YyhlYyksVGM9d2Moc2MpO2Z1bmN0aW9uIEFjKHQpe2lmKCF0Lm9rKXRocm93IG5ldyBFcnJvcih0LnN0YXR1cysiICIrdC5zdGF0dXNUZXh0KTtpZigyMDQhPT10LnN0YXR1cyYmMjA1IT09dC5zdGF0dXMpcmV0dXJuIHQuanNvbigpfWZ1bmN0aW9uIFNjKHQpe3JldHVybihuLGUpPT54YyhuLGUpLnRoZW4oKG49PihuZXcgRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcobix0KSkpfXZhciBFYz1TYygiYXBwbGljYXRpb24veG1sIiksTmM9U2MoInRleHQvaHRtbCIpLGtjPVNjKCJpbWFnZS9zdmcreG1sIik7ZnVuY3Rpb24gQ2ModCxuLGUscil7aWYoaXNOYU4obil8fGlzTmFOKGUpKXJldHVybiB0O3ZhciBpLG8sYSx1LGMsZixzLGwsaCxkPXQuX3Jvb3QscD17ZGF0YTpyfSxnPXQuX3gwLHk9dC5feTAsdj10Ll94MSxfPXQuX3kxO2lmKCFkKXJldHVybiB0Ll9yb290PXAsdDtmb3IoO2QubGVuZ3RoOylpZigoZj1uPj0obz0oZyt2KS8yKSk/Zz1vOnY9bywocz1lPj0oYT0oeStfKS8yKSk/eT1hOl89YSxpPWQsIShkPWRbbD1zPDwxfGZdKSlyZXR1cm4gaVtsXT1wLHQ7aWYodT0rdC5feC5jYWxsKG51bGwsZC5kYXRhKSxjPSt0Ll95LmNhbGwobnVsbCxkLmRhdGEpLG49PT11JiZlPT09YylyZXR1cm4gcC5uZXh0PWQsaT9pW2xdPXA6dC5fcm9vdD1wLHQ7ZG97aT1pP2lbbF09bmV3IEFycmF5KDQpOnQuX3Jvb3Q9bmV3IEFycmF5KDQpLChmPW4+PShvPShnK3YpLzIpKT9nPW86dj1vLChzPWU+PShhPSh5K18pLzIpKT95PWE6Xz1hfXdoaWxlKChsPXM8PDF8Zik9PShoPShjPj1hKTw8MXx1Pj1vKSk7cmV0dXJuIGlbaF09ZCxpW2xdPXAsdH1mdW5jdGlvbiBQYyh0LG4sZSxyLGkpe3RoaXMubm9kZT10LHRoaXMueDA9bix0aGlzLnkwPWUsdGhpcy54MT1yLHRoaXMueTE9aX1mdW5jdGlvbiB6Yyh0KXtyZXR1cm4gdFswXX1mdW5jdGlvbiAkYyh0KXtyZXR1cm4gdFsxXX1mdW5jdGlvbiBEYyh0LG4sZSl7dmFyIHI9bmV3IFJjKG51bGw9PW4/emM6bixudWxsPT1lPyRjOmUsTmFOLE5hTixOYU4sTmFOKTtyZXR1cm4gbnVsbD09dD9yOnIuYWRkQWxsKHQpfWZ1bmN0aW9uIFJjKHQsbixlLHIsaSxvKXt0aGlzLl94PXQsdGhpcy5feT1uLHRoaXMuX3gwPWUsdGhpcy5feTA9cix0aGlzLl94MT1pLHRoaXMuX3kxPW8sdGhpcy5fcm9vdD12b2lkIDB9ZnVuY3Rpb24gRmModCl7Zm9yKHZhciBuPXtkYXRhOnQuZGF0YX0sZT1uO3Q9dC5uZXh0OyllPWUubmV4dD17ZGF0YTp0LmRhdGF9O3JldHVybiBufXZhciBxYz1EYy5wcm90b3R5cGU9UmMucHJvdG90eXBlO2Z1bmN0aW9uIFVjKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0fX1mdW5jdGlvbiBJYyh0KXtyZXR1cm4gMWUtNioodCgpLS41KX1mdW5jdGlvbiBPYyh0KXtyZXR1cm4gdC54K3Qudnh9ZnVuY3Rpb24gQmModCl7cmV0dXJuIHQueSt0LnZ5fWZ1bmN0aW9uIFljKHQpe3JldHVybiB0LmluZGV4fWZ1bmN0aW9uIExjKHQsbil7dmFyIGU9dC5nZXQobik7aWYoIWUpdGhyb3cgbmV3IEVycm9yKCJub2RlIG5vdCBmb3VuZDogIituKTtyZXR1cm4gZX1xYy5jb3B5PWZ1bmN0aW9uKCl7dmFyIHQsbixlPW5ldyBSYyh0aGlzLl94LHRoaXMuX3ksdGhpcy5feDAsdGhpcy5feTAsdGhpcy5feDEsdGhpcy5feTEpLHI9dGhpcy5fcm9vdDtpZighcilyZXR1cm4gZTtpZighci5sZW5ndGgpcmV0dXJuIGUuX3Jvb3Q9RmMociksZTtmb3IodD1be3NvdXJjZTpyLHRhcmdldDplLl9yb290PW5ldyBBcnJheSg0KX1dO3I9dC5wb3AoKTspZm9yKHZhciBpPTA7aTw0OysraSkobj1yLnNvdXJjZVtpXSkmJihuLmxlbmd0aD90LnB1c2goe3NvdXJjZTpuLHRhcmdldDpyLnRhcmdldFtpXT1uZXcgQXJyYXkoNCl9KTpyLnRhcmdldFtpXT1GYyhuKSk7cmV0dXJuIGV9LHFjLmFkZD1mdW5jdGlvbih0KXtjb25zdCBuPSt0aGlzLl94LmNhbGwobnVsbCx0KSxlPSt0aGlzLl95LmNhbGwobnVsbCx0KTtyZXR1cm4gQ2ModGhpcy5jb3ZlcihuLGUpLG4sZSx0KX0scWMuYWRkQWxsPWZ1bmN0aW9uKHQpe3ZhciBuLGUscixpLG89dC5sZW5ndGgsYT1uZXcgQXJyYXkobyksdT1uZXcgQXJyYXkobyksYz0xLzAsZj0xLzAscz0tMS8wLGw9LTEvMDtmb3IoZT0wO2U8bzsrK2UpaXNOYU4ocj0rdGhpcy5feC5jYWxsKG51bGwsbj10W2VdKSl8fGlzTmFOKGk9K3RoaXMuX3kuY2FsbChudWxsLG4pKXx8KGFbZV09cix1W2VdPWkscjxjJiYoYz1yKSxyPnMmJihzPXIpLGk8ZiYmKGY9aSksaT5sJiYobD1pKSk7aWYoYz5zfHxmPmwpcmV0dXJuIHRoaXM7Zm9yKHRoaXMuY292ZXIoYyxmKS5jb3ZlcihzLGwpLGU9MDtlPG87KytlKUNjKHRoaXMsYVtlXSx1W2VdLHRbZV0pO3JldHVybiB0aGlzfSxxYy5jb3Zlcj1mdW5jdGlvbih0LG4pe2lmKGlzTmFOKHQ9K3QpfHxpc05hTihuPStuKSlyZXR1cm4gdGhpczt2YXIgZT10aGlzLl94MCxyPXRoaXMuX3kwLGk9dGhpcy5feDEsbz10aGlzLl95MTtpZihpc05hTihlKSlpPShlPU1hdGguZmxvb3IodCkpKzEsbz0ocj1NYXRoLmZsb29yKG4pKSsxO2Vsc2V7Zm9yKHZhciBhLHUsYz1pLWV8fDEsZj10aGlzLl9yb290O2U+dHx8dD49aXx8cj5ufHxuPj1vOylzd2l0Y2godT0objxyKTw8MXx0PGUsKGE9bmV3IEFycmF5KDQpKVt1XT1mLGY9YSxjKj0yLHUpe2Nhc2UgMDppPWUrYyxvPXIrYzticmVhaztjYXNlIDE6ZT1pLWMsbz1yK2M7YnJlYWs7Y2FzZSAyOmk9ZStjLHI9by1jO2JyZWFrO2Nhc2UgMzplPWktYyxyPW8tY310aGlzLl9yb290JiZ0aGlzLl9yb290Lmxlbmd0aCYmKHRoaXMuX3Jvb3Q9Zil9cmV0dXJuIHRoaXMuX3gwPWUsdGhpcy5feTA9cix0aGlzLl94MT1pLHRoaXMuX3kxPW8sdGhpc30scWMuZGF0YT1mdW5jdGlvbigpe3ZhciB0PVtdO3JldHVybiB0aGlzLnZpc2l0KChmdW5jdGlvbihuKXtpZighbi5sZW5ndGgpZG97dC5wdXNoKG4uZGF0YSl9d2hpbGUobj1uLm5leHQpfSkpLHR9LHFjLmV4dGVudD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD90aGlzLmNvdmVyKCt0WzBdWzBdLCt0WzBdWzFdKS5jb3ZlcigrdFsxXVswXSwrdFsxXVsxXSk6aXNOYU4odGhpcy5feDApP3ZvaWQgMDpbW3RoaXMuX3gwLHRoaXMuX3kwXSxbdGhpcy5feDEsdGhpcy5feTFdXX0scWMuZmluZD1mdW5jdGlvbih0LG4sZSl7dmFyIHIsaSxvLGEsdSxjLGYscz10aGlzLl94MCxsPXRoaXMuX3kwLGg9dGhpcy5feDEsZD10aGlzLl95MSxwPVtdLGc9dGhpcy5fcm9vdDtmb3IoZyYmcC5wdXNoKG5ldyBQYyhnLHMsbCxoLGQpKSxudWxsPT1lP2U9MS8wOihzPXQtZSxsPW4tZSxoPXQrZSxkPW4rZSxlKj1lKTtjPXAucG9wKCk7KWlmKCEoIShnPWMubm9kZSl8fChpPWMueDApPmh8fChvPWMueTApPmR8fChhPWMueDEpPHN8fCh1PWMueTEpPGwpKWlmKGcubGVuZ3RoKXt2YXIgeT0oaSthKS8yLHY9KG8rdSkvMjtwLnB1c2gobmV3IFBjKGdbM10seSx2LGEsdSksbmV3IFBjKGdbMl0saSx2LHksdSksbmV3IFBjKGdbMV0seSxvLGEsdiksbmV3IFBjKGdbMF0saSxvLHksdikpLChmPShuPj12KTw8MXx0Pj15KSYmKGM9cFtwLmxlbmd0aC0xXSxwW3AubGVuZ3RoLTFdPXBbcC5sZW5ndGgtMS1mXSxwW3AubGVuZ3RoLTEtZl09Yyl9ZWxzZXt2YXIgXz10LSt0aGlzLl94LmNhbGwobnVsbCxnLmRhdGEpLGI9bi0rdGhpcy5feS5jYWxsKG51bGwsZy5kYXRhKSxtPV8qXytiKmI7aWYobTxlKXt2YXIgeD1NYXRoLnNxcnQoZT1tKTtzPXQteCxsPW4teCxoPXQreCxkPW4reCxyPWcuZGF0YX19cmV0dXJuIHJ9LHFjLnJlbW92ZT1mdW5jdGlvbih0KXtpZihpc05hTihvPSt0aGlzLl94LmNhbGwobnVsbCx0KSl8fGlzTmFOKGE9K3RoaXMuX3kuY2FsbChudWxsLHQpKSlyZXR1cm4gdGhpczt2YXIgbixlLHIsaSxvLGEsdSxjLGYscyxsLGgsZD10aGlzLl9yb290LHA9dGhpcy5feDAsZz10aGlzLl95MCx5PXRoaXMuX3gxLHY9dGhpcy5feTE7aWYoIWQpcmV0dXJuIHRoaXM7aWYoZC5sZW5ndGgpZm9yKDs7KXtpZigoZj1vPj0odT0ocCt5KS8yKSk/cD11Onk9dSwocz1hPj0oYz0oZyt2KS8yKSk/Zz1jOnY9YyxuPWQsIShkPWRbbD1zPDwxfGZdKSlyZXR1cm4gdGhpcztpZighZC5sZW5ndGgpYnJlYWs7KG5bbCsxJjNdfHxuW2wrMiYzXXx8bltsKzMmM10pJiYoZT1uLGg9bCl9Zm9yKDtkLmRhdGEhPT10OylpZihyPWQsIShkPWQubmV4dCkpcmV0dXJuIHRoaXM7cmV0dXJuKGk9ZC5uZXh0KSYmZGVsZXRlIGQubmV4dCxyPyhpP3IubmV4dD1pOmRlbGV0ZSByLm5leHQsdGhpcyk6bj8oaT9uW2xdPWk6ZGVsZXRlIG5bbF0sKGQ9blswXXx8blsxXXx8blsyXXx8blszXSkmJmQ9PT0oblszXXx8blsyXXx8blsxXXx8blswXSkmJiFkLmxlbmd0aCYmKGU/ZVtoXT1kOnRoaXMuX3Jvb3Q9ZCksdGhpcyk6KHRoaXMuX3Jvb3Q9aSx0aGlzKX0scWMucmVtb3ZlQWxsPWZ1bmN0aW9uKHQpe2Zvcih2YXIgbj0wLGU9dC5sZW5ndGg7bjxlOysrbil0aGlzLnJlbW92ZSh0W25dKTtyZXR1cm4gdGhpc30scWMucm9vdD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9yb290fSxxYy5zaXplPWZ1bmN0aW9uKCl7dmFyIHQ9MDtyZXR1cm4gdGhpcy52aXNpdCgoZnVuY3Rpb24obil7aWYoIW4ubGVuZ3RoKWRveysrdH13aGlsZShuPW4ubmV4dCl9KSksdH0scWMudmlzaXQ9ZnVuY3Rpb24odCl7dmFyIG4sZSxyLGksbyxhLHU9W10sYz10aGlzLl9yb290O2ZvcihjJiZ1LnB1c2gobmV3IFBjKGMsdGhpcy5feDAsdGhpcy5feTAsdGhpcy5feDEsdGhpcy5feTEpKTtuPXUucG9wKCk7KWlmKCF0KGM9bi5ub2RlLHI9bi54MCxpPW4ueTAsbz1uLngxLGE9bi55MSkmJmMubGVuZ3RoKXt2YXIgZj0ocitvKS8yLHM9KGkrYSkvMjsoZT1jWzNdKSYmdS5wdXNoKG5ldyBQYyhlLGYscyxvLGEpKSwoZT1jWzJdKSYmdS5wdXNoKG5ldyBQYyhlLHIscyxmLGEpKSwoZT1jWzFdKSYmdS5wdXNoKG5ldyBQYyhlLGYsaSxvLHMpKSwoZT1jWzBdKSYmdS5wdXNoKG5ldyBQYyhlLHIsaSxmLHMpKX1yZXR1cm4gdGhpc30scWMudmlzaXRBZnRlcj1mdW5jdGlvbih0KXt2YXIgbixlPVtdLHI9W107Zm9yKHRoaXMuX3Jvb3QmJmUucHVzaChuZXcgUGModGhpcy5fcm9vdCx0aGlzLl94MCx0aGlzLl95MCx0aGlzLl94MSx0aGlzLl95MSkpO249ZS5wb3AoKTspe3ZhciBpPW4ubm9kZTtpZihpLmxlbmd0aCl7dmFyIG8sYT1uLngwLHU9bi55MCxjPW4ueDEsZj1uLnkxLHM9KGErYykvMixsPSh1K2YpLzI7KG89aVswXSkmJmUucHVzaChuZXcgUGMobyxhLHUscyxsKSksKG89aVsxXSkmJmUucHVzaChuZXcgUGMobyxzLHUsYyxsKSksKG89aVsyXSkmJmUucHVzaChuZXcgUGMobyxhLGwscyxmKSksKG89aVszXSkmJmUucHVzaChuZXcgUGMobyxzLGwsYyxmKSl9ci5wdXNoKG4pfWZvcig7bj1yLnBvcCgpOyl0KG4ubm9kZSxuLngwLG4ueTAsbi54MSxuLnkxKTtyZXR1cm4gdGhpc30scWMueD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odGhpcy5feD10LHRoaXMpOnRoaXMuX3h9LHFjLnk9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHRoaXMuX3k9dCx0aGlzKTp0aGlzLl95fTtjb25zdCBqYz0xNjY0NTI1LEhjPTEwMTM5MDQyMjMsWGM9NDI5NDk2NzI5NjtmdW5jdGlvbiBHYyh0KXtyZXR1cm4gdC54fWZ1bmN0aW9uIFZjKHQpe3JldHVybiB0Lnl9dmFyIFdjPU1hdGguUEkqKDMtTWF0aC5zcXJ0KDUpKTtmdW5jdGlvbiBaYyh0LG4pe2lmKChlPSh0PW4/dC50b0V4cG9uZW50aWFsKG4tMSk6dC50b0V4cG9uZW50aWFsKCkpLmluZGV4T2YoImUiKSk8MClyZXR1cm4gbnVsbDt2YXIgZSxyPXQuc2xpY2UoMCxlKTtyZXR1cm5bci5sZW5ndGg+MT9yWzBdK3Iuc2xpY2UoMik6ciwrdC5zbGljZShlKzEpXX1mdW5jdGlvbiBLYyh0KXtyZXR1cm4odD1aYyhNYXRoLmFicyh0KSkpP3RbMV06TmFOfXZhciBRYyxKYz0vXig/OiguKT8oWzw+PV5dKSk/KFsrXC0oIF0pPyhbJCNdKT8oMCk/KFxkKyk/KCwpPyhcLlxkKyk/KH4pPyhbYS16JV0pPyQvaTtmdW5jdGlvbiB0Zih0KXtpZighKG49SmMuZXhlYyh0KSkpdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIGZvcm1hdDogIit0KTt2YXIgbjtyZXR1cm4gbmV3IG5mKHtmaWxsOm5bMV0sYWxpZ246blsyXSxzaWduOm5bM10sc3ltYm9sOm5bNF0semVybzpuWzVdLHdpZHRoOm5bNl0sY29tbWE6bls3XSxwcmVjaXNpb246bls4XSYmbls4XS5zbGljZSgxKSx0cmltOm5bOV0sdHlwZTpuWzEwXX0pfWZ1bmN0aW9uIG5mKHQpe3RoaXMuZmlsbD12b2lkIDA9PT10LmZpbGw/IiAiOnQuZmlsbCsiIix0aGlzLmFsaWduPXZvaWQgMD09PXQuYWxpZ24/Ij4iOnQuYWxpZ24rIiIsdGhpcy5zaWduPXZvaWQgMD09PXQuc2lnbj8iLSI6dC5zaWduKyIiLHRoaXMuc3ltYm9sPXZvaWQgMD09PXQuc3ltYm9sPyIiOnQuc3ltYm9sKyIiLHRoaXMuemVybz0hIXQuemVybyx0aGlzLndpZHRoPXZvaWQgMD09PXQud2lkdGg/dm9pZCAwOit0LndpZHRoLHRoaXMuY29tbWE9ISF0LmNvbW1hLHRoaXMucHJlY2lzaW9uPXZvaWQgMD09PXQucHJlY2lzaW9uP3ZvaWQgMDordC5wcmVjaXNpb24sdGhpcy50cmltPSEhdC50cmltLHRoaXMudHlwZT12b2lkIDA9PT10LnR5cGU/IiI6dC50eXBlKyIifWZ1bmN0aW9uIGVmKHQsbil7dmFyIGU9WmModCxuKTtpZighZSlyZXR1cm4gdCsiIjt2YXIgcj1lWzBdLGk9ZVsxXTtyZXR1cm4gaTwwPyIwLiIrbmV3IEFycmF5KC1pKS5qb2luKCIwIikrcjpyLmxlbmd0aD5pKzE/ci5zbGljZSgwLGkrMSkrIi4iK3Iuc2xpY2UoaSsxKTpyK25ldyBBcnJheShpLXIubGVuZ3RoKzIpLmpvaW4oIjAiKX10Zi5wcm90b3R5cGU9bmYucHJvdG90eXBlLG5mLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmZpbGwrdGhpcy5hbGlnbit0aGlzLnNpZ24rdGhpcy5zeW1ib2wrKHRoaXMuemVybz8iMCI6IiIpKyh2b2lkIDA9PT10aGlzLndpZHRoPyIiOk1hdGgubWF4KDEsMHx0aGlzLndpZHRoKSkrKHRoaXMuY29tbWE/IiwiOiIiKSsodm9pZCAwPT09dGhpcy5wcmVjaXNpb24/IiI6Ii4iK01hdGgubWF4KDAsMHx0aGlzLnByZWNpc2lvbikpKyh0aGlzLnRyaW0/In4iOiIiKSt0aGlzLnR5cGV9O3ZhciByZj17IiUiOih0LG4pPT4oMTAwKnQpLnRvRml4ZWQobiksYjp0PT5NYXRoLnJvdW5kKHQpLnRvU3RyaW5nKDIpLGM6dD0+dCsiIixkOmZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLmFicyh0PU1hdGgucm91bmQodCkpPj0xZTIxP3QudG9Mb2NhbGVTdHJpbmcoImVuIikucmVwbGFjZSgvLC9nLCIiKTp0LnRvU3RyaW5nKDEwKX0sZToodCxuKT0+dC50b0V4cG9uZW50aWFsKG4pLGY6KHQsbik9PnQudG9GaXhlZChuKSxnOih0LG4pPT50LnRvUHJlY2lzaW9uKG4pLG86dD0+TWF0aC5yb3VuZCh0KS50b1N0cmluZyg4KSxwOih0LG4pPT5lZigxMDAqdCxuKSxyOmVmLHM6ZnVuY3Rpb24odCxuKXt2YXIgZT1aYyh0LG4pO2lmKCFlKXJldHVybiB0KyIiO3ZhciByPWVbMF0saT1lWzFdLG89aS0oUWM9MypNYXRoLm1heCgtOCxNYXRoLm1pbig4LE1hdGguZmxvb3IoaS8zKSkpKSsxLGE9ci5sZW5ndGg7cmV0dXJuIG89PT1hP3I6bz5hP3IrbmV3IEFycmF5KG8tYSsxKS5qb2luKCIwIik6bz4wP3Iuc2xpY2UoMCxvKSsiLiIrci5zbGljZShvKToiMC4iK25ldyBBcnJheSgxLW8pLmpvaW4oIjAiKStaYyh0LE1hdGgubWF4KDAsbitvLTEpKVswXX0sWDp0PT5NYXRoLnJvdW5kKHQpLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpLHg6dD0+TWF0aC5yb3VuZCh0KS50b1N0cmluZygxNil9O2Z1bmN0aW9uIG9mKHQpe3JldHVybiB0fXZhciBhZix1Zj1BcnJheS5wcm90b3R5cGUubWFwLGNmPVsieSIsInoiLCJhIiwiZiIsInAiLCJuIiwiwrUiLCJtIiwiIiwiayIsIk0iLCJHIiwiVCIsIlAiLCJFIiwiWiIsIlkiXTtmdW5jdGlvbiBmZih0KXt2YXIgbixlLHI9dm9pZCAwPT09dC5ncm91cGluZ3x8dm9pZCAwPT09dC50aG91c2FuZHM/b2Y6KG49dWYuY2FsbCh0Lmdyb3VwaW5nLE51bWJlciksZT10LnRob3VzYW5kcysiIixmdW5jdGlvbih0LHIpe2Zvcih2YXIgaT10Lmxlbmd0aCxvPVtdLGE9MCx1PW5bMF0sYz0wO2k+MCYmdT4wJiYoYyt1KzE+ciYmKHU9TWF0aC5tYXgoMSxyLWMpKSxvLnB1c2godC5zdWJzdHJpbmcoaS09dSxpK3UpKSwhKChjKz11KzEpPnIpKTspdT1uW2E9KGErMSklbi5sZW5ndGhdO3JldHVybiBvLnJldmVyc2UoKS5qb2luKGUpfSksaT12b2lkIDA9PT10LmN1cnJlbmN5PyIiOnQuY3VycmVuY3lbMF0rIiIsbz12b2lkIDA9PT10LmN1cnJlbmN5PyIiOnQuY3VycmVuY3lbMV0rIiIsYT12b2lkIDA9PT10LmRlY2ltYWw/Ii4iOnQuZGVjaW1hbCsiIix1PXZvaWQgMD09PXQubnVtZXJhbHM/b2Y6ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKG4pe3JldHVybiBuLnJlcGxhY2UoL1swLTldL2csKGZ1bmN0aW9uKG4pe3JldHVybiB0WytuXX0pKX19KHVmLmNhbGwodC5udW1lcmFscyxTdHJpbmcpKSxjPXZvaWQgMD09PXQucGVyY2VudD8iJSI6dC5wZXJjZW50KyIiLGY9dm9pZCAwPT09dC5taW51cz8i4oiSIjp0Lm1pbnVzKyIiLHM9dm9pZCAwPT09dC5uYW4/Ik5hTiI6dC5uYW4rIiI7ZnVuY3Rpb24gbCh0KXt2YXIgbj0odD10Zih0KSkuZmlsbCxlPXQuYWxpZ24sbD10LnNpZ24saD10LnN5bWJvbCxkPXQuemVybyxwPXQud2lkdGgsZz10LmNvbW1hLHk9dC5wcmVjaXNpb24sdj10LnRyaW0sXz10LnR5cGU7Im4iPT09Xz8oZz0hMCxfPSJnIik6cmZbX118fCh2b2lkIDA9PT15JiYoeT0xMiksdj0hMCxfPSJnIiksKGR8fCIwIj09PW4mJiI9Ij09PWUpJiYoZD0hMCxuPSIwIixlPSI9Iik7dmFyIGI9IiQiPT09aD9pOiIjIj09PWgmJi9bYm94WF0vLnRlc3QoXyk/IjAiK18udG9Mb3dlckNhc2UoKToiIixtPSIkIj09PWg/bzovWyVwXS8udGVzdChfKT9jOiIiLHg9cmZbX10sdz0vW2RlZmdwcnMlXS8udGVzdChfKTtmdW5jdGlvbiBNKHQpe3ZhciBpLG8sYyxoPWIsTT1tO2lmKCJjIj09PV8pTT14KHQpK00sdD0iIjtlbHNle3ZhciBUPSh0PSt0KTwwfHwxL3Q8MDtpZih0PWlzTmFOKHQpP3M6eChNYXRoLmFicyh0KSx5KSx2JiYodD1mdW5jdGlvbih0KXt0OmZvcih2YXIgbixlPXQubGVuZ3RoLHI9MSxpPS0xO3I8ZTsrK3Ipc3dpdGNoKHRbcl0pe2Nhc2UiLiI6aT1uPXI7YnJlYWs7Y2FzZSIwIjowPT09aSYmKGk9ciksbj1yO2JyZWFrO2RlZmF1bHQ6aWYoISt0W3JdKWJyZWFrIHQ7aT4wJiYoaT0wKX1yZXR1cm4gaT4wP3Quc2xpY2UoMCxpKSt0LnNsaWNlKG4rMSk6dH0odCkpLFQmJjA9PSt0JiYiKyIhPT1sJiYoVD0hMSksaD0oVD8iKCI9PT1sP2w6ZjoiLSI9PT1sfHwiKCI9PT1sPyIiOmwpK2gsTT0oInMiPT09Xz9jZls4K1FjLzNdOiIiKStNKyhUJiYiKCI9PT1sPyIpIjoiIiksdylmb3IoaT0tMSxvPXQubGVuZ3RoOysraTxvOylpZig0OD4oYz10LmNoYXJDb2RlQXQoaSkpfHxjPjU3KXtNPSg0Nj09PWM/YSt0LnNsaWNlKGkrMSk6dC5zbGljZShpKSkrTSx0PXQuc2xpY2UoMCxpKTticmVha319ZyYmIWQmJih0PXIodCwxLzApKTt2YXIgQT1oLmxlbmd0aCt0Lmxlbmd0aCtNLmxlbmd0aCxTPUE8cD9uZXcgQXJyYXkocC1BKzEpLmpvaW4obik6IiI7c3dpdGNoKGcmJmQmJih0PXIoUyt0LFMubGVuZ3RoP3AtTS5sZW5ndGg6MS8wKSxTPSIiKSxlKXtjYXNlIjwiOnQ9aCt0K00rUzticmVhaztjYXNlIj0iOnQ9aCtTK3QrTTticmVhaztjYXNlIl4iOnQ9Uy5zbGljZSgwLEE9Uy5sZW5ndGg+PjEpK2grdCtNK1Muc2xpY2UoQSk7YnJlYWs7ZGVmYXVsdDp0PVMraCt0K019cmV0dXJuIHUodCl9cmV0dXJuIHk9dm9pZCAwPT09eT82Oi9bZ3Byc10vLnRlc3QoXyk/TWF0aC5tYXgoMSxNYXRoLm1pbigyMSx5KSk6TWF0aC5tYXgoMCxNYXRoLm1pbigyMCx5KSksTS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0KyIifSxNfXJldHVybntmb3JtYXQ6bCxmb3JtYXRQcmVmaXg6ZnVuY3Rpb24odCxuKXt2YXIgZT1sKCgodD10Zih0KSkudHlwZT0iZiIsdCkpLHI9MypNYXRoLm1heCgtOCxNYXRoLm1pbig4LE1hdGguZmxvb3IoS2MobikvMykpKSxpPU1hdGgucG93KDEwLC1yKSxvPWNmWzgrci8zXTtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIGUoaSp0KStvfX19fWZ1bmN0aW9uIHNmKG4pe3JldHVybiBhZj1mZihuKSx0LmZvcm1hdD1hZi5mb3JtYXQsdC5mb3JtYXRQcmVmaXg9YWYuZm9ybWF0UHJlZml4LGFmfWZ1bmN0aW9uIGxmKHQpe3JldHVybiBNYXRoLm1heCgwLC1LYyhNYXRoLmFicyh0KSkpfWZ1bmN0aW9uIGhmKHQsbil7cmV0dXJuIE1hdGgubWF4KDAsMypNYXRoLm1heCgtOCxNYXRoLm1pbig4LE1hdGguZmxvb3IoS2MobikvMykpKS1LYyhNYXRoLmFicyh0KSkpfWZ1bmN0aW9uIGRmKHQsbil7cmV0dXJuIHQ9TWF0aC5hYnModCksbj1NYXRoLmFicyhuKS10LE1hdGgubWF4KDAsS2MobiktS2ModCkpKzF9dC5mb3JtYXQ9dm9pZCAwLHQuZm9ybWF0UHJlZml4PXZvaWQgMCxzZih7dGhvdXNhbmRzOiIsIixncm91cGluZzpbM10sY3VycmVuY3k6WyIkIiwiIl19KTt2YXIgcGY9MWUtNixnZj0xZS0xMix5Zj1NYXRoLlBJLHZmPXlmLzIsX2Y9eWYvNCxiZj0yKnlmLG1mPTE4MC95Zix4Zj15Zi8xODAsd2Y9TWF0aC5hYnMsTWY9TWF0aC5hdGFuLFRmPU1hdGguYXRhbjIsQWY9TWF0aC5jb3MsU2Y9TWF0aC5jZWlsLEVmPU1hdGguZXhwLE5mPU1hdGguaHlwb3Qsa2Y9TWF0aC5sb2csQ2Y9TWF0aC5wb3csUGY9TWF0aC5zaW4semY9TWF0aC5zaWdufHxmdW5jdGlvbih0KXtyZXR1cm4gdD4wPzE6dDwwPy0xOjB9LCRmPU1hdGguc3FydCxEZj1NYXRoLnRhbjtmdW5jdGlvbiBSZih0KXtyZXR1cm4gdD4xPzA6dDwtMT95ZjpNYXRoLmFjb3ModCl9ZnVuY3Rpb24gRmYodCl7cmV0dXJuIHQ+MT92Zjp0PC0xPy12ZjpNYXRoLmFzaW4odCl9ZnVuY3Rpb24gcWYodCl7cmV0dXJuKHQ9UGYodC8yKSkqdH1mdW5jdGlvbiBVZigpe31mdW5jdGlvbiBJZih0LG4pe3QmJkJmLmhhc093blByb3BlcnR5KHQudHlwZSkmJkJmW3QudHlwZV0odCxuKX12YXIgT2Y9e0ZlYXR1cmU6ZnVuY3Rpb24odCxuKXtJZih0Lmdlb21ldHJ5LG4pfSxGZWF0dXJlQ29sbGVjdGlvbjpmdW5jdGlvbih0LG4pe2Zvcih2YXIgZT10LmZlYXR1cmVzLHI9LTEsaT1lLmxlbmd0aDsrK3I8aTspSWYoZVtyXS5nZW9tZXRyeSxuKX19LEJmPXtTcGhlcmU6ZnVuY3Rpb24odCxuKXtuLnNwaGVyZSgpfSxQb2ludDpmdW5jdGlvbih0LG4pe3Q9dC5jb29yZGluYXRlcyxuLnBvaW50KHRbMF0sdFsxXSx0WzJdKX0sTXVsdGlQb2ludDpmdW5jdGlvbih0LG4pe2Zvcih2YXIgZT10LmNvb3JkaW5hdGVzLHI9LTEsaT1lLmxlbmd0aDsrK3I8aTspdD1lW3JdLG4ucG9pbnQodFswXSx0WzFdLHRbMl0pfSxMaW5lU3RyaW5nOmZ1bmN0aW9uKHQsbil7WWYodC5jb29yZGluYXRlcyxuLDApfSxNdWx0aUxpbmVTdHJpbmc6ZnVuY3Rpb24odCxuKXtmb3IodmFyIGU9dC5jb29yZGluYXRlcyxyPS0xLGk9ZS5sZW5ndGg7KytyPGk7KVlmKGVbcl0sbiwwKX0sUG9seWdvbjpmdW5jdGlvbih0LG4pe0xmKHQuY29vcmRpbmF0ZXMsbil9LE11bHRpUG9seWdvbjpmdW5jdGlvbih0LG4pe2Zvcih2YXIgZT10LmNvb3JkaW5hdGVzLHI9LTEsaT1lLmxlbmd0aDsrK3I8aTspTGYoZVtyXSxuKX0sR2VvbWV0cnlDb2xsZWN0aW9uOmZ1bmN0aW9uKHQsbil7Zm9yKHZhciBlPXQuZ2VvbWV0cmllcyxyPS0xLGk9ZS5sZW5ndGg7KytyPGk7KUlmKGVbcl0sbil9fTtmdW5jdGlvbiBZZih0LG4sZSl7dmFyIHIsaT0tMSxvPXQubGVuZ3RoLWU7Zm9yKG4ubGluZVN0YXJ0KCk7KytpPG87KXI9dFtpXSxuLnBvaW50KHJbMF0sclsxXSxyWzJdKTtuLmxpbmVFbmQoKX1mdW5jdGlvbiBMZih0LG4pe3ZhciBlPS0xLHI9dC5sZW5ndGg7Zm9yKG4ucG9seWdvblN0YXJ0KCk7KytlPHI7KVlmKHRbZV0sbiwxKTtuLnBvbHlnb25FbmQoKX1mdW5jdGlvbiBqZih0LG4pe3QmJk9mLmhhc093blByb3BlcnR5KHQudHlwZSk/T2ZbdC50eXBlXSh0LG4pOklmKHQsbil9dmFyIEhmLFhmLEdmLFZmLFdmLFpmLEtmLFFmLEpmLHRzLG5zLGVzLHJzLGlzLG9zLGFzLHVzPW5ldyBBLGNzPW5ldyBBLGZzPXtwb2ludDpVZixsaW5lU3RhcnQ6VWYsbGluZUVuZDpVZixwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXt1cz1uZXcgQSxmcy5saW5lU3RhcnQ9c3MsZnMubGluZUVuZD1sc30scG9seWdvbkVuZDpmdW5jdGlvbigpe3ZhciB0PSt1cztjcy5hZGQodDwwP2JmK3Q6dCksdGhpcy5saW5lU3RhcnQ9dGhpcy5saW5lRW5kPXRoaXMucG9pbnQ9VWZ9LHNwaGVyZTpmdW5jdGlvbigpe2NzLmFkZChiZil9fTtmdW5jdGlvbiBzcygpe2ZzLnBvaW50PWhzfWZ1bmN0aW9uIGxzKCl7ZHMoSGYsWGYpfWZ1bmN0aW9uIGhzKHQsbil7ZnMucG9pbnQ9ZHMsSGY9dCxYZj1uLEdmPXQqPXhmLFZmPUFmKG49KG4qPXhmKS8yK19mKSxXZj1QZihuKX1mdW5jdGlvbiBkcyh0LG4pe3ZhciBlPSh0Kj14ZiktR2Yscj1lPj0wPzE6LTEsaT1yKmUsbz1BZihuPShuKj14ZikvMitfZiksYT1QZihuKSx1PVdmKmEsYz1WZipvK3UqQWYoaSksZj11KnIqUGYoaSk7dXMuYWRkKFRmKGYsYykpLEdmPXQsVmY9byxXZj1hfWZ1bmN0aW9uIHBzKHQpe3JldHVybltUZih0WzFdLHRbMF0pLEZmKHRbMl0pXX1mdW5jdGlvbiBncyh0KXt2YXIgbj10WzBdLGU9dFsxXSxyPUFmKGUpO3JldHVybltyKkFmKG4pLHIqUGYobiksUGYoZSldfWZ1bmN0aW9uIHlzKHQsbil7cmV0dXJuIHRbMF0qblswXSt0WzFdKm5bMV0rdFsyXSpuWzJdfWZ1bmN0aW9uIHZzKHQsbil7cmV0dXJuW3RbMV0qblsyXS10WzJdKm5bMV0sdFsyXSpuWzBdLXRbMF0qblsyXSx0WzBdKm5bMV0tdFsxXSpuWzBdXX1mdW5jdGlvbiBfcyh0LG4pe3RbMF0rPW5bMF0sdFsxXSs9blsxXSx0WzJdKz1uWzJdfWZ1bmN0aW9uIGJzKHQsbil7cmV0dXJuW3RbMF0qbix0WzFdKm4sdFsyXSpuXX1mdW5jdGlvbiBtcyh0KXt2YXIgbj0kZih0WzBdKnRbMF0rdFsxXSp0WzFdK3RbMl0qdFsyXSk7dFswXS89bix0WzFdLz1uLHRbMl0vPW59dmFyIHhzLHdzLE1zLFRzLEFzLFNzLEVzLE5zLGtzLENzLFBzLHpzLCRzLERzLFJzLEZzLHFzPXtwb2ludDpVcyxsaW5lU3RhcnQ6T3MsbGluZUVuZDpCcyxwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXtxcy5wb2ludD1Zcyxxcy5saW5lU3RhcnQ9THMscXMubGluZUVuZD1qcyxpcz1uZXcgQSxmcy5wb2x5Z29uU3RhcnQoKX0scG9seWdvbkVuZDpmdW5jdGlvbigpe2ZzLnBvbHlnb25FbmQoKSxxcy5wb2ludD1Vcyxxcy5saW5lU3RhcnQ9T3MscXMubGluZUVuZD1Ccyx1czwwPyhaZj0tKFFmPTE4MCksS2Y9LShKZj05MCkpOmlzPnBmP0pmPTkwOmlzPC1wZiYmKEtmPS05MCksYXNbMF09WmYsYXNbMV09UWZ9LHNwaGVyZTpmdW5jdGlvbigpe1pmPS0oUWY9MTgwKSxLZj0tKEpmPTkwKX19O2Z1bmN0aW9uIFVzKHQsbil7b3MucHVzaChhcz1bWmY9dCxRZj10XSksbjxLZiYmKEtmPW4pLG4+SmYmJihKZj1uKX1mdW5jdGlvbiBJcyh0LG4pe3ZhciBlPWdzKFt0KnhmLG4qeGZdKTtpZihycyl7dmFyIHI9dnMocnMsZSksaT12cyhbclsxXSwtclswXSwwXSxyKTttcyhpKSxpPXBzKGkpO3ZhciBvLGE9dC10cyx1PWE+MD8xOi0xLGM9aVswXSptZip1LGY9d2YoYSk+MTgwO2ZeKHUqdHM8YyYmYzx1KnQpPyhvPWlbMV0qbWYpPkpmJiYoSmY9byk6Zl4odSp0czwoYz0oYyszNjApJTM2MC0xODApJiZjPHUqdCk/KG89LWlbMV0qbWYpPEtmJiYoS2Y9byk6KG48S2YmJihLZj1uKSxuPkpmJiYoSmY9bikpLGY/dDx0cz9IcyhaZix0KT5IcyhaZixRZikmJihRZj10KTpIcyh0LFFmKT5IcyhaZixRZikmJihaZj10KTpRZj49WmY/KHQ8WmYmJihaZj10KSx0PlFmJiYoUWY9dCkpOnQ+dHM/SHMoWmYsdCk+SHMoWmYsUWYpJiYoUWY9dCk6SHModCxRZik+SHMoWmYsUWYpJiYoWmY9dCl9ZWxzZSBvcy5wdXNoKGFzPVtaZj10LFFmPXRdKTtuPEtmJiYoS2Y9biksbj5KZiYmKEpmPW4pLHJzPWUsdHM9dH1mdW5jdGlvbiBPcygpe3FzLnBvaW50PUlzfWZ1bmN0aW9uIEJzKCl7YXNbMF09WmYsYXNbMV09UWYscXMucG9pbnQ9VXMscnM9bnVsbH1mdW5jdGlvbiBZcyh0LG4pe2lmKHJzKXt2YXIgZT10LXRzO2lzLmFkZCh3ZihlKT4xODA/ZSsoZT4wPzM2MDotMzYwKTplKX1lbHNlIG5zPXQsZXM9bjtmcy5wb2ludCh0LG4pLElzKHQsbil9ZnVuY3Rpb24gTHMoKXtmcy5saW5lU3RhcnQoKX1mdW5jdGlvbiBqcygpe1lzKG5zLGVzKSxmcy5saW5lRW5kKCksd2YoaXMpPnBmJiYoWmY9LShRZj0xODApKSxhc1swXT1aZixhc1sxXT1RZixycz1udWxsfWZ1bmN0aW9uIEhzKHQsbil7cmV0dXJuKG4tPXQpPDA/biszNjA6bn1mdW5jdGlvbiBYcyh0LG4pe3JldHVybiB0WzBdLW5bMF19ZnVuY3Rpb24gR3ModCxuKXtyZXR1cm4gdFswXTw9dFsxXT90WzBdPD1uJiZuPD10WzFdOm48dFswXXx8dFsxXTxufXZhciBWcz17c3BoZXJlOlVmLHBvaW50OldzLGxpbmVTdGFydDpLcyxsaW5lRW5kOnRsLHBvbHlnb25TdGFydDpmdW5jdGlvbigpe1ZzLmxpbmVTdGFydD1ubCxWcy5saW5lRW5kPWVsfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7VnMubGluZVN0YXJ0PUtzLFZzLmxpbmVFbmQ9dGx9fTtmdW5jdGlvbiBXcyh0LG4pe3QqPXhmO3ZhciBlPUFmKG4qPXhmKTtacyhlKkFmKHQpLGUqUGYodCksUGYobikpfWZ1bmN0aW9uIFpzKHQsbixlKXsrK3hzLE1zKz0odC1NcykveHMsVHMrPShuLVRzKS94cyxBcys9KGUtQXMpL3hzfWZ1bmN0aW9uIEtzKCl7VnMucG9pbnQ9UXN9ZnVuY3Rpb24gUXModCxuKXt0Kj14Zjt2YXIgZT1BZihuKj14Zik7RHM9ZSpBZih0KSxScz1lKlBmKHQpLEZzPVBmKG4pLFZzLnBvaW50PUpzLFpzKERzLFJzLEZzKX1mdW5jdGlvbiBKcyh0LG4pe3QqPXhmO3ZhciBlPUFmKG4qPXhmKSxyPWUqQWYodCksaT1lKlBmKHQpLG89UGYobiksYT1UZigkZigoYT1ScypvLUZzKmkpKmErKGE9RnMqci1EcypvKSphKyhhPURzKmktUnMqcikqYSksRHMqcitScyppK0ZzKm8pO3dzKz1hLFNzKz1hKihEcysoRHM9cikpLEVzKz1hKihScysoUnM9aSkpLE5zKz1hKihGcysoRnM9bykpLFpzKERzLFJzLEZzKX1mdW5jdGlvbiB0bCgpe1ZzLnBvaW50PVdzfWZ1bmN0aW9uIG5sKCl7VnMucG9pbnQ9cmx9ZnVuY3Rpb24gZWwoKXtpbCh6cywkcyksVnMucG9pbnQ9V3N9ZnVuY3Rpb24gcmwodCxuKXt6cz10LCRzPW4sdCo9eGYsbio9eGYsVnMucG9pbnQ9aWw7dmFyIGU9QWYobik7RHM9ZSpBZih0KSxScz1lKlBmKHQpLEZzPVBmKG4pLFpzKERzLFJzLEZzKX1mdW5jdGlvbiBpbCh0LG4pe3QqPXhmO3ZhciBlPUFmKG4qPXhmKSxyPWUqQWYodCksaT1lKlBmKHQpLG89UGYobiksYT1ScypvLUZzKmksdT1GcypyLURzKm8sYz1EcyppLVJzKnIsZj1OZihhLHUsYykscz1GZihmKSxsPWYmJi1zL2Y7a3MuYWRkKGwqYSksQ3MuYWRkKGwqdSksUHMuYWRkKGwqYyksd3MrPXMsU3MrPXMqKERzKyhEcz1yKSksRXMrPXMqKFJzKyhScz1pKSksTnMrPXMqKEZzKyhGcz1vKSksWnMoRHMsUnMsRnMpfWZ1bmN0aW9uIG9sKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0fX1mdW5jdGlvbiBhbCh0LG4pe2Z1bmN0aW9uIGUoZSxyKXtyZXR1cm4gZT10KGUsciksbihlWzBdLGVbMV0pfXJldHVybiB0LmludmVydCYmbi5pbnZlcnQmJihlLmludmVydD1mdW5jdGlvbihlLHIpe3JldHVybihlPW4uaW52ZXJ0KGUscikpJiZ0LmludmVydChlWzBdLGVbMV0pfSksZX1mdW5jdGlvbiB1bCh0LG4pe3JldHVybiB3Zih0KT55ZiYmKHQtPU1hdGgucm91bmQodC9iZikqYmYpLFt0LG5dfWZ1bmN0aW9uIGNsKHQsbixlKXtyZXR1cm4odCU9YmYpP258fGU/YWwoc2wodCksbGwobixlKSk6c2wodCk6bnx8ZT9sbChuLGUpOnVsfWZ1bmN0aW9uIGZsKHQpe3JldHVybiBmdW5jdGlvbihuLGUpe3JldHVybiB3ZihuKz10KT55ZiYmKG4tPU1hdGgucm91bmQobi9iZikqYmYpLFtuLGVdfX1mdW5jdGlvbiBzbCh0KXt2YXIgbj1mbCh0KTtyZXR1cm4gbi5pbnZlcnQ9ZmwoLXQpLG59ZnVuY3Rpb24gbGwodCxuKXt2YXIgZT1BZih0KSxyPVBmKHQpLGk9QWYobiksbz1QZihuKTtmdW5jdGlvbiBhKHQsbil7dmFyIGE9QWYobiksdT1BZih0KSphLGM9UGYodCkqYSxmPVBmKG4pLHM9ZiplK3UqcjtyZXR1cm5bVGYoYyppLXMqbyx1KmUtZipyKSxGZihzKmkrYypvKV19cmV0dXJuIGEuaW52ZXJ0PWZ1bmN0aW9uKHQsbil7dmFyIGE9QWYobiksdT1BZih0KSphLGM9UGYodCkqYSxmPVBmKG4pLHM9ZippLWMqbztyZXR1cm5bVGYoYyppK2Yqbyx1KmUrcypyKSxGZihzKmUtdSpyKV19LGF9ZnVuY3Rpb24gaGwodCl7ZnVuY3Rpb24gbihuKXtyZXR1cm4obj10KG5bMF0qeGYsblsxXSp4ZikpWzBdKj1tZixuWzFdKj1tZixufXJldHVybiB0PWNsKHRbMF0qeGYsdFsxXSp4Zix0Lmxlbmd0aD4yP3RbMl0qeGY6MCksbi5pbnZlcnQ9ZnVuY3Rpb24obil7cmV0dXJuKG49dC5pbnZlcnQoblswXSp4ZixuWzFdKnhmKSlbMF0qPW1mLG5bMV0qPW1mLG59LG59ZnVuY3Rpb24gZGwodCxuLGUscixpLG8pe2lmKGUpe3ZhciBhPUFmKG4pLHU9UGYobiksYz1yKmU7bnVsbD09aT8oaT1uK3IqYmYsbz1uLWMvMik6KGk9cGwoYSxpKSxvPXBsKGEsbyksKHI+MD9pPG86aT5vKSYmKGkrPXIqYmYpKTtmb3IodmFyIGYscz1pO3I+MD9zPm86czxvO3MtPWMpZj1wcyhbYSwtdSpBZihzKSwtdSpQZihzKV0pLHQucG9pbnQoZlswXSxmWzFdKX19ZnVuY3Rpb24gcGwodCxuKXsobj1ncyhuKSlbMF0tPXQsbXMobik7dmFyIGU9UmYoLW5bMV0pO3JldHVybigoLW5bMl08MD8tZTplKStiZi1wZiklYmZ9ZnVuY3Rpb24gZ2woKXt2YXIgdCxuPVtdO3JldHVybntwb2ludDpmdW5jdGlvbihuLGUscil7dC5wdXNoKFtuLGUscl0pfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXtuLnB1c2godD1bXSl9LGxpbmVFbmQ6VWYscmVqb2luOmZ1bmN0aW9uKCl7bi5sZW5ndGg+MSYmbi5wdXNoKG4ucG9wKCkuY29uY2F0KG4uc2hpZnQoKSkpfSxyZXN1bHQ6ZnVuY3Rpb24oKXt2YXIgZT1uO3JldHVybiBuPVtdLHQ9bnVsbCxlfX19ZnVuY3Rpb24geWwodCxuKXtyZXR1cm4gd2YodFswXS1uWzBdKTxwZiYmd2YodFsxXS1uWzFdKTxwZn1mdW5jdGlvbiB2bCh0LG4sZSxyKXt0aGlzLng9dCx0aGlzLno9bix0aGlzLm89ZSx0aGlzLmU9cix0aGlzLnY9ITEsdGhpcy5uPXRoaXMucD1udWxsfWZ1bmN0aW9uIF9sKHQsbixlLHIsaSl7dmFyIG8sYSx1PVtdLGM9W107aWYodC5mb3JFYWNoKChmdW5jdGlvbih0KXtpZighKChuPXQubGVuZ3RoLTEpPD0wKSl7dmFyIG4sZSxyPXRbMF0sYT10W25dO2lmKHlsKHIsYSkpe2lmKCFyWzJdJiYhYVsyXSl7Zm9yKGkubGluZVN0YXJ0KCksbz0wO288bjsrK28paS5wb2ludCgocj10W29dKVswXSxyWzFdKTtyZXR1cm4gdm9pZCBpLmxpbmVFbmQoKX1hWzBdKz0yKnBmfXUucHVzaChlPW5ldyB2bChyLHQsbnVsbCwhMCkpLGMucHVzaChlLm89bmV3IHZsKHIsbnVsbCxlLCExKSksdS5wdXNoKGU9bmV3IHZsKGEsdCxudWxsLCExKSksYy5wdXNoKGUubz1uZXcgdmwoYSxudWxsLGUsITApKX19KSksdS5sZW5ndGgpe2ZvcihjLnNvcnQobiksYmwodSksYmwoYyksbz0wLGE9Yy5sZW5ndGg7bzxhOysrbyljW29dLmU9ZT0hZTtmb3IodmFyIGYscyxsPXVbMF07Oyl7Zm9yKHZhciBoPWwsZD0hMDtoLnY7KWlmKChoPWgubik9PT1sKXJldHVybjtmPWgueixpLmxpbmVTdGFydCgpO2Rve2lmKGgudj1oLm8udj0hMCxoLmUpe2lmKGQpZm9yKG89MCxhPWYubGVuZ3RoO288YTsrK28paS5wb2ludCgocz1mW29dKVswXSxzWzFdKTtlbHNlIHIoaC54LGgubi54LDEsaSk7aD1oLm59ZWxzZXtpZihkKWZvcihmPWgucC56LG89Zi5sZW5ndGgtMTtvPj0wOy0tbylpLnBvaW50KChzPWZbb10pWzBdLHNbMV0pO2Vsc2UgcihoLngsaC5wLngsLTEsaSk7aD1oLnB9Zj0oaD1oLm8pLnosZD0hZH13aGlsZSghaC52KTtpLmxpbmVFbmQoKX19fWZ1bmN0aW9uIGJsKHQpe2lmKG49dC5sZW5ndGgpe2Zvcih2YXIgbixlLHI9MCxpPXRbMF07KytyPG47KWkubj1lPXRbcl0sZS5wPWksaT1lO2kubj1lPXRbMF0sZS5wPWl9fWZ1bmN0aW9uIG1sKHQpe3JldHVybiB3Zih0WzBdKTw9eWY/dFswXTp6Zih0WzBdKSooKHdmKHRbMF0pK3lmKSViZi15Zil9ZnVuY3Rpb24geGwodCxuKXt2YXIgZT1tbChuKSxyPW5bMV0saT1QZihyKSxvPVtQZihlKSwtQWYoZSksMF0sYT0wLHU9MCxjPW5ldyBBOzE9PT1pP3I9dmYrcGY6LTE9PT1pJiYocj0tdmYtcGYpO2Zvcih2YXIgZj0wLHM9dC5sZW5ndGg7ZjxzOysrZilpZihoPShsPXRbZl0pLmxlbmd0aClmb3IodmFyIGwsaCxkPWxbaC0xXSxwPW1sKGQpLGc9ZFsxXS8yK19mLHk9UGYoZyksdj1BZihnKSxfPTA7XzxoOysrXyxwPW0seT13LHY9TSxkPWIpe3ZhciBiPWxbX10sbT1tbChiKSx4PWJbMV0vMitfZix3PVBmKHgpLE09QWYoeCksVD1tLXAsUz1UPj0wPzE6LTEsRT1TKlQsTj1FPnlmLGs9eSp3O2lmKGMuYWRkKFRmKGsqUypQZihFKSx2Kk0raypBZihFKSkpLGErPU4/VCtTKmJmOlQsTl5wPj1lXm0+PWUpe3ZhciBDPXZzKGdzKGQpLGdzKGIpKTttcyhDKTt2YXIgUD12cyhvLEMpO21zKFApO3ZhciB6PShOXlQ+PTA/LTE6MSkqRmYoUFsyXSk7KHI+enx8cj09PXomJihDWzBdfHxDWzFdKSkmJih1Kz1OXlQ+PTA/MTotMSl9fXJldHVybihhPC1wZnx8YTxwZiYmYzwtZ2YpXjEmdX1mdW5jdGlvbiB3bCh0LG4sZSxyKXtyZXR1cm4gZnVuY3Rpb24oaSl7dmFyIG8sYSx1LGM9bihpKSxmPWdsKCkscz1uKGYpLGw9ITEsaD17cG9pbnQ6ZCxsaW5lU3RhcnQ6ZyxsaW5lRW5kOnkscG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7aC5wb2ludD12LGgubGluZVN0YXJ0PV8saC5saW5lRW5kPWIsYT1bXSxvPVtdfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7aC5wb2ludD1kLGgubGluZVN0YXJ0PWcsaC5saW5lRW5kPXksYT1zdChhKTt2YXIgdD14bChvLHIpO2EubGVuZ3RoPyhsfHwoaS5wb2x5Z29uU3RhcnQoKSxsPSEwKSxfbChhLFRsLHQsZSxpKSk6dCYmKGx8fChpLnBvbHlnb25TdGFydCgpLGw9ITApLGkubGluZVN0YXJ0KCksZShudWxsLG51bGwsMSxpKSxpLmxpbmVFbmQoKSksbCYmKGkucG9seWdvbkVuZCgpLGw9ITEpLGE9bz1udWxsfSxzcGhlcmU6ZnVuY3Rpb24oKXtpLnBvbHlnb25TdGFydCgpLGkubGluZVN0YXJ0KCksZShudWxsLG51bGwsMSxpKSxpLmxpbmVFbmQoKSxpLnBvbHlnb25FbmQoKX19O2Z1bmN0aW9uIGQobixlKXt0KG4sZSkmJmkucG9pbnQobixlKX1mdW5jdGlvbiBwKHQsbil7Yy5wb2ludCh0LG4pfWZ1bmN0aW9uIGcoKXtoLnBvaW50PXAsYy5saW5lU3RhcnQoKX1mdW5jdGlvbiB5KCl7aC5wb2ludD1kLGMubGluZUVuZCgpfWZ1bmN0aW9uIHYodCxuKXt1LnB1c2goW3Qsbl0pLHMucG9pbnQodCxuKX1mdW5jdGlvbiBfKCl7cy5saW5lU3RhcnQoKSx1PVtdfWZ1bmN0aW9uIGIoKXt2KHVbMF1bMF0sdVswXVsxXSkscy5saW5lRW5kKCk7dmFyIHQsbixlLHIsYz1zLmNsZWFuKCksaD1mLnJlc3VsdCgpLGQ9aC5sZW5ndGg7aWYodS5wb3AoKSxvLnB1c2godSksdT1udWxsLGQpaWYoMSZjKXtpZigobj0oZT1oWzBdKS5sZW5ndGgtMSk+MCl7Zm9yKGx8fChpLnBvbHlnb25TdGFydCgpLGw9ITApLGkubGluZVN0YXJ0KCksdD0wO3Q8bjsrK3QpaS5wb2ludCgocj1lW3RdKVswXSxyWzFdKTtpLmxpbmVFbmQoKX19ZWxzZSBkPjEmJjImYyYmaC5wdXNoKGgucG9wKCkuY29uY2F0KGguc2hpZnQoKSkpLGEucHVzaChoLmZpbHRlcihNbCkpfXJldHVybiBofX1mdW5jdGlvbiBNbCh0KXtyZXR1cm4gdC5sZW5ndGg+MX1mdW5jdGlvbiBUbCh0LG4pe3JldHVybigodD10LngpWzBdPDA/dFsxXS12Zi1wZjp2Zi10WzFdKS0oKG49bi54KVswXTwwP25bMV0tdmYtcGY6dmYtblsxXSl9dWwuaW52ZXJ0PXVsO3ZhciBBbD13bCgoZnVuY3Rpb24oKXtyZXR1cm4hMH0pLChmdW5jdGlvbih0KXt2YXIgbixlPU5hTixyPU5hTixpPU5hTjtyZXR1cm57bGluZVN0YXJ0OmZ1bmN0aW9uKCl7dC5saW5lU3RhcnQoKSxuPTF9LHBvaW50OmZ1bmN0aW9uKG8sYSl7dmFyIHU9bz4wP3lmOi15ZixjPXdmKG8tZSk7d2YoYy15Zik8cGY/KHQucG9pbnQoZSxyPShyK2EpLzI+MD92ZjotdmYpLHQucG9pbnQoaSxyKSx0LmxpbmVFbmQoKSx0LmxpbmVTdGFydCgpLHQucG9pbnQodSxyKSx0LnBvaW50KG8sciksbj0wKTppIT09dSYmYz49eWYmJih3ZihlLWkpPHBmJiYoZS09aSpwZiksd2Yoby11KTxwZiYmKG8tPXUqcGYpLHI9ZnVuY3Rpb24odCxuLGUscil7dmFyIGksbyxhPVBmKHQtZSk7cmV0dXJuIHdmKGEpPnBmP01mKChQZihuKSoobz1BZihyKSkqUGYoZSktUGYocikqKGk9QWYobikpKlBmKHQpKS8oaSpvKmEpKToobityKS8yfShlLHIsbyxhKSx0LnBvaW50KGksciksdC5saW5lRW5kKCksdC5saW5lU3RhcnQoKSx0LnBvaW50KHUsciksbj0wKSx0LnBvaW50KGU9byxyPWEpLGk9dX0sbGluZUVuZDpmdW5jdGlvbigpe3QubGluZUVuZCgpLGU9cj1OYU59LGNsZWFuOmZ1bmN0aW9uKCl7cmV0dXJuIDItbn19fSksKGZ1bmN0aW9uKHQsbixlLHIpe3ZhciBpO2lmKG51bGw9PXQpaT1lKnZmLHIucG9pbnQoLXlmLGkpLHIucG9pbnQoMCxpKSxyLnBvaW50KHlmLGkpLHIucG9pbnQoeWYsMCksci5wb2ludCh5ZiwtaSksci5wb2ludCgwLC1pKSxyLnBvaW50KC15ZiwtaSksci5wb2ludCgteWYsMCksci5wb2ludCgteWYsaSk7ZWxzZSBpZih3Zih0WzBdLW5bMF0pPnBmKXt2YXIgbz10WzBdPG5bMF0/eWY6LXlmO2k9ZSpvLzIsci5wb2ludCgtbyxpKSxyLnBvaW50KDAsaSksci5wb2ludChvLGkpfWVsc2Ugci5wb2ludChuWzBdLG5bMV0pfSksWy15ZiwtdmZdKTtmdW5jdGlvbiBTbCh0KXt2YXIgbj1BZih0KSxlPTYqeGYscj1uPjAsaT13ZihuKT5wZjtmdW5jdGlvbiBvKHQsZSl7cmV0dXJuIEFmKHQpKkFmKGUpPm59ZnVuY3Rpb24gYSh0LGUscil7dmFyIGk9WzEsMCwwXSxvPXZzKGdzKHQpLGdzKGUpKSxhPXlzKG8sbyksdT1vWzBdLGM9YS11KnU7aWYoIWMpcmV0dXJuIXImJnQ7dmFyIGY9biphL2Mscz0tbip1L2MsbD12cyhpLG8pLGg9YnMoaSxmKTtfcyhoLGJzKG8scykpO3ZhciBkPWwscD15cyhoLGQpLGc9eXMoZCxkKSx5PXAqcC1nKih5cyhoLGgpLTEpO2lmKCEoeTwwKSl7dmFyIHY9JGYoeSksXz1icyhkLCgtcC12KS9nKTtpZihfcyhfLGgpLF89cHMoXyksIXIpcmV0dXJuIF87dmFyIGIsbT10WzBdLHg9ZVswXSx3PXRbMV0sTT1lWzFdO3g8bSYmKGI9bSxtPXgseD1iKTt2YXIgVD14LW0sQT13ZihULXlmKTxwZjtpZighQSYmTTx3JiYoYj13LHc9TSxNPWIpLEF8fFQ8cGY/QT93K00+MF5fWzFdPCh3ZihfWzBdLW0pPHBmP3c6TSk6dzw9X1sxXSYmX1sxXTw9TTpUPnlmXihtPD1fWzBdJiZfWzBdPD14KSl7dmFyIFM9YnMoZCwoLXArdikvZyk7cmV0dXJuIF9zKFMsaCksW18scHMoUyldfX19ZnVuY3Rpb24gdShuLGUpe3ZhciBpPXI/dDp5Zi10LG89MDtyZXR1cm4gbjwtaT9vfD0xOm4+aSYmKG98PTIpLGU8LWk/b3w9NDplPmkmJihvfD04KSxvfXJldHVybiB3bChvLChmdW5jdGlvbih0KXt2YXIgbixlLGMsZixzO3JldHVybntsaW5lU3RhcnQ6ZnVuY3Rpb24oKXtmPWM9ITEscz0xfSxwb2ludDpmdW5jdGlvbihsLGgpe3ZhciBkLHA9W2wsaF0sZz1vKGwsaCkseT1yP2c/MDp1KGwsaCk6Zz91KGwrKGw8MD95ZjoteWYpLGgpOjA7aWYoIW4mJihmPWM9ZykmJnQubGluZVN0YXJ0KCksZyE9PWMmJighKGQ9YShuLHApKXx8eWwobixkKXx8eWwocCxkKSkmJihwWzJdPTEpLGchPT1jKXM9MCxnPyh0LmxpbmVTdGFydCgpLGQ9YShwLG4pLHQucG9pbnQoZFswXSxkWzFdKSk6KGQ9YShuLHApLHQucG9pbnQoZFswXSxkWzFdLDIpLHQubGluZUVuZCgpKSxuPWQ7ZWxzZSBpZihpJiZuJiZyXmcpe3ZhciB2O3kmZXx8ISh2PWEocCxuLCEwKSl8fChzPTAscj8odC5saW5lU3RhcnQoKSx0LnBvaW50KHZbMF1bMF0sdlswXVsxXSksdC5wb2ludCh2WzFdWzBdLHZbMV1bMV0pLHQubGluZUVuZCgpKToodC5wb2ludCh2WzFdWzBdLHZbMV1bMV0pLHQubGluZUVuZCgpLHQubGluZVN0YXJ0KCksdC5wb2ludCh2WzBdWzBdLHZbMF1bMV0sMykpKX0hZ3x8biYmeWwobixwKXx8dC5wb2ludChwWzBdLHBbMV0pLG49cCxjPWcsZT15fSxsaW5lRW5kOmZ1bmN0aW9uKCl7YyYmdC5saW5lRW5kKCksbj1udWxsfSxjbGVhbjpmdW5jdGlvbigpe3JldHVybiBzfChmJiZjKTw8MX19fSksKGZ1bmN0aW9uKG4scixpLG8pe2RsKG8sdCxlLGksbixyKX0pLHI/WzAsLXRdOlsteWYsdC15Zl0pfXZhciBFbCxObCxrbCxDbCxQbD0xZTksemw9LVBsO2Z1bmN0aW9uICRsKHQsbixlLHIpe2Z1bmN0aW9uIGkoaSxvKXtyZXR1cm4gdDw9aSYmaTw9ZSYmbjw9byYmbzw9cn1mdW5jdGlvbiBvKGksbyx1LGYpe3ZhciBzPTAsbD0wO2lmKG51bGw9PWl8fChzPWEoaSx1KSkhPT0obD1hKG8sdSkpfHxjKGksbyk8MF51PjApZG97Zi5wb2ludCgwPT09c3x8Mz09PXM/dDplLHM+MT9yOm4pfXdoaWxlKChzPShzK3UrNCklNCkhPT1sKTtlbHNlIGYucG9pbnQob1swXSxvWzFdKX1mdW5jdGlvbiBhKHIsaSl7cmV0dXJuIHdmKHJbMF0tdCk8cGY/aT4wPzA6Mzp3ZihyWzBdLWUpPHBmP2k+MD8yOjE6d2YoclsxXS1uKTxwZj9pPjA/MTowOmk+MD8zOjJ9ZnVuY3Rpb24gdSh0LG4pe3JldHVybiBjKHQueCxuLngpfWZ1bmN0aW9uIGModCxuKXt2YXIgZT1hKHQsMSkscj1hKG4sMSk7cmV0dXJuIGUhPT1yP2UtcjowPT09ZT9uWzFdLXRbMV06MT09PWU/dFswXS1uWzBdOjI9PT1lP3RbMV0tblsxXTpuWzBdLXRbMF19cmV0dXJuIGZ1bmN0aW9uKGEpe3ZhciBjLGYscyxsLGgsZCxwLGcseSx2LF8sYj1hLG09Z2woKSx4PXtwb2ludDp3LGxpbmVTdGFydDpmdW5jdGlvbigpe3gucG9pbnQ9TSxmJiZmLnB1c2gocz1bXSk7dj0hMCx5PSExLHA9Zz1OYU59LGxpbmVFbmQ6ZnVuY3Rpb24oKXtjJiYoTShsLGgpLGQmJnkmJm0ucmVqb2luKCksYy5wdXNoKG0ucmVzdWx0KCkpKTt4LnBvaW50PXcseSYmYi5saW5lRW5kKCl9LHBvbHlnb25TdGFydDpmdW5jdGlvbigpe2I9bSxjPVtdLGY9W10sXz0hMH0scG9seWdvbkVuZDpmdW5jdGlvbigpe3ZhciBuPWZ1bmN0aW9uKCl7Zm9yKHZhciBuPTAsZT0wLGk9Zi5sZW5ndGg7ZTxpOysrZSlmb3IodmFyIG8sYSx1PWZbZV0sYz0xLHM9dS5sZW5ndGgsbD11WzBdLGg9bFswXSxkPWxbMV07YzxzOysrYylvPWgsYT1kLGg9KGw9dVtjXSlbMF0sZD1sWzFdLGE8PXI/ZD5yJiYoaC1vKSooci1hKT4oZC1hKSoodC1vKSYmKytuOmQ8PXImJihoLW8pKihyLWEpPChkLWEpKih0LW8pJiYtLW47cmV0dXJuIG59KCksZT1fJiZuLGk9KGM9c3QoYykpLmxlbmd0aDsoZXx8aSkmJihhLnBvbHlnb25TdGFydCgpLGUmJihhLmxpbmVTdGFydCgpLG8obnVsbCxudWxsLDEsYSksYS5saW5lRW5kKCkpLGkmJl9sKGMsdSxuLG8sYSksYS5wb2x5Z29uRW5kKCkpO2I9YSxjPWY9cz1udWxsfX07ZnVuY3Rpb24gdyh0LG4pe2kodCxuKSYmYi5wb2ludCh0LG4pfWZ1bmN0aW9uIE0obyxhKXt2YXIgdT1pKG8sYSk7aWYoZiYmcy5wdXNoKFtvLGFdKSx2KWw9byxoPWEsZD11LHY9ITEsdSYmKGIubGluZVN0YXJ0KCksYi5wb2ludChvLGEpKTtlbHNlIGlmKHUmJnkpYi5wb2ludChvLGEpO2Vsc2V7dmFyIGM9W3A9TWF0aC5tYXgoemwsTWF0aC5taW4oUGwscCkpLGc9TWF0aC5tYXgoemwsTWF0aC5taW4oUGwsZykpXSxtPVtvPU1hdGgubWF4KHpsLE1hdGgubWluKFBsLG8pKSxhPU1hdGgubWF4KHpsLE1hdGgubWluKFBsLGEpKV07IWZ1bmN0aW9uKHQsbixlLHIsaSxvKXt2YXIgYSx1PXRbMF0sYz10WzFdLGY9MCxzPTEsbD1uWzBdLXUsaD1uWzFdLWM7aWYoYT1lLXUsbHx8IShhPjApKXtpZihhLz1sLGw8MCl7aWYoYTxmKXJldHVybjthPHMmJihzPWEpfWVsc2UgaWYobD4wKXtpZihhPnMpcmV0dXJuO2E+ZiYmKGY9YSl9aWYoYT1pLXUsbHx8IShhPDApKXtpZihhLz1sLGw8MCl7aWYoYT5zKXJldHVybjthPmYmJihmPWEpfWVsc2UgaWYobD4wKXtpZihhPGYpcmV0dXJuO2E8cyYmKHM9YSl9aWYoYT1yLWMsaHx8IShhPjApKXtpZihhLz1oLGg8MCl7aWYoYTxmKXJldHVybjthPHMmJihzPWEpfWVsc2UgaWYoaD4wKXtpZihhPnMpcmV0dXJuO2E+ZiYmKGY9YSl9aWYoYT1vLWMsaHx8IShhPDApKXtpZihhLz1oLGg8MCl7aWYoYT5zKXJldHVybjthPmYmJihmPWEpfWVsc2UgaWYoaD4wKXtpZihhPGYpcmV0dXJuO2E8cyYmKHM9YSl9cmV0dXJuIGY+MCYmKHRbMF09dStmKmwsdFsxXT1jK2YqaCksczwxJiYoblswXT11K3MqbCxuWzFdPWMrcypoKSwhMH19fX19KGMsbSx0LG4sZSxyKT91JiYoYi5saW5lU3RhcnQoKSxiLnBvaW50KG8sYSksXz0hMSk6KHl8fChiLmxpbmVTdGFydCgpLGIucG9pbnQoY1swXSxjWzFdKSksYi5wb2ludChtWzBdLG1bMV0pLHV8fGIubGluZUVuZCgpLF89ITEpfXA9byxnPWEseT11fXJldHVybiB4fX12YXIgRGw9e3NwaGVyZTpVZixwb2ludDpVZixsaW5lU3RhcnQ6ZnVuY3Rpb24oKXtEbC5wb2ludD1GbCxEbC5saW5lRW5kPVJsfSxsaW5lRW5kOlVmLHBvbHlnb25TdGFydDpVZixwb2x5Z29uRW5kOlVmfTtmdW5jdGlvbiBSbCgpe0RsLnBvaW50PURsLmxpbmVFbmQ9VWZ9ZnVuY3Rpb24gRmwodCxuKXtObD10Kj14ZixrbD1QZihuKj14ZiksQ2w9QWYobiksRGwucG9pbnQ9cWx9ZnVuY3Rpb24gcWwodCxuKXt0Kj14Zjt2YXIgZT1QZihuKj14Zikscj1BZihuKSxpPXdmKHQtTmwpLG89QWYoaSksYT1yKlBmKGkpLHU9Q2wqZS1rbCpyKm8sYz1rbCplK0NsKnIqbztFbC5hZGQoVGYoJGYoYSphK3UqdSksYykpLE5sPXQsa2w9ZSxDbD1yfWZ1bmN0aW9uIFVsKHQpe3JldHVybiBFbD1uZXcgQSxqZih0LERsKSwrRWx9dmFyIElsPVtudWxsLG51bGxdLE9sPXt0eXBlOiJMaW5lU3RyaW5nIixjb29yZGluYXRlczpJbH07ZnVuY3Rpb24gQmwodCxuKXtyZXR1cm4gSWxbMF09dCxJbFsxXT1uLFVsKE9sKX12YXIgWWw9e0ZlYXR1cmU6ZnVuY3Rpb24odCxuKXtyZXR1cm4gamwodC5nZW9tZXRyeSxuKX0sRmVhdHVyZUNvbGxlY3Rpb246ZnVuY3Rpb24odCxuKXtmb3IodmFyIGU9dC5mZWF0dXJlcyxyPS0xLGk9ZS5sZW5ndGg7KytyPGk7KWlmKGpsKGVbcl0uZ2VvbWV0cnksbikpcmV0dXJuITA7cmV0dXJuITF9fSxMbD17U3BoZXJlOmZ1bmN0aW9uKCl7cmV0dXJuITB9LFBvaW50OmZ1bmN0aW9uKHQsbil7cmV0dXJuIEhsKHQuY29vcmRpbmF0ZXMsbil9LE11bHRpUG9pbnQ6ZnVuY3Rpb24odCxuKXtmb3IodmFyIGU9dC5jb29yZGluYXRlcyxyPS0xLGk9ZS5sZW5ndGg7KytyPGk7KWlmKEhsKGVbcl0sbikpcmV0dXJuITA7cmV0dXJuITF9LExpbmVTdHJpbmc6ZnVuY3Rpb24odCxuKXtyZXR1cm4gWGwodC5jb29yZGluYXRlcyxuKX0sTXVsdGlMaW5lU3RyaW5nOmZ1bmN0aW9uKHQsbil7Zm9yKHZhciBlPXQuY29vcmRpbmF0ZXMscj0tMSxpPWUubGVuZ3RoOysrcjxpOylpZihYbChlW3JdLG4pKXJldHVybiEwO3JldHVybiExfSxQb2x5Z29uOmZ1bmN0aW9uKHQsbil7cmV0dXJuIEdsKHQuY29vcmRpbmF0ZXMsbil9LE11bHRpUG9seWdvbjpmdW5jdGlvbih0LG4pe2Zvcih2YXIgZT10LmNvb3JkaW5hdGVzLHI9LTEsaT1lLmxlbmd0aDsrK3I8aTspaWYoR2woZVtyXSxuKSlyZXR1cm4hMDtyZXR1cm4hMX0sR2VvbWV0cnlDb2xsZWN0aW9uOmZ1bmN0aW9uKHQsbil7Zm9yKHZhciBlPXQuZ2VvbWV0cmllcyxyPS0xLGk9ZS5sZW5ndGg7KytyPGk7KWlmKGpsKGVbcl0sbikpcmV0dXJuITA7cmV0dXJuITF9fTtmdW5jdGlvbiBqbCh0LG4pe3JldHVybiEoIXR8fCFMbC5oYXNPd25Qcm9wZXJ0eSh0LnR5cGUpKSYmTGxbdC50eXBlXSh0LG4pfWZ1bmN0aW9uIEhsKHQsbil7cmV0dXJuIDA9PT1CbCh0LG4pfWZ1bmN0aW9uIFhsKHQsbil7Zm9yKHZhciBlLHIsaSxvPTAsYT10Lmxlbmd0aDtvPGE7bysrKXtpZigwPT09KHI9QmwodFtvXSxuKSkpcmV0dXJuITA7aWYobz4wJiYoaT1CbCh0W29dLHRbby0xXSkpPjAmJmU8PWkmJnI8PWkmJihlK3ItaSkqKDEtTWF0aC5wb3coKGUtcikvaSwyKSk8Z2YqaSlyZXR1cm4hMDtlPXJ9cmV0dXJuITF9ZnVuY3Rpb24gR2wodCxuKXtyZXR1cm4hIXhsKHQubWFwKFZsKSxXbChuKSl9ZnVuY3Rpb24gVmwodCl7cmV0dXJuKHQ9dC5tYXAoV2wpKS5wb3AoKSx0fWZ1bmN0aW9uIFdsKHQpe3JldHVyblt0WzBdKnhmLHRbMV0qeGZdfWZ1bmN0aW9uIFpsKHQsbixlKXt2YXIgcj1odCh0LG4tcGYsZSkuY29uY2F0KG4pO3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gci5tYXAoKGZ1bmN0aW9uKG4pe3JldHVyblt0LG5dfSkpfX1mdW5jdGlvbiBLbCh0LG4sZSl7dmFyIHI9aHQodCxuLXBmLGUpLmNvbmNhdChuKTtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIHIubWFwKChmdW5jdGlvbihuKXtyZXR1cm5bbix0XX0pKX19ZnVuY3Rpb24gUWwoKXt2YXIgdCxuLGUscixpLG8sYSx1LGMsZixzLGwsaD0xMCxkPWgscD05MCxnPTM2MCx5PTIuNTtmdW5jdGlvbiB2KCl7cmV0dXJue3R5cGU6Ik11bHRpTGluZVN0cmluZyIsY29vcmRpbmF0ZXM6XygpfX1mdW5jdGlvbiBfKCl7cmV0dXJuIGh0KFNmKHIvcCkqcCxlLHApLm1hcChzKS5jb25jYXQoaHQoU2YodS9nKSpnLGEsZykubWFwKGwpKS5jb25jYXQoaHQoU2Yobi9oKSpoLHQsaCkuZmlsdGVyKChmdW5jdGlvbih0KXtyZXR1cm4gd2YodCVwKT5wZn0pKS5tYXAoYykpLmNvbmNhdChodChTZihvL2QpKmQsaSxkKS5maWx0ZXIoKGZ1bmN0aW9uKHQpe3JldHVybiB3Zih0JWcpPnBmfSkpLm1hcChmKSl9cmV0dXJuIHYubGluZXM9ZnVuY3Rpb24oKXtyZXR1cm4gXygpLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJue3R5cGU6IkxpbmVTdHJpbmciLGNvb3JkaW5hdGVzOnR9fSkpfSx2Lm91dGxpbmU9ZnVuY3Rpb24oKXtyZXR1cm57dHlwZToiUG9seWdvbiIsY29vcmRpbmF0ZXM6W3MocikuY29uY2F0KGwoYSkuc2xpY2UoMSkscyhlKS5yZXZlcnNlKCkuc2xpY2UoMSksbCh1KS5yZXZlcnNlKCkuc2xpY2UoMSkpXX19LHYuZXh0ZW50PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3YuZXh0ZW50TWFqb3IodCkuZXh0ZW50TWlub3IodCk6di5leHRlbnRNaW5vcigpfSx2LmV4dGVudE1ham9yPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPSt0WzBdWzBdLGU9K3RbMV1bMF0sdT0rdFswXVsxXSxhPSt0WzFdWzFdLHI+ZSYmKHQ9cixyPWUsZT10KSx1PmEmJih0PXUsdT1hLGE9dCksdi5wcmVjaXNpb24oeSkpOltbcix1XSxbZSxhXV19LHYuZXh0ZW50TWlub3I9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49K2VbMF1bMF0sdD0rZVsxXVswXSxvPStlWzBdWzFdLGk9K2VbMV1bMV0sbj50JiYoZT1uLG49dCx0PWUpLG8+aSYmKGU9byxvPWksaT1lKSx2LnByZWNpc2lvbih5KSk6W1tuLG9dLFt0LGldXX0sdi5zdGVwPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3Yuc3RlcE1ham9yKHQpLnN0ZXBNaW5vcih0KTp2LnN0ZXBNaW5vcigpfSx2LnN0ZXBNYWpvcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocD0rdFswXSxnPSt0WzFdLHYpOltwLGddfSx2LnN0ZXBNaW5vcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaD0rdFswXSxkPSt0WzFdLHYpOltoLGRdfSx2LnByZWNpc2lvbj1mdW5jdGlvbihoKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oeT0raCxjPVpsKG8saSw5MCksZj1LbChuLHQseSkscz1abCh1LGEsOTApLGw9S2wocixlLHkpLHYpOnl9LHYuZXh0ZW50TWFqb3IoW1stMTgwLC05MCtwZl0sWzE4MCw5MC1wZl1dKS5leHRlbnRNaW5vcihbWy0xODAsLTgwLXBmXSxbMTgwLDgwK3BmXV0pfXZhciBKbCx0aCxuaCxlaCxyaD10PT50LGloPW5ldyBBLG9oPW5ldyBBLGFoPXtwb2ludDpVZixsaW5lU3RhcnQ6VWYsbGluZUVuZDpVZixwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXthaC5saW5lU3RhcnQ9dWgsYWgubGluZUVuZD1zaH0scG9seWdvbkVuZDpmdW5jdGlvbigpe2FoLmxpbmVTdGFydD1haC5saW5lRW5kPWFoLnBvaW50PVVmLGloLmFkZCh3ZihvaCkpLG9oPW5ldyBBfSxyZXN1bHQ6ZnVuY3Rpb24oKXt2YXIgdD1paC8yO3JldHVybiBpaD1uZXcgQSx0fX07ZnVuY3Rpb24gdWgoKXthaC5wb2ludD1jaH1mdW5jdGlvbiBjaCh0LG4pe2FoLnBvaW50PWZoLEpsPW5oPXQsdGg9ZWg9bn1mdW5jdGlvbiBmaCh0LG4pe29oLmFkZChlaCp0LW5oKm4pLG5oPXQsZWg9bn1mdW5jdGlvbiBzaCgpe2ZoKEpsLHRoKX12YXIgbGg9YWgsaGg9MS8wLGRoPWhoLHBoPS1oaCxnaD1waCx5aD17cG9pbnQ6ZnVuY3Rpb24odCxuKXt0PGhoJiYoaGg9dCk7dD5waCYmKHBoPXQpO248ZGgmJihkaD1uKTtuPmdoJiYoZ2g9bil9LGxpbmVTdGFydDpVZixsaW5lRW5kOlVmLHBvbHlnb25TdGFydDpVZixwb2x5Z29uRW5kOlVmLHJlc3VsdDpmdW5jdGlvbigpe3ZhciB0PVtbaGgsZGhdLFtwaCxnaF1dO3JldHVybiBwaD1naD0tKGRoPWhoPTEvMCksdH19O3ZhciB2aCxfaCxiaCxtaCx4aD15aCx3aD0wLE1oPTAsVGg9MCxBaD0wLFNoPTAsRWg9MCxOaD0wLGtoPTAsQ2g9MCxQaD17cG9pbnQ6emgsbGluZVN0YXJ0OiRoLGxpbmVFbmQ6RmgscG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7UGgubGluZVN0YXJ0PXFoLFBoLmxpbmVFbmQ9VWh9LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXtQaC5wb2ludD16aCxQaC5saW5lU3RhcnQ9JGgsUGgubGluZUVuZD1GaH0scmVzdWx0OmZ1bmN0aW9uKCl7dmFyIHQ9Q2g/W05oL0NoLGtoL0NoXTpFaD9bQWgvRWgsU2gvRWhdOlRoP1t3aC9UaCxNaC9UaF06W05hTixOYU5dO3JldHVybiB3aD1NaD1UaD1BaD1TaD1FaD1OaD1raD1DaD0wLHR9fTtmdW5jdGlvbiB6aCh0LG4pe3doKz10LE1oKz1uLCsrVGh9ZnVuY3Rpb24gJGgoKXtQaC5wb2ludD1EaH1mdW5jdGlvbiBEaCh0LG4pe1BoLnBvaW50PVJoLHpoKGJoPXQsbWg9bil9ZnVuY3Rpb24gUmgodCxuKXt2YXIgZT10LWJoLHI9bi1taCxpPSRmKGUqZStyKnIpO0FoKz1pKihiaCt0KS8yLFNoKz1pKihtaCtuKS8yLEVoKz1pLHpoKGJoPXQsbWg9bil9ZnVuY3Rpb24gRmgoKXtQaC5wb2ludD16aH1mdW5jdGlvbiBxaCgpe1BoLnBvaW50PUlofWZ1bmN0aW9uIFVoKCl7T2godmgsX2gpfWZ1bmN0aW9uIEloKHQsbil7UGgucG9pbnQ9T2gsemgodmg9Ymg9dCxfaD1taD1uKX1mdW5jdGlvbiBPaCh0LG4pe3ZhciBlPXQtYmgscj1uLW1oLGk9JGYoZSplK3Iqcik7QWgrPWkqKGJoK3QpLzIsU2grPWkqKG1oK24pLzIsRWgrPWksTmgrPShpPW1oKnQtYmgqbikqKGJoK3QpLGtoKz1pKihtaCtuKSxDaCs9MyppLHpoKGJoPXQsbWg9bil9dmFyIEJoPVBoO2Z1bmN0aW9uIFloKHQpe3RoaXMuX2NvbnRleHQ9dH1ZaC5wcm90b3R5cGU9e19yYWRpdXM6NC41LHBvaW50UmFkaXVzOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9yYWRpdXM9dCx0aGlzfSxwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPTB9LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPU5hTn0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5fcG9pbnQ9MH0sbGluZUVuZDpmdW5jdGlvbigpezA9PT10aGlzLl9saW5lJiZ0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpLHRoaXMuX3BvaW50PU5hTn0scG9pbnQ6ZnVuY3Rpb24odCxuKXtzd2l0Y2godGhpcy5fcG9pbnQpe2Nhc2UgMDp0aGlzLl9jb250ZXh0Lm1vdmVUbyh0LG4pLHRoaXMuX3BvaW50PTE7YnJlYWs7Y2FzZSAxOnRoaXMuX2NvbnRleHQubGluZVRvKHQsbik7YnJlYWs7ZGVmYXVsdDp0aGlzLl9jb250ZXh0Lm1vdmVUbyh0K3RoaXMuX3JhZGl1cyxuKSx0aGlzLl9jb250ZXh0LmFyYyh0LG4sdGhpcy5fcmFkaXVzLDAsYmYpfX0scmVzdWx0OlVmfTt2YXIgTGgsamgsSGgsWGgsR2gsVmg9bmV3IEEsV2g9e3BvaW50OlVmLGxpbmVTdGFydDpmdW5jdGlvbigpe1doLnBvaW50PVpofSxsaW5lRW5kOmZ1bmN0aW9uKCl7TGgmJktoKGpoLEhoKSxXaC5wb2ludD1VZn0scG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7TGg9ITB9LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXtMaD1udWxsfSxyZXN1bHQ6ZnVuY3Rpb24oKXt2YXIgdD0rVmg7cmV0dXJuIFZoPW5ldyBBLHR9fTtmdW5jdGlvbiBaaCh0LG4pe1doLnBvaW50PUtoLGpoPVhoPXQsSGg9R2g9bn1mdW5jdGlvbiBLaCh0LG4pe1hoLT10LEdoLT1uLFZoLmFkZCgkZihYaCpYaCtHaCpHaCkpLFhoPXQsR2g9bn12YXIgUWg9V2g7bGV0IEpoLHRkLG5kLGVkO2NsYXNzIHJke2NvbnN0cnVjdG9yKHQpe3RoaXMuX2FwcGVuZD1udWxsPT10P2lkOmZ1bmN0aW9uKHQpe2NvbnN0IG49TWF0aC5mbG9vcih0KTtpZighKG4+PTApKXRocm93IG5ldyBSYW5nZUVycm9yKGBpbnZhbGlkIGRpZ2l0czogJHt0fWApO2lmKG4+MTUpcmV0dXJuIGlkO2lmKG4hPT1KaCl7Y29uc3QgdD0xMCoqbjtKaD1uLHRkPWZ1bmN0aW9uKG4pe2xldCBlPTE7dGhpcy5fKz1uWzBdO2Zvcihjb25zdCByPW4ubGVuZ3RoO2U8cjsrK2UpdGhpcy5fKz1NYXRoLnJvdW5kKGFyZ3VtZW50c1tlXSp0KS90K25bZV19fXJldHVybiB0ZH0odCksdGhpcy5fcmFkaXVzPTQuNSx0aGlzLl89IiJ9cG9pbnRSYWRpdXModCl7cmV0dXJuIHRoaXMuX3JhZGl1cz0rdCx0aGlzfXBvbHlnb25TdGFydCgpe3RoaXMuX2xpbmU9MH1wb2x5Z29uRW5kKCl7dGhpcy5fbGluZT1OYU59bGluZVN0YXJ0KCl7dGhpcy5fcG9pbnQ9MH1saW5lRW5kKCl7MD09PXRoaXMuX2xpbmUmJih0aGlzLl8rPSJaIiksdGhpcy5fcG9pbnQ9TmFOfXBvaW50KHQsbil7c3dpdGNoKHRoaXMuX3BvaW50KXtjYXNlIDA6dGhpcy5fYXBwZW5kYE0ke3R9LCR7bn1gLHRoaXMuX3BvaW50PTE7YnJlYWs7Y2FzZSAxOnRoaXMuX2FwcGVuZGBMJHt0fSwke259YDticmVhaztkZWZhdWx0OmlmKHRoaXMuX2FwcGVuZGBNJHt0fSwke259YCx0aGlzLl9yYWRpdXMhPT1uZHx8dGhpcy5fYXBwZW5kIT09dGQpe2NvbnN0IHQ9dGhpcy5fcmFkaXVzLG49dGhpcy5fO3RoaXMuXz0iIix0aGlzLl9hcHBlbmRgbTAsJHt0fWEke3R9LCR7dH0gMCAxLDEgMCwkey0yKnR9YSR7dH0sJHt0fSAwIDEsMSAwLCR7Mip0fXpgLG5kPXQsdGQ9dGhpcy5fYXBwZW5kLGVkPXRoaXMuXyx0aGlzLl89bn10aGlzLl8rPWVkfX1yZXN1bHQoKXtjb25zdCB0PXRoaXMuXztyZXR1cm4gdGhpcy5fPSIiLHQubGVuZ3RoP3Q6bnVsbH19ZnVuY3Rpb24gaWQodCl7bGV0IG49MTt0aGlzLl8rPXRbMF07Zm9yKGNvbnN0IGU9dC5sZW5ndGg7bjxlOysrbil0aGlzLl8rPWFyZ3VtZW50c1tuXSt0W25dfWZ1bmN0aW9uIG9kKHQpe3JldHVybiBmdW5jdGlvbihuKXt2YXIgZT1uZXcgYWQ7Zm9yKHZhciByIGluIHQpZVtyXT10W3JdO3JldHVybiBlLnN0cmVhbT1uLGV9fWZ1bmN0aW9uIGFkKCl7fWZ1bmN0aW9uIHVkKHQsbixlKXt2YXIgcj10LmNsaXBFeHRlbnQmJnQuY2xpcEV4dGVudCgpO3JldHVybiB0LnNjYWxlKDE1MCkudHJhbnNsYXRlKFswLDBdKSxudWxsIT1yJiZ0LmNsaXBFeHRlbnQobnVsbCksamYoZSx0LnN0cmVhbSh4aCkpLG4oeGgucmVzdWx0KCkpLG51bGwhPXImJnQuY2xpcEV4dGVudChyKSx0fWZ1bmN0aW9uIGNkKHQsbixlKXtyZXR1cm4gdWQodCwoZnVuY3Rpb24oZSl7dmFyIHI9blsxXVswXS1uWzBdWzBdLGk9blsxXVsxXS1uWzBdWzFdLG89TWF0aC5taW4oci8oZVsxXVswXS1lWzBdWzBdKSxpLyhlWzFdWzFdLWVbMF1bMV0pKSxhPStuWzBdWzBdKyhyLW8qKGVbMV1bMF0rZVswXVswXSkpLzIsdT0rblswXVsxXSsoaS1vKihlWzFdWzFdK2VbMF1bMV0pKS8yO3Quc2NhbGUoMTUwKm8pLnRyYW5zbGF0ZShbYSx1XSl9KSxlKX1mdW5jdGlvbiBmZCh0LG4sZSl7cmV0dXJuIGNkKHQsW1swLDBdLG5dLGUpfWZ1bmN0aW9uIHNkKHQsbixlKXtyZXR1cm4gdWQodCwoZnVuY3Rpb24oZSl7dmFyIHI9K24saT1yLyhlWzFdWzBdLWVbMF1bMF0pLG89KHItaSooZVsxXVswXStlWzBdWzBdKSkvMixhPS1pKmVbMF1bMV07dC5zY2FsZSgxNTAqaSkudHJhbnNsYXRlKFtvLGFdKX0pLGUpfWZ1bmN0aW9uIGxkKHQsbixlKXtyZXR1cm4gdWQodCwoZnVuY3Rpb24oZSl7dmFyIHI9K24saT1yLyhlWzFdWzFdLWVbMF1bMV0pLG89LWkqZVswXVswXSxhPShyLWkqKGVbMV1bMV0rZVswXVsxXSkpLzI7dC5zY2FsZSgxNTAqaSkudHJhbnNsYXRlKFtvLGFdKX0pLGUpfWFkLnByb3RvdHlwZT17Y29uc3RydWN0b3I6YWQscG9pbnQ6ZnVuY3Rpb24odCxuKXt0aGlzLnN0cmVhbS5wb2ludCh0LG4pfSxzcGhlcmU6ZnVuY3Rpb24oKXt0aGlzLnN0cmVhbS5zcGhlcmUoKX0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5zdHJlYW0ubGluZVN0YXJ0KCl9LGxpbmVFbmQ6ZnVuY3Rpb24oKXt0aGlzLnN0cmVhbS5saW5lRW5kKCl9LHBvbHlnb25TdGFydDpmdW5jdGlvbigpe3RoaXMuc3RyZWFtLnBvbHlnb25TdGFydCgpfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7dGhpcy5zdHJlYW0ucG9seWdvbkVuZCgpfX07dmFyIGhkPTE2LGRkPUFmKDMwKnhmKTtmdW5jdGlvbiBwZCh0LG4pe3JldHVybituP2Z1bmN0aW9uKHQsbil7ZnVuY3Rpb24gZShyLGksbyxhLHUsYyxmLHMsbCxoLGQscCxnLHkpe3ZhciB2PWYtcixfPXMtaSxiPXYqditfKl87aWYoYj40Km4mJmctLSl7dmFyIG09YStoLHg9dStkLHc9YytwLE09JGYobSptK3gqeCt3KncpLFQ9RmYody89TSksQT13Zih3Zih3KS0xKTxwZnx8d2Yoby1sKTxwZj8obytsKS8yOlRmKHgsbSksUz10KEEsVCksRT1TWzBdLE49U1sxXSxrPUUtcixDPU4taSxQPV8qay12KkM7KFAqUC9iPm58fHdmKCh2KmsrXypDKS9iLS41KT4uM3x8YSpoK3UqZCtjKnA8ZGQpJiYoZShyLGksbyxhLHUsYyxFLE4sQSxtLz1NLHgvPU0sdyxnLHkpLHkucG9pbnQoRSxOKSxlKEUsTixBLG0seCx3LGYscyxsLGgsZCxwLGcseSkpfX1yZXR1cm4gZnVuY3Rpb24obil7dmFyIHIsaSxvLGEsdSxjLGYscyxsLGgsZCxwLGc9e3BvaW50OnksbGluZVN0YXJ0OnYsbGluZUVuZDpiLHBvbHlnb25TdGFydDpmdW5jdGlvbigpe24ucG9seWdvblN0YXJ0KCksZy5saW5lU3RhcnQ9bX0scG9seWdvbkVuZDpmdW5jdGlvbigpe24ucG9seWdvbkVuZCgpLGcubGluZVN0YXJ0PXZ9fTtmdW5jdGlvbiB5KGUscil7ZT10KGUsciksbi5wb2ludChlWzBdLGVbMV0pfWZ1bmN0aW9uIHYoKXtzPU5hTixnLnBvaW50PV8sbi5saW5lU3RhcnQoKX1mdW5jdGlvbiBfKHIsaSl7dmFyIG89Z3MoW3IsaV0pLGE9dChyLGkpO2UocyxsLGYsaCxkLHAscz1hWzBdLGw9YVsxXSxmPXIsaD1vWzBdLGQ9b1sxXSxwPW9bMl0saGQsbiksbi5wb2ludChzLGwpfWZ1bmN0aW9uIGIoKXtnLnBvaW50PXksbi5saW5lRW5kKCl9ZnVuY3Rpb24gbSgpe3YoKSxnLnBvaW50PXgsZy5saW5lRW5kPXd9ZnVuY3Rpb24geCh0LG4pe18ocj10LG4pLGk9cyxvPWwsYT1oLHU9ZCxjPXAsZy5wb2ludD1ffWZ1bmN0aW9uIHcoKXtlKHMsbCxmLGgsZCxwLGksbyxyLGEsdSxjLGhkLG4pLGcubGluZUVuZD1iLGIoKX1yZXR1cm4gZ319KHQsbik6ZnVuY3Rpb24odCl7cmV0dXJuIG9kKHtwb2ludDpmdW5jdGlvbihuLGUpe249dChuLGUpLHRoaXMuc3RyZWFtLnBvaW50KG5bMF0sblsxXSl9fSl9KHQpfXZhciBnZD1vZCh7cG9pbnQ6ZnVuY3Rpb24odCxuKXt0aGlzLnN0cmVhbS5wb2ludCh0KnhmLG4qeGYpfX0pO2Z1bmN0aW9uIHlkKHQsbixlLHIsaSxvKXtpZighbylyZXR1cm4gZnVuY3Rpb24odCxuLGUscixpKXtmdW5jdGlvbiBvKG8sYSl7cmV0dXJuW24rdCoobyo9ciksZS10KihhKj1pKV19cmV0dXJuIG8uaW52ZXJ0PWZ1bmN0aW9uKG8sYSl7cmV0dXJuWyhvLW4pL3QqciwoZS1hKS90KmldfSxvfSh0LG4sZSxyLGkpO3ZhciBhPUFmKG8pLHU9UGYobyksYz1hKnQsZj11KnQscz1hL3QsbD11L3QsaD0odSplLWEqbikvdCxkPSh1Km4rYSplKS90O2Z1bmN0aW9uIHAodCxvKXtyZXR1cm5bYyoodCo9ciktZioobyo9aSkrbixlLWYqdC1jKm9dfXJldHVybiBwLmludmVydD1mdW5jdGlvbih0LG4pe3JldHVybltyKihzKnQtbCpuK2gpLGkqKGQtbCp0LXMqbildfSxwfWZ1bmN0aW9uIHZkKHQpe3JldHVybiBfZCgoZnVuY3Rpb24oKXtyZXR1cm4gdH0pKSgpfWZ1bmN0aW9uIF9kKHQpe3ZhciBuLGUscixpLG8sYSx1LGMsZixzLGw9MTUwLGg9NDgwLGQ9MjUwLHA9MCxnPTAseT0wLHY9MCxfPTAsYj0wLG09MSx4PTEsdz1udWxsLE09QWwsVD1udWxsLEE9cmgsUz0uNTtmdW5jdGlvbiBFKHQpe3JldHVybiBjKHRbMF0qeGYsdFsxXSp4Zil9ZnVuY3Rpb24gTih0KXtyZXR1cm4odD1jLmludmVydCh0WzBdLHRbMV0pKSYmW3RbMF0qbWYsdFsxXSptZl19ZnVuY3Rpb24gaygpe3ZhciB0PXlkKGwsMCwwLG0seCxiKS5hcHBseShudWxsLG4ocCxnKSkscj15ZChsLGgtdFswXSxkLXRbMV0sbSx4LGIpO3JldHVybiBlPWNsKHksdixfKSx1PWFsKG4sciksYz1hbChlLHUpLGE9cGQodSxTKSxDKCl9ZnVuY3Rpb24gQygpe3JldHVybiBmPXM9bnVsbCxFfXJldHVybiBFLnN0cmVhbT1mdW5jdGlvbih0KXtyZXR1cm4gZiYmcz09PXQ/ZjpmPWdkKGZ1bmN0aW9uKHQpe3JldHVybiBvZCh7cG9pbnQ6ZnVuY3Rpb24obixlKXt2YXIgcj10KG4sZSk7cmV0dXJuIHRoaXMuc3RyZWFtLnBvaW50KHJbMF0sclsxXSl9fSl9KGUpKE0oYShBKHM9dCkpKSkpfSxFLnByZWNsaXA9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KE09dCx3PXZvaWQgMCxDKCkpOk19LEUucG9zdGNsaXA9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KEE9dCxUPXI9aT1vPW51bGwsQygpKTpBfSxFLmNsaXBBbmdsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oTT0rdD9TbCh3PXQqeGYpOih3PW51bGwsQWwpLEMoKSk6dyptZn0sRS5jbGlwRXh0ZW50PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhBPW51bGw9PXQ/KFQ9cj1pPW89bnVsbCxyaCk6JGwoVD0rdFswXVswXSxyPSt0WzBdWzFdLGk9K3RbMV1bMF0sbz0rdFsxXVsxXSksQygpKTpudWxsPT1UP251bGw6W1tULHJdLFtpLG9dXX0sRS5zY2FsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obD0rdCxrKCkpOmx9LEUudHJhbnNsYXRlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhoPSt0WzBdLGQ9K3RbMV0saygpKTpbaCxkXX0sRS5jZW50ZXI9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHA9dFswXSUzNjAqeGYsZz10WzFdJTM2MCp4ZixrKCkpOltwKm1mLGcqbWZdfSxFLnJvdGF0ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oeT10WzBdJTM2MCp4Zix2PXRbMV0lMzYwKnhmLF89dC5sZW5ndGg+Mj90WzJdJTM2MCp4ZjowLGsoKSk6W3kqbWYsdiptZixfKm1mXX0sRS5hbmdsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYj10JTM2MCp4ZixrKCkpOmIqbWZ9LEUucmVmbGVjdFg9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG09dD8tMToxLGsoKSk6bTwwfSxFLnJlZmxlY3RZPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh4PXQ/LTE6MSxrKCkpOng8MH0sRS5wcmVjaXNpb249ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9cGQodSxTPXQqdCksQygpKTokZihTKX0sRS5maXRFeHRlbnQ9ZnVuY3Rpb24odCxuKXtyZXR1cm4gY2QoRSx0LG4pfSxFLmZpdFNpemU9ZnVuY3Rpb24odCxuKXtyZXR1cm4gZmQoRSx0LG4pfSxFLmZpdFdpZHRoPWZ1bmN0aW9uKHQsbil7cmV0dXJuIHNkKEUsdCxuKX0sRS5maXRIZWlnaHQ9ZnVuY3Rpb24odCxuKXtyZXR1cm4gbGQoRSx0LG4pfSxmdW5jdGlvbigpe3JldHVybiBuPXQuYXBwbHkodGhpcyxhcmd1bWVudHMpLEUuaW52ZXJ0PW4uaW52ZXJ0JiZOLGsoKX19ZnVuY3Rpb24gYmQodCl7dmFyIG49MCxlPXlmLzMscj1fZCh0KSxpPXIobixlKTtyZXR1cm4gaS5wYXJhbGxlbHM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/cihuPXRbMF0qeGYsZT10WzFdKnhmKTpbbiptZixlKm1mXX0saX1mdW5jdGlvbiBtZCh0LG4pe3ZhciBlPVBmKHQpLHI9KGUrUGYobikpLzI7aWYod2Yocik8cGYpcmV0dXJuIGZ1bmN0aW9uKHQpe3ZhciBuPUFmKHQpO2Z1bmN0aW9uIGUodCxlKXtyZXR1cm5bdCpuLFBmKGUpL25dfXJldHVybiBlLmludmVydD1mdW5jdGlvbih0LGUpe3JldHVyblt0L24sRmYoZSpuKV19LGV9KHQpO3ZhciBpPTErZSooMipyLWUpLG89JGYoaSkvcjtmdW5jdGlvbiBhKHQsbil7dmFyIGU9JGYoaS0yKnIqUGYobikpL3I7cmV0dXJuW2UqUGYodCo9ciksby1lKkFmKHQpXX1yZXR1cm4gYS5pbnZlcnQ9ZnVuY3Rpb24odCxuKXt2YXIgZT1vLW4sYT1UZih0LHdmKGUpKSp6ZihlKTtyZXR1cm4gZSpyPDAmJihhLT15Zip6Zih0KSp6ZihlKSksW2EvcixGZigoaS0odCp0K2UqZSkqcipyKS8oMipyKSldfSxhfWZ1bmN0aW9uIHhkKCl7cmV0dXJuIGJkKG1kKS5zY2FsZSgxNTUuNDI0KS5jZW50ZXIoWzAsMzMuNjQ0Ml0pfWZ1bmN0aW9uIHdkKCl7cmV0dXJuIHhkKCkucGFyYWxsZWxzKFsyOS41LDQ1LjVdKS5zY2FsZSgxMDcwKS50cmFuc2xhdGUoWzQ4MCwyNTBdKS5yb3RhdGUoWzk2LDBdKS5jZW50ZXIoWy0uNiwzOC43XSl9ZnVuY3Rpb24gTWQodCl7cmV0dXJuIGZ1bmN0aW9uKG4sZSl7dmFyIHI9QWYobiksaT1BZihlKSxvPXQocippKTtyZXR1cm4gbz09PTEvMD9bMiwwXTpbbyppKlBmKG4pLG8qUGYoZSldfX1mdW5jdGlvbiBUZCh0KXtyZXR1cm4gZnVuY3Rpb24obixlKXt2YXIgcj0kZihuKm4rZSplKSxpPXQociksbz1QZihpKSxhPUFmKGkpO3JldHVybltUZihuKm8sciphKSxGZihyJiZlKm8vcildfX12YXIgQWQ9TWQoKGZ1bmN0aW9uKHQpe3JldHVybiAkZigyLygxK3QpKX0pKTtBZC5pbnZlcnQ9VGQoKGZ1bmN0aW9uKHQpe3JldHVybiAyKkZmKHQvMil9KSk7dmFyIFNkPU1kKChmdW5jdGlvbih0KXtyZXR1cm4odD1SZih0KSkmJnQvUGYodCl9KSk7ZnVuY3Rpb24gRWQodCxuKXtyZXR1cm5bdCxrZihEZigodmYrbikvMikpXX1mdW5jdGlvbiBOZCh0KXt2YXIgbixlLHIsaT12ZCh0KSxvPWkuY2VudGVyLGE9aS5zY2FsZSx1PWkudHJhbnNsYXRlLGM9aS5jbGlwRXh0ZW50LGY9bnVsbDtmdW5jdGlvbiBzKCl7dmFyIG89eWYqYSgpLHU9aShobChpLnJvdGF0ZSgpKS5pbnZlcnQoWzAsMF0pKTtyZXR1cm4gYyhudWxsPT1mP1tbdVswXS1vLHVbMV0tb10sW3VbMF0rbyx1WzFdK29dXTp0PT09RWQ/W1tNYXRoLm1heCh1WzBdLW8sZiksbl0sW01hdGgubWluKHVbMF0rbyxlKSxyXV06W1tmLE1hdGgubWF4KHVbMV0tbyxuKV0sW2UsTWF0aC5taW4odVsxXStvLHIpXV0pfXJldHVybiBpLnNjYWxlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhKHQpLHMoKSk6YSgpfSxpLnRyYW5zbGF0ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odSh0KSxzKCkpOnUoKX0saS5jZW50ZXI9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG8odCkscygpKTpvKCl9LGkuY2xpcEV4dGVudD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obnVsbD09dD9mPW49ZT1yPW51bGw6KGY9K3RbMF1bMF0sbj0rdFswXVsxXSxlPSt0WzFdWzBdLHI9K3RbMV1bMV0pLHMoKSk6bnVsbD09Zj9udWxsOltbZixuXSxbZSxyXV19LHMoKX1mdW5jdGlvbiBrZCh0KXtyZXR1cm4gRGYoKHZmK3QpLzIpfWZ1bmN0aW9uIENkKHQsbil7dmFyIGU9QWYodCkscj10PT09bj9QZih0KTprZihlL0FmKG4pKS9rZihrZChuKS9rZCh0KSksaT1lKkNmKGtkKHQpLHIpL3I7aWYoIXIpcmV0dXJuIEVkO2Z1bmN0aW9uIG8odCxuKXtpPjA/bjwtdmYrcGYmJihuPS12ZitwZik6bj52Zi1wZiYmKG49dmYtcGYpO3ZhciBlPWkvQ2Yoa2Qobikscik7cmV0dXJuW2UqUGYocip0KSxpLWUqQWYocip0KV19cmV0dXJuIG8uaW52ZXJ0PWZ1bmN0aW9uKHQsbil7dmFyIGU9aS1uLG89emYocikqJGYodCp0K2UqZSksYT1UZih0LHdmKGUpKSp6ZihlKTtyZXR1cm4gZSpyPDAmJihhLT15Zip6Zih0KSp6ZihlKSksW2EvciwyKk1mKENmKGkvbywxL3IpKS12Zl19LG99ZnVuY3Rpb24gUGQodCxuKXtyZXR1cm5bdCxuXX1mdW5jdGlvbiB6ZCh0LG4pe3ZhciBlPUFmKHQpLHI9dD09PW4/UGYodCk6KGUtQWYobikpLyhuLXQpLGk9ZS9yK3Q7aWYod2Yocik8cGYpcmV0dXJuIFBkO2Z1bmN0aW9uIG8odCxuKXt2YXIgZT1pLW4sbz1yKnQ7cmV0dXJuW2UqUGYobyksaS1lKkFmKG8pXX1yZXR1cm4gby5pbnZlcnQ9ZnVuY3Rpb24odCxuKXt2YXIgZT1pLW4sbz1UZih0LHdmKGUpKSp6ZihlKTtyZXR1cm4gZSpyPDAmJihvLT15Zip6Zih0KSp6ZihlKSksW28vcixpLXpmKHIpKiRmKHQqdCtlKmUpXX0sb31TZC5pbnZlcnQ9VGQoKGZ1bmN0aW9uKHQpe3JldHVybiB0fSkpLEVkLmludmVydD1mdW5jdGlvbih0LG4pe3JldHVyblt0LDIqTWYoRWYobikpLXZmXX0sUGQuaW52ZXJ0PVBkO3ZhciAkZD0xLjM0MDI2NCxEZD0tLjA4MTEwNixSZD04OTNlLTYsRmQ9LjAwMzc5NixxZD0kZigzKS8yO2Z1bmN0aW9uIFVkKHQsbil7dmFyIGU9RmYocWQqUGYobikpLHI9ZSplLGk9cipyKnI7cmV0dXJuW3QqQWYoZSkvKHFkKigkZCszKkRkKnIraSooNypSZCs5KkZkKnIpKSksZSooJGQrRGQqcitpKihSZCtGZCpyKSldfWZ1bmN0aW9uIElkKHQsbil7dmFyIGU9QWYobikscj1BZih0KSplO3JldHVybltlKlBmKHQpL3IsUGYobikvcl19ZnVuY3Rpb24gT2QodCxuKXt2YXIgZT1uKm4scj1lKmU7cmV0dXJuW3QqKC44NzA3LS4xMzE5NzkqZStyKihyKiguMDAzOTcxKmUtLjAwMTUyOSpyKS0uMDEzNzkxKSksbiooMS4wMDcyMjYrZSooLjAxNTA4NStyKiguMDI4ODc0KmUtLjA0NDQ3NS0uMDA1OTE2KnIpKSldfWZ1bmN0aW9uIEJkKHQsbil7cmV0dXJuW0FmKG4pKlBmKHQpLFBmKG4pXX1mdW5jdGlvbiBZZCh0LG4pe3ZhciBlPUFmKG4pLHI9MStBZih0KSplO3JldHVybltlKlBmKHQpL3IsUGYobikvcl19ZnVuY3Rpb24gTGQodCxuKXtyZXR1cm5ba2YoRGYoKHZmK24pLzIpKSwtdF19ZnVuY3Rpb24gamQodCxuKXtyZXR1cm4gdC5wYXJlbnQ9PT1uLnBhcmVudD8xOjJ9ZnVuY3Rpb24gSGQodCxuKXtyZXR1cm4gdCtuLnh9ZnVuY3Rpb24gWGQodCxuKXtyZXR1cm4gTWF0aC5tYXgodCxuLnkpfWZ1bmN0aW9uIEdkKHQpe3ZhciBuPTAsZT10LmNoaWxkcmVuLHI9ZSYmZS5sZW5ndGg7aWYocilmb3IoOy0tcj49MDspbis9ZVtyXS52YWx1ZTtlbHNlIG49MTt0LnZhbHVlPW59ZnVuY3Rpb24gVmQodCxuKXt0IGluc3RhbmNlb2YgTWFwPyh0PVt2b2lkIDAsdF0sdm9pZCAwPT09biYmKG49WmQpKTp2b2lkIDA9PT1uJiYobj1XZCk7Zm9yKHZhciBlLHIsaSxvLGEsdT1uZXcgSmQodCksYz1bdV07ZT1jLnBvcCgpOylpZigoaT1uKGUuZGF0YSkpJiYoYT0oaT1BcnJheS5mcm9tKGkpKS5sZW5ndGgpKWZvcihlLmNoaWxkcmVuPWksbz1hLTE7bz49MDstLW8pYy5wdXNoKHI9aVtvXT1uZXcgSmQoaVtvXSkpLHIucGFyZW50PWUsci5kZXB0aD1lLmRlcHRoKzE7cmV0dXJuIHUuZWFjaEJlZm9yZShRZCl9ZnVuY3Rpb24gV2QodCl7cmV0dXJuIHQuY2hpbGRyZW59ZnVuY3Rpb24gWmQodCl7cmV0dXJuIEFycmF5LmlzQXJyYXkodCk/dFsxXTpudWxsfWZ1bmN0aW9uIEtkKHQpe3ZvaWQgMCE9PXQuZGF0YS52YWx1ZSYmKHQudmFsdWU9dC5kYXRhLnZhbHVlKSx0LmRhdGE9dC5kYXRhLmRhdGF9ZnVuY3Rpb24gUWQodCl7dmFyIG49MDtkb3t0LmhlaWdodD1ufXdoaWxlKCh0PXQucGFyZW50KSYmdC5oZWlnaHQ8KytuKX1mdW5jdGlvbiBKZCh0KXt0aGlzLmRhdGE9dCx0aGlzLmRlcHRoPXRoaXMuaGVpZ2h0PTAsdGhpcy5wYXJlbnQ9bnVsbH1mdW5jdGlvbiB0cCh0KXtyZXR1cm4gbnVsbD09dD9udWxsOm5wKHQpfWZ1bmN0aW9uIG5wKHQpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0KXRocm93IG5ldyBFcnJvcjtyZXR1cm4gdH1mdW5jdGlvbiBlcCgpe3JldHVybiAwfWZ1bmN0aW9uIHJwKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0fX1VZC5pbnZlcnQ9ZnVuY3Rpb24odCxuKXtmb3IodmFyIGUscj1uLGk9cipyLG89aSppKmksYT0wO2E8MTImJihvPShpPShyLT1lPShyKigkZCtEZCppK28qKFJkK0ZkKmkpKS1uKS8oJGQrMypEZCppK28qKDcqUmQrOSpGZCppKSkpKnIpKmkqaSwhKHdmKGUpPGdmKSk7KythKTtyZXR1cm5bcWQqdCooJGQrMypEZCppK28qKDcqUmQrOSpGZCppKSkvQWYociksRmYoUGYocikvcWQpXX0sSWQuaW52ZXJ0PVRkKE1mKSxPZC5pbnZlcnQ9ZnVuY3Rpb24odCxuKXt2YXIgZSxyPW4saT0yNTtkb3t2YXIgbz1yKnIsYT1vKm87ci09ZT0ociooMS4wMDcyMjYrbyooLjAxNTA4NSthKiguMDI4ODc0Km8tLjA0NDQ3NS0uMDA1OTE2KmEpKSktbikvKDEuMDA3MjI2K28qKC4wNDUyNTUrYSooLjI1OTg2NipvLS4zMTEzMjUtLjAwNTkxNioxMSphKSkpfXdoaWxlKHdmKGUpPnBmJiYtLWk+MCk7cmV0dXJuW3QvKC44NzA3KyhvPXIqcikqKG8qKG8qbypvKiguMDAzOTcxLS4wMDE1MjkqbyktLjAxMzc5MSktLjEzMTk3OSkpLHJdfSxCZC5pbnZlcnQ9VGQoRmYpLFlkLmludmVydD1UZCgoZnVuY3Rpb24odCl7cmV0dXJuIDIqTWYodCl9KSksTGQuaW52ZXJ0PWZ1bmN0aW9uKHQsbil7cmV0dXJuWy1uLDIqTWYoRWYodCkpLXZmXX0sSmQucHJvdG90eXBlPVZkLnByb3RvdHlwZT17Y29uc3RydWN0b3I6SmQsY291bnQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lYWNoQWZ0ZXIoR2QpfSxlYWNoOmZ1bmN0aW9uKHQsbil7bGV0IGU9LTE7Zm9yKGNvbnN0IHIgb2YgdGhpcyl0LmNhbGwobixyLCsrZSx0aGlzKTtyZXR1cm4gdGhpc30sZWFjaEFmdGVyOmZ1bmN0aW9uKHQsbil7Zm9yKHZhciBlLHIsaSxvPXRoaXMsYT1bb10sdT1bXSxjPS0xO289YS5wb3AoKTspaWYodS5wdXNoKG8pLGU9by5jaGlsZHJlbilmb3Iocj0wLGk9ZS5sZW5ndGg7cjxpOysrcilhLnB1c2goZVtyXSk7Zm9yKDtvPXUucG9wKCk7KXQuY2FsbChuLG8sKytjLHRoaXMpO3JldHVybiB0aGlzfSxlYWNoQmVmb3JlOmZ1bmN0aW9uKHQsbil7Zm9yKHZhciBlLHIsaT10aGlzLG89W2ldLGE9LTE7aT1vLnBvcCgpOylpZih0LmNhbGwobixpLCsrYSx0aGlzKSxlPWkuY2hpbGRyZW4pZm9yKHI9ZS5sZW5ndGgtMTtyPj0wOy0tcilvLnB1c2goZVtyXSk7cmV0dXJuIHRoaXN9LGZpbmQ6ZnVuY3Rpb24odCxuKXtsZXQgZT0tMTtmb3IoY29uc3QgciBvZiB0aGlzKWlmKHQuY2FsbChuLHIsKytlLHRoaXMpKXJldHVybiByfSxzdW06ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZWFjaEFmdGVyKChmdW5jdGlvbihuKXtmb3IodmFyIGU9K3Qobi5kYXRhKXx8MCxyPW4uY2hpbGRyZW4saT1yJiZyLmxlbmd0aDstLWk+PTA7KWUrPXJbaV0udmFsdWU7bi52YWx1ZT1lfSkpfSxzb3J0OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmVhY2hCZWZvcmUoKGZ1bmN0aW9uKG4pe24uY2hpbGRyZW4mJm4uY2hpbGRyZW4uc29ydCh0KX0pKX0scGF0aDpmdW5jdGlvbih0KXtmb3IodmFyIG49dGhpcyxlPWZ1bmN0aW9uKHQsbil7aWYodD09PW4pcmV0dXJuIHQ7dmFyIGU9dC5hbmNlc3RvcnMoKSxyPW4uYW5jZXN0b3JzKCksaT1udWxsO3Q9ZS5wb3AoKSxuPXIucG9wKCk7Zm9yKDt0PT09bjspaT10LHQ9ZS5wb3AoKSxuPXIucG9wKCk7cmV0dXJuIGl9KG4sdCkscj1bbl07biE9PWU7KW49bi5wYXJlbnQsci5wdXNoKG4pO2Zvcih2YXIgaT1yLmxlbmd0aDt0IT09ZTspci5zcGxpY2UoaSwwLHQpLHQ9dC5wYXJlbnQ7cmV0dXJuIHJ9LGFuY2VzdG9yczpmdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLG49W3RdO3Q9dC5wYXJlbnQ7KW4ucHVzaCh0KTtyZXR1cm4gbn0sZGVzY2VuZGFudHM6ZnVuY3Rpb24oKXtyZXR1cm4gQXJyYXkuZnJvbSh0aGlzKX0sbGVhdmVzOmZ1bmN0aW9uKCl7dmFyIHQ9W107cmV0dXJuIHRoaXMuZWFjaEJlZm9yZSgoZnVuY3Rpb24obil7bi5jaGlsZHJlbnx8dC5wdXNoKG4pfSkpLHR9LGxpbmtzOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcyxuPVtdO3JldHVybiB0LmVhY2goKGZ1bmN0aW9uKGUpe2UhPT10JiZuLnB1c2goe3NvdXJjZTplLnBhcmVudCx0YXJnZXQ6ZX0pfSkpLG59LGNvcHk6ZnVuY3Rpb24oKXtyZXR1cm4gVmQodGhpcykuZWFjaEJlZm9yZShLZCl9LFtTeW1ib2wuaXRlcmF0b3JdOmZ1bmN0aW9uKigpe3ZhciB0LG4sZSxyLGk9dGhpcyxvPVtpXTtkb3tmb3IodD1vLnJldmVyc2UoKSxvPVtdO2k9dC5wb3AoKTspaWYoeWllbGQgaSxuPWkuY2hpbGRyZW4pZm9yKGU9MCxyPW4ubGVuZ3RoO2U8cjsrK2Upby5wdXNoKG5bZV0pfXdoaWxlKG8ubGVuZ3RoKX19O2NvbnN0IGlwPTE2NjQ1MjUsb3A9MTAxMzkwNDIyMyxhcD00Mjk0OTY3Mjk2O2Z1bmN0aW9uIHVwKCl7bGV0IHQ9MTtyZXR1cm4oKT0+KHQ9KGlwKnQrb3ApJWFwKS9hcH1mdW5jdGlvbiBjcCh0LG4pe2Zvcih2YXIgZSxyLGk9MCxvPSh0PWZ1bmN0aW9uKHQsbil7bGV0IGUscixpPXQubGVuZ3RoO2Zvcig7aTspcj1uKCkqaS0tfDAsZT10W2ldLHRbaV09dFtyXSx0W3JdPWU7cmV0dXJuIHR9KEFycmF5LmZyb20odCksbikpLmxlbmd0aCxhPVtdO2k8bzspZT10W2ldLHImJmxwKHIsZSk/KytpOihyPWRwKGE9ZnAoYSxlKSksaT0wKTtyZXR1cm4gcn1mdW5jdGlvbiBmcCh0LG4pe3ZhciBlLHI7aWYoaHAobix0KSlyZXR1cm5bbl07Zm9yKGU9MDtlPHQubGVuZ3RoOysrZSlpZihzcChuLHRbZV0pJiZocChwcCh0W2VdLG4pLHQpKXJldHVyblt0W2VdLG5dO2ZvcihlPTA7ZTx0Lmxlbmd0aC0xOysrZSlmb3Iocj1lKzE7cjx0Lmxlbmd0aDsrK3IpaWYoc3AocHAodFtlXSx0W3JdKSxuKSYmc3AocHAodFtlXSxuKSx0W3JdKSYmc3AocHAodFtyXSxuKSx0W2VdKSYmaHAoZ3AodFtlXSx0W3JdLG4pLHQpKXJldHVyblt0W2VdLHRbcl0sbl07dGhyb3cgbmV3IEVycm9yfWZ1bmN0aW9uIHNwKHQsbil7dmFyIGU9dC5yLW4ucixyPW4ueC10LngsaT1uLnktdC55O3JldHVybiBlPDB8fGUqZTxyKnIraSppfWZ1bmN0aW9uIGxwKHQsbil7dmFyIGU9dC5yLW4ucisxZS05Kk1hdGgubWF4KHQucixuLnIsMSkscj1uLngtdC54LGk9bi55LXQueTtyZXR1cm4gZT4wJiZlKmU+cipyK2kqaX1mdW5jdGlvbiBocCh0LG4pe2Zvcih2YXIgZT0wO2U8bi5sZW5ndGg7KytlKWlmKCFscCh0LG5bZV0pKXJldHVybiExO3JldHVybiEwfWZ1bmN0aW9uIGRwKHQpe3N3aXRjaCh0Lmxlbmd0aCl7Y2FzZSAxOnJldHVybiBmdW5jdGlvbih0KXtyZXR1cm57eDp0LngseTp0Lnkscjp0LnJ9fSh0WzBdKTtjYXNlIDI6cmV0dXJuIHBwKHRbMF0sdFsxXSk7Y2FzZSAzOnJldHVybiBncCh0WzBdLHRbMV0sdFsyXSl9fWZ1bmN0aW9uIHBwKHQsbil7dmFyIGU9dC54LHI9dC55LGk9dC5yLG89bi54LGE9bi55LHU9bi5yLGM9by1lLGY9YS1yLHM9dS1pLGw9TWF0aC5zcXJ0KGMqYytmKmYpO3JldHVybnt4OihlK28rYy9sKnMpLzIseToocithK2YvbCpzKS8yLHI6KGwraSt1KS8yfX1mdW5jdGlvbiBncCh0LG4sZSl7dmFyIHI9dC54LGk9dC55LG89dC5yLGE9bi54LHU9bi55LGM9bi5yLGY9ZS54LHM9ZS55LGw9ZS5yLGg9ci1hLGQ9ci1mLHA9aS11LGc9aS1zLHk9Yy1vLHY9bC1vLF89cipyK2kqaS1vKm8sYj1fLWEqYS11KnUrYypjLG09Xy1mKmYtcypzK2wqbCx4PWQqcC1oKmcsdz0ocCptLWcqYikvKDIqeCktcixNPShnKnktcCp2KS94LFQ9KGQqYi1oKm0pLygyKngpLWksQT0oaCp2LWQqeSkveCxTPU0qTStBKkEtMSxFPTIqKG8rdypNK1QqQSksTj13KncrVCpULW8qbyxrPS0oTWF0aC5hYnMoUyk+MWUtNj8oRStNYXRoLnNxcnQoRSpFLTQqUypOKSkvKDIqUyk6Ti9FKTtyZXR1cm57eDpyK3crTSprLHk6aStUK0EqayxyOmt9fWZ1bmN0aW9uIHlwKHQsbixlKXt2YXIgcixpLG8sYSx1PXQueC1uLngsYz10Lnktbi55LGY9dSp1K2MqYztmPyhpPW4ucitlLnIsaSo9aSxhPXQucitlLnIsaT4oYSo9YSk/KHI9KGYrYS1pKS8oMipmKSxvPU1hdGguc3FydChNYXRoLm1heCgwLGEvZi1yKnIpKSxlLng9dC54LXIqdS1vKmMsZS55PXQueS1yKmMrbyp1KToocj0oZitpLWEpLygyKmYpLG89TWF0aC5zcXJ0KE1hdGgubWF4KDAsaS9mLXIqcikpLGUueD1uLngrcip1LW8qYyxlLnk9bi55K3IqYytvKnUpKTooZS54PW4ueCtlLnIsZS55PW4ueSl9ZnVuY3Rpb24gdnAodCxuKXt2YXIgZT10LnIrbi5yLTFlLTYscj1uLngtdC54LGk9bi55LXQueTtyZXR1cm4gZT4wJiZlKmU+cipyK2kqaX1mdW5jdGlvbiBfcCh0KXt2YXIgbj10Ll8sZT10Lm5leHQuXyxyPW4ucitlLnIsaT0obi54KmUucitlLngqbi5yKS9yLG89KG4ueSplLnIrZS55Km4ucikvcjtyZXR1cm4gaSppK28qb31mdW5jdGlvbiBicCh0KXt0aGlzLl89dCx0aGlzLm5leHQ9bnVsbCx0aGlzLnByZXZpb3VzPW51bGx9ZnVuY3Rpb24gbXAodCxuKXtpZighKG89KHQ9ZnVuY3Rpb24odCl7cmV0dXJuIm9iamVjdCI9PXR5cGVvZiB0JiYibGVuZ3RoImluIHQ/dDpBcnJheS5mcm9tKHQpfSh0KSkubGVuZ3RoKSlyZXR1cm4gMDt2YXIgZSxyLGksbyxhLHUsYyxmLHMsbCxoO2lmKChlPXRbMF0pLng9MCxlLnk9MCwhKG8+MSkpcmV0dXJuIGUucjtpZihyPXRbMV0sZS54PS1yLnIsci54PWUucixyLnk9MCwhKG8+MikpcmV0dXJuIGUucityLnI7eXAocixlLGk9dFsyXSksZT1uZXcgYnAoZSkscj1uZXcgYnAociksaT1uZXcgYnAoaSksZS5uZXh0PWkucHJldmlvdXM9cixyLm5leHQ9ZS5wcmV2aW91cz1pLGkubmV4dD1yLnByZXZpb3VzPWU7dDpmb3IoYz0zO2M8bzsrK2Mpe3lwKGUuXyxyLl8saT10W2NdKSxpPW5ldyBicChpKSxmPXIubmV4dCxzPWUucHJldmlvdXMsbD1yLl8ucixoPWUuXy5yO2Rve2lmKGw8PWgpe2lmKHZwKGYuXyxpLl8pKXtyPWYsZS5uZXh0PXIsci5wcmV2aW91cz1lLC0tYztjb250aW51ZSB0fWwrPWYuXy5yLGY9Zi5uZXh0fWVsc2V7aWYodnAocy5fLGkuXykpeyhlPXMpLm5leHQ9cixyLnByZXZpb3VzPWUsLS1jO2NvbnRpbnVlIHR9aCs9cy5fLnIscz1zLnByZXZpb3VzfX13aGlsZShmIT09cy5uZXh0KTtmb3IoaS5wcmV2aW91cz1lLGkubmV4dD1yLGUubmV4dD1yLnByZXZpb3VzPXI9aSxhPV9wKGUpOyhpPWkubmV4dCkhPT1yOykodT1fcChpKSk8YSYmKGU9aSxhPXUpO3I9ZS5uZXh0fWZvcihlPVtyLl9dLGk9cjsoaT1pLm5leHQpIT09cjspZS5wdXNoKGkuXyk7Zm9yKGk9Y3AoZSxuKSxjPTA7YzxvOysrYykoZT10W2NdKS54LT1pLngsZS55LT1pLnk7cmV0dXJuIGkucn1mdW5jdGlvbiB4cCh0KXtyZXR1cm4gTWF0aC5zcXJ0KHQudmFsdWUpfWZ1bmN0aW9uIHdwKHQpe3JldHVybiBmdW5jdGlvbihuKXtuLmNoaWxkcmVufHwobi5yPU1hdGgubWF4KDAsK3Qobil8fDApKX19ZnVuY3Rpb24gTXAodCxuLGUpe3JldHVybiBmdW5jdGlvbihyKXtpZihpPXIuY2hpbGRyZW4pe3ZhciBpLG8sYSx1PWkubGVuZ3RoLGM9dChyKSpufHwwO2lmKGMpZm9yKG89MDtvPHU7KytvKWlbb10ucis9YztpZihhPW1wKGksZSksYylmb3Iobz0wO288dTsrK28paVtvXS5yLT1jO3Iucj1hK2N9fX1mdW5jdGlvbiBUcCh0KXtyZXR1cm4gZnVuY3Rpb24obil7dmFyIGU9bi5wYXJlbnQ7bi5yKj10LGUmJihuLng9ZS54K3Qqbi54LG4ueT1lLnkrdCpuLnkpfX1mdW5jdGlvbiBBcCh0KXt0LngwPU1hdGgucm91bmQodC54MCksdC55MD1NYXRoLnJvdW5kKHQueTApLHQueDE9TWF0aC5yb3VuZCh0LngxKSx0LnkxPU1hdGgucm91bmQodC55MSl9ZnVuY3Rpb24gU3AodCxuLGUscixpKXtmb3IodmFyIG8sYT10LmNoaWxkcmVuLHU9LTEsYz1hLmxlbmd0aCxmPXQudmFsdWUmJihyLW4pL3QudmFsdWU7Kyt1PGM7KShvPWFbdV0pLnkwPWUsby55MT1pLG8ueDA9bixvLngxPW4rPW8udmFsdWUqZn12YXIgRXA9e2RlcHRoOi0xfSxOcD17fSxrcD17fTtmdW5jdGlvbiBDcCh0KXtyZXR1cm4gdC5pZH1mdW5jdGlvbiBQcCh0KXtyZXR1cm4gdC5wYXJlbnRJZH1mdW5jdGlvbiB6cCh0KXtsZXQgbj10Lmxlbmd0aDtpZihuPDIpcmV0dXJuIiI7Zm9yKDstLW4+MSYmISRwKHQsbik7KTtyZXR1cm4gdC5zbGljZSgwLG4pfWZ1bmN0aW9uICRwKHQsbil7aWYoIi8iPT09dFtuXSl7bGV0IGU9MDtmb3IoO24+MCYmIlxcIj09PXRbLS1uXTspKytlO2lmKDA9PSgxJmUpKXJldHVybiEwfXJldHVybiExfWZ1bmN0aW9uIERwKHQsbil7cmV0dXJuIHQucGFyZW50PT09bi5wYXJlbnQ/MToyfWZ1bmN0aW9uIFJwKHQpe3ZhciBuPXQuY2hpbGRyZW47cmV0dXJuIG4/blswXTp0LnR9ZnVuY3Rpb24gRnAodCl7dmFyIG49dC5jaGlsZHJlbjtyZXR1cm4gbj9uW24ubGVuZ3RoLTFdOnQudH1mdW5jdGlvbiBxcCh0LG4sZSl7dmFyIHI9ZS8obi5pLXQuaSk7bi5jLT1yLG4ucys9ZSx0LmMrPXIsbi56Kz1lLG4ubSs9ZX1mdW5jdGlvbiBVcCh0LG4sZSl7cmV0dXJuIHQuYS5wYXJlbnQ9PT1uLnBhcmVudD90LmE6ZX1mdW5jdGlvbiBJcCh0LG4pe3RoaXMuXz10LHRoaXMucGFyZW50PW51bGwsdGhpcy5jaGlsZHJlbj1udWxsLHRoaXMuQT1udWxsLHRoaXMuYT10aGlzLHRoaXMuej0wLHRoaXMubT0wLHRoaXMuYz0wLHRoaXMucz0wLHRoaXMudD1udWxsLHRoaXMuaT1ufWZ1bmN0aW9uIE9wKHQsbixlLHIsaSl7Zm9yKHZhciBvLGE9dC5jaGlsZHJlbix1PS0xLGM9YS5sZW5ndGgsZj10LnZhbHVlJiYoaS1lKS90LnZhbHVlOysrdTxjOykobz1hW3VdKS54MD1uLG8ueDE9cixvLnkwPWUsby55MT1lKz1vLnZhbHVlKmZ9SXAucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoSmQucHJvdG90eXBlKTt2YXIgQnA9KDErTWF0aC5zcXJ0KDUpKS8yO2Z1bmN0aW9uIFlwKHQsbixlLHIsaSxvKXtmb3IodmFyIGEsdSxjLGYscyxsLGgsZCxwLGcseSx2PVtdLF89bi5jaGlsZHJlbixiPTAsbT0wLHg9Xy5sZW5ndGgsdz1uLnZhbHVlO2I8eDspe2M9aS1lLGY9by1yO2Rve3M9X1ttKytdLnZhbHVlfXdoaWxlKCFzJiZtPHgpO2ZvcihsPWg9cyx5PXMqcyooZz1NYXRoLm1heChmL2MsYy9mKS8odyp0KSkscD1NYXRoLm1heChoL3kseS9sKTttPHg7KyttKXtpZihzKz11PV9bbV0udmFsdWUsdTxsJiYobD11KSx1PmgmJihoPXUpLHk9cypzKmcsKGQ9TWF0aC5tYXgoaC95LHkvbCkpPnApe3MtPXU7YnJlYWt9cD1kfXYucHVzaChhPXt2YWx1ZTpzLGRpY2U6YzxmLGNoaWxkcmVuOl8uc2xpY2UoYixtKX0pLGEuZGljZT9TcChhLGUscixpLHc/cis9ZipzL3c6byk6T3AoYSxlLHIsdz9lKz1jKnMvdzppLG8pLHctPXMsYj1tfXJldHVybiB2fXZhciBMcD1mdW5jdGlvbiB0KG4pe2Z1bmN0aW9uIGUodCxlLHIsaSxvKXtZcChuLHQsZSxyLGksbyl9cmV0dXJuIGUucmF0aW89ZnVuY3Rpb24obil7cmV0dXJuIHQoKG49K24pPjE/bjoxKX0sZX0oQnApO3ZhciBqcD1mdW5jdGlvbiB0KG4pe2Z1bmN0aW9uIGUodCxlLHIsaSxvKXtpZigoYT10Ll9zcXVhcmlmeSkmJmEucmF0aW89PT1uKWZvcih2YXIgYSx1LGMsZixzLGw9LTEsaD1hLmxlbmd0aCxkPXQudmFsdWU7KytsPGg7KXtmb3IoYz0odT1hW2xdKS5jaGlsZHJlbixmPXUudmFsdWU9MCxzPWMubGVuZ3RoO2Y8czsrK2YpdS52YWx1ZSs9Y1tmXS52YWx1ZTt1LmRpY2U/U3AodSxlLHIsaSxkP3IrPShvLXIpKnUudmFsdWUvZDpvKTpPcCh1LGUscixkP2UrPShpLWUpKnUudmFsdWUvZDppLG8pLGQtPXUudmFsdWV9ZWxzZSB0Ll9zcXVhcmlmeT1hPVlwKG4sdCxlLHIsaSxvKSxhLnJhdGlvPW59cmV0dXJuIGUucmF0aW89ZnVuY3Rpb24obil7cmV0dXJuIHQoKG49K24pPjE/bjoxKX0sZX0oQnApO2Z1bmN0aW9uIEhwKHQsbixlKXtyZXR1cm4oblswXS10WzBdKSooZVsxXS10WzFdKS0oblsxXS10WzFdKSooZVswXS10WzBdKX1mdW5jdGlvbiBYcCh0LG4pe3JldHVybiB0WzBdLW5bMF18fHRbMV0tblsxXX1mdW5jdGlvbiBHcCh0KXtjb25zdCBuPXQubGVuZ3RoLGU9WzAsMV07bGV0IHIsaT0yO2ZvcihyPTI7cjxuOysrcil7Zm9yKDtpPjEmJkhwKHRbZVtpLTJdXSx0W2VbaS0xXV0sdFtyXSk8PTA7KS0taTtlW2krK109cn1yZXR1cm4gZS5zbGljZSgwLGkpfXZhciBWcD1NYXRoLnJhbmRvbSxXcD1mdW5jdGlvbiB0KG4pe2Z1bmN0aW9uIGUodCxlKXtyZXR1cm4gdD1udWxsPT10PzA6K3QsZT1udWxsPT1lPzE6K2UsMT09PWFyZ3VtZW50cy5sZW5ndGg/KGU9dCx0PTApOmUtPXQsZnVuY3Rpb24oKXtyZXR1cm4gbigpKmUrdH19cmV0dXJuIGUuc291cmNlPXQsZX0oVnApLFpwPWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0LGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPDImJihlPXQsdD0wKSx0PU1hdGguZmxvb3IodCksZT1NYXRoLmZsb29yKGUpLXQsZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5mbG9vcihuKCkqZSt0KX19cmV0dXJuIGUuc291cmNlPXQsZX0oVnApLEtwPWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0LGUpe3ZhciByLGk7cmV0dXJuIHQ9bnVsbD09dD8wOit0LGU9bnVsbD09ZT8xOitlLGZ1bmN0aW9uKCl7dmFyIG87aWYobnVsbCE9cilvPXIscj1udWxsO2Vsc2UgZG97cj0yKm4oKS0xLG89MipuKCktMSxpPXIqcitvKm99d2hpbGUoIWl8fGk+MSk7cmV0dXJuIHQrZSpvKk1hdGguc3FydCgtMipNYXRoLmxvZyhpKS9pKX19cmV0dXJuIGUuc291cmNlPXQsZX0oVnApLFFwPWZ1bmN0aW9uIHQobil7dmFyIGU9S3Auc291cmNlKG4pO2Z1bmN0aW9uIHIoKXt2YXIgdD1lLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5leHAodCgpKX19cmV0dXJuIHIuc291cmNlPXQscn0oVnApLEpwPWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0KXtyZXR1cm4odD0rdCk8PTA/KCk9PjA6ZnVuY3Rpb24oKXtmb3IodmFyIGU9MCxyPXQ7cj4xOy0tcillKz1uKCk7cmV0dXJuIGUrcipuKCl9fXJldHVybiBlLnNvdXJjZT10LGV9KFZwKSx0Zz1mdW5jdGlvbiB0KG4pe3ZhciBlPUpwLnNvdXJjZShuKTtmdW5jdGlvbiByKHQpe2lmKDA9PSh0PSt0KSlyZXR1cm4gbjt2YXIgcj1lKHQpO3JldHVybiBmdW5jdGlvbigpe3JldHVybiByKCkvdH19cmV0dXJuIHIuc291cmNlPXQscn0oVnApLG5nPWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4tTWF0aC5sb2cxcCgtbigpKS90fX1yZXR1cm4gZS5zb3VyY2U9dCxlfShWcCksZWc9ZnVuY3Rpb24gdChuKXtmdW5jdGlvbiBlKHQpe2lmKCh0PSt0KTwwKXRocm93IG5ldyBSYW5nZUVycm9yKCJpbnZhbGlkIGFscGhhIik7cmV0dXJuIHQ9MS8tdCxmdW5jdGlvbigpe3JldHVybiBNYXRoLnBvdygxLW4oKSx0KX19cmV0dXJuIGUuc291cmNlPXQsZX0oVnApLHJnPWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0KXtpZigodD0rdCk8MHx8dD4xKXRocm93IG5ldyBSYW5nZUVycm9yKCJpbnZhbGlkIHAiKTtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5mbG9vcihuKCkrdCl9fXJldHVybiBlLnNvdXJjZT10LGV9KFZwKSxpZz1mdW5jdGlvbiB0KG4pe2Z1bmN0aW9uIGUodCl7aWYoKHQ9K3QpPDB8fHQ+MSl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiaW52YWxpZCBwIik7cmV0dXJuIDA9PT10PygpPT4xLzA6MT09PXQ/KCk9PjE6KHQ9TWF0aC5sb2cxcCgtdCksZnVuY3Rpb24oKXtyZXR1cm4gMStNYXRoLmZsb29yKE1hdGgubG9nMXAoLW4oKSkvdCl9KX1yZXR1cm4gZS5zb3VyY2U9dCxlfShWcCksb2c9ZnVuY3Rpb24gdChuKXt2YXIgZT1LcC5zb3VyY2UobikoKTtmdW5jdGlvbiByKHQscil7aWYoKHQ9K3QpPDApdGhyb3cgbmV3IFJhbmdlRXJyb3IoImludmFsaWQgayIpO2lmKDA9PT10KXJldHVybigpPT4wO2lmKHI9bnVsbD09cj8xOityLDE9PT10KXJldHVybigpPT4tTWF0aC5sb2cxcCgtbigpKSpyO3ZhciBpPSh0PDE/dCsxOnQpLTEvMyxvPTEvKDMqTWF0aC5zcXJ0KGkpKSxhPXQ8MT8oKT0+TWF0aC5wb3cobigpLDEvdCk6KCk9PjE7cmV0dXJuIGZ1bmN0aW9uKCl7ZG97ZG97dmFyIHQ9ZSgpLHU9MStvKnR9d2hpbGUodTw9MCk7dSo9dSp1O3ZhciBjPTEtbigpfXdoaWxlKGM+PTEtLjAzMzEqdCp0KnQqdCYmTWF0aC5sb2coYyk+PS41KnQqdCtpKigxLXUrTWF0aC5sb2codSkpKTtyZXR1cm4gaSp1KmEoKSpyfX1yZXR1cm4gci5zb3VyY2U9dCxyfShWcCksYWc9ZnVuY3Rpb24gdChuKXt2YXIgZT1vZy5zb3VyY2Uobik7ZnVuY3Rpb24gcih0LG4pe3ZhciByPWUodCksaT1lKG4pO3JldHVybiBmdW5jdGlvbigpe3ZhciB0PXIoKTtyZXR1cm4gMD09PXQ/MDp0Lyh0K2koKSl9fXJldHVybiByLnNvdXJjZT10LHJ9KFZwKSx1Zz1mdW5jdGlvbiB0KG4pe3ZhciBlPWlnLnNvdXJjZShuKSxyPWFnLnNvdXJjZShuKTtmdW5jdGlvbiBpKHQsbil7cmV0dXJuIHQ9K3QsKG49K24pPj0xPygpPT50Om48PTA/KCk9PjA6ZnVuY3Rpb24oKXtmb3IodmFyIGk9MCxvPXQsYT1uO28qYT4xNiYmbyooMS1hKT4xNjspe3ZhciB1PU1hdGguZmxvb3IoKG8rMSkqYSksYz1yKHUsby11KzEpKCk7Yzw9YT8oaSs9dSxvLT11LGE9KGEtYykvKDEtYykpOihvPXUtMSxhLz1jKX1mb3IodmFyIGY9YTwuNSxzPWUoZj9hOjEtYSksbD1zKCksaD0wO2w8PW87KytoKWwrPXMoKTtyZXR1cm4gaSsoZj9oOm8taCl9fXJldHVybiBpLnNvdXJjZT10LGl9KFZwKSxjZz1mdW5jdGlvbiB0KG4pe2Z1bmN0aW9uIGUodCxlLHIpe3ZhciBpO3JldHVybiAwPT0odD0rdCk/aT10PT4tTWF0aC5sb2codCk6KHQ9MS90LGk9bj0+TWF0aC5wb3cobix0KSksZT1udWxsPT1lPzA6K2Uscj1udWxsPT1yPzE6K3IsZnVuY3Rpb24oKXtyZXR1cm4gZStyKmkoLU1hdGgubG9nMXAoLW4oKSkpfX1yZXR1cm4gZS5zb3VyY2U9dCxlfShWcCksZmc9ZnVuY3Rpb24gdChuKXtmdW5jdGlvbiBlKHQsZSl7cmV0dXJuIHQ9bnVsbD09dD8wOit0LGU9bnVsbD09ZT8xOitlLGZ1bmN0aW9uKCl7cmV0dXJuIHQrZSpNYXRoLnRhbihNYXRoLlBJKm4oKSl9fXJldHVybiBlLnNvdXJjZT10LGV9KFZwKSxzZz1mdW5jdGlvbiB0KG4pe2Z1bmN0aW9uIGUodCxlKXtyZXR1cm4gdD1udWxsPT10PzA6K3QsZT1udWxsPT1lPzE6K2UsZnVuY3Rpb24oKXt2YXIgcj1uKCk7cmV0dXJuIHQrZSpNYXRoLmxvZyhyLygxLXIpKX19cmV0dXJuIGUuc291cmNlPXQsZX0oVnApLGxnPWZ1bmN0aW9uIHQobil7dmFyIGU9b2cuc291cmNlKG4pLHI9dWcuc291cmNlKG4pO2Z1bmN0aW9uIGkodCl7cmV0dXJuIGZ1bmN0aW9uKCl7Zm9yKHZhciBpPTAsbz10O28+MTY7KXt2YXIgYT1NYXRoLmZsb29yKC44NzUqbyksdT1lKGEpKCk7aWYodT5vKXJldHVybiBpK3IoYS0xLG8vdSkoKTtpKz1hLG8tPXV9Zm9yKHZhciBjPS1NYXRoLmxvZzFwKC1uKCkpLGY9MDtjPD1vOysrZiljLT1NYXRoLmxvZzFwKC1uKCkpO3JldHVybiBpK2Z9fXJldHVybiBpLnNvdXJjZT10LGl9KFZwKTtjb25zdCBoZz0xLzQyOTQ5NjcyOTY7ZnVuY3Rpb24gZGcodCxuKXtzd2l0Y2goYXJndW1lbnRzLmxlbmd0aCl7Y2FzZSAwOmJyZWFrO2Nhc2UgMTp0aGlzLnJhbmdlKHQpO2JyZWFrO2RlZmF1bHQ6dGhpcy5yYW5nZShuKS5kb21haW4odCl9cmV0dXJuIHRoaXN9ZnVuY3Rpb24gcGcodCxuKXtzd2l0Y2goYXJndW1lbnRzLmxlbmd0aCl7Y2FzZSAwOmJyZWFrO2Nhc2UgMToiZnVuY3Rpb24iPT10eXBlb2YgdD90aGlzLmludGVycG9sYXRvcih0KTp0aGlzLnJhbmdlKHQpO2JyZWFrO2RlZmF1bHQ6dGhpcy5kb21haW4odCksImZ1bmN0aW9uIj09dHlwZW9mIG4/dGhpcy5pbnRlcnBvbGF0b3Iobik6dGhpcy5yYW5nZShuKX1yZXR1cm4gdGhpc31jb25zdCBnZz1TeW1ib2woImltcGxpY2l0Iik7ZnVuY3Rpb24geWcoKXt2YXIgdD1uZXcgSW50ZXJuTWFwLG49W10sZT1bXSxyPWdnO2Z1bmN0aW9uIGkoaSl7bGV0IG89dC5nZXQoaSk7aWYodm9pZCAwPT09byl7aWYociE9PWdnKXJldHVybiByO3Quc2V0KGksbz1uLnB1c2goaSktMSl9cmV0dXJuIGVbbyVlLmxlbmd0aF19cmV0dXJuIGkuZG9tYWluPWZ1bmN0aW9uKGUpe2lmKCFhcmd1bWVudHMubGVuZ3RoKXJldHVybiBuLnNsaWNlKCk7bj1bXSx0PW5ldyBJbnRlcm5NYXA7Zm9yKGNvbnN0IHIgb2YgZSl0LmhhcyhyKXx8dC5zZXQocixuLnB1c2gociktMSk7cmV0dXJuIGl9LGkucmFuZ2U9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9QXJyYXkuZnJvbSh0KSxpKTplLnNsaWNlKCl9LGkudW5rbm93bj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj10LGkpOnJ9LGkuY29weT1mdW5jdGlvbigpe3JldHVybiB5ZyhuLGUpLnVua25vd24ocil9LGRnLmFwcGx5KGksYXJndW1lbnRzKSxpfWZ1bmN0aW9uIHZnKCl7dmFyIHQsbixlPXlnKCkudW5rbm93bih2b2lkIDApLHI9ZS5kb21haW4saT1lLnJhbmdlLG89MCxhPTEsdT0hMSxjPTAsZj0wLHM9LjU7ZnVuY3Rpb24gbCgpe3ZhciBlPXIoKS5sZW5ndGgsbD1hPG8saD1sP2E6byxkPWw/bzphO3Q9KGQtaCkvTWF0aC5tYXgoMSxlLWMrMipmKSx1JiYodD1NYXRoLmZsb29yKHQpKSxoKz0oZC1oLXQqKGUtYykpKnMsbj10KigxLWMpLHUmJihoPU1hdGgucm91bmQoaCksbj1NYXRoLnJvdW5kKG4pKTt2YXIgcD1odChlKS5tYXAoKGZ1bmN0aW9uKG4pe3JldHVybiBoK3Qqbn0pKTtyZXR1cm4gaShsP3AucmV2ZXJzZSgpOnApfXJldHVybiBkZWxldGUgZS51bmtub3duLGUuZG9tYWluPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyKHQpLGwoKSk6cigpfSxlLnJhbmdlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhbbyxhXT10LG89K28sYT0rYSxsKCkpOltvLGFdfSxlLnJhbmdlUm91bmQ9ZnVuY3Rpb24odCl7cmV0dXJuW28sYV09dCxvPStvLGE9K2EsdT0hMCxsKCl9LGUuYmFuZHdpZHRoPWZ1bmN0aW9uKCl7cmV0dXJuIG59LGUuc3RlcD1mdW5jdGlvbigpe3JldHVybiB0fSxlLnJvdW5kPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PSEhdCxsKCkpOnV9LGUucGFkZGluZz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYz1NYXRoLm1pbigxLGY9K3QpLGwoKSk6Y30sZS5wYWRkaW5nSW5uZXI9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGM9TWF0aC5taW4oMSx0KSxsKCkpOmN9LGUucGFkZGluZ091dGVyPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhmPSt0LGwoKSk6Zn0sZS5hbGlnbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocz1NYXRoLm1heCgwLE1hdGgubWluKDEsdCkpLGwoKSk6c30sZS5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIHZnKHIoKSxbbyxhXSkucm91bmQodSkucGFkZGluZ0lubmVyKGMpLnBhZGRpbmdPdXRlcihmKS5hbGlnbihzKX0sZGcuYXBwbHkobCgpLGFyZ3VtZW50cyl9ZnVuY3Rpb24gX2codCl7dmFyIG49dC5jb3B5O3JldHVybiB0LnBhZGRpbmc9dC5wYWRkaW5nT3V0ZXIsZGVsZXRlIHQucGFkZGluZ0lubmVyLGRlbGV0ZSB0LnBhZGRpbmdPdXRlcix0LmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gX2cobigpKX0sdH1mdW5jdGlvbiBiZyh0KXtyZXR1cm4rdH12YXIgbWc9WzAsMV07ZnVuY3Rpb24geGcodCl7cmV0dXJuIHR9ZnVuY3Rpb24gd2codCxuKXtyZXR1cm4obi09dD0rdCk/ZnVuY3Rpb24oZSl7cmV0dXJuKGUtdCkvbn06ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHR9fShpc05hTihuKT9OYU46LjUpfWZ1bmN0aW9uIE1nKHQsbixlKXt2YXIgcj10WzBdLGk9dFsxXSxvPW5bMF0sYT1uWzFdO3JldHVybiBpPHI/KHI9d2coaSxyKSxvPWUoYSxvKSk6KHI9d2cocixpKSxvPWUobyxhKSksZnVuY3Rpb24odCl7cmV0dXJuIG8ocih0KSl9fWZ1bmN0aW9uIFRnKHQsbixlKXt2YXIgcj1NYXRoLm1pbih0Lmxlbmd0aCxuLmxlbmd0aCktMSxpPW5ldyBBcnJheShyKSxvPW5ldyBBcnJheShyKSxhPS0xO2Zvcih0W3JdPHRbMF0mJih0PXQuc2xpY2UoKS5yZXZlcnNlKCksbj1uLnNsaWNlKCkucmV2ZXJzZSgpKTsrK2E8cjspaVthXT13Zyh0W2FdLHRbYSsxXSksb1thXT1lKG5bYV0sblthKzFdKTtyZXR1cm4gZnVuY3Rpb24obil7dmFyIGU9bCh0LG4sMSxyKS0xO3JldHVybiBvW2VdKGlbZV0obikpfX1mdW5jdGlvbiBBZyh0LG4pe3JldHVybiBuLmRvbWFpbih0LmRvbWFpbigpKS5yYW5nZSh0LnJhbmdlKCkpLmludGVycG9sYXRlKHQuaW50ZXJwb2xhdGUoKSkuY2xhbXAodC5jbGFtcCgpKS51bmtub3duKHQudW5rbm93bigpKX1mdW5jdGlvbiBTZygpe3ZhciB0LG4sZSxyLGksbyxhPW1nLHU9bWcsYz1WcixmPXhnO2Z1bmN0aW9uIHMoKXt2YXIgdD1NYXRoLm1pbihhLmxlbmd0aCx1Lmxlbmd0aCk7cmV0dXJuIGYhPT14ZyYmKGY9ZnVuY3Rpb24odCxuKXt2YXIgZTtyZXR1cm4gdD5uJiYoZT10LHQ9bixuPWUpLGZ1bmN0aW9uKGUpe3JldHVybiBNYXRoLm1heCh0LE1hdGgubWluKG4sZSkpfX0oYVswXSxhW3QtMV0pKSxyPXQ+Mj9UZzpNZyxpPW89bnVsbCxsfWZ1bmN0aW9uIGwobil7cmV0dXJuIG51bGw9PW58fGlzTmFOKG49K24pP2U6KGl8fChpPXIoYS5tYXAodCksdSxjKSkpKHQoZihuKSkpfXJldHVybiBsLmludmVydD1mdW5jdGlvbihlKXtyZXR1cm4gZihuKChvfHwobz1yKHUsYS5tYXAodCksTHIpKSkoZSkpKX0sbC5kb21haW49ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9QXJyYXkuZnJvbSh0LGJnKSxzKCkpOmEuc2xpY2UoKX0sbC5yYW5nZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT1BcnJheS5mcm9tKHQpLHMoKSk6dS5zbGljZSgpfSxsLnJhbmdlUm91bmQ9ZnVuY3Rpb24odCl7cmV0dXJuIHU9QXJyYXkuZnJvbSh0KSxjPVdyLHMoKX0sbC5jbGFtcD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZj0hIXR8fHhnLHMoKSk6ZiE9PXhnfSxsLmludGVycG9sYXRlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhjPXQscygpKTpjfSxsLnVua25vd249ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9dCxsKTplfSxmdW5jdGlvbihlLHIpe3JldHVybiB0PWUsbj1yLHMoKX19ZnVuY3Rpb24gRWcoKXtyZXR1cm4gU2coKSh4Zyx4Zyl9ZnVuY3Rpb24gTmcobixlLHIsaSl7dmFyIG8sYT1aKG4sZSxyKTtzd2l0Y2goKGk9dGYobnVsbD09aT8iLGYiOmkpKS50eXBlKXtjYXNlInMiOnZhciB1PU1hdGgubWF4KE1hdGguYWJzKG4pLE1hdGguYWJzKGUpKTtyZXR1cm4gbnVsbCE9aS5wcmVjaXNpb258fGlzTmFOKG89aGYoYSx1KSl8fChpLnByZWNpc2lvbj1vKSx0LmZvcm1hdFByZWZpeChpLHUpO2Nhc2UiIjpjYXNlImUiOmNhc2UiZyI6Y2FzZSJwIjpjYXNlInIiOm51bGwhPWkucHJlY2lzaW9ufHxpc05hTihvPWRmKGEsTWF0aC5tYXgoTWF0aC5hYnMobiksTWF0aC5hYnMoZSkpKSl8fChpLnByZWNpc2lvbj1vLSgiZSI9PT1pLnR5cGUpKTticmVhaztjYXNlImYiOmNhc2UiJSI6bnVsbCE9aS5wcmVjaXNpb258fGlzTmFOKG89bGYoYSkpfHwoaS5wcmVjaXNpb249by0yKigiJSI9PT1pLnR5cGUpKX1yZXR1cm4gdC5mb3JtYXQoaSl9ZnVuY3Rpb24ga2codCl7dmFyIG49dC5kb21haW47cmV0dXJuIHQudGlja3M9ZnVuY3Rpb24odCl7dmFyIGU9bigpO3JldHVybiBWKGVbMF0sZVtlLmxlbmd0aC0xXSxudWxsPT10PzEwOnQpfSx0LnRpY2tGb3JtYXQ9ZnVuY3Rpb24odCxlKXt2YXIgcj1uKCk7cmV0dXJuIE5nKHJbMF0scltyLmxlbmd0aC0xXSxudWxsPT10PzEwOnQsZSl9LHQubmljZT1mdW5jdGlvbihlKXtudWxsPT1lJiYoZT0xMCk7dmFyIHIsaSxvPW4oKSxhPTAsdT1vLmxlbmd0aC0xLGM9b1thXSxmPW9bdV0scz0xMDtmb3IoZjxjJiYoaT1jLGM9ZixmPWksaT1hLGE9dSx1PWkpO3MtLSA+MDspe2lmKChpPVcoYyxmLGUpKT09PXIpcmV0dXJuIG9bYV09YyxvW3VdPWYsbihvKTtpZihpPjApYz1NYXRoLmZsb29yKGMvaSkqaSxmPU1hdGguY2VpbChmL2kpKmk7ZWxzZXtpZighKGk8MCkpYnJlYWs7Yz1NYXRoLmNlaWwoYyppKS9pLGY9TWF0aC5mbG9vcihmKmkpL2l9cj1pfXJldHVybiB0fSx0fWZ1bmN0aW9uIENnKHQsbil7dmFyIGUscj0wLGk9KHQ9dC5zbGljZSgpKS5sZW5ndGgtMSxvPXRbcl0sYT10W2ldO3JldHVybiBhPG8mJihlPXIscj1pLGk9ZSxlPW8sbz1hLGE9ZSksdFtyXT1uLmZsb29yKG8pLHRbaV09bi5jZWlsKGEpLHR9ZnVuY3Rpb24gUGcodCl7cmV0dXJuIE1hdGgubG9nKHQpfWZ1bmN0aW9uIHpnKHQpe3JldHVybiBNYXRoLmV4cCh0KX1mdW5jdGlvbiAkZyh0KXtyZXR1cm4tTWF0aC5sb2coLXQpfWZ1bmN0aW9uIERnKHQpe3JldHVybi1NYXRoLmV4cCgtdCl9ZnVuY3Rpb24gUmcodCl7cmV0dXJuIGlzRmluaXRlKHQpPysoIjFlIit0KTp0PDA/MDp0fWZ1bmN0aW9uIEZnKHQpe3JldHVybihuLGUpPT4tdCgtbixlKX1mdW5jdGlvbiBxZyhuKXtjb25zdCBlPW4oUGcsemcpLHI9ZS5kb21haW47bGV0IGksbyxhPTEwO2Z1bmN0aW9uIHUoKXtyZXR1cm4gaT1mdW5jdGlvbih0KXtyZXR1cm4gdD09PU1hdGguRT9NYXRoLmxvZzoxMD09PXQmJk1hdGgubG9nMTB8fDI9PT10JiZNYXRoLmxvZzJ8fCh0PU1hdGgubG9nKHQpLG49Pk1hdGgubG9nKG4pL3QpfShhKSxvPWZ1bmN0aW9uKHQpe3JldHVybiAxMD09PXQ/Umc6dD09PU1hdGguRT9NYXRoLmV4cDpuPT5NYXRoLnBvdyh0LG4pfShhKSxyKClbMF08MD8oaT1GZyhpKSxvPUZnKG8pLG4oJGcsRGcpKTpuKFBnLHpnKSxlfXJldHVybiBlLmJhc2U9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9K3QsdSgpKTphfSxlLmRvbWFpbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocih0KSx1KCkpOnIoKX0sZS50aWNrcz10PT57Y29uc3Qgbj1yKCk7bGV0IGU9blswXSx1PW5bbi5sZW5ndGgtMV07Y29uc3QgYz11PGU7YyYmKFtlLHVdPVt1LGVdKTtsZXQgZixzLGw9aShlKSxoPWkodSk7Y29uc3QgZD1udWxsPT10PzEwOit0O2xldCBwPVtdO2lmKCEoYSUxKSYmaC1sPGQpe2lmKGw9TWF0aC5mbG9vcihsKSxoPU1hdGguY2VpbChoKSxlPjApe2Zvcig7bDw9aDsrK2wpZm9yKGY9MTtmPGE7KytmKWlmKHM9bDwwP2YvbygtbCk6ZipvKGwpLCEoczxlKSl7aWYocz51KWJyZWFrO3AucHVzaChzKX19ZWxzZSBmb3IoO2w8PWg7KytsKWZvcihmPWEtMTtmPj0xOy0tZilpZihzPWw+MD9mL28oLWwpOmYqbyhsKSwhKHM8ZSkpe2lmKHM+dSlicmVhaztwLnB1c2gocyl9MipwLmxlbmd0aDxkJiYocD1WKGUsdSxkKSl9ZWxzZSBwPVYobCxoLE1hdGgubWluKGgtbCxkKSkubWFwKG8pO3JldHVybiBjP3AucmV2ZXJzZSgpOnB9LGUudGlja0Zvcm1hdD0obixyKT0+e2lmKG51bGw9PW4mJihuPTEwKSxudWxsPT1yJiYocj0xMD09PWE/InMiOiIsIiksImZ1bmN0aW9uIiE9dHlwZW9mIHImJihhJTF8fG51bGwhPShyPXRmKHIpKS5wcmVjaXNpb258fChyLnRyaW09ITApLHI9dC5mb3JtYXQocikpLG49PT0xLzApcmV0dXJuIHI7Y29uc3QgdT1NYXRoLm1heCgxLGEqbi9lLnRpY2tzKCkubGVuZ3RoKTtyZXR1cm4gdD0+e2xldCBuPXQvbyhNYXRoLnJvdW5kKGkodCkpKTtyZXR1cm4gbiphPGEtLjUmJihuKj1hKSxuPD11P3IodCk6IiJ9fSxlLm5pY2U9KCk9PnIoQ2cocigpLHtmbG9vcjp0PT5vKE1hdGguZmxvb3IoaSh0KSkpLGNlaWw6dD0+byhNYXRoLmNlaWwoaSh0KSkpfSkpLGV9ZnVuY3Rpb24gVWcodCl7cmV0dXJuIGZ1bmN0aW9uKG4pe3JldHVybiBNYXRoLnNpZ24obikqTWF0aC5sb2cxcChNYXRoLmFicyhuL3QpKX19ZnVuY3Rpb24gSWcodCl7cmV0dXJuIGZ1bmN0aW9uKG4pe3JldHVybiBNYXRoLnNpZ24obikqTWF0aC5leHBtMShNYXRoLmFicyhuKSkqdH19ZnVuY3Rpb24gT2codCl7dmFyIG49MSxlPXQoVWcobiksSWcobikpO3JldHVybiBlLmNvbnN0YW50PWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3QoVWcobj0rZSksSWcobikpOm59LGtnKGUpfWZ1bmN0aW9uIEJnKHQpe3JldHVybiBmdW5jdGlvbihuKXtyZXR1cm4gbjwwPy1NYXRoLnBvdygtbix0KTpNYXRoLnBvdyhuLHQpfX1mdW5jdGlvbiBZZyh0KXtyZXR1cm4gdDwwPy1NYXRoLnNxcnQoLXQpOk1hdGguc3FydCh0KX1mdW5jdGlvbiBMZyh0KXtyZXR1cm4gdDwwPy10KnQ6dCp0fWZ1bmN0aW9uIGpnKHQpe3ZhciBuPXQoeGcseGcpLGU9MTtyZXR1cm4gbi5leHBvbmVudD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8xPT09KGU9K24pP3QoeGcseGcpOi41PT09ZT90KFlnLExnKTp0KEJnKGUpLEJnKDEvZSkpOmV9LGtnKG4pfWZ1bmN0aW9uIEhnKCl7dmFyIHQ9amcoU2coKSk7cmV0dXJuIHQuY29weT1mdW5jdGlvbigpe3JldHVybiBBZyh0LEhnKCkpLmV4cG9uZW50KHQuZXhwb25lbnQoKSl9LGRnLmFwcGx5KHQsYXJndW1lbnRzKSx0fWZ1bmN0aW9uIFhnKHQpe3JldHVybiBNYXRoLnNpZ24odCkqdCp0fWNvbnN0IEdnPW5ldyBEYXRlLFZnPW5ldyBEYXRlO2Z1bmN0aW9uIFdnKHQsbixlLHIpe2Z1bmN0aW9uIGkobil7cmV0dXJuIHQobj0wPT09YXJndW1lbnRzLmxlbmd0aD9uZXcgRGF0ZTpuZXcgRGF0ZSgrbikpLG59cmV0dXJuIGkuZmxvb3I9bj0+KHQobj1uZXcgRGF0ZSgrbikpLG4pLGkuY2VpbD1lPT4odChlPW5ldyBEYXRlKGUtMSkpLG4oZSwxKSx0KGUpLGUpLGkucm91bmQ9dD0+e2NvbnN0IG49aSh0KSxlPWkuY2VpbCh0KTtyZXR1cm4gdC1uPGUtdD9uOmV9LGkub2Zmc2V0PSh0LGUpPT4obih0PW5ldyBEYXRlKCt0KSxudWxsPT1lPzE6TWF0aC5mbG9vcihlKSksdCksaS5yYW5nZT0oZSxyLG8pPT57Y29uc3QgYT1bXTtpZihlPWkuY2VpbChlKSxvPW51bGw9PW8/MTpNYXRoLmZsb29yKG8pLCEoZTxyJiZvPjApKXJldHVybiBhO2xldCB1O2Rve2EucHVzaCh1PW5ldyBEYXRlKCtlKSksbihlLG8pLHQoZSl9d2hpbGUodTxlJiZlPHIpO3JldHVybiBhfSxpLmZpbHRlcj1lPT5XZygobj0+e2lmKG4+PW4pZm9yKDt0KG4pLCFlKG4pOyluLnNldFRpbWUobi0xKX0pLCgodCxyKT0+e2lmKHQ+PXQpaWYocjwwKWZvcig7KytyPD0wOylmb3IoO24odCwtMSksIWUodCk7KTtlbHNlIGZvcig7LS1yPj0wOylmb3IoO24odCwxKSwhZSh0KTspO30pKSxlJiYoaS5jb3VudD0obixyKT0+KEdnLnNldFRpbWUoK24pLFZnLnNldFRpbWUoK3IpLHQoR2cpLHQoVmcpLE1hdGguZmxvb3IoZShHZyxWZykpKSxpLmV2ZXJ5PXQ9Pih0PU1hdGguZmxvb3IodCksaXNGaW5pdGUodCkmJnQ+MD90PjE/aS5maWx0ZXIocj9uPT5yKG4pJXQ9PTA6bj0+aS5jb3VudCgwLG4pJXQ9PTApOmk6bnVsbCkpLGl9Y29uc3QgWmc9V2coKCgpPT57fSksKCh0LG4pPT57dC5zZXRUaW1lKCt0K24pfSksKCh0LG4pPT5uLXQpKTtaZy5ldmVyeT10PT4odD1NYXRoLmZsb29yKHQpLGlzRmluaXRlKHQpJiZ0PjA/dD4xP1dnKChuPT57bi5zZXRUaW1lKE1hdGguZmxvb3Iobi90KSp0KX0pLCgobixlKT0+e24uc2V0VGltZSgrbitlKnQpfSksKChuLGUpPT4oZS1uKS90KSk6Wmc6bnVsbCk7Y29uc3QgS2c9WmcucmFuZ2UsUWc9MWUzLEpnPTZlNCx0eT02MCpKZyxueT0yNCp0eSxleT03Km55LHJ5PTMwKm55LGl5PTM2NSpueSxveT1XZygodD0+e3Quc2V0VGltZSh0LXQuZ2V0TWlsbGlzZWNvbmRzKCkpfSksKCh0LG4pPT57dC5zZXRUaW1lKCt0K24qUWcpfSksKCh0LG4pPT4obi10KS9RZyksKHQ9PnQuZ2V0VVRDU2Vjb25kcygpKSksYXk9b3kucmFuZ2UsdXk9V2coKHQ9Pnt0LnNldFRpbWUodC10LmdldE1pbGxpc2Vjb25kcygpLXQuZ2V0U2Vjb25kcygpKlFnKX0pLCgodCxuKT0+e3Quc2V0VGltZSgrdCtuKkpnKX0pLCgodCxuKT0+KG4tdCkvSmcpLCh0PT50LmdldE1pbnV0ZXMoKSkpLGN5PXV5LnJhbmdlLGZ5PVdnKCh0PT57dC5zZXRVVENTZWNvbmRzKDAsMCl9KSwoKHQsbik9Pnt0LnNldFRpbWUoK3QrbipKZyl9KSwoKHQsbik9PihuLXQpL0pnKSwodD0+dC5nZXRVVENNaW51dGVzKCkpKSxzeT1meS5yYW5nZSxseT1XZygodD0+e3Quc2V0VGltZSh0LXQuZ2V0TWlsbGlzZWNvbmRzKCktdC5nZXRTZWNvbmRzKCkqUWctdC5nZXRNaW51dGVzKCkqSmcpfSksKCh0LG4pPT57dC5zZXRUaW1lKCt0K24qdHkpfSksKCh0LG4pPT4obi10KS90eSksKHQ9PnQuZ2V0SG91cnMoKSkpLGh5PWx5LnJhbmdlLGR5PVdnKCh0PT57dC5zZXRVVENNaW51dGVzKDAsMCwwKX0pLCgodCxuKT0+e3Quc2V0VGltZSgrdCtuKnR5KX0pLCgodCxuKT0+KG4tdCkvdHkpLCh0PT50LmdldFVUQ0hvdXJzKCkpKSxweT1keS5yYW5nZSxneT1XZygodD0+dC5zZXRIb3VycygwLDAsMCwwKSksKCh0LG4pPT50LnNldERhdGUodC5nZXREYXRlKCkrbikpLCgodCxuKT0+KG4tdC0obi5nZXRUaW1lem9uZU9mZnNldCgpLXQuZ2V0VGltZXpvbmVPZmZzZXQoKSkqSmcpL255KSwodD0+dC5nZXREYXRlKCktMSkpLHl5PWd5LnJhbmdlLHZ5PVdnKCh0PT57dC5zZXRVVENIb3VycygwLDAsMCwwKX0pLCgodCxuKT0+e3Quc2V0VVRDRGF0ZSh0LmdldFVUQ0RhdGUoKStuKX0pLCgodCxuKT0+KG4tdCkvbnkpLCh0PT50LmdldFVUQ0RhdGUoKS0xKSksX3k9dnkucmFuZ2UsYnk9V2coKHQ9Pnt0LnNldFVUQ0hvdXJzKDAsMCwwLDApfSksKCh0LG4pPT57dC5zZXRVVENEYXRlKHQuZ2V0VVRDRGF0ZSgpK24pfSksKCh0LG4pPT4obi10KS9ueSksKHQ9Pk1hdGguZmxvb3IodC9ueSkpKSxteT1ieS5yYW5nZTtmdW5jdGlvbiB4eSh0KXtyZXR1cm4gV2coKG49PntuLnNldERhdGUobi5nZXREYXRlKCktKG4uZ2V0RGF5KCkrNy10KSU3KSxuLnNldEhvdXJzKDAsMCwwLDApfSksKCh0LG4pPT57dC5zZXREYXRlKHQuZ2V0RGF0ZSgpKzcqbil9KSwoKHQsbik9PihuLXQtKG4uZ2V0VGltZXpvbmVPZmZzZXQoKS10LmdldFRpbWV6b25lT2Zmc2V0KCkpKkpnKS9leSkpfWNvbnN0IHd5PXh5KDApLE15PXh5KDEpLFR5PXh5KDIpLEF5PXh5KDMpLFN5PXh5KDQpLEV5PXh5KDUpLE55PXh5KDYpLGt5PXd5LnJhbmdlLEN5PU15LnJhbmdlLFB5PVR5LnJhbmdlLHp5PUF5LnJhbmdlLCR5PVN5LnJhbmdlLER5PUV5LnJhbmdlLFJ5PU55LnJhbmdlO2Z1bmN0aW9uIEZ5KHQpe3JldHVybiBXZygobj0+e24uc2V0VVRDRGF0ZShuLmdldFVUQ0RhdGUoKS0obi5nZXRVVENEYXkoKSs3LXQpJTcpLG4uc2V0VVRDSG91cnMoMCwwLDAsMCl9KSwoKHQsbik9Pnt0LnNldFVUQ0RhdGUodC5nZXRVVENEYXRlKCkrNypuKX0pLCgodCxuKT0+KG4tdCkvZXkpKX1jb25zdCBxeT1GeSgwKSxVeT1GeSgxKSxJeT1GeSgyKSxPeT1GeSgzKSxCeT1GeSg0KSxZeT1GeSg1KSxMeT1GeSg2KSxqeT1xeS5yYW5nZSxIeT1VeS5yYW5nZSxYeT1JeS5yYW5nZSxHeT1PeS5yYW5nZSxWeT1CeS5yYW5nZSxXeT1ZeS5yYW5nZSxaeT1MeS5yYW5nZSxLeT1XZygodD0+e3Quc2V0RGF0ZSgxKSx0LnNldEhvdXJzKDAsMCwwLDApfSksKCh0LG4pPT57dC5zZXRNb250aCh0LmdldE1vbnRoKCkrbil9KSwoKHQsbik9Pm4uZ2V0TW9udGgoKS10LmdldE1vbnRoKCkrMTIqKG4uZ2V0RnVsbFllYXIoKS10LmdldEZ1bGxZZWFyKCkpKSwodD0+dC5nZXRNb250aCgpKSksUXk9S3kucmFuZ2UsSnk9V2coKHQ9Pnt0LnNldFVUQ0RhdGUoMSksdC5zZXRVVENIb3VycygwLDAsMCwwKX0pLCgodCxuKT0+e3Quc2V0VVRDTW9udGgodC5nZXRVVENNb250aCgpK24pfSksKCh0LG4pPT5uLmdldFVUQ01vbnRoKCktdC5nZXRVVENNb250aCgpKzEyKihuLmdldFVUQ0Z1bGxZZWFyKCktdC5nZXRVVENGdWxsWWVhcigpKSksKHQ9PnQuZ2V0VVRDTW9udGgoKSkpLHR2PUp5LnJhbmdlLG52PVdnKCh0PT57dC5zZXRNb250aCgwLDEpLHQuc2V0SG91cnMoMCwwLDAsMCl9KSwoKHQsbik9Pnt0LnNldEZ1bGxZZWFyKHQuZ2V0RnVsbFllYXIoKStuKX0pLCgodCxuKT0+bi5nZXRGdWxsWWVhcigpLXQuZ2V0RnVsbFllYXIoKSksKHQ9PnQuZ2V0RnVsbFllYXIoKSkpO252LmV2ZXJ5PXQ9PmlzRmluaXRlKHQ9TWF0aC5mbG9vcih0KSkmJnQ+MD9XZygobj0+e24uc2V0RnVsbFllYXIoTWF0aC5mbG9vcihuLmdldEZ1bGxZZWFyKCkvdCkqdCksbi5zZXRNb250aCgwLDEpLG4uc2V0SG91cnMoMCwwLDAsMCl9KSwoKG4sZSk9PntuLnNldEZ1bGxZZWFyKG4uZ2V0RnVsbFllYXIoKStlKnQpfSkpOm51bGw7Y29uc3QgZXY9bnYucmFuZ2UscnY9V2coKHQ9Pnt0LnNldFVUQ01vbnRoKDAsMSksdC5zZXRVVENIb3VycygwLDAsMCwwKX0pLCgodCxuKT0+e3Quc2V0VVRDRnVsbFllYXIodC5nZXRVVENGdWxsWWVhcigpK24pfSksKCh0LG4pPT5uLmdldFVUQ0Z1bGxZZWFyKCktdC5nZXRVVENGdWxsWWVhcigpKSwodD0+dC5nZXRVVENGdWxsWWVhcigpKSk7cnYuZXZlcnk9dD0+aXNGaW5pdGUodD1NYXRoLmZsb29yKHQpKSYmdD4wP1dnKChuPT57bi5zZXRVVENGdWxsWWVhcihNYXRoLmZsb29yKG4uZ2V0VVRDRnVsbFllYXIoKS90KSp0KSxuLnNldFVUQ01vbnRoKDAsMSksbi5zZXRVVENIb3VycygwLDAsMCwwKX0pLCgobixlKT0+e24uc2V0VVRDRnVsbFllYXIobi5nZXRVVENGdWxsWWVhcigpK2UqdCl9KSk6bnVsbDtjb25zdCBpdj1ydi5yYW5nZTtmdW5jdGlvbiBvdih0LG4sZSxpLG8sYSl7Y29uc3QgdT1bW295LDEsUWddLFtveSw1LDVlM10sW295LDE1LDE1ZTNdLFtveSwzMCwzZTRdLFthLDEsSmddLFthLDUsNSpKZ10sW2EsMTUsMTUqSmddLFthLDMwLDMwKkpnXSxbbywxLHR5XSxbbywzLDMqdHldLFtvLDYsNip0eV0sW28sMTIsMTIqdHldLFtpLDEsbnldLFtpLDIsMipueV0sW2UsMSxleV0sW24sMSxyeV0sW24sMywzKnJ5XSxbdCwxLGl5XV07ZnVuY3Rpb24gYyhuLGUsaSl7Y29uc3Qgbz1NYXRoLmFicyhlLW4pL2ksYT1yKCgoWywsdF0pPT50KSkucmlnaHQodSxvKTtpZihhPT09dS5sZW5ndGgpcmV0dXJuIHQuZXZlcnkoWihuL2l5LGUvaXksaSkpO2lmKDA9PT1hKXJldHVybiBaZy5ldmVyeShNYXRoLm1heChaKG4sZSxpKSwxKSk7Y29uc3RbYyxmXT11W28vdVthLTFdWzJdPHVbYV1bMl0vbz9hLTE6YV07cmV0dXJuIGMuZXZlcnkoZil9cmV0dXJuW2Z1bmN0aW9uKHQsbixlKXtjb25zdCByPW48dDtyJiYoW3Qsbl09W24sdF0pO2NvbnN0IGk9ZSYmImZ1bmN0aW9uIj09dHlwZW9mIGUucmFuZ2U/ZTpjKHQsbixlKSxvPWk/aS5yYW5nZSh0LCtuKzEpOltdO3JldHVybiByP28ucmV2ZXJzZSgpOm99LGNdfWNvbnN0W2F2LHV2XT1vdihydixKeSxxeSxieSxkeSxmeSksW2N2LGZ2XT1vdihudixLeSx3eSxneSxseSx1eSk7ZnVuY3Rpb24gc3YodCl7aWYoMDw9dC55JiZ0Lnk8MTAwKXt2YXIgbj1uZXcgRGF0ZSgtMSx0Lm0sdC5kLHQuSCx0Lk0sdC5TLHQuTCk7cmV0dXJuIG4uc2V0RnVsbFllYXIodC55KSxufXJldHVybiBuZXcgRGF0ZSh0LnksdC5tLHQuZCx0LkgsdC5NLHQuUyx0LkwpfWZ1bmN0aW9uIGx2KHQpe2lmKDA8PXQueSYmdC55PDEwMCl7dmFyIG49bmV3IERhdGUoRGF0ZS5VVEMoLTEsdC5tLHQuZCx0LkgsdC5NLHQuUyx0LkwpKTtyZXR1cm4gbi5zZXRVVENGdWxsWWVhcih0LnkpLG59cmV0dXJuIG5ldyBEYXRlKERhdGUuVVRDKHQueSx0Lm0sdC5kLHQuSCx0Lk0sdC5TLHQuTCkpfWZ1bmN0aW9uIGh2KHQsbixlKXtyZXR1cm57eTp0LG06bixkOmUsSDowLE06MCxTOjAsTDowfX1mdW5jdGlvbiBkdih0KXt2YXIgbj10LmRhdGVUaW1lLGU9dC5kYXRlLHI9dC50aW1lLGk9dC5wZXJpb2RzLG89dC5kYXlzLGE9dC5zaG9ydERheXMsdT10Lm1vbnRocyxjPXQuc2hvcnRNb250aHMsZj14dihpKSxzPXd2KGkpLGw9eHYobyksaD13dihvKSxkPXh2KGEpLHA9d3YoYSksZz14dih1KSx5PXd2KHUpLHY9eHYoYyksXz13dihjKSxiPXthOmZ1bmN0aW9uKHQpe3JldHVybiBhW3QuZ2V0RGF5KCldfSxBOmZ1bmN0aW9uKHQpe3JldHVybiBvW3QuZ2V0RGF5KCldfSxiOmZ1bmN0aW9uKHQpe3JldHVybiBjW3QuZ2V0TW9udGgoKV19LEI6ZnVuY3Rpb24odCl7cmV0dXJuIHVbdC5nZXRNb250aCgpXX0sYzpudWxsLGQ6THYsZTpMdixmOlZ2LGc6b18sRzp1XyxIOmp2LEk6SHYsajpYdixMOkd2LG06V3YsTTpadixwOmZ1bmN0aW9uKHQpe3JldHVybiBpWysodC5nZXRIb3VycygpPj0xMildfSxxOmZ1bmN0aW9uKHQpe3JldHVybiAxK35+KHQuZ2V0TW9udGgoKS8zKX0sUTpDXyxzOlBfLFM6S3YsdTpRdixVOkp2LFY6bl8sdzplXyxXOnJfLHg6bnVsbCxYOm51bGwseTppXyxZOmFfLFo6Y18sIiUiOmtffSxtPXthOmZ1bmN0aW9uKHQpe3JldHVybiBhW3QuZ2V0VVRDRGF5KCldfSxBOmZ1bmN0aW9uKHQpe3JldHVybiBvW3QuZ2V0VVRDRGF5KCldfSxiOmZ1bmN0aW9uKHQpe3JldHVybiBjW3QuZ2V0VVRDTW9udGgoKV19LEI6ZnVuY3Rpb24odCl7cmV0dXJuIHVbdC5nZXRVVENNb250aCgpXX0sYzpudWxsLGQ6Zl8sZTpmXyxmOnBfLGc6QV8sRzpFXyxIOnNfLEk6bF8sajpoXyxMOmRfLG06Z18sTTp5XyxwOmZ1bmN0aW9uKHQpe3JldHVybiBpWysodC5nZXRVVENIb3VycygpPj0xMildfSxxOmZ1bmN0aW9uKHQpe3JldHVybiAxK35+KHQuZ2V0VVRDTW9udGgoKS8zKX0sUTpDXyxzOlBfLFM6dl8sdTpfXyxVOmJfLFY6eF8sdzp3XyxXOk1fLHg6bnVsbCxYOm51bGwseTpUXyxZOlNfLFo6Tl8sIiUiOmtffSx4PXthOmZ1bmN0aW9uKHQsbixlKXt2YXIgcj1kLmV4ZWMobi5zbGljZShlKSk7cmV0dXJuIHI/KHQudz1wLmdldChyWzBdLnRvTG93ZXJDYXNlKCkpLGUrclswXS5sZW5ndGgpOi0xfSxBOmZ1bmN0aW9uKHQsbixlKXt2YXIgcj1sLmV4ZWMobi5zbGljZShlKSk7cmV0dXJuIHI/KHQudz1oLmdldChyWzBdLnRvTG93ZXJDYXNlKCkpLGUrclswXS5sZW5ndGgpOi0xfSxiOmZ1bmN0aW9uKHQsbixlKXt2YXIgcj12LmV4ZWMobi5zbGljZShlKSk7cmV0dXJuIHI/KHQubT1fLmdldChyWzBdLnRvTG93ZXJDYXNlKCkpLGUrclswXS5sZW5ndGgpOi0xfSxCOmZ1bmN0aW9uKHQsbixlKXt2YXIgcj1nLmV4ZWMobi5zbGljZShlKSk7cmV0dXJuIHI/KHQubT15LmdldChyWzBdLnRvTG93ZXJDYXNlKCkpLGUrclswXS5sZW5ndGgpOi0xfSxjOmZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gVCh0LG4sZSxyKX0sZDokdixlOiR2LGY6SXYsZzprdixHOk52LEg6UnYsSTpSdixqOkR2LEw6VXYsbTp6dixNOkZ2LHA6ZnVuY3Rpb24odCxuLGUpe3ZhciByPWYuZXhlYyhuLnNsaWNlKGUpKTtyZXR1cm4gcj8odC5wPXMuZ2V0KHJbMF0udG9Mb3dlckNhc2UoKSksZStyWzBdLmxlbmd0aCk6LTF9LHE6UHYsUTpCdixzOll2LFM6cXYsdTpUdixVOkF2LFY6U3YsdzpNdixXOkV2LHg6ZnVuY3Rpb24odCxuLHIpe3JldHVybiBUKHQsZSxuLHIpfSxYOmZ1bmN0aW9uKHQsbixlKXtyZXR1cm4gVCh0LHIsbixlKX0seTprdixZOk52LFo6Q3YsIiUiOk92fTtmdW5jdGlvbiB3KHQsbil7cmV0dXJuIGZ1bmN0aW9uKGUpe3ZhciByLGksbyxhPVtdLHU9LTEsYz0wLGY9dC5sZW5ndGg7Zm9yKGUgaW5zdGFuY2VvZiBEYXRlfHwoZT1uZXcgRGF0ZSgrZSkpOysrdTxmOykzNz09PXQuY2hhckNvZGVBdCh1KSYmKGEucHVzaCh0LnNsaWNlKGMsdSkpLG51bGwhPShpPWd2W3I9dC5jaGFyQXQoKyt1KV0pP3I9dC5jaGFyQXQoKyt1KTppPSJlIj09PXI/IiAiOiIwIiwobz1uW3JdKSYmKHI9byhlLGkpKSxhLnB1c2gociksYz11KzEpO3JldHVybiBhLnB1c2godC5zbGljZShjLHUpKSxhLmpvaW4oIiIpfX1mdW5jdGlvbiBNKHQsbil7cmV0dXJuIGZ1bmN0aW9uKGUpe3ZhciByLGksbz1odigxOTAwLHZvaWQgMCwxKTtpZihUKG8sdCxlKz0iIiwwKSE9ZS5sZW5ndGgpcmV0dXJuIG51bGw7aWYoIlEiaW4gbylyZXR1cm4gbmV3IERhdGUoby5RKTtpZigicyJpbiBvKXJldHVybiBuZXcgRGF0ZSgxZTMqby5zKygiTCJpbiBvP28uTDowKSk7aWYobiYmISgiWiJpbiBvKSYmKG8uWj0wKSwicCJpbiBvJiYoby5IPW8uSCUxMisxMipvLnApLHZvaWQgMD09PW8ubSYmKG8ubT0icSJpbiBvP28ucTowKSwiViJpbiBvKXtpZihvLlY8MXx8by5WPjUzKXJldHVybiBudWxsOyJ3ImluIG98fChvLnc9MSksIloiaW4gbz8oaT0ocj1sdihodihvLnksMCwxKSkpLmdldFVUQ0RheSgpLHI9aT40fHwwPT09aT9VeS5jZWlsKHIpOlV5KHIpLHI9dnkub2Zmc2V0KHIsNyooby5WLTEpKSxvLnk9ci5nZXRVVENGdWxsWWVhcigpLG8ubT1yLmdldFVUQ01vbnRoKCksby5kPXIuZ2V0VVRDRGF0ZSgpKyhvLncrNiklNyk6KGk9KHI9c3YoaHYoby55LDAsMSkpKS5nZXREYXkoKSxyPWk+NHx8MD09PWk/TXkuY2VpbChyKTpNeShyKSxyPWd5Lm9mZnNldChyLDcqKG8uVi0xKSksby55PXIuZ2V0RnVsbFllYXIoKSxvLm09ci5nZXRNb250aCgpLG8uZD1yLmdldERhdGUoKSsoby53KzYpJTcpfWVsc2UoIlciaW4gb3x8IlUiaW4gbykmJigidyJpbiBvfHwoby53PSJ1ImluIG8/by51JTc6IlciaW4gbz8xOjApLGk9IloiaW4gbz9sdihodihvLnksMCwxKSkuZ2V0VVRDRGF5KCk6c3YoaHYoby55LDAsMSkpLmdldERheSgpLG8ubT0wLG8uZD0iVyJpbiBvPyhvLncrNiklNys3Km8uVy0oaSs1KSU3Om8udys3Km8uVS0oaSs2KSU3KTtyZXR1cm4iWiJpbiBvPyhvLkgrPW8uWi8xMDB8MCxvLk0rPW8uWiUxMDAsbHYobykpOnN2KG8pfX1mdW5jdGlvbiBUKHQsbixlLHIpe2Zvcih2YXIgaSxvLGE9MCx1PW4ubGVuZ3RoLGM9ZS5sZW5ndGg7YTx1Oyl7aWYocj49YylyZXR1cm4tMTtpZigzNz09PShpPW4uY2hhckNvZGVBdChhKyspKSl7aWYoaT1uLmNoYXJBdChhKyspLCEobz14W2kgaW4gZ3Y/bi5jaGFyQXQoYSsrKTppXSl8fChyPW8odCxlLHIpKTwwKXJldHVybi0xfWVsc2UgaWYoaSE9ZS5jaGFyQ29kZUF0KHIrKykpcmV0dXJuLTF9cmV0dXJuIHJ9cmV0dXJuIGIueD13KGUsYiksYi5YPXcocixiKSxiLmM9dyhuLGIpLG0ueD13KGUsbSksbS5YPXcocixtKSxtLmM9dyhuLG0pLHtmb3JtYXQ6ZnVuY3Rpb24odCl7dmFyIG49dyh0Kz0iIixiKTtyZXR1cm4gbi50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0fSxufSxwYXJzZTpmdW5jdGlvbih0KXt2YXIgbj1NKHQrPSIiLCExKTtyZXR1cm4gbi50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0fSxufSx1dGNGb3JtYXQ6ZnVuY3Rpb24odCl7dmFyIG49dyh0Kz0iIixtKTtyZXR1cm4gbi50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0fSxufSx1dGNQYXJzZTpmdW5jdGlvbih0KXt2YXIgbj1NKHQrPSIiLCEwKTtyZXR1cm4gbi50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0fSxufX19dmFyIHB2LGd2PXsiLSI6IiIsXzoiICIsMDoiMCJ9LHl2PS9eXHMqXGQrLyx2dj0vXiUvLF92PS9bXFxeJCorP3xbXF0oKS57fV0vZztmdW5jdGlvbiBidih0LG4sZSl7dmFyIHI9dDwwPyItIjoiIixpPShyPy10OnQpKyIiLG89aS5sZW5ndGg7cmV0dXJuIHIrKG88ZT9uZXcgQXJyYXkoZS1vKzEpLmpvaW4obikraTppKX1mdW5jdGlvbiBtdih0KXtyZXR1cm4gdC5yZXBsYWNlKF92LCJcXCQmIil9ZnVuY3Rpb24geHYodCl7cmV0dXJuIG5ldyBSZWdFeHAoIl4oPzoiK3QubWFwKG12KS5qb2luKCJ8IikrIikiLCJpIil9ZnVuY3Rpb24gd3YodCl7cmV0dXJuIG5ldyBNYXAodC5tYXAoKCh0LG4pPT5bdC50b0xvd2VyQ2FzZSgpLG5dKSkpfWZ1bmN0aW9uIE12KHQsbixlKXt2YXIgcj15di5leGVjKG4uc2xpY2UoZSxlKzEpKTtyZXR1cm4gcj8odC53PStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIFR2KHQsbixlKXt2YXIgcj15di5leGVjKG4uc2xpY2UoZSxlKzEpKTtyZXR1cm4gcj8odC51PStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIEF2KHQsbixlKXt2YXIgcj15di5leGVjKG4uc2xpY2UoZSxlKzIpKTtyZXR1cm4gcj8odC5VPStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIFN2KHQsbixlKXt2YXIgcj15di5leGVjKG4uc2xpY2UoZSxlKzIpKTtyZXR1cm4gcj8odC5WPStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIEV2KHQsbixlKXt2YXIgcj15di5leGVjKG4uc2xpY2UoZSxlKzIpKTtyZXR1cm4gcj8odC5XPStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIE52KHQsbixlKXt2YXIgcj15di5leGVjKG4uc2xpY2UoZSxlKzQpKTtyZXR1cm4gcj8odC55PStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIGt2KHQsbixlKXt2YXIgcj15di5leGVjKG4uc2xpY2UoZSxlKzIpKTtyZXR1cm4gcj8odC55PStyWzBdKygrclswXT42OD8xOTAwOjJlMyksZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gQ3YodCxuLGUpe3ZhciByPS9eKFopfChbKy1dXGRcZCkoPzo6PyhcZFxkKSk/Ly5leGVjKG4uc2xpY2UoZSxlKzYpKTtyZXR1cm4gcj8odC5aPXJbMV0/MDotKHJbMl0rKHJbM118fCIwMCIpKSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBQdih0LG4sZSl7dmFyIHI9eXYuZXhlYyhuLnNsaWNlKGUsZSsxKSk7cmV0dXJuIHI/KHQucT0zKnJbMF0tMyxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiB6dih0LG4sZSl7dmFyIHI9eXYuZXhlYyhuLnNsaWNlKGUsZSsyKSk7cmV0dXJuIHI/KHQubT1yWzBdLTEsZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gJHYodCxuLGUpe3ZhciByPXl2LmV4ZWMobi5zbGljZShlLGUrMikpO3JldHVybiByPyh0LmQ9K3JbMF0sZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gRHYodCxuLGUpe3ZhciByPXl2LmV4ZWMobi5zbGljZShlLGUrMykpO3JldHVybiByPyh0Lm09MCx0LmQ9K3JbMF0sZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gUnYodCxuLGUpe3ZhciByPXl2LmV4ZWMobi5zbGljZShlLGUrMikpO3JldHVybiByPyh0Lkg9K3JbMF0sZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gRnYodCxuLGUpe3ZhciByPXl2LmV4ZWMobi5zbGljZShlLGUrMikpO3JldHVybiByPyh0Lk09K3JbMF0sZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gcXYodCxuLGUpe3ZhciByPXl2LmV4ZWMobi5zbGljZShlLGUrMikpO3JldHVybiByPyh0LlM9K3JbMF0sZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gVXYodCxuLGUpe3ZhciByPXl2LmV4ZWMobi5zbGljZShlLGUrMykpO3JldHVybiByPyh0Lkw9K3JbMF0sZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gSXYodCxuLGUpe3ZhciByPXl2LmV4ZWMobi5zbGljZShlLGUrNikpO3JldHVybiByPyh0Lkw9TWF0aC5mbG9vcihyWzBdLzFlMyksZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gT3YodCxuLGUpe3ZhciByPXZ2LmV4ZWMobi5zbGljZShlLGUrMSkpO3JldHVybiByP2UrclswXS5sZW5ndGg6LTF9ZnVuY3Rpb24gQnYodCxuLGUpe3ZhciByPXl2LmV4ZWMobi5zbGljZShlKSk7cmV0dXJuIHI/KHQuUT0rclswXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBZdih0LG4sZSl7dmFyIHI9eXYuZXhlYyhuLnNsaWNlKGUpKTtyZXR1cm4gcj8odC5zPStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIEx2KHQsbil7cmV0dXJuIGJ2KHQuZ2V0RGF0ZSgpLG4sMil9ZnVuY3Rpb24ganYodCxuKXtyZXR1cm4gYnYodC5nZXRIb3VycygpLG4sMil9ZnVuY3Rpb24gSHYodCxuKXtyZXR1cm4gYnYodC5nZXRIb3VycygpJTEyfHwxMixuLDIpfWZ1bmN0aW9uIFh2KHQsbil7cmV0dXJuIGJ2KDErZ3kuY291bnQobnYodCksdCksbiwzKX1mdW5jdGlvbiBHdih0LG4pe3JldHVybiBidih0LmdldE1pbGxpc2Vjb25kcygpLG4sMyl9ZnVuY3Rpb24gVnYodCxuKXtyZXR1cm4gR3YodCxuKSsiMDAwIn1mdW5jdGlvbiBXdih0LG4pe3JldHVybiBidih0LmdldE1vbnRoKCkrMSxuLDIpfWZ1bmN0aW9uIFp2KHQsbil7cmV0dXJuIGJ2KHQuZ2V0TWludXRlcygpLG4sMil9ZnVuY3Rpb24gS3YodCxuKXtyZXR1cm4gYnYodC5nZXRTZWNvbmRzKCksbiwyKX1mdW5jdGlvbiBRdih0KXt2YXIgbj10LmdldERheSgpO3JldHVybiAwPT09bj83Om59ZnVuY3Rpb24gSnYodCxuKXtyZXR1cm4gYnYod3kuY291bnQobnYodCktMSx0KSxuLDIpfWZ1bmN0aW9uIHRfKHQpe3ZhciBuPXQuZ2V0RGF5KCk7cmV0dXJuIG4+PTR8fDA9PT1uP1N5KHQpOlN5LmNlaWwodCl9ZnVuY3Rpb24gbl8odCxuKXtyZXR1cm4gdD10Xyh0KSxidihTeS5jb3VudChudih0KSx0KSsoND09PW52KHQpLmdldERheSgpKSxuLDIpfWZ1bmN0aW9uIGVfKHQpe3JldHVybiB0LmdldERheSgpfWZ1bmN0aW9uIHJfKHQsbil7cmV0dXJuIGJ2KE15LmNvdW50KG52KHQpLTEsdCksbiwyKX1mdW5jdGlvbiBpXyh0LG4pe3JldHVybiBidih0LmdldEZ1bGxZZWFyKCklMTAwLG4sMil9ZnVuY3Rpb24gb18odCxuKXtyZXR1cm4gYnYoKHQ9dF8odCkpLmdldEZ1bGxZZWFyKCklMTAwLG4sMil9ZnVuY3Rpb24gYV8odCxuKXtyZXR1cm4gYnYodC5nZXRGdWxsWWVhcigpJTFlNCxuLDQpfWZ1bmN0aW9uIHVfKHQsbil7dmFyIGU9dC5nZXREYXkoKTtyZXR1cm4gYnYoKHQ9ZT49NHx8MD09PWU/U3kodCk6U3kuY2VpbCh0KSkuZ2V0RnVsbFllYXIoKSUxZTQsbiw0KX1mdW5jdGlvbiBjXyh0KXt2YXIgbj10LmdldFRpbWV6b25lT2Zmc2V0KCk7cmV0dXJuKG4+MD8iLSI6KG4qPS0xLCIrIikpK2J2KG4vNjB8MCwiMCIsMikrYnYobiU2MCwiMCIsMil9ZnVuY3Rpb24gZl8odCxuKXtyZXR1cm4gYnYodC5nZXRVVENEYXRlKCksbiwyKX1mdW5jdGlvbiBzXyh0LG4pe3JldHVybiBidih0LmdldFVUQ0hvdXJzKCksbiwyKX1mdW5jdGlvbiBsXyh0LG4pe3JldHVybiBidih0LmdldFVUQ0hvdXJzKCklMTJ8fDEyLG4sMil9ZnVuY3Rpb24gaF8odCxuKXtyZXR1cm4gYnYoMSt2eS5jb3VudChydih0KSx0KSxuLDMpfWZ1bmN0aW9uIGRfKHQsbil7cmV0dXJuIGJ2KHQuZ2V0VVRDTWlsbGlzZWNvbmRzKCksbiwzKX1mdW5jdGlvbiBwXyh0LG4pe3JldHVybiBkXyh0LG4pKyIwMDAifWZ1bmN0aW9uIGdfKHQsbil7cmV0dXJuIGJ2KHQuZ2V0VVRDTW9udGgoKSsxLG4sMil9ZnVuY3Rpb24geV8odCxuKXtyZXR1cm4gYnYodC5nZXRVVENNaW51dGVzKCksbiwyKX1mdW5jdGlvbiB2Xyh0LG4pe3JldHVybiBidih0LmdldFVUQ1NlY29uZHMoKSxuLDIpfWZ1bmN0aW9uIF9fKHQpe3ZhciBuPXQuZ2V0VVRDRGF5KCk7cmV0dXJuIDA9PT1uPzc6bn1mdW5jdGlvbiBiXyh0LG4pe3JldHVybiBidihxeS5jb3VudChydih0KS0xLHQpLG4sMil9ZnVuY3Rpb24gbV8odCl7dmFyIG49dC5nZXRVVENEYXkoKTtyZXR1cm4gbj49NHx8MD09PW4/QnkodCk6QnkuY2VpbCh0KX1mdW5jdGlvbiB4Xyh0LG4pe3JldHVybiB0PW1fKHQpLGJ2KEJ5LmNvdW50KHJ2KHQpLHQpKyg0PT09cnYodCkuZ2V0VVRDRGF5KCkpLG4sMil9ZnVuY3Rpb24gd18odCl7cmV0dXJuIHQuZ2V0VVRDRGF5KCl9ZnVuY3Rpb24gTV8odCxuKXtyZXR1cm4gYnYoVXkuY291bnQocnYodCktMSx0KSxuLDIpfWZ1bmN0aW9uIFRfKHQsbil7cmV0dXJuIGJ2KHQuZ2V0VVRDRnVsbFllYXIoKSUxMDAsbiwyKX1mdW5jdGlvbiBBXyh0LG4pe3JldHVybiBidigodD1tXyh0KSkuZ2V0VVRDRnVsbFllYXIoKSUxMDAsbiwyKX1mdW5jdGlvbiBTXyh0LG4pe3JldHVybiBidih0LmdldFVUQ0Z1bGxZZWFyKCklMWU0LG4sNCl9ZnVuY3Rpb24gRV8odCxuKXt2YXIgZT10LmdldFVUQ0RheSgpO3JldHVybiBidigodD1lPj00fHwwPT09ZT9CeSh0KTpCeS5jZWlsKHQpKS5nZXRVVENGdWxsWWVhcigpJTFlNCxuLDQpfWZ1bmN0aW9uIE5fKCl7cmV0dXJuIiswMDAwIn1mdW5jdGlvbiBrXygpe3JldHVybiIlIn1mdW5jdGlvbiBDXyh0KXtyZXR1cm4rdH1mdW5jdGlvbiBQXyh0KXtyZXR1cm4gTWF0aC5mbG9vcigrdC8xZTMpfWZ1bmN0aW9uIHpfKG4pe3JldHVybiBwdj1kdihuKSx0LnRpbWVGb3JtYXQ9cHYuZm9ybWF0LHQudGltZVBhcnNlPXB2LnBhcnNlLHQudXRjRm9ybWF0PXB2LnV0Y0Zvcm1hdCx0LnV0Y1BhcnNlPXB2LnV0Y1BhcnNlLHB2fXQudGltZUZvcm1hdD12b2lkIDAsdC50aW1lUGFyc2U9dm9pZCAwLHQudXRjRm9ybWF0PXZvaWQgMCx0LnV0Y1BhcnNlPXZvaWQgMCx6Xyh7ZGF0ZVRpbWU6IiV4LCAlWCIsZGF0ZToiJS1tLyUtZC8lWSIsdGltZToiJS1JOiVNOiVTICVwIixwZXJpb2RzOlsiQU0iLCJQTSJdLGRheXM6WyJTdW5kYXkiLCJNb25kYXkiLCJUdWVzZGF5IiwiV2VkbmVzZGF5IiwiVGh1cnNkYXkiLCJGcmlkYXkiLCJTYXR1cmRheSJdLHNob3J0RGF5czpbIlN1biIsIk1vbiIsIlR1ZSIsIldlZCIsIlRodSIsIkZyaSIsIlNhdCJdLG1vbnRoczpbIkphbnVhcnkiLCJGZWJydWFyeSIsIk1hcmNoIiwiQXByaWwiLCJNYXkiLCJKdW5lIiwiSnVseSIsIkF1Z3VzdCIsIlNlcHRlbWJlciIsIk9jdG9iZXIiLCJOb3ZlbWJlciIsIkRlY2VtYmVyIl0sc2hvcnRNb250aHM6WyJKYW4iLCJGZWIiLCJNYXIiLCJBcHIiLCJNYXkiLCJKdW4iLCJKdWwiLCJBdWciLCJTZXAiLCJPY3QiLCJOb3YiLCJEZWMiXX0pO3ZhciAkXz0iJVktJW0tJWRUJUg6JU06JVMuJUxaIjt2YXIgRF89RGF0ZS5wcm90b3R5cGUudG9JU09TdHJpbmc/ZnVuY3Rpb24odCl7cmV0dXJuIHQudG9JU09TdHJpbmcoKX06dC51dGNGb3JtYXQoJF8pLFJfPURfO3ZhciBGXz0rbmV3IERhdGUoIjIwMDAtMDEtMDFUMDA6MDA6MDAuMDAwWiIpP2Z1bmN0aW9uKHQpe3ZhciBuPW5ldyBEYXRlKHQpO3JldHVybiBpc05hTihuKT9udWxsOm59OnQudXRjUGFyc2UoJF8pLHFfPUZfO2Z1bmN0aW9uIFVfKHQpe3JldHVybiBuZXcgRGF0ZSh0KX1mdW5jdGlvbiBJXyh0KXtyZXR1cm4gdCBpbnN0YW5jZW9mIERhdGU/K3Q6K25ldyBEYXRlKCt0KX1mdW5jdGlvbiBPXyh0LG4sZSxyLGksbyxhLHUsYyxmKXt2YXIgcz1FZygpLGw9cy5pbnZlcnQsaD1zLmRvbWFpbixkPWYoIi4lTCIpLHA9ZigiOiVTIiksZz1mKCIlSTolTSIpLHk9ZigiJUkgJXAiKSx2PWYoIiVhICVkIiksXz1mKCIlYiAlZCIpLGI9ZigiJUIiKSxtPWYoIiVZIik7ZnVuY3Rpb24geCh0KXtyZXR1cm4oYyh0KTx0P2Q6dSh0KTx0P3A6YSh0KTx0P2c6byh0KTx0P3k6cih0KTx0P2kodCk8dD92Ol86ZSh0KTx0P2I6bSkodCl9cmV0dXJuIHMuaW52ZXJ0PWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgRGF0ZShsKHQpKX0scy5kb21haW49ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/aChBcnJheS5mcm9tKHQsSV8pKTpoKCkubWFwKFVfKX0scy50aWNrcz1mdW5jdGlvbihuKXt2YXIgZT1oKCk7cmV0dXJuIHQoZVswXSxlW2UubGVuZ3RoLTFdLG51bGw9PW4/MTA6bil9LHMudGlja0Zvcm1hdD1mdW5jdGlvbih0LG4pe3JldHVybiBudWxsPT1uP3g6ZihuKX0scy5uaWNlPWZ1bmN0aW9uKHQpe3ZhciBlPWgoKTtyZXR1cm4gdCYmImZ1bmN0aW9uIj09dHlwZW9mIHQucmFuZ2V8fCh0PW4oZVswXSxlW2UubGVuZ3RoLTFdLG51bGw9PXQ/MTA6dCkpLHQ/aChDZyhlLHQpKTpzfSxzLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gQWcocyxPXyh0LG4sZSxyLGksbyxhLHUsYyxmKSl9LHN9ZnVuY3Rpb24gQl8oKXt2YXIgdCxuLGUscixpLG89MCxhPTEsdT14ZyxjPSExO2Z1bmN0aW9uIGYobil7cmV0dXJuIG51bGw9PW58fGlzTmFOKG49K24pP2k6dSgwPT09ZT8uNToobj0ocihuKS10KSplLGM/TWF0aC5tYXgoMCxNYXRoLm1pbigxLG4pKTpuKSl9ZnVuY3Rpb24gcyh0KXtyZXR1cm4gZnVuY3Rpb24obil7dmFyIGUscjtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oW2Uscl09bix1PXQoZSxyKSxmKTpbdSgwKSx1KDEpXX19cmV0dXJuIGYuZG9tYWluPWZ1bmN0aW9uKGkpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhbbyxhXT1pLHQ9cihvPStvKSxuPXIoYT0rYSksZT10PT09bj8wOjEvKG4tdCksZik6W28sYV19LGYuY2xhbXA9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGM9ISF0LGYpOmN9LGYuaW50ZXJwb2xhdG9yPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PXQsZik6dX0sZi5yYW5nZT1zKFZyKSxmLnJhbmdlUm91bmQ9cyhXciksZi51bmtub3duPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPXQsZik6aX0sZnVuY3Rpb24oaSl7cmV0dXJuIHI9aSx0PWkobyksbj1pKGEpLGU9dD09PW4/MDoxLyhuLXQpLGZ9fWZ1bmN0aW9uIFlfKHQsbil7cmV0dXJuIG4uZG9tYWluKHQuZG9tYWluKCkpLmludGVycG9sYXRvcih0LmludGVycG9sYXRvcigpKS5jbGFtcCh0LmNsYW1wKCkpLnVua25vd24odC51bmtub3duKCkpfWZ1bmN0aW9uIExfKCl7dmFyIHQ9amcoQl8oKSk7cmV0dXJuIHQuY29weT1mdW5jdGlvbigpe3JldHVybiBZXyh0LExfKCkpLmV4cG9uZW50KHQuZXhwb25lbnQoKSl9LHBnLmFwcGx5KHQsYXJndW1lbnRzKX1mdW5jdGlvbiBqXygpe3ZhciB0LG4sZSxyLGksbyxhLHU9MCxjPS41LGY9MSxzPTEsbD14ZyxoPSExO2Z1bmN0aW9uIGQodCl7cmV0dXJuIGlzTmFOKHQ9K3QpP2E6KHQ9LjUrKCh0PStvKHQpKS1uKSoocyp0PHMqbj9yOmkpLGwoaD9NYXRoLm1heCgwLE1hdGgubWluKDEsdCkpOnQpKX1mdW5jdGlvbiBwKHQpe3JldHVybiBmdW5jdGlvbihuKXt2YXIgZSxyLGk7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KFtlLHIsaV09bixsPXBpKHQsW2UscixpXSksZCk6W2woMCksbCguNSksbCgxKV19fXJldHVybiBkLmRvbWFpbj1mdW5jdGlvbihhKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oW3UsYyxmXT1hLHQ9byh1PSt1KSxuPW8oYz0rYyksZT1vKGY9K2YpLHI9dD09PW4/MDouNS8obi10KSxpPW49PT1lPzA6LjUvKGUtbikscz1uPHQ/LTE6MSxkKTpbdSxjLGZdfSxkLmNsYW1wPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhoPSEhdCxkKTpofSxkLmludGVycG9sYXRvcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obD10LGQpOmx9LGQucmFuZ2U9cChWciksZC5yYW5nZVJvdW5kPXAoV3IpLGQudW5rbm93bj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYT10LGQpOmF9LGZ1bmN0aW9uKGEpe3JldHVybiBvPWEsdD1hKHUpLG49YShjKSxlPWEoZikscj10PT09bj8wOi41LyhuLXQpLGk9bj09PWU/MDouNS8oZS1uKSxzPW48dD8tMToxLGR9fWZ1bmN0aW9uIEhfKCl7dmFyIHQ9amcoal8oKSk7cmV0dXJuIHQuY29weT1mdW5jdGlvbigpe3JldHVybiBZXyh0LEhfKCkpLmV4cG9uZW50KHQuZXhwb25lbnQoKSl9LHBnLmFwcGx5KHQsYXJndW1lbnRzKX1mdW5jdGlvbiBYXyh0KXtmb3IodmFyIG49dC5sZW5ndGgvNnwwLGU9bmV3IEFycmF5KG4pLHI9MDtyPG47KWVbcl09IiMiK3Quc2xpY2UoNipyLDYqKytyKTtyZXR1cm4gZX12YXIgR189WF8oIjFmNzdiNGZmN2YwZTJjYTAyY2Q2MjcyODk0NjdiZDhjNTY0YmUzNzdjMjdmN2Y3ZmJjYmQyMjE3YmVjZiIpLFZfPVhfKCI3ZmM5N2ZiZWFlZDRmZGMwODZmZmZmOTkzODZjYjBmMDAyN2ZiZjViMTc2NjY2NjYiKSxXXz1YXygiMWI5ZTc3ZDk1ZjAyNzU3MGIzZTcyOThhNjZhNjFlZTZhYjAyYTY3NjFkNjY2NjY2IiksWl89WF8oImE2Y2VlMzFmNzhiNGIyZGY4YTMzYTAyY2ZiOWE5OWUzMWExY2ZkYmY2ZmZmN2YwMGNhYjJkNjZhM2Q5YWZmZmY5OWIxNTkyOCIpLEtfPVhfKCJmYmI0YWViM2NkZTNjY2ViYzVkZWNiZTRmZWQ5YTZmZmZmY2NlNWQ4YmRmZGRhZWNmMmYyZjIiKSxRXz1YXygiYjNlMmNkZmRjZGFjY2JkNWU4ZjRjYWU0ZTZmNWM5ZmZmMmFlZjFlMmNjY2NjY2NjIiksSl89WF8oImU0MWExYzM3N2ViODRkYWY0YTk4NGVhM2ZmN2YwMGZmZmYzM2E2NTYyOGY3ODFiZjk5OTk5OSIpLHRiPVhfKCI2NmMyYTVmYzhkNjI4ZGEwY2JlNzhhYzNhNmQ4NTRmZmQ5MmZlNWM0OTRiM2IzYjMiKSxuYj1YXygiOGRkM2M3ZmZmZmIzYmViYWRhZmI4MDcyODBiMWQzZmRiNDYyYjNkZTY5ZmNjZGU1ZDlkOWQ5YmM4MGJkY2NlYmM1ZmZlZDZmIiksZWI9WF8oIjRlNzlhN2YyOGUyY2UxNTc1OTc2YjdiMjU5YTE0ZmVkYzk0OWFmN2FhMWZmOWRhNzljNzU1ZmJhYjBhYiIpLHJiPXQ9PnFyKHRbdC5sZW5ndGgtMV0pLGliPW5ldyBBcnJheSgzKS5jb25jYXQoImQ4YjM2NWY1ZjVmNTVhYjRhYyIsImE2NjExYWRmYzI3ZDgwY2RjMTAxODU3MSIsImE2NjExYWRmYzI3ZGY1ZjVmNTgwY2RjMTAxODU3MSIsIjhjNTEwYWQ4YjM2NWY2ZThjM2M3ZWFlNTVhYjRhYzAxNjY1ZSIsIjhjNTEwYWQ4YjM2NWY2ZThjM2Y1ZjVmNWM3ZWFlNTVhYjRhYzAxNjY1ZSIsIjhjNTEwYWJmODEyZGRmYzI3ZGY2ZThjM2M3ZWFlNTgwY2RjMTM1OTc4ZjAxNjY1ZSIsIjhjNTEwYWJmODEyZGRmYzI3ZGY2ZThjM2Y1ZjVmNWM3ZWFlNTgwY2RjMTM1OTc4ZjAxNjY1ZSIsIjU0MzAwNThjNTEwYWJmODEyZGRmYzI3ZGY2ZThjM2M3ZWFlNTgwY2RjMTM1OTc4ZjAxNjY1ZTAwM2MzMCIsIjU0MzAwNThjNTEwYWJmODEyZGRmYzI3ZGY2ZThjM2Y1ZjVmNWM3ZWFlNTgwY2RjMTM1OTc4ZjAxNjY1ZTAwM2MzMCIpLm1hcChYXyksb2I9cmIoaWIpLGFiPW5ldyBBcnJheSgzKS5jb25jYXQoImFmOGRjM2Y3ZjdmNzdmYmY3YiIsIjdiMzI5NGMyYTVjZmE2ZGJhMDAwODgzNyIsIjdiMzI5NGMyYTVjZmY3ZjdmN2E2ZGJhMDAwODgzNyIsIjc2MmE4M2FmOGRjM2U3ZDRlOGQ5ZjBkMzdmYmY3YjFiNzgzNyIsIjc2MmE4M2FmOGRjM2U3ZDRlOGY3ZjdmN2Q5ZjBkMzdmYmY3YjFiNzgzNyIsIjc2MmE4Mzk5NzBhYmMyYTVjZmU3ZDRlOGQ5ZjBkM2E2ZGJhMDVhYWU2MTFiNzgzNyIsIjc2MmE4Mzk5NzBhYmMyYTVjZmU3ZDRlOGY3ZjdmN2Q5ZjBkM2E2ZGJhMDVhYWU2MTFiNzgzNyIsIjQwMDA0Yjc2MmE4Mzk5NzBhYmMyYTVjZmU3ZDRlOGQ5ZjBkM2E2ZGJhMDVhYWU2MTFiNzgzNzAwNDQxYiIsIjQwMDA0Yjc2MmE4Mzk5NzBhYmMyYTVjZmU3ZDRlOGY3ZjdmN2Q5ZjBkM2E2ZGJhMDVhYWU2MTFiNzgzNzAwNDQxYiIpLm1hcChYXyksdWI9cmIoYWIpLGNiPW5ldyBBcnJheSgzKS5jb25jYXQoImU5YTNjOWY3ZjdmN2ExZDc2YSIsImQwMWM4YmYxYjZkYWI4ZTE4NjRkYWMyNiIsImQwMWM4YmYxYjZkYWY3ZjdmN2I4ZTE4NjRkYWMyNiIsImM1MWI3ZGU5YTNjOWZkZTBlZmU2ZjVkMGExZDc2YTRkOTIyMSIsImM1MWI3ZGU5YTNjOWZkZTBlZmY3ZjdmN2U2ZjVkMGExZDc2YTRkOTIyMSIsImM1MWI3ZGRlNzdhZWYxYjZkYWZkZTBlZmU2ZjVkMGI4ZTE4NjdmYmM0MTRkOTIyMSIsImM1MWI3ZGRlNzdhZWYxYjZkYWZkZTBlZmY3ZjdmN2U2ZjVkMGI4ZTE4NjdmYmM0MTRkOTIyMSIsIjhlMDE1MmM1MWI3ZGRlNzdhZWYxYjZkYWZkZTBlZmU2ZjVkMGI4ZTE4NjdmYmM0MTRkOTIyMTI3NjQxOSIsIjhlMDE1MmM1MWI3ZGRlNzdhZWYxYjZkYWZkZTBlZmY3ZjdmN2U2ZjVkMGI4ZTE4NjdmYmM0MTRkOTIyMTI3NjQxOSIpLm1hcChYXyksZmI9cmIoY2IpLHNiPW5ldyBBcnJheSgzKS5jb25jYXQoIjk5OGVjM2Y3ZjdmN2YxYTM0MCIsIjVlM2M5OWIyYWJkMmZkYjg2M2U2NjEwMSIsIjVlM2M5OWIyYWJkMmY3ZjdmN2ZkYjg2M2U2NjEwMSIsIjU0Mjc4ODk5OGVjM2Q4ZGFlYmZlZTBiNmYxYTM0MGIzNTgwNiIsIjU0Mjc4ODk5OGVjM2Q4ZGFlYmY3ZjdmN2ZlZTBiNmYxYTM0MGIzNTgwNiIsIjU0Mjc4ODgwNzNhY2IyYWJkMmQ4ZGFlYmZlZTBiNmZkYjg2M2UwODIxNGIzNTgwNiIsIjU0Mjc4ODgwNzNhY2IyYWJkMmQ4ZGFlYmY3ZjdmN2ZlZTBiNmZkYjg2M2UwODIxNGIzNTgwNiIsIjJkMDA0YjU0Mjc4ODgwNzNhY2IyYWJkMmQ4ZGFlYmZlZTBiNmZkYjg2M2UwODIxNGIzNTgwNjdmM2IwOCIsIjJkMDA0YjU0Mjc4ODgwNzNhY2IyYWJkMmQ4ZGFlYmY3ZjdmN2ZlZTBiNmZkYjg2M2UwODIxNGIzNTgwNjdmM2IwOCIpLm1hcChYXyksbGI9cmIoc2IpLGhiPW5ldyBBcnJheSgzKS5jb25jYXQoImVmOGE2MmY3ZjdmNzY3YTljZiIsImNhMDAyMGY0YTU4MjkyYzVkZTA1NzFiMCIsImNhMDAyMGY0YTU4MmY3ZjdmNzkyYzVkZTA1NzFiMCIsImIyMTgyYmVmOGE2MmZkZGJjN2QxZTVmMDY3YTljZjIxNjZhYyIsImIyMTgyYmVmOGE2MmZkZGJjN2Y3ZjdmN2QxZTVmMDY3YTljZjIxNjZhYyIsImIyMTgyYmQ2NjA0ZGY0YTU4MmZkZGJjN2QxZTVmMDkyYzVkZTQzOTNjMzIxNjZhYyIsImIyMTgyYmQ2NjA0ZGY0YTU4MmZkZGJjN2Y3ZjdmN2QxZTVmMDkyYzVkZTQzOTNjMzIxNjZhYyIsIjY3MDAxZmIyMTgyYmQ2NjA0ZGY0YTU4MmZkZGJjN2QxZTVmMDkyYzVkZTQzOTNjMzIxNjZhYzA1MzA2MSIsIjY3MDAxZmIyMTgyYmQ2NjA0ZGY0YTU4MmZkZGJjN2Y3ZjdmN2QxZTVmMDkyYzVkZTQzOTNjMzIxNjZhYzA1MzA2MSIpLm1hcChYXyksZGI9cmIoaGIpLHBiPW5ldyBBcnJheSgzKS5jb25jYXQoImVmOGE2MmZmZmZmZjk5OTk5OSIsImNhMDAyMGY0YTU4MmJhYmFiYTQwNDA0MCIsImNhMDAyMGY0YTU4MmZmZmZmZmJhYmFiYTQwNDA0MCIsImIyMTgyYmVmOGE2MmZkZGJjN2UwZTBlMDk5OTk5OTRkNGQ0ZCIsImIyMTgyYmVmOGE2MmZkZGJjN2ZmZmZmZmUwZTBlMDk5OTk5OTRkNGQ0ZCIsImIyMTgyYmQ2NjA0ZGY0YTU4MmZkZGJjN2UwZTBlMGJhYmFiYTg3ODc4NzRkNGQ0ZCIsImIyMTgyYmQ2NjA0ZGY0YTU4MmZkZGJjN2ZmZmZmZmUwZTBlMGJhYmFiYTg3ODc4NzRkNGQ0ZCIsIjY3MDAxZmIyMTgyYmQ2NjA0ZGY0YTU4MmZkZGJjN2UwZTBlMGJhYmFiYTg3ODc4NzRkNGQ0ZDFhMWExYSIsIjY3MDAxZmIyMTgyYmQ2NjA0ZGY0YTU4MmZkZGJjN2ZmZmZmZmUwZTBlMGJhYmFiYTg3ODc4NzRkNGQ0ZDFhMWExYSIpLm1hcChYXyksZ2I9cmIocGIpLHliPW5ldyBBcnJheSgzKS5jb25jYXQoImZjOGQ1OWZmZmZiZjkxYmZkYiIsImQ3MTkxY2ZkYWU2MWFiZDllOTJjN2JiNiIsImQ3MTkxY2ZkYWU2MWZmZmZiZmFiZDllOTJjN2JiNiIsImQ3MzAyN2ZjOGQ1OWZlZTA5MGUwZjNmODkxYmZkYjQ1NzViNCIsImQ3MzAyN2ZjOGQ1OWZlZTA5MGZmZmZiZmUwZjNmODkxYmZkYjQ1NzViNCIsImQ3MzAyN2Y0NmQ0M2ZkYWU2MWZlZTA5MGUwZjNmOGFiZDllOTc0YWRkMTQ1NzViNCIsImQ3MzAyN2Y0NmQ0M2ZkYWU2MWZlZTA5MGZmZmZiZmUwZjNmOGFiZDllOTc0YWRkMTQ1NzViNCIsImE1MDAyNmQ3MzAyN2Y0NmQ0M2ZkYWU2MWZlZTA5MGUwZjNmOGFiZDllOTc0YWRkMTQ1NzViNDMxMzY5NSIsImE1MDAyNmQ3MzAyN2Y0NmQ0M2ZkYWU2MWZlZTA5MGZmZmZiZmUwZjNmOGFiZDllOTc0YWRkMTQ1NzViNDMxMzY5NSIpLm1hcChYXyksdmI9cmIoeWIpLF9iPW5ldyBBcnJheSgzKS5jb25jYXQoImZjOGQ1OWZmZmZiZjkxY2Y2MCIsImQ3MTkxY2ZkYWU2MWE2ZDk2YTFhOTY0MSIsImQ3MTkxY2ZkYWU2MWZmZmZiZmE2ZDk2YTFhOTY0MSIsImQ3MzAyN2ZjOGQ1OWZlZTA4YmQ5ZWY4YjkxY2Y2MDFhOTg1MCIsImQ3MzAyN2ZjOGQ1OWZlZTA4YmZmZmZiZmQ5ZWY4YjkxY2Y2MDFhOTg1MCIsImQ3MzAyN2Y0NmQ0M2ZkYWU2MWZlZTA4YmQ5ZWY4YmE2ZDk2YTY2YmQ2MzFhOTg1MCIsImQ3MzAyN2Y0NmQ0M2ZkYWU2MWZlZTA4YmZmZmZiZmQ5ZWY4YmE2ZDk2YTY2YmQ2MzFhOTg1MCIsImE1MDAyNmQ3MzAyN2Y0NmQ0M2ZkYWU2MWZlZTA4YmQ5ZWY4YmE2ZDk2YTY2YmQ2MzFhOTg1MDAwNjgzNyIsImE1MDAyNmQ3MzAyN2Y0NmQ0M2ZkYWU2MWZlZTA4YmZmZmZiZmQ5ZWY4YmE2ZDk2YTY2YmQ2MzFhOTg1MDAwNjgzNyIpLm1hcChYXyksYmI9cmIoX2IpLG1iPW5ldyBBcnJheSgzKS5jb25jYXQoImZjOGQ1OWZmZmZiZjk5ZDU5NCIsImQ3MTkxY2ZkYWU2MWFiZGRhNDJiODNiYSIsImQ3MTkxY2ZkYWU2MWZmZmZiZmFiZGRhNDJiODNiYSIsImQ1M2U0ZmZjOGQ1OWZlZTA4YmU2ZjU5ODk5ZDU5NDMyODhiZCIsImQ1M2U0ZmZjOGQ1OWZlZTA4YmZmZmZiZmU2ZjU5ODk5ZDU5NDMyODhiZCIsImQ1M2U0ZmY0NmQ0M2ZkYWU2MWZlZTA4YmU2ZjU5OGFiZGRhNDY2YzJhNTMyODhiZCIsImQ1M2U0ZmY0NmQ0M2ZkYWU2MWZlZTA4YmZmZmZiZmU2ZjU5OGFiZGRhNDY2YzJhNTMyODhiZCIsIjllMDE0MmQ1M2U0ZmY0NmQ0M2ZkYWU2MWZlZTA4YmU2ZjU5OGFiZGRhNDY2YzJhNTMyODhiZDVlNGZhMiIsIjllMDE0MmQ1M2U0ZmY0NmQ0M2ZkYWU2MWZlZTA4YmZmZmZiZmU2ZjU5OGFiZGRhNDY2YzJhNTMyODhiZDVlNGZhMiIpLm1hcChYXykseGI9cmIobWIpLHdiPW5ldyBBcnJheSgzKS5jb25jYXQoImU1ZjVmOTk5ZDhjOTJjYTI1ZiIsImVkZjhmYmIyZTJlMjY2YzJhNDIzOGI0NSIsImVkZjhmYmIyZTJlMjY2YzJhNDJjYTI1ZjAwNmQyYyIsImVkZjhmYmNjZWNlNjk5ZDhjOTY2YzJhNDJjYTI1ZjAwNmQyYyIsImVkZjhmYmNjZWNlNjk5ZDhjOTY2YzJhNDQxYWU3NjIzOGI0NTAwNTgyNCIsImY3ZmNmZGU1ZjVmOWNjZWNlNjk5ZDhjOTY2YzJhNDQxYWU3NjIzOGI0NTAwNTgyNCIsImY3ZmNmZGU1ZjVmOWNjZWNlNjk5ZDhjOTY2YzJhNDQxYWU3NjIzOGI0NTAwNmQyYzAwNDQxYiIpLm1hcChYXyksTWI9cmIod2IpLFRiPW5ldyBBcnJheSgzKS5jb25jYXQoImUwZWNmNDllYmNkYTg4NTZhNyIsImVkZjhmYmIzY2RlMzhjOTZjNjg4NDE5ZCIsImVkZjhmYmIzY2RlMzhjOTZjNjg4NTZhNzgxMGY3YyIsImVkZjhmYmJmZDNlNjllYmNkYThjOTZjNjg4NTZhNzgxMGY3YyIsImVkZjhmYmJmZDNlNjllYmNkYThjOTZjNjhjNmJiMTg4NDE5ZDZlMDE2YiIsImY3ZmNmZGUwZWNmNGJmZDNlNjllYmNkYThjOTZjNjhjNmJiMTg4NDE5ZDZlMDE2YiIsImY3ZmNmZGUwZWNmNGJmZDNlNjllYmNkYThjOTZjNjhjNmJiMTg4NDE5ZDgxMGY3YzRkMDA0YiIpLm1hcChYXyksQWI9cmIoVGIpLFNiPW5ldyBBcnJheSgzKS5jb25jYXQoImUwZjNkYmE4ZGRiNTQzYTJjYSIsImYwZjllOGJhZTRiYzdiY2NjNDJiOGNiZSIsImYwZjllOGJhZTRiYzdiY2NjNDQzYTJjYTA4NjhhYyIsImYwZjllOGNjZWJjNWE4ZGRiNTdiY2NjNDQzYTJjYTA4NjhhYyIsImYwZjllOGNjZWJjNWE4ZGRiNTdiY2NjNDRlYjNkMzJiOGNiZTA4NTg5ZSIsImY3ZmNmMGUwZjNkYmNjZWJjNWE4ZGRiNTdiY2NjNDRlYjNkMzJiOGNiZTA4NTg5ZSIsImY3ZmNmMGUwZjNkYmNjZWJjNWE4ZGRiNTdiY2NjNDRlYjNkMzJiOGNiZTA4NjhhYzA4NDA4MSIpLm1hcChYXyksRWI9cmIoU2IpLE5iPW5ldyBBcnJheSgzKS5jb25jYXQoImZlZThjOGZkYmI4NGUzNGEzMyIsImZlZjBkOWZkY2M4YWZjOGQ1OWQ3MzAxZiIsImZlZjBkOWZkY2M4YWZjOGQ1OWUzNGEzM2IzMDAwMCIsImZlZjBkOWZkZDQ5ZWZkYmI4NGZjOGQ1OWUzNGEzM2IzMDAwMCIsImZlZjBkOWZkZDQ5ZWZkYmI4NGZjOGQ1OWVmNjU0OGQ3MzAxZjk5MDAwMCIsImZmZjdlY2ZlZThjOGZkZDQ5ZWZkYmI4NGZjOGQ1OWVmNjU0OGQ3MzAxZjk5MDAwMCIsImZmZjdlY2ZlZThjOGZkZDQ5ZWZkYmI4NGZjOGQ1OWVmNjU0OGQ3MzAxZmIzMDAwMDdmMDAwMCIpLm1hcChYXyksa2I9cmIoTmIpLENiPW5ldyBBcnJheSgzKS5jb25jYXQoImVjZTJmMGE2YmRkYjFjOTA5OSIsImY2ZWZmN2JkYzllMTY3YTljZjAyODE4YSIsImY2ZWZmN2JkYzllMTY3YTljZjFjOTA5OTAxNmM1OSIsImY2ZWZmN2QwZDFlNmE2YmRkYjY3YTljZjFjOTA5OTAxNmM1OSIsImY2ZWZmN2QwZDFlNmE2YmRkYjY3YTljZjM2OTBjMDAyODE4YTAxNjQ1MCIsImZmZjdmYmVjZTJmMGQwZDFlNmE2YmRkYjY3YTljZjM2OTBjMDAyODE4YTAxNjQ1MCIsImZmZjdmYmVjZTJmMGQwZDFlNmE2YmRkYjY3YTljZjM2OTBjMDAyODE4YTAxNmM1OTAxNDYzNiIpLm1hcChYXyksUGI9cmIoQ2IpLHpiPW5ldyBBcnJheSgzKS5jb25jYXQoImVjZTdmMmE2YmRkYjJiOGNiZSIsImYxZWVmNmJkYzllMTc0YTljZjA1NzBiMCIsImYxZWVmNmJkYzllMTc0YTljZjJiOGNiZTA0NWE4ZCIsImYxZWVmNmQwZDFlNmE2YmRkYjc0YTljZjJiOGNiZTA0NWE4ZCIsImYxZWVmNmQwZDFlNmE2YmRkYjc0YTljZjM2OTBjMDA1NzBiMDAzNGU3YiIsImZmZjdmYmVjZTdmMmQwZDFlNmE2YmRkYjc0YTljZjM2OTBjMDA1NzBiMDAzNGU3YiIsImZmZjdmYmVjZTdmMmQwZDFlNmE2YmRkYjc0YTljZjM2OTBjMDA1NzBiMDA0NWE4ZDAyMzg1OCIpLm1hcChYXyksJGI9cmIoemIpLERiPW5ldyBBcnJheSgzKS5jb25jYXQoImU3ZTFlZmM5OTRjN2RkMWM3NyIsImYxZWVmNmQ3YjVkOGRmNjViMGNlMTI1NiIsImYxZWVmNmQ3YjVkOGRmNjViMGRkMWM3Nzk4MDA0MyIsImYxZWVmNmQ0YjlkYWM5OTRjN2RmNjViMGRkMWM3Nzk4MDA0MyIsImYxZWVmNmQ0YjlkYWM5OTRjN2RmNjViMGU3Mjk4YWNlMTI1NjkxMDAzZiIsImY3ZjRmOWU3ZTFlZmQ0YjlkYWM5OTRjN2RmNjViMGU3Mjk4YWNlMTI1NjkxMDAzZiIsImY3ZjRmOWU3ZTFlZmQ0YjlkYWM5OTRjN2RmNjViMGU3Mjk4YWNlMTI1Njk4MDA0MzY3MDAxZiIpLm1hcChYXyksUmI9cmIoRGIpLEZiPW5ldyBBcnJheSgzKS5jb25jYXQoImZkZTBkZGZhOWZiNWM1MWI4YSIsImZlZWJlMmZiYjRiOWY3NjhhMWFlMDE3ZSIsImZlZWJlMmZiYjRiOWY3NjhhMWM1MWI4YTdhMDE3NyIsImZlZWJlMmZjYzVjMGZhOWZiNWY3NjhhMWM1MWI4YTdhMDE3NyIsImZlZWJlMmZjYzVjMGZhOWZiNWY3NjhhMWRkMzQ5N2FlMDE3ZTdhMDE3NyIsImZmZjdmM2ZkZTBkZGZjYzVjMGZhOWZiNWY3NjhhMWRkMzQ5N2FlMDE3ZTdhMDE3NyIsImZmZjdmM2ZkZTBkZGZjYzVjMGZhOWZiNWY3NjhhMWRkMzQ5N2FlMDE3ZTdhMDE3NzQ5MDA2YSIpLm1hcChYXykscWI9cmIoRmIpLFViPW5ldyBBcnJheSgzKS5jb25jYXQoImVkZjhiMTdmY2RiYjJjN2ZiOCIsImZmZmZjY2ExZGFiNDQxYjZjNDIyNWVhOCIsImZmZmZjY2ExZGFiNDQxYjZjNDJjN2ZiODI1MzQ5NCIsImZmZmZjY2M3ZTliNDdmY2RiYjQxYjZjNDJjN2ZiODI1MzQ5NCIsImZmZmZjY2M3ZTliNDdmY2RiYjQxYjZjNDFkOTFjMDIyNWVhODBjMmM4NCIsImZmZmZkOWVkZjhiMWM3ZTliNDdmY2RiYjQxYjZjNDFkOTFjMDIyNWVhODBjMmM4NCIsImZmZmZkOWVkZjhiMWM3ZTliNDdmY2RiYjQxYjZjNDFkOTFjMDIyNWVhODI1MzQ5NDA4MWQ1OCIpLm1hcChYXyksSWI9cmIoVWIpLE9iPW5ldyBBcnJheSgzKS5jb25jYXQoImY3ZmNiOWFkZGQ4ZTMxYTM1NCIsImZmZmZjY2MyZTY5OTc4YzY3OTIzODQ0MyIsImZmZmZjY2MyZTY5OTc4YzY3OTMxYTM1NDAwNjgzNyIsImZmZmZjY2Q5ZjBhM2FkZGQ4ZTc4YzY3OTMxYTM1NDAwNjgzNyIsImZmZmZjY2Q5ZjBhM2FkZGQ4ZTc4YzY3OTQxYWI1ZDIzODQ0MzAwNWEzMiIsImZmZmZlNWY3ZmNiOWQ5ZjBhM2FkZGQ4ZTc4YzY3OTQxYWI1ZDIzODQ0MzAwNWEzMiIsImZmZmZlNWY3ZmNiOWQ5ZjBhM2FkZGQ4ZTc4YzY3OTQxYWI1ZDIzODQ0MzAwNjgzNzAwNDUyOSIpLm1hcChYXyksQmI9cmIoT2IpLFliPW5ldyBBcnJheSgzKS5jb25jYXQoImZmZjdiY2ZlYzQ0ZmQ5NWYwZSIsImZmZmZkNGZlZDk4ZWZlOTkyOWNjNGMwMiIsImZmZmZkNGZlZDk4ZWZlOTkyOWQ5NWYwZTk5MzQwNCIsImZmZmZkNGZlZTM5MWZlYzQ0ZmZlOTkyOWQ5NWYwZTk5MzQwNCIsImZmZmZkNGZlZTM5MWZlYzQ0ZmZlOTkyOWVjNzAxNGNjNGMwMjhjMmQwNCIsImZmZmZlNWZmZjdiY2ZlZTM5MWZlYzQ0ZmZlOTkyOWVjNzAxNGNjNGMwMjhjMmQwNCIsImZmZmZlNWZmZjdiY2ZlZTM5MWZlYzQ0ZmZlOTkyOWVjNzAxNGNjNGMwMjk5MzQwNDY2MjUwNiIpLm1hcChYXyksTGI9cmIoWWIpLGpiPW5ldyBBcnJheSgzKS5jb25jYXQoImZmZWRhMGZlYjI0Y2YwM2IyMCIsImZmZmZiMmZlY2M1Y2ZkOGQzY2UzMWExYyIsImZmZmZiMmZlY2M1Y2ZkOGQzY2YwM2IyMGJkMDAyNiIsImZmZmZiMmZlZDk3NmZlYjI0Y2ZkOGQzY2YwM2IyMGJkMDAyNiIsImZmZmZiMmZlZDk3NmZlYjI0Y2ZkOGQzY2ZjNGUyYWUzMWExY2IxMDAyNiIsImZmZmZjY2ZmZWRhMGZlZDk3NmZlYjI0Y2ZkOGQzY2ZjNGUyYWUzMWExY2IxMDAyNiIsImZmZmZjY2ZmZWRhMGZlZDk3NmZlYjI0Y2ZkOGQzY2ZjNGUyYWUzMWExY2JkMDAyNjgwMDAyNiIpLm1hcChYXyksSGI9cmIoamIpLFhiPW5ldyBBcnJheSgzKS5jb25jYXQoImRlZWJmNzllY2FlMTMxODJiZCIsImVmZjNmZmJkZDdlNzZiYWVkNjIxNzFiNSIsImVmZjNmZmJkZDdlNzZiYWVkNjMxODJiZDA4NTE5YyIsImVmZjNmZmM2ZGJlZjllY2FlMTZiYWVkNjMxODJiZDA4NTE5YyIsImVmZjNmZmM2ZGJlZjllY2FlMTZiYWVkNjQyOTJjNjIxNzFiNTA4NDU5NCIsImY3ZmJmZmRlZWJmN2M2ZGJlZjllY2FlMTZiYWVkNjQyOTJjNjIxNzFiNTA4NDU5NCIsImY3ZmJmZmRlZWJmN2M2ZGJlZjllY2FlMTZiYWVkNjQyOTJjNjIxNzFiNTA4NTE5YzA4MzA2YiIpLm1hcChYXyksR2I9cmIoWGIpLFZiPW5ldyBBcnJheSgzKS5jb25jYXQoImU1ZjVlMGExZDk5YjMxYTM1NCIsImVkZjhlOWJhZTRiMzc0YzQ3NjIzOGI0NSIsImVkZjhlOWJhZTRiMzc0YzQ3NjMxYTM1NDAwNmQyYyIsImVkZjhlOWM3ZTljMGExZDk5Yjc0YzQ3NjMxYTM1NDAwNmQyYyIsImVkZjhlOWM3ZTljMGExZDk5Yjc0YzQ3NjQxYWI1ZDIzOGI0NTAwNWEzMiIsImY3ZmNmNWU1ZjVlMGM3ZTljMGExZDk5Yjc0YzQ3NjQxYWI1ZDIzOGI0NTAwNWEzMiIsImY3ZmNmNWU1ZjVlMGM3ZTljMGExZDk5Yjc0YzQ3NjQxYWI1ZDIzOGI0NTAwNmQyYzAwNDQxYiIpLm1hcChYXyksV2I9cmIoVmIpLFpiPW5ldyBBcnJheSgzKS5jb25jYXQoImYwZjBmMGJkYmRiZDYzNjM2MyIsImY3ZjdmN2NjY2NjYzk2OTY5NjUyNTI1MiIsImY3ZjdmN2NjY2NjYzk2OTY5NjYzNjM2MzI1MjUyNSIsImY3ZjdmN2Q5ZDlkOWJkYmRiZDk2OTY5NjYzNjM2MzI1MjUyNSIsImY3ZjdmN2Q5ZDlkOWJkYmRiZDk2OTY5NjczNzM3MzUyNTI1MjI1MjUyNSIsImZmZmZmZmYwZjBmMGQ5ZDlkOWJkYmRiZDk2OTY5NjczNzM3MzUyNTI1MjI1MjUyNSIsImZmZmZmZmYwZjBmMGQ5ZDlkOWJkYmRiZDk2OTY5NjczNzM3MzUyNTI1MjI1MjUyNTAwMDAwMCIpLm1hcChYXyksS2I9cmIoWmIpLFFiPW5ldyBBcnJheSgzKS5jb25jYXQoImVmZWRmNWJjYmRkYzc1NmJiMSIsImYyZjBmN2NiYzllMjllOWFjODZhNTFhMyIsImYyZjBmN2NiYzllMjllOWFjODc1NmJiMTU0Mjc4ZiIsImYyZjBmN2RhZGFlYmJjYmRkYzllOWFjODc1NmJiMTU0Mjc4ZiIsImYyZjBmN2RhZGFlYmJjYmRkYzllOWFjODgwN2RiYTZhNTFhMzRhMTQ4NiIsImZjZmJmZGVmZWRmNWRhZGFlYmJjYmRkYzllOWFjODgwN2RiYTZhNTFhMzRhMTQ4NiIsImZjZmJmZGVmZWRmNWRhZGFlYmJjYmRkYzllOWFjODgwN2RiYTZhNTFhMzU0Mjc4ZjNmMDA3ZCIpLm1hcChYXyksSmI9cmIoUWIpLHRtPW5ldyBBcnJheSgzKS5jb25jYXQoImZlZTBkMmZjOTI3MmRlMmQyNiIsImZlZTVkOWZjYWU5MWZiNmE0YWNiMTgxZCIsImZlZTVkOWZjYWU5MWZiNmE0YWRlMmQyNmE1MGYxNSIsImZlZTVkOWZjYmJhMWZjOTI3MmZiNmE0YWRlMmQyNmE1MGYxNSIsImZlZTVkOWZjYmJhMWZjOTI3MmZiNmE0YWVmM2IyY2NiMTgxZDk5MDAwZCIsImZmZjVmMGZlZTBkMmZjYmJhMWZjOTI3MmZiNmE0YWVmM2IyY2NiMTgxZDk5MDAwZCIsImZmZjVmMGZlZTBkMmZjYmJhMWZjOTI3MmZiNmE0YWVmM2IyY2NiMTgxZGE1MGYxNTY3MDAwZCIpLm1hcChYXyksbm09cmIodG0pLGVtPW5ldyBBcnJheSgzKS5jb25jYXQoImZlZTZjZWZkYWU2YmU2NTUwZCIsImZlZWRkZWZkYmU4NWZkOGQzY2Q5NDcwMSIsImZlZWRkZWZkYmU4NWZkOGQzY2U2NTUwZGE2MzYwMyIsImZlZWRkZWZkZDBhMmZkYWU2YmZkOGQzY2U2NTUwZGE2MzYwMyIsImZlZWRkZWZkZDBhMmZkYWU2YmZkOGQzY2YxNjkxM2Q5NDgwMThjMmQwNCIsImZmZjVlYmZlZTZjZWZkZDBhMmZkYWU2YmZkOGQzY2YxNjkxM2Q5NDgwMThjMmQwNCIsImZmZjVlYmZlZTZjZWZkZDBhMmZkYWU2YmZkOGQzY2YxNjkxM2Q5NDgwMWE2MzYwMzdmMjcwNCIpLm1hcChYXykscm09cmIoZW0pO3ZhciBpbT1kaShBcigzMDAsLjUsMCksQXIoLTI0MCwuNSwxKSksb209ZGkoQXIoLTEwMCwuNzUsLjM1KSxBcig4MCwxLjUsLjgpKSxhbT1kaShBcigyNjAsLjc1LC4zNSksQXIoODAsMS41LC44KSksdW09QXIoKTt2YXIgY209cWUoKSxmbT1NYXRoLlBJLzMsc209MipNYXRoLlBJLzM7ZnVuY3Rpb24gbG0odCl7dmFyIG49dC5sZW5ndGg7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiB0W01hdGgubWF4KDAsTWF0aC5taW4obi0xLE1hdGguZmxvb3IoZSpuKSkpXX19dmFyIGhtPWxtKFhfKCI0NDAxNTQ0NDAyNTY0NTA0NTc0NTA1NTk0NjA3NWE0NjA4NWM0NjBhNWQ0NjBiNWU0NzBkNjA0NzBlNjE0NzEwNjM0NzExNjQ0NzEzNjU0ODE0Njc0ODE2Njg0ODE3Njk0ODE4NmE0ODFhNmM0ODFiNmQ0ODFjNmU0ODFkNmY0ODFmNzA0ODIwNzE0ODIxNzM0ODIzNzQ0ODI0NzU0ODI1NzY0ODI2Nzc0ODI4Nzg0ODI5Nzk0NzJhN2E0NzJjN2E0NzJkN2I0NzJlN2M0NzJmN2Q0NjMwN2U0NjMyN2U0NjMzN2Y0NjM0ODA0NTM1ODE0NTM3ODE0NTM4ODI0NDM5ODM0NDNhODM0NDNiODQ0MzNkODQ0MzNlODU0MjNmODU0MjQwODY0MjQxODY0MTQyODc0MTQ0ODc0MDQ1ODg0MDQ2ODgzZjQ3ODgzZjQ4ODkzZTQ5ODkzZTRhODkzZTRjOGEzZDRkOGEzZDRlOGEzYzRmOGEzYzUwOGIzYjUxOGIzYjUyOGIzYTUzOGIzYTU0OGMzOTU1OGMzOTU2OGMzODU4OGMzODU5OGMzNzVhOGMzNzViOGQzNjVjOGQzNjVkOGQzNTVlOGQzNTVmOGQzNDYwOGQzNDYxOGQzMzYyOGQzMzYzOGQzMjY0OGUzMjY1OGUzMTY2OGUzMTY3OGUzMTY4OGUzMDY5OGUzMDZhOGUyZjZiOGUyZjZjOGUyZTZkOGUyZTZlOGUyZTZmOGUyZDcwOGUyZDcxOGUyYzcxOGUyYzcyOGUyYzczOGUyYjc0OGUyYjc1OGUyYTc2OGUyYTc3OGUyYTc4OGUyOTc5OGUyOTdhOGUyOTdiOGUyODdjOGUyODdkOGUyNzdlOGUyNzdmOGUyNzgwOGUyNjgxOGUyNjgyOGUyNjgyOGUyNTgzOGUyNTg0OGUyNTg1OGUyNDg2OGUyNDg3OGUyMzg4OGUyMzg5OGUyMzhhOGQyMjhiOGQyMjhjOGQyMjhkOGQyMThlOGQyMThmOGQyMTkwOGQyMTkxOGMyMDkyOGMyMDkyOGMyMDkzOGMxZjk0OGMxZjk1OGIxZjk2OGIxZjk3OGIxZjk4OGIxZjk5OGExZjlhOGExZTliOGExZTljODkxZTlkODkxZjllODkxZjlmODgxZmEwODgxZmExODgxZmExODcxZmEyODcyMGEzODYyMGE0ODYyMWE1ODUyMWE2ODUyMmE3ODUyMmE4ODQyM2E5ODMyNGFhODMyNWFiODIyNWFjODIyNmFkODEyN2FkODEyOGFlODAyOWFmN2YyYWIwN2YyY2IxN2UyZGIyN2QyZWIzN2MyZmI0N2MzMWI1N2IzMmI2N2EzNGI2NzkzNWI3NzkzN2I4NzgzOGI5NzczYWJhNzYzYmJiNzUzZGJjNzQzZmJjNzM0MGJkNzI0MmJlNzE0NGJmNzA0NmMwNmY0OGMxNmU0YWMxNmQ0Y2MyNmM0ZWMzNmI1MGM0NmE1MmM1Njk1NGM1Njg1NmM2Njc1OGM3NjU1YWM4NjQ1Y2M4NjM1ZWM5NjI2MGNhNjA2M2NiNWY2NWNiNWU2N2NjNWM2OWNkNWI2Y2NkNWE2ZWNlNTg3MGNmNTc3M2QwNTY3NWQwNTQ3N2QxNTM3YWQxNTE3Y2QyNTA3ZmQzNGU4MWQzNGQ4NGQ0NGI4NmQ1NDk4OWQ1NDg4YmQ2NDY4ZWQ2NDU5MGQ3NDM5M2Q3NDE5NWQ4NDA5OGQ4M2U5YmQ5M2M5ZGQ5M2JhMGRhMzlhMmRhMzdhNWRiMzZhOGRiMzRhYWRjMzJhZGRjMzBiMGRkMmZiMmRkMmRiNWRlMmJiOGRlMjliYWRlMjhiZGRmMjZjMGRmMjVjMmRmMjNjNWUwMjFjOGUwMjBjYWUxMWZjZGUxMWRkMGUxMWNkMmUyMWJkNWUyMWFkOGUyMTlkYWUzMTlkZGUzMThkZmUzMThlMmU0MThlNWU0MTllN2U0MTllYWU1MWFlY2U1MWJlZmU1MWNmMWU1MWRmNGU2MWVmNmU2MjBmOGU2MjFmYmU3MjNmZGU3MjUiKSksZG09bG0oWF8oIjAwMDAwNDAxMDAwNTAxMDEwNjAxMDEwODAyMDEwOTAyMDIwYjAyMDIwZDAzMDMwZjAzMDMxMjA0MDQxNDA1MDQxNjA2MDUxODA2MDUxYTA3MDYxYzA4MDcxZTA5MDcyMDBhMDgyMjBiMDkyNDBjMDkyNjBkMGEyOTBlMGIyYjEwMGIyZDExMGMyZjEyMGQzMTEzMGQzNDE0MGUzNjE1MGUzODE2MGYzYjE4MGYzZDE5MTAzZjFhMTA0MjFjMTA0NDFkMTE0NzFlMTE0OTIwMTE0YjIxMTE0ZTIyMTE1MDI0MTI1MzI1MTI1NTI3MTI1ODI5MTE1YTJhMTE1YzJjMTE1ZjJkMTE2MTJmMTE2MzMxMTE2NTMzMTA2NzM0MTA2OTM2MTA2YjM4MTA2YzM5MGY2ZTNiMGY3MDNkMGY3MTNmMGY3MjQwMGY3NDQyMGY3NTQ0MGY3NjQ1MTA3NzQ3MTA3ODQ5MTA3ODRhMTA3OTRjMTE3YTRlMTE3YjRmMTI3YjUxMTI3YzUyMTM3YzU0MTM3ZDU2MTQ3ZDU3MTU3ZTU5MTU3ZTVhMTY3ZTVjMTY3ZjVkMTc3ZjVmMTg3ZjYwMTg4MDYyMTk4MDY0MWE4MDY1MWE4MDY3MWI4MDY4MWM4MTZhMWM4MTZiMWQ4MTZkMWQ4MTZlMWU4MTcwMWY4MTcyMWY4MTczMjA4MTc1MjE4MTc2MjE4MTc4MjI4MTc5MjI4MjdiMjM4MjdjMjM4MjdlMjQ4MjgwMjU4MjgxMjU4MTgzMjY4MTg0MjY4MTg2Mjc4MTg4Mjc4MTg5Mjg4MThiMjk4MThjMjk4MThlMmE4MTkwMmE4MTkxMmI4MTkzMmI4MDk0MmM4MDk2MmM4MDk4MmQ4MDk5MmQ4MDliMmU3ZjljMmU3ZjllMmY3ZmEwMmY3ZmExMzA3ZWEzMzA3ZWE1MzE3ZWE2MzE3ZGE4MzI3ZGFhMzM3ZGFiMzM3Y2FkMzQ3Y2FlMzQ3YmIwMzU3YmIyMzU3YmIzMzY3YWI1MzY3YWI3Mzc3OWI4Mzc3OWJhMzg3OGJjMzk3OGJkMzk3N2JmM2E3N2MwM2E3NmMyM2I3NWM0M2M3NWM1M2M3NGM3M2Q3M2M4M2U3M2NhM2U3MmNjM2Y3MWNkNDA3MWNmNDA3MGQwNDE2ZmQyNDI2ZmQzNDM2ZWQ1NDQ2ZGQ2NDU2Y2Q4NDU2Y2Q5NDY2YmRiNDc2YWRjNDg2OWRlNDk2OGRmNGE2OGUwNGM2N2UyNGQ2NmUzNGU2NWU0NGY2NGU1NTA2NGU3NTI2M2U4NTM2MmU5NTQ2MmVhNTY2MWViNTc2MGVjNTg2MGVkNWE1ZmVlNWI1ZWVmNWQ1ZWYwNWY1ZWYxNjA1ZGYyNjI1ZGYyNjQ1Y2YzNjU1Y2Y0Njc1Y2Y0Njk1Y2Y1NmI1Y2Y2NmM1Y2Y2NmU1Y2Y3NzA1Y2Y3NzI1Y2Y4NzQ1Y2Y4NzY1Y2Y5Nzg1ZGY5Nzk1ZGY5N2I1ZGZhN2Q1ZWZhN2Y1ZWZhODE1ZmZiODM1ZmZiODU2MGZiODc2MWZjODk2MWZjOGE2MmZjOGM2M2ZjOGU2NGZjOTA2NWZkOTI2NmZkOTQ2N2ZkOTY2OGZkOTg2OWZkOWE2YWZkOWI2YmZlOWQ2Y2ZlOWY2ZGZlYTE2ZWZlYTM2ZmZlYTU3MWZlYTc3MmZlYTk3M2ZlYWE3NGZlYWM3NmZlYWU3N2ZlYjA3OGZlYjI3YWZlYjQ3YmZlYjY3Y2ZlYjc3ZWZlYjk3ZmZlYmI4MWZlYmQ4MmZlYmY4NGZlYzE4NWZlYzI4N2ZlYzQ4OGZlYzY4YWZlYzg4Y2ZlY2E4ZGZlY2M4ZmZlY2Q5MGZlY2Y5MmZlZDE5NGZlZDM5NWZlZDU5N2ZlZDc5OWZlZDg5YWZkZGE5Y2ZkZGM5ZWZkZGVhMGZkZTBhMWZkZTJhM2ZkZTNhNWZkZTVhN2ZkZTdhOWZkZTlhYWZkZWJhY2ZjZWNhZWZjZWViMGZjZjBiMmZjZjJiNGZjZjRiNmZjZjZiOGZjZjdiOWZjZjliYmZjZmJiZGZjZmRiZiIpKSxwbT1sbShYXygiMDAwMDA0MDEwMDA1MDEwMTA2MDEwMTA4MDIwMTBhMDIwMjBjMDIwMjBlMDMwMjEwMDQwMzEyMDQwMzE0MDUwNDE3MDYwNDE5MDcwNTFiMDgwNTFkMDkwNjFmMGEwNzIyMGIwNzI0MGMwODI2MGQwODI5MGUwOTJiMTAwOTJkMTEwYTMwMTIwYTMyMTQwYjM0MTUwYjM3MTYwYjM5MTgwYzNjMTkwYzNlMWIwYzQxMWMwYzQzMWUwYzQ1MWYwYzQ4MjEwYzRhMjMwYzRjMjQwYzRmMjYwYzUxMjgwYjUzMjkwYjU1MmIwYjU3MmQwYjU5MmYwYTViMzEwYTVjMzIwYTVlMzQwYTVmMzYwOTYxMzgwOTYyMzkwOTYzM2IwOTY0M2QwOTY1M2UwOTY2NDAwYTY3NDIwYTY4NDQwYTY4NDUwYTY5NDcwYjZhNDkwYjZhNGEwYzZiNGMwYzZiNGQwZDZjNGYwZDZjNTEwZTZjNTIwZTZkNTQwZjZkNTUwZjZkNTcxMDZlNTkxMDZlNWExMTZlNWMxMjZlNWQxMjZlNWYxMzZlNjExMzZlNjIxNDZlNjQxNTZlNjUxNTZlNjcxNjZlNjkxNjZlNmExNzZlNmMxODZlNmQxODZlNmYxOTZlNzExOTZlNzIxYTZlNzQxYTZlNzUxYjZlNzcxYzZkNzgxYzZkN2ExZDZkN2MxZDZkN2QxZTZkN2YxZTZjODAxZjZjODIyMDZjODQyMDZiODUyMTZiODcyMTZiODgyMjZhOGEyMjZhOGMyMzY5OGQyMzY5OGYyNDY5OTAyNTY4OTIyNTY4OTMyNjY3OTUyNjY3OTcyNzY2OTgyNzY2OWEyODY1OWIyOTY0OWQyOTY0OWYyYTYzYTAyYTYzYTIyYjYyYTMyYzYxYTUyYzYwYTYyZDYwYTgyZTVmYTkyZTVlYWIyZjVlYWQzMDVkYWUzMDVjYjAzMTViYjEzMjVhYjMzMjVhYjQzMzU5YjYzNDU4YjczNTU3YjkzNTU2YmEzNjU1YmMzNzU0YmQzODUzYmYzOTUyYzAzYTUxYzEzYTUwYzMzYjRmYzQzYzRlYzYzZDRkYzczZTRjYzgzZjRiY2E0MDRhY2I0MTQ5Y2M0MjQ4Y2U0MzQ3Y2Y0NDQ2ZDA0NTQ1ZDI0NjQ0ZDM0NzQzZDQ0ODQyZDU0YTQxZDc0YjNmZDg0YzNlZDk0ZDNkZGE0ZTNjZGI1MDNiZGQ1MTNhZGU1MjM4ZGY1MzM3ZTA1NTM2ZTE1NjM1ZTI1NzM0ZTM1OTMzZTQ1YTMxZTU1YzMwZTY1ZDJmZTc1ZTJlZTg2MDJkZTk2MTJiZWE2MzJhZWI2NDI5ZWI2NjI4ZWM2NzI2ZWQ2OTI1ZWU2YTI0ZWY2YzIzZWY2ZTIxZjA2ZjIwZjE3MTFmZjE3MzFkZjI3NDFjZjM3NjFiZjM3ODE5ZjQ3OTE4ZjU3YjE3ZjU3ZDE1ZjY3ZTE0ZjY4MDEzZjc4MjEyZjc4NDEwZjg4NTBmZjg4NzBlZjg4OTBjZjk4YjBiZjk4YzBhZjk4ZTA5ZmE5MDA4ZmE5MjA3ZmE5NDA3ZmI5NjA2ZmI5NzA2ZmI5OTA2ZmI5YjA2ZmI5ZDA3ZmM5ZjA3ZmNhMTA4ZmNhMzA5ZmNhNTBhZmNhNjBjZmNhODBkZmNhYTBmZmNhYzExZmNhZTEyZmNiMDE0ZmNiMjE2ZmNiNDE4ZmJiNjFhZmJiODFkZmJiYTFmZmJiYzIxZmJiZTIzZmFjMDI2ZmFjMjI4ZmFjNDJhZmFjNjJkZjljNzJmZjljOTMyZjljYjM1ZjhjZDM3ZjhjZjNhZjdkMTNkZjdkMzQwZjZkNTQzZjZkNzQ2ZjVkOTQ5ZjVkYjRjZjRkZDRmZjRkZjUzZjRlMTU2ZjNlMzVhZjNlNTVkZjJlNjYxZjJlODY1ZjJlYTY5ZjFlYzZkZjFlZDcxZjFlZjc1ZjFmMTc5ZjJmMjdkZjJmNDgyZjNmNTg2ZjNmNjhhZjRmODhlZjVmOTkyZjZmYTk2ZjhmYjlhZjlmYzlkZmFmZGExZmNmZmE0IikpLGdtPWxtKFhfKCIwZDA4ODcxMDA3ODgxMzA3ODkxNjA3OGExOTA2OGMxYjA2OGQxZDA2OGUyMDA2OGYyMjA2OTAyNDA2OTEyNjA1OTEyODA1OTIyYTA1OTMyYzA1OTQyZTA1OTUyZjA1OTYzMTA1OTczMzA1OTczNTA0OTgzNzA0OTkzODA0OWEzYTA0OWEzYzA0OWIzZTA0OWMzZjA0OWM0MTA0OWQ0MzAzOWU0NDAzOWU0NjAzOWY0ODAzOWY0OTAzYTA0YjAzYTE0YzAyYTE0ZTAyYTI1MDAyYTI1MTAyYTM1MzAyYTM1NTAyYTQ1NjAxYTQ1ODAxYTQ1OTAxYTU1YjAxYTU1YzAxYTY1ZTAxYTY2MDAxYTY2MTAwYTc2MzAwYTc2NDAwYTc2NjAwYTc2NzAwYTg2OTAwYTg2YTAwYTg2YzAwYTg2ZTAwYTg2ZjAwYTg3MTAwYTg3MjAxYTg3NDAxYTg3NTAxYTg3NzAxYTg3ODAxYTg3YTAyYTg3YjAyYTg3ZDAzYTg3ZTAzYTg4MDA0YTg4MTA0YTc4MzA1YTc4NDA1YTc4NjA2YTY4NzA3YTY4ODA4YTY4YTA5YTU4YjBhYTU4ZDBiYTU4ZTBjYTQ4ZjBkYTQ5MTBlYTM5MjBmYTM5NDEwYTI5NTExYTE5NjEzYTE5ODE0YTA5OTE1OWY5YTE2OWY5YzE3OWU5ZDE4OWQ5ZTE5OWRhMDFhOWNhMTFiOWJhMjFkOWFhMzFlOWFhNTFmOTlhNjIwOThhNzIxOTdhODIyOTZhYTIzOTVhYjI0OTRhYzI2OTRhZDI3OTNhZTI4OTJiMDI5OTFiMTJhOTBiMjJiOGZiMzJjOGViNDJlOGRiNTJmOGNiNjMwOGJiNzMxOGFiODMyODliYTMzODhiYjM0ODhiYzM1ODdiZDM3ODZiZTM4ODViZjM5ODRjMDNhODNjMTNiODJjMjNjODFjMzNkODBjNDNlN2ZjNTQwN2VjNjQxN2RjNzQyN2NjODQzN2JjOTQ0N2FjYTQ1N2FjYjQ2NzljYzQ3NzhjYzQ5NzdjZDRhNzZjZTRiNzVjZjRjNzRkMDRkNzNkMTRlNzJkMjRmNzFkMzUxNzFkNDUyNzBkNTUzNmZkNTU0NmVkNjU1NmRkNzU2NmNkODU3NmJkOTU4NmFkYTVhNmFkYTViNjlkYjVjNjhkYzVkNjdkZDVlNjZkZTVmNjVkZTYxNjRkZjYyNjNlMDYzNjNlMTY0NjJlMjY1NjFlMjY2NjBlMzY4NWZlNDY5NWVlNTZhNWRlNTZiNWRlNjZjNWNlNzZlNWJlNzZmNWFlODcwNTllOTcxNThlOTcyNTdlYTc0NTdlYjc1NTZlYjc2NTVlYzc3NTRlZDc5NTNlZDdhNTJlZTdiNTFlZjdjNTFlZjdlNTBmMDdmNGZmMDgwNGVmMTgxNGRmMTgzNGNmMjg0NGJmMzg1NGJmMzg3NGFmNDg4NDlmNDg5NDhmNThiNDdmNThjNDZmNjhkNDVmNjhmNDRmNzkwNDRmNzkxNDNmNzkzNDJmODk0NDFmODk1NDBmOTk3M2ZmOTk4M2VmOTlhM2VmYTliM2RmYTljM2NmYTllM2JmYjlmM2FmYmExMzlmYmEyMzhmY2EzMzhmY2E1MzdmY2E2MzZmY2E4MzVmY2E5MzRmZGFiMzNmZGFjMzNmZGFlMzJmZGFmMzFmZGIxMzBmZGIyMmZmZGI0MmZmZGI1MmVmZWI3MmRmZWI4MmNmZWJhMmNmZWJiMmJmZWJkMmFmZWJlMmFmZWMwMjlmZGMyMjlmZGMzMjhmZGM1MjdmZGM2MjdmZGM4MjdmZGNhMjZmZGNiMjZmY2NkMjVmY2NlMjVmY2QwMjVmY2QyMjVmYmQzMjRmYmQ1MjRmYmQ3MjRmYWQ4MjRmYWRhMjRmOWRjMjRmOWRkMjVmOGRmMjVmOGUxMjVmN2UyMjVmN2U0MjVmNmU2MjZmNmU4MjZmNWU5MjZmNWViMjdmNGVkMjdmM2VlMjdmM2YwMjdmMmYyMjdmMWY0MjZmMWY1MjVmMGY3MjRmMGY5MjEiKSk7ZnVuY3Rpb24geW0odCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHR9fWNvbnN0IHZtPU1hdGguYWJzLF9tPU1hdGguYXRhbjIsYm09TWF0aC5jb3MsbW09TWF0aC5tYXgseG09TWF0aC5taW4sd209TWF0aC5zaW4sTW09TWF0aC5zcXJ0LFRtPTFlLTEyLEFtPU1hdGguUEksU209QW0vMixFbT0yKkFtO2Z1bmN0aW9uIE5tKHQpe3JldHVybiB0Pj0xP1NtOnQ8PS0xPy1TbTpNYXRoLmFzaW4odCl9ZnVuY3Rpb24ga20odCl7bGV0IG49MztyZXR1cm4gdC5kaWdpdHM9ZnVuY3Rpb24oZSl7aWYoIWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIG47aWYobnVsbD09ZSluPW51bGw7ZWxzZXtjb25zdCB0PU1hdGguZmxvb3IoZSk7aWYoISh0Pj0wKSl0aHJvdyBuZXcgUmFuZ2VFcnJvcihgaW52YWxpZCBkaWdpdHM6ICR7ZX1gKTtuPXR9cmV0dXJuIHR9LCgpPT5uZXcgSWEobil9ZnVuY3Rpb24gQ20odCl7cmV0dXJuIHQuaW5uZXJSYWRpdXN9ZnVuY3Rpb24gUG0odCl7cmV0dXJuIHQub3V0ZXJSYWRpdXN9ZnVuY3Rpb24gem0odCl7cmV0dXJuIHQuc3RhcnRBbmdsZX1mdW5jdGlvbiAkbSh0KXtyZXR1cm4gdC5lbmRBbmdsZX1mdW5jdGlvbiBEbSh0KXtyZXR1cm4gdCYmdC5wYWRBbmdsZX1mdW5jdGlvbiBSbSh0LG4sZSxyLGksbyxhKXt2YXIgdT10LWUsYz1uLXIsZj0oYT9vOi1vKS9NbSh1KnUrYypjKSxzPWYqYyxsPS1mKnUsaD10K3MsZD1uK2wscD1lK3MsZz1yK2wseT0oaCtwKS8yLHY9KGQrZykvMixfPXAtaCxiPWctZCxtPV8qXytiKmIseD1pLW8sdz1oKmctcCpkLE09KGI8MD8tMToxKSpNbShtbSgwLHgqeCptLXcqdykpLFQ9KHcqYi1fKk0pL20sQT0oLXcqXy1iKk0pL20sUz0odypiK18qTSkvbSxFPSgtdypfK2IqTSkvbSxOPVQteSxrPUEtdixDPVMteSxQPUUtdjtyZXR1cm4gTipOK2sqaz5DKkMrUCpQJiYoVD1TLEE9RSkse2N4OlQsY3k6QSx4MDE6LXMseTAxOi1sLHgxMTpUKihpL3gtMSkseTExOkEqKGkveC0xKX19dmFyIEZtPUFycmF5LnByb3RvdHlwZS5zbGljZTtmdW5jdGlvbiBxbSh0KXtyZXR1cm4ib2JqZWN0Ij09dHlwZW9mIHQmJiJsZW5ndGgiaW4gdD90OkFycmF5LmZyb20odCl9ZnVuY3Rpb24gVW0odCl7dGhpcy5fY29udGV4dD10fWZ1bmN0aW9uIEltKHQpe3JldHVybiBuZXcgVW0odCl9ZnVuY3Rpb24gT20odCl7cmV0dXJuIHRbMF19ZnVuY3Rpb24gQm0odCl7cmV0dXJuIHRbMV19ZnVuY3Rpb24gWW0odCxuKXt2YXIgZT15bSghMCkscj1udWxsLGk9SW0sbz1udWxsLGE9a20odSk7ZnVuY3Rpb24gdSh1KXt2YXIgYyxmLHMsbD0odT1xbSh1KSkubGVuZ3RoLGg9ITE7Zm9yKG51bGw9PXImJihvPWkocz1hKCkpKSxjPTA7Yzw9bDsrK2MpIShjPGwmJmUoZj11W2NdLGMsdSkpPT09aCYmKChoPSFoKT9vLmxpbmVTdGFydCgpOm8ubGluZUVuZCgpKSxoJiZvLnBvaW50KCt0KGYsYyx1KSwrbihmLGMsdSkpO2lmKHMpcmV0dXJuIG89bnVsbCxzKyIifHxudWxsfXJldHVybiB0PSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6dm9pZCAwPT09dD9PbTp5bSh0KSxuPSJmdW5jdGlvbiI9PXR5cGVvZiBuP246dm9pZCAwPT09bj9CbTp5bShuKSx1Lng9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjp5bSgrbiksdSk6dH0sdS55PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6eW0oK3QpLHUpOm59LHUuZGVmaW5lZD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT0iZnVuY3Rpb24iPT10eXBlb2YgdD90OnltKCEhdCksdSk6ZX0sdS5jdXJ2ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT10LG51bGwhPXImJihvPWkocikpLHUpOml9LHUuY29udGV4dD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obnVsbD09dD9yPW89bnVsbDpvPWkocj10KSx1KTpyfSx1fWZ1bmN0aW9uIExtKHQsbixlKXt2YXIgcj1udWxsLGk9eW0oITApLG89bnVsbCxhPUltLHU9bnVsbCxjPWttKGYpO2Z1bmN0aW9uIGYoZil7dmFyIHMsbCxoLGQscCxnPShmPXFtKGYpKS5sZW5ndGgseT0hMSx2PW5ldyBBcnJheShnKSxfPW5ldyBBcnJheShnKTtmb3IobnVsbD09byYmKHU9YShwPWMoKSkpLHM9MDtzPD1nOysrcyl7aWYoIShzPGcmJmkoZD1mW3NdLHMsZikpPT09eSlpZih5PSF5KWw9cyx1LmFyZWFTdGFydCgpLHUubGluZVN0YXJ0KCk7ZWxzZXtmb3IodS5saW5lRW5kKCksdS5saW5lU3RhcnQoKSxoPXMtMTtoPj1sOy0taCl1LnBvaW50KHZbaF0sX1toXSk7dS5saW5lRW5kKCksdS5hcmVhRW5kKCl9eSYmKHZbc109K3QoZCxzLGYpLF9bc109K24oZCxzLGYpLHUucG9pbnQocj8rcihkLHMsZik6dltzXSxlPytlKGQscyxmKTpfW3NdKSl9aWYocClyZXR1cm4gdT1udWxsLHArIiJ8fG51bGx9ZnVuY3Rpb24gcygpe3JldHVybiBZbSgpLmRlZmluZWQoaSkuY3VydmUoYSkuY29udGV4dChvKX1yZXR1cm4gdD0iZnVuY3Rpb24iPT10eXBlb2YgdD90OnZvaWQgMD09PXQ/T206eW0oK3QpLG49ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjp5bSh2b2lkIDA9PT1uPzA6K24pLGU9ImZ1bmN0aW9uIj09dHlwZW9mIGU/ZTp2b2lkIDA9PT1lP0JtOnltKCtlKSxmLng9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjp5bSgrbikscj1udWxsLGYpOnR9LGYueDA9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjp5bSgrbiksZik6dH0sZi54MT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj1udWxsPT10P251bGw6ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDp5bSgrdCksZik6cn0sZi55PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6eW0oK3QpLGU9bnVsbCxmKTpufSxmLnkwPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6eW0oK3QpLGYpOm59LGYueTE9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9bnVsbD09dD9udWxsOiJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6eW0oK3QpLGYpOmV9LGYubGluZVgwPWYubGluZVkwPWZ1bmN0aW9uKCl7cmV0dXJuIHMoKS54KHQpLnkobil9LGYubGluZVkxPWZ1bmN0aW9uKCl7cmV0dXJuIHMoKS54KHQpLnkoZSl9LGYubGluZVgxPWZ1bmN0aW9uKCl7cmV0dXJuIHMoKS54KHIpLnkobil9LGYuZGVmaW5lZD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0iZnVuY3Rpb24iPT10eXBlb2YgdD90OnltKCEhdCksZik6aX0sZi5jdXJ2ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYT10LG51bGwhPW8mJih1PWEobykpLGYpOmF9LGYuY29udGV4dD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obnVsbD09dD9vPXU9bnVsbDp1PWEobz10KSxmKTpvfSxmfWZ1bmN0aW9uIGptKHQsbil7cmV0dXJuIG48dD8tMTpuPnQ/MTpuPj10PzA6TmFOfWZ1bmN0aW9uIEhtKHQpe3JldHVybiB0fVVtLnByb3RvdHlwZT17YXJlYVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5fbGluZT0wfSxhcmVhRW5kOmZ1bmN0aW9uKCl7dGhpcy5fbGluZT1OYU59LGxpbmVTdGFydDpmdW5jdGlvbigpe3RoaXMuX3BvaW50PTB9LGxpbmVFbmQ6ZnVuY3Rpb24oKXsodGhpcy5fbGluZXx8MCE9PXRoaXMuX2xpbmUmJjE9PT10aGlzLl9wb2ludCkmJnRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCksdGhpcy5fbGluZT0xLXRoaXMuX2xpbmV9LHBvaW50OmZ1bmN0aW9uKHQsbil7c3dpdGNoKHQ9K3Qsbj0rbix0aGlzLl9wb2ludCl7Y2FzZSAwOnRoaXMuX3BvaW50PTEsdGhpcy5fbGluZT90aGlzLl9jb250ZXh0LmxpbmVUbyh0LG4pOnRoaXMuX2NvbnRleHQubW92ZVRvKHQsbik7YnJlYWs7Y2FzZSAxOnRoaXMuX3BvaW50PTI7ZGVmYXVsdDp0aGlzLl9jb250ZXh0LmxpbmVUbyh0LG4pfX19O3ZhciBYbT1WbShJbSk7ZnVuY3Rpb24gR20odCl7dGhpcy5fY3VydmU9dH1mdW5jdGlvbiBWbSh0KXtmdW5jdGlvbiBuKG4pe3JldHVybiBuZXcgR20odChuKSl9cmV0dXJuIG4uX2N1cnZlPXQsbn1mdW5jdGlvbiBXbSh0KXt2YXIgbj10LmN1cnZlO3JldHVybiB0LmFuZ2xlPXQueCxkZWxldGUgdC54LHQucmFkaXVzPXQueSxkZWxldGUgdC55LHQuY3VydmU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/bihWbSh0KSk6bigpLl9jdXJ2ZX0sdH1mdW5jdGlvbiBabSgpe3JldHVybiBXbShZbSgpLmN1cnZlKFhtKSl9ZnVuY3Rpb24gS20oKXt2YXIgdD1MbSgpLmN1cnZlKFhtKSxuPXQuY3VydmUsZT10LmxpbmVYMCxyPXQubGluZVgxLGk9dC5saW5lWTAsbz10LmxpbmVZMTtyZXR1cm4gdC5hbmdsZT10LngsZGVsZXRlIHQueCx0LnN0YXJ0QW5nbGU9dC54MCxkZWxldGUgdC54MCx0LmVuZEFuZ2xlPXQueDEsZGVsZXRlIHQueDEsdC5yYWRpdXM9dC55LGRlbGV0ZSB0LnksdC5pbm5lclJhZGl1cz10LnkwLGRlbGV0ZSB0LnkwLHQub3V0ZXJSYWRpdXM9dC55MSxkZWxldGUgdC55MSx0LmxpbmVTdGFydEFuZ2xlPWZ1bmN0aW9uKCl7cmV0dXJuIFdtKGUoKSl9LGRlbGV0ZSB0LmxpbmVYMCx0LmxpbmVFbmRBbmdsZT1mdW5jdGlvbigpe3JldHVybiBXbShyKCkpfSxkZWxldGUgdC5saW5lWDEsdC5saW5lSW5uZXJSYWRpdXM9ZnVuY3Rpb24oKXtyZXR1cm4gV20oaSgpKX0sZGVsZXRlIHQubGluZVkwLHQubGluZU91dGVyUmFkaXVzPWZ1bmN0aW9uKCl7cmV0dXJuIFdtKG8oKSl9LGRlbGV0ZSB0LmxpbmVZMSx0LmN1cnZlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP24oVm0odCkpOm4oKS5fY3VydmV9LHR9ZnVuY3Rpb24gUW0odCxuKXtyZXR1cm5bKG49K24pKk1hdGguY29zKHQtPU1hdGguUEkvMiksbipNYXRoLnNpbih0KV19R20ucHJvdG90eXBlPXthcmVhU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9jdXJ2ZS5hcmVhU3RhcnQoKX0sYXJlYUVuZDpmdW5jdGlvbigpe3RoaXMuX2N1cnZlLmFyZWFFbmQoKX0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5fY3VydmUubGluZVN0YXJ0KCl9LGxpbmVFbmQ6ZnVuY3Rpb24oKXt0aGlzLl9jdXJ2ZS5saW5lRW5kKCl9LHBvaW50OmZ1bmN0aW9uKHQsbil7dGhpcy5fY3VydmUucG9pbnQobipNYXRoLnNpbih0KSxuKi1NYXRoLmNvcyh0KSl9fTtjbGFzcyBKbXtjb25zdHJ1Y3Rvcih0LG4pe3RoaXMuX2NvbnRleHQ9dCx0aGlzLl94PW59YXJlYVN0YXJ0KCl7dGhpcy5fbGluZT0wfWFyZWFFbmQoKXt0aGlzLl9saW5lPU5hTn1saW5lU3RhcnQoKXt0aGlzLl9wb2ludD0wfWxpbmVFbmQoKXsodGhpcy5fbGluZXx8MCE9PXRoaXMuX2xpbmUmJjE9PT10aGlzLl9wb2ludCkmJnRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCksdGhpcy5fbGluZT0xLXRoaXMuX2xpbmV9cG9pbnQodCxuKXtzd2l0Y2godD0rdCxuPStuLHRoaXMuX3BvaW50KXtjYXNlIDA6dGhpcy5fcG9pbnQ9MSx0aGlzLl9saW5lP3RoaXMuX2NvbnRleHQubGluZVRvKHQsbik6dGhpcy5fY29udGV4dC5tb3ZlVG8odCxuKTticmVhaztjYXNlIDE6dGhpcy5fcG9pbnQ9MjtkZWZhdWx0OnRoaXMuX3g/dGhpcy5fY29udGV4dC5iZXppZXJDdXJ2ZVRvKHRoaXMuX3gwPSh0aGlzLl94MCt0KS8yLHRoaXMuX3kwLHRoaXMuX3gwLG4sdCxuKTp0aGlzLl9jb250ZXh0LmJlemllckN1cnZlVG8odGhpcy5feDAsdGhpcy5feTA9KHRoaXMuX3kwK24pLzIsdCx0aGlzLl95MCx0LG4pfXRoaXMuX3gwPXQsdGhpcy5feTA9bn19Y2xhc3MgdHh7Y29uc3RydWN0b3IodCl7dGhpcy5fY29udGV4dD10fWxpbmVTdGFydCgpe3RoaXMuX3BvaW50PTB9bGluZUVuZCgpe31wb2ludCh0LG4pe2lmKHQ9K3Qsbj0rbiwwPT09dGhpcy5fcG9pbnQpdGhpcy5fcG9pbnQ9MTtlbHNle2NvbnN0IGU9UW0odGhpcy5feDAsdGhpcy5feTApLHI9UW0odGhpcy5feDAsdGhpcy5feTA9KHRoaXMuX3kwK24pLzIpLGk9UW0odCx0aGlzLl95MCksbz1RbSh0LG4pO3RoaXMuX2NvbnRleHQubW92ZVRvKC4uLmUpLHRoaXMuX2NvbnRleHQuYmV6aWVyQ3VydmVUbyguLi5yLC4uLmksLi4ubyl9dGhpcy5feDA9dCx0aGlzLl95MD1ufX1mdW5jdGlvbiBueCh0KXtyZXR1cm4gbmV3IEptKHQsITApfWZ1bmN0aW9uIGV4KHQpe3JldHVybiBuZXcgSm0odCwhMSl9ZnVuY3Rpb24gcngodCl7cmV0dXJuIG5ldyB0eCh0KX1mdW5jdGlvbiBpeCh0KXtyZXR1cm4gdC5zb3VyY2V9ZnVuY3Rpb24gb3godCl7cmV0dXJuIHQudGFyZ2V0fWZ1bmN0aW9uIGF4KHQpe2xldCBuPWl4LGU9b3gscj1PbSxpPUJtLG89bnVsbCxhPW51bGwsdT1rbShjKTtmdW5jdGlvbiBjKCl7bGV0IGM7Y29uc3QgZj1GbS5jYWxsKGFyZ3VtZW50cykscz1uLmFwcGx5KHRoaXMsZiksbD1lLmFwcGx5KHRoaXMsZik7aWYobnVsbD09byYmKGE9dChjPXUoKSkpLGEubGluZVN0YXJ0KCksZlswXT1zLGEucG9pbnQoK3IuYXBwbHkodGhpcyxmKSwraS5hcHBseSh0aGlzLGYpKSxmWzBdPWwsYS5wb2ludCgrci5hcHBseSh0aGlzLGYpLCtpLmFwcGx5KHRoaXMsZikpLGEubGluZUVuZCgpLGMpcmV0dXJuIGE9bnVsbCxjKyIifHxudWxsfXJldHVybiBjLnNvdXJjZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj10LGMpOm59LGMudGFyZ2V0PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPXQsYyk6ZX0sYy54PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6eW0oK3QpLGMpOnJ9LGMueT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0iZnVuY3Rpb24iPT10eXBlb2YgdD90OnltKCt0KSxjKTppfSxjLmNvbnRleHQ9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG51bGw9PW4/bz1hPW51bGw6YT10KG89biksYyk6b30sY31jb25zdCB1eD1NbSgzKTt2YXIgY3g9e2RyYXcodCxuKXtjb25zdCBlPS41OTQzNipNbShuK3htKG4vMjgsLjc1KSkscj1lLzIsaT1yKnV4O3QubW92ZVRvKDAsZSksdC5saW5lVG8oMCwtZSksdC5tb3ZlVG8oLWksLXIpLHQubGluZVRvKGksciksdC5tb3ZlVG8oLWksciksdC5saW5lVG8oaSwtcil9fSxmeD17ZHJhdyh0LG4pe2NvbnN0IGU9TW0obi9BbSk7dC5tb3ZlVG8oZSwwKSx0LmFyYygwLDAsZSwwLEVtKX19LHN4PXtkcmF3KHQsbil7Y29uc3QgZT1NbShuLzUpLzI7dC5tb3ZlVG8oLTMqZSwtZSksdC5saW5lVG8oLWUsLWUpLHQubGluZVRvKC1lLC0zKmUpLHQubGluZVRvKGUsLTMqZSksdC5saW5lVG8oZSwtZSksdC5saW5lVG8oMyplLC1lKSx0LmxpbmVUbygzKmUsZSksdC5saW5lVG8oZSxlKSx0LmxpbmVUbyhlLDMqZSksdC5saW5lVG8oLWUsMyplKSx0LmxpbmVUbygtZSxlKSx0LmxpbmVUbygtMyplLGUpLHQuY2xvc2VQYXRoKCl9fTtjb25zdCBseD1NbSgxLzMpLGh4PTIqbHg7dmFyIGR4PXtkcmF3KHQsbil7Y29uc3QgZT1NbShuL2h4KSxyPWUqbHg7dC5tb3ZlVG8oMCwtZSksdC5saW5lVG8ociwwKSx0LmxpbmVUbygwLGUpLHQubGluZVRvKC1yLDApLHQuY2xvc2VQYXRoKCl9fSxweD17ZHJhdyh0LG4pe2NvbnN0IGU9LjYyNjI1Kk1tKG4pO3QubW92ZVRvKDAsLWUpLHQubGluZVRvKGUsMCksdC5saW5lVG8oMCxlKSx0LmxpbmVUbygtZSwwKSx0LmNsb3NlUGF0aCgpfX0sZ3g9e2RyYXcodCxuKXtjb25zdCBlPS44NzU1OSpNbShuLXhtKG4vNywyKSk7dC5tb3ZlVG8oLWUsMCksdC5saW5lVG8oZSwwKSx0Lm1vdmVUbygwLGUpLHQubGluZVRvKDAsLWUpfX0seXg9e2RyYXcodCxuKXtjb25zdCBlPU1tKG4pLHI9LWUvMjt0LnJlY3QocixyLGUsZSl9fSx2eD17ZHJhdyh0LG4pe2NvbnN0IGU9LjQ0MzEqTW0obik7dC5tb3ZlVG8oZSxlKSx0LmxpbmVUbyhlLC1lKSx0LmxpbmVUbygtZSwtZSksdC5saW5lVG8oLWUsZSksdC5jbG9zZVBhdGgoKX19O2NvbnN0IF94PXdtKEFtLzEwKS93bSg3KkFtLzEwKSxieD13bShFbS8xMCkqX3gsbXg9LWJtKEVtLzEwKSpfeDt2YXIgeHg9e2RyYXcodCxuKXtjb25zdCBlPU1tKC44OTA4MTMwOTE1MjkyODUyKm4pLHI9YngqZSxpPW14KmU7dC5tb3ZlVG8oMCwtZSksdC5saW5lVG8ocixpKTtmb3IobGV0IG49MTtuPDU7KytuKXtjb25zdCBvPUVtKm4vNSxhPWJtKG8pLHU9d20obyk7dC5saW5lVG8odSplLC1hKmUpLHQubGluZVRvKGEqci11KmksdSpyK2EqaSl9dC5jbG9zZVBhdGgoKX19O2NvbnN0IHd4PU1tKDMpO3ZhciBNeD17ZHJhdyh0LG4pe2NvbnN0IGU9LU1tKG4vKDMqd3gpKTt0Lm1vdmVUbygwLDIqZSksdC5saW5lVG8oLXd4KmUsLWUpLHQubGluZVRvKHd4KmUsLWUpLHQuY2xvc2VQYXRoKCl9fTtjb25zdCBUeD1NbSgzKTt2YXIgQXg9e2RyYXcodCxuKXtjb25zdCBlPS42ODI0Kk1tKG4pLHI9ZS8yLGk9ZSpUeC8yO3QubW92ZVRvKDAsLWUpLHQubGluZVRvKGksciksdC5saW5lVG8oLWksciksdC5jbG9zZVBhdGgoKX19O2NvbnN0IFN4PS0uNSxFeD1NbSgzKS8yLE54PTEvTW0oMTIpLGt4PTMqKE54LzIrMSk7dmFyIEN4PXtkcmF3KHQsbil7Y29uc3QgZT1NbShuL2t4KSxyPWUvMixpPWUqTngsbz1yLGE9ZSpOeCtlLHU9LW8sYz1hO3QubW92ZVRvKHIsaSksdC5saW5lVG8obyxhKSx0LmxpbmVUbyh1LGMpLHQubGluZVRvKFN4KnItRXgqaSxFeCpyK1N4KmkpLHQubGluZVRvKFN4Km8tRXgqYSxFeCpvK1N4KmEpLHQubGluZVRvKFN4KnUtRXgqYyxFeCp1K1N4KmMpLHQubGluZVRvKFN4KnIrRXgqaSxTeCppLUV4KnIpLHQubGluZVRvKFN4Km8rRXgqYSxTeCphLUV4Km8pLHQubGluZVRvKFN4KnUrRXgqYyxTeCpjLUV4KnUpLHQuY2xvc2VQYXRoKCl9fSxQeD17ZHJhdyh0LG4pe2NvbnN0IGU9LjYxODkqTW0obi14bShuLzYsMS43KSk7dC5tb3ZlVG8oLWUsLWUpLHQubGluZVRvKGUsZSksdC5tb3ZlVG8oLWUsZSksdC5saW5lVG8oZSwtZSl9fTtjb25zdCB6eD1bZngsc3gsZHgseXgseHgsTXgsQ3hdLCR4PVtmeCxneCxQeCxBeCxjeCx2eCxweF07ZnVuY3Rpb24gRHgoKXt9ZnVuY3Rpb24gUngodCxuLGUpe3QuX2NvbnRleHQuYmV6aWVyQ3VydmVUbygoMip0Ll94MCt0Ll94MSkvMywoMip0Ll95MCt0Ll95MSkvMywodC5feDArMip0Ll94MSkvMywodC5feTArMip0Ll95MSkvMywodC5feDArNCp0Ll94MStuKS82LCh0Ll95MCs0KnQuX3kxK2UpLzYpfWZ1bmN0aW9uIEZ4KHQpe3RoaXMuX2NvbnRleHQ9dH1mdW5jdGlvbiBxeCh0KXt0aGlzLl9jb250ZXh0PXR9ZnVuY3Rpb24gVXgodCl7dGhpcy5fY29udGV4dD10fWZ1bmN0aW9uIEl4KHQsbil7dGhpcy5fYmFzaXM9bmV3IEZ4KHQpLHRoaXMuX2JldGE9bn1GeC5wcm90b3R5cGU9e2FyZWFTdGFydDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9MH0sYXJlYUVuZDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9TmFOfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl94MD10aGlzLl94MT10aGlzLl95MD10aGlzLl95MT1OYU4sdGhpcy5fcG9pbnQ9MH0sbGluZUVuZDpmdW5jdGlvbigpe3N3aXRjaCh0aGlzLl9wb2ludCl7Y2FzZSAzOlJ4KHRoaXMsdGhpcy5feDEsdGhpcy5feTEpO2Nhc2UgMjp0aGlzLl9jb250ZXh0LmxpbmVUbyh0aGlzLl94MSx0aGlzLl95MSl9KHRoaXMuX2xpbmV8fDAhPT10aGlzLl9saW5lJiYxPT09dGhpcy5fcG9pbnQpJiZ0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpLHRoaXMuX2xpbmU9MS10aGlzLl9saW5lfSxwb2ludDpmdW5jdGlvbih0LG4pe3N3aXRjaCh0PSt0LG49K24sdGhpcy5fcG9pbnQpe2Nhc2UgMDp0aGlzLl9wb2ludD0xLHRoaXMuX2xpbmU/dGhpcy5fY29udGV4dC5saW5lVG8odCxuKTp0aGlzLl9jb250ZXh0Lm1vdmVUbyh0LG4pO2JyZWFrO2Nhc2UgMTp0aGlzLl9wb2ludD0yO2JyZWFrO2Nhc2UgMjp0aGlzLl9wb2ludD0zLHRoaXMuX2NvbnRleHQubGluZVRvKCg1KnRoaXMuX3gwK3RoaXMuX3gxKS82LCg1KnRoaXMuX3kwK3RoaXMuX3kxKS82KTtkZWZhdWx0OlJ4KHRoaXMsdCxuKX10aGlzLl94MD10aGlzLl94MSx0aGlzLl94MT10LHRoaXMuX3kwPXRoaXMuX3kxLHRoaXMuX3kxPW59fSxxeC5wcm90b3R5cGU9e2FyZWFTdGFydDpEeCxhcmVhRW5kOkR4LGxpbmVTdGFydDpmdW5jdGlvbigpe3RoaXMuX3gwPXRoaXMuX3gxPXRoaXMuX3gyPXRoaXMuX3gzPXRoaXMuX3g0PXRoaXMuX3kwPXRoaXMuX3kxPXRoaXMuX3kyPXRoaXMuX3kzPXRoaXMuX3k0PU5hTix0aGlzLl9wb2ludD0wfSxsaW5lRW5kOmZ1bmN0aW9uKCl7c3dpdGNoKHRoaXMuX3BvaW50KXtjYXNlIDE6dGhpcy5fY29udGV4dC5tb3ZlVG8odGhpcy5feDIsdGhpcy5feTIpLHRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCk7YnJlYWs7Y2FzZSAyOnRoaXMuX2NvbnRleHQubW92ZVRvKCh0aGlzLl94MisyKnRoaXMuX3gzKS8zLCh0aGlzLl95MisyKnRoaXMuX3kzKS8zKSx0aGlzLl9jb250ZXh0LmxpbmVUbygodGhpcy5feDMrMip0aGlzLl94MikvMywodGhpcy5feTMrMip0aGlzLl95MikvMyksdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKTticmVhaztjYXNlIDM6dGhpcy5wb2ludCh0aGlzLl94Mix0aGlzLl95MiksdGhpcy5wb2ludCh0aGlzLl94Myx0aGlzLl95MyksdGhpcy5wb2ludCh0aGlzLl94NCx0aGlzLl95NCl9fSxwb2ludDpmdW5jdGlvbih0LG4pe3N3aXRjaCh0PSt0LG49K24sdGhpcy5fcG9pbnQpe2Nhc2UgMDp0aGlzLl9wb2ludD0xLHRoaXMuX3gyPXQsdGhpcy5feTI9bjticmVhaztjYXNlIDE6dGhpcy5fcG9pbnQ9Mix0aGlzLl94Mz10LHRoaXMuX3kzPW47YnJlYWs7Y2FzZSAyOnRoaXMuX3BvaW50PTMsdGhpcy5feDQ9dCx0aGlzLl95ND1uLHRoaXMuX2NvbnRleHQubW92ZVRvKCh0aGlzLl94MCs0KnRoaXMuX3gxK3QpLzYsKHRoaXMuX3kwKzQqdGhpcy5feTErbikvNik7YnJlYWs7ZGVmYXVsdDpSeCh0aGlzLHQsbil9dGhpcy5feDA9dGhpcy5feDEsdGhpcy5feDE9dCx0aGlzLl95MD10aGlzLl95MSx0aGlzLl95MT1ufX0sVXgucHJvdG90eXBlPXthcmVhU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPTB9LGFyZWFFbmQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPU5hTn0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5feDA9dGhpcy5feDE9dGhpcy5feTA9dGhpcy5feTE9TmFOLHRoaXMuX3BvaW50PTB9LGxpbmVFbmQ6ZnVuY3Rpb24oKXsodGhpcy5fbGluZXx8MCE9PXRoaXMuX2xpbmUmJjM9PT10aGlzLl9wb2ludCkmJnRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCksdGhpcy5fbGluZT0xLXRoaXMuX2xpbmV9LHBvaW50OmZ1bmN0aW9uKHQsbil7c3dpdGNoKHQ9K3Qsbj0rbix0aGlzLl9wb2ludCl7Y2FzZSAwOnRoaXMuX3BvaW50PTE7YnJlYWs7Y2FzZSAxOnRoaXMuX3BvaW50PTI7YnJlYWs7Y2FzZSAyOnRoaXMuX3BvaW50PTM7dmFyIGU9KHRoaXMuX3gwKzQqdGhpcy5feDErdCkvNixyPSh0aGlzLl95MCs0KnRoaXMuX3kxK24pLzY7dGhpcy5fbGluZT90aGlzLl9jb250ZXh0LmxpbmVUbyhlLHIpOnRoaXMuX2NvbnRleHQubW92ZVRvKGUscik7YnJlYWs7Y2FzZSAzOnRoaXMuX3BvaW50PTQ7ZGVmYXVsdDpSeCh0aGlzLHQsbil9dGhpcy5feDA9dGhpcy5feDEsdGhpcy5feDE9dCx0aGlzLl95MD10aGlzLl95MSx0aGlzLl95MT1ufX0sSXgucHJvdG90eXBlPXtsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl94PVtdLHRoaXMuX3k9W10sdGhpcy5fYmFzaXMubGluZVN0YXJ0KCl9LGxpbmVFbmQ6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl94LG49dGhpcy5feSxlPXQubGVuZ3RoLTE7aWYoZT4wKWZvcih2YXIgcixpPXRbMF0sbz1uWzBdLGE9dFtlXS1pLHU9bltlXS1vLGM9LTE7KytjPD1lOylyPWMvZSx0aGlzLl9iYXNpcy5wb2ludCh0aGlzLl9iZXRhKnRbY10rKDEtdGhpcy5fYmV0YSkqKGkrciphKSx0aGlzLl9iZXRhKm5bY10rKDEtdGhpcy5fYmV0YSkqKG8rcip1KSk7dGhpcy5feD10aGlzLl95PW51bGwsdGhpcy5fYmFzaXMubGluZUVuZCgpfSxwb2ludDpmdW5jdGlvbih0LG4pe3RoaXMuX3gucHVzaCgrdCksdGhpcy5feS5wdXNoKCtuKX19O3ZhciBPeD1mdW5jdGlvbiB0KG4pe2Z1bmN0aW9uIGUodCl7cmV0dXJuIDE9PT1uP25ldyBGeCh0KTpuZXcgSXgodCxuKX1yZXR1cm4gZS5iZXRhPWZ1bmN0aW9uKG4pe3JldHVybiB0KCtuKX0sZX0oLjg1KTtmdW5jdGlvbiBCeCh0LG4sZSl7dC5fY29udGV4dC5iZXppZXJDdXJ2ZVRvKHQuX3gxK3QuX2sqKHQuX3gyLXQuX3gwKSx0Ll95MSt0Ll9rKih0Ll95Mi10Ll95MCksdC5feDIrdC5fayoodC5feDEtbiksdC5feTIrdC5fayoodC5feTEtZSksdC5feDIsdC5feTIpfWZ1bmN0aW9uIFl4KHQsbil7dGhpcy5fY29udGV4dD10LHRoaXMuX2s9KDEtbikvNn1ZeC5wcm90b3R5cGU9e2FyZWFTdGFydDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9MH0sYXJlYUVuZDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9TmFOfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl94MD10aGlzLl94MT10aGlzLl94Mj10aGlzLl95MD10aGlzLl95MT10aGlzLl95Mj1OYU4sdGhpcy5fcG9pbnQ9MH0sbGluZUVuZDpmdW5jdGlvbigpe3N3aXRjaCh0aGlzLl9wb2ludCl7Y2FzZSAyOnRoaXMuX2NvbnRleHQubGluZVRvKHRoaXMuX3gyLHRoaXMuX3kyKTticmVhaztjYXNlIDM6QngodGhpcyx0aGlzLl94MSx0aGlzLl95MSl9KHRoaXMuX2xpbmV8fDAhPT10aGlzLl9saW5lJiYxPT09dGhpcy5fcG9pbnQpJiZ0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpLHRoaXMuX2xpbmU9MS10aGlzLl9saW5lfSxwb2ludDpmdW5jdGlvbih0LG4pe3N3aXRjaCh0PSt0LG49K24sdGhpcy5fcG9pbnQpe2Nhc2UgMDp0aGlzLl9wb2ludD0xLHRoaXMuX2xpbmU/dGhpcy5fY29udGV4dC5saW5lVG8odCxuKTp0aGlzLl9jb250ZXh0Lm1vdmVUbyh0LG4pO2JyZWFrO2Nhc2UgMTp0aGlzLl9wb2ludD0yLHRoaXMuX3gxPXQsdGhpcy5feTE9bjticmVhaztjYXNlIDI6dGhpcy5fcG9pbnQ9MztkZWZhdWx0OkJ4KHRoaXMsdCxuKX10aGlzLl94MD10aGlzLl94MSx0aGlzLl94MT10aGlzLl94Mix0aGlzLl94Mj10LHRoaXMuX3kwPXRoaXMuX3kxLHRoaXMuX3kxPXRoaXMuX3kyLHRoaXMuX3kyPW59fTt2YXIgTHg9ZnVuY3Rpb24gdChuKXtmdW5jdGlvbiBlKHQpe3JldHVybiBuZXcgWXgodCxuKX1yZXR1cm4gZS50ZW5zaW9uPWZ1bmN0aW9uKG4pe3JldHVybiB0KCtuKX0sZX0oMCk7ZnVuY3Rpb24gangodCxuKXt0aGlzLl9jb250ZXh0PXQsdGhpcy5faz0oMS1uKS82fWp4LnByb3RvdHlwZT17YXJlYVN0YXJ0OkR4LGFyZWFFbmQ6RHgsbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5feDA9dGhpcy5feDE9dGhpcy5feDI9dGhpcy5feDM9dGhpcy5feDQ9dGhpcy5feDU9dGhpcy5feTA9dGhpcy5feTE9dGhpcy5feTI9dGhpcy5feTM9dGhpcy5feTQ9dGhpcy5feTU9TmFOLHRoaXMuX3BvaW50PTB9LGxpbmVFbmQ6ZnVuY3Rpb24oKXtzd2l0Y2godGhpcy5fcG9pbnQpe2Nhc2UgMTp0aGlzLl9jb250ZXh0Lm1vdmVUbyh0aGlzLl94Myx0aGlzLl95MyksdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKTticmVhaztjYXNlIDI6dGhpcy5fY29udGV4dC5saW5lVG8odGhpcy5feDMsdGhpcy5feTMpLHRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCk7YnJlYWs7Y2FzZSAzOnRoaXMucG9pbnQodGhpcy5feDMsdGhpcy5feTMpLHRoaXMucG9pbnQodGhpcy5feDQsdGhpcy5feTQpLHRoaXMucG9pbnQodGhpcy5feDUsdGhpcy5feTUpfX0scG9pbnQ6ZnVuY3Rpb24odCxuKXtzd2l0Y2godD0rdCxuPStuLHRoaXMuX3BvaW50KXtjYXNlIDA6dGhpcy5fcG9pbnQ9MSx0aGlzLl94Mz10LHRoaXMuX3kzPW47YnJlYWs7Y2FzZSAxOnRoaXMuX3BvaW50PTIsdGhpcy5fY29udGV4dC5tb3ZlVG8odGhpcy5feDQ9dCx0aGlzLl95ND1uKTticmVhaztjYXNlIDI6dGhpcy5fcG9pbnQ9Myx0aGlzLl94NT10LHRoaXMuX3k1PW47YnJlYWs7ZGVmYXVsdDpCeCh0aGlzLHQsbil9dGhpcy5feDA9dGhpcy5feDEsdGhpcy5feDE9dGhpcy5feDIsdGhpcy5feDI9dCx0aGlzLl95MD10aGlzLl95MSx0aGlzLl95MT10aGlzLl95Mix0aGlzLl95Mj1ufX07dmFyIEh4PWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0KXtyZXR1cm4gbmV3IGp4KHQsbil9cmV0dXJuIGUudGVuc2lvbj1mdW5jdGlvbihuKXtyZXR1cm4gdCgrbil9LGV9KDApO2Z1bmN0aW9uIFh4KHQsbil7dGhpcy5fY29udGV4dD10LHRoaXMuX2s9KDEtbikvNn1YeC5wcm90b3R5cGU9e2FyZWFTdGFydDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9MH0sYXJlYUVuZDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9TmFOfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl94MD10aGlzLl94MT10aGlzLl94Mj10aGlzLl95MD10aGlzLl95MT10aGlzLl95Mj1OYU4sdGhpcy5fcG9pbnQ9MH0sbGluZUVuZDpmdW5jdGlvbigpeyh0aGlzLl9saW5lfHwwIT09dGhpcy5fbGluZSYmMz09PXRoaXMuX3BvaW50KSYmdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKSx0aGlzLl9saW5lPTEtdGhpcy5fbGluZX0scG9pbnQ6ZnVuY3Rpb24odCxuKXtzd2l0Y2godD0rdCxuPStuLHRoaXMuX3BvaW50KXtjYXNlIDA6dGhpcy5fcG9pbnQ9MTticmVhaztjYXNlIDE6dGhpcy5fcG9pbnQ9MjticmVhaztjYXNlIDI6dGhpcy5fcG9pbnQ9Myx0aGlzLl9saW5lP3RoaXMuX2NvbnRleHQubGluZVRvKHRoaXMuX3gyLHRoaXMuX3kyKTp0aGlzLl9jb250ZXh0Lm1vdmVUbyh0aGlzLl94Mix0aGlzLl95Mik7YnJlYWs7Y2FzZSAzOnRoaXMuX3BvaW50PTQ7ZGVmYXVsdDpCeCh0aGlzLHQsbil9dGhpcy5feDA9dGhpcy5feDEsdGhpcy5feDE9dGhpcy5feDIsdGhpcy5feDI9dCx0aGlzLl95MD10aGlzLl95MSx0aGlzLl95MT10aGlzLl95Mix0aGlzLl95Mj1ufX07dmFyIEd4PWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0KXtyZXR1cm4gbmV3IFh4KHQsbil9cmV0dXJuIGUudGVuc2lvbj1mdW5jdGlvbihuKXtyZXR1cm4gdCgrbil9LGV9KDApO2Z1bmN0aW9uIFZ4KHQsbixlKXt2YXIgcj10Ll94MSxpPXQuX3kxLG89dC5feDIsYT10Ll95MjtpZih0Ll9sMDFfYT5UbSl7dmFyIHU9Mip0Ll9sMDFfMmErMyp0Ll9sMDFfYSp0Ll9sMTJfYSt0Ll9sMTJfMmEsYz0zKnQuX2wwMV9hKih0Ll9sMDFfYSt0Ll9sMTJfYSk7cj0ocip1LXQuX3gwKnQuX2wxMl8yYSt0Ll94Mip0Ll9sMDFfMmEpL2MsaT0oaSp1LXQuX3kwKnQuX2wxMl8yYSt0Ll95Mip0Ll9sMDFfMmEpL2N9aWYodC5fbDIzX2E+VG0pe3ZhciBmPTIqdC5fbDIzXzJhKzMqdC5fbDIzX2EqdC5fbDEyX2ErdC5fbDEyXzJhLHM9Myp0Ll9sMjNfYSoodC5fbDIzX2ErdC5fbDEyX2EpO289KG8qZit0Ll94MSp0Ll9sMjNfMmEtbip0Ll9sMTJfMmEpL3MsYT0oYSpmK3QuX3kxKnQuX2wyM18yYS1lKnQuX2wxMl8yYSkvc310Ll9jb250ZXh0LmJlemllckN1cnZlVG8ocixpLG8sYSx0Ll94Mix0Ll95Mil9ZnVuY3Rpb24gV3godCxuKXt0aGlzLl9jb250ZXh0PXQsdGhpcy5fYWxwaGE9bn1XeC5wcm90b3R5cGU9e2FyZWFTdGFydDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9MH0sYXJlYUVuZDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9TmFOfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl94MD10aGlzLl94MT10aGlzLl94Mj10aGlzLl95MD10aGlzLl95MT10aGlzLl95Mj1OYU4sdGhpcy5fbDAxX2E9dGhpcy5fbDEyX2E9dGhpcy5fbDIzX2E9dGhpcy5fbDAxXzJhPXRoaXMuX2wxMl8yYT10aGlzLl9sMjNfMmE9dGhpcy5fcG9pbnQ9MH0sbGluZUVuZDpmdW5jdGlvbigpe3N3aXRjaCh0aGlzLl9wb2ludCl7Y2FzZSAyOnRoaXMuX2NvbnRleHQubGluZVRvKHRoaXMuX3gyLHRoaXMuX3kyKTticmVhaztjYXNlIDM6dGhpcy5wb2ludCh0aGlzLl94Mix0aGlzLl95Mil9KHRoaXMuX2xpbmV8fDAhPT10aGlzLl9saW5lJiYxPT09dGhpcy5fcG9pbnQpJiZ0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpLHRoaXMuX2xpbmU9MS10aGlzLl9saW5lfSxwb2ludDpmdW5jdGlvbih0LG4pe2lmKHQ9K3Qsbj0rbix0aGlzLl9wb2ludCl7dmFyIGU9dGhpcy5feDItdCxyPXRoaXMuX3kyLW47dGhpcy5fbDIzX2E9TWF0aC5zcXJ0KHRoaXMuX2wyM18yYT1NYXRoLnBvdyhlKmUrcipyLHRoaXMuX2FscGhhKSl9c3dpdGNoKHRoaXMuX3BvaW50KXtjYXNlIDA6dGhpcy5fcG9pbnQ9MSx0aGlzLl9saW5lP3RoaXMuX2NvbnRleHQubGluZVRvKHQsbik6dGhpcy5fY29udGV4dC5tb3ZlVG8odCxuKTticmVhaztjYXNlIDE6dGhpcy5fcG9pbnQ9MjticmVhaztjYXNlIDI6dGhpcy5fcG9pbnQ9MztkZWZhdWx0OlZ4KHRoaXMsdCxuKX10aGlzLl9sMDFfYT10aGlzLl9sMTJfYSx0aGlzLl9sMTJfYT10aGlzLl9sMjNfYSx0aGlzLl9sMDFfMmE9dGhpcy5fbDEyXzJhLHRoaXMuX2wxMl8yYT10aGlzLl9sMjNfMmEsdGhpcy5feDA9dGhpcy5feDEsdGhpcy5feDE9dGhpcy5feDIsdGhpcy5feDI9dCx0aGlzLl95MD10aGlzLl95MSx0aGlzLl95MT10aGlzLl95Mix0aGlzLl95Mj1ufX07dmFyIFp4PWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0KXtyZXR1cm4gbj9uZXcgV3godCxuKTpuZXcgWXgodCwwKX1yZXR1cm4gZS5hbHBoYT1mdW5jdGlvbihuKXtyZXR1cm4gdCgrbil9LGV9KC41KTtmdW5jdGlvbiBLeCh0LG4pe3RoaXMuX2NvbnRleHQ9dCx0aGlzLl9hbHBoYT1ufUt4LnByb3RvdHlwZT17YXJlYVN0YXJ0OkR4LGFyZWFFbmQ6RHgsbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5feDA9dGhpcy5feDE9dGhpcy5feDI9dGhpcy5feDM9dGhpcy5feDQ9dGhpcy5feDU9dGhpcy5feTA9dGhpcy5feTE9dGhpcy5feTI9dGhpcy5feTM9dGhpcy5feTQ9dGhpcy5feTU9TmFOLHRoaXMuX2wwMV9hPXRoaXMuX2wxMl9hPXRoaXMuX2wyM19hPXRoaXMuX2wwMV8yYT10aGlzLl9sMTJfMmE9dGhpcy5fbDIzXzJhPXRoaXMuX3BvaW50PTB9LGxpbmVFbmQ6ZnVuY3Rpb24oKXtzd2l0Y2godGhpcy5fcG9pbnQpe2Nhc2UgMTp0aGlzLl9jb250ZXh0Lm1vdmVUbyh0aGlzLl94Myx0aGlzLl95MyksdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKTticmVhaztjYXNlIDI6dGhpcy5fY29udGV4dC5saW5lVG8odGhpcy5feDMsdGhpcy5feTMpLHRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCk7YnJlYWs7Y2FzZSAzOnRoaXMucG9pbnQodGhpcy5feDMsdGhpcy5feTMpLHRoaXMucG9pbnQodGhpcy5feDQsdGhpcy5feTQpLHRoaXMucG9pbnQodGhpcy5feDUsdGhpcy5feTUpfX0scG9pbnQ6ZnVuY3Rpb24odCxuKXtpZih0PSt0LG49K24sdGhpcy5fcG9pbnQpe3ZhciBlPXRoaXMuX3gyLXQscj10aGlzLl95Mi1uO3RoaXMuX2wyM19hPU1hdGguc3FydCh0aGlzLl9sMjNfMmE9TWF0aC5wb3coZSplK3Iqcix0aGlzLl9hbHBoYSkpfXN3aXRjaCh0aGlzLl9wb2ludCl7Y2FzZSAwOnRoaXMuX3BvaW50PTEsdGhpcy5feDM9dCx0aGlzLl95Mz1uO2JyZWFrO2Nhc2UgMTp0aGlzLl9wb2ludD0yLHRoaXMuX2NvbnRleHQubW92ZVRvKHRoaXMuX3g0PXQsdGhpcy5feTQ9bik7YnJlYWs7Y2FzZSAyOnRoaXMuX3BvaW50PTMsdGhpcy5feDU9dCx0aGlzLl95NT1uO2JyZWFrO2RlZmF1bHQ6VngodGhpcyx0LG4pfXRoaXMuX2wwMV9hPXRoaXMuX2wxMl9hLHRoaXMuX2wxMl9hPXRoaXMuX2wyM19hLHRoaXMuX2wwMV8yYT10aGlzLl9sMTJfMmEsdGhpcy5fbDEyXzJhPXRoaXMuX2wyM18yYSx0aGlzLl94MD10aGlzLl94MSx0aGlzLl94MT10aGlzLl94Mix0aGlzLl94Mj10LHRoaXMuX3kwPXRoaXMuX3kxLHRoaXMuX3kxPXRoaXMuX3kyLHRoaXMuX3kyPW59fTt2YXIgUXg9ZnVuY3Rpb24gdChuKXtmdW5jdGlvbiBlKHQpe3JldHVybiBuP25ldyBLeCh0LG4pOm5ldyBqeCh0LDApfXJldHVybiBlLmFscGhhPWZ1bmN0aW9uKG4pe3JldHVybiB0KCtuKX0sZX0oLjUpO2Z1bmN0aW9uIEp4KHQsbil7dGhpcy5fY29udGV4dD10LHRoaXMuX2FscGhhPW59SngucHJvdG90eXBlPXthcmVhU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPTB9LGFyZWFFbmQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPU5hTn0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5feDA9dGhpcy5feDE9dGhpcy5feDI9dGhpcy5feTA9dGhpcy5feTE9dGhpcy5feTI9TmFOLHRoaXMuX2wwMV9hPXRoaXMuX2wxMl9hPXRoaXMuX2wyM19hPXRoaXMuX2wwMV8yYT10aGlzLl9sMTJfMmE9dGhpcy5fbDIzXzJhPXRoaXMuX3BvaW50PTB9LGxpbmVFbmQ6ZnVuY3Rpb24oKXsodGhpcy5fbGluZXx8MCE9PXRoaXMuX2xpbmUmJjM9PT10aGlzLl9wb2ludCkmJnRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCksdGhpcy5fbGluZT0xLXRoaXMuX2xpbmV9LHBvaW50OmZ1bmN0aW9uKHQsbil7aWYodD0rdCxuPStuLHRoaXMuX3BvaW50KXt2YXIgZT10aGlzLl94Mi10LHI9dGhpcy5feTItbjt0aGlzLl9sMjNfYT1NYXRoLnNxcnQodGhpcy5fbDIzXzJhPU1hdGgucG93KGUqZStyKnIsdGhpcy5fYWxwaGEpKX1zd2l0Y2godGhpcy5fcG9pbnQpe2Nhc2UgMDp0aGlzLl9wb2ludD0xO2JyZWFrO2Nhc2UgMTp0aGlzLl9wb2ludD0yO2JyZWFrO2Nhc2UgMjp0aGlzLl9wb2ludD0zLHRoaXMuX2xpbmU/dGhpcy5fY29udGV4dC5saW5lVG8odGhpcy5feDIsdGhpcy5feTIpOnRoaXMuX2NvbnRleHQubW92ZVRvKHRoaXMuX3gyLHRoaXMuX3kyKTticmVhaztjYXNlIDM6dGhpcy5fcG9pbnQ9NDtkZWZhdWx0OlZ4KHRoaXMsdCxuKX10aGlzLl9sMDFfYT10aGlzLl9sMTJfYSx0aGlzLl9sMTJfYT10aGlzLl9sMjNfYSx0aGlzLl9sMDFfMmE9dGhpcy5fbDEyXzJhLHRoaXMuX2wxMl8yYT10aGlzLl9sMjNfMmEsdGhpcy5feDA9dGhpcy5feDEsdGhpcy5feDE9dGhpcy5feDIsdGhpcy5feDI9dCx0aGlzLl95MD10aGlzLl95MSx0aGlzLl95MT10aGlzLl95Mix0aGlzLl95Mj1ufX07dmFyIHR3PWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0KXtyZXR1cm4gbj9uZXcgSngodCxuKTpuZXcgWHgodCwwKX1yZXR1cm4gZS5hbHBoYT1mdW5jdGlvbihuKXtyZXR1cm4gdCgrbil9LGV9KC41KTtmdW5jdGlvbiBudyh0KXt0aGlzLl9jb250ZXh0PXR9ZnVuY3Rpb24gZXcodCl7cmV0dXJuIHQ8MD8tMToxfWZ1bmN0aW9uIHJ3KHQsbixlKXt2YXIgcj10Ll94MS10Ll94MCxpPW4tdC5feDEsbz0odC5feTEtdC5feTApLyhyfHxpPDAmJi0wKSxhPShlLXQuX3kxKS8oaXx8cjwwJiYtMCksdT0obyppK2EqcikvKHIraSk7cmV0dXJuKGV3KG8pK2V3KGEpKSpNYXRoLm1pbihNYXRoLmFicyhvKSxNYXRoLmFicyhhKSwuNSpNYXRoLmFicyh1KSl8fDB9ZnVuY3Rpb24gaXcodCxuKXt2YXIgZT10Ll94MS10Ll94MDtyZXR1cm4gZT8oMyoodC5feTEtdC5feTApL2UtbikvMjpufWZ1bmN0aW9uIG93KHQsbixlKXt2YXIgcj10Ll94MCxpPXQuX3kwLG89dC5feDEsYT10Ll95MSx1PShvLXIpLzM7dC5fY29udGV4dC5iZXppZXJDdXJ2ZVRvKHIrdSxpK3UqbixvLXUsYS11KmUsbyxhKX1mdW5jdGlvbiBhdyh0KXt0aGlzLl9jb250ZXh0PXR9ZnVuY3Rpb24gdXcodCl7dGhpcy5fY29udGV4dD1uZXcgY3codCl9ZnVuY3Rpb24gY3codCl7dGhpcy5fY29udGV4dD10fWZ1bmN0aW9uIGZ3KHQpe3RoaXMuX2NvbnRleHQ9dH1mdW5jdGlvbiBzdyh0KXt2YXIgbixlLHI9dC5sZW5ndGgtMSxpPW5ldyBBcnJheShyKSxvPW5ldyBBcnJheShyKSxhPW5ldyBBcnJheShyKTtmb3IoaVswXT0wLG9bMF09MixhWzBdPXRbMF0rMip0WzFdLG49MTtuPHItMTsrK24paVtuXT0xLG9bbl09NCxhW25dPTQqdFtuXSsyKnRbbisxXTtmb3IoaVtyLTFdPTIsb1tyLTFdPTcsYVtyLTFdPTgqdFtyLTFdK3Rbcl0sbj0xO248cjsrK24pZT1pW25dL29bbi0xXSxvW25dLT1lLGFbbl0tPWUqYVtuLTFdO2ZvcihpW3ItMV09YVtyLTFdL29bci0xXSxuPXItMjtuPj0wOy0tbilpW25dPShhW25dLWlbbisxXSkvb1tuXTtmb3Iob1tyLTFdPSh0W3JdK2lbci0xXSkvMixuPTA7bjxyLTE7KytuKW9bbl09Mip0W24rMV0taVtuKzFdO3JldHVybltpLG9dfWZ1bmN0aW9uIGx3KHQsbil7dGhpcy5fY29udGV4dD10LHRoaXMuX3Q9bn1mdW5jdGlvbiBodyh0LG4pe2lmKChpPXQubGVuZ3RoKT4xKWZvcih2YXIgZSxyLGksbz0xLGE9dFtuWzBdXSx1PWEubGVuZ3RoO288aTsrK28pZm9yKHI9YSxhPXRbbltvXV0sZT0wO2U8dTsrK2UpYVtlXVsxXSs9YVtlXVswXT1pc05hTihyW2VdWzFdKT9yW2VdWzBdOnJbZV1bMV19ZnVuY3Rpb24gZHcodCl7Zm9yKHZhciBuPXQubGVuZ3RoLGU9bmV3IEFycmF5KG4pOy0tbj49MDspZVtuXT1uO3JldHVybiBlfWZ1bmN0aW9uIHB3KHQsbil7cmV0dXJuIHRbbl19ZnVuY3Rpb24gZ3codCl7Y29uc3Qgbj1bXTtyZXR1cm4gbi5rZXk9dCxufWZ1bmN0aW9uIHl3KHQpe3ZhciBuPXQubWFwKHZ3KTtyZXR1cm4gZHcodCkuc29ydCgoZnVuY3Rpb24odCxlKXtyZXR1cm4gblt0XS1uW2VdfSkpfWZ1bmN0aW9uIHZ3KHQpe2Zvcih2YXIgbixlPS0xLHI9MCxpPXQubGVuZ3RoLG89LTEvMDsrK2U8aTspKG49K3RbZV1bMV0pPm8mJihvPW4scj1lKTtyZXR1cm4gcn1mdW5jdGlvbiBfdyh0KXt2YXIgbj10Lm1hcChidyk7cmV0dXJuIGR3KHQpLnNvcnQoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIG5bdF0tbltlXX0pKX1mdW5jdGlvbiBidyh0KXtmb3IodmFyIG4sZT0wLHI9LTEsaT10Lmxlbmd0aDsrK3I8aTspKG49K3Rbcl1bMV0pJiYoZSs9bik7cmV0dXJuIGV9bncucHJvdG90eXBlPXthcmVhU3RhcnQ6RHgsYXJlYUVuZDpEeCxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9wb2ludD0wfSxsaW5lRW5kOmZ1bmN0aW9uKCl7dGhpcy5fcG9pbnQmJnRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCl9LHBvaW50OmZ1bmN0aW9uKHQsbil7dD0rdCxuPStuLHRoaXMuX3BvaW50P3RoaXMuX2NvbnRleHQubGluZVRvKHQsbik6KHRoaXMuX3BvaW50PTEsdGhpcy5fY29udGV4dC5tb3ZlVG8odCxuKSl9fSxhdy5wcm90b3R5cGU9e2FyZWFTdGFydDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9MH0sYXJlYUVuZDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9TmFOfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl94MD10aGlzLl94MT10aGlzLl95MD10aGlzLl95MT10aGlzLl90MD1OYU4sdGhpcy5fcG9pbnQ9MH0sbGluZUVuZDpmdW5jdGlvbigpe3N3aXRjaCh0aGlzLl9wb2ludCl7Y2FzZSAyOnRoaXMuX2NvbnRleHQubGluZVRvKHRoaXMuX3gxLHRoaXMuX3kxKTticmVhaztjYXNlIDM6b3codGhpcyx0aGlzLl90MCxpdyh0aGlzLHRoaXMuX3QwKSl9KHRoaXMuX2xpbmV8fDAhPT10aGlzLl9saW5lJiYxPT09dGhpcy5fcG9pbnQpJiZ0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpLHRoaXMuX2xpbmU9MS10aGlzLl9saW5lfSxwb2ludDpmdW5jdGlvbih0LG4pe3ZhciBlPU5hTjtpZihuPStuLCh0PSt0KSE9PXRoaXMuX3gxfHxuIT09dGhpcy5feTEpe3N3aXRjaCh0aGlzLl9wb2ludCl7Y2FzZSAwOnRoaXMuX3BvaW50PTEsdGhpcy5fbGluZT90aGlzLl9jb250ZXh0LmxpbmVUbyh0LG4pOnRoaXMuX2NvbnRleHQubW92ZVRvKHQsbik7YnJlYWs7Y2FzZSAxOnRoaXMuX3BvaW50PTI7YnJlYWs7Y2FzZSAyOnRoaXMuX3BvaW50PTMsb3codGhpcyxpdyh0aGlzLGU9cncodGhpcyx0LG4pKSxlKTticmVhaztkZWZhdWx0Om93KHRoaXMsdGhpcy5fdDAsZT1ydyh0aGlzLHQsbikpfXRoaXMuX3gwPXRoaXMuX3gxLHRoaXMuX3gxPXQsdGhpcy5feTA9dGhpcy5feTEsdGhpcy5feTE9bix0aGlzLl90MD1lfX19LCh1dy5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShhdy5wcm90b3R5cGUpKS5wb2ludD1mdW5jdGlvbih0LG4pe2F3LnByb3RvdHlwZS5wb2ludC5jYWxsKHRoaXMsbix0KX0sY3cucHJvdG90eXBlPXttb3ZlVG86ZnVuY3Rpb24odCxuKXt0aGlzLl9jb250ZXh0Lm1vdmVUbyhuLHQpfSxjbG9zZVBhdGg6ZnVuY3Rpb24oKXt0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpfSxsaW5lVG86ZnVuY3Rpb24odCxuKXt0aGlzLl9jb250ZXh0LmxpbmVUbyhuLHQpfSxiZXppZXJDdXJ2ZVRvOmZ1bmN0aW9uKHQsbixlLHIsaSxvKXt0aGlzLl9jb250ZXh0LmJlemllckN1cnZlVG8obix0LHIsZSxvLGkpfX0sZncucHJvdG90eXBlPXthcmVhU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPTB9LGFyZWFFbmQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPU5hTn0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5feD1bXSx0aGlzLl95PVtdfSxsaW5lRW5kOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5feCxuPXRoaXMuX3ksZT10Lmxlbmd0aDtpZihlKWlmKHRoaXMuX2xpbmU/dGhpcy5fY29udGV4dC5saW5lVG8odFswXSxuWzBdKTp0aGlzLl9jb250ZXh0Lm1vdmVUbyh0WzBdLG5bMF0pLDI9PT1lKXRoaXMuX2NvbnRleHQubGluZVRvKHRbMV0sblsxXSk7ZWxzZSBmb3IodmFyIHI9c3codCksaT1zdyhuKSxvPTAsYT0xO2E8ZTsrK28sKythKXRoaXMuX2NvbnRleHQuYmV6aWVyQ3VydmVUbyhyWzBdW29dLGlbMF1bb10sclsxXVtvXSxpWzFdW29dLHRbYV0sblthXSk7KHRoaXMuX2xpbmV8fDAhPT10aGlzLl9saW5lJiYxPT09ZSkmJnRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCksdGhpcy5fbGluZT0xLXRoaXMuX2xpbmUsdGhpcy5feD10aGlzLl95PW51bGx9LHBvaW50OmZ1bmN0aW9uKHQsbil7dGhpcy5feC5wdXNoKCt0KSx0aGlzLl95LnB1c2goK24pfX0sbHcucHJvdG90eXBlPXthcmVhU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPTB9LGFyZWFFbmQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPU5hTn0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5feD10aGlzLl95PU5hTix0aGlzLl9wb2ludD0wfSxsaW5lRW5kOmZ1bmN0aW9uKCl7MDx0aGlzLl90JiZ0aGlzLl90PDEmJjI9PT10aGlzLl9wb2ludCYmdGhpcy5fY29udGV4dC5saW5lVG8odGhpcy5feCx0aGlzLl95KSwodGhpcy5fbGluZXx8MCE9PXRoaXMuX2xpbmUmJjE9PT10aGlzLl9wb2ludCkmJnRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCksdGhpcy5fbGluZT49MCYmKHRoaXMuX3Q9MS10aGlzLl90LHRoaXMuX2xpbmU9MS10aGlzLl9saW5lKX0scG9pbnQ6ZnVuY3Rpb24odCxuKXtzd2l0Y2godD0rdCxuPStuLHRoaXMuX3BvaW50KXtjYXNlIDA6dGhpcy5fcG9pbnQ9MSx0aGlzLl9saW5lP3RoaXMuX2NvbnRleHQubGluZVRvKHQsbik6dGhpcy5fY29udGV4dC5tb3ZlVG8odCxuKTticmVhaztjYXNlIDE6dGhpcy5fcG9pbnQ9MjtkZWZhdWx0OmlmKHRoaXMuX3Q8PTApdGhpcy5fY29udGV4dC5saW5lVG8odGhpcy5feCxuKSx0aGlzLl9jb250ZXh0LmxpbmVUbyh0LG4pO2Vsc2V7dmFyIGU9dGhpcy5feCooMS10aGlzLl90KSt0KnRoaXMuX3Q7dGhpcy5fY29udGV4dC5saW5lVG8oZSx0aGlzLl95KSx0aGlzLl9jb250ZXh0LmxpbmVUbyhlLG4pfX10aGlzLl94PXQsdGhpcy5feT1ufX07dmFyIG13PXQ9PigpPT50O2Z1bmN0aW9uIHh3KHQse3NvdXJjZUV2ZW50Om4sdGFyZ2V0OmUsdHJhbnNmb3JtOnIsZGlzcGF0Y2g6aX0pe09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRoaXMse3R5cGU6e3ZhbHVlOnQsZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9LHNvdXJjZUV2ZW50Ont2YWx1ZTpuLGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSx0YXJnZXQ6e3ZhbHVlOmUsZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9LHRyYW5zZm9ybTp7dmFsdWU6cixlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0sXzp7dmFsdWU6aX19KX1mdW5jdGlvbiB3dyh0LG4sZSl7dGhpcy5rPXQsdGhpcy54PW4sdGhpcy55PWV9d3cucHJvdG90eXBlPXtjb25zdHJ1Y3Rvcjp3dyxzY2FsZTpmdW5jdGlvbih0KXtyZXR1cm4gMT09PXQ/dGhpczpuZXcgd3codGhpcy5rKnQsdGhpcy54LHRoaXMueSl9LHRyYW5zbGF0ZTpmdW5jdGlvbih0LG4pe3JldHVybiAwPT09dCYwPT09bj90aGlzOm5ldyB3dyh0aGlzLmssdGhpcy54K3RoaXMuayp0LHRoaXMueSt0aGlzLmsqbil9LGFwcGx5OmZ1bmN0aW9uKHQpe3JldHVyblt0WzBdKnRoaXMuayt0aGlzLngsdFsxXSp0aGlzLmsrdGhpcy55XX0sYXBwbHlYOmZ1bmN0aW9uKHQpe3JldHVybiB0KnRoaXMuayt0aGlzLnh9LGFwcGx5WTpmdW5jdGlvbih0KXtyZXR1cm4gdCp0aGlzLmsrdGhpcy55fSxpbnZlcnQ6ZnVuY3Rpb24odCl7cmV0dXJuWyh0WzBdLXRoaXMueCkvdGhpcy5rLCh0WzFdLXRoaXMueSkvdGhpcy5rXX0saW52ZXJ0WDpmdW5jdGlvbih0KXtyZXR1cm4odC10aGlzLngpL3RoaXMua30saW52ZXJ0WTpmdW5jdGlvbih0KXtyZXR1cm4odC10aGlzLnkpL3RoaXMua30scmVzY2FsZVg6ZnVuY3Rpb24odCl7cmV0dXJuIHQuY29weSgpLmRvbWFpbih0LnJhbmdlKCkubWFwKHRoaXMuaW52ZXJ0WCx0aGlzKS5tYXAodC5pbnZlcnQsdCkpfSxyZXNjYWxlWTpmdW5jdGlvbih0KXtyZXR1cm4gdC5jb3B5KCkuZG9tYWluKHQucmFuZ2UoKS5tYXAodGhpcy5pbnZlcnRZLHRoaXMpLm1hcCh0LmludmVydCx0KSl9LHRvU3RyaW5nOmZ1bmN0aW9uKCl7cmV0dXJuInRyYW5zbGF0ZSgiK3RoaXMueCsiLCIrdGhpcy55KyIpIHNjYWxlKCIrdGhpcy5rKyIpIn19O3ZhciBNdz1uZXcgd3coMSwwLDApO2Z1bmN0aW9uIFR3KHQpe2Zvcig7IXQuX196b29tOylpZighKHQ9dC5wYXJlbnROb2RlKSlyZXR1cm4gTXc7cmV0dXJuIHQuX196b29tfWZ1bmN0aW9uIEF3KHQpe3Quc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCl9ZnVuY3Rpb24gU3codCl7dC5wcmV2ZW50RGVmYXVsdCgpLHQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCl9ZnVuY3Rpb24gRXcodCl7cmV0dXJuISh0LmN0cmxLZXkmJiJ3aGVlbCIhPT10LnR5cGV8fHQuYnV0dG9uKX1mdW5jdGlvbiBOdygpe3ZhciB0PXRoaXM7cmV0dXJuIHQgaW5zdGFuY2VvZiBTVkdFbGVtZW50Pyh0PXQub3duZXJTVkdFbGVtZW50fHx0KS5oYXNBdHRyaWJ1dGUoInZpZXdCb3giKT9bWyh0PXQudmlld0JveC5iYXNlVmFsKS54LHQueV0sW3QueCt0LndpZHRoLHQueSt0LmhlaWdodF1dOltbMCwwXSxbdC53aWR0aC5iYXNlVmFsLnZhbHVlLHQuaGVpZ2h0LmJhc2VWYWwudmFsdWVdXTpbWzAsMF0sW3QuY2xpZW50V2lkdGgsdC5jbGllbnRIZWlnaHRdXX1mdW5jdGlvbiBrdygpe3JldHVybiB0aGlzLl9fem9vbXx8TXd9ZnVuY3Rpb24gQ3codCl7cmV0dXJuLXQuZGVsdGFZKigxPT09dC5kZWx0YU1vZGU/LjA1OnQuZGVsdGFNb2RlPzE6LjAwMikqKHQuY3RybEtleT8xMDoxKX1mdW5jdGlvbiBQdygpe3JldHVybiBuYXZpZ2F0b3IubWF4VG91Y2hQb2ludHN8fCJvbnRvdWNoc3RhcnQiaW4gdGhpc31mdW5jdGlvbiB6dyh0LG4sZSl7dmFyIHI9dC5pbnZlcnRYKG5bMF1bMF0pLWVbMF1bMF0saT10LmludmVydFgoblsxXVswXSktZVsxXVswXSxvPXQuaW52ZXJ0WShuWzBdWzFdKS1lWzBdWzFdLGE9dC5pbnZlcnRZKG5bMV1bMV0pLWVbMV1bMV07cmV0dXJuIHQudHJhbnNsYXRlKGk+cj8ocitpKS8yOk1hdGgubWluKDAscil8fE1hdGgubWF4KDAsaSksYT5vPyhvK2EpLzI6TWF0aC5taW4oMCxvKXx8TWF0aC5tYXgoMCxhKSl9VHcucHJvdG90eXBlPXd3LnByb3RvdHlwZSx0LkFkZGVyPUEsdC5EZWxhdW5heT1qdSx0LkZvcm1hdFNwZWNpZmllcj1uZix0LkludGVybk1hcD1JbnRlcm5NYXAsdC5JbnRlcm5TZXQ9SW50ZXJuU2V0LHQuTm9kZT1KZCx0LlBhdGg9SWEsdC5Wb3Jvbm9pPVV1LHQuWm9vbVRyYW5zZm9ybT13dyx0LmFjdGl2ZT1mdW5jdGlvbih0LG4pe3ZhciBlLHIsaT10Ll9fdHJhbnNpdGlvbjtpZihpKWZvcihyIGluIG49bnVsbD09bj9udWxsOm4rIiIsaSlpZigoZT1pW3JdKS5zdGF0ZT5VaSYmZS5uYW1lPT09bilyZXR1cm4gbmV3IGdvKFtbdF1dLEtvLG4sK3IpO3JldHVybiBudWxsfSx0LmFyYz1mdW5jdGlvbigpe3ZhciB0PUNtLG49UG0sZT15bSgwKSxyPW51bGwsaT16bSxvPSRtLGE9RG0sdT1udWxsLGM9a20oZik7ZnVuY3Rpb24gZigpe3ZhciBmLHMsbD0rdC5hcHBseSh0aGlzLGFyZ3VtZW50cyksaD0rbi5hcHBseSh0aGlzLGFyZ3VtZW50cyksZD1pLmFwcGx5KHRoaXMsYXJndW1lbnRzKS1TbSxwPW8uYXBwbHkodGhpcyxhcmd1bWVudHMpLVNtLGc9dm0ocC1kKSx5PXA+ZDtpZih1fHwodT1mPWMoKSksaDxsJiYocz1oLGg9bCxsPXMpLGg+VG0paWYoZz5FbS1UbSl1Lm1vdmVUbyhoKmJtKGQpLGgqd20oZCkpLHUuYXJjKDAsMCxoLGQscCwheSksbD5UbSYmKHUubW92ZVRvKGwqYm0ocCksbCp3bShwKSksdS5hcmMoMCwwLGwscCxkLHkpKTtlbHNle3ZhciB2LF8sYj1kLG09cCx4PWQsdz1wLE09ZyxUPWcsQT1hLmFwcGx5KHRoaXMsYXJndW1lbnRzKS8yLFM9QT5UbSYmKHI/K3IuYXBwbHkodGhpcyxhcmd1bWVudHMpOk1tKGwqbCtoKmgpKSxFPXhtKHZtKGgtbCkvMiwrZS5hcHBseSh0aGlzLGFyZ3VtZW50cykpLE49RSxrPUU7aWYoUz5UbSl7dmFyIEM9Tm0oUy9sKndtKEEpKSxQPU5tKFMvaCp3bShBKSk7KE0tPTIqQyk+VG0/KHgrPUMqPXk/MTotMSx3LT1DKTooTT0wLHg9dz0oZCtwKS8yKSwoVC09MipQKT5UbT8oYis9UCo9eT8xOi0xLG0tPVApOihUPTAsYj1tPShkK3ApLzIpfXZhciB6PWgqYm0oYiksJD1oKndtKGIpLEQ9bCpibSh3KSxSPWwqd20odyk7aWYoRT5UbSl7dmFyIEYscT1oKmJtKG0pLFU9aCp3bShtKSxJPWwqYm0oeCksTz1sKndtKHgpO2lmKGc8QW0paWYoRj1mdW5jdGlvbih0LG4sZSxyLGksbyxhLHUpe3ZhciBjPWUtdCxmPXItbixzPWEtaSxsPXUtbyxoPWwqYy1zKmY7aWYoIShoKmg8VG0pKXJldHVyblt0KyhoPShzKihuLW8pLWwqKHQtaSkpL2gpKmMsbitoKmZdfSh6LCQsSSxPLHEsVSxELFIpKXt2YXIgQj16LUZbMF0sWT0kLUZbMV0sTD1xLUZbMF0saj1VLUZbMV0sSD0xL3dtKGZ1bmN0aW9uKHQpe3JldHVybiB0PjE/MDp0PC0xP0FtOk1hdGguYWNvcyh0KX0oKEIqTCtZKmopLyhNbShCKkIrWSpZKSpNbShMKkwraipqKSkpLzIpLFg9TW0oRlswXSpGWzBdK0ZbMV0qRlsxXSk7Tj14bShFLChsLVgpLyhILTEpKSxrPXhtKEUsKGgtWCkvKEgrMSkpfWVsc2UgTj1rPTB9VD5UbT9rPlRtPyh2PVJtKEksTyx6LCQsaCxrLHkpLF89Um0ocSxVLEQsUixoLGsseSksdS5tb3ZlVG8odi5jeCt2LngwMSx2LmN5K3YueTAxKSxrPEU/dS5hcmModi5jeCx2LmN5LGssX20odi55MDEsdi54MDEpLF9tKF8ueTAxLF8ueDAxKSwheSk6KHUuYXJjKHYuY3gsdi5jeSxrLF9tKHYueTAxLHYueDAxKSxfbSh2LnkxMSx2LngxMSksIXkpLHUuYXJjKDAsMCxoLF9tKHYuY3krdi55MTEsdi5jeCt2LngxMSksX20oXy5jeStfLnkxMSxfLmN4K18ueDExKSwheSksdS5hcmMoXy5jeCxfLmN5LGssX20oXy55MTEsXy54MTEpLF9tKF8ueTAxLF8ueDAxKSwheSkpKToodS5tb3ZlVG8oeiwkKSx1LmFyYygwLDAsaCxiLG0sIXkpKTp1Lm1vdmVUbyh6LCQpLGw+VG0mJk0+VG0/Tj5UbT8odj1SbShELFIscSxVLGwsLU4seSksXz1SbSh6LCQsSSxPLGwsLU4seSksdS5saW5lVG8odi5jeCt2LngwMSx2LmN5K3YueTAxKSxOPEU/dS5hcmModi5jeCx2LmN5LE4sX20odi55MDEsdi54MDEpLF9tKF8ueTAxLF8ueDAxKSwheSk6KHUuYXJjKHYuY3gsdi5jeSxOLF9tKHYueTAxLHYueDAxKSxfbSh2LnkxMSx2LngxMSksIXkpLHUuYXJjKDAsMCxsLF9tKHYuY3krdi55MTEsdi5jeCt2LngxMSksX20oXy5jeStfLnkxMSxfLmN4K18ueDExKSx5KSx1LmFyYyhfLmN4LF8uY3ksTixfbShfLnkxMSxfLngxMSksX20oXy55MDEsXy54MDEpLCF5KSkpOnUuYXJjKDAsMCxsLHcseCx5KTp1LmxpbmVUbyhELFIpfWVsc2UgdS5tb3ZlVG8oMCwwKTtpZih1LmNsb3NlUGF0aCgpLGYpcmV0dXJuIHU9bnVsbCxmKyIifHxudWxsfXJldHVybiBmLmNlbnRyb2lkPWZ1bmN0aW9uKCl7dmFyIGU9KCt0LmFwcGx5KHRoaXMsYXJndW1lbnRzKSsgK24uYXBwbHkodGhpcyxhcmd1bWVudHMpKS8yLHI9KCtpLmFwcGx5KHRoaXMsYXJndW1lbnRzKSsgK28uYXBwbHkodGhpcyxhcmd1bWVudHMpKS8yLUFtLzI7cmV0dXJuW2JtKHIpKmUsd20ocikqZV19LGYuaW5uZXJSYWRpdXM9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjp5bSgrbiksZik6dH0sZi5vdXRlclJhZGl1cz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj0iZnVuY3Rpb24iPT10eXBlb2YgdD90OnltKCt0KSxmKTpufSxmLmNvcm5lclJhZGl1cz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT0iZnVuY3Rpb24iPT10eXBlb2YgdD90OnltKCt0KSxmKTplfSxmLnBhZFJhZGl1cz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj1udWxsPT10P251bGw6ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDp5bSgrdCksZik6cn0sZi5zdGFydEFuZ2xlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6eW0oK3QpLGYpOml9LGYuZW5kQW5nbGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDp5bSgrdCksZik6b30sZi5wYWRBbmdsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYT0iZnVuY3Rpb24iPT10eXBlb2YgdD90OnltKCt0KSxmKTphfSxmLmNvbnRleHQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9bnVsbD09dD9udWxsOnQsZik6dX0sZn0sdC5hcmVhPUxtLHQuYXJlYVJhZGlhbD1LbSx0LmFzY2VuZGluZz1uLHQuYXV0b1R5cGU9ZnVuY3Rpb24odCl7Zm9yKHZhciBuIGluIHQpe3ZhciBlLHIsaT10W25dLnRyaW0oKTtpZihpKWlmKCJ0cnVlIj09PWkpaT0hMDtlbHNlIGlmKCJmYWxzZSI9PT1pKWk9ITE7ZWxzZSBpZigiTmFOIj09PWkpaT1OYU47ZWxzZSBpZihpc05hTihlPStpKSl7aWYoIShyPWkubWF0Y2goL14oWy0rXVxkezJ9KT9cZHs0fSgtXGR7Mn0oLVxkezJ9KT8pPyhUXGR7Mn06XGR7Mn0oOlxkezJ9KFwuXGR7M30pPyk/KFp8Wy0rXVxkezJ9OlxkezJ9KT8pPyQvKSkpY29udGludWU7dmMmJnJbNF0mJiFyWzddJiYoaT1pLnJlcGxhY2UoLy0vZywiLyIpLnJlcGxhY2UoL1QvLCIgIikpLGk9bmV3IERhdGUoaSl9ZWxzZSBpPWU7ZWxzZSBpPW51bGw7dFtuXT1pfXJldHVybiB0fSx0LmF4aXNCb3R0b209ZnVuY3Rpb24odCl7cmV0dXJuIHp0KFR0LHQpfSx0LmF4aXNMZWZ0PWZ1bmN0aW9uKHQpe3JldHVybiB6dChBdCx0KX0sdC5heGlzUmlnaHQ9ZnVuY3Rpb24odCl7cmV0dXJuIHp0KE10LHQpfSx0LmF4aXNUb3A9ZnVuY3Rpb24odCl7cmV0dXJuIHp0KHd0LHQpfSx0LmJpbj1KLHQuYmlzZWN0PWwsdC5iaXNlY3RDZW50ZXI9cyx0LmJpc2VjdExlZnQ9Zix0LmJpc2VjdFJpZ2h0PWMsdC5iaXNlY3Rvcj1yLHQuYmxvYj1mdW5jdGlvbih0LG4pe3JldHVybiBmZXRjaCh0LG4pLnRoZW4oX2MpfSx0LmJsdXI9ZnVuY3Rpb24odCxuKXtpZighKChuPStuKT49MCkpdGhyb3cgbmV3IFJhbmdlRXJyb3IoImludmFsaWQgciIpO2xldCBlPXQubGVuZ3RoO2lmKCEoKGU9TWF0aC5mbG9vcihlKSk+PTApKXRocm93IG5ldyBSYW5nZUVycm9yKCJpbnZhbGlkIGxlbmd0aCIpO2lmKCFlfHwhbilyZXR1cm4gdDtjb25zdCByPXYobiksaT10LnNsaWNlKCk7cmV0dXJuIHIodCxpLDAsZSwxKSxyKGksdCwwLGUsMSkscih0LGksMCxlLDEpLHR9LHQuYmx1cjI9aCx0LmJsdXJJbWFnZT1kLHQuYnJ1c2g9ZnVuY3Rpb24oKXtyZXR1cm4gTWEoaGEpfSx0LmJydXNoU2VsZWN0aW9uPWZ1bmN0aW9uKHQpe3ZhciBuPXQuX19icnVzaDtyZXR1cm4gbj9uLmRpbS5vdXRwdXQobi5zZWxlY3Rpb24pOm51bGx9LHQuYnJ1c2hYPWZ1bmN0aW9uKCl7cmV0dXJuIE1hKHNhKX0sdC5icnVzaFk9ZnVuY3Rpb24oKXtyZXR1cm4gTWEobGEpfSx0LmJ1ZmZlcj1mdW5jdGlvbih0LG4pe3JldHVybiBmZXRjaCh0LG4pLnRoZW4oYmMpfSx0LmNob3JkPWZ1bmN0aW9uKCl7cmV0dXJuICRhKCExLCExKX0sdC5jaG9yZERpcmVjdGVkPWZ1bmN0aW9uKCl7cmV0dXJuICRhKCEwLCExKX0sdC5jaG9yZFRyYW5zcG9zZT1mdW5jdGlvbigpe3JldHVybiAkYSghMSwhMCl9LHQuY2x1c3Rlcj1mdW5jdGlvbigpe3ZhciB0PWpkLG49MSxlPTEscj0hMTtmdW5jdGlvbiBpKGkpe3ZhciBvLGE9MDtpLmVhY2hBZnRlcigoZnVuY3Rpb24obil7dmFyIGU9bi5jaGlsZHJlbjtlPyhuLng9ZnVuY3Rpb24odCl7cmV0dXJuIHQucmVkdWNlKEhkLDApL3QubGVuZ3RofShlKSxuLnk9ZnVuY3Rpb24odCl7cmV0dXJuIDErdC5yZWR1Y2UoWGQsMCl9KGUpKToobi54PW8/YSs9dChuLG8pOjAsbi55PTAsbz1uKX0pKTt2YXIgdT1mdW5jdGlvbih0KXtmb3IodmFyIG47bj10LmNoaWxkcmVuOyl0PW5bMF07cmV0dXJuIHR9KGkpLGM9ZnVuY3Rpb24odCl7Zm9yKHZhciBuO249dC5jaGlsZHJlbjspdD1uW24ubGVuZ3RoLTFdO3JldHVybiB0fShpKSxmPXUueC10KHUsYykvMixzPWMueCt0KGMsdSkvMjtyZXR1cm4gaS5lYWNoQWZ0ZXIocj9mdW5jdGlvbih0KXt0Lng9KHQueC1pLngpKm4sdC55PShpLnktdC55KSplfTpmdW5jdGlvbih0KXt0Lng9KHQueC1mKS8ocy1mKSpuLHQueT0oMS0oaS55P3QueS9pLnk6MSkpKmV9KX1yZXR1cm4gaS5zZXBhcmF0aW9uPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PW4saSk6dH0saS5zaXplPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPSExLG49K3RbMF0sZT0rdFsxXSxpKTpyP251bGw6W24sZV19LGkubm9kZVNpemU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9ITAsbj0rdFswXSxlPSt0WzFdLGkpOnI/W24sZV06bnVsbH0saX0sdC5jb2xvcj0kZSx0LmNvbnRvdXJEZW5zaXR5PWZ1bmN0aW9uKCl7dmFyIHQ9c3Usbj1sdSxlPWh1LHI9OTYwLGk9NTAwLG89MjAsYT0yLHU9MypvLGM9cisyKnU+PmEsZj1pKzIqdT4+YSxzPUphKDIwKTtmdW5jdGlvbiBsKHIpe3ZhciBpPW5ldyBGbG9hdDMyQXJyYXkoYypmKSxzPU1hdGgucG93KDIsLWEpLGw9LTE7Zm9yKGNvbnN0IG8gb2Ygcil7dmFyIGQ9KHQobywrK2wscikrdSkqcyxwPShuKG8sbCxyKSt1KSpzLGc9K2UobyxsLHIpO2lmKGcmJmQ+PTAmJmQ8YyYmcD49MCYmcDxmKXt2YXIgeT1NYXRoLmZsb29yKGQpLHY9TWF0aC5mbG9vcihwKSxfPWQteS0uNSxiPXAtdi0uNTtpW3krdipjXSs9KDEtXykqKDEtYikqZyxpW3krMSt2KmNdKz1fKigxLWIpKmcsaVt5KzErKHYrMSkqY10rPV8qYipnLGlbeSsodisxKSpjXSs9KDEtXykqYipnfX1yZXR1cm4gaCh7ZGF0YTppLHdpZHRoOmMsaGVpZ2h0OmZ9LG8qcyksaX1mdW5jdGlvbiBkKHQpe3ZhciBuPWwodCksZT1zKG4pLHI9TWF0aC5wb3coMiwyKmEpO3JldHVybiBBcnJheS5pc0FycmF5KGUpfHwoZT1WKE51bWJlci5NSU5fVkFMVUUsdHQobikvcixlKSksb3UoKS5zaXplKFtjLGZdKS50aHJlc2hvbGRzKGUubWFwKCh0PT50KnIpKSkobikubWFwKCgodCxuKT0+KHQudmFsdWU9K2Vbbl0scCh0KSkpKX1mdW5jdGlvbiBwKHQpe3JldHVybiB0LmNvb3JkaW5hdGVzLmZvckVhY2goZyksdH1mdW5jdGlvbiBnKHQpe3QuZm9yRWFjaCh5KX1mdW5jdGlvbiB5KHQpe3QuZm9yRWFjaCh2KX1mdW5jdGlvbiB2KHQpe3RbMF09dFswXSpNYXRoLnBvdygyLGEpLXUsdFsxXT10WzFdKk1hdGgucG93KDIsYSktdX1mdW5jdGlvbiBfKCl7cmV0dXJuIGM9cisyKih1PTMqbyk+PmEsZj1pKzIqdT4+YSxkfXJldHVybiBkLmNvbnRvdXJzPWZ1bmN0aW9uKHQpe3ZhciBuPWwodCksZT1vdSgpLnNpemUoW2MsZl0pLHI9TWF0aC5wb3coMiwyKmEpLGk9dD0+e3Q9K3Q7dmFyIGk9cChlLmNvbnRvdXIobix0KnIpKTtyZXR1cm4gaS52YWx1ZT10LGl9O3JldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoaSwibWF4Iix7Z2V0OigpPT50dChuKS9yfSksaX0sZC54PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PSJmdW5jdGlvbiI9PXR5cGVvZiBuP246SmEoK24pLGQpOnR9LGQueT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj0iZnVuY3Rpb24iPT10eXBlb2YgdD90OkphKCt0KSxkKTpufSxkLndlaWdodD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT0iZnVuY3Rpb24iPT10eXBlb2YgdD90OkphKCt0KSxkKTplfSxkLnNpemU9ZnVuY3Rpb24odCl7aWYoIWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuW3IsaV07dmFyIG49K3RbMF0sZT0rdFsxXTtpZighKG4+PTAmJmU+PTApKXRocm93IG5ldyBFcnJvcigiaW52YWxpZCBzaXplIik7cmV0dXJuIHI9bixpPWUsXygpfSxkLmNlbGxTaXplPWZ1bmN0aW9uKHQpe2lmKCFhcmd1bWVudHMubGVuZ3RoKXJldHVybiAxPDxhO2lmKCEoKHQ9K3QpPj0xKSl0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgY2VsbCBzaXplIik7cmV0dXJuIGE9TWF0aC5mbG9vcihNYXRoLmxvZyh0KS9NYXRoLkxOMiksXygpfSxkLnRocmVzaG9sZHM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHM9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpBcnJheS5pc0FycmF5KHQpP0phKEthLmNhbGwodCkpOkphKHQpLGQpOnN9LGQuYmFuZHdpZHRoPWZ1bmN0aW9uKHQpe2lmKCFhcmd1bWVudHMubGVuZ3RoKXJldHVybiBNYXRoLnNxcnQobyoobysxKSk7aWYoISgodD0rdCk+PTApKXRocm93IG5ldyBFcnJvcigiaW52YWxpZCBiYW5kd2lkdGgiKTtyZXR1cm4gbz0oTWF0aC5zcXJ0KDQqdCp0KzEpLTEpLzIsXygpfSxkfSx0LmNvbnRvdXJzPW91LHQuY291bnQ9Xyx0LmNyZWF0ZT1mdW5jdGlvbih0KXtyZXR1cm4gS24oTHQodCkuY2FsbChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpKX0sdC5jcmVhdG9yPUx0LHQuY3Jvc3M9ZnVuY3Rpb24oLi4udCl7Y29uc3Qgbj0iZnVuY3Rpb24iPT10eXBlb2YgdFt0Lmxlbmd0aC0xXSYmZnVuY3Rpb24odCl7cmV0dXJuIG49PnQoLi4ubil9KHQucG9wKCkpLGU9KHQ9dC5tYXAoeCkpLm1hcChiKSxyPXQubGVuZ3RoLTEsaT1uZXcgQXJyYXkocisxKS5maWxsKDApLG89W107aWYocjwwfHxlLnNvbWUobSkpcmV0dXJuIG87Zm9yKDs7KXtvLnB1c2goaS5tYXAoKChuLGUpPT50W2VdW25dKSkpO2xldCBhPXI7Zm9yKDsrK2lbYV09PT1lW2FdOyl7aWYoMD09PWEpcmV0dXJuIG4/by5tYXAobik6bztpW2EtLV09MH19fSx0LmNzdj1NYyx0LmNzdkZvcm1hdD1pYyx0LmNzdkZvcm1hdEJvZHk9b2MsdC5jc3ZGb3JtYXRSb3c9dWMsdC5jc3ZGb3JtYXRSb3dzPWFjLHQuY3N2Rm9ybWF0VmFsdWU9Y2MsdC5jc3ZQYXJzZT1lYyx0LmNzdlBhcnNlUm93cz1yYyx0LmN1YmVoZWxpeD1Bcix0LmN1bXN1bT1mdW5jdGlvbih0LG4pe3ZhciBlPTAscj0wO3JldHVybiBGbG9hdDY0QXJyYXkuZnJvbSh0LHZvaWQgMD09PW4/dD0+ZSs9K3R8fDA6aT0+ZSs9K24oaSxyKyssdCl8fDApfSx0LmN1cnZlQmFzaXM9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBGeCh0KX0sdC5jdXJ2ZUJhc2lzQ2xvc2VkPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgcXgodCl9LHQuY3VydmVCYXNpc09wZW49ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBVeCh0KX0sdC5jdXJ2ZUJ1bXBYPW54LHQuY3VydmVCdW1wWT1leCx0LmN1cnZlQnVuZGxlPU94LHQuY3VydmVDYXJkaW5hbD1MeCx0LmN1cnZlQ2FyZGluYWxDbG9zZWQ9SHgsdC5jdXJ2ZUNhcmRpbmFsT3Blbj1HeCx0LmN1cnZlQ2F0bXVsbFJvbT1aeCx0LmN1cnZlQ2F0bXVsbFJvbUNsb3NlZD1ReCx0LmN1cnZlQ2F0bXVsbFJvbU9wZW49dHcsdC5jdXJ2ZUxpbmVhcj1JbSx0LmN1cnZlTGluZWFyQ2xvc2VkPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgbncodCl9LHQuY3VydmVNb25vdG9uZVg9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBhdyh0KX0sdC5jdXJ2ZU1vbm90b25lWT1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IHV3KHQpfSx0LmN1cnZlTmF0dXJhbD1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGZ3KHQpfSx0LmN1cnZlU3RlcD1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGx3KHQsLjUpfSx0LmN1cnZlU3RlcEFmdGVyPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgbHcodCwxKX0sdC5jdXJ2ZVN0ZXBCZWZvcmU9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBsdyh0LDApfSx0LmRlc2NlbmRpbmc9ZSx0LmRldmlhdGlvbj1NLHQuZGlmZmVyZW5jZT1mdW5jdGlvbih0LC4uLm4pe3Q9bmV3IEludGVyblNldCh0KTtmb3IoY29uc3QgZSBvZiBuKWZvcihjb25zdCBuIG9mIGUpdC5kZWxldGUobik7cmV0dXJuIHR9LHQuZGlzam9pbnQ9ZnVuY3Rpb24odCxuKXtjb25zdCBlPW5bU3ltYm9sLml0ZXJhdG9yXSgpLHI9bmV3IEludGVyblNldDtmb3IoY29uc3QgbiBvZiB0KXtpZihyLmhhcyhuKSlyZXR1cm4hMTtsZXQgdCxpO2Zvcig7KHt2YWx1ZTp0LGRvbmU6aX09ZS5uZXh0KCkpJiYhaTspe2lmKE9iamVjdC5pcyhuLHQpKXJldHVybiExO3IuYWRkKHQpfX1yZXR1cm4hMH0sdC5kaXNwYXRjaD1EdCx0LmRyYWc9ZnVuY3Rpb24oKXt2YXIgdCxuLGUscixpPWxlLG89aGUsYT1kZSx1PXBlLGM9e30sZj1EdCgic3RhcnQiLCJkcmFnIiwiZW5kIikscz0wLGw9MDtmdW5jdGlvbiBoKHQpe3Qub24oIm1vdXNlZG93bi5kcmFnIixkKS5maWx0ZXIodSkub24oInRvdWNoc3RhcnQuZHJhZyIseSkub24oInRvdWNobW92ZS5kcmFnIix2LHJlKS5vbigidG91Y2hlbmQuZHJhZyB0b3VjaGNhbmNlbC5kcmFnIixfKS5zdHlsZSgidG91Y2gtYWN0aW9uIiwibm9uZSIpLnN0eWxlKCItd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3IiLCJyZ2JhKDAsMCwwLDApIil9ZnVuY3Rpb24gZChhLHUpe2lmKCFyJiZpLmNhbGwodGhpcyxhLHUpKXt2YXIgYz1iKHRoaXMsby5jYWxsKHRoaXMsYSx1KSxhLHUsIm1vdXNlIik7YyYmKEtuKGEudmlldykub24oIm1vdXNlbW92ZS5kcmFnIixwLGllKS5vbigibW91c2V1cC5kcmFnIixnLGllKSx1ZShhLnZpZXcpLG9lKGEpLGU9ITEsdD1hLmNsaWVudFgsbj1hLmNsaWVudFksYygic3RhcnQiLGEpKX19ZnVuY3Rpb24gcChyKXtpZihhZShyKSwhZSl7dmFyIGk9ci5jbGllbnRYLXQsbz1yLmNsaWVudFktbjtlPWkqaStvKm8+bH1jLm1vdXNlKCJkcmFnIixyKX1mdW5jdGlvbiBnKHQpe0tuKHQudmlldykub24oIm1vdXNlbW92ZS5kcmFnIG1vdXNldXAuZHJhZyIsbnVsbCksY2UodC52aWV3LGUpLGFlKHQpLGMubW91c2UoImVuZCIsdCl9ZnVuY3Rpb24geSh0LG4pe2lmKGkuY2FsbCh0aGlzLHQsbikpe3ZhciBlLHIsYT10LmNoYW5nZWRUb3VjaGVzLHU9by5jYWxsKHRoaXMsdCxuKSxjPWEubGVuZ3RoO2ZvcihlPTA7ZTxjOysrZSkocj1iKHRoaXMsdSx0LG4sYVtlXS5pZGVudGlmaWVyLGFbZV0pKSYmKG9lKHQpLHIoInN0YXJ0Iix0LGFbZV0pKX19ZnVuY3Rpb24gdih0KXt2YXIgbixlLHI9dC5jaGFuZ2VkVG91Y2hlcyxpPXIubGVuZ3RoO2ZvcihuPTA7bjxpOysrbikoZT1jW3Jbbl0uaWRlbnRpZmllcl0pJiYoYWUodCksZSgiZHJhZyIsdCxyW25dKSl9ZnVuY3Rpb24gXyh0KXt2YXIgbixlLGk9dC5jaGFuZ2VkVG91Y2hlcyxvPWkubGVuZ3RoO2ZvcihyJiZjbGVhclRpbWVvdXQocikscj1zZXRUaW1lb3V0KChmdW5jdGlvbigpe3I9bnVsbH0pLDUwMCksbj0wO248bzsrK24pKGU9Y1tpW25dLmlkZW50aWZpZXJdKSYmKG9lKHQpLGUoImVuZCIsdCxpW25dKSl9ZnVuY3Rpb24gYih0LG4sZSxyLGksbyl7dmFyIHUsbCxkLHA9Zi5jb3B5KCksZz1lZShvfHxlLG4pO2lmKG51bGwhPShkPWEuY2FsbCh0LG5ldyBzZSgiYmVmb3Jlc3RhcnQiLHtzb3VyY2VFdmVudDplLHRhcmdldDpoLGlkZW50aWZpZXI6aSxhY3RpdmU6cyx4OmdbMF0seTpnWzFdLGR4OjAsZHk6MCxkaXNwYXRjaDpwfSkscikpKXJldHVybiB1PWQueC1nWzBdfHwwLGw9ZC55LWdbMV18fDAsZnVuY3Rpb24gZShvLGEsZil7dmFyIHksdj1nO3N3aXRjaChvKXtjYXNlInN0YXJ0IjpjW2ldPWUseT1zKys7YnJlYWs7Y2FzZSJlbmQiOmRlbGV0ZSBjW2ldLC0tcztjYXNlImRyYWciOmc9ZWUoZnx8YSxuKSx5PXN9cC5jYWxsKG8sdCxuZXcgc2Uobyx7c291cmNlRXZlbnQ6YSxzdWJqZWN0OmQsdGFyZ2V0OmgsaWRlbnRpZmllcjppLGFjdGl2ZTp5LHg6Z1swXSt1LHk6Z1sxXStsLGR4OmdbMF0tdlswXSxkeTpnWzFdLXZbMV0sZGlzcGF0Y2g6cH0pLHIpfX1yZXR1cm4gaC5maWx0ZXI9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpmZSghIXQpLGgpOml9LGguY29udGFpbmVyPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6ZmUodCksaCk6b30saC5zdWJqZWN0PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6ZmUodCksaCk6YX0saC50b3VjaGFibGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpmZSghIXQpLGgpOnV9LGgub249ZnVuY3Rpb24oKXt2YXIgdD1mLm9uLmFwcGx5KGYsYXJndW1lbnRzKTtyZXR1cm4gdD09PWY/aDp0fSxoLmNsaWNrRGlzdGFuY2U9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGw9KHQ9K3QpKnQsaCk6TWF0aC5zcXJ0KGwpfSxofSx0LmRyYWdEaXNhYmxlPXVlLHQuZHJhZ0VuYWJsZT1jZSx0LmRzdj1mdW5jdGlvbih0LG4sZSxyKXszPT09YXJndW1lbnRzLmxlbmd0aCYmImZ1bmN0aW9uIj09dHlwZW9mIGUmJihyPWUsZT12b2lkIDApO3ZhciBpPXRjKHQpO3JldHVybiB4YyhuLGUpLnRoZW4oKGZ1bmN0aW9uKHQpe3JldHVybiBpLnBhcnNlKHQscil9KSl9LHQuZHN2Rm9ybWF0PXRjLHQuZWFzZUJhY2s9am8sdC5lYXNlQmFja0luPVlvLHQuZWFzZUJhY2tJbk91dD1qbyx0LmVhc2VCYWNrT3V0PUxvLHQuZWFzZUJvdW5jZT1Pbyx0LmVhc2VCb3VuY2VJbj1mdW5jdGlvbih0KXtyZXR1cm4gMS1PbygxLXQpfSx0LmVhc2VCb3VuY2VJbk91dD1mdW5jdGlvbih0KXtyZXR1cm4oKHQqPTIpPD0xPzEtT28oMS10KTpPbyh0LTEpKzEpLzJ9LHQuZWFzZUJvdW5jZU91dD1Pbyx0LmVhc2VDaXJjbGU9a28sdC5lYXNlQ2lyY2xlSW49ZnVuY3Rpb24odCl7cmV0dXJuIDEtTWF0aC5zcXJ0KDEtdCp0KX0sdC5lYXNlQ2lyY2xlSW5PdXQ9a28sdC5lYXNlQ2lyY2xlT3V0PWZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLnNxcnQoMS0gLS10KnQpfSx0LmVhc2VDdWJpYz1tbyx0LmVhc2VDdWJpY0luPWZ1bmN0aW9uKHQpe3JldHVybiB0KnQqdH0sdC5lYXNlQ3ViaWNJbk91dD1tbyx0LmVhc2VDdWJpY091dD1mdW5jdGlvbih0KXtyZXR1cm4tLXQqdCp0KzF9LHQuZWFzZUVsYXN0aWM9R28sdC5lYXNlRWxhc3RpY0luPVhvLHQuZWFzZUVsYXN0aWNJbk91dD1Wbyx0LmVhc2VFbGFzdGljT3V0PUdvLHQuZWFzZUV4cD1Obyx0LmVhc2VFeHBJbj1mdW5jdGlvbih0KXtyZXR1cm4gRW8oMS0rdCl9LHQuZWFzZUV4cEluT3V0PU5vLHQuZWFzZUV4cE91dD1mdW5jdGlvbih0KXtyZXR1cm4gMS1Fbyh0KX0sdC5lYXNlTGluZWFyPXQ9Pit0LHQuZWFzZVBvbHk9TW8sdC5lYXNlUG9seUluPXhvLHQuZWFzZVBvbHlJbk91dD1Nbyx0LmVhc2VQb2x5T3V0PXdvLHQuZWFzZVF1YWQ9Ym8sdC5lYXNlUXVhZEluPWZ1bmN0aW9uKHQpe3JldHVybiB0KnR9LHQuZWFzZVF1YWRJbk91dD1ibyx0LmVhc2VRdWFkT3V0PWZ1bmN0aW9uKHQpe3JldHVybiB0KigyLXQpfSx0LmVhc2VTaW49U28sdC5lYXNlU2luSW49ZnVuY3Rpb24odCl7cmV0dXJuIDE9PSt0PzE6MS1NYXRoLmNvcyh0KkFvKX0sdC5lYXNlU2luSW5PdXQ9U28sdC5lYXNlU2luT3V0PWZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLnNpbih0KkFvKX0sdC5ldmVyeT1mdW5jdGlvbih0LG4pe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBuKXRocm93IG5ldyBUeXBlRXJyb3IoInRlc3QgaXMgbm90IGEgZnVuY3Rpb24iKTtsZXQgZT0tMTtmb3IoY29uc3QgciBvZiB0KWlmKCFuKHIsKytlLHQpKXJldHVybiExO3JldHVybiEwfSx0LmV4dGVudD1ULHQuZmN1bXN1bT1mdW5jdGlvbih0LG4pe2NvbnN0IGU9bmV3IEE7bGV0IHI9LTE7cmV0dXJuIEZsb2F0NjRBcnJheS5mcm9tKHQsdm9pZCAwPT09bj90PT5lLmFkZCgrdHx8MCk6aT0+ZS5hZGQoK24oaSwrK3IsdCl8fDApKX0sdC5maWx0ZXI9ZnVuY3Rpb24odCxuKXtpZigiZnVuY3Rpb24iIT10eXBlb2Ygbil0aHJvdyBuZXcgVHlwZUVycm9yKCJ0ZXN0IGlzIG5vdCBhIGZ1bmN0aW9uIik7Y29uc3QgZT1bXTtsZXQgcj0tMTtmb3IoY29uc3QgaSBvZiB0KW4oaSwrK3IsdCkmJmUucHVzaChpKTtyZXR1cm4gZX0sdC5mbGF0R3JvdXA9ZnVuY3Rpb24odCwuLi5uKXtyZXR1cm4gJCh6KHQsLi4ubiksbil9LHQuZmxhdFJvbGx1cD1mdW5jdGlvbih0LG4sLi4uZSl7cmV0dXJuICQoUih0LG4sLi4uZSksZSl9LHQuZm9yY2VDZW50ZXI9ZnVuY3Rpb24odCxuKXt2YXIgZSxyPTE7ZnVuY3Rpb24gaSgpe3ZhciBpLG8sYT1lLmxlbmd0aCx1PTAsYz0wO2ZvcihpPTA7aTxhOysraSl1Kz0obz1lW2ldKS54LGMrPW8ueTtmb3IodT0odS9hLXQpKnIsYz0oYy9hLW4pKnIsaT0wO2k8YTsrK2kpKG89ZVtpXSkueC09dSxvLnktPWN9cmV0dXJuIG51bGw9PXQmJih0PTApLG51bGw9PW4mJihuPTApLGkuaW5pdGlhbGl6ZT1mdW5jdGlvbih0KXtlPXR9LGkueD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD0rbixpKTp0fSxpLnk9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49K3QsaSk6bn0saS5zdHJlbmd0aD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj0rdCxpKTpyfSxpfSx0LmZvcmNlQ29sbGlkZT1mdW5jdGlvbih0KXt2YXIgbixlLHIsaT0xLG89MTtmdW5jdGlvbiBhKCl7Zm9yKHZhciB0LGEsYyxmLHMsbCxoLGQ9bi5sZW5ndGgscD0wO3A8bzsrK3ApZm9yKGE9RGMobixPYyxCYykudmlzaXRBZnRlcih1KSx0PTA7dDxkOysrdCljPW5bdF0sbD1lW2MuaW5kZXhdLGg9bCpsLGY9Yy54K2Mudngscz1jLnkrYy52eSxhLnZpc2l0KGcpO2Z1bmN0aW9uIGcodCxuLGUsbyxhKXt2YXIgdT10LmRhdGEsZD10LnIscD1sK2Q7aWYoIXUpcmV0dXJuIG4+ZitwfHxvPGYtcHx8ZT5zK3B8fGE8cy1wO2lmKHUuaW5kZXg+Yy5pbmRleCl7dmFyIGc9Zi11LngtdS52eCx5PXMtdS55LXUudnksdj1nKmcreSp5O3Y8cCpwJiYoMD09PWcmJih2Kz0oZz1JYyhyKSkqZyksMD09PXkmJih2Kz0oeT1JYyhyKSkqeSksdj0ocC0odj1NYXRoLnNxcnQodikpKS92KmksYy52eCs9KGcqPXYpKihwPShkKj1kKS8oaCtkKSksYy52eSs9KHkqPXYpKnAsdS52eC09ZyoocD0xLXApLHUudnktPXkqcCl9fX1mdW5jdGlvbiB1KHQpe2lmKHQuZGF0YSlyZXR1cm4gdC5yPWVbdC5kYXRhLmluZGV4XTtmb3IodmFyIG49dC5yPTA7bjw0Oysrbil0W25dJiZ0W25dLnI+dC5yJiYodC5yPXRbbl0ucil9ZnVuY3Rpb24gYygpe2lmKG4pe3ZhciByLGksbz1uLmxlbmd0aDtmb3IoZT1uZXcgQXJyYXkobykscj0wO3I8bzsrK3IpaT1uW3JdLGVbaS5pbmRleF09K3QoaSxyLG4pfX1yZXR1cm4iZnVuY3Rpb24iIT10eXBlb2YgdCYmKHQ9VWMobnVsbD09dD8xOit0KSksYS5pbml0aWFsaXplPWZ1bmN0aW9uKHQsZSl7bj10LHI9ZSxjKCl9LGEuaXRlcmF0aW9ucz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz0rdCxhKTpvfSxhLnN0cmVuZ3RoPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPSt0LGEpOml9LGEucmFkaXVzPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PSJmdW5jdGlvbiI9PXR5cGVvZiBuP246VWMoK24pLGMoKSxhKTp0fSxhfSx0LmZvcmNlTGluaz1mdW5jdGlvbih0KXt2YXIgbixlLHIsaSxvLGEsdT1ZYyxjPWZ1bmN0aW9uKHQpe3JldHVybiAxL01hdGgubWluKGlbdC5zb3VyY2UuaW5kZXhdLGlbdC50YXJnZXQuaW5kZXhdKX0sZj1VYygzMCkscz0xO2Z1bmN0aW9uIGwocil7Zm9yKHZhciBpPTAsdT10Lmxlbmd0aDtpPHM7KytpKWZvcih2YXIgYyxmLGwsaCxkLHAsZyx5PTA7eTx1OysreSlmPShjPXRbeV0pLnNvdXJjZSxoPShsPWMudGFyZ2V0KS54K2wudngtZi54LWYudnh8fEljKGEpLGQ9bC55K2wudnktZi55LWYudnl8fEljKGEpLGgqPXA9KChwPU1hdGguc3FydChoKmgrZCpkKSktZVt5XSkvcCpyKm5beV0sZCo9cCxsLnZ4LT1oKihnPW9beV0pLGwudnktPWQqZyxmLnZ4Kz1oKihnPTEtZyksZi52eSs9ZCpnfWZ1bmN0aW9uIGgoKXtpZihyKXt2YXIgYSxjLGY9ci5sZW5ndGgscz10Lmxlbmd0aCxsPW5ldyBNYXAoci5tYXAoKCh0LG4pPT5bdSh0LG4sciksdF0pKSk7Zm9yKGE9MCxpPW5ldyBBcnJheShmKTthPHM7KythKShjPXRbYV0pLmluZGV4PWEsIm9iamVjdCIhPXR5cGVvZiBjLnNvdXJjZSYmKGMuc291cmNlPUxjKGwsYy5zb3VyY2UpKSwib2JqZWN0IiE9dHlwZW9mIGMudGFyZ2V0JiYoYy50YXJnZXQ9TGMobCxjLnRhcmdldCkpLGlbYy5zb3VyY2UuaW5kZXhdPShpW2Muc291cmNlLmluZGV4XXx8MCkrMSxpW2MudGFyZ2V0LmluZGV4XT0oaVtjLnRhcmdldC5pbmRleF18fDApKzE7Zm9yKGE9MCxvPW5ldyBBcnJheShzKTthPHM7KythKWM9dFthXSxvW2FdPWlbYy5zb3VyY2UuaW5kZXhdLyhpW2Muc291cmNlLmluZGV4XStpW2MudGFyZ2V0LmluZGV4XSk7bj1uZXcgQXJyYXkocyksZCgpLGU9bmV3IEFycmF5KHMpLHAoKX19ZnVuY3Rpb24gZCgpe2lmKHIpZm9yKHZhciBlPTAsaT10Lmxlbmd0aDtlPGk7KytlKW5bZV09K2ModFtlXSxlLHQpfWZ1bmN0aW9uIHAoKXtpZihyKWZvcih2YXIgbj0wLGk9dC5sZW5ndGg7bjxpOysrbillW25dPStmKHRbbl0sbix0KX1yZXR1cm4gbnVsbD09dCYmKHQ9W10pLGwuaW5pdGlhbGl6ZT1mdW5jdGlvbih0LG4pe3I9dCxhPW4saCgpfSxsLmxpbmtzPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PW4saCgpLGwpOnR9LGwuaWQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9dCxsKTp1fSxsLml0ZXJhdGlvbnM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHM9K3QsbCk6c30sbC5zdHJlbmd0aD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYz0iZnVuY3Rpb24iPT10eXBlb2YgdD90OlVjKCt0KSxkKCksbCk6Y30sbC5kaXN0YW5jZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZj0iZnVuY3Rpb24iPT10eXBlb2YgdD90OlVjKCt0KSxwKCksbCk6Zn0sbH0sdC5mb3JjZU1hbnlCb2R5PWZ1bmN0aW9uKCl7dmFyIHQsbixlLHIsaSxvPVVjKC0zMCksYT0xLHU9MS8wLGM9LjgxO2Z1bmN0aW9uIGYoZSl7dmFyIGksbz10Lmxlbmd0aCxhPURjKHQsR2MsVmMpLnZpc2l0QWZ0ZXIobCk7Zm9yKHI9ZSxpPTA7aTxvOysraSluPXRbaV0sYS52aXNpdChoKX1mdW5jdGlvbiBzKCl7aWYodCl7dmFyIG4sZSxyPXQubGVuZ3RoO2ZvcihpPW5ldyBBcnJheShyKSxuPTA7bjxyOysrbillPXRbbl0saVtlLmluZGV4XT0rbyhlLG4sdCl9fWZ1bmN0aW9uIGwodCl7dmFyIG4sZSxyLG8sYSx1PTAsYz0wO2lmKHQubGVuZ3RoKXtmb3Iocj1vPWE9MDthPDQ7KythKShuPXRbYV0pJiYoZT1NYXRoLmFicyhuLnZhbHVlKSkmJih1Kz1uLnZhbHVlLGMrPWUscis9ZSpuLngsbys9ZSpuLnkpO3QueD1yL2MsdC55PW8vY31lbHNleyhuPXQpLng9bi5kYXRhLngsbi55PW4uZGF0YS55O2Rve3UrPWlbbi5kYXRhLmluZGV4XX13aGlsZShuPW4ubmV4dCl9dC52YWx1ZT11fWZ1bmN0aW9uIGgodCxvLGYscyl7aWYoIXQudmFsdWUpcmV0dXJuITA7dmFyIGw9dC54LW4ueCxoPXQueS1uLnksZD1zLW8scD1sKmwraCpoO2lmKGQqZC9jPHApcmV0dXJuIHA8dSYmKDA9PT1sJiYocCs9KGw9SWMoZSkpKmwpLDA9PT1oJiYocCs9KGg9SWMoZSkpKmgpLHA8YSYmKHA9TWF0aC5zcXJ0KGEqcCkpLG4udngrPWwqdC52YWx1ZSpyL3Asbi52eSs9aCp0LnZhbHVlKnIvcCksITA7aWYoISh0Lmxlbmd0aHx8cD49dSkpeyh0LmRhdGEhPT1ufHx0Lm5leHQpJiYoMD09PWwmJihwKz0obD1JYyhlKSkqbCksMD09PWgmJihwKz0oaD1JYyhlKSkqaCkscDxhJiYocD1NYXRoLnNxcnQoYSpwKSkpO2Rve3QuZGF0YSE9PW4mJihkPWlbdC5kYXRhLmluZGV4XSpyL3Asbi52eCs9bCpkLG4udnkrPWgqZCl9d2hpbGUodD10Lm5leHQpfX1yZXR1cm4gZi5pbml0aWFsaXplPWZ1bmN0aW9uKG4scil7dD1uLGU9cixzKCl9LGYuc3RyZW5ndGg9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpVYygrdCkscygpLGYpOm99LGYuZGlzdGFuY2VNaW49ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9dCp0LGYpOk1hdGguc3FydChhKX0sZi5kaXN0YW5jZU1heD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT10KnQsZik6TWF0aC5zcXJ0KHUpfSxmLnRoZXRhPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhjPXQqdCxmKTpNYXRoLnNxcnQoYyl9LGZ9LHQuZm9yY2VSYWRpYWw9ZnVuY3Rpb24odCxuLGUpe3ZhciByLGksbyxhPVVjKC4xKTtmdW5jdGlvbiB1KHQpe2Zvcih2YXIgYT0wLHU9ci5sZW5ndGg7YTx1OysrYSl7dmFyIGM9clthXSxmPWMueC1ufHwxZS02LHM9Yy55LWV8fDFlLTYsbD1NYXRoLnNxcnQoZipmK3MqcyksaD0ob1thXS1sKSppW2FdKnQvbDtjLnZ4Kz1mKmgsYy52eSs9cypofX1mdW5jdGlvbiBjKCl7aWYocil7dmFyIG4sZT1yLmxlbmd0aDtmb3IoaT1uZXcgQXJyYXkoZSksbz1uZXcgQXJyYXkoZSksbj0wO248ZTsrK24pb1tuXT0rdChyW25dLG4sciksaVtuXT1pc05hTihvW25dKT8wOithKHJbbl0sbixyKX19cmV0dXJuImZ1bmN0aW9uIiE9dHlwZW9mIHQmJih0PVVjKCt0KSksbnVsbD09biYmKG49MCksbnVsbD09ZSYmKGU9MCksdS5pbml0aWFsaXplPWZ1bmN0aW9uKHQpe3I9dCxjKCl9LHUuc3RyZW5ndGg9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpVYygrdCksYygpLHUpOmF9LHUucmFkaXVzPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PSJmdW5jdGlvbiI9PXR5cGVvZiBuP246VWMoK24pLGMoKSx1KTp0fSx1Lng9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49K3QsdSk6bn0sdS55PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPSt0LHUpOmV9LHV9LHQuZm9yY2VTaW11bGF0aW9uPWZ1bmN0aW9uKHQpe3ZhciBuLGU9MSxyPS4wMDEsaT0xLU1hdGgucG93KHIsMS8zMDApLG89MCxhPS42LHU9bmV3IE1hcCxjPWtpKGwpLGY9RHQoInRpY2siLCJlbmQiKSxzPWZ1bmN0aW9uKCl7bGV0IHQ9MTtyZXR1cm4oKT0+KHQ9KGpjKnQrSGMpJVhjKS9YY30oKTtmdW5jdGlvbiBsKCl7aCgpLGYuY2FsbCgidGljayIsbiksZTxyJiYoYy5zdG9wKCksZi5jYWxsKCJlbmQiLG4pKX1mdW5jdGlvbiBoKHIpe3ZhciBjLGYscz10Lmxlbmd0aDt2b2lkIDA9PT1yJiYocj0xKTtmb3IodmFyIGw9MDtsPHI7KytsKWZvcihlKz0oby1lKSppLHUuZm9yRWFjaCgoZnVuY3Rpb24odCl7dChlKX0pKSxjPTA7YzxzOysrYyludWxsPT0oZj10W2NdKS5meD9mLngrPWYudngqPWE6KGYueD1mLmZ4LGYudng9MCksbnVsbD09Zi5meT9mLnkrPWYudnkqPWE6KGYueT1mLmZ5LGYudnk9MCk7cmV0dXJuIG59ZnVuY3Rpb24gZCgpe2Zvcih2YXIgbixlPTAscj10Lmxlbmd0aDtlPHI7KytlKXtpZigobj10W2VdKS5pbmRleD1lLG51bGwhPW4uZngmJihuLng9bi5meCksbnVsbCE9bi5meSYmKG4ueT1uLmZ5KSxpc05hTihuLngpfHxpc05hTihuLnkpKXt2YXIgaT0xMCpNYXRoLnNxcnQoLjUrZSksbz1lKldjO24ueD1pKk1hdGguY29zKG8pLG4ueT1pKk1hdGguc2luKG8pfShpc05hTihuLnZ4KXx8aXNOYU4obi52eSkpJiYobi52eD1uLnZ5PTApfX1mdW5jdGlvbiBwKG4pe3JldHVybiBuLmluaXRpYWxpemUmJm4uaW5pdGlhbGl6ZSh0LHMpLG59cmV0dXJuIG51bGw9PXQmJih0PVtdKSxkKCksbj17dGljazpoLHJlc3RhcnQ6ZnVuY3Rpb24oKXtyZXR1cm4gYy5yZXN0YXJ0KGwpLG59LHN0b3A6ZnVuY3Rpb24oKXtyZXR1cm4gYy5zdG9wKCksbn0sbm9kZXM6ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9ZSxkKCksdS5mb3JFYWNoKHApLG4pOnR9LGFscGhhOmZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPSt0LG4pOmV9LGFscGhhTWluOmZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPSt0LG4pOnJ9LGFscGhhRGVjYXk6ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9K3Qsbik6K2l9LGFscGhhVGFyZ2V0OmZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPSt0LG4pOm99LHZlbG9jaXR5RGVjYXk6ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9MS10LG4pOjEtYX0scmFuZG9tU291cmNlOmZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhzPXQsdS5mb3JFYWNoKHApLG4pOnN9LGZvcmNlOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg+MT8obnVsbD09ZT91LmRlbGV0ZSh0KTp1LnNldCh0LHAoZSkpLG4pOnUuZ2V0KHQpfSxmaW5kOmZ1bmN0aW9uKG4sZSxyKXt2YXIgaSxvLGEsdSxjLGY9MCxzPXQubGVuZ3RoO2ZvcihudWxsPT1yP3I9MS8wOnIqPXIsZj0wO2Y8czsrK2YpKGE9KGk9bi0odT10W2ZdKS54KSppKyhvPWUtdS55KSpvKTxyJiYoYz11LHI9YSk7cmV0dXJuIGN9LG9uOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg+MT8oZi5vbih0LGUpLG4pOmYub24odCl9fX0sdC5mb3JjZVg9ZnVuY3Rpb24odCl7dmFyIG4sZSxyLGk9VWMoLjEpO2Z1bmN0aW9uIG8odCl7Zm9yKHZhciBpLG89MCxhPW4ubGVuZ3RoO288YTsrK28pKGk9bltvXSkudngrPShyW29dLWkueCkqZVtvXSp0fWZ1bmN0aW9uIGEoKXtpZihuKXt2YXIgbyxhPW4ubGVuZ3RoO2ZvcihlPW5ldyBBcnJheShhKSxyPW5ldyBBcnJheShhKSxvPTA7bzxhOysrbyllW29dPWlzTmFOKHJbb109K3QobltvXSxvLG4pKT8wOitpKG5bb10sbyxuKX19cmV0dXJuImZ1bmN0aW9uIiE9dHlwZW9mIHQmJih0PVVjKG51bGw9PXQ/MDordCkpLG8uaW5pdGlhbGl6ZT1mdW5jdGlvbih0KXtuPXQsYSgpfSxvLnN0cmVuZ3RoPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6VWMoK3QpLGEoKSxvKTppfSxvLng9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjpVYygrbiksYSgpLG8pOnR9LG99LHQuZm9yY2VZPWZ1bmN0aW9uKHQpe3ZhciBuLGUscixpPVVjKC4xKTtmdW5jdGlvbiBvKHQpe2Zvcih2YXIgaSxvPTAsYT1uLmxlbmd0aDtvPGE7KytvKShpPW5bb10pLnZ5Kz0ocltvXS1pLnkpKmVbb10qdH1mdW5jdGlvbiBhKCl7aWYobil7dmFyIG8sYT1uLmxlbmd0aDtmb3IoZT1uZXcgQXJyYXkoYSkscj1uZXcgQXJyYXkoYSksbz0wO288YTsrK28pZVtvXT1pc05hTihyW29dPSt0KG5bb10sbyxuKSk/MDoraShuW29dLG8sbil9fXJldHVybiJmdW5jdGlvbiIhPXR5cGVvZiB0JiYodD1VYyhudWxsPT10PzA6K3QpKSxvLmluaXRpYWxpemU9ZnVuY3Rpb24odCl7bj10LGEoKX0sby5zdHJlbmd0aD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0iZnVuY3Rpb24iPT10eXBlb2YgdD90OlVjKCt0KSxhKCksbyk6aX0sby55PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PSJmdW5jdGlvbiI9PXR5cGVvZiBuP246VWMoK24pLGEoKSxvKTp0fSxvfSx0LmZvcm1hdERlZmF1bHRMb2NhbGU9c2YsdC5mb3JtYXRMb2NhbGU9ZmYsdC5mb3JtYXRTcGVjaWZpZXI9dGYsdC5mc3VtPWZ1bmN0aW9uKHQsbil7Y29uc3QgZT1uZXcgQTtpZih2b2lkIDA9PT1uKWZvcihsZXQgbiBvZiB0KShuPStuKSYmZS5hZGQobik7ZWxzZXtsZXQgcj0tMTtmb3IobGV0IGkgb2YgdCkoaT0rbihpLCsrcix0KSkmJmUuYWRkKGkpfXJldHVybitlfSx0Lmdlb0FsYmVycz13ZCx0Lmdlb0FsYmVyc1VzYT1mdW5jdGlvbigpe3ZhciB0LG4sZSxyLGksbyxhPXdkKCksdT14ZCgpLnJvdGF0ZShbMTU0LDBdKS5jZW50ZXIoWy0yLDU4LjVdKS5wYXJhbGxlbHMoWzU1LDY1XSksYz14ZCgpLnJvdGF0ZShbMTU3LDBdKS5jZW50ZXIoWy0zLDE5LjldKS5wYXJhbGxlbHMoWzgsMThdKSxmPXtwb2ludDpmdW5jdGlvbih0LG4pe289W3Qsbl19fTtmdW5jdGlvbiBzKHQpe3ZhciBuPXRbMF0sYT10WzFdO3JldHVybiBvPW51bGwsZS5wb2ludChuLGEpLG98fChyLnBvaW50KG4sYSksbyl8fChpLnBvaW50KG4sYSksbyl9ZnVuY3Rpb24gbCgpe3JldHVybiB0PW49bnVsbCxzfXJldHVybiBzLmludmVydD1mdW5jdGlvbih0KXt2YXIgbj1hLnNjYWxlKCksZT1hLnRyYW5zbGF0ZSgpLHI9KHRbMF0tZVswXSkvbixpPSh0WzFdLWVbMV0pL247cmV0dXJuKGk+PS4xMiYmaTwuMjM0JiZyPj0tLjQyNSYmcjwtLjIxND91Omk+PS4xNjYmJmk8LjIzNCYmcj49LS4yMTQmJnI8LS4xMTU/YzphKS5pbnZlcnQodCl9LHMuc3RyZWFtPWZ1bmN0aW9uKGUpe3JldHVybiB0JiZuPT09ZT90OihyPVthLnN0cmVhbShuPWUpLHUuc3RyZWFtKGUpLGMuc3RyZWFtKGUpXSxpPXIubGVuZ3RoLHQ9e3BvaW50OmZ1bmN0aW9uKHQsbil7Zm9yKHZhciBlPS0xOysrZTxpOylyW2VdLnBvaW50KHQsbil9LHNwaGVyZTpmdW5jdGlvbigpe2Zvcih2YXIgdD0tMTsrK3Q8aTspclt0XS5zcGhlcmUoKX0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7Zm9yKHZhciB0PS0xOysrdDxpOylyW3RdLmxpbmVTdGFydCgpfSxsaW5lRW5kOmZ1bmN0aW9uKCl7Zm9yKHZhciB0PS0xOysrdDxpOylyW3RdLmxpbmVFbmQoKX0scG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7Zm9yKHZhciB0PS0xOysrdDxpOylyW3RdLnBvbHlnb25TdGFydCgpfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7Zm9yKHZhciB0PS0xOysrdDxpOylyW3RdLnBvbHlnb25FbmQoKX19KTt2YXIgcixpfSxzLnByZWNpc2lvbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYS5wcmVjaXNpb24odCksdS5wcmVjaXNpb24odCksYy5wcmVjaXNpb24odCksbCgpKTphLnByZWNpc2lvbigpfSxzLnNjYWxlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhLnNjYWxlKHQpLHUuc2NhbGUoLjM1KnQpLGMuc2NhbGUodCkscy50cmFuc2xhdGUoYS50cmFuc2xhdGUoKSkpOmEuc2NhbGUoKX0scy50cmFuc2xhdGU9ZnVuY3Rpb24odCl7aWYoIWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIGEudHJhbnNsYXRlKCk7dmFyIG49YS5zY2FsZSgpLG89K3RbMF0scz0rdFsxXTtyZXR1cm4gZT1hLnRyYW5zbGF0ZSh0KS5jbGlwRXh0ZW50KFtbby0uNDU1Km4scy0uMjM4Km5dLFtvKy40NTUqbixzKy4yMzgqbl1dKS5zdHJlYW0oZikscj11LnRyYW5zbGF0ZShbby0uMzA3Km4scysuMjAxKm5dKS5jbGlwRXh0ZW50KFtbby0uNDI1Km4rcGYscysuMTIqbitwZl0sW28tLjIxNCpuLXBmLHMrLjIzNCpuLXBmXV0pLnN0cmVhbShmKSxpPWMudHJhbnNsYXRlKFtvLS4yMDUqbixzKy4yMTIqbl0pLmNsaXBFeHRlbnQoW1tvLS4yMTQqbitwZixzKy4xNjYqbitwZl0sW28tLjExNSpuLXBmLHMrLjIzNCpuLXBmXV0pLnN0cmVhbShmKSxsKCl9LHMuZml0RXh0ZW50PWZ1bmN0aW9uKHQsbil7cmV0dXJuIGNkKHMsdCxuKX0scy5maXRTaXplPWZ1bmN0aW9uKHQsbil7cmV0dXJuIGZkKHMsdCxuKX0scy5maXRXaWR0aD1mdW5jdGlvbih0LG4pe3JldHVybiBzZChzLHQsbil9LHMuZml0SGVpZ2h0PWZ1bmN0aW9uKHQsbil7cmV0dXJuIGxkKHMsdCxuKX0scy5zY2FsZSgxMDcwKX0sdC5nZW9BcmVhPWZ1bmN0aW9uKHQpe3JldHVybiBjcz1uZXcgQSxqZih0LGZzKSwyKmNzfSx0Lmdlb0F6aW11dGhhbEVxdWFsQXJlYT1mdW5jdGlvbigpe3JldHVybiB2ZChBZCkuc2NhbGUoMTI0Ljc1KS5jbGlwQW5nbGUoMTc5Ljk5OSl9LHQuZ2VvQXppbXV0aGFsRXF1YWxBcmVhUmF3PUFkLHQuZ2VvQXppbXV0aGFsRXF1aWRpc3RhbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdmQoU2QpLnNjYWxlKDc5LjQxODgpLmNsaXBBbmdsZSgxNzkuOTk5KX0sdC5nZW9BemltdXRoYWxFcXVpZGlzdGFudFJhdz1TZCx0Lmdlb0JvdW5kcz1mdW5jdGlvbih0KXt2YXIgbixlLHIsaSxvLGEsdTtpZihKZj1RZj0tKFpmPUtmPTEvMCksb3M9W10samYodCxxcyksZT1vcy5sZW5ndGgpe2Zvcihvcy5zb3J0KFhzKSxuPTEsbz1bcj1vc1swXV07bjxlOysrbilHcyhyLChpPW9zW25dKVswXSl8fEdzKHIsaVsxXSk/KEhzKHJbMF0saVsxXSk+SHMoclswXSxyWzFdKSYmKHJbMV09aVsxXSksSHMoaVswXSxyWzFdKT5IcyhyWzBdLHJbMV0pJiYoclswXT1pWzBdKSk6by5wdXNoKHI9aSk7Zm9yKGE9LTEvMCxuPTAscj1vW2U9by5sZW5ndGgtMV07bjw9ZTtyPWksKytuKWk9b1tuXSwodT1IcyhyWzFdLGlbMF0pKT5hJiYoYT11LFpmPWlbMF0sUWY9clsxXSl9cmV0dXJuIG9zPWFzPW51bGwsWmY9PT0xLzB8fEtmPT09MS8wP1tbTmFOLE5hTl0sW05hTixOYU5dXTpbW1pmLEtmXSxbUWYsSmZdXX0sdC5nZW9DZW50cm9pZD1mdW5jdGlvbih0KXt4cz13cz1Ncz1Ucz1Bcz1Tcz1Fcz1Ocz0wLGtzPW5ldyBBLENzPW5ldyBBLFBzPW5ldyBBLGpmKHQsVnMpO3ZhciBuPStrcyxlPStDcyxyPStQcyxpPU5mKG4sZSxyKTtyZXR1cm4gaTxnZiYmKG49U3MsZT1FcyxyPU5zLHdzPHBmJiYobj1NcyxlPVRzLHI9QXMpLChpPU5mKG4sZSxyKSk8Z2YpP1tOYU4sTmFOXTpbVGYoZSxuKSptZixGZihyL2kpKm1mXX0sdC5nZW9DaXJjbGU9ZnVuY3Rpb24oKXt2YXIgdCxuLGU9b2woWzAsMF0pLHI9b2woOTApLGk9b2woNiksbz17cG9pbnQ6ZnVuY3Rpb24oZSxyKXt0LnB1c2goZT1uKGUscikpLGVbMF0qPW1mLGVbMV0qPW1mfX07ZnVuY3Rpb24gYSgpe3ZhciBhPWUuYXBwbHkodGhpcyxhcmd1bWVudHMpLHU9ci5hcHBseSh0aGlzLGFyZ3VtZW50cykqeGYsYz1pLmFwcGx5KHRoaXMsYXJndW1lbnRzKSp4ZjtyZXR1cm4gdD1bXSxuPWNsKC1hWzBdKnhmLC1hWzFdKnhmLDApLmludmVydCxkbChvLHUsYywxKSxhPXt0eXBlOiJQb2x5Z29uIixjb29yZGluYXRlczpbdF19LHQ9bj1udWxsLGF9cmV0dXJuIGEuY2VudGVyPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6b2woWyt0WzBdLCt0WzFdXSksYSk6ZX0sYS5yYWRpdXM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpvbCgrdCksYSk6cn0sYS5wcmVjaXNpb249ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpvbCgrdCksYSk6aX0sYX0sdC5nZW9DbGlwQW50aW1lcmlkaWFuPUFsLHQuZ2VvQ2xpcENpcmNsZT1TbCx0Lmdlb0NsaXBFeHRlbnQ9ZnVuY3Rpb24oKXt2YXIgdCxuLGUscj0wLGk9MCxvPTk2MCxhPTUwMDtyZXR1cm4gZT17c3RyZWFtOmZ1bmN0aW9uKGUpe3JldHVybiB0JiZuPT09ZT90OnQ9JGwocixpLG8sYSkobj1lKX0sZXh0ZW50OmZ1bmN0aW9uKHUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPSt1WzBdWzBdLGk9K3VbMF1bMV0sbz0rdVsxXVswXSxhPSt1WzFdWzFdLHQ9bj1udWxsLGUpOltbcixpXSxbbyxhXV19fX0sdC5nZW9DbGlwUmVjdGFuZ2xlPSRsLHQuZ2VvQ29uaWNDb25mb3JtYWw9ZnVuY3Rpb24oKXtyZXR1cm4gYmQoQ2QpLnNjYWxlKDEwOS41KS5wYXJhbGxlbHMoWzMwLDMwXSl9LHQuZ2VvQ29uaWNDb25mb3JtYWxSYXc9Q2QsdC5nZW9Db25pY0VxdWFsQXJlYT14ZCx0Lmdlb0NvbmljRXF1YWxBcmVhUmF3PW1kLHQuZ2VvQ29uaWNFcXVpZGlzdGFudD1mdW5jdGlvbigpe3JldHVybiBiZCh6ZCkuc2NhbGUoMTMxLjE1NCkuY2VudGVyKFswLDEzLjkzODldKX0sdC5nZW9Db25pY0VxdWlkaXN0YW50UmF3PXpkLHQuZ2VvQ29udGFpbnM9ZnVuY3Rpb24odCxuKXtyZXR1cm4odCYmWWwuaGFzT3duUHJvcGVydHkodC50eXBlKT9ZbFt0LnR5cGVdOmpsKSh0LG4pfSx0Lmdlb0Rpc3RhbmNlPUJsLHQuZ2VvRXF1YWxFYXJ0aD1mdW5jdGlvbigpe3JldHVybiB2ZChVZCkuc2NhbGUoMTc3LjE1OCl9LHQuZ2VvRXF1YWxFYXJ0aFJhdz1VZCx0Lmdlb0VxdWlyZWN0YW5ndWxhcj1mdW5jdGlvbigpe3JldHVybiB2ZChQZCkuc2NhbGUoMTUyLjYzKX0sdC5nZW9FcXVpcmVjdGFuZ3VsYXJSYXc9UGQsdC5nZW9Hbm9tb25pYz1mdW5jdGlvbigpe3JldHVybiB2ZChJZCkuc2NhbGUoMTQ0LjA0OSkuY2xpcEFuZ2xlKDYwKX0sdC5nZW9Hbm9tb25pY1Jhdz1JZCx0Lmdlb0dyYXRpY3VsZT1RbCx0Lmdlb0dyYXRpY3VsZTEwPWZ1bmN0aW9uKCl7cmV0dXJuIFFsKCkoKX0sdC5nZW9JZGVudGl0eT1mdW5jdGlvbigpe3ZhciB0LG4sZSxyLGksbyxhLHU9MSxjPTAsZj0wLHM9MSxsPTEsaD0wLGQ9bnVsbCxwPTEsZz0xLHk9b2Qoe3BvaW50OmZ1bmN0aW9uKHQsbil7dmFyIGU9YihbdCxuXSk7dGhpcy5zdHJlYW0ucG9pbnQoZVswXSxlWzFdKX19KSx2PXJoO2Z1bmN0aW9uIF8oKXtyZXR1cm4gcD11KnMsZz11Kmwsbz1hPW51bGwsYn1mdW5jdGlvbiBiKGUpe3ZhciByPWVbMF0qcCxpPWVbMV0qZztpZihoKXt2YXIgbz1pKnQtcipuO3I9cip0K2kqbixpPW99cmV0dXJuW3IrYyxpK2ZdfXJldHVybiBiLmludmVydD1mdW5jdGlvbihlKXt2YXIgcj1lWzBdLWMsaT1lWzFdLWY7aWYoaCl7dmFyIG89aSp0K3IqbjtyPXIqdC1pKm4saT1vfXJldHVybltyL3AsaS9nXX0sYi5zdHJlYW09ZnVuY3Rpb24odCl7cmV0dXJuIG8mJmE9PT10P286bz15KHYoYT10KSl9LGIucG9zdGNsaXA9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHY9dCxkPWU9cj1pPW51bGwsXygpKTp2fSxiLmNsaXBFeHRlbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHY9bnVsbD09dD8oZD1lPXI9aT1udWxsLHJoKTokbChkPSt0WzBdWzBdLGU9K3RbMF1bMV0scj0rdFsxXVswXSxpPSt0WzFdWzFdKSxfKCkpOm51bGw9PWQ/bnVsbDpbW2QsZV0sW3IsaV1dfSxiLnNjYWxlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PSt0LF8oKSk6dX0sYi50cmFuc2xhdGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGM9K3RbMF0sZj0rdFsxXSxfKCkpOltjLGZdfSxiLmFuZ2xlPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPVBmKGg9ZSUzNjAqeGYpLHQ9QWYoaCksXygpKTpoKm1mfSxiLnJlZmxlY3RYPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhzPXQ/LTE6MSxfKCkpOnM8MH0sYi5yZWZsZWN0WT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obD10Py0xOjEsXygpKTpsPDB9LGIuZml0RXh0ZW50PWZ1bmN0aW9uKHQsbil7cmV0dXJuIGNkKGIsdCxuKX0sYi5maXRTaXplPWZ1bmN0aW9uKHQsbil7cmV0dXJuIGZkKGIsdCxuKX0sYi5maXRXaWR0aD1mdW5jdGlvbih0LG4pe3JldHVybiBzZChiLHQsbil9LGIuZml0SGVpZ2h0PWZ1bmN0aW9uKHQsbil7cmV0dXJuIGxkKGIsdCxuKX0sYn0sdC5nZW9JbnRlcnBvbGF0ZT1mdW5jdGlvbih0LG4pe3ZhciBlPXRbMF0qeGYscj10WzFdKnhmLGk9blswXSp4ZixvPW5bMV0qeGYsYT1BZihyKSx1PVBmKHIpLGM9QWYobyksZj1QZihvKSxzPWEqQWYoZSksbD1hKlBmKGUpLGg9YypBZihpKSxkPWMqUGYoaSkscD0yKkZmKCRmKHFmKG8tcikrYSpjKnFmKGktZSkpKSxnPVBmKHApLHk9cD9mdW5jdGlvbih0KXt2YXIgbj1QZih0Kj1wKS9nLGU9UGYocC10KS9nLHI9ZSpzK24qaCxpPWUqbCtuKmQsbz1lKnUrbipmO3JldHVybltUZihpLHIpKm1mLFRmKG8sJGYocipyK2kqaSkpKm1mXX06ZnVuY3Rpb24oKXtyZXR1cm5bZSptZixyKm1mXX07cmV0dXJuIHkuZGlzdGFuY2U9cCx5fSx0Lmdlb0xlbmd0aD1VbCx0Lmdlb01lcmNhdG9yPWZ1bmN0aW9uKCl7cmV0dXJuIE5kKEVkKS5zY2FsZSg5NjEvYmYpfSx0Lmdlb01lcmNhdG9yUmF3PUVkLHQuZ2VvTmF0dXJhbEVhcnRoMT1mdW5jdGlvbigpe3JldHVybiB2ZChPZCkuc2NhbGUoMTc1LjI5NSl9LHQuZ2VvTmF0dXJhbEVhcnRoMVJhdz1PZCx0Lmdlb09ydGhvZ3JhcGhpYz1mdW5jdGlvbigpe3JldHVybiB2ZChCZCkuc2NhbGUoMjQ5LjUpLmNsaXBBbmdsZSg5MCtwZil9LHQuZ2VvT3J0aG9ncmFwaGljUmF3PUJkLHQuZ2VvUGF0aD1mdW5jdGlvbih0LG4pe2xldCBlLHIsaT0zLG89NC41O2Z1bmN0aW9uIGEodCl7cmV0dXJuIHQmJigiZnVuY3Rpb24iPT10eXBlb2YgbyYmci5wb2ludFJhZGl1cygrby5hcHBseSh0aGlzLGFyZ3VtZW50cykpLGpmKHQsZShyKSkpLHIucmVzdWx0KCl9cmV0dXJuIGEuYXJlYT1mdW5jdGlvbih0KXtyZXR1cm4gamYodCxlKGxoKSksbGgucmVzdWx0KCl9LGEubWVhc3VyZT1mdW5jdGlvbih0KXtyZXR1cm4gamYodCxlKFFoKSksUWgucmVzdWx0KCl9LGEuYm91bmRzPWZ1bmN0aW9uKHQpe3JldHVybiBqZih0LGUoeGgpKSx4aC5yZXN1bHQoKX0sYS5jZW50cm9pZD1mdW5jdGlvbih0KXtyZXR1cm4gamYodCxlKEJoKSksQmgucmVzdWx0KCl9LGEucHJvamVjdGlvbj1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT1udWxsPT1uPyh0PW51bGwscmgpOih0PW4pLnN0cmVhbSxhKTp0fSxhLmNvbnRleHQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9bnVsbD09dD8obj1udWxsLG5ldyByZChpKSk6bmV3IFloKG49dCksImZ1bmN0aW9uIiE9dHlwZW9mIG8mJnIucG9pbnRSYWRpdXMobyksYSk6bn0sYS5wb2ludFJhZGl1cz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz0iZnVuY3Rpb24iPT10eXBlb2YgdD90OihyLnBvaW50UmFkaXVzKCt0KSwrdCksYSk6b30sYS5kaWdpdHM9ZnVuY3Rpb24odCl7aWYoIWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIGk7aWYobnVsbD09dClpPW51bGw7ZWxzZXtjb25zdCBuPU1hdGguZmxvb3IodCk7aWYoIShuPj0wKSl0aHJvdyBuZXcgUmFuZ2VFcnJvcihgaW52YWxpZCBkaWdpdHM6ICR7dH1gKTtpPW59cmV0dXJuIG51bGw9PT1uJiYocj1uZXcgcmQoaSkpLGF9LGEucHJvamVjdGlvbih0KS5kaWdpdHMoaSkuY29udGV4dChuKX0sdC5nZW9Qcm9qZWN0aW9uPXZkLHQuZ2VvUHJvamVjdGlvbk11dGF0b3I9X2QsdC5nZW9Sb3RhdGlvbj1obCx0Lmdlb1N0ZXJlb2dyYXBoaWM9ZnVuY3Rpb24oKXtyZXR1cm4gdmQoWWQpLnNjYWxlKDI1MCkuY2xpcEFuZ2xlKDE0Mil9LHQuZ2VvU3RlcmVvZ3JhcGhpY1Jhdz1ZZCx0Lmdlb1N0cmVhbT1qZix0Lmdlb1RyYW5zZm9ybT1mdW5jdGlvbih0KXtyZXR1cm57c3RyZWFtOm9kKHQpfX0sdC5nZW9UcmFuc3ZlcnNlTWVyY2F0b3I9ZnVuY3Rpb24oKXt2YXIgdD1OZChMZCksbj10LmNlbnRlcixlPXQucm90YXRlO3JldHVybiB0LmNlbnRlcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD9uKFstdFsxXSx0WzBdXSk6Wyh0PW4oKSlbMV0sLXRbMF1dfSx0LnJvdGF0ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD9lKFt0WzBdLHRbMV0sdC5sZW5ndGg+Mj90WzJdKzkwOjkwXSk6Wyh0PWUoKSlbMF0sdFsxXSx0WzJdLTkwXX0sZShbMCwwLDkwXSkuc2NhbGUoMTU5LjE1NSl9LHQuZ2VvVHJhbnN2ZXJzZU1lcmNhdG9yUmF3PUxkLHQuZ3JheT1mdW5jdGlvbih0LG4pe3JldHVybiBuZXcgY3IodCwwLDAsbnVsbD09bj8xOm4pfSx0LmdyZWF0ZXN0PWF0LHQuZ3JlYXRlc3RJbmRleD1mdW5jdGlvbih0LGU9bil7aWYoMT09PWUubGVuZ3RoKXJldHVybiBudCh0LGUpO2xldCByLGk9LTEsbz0tMTtmb3IoY29uc3QgbiBvZiB0KSsrbywoaTwwPzA9PT1lKG4sbik6ZShuLHIpPjApJiYocj1uLGk9byk7cmV0dXJuIGl9LHQuZ3JvdXA9UCx0Lmdyb3VwU29ydD1mdW5jdGlvbih0LGUscil7cmV0dXJuKDIhPT1lLmxlbmd0aD9JKEQodCxlLHIpLCgoW3QsZV0sW3IsaV0pPT5uKGUsaSl8fG4odCxyKSkpOkkoUCh0LHIpLCgoW3Qscl0sW2ksb10pPT5lKHIsbyl8fG4odCxpKSkpKS5tYXAoKChbdF0pPT50KSl9LHQuZ3JvdXBzPXosdC5oY2w9cHIsdC5oaWVyYXJjaHk9VmQsdC5oaXN0b2dyYW09Six0LmhzbD1YZSx0Lmh0bWw9TmMsdC5pbWFnZT1mdW5jdGlvbih0LG4pe3JldHVybiBuZXcgUHJvbWlzZSgoZnVuY3Rpb24oZSxyKXt2YXIgaT1uZXcgSW1hZ2U7Zm9yKHZhciBvIGluIG4paVtvXT1uW29dO2kub25lcnJvcj1yLGkub25sb2FkPWZ1bmN0aW9uKCl7ZShpKX0saS5zcmM9dH0pKX0sdC5pbmRleD1mdW5jdGlvbih0LC4uLm4pe3JldHVybiBxKHQsQyxGLG4pfSx0LmluZGV4ZXM9ZnVuY3Rpb24odCwuLi5uKXtyZXR1cm4gcSh0LEFycmF5LmZyb20sRixuKX0sdC5pbnRlcnBvbGF0ZT1Wcix0LmludGVycG9sYXRlQXJyYXk9ZnVuY3Rpb24odCxuKXtyZXR1cm4oT3Iobik/SXI6QnIpKHQsbil9LHQuaW50ZXJwb2xhdGVCYXNpcz1Ocix0LmludGVycG9sYXRlQmFzaXNDbG9zZWQ9a3IsdC5pbnRlcnBvbGF0ZUJsdWVzPUdiLHQuaW50ZXJwb2xhdGVCckJHPW9iLHQuaW50ZXJwb2xhdGVCdUduPU1iLHQuaW50ZXJwb2xhdGVCdVB1PUFiLHQuaW50ZXJwb2xhdGVDaXZpZGlzPWZ1bmN0aW9uKHQpe3JldHVybiB0PU1hdGgubWF4KDAsTWF0aC5taW4oMSx0KSksInJnYigiK01hdGgubWF4KDAsTWF0aC5taW4oMjU1LE1hdGgucm91bmQoLTQuNTQtdCooMzUuMzQtdCooMjM4MS43My10Kig2NDAyLjctdCooNzAyNC43Mi0yNzEwLjU3KnQpKSkpKSkpKyIsICIrTWF0aC5tYXgoMCxNYXRoLm1pbigyNTUsTWF0aC5yb3VuZCgzMi40OSt0KigxNzAuNzMrdCooNTIuODItdCooMTMxLjQ2LXQqKDE3Ni41OC02Ny4zNyp0KSkpKSkpKSsiLCAiK01hdGgubWF4KDAsTWF0aC5taW4oMjU1LE1hdGgucm91bmQoODEuMjQrdCooNDQyLjM2LXQqKDI0ODIuNDMtdCooNjE2Ny4yNC10Kig2NjE0Ljk0LTI0NzUuNjcqdCkpKSkpKSkrIikifSx0LmludGVycG9sYXRlQ29vbD1hbSx0LmludGVycG9sYXRlQ3ViZWhlbGl4PWhpLHQuaW50ZXJwb2xhdGVDdWJlaGVsaXhEZWZhdWx0PWltLHQuaW50ZXJwb2xhdGVDdWJlaGVsaXhMb25nPWRpLHQuaW50ZXJwb2xhdGVEYXRlPVlyLHQuaW50ZXJwb2xhdGVEaXNjcmV0ZT1mdW5jdGlvbih0KXt2YXIgbj10Lmxlbmd0aDtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIHRbTWF0aC5tYXgoMCxNYXRoLm1pbihuLTEsTWF0aC5mbG9vcihlKm4pKSldfX0sdC5pbnRlcnBvbGF0ZUduQnU9RWIsdC5pbnRlcnBvbGF0ZUdyZWVucz1XYix0LmludGVycG9sYXRlR3JleXM9S2IsdC5pbnRlcnBvbGF0ZUhjbD1maSx0LmludGVycG9sYXRlSGNsTG9uZz1zaSx0LmludGVycG9sYXRlSHNsPWFpLHQuaW50ZXJwb2xhdGVIc2xMb25nPXVpLHQuaW50ZXJwb2xhdGVIdWU9ZnVuY3Rpb24odCxuKXt2YXIgZT16cigrdCwrbik7cmV0dXJuIGZ1bmN0aW9uKHQpe3ZhciBuPWUodCk7cmV0dXJuIG4tMzYwKk1hdGguZmxvb3Iobi8zNjApfX0sdC5pbnRlcnBvbGF0ZUluZmVybm89cG0sdC5pbnRlcnBvbGF0ZUxhYj1mdW5jdGlvbih0LG4pe3ZhciBlPURyKCh0PXVyKHQpKS5sLChuPXVyKG4pKS5sKSxyPURyKHQuYSxuLmEpLGk9RHIodC5iLG4uYiksbz1Ecih0Lm9wYWNpdHksbi5vcGFjaXR5KTtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIHQubD1lKG4pLHQuYT1yKG4pLHQuYj1pKG4pLHQub3BhY2l0eT1vKG4pLHQrIiJ9fSx0LmludGVycG9sYXRlTWFnbWE9ZG0sdC5pbnRlcnBvbGF0ZU51bWJlcj1Mcix0LmludGVycG9sYXRlTnVtYmVyQXJyYXk9SXIsdC5pbnRlcnBvbGF0ZU9iamVjdD1qcix0LmludGVycG9sYXRlT3JSZD1rYix0LmludGVycG9sYXRlT3Jhbmdlcz1ybSx0LmludGVycG9sYXRlUFJHbj11Yix0LmludGVycG9sYXRlUGlZRz1mYix0LmludGVycG9sYXRlUGxhc21hPWdtLHQuaW50ZXJwb2xhdGVQdUJ1PSRiLHQuaW50ZXJwb2xhdGVQdUJ1R249UGIsdC5pbnRlcnBvbGF0ZVB1T3I9bGIsdC5pbnRlcnBvbGF0ZVB1UmQ9UmIsdC5pbnRlcnBvbGF0ZVB1cnBsZXM9SmIsdC5pbnRlcnBvbGF0ZVJhaW5ib3c9ZnVuY3Rpb24odCl7KHQ8MHx8dD4xKSYmKHQtPU1hdGguZmxvb3IodCkpO3ZhciBuPU1hdGguYWJzKHQtLjUpO3JldHVybiB1bS5oPTM2MCp0LTEwMCx1bS5zPTEuNS0xLjUqbix1bS5sPS44LS45Km4sdW0rIiJ9LHQuaW50ZXJwb2xhdGVSZEJ1PWRiLHQuaW50ZXJwb2xhdGVSZEd5PWdiLHQuaW50ZXJwb2xhdGVSZFB1PXFiLHQuaW50ZXJwb2xhdGVSZFlsQnU9dmIsdC5pbnRlcnBvbGF0ZVJkWWxHbj1iYix0LmludGVycG9sYXRlUmVkcz1ubSx0LmludGVycG9sYXRlUmdiPVJyLHQuaW50ZXJwb2xhdGVSZ2JCYXNpcz1xcix0LmludGVycG9sYXRlUmdiQmFzaXNDbG9zZWQ9VXIsdC5pbnRlcnBvbGF0ZVJvdW5kPVdyLHQuaW50ZXJwb2xhdGVTaW5lYm93PWZ1bmN0aW9uKHQpe3ZhciBuO3JldHVybiB0PSguNS10KSpNYXRoLlBJLGNtLnI9MjU1KihuPU1hdGguc2luKHQpKSpuLGNtLmc9MjU1KihuPU1hdGguc2luKHQrZm0pKSpuLGNtLmI9MjU1KihuPU1hdGguc2luKHQrc20pKSpuLGNtKyIifSx0LmludGVycG9sYXRlU3BlY3RyYWw9eGIsdC5pbnRlcnBvbGF0ZVN0cmluZz1Hcix0LmludGVycG9sYXRlVHJhbnNmb3JtQ3NzPW5pLHQuaW50ZXJwb2xhdGVUcmFuc2Zvcm1Tdmc9ZWksdC5pbnRlcnBvbGF0ZVR1cmJvPWZ1bmN0aW9uKHQpe3JldHVybiB0PU1hdGgubWF4KDAsTWF0aC5taW4oMSx0KSksInJnYigiK01hdGgubWF4KDAsTWF0aC5taW4oMjU1LE1hdGgucm91bmQoMzQuNjErdCooMTE3Mi4zMy10KigxMDc5My41Ni10KigzMzMwMC4xMi10KigzODM5NC40OS0xNDgyNS4wNSp0KSkpKSkpKSsiLCAiK01hdGgubWF4KDAsTWF0aC5taW4oMjU1LE1hdGgucm91bmQoMjMuMzErdCooNTU3LjMzK3QqKDEyMjUuMzMtdCooMzU3NC45Ni10KigxMDczLjc3KzcwNy41Nip0KSkpKSkpKSsiLCAiK01hdGgubWF4KDAsTWF0aC5taW4oMjU1LE1hdGgucm91bmQoMjcuMit0KigzMjExLjEtdCooMTUzMjcuOTctdCooMjc4MTQtdCooMjI1NjkuMTgtNjgzOC42Nip0KSkpKSkpKSsiKSJ9LHQuaW50ZXJwb2xhdGVWaXJpZGlzPWhtLHQuaW50ZXJwb2xhdGVXYXJtPW9tLHQuaW50ZXJwb2xhdGVZbEduPUJiLHQuaW50ZXJwb2xhdGVZbEduQnU9SWIsdC5pbnRlcnBvbGF0ZVlsT3JCcj1MYix0LmludGVycG9sYXRlWWxPclJkPUhiLHQuaW50ZXJwb2xhdGVab29tPWlpLHQuaW50ZXJydXB0PVZpLHQuaW50ZXJzZWN0aW9uPWZ1bmN0aW9uKHQsLi4ubil7dD1uZXcgSW50ZXJuU2V0KHQpLG49bi5tYXAoX3QpO3Q6Zm9yKGNvbnN0IGUgb2YgdClmb3IoY29uc3QgciBvZiBuKWlmKCFyLmhhcyhlKSl7dC5kZWxldGUoZSk7Y29udGludWUgdH1yZXR1cm4gdH0sdC5pbnRlcnZhbD1mdW5jdGlvbih0LG4sZSl7dmFyIHI9bmV3IE5pLGk9bjtyZXR1cm4gbnVsbD09bj8oci5yZXN0YXJ0KHQsbixlKSxyKTooci5fcmVzdGFydD1yLnJlc3RhcnQsci5yZXN0YXJ0PWZ1bmN0aW9uKHQsbixlKXtuPStuLGU9bnVsbD09ZT9TaSgpOitlLHIuX3Jlc3RhcnQoKGZ1bmN0aW9uIG8oYSl7YSs9aSxyLl9yZXN0YXJ0KG8saSs9bixlKSx0KGEpfSksbixlKX0sci5yZXN0YXJ0KHQsbixlKSxyKX0sdC5pc29Gb3JtYXQ9Ul8sdC5pc29QYXJzZT1xXyx0Lmpzb249ZnVuY3Rpb24odCxuKXtyZXR1cm4gZmV0Y2godCxuKS50aGVuKEFjKX0sdC5sYWI9dXIsdC5sY2g9ZnVuY3Rpb24odCxuLGUscil7cmV0dXJuIDE9PT1hcmd1bWVudHMubGVuZ3RoP2RyKHQpOm5ldyBncihlLG4sdCxudWxsPT1yPzE6cil9LHQubGVhc3Q9ZnVuY3Rpb24odCxlPW4pe2xldCByLGk9ITE7aWYoMT09PWUubGVuZ3RoKXtsZXQgbztmb3IoY29uc3QgYSBvZiB0KXtjb25zdCB0PWUoYSk7KGk/bih0LG8pPDA6MD09PW4odCx0KSkmJihyPWEsbz10LGk9ITApfX1lbHNlIGZvcihjb25zdCBuIG9mIHQpKGk/ZShuLHIpPDA6MD09PWUobixuKSkmJihyPW4saT0hMCk7cmV0dXJuIHJ9LHQubGVhc3RJbmRleD1kdCx0LmxpbmU9WW0sdC5saW5lUmFkaWFsPVptLHQubGluaz1heCx0LmxpbmtIb3Jpem9udGFsPWZ1bmN0aW9uKCl7cmV0dXJuIGF4KG54KX0sdC5saW5rUmFkaWFsPWZ1bmN0aW9uKCl7Y29uc3QgdD1heChyeCk7cmV0dXJuIHQuYW5nbGU9dC54LGRlbGV0ZSB0LngsdC5yYWRpdXM9dC55LGRlbGV0ZSB0LnksdH0sdC5saW5rVmVydGljYWw9ZnVuY3Rpb24oKXtyZXR1cm4gYXgoZXgpfSx0LmxvY2FsPUpuLHQubWFwPWZ1bmN0aW9uKHQsbil7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHRbU3ltYm9sLml0ZXJhdG9yXSl0aHJvdyBuZXcgVHlwZUVycm9yKCJ2YWx1ZXMgaXMgbm90IGl0ZXJhYmxlIik7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIG4pdGhyb3cgbmV3IFR5cGVFcnJvcigibWFwcGVyIGlzIG5vdCBhIGZ1bmN0aW9uIik7cmV0dXJuIEFycmF5LmZyb20odCwoKGUscik9Pm4oZSxyLHQpKSl9LHQubWF0Y2hlcj1XdCx0Lm1heD10dCx0Lm1heEluZGV4PW50LHQubWVhbj1mdW5jdGlvbih0LG4pe2xldCBlPTAscj0wO2lmKHZvaWQgMD09PW4pZm9yKGxldCBuIG9mIHQpbnVsbCE9biYmKG49K24pPj1uJiYoKytlLHIrPW4pO2Vsc2V7bGV0IGk9LTE7Zm9yKGxldCBvIG9mIHQpbnVsbCE9KG89bihvLCsraSx0KSkmJihvPStvKT49byYmKCsrZSxyKz1vKX1pZihlKXJldHVybiByL2V9LHQubWVkaWFuPWZ1bmN0aW9uKHQsbil7cmV0dXJuIHV0KHQsLjUsbil9LHQubWVkaWFuSW5kZXg9ZnVuY3Rpb24odCxuKXtyZXR1cm4gZnQodCwuNSxuKX0sdC5tZXJnZT1zdCx0Lm1pbj1ldCx0Lm1pbkluZGV4PXJ0LHQubW9kZT1mdW5jdGlvbih0LG4pe2NvbnN0IGU9bmV3IEludGVybk1hcDtpZih2b2lkIDA9PT1uKWZvcihsZXQgbiBvZiB0KW51bGwhPW4mJm4+PW4mJmUuc2V0KG4sKGUuZ2V0KG4pfHwwKSsxKTtlbHNle2xldCByPS0xO2ZvcihsZXQgaSBvZiB0KW51bGwhPShpPW4oaSwrK3IsdCkpJiZpPj1pJiZlLnNldChpLChlLmdldChpKXx8MCkrMSl9bGV0IHIsaT0wO2Zvcihjb25zdFt0LG5db2YgZSluPmkmJihpPW4scj10KTtyZXR1cm4gcn0sdC5uYW1lc3BhY2U9T3QsdC5uYW1lc3BhY2VzPUl0LHQubmljZT1LLHQubm93PVNpLHQucGFjaz1mdW5jdGlvbigpe3ZhciB0PW51bGwsbj0xLGU9MSxyPWVwO2Z1bmN0aW9uIGkoaSl7Y29uc3Qgbz11cCgpO3JldHVybiBpLng9bi8yLGkueT1lLzIsdD9pLmVhY2hCZWZvcmUod3AodCkpLmVhY2hBZnRlcihNcChyLC41LG8pKS5lYWNoQmVmb3JlKFRwKDEpKTppLmVhY2hCZWZvcmUod3AoeHApKS5lYWNoQWZ0ZXIoTXAoZXAsMSxvKSkuZWFjaEFmdGVyKE1wKHIsaS5yL01hdGgubWluKG4sZSksbykpLmVhY2hCZWZvcmUoVHAoTWF0aC5taW4obixlKS8oMippLnIpKSksaX1yZXR1cm4gaS5yYWRpdXM9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9dHAobiksaSk6dH0saS5zaXplPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPSt0WzBdLGU9K3RbMV0saSk6W24sZV19LGkucGFkZGluZz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj0iZnVuY3Rpb24iPT10eXBlb2YgdD90OnJwKCt0KSxpKTpyfSxpfSx0LnBhY2tFbmNsb3NlPWZ1bmN0aW9uKHQpe3JldHVybiBjcCh0LHVwKCkpfSx0LnBhY2tTaWJsaW5ncz1mdW5jdGlvbih0KXtyZXR1cm4gbXAodCx1cCgpKSx0fSx0LnBhaXJzPWZ1bmN0aW9uKHQsbj1sdCl7Y29uc3QgZT1bXTtsZXQgcixpPSExO2Zvcihjb25zdCBvIG9mIHQpaSYmZS5wdXNoKG4ocixvKSkscj1vLGk9ITA7cmV0dXJuIGV9LHQucGFydGl0aW9uPWZ1bmN0aW9uKCl7dmFyIHQ9MSxuPTEsZT0wLHI9ITE7ZnVuY3Rpb24gaShpKXt2YXIgbz1pLmhlaWdodCsxO3JldHVybiBpLngwPWkueTA9ZSxpLngxPXQsaS55MT1uL28saS5lYWNoQmVmb3JlKGZ1bmN0aW9uKHQsbil7cmV0dXJuIGZ1bmN0aW9uKHIpe3IuY2hpbGRyZW4mJlNwKHIsci54MCx0KihyLmRlcHRoKzEpL24sci54MSx0KihyLmRlcHRoKzIpL24pO3ZhciBpPXIueDAsbz1yLnkwLGE9ci54MS1lLHU9ci55MS1lO2E8aSYmKGk9YT0oaSthKS8yKSx1PG8mJihvPXU9KG8rdSkvMiksci54MD1pLHIueTA9byxyLngxPWEsci55MT11fX0obixvKSksciYmaS5lYWNoQmVmb3JlKEFwKSxpfXJldHVybiBpLnJvdW5kPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPSEhdCxpKTpyfSxpLnNpemU9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9K2VbMF0sbj0rZVsxXSxpKTpbdCxuXX0saS5wYWRkaW5nPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPSt0LGkpOmV9LGl9LHQucGF0aD1PYSx0LnBhdGhSb3VuZD1mdW5jdGlvbih0PTMpe3JldHVybiBuZXcgSWEoK3QpfSx0LnBlcm11dGU9VSx0LnBpZT1mdW5jdGlvbigpe3ZhciB0PUhtLG49am0sZT1udWxsLHI9eW0oMCksaT15bShFbSksbz15bSgwKTtmdW5jdGlvbiBhKGEpe3ZhciB1LGMsZixzLGwsaD0oYT1xbShhKSkubGVuZ3RoLGQ9MCxwPW5ldyBBcnJheShoKSxnPW5ldyBBcnJheShoKSx5PStyLmFwcGx5KHRoaXMsYXJndW1lbnRzKSx2PU1hdGgubWluKEVtLE1hdGgubWF4KC1FbSxpLmFwcGx5KHRoaXMsYXJndW1lbnRzKS15KSksXz1NYXRoLm1pbihNYXRoLmFicyh2KS9oLG8uYXBwbHkodGhpcyxhcmd1bWVudHMpKSxiPV8qKHY8MD8tMToxKTtmb3IodT0wO3U8aDsrK3UpKGw9Z1twW3VdPXVdPSt0KGFbdV0sdSxhKSk+MCYmKGQrPWwpO2ZvcihudWxsIT1uP3Auc29ydCgoZnVuY3Rpb24odCxlKXtyZXR1cm4gbihnW3RdLGdbZV0pfSkpOm51bGwhPWUmJnAuc29ydCgoZnVuY3Rpb24odCxuKXtyZXR1cm4gZShhW3RdLGFbbl0pfSkpLHU9MCxmPWQ/KHYtaCpiKS9kOjA7dTxoOysrdSx5PXMpYz1wW3VdLHM9eSsoKGw9Z1tjXSk+MD9sKmY6MCkrYixnW2NdPXtkYXRhOmFbY10saW5kZXg6dSx2YWx1ZTpsLHN0YXJ0QW5nbGU6eSxlbmRBbmdsZTpzLHBhZEFuZ2xlOl99O3JldHVybiBnfXJldHVybiBhLnZhbHVlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PSJmdW5jdGlvbiI9PXR5cGVvZiBuP246eW0oK24pLGEpOnR9LGEuc29ydFZhbHVlcz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj10LGU9bnVsbCxhKTpufSxhLnNvcnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9dCxuPW51bGwsYSk6ZX0sYS5zdGFydEFuZ2xlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6eW0oK3QpLGEpOnJ9LGEuZW5kQW5nbGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDp5bSgrdCksYSk6aX0sYS5wYWRBbmdsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz0iZnVuY3Rpb24iPT10eXBlb2YgdD90OnltKCt0KSxhKTpvfSxhfSx0LnBpZWNld2lzZT1waSx0LnBvaW50UmFkaWFsPVFtLHQucG9pbnRlcj1lZSx0LnBvaW50ZXJzPWZ1bmN0aW9uKHQsbil7cmV0dXJuIHQudGFyZ2V0JiYodD1uZSh0KSx2b2lkIDA9PT1uJiYobj10LmN1cnJlbnRUYXJnZXQpLHQ9dC50b3VjaGVzfHxbdF0pLEFycmF5LmZyb20odCwodD0+ZWUodCxuKSkpfSx0LnBvbHlnb25BcmVhPWZ1bmN0aW9uKHQpe2Zvcih2YXIgbixlPS0xLHI9dC5sZW5ndGgsaT10W3ItMV0sbz0wOysrZTxyOyluPWksaT10W2VdLG8rPW5bMV0qaVswXS1uWzBdKmlbMV07cmV0dXJuIG8vMn0sdC5wb2x5Z29uQ2VudHJvaWQ9ZnVuY3Rpb24odCl7Zm9yKHZhciBuLGUscj0tMSxpPXQubGVuZ3RoLG89MCxhPTAsdT10W2ktMV0sYz0wOysrcjxpOyluPXUsdT10W3JdLGMrPWU9blswXSp1WzFdLXVbMF0qblsxXSxvKz0oblswXSt1WzBdKSplLGErPShuWzFdK3VbMV0pKmU7cmV0dXJuW28vKGMqPTMpLGEvY119LHQucG9seWdvbkNvbnRhaW5zPWZ1bmN0aW9uKHQsbil7Zm9yKHZhciBlLHIsaT10Lmxlbmd0aCxvPXRbaS0xXSxhPW5bMF0sdT1uWzFdLGM9b1swXSxmPW9bMV0scz0hMSxsPTA7bDxpOysrbCllPShvPXRbbF0pWzBdLChyPW9bMV0pPnUhPWY+dSYmYTwoYy1lKSoodS1yKS8oZi1yKStlJiYocz0hcyksYz1lLGY9cjtyZXR1cm4gc30sdC5wb2x5Z29uSHVsbD1mdW5jdGlvbih0KXtpZigoZT10Lmxlbmd0aCk8MylyZXR1cm4gbnVsbDt2YXIgbixlLHI9bmV3IEFycmF5KGUpLGk9bmV3IEFycmF5KGUpO2ZvcihuPTA7bjxlOysrbilyW25dPVsrdFtuXVswXSwrdFtuXVsxXSxuXTtmb3Ioci5zb3J0KFhwKSxuPTA7bjxlOysrbilpW25dPVtyW25dWzBdLC1yW25dWzFdXTt2YXIgbz1HcChyKSxhPUdwKGkpLHU9YVswXT09PW9bMF0sYz1hW2EubGVuZ3RoLTFdPT09b1tvLmxlbmd0aC0xXSxmPVtdO2ZvcihuPW8ubGVuZ3RoLTE7bj49MDstLW4pZi5wdXNoKHRbcltvW25dXVsyXV0pO2ZvcihuPSt1O248YS5sZW5ndGgtYzsrK24pZi5wdXNoKHRbclthW25dXVsyXV0pO3JldHVybiBmfSx0LnBvbHlnb25MZW5ndGg9ZnVuY3Rpb24odCl7Zm9yKHZhciBuLGUscj0tMSxpPXQubGVuZ3RoLG89dFtpLTFdLGE9b1swXSx1PW9bMV0sYz0wOysrcjxpOyluPWEsZT11LG4tPWE9KG89dFtyXSlbMF0sZS09dT1vWzFdLGMrPU1hdGguaHlwb3QobixlKTtyZXR1cm4gY30sdC5wcmVjaXNpb25GaXhlZD1sZix0LnByZWNpc2lvblByZWZpeD1oZix0LnByZWNpc2lvblJvdW5kPWRmLHQucXVhZHRyZWU9RGMsdC5xdWFudGlsZT11dCx0LnF1YW50aWxlSW5kZXg9ZnQsdC5xdWFudGlsZVNvcnRlZD1jdCx0LnF1YW50aXplPWZ1bmN0aW9uKHQsbil7Zm9yKHZhciBlPW5ldyBBcnJheShuKSxyPTA7cjxuOysrcillW3JdPXQoci8obi0xKSk7cmV0dXJuIGV9LHQucXVpY2tzZWxlY3Q9aXQsdC5yYWRpYWxBcmVhPUttLHQucmFkaWFsTGluZT1abSx0LnJhbmRvbUJhdGVzPXRnLHQucmFuZG9tQmVybm91bGxpPXJnLHQucmFuZG9tQmV0YT1hZyx0LnJhbmRvbUJpbm9taWFsPXVnLHQucmFuZG9tQ2F1Y2h5PWZnLHQucmFuZG9tRXhwb25lbnRpYWw9bmcsdC5yYW5kb21HYW1tYT1vZyx0LnJhbmRvbUdlb21ldHJpYz1pZyx0LnJhbmRvbUludD1acCx0LnJhbmRvbUlyd2luSGFsbD1KcCx0LnJhbmRvbUxjZz1mdW5jdGlvbih0PU1hdGgucmFuZG9tKCkpe2xldCBuPTB8KDA8PXQmJnQ8MT90L2hnOk1hdGguYWJzKHQpKTtyZXR1cm4oKT0+KG49MTY2NDUyNSpuKzEwMTM5MDQyMjN8MCxoZyoobj4+PjApKX0sdC5yYW5kb21Mb2dOb3JtYWw9UXAsdC5yYW5kb21Mb2dpc3RpYz1zZyx0LnJhbmRvbU5vcm1hbD1LcCx0LnJhbmRvbVBhcmV0bz1lZyx0LnJhbmRvbVBvaXNzb249bGcsdC5yYW5kb21Vbmlmb3JtPVdwLHQucmFuZG9tV2VpYnVsbD1jZyx0LnJhbmdlPWh0LHQucmFuaz1mdW5jdGlvbih0LGU9bil7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHRbU3ltYm9sLml0ZXJhdG9yXSl0aHJvdyBuZXcgVHlwZUVycm9yKCJ2YWx1ZXMgaXMgbm90IGl0ZXJhYmxlIik7bGV0IHI9QXJyYXkuZnJvbSh0KTtjb25zdCBpPW5ldyBGbG9hdDY0QXJyYXkoci5sZW5ndGgpOzIhPT1lLmxlbmd0aCYmKHI9ci5tYXAoZSksZT1uKTtjb25zdCBvPSh0LG4pPT5lKHJbdF0scltuXSk7bGV0IGEsdTtyZXR1cm4odD1VaW50MzJBcnJheS5mcm9tKHIsKCh0LG4pPT5uKSkpLnNvcnQoZT09PW4/KHQsbik9PkIoclt0XSxyW25dKTpPKG8pKSx0LmZvckVhY2goKCh0LG4pPT57Y29uc3QgZT1vKHQsdm9pZCAwPT09YT90OmEpO2U+PTA/KCh2b2lkIDA9PT1hfHxlPjApJiYoYT10LHU9biksaVt0XT11KTppW3RdPU5hTn0pKSxpfSx0LnJlZHVjZT1mdW5jdGlvbih0LG4sZSl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIG4pdGhyb3cgbmV3IFR5cGVFcnJvcigicmVkdWNlciBpcyBub3QgYSBmdW5jdGlvbiIpO2NvbnN0IHI9dFtTeW1ib2wuaXRlcmF0b3JdKCk7bGV0IGksbyxhPS0xO2lmKGFyZ3VtZW50cy5sZW5ndGg8Myl7aWYoKHtkb25lOmksdmFsdWU6ZX09ci5uZXh0KCkpLGkpcmV0dXJuOysrYX1mb3IoOyh7ZG9uZTppLHZhbHVlOm99PXIubmV4dCgpKSwhaTspZT1uKGUsbywrK2EsdCk7cmV0dXJuIGV9LHQucmV2ZXJzZT1mdW5jdGlvbih0KXtpZigiZnVuY3Rpb24iIT10eXBlb2YgdFtTeW1ib2wuaXRlcmF0b3JdKXRocm93IG5ldyBUeXBlRXJyb3IoInZhbHVlcyBpcyBub3QgaXRlcmFibGUiKTtyZXR1cm4gQXJyYXkuZnJvbSh0KS5yZXZlcnNlKCl9LHQucmdiPXFlLHQucmliYm9uPWZ1bmN0aW9uKCl7cmV0dXJuIFphKCl9LHQucmliYm9uQXJyb3c9ZnVuY3Rpb24oKXtyZXR1cm4gWmEoV2EpfSx0LnJvbGx1cD1ELHQucm9sbHVwcz1SLHQuc2NhbGVCYW5kPXZnLHQuc2NhbGVEaXZlcmdpbmc9ZnVuY3Rpb24gdCgpe3ZhciBuPWtnKGpfKCkoeGcpKTtyZXR1cm4gbi5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIFlfKG4sdCgpKX0scGcuYXBwbHkobixhcmd1bWVudHMpfSx0LnNjYWxlRGl2ZXJnaW5nTG9nPWZ1bmN0aW9uIHQoKXt2YXIgbj1xZyhqXygpKS5kb21haW4oWy4xLDEsMTBdKTtyZXR1cm4gbi5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIFlfKG4sdCgpKS5iYXNlKG4uYmFzZSgpKX0scGcuYXBwbHkobixhcmd1bWVudHMpfSx0LnNjYWxlRGl2ZXJnaW5nUG93PUhfLHQuc2NhbGVEaXZlcmdpbmdTcXJ0PWZ1bmN0aW9uKCl7cmV0dXJuIEhfLmFwcGx5KG51bGwsYXJndW1lbnRzKS5leHBvbmVudCguNSl9LHQuc2NhbGVEaXZlcmdpbmdTeW1sb2c9ZnVuY3Rpb24gdCgpe3ZhciBuPU9nKGpfKCkpO3JldHVybiBuLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gWV8obix0KCkpLmNvbnN0YW50KG4uY29uc3RhbnQoKSl9LHBnLmFwcGx5KG4sYXJndW1lbnRzKX0sdC5zY2FsZUlkZW50aXR5PWZ1bmN0aW9uIHQobil7dmFyIGU7ZnVuY3Rpb24gcih0KXtyZXR1cm4gbnVsbD09dHx8aXNOYU4odD0rdCk/ZTp0fXJldHVybiByLmludmVydD1yLHIuZG9tYWluPXIucmFuZ2U9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49QXJyYXkuZnJvbSh0LGJnKSxyKTpuLnNsaWNlKCl9LHIudW5rbm93bj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT10LHIpOmV9LHIuY29weT1mdW5jdGlvbigpe3JldHVybiB0KG4pLnVua25vd24oZSl9LG49YXJndW1lbnRzLmxlbmd0aD9BcnJheS5mcm9tKG4sYmcpOlswLDFdLGtnKHIpfSx0LnNjYWxlSW1wbGljaXQ9Z2csdC5zY2FsZUxpbmVhcj1mdW5jdGlvbiB0KCl7dmFyIG49RWcoKTtyZXR1cm4gbi5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIEFnKG4sdCgpKX0sZGcuYXBwbHkobixhcmd1bWVudHMpLGtnKG4pfSx0LnNjYWxlTG9nPWZ1bmN0aW9uIHQoKXtjb25zdCBuPXFnKFNnKCkpLmRvbWFpbihbMSwxMF0pO3JldHVybiBuLmNvcHk9KCk9PkFnKG4sdCgpKS5iYXNlKG4uYmFzZSgpKSxkZy5hcHBseShuLGFyZ3VtZW50cyksbn0sdC5zY2FsZU9yZGluYWw9eWcsdC5zY2FsZVBvaW50PWZ1bmN0aW9uKCl7cmV0dXJuIF9nKHZnLmFwcGx5KG51bGwsYXJndW1lbnRzKS5wYWRkaW5nSW5uZXIoMSkpfSx0LnNjYWxlUG93PUhnLHQuc2NhbGVRdWFudGlsZT1mdW5jdGlvbiB0KCl7dmFyIGUscj1bXSxpPVtdLG89W107ZnVuY3Rpb24gYSgpe3ZhciB0PTAsbj1NYXRoLm1heCgxLGkubGVuZ3RoKTtmb3Iobz1uZXcgQXJyYXkobi0xKTsrK3Q8bjspb1t0LTFdPWN0KHIsdC9uKTtyZXR1cm4gdX1mdW5jdGlvbiB1KHQpe3JldHVybiBudWxsPT10fHxpc05hTih0PSt0KT9lOmlbbChvLHQpXX1yZXR1cm4gdS5pbnZlcnRFeHRlbnQ9ZnVuY3Rpb24odCl7dmFyIG49aS5pbmRleE9mKHQpO3JldHVybiBuPDA/W05hTixOYU5dOltuPjA/b1tuLTFdOnJbMF0sbjxvLmxlbmd0aD9vW25dOnJbci5sZW5ndGgtMV1dfSx1LmRvbWFpbj1mdW5jdGlvbih0KXtpZighYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gci5zbGljZSgpO3I9W107Zm9yKGxldCBuIG9mIHQpbnVsbD09bnx8aXNOYU4obj0rbil8fHIucHVzaChuKTtyZXR1cm4gci5zb3J0KG4pLGEoKX0sdS5yYW5nZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT1BcnJheS5mcm9tKHQpLGEoKSk6aS5zbGljZSgpfSx1LnVua25vd249ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9dCx1KTplfSx1LnF1YW50aWxlcz1mdW5jdGlvbigpe3JldHVybiBvLnNsaWNlKCl9LHUuY29weT1mdW5jdGlvbigpe3JldHVybiB0KCkuZG9tYWluKHIpLnJhbmdlKGkpLnVua25vd24oZSl9LGRnLmFwcGx5KHUsYXJndW1lbnRzKX0sdC5zY2FsZVF1YW50aXplPWZ1bmN0aW9uIHQoKXt2YXIgbixlPTAscj0xLGk9MSxvPVsuNV0sYT1bMCwxXTtmdW5jdGlvbiB1KHQpe3JldHVybiBudWxsIT10JiZ0PD10P2FbbChvLHQsMCxpKV06bn1mdW5jdGlvbiBjKCl7dmFyIHQ9LTE7Zm9yKG89bmV3IEFycmF5KGkpOysrdDxpOylvW3RdPSgodCsxKSpyLSh0LWkpKmUpLyhpKzEpO3JldHVybiB1fXJldHVybiB1LmRvbWFpbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oW2Uscl09dCxlPStlLHI9K3IsYygpKTpbZSxyXX0sdS5yYW5nZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0oYT1BcnJheS5mcm9tKHQpKS5sZW5ndGgtMSxjKCkpOmEuc2xpY2UoKX0sdS5pbnZlcnRFeHRlbnQ9ZnVuY3Rpb24odCl7dmFyIG49YS5pbmRleE9mKHQpO3JldHVybiBuPDA/W05hTixOYU5dOm48MT9bZSxvWzBdXTpuPj1pP1tvW2ktMV0scl06W29bbi0xXSxvW25dXX0sdS51bmtub3duPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPXQsdSk6dX0sdS50aHJlc2hvbGRzPWZ1bmN0aW9uKCl7cmV0dXJuIG8uc2xpY2UoKX0sdS5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIHQoKS5kb21haW4oW2Uscl0pLnJhbmdlKGEpLnVua25vd24obil9LGRnLmFwcGx5KGtnKHUpLGFyZ3VtZW50cyl9LHQuc2NhbGVSYWRpYWw9ZnVuY3Rpb24gdCgpe3ZhciBuLGU9RWcoKSxyPVswLDFdLGk9ITE7ZnVuY3Rpb24gbyh0KXt2YXIgcj1mdW5jdGlvbih0KXtyZXR1cm4gTWF0aC5zaWduKHQpKk1hdGguc3FydChNYXRoLmFicyh0KSl9KGUodCkpO3JldHVybiBpc05hTihyKT9uOmk/TWF0aC5yb3VuZChyKTpyfXJldHVybiBvLmludmVydD1mdW5jdGlvbih0KXtyZXR1cm4gZS5pbnZlcnQoWGcodCkpfSxvLmRvbWFpbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZS5kb21haW4odCksbyk6ZS5kb21haW4oKX0sby5yYW5nZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZS5yYW5nZSgocj1BcnJheS5mcm9tKHQsYmcpKS5tYXAoWGcpKSxvKTpyLnNsaWNlKCl9LG8ucmFuZ2VSb3VuZD1mdW5jdGlvbih0KXtyZXR1cm4gby5yYW5nZSh0KS5yb3VuZCghMCl9LG8ucm91bmQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9ISF0LG8pOml9LG8uY2xhbXA9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGUuY2xhbXAodCksbyk6ZS5jbGFtcCgpfSxvLnVua25vd249ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49dCxvKTpufSxvLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gdChlLmRvbWFpbigpLHIpLnJvdW5kKGkpLmNsYW1wKGUuY2xhbXAoKSkudW5rbm93bihuKX0sZGcuYXBwbHkobyxhcmd1bWVudHMpLGtnKG8pfSx0LnNjYWxlU2VxdWVudGlhbD1mdW5jdGlvbiB0KCl7dmFyIG49a2coQl8oKSh4ZykpO3JldHVybiBuLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gWV8obix0KCkpfSxwZy5hcHBseShuLGFyZ3VtZW50cyl9LHQuc2NhbGVTZXF1ZW50aWFsTG9nPWZ1bmN0aW9uIHQoKXt2YXIgbj1xZyhCXygpKS5kb21haW4oWzEsMTBdKTtyZXR1cm4gbi5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIFlfKG4sdCgpKS5iYXNlKG4uYmFzZSgpKX0scGcuYXBwbHkobixhcmd1bWVudHMpfSx0LnNjYWxlU2VxdWVudGlhbFBvdz1MXyx0LnNjYWxlU2VxdWVudGlhbFF1YW50aWxlPWZ1bmN0aW9uIHQoKXt2YXIgZT1bXSxyPXhnO2Z1bmN0aW9uIGkodCl7aWYobnVsbCE9dCYmIWlzTmFOKHQ9K3QpKXJldHVybiByKChsKGUsdCwxKS0xKS8oZS5sZW5ndGgtMSkpfXJldHVybiBpLmRvbWFpbj1mdW5jdGlvbih0KXtpZighYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gZS5zbGljZSgpO2U9W107Zm9yKGxldCBuIG9mIHQpbnVsbD09bnx8aXNOYU4obj0rbil8fGUucHVzaChuKTtyZXR1cm4gZS5zb3J0KG4pLGl9LGkuaW50ZXJwb2xhdG9yPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPXQsaSk6cn0saS5yYW5nZT1mdW5jdGlvbigpe3JldHVybiBlLm1hcCgoKHQsbik9PnIobi8oZS5sZW5ndGgtMSkpKSl9LGkucXVhbnRpbGVzPWZ1bmN0aW9uKHQpe3JldHVybiBBcnJheS5mcm9tKHtsZW5ndGg6dCsxfSwoKG4scik9PnV0KGUsci90KSkpfSxpLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gdChyKS5kb21haW4oZSl9LHBnLmFwcGx5KGksYXJndW1lbnRzKX0sdC5zY2FsZVNlcXVlbnRpYWxTcXJ0PWZ1bmN0aW9uKCl7cmV0dXJuIExfLmFwcGx5KG51bGwsYXJndW1lbnRzKS5leHBvbmVudCguNSl9LHQuc2NhbGVTZXF1ZW50aWFsU3ltbG9nPWZ1bmN0aW9uIHQoKXt2YXIgbj1PZyhCXygpKTtyZXR1cm4gbi5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIFlfKG4sdCgpKS5jb25zdGFudChuLmNvbnN0YW50KCkpfSxwZy5hcHBseShuLGFyZ3VtZW50cyl9LHQuc2NhbGVTcXJ0PWZ1bmN0aW9uKCl7cmV0dXJuIEhnLmFwcGx5KG51bGwsYXJndW1lbnRzKS5leHBvbmVudCguNSl9LHQuc2NhbGVTeW1sb2c9ZnVuY3Rpb24gdCgpe3ZhciBuPU9nKFNnKCkpO3JldHVybiBuLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gQWcobix0KCkpLmNvbnN0YW50KG4uY29uc3RhbnQoKSl9LGRnLmFwcGx5KG4sYXJndW1lbnRzKX0sdC5zY2FsZVRocmVzaG9sZD1mdW5jdGlvbiB0KCl7dmFyIG4sZT1bLjVdLHI9WzAsMV0saT0xO2Z1bmN0aW9uIG8odCl7cmV0dXJuIG51bGwhPXQmJnQ8PXQ/cltsKGUsdCwwLGkpXTpufXJldHVybiBvLmRvbWFpbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT1BcnJheS5mcm9tKHQpLGk9TWF0aC5taW4oZS5sZW5ndGgsci5sZW5ndGgtMSksbyk6ZS5zbGljZSgpfSxvLnJhbmdlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPUFycmF5LmZyb20odCksaT1NYXRoLm1pbihlLmxlbmd0aCxyLmxlbmd0aC0xKSxvKTpyLnNsaWNlKCl9LG8uaW52ZXJ0RXh0ZW50PWZ1bmN0aW9uKHQpe3ZhciBuPXIuaW5kZXhPZih0KTtyZXR1cm5bZVtuLTFdLGVbbl1dfSxvLnVua25vd249ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49dCxvKTpufSxvLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gdCgpLmRvbWFpbihlKS5yYW5nZShyKS51bmtub3duKG4pfSxkZy5hcHBseShvLGFyZ3VtZW50cyl9LHQuc2NhbGVUaW1lPWZ1bmN0aW9uKCl7cmV0dXJuIGRnLmFwcGx5KE9fKGN2LGZ2LG52LEt5LHd5LGd5LGx5LHV5LG95LHQudGltZUZvcm1hdCkuZG9tYWluKFtuZXcgRGF0ZSgyZTMsMCwxKSxuZXcgRGF0ZSgyZTMsMCwyKV0pLGFyZ3VtZW50cyl9LHQuc2NhbGVVdGM9ZnVuY3Rpb24oKXtyZXR1cm4gZGcuYXBwbHkoT18oYXYsdXYscnYsSnkscXksdnksZHksZnksb3ksdC51dGNGb3JtYXQpLmRvbWFpbihbRGF0ZS5VVEMoMmUzLDAsMSksRGF0ZS5VVEMoMmUzLDAsMildKSxhcmd1bWVudHMpfSx0LnNjYW49ZnVuY3Rpb24odCxuKXtjb25zdCBlPWR0KHQsbik7cmV0dXJuIGU8MD92b2lkIDA6ZX0sdC5zY2hlbWVBY2NlbnQ9Vl8sdC5zY2hlbWVCbHVlcz1YYix0LnNjaGVtZUJyQkc9aWIsdC5zY2hlbWVCdUduPXdiLHQuc2NoZW1lQnVQdT1UYix0LnNjaGVtZUNhdGVnb3J5MTA9R18sdC5zY2hlbWVEYXJrMj1XXyx0LnNjaGVtZUduQnU9U2IsdC5zY2hlbWVHcmVlbnM9VmIsdC5zY2hlbWVHcmV5cz1aYix0LnNjaGVtZU9yUmQ9TmIsdC5zY2hlbWVPcmFuZ2VzPWVtLHQuc2NoZW1lUFJHbj1hYix0LnNjaGVtZVBhaXJlZD1aXyx0LnNjaGVtZVBhc3RlbDE9S18sdC5zY2hlbWVQYXN0ZWwyPVFfLHQuc2NoZW1lUGlZRz1jYix0LnNjaGVtZVB1QnU9emIsdC5zY2hlbWVQdUJ1R249Q2IsdC5zY2hlbWVQdU9yPXNiLHQuc2NoZW1lUHVSZD1EYix0LnNjaGVtZVB1cnBsZXM9UWIsdC5zY2hlbWVSZEJ1PWhiLHQuc2NoZW1lUmRHeT1wYix0LnNjaGVtZVJkUHU9RmIsdC5zY2hlbWVSZFlsQnU9eWIsdC5zY2hlbWVSZFlsR249X2IsdC5zY2hlbWVSZWRzPXRtLHQuc2NoZW1lU2V0MT1KXyx0LnNjaGVtZVNldDI9dGIsdC5zY2hlbWVTZXQzPW5iLHQuc2NoZW1lU3BlY3RyYWw9bWIsdC5zY2hlbWVUYWJsZWF1MTA9ZWIsdC5zY2hlbWVZbEduPU9iLHQuc2NoZW1lWWxHbkJ1PVViLHQuc2NoZW1lWWxPckJyPVliLHQuc2NoZW1lWWxPclJkPWpiLHQuc2VsZWN0PUtuLHQuc2VsZWN0QWxsPWZ1bmN0aW9uKHQpe3JldHVybiJzdHJpbmciPT10eXBlb2YgdD9uZXcgV24oW2RvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwodCldLFtkb2N1bWVudC5kb2N1bWVudEVsZW1lbnRdKTpuZXcgV24oW1h0KHQpXSxWbil9LHQuc2VsZWN0aW9uPVpuLHQuc2VsZWN0b3I9SHQsdC5zZWxlY3RvckFsbD1WdCx0LnNodWZmbGU9cHQsdC5zaHVmZmxlcj1ndCx0LnNvbWU9ZnVuY3Rpb24odCxuKXtpZigiZnVuY3Rpb24iIT10eXBlb2Ygbil0aHJvdyBuZXcgVHlwZUVycm9yKCJ0ZXN0IGlzIG5vdCBhIGZ1bmN0aW9uIik7bGV0IGU9LTE7Zm9yKGNvbnN0IHIgb2YgdClpZihuKHIsKytlLHQpKXJldHVybiEwO3JldHVybiExfSx0LnNvcnQ9SSx0LnN0YWNrPWZ1bmN0aW9uKCl7dmFyIHQ9eW0oW10pLG49ZHcsZT1odyxyPXB3O2Z1bmN0aW9uIGkoaSl7dmFyIG8sYSx1PUFycmF5LmZyb20odC5hcHBseSh0aGlzLGFyZ3VtZW50cyksZ3cpLGM9dS5sZW5ndGgsZj0tMTtmb3IoY29uc3QgdCBvZiBpKWZvcihvPTAsKytmO288YzsrK28pKHVbb11bZl09WzAsK3IodCx1W29dLmtleSxmLGkpXSkuZGF0YT10O2ZvcihvPTAsYT1xbShuKHUpKTtvPGM7KytvKXVbYVtvXV0uaW5kZXg9bztyZXR1cm4gZSh1LGEpLHV9cmV0dXJuIGkua2V5cz1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOnltKEFycmF5LmZyb20obikpLGkpOnR9LGkudmFsdWU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDp5bSgrdCksaSk6cn0saS5vcmRlcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj1udWxsPT10P2R3OiJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6eW0oQXJyYXkuZnJvbSh0KSksaSk6bn0saS5vZmZzZXQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9bnVsbD09dD9odzp0LGkpOmV9LGl9LHQuc3RhY2tPZmZzZXREaXZlcmdpbmc9ZnVuY3Rpb24odCxuKXtpZigodT10Lmxlbmd0aCk+MClmb3IodmFyIGUscixpLG8sYSx1LGM9MCxmPXRbblswXV0ubGVuZ3RoO2M8ZjsrK2MpZm9yKG89YT0wLGU9MDtlPHU7KytlKShpPShyPXRbbltlXV1bY10pWzFdLXJbMF0pPjA/KHJbMF09byxyWzFdPW8rPWkpOmk8MD8oclsxXT1hLHJbMF09YSs9aSk6KHJbMF09MCxyWzFdPWkpfSx0LnN0YWNrT2Zmc2V0RXhwYW5kPWZ1bmN0aW9uKHQsbil7aWYoKHI9dC5sZW5ndGgpPjApe2Zvcih2YXIgZSxyLGksbz0wLGE9dFswXS5sZW5ndGg7bzxhOysrbyl7Zm9yKGk9ZT0wO2U8cjsrK2UpaSs9dFtlXVtvXVsxXXx8MDtpZihpKWZvcihlPTA7ZTxyOysrZSl0W2VdW29dWzFdLz1pfWh3KHQsbil9fSx0LnN0YWNrT2Zmc2V0Tm9uZT1odyx0LnN0YWNrT2Zmc2V0U2lsaG91ZXR0ZT1mdW5jdGlvbih0LG4pe2lmKChlPXQubGVuZ3RoKT4wKXtmb3IodmFyIGUscj0wLGk9dFtuWzBdXSxvPWkubGVuZ3RoO3I8bzsrK3Ipe2Zvcih2YXIgYT0wLHU9MDthPGU7KythKXUrPXRbYV1bcl1bMV18fDA7aVtyXVsxXSs9aVtyXVswXT0tdS8yfWh3KHQsbil9fSx0LnN0YWNrT2Zmc2V0V2lnZ2xlPWZ1bmN0aW9uKHQsbil7aWYoKGk9dC5sZW5ndGgpPjAmJihyPShlPXRbblswXV0pLmxlbmd0aCk+MCl7Zm9yKHZhciBlLHIsaSxvPTAsYT0xO2E8cjsrK2Epe2Zvcih2YXIgdT0wLGM9MCxmPTA7dTxpOysrdSl7Zm9yKHZhciBzPXRbblt1XV0sbD1zW2FdWzFdfHwwLGg9KGwtKHNbYS0xXVsxXXx8MCkpLzIsZD0wO2Q8dTsrK2Qpe3ZhciBwPXRbbltkXV07aCs9KHBbYV1bMV18fDApLShwW2EtMV1bMV18fDApfWMrPWwsZis9aCpsfWVbYS0xXVsxXSs9ZVthLTFdWzBdPW8sYyYmKG8tPWYvYyl9ZVthLTFdWzFdKz1lW2EtMV1bMF09byxodyh0LG4pfX0sdC5zdGFja09yZGVyQXBwZWFyYW5jZT15dyx0LnN0YWNrT3JkZXJBc2NlbmRpbmc9X3csdC5zdGFja09yZGVyRGVzY2VuZGluZz1mdW5jdGlvbih0KXtyZXR1cm4gX3codCkucmV2ZXJzZSgpfSx0LnN0YWNrT3JkZXJJbnNpZGVPdXQ9ZnVuY3Rpb24odCl7dmFyIG4sZSxyPXQubGVuZ3RoLGk9dC5tYXAoYncpLG89eXcodCksYT0wLHU9MCxjPVtdLGY9W107Zm9yKG49MDtuPHI7KytuKWU9b1tuXSxhPHU/KGErPWlbZV0sYy5wdXNoKGUpKToodSs9aVtlXSxmLnB1c2goZSkpO3JldHVybiBmLnJldmVyc2UoKS5jb25jYXQoYyl9LHQuc3RhY2tPcmRlck5vbmU9ZHcsdC5zdGFja09yZGVyUmV2ZXJzZT1mdW5jdGlvbih0KXtyZXR1cm4gZHcodCkucmV2ZXJzZSgpfSx0LnN0cmF0aWZ5PWZ1bmN0aW9uKCl7dmFyIHQsbj1DcCxlPVBwO2Z1bmN0aW9uIHIocil7dmFyIGksbyxhLHUsYyxmLHMsbCxoPUFycmF5LmZyb20ociksZD1uLHA9ZSxnPW5ldyBNYXA7aWYobnVsbCE9dCl7Y29uc3Qgbj1oLm1hcCgoKG4sZSk9PmZ1bmN0aW9uKHQpe3Q9YCR7dH1gO2xldCBuPXQubGVuZ3RoOyRwKHQsbi0xKSYmISRwKHQsbi0yKSYmKHQ9dC5zbGljZSgwLC0xKSk7cmV0dXJuIi8iPT09dFswXT90OmAvJHt0fWB9KHQobixlLHIpKSkpLGU9bi5tYXAoenApLGk9bmV3IFNldChuKS5hZGQoIiIpO2Zvcihjb25zdCB0IG9mIGUpaS5oYXModCl8fChpLmFkZCh0KSxuLnB1c2godCksZS5wdXNoKHpwKHQpKSxoLnB1c2goa3ApKTtkPSh0LGUpPT5uW2VdLHA9KHQsbik9PmVbbl19Zm9yKGE9MCxpPWgubGVuZ3RoO2E8aTsrK2Epbz1oW2FdLGY9aFthXT1uZXcgSmQobyksbnVsbCE9KHM9ZChvLGEscikpJiYocys9IiIpJiYobD1mLmlkPXMsZy5zZXQobCxnLmhhcyhsKT9OcDpmKSksbnVsbCE9KHM9cChvLGEscikpJiYocys9IiIpJiYoZi5wYXJlbnQ9cyk7Zm9yKGE9MDthPGk7KythKWlmKHM9KGY9aFthXSkucGFyZW50KXtpZighKGM9Zy5nZXQocykpKXRocm93IG5ldyBFcnJvcigibWlzc2luZzogIitzKTtpZihjPT09TnApdGhyb3cgbmV3IEVycm9yKCJhbWJpZ3VvdXM6ICIrcyk7Yy5jaGlsZHJlbj9jLmNoaWxkcmVuLnB1c2goZik6Yy5jaGlsZHJlbj1bZl0sZi5wYXJlbnQ9Y31lbHNle2lmKHUpdGhyb3cgbmV3IEVycm9yKCJtdWx0aXBsZSByb290cyIpO3U9Zn1pZighdSl0aHJvdyBuZXcgRXJyb3IoIm5vIHJvb3QiKTtpZihudWxsIT10KXtmb3IoO3UuZGF0YT09PWtwJiYxPT09dS5jaGlsZHJlbi5sZW5ndGg7KXU9dS5jaGlsZHJlblswXSwtLWk7Zm9yKGxldCB0PWgubGVuZ3RoLTE7dD49MCYmKGY9aFt0XSkuZGF0YT09PWtwOy0tdClmLmRhdGE9bnVsbH1pZih1LnBhcmVudD1FcCx1LmVhY2hCZWZvcmUoKGZ1bmN0aW9uKHQpe3QuZGVwdGg9dC5wYXJlbnQuZGVwdGgrMSwtLWl9KSkuZWFjaEJlZm9yZShRZCksdS5wYXJlbnQ9bnVsbCxpPjApdGhyb3cgbmV3IEVycm9yKCJjeWNsZSIpO3JldHVybiB1fXJldHVybiByLmlkPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPXRwKHQpLHIpOm59LHIucGFyZW50SWQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9dHAodCkscik6ZX0sci5wYXRoPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PXRwKG4pLHIpOnR9LHJ9LHQuc3R5bGU9Ym4sdC5zdWJzZXQ9ZnVuY3Rpb24odCxuKXtyZXR1cm4gYnQobix0KX0sdC5zdW09ZnVuY3Rpb24odCxuKXtsZXQgZT0wO2lmKHZvaWQgMD09PW4pZm9yKGxldCBuIG9mIHQpKG49K24pJiYoZSs9bik7ZWxzZXtsZXQgcj0tMTtmb3IobGV0IGkgb2YgdCkoaT0rbihpLCsrcix0KSkmJihlKz1pKX1yZXR1cm4gZX0sdC5zdXBlcnNldD1idCx0LnN2Zz1rYyx0LnN5bWJvbD1mdW5jdGlvbih0LG4pe2xldCBlPW51bGwscj1rbShpKTtmdW5jdGlvbiBpKCl7bGV0IGk7aWYoZXx8KGU9aT1yKCkpLHQuYXBwbHkodGhpcyxhcmd1bWVudHMpLmRyYXcoZSwrbi5hcHBseSh0aGlzLGFyZ3VtZW50cykpLGkpcmV0dXJuIGU9bnVsbCxpKyIifHxudWxsfXJldHVybiB0PSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6eW0odHx8ZngpLG49ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjp5bSh2b2lkIDA9PT1uPzY0OituKSxpLnR5cGU9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjp5bShuKSxpKTp0fSxpLnNpemU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDp5bSgrdCksaSk6bn0saS5jb250ZXh0PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPW51bGw9PXQ/bnVsbDp0LGkpOmV9LGl9LHQuc3ltYm9sQXN0ZXJpc2s9Y3gsdC5zeW1ib2xDaXJjbGU9ZngsdC5zeW1ib2xDcm9zcz1zeCx0LnN5bWJvbERpYW1vbmQ9ZHgsdC5zeW1ib2xEaWFtb25kMj1weCx0LnN5bWJvbFBsdXM9Z3gsdC5zeW1ib2xTcXVhcmU9eXgsdC5zeW1ib2xTcXVhcmUyPXZ4LHQuc3ltYm9sU3Rhcj14eCx0LnN5bWJvbFRpbWVzPVB4LHQuc3ltYm9sVHJpYW5nbGU9TXgsdC5zeW1ib2xUcmlhbmdsZTI9QXgsdC5zeW1ib2xXeWU9Q3gsdC5zeW1ib2xYPVB4LHQuc3ltYm9scz16eCx0LnN5bWJvbHNGaWxsPXp4LHQuc3ltYm9sc1N0cm9rZT0keCx0LnRleHQ9eGMsdC50aHJlc2hvbGRGcmVlZG1hbkRpYWNvbmlzPWZ1bmN0aW9uKHQsbixlKXtjb25zdCByPV8odCksaT11dCh0LC43NSktdXQodCwuMjUpO3JldHVybiByJiZpP01hdGguY2VpbCgoZS1uKS8oMippKk1hdGgucG93KHIsLTEvMykpKToxfSx0LnRocmVzaG9sZFNjb3R0PWZ1bmN0aW9uKHQsbixlKXtjb25zdCByPV8odCksaT1NKHQpO3JldHVybiByJiZpP01hdGguY2VpbCgoZS1uKSpNYXRoLmNicnQocikvKDMuNDkqaSkpOjF9LHQudGhyZXNob2xkU3R1cmdlcz1RLHQudGlja0Zvcm1hdD1OZyx0LnRpY2tJbmNyZW1lbnQ9Vyx0LnRpY2tTdGVwPVosdC50aWNrcz1WLHQudGltZURheT1neSx0LnRpbWVEYXlzPXl5LHQudGltZUZvcm1hdERlZmF1bHRMb2NhbGU9el8sdC50aW1lRm9ybWF0TG9jYWxlPWR2LHQudGltZUZyaWRheT1FeSx0LnRpbWVGcmlkYXlzPUR5LHQudGltZUhvdXI9bHksdC50aW1lSG91cnM9aHksdC50aW1lSW50ZXJ2YWw9V2csdC50aW1lTWlsbGlzZWNvbmQ9WmcsdC50aW1lTWlsbGlzZWNvbmRzPUtnLHQudGltZU1pbnV0ZT11eSx0LnRpbWVNaW51dGVzPWN5LHQudGltZU1vbmRheT1NeSx0LnRpbWVNb25kYXlzPUN5LHQudGltZU1vbnRoPUt5LHQudGltZU1vbnRocz1ReSx0LnRpbWVTYXR1cmRheT1OeSx0LnRpbWVTYXR1cmRheXM9UnksdC50aW1lU2Vjb25kPW95LHQudGltZVNlY29uZHM9YXksdC50aW1lU3VuZGF5PXd5LHQudGltZVN1bmRheXM9a3ksdC50aW1lVGh1cnNkYXk9U3ksdC50aW1lVGh1cnNkYXlzPSR5LHQudGltZVRpY2tJbnRlcnZhbD1mdix0LnRpbWVUaWNrcz1jdix0LnRpbWVUdWVzZGF5PVR5LHQudGltZVR1ZXNkYXlzPVB5LHQudGltZVdlZG5lc2RheT1BeSx0LnRpbWVXZWRuZXNkYXlzPXp5LHQudGltZVdlZWs9d3ksdC50aW1lV2Vla3M9a3ksdC50aW1lWWVhcj1udix0LnRpbWVZZWFycz1ldix0LnRpbWVvdXQ9RGksdC50aW1lcj1raSx0LnRpbWVyRmx1c2g9Q2ksdC50cmFuc2l0aW9uPXlvLHQudHJhbnNwb3NlPXl0LHQudHJlZT1mdW5jdGlvbigpe3ZhciB0PURwLG49MSxlPTEscj1udWxsO2Z1bmN0aW9uIGkoaSl7dmFyIGM9ZnVuY3Rpb24odCl7Zm9yKHZhciBuLGUscixpLG8sYT1uZXcgSXAodCwwKSx1PVthXTtuPXUucG9wKCk7KWlmKHI9bi5fLmNoaWxkcmVuKWZvcihuLmNoaWxkcmVuPW5ldyBBcnJheShvPXIubGVuZ3RoKSxpPW8tMTtpPj0wOy0taSl1LnB1c2goZT1uLmNoaWxkcmVuW2ldPW5ldyBJcChyW2ldLGkpKSxlLnBhcmVudD1uO3JldHVybihhLnBhcmVudD1uZXcgSXAobnVsbCwwKSkuY2hpbGRyZW49W2FdLGF9KGkpO2lmKGMuZWFjaEFmdGVyKG8pLGMucGFyZW50Lm09LWMueixjLmVhY2hCZWZvcmUoYSkscilpLmVhY2hCZWZvcmUodSk7ZWxzZXt2YXIgZj1pLHM9aSxsPWk7aS5lYWNoQmVmb3JlKChmdW5jdGlvbih0KXt0Lng8Zi54JiYoZj10KSx0Lng+cy54JiYocz10KSx0LmRlcHRoPmwuZGVwdGgmJihsPXQpfSkpO3ZhciBoPWY9PT1zPzE6dChmLHMpLzIsZD1oLWYueCxwPW4vKHMueCtoK2QpLGc9ZS8obC5kZXB0aHx8MSk7aS5lYWNoQmVmb3JlKChmdW5jdGlvbih0KXt0Lng9KHQueCtkKSpwLHQueT10LmRlcHRoKmd9KSl9cmV0dXJuIGl9ZnVuY3Rpb24gbyhuKXt2YXIgZT1uLmNoaWxkcmVuLHI9bi5wYXJlbnQuY2hpbGRyZW4saT1uLmk/cltuLmktMV06bnVsbDtpZihlKXshZnVuY3Rpb24odCl7Zm9yKHZhciBuLGU9MCxyPTAsaT10LmNoaWxkcmVuLG89aS5sZW5ndGg7LS1vPj0wOykobj1pW29dKS56Kz1lLG4ubSs9ZSxlKz1uLnMrKHIrPW4uYyl9KG4pO3ZhciBvPShlWzBdLnorZVtlLmxlbmd0aC0xXS56KS8yO2k/KG4uej1pLnordChuLl8saS5fKSxuLm09bi56LW8pOm4uej1vfWVsc2UgaSYmKG4uej1pLnordChuLl8saS5fKSk7bi5wYXJlbnQuQT1mdW5jdGlvbihuLGUscil7aWYoZSl7Zm9yKHZhciBpLG89bixhPW4sdT1lLGM9by5wYXJlbnQuY2hpbGRyZW5bMF0sZj1vLm0scz1hLm0sbD11Lm0saD1jLm07dT1GcCh1KSxvPVJwKG8pLHUmJm87KWM9UnAoYyksKGE9RnAoYSkpLmE9biwoaT11LnorbC1vLnotZit0KHUuXyxvLl8pKT4wJiYocXAoVXAodSxuLHIpLG4saSksZis9aSxzKz1pKSxsKz11Lm0sZis9by5tLGgrPWMubSxzKz1hLm07dSYmIUZwKGEpJiYoYS50PXUsYS5tKz1sLXMpLG8mJiFScChjKSYmKGMudD1vLGMubSs9Zi1oLHI9bil9cmV0dXJuIHJ9KG4saSxuLnBhcmVudC5BfHxyWzBdKX1mdW5jdGlvbiBhKHQpe3QuXy54PXQueit0LnBhcmVudC5tLHQubSs9dC5wYXJlbnQubX1mdW5jdGlvbiB1KHQpe3QueCo9bix0Lnk9dC5kZXB0aCplfXJldHVybiBpLnNlcGFyYXRpb249ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9bixpKTp0fSxpLnNpemU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9ITEsbj0rdFswXSxlPSt0WzFdLGkpOnI/bnVsbDpbbixlXX0saS5ub2RlU2l6ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj0hMCxuPSt0WzBdLGU9K3RbMV0saSk6cj9bbixlXTpudWxsfSxpfSx0LnRyZWVtYXA9ZnVuY3Rpb24oKXt2YXIgdD1McCxuPSExLGU9MSxyPTEsaT1bMF0sbz1lcCxhPWVwLHU9ZXAsYz1lcCxmPWVwO2Z1bmN0aW9uIHModCl7cmV0dXJuIHQueDA9dC55MD0wLHQueDE9ZSx0LnkxPXIsdC5lYWNoQmVmb3JlKGwpLGk9WzBdLG4mJnQuZWFjaEJlZm9yZShBcCksdH1mdW5jdGlvbiBsKG4pe3ZhciBlPWlbbi5kZXB0aF0scj1uLngwK2Uscz1uLnkwK2UsbD1uLngxLWUsaD1uLnkxLWU7bDxyJiYocj1sPShyK2wpLzIpLGg8cyYmKHM9aD0ocytoKS8yKSxuLngwPXIsbi55MD1zLG4ueDE9bCxuLnkxPWgsbi5jaGlsZHJlbiYmKGU9aVtuLmRlcHRoKzFdPW8obikvMixyKz1mKG4pLWUscys9YShuKS1lLChsLT11KG4pLWUpPHImJihyPWw9KHIrbCkvMiksKGgtPWMobiktZSk8cyYmKHM9aD0ocytoKS8yKSx0KG4scixzLGwsaCkpfXJldHVybiBzLnJvdW5kPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPSEhdCxzKTpufSxzLnNpemU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9K3RbMF0scj0rdFsxXSxzKTpbZSxyXX0scy50aWxlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PW5wKG4pLHMpOnR9LHMucGFkZGluZz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD9zLnBhZGRpbmdJbm5lcih0KS5wYWRkaW5nT3V0ZXIodCk6cy5wYWRkaW5nSW5uZXIoKX0scy5wYWRkaW5nSW5uZXI9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpycCgrdCkscyk6b30scy5wYWRkaW5nT3V0ZXI9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/cy5wYWRkaW5nVG9wKHQpLnBhZGRpbmdSaWdodCh0KS5wYWRkaW5nQm90dG9tKHQpLnBhZGRpbmdMZWZ0KHQpOnMucGFkZGluZ1RvcCgpfSxzLnBhZGRpbmdUb3A9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpycCgrdCkscyk6YX0scy5wYWRkaW5nUmlnaHQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpycCgrdCkscyk6dX0scy5wYWRkaW5nQm90dG9tPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhjPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6cnAoK3QpLHMpOmN9LHMucGFkZGluZ0xlZnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGY9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpycCgrdCkscyk6Zn0sc30sdC50cmVlbWFwQmluYXJ5PWZ1bmN0aW9uKHQsbixlLHIsaSl7dmFyIG8sYSx1PXQuY2hpbGRyZW4sYz11Lmxlbmd0aCxmPW5ldyBBcnJheShjKzEpO2ZvcihmWzBdPWE9bz0wO288YzsrK28pZltvKzFdPWErPXVbb10udmFsdWU7IWZ1bmN0aW9uIHQobixlLHIsaSxvLGEsYyl7aWYobj49ZS0xKXt2YXIgcz11W25dO3JldHVybiBzLngwPWkscy55MD1vLHMueDE9YSx2b2lkKHMueTE9Yyl9dmFyIGw9ZltuXSxoPXIvMitsLGQ9bisxLHA9ZS0xO2Zvcig7ZDxwOyl7dmFyIGc9ZCtwPj4+MTtmW2ddPGg/ZD1nKzE6cD1nfWgtZltkLTFdPGZbZF0taCYmbisxPGQmJi0tZDt2YXIgeT1mW2RdLWwsdj1yLXk7aWYoYS1pPmMtbyl7dmFyIF89cj8oaSp2K2EqeSkvcjphO3QobixkLHksaSxvLF8sYyksdChkLGUsdixfLG8sYSxjKX1lbHNle3ZhciBiPXI/KG8qditjKnkpL3I6Yzt0KG4sZCx5LGksbyxhLGIpLHQoZCxlLHYsaSxiLGEsYyl9fSgwLGMsdC52YWx1ZSxuLGUscixpKX0sdC50cmVlbWFwRGljZT1TcCx0LnRyZWVtYXBSZXNxdWFyaWZ5PWpwLHQudHJlZW1hcFNsaWNlPU9wLHQudHJlZW1hcFNsaWNlRGljZT1mdW5jdGlvbih0LG4sZSxyLGkpeygxJnQuZGVwdGg/T3A6U3ApKHQsbixlLHIsaSl9LHQudHJlZW1hcFNxdWFyaWZ5PUxwLHQudHN2PVRjLHQudHN2Rm9ybWF0PWhjLHQudHN2Rm9ybWF0Qm9keT1kYyx0LnRzdkZvcm1hdFJvdz1nYyx0LnRzdkZvcm1hdFJvd3M9cGMsdC50c3ZGb3JtYXRWYWx1ZT15Yyx0LnRzdlBhcnNlPXNjLHQudHN2UGFyc2VSb3dzPWxjLHQudW5pb249ZnVuY3Rpb24oLi4udCl7Y29uc3Qgbj1uZXcgSW50ZXJuU2V0O2Zvcihjb25zdCBlIG9mIHQpZm9yKGNvbnN0IHQgb2YgZSluLmFkZCh0KTtyZXR1cm4gbn0sdC51bml4RGF5PWJ5LHQudW5peERheXM9bXksdC51dGNEYXk9dnksdC51dGNEYXlzPV95LHQudXRjRnJpZGF5PVl5LHQudXRjRnJpZGF5cz1XeSx0LnV0Y0hvdXI9ZHksdC51dGNIb3Vycz1weSx0LnV0Y01pbGxpc2Vjb25kPVpnLHQudXRjTWlsbGlzZWNvbmRzPUtnLHQudXRjTWludXRlPWZ5LHQudXRjTWludXRlcz1zeSx0LnV0Y01vbmRheT1VeSx0LnV0Y01vbmRheXM9SHksdC51dGNNb250aD1KeSx0LnV0Y01vbnRocz10dix0LnV0Y1NhdHVyZGF5PUx5LHQudXRjU2F0dXJkYXlzPVp5LHQudXRjU2Vjb25kPW95LHQudXRjU2Vjb25kcz1heSx0LnV0Y1N1bmRheT1xeSx0LnV0Y1N1bmRheXM9anksdC51dGNUaHVyc2RheT1CeSx0LnV0Y1RodXJzZGF5cz1WeSx0LnV0Y1RpY2tJbnRlcnZhbD11dix0LnV0Y1RpY2tzPWF2LHQudXRjVHVlc2RheT1JeSx0LnV0Y1R1ZXNkYXlzPVh5LHQudXRjV2VkbmVzZGF5PU95LHQudXRjV2VkbmVzZGF5cz1HeSx0LnV0Y1dlZWs9cXksdC51dGNXZWVrcz1qeSx0LnV0Y1llYXI9cnYsdC51dGNZZWFycz1pdix0LnZhcmlhbmNlPXcsdC52ZXJzaW9uPSI3LjguNCIsdC53aW5kb3c9Z24sdC54bWw9RWMsdC56aXA9ZnVuY3Rpb24oKXtyZXR1cm4geXQoYXJndW1lbnRzKX0sdC56b29tPWZ1bmN0aW9uKCl7dmFyIHQsbixlLHI9RXcsaT1OdyxvPXp3LGE9Q3csdT1QdyxjPVswLDEvMF0sZj1bWy0xLzAsLTEvMF0sWzEvMCwxLzBdXSxzPTI1MCxsPWlpLGg9RHQoInN0YXJ0Iiwiem9vbSIsImVuZCIpLGQ9NTAwLHA9MTUwLGc9MCx5PTEwO2Z1bmN0aW9uIHYodCl7dC5wcm9wZXJ0eSgiX196b29tIixrdykub24oIndoZWVsLnpvb20iLFQse3Bhc3NpdmU6ITF9KS5vbigibW91c2Vkb3duLnpvb20iLEEpLm9uKCJkYmxjbGljay56b29tIixTKS5maWx0ZXIodSkub24oInRvdWNoc3RhcnQuem9vbSIsRSkub24oInRvdWNobW92ZS56b29tIixOKS5vbigidG91Y2hlbmQuem9vbSB0b3VjaGNhbmNlbC56b29tIixrKS5zdHlsZSgiLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yIiwicmdiYSgwLDAsMCwwKSIpfWZ1bmN0aW9uIF8odCxuKXtyZXR1cm4obj1NYXRoLm1heChjWzBdLE1hdGgubWluKGNbMV0sbikpKT09PXQuaz90Om5ldyB3dyhuLHQueCx0LnkpfWZ1bmN0aW9uIGIodCxuLGUpe3ZhciByPW5bMF0tZVswXSp0LmssaT1uWzFdLWVbMV0qdC5rO3JldHVybiByPT09dC54JiZpPT09dC55P3Q6bmV3IHd3KHQuayxyLGkpfWZ1bmN0aW9uIG0odCl7cmV0dXJuWygrdFswXVswXSsgK3RbMV1bMF0pLzIsKCt0WzBdWzFdKyArdFsxXVsxXSkvMl19ZnVuY3Rpb24geCh0LG4sZSxyKXt0Lm9uKCJzdGFydC56b29tIiwoZnVuY3Rpb24oKXt3KHRoaXMsYXJndW1lbnRzKS5ldmVudChyKS5zdGFydCgpfSkpLm9uKCJpbnRlcnJ1cHQuem9vbSBlbmQuem9vbSIsKGZ1bmN0aW9uKCl7dyh0aGlzLGFyZ3VtZW50cykuZXZlbnQocikuZW5kKCl9KSkudHdlZW4oInpvb20iLChmdW5jdGlvbigpe3ZhciB0PXRoaXMsbz1hcmd1bWVudHMsYT13KHQsbykuZXZlbnQociksdT1pLmFwcGx5KHQsbyksYz1udWxsPT1lP20odSk6ImZ1bmN0aW9uIj09dHlwZW9mIGU/ZS5hcHBseSh0LG8pOmUsZj1NYXRoLm1heCh1WzFdWzBdLXVbMF1bMF0sdVsxXVsxXS11WzBdWzFdKSxzPXQuX196b29tLGg9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bi5hcHBseSh0LG8pOm4sZD1sKHMuaW52ZXJ0KGMpLmNvbmNhdChmL3MuayksaC5pbnZlcnQoYykuY29uY2F0KGYvaC5rKSk7cmV0dXJuIGZ1bmN0aW9uKHQpe2lmKDE9PT10KXQ9aDtlbHNle3ZhciBuPWQodCksZT1mL25bMl07dD1uZXcgd3coZSxjWzBdLW5bMF0qZSxjWzFdLW5bMV0qZSl9YS56b29tKG51bGwsdCl9fSkpfWZ1bmN0aW9uIHcodCxuLGUpe3JldHVybiFlJiZ0Ll9fem9vbWluZ3x8bmV3IE0odCxuKX1mdW5jdGlvbiBNKHQsbil7dGhpcy50aGF0PXQsdGhpcy5hcmdzPW4sdGhpcy5hY3RpdmU9MCx0aGlzLnNvdXJjZUV2ZW50PW51bGwsdGhpcy5leHRlbnQ9aS5hcHBseSh0LG4pLHRoaXMudGFwcz0wfWZ1bmN0aW9uIFQodCwuLi5uKXtpZihyLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl7dmFyIGU9dyh0aGlzLG4pLmV2ZW50KHQpLGk9dGhpcy5fX3pvb20sdT1NYXRoLm1heChjWzBdLE1hdGgubWluKGNbMV0saS5rKk1hdGgucG93KDIsYS5hcHBseSh0aGlzLGFyZ3VtZW50cykpKSkscz1lZSh0KTtpZihlLndoZWVsKWUubW91c2VbMF1bMF09PT1zWzBdJiZlLm1vdXNlWzBdWzFdPT09c1sxXXx8KGUubW91c2VbMV09aS5pbnZlcnQoZS5tb3VzZVswXT1zKSksY2xlYXJUaW1lb3V0KGUud2hlZWwpO2Vsc2V7aWYoaS5rPT09dSlyZXR1cm47ZS5tb3VzZT1bcyxpLmludmVydChzKV0sVmkodGhpcyksZS5zdGFydCgpfVN3KHQpLGUud2hlZWw9c2V0VGltZW91dCgoZnVuY3Rpb24oKXtlLndoZWVsPW51bGwsZS5lbmQoKX0pLHApLGUuem9vbSgibW91c2UiLG8oYihfKGksdSksZS5tb3VzZVswXSxlLm1vdXNlWzFdKSxlLmV4dGVudCxmKSl9fWZ1bmN0aW9uIEEodCwuLi5uKXtpZighZSYmci5hcHBseSh0aGlzLGFyZ3VtZW50cykpe3ZhciBpPXQuY3VycmVudFRhcmdldCxhPXcodGhpcyxuLCEwKS5ldmVudCh0KSx1PUtuKHQudmlldykub24oIm1vdXNlbW92ZS56b29tIiwoZnVuY3Rpb24odCl7aWYoU3codCksIWEubW92ZWQpe3ZhciBuPXQuY2xpZW50WC1zLGU9dC5jbGllbnRZLWw7YS5tb3ZlZD1uKm4rZSplPmd9YS5ldmVudCh0KS56b29tKCJtb3VzZSIsbyhiKGEudGhhdC5fX3pvb20sYS5tb3VzZVswXT1lZSh0LGkpLGEubW91c2VbMV0pLGEuZXh0ZW50LGYpKX0pLCEwKS5vbigibW91c2V1cC56b29tIiwoZnVuY3Rpb24odCl7dS5vbigibW91c2Vtb3ZlLnpvb20gbW91c2V1cC56b29tIixudWxsKSxjZSh0LnZpZXcsYS5tb3ZlZCksU3codCksYS5ldmVudCh0KS5lbmQoKX0pLCEwKSxjPWVlKHQsaSkscz10LmNsaWVudFgsbD10LmNsaWVudFk7dWUodC52aWV3KSxBdyh0KSxhLm1vdXNlPVtjLHRoaXMuX196b29tLmludmVydChjKV0sVmkodGhpcyksYS5zdGFydCgpfX1mdW5jdGlvbiBTKHQsLi4ubil7aWYoci5hcHBseSh0aGlzLGFyZ3VtZW50cykpe3ZhciBlPXRoaXMuX196b29tLGE9ZWUodC5jaGFuZ2VkVG91Y2hlcz90LmNoYW5nZWRUb3VjaGVzWzBdOnQsdGhpcyksdT1lLmludmVydChhKSxjPWUuayoodC5zaGlmdEtleT8uNToyKSxsPW8oYihfKGUsYyksYSx1KSxpLmFwcGx5KHRoaXMsbiksZik7U3codCkscz4wP0tuKHRoaXMpLnRyYW5zaXRpb24oKS5kdXJhdGlvbihzKS5jYWxsKHgsbCxhLHQpOktuKHRoaXMpLmNhbGwodi50cmFuc2Zvcm0sbCxhLHQpfX1mdW5jdGlvbiBFKGUsLi4uaSl7aWYoci5hcHBseSh0aGlzLGFyZ3VtZW50cykpe3ZhciBvLGEsdSxjLGY9ZS50b3VjaGVzLHM9Zi5sZW5ndGgsbD13KHRoaXMsaSxlLmNoYW5nZWRUb3VjaGVzLmxlbmd0aD09PXMpLmV2ZW50KGUpO2ZvcihBdyhlKSxhPTA7YTxzOysrYSljPVtjPWVlKHU9ZlthXSx0aGlzKSx0aGlzLl9fem9vbS5pbnZlcnQoYyksdS5pZGVudGlmaWVyXSxsLnRvdWNoMD9sLnRvdWNoMXx8bC50b3VjaDBbMl09PT1jWzJdfHwobC50b3VjaDE9YyxsLnRhcHM9MCk6KGwudG91Y2gwPWMsbz0hMCxsLnRhcHM9MSshIXQpO3QmJih0PWNsZWFyVGltZW91dCh0KSksbyYmKGwudGFwczwyJiYobj1jWzBdLHQ9c2V0VGltZW91dCgoZnVuY3Rpb24oKXt0PW51bGx9KSxkKSksVmkodGhpcyksbC5zdGFydCgpKX19ZnVuY3Rpb24gTih0LC4uLm4pe2lmKHRoaXMuX196b29taW5nKXt2YXIgZSxyLGksYSx1PXcodGhpcyxuKS5ldmVudCh0KSxjPXQuY2hhbmdlZFRvdWNoZXMscz1jLmxlbmd0aDtmb3IoU3codCksZT0wO2U8czsrK2UpaT1lZShyPWNbZV0sdGhpcyksdS50b3VjaDAmJnUudG91Y2gwWzJdPT09ci5pZGVudGlmaWVyP3UudG91Y2gwWzBdPWk6dS50b3VjaDEmJnUudG91Y2gxWzJdPT09ci5pZGVudGlmaWVyJiYodS50b3VjaDFbMF09aSk7aWYocj11LnRoYXQuX196b29tLHUudG91Y2gxKXt2YXIgbD11LnRvdWNoMFswXSxoPXUudG91Y2gwWzFdLGQ9dS50b3VjaDFbMF0scD11LnRvdWNoMVsxXSxnPShnPWRbMF0tbFswXSkqZysoZz1kWzFdLWxbMV0pKmcseT0oeT1wWzBdLWhbMF0pKnkrKHk9cFsxXS1oWzFdKSp5O3I9XyhyLE1hdGguc3FydChnL3kpKSxpPVsobFswXStkWzBdKS8yLChsWzFdK2RbMV0pLzJdLGE9WyhoWzBdK3BbMF0pLzIsKGhbMV0rcFsxXSkvMl19ZWxzZXtpZighdS50b3VjaDApcmV0dXJuO2k9dS50b3VjaDBbMF0sYT11LnRvdWNoMFsxXX11Lnpvb20oInRvdWNoIixvKGIocixpLGEpLHUuZXh0ZW50LGYpKX19ZnVuY3Rpb24gayh0LC4uLnIpe2lmKHRoaXMuX196b29taW5nKXt2YXIgaSxvLGE9dyh0aGlzLHIpLmV2ZW50KHQpLHU9dC5jaGFuZ2VkVG91Y2hlcyxjPXUubGVuZ3RoO2ZvcihBdyh0KSxlJiZjbGVhclRpbWVvdXQoZSksZT1zZXRUaW1lb3V0KChmdW5jdGlvbigpe2U9bnVsbH0pLGQpLGk9MDtpPGM7KytpKW89dVtpXSxhLnRvdWNoMCYmYS50b3VjaDBbMl09PT1vLmlkZW50aWZpZXI/ZGVsZXRlIGEudG91Y2gwOmEudG91Y2gxJiZhLnRvdWNoMVsyXT09PW8uaWRlbnRpZmllciYmZGVsZXRlIGEudG91Y2gxO2lmKGEudG91Y2gxJiYhYS50b3VjaDAmJihhLnRvdWNoMD1hLnRvdWNoMSxkZWxldGUgYS50b3VjaDEpLGEudG91Y2gwKWEudG91Y2gwWzFdPXRoaXMuX196b29tLmludmVydChhLnRvdWNoMFswXSk7ZWxzZSBpZihhLmVuZCgpLDI9PT1hLnRhcHMmJihvPWVlKG8sdGhpcyksTWF0aC5oeXBvdChuWzBdLW9bMF0sblsxXS1vWzFdKTx5KSl7dmFyIGY9S24odGhpcykub24oImRibGNsaWNrLnpvb20iKTtmJiZmLmFwcGx5KHRoaXMsYXJndW1lbnRzKX19fXJldHVybiB2LnRyYW5zZm9ybT1mdW5jdGlvbih0LG4sZSxyKXt2YXIgaT10LnNlbGVjdGlvbj90LnNlbGVjdGlvbigpOnQ7aS5wcm9wZXJ0eSgiX196b29tIixrdyksdCE9PWk/eCh0LG4sZSxyKTppLmludGVycnVwdCgpLmVhY2goKGZ1bmN0aW9uKCl7dyh0aGlzLGFyZ3VtZW50cykuZXZlbnQocikuc3RhcnQoKS56b29tKG51bGwsImZ1bmN0aW9uIj09dHlwZW9mIG4/bi5hcHBseSh0aGlzLGFyZ3VtZW50cyk6bikuZW5kKCl9KSl9LHYuc2NhbGVCeT1mdW5jdGlvbih0LG4sZSxyKXt2LnNjYWxlVG8odCwoZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fX3pvb20uayooImZ1bmN0aW9uIj09dHlwZW9mIG4/bi5hcHBseSh0aGlzLGFyZ3VtZW50cyk6bil9KSxlLHIpfSx2LnNjYWxlVG89ZnVuY3Rpb24odCxuLGUscil7di50cmFuc2Zvcm0odCwoZnVuY3Rpb24oKXt2YXIgdD1pLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxyPXRoaXMuX196b29tLGE9bnVsbD09ZT9tKHQpOiJmdW5jdGlvbiI9PXR5cGVvZiBlP2UuYXBwbHkodGhpcyxhcmd1bWVudHMpOmUsdT1yLmludmVydChhKSxjPSJmdW5jdGlvbiI9PXR5cGVvZiBuP24uYXBwbHkodGhpcyxhcmd1bWVudHMpOm47cmV0dXJuIG8oYihfKHIsYyksYSx1KSx0LGYpfSksZSxyKX0sdi50cmFuc2xhdGVCeT1mdW5jdGlvbih0LG4sZSxyKXt2LnRyYW5zZm9ybSh0LChmdW5jdGlvbigpe3JldHVybiBvKHRoaXMuX196b29tLnRyYW5zbGF0ZSgiZnVuY3Rpb24iPT10eXBlb2Ygbj9uLmFwcGx5KHRoaXMsYXJndW1lbnRzKTpuLCJmdW5jdGlvbiI9PXR5cGVvZiBlP2UuYXBwbHkodGhpcyxhcmd1bWVudHMpOmUpLGkuYXBwbHkodGhpcyxhcmd1bWVudHMpLGYpfSksbnVsbCxyKX0sdi50cmFuc2xhdGVUbz1mdW5jdGlvbih0LG4sZSxyLGEpe3YudHJhbnNmb3JtKHQsKGZ1bmN0aW9uKCl7dmFyIHQ9aS5hcHBseSh0aGlzLGFyZ3VtZW50cyksYT10aGlzLl9fem9vbSx1PW51bGw9PXI/bSh0KToiZnVuY3Rpb24iPT10eXBlb2Ygcj9yLmFwcGx5KHRoaXMsYXJndW1lbnRzKTpyO3JldHVybiBvKE13LnRyYW5zbGF0ZSh1WzBdLHVbMV0pLnNjYWxlKGEuaykudHJhbnNsYXRlKCJmdW5jdGlvbiI9PXR5cGVvZiBuPy1uLmFwcGx5KHRoaXMsYXJndW1lbnRzKTotbiwiZnVuY3Rpb24iPT10eXBlb2YgZT8tZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk6LWUpLHQsZil9KSxyLGEpfSxNLnByb3RvdHlwZT17ZXZlbnQ6ZnVuY3Rpb24odCl7cmV0dXJuIHQmJih0aGlzLnNvdXJjZUV2ZW50PXQpLHRoaXN9LHN0YXJ0OmZ1bmN0aW9uKCl7cmV0dXJuIDE9PSsrdGhpcy5hY3RpdmUmJih0aGlzLnRoYXQuX196b29taW5nPXRoaXMsdGhpcy5lbWl0KCJzdGFydCIpKSx0aGlzfSx6b29tOmZ1bmN0aW9uKHQsbil7cmV0dXJuIHRoaXMubW91c2UmJiJtb3VzZSIhPT10JiYodGhpcy5tb3VzZVsxXT1uLmludmVydCh0aGlzLm1vdXNlWzBdKSksdGhpcy50b3VjaDAmJiJ0b3VjaCIhPT10JiYodGhpcy50b3VjaDBbMV09bi5pbnZlcnQodGhpcy50b3VjaDBbMF0pKSx0aGlzLnRvdWNoMSYmInRvdWNoIiE9PXQmJih0aGlzLnRvdWNoMVsxXT1uLmludmVydCh0aGlzLnRvdWNoMVswXSkpLHRoaXMudGhhdC5fX3pvb209bix0aGlzLmVtaXQoInpvb20iKSx0aGlzfSxlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gMD09LS10aGlzLmFjdGl2ZSYmKGRlbGV0ZSB0aGlzLnRoYXQuX196b29taW5nLHRoaXMuZW1pdCgiZW5kIikpLHRoaXN9LGVtaXQ6ZnVuY3Rpb24odCl7dmFyIG49S24odGhpcy50aGF0KS5kYXR1bSgpO2guY2FsbCh0LHRoaXMudGhhdCxuZXcgeHcodCx7c291cmNlRXZlbnQ6dGhpcy5zb3VyY2VFdmVudCx0YXJnZXQ6dix0eXBlOnQsdHJhbnNmb3JtOnRoaXMudGhhdC5fX3pvb20sZGlzcGF0Y2g6aH0pLG4pfX0sdi53aGVlbERlbHRhPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6bXcoK3QpLHYpOmF9LHYuZmlsdGVyPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6bXcoISF0KSx2KTpyfSx2LnRvdWNoYWJsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT0iZnVuY3Rpb24iPT10eXBlb2YgdD90Om13KCEhdCksdik6dX0sdi5leHRlbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDptdyhbWyt0WzBdWzBdLCt0WzBdWzFdXSxbK3RbMV1bMF0sK3RbMV1bMV1dXSksdik6aX0sdi5zY2FsZUV4dGVudD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oY1swXT0rdFswXSxjWzFdPSt0WzFdLHYpOltjWzBdLGNbMV1dfSx2LnRyYW5zbGF0ZUV4dGVudD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZlswXVswXT0rdFswXVswXSxmWzFdWzBdPSt0WzFdWzBdLGZbMF1bMV09K3RbMF1bMV0sZlsxXVsxXT0rdFsxXVsxXSx2KTpbW2ZbMF1bMF0sZlswXVsxXV0sW2ZbMV1bMF0sZlsxXVsxXV1dfSx2LmNvbnN0cmFpbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz10LHYpOm99LHYuZHVyYXRpb249ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHM9K3Qsdik6c30sdi5pbnRlcnBvbGF0ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obD10LHYpOmx9LHYub249ZnVuY3Rpb24oKXt2YXIgdD1oLm9uLmFwcGx5KGgsYXJndW1lbnRzKTtyZXR1cm4gdD09PWg/djp0fSx2LmNsaWNrRGlzdGFuY2U9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGc9KHQ9K3QpKnQsdik6TWF0aC5zcXJ0KGcpfSx2LnRhcERpc3RhbmNlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh5PSt0LHYpOnl9LHZ9LHQuem9vbUlkZW50aXR5PU13LHQuem9vbVRyYW5zZm9ybT1Ud30pKTs=",mtime:1684830101938},"asset/force-graph.js":{data:"data:application/javascript;base64,Ly8KLy8gU2V0dGluZ3MgYWRkZWQgYnkgV2lsbGVtIEhlbmRyaWtzCi8vICghKSB0byBiZSBhZGRlZCB0byB5YW1sIG9yIG90aGVyIHNldHRpbmdzIGNvbmZpZwovLwovLwovLyBMQUJFTCBTRVRUSU5HUwpjb25zdCBMQUJFTF9NQVJHSU4gPSAyMjsgLy8gbWFyZ2luIGJldHdlZW4gbGFiZWwtdGV4dCBhbmQgbm9kZSwgaGlnaGVyIG51bWJlciAtPiBtb3JlIHNwYWNlCmNvbnN0IExBQkVMX1ZJU0lCSUxJVFlfU1RBUlRfSyA9IDEuNTsgLy8gYXQgdGhpcyBrLCBsYWJlbHMgYXJlIHN0aWxsIGludmlzaWJsZQpjb25zdCBMQUJFTF9WSVNJQklMSVRZX0VORF9LID0gNTsgLy8gYXQgdGhpcyBrLCBsYWJlbHMgYXJlIGZ1bGx5IHZpc2libGUKY29uc3QgTEFCRUxfVFJVTkNBVElPTl9MRU5HVEggPSAyMDsgLy8gbWF4IGxlbmd0aCBvZiB3b3JkIGluIGxhYmVsCgovLyBDb3B5cmlnaHQgMjAyMSBPYnNlcnZhYmxlLCBJbmMuCi8vIFJlbGVhc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZS4KLy8gaHR0cHM6Ly9vYnNlcnZhYmxlaHEuY29tL0BkMy9kaXNqb2ludC1mb3JjZS1kaXJlY3RlZC1ncmFwaApmdW5jdGlvbiBGb3JjZUdyYXBoKHsKICBub2RlcywgLy8gYW4gaXRlcmFibGUgb2Ygbm9kZSBvYmplY3RzICh0eXBpY2FsbHkgW3tpZH0sIOKApl0pCiAgbGlua3MgLy8gYW4gaXRlcmFibGUgb2YgbGluayBvYmplY3RzICh0eXBpY2FsbHkgW3tzb3VyY2UsIHRhcmdldH0sIOKApl0pCn0sIHsKICBub2RlSWQgPSBkID0+IGQuaWQsIC8vIGdpdmVuIGQgaW4gbm9kZXMsIHJldHVybnMgYSB1bmlxdWUgaWRlbnRpZmllciAoc3RyaW5nKQogIG5vZGVHcm91cCwgLy8gZ2l2ZW4gZCBpbiBub2RlcywgcmV0dXJucyBhbiAob3JkaW5hbCkgdmFsdWUgZm9yIGNvbG9yCiAgbm9kZUdyb3VwcywgLy8gYW4gYXJyYXkgb2Ygb3JkaW5hbCB2YWx1ZXMgcmVwcmVzZW50aW5nIHRoZSBub2RlIGdyb3VwcwogIG5vZGVUaXRsZSwgLy8gZ2l2ZW4gZCBpbiBub2RlcywgYSB0aXRsZSBzdHJpbmcKICBub2RlRmlsbCA9ICJjdXJyZW50Q29sb3IiLCAvLyBub2RlIHN0cm9rZSBmaWxsIChpZiBub3QgdXNpbmcgYSBncm91cCBjb2xvciBlbmNvZGluZykKICBub2RlU3Ryb2tlID0gIiNmZmYiLCAvLyBub2RlIHN0cm9rZSBjb2xvcgogIG5vZGVTdHJva2VXaWR0aCA9IDEuNSwgLy8gbm9kZSBzdHJva2Ugd2lkdGgsIGluIHBpeGVscwogIG5vZGVTdHJva2VPcGFjaXR5ID0gMSwgLy8gbm9kZSBzdHJva2Ugb3BhY2l0eQogIG5vZGVTdHJlbmd0aCwKICBsaW5rU291cmNlID0gKHsgc291cmNlIH0pID0+IHNvdXJjZSwgLy8gZ2l2ZW4gZCBpbiBsaW5rcywgcmV0dXJucyBhIG5vZGUgaWRlbnRpZmllciBzdHJpbmcKICBsaW5rVGFyZ2V0ID0gKHsgdGFyZ2V0IH0pID0+IHRhcmdldCwgLy8gZ2l2ZW4gZCBpbiBsaW5rcywgcmV0dXJucyBhIG5vZGUgaWRlbnRpZmllciBzdHJpbmcKICBsaW5rU3Ryb2tlID0gIiM5OTkiLCAvLyBsaW5rIHN0cm9rZSBjb2xvcgogIGxpbmtTdHJva2VPcGFjaXR5ID0gMC42LCAvLyBsaW5rIHN0cm9rZSBvcGFjaXR5CiAgbGlua1N0cm9rZVdpZHRoID0gMS41LCAvLyBnaXZlbiBkIGluIGxpbmtzLCByZXR1cm5zIGEgc3Ryb2tlIHdpZHRoIGluIHBpeGVscwogIGxpbmtTdHJva2VMaW5lY2FwID0gInJvdW5kIiwgLy8gbGluayBzdHJva2UgbGluZWNhcAogIGxpbmtTdHJlbmd0aCwKICBjb2xvcnMgPSBkMy5zY2hlbWVUYWJsZWF1MTAsIC8vIGFuIGFycmF5IG9mIGNvbG9yIHN0cmluZ3MsIGZvciB0aGUgbm9kZSBncm91cHMKICB3aWR0aCA9IDY0MCwgLy8gb3V0ZXIgd2lkdGgsIGluIHBpeGVscwogIGhlaWdodCA9IDQwMCwgLy8gb3V0ZXIgaGVpZ2h0LCBpbiBwaXhlbHMKICBpbnZhbGlkYXRpb24gLy8gd2hlbiB0aGlzIHByb21pc2UgcmVzb2x2ZXMsIHN0b3AgdGhlIHNpbXVsYXRpb24KfSA9IHt9KSB7CiAgLy8gQ29tcHV0ZSB2YWx1ZXMuCgogIGNvbnN0IE4gPSBkMy5tYXAobm9kZXMsIG5vZGVJZCkubWFwKGludGVybik7CiAgY29uc3QgQyA9IGQzLm1hcChub2Rlcywgbm9kZUNvbm5lY3Rpdml0eS5iaW5kKG51bGwsIGxpbmtzKSk7CiAgY29uc3QgQ09MID0gZDMubWFwKG5vZGVzLCBkID0+IGQuY29sb3IpLm1hcChpbnRlcm4pOwogIGNvbnN0IExTID0gZDMubWFwKGxpbmtzLCBsaW5rU291cmNlKS5tYXAoaW50ZXJuKTsKICBjb25zdCBMVCA9IGQzLm1hcChsaW5rcywgbGlua1RhcmdldCkubWFwKGludGVybik7CiAgaWYgKG5vZGVUaXRsZSA9PT0gdW5kZWZpbmVkKSBub2RlVGl0bGUgPSAoXywgaSkgPT4gTltpXTsKICBjb25zdCBUID0gbm9kZVRpdGxlID09IG51bGwgPyBudWxsIDogZDMubWFwKG5vZGVzLCBub2RlVGl0bGUpOwogIGNvbnN0IEcgPSBub2RlR3JvdXAgPT0gbnVsbCA/IG51bGwgOiBkMy5tYXAobm9kZXMsIG5vZGVHcm91cCkubWFwKGludGVybik7CiAgY29uc3QgVyA9IHR5cGVvZiBsaW5rU3Ryb2tlV2lkdGggIT09ICJmdW5jdGlvbiIgPyBudWxsIDogZDMubWFwKGxpbmtzLCBsaW5rU3Ryb2tlV2lkdGgpOwoKICAvLyBSZXBsYWNlIHRoZSBpbnB1dCBub2RlcyBhbmQgbGlua3Mgd2l0aCBtdXRhYmxlIG9iamVjdHMgZm9yIHRoZSBzaW11bGF0aW9uLgogIG5vZGVzID0gZDMubWFwKG5vZGVzLCAoXywgaSkgPT4gKHsgaWQ6IE5baV0sIGNvbm5lY3Rpdml0eTogQ1tpXSwgY29sb3I6IENPTFtpXSB9KSk7CiAgbGlua3MgPSBkMy5tYXAobGlua3MsIChfLCBpKSA9PiAoeyBzb3VyY2U6IExTW2ldLCB0YXJnZXQ6IExUW2ldIH0pKTsKCiAgLy8gQ29tcHV0ZSBub2RlIGNvbm5lY3Rpdml0eQogIGZ1bmN0aW9uIGlzQ29ubmVjdGluZyhub2RlLCBsaW5rKSB7CiAgICByZXR1cm4gbGluay5zb3VyY2UgPT0gbm9kZS5pZCB8fCBsaW5rLnRhcmdldCA9PSBub2RlLmlkOwogIH0KCiAgZnVuY3Rpb24gbm9kZUNvbm5lY3Rpdml0eShsaW5rcywgbm9kZSkgewogICAgcmV0dXJuIGxpbmtzLnJlZHVjZSgoYWNjLCBjdXJyZW50TGluaykgPT4gewogICAgICByZXR1cm4gYWNjICsgKGlzQ29ubmVjdGluZyhub2RlLCBjdXJyZW50TGluaykgPyAxIDogMCk7CiAgICB9LCAwKTsKICB9CgogIC8vIENvbXB1dGUgZGVmYXVsdCBkb21haW5zLgogIGlmIChHICYmIG5vZGVHcm91cHMgPT09IHVuZGVmaW5lZCkgbm9kZUdyb3VwcyA9IGQzLnNvcnQoRyk7CgogIC8vIENvbnN0cnVjdCB0aGUgc2NhbGVzLgogIGNvbnN0IGNvbG9yID0gbm9kZUdyb3VwID09IG51bGwgPyBudWxsIDogZDMuc2NhbGVPcmRpbmFsKG5vZGVHcm91cHMsIGNvbG9ycyk7CgogIC8vIENvbnN0cnVjdCB0aGUgZm9yY2VzLgogIGNvbnN0IGZvcmNlTm9kZSA9IGQzLmZvcmNlTWFueUJvZHkoKTsKICBjb25zdCBmb3JjZUxpbmsgPSBkMy5mb3JjZUxpbmsobGlua3MpLmlkKCh7IGluZGV4OiBpIH0pID0+IE5baV0pOwogIGlmIChub2RlU3RyZW5ndGggIT09IHVuZGVmaW5lZCkgZm9yY2VOb2RlLnN0cmVuZ3RoKG5vZGVTdHJlbmd0aCk7CiAgaWYgKGxpbmtTdHJlbmd0aCAhPT0gdW5kZWZpbmVkKSBmb3JjZUxpbmsuc3RyZW5ndGgobGlua1N0cmVuZ3RoKTsKCiAgY29uc3Qgc3ZnID0gZDMuY3JlYXRlKCJzdmciKQogICAgLmF0dHIoIndpZHRoIiwgd2lkdGgpCiAgICAuYXR0cigiaGVpZ2h0IiwgaGVpZ2h0KQogICAgLmF0dHIoInZpZXdCb3giLCBbLXdpZHRoIC8gMiwgLWhlaWdodCAvIDIsIHdpZHRoLCBoZWlnaHRdKQogICAgLmF0dHIoInN0eWxlIiwgIm1heC13aWR0aDogMTAwJTsgaGVpZ2h0OiBhdXRvOyBoZWlnaHQ6IGludHJpbnNpYzsiKTsKCiAgY29uc3QgbGluayA9IHN2Zy5hcHBlbmQoImciKQogICAgLmF0dHIoInN0cm9rZSIsIGxpbmtTdHJva2UpCiAgICAuYXR0cigic3Ryb2tlLW9wYWNpdHkiLCBsaW5rU3Ryb2tlT3BhY2l0eSkKICAgIC5hdHRyKCJzdHJva2Utd2lkdGgiLCB0eXBlb2YgbGlua1N0cm9rZVdpZHRoICE9PSAiZnVuY3Rpb24iID8gbGlua1N0cm9rZVdpZHRoIDogbnVsbCkKICAgIC5hdHRyKCJzdHJva2UtbGluZWNhcCIsIGxpbmtTdHJva2VMaW5lY2FwKQogICAgLnNlbGVjdEFsbCgibGluZSIpCiAgICAuZGF0YShsaW5rcykKICAgIC5qb2luKCJsaW5lIik7CgogIGlmIChXKSBsaW5rLmF0dHIoInN0cm9rZS13aWR0aCIsICh7IGluZGV4OiBpIH0pID0+IFdbaV0pOwoKICAvLyBTY2FsZXMgZm9yIG5vZGUgc2l6ZSBiYXNlZCBvbiBjb25uZWN0aXZpdHkKICBjb25zdCBub2RlU2l6ZVNjYWxlID0gZDMuc2NhbGVMaW5lYXIoKQogICAgLmRvbWFpbihbZDMubWluKEMpLCBkMy5tYXgoQyldKQogICAgLnJhbmdlKFszLCAxMl0pOwoKICAvLyBzY2FsZXMgZm9yIGxhYmVsIHNpemUgYmFzZWQgb24gY29ubmVjdGl2aXR5CiAgY29uc3QgbGFiZWxTaXplU2NhbGUgPSBkMy5zY2FsZUxpbmVhcigpCiAgICAuZG9tYWluKFtkMy5taW4oQyksIGQzLm1heChDKV0pCiAgICAucmFuZ2UoWzAuNiwgMS4yXSk7CgogIGNvbnN0IG5vZGUgPSBzdmcuYXBwZW5kKCJnIikKICAgIC5hdHRyKCJzdHJva2Utb3BhY2l0eSIsIG5vZGVTdHJva2VPcGFjaXR5KQogICAgLmF0dHIoInN0cm9rZS13aWR0aCIsIG5vZGVTdHJva2VXaWR0aCkKICAgIC5zZWxlY3RBbGwoImNpcmNsZSIpCiAgICAuZGF0YShub2RlcykKICAgIC5qb2luKCJjaXJjbGUiKQogICAgLmF0dHIoInIiLCBkID0+IG5vZGVTaXplU2NhbGUoZC5jb25uZWN0aXZpdHkpKQogICAgLmF0dHIoInN0cm9rZSIsIGQgPT4gYCMke2QuY29sb3J9YCkKICAgIC5hdHRyKCJmaWxsIiwgZCA9PiBgIyR7ZC5jb2xvcn1gKTsKCiAgY29uc3QgbGFiZWxzID0gc3ZnLmFwcGVuZCgiZyIpCiAgICAuc2VsZWN0QWxsKCJ0ZXh0IikKICAgIC5kYXRhKG5vZGVzKQogICAgLmpvaW4oJ3RleHQnKQogICAgLnRleHQoZCA9PiB7CiAgICAgIGlmIChbLi4uZC5pZF0ubGVuZ3RoIDwgTEFCRUxfVFJVTkNBVElPTl9MRU5HVEgpIHJldHVybiBkLmlkCiAgICAgIGVsc2UgewogICAgICAgIGNvbnN0IGlkID0gZC5pZDsKICAgICAgICBjb25zdCBzcGxpdCA9IGlkLnNwbGl0KCcvJykKICAgICAgICBjb25zdCBsYXN0X2VsZW1lbnQgPSBzcGxpdC5wb3AoKQogICAgICAgIGNvbnN0IHJlc3VsdCA9IHNwbGl0Lm1hcCgoZSwgaSkgPT4gewogICAgICAgICAgcmV0dXJuIFsuLi5lXS5zbGljZSgwLCBNYXRoLm1pbig1LCBbLi4uZV0ubGVuZ3RoKSkuam9pbignJyk7CiAgICAgICAgfSkKICAgICAgICByZXN1bHQucHVzaChsYXN0X2VsZW1lbnQpOwogICAgICAgIHJldHVybiByZXN1bHQuam9pbignLi8nKTsKICAgICAgfQogICAgfSkKICAgIC5hdHRyKCdmb250LWZhbWlseScsICdTYW5zLEFyaWFsJykKICAgIC5hdHRyKCdmb250LXNpemUnLCBkID0+IGAke2xhYmVsU2l6ZVNjYWxlKGQuY29ubmVjdGl2aXR5KX1lbWApCiAgICAuYXR0cignZmlsbCcsICcjMjIyJykKICAgIC5hdHRyKCd0ZXh0LWFuY2hvcicsICdtaWRkbGUnKQogICAgLmF0dHIoJ2NsYXNzJywgJ3N2Z3RleHQnKQogICAgLm9uKCdjbGljaycsIGZ1bmN0aW9uIChldmVudCwgZCkgewogICAgICBzZW5kRXZlbnQoJ2dyYXBodmlldzpuYXZpZ2F0ZVRvJywgZC5pZCk7CiAgICB9KTsKCiAgaWYgKEcpIG5vZGUuYXR0cigiZmlsbCIsICh7IGluZGV4OiBpIH0pID0+IGNvbG9yKEdbaV0pKTsKICBpZiAoVCkgbm9kZS5hcHBlbmQoInRpdGxlIikudGV4dCgoeyBpbmRleDogaSB9KSA9PiBUW2ldKTsKCiAgLy8gSGFuZGxlIGludmFsaWRhdGlvbi4KICBpZiAoaW52YWxpZGF0aW9uICE9IG51bGwpIGludmFsaWRhdGlvbi50aGVuKCgpID0+IHNpbXVsYXRpb24uc3RvcCgpKTsKCiAgZnVuY3Rpb24gaW50ZXJuKHZhbHVlKSB7CiAgICByZXR1cm4gdmFsdWUgIT09IG51bGwgJiYgdHlwZW9mIHZhbHVlID09PSAib2JqZWN0IiA/IHZhbHVlLnZhbHVlT2YoKSA6IHZhbHVlOwogIH0KCiAgY29uc3Qgc2ltdWxhdGlvbiA9IGQzLmZvcmNlU2ltdWxhdGlvbihub2RlcykKICAgIC5mb3JjZSgibGluayIsIGZvcmNlTGluaykKICAgIC5mb3JjZSgiY2hhcmdlIiwgZm9yY2VOb2RlKQogICAgLmZvcmNlKCJ4IiwgZDMuZm9yY2VYKCkpCiAgICAuZm9yY2UoInkiLCBkMy5mb3JjZVkoKSkKICAgIC5vbigidGljayIsIHRpY2tlZCkKICAgIC5zdG9wKCk7IC8vIERvbid0IHN0YXJ0IHRoZSBzaW11bGF0aW9uIGF1dG9tYXRpY2FsbHkuCgogIC8vIE5vdGU6IFRoaXMgbWFudWFsIGRyYXdpbmcgb2YgdGhlIHNpbXVsYXRpb24gaXMgbmVjZXNzYXJ5IHRvIGZpeCBicm9rZW4gem9vbWluZyBpbiB0aGUgZmlyc3Qgc2Vjb25kcwogIC8vIG9mIHRoZSBwYWdlIGxvYWQgd2hpbGUgdGhlIHNpbXVsYXRpb24gaXMgcnVubmluZy4KICBzaW11bGF0aW9uLnRpY2soMzAwKTsgLy8gUnVuIHRoZSBzaW11bGF0aW9uIGZvciAzMDAgdGlja3MsIGJ1dCB3aXRob3V0IGRyYXdpbmcuCiAgdGlja2VkKCk7IC8vIERyYXcgb25jZSBhZnRlciB0aGUgc2ltdWxhdGlvbiBoYXMgc3RhYmlsaXplZC4KCiAgZnVuY3Rpb24gdGlja2VkKCkgewogICAgbGluawogICAgICAuYXR0cigieDEiLCBkID0+IGQuc291cmNlLngpCiAgICAgIC5hdHRyKCJ5MSIsIGQgPT4gZC5zb3VyY2UueSkKICAgICAgLmF0dHIoIngyIiwgZCA9PiBkLnRhcmdldC54KQogICAgICAuYXR0cigieTIiLCBkID0+IGQudGFyZ2V0LnkpOwoKICAgIG5vZGUKICAgICAgLmF0dHIoImN4IiwgZCA9PiBkLngpCiAgICAgIC5hdHRyKCJjeSIsIGQgPT4gZC55KTsKCiAgICBsYWJlbHMKICAgICAgLmF0dHIoJ3gnLCBkID0+IGQueCkKICAgICAgLmF0dHIoJ3knLCBkID0+IGQueSk7CiAgfQoKICAvLyBab29tCiAgZnVuY3Rpb24gcmVzaXplTm9kZShkLCBrKSB7CiAgICAvLyBUT0RPOiBNYWtlIHN1cmUgZCBoYXMgc29tZSBpbmZvcm1hdGlvbiBvbiB0aGUgY29ubmVjdGVkbmVzcyBvZiBhCiAgICAvLyBub2RlIHNvIHRoYXQgd2UgY2FuIHZhcnkgbm9kZSBzaXplcyBiYXNlZCBvbiB0aGF0LgogICAgY29uc3QgbWluID0gbm9kZVNpemVTY2FsZShkLmNvbm5lY3Rpdml0eSk7CiAgICBjb25zdCBjdXIgPSBub2RlU2l6ZVNjYWxlKGQuY29ubmVjdGl2aXR5KSAqIE1hdGgubG9nKGspOwogICAgcmV0dXJuIE1hdGgubWF4KG1pbiwgY3VyKTsKICB9CgogIGZ1bmN0aW9uIHpvb21lZChldmVudCkgewogICAgY29uc3QgdCA9IGV2ZW50LnRyYW5zZm9ybTsKICAgIGNvbnN0IHRyYW5zbGF0ZSA9ICJ0cmFuc2xhdGUoIiArIHQueCArICIsIiArIHQueSArICIpIgogICAgbm9kZQogICAgICAuYXR0cigiY3giLCBkID0+IGQueCAqIHQuaykKICAgICAgLmF0dHIoImN5IiwgZCA9PiBkLnkgKiB0LmspCiAgICAgIC5hdHRyKCJyIiwgZCA9PiByZXNpemVOb2RlKGQsIHQuaykpCiAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCB0cmFuc2xhdGUpOwogICAgbGluawogICAgICAuYXR0cigieDEiLCBkID0+IGQuc291cmNlLnggKiB0LmspCiAgICAgIC5hdHRyKCJ5MSIsIGQgPT4gZC5zb3VyY2UueSAqIHQuaykKICAgICAgLmF0dHIoIngyIiwgZCA9PiBkLnRhcmdldC54ICogdC5rKQogICAgICAuYXR0cigieTIiLCBkID0+IGQudGFyZ2V0LnkgKiB0LmspCiAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCB0cmFuc2xhdGUpOwogICAgbGFiZWxzCiAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCB0cmFuc2xhdGUpCiAgICAgIC5hdHRyKCd4JywgZCA9PiBkLnggKiB0LmspCiAgICAgIC5hdHRyKCd5JywgZCA9PiBkLnkgKiB0LmsgKyBMQUJFTF9NQVJHSU4gKyByZXNpemVOb2RlKGQsIHQuaykpCiAgICAgIC5hdHRyKCdvcGFjaXR5Jywgb3BhY2l0eV9hY3RpdmF0aW9uKGV2ZW50LnRyYW5zZm9ybS5rKSk7CgogIH0KCiAgY29uc3Qgem9vbSA9IGQzLnpvb20oKQogICAgLnNjYWxlRXh0ZW50KFsxIC8gMiwgNjRdKQogICAgLm9uKCJ6b29tIiwgem9vbWVkKTsKCiAgc3ZnLmNhbGwoem9vbSkKICAgIC5jYWxsKHpvb20udHJhbnNsYXRlVG8sIDAsIDApOwoKCiAgcmV0dXJuIE9iamVjdC5hc3NpZ24oc3ZnLm5vZGUoKSwgeyBzY2FsZXM6IHsgY29sb3IgfSB9KTsKfQoKCmZ1bmN0aW9uIG9wYWNpdHlfYWN0aXZhdGlvbih6b29tX2xldmVsKSB7CiAgLyogU3VtbWFyeTogcmV0dXJucyBvcGFjaXR5IHZhbHVlLCBkZXBlbmRpbmcgb24gem9vbSBsZXZlbCBrCiAgICoKICAgKiBvcGFjaXR5IGlzIGEgdmFsdWUgYmV0d2VuIFswLDFdIHdoZXJlIDAgaXMgaW52aXNpYmxlCiAgICoKICAgKiBEZXNjcmlwdGlvbjogQSBsaW5lYXIgb3BhY2l0eSBhY3RpdmF0aW9uIGZ1bmN0aW9uLgogICAqIC0gZm9yIExBQkVMX1ZJU0lCSUxJVFlfU1RBUlRfSyAoYW5kIGJlbG93KSAtPiAwIChpbnZpc2libGUpCiAgICogLSBmb3IgTEFCRUxfVklTSUJJTElUWV9FTkRfSyAoYW5kIGFib3ZlKSAtPiAxIChmdWxseSB2aXNpYmxlKQogICAqIC0gYmV0d2VlbjogbGluZWFyCiAgICoKICAgKiAgQVNDSUkgYXJlIG9mIGFjdGl2YXRpb24gZnVuY3Rpb246IF9fX18vLS0tLQogICAqCiAgICovCgogIGlmICh6b29tX2xldmVsIDw9IExBQkVMX1ZJU0lCSUxJVFlfU1RBUlRfSykgewogICAgcmV0dXJuIDA7CiAgfQogIGlmICh6b29tX2xldmVsID49IExBQkVMX1ZJU0lCSUxJVFlfRU5EX0spIHsKICAgIHJldHVybiAxOwogIH0KCiAgY29uc3QgbGluZWFyX29wYWNpdHkgPSAoem9vbV9sZXZlbCAtIExBQkVMX1ZJU0lCSUxJVFlfU1RBUlRfSykgLyAoTEFCRUxfVklTSUJJTElUWV9FTkRfSyAtIExBQkVMX1ZJU0lCSUxJVFlfU1RBUlRfSyk7CgogIHJldHVybiBsaW5lYXJfb3BhY2l0eTsKfQo=",mtime:1684830101960},"style.css":{data:"data:text/css;base64,dGV4dC5zdmd0ZXh0OmhvdmVyIHsKICBmaWxsOiAjMTcxMTVlOwogIGZvbnQtd2VpZ2h0OiBib2xkOwogIGN1cnNvcjogcG9pbnRlcjsKfQoKYm9keSB7CiAgb3ZlcmZsb3c6IGhpZGRlbjsKfQ==",mtime:1684830101964}},functions:{toggle:{path:"./graphview.ts:toggleGraphView",command:{name:"Show Global Graph",key:"ctrl-shift-g",mac:"Cmd-shift-g"}},updateGraphView:{path:"./graphview.ts:updateGraphView",env:"client",events:["plug:load","editor:pageLoaded"]},navigateTo:{path:"./utils.ts:navigateTo",events:["graphview:navigateTo"]}}};Jd(Lb,Tm);return xb(Hm);})();