@needle-tools/engine 4.4.0-alpha.3 → 4.4.0-alpha.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. package/CHANGELOG.md +3 -0
  2. package/dist/gltf-progressive.js +54 -54
  3. package/dist/gltf-progressive.light.js +54 -54
  4. package/dist/gltf-progressive.light.min.js +7 -7
  5. package/dist/gltf-progressive.min.js +7 -7
  6. package/dist/needle-engine.bundle.js +6134 -6132
  7. package/dist/needle-engine.bundle.light.js +6137 -6135
  8. package/dist/needle-engine.bundle.light.min.js +130 -130
  9. package/dist/needle-engine.bundle.light.umd.cjs +2 -2
  10. package/dist/needle-engine.bundle.min.js +130 -130
  11. package/dist/needle-engine.bundle.umd.cjs +2 -2
  12. package/dist/needle-engine.d.ts +9 -9
  13. package/dist/needle-engine.js +511 -511
  14. package/dist/needle-engine.light.d.ts +9 -9
  15. package/dist/needle-engine.light.js +511 -511
  16. package/dist/needle-engine.light.min.js +1 -1
  17. package/dist/needle-engine.min.js +1 -1
  18. package/dist/postprocessing.js +38 -38
  19. package/dist/postprocessing.light.js +38 -38
  20. package/dist/postprocessing.light.min.js +2 -2
  21. package/dist/postprocessing.min.js +2 -2
  22. package/dist/three-examples.js +1205 -1205
  23. package/dist/three-examples.light.js +1205 -1205
  24. package/dist/three-examples.light.min.js +15 -15
  25. package/dist/three-examples.min.js +15 -15
  26. package/dist/three-mesh-ui.js +9 -9
  27. package/dist/three-mesh-ui.light.js +9 -9
  28. package/dist/three-mesh-ui.light.min.js +9 -9
  29. package/dist/three-mesh-ui.min.js +9 -9
  30. package/dist/three.js +238 -238
  31. package/dist/three.light.js +238 -238
  32. package/dist/three.light.min.js +24 -24
  33. package/dist/three.min.js +24 -24
  34. package/dist/vendor.js +24 -24
  35. package/dist/vendor.light.js +24 -24
  36. package/dist/vendor.light.min.js +2 -2
  37. package/dist/vendor.min.js +2 -2
  38. package/lib/engine-components/postprocessing/PostProcessingHandler.js +6 -2
  39. package/lib/engine-components/postprocessing/PostProcessingHandler.js.map +1 -1
  40. package/package.json +1 -1
  41. package/src/engine-components/postprocessing/PostProcessingHandler.ts +7 -2
@@ -1,4 +1,4 @@
1
- import{P as Jo,a9 as Rl,bc as we,V as K,L as xn,q as xs,D as Ss,b6 as Uo,O as fs,c0 as Yt,cM as Ve,cI as Ll,U as Fe,j as Ws,B as Ot,I as be,M as Sn,d as xl,b1 as Sl,f as De,Y as Po,b5 as rt,S as wo,b as Te,c as fe,bC as Fo,ax as fl,aq as Qo,r as Wl,X as gl,b0 as Cl,R as zl,ac as gs,al as Dt,bB as yi,cN as fn,bG as Gi,b2 as Bo,cO as vl,cP as Eo,cQ as Kl,ad as Wn,cR as Cs,bP as Ml,bO as Tl,cS as jo,cT as Yl,o as Hl,g as zs}from"./three.min.js";const se={Handedness:Object.freeze({NONE:"none",LEFT:"left",RIGHT:"right"}),ComponentState:Object.freeze({DEFAULT:"default",TOUCHED:"touched",PRESSED:"pressed"}),ComponentProperty:Object.freeze({BUTTON:"button",X_AXIS:"xAxis",Y_AXIS:"yAxis",STATE:"state"}),ComponentType:Object.freeze({TRIGGER:"trigger",SQUEEZE:"squeeze",TOUCHPAD:"touchpad",THUMBSTICK:"thumbstick",BUTTON:"button"}),ButtonTouchThreshold:.05,AxisTouchThreshold:.1,VisualResponseProperty:Object.freeze({TRANSFORM:"transform",VISIBILITY:"visibility"})};async function Oo(n){const e=await fetch(n);if(e.ok)return e.json();throw new Error(e.statusText)}async function kl(n){if(!n)throw new Error("No basePath supplied");return await Oo(`${n}/profilesList.json`)}async function Nl(n,e,t=null,i=!0){if(!n)throw new Error("No xrInputSource supplied");if(!e)throw new Error("No basePath supplied");const s=await kl(e);let o;if(n.profiles.some(r=>{const l=s[r];return l&&(o={profileId:r,profilePath:`${e}/${l.path}`,deprecated:!!l.deprecated}),!!o}),!o){if(!t)throw new Error("No matching profile name found");const r=s[t];if(!r)throw new Error(`No matching profile name found and default profile "${t}" missing.`);o={profileId:t,profilePath:`${e}/${r.path}`,deprecated:!!r.deprecated}}const a=await Oo(o.profilePath);let c;if(i){let r;if(n.handedness==="any"?r=a.layouts[Object.keys(a.layouts)[0]]:r=a.layouts[n.handedness],!r)throw new Error(`No matching handedness, ${n.handedness}, in profile ${o.profileId}`);r.assetPath&&(c=o.profilePath.replace("profile.json",r.assetPath))}return{profile:a,assetPath:c}}const Il={xAxis:0,yAxis:0,button:0,state:se.ComponentState.DEFAULT};function Jl(n=0,e=0){let t=n,i=e;if(Math.sqrt(n*n+e*e)>1){const s=Math.atan2(e,n);t=Math.cos(s),i=Math.sin(s)}return{normalizedXAxis:t*.5+.5,normalizedYAxis:i*.5+.5}}class Ul{constructor(e){this.componentProperty=e.componentProperty,this.states=e.states,this.valueNodeName=e.valueNodeName,this.valueNodeProperty=e.valueNodeProperty,this.valueNodeProperty===se.VisualResponseProperty.TRANSFORM&&(this.minNodeName=e.minNodeName,this.maxNodeName=e.maxNodeName),this.value=0,this.updateFromComponent(Il)}updateFromComponent({xAxis:e,yAxis:t,button:i,state:s}){const{normalizedXAxis:o,normalizedYAxis:a}=Jl(e,t);switch(this.componentProperty){case se.ComponentProperty.X_AXIS:this.value=this.states.includes(s)?o:.5;break;case se.ComponentProperty.Y_AXIS:this.value=this.states.includes(s)?a:.5;break;case se.ComponentProperty.BUTTON:this.value=this.states.includes(s)?i:0;break;case se.ComponentProperty.STATE:this.valueNodeProperty===se.VisualResponseProperty.VISIBILITY?this.value=this.states.includes(s):this.value=this.states.includes(s)?1:0;break;default:throw new Error(`Unexpected visualResponse componentProperty ${this.componentProperty}`)}}}class Pl{constructor(e,t){if(!e||!t||!t.visualResponses||!t.gamepadIndices||Object.keys(t.gamepadIndices).length===0)throw new Error("Invalid arguments supplied");this.id=e,this.type=t.type,this.rootNodeName=t.rootNodeName,this.touchPointNodeName=t.touchPointNodeName,this.visualResponses={},Object.keys(t.visualResponses).forEach(i=>{const s=new Ul(t.visualResponses[i]);this.visualResponses[i]=s}),this.gamepadIndices=Object.assign({},t.gamepadIndices),this.values={state:se.ComponentState.DEFAULT,button:this.gamepadIndices.button!==void 0?0:void 0,xAxis:this.gamepadIndices.xAxis!==void 0?0:void 0,yAxis:this.gamepadIndices.yAxis!==void 0?0:void 0}}get data(){return{id:this.id,...this.values}}updateFromGamepad(e){if(this.values.state=se.ComponentState.DEFAULT,this.gamepadIndices.button!==void 0&&e.buttons.length>this.gamepadIndices.button){const t=e.buttons[this.gamepadIndices.button];this.values.button=t.value,this.values.button=this.values.button<0?0:this.values.button,this.values.button=this.values.button>1?1:this.values.button,t.pressed||this.values.button===1?this.values.state=se.ComponentState.PRESSED:(t.touched||this.values.button>se.ButtonTouchThreshold)&&(this.values.state=se.ComponentState.TOUCHED)}this.gamepadIndices.xAxis!==void 0&&e.axes.length>this.gamepadIndices.xAxis&&(this.values.xAxis=e.axes[this.gamepadIndices.xAxis],this.values.xAxis=this.values.xAxis<-1?-1:this.values.xAxis,this.values.xAxis=this.values.xAxis>1?1:this.values.xAxis,this.values.state===se.ComponentState.DEFAULT&&Math.abs(this.values.xAxis)>se.AxisTouchThreshold&&(this.values.state=se.ComponentState.TOUCHED)),this.gamepadIndices.yAxis!==void 0&&e.axes.length>this.gamepadIndices.yAxis&&(this.values.yAxis=e.axes[this.gamepadIndices.yAxis],this.values.yAxis=this.values.yAxis<-1?-1:this.values.yAxis,this.values.yAxis=this.values.yAxis>1?1:this.values.yAxis,this.values.state===se.ComponentState.DEFAULT&&Math.abs(this.values.yAxis)>se.AxisTouchThreshold&&(this.values.state=se.ComponentState.TOUCHED)),Object.values(this.visualResponses).forEach(t=>{t.updateFromComponent(this.values)})}}class wl{constructor(e,t,i){if(!e)throw new Error("No xrInputSource supplied");if(!t)throw new Error("No profile supplied");this.xrInputSource=e,this.assetUrl=i,this.id=t.profileId,this.layoutDescription=t.layouts[e.handedness],this.components={},Object.keys(this.layoutDescription.components).forEach(s=>{const o=this.layoutDescription.components[s];this.components[s]=new Pl(s,o)}),this.updateFromGamepad()}get gripSpace(){return this.xrInputSource.gripSpace}get targetRaySpace(){return this.xrInputSource.targetRaySpace}get data(){const e=[];return Object.values(this.components).forEach(t=>{e.push(t.data)}),e}updateFromGamepad(){Object.values(this.components).forEach(e=>{e.updateFromGamepad(this.xrInputSource.gamepad)})}}const vs=2,_e=4,lt=4,Do=4,bt=new Int32Array(2),_o=new Float32Array(bt.buffer),Ao=new Float64Array(bt.buffer),gn=new Uint16Array(new Uint8Array([1,0]).buffer)[0]===1;class pt{constructor(e,t){this.low=e|0,this.high=t|0}static create(e,t){return e==0&&t==0?pt.ZERO:new pt(e,t)}toFloat64(){return(this.low>>>0)+this.high*4294967296}equals(e){return this.low==e.low&&this.high==e.high}}pt.ZERO=new pt(0,0);var Ks;(function(n){n[n.UTF8_BYTES=1]="UTF8_BYTES",n[n.UTF16_STRING=2]="UTF16_STRING"})(Ks||(Ks={}));class Bi{constructor(e){this.bytes_=e,this.position_=0}static allocate(e){return new Bi(new Uint8Array(e))}clear(){this.position_=0}bytes(){return this.bytes_}position(){return this.position_}setPosition(e){this.position_=e}capacity(){return this.bytes_.length}readInt8(e){return this.readUint8(e)<<24>>24}readUint8(e){return this.bytes_[e]}readInt16(e){return this.readUint16(e)<<16>>16}readUint16(e){return this.bytes_[e]|this.bytes_[e+1]<<8}readInt32(e){return this.bytes_[e]|this.bytes_[e+1]<<8|this.bytes_[e+2]<<16|this.bytes_[e+3]<<24}readUint32(e){return this.readInt32(e)>>>0}readInt64(e){return new pt(this.readInt32(e),this.readInt32(e+4))}readUint64(e){return new pt(this.readUint32(e),this.readUint32(e+4))}readFloat32(e){return bt[0]=this.readInt32(e),_o[0]}readFloat64(e){return bt[gn?0:1]=this.readInt32(e),bt[gn?1:0]=this.readInt32(e+4),Ao[0]}writeInt8(e,t){this.bytes_[e]=t}writeUint8(e,t){this.bytes_[e]=t}writeInt16(e,t){this.bytes_[e]=t,this.bytes_[e+1]=t>>8}writeUint16(e,t){this.bytes_[e]=t,this.bytes_[e+1]=t>>8}writeInt32(e,t){this.bytes_[e]=t,this.bytes_[e+1]=t>>8,this.bytes_[e+2]=t>>16,this.bytes_[e+3]=t>>24}writeUint32(e,t){this.bytes_[e]=t,this.bytes_[e+1]=t>>8,this.bytes_[e+2]=t>>16,this.bytes_[e+3]=t>>24}writeInt64(e,t){this.writeInt32(e,t.low),this.writeInt32(e+4,t.high)}writeUint64(e,t){this.writeUint32(e,t.low),this.writeUint32(e+4,t.high)}writeFloat32(e,t){_o[0]=t,this.writeInt32(e,bt[0])}writeFloat64(e,t){Ao[0]=t,this.writeInt32(e,bt[gn?0:1]),this.writeInt32(e+4,bt[gn?1:0])}getBufferIdentifier(){if(this.bytes_.length<this.position_+_e+lt)throw new Error("FlatBuffers: ByteBuffer is too short to contain an identifier.");let e="";for(let t=0;t<lt;t++)e+=String.fromCharCode(this.readInt8(this.position_+_e+t));return e}__offset(e,t){const i=e-this.readInt32(e);return t<this.readInt16(i)?this.readInt16(i+t):0}__union(e,t){return e.bb_pos=t+this.readInt32(t),e.bb=this,e}__string(e,t){e+=this.readInt32(e);const i=this.readInt32(e);let s="",o=0;if(e+=_e,t===Ks.UTF8_BYTES)return this.bytes_.subarray(e,e+i);for(;o<i;){let a;const c=this.readUint8(e+o++);if(c<192)a=c;else{const r=this.readUint8(e+o++);if(c<224)a=(c&31)<<6|r&63;else{const l=this.readUint8(e+o++);if(c<240)a=(c&15)<<12|(r&63)<<6|l&63;else{const d=this.readUint8(e+o++);a=(c&7)<<18|(r&63)<<12|(l&63)<<6|d&63}}}a<65536?s+=String.fromCharCode(a):(a-=65536,s+=String.fromCharCode((a>>10)+55296,(a&1024-1)+56320))}return s}__union_with_string(e,t){return typeof e=="string"?this.__string(t):this.__union(e,t)}__indirect(e){return e+this.readInt32(e)}__vector(e){return e+this.readInt32(e)+_e}__vector_len(e){return this.readInt32(e+this.readInt32(e))}__has_identifier(e){if(e.length!=lt)throw new Error("FlatBuffers: file identifier must be length "+lt);for(let t=0;t<lt;t++)if(e.charCodeAt(t)!=this.readInt8(this.position()+_e+t))return!1;return!0}createLong(e,t){return pt.create(e,t)}createScalarList(e,t){const i=[];for(let s=0;s<t;++s)e(s)!==null&&i.push(e(s));return i}createObjList(e,t){const i=[];for(let s=0;s<t;++s){const o=e(s);o!==null&&i.push(o.unpack())}return i}}class ko{constructor(e){this.minalign=1,this.vtable=null,this.vtable_in_use=0,this.isNested=!1,this.object_start=0,this.vtables=[],this.vector_num_elems=0,this.force_defaults=!1,this.string_maps=null;let t;e?t=e:t=1024,this.bb=Bi.allocate(t),this.space=t}clear(){this.bb.clear(),this.space=this.bb.capacity(),this.minalign=1,this.vtable=null,this.vtable_in_use=0,this.isNested=!1,this.object_start=0,this.vtables=[],this.vector_num_elems=0,this.force_defaults=!1,this.string_maps=null}forceDefaults(e){this.force_defaults=e}dataBuffer(){return this.bb}asUint8Array(){return this.bb.bytes().subarray(this.bb.position(),this.bb.position()+this.offset())}prep(e,t){e>this.minalign&&(this.minalign=e);const i=~(this.bb.capacity()-this.space+t)+1&e-1;for(;this.space<i+e+t;){const s=this.bb.capacity();this.bb=ko.growByteBuffer(this.bb),this.space+=this.bb.capacity()-s}this.pad(i)}pad(e){for(let t=0;t<e;t++)this.bb.writeInt8(--this.space,0)}writeInt8(e){this.bb.writeInt8(this.space-=1,e)}writeInt16(e){this.bb.writeInt16(this.space-=2,e)}writeInt32(e){this.bb.writeInt32(this.space-=4,e)}writeInt64(e){this.bb.writeInt64(this.space-=8,e)}writeFloat32(e){this.bb.writeFloat32(this.space-=4,e)}writeFloat64(e){this.bb.writeFloat64(this.space-=8,e)}addInt8(e){this.prep(1,0),this.writeInt8(e)}addInt16(e){this.prep(2,0),this.writeInt16(e)}addInt32(e){this.prep(4,0),this.writeInt32(e)}addInt64(e){this.prep(8,0),this.writeInt64(e)}addFloat32(e){this.prep(4,0),this.writeFloat32(e)}addFloat64(e){this.prep(8,0),this.writeFloat64(e)}addFieldInt8(e,t,i){(this.force_defaults||t!=i)&&(this.addInt8(t),this.slot(e))}addFieldInt16(e,t,i){(this.force_defaults||t!=i)&&(this.addInt16(t),this.slot(e))}addFieldInt32(e,t,i){(this.force_defaults||t!=i)&&(this.addInt32(t),this.slot(e))}addFieldInt64(e,t,i){(this.force_defaults||!t.equals(i))&&(this.addInt64(t),this.slot(e))}addFieldFloat32(e,t,i){(this.force_defaults||t!=i)&&(this.addFloat32(t),this.slot(e))}addFieldFloat64(e,t,i){(this.force_defaults||t!=i)&&(this.addFloat64(t),this.slot(e))}addFieldOffset(e,t,i){(this.force_defaults||t!=i)&&(this.addOffset(t),this.slot(e))}addFieldStruct(e,t,i){t!=i&&(this.nested(t),this.slot(e))}nested(e){if(e!=this.offset())throw new Error("FlatBuffers: struct must be serialized inline.")}notNested(){if(this.isNested)throw new Error("FlatBuffers: object serialization must not be nested.")}slot(e){this.vtable!==null&&(this.vtable[e]=this.offset())}offset(){return this.bb.capacity()-this.space}static growByteBuffer(e){const t=e.capacity();if(t&3221225472)throw new Error("FlatBuffers: cannot grow buffer beyond 2 gigabytes.");const i=t<<1,s=Bi.allocate(i);return s.setPosition(i-t),s.bytes().set(e.bytes(),i-t),s}addOffset(e){this.prep(_e,0),this.writeInt32(this.offset()-e+_e)}startObject(e){this.notNested(),this.vtable==null&&(this.vtable=[]),this.vtable_in_use=e;for(let t=0;t<e;t++)this.vtable[t]=0;this.isNested=!0,this.object_start=this.offset()}endObject(){if(this.vtable==null||!this.isNested)throw new Error("FlatBuffers: endObject called without startObject");this.addInt32(0);const e=this.offset();let t=this.vtable_in_use-1;for(;t>=0&&this.vtable[t]==0;t--);const i=t+1;for(;t>=0;t--)this.addInt16(this.vtable[t]!=0?e-this.vtable[t]:0);const s=2;this.addInt16(e-this.object_start);const o=(i+s)*vs;this.addInt16(o);let a=0;const c=this.space;e:for(t=0;t<this.vtables.length;t++){const r=this.bb.capacity()-this.vtables[t];if(o==this.bb.readInt16(r)){for(let l=vs;l<o;l+=vs)if(this.bb.readInt16(c+l)!=this.bb.readInt16(r+l))continue e;a=this.vtables[t];break}}return a?(this.space=this.bb.capacity()-e,this.bb.writeInt32(this.space,a-e)):(this.vtables.push(this.offset()),this.bb.writeInt32(this.bb.capacity()-e,this.offset()-e)),this.isNested=!1,e}finish(e,t,i){const s=i?Do:0;if(t){const o=t;if(this.prep(this.minalign,_e+lt+s),o.length!=lt)throw new Error("FlatBuffers: file identifier must be length "+lt);for(let a=lt-1;a>=0;a--)this.writeInt8(o.charCodeAt(a))}this.prep(this.minalign,_e+s),this.addOffset(e),s&&this.addInt32(this.bb.capacity()-this.space),this.bb.setPosition(this.space)}finishSizePrefixed(e,t){this.finish(e,t,!0)}requiredField(e,t){const i=this.bb.capacity()-e,s=i-this.bb.readInt32(i);if(this.bb.readInt16(s+t)==0)throw new Error("FlatBuffers: field "+t+" must be set")}startVector(e,t,i){this.notNested(),this.vector_num_elems=t,this.prep(_e,e*t),this.prep(i,e*t)}endVector(){return this.writeInt32(this.vector_num_elems),this.offset()}createSharedString(e){if(!e)return 0;if(this.string_maps||(this.string_maps=new Map),this.string_maps.has(e))return this.string_maps.get(e);const t=this.createString(e);return this.string_maps.set(e,t),t}createString(e){if(!e)return 0;let t;if(e instanceof Uint8Array)t=e;else{t=[];let i=0;for(;i<e.length;){let s;const o=e.charCodeAt(i++);if(o<55296||o>=56320)s=o;else{const a=e.charCodeAt(i++);s=(o<<10)+a+(65536-56623104-56320)}s<128?t.push(s):(s<2048?t.push(s>>6&31|192):(s<65536?t.push(s>>12&15|224):t.push(s>>18&7|240,s>>12&63|128),t.push(s>>6&63|128)),t.push(s&63|128))}}this.addInt8(0),this.startVector(1,t.length,1),this.bb.setPosition(this.space-=t.length);for(let i=0,s=this.space,o=this.bb.bytes();i<t.length;i++)o[s++]=t[i];return this.endVector()}createLong(e,t){return pt.create(e,t)}createObjectOffset(e){return e===null?0:typeof e=="string"?this.createString(e):e.pack(this)}createObjectOffsetList(e){const t=[];for(let i=0;i<e.length;++i){const s=e[i];if(s!==null)t.push(this.createObjectOffset(s));else throw new Error("FlatBuffers: Argument for createObjectOffsetList cannot contain null.")}return t}createStructOffsetList(e,t){return t(this,e.length),this.createObjectOffsetList(e),this.endVector()}}function Cn(n){return n&&n.__esModule&&Object.prototype.hasOwnProperty.call(n,"default")?n.default:n}var qo={exports:{}};(function(n){var e={};e.useBlobBuilder=function(){try{return new Blob([]),!1}catch{return!0}}(),e.useArrayBufferView=!e.useBlobBuilder&&function(){try{return new Blob([new Uint8Array([])]).size===0}catch{return!0}}(),n.exports.binaryFeatures=e;var t=n.exports.BlobBuilder;typeof window<"u"&&(t=n.exports.BlobBuilder=window.WebKitBlobBuilder||window.MozBlobBuilder||window.MSBlobBuilder||window.BlobBuilder);function i(){this._pieces=[],this._parts=[]}i.prototype.append=function(s){typeof s=="number"?this._pieces.push(s):(this.flush(),this._parts.push(s))},i.prototype.flush=function(){if(this._pieces.length>0){var s=new Uint8Array(this._pieces);e.useArrayBufferView||(s=s.buffer),this._parts.push(s),this._pieces=[]}},i.prototype.getBuffer=function(){if(this.flush(),e.useBlobBuilder){for(var s=new t,o=0,a=this._parts.length;o<a;o++)s.append(this._parts[o]);return s.getBlob()}else return new Blob(this._parts)},n.exports.BufferBuilder=i})(qo);var $o=qo.exports,Fl=$o.BufferBuilder,ea=$o.binaryFeatures,Ql={unpack:function(n){var e=new re(n);return e.unpack()},pack:function(n){var e=new le;e.pack(n);var t=e.getBuffer();return t}},Bl=Ql;function re(n){this.index=0,this.dataBuffer=n,this.dataView=new Uint8Array(this.dataBuffer),this.length=this.dataBuffer.byteLength}re.prototype.unpack=function(){var n=this.unpack_uint8();if(n<128)return n;if((n^224)<32)return(n^224)-32;var e;if((e=n^160)<=15)return this.unpack_raw(e);if((e=n^176)<=15)return this.unpack_string(e);if((e=n^144)<=15)return this.unpack_array(e);if((e=n^128)<=15)return this.unpack_map(e);switch(n){case 192:return null;case 193:return;case 194:return!1;case 195:return!0;case 202:return this.unpack_float();case 203:return this.unpack_double();case 204:return this.unpack_uint8();case 205:return this.unpack_uint16();case 206:return this.unpack_uint32();case 207:return this.unpack_uint64();case 208:return this.unpack_int8();case 209:return this.unpack_int16();case 210:return this.unpack_int32();case 211:return this.unpack_int64();case 212:return;case 213:return;case 214:return;case 215:return;case 216:return e=this.unpack_uint16(),this.unpack_string(e);case 217:return e=this.unpack_uint32(),this.unpack_string(e);case 218:return e=this.unpack_uint16(),this.unpack_raw(e);case 219:return e=this.unpack_uint32(),this.unpack_raw(e);case 220:return e=this.unpack_uint16(),this.unpack_array(e);case 221:return e=this.unpack_uint32(),this.unpack_array(e);case 222:return e=this.unpack_uint16(),this.unpack_map(e);case 223:return e=this.unpack_uint32(),this.unpack_map(e)}},re.prototype.unpack_uint8=function(){var n=this.dataView[this.index]&255;return this.index++,n},re.prototype.unpack_uint16=function(){var n=this.read(2),e=(n[0]&255)*256+(n[1]&255);return this.index+=2,e},re.prototype.unpack_uint32=function(){var n=this.read(4),e=((n[0]*256+n[1])*256+n[2])*256+n[3];return this.index+=4,e},re.prototype.unpack_uint64=function(){var n=this.read(8),e=((((((n[0]*256+n[1])*256+n[2])*256+n[3])*256+n[4])*256+n[5])*256+n[6])*256+n[7];return this.index+=8,e},re.prototype.unpack_int8=function(){var n=this.unpack_uint8();return n<128?n:n-256},re.prototype.unpack_int16=function(){var n=this.unpack_uint16();return n<32768?n:n-65536},re.prototype.unpack_int32=function(){var n=this.unpack_uint32();return n<Math.pow(2,31)?n:n-Math.pow(2,32)},re.prototype.unpack_int64=function(){var n=this.unpack_uint64();return n<Math.pow(2,63)?n:n-Math.pow(2,64)},re.prototype.unpack_raw=function(n){if(this.length<this.index+n)throw new Error("BinaryPackFailure: index is out of range "+this.index+" "+n+" "+this.length);var e=this.dataBuffer.slice(this.index,this.index+n);return this.index+=n,e},re.prototype.unpack_string=function(n){for(var e=this.read(n),t=0,i="",s,o;t<n;)s=e[t],s<128?(i+=String.fromCharCode(s),t++):(s^192)<32?(o=(s^192)<<6|e[t+1]&63,i+=String.fromCharCode(o),t+=2):(o=(s&15)<<12|(e[t+1]&63)<<6|e[t+2]&63,i+=String.fromCharCode(o),t+=3);return this.index+=n,i},re.prototype.unpack_array=function(n){for(var e=new Array(n),t=0;t<n;t++)e[t]=this.unpack();return e},re.prototype.unpack_map=function(n){for(var e={},t=0;t<n;t++){var i=this.unpack(),s=this.unpack();e[i]=s}return e},re.prototype.unpack_float=function(){var n=this.unpack_uint32(),e=n>>31,t=(n>>23&255)-127,i=n&8388607|8388608;return(e===0?1:-1)*i*Math.pow(2,t-23)},re.prototype.unpack_double=function(){var n=this.unpack_uint32(),e=this.unpack_uint32(),t=n>>31,i=(n>>20&2047)-1023,s=n&1048575|1048576,o=s*Math.pow(2,i-20)+e*Math.pow(2,i-52);return(t===0?1:-1)*o},re.prototype.read=function(n){var e=this.index;if(e+n<=this.length)return this.dataView.subarray(e,e+n);throw new Error("BinaryPackFailure: read index out of range")};function le(){this.bufferBuilder=new Fl}le.prototype.getBuffer=function(){return this.bufferBuilder.getBuffer()},le.prototype.pack=function(n){var e=typeof n;if(e==="string")this.pack_string(n);else if(e==="number")Math.floor(n)===n?this.pack_integer(n):this.pack_double(n);else if(e==="boolean")n===!0?this.bufferBuilder.append(195):n===!1&&this.bufferBuilder.append(194);else if(e==="undefined")this.bufferBuilder.append(192);else if(e==="object")if(n===null)this.bufferBuilder.append(192);else{var t=n.constructor;if(t==Array)this.pack_array(n);else if(t==Blob||t==File||n instanceof Blob||n instanceof File)this.pack_bin(n);else if(t==ArrayBuffer)ea.useArrayBufferView?this.pack_bin(new Uint8Array(n)):this.pack_bin(n);else if("BYTES_PER_ELEMENT"in n)ea.useArrayBufferView?this.pack_bin(new Uint8Array(n.buffer)):this.pack_bin(n.buffer);else if(t==Object||t.toString().startsWith("class"))this.pack_object(n);else if(t==Date)this.pack_string(n.toString());else if(typeof n.toBinaryPack=="function")this.bufferBuilder.append(n.toBinaryPack());else throw new Error('Type "'+t.toString()+'" not yet supported')}else throw new Error('Type "'+e+'" not yet supported');this.bufferBuilder.flush()},le.prototype.pack_bin=function(n){var e=n.length||n.byteLength||n.size;if(e<=15)this.pack_uint8(160+e);else if(e<=65535)this.bufferBuilder.append(218),this.pack_uint16(e);else if(e<=4294967295)this.bufferBuilder.append(219),this.pack_uint32(e);else throw new Error("Invalid length");this.bufferBuilder.append(n)},le.prototype.pack_string=function(n){var e=jl(n);if(e<=15)this.pack_uint8(176+e);else if(e<=65535)this.bufferBuilder.append(216),this.pack_uint16(e);else if(e<=4294967295)this.bufferBuilder.append(217),this.pack_uint32(e);else throw new Error("Invalid length");this.bufferBuilder.append(n)},le.prototype.pack_array=function(n){var e=n.length;if(e<=15)this.pack_uint8(144+e);else if(e<=65535)this.bufferBuilder.append(220),this.pack_uint16(e);else if(e<=4294967295)this.bufferBuilder.append(221),this.pack_uint32(e);else throw new Error("Invalid length");for(var t=0;t<e;t++)this.pack(n[t])},le.prototype.pack_integer=function(n){if(n>=-32&&n<=127)this.bufferBuilder.append(n&255);else if(n>=0&&n<=255)this.bufferBuilder.append(204),this.pack_uint8(n);else if(n>=-128&&n<=127)this.bufferBuilder.append(208),this.pack_int8(n);else if(n>=0&&n<=65535)this.bufferBuilder.append(205),this.pack_uint16(n);else if(n>=-32768&&n<=32767)this.bufferBuilder.append(209),this.pack_int16(n);else if(n>=0&&n<=4294967295)this.bufferBuilder.append(206),this.pack_uint32(n);else if(n>=-2147483648&&n<=2147483647)this.bufferBuilder.append(210),this.pack_int32(n);else if(n>=-9223372036854776e3&&n<=9223372036854776e3)this.bufferBuilder.append(211),this.pack_int64(n);else if(n>=0&&n<=18446744073709552e3)this.bufferBuilder.append(207),this.pack_uint64(n);else throw new Error("Invalid integer")},le.prototype.pack_double=function(n){var e=0;n<0&&(e=1,n=-n);var t=Math.floor(Math.log(n)/Math.LN2),i=n/Math.pow(2,t)-1,s=Math.floor(i*Math.pow(2,52)),o=Math.pow(2,32),a=e<<31|t+1023<<20|s/o&1048575,c=s%o;this.bufferBuilder.append(203),this.pack_int32(a),this.pack_int32(c)},le.prototype.pack_object=function(n){var e=Object.keys(n),t=e.length;if(t<=15)this.pack_uint8(128+t);else if(t<=65535)this.bufferBuilder.append(222),this.pack_uint16(t);else if(t<=4294967295)this.bufferBuilder.append(223),this.pack_uint32(t);else throw new Error("Invalid length");for(var i in n)n.hasOwnProperty(i)&&(this.pack(i),this.pack(n[i]))},le.prototype.pack_uint8=function(n){this.bufferBuilder.append(n)},le.prototype.pack_uint16=function(n){this.bufferBuilder.append(n>>8),this.bufferBuilder.append(n&255)},le.prototype.pack_uint32=function(n){var e=n&4294967295;this.bufferBuilder.append((e&4278190080)>>>24),this.bufferBuilder.append((e&16711680)>>>16),this.bufferBuilder.append((e&65280)>>>8),this.bufferBuilder.append(e&255)},le.prototype.pack_uint64=function(n){var e=n/Math.pow(2,32),t=n%Math.pow(2,32);this.bufferBuilder.append((e&4278190080)>>>24),this.bufferBuilder.append((e&16711680)>>>16),this.bufferBuilder.append((e&65280)>>>8),this.bufferBuilder.append(e&255),this.bufferBuilder.append((t&4278190080)>>>24),this.bufferBuilder.append((t&16711680)>>>16),this.bufferBuilder.append((t&65280)>>>8),this.bufferBuilder.append(t&255)},le.prototype.pack_int8=function(n){this.bufferBuilder.append(n&255)},le.prototype.pack_int16=function(n){this.bufferBuilder.append((n&65280)>>8),this.bufferBuilder.append(n&255)},le.prototype.pack_int32=function(n){this.bufferBuilder.append(n>>>24&255),this.bufferBuilder.append((n&16711680)>>>16),this.bufferBuilder.append((n&65280)>>>8),this.bufferBuilder.append(n&255)},le.prototype.pack_int64=function(n){var e=Math.floor(n/Math.pow(2,32)),t=n%Math.pow(2,32);this.bufferBuilder.append((e&4278190080)>>>24),this.bufferBuilder.append((e&16711680)>>>16),this.bufferBuilder.append((e&65280)>>>8),this.bufferBuilder.append(e&255),this.bufferBuilder.append((t&4278190080)>>>24),this.bufferBuilder.append((t&16711680)>>>16),this.bufferBuilder.append((t&65280)>>>8),this.bufferBuilder.append(t&255)};function El(n){var e=n.charCodeAt(0);return e<=2047?"00":e<=65535?"000":e<=2097151?"0000":e<=67108863?"00000":"000000"}function jl(n){return n.length>600?new Blob([n]).size:n.replace(/[^\u0000-\u007F]/g,El).length}const ta=Cn(Bl);let ia=!0,na=!0;function Zi(n,e,t){const i=n.match(e);return i&&i.length>=t&&parseInt(i[t],10)}function _t(n,e,t){if(!n.RTCPeerConnection)return;const i=n.RTCPeerConnection.prototype,s=i.addEventListener;i.addEventListener=function(a,c){if(a!==e)return s.apply(this,arguments);const r=l=>{const d=t(l);d&&(c.handleEvent?c.handleEvent(d):c(d))};return this._eventMap=this._eventMap||{},this._eventMap[e]||(this._eventMap[e]=new Map),this._eventMap[e].set(c,r),s.apply(this,[a,r])};const o=i.removeEventListener;i.removeEventListener=function(a,c){if(a!==e||!this._eventMap||!this._eventMap[e])return o.apply(this,arguments);if(!this._eventMap[e].has(c))return o.apply(this,arguments);const r=this._eventMap[e].get(c);return this._eventMap[e].delete(c),this._eventMap[e].size===0&&delete this._eventMap[e],Object.keys(this._eventMap).length===0&&delete this._eventMap,o.apply(this,[a,r])},Object.defineProperty(i,"on"+e,{get(){return this["_on"+e]},set(a){this["_on"+e]&&(this.removeEventListener(e,this["_on"+e]),delete this["_on"+e]),a&&this.addEventListener(e,this["_on"+e]=a)},enumerable:!0,configurable:!0})}function Ol(n){return typeof n!="boolean"?new Error("Argument type: "+typeof n+". Please use a boolean."):(ia=n,n?"adapter.js logging disabled":"adapter.js logging enabled")}function Dl(n){return typeof n!="boolean"?new Error("Argument type: "+typeof n+". Please use a boolean."):(na=!n,"adapter.js deprecation warnings "+(n?"disabled":"enabled"))}function Ms(){if(typeof window=="object"){if(ia)return;typeof console<"u"&&typeof console.log=="function"&&console.log.apply(console,arguments)}}function zn(n,e){na&&console.warn(n+" is deprecated, please use "+e+" instead.")}function _l(n){const e={browser:null,version:null};if(typeof n>"u"||!n.navigator)return e.browser="Not a browser.",e;const{navigator:t}=n;if(t.mozGetUserMedia)e.browser="firefox",e.version=Zi(t.userAgent,/Firefox\/(\d+)\./,1);else if(t.webkitGetUserMedia||n.isSecureContext===!1&&n.webkitRTCPeerConnection&&!n.RTCIceGatherer)e.browser="chrome",e.version=Zi(t.userAgent,/Chrom(e|ium)\/(\d+)\./,2);else if(t.mediaDevices&&t.userAgent.match(/Edge\/(\d+).(\d+)$/))e.browser="edge",e.version=Zi(t.userAgent,/Edge\/(\d+).(\d+)$/,2);else if(n.RTCPeerConnection&&t.userAgent.match(/AppleWebKit\/(\d+)\./))e.browser="safari",e.version=Zi(t.userAgent,/AppleWebKit\/(\d+)\./,1),e.supportsUnifiedPlan=n.RTCRtpTransceiver&&"currentDirection"in n.RTCRtpTransceiver.prototype;else return e.browser="Not a supported browser.",e;return e}function sa(n){return Object.prototype.toString.call(n)==="[object Object]"}function oa(n){return sa(n)?Object.keys(n).reduce(function(e,t){const i=sa(n[t]),s=i?oa(n[t]):n[t],o=i&&!Object.keys(s).length;return s===void 0||o?e:Object.assign(e,{[t]:s})},{}):n}function Ts(n,e,t){!e||t.has(e.id)||(t.set(e.id,e),Object.keys(e).forEach(i=>{i.endsWith("Id")?Ts(n,n.get(e[i]),t):i.endsWith("Ids")&&e[i].forEach(s=>{Ts(n,n.get(s),t)})}))}function aa(n,e,t){const i=t?"outbound-rtp":"inbound-rtp",s=new Map;if(e===null)return s;const o=[];return n.forEach(a=>{a.type==="track"&&a.trackIdentifier===e.id&&o.push(a)}),o.forEach(a=>{n.forEach(c=>{c.type===i&&c.trackId===a.id&&Ts(n,c,s)})}),s}const ra=Ms;function la(n,e){const t=n&&n.navigator;if(!t.mediaDevices)return;const i=function(c){if(typeof c!="object"||c.mandatory||c.optional)return c;const r={};return Object.keys(c).forEach(l=>{if(l==="require"||l==="advanced"||l==="mediaSource")return;const d=typeof c[l]=="object"?c[l]:{ideal:c[l]};d.exact!==void 0&&typeof d.exact=="number"&&(d.min=d.max=d.exact);const h=function(u,p){return u?u+p.charAt(0).toUpperCase()+p.slice(1):p==="deviceId"?"sourceId":p};if(d.ideal!==void 0){r.optional=r.optional||[];let u={};typeof d.ideal=="number"?(u[h("min",l)]=d.ideal,r.optional.push(u),u={},u[h("max",l)]=d.ideal,r.optional.push(u)):(u[h("",l)]=d.ideal,r.optional.push(u))}d.exact!==void 0&&typeof d.exact!="number"?(r.mandatory=r.mandatory||{},r.mandatory[h("",l)]=d.exact):["min","max"].forEach(u=>{d[u]!==void 0&&(r.mandatory=r.mandatory||{},r.mandatory[h(u,l)]=d[u])})}),c.advanced&&(r.optional=(r.optional||[]).concat(c.advanced)),r},s=function(c,r){if(e.version>=61)return r(c);if(c=JSON.parse(JSON.stringify(c)),c&&typeof c.audio=="object"){const l=function(d,h,u){h in d&&!(u in d)&&(d[u]=d[h],delete d[h])};c=JSON.parse(JSON.stringify(c)),l(c.audio,"autoGainControl","googAutoGainControl"),l(c.audio,"noiseSuppression","googNoiseSuppression"),c.audio=i(c.audio)}if(c&&typeof c.video=="object"){let l=c.video.facingMode;l=l&&(typeof l=="object"?l:{ideal:l});const d=e.version<66;if(l&&(l.exact==="user"||l.exact==="environment"||l.ideal==="user"||l.ideal==="environment")&&!(t.mediaDevices.getSupportedConstraints&&t.mediaDevices.getSupportedConstraints().facingMode&&!d)){delete c.video.facingMode;let h;if(l.exact==="environment"||l.ideal==="environment"?h=["back","rear"]:(l.exact==="user"||l.ideal==="user")&&(h=["front"]),h)return t.mediaDevices.enumerateDevices().then(u=>{u=u.filter(m=>m.kind==="videoinput");let p=u.find(m=>h.some(b=>m.label.toLowerCase().includes(b)));return!p&&u.length&&h.includes("back")&&(p=u[u.length-1]),p&&(c.video.deviceId=l.exact?{exact:p.deviceId}:{ideal:p.deviceId}),c.video=i(c.video),ra("chrome: "+JSON.stringify(c)),r(c)})}c.video=i(c.video)}return ra("chrome: "+JSON.stringify(c)),r(c)},o=function(c){return e.version>=64?c:{name:{PermissionDeniedError:"NotAllowedError",PermissionDismissedError:"NotAllowedError",InvalidStateError:"NotAllowedError",DevicesNotFoundError:"NotFoundError",ConstraintNotSatisfiedError:"OverconstrainedError",TrackStartError:"NotReadableError",MediaDeviceFailedDueToShutdown:"NotAllowedError",MediaDeviceKillSwitchOn:"NotAllowedError",TabCaptureError:"AbortError",ScreenCaptureError:"AbortError",DeviceCaptureError:"AbortError"}[c.name]||c.name,message:c.message,constraint:c.constraint||c.constraintName,toString(){return this.name+(this.message&&": ")+this.message}}},a=function(c,r,l){s(c,d=>{t.webkitGetUserMedia(d,r,h=>{l&&l(o(h))})})};if(t.getUserMedia=a.bind(t),t.mediaDevices.getUserMedia){const c=t.mediaDevices.getUserMedia.bind(t.mediaDevices);t.mediaDevices.getUserMedia=function(r){return s(r,l=>c(l).then(d=>{if(l.audio&&!d.getAudioTracks().length||l.video&&!d.getVideoTracks().length)throw d.getTracks().forEach(h=>{h.stop()}),new DOMException("","NotFoundError");return d},d=>Promise.reject(o(d))))}}}function Al(n,e){if(!(n.navigator.mediaDevices&&"getDisplayMedia"in n.navigator.mediaDevices)&&n.navigator.mediaDevices){if(typeof e!="function"){console.error("shimGetDisplayMedia: getSourceId argument is not a function");return}n.navigator.mediaDevices.getDisplayMedia=function(t){return e(t).then(i=>{const s=t.video&&t.video.width,o=t.video&&t.video.height,a=t.video&&t.video.frameRate;return t.video={mandatory:{chromeMediaSource:"desktop",chromeMediaSourceId:i,maxFrameRate:a||3}},s&&(t.video.mandatory.maxWidth=s),o&&(t.video.mandatory.maxHeight=o),n.navigator.mediaDevices.getUserMedia(t)})}}}function ca(n){n.MediaStream=n.MediaStream||n.webkitMediaStream}function da(n){if(typeof n=="object"&&n.RTCPeerConnection&&!("ontrack"in n.RTCPeerConnection.prototype)){Object.defineProperty(n.RTCPeerConnection.prototype,"ontrack",{get(){return this._ontrack},set(t){this._ontrack&&this.removeEventListener("track",this._ontrack),this.addEventListener("track",this._ontrack=t)},enumerable:!0,configurable:!0});const e=n.RTCPeerConnection.prototype.setRemoteDescription;n.RTCPeerConnection.prototype.setRemoteDescription=function(){return this._ontrackpoly||(this._ontrackpoly=t=>{t.stream.addEventListener("addtrack",i=>{let s;n.RTCPeerConnection.prototype.getReceivers?s=this.getReceivers().find(a=>a.track&&a.track.id===i.track.id):s={track:i.track};const o=new Event("track");o.track=i.track,o.receiver=s,o.transceiver={receiver:s},o.streams=[t.stream],this.dispatchEvent(o)}),t.stream.getTracks().forEach(i=>{let s;n.RTCPeerConnection.prototype.getReceivers?s=this.getReceivers().find(a=>a.track&&a.track.id===i.id):s={track:i};const o=new Event("track");o.track=i,o.receiver=s,o.transceiver={receiver:s},o.streams=[t.stream],this.dispatchEvent(o)})},this.addEventListener("addstream",this._ontrackpoly)),e.apply(this,arguments)}}else _t(n,"track",e=>(e.transceiver||Object.defineProperty(e,"transceiver",{value:{receiver:e.receiver}}),e))}function ha(n){if(typeof n=="object"&&n.RTCPeerConnection&&!("getSenders"in n.RTCPeerConnection.prototype)&&"createDTMFSender"in n.RTCPeerConnection.prototype){const e=function(s,o){return{track:o,get dtmf(){return this._dtmf===void 0&&(o.kind==="audio"?this._dtmf=s.createDTMFSender(o):this._dtmf=null),this._dtmf},_pc:s}};if(!n.RTCPeerConnection.prototype.getSenders){n.RTCPeerConnection.prototype.getSenders=function(){return this._senders=this._senders||[],this._senders.slice()};const s=n.RTCPeerConnection.prototype.addTrack;n.RTCPeerConnection.prototype.addTrack=function(a,c){let r=s.apply(this,arguments);return r||(r=e(this,a),this._senders.push(r)),r};const o=n.RTCPeerConnection.prototype.removeTrack;n.RTCPeerConnection.prototype.removeTrack=function(a){o.apply(this,arguments);const c=this._senders.indexOf(a);c!==-1&&this._senders.splice(c,1)}}const t=n.RTCPeerConnection.prototype.addStream;n.RTCPeerConnection.prototype.addStream=function(s){this._senders=this._senders||[],t.apply(this,[s]),s.getTracks().forEach(o=>{this._senders.push(e(this,o))})};const i=n.RTCPeerConnection.prototype.removeStream;n.RTCPeerConnection.prototype.removeStream=function(s){this._senders=this._senders||[],i.apply(this,[s]),s.getTracks().forEach(o=>{const a=this._senders.find(c=>c.track===o);a&&this._senders.splice(this._senders.indexOf(a),1)})}}else if(typeof n=="object"&&n.RTCPeerConnection&&"getSenders"in n.RTCPeerConnection.prototype&&"createDTMFSender"in n.RTCPeerConnection.prototype&&n.RTCRtpSender&&!("dtmf"in n.RTCRtpSender.prototype)){const e=n.RTCPeerConnection.prototype.getSenders;n.RTCPeerConnection.prototype.getSenders=function(){const t=e.apply(this,[]);return t.forEach(i=>i._pc=this),t},Object.defineProperty(n.RTCRtpSender.prototype,"dtmf",{get(){return this._dtmf===void 0&&(this.track.kind==="audio"?this._dtmf=this._pc.createDTMFSender(this.track):this._dtmf=null),this._dtmf}})}}function ua(n){if(!n.RTCPeerConnection)return;const e=n.RTCPeerConnection.prototype.getStats;n.RTCPeerConnection.prototype.getStats=function(){const[t,i,s]=arguments;if(arguments.length>0&&typeof t=="function")return e.apply(this,arguments);if(e.length===0&&(arguments.length===0||typeof t!="function"))return e.apply(this,[]);const o=function(c){const r={};return c.result().forEach(l=>{const d={id:l.id,timestamp:l.timestamp,type:{localcandidate:"local-candidate",remotecandidate:"remote-candidate"}[l.type]||l.type};l.names().forEach(h=>{d[h]=l.stat(h)}),r[d.id]=d}),r},a=function(c){return new Map(Object.keys(c).map(r=>[r,c[r]]))};if(arguments.length>=2){const c=function(r){i(a(o(r)))};return e.apply(this,[c,t])}return new Promise((c,r)=>{e.apply(this,[function(l){c(a(o(l)))},r])}).then(i,s)}}function pa(n){if(!(typeof n=="object"&&n.RTCPeerConnection&&n.RTCRtpSender&&n.RTCRtpReceiver))return;if(!("getStats"in n.RTCRtpSender.prototype)){const t=n.RTCPeerConnection.prototype.getSenders;t&&(n.RTCPeerConnection.prototype.getSenders=function(){const s=t.apply(this,[]);return s.forEach(o=>o._pc=this),s});const i=n.RTCPeerConnection.prototype.addTrack;i&&(n.RTCPeerConnection.prototype.addTrack=function(){const s=i.apply(this,arguments);return s._pc=this,s}),n.RTCRtpSender.prototype.getStats=function(){const s=this;return this._pc.getStats().then(o=>aa(o,s.track,!0))}}if(!("getStats"in n.RTCRtpReceiver.prototype)){const t=n.RTCPeerConnection.prototype.getReceivers;t&&(n.RTCPeerConnection.prototype.getReceivers=function(){const i=t.apply(this,[]);return i.forEach(s=>s._pc=this),i}),_t(n,"track",i=>(i.receiver._pc=i.srcElement,i)),n.RTCRtpReceiver.prototype.getStats=function(){const i=this;return this._pc.getStats().then(s=>aa(s,i.track,!1))}}if(!("getStats"in n.RTCRtpSender.prototype&&"getStats"in n.RTCRtpReceiver.prototype))return;const e=n.RTCPeerConnection.prototype.getStats;n.RTCPeerConnection.prototype.getStats=function(){if(arguments.length>0&&arguments[0]instanceof n.MediaStreamTrack){const t=arguments[0];let i,s,o;return this.getSenders().forEach(a=>{a.track===t&&(i?o=!0:i=a)}),this.getReceivers().forEach(a=>(a.track===t&&(s?o=!0:s=a),a.track===t)),o||i&&s?Promise.reject(new DOMException("There are more than one sender or receiver for the track.","InvalidAccessError")):i?i.getStats():s?s.getStats():Promise.reject(new DOMException("There is no sender or receiver for the track.","InvalidAccessError"))}return e.apply(this,arguments)}}function ma(n){n.RTCPeerConnection.prototype.getLocalStreams=function(){return this._shimmedLocalStreams=this._shimmedLocalStreams||{},Object.keys(this._shimmedLocalStreams).map(o=>this._shimmedLocalStreams[o][0])};const e=n.RTCPeerConnection.prototype.addTrack;n.RTCPeerConnection.prototype.addTrack=function(o,a){if(!a)return e.apply(this,arguments);this._shimmedLocalStreams=this._shimmedLocalStreams||{};const c=e.apply(this,arguments);return this._shimmedLocalStreams[a.id]?this._shimmedLocalStreams[a.id].indexOf(c)===-1&&this._shimmedLocalStreams[a.id].push(c):this._shimmedLocalStreams[a.id]=[a,c],c};const t=n.RTCPeerConnection.prototype.addStream;n.RTCPeerConnection.prototype.addStream=function(o){this._shimmedLocalStreams=this._shimmedLocalStreams||{},o.getTracks().forEach(r=>{if(this.getSenders().find(l=>l.track===r))throw new DOMException("Track already exists.","InvalidAccessError")});const a=this.getSenders();t.apply(this,arguments);const c=this.getSenders().filter(r=>a.indexOf(r)===-1);this._shimmedLocalStreams[o.id]=[o].concat(c)};const i=n.RTCPeerConnection.prototype.removeStream;n.RTCPeerConnection.prototype.removeStream=function(o){return this._shimmedLocalStreams=this._shimmedLocalStreams||{},delete this._shimmedLocalStreams[o.id],i.apply(this,arguments)};const s=n.RTCPeerConnection.prototype.removeTrack;n.RTCPeerConnection.prototype.removeTrack=function(o){return this._shimmedLocalStreams=this._shimmedLocalStreams||{},o&&Object.keys(this._shimmedLocalStreams).forEach(a=>{const c=this._shimmedLocalStreams[a].indexOf(o);c!==-1&&this._shimmedLocalStreams[a].splice(c,1),this._shimmedLocalStreams[a].length===1&&delete this._shimmedLocalStreams[a]}),s.apply(this,arguments)}}function ba(n,e){if(!n.RTCPeerConnection)return;if(n.RTCPeerConnection.prototype.addTrack&&e.version>=65)return ma(n);const t=n.RTCPeerConnection.prototype.getLocalStreams;n.RTCPeerConnection.prototype.getLocalStreams=function(){const l=t.apply(this);return this._reverseStreams=this._reverseStreams||{},l.map(d=>this._reverseStreams[d.id])};const i=n.RTCPeerConnection.prototype.addStream;n.RTCPeerConnection.prototype.addStream=function(l){if(this._streams=this._streams||{},this._reverseStreams=this._reverseStreams||{},l.getTracks().forEach(d=>{if(this.getSenders().find(h=>h.track===d))throw new DOMException("Track already exists.","InvalidAccessError")}),!this._reverseStreams[l.id]){const d=new n.MediaStream(l.getTracks());this._streams[l.id]=d,this._reverseStreams[d.id]=l,l=d}i.apply(this,[l])};const s=n.RTCPeerConnection.prototype.removeStream;n.RTCPeerConnection.prototype.removeStream=function(l){this._streams=this._streams||{},this._reverseStreams=this._reverseStreams||{},s.apply(this,[this._streams[l.id]||l]),delete this._reverseStreams[this._streams[l.id]?this._streams[l.id].id:l.id],delete this._streams[l.id]},n.RTCPeerConnection.prototype.addTrack=function(l,d){if(this.signalingState==="closed")throw new DOMException("The RTCPeerConnection's signalingState is 'closed'.","InvalidStateError");const h=[].slice.call(arguments,1);if(h.length!==1||!h[0].getTracks().find(p=>p===l))throw new DOMException("The adapter.js addTrack polyfill only supports a single stream which is associated with the specified track.","NotSupportedError");if(this.getSenders().find(p=>p.track===l))throw new DOMException("Track already exists.","InvalidAccessError");this._streams=this._streams||{},this._reverseStreams=this._reverseStreams||{};const u=this._streams[d.id];if(u)u.addTrack(l),Promise.resolve().then(()=>{this.dispatchEvent(new Event("negotiationneeded"))});else{const p=new n.MediaStream([l]);this._streams[d.id]=p,this._reverseStreams[p.id]=d,this.addStream(p)}return this.getSenders().find(p=>p.track===l)};function o(l,d){let h=d.sdp;return Object.keys(l._reverseStreams||[]).forEach(u=>{const p=l._reverseStreams[u],m=l._streams[p.id];h=h.replace(new RegExp(m.id,"g"),p.id)}),new RTCSessionDescription({type:d.type,sdp:h})}function a(l,d){let h=d.sdp;return Object.keys(l._reverseStreams||[]).forEach(u=>{const p=l._reverseStreams[u],m=l._streams[p.id];h=h.replace(new RegExp(p.id,"g"),m.id)}),new RTCSessionDescription({type:d.type,sdp:h})}["createOffer","createAnswer"].forEach(function(l){const d=n.RTCPeerConnection.prototype[l],h={[l](){const u=arguments;return arguments.length&&typeof arguments[0]=="function"?d.apply(this,[p=>{const m=o(this,p);u[0].apply(null,[m])},p=>{u[1]&&u[1].apply(null,p)},arguments[2]]):d.apply(this,arguments).then(p=>o(this,p))}};n.RTCPeerConnection.prototype[l]=h[l]});const c=n.RTCPeerConnection.prototype.setLocalDescription;n.RTCPeerConnection.prototype.setLocalDescription=function(){return!arguments.length||!arguments[0].type?c.apply(this,arguments):(arguments[0]=a(this,arguments[0]),c.apply(this,arguments))};const r=Object.getOwnPropertyDescriptor(n.RTCPeerConnection.prototype,"localDescription");Object.defineProperty(n.RTCPeerConnection.prototype,"localDescription",{get(){const l=r.get.apply(this);return l.type===""?l:o(this,l)}}),n.RTCPeerConnection.prototype.removeTrack=function(l){if(this.signalingState==="closed")throw new DOMException("The RTCPeerConnection's signalingState is 'closed'.","InvalidStateError");if(!l._pc)throw new DOMException("Argument 1 of RTCPeerConnection.removeTrack does not implement interface RTCRtpSender.","TypeError");if(l._pc!==this)throw new DOMException("Sender was not created by this connection.","InvalidAccessError");this._streams=this._streams||{};let d;Object.keys(this._streams).forEach(h=>{this._streams[h].getTracks().find(u=>l.track===u)&&(d=this._streams[h])}),d&&(d.getTracks().length===1?this.removeStream(this._reverseStreams[d.id]):d.removeTrack(l.track),this.dispatchEvent(new Event("negotiationneeded")))}}function Ys(n,e){!n.RTCPeerConnection&&n.webkitRTCPeerConnection&&(n.RTCPeerConnection=n.webkitRTCPeerConnection),n.RTCPeerConnection&&e.version<53&&["setLocalDescription","setRemoteDescription","addIceCandidate"].forEach(function(t){const i=n.RTCPeerConnection.prototype[t],s={[t](){return arguments[0]=new(t==="addIceCandidate"?n.RTCIceCandidate:n.RTCSessionDescription)(arguments[0]),i.apply(this,arguments)}};n.RTCPeerConnection.prototype[t]=s[t]})}function ya(n,e){_t(n,"negotiationneeded",t=>{const i=t.target;if(!((e.version<72||i.getConfiguration&&i.getConfiguration().sdpSemantics==="plan-b")&&i.signalingState!=="stable"))return t})}const Ga=Object.freeze(Object.defineProperty({__proto__:null,fixNegotiationNeeded:ya,shimAddTrackRemoveTrack:ba,shimAddTrackRemoveTrackWithNative:ma,shimGetDisplayMedia:Al,shimGetSendersWithDtmf:ha,shimGetStats:ua,shimGetUserMedia:la,shimMediaStream:ca,shimOnTrack:da,shimPeerConnection:Ys,shimSenderReceiverGetStats:pa},Symbol.toStringTag,{value:"Module"}));function ql(n,e){let t=!1;return n=JSON.parse(JSON.stringify(n)),n.filter(i=>{if(i&&(i.urls||i.url)){let s=i.urls||i.url;i.url&&!i.urls&&zn("RTCIceServer.url","RTCIceServer.urls");const o=typeof s=="string";return o&&(s=[s]),s=s.filter(a=>{if(a.indexOf("stun:")===0)return!1;const c=a.startsWith("turn")&&!a.startsWith("turn:[")&&a.includes("transport=udp");return c&&!t?(t=!0,!0):c&&!t}),delete i.url,i.urls=o?s[0]:s,!!s.length}})}var Za={exports:{}};(function(n){var e={};e.generateIdentifier=function(){return Math.random().toString(36).substr(2,10)},e.localCName=e.generateIdentifier(),e.splitLines=function(t){return t.trim().split(`
1
+ import{PlaneGeometry as Jo,ShaderChunk as Rl,Triangle as we,Vector3 as K,Layers as xn,MeshBasicMaterial as xs,DoubleSide as Ss,AdditiveBlending as Uo,Object3D as fs,InstancedBufferAttribute as Yt,DynamicDrawUsage as Ve,InstancedBufferGeometry as Ll,Uniform$1 as Fe,ShaderMaterial as Ws,BufferGeometry as Ot,BufferAttribute as be,Mesh as Sn,MeshStandardMaterial as xl,MeshPhysicalMaterial as Sl,Vector2 as De,Plane as Po,Line3 as rt,Sphere as wo,Matrix4 as Te,Box3 as fe,REVISION as Fo,BackSide as fl,FrontSide as Qo,Group as Wl,LineBasicMaterial as gl,BatchedMesh as Cl,Ray as zl,DataTexture as gs,NearestFilter as Dt,UnsignedIntType as yi,IntType as fn,FloatType as Gi,UnsignedByteType as Bo,UnsignedShortType as vl,ByteType as Eo,ShortType as Kl,RGBAFormat as Wn,RGBAIntegerFormat as Cs,RGFormat as Ml,RedFormat as Tl,RGIntegerFormat as jo,RedIntegerFormat as Yl,Matrix3 as Hl,Vector4 as zs}from"./three.min.js";const se={Handedness:Object.freeze({NONE:"none",LEFT:"left",RIGHT:"right"}),ComponentState:Object.freeze({DEFAULT:"default",TOUCHED:"touched",PRESSED:"pressed"}),ComponentProperty:Object.freeze({BUTTON:"button",X_AXIS:"xAxis",Y_AXIS:"yAxis",STATE:"state"}),ComponentType:Object.freeze({TRIGGER:"trigger",SQUEEZE:"squeeze",TOUCHPAD:"touchpad",THUMBSTICK:"thumbstick",BUTTON:"button"}),ButtonTouchThreshold:.05,AxisTouchThreshold:.1,VisualResponseProperty:Object.freeze({TRANSFORM:"transform",VISIBILITY:"visibility"})};async function Oo(n){const e=await fetch(n);if(e.ok)return e.json();throw new Error(e.statusText)}async function kl(n){if(!n)throw new Error("No basePath supplied");return await Oo(`${n}/profilesList.json`)}async function Nl(n,e,t=null,i=!0){if(!n)throw new Error("No xrInputSource supplied");if(!e)throw new Error("No basePath supplied");const s=await kl(e);let o;if(n.profiles.some(r=>{const l=s[r];return l&&(o={profileId:r,profilePath:`${e}/${l.path}`,deprecated:!!l.deprecated}),!!o}),!o){if(!t)throw new Error("No matching profile name found");const r=s[t];if(!r)throw new Error(`No matching profile name found and default profile "${t}" missing.`);o={profileId:t,profilePath:`${e}/${r.path}`,deprecated:!!r.deprecated}}const a=await Oo(o.profilePath);let c;if(i){let r;if(n.handedness==="any"?r=a.layouts[Object.keys(a.layouts)[0]]:r=a.layouts[n.handedness],!r)throw new Error(`No matching handedness, ${n.handedness}, in profile ${o.profileId}`);r.assetPath&&(c=o.profilePath.replace("profile.json",r.assetPath))}return{profile:a,assetPath:c}}const Il={xAxis:0,yAxis:0,button:0,state:se.ComponentState.DEFAULT};function Jl(n=0,e=0){let t=n,i=e;if(Math.sqrt(n*n+e*e)>1){const s=Math.atan2(e,n);t=Math.cos(s),i=Math.sin(s)}return{normalizedXAxis:t*.5+.5,normalizedYAxis:i*.5+.5}}class Ul{constructor(e){this.componentProperty=e.componentProperty,this.states=e.states,this.valueNodeName=e.valueNodeName,this.valueNodeProperty=e.valueNodeProperty,this.valueNodeProperty===se.VisualResponseProperty.TRANSFORM&&(this.minNodeName=e.minNodeName,this.maxNodeName=e.maxNodeName),this.value=0,this.updateFromComponent(Il)}updateFromComponent({xAxis:e,yAxis:t,button:i,state:s}){const{normalizedXAxis:o,normalizedYAxis:a}=Jl(e,t);switch(this.componentProperty){case se.ComponentProperty.X_AXIS:this.value=this.states.includes(s)?o:.5;break;case se.ComponentProperty.Y_AXIS:this.value=this.states.includes(s)?a:.5;break;case se.ComponentProperty.BUTTON:this.value=this.states.includes(s)?i:0;break;case se.ComponentProperty.STATE:this.valueNodeProperty===se.VisualResponseProperty.VISIBILITY?this.value=this.states.includes(s):this.value=this.states.includes(s)?1:0;break;default:throw new Error(`Unexpected visualResponse componentProperty ${this.componentProperty}`)}}}class Pl{constructor(e,t){if(!e||!t||!t.visualResponses||!t.gamepadIndices||Object.keys(t.gamepadIndices).length===0)throw new Error("Invalid arguments supplied");this.id=e,this.type=t.type,this.rootNodeName=t.rootNodeName,this.touchPointNodeName=t.touchPointNodeName,this.visualResponses={},Object.keys(t.visualResponses).forEach(i=>{const s=new Ul(t.visualResponses[i]);this.visualResponses[i]=s}),this.gamepadIndices=Object.assign({},t.gamepadIndices),this.values={state:se.ComponentState.DEFAULT,button:this.gamepadIndices.button!==void 0?0:void 0,xAxis:this.gamepadIndices.xAxis!==void 0?0:void 0,yAxis:this.gamepadIndices.yAxis!==void 0?0:void 0}}get data(){return{id:this.id,...this.values}}updateFromGamepad(e){if(this.values.state=se.ComponentState.DEFAULT,this.gamepadIndices.button!==void 0&&e.buttons.length>this.gamepadIndices.button){const t=e.buttons[this.gamepadIndices.button];this.values.button=t.value,this.values.button=this.values.button<0?0:this.values.button,this.values.button=this.values.button>1?1:this.values.button,t.pressed||this.values.button===1?this.values.state=se.ComponentState.PRESSED:(t.touched||this.values.button>se.ButtonTouchThreshold)&&(this.values.state=se.ComponentState.TOUCHED)}this.gamepadIndices.xAxis!==void 0&&e.axes.length>this.gamepadIndices.xAxis&&(this.values.xAxis=e.axes[this.gamepadIndices.xAxis],this.values.xAxis=this.values.xAxis<-1?-1:this.values.xAxis,this.values.xAxis=this.values.xAxis>1?1:this.values.xAxis,this.values.state===se.ComponentState.DEFAULT&&Math.abs(this.values.xAxis)>se.AxisTouchThreshold&&(this.values.state=se.ComponentState.TOUCHED)),this.gamepadIndices.yAxis!==void 0&&e.axes.length>this.gamepadIndices.yAxis&&(this.values.yAxis=e.axes[this.gamepadIndices.yAxis],this.values.yAxis=this.values.yAxis<-1?-1:this.values.yAxis,this.values.yAxis=this.values.yAxis>1?1:this.values.yAxis,this.values.state===se.ComponentState.DEFAULT&&Math.abs(this.values.yAxis)>se.AxisTouchThreshold&&(this.values.state=se.ComponentState.TOUCHED)),Object.values(this.visualResponses).forEach(t=>{t.updateFromComponent(this.values)})}}class wl{constructor(e,t,i){if(!e)throw new Error("No xrInputSource supplied");if(!t)throw new Error("No profile supplied");this.xrInputSource=e,this.assetUrl=i,this.id=t.profileId,this.layoutDescription=t.layouts[e.handedness],this.components={},Object.keys(this.layoutDescription.components).forEach(s=>{const o=this.layoutDescription.components[s];this.components[s]=new Pl(s,o)}),this.updateFromGamepad()}get gripSpace(){return this.xrInputSource.gripSpace}get targetRaySpace(){return this.xrInputSource.targetRaySpace}get data(){const e=[];return Object.values(this.components).forEach(t=>{e.push(t.data)}),e}updateFromGamepad(){Object.values(this.components).forEach(e=>{e.updateFromGamepad(this.xrInputSource.gamepad)})}}const vs=2,_e=4,lt=4,Do=4,bt=new Int32Array(2),_o=new Float32Array(bt.buffer),Ao=new Float64Array(bt.buffer),gn=new Uint16Array(new Uint8Array([1,0]).buffer)[0]===1;class pt{constructor(e,t){this.low=e|0,this.high=t|0}static create(e,t){return e==0&&t==0?pt.ZERO:new pt(e,t)}toFloat64(){return(this.low>>>0)+this.high*4294967296}equals(e){return this.low==e.low&&this.high==e.high}}pt.ZERO=new pt(0,0);var Ks;(function(n){n[n.UTF8_BYTES=1]="UTF8_BYTES",n[n.UTF16_STRING=2]="UTF16_STRING"})(Ks||(Ks={}));class Bi{constructor(e){this.bytes_=e,this.position_=0}static allocate(e){return new Bi(new Uint8Array(e))}clear(){this.position_=0}bytes(){return this.bytes_}position(){return this.position_}setPosition(e){this.position_=e}capacity(){return this.bytes_.length}readInt8(e){return this.readUint8(e)<<24>>24}readUint8(e){return this.bytes_[e]}readInt16(e){return this.readUint16(e)<<16>>16}readUint16(e){return this.bytes_[e]|this.bytes_[e+1]<<8}readInt32(e){return this.bytes_[e]|this.bytes_[e+1]<<8|this.bytes_[e+2]<<16|this.bytes_[e+3]<<24}readUint32(e){return this.readInt32(e)>>>0}readInt64(e){return new pt(this.readInt32(e),this.readInt32(e+4))}readUint64(e){return new pt(this.readUint32(e),this.readUint32(e+4))}readFloat32(e){return bt[0]=this.readInt32(e),_o[0]}readFloat64(e){return bt[gn?0:1]=this.readInt32(e),bt[gn?1:0]=this.readInt32(e+4),Ao[0]}writeInt8(e,t){this.bytes_[e]=t}writeUint8(e,t){this.bytes_[e]=t}writeInt16(e,t){this.bytes_[e]=t,this.bytes_[e+1]=t>>8}writeUint16(e,t){this.bytes_[e]=t,this.bytes_[e+1]=t>>8}writeInt32(e,t){this.bytes_[e]=t,this.bytes_[e+1]=t>>8,this.bytes_[e+2]=t>>16,this.bytes_[e+3]=t>>24}writeUint32(e,t){this.bytes_[e]=t,this.bytes_[e+1]=t>>8,this.bytes_[e+2]=t>>16,this.bytes_[e+3]=t>>24}writeInt64(e,t){this.writeInt32(e,t.low),this.writeInt32(e+4,t.high)}writeUint64(e,t){this.writeUint32(e,t.low),this.writeUint32(e+4,t.high)}writeFloat32(e,t){_o[0]=t,this.writeInt32(e,bt[0])}writeFloat64(e,t){Ao[0]=t,this.writeInt32(e,bt[gn?0:1]),this.writeInt32(e+4,bt[gn?1:0])}getBufferIdentifier(){if(this.bytes_.length<this.position_+_e+lt)throw new Error("FlatBuffers: ByteBuffer is too short to contain an identifier.");let e="";for(let t=0;t<lt;t++)e+=String.fromCharCode(this.readInt8(this.position_+_e+t));return e}__offset(e,t){const i=e-this.readInt32(e);return t<this.readInt16(i)?this.readInt16(i+t):0}__union(e,t){return e.bb_pos=t+this.readInt32(t),e.bb=this,e}__string(e,t){e+=this.readInt32(e);const i=this.readInt32(e);let s="",o=0;if(e+=_e,t===Ks.UTF8_BYTES)return this.bytes_.subarray(e,e+i);for(;o<i;){let a;const c=this.readUint8(e+o++);if(c<192)a=c;else{const r=this.readUint8(e+o++);if(c<224)a=(c&31)<<6|r&63;else{const l=this.readUint8(e+o++);if(c<240)a=(c&15)<<12|(r&63)<<6|l&63;else{const d=this.readUint8(e+o++);a=(c&7)<<18|(r&63)<<12|(l&63)<<6|d&63}}}a<65536?s+=String.fromCharCode(a):(a-=65536,s+=String.fromCharCode((a>>10)+55296,(a&1024-1)+56320))}return s}__union_with_string(e,t){return typeof e=="string"?this.__string(t):this.__union(e,t)}__indirect(e){return e+this.readInt32(e)}__vector(e){return e+this.readInt32(e)+_e}__vector_len(e){return this.readInt32(e+this.readInt32(e))}__has_identifier(e){if(e.length!=lt)throw new Error("FlatBuffers: file identifier must be length "+lt);for(let t=0;t<lt;t++)if(e.charCodeAt(t)!=this.readInt8(this.position()+_e+t))return!1;return!0}createLong(e,t){return pt.create(e,t)}createScalarList(e,t){const i=[];for(let s=0;s<t;++s)e(s)!==null&&i.push(e(s));return i}createObjList(e,t){const i=[];for(let s=0;s<t;++s){const o=e(s);o!==null&&i.push(o.unpack())}return i}}class ko{constructor(e){this.minalign=1,this.vtable=null,this.vtable_in_use=0,this.isNested=!1,this.object_start=0,this.vtables=[],this.vector_num_elems=0,this.force_defaults=!1,this.string_maps=null;let t;e?t=e:t=1024,this.bb=Bi.allocate(t),this.space=t}clear(){this.bb.clear(),this.space=this.bb.capacity(),this.minalign=1,this.vtable=null,this.vtable_in_use=0,this.isNested=!1,this.object_start=0,this.vtables=[],this.vector_num_elems=0,this.force_defaults=!1,this.string_maps=null}forceDefaults(e){this.force_defaults=e}dataBuffer(){return this.bb}asUint8Array(){return this.bb.bytes().subarray(this.bb.position(),this.bb.position()+this.offset())}prep(e,t){e>this.minalign&&(this.minalign=e);const i=~(this.bb.capacity()-this.space+t)+1&e-1;for(;this.space<i+e+t;){const s=this.bb.capacity();this.bb=ko.growByteBuffer(this.bb),this.space+=this.bb.capacity()-s}this.pad(i)}pad(e){for(let t=0;t<e;t++)this.bb.writeInt8(--this.space,0)}writeInt8(e){this.bb.writeInt8(this.space-=1,e)}writeInt16(e){this.bb.writeInt16(this.space-=2,e)}writeInt32(e){this.bb.writeInt32(this.space-=4,e)}writeInt64(e){this.bb.writeInt64(this.space-=8,e)}writeFloat32(e){this.bb.writeFloat32(this.space-=4,e)}writeFloat64(e){this.bb.writeFloat64(this.space-=8,e)}addInt8(e){this.prep(1,0),this.writeInt8(e)}addInt16(e){this.prep(2,0),this.writeInt16(e)}addInt32(e){this.prep(4,0),this.writeInt32(e)}addInt64(e){this.prep(8,0),this.writeInt64(e)}addFloat32(e){this.prep(4,0),this.writeFloat32(e)}addFloat64(e){this.prep(8,0),this.writeFloat64(e)}addFieldInt8(e,t,i){(this.force_defaults||t!=i)&&(this.addInt8(t),this.slot(e))}addFieldInt16(e,t,i){(this.force_defaults||t!=i)&&(this.addInt16(t),this.slot(e))}addFieldInt32(e,t,i){(this.force_defaults||t!=i)&&(this.addInt32(t),this.slot(e))}addFieldInt64(e,t,i){(this.force_defaults||!t.equals(i))&&(this.addInt64(t),this.slot(e))}addFieldFloat32(e,t,i){(this.force_defaults||t!=i)&&(this.addFloat32(t),this.slot(e))}addFieldFloat64(e,t,i){(this.force_defaults||t!=i)&&(this.addFloat64(t),this.slot(e))}addFieldOffset(e,t,i){(this.force_defaults||t!=i)&&(this.addOffset(t),this.slot(e))}addFieldStruct(e,t,i){t!=i&&(this.nested(t),this.slot(e))}nested(e){if(e!=this.offset())throw new Error("FlatBuffers: struct must be serialized inline.")}notNested(){if(this.isNested)throw new Error("FlatBuffers: object serialization must not be nested.")}slot(e){this.vtable!==null&&(this.vtable[e]=this.offset())}offset(){return this.bb.capacity()-this.space}static growByteBuffer(e){const t=e.capacity();if(t&3221225472)throw new Error("FlatBuffers: cannot grow buffer beyond 2 gigabytes.");const i=t<<1,s=Bi.allocate(i);return s.setPosition(i-t),s.bytes().set(e.bytes(),i-t),s}addOffset(e){this.prep(_e,0),this.writeInt32(this.offset()-e+_e)}startObject(e){this.notNested(),this.vtable==null&&(this.vtable=[]),this.vtable_in_use=e;for(let t=0;t<e;t++)this.vtable[t]=0;this.isNested=!0,this.object_start=this.offset()}endObject(){if(this.vtable==null||!this.isNested)throw new Error("FlatBuffers: endObject called without startObject");this.addInt32(0);const e=this.offset();let t=this.vtable_in_use-1;for(;t>=0&&this.vtable[t]==0;t--);const i=t+1;for(;t>=0;t--)this.addInt16(this.vtable[t]!=0?e-this.vtable[t]:0);const s=2;this.addInt16(e-this.object_start);const o=(i+s)*vs;this.addInt16(o);let a=0;const c=this.space;e:for(t=0;t<this.vtables.length;t++){const r=this.bb.capacity()-this.vtables[t];if(o==this.bb.readInt16(r)){for(let l=vs;l<o;l+=vs)if(this.bb.readInt16(c+l)!=this.bb.readInt16(r+l))continue e;a=this.vtables[t];break}}return a?(this.space=this.bb.capacity()-e,this.bb.writeInt32(this.space,a-e)):(this.vtables.push(this.offset()),this.bb.writeInt32(this.bb.capacity()-e,this.offset()-e)),this.isNested=!1,e}finish(e,t,i){const s=i?Do:0;if(t){const o=t;if(this.prep(this.minalign,_e+lt+s),o.length!=lt)throw new Error("FlatBuffers: file identifier must be length "+lt);for(let a=lt-1;a>=0;a--)this.writeInt8(o.charCodeAt(a))}this.prep(this.minalign,_e+s),this.addOffset(e),s&&this.addInt32(this.bb.capacity()-this.space),this.bb.setPosition(this.space)}finishSizePrefixed(e,t){this.finish(e,t,!0)}requiredField(e,t){const i=this.bb.capacity()-e,s=i-this.bb.readInt32(i);if(this.bb.readInt16(s+t)==0)throw new Error("FlatBuffers: field "+t+" must be set")}startVector(e,t,i){this.notNested(),this.vector_num_elems=t,this.prep(_e,e*t),this.prep(i,e*t)}endVector(){return this.writeInt32(this.vector_num_elems),this.offset()}createSharedString(e){if(!e)return 0;if(this.string_maps||(this.string_maps=new Map),this.string_maps.has(e))return this.string_maps.get(e);const t=this.createString(e);return this.string_maps.set(e,t),t}createString(e){if(!e)return 0;let t;if(e instanceof Uint8Array)t=e;else{t=[];let i=0;for(;i<e.length;){let s;const o=e.charCodeAt(i++);if(o<55296||o>=56320)s=o;else{const a=e.charCodeAt(i++);s=(o<<10)+a+(65536-56623104-56320)}s<128?t.push(s):(s<2048?t.push(s>>6&31|192):(s<65536?t.push(s>>12&15|224):t.push(s>>18&7|240,s>>12&63|128),t.push(s>>6&63|128)),t.push(s&63|128))}}this.addInt8(0),this.startVector(1,t.length,1),this.bb.setPosition(this.space-=t.length);for(let i=0,s=this.space,o=this.bb.bytes();i<t.length;i++)o[s++]=t[i];return this.endVector()}createLong(e,t){return pt.create(e,t)}createObjectOffset(e){return e===null?0:typeof e=="string"?this.createString(e):e.pack(this)}createObjectOffsetList(e){const t=[];for(let i=0;i<e.length;++i){const s=e[i];if(s!==null)t.push(this.createObjectOffset(s));else throw new Error("FlatBuffers: Argument for createObjectOffsetList cannot contain null.")}return t}createStructOffsetList(e,t){return t(this,e.length),this.createObjectOffsetList(e),this.endVector()}}function Cn(n){return n&&n.__esModule&&Object.prototype.hasOwnProperty.call(n,"default")?n.default:n}var qo={exports:{}};(function(n){var e={};e.useBlobBuilder=function(){try{return new Blob([]),!1}catch{return!0}}(),e.useArrayBufferView=!e.useBlobBuilder&&function(){try{return new Blob([new Uint8Array([])]).size===0}catch{return!0}}(),n.exports.binaryFeatures=e;var t=n.exports.BlobBuilder;typeof window<"u"&&(t=n.exports.BlobBuilder=window.WebKitBlobBuilder||window.MozBlobBuilder||window.MSBlobBuilder||window.BlobBuilder);function i(){this._pieces=[],this._parts=[]}i.prototype.append=function(s){typeof s=="number"?this._pieces.push(s):(this.flush(),this._parts.push(s))},i.prototype.flush=function(){if(this._pieces.length>0){var s=new Uint8Array(this._pieces);e.useArrayBufferView||(s=s.buffer),this._parts.push(s),this._pieces=[]}},i.prototype.getBuffer=function(){if(this.flush(),e.useBlobBuilder){for(var s=new t,o=0,a=this._parts.length;o<a;o++)s.append(this._parts[o]);return s.getBlob()}else return new Blob(this._parts)},n.exports.BufferBuilder=i})(qo);var $o=qo.exports,Fl=$o.BufferBuilder,ea=$o.binaryFeatures,Ql={unpack:function(n){var e=new re(n);return e.unpack()},pack:function(n){var e=new le;e.pack(n);var t=e.getBuffer();return t}},Bl=Ql;function re(n){this.index=0,this.dataBuffer=n,this.dataView=new Uint8Array(this.dataBuffer),this.length=this.dataBuffer.byteLength}re.prototype.unpack=function(){var n=this.unpack_uint8();if(n<128)return n;if((n^224)<32)return(n^224)-32;var e;if((e=n^160)<=15)return this.unpack_raw(e);if((e=n^176)<=15)return this.unpack_string(e);if((e=n^144)<=15)return this.unpack_array(e);if((e=n^128)<=15)return this.unpack_map(e);switch(n){case 192:return null;case 193:return;case 194:return!1;case 195:return!0;case 202:return this.unpack_float();case 203:return this.unpack_double();case 204:return this.unpack_uint8();case 205:return this.unpack_uint16();case 206:return this.unpack_uint32();case 207:return this.unpack_uint64();case 208:return this.unpack_int8();case 209:return this.unpack_int16();case 210:return this.unpack_int32();case 211:return this.unpack_int64();case 212:return;case 213:return;case 214:return;case 215:return;case 216:return e=this.unpack_uint16(),this.unpack_string(e);case 217:return e=this.unpack_uint32(),this.unpack_string(e);case 218:return e=this.unpack_uint16(),this.unpack_raw(e);case 219:return e=this.unpack_uint32(),this.unpack_raw(e);case 220:return e=this.unpack_uint16(),this.unpack_array(e);case 221:return e=this.unpack_uint32(),this.unpack_array(e);case 222:return e=this.unpack_uint16(),this.unpack_map(e);case 223:return e=this.unpack_uint32(),this.unpack_map(e)}},re.prototype.unpack_uint8=function(){var n=this.dataView[this.index]&255;return this.index++,n},re.prototype.unpack_uint16=function(){var n=this.read(2),e=(n[0]&255)*256+(n[1]&255);return this.index+=2,e},re.prototype.unpack_uint32=function(){var n=this.read(4),e=((n[0]*256+n[1])*256+n[2])*256+n[3];return this.index+=4,e},re.prototype.unpack_uint64=function(){var n=this.read(8),e=((((((n[0]*256+n[1])*256+n[2])*256+n[3])*256+n[4])*256+n[5])*256+n[6])*256+n[7];return this.index+=8,e},re.prototype.unpack_int8=function(){var n=this.unpack_uint8();return n<128?n:n-256},re.prototype.unpack_int16=function(){var n=this.unpack_uint16();return n<32768?n:n-65536},re.prototype.unpack_int32=function(){var n=this.unpack_uint32();return n<Math.pow(2,31)?n:n-Math.pow(2,32)},re.prototype.unpack_int64=function(){var n=this.unpack_uint64();return n<Math.pow(2,63)?n:n-Math.pow(2,64)},re.prototype.unpack_raw=function(n){if(this.length<this.index+n)throw new Error("BinaryPackFailure: index is out of range "+this.index+" "+n+" "+this.length);var e=this.dataBuffer.slice(this.index,this.index+n);return this.index+=n,e},re.prototype.unpack_string=function(n){for(var e=this.read(n),t=0,i="",s,o;t<n;)s=e[t],s<128?(i+=String.fromCharCode(s),t++):(s^192)<32?(o=(s^192)<<6|e[t+1]&63,i+=String.fromCharCode(o),t+=2):(o=(s&15)<<12|(e[t+1]&63)<<6|e[t+2]&63,i+=String.fromCharCode(o),t+=3);return this.index+=n,i},re.prototype.unpack_array=function(n){for(var e=new Array(n),t=0;t<n;t++)e[t]=this.unpack();return e},re.prototype.unpack_map=function(n){for(var e={},t=0;t<n;t++){var i=this.unpack(),s=this.unpack();e[i]=s}return e},re.prototype.unpack_float=function(){var n=this.unpack_uint32(),e=n>>31,t=(n>>23&255)-127,i=n&8388607|8388608;return(e===0?1:-1)*i*Math.pow(2,t-23)},re.prototype.unpack_double=function(){var n=this.unpack_uint32(),e=this.unpack_uint32(),t=n>>31,i=(n>>20&2047)-1023,s=n&1048575|1048576,o=s*Math.pow(2,i-20)+e*Math.pow(2,i-52);return(t===0?1:-1)*o},re.prototype.read=function(n){var e=this.index;if(e+n<=this.length)return this.dataView.subarray(e,e+n);throw new Error("BinaryPackFailure: read index out of range")};function le(){this.bufferBuilder=new Fl}le.prototype.getBuffer=function(){return this.bufferBuilder.getBuffer()},le.prototype.pack=function(n){var e=typeof n;if(e==="string")this.pack_string(n);else if(e==="number")Math.floor(n)===n?this.pack_integer(n):this.pack_double(n);else if(e==="boolean")n===!0?this.bufferBuilder.append(195):n===!1&&this.bufferBuilder.append(194);else if(e==="undefined")this.bufferBuilder.append(192);else if(e==="object")if(n===null)this.bufferBuilder.append(192);else{var t=n.constructor;if(t==Array)this.pack_array(n);else if(t==Blob||t==File||n instanceof Blob||n instanceof File)this.pack_bin(n);else if(t==ArrayBuffer)ea.useArrayBufferView?this.pack_bin(new Uint8Array(n)):this.pack_bin(n);else if("BYTES_PER_ELEMENT"in n)ea.useArrayBufferView?this.pack_bin(new Uint8Array(n.buffer)):this.pack_bin(n.buffer);else if(t==Object||t.toString().startsWith("class"))this.pack_object(n);else if(t==Date)this.pack_string(n.toString());else if(typeof n.toBinaryPack=="function")this.bufferBuilder.append(n.toBinaryPack());else throw new Error('Type "'+t.toString()+'" not yet supported')}else throw new Error('Type "'+e+'" not yet supported');this.bufferBuilder.flush()},le.prototype.pack_bin=function(n){var e=n.length||n.byteLength||n.size;if(e<=15)this.pack_uint8(160+e);else if(e<=65535)this.bufferBuilder.append(218),this.pack_uint16(e);else if(e<=4294967295)this.bufferBuilder.append(219),this.pack_uint32(e);else throw new Error("Invalid length");this.bufferBuilder.append(n)},le.prototype.pack_string=function(n){var e=jl(n);if(e<=15)this.pack_uint8(176+e);else if(e<=65535)this.bufferBuilder.append(216),this.pack_uint16(e);else if(e<=4294967295)this.bufferBuilder.append(217),this.pack_uint32(e);else throw new Error("Invalid length");this.bufferBuilder.append(n)},le.prototype.pack_array=function(n){var e=n.length;if(e<=15)this.pack_uint8(144+e);else if(e<=65535)this.bufferBuilder.append(220),this.pack_uint16(e);else if(e<=4294967295)this.bufferBuilder.append(221),this.pack_uint32(e);else throw new Error("Invalid length");for(var t=0;t<e;t++)this.pack(n[t])},le.prototype.pack_integer=function(n){if(n>=-32&&n<=127)this.bufferBuilder.append(n&255);else if(n>=0&&n<=255)this.bufferBuilder.append(204),this.pack_uint8(n);else if(n>=-128&&n<=127)this.bufferBuilder.append(208),this.pack_int8(n);else if(n>=0&&n<=65535)this.bufferBuilder.append(205),this.pack_uint16(n);else if(n>=-32768&&n<=32767)this.bufferBuilder.append(209),this.pack_int16(n);else if(n>=0&&n<=4294967295)this.bufferBuilder.append(206),this.pack_uint32(n);else if(n>=-2147483648&&n<=2147483647)this.bufferBuilder.append(210),this.pack_int32(n);else if(n>=-9223372036854776e3&&n<=9223372036854776e3)this.bufferBuilder.append(211),this.pack_int64(n);else if(n>=0&&n<=18446744073709552e3)this.bufferBuilder.append(207),this.pack_uint64(n);else throw new Error("Invalid integer")},le.prototype.pack_double=function(n){var e=0;n<0&&(e=1,n=-n);var t=Math.floor(Math.log(n)/Math.LN2),i=n/Math.pow(2,t)-1,s=Math.floor(i*Math.pow(2,52)),o=Math.pow(2,32),a=e<<31|t+1023<<20|s/o&1048575,c=s%o;this.bufferBuilder.append(203),this.pack_int32(a),this.pack_int32(c)},le.prototype.pack_object=function(n){var e=Object.keys(n),t=e.length;if(t<=15)this.pack_uint8(128+t);else if(t<=65535)this.bufferBuilder.append(222),this.pack_uint16(t);else if(t<=4294967295)this.bufferBuilder.append(223),this.pack_uint32(t);else throw new Error("Invalid length");for(var i in n)n.hasOwnProperty(i)&&(this.pack(i),this.pack(n[i]))},le.prototype.pack_uint8=function(n){this.bufferBuilder.append(n)},le.prototype.pack_uint16=function(n){this.bufferBuilder.append(n>>8),this.bufferBuilder.append(n&255)},le.prototype.pack_uint32=function(n){var e=n&4294967295;this.bufferBuilder.append((e&4278190080)>>>24),this.bufferBuilder.append((e&16711680)>>>16),this.bufferBuilder.append((e&65280)>>>8),this.bufferBuilder.append(e&255)},le.prototype.pack_uint64=function(n){var e=n/Math.pow(2,32),t=n%Math.pow(2,32);this.bufferBuilder.append((e&4278190080)>>>24),this.bufferBuilder.append((e&16711680)>>>16),this.bufferBuilder.append((e&65280)>>>8),this.bufferBuilder.append(e&255),this.bufferBuilder.append((t&4278190080)>>>24),this.bufferBuilder.append((t&16711680)>>>16),this.bufferBuilder.append((t&65280)>>>8),this.bufferBuilder.append(t&255)},le.prototype.pack_int8=function(n){this.bufferBuilder.append(n&255)},le.prototype.pack_int16=function(n){this.bufferBuilder.append((n&65280)>>8),this.bufferBuilder.append(n&255)},le.prototype.pack_int32=function(n){this.bufferBuilder.append(n>>>24&255),this.bufferBuilder.append((n&16711680)>>>16),this.bufferBuilder.append((n&65280)>>>8),this.bufferBuilder.append(n&255)},le.prototype.pack_int64=function(n){var e=Math.floor(n/Math.pow(2,32)),t=n%Math.pow(2,32);this.bufferBuilder.append((e&4278190080)>>>24),this.bufferBuilder.append((e&16711680)>>>16),this.bufferBuilder.append((e&65280)>>>8),this.bufferBuilder.append(e&255),this.bufferBuilder.append((t&4278190080)>>>24),this.bufferBuilder.append((t&16711680)>>>16),this.bufferBuilder.append((t&65280)>>>8),this.bufferBuilder.append(t&255)};function El(n){var e=n.charCodeAt(0);return e<=2047?"00":e<=65535?"000":e<=2097151?"0000":e<=67108863?"00000":"000000"}function jl(n){return n.length>600?new Blob([n]).size:n.replace(/[^\u0000-\u007F]/g,El).length}const ta=Cn(Bl);let ia=!0,na=!0;function Zi(n,e,t){const i=n.match(e);return i&&i.length>=t&&parseInt(i[t],10)}function _t(n,e,t){if(!n.RTCPeerConnection)return;const i=n.RTCPeerConnection.prototype,s=i.addEventListener;i.addEventListener=function(a,c){if(a!==e)return s.apply(this,arguments);const r=l=>{const d=t(l);d&&(c.handleEvent?c.handleEvent(d):c(d))};return this._eventMap=this._eventMap||{},this._eventMap[e]||(this._eventMap[e]=new Map),this._eventMap[e].set(c,r),s.apply(this,[a,r])};const o=i.removeEventListener;i.removeEventListener=function(a,c){if(a!==e||!this._eventMap||!this._eventMap[e])return o.apply(this,arguments);if(!this._eventMap[e].has(c))return o.apply(this,arguments);const r=this._eventMap[e].get(c);return this._eventMap[e].delete(c),this._eventMap[e].size===0&&delete this._eventMap[e],Object.keys(this._eventMap).length===0&&delete this._eventMap,o.apply(this,[a,r])},Object.defineProperty(i,"on"+e,{get(){return this["_on"+e]},set(a){this["_on"+e]&&(this.removeEventListener(e,this["_on"+e]),delete this["_on"+e]),a&&this.addEventListener(e,this["_on"+e]=a)},enumerable:!0,configurable:!0})}function Ol(n){return typeof n!="boolean"?new Error("Argument type: "+typeof n+". Please use a boolean."):(ia=n,n?"adapter.js logging disabled":"adapter.js logging enabled")}function Dl(n){return typeof n!="boolean"?new Error("Argument type: "+typeof n+". Please use a boolean."):(na=!n,"adapter.js deprecation warnings "+(n?"disabled":"enabled"))}function Ms(){if(typeof window=="object"){if(ia)return;typeof console<"u"&&typeof console.log=="function"&&console.log.apply(console,arguments)}}function zn(n,e){na&&console.warn(n+" is deprecated, please use "+e+" instead.")}function _l(n){const e={browser:null,version:null};if(typeof n>"u"||!n.navigator)return e.browser="Not a browser.",e;const{navigator:t}=n;if(t.mozGetUserMedia)e.browser="firefox",e.version=Zi(t.userAgent,/Firefox\/(\d+)\./,1);else if(t.webkitGetUserMedia||n.isSecureContext===!1&&n.webkitRTCPeerConnection&&!n.RTCIceGatherer)e.browser="chrome",e.version=Zi(t.userAgent,/Chrom(e|ium)\/(\d+)\./,2);else if(t.mediaDevices&&t.userAgent.match(/Edge\/(\d+).(\d+)$/))e.browser="edge",e.version=Zi(t.userAgent,/Edge\/(\d+).(\d+)$/,2);else if(n.RTCPeerConnection&&t.userAgent.match(/AppleWebKit\/(\d+)\./))e.browser="safari",e.version=Zi(t.userAgent,/AppleWebKit\/(\d+)\./,1),e.supportsUnifiedPlan=n.RTCRtpTransceiver&&"currentDirection"in n.RTCRtpTransceiver.prototype;else return e.browser="Not a supported browser.",e;return e}function sa(n){return Object.prototype.toString.call(n)==="[object Object]"}function oa(n){return sa(n)?Object.keys(n).reduce(function(e,t){const i=sa(n[t]),s=i?oa(n[t]):n[t],o=i&&!Object.keys(s).length;return s===void 0||o?e:Object.assign(e,{[t]:s})},{}):n}function Ts(n,e,t){!e||t.has(e.id)||(t.set(e.id,e),Object.keys(e).forEach(i=>{i.endsWith("Id")?Ts(n,n.get(e[i]),t):i.endsWith("Ids")&&e[i].forEach(s=>{Ts(n,n.get(s),t)})}))}function aa(n,e,t){const i=t?"outbound-rtp":"inbound-rtp",s=new Map;if(e===null)return s;const o=[];return n.forEach(a=>{a.type==="track"&&a.trackIdentifier===e.id&&o.push(a)}),o.forEach(a=>{n.forEach(c=>{c.type===i&&c.trackId===a.id&&Ts(n,c,s)})}),s}const ra=Ms;function la(n,e){const t=n&&n.navigator;if(!t.mediaDevices)return;const i=function(c){if(typeof c!="object"||c.mandatory||c.optional)return c;const r={};return Object.keys(c).forEach(l=>{if(l==="require"||l==="advanced"||l==="mediaSource")return;const d=typeof c[l]=="object"?c[l]:{ideal:c[l]};d.exact!==void 0&&typeof d.exact=="number"&&(d.min=d.max=d.exact);const h=function(u,p){return u?u+p.charAt(0).toUpperCase()+p.slice(1):p==="deviceId"?"sourceId":p};if(d.ideal!==void 0){r.optional=r.optional||[];let u={};typeof d.ideal=="number"?(u[h("min",l)]=d.ideal,r.optional.push(u),u={},u[h("max",l)]=d.ideal,r.optional.push(u)):(u[h("",l)]=d.ideal,r.optional.push(u))}d.exact!==void 0&&typeof d.exact!="number"?(r.mandatory=r.mandatory||{},r.mandatory[h("",l)]=d.exact):["min","max"].forEach(u=>{d[u]!==void 0&&(r.mandatory=r.mandatory||{},r.mandatory[h(u,l)]=d[u])})}),c.advanced&&(r.optional=(r.optional||[]).concat(c.advanced)),r},s=function(c,r){if(e.version>=61)return r(c);if(c=JSON.parse(JSON.stringify(c)),c&&typeof c.audio=="object"){const l=function(d,h,u){h in d&&!(u in d)&&(d[u]=d[h],delete d[h])};c=JSON.parse(JSON.stringify(c)),l(c.audio,"autoGainControl","googAutoGainControl"),l(c.audio,"noiseSuppression","googNoiseSuppression"),c.audio=i(c.audio)}if(c&&typeof c.video=="object"){let l=c.video.facingMode;l=l&&(typeof l=="object"?l:{ideal:l});const d=e.version<66;if(l&&(l.exact==="user"||l.exact==="environment"||l.ideal==="user"||l.ideal==="environment")&&!(t.mediaDevices.getSupportedConstraints&&t.mediaDevices.getSupportedConstraints().facingMode&&!d)){delete c.video.facingMode;let h;if(l.exact==="environment"||l.ideal==="environment"?h=["back","rear"]:(l.exact==="user"||l.ideal==="user")&&(h=["front"]),h)return t.mediaDevices.enumerateDevices().then(u=>{u=u.filter(m=>m.kind==="videoinput");let p=u.find(m=>h.some(b=>m.label.toLowerCase().includes(b)));return!p&&u.length&&h.includes("back")&&(p=u[u.length-1]),p&&(c.video.deviceId=l.exact?{exact:p.deviceId}:{ideal:p.deviceId}),c.video=i(c.video),ra("chrome: "+JSON.stringify(c)),r(c)})}c.video=i(c.video)}return ra("chrome: "+JSON.stringify(c)),r(c)},o=function(c){return e.version>=64?c:{name:{PermissionDeniedError:"NotAllowedError",PermissionDismissedError:"NotAllowedError",InvalidStateError:"NotAllowedError",DevicesNotFoundError:"NotFoundError",ConstraintNotSatisfiedError:"OverconstrainedError",TrackStartError:"NotReadableError",MediaDeviceFailedDueToShutdown:"NotAllowedError",MediaDeviceKillSwitchOn:"NotAllowedError",TabCaptureError:"AbortError",ScreenCaptureError:"AbortError",DeviceCaptureError:"AbortError"}[c.name]||c.name,message:c.message,constraint:c.constraint||c.constraintName,toString(){return this.name+(this.message&&": ")+this.message}}},a=function(c,r,l){s(c,d=>{t.webkitGetUserMedia(d,r,h=>{l&&l(o(h))})})};if(t.getUserMedia=a.bind(t),t.mediaDevices.getUserMedia){const c=t.mediaDevices.getUserMedia.bind(t.mediaDevices);t.mediaDevices.getUserMedia=function(r){return s(r,l=>c(l).then(d=>{if(l.audio&&!d.getAudioTracks().length||l.video&&!d.getVideoTracks().length)throw d.getTracks().forEach(h=>{h.stop()}),new DOMException("","NotFoundError");return d},d=>Promise.reject(o(d))))}}}function Al(n,e){if(!(n.navigator.mediaDevices&&"getDisplayMedia"in n.navigator.mediaDevices)&&n.navigator.mediaDevices){if(typeof e!="function"){console.error("shimGetDisplayMedia: getSourceId argument is not a function");return}n.navigator.mediaDevices.getDisplayMedia=function(t){return e(t).then(i=>{const s=t.video&&t.video.width,o=t.video&&t.video.height,a=t.video&&t.video.frameRate;return t.video={mandatory:{chromeMediaSource:"desktop",chromeMediaSourceId:i,maxFrameRate:a||3}},s&&(t.video.mandatory.maxWidth=s),o&&(t.video.mandatory.maxHeight=o),n.navigator.mediaDevices.getUserMedia(t)})}}}function ca(n){n.MediaStream=n.MediaStream||n.webkitMediaStream}function da(n){if(typeof n=="object"&&n.RTCPeerConnection&&!("ontrack"in n.RTCPeerConnection.prototype)){Object.defineProperty(n.RTCPeerConnection.prototype,"ontrack",{get(){return this._ontrack},set(t){this._ontrack&&this.removeEventListener("track",this._ontrack),this.addEventListener("track",this._ontrack=t)},enumerable:!0,configurable:!0});const e=n.RTCPeerConnection.prototype.setRemoteDescription;n.RTCPeerConnection.prototype.setRemoteDescription=function(){return this._ontrackpoly||(this._ontrackpoly=t=>{t.stream.addEventListener("addtrack",i=>{let s;n.RTCPeerConnection.prototype.getReceivers?s=this.getReceivers().find(a=>a.track&&a.track.id===i.track.id):s={track:i.track};const o=new Event("track");o.track=i.track,o.receiver=s,o.transceiver={receiver:s},o.streams=[t.stream],this.dispatchEvent(o)}),t.stream.getTracks().forEach(i=>{let s;n.RTCPeerConnection.prototype.getReceivers?s=this.getReceivers().find(a=>a.track&&a.track.id===i.id):s={track:i};const o=new Event("track");o.track=i,o.receiver=s,o.transceiver={receiver:s},o.streams=[t.stream],this.dispatchEvent(o)})},this.addEventListener("addstream",this._ontrackpoly)),e.apply(this,arguments)}}else _t(n,"track",e=>(e.transceiver||Object.defineProperty(e,"transceiver",{value:{receiver:e.receiver}}),e))}function ha(n){if(typeof n=="object"&&n.RTCPeerConnection&&!("getSenders"in n.RTCPeerConnection.prototype)&&"createDTMFSender"in n.RTCPeerConnection.prototype){const e=function(s,o){return{track:o,get dtmf(){return this._dtmf===void 0&&(o.kind==="audio"?this._dtmf=s.createDTMFSender(o):this._dtmf=null),this._dtmf},_pc:s}};if(!n.RTCPeerConnection.prototype.getSenders){n.RTCPeerConnection.prototype.getSenders=function(){return this._senders=this._senders||[],this._senders.slice()};const s=n.RTCPeerConnection.prototype.addTrack;n.RTCPeerConnection.prototype.addTrack=function(a,c){let r=s.apply(this,arguments);return r||(r=e(this,a),this._senders.push(r)),r};const o=n.RTCPeerConnection.prototype.removeTrack;n.RTCPeerConnection.prototype.removeTrack=function(a){o.apply(this,arguments);const c=this._senders.indexOf(a);c!==-1&&this._senders.splice(c,1)}}const t=n.RTCPeerConnection.prototype.addStream;n.RTCPeerConnection.prototype.addStream=function(s){this._senders=this._senders||[],t.apply(this,[s]),s.getTracks().forEach(o=>{this._senders.push(e(this,o))})};const i=n.RTCPeerConnection.prototype.removeStream;n.RTCPeerConnection.prototype.removeStream=function(s){this._senders=this._senders||[],i.apply(this,[s]),s.getTracks().forEach(o=>{const a=this._senders.find(c=>c.track===o);a&&this._senders.splice(this._senders.indexOf(a),1)})}}else if(typeof n=="object"&&n.RTCPeerConnection&&"getSenders"in n.RTCPeerConnection.prototype&&"createDTMFSender"in n.RTCPeerConnection.prototype&&n.RTCRtpSender&&!("dtmf"in n.RTCRtpSender.prototype)){const e=n.RTCPeerConnection.prototype.getSenders;n.RTCPeerConnection.prototype.getSenders=function(){const t=e.apply(this,[]);return t.forEach(i=>i._pc=this),t},Object.defineProperty(n.RTCRtpSender.prototype,"dtmf",{get(){return this._dtmf===void 0&&(this.track.kind==="audio"?this._dtmf=this._pc.createDTMFSender(this.track):this._dtmf=null),this._dtmf}})}}function ua(n){if(!n.RTCPeerConnection)return;const e=n.RTCPeerConnection.prototype.getStats;n.RTCPeerConnection.prototype.getStats=function(){const[t,i,s]=arguments;if(arguments.length>0&&typeof t=="function")return e.apply(this,arguments);if(e.length===0&&(arguments.length===0||typeof t!="function"))return e.apply(this,[]);const o=function(c){const r={};return c.result().forEach(l=>{const d={id:l.id,timestamp:l.timestamp,type:{localcandidate:"local-candidate",remotecandidate:"remote-candidate"}[l.type]||l.type};l.names().forEach(h=>{d[h]=l.stat(h)}),r[d.id]=d}),r},a=function(c){return new Map(Object.keys(c).map(r=>[r,c[r]]))};if(arguments.length>=2){const c=function(r){i(a(o(r)))};return e.apply(this,[c,t])}return new Promise((c,r)=>{e.apply(this,[function(l){c(a(o(l)))},r])}).then(i,s)}}function pa(n){if(!(typeof n=="object"&&n.RTCPeerConnection&&n.RTCRtpSender&&n.RTCRtpReceiver))return;if(!("getStats"in n.RTCRtpSender.prototype)){const t=n.RTCPeerConnection.prototype.getSenders;t&&(n.RTCPeerConnection.prototype.getSenders=function(){const s=t.apply(this,[]);return s.forEach(o=>o._pc=this),s});const i=n.RTCPeerConnection.prototype.addTrack;i&&(n.RTCPeerConnection.prototype.addTrack=function(){const s=i.apply(this,arguments);return s._pc=this,s}),n.RTCRtpSender.prototype.getStats=function(){const s=this;return this._pc.getStats().then(o=>aa(o,s.track,!0))}}if(!("getStats"in n.RTCRtpReceiver.prototype)){const t=n.RTCPeerConnection.prototype.getReceivers;t&&(n.RTCPeerConnection.prototype.getReceivers=function(){const i=t.apply(this,[]);return i.forEach(s=>s._pc=this),i}),_t(n,"track",i=>(i.receiver._pc=i.srcElement,i)),n.RTCRtpReceiver.prototype.getStats=function(){const i=this;return this._pc.getStats().then(s=>aa(s,i.track,!1))}}if(!("getStats"in n.RTCRtpSender.prototype&&"getStats"in n.RTCRtpReceiver.prototype))return;const e=n.RTCPeerConnection.prototype.getStats;n.RTCPeerConnection.prototype.getStats=function(){if(arguments.length>0&&arguments[0]instanceof n.MediaStreamTrack){const t=arguments[0];let i,s,o;return this.getSenders().forEach(a=>{a.track===t&&(i?o=!0:i=a)}),this.getReceivers().forEach(a=>(a.track===t&&(s?o=!0:s=a),a.track===t)),o||i&&s?Promise.reject(new DOMException("There are more than one sender or receiver for the track.","InvalidAccessError")):i?i.getStats():s?s.getStats():Promise.reject(new DOMException("There is no sender or receiver for the track.","InvalidAccessError"))}return e.apply(this,arguments)}}function ma(n){n.RTCPeerConnection.prototype.getLocalStreams=function(){return this._shimmedLocalStreams=this._shimmedLocalStreams||{},Object.keys(this._shimmedLocalStreams).map(o=>this._shimmedLocalStreams[o][0])};const e=n.RTCPeerConnection.prototype.addTrack;n.RTCPeerConnection.prototype.addTrack=function(o,a){if(!a)return e.apply(this,arguments);this._shimmedLocalStreams=this._shimmedLocalStreams||{};const c=e.apply(this,arguments);return this._shimmedLocalStreams[a.id]?this._shimmedLocalStreams[a.id].indexOf(c)===-1&&this._shimmedLocalStreams[a.id].push(c):this._shimmedLocalStreams[a.id]=[a,c],c};const t=n.RTCPeerConnection.prototype.addStream;n.RTCPeerConnection.prototype.addStream=function(o){this._shimmedLocalStreams=this._shimmedLocalStreams||{},o.getTracks().forEach(r=>{if(this.getSenders().find(l=>l.track===r))throw new DOMException("Track already exists.","InvalidAccessError")});const a=this.getSenders();t.apply(this,arguments);const c=this.getSenders().filter(r=>a.indexOf(r)===-1);this._shimmedLocalStreams[o.id]=[o].concat(c)};const i=n.RTCPeerConnection.prototype.removeStream;n.RTCPeerConnection.prototype.removeStream=function(o){return this._shimmedLocalStreams=this._shimmedLocalStreams||{},delete this._shimmedLocalStreams[o.id],i.apply(this,arguments)};const s=n.RTCPeerConnection.prototype.removeTrack;n.RTCPeerConnection.prototype.removeTrack=function(o){return this._shimmedLocalStreams=this._shimmedLocalStreams||{},o&&Object.keys(this._shimmedLocalStreams).forEach(a=>{const c=this._shimmedLocalStreams[a].indexOf(o);c!==-1&&this._shimmedLocalStreams[a].splice(c,1),this._shimmedLocalStreams[a].length===1&&delete this._shimmedLocalStreams[a]}),s.apply(this,arguments)}}function ba(n,e){if(!n.RTCPeerConnection)return;if(n.RTCPeerConnection.prototype.addTrack&&e.version>=65)return ma(n);const t=n.RTCPeerConnection.prototype.getLocalStreams;n.RTCPeerConnection.prototype.getLocalStreams=function(){const l=t.apply(this);return this._reverseStreams=this._reverseStreams||{},l.map(d=>this._reverseStreams[d.id])};const i=n.RTCPeerConnection.prototype.addStream;n.RTCPeerConnection.prototype.addStream=function(l){if(this._streams=this._streams||{},this._reverseStreams=this._reverseStreams||{},l.getTracks().forEach(d=>{if(this.getSenders().find(h=>h.track===d))throw new DOMException("Track already exists.","InvalidAccessError")}),!this._reverseStreams[l.id]){const d=new n.MediaStream(l.getTracks());this._streams[l.id]=d,this._reverseStreams[d.id]=l,l=d}i.apply(this,[l])};const s=n.RTCPeerConnection.prototype.removeStream;n.RTCPeerConnection.prototype.removeStream=function(l){this._streams=this._streams||{},this._reverseStreams=this._reverseStreams||{},s.apply(this,[this._streams[l.id]||l]),delete this._reverseStreams[this._streams[l.id]?this._streams[l.id].id:l.id],delete this._streams[l.id]},n.RTCPeerConnection.prototype.addTrack=function(l,d){if(this.signalingState==="closed")throw new DOMException("The RTCPeerConnection's signalingState is 'closed'.","InvalidStateError");const h=[].slice.call(arguments,1);if(h.length!==1||!h[0].getTracks().find(p=>p===l))throw new DOMException("The adapter.js addTrack polyfill only supports a single stream which is associated with the specified track.","NotSupportedError");if(this.getSenders().find(p=>p.track===l))throw new DOMException("Track already exists.","InvalidAccessError");this._streams=this._streams||{},this._reverseStreams=this._reverseStreams||{};const u=this._streams[d.id];if(u)u.addTrack(l),Promise.resolve().then(()=>{this.dispatchEvent(new Event("negotiationneeded"))});else{const p=new n.MediaStream([l]);this._streams[d.id]=p,this._reverseStreams[p.id]=d,this.addStream(p)}return this.getSenders().find(p=>p.track===l)};function o(l,d){let h=d.sdp;return Object.keys(l._reverseStreams||[]).forEach(u=>{const p=l._reverseStreams[u],m=l._streams[p.id];h=h.replace(new RegExp(m.id,"g"),p.id)}),new RTCSessionDescription({type:d.type,sdp:h})}function a(l,d){let h=d.sdp;return Object.keys(l._reverseStreams||[]).forEach(u=>{const p=l._reverseStreams[u],m=l._streams[p.id];h=h.replace(new RegExp(p.id,"g"),m.id)}),new RTCSessionDescription({type:d.type,sdp:h})}["createOffer","createAnswer"].forEach(function(l){const d=n.RTCPeerConnection.prototype[l],h={[l](){const u=arguments;return arguments.length&&typeof arguments[0]=="function"?d.apply(this,[p=>{const m=o(this,p);u[0].apply(null,[m])},p=>{u[1]&&u[1].apply(null,p)},arguments[2]]):d.apply(this,arguments).then(p=>o(this,p))}};n.RTCPeerConnection.prototype[l]=h[l]});const c=n.RTCPeerConnection.prototype.setLocalDescription;n.RTCPeerConnection.prototype.setLocalDescription=function(){return!arguments.length||!arguments[0].type?c.apply(this,arguments):(arguments[0]=a(this,arguments[0]),c.apply(this,arguments))};const r=Object.getOwnPropertyDescriptor(n.RTCPeerConnection.prototype,"localDescription");Object.defineProperty(n.RTCPeerConnection.prototype,"localDescription",{get(){const l=r.get.apply(this);return l.type===""?l:o(this,l)}}),n.RTCPeerConnection.prototype.removeTrack=function(l){if(this.signalingState==="closed")throw new DOMException("The RTCPeerConnection's signalingState is 'closed'.","InvalidStateError");if(!l._pc)throw new DOMException("Argument 1 of RTCPeerConnection.removeTrack does not implement interface RTCRtpSender.","TypeError");if(l._pc!==this)throw new DOMException("Sender was not created by this connection.","InvalidAccessError");this._streams=this._streams||{};let d;Object.keys(this._streams).forEach(h=>{this._streams[h].getTracks().find(u=>l.track===u)&&(d=this._streams[h])}),d&&(d.getTracks().length===1?this.removeStream(this._reverseStreams[d.id]):d.removeTrack(l.track),this.dispatchEvent(new Event("negotiationneeded")))}}function Ys(n,e){!n.RTCPeerConnection&&n.webkitRTCPeerConnection&&(n.RTCPeerConnection=n.webkitRTCPeerConnection),n.RTCPeerConnection&&e.version<53&&["setLocalDescription","setRemoteDescription","addIceCandidate"].forEach(function(t){const i=n.RTCPeerConnection.prototype[t],s={[t](){return arguments[0]=new(t==="addIceCandidate"?n.RTCIceCandidate:n.RTCSessionDescription)(arguments[0]),i.apply(this,arguments)}};n.RTCPeerConnection.prototype[t]=s[t]})}function ya(n,e){_t(n,"negotiationneeded",t=>{const i=t.target;if(!((e.version<72||i.getConfiguration&&i.getConfiguration().sdpSemantics==="plan-b")&&i.signalingState!=="stable"))return t})}const Ga=Object.freeze(Object.defineProperty({__proto__:null,fixNegotiationNeeded:ya,shimAddTrackRemoveTrack:ba,shimAddTrackRemoveTrackWithNative:ma,shimGetDisplayMedia:Al,shimGetSendersWithDtmf:ha,shimGetStats:ua,shimGetUserMedia:la,shimMediaStream:ca,shimOnTrack:da,shimPeerConnection:Ys,shimSenderReceiverGetStats:pa},Symbol.toStringTag,{value:"Module"}));function ql(n,e){let t=!1;return n=JSON.parse(JSON.stringify(n)),n.filter(i=>{if(i&&(i.urls||i.url)){let s=i.urls||i.url;i.url&&!i.urls&&zn("RTCIceServer.url","RTCIceServer.urls");const o=typeof s=="string";return o&&(s=[s]),s=s.filter(a=>{if(a.indexOf("stun:")===0)return!1;const c=a.startsWith("turn")&&!a.startsWith("turn:[")&&a.includes("transport=udp");return c&&!t?(t=!0,!0):c&&!t}),delete i.url,i.urls=o?s[0]:s,!!s.length}})}var Za={exports:{}};(function(n){var e={};e.generateIdentifier=function(){return Math.random().toString(36).substr(2,10)},e.localCName=e.generateIdentifier(),e.splitLines=function(t){return t.trim().split(`
2
2
  `).map(function(i){return i.trim()})},e.splitSections=function(t){var i=t.split(`
3
3
  m=`);return i.map(function(s,o){return(o>0?"m="+s:s).trim()+`\r
4
4
  `})},e.getDescription=function(t){var i=e.splitSections(t);return i&&i[0]},e.getMediaSections=function(t){var i=e.splitSections(t);return i.shift(),i},e.matchPrefix=function(t,i){return e.splitLines(t).filter(function(s){return s.indexOf(i)===0})},e.parseCandidate=function(t){var i;t.indexOf("a=candidate:")===0?i=t.substring(12).split(" "):i=t.substring(10).split(" ");for(var s={foundation:i[0],component:parseInt(i[1],10),protocol:i[2].toLowerCase(),priority:parseInt(i[3],10),ip:i[4],address:i[4],port:parseInt(i[5],10),type:i[7]},o=8;o<i.length;o+=2)switch(i[o]){case"raddr":s.relatedAddress=i[o+1];break;case"rport":s.relatedPort=parseInt(i[o+1],10);break;case"tcptype":s.tcpType=i[o+1];break;case"ufrag":s.ufrag=i[o+1],s.usernameFragment=i[o+1];break;default:s[i[o]]=i[o+1];break}return s},e.writeCandidate=function(t){var i=[];i.push(t.foundation),i.push(t.component),i.push(t.protocol.toUpperCase()),i.push(t.priority),i.push(t.address||t.ip),i.push(t.port);var s=t.type;return i.push("typ"),i.push(s),s!=="host"&&t.relatedAddress&&t.relatedPort&&(i.push("raddr"),i.push(t.relatedAddress),i.push("rport"),i.push(t.relatedPort)),t.tcpType&&t.protocol.toLowerCase()==="tcp"&&(i.push("tcptype"),i.push(t.tcpType)),(t.usernameFragment||t.ufrag)&&(i.push("ufrag"),i.push(t.usernameFragment||t.ufrag)),"candidate:"+i.join(" ")},e.parseIceOptions=function(t){return t.substr(14).split(" ")},e.parseRtpMap=function(t){var i=t.substr(9).split(" "),s={payloadType:parseInt(i.shift(),10)};return i=i[0].split("/"),s.name=i[0],s.clockRate=parseInt(i[1],10),s.channels=i.length===3?parseInt(i[2],10):1,s.numChannels=s.channels,s},e.writeRtpMap=function(t){var i=t.payloadType;t.preferredPayloadType!==void 0&&(i=t.preferredPayloadType);var s=t.channels||t.numChannels||1;return"a=rtpmap:"+i+" "+t.name+"/"+t.clockRate+(s!==1?"/"+s:"")+`\r
@@ -1602,4 +1602,4 @@ struct BVH {
1602
1602
  `,ku=Object.freeze(Object.defineProperty({__proto__:null,bvh_distance_functions:yl,bvh_ray_functions:Gl,bvh_struct_definitions:Zl,common_functions:bl},Symbol.toStringTag,{value:"Module"})),Nu=Zl,Iu=yl,Ju=`
1603
1603
  ${bl}
1604
1604
  ${Gl}
1605
- `,Uu=Object.freeze(Object.defineProperty({__proto__:null,AVERAGE:Kr,BVHShaderGLSL:ku,CENTER:lo,CONTAINED:co,ExtendedTriangle:He,FloatVertexAttributeTexture:ll,INTERSECTED:rh,IntVertexAttributeTexture:Wu,MeshBVH:xt,MeshBVHHelper:Io,MeshBVHUniformStruct:gu,NOT_INTERSECTED:ah,OrientedBox:Xe,SAH:Mr,StaticGeometryGenerator:Hu,UIntVertexAttributeTexture:rl,VertexAttributeTexture:ys,acceleratedRaycast:Gu,computeBatchedBoundsTree:Lu,computeBoundsTree:Vu,disposeBatchedBoundsTree:xu,disposeBoundsTree:Ru,estimateMemoryInBytes:hu,getBVHExtremes:du,getJSONStructure:pu,getTriangleHitPointInfo:Mh,shaderDistanceFunction:Iu,shaderIntersectFunction:Ju,shaderStructs:Nu,validateBounds:uu},Symbol.toStringTag,{value:"Module"}));class Pu{constructor(e){this.name="WorkerBase",this.running=!1,this.worker=e,this.worker.onerror=t=>{throw t.message?new Error(`${this.name}: Could not create Web Worker with error "${t.message}"`):new Error(`${this.name}: Could not create Web Worker.`)}}runTask(){}generate(...e){if(this.running)throw new Error("GenerateMeshBVHWorker: Already running job.");if(this.worker===null)throw new Error("GenerateMeshBVHWorker: Worker has been disposed.");this.running=!0;const t=this.runTask(this.worker,...e);return t.finally(()=>{this.running=!1}),t}dispose(){this.worker.terminate(),this.worker=null}}const Xl="KGZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiO3ZhciBBbj10eXBlb2YgZG9jdW1lbnQ8InUiP2RvY3VtZW50LmN1cnJlbnRTY3JpcHQ6bnVsbDsvKioKICogQGxpY2Vuc2UKICogQ29weXJpZ2h0IDIwMTAtMjAyNCBUaHJlZS5qcyBBdXRob3JzCiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVQKICovY29uc3QgWGU9IjE2OSIsVmk9MCxVaT0xLEVvPTIsTW49MCxraT0zMDAsQ289MzAxLEZvPTMwMixIaT0xZTMsX3M9MTAwMSxxaT0xMDAyLHpzPTEwMDMsJGk9MTAwNixHaT0xMDA4LFJvPTEwMDksQm89MTAxMyxXaT0xMDE0LElvPTEwMTUsdm89MTAxNixQbz0xMDIwLExvPTEwMjMsU249MTAyNixYaT0xMDI3LFlpPTAsT289MSxicz0iIiwkdD0ic3JnYiIsRXM9InNyZ2ItbGluZWFyIixEbz0iZGlzcGxheS1wMyIsWmk9ImRpc3BsYXktcDMtbGluZWFyIixfbj0ibGluZWFyIixKaT0ic3JnYiIsamk9InJlYzcwOSIsUWk9InAzIixDcz0zNTA0NCxZZT0yZTMsem49MjAwMTtjbGFzcyBaZXthZGRFdmVudExpc3RlbmVyKHQsZSl7dGhpcy5fbGlzdGVuZXJzPT09dm9pZCAwJiYodGhpcy5fbGlzdGVuZXJzPXt9KTtjb25zdCBzPXRoaXMuX2xpc3RlbmVycztzW3RdPT09dm9pZCAwJiYoc1t0XT1bXSksc1t0XS5pbmRleE9mKGUpPT09LTEmJnNbdF0ucHVzaChlKX1oYXNFdmVudExpc3RlbmVyKHQsZSl7aWYodGhpcy5fbGlzdGVuZXJzPT09dm9pZCAwKXJldHVybiExO2NvbnN0IHM9dGhpcy5fbGlzdGVuZXJzO3JldHVybiBzW3RdIT09dm9pZCAwJiZzW3RdLmluZGV4T2YoZSkhPT0tMX1yZW1vdmVFdmVudExpc3RlbmVyKHQsZSl7aWYodGhpcy5fbGlzdGVuZXJzPT09dm9pZCAwKXJldHVybjtjb25zdCBuPXRoaXMuX2xpc3RlbmVyc1t0XTtpZihuIT09dm9pZCAwKXtjb25zdCBpPW4uaW5kZXhPZihlKTtpIT09LTEmJm4uc3BsaWNlKGksMSl9fWRpc3BhdGNoRXZlbnQodCl7aWYodGhpcy5fbGlzdGVuZXJzPT09dm9pZCAwKXJldHVybjtjb25zdCBzPXRoaXMuX2xpc3RlbmVyc1t0LnR5cGVdO2lmKHMhPT12b2lkIDApe3QudGFyZ2V0PXRoaXM7Y29uc3Qgbj1zLnNsaWNlKDApO2ZvcihsZXQgaT0wLG89bi5sZW5ndGg7aTxvO2krKyluW2ldLmNhbGwodGhpcyx0KTt0LnRhcmdldD1udWxsfX19Y29uc3Qgb3Q9WyIwMCIsIjAxIiwiMDIiLCIwMyIsIjA0IiwiMDUiLCIwNiIsIjA3IiwiMDgiLCIwOSIsIjBhIiwiMGIiLCIwYyIsIjBkIiwiMGUiLCIwZiIsIjEwIiwiMTEiLCIxMiIsIjEzIiwiMTQiLCIxNSIsIjE2IiwiMTciLCIxOCIsIjE5IiwiMWEiLCIxYiIsIjFjIiwiMWQiLCIxZSIsIjFmIiwiMjAiLCIyMSIsIjIyIiwiMjMiLCIyNCIsIjI1IiwiMjYiLCIyNyIsIjI4IiwiMjkiLCIyYSIsIjJiIiwiMmMiLCIyZCIsIjJlIiwiMmYiLCIzMCIsIjMxIiwiMzIiLCIzMyIsIjM0IiwiMzUiLCIzNiIsIjM3IiwiMzgiLCIzOSIsIjNhIiwiM2IiLCIzYyIsIjNkIiwiM2UiLCIzZiIsIjQwIiwiNDEiLCI0MiIsIjQzIiwiNDQiLCI0NSIsIjQ2IiwiNDciLCI0OCIsIjQ5IiwiNGEiLCI0YiIsIjRjIiwiNGQiLCI0ZSIsIjRmIiwiNTAiLCI1MSIsIjUyIiwiNTMiLCI1NCIsIjU1IiwiNTYiLCI1NyIsIjU4IiwiNTkiLCI1YSIsIjViIiwiNWMiLCI1ZCIsIjVlIiwiNWYiLCI2MCIsIjYxIiwiNjIiLCI2MyIsIjY0IiwiNjUiLCI2NiIsIjY3IiwiNjgiLCI2OSIsIjZhIiwiNmIiLCI2YyIsIjZkIiwiNmUiLCI2ZiIsIjcwIiwiNzEiLCI3MiIsIjczIiwiNzQiLCI3NSIsIjc2IiwiNzciLCI3OCIsIjc5IiwiN2EiLCI3YiIsIjdjIiwiN2QiLCI3ZSIsIjdmIiwiODAiLCI4MSIsIjgyIiwiODMiLCI4NCIsIjg1IiwiODYiLCI4NyIsIjg4IiwiODkiLCI4YSIsIjhiIiwiOGMiLCI4ZCIsIjhlIiwiOGYiLCI5MCIsIjkxIiwiOTIiLCI5MyIsIjk0IiwiOTUiLCI5NiIsIjk3IiwiOTgiLCI5OSIsIjlhIiwiOWIiLCI5YyIsIjlkIiwiOWUiLCI5ZiIsImEwIiwiYTEiLCJhMiIsImEzIiwiYTQiLCJhNSIsImE2IiwiYTciLCJhOCIsImE5IiwiYWEiLCJhYiIsImFjIiwiYWQiLCJhZSIsImFmIiwiYjAiLCJiMSIsImIyIiwiYjMiLCJiNCIsImI1IiwiYjYiLCJiNyIsImI4IiwiYjkiLCJiYSIsImJiIiwiYmMiLCJiZCIsImJlIiwiYmYiLCJjMCIsImMxIiwiYzIiLCJjMyIsImM0IiwiYzUiLCJjNiIsImM3IiwiYzgiLCJjOSIsImNhIiwiY2IiLCJjYyIsImNkIiwiY2UiLCJjZiIsImQwIiwiZDEiLCJkMiIsImQzIiwiZDQiLCJkNSIsImQ2IiwiZDciLCJkOCIsImQ5IiwiZGEiLCJkYiIsImRjIiwiZGQiLCJkZSIsImRmIiwiZTAiLCJlMSIsImUyIiwiZTMiLCJlNCIsImU1IiwiZTYiLCJlNyIsImU4IiwiZTkiLCJlYSIsImViIiwiZWMiLCJlZCIsImVlIiwiZWYiLCJmMCIsImYxIiwiZjIiLCJmMyIsImY0IiwiZjUiLCJmNiIsImY3IiwiZjgiLCJmOSIsImZhIiwiZmIiLCJmYyIsImZkIiwiZmUiLCJmZiJdO2xldCBLaT0xMjM0NTY3O2NvbnN0IHRyPU1hdGguUEkvMTgwLGVyPTE4MC9NYXRoLlBJO2Z1bmN0aW9uIEt0KCl7Y29uc3Qgcj1NYXRoLnJhbmRvbSgpKjQyOTQ5NjcyOTV8MCx0PU1hdGgucmFuZG9tKCkqNDI5NDk2NzI5NXwwLGU9TWF0aC5yYW5kb20oKSo0Mjk0OTY3Mjk1fDAscz1NYXRoLnJhbmRvbSgpKjQyOTQ5NjcyOTV8MDtyZXR1cm4ob3RbciYyNTVdK290W3I+PjgmMjU1XStvdFtyPj4xNiYyNTVdK290W3I+PjI0JjI1NV0rIi0iK290W3QmMjU1XStvdFt0Pj44JjI1NV0rIi0iK290W3Q+PjE2JjE1fDY0XStvdFt0Pj4yNCYyNTVdKyItIitvdFtlJjYzfDEyOF0rb3RbZT4+OCYyNTVdKyItIitvdFtlPj4xNiYyNTVdK290W2U+PjI0JjI1NV0rb3RbcyYyNTVdK290W3M+PjgmMjU1XStvdFtzPj4xNiYyNTVdK290W3M+PjI0JjI1NV0pLnRvTG93ZXJDYXNlKCl9ZnVuY3Rpb24gYXQocix0LGUpe3JldHVybiBNYXRoLm1heCh0LE1hdGgubWluKGUscikpfWZ1bmN0aW9uIGJuKHIsdCl7cmV0dXJuKHIldCt0KSV0fWZ1bmN0aW9uIFZvKHIsdCxlLHMsbil7cmV0dXJuIHMrKHItdCkqKG4tcykvKGUtdCl9ZnVuY3Rpb24gVW8ocix0LGUpe3JldHVybiByIT09dD8oZS1yKS8odC1yKTowfWZ1bmN0aW9uIEplKHIsdCxlKXtyZXR1cm4oMS1lKSpyK2UqdH1mdW5jdGlvbiBrbyhyLHQsZSxzKXtyZXR1cm4gSmUocix0LDEtTWF0aC5leHAoLWUqcykpfWZ1bmN0aW9uIEhvKHIsdD0xKXtyZXR1cm4gdC1NYXRoLmFicyhibihyLHQqMiktdCl9ZnVuY3Rpb24gcW8ocix0LGUpe3JldHVybiByPD10PzA6cj49ZT8xOihyPShyLXQpLyhlLXQpLHIqciooMy0yKnIpKX1mdW5jdGlvbiAkbyhyLHQsZSl7cmV0dXJuIHI8PXQ/MDpyPj1lPzE6KHI9KHItdCkvKGUtdCkscipyKnIqKHIqKHIqNi0xNSkrMTApKX1mdW5jdGlvbiBHbyhyLHQpe3JldHVybiByK01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSoodC1yKzEpKX1mdW5jdGlvbiBXbyhyLHQpe3JldHVybiByK01hdGgucmFuZG9tKCkqKHQtcil9ZnVuY3Rpb24gWG8ocil7cmV0dXJuIHIqKC41LU1hdGgucmFuZG9tKCkpfWZ1bmN0aW9uIFlvKHIpe3IhPT12b2lkIDAmJihLaT1yKTtsZXQgdD1LaSs9MTgzMTU2NTgxMztyZXR1cm4gdD1NYXRoLmltdWwodF50Pj4+MTUsdHwxKSx0Xj10K01hdGguaW11bCh0XnQ+Pj43LHR8NjEpLCgodF50Pj4+MTQpPj4+MCkvNDI5NDk2NzI5Nn1mdW5jdGlvbiBabyhyKXtyZXR1cm4gcip0cn1mdW5jdGlvbiBKbyhyKXtyZXR1cm4gciplcn1mdW5jdGlvbiBqbyhyKXtyZXR1cm4ociZyLTEpPT09MCYmciE9PTB9ZnVuY3Rpb24gUW8ocil7cmV0dXJuIE1hdGgucG93KDIsTWF0aC5jZWlsKE1hdGgubG9nKHIpL01hdGguTE4yKSl9ZnVuY3Rpb24gS28ocil7cmV0dXJuIE1hdGgucG93KDIsTWF0aC5mbG9vcihNYXRoLmxvZyhyKS9NYXRoLkxOMikpfWZ1bmN0aW9uIHRhKHIsdCxlLHMsbil7Y29uc3QgaT1NYXRoLmNvcyxvPU1hdGguc2luLGE9aShlLzIpLGM9byhlLzIpLHU9aSgodCtzKS8yKSxoPW8oKHQrcykvMiksbD1pKCh0LXMpLzIpLGQ9bygodC1zKS8yKSxmPWkoKHMtdCkvMikscD1vKChzLXQpLzIpO3N3aXRjaChuKXtjYXNlIlhZWCI6ci5zZXQoYSpoLGMqbCxjKmQsYSp1KTticmVhaztjYXNlIllaWSI6ci5zZXQoYypkLGEqaCxjKmwsYSp1KTticmVhaztjYXNlIlpYWiI6ci5zZXQoYypsLGMqZCxhKmgsYSp1KTticmVhaztjYXNlIlhaWCI6ci5zZXQoYSpoLGMqcCxjKmYsYSp1KTticmVhaztjYXNlIllYWSI6ci5zZXQoYypmLGEqaCxjKnAsYSp1KTticmVhaztjYXNlIlpZWiI6ci5zZXQoYypwLGMqZixhKmgsYSp1KTticmVhaztkZWZhdWx0OmNvbnNvbGUud2FybigiVEhSRUUuTWF0aFV0aWxzOiAuc2V0UXVhdGVybmlvbkZyb21Qcm9wZXJFdWxlcigpIGVuY291bnRlcmVkIGFuIHVua25vd24gb3JkZXI6ICIrbil9fWZ1bmN0aW9uIEV0KHIsdCl7c3dpdGNoKHQuY29uc3RydWN0b3Ipe2Nhc2UgRmxvYXQzMkFycmF5OnJldHVybiByO2Nhc2UgVWludDMyQXJyYXk6cmV0dXJuIHIvNDI5NDk2NzI5NTtjYXNlIFVpbnQxNkFycmF5OnJldHVybiByLzY1NTM1O2Nhc2UgVWludDhBcnJheTpyZXR1cm4gci8yNTU7Y2FzZSBJbnQzMkFycmF5OnJldHVybiBNYXRoLm1heChyLzIxNDc0ODM2NDcsLTEpO2Nhc2UgSW50MTZBcnJheTpyZXR1cm4gTWF0aC5tYXgoci8zMjc2NywtMSk7Y2FzZSBJbnQ4QXJyYXk6cmV0dXJuIE1hdGgubWF4KHIvMTI3LC0xKTtkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiSW52YWxpZCBjb21wb25lbnQgdHlwZS4iKX19ZnVuY3Rpb24gJChyLHQpe3N3aXRjaCh0LmNvbnN0cnVjdG9yKXtjYXNlIEZsb2F0MzJBcnJheTpyZXR1cm4gcjtjYXNlIFVpbnQzMkFycmF5OnJldHVybiBNYXRoLnJvdW5kKHIqNDI5NDk2NzI5NSk7Y2FzZSBVaW50MTZBcnJheTpyZXR1cm4gTWF0aC5yb3VuZChyKjY1NTM1KTtjYXNlIFVpbnQ4QXJyYXk6cmV0dXJuIE1hdGgucm91bmQocioyNTUpO2Nhc2UgSW50MzJBcnJheTpyZXR1cm4gTWF0aC5yb3VuZChyKjIxNDc0ODM2NDcpO2Nhc2UgSW50MTZBcnJheTpyZXR1cm4gTWF0aC5yb3VuZChyKjMyNzY3KTtjYXNlIEludDhBcnJheTpyZXR1cm4gTWF0aC5yb3VuZChyKjEyNyk7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgY29tcG9uZW50IHR5cGUuIil9fWNvbnN0IGVhPXtERUcyUkFEOnRyLFJBRDJERUc6ZXIsZ2VuZXJhdGVVVUlEOkt0LGNsYW1wOmF0LGV1Y2xpZGVhbk1vZHVsbzpibixtYXBMaW5lYXI6Vm8saW52ZXJzZUxlcnA6VW8sbGVycDpKZSxkYW1wOmtvLHBpbmdwb25nOkhvLHNtb290aHN0ZXA6cW8sc21vb3RoZXJzdGVwOiRvLHJhbmRJbnQ6R28scmFuZEZsb2F0OldvLHJhbmRGbG9hdFNwcmVhZDpYbyxzZWVkZWRSYW5kb206WW8sZGVnVG9SYWQ6Wm8scmFkVG9EZWc6Sm8saXNQb3dlck9mVHdvOmpvLGNlaWxQb3dlck9mVHdvOlFvLGZsb29yUG93ZXJPZlR3bzpLbyxzZXRRdWF0ZXJuaW9uRnJvbVByb3BlckV1bGVyOnRhLG5vcm1hbGl6ZTokLGRlbm9ybWFsaXplOkV0fTtjbGFzcyBKe2NvbnN0cnVjdG9yKHQ9MCxlPTApe0oucHJvdG90eXBlLmlzVmVjdG9yMj0hMCx0aGlzLng9dCx0aGlzLnk9ZX1nZXQgd2lkdGgoKXtyZXR1cm4gdGhpcy54fXNldCB3aWR0aCh0KXt0aGlzLng9dH1nZXQgaGVpZ2h0KCl7cmV0dXJuIHRoaXMueX1zZXQgaGVpZ2h0KHQpe3RoaXMueT10fXNldCh0LGUpe3JldHVybiB0aGlzLng9dCx0aGlzLnk9ZSx0aGlzfXNldFNjYWxhcih0KXtyZXR1cm4gdGhpcy54PXQsdGhpcy55PXQsdGhpc31zZXRYKHQpe3JldHVybiB0aGlzLng9dCx0aGlzfXNldFkodCl7cmV0dXJuIHRoaXMueT10LHRoaXN9c2V0Q29tcG9uZW50KHQsZSl7c3dpdGNoKHQpe2Nhc2UgMDp0aGlzLng9ZTticmVhaztjYXNlIDE6dGhpcy55PWU7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoImluZGV4IGlzIG91dCBvZiByYW5nZTogIit0KX1yZXR1cm4gdGhpc31nZXRDb21wb25lbnQodCl7c3dpdGNoKHQpe2Nhc2UgMDpyZXR1cm4gdGhpcy54O2Nhc2UgMTpyZXR1cm4gdGhpcy55O2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJpbmRleCBpcyBvdXQgb2YgcmFuZ2U6ICIrdCl9fWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMueCx0aGlzLnkpfWNvcHkodCl7cmV0dXJuIHRoaXMueD10LngsdGhpcy55PXQueSx0aGlzfWFkZCh0KXtyZXR1cm4gdGhpcy54Kz10LngsdGhpcy55Kz10LnksdGhpc31hZGRTY2FsYXIodCl7cmV0dXJuIHRoaXMueCs9dCx0aGlzLnkrPXQsdGhpc31hZGRWZWN0b3JzKHQsZSl7cmV0dXJuIHRoaXMueD10LngrZS54LHRoaXMueT10LnkrZS55LHRoaXN9YWRkU2NhbGVkVmVjdG9yKHQsZSl7cmV0dXJuIHRoaXMueCs9dC54KmUsdGhpcy55Kz10LnkqZSx0aGlzfXN1Yih0KXtyZXR1cm4gdGhpcy54LT10LngsdGhpcy55LT10LnksdGhpc31zdWJTY2FsYXIodCl7cmV0dXJuIHRoaXMueC09dCx0aGlzLnktPXQsdGhpc31zdWJWZWN0b3JzKHQsZSl7cmV0dXJuIHRoaXMueD10LngtZS54LHRoaXMueT10LnktZS55LHRoaXN9bXVsdGlwbHkodCl7cmV0dXJuIHRoaXMueCo9dC54LHRoaXMueSo9dC55LHRoaXN9bXVsdGlwbHlTY2FsYXIodCl7cmV0dXJuIHRoaXMueCo9dCx0aGlzLnkqPXQsdGhpc31kaXZpZGUodCl7cmV0dXJuIHRoaXMueC89dC54LHRoaXMueS89dC55LHRoaXN9ZGl2aWRlU2NhbGFyKHQpe3JldHVybiB0aGlzLm11bHRpcGx5U2NhbGFyKDEvdCl9YXBwbHlNYXRyaXgzKHQpe2NvbnN0IGU9dGhpcy54LHM9dGhpcy55LG49dC5lbGVtZW50cztyZXR1cm4gdGhpcy54PW5bMF0qZStuWzNdKnMrbls2XSx0aGlzLnk9blsxXSplK25bNF0qcytuWzddLHRoaXN9bWluKHQpe3JldHVybiB0aGlzLng9TWF0aC5taW4odGhpcy54LHQueCksdGhpcy55PU1hdGgubWluKHRoaXMueSx0LnkpLHRoaXN9bWF4KHQpe3JldHVybiB0aGlzLng9TWF0aC5tYXgodGhpcy54LHQueCksdGhpcy55PU1hdGgubWF4KHRoaXMueSx0LnkpLHRoaXN9Y2xhbXAodCxlKXtyZXR1cm4gdGhpcy54PU1hdGgubWF4KHQueCxNYXRoLm1pbihlLngsdGhpcy54KSksdGhpcy55PU1hdGgubWF4KHQueSxNYXRoLm1pbihlLnksdGhpcy55KSksdGhpc31jbGFtcFNjYWxhcih0LGUpe3JldHVybiB0aGlzLng9TWF0aC5tYXgodCxNYXRoLm1pbihlLHRoaXMueCkpLHRoaXMueT1NYXRoLm1heCh0LE1hdGgubWluKGUsdGhpcy55KSksdGhpc31jbGFtcExlbmd0aCh0LGUpe2NvbnN0IHM9dGhpcy5sZW5ndGgoKTtyZXR1cm4gdGhpcy5kaXZpZGVTY2FsYXIoc3x8MSkubXVsdGlwbHlTY2FsYXIoTWF0aC5tYXgodCxNYXRoLm1pbihlLHMpKSl9Zmxvb3IoKXtyZXR1cm4gdGhpcy54PU1hdGguZmxvb3IodGhpcy54KSx0aGlzLnk9TWF0aC5mbG9vcih0aGlzLnkpLHRoaXN9Y2VpbCgpe3JldHVybiB0aGlzLng9TWF0aC5jZWlsKHRoaXMueCksdGhpcy55PU1hdGguY2VpbCh0aGlzLnkpLHRoaXN9cm91bmQoKXtyZXR1cm4gdGhpcy54PU1hdGgucm91bmQodGhpcy54KSx0aGlzLnk9TWF0aC5yb3VuZCh0aGlzLnkpLHRoaXN9cm91bmRUb1plcm8oKXtyZXR1cm4gdGhpcy54PU1hdGgudHJ1bmModGhpcy54KSx0aGlzLnk9TWF0aC50cnVuYyh0aGlzLnkpLHRoaXN9bmVnYXRlKCl7cmV0dXJuIHRoaXMueD0tdGhpcy54LHRoaXMueT0tdGhpcy55LHRoaXN9ZG90KHQpe3JldHVybiB0aGlzLngqdC54K3RoaXMueSp0Lnl9Y3Jvc3ModCl7cmV0dXJuIHRoaXMueCp0LnktdGhpcy55KnQueH1sZW5ndGhTcSgpe3JldHVybiB0aGlzLngqdGhpcy54K3RoaXMueSp0aGlzLnl9bGVuZ3RoKCl7cmV0dXJuIE1hdGguc3FydCh0aGlzLngqdGhpcy54K3RoaXMueSp0aGlzLnkpfW1hbmhhdHRhbkxlbmd0aCgpe3JldHVybiBNYXRoLmFicyh0aGlzLngpK01hdGguYWJzKHRoaXMueSl9bm9ybWFsaXplKCl7cmV0dXJuIHRoaXMuZGl2aWRlU2NhbGFyKHRoaXMubGVuZ3RoKCl8fDEpfWFuZ2xlKCl7cmV0dXJuIE1hdGguYXRhbjIoLXRoaXMueSwtdGhpcy54KStNYXRoLlBJfWFuZ2xlVG8odCl7Y29uc3QgZT1NYXRoLnNxcnQodGhpcy5sZW5ndGhTcSgpKnQubGVuZ3RoU3EoKSk7aWYoZT09PTApcmV0dXJuIE1hdGguUEkvMjtjb25zdCBzPXRoaXMuZG90KHQpL2U7cmV0dXJuIE1hdGguYWNvcyhhdChzLC0xLDEpKX1kaXN0YW5jZVRvKHQpe3JldHVybiBNYXRoLnNxcnQodGhpcy5kaXN0YW5jZVRvU3F1YXJlZCh0KSl9ZGlzdGFuY2VUb1NxdWFyZWQodCl7Y29uc3QgZT10aGlzLngtdC54LHM9dGhpcy55LXQueTtyZXR1cm4gZSplK3Mqc31tYW5oYXR0YW5EaXN0YW5jZVRvKHQpe3JldHVybiBNYXRoLmFicyh0aGlzLngtdC54KStNYXRoLmFicyh0aGlzLnktdC55KX1zZXRMZW5ndGgodCl7cmV0dXJuIHRoaXMubm9ybWFsaXplKCkubXVsdGlwbHlTY2FsYXIodCl9bGVycCh0LGUpe3JldHVybiB0aGlzLngrPSh0LngtdGhpcy54KSplLHRoaXMueSs9KHQueS10aGlzLnkpKmUsdGhpc31sZXJwVmVjdG9ycyh0LGUscyl7cmV0dXJuIHRoaXMueD10LngrKGUueC10LngpKnMsdGhpcy55PXQueSsoZS55LXQueSkqcyx0aGlzfWVxdWFscyh0KXtyZXR1cm4gdC54PT09dGhpcy54JiZ0Lnk9PT10aGlzLnl9ZnJvbUFycmF5KHQsZT0wKXtyZXR1cm4gdGhpcy54PXRbZV0sdGhpcy55PXRbZSsxXSx0aGlzfXRvQXJyYXkodD1bXSxlPTApe3JldHVybiB0W2VdPXRoaXMueCx0W2UrMV09dGhpcy55LHR9ZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0LGUpe3JldHVybiB0aGlzLng9dC5nZXRYKGUpLHRoaXMueT10LmdldFkoZSksdGhpc31yb3RhdGVBcm91bmQodCxlKXtjb25zdCBzPU1hdGguY29zKGUpLG49TWF0aC5zaW4oZSksaT10aGlzLngtdC54LG89dGhpcy55LXQueTtyZXR1cm4gdGhpcy54PWkqcy1vKm4rdC54LHRoaXMueT1pKm4rbypzK3QueSx0aGlzfXJhbmRvbSgpe3JldHVybiB0aGlzLng9TWF0aC5yYW5kb20oKSx0aGlzLnk9TWF0aC5yYW5kb20oKSx0aGlzfSpbU3ltYm9sLml0ZXJhdG9yXSgpe3lpZWxkIHRoaXMueCx5aWVsZCB0aGlzLnl9fWNsYXNzIEN0e2NvbnN0cnVjdG9yKHQsZSxzLG4saSxvLGEsYyx1KXtDdC5wcm90b3R5cGUuaXNNYXRyaXgzPSEwLHRoaXMuZWxlbWVudHM9WzEsMCwwLDAsMSwwLDAsMCwxXSx0IT09dm9pZCAwJiZ0aGlzLnNldCh0LGUscyxuLGksbyxhLGMsdSl9c2V0KHQsZSxzLG4saSxvLGEsYyx1KXtjb25zdCBoPXRoaXMuZWxlbWVudHM7cmV0dXJuIGhbMF09dCxoWzFdPW4saFsyXT1hLGhbM109ZSxoWzRdPWksaFs1XT1jLGhbNl09cyxoWzddPW8saFs4XT11LHRoaXN9aWRlbnRpdHkoKXtyZXR1cm4gdGhpcy5zZXQoMSwwLDAsMCwxLDAsMCwwLDEpLHRoaXN9Y29weSh0KXtjb25zdCBlPXRoaXMuZWxlbWVudHMscz10LmVsZW1lbnRzO3JldHVybiBlWzBdPXNbMF0sZVsxXT1zWzFdLGVbMl09c1syXSxlWzNdPXNbM10sZVs0XT1zWzRdLGVbNV09c1s1XSxlWzZdPXNbNl0sZVs3XT1zWzddLGVbOF09c1s4XSx0aGlzfWV4dHJhY3RCYXNpcyh0LGUscyl7cmV0dXJuIHQuc2V0RnJvbU1hdHJpeDNDb2x1bW4odGhpcywwKSxlLnNldEZyb21NYXRyaXgzQ29sdW1uKHRoaXMsMSkscy5zZXRGcm9tTWF0cml4M0NvbHVtbih0aGlzLDIpLHRoaXN9c2V0RnJvbU1hdHJpeDQodCl7Y29uc3QgZT10LmVsZW1lbnRzO3JldHVybiB0aGlzLnNldChlWzBdLGVbNF0sZVs4XSxlWzFdLGVbNV0sZVs5XSxlWzJdLGVbNl0sZVsxMF0pLHRoaXN9bXVsdGlwbHkodCl7cmV0dXJuIHRoaXMubXVsdGlwbHlNYXRyaWNlcyh0aGlzLHQpfXByZW11bHRpcGx5KHQpe3JldHVybiB0aGlzLm11bHRpcGx5TWF0cmljZXModCx0aGlzKX1tdWx0aXBseU1hdHJpY2VzKHQsZSl7Y29uc3Qgcz10LmVsZW1lbnRzLG49ZS5lbGVtZW50cyxpPXRoaXMuZWxlbWVudHMsbz1zWzBdLGE9c1szXSxjPXNbNl0sdT1zWzFdLGg9c1s0XSxsPXNbN10sZD1zWzJdLGY9c1s1XSxwPXNbOF0sbT1uWzBdLGc9blszXSx5PW5bNl0sVD1uWzFdLHc9bls0XSxNPW5bN10sTj1uWzJdLF89bls1XSxTPW5bOF07cmV0dXJuIGlbMF09byptK2EqVCtjKk4saVszXT1vKmcrYSp3K2MqXyxpWzZdPW8qeSthKk0rYypTLGlbMV09dSptK2gqVCtsKk4saVs0XT11KmcraCp3K2wqXyxpWzddPXUqeStoKk0rbCpTLGlbMl09ZCptK2YqVCtwKk4saVs1XT1kKmcrZip3K3AqXyxpWzhdPWQqeStmKk0rcCpTLHRoaXN9bXVsdGlwbHlTY2FsYXIodCl7Y29uc3QgZT10aGlzLmVsZW1lbnRzO3JldHVybiBlWzBdKj10LGVbM10qPXQsZVs2XSo9dCxlWzFdKj10LGVbNF0qPXQsZVs3XSo9dCxlWzJdKj10LGVbNV0qPXQsZVs4XSo9dCx0aGlzfWRldGVybWluYW50KCl7Y29uc3QgdD10aGlzLmVsZW1lbnRzLGU9dFswXSxzPXRbMV0sbj10WzJdLGk9dFszXSxvPXRbNF0sYT10WzVdLGM9dFs2XSx1PXRbN10saD10WzhdO3JldHVybiBlKm8qaC1lKmEqdS1zKmkqaCtzKmEqYytuKmkqdS1uKm8qY31pbnZlcnQoKXtjb25zdCB0PXRoaXMuZWxlbWVudHMsZT10WzBdLHM9dFsxXSxuPXRbMl0saT10WzNdLG89dFs0XSxhPXRbNV0sYz10WzZdLHU9dFs3XSxoPXRbOF0sbD1oKm8tYSp1LGQ9YSpjLWgqaSxmPXUqaS1vKmMscD1lKmwrcypkK24qZjtpZihwPT09MClyZXR1cm4gdGhpcy5zZXQoMCwwLDAsMCwwLDAsMCwwLDApO2NvbnN0IG09MS9wO3JldHVybiB0WzBdPWwqbSx0WzFdPShuKnUtaCpzKSptLHRbMl09KGEqcy1uKm8pKm0sdFszXT1kKm0sdFs0XT0oaCplLW4qYykqbSx0WzVdPShuKmktYSplKSptLHRbNl09ZiptLHRbN109KHMqYy11KmUpKm0sdFs4XT0obyplLXMqaSkqbSx0aGlzfXRyYW5zcG9zZSgpe2xldCB0O2NvbnN0IGU9dGhpcy5lbGVtZW50cztyZXR1cm4gdD1lWzFdLGVbMV09ZVszXSxlWzNdPXQsdD1lWzJdLGVbMl09ZVs2XSxlWzZdPXQsdD1lWzVdLGVbNV09ZVs3XSxlWzddPXQsdGhpc31nZXROb3JtYWxNYXRyaXgodCl7cmV0dXJuIHRoaXMuc2V0RnJvbU1hdHJpeDQodCkuaW52ZXJ0KCkudHJhbnNwb3NlKCl9dHJhbnNwb3NlSW50b0FycmF5KHQpe2NvbnN0IGU9dGhpcy5lbGVtZW50cztyZXR1cm4gdFswXT1lWzBdLHRbMV09ZVszXSx0WzJdPWVbNl0sdFszXT1lWzFdLHRbNF09ZVs0XSx0WzVdPWVbN10sdFs2XT1lWzJdLHRbN109ZVs1XSx0WzhdPWVbOF0sdGhpc31zZXRVdlRyYW5zZm9ybSh0LGUscyxuLGksbyxhKXtjb25zdCBjPU1hdGguY29zKGkpLHU9TWF0aC5zaW4oaSk7cmV0dXJuIHRoaXMuc2V0KHMqYyxzKnUsLXMqKGMqbyt1KmEpK28rdCwtbip1LG4qYywtbiooLXUqbytjKmEpK2ErZSwwLDAsMSksdGhpc31zY2FsZSh0LGUpe3JldHVybiB0aGlzLnByZW11bHRpcGx5KEVuLm1ha2VTY2FsZSh0LGUpKSx0aGlzfXJvdGF0ZSh0KXtyZXR1cm4gdGhpcy5wcmVtdWx0aXBseShFbi5tYWtlUm90YXRpb24oLXQpKSx0aGlzfXRyYW5zbGF0ZSh0LGUpe3JldHVybiB0aGlzLnByZW11bHRpcGx5KEVuLm1ha2VUcmFuc2xhdGlvbih0LGUpKSx0aGlzfW1ha2VUcmFuc2xhdGlvbih0LGUpe3JldHVybiB0LmlzVmVjdG9yMj90aGlzLnNldCgxLDAsdC54LDAsMSx0LnksMCwwLDEpOnRoaXMuc2V0KDEsMCx0LDAsMSxlLDAsMCwxKSx0aGlzfW1ha2VSb3RhdGlvbih0KXtjb25zdCBlPU1hdGguY29zKHQpLHM9TWF0aC5zaW4odCk7cmV0dXJuIHRoaXMuc2V0KGUsLXMsMCxzLGUsMCwwLDAsMSksdGhpc31tYWtlU2NhbGUodCxlKXtyZXR1cm4gdGhpcy5zZXQodCwwLDAsMCxlLDAsMCwwLDEpLHRoaXN9ZXF1YWxzKHQpe2NvbnN0IGU9dGhpcy5lbGVtZW50cyxzPXQuZWxlbWVudHM7Zm9yKGxldCBuPTA7bjw5O24rKylpZihlW25dIT09c1tuXSlyZXR1cm4hMTtyZXR1cm4hMH1mcm9tQXJyYXkodCxlPTApe2ZvcihsZXQgcz0wO3M8OTtzKyspdGhpcy5lbGVtZW50c1tzXT10W3MrZV07cmV0dXJuIHRoaXN9dG9BcnJheSh0PVtdLGU9MCl7Y29uc3Qgcz10aGlzLmVsZW1lbnRzO3JldHVybiB0W2VdPXNbMF0sdFtlKzFdPXNbMV0sdFtlKzJdPXNbMl0sdFtlKzNdPXNbM10sdFtlKzRdPXNbNF0sdFtlKzVdPXNbNV0sdFtlKzZdPXNbNl0sdFtlKzddPXNbN10sdFtlKzhdPXNbOF0sdH1jbG9uZSgpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmZyb21BcnJheSh0aGlzLmVsZW1lbnRzKX19Y29uc3QgRW49bmV3IEN0O2Z1bmN0aW9uIHNhKHIpe2ZvcihsZXQgdD1yLmxlbmd0aC0xO3Q+PTA7LS10KWlmKHJbdF0+PTY1NTM1KXJldHVybiEwO3JldHVybiExfWZ1bmN0aW9uIHNyKHIpe3JldHVybiBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiLHIpfWNvbnN0IG5yPW5ldyBDdCgpLnNldCguODIyNDYyMSwuMTc3NTM4LDAsLjAzMzE5NDEsLjk2NjgwNTgsMCwuMDE3MDgyNywuMDcyMzk3NCwuOTEwNTE5OSksaXI9bmV3IEN0KCkuc2V0KDEuMjI0OTQwMSwtLjIyNDk0MDQsMCwtLjA0MjA1NjksMS4wNDIwNTcxLDAsLS4wMTk2Mzc2LC0uMDc4NjM2MSwxLjA5ODI3MzUpLGplPXtbRXNdOnt0cmFuc2ZlcjpfbixwcmltYXJpZXM6amksbHVtaW5hbmNlQ29lZmZpY2llbnRzOlsuMjEyNiwuNzE1MiwuMDcyMl0sdG9SZWZlcmVuY2U6cj0+cixmcm9tUmVmZXJlbmNlOnI9PnJ9LFskdF06e3RyYW5zZmVyOkppLHByaW1hcmllczpqaSxsdW1pbmFuY2VDb2VmZmljaWVudHM6Wy4yMTI2LC43MTUyLC4wNzIyXSx0b1JlZmVyZW5jZTpyPT5yLmNvbnZlcnRTUkdCVG9MaW5lYXIoKSxmcm9tUmVmZXJlbmNlOnI9PnIuY29udmVydExpbmVhclRvU1JHQigpfSxbWmldOnt0cmFuc2ZlcjpfbixwcmltYXJpZXM6UWksbHVtaW5hbmNlQ29lZmZpY2llbnRzOlsuMjI4OSwuNjkxNywuMDc5M10sdG9SZWZlcmVuY2U6cj0+ci5hcHBseU1hdHJpeDMoaXIpLGZyb21SZWZlcmVuY2U6cj0+ci5hcHBseU1hdHJpeDMobnIpfSxbRG9dOnt0cmFuc2ZlcjpKaSxwcmltYXJpZXM6UWksbHVtaW5hbmNlQ29lZmZpY2llbnRzOlsuMjI4OSwuNjkxNywuMDc5M10sdG9SZWZlcmVuY2U6cj0+ci5jb252ZXJ0U1JHQlRvTGluZWFyKCkuYXBwbHlNYXRyaXgzKGlyKSxmcm9tUmVmZXJlbmNlOnI9PnIuYXBwbHlNYXRyaXgzKG5yKS5jb252ZXJ0TGluZWFyVG9TUkdCKCl9fSxuYT1uZXcgU2V0KFtFcyxaaV0pLG10PXtlbmFibGVkOiEwLF93b3JraW5nQ29sb3JTcGFjZTpFcyxnZXQgd29ya2luZ0NvbG9yU3BhY2UoKXtyZXR1cm4gdGhpcy5fd29ya2luZ0NvbG9yU3BhY2V9LHNldCB3b3JraW5nQ29sb3JTcGFjZShyKXtpZighbmEuaGFzKHIpKXRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgd29ya2luZyBjb2xvciBzcGFjZSwgIiR7cn0iLmApO3RoaXMuX3dvcmtpbmdDb2xvclNwYWNlPXJ9LGNvbnZlcnQ6ZnVuY3Rpb24ocix0LGUpe2lmKHRoaXMuZW5hYmxlZD09PSExfHx0PT09ZXx8IXR8fCFlKXJldHVybiByO2NvbnN0IHM9amVbdF0udG9SZWZlcmVuY2Usbj1qZVtlXS5mcm9tUmVmZXJlbmNlO3JldHVybiBuKHMocikpfSxmcm9tV29ya2luZ0NvbG9yU3BhY2U6ZnVuY3Rpb24ocix0KXtyZXR1cm4gdGhpcy5jb252ZXJ0KHIsdGhpcy5fd29ya2luZ0NvbG9yU3BhY2UsdCl9LHRvV29ya2luZ0NvbG9yU3BhY2U6ZnVuY3Rpb24ocix0KXtyZXR1cm4gdGhpcy5jb252ZXJ0KHIsdCx0aGlzLl93b3JraW5nQ29sb3JTcGFjZSl9LGdldFByaW1hcmllczpmdW5jdGlvbihyKXtyZXR1cm4gamVbcl0ucHJpbWFyaWVzfSxnZXRUcmFuc2ZlcjpmdW5jdGlvbihyKXtyZXR1cm4gcj09PWJzP19uOmplW3JdLnRyYW5zZmVyfSxnZXRMdW1pbmFuY2VDb2VmZmljaWVudHM6ZnVuY3Rpb24ocix0PXRoaXMuX3dvcmtpbmdDb2xvclNwYWNlKXtyZXR1cm4gci5mcm9tQXJyYXkoamVbdF0ubHVtaW5hbmNlQ29lZmZpY2llbnRzKX19O2Z1bmN0aW9uIHhlKHIpe3JldHVybiByPC4wNDA0NT9yKi4wNzczOTkzODA4Ok1hdGgucG93KHIqLjk0Nzg2NzI5ODYrLjA1MjEzMjcwMTQsMi40KX1mdW5jdGlvbiBDbihyKXtyZXR1cm4gcjwuMDAzMTMwOD9yKjEyLjkyOjEuMDU1Kk1hdGgucG93KHIsLjQxNjY2KS0uMDU1fWxldCBUZTtjbGFzcyBpYXtzdGF0aWMgZ2V0RGF0YVVSTCh0KXtpZigvXmRhdGE6L2kudGVzdCh0LnNyYyl8fHR5cGVvZiBIVE1MQ2FudmFzRWxlbWVudD4idSIpcmV0dXJuIHQuc3JjO2xldCBlO2lmKHQgaW5zdGFuY2VvZiBIVE1MQ2FudmFzRWxlbWVudCllPXQ7ZWxzZXtUZT09PXZvaWQgMCYmKFRlPXNyKCJjYW52YXMiKSksVGUud2lkdGg9dC53aWR0aCxUZS5oZWlnaHQ9dC5oZWlnaHQ7Y29uc3Qgcz1UZS5nZXRDb250ZXh0KCIyZCIpO3QgaW5zdGFuY2VvZiBJbWFnZURhdGE/cy5wdXRJbWFnZURhdGEodCwwLDApOnMuZHJhd0ltYWdlKHQsMCwwLHQud2lkdGgsdC5oZWlnaHQpLGU9VGV9cmV0dXJuIGUud2lkdGg+MjA0OHx8ZS5oZWlnaHQ+MjA0OD8oY29uc29sZS53YXJuKCJUSFJFRS5JbWFnZVV0aWxzLmdldERhdGFVUkw6IEltYWdlIGNvbnZlcnRlZCB0byBqcGcgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMiLHQpLGUudG9EYXRhVVJMKCJpbWFnZS9qcGVnIiwuNikpOmUudG9EYXRhVVJMKCJpbWFnZS9wbmciKX1zdGF0aWMgc1JHQlRvTGluZWFyKHQpe2lmKHR5cGVvZiBIVE1MSW1hZ2VFbGVtZW50PCJ1IiYmdCBpbnN0YW5jZW9mIEhUTUxJbWFnZUVsZW1lbnR8fHR5cGVvZiBIVE1MQ2FudmFzRWxlbWVudDwidSImJnQgaW5zdGFuY2VvZiBIVE1MQ2FudmFzRWxlbWVudHx8dHlwZW9mIEltYWdlQml0bWFwPCJ1IiYmdCBpbnN0YW5jZW9mIEltYWdlQml0bWFwKXtjb25zdCBlPXNyKCJjYW52YXMiKTtlLndpZHRoPXQud2lkdGgsZS5oZWlnaHQ9dC5oZWlnaHQ7Y29uc3Qgcz1lLmdldENvbnRleHQoIjJkIik7cy5kcmF3SW1hZ2UodCwwLDAsdC53aWR0aCx0LmhlaWdodCk7Y29uc3Qgbj1zLmdldEltYWdlRGF0YSgwLDAsdC53aWR0aCx0LmhlaWdodCksaT1uLmRhdGE7Zm9yKGxldCBvPTA7bzxpLmxlbmd0aDtvKyspaVtvXT14ZShpW29dLzI1NSkqMjU1O3JldHVybiBzLnB1dEltYWdlRGF0YShuLDAsMCksZX1lbHNlIGlmKHQuZGF0YSl7Y29uc3QgZT10LmRhdGEuc2xpY2UoMCk7Zm9yKGxldCBzPTA7czxlLmxlbmd0aDtzKyspZSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXl8fGUgaW5zdGFuY2VvZiBVaW50OENsYW1wZWRBcnJheT9lW3NdPU1hdGguZmxvb3IoeGUoZVtzXS8yNTUpKjI1NSk6ZVtzXT14ZShlW3NdKTtyZXR1cm57ZGF0YTplLHdpZHRoOnQud2lkdGgsaGVpZ2h0OnQuaGVpZ2h0fX1lbHNlIHJldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLkltYWdlVXRpbHMuc1JHQlRvTGluZWFyKCk6IFVuc3VwcG9ydGVkIGltYWdlIHR5cGUuIE5vIGNvbG9yIHNwYWNlIGNvbnZlcnNpb24gYXBwbGllZC4iKSx0fX1sZXQgcmE9MDtjbGFzcyBycntjb25zdHJ1Y3Rvcih0PW51bGwpe3RoaXMuaXNTb3VyY2U9ITAsT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImlkIix7dmFsdWU6cmErK30pLHRoaXMudXVpZD1LdCgpLHRoaXMuZGF0YT10LHRoaXMuZGF0YVJlYWR5PSEwLHRoaXMudmVyc2lvbj0wfXNldCBuZWVkc1VwZGF0ZSh0KXt0PT09ITAmJnRoaXMudmVyc2lvbisrfXRvSlNPTih0KXtjb25zdCBlPXQ9PT12b2lkIDB8fHR5cGVvZiB0PT0ic3RyaW5nIjtpZighZSYmdC5pbWFnZXNbdGhpcy51dWlkXSE9PXZvaWQgMClyZXR1cm4gdC5pbWFnZXNbdGhpcy51dWlkXTtjb25zdCBzPXt1dWlkOnRoaXMudXVpZCx1cmw6IiJ9LG49dGhpcy5kYXRhO2lmKG4hPT1udWxsKXtsZXQgaTtpZihBcnJheS5pc0FycmF5KG4pKXtpPVtdO2ZvcihsZXQgbz0wLGE9bi5sZW5ndGg7bzxhO28rKyluW29dLmlzRGF0YVRleHR1cmU/aS5wdXNoKEZuKG5bb10uaW1hZ2UpKTppLnB1c2goRm4obltvXSkpfWVsc2UgaT1GbihuKTtzLnVybD1pfXJldHVybiBlfHwodC5pbWFnZXNbdGhpcy51dWlkXT1zKSxzfX1mdW5jdGlvbiBGbihyKXtyZXR1cm4gdHlwZW9mIEhUTUxJbWFnZUVsZW1lbnQ8InUiJiZyIGluc3RhbmNlb2YgSFRNTEltYWdlRWxlbWVudHx8dHlwZW9mIEhUTUxDYW52YXNFbGVtZW50PCJ1IiYmciBpbnN0YW5jZW9mIEhUTUxDYW52YXNFbGVtZW50fHx0eXBlb2YgSW1hZ2VCaXRtYXA8InUiJiZyIGluc3RhbmNlb2YgSW1hZ2VCaXRtYXA/aWEuZ2V0RGF0YVVSTChyKTpyLmRhdGE/e2RhdGE6QXJyYXkuZnJvbShyLmRhdGEpLHdpZHRoOnIud2lkdGgsaGVpZ2h0OnIuaGVpZ2h0LHR5cGU6ci5kYXRhLmNvbnN0cnVjdG9yLm5hbWV9Oihjb25zb2xlLndhcm4oIlRIUkVFLlRleHR1cmU6IFVuYWJsZSB0byBzZXJpYWxpemUgVGV4dHVyZS4iKSx7fSl9bGV0IG9hPTA7Y2xhc3MgRHQgZXh0ZW5kcyBaZXtjb25zdHJ1Y3Rvcih0PUR0LkRFRkFVTFRfSU1BR0UsZT1EdC5ERUZBVUxUX01BUFBJTkcscz1fcyxuPV9zLGk9JGksbz1HaSxhPUxvLGM9Um8sdT1EdC5ERUZBVUxUX0FOSVNPVFJPUFksaD1icyl7c3VwZXIoKSx0aGlzLmlzVGV4dHVyZT0hMCxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiaWQiLHt2YWx1ZTpvYSsrfSksdGhpcy51dWlkPUt0KCksdGhpcy5uYW1lPSIiLHRoaXMuc291cmNlPW5ldyBycih0KSx0aGlzLm1pcG1hcHM9W10sdGhpcy5tYXBwaW5nPWUsdGhpcy5jaGFubmVsPTAsdGhpcy53cmFwUz1zLHRoaXMud3JhcFQ9bix0aGlzLm1hZ0ZpbHRlcj1pLHRoaXMubWluRmlsdGVyPW8sdGhpcy5hbmlzb3Ryb3B5PXUsdGhpcy5mb3JtYXQ9YSx0aGlzLmludGVybmFsRm9ybWF0PW51bGwsdGhpcy50eXBlPWMsdGhpcy5vZmZzZXQ9bmV3IEooMCwwKSx0aGlzLnJlcGVhdD1uZXcgSigxLDEpLHRoaXMuY2VudGVyPW5ldyBKKDAsMCksdGhpcy5yb3RhdGlvbj0wLHRoaXMubWF0cml4QXV0b1VwZGF0ZT0hMCx0aGlzLm1hdHJpeD1uZXcgQ3QsdGhpcy5nZW5lcmF0ZU1pcG1hcHM9ITAsdGhpcy5wcmVtdWx0aXBseUFscGhhPSExLHRoaXMuZmxpcFk9ITAsdGhpcy51bnBhY2tBbGlnbm1lbnQ9NCx0aGlzLmNvbG9yU3BhY2U9aCx0aGlzLnVzZXJEYXRhPXt9LHRoaXMudmVyc2lvbj0wLHRoaXMub25VcGRhdGU9bnVsbCx0aGlzLmlzUmVuZGVyVGFyZ2V0VGV4dHVyZT0hMSx0aGlzLnBtcmVtVmVyc2lvbj0wfWdldCBpbWFnZSgpe3JldHVybiB0aGlzLnNvdXJjZS5kYXRhfXNldCBpbWFnZSh0PW51bGwpe3RoaXMuc291cmNlLmRhdGE9dH11cGRhdGVNYXRyaXgoKXt0aGlzLm1hdHJpeC5zZXRVdlRyYW5zZm9ybSh0aGlzLm9mZnNldC54LHRoaXMub2Zmc2V0LnksdGhpcy5yZXBlYXQueCx0aGlzLnJlcGVhdC55LHRoaXMucm90YXRpb24sdGhpcy5jZW50ZXIueCx0aGlzLmNlbnRlci55KX1jbG9uZSgpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkodGhpcyl9Y29weSh0KXtyZXR1cm4gdGhpcy5uYW1lPXQubmFtZSx0aGlzLnNvdXJjZT10LnNvdXJjZSx0aGlzLm1pcG1hcHM9dC5taXBtYXBzLnNsaWNlKDApLHRoaXMubWFwcGluZz10Lm1hcHBpbmcsdGhpcy5jaGFubmVsPXQuY2hhbm5lbCx0aGlzLndyYXBTPXQud3JhcFMsdGhpcy53cmFwVD10LndyYXBULHRoaXMubWFnRmlsdGVyPXQubWFnRmlsdGVyLHRoaXMubWluRmlsdGVyPXQubWluRmlsdGVyLHRoaXMuYW5pc290cm9weT10LmFuaXNvdHJvcHksdGhpcy5mb3JtYXQ9dC5mb3JtYXQsdGhpcy5pbnRlcm5hbEZvcm1hdD10LmludGVybmFsRm9ybWF0LHRoaXMudHlwZT10LnR5cGUsdGhpcy5vZmZzZXQuY29weSh0Lm9mZnNldCksdGhpcy5yZXBlYXQuY29weSh0LnJlcGVhdCksdGhpcy5jZW50ZXIuY29weSh0LmNlbnRlciksdGhpcy5yb3RhdGlvbj10LnJvdGF0aW9uLHRoaXMubWF0cml4QXV0b1VwZGF0ZT10Lm1hdHJpeEF1dG9VcGRhdGUsdGhpcy5tYXRyaXguY29weSh0Lm1hdHJpeCksdGhpcy5nZW5lcmF0ZU1pcG1hcHM9dC5nZW5lcmF0ZU1pcG1hcHMsdGhpcy5wcmVtdWx0aXBseUFscGhhPXQucHJlbXVsdGlwbHlBbHBoYSx0aGlzLmZsaXBZPXQuZmxpcFksdGhpcy51bnBhY2tBbGlnbm1lbnQ9dC51bnBhY2tBbGlnbm1lbnQsdGhpcy5jb2xvclNwYWNlPXQuY29sb3JTcGFjZSx0aGlzLnVzZXJEYXRhPUpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodC51c2VyRGF0YSkpLHRoaXMubmVlZHNVcGRhdGU9ITAsdGhpc310b0pTT04odCl7Y29uc3QgZT10PT09dm9pZCAwfHx0eXBlb2YgdD09InN0cmluZyI7aWYoIWUmJnQudGV4dHVyZXNbdGhpcy51dWlkXSE9PXZvaWQgMClyZXR1cm4gdC50ZXh0dXJlc1t0aGlzLnV1aWRdO2NvbnN0IHM9e21ldGFkYXRhOnt2ZXJzaW9uOjQuNix0eXBlOiJUZXh0dXJlIixnZW5lcmF0b3I6IlRleHR1cmUudG9KU09OIn0sdXVpZDp0aGlzLnV1aWQsbmFtZTp0aGlzLm5hbWUsaW1hZ2U6dGhpcy5zb3VyY2UudG9KU09OKHQpLnV1aWQsbWFwcGluZzp0aGlzLm1hcHBpbmcsY2hhbm5lbDp0aGlzLmNoYW5uZWwscmVwZWF0Olt0aGlzLnJlcGVhdC54LHRoaXMucmVwZWF0LnldLG9mZnNldDpbdGhpcy5vZmZzZXQueCx0aGlzLm9mZnNldC55XSxjZW50ZXI6W3RoaXMuY2VudGVyLngsdGhpcy5jZW50ZXIueV0scm90YXRpb246dGhpcy5yb3RhdGlvbix3cmFwOlt0aGlzLndyYXBTLHRoaXMud3JhcFRdLGZvcm1hdDp0aGlzLmZvcm1hdCxpbnRlcm5hbEZvcm1hdDp0aGlzLmludGVybmFsRm9ybWF0LHR5cGU6dGhpcy50eXBlLGNvbG9yU3BhY2U6dGhpcy5jb2xvclNwYWNlLG1pbkZpbHRlcjp0aGlzLm1pbkZpbHRlcixtYWdGaWx0ZXI6dGhpcy5tYWdGaWx0ZXIsYW5pc290cm9weTp0aGlzLmFuaXNvdHJvcHksZmxpcFk6dGhpcy5mbGlwWSxnZW5lcmF0ZU1pcG1hcHM6dGhpcy5nZW5lcmF0ZU1pcG1hcHMscHJlbXVsdGlwbHlBbHBoYTp0aGlzLnByZW11bHRpcGx5QWxwaGEsdW5wYWNrQWxpZ25tZW50OnRoaXMudW5wYWNrQWxpZ25tZW50fTtyZXR1cm4gT2JqZWN0LmtleXModGhpcy51c2VyRGF0YSkubGVuZ3RoPjAmJihzLnVzZXJEYXRhPXRoaXMudXNlckRhdGEpLGV8fCh0LnRleHR1cmVzW3RoaXMudXVpZF09cyksc31kaXNwb3NlKCl7dGhpcy5kaXNwYXRjaEV2ZW50KHt0eXBlOiJkaXNwb3NlIn0pfXRyYW5zZm9ybVV2KHQpe2lmKHRoaXMubWFwcGluZyE9PWtpKXJldHVybiB0O2lmKHQuYXBwbHlNYXRyaXgzKHRoaXMubWF0cml4KSx0Lng8MHx8dC54PjEpc3dpdGNoKHRoaXMud3JhcFMpe2Nhc2UgSGk6dC54PXQueC1NYXRoLmZsb29yKHQueCk7YnJlYWs7Y2FzZSBfczp0Lng9dC54PDA/MDoxO2JyZWFrO2Nhc2UgcWk6TWF0aC5hYnMoTWF0aC5mbG9vcih0LngpJTIpPT09MT90Lng9TWF0aC5jZWlsKHQueCktdC54OnQueD10LngtTWF0aC5mbG9vcih0LngpO2JyZWFrfWlmKHQueTwwfHx0Lnk+MSlzd2l0Y2godGhpcy53cmFwVCl7Y2FzZSBIaTp0Lnk9dC55LU1hdGguZmxvb3IodC55KTticmVhaztjYXNlIF9zOnQueT10Lnk8MD8wOjE7YnJlYWs7Y2FzZSBxaTpNYXRoLmFicyhNYXRoLmZsb29yKHQueSklMik9PT0xP3QueT1NYXRoLmNlaWwodC55KS10Lnk6dC55PXQueS1NYXRoLmZsb29yKHQueSk7YnJlYWt9cmV0dXJuIHRoaXMuZmxpcFkmJih0Lnk9MS10LnkpLHR9c2V0IG5lZWRzVXBkYXRlKHQpe3Q9PT0hMCYmKHRoaXMudmVyc2lvbisrLHRoaXMuc291cmNlLm5lZWRzVXBkYXRlPSEwKX1zZXQgbmVlZHNQTVJFTVVwZGF0ZSh0KXt0PT09ITAmJnRoaXMucG1yZW1WZXJzaW9uKyt9fUR0LkRFRkFVTFRfSU1BR0U9bnVsbCxEdC5ERUZBVUxUX01BUFBJTkc9a2ksRHQuREVGQVVMVF9BTklTT1RST1BZPTQ7Y2xhc3MgRnR7Y29uc3RydWN0b3IodD0wLGU9MCxzPTAsbj0xKXtGdC5wcm90b3R5cGUuaXNWZWN0b3I0PSEwLHRoaXMueD10LHRoaXMueT1lLHRoaXMuej1zLHRoaXMudz1ufWdldCB3aWR0aCgpe3JldHVybiB0aGlzLnp9c2V0IHdpZHRoKHQpe3RoaXMuej10fWdldCBoZWlnaHQoKXtyZXR1cm4gdGhpcy53fXNldCBoZWlnaHQodCl7dGhpcy53PXR9c2V0KHQsZSxzLG4pe3JldHVybiB0aGlzLng9dCx0aGlzLnk9ZSx0aGlzLno9cyx0aGlzLnc9bix0aGlzfXNldFNjYWxhcih0KXtyZXR1cm4gdGhpcy54PXQsdGhpcy55PXQsdGhpcy56PXQsdGhpcy53PXQsdGhpc31zZXRYKHQpe3JldHVybiB0aGlzLng9dCx0aGlzfXNldFkodCl7cmV0dXJuIHRoaXMueT10LHRoaXN9c2V0Wih0KXtyZXR1cm4gdGhpcy56PXQsdGhpc31zZXRXKHQpe3JldHVybiB0aGlzLnc9dCx0aGlzfXNldENvbXBvbmVudCh0LGUpe3N3aXRjaCh0KXtjYXNlIDA6dGhpcy54PWU7YnJlYWs7Y2FzZSAxOnRoaXMueT1lO2JyZWFrO2Nhc2UgMjp0aGlzLno9ZTticmVhaztjYXNlIDM6dGhpcy53PWU7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoImluZGV4IGlzIG91dCBvZiByYW5nZTogIit0KX1yZXR1cm4gdGhpc31nZXRDb21wb25lbnQodCl7c3dpdGNoKHQpe2Nhc2UgMDpyZXR1cm4gdGhpcy54O2Nhc2UgMTpyZXR1cm4gdGhpcy55O2Nhc2UgMjpyZXR1cm4gdGhpcy56O2Nhc2UgMzpyZXR1cm4gdGhpcy53O2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJpbmRleCBpcyBvdXQgb2YgcmFuZ2U6ICIrdCl9fWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMueCx0aGlzLnksdGhpcy56LHRoaXMudyl9Y29weSh0KXtyZXR1cm4gdGhpcy54PXQueCx0aGlzLnk9dC55LHRoaXMuej10LnosdGhpcy53PXQudyE9PXZvaWQgMD90Lnc6MSx0aGlzfWFkZCh0KXtyZXR1cm4gdGhpcy54Kz10LngsdGhpcy55Kz10LnksdGhpcy56Kz10LnosdGhpcy53Kz10LncsdGhpc31hZGRTY2FsYXIodCl7cmV0dXJuIHRoaXMueCs9dCx0aGlzLnkrPXQsdGhpcy56Kz10LHRoaXMudys9dCx0aGlzfWFkZFZlY3RvcnModCxlKXtyZXR1cm4gdGhpcy54PXQueCtlLngsdGhpcy55PXQueStlLnksdGhpcy56PXQueitlLnosdGhpcy53PXQudytlLncsdGhpc31hZGRTY2FsZWRWZWN0b3IodCxlKXtyZXR1cm4gdGhpcy54Kz10LngqZSx0aGlzLnkrPXQueSplLHRoaXMueis9dC56KmUsdGhpcy53Kz10LncqZSx0aGlzfXN1Yih0KXtyZXR1cm4gdGhpcy54LT10LngsdGhpcy55LT10LnksdGhpcy56LT10LnosdGhpcy53LT10LncsdGhpc31zdWJTY2FsYXIodCl7cmV0dXJuIHRoaXMueC09dCx0aGlzLnktPXQsdGhpcy56LT10LHRoaXMudy09dCx0aGlzfXN1YlZlY3RvcnModCxlKXtyZXR1cm4gdGhpcy54PXQueC1lLngsdGhpcy55PXQueS1lLnksdGhpcy56PXQuei1lLnosdGhpcy53PXQudy1lLncsdGhpc31tdWx0aXBseSh0KXtyZXR1cm4gdGhpcy54Kj10LngsdGhpcy55Kj10LnksdGhpcy56Kj10LnosdGhpcy53Kj10LncsdGhpc31tdWx0aXBseVNjYWxhcih0KXtyZXR1cm4gdGhpcy54Kj10LHRoaXMueSo9dCx0aGlzLnoqPXQsdGhpcy53Kj10LHRoaXN9YXBwbHlNYXRyaXg0KHQpe2NvbnN0IGU9dGhpcy54LHM9dGhpcy55LG49dGhpcy56LGk9dGhpcy53LG89dC5lbGVtZW50cztyZXR1cm4gdGhpcy54PW9bMF0qZStvWzRdKnMrb1s4XSpuK29bMTJdKmksdGhpcy55PW9bMV0qZStvWzVdKnMrb1s5XSpuK29bMTNdKmksdGhpcy56PW9bMl0qZStvWzZdKnMrb1sxMF0qbitvWzE0XSppLHRoaXMudz1vWzNdKmUrb1s3XSpzK29bMTFdKm4rb1sxNV0qaSx0aGlzfWRpdmlkZVNjYWxhcih0KXtyZXR1cm4gdGhpcy5tdWx0aXBseVNjYWxhcigxL3QpfXNldEF4aXNBbmdsZUZyb21RdWF0ZXJuaW9uKHQpe3RoaXMudz0yKk1hdGguYWNvcyh0LncpO2NvbnN0IGU9TWF0aC5zcXJ0KDEtdC53KnQudyk7cmV0dXJuIGU8MWUtND8odGhpcy54PTEsdGhpcy55PTAsdGhpcy56PTApOih0aGlzLng9dC54L2UsdGhpcy55PXQueS9lLHRoaXMuej10LnovZSksdGhpc31zZXRBeGlzQW5nbGVGcm9tUm90YXRpb25NYXRyaXgodCl7bGV0IGUscyxuLGk7Y29uc3QgYz10LmVsZW1lbnRzLHU9Y1swXSxoPWNbNF0sbD1jWzhdLGQ9Y1sxXSxmPWNbNV0scD1jWzldLG09Y1syXSxnPWNbNl0seT1jWzEwXTtpZihNYXRoLmFicyhoLWQpPC4wMSYmTWF0aC5hYnMobC1tKTwuMDEmJk1hdGguYWJzKHAtZyk8LjAxKXtpZihNYXRoLmFicyhoK2QpPC4xJiZNYXRoLmFicyhsK20pPC4xJiZNYXRoLmFicyhwK2cpPC4xJiZNYXRoLmFicyh1K2YreS0zKTwuMSlyZXR1cm4gdGhpcy5zZXQoMSwwLDAsMCksdGhpcztlPU1hdGguUEk7Y29uc3Qgdz0odSsxKS8yLE09KGYrMSkvMixOPSh5KzEpLzIsXz0oaCtkKS80LFM9KGwrbSkvNCxFPShwK2cpLzQ7cmV0dXJuIHc+TSYmdz5OP3c8LjAxPyhzPTAsbj0uNzA3MTA2NzgxLGk9LjcwNzEwNjc4MSk6KHM9TWF0aC5zcXJ0KHcpLG49Xy9zLGk9Uy9zKTpNPk4/TTwuMDE/KHM9LjcwNzEwNjc4MSxuPTAsaT0uNzA3MTA2NzgxKToobj1NYXRoLnNxcnQoTSkscz1fL24saT1FL24pOk48LjAxPyhzPS43MDcxMDY3ODEsbj0uNzA3MTA2NzgxLGk9MCk6KGk9TWF0aC5zcXJ0KE4pLHM9Uy9pLG49RS9pKSx0aGlzLnNldChzLG4saSxlKSx0aGlzfWxldCBUPU1hdGguc3FydCgoZy1wKSooZy1wKSsobC1tKSoobC1tKSsoZC1oKSooZC1oKSk7cmV0dXJuIE1hdGguYWJzKFQpPC4wMDEmJihUPTEpLHRoaXMueD0oZy1wKS9ULHRoaXMueT0obC1tKS9ULHRoaXMuej0oZC1oKS9ULHRoaXMudz1NYXRoLmFjb3MoKHUrZit5LTEpLzIpLHRoaXN9c2V0RnJvbU1hdHJpeFBvc2l0aW9uKHQpe2NvbnN0IGU9dC5lbGVtZW50cztyZXR1cm4gdGhpcy54PWVbMTJdLHRoaXMueT1lWzEzXSx0aGlzLno9ZVsxNF0sdGhpcy53PWVbMTVdLHRoaXN9bWluKHQpe3JldHVybiB0aGlzLng9TWF0aC5taW4odGhpcy54LHQueCksdGhpcy55PU1hdGgubWluKHRoaXMueSx0LnkpLHRoaXMuej1NYXRoLm1pbih0aGlzLnosdC56KSx0aGlzLnc9TWF0aC5taW4odGhpcy53LHQudyksdGhpc31tYXgodCl7cmV0dXJuIHRoaXMueD1NYXRoLm1heCh0aGlzLngsdC54KSx0aGlzLnk9TWF0aC5tYXgodGhpcy55LHQueSksdGhpcy56PU1hdGgubWF4KHRoaXMueix0LnopLHRoaXMudz1NYXRoLm1heCh0aGlzLncsdC53KSx0aGlzfWNsYW1wKHQsZSl7cmV0dXJuIHRoaXMueD1NYXRoLm1heCh0LngsTWF0aC5taW4oZS54LHRoaXMueCkpLHRoaXMueT1NYXRoLm1heCh0LnksTWF0aC5taW4oZS55LHRoaXMueSkpLHRoaXMuej1NYXRoLm1heCh0LnosTWF0aC5taW4oZS56LHRoaXMueikpLHRoaXMudz1NYXRoLm1heCh0LncsTWF0aC5taW4oZS53LHRoaXMudykpLHRoaXN9Y2xhbXBTY2FsYXIodCxlKXtyZXR1cm4gdGhpcy54PU1hdGgubWF4KHQsTWF0aC5taW4oZSx0aGlzLngpKSx0aGlzLnk9TWF0aC5tYXgodCxNYXRoLm1pbihlLHRoaXMueSkpLHRoaXMuej1NYXRoLm1heCh0LE1hdGgubWluKGUsdGhpcy56KSksdGhpcy53PU1hdGgubWF4KHQsTWF0aC5taW4oZSx0aGlzLncpKSx0aGlzfWNsYW1wTGVuZ3RoKHQsZSl7Y29uc3Qgcz10aGlzLmxlbmd0aCgpO3JldHVybiB0aGlzLmRpdmlkZVNjYWxhcihzfHwxKS5tdWx0aXBseVNjYWxhcihNYXRoLm1heCh0LE1hdGgubWluKGUscykpKX1mbG9vcigpe3JldHVybiB0aGlzLng9TWF0aC5mbG9vcih0aGlzLngpLHRoaXMueT1NYXRoLmZsb29yKHRoaXMueSksdGhpcy56PU1hdGguZmxvb3IodGhpcy56KSx0aGlzLnc9TWF0aC5mbG9vcih0aGlzLncpLHRoaXN9Y2VpbCgpe3JldHVybiB0aGlzLng9TWF0aC5jZWlsKHRoaXMueCksdGhpcy55PU1hdGguY2VpbCh0aGlzLnkpLHRoaXMuej1NYXRoLmNlaWwodGhpcy56KSx0aGlzLnc9TWF0aC5jZWlsKHRoaXMudyksdGhpc31yb3VuZCgpe3JldHVybiB0aGlzLng9TWF0aC5yb3VuZCh0aGlzLngpLHRoaXMueT1NYXRoLnJvdW5kKHRoaXMueSksdGhpcy56PU1hdGgucm91bmQodGhpcy56KSx0aGlzLnc9TWF0aC5yb3VuZCh0aGlzLncpLHRoaXN9cm91bmRUb1plcm8oKXtyZXR1cm4gdGhpcy54PU1hdGgudHJ1bmModGhpcy54KSx0aGlzLnk9TWF0aC50cnVuYyh0aGlzLnkpLHRoaXMuej1NYXRoLnRydW5jKHRoaXMueiksdGhpcy53PU1hdGgudHJ1bmModGhpcy53KSx0aGlzfW5lZ2F0ZSgpe3JldHVybiB0aGlzLng9LXRoaXMueCx0aGlzLnk9LXRoaXMueSx0aGlzLno9LXRoaXMueix0aGlzLnc9LXRoaXMudyx0aGlzfWRvdCh0KXtyZXR1cm4gdGhpcy54KnQueCt0aGlzLnkqdC55K3RoaXMueip0LnordGhpcy53KnQud31sZW5ndGhTcSgpe3JldHVybiB0aGlzLngqdGhpcy54K3RoaXMueSp0aGlzLnkrdGhpcy56KnRoaXMueit0aGlzLncqdGhpcy53fWxlbmd0aCgpe3JldHVybiBNYXRoLnNxcnQodGhpcy54KnRoaXMueCt0aGlzLnkqdGhpcy55K3RoaXMueip0aGlzLnordGhpcy53KnRoaXMudyl9bWFuaGF0dGFuTGVuZ3RoKCl7cmV0dXJuIE1hdGguYWJzKHRoaXMueCkrTWF0aC5hYnModGhpcy55KStNYXRoLmFicyh0aGlzLnopK01hdGguYWJzKHRoaXMudyl9bm9ybWFsaXplKCl7cmV0dXJuIHRoaXMuZGl2aWRlU2NhbGFyKHRoaXMubGVuZ3RoKCl8fDEpfXNldExlbmd0aCh0KXtyZXR1cm4gdGhpcy5ub3JtYWxpemUoKS5tdWx0aXBseVNjYWxhcih0KX1sZXJwKHQsZSl7cmV0dXJuIHRoaXMueCs9KHQueC10aGlzLngpKmUsdGhpcy55Kz0odC55LXRoaXMueSkqZSx0aGlzLnorPSh0LnotdGhpcy56KSplLHRoaXMudys9KHQudy10aGlzLncpKmUsdGhpc31sZXJwVmVjdG9ycyh0LGUscyl7cmV0dXJuIHRoaXMueD10LngrKGUueC10LngpKnMsdGhpcy55PXQueSsoZS55LXQueSkqcyx0aGlzLno9dC56KyhlLnotdC56KSpzLHRoaXMudz10LncrKGUudy10LncpKnMsdGhpc31lcXVhbHModCl7cmV0dXJuIHQueD09PXRoaXMueCYmdC55PT09dGhpcy55JiZ0Lno9PT10aGlzLnomJnQudz09PXRoaXMud31mcm9tQXJyYXkodCxlPTApe3JldHVybiB0aGlzLng9dFtlXSx0aGlzLnk9dFtlKzFdLHRoaXMuej10W2UrMl0sdGhpcy53PXRbZSszXSx0aGlzfXRvQXJyYXkodD1bXSxlPTApe3JldHVybiB0W2VdPXRoaXMueCx0W2UrMV09dGhpcy55LHRbZSsyXT10aGlzLnosdFtlKzNdPXRoaXMudyx0fWZyb21CdWZmZXJBdHRyaWJ1dGUodCxlKXtyZXR1cm4gdGhpcy54PXQuZ2V0WChlKSx0aGlzLnk9dC5nZXRZKGUpLHRoaXMuej10LmdldFooZSksdGhpcy53PXQuZ2V0VyhlKSx0aGlzfXJhbmRvbSgpe3JldHVybiB0aGlzLng9TWF0aC5yYW5kb20oKSx0aGlzLnk9TWF0aC5yYW5kb20oKSx0aGlzLno9TWF0aC5yYW5kb20oKSx0aGlzLnc9TWF0aC5yYW5kb20oKSx0aGlzfSpbU3ltYm9sLml0ZXJhdG9yXSgpe3lpZWxkIHRoaXMueCx5aWVsZCB0aGlzLnkseWllbGQgdGhpcy56LHlpZWxkIHRoaXMud319Y2xhc3Mgb3IgZXh0ZW5kcyBaZXtjb25zdHJ1Y3Rvcih0PTEsZT0xLHM9e30pe3N1cGVyKCksdGhpcy5pc1JlbmRlclRhcmdldD0hMCx0aGlzLndpZHRoPXQsdGhpcy5oZWlnaHQ9ZSx0aGlzLmRlcHRoPTEsdGhpcy5zY2lzc29yPW5ldyBGdCgwLDAsdCxlKSx0aGlzLnNjaXNzb3JUZXN0PSExLHRoaXMudmlld3BvcnQ9bmV3IEZ0KDAsMCx0LGUpO2NvbnN0IG49e3dpZHRoOnQsaGVpZ2h0OmUsZGVwdGg6MX07cz1PYmplY3QuYXNzaWduKHtnZW5lcmF0ZU1pcG1hcHM6ITEsaW50ZXJuYWxGb3JtYXQ6bnVsbCxtaW5GaWx0ZXI6JGksZGVwdGhCdWZmZXI6ITAsc3RlbmNpbEJ1ZmZlcjohMSxyZXNvbHZlRGVwdGhCdWZmZXI6ITAscmVzb2x2ZVN0ZW5jaWxCdWZmZXI6ITAsZGVwdGhUZXh0dXJlOm51bGwsc2FtcGxlczowLGNvdW50OjF9LHMpO2NvbnN0IGk9bmV3IER0KG4scy5tYXBwaW5nLHMud3JhcFMscy53cmFwVCxzLm1hZ0ZpbHRlcixzLm1pbkZpbHRlcixzLmZvcm1hdCxzLnR5cGUscy5hbmlzb3Ryb3B5LHMuY29sb3JTcGFjZSk7aS5mbGlwWT0hMSxpLmdlbmVyYXRlTWlwbWFwcz1zLmdlbmVyYXRlTWlwbWFwcyxpLmludGVybmFsRm9ybWF0PXMuaW50ZXJuYWxGb3JtYXQsdGhpcy50ZXh0dXJlcz1bXTtjb25zdCBvPXMuY291bnQ7Zm9yKGxldCBhPTA7YTxvO2ErKyl0aGlzLnRleHR1cmVzW2FdPWkuY2xvbmUoKSx0aGlzLnRleHR1cmVzW2FdLmlzUmVuZGVyVGFyZ2V0VGV4dHVyZT0hMDt0aGlzLmRlcHRoQnVmZmVyPXMuZGVwdGhCdWZmZXIsdGhpcy5zdGVuY2lsQnVmZmVyPXMuc3RlbmNpbEJ1ZmZlcix0aGlzLnJlc29sdmVEZXB0aEJ1ZmZlcj1zLnJlc29sdmVEZXB0aEJ1ZmZlcix0aGlzLnJlc29sdmVTdGVuY2lsQnVmZmVyPXMucmVzb2x2ZVN0ZW5jaWxCdWZmZXIsdGhpcy5kZXB0aFRleHR1cmU9cy5kZXB0aFRleHR1cmUsdGhpcy5zYW1wbGVzPXMuc2FtcGxlc31nZXQgdGV4dHVyZSgpe3JldHVybiB0aGlzLnRleHR1cmVzWzBdfXNldCB0ZXh0dXJlKHQpe3RoaXMudGV4dHVyZXNbMF09dH1zZXRTaXplKHQsZSxzPTEpe2lmKHRoaXMud2lkdGghPT10fHx0aGlzLmhlaWdodCE9PWV8fHRoaXMuZGVwdGghPT1zKXt0aGlzLndpZHRoPXQsdGhpcy5oZWlnaHQ9ZSx0aGlzLmRlcHRoPXM7Zm9yKGxldCBuPTAsaT10aGlzLnRleHR1cmVzLmxlbmd0aDtuPGk7bisrKXRoaXMudGV4dHVyZXNbbl0uaW1hZ2Uud2lkdGg9dCx0aGlzLnRleHR1cmVzW25dLmltYWdlLmhlaWdodD1lLHRoaXMudGV4dHVyZXNbbl0uaW1hZ2UuZGVwdGg9czt0aGlzLmRpc3Bvc2UoKX10aGlzLnZpZXdwb3J0LnNldCgwLDAsdCxlKSx0aGlzLnNjaXNzb3Iuc2V0KDAsMCx0LGUpfWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSh0aGlzKX1jb3B5KHQpe3RoaXMud2lkdGg9dC53aWR0aCx0aGlzLmhlaWdodD10LmhlaWdodCx0aGlzLmRlcHRoPXQuZGVwdGgsdGhpcy5zY2lzc29yLmNvcHkodC5zY2lzc29yKSx0aGlzLnNjaXNzb3JUZXN0PXQuc2Npc3NvclRlc3QsdGhpcy52aWV3cG9ydC5jb3B5KHQudmlld3BvcnQpLHRoaXMudGV4dHVyZXMubGVuZ3RoPTA7Zm9yKGxldCBzPTAsbj10LnRleHR1cmVzLmxlbmd0aDtzPG47cysrKXRoaXMudGV4dHVyZXNbc109dC50ZXh0dXJlc1tzXS5jbG9uZSgpLHRoaXMudGV4dHVyZXNbc10uaXNSZW5kZXJUYXJnZXRUZXh0dXJlPSEwO2NvbnN0IGU9T2JqZWN0LmFzc2lnbih7fSx0LnRleHR1cmUuaW1hZ2UpO3JldHVybiB0aGlzLnRleHR1cmUuc291cmNlPW5ldyBycihlKSx0aGlzLmRlcHRoQnVmZmVyPXQuZGVwdGhCdWZmZXIsdGhpcy5zdGVuY2lsQnVmZmVyPXQuc3RlbmNpbEJ1ZmZlcix0aGlzLnJlc29sdmVEZXB0aEJ1ZmZlcj10LnJlc29sdmVEZXB0aEJ1ZmZlcix0aGlzLnJlc29sdmVTdGVuY2lsQnVmZmVyPXQucmVzb2x2ZVN0ZW5jaWxCdWZmZXIsdC5kZXB0aFRleHR1cmUhPT1udWxsJiYodGhpcy5kZXB0aFRleHR1cmU9dC5kZXB0aFRleHR1cmUuY2xvbmUoKSksdGhpcy5zYW1wbGVzPXQuc2FtcGxlcyx0aGlzfWRpc3Bvc2UoKXt0aGlzLmRpc3BhdGNoRXZlbnQoe3R5cGU6ImRpc3Bvc2UifSl9fWNsYXNzIFFle2NvbnN0cnVjdG9yKHQ9MCxlPTAscz0wLG49MSl7dGhpcy5pc1F1YXRlcm5pb249ITAsdGhpcy5feD10LHRoaXMuX3k9ZSx0aGlzLl96PXMsdGhpcy5fdz1ufXN0YXRpYyBzbGVycEZsYXQodCxlLHMsbixpLG8sYSl7bGV0IGM9c1tuKzBdLHU9c1tuKzFdLGg9c1tuKzJdLGw9c1tuKzNdO2NvbnN0IGQ9aVtvKzBdLGY9aVtvKzFdLHA9aVtvKzJdLG09aVtvKzNdO2lmKGE9PT0wKXt0W2UrMF09Yyx0W2UrMV09dSx0W2UrMl09aCx0W2UrM109bDtyZXR1cm59aWYoYT09PTEpe3RbZSswXT1kLHRbZSsxXT1mLHRbZSsyXT1wLHRbZSszXT1tO3JldHVybn1pZihsIT09bXx8YyE9PWR8fHUhPT1mfHxoIT09cCl7bGV0IGc9MS1hO2NvbnN0IHk9YypkK3UqZitoKnArbCptLFQ9eT49MD8xOi0xLHc9MS15Knk7aWYodz5OdW1iZXIuRVBTSUxPTil7Y29uc3QgTj1NYXRoLnNxcnQodyksXz1NYXRoLmF0YW4yKE4seSpUKTtnPU1hdGguc2luKGcqXykvTixhPU1hdGguc2luKGEqXykvTn1jb25zdCBNPWEqVDtpZihjPWMqZytkKk0sdT11KmcrZipNLGg9aCpnK3AqTSxsPWwqZyttKk0sZz09PTEtYSl7Y29uc3QgTj0xL01hdGguc3FydChjKmMrdSp1K2gqaCtsKmwpO2MqPU4sdSo9TixoKj1OLGwqPU59fXRbZV09Yyx0W2UrMV09dSx0W2UrMl09aCx0W2UrM109bH1zdGF0aWMgbXVsdGlwbHlRdWF0ZXJuaW9uc0ZsYXQodCxlLHMsbixpLG8pe2NvbnN0IGE9c1tuXSxjPXNbbisxXSx1PXNbbisyXSxoPXNbbiszXSxsPWlbb10sZD1pW28rMV0sZj1pW28rMl0scD1pW28rM107cmV0dXJuIHRbZV09YSpwK2gqbCtjKmYtdSpkLHRbZSsxXT1jKnAraCpkK3UqbC1hKmYsdFtlKzJdPXUqcCtoKmYrYSpkLWMqbCx0W2UrM109aCpwLWEqbC1jKmQtdSpmLHR9Z2V0IHgoKXtyZXR1cm4gdGhpcy5feH1zZXQgeCh0KXt0aGlzLl94PXQsdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpfWdldCB5KCl7cmV0dXJuIHRoaXMuX3l9c2V0IHkodCl7dGhpcy5feT10LHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKX1nZXQgeigpe3JldHVybiB0aGlzLl96fXNldCB6KHQpe3RoaXMuX3o9dCx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCl9Z2V0IHcoKXtyZXR1cm4gdGhpcy5fd31zZXQgdyh0KXt0aGlzLl93PXQsdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpfXNldCh0LGUscyxuKXtyZXR1cm4gdGhpcy5feD10LHRoaXMuX3k9ZSx0aGlzLl96PXMsdGhpcy5fdz1uLHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMuX3gsdGhpcy5feSx0aGlzLl96LHRoaXMuX3cpfWNvcHkodCl7cmV0dXJuIHRoaXMuX3g9dC54LHRoaXMuX3k9dC55LHRoaXMuX3o9dC56LHRoaXMuX3c9dC53LHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfXNldEZyb21FdWxlcih0LGU9ITApe2NvbnN0IHM9dC5feCxuPXQuX3ksaT10Ll96LG89dC5fb3JkZXIsYT1NYXRoLmNvcyxjPU1hdGguc2luLHU9YShzLzIpLGg9YShuLzIpLGw9YShpLzIpLGQ9YyhzLzIpLGY9YyhuLzIpLHA9YyhpLzIpO3N3aXRjaChvKXtjYXNlIlhZWiI6dGhpcy5feD1kKmgqbCt1KmYqcCx0aGlzLl95PXUqZipsLWQqaCpwLHRoaXMuX3o9dSpoKnArZCpmKmwsdGhpcy5fdz11KmgqbC1kKmYqcDticmVhaztjYXNlIllYWiI6dGhpcy5feD1kKmgqbCt1KmYqcCx0aGlzLl95PXUqZipsLWQqaCpwLHRoaXMuX3o9dSpoKnAtZCpmKmwsdGhpcy5fdz11KmgqbCtkKmYqcDticmVhaztjYXNlIlpYWSI6dGhpcy5feD1kKmgqbC11KmYqcCx0aGlzLl95PXUqZipsK2QqaCpwLHRoaXMuX3o9dSpoKnArZCpmKmwsdGhpcy5fdz11KmgqbC1kKmYqcDticmVhaztjYXNlIlpZWCI6dGhpcy5feD1kKmgqbC11KmYqcCx0aGlzLl95PXUqZipsK2QqaCpwLHRoaXMuX3o9dSpoKnAtZCpmKmwsdGhpcy5fdz11KmgqbCtkKmYqcDticmVhaztjYXNlIllaWCI6dGhpcy5feD1kKmgqbCt1KmYqcCx0aGlzLl95PXUqZipsK2QqaCpwLHRoaXMuX3o9dSpoKnAtZCpmKmwsdGhpcy5fdz11KmgqbC1kKmYqcDticmVhaztjYXNlIlhaWSI6dGhpcy5feD1kKmgqbC11KmYqcCx0aGlzLl95PXUqZipsLWQqaCpwLHRoaXMuX3o9dSpoKnArZCpmKmwsdGhpcy5fdz11KmgqbCtkKmYqcDticmVhaztkZWZhdWx0OmNvbnNvbGUud2FybigiVEhSRUUuUXVhdGVybmlvbjogLnNldEZyb21FdWxlcigpIGVuY291bnRlcmVkIGFuIHVua25vd24gb3JkZXI6ICIrbyl9cmV0dXJuIGU9PT0hMCYmdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpLHRoaXN9c2V0RnJvbUF4aXNBbmdsZSh0LGUpe2NvbnN0IHM9ZS8yLG49TWF0aC5zaW4ocyk7cmV0dXJuIHRoaXMuX3g9dC54Km4sdGhpcy5feT10Lnkqbix0aGlzLl96PXQueipuLHRoaXMuX3c9TWF0aC5jb3MocyksdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpLHRoaXN9c2V0RnJvbVJvdGF0aW9uTWF0cml4KHQpe2NvbnN0IGU9dC5lbGVtZW50cyxzPWVbMF0sbj1lWzRdLGk9ZVs4XSxvPWVbMV0sYT1lWzVdLGM9ZVs5XSx1PWVbMl0saD1lWzZdLGw9ZVsxMF0sZD1zK2ErbDtpZihkPjApe2NvbnN0IGY9LjUvTWF0aC5zcXJ0KGQrMSk7dGhpcy5fdz0uMjUvZix0aGlzLl94PShoLWMpKmYsdGhpcy5feT0oaS11KSpmLHRoaXMuX3o9KG8tbikqZn1lbHNlIGlmKHM+YSYmcz5sKXtjb25zdCBmPTIqTWF0aC5zcXJ0KDErcy1hLWwpO3RoaXMuX3c9KGgtYykvZix0aGlzLl94PS4yNSpmLHRoaXMuX3k9KG4rbykvZix0aGlzLl96PShpK3UpL2Z9ZWxzZSBpZihhPmwpe2NvbnN0IGY9MipNYXRoLnNxcnQoMSthLXMtbCk7dGhpcy5fdz0oaS11KS9mLHRoaXMuX3g9KG4rbykvZix0aGlzLl95PS4yNSpmLHRoaXMuX3o9KGMraCkvZn1lbHNle2NvbnN0IGY9MipNYXRoLnNxcnQoMStsLXMtYSk7dGhpcy5fdz0oby1uKS9mLHRoaXMuX3g9KGkrdSkvZix0aGlzLl95PShjK2gpL2YsdGhpcy5fej0uMjUqZn1yZXR1cm4gdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpLHRoaXN9c2V0RnJvbVVuaXRWZWN0b3JzKHQsZSl7bGV0IHM9dC5kb3QoZSkrMTtyZXR1cm4gczxOdW1iZXIuRVBTSUxPTj8ocz0wLE1hdGguYWJzKHQueCk+TWF0aC5hYnModC56KT8odGhpcy5feD0tdC55LHRoaXMuX3k9dC54LHRoaXMuX3o9MCx0aGlzLl93PXMpOih0aGlzLl94PTAsdGhpcy5feT0tdC56LHRoaXMuX3o9dC55LHRoaXMuX3c9cykpOih0aGlzLl94PXQueSplLnotdC56KmUueSx0aGlzLl95PXQueiplLngtdC54KmUueix0aGlzLl96PXQueCplLnktdC55KmUueCx0aGlzLl93PXMpLHRoaXMubm9ybWFsaXplKCl9YW5nbGVUbyh0KXtyZXR1cm4gMipNYXRoLmFjb3MoTWF0aC5hYnMoYXQodGhpcy5kb3QodCksLTEsMSkpKX1yb3RhdGVUb3dhcmRzKHQsZSl7Y29uc3Qgcz10aGlzLmFuZ2xlVG8odCk7aWYocz09PTApcmV0dXJuIHRoaXM7Y29uc3Qgbj1NYXRoLm1pbigxLGUvcyk7cmV0dXJuIHRoaXMuc2xlcnAodCxuKSx0aGlzfWlkZW50aXR5KCl7cmV0dXJuIHRoaXMuc2V0KDAsMCwwLDEpfWludmVydCgpe3JldHVybiB0aGlzLmNvbmp1Z2F0ZSgpfWNvbmp1Z2F0ZSgpe3JldHVybiB0aGlzLl94Kj0tMSx0aGlzLl95Kj0tMSx0aGlzLl96Kj0tMSx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksdGhpc31kb3QodCl7cmV0dXJuIHRoaXMuX3gqdC5feCt0aGlzLl95KnQuX3krdGhpcy5feip0Ll96K3RoaXMuX3cqdC5fd31sZW5ndGhTcSgpe3JldHVybiB0aGlzLl94KnRoaXMuX3grdGhpcy5feSp0aGlzLl95K3RoaXMuX3oqdGhpcy5feit0aGlzLl93KnRoaXMuX3d9bGVuZ3RoKCl7cmV0dXJuIE1hdGguc3FydCh0aGlzLl94KnRoaXMuX3grdGhpcy5feSp0aGlzLl95K3RoaXMuX3oqdGhpcy5feit0aGlzLl93KnRoaXMuX3cpfW5vcm1hbGl6ZSgpe2xldCB0PXRoaXMubGVuZ3RoKCk7cmV0dXJuIHQ9PT0wPyh0aGlzLl94PTAsdGhpcy5feT0wLHRoaXMuX3o9MCx0aGlzLl93PTEpOih0PTEvdCx0aGlzLl94PXRoaXMuX3gqdCx0aGlzLl95PXRoaXMuX3kqdCx0aGlzLl96PXRoaXMuX3oqdCx0aGlzLl93PXRoaXMuX3cqdCksdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpLHRoaXN9bXVsdGlwbHkodCl7cmV0dXJuIHRoaXMubXVsdGlwbHlRdWF0ZXJuaW9ucyh0aGlzLHQpfXByZW11bHRpcGx5KHQpe3JldHVybiB0aGlzLm11bHRpcGx5UXVhdGVybmlvbnModCx0aGlzKX1tdWx0aXBseVF1YXRlcm5pb25zKHQsZSl7Y29uc3Qgcz10Ll94LG49dC5feSxpPXQuX3osbz10Ll93LGE9ZS5feCxjPWUuX3ksdT1lLl96LGg9ZS5fdztyZXR1cm4gdGhpcy5feD1zKmgrbyphK24qdS1pKmMsdGhpcy5feT1uKmgrbypjK2kqYS1zKnUsdGhpcy5fej1pKmgrbyp1K3MqYy1uKmEsdGhpcy5fdz1vKmgtcyphLW4qYy1pKnUsdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpLHRoaXN9c2xlcnAodCxlKXtpZihlPT09MClyZXR1cm4gdGhpcztpZihlPT09MSlyZXR1cm4gdGhpcy5jb3B5KHQpO2NvbnN0IHM9dGhpcy5feCxuPXRoaXMuX3ksaT10aGlzLl96LG89dGhpcy5fdztsZXQgYT1vKnQuX3crcyp0Ll94K24qdC5feStpKnQuX3o7aWYoYTwwPyh0aGlzLl93PS10Ll93LHRoaXMuX3g9LXQuX3gsdGhpcy5feT0tdC5feSx0aGlzLl96PS10Ll96LGE9LWEpOnRoaXMuY29weSh0KSxhPj0xKXJldHVybiB0aGlzLl93PW8sdGhpcy5feD1zLHRoaXMuX3k9bix0aGlzLl96PWksdGhpcztjb25zdCBjPTEtYSphO2lmKGM8PU51bWJlci5FUFNJTE9OKXtjb25zdCBmPTEtZTtyZXR1cm4gdGhpcy5fdz1mKm8rZSp0aGlzLl93LHRoaXMuX3g9ZipzK2UqdGhpcy5feCx0aGlzLl95PWYqbitlKnRoaXMuX3ksdGhpcy5fej1mKmkrZSp0aGlzLl96LHRoaXMubm9ybWFsaXplKCksdGhpc31jb25zdCB1PU1hdGguc3FydChjKSxoPU1hdGguYXRhbjIodSxhKSxsPU1hdGguc2luKCgxLWUpKmgpL3UsZD1NYXRoLnNpbihlKmgpL3U7cmV0dXJuIHRoaXMuX3c9bypsK3RoaXMuX3cqZCx0aGlzLl94PXMqbCt0aGlzLl94KmQsdGhpcy5feT1uKmwrdGhpcy5feSpkLHRoaXMuX3o9aSpsK3RoaXMuX3oqZCx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksdGhpc31zbGVycFF1YXRlcm5pb25zKHQsZSxzKXtyZXR1cm4gdGhpcy5jb3B5KHQpLnNsZXJwKGUscyl9cmFuZG9tKCl7Y29uc3QgdD0yKk1hdGguUEkqTWF0aC5yYW5kb20oKSxlPTIqTWF0aC5QSSpNYXRoLnJhbmRvbSgpLHM9TWF0aC5yYW5kb20oKSxuPU1hdGguc3FydCgxLXMpLGk9TWF0aC5zcXJ0KHMpO3JldHVybiB0aGlzLnNldChuKk1hdGguc2luKHQpLG4qTWF0aC5jb3ModCksaSpNYXRoLnNpbihlKSxpKk1hdGguY29zKGUpKX1lcXVhbHModCl7cmV0dXJuIHQuX3g9PT10aGlzLl94JiZ0Ll95PT09dGhpcy5feSYmdC5fej09PXRoaXMuX3omJnQuX3c9PT10aGlzLl93fWZyb21BcnJheSh0LGU9MCl7cmV0dXJuIHRoaXMuX3g9dFtlXSx0aGlzLl95PXRbZSsxXSx0aGlzLl96PXRbZSsyXSx0aGlzLl93PXRbZSszXSx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksdGhpc310b0FycmF5KHQ9W10sZT0wKXtyZXR1cm4gdFtlXT10aGlzLl94LHRbZSsxXT10aGlzLl95LHRbZSsyXT10aGlzLl96LHRbZSszXT10aGlzLl93LHR9ZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0LGUpe3JldHVybiB0aGlzLl94PXQuZ2V0WChlKSx0aGlzLl95PXQuZ2V0WShlKSx0aGlzLl96PXQuZ2V0WihlKSx0aGlzLl93PXQuZ2V0VyhlKSx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksdGhpc310b0pTT04oKXtyZXR1cm4gdGhpcy50b0FycmF5KCl9X29uQ2hhbmdlKHQpe3JldHVybiB0aGlzLl9vbkNoYW5nZUNhbGxiYWNrPXQsdGhpc31fb25DaGFuZ2VDYWxsYmFjaygpe30qW1N5bWJvbC5pdGVyYXRvcl0oKXt5aWVsZCB0aGlzLl94LHlpZWxkIHRoaXMuX3kseWllbGQgdGhpcy5feix5aWVsZCB0aGlzLl93fX1jbGFzcyBBe2NvbnN0cnVjdG9yKHQ9MCxlPTAscz0wKXtBLnByb3RvdHlwZS5pc1ZlY3RvcjM9ITAsdGhpcy54PXQsdGhpcy55PWUsdGhpcy56PXN9c2V0KHQsZSxzKXtyZXR1cm4gcz09PXZvaWQgMCYmKHM9dGhpcy56KSx0aGlzLng9dCx0aGlzLnk9ZSx0aGlzLno9cyx0aGlzfXNldFNjYWxhcih0KXtyZXR1cm4gdGhpcy54PXQsdGhpcy55PXQsdGhpcy56PXQsdGhpc31zZXRYKHQpe3JldHVybiB0aGlzLng9dCx0aGlzfXNldFkodCl7cmV0dXJuIHRoaXMueT10LHRoaXN9c2V0Wih0KXtyZXR1cm4gdGhpcy56PXQsdGhpc31zZXRDb21wb25lbnQodCxlKXtzd2l0Y2godCl7Y2FzZSAwOnRoaXMueD1lO2JyZWFrO2Nhc2UgMTp0aGlzLnk9ZTticmVhaztjYXNlIDI6dGhpcy56PWU7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoImluZGV4IGlzIG91dCBvZiByYW5nZTogIit0KX1yZXR1cm4gdGhpc31nZXRDb21wb25lbnQodCl7c3dpdGNoKHQpe2Nhc2UgMDpyZXR1cm4gdGhpcy54O2Nhc2UgMTpyZXR1cm4gdGhpcy55O2Nhc2UgMjpyZXR1cm4gdGhpcy56O2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJpbmRleCBpcyBvdXQgb2YgcmFuZ2U6ICIrdCl9fWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMueCx0aGlzLnksdGhpcy56KX1jb3B5KHQpe3JldHVybiB0aGlzLng9dC54LHRoaXMueT10LnksdGhpcy56PXQueix0aGlzfWFkZCh0KXtyZXR1cm4gdGhpcy54Kz10LngsdGhpcy55Kz10LnksdGhpcy56Kz10LnosdGhpc31hZGRTY2FsYXIodCl7cmV0dXJuIHRoaXMueCs9dCx0aGlzLnkrPXQsdGhpcy56Kz10LHRoaXN9YWRkVmVjdG9ycyh0LGUpe3JldHVybiB0aGlzLng9dC54K2UueCx0aGlzLnk9dC55K2UueSx0aGlzLno9dC56K2Uueix0aGlzfWFkZFNjYWxlZFZlY3Rvcih0LGUpe3JldHVybiB0aGlzLngrPXQueCplLHRoaXMueSs9dC55KmUsdGhpcy56Kz10LnoqZSx0aGlzfXN1Yih0KXtyZXR1cm4gdGhpcy54LT10LngsdGhpcy55LT10LnksdGhpcy56LT10LnosdGhpc31zdWJTY2FsYXIodCl7cmV0dXJuIHRoaXMueC09dCx0aGlzLnktPXQsdGhpcy56LT10LHRoaXN9c3ViVmVjdG9ycyh0LGUpe3JldHVybiB0aGlzLng9dC54LWUueCx0aGlzLnk9dC55LWUueSx0aGlzLno9dC56LWUueix0aGlzfW11bHRpcGx5KHQpe3JldHVybiB0aGlzLngqPXQueCx0aGlzLnkqPXQueSx0aGlzLnoqPXQueix0aGlzfW11bHRpcGx5U2NhbGFyKHQpe3JldHVybiB0aGlzLngqPXQsdGhpcy55Kj10LHRoaXMueio9dCx0aGlzfW11bHRpcGx5VmVjdG9ycyh0LGUpe3JldHVybiB0aGlzLng9dC54KmUueCx0aGlzLnk9dC55KmUueSx0aGlzLno9dC56KmUueix0aGlzfWFwcGx5RXVsZXIodCl7cmV0dXJuIHRoaXMuYXBwbHlRdWF0ZXJuaW9uKGFyLnNldEZyb21FdWxlcih0KSl9YXBwbHlBeGlzQW5nbGUodCxlKXtyZXR1cm4gdGhpcy5hcHBseVF1YXRlcm5pb24oYXIuc2V0RnJvbUF4aXNBbmdsZSh0LGUpKX1hcHBseU1hdHJpeDModCl7Y29uc3QgZT10aGlzLngscz10aGlzLnksbj10aGlzLnosaT10LmVsZW1lbnRzO3JldHVybiB0aGlzLng9aVswXSplK2lbM10qcytpWzZdKm4sdGhpcy55PWlbMV0qZStpWzRdKnMraVs3XSpuLHRoaXMuej1pWzJdKmUraVs1XSpzK2lbOF0qbix0aGlzfWFwcGx5Tm9ybWFsTWF0cml4KHQpe3JldHVybiB0aGlzLmFwcGx5TWF0cml4Myh0KS5ub3JtYWxpemUoKX1hcHBseU1hdHJpeDQodCl7Y29uc3QgZT10aGlzLngscz10aGlzLnksbj10aGlzLnosaT10LmVsZW1lbnRzLG89MS8oaVszXSplK2lbN10qcytpWzExXSpuK2lbMTVdKTtyZXR1cm4gdGhpcy54PShpWzBdKmUraVs0XSpzK2lbOF0qbitpWzEyXSkqbyx0aGlzLnk9KGlbMV0qZStpWzVdKnMraVs5XSpuK2lbMTNdKSpvLHRoaXMuej0oaVsyXSplK2lbNl0qcytpWzEwXSpuK2lbMTRdKSpvLHRoaXN9YXBwbHlRdWF0ZXJuaW9uKHQpe2NvbnN0IGU9dGhpcy54LHM9dGhpcy55LG49dGhpcy56LGk9dC54LG89dC55LGE9dC56LGM9dC53LHU9MioobypuLWEqcyksaD0yKihhKmUtaSpuKSxsPTIqKGkqcy1vKmUpO3JldHVybiB0aGlzLng9ZStjKnUrbypsLWEqaCx0aGlzLnk9cytjKmgrYSp1LWkqbCx0aGlzLno9bitjKmwraSpoLW8qdSx0aGlzfXByb2plY3QodCl7cmV0dXJuIHRoaXMuYXBwbHlNYXRyaXg0KHQubWF0cml4V29ybGRJbnZlcnNlKS5hcHBseU1hdHJpeDQodC5wcm9qZWN0aW9uTWF0cml4KX11bnByb2plY3QodCl7cmV0dXJuIHRoaXMuYXBwbHlNYXRyaXg0KHQucHJvamVjdGlvbk1hdHJpeEludmVyc2UpLmFwcGx5TWF0cml4NCh0Lm1hdHJpeFdvcmxkKX10cmFuc2Zvcm1EaXJlY3Rpb24odCl7Y29uc3QgZT10aGlzLngscz10aGlzLnksbj10aGlzLnosaT10LmVsZW1lbnRzO3JldHVybiB0aGlzLng9aVswXSplK2lbNF0qcytpWzhdKm4sdGhpcy55PWlbMV0qZStpWzVdKnMraVs5XSpuLHRoaXMuej1pWzJdKmUraVs2XSpzK2lbMTBdKm4sdGhpcy5ub3JtYWxpemUoKX1kaXZpZGUodCl7cmV0dXJuIHRoaXMueC89dC54LHRoaXMueS89dC55LHRoaXMuei89dC56LHRoaXN9ZGl2aWRlU2NhbGFyKHQpe3JldHVybiB0aGlzLm11bHRpcGx5U2NhbGFyKDEvdCl9bWluKHQpe3JldHVybiB0aGlzLng9TWF0aC5taW4odGhpcy54LHQueCksdGhpcy55PU1hdGgubWluKHRoaXMueSx0LnkpLHRoaXMuej1NYXRoLm1pbih0aGlzLnosdC56KSx0aGlzfW1heCh0KXtyZXR1cm4gdGhpcy54PU1hdGgubWF4KHRoaXMueCx0LngpLHRoaXMueT1NYXRoLm1heCh0aGlzLnksdC55KSx0aGlzLno9TWF0aC5tYXgodGhpcy56LHQueiksdGhpc31jbGFtcCh0LGUpe3JldHVybiB0aGlzLng9TWF0aC5tYXgodC54LE1hdGgubWluKGUueCx0aGlzLngpKSx0aGlzLnk9TWF0aC5tYXgodC55LE1hdGgubWluKGUueSx0aGlzLnkpKSx0aGlzLno9TWF0aC5tYXgodC56LE1hdGgubWluKGUueix0aGlzLnopKSx0aGlzfWNsYW1wU2NhbGFyKHQsZSl7cmV0dXJuIHRoaXMueD1NYXRoLm1heCh0LE1hdGgubWluKGUsdGhpcy54KSksdGhpcy55PU1hdGgubWF4KHQsTWF0aC5taW4oZSx0aGlzLnkpKSx0aGlzLno9TWF0aC5tYXgodCxNYXRoLm1pbihlLHRoaXMueikpLHRoaXN9Y2xhbXBMZW5ndGgodCxlKXtjb25zdCBzPXRoaXMubGVuZ3RoKCk7cmV0dXJuIHRoaXMuZGl2aWRlU2NhbGFyKHN8fDEpLm11bHRpcGx5U2NhbGFyKE1hdGgubWF4KHQsTWF0aC5taW4oZSxzKSkpfWZsb29yKCl7cmV0dXJuIHRoaXMueD1NYXRoLmZsb29yKHRoaXMueCksdGhpcy55PU1hdGguZmxvb3IodGhpcy55KSx0aGlzLno9TWF0aC5mbG9vcih0aGlzLnopLHRoaXN9Y2VpbCgpe3JldHVybiB0aGlzLng9TWF0aC5jZWlsKHRoaXMueCksdGhpcy55PU1hdGguY2VpbCh0aGlzLnkpLHRoaXMuej1NYXRoLmNlaWwodGhpcy56KSx0aGlzfXJvdW5kKCl7cmV0dXJuIHRoaXMueD1NYXRoLnJvdW5kKHRoaXMueCksdGhpcy55PU1hdGgucm91bmQodGhpcy55KSx0aGlzLno9TWF0aC5yb3VuZCh0aGlzLnopLHRoaXN9cm91bmRUb1plcm8oKXtyZXR1cm4gdGhpcy54PU1hdGgudHJ1bmModGhpcy54KSx0aGlzLnk9TWF0aC50cnVuYyh0aGlzLnkpLHRoaXMuej1NYXRoLnRydW5jKHRoaXMueiksdGhpc31uZWdhdGUoKXtyZXR1cm4gdGhpcy54PS10aGlzLngsdGhpcy55PS10aGlzLnksdGhpcy56PS10aGlzLnosdGhpc31kb3QodCl7cmV0dXJuIHRoaXMueCp0LngrdGhpcy55KnQueSt0aGlzLnoqdC56fWxlbmd0aFNxKCl7cmV0dXJuIHRoaXMueCp0aGlzLngrdGhpcy55KnRoaXMueSt0aGlzLnoqdGhpcy56fWxlbmd0aCgpe3JldHVybiBNYXRoLnNxcnQodGhpcy54KnRoaXMueCt0aGlzLnkqdGhpcy55K3RoaXMueip0aGlzLnopfW1hbmhhdHRhbkxlbmd0aCgpe3JldHVybiBNYXRoLmFicyh0aGlzLngpK01hdGguYWJzKHRoaXMueSkrTWF0aC5hYnModGhpcy56KX1ub3JtYWxpemUoKXtyZXR1cm4gdGhpcy5kaXZpZGVTY2FsYXIodGhpcy5sZW5ndGgoKXx8MSl9c2V0TGVuZ3RoKHQpe3JldHVybiB0aGlzLm5vcm1hbGl6ZSgpLm11bHRpcGx5U2NhbGFyKHQpfWxlcnAodCxlKXtyZXR1cm4gdGhpcy54Kz0odC54LXRoaXMueCkqZSx0aGlzLnkrPSh0LnktdGhpcy55KSplLHRoaXMueis9KHQuei10aGlzLnopKmUsdGhpc31sZXJwVmVjdG9ycyh0LGUscyl7cmV0dXJuIHRoaXMueD10LngrKGUueC10LngpKnMsdGhpcy55PXQueSsoZS55LXQueSkqcyx0aGlzLno9dC56KyhlLnotdC56KSpzLHRoaXN9Y3Jvc3ModCl7cmV0dXJuIHRoaXMuY3Jvc3NWZWN0b3JzKHRoaXMsdCl9Y3Jvc3NWZWN0b3JzKHQsZSl7Y29uc3Qgcz10Lngsbj10LnksaT10Lnosbz1lLngsYT1lLnksYz1lLno7cmV0dXJuIHRoaXMueD1uKmMtaSphLHRoaXMueT1pKm8tcypjLHRoaXMuej1zKmEtbipvLHRoaXN9cHJvamVjdE9uVmVjdG9yKHQpe2NvbnN0IGU9dC5sZW5ndGhTcSgpO2lmKGU9PT0wKXJldHVybiB0aGlzLnNldCgwLDAsMCk7Y29uc3Qgcz10LmRvdCh0aGlzKS9lO3JldHVybiB0aGlzLmNvcHkodCkubXVsdGlwbHlTY2FsYXIocyl9cHJvamVjdE9uUGxhbmUodCl7cmV0dXJuIFJuLmNvcHkodGhpcykucHJvamVjdE9uVmVjdG9yKHQpLHRoaXMuc3ViKFJuKX1yZWZsZWN0KHQpe3JldHVybiB0aGlzLnN1YihSbi5jb3B5KHQpLm11bHRpcGx5U2NhbGFyKDIqdGhpcy5kb3QodCkpKX1hbmdsZVRvKHQpe2NvbnN0IGU9TWF0aC5zcXJ0KHRoaXMubGVuZ3RoU3EoKSp0Lmxlbmd0aFNxKCkpO2lmKGU9PT0wKXJldHVybiBNYXRoLlBJLzI7Y29uc3Qgcz10aGlzLmRvdCh0KS9lO3JldHVybiBNYXRoLmFjb3MoYXQocywtMSwxKSl9ZGlzdGFuY2VUbyh0KXtyZXR1cm4gTWF0aC5zcXJ0KHRoaXMuZGlzdGFuY2VUb1NxdWFyZWQodCkpfWRpc3RhbmNlVG9TcXVhcmVkKHQpe2NvbnN0IGU9dGhpcy54LXQueCxzPXRoaXMueS10Lnksbj10aGlzLnotdC56O3JldHVybiBlKmUrcypzK24qbn1tYW5oYXR0YW5EaXN0YW5jZVRvKHQpe3JldHVybiBNYXRoLmFicyh0aGlzLngtdC54KStNYXRoLmFicyh0aGlzLnktdC55KStNYXRoLmFicyh0aGlzLnotdC56KX1zZXRGcm9tU3BoZXJpY2FsKHQpe3JldHVybiB0aGlzLnNldEZyb21TcGhlcmljYWxDb29yZHModC5yYWRpdXMsdC5waGksdC50aGV0YSl9c2V0RnJvbVNwaGVyaWNhbENvb3Jkcyh0LGUscyl7Y29uc3Qgbj1NYXRoLnNpbihlKSp0O3JldHVybiB0aGlzLng9bipNYXRoLnNpbihzKSx0aGlzLnk9TWF0aC5jb3MoZSkqdCx0aGlzLno9bipNYXRoLmNvcyhzKSx0aGlzfXNldEZyb21DeWxpbmRyaWNhbCh0KXtyZXR1cm4gdGhpcy5zZXRGcm9tQ3lsaW5kcmljYWxDb29yZHModC5yYWRpdXMsdC50aGV0YSx0LnkpfXNldEZyb21DeWxpbmRyaWNhbENvb3Jkcyh0LGUscyl7cmV0dXJuIHRoaXMueD10Kk1hdGguc2luKGUpLHRoaXMueT1zLHRoaXMuej10Kk1hdGguY29zKGUpLHRoaXN9c2V0RnJvbU1hdHJpeFBvc2l0aW9uKHQpe2NvbnN0IGU9dC5lbGVtZW50cztyZXR1cm4gdGhpcy54PWVbMTJdLHRoaXMueT1lWzEzXSx0aGlzLno9ZVsxNF0sdGhpc31zZXRGcm9tTWF0cml4U2NhbGUodCl7Y29uc3QgZT10aGlzLnNldEZyb21NYXRyaXhDb2x1bW4odCwwKS5sZW5ndGgoKSxzPXRoaXMuc2V0RnJvbU1hdHJpeENvbHVtbih0LDEpLmxlbmd0aCgpLG49dGhpcy5zZXRGcm9tTWF0cml4Q29sdW1uKHQsMikubGVuZ3RoKCk7cmV0dXJuIHRoaXMueD1lLHRoaXMueT1zLHRoaXMuej1uLHRoaXN9c2V0RnJvbU1hdHJpeENvbHVtbih0LGUpe3JldHVybiB0aGlzLmZyb21BcnJheSh0LmVsZW1lbnRzLGUqNCl9c2V0RnJvbU1hdHJpeDNDb2x1bW4odCxlKXtyZXR1cm4gdGhpcy5mcm9tQXJyYXkodC5lbGVtZW50cyxlKjMpfXNldEZyb21FdWxlcih0KXtyZXR1cm4gdGhpcy54PXQuX3gsdGhpcy55PXQuX3ksdGhpcy56PXQuX3osdGhpc31zZXRGcm9tQ29sb3IodCl7cmV0dXJuIHRoaXMueD10LnIsdGhpcy55PXQuZyx0aGlzLno9dC5iLHRoaXN9ZXF1YWxzKHQpe3JldHVybiB0Lng9PT10aGlzLngmJnQueT09PXRoaXMueSYmdC56PT09dGhpcy56fWZyb21BcnJheSh0LGU9MCl7cmV0dXJuIHRoaXMueD10W2VdLHRoaXMueT10W2UrMV0sdGhpcy56PXRbZSsyXSx0aGlzfXRvQXJyYXkodD1bXSxlPTApe3JldHVybiB0W2VdPXRoaXMueCx0W2UrMV09dGhpcy55LHRbZSsyXT10aGlzLnosdH1mcm9tQnVmZmVyQXR0cmlidXRlKHQsZSl7cmV0dXJuIHRoaXMueD10LmdldFgoZSksdGhpcy55PXQuZ2V0WShlKSx0aGlzLno9dC5nZXRaKGUpLHRoaXN9cmFuZG9tKCl7cmV0dXJuIHRoaXMueD1NYXRoLnJhbmRvbSgpLHRoaXMueT1NYXRoLnJhbmRvbSgpLHRoaXMuej1NYXRoLnJhbmRvbSgpLHRoaXN9cmFuZG9tRGlyZWN0aW9uKCl7Y29uc3QgdD1NYXRoLnJhbmRvbSgpKk1hdGguUEkqMixlPU1hdGgucmFuZG9tKCkqMi0xLHM9TWF0aC5zcXJ0KDEtZSplKTtyZXR1cm4gdGhpcy54PXMqTWF0aC5jb3ModCksdGhpcy55PWUsdGhpcy56PXMqTWF0aC5zaW4odCksdGhpc30qW1N5bWJvbC5pdGVyYXRvcl0oKXt5aWVsZCB0aGlzLngseWllbGQgdGhpcy55LHlpZWxkIHRoaXMuen19Y29uc3QgUm49bmV3IEEsYXI9bmV3IFFlO2NsYXNzIGh0e2NvbnN0cnVjdG9yKHQ9bmV3IEEoMS8wLDEvMCwxLzApLGU9bmV3IEEoLTEvMCwtMS8wLC0xLzApKXt0aGlzLmlzQm94Mz0hMCx0aGlzLm1pbj10LHRoaXMubWF4PWV9c2V0KHQsZSl7cmV0dXJuIHRoaXMubWluLmNvcHkodCksdGhpcy5tYXguY29weShlKSx0aGlzfXNldEZyb21BcnJheSh0KXt0aGlzLm1ha2VFbXB0eSgpO2ZvcihsZXQgZT0wLHM9dC5sZW5ndGg7ZTxzO2UrPTMpdGhpcy5leHBhbmRCeVBvaW50KFJ0LmZyb21BcnJheSh0LGUpKTtyZXR1cm4gdGhpc31zZXRGcm9tQnVmZmVyQXR0cmlidXRlKHQpe3RoaXMubWFrZUVtcHR5KCk7Zm9yKGxldCBlPTAscz10LmNvdW50O2U8cztlKyspdGhpcy5leHBhbmRCeVBvaW50KFJ0LmZyb21CdWZmZXJBdHRyaWJ1dGUodCxlKSk7cmV0dXJuIHRoaXN9c2V0RnJvbVBvaW50cyh0KXt0aGlzLm1ha2VFbXB0eSgpO2ZvcihsZXQgZT0wLHM9dC5sZW5ndGg7ZTxzO2UrKyl0aGlzLmV4cGFuZEJ5UG9pbnQodFtlXSk7cmV0dXJuIHRoaXN9c2V0RnJvbUNlbnRlckFuZFNpemUodCxlKXtjb25zdCBzPVJ0LmNvcHkoZSkubXVsdGlwbHlTY2FsYXIoLjUpO3JldHVybiB0aGlzLm1pbi5jb3B5KHQpLnN1YihzKSx0aGlzLm1heC5jb3B5KHQpLmFkZChzKSx0aGlzfXNldEZyb21PYmplY3QodCxlPSExKXtyZXR1cm4gdGhpcy5tYWtlRW1wdHkoKSx0aGlzLmV4cGFuZEJ5T2JqZWN0KHQsZSl9Y2xvbmUoKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KHRoaXMpfWNvcHkodCl7cmV0dXJuIHRoaXMubWluLmNvcHkodC5taW4pLHRoaXMubWF4LmNvcHkodC5tYXgpLHRoaXN9bWFrZUVtcHR5KCl7cmV0dXJuIHRoaXMubWluLng9dGhpcy5taW4ueT10aGlzLm1pbi56PTEvMCx0aGlzLm1heC54PXRoaXMubWF4Lnk9dGhpcy5tYXguej0tMS8wLHRoaXN9aXNFbXB0eSgpe3JldHVybiB0aGlzLm1heC54PHRoaXMubWluLnh8fHRoaXMubWF4Lnk8dGhpcy5taW4ueXx8dGhpcy5tYXguejx0aGlzLm1pbi56fWdldENlbnRlcih0KXtyZXR1cm4gdGhpcy5pc0VtcHR5KCk/dC5zZXQoMCwwLDApOnQuYWRkVmVjdG9ycyh0aGlzLm1pbix0aGlzLm1heCkubXVsdGlwbHlTY2FsYXIoLjUpfWdldFNpemUodCl7cmV0dXJuIHRoaXMuaXNFbXB0eSgpP3Quc2V0KDAsMCwwKTp0LnN1YlZlY3RvcnModGhpcy5tYXgsdGhpcy5taW4pfWV4cGFuZEJ5UG9pbnQodCl7cmV0dXJuIHRoaXMubWluLm1pbih0KSx0aGlzLm1heC5tYXgodCksdGhpc31leHBhbmRCeVZlY3Rvcih0KXtyZXR1cm4gdGhpcy5taW4uc3ViKHQpLHRoaXMubWF4LmFkZCh0KSx0aGlzfWV4cGFuZEJ5U2NhbGFyKHQpe3JldHVybiB0aGlzLm1pbi5hZGRTY2FsYXIoLXQpLHRoaXMubWF4LmFkZFNjYWxhcih0KSx0aGlzfWV4cGFuZEJ5T2JqZWN0KHQsZT0hMSl7dC51cGRhdGVXb3JsZE1hdHJpeCghMSwhMSk7Y29uc3Qgcz10Lmdlb21ldHJ5O2lmKHMhPT12b2lkIDApe2NvbnN0IGk9cy5nZXRBdHRyaWJ1dGUoInBvc2l0aW9uIik7aWYoZT09PSEwJiZpIT09dm9pZCAwJiZ0LmlzSW5zdGFuY2VkTWVzaCE9PSEwKWZvcihsZXQgbz0wLGE9aS5jb3VudDtvPGE7bysrKXQuaXNNZXNoPT09ITA/dC5nZXRWZXJ0ZXhQb3NpdGlvbihvLFJ0KTpSdC5mcm9tQnVmZmVyQXR0cmlidXRlKGksbyksUnQuYXBwbHlNYXRyaXg0KHQubWF0cml4V29ybGQpLHRoaXMuZXhwYW5kQnlQb2ludChSdCk7ZWxzZSB0LmJvdW5kaW5nQm94IT09dm9pZCAwPyh0LmJvdW5kaW5nQm94PT09bnVsbCYmdC5jb21wdXRlQm91bmRpbmdCb3goKSxGcy5jb3B5KHQuYm91bmRpbmdCb3gpKToocy5ib3VuZGluZ0JveD09PW51bGwmJnMuY29tcHV0ZUJvdW5kaW5nQm94KCksRnMuY29weShzLmJvdW5kaW5nQm94KSksRnMuYXBwbHlNYXRyaXg0KHQubWF0cml4V29ybGQpLHRoaXMudW5pb24oRnMpfWNvbnN0IG49dC5jaGlsZHJlbjtmb3IobGV0IGk9MCxvPW4ubGVuZ3RoO2k8bztpKyspdGhpcy5leHBhbmRCeU9iamVjdChuW2ldLGUpO3JldHVybiB0aGlzfWNvbnRhaW5zUG9pbnQodCl7cmV0dXJuIHQueD49dGhpcy5taW4ueCYmdC54PD10aGlzLm1heC54JiZ0Lnk+PXRoaXMubWluLnkmJnQueTw9dGhpcy5tYXgueSYmdC56Pj10aGlzLm1pbi56JiZ0Lno8PXRoaXMubWF4Lnp9Y29udGFpbnNCb3godCl7cmV0dXJuIHRoaXMubWluLng8PXQubWluLngmJnQubWF4Lng8PXRoaXMubWF4LngmJnRoaXMubWluLnk8PXQubWluLnkmJnQubWF4Lnk8PXRoaXMubWF4LnkmJnRoaXMubWluLno8PXQubWluLnomJnQubWF4Lno8PXRoaXMubWF4Lnp9Z2V0UGFyYW1ldGVyKHQsZSl7cmV0dXJuIGUuc2V0KCh0LngtdGhpcy5taW4ueCkvKHRoaXMubWF4LngtdGhpcy5taW4ueCksKHQueS10aGlzLm1pbi55KS8odGhpcy5tYXgueS10aGlzLm1pbi55KSwodC56LXRoaXMubWluLnopLyh0aGlzLm1heC56LXRoaXMubWluLnopKX1pbnRlcnNlY3RzQm94KHQpe3JldHVybiB0Lm1heC54Pj10aGlzLm1pbi54JiZ0Lm1pbi54PD10aGlzLm1heC54JiZ0Lm1heC55Pj10aGlzLm1pbi55JiZ0Lm1pbi55PD10aGlzLm1heC55JiZ0Lm1heC56Pj10aGlzLm1pbi56JiZ0Lm1pbi56PD10aGlzLm1heC56fWludGVyc2VjdHNTcGhlcmUodCl7cmV0dXJuIHRoaXMuY2xhbXBQb2ludCh0LmNlbnRlcixSdCksUnQuZGlzdGFuY2VUb1NxdWFyZWQodC5jZW50ZXIpPD10LnJhZGl1cyp0LnJhZGl1c31pbnRlcnNlY3RzUGxhbmUodCl7bGV0IGUscztyZXR1cm4gdC5ub3JtYWwueD4wPyhlPXQubm9ybWFsLngqdGhpcy5taW4ueCxzPXQubm9ybWFsLngqdGhpcy5tYXgueCk6KGU9dC5ub3JtYWwueCp0aGlzLm1heC54LHM9dC5ub3JtYWwueCp0aGlzLm1pbi54KSx0Lm5vcm1hbC55PjA/KGUrPXQubm9ybWFsLnkqdGhpcy5taW4ueSxzKz10Lm5vcm1hbC55KnRoaXMubWF4LnkpOihlKz10Lm5vcm1hbC55KnRoaXMubWF4Lnkscys9dC5ub3JtYWwueSp0aGlzLm1pbi55KSx0Lm5vcm1hbC56PjA/KGUrPXQubm9ybWFsLnoqdGhpcy5taW4ueixzKz10Lm5vcm1hbC56KnRoaXMubWF4LnopOihlKz10Lm5vcm1hbC56KnRoaXMubWF4Lnoscys9dC5ub3JtYWwueip0aGlzLm1pbi56KSxlPD0tdC5jb25zdGFudCYmcz49LXQuY29uc3RhbnR9aW50ZXJzZWN0c1RyaWFuZ2xlKHQpe2lmKHRoaXMuaXNFbXB0eSgpKXJldHVybiExO3RoaXMuZ2V0Q2VudGVyKEtlKSxScy5zdWJWZWN0b3JzKHRoaXMubWF4LEtlKSxOZS5zdWJWZWN0b3JzKHQuYSxLZSksd2Uuc3ViVmVjdG9ycyh0LmIsS2UpLEFlLnN1YlZlY3RvcnModC5jLEtlKSx0ZS5zdWJWZWN0b3JzKHdlLE5lKSxlZS5zdWJWZWN0b3JzKEFlLHdlKSx1ZS5zdWJWZWN0b3JzKE5lLEFlKTtsZXQgZT1bMCwtdGUueix0ZS55LDAsLWVlLnosZWUueSwwLC11ZS56LHVlLnksdGUueiwwLC10ZS54LGVlLnosMCwtZWUueCx1ZS56LDAsLXVlLngsLXRlLnksdGUueCwwLC1lZS55LGVlLngsMCwtdWUueSx1ZS54LDBdO3JldHVybiFCbihlLE5lLHdlLEFlLFJzKXx8KGU9WzEsMCwwLDAsMSwwLDAsMCwxXSwhQm4oZSxOZSx3ZSxBZSxScykpPyExOihCcy5jcm9zc1ZlY3RvcnModGUsZWUpLGU9W0JzLngsQnMueSxCcy56XSxCbihlLE5lLHdlLEFlLFJzKSl9Y2xhbXBQb2ludCh0LGUpe3JldHVybiBlLmNvcHkodCkuY2xhbXAodGhpcy5taW4sdGhpcy5tYXgpfWRpc3RhbmNlVG9Qb2ludCh0KXtyZXR1cm4gdGhpcy5jbGFtcFBvaW50KHQsUnQpLmRpc3RhbmNlVG8odCl9Z2V0Qm91bmRpbmdTcGhlcmUodCl7cmV0dXJuIHRoaXMuaXNFbXB0eSgpP3QubWFrZUVtcHR5KCk6KHRoaXMuZ2V0Q2VudGVyKHQuY2VudGVyKSx0LnJhZGl1cz10aGlzLmdldFNpemUoUnQpLmxlbmd0aCgpKi41KSx0fWludGVyc2VjdCh0KXtyZXR1cm4gdGhpcy5taW4ubWF4KHQubWluKSx0aGlzLm1heC5taW4odC5tYXgpLHRoaXMuaXNFbXB0eSgpJiZ0aGlzLm1ha2VFbXB0eSgpLHRoaXN9dW5pb24odCl7cmV0dXJuIHRoaXMubWluLm1pbih0Lm1pbiksdGhpcy5tYXgubWF4KHQubWF4KSx0aGlzfWFwcGx5TWF0cml4NCh0KXtyZXR1cm4gdGhpcy5pc0VtcHR5KCk/dGhpczooR3RbMF0uc2V0KHRoaXMubWluLngsdGhpcy5taW4ueSx0aGlzLm1pbi56KS5hcHBseU1hdHJpeDQodCksR3RbMV0uc2V0KHRoaXMubWluLngsdGhpcy5taW4ueSx0aGlzLm1heC56KS5hcHBseU1hdHJpeDQodCksR3RbMl0uc2V0KHRoaXMubWluLngsdGhpcy5tYXgueSx0aGlzLm1pbi56KS5hcHBseU1hdHJpeDQodCksR3RbM10uc2V0KHRoaXMubWluLngsdGhpcy5tYXgueSx0aGlzLm1heC56KS5hcHBseU1hdHJpeDQodCksR3RbNF0uc2V0KHRoaXMubWF4LngsdGhpcy5taW4ueSx0aGlzLm1pbi56KS5hcHBseU1hdHJpeDQodCksR3RbNV0uc2V0KHRoaXMubWF4LngsdGhpcy5taW4ueSx0aGlzLm1heC56KS5hcHBseU1hdHJpeDQodCksR3RbNl0uc2V0KHRoaXMubWF4LngsdGhpcy5tYXgueSx0aGlzLm1pbi56KS5hcHBseU1hdHJpeDQodCksR3RbN10uc2V0KHRoaXMubWF4LngsdGhpcy5tYXgueSx0aGlzLm1heC56KS5hcHBseU1hdHJpeDQodCksdGhpcy5zZXRGcm9tUG9pbnRzKEd0KSx0aGlzKX10cmFuc2xhdGUodCl7cmV0dXJuIHRoaXMubWluLmFkZCh0KSx0aGlzLm1heC5hZGQodCksdGhpc31lcXVhbHModCl7cmV0dXJuIHQubWluLmVxdWFscyh0aGlzLm1pbikmJnQubWF4LmVxdWFscyh0aGlzLm1heCl9fWNvbnN0IEd0PVtuZXcgQSxuZXcgQSxuZXcgQSxuZXcgQSxuZXcgQSxuZXcgQSxuZXcgQSxuZXcgQV0sUnQ9bmV3IEEsRnM9bmV3IGh0LE5lPW5ldyBBLHdlPW5ldyBBLEFlPW5ldyBBLHRlPW5ldyBBLGVlPW5ldyBBLHVlPW5ldyBBLEtlPW5ldyBBLFJzPW5ldyBBLEJzPW5ldyBBLGxlPW5ldyBBO2Z1bmN0aW9uIEJuKHIsdCxlLHMsbil7Zm9yKGxldCBpPTAsbz1yLmxlbmd0aC0zO2k8PW87aSs9Myl7bGUuZnJvbUFycmF5KHIsaSk7Y29uc3QgYT1uLngqTWF0aC5hYnMobGUueCkrbi55Kk1hdGguYWJzKGxlLnkpK24ueipNYXRoLmFicyhsZS56KSxjPXQuZG90KGxlKSx1PWUuZG90KGxlKSxoPXMuZG90KGxlKTtpZihNYXRoLm1heCgtTWF0aC5tYXgoYyx1LGgpLE1hdGgubWluKGMsdSxoKSk+YSlyZXR1cm4hMX1yZXR1cm4hMH1jb25zdCBhYT1uZXcgaHQsdHM9bmV3IEEsSW49bmV3IEE7Y2xhc3MgY3J7Y29uc3RydWN0b3IodD1uZXcgQSxlPS0xKXt0aGlzLmlzU3BoZXJlPSEwLHRoaXMuY2VudGVyPXQsdGhpcy5yYWRpdXM9ZX1zZXQodCxlKXtyZXR1cm4gdGhpcy5jZW50ZXIuY29weSh0KSx0aGlzLnJhZGl1cz1lLHRoaXN9c2V0RnJvbVBvaW50cyh0LGUpe2NvbnN0IHM9dGhpcy5jZW50ZXI7ZSE9PXZvaWQgMD9zLmNvcHkoZSk6YWEuc2V0RnJvbVBvaW50cyh0KS5nZXRDZW50ZXIocyk7bGV0IG49MDtmb3IobGV0IGk9MCxvPXQubGVuZ3RoO2k8bztpKyspbj1NYXRoLm1heChuLHMuZGlzdGFuY2VUb1NxdWFyZWQodFtpXSkpO3JldHVybiB0aGlzLnJhZGl1cz1NYXRoLnNxcnQobiksdGhpc31jb3B5KHQpe3JldHVybiB0aGlzLmNlbnRlci5jb3B5KHQuY2VudGVyKSx0aGlzLnJhZGl1cz10LnJhZGl1cyx0aGlzfWlzRW1wdHkoKXtyZXR1cm4gdGhpcy5yYWRpdXM8MH1tYWtlRW1wdHkoKXtyZXR1cm4gdGhpcy5jZW50ZXIuc2V0KDAsMCwwKSx0aGlzLnJhZGl1cz0tMSx0aGlzfWNvbnRhaW5zUG9pbnQodCl7cmV0dXJuIHQuZGlzdGFuY2VUb1NxdWFyZWQodGhpcy5jZW50ZXIpPD10aGlzLnJhZGl1cyp0aGlzLnJhZGl1c31kaXN0YW5jZVRvUG9pbnQodCl7cmV0dXJuIHQuZGlzdGFuY2VUbyh0aGlzLmNlbnRlciktdGhpcy5yYWRpdXN9aW50ZXJzZWN0c1NwaGVyZSh0KXtjb25zdCBlPXRoaXMucmFkaXVzK3QucmFkaXVzO3JldHVybiB0LmNlbnRlci5kaXN0YW5jZVRvU3F1YXJlZCh0aGlzLmNlbnRlcik8PWUqZX1pbnRlcnNlY3RzQm94KHQpe3JldHVybiB0LmludGVyc2VjdHNTcGhlcmUodGhpcyl9aW50ZXJzZWN0c1BsYW5lKHQpe3JldHVybiBNYXRoLmFicyh0LmRpc3RhbmNlVG9Qb2ludCh0aGlzLmNlbnRlcikpPD10aGlzLnJhZGl1c31jbGFtcFBvaW50KHQsZSl7Y29uc3Qgcz10aGlzLmNlbnRlci5kaXN0YW5jZVRvU3F1YXJlZCh0KTtyZXR1cm4gZS5jb3B5KHQpLHM+dGhpcy5yYWRpdXMqdGhpcy5yYWRpdXMmJihlLnN1Yih0aGlzLmNlbnRlcikubm9ybWFsaXplKCksZS5tdWx0aXBseVNjYWxhcih0aGlzLnJhZGl1cykuYWRkKHRoaXMuY2VudGVyKSksZX1nZXRCb3VuZGluZ0JveCh0KXtyZXR1cm4gdGhpcy5pc0VtcHR5KCk/KHQubWFrZUVtcHR5KCksdCk6KHQuc2V0KHRoaXMuY2VudGVyLHRoaXMuY2VudGVyKSx0LmV4cGFuZEJ5U2NhbGFyKHRoaXMucmFkaXVzKSx0KX1hcHBseU1hdHJpeDQodCl7cmV0dXJuIHRoaXMuY2VudGVyLmFwcGx5TWF0cml4NCh0KSx0aGlzLnJhZGl1cz10aGlzLnJhZGl1cyp0LmdldE1heFNjYWxlT25BeGlzKCksdGhpc310cmFuc2xhdGUodCl7cmV0dXJuIHRoaXMuY2VudGVyLmFkZCh0KSx0aGlzfWV4cGFuZEJ5UG9pbnQodCl7aWYodGhpcy5pc0VtcHR5KCkpcmV0dXJuIHRoaXMuY2VudGVyLmNvcHkodCksdGhpcy5yYWRpdXM9MCx0aGlzO3RzLnN1YlZlY3RvcnModCx0aGlzLmNlbnRlcik7Y29uc3QgZT10cy5sZW5ndGhTcSgpO2lmKGU+dGhpcy5yYWRpdXMqdGhpcy5yYWRpdXMpe2NvbnN0IHM9TWF0aC5zcXJ0KGUpLG49KHMtdGhpcy5yYWRpdXMpKi41O3RoaXMuY2VudGVyLmFkZFNjYWxlZFZlY3Rvcih0cyxuL3MpLHRoaXMucmFkaXVzKz1ufXJldHVybiB0aGlzfXVuaW9uKHQpe3JldHVybiB0LmlzRW1wdHkoKT90aGlzOnRoaXMuaXNFbXB0eSgpPyh0aGlzLmNvcHkodCksdGhpcyk6KHRoaXMuY2VudGVyLmVxdWFscyh0LmNlbnRlcik9PT0hMD90aGlzLnJhZGl1cz1NYXRoLm1heCh0aGlzLnJhZGl1cyx0LnJhZGl1cyk6KEluLnN1YlZlY3RvcnModC5jZW50ZXIsdGhpcy5jZW50ZXIpLnNldExlbmd0aCh0LnJhZGl1cyksdGhpcy5leHBhbmRCeVBvaW50KHRzLmNvcHkodC5jZW50ZXIpLmFkZChJbikpLHRoaXMuZXhwYW5kQnlQb2ludCh0cy5jb3B5KHQuY2VudGVyKS5zdWIoSW4pKSksdGhpcyl9ZXF1YWxzKHQpe3JldHVybiB0LmNlbnRlci5lcXVhbHModGhpcy5jZW50ZXIpJiZ0LnJhZGl1cz09PXRoaXMucmFkaXVzfWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSh0aGlzKX19Y2xhc3MgbnR7Y29uc3RydWN0b3IodCxlLHMsbixpLG8sYSxjLHUsaCxsLGQsZixwLG0sZyl7bnQucHJvdG90eXBlLmlzTWF0cml4ND0hMCx0aGlzLmVsZW1lbnRzPVsxLDAsMCwwLDAsMSwwLDAsMCwwLDEsMCwwLDAsMCwxXSx0IT09dm9pZCAwJiZ0aGlzLnNldCh0LGUscyxuLGksbyxhLGMsdSxoLGwsZCxmLHAsbSxnKX1zZXQodCxlLHMsbixpLG8sYSxjLHUsaCxsLGQsZixwLG0sZyl7Y29uc3QgeT10aGlzLmVsZW1lbnRzO3JldHVybiB5WzBdPXQseVs0XT1lLHlbOF09cyx5WzEyXT1uLHlbMV09aSx5WzVdPW8seVs5XT1hLHlbMTNdPWMseVsyXT11LHlbNl09aCx5WzEwXT1sLHlbMTRdPWQseVszXT1mLHlbN109cCx5WzExXT1tLHlbMTVdPWcsdGhpc31pZGVudGl0eSgpe3JldHVybiB0aGlzLnNldCgxLDAsMCwwLDAsMSwwLDAsMCwwLDEsMCwwLDAsMCwxKSx0aGlzfWNsb25lKCl7cmV0dXJuIG5ldyBudCgpLmZyb21BcnJheSh0aGlzLmVsZW1lbnRzKX1jb3B5KHQpe2NvbnN0IGU9dGhpcy5lbGVtZW50cyxzPXQuZWxlbWVudHM7cmV0dXJuIGVbMF09c1swXSxlWzFdPXNbMV0sZVsyXT1zWzJdLGVbM109c1szXSxlWzRdPXNbNF0sZVs1XT1zWzVdLGVbNl09c1s2XSxlWzddPXNbN10sZVs4XT1zWzhdLGVbOV09c1s5XSxlWzEwXT1zWzEwXSxlWzExXT1zWzExXSxlWzEyXT1zWzEyXSxlWzEzXT1zWzEzXSxlWzE0XT1zWzE0XSxlWzE1XT1zWzE1XSx0aGlzfWNvcHlQb3NpdGlvbih0KXtjb25zdCBlPXRoaXMuZWxlbWVudHMscz10LmVsZW1lbnRzO3JldHVybiBlWzEyXT1zWzEyXSxlWzEzXT1zWzEzXSxlWzE0XT1zWzE0XSx0aGlzfXNldEZyb21NYXRyaXgzKHQpe2NvbnN0IGU9dC5lbGVtZW50cztyZXR1cm4gdGhpcy5zZXQoZVswXSxlWzNdLGVbNl0sMCxlWzFdLGVbNF0sZVs3XSwwLGVbMl0sZVs1XSxlWzhdLDAsMCwwLDAsMSksdGhpc31leHRyYWN0QmFzaXModCxlLHMpe3JldHVybiB0LnNldEZyb21NYXRyaXhDb2x1bW4odGhpcywwKSxlLnNldEZyb21NYXRyaXhDb2x1bW4odGhpcywxKSxzLnNldEZyb21NYXRyaXhDb2x1bW4odGhpcywyKSx0aGlzfW1ha2VCYXNpcyh0LGUscyl7cmV0dXJuIHRoaXMuc2V0KHQueCxlLngscy54LDAsdC55LGUueSxzLnksMCx0LnosZS56LHMueiwwLDAsMCwwLDEpLHRoaXN9ZXh0cmFjdFJvdGF0aW9uKHQpe2NvbnN0IGU9dGhpcy5lbGVtZW50cyxzPXQuZWxlbWVudHMsbj0xL01lLnNldEZyb21NYXRyaXhDb2x1bW4odCwwKS5sZW5ndGgoKSxpPTEvTWUuc2V0RnJvbU1hdHJpeENvbHVtbih0LDEpLmxlbmd0aCgpLG89MS9NZS5zZXRGcm9tTWF0cml4Q29sdW1uKHQsMikubGVuZ3RoKCk7cmV0dXJuIGVbMF09c1swXSpuLGVbMV09c1sxXSpuLGVbMl09c1syXSpuLGVbM109MCxlWzRdPXNbNF0qaSxlWzVdPXNbNV0qaSxlWzZdPXNbNl0qaSxlWzddPTAsZVs4XT1zWzhdKm8sZVs5XT1zWzldKm8sZVsxMF09c1sxMF0qbyxlWzExXT0wLGVbMTJdPTAsZVsxM109MCxlWzE0XT0wLGVbMTVdPTEsdGhpc31tYWtlUm90YXRpb25Gcm9tRXVsZXIodCl7Y29uc3QgZT10aGlzLmVsZW1lbnRzLHM9dC54LG49dC55LGk9dC56LG89TWF0aC5jb3MocyksYT1NYXRoLnNpbihzKSxjPU1hdGguY29zKG4pLHU9TWF0aC5zaW4obiksaD1NYXRoLmNvcyhpKSxsPU1hdGguc2luKGkpO2lmKHQub3JkZXI9PT0iWFlaIil7Y29uc3QgZD1vKmgsZj1vKmwscD1hKmgsbT1hKmw7ZVswXT1jKmgsZVs0XT0tYypsLGVbOF09dSxlWzFdPWYrcCp1LGVbNV09ZC1tKnUsZVs5XT0tYSpjLGVbMl09bS1kKnUsZVs2XT1wK2YqdSxlWzEwXT1vKmN9ZWxzZSBpZih0Lm9yZGVyPT09IllYWiIpe2NvbnN0IGQ9YypoLGY9YypsLHA9dSpoLG09dSpsO2VbMF09ZCttKmEsZVs0XT1wKmEtZixlWzhdPW8qdSxlWzFdPW8qbCxlWzVdPW8qaCxlWzldPS1hLGVbMl09ZiphLXAsZVs2XT1tK2QqYSxlWzEwXT1vKmN9ZWxzZSBpZih0Lm9yZGVyPT09IlpYWSIpe2NvbnN0IGQ9YypoLGY9YypsLHA9dSpoLG09dSpsO2VbMF09ZC1tKmEsZVs0XT0tbypsLGVbOF09cCtmKmEsZVsxXT1mK3AqYSxlWzVdPW8qaCxlWzldPW0tZCphLGVbMl09LW8qdSxlWzZdPWEsZVsxMF09bypjfWVsc2UgaWYodC5vcmRlcj09PSJaWVgiKXtjb25zdCBkPW8qaCxmPW8qbCxwPWEqaCxtPWEqbDtlWzBdPWMqaCxlWzRdPXAqdS1mLGVbOF09ZCp1K20sZVsxXT1jKmwsZVs1XT1tKnUrZCxlWzldPWYqdS1wLGVbMl09LXUsZVs2XT1hKmMsZVsxMF09bypjfWVsc2UgaWYodC5vcmRlcj09PSJZWlgiKXtjb25zdCBkPW8qYyxmPW8qdSxwPWEqYyxtPWEqdTtlWzBdPWMqaCxlWzRdPW0tZCpsLGVbOF09cCpsK2YsZVsxXT1sLGVbNV09bypoLGVbOV09LWEqaCxlWzJdPS11KmgsZVs2XT1mKmwrcCxlWzEwXT1kLW0qbH1lbHNlIGlmKHQub3JkZXI9PT0iWFpZIil7Y29uc3QgZD1vKmMsZj1vKnUscD1hKmMsbT1hKnU7ZVswXT1jKmgsZVs0XT0tbCxlWzhdPXUqaCxlWzFdPWQqbCttLGVbNV09bypoLGVbOV09ZipsLXAsZVsyXT1wKmwtZixlWzZdPWEqaCxlWzEwXT1tKmwrZH1yZXR1cm4gZVszXT0wLGVbN109MCxlWzExXT0wLGVbMTJdPTAsZVsxM109MCxlWzE0XT0wLGVbMTVdPTEsdGhpc31tYWtlUm90YXRpb25Gcm9tUXVhdGVybmlvbih0KXtyZXR1cm4gdGhpcy5jb21wb3NlKGNhLHQsaGEpfWxvb2tBdCh0LGUscyl7Y29uc3Qgbj10aGlzLmVsZW1lbnRzO3JldHVybiB5dC5zdWJWZWN0b3JzKHQsZSkseXQubGVuZ3RoU3EoKT09PTAmJih5dC56PTEpLHl0Lm5vcm1hbGl6ZSgpLHNlLmNyb3NzVmVjdG9ycyhzLHl0KSxzZS5sZW5ndGhTcSgpPT09MCYmKE1hdGguYWJzKHMueik9PT0xP3l0LngrPTFlLTQ6eXQueis9MWUtNCx5dC5ub3JtYWxpemUoKSxzZS5jcm9zc1ZlY3RvcnMocyx5dCkpLHNlLm5vcm1hbGl6ZSgpLElzLmNyb3NzVmVjdG9ycyh5dCxzZSksblswXT1zZS54LG5bNF09SXMueCxuWzhdPXl0LngsblsxXT1zZS55LG5bNV09SXMueSxuWzldPXl0LnksblsyXT1zZS56LG5bNl09SXMueixuWzEwXT15dC56LHRoaXN9bXVsdGlwbHkodCl7cmV0dXJuIHRoaXMubXVsdGlwbHlNYXRyaWNlcyh0aGlzLHQpfXByZW11bHRpcGx5KHQpe3JldHVybiB0aGlzLm11bHRpcGx5TWF0cmljZXModCx0aGlzKX1tdWx0aXBseU1hdHJpY2VzKHQsZSl7Y29uc3Qgcz10LmVsZW1lbnRzLG49ZS5lbGVtZW50cyxpPXRoaXMuZWxlbWVudHMsbz1zWzBdLGE9c1s0XSxjPXNbOF0sdT1zWzEyXSxoPXNbMV0sbD1zWzVdLGQ9c1s5XSxmPXNbMTNdLHA9c1syXSxtPXNbNl0sZz1zWzEwXSx5PXNbMTRdLFQ9c1szXSx3PXNbN10sTT1zWzExXSxOPXNbMTVdLF89blswXSxTPW5bNF0sRT1uWzhdLEY9blsxMl0sUj1uWzFdLEk9bls1XSxCPW5bOV0sUD1uWzEzXSxMPW5bMl0sVj1uWzZdLEc9blsxMF0sTnQ9blsxNF0sSHQ9blszXSxxdD1uWzddLE5uPW5bMTFdLHduPW5bMTVdO3JldHVybiBpWzBdPW8qXythKlIrYypMK3UqSHQsaVs0XT1vKlMrYSpJK2MqVit1KnF0LGlbOF09bypFK2EqQitjKkcrdSpObixpWzEyXT1vKkYrYSpQK2MqTnQrdSp3bixpWzFdPWgqXytsKlIrZCpMK2YqSHQsaVs1XT1oKlMrbCpJK2QqVitmKnF0LGlbOV09aCpFK2wqQitkKkcrZipObixpWzEzXT1oKkYrbCpQK2QqTnQrZip3bixpWzJdPXAqXyttKlIrZypMK3kqSHQsaVs2XT1wKlMrbSpJK2cqVit5KnF0LGlbMTBdPXAqRSttKkIrZypHK3kqTm4saVsxNF09cCpGK20qUCtnKk50K3kqd24saVszXT1UKl8rdypSK00qTCtOKkh0LGlbN109VCpTK3cqSStNKlYrTipxdCxpWzExXT1UKkUrdypCK00qRytOKk5uLGlbMTVdPVQqRit3KlArTSpOdCtOKnduLHRoaXN9bXVsdGlwbHlTY2FsYXIodCl7Y29uc3QgZT10aGlzLmVsZW1lbnRzO3JldHVybiBlWzBdKj10LGVbNF0qPXQsZVs4XSo9dCxlWzEyXSo9dCxlWzFdKj10LGVbNV0qPXQsZVs5XSo9dCxlWzEzXSo9dCxlWzJdKj10LGVbNl0qPXQsZVsxMF0qPXQsZVsxNF0qPXQsZVszXSo9dCxlWzddKj10LGVbMTFdKj10LGVbMTVdKj10LHRoaXN9ZGV0ZXJtaW5hbnQoKXtjb25zdCB0PXRoaXMuZWxlbWVudHMsZT10WzBdLHM9dFs0XSxuPXRbOF0saT10WzEyXSxvPXRbMV0sYT10WzVdLGM9dFs5XSx1PXRbMTNdLGg9dFsyXSxsPXRbNl0sZD10WzEwXSxmPXRbMTRdLHA9dFszXSxtPXRbN10sZz10WzExXSx5PXRbMTVdO3JldHVybiBwKigraSpjKmwtbip1KmwtaSphKmQrcyp1KmQrbiphKmYtcypjKmYpK20qKCtlKmMqZi1lKnUqZCtpKm8qZC1uKm8qZituKnUqaC1pKmMqaCkrZyooK2UqdSpsLWUqYSpmLWkqbypsK3MqbypmK2kqYSpoLXMqdSpoKSt5KigtbiphKmgtZSpjKmwrZSphKmQrbipvKmwtcypvKmQrcypjKmgpfXRyYW5zcG9zZSgpe2NvbnN0IHQ9dGhpcy5lbGVtZW50cztsZXQgZTtyZXR1cm4gZT10WzFdLHRbMV09dFs0XSx0WzRdPWUsZT10WzJdLHRbMl09dFs4XSx0WzhdPWUsZT10WzZdLHRbNl09dFs5XSx0WzldPWUsZT10WzNdLHRbM109dFsxMl0sdFsxMl09ZSxlPXRbN10sdFs3XT10WzEzXSx0WzEzXT1lLGU9dFsxMV0sdFsxMV09dFsxNF0sdFsxNF09ZSx0aGlzfXNldFBvc2l0aW9uKHQsZSxzKXtjb25zdCBuPXRoaXMuZWxlbWVudHM7cmV0dXJuIHQuaXNWZWN0b3IzPyhuWzEyXT10LngsblsxM109dC55LG5bMTRdPXQueik6KG5bMTJdPXQsblsxM109ZSxuWzE0XT1zKSx0aGlzfWludmVydCgpe2NvbnN0IHQ9dGhpcy5lbGVtZW50cyxlPXRbMF0scz10WzFdLG49dFsyXSxpPXRbM10sbz10WzRdLGE9dFs1XSxjPXRbNl0sdT10WzddLGg9dFs4XSxsPXRbOV0sZD10WzEwXSxmPXRbMTFdLHA9dFsxMl0sbT10WzEzXSxnPXRbMTRdLHk9dFsxNV0sVD1sKmcqdS1tKmQqdSttKmMqZi1hKmcqZi1sKmMqeSthKmQqeSx3PXAqZCp1LWgqZyp1LXAqYypmK28qZypmK2gqYyp5LW8qZCp5LE09aCptKnUtcCpsKnUrcCphKmYtbyptKmYtaCphKnkrbypsKnksTj1wKmwqYy1oKm0qYy1wKmEqZCtvKm0qZCtoKmEqZy1vKmwqZyxfPWUqVCtzKncrbipNK2kqTjtpZihfPT09MClyZXR1cm4gdGhpcy5zZXQoMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCk7Y29uc3QgUz0xL187cmV0dXJuIHRbMF09VCpTLHRbMV09KG0qZCppLWwqZyppLW0qbipmK3MqZypmK2wqbip5LXMqZCp5KSpTLHRbMl09KGEqZyppLW0qYyppK20qbip1LXMqZyp1LWEqbip5K3MqYyp5KSpTLHRbM109KGwqYyppLWEqZCppLWwqbip1K3MqZCp1K2EqbipmLXMqYypmKSpTLHRbNF09dypTLHRbNV09KGgqZyppLXAqZCppK3AqbipmLWUqZypmLWgqbip5K2UqZCp5KSpTLHRbNl09KHAqYyppLW8qZyppLXAqbip1K2UqZyp1K28qbip5LWUqYyp5KSpTLHRbN109KG8qZCppLWgqYyppK2gqbip1LWUqZCp1LW8qbipmK2UqYypmKSpTLHRbOF09TSpTLHRbOV09KHAqbCppLWgqbSppLXAqcypmK2UqbSpmK2gqcyp5LWUqbCp5KSpTLHRbMTBdPShvKm0qaS1wKmEqaStwKnMqdS1lKm0qdS1vKnMqeStlKmEqeSkqUyx0WzExXT0oaCphKmktbypsKmktaCpzKnUrZSpsKnUrbypzKmYtZSphKmYpKlMsdFsxMl09TipTLHRbMTNdPShoKm0qbi1wKmwqbitwKnMqZC1lKm0qZC1oKnMqZytlKmwqZykqUyx0WzE0XT0ocCphKm4tbyptKm4tcCpzKmMrZSptKmMrbypzKmctZSphKmcpKlMsdFsxNV09KG8qbCpuLWgqYSpuK2gqcypjLWUqbCpjLW8qcypkK2UqYSpkKSpTLHRoaXN9c2NhbGUodCl7Y29uc3QgZT10aGlzLmVsZW1lbnRzLHM9dC54LG49dC55LGk9dC56O3JldHVybiBlWzBdKj1zLGVbNF0qPW4sZVs4XSo9aSxlWzFdKj1zLGVbNV0qPW4sZVs5XSo9aSxlWzJdKj1zLGVbNl0qPW4sZVsxMF0qPWksZVszXSo9cyxlWzddKj1uLGVbMTFdKj1pLHRoaXN9Z2V0TWF4U2NhbGVPbkF4aXMoKXtjb25zdCB0PXRoaXMuZWxlbWVudHMsZT10WzBdKnRbMF0rdFsxXSp0WzFdK3RbMl0qdFsyXSxzPXRbNF0qdFs0XSt0WzVdKnRbNV0rdFs2XSp0WzZdLG49dFs4XSp0WzhdK3RbOV0qdFs5XSt0WzEwXSp0WzEwXTtyZXR1cm4gTWF0aC5zcXJ0KE1hdGgubWF4KGUscyxuKSl9bWFrZVRyYW5zbGF0aW9uKHQsZSxzKXtyZXR1cm4gdC5pc1ZlY3RvcjM/dGhpcy5zZXQoMSwwLDAsdC54LDAsMSwwLHQueSwwLDAsMSx0LnosMCwwLDAsMSk6dGhpcy5zZXQoMSwwLDAsdCwwLDEsMCxlLDAsMCwxLHMsMCwwLDAsMSksdGhpc31tYWtlUm90YXRpb25YKHQpe2NvbnN0IGU9TWF0aC5jb3ModCkscz1NYXRoLnNpbih0KTtyZXR1cm4gdGhpcy5zZXQoMSwwLDAsMCwwLGUsLXMsMCwwLHMsZSwwLDAsMCwwLDEpLHRoaXN9bWFrZVJvdGF0aW9uWSh0KXtjb25zdCBlPU1hdGguY29zKHQpLHM9TWF0aC5zaW4odCk7cmV0dXJuIHRoaXMuc2V0KGUsMCxzLDAsMCwxLDAsMCwtcywwLGUsMCwwLDAsMCwxKSx0aGlzfW1ha2VSb3RhdGlvbloodCl7Y29uc3QgZT1NYXRoLmNvcyh0KSxzPU1hdGguc2luKHQpO3JldHVybiB0aGlzLnNldChlLC1zLDAsMCxzLGUsMCwwLDAsMCwxLDAsMCwwLDAsMSksdGhpc31tYWtlUm90YXRpb25BeGlzKHQsZSl7Y29uc3Qgcz1NYXRoLmNvcyhlKSxuPU1hdGguc2luKGUpLGk9MS1zLG89dC54LGE9dC55LGM9dC56LHU9aSpvLGg9aSphO3JldHVybiB0aGlzLnNldCh1Km8rcyx1KmEtbipjLHUqYytuKmEsMCx1KmErbipjLGgqYStzLGgqYy1uKm8sMCx1KmMtbiphLGgqYytuKm8saSpjKmMrcywwLDAsMCwwLDEpLHRoaXN9bWFrZVNjYWxlKHQsZSxzKXtyZXR1cm4gdGhpcy5zZXQodCwwLDAsMCwwLGUsMCwwLDAsMCxzLDAsMCwwLDAsMSksdGhpc31tYWtlU2hlYXIodCxlLHMsbixpLG8pe3JldHVybiB0aGlzLnNldCgxLHMsaSwwLHQsMSxvLDAsZSxuLDEsMCwwLDAsMCwxKSx0aGlzfWNvbXBvc2UodCxlLHMpe2NvbnN0IG49dGhpcy5lbGVtZW50cyxpPWUuX3gsbz1lLl95LGE9ZS5feixjPWUuX3csdT1pK2ksaD1vK28sbD1hK2EsZD1pKnUsZj1pKmgscD1pKmwsbT1vKmgsZz1vKmwseT1hKmwsVD1jKnUsdz1jKmgsTT1jKmwsTj1zLngsXz1zLnksUz1zLno7cmV0dXJuIG5bMF09KDEtKG0reSkpKk4sblsxXT0oZitNKSpOLG5bMl09KHAtdykqTixuWzNdPTAsbls0XT0oZi1NKSpfLG5bNV09KDEtKGQreSkpKl8sbls2XT0oZytUKSpfLG5bN109MCxuWzhdPShwK3cpKlMsbls5XT0oZy1UKSpTLG5bMTBdPSgxLShkK20pKSpTLG5bMTFdPTAsblsxMl09dC54LG5bMTNdPXQueSxuWzE0XT10LnosblsxNV09MSx0aGlzfWRlY29tcG9zZSh0LGUscyl7Y29uc3Qgbj10aGlzLmVsZW1lbnRzO2xldCBpPU1lLnNldChuWzBdLG5bMV0sblsyXSkubGVuZ3RoKCk7Y29uc3Qgbz1NZS5zZXQobls0XSxuWzVdLG5bNl0pLmxlbmd0aCgpLGE9TWUuc2V0KG5bOF0sbls5XSxuWzEwXSkubGVuZ3RoKCk7dGhpcy5kZXRlcm1pbmFudCgpPDAmJihpPS1pKSx0Lng9blsxMl0sdC55PW5bMTNdLHQuej1uWzE0XSxCdC5jb3B5KHRoaXMpO2NvbnN0IHU9MS9pLGg9MS9vLGw9MS9hO3JldHVybiBCdC5lbGVtZW50c1swXSo9dSxCdC5lbGVtZW50c1sxXSo9dSxCdC5lbGVtZW50c1syXSo9dSxCdC5lbGVtZW50c1s0XSo9aCxCdC5lbGVtZW50c1s1XSo9aCxCdC5lbGVtZW50c1s2XSo9aCxCdC5lbGVtZW50c1s4XSo9bCxCdC5lbGVtZW50c1s5XSo9bCxCdC5lbGVtZW50c1sxMF0qPWwsZS5zZXRGcm9tUm90YXRpb25NYXRyaXgoQnQpLHMueD1pLHMueT1vLHMuej1hLHRoaXN9bWFrZVBlcnNwZWN0aXZlKHQsZSxzLG4saSxvLGE9WWUpe2NvbnN0IGM9dGhpcy5lbGVtZW50cyx1PTIqaS8oZS10KSxoPTIqaS8ocy1uKSxsPShlK3QpLyhlLXQpLGQ9KHMrbikvKHMtbik7bGV0IGYscDtpZihhPT09WWUpZj0tKG8raSkvKG8taSkscD0tMipvKmkvKG8taSk7ZWxzZSBpZihhPT09em4pZj0tby8oby1pKSxwPS1vKmkvKG8taSk7ZWxzZSB0aHJvdyBuZXcgRXJyb3IoIlRIUkVFLk1hdHJpeDQubWFrZVBlcnNwZWN0aXZlKCk6IEludmFsaWQgY29vcmRpbmF0ZSBzeXN0ZW06ICIrYSk7cmV0dXJuIGNbMF09dSxjWzRdPTAsY1s4XT1sLGNbMTJdPTAsY1sxXT0wLGNbNV09aCxjWzldPWQsY1sxM109MCxjWzJdPTAsY1s2XT0wLGNbMTBdPWYsY1sxNF09cCxjWzNdPTAsY1s3XT0wLGNbMTFdPS0xLGNbMTVdPTAsdGhpc31tYWtlT3J0aG9ncmFwaGljKHQsZSxzLG4saSxvLGE9WWUpe2NvbnN0IGM9dGhpcy5lbGVtZW50cyx1PTEvKGUtdCksaD0xLyhzLW4pLGw9MS8oby1pKSxkPShlK3QpKnUsZj0ocytuKSpoO2xldCBwLG07aWYoYT09PVllKXA9KG8raSkqbCxtPS0yKmw7ZWxzZSBpZihhPT09em4pcD1pKmwsbT0tMSpsO2Vsc2UgdGhyb3cgbmV3IEVycm9yKCJUSFJFRS5NYXRyaXg0Lm1ha2VPcnRob2dyYXBoaWMoKTogSW52YWxpZCBjb29yZGluYXRlIHN5c3RlbTogIithKTtyZXR1cm4gY1swXT0yKnUsY1s0XT0wLGNbOF09MCxjWzEyXT0tZCxjWzFdPTAsY1s1XT0yKmgsY1s5XT0wLGNbMTNdPS1mLGNbMl09MCxjWzZdPTAsY1sxMF09bSxjWzE0XT0tcCxjWzNdPTAsY1s3XT0wLGNbMTFdPTAsY1sxNV09MSx0aGlzfWVxdWFscyh0KXtjb25zdCBlPXRoaXMuZWxlbWVudHMscz10LmVsZW1lbnRzO2ZvcihsZXQgbj0wO248MTY7bisrKWlmKGVbbl0hPT1zW25dKXJldHVybiExO3JldHVybiEwfWZyb21BcnJheSh0LGU9MCl7Zm9yKGxldCBzPTA7czwxNjtzKyspdGhpcy5lbGVtZW50c1tzXT10W3MrZV07cmV0dXJuIHRoaXN9dG9BcnJheSh0PVtdLGU9MCl7Y29uc3Qgcz10aGlzLmVsZW1lbnRzO3JldHVybiB0W2VdPXNbMF0sdFtlKzFdPXNbMV0sdFtlKzJdPXNbMl0sdFtlKzNdPXNbM10sdFtlKzRdPXNbNF0sdFtlKzVdPXNbNV0sdFtlKzZdPXNbNl0sdFtlKzddPXNbN10sdFtlKzhdPXNbOF0sdFtlKzldPXNbOV0sdFtlKzEwXT1zWzEwXSx0W2UrMTFdPXNbMTFdLHRbZSsxMl09c1sxMl0sdFtlKzEzXT1zWzEzXSx0W2UrMTRdPXNbMTRdLHRbZSsxNV09c1sxNV0sdH19Y29uc3QgTWU9bmV3IEEsQnQ9bmV3IG50LGNhPW5ldyBBKDAsMCwwKSxoYT1uZXcgQSgxLDEsMSksc2U9bmV3IEEsSXM9bmV3IEEseXQ9bmV3IEEsaHI9bmV3IG50LHVyPW5ldyBRZTtjbGFzcyB2c3tjb25zdHJ1Y3Rvcih0PTAsZT0wLHM9MCxuPXZzLkRFRkFVTFRfT1JERVIpe3RoaXMuaXNFdWxlcj0hMCx0aGlzLl94PXQsdGhpcy5feT1lLHRoaXMuX3o9cyx0aGlzLl9vcmRlcj1ufWdldCB4KCl7cmV0dXJuIHRoaXMuX3h9c2V0IHgodCl7dGhpcy5feD10LHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKX1nZXQgeSgpe3JldHVybiB0aGlzLl95fXNldCB5KHQpe3RoaXMuX3k9dCx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCl9Z2V0IHooKXtyZXR1cm4gdGhpcy5fen1zZXQgeih0KXt0aGlzLl96PXQsdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpfWdldCBvcmRlcigpe3JldHVybiB0aGlzLl9vcmRlcn1zZXQgb3JkZXIodCl7dGhpcy5fb3JkZXI9dCx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCl9c2V0KHQsZSxzLG49dGhpcy5fb3JkZXIpe3JldHVybiB0aGlzLl94PXQsdGhpcy5feT1lLHRoaXMuX3o9cyx0aGlzLl9vcmRlcj1uLHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMuX3gsdGhpcy5feSx0aGlzLl96LHRoaXMuX29yZGVyKX1jb3B5KHQpe3JldHVybiB0aGlzLl94PXQuX3gsdGhpcy5feT10Ll95LHRoaXMuX3o9dC5feix0aGlzLl9vcmRlcj10Ll9vcmRlcix0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksdGhpc31zZXRGcm9tUm90YXRpb25NYXRyaXgodCxlPXRoaXMuX29yZGVyLHM9ITApe2NvbnN0IG49dC5lbGVtZW50cyxpPW5bMF0sbz1uWzRdLGE9bls4XSxjPW5bMV0sdT1uWzVdLGg9bls5XSxsPW5bMl0sZD1uWzZdLGY9blsxMF07c3dpdGNoKGUpe2Nhc2UiWFlaIjp0aGlzLl95PU1hdGguYXNpbihhdChhLC0xLDEpKSxNYXRoLmFicyhhKTwuOTk5OTk5OT8odGhpcy5feD1NYXRoLmF0YW4yKC1oLGYpLHRoaXMuX3o9TWF0aC5hdGFuMigtbyxpKSk6KHRoaXMuX3g9TWF0aC5hdGFuMihkLHUpLHRoaXMuX3o9MCk7YnJlYWs7Y2FzZSJZWFoiOnRoaXMuX3g9TWF0aC5hc2luKC1hdChoLC0xLDEpKSxNYXRoLmFicyhoKTwuOTk5OTk5OT8odGhpcy5feT1NYXRoLmF0YW4yKGEsZiksdGhpcy5fej1NYXRoLmF0YW4yKGMsdSkpOih0aGlzLl95PU1hdGguYXRhbjIoLWwsaSksdGhpcy5fej0wKTticmVhaztjYXNlIlpYWSI6dGhpcy5feD1NYXRoLmFzaW4oYXQoZCwtMSwxKSksTWF0aC5hYnMoZCk8Ljk5OTk5OTk/KHRoaXMuX3k9TWF0aC5hdGFuMigtbCxmKSx0aGlzLl96PU1hdGguYXRhbjIoLW8sdSkpOih0aGlzLl95PTAsdGhpcy5fej1NYXRoLmF0YW4yKGMsaSkpO2JyZWFrO2Nhc2UiWllYIjp0aGlzLl95PU1hdGguYXNpbigtYXQobCwtMSwxKSksTWF0aC5hYnMobCk8Ljk5OTk5OTk/KHRoaXMuX3g9TWF0aC5hdGFuMihkLGYpLHRoaXMuX3o9TWF0aC5hdGFuMihjLGkpKToodGhpcy5feD0wLHRoaXMuX3o9TWF0aC5hdGFuMigtbyx1KSk7YnJlYWs7Y2FzZSJZWlgiOnRoaXMuX3o9TWF0aC5hc2luKGF0KGMsLTEsMSkpLE1hdGguYWJzKGMpPC45OTk5OTk5Pyh0aGlzLl94PU1hdGguYXRhbjIoLWgsdSksdGhpcy5feT1NYXRoLmF0YW4yKC1sLGkpKToodGhpcy5feD0wLHRoaXMuX3k9TWF0aC5hdGFuMihhLGYpKTticmVhaztjYXNlIlhaWSI6dGhpcy5fej1NYXRoLmFzaW4oLWF0KG8sLTEsMSkpLE1hdGguYWJzKG8pPC45OTk5OTk5Pyh0aGlzLl94PU1hdGguYXRhbjIoZCx1KSx0aGlzLl95PU1hdGguYXRhbjIoYSxpKSk6KHRoaXMuX3g9TWF0aC5hdGFuMigtaCxmKSx0aGlzLl95PTApO2JyZWFrO2RlZmF1bHQ6Y29uc29sZS53YXJuKCJUSFJFRS5FdWxlcjogLnNldEZyb21Sb3RhdGlvbk1hdHJpeCgpIGVuY291bnRlcmVkIGFuIHVua25vd24gb3JkZXI6ICIrZSl9cmV0dXJuIHRoaXMuX29yZGVyPWUscz09PSEwJiZ0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksdGhpc31zZXRGcm9tUXVhdGVybmlvbih0LGUscyl7cmV0dXJuIGhyLm1ha2VSb3RhdGlvbkZyb21RdWF0ZXJuaW9uKHQpLHRoaXMuc2V0RnJvbVJvdGF0aW9uTWF0cml4KGhyLGUscyl9c2V0RnJvbVZlY3RvcjModCxlPXRoaXMuX29yZGVyKXtyZXR1cm4gdGhpcy5zZXQodC54LHQueSx0LnosZSl9cmVvcmRlcih0KXtyZXR1cm4gdXIuc2V0RnJvbUV1bGVyKHRoaXMpLHRoaXMuc2V0RnJvbVF1YXRlcm5pb24odXIsdCl9ZXF1YWxzKHQpe3JldHVybiB0Ll94PT09dGhpcy5feCYmdC5feT09PXRoaXMuX3kmJnQuX3o9PT10aGlzLl96JiZ0Ll9vcmRlcj09PXRoaXMuX29yZGVyfWZyb21BcnJheSh0KXtyZXR1cm4gdGhpcy5feD10WzBdLHRoaXMuX3k9dFsxXSx0aGlzLl96PXRbMl0sdFszXSE9PXZvaWQgMCYmKHRoaXMuX29yZGVyPXRbM10pLHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfXRvQXJyYXkodD1bXSxlPTApe3JldHVybiB0W2VdPXRoaXMuX3gsdFtlKzFdPXRoaXMuX3ksdFtlKzJdPXRoaXMuX3osdFtlKzNdPXRoaXMuX29yZGVyLHR9X29uQ2hhbmdlKHQpe3JldHVybiB0aGlzLl9vbkNoYW5nZUNhbGxiYWNrPXQsdGhpc31fb25DaGFuZ2VDYWxsYmFjaygpe30qW1N5bWJvbC5pdGVyYXRvcl0oKXt5aWVsZCB0aGlzLl94LHlpZWxkIHRoaXMuX3kseWllbGQgdGhpcy5feix5aWVsZCB0aGlzLl9vcmRlcn19dnMuREVGQVVMVF9PUkRFUj0iWFlaIjtjbGFzcyB1YXtjb25zdHJ1Y3Rvcigpe3RoaXMubWFzaz0xfXNldCh0KXt0aGlzLm1hc2s9KDE8PHR8MCk+Pj4wfWVuYWJsZSh0KXt0aGlzLm1hc2t8PTE8PHR8MH1lbmFibGVBbGwoKXt0aGlzLm1hc2s9LTF9dG9nZ2xlKHQpe3RoaXMubWFza149MTw8dHwwfWRpc2FibGUodCl7dGhpcy5tYXNrJj1+KDE8PHR8MCl9ZGlzYWJsZUFsbCgpe3RoaXMubWFzaz0wfXRlc3QodCl7cmV0dXJuKHRoaXMubWFzayZ0Lm1hc2spIT09MH1pc0VuYWJsZWQodCl7cmV0dXJuKHRoaXMubWFzayYoMTw8dHwwKSkhPT0wfX1sZXQgbGE9MDtjb25zdCBscj1uZXcgQSxTZT1uZXcgUWUsV3Q9bmV3IG50LFBzPW5ldyBBLGVzPW5ldyBBLGRhPW5ldyBBLGZhPW5ldyBRZSxkcj1uZXcgQSgxLDAsMCksZnI9bmV3IEEoMCwxLDApLHByPW5ldyBBKDAsMCwxKSxtcj17dHlwZToiYWRkZWQifSxwYT17dHlwZToicmVtb3ZlZCJ9LF9lPXt0eXBlOiJjaGlsZGFkZGVkIixjaGlsZDpudWxsfSx2bj17dHlwZToiY2hpbGRyZW1vdmVkIixjaGlsZDpudWxsfTtjbGFzcyBuZSBleHRlbmRzIFple2NvbnN0cnVjdG9yKCl7c3VwZXIoKSx0aGlzLmlzT2JqZWN0M0Q9ITAsT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImlkIix7dmFsdWU6bGErK30pLHRoaXMudXVpZD1LdCgpLHRoaXMubmFtZT0iIix0aGlzLnR5cGU9Ik9iamVjdDNEIix0aGlzLnBhcmVudD1udWxsLHRoaXMuY2hpbGRyZW49W10sdGhpcy51cD1uZS5ERUZBVUxUX1VQLmNsb25lKCk7Y29uc3QgdD1uZXcgQSxlPW5ldyB2cyxzPW5ldyBRZSxuPW5ldyBBKDEsMSwxKTtmdW5jdGlvbiBpKCl7cy5zZXRGcm9tRXVsZXIoZSwhMSl9ZnVuY3Rpb24gbygpe2Uuc2V0RnJvbVF1YXRlcm5pb24ocyx2b2lkIDAsITEpfWUuX29uQ2hhbmdlKGkpLHMuX29uQ2hhbmdlKG8pLE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRoaXMse3Bvc2l0aW9uOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCx2YWx1ZTp0fSxyb3RhdGlvbjp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsdmFsdWU6ZX0scXVhdGVybmlvbjp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsdmFsdWU6c30sc2NhbGU6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLHZhbHVlOm59LG1vZGVsVmlld01hdHJpeDp7dmFsdWU6bmV3IG50fSxub3JtYWxNYXRyaXg6e3ZhbHVlOm5ldyBDdH19KSx0aGlzLm1hdHJpeD1uZXcgbnQsdGhpcy5tYXRyaXhXb3JsZD1uZXcgbnQsdGhpcy5tYXRyaXhBdXRvVXBkYXRlPW5lLkRFRkFVTFRfTUFUUklYX0FVVE9fVVBEQVRFLHRoaXMubWF0cml4V29ybGRBdXRvVXBkYXRlPW5lLkRFRkFVTFRfTUFUUklYX1dPUkxEX0FVVE9fVVBEQVRFLHRoaXMubWF0cml4V29ybGROZWVkc1VwZGF0ZT0hMSx0aGlzLmxheWVycz1uZXcgdWEsdGhpcy52aXNpYmxlPSEwLHRoaXMuY2FzdFNoYWRvdz0hMSx0aGlzLnJlY2VpdmVTaGFkb3c9ITEsdGhpcy5mcnVzdHVtQ3VsbGVkPSEwLHRoaXMucmVuZGVyT3JkZXI9MCx0aGlzLmFuaW1hdGlvbnM9W10sdGhpcy51c2VyRGF0YT17fX1vbkJlZm9yZVNoYWRvdygpe31vbkFmdGVyU2hhZG93KCl7fW9uQmVmb3JlUmVuZGVyKCl7fW9uQWZ0ZXJSZW5kZXIoKXt9YXBwbHlNYXRyaXg0KHQpe3RoaXMubWF0cml4QXV0b1VwZGF0ZSYmdGhpcy51cGRhdGVNYXRyaXgoKSx0aGlzLm1hdHJpeC5wcmVtdWx0aXBseSh0KSx0aGlzLm1hdHJpeC5kZWNvbXBvc2UodGhpcy5wb3NpdGlvbix0aGlzLnF1YXRlcm5pb24sdGhpcy5zY2FsZSl9YXBwbHlRdWF0ZXJuaW9uKHQpe3JldHVybiB0aGlzLnF1YXRlcm5pb24ucHJlbXVsdGlwbHkodCksdGhpc31zZXRSb3RhdGlvbkZyb21BeGlzQW5nbGUodCxlKXt0aGlzLnF1YXRlcm5pb24uc2V0RnJvbUF4aXNBbmdsZSh0LGUpfXNldFJvdGF0aW9uRnJvbUV1bGVyKHQpe3RoaXMucXVhdGVybmlvbi5zZXRGcm9tRXVsZXIodCwhMCl9c2V0Um90YXRpb25Gcm9tTWF0cml4KHQpe3RoaXMucXVhdGVybmlvbi5zZXRGcm9tUm90YXRpb25NYXRyaXgodCl9c2V0Um90YXRpb25Gcm9tUXVhdGVybmlvbih0KXt0aGlzLnF1YXRlcm5pb24uY29weSh0KX1yb3RhdGVPbkF4aXModCxlKXtyZXR1cm4gU2Uuc2V0RnJvbUF4aXNBbmdsZSh0LGUpLHRoaXMucXVhdGVybmlvbi5tdWx0aXBseShTZSksdGhpc31yb3RhdGVPbldvcmxkQXhpcyh0LGUpe3JldHVybiBTZS5zZXRGcm9tQXhpc0FuZ2xlKHQsZSksdGhpcy5xdWF0ZXJuaW9uLnByZW11bHRpcGx5KFNlKSx0aGlzfXJvdGF0ZVgodCl7cmV0dXJuIHRoaXMucm90YXRlT25BeGlzKGRyLHQpfXJvdGF0ZVkodCl7cmV0dXJuIHRoaXMucm90YXRlT25BeGlzKGZyLHQpfXJvdGF0ZVoodCl7cmV0dXJuIHRoaXMucm90YXRlT25BeGlzKHByLHQpfXRyYW5zbGF0ZU9uQXhpcyh0LGUpe3JldHVybiBsci5jb3B5KHQpLmFwcGx5UXVhdGVybmlvbih0aGlzLnF1YXRlcm5pb24pLHRoaXMucG9zaXRpb24uYWRkKGxyLm11bHRpcGx5U2NhbGFyKGUpKSx0aGlzfXRyYW5zbGF0ZVgodCl7cmV0dXJuIHRoaXMudHJhbnNsYXRlT25BeGlzKGRyLHQpfXRyYW5zbGF0ZVkodCl7cmV0dXJuIHRoaXMudHJhbnNsYXRlT25BeGlzKGZyLHQpfXRyYW5zbGF0ZVoodCl7cmV0dXJuIHRoaXMudHJhbnNsYXRlT25BeGlzKHByLHQpfWxvY2FsVG9Xb3JsZCh0KXtyZXR1cm4gdGhpcy51cGRhdGVXb3JsZE1hdHJpeCghMCwhMSksdC5hcHBseU1hdHJpeDQodGhpcy5tYXRyaXhXb3JsZCl9d29ybGRUb0xvY2FsKHQpe3JldHVybiB0aGlzLnVwZGF0ZVdvcmxkTWF0cml4KCEwLCExKSx0LmFwcGx5TWF0cml4NChXdC5jb3B5KHRoaXMubWF0cml4V29ybGQpLmludmVydCgpKX1sb29rQXQodCxlLHMpe3QuaXNWZWN0b3IzP1BzLmNvcHkodCk6UHMuc2V0KHQsZSxzKTtjb25zdCBuPXRoaXMucGFyZW50O3RoaXMudXBkYXRlV29ybGRNYXRyaXgoITAsITEpLGVzLnNldEZyb21NYXRyaXhQb3NpdGlvbih0aGlzLm1hdHJpeFdvcmxkKSx0aGlzLmlzQ2FtZXJhfHx0aGlzLmlzTGlnaHQ/V3QubG9va0F0KGVzLFBzLHRoaXMudXApOld0Lmxvb2tBdChQcyxlcyx0aGlzLnVwKSx0aGlzLnF1YXRlcm5pb24uc2V0RnJvbVJvdGF0aW9uTWF0cml4KFd0KSxuJiYoV3QuZXh0cmFjdFJvdGF0aW9uKG4ubWF0cml4V29ybGQpLFNlLnNldEZyb21Sb3RhdGlvbk1hdHJpeChXdCksdGhpcy5xdWF0ZXJuaW9uLnByZW11bHRpcGx5KFNlLmludmVydCgpKSl9YWRkKHQpe2lmKGFyZ3VtZW50cy5sZW5ndGg+MSl7Zm9yKGxldCBlPTA7ZTxhcmd1bWVudHMubGVuZ3RoO2UrKyl0aGlzLmFkZChhcmd1bWVudHNbZV0pO3JldHVybiB0aGlzfXJldHVybiB0PT09dGhpcz8oY29uc29sZS5lcnJvcigiVEhSRUUuT2JqZWN0M0QuYWRkOiBvYmplY3QgY2FuJ3QgYmUgYWRkZWQgYXMgYSBjaGlsZCBvZiBpdHNlbGYuIix0KSx0aGlzKToodCYmdC5pc09iamVjdDNEPyh0LnJlbW92ZUZyb21QYXJlbnQoKSx0LnBhcmVudD10aGlzLHRoaXMuY2hpbGRyZW4ucHVzaCh0KSx0LmRpc3BhdGNoRXZlbnQobXIpLF9lLmNoaWxkPXQsdGhpcy5kaXNwYXRjaEV2ZW50KF9lKSxfZS5jaGlsZD1udWxsKTpjb25zb2xlLmVycm9yKCJUSFJFRS5PYmplY3QzRC5hZGQ6IG9iamVjdCBub3QgYW4gaW5zdGFuY2Ugb2YgVEhSRUUuT2JqZWN0M0QuIix0KSx0aGlzKX1yZW1vdmUodCl7aWYoYXJndW1lbnRzLmxlbmd0aD4xKXtmb3IobGV0IHM9MDtzPGFyZ3VtZW50cy5sZW5ndGg7cysrKXRoaXMucmVtb3ZlKGFyZ3VtZW50c1tzXSk7cmV0dXJuIHRoaXN9Y29uc3QgZT10aGlzLmNoaWxkcmVuLmluZGV4T2YodCk7cmV0dXJuIGUhPT0tMSYmKHQucGFyZW50PW51bGwsdGhpcy5jaGlsZHJlbi5zcGxpY2UoZSwxKSx0LmRpc3BhdGNoRXZlbnQocGEpLHZuLmNoaWxkPXQsdGhpcy5kaXNwYXRjaEV2ZW50KHZuKSx2bi5jaGlsZD1udWxsKSx0aGlzfXJlbW92ZUZyb21QYXJlbnQoKXtjb25zdCB0PXRoaXMucGFyZW50O3JldHVybiB0IT09bnVsbCYmdC5yZW1vdmUodGhpcyksdGhpc31jbGVhcigpe3JldHVybiB0aGlzLnJlbW92ZSguLi50aGlzLmNoaWxkcmVuKX1hdHRhY2godCl7cmV0dXJuIHRoaXMudXBkYXRlV29ybGRNYXRyaXgoITAsITEpLFd0LmNvcHkodGhpcy5tYXRyaXhXb3JsZCkuaW52ZXJ0KCksdC5wYXJlbnQhPT1udWxsJiYodC5wYXJlbnQudXBkYXRlV29ybGRNYXRyaXgoITAsITEpLFd0Lm11bHRpcGx5KHQucGFyZW50Lm1hdHJpeFdvcmxkKSksdC5hcHBseU1hdHJpeDQoV3QpLHQucmVtb3ZlRnJvbVBhcmVudCgpLHQucGFyZW50PXRoaXMsdGhpcy5jaGlsZHJlbi5wdXNoKHQpLHQudXBkYXRlV29ybGRNYXRyaXgoITEsITApLHQuZGlzcGF0Y2hFdmVudChtciksX2UuY2hpbGQ9dCx0aGlzLmRpc3BhdGNoRXZlbnQoX2UpLF9lLmNoaWxkPW51bGwsdGhpc31nZXRPYmplY3RCeUlkKHQpe3JldHVybiB0aGlzLmdldE9iamVjdEJ5UHJvcGVydHkoImlkIix0KX1nZXRPYmplY3RCeU5hbWUodCl7cmV0dXJuIHRoaXMuZ2V0T2JqZWN0QnlQcm9wZXJ0eSgibmFtZSIsdCl9Z2V0T2JqZWN0QnlQcm9wZXJ0eSh0LGUpe2lmKHRoaXNbdF09PT1lKXJldHVybiB0aGlzO2ZvcihsZXQgcz0wLG49dGhpcy5jaGlsZHJlbi5sZW5ndGg7czxuO3MrKyl7Y29uc3Qgbz10aGlzLmNoaWxkcmVuW3NdLmdldE9iamVjdEJ5UHJvcGVydHkodCxlKTtpZihvIT09dm9pZCAwKXJldHVybiBvfX1nZXRPYmplY3RzQnlQcm9wZXJ0eSh0LGUscz1bXSl7dGhpc1t0XT09PWUmJnMucHVzaCh0aGlzKTtjb25zdCBuPXRoaXMuY2hpbGRyZW47Zm9yKGxldCBpPTAsbz1uLmxlbmd0aDtpPG87aSsrKW5baV0uZ2V0T2JqZWN0c0J5UHJvcGVydHkodCxlLHMpO3JldHVybiBzfWdldFdvcmxkUG9zaXRpb24odCl7cmV0dXJuIHRoaXMudXBkYXRlV29ybGRNYXRyaXgoITAsITEpLHQuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKHRoaXMubWF0cml4V29ybGQpfWdldFdvcmxkUXVhdGVybmlvbih0KXtyZXR1cm4gdGhpcy51cGRhdGVXb3JsZE1hdHJpeCghMCwhMSksdGhpcy5tYXRyaXhXb3JsZC5kZWNvbXBvc2UoZXMsdCxkYSksdH1nZXRXb3JsZFNjYWxlKHQpe3JldHVybiB0aGlzLnVwZGF0ZVdvcmxkTWF0cml4KCEwLCExKSx0aGlzLm1hdHJpeFdvcmxkLmRlY29tcG9zZShlcyxmYSx0KSx0fWdldFdvcmxkRGlyZWN0aW9uKHQpe3RoaXMudXBkYXRlV29ybGRNYXRyaXgoITAsITEpO2NvbnN0IGU9dGhpcy5tYXRyaXhXb3JsZC5lbGVtZW50cztyZXR1cm4gdC5zZXQoZVs4XSxlWzldLGVbMTBdKS5ub3JtYWxpemUoKX1yYXljYXN0KCl7fXRyYXZlcnNlKHQpe3QodGhpcyk7Y29uc3QgZT10aGlzLmNoaWxkcmVuO2ZvcihsZXQgcz0wLG49ZS5sZW5ndGg7czxuO3MrKyllW3NdLnRyYXZlcnNlKHQpfXRyYXZlcnNlVmlzaWJsZSh0KXtpZih0aGlzLnZpc2libGU9PT0hMSlyZXR1cm47dCh0aGlzKTtjb25zdCBlPXRoaXMuY2hpbGRyZW47Zm9yKGxldCBzPTAsbj1lLmxlbmd0aDtzPG47cysrKWVbc10udHJhdmVyc2VWaXNpYmxlKHQpfXRyYXZlcnNlQW5jZXN0b3JzKHQpe2NvbnN0IGU9dGhpcy5wYXJlbnQ7ZSE9PW51bGwmJih0KGUpLGUudHJhdmVyc2VBbmNlc3RvcnModCkpfXVwZGF0ZU1hdHJpeCgpe3RoaXMubWF0cml4LmNvbXBvc2UodGhpcy5wb3NpdGlvbix0aGlzLnF1YXRlcm5pb24sdGhpcy5zY2FsZSksdGhpcy5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlPSEwfXVwZGF0ZU1hdHJpeFdvcmxkKHQpe3RoaXMubWF0cml4QXV0b1VwZGF0ZSYmdGhpcy51cGRhdGVNYXRyaXgoKSwodGhpcy5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlfHx0KSYmKHRoaXMubWF0cml4V29ybGRBdXRvVXBkYXRlPT09ITAmJih0aGlzLnBhcmVudD09PW51bGw/dGhpcy5tYXRyaXhXb3JsZC5jb3B5KHRoaXMubWF0cml4KTp0aGlzLm1hdHJpeFdvcmxkLm11bHRpcGx5TWF0cmljZXModGhpcy5wYXJlbnQubWF0cml4V29ybGQsdGhpcy5tYXRyaXgpKSx0aGlzLm1hdHJpeFdvcmxkTmVlZHNVcGRhdGU9ITEsdD0hMCk7Y29uc3QgZT10aGlzLmNoaWxkcmVuO2ZvcihsZXQgcz0wLG49ZS5sZW5ndGg7czxuO3MrKyllW3NdLnVwZGF0ZU1hdHJpeFdvcmxkKHQpfXVwZGF0ZVdvcmxkTWF0cml4KHQsZSl7Y29uc3Qgcz10aGlzLnBhcmVudDtpZih0PT09ITAmJnMhPT1udWxsJiZzLnVwZGF0ZVdvcmxkTWF0cml4KCEwLCExKSx0aGlzLm1hdHJpeEF1dG9VcGRhdGUmJnRoaXMudXBkYXRlTWF0cml4KCksdGhpcy5tYXRyaXhXb3JsZEF1dG9VcGRhdGU9PT0hMCYmKHRoaXMucGFyZW50PT09bnVsbD90aGlzLm1hdHJpeFdvcmxkLmNvcHkodGhpcy5tYXRyaXgpOnRoaXMubWF0cml4V29ybGQubXVsdGlwbHlNYXRyaWNlcyh0aGlzLnBhcmVudC5tYXRyaXhXb3JsZCx0aGlzLm1hdHJpeCkpLGU9PT0hMCl7Y29uc3Qgbj10aGlzLmNoaWxkcmVuO2ZvcihsZXQgaT0wLG89bi5sZW5ndGg7aTxvO2krKyluW2ldLnVwZGF0ZVdvcmxkTWF0cml4KCExLCEwKX19dG9KU09OKHQpe2NvbnN0IGU9dD09PXZvaWQgMHx8dHlwZW9mIHQ9PSJzdHJpbmciLHM9e307ZSYmKHQ9e2dlb21ldHJpZXM6e30sbWF0ZXJpYWxzOnt9LHRleHR1cmVzOnt9LGltYWdlczp7fSxzaGFwZXM6e30sc2tlbGV0b25zOnt9LGFuaW1hdGlvbnM6e30sbm9kZXM6e319LHMubWV0YWRhdGE9e3ZlcnNpb246NC42LHR5cGU6Ik9iamVjdCIsZ2VuZXJhdG9yOiJPYmplY3QzRC50b0pTT04ifSk7Y29uc3Qgbj17fTtuLnV1aWQ9dGhpcy51dWlkLG4udHlwZT10aGlzLnR5cGUsdGhpcy5uYW1lIT09IiImJihuLm5hbWU9dGhpcy5uYW1lKSx0aGlzLmNhc3RTaGFkb3c9PT0hMCYmKG4uY2FzdFNoYWRvdz0hMCksdGhpcy5yZWNlaXZlU2hhZG93PT09ITAmJihuLnJlY2VpdmVTaGFkb3c9ITApLHRoaXMudmlzaWJsZT09PSExJiYobi52aXNpYmxlPSExKSx0aGlzLmZydXN0dW1DdWxsZWQ9PT0hMSYmKG4uZnJ1c3R1bUN1bGxlZD0hMSksdGhpcy5yZW5kZXJPcmRlciE9PTAmJihuLnJlbmRlck9yZGVyPXRoaXMucmVuZGVyT3JkZXIpLE9iamVjdC5rZXlzKHRoaXMudXNlckRhdGEpLmxlbmd0aD4wJiYobi51c2VyRGF0YT10aGlzLnVzZXJEYXRhKSxuLmxheWVycz10aGlzLmxheWVycy5tYXNrLG4ubWF0cml4PXRoaXMubWF0cml4LnRvQXJyYXkoKSxuLnVwPXRoaXMudXAudG9BcnJheSgpLHRoaXMubWF0cml4QXV0b1VwZGF0ZT09PSExJiYobi5tYXRyaXhBdXRvVXBkYXRlPSExKSx0aGlzLmlzSW5zdGFuY2VkTWVzaCYmKG4udHlwZT0iSW5zdGFuY2VkTWVzaCIsbi5jb3VudD10aGlzLmNvdW50LG4uaW5zdGFuY2VNYXRyaXg9dGhpcy5pbnN0YW5jZU1hdHJpeC50b0pTT04oKSx0aGlzLmluc3RhbmNlQ29sb3IhPT1udWxsJiYobi5pbnN0YW5jZUNvbG9yPXRoaXMuaW5zdGFuY2VDb2xvci50b0pTT04oKSkpLHRoaXMuaXNCYXRjaGVkTWVzaCYmKG4udHlwZT0iQmF0Y2hlZE1lc2giLG4ucGVyT2JqZWN0RnJ1c3R1bUN1bGxlZD10aGlzLnBlck9iamVjdEZydXN0dW1DdWxsZWQsbi5zb3J0T2JqZWN0cz10aGlzLnNvcnRPYmplY3RzLG4uZHJhd1Jhbmdlcz10aGlzLl9kcmF3UmFuZ2VzLG4ucmVzZXJ2ZWRSYW5nZXM9dGhpcy5fcmVzZXJ2ZWRSYW5nZXMsbi52aXNpYmlsaXR5PXRoaXMuX3Zpc2liaWxpdHksbi5hY3RpdmU9dGhpcy5fYWN0aXZlLG4uYm91bmRzPXRoaXMuX2JvdW5kcy5tYXAoYT0+KHtib3hJbml0aWFsaXplZDphLmJveEluaXRpYWxpemVkLGJveE1pbjphLmJveC5taW4udG9BcnJheSgpLGJveE1heDphLmJveC5tYXgudG9BcnJheSgpLHNwaGVyZUluaXRpYWxpemVkOmEuc3BoZXJlSW5pdGlhbGl6ZWQsc3BoZXJlUmFkaXVzOmEuc3BoZXJlLnJhZGl1cyxzcGhlcmVDZW50ZXI6YS5zcGhlcmUuY2VudGVyLnRvQXJyYXkoKX0pKSxuLm1heEluc3RhbmNlQ291bnQ9dGhpcy5fbWF4SW5zdGFuY2VDb3VudCxuLm1heFZlcnRleENvdW50PXRoaXMuX21heFZlcnRleENvdW50LG4ubWF4SW5kZXhDb3VudD10aGlzLl9tYXhJbmRleENvdW50LG4uZ2VvbWV0cnlJbml0aWFsaXplZD10aGlzLl9nZW9tZXRyeUluaXRpYWxpemVkLG4uZ2VvbWV0cnlDb3VudD10aGlzLl9nZW9tZXRyeUNvdW50LG4ubWF0cmljZXNUZXh0dXJlPXRoaXMuX21hdHJpY2VzVGV4dHVyZS50b0pTT04odCksdGhpcy5fY29sb3JzVGV4dHVyZSE9PW51bGwmJihuLmNvbG9yc1RleHR1cmU9dGhpcy5fY29sb3JzVGV4dHVyZS50b0pTT04odCkpLHRoaXMuYm91bmRpbmdTcGhlcmUhPT1udWxsJiYobi5ib3VuZGluZ1NwaGVyZT17Y2VudGVyOm4uYm91bmRpbmdTcGhlcmUuY2VudGVyLnRvQXJyYXkoKSxyYWRpdXM6bi5ib3VuZGluZ1NwaGVyZS5yYWRpdXN9KSx0aGlzLmJvdW5kaW5nQm94IT09bnVsbCYmKG4uYm91bmRpbmdCb3g9e21pbjpuLmJvdW5kaW5nQm94Lm1pbi50b0FycmF5KCksbWF4Om4uYm91bmRpbmdCb3gubWF4LnRvQXJyYXkoKX0pKTtmdW5jdGlvbiBpKGEsYyl7cmV0dXJuIGFbYy51dWlkXT09PXZvaWQgMCYmKGFbYy51dWlkXT1jLnRvSlNPTih0KSksYy51dWlkfWlmKHRoaXMuaXNTY2VuZSl0aGlzLmJhY2tncm91bmQmJih0aGlzLmJhY2tncm91bmQuaXNDb2xvcj9uLmJhY2tncm91bmQ9dGhpcy5iYWNrZ3JvdW5kLnRvSlNPTigpOnRoaXMuYmFja2dyb3VuZC5pc1RleHR1cmUmJihuLmJhY2tncm91bmQ9dGhpcy5iYWNrZ3JvdW5kLnRvSlNPTih0KS51dWlkKSksdGhpcy5lbnZpcm9ubWVudCYmdGhpcy5lbnZpcm9ubWVudC5pc1RleHR1cmUmJnRoaXMuZW52aXJvbm1lbnQuaXNSZW5kZXJUYXJnZXRUZXh0dXJlIT09ITAmJihuLmVudmlyb25tZW50PXRoaXMuZW52aXJvbm1lbnQudG9KU09OKHQpLnV1aWQpO2Vsc2UgaWYodGhpcy5pc01lc2h8fHRoaXMuaXNMaW5lfHx0aGlzLmlzUG9pbnRzKXtuLmdlb21ldHJ5PWkodC5nZW9tZXRyaWVzLHRoaXMuZ2VvbWV0cnkpO2NvbnN0IGE9dGhpcy5nZW9tZXRyeS5wYXJhbWV0ZXJzO2lmKGEhPT12b2lkIDAmJmEuc2hhcGVzIT09dm9pZCAwKXtjb25zdCBjPWEuc2hhcGVzO2lmKEFycmF5LmlzQXJyYXkoYykpZm9yKGxldCB1PTAsaD1jLmxlbmd0aDt1PGg7dSsrKXtjb25zdCBsPWNbdV07aSh0LnNoYXBlcyxsKX1lbHNlIGkodC5zaGFwZXMsYyl9fWlmKHRoaXMuaXNTa2lubmVkTWVzaCYmKG4uYmluZE1vZGU9dGhpcy5iaW5kTW9kZSxuLmJpbmRNYXRyaXg9dGhpcy5iaW5kTWF0cml4LnRvQXJyYXkoKSx0aGlzLnNrZWxldG9uIT09dm9pZCAwJiYoaSh0LnNrZWxldG9ucyx0aGlzLnNrZWxldG9uKSxuLnNrZWxldG9uPXRoaXMuc2tlbGV0b24udXVpZCkpLHRoaXMubWF0ZXJpYWwhPT12b2lkIDApaWYoQXJyYXkuaXNBcnJheSh0aGlzLm1hdGVyaWFsKSl7Y29uc3QgYT1bXTtmb3IobGV0IGM9MCx1PXRoaXMubWF0ZXJpYWwubGVuZ3RoO2M8dTtjKyspYS5wdXNoKGkodC5tYXRlcmlhbHMsdGhpcy5tYXRlcmlhbFtjXSkpO24ubWF0ZXJpYWw9YX1lbHNlIG4ubWF0ZXJpYWw9aSh0Lm1hdGVyaWFscyx0aGlzLm1hdGVyaWFsKTtpZih0aGlzLmNoaWxkcmVuLmxlbmd0aD4wKXtuLmNoaWxkcmVuPVtdO2ZvcihsZXQgYT0wO2E8dGhpcy5jaGlsZHJlbi5sZW5ndGg7YSsrKW4uY2hpbGRyZW4ucHVzaCh0aGlzLmNoaWxkcmVuW2FdLnRvSlNPTih0KS5vYmplY3QpfWlmKHRoaXMuYW5pbWF0aW9ucy5sZW5ndGg+MCl7bi5hbmltYXRpb25zPVtdO2ZvcihsZXQgYT0wO2E8dGhpcy5hbmltYXRpb25zLmxlbmd0aDthKyspe2NvbnN0IGM9dGhpcy5hbmltYXRpb25zW2FdO24uYW5pbWF0aW9ucy5wdXNoKGkodC5hbmltYXRpb25zLGMpKX19aWYoZSl7Y29uc3QgYT1vKHQuZ2VvbWV0cmllcyksYz1vKHQubWF0ZXJpYWxzKSx1PW8odC50ZXh0dXJlcyksaD1vKHQuaW1hZ2VzKSxsPW8odC5zaGFwZXMpLGQ9byh0LnNrZWxldG9ucyksZj1vKHQuYW5pbWF0aW9ucykscD1vKHQubm9kZXMpO2EubGVuZ3RoPjAmJihzLmdlb21ldHJpZXM9YSksYy5sZW5ndGg+MCYmKHMubWF0ZXJpYWxzPWMpLHUubGVuZ3RoPjAmJihzLnRleHR1cmVzPXUpLGgubGVuZ3RoPjAmJihzLmltYWdlcz1oKSxsLmxlbmd0aD4wJiYocy5zaGFwZXM9bCksZC5sZW5ndGg+MCYmKHMuc2tlbGV0b25zPWQpLGYubGVuZ3RoPjAmJihzLmFuaW1hdGlvbnM9ZikscC5sZW5ndGg+MCYmKHMubm9kZXM9cCl9cmV0dXJuIHMub2JqZWN0PW4scztmdW5jdGlvbiBvKGEpe2NvbnN0IGM9W107Zm9yKGNvbnN0IHUgaW4gYSl7Y29uc3QgaD1hW3VdO2RlbGV0ZSBoLm1ldGFkYXRhLGMucHVzaChoKX1yZXR1cm4gY319Y2xvbmUodCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSh0aGlzLHQpfWNvcHkodCxlPSEwKXtpZih0aGlzLm5hbWU9dC5uYW1lLHRoaXMudXAuY29weSh0LnVwKSx0aGlzLnBvc2l0aW9uLmNvcHkodC5wb3NpdGlvbiksdGhpcy5yb3RhdGlvbi5vcmRlcj10LnJvdGF0aW9uLm9yZGVyLHRoaXMucXVhdGVybmlvbi5jb3B5KHQucXVhdGVybmlvbiksdGhpcy5zY2FsZS5jb3B5KHQuc2NhbGUpLHRoaXMubWF0cml4LmNvcHkodC5tYXRyaXgpLHRoaXMubWF0cml4V29ybGQuY29weSh0Lm1hdHJpeFdvcmxkKSx0aGlzLm1hdHJpeEF1dG9VcGRhdGU9dC5tYXRyaXhBdXRvVXBkYXRlLHRoaXMubWF0cml4V29ybGRBdXRvVXBkYXRlPXQubWF0cml4V29ybGRBdXRvVXBkYXRlLHRoaXMubWF0cml4V29ybGROZWVkc1VwZGF0ZT10Lm1hdHJpeFdvcmxkTmVlZHNVcGRhdGUsdGhpcy5sYXllcnMubWFzaz10LmxheWVycy5tYXNrLHRoaXMudmlzaWJsZT10LnZpc2libGUsdGhpcy5jYXN0U2hhZG93PXQuY2FzdFNoYWRvdyx0aGlzLnJlY2VpdmVTaGFkb3c9dC5yZWNlaXZlU2hhZG93LHRoaXMuZnJ1c3R1bUN1bGxlZD10LmZydXN0dW1DdWxsZWQsdGhpcy5yZW5kZXJPcmRlcj10LnJlbmRlck9yZGVyLHRoaXMuYW5pbWF0aW9ucz10LmFuaW1hdGlvbnMuc2xpY2UoKSx0aGlzLnVzZXJEYXRhPUpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodC51c2VyRGF0YSkpLGU9PT0hMClmb3IobGV0IHM9MDtzPHQuY2hpbGRyZW4ubGVuZ3RoO3MrKyl7Y29uc3Qgbj10LmNoaWxkcmVuW3NdO3RoaXMuYWRkKG4uY2xvbmUoKSl9cmV0dXJuIHRoaXN9fW5lLkRFRkFVTFRfVVA9bmV3IEEoMCwxLDApLG5lLkRFRkFVTFRfTUFUUklYX0FVVE9fVVBEQVRFPSEwLG5lLkRFRkFVTFRfTUFUUklYX1dPUkxEX0FVVE9fVVBEQVRFPSEwO2NvbnN0IEl0PW5ldyBBLFh0PW5ldyBBLFBuPW5ldyBBLFl0PW5ldyBBLHplPW5ldyBBLGJlPW5ldyBBLHlyPW5ldyBBLExuPW5ldyBBLE9uPW5ldyBBLERuPW5ldyBBLFZuPW5ldyBGdCxVbj1uZXcgRnQsa249bmV3IEZ0O2NsYXNzIHd0e2NvbnN0cnVjdG9yKHQ9bmV3IEEsZT1uZXcgQSxzPW5ldyBBKXt0aGlzLmE9dCx0aGlzLmI9ZSx0aGlzLmM9c31zdGF0aWMgZ2V0Tm9ybWFsKHQsZSxzLG4pe24uc3ViVmVjdG9ycyhzLGUpLEl0LnN1YlZlY3RvcnModCxlKSxuLmNyb3NzKEl0KTtjb25zdCBpPW4ubGVuZ3RoU3EoKTtyZXR1cm4gaT4wP24ubXVsdGlwbHlTY2FsYXIoMS9NYXRoLnNxcnQoaSkpOm4uc2V0KDAsMCwwKX1zdGF0aWMgZ2V0QmFyeWNvb3JkKHQsZSxzLG4saSl7SXQuc3ViVmVjdG9ycyhuLGUpLFh0LnN1YlZlY3RvcnMocyxlKSxQbi5zdWJWZWN0b3JzKHQsZSk7Y29uc3Qgbz1JdC5kb3QoSXQpLGE9SXQuZG90KFh0KSxjPUl0LmRvdChQbiksdT1YdC5kb3QoWHQpLGg9WHQuZG90KFBuKSxsPW8qdS1hKmE7aWYobD09PTApcmV0dXJuIGkuc2V0KDAsMCwwKSxudWxsO2NvbnN0IGQ9MS9sLGY9KHUqYy1hKmgpKmQscD0obypoLWEqYykqZDtyZXR1cm4gaS5zZXQoMS1mLXAscCxmKX1zdGF0aWMgY29udGFpbnNQb2ludCh0LGUscyxuKXtyZXR1cm4gdGhpcy5nZXRCYXJ5Y29vcmQodCxlLHMsbixZdCk9PT1udWxsPyExOll0Lng+PTAmJll0Lnk+PTAmJll0LngrWXQueTw9MX1zdGF0aWMgZ2V0SW50ZXJwb2xhdGlvbih0LGUscyxuLGksbyxhLGMpe3JldHVybiB0aGlzLmdldEJhcnljb29yZCh0LGUscyxuLFl0KT09PW51bGw/KGMueD0wLGMueT0wLCJ6ImluIGMmJihjLno9MCksInciaW4gYyYmKGMudz0wKSxudWxsKTooYy5zZXRTY2FsYXIoMCksYy5hZGRTY2FsZWRWZWN0b3IoaSxZdC54KSxjLmFkZFNjYWxlZFZlY3RvcihvLFl0LnkpLGMuYWRkU2NhbGVkVmVjdG9yKGEsWXQueiksYyl9c3RhdGljIGdldEludGVycG9sYXRlZEF0dHJpYnV0ZSh0LGUscyxuLGksbyl7cmV0dXJuIFZuLnNldFNjYWxhcigwKSxVbi5zZXRTY2FsYXIoMCksa24uc2V0U2NhbGFyKDApLFZuLmZyb21CdWZmZXJBdHRyaWJ1dGUodCxlKSxVbi5mcm9tQnVmZmVyQXR0cmlidXRlKHQscyksa24uZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0LG4pLG8uc2V0U2NhbGFyKDApLG8uYWRkU2NhbGVkVmVjdG9yKFZuLGkueCksby5hZGRTY2FsZWRWZWN0b3IoVW4saS55KSxvLmFkZFNjYWxlZFZlY3RvcihrbixpLnopLG99c3RhdGljIGlzRnJvbnRGYWNpbmcodCxlLHMsbil7cmV0dXJuIEl0LnN1YlZlY3RvcnMocyxlKSxYdC5zdWJWZWN0b3JzKHQsZSksSXQuY3Jvc3MoWHQpLmRvdChuKTwwfXNldCh0LGUscyl7cmV0dXJuIHRoaXMuYS5jb3B5KHQpLHRoaXMuYi5jb3B5KGUpLHRoaXMuYy5jb3B5KHMpLHRoaXN9c2V0RnJvbVBvaW50c0FuZEluZGljZXModCxlLHMsbil7cmV0dXJuIHRoaXMuYS5jb3B5KHRbZV0pLHRoaXMuYi5jb3B5KHRbc10pLHRoaXMuYy5jb3B5KHRbbl0pLHRoaXN9c2V0RnJvbUF0dHJpYnV0ZUFuZEluZGljZXModCxlLHMsbil7cmV0dXJuIHRoaXMuYS5mcm9tQnVmZmVyQXR0cmlidXRlKHQsZSksdGhpcy5iLmZyb21CdWZmZXJBdHRyaWJ1dGUodCxzKSx0aGlzLmMuZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0LG4pLHRoaXN9Y2xvbmUoKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KHRoaXMpfWNvcHkodCl7cmV0dXJuIHRoaXMuYS5jb3B5KHQuYSksdGhpcy5iLmNvcHkodC5iKSx0aGlzLmMuY29weSh0LmMpLHRoaXN9Z2V0QXJlYSgpe3JldHVybiBJdC5zdWJWZWN0b3JzKHRoaXMuYyx0aGlzLmIpLFh0LnN1YlZlY3RvcnModGhpcy5hLHRoaXMuYiksSXQuY3Jvc3MoWHQpLmxlbmd0aCgpKi41fWdldE1pZHBvaW50KHQpe3JldHVybiB0LmFkZFZlY3RvcnModGhpcy5hLHRoaXMuYikuYWRkKHRoaXMuYykubXVsdGlwbHlTY2FsYXIoMS8zKX1nZXROb3JtYWwodCl7cmV0dXJuIHd0LmdldE5vcm1hbCh0aGlzLmEsdGhpcy5iLHRoaXMuYyx0KX1nZXRQbGFuZSh0KXtyZXR1cm4gdC5zZXRGcm9tQ29wbGFuYXJQb2ludHModGhpcy5hLHRoaXMuYix0aGlzLmMpfWdldEJhcnljb29yZCh0LGUpe3JldHVybiB3dC5nZXRCYXJ5Y29vcmQodCx0aGlzLmEsdGhpcy5iLHRoaXMuYyxlKX1nZXRJbnRlcnBvbGF0aW9uKHQsZSxzLG4saSl7cmV0dXJuIHd0LmdldEludGVycG9sYXRpb24odCx0aGlzLmEsdGhpcy5iLHRoaXMuYyxlLHMsbixpKX1jb250YWluc1BvaW50KHQpe3JldHVybiB3dC5jb250YWluc1BvaW50KHQsdGhpcy5hLHRoaXMuYix0aGlzLmMpfWlzRnJvbnRGYWNpbmcodCl7cmV0dXJuIHd0LmlzRnJvbnRGYWNpbmcodGhpcy5hLHRoaXMuYix0aGlzLmMsdCl9aW50ZXJzZWN0c0JveCh0KXtyZXR1cm4gdC5pbnRlcnNlY3RzVHJpYW5nbGUodGhpcyl9Y2xvc2VzdFBvaW50VG9Qb2ludCh0LGUpe2NvbnN0IHM9dGhpcy5hLG49dGhpcy5iLGk9dGhpcy5jO2xldCBvLGE7emUuc3ViVmVjdG9ycyhuLHMpLGJlLnN1YlZlY3RvcnMoaSxzKSxMbi5zdWJWZWN0b3JzKHQscyk7Y29uc3QgYz16ZS5kb3QoTG4pLHU9YmUuZG90KExuKTtpZihjPD0wJiZ1PD0wKXJldHVybiBlLmNvcHkocyk7T24uc3ViVmVjdG9ycyh0LG4pO2NvbnN0IGg9emUuZG90KE9uKSxsPWJlLmRvdChPbik7aWYoaD49MCYmbDw9aClyZXR1cm4gZS5jb3B5KG4pO2NvbnN0IGQ9YypsLWgqdTtpZihkPD0wJiZjPj0wJiZoPD0wKXJldHVybiBvPWMvKGMtaCksZS5jb3B5KHMpLmFkZFNjYWxlZFZlY3Rvcih6ZSxvKTtEbi5zdWJWZWN0b3JzKHQsaSk7Y29uc3QgZj16ZS5kb3QoRG4pLHA9YmUuZG90KERuKTtpZihwPj0wJiZmPD1wKXJldHVybiBlLmNvcHkoaSk7Y29uc3QgbT1mKnUtYypwO2lmKG08PTAmJnU+PTAmJnA8PTApcmV0dXJuIGE9dS8odS1wKSxlLmNvcHkocykuYWRkU2NhbGVkVmVjdG9yKGJlLGEpO2NvbnN0IGc9aCpwLWYqbDtpZihnPD0wJiZsLWg+PTAmJmYtcD49MClyZXR1cm4geXIuc3ViVmVjdG9ycyhpLG4pLGE9KGwtaCkvKGwtaCsoZi1wKSksZS5jb3B5KG4pLmFkZFNjYWxlZFZlY3Rvcih5cixhKTtjb25zdCB5PTEvKGcrbStkKTtyZXR1cm4gbz1tKnksYT1kKnksZS5jb3B5KHMpLmFkZFNjYWxlZFZlY3Rvcih6ZSxvKS5hZGRTY2FsZWRWZWN0b3IoYmUsYSl9ZXF1YWxzKHQpe3JldHVybiB0LmEuZXF1YWxzKHRoaXMuYSkmJnQuYi5lcXVhbHModGhpcy5iKSYmdC5jLmVxdWFscyh0aGlzLmMpfX1jb25zdCBncj17YWxpY2VibHVlOjE1NzkyMzgzLGFudGlxdWV3aGl0ZToxNjQ0NDM3NSxhcXVhOjY1NTM1LGFxdWFtYXJpbmU6ODM4ODU2NCxhenVyZToxNTc5NDE3NSxiZWlnZToxNjExOTI2MCxiaXNxdWU6MTY3NzAyNDQsYmxhY2s6MCxibGFuY2hlZGFsbW9uZDoxNjc3MjA0NSxibHVlOjI1NSxibHVldmlvbGV0OjkwNTUyMDIsYnJvd246MTA4MjQyMzQsYnVybHl3b29kOjE0NTk2MjMxLGNhZGV0Ymx1ZTo2MjY2NTI4LGNoYXJ0cmV1c2U6ODM4ODM1MixjaG9jb2xhdGU6MTM3ODk0NzAsY29yYWw6MTY3NDQyNzIsY29ybmZsb3dlcmJsdWU6NjU5MTk4MSxjb3Juc2lsazoxNjc3NTM4OCxjcmltc29uOjE0NDIzMTAwLGN5YW46NjU1MzUsZGFya2JsdWU6MTM5LGRhcmtjeWFuOjM1NzIzLGRhcmtnb2xkZW5yb2Q6MTIwOTI5MzksZGFya2dyYXk6MTExMTkwMTcsZGFya2dyZWVuOjI1NjAwLGRhcmtncmV5OjExMTE5MDE3LGRhcmtraGFraToxMjQzMzI1OSxkYXJrbWFnZW50YTo5MTA5NjQzLGRhcmtvbGl2ZWdyZWVuOjU1OTc5OTksZGFya29yYW5nZToxNjc0NzUyMCxkYXJrb3JjaGlkOjEwMDQwMDEyLGRhcmtyZWQ6OTEwOTUwNCxkYXJrc2FsbW9uOjE1MzA4NDEwLGRhcmtzZWFncmVlbjo5NDE5OTE5LGRhcmtzbGF0ZWJsdWU6NDczNDM0NyxkYXJrc2xhdGVncmF5OjMxMDA0OTUsZGFya3NsYXRlZ3JleTozMTAwNDk1LGRhcmt0dXJxdW9pc2U6NTI5NDUsZGFya3Zpb2xldDo5Njk5NTM5LGRlZXBwaW5rOjE2NzE2OTQ3LGRlZXBza3libHVlOjQ5MTUxLGRpbWdyYXk6NjkwODI2NSxkaW1ncmV5OjY5MDgyNjUsZG9kZ2VyYmx1ZToyMDAzMTk5LGZpcmVicmljazoxMTY3NDE0NixmbG9yYWx3aGl0ZToxNjc3NTkyMCxmb3Jlc3RncmVlbjoyMjYzODQyLGZ1Y2hzaWE6MTY3MTE5MzUsZ2FpbnNib3JvOjE0NDc0NDYwLGdob3N0d2hpdGU6MTYzMTY2NzEsZ29sZDoxNjc2NjcyMCxnb2xkZW5yb2Q6MTQzMjkxMjAsZ3JheTo4NDIxNTA0LGdyZWVuOjMyNzY4LGdyZWVueWVsbG93OjExNDAzMDU1LGdyZXk6ODQyMTUwNCxob25leWRldzoxNTc5NDE2MCxob3RwaW5rOjE2NzM4NzQwLGluZGlhbnJlZDoxMzQ1ODUyNCxpbmRpZ286NDkxNTMzMCxpdm9yeToxNjc3NzIwMCxraGFraToxNTc4NzY2MCxsYXZlbmRlcjoxNTEzMjQxMCxsYXZlbmRlcmJsdXNoOjE2NzczMzY1LGxhd25ncmVlbjo4MTkwOTc2LGxlbW9uY2hpZmZvbjoxNjc3NTg4NSxsaWdodGJsdWU6MTEzOTMyNTQsbGlnaHRjb3JhbDoxNTc2MTUzNixsaWdodGN5YW46MTQ3NDU1OTksbGlnaHRnb2xkZW5yb2R5ZWxsb3c6MTY0NDgyMTAsbGlnaHRncmF5OjEzODgyMzIzLGxpZ2h0Z3JlZW46OTQ5ODI1NixsaWdodGdyZXk6MTM4ODIzMjMsbGlnaHRwaW5rOjE2NzU4NDY1LGxpZ2h0c2FsbW9uOjE2NzUyNzYyLGxpZ2h0c2VhZ3JlZW46MjE0Mjg5MCxsaWdodHNreWJsdWU6ODkwMDM0NixsaWdodHNsYXRlZ3JheTo3ODMzNzUzLGxpZ2h0c2xhdGVncmV5Ojc4MzM3NTMsbGlnaHRzdGVlbGJsdWU6MTE1ODQ3MzQsbGlnaHR5ZWxsb3c6MTY3NzcxODQsbGltZTo2NTI4MCxsaW1lZ3JlZW46MzMyOTMzMCxsaW5lbjoxNjQ0NTY3MCxtYWdlbnRhOjE2NzExOTM1LG1hcm9vbjo4Mzg4NjA4LG1lZGl1bWFxdWFtYXJpbmU6NjczNzMyMixtZWRpdW1ibHVlOjIwNSxtZWRpdW1vcmNoaWQ6MTIyMTE2NjcsbWVkaXVtcHVycGxlOjk2NjI2ODMsbWVkaXVtc2VhZ3JlZW46Mzk3ODA5NyxtZWRpdW1zbGF0ZWJsdWU6ODA4Nzc5MCxtZWRpdW1zcHJpbmdncmVlbjo2NDE1NCxtZWRpdW10dXJxdW9pc2U6NDc3MjMwMCxtZWRpdW12aW9sZXRyZWQ6MTMwNDcxNzMsbWlkbmlnaHRibHVlOjE2NDQ5MTIsbWludGNyZWFtOjE2MTIxODUwLG1pc3R5cm9zZToxNjc3MDI3Myxtb2NjYXNpbjoxNjc3MDIyOSxuYXZham93aGl0ZToxNjc2ODY4NSxuYXZ5OjEyOCxvbGRsYWNlOjE2NjQzNTU4LG9saXZlOjg0MjEzNzYsb2xpdmVkcmFiOjcwNDg3Mzksb3JhbmdlOjE2NzUzOTIwLG9yYW5nZXJlZDoxNjcyOTM0NCxvcmNoaWQ6MTQzMTU3MzQscGFsZWdvbGRlbnJvZDoxNTY1NzEzMCxwYWxlZ3JlZW46MTAwMjU4ODAscGFsZXR1cnF1b2lzZToxMTUyOTk2NixwYWxldmlvbGV0cmVkOjE0MzgxMjAzLHBhcGF5YXdoaXA6MTY3NzMwNzcscGVhY2hwdWZmOjE2NzY3NjczLHBlcnU6MTM0Njg5OTEscGluazoxNjc2MTAzNSxwbHVtOjE0NTI0NjM3LHBvd2RlcmJsdWU6MTE1OTE5MTAscHVycGxlOjgzODg3MzYscmViZWNjYXB1cnBsZTo2Njk3ODgxLHJlZDoxNjcxMTY4MCxyb3N5YnJvd246MTIzNTc1MTkscm95YWxibHVlOjQyODY5NDUsc2FkZGxlYnJvd246OTEyNzE4NyxzYWxtb246MTY0MTY4ODIsc2FuZHlicm93bjoxNjAzMjg2NCxzZWFncmVlbjozMDUwMzI3LHNlYXNoZWxsOjE2Nzc0NjM4LHNpZW5uYToxMDUwNjc5NyxzaWx2ZXI6MTI2MzIyNTYsc2t5Ymx1ZTo4OTAwMzMxLHNsYXRlYmx1ZTo2OTcwMDYxLHNsYXRlZ3JheTo3MzcyOTQ0LHNsYXRlZ3JleTo3MzcyOTQ0LHNub3c6MTY3NzU5MzAsc3ByaW5nZ3JlZW46NjU0MDcsc3RlZWxibHVlOjQ2MjA5ODAsdGFuOjEzODA4NzgwLHRlYWw6MzI4OTYsdGhpc3RsZToxNDIwNDg4OCx0b21hdG86MTY3MzcwOTUsdHVycXVvaXNlOjQyNTE4NTYsdmlvbGV0OjE1NjMxMDg2LHdoZWF0OjE2MTEzMzMxLHdoaXRlOjE2Nzc3MjE1LHdoaXRlc21va2U6MTYxMTkyODUseWVsbG93OjE2Nzc2OTYwLHllbGxvd2dyZWVuOjEwMTQ1MDc0fSxpZT17aDowLHM6MCxsOjB9LExzPXtoOjAsczowLGw6MH07ZnVuY3Rpb24gSG4ocix0LGUpe3JldHVybiBlPDAmJihlKz0xKSxlPjEmJihlLT0xKSxlPDEvNj9yKyh0LXIpKjYqZTplPDEvMj90OmU8Mi8zP3IrKHQtcikqNiooMi8zLWUpOnJ9Y2xhc3MgcW57Y29uc3RydWN0b3IodCxlLHMpe3JldHVybiB0aGlzLmlzQ29sb3I9ITAsdGhpcy5yPTEsdGhpcy5nPTEsdGhpcy5iPTEsdGhpcy5zZXQodCxlLHMpfXNldCh0LGUscyl7aWYoZT09PXZvaWQgMCYmcz09PXZvaWQgMCl7Y29uc3Qgbj10O24mJm4uaXNDb2xvcj90aGlzLmNvcHkobik6dHlwZW9mIG49PSJudW1iZXIiP3RoaXMuc2V0SGV4KG4pOnR5cGVvZiBuPT0ic3RyaW5nIiYmdGhpcy5zZXRTdHlsZShuKX1lbHNlIHRoaXMuc2V0UkdCKHQsZSxzKTtyZXR1cm4gdGhpc31zZXRTY2FsYXIodCl7cmV0dXJuIHRoaXMucj10LHRoaXMuZz10LHRoaXMuYj10LHRoaXN9c2V0SGV4KHQsZT0kdCl7cmV0dXJuIHQ9TWF0aC5mbG9vcih0KSx0aGlzLnI9KHQ+PjE2JjI1NSkvMjU1LHRoaXMuZz0odD4+OCYyNTUpLzI1NSx0aGlzLmI9KHQmMjU1KS8yNTUsbXQudG9Xb3JraW5nQ29sb3JTcGFjZSh0aGlzLGUpLHRoaXN9c2V0UkdCKHQsZSxzLG49bXQud29ya2luZ0NvbG9yU3BhY2Upe3JldHVybiB0aGlzLnI9dCx0aGlzLmc9ZSx0aGlzLmI9cyxtdC50b1dvcmtpbmdDb2xvclNwYWNlKHRoaXMsbiksdGhpc31zZXRIU0wodCxlLHMsbj1tdC53b3JraW5nQ29sb3JTcGFjZSl7aWYodD1ibih0LDEpLGU9YXQoZSwwLDEpLHM9YXQocywwLDEpLGU9PT0wKXRoaXMucj10aGlzLmc9dGhpcy5iPXM7ZWxzZXtjb25zdCBpPXM8PS41P3MqKDErZSk6cytlLXMqZSxvPTIqcy1pO3RoaXMucj1IbihvLGksdCsxLzMpLHRoaXMuZz1IbihvLGksdCksdGhpcy5iPUhuKG8saSx0LTEvMyl9cmV0dXJuIG10LnRvV29ya2luZ0NvbG9yU3BhY2UodGhpcyxuKSx0aGlzfXNldFN0eWxlKHQsZT0kdCl7ZnVuY3Rpb24gcyhpKXtpIT09dm9pZCAwJiZwYXJzZUZsb2F0KGkpPDEmJmNvbnNvbGUud2FybigiVEhSRUUuQ29sb3I6IEFscGhhIGNvbXBvbmVudCBvZiAiK3QrIiB3aWxsIGJlIGlnbm9yZWQuIil9bGV0IG47aWYobj0vXihcdyspXCgoW15cKV0qKVwpLy5leGVjKHQpKXtsZXQgaTtjb25zdCBvPW5bMV0sYT1uWzJdO3N3aXRjaChvKXtjYXNlInJnYiI6Y2FzZSJyZ2JhIjppZihpPS9eXHMqKFxkKylccyosXHMqKFxkKylccyosXHMqKFxkKylccyooPzosXHMqKFxkKlwuP1xkKylccyopPyQvLmV4ZWMoYSkpcmV0dXJuIHMoaVs0XSksdGhpcy5zZXRSR0IoTWF0aC5taW4oMjU1LHBhcnNlSW50KGlbMV0sMTApKS8yNTUsTWF0aC5taW4oMjU1LHBhcnNlSW50KGlbMl0sMTApKS8yNTUsTWF0aC5taW4oMjU1LHBhcnNlSW50KGlbM10sMTApKS8yNTUsZSk7aWYoaT0vXlxzKihcZCspXCVccyosXHMqKFxkKylcJVxzKixccyooXGQrKVwlXHMqKD86LFxzKihcZCpcLj9cZCspXHMqKT8kLy5leGVjKGEpKXJldHVybiBzKGlbNF0pLHRoaXMuc2V0UkdCKE1hdGgubWluKDEwMCxwYXJzZUludChpWzFdLDEwKSkvMTAwLE1hdGgubWluKDEwMCxwYXJzZUludChpWzJdLDEwKSkvMTAwLE1hdGgubWluKDEwMCxwYXJzZUludChpWzNdLDEwKSkvMTAwLGUpO2JyZWFrO2Nhc2UiaHNsIjpjYXNlImhzbGEiOmlmKGk9L15ccyooXGQqXC4/XGQrKVxzKixccyooXGQqXC4/XGQrKVwlXHMqLFxzKihcZCpcLj9cZCspXCVccyooPzosXHMqKFxkKlwuP1xkKylccyopPyQvLmV4ZWMoYSkpcmV0dXJuIHMoaVs0XSksdGhpcy5zZXRIU0wocGFyc2VGbG9hdChpWzFdKS8zNjAscGFyc2VGbG9hdChpWzJdKS8xMDAscGFyc2VGbG9hdChpWzNdKS8xMDAsZSk7YnJlYWs7ZGVmYXVsdDpjb25zb2xlLndhcm4oIlRIUkVFLkNvbG9yOiBVbmtub3duIGNvbG9yIG1vZGVsICIrdCl9fWVsc2UgaWYobj0vXlwjKFtBLUZhLWZcZF0rKSQvLmV4ZWModCkpe2NvbnN0IGk9blsxXSxvPWkubGVuZ3RoO2lmKG89PT0zKXJldHVybiB0aGlzLnNldFJHQihwYXJzZUludChpLmNoYXJBdCgwKSwxNikvMTUscGFyc2VJbnQoaS5jaGFyQXQoMSksMTYpLzE1LHBhcnNlSW50KGkuY2hhckF0KDIpLDE2KS8xNSxlKTtpZihvPT09NilyZXR1cm4gdGhpcy5zZXRIZXgocGFyc2VJbnQoaSwxNiksZSk7Y29uc29sZS53YXJuKCJUSFJFRS5Db2xvcjogSW52YWxpZCBoZXggY29sb3IgIit0KX1lbHNlIGlmKHQmJnQubGVuZ3RoPjApcmV0dXJuIHRoaXMuc2V0Q29sb3JOYW1lKHQsZSk7cmV0dXJuIHRoaXN9c2V0Q29sb3JOYW1lKHQsZT0kdCl7Y29uc3Qgcz1nclt0LnRvTG93ZXJDYXNlKCldO3JldHVybiBzIT09dm9pZCAwP3RoaXMuc2V0SGV4KHMsZSk6Y29uc29sZS53YXJuKCJUSFJFRS5Db2xvcjogVW5rbm93biBjb2xvciAiK3QpLHRoaXN9Y2xvbmUoKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IodGhpcy5yLHRoaXMuZyx0aGlzLmIpfWNvcHkodCl7cmV0dXJuIHRoaXMucj10LnIsdGhpcy5nPXQuZyx0aGlzLmI9dC5iLHRoaXN9Y29weVNSR0JUb0xpbmVhcih0KXtyZXR1cm4gdGhpcy5yPXhlKHQuciksdGhpcy5nPXhlKHQuZyksdGhpcy5iPXhlKHQuYiksdGhpc31jb3B5TGluZWFyVG9TUkdCKHQpe3JldHVybiB0aGlzLnI9Q24odC5yKSx0aGlzLmc9Q24odC5nKSx0aGlzLmI9Q24odC5iKSx0aGlzfWNvbnZlcnRTUkdCVG9MaW5lYXIoKXtyZXR1cm4gdGhpcy5jb3B5U1JHQlRvTGluZWFyKHRoaXMpLHRoaXN9Y29udmVydExpbmVhclRvU1JHQigpe3JldHVybiB0aGlzLmNvcHlMaW5lYXJUb1NSR0IodGhpcyksdGhpc31nZXRIZXgodD0kdCl7cmV0dXJuIG10LmZyb21Xb3JraW5nQ29sb3JTcGFjZShjdC5jb3B5KHRoaXMpLHQpLE1hdGgucm91bmQoYXQoY3QucioyNTUsMCwyNTUpKSo2NTUzNitNYXRoLnJvdW5kKGF0KGN0LmcqMjU1LDAsMjU1KSkqMjU2K01hdGgucm91bmQoYXQoY3QuYioyNTUsMCwyNTUpKX1nZXRIZXhTdHJpbmcodD0kdCl7cmV0dXJuKCIwMDAwMDAiK3RoaXMuZ2V0SGV4KHQpLnRvU3RyaW5nKDE2KSkuc2xpY2UoLTYpfWdldEhTTCh0LGU9bXQud29ya2luZ0NvbG9yU3BhY2Upe210LmZyb21Xb3JraW5nQ29sb3JTcGFjZShjdC5jb3B5KHRoaXMpLGUpO2NvbnN0IHM9Y3QucixuPWN0LmcsaT1jdC5iLG89TWF0aC5tYXgocyxuLGkpLGE9TWF0aC5taW4ocyxuLGkpO2xldCBjLHU7Y29uc3QgaD0oYStvKS8yO2lmKGE9PT1vKWM9MCx1PTA7ZWxzZXtjb25zdCBsPW8tYTtzd2l0Y2godT1oPD0uNT9sLyhvK2EpOmwvKDItby1hKSxvKXtjYXNlIHM6Yz0obi1pKS9sKyhuPGk/NjowKTticmVhaztjYXNlIG46Yz0oaS1zKS9sKzI7YnJlYWs7Y2FzZSBpOmM9KHMtbikvbCs0O2JyZWFrfWMvPTZ9cmV0dXJuIHQuaD1jLHQucz11LHQubD1oLHR9Z2V0UkdCKHQsZT1tdC53b3JraW5nQ29sb3JTcGFjZSl7cmV0dXJuIG10LmZyb21Xb3JraW5nQ29sb3JTcGFjZShjdC5jb3B5KHRoaXMpLGUpLHQucj1jdC5yLHQuZz1jdC5nLHQuYj1jdC5iLHR9Z2V0U3R5bGUodD0kdCl7bXQuZnJvbVdvcmtpbmdDb2xvclNwYWNlKGN0LmNvcHkodGhpcyksdCk7Y29uc3QgZT1jdC5yLHM9Y3QuZyxuPWN0LmI7cmV0dXJuIHQhPT0kdD9gY29sb3IoJHt0fSAke2UudG9GaXhlZCgzKX0gJHtzLnRvRml4ZWQoMyl9ICR7bi50b0ZpeGVkKDMpfSlgOmByZ2IoJHtNYXRoLnJvdW5kKGUqMjU1KX0sJHtNYXRoLnJvdW5kKHMqMjU1KX0sJHtNYXRoLnJvdW5kKG4qMjU1KX0pYH1vZmZzZXRIU0wodCxlLHMpe3JldHVybiB0aGlzLmdldEhTTChpZSksdGhpcy5zZXRIU0woaWUuaCt0LGllLnMrZSxpZS5sK3MpfWFkZCh0KXtyZXR1cm4gdGhpcy5yKz10LnIsdGhpcy5nKz10LmcsdGhpcy5iKz10LmIsdGhpc31hZGRDb2xvcnModCxlKXtyZXR1cm4gdGhpcy5yPXQucitlLnIsdGhpcy5nPXQuZytlLmcsdGhpcy5iPXQuYitlLmIsdGhpc31hZGRTY2FsYXIodCl7cmV0dXJuIHRoaXMucis9dCx0aGlzLmcrPXQsdGhpcy5iKz10LHRoaXN9c3ViKHQpe3JldHVybiB0aGlzLnI9TWF0aC5tYXgoMCx0aGlzLnItdC5yKSx0aGlzLmc9TWF0aC5tYXgoMCx0aGlzLmctdC5nKSx0aGlzLmI9TWF0aC5tYXgoMCx0aGlzLmItdC5iKSx0aGlzfW11bHRpcGx5KHQpe3JldHVybiB0aGlzLnIqPXQucix0aGlzLmcqPXQuZyx0aGlzLmIqPXQuYix0aGlzfW11bHRpcGx5U2NhbGFyKHQpe3JldHVybiB0aGlzLnIqPXQsdGhpcy5nKj10LHRoaXMuYio9dCx0aGlzfWxlcnAodCxlKXtyZXR1cm4gdGhpcy5yKz0odC5yLXRoaXMucikqZSx0aGlzLmcrPSh0LmctdGhpcy5nKSplLHRoaXMuYis9KHQuYi10aGlzLmIpKmUsdGhpc31sZXJwQ29sb3JzKHQsZSxzKXtyZXR1cm4gdGhpcy5yPXQucisoZS5yLXQucikqcyx0aGlzLmc9dC5nKyhlLmctdC5nKSpzLHRoaXMuYj10LmIrKGUuYi10LmIpKnMsdGhpc31sZXJwSFNMKHQsZSl7dGhpcy5nZXRIU0woaWUpLHQuZ2V0SFNMKExzKTtjb25zdCBzPUplKGllLmgsTHMuaCxlKSxuPUplKGllLnMsTHMucyxlKSxpPUplKGllLmwsTHMubCxlKTtyZXR1cm4gdGhpcy5zZXRIU0wocyxuLGkpLHRoaXN9c2V0RnJvbVZlY3RvcjModCl7cmV0dXJuIHRoaXMucj10LngsdGhpcy5nPXQueSx0aGlzLmI9dC56LHRoaXN9YXBwbHlNYXRyaXgzKHQpe2NvbnN0IGU9dGhpcy5yLHM9dGhpcy5nLG49dGhpcy5iLGk9dC5lbGVtZW50cztyZXR1cm4gdGhpcy5yPWlbMF0qZStpWzNdKnMraVs2XSpuLHRoaXMuZz1pWzFdKmUraVs0XSpzK2lbN10qbix0aGlzLmI9aVsyXSplK2lbNV0qcytpWzhdKm4sdGhpc31lcXVhbHModCl7cmV0dXJuIHQucj09PXRoaXMuciYmdC5nPT09dGhpcy5nJiZ0LmI9PT10aGlzLmJ9ZnJvbUFycmF5KHQsZT0wKXtyZXR1cm4gdGhpcy5yPXRbZV0sdGhpcy5nPXRbZSsxXSx0aGlzLmI9dFtlKzJdLHRoaXN9dG9BcnJheSh0PVtdLGU9MCl7cmV0dXJuIHRbZV09dGhpcy5yLHRbZSsxXT10aGlzLmcsdFtlKzJdPXRoaXMuYix0fWZyb21CdWZmZXJBdHRyaWJ1dGUodCxlKXtyZXR1cm4gdGhpcy5yPXQuZ2V0WChlKSx0aGlzLmc9dC5nZXRZKGUpLHRoaXMuYj10LmdldFooZSksdGhpc310b0pTT04oKXtyZXR1cm4gdGhpcy5nZXRIZXgoKX0qW1N5bWJvbC5pdGVyYXRvcl0oKXt5aWVsZCB0aGlzLnIseWllbGQgdGhpcy5nLHlpZWxkIHRoaXMuYn19Y29uc3QgY3Q9bmV3IHFuO3FuLk5BTUVTPWdyO2NvbnN0IGo9bmV3IEEsT3M9bmV3IEo7Y2xhc3MgdnR7Y29uc3RydWN0b3IodCxlLHM9ITEpe2lmKEFycmF5LmlzQXJyYXkodCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiVEhSRUUuQnVmZmVyQXR0cmlidXRlOiBhcnJheSBzaG91bGQgYmUgYSBUeXBlZCBBcnJheS4iKTt0aGlzLmlzQnVmZmVyQXR0cmlidXRlPSEwLHRoaXMubmFtZT0iIix0aGlzLmFycmF5PXQsdGhpcy5pdGVtU2l6ZT1lLHRoaXMuY291bnQ9dCE9PXZvaWQgMD90Lmxlbmd0aC9lOjAsdGhpcy5ub3JtYWxpemVkPXMsdGhpcy51c2FnZT1Dcyx0aGlzLnVwZGF0ZVJhbmdlcz1bXSx0aGlzLmdwdVR5cGU9SW8sdGhpcy52ZXJzaW9uPTB9b25VcGxvYWRDYWxsYmFjaygpe31zZXQgbmVlZHNVcGRhdGUodCl7dD09PSEwJiZ0aGlzLnZlcnNpb24rK31zZXRVc2FnZSh0KXtyZXR1cm4gdGhpcy51c2FnZT10LHRoaXN9YWRkVXBkYXRlUmFuZ2UodCxlKXt0aGlzLnVwZGF0ZVJhbmdlcy5wdXNoKHtzdGFydDp0LGNvdW50OmV9KX1jbGVhclVwZGF0ZVJhbmdlcygpe3RoaXMudXBkYXRlUmFuZ2VzLmxlbmd0aD0wfWNvcHkodCl7cmV0dXJuIHRoaXMubmFtZT10Lm5hbWUsdGhpcy5hcnJheT1uZXcgdC5hcnJheS5jb25zdHJ1Y3Rvcih0LmFycmF5KSx0aGlzLml0ZW1TaXplPXQuaXRlbVNpemUsdGhpcy5jb3VudD10LmNvdW50LHRoaXMubm9ybWFsaXplZD10Lm5vcm1hbGl6ZWQsdGhpcy51c2FnZT10LnVzYWdlLHRoaXMuZ3B1VHlwZT10LmdwdVR5cGUsdGhpc31jb3B5QXQodCxlLHMpe3QqPXRoaXMuaXRlbVNpemUscyo9ZS5pdGVtU2l6ZTtmb3IobGV0IG49MCxpPXRoaXMuaXRlbVNpemU7bjxpO24rKyl0aGlzLmFycmF5W3Qrbl09ZS5hcnJheVtzK25dO3JldHVybiB0aGlzfWNvcHlBcnJheSh0KXtyZXR1cm4gdGhpcy5hcnJheS5zZXQodCksdGhpc31hcHBseU1hdHJpeDModCl7aWYodGhpcy5pdGVtU2l6ZT09PTIpZm9yKGxldCBlPTAscz10aGlzLmNvdW50O2U8cztlKyspT3MuZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0aGlzLGUpLE9zLmFwcGx5TWF0cml4Myh0KSx0aGlzLnNldFhZKGUsT3MueCxPcy55KTtlbHNlIGlmKHRoaXMuaXRlbVNpemU9PT0zKWZvcihsZXQgZT0wLHM9dGhpcy5jb3VudDtlPHM7ZSsrKWouZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0aGlzLGUpLGouYXBwbHlNYXRyaXgzKHQpLHRoaXMuc2V0WFlaKGUsai54LGoueSxqLnopO3JldHVybiB0aGlzfWFwcGx5TWF0cml4NCh0KXtmb3IobGV0IGU9MCxzPXRoaXMuY291bnQ7ZTxzO2UrKylqLmZyb21CdWZmZXJBdHRyaWJ1dGUodGhpcyxlKSxqLmFwcGx5TWF0cml4NCh0KSx0aGlzLnNldFhZWihlLGoueCxqLnksai56KTtyZXR1cm4gdGhpc31hcHBseU5vcm1hbE1hdHJpeCh0KXtmb3IobGV0IGU9MCxzPXRoaXMuY291bnQ7ZTxzO2UrKylqLmZyb21CdWZmZXJBdHRyaWJ1dGUodGhpcyxlKSxqLmFwcGx5Tm9ybWFsTWF0cml4KHQpLHRoaXMuc2V0WFlaKGUsai54LGoueSxqLnopO3JldHVybiB0aGlzfXRyYW5zZm9ybURpcmVjdGlvbih0KXtmb3IobGV0IGU9MCxzPXRoaXMuY291bnQ7ZTxzO2UrKylqLmZyb21CdWZmZXJBdHRyaWJ1dGUodGhpcyxlKSxqLnRyYW5zZm9ybURpcmVjdGlvbih0KSx0aGlzLnNldFhZWihlLGoueCxqLnksai56KTtyZXR1cm4gdGhpc31zZXQodCxlPTApe3JldHVybiB0aGlzLmFycmF5LnNldCh0LGUpLHRoaXN9Z2V0Q29tcG9uZW50KHQsZSl7bGV0IHM9dGhpcy5hcnJheVt0KnRoaXMuaXRlbVNpemUrZV07cmV0dXJuIHRoaXMubm9ybWFsaXplZCYmKHM9RXQocyx0aGlzLmFycmF5KSksc31zZXRDb21wb25lbnQodCxlLHMpe3JldHVybiB0aGlzLm5vcm1hbGl6ZWQmJihzPSQocyx0aGlzLmFycmF5KSksdGhpcy5hcnJheVt0KnRoaXMuaXRlbVNpemUrZV09cyx0aGlzfWdldFgodCl7bGV0IGU9dGhpcy5hcnJheVt0KnRoaXMuaXRlbVNpemVdO3JldHVybiB0aGlzLm5vcm1hbGl6ZWQmJihlPUV0KGUsdGhpcy5hcnJheSkpLGV9c2V0WCh0LGUpe3JldHVybiB0aGlzLm5vcm1hbGl6ZWQmJihlPSQoZSx0aGlzLmFycmF5KSksdGhpcy5hcnJheVt0KnRoaXMuaXRlbVNpemVdPWUsdGhpc31nZXRZKHQpe2xldCBlPXRoaXMuYXJyYXlbdCp0aGlzLml0ZW1TaXplKzFdO3JldHVybiB0aGlzLm5vcm1hbGl6ZWQmJihlPUV0KGUsdGhpcy5hcnJheSkpLGV9c2V0WSh0LGUpe3JldHVybiB0aGlzLm5vcm1hbGl6ZWQmJihlPSQoZSx0aGlzLmFycmF5KSksdGhpcy5hcnJheVt0KnRoaXMuaXRlbVNpemUrMV09ZSx0aGlzfWdldFoodCl7bGV0IGU9dGhpcy5hcnJheVt0KnRoaXMuaXRlbVNpemUrMl07cmV0dXJuIHRoaXMubm9ybWFsaXplZCYmKGU9RXQoZSx0aGlzLmFycmF5KSksZX1zZXRaKHQsZSl7cmV0dXJuIHRoaXMubm9ybWFsaXplZCYmKGU9JChlLHRoaXMuYXJyYXkpKSx0aGlzLmFycmF5W3QqdGhpcy5pdGVtU2l6ZSsyXT1lLHRoaXN9Z2V0Vyh0KXtsZXQgZT10aGlzLmFycmF5W3QqdGhpcy5pdGVtU2l6ZSszXTtyZXR1cm4gdGhpcy5ub3JtYWxpemVkJiYoZT1FdChlLHRoaXMuYXJyYXkpKSxlfXNldFcodCxlKXtyZXR1cm4gdGhpcy5ub3JtYWxpemVkJiYoZT0kKGUsdGhpcy5hcnJheSkpLHRoaXMuYXJyYXlbdCp0aGlzLml0ZW1TaXplKzNdPWUsdGhpc31zZXRYWSh0LGUscyl7cmV0dXJuIHQqPXRoaXMuaXRlbVNpemUsdGhpcy5ub3JtYWxpemVkJiYoZT0kKGUsdGhpcy5hcnJheSkscz0kKHMsdGhpcy5hcnJheSkpLHRoaXMuYXJyYXlbdCswXT1lLHRoaXMuYXJyYXlbdCsxXT1zLHRoaXN9c2V0WFlaKHQsZSxzLG4pe3JldHVybiB0Kj10aGlzLml0ZW1TaXplLHRoaXMubm9ybWFsaXplZCYmKGU9JChlLHRoaXMuYXJyYXkpLHM9JChzLHRoaXMuYXJyYXkpLG49JChuLHRoaXMuYXJyYXkpKSx0aGlzLmFycmF5W3QrMF09ZSx0aGlzLmFycmF5W3QrMV09cyx0aGlzLmFycmF5W3QrMl09bix0aGlzfXNldFhZWlcodCxlLHMsbixpKXtyZXR1cm4gdCo9dGhpcy5pdGVtU2l6ZSx0aGlzLm5vcm1hbGl6ZWQmJihlPSQoZSx0aGlzLmFycmF5KSxzPSQocyx0aGlzLmFycmF5KSxuPSQobix0aGlzLmFycmF5KSxpPSQoaSx0aGlzLmFycmF5KSksdGhpcy5hcnJheVt0KzBdPWUsdGhpcy5hcnJheVt0KzFdPXMsdGhpcy5hcnJheVt0KzJdPW4sdGhpcy5hcnJheVt0KzNdPWksdGhpc31vblVwbG9hZCh0KXtyZXR1cm4gdGhpcy5vblVwbG9hZENhbGxiYWNrPXQsdGhpc31jbG9uZSgpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3Rvcih0aGlzLmFycmF5LHRoaXMuaXRlbVNpemUpLmNvcHkodGhpcyl9dG9KU09OKCl7Y29uc3QgdD17aXRlbVNpemU6dGhpcy5pdGVtU2l6ZSx0eXBlOnRoaXMuYXJyYXkuY29uc3RydWN0b3IubmFtZSxhcnJheTpBcnJheS5mcm9tKHRoaXMuYXJyYXkpLG5vcm1hbGl6ZWQ6dGhpcy5ub3JtYWxpemVkfTtyZXR1cm4gdGhpcy5uYW1lIT09IiImJih0Lm5hbWU9dGhpcy5uYW1lKSx0aGlzLnVzYWdlIT09Q3MmJih0LnVzYWdlPXRoaXMudXNhZ2UpLHR9fWNsYXNzIG1hIGV4dGVuZHMgdnR7Y29uc3RydWN0b3IodCxlLHMpe3N1cGVyKG5ldyBVaW50MTZBcnJheSh0KSxlLHMpfX1jbGFzcyB5YSBleHRlbmRzIHZ0e2NvbnN0cnVjdG9yKHQsZSxzKXtzdXBlcihuZXcgVWludDMyQXJyYXkodCksZSxzKX19Y2xhc3MgZ2EgZXh0ZW5kcyB2dHtjb25zdHJ1Y3Rvcih0LGUscyl7c3VwZXIobmV3IEZsb2F0MzJBcnJheSh0KSxlLHMpfX1sZXQgeGE9MDtjb25zdCBBdD1uZXcgbnQsJG49bmV3IG5lLEVlPW5ldyBBLGd0PW5ldyBodCxzcz1uZXcgaHQsaXQ9bmV3IEE7Y2xhc3MgR24gZXh0ZW5kcyBaZXtjb25zdHJ1Y3Rvcigpe3N1cGVyKCksdGhpcy5pc0J1ZmZlckdlb21ldHJ5PSEwLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJpZCIse3ZhbHVlOnhhKyt9KSx0aGlzLnV1aWQ9S3QoKSx0aGlzLm5hbWU9IiIsdGhpcy50eXBlPSJCdWZmZXJHZW9tZXRyeSIsdGhpcy5pbmRleD1udWxsLHRoaXMuYXR0cmlidXRlcz17fSx0aGlzLm1vcnBoQXR0cmlidXRlcz17fSx0aGlzLm1vcnBoVGFyZ2V0c1JlbGF0aXZlPSExLHRoaXMuZ3JvdXBzPVtdLHRoaXMuYm91bmRpbmdCb3g9bnVsbCx0aGlzLmJvdW5kaW5nU3BoZXJlPW51bGwsdGhpcy5kcmF3UmFuZ2U9e3N0YXJ0OjAsY291bnQ6MS8wfSx0aGlzLnVzZXJEYXRhPXt9fWdldEluZGV4KCl7cmV0dXJuIHRoaXMuaW5kZXh9c2V0SW5kZXgodCl7cmV0dXJuIEFycmF5LmlzQXJyYXkodCk/dGhpcy5pbmRleD1uZXcoc2EodCk/eWE6bWEpKHQsMSk6dGhpcy5pbmRleD10LHRoaXN9Z2V0QXR0cmlidXRlKHQpe3JldHVybiB0aGlzLmF0dHJpYnV0ZXNbdF19c2V0QXR0cmlidXRlKHQsZSl7cmV0dXJuIHRoaXMuYXR0cmlidXRlc1t0XT1lLHRoaXN9ZGVsZXRlQXR0cmlidXRlKHQpe3JldHVybiBkZWxldGUgdGhpcy5hdHRyaWJ1dGVzW3RdLHRoaXN9aGFzQXR0cmlidXRlKHQpe3JldHVybiB0aGlzLmF0dHJpYnV0ZXNbdF0hPT12b2lkIDB9YWRkR3JvdXAodCxlLHM9MCl7dGhpcy5ncm91cHMucHVzaCh7c3RhcnQ6dCxjb3VudDplLG1hdGVyaWFsSW5kZXg6c30pfWNsZWFyR3JvdXBzKCl7dGhpcy5ncm91cHM9W119c2V0RHJhd1JhbmdlKHQsZSl7dGhpcy5kcmF3UmFuZ2Uuc3RhcnQ9dCx0aGlzLmRyYXdSYW5nZS5jb3VudD1lfWFwcGx5TWF0cml4NCh0KXtjb25zdCBlPXRoaXMuYXR0cmlidXRlcy5wb3NpdGlvbjtlIT09dm9pZCAwJiYoZS5hcHBseU1hdHJpeDQodCksZS5uZWVkc1VwZGF0ZT0hMCk7Y29uc3Qgcz10aGlzLmF0dHJpYnV0ZXMubm9ybWFsO2lmKHMhPT12b2lkIDApe2NvbnN0IGk9bmV3IEN0KCkuZ2V0Tm9ybWFsTWF0cml4KHQpO3MuYXBwbHlOb3JtYWxNYXRyaXgoaSkscy5uZWVkc1VwZGF0ZT0hMH1jb25zdCBuPXRoaXMuYXR0cmlidXRlcy50YW5nZW50O3JldHVybiBuIT09dm9pZCAwJiYobi50cmFuc2Zvcm1EaXJlY3Rpb24odCksbi5uZWVkc1VwZGF0ZT0hMCksdGhpcy5ib3VuZGluZ0JveCE9PW51bGwmJnRoaXMuY29tcHV0ZUJvdW5kaW5nQm94KCksdGhpcy5ib3VuZGluZ1NwaGVyZSE9PW51bGwmJnRoaXMuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCksdGhpc31hcHBseVF1YXRlcm5pb24odCl7cmV0dXJuIEF0Lm1ha2VSb3RhdGlvbkZyb21RdWF0ZXJuaW9uKHQpLHRoaXMuYXBwbHlNYXRyaXg0KEF0KSx0aGlzfXJvdGF0ZVgodCl7cmV0dXJuIEF0Lm1ha2VSb3RhdGlvblgodCksdGhpcy5hcHBseU1hdHJpeDQoQXQpLHRoaXN9cm90YXRlWSh0KXtyZXR1cm4gQXQubWFrZVJvdGF0aW9uWSh0KSx0aGlzLmFwcGx5TWF0cml4NChBdCksdGhpc31yb3RhdGVaKHQpe3JldHVybiBBdC5tYWtlUm90YXRpb25aKHQpLHRoaXMuYXBwbHlNYXRyaXg0KEF0KSx0aGlzfXRyYW5zbGF0ZSh0LGUscyl7cmV0dXJuIEF0Lm1ha2VUcmFuc2xhdGlvbih0LGUscyksdGhpcy5hcHBseU1hdHJpeDQoQXQpLHRoaXN9c2NhbGUodCxlLHMpe3JldHVybiBBdC5tYWtlU2NhbGUodCxlLHMpLHRoaXMuYXBwbHlNYXRyaXg0KEF0KSx0aGlzfWxvb2tBdCh0KXtyZXR1cm4gJG4ubG9va0F0KHQpLCRuLnVwZGF0ZU1hdHJpeCgpLHRoaXMuYXBwbHlNYXRyaXg0KCRuLm1hdHJpeCksdGhpc31jZW50ZXIoKXtyZXR1cm4gdGhpcy5jb21wdXRlQm91bmRpbmdCb3goKSx0aGlzLmJvdW5kaW5nQm94LmdldENlbnRlcihFZSkubmVnYXRlKCksdGhpcy50cmFuc2xhdGUoRWUueCxFZS55LEVlLnopLHRoaXN9c2V0RnJvbVBvaW50cyh0KXtjb25zdCBlPVtdO2ZvcihsZXQgcz0wLG49dC5sZW5ndGg7czxuO3MrKyl7Y29uc3QgaT10W3NdO2UucHVzaChpLngsaS55LGkuenx8MCl9cmV0dXJuIHRoaXMuc2V0QXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IGdhKGUsMykpLHRoaXN9Y29tcHV0ZUJvdW5kaW5nQm94KCl7dGhpcy5ib3VuZGluZ0JveD09PW51bGwmJih0aGlzLmJvdW5kaW5nQm94PW5ldyBodCk7Y29uc3QgdD10aGlzLmF0dHJpYnV0ZXMucG9zaXRpb24sZT10aGlzLm1vcnBoQXR0cmlidXRlcy5wb3NpdGlvbjtpZih0JiZ0LmlzR0xCdWZmZXJBdHRyaWJ1dGUpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLkJ1ZmZlckdlb21ldHJ5LmNvbXB1dGVCb3VuZGluZ0JveCgpOiBHTEJ1ZmZlckF0dHJpYnV0ZSByZXF1aXJlcyBhIG1hbnVhbCBib3VuZGluZyBib3guIix0aGlzKSx0aGlzLmJvdW5kaW5nQm94LnNldChuZXcgQSgtMS8wLC0xLzAsLTEvMCksbmV3IEEoMS8wLDEvMCwxLzApKTtyZXR1cm59aWYodCE9PXZvaWQgMCl7aWYodGhpcy5ib3VuZGluZ0JveC5zZXRGcm9tQnVmZmVyQXR0cmlidXRlKHQpLGUpZm9yKGxldCBzPTAsbj1lLmxlbmd0aDtzPG47cysrKXtjb25zdCBpPWVbc107Z3Quc2V0RnJvbUJ1ZmZlckF0dHJpYnV0ZShpKSx0aGlzLm1vcnBoVGFyZ2V0c1JlbGF0aXZlPyhpdC5hZGRWZWN0b3JzKHRoaXMuYm91bmRpbmdCb3gubWluLGd0Lm1pbiksdGhpcy5ib3VuZGluZ0JveC5leHBhbmRCeVBvaW50KGl0KSxpdC5hZGRWZWN0b3JzKHRoaXMuYm91bmRpbmdCb3gubWF4LGd0Lm1heCksdGhpcy5ib3VuZGluZ0JveC5leHBhbmRCeVBvaW50KGl0KSk6KHRoaXMuYm91bmRpbmdCb3guZXhwYW5kQnlQb2ludChndC5taW4pLHRoaXMuYm91bmRpbmdCb3guZXhwYW5kQnlQb2ludChndC5tYXgpKX19ZWxzZSB0aGlzLmJvdW5kaW5nQm94Lm1ha2VFbXB0eSgpOyhpc05hTih0aGlzLmJvdW5kaW5nQm94Lm1pbi54KXx8aXNOYU4odGhpcy5ib3VuZGluZ0JveC5taW4ueSl8fGlzTmFOKHRoaXMuYm91bmRpbmdCb3gubWluLnopKSYmY29uc29sZS5lcnJvcignVEhSRUUuQnVmZmVyR2VvbWV0cnkuY29tcHV0ZUJvdW5kaW5nQm94KCk6IENvbXB1dGVkIG1pbi9tYXggaGF2ZSBOYU4gdmFsdWVzLiBUaGUgInBvc2l0aW9uIiBhdHRyaWJ1dGUgaXMgbGlrZWx5IHRvIGhhdmUgTmFOIHZhbHVlcy4nLHRoaXMpfWNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpe3RoaXMuYm91bmRpbmdTcGhlcmU9PT1udWxsJiYodGhpcy5ib3VuZGluZ1NwaGVyZT1uZXcgY3IpO2NvbnN0IHQ9dGhpcy5hdHRyaWJ1dGVzLnBvc2l0aW9uLGU9dGhpcy5tb3JwaEF0dHJpYnV0ZXMucG9zaXRpb247aWYodCYmdC5pc0dMQnVmZmVyQXR0cmlidXRlKXtjb25zb2xlLmVycm9yKCJUSFJFRS5CdWZmZXJHZW9tZXRyeS5jb21wdXRlQm91bmRpbmdTcGhlcmUoKTogR0xCdWZmZXJBdHRyaWJ1dGUgcmVxdWlyZXMgYSBtYW51YWwgYm91bmRpbmcgc3BoZXJlLiIsdGhpcyksdGhpcy5ib3VuZGluZ1NwaGVyZS5zZXQobmV3IEEsMS8wKTtyZXR1cm59aWYodCl7Y29uc3Qgcz10aGlzLmJvdW5kaW5nU3BoZXJlLmNlbnRlcjtpZihndC5zZXRGcm9tQnVmZmVyQXR0cmlidXRlKHQpLGUpZm9yKGxldCBpPTAsbz1lLmxlbmd0aDtpPG87aSsrKXtjb25zdCBhPWVbaV07c3Muc2V0RnJvbUJ1ZmZlckF0dHJpYnV0ZShhKSx0aGlzLm1vcnBoVGFyZ2V0c1JlbGF0aXZlPyhpdC5hZGRWZWN0b3JzKGd0Lm1pbixzcy5taW4pLGd0LmV4cGFuZEJ5UG9pbnQoaXQpLGl0LmFkZFZlY3RvcnMoZ3QubWF4LHNzLm1heCksZ3QuZXhwYW5kQnlQb2ludChpdCkpOihndC5leHBhbmRCeVBvaW50KHNzLm1pbiksZ3QuZXhwYW5kQnlQb2ludChzcy5tYXgpKX1ndC5nZXRDZW50ZXIocyk7bGV0IG49MDtmb3IobGV0IGk9MCxvPXQuY291bnQ7aTxvO2krKylpdC5mcm9tQnVmZmVyQXR0cmlidXRlKHQsaSksbj1NYXRoLm1heChuLHMuZGlzdGFuY2VUb1NxdWFyZWQoaXQpKTtpZihlKWZvcihsZXQgaT0wLG89ZS5sZW5ndGg7aTxvO2krKyl7Y29uc3QgYT1lW2ldLGM9dGhpcy5tb3JwaFRhcmdldHNSZWxhdGl2ZTtmb3IobGV0IHU9MCxoPWEuY291bnQ7dTxoO3UrKylpdC5mcm9tQnVmZmVyQXR0cmlidXRlKGEsdSksYyYmKEVlLmZyb21CdWZmZXJBdHRyaWJ1dGUodCx1KSxpdC5hZGQoRWUpKSxuPU1hdGgubWF4KG4scy5kaXN0YW5jZVRvU3F1YXJlZChpdCkpfXRoaXMuYm91bmRpbmdTcGhlcmUucmFkaXVzPU1hdGguc3FydChuKSxpc05hTih0aGlzLmJvdW5kaW5nU3BoZXJlLnJhZGl1cykmJmNvbnNvbGUuZXJyb3IoJ1RIUkVFLkJ1ZmZlckdlb21ldHJ5LmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpOiBDb21wdXRlZCByYWRpdXMgaXMgTmFOLiBUaGUgInBvc2l0aW9uIiBhdHRyaWJ1dGUgaXMgbGlrZWx5IHRvIGhhdmUgTmFOIHZhbHVlcy4nLHRoaXMpfX1jb21wdXRlVGFuZ2VudHMoKXtjb25zdCB0PXRoaXMuaW5kZXgsZT10aGlzLmF0dHJpYnV0ZXM7aWYodD09PW51bGx8fGUucG9zaXRpb249PT12b2lkIDB8fGUubm9ybWFsPT09dm9pZCAwfHxlLnV2PT09dm9pZCAwKXtjb25zb2xlLmVycm9yKCJUSFJFRS5CdWZmZXJHZW9tZXRyeTogLmNvbXB1dGVUYW5nZW50cygpIGZhaWxlZC4gTWlzc2luZyByZXF1aXJlZCBhdHRyaWJ1dGVzIChpbmRleCwgcG9zaXRpb24sIG5vcm1hbCBvciB1dikiKTtyZXR1cm59Y29uc3Qgcz1lLnBvc2l0aW9uLG49ZS5ub3JtYWwsaT1lLnV2O3RoaXMuaGFzQXR0cmlidXRlKCJ0YW5nZW50Iik9PT0hMSYmdGhpcy5zZXRBdHRyaWJ1dGUoInRhbmdlbnQiLG5ldyB2dChuZXcgRmxvYXQzMkFycmF5KDQqcy5jb3VudCksNCkpO2NvbnN0IG89dGhpcy5nZXRBdHRyaWJ1dGUoInRhbmdlbnQiKSxhPVtdLGM9W107Zm9yKGxldCBFPTA7RTxzLmNvdW50O0UrKylhW0VdPW5ldyBBLGNbRV09bmV3IEE7Y29uc3QgdT1uZXcgQSxoPW5ldyBBLGw9bmV3IEEsZD1uZXcgSixmPW5ldyBKLHA9bmV3IEosbT1uZXcgQSxnPW5ldyBBO2Z1bmN0aW9uIHkoRSxGLFIpe3UuZnJvbUJ1ZmZlckF0dHJpYnV0ZShzLEUpLGguZnJvbUJ1ZmZlckF0dHJpYnV0ZShzLEYpLGwuZnJvbUJ1ZmZlckF0dHJpYnV0ZShzLFIpLGQuZnJvbUJ1ZmZlckF0dHJpYnV0ZShpLEUpLGYuZnJvbUJ1ZmZlckF0dHJpYnV0ZShpLEYpLHAuZnJvbUJ1ZmZlckF0dHJpYnV0ZShpLFIpLGguc3ViKHUpLGwuc3ViKHUpLGYuc3ViKGQpLHAuc3ViKGQpO2NvbnN0IEk9MS8oZi54KnAueS1wLngqZi55KTtpc0Zpbml0ZShJKSYmKG0uY29weShoKS5tdWx0aXBseVNjYWxhcihwLnkpLmFkZFNjYWxlZFZlY3RvcihsLC1mLnkpLm11bHRpcGx5U2NhbGFyKEkpLGcuY29weShsKS5tdWx0aXBseVNjYWxhcihmLngpLmFkZFNjYWxlZFZlY3RvcihoLC1wLngpLm11bHRpcGx5U2NhbGFyKEkpLGFbRV0uYWRkKG0pLGFbRl0uYWRkKG0pLGFbUl0uYWRkKG0pLGNbRV0uYWRkKGcpLGNbRl0uYWRkKGcpLGNbUl0uYWRkKGcpKX1sZXQgVD10aGlzLmdyb3VwcztULmxlbmd0aD09PTAmJihUPVt7c3RhcnQ6MCxjb3VudDp0LmNvdW50fV0pO2ZvcihsZXQgRT0wLEY9VC5sZW5ndGg7RTxGOysrRSl7Y29uc3QgUj1UW0VdLEk9Ui5zdGFydCxCPVIuY291bnQ7Zm9yKGxldCBQPUksTD1JK0I7UDxMO1ArPTMpeSh0LmdldFgoUCswKSx0LmdldFgoUCsxKSx0LmdldFgoUCsyKSl9Y29uc3Qgdz1uZXcgQSxNPW5ldyBBLE49bmV3IEEsXz1uZXcgQTtmdW5jdGlvbiBTKEUpe04uZnJvbUJ1ZmZlckF0dHJpYnV0ZShuLEUpLF8uY29weShOKTtjb25zdCBGPWFbRV07dy5jb3B5KEYpLHcuc3ViKE4ubXVsdGlwbHlTY2FsYXIoTi5kb3QoRikpKS5ub3JtYWxpemUoKSxNLmNyb3NzVmVjdG9ycyhfLEYpO2NvbnN0IEk9TS5kb3QoY1tFXSk8MD8tMToxO28uc2V0WFlaVyhFLHcueCx3Lnksdy56LEkpfWZvcihsZXQgRT0wLEY9VC5sZW5ndGg7RTxGOysrRSl7Y29uc3QgUj1UW0VdLEk9Ui5zdGFydCxCPVIuY291bnQ7Zm9yKGxldCBQPUksTD1JK0I7UDxMO1ArPTMpUyh0LmdldFgoUCswKSksUyh0LmdldFgoUCsxKSksUyh0LmdldFgoUCsyKSl9fWNvbXB1dGVWZXJ0ZXhOb3JtYWxzKCl7Y29uc3QgdD10aGlzLmluZGV4LGU9dGhpcy5nZXRBdHRyaWJ1dGUoInBvc2l0aW9uIik7aWYoZSE9PXZvaWQgMCl7bGV0IHM9dGhpcy5nZXRBdHRyaWJ1dGUoIm5vcm1hbCIpO2lmKHM9PT12b2lkIDApcz1uZXcgdnQobmV3IEZsb2F0MzJBcnJheShlLmNvdW50KjMpLDMpLHRoaXMuc2V0QXR0cmlidXRlKCJub3JtYWwiLHMpO2Vsc2UgZm9yKGxldCBkPTAsZj1zLmNvdW50O2Q8ZjtkKyspcy5zZXRYWVooZCwwLDAsMCk7Y29uc3Qgbj1uZXcgQSxpPW5ldyBBLG89bmV3IEEsYT1uZXcgQSxjPW5ldyBBLHU9bmV3IEEsaD1uZXcgQSxsPW5ldyBBO2lmKHQpZm9yKGxldCBkPTAsZj10LmNvdW50O2Q8ZjtkKz0zKXtjb25zdCBwPXQuZ2V0WChkKzApLG09dC5nZXRYKGQrMSksZz10LmdldFgoZCsyKTtuLmZyb21CdWZmZXJBdHRyaWJ1dGUoZSxwKSxpLmZyb21CdWZmZXJBdHRyaWJ1dGUoZSxtKSxvLmZyb21CdWZmZXJBdHRyaWJ1dGUoZSxnKSxoLnN1YlZlY3RvcnMobyxpKSxsLnN1YlZlY3RvcnMobixpKSxoLmNyb3NzKGwpLGEuZnJvbUJ1ZmZlckF0dHJpYnV0ZShzLHApLGMuZnJvbUJ1ZmZlckF0dHJpYnV0ZShzLG0pLHUuZnJvbUJ1ZmZlckF0dHJpYnV0ZShzLGcpLGEuYWRkKGgpLGMuYWRkKGgpLHUuYWRkKGgpLHMuc2V0WFlaKHAsYS54LGEueSxhLnopLHMuc2V0WFlaKG0sYy54LGMueSxjLnopLHMuc2V0WFlaKGcsdS54LHUueSx1LnopfWVsc2UgZm9yKGxldCBkPTAsZj1lLmNvdW50O2Q8ZjtkKz0zKW4uZnJvbUJ1ZmZlckF0dHJpYnV0ZShlLGQrMCksaS5mcm9tQnVmZmVyQXR0cmlidXRlKGUsZCsxKSxvLmZyb21CdWZmZXJBdHRyaWJ1dGUoZSxkKzIpLGguc3ViVmVjdG9ycyhvLGkpLGwuc3ViVmVjdG9ycyhuLGkpLGguY3Jvc3MobCkscy5zZXRYWVooZCswLGgueCxoLnksaC56KSxzLnNldFhZWihkKzEsaC54LGgueSxoLnopLHMuc2V0WFlaKGQrMixoLngsaC55LGgueik7dGhpcy5ub3JtYWxpemVOb3JtYWxzKCkscy5uZWVkc1VwZGF0ZT0hMH19bm9ybWFsaXplTm9ybWFscygpe2NvbnN0IHQ9dGhpcy5hdHRyaWJ1dGVzLm5vcm1hbDtmb3IobGV0IGU9MCxzPXQuY291bnQ7ZTxzO2UrKylpdC5mcm9tQnVmZmVyQXR0cmlidXRlKHQsZSksaXQubm9ybWFsaXplKCksdC5zZXRYWVooZSxpdC54LGl0LnksaXQueil9dG9Ob25JbmRleGVkKCl7ZnVuY3Rpb24gdChhLGMpe2NvbnN0IHU9YS5hcnJheSxoPWEuaXRlbVNpemUsbD1hLm5vcm1hbGl6ZWQsZD1uZXcgdS5jb25zdHJ1Y3RvcihjLmxlbmd0aCpoKTtsZXQgZj0wLHA9MDtmb3IobGV0IG09MCxnPWMubGVuZ3RoO208ZzttKyspe2EuaXNJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZT9mPWNbbV0qYS5kYXRhLnN0cmlkZSthLm9mZnNldDpmPWNbbV0qaDtmb3IobGV0IHk9MDt5PGg7eSsrKWRbcCsrXT11W2YrK119cmV0dXJuIG5ldyB2dChkLGgsbCl9aWYodGhpcy5pbmRleD09PW51bGwpcmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuQnVmZmVyR2VvbWV0cnkudG9Ob25JbmRleGVkKCk6IEJ1ZmZlckdlb21ldHJ5IGlzIGFscmVhZHkgbm9uLWluZGV4ZWQuIiksdGhpcztjb25zdCBlPW5ldyBHbixzPXRoaXMuaW5kZXguYXJyYXksbj10aGlzLmF0dHJpYnV0ZXM7Zm9yKGNvbnN0IGEgaW4gbil7Y29uc3QgYz1uW2FdLHU9dChjLHMpO2Uuc2V0QXR0cmlidXRlKGEsdSl9Y29uc3QgaT10aGlzLm1vcnBoQXR0cmlidXRlcztmb3IoY29uc3QgYSBpbiBpKXtjb25zdCBjPVtdLHU9aVthXTtmb3IobGV0IGg9MCxsPXUubGVuZ3RoO2g8bDtoKyspe2NvbnN0IGQ9dVtoXSxmPXQoZCxzKTtjLnB1c2goZil9ZS5tb3JwaEF0dHJpYnV0ZXNbYV09Y31lLm1vcnBoVGFyZ2V0c1JlbGF0aXZlPXRoaXMubW9ycGhUYXJnZXRzUmVsYXRpdmU7Y29uc3Qgbz10aGlzLmdyb3Vwcztmb3IobGV0IGE9MCxjPW8ubGVuZ3RoO2E8YzthKyspe2NvbnN0IHU9b1thXTtlLmFkZEdyb3VwKHUuc3RhcnQsdS5jb3VudCx1Lm1hdGVyaWFsSW5kZXgpfXJldHVybiBlfXRvSlNPTigpe2NvbnN0IHQ9e21ldGFkYXRhOnt2ZXJzaW9uOjQuNix0eXBlOiJCdWZmZXJHZW9tZXRyeSIsZ2VuZXJhdG9yOiJCdWZmZXJHZW9tZXRyeS50b0pTT04ifX07aWYodC51dWlkPXRoaXMudXVpZCx0LnR5cGU9dGhpcy50eXBlLHRoaXMubmFtZSE9PSIiJiYodC5uYW1lPXRoaXMubmFtZSksT2JqZWN0LmtleXModGhpcy51c2VyRGF0YSkubGVuZ3RoPjAmJih0LnVzZXJEYXRhPXRoaXMudXNlckRhdGEpLHRoaXMucGFyYW1ldGVycyE9PXZvaWQgMCl7Y29uc3QgYz10aGlzLnBhcmFtZXRlcnM7Zm9yKGNvbnN0IHUgaW4gYyljW3VdIT09dm9pZCAwJiYodFt1XT1jW3VdKTtyZXR1cm4gdH10LmRhdGE9e2F0dHJpYnV0ZXM6e319O2NvbnN0IGU9dGhpcy5pbmRleDtlIT09bnVsbCYmKHQuZGF0YS5pbmRleD17dHlwZTplLmFycmF5LmNvbnN0cnVjdG9yLm5hbWUsYXJyYXk6QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZS5hcnJheSl9KTtjb25zdCBzPXRoaXMuYXR0cmlidXRlcztmb3IoY29uc3QgYyBpbiBzKXtjb25zdCB1PXNbY107dC5kYXRhLmF0dHJpYnV0ZXNbY109dS50b0pTT04odC5kYXRhKX1jb25zdCBuPXt9O2xldCBpPSExO2Zvcihjb25zdCBjIGluIHRoaXMubW9ycGhBdHRyaWJ1dGVzKXtjb25zdCB1PXRoaXMubW9ycGhBdHRyaWJ1dGVzW2NdLGg9W107Zm9yKGxldCBsPTAsZD11Lmxlbmd0aDtsPGQ7bCsrKXtjb25zdCBmPXVbbF07aC5wdXNoKGYudG9KU09OKHQuZGF0YSkpfWgubGVuZ3RoPjAmJihuW2NdPWgsaT0hMCl9aSYmKHQuZGF0YS5tb3JwaEF0dHJpYnV0ZXM9bix0LmRhdGEubW9ycGhUYXJnZXRzUmVsYXRpdmU9dGhpcy5tb3JwaFRhcmdldHNSZWxhdGl2ZSk7Y29uc3Qgbz10aGlzLmdyb3VwcztvLmxlbmd0aD4wJiYodC5kYXRhLmdyb3Vwcz1KU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KG8pKSk7Y29uc3QgYT10aGlzLmJvdW5kaW5nU3BoZXJlO3JldHVybiBhIT09bnVsbCYmKHQuZGF0YS5ib3VuZGluZ1NwaGVyZT17Y2VudGVyOmEuY2VudGVyLnRvQXJyYXkoKSxyYWRpdXM6YS5yYWRpdXN9KSx0fWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSh0aGlzKX1jb3B5KHQpe3RoaXMuaW5kZXg9bnVsbCx0aGlzLmF0dHJpYnV0ZXM9e30sdGhpcy5tb3JwaEF0dHJpYnV0ZXM9e30sdGhpcy5ncm91cHM9W10sdGhpcy5ib3VuZGluZ0JveD1udWxsLHRoaXMuYm91bmRpbmdTcGhlcmU9bnVsbDtjb25zdCBlPXt9O3RoaXMubmFtZT10Lm5hbWU7Y29uc3Qgcz10LmluZGV4O3MhPT1udWxsJiZ0aGlzLnNldEluZGV4KHMuY2xvbmUoZSkpO2NvbnN0IG49dC5hdHRyaWJ1dGVzO2Zvcihjb25zdCB1IGluIG4pe2NvbnN0IGg9blt1XTt0aGlzLnNldEF0dHJpYnV0ZSh1LGguY2xvbmUoZSkpfWNvbnN0IGk9dC5tb3JwaEF0dHJpYnV0ZXM7Zm9yKGNvbnN0IHUgaW4gaSl7Y29uc3QgaD1bXSxsPWlbdV07Zm9yKGxldCBkPTAsZj1sLmxlbmd0aDtkPGY7ZCsrKWgucHVzaChsW2RdLmNsb25lKGUpKTt0aGlzLm1vcnBoQXR0cmlidXRlc1t1XT1ofXRoaXMubW9ycGhUYXJnZXRzUmVsYXRpdmU9dC5tb3JwaFRhcmdldHNSZWxhdGl2ZTtjb25zdCBvPXQuZ3JvdXBzO2ZvcihsZXQgdT0wLGg9by5sZW5ndGg7dTxoO3UrKyl7Y29uc3QgbD1vW3VdO3RoaXMuYWRkR3JvdXAobC5zdGFydCxsLmNvdW50LGwubWF0ZXJpYWxJbmRleCl9Y29uc3QgYT10LmJvdW5kaW5nQm94O2EhPT1udWxsJiYodGhpcy5ib3VuZGluZ0JveD1hLmNsb25lKCkpO2NvbnN0IGM9dC5ib3VuZGluZ1NwaGVyZTtyZXR1cm4gYyE9PW51bGwmJih0aGlzLmJvdW5kaW5nU3BoZXJlPWMuY2xvbmUoKSksdGhpcy5kcmF3UmFuZ2Uuc3RhcnQ9dC5kcmF3UmFuZ2Uuc3RhcnQsdGhpcy5kcmF3UmFuZ2UuY291bnQ9dC5kcmF3UmFuZ2UuY291bnQsdGhpcy51c2VyRGF0YT10LnVzZXJEYXRhLHRoaXN9ZGlzcG9zZSgpe3RoaXMuZGlzcGF0Y2hFdmVudCh7dHlwZToiZGlzcG9zZSJ9KX19Y29uc3QgV249bmV3IEEsVGE9bmV3IEEsTmE9bmV3IEN0O2NsYXNzIFhue2NvbnN0cnVjdG9yKHQ9bmV3IEEoMSwwLDApLGU9MCl7dGhpcy5pc1BsYW5lPSEwLHRoaXMubm9ybWFsPXQsdGhpcy5jb25zdGFudD1lfXNldCh0LGUpe3JldHVybiB0aGlzLm5vcm1hbC5jb3B5KHQpLHRoaXMuY29uc3RhbnQ9ZSx0aGlzfXNldENvbXBvbmVudHModCxlLHMsbil7cmV0dXJuIHRoaXMubm9ybWFsLnNldCh0LGUscyksdGhpcy5jb25zdGFudD1uLHRoaXN9c2V0RnJvbU5vcm1hbEFuZENvcGxhbmFyUG9pbnQodCxlKXtyZXR1cm4gdGhpcy5ub3JtYWwuY29weSh0KSx0aGlzLmNvbnN0YW50PS1lLmRvdCh0aGlzLm5vcm1hbCksdGhpc31zZXRGcm9tQ29wbGFuYXJQb2ludHModCxlLHMpe2NvbnN0IG49V24uc3ViVmVjdG9ycyhzLGUpLmNyb3NzKFRhLnN1YlZlY3RvcnModCxlKSkubm9ybWFsaXplKCk7cmV0dXJuIHRoaXMuc2V0RnJvbU5vcm1hbEFuZENvcGxhbmFyUG9pbnQobix0KSx0aGlzfWNvcHkodCl7cmV0dXJuIHRoaXMubm9ybWFsLmNvcHkodC5ub3JtYWwpLHRoaXMuY29uc3RhbnQ9dC5jb25zdGFudCx0aGlzfW5vcm1hbGl6ZSgpe2NvbnN0IHQ9MS90aGlzLm5vcm1hbC5sZW5ndGgoKTtyZXR1cm4gdGhpcy5ub3JtYWwubXVsdGlwbHlTY2FsYXIodCksdGhpcy5jb25zdGFudCo9dCx0aGlzfW5lZ2F0ZSgpe3JldHVybiB0aGlzLmNvbnN0YW50Kj0tMSx0aGlzLm5vcm1hbC5uZWdhdGUoKSx0aGlzfWRpc3RhbmNlVG9Qb2ludCh0KXtyZXR1cm4gdGhpcy5ub3JtYWwuZG90KHQpK3RoaXMuY29uc3RhbnR9ZGlzdGFuY2VUb1NwaGVyZSh0KXtyZXR1cm4gdGhpcy5kaXN0YW5jZVRvUG9pbnQodC5jZW50ZXIpLXQucmFkaXVzfXByb2plY3RQb2ludCh0LGUpe3JldHVybiBlLmNvcHkodCkuYWRkU2NhbGVkVmVjdG9yKHRoaXMubm9ybWFsLC10aGlzLmRpc3RhbmNlVG9Qb2ludCh0KSl9aW50ZXJzZWN0TGluZSh0LGUpe2NvbnN0IHM9dC5kZWx0YShXbiksbj10aGlzLm5vcm1hbC5kb3Qocyk7aWYobj09PTApcmV0dXJuIHRoaXMuZGlzdGFuY2VUb1BvaW50KHQuc3RhcnQpPT09MD9lLmNvcHkodC5zdGFydCk6bnVsbDtjb25zdCBpPS0odC5zdGFydC5kb3QodGhpcy5ub3JtYWwpK3RoaXMuY29uc3RhbnQpL247cmV0dXJuIGk8MHx8aT4xP251bGw6ZS5jb3B5KHQuc3RhcnQpLmFkZFNjYWxlZFZlY3RvcihzLGkpfWludGVyc2VjdHNMaW5lKHQpe2NvbnN0IGU9dGhpcy5kaXN0YW5jZVRvUG9pbnQodC5zdGFydCkscz10aGlzLmRpc3RhbmNlVG9Qb2ludCh0LmVuZCk7cmV0dXJuIGU8MCYmcz4wfHxzPDAmJmU+MH1pbnRlcnNlY3RzQm94KHQpe3JldHVybiB0LmludGVyc2VjdHNQbGFuZSh0aGlzKX1pbnRlcnNlY3RzU3BoZXJlKHQpe3JldHVybiB0LmludGVyc2VjdHNQbGFuZSh0aGlzKX1jb3BsYW5hclBvaW50KHQpe3JldHVybiB0LmNvcHkodGhpcy5ub3JtYWwpLm11bHRpcGx5U2NhbGFyKC10aGlzLmNvbnN0YW50KX1hcHBseU1hdHJpeDQodCxlKXtjb25zdCBzPWV8fE5hLmdldE5vcm1hbE1hdHJpeCh0KSxuPXRoaXMuY29wbGFuYXJQb2ludChXbikuYXBwbHlNYXRyaXg0KHQpLGk9dGhpcy5ub3JtYWwuYXBwbHlNYXRyaXgzKHMpLm5vcm1hbGl6ZSgpO3JldHVybiB0aGlzLmNvbnN0YW50PS1uLmRvdChpKSx0aGlzfXRyYW5zbGF0ZSh0KXtyZXR1cm4gdGhpcy5jb25zdGFudC09dC5kb3QodGhpcy5ub3JtYWwpLHRoaXN9ZXF1YWxzKHQpe3JldHVybiB0Lm5vcm1hbC5lcXVhbHModGhpcy5ub3JtYWwpJiZ0LmNvbnN0YW50PT09dGhpcy5jb25zdGFudH1jbG9uZSgpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkodGhpcyl9fWNsYXNzIHhyIGV4dGVuZHMgRHR7Y29uc3RydWN0b3IodCxlLHMsbixpLG8sYSxjLHUsaD1Tbil7aWYoaCE9PVNuJiZoIT09WGkpdGhyb3cgbmV3IEVycm9yKCJEZXB0aFRleHR1cmUgZm9ybWF0IG11c3QgYmUgZWl0aGVyIFRIUkVFLkRlcHRoRm9ybWF0IG9yIFRIUkVFLkRlcHRoU3RlbmNpbEZvcm1hdCIpO3M9PT12b2lkIDAmJmg9PT1TbiYmKHM9V2kpLHM9PT12b2lkIDAmJmg9PT1YaSYmKHM9UG8pLHN1cGVyKG51bGwsbixpLG8sYSxjLGgscyx1KSx0aGlzLmlzRGVwdGhUZXh0dXJlPSEwLHRoaXMuaW1hZ2U9e3dpZHRoOnQsaGVpZ2h0OmV9LHRoaXMubWFnRmlsdGVyPWEhPT12b2lkIDA/YTp6cyx0aGlzLm1pbkZpbHRlcj1jIT09dm9pZCAwP2M6enMsdGhpcy5mbGlwWT0hMSx0aGlzLmdlbmVyYXRlTWlwbWFwcz0hMSx0aGlzLmNvbXBhcmVGdW5jdGlvbj1udWxsfWNvcHkodCl7cmV0dXJuIHN1cGVyLmNvcHkodCksdGhpcy5jb21wYXJlRnVuY3Rpb249dC5jb21wYXJlRnVuY3Rpb24sdGhpc310b0pTT04odCl7Y29uc3QgZT1zdXBlci50b0pTT04odCk7cmV0dXJuIHRoaXMuY29tcGFyZUZ1bmN0aW9uIT09bnVsbCYmKGUuY29tcGFyZUZ1bmN0aW9uPXRoaXMuY29tcGFyZUZ1bmN0aW9uKSxlfX1jbGFzcyB3YXtjb25zdHJ1Y3Rvcih0LGUpe3RoaXMuaXNJbnRlcmxlYXZlZEJ1ZmZlcj0hMCx0aGlzLmFycmF5PXQsdGhpcy5zdHJpZGU9ZSx0aGlzLmNvdW50PXQhPT12b2lkIDA/dC5sZW5ndGgvZTowLHRoaXMudXNhZ2U9Q3MsdGhpcy51cGRhdGVSYW5nZXM9W10sdGhpcy52ZXJzaW9uPTAsdGhpcy51dWlkPUt0KCl9b25VcGxvYWRDYWxsYmFjaygpe31zZXQgbmVlZHNVcGRhdGUodCl7dD09PSEwJiZ0aGlzLnZlcnNpb24rK31zZXRVc2FnZSh0KXtyZXR1cm4gdGhpcy51c2FnZT10LHRoaXN9YWRkVXBkYXRlUmFuZ2UodCxlKXt0aGlzLnVwZGF0ZVJhbmdlcy5wdXNoKHtzdGFydDp0LGNvdW50OmV9KX1jbGVhclVwZGF0ZVJhbmdlcygpe3RoaXMudXBkYXRlUmFuZ2VzLmxlbmd0aD0wfWNvcHkodCl7cmV0dXJuIHRoaXMuYXJyYXk9bmV3IHQuYXJyYXkuY29uc3RydWN0b3IodC5hcnJheSksdGhpcy5jb3VudD10LmNvdW50LHRoaXMuc3RyaWRlPXQuc3RyaWRlLHRoaXMudXNhZ2U9dC51c2FnZSx0aGlzfWNvcHlBdCh0LGUscyl7dCo9dGhpcy5zdHJpZGUscyo9ZS5zdHJpZGU7Zm9yKGxldCBuPTAsaT10aGlzLnN0cmlkZTtuPGk7bisrKXRoaXMuYXJyYXlbdCtuXT1lLmFycmF5W3Mrbl07cmV0dXJuIHRoaXN9c2V0KHQsZT0wKXtyZXR1cm4gdGhpcy5hcnJheS5zZXQodCxlKSx0aGlzfWNsb25lKHQpe3QuYXJyYXlCdWZmZXJzPT09dm9pZCAwJiYodC5hcnJheUJ1ZmZlcnM9e30pLHRoaXMuYXJyYXkuYnVmZmVyLl91dWlkPT09dm9pZCAwJiYodGhpcy5hcnJheS5idWZmZXIuX3V1aWQ9S3QoKSksdC5hcnJheUJ1ZmZlcnNbdGhpcy5hcnJheS5idWZmZXIuX3V1aWRdPT09dm9pZCAwJiYodC5hcnJheUJ1ZmZlcnNbdGhpcy5hcnJheS5idWZmZXIuX3V1aWRdPXRoaXMuYXJyYXkuc2xpY2UoMCkuYnVmZmVyKTtjb25zdCBlPW5ldyB0aGlzLmFycmF5LmNvbnN0cnVjdG9yKHQuYXJyYXlCdWZmZXJzW3RoaXMuYXJyYXkuYnVmZmVyLl91dWlkXSkscz1uZXcgdGhpcy5jb25zdHJ1Y3RvcihlLHRoaXMuc3RyaWRlKTtyZXR1cm4gcy5zZXRVc2FnZSh0aGlzLnVzYWdlKSxzfW9uVXBsb2FkKHQpe3JldHVybiB0aGlzLm9uVXBsb2FkQ2FsbGJhY2s9dCx0aGlzfXRvSlNPTih0KXtyZXR1cm4gdC5hcnJheUJ1ZmZlcnM9PT12b2lkIDAmJih0LmFycmF5QnVmZmVycz17fSksdGhpcy5hcnJheS5idWZmZXIuX3V1aWQ9PT12b2lkIDAmJih0aGlzLmFycmF5LmJ1ZmZlci5fdXVpZD1LdCgpKSx0LmFycmF5QnVmZmVyc1t0aGlzLmFycmF5LmJ1ZmZlci5fdXVpZF09PT12b2lkIDAmJih0LmFycmF5QnVmZmVyc1t0aGlzLmFycmF5LmJ1ZmZlci5fdXVpZF09QXJyYXkuZnJvbShuZXcgVWludDMyQXJyYXkodGhpcy5hcnJheS5idWZmZXIpKSkse3V1aWQ6dGhpcy51dWlkLGJ1ZmZlcjp0aGlzLmFycmF5LmJ1ZmZlci5fdXVpZCx0eXBlOnRoaXMuYXJyYXkuY29uc3RydWN0b3IubmFtZSxzdHJpZGU6dGhpcy5zdHJpZGV9fX1jb25zdCB1dD1uZXcgQTtjbGFzcyBZbntjb25zdHJ1Y3Rvcih0LGUscyxuPSExKXt0aGlzLmlzSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGU9ITAsdGhpcy5uYW1lPSIiLHRoaXMuZGF0YT10LHRoaXMuaXRlbVNpemU9ZSx0aGlzLm9mZnNldD1zLHRoaXMubm9ybWFsaXplZD1ufWdldCBjb3VudCgpe3JldHVybiB0aGlzLmRhdGEuY291bnR9Z2V0IGFycmF5KCl7cmV0dXJuIHRoaXMuZGF0YS5hcnJheX1zZXQgbmVlZHNVcGRhdGUodCl7dGhpcy5kYXRhLm5lZWRzVXBkYXRlPXR9YXBwbHlNYXRyaXg0KHQpe2ZvcihsZXQgZT0wLHM9dGhpcy5kYXRhLmNvdW50O2U8cztlKyspdXQuZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0aGlzLGUpLHV0LmFwcGx5TWF0cml4NCh0KSx0aGlzLnNldFhZWihlLHV0LngsdXQueSx1dC56KTtyZXR1cm4gdGhpc31hcHBseU5vcm1hbE1hdHJpeCh0KXtmb3IobGV0IGU9MCxzPXRoaXMuY291bnQ7ZTxzO2UrKyl1dC5mcm9tQnVmZmVyQXR0cmlidXRlKHRoaXMsZSksdXQuYXBwbHlOb3JtYWxNYXRyaXgodCksdGhpcy5zZXRYWVooZSx1dC54LHV0LnksdXQueik7cmV0dXJuIHRoaXN9dHJhbnNmb3JtRGlyZWN0aW9uKHQpe2ZvcihsZXQgZT0wLHM9dGhpcy5jb3VudDtlPHM7ZSsrKXV0LmZyb21CdWZmZXJBdHRyaWJ1dGUodGhpcyxlKSx1dC50cmFuc2Zvcm1EaXJlY3Rpb24odCksdGhpcy5zZXRYWVooZSx1dC54LHV0LnksdXQueik7cmV0dXJuIHRoaXN9Z2V0Q29tcG9uZW50KHQsZSl7bGV0IHM9dGhpcy5hcnJheVt0KnRoaXMuZGF0YS5zdHJpZGUrdGhpcy5vZmZzZXQrZV07cmV0dXJuIHRoaXMubm9ybWFsaXplZCYmKHM9RXQocyx0aGlzLmFycmF5KSksc31zZXRDb21wb25lbnQodCxlLHMpe3JldHVybiB0aGlzLm5vcm1hbGl6ZWQmJihzPSQocyx0aGlzLmFycmF5KSksdGhpcy5kYXRhLmFycmF5W3QqdGhpcy5kYXRhLnN0cmlkZSt0aGlzLm9mZnNldCtlXT1zLHRoaXN9c2V0WCh0LGUpe3JldHVybiB0aGlzLm5vcm1hbGl6ZWQmJihlPSQoZSx0aGlzLmFycmF5KSksdGhpcy5kYXRhLmFycmF5W3QqdGhpcy5kYXRhLnN0cmlkZSt0aGlzLm9mZnNldF09ZSx0aGlzfXNldFkodCxlKXtyZXR1cm4gdGhpcy5ub3JtYWxpemVkJiYoZT0kKGUsdGhpcy5hcnJheSkpLHRoaXMuZGF0YS5hcnJheVt0KnRoaXMuZGF0YS5zdHJpZGUrdGhpcy5vZmZzZXQrMV09ZSx0aGlzfXNldFoodCxlKXtyZXR1cm4gdGhpcy5ub3JtYWxpemVkJiYoZT0kKGUsdGhpcy5hcnJheSkpLHRoaXMuZGF0YS5hcnJheVt0KnRoaXMuZGF0YS5zdHJpZGUrdGhpcy5vZmZzZXQrMl09ZSx0aGlzfXNldFcodCxlKXtyZXR1cm4gdGhpcy5ub3JtYWxpemVkJiYoZT0kKGUsdGhpcy5hcnJheSkpLHRoaXMuZGF0YS5hcnJheVt0KnRoaXMuZGF0YS5zdHJpZGUrdGhpcy5vZmZzZXQrM109ZSx0aGlzfWdldFgodCl7bGV0IGU9dGhpcy5kYXRhLmFycmF5W3QqdGhpcy5kYXRhLnN0cmlkZSt0aGlzLm9mZnNldF07cmV0dXJuIHRoaXMubm9ybWFsaXplZCYmKGU9RXQoZSx0aGlzLmFycmF5KSksZX1nZXRZKHQpe2xldCBlPXRoaXMuZGF0YS5hcnJheVt0KnRoaXMuZGF0YS5zdHJpZGUrdGhpcy5vZmZzZXQrMV07cmV0dXJuIHRoaXMubm9ybWFsaXplZCYmKGU9RXQoZSx0aGlzLmFycmF5KSksZX1nZXRaKHQpe2xldCBlPXRoaXMuZGF0YS5hcnJheVt0KnRoaXMuZGF0YS5zdHJpZGUrdGhpcy5vZmZzZXQrMl07cmV0dXJuIHRoaXMubm9ybWFsaXplZCYmKGU9RXQoZSx0aGlzLmFycmF5KSksZX1nZXRXKHQpe2xldCBlPXRoaXMuZGF0YS5hcnJheVt0KnRoaXMuZGF0YS5zdHJpZGUrdGhpcy5vZmZzZXQrM107cmV0dXJuIHRoaXMubm9ybWFsaXplZCYmKGU9RXQoZSx0aGlzLmFycmF5KSksZX1zZXRYWSh0LGUscyl7cmV0dXJuIHQ9dCp0aGlzLmRhdGEuc3RyaWRlK3RoaXMub2Zmc2V0LHRoaXMubm9ybWFsaXplZCYmKGU9JChlLHRoaXMuYXJyYXkpLHM9JChzLHRoaXMuYXJyYXkpKSx0aGlzLmRhdGEuYXJyYXlbdCswXT1lLHRoaXMuZGF0YS5hcnJheVt0KzFdPXMsdGhpc31zZXRYWVoodCxlLHMsbil7cmV0dXJuIHQ9dCp0aGlzLmRhdGEuc3RyaWRlK3RoaXMub2Zmc2V0LHRoaXMubm9ybWFsaXplZCYmKGU9JChlLHRoaXMuYXJyYXkpLHM9JChzLHRoaXMuYXJyYXkpLG49JChuLHRoaXMuYXJyYXkpKSx0aGlzLmRhdGEuYXJyYXlbdCswXT1lLHRoaXMuZGF0YS5hcnJheVt0KzFdPXMsdGhpcy5kYXRhLmFycmF5W3QrMl09bix0aGlzfXNldFhZWlcodCxlLHMsbixpKXtyZXR1cm4gdD10KnRoaXMuZGF0YS5zdHJpZGUrdGhpcy5vZmZzZXQsdGhpcy5ub3JtYWxpemVkJiYoZT0kKGUsdGhpcy5hcnJheSkscz0kKHMsdGhpcy5hcnJheSksbj0kKG4sdGhpcy5hcnJheSksaT0kKGksdGhpcy5hcnJheSkpLHRoaXMuZGF0YS5hcnJheVt0KzBdPWUsdGhpcy5kYXRhLmFycmF5W3QrMV09cyx0aGlzLmRhdGEuYXJyYXlbdCsyXT1uLHRoaXMuZGF0YS5hcnJheVt0KzNdPWksdGhpc31jbG9uZSh0KXtpZih0PT09dm9pZCAwKXtjb25zb2xlLmxvZygiVEhSRUUuSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUuY2xvbmUoKTogQ2xvbmluZyBhbiBpbnRlcmxlYXZlZCBidWZmZXIgYXR0cmlidXRlIHdpbGwgZGUtaW50ZXJsZWF2ZSBidWZmZXIgZGF0YS4iKTtjb25zdCBlPVtdO2ZvcihsZXQgcz0wO3M8dGhpcy5jb3VudDtzKyspe2NvbnN0IG49cyp0aGlzLmRhdGEuc3RyaWRlK3RoaXMub2Zmc2V0O2ZvcihsZXQgaT0wO2k8dGhpcy5pdGVtU2l6ZTtpKyspZS5wdXNoKHRoaXMuZGF0YS5hcnJheVtuK2ldKX1yZXR1cm4gbmV3IHZ0KG5ldyB0aGlzLmFycmF5LmNvbnN0cnVjdG9yKGUpLHRoaXMuaXRlbVNpemUsdGhpcy5ub3JtYWxpemVkKX1lbHNlIHJldHVybiB0LmludGVybGVhdmVkQnVmZmVycz09PXZvaWQgMCYmKHQuaW50ZXJsZWF2ZWRCdWZmZXJzPXt9KSx0LmludGVybGVhdmVkQnVmZmVyc1t0aGlzLmRhdGEudXVpZF09PT12b2lkIDAmJih0LmludGVybGVhdmVkQnVmZmVyc1t0aGlzLmRhdGEudXVpZF09dGhpcy5kYXRhLmNsb25lKHQpKSxuZXcgWW4odC5pbnRlcmxlYXZlZEJ1ZmZlcnNbdGhpcy5kYXRhLnV1aWRdLHRoaXMuaXRlbVNpemUsdGhpcy5vZmZzZXQsdGhpcy5ub3JtYWxpemVkKX10b0pTT04odCl7aWYodD09PXZvaWQgMCl7Y29uc29sZS5sb2coIlRIUkVFLkludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlLnRvSlNPTigpOiBTZXJpYWxpemluZyBhbiBpbnRlcmxlYXZlZCBidWZmZXIgYXR0cmlidXRlIHdpbGwgZGUtaW50ZXJsZWF2ZSBidWZmZXIgZGF0YS4iKTtjb25zdCBlPVtdO2ZvcihsZXQgcz0wO3M8dGhpcy5jb3VudDtzKyspe2NvbnN0IG49cyp0aGlzLmRhdGEuc3RyaWRlK3RoaXMub2Zmc2V0O2ZvcihsZXQgaT0wO2k8dGhpcy5pdGVtU2l6ZTtpKyspZS5wdXNoKHRoaXMuZGF0YS5hcnJheVtuK2ldKX1yZXR1cm57aXRlbVNpemU6dGhpcy5pdGVtU2l6ZSx0eXBlOnRoaXMuYXJyYXkuY29uc3RydWN0b3IubmFtZSxhcnJheTplLG5vcm1hbGl6ZWQ6dGhpcy5ub3JtYWxpemVkfX1lbHNlIHJldHVybiB0LmludGVybGVhdmVkQnVmZmVycz09PXZvaWQgMCYmKHQuaW50ZXJsZWF2ZWRCdWZmZXJzPXt9KSx0LmludGVybGVhdmVkQnVmZmVyc1t0aGlzLmRhdGEudXVpZF09PT12b2lkIDAmJih0LmludGVybGVhdmVkQnVmZmVyc1t0aGlzLmRhdGEudXVpZF09dGhpcy5kYXRhLnRvSlNPTih0KSkse2lzSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGU6ITAsaXRlbVNpemU6dGhpcy5pdGVtU2l6ZSxkYXRhOnRoaXMuZGF0YS51dWlkLG9mZnNldDp0aGlzLm9mZnNldCxub3JtYWxpemVkOnRoaXMubm9ybWFsaXplZH19fWNsYXNzIEFhIGV4dGVuZHMgRHR7Y29uc3RydWN0b3IodCxlKXtzdXBlcih7d2lkdGg6dCxoZWlnaHQ6ZX0pLHRoaXMuaXNGcmFtZWJ1ZmZlclRleHR1cmU9ITAsdGhpcy5tYWdGaWx0ZXI9enMsdGhpcy5taW5GaWx0ZXI9enMsdGhpcy5nZW5lcmF0ZU1pcG1hcHM9ITEsdGhpcy5uZWVkc1VwZGF0ZT0hMH19Y29uc3QgVHI9bmV3IEEsRHM9bmV3IEE7Y2xhc3MgWnR7Y29uc3RydWN0b3IodD1uZXcgQSxlPW5ldyBBKXt0aGlzLnN0YXJ0PXQsdGhpcy5lbmQ9ZX1zZXQodCxlKXtyZXR1cm4gdGhpcy5zdGFydC5jb3B5KHQpLHRoaXMuZW5kLmNvcHkoZSksdGhpc31jb3B5KHQpe3JldHVybiB0aGlzLnN0YXJ0LmNvcHkodC5zdGFydCksdGhpcy5lbmQuY29weSh0LmVuZCksdGhpc31nZXRDZW50ZXIodCl7cmV0dXJuIHQuYWRkVmVjdG9ycyh0aGlzLnN0YXJ0LHRoaXMuZW5kKS5tdWx0aXBseVNjYWxhciguNSl9ZGVsdGEodCl7cmV0dXJuIHQuc3ViVmVjdG9ycyh0aGlzLmVuZCx0aGlzLnN0YXJ0KX1kaXN0YW5jZVNxKCl7cmV0dXJuIHRoaXMuc3RhcnQuZGlzdGFuY2VUb1NxdWFyZWQodGhpcy5lbmQpfWRpc3RhbmNlKCl7cmV0dXJuIHRoaXMuc3RhcnQuZGlzdGFuY2VUbyh0aGlzLmVuZCl9YXQodCxlKXtyZXR1cm4gdGhpcy5kZWx0YShlKS5tdWx0aXBseVNjYWxhcih0KS5hZGQodGhpcy5zdGFydCl9Y2xvc2VzdFBvaW50VG9Qb2ludFBhcmFtZXRlcih0LGUpe1RyLnN1YlZlY3RvcnModCx0aGlzLnN0YXJ0KSxEcy5zdWJWZWN0b3JzKHRoaXMuZW5kLHRoaXMuc3RhcnQpO2NvbnN0IHM9RHMuZG90KERzKTtsZXQgaT1Ecy5kb3QoVHIpL3M7cmV0dXJuIGUmJihpPWF0KGksMCwxKSksaX1jbG9zZXN0UG9pbnRUb1BvaW50KHQsZSxzKXtjb25zdCBuPXRoaXMuY2xvc2VzdFBvaW50VG9Qb2ludFBhcmFtZXRlcih0LGUpO3JldHVybiB0aGlzLmRlbHRhKHMpLm11bHRpcGx5U2NhbGFyKG4pLmFkZCh0aGlzLnN0YXJ0KX1hcHBseU1hdHJpeDQodCl7cmV0dXJuIHRoaXMuc3RhcnQuYXBwbHlNYXRyaXg0KHQpLHRoaXMuZW5kLmFwcGx5TWF0cml4NCh0KSx0aGlzfWVxdWFscyh0KXtyZXR1cm4gdC5zdGFydC5lcXVhbHModGhpcy5zdGFydCkmJnQuZW5kLmVxdWFscyh0aGlzLmVuZCl9Y2xvbmUoKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KHRoaXMpfX1mdW5jdGlvbiBabihyLHQ9MCl7bGV0IGU9MzczNTkyODU1OV50LHM9MTEwMzU0Nzk5MV50O2lmKHIgaW5zdGFuY2VvZiBBcnJheSlmb3IobGV0IG49MCxpO248ci5sZW5ndGg7bisrKWk9cltuXSxlPU1hdGguaW11bChlXmksMjY1NDQzNTc2MSkscz1NYXRoLmltdWwoc15pLDE1OTczMzQ2NzcpO2Vsc2UgZm9yKGxldCBuPTAsaTtuPHIubGVuZ3RoO24rKylpPXIuY2hhckNvZGVBdChuKSxlPU1hdGguaW11bChlXmksMjY1NDQzNTc2MSkscz1NYXRoLmltdWwoc15pLDE1OTczMzQ2NzcpO3JldHVybiBlPU1hdGguaW11bChlXmU+Pj4xNiwyMjQ2ODIyNTA3KSxlXj1NYXRoLmltdWwoc15zPj4+MTMsMzI2NjQ4OTkwOSkscz1NYXRoLmltdWwoc15zPj4+MTYsMjI0NjgyMjUwNyksc149TWF0aC5pbXVsKGVeZT4+PjEzLDMyNjY0ODk5MDkpLDQyOTQ5NjcyOTYqKDIwOTcxNTEmcykrKGU+Pj4wKX1jb25zdCBNYT0oLi4ucik9PlpuKHIpO2Z1bmN0aW9uIFNhKHIsdD0hMSl7Y29uc3QgZT1bXTtyLmlzTm9kZT09PSEwJiYoZS5wdXNoKHIuaWQpLHI9ci5nZXRTZWxmKCkpO2Zvcihjb25zdHtwcm9wZXJ0eTpzLGNoaWxkTm9kZTpufW9mIEpuKHIpKWUucHVzaChlLFpuKHMuc2xpY2UoMCwtNCkpLG4uZ2V0Q2FjaGVLZXkodCkpO3JldHVybiBabihlKX1mdW5jdGlvbipKbihyLHQ9ITEpe2Zvcihjb25zdCBlIGluIHIpe2lmKGUuc3RhcnRzV2l0aCgiXyIpPT09ITApY29udGludWU7Y29uc3Qgcz1yW2VdO2lmKEFycmF5LmlzQXJyYXkocyk9PT0hMClmb3IobGV0IG49MDtuPHMubGVuZ3RoO24rKyl7Y29uc3QgaT1zW25dO2kmJihpLmlzTm9kZT09PSEwfHx0JiZ0eXBlb2YgaS50b0pTT049PSJmdW5jdGlvbiIpJiYoeWllbGR7cHJvcGVydHk6ZSxpbmRleDpuLGNoaWxkTm9kZTppfSl9ZWxzZSBpZihzJiZzLmlzTm9kZT09PSEwKXlpZWxke3Byb3BlcnR5OmUsY2hpbGROb2RlOnN9O2Vsc2UgaWYodHlwZW9mIHM9PSJvYmplY3QiKWZvcihjb25zdCBuIGluIHMpe2NvbnN0IGk9c1tuXTtpJiYoaS5pc05vZGU9PT0hMHx8dCYmdHlwZW9mIGkudG9KU09OPT0iZnVuY3Rpb24iKSYmKHlpZWxke3Byb3BlcnR5OmUsaW5kZXg6bixjaGlsZE5vZGU6aX0pfX19ZnVuY3Rpb24gVnMocil7aWYocj09bnVsbClyZXR1cm4gbnVsbDtjb25zdCB0PXR5cGVvZiByO3JldHVybiByLmlzTm9kZT09PSEwPyJub2RlIjp0PT09Im51bWJlciI/ImZsb2F0Ijp0PT09ImJvb2xlYW4iPyJib29sIjp0PT09InN0cmluZyI/InN0cmluZyI6dD09PSJmdW5jdGlvbiI/InNoYWRlciI6ci5pc1ZlY3RvcjI9PT0hMD8idmVjMiI6ci5pc1ZlY3RvcjM9PT0hMD8idmVjMyI6ci5pc1ZlY3RvcjQ9PT0hMD8idmVjNCI6ci5pc01hdHJpeDM9PT0hMD8ibWF0MyI6ci5pc01hdHJpeDQ9PT0hMD8ibWF0NCI6ci5pc0NvbG9yPT09ITA/ImNvbG9yIjpyIGluc3RhbmNlb2YgQXJyYXlCdWZmZXI/IkFycmF5QnVmZmVyIjpudWxsfWZ1bmN0aW9uIE5yKHIsLi4udCl7Y29uc3QgZT1yP3Iuc2xpY2UoLTQpOnZvaWQgMDtyZXR1cm4gdC5sZW5ndGg9PT0xJiYoZT09PSJ2ZWMyIj90PVt0WzBdLHRbMF1dOmU9PT0idmVjMyI/dD1bdFswXSx0WzBdLHRbMF1dOmU9PT0idmVjNCImJih0PVt0WzBdLHRbMF0sdFswXSx0WzBdXSkpLHI9PT0iY29sb3IiP25ldyBxbiguLi50KTplPT09InZlYzIiP25ldyBKKC4uLnQpOmU9PT0idmVjMyI/bmV3IEEoLi4udCk6ZT09PSJ2ZWM0Ij9uZXcgRnQoLi4udCk6ZT09PSJtYXQzIj9uZXcgQ3QoLi4udCk6ZT09PSJtYXQ0Ij9uZXcgbnQoLi4udCk6cj09PSJib29sIj90WzBdfHwhMTpyPT09ImZsb2F0Inx8cj09PSJpbnQifHxyPT09InVpbnQiP3RbMF18fDA6cj09PSJzdHJpbmciP3RbMF18fCIiOnI9PT0iQXJyYXlCdWZmZXIiP3phKHRbMF0pOm51bGx9ZnVuY3Rpb24gX2Eocil7bGV0IHQ9IiI7Y29uc3QgZT1uZXcgVWludDhBcnJheShyKTtmb3IobGV0IHM9MDtzPGUubGVuZ3RoO3MrKyl0Kz1TdHJpbmcuZnJvbUNoYXJDb2RlKGVbc10pO3JldHVybiBidG9hKHQpfWZ1bmN0aW9uIHphKHIpe3JldHVybiBVaW50OEFycmF5LmZyb20oYXRvYihyKSx0PT50LmNoYXJDb2RlQXQoMCkpLmJ1ZmZlcn1jb25zdCB3cj17VkVSVEVYOiJ2ZXJ0ZXgiLEZSQUdNRU5UOiJmcmFnbWVudCJ9LFE9e05PTkU6Im5vbmUiLEZSQU1FOiJmcmFtZSIsUkVOREVSOiJyZW5kZXIiLE9CSkVDVDoib2JqZWN0In0sbnM9WyJ4IiwieSIsInoiLCJ3Il07bGV0IGJhPTA7Y2xhc3MgVSBleHRlbmRzIFple3N0YXRpYyBnZXQgdHlwZSgpe3JldHVybiJOb2RlIn1jb25zdHJ1Y3Rvcih0PW51bGwpe3N1cGVyKCksdGhpcy5ub2RlVHlwZT10LHRoaXMudXBkYXRlVHlwZT1RLk5PTkUsdGhpcy51cGRhdGVCZWZvcmVUeXBlPVEuTk9ORSx0aGlzLnVwZGF0ZUFmdGVyVHlwZT1RLk5PTkUsdGhpcy51dWlkPWVhLmdlbmVyYXRlVVVJRCgpLHRoaXMudmVyc2lvbj0wLHRoaXMuX2NhY2hlS2V5PW51bGwsdGhpcy5fY2FjaGVLZXlWZXJzaW9uPTAsdGhpcy5nbG9iYWw9ITEsdGhpcy5pc05vZGU9ITAsT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImlkIix7dmFsdWU6YmErK30pfXNldCBuZWVkc1VwZGF0ZSh0KXt0PT09ITAmJnRoaXMudmVyc2lvbisrfWdldCB0eXBlKCl7cmV0dXJuIHRoaXMuY29uc3RydWN0b3IudHlwZX1vblVwZGF0ZSh0LGUpe3JldHVybiB0aGlzLnVwZGF0ZVR5cGU9ZSx0aGlzLnVwZGF0ZT10LmJpbmQodGhpcy5nZXRTZWxmKCkpLHRoaXN9b25GcmFtZVVwZGF0ZSh0KXtyZXR1cm4gdGhpcy5vblVwZGF0ZSh0LFEuRlJBTUUpfW9uUmVuZGVyVXBkYXRlKHQpe3JldHVybiB0aGlzLm9uVXBkYXRlKHQsUS5SRU5ERVIpfW9uT2JqZWN0VXBkYXRlKHQpe3JldHVybiB0aGlzLm9uVXBkYXRlKHQsUS5PQkpFQ1QpfW9uUmVmZXJlbmNlKHQpe3JldHVybiB0aGlzLnVwZGF0ZVJlZmVyZW5jZT10LmJpbmQodGhpcy5nZXRTZWxmKCkpLHRoaXN9Z2V0U2VsZigpe3JldHVybiB0aGlzLnNlbGZ8fHRoaXN9dXBkYXRlUmVmZXJlbmNlKCl7cmV0dXJuIHRoaXN9aXNHbG9iYWwoKXtyZXR1cm4gdGhpcy5nbG9iYWx9KmdldENoaWxkcmVuKCl7Zm9yKGNvbnN0e2NoaWxkTm9kZTp0fW9mIEpuKHRoaXMpKXlpZWxkIHR9ZGlzcG9zZSgpe3RoaXMuZGlzcGF0Y2hFdmVudCh7dHlwZToiZGlzcG9zZSJ9KX10cmF2ZXJzZSh0KXt0KHRoaXMpO2Zvcihjb25zdCBlIG9mIHRoaXMuZ2V0Q2hpbGRyZW4oKSllLnRyYXZlcnNlKHQpfWdldENhY2hlS2V5KHQ9ITEpe3JldHVybiB0PXR8fHRoaXMudmVyc2lvbiE9PXRoaXMuX2NhY2hlS2V5VmVyc2lvbiwodD09PSEwfHx0aGlzLl9jYWNoZUtleT09PW51bGwpJiYodGhpcy5fY2FjaGVLZXk9U2EodGhpcyx0KSx0aGlzLl9jYWNoZUtleVZlcnNpb249dGhpcy52ZXJzaW9uKSx0aGlzLl9jYWNoZUtleX1nZXRTY29wZSgpe3JldHVybiB0aGlzfWdldEhhc2goKXtyZXR1cm4gdGhpcy51dWlkfWdldFVwZGF0ZVR5cGUoKXtyZXR1cm4gdGhpcy51cGRhdGVUeXBlfWdldFVwZGF0ZUJlZm9yZVR5cGUoKXtyZXR1cm4gdGhpcy51cGRhdGVCZWZvcmVUeXBlfWdldFVwZGF0ZUFmdGVyVHlwZSgpe3JldHVybiB0aGlzLnVwZGF0ZUFmdGVyVHlwZX1nZXRFbGVtZW50VHlwZSh0KXtjb25zdCBlPXRoaXMuZ2V0Tm9kZVR5cGUodCk7cmV0dXJuIHQuZ2V0RWxlbWVudFR5cGUoZSl9Z2V0Tm9kZVR5cGUodCl7Y29uc3QgZT10LmdldE5vZGVQcm9wZXJ0aWVzKHRoaXMpO3JldHVybiBlLm91dHB1dE5vZGU/ZS5vdXRwdXROb2RlLmdldE5vZGVUeXBlKHQpOnRoaXMubm9kZVR5cGV9Z2V0U2hhcmVkKHQpe2NvbnN0IGU9dGhpcy5nZXRIYXNoKHQpO3JldHVybiB0LmdldE5vZGVGcm9tSGFzaChlKXx8dGhpc31zZXR1cCh0KXtjb25zdCBlPXQuZ2V0Tm9kZVByb3BlcnRpZXModGhpcyk7bGV0IHM9MDtmb3IoY29uc3QgbiBvZiB0aGlzLmdldENoaWxkcmVuKCkpZVsibm9kZSIrcysrXT1uO3JldHVybiBudWxsfWFuYWx5emUodCl7aWYodC5pbmNyZWFzZVVzYWdlKHRoaXMpPT09MSl7Y29uc3Qgcz10LmdldE5vZGVQcm9wZXJ0aWVzKHRoaXMpO2Zvcihjb25zdCBuIG9mIE9iamVjdC52YWx1ZXMocykpbiYmbi5pc05vZGU9PT0hMCYmbi5idWlsZCh0KX19Z2VuZXJhdGUodCxlKXtjb25zdHtvdXRwdXROb2RlOnN9PXQuZ2V0Tm9kZVByb3BlcnRpZXModGhpcyk7aWYocyYmcy5pc05vZGU9PT0hMClyZXR1cm4gcy5idWlsZCh0LGUpfXVwZGF0ZUJlZm9yZSgpe2NvbnNvbGUud2FybigiQWJzdHJhY3QgZnVuY3Rpb24uIil9dXBkYXRlQWZ0ZXIoKXtjb25zb2xlLndhcm4oIkFic3RyYWN0IGZ1bmN0aW9uLiIpfXVwZGF0ZSgpe2NvbnNvbGUud2FybigiQWJzdHJhY3QgZnVuY3Rpb24uIil9YnVpbGQodCxlPW51bGwpe2NvbnN0IHM9dGhpcy5nZXRTaGFyZWQodCk7aWYodGhpcyE9PXMpcmV0dXJuIHMuYnVpbGQodCxlKTt0LmFkZE5vZGUodGhpcyksdC5hZGRDaGFpbih0aGlzKTtsZXQgbj1udWxsO2NvbnN0IGk9dC5nZXRCdWlsZFN0YWdlKCk7aWYoaT09PSJzZXR1cCIpe3RoaXMudXBkYXRlUmVmZXJlbmNlKHQpO2NvbnN0IG89dC5nZXROb2RlUHJvcGVydGllcyh0aGlzKTtpZihvLmluaXRpYWxpemVkIT09ITApe2NvbnN0IGE9dC5zdGFjay5ub2Rlcy5sZW5ndGg7by5pbml0aWFsaXplZD0hMCxvLm91dHB1dE5vZGU9dGhpcy5zZXR1cCh0KSxvLm91dHB1dE5vZGUhPT1udWxsJiZ0LnN0YWNrLm5vZGVzLmxlbmd0aDtmb3IoY29uc3QgYyBvZiBPYmplY3QudmFsdWVzKG8pKWMmJmMuaXNOb2RlPT09ITAmJmMuYnVpbGQodCl9fWVsc2UgaWYoaT09PSJhbmFseXplIil0aGlzLmFuYWx5emUodCk7ZWxzZSBpZihpPT09ImdlbmVyYXRlIilpZih0aGlzLmdlbmVyYXRlLmxlbmd0aD09PTEpe2NvbnN0IGE9dGhpcy5nZXROb2RlVHlwZSh0KSxjPXQuZ2V0RGF0YUZyb21Ob2RlKHRoaXMpO249Yy5zbmlwcGV0LG49PT12b2lkIDA/KG49dGhpcy5nZW5lcmF0ZSh0KXx8IiIsYy5zbmlwcGV0PW4pOmMuZmxvd0NvZGVzIT09dm9pZCAwJiZ0LmNvbnRleHQubm9kZUJsb2NrIT09dm9pZCAwJiZ0LmFkZEZsb3dDb2RlSGllcmFyY2h5KHRoaXMsdC5jb250ZXh0Lm5vZGVCbG9jayksbj10LmZvcm1hdChuLGEsZSl9ZWxzZSBuPXRoaXMuZ2VuZXJhdGUodCxlKXx8IiI7cmV0dXJuIHQucmVtb3ZlQ2hhaW4odGhpcyksbn1nZXRTZXJpYWxpemVDaGlsZHJlbigpe3JldHVybiBKbih0aGlzKX1zZXJpYWxpemUodCl7Y29uc3QgZT10aGlzLmdldFNlcmlhbGl6ZUNoaWxkcmVuKCkscz17fTtmb3IoY29uc3R7cHJvcGVydHk6bixpbmRleDppLGNoaWxkTm9kZTpvfW9mIGUpaSE9PXZvaWQgMD8oc1tuXT09PXZvaWQgMCYmKHNbbl09TnVtYmVyLmlzSW50ZWdlcihpKT9bXTp7fSksc1tuXVtpXT1vLnRvSlNPTih0Lm1ldGEpLnV1aWQpOnNbbl09by50b0pTT04odC5tZXRhKS51dWlkO09iamVjdC5rZXlzKHMpLmxlbmd0aD4wJiYodC5pbnB1dE5vZGVzPXMpfWRlc2VyaWFsaXplKHQpe2lmKHQuaW5wdXROb2RlcyE9PXZvaWQgMCl7Y29uc3QgZT10Lm1ldGEubm9kZXM7Zm9yKGNvbnN0IHMgaW4gdC5pbnB1dE5vZGVzKWlmKEFycmF5LmlzQXJyYXkodC5pbnB1dE5vZGVzW3NdKSl7Y29uc3Qgbj1bXTtmb3IoY29uc3QgaSBvZiB0LmlucHV0Tm9kZXNbc10pbi5wdXNoKGVbaV0pO3RoaXNbc109bn1lbHNlIGlmKHR5cGVvZiB0LmlucHV0Tm9kZXNbc109PSJvYmplY3QiKXtjb25zdCBuPXt9O2Zvcihjb25zdCBpIGluIHQuaW5wdXROb2Rlc1tzXSl7Y29uc3Qgbz10LmlucHV0Tm9kZXNbc11baV07bltpXT1lW29dfXRoaXNbc109bn1lbHNle2NvbnN0IG49dC5pbnB1dE5vZGVzW3NdO3RoaXNbc109ZVtuXX19fXRvSlNPTih0KXtjb25zdHt1dWlkOmUsdHlwZTpzfT10aGlzLG49dD09PXZvaWQgMHx8dHlwZW9mIHQ9PSJzdHJpbmciO24mJih0PXt0ZXh0dXJlczp7fSxpbWFnZXM6e30sbm9kZXM6e319KTtsZXQgaT10Lm5vZGVzW2VdO2k9PT12b2lkIDAmJihpPXt1dWlkOmUsdHlwZTpzLG1ldGE6dCxtZXRhZGF0YTp7dmVyc2lvbjo0LjYsdHlwZToiTm9kZSIsZ2VuZXJhdG9yOiJOb2RlLnRvSlNPTiJ9fSxuIT09ITAmJih0Lm5vZGVzW2kudXVpZF09aSksdGhpcy5zZXJpYWxpemUoaSksZGVsZXRlIGkubWV0YSk7ZnVuY3Rpb24gbyhhKXtjb25zdCBjPVtdO2Zvcihjb25zdCB1IGluIGEpe2NvbnN0IGg9YVt1XTtkZWxldGUgaC5tZXRhZGF0YSxjLnB1c2goaCl9cmV0dXJuIGN9aWYobil7Y29uc3QgYT1vKHQudGV4dHVyZXMpLGM9byh0LmltYWdlcyksdT1vKHQubm9kZXMpO2EubGVuZ3RoPjAmJihpLnRleHR1cmVzPWEpLGMubGVuZ3RoPjAmJihpLmltYWdlcz1jKSx1Lmxlbmd0aD4wJiYoaS5ub2Rlcz11KX1yZXR1cm4gaX19Y2xhc3MgaXMgZXh0ZW5kcyBVe3N0YXRpYyBnZXQgdHlwZSgpe3JldHVybiJBcnJheUVsZW1lbnROb2RlIn1jb25zdHJ1Y3Rvcih0LGUpe3N1cGVyKCksdGhpcy5ub2RlPXQsdGhpcy5pbmRleE5vZGU9ZSx0aGlzLmlzQXJyYXlFbGVtZW50Tm9kZT0hMH1nZXROb2RlVHlwZSh0KXtyZXR1cm4gdGhpcy5ub2RlLmdldEVsZW1lbnRUeXBlKHQpfWdlbmVyYXRlKHQpe2NvbnN0IGU9dGhpcy5ub2RlLmJ1aWxkKHQpLHM9dGhpcy5pbmRleE5vZGUuYnVpbGQodCwidWludCIpO3JldHVybmAke2V9WyAke3N9IF1gfX1jbGFzcyBBciBleHRlbmRzIFV7c3RhdGljIGdldCB0eXBlKCl7cmV0dXJuIkNvbnZlcnROb2RlIn1jb25zdHJ1Y3Rvcih0LGUpe3N1cGVyKCksdGhpcy5ub2RlPXQsdGhpcy5jb252ZXJ0VG89ZX1nZXROb2RlVHlwZSh0KXtjb25zdCBlPXRoaXMubm9kZS5nZXROb2RlVHlwZSh0KTtsZXQgcz1udWxsO2Zvcihjb25zdCBuIG9mIHRoaXMuY29udmVydFRvLnNwbGl0KCJ8IikpKHM9PT1udWxsfHx0LmdldFR5cGVMZW5ndGgoZSk9PT10LmdldFR5cGVMZW5ndGgobikpJiYocz1uKTtyZXR1cm4gc31zZXJpYWxpemUodCl7c3VwZXIuc2VyaWFsaXplKHQpLHQuY29udmVydFRvPXRoaXMuY29udmVydFRvfWRlc2VyaWFsaXplKHQpe3N1cGVyLmRlc2VyaWFsaXplKHQpLHRoaXMuY29udmVydFRvPXQuY29udmVydFRvfWdlbmVyYXRlKHQsZSl7Y29uc3Qgcz10aGlzLm5vZGUsbj10aGlzLmdldE5vZGVUeXBlKHQpLGk9cy5idWlsZCh0LG4pO3JldHVybiB0LmZvcm1hdChpLG4sZSl9fWNsYXNzIGR0IGV4dGVuZHMgVXtzdGF0aWMgZ2V0IHR5cGUoKXtyZXR1cm4iVGVtcE5vZGUifWNvbnN0cnVjdG9yKHQpe3N1cGVyKHQpLHRoaXMuaXNUZW1wTm9kZT0hMH1oYXNEZXBlbmRlbmNpZXModCl7cmV0dXJuIHQuZ2V0RGF0YUZyb21Ob2RlKHRoaXMpLnVzYWdlQ291bnQ+MX1idWlsZCh0LGUpe2lmKHQuZ2V0QnVpbGRTdGFnZSgpPT09ImdlbmVyYXRlIil7Y29uc3Qgbj10LmdldFZlY3RvclR5cGUodGhpcy5nZXROb2RlVHlwZSh0LGUpKSxpPXQuZ2V0RGF0YUZyb21Ob2RlKHRoaXMpO2lmKGkucHJvcGVydHlOYW1lIT09dm9pZCAwKXJldHVybiB0LmZvcm1hdChpLnByb3BlcnR5TmFtZSxuLGUpO2lmKG4hPT0idm9pZCImJmUhPT0idm9pZCImJnRoaXMuaGFzRGVwZW5kZW5jaWVzKHQpKXtjb25zdCBvPXN1cGVyLmJ1aWxkKHQsbiksYT10LmdldFZhckZyb21Ob2RlKHRoaXMsbnVsbCxuKSxjPXQuZ2V0UHJvcGVydHlOYW1lKGEpO3JldHVybiB0LmFkZExpbmVGbG93Q29kZShgJHtjfSA9ICR7b31gLHRoaXMpLGkuc25pcHBldD1vLGkucHJvcGVydHlOYW1lPWMsdC5mb3JtYXQoaS5wcm9wZXJ0eU5hbWUsbixlKX19cmV0dXJuIHN1cGVyLmJ1aWxkKHQsZSl9fWNsYXNzIEVhIGV4dGVuZHMgZHR7c3RhdGljIGdldCB0eXBlKCl7cmV0dXJuIkpvaW5Ob2RlIn1jb25zdHJ1Y3Rvcih0PVtdLGU9bnVsbCl7c3VwZXIoZSksdGhpcy5ub2Rlcz10fWdldE5vZGVUeXBlKHQpe3JldHVybiB0aGlzLm5vZGVUeXBlIT09bnVsbD90LmdldFZlY3RvclR5cGUodGhpcy5ub2RlVHlwZSk6dC5nZXRUeXBlRnJvbUxlbmd0aCh0aGlzLm5vZGVzLnJlZHVjZSgoZSxzKT0+ZSt0LmdldFR5cGVMZW5ndGgocy5nZXROb2RlVHlwZSh0KSksMCkpfWdlbmVyYXRlKHQsZSl7Y29uc3Qgcz10aGlzLmdldE5vZGVUeXBlKHQpLG49dGhpcy5ub2RlcyxpPXQuZ2V0Q29tcG9uZW50VHlwZShzKSxvPVtdO2Zvcihjb25zdCBjIG9mIG4pe2xldCB1PWMuYnVpbGQodCk7Y29uc3QgaD10LmdldENvbXBvbmVudFR5cGUoYy5nZXROb2RlVHlwZSh0KSk7aCE9PWkmJih1PXQuZm9ybWF0KHUsaCxpKSksby5wdXNoKHUpfWNvbnN0IGE9YCR7dC5nZXRUeXBlKHMpfSggJHtvLmpvaW4oIiwgIil9IClgO3JldHVybiB0LmZvcm1hdChhLHMsZSl9fWNvbnN0IENhPW5zLmpvaW4oIiIpO2NsYXNzIE1yIGV4dGVuZHMgVXtzdGF0aWMgZ2V0IHR5cGUoKXtyZXR1cm4iU3BsaXROb2RlIn1jb25zdHJ1Y3Rvcih0LGU9IngiKXtzdXBlcigpLHRoaXMubm9kZT10LHRoaXMuY29tcG9uZW50cz1lLHRoaXMuaXNTcGxpdE5vZGU9ITB9Z2V0VmVjdG9yTGVuZ3RoKCl7bGV0IHQ9dGhpcy5jb21wb25lbnRzLmxlbmd0aDtmb3IoY29uc3QgZSBvZiB0aGlzLmNvbXBvbmVudHMpdD1NYXRoLm1heChucy5pbmRleE9mKGUpKzEsdCk7cmV0dXJuIHR9Z2V0Q29tcG9uZW50VHlwZSh0KXtyZXR1cm4gdC5nZXRDb21wb25lbnRUeXBlKHRoaXMubm9kZS5nZXROb2RlVHlwZSh0KSl9Z2V0Tm9kZVR5cGUodCl7cmV0dXJuIHQuZ2V0VHlwZUZyb21MZW5ndGgodGhpcy5jb21wb25lbnRzLmxlbmd0aCx0aGlzLmdldENvbXBvbmVudFR5cGUodCkpfWdlbmVyYXRlKHQsZSl7Y29uc3Qgcz10aGlzLm5vZGUsbj10LmdldFR5cGVMZW5ndGgocy5nZXROb2RlVHlwZSh0KSk7bGV0IGk9bnVsbDtpZihuPjEpe2xldCBvPW51bGw7dGhpcy5nZXRWZWN0b3JMZW5ndGgoKT49biYmKG89dC5nZXRUeXBlRnJvbUxlbmd0aCh0aGlzLmdldFZlY3Rvckxlbmd0aCgpLHRoaXMuZ2V0Q29tcG9uZW50VHlwZSh0KSkpO2NvbnN0IGM9cy5idWlsZCh0LG8pO3RoaXMuY29tcG9uZW50cy5sZW5ndGg9PT1uJiZ0aGlzLmNvbXBvbmVudHM9PT1DYS5zbGljZSgwLHRoaXMuY29tcG9uZW50cy5sZW5ndGgpP2k9dC5mb3JtYXQoYyxvLGUpOmk9dC5mb3JtYXQoYCR7Y30uJHt0aGlzLmNvbXBvbmVudHN9YCx0aGlzLmdldE5vZGVUeXBlKHQpLGUpfWVsc2UgaT1zLmJ1aWxkKHQsZSk7cmV0dXJuIGl9c2VyaWFsaXplKHQpe3N1cGVyLnNlcmlhbGl6ZSh0KSx0LmNvbXBvbmVudHM9dGhpcy5jb21wb25lbnRzfWRlc2VyaWFsaXplKHQpe3N1cGVyLmRlc2VyaWFsaXplKHQpLHRoaXMuY29tcG9uZW50cz10LmNvbXBvbmVudHN9fWNsYXNzIEZhIGV4dGVuZHMgZHR7c3RhdGljIGdldCB0eXBlKCl7cmV0dXJuIlNldE5vZGUifWNvbnN0cnVjdG9yKHQsZSxzKXtzdXBlcigpLHRoaXMuc291cmNlTm9kZT10LHRoaXMuY29tcG9uZW50cz1lLHRoaXMudGFyZ2V0Tm9kZT1zfWdldE5vZGVUeXBlKHQpe3JldHVybiB0aGlzLnNvdXJjZU5vZGUuZ2V0Tm9kZVR5cGUodCl9Z2VuZXJhdGUodCl7Y29uc3R7c291cmNlTm9kZTplLGNvbXBvbmVudHM6cyx0YXJnZXROb2RlOm59PXRoaXMsaT10aGlzLmdldE5vZGVUeXBlKHQpLG89dC5nZXRUeXBlRnJvbUxlbmd0aChzLmxlbmd0aCxuLmdldE5vZGVUeXBlKHQpKSxhPW4uYnVpbGQodCxvKSxjPWUuYnVpbGQodCxpKSx1PXQuZ2V0VHlwZUxlbmd0aChpKSxoPVtdO2ZvcihsZXQgbD0wO2w8dTtsKyspe2NvbnN0IGQ9bnNbbF07ZD09PXNbMF0/KGgucHVzaChhKSxsKz1zLmxlbmd0aC0xKTpoLnB1c2goYysiLiIrZCl9cmV0dXJuYCR7dC5nZXRUeXBlKGkpfSggJHtoLmpvaW4oIiwgIil9IClgfX1jbGFzcyBSYSBleHRlbmRzIGR0e3N0YXRpYyBnZXQgdHlwZSgpe3JldHVybiJGbGlwTm9kZSJ9Y29uc3RydWN0b3IodCxlKXtzdXBlcigpLHRoaXMuc291cmNlTm9kZT10LHRoaXMuY29tcG9uZW50cz1lfWdldE5vZGVUeXBlKHQpe3JldHVybiB0aGlzLnNvdXJjZU5vZGUuZ2V0Tm9kZVR5cGUodCl9Z2VuZXJhdGUodCl7Y29uc3R7Y29tcG9uZW50czplLHNvdXJjZU5vZGU6c309dGhpcyxuPXRoaXMuZ2V0Tm9kZVR5cGUodCksaT1zLmJ1aWxkKHQpLG89dC5nZXRWYXJGcm9tTm9kZSh0aGlzKSxhPXQuZ2V0UHJvcGVydHlOYW1lKG8pO3QuYWRkTGluZUZsb3dDb2RlKGErIiA9ICIraSx0aGlzKTtjb25zdCBjPXQuZ2V0VHlwZUxlbmd0aChuKSx1PVtdO2xldCBoPTA7Zm9yKGxldCBsPTA7bDxjO2wrKyl7Y29uc3QgZD1uc1tsXTtkPT09ZVtoXT8odS5wdXNoKCIxLjAgLSAiKyhhKyIuIitkKSksaCsrKTp1LnB1c2goYSsiLiIrZCl9cmV0dXJuYCR7dC5nZXRUeXBlKG4pfSggJHt1LmpvaW4oIiwgIil9IClgfX1jbGFzcyBqbiBleHRlbmRzIFV7c3RhdGljIGdldCB0eXBlKCl7cmV0dXJuIklucHV0Tm9kZSJ9Y29uc3RydWN0b3IodCxlPW51bGwpe3N1cGVyKGUpLHRoaXMuaXNJbnB1dE5vZGU9ITAsdGhpcy52YWx1ZT10LHRoaXMucHJlY2lzaW9uPW51bGx9Z2V0Tm9kZVR5cGUoKXtyZXR1cm4gdGhpcy5ub2RlVHlwZT09PW51bGw/VnModGhpcy52YWx1ZSk6dGhpcy5ub2RlVHlwZX1nZXRJbnB1dFR5cGUodCl7cmV0dXJuIHRoaXMuZ2V0Tm9kZVR5cGUodCl9c2V0UHJlY2lzaW9uKHQpe3JldHVybiB0aGlzLnByZWNpc2lvbj10LHRoaXN9c2VyaWFsaXplKHQpe3N1cGVyLnNlcmlhbGl6ZSh0KSx0LnZhbHVlPXRoaXMudmFsdWUsdGhpcy52YWx1ZSYmdGhpcy52YWx1ZS50b0FycmF5JiYodC52YWx1ZT10aGlzLnZhbHVlLnRvQXJyYXkoKSksdC52YWx1ZVR5cGU9VnModGhpcy52YWx1ZSksdC5ub2RlVHlwZT10aGlzLm5vZGVUeXBlLHQudmFsdWVUeXBlPT09IkFycmF5QnVmZmVyIiYmKHQudmFsdWU9X2EodC52YWx1ZSkpLHQucHJlY2lzaW9uPXRoaXMucHJlY2lzaW9ufWRlc2VyaWFsaXplKHQpe3N1cGVyLmRlc2VyaWFsaXplKHQpLHRoaXMubm9kZVR5cGU9dC5ub2RlVHlwZSx0aGlzLnZhbHVlPUFycmF5LmlzQXJyYXkodC52YWx1ZSk/TnIodC52YWx1ZVR5cGUsLi4udC52YWx1ZSk6dC52YWx1ZSx0aGlzLnByZWNpc2lvbj10LnByZWNpc2lvbnx8bnVsbCx0aGlzLnZhbHVlJiZ0aGlzLnZhbHVlLmZyb21BcnJheSYmKHRoaXMudmFsdWU9dGhpcy52YWx1ZS5mcm9tQXJyYXkodC52YWx1ZSkpfWdlbmVyYXRlKCl7Y29uc29sZS53YXJuKCJBYnN0cmFjdCBmdW5jdGlvbi4iKX19Y2xhc3MgSnQgZXh0ZW5kcyBqbntzdGF0aWMgZ2V0IHR5cGUoKXtyZXR1cm4iQ29uc3ROb2RlIn1jb25zdHJ1Y3Rvcih0LGU9bnVsbCl7c3VwZXIodCxlKSx0aGlzLmlzQ29uc3ROb2RlPSEwfWdlbmVyYXRlQ29uc3QodCl7cmV0dXJuIHQuZ2VuZXJhdGVDb25zdCh0aGlzLmdldE5vZGVUeXBlKHQpLHRoaXMudmFsdWUpfWdlbmVyYXRlKHQsZSl7Y29uc3Qgcz10aGlzLmdldE5vZGVUeXBlKHQpO3JldHVybiB0LmZvcm1hdCh0aGlzLmdlbmVyYXRlQ29uc3QodCkscyxlKX19bGV0IFNyPW51bGw7Y29uc3QgQ2U9bmV3IE1hcDtmdW5jdGlvbiBiKHIsdCl7aWYoQ2UuaGFzKHIpKXtjb25zb2xlLndhcm4oYFJlZGVmaW5pdGlvbiBvZiBtZXRob2QgY2hhaW5pbmcgJHtyfWApO3JldHVybn1pZih0eXBlb2YgdCE9ImZ1bmN0aW9uIil0aHJvdyBuZXcgRXJyb3IoYE5vZGUgZWxlbWVudCAke3J9IGlzIG5vdCBhIGZ1bmN0aW9uYCk7Q2Uuc2V0KHIsdCl9Y29uc3QgX3I9cj0+ci5yZXBsYWNlKC9yfHMvZywieCIpLnJlcGxhY2UoL2d8dC9nLCJ5IikucmVwbGFjZSgvYnxwL2csInoiKS5yZXBsYWNlKC9hfHEvZywidyIpLHpyPXI9Pl9yKHIpLnNwbGl0KCIiKS5zb3J0KCkuam9pbigiIiksYnI9e3NldHVwKHIsdCl7Y29uc3QgZT10LnNoaWZ0KCk7cmV0dXJuIHIoSHMoZSksLi4udCl9LGdldChyLHQsZSl7aWYodHlwZW9mIHQ9PSJzdHJpbmciJiZyW3RdPT09dm9pZCAwKXtpZihyLmlzU3RhY2tOb2RlIT09ITAmJnQ9PT0iYXNzaWduIilyZXR1cm4oLi4ucyk9PihTci5hc3NpZ24oZSwuLi5zKSxlKTtpZihDZS5oYXModCkpe2NvbnN0IHM9Q2UuZ2V0KHQpO3JldHVybiByLmlzU3RhY2tOb2RlPyguLi5uKT0+ZS5hZGQocyguLi5uKSk6KC4uLm4pPT5zKGUsLi4ubil9ZWxzZXtpZih0PT09InNlbGYiKXJldHVybiByO2lmKHQuZW5kc1dpdGgoIkFzc2lnbiIpJiZDZS5oYXModC5zbGljZSgwLHQubGVuZ3RoLTYpKSl7Y29uc3Qgcz1DZS5nZXQodC5zbGljZSgwLHQubGVuZ3RoLTYpKTtyZXR1cm4gci5pc1N0YWNrTm9kZT8oLi4ubik9PmUuYXNzaWduKG5bMF0scyguLi5uKSk6KC4uLm4pPT5lLmFzc2lnbihzKGUsLi4ubikpfWVsc2V7aWYoL15beHl6d3JnYmFzdHBxXXsxLDR9JC8udGVzdCh0KT09PSEwKXJldHVybiB0PV9yKHQpLHYobmV3IE1yKGUsdCkpO2lmKC9ec2V0W1hZWldSR0JBU1RQUV17MSw0fSQvLnRlc3QodCk9PT0hMClyZXR1cm4gdD16cih0LnNsaWNlKDMpLnRvTG93ZXJDYXNlKCkpLHM9PnYobmV3IEZhKHIsdCxzKSk7aWYoL15mbGlwW1hZWldSR0JBU1RQUV17MSw0fSQvLnRlc3QodCk9PT0hMClyZXR1cm4gdD16cih0LnNsaWNlKDQpLnRvTG93ZXJDYXNlKCkpLCgpPT52KG5ldyBSYSh2KHIpLHQpKTtpZih0PT09IndpZHRoInx8dD09PSJoZWlnaHQifHx0PT09ImRlcHRoIilyZXR1cm4gdD09PSJ3aWR0aCI/dD0ieCI6dD09PSJoZWlnaHQiP3Q9InkiOnQ9PT0iZGVwdGgiJiYodD0ieiIpLHYobmV3IE1yKHIsdCkpO2lmKC9eXGQrJC8udGVzdCh0KT09PSEwKXJldHVybiB2KG5ldyBpcyhlLG5ldyBKdChOdW1iZXIodCksInVpbnQiKSkpfX19cmV0dXJuIFJlZmxlY3QuZ2V0KHIsdCxlKX0sc2V0KHIsdCxlLHMpe3JldHVybiB0eXBlb2YgdD09InN0cmluZyImJnJbdF09PT12b2lkIDAmJigvXlt4eXp3cmdiYXN0cHFdezEsNH0kLy50ZXN0KHQpPT09ITB8fHQ9PT0id2lkdGgifHx0PT09ImhlaWdodCJ8fHQ9PT0iZGVwdGgifHwvXlxkKyQvLnRlc3QodCk9PT0hMCk/KHNbdF0uYXNzaWduKGUpLCEwKTpSZWZsZWN0LnNldChyLHQsZSxzKX19LFFuPW5ldyBXZWFrTWFwLEVyPW5ldyBXZWFrTWFwLEJhPWZ1bmN0aW9uKHIsdD1udWxsKXtjb25zdCBlPVZzKHIpO2lmKGU9PT0ibm9kZSIpe2xldCBzPVFuLmdldChyKTtyZXR1cm4gcz09PXZvaWQgMCYmKHM9bmV3IFByb3h5KHIsYnIpLFFuLnNldChyLHMpLFFuLnNldChzLHMpKSxzfWVsc2V7aWYodD09PW51bGwmJihlPT09ImZsb2F0Inx8ZT09PSJib29sZWFuIil8fGUmJmUhPT0ic2hhZGVyIiYmZSE9PSJzdHJpbmciKXJldHVybiB2KHNpKHIsdCkpO2lmKGU9PT0ic2hhZGVyIilyZXR1cm4gdHQocil9cmV0dXJuIHJ9LElhPWZ1bmN0aW9uKHIsdD1udWxsKXtmb3IoY29uc3QgZSBpbiByKXJbZV09dihyW2VdLHQpO3JldHVybiByfSx2YT1mdW5jdGlvbihyLHQ9bnVsbCl7Y29uc3QgZT1yLmxlbmd0aDtmb3IobGV0IHM9MDtzPGU7cysrKXJbc109dihyW3NdLHQpO3JldHVybiByfSxQYT1mdW5jdGlvbihyLHQ9bnVsbCxlPW51bGwscz1udWxsKXtjb25zdCBuPWk9PnYocyE9PW51bGw/T2JqZWN0LmFzc2lnbihpLHMpOmkpO3JldHVybiB0PT09bnVsbD8oLi4uaSk9Pm4obmV3IHIoLi4uRmUoaSkpKTplIT09bnVsbD8oZT12KGUpLCguLi5pKT0+bihuZXcgcih0LC4uLkZlKGkpLGUpKSk6KC4uLmkpPT5uKG5ldyByKHQsLi4uRmUoaSkpKX0sTGE9ZnVuY3Rpb24ociwuLi50KXtyZXR1cm4gdihuZXcgciguLi5GZSh0KSkpfTtjbGFzcyBPYSBleHRlbmRzIFV7Y29uc3RydWN0b3IodCxlKXtzdXBlcigpLHRoaXMuc2hhZGVyTm9kZT10LHRoaXMuaW5wdXROb2Rlcz1lfWdldE5vZGVUeXBlKHQpe3JldHVybiB0aGlzLnNoYWRlck5vZGUubm9kZVR5cGV8fHRoaXMuZ2V0T3V0cHV0Tm9kZSh0KS5nZXROb2RlVHlwZSh0KX1jYWxsKHQpe2NvbnN0e3NoYWRlck5vZGU6ZSxpbnB1dE5vZGVzOnN9PXRoaXMsbj10LmdldE5vZGVQcm9wZXJ0aWVzKGUpO2lmKG4ub25jZU91dHB1dClyZXR1cm4gbi5vbmNlT3V0cHV0O2xldCBpPW51bGw7aWYoZS5sYXlvdXQpe2xldCBvPUVyLmdldCh0LmNvbnN0cnVjdG9yKTtvPT09dm9pZCAwJiYobz1uZXcgV2Vha01hcCxFci5zZXQodC5jb25zdHJ1Y3RvcixvKSk7bGV0IGE9by5nZXQoZSk7YT09PXZvaWQgMCYmKGE9dih0LmJ1aWxkRnVuY3Rpb25Ob2RlKGUpKSxvLnNldChlLGEpKSx0LmN1cnJlbnRGdW5jdGlvbk5vZGUhPT1udWxsJiZ0LmN1cnJlbnRGdW5jdGlvbk5vZGUuaW5jbHVkZXMucHVzaChhKSxpPXYoYS5jYWxsKHMpKX1lbHNle2NvbnN0IG89ZS5qc0Z1bmMsYT1zIT09bnVsbD9vKHMsdCk6byh0KTtpPXYoYSl9cmV0dXJuIGUub25jZSYmKG4ub25jZU91dHB1dD1pKSxpfWdldE91dHB1dE5vZGUodCl7Y29uc3QgZT10LmdldE5vZGVQcm9wZXJ0aWVzKHRoaXMpO3JldHVybiBlLm91dHB1dE5vZGU9PT1udWxsJiYoZS5vdXRwdXROb2RlPXRoaXMuc2V0dXBPdXRwdXQodCkpLGUub3V0cHV0Tm9kZX1zZXR1cCh0KXtyZXR1cm4gdGhpcy5nZXRPdXRwdXROb2RlKHQpfXNldHVwT3V0cHV0KHQpe3JldHVybiB0LmFkZFN0YWNrKCksdC5zdGFjay5vdXRwdXROb2RlPXRoaXMuY2FsbCh0KSx0LnJlbW92ZVN0YWNrKCl9Z2VuZXJhdGUodCxlKXtyZXR1cm4gdGhpcy5nZXRPdXRwdXROb2RlKHQpLmJ1aWxkKHQsZSl9fWNsYXNzIERhIGV4dGVuZHMgVXtjb25zdHJ1Y3Rvcih0LGUpe3N1cGVyKGUpLHRoaXMuanNGdW5jPXQsdGhpcy5sYXlvdXQ9bnVsbCx0aGlzLmdsb2JhbD0hMCx0aGlzLm9uY2U9ITF9c2V0TGF5b3V0KHQpe3JldHVybiB0aGlzLmxheW91dD10LHRoaXN9Y2FsbCh0PW51bGwpe3JldHVybiBIcyh0KSx2KG5ldyBPYSh0aGlzLHQpKX1zZXR1cCgpe3JldHVybiB0aGlzLmNhbGwoKX19Y29uc3QgVmE9WyExLCEwXSxVYT1bMCwxLDIsM10sa2E9Wy0xLC0yXSxDcj1bLjUsMS41LDEvMywxZS02LDFlNixNYXRoLlBJLE1hdGguUEkqMiwxL01hdGguUEksMi9NYXRoLlBJLDEvKE1hdGguUEkqMiksTWF0aC5QSS8yXSxLbj1uZXcgTWFwO2Zvcihjb25zdCByIG9mIFZhKUtuLnNldChyLG5ldyBKdChyKSk7Y29uc3QgdGk9bmV3IE1hcDtmb3IoY29uc3QgciBvZiBVYSl0aS5zZXQocixuZXcgSnQociwidWludCIpKTtjb25zdCBlaT1uZXcgTWFwKFsuLi50aV0ubWFwKHI9Pm5ldyBKdChyLnZhbHVlLCJpbnQiKSkpO2Zvcihjb25zdCByIG9mIGthKWVpLnNldChyLG5ldyBKdChyLCJpbnQiKSk7Y29uc3QgVXM9bmV3IE1hcChbLi4uZWldLm1hcChyPT5uZXcgSnQoci52YWx1ZSkpKTtmb3IoY29uc3QgciBvZiBDcilVcy5zZXQocixuZXcgSnQocikpO2Zvcihjb25zdCByIG9mIENyKVVzLnNldCgtcixuZXcgSnQoLXIpKTtjb25zdCBrcz17Ym9vbDpLbix1aW50OnRpLGludHM6ZWksZmxvYXQ6VXN9LEZyPW5ldyBNYXAoWy4uLktuLC4uLlVzXSksc2k9KHIsdCk9PkZyLmhhcyhyKT9Gci5nZXQocik6ci5pc05vZGU9PT0hMD9yOm5ldyBKdChyLHQpLEhhPXI9Pnt0cnl7cmV0dXJuIHIuZ2V0Tm9kZVR5cGUoKX1jYXRjaHtyZXR1cm59fSxLPWZ1bmN0aW9uKHIsdD1udWxsKXtyZXR1cm4oLi4uZSk9PntpZigoZS5sZW5ndGg9PT0wfHwhWyJib29sIiwiZmxvYXQiLCJpbnQiLCJ1aW50Il0uaW5jbHVkZXMocikmJmUuZXZlcnkobj0+dHlwZW9mIG4hPSJvYmplY3QiKSkmJihlPVtOcihyLC4uLmUpXSksZS5sZW5ndGg9PT0xJiZ0IT09bnVsbCYmdC5oYXMoZVswXSkpcmV0dXJuIHYodC5nZXQoZVswXSkpO2lmKGUubGVuZ3RoPT09MSl7Y29uc3Qgbj1zaShlWzBdLHIpO3JldHVybiBIYShuKT09PXI/dihuKTp2KG5ldyBBcihuLHIpKX1jb25zdCBzPWUubWFwKG49PnNpKG4pKTtyZXR1cm4gdihuZXcgRWEocyxyKSl9fSxxYT1yPT5yIT1udWxsP3Iubm9kZVR5cGV8fHIuY29udmVydFRvfHwodHlwZW9mIHI9PSJzdHJpbmciP3I6bnVsbCk6bnVsbDtmdW5jdGlvbiAkYShyLHQpe3JldHVybiBuZXcgUHJveHkobmV3IERhKHIsdCksYnIpfWNvbnN0IHY9KHIsdD1udWxsKT0+QmEocix0KSxIcz0ocix0PW51bGwpPT5uZXcgSWEocix0KSxGZT0ocix0PW51bGwpPT5uZXcgdmEocix0KSxDPSguLi5yKT0+bmV3IFBhKC4uLnIpLE89KC4uLnIpPT5uZXcgTGEoLi4uciksdHQ9KHIsdCk9Pntjb25zdCBlPW5ldyAkYShyLHQpLHM9KC4uLm4pPT57bGV0IGk7cmV0dXJuIEhzKG4pLG5bMF0mJm5bMF0uaXNOb2RlP2k9Wy4uLm5dOmk9blswXSxlLmNhbGwoaSl9O3JldHVybiBzLnNoYWRlck5vZGU9ZSxzLnNldExheW91dD1uPT4oZS5zZXRMYXlvdXQobikscykscy5vbmNlPSgpPT4oZS5vbmNlPSEwLHMpLHN9O2IoInRvR2xvYmFsIixyPT4oci5nbG9iYWw9ITAscikpO2NvbnN0IG5pPSguLi5yKT0+U3IuSWYoLi4ucik7ZnVuY3Rpb24gR2Eocil7cmV0dXJuIHJ9YigiYXBwZW5kIixHYSk7Y29uc3QgV2E9bmV3IEsoImNvbG9yIikscT1uZXcgSygiZmxvYXQiLGtzLmZsb2F0KSxSZT1uZXcgSygiaW50Iixrcy5pbnRzKSxYYT1uZXcgSygidWludCIsa3MudWludCksWWE9bmV3IEsoImJvb2wiLGtzLmJvb2wpLEQ9bmV3IEsoInZlYzIiKSxaYT1uZXcgSygiaXZlYzIiKSxKYT1uZXcgSygidXZlYzIiKSxqYT1uZXcgSygiYnZlYzIiKSxrPW5ldyBLKCJ2ZWMzIiksUWE9bmV3IEsoIml2ZWMzIiksS2E9bmV3IEsoInV2ZWMzIiksdGM9bmV3IEsoImJ2ZWMzIiksQmU9bmV3IEsoInZlYzQiKSxlYz1uZXcgSygiaXZlYzQiKSxzYz1uZXcgSygidXZlYzQiKSxuYz1uZXcgSygiYnZlYzQiKSxScj1uZXcgSygibWF0MiIpLHFzPW5ldyBLKCJtYXQzIiksaWM9bmV3IEsoIm1hdDQiKTtiKCJ0b0NvbG9yIixXYSksYigidG9GbG9hdCIscSksYigidG9JbnQiLFJlKSxiKCJ0b1VpbnQiLFhhKSxiKCJ0b0Jvb2wiLFlhKSxiKCJ0b1ZlYzIiLEQpLGIoInRvSVZlYzIiLFphKSxiKCJ0b1VWZWMyIixKYSksYigidG9CVmVjMiIsamEpLGIoInRvVmVjMyIsayksYigidG9JVmVjMyIsUWEpLGIoInRvVVZlYzMiLEthKSxiKCJ0b0JWZWMzIix0YyksYigidG9WZWM0IixCZSksYigidG9JVmVjNCIsZWMpLGIoInRvVVZlYzQiLHNjKSxiKCJ0b0JWZWM0IixuYyksYigidG9NYXQyIixSciksYigidG9NYXQzIixxcyksYigidG9NYXQ0IixpYyk7Y29uc3QgcmM9Qyhpcyksb2M9KHIsdCk9PnYobmV3IEFyKHYociksdCkpO2IoImVsZW1lbnQiLHJjKSxiKCJjb252ZXJ0IixvYyk7Y2xhc3MgQnIgZXh0ZW5kcyBVe3N0YXRpYyBnZXQgdHlwZSgpe3JldHVybiJVbmlmb3JtR3JvdXBOb2RlIn1jb25zdHJ1Y3Rvcih0LGU9ITEscz0xKXtzdXBlcigic3RyaW5nIiksdGhpcy5uYW1lPXQsdGhpcy52ZXJzaW9uPTAsdGhpcy5zaGFyZWQ9ZSx0aGlzLm9yZGVyPXMsdGhpcy5pc1VuaWZvcm1Hcm91cD0hMH1zZXQgbmVlZHNVcGRhdGUodCl7dD09PSEwJiZ0aGlzLnZlcnNpb24rK31zZXJpYWxpemUodCl7c3VwZXIuc2VyaWFsaXplKHQpLHQubmFtZT10aGlzLm5hbWUsdC52ZXJzaW9uPXRoaXMudmVyc2lvbix0LnNoYXJlZD10aGlzLnNoYXJlZH1kZXNlcmlhbGl6ZSh0KXtzdXBlci5kZXNlcmlhbGl6ZSh0KSx0aGlzLm5hbWU9dC5uYW1lLHRoaXMudmVyc2lvbj10LnZlcnNpb24sdGhpcy5zaGFyZWQ9dC5zaGFyZWR9fWNvbnN0IGFjPXI9Pm5ldyBCcihyKSxkZT0oKHIsdD0wKT0+bmV3IEJyKHIsITAsdCkpKCJyZW5kZXIiKSxjYz1hYygib2JqZWN0Iik7Y2xhc3MgSWUgZXh0ZW5kcyBqbntzdGF0aWMgZ2V0IHR5cGUoKXtyZXR1cm4iVW5pZm9ybU5vZGUifWNvbnN0cnVjdG9yKHQsZT1udWxsKXtzdXBlcih0LGUpLHRoaXMuaXNVbmlmb3JtTm9kZT0hMCx0aGlzLm5hbWU9IiIsdGhpcy5ncm91cE5vZGU9Y2N9bGFiZWwodCl7cmV0dXJuIHRoaXMubmFtZT10LHRoaXN9c2V0R3JvdXAodCl7cmV0dXJuIHRoaXMuZ3JvdXBOb2RlPXQsdGhpc31nZXRHcm91cCgpe3JldHVybiB0aGlzLmdyb3VwTm9kZX1nZXRVbmlmb3JtSGFzaCh0KXtyZXR1cm4gdGhpcy5nZXRIYXNoKHQpfW9uVXBkYXRlKHQsZSl7Y29uc3Qgcz10aGlzLmdldFNlbGYoKTtyZXR1cm4gdD10LmJpbmQocyksc3VwZXIub25VcGRhdGUobj0+e2NvbnN0IGk9dChuLHMpO2khPT12b2lkIDAmJih0aGlzLnZhbHVlPWkpfSxlKX1nZW5lcmF0ZSh0LGUpe2NvbnN0IHM9dGhpcy5nZXROb2RlVHlwZSh0KSxuPXRoaXMuZ2V0VW5pZm9ybUhhc2godCk7bGV0IGk9dC5nZXROb2RlRnJvbUhhc2gobik7aT09PXZvaWQgMCYmKHQuc2V0SGFzaE5vZGUodGhpcyxuKSxpPXRoaXMpO2NvbnN0IG89aS5nZXRJbnB1dFR5cGUodCksYT10LmdldFVuaWZvcm1Gcm9tTm9kZShpLG8sdC5zaGFkZXJTdGFnZSx0aGlzLm5hbWV8fHQuY29udGV4dC5sYWJlbCksYz10LmdldFByb3BlcnR5TmFtZShhKTtyZXR1cm4gdC5jb250ZXh0LmxhYmVsIT09dm9pZCAwJiZkZWxldGUgdC5jb250ZXh0LmxhYmVsLHQuZm9ybWF0KGMscyxlKX19Y29uc3QgeHQ9KHIsdCk9Pntjb25zdCBlPXFhKHR8fHIpLHM9ciYmci5pc05vZGU9PT0hMD9yLm5vZGUmJnIubm9kZS52YWx1ZXx8ci52YWx1ZTpyO3JldHVybiB2KG5ldyBJZShzLGUpKX07Y2xhc3MgSXIgZXh0ZW5kcyBVe3N0YXRpYyBnZXQgdHlwZSgpe3JldHVybiJQcm9wZXJ0eU5vZGUifWNvbnN0cnVjdG9yKHQsZT1udWxsLHM9ITEpe3N1cGVyKHQpLHRoaXMubmFtZT1lLHRoaXMudmFyeWluZz1zLHRoaXMuaXNQcm9wZXJ0eU5vZGU9ITB9Z2V0SGFzaCh0KXtyZXR1cm4gdGhpcy5uYW1lfHxzdXBlci5nZXRIYXNoKHQpfWlzR2xvYmFsKCl7cmV0dXJuITB9Z2VuZXJhdGUodCl7bGV0IGU7cmV0dXJuIHRoaXMudmFyeWluZz09PSEwPyhlPXQuZ2V0VmFyeWluZ0Zyb21Ob2RlKHRoaXMsdGhpcy5uYW1lKSxlLm5lZWRzSW50ZXJwb2xhdGlvbj0hMCk6ZT10LmdldFZhckZyb21Ob2RlKHRoaXMsdGhpcy5uYW1lKSx0LmdldFByb3BlcnR5TmFtZShlKX19Y29uc3QgdmU9KHIsdCk9PnYobmV3IElyKHIsdCkpLHZyPU8oSXIsInZlYzQiLCJEaWZmdXNlQ29sb3IiKTtjbGFzcyBoYyBleHRlbmRzIGR0e3N0YXRpYyBnZXQgdHlwZSgpe3JldHVybiJBc3NpZ25Ob2RlIn1jb25zdHJ1Y3Rvcih0LGUpe3N1cGVyKCksdGhpcy50YXJnZXROb2RlPXQsdGhpcy5zb3VyY2VOb2RlPWV9aGFzRGVwZW5kZW5jaWVzKCl7cmV0dXJuITF9Z2V0Tm9kZVR5cGUodCxlKXtyZXR1cm4gZSE9PSJ2b2lkIj90aGlzLnRhcmdldE5vZGUuZ2V0Tm9kZVR5cGUodCk6InZvaWQifW5lZWRzU3BsaXRBc3NpZ24odCl7Y29uc3R7dGFyZ2V0Tm9kZTplfT10aGlzO2lmKHQuaXNBdmFpbGFibGUoInN3aXp6bGVBc3NpZ24iKT09PSExJiZlLmlzU3BsaXROb2RlJiZlLmNvbXBvbmVudHMubGVuZ3RoPjEpe2NvbnN0IHM9dC5nZXRUeXBlTGVuZ3RoKGUubm9kZS5nZXROb2RlVHlwZSh0KSk7cmV0dXJuIG5zLmpvaW4oIiIpLnNsaWNlKDAscykhPT1lLmNvbXBvbmVudHN9cmV0dXJuITF9Z2VuZXJhdGUodCxlKXtjb25zdHt0YXJnZXROb2RlOnMsc291cmNlTm9kZTpufT10aGlzLGk9dGhpcy5uZWVkc1NwbGl0QXNzaWduKHQpLG89cy5nZXROb2RlVHlwZSh0KSxhPXMuY29udGV4dCh7YXNzaWduOiEwfSkuYnVpbGQodCksYz1uLmJ1aWxkKHQsbyksdT1uLmdldE5vZGVUeXBlKHQpLGg9dC5nZXREYXRhRnJvbU5vZGUodGhpcyk7bGV0IGw7aWYoaC5pbml0aWFsaXplZD09PSEwKWUhPT0idm9pZCImJihsPWEpO2Vsc2UgaWYoaSl7Y29uc3QgZD10LmdldFZhckZyb21Ob2RlKHRoaXMsbnVsbCxvKSxmPXQuZ2V0UHJvcGVydHlOYW1lKGQpO3QuYWRkTGluZUZsb3dDb2RlKGAke2Z9ID0gJHtjfWAsdGhpcyk7Y29uc3QgcD1zLm5vZGUuY29udGV4dCh7YXNzaWduOiEwfSkuYnVpbGQodCk7Zm9yKGxldCBtPTA7bTxzLmNvbXBvbmVudHMubGVuZ3RoO20rKyl7Y29uc3QgZz1zLmNvbXBvbmVudHNbbV07dC5hZGRMaW5lRmxvd0NvZGUoYCR7cH0uJHtnfSA9ICR7Zn1bICR7bX0gXWAsdGhpcyl9ZSE9PSJ2b2lkIiYmKGw9YSl9ZWxzZSBsPWAke2F9ID0gJHtjfWAsKGU9PT0idm9pZCJ8fHU9PT0idm9pZCIpJiYodC5hZGRMaW5lRmxvd0NvZGUobCx0aGlzKSxlIT09InZvaWQiJiYobD1hKSk7cmV0dXJuIGguaW5pdGlhbGl6ZWQ9ITAsdC5mb3JtYXQobCxvLGUpfX1iKCJhc3NpZ24iLEMoaGMpKTtjbGFzcyB1YyBleHRlbmRzIGR0e3N0YXRpYyBnZXQgdHlwZSgpe3JldHVybiJGdW5jdGlvbkNhbGxOb2RlIn1jb25zdHJ1Y3Rvcih0PW51bGwsZT17fSl7c3VwZXIoKSx0aGlzLmZ1bmN0aW9uTm9kZT10LHRoaXMucGFyYW1ldGVycz1lfXNldFBhcmFtZXRlcnModCl7cmV0dXJuIHRoaXMucGFyYW1ldGVycz10LHRoaXN9Z2V0UGFyYW1ldGVycygpe3JldHVybiB0aGlzLnBhcmFtZXRlcnN9Z2V0Tm9kZVR5cGUodCl7cmV0dXJuIHRoaXMuZnVuY3Rpb25Ob2RlLmdldE5vZGVUeXBlKHQpfWdlbmVyYXRlKHQpe2NvbnN0IGU9W10scz10aGlzLmZ1bmN0aW9uTm9kZSxuPXMuZ2V0SW5wdXRzKHQpLGk9dGhpcy5wYXJhbWV0ZXJzO2lmKEFycmF5LmlzQXJyYXkoaSkpZm9yKGxldCBhPTA7YTxpLmxlbmd0aDthKyspe2NvbnN0IGM9blthXSx1PWlbYV07ZS5wdXNoKHUuYnVpbGQodCxjLnR5cGUpKX1lbHNlIGZvcihjb25zdCBhIG9mIG4pe2NvbnN0IGM9aVthLm5hbWVdO2lmKGMhPT12b2lkIDApZS5wdXNoKGMuYnVpbGQodCxhLnR5cGUpKTtlbHNlIHRocm93IG5ldyBFcnJvcihgRnVuY3Rpb25DYWxsTm9kZTogSW5wdXQgJyR7YS5uYW1lfScgbm90IGZvdW5kIGluIEZ1bmN0aW9uTm9kZS5gKX1yZXR1cm5gJHtzLmJ1aWxkKHQsInByb3BlcnR5Iil9KCAke2Uuam9pbigiLCAiKX0gKWB9fWIoImNhbGwiLChyLC4uLnQpPT4odD10Lmxlbmd0aD4xfHx0WzBdJiZ0WzBdLmlzTm9kZT09PSEwP0ZlKHQpOkhzKHRbMF0pLHYobmV3IHVjKHYociksdCkpKSk7Y2xhc3MgWSBleHRlbmRzIGR0e3N0YXRpYyBnZXQgdHlwZSgpe3JldHVybiJPcGVyYXRvck5vZGUifWNvbnN0cnVjdG9yKHQsZSxzLC4uLm4pe2lmKHN1cGVyKCksbi5sZW5ndGg+MCl7bGV0IGk9bmV3IFkodCxlLHMpO2ZvcihsZXQgbz0wO288bi5sZW5ndGgtMTtvKyspaT1uZXcgWSh0LGksbltvXSk7ZT1pLHM9bltuLmxlbmd0aC0xXX10aGlzLm9wPXQsdGhpcy5hTm9kZT1lLHRoaXMuYk5vZGU9c31nZXROb2RlVHlwZSh0LGUpe2NvbnN0IHM9dGhpcy5vcCxuPXRoaXMuYU5vZGUsaT10aGlzLmJOb2RlLG89bi5nZXROb2RlVHlwZSh0KSxhPXR5cGVvZiBpPCJ1Ij9pLmdldE5vZGVUeXBlKHQpOm51bGw7aWYobz09PSJ2b2lkInx8YT09PSJ2b2lkIilyZXR1cm4idm9pZCI7aWYocz09PSIlIilyZXR1cm4gbztpZihzPT09In4ifHxzPT09IiYifHxzPT09InwifHxzPT09Il4ifHxzPT09Ij4+Inx8cz09PSI8PCIpcmV0dXJuIHQuZ2V0SW50ZWdlclR5cGUobyk7aWYocz09PSIhInx8cz09PSI9PSJ8fHM9PT0iJiYifHxzPT09Inx8Inx8cz09PSJeXiIpcmV0dXJuImJvb2wiO2lmKHM9PT0iPCJ8fHM9PT0iPiJ8fHM9PT0iPD0ifHxzPT09Ij49Iil7Y29uc3QgYz1lP3QuZ2V0VHlwZUxlbmd0aChlKTpNYXRoLm1heCh0LmdldFR5cGVMZW5ndGgobyksdC5nZXRUeXBlTGVuZ3RoKGEpKTtyZXR1cm4gYz4xP2BidmVjJHtjfWA6ImJvb2wifWVsc2UgcmV0dXJuIG89PT0iZmxvYXQiJiZ0LmlzTWF0cml4KGEpP2E6dC5pc01hdHJpeChvKSYmdC5pc1ZlY3RvcihhKT90LmdldFZlY3RvckZyb21NYXRyaXgobyk6dC5pc1ZlY3RvcihvKSYmdC5pc01hdHJpeChhKT90LmdldFZlY3RvckZyb21NYXRyaXgoYSk6dC5nZXRUeXBlTGVuZ3RoKGEpPnQuZ2V0VHlwZUxlbmd0aChvKT9hOm99Z2VuZXJhdGUodCxlKXtjb25zdCBzPXRoaXMub3Asbj10aGlzLmFOb2RlLGk9dGhpcy5iTm9kZSxvPXRoaXMuZ2V0Tm9kZVR5cGUodCxlKTtsZXQgYT1udWxsLGM9bnVsbDtvIT09InZvaWQiPyhhPW4uZ2V0Tm9kZVR5cGUodCksYz10eXBlb2YgaTwidSI/aS5nZXROb2RlVHlwZSh0KTpudWxsLHM9PT0iPCJ8fHM9PT0iPiJ8fHM9PT0iPD0ifHxzPT09Ij49Inx8cz09PSI9PSI/dC5pc1ZlY3RvcihhKT9jPWE6YSE9PWMmJihhPWM9ImZsb2F0Iik6cz09PSI+PiJ8fHM9PT0iPDwiPyhhPW8sYz10LmNoYW5nZUNvbXBvbmVudFR5cGUoYywidWludCIpKTp0LmlzTWF0cml4KGEpJiZ0LmlzVmVjdG9yKGMpP2M9dC5nZXRWZWN0b3JGcm9tTWF0cml4KGEpOnQuaXNWZWN0b3IoYSkmJnQuaXNNYXRyaXgoYyk/YT10LmdldFZlY3RvckZyb21NYXRyaXgoYyk6YT1jPW8pOmE9Yz1vO2NvbnN0IHU9bi5idWlsZCh0LGEpLGg9dHlwZW9mIGk8InUiP2kuYnVpbGQodCxjKTpudWxsLGw9dC5nZXRUeXBlTGVuZ3RoKGUpLGQ9dC5nZXRGdW5jdGlvbk9wZXJhdG9yKHMpO2lmKGUhPT0idm9pZCIpcmV0dXJuIHM9PT0iPCImJmw+MT90LnVzZUNvbXBhcmlzb25NZXRob2Q/dC5mb3JtYXQoYCR7dC5nZXRNZXRob2QoImxlc3NUaGFuIixlKX0oICR7dX0sICR7aH0gKWAsbyxlKTp0LmZvcm1hdChgKCAke3V9IDwgJHtofSApYCxvLGUpOnM9PT0iPD0iJiZsPjE/dC51c2VDb21wYXJpc29uTWV0aG9kP3QuZm9ybWF0KGAke3QuZ2V0TWV0aG9kKCJsZXNzVGhhbkVxdWFsIixlKX0oICR7dX0sICR7aH0gKWAsbyxlKTp0LmZvcm1hdChgKCAke3V9IDw9ICR7aH0gKWAsbyxlKTpzPT09Ij4iJiZsPjE/dC51c2VDb21wYXJpc29uTWV0aG9kP3QuZm9ybWF0KGAke3QuZ2V0TWV0aG9kKCJncmVhdGVyVGhhbiIsZSl9KCAke3V9LCAke2h9IClgLG8sZSk6dC5mb3JtYXQoYCggJHt1fSA+ICR7aH0gKWAsbyxlKTpzPT09Ij49IiYmbD4xP3QudXNlQ29tcGFyaXNvbk1ldGhvZD90LmZvcm1hdChgJHt0LmdldE1ldGhvZCgiZ3JlYXRlclRoYW5FcXVhbCIsZSl9KCAke3V9LCAke2h9IClgLG8sZSk6dC5mb3JtYXQoYCggJHt1fSA+PSAke2h9IClgLG8sZSk6cz09PSIhInx8cz09PSJ+Ij90LmZvcm1hdChgKCR7c30ke3V9KWAsYSxlKTpkP3QuZm9ybWF0KGAke2R9KCAke3V9LCAke2h9IClgLG8sZSk6dC5mb3JtYXQoYCggJHt1fSAke3N9ICR7aH0gKWAsbyxlKTtpZihhIT09InZvaWQiKXJldHVybiBkP3QuZm9ybWF0KGAke2R9KCAke3V9LCAke2h9IClgLG8sZSk6dC5mb3JtYXQoYCR7dX0gJHtzfSAke2h9YCxvLGUpfXNlcmlhbGl6ZSh0KXtzdXBlci5zZXJpYWxpemUodCksdC5vcD10aGlzLm9wfWRlc2VyaWFsaXplKHQpe3N1cGVyLmRlc2VyaWFsaXplKHQpLHRoaXMub3A9dC5vcH19Y29uc3QgZmU9QyhZLCIrIiksJHM9QyhZLCItIiksR3M9QyhZLCIqIiksUHI9QyhZLCIvIiksTHI9QyhZLCIlIiksbGM9QyhZLCI9PSIpLGRjPUMoWSwiIT0iKSxmYz1DKFksIjwiKSxwYz1DKFksIj4iKSxtYz1DKFksIjw9IikseWM9QyhZLCI+PSIpLGdjPUMoWSwiJiYiKSx4Yz1DKFksInx8IiksVGM9QyhZLCIhIiksTmM9QyhZLCJeXiIpLHdjPUMoWSwiJiIpLEFjPUMoWSwifiIpLE1jPUMoWSwifCIpLFNjPUMoWSwiXiIpLF9jPUMoWSwiPDwiKSx6Yz1DKFksIj4+Iik7YigiYWRkIixmZSksYigic3ViIiwkcyksYigibXVsIixHcyksYigiZGl2IixQciksYigibW9kSW50IixMciksYigiZXF1YWwiLGxjKSxiKCJub3RFcXVhbCIsZGMpLGIoImxlc3NUaGFuIixmYyksYigiZ3JlYXRlclRoYW4iLHBjKSxiKCJsZXNzVGhhbkVxdWFsIixtYyksYigiZ3JlYXRlclRoYW5FcXVhbCIseWMpLGIoImFuZCIsZ2MpLGIoIm9yIix4YyksYigibm90IixUYyksYigieG9yIixOYyksYigiYml0QW5kIix3YyksYigiYml0Tm90IixBYyksYigiYml0T3IiLE1jKSxiKCJiaXRYb3IiLFNjKSxiKCJzaGlmdExlZnQiLF9jKSxiKCJzaGlmdFJpZ2h0Iix6YyksYigicmVtYWluZGVyIiwoLi4ucik9Pihjb25zb2xlLndhcm4oIlRTTC5PcGVyYXRvck5vZGU6IC5yZW1haW5kZXIoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5tb2RJbnQoKS4iKSxMciguLi5yKSkpO2NsYXNzIHggZXh0ZW5kcyBkdHtzdGF0aWMgZ2V0IHR5cGUoKXtyZXR1cm4iTWF0aE5vZGUifWNvbnN0cnVjdG9yKHQsZSxzPW51bGwsbj1udWxsKXtzdXBlcigpLHRoaXMubWV0aG9kPXQsdGhpcy5hTm9kZT1lLHRoaXMuYk5vZGU9cyx0aGlzLmNOb2RlPW59Z2V0SW5wdXRUeXBlKHQpe2NvbnN0IGU9dGhpcy5hTm9kZS5nZXROb2RlVHlwZSh0KSxzPXRoaXMuYk5vZGU/dGhpcy5iTm9kZS5nZXROb2RlVHlwZSh0KTpudWxsLG49dGhpcy5jTm9kZT90aGlzLmNOb2RlLmdldE5vZGVUeXBlKHQpOm51bGwsaT10LmlzTWF0cml4KGUpPzA6dC5nZXRUeXBlTGVuZ3RoKGUpLG89dC5pc01hdHJpeChzKT8wOnQuZ2V0VHlwZUxlbmd0aChzKSxhPXQuaXNNYXRyaXgobik/MDp0LmdldFR5cGVMZW5ndGgobik7cmV0dXJuIGk+byYmaT5hP2U6bz5hP3M6YT5pP246ZX1nZXROb2RlVHlwZSh0KXtjb25zdCBlPXRoaXMubWV0aG9kO3JldHVybiBlPT09eC5MRU5HVEh8fGU9PT14LkRJU1RBTkNFfHxlPT09eC5ET1Q/ImZsb2F0IjplPT09eC5DUk9TUz8idmVjMyI6ZT09PXguQUxMPyJib29sIjplPT09eC5FUVVBTFM/dC5jaGFuZ2VDb21wb25lbnRUeXBlKHRoaXMuYU5vZGUuZ2V0Tm9kZVR5cGUodCksImJvb2wiKTplPT09eC5NT0Q/dGhpcy5hTm9kZS5nZXROb2RlVHlwZSh0KTp0aGlzLmdldElucHV0VHlwZSh0KX1nZW5lcmF0ZSh0LGUpe2NvbnN0IHM9dGhpcy5tZXRob2Qsbj10aGlzLmdldE5vZGVUeXBlKHQpLGk9dGhpcy5nZXRJbnB1dFR5cGUodCksbz10aGlzLmFOb2RlLGE9dGhpcy5iTm9kZSxjPXRoaXMuY05vZGUsdT10LnJlbmRlcmVyLmlzV2ViR0xSZW5kZXJlcj09PSEwO2lmKHM9PT14LlRSQU5TRk9STV9ESVJFQ1RJT04pe2xldCBoPW8sbD1hO3QuaXNNYXRyaXgoaC5nZXROb2RlVHlwZSh0KSk/bD1CZShrKGwpLDApOmg9QmUoayhoKSwwKTtjb25zdCBkPUdzKGgsbCkueHl6O3JldHVybiBPcihkKS5idWlsZCh0LGUpfWVsc2V7aWYocz09PXguTkVHQVRFKXJldHVybiB0LmZvcm1hdCgiKCAtICIrby5idWlsZCh0LGkpKyIgKSIsbixlKTtpZihzPT09eC5PTkVfTUlOVVMpcmV0dXJuICRzKDEsbykuYnVpbGQodCxlKTtpZihzPT09eC5SRUNJUFJPQ0FMKXJldHVybiBQcigxLG8pLmJ1aWxkKHQsZSk7aWYocz09PXguRElGRkVSRU5DRSlyZXR1cm4gb2koJHMobyxhKSkuYnVpbGQodCxlKTt7Y29uc3QgaD1bXTtyZXR1cm4gcz09PXguQ1JPU1N8fHM9PT14Lk1PRD9oLnB1c2goby5idWlsZCh0LG4pLGEuYnVpbGQodCxuKSk6dSYmcz09PXguU1RFUD9oLnB1c2goby5idWlsZCh0LHQuZ2V0VHlwZUxlbmd0aChvLmdldE5vZGVUeXBlKHQpKT09PTE/ImZsb2F0IjppKSxhLmJ1aWxkKHQsaSkpOnUmJihzPT09eC5NSU58fHM9PT14Lk1BWCl8fHM9PT14Lk1PRD9oLnB1c2goby5idWlsZCh0LGkpLGEuYnVpbGQodCx0LmdldFR5cGVMZW5ndGgoYS5nZXROb2RlVHlwZSh0KSk9PT0xPyJmbG9hdCI6aSkpOnM9PT14LlJFRlJBQ1Q/aC5wdXNoKG8uYnVpbGQodCxpKSxhLmJ1aWxkKHQsaSksYy5idWlsZCh0LCJmbG9hdCIpKTpzPT09eC5NSVg/aC5wdXNoKG8uYnVpbGQodCxpKSxhLmJ1aWxkKHQsaSksYy5idWlsZCh0LHQuZ2V0VHlwZUxlbmd0aChjLmdldE5vZGVUeXBlKHQpKT09PTE/ImZsb2F0IjppKSk6KGgucHVzaChvLmJ1aWxkKHQsaSkpLGEhPT1udWxsJiZoLnB1c2goYS5idWlsZCh0LGkpKSxjIT09bnVsbCYmaC5wdXNoKGMuYnVpbGQodCxpKSkpLHQuZm9ybWF0KGAke3QuZ2V0TWV0aG9kKHMsbil9KCAke2guam9pbigiLCAiKX0gKWAsbixlKX19fXNlcmlhbGl6ZSh0KXtzdXBlci5zZXJpYWxpemUodCksdC5tZXRob2Q9dGhpcy5tZXRob2R9ZGVzZXJpYWxpemUodCl7c3VwZXIuZGVzZXJpYWxpemUodCksdGhpcy5tZXRob2Q9dC5tZXRob2R9fXguQUxMPSJhbGwiLHguQU5ZPSJhbnkiLHguRVFVQUxTPSJlcXVhbHMiLHguUkFESUFOUz0icmFkaWFucyIseC5ERUdSRUVTPSJkZWdyZWVzIix4LkVYUD0iZXhwIix4LkVYUDI9ImV4cDIiLHguTE9HPSJsb2ciLHguTE9HMj0ibG9nMiIseC5TUVJUPSJzcXJ0Iix4LklOVkVSU0VfU1FSVD0iaW52ZXJzZXNxcnQiLHguRkxPT1I9ImZsb29yIix4LkNFSUw9ImNlaWwiLHguTk9STUFMSVpFPSJub3JtYWxpemUiLHguRlJBQ1Q9ImZyYWN0Iix4LlNJTj0ic2luIix4LkNPUz0iY29zIix4LlRBTj0idGFuIix4LkFTSU49ImFzaW4iLHguQUNPUz0iYWNvcyIseC5BVEFOPSJhdGFuIix4LkFCUz0iYWJzIix4LlNJR049InNpZ24iLHguTEVOR1RIPSJsZW5ndGgiLHguTkVHQVRFPSJuZWdhdGUiLHguT05FX01JTlVTPSJvbmVNaW51cyIseC5ERkRYPSJkRmR4Iix4LkRGRFk9ImRGZHkiLHguUk9VTkQ9InJvdW5kIix4LlJFQ0lQUk9DQUw9InJlY2lwcm9jYWwiLHguVFJVTkM9InRydW5jIix4LkZXSURUSD0iZndpZHRoIix4LkJJVENBU1Q9ImJpdGNhc3QiLHguVFJBTlNQT1NFPSJ0cmFuc3Bvc2UiLHguQVRBTjI9ImF0YW4yIix4Lk1JTj0ibWluIix4Lk1BWD0ibWF4Iix4Lk1PRD0ibW9kIix4LlNURVA9InN0ZXAiLHguUkVGTEVDVD0icmVmbGVjdCIseC5ESVNUQU5DRT0iZGlzdGFuY2UiLHguRElGRkVSRU5DRT0iZGlmZmVyZW5jZSIseC5ET1Q9ImRvdCIseC5DUk9TUz0iY3Jvc3MiLHguUE9XPSJwb3ciLHguVFJBTlNGT1JNX0RJUkVDVElPTj0idHJhbnNmb3JtRGlyZWN0aW9uIix4Lk1JWD0ibWl4Iix4LkNMQU1QPSJjbGFtcCIseC5SRUZSQUNUPSJyZWZyYWN0Iix4LlNNT09USFNURVA9InNtb290aHN0ZXAiLHguRkFDRUZPUldBUkQ9ImZhY2Vmb3J3YXJkIjtjb25zdCBiYz1xKE1hdGguUEkpLEVjPUMoeCx4LkFMTCksQ2M9Qyh4LHguQU5ZKSxGYz1DKHgseC5FUVVBTFMpLFJjPUMoeCx4LlJBRElBTlMpLEJjPUMoeCx4LkRFR1JFRVMpLEljPUMoeCx4LkVYUCksdmM9Qyh4LHguRVhQMiksUGM9Qyh4LHguTE9HKSxMYz1DKHgseC5MT0cyKSxpaT1DKHgseC5TUVJUKSxPYz1DKHgseC5JTlZFUlNFX1NRUlQpLERjPUMoeCx4LkZMT09SKSxWYz1DKHgseC5DRUlMKSxPcj1DKHgseC5OT1JNQUxJWkUpLHJpPUMoeCx4LkZSQUNUKSxEcj1DKHgseC5TSU4pLFVjPUMoeCx4LkNPUyksa2M9Qyh4LHguVEFOKSxIYz1DKHgseC5BU0lOKSxxYz1DKHgseC5BQ09TKSwkYz1DKHgseC5BVEFOKSxvaT1DKHgseC5BQlMpLFZyPUMoeCx4LlNJR04pLEdjPUMoeCx4LkxFTkdUSCksV2M9Qyh4LHguTkVHQVRFKSxYYz1DKHgseC5PTkVfTUlOVVMpLFljPUMoeCx4LkRGRFgpLFpjPUMoeCx4LkRGRFkpLEpjPUMoeCx4LlJPVU5EKSxqYz1DKHgseC5SRUNJUFJPQ0FMKSxRYz1DKHgseC5UUlVOQyksS2M9Qyh4LHguRldJRFRIKTt4LkJJVENBU1Q7Y29uc3QgdGg9Qyh4LHguVFJBTlNQT1NFKSxlaD1DKHgseC5BVEFOMiksc2g9Qyh4LHguTUlOKSxhaT1DKHgseC5NQVgpLFVyPUMoeCx4Lk1PRCksa3I9Qyh4LHguU1RFUCksbmg9Qyh4LHguUkVGTEVDVCksaWg9Qyh4LHguRElTVEFOQ0UpLHJoPUMoeCx4LkRJRkZFUkVOQ0UpLGNpPUMoeCx4LkRPVCksb2g9Qyh4LHguQ1JPU1MpLEhyPUMoeCx4LlBPVyksYWg9Qyh4LHguUE9XLDIpLGNoPUMoeCx4LlBPVywzKSxoaD1DKHgseC5QT1csNCksdWg9Qyh4LHguVFJBTlNGT1JNX0RJUkVDVElPTiksbGg9cj0+R3MoVnIociksSHIob2kociksMS8zKSksZGg9cj0+Y2kocixyKSxyZT1DKHgseC5NSVgpLFdzPShyLHQ9MCxlPTEpPT52KG5ldyB4KHguQ0xBTVAsdihyKSx2KHQpLHYoZSkpKSxmaD1yPT5XcyhyKSxwaD1DKHgseC5SRUZSQUNUKSxoaT1DKHgseC5TTU9PVEhTVEVQKSxtaD1DKHgseC5GQUNFRk9SV0FSRCkseWg9dHQoKFtyXSk9Pntjb25zdCBzPTQzNzU4LjU0NTMsbj1jaShyLnh5LEQoMTIuOTg5OCw3OC4yMzMpKSxpPVVyKG4sYmMpO3JldHVybiByaShEcihpKS5tdWwocykpfSksZ2g9KHIsdCxlKT0+cmUodCxlLHIpLHhoPShyLHQsZSk9PmhpKHQsZSxyKTtiKCJhbGwiLEVjKSxiKCJhbnkiLENjKSxiKCJlcXVhbHMiLEZjKSxiKCJyYWRpYW5zIixSYyksYigiZGVncmVlcyIsQmMpLGIoImV4cCIsSWMpLGIoImV4cDIiLHZjKSxiKCJsb2ciLFBjKSxiKCJsb2cyIixMYyksYigic3FydCIsaWkpLGIoImludmVyc2VTcXJ0IixPYyksYigiZmxvb3IiLERjKSxiKCJjZWlsIixWYyksYigibm9ybWFsaXplIixPciksYigiZnJhY3QiLHJpKSxiKCJzaW4iLERyKSxiKCJjb3MiLFVjKSxiKCJ0YW4iLGtjKSxiKCJhc2luIixIYyksYigiYWNvcyIscWMpLGIoImF0YW4iLCRjKSxiKCJhYnMiLG9pKSxiKCJzaWduIixWciksYigibGVuZ3RoIixHYyksYigibGVuZ3RoU3EiLGRoKSxiKCJuZWdhdGUiLFdjKSxiKCJvbmVNaW51cyIsWGMpLGIoImRGZHgiLFljKSxiKCJkRmR5IixaYyksYigicm91bmQiLEpjKSxiKCJyZWNpcHJvY2FsIixqYyksYigidHJ1bmMiLFFjKSxiKCJmd2lkdGgiLEtjKSxiKCJhdGFuMiIsZWgpLGIoIm1pbiIsc2gpLGIoIm1heCIsYWkpLGIoIm1vZCIsVXIpLGIoInN0ZXAiLGtyKSxiKCJyZWZsZWN0IixuaCksYigiZGlzdGFuY2UiLGloKSxiKCJkb3QiLGNpKSxiKCJjcm9zcyIsb2gpLGIoInBvdyIsSHIpLGIoInBvdzIiLGFoKSxiKCJwb3czIixjaCksYigicG93NCIsaGgpLGIoInRyYW5zZm9ybURpcmVjdGlvbiIsdWgpLGIoIm1peCIsZ2gpLGIoImNsYW1wIixXcyksYigicmVmcmFjdCIscGgpLGIoInNtb290aHN0ZXAiLHhoKSxiKCJmYWNlRm9yd2FyZCIsbWgpLGIoImRpZmZlcmVuY2UiLHJoKSxiKCJzYXR1cmF0ZSIsZmgpLGIoImNicnQiLGxoKSxiKCJ0cmFuc3Bvc2UiLHRoKSxiKCJyYW5kIix5aCk7Y2xhc3MgVGggZXh0ZW5kcyBVe3N0YXRpYyBnZXQgdHlwZSgpe3JldHVybiJDb25kaXRpb25hbE5vZGUifWNvbnN0cnVjdG9yKHQsZSxzPW51bGwpe3N1cGVyKCksdGhpcy5jb25kTm9kZT10LHRoaXMuaWZOb2RlPWUsdGhpcy5lbHNlTm9kZT1zfWdldE5vZGVUeXBlKHQpe2NvbnN0IGU9dGhpcy5pZk5vZGUuZ2V0Tm9kZVR5cGUodCk7aWYodGhpcy5lbHNlTm9kZSE9PW51bGwpe2NvbnN0IHM9dGhpcy5lbHNlTm9kZS5nZXROb2RlVHlwZSh0KTtpZih0LmdldFR5cGVMZW5ndGgocyk+dC5nZXRUeXBlTGVuZ3RoKGUpKXJldHVybiBzfXJldHVybiBlfXNldHVwKHQpe2NvbnN0IGU9dGhpcy5jb25kTm9kZS5jYWNoZSgpLHM9dGhpcy5pZk5vZGUuY2FjaGUoKSxuPXRoaXMuZWxzZU5vZGU/dGhpcy5lbHNlTm9kZS5jYWNoZSgpOm51bGwsaT10LmNvbnRleHQubm9kZUJsb2NrO3QuZ2V0RGF0YUZyb21Ob2RlKHMpLnBhcmVudE5vZGVCbG9jaz1pLG4hPT1udWxsJiYodC5nZXREYXRhRnJvbU5vZGUobikucGFyZW50Tm9kZUJsb2NrPWkpO2NvbnN0IG89dC5nZXROb2RlUHJvcGVydGllcyh0aGlzKTtvLmNvbmROb2RlPWUsby5pZk5vZGU9cy5jb250ZXh0KHtub2RlQmxvY2s6c30pLG8uZWxzZU5vZGU9bj9uLmNvbnRleHQoe25vZGVCbG9jazpufSk6bnVsbH1nZW5lcmF0ZSh0LGUpe2NvbnN0IHM9dGhpcy5nZXROb2RlVHlwZSh0KSxuPXQuZ2V0RGF0YUZyb21Ob2RlKHRoaXMpO2lmKG4ubm9kZVByb3BlcnR5IT09dm9pZCAwKXJldHVybiBuLm5vZGVQcm9wZXJ0eTtjb25zdHtjb25kTm9kZTppLGlmTm9kZTpvLGVsc2VOb2RlOmF9PXQuZ2V0Tm9kZVByb3BlcnRpZXModGhpcyksYz1lIT09InZvaWQiLHU9Yz92ZShzKS5idWlsZCh0KToiIjtuLm5vZGVQcm9wZXJ0eT11O2NvbnN0IGg9aS5idWlsZCh0LCJib29sIik7dC5hZGRGbG93Q29kZShgCiR7dC50YWJ9aWYgKCAke2h9ICkgewoKYCkuYWRkRmxvd1RhYigpO2xldCBsPW8uYnVpbGQodCxzKTtpZihsJiYoYz9sPXUrIiA9ICIrbCsiOyI6bD0icmV0dXJuICIrbCsiOyIpLHQucmVtb3ZlRmxvd1RhYigpLmFkZEZsb3dDb2RlKHQudGFiKyIJIitsK2AKCmArdC50YWIrIn0iKSxhIT09bnVsbCl7dC5hZGRGbG93Q29kZShgIGVsc2UgewoKYCkuYWRkRmxvd1RhYigpO2xldCBkPWEuYnVpbGQodCxzKTtkJiYoYz9kPXUrIiA9ICIrZCsiOyI6ZD0icmV0dXJuICIrZCsiOyIpLHQucmVtb3ZlRmxvd1RhYigpLmFkZEZsb3dDb2RlKHQudGFiKyIJIitkK2AKCmArdC50YWIrYH0KCmApfWVsc2UgdC5hZGRGbG93Q29kZShgCgpgKTtyZXR1cm4gdC5mb3JtYXQodSxzLGUpfX1jb25zdCB1aT1DKFRoKTtiKCJzZWxlY3QiLHVpKSxiKCJjb25kIiwoLi4ucik9Pihjb25zb2xlLndhcm4oIlRTTC5Db25kaXRpb25hbE5vZGU6IGNvbmQoKSBoYXMgYmVlbiByZW5hbWVkIHRvIHNlbGVjdCgpLiIpLHVpKC4uLnIpKSk7Y2xhc3MgTmggZXh0ZW5kcyBVe3N0YXRpYyBnZXQgdHlwZSgpe3JldHVybiJDb250ZXh0Tm9kZSJ9Y29uc3RydWN0b3IodCxlPXt9KXtzdXBlcigpLHRoaXMuaXNDb250ZXh0Tm9kZT0hMCx0aGlzLm5vZGU9dCx0aGlzLnZhbHVlPWV9Z2V0U2NvcGUoKXtyZXR1cm4gdGhpcy5ub2RlLmdldFNjb3BlKCl9Z2V0Tm9kZVR5cGUodCl7cmV0dXJuIHRoaXMubm9kZS5nZXROb2RlVHlwZSh0KX1hbmFseXplKHQpe3RoaXMubm9kZS5idWlsZCh0KX1zZXR1cCh0KXtjb25zdCBlPXQuZ2V0Q29udGV4dCgpO3Quc2V0Q29udGV4dCh7Li4udC5jb250ZXh0LC4uLnRoaXMudmFsdWV9KTtjb25zdCBzPXRoaXMubm9kZS5idWlsZCh0KTtyZXR1cm4gdC5zZXRDb250ZXh0KGUpLHN9Z2VuZXJhdGUodCxlKXtjb25zdCBzPXQuZ2V0Q29udGV4dCgpO3Quc2V0Q29udGV4dCh7Li4udC5jb250ZXh0LC4uLnRoaXMudmFsdWV9KTtjb25zdCBuPXRoaXMubm9kZS5idWlsZCh0LGUpO3JldHVybiB0LnNldENvbnRleHQocyksbn19Y29uc3QgcXI9QyhOaCksd2g9KHIsdCk9PnFyKHIse2xhYmVsOnR9KTtiKCJjb250ZXh0IixxciksYigibGFiZWwiLHdoKTtjbGFzcyBBaCBleHRlbmRzIFV7c3RhdGljIGdldCB0eXBlKCl7cmV0dXJuIlZhck5vZGUifWNvbnN0cnVjdG9yKHQsZT1udWxsKXtzdXBlcigpLHRoaXMubm9kZT10LHRoaXMubmFtZT1lLHRoaXMuZ2xvYmFsPSEwLHRoaXMuaXNWYXJOb2RlPSEwfWdldEhhc2godCl7cmV0dXJuIHRoaXMubmFtZXx8c3VwZXIuZ2V0SGFzaCh0KX1nZXROb2RlVHlwZSh0KXtyZXR1cm4gdGhpcy5ub2RlLmdldE5vZGVUeXBlKHQpfWdlbmVyYXRlKHQpe2NvbnN0e25vZGU6ZSxuYW1lOnN9PXRoaXMsbj10LmdldFZhckZyb21Ob2RlKHRoaXMscyx0LmdldFZlY3RvclR5cGUodGhpcy5nZXROb2RlVHlwZSh0KSkpLGk9dC5nZXRQcm9wZXJ0eU5hbWUobiksbz1lLmJ1aWxkKHQsbi50eXBlKTtyZXR1cm4gdC5hZGRMaW5lRmxvd0NvZGUoYCR7aX0gPSAke299YCx0aGlzKSxpfX1jb25zdCAkcj1DKEFoKTtiKCJ0ZW1wIiwkciksYigidG9WYXIiLCguLi5yKT0+JHIoLi4ucikuYXBwZW5kKCkpO2NsYXNzIE1oIGV4dGVuZHMgVXtzdGF0aWMgZ2V0IHR5cGUoKXtyZXR1cm4iVmFyeWluZ05vZGUifWNvbnN0cnVjdG9yKHQsZT1udWxsKXtzdXBlcigpLHRoaXMubm9kZT10LHRoaXMubmFtZT1lLHRoaXMuaXNWYXJ5aW5nTm9kZT0hMH1pc0dsb2JhbCgpe3JldHVybiEwfWdldEhhc2godCl7cmV0dXJuIHRoaXMubmFtZXx8c3VwZXIuZ2V0SGFzaCh0KX1nZXROb2RlVHlwZSh0KXtyZXR1cm4gdGhpcy5ub2RlLmdldE5vZGVUeXBlKHQpfXNldHVwVmFyeWluZyh0KXtjb25zdCBlPXQuZ2V0Tm9kZVByb3BlcnRpZXModGhpcyk7bGV0IHM9ZS52YXJ5aW5nO2lmKHM9PT12b2lkIDApe2NvbnN0IG49dGhpcy5uYW1lLGk9dGhpcy5nZXROb2RlVHlwZSh0KTtlLnZhcnlpbmc9cz10LmdldFZhcnlpbmdGcm9tTm9kZSh0aGlzLG4saSksZS5ub2RlPXRoaXMubm9kZX1yZXR1cm4gcy5uZWVkc0ludGVycG9sYXRpb258fChzLm5lZWRzSW50ZXJwb2xhdGlvbj10LnNoYWRlclN0YWdlPT09ImZyYWdtZW50Iiksc31zZXR1cCh0KXt0aGlzLnNldHVwVmFyeWluZyh0KX1hbmFseXplKHQpe3JldHVybiB0aGlzLnNldHVwVmFyeWluZyh0KSx0aGlzLm5vZGUuYW5hbHl6ZSh0KX1nZW5lcmF0ZSh0KXtjb25zdCBlPXQuZ2V0Tm9kZVByb3BlcnRpZXModGhpcykscz10aGlzLnNldHVwVmFyeWluZyh0KTtpZihlLnByb3BlcnR5TmFtZT09PXZvaWQgMCl7Y29uc3Qgbj10aGlzLmdldE5vZGVUeXBlKHQpLGk9dC5nZXRQcm9wZXJ0eU5hbWUocyx3ci5WRVJURVgpO3QuZmxvd05vZGVGcm9tU2hhZGVyU3RhZ2Uod3IuVkVSVEVYLHRoaXMubm9kZSxuLGkpLGUucHJvcGVydHlOYW1lPWl9cmV0dXJuIHQuZ2V0UHJvcGVydHlOYW1lKHMpfX1jb25zdCBQZT1DKE1oKTtiKCJ2YXJ5aW5nIixQZSk7Y29uc3QgcnM9IldvcmtpbmdDb2xvclNwYWNlIixsaT0iT3V0cHV0Q29sb3JTcGFjZSI7ZnVuY3Rpb24gR3Iocil7bGV0IHQ9bnVsbDtyZXR1cm4gcj09PUVzP3Q9IkxpbmVhciI6cj09PSR0JiYodD0ic1JHQiIpLHR9ZnVuY3Rpb24gU2gocix0KXtyZXR1cm4gR3IocikrIlRvIitHcih0KX1jbGFzcyBYcyBleHRlbmRzIGR0e3N0YXRpYyBnZXQgdHlwZSgpe3JldHVybiJDb2xvclNwYWNlTm9kZSJ9Y29uc3RydWN0b3IodCxlLHMpe3N1cGVyKCJ2ZWM0IiksdGhpcy5jb2xvck5vZGU9dCx0aGlzLnNvdXJjZT1lLHRoaXMudGFyZ2V0PXN9Z2V0Q29sb3JTcGFjZSh0LGUpe3JldHVybiBlPT09cnM/bXQud29ya2luZ0NvbG9yU3BhY2U6ZT09PWxpP3QuY29udGV4dC5vdXRwdXRDb2xvclNwYWNlfHx0LnJlbmRlcmVyLm91dHB1dENvbG9yU3BhY2U6ZX1zZXR1cCh0KXtjb25zdHtyZW5kZXJlcjplfT10LHtjb2xvck5vZGU6c309dGhpcyxuPXRoaXMuZ2V0Q29sb3JTcGFjZSh0LHRoaXMuc291cmNlKSxpPXRoaXMuZ2V0Q29sb3JTcGFjZSh0LHRoaXMudGFyZ2V0KTtpZihuPT09aSlyZXR1cm4gcztjb25zdCBvPVNoKG4saSk7bGV0IGE9bnVsbDtjb25zdCBjPWUubm9kZXMubGlicmFyeS5nZXRDb2xvclNwYWNlRnVuY3Rpb24obyk7cmV0dXJuIGMhPT1udWxsP2E9QmUoYyhzLnJnYikscy5hKTooY29uc29sZS5lcnJvcigiQ29sb3JTcGFjZU5vZGU6IFVuc3VwcG9ydGVkIENvbG9yIFNwYWNlIGNvbmZpZ3VyYXRpb24uIixvKSxhPXMpLGF9fWNvbnN0IF9oPXI9PnYobmV3IFhzKHYocikscnMsbGkpKSx6aD1yPT52KG5ldyBYcyh2KHIpLGxpLHJzKSksYmg9KHIsdCk9PnYobmV3IFhzKHYocikscnMsdCkpLFdyPShyLHQpPT52KG5ldyBYcyh2KHIpLHQscnMpKTtiKCJ0b091dHB1dENvbG9yU3BhY2UiLF9oKSxiKCJ0b1dvcmtpbmdDb2xvclNwYWNlIix6aCksYigid29ya2luZ1RvQ29sb3JTcGFjZSIsYmgpLGIoImNvbG9yU3BhY2VUb1dvcmtpbmciLFdyKTtsZXQgRWg9Y2xhc3MgZXh0ZW5kcyBpc3tzdGF0aWMgZ2V0IHR5cGUoKXtyZXR1cm4iUmVmZXJlbmNlRWxlbWVudE5vZGUifWNvbnN0cnVjdG9yKHQsZSl7c3VwZXIodCxlKSx0aGlzLnJlZmVyZW5jZU5vZGU9dCx0aGlzLmlzUmVmZXJlbmNlRWxlbWVudE5vZGU9ITB9Z2V0Tm9kZVR5cGUoKXtyZXR1cm4gdGhpcy5yZWZlcmVuY2VOb2RlLnVuaWZvcm1UeXBlfWdlbmVyYXRlKHQpe2NvbnN0IGU9c3VwZXIuZ2VuZXJhdGUodCkscz10aGlzLnJlZmVyZW5jZU5vZGUuZ2V0Tm9kZVR5cGUoKSxuPXRoaXMuZ2V0Tm9kZVR5cGUoKTtyZXR1cm4gdC5mb3JtYXQoZSxzLG4pfX07Y2xhc3MgQ2ggZXh0ZW5kcyBVe3N0YXRpYyBnZXQgdHlwZSgpe3JldHVybiJSZWZlcmVuY2VCYXNlTm9kZSJ9Y29uc3RydWN0b3IodCxlLHM9bnVsbCxuPW51bGwpe3N1cGVyKCksdGhpcy5wcm9wZXJ0eT10LHRoaXMudW5pZm9ybVR5cGU9ZSx0aGlzLm9iamVjdD1zLHRoaXMuY291bnQ9bix0aGlzLnByb3BlcnRpZXM9dC5zcGxpdCgiLiIpLHRoaXMucmVmZXJlbmNlPXMsdGhpcy5ub2RlPW51bGwsdGhpcy5ncm91cD1udWxsLHRoaXMudXBkYXRlVHlwZT1RLk9CSkVDVH1zZXRHcm91cCh0KXtyZXR1cm4gdGhpcy5ncm91cD10LHRoaXN9ZWxlbWVudCh0KXtyZXR1cm4gdihuZXcgRWgodGhpcyx2KHQpKSl9c2V0Tm9kZVR5cGUodCl7Y29uc3QgZT14dChudWxsLHQpLmdldFNlbGYoKTt0aGlzLmdyb3VwIT09bnVsbCYmZS5zZXRHcm91cCh0aGlzLmdyb3VwKSx0aGlzLm5vZGU9ZX1nZXROb2RlVHlwZSh0KXtyZXR1cm4gdGhpcy5ub2RlPT09bnVsbCYmKHRoaXMudXBkYXRlUmVmZXJlbmNlKHQpLHRoaXMudXBkYXRlVmFsdWUoKSksdGhpcy5ub2RlLmdldE5vZGVUeXBlKHQpfWdldFZhbHVlRnJvbVJlZmVyZW5jZSh0PXRoaXMucmVmZXJlbmNlKXtjb25zdHtwcm9wZXJ0aWVzOmV9PXRoaXM7bGV0IHM9dFtlWzBdXTtmb3IobGV0IG49MTtuPGUubGVuZ3RoO24rKylzPXNbZVtuXV07cmV0dXJuIHN9dXBkYXRlUmVmZXJlbmNlKHQpe3JldHVybiB0aGlzLnJlZmVyZW5jZT10aGlzLm9iamVjdCE9PW51bGw/dGhpcy5vYmplY3Q6dC5vYmplY3QsdGhpcy5yZWZlcmVuY2V9c2V0dXAoKXtyZXR1cm4gdGhpcy51cGRhdGVWYWx1ZSgpLHRoaXMubm9kZX11cGRhdGUoKXt0aGlzLnVwZGF0ZVZhbHVlKCl9dXBkYXRlVmFsdWUoKXt0aGlzLm5vZGU9PT1udWxsJiZ0aGlzLnNldE5vZGVUeXBlKHRoaXMudW5pZm9ybVR5cGUpO2NvbnN0IHQ9dGhpcy5nZXRWYWx1ZUZyb21SZWZlcmVuY2UoKTtBcnJheS5pc0FycmF5KHQpP3RoaXMubm9kZS5hcnJheT10OnRoaXMubm9kZS52YWx1ZT10fX1jbGFzcyBGaCBleHRlbmRzIENoe3N0YXRpYyBnZXQgdHlwZSgpe3JldHVybiJSZW5kZXJlclJlZmVyZW5jZU5vZGUifWNvbnN0cnVjdG9yKHQsZSxzPW51bGwpe3N1cGVyKHQsZSxzKSx0aGlzLnJlbmRlcmVyPXMsdGhpcy5zZXRHcm91cChkZSl9dXBkYXRlUmVmZXJlbmNlKHQpe3JldHVybiB0aGlzLnJlZmVyZW5jZT10aGlzLnJlbmRlcmVyIT09bnVsbD90aGlzLnJlbmRlcmVyOnQucmVuZGVyZXIsdGhpcy5yZWZlcmVuY2V9fWNvbnN0IFJoPShyLHQsZSk9PnYobmV3IEZoKHIsdCxlKSk7Y2xhc3MgQmggZXh0ZW5kcyBkdHtzdGF0aWMgZ2V0IHR5cGUoKXtyZXR1cm4iVG9uZU1hcHBpbmdOb2RlIn1jb25zdHJ1Y3Rvcih0LGU9dmgscz1udWxsKXtzdXBlcigidmVjMyIpLHRoaXMudG9uZU1hcHBpbmc9dCx0aGlzLmV4cG9zdXJlTm9kZT1lLHRoaXMuY29sb3JOb2RlPXN9Z2V0Q2FjaGVLZXkoKXtyZXR1cm4gTWEoc3VwZXIuZ2V0Q2FjaGVLZXkoKSx0aGlzLnRvbmVNYXBwaW5nKX1zZXR1cCh0KXtjb25zdCBlPXRoaXMuY29sb3JOb2RlfHx0LmNvbnRleHQuY29sb3Iscz10aGlzLnRvbmVNYXBwaW5nO2lmKHM9PT1NbilyZXR1cm4gZTtsZXQgbj1udWxsO2NvbnN0IGk9dC5yZW5kZXJlci5ub2Rlcy5saWJyYXJ5LmdldFRvbmVNYXBwaW5nRnVuY3Rpb24ocyk7cmV0dXJuIGkhPT1udWxsP249QmUoaShlLnJnYix0aGlzLmV4cG9zdXJlTm9kZSksZS5hKTooY29uc29sZS5lcnJvcigiVG9uZU1hcHBpbmdOb2RlOiBVbnN1cHBvcnRlZCBUb25lIE1hcHBpbmcgY29uZmlndXJhdGlvbi4iLHMpLG49ZSksbn19Y29uc3QgSWg9KHIsdCxlKT0+dihuZXcgQmgocix2KHQpLHYoZSkpKSx2aD1SaCgidG9uZU1hcHBpbmdFeHBvc3VyZSIsImZsb2F0Iik7YigidG9uZU1hcHBpbmciLChyLHQsZSk9PkloKHQsZSxyKSk7Y2xhc3MgUGggZXh0ZW5kcyBqbntzdGF0aWMgZ2V0IHR5cGUoKXtyZXR1cm4iQnVmZmVyQXR0cmlidXRlTm9kZSJ9Y29uc3RydWN0b3IodCxlPW51bGwscz0wLG49MCl7c3VwZXIodCxlKSx0aGlzLmlzQnVmZmVyTm9kZT0hMCx0aGlzLmJ1ZmZlclR5cGU9ZSx0aGlzLmJ1ZmZlclN0cmlkZT1zLHRoaXMuYnVmZmVyT2Zmc2V0PW4sdGhpcy51c2FnZT1Dcyx0aGlzLmluc3RhbmNlZD0hMSx0aGlzLmF0dHJpYnV0ZT1udWxsLHRoaXMuZ2xvYmFsPSEwLHQmJnQuaXNCdWZmZXJBdHRyaWJ1dGU9PT0hMCYmKHRoaXMuYXR0cmlidXRlPXQsdGhpcy51c2FnZT10LnVzYWdlLHRoaXMuaW5zdGFuY2VkPXQuaXNJbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGUpfWdldEhhc2godCl7aWYodGhpcy5idWZmZXJTdHJpZGU9PT0wJiZ0aGlzLmJ1ZmZlck9mZnNldD09PTApe2xldCBlPXQuZ2xvYmFsQ2FjaGUuZ2V0RGF0YSh0aGlzLnZhbHVlKTtyZXR1cm4gZT09PXZvaWQgMCYmKGU9e25vZGU6dGhpc30sdC5nbG9iYWxDYWNoZS5zZXREYXRhKHRoaXMudmFsdWUsZSkpLGUubm9kZS51dWlkfXJldHVybiB0aGlzLnV1aWR9Z2V0Tm9kZVR5cGUodCl7cmV0dXJuIHRoaXMuYnVmZmVyVHlwZT09PW51bGwmJih0aGlzLmJ1ZmZlclR5cGU9dC5nZXRUeXBlRnJvbUF0dHJpYnV0ZSh0aGlzLmF0dHJpYnV0ZSkpLHRoaXMuYnVmZmVyVHlwZX1zZXR1cCh0KXtpZih0aGlzLmF0dHJpYnV0ZSE9PW51bGwpcmV0dXJuO2NvbnN0IGU9dGhpcy5nZXROb2RlVHlwZSh0KSxzPXRoaXMudmFsdWUsbj10LmdldFR5cGVMZW5ndGgoZSksaT10aGlzLmJ1ZmZlclN0cmlkZXx8bixvPXRoaXMuYnVmZmVyT2Zmc2V0LGE9cy5pc0ludGVybGVhdmVkQnVmZmVyPT09ITA/czpuZXcgd2EocyxpKSxjPW5ldyBZbihhLG4sbyk7YS5zZXRVc2FnZSh0aGlzLnVzYWdlKSx0aGlzLmF0dHJpYnV0ZT1jLHRoaXMuYXR0cmlidXRlLmlzSW5zdGFuY2VkQnVmZmVyQXR0cmlidXRlPXRoaXMuaW5zdGFuY2VkfWdlbmVyYXRlKHQpe2NvbnN0IGU9dGhpcy5nZXROb2RlVHlwZSh0KSxzPXQuZ2V0QnVmZmVyQXR0cmlidXRlRnJvbU5vZGUodGhpcyxlKSxuPXQuZ2V0UHJvcGVydHlOYW1lKHMpO2xldCBpPW51bGw7cmV0dXJuIHQuc2hhZGVyU3RhZ2U9PT0idmVydGV4Inx8dC5zaGFkZXJTdGFnZT09PSJjb21wdXRlIj8odGhpcy5uYW1lPW4saT1uKTppPVBlKHRoaXMpLmJ1aWxkKHQsZSksaX1nZXRJbnB1dFR5cGUoKXtyZXR1cm4iYnVmZmVyQXR0cmlidXRlIn1zZXRVc2FnZSh0KXtyZXR1cm4gdGhpcy51c2FnZT10LHRoaXMuYXR0cmlidXRlJiZ0aGlzLmF0dHJpYnV0ZS5pc0J1ZmZlckF0dHJpYnV0ZT09PSEwJiYodGhpcy5hdHRyaWJ1dGUudXNhZ2U9dCksdGhpc31zZXRJbnN0YW5jZWQodCl7cmV0dXJuIHRoaXMuaW5zdGFuY2VkPXQsdGhpc319Y29uc3QgTGg9KHIsdCxlLHMpPT52KG5ldyBQaChyLHQsZSxzKSk7YigidG9BdHRyaWJ1dGUiLHI9PkxoKHIudmFsdWUpKTtjbGFzcyBPaCBleHRlbmRzIFV7c3RhdGljIGdldCB0eXBlKCl7cmV0dXJuIkNvbXB1dGVOb2RlIn1jb25zdHJ1Y3Rvcih0LGUscz1bNjRdKXtzdXBlcigidm9pZCIpLHRoaXMuaXNDb21wdXRlTm9kZT0hMCx0aGlzLmNvbXB1dGVOb2RlPXQsdGhpcy5jb3VudD1lLHRoaXMud29ya2dyb3VwU2l6ZT1zLHRoaXMuZGlzcGF0Y2hDb3VudD0wLHRoaXMudmVyc2lvbj0xLHRoaXMudXBkYXRlQmVmb3JlVHlwZT1RLk9CSkVDVCx0aGlzLnVwZGF0ZURpc3BhdGNoQ291bnQoKX1kaXNwb3NlKCl7dGhpcy5kaXNwYXRjaEV2ZW50KHt0eXBlOiJkaXNwb3NlIn0pfXNldCBuZWVkc1VwZGF0ZSh0KXt0PT09ITAmJnRoaXMudmVyc2lvbisrfXVwZGF0ZURpc3BhdGNoQ291bnQoKXtjb25zdHtjb3VudDp0LHdvcmtncm91cFNpemU6ZX09dGhpcztsZXQgcz1lWzBdO2ZvcihsZXQgbj0xO248ZS5sZW5ndGg7bisrKXMqPWVbbl07dGhpcy5kaXNwYXRjaENvdW50PU1hdGguY2VpbCh0L3MpfW9uSW5pdCgpe311cGRhdGVCZWZvcmUoe3JlbmRlcmVyOnR9KXt0LmNvbXB1dGUodGhpcyl9Z2VuZXJhdGUodCl7Y29uc3R7c2hhZGVyU3RhZ2U6ZX09dDtpZihlPT09ImNvbXB1dGUiKXtjb25zdCBzPXRoaXMuY29tcHV0ZU5vZGUuYnVpbGQodCwidm9pZCIpO3MhPT0iIiYmdC5hZGRMaW5lRmxvd0NvZGUocyx0aGlzKX19fWIoImNvbXB1dGUiLChyLHQsZSk9PnYobmV3IE9oKHYociksdCxlKSkpO2NsYXNzIERoIGV4dGVuZHMgVXtzdGF0aWMgZ2V0IHR5cGUoKXtyZXR1cm4iQ2FjaGVOb2RlIn1jb25zdHJ1Y3Rvcih0LGU9ITApe3N1cGVyKCksdGhpcy5ub2RlPXQsdGhpcy5wYXJlbnQ9ZSx0aGlzLmlzQ2FjaGVOb2RlPSEwfWdldE5vZGVUeXBlKHQpe3JldHVybiB0aGlzLm5vZGUuZ2V0Tm9kZVR5cGUodCl9YnVpbGQodCwuLi5lKXtjb25zdCBzPXQuZ2V0Q2FjaGUoKSxuPXQuZ2V0Q2FjaGVGcm9tTm9kZSh0aGlzLHRoaXMucGFyZW50KTt0LnNldENhY2hlKG4pO2NvbnN0IGk9dGhpcy5ub2RlLmJ1aWxkKHQsLi4uZSk7cmV0dXJuIHQuc2V0Q2FjaGUocyksaX19YigiY2FjaGUiLChyLC4uLnQpPT52KG5ldyBEaCh2KHIpLC4uLnQpKSk7Y2xhc3MgVmggZXh0ZW5kcyBVe3N0YXRpYyBnZXQgdHlwZSgpe3JldHVybiJCeXBhc3NOb2RlIn1jb25zdHJ1Y3Rvcih0LGUpe3N1cGVyKCksdGhpcy5pc0J5cGFzc05vZGU9ITAsdGhpcy5vdXRwdXROb2RlPXQsdGhpcy5jYWxsTm9kZT1lfWdldE5vZGVUeXBlKHQpe3JldHVybiB0aGlzLm91dHB1dE5vZGUuZ2V0Tm9kZVR5cGUodCl9Z2VuZXJhdGUodCl7Y29uc3QgZT10aGlzLmNhbGxOb2RlLmJ1aWxkKHQsInZvaWQiKTtyZXR1cm4gZSE9PSIiJiZ0LmFkZExpbmVGbG93Q29kZShlLHRoaXMpLHRoaXMub3V0cHV0Tm9kZS5idWlsZCh0KX19YigiYnlwYXNzIixDKFZoKSk7Y2xhc3MgWHIgZXh0ZW5kcyBVe3N0YXRpYyBnZXQgdHlwZSgpe3JldHVybiJSZW1hcE5vZGUifWNvbnN0cnVjdG9yKHQsZSxzLG49cSgwKSxpPXEoMSkpe3N1cGVyKCksdGhpcy5ub2RlPXQsdGhpcy5pbkxvd05vZGU9ZSx0aGlzLmluSGlnaE5vZGU9cyx0aGlzLm91dExvd05vZGU9bix0aGlzLm91dEhpZ2hOb2RlPWksdGhpcy5kb0NsYW1wPSEwfXNldHVwKCl7Y29uc3R7bm9kZTp0LGluTG93Tm9kZTplLGluSGlnaE5vZGU6cyxvdXRMb3dOb2RlOm4sb3V0SGlnaE5vZGU6aSxkb0NsYW1wOm99PXRoaXM7bGV0IGE9dC5zdWIoZSkuZGl2KHMuc3ViKGUpKTtyZXR1cm4gbz09PSEwJiYoYT1hLmNsYW1wKCkpLGEubXVsKGkuc3ViKG4pKS5hZGQobil9fWNvbnN0IFVoPUMoWHIsbnVsbCxudWxsLHtkb0NsYW1wOiExfSksa2g9QyhYcik7YigicmVtYXAiLFVoKSxiKCJyZW1hcENsYW1wIixraCk7Y2xhc3MgSGggZXh0ZW5kcyBVe3N0YXRpYyBnZXQgdHlwZSgpe3JldHVybiJFeHByZXNzaW9uTm9kZSJ9Y29uc3RydWN0b3IodD0iIixlPSJ2b2lkIil7c3VwZXIoZSksdGhpcy5zbmlwcGV0PXR9Z2VuZXJhdGUodCxlKXtjb25zdCBzPXRoaXMuZ2V0Tm9kZVR5cGUodCksbj10aGlzLnNuaXBwZXQ7aWYocz09PSJ2b2lkIil0LmFkZExpbmVGbG93Q29kZShuLHRoaXMpO2Vsc2UgcmV0dXJuIHQuZm9ybWF0KGAoICR7bn0gKWAscyxlKX19Y29uc3QgWXM9QyhIaCk7YigiZGlzY2FyZCIscj0+KHI/dWkocixZcygiZGlzY2FyZCIpKTpZcygiZGlzY2FyZCIpKS5hcHBlbmQoKSk7Y2xhc3MgcWggZXh0ZW5kcyBkdHtzdGF0aWMgZ2V0IHR5cGUoKXtyZXR1cm4iUmVuZGVyT3V0cHV0Tm9kZSJ9Y29uc3RydWN0b3IodCxlLHMpe3N1cGVyKCJ2ZWM0IiksdGhpcy5jb2xvck5vZGU9dCx0aGlzLnRvbmVNYXBwaW5nPWUsdGhpcy5vdXRwdXRDb2xvclNwYWNlPXMsdGhpcy5pc1JlbmRlck91dHB1dD0hMH1zZXR1cCh7Y29udGV4dDp0fSl7bGV0IGU9dGhpcy5jb2xvck5vZGV8fHQuY29sb3I7Y29uc3Qgcz0odGhpcy50b25lTWFwcGluZyE9PW51bGw/dGhpcy50b25lTWFwcGluZzp0LnRvbmVNYXBwaW5nKXx8TW4sbj0odGhpcy5vdXRwdXRDb2xvclNwYWNlIT09bnVsbD90aGlzLm91dHB1dENvbG9yU3BhY2U6dC5vdXRwdXRDb2xvclNwYWNlKXx8YnM7cmV0dXJuIHMhPT1NbiYmKGU9ZS50b25lTWFwcGluZyhzKSksbiE9PWJzJiZuIT09bXQud29ya2luZ0NvbG9yU3BhY2UmJihlPWUud29ya2luZ1RvQ29sb3JTcGFjZShuKSksZX19YigicmVuZGVyT3V0cHV0Iiwocix0PW51bGwsZT1udWxsKT0+dihuZXcgcWgodihyKSx0LGUpKSk7Y2xhc3MgJGggZXh0ZW5kcyBVe3N0YXRpYyBnZXQgdHlwZSgpe3JldHVybiJBdHRyaWJ1dGVOb2RlIn1jb25zdHJ1Y3Rvcih0LGU9bnVsbCl7c3VwZXIoZSksdGhpcy5nbG9iYWw9ITAsdGhpcy5fYXR0cmlidXRlTmFtZT10fWdldEhhc2godCl7cmV0dXJuIHRoaXMuZ2V0QXR0cmlidXRlTmFtZSh0KX1nZXROb2RlVHlwZSh0KXtsZXQgZT10aGlzLm5vZGVUeXBlO2lmKGU9PT1udWxsKXtjb25zdCBzPXRoaXMuZ2V0QXR0cmlidXRlTmFtZSh0KTtpZih0Lmhhc0dlb21ldHJ5QXR0cmlidXRlKHMpKXtjb25zdCBuPXQuZ2VvbWV0cnkuZ2V0QXR0cmlidXRlKHMpO2U9dC5nZXRUeXBlRnJvbUF0dHJpYnV0ZShuKX1lbHNlIGU9ImZsb2F0In1yZXR1cm4gZX1zZXRBdHRyaWJ1dGVOYW1lKHQpe3JldHVybiB0aGlzLl9hdHRyaWJ1dGVOYW1lPXQsdGhpc31nZXRBdHRyaWJ1dGVOYW1lKCl7cmV0dXJuIHRoaXMuX2F0dHJpYnV0ZU5hbWV9Z2VuZXJhdGUodCl7Y29uc3QgZT10aGlzLmdldEF0dHJpYnV0ZU5hbWUodCkscz10aGlzLmdldE5vZGVUeXBlKHQpO2lmKHQuaGFzR2VvbWV0cnlBdHRyaWJ1dGUoZSk9PT0hMCl7Y29uc3QgaT10Lmdlb21ldHJ5LmdldEF0dHJpYnV0ZShlKSxvPXQuZ2V0VHlwZUZyb21BdHRyaWJ1dGUoaSksYT10LmdldEF0dHJpYnV0ZShlLG8pO3JldHVybiB0LnNoYWRlclN0YWdlPT09InZlcnRleCI/dC5mb3JtYXQoYS5uYW1lLG8scyk6UGUodGhpcykuYnVpbGQodCxzKX1lbHNlIHJldHVybiBjb25zb2xlLndhcm4oYEF0dHJpYnV0ZU5vZGU6IFZlcnRleCBhdHRyaWJ1dGUgIiR7ZX0iIG5vdCBmb3VuZCBvbiBnZW9tZXRyeS5gKSx0LmdlbmVyYXRlQ29uc3Qocyl9c2VyaWFsaXplKHQpe3N1cGVyLnNlcmlhbGl6ZSh0KSx0Lmdsb2JhbD10aGlzLmdsb2JhbCx0Ll9hdHRyaWJ1dGVOYW1lPXRoaXMuX2F0dHJpYnV0ZU5hbWV9ZGVzZXJpYWxpemUodCl7c3VwZXIuZGVzZXJpYWxpemUodCksdGhpcy5nbG9iYWw9dC5nbG9iYWwsdGhpcy5fYXR0cmlidXRlTmFtZT10Ll9hdHRyaWJ1dGVOYW1lfX1jb25zdCBvcz0ocix0KT0+dihuZXcgJGgocix0KSksWnM9cj0+b3MoInV2Iisocj4wP3I6IiIpLCJ2ZWMyIik7Y2xhc3MgR2ggZXh0ZW5kcyBVe3N0YXRpYyBnZXQgdHlwZSgpe3JldHVybiJUZXh0dXJlU2l6ZU5vZGUifWNvbnN0cnVjdG9yKHQsZT1udWxsKXtzdXBlcigidXZlYzIiKSx0aGlzLmlzVGV4dHVyZVNpemVOb2RlPSEwLHRoaXMudGV4dHVyZU5vZGU9dCx0aGlzLmxldmVsTm9kZT1lfWdlbmVyYXRlKHQsZSl7Y29uc3Qgcz10aGlzLnRleHR1cmVOb2RlLmJ1aWxkKHQsInByb3BlcnR5Iiksbj10aGlzLmxldmVsTm9kZT09PW51bGw/IjAiOnRoaXMubGV2ZWxOb2RlLmJ1aWxkKHQsImludCIpO3JldHVybiB0LmZvcm1hdChgJHt0LmdldE1ldGhvZCgidGV4dHVyZURpbWVuc2lvbnMiKX0oICR7c30sICR7bn0gKWAsdGhpcy5nZXROb2RlVHlwZSh0KSxlKX19Y29uc3QgWXI9QyhHaCk7Y2xhc3MgV2ggZXh0ZW5kcyBJZXtzdGF0aWMgZ2V0IHR5cGUoKXtyZXR1cm4iTWF4TWlwTGV2ZWxOb2RlIn1jb25zdHJ1Y3Rvcih0KXtzdXBlcigwKSx0aGlzLl90ZXh0dXJlTm9kZT10LHRoaXMudXBkYXRlVHlwZT1RLkZSQU1FfWdldCB0ZXh0dXJlTm9kZSgpe3JldHVybiB0aGlzLl90ZXh0dXJlTm9kZX1nZXQgdGV4dHVyZSgpe3JldHVybiB0aGlzLl90ZXh0dXJlTm9kZS52YWx1ZX11cGRhdGUoKXtjb25zdCB0PXRoaXMudGV4dHVyZSxlPXQuaW1hZ2VzLHM9ZSYmZS5sZW5ndGg+MD9lWzBdJiZlWzBdLmltYWdlfHxlWzBdOnQuaW1hZ2U7aWYocyYmcy53aWR0aCE9PXZvaWQgMCl7Y29uc3R7d2lkdGg6bixoZWlnaHQ6aX09czt0aGlzLnZhbHVlPU1hdGgubG9nMihNYXRoLm1heChuLGkpKX19fWNvbnN0IFhoPUMoV2gpO2NsYXNzIEpzIGV4dGVuZHMgSWV7c3RhdGljIGdldCB0eXBlKCl7cmV0dXJuIlRleHR1cmVOb2RlIn1jb25zdHJ1Y3Rvcih0LGU9bnVsbCxzPW51bGwsbj1udWxsKXtzdXBlcih0KSx0aGlzLmlzVGV4dHVyZU5vZGU9ITAsdGhpcy51dk5vZGU9ZSx0aGlzLmxldmVsTm9kZT1zLHRoaXMuYmlhc05vZGU9bix0aGlzLmNvbXBhcmVOb2RlPW51bGwsdGhpcy5kZXB0aE5vZGU9bnVsbCx0aGlzLmdyYWROb2RlPW51bGwsdGhpcy5zYW1wbGVyPSEwLHRoaXMudXBkYXRlTWF0cml4PSExLHRoaXMudXBkYXRlVHlwZT1RLk5PTkUsdGhpcy5yZWZlcmVuY2VOb2RlPW51bGwsdGhpcy5fdmFsdWU9dCx0aGlzLl9tYXRyaXhVbmlmb3JtPW51bGwsdGhpcy5zZXRVcGRhdGVNYXRyaXgoZT09PW51bGwpfXNldCB2YWx1ZSh0KXt0aGlzLnJlZmVyZW5jZU5vZGU/dGhpcy5yZWZlcmVuY2VOb2RlLnZhbHVlPXQ6dGhpcy5fdmFsdWU9dH1nZXQgdmFsdWUoKXtyZXR1cm4gdGhpcy5yZWZlcmVuY2VOb2RlP3RoaXMucmVmZXJlbmNlTm9kZS52YWx1ZTp0aGlzLl92YWx1ZX1nZXRVbmlmb3JtSGFzaCgpe3JldHVybiB0aGlzLnZhbHVlLnV1aWR9Z2V0Tm9kZVR5cGUoKXtyZXR1cm4gdGhpcy52YWx1ZS5pc0RlcHRoVGV4dHVyZT09PSEwPyJmbG9hdCI6dGhpcy52YWx1ZS50eXBlPT09V2k/InV2ZWM0Ijp0aGlzLnZhbHVlLnR5cGU9PT1Cbz8iaXZlYzQiOiJ2ZWM0In1nZXRJbnB1dFR5cGUoKXtyZXR1cm4idGV4dHVyZSJ9Z2V0RGVmYXVsdFVWKCl7cmV0dXJuIFpzKHRoaXMudmFsdWUuY2hhbm5lbCl9dXBkYXRlUmVmZXJlbmNlKCl7cmV0dXJuIHRoaXMudmFsdWV9Z2V0VHJhbnNmb3JtZWRVVih0KXtyZXR1cm4gdGhpcy5fbWF0cml4VW5pZm9ybT09PW51bGwmJih0aGlzLl9tYXRyaXhVbmlmb3JtPXh0KHRoaXMudmFsdWUubWF0cml4KSksdGhpcy5fbWF0cml4VW5pZm9ybS5tdWwoayh0LDEpKS54eX1zZXRVcGRhdGVNYXRyaXgodCl7cmV0dXJuIHRoaXMudXBkYXRlTWF0cml4PXQsdGhpcy51cGRhdGVUeXBlPXQ/US5GUkFNRTpRLk5PTkUsdGhpc31zZXR1cFVWKHQsZSl7Y29uc3Qgcz10aGlzLnZhbHVlO3JldHVybiB0LmlzRmxpcFkoKSYmKHMuaXNSZW5kZXJUYXJnZXRUZXh0dXJlPT09ITB8fHMuaXNGcmFtZWJ1ZmZlclRleHR1cmU9PT0hMHx8cy5pc0RlcHRoVGV4dHVyZT09PSEwKSYmKHRoaXMuc2FtcGxlcj9lPWUuZmxpcFkoKTplPWUuc2V0WShSZShZcih0aGlzLHRoaXMubGV2ZWxOb2RlKS55KS5zdWIoZS55KS5zdWIoMSkpKSxlfXNldHVwKHQpe2NvbnN0IGU9dC5nZXROb2RlUHJvcGVydGllcyh0aGlzKTtlLnJlZmVyZW5jZU5vZGU9dGhpcy5yZWZlcmVuY2VOb2RlO2xldCBzPXRoaXMudXZOb2RlOyhzPT09bnVsbHx8dC5jb250ZXh0LmZvcmNlVVZDb250ZXh0PT09ITApJiZ0LmNvbnRleHQuZ2V0VVYmJihzPXQuY29udGV4dC5nZXRVVih0aGlzKSksc3x8KHM9dGhpcy5nZXREZWZhdWx0VVYoKSksdGhpcy51cGRhdGVNYXRyaXg9PT0hMCYmKHM9dGhpcy5nZXRUcmFuc2Zvcm1lZFVWKHMpKSxzPXRoaXMuc2V0dXBVVih0LHMpO2xldCBuPXRoaXMubGV2ZWxOb2RlO249PT1udWxsJiZ0LmNvbnRleHQuZ2V0VGV4dHVyZUxldmVsJiYobj10LmNvbnRleHQuZ2V0VGV4dHVyZUxldmVsKHRoaXMpKSxlLnV2Tm9kZT1zLGUubGV2ZWxOb2RlPW4sZS5iaWFzTm9kZT10aGlzLmJpYXNOb2RlLGUuY29tcGFyZU5vZGU9dGhpcy5jb21wYXJlTm9kZSxlLmdyYWROb2RlPXRoaXMuZ3JhZE5vZGUsZS5kZXB0aE5vZGU9dGhpcy5kZXB0aE5vZGV9Z2VuZXJhdGVVVih0LGUpe3JldHVybiBlLmJ1aWxkKHQsdGhpcy5zYW1wbGVyPT09ITA/InZlYzIiOiJpdmVjMiIpfWdlbmVyYXRlU25pcHBldCh0LGUscyxuLGksbyxhLGMpe2NvbnN0IHU9dGhpcy52YWx1ZTtsZXQgaDtyZXR1cm4gbj9oPXQuZ2VuZXJhdGVUZXh0dXJlTGV2ZWwodSxlLHMsbixvKTppP2g9dC5nZW5lcmF0ZVRleHR1cmVCaWFzKHUsZSxzLGksbyk6Yz9oPXQuZ2VuZXJhdGVUZXh0dXJlR3JhZCh1LGUscyxjLG8pOmE/aD10LmdlbmVyYXRlVGV4dHVyZUNvbXBhcmUodSxlLHMsYSxvKTp0aGlzLnNhbXBsZXI9PT0hMT9oPXQuZ2VuZXJhdGVUZXh0dXJlTG9hZCh1LGUscyxvKTpoPXQuZ2VuZXJhdGVUZXh0dXJlKHUsZSxzLG8pLGh9Z2VuZXJhdGUodCxlKXtjb25zdCBzPXQuZ2V0Tm9kZVByb3BlcnRpZXModGhpcyksbj10aGlzLnZhbHVlO2lmKCFufHxuLmlzVGV4dHVyZSE9PSEwKXRocm93IG5ldyBFcnJvcigiVGV4dHVyZU5vZGU6IE5lZWQgYSB0aHJlZS5qcyB0ZXh0dXJlLiIpO2NvbnN0IGk9c3VwZXIuZ2VuZXJhdGUodCwicHJvcGVydHkiKTtpZihlPT09InNhbXBsZXIiKXJldHVybiBpKyJfc2FtcGxlciI7aWYodC5pc1JlZmVyZW5jZShlKSlyZXR1cm4gaTt7Y29uc3Qgbz10LmdldERhdGFGcm9tTm9kZSh0aGlzKTtsZXQgYT1vLnByb3BlcnR5TmFtZTtpZihhPT09dm9pZCAwKXtjb25zdHt1dk5vZGU6aCxsZXZlbE5vZGU6bCxiaWFzTm9kZTpkLGNvbXBhcmVOb2RlOmYsZGVwdGhOb2RlOnAsZ3JhZE5vZGU6bX09cyxnPXRoaXMuZ2VuZXJhdGVVVih0LGgpLHk9bD9sLmJ1aWxkKHQsImZsb2F0Iik6bnVsbCxUPWQ/ZC5idWlsZCh0LCJmbG9hdCIpOm51bGwsdz1wP3AuYnVpbGQodCwiaW50Iik6bnVsbCxNPWY/Zi5idWlsZCh0LCJmbG9hdCIpOm51bGwsTj1tP1ttWzBdLmJ1aWxkKHQsInZlYzIiKSxtWzFdLmJ1aWxkKHQsInZlYzIiKV06bnVsbCxfPXQuZ2V0VmFyRnJvbU5vZGUodGhpcyk7YT10LmdldFByb3BlcnR5TmFtZShfKTtjb25zdCBTPXRoaXMuZ2VuZXJhdGVTbmlwcGV0KHQsaSxnLHksVCx3LE0sTik7dC5hZGRMaW5lRmxvd0NvZGUoYCR7YX0gPSAke1N9YCx0aGlzKSxvLnNuaXBwZXQ9UyxvLnByb3BlcnR5TmFtZT1hfWxldCBjPWE7Y29uc3QgdT10aGlzLmdldE5vZGVUeXBlKHQpO3JldHVybiB0Lm5lZWRzVG9Xb3JraW5nQ29sb3JTcGFjZShuKSYmKGM9V3IoWXMoYyx1KSxuLmNvbG9yU3BhY2UpLnNldHVwKHQpLmJ1aWxkKHQsdSkpLHQuZm9ybWF0KGMsdSxlKX19c2V0U2FtcGxlcih0KXtyZXR1cm4gdGhpcy5zYW1wbGVyPXQsdGhpc31nZXRTYW1wbGVyKCl7cmV0dXJuIHRoaXMuc2FtcGxlcn11dih0KXtjb25zdCBlPXRoaXMuY2xvbmUoKTtyZXR1cm4gZS51dk5vZGU9dih0KSxlLnJlZmVyZW5jZU5vZGU9dGhpcy5nZXRTZWxmKCksdihlKX1ibHVyKHQpe2NvbnN0IGU9dGhpcy5jbG9uZSgpO3JldHVybiBlLmJpYXNOb2RlPXYodCkubXVsKFhoKGUpKSxlLnJlZmVyZW5jZU5vZGU9dGhpcy5nZXRTZWxmKCksdihlKX1sZXZlbCh0KXtjb25zdCBlPXRoaXMuY2xvbmUoKTtyZXR1cm4gZS5sZXZlbE5vZGU9dih0KSxlLnJlZmVyZW5jZU5vZGU9dGhpcy5nZXRTZWxmKCksdihlKX1zaXplKHQpe3JldHVybiBZcih0aGlzLHQpfWJpYXModCl7Y29uc3QgZT10aGlzLmNsb25lKCk7cmV0dXJuIGUuYmlhc05vZGU9dih0KSxlLnJlZmVyZW5jZU5vZGU9dGhpcy5nZXRTZWxmKCksdihlKX1jb21wYXJlKHQpe2NvbnN0IGU9dGhpcy5jbG9uZSgpO3JldHVybiBlLmNvbXBhcmVOb2RlPXYodCksZS5yZWZlcmVuY2VOb2RlPXRoaXMuZ2V0U2VsZigpLHYoZSl9Z3JhZCh0LGUpe2NvbnN0IHM9dGhpcy5jbG9uZSgpO3JldHVybiBzLmdyYWROb2RlPVt2KHQpLHYoZSldLHMucmVmZXJlbmNlTm9kZT10aGlzLmdldFNlbGYoKSx2KHMpfWRlcHRoKHQpe2NvbnN0IGU9dGhpcy5jbG9uZSgpO3JldHVybiBlLmRlcHRoTm9kZT12KHQpLGUucmVmZXJlbmNlTm9kZT10aGlzLmdldFNlbGYoKSx2KGUpfXNlcmlhbGl6ZSh0KXtzdXBlci5zZXJpYWxpemUodCksdC52YWx1ZT10aGlzLnZhbHVlLnRvSlNPTih0Lm1ldGEpLnV1aWQsdC5zYW1wbGVyPXRoaXMuc2FtcGxlcix0LnVwZGF0ZU1hdHJpeD10aGlzLnVwZGF0ZU1hdHJpeCx0LnVwZGF0ZVR5cGU9dGhpcy51cGRhdGVUeXBlfWRlc2VyaWFsaXplKHQpe3N1cGVyLmRlc2VyaWFsaXplKHQpLHRoaXMudmFsdWU9dC5tZXRhLnRleHR1cmVzW3QudmFsdWVdLHRoaXMuc2FtcGxlcj10LnNhbXBsZXIsdGhpcy51cGRhdGVNYXRyaXg9dC51cGRhdGVNYXRyaXgsdGhpcy51cGRhdGVUeXBlPXQudXBkYXRlVHlwZX11cGRhdGUoKXtjb25zdCB0PXRoaXMudmFsdWUsZT10aGlzLl9tYXRyaXhVbmlmb3JtO2UhPT1udWxsJiYoZS52YWx1ZT10Lm1hdHJpeCksdC5tYXRyaXhBdXRvVXBkYXRlPT09ITAmJnQudXBkYXRlTWF0cml4KCl9Y2xvbmUoKXtjb25zdCB0PW5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMudmFsdWUsdGhpcy51dk5vZGUsdGhpcy5sZXZlbE5vZGUsdGhpcy5iaWFzTm9kZSk7cmV0dXJuIHQuc2FtcGxlcj10aGlzLnNhbXBsZXIsdH19Y29uc3QgYXM9QyhKcyksY3M9eHQoImZsb2F0IikubGFiZWwoImNhbWVyYU5lYXIiKS5zZXRHcm91cChkZSkub25SZW5kZXJVcGRhdGUoKHtjYW1lcmE6cn0pPT5yLm5lYXIpLGhzPXh0KCJmbG9hdCIpLmxhYmVsKCJjYW1lcmFGYXIiKS5zZXRHcm91cChkZSkub25SZW5kZXJVcGRhdGUoKHtjYW1lcmE6cn0pPT5yLmZhciksanM9eHQoIm1hdDQiKS5sYWJlbCgiY2FtZXJhVmlld01hdHJpeCIpLnNldEdyb3VwKGRlKS5vblJlbmRlclVwZGF0ZSgoe2NhbWVyYTpyfSk9PnIubWF0cml4V29ybGRJbnZlcnNlKTtjbGFzcyBIIGV4dGVuZHMgVXtzdGF0aWMgZ2V0IHR5cGUoKXtyZXR1cm4iT2JqZWN0M0ROb2RlIn1jb25zdHJ1Y3Rvcih0LGU9bnVsbCl7c3VwZXIoKSx0aGlzLnNjb3BlPXQsdGhpcy5vYmplY3QzZD1lLHRoaXMudXBkYXRlVHlwZT1RLk9CSkVDVCx0aGlzLl91bmlmb3JtTm9kZT1uZXcgSWUobnVsbCl9Z2V0Tm9kZVR5cGUoKXtjb25zdCB0PXRoaXMuc2NvcGU7aWYodD09PUguV09STERfTUFUUklYKXJldHVybiJtYXQ0IjtpZih0PT09SC5QT1NJVElPTnx8dD09PUguVklFV19QT1NJVElPTnx8dD09PUguRElSRUNUSU9OfHx0PT09SC5TQ0FMRSlyZXR1cm4idmVjMyJ9dXBkYXRlKHQpe2NvbnN0IGU9dGhpcy5vYmplY3QzZCxzPXRoaXMuX3VuaWZvcm1Ob2RlLG49dGhpcy5zY29wZTtpZihuPT09SC5XT1JMRF9NQVRSSVgpcy52YWx1ZT1lLm1hdHJpeFdvcmxkO2Vsc2UgaWYobj09PUguUE9TSVRJT04pcy52YWx1ZT1zLnZhbHVlfHxuZXcgQSxzLnZhbHVlLnNldEZyb21NYXRyaXhQb3NpdGlvbihlLm1hdHJpeFdvcmxkKTtlbHNlIGlmKG49PT1ILlNDQUxFKXMudmFsdWU9cy52YWx1ZXx8bmV3IEEscy52YWx1ZS5zZXRGcm9tTWF0cml4U2NhbGUoZS5tYXRyaXhXb3JsZCk7ZWxzZSBpZihuPT09SC5ESVJFQ1RJT04pcy52YWx1ZT1zLnZhbHVlfHxuZXcgQSxlLmdldFdvcmxkRGlyZWN0aW9uKHMudmFsdWUpO2Vsc2UgaWYobj09PUguVklFV19QT1NJVElPTil7Y29uc3QgaT10LmNhbWVyYTtzLnZhbHVlPXMudmFsdWV8fG5ldyBBLHMudmFsdWUuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKGUubWF0cml4V29ybGQpLHMudmFsdWUuYXBwbHlNYXRyaXg0KGkubWF0cml4V29ybGRJbnZlcnNlKX19Z2VuZXJhdGUodCl7Y29uc3QgZT10aGlzLnNjb3BlO3JldHVybiBlPT09SC5XT1JMRF9NQVRSSVg/dGhpcy5fdW5pZm9ybU5vZGUubm9kZVR5cGU9Im1hdDQiOihlPT09SC5QT1NJVElPTnx8ZT09PUguVklFV19QT1NJVElPTnx8ZT09PUguRElSRUNUSU9OfHxlPT09SC5TQ0FMRSkmJih0aGlzLl91bmlmb3JtTm9kZS5ub2RlVHlwZT0idmVjMyIpLHRoaXMuX3VuaWZvcm1Ob2RlLmJ1aWxkKHQpfXNlcmlhbGl6ZSh0KXtzdXBlci5zZXJpYWxpemUodCksdC5zY29wZT10aGlzLnNjb3BlfWRlc2VyaWFsaXplKHQpe3N1cGVyLmRlc2VyaWFsaXplKHQpLHRoaXMuc2NvcGU9dC5zY29wZX19SC5XT1JMRF9NQVRSSVg9IndvcmxkTWF0cml4IixILlBPU0lUSU9OPSJwb3NpdGlvbiIsSC5TQ0FMRT0ic2NhbGUiLEguVklFV19QT1NJVElPTj0idmlld1Bvc2l0aW9uIixILkRJUkVDVElPTj0iZGlyZWN0aW9uIixILkRJUkVDVElPTixILldPUkxEX01BVFJJWCxILlBPU0lUSU9OLEguU0NBTEUsSC5WSUVXX1BPU0lUSU9OO2NsYXNzIFZ0IGV4dGVuZHMgSHtzdGF0aWMgZ2V0IHR5cGUoKXtyZXR1cm4iTW9kZWxOb2RlIn1jb25zdHJ1Y3Rvcih0KXtzdXBlcih0KX11cGRhdGUodCl7dGhpcy5vYmplY3QzZD10Lm9iamVjdCxzdXBlci51cGRhdGUodCl9fVZ0LkRJUkVDVElPTjtjb25zdCBZaD1PKFZ0LFZ0LldPUkxEX01BVFJJWCk7VnQuUE9TSVRJT04sVnQuU0NBTEUsVnQuVklFV19QT1NJVElPTjtjb25zdCBaaD14dChuZXcgQ3QpLm9uT2JqZWN0VXBkYXRlKCh7b2JqZWN0OnJ9LHQpPT50LnZhbHVlLmdldE5vcm1hbE1hdHJpeChyLm1hdHJpeFdvcmxkKSksWnI9anMubXVsKFloKS50b1ZhcigibW9kZWxWaWV3TWF0cml4XzIiKSxKaD1vcygicG9zaXRpb24iLCJ2ZWMzIikudmFyeWluZygicG9zaXRpb25Mb2NhbCIpLE10PVpyLm11bChKaCkueHl6LnZhcnlpbmcoInZfcG9zaXRpb25WaWV3IiksSnI9TXQubmVnYXRlKCkudmFyeWluZygidl9wb3NpdGlvblZpZXdEaXJlY3Rpb24iKS5ub3JtYWxpemUoKS50b1ZhcigicG9zaXRpb25WaWV3RGlyZWN0aW9uIik7Y2xhc3MgamggZXh0ZW5kcyBVe3N0YXRpYyBnZXQgdHlwZSgpe3JldHVybiJGcm9udEZhY2luZ05vZGUifWNvbnN0cnVjdG9yKCl7c3VwZXIoImJvb2wiKSx0aGlzLmlzRnJvbnRGYWNpbmdOb2RlPSEwfWdlbmVyYXRlKHQpe2NvbnN0e3JlbmRlcmVyOmUsbWF0ZXJpYWw6c309dDtyZXR1cm4gZS5jb29yZGluYXRlU3lzdGVtPT09WWUmJnMuc2lkZT09PVVpPyJmYWxzZSI6dC5nZXRGcm9udEZhY2luZygpfX1jb25zdCBkaT1xKE8oamgpKS5tdWwoMikuc3ViKDEpLFFoPW9zKCJub3JtYWwiLCJ2ZWMzIiksS2g9dHQocj0+ci5nZW9tZXRyeS5oYXNBdHRyaWJ1dGUoIm5vcm1hbCIpPT09ITE/KGNvbnNvbGUud2FybignVFNMLk5vcm1hbE5vZGU6IFZlcnRleCBhdHRyaWJ1dGUgIm5vcm1hbCIgbm90IGZvdW5kIG9uIGdlb21ldHJ5LicpLGsoMCwxLDApKTpRaCwidmVjMyIpLm9uY2UoKSgpLnRvVmFyKCJub3JtYWxMb2NhbCIpLHR1PU10LmRGZHgoKS5jcm9zcyhNdC5kRmR5KCkpLm5vcm1hbGl6ZSgpLnRvVmFyKCJub3JtYWxGbGF0IiksTGU9dHQocj0+e2xldCB0O3JldHVybiByLm1hdGVyaWFsLmZsYXRTaGFkaW5nPT09ITA/dD10dTp0PVBlKFFyKEtoKSwidl9ub3JtYWxWaWV3Iikubm9ybWFsaXplKCksdH0sInZlYzMiKS5vbmNlKCkoKS50b1Zhcigibm9ybWFsVmlldyIpLGpyPXR0KHI9PnIuY29udGV4dC5zZXR1cE5vcm1hbCgpLCJ2ZWMzIikub25jZSgpKCkubXVsKGRpKS50b1ZhcigidHJhbnNmb3JtZWROb3JtYWxWaWV3IiksUXI9dHQoKFtyXSx0KT0+e2NvbnN0IGU9dC5yZW5kZXJlci5ub2Rlcy5tb2RlbE5vcm1hbFZpZXdNYXRyaXg7aWYoZSE9PW51bGwpcmV0dXJuIGUudHJhbnNmb3JtRGlyZWN0aW9uKHIpO2NvbnN0IHM9WmgubXVsKHIpO3JldHVybiBqcy50cmFuc2Zvcm1EaXJlY3Rpb24ocyl9KSxldT14dCgwKS5vblJlZmVyZW5jZSgoe21hdGVyaWFsOnJ9KT0+cikub25SZW5kZXJVcGRhdGUoKHttYXRlcmlhbDpyfSk9PnIucmVmcmFjdGlvblJhdGlvKSxzdT1Kci5uZWdhdGUoKS5yZWZsZWN0KGpyKSxudT1Kci5uZWdhdGUoKS5yZWZyYWN0KGpyLGV1KSxpdT1zdS50cmFuc2Zvcm1EaXJlY3Rpb24oanMpLnRvVmFyKCJyZWZsZWN0VmVjdG9yIikscnU9bnUudHJhbnNmb3JtRGlyZWN0aW9uKGpzKS50b1ZhcigicmVmbGVjdFZlY3RvciIpO2NsYXNzIG91IGV4dGVuZHMgSnN7c3RhdGljIGdldCB0eXBlKCl7cmV0dXJuIkN1YmVUZXh0dXJlTm9kZSJ9Y29uc3RydWN0b3IodCxlPW51bGwscz1udWxsLG49bnVsbCl7c3VwZXIodCxlLHMsbiksdGhpcy5pc0N1YmVUZXh0dXJlTm9kZT0hMH1nZXRJbnB1dFR5cGUoKXtyZXR1cm4iY3ViZVRleHR1cmUifWdldERlZmF1bHRVVigpe2NvbnN0IHQ9dGhpcy52YWx1ZTtyZXR1cm4gdC5tYXBwaW5nPT09Q28/aXU6dC5tYXBwaW5nPT09Rm8/cnU6KGNvbnNvbGUuZXJyb3IoJ1RIUkVFLkN1YmVUZXh0dXJlTm9kZTogTWFwcGluZyAiJXMiIG5vdCBzdXBwb3J0ZWQuJyx0Lm1hcHBpbmcpLGsoMCwwLDApKX1zZXRVcGRhdGVNYXRyaXgoKXt9c2V0dXBVVih0LGUpe2NvbnN0IHM9dGhpcy52YWx1ZTtyZXR1cm4gdC5yZW5kZXJlci5jb29yZGluYXRlU3lzdGVtPT09em58fCFzLmlzUmVuZGVyVGFyZ2V0VGV4dHVyZT9rKGUueC5uZWdhdGUoKSxlLnl6KTplfWdlbmVyYXRlVVYodCxlKXtyZXR1cm4gZS5idWlsZCh0LCJ2ZWMzIil9fWNvbnN0IGF1PUMob3UpO2NsYXNzIEtyIGV4dGVuZHMgSWV7c3RhdGljIGdldCB0eXBlKCl7cmV0dXJuIkJ1ZmZlck5vZGUifWNvbnN0cnVjdG9yKHQsZSxzPTApe3N1cGVyKHQsZSksdGhpcy5pc0J1ZmZlck5vZGU9ITAsdGhpcy5idWZmZXJUeXBlPWUsdGhpcy5idWZmZXJDb3VudD1zfWdldEVsZW1lbnRUeXBlKHQpe3JldHVybiB0aGlzLmdldE5vZGVUeXBlKHQpfWdldElucHV0VHlwZSgpe3JldHVybiJidWZmZXIifX1jb25zdCBjdT0ocix0LGUpPT52KG5ldyBLcihyLHQsZSkpO2NsYXNzIGh1IGV4dGVuZHMgaXN7c3RhdGljIGdldCB0eXBlKCl7cmV0dXJuIlVuaWZvcm1BcnJheUVsZW1lbnROb2RlIn1jb25zdHJ1Y3Rvcih0LGUpe3N1cGVyKHQsZSksdGhpcy5pc0FycmF5QnVmZmVyRWxlbWVudE5vZGU9ITB9Z2VuZXJhdGUodCl7Y29uc3QgZT1zdXBlci5nZW5lcmF0ZSh0KSxzPXRoaXMuZ2V0Tm9kZVR5cGUoKTtyZXR1cm4gdC5mb3JtYXQoZSwidmVjNCIscyl9fWNsYXNzIHV1IGV4dGVuZHMgS3J7c3RhdGljIGdldCB0eXBlKCl7cmV0dXJuIlVuaWZvcm1BcnJheU5vZGUifWNvbnN0cnVjdG9yKHQsZT1udWxsKXtzdXBlcihudWxsLCJ2ZWM0IiksdGhpcy5hcnJheT10LHRoaXMuZWxlbWVudFR5cGU9ZSx0aGlzLl9lbGVtZW50VHlwZT1udWxsLHRoaXMuX2VsZW1lbnRMZW5ndGg9MCx0aGlzLnVwZGF0ZVR5cGU9US5SRU5ERVIsdGhpcy5pc0FycmF5QnVmZmVyTm9kZT0hMH1nZXRFbGVtZW50VHlwZSgpe3JldHVybiB0aGlzLmVsZW1lbnRUeXBlfHx0aGlzLl9lbGVtZW50VHlwZX1nZXRFbGVtZW50TGVuZ3RoKCl7cmV0dXJuIHRoaXMuX2VsZW1lbnRMZW5ndGh9dXBkYXRlKCl7Y29uc3R7YXJyYXk6dCx2YWx1ZTplfT10aGlzLHM9dGhpcy5nZXRFbGVtZW50TGVuZ3RoKCksbj10aGlzLmdldEVsZW1lbnRUeXBlKCk7aWYocz09PTEpZm9yKGxldCBpPTA7aTx0Lmxlbmd0aDtpKyspe2NvbnN0IG89aSo0O2Vbb109dFtpXX1lbHNlIGlmKG49PT0iY29sb3IiKWZvcihsZXQgaT0wO2k8dC5sZW5ndGg7aSsrKXtjb25zdCBvPWkqNCxhPXRbaV07ZVtvXT1hLnIsZVtvKzFdPWEuZyxlW28rMl09YS5ifHwwfWVsc2UgZm9yKGxldCBpPTA7aTx0Lmxlbmd0aDtpKyspe2NvbnN0IG89aSo0LGE9dFtpXTtlW29dPWEueCxlW28rMV09YS55LGVbbysyXT1hLnp8fDAsZVtvKzNdPWEud3x8MH19c2V0dXAodCl7Y29uc3QgZT10aGlzLmFycmF5Lmxlbmd0aDt0aGlzLl9lbGVtZW50VHlwZT10aGlzLmVsZW1lbnRUeXBlPT09bnVsbD9Wcyh0aGlzLmFycmF5WzBdKTp0aGlzLmVsZW1lbnRUeXBlLHRoaXMuX2VsZW1lbnRMZW5ndGg9dC5nZXRUeXBlTGVuZ3RoKHRoaXMuX2VsZW1lbnRUeXBlKTtsZXQgcz1GbG9hdDMyQXJyYXk7cmV0dXJuIHRoaXMuX2VsZW1lbnRUeXBlLmNoYXJBdCgwKT09PSJpIj9zPUludDMyQXJyYXk6dGhpcy5fZWxlbWVudFR5cGUuY2hhckF0KDApPT09InUiJiYocz1VaW50MzJBcnJheSksdGhpcy52YWx1ZT1uZXcgcyhlKjQpLHRoaXMuYnVmZmVyQ291bnQ9ZSx0aGlzLmJ1ZmZlclR5cGU9dC5jaGFuZ2VDb21wb25lbnRUeXBlKCJ2ZWM0Iix0LmdldENvbXBvbmVudFR5cGUodGhpcy5fZWxlbWVudFR5cGUpKSxzdXBlci5zZXR1cCh0KX1lbGVtZW50KHQpe3JldHVybiB2KG5ldyBodSh0aGlzLHYodCkpKX19Y29uc3QgZmk9KHIsdCk9PnYobmV3IHV1KHIsdCkpO2NsYXNzIGx1IGV4dGVuZHMgaXN7c3RhdGljIGdldCB0eXBlKCl7cmV0dXJuIlJlZmVyZW5jZUVsZW1lbnROb2RlIn1jb25zdHJ1Y3Rvcih0LGUpe3N1cGVyKHQsZSksdGhpcy5yZWZlcmVuY2VOb2RlPXQsdGhpcy5pc1JlZmVyZW5jZUVsZW1lbnROb2RlPSEwfWdldE5vZGVUeXBlKCl7cmV0dXJuIHRoaXMucmVmZXJlbmNlTm9kZS51bmlmb3JtVHlwZX1nZW5lcmF0ZSh0KXtjb25zdCBlPXN1cGVyLmdlbmVyYXRlKHQpLHM9dGhpcy5yZWZlcmVuY2VOb2RlLmdldE5vZGVUeXBlKCksbj10aGlzLmdldE5vZGVUeXBlKCk7cmV0dXJuIHQuZm9ybWF0KGUscyxuKX19Y2xhc3MgdG8gZXh0ZW5kcyBVe3N0YXRpYyBnZXQgdHlwZSgpe3JldHVybiJSZWZlcmVuY2VOb2RlIn1jb25zdHJ1Y3Rvcih0LGUscz1udWxsLG49bnVsbCl7c3VwZXIoKSx0aGlzLnByb3BlcnR5PXQsdGhpcy51bmlmb3JtVHlwZT1lLHRoaXMub2JqZWN0PXMsdGhpcy5jb3VudD1uLHRoaXMucHJvcGVydGllcz10LnNwbGl0KCIuIiksdGhpcy5yZWZlcmVuY2U9cyx0aGlzLm5vZGU9bnVsbCx0aGlzLmdyb3VwPW51bGwsdGhpcy5uYW1lPW51bGwsdGhpcy51cGRhdGVUeXBlPVEuT0JKRUNUfWVsZW1lbnQodCl7cmV0dXJuIHYobmV3IGx1KHRoaXMsdih0KSkpfXNldEdyb3VwKHQpe3JldHVybiB0aGlzLmdyb3VwPXQsdGhpc31sYWJlbCh0KXtyZXR1cm4gdGhpcy5uYW1lPXQsdGhpc31zZXROb2RlVHlwZSh0KXtsZXQgZT1udWxsO3RoaXMuY291bnQhPT1udWxsP2U9Y3UobnVsbCx0LHRoaXMuY291bnQpOkFycmF5LmlzQXJyYXkodGhpcy5nZXRWYWx1ZUZyb21SZWZlcmVuY2UoKSk/ZT1maShudWxsLHQpOnQ9PT0idGV4dHVyZSI/ZT1hcyhudWxsKTp0PT09ImN1YmVUZXh0dXJlIj9lPWF1KG51bGwpOmU9eHQobnVsbCx0KSx0aGlzLmdyb3VwIT09bnVsbCYmZS5zZXRHcm91cCh0aGlzLmdyb3VwKSx0aGlzLm5hbWUhPT1udWxsJiZlLmxhYmVsKHRoaXMubmFtZSksdGhpcy5ub2RlPWUuZ2V0U2VsZigpfWdldE5vZGVUeXBlKHQpe3JldHVybiB0aGlzLm5vZGU9PT1udWxsJiYodGhpcy51cGRhdGVSZWZlcmVuY2UodCksdGhpcy51cGRhdGVWYWx1ZSgpKSx0aGlzLm5vZGUuZ2V0Tm9kZVR5cGUodCl9Z2V0VmFsdWVGcm9tUmVmZXJlbmNlKHQ9dGhpcy5yZWZlcmVuY2Upe2NvbnN0e3Byb3BlcnRpZXM6ZX09dGhpcztsZXQgcz10W2VbMF1dO2ZvcihsZXQgbj0xO248ZS5sZW5ndGg7bisrKXM9c1tlW25dXTtyZXR1cm4gc311cGRhdGVSZWZlcmVuY2UodCl7cmV0dXJuIHRoaXMucmVmZXJlbmNlPXRoaXMub2JqZWN0IT09bnVsbD90aGlzLm9iamVjdDp0Lm9iamVjdCx0aGlzLnJlZmVyZW5jZX1zZXR1cCgpe3JldHVybiB0aGlzLnVwZGF0ZVZhbHVlKCksdGhpcy5ub2RlfXVwZGF0ZSgpe3RoaXMudXBkYXRlVmFsdWUoKX11cGRhdGVWYWx1ZSgpe3RoaXMubm9kZT09PW51bGwmJnRoaXMuc2V0Tm9kZVR5cGUodGhpcy51bmlmb3JtVHlwZSk7Y29uc3QgdD10aGlzLmdldFZhbHVlRnJvbVJlZmVyZW5jZSgpO0FycmF5LmlzQXJyYXkodCk/dGhpcy5ub2RlLmFycmF5PXQ6dGhpcy5ub2RlLnZhbHVlPXR9fWNvbnN0IHBlPShyLHQsZSk9PnYobmV3IHRvKHIsdCxlKSk7Y2xhc3MgZHUgZXh0ZW5kcyB0b3tzdGF0aWMgZ2V0IHR5cGUoKXtyZXR1cm4iTWF0ZXJpYWxSZWZlcmVuY2VOb2RlIn1jb25zdHJ1Y3Rvcih0LGUscz1udWxsKXtzdXBlcih0LGUscyksdGhpcy5tYXRlcmlhbD1zLHRoaXMuaXNNYXRlcmlhbFJlZmVyZW5jZU5vZGU9ITB9dXBkYXRlUmVmZXJlbmNlKHQpe3JldHVybiB0aGlzLnJlZmVyZW5jZT10aGlzLm1hdGVyaWFsIT09bnVsbD90aGlzLm1hdGVyaWFsOnQubWF0ZXJpYWwsdGhpcy5yZWZlcmVuY2V9fWNvbnN0IGZ1PShyLHQsZSk9PnYobmV3IGR1KHIsdCxlKSksZW89dHQocj0+KHIuZ2VvbWV0cnkuaGFzQXR0cmlidXRlKCJ0YW5nZW50Iik9PT0hMSYmci5nZW9tZXRyeS5jb21wdXRlVGFuZ2VudHMoKSxvcygidGFuZ2VudCIsInZlYzQiKSkpKCkscHU9ZW8ueHl6LnRvVmFyKCJ0YW5nZW50TG9jYWwiKSxzbz1aci5tdWwoQmUocHUsMCkpLnh5ei52YXJ5aW5nKCJ2X3RhbmdlbnRWaWV3Iikubm9ybWFsaXplKCkudG9WYXIoInRhbmdlbnRWaWV3IiksbXU9cXMoc28sUGUoKHI9PnIubXVsKGVvLncpLnh5eikoTGUuY3Jvc3Moc28pKSwidl9iaXRhbmdlbnRWaWV3Iikubm9ybWFsaXplKCkudG9WYXIoImJpdGFuZ2VudFZpZXciKSxMZSkseXU9dHQocj0+e2NvbnN0e2V5ZV9wb3M6dCxzdXJmX25vcm06ZSxtYXBOOnMsdXY6bn09cixpPXQuZEZkeCgpLG89dC5kRmR5KCksYT1uLmRGZHgoKSxjPW4uZEZkeSgpLHU9ZSxoPW8uY3Jvc3ModSksbD11LmNyb3NzKGkpLGQ9aC5tdWwoYS54KS5hZGQobC5tdWwoYy54KSksZj1oLm11bChhLnkpLmFkZChsLm11bChjLnkpKSxwPWQuZG90KGQpLm1heChmLmRvdChmKSksbT1kaS5tdWwocC5pbnZlcnNlU3FydCgpKTtyZXR1cm4gZmUoZC5tdWwocy54LG0pLGYubXVsKHMueSxtKSx1Lm11bChzLnopKS5ub3JtYWxpemUoKX0pO2NsYXNzIGd1IGV4dGVuZHMgZHR7c3RhdGljIGdldCB0eXBlKCl7cmV0dXJuIk5vcm1hbE1hcE5vZGUifWNvbnN0cnVjdG9yKHQsZT1udWxsKXtzdXBlcigidmVjMyIpLHRoaXMubm9kZT10LHRoaXMuc2NhbGVOb2RlPWUsdGhpcy5ub3JtYWxNYXBUeXBlPVlpfXNldHVwKHQpe2NvbnN0e25vcm1hbE1hcFR5cGU6ZSxzY2FsZU5vZGU6c309dGhpcztsZXQgbj10aGlzLm5vZGUubXVsKDIpLnN1YigxKTtzIT09bnVsbCYmKG49ayhuLnh5Lm11bChzKSxuLnopKTtsZXQgaT1udWxsO3JldHVybiBlPT09T28/aT1RcihuKTplPT09WWkmJih0Lmhhc0dlb21ldHJ5QXR0cmlidXRlKCJ0YW5nZW50Iik9PT0hMD9pPW11Lm11bChuKS5ub3JtYWxpemUoKTppPXl1KHtleWVfcG9zOk10LHN1cmZfbm9ybTpMZSxtYXBOOm4sdXY6WnMoKX0pKSxpfX1jb25zdCBubz1DKGd1KSx4dT10dCgoe3RleHR1cmVOb2RlOnIsYnVtcFNjYWxlOnR9KT0+e2NvbnN0IGU9bj0+ci5jYWNoZSgpLmNvbnRleHQoe2dldFVWOmk9Pm4oaS51dk5vZGV8fFpzKCkpLGZvcmNlVVZDb250ZXh0OiEwfSkscz1xKGUobj0+bikpO3JldHVybiBEKHEoZShuPT5uLmFkZChuLmRGZHgoKSkpKS5zdWIocykscShlKG49Pm4uYWRkKG4uZEZkeSgpKSkpLnN1YihzKSkubXVsKHQpfSksVHU9dHQocj0+e2NvbnN0e3N1cmZfcG9zOnQsc3VyZl9ub3JtOmUsZEhkeHk6c309cixuPXQuZEZkeCgpLm5vcm1hbGl6ZSgpLGk9dC5kRmR5KCkubm9ybWFsaXplKCksbz1lLGE9aS5jcm9zcyhvKSxjPW8uY3Jvc3MobiksdT1uLmRvdChhKS5tdWwoZGkpLGg9dS5zaWduKCkubXVsKHMueC5tdWwoYSkuYWRkKHMueS5tdWwoYykpKTtyZXR1cm4gdS5hYnMoKS5tdWwoZSkuc3ViKGgpLm5vcm1hbGl6ZSgpfSk7Y2xhc3MgTnUgZXh0ZW5kcyBkdHtzdGF0aWMgZ2V0IHR5cGUoKXtyZXR1cm4iQnVtcE1hcE5vZGUifWNvbnN0cnVjdG9yKHQsZT1udWxsKXtzdXBlcigidmVjMyIpLHRoaXMudGV4dHVyZU5vZGU9dCx0aGlzLnNjYWxlTm9kZT1lfXNldHVwKCl7Y29uc3QgdD10aGlzLnNjYWxlTm9kZSE9PW51bGw/dGhpcy5zY2FsZU5vZGU6MSxlPXh1KHt0ZXh0dXJlTm9kZTp0aGlzLnRleHR1cmVOb2RlLGJ1bXBTY2FsZTp0fSk7cmV0dXJuIFR1KHtzdXJmX3BvczpNdCxzdXJmX25vcm06TGUsZEhkeHk6ZX0pfX1jb25zdCB3dT1DKE51KSxpbz1uZXcgTWFwO2NsYXNzIHogZXh0ZW5kcyBVe3N0YXRpYyBnZXQgdHlwZSgpe3JldHVybiJNYXRlcmlhbE5vZGUifWNvbnN0cnVjdG9yKHQpe3N1cGVyKCksdGhpcy5zY29wZT10fWdldENhY2hlKHQsZSl7bGV0IHM9aW8uZ2V0KHQpO3JldHVybiBzPT09dm9pZCAwJiYocz1mdSh0LGUpLGlvLnNldCh0LHMpKSxzfWdldEZsb2F0KHQpe3JldHVybiB0aGlzLmdldENhY2hlKHQsImZsb2F0Iil9Z2V0Q29sb3IodCl7cmV0dXJuIHRoaXMuZ2V0Q2FjaGUodCwiY29sb3IiKX1nZXRUZXh0dXJlKHQpe3JldHVybiB0aGlzLmdldENhY2hlKHQ9PT0ibWFwIj8ibWFwIjp0KyJNYXAiLCJ0ZXh0dXJlIil9c2V0dXAodCl7Y29uc3QgZT10LmNvbnRleHQubWF0ZXJpYWwscz10aGlzLnNjb3BlO2xldCBuPW51bGw7aWYocz09PXouQ09MT1Ipe2NvbnN0IGk9ZS5jb2xvciE9PXZvaWQgMD90aGlzLmdldENvbG9yKHMpOmsoKTtlLm1hcCYmZS5tYXAuaXNUZXh0dXJlPT09ITA/bj1pLm11bCh0aGlzLmdldFRleHR1cmUoIm1hcCIpKTpuPWl9ZWxzZSBpZihzPT09ei5PUEFDSVRZKXtjb25zdCBpPXRoaXMuZ2V0RmxvYXQocyk7ZS5hbHBoYU1hcCYmZS5hbHBoYU1hcC5pc1RleHR1cmU9PT0hMD9uPWkubXVsKHRoaXMuZ2V0VGV4dHVyZSgiYWxwaGEiKSk6bj1pfWVsc2UgaWYocz09PXouU1BFQ1VMQVJfU1RSRU5HVEgpZS5zcGVjdWxhck1hcCYmZS5zcGVjdWxhck1hcC5pc1RleHR1cmU9PT0hMD9uPXRoaXMuZ2V0VGV4dHVyZSgic3BlY3VsYXIiKS5yOm49cSgxKTtlbHNlIGlmKHM9PT16LlNQRUNVTEFSX0lOVEVOU0lUWSl7Y29uc3QgaT10aGlzLmdldEZsb2F0KHMpO2Uuc3BlY3VsYXJNYXA/bj1pLm11bCh0aGlzLmdldFRleHR1cmUocykuYSk6bj1pfWVsc2UgaWYocz09PXouU1BFQ1VMQVJfQ09MT1Ipe2NvbnN0IGk9dGhpcy5nZXRDb2xvcihzKTtlLnNwZWN1bGFyQ29sb3JNYXAmJmUuc3BlY3VsYXJDb2xvck1hcC5pc1RleHR1cmU9PT0hMD9uPWkubXVsKHRoaXMuZ2V0VGV4dHVyZShzKS5yZ2IpOm49aX1lbHNlIGlmKHM9PT16LlJPVUdITkVTUyl7Y29uc3QgaT10aGlzLmdldEZsb2F0KHMpO2Uucm91Z2huZXNzTWFwJiZlLnJvdWdobmVzc01hcC5pc1RleHR1cmU9PT0hMD9uPWkubXVsKHRoaXMuZ2V0VGV4dHVyZShzKS5nKTpuPWl9ZWxzZSBpZihzPT09ei5NRVRBTE5FU1Mpe2NvbnN0IGk9dGhpcy5nZXRGbG9hdChzKTtlLm1ldGFsbmVzc01hcCYmZS5tZXRhbG5lc3NNYXAuaXNUZXh0dXJlPT09ITA/bj1pLm11bCh0aGlzLmdldFRleHR1cmUocykuYik6bj1pfWVsc2UgaWYocz09PXouRU1JU1NJVkUpe2NvbnN0IGk9dGhpcy5nZXRGbG9hdCgiZW1pc3NpdmVJbnRlbnNpdHkiKSxvPXRoaXMuZ2V0Q29sb3IocykubXVsKGkpO2UuZW1pc3NpdmVNYXAmJmUuZW1pc3NpdmVNYXAuaXNUZXh0dXJlPT09ITA/bj1vLm11bCh0aGlzLmdldFRleHR1cmUocykpOm49b31lbHNlIGlmKHM9PT16Lk5PUk1BTCllLm5vcm1hbE1hcD8obj1ubyh0aGlzLmdldFRleHR1cmUoIm5vcm1hbCIpLHRoaXMuZ2V0Q2FjaGUoIm5vcm1hbFNjYWxlIiwidmVjMiIpKSxuLm5vcm1hbE1hcFR5cGU9ZS5ub3JtYWxNYXBUeXBlKTplLmJ1bXBNYXA/bj13dSh0aGlzLmdldFRleHR1cmUoImJ1bXAiKS5yLHRoaXMuZ2V0RmxvYXQoImJ1bXBTY2FsZSIpKTpuPUxlO2Vsc2UgaWYocz09PXouQ0xFQVJDT0FUKXtjb25zdCBpPXRoaXMuZ2V0RmxvYXQocyk7ZS5jbGVhcmNvYXRNYXAmJmUuY2xlYXJjb2F0TWFwLmlzVGV4dHVyZT09PSEwP249aS5tdWwodGhpcy5nZXRUZXh0dXJlKHMpLnIpOm49aX1lbHNlIGlmKHM9PT16LkNMRUFSQ09BVF9ST1VHSE5FU1Mpe2NvbnN0IGk9dGhpcy5nZXRGbG9hdChzKTtlLmNsZWFyY29hdFJvdWdobmVzc01hcCYmZS5jbGVhcmNvYXRSb3VnaG5lc3NNYXAuaXNUZXh0dXJlPT09ITA/bj1pLm11bCh0aGlzLmdldFRleHR1cmUocykucik6bj1pfWVsc2UgaWYocz09PXouQ0xFQVJDT0FUX05PUk1BTCllLmNsZWFyY29hdE5vcm1hbE1hcD9uPW5vKHRoaXMuZ2V0VGV4dHVyZShzKSx0aGlzLmdldENhY2hlKHMrIlNjYWxlIiwidmVjMiIpKTpuPUxlO2Vsc2UgaWYocz09PXouU0hFRU4pe2NvbnN0IGk9dGhpcy5nZXRDb2xvcigic2hlZW5Db2xvciIpLm11bCh0aGlzLmdldEZsb2F0KCJzaGVlbiIpKTtlLnNoZWVuQ29sb3JNYXAmJmUuc2hlZW5Db2xvck1hcC5pc1RleHR1cmU9PT0hMD9uPWkubXVsKHRoaXMuZ2V0VGV4dHVyZSgic2hlZW5Db2xvciIpLnJnYik6bj1pfWVsc2UgaWYocz09PXouU0hFRU5fUk9VR0hORVNTKXtjb25zdCBpPXRoaXMuZ2V0RmxvYXQocyk7ZS5zaGVlblJvdWdobmVzc01hcCYmZS5zaGVlblJvdWdobmVzc01hcC5pc1RleHR1cmU9PT0hMD9uPWkubXVsKHRoaXMuZ2V0VGV4dHVyZShzKS5hKTpuPWksbj1uLmNsYW1wKC4wNywxKX1lbHNlIGlmKHM9PT16LkFOSVNPVFJPUFkpaWYoZS5hbmlzb3Ryb3B5TWFwJiZlLmFuaXNvdHJvcHlNYXAuaXNUZXh0dXJlPT09ITApe2NvbnN0IGk9dGhpcy5nZXRUZXh0dXJlKHMpO249UnIodXMueCx1cy55LHVzLnkubmVnYXRlKCksdXMueCkubXVsKGkucmcubXVsKDIpLnN1YihEKDEpKS5ub3JtYWxpemUoKS5tdWwoaS5iKSl9ZWxzZSBuPXVzO2Vsc2UgaWYocz09PXouSVJJREVTQ0VOQ0VfVEhJQ0tORVNTKXtjb25zdCBpPXBlKCIxIiwiZmxvYXQiLGUuaXJpZGVzY2VuY2VUaGlja25lc3NSYW5nZSk7aWYoZS5pcmlkZXNjZW5jZVRoaWNrbmVzc01hcCl7Y29uc3Qgbz1wZSgiMCIsImZsb2F0IixlLmlyaWRlc2NlbmNlVGhpY2tuZXNzUmFuZ2UpO249aS5zdWIobykubXVsKHRoaXMuZ2V0VGV4dHVyZShzKS5nKS5hZGQobyl9ZWxzZSBuPWl9ZWxzZSBpZihzPT09ei5UUkFOU01JU1NJT04pe2NvbnN0IGk9dGhpcy5nZXRGbG9hdChzKTtlLnRyYW5zbWlzc2lvbk1hcD9uPWkubXVsKHRoaXMuZ2V0VGV4dHVyZShzKS5yKTpuPWl9ZWxzZSBpZihzPT09ei5USElDS05FU1Mpe2NvbnN0IGk9dGhpcy5nZXRGbG9hdChzKTtlLnRoaWNrbmVzc01hcD9uPWkubXVsKHRoaXMuZ2V0VGV4dHVyZShzKS5nKTpuPWl9ZWxzZSBpZihzPT09ei5JT1Ipbj10aGlzLmdldEZsb2F0KHMpO2Vsc2UgaWYocz09PXouTElHSFRfTUFQKW49dGhpcy5nZXRUZXh0dXJlKHMpLnJnYi5tdWwodGhpcy5nZXRGbG9hdCgibGlnaHRNYXBJbnRlbnNpdHkiKSk7ZWxzZSBpZihzPT09ei5BT19NQVApbj10aGlzLmdldFRleHR1cmUocykuci5zdWIoMSkubXVsKHRoaXMuZ2V0RmxvYXQoImFvTWFwSW50ZW5zaXR5IikpLmFkZCgxKTtlbHNle2NvbnN0IGk9dGhpcy5nZXROb2RlVHlwZSh0KTtuPXRoaXMuZ2V0Q2FjaGUocyxpKX1yZXR1cm4gbn19ei5BTFBIQV9URVNUPSJhbHBoYVRlc3QiLHouQ09MT1I9ImNvbG9yIix6Lk9QQUNJVFk9Im9wYWNpdHkiLHouU0hJTklORVNTPSJzaGluaW5lc3MiLHouU1BFQ1VMQVI9InNwZWN1bGFyIix6LlNQRUNVTEFSX1NUUkVOR1RIPSJzcGVjdWxhclN0cmVuZ3RoIix6LlNQRUNVTEFSX0lOVEVOU0lUWT0ic3BlY3VsYXJJbnRlbnNpdHkiLHouU1BFQ1VMQVJfQ09MT1I9InNwZWN1bGFyQ29sb3IiLHouUkVGTEVDVElWSVRZPSJyZWZsZWN0aXZpdHkiLHouUk9VR0hORVNTPSJyb3VnaG5lc3MiLHouTUVUQUxORVNTPSJtZXRhbG5lc3MiLHouTk9STUFMPSJub3JtYWwiLHouQ0xFQVJDT0FUPSJjbGVhcmNvYXQiLHouQ0xFQVJDT0FUX1JPVUdITkVTUz0iY2xlYXJjb2F0Um91Z2huZXNzIix6LkNMRUFSQ09BVF9OT1JNQUw9ImNsZWFyY29hdE5vcm1hbCIsei5FTUlTU0lWRT0iZW1pc3NpdmUiLHouUk9UQVRJT049InJvdGF0aW9uIix6LlNIRUVOPSJzaGVlbiIsei5TSEVFTl9ST1VHSE5FU1M9InNoZWVuUm91Z2huZXNzIix6LkFOSVNPVFJPUFk9ImFuaXNvdHJvcHkiLHouSVJJREVTQ0VOQ0U9ImlyaWRlc2NlbmNlIix6LklSSURFU0NFTkNFX0lPUj0iaXJpZGVzY2VuY2VJT1IiLHouSVJJREVTQ0VOQ0VfVEhJQ0tORVNTPSJpcmlkZXNjZW5jZVRoaWNrbmVzcyIsei5JT1I9ImlvciIsei5UUkFOU01JU1NJT049InRyYW5zbWlzc2lvbiIsei5USElDS05FU1M9InRoaWNrbmVzcyIsei5BVFRFTlVBVElPTl9ESVNUQU5DRT0iYXR0ZW51YXRpb25EaXN0YW5jZSIsei5BVFRFTlVBVElPTl9DT0xPUj0iYXR0ZW51YXRpb25Db2xvciIsei5MSU5FX1NDQUxFPSJzY2FsZSIsei5MSU5FX0RBU0hfU0laRT0iZGFzaFNpemUiLHouTElORV9HQVBfU0laRT0iZ2FwU2l6ZSIsei5MSU5FX1dJRFRIPSJsaW5ld2lkdGgiLHouTElORV9EQVNIX09GRlNFVD0iZGFzaE9mZnNldCIsei5QT0lOVF9XSURUSD0icG9pbnRXaWR0aCIsei5ESVNQRVJTSU9OPSJkaXNwZXJzaW9uIix6LkxJR0hUX01BUD0ibGlnaHQiLHouQU9fTUFQPSJhbyIsei5BTFBIQV9URVNULHouQ09MT1Isei5TSElOSU5FU1Msei5FTUlTU0lWRSx6Lk9QQUNJVFksei5TUEVDVUxBUix6LlNQRUNVTEFSX0lOVEVOU0lUWSx6LlNQRUNVTEFSX0NPTE9SLHouU1BFQ1VMQVJfU1RSRU5HVEgsei5SRUZMRUNUSVZJVFksei5ST1VHSE5FU1Msei5NRVRBTE5FU1Msei5DTEVBUkNPQVQsei5DTEVBUkNPQVRfUk9VR0hORVNTLHouUk9UQVRJT04sei5TSEVFTix6LlNIRUVOX1JPVUdITkVTUyx6LkFOSVNPVFJPUFksei5JUklERVNDRU5DRSx6LklSSURFU0NFTkNFX0lPUix6LklSSURFU0NFTkNFX1RISUNLTkVTUyx6LlRSQU5TTUlTU0lPTix6LlRISUNLTkVTUyx6LklPUix6LkFUVEVOVUFUSU9OX0RJU1RBTkNFLHouQVRURU5VQVRJT05fQ09MT1Isei5MSU5FX1NDQUxFLHouTElORV9EQVNIX1NJWkUsei5MSU5FX0dBUF9TSVpFLHouTElORV9XSURUSCx6LkxJTkVfREFTSF9PRkZTRVQsei5QT0lOVF9XSURUSCx6LkRJU1BFUlNJT04sei5MSUdIVF9NQVAsei5BT19NQVA7Y29uc3QgdXM9eHQobmV3IEopLm9uUmVmZXJlbmNlKGZ1bmN0aW9uKHIpe3JldHVybiByLm1hdGVyaWFsfSkub25SZW5kZXJVcGRhdGUoZnVuY3Rpb24oe21hdGVyaWFsOnJ9KXt0aGlzLnZhbHVlLnNldChyLmFuaXNvdHJvcHkqTWF0aC5jb3Moci5hbmlzb3Ryb3B5Um90YXRpb24pLHIuYW5pc290cm9weSpNYXRoLnNpbihyLmFuaXNvdHJvcHlSb3RhdGlvbikpfSk7Y2xhc3MgVyBleHRlbmRzIFV7c3RhdGljIGdldCB0eXBlKCl7cmV0dXJuIkluZGV4Tm9kZSJ9Y29uc3RydWN0b3IodCl7c3VwZXIoInVpbnQiKSx0aGlzLnNjb3BlPXQsdGhpcy5pc0luc3RhbmNlSW5kZXhOb2RlPSEwfWdlbmVyYXRlKHQpe2NvbnN0IGU9dGhpcy5nZXROb2RlVHlwZSh0KSxzPXRoaXMuc2NvcGU7bGV0IG47aWYocz09PVcuVkVSVEVYKW49dC5nZXRWZXJ0ZXhJbmRleCgpO2Vsc2UgaWYocz09PVcuSU5TVEFOQ0Upbj10LmdldEluc3RhbmNlSW5kZXgoKTtlbHNlIGlmKHM9PT1XLkRSQVcpbj10LmdldERyYXdJbmRleCgpO2Vsc2UgaWYocz09PVcuSU5WT0NBVElPTl9MT0NBTCluPXQuZ2V0SW52b2NhdGlvbkxvY2FsSW5kZXgoKTtlbHNlIGlmKHM9PT1XLklOVk9DQVRJT05fU1VCR1JPVVApbj10LmdldEludm9jYXRpb25TdWJncm91cEluZGV4KCk7ZWxzZSBpZihzPT09Vy5TVUJHUk9VUCluPXQuZ2V0U3ViZ3JvdXBJbmRleCgpO2Vsc2UgdGhyb3cgbmV3IEVycm9yKCJUSFJFRS5JbmRleE5vZGU6IFVua25vd24gc2NvcGU6ICIrcyk7bGV0IGk7cmV0dXJuIHQuc2hhZGVyU3RhZ2U9PT0idmVydGV4Inx8dC5zaGFkZXJTdGFnZT09PSJjb21wdXRlIj9pPW46aT1QZSh0aGlzKS5idWlsZCh0LGUpLGl9fVcuVkVSVEVYPSJ2ZXJ0ZXgiLFcuSU5TVEFOQ0U9Imluc3RhbmNlIixXLlNVQkdST1VQPSJzdWJncm91cCIsVy5JTlZPQ0FUSU9OX0xPQ0FMPSJpbnZvY2F0aW9uTG9jYWwiLFcuSU5WT0NBVElPTl9TVUJHUk9VUD0iaW52b2NhdGlvblN1Ymdyb3VwIixXLkRSQVc9ImRyYXciLFcuVkVSVEVYLFcuSU5TVEFOQ0UsVy5TVUJHUk9VUCxXLklOVk9DQVRJT05fU1VCR1JPVVAsVy5JTlZPQ0FUSU9OX0xPQ0FMLFcuRFJBVztjbGFzcyBBdSBleHRlbmRzIFV7c3RhdGljIGdldCB0eXBlKCl7cmV0dXJuIkxvb3BOb2RlIn1jb25zdHJ1Y3Rvcih0PVtdKXtzdXBlcigpLHRoaXMucGFyYW1zPXR9Z2V0VmFyTmFtZSh0KXtyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZSgiaSIuY2hhckNvZGVBdCgpK3QpfWdldFByb3BlcnRpZXModCl7Y29uc3QgZT10LmdldE5vZGVQcm9wZXJ0aWVzKHRoaXMpO2lmKGUuc3RhY2tOb2RlIT09dm9pZCAwKXJldHVybiBlO2NvbnN0IHM9e307Zm9yKGxldCBpPTAsbz10aGlzLnBhcmFtcy5sZW5ndGgtMTtpPG87aSsrKXtjb25zdCBhPXRoaXMucGFyYW1zW2ldLGM9YS5pc05vZGUhPT0hMCYmYS5uYW1lfHx0aGlzLmdldFZhck5hbWUoaSksdT1hLmlzTm9kZSE9PSEwJiZhLnR5cGV8fCJpbnQiO3NbY109WXMoYyx1KX1jb25zdCBuPXQuYWRkU3RhY2soKTtyZXR1cm4gZS5yZXR1cm5zTm9kZT10aGlzLnBhcmFtc1t0aGlzLnBhcmFtcy5sZW5ndGgtMV0ocyxuLHQpLGUuc3RhY2tOb2RlPW4sdC5yZW1vdmVTdGFjaygpLGV9Z2V0Tm9kZVR5cGUodCl7Y29uc3R7cmV0dXJuc05vZGU6ZX09dGhpcy5nZXRQcm9wZXJ0aWVzKHQpO3JldHVybiBlP2UuZ2V0Tm9kZVR5cGUodCk6InZvaWQifXNldHVwKHQpe3RoaXMuZ2V0UHJvcGVydGllcyh0KX1nZW5lcmF0ZSh0KXtjb25zdCBlPXRoaXMuZ2V0UHJvcGVydGllcyh0KSxzPXRoaXMucGFyYW1zLG49ZS5zdGFja05vZGU7Zm9yKGxldCBhPTAsYz1zLmxlbmd0aC0xO2E8YzthKyspe2NvbnN0IHU9c1thXTtsZXQgaD1udWxsLGw9bnVsbCxkPW51bGwsZj1udWxsLHA9bnVsbCxtPW51bGw7dS5pc05vZGU/KGY9ImludCIsZD10aGlzLmdldFZhck5hbWUoYSksaD0iMCIsbD11LmJ1aWxkKHQsZikscD0iPCIpOihmPXUudHlwZXx8ImludCIsZD11Lm5hbWV8fHRoaXMuZ2V0VmFyTmFtZShhKSxoPXUuc3RhcnQsbD11LmVuZCxwPXUuY29uZGl0aW9uLG09dS51cGRhdGUsdHlwZW9mIGg9PSJudW1iZXIiP2g9aC50b1N0cmluZygpOmgmJmguaXNOb2RlJiYoaD1oLmJ1aWxkKHQsZikpLHR5cGVvZiBsPT0ibnVtYmVyIj9sPWwudG9TdHJpbmcoKTpsJiZsLmlzTm9kZSYmKGw9bC5idWlsZCh0LGYpKSxoIT09dm9pZCAwJiZsPT09dm9pZCAwPyhoPWgrIiAtIDEiLGw9IjAiLHA9Ij49Iik6bCE9PXZvaWQgMCYmaD09PXZvaWQgMCYmKGg9IjAiLHA9IjwiKSxwPT09dm9pZCAwJiYoTnVtYmVyKGgpPk51bWJlcihsKT9wPSI+PSI6cD0iPCIpKTtjb25zdCBnPXtzdGFydDpoLGVuZDpsLGNvbmRpdGlvbjpwfSx5PWcuc3RhcnQsVD1nLmVuZDtsZXQgdz0iIixNPSIiLE49IiI7bXx8KGY9PT0iaW50Inx8Zj09PSJ1aW50Ij9wLmluY2x1ZGVzKCI8Iik/bT0iKysiOm09Ii0tIjpwLmluY2x1ZGVzKCI8Iik/bT0iKz0gMS4iOm09Ii09IDEuIiksdys9dC5nZXRWYXIoZixkKSsiID0gIit5LE0rPWQrIiAiK3ArIiAiK1QsTis9ZCsiICIrbTtjb25zdCBfPWBmb3IgKCAke3d9OyAke019OyAke059IClgO3QuYWRkRmxvd0NvZGUoKGE9PT0wP2AKYDoiIikrdC50YWIrXytgIHsKCmApLmFkZEZsb3dUYWIoKX1jb25zdCBpPW4uYnVpbGQodCwidm9pZCIpLG89ZS5yZXR1cm5zTm9kZT9lLnJldHVybnNOb2RlLmJ1aWxkKHQpOiIiO3QucmVtb3ZlRmxvd1RhYigpLmFkZEZsb3dDb2RlKGAKYCt0LnRhYitpKTtmb3IobGV0IGE9MCxjPXRoaXMucGFyYW1zLmxlbmd0aC0xO2E8YzthKyspdC5hZGRGbG93Q29kZSgoYT09PTA/IiI6dC50YWIpK2B9CgpgKS5yZW1vdmVGbG93VGFiKCk7cmV0dXJuIHQuYWRkRmxvd1RhYigpLG99fWNvbnN0IE9lPSguLi5yKT0+dihuZXcgQXUoRmUociwiaW50IikpKS5hcHBlbmQoKTtsZXQgbHMsZHM7Y2xhc3MgZXQgZXh0ZW5kcyBVe3N0YXRpYyBnZXQgdHlwZSgpe3JldHVybiJTY3JlZW5Ob2RlIn1jb25zdHJ1Y3Rvcih0KXtzdXBlcigpLHRoaXMuc2NvcGU9dCx0aGlzLmlzVmlld3BvcnROb2RlPSEwfWdldE5vZGVUeXBlKCl7cmV0dXJuIHRoaXMuc2NvcGU9PT1ldC5WSUVXUE9SVD8idmVjNCI6InZlYzIifWdldFVwZGF0ZVR5cGUoKXtsZXQgdD1RLk5PTkU7cmV0dXJuKHRoaXMuc2NvcGU9PT1ldC5TSVpFfHx0aGlzLnNjb3BlPT09ZXQuVklFV1BPUlQpJiYodD1RLlJFTkRFUiksdGhpcy51cGRhdGVUeXBlPXQsdH11cGRhdGUoe3JlbmRlcmVyOnR9KXtjb25zdCBlPXQuZ2V0UmVuZGVyVGFyZ2V0KCk7dGhpcy5zY29wZT09PWV0LlZJRVdQT1JUP2UhPT1udWxsP2RzLmNvcHkoZS52aWV3cG9ydCk6KHQuZ2V0Vmlld3BvcnQoZHMpLGRzLm11bHRpcGx5U2NhbGFyKHQuZ2V0UGl4ZWxSYXRpbygpKSk6ZSE9PW51bGw/KGxzLndpZHRoPWUud2lkdGgsbHMuaGVpZ2h0PWUuaGVpZ2h0KTp0LmdldERyYXdpbmdCdWZmZXJTaXplKGxzKX1zZXR1cCgpe2NvbnN0IHQ9dGhpcy5zY29wZTtsZXQgZT1udWxsO3JldHVybiB0PT09ZXQuU0laRT9lPXh0KGxzfHwobHM9bmV3IEopKTp0PT09ZXQuVklFV1BPUlQ/ZT14dChkc3x8KGRzPW5ldyBGdCkpOmU9RChRcy5kaXYocm8pKSxlfWdlbmVyYXRlKHQpe2lmKHRoaXMuc2NvcGU9PT1ldC5DT09SRElOQVRFKXtsZXQgZT10LmdldEZyYWdDb29yZCgpO2lmKHQuaXNGbGlwWSgpKXtjb25zdCBzPXQuZ2V0Tm9kZVByb3BlcnRpZXMocm8pLm91dHB1dE5vZGUuYnVpbGQodCk7ZT1gJHt0LmdldFR5cGUoInZlYzIiKX0oICR7ZX0ueCwgJHtzfS55IC0gJHtlfS55IClgfXJldHVybiBlfXJldHVybiBzdXBlci5nZW5lcmF0ZSh0KX19ZXQuQ09PUkRJTkFURT0iY29vcmRpbmF0ZSIsZXQuVklFV1BPUlQ9InZpZXdwb3J0IixldC5TSVpFPSJzaXplIixldC5VVj0idXYiO2NvbnN0IHBpPU8oZXQsZXQuVVYpLHJvPU8oZXQsZXQuU0laRSksUXM9TyhldCxldC5DT09SRElOQVRFKSxvbz1PKGV0LGV0LlZJRVdQT1JUKTtvby56dyxvby54eTtjb25zdCBmcz1uZXcgSjtjbGFzcyBNdSBleHRlbmRzIEpze3N0YXRpYyBnZXQgdHlwZSgpe3JldHVybiJWaWV3cG9ydFRleHR1cmVOb2RlIn1jb25zdHJ1Y3Rvcih0PXBpLGU9bnVsbCxzPW51bGwpe3M9PT1udWxsJiYocz1uZXcgQWEscy5taW5GaWx0ZXI9R2kpLHN1cGVyKHMsdCxlKSx0aGlzLmdlbmVyYXRlTWlwbWFwcz0hMSx0aGlzLmlzT3V0cHV0VGV4dHVyZU5vZGU9ITAsdGhpcy51cGRhdGVCZWZvcmVUeXBlPVEuRlJBTUV9dXBkYXRlQmVmb3JlKHQpe2NvbnN0IGU9dC5yZW5kZXJlcjtlLmdldERyYXdpbmdCdWZmZXJTaXplKGZzKTtjb25zdCBzPXRoaXMudmFsdWU7KHMuaW1hZ2Uud2lkdGghPT1mcy53aWR0aHx8cy5pbWFnZS5oZWlnaHQhPT1mcy5oZWlnaHQpJiYocy5pbWFnZS53aWR0aD1mcy53aWR0aCxzLmltYWdlLmhlaWdodD1mcy5oZWlnaHQscy5uZWVkc1VwZGF0ZT0hMCk7Y29uc3Qgbj1zLmdlbmVyYXRlTWlwbWFwcztzLmdlbmVyYXRlTWlwbWFwcz10aGlzLmdlbmVyYXRlTWlwbWFwcyxlLmNvcHlGcmFtZWJ1ZmZlclRvVGV4dHVyZShzKSxzLmdlbmVyYXRlTWlwbWFwcz1ufWNsb25lKCl7Y29uc3QgdD1uZXcgdGhpcy5jb25zdHJ1Y3Rvcih0aGlzLnV2Tm9kZSx0aGlzLmxldmVsTm9kZSx0aGlzLnZhbHVlKTtyZXR1cm4gdC5nZW5lcmF0ZU1pcG1hcHM9dGhpcy5nZW5lcmF0ZU1pcG1hcHMsdH19bGV0IG1pPW51bGw7Y2xhc3MgU3UgZXh0ZW5kcyBNdXtzdGF0aWMgZ2V0IHR5cGUoKXtyZXR1cm4iVmlld3BvcnREZXB0aFRleHR1cmVOb2RlIn1jb25zdHJ1Y3Rvcih0PXBpLGU9bnVsbCl7bWk9PT1udWxsJiYobWk9bmV3IHhyKSxzdXBlcih0LGUsbWkpfX1jb25zdCBfdT1DKFN1KTtjbGFzcyBmdCBleHRlbmRzIFV7c3RhdGljIGdldCB0eXBlKCl7cmV0dXJuIlZpZXdwb3J0RGVwdGhOb2RlIn1jb25zdHJ1Y3Rvcih0LGU9bnVsbCl7c3VwZXIoImZsb2F0IiksdGhpcy5zY29wZT10LHRoaXMudmFsdWVOb2RlPWUsdGhpcy5pc1ZpZXdwb3J0RGVwdGhOb2RlPSEwfWdlbmVyYXRlKHQpe2NvbnN0e3Njb3BlOmV9PXRoaXM7cmV0dXJuIGU9PT1mdC5ERVBUSF9CQVNFP3QuZ2V0RnJhZ0RlcHRoKCk6c3VwZXIuZ2VuZXJhdGUodCl9c2V0dXAoe2NhbWVyYTp0fSl7Y29uc3R7c2NvcGU6ZX09dGhpcyxzPXRoaXMudmFsdWVOb2RlO2xldCBuPW51bGw7aWYoZT09PWZ0LkRFUFRIX0JBU0UpcyE9PW51bGwmJihuPWNvKCkuYXNzaWduKHMpKTtlbHNlIGlmKGU9PT1mdC5ERVBUSCl0LmlzUGVyc3BlY3RpdmVDYW1lcmE/bj16dShNdC56LGNzLGhzKTpuPUtzKE10LnosY3MsaHMpO2Vsc2UgaWYoZT09PWZ0LkxJTkVBUl9ERVBUSClpZihzIT09bnVsbClpZih0LmlzUGVyc3BlY3RpdmVDYW1lcmEpe2NvbnN0IGk9YW8ocyxjcyxocyk7bj1LcyhpLGNzLGhzKX1lbHNlIG49cztlbHNlIG49S3MoTXQueixjcyxocyk7cmV0dXJuIG59fWZ0LkRFUFRIX0JBU0U9ImRlcHRoQmFzZSIsZnQuREVQVEg9ImRlcHRoIixmdC5MSU5FQVJfREVQVEg9ImxpbmVhckRlcHRoIjtjb25zdCBLcz0ocix0LGUpPT5yLmFkZCh0KS5kaXYodC5zdWIoZSkpLHp1PShyLHQsZSk9PnQuYWRkKHIpLm11bChlKS5kaXYoZS5zdWIodCkubXVsKHIpKSxhbz0ocix0LGUpPT50Lm11bChlKS5kaXYoZS5zdWIodCkubXVsKHIpLnN1YihlKSksY289QyhmdCxmdC5ERVBUSF9CQVNFKSxidT1PKGZ0LGZ0LkRFUFRIKSxFdT1DKGZ0LGZ0LkxJTkVBUl9ERVBUSCk7X3UoKSxidS5hc3NpZ249cj0+Y28ocik7Y2xhc3MgcHMgZXh0ZW5kcyBVe3N0YXRpYyBnZXQgdHlwZSgpe3JldHVybiJDbGlwcGluZ05vZGUifWNvbnN0cnVjdG9yKHQ9cHMuREVGQVVMVCl7c3VwZXIoKSx0aGlzLnNjb3BlPXR9c2V0dXAodCl7c3VwZXIuc2V0dXAodCk7Y29uc3QgZT10LmNsaXBwaW5nQ29udGV4dCx7bG9jYWxDbGlwSW50ZXJzZWN0aW9uOnMsbG9jYWxDbGlwcGluZ0NvdW50Om4sZ2xvYmFsQ2xpcHBpbmdDb3VudDppfT1lLG89aStuLGE9cz9vLW46bztyZXR1cm4gdGhpcy5zY29wZT09PXBzLkFMUEhBX1RPX0NPVkVSQUdFP3RoaXMuc2V0dXBBbHBoYVRvQ292ZXJhZ2UoZS5wbGFuZXMsbyxhKTp0aGlzLnNldHVwRGVmYXVsdChlLnBsYW5lcyxvLGEpfXNldHVwQWxwaGFUb0NvdmVyYWdlKHQsZSxzKXtyZXR1cm4gdHQoKCk9Pntjb25zdCBuPWZpKHQpLGk9dmUoImZsb2F0IiwiZGlzdGFuY2VUb1BsYW5lIiksbz12ZSgiZmxvYXQiLCJkaXN0YW5jZVRvR3JhZGllbnQiKSxhPXZlKCJmbG9hdCIsImNsaXBPcGFjaXR5Iik7YS5hc3NpZ24oMSk7bGV0IGM7aWYoT2Uocywoe2k6dX0pPT57Yz1uLmVsZW1lbnQodSksaS5hc3NpZ24oTXQuZG90KGMueHl6KS5uZWdhdGUoKS5hZGQoYy53KSksby5hc3NpZ24oaS5md2lkdGgoKS5kaXYoMikpLGEubXVsQXNzaWduKGhpKG8ubmVnYXRlKCksbyxpKSksYS5lcXVhbCgwKS5kaXNjYXJkKCl9KSxzPGUpe2NvbnN0IHU9dmUoImZsb2F0IiwidW5pb25jbGlwT3BhY2l0eSIpO3UuYXNzaWduKDEpLE9lKHtzdGFydDpzLGVuZDplfSwoe2k6aH0pPT57Yz1uLmVsZW1lbnQoaCksaS5hc3NpZ24oTXQuZG90KGMueHl6KS5uZWdhdGUoKS5hZGQoYy53KSksby5hc3NpZ24oaS5md2lkdGgoKS5kaXYoMikpLHUubXVsQXNzaWduKGhpKG8ubmVnYXRlKCksbyxpKS5vbmVNaW51cygpKX0pLGEubXVsQXNzaWduKHUub25lTWludXMoKSl9dnIuYS5tdWxBc3NpZ24oYSksdnIuYS5lcXVhbCgwKS5kaXNjYXJkKCl9KSgpfXNldHVwRGVmYXVsdCh0LGUscyl7cmV0dXJuIHR0KCgpPT57Y29uc3Qgbj1maSh0KTtsZXQgaTtpZihPZShzLCh7aTpvfSk9PntpPW4uZWxlbWVudChvKSxNdC5kb3QoaS54eXopLmdyZWF0ZXJUaGFuKGkudykuZGlzY2FyZCgpfSksczxlKXtjb25zdCBvPXZlKCJib29sIiwiY2xpcHBlZCIpO28uYXNzaWduKCEwKSxPZSh7c3RhcnQ6cyxlbmQ6ZX0sKHtpOmF9KT0+e2k9bi5lbGVtZW50KGEpLG8uYXNzaWduKE10LmRvdChpLnh5eikuZ3JlYXRlclRoYW4oaS53KS5hbmQobykpfSksby5kaXNjYXJkKCl9fSkoKX19cHMuQUxQSEFfVE9fQ09WRVJBR0U9ImFscGhhVG9Db3ZlcmFnZSIscHMuREVGQVVMVD0iZGVmYXVsdCIsayguMDQpLHEoMSk7Y29uc3QgQ3U9dHQoKFtyLHRdKT0+e2NvbnN0IGU9ci50b1ZhcigpO2UuYXNzaWduKEdzKDIsZSkuc3ViKDEpKTtjb25zdCBzPWsoZSwxKS50b1ZhcigpO3JldHVybiBuaSh0LmVxdWFsKDApLCgpPT57cy5hc3NpZ24ocy56eXgpfSkuRWxzZUlmKHQuZXF1YWwoMSksKCk9PntzLmFzc2lnbihzLnh6eSkscy54ei5tdWxBc3NpZ24oLTEpfSkuRWxzZUlmKHQuZXF1YWwoMiksKCk9PntzLngubXVsQXNzaWduKC0xKX0pLkVsc2VJZih0LmVxdWFsKDMpLCgpPT57cy5hc3NpZ24ocy56eXgpLHMueHoubXVsQXNzaWduKC0xKX0pLkVsc2VJZih0LmVxdWFsKDQpLCgpPT57cy5hc3NpZ24ocy54enkpLHMueHkubXVsQXNzaWduKC0xKX0pLkVsc2VJZih0LmVxdWFsKDUpLCgpPT57cy56Lm11bEFzc2lnbigtMSl9KSxzfSkuc2V0TGF5b3V0KHtuYW1lOiJnZXREaXJlY3Rpb24iLHR5cGU6InZlYzMiLGlucHV0czpbe25hbWU6InV2Iix0eXBlOiJ2ZWMyIn0se25hbWU6ImZhY2UiLHR5cGU6ImZsb2F0In1dfSk7dHQoKHt0ZXh0dXJlOnIsdXY6dH0pPT57Y29uc3Qgcz1rKCkudG9WYXIoKTtyZXR1cm4gbmkodC54Lmxlc3NUaGFuKDFlLTQpLCgpPT57cy5hc3NpZ24oaygxLDAsMCkpfSkuRWxzZUlmKHQueS5sZXNzVGhhbigxZS00KSwoKT0+e3MuYXNzaWduKGsoMCwxLDApKX0pLkVsc2VJZih0LnoubGVzc1RoYW4oMWUtNCksKCk9PntzLmFzc2lnbihrKDAsMCwxKSl9KS5FbHNlSWYodC54LmdyZWF0ZXJUaGFuKDEtMWUtNCksKCk9PntzLmFzc2lnbihrKC0xLDAsMCkpfSkuRWxzZUlmKHQueS5ncmVhdGVyVGhhbigxLTFlLTQpLCgpPT57cy5hc3NpZ24oaygwLC0xLDApKX0pLkVsc2VJZih0LnouZ3JlYXRlclRoYW4oMS0xZS00KSwoKT0+e3MuYXNzaWduKGsoMCwwLC0xKSl9KS5FbHNlKCgpPT57Y29uc3QgaT1yLnV2KHQuYWRkKGsoLS4wMSwwLDApKSkuci5zdWIoci51dih0LmFkZChrKC4wMSwwLDApKSkuciksbz1yLnV2KHQuYWRkKGsoMCwtLjAxLDApKSkuci5zdWIoci51dih0LmFkZChrKDAsLjAxLDApKSkuciksYT1yLnV2KHQuYWRkKGsoMCwwLC0uMDEpKSkuci5zdWIoci51dih0LmFkZChrKDAsMCwuMDEpKSkucik7cy5hc3NpZ24oayhpLG8sYSkpfSkscy5ub3JtYWxpemUoKX0pO2NvbnN0IHlpPUN1KFpzKCksb3MoImZhY2VJbmRleCIpKS5ub3JtYWxpemUoKTtrKHlpLngseWkueS5uZWdhdGUoKSx5aS56KTtjbGFzcyBQdCBleHRlbmRzIElle3N0YXRpYyBnZXQgdHlwZSgpe3JldHVybiJUaW1lck5vZGUifWNvbnN0cnVjdG9yKHQ9UHQuTE9DQUwsZT0xLHM9MCl7c3VwZXIocyksdGhpcy5zY29wZT10LHRoaXMuc2NhbGU9ZSx0aGlzLnVwZGF0ZVR5cGU9US5GUkFNRX11cGRhdGUodCl7Y29uc3QgZT10aGlzLnNjb3BlLHM9dGhpcy5zY2FsZTtlPT09UHQuTE9DQUw/dGhpcy52YWx1ZSs9dC5kZWx0YVRpbWUqczplPT09UHQuREVMVEE/dGhpcy52YWx1ZT10LmRlbHRhVGltZSpzOmU9PT1QdC5GUkFNRT90aGlzLnZhbHVlPXQuZnJhbWVJZDp0aGlzLnZhbHVlPXQudGltZSpzfXNlcmlhbGl6ZSh0KXtzdXBlci5zZXJpYWxpemUodCksdC5zY29wZT10aGlzLnNjb3BlLHQuc2NhbGU9dGhpcy5zY2FsZX1kZXNlcmlhbGl6ZSh0KXtzdXBlci5kZXNlcmlhbGl6ZSh0KSx0aGlzLnNjb3BlPXQuc2NvcGUsdGhpcy5zY2FsZT10LnNjYWxlfX1QdC5MT0NBTD0ibG9jYWwiLFB0LkdMT0JBTD0iZ2xvYmFsIixQdC5ERUxUQT0iZGVsdGEiLFB0LkZSQU1FPSJmcmFtZSI7Y29uc3QgRnU9KHIsdD0wKT0+dihuZXcgUHQoUHQuTE9DQUwscix0KSk7Y2xhc3MgcnQgZXh0ZW5kcyBVe3N0YXRpYyBnZXQgdHlwZSgpe3JldHVybiJPc2NOb2RlIn1jb25zdHJ1Y3Rvcih0PXJ0LlNJTkUsZT1GdSgpKXtzdXBlcigpLHRoaXMubWV0aG9kPXQsdGhpcy50aW1lTm9kZT1lfWdldE5vZGVUeXBlKHQpe3JldHVybiB0aGlzLnRpbWVOb2RlLmdldE5vZGVUeXBlKHQpfXNldHVwKCl7Y29uc3QgdD10aGlzLm1ldGhvZCxlPXYodGhpcy50aW1lTm9kZSk7bGV0IHM9bnVsbDtyZXR1cm4gdD09PXJ0LlNJTkU/cz1lLmFkZCguNzUpLm11bChNYXRoLlBJKjIpLnNpbigpLm11bCguNSkuYWRkKC41KTp0PT09cnQuU1FVQVJFP3M9ZS5mcmFjdCgpLnJvdW5kKCk6dD09PXJ0LlRSSUFOR0xFP3M9ZS5hZGQoLjUpLmZyYWN0KCkubXVsKDIpLnN1YigxKS5hYnMoKTp0PT09cnQuU0FXVE9PVEgmJihzPWUuZnJhY3QoKSksc31zZXJpYWxpemUodCl7c3VwZXIuc2VyaWFsaXplKHQpLHQubWV0aG9kPXRoaXMubWV0aG9kfWRlc2VyaWFsaXplKHQpe3N1cGVyLmRlc2VyaWFsaXplKHQpLHRoaXMubWV0aG9kPXQubWV0aG9kfX1ydC5TSU5FPSJzaW5lIixydC5TUVVBUkU9InNxdWFyZSIscnQuVFJJQU5HTEU9InRyaWFuZ2xlIixydC5TQVdUT09USD0ic2F3dG9vdGgiLHJ0LlNJTkUscnQuU1FVQVJFLHJ0LlRSSUFOR0xFLHJ0LlNBV1RPT1RILG5ldyBYbixuZXcgQSxuZXcgQSxuZXcgQSxuZXcgbnQsbmV3IEEoMCwwLC0xKSxuZXcgRnQsbmV3IEEsbmV3IEEsbmV3IEZ0LG5ldyBKLG5ldyBvcixwaS5mbGlwWCgpO2NsYXNzIFV0IGV4dGVuZHMgVXtzdGF0aWMgZ2V0IHR5cGUoKXtyZXR1cm4iU2NlbmVOb2RlIn1jb25zdHJ1Y3Rvcih0PVV0LkJBQ0tHUk9VTkRfQkxVUlJJTkVTUyxlPW51bGwpe3N1cGVyKCksdGhpcy5zY29wZT10LHRoaXMuc2NlbmU9ZX1zZXR1cCh0KXtjb25zdCBlPXRoaXMuc2NvcGUscz10aGlzLnNjZW5lIT09bnVsbD90aGlzLnNjZW5lOnQuc2NlbmU7bGV0IG47cmV0dXJuIGU9PT1VdC5CQUNLR1JPVU5EX0JMVVJSSU5FU1M/bj1wZSgiYmFja2dyb3VuZEJsdXJyaW5lc3MiLCJmbG9hdCIscyk6ZT09PVV0LkJBQ0tHUk9VTkRfSU5URU5TSVRZP249cGUoImJhY2tncm91bmRJbnRlbnNpdHkiLCJmbG9hdCIscyk6Y29uc29sZS5lcnJvcigiVEhSRUUuU2NlbmVOb2RlOiBVbmtub3duIHNjb3BlOiIsZSksbn19VXQuQkFDS0dST1VORF9CTFVSUklORVNTPSJiYWNrZ3JvdW5kQmx1cnJpbmVzcyIsVXQuQkFDS0dST1VORF9JTlRFTlNJVFk9ImJhY2tncm91bmRJbnRlbnNpdHkiLFV0LkJBQ0tHUk9VTkRfQkxVUlJJTkVTUyxVdC5CQUNLR1JPVU5EX0lOVEVOU0lUWTtjb25zdCBSdT1uZXcgSjtjbGFzcyBCdSBleHRlbmRzIEpze3N0YXRpYyBnZXQgdHlwZSgpe3JldHVybiJQYXNzVGV4dHVyZU5vZGUifWNvbnN0cnVjdG9yKHQsZSl7c3VwZXIoZSksdGhpcy5wYXNzTm9kZT10LHRoaXMuc2V0VXBkYXRlTWF0cml4KCExKX1zZXR1cCh0KXtyZXR1cm4gdC5vYmplY3QuaXNRdWFkTWVzaCYmdGhpcy5wYXNzTm9kZS5idWlsZCh0KSxzdXBlci5zZXR1cCh0KX1jbG9uZSgpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3Rvcih0aGlzLnBhc3NOb2RlLHRoaXMudmFsdWUpfX1jbGFzcyBobyBleHRlbmRzIEJ1e3N0YXRpYyBnZXQgdHlwZSgpe3JldHVybiJQYXNzTXVsdGlwbGVUZXh0dXJlTm9kZSJ9Y29uc3RydWN0b3IodCxlLHM9ITEpe3N1cGVyKHQsbnVsbCksdGhpcy50ZXh0dXJlTmFtZT1lLHRoaXMucHJldmlvdXNUZXh0dXJlPXN9dXBkYXRlVGV4dHVyZSgpe3RoaXMudmFsdWU9dGhpcy5wcmV2aW91c1RleHR1cmU/dGhpcy5wYXNzTm9kZS5nZXRQcmV2aW91c1RleHR1cmUodGhpcy50ZXh0dXJlTmFtZSk6dGhpcy5wYXNzTm9kZS5nZXRUZXh0dXJlKHRoaXMudGV4dHVyZU5hbWUpfXNldHVwKHQpe3JldHVybiB0aGlzLnVwZGF0ZVRleHR1cmUoKSxzdXBlci5zZXR1cCh0KX1jbG9uZSgpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3Rvcih0aGlzLnBhc3NOb2RlLHRoaXMudGV4dHVyZU5hbWUsdGhpcy5wcmV2aW91c1RleHR1cmUpfX1jbGFzcyB0biBleHRlbmRzIGR0e3N0YXRpYyBnZXQgdHlwZSgpe3JldHVybiJQYXNzTm9kZSJ9Y29uc3RydWN0b3IodCxlLHMsbj17fSl7c3VwZXIoInZlYzQiKSx0aGlzLnNjb3BlPXQsdGhpcy5zY2VuZT1lLHRoaXMuY2FtZXJhPXMsdGhpcy5vcHRpb25zPW4sdGhpcy5fcGl4ZWxSYXRpbz0xLHRoaXMuX3dpZHRoPTEsdGhpcy5faGVpZ2h0PTE7Y29uc3QgaT1uZXcgeHI7aS5pc1JlbmRlclRhcmdldFRleHR1cmU9ITAsaS5uYW1lPSJkZXB0aCI7Y29uc3Qgbz1uZXcgb3IodGhpcy5fd2lkdGgqdGhpcy5fcGl4ZWxSYXRpbyx0aGlzLl9oZWlnaHQqdGhpcy5fcGl4ZWxSYXRpbyx7dHlwZTp2bywuLi5ufSk7by50ZXh0dXJlLm5hbWU9Im91dHB1dCIsby5kZXB0aFRleHR1cmU9aSx0aGlzLnJlbmRlclRhcmdldD1vLHRoaXMudXBkYXRlQmVmb3JlVHlwZT1RLkZSQU1FLHRoaXMuX3RleHR1cmVzPXtvdXRwdXQ6by50ZXh0dXJlLGRlcHRoOml9LHRoaXMuX3RleHR1cmVOb2Rlcz17fSx0aGlzLl9saW5lYXJEZXB0aE5vZGVzPXt9LHRoaXMuX3ZpZXdaTm9kZXM9e30sdGhpcy5fcHJldmlvdXNUZXh0dXJlcz17fSx0aGlzLl9wcmV2aW91c1RleHR1cmVOb2Rlcz17fSx0aGlzLl9jYW1lcmFOZWFyPXh0KDApLHRoaXMuX2NhbWVyYUZhcj14dCgwKSx0aGlzLl9tcnQ9bnVsbCx0aGlzLmlzUGFzc05vZGU9ITB9c2V0TVJUKHQpe3JldHVybiB0aGlzLl9tcnQ9dCx0aGlzfWdldE1SVCgpe3JldHVybiB0aGlzLl9tcnR9aXNHbG9iYWwoKXtyZXR1cm4hMH1nZXRUZXh0dXJlKHQpe2xldCBlPXRoaXMuX3RleHR1cmVzW3RdO3JldHVybiBlPT09dm9pZCAwJiYoZT10aGlzLnJlbmRlclRhcmdldC50ZXh0dXJlLmNsb25lKCksZS5pc1JlbmRlclRhcmdldFRleHR1cmU9ITAsZS5uYW1lPXQsdGhpcy5fdGV4dHVyZXNbdF09ZSx0aGlzLnJlbmRlclRhcmdldC50ZXh0dXJlcy5wdXNoKGUpKSxlfWdldFByZXZpb3VzVGV4dHVyZSh0KXtsZXQgZT10aGlzLl9wcmV2aW91c1RleHR1cmVzW3RdO3JldHVybiBlPT09dm9pZCAwJiYoZT10aGlzLmdldFRleHR1cmUodCkuY2xvbmUoKSxlLmlzUmVuZGVyVGFyZ2V0VGV4dHVyZT0hMCx0aGlzLl9wcmV2aW91c1RleHR1cmVzW3RdPWUpLGV9dG9nZ2xlVGV4dHVyZSh0KXtjb25zdCBlPXRoaXMuX3ByZXZpb3VzVGV4dHVyZXNbdF07aWYoZSE9PXZvaWQgMCl7Y29uc3Qgcz10aGlzLl90ZXh0dXJlc1t0XSxuPXRoaXMucmVuZGVyVGFyZ2V0LnRleHR1cmVzLmluZGV4T2Yocyk7dGhpcy5yZW5kZXJUYXJnZXQudGV4dHVyZXNbbl09ZSx0aGlzLl90ZXh0dXJlc1t0XT1lLHRoaXMuX3ByZXZpb3VzVGV4dHVyZXNbdF09cyx0aGlzLl90ZXh0dXJlTm9kZXNbdF0udXBkYXRlVGV4dHVyZSgpLHRoaXMuX3ByZXZpb3VzVGV4dHVyZU5vZGVzW3RdLnVwZGF0ZVRleHR1cmUoKX19Z2V0VGV4dHVyZU5vZGUodD0ib3V0cHV0Iil7bGV0IGU9dGhpcy5fdGV4dHVyZU5vZGVzW3RdO3JldHVybiBlPT09dm9pZCAwJiYodGhpcy5fdGV4dHVyZU5vZGVzW3RdPWU9dihuZXcgaG8odGhpcyx0KSksdGhpcy5fdGV4dHVyZU5vZGVzW3RdLnVwZGF0ZVRleHR1cmUoKSksZX1nZXRQcmV2aW91c1RleHR1cmVOb2RlKHQ9Im91dHB1dCIpe2xldCBlPXRoaXMuX3ByZXZpb3VzVGV4dHVyZU5vZGVzW3RdO3JldHVybiBlPT09dm9pZCAwJiYodGhpcy5fdGV4dHVyZU5vZGVzW3RdPT09dm9pZCAwJiZ0aGlzLmdldFRleHR1cmVOb2RlKHQpLHRoaXMuX3ByZXZpb3VzVGV4dHVyZU5vZGVzW3RdPWU9dihuZXcgaG8odGhpcyx0LCEwKSksdGhpcy5fcHJldmlvdXNUZXh0dXJlTm9kZXNbdF0udXBkYXRlVGV4dHVyZSgpKSxlfWdldFZpZXdaTm9kZSh0PSJkZXB0aCIpe2xldCBlPXRoaXMuX3ZpZXdaTm9kZXNbdF07aWYoZT09PXZvaWQgMCl7Y29uc3Qgcz10aGlzLl9jYW1lcmFOZWFyLG49dGhpcy5fY2FtZXJhRmFyO3RoaXMuX3ZpZXdaTm9kZXNbdF09ZT1hbyh0aGlzLmdldFRleHR1cmVOb2RlKHQpLHMsbil9cmV0dXJuIGV9Z2V0TGluZWFyRGVwdGhOb2RlKHQ9ImRlcHRoIil7bGV0IGU9dGhpcy5fbGluZWFyRGVwdGhOb2Rlc1t0XTtpZihlPT09dm9pZCAwKXtjb25zdCBzPXRoaXMuX2NhbWVyYU5lYXIsbj10aGlzLl9jYW1lcmFGYXIsaT10aGlzLmdldFZpZXdaTm9kZSh0KTt0aGlzLl9saW5lYXJEZXB0aE5vZGVzW3RdPWU9S3MoaSxzLG4pfXJldHVybiBlfXNldHVwKHtyZW5kZXJlcjp0fSl7cmV0dXJuIHRoaXMucmVuZGVyVGFyZ2V0LnNhbXBsZXM9dGhpcy5vcHRpb25zLnNhbXBsZXM9PT12b2lkIDA/dC5zYW1wbGVzOnRoaXMub3B0aW9ucy5zYW1wbGVzLHQuYmFja2VuZC5pc1dlYkdMQmFja2VuZD09PSEwJiYodGhpcy5yZW5kZXJUYXJnZXQuc2FtcGxlcz0wKSx0aGlzLnJlbmRlclRhcmdldC5kZXB0aFRleHR1cmUuaXNNdWx0aXNhbXBsZVJlbmRlclRhcmdldFRleHR1cmU9dGhpcy5yZW5kZXJUYXJnZXQuc2FtcGxlcz4xLHRoaXMuc2NvcGU9PT10bi5DT0xPUj90aGlzLmdldFRleHR1cmVOb2RlKCk6dGhpcy5nZXRMaW5lYXJEZXB0aE5vZGUoKX11cGRhdGVCZWZvcmUodCl7Y29uc3R7cmVuZGVyZXI6ZX09dCx7c2NlbmU6cyxjYW1lcmE6bn09dGhpczt0aGlzLl9waXhlbFJhdGlvPWUuZ2V0UGl4ZWxSYXRpbygpO2NvbnN0IGk9ZS5nZXRTaXplKFJ1KTt0aGlzLnNldFNpemUoaS53aWR0aCxpLmhlaWdodCk7Y29uc3Qgbz1lLmdldFJlbmRlclRhcmdldCgpLGE9ZS5nZXRNUlQoKTt0aGlzLl9jYW1lcmFOZWFyLnZhbHVlPW4ubmVhcix0aGlzLl9jYW1lcmFGYXIudmFsdWU9bi5mYXI7Zm9yKGNvbnN0IGMgaW4gdGhpcy5fcHJldmlvdXNUZXh0dXJlcyl0aGlzLnRvZ2dsZVRleHR1cmUoYyk7ZS5zZXRSZW5kZXJUYXJnZXQodGhpcy5yZW5kZXJUYXJnZXQpLGUuc2V0TVJUKHRoaXMuX21ydCksZS5yZW5kZXIocyxuKSxlLnNldFJlbmRlclRhcmdldChvKSxlLnNldE1SVChhKX1zZXRTaXplKHQsZSl7dGhpcy5fd2lkdGg9dCx0aGlzLl9oZWlnaHQ9ZTtjb25zdCBzPXRoaXMuX3dpZHRoKnRoaXMuX3BpeGVsUmF0aW8sbj10aGlzLl9oZWlnaHQqdGhpcy5fcGl4ZWxSYXRpbzt0aGlzLnJlbmRlclRhcmdldC5zZXRTaXplKHMsbil9c2V0UGl4ZWxSYXRpbyh0KXt0aGlzLl9waXhlbFJhdGlvPXQsdGhpcy5zZXRTaXplKHRoaXMuX3dpZHRoLHRoaXMuX2hlaWdodCl9ZGlzcG9zZSgpe3RoaXMucmVuZGVyVGFyZ2V0LmRpc3Bvc2UoKX19dG4uQ09MT1I9ImNvbG9yIix0bi5ERVBUSD0iZGVwdGgiLHR0KCh7ZGVwdGhUZXh0dXJlOnIsc2hhZG93Q29vcmQ6dH0pPT5hcyhyLHQueHkpLmNvbXBhcmUodC56KSksdHQoKHtkZXB0aFRleHR1cmU6cixzaGFkb3dDb29yZDp0LHNoYWRvdzplfSk9Pntjb25zdCBzPShtLGcpPT5hcyhyLG0pLmNvbXBhcmUoZyksbj1wZSgibWFwU2l6ZSIsInZlYzIiLGUpLnNldEdyb3VwKGRlKSxpPXBlKCJyYWRpdXMiLCJmbG9hdCIsZSkuc2V0R3JvdXAoZGUpLG89RCgxKS5kaXYobiksYT1vLngubmVnYXRlKCkubXVsKGkpLGM9by55Lm5lZ2F0ZSgpLm11bChpKSx1PW8ueC5tdWwoaSksaD1vLnkubXVsKGkpLGw9YS5kaXYoMiksZD1jLmRpdigyKSxmPXUuZGl2KDIpLHA9aC5kaXYoMik7cmV0dXJuIGZlKHModC54eS5hZGQoRChhLGMpKSx0LnopLHModC54eS5hZGQoRCgwLGMpKSx0LnopLHModC54eS5hZGQoRCh1LGMpKSx0LnopLHModC54eS5hZGQoRChsLGQpKSx0LnopLHModC54eS5hZGQoRCgwLGQpKSx0LnopLHModC54eS5hZGQoRChmLGQpKSx0LnopLHModC54eS5hZGQoRChhLDApKSx0LnopLHModC54eS5hZGQoRChsLDApKSx0LnopLHModC54eSx0LnopLHModC54eS5hZGQoRChmLDApKSx0LnopLHModC54eS5hZGQoRCh1LDApKSx0LnopLHModC54eS5hZGQoRChsLHApKSx0LnopLHModC54eS5hZGQoRCgwLHApKSx0LnopLHModC54eS5hZGQoRChmLHApKSx0LnopLHModC54eS5hZGQoRChhLGgpKSx0LnopLHModC54eS5hZGQoRCgwLGgpKSx0LnopLHModC54eS5hZGQoRCh1LGgpKSx0LnopKS5tdWwoMS8xNyl9KSx0dCgoe2RlcHRoVGV4dHVyZTpyLHNoYWRvd0Nvb3JkOnQsc2hhZG93OmV9KT0+e2NvbnN0IHM9KGgsbCk9PmFzKHIsaCkuY29tcGFyZShsKSxuPXBlKCJtYXBTaXplIiwidmVjMiIsZSkuc2V0R3JvdXAoZGUpLGk9RCgxKS5kaXYobiksbz1pLngsYT1pLnksYz10Lnh5LHU9cmkoYy5tdWwobikuYWRkKC41KSk7cmV0dXJuIGMuc3ViQXNzaWduKHUubXVsKGkpKSxmZShzKGMsdC56KSxzKGMuYWRkKEQobywwKSksdC56KSxzKGMuYWRkKEQoMCxhKSksdC56KSxzKGMuYWRkKGkpLHQueikscmUocyhjLmFkZChEKG8ubmVnYXRlKCksMCkpLHQueikscyhjLmFkZChEKG8ubXVsKDIpLDApKSx0LnopLHUueCkscmUocyhjLmFkZChEKG8ubmVnYXRlKCksYSkpLHQueikscyhjLmFkZChEKG8ubXVsKDIpLGEpKSx0LnopLHUueCkscmUocyhjLmFkZChEKDAsYS5uZWdhdGUoKSkpLHQueikscyhjLmFkZChEKDAsYS5tdWwoMikpKSx0LnopLHUueSkscmUocyhjLmFkZChEKG8sYS5uZWdhdGUoKSkpLHQueikscyhjLmFkZChEKG8sYS5tdWwoMikpKSx0LnopLHUueSkscmUocmUocyhjLmFkZChEKG8ubmVnYXRlKCksYS5uZWdhdGUoKSkpLHQueikscyhjLmFkZChEKG8ubXVsKDIpLGEubmVnYXRlKCkpKSx0LnopLHUueCkscmUocyhjLmFkZChEKG8ubmVnYXRlKCksYS5tdWwoMikpKSx0LnopLHMoYy5hZGQoRChvLm11bCgyKSxhLm11bCgyKSkpLHQueiksdS54KSx1LnkpKS5tdWwoMS85KX0pLHR0KCh7ZGVwdGhUZXh0dXJlOnIsc2hhZG93Q29vcmQ6dH0pPT57Y29uc3QgZT1xKDEpLnRvVmFyKCkscz1hcyhyKS51dih0Lnh5KS5yZyxuPWtyKHQueixzLngpO3JldHVybiBuaShuLm5vdEVxdWFsKHEoMSkpLCgpPT57Y29uc3QgaT10Lnouc3ViKHMueCksbz1haSgwLHMueS5tdWwocy55KSk7bGV0IGE9by5kaXYoby5hZGQoaS5tdWwoaSkpKTthPVdzKCRzKGEsLjMpLmRpdiguOTUtLjMpKSxlLmFzc2lnbihXcyhhaShuLGEpKSl9KSxlfSksdHQoKHtzYW1wbGVzOnIscmFkaXVzOnQsc2l6ZTplLHNoYWRvd1Bhc3M6c30pPT57Y29uc3Qgbj1xKDApLnRvVmFyKCksaT1xKDApLnRvVmFyKCksbz1yLmxlc3NUaGFuRXF1YWwocSgxKSkuc2VsZWN0KHEoMCkscSgyKS5kaXYoci5zdWIoMSkpKSxhPXIubGVzc1RoYW5FcXVhbChxKDEpKS5zZWxlY3QocSgwKSxxKC0xKSk7T2Uoe3N0YXJ0OlJlKDApLGVuZDpSZShyKSx0eXBlOiJpbnQiLGNvbmRpdGlvbjoiPCJ9LCh7aTp1fSk9Pntjb25zdCBoPWEuYWRkKHEodSkubXVsKG8pKSxsPXMudXYoZmUoUXMueHksRCgwLGgpLm11bCh0KSkuZGl2KGUpKS54O24uYWRkQXNzaWduKGwpLGkuYWRkQXNzaWduKGwubXVsKGwpKX0pLG4uZGl2QXNzaWduKHIpLGkuZGl2QXNzaWduKHIpO2NvbnN0IGM9aWkoaS5zdWIobi5tdWwobikpKTtyZXR1cm4gRChuLGMpfSksdHQoKHtzYW1wbGVzOnIscmFkaXVzOnQsc2l6ZTplLHNoYWRvd1Bhc3M6c30pPT57Y29uc3Qgbj1xKDApLnRvVmFyKCksaT1xKDApLnRvVmFyKCksbz1yLmxlc3NUaGFuRXF1YWwocSgxKSkuc2VsZWN0KHEoMCkscSgyKS5kaXYoci5zdWIoMSkpKSxhPXIubGVzc1RoYW5FcXVhbChxKDEpKS5zZWxlY3QocSgwKSxxKC0xKSk7T2Uoe3N0YXJ0OlJlKDApLGVuZDpSZShyKSx0eXBlOiJpbnQiLGNvbmRpdGlvbjoiPCJ9LCh7aTp1fSk9Pntjb25zdCBoPWEuYWRkKHEodSkubXVsKG8pKSxsPXMudXYoZmUoUXMueHksRChoLDApLm11bCh0KSkuZGl2KGUpKTtuLmFkZEFzc2lnbihsLngpLGkuYWRkQXNzaWduKGZlKGwueS5tdWwobC55KSxsLngubXVsKGwueCkpKX0pLG4uZGl2QXNzaWduKHIpLGkuZGl2QXNzaWduKHIpO2NvbnN0IGM9aWkoaS5zdWIobi5tdWwobikpKTtyZXR1cm4gRChuLGMpfSksaygxLjY2MDUsLS4xMjQ2LC0uMDE4MiksaygtLjU4NzYsMS4xMzI5LC0uMTAwNiksaygtLjA3MjgsLS4wMDgzLDEuMTE4NyksayguNjI3NCwuMDY5MSwuMDE2NCksayguMzI5MywuOTE5NSwuMDg4KSxrKC4wNDMzLC4wMTEzLC44OTU2KTtjbGFzcyBJdSBleHRlbmRzIFV7Y29uc3RydWN0b3IodCl7c3VwZXIoKSx0aGlzLnNjb3BlPXR9Z2VuZXJhdGUodCl7Y29uc3R7c2NvcGU6ZX09dGhpcyx7cmVuZGVyZXI6c309dDtzLmJhY2tlbmQuaXNXZWJHTEJhY2tlbmQ9PT0hMD90LmFkZEZsb3dDb2RlKGAJLy8gJHtlfUJhcnJpZXIgCmApOnQuYWRkTGluZUZsb3dDb2RlKGAke2V9QmFycmllcigpYCx0aGlzKX19QyhJdSk7Y2xhc3Mga3QgZXh0ZW5kcyBkdHtzdGF0aWMgZ2V0IHR5cGUoKXtyZXR1cm4iQXRvbWljRnVuY3Rpb25Ob2RlIn1jb25zdHJ1Y3Rvcih0LGUscyxuPW51bGwpe3N1cGVyKCJ1aW50IiksdGhpcy5tZXRob2Q9dCx0aGlzLnBvaW50ZXJOb2RlPWUsdGhpcy52YWx1ZU5vZGU9cyx0aGlzLnN0b3JlTm9kZT1ufWdldElucHV0VHlwZSh0KXtyZXR1cm4gdGhpcy5wb2ludGVyTm9kZS5nZXROb2RlVHlwZSh0KX1nZXROb2RlVHlwZSh0KXtyZXR1cm4gdGhpcy5nZXRJbnB1dFR5cGUodCl9Z2VuZXJhdGUodCl7Y29uc3QgZT10aGlzLm1ldGhvZCxzPXRoaXMuZ2V0Tm9kZVR5cGUodCksbj10aGlzLmdldElucHV0VHlwZSh0KSxpPXRoaXMucG9pbnRlck5vZGUsbz10aGlzLnZhbHVlTm9kZSxhPVtdO2EucHVzaChgJiR7aS5idWlsZCh0LG4pfWApLGEucHVzaChvLmJ1aWxkKHQsbikpO2NvbnN0IGM9YCR7dC5nZXRNZXRob2QoZSxzKX0oICR7YS5qb2luKCIsICIpfSApYDtpZih0aGlzLnN0b3JlTm9kZSE9PW51bGwpe2NvbnN0IHU9dGhpcy5zdG9yZU5vZGUuYnVpbGQodCxuKTt0LmFkZExpbmVGbG93Q29kZShgJHt1fSA9ICR7Y31gLHRoaXMpfWVsc2UgdC5hZGRMaW5lRmxvd0NvZGUoYyx0aGlzKX19aWYoa3QuQVRPTUlDX0xPQUQ9ImF0b21pY0xvYWQiLGt0LkFUT01JQ19TVE9SRT0iYXRvbWljU3RvcmUiLGt0LkFUT01JQ19BREQ9ImF0b21pY0FkZCIsa3QuQVRPTUlDX1NVQj0iYXRvbWljU3ViIixrdC5BVE9NSUNfTUFYPSJhdG9taWNNYXgiLGt0LkFUT01JQ19NSU49ImF0b21pY01pbiIsa3QuQVRPTUlDX0FORD0iYXRvbWljQW5kIixrdC5BVE9NSUNfT1I9ImF0b21pY09yIixrdC5BVE9NSUNfWE9SPSJhdG9taWNYb3IiLEMoa3QpLHR5cGVvZiBfX1RIUkVFX0RFVlRPT0xTX188InUiJiZfX1RIUkVFX0RFVlRPT0xTX18uZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoInJlZ2lzdGVyIix7ZGV0YWlsOntyZXZpc2lvbjpYZX19KSksdHlwZW9mIHdpbmRvdzwidSIpe3RyeXtBbiYmQW4udGFnTmFtZS50b1VwcGVyQ2FzZSgpPT09IlNDUklQVCImJkFuLnNyY3x8bmV3IFVSTCgiYXNzZXRzL2dlbmVyYXRlTWVzaEJWSC53b3JrZXItYjc3ODg5MzkuanMiLGRvY3VtZW50LmJhc2VVUkkpLmhyZWYsd2luZG93Ll9fVEhSRUVfX0lNUE9SVFNfX3x8KHdpbmRvdy5fX1RIUkVFX19JTVBPUlRTX189W10pLHdpbmRvdy5fX1RIUkVFX19JTVBPUlRTX18ucHVzaCh7dXJsOnNlbGYubG9jYXRpb24uaHJlZixyZXZpc2lvbjpYZX0pfWNhdGNoe313aW5kb3cuX19USFJFRV9fPyhjb25zb2xlLndhcm4oIldBUk5JTkc6IE11bHRpcGxlIGluc3RhbmNlcyBvZiBUaHJlZS5qcyBiZWluZyBpbXBvcnRlZC4gRXhpc3Rpbmc6ICIrd2luZG93Ll9fVEhSRUVfXysiLCBuZXc6ICIrWGUpLGNvbnNvbGUud2Fybih3aW5kb3cuX19USFJFRV9fSU1QT1JUU19fKSk6d2luZG93Ll9fVEhSRUVfXz1YZX1jb25zdCB1bz0wLHZ1PTEsUHU9Mixsbz0yLGdpPTEuMjUsZm89MSxtcz02KjQrNCs0LGVuPTY1NTM1LEx1PU1hdGgucG93KDIsLTI0KSx4aT1TeW1ib2woIlNLSVBfR0VORVJBVElPTiIpO2Z1bmN0aW9uIE91KHIpe3JldHVybiByLmluZGV4P3IuaW5kZXguY291bnQ6ci5hdHRyaWJ1dGVzLnBvc2l0aW9uLmNvdW50fWZ1bmN0aW9uIERlKHIpe3JldHVybiBPdShyKS8zfWZ1bmN0aW9uIER1KHIsdD1BcnJheUJ1ZmZlcil7cmV0dXJuIHI+NjU1MzU/bmV3IFVpbnQzMkFycmF5KG5ldyB0KDQqcikpOm5ldyBVaW50MTZBcnJheShuZXcgdCgyKnIpKX1mdW5jdGlvbiBWdShyLHQpe2lmKCFyLmluZGV4KXtjb25zdCBlPXIuYXR0cmlidXRlcy5wb3NpdGlvbi5jb3VudCxzPXQudXNlU2hhcmVkQXJyYXlCdWZmZXI/U2hhcmVkQXJyYXlCdWZmZXI6QXJyYXlCdWZmZXIsbj1EdShlLHMpO3Iuc2V0SW5kZXgobmV3IHZ0KG4sMSkpO2ZvcihsZXQgaT0wO2k8ZTtpKyspbltpXT1pfX1mdW5jdGlvbiBwbyhyLHQpe2NvbnN0IGU9RGUocikscz10fHxyLmRyYXdSYW5nZSxuPXMuc3RhcnQvMyxpPShzLnN0YXJ0K3MuY291bnQpLzMsbz1NYXRoLm1heCgwLG4pLGE9TWF0aC5taW4oZSxpKS1vO3JldHVyblt7b2Zmc2V0Ok1hdGguZmxvb3IobyksY291bnQ6TWF0aC5mbG9vcihhKX1dfWZ1bmN0aW9uIG1vKHIsdCl7aWYoIXIuZ3JvdXBzfHwhci5ncm91cHMubGVuZ3RoKXJldHVybiBwbyhyLHQpO2NvbnN0IGU9W10scz1uZXcgU2V0LG49dHx8ci5kcmF3UmFuZ2UsaT1uLnN0YXJ0LzMsbz0obi5zdGFydCtuLmNvdW50KS8zO2Zvcihjb25zdCBjIG9mIHIuZ3JvdXBzKXtjb25zdCB1PWMuc3RhcnQvMyxoPShjLnN0YXJ0K2MuY291bnQpLzM7cy5hZGQoTWF0aC5tYXgoaSx1KSkscy5hZGQoTWF0aC5taW4obyxoKSl9Y29uc3QgYT1BcnJheS5mcm9tKHMudmFsdWVzKCkpLnNvcnQoKGMsdSk9PmMtdSk7Zm9yKGxldCBjPTA7YzxhLmxlbmd0aC0xO2MrKyl7Y29uc3QgdT1hW2NdLGg9YVtjKzFdO2UucHVzaCh7b2Zmc2V0Ok1hdGguZmxvb3IodSksY291bnQ6TWF0aC5mbG9vcihoLXUpfSl9cmV0dXJuIGV9ZnVuY3Rpb24gVXUocix0KXtjb25zdCBlPURlKHIpLHM9bW8ocix0KS5zb3J0KChvLGEpPT5vLm9mZnNldC1hLm9mZnNldCksbj1zW3MubGVuZ3RoLTFdO24uY291bnQ9TWF0aC5taW4oZS1uLm9mZnNldCxuLmNvdW50KTtsZXQgaT0wO3JldHVybiBzLmZvckVhY2goKHtjb3VudDpvfSk9PmkrPW8pLGUhPT1pfWZ1bmN0aW9uIFRpKHIsdCxlLHMsbil7bGV0IGk9MS8wLG89MS8wLGE9MS8wLGM9LTEvMCx1PS0xLzAsaD0tMS8wLGw9MS8wLGQ9MS8wLGY9MS8wLHA9LTEvMCxtPS0xLzAsZz0tMS8wO2ZvcihsZXQgeT10KjYsVD0odCtlKSo2O3k8VDt5Kz02KXtjb25zdCB3PXJbeSswXSxNPXJbeSsxXSxOPXctTSxfPXcrTTtOPGkmJihpPU4pLF8+YyYmKGM9XyksdzxsJiYobD13KSx3PnAmJihwPXcpO2NvbnN0IFM9clt5KzJdLEU9clt5KzNdLEY9Uy1FLFI9UytFO0Y8byYmKG89RiksUj51JiYodT1SKSxTPGQmJihkPVMpLFM+bSYmKG09Uyk7Y29uc3QgST1yW3krNF0sQj1yW3krNV0sUD1JLUIsTD1JK0I7UDxhJiYoYT1QKSxMPmgmJihoPUwpLEk8ZiYmKGY9SSksST5nJiYoZz1JKX1zWzBdPWksc1sxXT1vLHNbMl09YSxzWzNdPWMsc1s0XT11LHNbNV09aCxuWzBdPWwsblsxXT1kLG5bMl09ZixuWzNdPXAsbls0XT1tLG5bNV09Z31mdW5jdGlvbiBrdShyLHQ9bnVsbCxlPW51bGwscz1udWxsKXtjb25zdCBuPXIuYXR0cmlidXRlcy5wb3NpdGlvbixpPXIuaW5kZXg/ci5pbmRleC5hcnJheTpudWxsLG89RGUociksYT1uLm5vcm1hbGl6ZWQ7bGV0IGM7dD09PW51bGw/KGM9bmV3IEZsb2F0MzJBcnJheShvKjYpLGU9MCxzPW8pOihjPXQsZT1lfHwwLHM9c3x8byk7Y29uc3QgdT1uLmFycmF5LGg9bi5vZmZzZXR8fDA7bGV0IGw9MztuLmlzSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUmJihsPW4uZGF0YS5zdHJpZGUpO2NvbnN0IGQ9WyJnZXRYIiwiZ2V0WSIsImdldFoiXTtmb3IobGV0IGY9ZTtmPGUrcztmKyspe2NvbnN0IHA9ZiozLG09Zio2O2xldCBnPXArMCx5PXArMSxUPXArMjtpJiYoZz1pW2ddLHk9aVt5XSxUPWlbVF0pLGF8fChnPWcqbCtoLHk9eSpsK2gsVD1UKmwraCk7Zm9yKGxldCB3PTA7dzwzO3crKyl7bGV0IE0sTixfO2E/KE09bltkW3ddXShnKSxOPW5bZFt3XV0oeSksXz1uW2Rbd11dKFQpKTooTT11W2crd10sTj11W3krd10sXz11W1Qrd10pO2xldCBTPU07TjxTJiYoUz1OKSxfPFMmJihTPV8pO2xldCBFPU07Tj5FJiYoRT1OKSxfPkUmJihFPV8pO2NvbnN0IEY9KEUtUykvMixSPXcqMjtjW20rUiswXT1TK0YsY1ttK1IrMV09RisoTWF0aC5hYnMoUykrRikqTHV9fXJldHVybiBjfWZ1bmN0aW9uIFoocix0LGUpe3JldHVybiBlLm1pbi54PXRbcl0sZS5taW4ueT10W3IrMV0sZS5taW4uej10W3IrMl0sZS5tYXgueD10W3IrM10sZS5tYXgueT10W3IrNF0sZS5tYXguej10W3IrNV0sZX1mdW5jdGlvbiB5byhyKXtsZXQgdD0tMSxlPS0xLzA7Zm9yKGxldCBzPTA7czwzO3MrKyl7Y29uc3Qgbj1yW3MrM10tcltzXTtuPmUmJihlPW4sdD1zKX1yZXR1cm4gdH1mdW5jdGlvbiBnbyhyLHQpe3Quc2V0KHIpfWZ1bmN0aW9uIHhvKHIsdCxlKXtsZXQgcyxuO2ZvcihsZXQgaT0wO2k8MztpKyspe2NvbnN0IG89aSszO3M9cltpXSxuPXRbaV0sZVtpXT1zPG4/czpuLHM9cltvXSxuPXRbb10sZVtvXT1zPm4/czpufX1mdW5jdGlvbiBzbihyLHQsZSl7Zm9yKGxldCBzPTA7czwzO3MrKyl7Y29uc3Qgbj10W3IrMipzXSxpPXRbcisyKnMrMV0sbz1uLWksYT1uK2k7bzxlW3NdJiYoZVtzXT1vKSxhPmVbcyszXSYmKGVbcyszXT1hKX19ZnVuY3Rpb24geXMocil7Y29uc3QgdD1yWzNdLXJbMF0sZT1yWzRdLXJbMV0scz1yWzVdLXJbMl07cmV0dXJuIDIqKHQqZStlKnMrcyp0KX1jb25zdCBqdD0zMixIdT0ocix0KT0+ci5jYW5kaWRhdGUtdC5jYW5kaWRhdGUsb2U9bmV3IEFycmF5KGp0KS5maWxsKCkubWFwKCgpPT4oe2NvdW50OjAsYm91bmRzOm5ldyBGbG9hdDMyQXJyYXkoNikscmlnaHRDYWNoZUJvdW5kczpuZXcgRmxvYXQzMkFycmF5KDYpLGxlZnRDYWNoZUJvdW5kczpuZXcgRmxvYXQzMkFycmF5KDYpLGNhbmRpZGF0ZTowfSkpLG5uPW5ldyBGbG9hdDMyQXJyYXkoNik7ZnVuY3Rpb24gcXUocix0LGUscyxuLGkpe2xldCBvPS0xLGE9MDtpZihpPT09dW8pbz15byh0KSxvIT09LTEmJihhPSh0W29dK3RbbyszXSkvMik7ZWxzZSBpZihpPT09dnUpbz15byhyKSxvIT09LTEmJihhPSR1KGUscyxuLG8pKTtlbHNlIGlmKGk9PT1QdSl7Y29uc3QgYz15cyhyKTtsZXQgdT1naSpuO2NvbnN0IGg9cyo2LGw9KHMrbikqNjtmb3IobGV0IGQ9MDtkPDM7ZCsrKXtjb25zdCBmPXRbZF0sZz0odFtkKzNdLWYpL2p0O2lmKG48anQvNCl7Y29uc3QgeT1bLi4ub2VdO3kubGVuZ3RoPW47bGV0IFQ9MDtmb3IobGV0IE09aDtNPGw7TSs9NixUKyspe2NvbnN0IE49eVtUXTtOLmNhbmRpZGF0ZT1lW00rMipkXSxOLmNvdW50PTA7Y29uc3R7Ym91bmRzOl8sbGVmdENhY2hlQm91bmRzOlMscmlnaHRDYWNoZUJvdW5kczpFfT1OO2ZvcihsZXQgRj0wO0Y8MztGKyspRVtGXT0xLzAsRVtGKzNdPS0xLzAsU1tGXT0xLzAsU1tGKzNdPS0xLzAsX1tGXT0xLzAsX1tGKzNdPS0xLzA7c24oTSxlLF8pfXkuc29ydChIdSk7bGV0IHc9bjtmb3IobGV0IE09MDtNPHc7TSsrKXtjb25zdCBOPXlbTV07Zm9yKDtNKzE8dyYmeVtNKzFdLmNhbmRpZGF0ZT09PU4uY2FuZGlkYXRlOyl5LnNwbGljZShNKzEsMSksdy0tfWZvcihsZXQgTT1oO008bDtNKz02KXtjb25zdCBOPWVbTSsyKmRdO2ZvcihsZXQgXz0wO188dztfKyspe2NvbnN0IFM9eVtfXTtOPj1TLmNhbmRpZGF0ZT9zbihNLGUsUy5yaWdodENhY2hlQm91bmRzKTooc24oTSxlLFMubGVmdENhY2hlQm91bmRzKSxTLmNvdW50KyspfX1mb3IobGV0IE09MDtNPHc7TSsrKXtjb25zdCBOPXlbTV0sXz1OLmNvdW50LFM9bi1OLmNvdW50LEU9Ti5sZWZ0Q2FjaGVCb3VuZHMsRj1OLnJpZ2h0Q2FjaGVCb3VuZHM7bGV0IFI9MDtfIT09MCYmKFI9eXMoRSkvYyk7bGV0IEk9MDtTIT09MCYmKEk9eXMoRikvYyk7Y29uc3QgQj1mbytnaSooUipfK0kqUyk7Qjx1JiYobz1kLHU9QixhPU4uY2FuZGlkYXRlKX19ZWxzZXtmb3IobGV0IHc9MDt3PGp0O3crKyl7Y29uc3QgTT1vZVt3XTtNLmNvdW50PTAsTS5jYW5kaWRhdGU9ZitnK3cqZztjb25zdCBOPU0uYm91bmRzO2ZvcihsZXQgXz0wO188MztfKyspTltfXT0xLzAsTltfKzNdPS0xLzB9Zm9yKGxldCB3PWg7dzxsO3crPTYpe2xldCBfPX5+KChlW3crMipkXS1mKS9nKTtfPj1qdCYmKF89anQtMSk7Y29uc3QgUz1vZVtfXTtTLmNvdW50Kyssc24odyxlLFMuYm91bmRzKX1jb25zdCB5PW9lW2p0LTFdO2dvKHkuYm91bmRzLHkucmlnaHRDYWNoZUJvdW5kcyk7Zm9yKGxldCB3PWp0LTI7dz49MDt3LS0pe2NvbnN0IE09b2Vbd10sTj1vZVt3KzFdO3hvKE0uYm91bmRzLE4ucmlnaHRDYWNoZUJvdW5kcyxNLnJpZ2h0Q2FjaGVCb3VuZHMpfWxldCBUPTA7Zm9yKGxldCB3PTA7dzxqdC0xO3crKyl7Y29uc3QgTT1vZVt3XSxOPU0uY291bnQsXz1NLmJvdW5kcyxFPW9lW3crMV0ucmlnaHRDYWNoZUJvdW5kcztOIT09MCYmKFQ9PT0wP2dvKF8sbm4pOnhvKF8sbm4sbm4pKSxUKz1OO2xldCBGPTAsUj0wO1QhPT0wJiYoRj15cyhubikvYyk7Y29uc3QgST1uLVQ7SSE9PTAmJihSPXlzKEUpL2MpO2NvbnN0IEI9Zm8rZ2kqKEYqVCtSKkkpO0I8dSYmKG89ZCx1PUIsYT1NLmNhbmRpZGF0ZSl9fX19ZWxzZSBjb25zb2xlLndhcm4oYE1lc2hCVkg6IEludmFsaWQgYnVpbGQgc3RyYXRlZ3kgdmFsdWUgJHtpfSB1c2VkLmApO3JldHVybntheGlzOm8scG9zOmF9fWZ1bmN0aW9uICR1KHIsdCxlLHMpe2xldCBuPTA7Zm9yKGxldCBpPXQsbz10K2U7aTxvO2krKyluKz1yW2kqNitzKjJdO3JldHVybiBuL2V9Y2xhc3MgTml7Y29uc3RydWN0b3IoKXt0aGlzLmJvdW5kaW5nRGF0YT1uZXcgRmxvYXQzMkFycmF5KDYpfX1mdW5jdGlvbiBHdShyLHQsZSxzLG4saSl7bGV0IG89cyxhPXMrbi0xO2NvbnN0IGM9aS5wb3MsdT1pLmF4aXMqMjtmb3IoOzspe2Zvcig7bzw9YSYmZVtvKjYrdV08YzspbysrO2Zvcig7bzw9YSYmZVthKjYrdV0+PWM7KWEtLTtpZihvPGEpe2ZvcihsZXQgaD0wO2g8MztoKyspe2xldCBsPXRbbyozK2hdO3RbbyozK2hdPXRbYSozK2hdLHRbYSozK2hdPWx9Zm9yKGxldCBoPTA7aDw2O2grKyl7bGV0IGw9ZVtvKjYraF07ZVtvKjYraF09ZVthKjYraF0sZVthKjYraF09bH1vKyssYS0tfWVsc2UgcmV0dXJuIG99fWZ1bmN0aW9uIFd1KHIsdCxlLHMsbixpKXtsZXQgbz1zLGE9cytuLTE7Y29uc3QgYz1pLnBvcyx1PWkuYXhpcyoyO2Zvcig7Oyl7Zm9yKDtvPD1hJiZlW28qNit1XTxjOylvKys7Zm9yKDtvPD1hJiZlW2EqNit1XT49YzspYS0tO2lmKG88YSl7bGV0IGg9cltvXTtyW29dPXJbYV0sclthXT1oO2ZvcihsZXQgbD0wO2w8NjtsKyspe2xldCBkPWVbbyo2K2xdO2Vbbyo2K2xdPWVbYSo2K2xdLGVbYSo2K2xdPWR9bysrLGEtLX1lbHNlIHJldHVybiBvfX1mdW5jdGlvbiBwdChyLHQpe3JldHVybiB0W3IrMTVdPT09NjU1MzV9ZnVuY3Rpb24gVHQocix0KXtyZXR1cm4gdFtyKzZdfWZ1bmN0aW9uIFN0KHIsdCl7cmV0dXJuIHRbcisxNF19ZnVuY3Rpb24gX3Qocil7cmV0dXJuIHIrOH1mdW5jdGlvbiB6dChyLHQpe3JldHVybiB0W3IrNl19ZnVuY3Rpb24gVG8ocix0KXtyZXR1cm4gdFtyKzddfWZ1bmN0aW9uIGpsKHIpe3JldHVybiByfWxldCBObyxncyxybix3bztjb25zdCBYdT1NYXRoLnBvdygyLDMyKTtmdW5jdGlvbiB3aShyKXtyZXR1cm4iY291bnQiaW4gcj8xOjErd2koci5sZWZ0KSt3aShyLnJpZ2h0KX1mdW5jdGlvbiBZdShyLHQsZSl7cmV0dXJuIE5vPW5ldyBGbG9hdDMyQXJyYXkoZSksZ3M9bmV3IFVpbnQzMkFycmF5KGUpLHJuPW5ldyBVaW50MTZBcnJheShlKSx3bz1uZXcgVWludDhBcnJheShlKSxBaShyLHQpfWZ1bmN0aW9uIEFpKHIsdCl7Y29uc3QgZT1yLzQscz1yLzIsbj0iY291bnQiaW4gdCxpPXQuYm91bmRpbmdEYXRhO2ZvcihsZXQgbz0wO288NjtvKyspTm9bZStvXT1pW29dO2lmKG4paWYodC5idWZmZXIpe2NvbnN0IG89dC5idWZmZXI7d28uc2V0KG5ldyBVaW50OEFycmF5KG8pLHIpO2ZvcihsZXQgYT1yLGM9citvLmJ5dGVMZW5ndGg7YTxjO2ErPW1zKXtjb25zdCB1PWEvMjtwdCh1LHJuKXx8KGdzW2EvNCs2XSs9ZSl9cmV0dXJuIHIrby5ieXRlTGVuZ3RofWVsc2V7Y29uc3Qgbz10Lm9mZnNldCxhPXQuY291bnQ7cmV0dXJuIGdzW2UrNl09byxybltzKzE0XT1hLHJuW3MrMTVdPWVuLHIrbXN9ZWxzZXtjb25zdCBvPXQubGVmdCxhPXQucmlnaHQsYz10LnNwbGl0QXhpcztsZXQgdTtpZih1PUFpKHIrbXMsbyksdS80Plh1KXRocm93IG5ldyBFcnJvcigiTWVzaEJWSDogQ2Fubm90IHN0b3JlIGNoaWxkIHBvaW50ZXIgZ3JlYXRlciB0aGFuIDMyIGJpdHMuIik7cmV0dXJuIGdzW2UrNl09dS80LHU9QWkodSxhKSxnc1tlKzddPWMsdX19ZnVuY3Rpb24gWnUocix0KXtjb25zdCBlPShyLmluZGV4P3IuaW5kZXguY291bnQ6ci5hdHRyaWJ1dGVzLnBvc2l0aW9uLmNvdW50KS8zLHM9ZT4yKioxNixuPXM/NDoyLGk9dD9uZXcgU2hhcmVkQXJyYXlCdWZmZXIoZSpuKTpuZXcgQXJyYXlCdWZmZXIoZSpuKSxvPXM/bmV3IFVpbnQzMkFycmF5KGkpOm5ldyBVaW50MTZBcnJheShpKTtmb3IobGV0IGE9MCxjPW8ubGVuZ3RoO2E8YzthKyspb1thXT1hO3JldHVybiBvfWZ1bmN0aW9uIEp1KHIsdCxlLHMsbil7Y29uc3R7bWF4RGVwdGg6aSx2ZXJib3NlOm8sbWF4TGVhZlRyaXM6YSxzdHJhdGVneTpjLG9uUHJvZ3Jlc3M6dSxpbmRpcmVjdDpofT1uLGw9ci5faW5kaXJlY3RCdWZmZXIsZD1yLmdlb21ldHJ5LGY9ZC5pbmRleD9kLmluZGV4LmFycmF5Om51bGwscD1oP1d1Okd1LG09RGUoZCksZz1uZXcgRmxvYXQzMkFycmF5KDYpO2xldCB5PSExO2NvbnN0IFQ9bmV3IE5pO3JldHVybiBUaSh0LGUscyxULmJvdW5kaW5nRGF0YSxnKSxNKFQsZSxzLGcpLFQ7ZnVuY3Rpb24gdyhOKXt1JiZ1KE4vbSl9ZnVuY3Rpb24gTShOLF8sUyxFPW51bGwsRj0wKXtpZigheSYmRj49aSYmKHk9ITAsbyYmKGNvbnNvbGUud2FybihgTWVzaEJWSDogTWF4IGRlcHRoIG9mICR7aX0gcmVhY2hlZCB3aGVuIGdlbmVyYXRpbmcgQlZILiBDb25zaWRlciBpbmNyZWFzaW5nIG1heERlcHRoLmApLGNvbnNvbGUud2FybihkKSkpLFM8PWF8fEY+PWkpcmV0dXJuIHcoXytTKSxOLm9mZnNldD1fLE4uY291bnQ9UyxOO2NvbnN0IFI9cXUoTi5ib3VuZGluZ0RhdGEsRSx0LF8sUyxjKTtpZihSLmF4aXM9PT0tMSlyZXR1cm4gdyhfK1MpLE4ub2Zmc2V0PV8sTi5jb3VudD1TLE47Y29uc3QgST1wKGwsZix0LF8sUyxSKTtpZihJPT09X3x8ST09PV8rUyl3KF8rUyksTi5vZmZzZXQ9XyxOLmNvdW50PVM7ZWxzZXtOLnNwbGl0QXhpcz1SLmF4aXM7Y29uc3QgQj1uZXcgTmksUD1fLEw9SS1fO04ubGVmdD1CLFRpKHQsUCxMLEIuYm91bmRpbmdEYXRhLGcpLE0oQixQLEwsZyxGKzEpO2NvbnN0IFY9bmV3IE5pLEc9SSxOdD1TLUw7Ti5yaWdodD1WLFRpKHQsRyxOdCxWLmJvdW5kaW5nRGF0YSxnKSxNKFYsRyxOdCxnLEYrMSl9cmV0dXJuIE59fWZ1bmN0aW9uIGp1KHIsdCl7Y29uc3QgZT1yLmdlb21ldHJ5O3QuaW5kaXJlY3QmJihyLl9pbmRpcmVjdEJ1ZmZlcj1adShlLHQudXNlU2hhcmVkQXJyYXlCdWZmZXIpLFV1KGUsdC5yYW5nZSkmJiF0LnZlcmJvc2UmJmNvbnNvbGUud2FybignTWVzaEJWSDogUHJvdmlkZWQgZ2VvbWV0cnkgY29udGFpbnMgZ3JvdXBzIG9yIGEgcmFuZ2UgdGhhdCBkbyBub3QgZnVsbHkgc3BhbiB0aGUgdmVydGV4IGNvbnRlbnRzIHdoaWxlIHVzaW5nIHRoZSAiaW5kaXJlY3QiIG9wdGlvbi4gQlZIIG1heSBpbmNvcnJlY3RseSByZXBvcnQgaW50ZXJzZWN0aW9ucyBvbiB1bnJlbmRlcmVkIHBvcnRpb25zIG9mIHRoZSBnZW9tZXRyeS4nKSksci5faW5kaXJlY3RCdWZmZXJ8fFZ1KGUsdCk7Y29uc3Qgcz10LnVzZVNoYXJlZEFycmF5QnVmZmVyP1NoYXJlZEFycmF5QnVmZmVyOkFycmF5QnVmZmVyLG49a3UoZSksaT10LmluZGlyZWN0P3BvKGUsdC5yYW5nZSk6bW8oZSx0LnJhbmdlKTtyLl9yb290cz1pLm1hcChvPT57Y29uc3QgYT1KdShyLG4sby5vZmZzZXQsby5jb3VudCx0KSxjPXdpKGEpLHU9bmV3IHMobXMqYyk7cmV0dXJuIFl1KDAsYSx1KSx1fSl9Y2xhc3MgUXR7Y29uc3RydWN0b3IoKXt0aGlzLm1pbj0xLzAsdGhpcy5tYXg9LTEvMH1zZXRGcm9tUG9pbnRzRmllbGQodCxlKXtsZXQgcz0xLzAsbj0tMS8wO2ZvcihsZXQgaT0wLG89dC5sZW5ndGg7aTxvO2krKyl7Y29uc3QgYz10W2ldW2VdO3M9YzxzP2M6cyxuPWM+bj9jOm59dGhpcy5taW49cyx0aGlzLm1heD1ufXNldEZyb21Qb2ludHModCxlKXtsZXQgcz0xLzAsbj0tMS8wO2ZvcihsZXQgaT0wLG89ZS5sZW5ndGg7aTxvO2krKyl7Y29uc3QgYT1lW2ldLGM9dC5kb3QoYSk7cz1jPHM/YzpzLG49Yz5uP2M6bn10aGlzLm1pbj1zLHRoaXMubWF4PW59aXNTZXBhcmF0ZWQodCl7cmV0dXJuIHRoaXMubWluPnQubWF4fHx0Lm1pbj50aGlzLm1heH19UXQucHJvdG90eXBlLnNldEZyb21Cb3g9ZnVuY3Rpb24oKXtjb25zdCByPW5ldyBBO3JldHVybiBmdW5jdGlvbihlLHMpe2NvbnN0IG49cy5taW4saT1zLm1heDtsZXQgbz0xLzAsYT0tMS8wO2ZvcihsZXQgYz0wO2M8PTE7YysrKWZvcihsZXQgdT0wO3U8PTE7dSsrKWZvcihsZXQgaD0wO2g8PTE7aCsrKXtyLng9bi54KmMraS54KigxLWMpLHIueT1uLnkqdStpLnkqKDEtdSksci56PW4ueipoK2kueiooMS1oKTtjb25zdCBsPWUuZG90KHIpO289TWF0aC5taW4obCxvKSxhPU1hdGgubWF4KGwsYSl9dGhpcy5taW49byx0aGlzLm1heD1hfX0oKTtjb25zdCBRdT1mdW5jdGlvbigpe2NvbnN0IHI9bmV3IEEsdD1uZXcgQSxlPW5ldyBBO3JldHVybiBmdW5jdGlvbihuLGksbyl7Y29uc3QgYT1uLnN0YXJ0LGM9cix1PWkuc3RhcnQsaD10O2Uuc3ViVmVjdG9ycyhhLHUpLHIuc3ViVmVjdG9ycyhuLmVuZCxuLnN0YXJ0KSx0LnN1YlZlY3RvcnMoaS5lbmQsaS5zdGFydCk7Y29uc3QgbD1lLmRvdChoKSxkPWguZG90KGMpLGY9aC5kb3QoaCkscD1lLmRvdChjKSxnPWMuZG90KGMpKmYtZCpkO2xldCB5LFQ7ZyE9PTA/eT0obCpkLXAqZikvZzp5PTAsVD0obCt5KmQpL2Ysby54PXksby55PVR9fSgpLE1pPWZ1bmN0aW9uKCl7Y29uc3Qgcj1uZXcgSix0PW5ldyBBLGU9bmV3IEE7cmV0dXJuIGZ1bmN0aW9uKG4saSxvLGEpe1F1KG4saSxyKTtsZXQgYz1yLngsdT1yLnk7aWYoYz49MCYmYzw9MSYmdT49MCYmdTw9MSl7bi5hdChjLG8pLGkuYXQodSxhKTtyZXR1cm59ZWxzZSBpZihjPj0wJiZjPD0xKXt1PDA/aS5hdCgwLGEpOmkuYXQoMSxhKSxuLmNsb3Nlc3RQb2ludFRvUG9pbnQoYSwhMCxvKTtyZXR1cm59ZWxzZSBpZih1Pj0wJiZ1PD0xKXtjPDA/bi5hdCgwLG8pOm4uYXQoMSxvKSxpLmNsb3Nlc3RQb2ludFRvUG9pbnQobywhMCxhKTtyZXR1cm59ZWxzZXtsZXQgaDtjPDA/aD1uLnN0YXJ0Omg9bi5lbmQ7bGV0IGw7dTwwP2w9aS5zdGFydDpsPWkuZW5kO2NvbnN0IGQ9dCxmPWU7aWYobi5jbG9zZXN0UG9pbnRUb1BvaW50KGwsITAsdCksaS5jbG9zZXN0UG9pbnRUb1BvaW50KGgsITAsZSksZC5kaXN0YW5jZVRvU3F1YXJlZChsKTw9Zi5kaXN0YW5jZVRvU3F1YXJlZChoKSl7by5jb3B5KGQpLGEuY29weShsKTtyZXR1cm59ZWxzZXtvLmNvcHkoaCksYS5jb3B5KGYpO3JldHVybn19fX0oKSxLdT1mdW5jdGlvbigpe2NvbnN0IHI9bmV3IEEsdD1uZXcgQSxlPW5ldyBYbixzPW5ldyBadDtyZXR1cm4gZnVuY3Rpb24oaSxvKXtjb25zdHtyYWRpdXM6YSxjZW50ZXI6Y309aSx7YTp1LGI6aCxjOmx9PW87aWYocy5zdGFydD11LHMuZW5kPWgscy5jbG9zZXN0UG9pbnRUb1BvaW50KGMsITAscikuZGlzdGFuY2VUbyhjKTw9YXx8KHMuc3RhcnQ9dSxzLmVuZD1sLHMuY2xvc2VzdFBvaW50VG9Qb2ludChjLCEwLHIpLmRpc3RhbmNlVG8oYyk8PWEpfHwocy5zdGFydD1oLHMuZW5kPWwscy5jbG9zZXN0UG9pbnRUb1BvaW50KGMsITAscikuZGlzdGFuY2VUbyhjKTw9YSkpcmV0dXJuITA7Y29uc3QgbT1vLmdldFBsYW5lKGUpO2lmKE1hdGguYWJzKG0uZGlzdGFuY2VUb1BvaW50KGMpKTw9YSl7Y29uc3QgeT1tLnByb2plY3RQb2ludChjLHQpO2lmKG8uY29udGFpbnNQb2ludCh5KSlyZXR1cm4hMH1yZXR1cm4hMX19KCksdGw9MWUtMTU7ZnVuY3Rpb24gU2kocil7cmV0dXJuIE1hdGguYWJzKHIpPHRsfWNsYXNzIEx0IGV4dGVuZHMgd3R7Y29uc3RydWN0b3IoLi4udCl7c3VwZXIoLi4udCksdGhpcy5pc0V4dGVuZGVkVHJpYW5nbGU9ITAsdGhpcy5zYXRBeGVzPW5ldyBBcnJheSg0KS5maWxsKCkubWFwKCgpPT5uZXcgQSksdGhpcy5zYXRCb3VuZHM9bmV3IEFycmF5KDQpLmZpbGwoKS5tYXAoKCk9Pm5ldyBRdCksdGhpcy5wb2ludHM9W3RoaXMuYSx0aGlzLmIsdGhpcy5jXSx0aGlzLnNwaGVyZT1uZXcgY3IsdGhpcy5wbGFuZT1uZXcgWG4sdGhpcy5uZWVkc1VwZGF0ZT0hMH1pbnRlcnNlY3RzU3BoZXJlKHQpe3JldHVybiBLdSh0LHRoaXMpfXVwZGF0ZSgpe2NvbnN0IHQ9dGhpcy5hLGU9dGhpcy5iLHM9dGhpcy5jLG49dGhpcy5wb2ludHMsaT10aGlzLnNhdEF4ZXMsbz10aGlzLnNhdEJvdW5kcyxhPWlbMF0sYz1vWzBdO3RoaXMuZ2V0Tm9ybWFsKGEpLGMuc2V0RnJvbVBvaW50cyhhLG4pO2NvbnN0IHU9aVsxXSxoPW9bMV07dS5zdWJWZWN0b3JzKHQsZSksaC5zZXRGcm9tUG9pbnRzKHUsbik7Y29uc3QgbD1pWzJdLGQ9b1syXTtsLnN1YlZlY3RvcnMoZSxzKSxkLnNldEZyb21Qb2ludHMobCxuKTtjb25zdCBmPWlbM10scD1vWzNdO2Yuc3ViVmVjdG9ycyhzLHQpLHAuc2V0RnJvbVBvaW50cyhmLG4pLHRoaXMuc3BoZXJlLnNldEZyb21Qb2ludHModGhpcy5wb2ludHMpLHRoaXMucGxhbmUuc2V0RnJvbU5vcm1hbEFuZENvcGxhbmFyUG9pbnQoYSx0KSx0aGlzLm5lZWRzVXBkYXRlPSExfX1MdC5wcm90b3R5cGUuY2xvc2VzdFBvaW50VG9TZWdtZW50PWZ1bmN0aW9uKCl7Y29uc3Qgcj1uZXcgQSx0PW5ldyBBLGU9bmV3IFp0O3JldHVybiBmdW5jdGlvbihuLGk9bnVsbCxvPW51bGwpe2NvbnN0e3N0YXJ0OmEsZW5kOmN9PW4sdT10aGlzLnBvaW50cztsZXQgaCxsPTEvMDtmb3IobGV0IGQ9MDtkPDM7ZCsrKXtjb25zdCBmPShkKzEpJTM7ZS5zdGFydC5jb3B5KHVbZF0pLGUuZW5kLmNvcHkodVtmXSksTWkoZSxuLHIsdCksaD1yLmRpc3RhbmNlVG9TcXVhcmVkKHQpLGg8bCYmKGw9aCxpJiZpLmNvcHkociksbyYmby5jb3B5KHQpKX1yZXR1cm4gdGhpcy5jbG9zZXN0UG9pbnRUb1BvaW50KGEsciksaD1hLmRpc3RhbmNlVG9TcXVhcmVkKHIpLGg8bCYmKGw9aCxpJiZpLmNvcHkociksbyYmby5jb3B5KGEpKSx0aGlzLmNsb3Nlc3RQb2ludFRvUG9pbnQoYyxyKSxoPWMuZGlzdGFuY2VUb1NxdWFyZWQociksaDxsJiYobD1oLGkmJmkuY29weShyKSxvJiZvLmNvcHkoYykpLE1hdGguc3FydChsKX19KCksTHQucHJvdG90eXBlLmludGVyc2VjdHNUcmlhbmdsZT1mdW5jdGlvbigpe2NvbnN0IHI9bmV3IEx0LHQ9bmV3IEFycmF5KDMpLGU9bmV3IEFycmF5KDMpLHM9bmV3IFF0LG49bmV3IFF0LGk9bmV3IEEsbz1uZXcgQSxhPW5ldyBBLGM9bmV3IEEsdT1uZXcgQSxoPW5ldyBadCxsPW5ldyBadCxkPW5ldyBadCxmPW5ldyBBO2Z1bmN0aW9uIHAobSxnLHkpe2NvbnN0IFQ9bS5wb2ludHM7bGV0IHc9MCxNPS0xO2ZvcihsZXQgTj0wO048MztOKyspe2NvbnN0e3N0YXJ0Ol8sZW5kOlN9PWg7Xy5jb3B5KFRbTl0pLFMuY29weShUWyhOKzEpJTNdKSxoLmRlbHRhKG8pO2NvbnN0IEU9U2koZy5kaXN0YW5jZVRvUG9pbnQoXykpO2lmKFNpKGcubm9ybWFsLmRvdChvKSkmJkUpe3kuY29weShoKSx3PTI7YnJlYWt9Y29uc3QgRj1nLmludGVyc2VjdExpbmUoaCxmKTtpZighRiYmRSYmZi5jb3B5KF8pLChGfHxFKSYmIVNpKGYuZGlzdGFuY2VUbyhTKSkpe2lmKHc8PTEpKHc9PT0xP3kuc3RhcnQ6eS5lbmQpLmNvcHkoZiksRSYmKE09dyk7ZWxzZSBpZih3Pj0yKXsoTT09PTE/eS5zdGFydDp5LmVuZCkuY29weShmKSx3PTI7YnJlYWt9aWYodysrLHc9PT0yJiZNPT09LTEpYnJlYWt9fXJldHVybiB3fXJldHVybiBmdW5jdGlvbihnLHk9bnVsbCxUPSExKXt0aGlzLm5lZWRzVXBkYXRlJiZ0aGlzLnVwZGF0ZSgpLGcuaXNFeHRlbmRlZFRyaWFuZ2xlP2cubmVlZHNVcGRhdGUmJmcudXBkYXRlKCk6KHIuY29weShnKSxyLnVwZGF0ZSgpLGc9cik7Y29uc3Qgdz10aGlzLnBsYW5lLE09Zy5wbGFuZTtpZihNYXRoLmFicyh3Lm5vcm1hbC5kb3QoTS5ub3JtYWwpKT4xLTFlLTEwKXtjb25zdCBOPXRoaXMuc2F0Qm91bmRzLF89dGhpcy5zYXRBeGVzO2VbMF09Zy5hLGVbMV09Zy5iLGVbMl09Zy5jO2ZvcihsZXQgRj0wO0Y8NDtGKyspe2NvbnN0IFI9TltGXSxJPV9bRl07aWYocy5zZXRGcm9tUG9pbnRzKEksZSksUi5pc1NlcGFyYXRlZChzKSlyZXR1cm4hMX1jb25zdCBTPWcuc2F0Qm91bmRzLEU9Zy5zYXRBeGVzO3RbMF09dGhpcy5hLHRbMV09dGhpcy5iLHRbMl09dGhpcy5jO2ZvcihsZXQgRj0wO0Y8NDtGKyspe2NvbnN0IFI9U1tGXSxJPUVbRl07aWYocy5zZXRGcm9tUG9pbnRzKEksdCksUi5pc1NlcGFyYXRlZChzKSlyZXR1cm4hMX1mb3IobGV0IEY9MDtGPDQ7RisrKXtjb25zdCBSPV9bRl07Zm9yKGxldCBJPTA7STw0O0krKyl7Y29uc3QgQj1FW0ldO2lmKGkuY3Jvc3NWZWN0b3JzKFIsQikscy5zZXRGcm9tUG9pbnRzKGksdCksbi5zZXRGcm9tUG9pbnRzKGksZSkscy5pc1NlcGFyYXRlZChuKSlyZXR1cm4hMX19cmV0dXJuIHkmJihUfHxjb25zb2xlLndhcm4oIkV4dGVuZGVkVHJpYW5nbGUuaW50ZXJzZWN0c1RyaWFuZ2xlOiBUcmlhbmdsZXMgYXJlIGNvcGxhbmFyIHdoaWNoIGRvZXMgbm90IHN1cHBvcnQgYW4gb3V0cHV0IGVkZ2UuIFNldHRpbmcgZWRnZSB0byAwLCAwLCAwLiIpLHkuc3RhcnQuc2V0KDAsMCwwKSx5LmVuZC5zZXQoMCwwLDApKSwhMH1lbHNle2NvbnN0IE49cCh0aGlzLE0sbCk7aWYoTj09PTEmJmcuY29udGFpbnNQb2ludChsLmVuZCkpcmV0dXJuIHkmJih5LnN0YXJ0LmNvcHkobC5lbmQpLHkuZW5kLmNvcHkobC5lbmQpKSwhMDtpZihOIT09MilyZXR1cm4hMTtjb25zdCBfPXAoZyx3LGQpO2lmKF89PT0xJiZ0aGlzLmNvbnRhaW5zUG9pbnQoZC5lbmQpKXJldHVybiB5JiYoeS5zdGFydC5jb3B5KGQuZW5kKSx5LmVuZC5jb3B5KGQuZW5kKSksITA7aWYoXyE9PTIpcmV0dXJuITE7aWYobC5kZWx0YShhKSxkLmRlbHRhKGMpLGEuZG90KGMpPDApe2xldCBQPWQuc3RhcnQ7ZC5zdGFydD1kLmVuZCxkLmVuZD1QfWNvbnN0IFM9bC5zdGFydC5kb3QoYSksRT1sLmVuZC5kb3QoYSksRj1kLnN0YXJ0LmRvdChhKSxSPWQuZW5kLmRvdChhKSxJPUU8RixCPVM8UjtyZXR1cm4gUyE9PVImJkYhPT1FJiZJPT09Qj8hMTooeSYmKHUuc3ViVmVjdG9ycyhsLnN0YXJ0LGQuc3RhcnQpLHUuZG90KGEpPjA/eS5zdGFydC5jb3B5KGwuc3RhcnQpOnkuc3RhcnQuY29weShkLnN0YXJ0KSx1LnN1YlZlY3RvcnMobC5lbmQsZC5lbmQpLHUuZG90KGEpPDA/eS5lbmQuY29weShsLmVuZCk6eS5lbmQuY29weShkLmVuZCkpLCEwKX19fSgpLEx0LnByb3RvdHlwZS5kaXN0YW5jZVRvUG9pbnQ9ZnVuY3Rpb24oKXtjb25zdCByPW5ldyBBO3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5jbG9zZXN0UG9pbnRUb1BvaW50KGUsciksZS5kaXN0YW5jZVRvKHIpfX0oKSxMdC5wcm90b3R5cGUuZGlzdGFuY2VUb1RyaWFuZ2xlPWZ1bmN0aW9uKCl7Y29uc3Qgcj1uZXcgQSx0PW5ldyBBLGU9WyJhIiwiYiIsImMiXSxzPW5ldyBadCxuPW5ldyBadDtyZXR1cm4gZnVuY3Rpb24obyxhPW51bGwsYz1udWxsKXtjb25zdCB1PWF8fGM/czpudWxsO2lmKHRoaXMuaW50ZXJzZWN0c1RyaWFuZ2xlKG8sdSkpcmV0dXJuKGF8fGMpJiYoYSYmdS5nZXRDZW50ZXIoYSksYyYmdS5nZXRDZW50ZXIoYykpLDA7bGV0IGg9MS8wO2ZvcihsZXQgbD0wO2w8MztsKyspe2xldCBkO2NvbnN0IGY9ZVtsXSxwPW9bZl07dGhpcy5jbG9zZXN0UG9pbnRUb1BvaW50KHAsciksZD1wLmRpc3RhbmNlVG9TcXVhcmVkKHIpLGQ8aCYmKGg9ZCxhJiZhLmNvcHkociksYyYmYy5jb3B5KHApKTtjb25zdCBtPXRoaXNbZl07by5jbG9zZXN0UG9pbnRUb1BvaW50KG0sciksZD1tLmRpc3RhbmNlVG9TcXVhcmVkKHIpLGQ8aCYmKGg9ZCxhJiZhLmNvcHkobSksYyYmYy5jb3B5KHIpKX1mb3IobGV0IGw9MDtsPDM7bCsrKXtjb25zdCBkPWVbbF0sZj1lWyhsKzEpJTNdO3Muc2V0KHRoaXNbZF0sdGhpc1tmXSk7Zm9yKGxldCBwPTA7cDwzO3ArKyl7Y29uc3QgbT1lW3BdLGc9ZVsocCsxKSUzXTtuLnNldChvW21dLG9bZ10pLE1pKHMsbixyLHQpO2NvbnN0IHk9ci5kaXN0YW5jZVRvU3F1YXJlZCh0KTt5PGgmJihoPXksYSYmYS5jb3B5KHIpLGMmJmMuY29weSh0KSl9fXJldHVybiBNYXRoLnNxcnQoaCl9fSgpO2NsYXNzIGx0e2NvbnN0cnVjdG9yKHQsZSxzKXt0aGlzLmlzT3JpZW50ZWRCb3g9ITAsdGhpcy5taW49bmV3IEEsdGhpcy5tYXg9bmV3IEEsdGhpcy5tYXRyaXg9bmV3IG50LHRoaXMuaW52TWF0cml4PW5ldyBudCx0aGlzLnBvaW50cz1uZXcgQXJyYXkoOCkuZmlsbCgpLm1hcCgoKT0+bmV3IEEpLHRoaXMuc2F0QXhlcz1uZXcgQXJyYXkoMykuZmlsbCgpLm1hcCgoKT0+bmV3IEEpLHRoaXMuc2F0Qm91bmRzPW5ldyBBcnJheSgzKS5maWxsKCkubWFwKCgpPT5uZXcgUXQpLHRoaXMuYWxpZ25lZFNhdEJvdW5kcz1uZXcgQXJyYXkoMykuZmlsbCgpLm1hcCgoKT0+bmV3IFF0KSx0aGlzLm5lZWRzVXBkYXRlPSExLHQmJnRoaXMubWluLmNvcHkodCksZSYmdGhpcy5tYXguY29weShlKSxzJiZ0aGlzLm1hdHJpeC5jb3B5KHMpfXNldCh0LGUscyl7dGhpcy5taW4uY29weSh0KSx0aGlzLm1heC5jb3B5KGUpLHRoaXMubWF0cml4LmNvcHkocyksdGhpcy5uZWVkc1VwZGF0ZT0hMH1jb3B5KHQpe3RoaXMubWluLmNvcHkodC5taW4pLHRoaXMubWF4LmNvcHkodC5tYXgpLHRoaXMubWF0cml4LmNvcHkodC5tYXRyaXgpLHRoaXMubmVlZHNVcGRhdGU9ITB9fWx0LnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24oKXtjb25zdCB0PXRoaXMubWF0cml4LGU9dGhpcy5taW4scz10aGlzLm1heCxuPXRoaXMucG9pbnRzO2ZvcihsZXQgdT0wO3U8PTE7dSsrKWZvcihsZXQgaD0wO2g8PTE7aCsrKWZvcihsZXQgbD0wO2w8PTE7bCsrKXtjb25zdCBkPTEqdXwyKmh8NCpsLGY9bltkXTtmLng9dT9zLng6ZS54LGYueT1oP3MueTplLnksZi56PWw/cy56OmUueixmLmFwcGx5TWF0cml4NCh0KX1jb25zdCBpPXRoaXMuc2F0Qm91bmRzLG89dGhpcy5zYXRBeGVzLGE9blswXTtmb3IobGV0IHU9MDt1PDM7dSsrKXtjb25zdCBoPW9bdV0sbD1pW3VdLGQ9MTw8dSxmPW5bZF07aC5zdWJWZWN0b3JzKGEsZiksbC5zZXRGcm9tUG9pbnRzKGgsbil9Y29uc3QgYz10aGlzLmFsaWduZWRTYXRCb3VuZHM7Y1swXS5zZXRGcm9tUG9pbnRzRmllbGQobiwieCIpLGNbMV0uc2V0RnJvbVBvaW50c0ZpZWxkKG4sInkiKSxjWzJdLnNldEZyb21Qb2ludHNGaWVsZChuLCJ6IiksdGhpcy5pbnZNYXRyaXguY29weSh0aGlzLm1hdHJpeCkuaW52ZXJ0KCksdGhpcy5uZWVkc1VwZGF0ZT0hMX19KCksbHQucHJvdG90eXBlLmludGVyc2VjdHNCb3g9ZnVuY3Rpb24oKXtjb25zdCByPW5ldyBRdDtyZXR1cm4gZnVuY3Rpb24oZSl7dGhpcy5uZWVkc1VwZGF0ZSYmdGhpcy51cGRhdGUoKTtjb25zdCBzPWUubWluLG49ZS5tYXgsaT10aGlzLnNhdEJvdW5kcyxvPXRoaXMuc2F0QXhlcyxhPXRoaXMuYWxpZ25lZFNhdEJvdW5kcztpZihyLm1pbj1zLngsci5tYXg9bi54LGFbMF0uaXNTZXBhcmF0ZWQocil8fChyLm1pbj1zLnksci5tYXg9bi55LGFbMV0uaXNTZXBhcmF0ZWQocikpfHwoci5taW49cy56LHIubWF4PW4ueixhWzJdLmlzU2VwYXJhdGVkKHIpKSlyZXR1cm4hMTtmb3IobGV0IGM9MDtjPDM7YysrKXtjb25zdCB1PW9bY10saD1pW2NdO2lmKHIuc2V0RnJvbUJveCh1LGUpLGguaXNTZXBhcmF0ZWQocikpcmV0dXJuITF9cmV0dXJuITB9fSgpLGx0LnByb3RvdHlwZS5pbnRlcnNlY3RzVHJpYW5nbGU9ZnVuY3Rpb24oKXtjb25zdCByPW5ldyBMdCx0PW5ldyBBcnJheSgzKSxlPW5ldyBRdCxzPW5ldyBRdCxuPW5ldyBBO3JldHVybiBmdW5jdGlvbihvKXt0aGlzLm5lZWRzVXBkYXRlJiZ0aGlzLnVwZGF0ZSgpLG8uaXNFeHRlbmRlZFRyaWFuZ2xlP28ubmVlZHNVcGRhdGUmJm8udXBkYXRlKCk6KHIuY29weShvKSxyLnVwZGF0ZSgpLG89cik7Y29uc3QgYT10aGlzLnNhdEJvdW5kcyxjPXRoaXMuc2F0QXhlczt0WzBdPW8uYSx0WzFdPW8uYix0WzJdPW8uYztmb3IobGV0IGQ9MDtkPDM7ZCsrKXtjb25zdCBmPWFbZF0scD1jW2RdO2lmKGUuc2V0RnJvbVBvaW50cyhwLHQpLGYuaXNTZXBhcmF0ZWQoZSkpcmV0dXJuITF9Y29uc3QgdT1vLnNhdEJvdW5kcyxoPW8uc2F0QXhlcyxsPXRoaXMucG9pbnRzO2ZvcihsZXQgZD0wO2Q8MztkKyspe2NvbnN0IGY9dVtkXSxwPWhbZF07aWYoZS5zZXRGcm9tUG9pbnRzKHAsbCksZi5pc1NlcGFyYXRlZChlKSlyZXR1cm4hMX1mb3IobGV0IGQ9MDtkPDM7ZCsrKXtjb25zdCBmPWNbZF07Zm9yKGxldCBwPTA7cDw0O3ArKyl7Y29uc3QgbT1oW3BdO2lmKG4uY3Jvc3NWZWN0b3JzKGYsbSksZS5zZXRGcm9tUG9pbnRzKG4sdCkscy5zZXRGcm9tUG9pbnRzKG4sbCksZS5pc1NlcGFyYXRlZChzKSlyZXR1cm4hMX19cmV0dXJuITB9fSgpLGx0LnByb3RvdHlwZS5jbG9zZXN0UG9pbnRUb1BvaW50PWZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMubmVlZHNVcGRhdGUmJnRoaXMudXBkYXRlKCksZS5jb3B5KHQpLmFwcGx5TWF0cml4NCh0aGlzLmludk1hdHJpeCkuY2xhbXAodGhpcy5taW4sdGhpcy5tYXgpLmFwcGx5TWF0cml4NCh0aGlzLm1hdHJpeCksZX19KCksbHQucHJvdG90eXBlLmRpc3RhbmNlVG9Qb2ludD1mdW5jdGlvbigpe2NvbnN0IHI9bmV3IEE7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmNsb3Nlc3RQb2ludFRvUG9pbnQoZSxyKSxlLmRpc3RhbmNlVG8ocil9fSgpLGx0LnByb3RvdHlwZS5kaXN0YW5jZVRvQm94PWZ1bmN0aW9uKCl7Y29uc3Qgcj1bIngiLCJ5IiwieiJdLHQ9bmV3IEFycmF5KDEyKS5maWxsKCkubWFwKCgpPT5uZXcgWnQpLGU9bmV3IEFycmF5KDEyKS5maWxsKCkubWFwKCgpPT5uZXcgWnQpLHM9bmV3IEEsbj1uZXcgQTtyZXR1cm4gZnVuY3Rpb24obyxhPTAsYz1udWxsLHU9bnVsbCl7aWYodGhpcy5uZWVkc1VwZGF0ZSYmdGhpcy51cGRhdGUoKSx0aGlzLmludGVyc2VjdHNCb3gobykpcmV0dXJuKGN8fHUpJiYoby5nZXRDZW50ZXIobiksdGhpcy5jbG9zZXN0UG9pbnRUb1BvaW50KG4scyksby5jbG9zZXN0UG9pbnRUb1BvaW50KHMsbiksYyYmYy5jb3B5KHMpLHUmJnUuY29weShuKSksMDtjb25zdCBoPWEqYSxsPW8ubWluLGQ9by5tYXgsZj10aGlzLnBvaW50cztsZXQgcD0xLzA7Zm9yKGxldCBnPTA7Zzw4O2crKyl7Y29uc3QgeT1mW2ddO24uY29weSh5KS5jbGFtcChsLGQpO2NvbnN0IFQ9eS5kaXN0YW5jZVRvU3F1YXJlZChuKTtpZihUPHAmJihwPVQsYyYmYy5jb3B5KHkpLHUmJnUuY29weShuKSxUPGgpKXJldHVybiBNYXRoLnNxcnQoVCl9bGV0IG09MDtmb3IobGV0IGc9MDtnPDM7ZysrKWZvcihsZXQgeT0wO3k8PTE7eSsrKWZvcihsZXQgVD0wO1Q8PTE7VCsrKXtjb25zdCB3PShnKzEpJTMsTT0oZysyKSUzLE49eTw8d3xUPDxNLF89MTw8Z3x5PDx3fFQ8PE0sUz1mW05dLEU9ZltfXTt0W21dLnNldChTLEUpO2NvbnN0IFI9cltnXSxJPXJbd10sQj1yW01dLFA9ZVttXSxMPVAuc3RhcnQsVj1QLmVuZDtMW1JdPWxbUl0sTFtJXT15P2xbSV06ZFtJXSxMW0JdPVQ/bFtCXTpkW0ldLFZbUl09ZFtSXSxWW0ldPXk/bFtJXTpkW0ldLFZbQl09VD9sW0JdOmRbSV0sbSsrfWZvcihsZXQgZz0wO2c8PTE7ZysrKWZvcihsZXQgeT0wO3k8PTE7eSsrKWZvcihsZXQgVD0wO1Q8PTE7VCsrKXtuLng9Zz9kLng6bC54LG4ueT15P2QueTpsLnksbi56PVQ/ZC56Omwueix0aGlzLmNsb3Nlc3RQb2ludFRvUG9pbnQobixzKTtjb25zdCB3PW4uZGlzdGFuY2VUb1NxdWFyZWQocyk7aWYodzxwJiYocD13LGMmJmMuY29weShzKSx1JiZ1LmNvcHkobiksdzxoKSlyZXR1cm4gTWF0aC5zcXJ0KHcpfWZvcihsZXQgZz0wO2c8MTI7ZysrKXtjb25zdCB5PXRbZ107Zm9yKGxldCBUPTA7VDwxMjtUKyspe2NvbnN0IHc9ZVtUXTtNaSh5LHcscyxuKTtjb25zdCBNPXMuZGlzdGFuY2VUb1NxdWFyZWQobik7aWYoTTxwJiYocD1NLGMmJmMuY29weShzKSx1JiZ1LmNvcHkobiksTTxoKSlyZXR1cm4gTWF0aC5zcXJ0KE0pfX1yZXR1cm4gTWF0aC5zcXJ0KHApfX0oKTtjbGFzcyBfaXtjb25zdHJ1Y3Rvcih0KXt0aGlzLl9nZXROZXdQcmltaXRpdmU9dCx0aGlzLl9wcmltaXRpdmVzPVtdfWdldFByaW1pdGl2ZSgpe2NvbnN0IHQ9dGhpcy5fcHJpbWl0aXZlcztyZXR1cm4gdC5sZW5ndGg9PT0wP3RoaXMuX2dldE5ld1ByaW1pdGl2ZSgpOnQucG9wKCl9cmVsZWFzZVByaW1pdGl2ZSh0KXt0aGlzLl9wcmltaXRpdmVzLnB1c2godCl9fWNsYXNzIGVsIGV4dGVuZHMgX2l7Y29uc3RydWN0b3IoKXtzdXBlcigoKT0+bmV3IEx0KX19Y29uc3QgYnQ9bmV3IGVsO2NsYXNzIHNse2NvbnN0cnVjdG9yKCl7dGhpcy5mbG9hdDMyQXJyYXk9bnVsbCx0aGlzLnVpbnQxNkFycmF5PW51bGwsdGhpcy51aW50MzJBcnJheT1udWxsO2NvbnN0IHQ9W107bGV0IGU9bnVsbDt0aGlzLnNldEJ1ZmZlcj1zPT57ZSYmdC5wdXNoKGUpLGU9cyx0aGlzLmZsb2F0MzJBcnJheT1uZXcgRmxvYXQzMkFycmF5KHMpLHRoaXMudWludDE2QXJyYXk9bmV3IFVpbnQxNkFycmF5KHMpLHRoaXMudWludDMyQXJyYXk9bmV3IFVpbnQzMkFycmF5KHMpfSx0aGlzLmNsZWFyQnVmZmVyPSgpPT57ZT1udWxsLHRoaXMuZmxvYXQzMkFycmF5PW51bGwsdGhpcy51aW50MTZBcnJheT1udWxsLHRoaXMudWludDMyQXJyYXk9bnVsbCx0Lmxlbmd0aCE9PTAmJnRoaXMuc2V0QnVmZmVyKHQucG9wKCkpfX19Y29uc3QgWD1uZXcgc2w7bGV0IGFlLFZlO2NvbnN0IFVlPVtdLG9uPW5ldyBfaSgoKT0+bmV3IGh0KTtmdW5jdGlvbiBubChyLHQsZSxzLG4saSl7YWU9b24uZ2V0UHJpbWl0aXZlKCksVmU9b24uZ2V0UHJpbWl0aXZlKCksVWUucHVzaChhZSxWZSksWC5zZXRCdWZmZXIoci5fcm9vdHNbdF0pO2NvbnN0IG89emkoMCxyLmdlb21ldHJ5LGUscyxuLGkpO1guY2xlYXJCdWZmZXIoKSxvbi5yZWxlYXNlUHJpbWl0aXZlKGFlKSxvbi5yZWxlYXNlUHJpbWl0aXZlKFZlKSxVZS5wb3AoKSxVZS5wb3AoKTtjb25zdCBhPVVlLmxlbmd0aDtyZXR1cm4gYT4wJiYoVmU9VWVbYS0xXSxhZT1VZVthLTJdKSxvfWZ1bmN0aW9uIHppKHIsdCxlLHMsbj1udWxsLGk9MCxvPTApe2NvbnN0e2Zsb2F0MzJBcnJheTphLHVpbnQxNkFycmF5OmMsdWludDMyQXJyYXk6dX09WDtsZXQgaD1yKjI7aWYocHQoaCxjKSl7Y29uc3QgZD1UdChyLHUpLGY9U3QoaCxjKTtyZXR1cm4gWihyLGEsYWUpLHMoZCxmLCExLG8saStyLGFlKX1lbHNle2xldCBSPWZ1bmN0aW9uKEIpe2NvbnN0e3VpbnQxNkFycmF5OlAsdWludDMyQXJyYXk6TH09WDtsZXQgVj1CKjI7Zm9yKDshcHQoVixQKTspQj1fdChCKSxWPUIqMjtyZXR1cm4gVHQoQixMKX0sST1mdW5jdGlvbihCKXtjb25zdHt1aW50MTZBcnJheTpQLHVpbnQzMkFycmF5Okx9PVg7bGV0IFY9QioyO2Zvcig7IXB0KFYsUCk7KUI9enQoQixMKSxWPUIqMjtyZXR1cm4gVHQoQixMKStTdChWLFApfTtjb25zdCBkPV90KHIpLGY9enQocix1KTtsZXQgcD1kLG09ZixnLHksVCx3O2lmKG4mJihUPWFlLHc9VmUsWihwLGEsVCksWihtLGEsdyksZz1uKFQpLHk9bih3KSx5PGcpKXtwPWYsbT1kO2NvbnN0IEI9ZztnPXkseT1CLFQ9d31UfHwoVD1hZSxaKHAsYSxUKSk7Y29uc3QgTT1wdChwKjIsYyksTj1lKFQsTSxnLG8rMSxpK3ApO2xldCBfO2lmKE49PT1sbyl7Y29uc3QgQj1SKHApLEw9SShwKS1CO189cyhCLEwsITAsbysxLGkrcCxUKX1lbHNlIF89TiYmemkocCx0LGUscyxuLGksbysxKTtpZihfKXJldHVybiEwO3c9VmUsWihtLGEsdyk7Y29uc3QgUz1wdChtKjIsYyksRT1lKHcsUyx5LG8rMSxpK20pO2xldCBGO2lmKEU9PT1sbyl7Y29uc3QgQj1SKG0pLEw9SShtKS1CO0Y9cyhCLEwsITAsbysxLGkrbSx3KX1lbHNlIEY9RSYmemkobSx0LGUscyxuLGksbysxKTtyZXR1cm4hIUZ9fWNvbnN0IHhzPW5ldyBBLGJpPW5ldyBBO2Z1bmN0aW9uIGlsKHIsdCxlPXt9LHM9MCxuPTEvMCl7Y29uc3QgaT1zKnMsbz1uKm47bGV0IGE9MS8wLGM9bnVsbDtpZihyLnNoYXBlY2FzdCh7Ym91bmRzVHJhdmVyc2VPcmRlcjpoPT4oeHMuY29weSh0KS5jbGFtcChoLm1pbixoLm1heCkseHMuZGlzdGFuY2VUb1NxdWFyZWQodCkpLGludGVyc2VjdHNCb3VuZHM6KGgsbCxkKT0+ZDxhJiZkPG8saW50ZXJzZWN0c1RyaWFuZ2xlOihoLGwpPT57aC5jbG9zZXN0UG9pbnRUb1BvaW50KHQseHMpO2NvbnN0IGQ9dC5kaXN0YW5jZVRvU3F1YXJlZCh4cyk7cmV0dXJuIGQ8YSYmKGJpLmNvcHkoeHMpLGE9ZCxjPWwpLGQ8aX19KSxhPT09MS8wKXJldHVybiBudWxsO2NvbnN0IHU9TWF0aC5zcXJ0KGEpO3JldHVybiBlLnBvaW50P2UucG9pbnQuY29weShiaSk6ZS5wb2ludD1iaS5jbG9uZSgpLGUuZGlzdGFuY2U9dSxlLmZhY2VJbmRleD1jLGV9Y29uc3Qgcmw9cGFyc2VJbnQoWGUpPj0xNjksbWU9bmV3IEEseWU9bmV3IEEsZ2U9bmV3IEEsYW49bmV3IEosY249bmV3IEosaG49bmV3IEosQW89bmV3IEEsTW89bmV3IEEsU289bmV3IEEsVHM9bmV3IEE7ZnVuY3Rpb24gb2wocix0LGUscyxuLGksbyxhKXtsZXQgYztpZihpPT09VWk/Yz1yLmludGVyc2VjdFRyaWFuZ2xlKHMsZSx0LCEwLG4pOmM9ci5pbnRlcnNlY3RUcmlhbmdsZSh0LGUscyxpIT09RW8sbiksYz09PW51bGwpcmV0dXJuIG51bGw7Y29uc3QgdT1yLm9yaWdpbi5kaXN0YW5jZVRvKG4pO3JldHVybiB1PG98fHU+YT9udWxsOntkaXN0YW5jZTp1LHBvaW50Om4uY2xvbmUoKX19ZnVuY3Rpb24gYWwocix0LGUscyxuLGksbyxhLGMsdSxoKXttZS5mcm9tQnVmZmVyQXR0cmlidXRlKHQsaSkseWUuZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0LG8pLGdlLmZyb21CdWZmZXJBdHRyaWJ1dGUodCxhKTtjb25zdCBsPW9sKHIsbWUseWUsZ2UsVHMsYyx1LGgpO2lmKGwpe2NvbnN0IGQ9bmV3IEE7d3QuZ2V0QmFyeWNvb3JkKFRzLG1lLHllLGdlLGQpLHMmJihhbi5mcm9tQnVmZmVyQXR0cmlidXRlKHMsaSksY24uZnJvbUJ1ZmZlckF0dHJpYnV0ZShzLG8pLGhuLmZyb21CdWZmZXJBdHRyaWJ1dGUocyxhKSxsLnV2PXd0LmdldEludGVycG9sYXRpb24oVHMsbWUseWUsZ2UsYW4sY24saG4sbmV3IEopKSxuJiYoYW4uZnJvbUJ1ZmZlckF0dHJpYnV0ZShuLGkpLGNuLmZyb21CdWZmZXJBdHRyaWJ1dGUobixvKSxobi5mcm9tQnVmZmVyQXR0cmlidXRlKG4sYSksbC51djE9d3QuZ2V0SW50ZXJwb2xhdGlvbihUcyxtZSx5ZSxnZSxhbixjbixobixuZXcgSikpLGUmJihBby5mcm9tQnVmZmVyQXR0cmlidXRlKGUsaSksTW8uZnJvbUJ1ZmZlckF0dHJpYnV0ZShlLG8pLFNvLmZyb21CdWZmZXJBdHRyaWJ1dGUoZSxhKSxsLm5vcm1hbD13dC5nZXRJbnRlcnBvbGF0aW9uKFRzLG1lLHllLGdlLEFvLE1vLFNvLG5ldyBBKSxsLm5vcm1hbC5kb3Qoci5kaXJlY3Rpb24pPjAmJmwubm9ybWFsLm11bHRpcGx5U2NhbGFyKC0xKSk7Y29uc3QgZj17YTppLGI6byxjOmEsbm9ybWFsOm5ldyBBLG1hdGVyaWFsSW5kZXg6MH07d3QuZ2V0Tm9ybWFsKG1lLHllLGdlLGYubm9ybWFsKSxsLmZhY2U9ZixsLmZhY2VJbmRleD1pLHJsJiYobC5iYXJ5Y29vcmQ9ZCl9cmV0dXJuIGx9ZnVuY3Rpb24gdW4ocix0LGUscyxuLGksbyl7Y29uc3QgYT1zKjM7bGV0IGM9YSswLHU9YSsxLGg9YSsyO2NvbnN0IGw9ci5pbmRleDtyLmluZGV4JiYoYz1sLmdldFgoYyksdT1sLmdldFgodSksaD1sLmdldFgoaCkpO2NvbnN0e3Bvc2l0aW9uOmQsbm9ybWFsOmYsdXY6cCx1djE6bX09ci5hdHRyaWJ1dGVzLGc9YWwoZSxkLGYscCxtLGMsdSxoLHQsaSxvKTtyZXR1cm4gZz8oZy5mYWNlSW5kZXg9cyxuJiZuLnB1c2goZyksZyk6bnVsbH1mdW5jdGlvbiBzdChyLHQsZSxzKXtjb25zdCBuPXIuYSxpPXIuYixvPXIuYztsZXQgYT10LGM9dCsxLHU9dCsyO2UmJihhPWUuZ2V0WChhKSxjPWUuZ2V0WChjKSx1PWUuZ2V0WCh1KSksbi54PXMuZ2V0WChhKSxuLnk9cy5nZXRZKGEpLG4uej1zLmdldFooYSksaS54PXMuZ2V0WChjKSxpLnk9cy5nZXRZKGMpLGkuej1zLmdldFooYyksby54PXMuZ2V0WCh1KSxvLnk9cy5nZXRZKHUpLG8uej1zLmdldFoodSl9ZnVuY3Rpb24gY2wocix0LGUscyxuLGksbyxhKXtjb25zdHtnZW9tZXRyeTpjLF9pbmRpcmVjdEJ1ZmZlcjp1fT1yO2ZvcihsZXQgaD1zLGw9cytuO2g8bDtoKyspdW4oYyx0LGUsaCxpLG8sYSl9ZnVuY3Rpb24gaGwocix0LGUscyxuLGksbyl7Y29uc3R7Z2VvbWV0cnk6YSxfaW5kaXJlY3RCdWZmZXI6Y309cjtsZXQgdT0xLzAsaD1udWxsO2ZvcihsZXQgbD1zLGQ9cytuO2w8ZDtsKyspe2xldCBmO2Y9dW4oYSx0LGUsbCxudWxsLGksbyksZiYmZi5kaXN0YW5jZTx1JiYoaD1mLHU9Zi5kaXN0YW5jZSl9cmV0dXJuIGh9ZnVuY3Rpb24gdWwocix0LGUscyxuLGksbyl7Y29uc3R7Z2VvbWV0cnk6YX09ZSx7aW5kZXg6Y309YSx1PWEuYXR0cmlidXRlcy5wb3NpdGlvbjtmb3IobGV0IGg9cixsPXQrcjtoPGw7aCsrKXtsZXQgZDtpZihkPWgsc3QobyxkKjMsYyx1KSxvLm5lZWRzVXBkYXRlPSEwLHMobyxkLG4saSkpcmV0dXJuITB9cmV0dXJuITF9ZnVuY3Rpb24gbGwocix0PW51bGwpe3QmJkFycmF5LmlzQXJyYXkodCkmJih0PW5ldyBTZXQodCkpO2NvbnN0IGU9ci5nZW9tZXRyeSxzPWUuaW5kZXg/ZS5pbmRleC5hcnJheTpudWxsLG49ZS5hdHRyaWJ1dGVzLnBvc2l0aW9uO2xldCBpLG8sYSxjLHU9MDtjb25zdCBoPXIuX3Jvb3RzO2ZvcihsZXQgZD0wLGY9aC5sZW5ndGg7ZDxmO2QrKylpPWhbZF0sbz1uZXcgVWludDMyQXJyYXkoaSksYT1uZXcgVWludDE2QXJyYXkoaSksYz1uZXcgRmxvYXQzMkFycmF5KGkpLGwoMCx1KSx1Kz1pLmJ5dGVMZW5ndGg7ZnVuY3Rpb24gbChkLGYscD0hMSl7Y29uc3QgbT1kKjI7aWYoYVttKzE1XT09PWVuKXtjb25zdCB5PW9bZCs2XSxUPWFbbSsxNF07bGV0IHc9MS8wLE09MS8wLE49MS8wLF89LTEvMCxTPS0xLzAsRT0tMS8wO2ZvcihsZXQgRj0zKnksUj0zKih5K1QpO0Y8UjtGKyspe2xldCBJPXNbRl07Y29uc3QgQj1uLmdldFgoSSksUD1uLmdldFkoSSksTD1uLmdldFooSSk7Qjx3JiYodz1CKSxCPl8mJihfPUIpLFA8TSYmKE09UCksUD5TJiYoUz1QKSxMPE4mJihOPUwpLEw+RSYmKEU9TCl9cmV0dXJuIGNbZCswXSE9PXd8fGNbZCsxXSE9PU18fGNbZCsyXSE9PU58fGNbZCszXSE9PV98fGNbZCs0XSE9PVN8fGNbZCs1XSE9PUU/KGNbZCswXT13LGNbZCsxXT1NLGNbZCsyXT1OLGNbZCszXT1fLGNbZCs0XT1TLGNbZCs1XT1FLCEwKTohMX1lbHNle2NvbnN0IHk9ZCs4LFQ9b1tkKzZdLHc9eStmLE09VCtmO2xldCBOPXAsXz0hMSxTPSExO3Q/Tnx8KF89dC5oYXModyksUz10LmhhcyhNKSxOPSFfJiYhUyk6KF89ITAsUz0hMCk7Y29uc3QgRT1OfHxfLEY9Tnx8UztsZXQgUj0hMTtFJiYoUj1sKHksZixOKSk7bGV0IEk9ITE7RiYmKEk9bChULGYsTikpO2NvbnN0IEI9Unx8STtpZihCKWZvcihsZXQgUD0wO1A8MztQKyspe2NvbnN0IEw9eStQLFY9VCtQLEc9Y1tMXSxOdD1jW0wrM10sSHQ9Y1tWXSxxdD1jW1YrM107Y1tkK1BdPUc8SHQ/RzpIdCxjW2QrUCszXT1OdD5xdD9OdDpxdH1yZXR1cm4gQn19fWZ1bmN0aW9uIGNlKHIsdCxlLHMsbil7bGV0IGksbyxhLGMsdSxoO2NvbnN0IGw9MS9lLmRpcmVjdGlvbi54LGQ9MS9lLmRpcmVjdGlvbi55LGY9MS9lLmRpcmVjdGlvbi56LHA9ZS5vcmlnaW4ueCxtPWUub3JpZ2luLnksZz1lLm9yaWdpbi56O2xldCB5PXRbcl0sVD10W3IrM10sdz10W3IrMV0sTT10W3IrMysxXSxOPXRbcisyXSxfPXRbciszKzJdO3JldHVybiBsPj0wPyhpPSh5LXApKmwsbz0oVC1wKSpsKTooaT0oVC1wKSpsLG89KHktcCkqbCksZD49MD8oYT0ody1tKSpkLGM9KE0tbSkqZCk6KGE9KE0tbSkqZCxjPSh3LW0pKmQpLGk+Y3x8YT5vfHwoKGE+aXx8aXNOYU4oaSkpJiYoaT1hKSwoYzxvfHxpc05hTihvKSkmJihvPWMpLGY+PTA/KHU9KE4tZykqZixoPShfLWcpKmYpOih1PShfLWcpKmYsaD0oTi1nKSpmKSxpPmh8fHU+byk/ITE6KCh1Pml8fGkhPT1pKSYmKGk9dSksKGg8b3x8byE9PW8pJiYobz1oKSxpPD1uJiZvPj1zKX1mdW5jdGlvbiBkbChyLHQsZSxzLG4saSxvLGEpe2NvbnN0e2dlb21ldHJ5OmMsX2luZGlyZWN0QnVmZmVyOnV9PXI7Zm9yKGxldCBoPXMsbD1zK247aDxsO2grKyl7bGV0IGQ9dT91W2hdOmg7dW4oYyx0LGUsZCxpLG8sYSl9fWZ1bmN0aW9uIGZsKHIsdCxlLHMsbixpLG8pe2NvbnN0e2dlb21ldHJ5OmEsX2luZGlyZWN0QnVmZmVyOmN9PXI7bGV0IHU9MS8wLGg9bnVsbDtmb3IobGV0IGw9cyxkPXMrbjtsPGQ7bCsrKXtsZXQgZjtmPXVuKGEsdCxlLGM/Y1tsXTpsLG51bGwsaSxvKSxmJiZmLmRpc3RhbmNlPHUmJihoPWYsdT1mLmRpc3RhbmNlKX1yZXR1cm4gaH1mdW5jdGlvbiBwbChyLHQsZSxzLG4saSxvKXtjb25zdHtnZW9tZXRyeTphfT1lLHtpbmRleDpjfT1hLHU9YS5hdHRyaWJ1dGVzLnBvc2l0aW9uO2ZvcihsZXQgaD1yLGw9dCtyO2g8bDtoKyspe2xldCBkO2lmKGQ9ZS5yZXNvbHZlVHJpYW5nbGVJbmRleChoKSxzdChvLGQqMyxjLHUpLG8ubmVlZHNVcGRhdGU9ITAscyhvLGQsbixpKSlyZXR1cm4hMH1yZXR1cm4hMX1mdW5jdGlvbiBtbChyLHQsZSxzLG4saSxvKXtYLnNldEJ1ZmZlcihyLl9yb290c1t0XSksRWkoMCxyLGUscyxuLGksbyksWC5jbGVhckJ1ZmZlcigpfWZ1bmN0aW9uIEVpKHIsdCxlLHMsbixpLG8pe2NvbnN0e2Zsb2F0MzJBcnJheTphLHVpbnQxNkFycmF5OmMsdWludDMyQXJyYXk6dX09WCxoPXIqMjtpZihwdChoLGMpKXtjb25zdCBkPVR0KHIsdSksZj1TdChoLGMpO2NsKHQsZSxzLGQsZixuLGksbyl9ZWxzZXtjb25zdCBkPV90KHIpO2NlKGQsYSxzLGksbykmJkVpKGQsdCxlLHMsbixpLG8pO2NvbnN0IGY9enQocix1KTtjZShmLGEscyxpLG8pJiZFaShmLHQsZSxzLG4saSxvKX19Y29uc3QgeWw9WyJ4IiwieSIsInoiXTtmdW5jdGlvbiBnbChyLHQsZSxzLG4saSl7WC5zZXRCdWZmZXIoci5fcm9vdHNbdF0pO2NvbnN0IG89Q2koMCxyLGUscyxuLGkpO3JldHVybiBYLmNsZWFyQnVmZmVyKCksb31mdW5jdGlvbiBDaShyLHQsZSxzLG4saSl7Y29uc3R7ZmxvYXQzMkFycmF5Om8sdWludDE2QXJyYXk6YSx1aW50MzJBcnJheTpjfT1YO2xldCB1PXIqMjtpZihwdCh1LGEpKXtjb25zdCBsPVR0KHIsYyksZD1TdCh1LGEpO3JldHVybiBobCh0LGUscyxsLGQsbixpKX1lbHNle2NvbnN0IGw9VG8ocixjKSxkPXlsW2xdLHA9cy5kaXJlY3Rpb25bZF0+PTA7bGV0IG0sZztwPyhtPV90KHIpLGc9enQocixjKSk6KG09enQocixjKSxnPV90KHIpKTtjb25zdCBUPWNlKG0sbyxzLG4saSk/Q2kobSx0LGUscyxuLGkpOm51bGw7aWYoVCl7Y29uc3QgTj1ULnBvaW50W2RdO2lmKHA/Tjw9b1tnK2xdOk4+PW9bZytsKzNdKXJldHVybiBUfWNvbnN0IE09Y2UoZyxvLHMsbixpKT9DaShnLHQsZSxzLG4saSk6bnVsbDtyZXR1cm4gVCYmTT9ULmRpc3RhbmNlPD1NLmRpc3RhbmNlP1Q6TTpUfHxNfHxudWxsfX1jb25zdCBsbj1uZXcgaHQsa2U9bmV3IEx0LEhlPW5ldyBMdCxOcz1uZXcgbnQsX289bmV3IGx0LGRuPW5ldyBsdDtmdW5jdGlvbiB4bChyLHQsZSxzKXtYLnNldEJ1ZmZlcihyLl9yb290c1t0XSk7Y29uc3Qgbj1GaSgwLHIsZSxzKTtyZXR1cm4gWC5jbGVhckJ1ZmZlcigpLG59ZnVuY3Rpb24gRmkocix0LGUscyxuPW51bGwpe2NvbnN0e2Zsb2F0MzJBcnJheTppLHVpbnQxNkFycmF5Om8sdWludDMyQXJyYXk6YX09WDtsZXQgYz1yKjI7aWYobj09PW51bGwmJihlLmJvdW5kaW5nQm94fHxlLmNvbXB1dGVCb3VuZGluZ0JveCgpLF9vLnNldChlLmJvdW5kaW5nQm94Lm1pbixlLmJvdW5kaW5nQm94Lm1heCxzKSxuPV9vKSxwdChjLG8pKXtjb25zdCBoPXQuZ2VvbWV0cnksbD1oLmluZGV4LGQ9aC5hdHRyaWJ1dGVzLnBvc2l0aW9uLGY9ZS5pbmRleCxwPWUuYXR0cmlidXRlcy5wb3NpdGlvbixtPVR0KHIsYSksZz1TdChjLG8pO2lmKE5zLmNvcHkocykuaW52ZXJ0KCksZS5ib3VuZHNUcmVlKXJldHVybiBaKHIsaSxkbiksZG4ubWF0cml4LmNvcHkoTnMpLGRuLm5lZWRzVXBkYXRlPSEwLGUuYm91bmRzVHJlZS5zaGFwZWNhc3Qoe2ludGVyc2VjdHNCb3VuZHM6VD0+ZG4uaW50ZXJzZWN0c0JveChUKSxpbnRlcnNlY3RzVHJpYW5nbGU6VD0+e1QuYS5hcHBseU1hdHJpeDQocyksVC5iLmFwcGx5TWF0cml4NChzKSxULmMuYXBwbHlNYXRyaXg0KHMpLFQubmVlZHNVcGRhdGU9ITA7Zm9yKGxldCB3PW0qMyxNPShnK20pKjM7dzxNO3crPTMpaWYoc3QoSGUsdyxsLGQpLEhlLm5lZWRzVXBkYXRlPSEwLFQuaW50ZXJzZWN0c1RyaWFuZ2xlKEhlKSlyZXR1cm4hMDtyZXR1cm4hMX19KTtmb3IobGV0IHk9bSozLFQ9KGcrbSkqMzt5PFQ7eSs9Myl7c3Qoa2UseSxsLGQpLGtlLmEuYXBwbHlNYXRyaXg0KE5zKSxrZS5iLmFwcGx5TWF0cml4NChOcyksa2UuYy5hcHBseU1hdHJpeDQoTnMpLGtlLm5lZWRzVXBkYXRlPSEwO2ZvcihsZXQgdz0wLE09Zi5jb3VudDt3PE07dys9MylpZihzdChIZSx3LGYscCksSGUubmVlZHNVcGRhdGU9ITAsa2UuaW50ZXJzZWN0c1RyaWFuZ2xlKEhlKSlyZXR1cm4hMH19ZWxzZXtjb25zdCBoPXIrOCxsPWFbcis2XTtyZXR1cm4gWihoLGksbG4pLCEhKG4uaW50ZXJzZWN0c0JveChsbikmJkZpKGgsdCxlLHMsbil8fChaKGwsaSxsbiksbi5pbnRlcnNlY3RzQm94KGxuKSYmRmkobCx0LGUscyxuKSkpfX1jb25zdCBmbj1uZXcgbnQsUmk9bmV3IGx0LHdzPW5ldyBsdCxUbD1uZXcgQSxObD1uZXcgQSx3bD1uZXcgQSxBbD1uZXcgQTtmdW5jdGlvbiBNbChyLHQsZSxzPXt9LG49e30saT0wLG89MS8wKXt0LmJvdW5kaW5nQm94fHx0LmNvbXB1dGVCb3VuZGluZ0JveCgpLFJpLnNldCh0LmJvdW5kaW5nQm94Lm1pbix0LmJvdW5kaW5nQm94Lm1heCxlKSxSaS5uZWVkc1VwZGF0ZT0hMDtjb25zdCBhPXIuZ2VvbWV0cnksYz1hLmF0dHJpYnV0ZXMucG9zaXRpb24sdT1hLmluZGV4LGg9dC5hdHRyaWJ1dGVzLnBvc2l0aW9uLGw9dC5pbmRleCxkPWJ0LmdldFByaW1pdGl2ZSgpLGY9YnQuZ2V0UHJpbWl0aXZlKCk7bGV0IHA9VGwsbT1ObCxnPW51bGwseT1udWxsO24mJihnPXdsLHk9QWwpO2xldCBUPTEvMCx3PW51bGwsTT1udWxsO3JldHVybiBmbi5jb3B5KGUpLmludmVydCgpLHdzLm1hdHJpeC5jb3B5KGZuKSxyLnNoYXBlY2FzdCh7Ym91bmRzVHJhdmVyc2VPcmRlcjpOPT5SaS5kaXN0YW5jZVRvQm94KE4pLGludGVyc2VjdHNCb3VuZHM6KE4sXyxTKT0+UzxUJiZTPG8/KF8mJih3cy5taW4uY29weShOLm1pbiksd3MubWF4LmNvcHkoTi5tYXgpLHdzLm5lZWRzVXBkYXRlPSEwKSwhMCk6ITEsaW50ZXJzZWN0c1JhbmdlOihOLF8pPT57aWYodC5ib3VuZHNUcmVlKXJldHVybiB0LmJvdW5kc1RyZWUuc2hhcGVjYXN0KHtib3VuZHNUcmF2ZXJzZU9yZGVyOkU9PndzLmRpc3RhbmNlVG9Cb3goRSksaW50ZXJzZWN0c0JvdW5kczooRSxGLFIpPT5SPFQmJlI8byxpbnRlcnNlY3RzUmFuZ2U6KEUsRik9Pntmb3IobGV0IFI9RSxJPUUrRjtSPEk7UisrKXtzdChmLDMqUixsLGgpLGYuYS5hcHBseU1hdHJpeDQoZSksZi5iLmFwcGx5TWF0cml4NChlKSxmLmMuYXBwbHlNYXRyaXg0KGUpLGYubmVlZHNVcGRhdGU9ITA7Zm9yKGxldCBCPU4sUD1OK187QjxQO0IrKyl7c3QoZCwzKkIsdSxjKSxkLm5lZWRzVXBkYXRlPSEwO2NvbnN0IEw9ZC5kaXN0YW5jZVRvVHJpYW5nbGUoZixwLGcpO2lmKEw8VCYmKG0uY29weShwKSx5JiZ5LmNvcHkoZyksVD1MLHc9QixNPVIpLEw8aSlyZXR1cm4hMH19fX0pO3tjb25zdCBTPURlKHQpO2ZvcihsZXQgRT0wLEY9UztFPEY7RSsrKXtzdChmLDMqRSxsLGgpLGYuYS5hcHBseU1hdHJpeDQoZSksZi5iLmFwcGx5TWF0cml4NChlKSxmLmMuYXBwbHlNYXRyaXg0KGUpLGYubmVlZHNVcGRhdGU9ITA7Zm9yKGxldCBSPU4sST1OK187UjxJO1IrKyl7c3QoZCwzKlIsdSxjKSxkLm5lZWRzVXBkYXRlPSEwO2NvbnN0IEI9ZC5kaXN0YW5jZVRvVHJpYW5nbGUoZixwLGcpO2lmKEI8VCYmKG0uY29weShwKSx5JiZ5LmNvcHkoZyksVD1CLHc9UixNPUUpLEI8aSlyZXR1cm4hMH19fX19KSxidC5yZWxlYXNlUHJpbWl0aXZlKGQpLGJ0LnJlbGVhc2VQcmltaXRpdmUoZiksVD09PTEvMD9udWxsOihzLnBvaW50P3MucG9pbnQuY29weShtKTpzLnBvaW50PW0uY2xvbmUoKSxzLmRpc3RhbmNlPVQscy5mYWNlSW5kZXg9dyxuJiYobi5wb2ludD9uLnBvaW50LmNvcHkoeSk6bi5wb2ludD15LmNsb25lKCksbi5wb2ludC5hcHBseU1hdHJpeDQoZm4pLG0uYXBwbHlNYXRyaXg0KGZuKSxuLmRpc3RhbmNlPW0uc3ViKG4ucG9pbnQpLmxlbmd0aCgpLG4uZmFjZUluZGV4PU0pLHMpfWZ1bmN0aW9uIFNsKHIsdD1udWxsKXt0JiZBcnJheS5pc0FycmF5KHQpJiYodD1uZXcgU2V0KHQpKTtjb25zdCBlPXIuZ2VvbWV0cnkscz1lLmluZGV4P2UuaW5kZXguYXJyYXk6bnVsbCxuPWUuYXR0cmlidXRlcy5wb3NpdGlvbjtsZXQgaSxvLGEsYyx1PTA7Y29uc3QgaD1yLl9yb290cztmb3IobGV0IGQ9MCxmPWgubGVuZ3RoO2Q8ZjtkKyspaT1oW2RdLG89bmV3IFVpbnQzMkFycmF5KGkpLGE9bmV3IFVpbnQxNkFycmF5KGkpLGM9bmV3IEZsb2F0MzJBcnJheShpKSxsKDAsdSksdSs9aS5ieXRlTGVuZ3RoO2Z1bmN0aW9uIGwoZCxmLHA9ITEpe2NvbnN0IG09ZCoyO2lmKGFbbSsxNV09PT1lbil7Y29uc3QgeT1vW2QrNl0sVD1hW20rMTRdO2xldCB3PTEvMCxNPTEvMCxOPTEvMCxfPS0xLzAsUz0tMS8wLEU9LTEvMDtmb3IobGV0IEY9eSxSPXkrVDtGPFI7RisrKXtjb25zdCBJPTMqci5yZXNvbHZlVHJpYW5nbGVJbmRleChGKTtmb3IobGV0IEI9MDtCPDM7QisrKXtsZXQgUD1JK0I7UD1zP3NbUF06UDtjb25zdCBMPW4uZ2V0WChQKSxWPW4uZ2V0WShQKSxHPW4uZ2V0WihQKTtMPHcmJih3PUwpLEw+XyYmKF89TCksVjxNJiYoTT1WKSxWPlMmJihTPVYpLEc8TiYmKE49RyksRz5FJiYoRT1HKX19cmV0dXJuIGNbZCswXSE9PXd8fGNbZCsxXSE9PU18fGNbZCsyXSE9PU58fGNbZCszXSE9PV98fGNbZCs0XSE9PVN8fGNbZCs1XSE9PUU/KGNbZCswXT13LGNbZCsxXT1NLGNbZCsyXT1OLGNbZCszXT1fLGNbZCs0XT1TLGNbZCs1XT1FLCEwKTohMX1lbHNle2NvbnN0IHk9ZCs4LFQ9b1tkKzZdLHc9eStmLE09VCtmO2xldCBOPXAsXz0hMSxTPSExO3Q/Tnx8KF89dC5oYXModyksUz10LmhhcyhNKSxOPSFfJiYhUyk6KF89ITAsUz0hMCk7Y29uc3QgRT1OfHxfLEY9Tnx8UztsZXQgUj0hMTtFJiYoUj1sKHksZixOKSk7bGV0IEk9ITE7RiYmKEk9bChULGYsTikpO2NvbnN0IEI9Unx8STtpZihCKWZvcihsZXQgUD0wO1A8MztQKyspe2NvbnN0IEw9eStQLFY9VCtQLEc9Y1tMXSxOdD1jW0wrM10sSHQ9Y1tWXSxxdD1jW1YrM107Y1tkK1BdPUc8SHQ/RzpIdCxjW2QrUCszXT1OdD5xdD9OdDpxdH1yZXR1cm4gQn19fWZ1bmN0aW9uIF9sKHIsdCxlLHMsbixpLG8pe1guc2V0QnVmZmVyKHIuX3Jvb3RzW3RdKSxCaSgwLHIsZSxzLG4saSxvKSxYLmNsZWFyQnVmZmVyKCl9ZnVuY3Rpb24gQmkocix0LGUscyxuLGksbyl7Y29uc3R7ZmxvYXQzMkFycmF5OmEsdWludDE2QXJyYXk6Yyx1aW50MzJBcnJheTp1fT1YLGg9cioyO2lmKHB0KGgsYykpe2NvbnN0IGQ9VHQocix1KSxmPVN0KGgsYyk7ZGwodCxlLHMsZCxmLG4saSxvKX1lbHNle2NvbnN0IGQ9X3Qocik7Y2UoZCxhLHMsaSxvKSYmQmkoZCx0LGUscyxuLGksbyk7Y29uc3QgZj16dChyLHUpO2NlKGYsYSxzLGksbykmJkJpKGYsdCxlLHMsbixpLG8pfX1jb25zdCB6bD1bIngiLCJ5IiwieiJdO2Z1bmN0aW9uIGJsKHIsdCxlLHMsbixpKXtYLnNldEJ1ZmZlcihyLl9yb290c1t0XSk7Y29uc3Qgbz1JaSgwLHIsZSxzLG4saSk7cmV0dXJuIFguY2xlYXJCdWZmZXIoKSxvfWZ1bmN0aW9uIElpKHIsdCxlLHMsbixpKXtjb25zdHtmbG9hdDMyQXJyYXk6byx1aW50MTZBcnJheTphLHVpbnQzMkFycmF5OmN9PVg7bGV0IHU9cioyO2lmKHB0KHUsYSkpe2NvbnN0IGw9VHQocixjKSxkPVN0KHUsYSk7cmV0dXJuIGZsKHQsZSxzLGwsZCxuLGkpfWVsc2V7Y29uc3QgbD1UbyhyLGMpLGQ9emxbbF0scD1zLmRpcmVjdGlvbltkXT49MDtsZXQgbSxnO3A/KG09X3QociksZz16dChyLGMpKToobT16dChyLGMpLGc9X3QocikpO2NvbnN0IFQ9Y2UobSxvLHMsbixpKT9JaShtLHQsZSxzLG4saSk6bnVsbDtpZihUKXtjb25zdCBOPVQucG9pbnRbZF07aWYocD9OPD1vW2crbF06Tj49b1tnK2wrM10pcmV0dXJuIFR9Y29uc3QgTT1jZShnLG8scyxuLGkpP0lpKGcsdCxlLHMsbixpKTpudWxsO3JldHVybiBUJiZNP1QuZGlzdGFuY2U8PU0uZGlzdGFuY2U/VDpNOlR8fE18fG51bGx9fWNvbnN0IHBuPW5ldyBodCxxZT1uZXcgTHQsJGU9bmV3IEx0LEFzPW5ldyBudCx6bz1uZXcgbHQsbW49bmV3IGx0O2Z1bmN0aW9uIEVsKHIsdCxlLHMpe1guc2V0QnVmZmVyKHIuX3Jvb3RzW3RdKTtjb25zdCBuPXZpKDAscixlLHMpO3JldHVybiBYLmNsZWFyQnVmZmVyKCksbn1mdW5jdGlvbiB2aShyLHQsZSxzLG49bnVsbCl7Y29uc3R7ZmxvYXQzMkFycmF5OmksdWludDE2QXJyYXk6byx1aW50MzJBcnJheTphfT1YO2xldCBjPXIqMjtpZihuPT09bnVsbCYmKGUuYm91bmRpbmdCb3h8fGUuY29tcHV0ZUJvdW5kaW5nQm94KCksem8uc2V0KGUuYm91bmRpbmdCb3gubWluLGUuYm91bmRpbmdCb3gubWF4LHMpLG49em8pLHB0KGMsbykpe2NvbnN0IGg9dC5nZW9tZXRyeSxsPWguaW5kZXgsZD1oLmF0dHJpYnV0ZXMucG9zaXRpb24sZj1lLmluZGV4LHA9ZS5hdHRyaWJ1dGVzLnBvc2l0aW9uLG09VHQocixhKSxnPVN0KGMsbyk7aWYoQXMuY29weShzKS5pbnZlcnQoKSxlLmJvdW5kc1RyZWUpcmV0dXJuIFoocixpLG1uKSxtbi5tYXRyaXguY29weShBcyksbW4ubmVlZHNVcGRhdGU9ITAsZS5ib3VuZHNUcmVlLnNoYXBlY2FzdCh7aW50ZXJzZWN0c0JvdW5kczpUPT5tbi5pbnRlcnNlY3RzQm94KFQpLGludGVyc2VjdHNUcmlhbmdsZTpUPT57VC5hLmFwcGx5TWF0cml4NChzKSxULmIuYXBwbHlNYXRyaXg0KHMpLFQuYy5hcHBseU1hdHJpeDQocyksVC5uZWVkc1VwZGF0ZT0hMDtmb3IobGV0IHc9bSxNPWcrbTt3PE07dysrKWlmKHN0KCRlLDMqdC5yZXNvbHZlVHJpYW5nbGVJbmRleCh3KSxsLGQpLCRlLm5lZWRzVXBkYXRlPSEwLFQuaW50ZXJzZWN0c1RyaWFuZ2xlKCRlKSlyZXR1cm4hMDtyZXR1cm4hMX19KTtmb3IobGV0IHk9bSxUPWcrbTt5PFQ7eSsrKXtjb25zdCB3PXQucmVzb2x2ZVRyaWFuZ2xlSW5kZXgoeSk7c3QocWUsMyp3LGwsZCkscWUuYS5hcHBseU1hdHJpeDQoQXMpLHFlLmIuYXBwbHlNYXRyaXg0KEFzKSxxZS5jLmFwcGx5TWF0cml4NChBcykscWUubmVlZHNVcGRhdGU9ITA7Zm9yKGxldCBNPTAsTj1mLmNvdW50O008TjtNKz0zKWlmKHN0KCRlLE0sZixwKSwkZS5uZWVkc1VwZGF0ZT0hMCxxZS5pbnRlcnNlY3RzVHJpYW5nbGUoJGUpKXJldHVybiEwfX1lbHNle2NvbnN0IGg9cis4LGw9YVtyKzZdO3JldHVybiBaKGgsaSxwbiksISEobi5pbnRlcnNlY3RzQm94KHBuKSYmdmkoaCx0LGUscyxuKXx8KFoobCxpLHBuKSxuLmludGVyc2VjdHNCb3gocG4pJiZ2aShsLHQsZSxzLG4pKSl9fWNvbnN0IHluPW5ldyBudCxQaT1uZXcgbHQsTXM9bmV3IGx0LENsPW5ldyBBLEZsPW5ldyBBLFJsPW5ldyBBLEJsPW5ldyBBO2Z1bmN0aW9uIElsKHIsdCxlLHM9e30sbj17fSxpPTAsbz0xLzApe3QuYm91bmRpbmdCb3h8fHQuY29tcHV0ZUJvdW5kaW5nQm94KCksUGkuc2V0KHQuYm91bmRpbmdCb3gubWluLHQuYm91bmRpbmdCb3gubWF4LGUpLFBpLm5lZWRzVXBkYXRlPSEwO2NvbnN0IGE9ci5nZW9tZXRyeSxjPWEuYXR0cmlidXRlcy5wb3NpdGlvbix1PWEuaW5kZXgsaD10LmF0dHJpYnV0ZXMucG9zaXRpb24sbD10LmluZGV4LGQ9YnQuZ2V0UHJpbWl0aXZlKCksZj1idC5nZXRQcmltaXRpdmUoKTtsZXQgcD1DbCxtPUZsLGc9bnVsbCx5PW51bGw7biYmKGc9UmwseT1CbCk7bGV0IFQ9MS8wLHc9bnVsbCxNPW51bGw7cmV0dXJuIHluLmNvcHkoZSkuaW52ZXJ0KCksTXMubWF0cml4LmNvcHkoeW4pLHIuc2hhcGVjYXN0KHtib3VuZHNUcmF2ZXJzZU9yZGVyOk49PlBpLmRpc3RhbmNlVG9Cb3goTiksaW50ZXJzZWN0c0JvdW5kczooTixfLFMpPT5TPFQmJlM8bz8oXyYmKE1zLm1pbi5jb3B5KE4ubWluKSxNcy5tYXguY29weShOLm1heCksTXMubmVlZHNVcGRhdGU9ITApLCEwKTohMSxpbnRlcnNlY3RzUmFuZ2U6KE4sXyk9PntpZih0LmJvdW5kc1RyZWUpe2NvbnN0IFM9dC5ib3VuZHNUcmVlO3JldHVybiBTLnNoYXBlY2FzdCh7Ym91bmRzVHJhdmVyc2VPcmRlcjpFPT5Ncy5kaXN0YW5jZVRvQm94KEUpLGludGVyc2VjdHNCb3VuZHM6KEUsRixSKT0+UjxUJiZSPG8saW50ZXJzZWN0c1JhbmdlOihFLEYpPT57Zm9yKGxldCBSPUUsST1FK0Y7UjxJO1IrKyl7Y29uc3QgQj1TLnJlc29sdmVUcmlhbmdsZUluZGV4KFIpO3N0KGYsMypCLGwsaCksZi5hLmFwcGx5TWF0cml4NChlKSxmLmIuYXBwbHlNYXRyaXg0KGUpLGYuYy5hcHBseU1hdHJpeDQoZSksZi5uZWVkc1VwZGF0ZT0hMDtmb3IobGV0IFA9TixMPU4rXztQPEw7UCsrKXtjb25zdCBWPXIucmVzb2x2ZVRyaWFuZ2xlSW5kZXgoUCk7c3QoZCwzKlYsdSxjKSxkLm5lZWRzVXBkYXRlPSEwO2NvbnN0IEc9ZC5kaXN0YW5jZVRvVHJpYW5nbGUoZixwLGcpO2lmKEc8VCYmKG0uY29weShwKSx5JiZ5LmNvcHkoZyksVD1HLHc9UCxNPVIpLEc8aSlyZXR1cm4hMH19fX0pfWVsc2V7Y29uc3QgUz1EZSh0KTtmb3IobGV0IEU9MCxGPVM7RTxGO0UrKyl7c3QoZiwzKkUsbCxoKSxmLmEuYXBwbHlNYXRyaXg0KGUpLGYuYi5hcHBseU1hdHJpeDQoZSksZi5jLmFwcGx5TWF0cml4NChlKSxmLm5lZWRzVXBkYXRlPSEwO2ZvcihsZXQgUj1OLEk9TitfO1I8STtSKyspe2NvbnN0IEI9ci5yZXNvbHZlVHJpYW5nbGVJbmRleChSKTtzdChkLDMqQix1LGMpLGQubmVlZHNVcGRhdGU9ITA7Y29uc3QgUD1kLmRpc3RhbmNlVG9UcmlhbmdsZShmLHAsZyk7aWYoUDxUJiYobS5jb3B5KHApLHkmJnkuY29weShnKSxUPVAsdz1SLE09RSksUDxpKXJldHVybiEwfX19fX0pLGJ0LnJlbGVhc2VQcmltaXRpdmUoZCksYnQucmVsZWFzZVByaW1pdGl2ZShmKSxUPT09MS8wP251bGw6KHMucG9pbnQ/cy5wb2ludC5jb3B5KG0pOnMucG9pbnQ9bS5jbG9uZSgpLHMuZGlzdGFuY2U9VCxzLmZhY2VJbmRleD13LG4mJihuLnBvaW50P24ucG9pbnQuY29weSh5KTpuLnBvaW50PXkuY2xvbmUoKSxuLnBvaW50LmFwcGx5TWF0cml4NCh5biksbS5hcHBseU1hdHJpeDQoeW4pLG4uZGlzdGFuY2U9bS5zdWIobi5wb2ludCkubGVuZ3RoKCksbi5mYWNlSW5kZXg9TSkscyl9ZnVuY3Rpb24gdmwoKXtyZXR1cm4gdHlwZW9mIFNoYXJlZEFycmF5QnVmZmVyPCJ1In1jb25zdCBTcz1uZXcgWC5jb25zdHJ1Y3Rvcixnbj1uZXcgWC5jb25zdHJ1Y3RvcixoZT1uZXcgX2koKCk9Pm5ldyBodCksR2U9bmV3IGh0LFdlPW5ldyBodCxMaT1uZXcgaHQsT2k9bmV3IGh0O2xldCBEaT0hMTtmdW5jdGlvbiBQbChyLHQsZSxzKXtpZihEaSl0aHJvdyBuZXcgRXJyb3IoIk1lc2hCVkg6IFJlY3Vyc2l2ZSBjYWxscyB0byBidmhjYXN0IG5vdCBzdXBwb3J0ZWQuIik7RGk9ITA7Y29uc3Qgbj1yLl9yb290cyxpPXQuX3Jvb3RzO2xldCBvLGE9MCxjPTA7Y29uc3QgdT1uZXcgbnQoKS5jb3B5KGUpLmludmVydCgpO2ZvcihsZXQgaD0wLGw9bi5sZW5ndGg7aDxsO2grKyl7U3Muc2V0QnVmZmVyKG5baF0pLGM9MDtjb25zdCBkPWhlLmdldFByaW1pdGl2ZSgpO1ooMCxTcy5mbG9hdDMyQXJyYXksZCksZC5hcHBseU1hdHJpeDQodSk7Zm9yKGxldCBmPTAscD1pLmxlbmd0aDtmPHAmJihnbi5zZXRCdWZmZXIoaVtmXSksbz1PdCgwLDAsZSx1LHMsYSxjLDAsMCxkKSxnbi5jbGVhckJ1ZmZlcigpLGMrPWlbZl0ubGVuZ3RoLCFvKTtmKyspO2lmKGhlLnJlbGVhc2VQcmltaXRpdmUoZCksU3MuY2xlYXJCdWZmZXIoKSxhKz1uW2hdLmxlbmd0aCxvKWJyZWFrfXJldHVybiBEaT0hMSxvfWZ1bmN0aW9uIE90KHIsdCxlLHMsbixpPTAsbz0wLGE9MCxjPTAsdT1udWxsLGg9ITEpe2xldCBsLGQ7aD8obD1nbixkPVNzKToobD1TcyxkPWduKTtjb25zdCBmPWwuZmxvYXQzMkFycmF5LHA9bC51aW50MzJBcnJheSxtPWwudWludDE2QXJyYXksZz1kLmZsb2F0MzJBcnJheSx5PWQudWludDMyQXJyYXksVD1kLnVpbnQxNkFycmF5LHc9cioyLE09dCoyLE49cHQodyxtKSxfPXB0KE0sVCk7bGV0IFM9ITE7aWYoXyYmTiloP1M9bihUdCh0LHkpLFN0KHQqMixUKSxUdChyLHApLFN0KHIqMixtKSxjLG8rdCxhLGkrcik6Uz1uKFR0KHIscCksU3QocioyLG0pLFR0KHQseSksU3QodCoyLFQpLGEsaStyLGMsbyt0KTtlbHNlIGlmKF8pe2NvbnN0IEU9aGUuZ2V0UHJpbWl0aXZlKCk7Wih0LGcsRSksRS5hcHBseU1hdHJpeDQoZSk7Y29uc3QgRj1fdChyKSxSPXp0KHIscCk7WihGLGYsR2UpLFooUixmLFdlKTtjb25zdCBJPUUuaW50ZXJzZWN0c0JveChHZSksQj1FLmludGVyc2VjdHNCb3goV2UpO1M9SSYmT3QodCxGLHMsZSxuLG8saSxjLGErMSxFLCFoKXx8QiYmT3QodCxSLHMsZSxuLG8saSxjLGErMSxFLCFoKSxoZS5yZWxlYXNlUHJpbWl0aXZlKEUpfWVsc2V7Y29uc3QgRT1fdCh0KSxGPXp0KHQseSk7WihFLGcsTGkpLFooRixnLE9pKTtjb25zdCBSPXUuaW50ZXJzZWN0c0JveChMaSksST11LmludGVyc2VjdHNCb3goT2kpO2lmKFImJkkpUz1PdChyLEUsZSxzLG4saSxvLGEsYysxLHUsaCl8fE90KHIsRixlLHMsbixpLG8sYSxjKzEsdSxoKTtlbHNlIGlmKFIpaWYoTilTPU90KHIsRSxlLHMsbixpLG8sYSxjKzEsdSxoKTtlbHNle2NvbnN0IEI9aGUuZ2V0UHJpbWl0aXZlKCk7Qi5jb3B5KExpKS5hcHBseU1hdHJpeDQoZSk7Y29uc3QgUD1fdChyKSxMPXp0KHIscCk7WihQLGYsR2UpLFooTCxmLFdlKTtjb25zdCBWPUIuaW50ZXJzZWN0c0JveChHZSksRz1CLmludGVyc2VjdHNCb3goV2UpO1M9ViYmT3QoRSxQLHMsZSxuLG8saSxjLGErMSxCLCFoKXx8RyYmT3QoRSxMLHMsZSxuLG8saSxjLGErMSxCLCFoKSxoZS5yZWxlYXNlUHJpbWl0aXZlKEIpfWVsc2UgaWYoSSlpZihOKVM9T3QocixGLGUscyxuLGksbyxhLGMrMSx1LGgpO2Vsc2V7Y29uc3QgQj1oZS5nZXRQcmltaXRpdmUoKTtCLmNvcHkoT2kpLmFwcGx5TWF0cml4NChlKTtjb25zdCBQPV90KHIpLEw9enQocixwKTtaKFAsZixHZSksWihMLGYsV2UpO2NvbnN0IFY9Qi5pbnRlcnNlY3RzQm94KEdlKSxHPUIuaW50ZXJzZWN0c0JveChXZSk7Uz1WJiZPdChGLFAscyxlLG4sbyxpLGMsYSsxLEIsIWgpfHxHJiZPdChGLEwscyxlLG4sbyxpLGMsYSsxLEIsIWgpLGhlLnJlbGVhc2VQcmltaXRpdmUoQil9fXJldHVybiBTfWNvbnN0IHhuPW5ldyBsdCxibz1uZXcgaHQsTGw9e3N0cmF0ZWd5OnVvLG1heERlcHRoOjQwLG1heExlYWZUcmlzOjEwLHVzZVNoYXJlZEFycmF5QnVmZmVyOiExLHNldEJvdW5kaW5nQm94OiEwLG9uUHJvZ3Jlc3M6bnVsbCxpbmRpcmVjdDohMSx2ZXJib3NlOiEwLHJhbmdlOm51bGx9O2NsYXNzIFRue3N0YXRpYyBzZXJpYWxpemUodCxlPXt9KXtlPXtjbG9uZUJ1ZmZlcnM6ITAsLi4uZX07Y29uc3Qgcz10Lmdlb21ldHJ5LG49dC5fcm9vdHMsaT10Ll9pbmRpcmVjdEJ1ZmZlcixvPXMuZ2V0SW5kZXgoKTtsZXQgYTtyZXR1cm4gZS5jbG9uZUJ1ZmZlcnM/YT17cm9vdHM6bi5tYXAoYz0+Yy5zbGljZSgpKSxpbmRleDpvP28uYXJyYXkuc2xpY2UoKTpudWxsLGluZGlyZWN0QnVmZmVyOmk/aS5zbGljZSgpOm51bGx9OmE9e3Jvb3RzOm4saW5kZXg6bz9vLmFycmF5Om51bGwsaW5kaXJlY3RCdWZmZXI6aX0sYX1zdGF0aWMgZGVzZXJpYWxpemUodCxlLHM9e30pe3M9e3NldEluZGV4OiEwLGluZGlyZWN0OiEhdC5pbmRpcmVjdEJ1ZmZlciwuLi5zfTtjb25zdHtpbmRleDpuLHJvb3RzOmksaW5kaXJlY3RCdWZmZXI6b309dCxhPW5ldyBUbihlLHsuLi5zLFt4aV06ITB9KTtpZihhLl9yb290cz1pLGEuX2luZGlyZWN0QnVmZmVyPW98fG51bGwscy5zZXRJbmRleCl7Y29uc3QgYz1lLmdldEluZGV4KCk7aWYoYz09PW51bGwpe2NvbnN0IHU9bmV3IHZ0KHQuaW5kZXgsMSwhMSk7ZS5zZXRJbmRleCh1KX1lbHNlIGMuYXJyYXkhPT1uJiYoYy5hcnJheS5zZXQobiksYy5uZWVkc1VwZGF0ZT0hMCl9cmV0dXJuIGF9Z2V0IGluZGlyZWN0KCl7cmV0dXJuISF0aGlzLl9pbmRpcmVjdEJ1ZmZlcn1jb25zdHJ1Y3Rvcih0LGU9e30pe2lmKHQuaXNCdWZmZXJHZW9tZXRyeSl7aWYodC5pbmRleCYmdC5pbmRleC5pc0ludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlKXRocm93IG5ldyBFcnJvcigiTWVzaEJWSDogSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUgaXMgbm90IHN1cHBvcnRlZCBmb3IgdGhlIGluZGV4IGF0dHJpYnV0ZS4iKX1lbHNlIHRocm93IG5ldyBFcnJvcigiTWVzaEJWSDogT25seSBCdWZmZXJHZW9tZXRyaWVzIGFyZSBzdXBwb3J0ZWQuIik7aWYoZT1PYmplY3QuYXNzaWduKHsuLi5MbCxbeGldOiExfSxlKSxlLnVzZVNoYXJlZEFycmF5QnVmZmVyJiYhdmwoKSl0aHJvdyBuZXcgRXJyb3IoIk1lc2hCVkg6IFNoYXJlZEFycmF5QnVmZmVyIGlzIG5vdCBhdmFpbGFibGUuIik7dGhpcy5nZW9tZXRyeT10LHRoaXMuX3Jvb3RzPW51bGwsdGhpcy5faW5kaXJlY3RCdWZmZXI9bnVsbCxlW3hpXXx8KGp1KHRoaXMsZSksIXQuYm91bmRpbmdCb3gmJmUuc2V0Qm91bmRpbmdCb3gmJih0LmJvdW5kaW5nQm94PXRoaXMuZ2V0Qm91bmRpbmdCb3gobmV3IGh0KSkpLHRoaXMucmVzb2x2ZVRyaWFuZ2xlSW5kZXg9ZS5pbmRpcmVjdD9zPT50aGlzLl9pbmRpcmVjdEJ1ZmZlcltzXTpzPT5zfXJlZml0KHQ9bnVsbCl7cmV0dXJuKHRoaXMuaW5kaXJlY3Q/U2w6bGwpKHRoaXMsdCl9dHJhdmVyc2UodCxlPTApe2NvbnN0IHM9dGhpcy5fcm9vdHNbZV0sbj1uZXcgVWludDMyQXJyYXkocyksaT1uZXcgVWludDE2QXJyYXkocyk7bygwKTtmdW5jdGlvbiBvKGEsYz0wKXtjb25zdCB1PWEqMixoPWlbdSsxNV09PT1lbjtpZihoKXtjb25zdCBsPW5bYSs2XSxkPWlbdSsxNF07dChjLGgsbmV3IEZsb2F0MzJBcnJheShzLGEqNCw2KSxsLGQpfWVsc2V7Y29uc3QgbD1hK21zLzQsZD1uW2ErNl0sZj1uW2ErN107dChjLGgsbmV3IEZsb2F0MzJBcnJheShzLGEqNCw2KSxmKXx8KG8obCxjKzEpLG8oZCxjKzEpKX19fXJheWNhc3QodCxlPVZpLHM9MCxuPTEvMCl7Y29uc3QgaT10aGlzLl9yb290cyxvPXRoaXMuZ2VvbWV0cnksYT1bXSxjPWUuaXNNYXRlcmlhbCx1PUFycmF5LmlzQXJyYXkoZSksaD1vLmdyb3VwcyxsPWM/ZS5zaWRlOmUsZD10aGlzLmluZGlyZWN0P19sOm1sO2ZvcihsZXQgZj0wLHA9aS5sZW5ndGg7ZjxwO2YrKyl7Y29uc3QgbT11P2VbaFtmXS5tYXRlcmlhbEluZGV4XS5zaWRlOmwsZz1hLmxlbmd0aDtpZihkKHRoaXMsZixtLHQsYSxzLG4pLHUpe2NvbnN0IHk9aFtmXS5tYXRlcmlhbEluZGV4O2ZvcihsZXQgVD1nLHc9YS5sZW5ndGg7VDx3O1QrKylhW1RdLmZhY2UubWF0ZXJpYWxJbmRleD15fX1yZXR1cm4gYX1yYXljYXN0Rmlyc3QodCxlPVZpLHM9MCxuPTEvMCl7Y29uc3QgaT10aGlzLl9yb290cyxvPXRoaXMuZ2VvbWV0cnksYT1lLmlzTWF0ZXJpYWwsYz1BcnJheS5pc0FycmF5KGUpO2xldCB1PW51bGw7Y29uc3QgaD1vLmdyb3VwcyxsPWE/ZS5zaWRlOmUsZD10aGlzLmluZGlyZWN0P2JsOmdsO2ZvcihsZXQgZj0wLHA9aS5sZW5ndGg7ZjxwO2YrKyl7Y29uc3QgbT1jP2VbaFtmXS5tYXRlcmlhbEluZGV4XS5zaWRlOmwsZz1kKHRoaXMsZixtLHQscyxuKTtnIT1udWxsJiYodT09bnVsbHx8Zy5kaXN0YW5jZTx1LmRpc3RhbmNlKSYmKHU9ZyxjJiYoZy5mYWNlLm1hdGVyaWFsSW5kZXg9aFtmXS5tYXRlcmlhbEluZGV4KSl9cmV0dXJuIHV9aW50ZXJzZWN0c0dlb21ldHJ5KHQsZSl7bGV0IHM9ITE7Y29uc3Qgbj10aGlzLl9yb290cyxpPXRoaXMuaW5kaXJlY3Q/RWw6eGw7Zm9yKGxldCBvPTAsYT1uLmxlbmd0aDtvPGEmJihzPWkodGhpcyxvLHQsZSksIXMpO28rKyk7cmV0dXJuIHN9c2hhcGVjYXN0KHQpe2NvbnN0IGU9YnQuZ2V0UHJpbWl0aXZlKCkscz10aGlzLmluZGlyZWN0P3BsOnVsO2xldHtib3VuZHNUcmF2ZXJzZU9yZGVyOm4saW50ZXJzZWN0c0JvdW5kczppLGludGVyc2VjdHNSYW5nZTpvLGludGVyc2VjdHNUcmlhbmdsZTphfT10O2lmKG8mJmEpe2NvbnN0IGw9bztvPShkLGYscCxtLGcpPT5sKGQsZixwLG0sZyk/ITA6cyhkLGYsdGhpcyxhLHAsbSxlKX1lbHNlIG98fChhP289KGwsZCxmLHApPT5zKGwsZCx0aGlzLGEsZixwLGUpOm89KGwsZCxmKT0+Zik7bGV0IGM9ITEsdT0wO2NvbnN0IGg9dGhpcy5fcm9vdHM7Zm9yKGxldCBsPTAsZD1oLmxlbmd0aDtsPGQ7bCsrKXtjb25zdCBmPWhbbF07aWYoYz1ubCh0aGlzLGwsaSxvLG4sdSksYylicmVhazt1Kz1mLmJ5dGVMZW5ndGh9cmV0dXJuIGJ0LnJlbGVhc2VQcmltaXRpdmUoZSksY31idmhjYXN0KHQsZSxzKXtsZXR7aW50ZXJzZWN0c1JhbmdlczpuLGludGVyc2VjdHNUcmlhbmdsZXM6aX09cztjb25zdCBvPWJ0LmdldFByaW1pdGl2ZSgpLGE9dGhpcy5nZW9tZXRyeS5pbmRleCxjPXRoaXMuZ2VvbWV0cnkuYXR0cmlidXRlcy5wb3NpdGlvbix1PXRoaXMuaW5kaXJlY3Q/cD0+e2NvbnN0IG09dGhpcy5yZXNvbHZlVHJpYW5nbGVJbmRleChwKTtzdChvLG0qMyxhLGMpfTpwPT57c3QobyxwKjMsYSxjKX0saD1idC5nZXRQcmltaXRpdmUoKSxsPXQuZ2VvbWV0cnkuaW5kZXgsZD10Lmdlb21ldHJ5LmF0dHJpYnV0ZXMucG9zaXRpb24sZj10LmluZGlyZWN0P3A9Pntjb25zdCBtPXQucmVzb2x2ZVRyaWFuZ2xlSW5kZXgocCk7c3QoaCxtKjMsbCxkKX06cD0+e3N0KGgscCozLGwsZCl9O2lmKGkpe2NvbnN0IHA9KG0sZyx5LFQsdyxNLE4sXyk9Pntmb3IobGV0IFM9eSxFPXkrVDtTPEU7UysrKXtmKFMpLGguYS5hcHBseU1hdHJpeDQoZSksaC5iLmFwcGx5TWF0cml4NChlKSxoLmMuYXBwbHlNYXRyaXg0KGUpLGgubmVlZHNVcGRhdGU9ITA7Zm9yKGxldCBGPW0sUj1tK2c7RjxSO0YrKylpZih1KEYpLG8ubmVlZHNVcGRhdGU9ITAsaShvLGgsRixTLHcsTSxOLF8pKXJldHVybiEwfXJldHVybiExfTtpZihuKXtjb25zdCBtPW47bj1mdW5jdGlvbihnLHksVCx3LE0sTixfLFMpe3JldHVybiBtKGcseSxULHcsTSxOLF8sUyk/ITA6cChnLHksVCx3LE0sTixfLFMpfX1lbHNlIG49cH1yZXR1cm4gUGwodGhpcyx0LGUsbil9aW50ZXJzZWN0c0JveCh0LGUpe3JldHVybiB4bi5zZXQodC5taW4sdC5tYXgsZSkseG4ubmVlZHNVcGRhdGU9ITAsdGhpcy5zaGFwZWNhc3Qoe2ludGVyc2VjdHNCb3VuZHM6cz0+eG4uaW50ZXJzZWN0c0JveChzKSxpbnRlcnNlY3RzVHJpYW5nbGU6cz0+eG4uaW50ZXJzZWN0c1RyaWFuZ2xlKHMpfSl9aW50ZXJzZWN0c1NwaGVyZSh0KXtyZXR1cm4gdGhpcy5zaGFwZWNhc3Qoe2ludGVyc2VjdHNCb3VuZHM6ZT0+dC5pbnRlcnNlY3RzQm94KGUpLGludGVyc2VjdHNUcmlhbmdsZTplPT5lLmludGVyc2VjdHNTcGhlcmUodCl9KX1jbG9zZXN0UG9pbnRUb0dlb21ldHJ5KHQsZSxzPXt9LG49e30saT0wLG89MS8wKXtyZXR1cm4odGhpcy5pbmRpcmVjdD9JbDpNbCkodGhpcyx0LGUscyxuLGksbyl9Y2xvc2VzdFBvaW50VG9Qb2ludCh0LGU9e30scz0wLG49MS8wKXtyZXR1cm4gaWwodGhpcyx0LGUscyxuKX1nZXRCb3VuZGluZ0JveCh0KXtyZXR1cm4gdC5tYWtlRW1wdHkoKSx0aGlzLl9yb290cy5mb3JFYWNoKHM9PntaKDAsbmV3IEZsb2F0MzJBcnJheShzKSxibyksdC51bmlvbihibyl9KSx0fX1vbm1lc3NhZ2U9KHtkYXRhOnJ9KT0+e2xldCB0PXBlcmZvcm1hbmNlLm5vdygpO2Z1bmN0aW9uIGUobyl7bz1NYXRoLm1pbihvLDEpO2NvbnN0IGE9cGVyZm9ybWFuY2Uubm93KCk7YS10Pj0xMCYmbyE9PTEmJihwb3N0TWVzc2FnZSh7ZXJyb3I6bnVsbCxzZXJpYWxpemVkOm51bGwscG9zaXRpb246bnVsbCxwcm9ncmVzczpvfSksdD1hKX1jb25zdHtpbmRleDpzLHBvc2l0aW9uOm4sb3B0aW9uczppfT1yO3RyeXtjb25zdCBvPW5ldyBHbjtpZihvLnNldEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyB2dChuLDMsITEpKSxzJiZvLnNldEluZGV4KG5ldyB2dChzLDEsITEpKSxpLmluY2x1ZGVkUHJvZ3Jlc3NDYWxsYmFjayYmKGkub25Qcm9ncmVzcz1lKSxpLmdyb3Vwcyl7Y29uc3QgaD1pLmdyb3Vwcztmb3IoY29uc3QgbCBpbiBoKXtjb25zdCBkPWhbbF07by5hZGRHcm91cChkLnN0YXJ0LGQuY291bnQsZC5tYXRlcmlhbEluZGV4KX19Y29uc3QgYT1uZXcgVG4obyxpKSxjPVRuLnNlcmlhbGl6ZShhLHtjb3B5SW5kZXhCdWZmZXI6ITF9KTtsZXQgdT1bbi5idWZmZXIsLi4uYy5yb290c107Yy5pbmRleCYmdS5wdXNoKGMuaW5kZXguYnVmZmVyKSx1PXUuZmlsdGVyKGg9PnR5cGVvZiBTaGFyZWRBcnJheUJ1ZmZlcj4idSJ8fCEoaCBpbnN0YW5jZW9mIFNoYXJlZEFycmF5QnVmZmVyKSksYS5faW5kaXJlY3RCdWZmZXImJnUucHVzaChjLmluZGlyZWN0QnVmZmVyLmJ1ZmZlcikscG9zdE1lc3NhZ2Uoe2Vycm9yOm51bGwsc2VyaWFsaXplZDpjLHBvc2l0aW9uOm4scHJvZ3Jlc3M6MX0sdSl9Y2F0Y2gobyl7cG9zdE1lc3NhZ2Uoe2Vycm9yOm8sc2VyaWFsaXplZDpudWxsLHBvc2l0aW9uOm51bGwscHJvZ3Jlc3M6MX0pfX19KSgpOwo=",Vl=typeof window<"u"&&window.Blob&&new Blob([atob(Xl)],{type:"text/javascript;charset=utf-8"});function wu(){let n;try{if(n=Vl&&(window.URL||window.webkitURL).createObjectURL(Vl),!n)throw"";return new Worker(n)}catch{return new Worker("data:application/javascript;base64,"+Xl)}finally{n&&(window.URL||window.webkitURL).revokeObjectURL(n)}}export{dr as $,Bi as B,Qt as C,wl as M,Ls as P,v as R,Do as S,En as T,Ce as V,Pu as W,ko as a,je as b,Ad as c,Dd as d,U as e,Nl as f,wu as g,xt as h,xc as i,oh as j,Uu as k,Uc as m,Hc as v};
1605
+ `,Uu=Object.freeze(Object.defineProperty({__proto__:null,AVERAGE:Kr,BVHShaderGLSL:ku,CENTER:lo,CONTAINED:co,ExtendedTriangle:He,FloatVertexAttributeTexture:ll,INTERSECTED:rh,IntVertexAttributeTexture:Wu,MeshBVH:xt,MeshBVHHelper:Io,MeshBVHUniformStruct:gu,NOT_INTERSECTED:ah,OrientedBox:Xe,SAH:Mr,StaticGeometryGenerator:Hu,UIntVertexAttributeTexture:rl,VertexAttributeTexture:ys,acceleratedRaycast:Gu,computeBatchedBoundsTree:Lu,computeBoundsTree:Vu,disposeBatchedBoundsTree:xu,disposeBoundsTree:Ru,estimateMemoryInBytes:hu,getBVHExtremes:du,getJSONStructure:pu,getTriangleHitPointInfo:Mh,shaderDistanceFunction:Iu,shaderIntersectFunction:Ju,shaderStructs:Nu,validateBounds:uu},Symbol.toStringTag,{value:"Module"}));class Pu{constructor(e){this.name="WorkerBase",this.running=!1,this.worker=e,this.worker.onerror=t=>{throw t.message?new Error(`${this.name}: Could not create Web Worker with error "${t.message}"`):new Error(`${this.name}: Could not create Web Worker.`)}}runTask(){}generate(...e){if(this.running)throw new Error("GenerateMeshBVHWorker: Already running job.");if(this.worker===null)throw new Error("GenerateMeshBVHWorker: Worker has been disposed.");this.running=!0;const t=this.runTask(this.worker,...e);return t.finally(()=>{this.running=!1}),t}dispose(){this.worker.terminate(),this.worker=null}}const Xl="KGZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiO3ZhciBBbj10eXBlb2YgZG9jdW1lbnQ8InUiP2RvY3VtZW50LmN1cnJlbnRTY3JpcHQ6bnVsbDsvKioKICogQGxpY2Vuc2UKICogQ29weXJpZ2h0IDIwMTAtMjAyNCBUaHJlZS5qcyBBdXRob3JzCiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVQKICovY29uc3QgWGU9IjE2OSIsVmk9MCxVaT0xLEVvPTIsTW49MCxraT0zMDAsQ289MzAxLEZvPTMwMixIaT0xZTMsX3M9MTAwMSxxaT0xMDAyLHpzPTEwMDMsJGk9MTAwNixHaT0xMDA4LFJvPTEwMDksQm89MTAxMyxXaT0xMDE0LElvPTEwMTUsdm89MTAxNixQbz0xMDIwLExvPTEwMjMsU249MTAyNixYaT0xMDI3LFlpPTAsT289MSxicz0iIiwkdD0ic3JnYiIsRXM9InNyZ2ItbGluZWFyIixEbz0iZGlzcGxheS1wMyIsWmk9ImRpc3BsYXktcDMtbGluZWFyIixfbj0ibGluZWFyIixKaT0ic3JnYiIsamk9InJlYzcwOSIsUWk9InAzIixDcz0zNTA0NCxZZT0yZTMsem49MjAwMTtjbGFzcyBaZXthZGRFdmVudExpc3RlbmVyKHQsZSl7dGhpcy5fbGlzdGVuZXJzPT09dm9pZCAwJiYodGhpcy5fbGlzdGVuZXJzPXt9KTtjb25zdCBzPXRoaXMuX2xpc3RlbmVycztzW3RdPT09dm9pZCAwJiYoc1t0XT1bXSksc1t0XS5pbmRleE9mKGUpPT09LTEmJnNbdF0ucHVzaChlKX1oYXNFdmVudExpc3RlbmVyKHQsZSl7aWYodGhpcy5fbGlzdGVuZXJzPT09dm9pZCAwKXJldHVybiExO2NvbnN0IHM9dGhpcy5fbGlzdGVuZXJzO3JldHVybiBzW3RdIT09dm9pZCAwJiZzW3RdLmluZGV4T2YoZSkhPT0tMX1yZW1vdmVFdmVudExpc3RlbmVyKHQsZSl7aWYodGhpcy5fbGlzdGVuZXJzPT09dm9pZCAwKXJldHVybjtjb25zdCBuPXRoaXMuX2xpc3RlbmVyc1t0XTtpZihuIT09dm9pZCAwKXtjb25zdCBpPW4uaW5kZXhPZihlKTtpIT09LTEmJm4uc3BsaWNlKGksMSl9fWRpc3BhdGNoRXZlbnQodCl7aWYodGhpcy5fbGlzdGVuZXJzPT09dm9pZCAwKXJldHVybjtjb25zdCBzPXRoaXMuX2xpc3RlbmVyc1t0LnR5cGVdO2lmKHMhPT12b2lkIDApe3QudGFyZ2V0PXRoaXM7Y29uc3Qgbj1zLnNsaWNlKDApO2ZvcihsZXQgaT0wLG89bi5sZW5ndGg7aTxvO2krKyluW2ldLmNhbGwodGhpcyx0KTt0LnRhcmdldD1udWxsfX19Y29uc3Qgb3Q9WyIwMCIsIjAxIiwiMDIiLCIwMyIsIjA0IiwiMDUiLCIwNiIsIjA3IiwiMDgiLCIwOSIsIjBhIiwiMGIiLCIwYyIsIjBkIiwiMGUiLCIwZiIsIjEwIiwiMTEiLCIxMiIsIjEzIiwiMTQiLCIxNSIsIjE2IiwiMTciLCIxOCIsIjE5IiwiMWEiLCIxYiIsIjFjIiwiMWQiLCIxZSIsIjFmIiwiMjAiLCIyMSIsIjIyIiwiMjMiLCIyNCIsIjI1IiwiMjYiLCIyNyIsIjI4IiwiMjkiLCIyYSIsIjJiIiwiMmMiLCIyZCIsIjJlIiwiMmYiLCIzMCIsIjMxIiwiMzIiLCIzMyIsIjM0IiwiMzUiLCIzNiIsIjM3IiwiMzgiLCIzOSIsIjNhIiwiM2IiLCIzYyIsIjNkIiwiM2UiLCIzZiIsIjQwIiwiNDEiLCI0MiIsIjQzIiwiNDQiLCI0NSIsIjQ2IiwiNDciLCI0OCIsIjQ5IiwiNGEiLCI0YiIsIjRjIiwiNGQiLCI0ZSIsIjRmIiwiNTAiLCI1MSIsIjUyIiwiNTMiLCI1NCIsIjU1IiwiNTYiLCI1NyIsIjU4IiwiNTkiLCI1YSIsIjViIiwiNWMiLCI1ZCIsIjVlIiwiNWYiLCI2MCIsIjYxIiwiNjIiLCI2MyIsIjY0IiwiNjUiLCI2NiIsIjY3IiwiNjgiLCI2OSIsIjZhIiwiNmIiLCI2YyIsIjZkIiwiNmUiLCI2ZiIsIjcwIiwiNzEiLCI3MiIsIjczIiwiNzQiLCI3NSIsIjc2IiwiNzciLCI3OCIsIjc5IiwiN2EiLCI3YiIsIjdjIiwiN2QiLCI3ZSIsIjdmIiwiODAiLCI4MSIsIjgyIiwiODMiLCI4NCIsIjg1IiwiODYiLCI4NyIsIjg4IiwiODkiLCI4YSIsIjhiIiwiOGMiLCI4ZCIsIjhlIiwiOGYiLCI5MCIsIjkxIiwiOTIiLCI5MyIsIjk0IiwiOTUiLCI5NiIsIjk3IiwiOTgiLCI5OSIsIjlhIiwiOWIiLCI5YyIsIjlkIiwiOWUiLCI5ZiIsImEwIiwiYTEiLCJhMiIsImEzIiwiYTQiLCJhNSIsImE2IiwiYTciLCJhOCIsImE5IiwiYWEiLCJhYiIsImFjIiwiYWQiLCJhZSIsImFmIiwiYjAiLCJiMSIsImIyIiwiYjMiLCJiNCIsImI1IiwiYjYiLCJiNyIsImI4IiwiYjkiLCJiYSIsImJiIiwiYmMiLCJiZCIsImJlIiwiYmYiLCJjMCIsImMxIiwiYzIiLCJjMyIsImM0IiwiYzUiLCJjNiIsImM3IiwiYzgiLCJjOSIsImNhIiwiY2IiLCJjYyIsImNkIiwiY2UiLCJjZiIsImQwIiwiZDEiLCJkMiIsImQzIiwiZDQiLCJkNSIsImQ2IiwiZDciLCJkOCIsImQ5IiwiZGEiLCJkYiIsImRjIiwiZGQiLCJkZSIsImRmIiwiZTAiLCJlMSIsImUyIiwiZTMiLCJlNCIsImU1IiwiZTYiLCJlNyIsImU4IiwiZTkiLCJlYSIsImViIiwiZWMiLCJlZCIsImVlIiwiZWYiLCJmMCIsImYxIiwiZjIiLCJmMyIsImY0IiwiZjUiLCJmNiIsImY3IiwiZjgiLCJmOSIsImZhIiwiZmIiLCJmYyIsImZkIiwiZmUiLCJmZiJdO2xldCBLaT0xMjM0NTY3O2NvbnN0IHRyPU1hdGguUEkvMTgwLGVyPTE4MC9NYXRoLlBJO2Z1bmN0aW9uIEt0KCl7Y29uc3Qgcj1NYXRoLnJhbmRvbSgpKjQyOTQ5NjcyOTV8MCx0PU1hdGgucmFuZG9tKCkqNDI5NDk2NzI5NXwwLGU9TWF0aC5yYW5kb20oKSo0Mjk0OTY3Mjk1fDAscz1NYXRoLnJhbmRvbSgpKjQyOTQ5NjcyOTV8MDtyZXR1cm4ob3RbciYyNTVdK290W3I+PjgmMjU1XStvdFtyPj4xNiYyNTVdK290W3I+PjI0JjI1NV0rIi0iK290W3QmMjU1XStvdFt0Pj44JjI1NV0rIi0iK290W3Q+PjE2JjE1fDY0XStvdFt0Pj4yNCYyNTVdKyItIitvdFtlJjYzfDEyOF0rb3RbZT4+OCYyNTVdKyItIitvdFtlPj4xNiYyNTVdK290W2U+PjI0JjI1NV0rb3RbcyYyNTVdK290W3M+PjgmMjU1XStvdFtzPj4xNiYyNTVdK290W3M+PjI0JjI1NV0pLnRvTG93ZXJDYXNlKCl9ZnVuY3Rpb24gYXQocix0LGUpe3JldHVybiBNYXRoLm1heCh0LE1hdGgubWluKGUscikpfWZ1bmN0aW9uIGJuKHIsdCl7cmV0dXJuKHIldCt0KSV0fWZ1bmN0aW9uIFZvKHIsdCxlLHMsbil7cmV0dXJuIHMrKHItdCkqKG4tcykvKGUtdCl9ZnVuY3Rpb24gVW8ocix0LGUpe3JldHVybiByIT09dD8oZS1yKS8odC1yKTowfWZ1bmN0aW9uIEplKHIsdCxlKXtyZXR1cm4oMS1lKSpyK2UqdH1mdW5jdGlvbiBrbyhyLHQsZSxzKXtyZXR1cm4gSmUocix0LDEtTWF0aC5leHAoLWUqcykpfWZ1bmN0aW9uIEhvKHIsdD0xKXtyZXR1cm4gdC1NYXRoLmFicyhibihyLHQqMiktdCl9ZnVuY3Rpb24gcW8ocix0LGUpe3JldHVybiByPD10PzA6cj49ZT8xOihyPShyLXQpLyhlLXQpLHIqciooMy0yKnIpKX1mdW5jdGlvbiAkbyhyLHQsZSl7cmV0dXJuIHI8PXQ/MDpyPj1lPzE6KHI9KHItdCkvKGUtdCkscipyKnIqKHIqKHIqNi0xNSkrMTApKX1mdW5jdGlvbiBHbyhyLHQpe3JldHVybiByK01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSoodC1yKzEpKX1mdW5jdGlvbiBXbyhyLHQpe3JldHVybiByK01hdGgucmFuZG9tKCkqKHQtcil9ZnVuY3Rpb24gWG8ocil7cmV0dXJuIHIqKC41LU1hdGgucmFuZG9tKCkpfWZ1bmN0aW9uIFlvKHIpe3IhPT12b2lkIDAmJihLaT1yKTtsZXQgdD1LaSs9MTgzMTU2NTgxMztyZXR1cm4gdD1NYXRoLmltdWwodF50Pj4+MTUsdHwxKSx0Xj10K01hdGguaW11bCh0XnQ+Pj43LHR8NjEpLCgodF50Pj4+MTQpPj4+MCkvNDI5NDk2NzI5Nn1mdW5jdGlvbiBabyhyKXtyZXR1cm4gcip0cn1mdW5jdGlvbiBKbyhyKXtyZXR1cm4gciplcn1mdW5jdGlvbiBqbyhyKXtyZXR1cm4ociZyLTEpPT09MCYmciE9PTB9ZnVuY3Rpb24gUW8ocil7cmV0dXJuIE1hdGgucG93KDIsTWF0aC5jZWlsKE1hdGgubG9nKHIpL01hdGguTE4yKSl9ZnVuY3Rpb24gS28ocil7cmV0dXJuIE1hdGgucG93KDIsTWF0aC5mbG9vcihNYXRoLmxvZyhyKS9NYXRoLkxOMikpfWZ1bmN0aW9uIHRhKHIsdCxlLHMsbil7Y29uc3QgaT1NYXRoLmNvcyxvPU1hdGguc2luLGE9aShlLzIpLGM9byhlLzIpLHU9aSgodCtzKS8yKSxoPW8oKHQrcykvMiksbD1pKCh0LXMpLzIpLGQ9bygodC1zKS8yKSxmPWkoKHMtdCkvMikscD1vKChzLXQpLzIpO3N3aXRjaChuKXtjYXNlIlhZWCI6ci5zZXQoYSpoLGMqbCxjKmQsYSp1KTticmVhaztjYXNlIllaWSI6ci5zZXQoYypkLGEqaCxjKmwsYSp1KTticmVhaztjYXNlIlpYWiI6ci5zZXQoYypsLGMqZCxhKmgsYSp1KTticmVhaztjYXNlIlhaWCI6ci5zZXQoYSpoLGMqcCxjKmYsYSp1KTticmVhaztjYXNlIllYWSI6ci5zZXQoYypmLGEqaCxjKnAsYSp1KTticmVhaztjYXNlIlpZWiI6ci5zZXQoYypwLGMqZixhKmgsYSp1KTticmVhaztkZWZhdWx0OmNvbnNvbGUud2FybigiVEhSRUUuTWF0aFV0aWxzOiAuc2V0UXVhdGVybmlvbkZyb21Qcm9wZXJFdWxlcigpIGVuY291bnRlcmVkIGFuIHVua25vd24gb3JkZXI6ICIrbil9fWZ1bmN0aW9uIEV0KHIsdCl7c3dpdGNoKHQuY29uc3RydWN0b3Ipe2Nhc2UgRmxvYXQzMkFycmF5OnJldHVybiByO2Nhc2UgVWludDMyQXJyYXk6cmV0dXJuIHIvNDI5NDk2NzI5NTtjYXNlIFVpbnQxNkFycmF5OnJldHVybiByLzY1NTM1O2Nhc2UgVWludDhBcnJheTpyZXR1cm4gci8yNTU7Y2FzZSBJbnQzMkFycmF5OnJldHVybiBNYXRoLm1heChyLzIxNDc0ODM2NDcsLTEpO2Nhc2UgSW50MTZBcnJheTpyZXR1cm4gTWF0aC5tYXgoci8zMjc2NywtMSk7Y2FzZSBJbnQ4QXJyYXk6cmV0dXJuIE1hdGgubWF4KHIvMTI3LC0xKTtkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiSW52YWxpZCBjb21wb25lbnQgdHlwZS4iKX19ZnVuY3Rpb24gJChyLHQpe3N3aXRjaCh0LmNvbnN0cnVjdG9yKXtjYXNlIEZsb2F0MzJBcnJheTpyZXR1cm4gcjtjYXNlIFVpbnQzMkFycmF5OnJldHVybiBNYXRoLnJvdW5kKHIqNDI5NDk2NzI5NSk7Y2FzZSBVaW50MTZBcnJheTpyZXR1cm4gTWF0aC5yb3VuZChyKjY1NTM1KTtjYXNlIFVpbnQ4QXJyYXk6cmV0dXJuIE1hdGgucm91bmQocioyNTUpO2Nhc2UgSW50MzJBcnJheTpyZXR1cm4gTWF0aC5yb3VuZChyKjIxNDc0ODM2NDcpO2Nhc2UgSW50MTZBcnJheTpyZXR1cm4gTWF0aC5yb3VuZChyKjMyNzY3KTtjYXNlIEludDhBcnJheTpyZXR1cm4gTWF0aC5yb3VuZChyKjEyNyk7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgY29tcG9uZW50IHR5cGUuIil9fWNvbnN0IGVhPXtERUcyUkFEOnRyLFJBRDJERUc6ZXIsZ2VuZXJhdGVVVUlEOkt0LGNsYW1wOmF0LGV1Y2xpZGVhbk1vZHVsbzpibixtYXBMaW5lYXI6Vm8saW52ZXJzZUxlcnA6VW8sbGVycDpKZSxkYW1wOmtvLHBpbmdwb25nOkhvLHNtb290aHN0ZXA6cW8sc21vb3RoZXJzdGVwOiRvLHJhbmRJbnQ6R28scmFuZEZsb2F0OldvLHJhbmRGbG9hdFNwcmVhZDpYbyxzZWVkZWRSYW5kb206WW8sZGVnVG9SYWQ6Wm8scmFkVG9EZWc6Sm8saXNQb3dlck9mVHdvOmpvLGNlaWxQb3dlck9mVHdvOlFvLGZsb29yUG93ZXJPZlR3bzpLbyxzZXRRdWF0ZXJuaW9uRnJvbVByb3BlckV1bGVyOnRhLG5vcm1hbGl6ZTokLGRlbm9ybWFsaXplOkV0fTtjbGFzcyBKe2NvbnN0cnVjdG9yKHQ9MCxlPTApe0oucHJvdG90eXBlLmlzVmVjdG9yMj0hMCx0aGlzLng9dCx0aGlzLnk9ZX1nZXQgd2lkdGgoKXtyZXR1cm4gdGhpcy54fXNldCB3aWR0aCh0KXt0aGlzLng9dH1nZXQgaGVpZ2h0KCl7cmV0dXJuIHRoaXMueX1zZXQgaGVpZ2h0KHQpe3RoaXMueT10fXNldCh0LGUpe3JldHVybiB0aGlzLng9dCx0aGlzLnk9ZSx0aGlzfXNldFNjYWxhcih0KXtyZXR1cm4gdGhpcy54PXQsdGhpcy55PXQsdGhpc31zZXRYKHQpe3JldHVybiB0aGlzLng9dCx0aGlzfXNldFkodCl7cmV0dXJuIHRoaXMueT10LHRoaXN9c2V0Q29tcG9uZW50KHQsZSl7c3dpdGNoKHQpe2Nhc2UgMDp0aGlzLng9ZTticmVhaztjYXNlIDE6dGhpcy55PWU7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoImluZGV4IGlzIG91dCBvZiByYW5nZTogIit0KX1yZXR1cm4gdGhpc31nZXRDb21wb25lbnQodCl7c3dpdGNoKHQpe2Nhc2UgMDpyZXR1cm4gdGhpcy54O2Nhc2UgMTpyZXR1cm4gdGhpcy55O2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJpbmRleCBpcyBvdXQgb2YgcmFuZ2U6ICIrdCl9fWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMueCx0aGlzLnkpfWNvcHkodCl7cmV0dXJuIHRoaXMueD10LngsdGhpcy55PXQueSx0aGlzfWFkZCh0KXtyZXR1cm4gdGhpcy54Kz10LngsdGhpcy55Kz10LnksdGhpc31hZGRTY2FsYXIodCl7cmV0dXJuIHRoaXMueCs9dCx0aGlzLnkrPXQsdGhpc31hZGRWZWN0b3JzKHQsZSl7cmV0dXJuIHRoaXMueD10LngrZS54LHRoaXMueT10LnkrZS55LHRoaXN9YWRkU2NhbGVkVmVjdG9yKHQsZSl7cmV0dXJuIHRoaXMueCs9dC54KmUsdGhpcy55Kz10LnkqZSx0aGlzfXN1Yih0KXtyZXR1cm4gdGhpcy54LT10LngsdGhpcy55LT10LnksdGhpc31zdWJTY2FsYXIodCl7cmV0dXJuIHRoaXMueC09dCx0aGlzLnktPXQsdGhpc31zdWJWZWN0b3JzKHQsZSl7cmV0dXJuIHRoaXMueD10LngtZS54LHRoaXMueT10LnktZS55LHRoaXN9bXVsdGlwbHkodCl7cmV0dXJuIHRoaXMueCo9dC54LHRoaXMueSo9dC55LHRoaXN9bXVsdGlwbHlTY2FsYXIodCl7cmV0dXJuIHRoaXMueCo9dCx0aGlzLnkqPXQsdGhpc31kaXZpZGUodCl7cmV0dXJuIHRoaXMueC89dC54LHRoaXMueS89dC55LHRoaXN9ZGl2aWRlU2NhbGFyKHQpe3JldHVybiB0aGlzLm11bHRpcGx5U2NhbGFyKDEvdCl9YXBwbHlNYXRyaXgzKHQpe2NvbnN0IGU9dGhpcy54LHM9dGhpcy55LG49dC5lbGVtZW50cztyZXR1cm4gdGhpcy54PW5bMF0qZStuWzNdKnMrbls2XSx0aGlzLnk9blsxXSplK25bNF0qcytuWzddLHRoaXN9bWluKHQpe3JldHVybiB0aGlzLng9TWF0aC5taW4odGhpcy54LHQueCksdGhpcy55PU1hdGgubWluKHRoaXMueSx0LnkpLHRoaXN9bWF4KHQpe3JldHVybiB0aGlzLng9TWF0aC5tYXgodGhpcy54LHQueCksdGhpcy55PU1hdGgubWF4KHRoaXMueSx0LnkpLHRoaXN9Y2xhbXAodCxlKXtyZXR1cm4gdGhpcy54PU1hdGgubWF4KHQueCxNYXRoLm1pbihlLngsdGhpcy54KSksdGhpcy55PU1hdGgubWF4KHQueSxNYXRoLm1pbihlLnksdGhpcy55KSksdGhpc31jbGFtcFNjYWxhcih0LGUpe3JldHVybiB0aGlzLng9TWF0aC5tYXgodCxNYXRoLm1pbihlLHRoaXMueCkpLHRoaXMueT1NYXRoLm1heCh0LE1hdGgubWluKGUsdGhpcy55KSksdGhpc31jbGFtcExlbmd0aCh0LGUpe2NvbnN0IHM9dGhpcy5sZW5ndGgoKTtyZXR1cm4gdGhpcy5kaXZpZGVTY2FsYXIoc3x8MSkubXVsdGlwbHlTY2FsYXIoTWF0aC5tYXgodCxNYXRoLm1pbihlLHMpKSl9Zmxvb3IoKXtyZXR1cm4gdGhpcy54PU1hdGguZmxvb3IodGhpcy54KSx0aGlzLnk9TWF0aC5mbG9vcih0aGlzLnkpLHRoaXN9Y2VpbCgpe3JldHVybiB0aGlzLng9TWF0aC5jZWlsKHRoaXMueCksdGhpcy55PU1hdGguY2VpbCh0aGlzLnkpLHRoaXN9cm91bmQoKXtyZXR1cm4gdGhpcy54PU1hdGgucm91bmQodGhpcy54KSx0aGlzLnk9TWF0aC5yb3VuZCh0aGlzLnkpLHRoaXN9cm91bmRUb1plcm8oKXtyZXR1cm4gdGhpcy54PU1hdGgudHJ1bmModGhpcy54KSx0aGlzLnk9TWF0aC50cnVuYyh0aGlzLnkpLHRoaXN9bmVnYXRlKCl7cmV0dXJuIHRoaXMueD0tdGhpcy54LHRoaXMueT0tdGhpcy55LHRoaXN9ZG90KHQpe3JldHVybiB0aGlzLngqdC54K3RoaXMueSp0Lnl9Y3Jvc3ModCl7cmV0dXJuIHRoaXMueCp0LnktdGhpcy55KnQueH1sZW5ndGhTcSgpe3JldHVybiB0aGlzLngqdGhpcy54K3RoaXMueSp0aGlzLnl9bGVuZ3RoKCl7cmV0dXJuIE1hdGguc3FydCh0aGlzLngqdGhpcy54K3RoaXMueSp0aGlzLnkpfW1hbmhhdHRhbkxlbmd0aCgpe3JldHVybiBNYXRoLmFicyh0aGlzLngpK01hdGguYWJzKHRoaXMueSl9bm9ybWFsaXplKCl7cmV0dXJuIHRoaXMuZGl2aWRlU2NhbGFyKHRoaXMubGVuZ3RoKCl8fDEpfWFuZ2xlKCl7cmV0dXJuIE1hdGguYXRhbjIoLXRoaXMueSwtdGhpcy54KStNYXRoLlBJfWFuZ2xlVG8odCl7Y29uc3QgZT1NYXRoLnNxcnQodGhpcy5sZW5ndGhTcSgpKnQubGVuZ3RoU3EoKSk7aWYoZT09PTApcmV0dXJuIE1hdGguUEkvMjtjb25zdCBzPXRoaXMuZG90KHQpL2U7cmV0dXJuIE1hdGguYWNvcyhhdChzLC0xLDEpKX1kaXN0YW5jZVRvKHQpe3JldHVybiBNYXRoLnNxcnQodGhpcy5kaXN0YW5jZVRvU3F1YXJlZCh0KSl9ZGlzdGFuY2VUb1NxdWFyZWQodCl7Y29uc3QgZT10aGlzLngtdC54LHM9dGhpcy55LXQueTtyZXR1cm4gZSplK3Mqc31tYW5oYXR0YW5EaXN0YW5jZVRvKHQpe3JldHVybiBNYXRoLmFicyh0aGlzLngtdC54KStNYXRoLmFicyh0aGlzLnktdC55KX1zZXRMZW5ndGgodCl7cmV0dXJuIHRoaXMubm9ybWFsaXplKCkubXVsdGlwbHlTY2FsYXIodCl9bGVycCh0LGUpe3JldHVybiB0aGlzLngrPSh0LngtdGhpcy54KSplLHRoaXMueSs9KHQueS10aGlzLnkpKmUsdGhpc31sZXJwVmVjdG9ycyh0LGUscyl7cmV0dXJuIHRoaXMueD10LngrKGUueC10LngpKnMsdGhpcy55PXQueSsoZS55LXQueSkqcyx0aGlzfWVxdWFscyh0KXtyZXR1cm4gdC54PT09dGhpcy54JiZ0Lnk9PT10aGlzLnl9ZnJvbUFycmF5KHQsZT0wKXtyZXR1cm4gdGhpcy54PXRbZV0sdGhpcy55PXRbZSsxXSx0aGlzfXRvQXJyYXkodD1bXSxlPTApe3JldHVybiB0W2VdPXRoaXMueCx0W2UrMV09dGhpcy55LHR9ZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0LGUpe3JldHVybiB0aGlzLng9dC5nZXRYKGUpLHRoaXMueT10LmdldFkoZSksdGhpc31yb3RhdGVBcm91bmQodCxlKXtjb25zdCBzPU1hdGguY29zKGUpLG49TWF0aC5zaW4oZSksaT10aGlzLngtdC54LG89dGhpcy55LXQueTtyZXR1cm4gdGhpcy54PWkqcy1vKm4rdC54LHRoaXMueT1pKm4rbypzK3QueSx0aGlzfXJhbmRvbSgpe3JldHVybiB0aGlzLng9TWF0aC5yYW5kb20oKSx0aGlzLnk9TWF0aC5yYW5kb20oKSx0aGlzfSpbU3ltYm9sLml0ZXJhdG9yXSgpe3lpZWxkIHRoaXMueCx5aWVsZCB0aGlzLnl9fWNsYXNzIEN0e2NvbnN0cnVjdG9yKHQsZSxzLG4saSxvLGEsYyx1KXtDdC5wcm90b3R5cGUuaXNNYXRyaXgzPSEwLHRoaXMuZWxlbWVudHM9WzEsMCwwLDAsMSwwLDAsMCwxXSx0IT09dm9pZCAwJiZ0aGlzLnNldCh0LGUscyxuLGksbyxhLGMsdSl9c2V0KHQsZSxzLG4saSxvLGEsYyx1KXtjb25zdCBoPXRoaXMuZWxlbWVudHM7cmV0dXJuIGhbMF09dCxoWzFdPW4saFsyXT1hLGhbM109ZSxoWzRdPWksaFs1XT1jLGhbNl09cyxoWzddPW8saFs4XT11LHRoaXN9aWRlbnRpdHkoKXtyZXR1cm4gdGhpcy5zZXQoMSwwLDAsMCwxLDAsMCwwLDEpLHRoaXN9Y29weSh0KXtjb25zdCBlPXRoaXMuZWxlbWVudHMscz10LmVsZW1lbnRzO3JldHVybiBlWzBdPXNbMF0sZVsxXT1zWzFdLGVbMl09c1syXSxlWzNdPXNbM10sZVs0XT1zWzRdLGVbNV09c1s1XSxlWzZdPXNbNl0sZVs3XT1zWzddLGVbOF09c1s4XSx0aGlzfWV4dHJhY3RCYXNpcyh0LGUscyl7cmV0dXJuIHQuc2V0RnJvbU1hdHJpeDNDb2x1bW4odGhpcywwKSxlLnNldEZyb21NYXRyaXgzQ29sdW1uKHRoaXMsMSkscy5zZXRGcm9tTWF0cml4M0NvbHVtbih0aGlzLDIpLHRoaXN9c2V0RnJvbU1hdHJpeDQodCl7Y29uc3QgZT10LmVsZW1lbnRzO3JldHVybiB0aGlzLnNldChlWzBdLGVbNF0sZVs4XSxlWzFdLGVbNV0sZVs5XSxlWzJdLGVbNl0sZVsxMF0pLHRoaXN9bXVsdGlwbHkodCl7cmV0dXJuIHRoaXMubXVsdGlwbHlNYXRyaWNlcyh0aGlzLHQpfXByZW11bHRpcGx5KHQpe3JldHVybiB0aGlzLm11bHRpcGx5TWF0cmljZXModCx0aGlzKX1tdWx0aXBseU1hdHJpY2VzKHQsZSl7Y29uc3Qgcz10LmVsZW1lbnRzLG49ZS5lbGVtZW50cyxpPXRoaXMuZWxlbWVudHMsbz1zWzBdLGE9c1szXSxjPXNbNl0sdT1zWzFdLGg9c1s0XSxsPXNbN10sZD1zWzJdLGY9c1s1XSxwPXNbOF0sbT1uWzBdLGc9blszXSx5PW5bNl0sVD1uWzFdLHc9bls0XSxNPW5bN10sTj1uWzJdLF89bls1XSxTPW5bOF07cmV0dXJuIGlbMF09byptK2EqVCtjKk4saVszXT1vKmcrYSp3K2MqXyxpWzZdPW8qeSthKk0rYypTLGlbMV09dSptK2gqVCtsKk4saVs0XT11KmcraCp3K2wqXyxpWzddPXUqeStoKk0rbCpTLGlbMl09ZCptK2YqVCtwKk4saVs1XT1kKmcrZip3K3AqXyxpWzhdPWQqeStmKk0rcCpTLHRoaXN9bXVsdGlwbHlTY2FsYXIodCl7Y29uc3QgZT10aGlzLmVsZW1lbnRzO3JldHVybiBlWzBdKj10LGVbM10qPXQsZVs2XSo9dCxlWzFdKj10LGVbNF0qPXQsZVs3XSo9dCxlWzJdKj10LGVbNV0qPXQsZVs4XSo9dCx0aGlzfWRldGVybWluYW50KCl7Y29uc3QgdD10aGlzLmVsZW1lbnRzLGU9dFswXSxzPXRbMV0sbj10WzJdLGk9dFszXSxvPXRbNF0sYT10WzVdLGM9dFs2XSx1PXRbN10saD10WzhdO3JldHVybiBlKm8qaC1lKmEqdS1zKmkqaCtzKmEqYytuKmkqdS1uKm8qY31pbnZlcnQoKXtjb25zdCB0PXRoaXMuZWxlbWVudHMsZT10WzBdLHM9dFsxXSxuPXRbMl0saT10WzNdLG89dFs0XSxhPXRbNV0sYz10WzZdLHU9dFs3XSxoPXRbOF0sbD1oKm8tYSp1LGQ9YSpjLWgqaSxmPXUqaS1vKmMscD1lKmwrcypkK24qZjtpZihwPT09MClyZXR1cm4gdGhpcy5zZXQoMCwwLDAsMCwwLDAsMCwwLDApO2NvbnN0IG09MS9wO3JldHVybiB0WzBdPWwqbSx0WzFdPShuKnUtaCpzKSptLHRbMl09KGEqcy1uKm8pKm0sdFszXT1kKm0sdFs0XT0oaCplLW4qYykqbSx0WzVdPShuKmktYSplKSptLHRbNl09ZiptLHRbN109KHMqYy11KmUpKm0sdFs4XT0obyplLXMqaSkqbSx0aGlzfXRyYW5zcG9zZSgpe2xldCB0O2NvbnN0IGU9dGhpcy5lbGVtZW50cztyZXR1cm4gdD1lWzFdLGVbMV09ZVszXSxlWzNdPXQsdD1lWzJdLGVbMl09ZVs2XSxlWzZdPXQsdD1lWzVdLGVbNV09ZVs3XSxlWzddPXQsdGhpc31nZXROb3JtYWxNYXRyaXgodCl7cmV0dXJuIHRoaXMuc2V0RnJvbU1hdHJpeDQodCkuaW52ZXJ0KCkudHJhbnNwb3NlKCl9dHJhbnNwb3NlSW50b0FycmF5KHQpe2NvbnN0IGU9dGhpcy5lbGVtZW50cztyZXR1cm4gdFswXT1lWzBdLHRbMV09ZVszXSx0WzJdPWVbNl0sdFszXT1lWzFdLHRbNF09ZVs0XSx0WzVdPWVbN10sdFs2XT1lWzJdLHRbN109ZVs1XSx0WzhdPWVbOF0sdGhpc31zZXRVdlRyYW5zZm9ybSh0LGUscyxuLGksbyxhKXtjb25zdCBjPU1hdGguY29zKGkpLHU9TWF0aC5zaW4oaSk7cmV0dXJuIHRoaXMuc2V0KHMqYyxzKnUsLXMqKGMqbyt1KmEpK28rdCwtbip1LG4qYywtbiooLXUqbytjKmEpK2ErZSwwLDAsMSksdGhpc31zY2FsZSh0LGUpe3JldHVybiB0aGlzLnByZW11bHRpcGx5KEVuLm1ha2VTY2FsZSh0LGUpKSx0aGlzfXJvdGF0ZSh0KXtyZXR1cm4gdGhpcy5wcmVtdWx0aXBseShFbi5tYWtlUm90YXRpb24oLXQpKSx0aGlzfXRyYW5zbGF0ZSh0LGUpe3JldHVybiB0aGlzLnByZW11bHRpcGx5KEVuLm1ha2VUcmFuc2xhdGlvbih0LGUpKSx0aGlzfW1ha2VUcmFuc2xhdGlvbih0LGUpe3JldHVybiB0LmlzVmVjdG9yMj90aGlzLnNldCgxLDAsdC54LDAsMSx0LnksMCwwLDEpOnRoaXMuc2V0KDEsMCx0LDAsMSxlLDAsMCwxKSx0aGlzfW1ha2VSb3RhdGlvbih0KXtjb25zdCBlPU1hdGguY29zKHQpLHM9TWF0aC5zaW4odCk7cmV0dXJuIHRoaXMuc2V0KGUsLXMsMCxzLGUsMCwwLDAsMSksdGhpc31tYWtlU2NhbGUodCxlKXtyZXR1cm4gdGhpcy5zZXQodCwwLDAsMCxlLDAsMCwwLDEpLHRoaXN9ZXF1YWxzKHQpe2NvbnN0IGU9dGhpcy5lbGVtZW50cyxzPXQuZWxlbWVudHM7Zm9yKGxldCBuPTA7bjw5O24rKylpZihlW25dIT09c1tuXSlyZXR1cm4hMTtyZXR1cm4hMH1mcm9tQXJyYXkodCxlPTApe2ZvcihsZXQgcz0wO3M8OTtzKyspdGhpcy5lbGVtZW50c1tzXT10W3MrZV07cmV0dXJuIHRoaXN9dG9BcnJheSh0PVtdLGU9MCl7Y29uc3Qgcz10aGlzLmVsZW1lbnRzO3JldHVybiB0W2VdPXNbMF0sdFtlKzFdPXNbMV0sdFtlKzJdPXNbMl0sdFtlKzNdPXNbM10sdFtlKzRdPXNbNF0sdFtlKzVdPXNbNV0sdFtlKzZdPXNbNl0sdFtlKzddPXNbN10sdFtlKzhdPXNbOF0sdH1jbG9uZSgpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmZyb21BcnJheSh0aGlzLmVsZW1lbnRzKX19Y29uc3QgRW49bmV3IEN0O2Z1bmN0aW9uIHNhKHIpe2ZvcihsZXQgdD1yLmxlbmd0aC0xO3Q+PTA7LS10KWlmKHJbdF0+PTY1NTM1KXJldHVybiEwO3JldHVybiExfWZ1bmN0aW9uIHNyKHIpe3JldHVybiBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiLHIpfWNvbnN0IG5yPW5ldyBDdCgpLnNldCguODIyNDYyMSwuMTc3NTM4LDAsLjAzMzE5NDEsLjk2NjgwNTgsMCwuMDE3MDgyNywuMDcyMzk3NCwuOTEwNTE5OSksaXI9bmV3IEN0KCkuc2V0KDEuMjI0OTQwMSwtLjIyNDk0MDQsMCwtLjA0MjA1NjksMS4wNDIwNTcxLDAsLS4wMTk2Mzc2LC0uMDc4NjM2MSwxLjA5ODI3MzUpLGplPXtbRXNdOnt0cmFuc2ZlcjpfbixwcmltYXJpZXM6amksbHVtaW5hbmNlQ29lZmZpY2llbnRzOlsuMjEyNiwuNzE1MiwuMDcyMl0sdG9SZWZlcmVuY2U6cj0+cixmcm9tUmVmZXJlbmNlOnI9PnJ9LFskdF06e3RyYW5zZmVyOkppLHByaW1hcmllczpqaSxsdW1pbmFuY2VDb2VmZmljaWVudHM6Wy4yMTI2LC43MTUyLC4wNzIyXSx0b1JlZmVyZW5jZTpyPT5yLmNvbnZlcnRTUkdCVG9MaW5lYXIoKSxmcm9tUmVmZXJlbmNlOnI9PnIuY29udmVydExpbmVhclRvU1JHQigpfSxbWmldOnt0cmFuc2ZlcjpfbixwcmltYXJpZXM6UWksbHVtaW5hbmNlQ29lZmZpY2llbnRzOlsuMjI4OSwuNjkxNywuMDc5M10sdG9SZWZlcmVuY2U6cj0+ci5hcHBseU1hdHJpeDMoaXIpLGZyb21SZWZlcmVuY2U6cj0+ci5hcHBseU1hdHJpeDMobnIpfSxbRG9dOnt0cmFuc2ZlcjpKaSxwcmltYXJpZXM6UWksbHVtaW5hbmNlQ29lZmZpY2llbnRzOlsuMjI4OSwuNjkxNywuMDc5M10sdG9SZWZlcmVuY2U6cj0+ci5jb252ZXJ0U1JHQlRvTGluZWFyKCkuYXBwbHlNYXRyaXgzKGlyKSxmcm9tUmVmZXJlbmNlOnI9PnIuYXBwbHlNYXRyaXgzKG5yKS5jb252ZXJ0TGluZWFyVG9TUkdCKCl9fSxuYT1uZXcgU2V0KFtFcyxaaV0pLG10PXtlbmFibGVkOiEwLF93b3JraW5nQ29sb3JTcGFjZTpFcyxnZXQgd29ya2luZ0NvbG9yU3BhY2UoKXtyZXR1cm4gdGhpcy5fd29ya2luZ0NvbG9yU3BhY2V9LHNldCB3b3JraW5nQ29sb3JTcGFjZShyKXtpZighbmEuaGFzKHIpKXRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgd29ya2luZyBjb2xvciBzcGFjZSwgIiR7cn0iLmApO3RoaXMuX3dvcmtpbmdDb2xvclNwYWNlPXJ9LGNvbnZlcnQ6ZnVuY3Rpb24ocix0LGUpe2lmKHRoaXMuZW5hYmxlZD09PSExfHx0PT09ZXx8IXR8fCFlKXJldHVybiByO2NvbnN0IHM9amVbdF0udG9SZWZlcmVuY2Usbj1qZVtlXS5mcm9tUmVmZXJlbmNlO3JldHVybiBuKHMocikpfSxmcm9tV29ya2luZ0NvbG9yU3BhY2U6ZnVuY3Rpb24ocix0KXtyZXR1cm4gdGhpcy5jb252ZXJ0KHIsdGhpcy5fd29ya2luZ0NvbG9yU3BhY2UsdCl9LHRvV29ya2luZ0NvbG9yU3BhY2U6ZnVuY3Rpb24ocix0KXtyZXR1cm4gdGhpcy5jb252ZXJ0KHIsdCx0aGlzLl93b3JraW5nQ29sb3JTcGFjZSl9LGdldFByaW1hcmllczpmdW5jdGlvbihyKXtyZXR1cm4gamVbcl0ucHJpbWFyaWVzfSxnZXRUcmFuc2ZlcjpmdW5jdGlvbihyKXtyZXR1cm4gcj09PWJzP19uOmplW3JdLnRyYW5zZmVyfSxnZXRMdW1pbmFuY2VDb2VmZmljaWVudHM6ZnVuY3Rpb24ocix0PXRoaXMuX3dvcmtpbmdDb2xvclNwYWNlKXtyZXR1cm4gci5mcm9tQXJyYXkoamVbdF0ubHVtaW5hbmNlQ29lZmZpY2llbnRzKX19O2Z1bmN0aW9uIHhlKHIpe3JldHVybiByPC4wNDA0NT9yKi4wNzczOTkzODA4Ok1hdGgucG93KHIqLjk0Nzg2NzI5ODYrLjA1MjEzMjcwMTQsMi40KX1mdW5jdGlvbiBDbihyKXtyZXR1cm4gcjwuMDAzMTMwOD9yKjEyLjkyOjEuMDU1Kk1hdGgucG93KHIsLjQxNjY2KS0uMDU1fWxldCBUZTtjbGFzcyBpYXtzdGF0aWMgZ2V0RGF0YVVSTCh0KXtpZigvXmRhdGE6L2kudGVzdCh0LnNyYyl8fHR5cGVvZiBIVE1MQ2FudmFzRWxlbWVudD4idSIpcmV0dXJuIHQuc3JjO2xldCBlO2lmKHQgaW5zdGFuY2VvZiBIVE1MQ2FudmFzRWxlbWVudCllPXQ7ZWxzZXtUZT09PXZvaWQgMCYmKFRlPXNyKCJjYW52YXMiKSksVGUud2lkdGg9dC53aWR0aCxUZS5oZWlnaHQ9dC5oZWlnaHQ7Y29uc3Qgcz1UZS5nZXRDb250ZXh0KCIyZCIpO3QgaW5zdGFuY2VvZiBJbWFnZURhdGE/cy5wdXRJbWFnZURhdGEodCwwLDApOnMuZHJhd0ltYWdlKHQsMCwwLHQud2lkdGgsdC5oZWlnaHQpLGU9VGV9cmV0dXJuIGUud2lkdGg+MjA0OHx8ZS5oZWlnaHQ+MjA0OD8oY29uc29sZS53YXJuKCJUSFJFRS5JbWFnZVV0aWxzLmdldERhdGFVUkw6IEltYWdlIGNvbnZlcnRlZCB0byBqcGcgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMiLHQpLGUudG9EYXRhVVJMKCJpbWFnZS9qcGVnIiwuNikpOmUudG9EYXRhVVJMKCJpbWFnZS9wbmciKX1zdGF0aWMgc1JHQlRvTGluZWFyKHQpe2lmKHR5cGVvZiBIVE1MSW1hZ2VFbGVtZW50PCJ1IiYmdCBpbnN0YW5jZW9mIEhUTUxJbWFnZUVsZW1lbnR8fHR5cGVvZiBIVE1MQ2FudmFzRWxlbWVudDwidSImJnQgaW5zdGFuY2VvZiBIVE1MQ2FudmFzRWxlbWVudHx8dHlwZW9mIEltYWdlQml0bWFwPCJ1IiYmdCBpbnN0YW5jZW9mIEltYWdlQml0bWFwKXtjb25zdCBlPXNyKCJjYW52YXMiKTtlLndpZHRoPXQud2lkdGgsZS5oZWlnaHQ9dC5oZWlnaHQ7Y29uc3Qgcz1lLmdldENvbnRleHQoIjJkIik7cy5kcmF3SW1hZ2UodCwwLDAsdC53aWR0aCx0LmhlaWdodCk7Y29uc3Qgbj1zLmdldEltYWdlRGF0YSgwLDAsdC53aWR0aCx0LmhlaWdodCksaT1uLmRhdGE7Zm9yKGxldCBvPTA7bzxpLmxlbmd0aDtvKyspaVtvXT14ZShpW29dLzI1NSkqMjU1O3JldHVybiBzLnB1dEltYWdlRGF0YShuLDAsMCksZX1lbHNlIGlmKHQuZGF0YSl7Y29uc3QgZT10LmRhdGEuc2xpY2UoMCk7Zm9yKGxldCBzPTA7czxlLmxlbmd0aDtzKyspZSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXl8fGUgaW5zdGFuY2VvZiBVaW50OENsYW1wZWRBcnJheT9lW3NdPU1hdGguZmxvb3IoeGUoZVtzXS8yNTUpKjI1NSk6ZVtzXT14ZShlW3NdKTtyZXR1cm57ZGF0YTplLHdpZHRoOnQud2lkdGgsaGVpZ2h0OnQuaGVpZ2h0fX1lbHNlIHJldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLkltYWdlVXRpbHMuc1JHQlRvTGluZWFyKCk6IFVuc3VwcG9ydGVkIGltYWdlIHR5cGUuIE5vIGNvbG9yIHNwYWNlIGNvbnZlcnNpb24gYXBwbGllZC4iKSx0fX1sZXQgcmE9MDtjbGFzcyBycntjb25zdHJ1Y3Rvcih0PW51bGwpe3RoaXMuaXNTb3VyY2U9ITAsT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImlkIix7dmFsdWU6cmErK30pLHRoaXMudXVpZD1LdCgpLHRoaXMuZGF0YT10LHRoaXMuZGF0YVJlYWR5PSEwLHRoaXMudmVyc2lvbj0wfXNldCBuZWVkc1VwZGF0ZSh0KXt0PT09ITAmJnRoaXMudmVyc2lvbisrfXRvSlNPTih0KXtjb25zdCBlPXQ9PT12b2lkIDB8fHR5cGVvZiB0PT0ic3RyaW5nIjtpZighZSYmdC5pbWFnZXNbdGhpcy51dWlkXSE9PXZvaWQgMClyZXR1cm4gdC5pbWFnZXNbdGhpcy51dWlkXTtjb25zdCBzPXt1dWlkOnRoaXMudXVpZCx1cmw6IiJ9LG49dGhpcy5kYXRhO2lmKG4hPT1udWxsKXtsZXQgaTtpZihBcnJheS5pc0FycmF5KG4pKXtpPVtdO2ZvcihsZXQgbz0wLGE9bi5sZW5ndGg7bzxhO28rKyluW29dLmlzRGF0YVRleHR1cmU/aS5wdXNoKEZuKG5bb10uaW1hZ2UpKTppLnB1c2goRm4obltvXSkpfWVsc2UgaT1GbihuKTtzLnVybD1pfXJldHVybiBlfHwodC5pbWFnZXNbdGhpcy51dWlkXT1zKSxzfX1mdW5jdGlvbiBGbihyKXtyZXR1cm4gdHlwZW9mIEhUTUxJbWFnZUVsZW1lbnQ8InUiJiZyIGluc3RhbmNlb2YgSFRNTEltYWdlRWxlbWVudHx8dHlwZW9mIEhUTUxDYW52YXNFbGVtZW50PCJ1IiYmciBpbnN0YW5jZW9mIEhUTUxDYW52YXNFbGVtZW50fHx0eXBlb2YgSW1hZ2VCaXRtYXA8InUiJiZyIGluc3RhbmNlb2YgSW1hZ2VCaXRtYXA/aWEuZ2V0RGF0YVVSTChyKTpyLmRhdGE/e2RhdGE6QXJyYXkuZnJvbShyLmRhdGEpLHdpZHRoOnIud2lkdGgsaGVpZ2h0OnIuaGVpZ2h0LHR5cGU6ci5kYXRhLmNvbnN0cnVjdG9yLm5hbWV9Oihjb25zb2xlLndhcm4oIlRIUkVFLlRleHR1cmU6IFVuYWJsZSB0byBzZXJpYWxpemUgVGV4dHVyZS4iKSx7fSl9bGV0IG9hPTA7Y2xhc3MgRHQgZXh0ZW5kcyBaZXtjb25zdHJ1Y3Rvcih0PUR0LkRFRkFVTFRfSU1BR0UsZT1EdC5ERUZBVUxUX01BUFBJTkcscz1fcyxuPV9zLGk9JGksbz1HaSxhPUxvLGM9Um8sdT1EdC5ERUZBVUxUX0FOSVNPVFJPUFksaD1icyl7c3VwZXIoKSx0aGlzLmlzVGV4dHVyZT0hMCxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiaWQiLHt2YWx1ZTpvYSsrfSksdGhpcy51dWlkPUt0KCksdGhpcy5uYW1lPSIiLHRoaXMuc291cmNlPW5ldyBycih0KSx0aGlzLm1pcG1hcHM9W10sdGhpcy5tYXBwaW5nPWUsdGhpcy5jaGFubmVsPTAsdGhpcy53cmFwUz1zLHRoaXMud3JhcFQ9bix0aGlzLm1hZ0ZpbHRlcj1pLHRoaXMubWluRmlsdGVyPW8sdGhpcy5hbmlzb3Ryb3B5PXUsdGhpcy5mb3JtYXQ9YSx0aGlzLmludGVybmFsRm9ybWF0PW51bGwsdGhpcy50eXBlPWMsdGhpcy5vZmZzZXQ9bmV3IEooMCwwKSx0aGlzLnJlcGVhdD1uZXcgSigxLDEpLHRoaXMuY2VudGVyPW5ldyBKKDAsMCksdGhpcy5yb3RhdGlvbj0wLHRoaXMubWF0cml4QXV0b1VwZGF0ZT0hMCx0aGlzLm1hdHJpeD1uZXcgQ3QsdGhpcy5nZW5lcmF0ZU1pcG1hcHM9ITAsdGhpcy5wcmVtdWx0aXBseUFscGhhPSExLHRoaXMuZmxpcFk9ITAsdGhpcy51bnBhY2tBbGlnbm1lbnQ9NCx0aGlzLmNvbG9yU3BhY2U9aCx0aGlzLnVzZXJEYXRhPXt9LHRoaXMudmVyc2lvbj0wLHRoaXMub25VcGRhdGU9bnVsbCx0aGlzLmlzUmVuZGVyVGFyZ2V0VGV4dHVyZT0hMSx0aGlzLnBtcmVtVmVyc2lvbj0wfWdldCBpbWFnZSgpe3JldHVybiB0aGlzLnNvdXJjZS5kYXRhfXNldCBpbWFnZSh0PW51bGwpe3RoaXMuc291cmNlLmRhdGE9dH11cGRhdGVNYXRyaXgoKXt0aGlzLm1hdHJpeC5zZXRVdlRyYW5zZm9ybSh0aGlzLm9mZnNldC54LHRoaXMub2Zmc2V0LnksdGhpcy5yZXBlYXQueCx0aGlzLnJlcGVhdC55LHRoaXMucm90YXRpb24sdGhpcy5jZW50ZXIueCx0aGlzLmNlbnRlci55KX1jbG9uZSgpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkodGhpcyl9Y29weSh0KXtyZXR1cm4gdGhpcy5uYW1lPXQubmFtZSx0aGlzLnNvdXJjZT10LnNvdXJjZSx0aGlzLm1pcG1hcHM9dC5taXBtYXBzLnNsaWNlKDApLHRoaXMubWFwcGluZz10Lm1hcHBpbmcsdGhpcy5jaGFubmVsPXQuY2hhbm5lbCx0aGlzLndyYXBTPXQud3JhcFMsdGhpcy53cmFwVD10LndyYXBULHRoaXMubWFnRmlsdGVyPXQubWFnRmlsdGVyLHRoaXMubWluRmlsdGVyPXQubWluRmlsdGVyLHRoaXMuYW5pc290cm9weT10LmFuaXNvdHJvcHksdGhpcy5mb3JtYXQ9dC5mb3JtYXQsdGhpcy5pbnRlcm5hbEZvcm1hdD10LmludGVybmFsRm9ybWF0LHRoaXMudHlwZT10LnR5cGUsdGhpcy5vZmZzZXQuY29weSh0Lm9mZnNldCksdGhpcy5yZXBlYXQuY29weSh0LnJlcGVhdCksdGhpcy5jZW50ZXIuY29weSh0LmNlbnRlciksdGhpcy5yb3RhdGlvbj10LnJvdGF0aW9uLHRoaXMubWF0cml4QXV0b1VwZGF0ZT10Lm1hdHJpeEF1dG9VcGRhdGUsdGhpcy5tYXRyaXguY29weSh0Lm1hdHJpeCksdGhpcy5nZW5lcmF0ZU1pcG1hcHM9dC5nZW5lcmF0ZU1pcG1hcHMsdGhpcy5wcmVtdWx0aXBseUFscGhhPXQucHJlbXVsdGlwbHlBbHBoYSx0aGlzLmZsaXBZPXQuZmxpcFksdGhpcy51bnBhY2tBbGlnbm1lbnQ9dC51bnBhY2tBbGlnbm1lbnQsdGhpcy5jb2xvclNwYWNlPXQuY29sb3JTcGFjZSx0aGlzLnVzZXJEYXRhPUpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodC51c2VyRGF0YSkpLHRoaXMubmVlZHNVcGRhdGU9ITAsdGhpc310b0pTT04odCl7Y29uc3QgZT10PT09dm9pZCAwfHx0eXBlb2YgdD09InN0cmluZyI7aWYoIWUmJnQudGV4dHVyZXNbdGhpcy51dWlkXSE9PXZvaWQgMClyZXR1cm4gdC50ZXh0dXJlc1t0aGlzLnV1aWRdO2NvbnN0IHM9e21ldGFkYXRhOnt2ZXJzaW9uOjQuNix0eXBlOiJUZXh0dXJlIixnZW5lcmF0b3I6IlRleHR1cmUudG9KU09OIn0sdXVpZDp0aGlzLnV1aWQsbmFtZTp0aGlzLm5hbWUsaW1hZ2U6dGhpcy5zb3VyY2UudG9KU09OKHQpLnV1aWQsbWFwcGluZzp0aGlzLm1hcHBpbmcsY2hhbm5lbDp0aGlzLmNoYW5uZWwscmVwZWF0Olt0aGlzLnJlcGVhdC54LHRoaXMucmVwZWF0LnldLG9mZnNldDpbdGhpcy5vZmZzZXQueCx0aGlzLm9mZnNldC55XSxjZW50ZXI6W3RoaXMuY2VudGVyLngsdGhpcy5jZW50ZXIueV0scm90YXRpb246dGhpcy5yb3RhdGlvbix3cmFwOlt0aGlzLndyYXBTLHRoaXMud3JhcFRdLGZvcm1hdDp0aGlzLmZvcm1hdCxpbnRlcm5hbEZvcm1hdDp0aGlzLmludGVybmFsRm9ybWF0LHR5cGU6dGhpcy50eXBlLGNvbG9yU3BhY2U6dGhpcy5jb2xvclNwYWNlLG1pbkZpbHRlcjp0aGlzLm1pbkZpbHRlcixtYWdGaWx0ZXI6dGhpcy5tYWdGaWx0ZXIsYW5pc290cm9weTp0aGlzLmFuaXNvdHJvcHksZmxpcFk6dGhpcy5mbGlwWSxnZW5lcmF0ZU1pcG1hcHM6dGhpcy5nZW5lcmF0ZU1pcG1hcHMscHJlbXVsdGlwbHlBbHBoYTp0aGlzLnByZW11bHRpcGx5QWxwaGEsdW5wYWNrQWxpZ25tZW50OnRoaXMudW5wYWNrQWxpZ25tZW50fTtyZXR1cm4gT2JqZWN0LmtleXModGhpcy51c2VyRGF0YSkubGVuZ3RoPjAmJihzLnVzZXJEYXRhPXRoaXMudXNlckRhdGEpLGV8fCh0LnRleHR1cmVzW3RoaXMudXVpZF09cyksc31kaXNwb3NlKCl7dGhpcy5kaXNwYXRjaEV2ZW50KHt0eXBlOiJkaXNwb3NlIn0pfXRyYW5zZm9ybVV2KHQpe2lmKHRoaXMubWFwcGluZyE9PWtpKXJldHVybiB0O2lmKHQuYXBwbHlNYXRyaXgzKHRoaXMubWF0cml4KSx0Lng8MHx8dC54PjEpc3dpdGNoKHRoaXMud3JhcFMpe2Nhc2UgSGk6dC54PXQueC1NYXRoLmZsb29yKHQueCk7YnJlYWs7Y2FzZSBfczp0Lng9dC54PDA/MDoxO2JyZWFrO2Nhc2UgcWk6TWF0aC5hYnMoTWF0aC5mbG9vcih0LngpJTIpPT09MT90Lng9TWF0aC5jZWlsKHQueCktdC54OnQueD10LngtTWF0aC5mbG9vcih0LngpO2JyZWFrfWlmKHQueTwwfHx0Lnk+MSlzd2l0Y2godGhpcy53cmFwVCl7Y2FzZSBIaTp0Lnk9dC55LU1hdGguZmxvb3IodC55KTticmVhaztjYXNlIF9zOnQueT10Lnk8MD8wOjE7YnJlYWs7Y2FzZSBxaTpNYXRoLmFicyhNYXRoLmZsb29yKHQueSklMik9PT0xP3QueT1NYXRoLmNlaWwodC55KS10Lnk6dC55PXQueS1NYXRoLmZsb29yKHQueSk7YnJlYWt9cmV0dXJuIHRoaXMuZmxpcFkmJih0Lnk9MS10LnkpLHR9c2V0IG5lZWRzVXBkYXRlKHQpe3Q9PT0hMCYmKHRoaXMudmVyc2lvbisrLHRoaXMuc291cmNlLm5lZWRzVXBkYXRlPSEwKX1zZXQgbmVlZHNQTVJFTVVwZGF0ZSh0KXt0PT09ITAmJnRoaXMucG1yZW1WZXJzaW9uKyt9fUR0LkRFRkFVTFRfSU1BR0U9bnVsbCxEdC5ERUZBVUxUX01BUFBJTkc9a2ksRHQuREVGQVVMVF9BTklTT1RST1BZPTQ7Y2xhc3MgRnR7Y29uc3RydWN0b3IodD0wLGU9MCxzPTAsbj0xKXtGdC5wcm90b3R5cGUuaXNWZWN0b3I0PSEwLHRoaXMueD10LHRoaXMueT1lLHRoaXMuej1zLHRoaXMudz1ufWdldCB3aWR0aCgpe3JldHVybiB0aGlzLnp9c2V0IHdpZHRoKHQpe3RoaXMuej10fWdldCBoZWlnaHQoKXtyZXR1cm4gdGhpcy53fXNldCBoZWlnaHQodCl7dGhpcy53PXR9c2V0KHQsZSxzLG4pe3JldHVybiB0aGlzLng9dCx0aGlzLnk9ZSx0aGlzLno9cyx0aGlzLnc9bix0aGlzfXNldFNjYWxhcih0KXtyZXR1cm4gdGhpcy54PXQsdGhpcy55PXQsdGhpcy56PXQsdGhpcy53PXQsdGhpc31zZXRYKHQpe3JldHVybiB0aGlzLng9dCx0aGlzfXNldFkodCl7cmV0dXJuIHRoaXMueT10LHRoaXN9c2V0Wih0KXtyZXR1cm4gdGhpcy56PXQsdGhpc31zZXRXKHQpe3JldHVybiB0aGlzLnc9dCx0aGlzfXNldENvbXBvbmVudCh0LGUpe3N3aXRjaCh0KXtjYXNlIDA6dGhpcy54PWU7YnJlYWs7Y2FzZSAxOnRoaXMueT1lO2JyZWFrO2Nhc2UgMjp0aGlzLno9ZTticmVhaztjYXNlIDM6dGhpcy53PWU7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoImluZGV4IGlzIG91dCBvZiByYW5nZTogIit0KX1yZXR1cm4gdGhpc31nZXRDb21wb25lbnQodCl7c3dpdGNoKHQpe2Nhc2UgMDpyZXR1cm4gdGhpcy54O2Nhc2UgMTpyZXR1cm4gdGhpcy55O2Nhc2UgMjpyZXR1cm4gdGhpcy56O2Nhc2UgMzpyZXR1cm4gdGhpcy53O2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJpbmRleCBpcyBvdXQgb2YgcmFuZ2U6ICIrdCl9fWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMueCx0aGlzLnksdGhpcy56LHRoaXMudyl9Y29weSh0KXtyZXR1cm4gdGhpcy54PXQueCx0aGlzLnk9dC55LHRoaXMuej10LnosdGhpcy53PXQudyE9PXZvaWQgMD90Lnc6MSx0aGlzfWFkZCh0KXtyZXR1cm4gdGhpcy54Kz10LngsdGhpcy55Kz10LnksdGhpcy56Kz10LnosdGhpcy53Kz10LncsdGhpc31hZGRTY2FsYXIodCl7cmV0dXJuIHRoaXMueCs9dCx0aGlzLnkrPXQsdGhpcy56Kz10LHRoaXMudys9dCx0aGlzfWFkZFZlY3RvcnModCxlKXtyZXR1cm4gdGhpcy54PXQueCtlLngsdGhpcy55PXQueStlLnksdGhpcy56PXQueitlLnosdGhpcy53PXQudytlLncsdGhpc31hZGRTY2FsZWRWZWN0b3IodCxlKXtyZXR1cm4gdGhpcy54Kz10LngqZSx0aGlzLnkrPXQueSplLHRoaXMueis9dC56KmUsdGhpcy53Kz10LncqZSx0aGlzfXN1Yih0KXtyZXR1cm4gdGhpcy54LT10LngsdGhpcy55LT10LnksdGhpcy56LT10LnosdGhpcy53LT10LncsdGhpc31zdWJTY2FsYXIodCl7cmV0dXJuIHRoaXMueC09dCx0aGlzLnktPXQsdGhpcy56LT10LHRoaXMudy09dCx0aGlzfXN1YlZlY3RvcnModCxlKXtyZXR1cm4gdGhpcy54PXQueC1lLngsdGhpcy55PXQueS1lLnksdGhpcy56PXQuei1lLnosdGhpcy53PXQudy1lLncsdGhpc31tdWx0aXBseSh0KXtyZXR1cm4gdGhpcy54Kj10LngsdGhpcy55Kj10LnksdGhpcy56Kj10LnosdGhpcy53Kj10LncsdGhpc31tdWx0aXBseVNjYWxhcih0KXtyZXR1cm4gdGhpcy54Kj10LHRoaXMueSo9dCx0aGlzLnoqPXQsdGhpcy53Kj10LHRoaXN9YXBwbHlNYXRyaXg0KHQpe2NvbnN0IGU9dGhpcy54LHM9dGhpcy55LG49dGhpcy56LGk9dGhpcy53LG89dC5lbGVtZW50cztyZXR1cm4gdGhpcy54PW9bMF0qZStvWzRdKnMrb1s4XSpuK29bMTJdKmksdGhpcy55PW9bMV0qZStvWzVdKnMrb1s5XSpuK29bMTNdKmksdGhpcy56PW9bMl0qZStvWzZdKnMrb1sxMF0qbitvWzE0XSppLHRoaXMudz1vWzNdKmUrb1s3XSpzK29bMTFdKm4rb1sxNV0qaSx0aGlzfWRpdmlkZVNjYWxhcih0KXtyZXR1cm4gdGhpcy5tdWx0aXBseVNjYWxhcigxL3QpfXNldEF4aXNBbmdsZUZyb21RdWF0ZXJuaW9uKHQpe3RoaXMudz0yKk1hdGguYWNvcyh0LncpO2NvbnN0IGU9TWF0aC5zcXJ0KDEtdC53KnQudyk7cmV0dXJuIGU8MWUtND8odGhpcy54PTEsdGhpcy55PTAsdGhpcy56PTApOih0aGlzLng9dC54L2UsdGhpcy55PXQueS9lLHRoaXMuej10LnovZSksdGhpc31zZXRBeGlzQW5nbGVGcm9tUm90YXRpb25NYXRyaXgodCl7bGV0IGUscyxuLGk7Y29uc3QgYz10LmVsZW1lbnRzLHU9Y1swXSxoPWNbNF0sbD1jWzhdLGQ9Y1sxXSxmPWNbNV0scD1jWzldLG09Y1syXSxnPWNbNl0seT1jWzEwXTtpZihNYXRoLmFicyhoLWQpPC4wMSYmTWF0aC5hYnMobC1tKTwuMDEmJk1hdGguYWJzKHAtZyk8LjAxKXtpZihNYXRoLmFicyhoK2QpPC4xJiZNYXRoLmFicyhsK20pPC4xJiZNYXRoLmFicyhwK2cpPC4xJiZNYXRoLmFicyh1K2YreS0zKTwuMSlyZXR1cm4gdGhpcy5zZXQoMSwwLDAsMCksdGhpcztlPU1hdGguUEk7Y29uc3Qgdz0odSsxKS8yLE09KGYrMSkvMixOPSh5KzEpLzIsXz0oaCtkKS80LFM9KGwrbSkvNCxFPShwK2cpLzQ7cmV0dXJuIHc+TSYmdz5OP3c8LjAxPyhzPTAsbj0uNzA3MTA2NzgxLGk9LjcwNzEwNjc4MSk6KHM9TWF0aC5zcXJ0KHcpLG49Xy9zLGk9Uy9zKTpNPk4/TTwuMDE/KHM9LjcwNzEwNjc4MSxuPTAsaT0uNzA3MTA2NzgxKToobj1NYXRoLnNxcnQoTSkscz1fL24saT1FL24pOk48LjAxPyhzPS43MDcxMDY3ODEsbj0uNzA3MTA2NzgxLGk9MCk6KGk9TWF0aC5zcXJ0KE4pLHM9Uy9pLG49RS9pKSx0aGlzLnNldChzLG4saSxlKSx0aGlzfWxldCBUPU1hdGguc3FydCgoZy1wKSooZy1wKSsobC1tKSoobC1tKSsoZC1oKSooZC1oKSk7cmV0dXJuIE1hdGguYWJzKFQpPC4wMDEmJihUPTEpLHRoaXMueD0oZy1wKS9ULHRoaXMueT0obC1tKS9ULHRoaXMuej0oZC1oKS9ULHRoaXMudz1NYXRoLmFjb3MoKHUrZit5LTEpLzIpLHRoaXN9c2V0RnJvbU1hdHJpeFBvc2l0aW9uKHQpe2NvbnN0IGU9dC5lbGVtZW50cztyZXR1cm4gdGhpcy54PWVbMTJdLHRoaXMueT1lWzEzXSx0aGlzLno9ZVsxNF0sdGhpcy53PWVbMTVdLHRoaXN9bWluKHQpe3JldHVybiB0aGlzLng9TWF0aC5taW4odGhpcy54LHQueCksdGhpcy55PU1hdGgubWluKHRoaXMueSx0LnkpLHRoaXMuej1NYXRoLm1pbih0aGlzLnosdC56KSx0aGlzLnc9TWF0aC5taW4odGhpcy53LHQudyksdGhpc31tYXgodCl7cmV0dXJuIHRoaXMueD1NYXRoLm1heCh0aGlzLngsdC54KSx0aGlzLnk9TWF0aC5tYXgodGhpcy55LHQueSksdGhpcy56PU1hdGgubWF4KHRoaXMueix0LnopLHRoaXMudz1NYXRoLm1heCh0aGlzLncsdC53KSx0aGlzfWNsYW1wKHQsZSl7cmV0dXJuIHRoaXMueD1NYXRoLm1heCh0LngsTWF0aC5taW4oZS54LHRoaXMueCkpLHRoaXMueT1NYXRoLm1heCh0LnksTWF0aC5taW4oZS55LHRoaXMueSkpLHRoaXMuej1NYXRoLm1heCh0LnosTWF0aC5taW4oZS56LHRoaXMueikpLHRoaXMudz1NYXRoLm1heCh0LncsTWF0aC5taW4oZS53LHRoaXMudykpLHRoaXN9Y2xhbXBTY2FsYXIodCxlKXtyZXR1cm4gdGhpcy54PU1hdGgubWF4KHQsTWF0aC5taW4oZSx0aGlzLngpKSx0aGlzLnk9TWF0aC5tYXgodCxNYXRoLm1pbihlLHRoaXMueSkpLHRoaXMuej1NYXRoLm1heCh0LE1hdGgubWluKGUsdGhpcy56KSksdGhpcy53PU1hdGgubWF4KHQsTWF0aC5taW4oZSx0aGlzLncpKSx0aGlzfWNsYW1wTGVuZ3RoKHQsZSl7Y29uc3Qgcz10aGlzLmxlbmd0aCgpO3JldHVybiB0aGlzLmRpdmlkZVNjYWxhcihzfHwxKS5tdWx0aXBseVNjYWxhcihNYXRoLm1heCh0LE1hdGgubWluKGUscykpKX1mbG9vcigpe3JldHVybiB0aGlzLng9TWF0aC5mbG9vcih0aGlzLngpLHRoaXMueT1NYXRoLmZsb29yKHRoaXMueSksdGhpcy56PU1hdGguZmxvb3IodGhpcy56KSx0aGlzLnc9TWF0aC5mbG9vcih0aGlzLncpLHRoaXN9Y2VpbCgpe3JldHVybiB0aGlzLng9TWF0aC5jZWlsKHRoaXMueCksdGhpcy55PU1hdGguY2VpbCh0aGlzLnkpLHRoaXMuej1NYXRoLmNlaWwodGhpcy56KSx0aGlzLnc9TWF0aC5jZWlsKHRoaXMudyksdGhpc31yb3VuZCgpe3JldHVybiB0aGlzLng9TWF0aC5yb3VuZCh0aGlzLngpLHRoaXMueT1NYXRoLnJvdW5kKHRoaXMueSksdGhpcy56PU1hdGgucm91bmQodGhpcy56KSx0aGlzLnc9TWF0aC5yb3VuZCh0aGlzLncpLHRoaXN9cm91bmRUb1plcm8oKXtyZXR1cm4gdGhpcy54PU1hdGgudHJ1bmModGhpcy54KSx0aGlzLnk9TWF0aC50cnVuYyh0aGlzLnkpLHRoaXMuej1NYXRoLnRydW5jKHRoaXMueiksdGhpcy53PU1hdGgudHJ1bmModGhpcy53KSx0aGlzfW5lZ2F0ZSgpe3JldHVybiB0aGlzLng9LXRoaXMueCx0aGlzLnk9LXRoaXMueSx0aGlzLno9LXRoaXMueix0aGlzLnc9LXRoaXMudyx0aGlzfWRvdCh0KXtyZXR1cm4gdGhpcy54KnQueCt0aGlzLnkqdC55K3RoaXMueip0LnordGhpcy53KnQud31sZW5ndGhTcSgpe3JldHVybiB0aGlzLngqdGhpcy54K3RoaXMueSp0aGlzLnkrdGhpcy56KnRoaXMueit0aGlzLncqdGhpcy53fWxlbmd0aCgpe3JldHVybiBNYXRoLnNxcnQodGhpcy54KnRoaXMueCt0aGlzLnkqdGhpcy55K3RoaXMueip0aGlzLnordGhpcy53KnRoaXMudyl9bWFuaGF0dGFuTGVuZ3RoKCl7cmV0dXJuIE1hdGguYWJzKHRoaXMueCkrTWF0aC5hYnModGhpcy55KStNYXRoLmFicyh0aGlzLnopK01hdGguYWJzKHRoaXMudyl9bm9ybWFsaXplKCl7cmV0dXJuIHRoaXMuZGl2aWRlU2NhbGFyKHRoaXMubGVuZ3RoKCl8fDEpfXNldExlbmd0aCh0KXtyZXR1cm4gdGhpcy5ub3JtYWxpemUoKS5tdWx0aXBseVNjYWxhcih0KX1sZXJwKHQsZSl7cmV0dXJuIHRoaXMueCs9KHQueC10aGlzLngpKmUsdGhpcy55Kz0odC55LXRoaXMueSkqZSx0aGlzLnorPSh0LnotdGhpcy56KSplLHRoaXMudys9KHQudy10aGlzLncpKmUsdGhpc31sZXJwVmVjdG9ycyh0LGUscyl7cmV0dXJuIHRoaXMueD10LngrKGUueC10LngpKnMsdGhpcy55PXQueSsoZS55LXQueSkqcyx0aGlzLno9dC56KyhlLnotdC56KSpzLHRoaXMudz10LncrKGUudy10LncpKnMsdGhpc31lcXVhbHModCl7cmV0dXJuIHQueD09PXRoaXMueCYmdC55PT09dGhpcy55JiZ0Lno9PT10aGlzLnomJnQudz09PXRoaXMud31mcm9tQXJyYXkodCxlPTApe3JldHVybiB0aGlzLng9dFtlXSx0aGlzLnk9dFtlKzFdLHRoaXMuej10W2UrMl0sdGhpcy53PXRbZSszXSx0aGlzfXRvQXJyYXkodD1bXSxlPTApe3JldHVybiB0W2VdPXRoaXMueCx0W2UrMV09dGhpcy55LHRbZSsyXT10aGlzLnosdFtlKzNdPXRoaXMudyx0fWZyb21CdWZmZXJBdHRyaWJ1dGUodCxlKXtyZXR1cm4gdGhpcy54PXQuZ2V0WChlKSx0aGlzLnk9dC5nZXRZKGUpLHRoaXMuej10LmdldFooZSksdGhpcy53PXQuZ2V0VyhlKSx0aGlzfXJhbmRvbSgpe3JldHVybiB0aGlzLng9TWF0aC5yYW5kb20oKSx0aGlzLnk9TWF0aC5yYW5kb20oKSx0aGlzLno9TWF0aC5yYW5kb20oKSx0aGlzLnc9TWF0aC5yYW5kb20oKSx0aGlzfSpbU3ltYm9sLml0ZXJhdG9yXSgpe3lpZWxkIHRoaXMueCx5aWVsZCB0aGlzLnkseWllbGQgdGhpcy56LHlpZWxkIHRoaXMud319Y2xhc3Mgb3IgZXh0ZW5kcyBaZXtjb25zdHJ1Y3Rvcih0PTEsZT0xLHM9e30pe3N1cGVyKCksdGhpcy5pc1JlbmRlclRhcmdldD0hMCx0aGlzLndpZHRoPXQsdGhpcy5oZWlnaHQ9ZSx0aGlzLmRlcHRoPTEsdGhpcy5zY2lzc29yPW5ldyBGdCgwLDAsdCxlKSx0aGlzLnNjaXNzb3JUZXN0PSExLHRoaXMudmlld3BvcnQ9bmV3IEZ0KDAsMCx0LGUpO2NvbnN0IG49e3dpZHRoOnQsaGVpZ2h0OmUsZGVwdGg6MX07cz1PYmplY3QuYXNzaWduKHtnZW5lcmF0ZU1pcG1hcHM6ITEsaW50ZXJuYWxGb3JtYXQ6bnVsbCxtaW5GaWx0ZXI6JGksZGVwdGhCdWZmZXI6ITAsc3RlbmNpbEJ1ZmZlcjohMSxyZXNvbHZlRGVwdGhCdWZmZXI6ITAscmVzb2x2ZVN0ZW5jaWxCdWZmZXI6ITAsZGVwdGhUZXh0dXJlOm51bGwsc2FtcGxlczowLGNvdW50OjF9LHMpO2NvbnN0IGk9bmV3IER0KG4scy5tYXBwaW5nLHMud3JhcFMscy53cmFwVCxzLm1hZ0ZpbHRlcixzLm1pbkZpbHRlcixzLmZvcm1hdCxzLnR5cGUscy5hbmlzb3Ryb3B5LHMuY29sb3JTcGFjZSk7aS5mbGlwWT0hMSxpLmdlbmVyYXRlTWlwbWFwcz1zLmdlbmVyYXRlTWlwbWFwcyxpLmludGVybmFsRm9ybWF0PXMuaW50ZXJuYWxGb3JtYXQsdGhpcy50ZXh0dXJlcz1bXTtjb25zdCBvPXMuY291bnQ7Zm9yKGxldCBhPTA7YTxvO2ErKyl0aGlzLnRleHR1cmVzW2FdPWkuY2xvbmUoKSx0aGlzLnRleHR1cmVzW2FdLmlzUmVuZGVyVGFyZ2V0VGV4dHVyZT0hMDt0aGlzLmRlcHRoQnVmZmVyPXMuZGVwdGhCdWZmZXIsdGhpcy5zdGVuY2lsQnVmZmVyPXMuc3RlbmNpbEJ1ZmZlcix0aGlzLnJlc29sdmVEZXB0aEJ1ZmZlcj1zLnJlc29sdmVEZXB0aEJ1ZmZlcix0aGlzLnJlc29sdmVTdGVuY2lsQnVmZmVyPXMucmVzb2x2ZVN0ZW5jaWxCdWZmZXIsdGhpcy5kZXB0aFRleHR1cmU9cy5kZXB0aFRleHR1cmUsdGhpcy5zYW1wbGVzPXMuc2FtcGxlc31nZXQgdGV4dHVyZSgpe3JldHVybiB0aGlzLnRleHR1cmVzWzBdfXNldCB0ZXh0dXJlKHQpe3RoaXMudGV4dHVyZXNbMF09dH1zZXRTaXplKHQsZSxzPTEpe2lmKHRoaXMud2lkdGghPT10fHx0aGlzLmhlaWdodCE9PWV8fHRoaXMuZGVwdGghPT1zKXt0aGlzLndpZHRoPXQsdGhpcy5oZWlnaHQ9ZSx0aGlzLmRlcHRoPXM7Zm9yKGxldCBuPTAsaT10aGlzLnRleHR1cmVzLmxlbmd0aDtuPGk7bisrKXRoaXMudGV4dHVyZXNbbl0uaW1hZ2Uud2lkdGg9dCx0aGlzLnRleHR1cmVzW25dLmltYWdlLmhlaWdodD1lLHRoaXMudGV4dHVyZXNbbl0uaW1hZ2UuZGVwdGg9czt0aGlzLmRpc3Bvc2UoKX10aGlzLnZpZXdwb3J0LnNldCgwLDAsdCxlKSx0aGlzLnNjaXNzb3Iuc2V0KDAsMCx0LGUpfWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSh0aGlzKX1jb3B5KHQpe3RoaXMud2lkdGg9dC53aWR0aCx0aGlzLmhlaWdodD10LmhlaWdodCx0aGlzLmRlcHRoPXQuZGVwdGgsdGhpcy5zY2lzc29yLmNvcHkodC5zY2lzc29yKSx0aGlzLnNjaXNzb3JUZXN0PXQuc2Npc3NvclRlc3QsdGhpcy52aWV3cG9ydC5jb3B5KHQudmlld3BvcnQpLHRoaXMudGV4dHVyZXMubGVuZ3RoPTA7Zm9yKGxldCBzPTAsbj10LnRleHR1cmVzLmxlbmd0aDtzPG47cysrKXRoaXMudGV4dHVyZXNbc109dC50ZXh0dXJlc1tzXS5jbG9uZSgpLHRoaXMudGV4dHVyZXNbc10uaXNSZW5kZXJUYXJnZXRUZXh0dXJlPSEwO2NvbnN0IGU9T2JqZWN0LmFzc2lnbih7fSx0LnRleHR1cmUuaW1hZ2UpO3JldHVybiB0aGlzLnRleHR1cmUuc291cmNlPW5ldyBycihlKSx0aGlzLmRlcHRoQnVmZmVyPXQuZGVwdGhCdWZmZXIsdGhpcy5zdGVuY2lsQnVmZmVyPXQuc3RlbmNpbEJ1ZmZlcix0aGlzLnJlc29sdmVEZXB0aEJ1ZmZlcj10LnJlc29sdmVEZXB0aEJ1ZmZlcix0aGlzLnJlc29sdmVTdGVuY2lsQnVmZmVyPXQucmVzb2x2ZVN0ZW5jaWxCdWZmZXIsdC5kZXB0aFRleHR1cmUhPT1udWxsJiYodGhpcy5kZXB0aFRleHR1cmU9dC5kZXB0aFRleHR1cmUuY2xvbmUoKSksdGhpcy5zYW1wbGVzPXQuc2FtcGxlcyx0aGlzfWRpc3Bvc2UoKXt0aGlzLmRpc3BhdGNoRXZlbnQoe3R5cGU6ImRpc3Bvc2UifSl9fWNsYXNzIFFle2NvbnN0cnVjdG9yKHQ9MCxlPTAscz0wLG49MSl7dGhpcy5pc1F1YXRlcm5pb249ITAsdGhpcy5feD10LHRoaXMuX3k9ZSx0aGlzLl96PXMsdGhpcy5fdz1ufXN0YXRpYyBzbGVycEZsYXQodCxlLHMsbixpLG8sYSl7bGV0IGM9c1tuKzBdLHU9c1tuKzFdLGg9c1tuKzJdLGw9c1tuKzNdO2NvbnN0IGQ9aVtvKzBdLGY9aVtvKzFdLHA9aVtvKzJdLG09aVtvKzNdO2lmKGE9PT0wKXt0W2UrMF09Yyx0W2UrMV09dSx0W2UrMl09aCx0W2UrM109bDtyZXR1cm59aWYoYT09PTEpe3RbZSswXT1kLHRbZSsxXT1mLHRbZSsyXT1wLHRbZSszXT1tO3JldHVybn1pZihsIT09bXx8YyE9PWR8fHUhPT1mfHxoIT09cCl7bGV0IGc9MS1hO2NvbnN0IHk9YypkK3UqZitoKnArbCptLFQ9eT49MD8xOi0xLHc9MS15Knk7aWYodz5OdW1iZXIuRVBTSUxPTil7Y29uc3QgTj1NYXRoLnNxcnQodyksXz1NYXRoLmF0YW4yKE4seSpUKTtnPU1hdGguc2luKGcqXykvTixhPU1hdGguc2luKGEqXykvTn1jb25zdCBNPWEqVDtpZihjPWMqZytkKk0sdT11KmcrZipNLGg9aCpnK3AqTSxsPWwqZyttKk0sZz09PTEtYSl7Y29uc3QgTj0xL01hdGguc3FydChjKmMrdSp1K2gqaCtsKmwpO2MqPU4sdSo9TixoKj1OLGwqPU59fXRbZV09Yyx0W2UrMV09dSx0W2UrMl09aCx0W2UrM109bH1zdGF0aWMgbXVsdGlwbHlRdWF0ZXJuaW9uc0ZsYXQodCxlLHMsbixpLG8pe2NvbnN0IGE9c1tuXSxjPXNbbisxXSx1PXNbbisyXSxoPXNbbiszXSxsPWlbb10sZD1pW28rMV0sZj1pW28rMl0scD1pW28rM107cmV0dXJuIHRbZV09YSpwK2gqbCtjKmYtdSpkLHRbZSsxXT1jKnAraCpkK3UqbC1hKmYsdFtlKzJdPXUqcCtoKmYrYSpkLWMqbCx0W2UrM109aCpwLWEqbC1jKmQtdSpmLHR9Z2V0IHgoKXtyZXR1cm4gdGhpcy5feH1zZXQgeCh0KXt0aGlzLl94PXQsdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpfWdldCB5KCl7cmV0dXJuIHRoaXMuX3l9c2V0IHkodCl7dGhpcy5feT10LHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKX1nZXQgeigpe3JldHVybiB0aGlzLl96fXNldCB6KHQpe3RoaXMuX3o9dCx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCl9Z2V0IHcoKXtyZXR1cm4gdGhpcy5fd31zZXQgdyh0KXt0aGlzLl93PXQsdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpfXNldCh0LGUscyxuKXtyZXR1cm4gdGhpcy5feD10LHRoaXMuX3k9ZSx0aGlzLl96PXMsdGhpcy5fdz1uLHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMuX3gsdGhpcy5feSx0aGlzLl96LHRoaXMuX3cpfWNvcHkodCl7cmV0dXJuIHRoaXMuX3g9dC54LHRoaXMuX3k9dC55LHRoaXMuX3o9dC56LHRoaXMuX3c9dC53LHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfXNldEZyb21FdWxlcih0LGU9ITApe2NvbnN0IHM9dC5feCxuPXQuX3ksaT10Ll96LG89dC5fb3JkZXIsYT1NYXRoLmNvcyxjPU1hdGguc2luLHU9YShzLzIpLGg9YShuLzIpLGw9YShpLzIpLGQ9YyhzLzIpLGY9YyhuLzIpLHA9YyhpLzIpO3N3aXRjaChvKXtjYXNlIlhZWiI6dGhpcy5feD1kKmgqbCt1KmYqcCx0aGlzLl95PXUqZipsLWQqaCpwLHRoaXMuX3o9dSpoKnArZCpmKmwsdGhpcy5fdz11KmgqbC1kKmYqcDticmVhaztjYXNlIllYWiI6dGhpcy5feD1kKmgqbCt1KmYqcCx0aGlzLl95PXUqZipsLWQqaCpwLHRoaXMuX3o9dSpoKnAtZCpmKmwsdGhpcy5fdz11KmgqbCtkKmYqcDticmVhaztjYXNlIlpYWSI6dGhpcy5feD1kKmgqbC11KmYqcCx0aGlzLl95PXUqZipsK2QqaCpwLHRoaXMuX3o9dSpoKnArZCpmKmwsdGhpcy5fdz11KmgqbC1kKmYqcDticmVhaztjYXNlIlpZWCI6dGhpcy5feD1kKmgqbC11KmYqcCx0aGlzLl95PXUqZipsK2QqaCpwLHRoaXMuX3o9dSpoKnAtZCpmKmwsdGhpcy5fdz11KmgqbCtkKmYqcDticmVhaztjYXNlIllaWCI6dGhpcy5feD1kKmgqbCt1KmYqcCx0aGlzLl95PXUqZipsK2QqaCpwLHRoaXMuX3o9dSpoKnAtZCpmKmwsdGhpcy5fdz11KmgqbC1kKmYqcDticmVhaztjYXNlIlhaWSI6dGhpcy5feD1kKmgqbC11KmYqcCx0aGlzLl95PXUqZipsLWQqaCpwLHRoaXMuX3o9dSpoKnArZCpmKmwsdGhpcy5fdz11KmgqbCtkKmYqcDticmVhaztkZWZhdWx0OmNvbnNvbGUud2FybigiVEhSRUUuUXVhdGVybmlvbjogLnNldEZyb21FdWxlcigpIGVuY291bnRlcmVkIGFuIHVua25vd24gb3JkZXI6ICIrbyl9cmV0dXJuIGU9PT0hMCYmdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpLHRoaXN9c2V0RnJvbUF4aXNBbmdsZSh0LGUpe2NvbnN0IHM9ZS8yLG49TWF0aC5zaW4ocyk7cmV0dXJuIHRoaXMuX3g9dC54Km4sdGhpcy5feT10Lnkqbix0aGlzLl96PXQueipuLHRoaXMuX3c9TWF0aC5jb3MocyksdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpLHRoaXN9c2V0RnJvbVJvdGF0aW9uTWF0cml4KHQpe2NvbnN0IGU9dC5lbGVtZW50cyxzPWVbMF0sbj1lWzRdLGk9ZVs4XSxvPWVbMV0sYT1lWzVdLGM9ZVs5XSx1PWVbMl0saD1lWzZdLGw9ZVsxMF0sZD1zK2ErbDtpZihkPjApe2NvbnN0IGY9LjUvTWF0aC5zcXJ0KGQrMSk7dGhpcy5fdz0uMjUvZix0aGlzLl94PShoLWMpKmYsdGhpcy5feT0oaS11KSpmLHRoaXMuX3o9KG8tbikqZn1lbHNlIGlmKHM+YSYmcz5sKXtjb25zdCBmPTIqTWF0aC5zcXJ0KDErcy1hLWwpO3RoaXMuX3c9KGgtYykvZix0aGlzLl94PS4yNSpmLHRoaXMuX3k9KG4rbykvZix0aGlzLl96PShpK3UpL2Z9ZWxzZSBpZihhPmwpe2NvbnN0IGY9MipNYXRoLnNxcnQoMSthLXMtbCk7dGhpcy5fdz0oaS11KS9mLHRoaXMuX3g9KG4rbykvZix0aGlzLl95PS4yNSpmLHRoaXMuX3o9KGMraCkvZn1lbHNle2NvbnN0IGY9MipNYXRoLnNxcnQoMStsLXMtYSk7dGhpcy5fdz0oby1uKS9mLHRoaXMuX3g9KGkrdSkvZix0aGlzLl95PShjK2gpL2YsdGhpcy5fej0uMjUqZn1yZXR1cm4gdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpLHRoaXN9c2V0RnJvbVVuaXRWZWN0b3JzKHQsZSl7bGV0IHM9dC5kb3QoZSkrMTtyZXR1cm4gczxOdW1iZXIuRVBTSUxPTj8ocz0wLE1hdGguYWJzKHQueCk+TWF0aC5hYnModC56KT8odGhpcy5feD0tdC55LHRoaXMuX3k9dC54LHRoaXMuX3o9MCx0aGlzLl93PXMpOih0aGlzLl94PTAsdGhpcy5feT0tdC56LHRoaXMuX3o9dC55LHRoaXMuX3c9cykpOih0aGlzLl94PXQueSplLnotdC56KmUueSx0aGlzLl95PXQueiplLngtdC54KmUueix0aGlzLl96PXQueCplLnktdC55KmUueCx0aGlzLl93PXMpLHRoaXMubm9ybWFsaXplKCl9YW5nbGVUbyh0KXtyZXR1cm4gMipNYXRoLmFjb3MoTWF0aC5hYnMoYXQodGhpcy5kb3QodCksLTEsMSkpKX1yb3RhdGVUb3dhcmRzKHQsZSl7Y29uc3Qgcz10aGlzLmFuZ2xlVG8odCk7aWYocz09PTApcmV0dXJuIHRoaXM7Y29uc3Qgbj1NYXRoLm1pbigxLGUvcyk7cmV0dXJuIHRoaXMuc2xlcnAodCxuKSx0aGlzfWlkZW50aXR5KCl7cmV0dXJuIHRoaXMuc2V0KDAsMCwwLDEpfWludmVydCgpe3JldHVybiB0aGlzLmNvbmp1Z2F0ZSgpfWNvbmp1Z2F0ZSgpe3JldHVybiB0aGlzLl94Kj0tMSx0aGlzLl95Kj0tMSx0aGlzLl96Kj0tMSx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksdGhpc31kb3QodCl7cmV0dXJuIHRoaXMuX3gqdC5feCt0aGlzLl95KnQuX3krdGhpcy5feip0Ll96K3RoaXMuX3cqdC5fd31sZW5ndGhTcSgpe3JldHVybiB0aGlzLl94KnRoaXMuX3grdGhpcy5feSp0aGlzLl95K3RoaXMuX3oqdGhpcy5feit0aGlzLl93KnRoaXMuX3d9bGVuZ3RoKCl7cmV0dXJuIE1hdGguc3FydCh0aGlzLl94KnRoaXMuX3grdGhpcy5feSp0aGlzLl95K3RoaXMuX3oqdGhpcy5feit0aGlzLl93KnRoaXMuX3cpfW5vcm1hbGl6ZSgpe2xldCB0PXRoaXMubGVuZ3RoKCk7cmV0dXJuIHQ9PT0wPyh0aGlzLl94PTAsdGhpcy5feT0wLHRoaXMuX3o9MCx0aGlzLl93PTEpOih0PTEvdCx0aGlzLl94PXRoaXMuX3gqdCx0aGlzLl95PXRoaXMuX3kqdCx0aGlzLl96PXRoaXMuX3oqdCx0aGlzLl93PXRoaXMuX3cqdCksdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpLHRoaXN9bXVsdGlwbHkodCl7cmV0dXJuIHRoaXMubXVsdGlwbHlRdWF0ZXJuaW9ucyh0aGlzLHQpfXByZW11bHRpcGx5KHQpe3JldHVybiB0aGlzLm11bHRpcGx5UXVhdGVybmlvbnModCx0aGlzKX1tdWx0aXBseVF1YXRlcm5pb25zKHQsZSl7Y29uc3Qgcz10Ll94LG49dC5feSxpPXQuX3osbz10Ll93LGE9ZS5feCxjPWUuX3ksdT1lLl96LGg9ZS5fdztyZXR1cm4gdGhpcy5feD1zKmgrbyphK24qdS1pKmMsdGhpcy5feT1uKmgrbypjK2kqYS1zKnUsdGhpcy5fej1pKmgrbyp1K3MqYy1uKmEsdGhpcy5fdz1vKmgtcyphLW4qYy1pKnUsdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpLHRoaXN9c2xlcnAodCxlKXtpZihlPT09MClyZXR1cm4gdGhpcztpZihlPT09MSlyZXR1cm4gdGhpcy5jb3B5KHQpO2NvbnN0IHM9dGhpcy5feCxuPXRoaXMuX3ksaT10aGlzLl96LG89dGhpcy5fdztsZXQgYT1vKnQuX3crcyp0Ll94K24qdC5feStpKnQuX3o7aWYoYTwwPyh0aGlzLl93PS10Ll93LHRoaXMuX3g9LXQuX3gsdGhpcy5feT0tdC5feSx0aGlzLl96PS10Ll96LGE9LWEpOnRoaXMuY29weSh0KSxhPj0xKXJldHVybiB0aGlzLl93PW8sdGhpcy5feD1zLHRoaXMuX3k9bix0aGlzLl96PWksdGhpcztjb25zdCBjPTEtYSphO2lmKGM8PU51bWJlci5FUFNJTE9OKXtjb25zdCBmPTEtZTtyZXR1cm4gdGhpcy5fdz1mKm8rZSp0aGlzLl93LHRoaXMuX3g9ZipzK2UqdGhpcy5feCx0aGlzLl95PWYqbitlKnRoaXMuX3ksdGhpcy5fej1mKmkrZSp0aGlzLl96LHRoaXMubm9ybWFsaXplKCksdGhpc31jb25zdCB1PU1hdGguc3FydChjKSxoPU1hdGguYXRhbjIodSxhKSxsPU1hdGguc2luKCgxLWUpKmgpL3UsZD1NYXRoLnNpbihlKmgpL3U7cmV0dXJuIHRoaXMuX3c9bypsK3RoaXMuX3cqZCx0aGlzLl94PXMqbCt0aGlzLl94KmQsdGhpcy5feT1uKmwrdGhpcy5feSpkLHRoaXMuX3o9aSpsK3RoaXMuX3oqZCx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksdGhpc31zbGVycFF1YXRlcm5pb25zKHQsZSxzKXtyZXR1cm4gdGhpcy5jb3B5KHQpLnNsZXJwKGUscyl9cmFuZG9tKCl7Y29uc3QgdD0yKk1hdGguUEkqTWF0aC5yYW5kb20oKSxlPTIqTWF0aC5QSSpNYXRoLnJhbmRvbSgpLHM9TWF0aC5yYW5kb20oKSxuPU1hdGguc3FydCgxLXMpLGk9TWF0aC5zcXJ0KHMpO3JldHVybiB0aGlzLnNldChuKk1hdGguc2luKHQpLG4qTWF0aC5jb3ModCksaSpNYXRoLnNpbihlKSxpKk1hdGguY29zKGUpKX1lcXVhbHModCl7cmV0dXJuIHQuX3g9PT10aGlzLl94JiZ0Ll95PT09dGhpcy5feSYmdC5fej09PXRoaXMuX3omJnQuX3c9PT10aGlzLl93fWZyb21BcnJheSh0LGU9MCl7cmV0dXJuIHRoaXMuX3g9dFtlXSx0aGlzLl95PXRbZSsxXSx0aGlzLl96PXRbZSsyXSx0aGlzLl93PXRbZSszXSx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksdGhpc310b0FycmF5KHQ9W10sZT0wKXtyZXR1cm4gdFtlXT10aGlzLl94LHRbZSsxXT10aGlzLl95LHRbZSsyXT10aGlzLl96LHRbZSszXT10aGlzLl93LHR9ZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0LGUpe3JldHVybiB0aGlzLl94PXQuZ2V0WChlKSx0aGlzLl95PXQuZ2V0WShlKSx0aGlzLl96PXQuZ2V0WihlKSx0aGlzLl93PXQuZ2V0VyhlKSx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksdGhpc310b0pTT04oKXtyZXR1cm4gdGhpcy50b0FycmF5KCl9X29uQ2hhbmdlKHQpe3JldHVybiB0aGlzLl9vbkNoYW5nZUNhbGxiYWNrPXQsdGhpc31fb25DaGFuZ2VDYWxsYmFjaygpe30qW1N5bWJvbC5pdGVyYXRvcl0oKXt5aWVsZCB0aGlzLl94LHlpZWxkIHRoaXMuX3kseWllbGQgdGhpcy5feix5aWVsZCB0aGlzLl93fX1jbGFzcyBBe2NvbnN0cnVjdG9yKHQ9MCxlPTAscz0wKXtBLnByb3RvdHlwZS5pc1ZlY3RvcjM9ITAsdGhpcy54PXQsdGhpcy55PWUsdGhpcy56PXN9c2V0KHQsZSxzKXtyZXR1cm4gcz09PXZvaWQgMCYmKHM9dGhpcy56KSx0aGlzLng9dCx0aGlzLnk9ZSx0aGlzLno9cyx0aGlzfXNldFNjYWxhcih0KXtyZXR1cm4gdGhpcy54PXQsdGhpcy55PXQsdGhpcy56PXQsdGhpc31zZXRYKHQpe3JldHVybiB0aGlzLng9dCx0aGlzfXNldFkodCl7cmV0dXJuIHRoaXMueT10LHRoaXN9c2V0Wih0KXtyZXR1cm4gdGhpcy56PXQsdGhpc31zZXRDb21wb25lbnQodCxlKXtzd2l0Y2godCl7Y2FzZSAwOnRoaXMueD1lO2JyZWFrO2Nhc2UgMTp0aGlzLnk9ZTticmVhaztjYXNlIDI6dGhpcy56PWU7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoImluZGV4IGlzIG91dCBvZiByYW5nZTogIit0KX1yZXR1cm4gdGhpc31nZXRDb21wb25lbnQodCl7c3dpdGNoKHQpe2Nhc2UgMDpyZXR1cm4gdGhpcy54O2Nhc2UgMTpyZXR1cm4gdGhpcy55O2Nhc2UgMjpyZXR1cm4gdGhpcy56O2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJpbmRleCBpcyBvdXQgb2YgcmFuZ2U6ICIrdCl9fWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMueCx0aGlzLnksdGhpcy56KX1jb3B5KHQpe3JldHVybiB0aGlzLng9dC54LHRoaXMueT10LnksdGhpcy56PXQueix0aGlzfWFkZCh0KXtyZXR1cm4gdGhpcy54Kz10LngsdGhpcy55Kz10LnksdGhpcy56Kz10LnosdGhpc31hZGRTY2FsYXIodCl7cmV0dXJuIHRoaXMueCs9dCx0aGlzLnkrPXQsdGhpcy56Kz10LHRoaXN9YWRkVmVjdG9ycyh0LGUpe3JldHVybiB0aGlzLng9dC54K2UueCx0aGlzLnk9dC55K2UueSx0aGlzLno9dC56K2Uueix0aGlzfWFkZFNjYWxlZFZlY3Rvcih0LGUpe3JldHVybiB0aGlzLngrPXQueCplLHRoaXMueSs9dC55KmUsdGhpcy56Kz10LnoqZSx0aGlzfXN1Yih0KXtyZXR1cm4gdGhpcy54LT10LngsdGhpcy55LT10LnksdGhpcy56LT10LnosdGhpc31zdWJTY2FsYXIodCl7cmV0dXJuIHRoaXMueC09dCx0aGlzLnktPXQsdGhpcy56LT10LHRoaXN9c3ViVmVjdG9ycyh0LGUpe3JldHVybiB0aGlzLng9dC54LWUueCx0aGlzLnk9dC55LWUueSx0aGlzLno9dC56LWUueix0aGlzfW11bHRpcGx5KHQpe3JldHVybiB0aGlzLngqPXQueCx0aGlzLnkqPXQueSx0aGlzLnoqPXQueix0aGlzfW11bHRpcGx5U2NhbGFyKHQpe3JldHVybiB0aGlzLngqPXQsdGhpcy55Kj10LHRoaXMueio9dCx0aGlzfW11bHRpcGx5VmVjdG9ycyh0LGUpe3JldHVybiB0aGlzLng9dC54KmUueCx0aGlzLnk9dC55KmUueSx0aGlzLno9dC56KmUueix0aGlzfWFwcGx5RXVsZXIodCl7cmV0dXJuIHRoaXMuYXBwbHlRdWF0ZXJuaW9uKGFyLnNldEZyb21FdWxlcih0KSl9YXBwbHlBeGlzQW5nbGUodCxlKXtyZXR1cm4gdGhpcy5hcHBseVF1YXRlcm5pb24oYXIuc2V0RnJvbUF4aXNBbmdsZSh0LGUpKX1hcHBseU1hdHJpeDModCl7Y29uc3QgZT10aGlzLngscz10aGlzLnksbj10aGlzLnosaT10LmVsZW1lbnRzO3JldHVybiB0aGlzLng9aVswXSplK2lbM10qcytpWzZdKm4sdGhpcy55PWlbMV0qZStpWzRdKnMraVs3XSpuLHRoaXMuej1pWzJdKmUraVs1XSpzK2lbOF0qbix0aGlzfWFwcGx5Tm9ybWFsTWF0cml4KHQpe3JldHVybiB0aGlzLmFwcGx5TWF0cml4Myh0KS5ub3JtYWxpemUoKX1hcHBseU1hdHJpeDQodCl7Y29uc3QgZT10aGlzLngscz10aGlzLnksbj10aGlzLnosaT10LmVsZW1lbnRzLG89MS8oaVszXSplK2lbN10qcytpWzExXSpuK2lbMTVdKTtyZXR1cm4gdGhpcy54PShpWzBdKmUraVs0XSpzK2lbOF0qbitpWzEyXSkqbyx0aGlzLnk9KGlbMV0qZStpWzVdKnMraVs5XSpuK2lbMTNdKSpvLHRoaXMuej0oaVsyXSplK2lbNl0qcytpWzEwXSpuK2lbMTRdKSpvLHRoaXN9YXBwbHlRdWF0ZXJuaW9uKHQpe2NvbnN0IGU9dGhpcy54LHM9dGhpcy55LG49dGhpcy56LGk9dC54LG89dC55LGE9dC56LGM9dC53LHU9MioobypuLWEqcyksaD0yKihhKmUtaSpuKSxsPTIqKGkqcy1vKmUpO3JldHVybiB0aGlzLng9ZStjKnUrbypsLWEqaCx0aGlzLnk9cytjKmgrYSp1LWkqbCx0aGlzLno9bitjKmwraSpoLW8qdSx0aGlzfXByb2plY3QodCl7cmV0dXJuIHRoaXMuYXBwbHlNYXRyaXg0KHQubWF0cml4V29ybGRJbnZlcnNlKS5hcHBseU1hdHJpeDQodC5wcm9qZWN0aW9uTWF0cml4KX11bnByb2plY3QodCl7cmV0dXJuIHRoaXMuYXBwbHlNYXRyaXg0KHQucHJvamVjdGlvbk1hdHJpeEludmVyc2UpLmFwcGx5TWF0cml4NCh0Lm1hdHJpeFdvcmxkKX10cmFuc2Zvcm1EaXJlY3Rpb24odCl7Y29uc3QgZT10aGlzLngscz10aGlzLnksbj10aGlzLnosaT10LmVsZW1lbnRzO3JldHVybiB0aGlzLng9aVswXSplK2lbNF0qcytpWzhdKm4sdGhpcy55PWlbMV0qZStpWzVdKnMraVs5XSpuLHRoaXMuej1pWzJdKmUraVs2XSpzK2lbMTBdKm4sdGhpcy5ub3JtYWxpemUoKX1kaXZpZGUodCl7cmV0dXJuIHRoaXMueC89dC54LHRoaXMueS89dC55LHRoaXMuei89dC56LHRoaXN9ZGl2aWRlU2NhbGFyKHQpe3JldHVybiB0aGlzLm11bHRpcGx5U2NhbGFyKDEvdCl9bWluKHQpe3JldHVybiB0aGlzLng9TWF0aC5taW4odGhpcy54LHQueCksdGhpcy55PU1hdGgubWluKHRoaXMueSx0LnkpLHRoaXMuej1NYXRoLm1pbih0aGlzLnosdC56KSx0aGlzfW1heCh0KXtyZXR1cm4gdGhpcy54PU1hdGgubWF4KHRoaXMueCx0LngpLHRoaXMueT1NYXRoLm1heCh0aGlzLnksdC55KSx0aGlzLno9TWF0aC5tYXgodGhpcy56LHQueiksdGhpc31jbGFtcCh0LGUpe3JldHVybiB0aGlzLng9TWF0aC5tYXgodC54LE1hdGgubWluKGUueCx0aGlzLngpKSx0aGlzLnk9TWF0aC5tYXgodC55LE1hdGgubWluKGUueSx0aGlzLnkpKSx0aGlzLno9TWF0aC5tYXgodC56LE1hdGgubWluKGUueix0aGlzLnopKSx0aGlzfWNsYW1wU2NhbGFyKHQsZSl7cmV0dXJuIHRoaXMueD1NYXRoLm1heCh0LE1hdGgubWluKGUsdGhpcy54KSksdGhpcy55PU1hdGgubWF4KHQsTWF0aC5taW4oZSx0aGlzLnkpKSx0aGlzLno9TWF0aC5tYXgodCxNYXRoLm1pbihlLHRoaXMueikpLHRoaXN9Y2xhbXBMZW5ndGgodCxlKXtjb25zdCBzPXRoaXMubGVuZ3RoKCk7cmV0dXJuIHRoaXMuZGl2aWRlU2NhbGFyKHN8fDEpLm11bHRpcGx5U2NhbGFyKE1hdGgubWF4KHQsTWF0aC5taW4oZSxzKSkpfWZsb29yKCl7cmV0dXJuIHRoaXMueD1NYXRoLmZsb29yKHRoaXMueCksdGhpcy55PU1hdGguZmxvb3IodGhpcy55KSx0aGlzLno9TWF0aC5mbG9vcih0aGlzLnopLHRoaXN9Y2VpbCgpe3JldHVybiB0aGlzLng9TWF0aC5jZWlsKHRoaXMueCksdGhpcy55PU1hdGguY2VpbCh0aGlzLnkpLHRoaXMuej1NYXRoLmNlaWwodGhpcy56KSx0aGlzfXJvdW5kKCl7cmV0dXJuIHRoaXMueD1NYXRoLnJvdW5kKHRoaXMueCksdGhpcy55PU1hdGgucm91bmQodGhpcy55KSx0aGlzLno9TWF0aC5yb3VuZCh0aGlzLnopLHRoaXN9cm91bmRUb1plcm8oKXtyZXR1cm4gdGhpcy54PU1hdGgudHJ1bmModGhpcy54KSx0aGlzLnk9TWF0aC50cnVuYyh0aGlzLnkpLHRoaXMuej1NYXRoLnRydW5jKHRoaXMueiksdGhpc31uZWdhdGUoKXtyZXR1cm4gdGhpcy54PS10aGlzLngsdGhpcy55PS10aGlzLnksdGhpcy56PS10aGlzLnosdGhpc31kb3QodCl7cmV0dXJuIHRoaXMueCp0LngrdGhpcy55KnQueSt0aGlzLnoqdC56fWxlbmd0aFNxKCl7cmV0dXJuIHRoaXMueCp0aGlzLngrdGhpcy55KnRoaXMueSt0aGlzLnoqdGhpcy56fWxlbmd0aCgpe3JldHVybiBNYXRoLnNxcnQodGhpcy54KnRoaXMueCt0aGlzLnkqdGhpcy55K3RoaXMueip0aGlzLnopfW1hbmhhdHRhbkxlbmd0aCgpe3JldHVybiBNYXRoLmFicyh0aGlzLngpK01hdGguYWJzKHRoaXMueSkrTWF0aC5hYnModGhpcy56KX1ub3JtYWxpemUoKXtyZXR1cm4gdGhpcy5kaXZpZGVTY2FsYXIodGhpcy5sZW5ndGgoKXx8MSl9c2V0TGVuZ3RoKHQpe3JldHVybiB0aGlzLm5vcm1hbGl6ZSgpLm11bHRpcGx5U2NhbGFyKHQpfWxlcnAodCxlKXtyZXR1cm4gdGhpcy54Kz0odC54LXRoaXMueCkqZSx0aGlzLnkrPSh0LnktdGhpcy55KSplLHRoaXMueis9KHQuei10aGlzLnopKmUsdGhpc31sZXJwVmVjdG9ycyh0LGUscyl7cmV0dXJuIHRoaXMueD10LngrKGUueC10LngpKnMsdGhpcy55PXQueSsoZS55LXQueSkqcyx0aGlzLno9dC56KyhlLnotdC56KSpzLHRoaXN9Y3Jvc3ModCl7cmV0dXJuIHRoaXMuY3Jvc3NWZWN0b3JzKHRoaXMsdCl9Y3Jvc3NWZWN0b3JzKHQsZSl7Y29uc3Qgcz10Lngsbj10LnksaT10Lnosbz1lLngsYT1lLnksYz1lLno7cmV0dXJuIHRoaXMueD1uKmMtaSphLHRoaXMueT1pKm8tcypjLHRoaXMuej1zKmEtbipvLHRoaXN9cHJvamVjdE9uVmVjdG9yKHQpe2NvbnN0IGU9dC5sZW5ndGhTcSgpO2lmKGU9PT0wKXJldHVybiB0aGlzLnNldCgwLDAsMCk7Y29uc3Qgcz10LmRvdCh0aGlzKS9lO3JldHVybiB0aGlzLmNvcHkodCkubXVsdGlwbHlTY2FsYXIocyl9cHJvamVjdE9uUGxhbmUodCl7cmV0dXJuIFJuLmNvcHkodGhpcykucHJvamVjdE9uVmVjdG9yKHQpLHRoaXMuc3ViKFJuKX1yZWZsZWN0KHQpe3JldHVybiB0aGlzLnN1YihSbi5jb3B5KHQpLm11bHRpcGx5U2NhbGFyKDIqdGhpcy5kb3QodCkpKX1hbmdsZVRvKHQpe2NvbnN0IGU9TWF0aC5zcXJ0KHRoaXMubGVuZ3RoU3EoKSp0Lmxlbmd0aFNxKCkpO2lmKGU9PT0wKXJldHVybiBNYXRoLlBJLzI7Y29uc3Qgcz10aGlzLmRvdCh0KS9lO3JldHVybiBNYXRoLmFjb3MoYXQocywtMSwxKSl9ZGlzdGFuY2VUbyh0KXtyZXR1cm4gTWF0aC5zcXJ0KHRoaXMuZGlzdGFuY2VUb1NxdWFyZWQodCkpfWRpc3RhbmNlVG9TcXVhcmVkKHQpe2NvbnN0IGU9dGhpcy54LXQueCxzPXRoaXMueS10Lnksbj10aGlzLnotdC56O3JldHVybiBlKmUrcypzK24qbn1tYW5oYXR0YW5EaXN0YW5jZVRvKHQpe3JldHVybiBNYXRoLmFicyh0aGlzLngtdC54KStNYXRoLmFicyh0aGlzLnktdC55KStNYXRoLmFicyh0aGlzLnotdC56KX1zZXRGcm9tU3BoZXJpY2FsKHQpe3JldHVybiB0aGlzLnNldEZyb21TcGhlcmljYWxDb29yZHModC5yYWRpdXMsdC5waGksdC50aGV0YSl9c2V0RnJvbVNwaGVyaWNhbENvb3Jkcyh0LGUscyl7Y29uc3Qgbj1NYXRoLnNpbihlKSp0O3JldHVybiB0aGlzLng9bipNYXRoLnNpbihzKSx0aGlzLnk9TWF0aC5jb3MoZSkqdCx0aGlzLno9bipNYXRoLmNvcyhzKSx0aGlzfXNldEZyb21DeWxpbmRyaWNhbCh0KXtyZXR1cm4gdGhpcy5zZXRGcm9tQ3lsaW5kcmljYWxDb29yZHModC5yYWRpdXMsdC50aGV0YSx0LnkpfXNldEZyb21DeWxpbmRyaWNhbENvb3Jkcyh0LGUscyl7cmV0dXJuIHRoaXMueD10Kk1hdGguc2luKGUpLHRoaXMueT1zLHRoaXMuej10Kk1hdGguY29zKGUpLHRoaXN9c2V0RnJvbU1hdHJpeFBvc2l0aW9uKHQpe2NvbnN0IGU9dC5lbGVtZW50cztyZXR1cm4gdGhpcy54PWVbMTJdLHRoaXMueT1lWzEzXSx0aGlzLno9ZVsxNF0sdGhpc31zZXRGcm9tTWF0cml4U2NhbGUodCl7Y29uc3QgZT10aGlzLnNldEZyb21NYXRyaXhDb2x1bW4odCwwKS5sZW5ndGgoKSxzPXRoaXMuc2V0RnJvbU1hdHJpeENvbHVtbih0LDEpLmxlbmd0aCgpLG49dGhpcy5zZXRGcm9tTWF0cml4Q29sdW1uKHQsMikubGVuZ3RoKCk7cmV0dXJuIHRoaXMueD1lLHRoaXMueT1zLHRoaXMuej1uLHRoaXN9c2V0RnJvbU1hdHJpeENvbHVtbih0LGUpe3JldHVybiB0aGlzLmZyb21BcnJheSh0LmVsZW1lbnRzLGUqNCl9c2V0RnJvbU1hdHJpeDNDb2x1bW4odCxlKXtyZXR1cm4gdGhpcy5mcm9tQXJyYXkodC5lbGVtZW50cyxlKjMpfXNldEZyb21FdWxlcih0KXtyZXR1cm4gdGhpcy54PXQuX3gsdGhpcy55PXQuX3ksdGhpcy56PXQuX3osdGhpc31zZXRGcm9tQ29sb3IodCl7cmV0dXJuIHRoaXMueD10LnIsdGhpcy55PXQuZyx0aGlzLno9dC5iLHRoaXN9ZXF1YWxzKHQpe3JldHVybiB0Lng9PT10aGlzLngmJnQueT09PXRoaXMueSYmdC56PT09dGhpcy56fWZyb21BcnJheSh0LGU9MCl7cmV0dXJuIHRoaXMueD10W2VdLHRoaXMueT10W2UrMV0sdGhpcy56PXRbZSsyXSx0aGlzfXRvQXJyYXkodD1bXSxlPTApe3JldHVybiB0W2VdPXRoaXMueCx0W2UrMV09dGhpcy55LHRbZSsyXT10aGlzLnosdH1mcm9tQnVmZmVyQXR0cmlidXRlKHQsZSl7cmV0dXJuIHRoaXMueD10LmdldFgoZSksdGhpcy55PXQuZ2V0WShlKSx0aGlzLno9dC5nZXRaKGUpLHRoaXN9cmFuZG9tKCl7cmV0dXJuIHRoaXMueD1NYXRoLnJhbmRvbSgpLHRoaXMueT1NYXRoLnJhbmRvbSgpLHRoaXMuej1NYXRoLnJhbmRvbSgpLHRoaXN9cmFuZG9tRGlyZWN0aW9uKCl7Y29uc3QgdD1NYXRoLnJhbmRvbSgpKk1hdGguUEkqMixlPU1hdGgucmFuZG9tKCkqMi0xLHM9TWF0aC5zcXJ0KDEtZSplKTtyZXR1cm4gdGhpcy54PXMqTWF0aC5jb3ModCksdGhpcy55PWUsdGhpcy56PXMqTWF0aC5zaW4odCksdGhpc30qW1N5bWJvbC5pdGVyYXRvcl0oKXt5aWVsZCB0aGlzLngseWllbGQgdGhpcy55LHlpZWxkIHRoaXMuen19Y29uc3QgUm49bmV3IEEsYXI9bmV3IFFlO2NsYXNzIGh0e2NvbnN0cnVjdG9yKHQ9bmV3IEEoMS8wLDEvMCwxLzApLGU9bmV3IEEoLTEvMCwtMS8wLC0xLzApKXt0aGlzLmlzQm94Mz0hMCx0aGlzLm1pbj10LHRoaXMubWF4PWV9c2V0KHQsZSl7cmV0dXJuIHRoaXMubWluLmNvcHkodCksdGhpcy5tYXguY29weShlKSx0aGlzfXNldEZyb21BcnJheSh0KXt0aGlzLm1ha2VFbXB0eSgpO2ZvcihsZXQgZT0wLHM9dC5sZW5ndGg7ZTxzO2UrPTMpdGhpcy5leHBhbmRCeVBvaW50KFJ0LmZyb21BcnJheSh0LGUpKTtyZXR1cm4gdGhpc31zZXRGcm9tQnVmZmVyQXR0cmlidXRlKHQpe3RoaXMubWFrZUVtcHR5KCk7Zm9yKGxldCBlPTAscz10LmNvdW50O2U8cztlKyspdGhpcy5leHBhbmRCeVBvaW50KFJ0LmZyb21CdWZmZXJBdHRyaWJ1dGUodCxlKSk7cmV0dXJuIHRoaXN9c2V0RnJvbVBvaW50cyh0KXt0aGlzLm1ha2VFbXB0eSgpO2ZvcihsZXQgZT0wLHM9dC5sZW5ndGg7ZTxzO2UrKyl0aGlzLmV4cGFuZEJ5UG9pbnQodFtlXSk7cmV0dXJuIHRoaXN9c2V0RnJvbUNlbnRlckFuZFNpemUodCxlKXtjb25zdCBzPVJ0LmNvcHkoZSkubXVsdGlwbHlTY2FsYXIoLjUpO3JldHVybiB0aGlzLm1pbi5jb3B5KHQpLnN1YihzKSx0aGlzLm1heC5jb3B5KHQpLmFkZChzKSx0aGlzfXNldEZyb21PYmplY3QodCxlPSExKXtyZXR1cm4gdGhpcy5tYWtlRW1wdHkoKSx0aGlzLmV4cGFuZEJ5T2JqZWN0KHQsZSl9Y2xvbmUoKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KHRoaXMpfWNvcHkodCl7cmV0dXJuIHRoaXMubWluLmNvcHkodC5taW4pLHRoaXMubWF4LmNvcHkodC5tYXgpLHRoaXN9bWFrZUVtcHR5KCl7cmV0dXJuIHRoaXMubWluLng9dGhpcy5taW4ueT10aGlzLm1pbi56PTEvMCx0aGlzLm1heC54PXRoaXMubWF4Lnk9dGhpcy5tYXguej0tMS8wLHRoaXN9aXNFbXB0eSgpe3JldHVybiB0aGlzLm1heC54PHRoaXMubWluLnh8fHRoaXMubWF4Lnk8dGhpcy5taW4ueXx8dGhpcy5tYXguejx0aGlzLm1pbi56fWdldENlbnRlcih0KXtyZXR1cm4gdGhpcy5pc0VtcHR5KCk/dC5zZXQoMCwwLDApOnQuYWRkVmVjdG9ycyh0aGlzLm1pbix0aGlzLm1heCkubXVsdGlwbHlTY2FsYXIoLjUpfWdldFNpemUodCl7cmV0dXJuIHRoaXMuaXNFbXB0eSgpP3Quc2V0KDAsMCwwKTp0LnN1YlZlY3RvcnModGhpcy5tYXgsdGhpcy5taW4pfWV4cGFuZEJ5UG9pbnQodCl7cmV0dXJuIHRoaXMubWluLm1pbih0KSx0aGlzLm1heC5tYXgodCksdGhpc31leHBhbmRCeVZlY3Rvcih0KXtyZXR1cm4gdGhpcy5taW4uc3ViKHQpLHRoaXMubWF4LmFkZCh0KSx0aGlzfWV4cGFuZEJ5U2NhbGFyKHQpe3JldHVybiB0aGlzLm1pbi5hZGRTY2FsYXIoLXQpLHRoaXMubWF4LmFkZFNjYWxhcih0KSx0aGlzfWV4cGFuZEJ5T2JqZWN0KHQsZT0hMSl7dC51cGRhdGVXb3JsZE1hdHJpeCghMSwhMSk7Y29uc3Qgcz10Lmdlb21ldHJ5O2lmKHMhPT12b2lkIDApe2NvbnN0IGk9cy5nZXRBdHRyaWJ1dGUoInBvc2l0aW9uIik7aWYoZT09PSEwJiZpIT09dm9pZCAwJiZ0LmlzSW5zdGFuY2VkTWVzaCE9PSEwKWZvcihsZXQgbz0wLGE9aS5jb3VudDtvPGE7bysrKXQuaXNNZXNoPT09ITA/dC5nZXRWZXJ0ZXhQb3NpdGlvbihvLFJ0KTpSdC5mcm9tQnVmZmVyQXR0cmlidXRlKGksbyksUnQuYXBwbHlNYXRyaXg0KHQubWF0cml4V29ybGQpLHRoaXMuZXhwYW5kQnlQb2ludChSdCk7ZWxzZSB0LmJvdW5kaW5nQm94IT09dm9pZCAwPyh0LmJvdW5kaW5nQm94PT09bnVsbCYmdC5jb21wdXRlQm91bmRpbmdCb3goKSxGcy5jb3B5KHQuYm91bmRpbmdCb3gpKToocy5ib3VuZGluZ0JveD09PW51bGwmJnMuY29tcHV0ZUJvdW5kaW5nQm94KCksRnMuY29weShzLmJvdW5kaW5nQm94KSksRnMuYXBwbHlNYXRyaXg0KHQubWF0cml4V29ybGQpLHRoaXMudW5pb24oRnMpfWNvbnN0IG49dC5jaGlsZHJlbjtmb3IobGV0IGk9MCxvPW4ubGVuZ3RoO2k8bztpKyspdGhpcy5leHBhbmRCeU9iamVjdChuW2ldLGUpO3JldHVybiB0aGlzfWNvbnRhaW5zUG9pbnQodCl7cmV0dXJuIHQueD49dGhpcy5taW4ueCYmdC54PD10aGlzLm1heC54JiZ0Lnk+PXRoaXMubWluLnkmJnQueTw9dGhpcy5tYXgueSYmdC56Pj10aGlzLm1pbi56JiZ0Lno8PXRoaXMubWF4Lnp9Y29udGFpbnNCb3godCl7cmV0dXJuIHRoaXMubWluLng8PXQubWluLngmJnQubWF4Lng8PXRoaXMubWF4LngmJnRoaXMubWluLnk8PXQubWluLnkmJnQubWF4Lnk8PXRoaXMubWF4LnkmJnRoaXMubWluLno8PXQubWluLnomJnQubWF4Lno8PXRoaXMubWF4Lnp9Z2V0UGFyYW1ldGVyKHQsZSl7cmV0dXJuIGUuc2V0KCh0LngtdGhpcy5taW4ueCkvKHRoaXMubWF4LngtdGhpcy5taW4ueCksKHQueS10aGlzLm1pbi55KS8odGhpcy5tYXgueS10aGlzLm1pbi55KSwodC56LXRoaXMubWluLnopLyh0aGlzLm1heC56LXRoaXMubWluLnopKX1pbnRlcnNlY3RzQm94KHQpe3JldHVybiB0Lm1heC54Pj10aGlzLm1pbi54JiZ0Lm1pbi54PD10aGlzLm1heC54JiZ0Lm1heC55Pj10aGlzLm1pbi55JiZ0Lm1pbi55PD10aGlzLm1heC55JiZ0Lm1heC56Pj10aGlzLm1pbi56JiZ0Lm1pbi56PD10aGlzLm1heC56fWludGVyc2VjdHNTcGhlcmUodCl7cmV0dXJuIHRoaXMuY2xhbXBQb2ludCh0LmNlbnRlcixSdCksUnQuZGlzdGFuY2VUb1NxdWFyZWQodC5jZW50ZXIpPD10LnJhZGl1cyp0LnJhZGl1c31pbnRlcnNlY3RzUGxhbmUodCl7bGV0IGUscztyZXR1cm4gdC5ub3JtYWwueD4wPyhlPXQubm9ybWFsLngqdGhpcy5taW4ueCxzPXQubm9ybWFsLngqdGhpcy5tYXgueCk6KGU9dC5ub3JtYWwueCp0aGlzLm1heC54LHM9dC5ub3JtYWwueCp0aGlzLm1pbi54KSx0Lm5vcm1hbC55PjA/KGUrPXQubm9ybWFsLnkqdGhpcy5taW4ueSxzKz10Lm5vcm1hbC55KnRoaXMubWF4LnkpOihlKz10Lm5vcm1hbC55KnRoaXMubWF4Lnkscys9dC5ub3JtYWwueSp0aGlzLm1pbi55KSx0Lm5vcm1hbC56PjA/KGUrPXQubm9ybWFsLnoqdGhpcy5taW4ueixzKz10Lm5vcm1hbC56KnRoaXMubWF4LnopOihlKz10Lm5vcm1hbC56KnRoaXMubWF4Lnoscys9dC5ub3JtYWwueip0aGlzLm1pbi56KSxlPD0tdC5jb25zdGFudCYmcz49LXQuY29uc3RhbnR9aW50ZXJzZWN0c1RyaWFuZ2xlKHQpe2lmKHRoaXMuaXNFbXB0eSgpKXJldHVybiExO3RoaXMuZ2V0Q2VudGVyKEtlKSxScy5zdWJWZWN0b3JzKHRoaXMubWF4LEtlKSxOZS5zdWJWZWN0b3JzKHQuYSxLZSksd2Uuc3ViVmVjdG9ycyh0LmIsS2UpLEFlLnN1YlZlY3RvcnModC5jLEtlKSx0ZS5zdWJWZWN0b3JzKHdlLE5lKSxlZS5zdWJWZWN0b3JzKEFlLHdlKSx1ZS5zdWJWZWN0b3JzKE5lLEFlKTtsZXQgZT1bMCwtdGUueix0ZS55LDAsLWVlLnosZWUueSwwLC11ZS56LHVlLnksdGUueiwwLC10ZS54LGVlLnosMCwtZWUueCx1ZS56LDAsLXVlLngsLXRlLnksdGUueCwwLC1lZS55LGVlLngsMCwtdWUueSx1ZS54LDBdO3JldHVybiFCbihlLE5lLHdlLEFlLFJzKXx8KGU9WzEsMCwwLDAsMSwwLDAsMCwxXSwhQm4oZSxOZSx3ZSxBZSxScykpPyExOihCcy5jcm9zc1ZlY3RvcnModGUsZWUpLGU9W0JzLngsQnMueSxCcy56XSxCbihlLE5lLHdlLEFlLFJzKSl9Y2xhbXBQb2ludCh0LGUpe3JldHVybiBlLmNvcHkodCkuY2xhbXAodGhpcy5taW4sdGhpcy5tYXgpfWRpc3RhbmNlVG9Qb2ludCh0KXtyZXR1cm4gdGhpcy5jbGFtcFBvaW50KHQsUnQpLmRpc3RhbmNlVG8odCl9Z2V0Qm91bmRpbmdTcGhlcmUodCl7cmV0dXJuIHRoaXMuaXNFbXB0eSgpP3QubWFrZUVtcHR5KCk6KHRoaXMuZ2V0Q2VudGVyKHQuY2VudGVyKSx0LnJhZGl1cz10aGlzLmdldFNpemUoUnQpLmxlbmd0aCgpKi41KSx0fWludGVyc2VjdCh0KXtyZXR1cm4gdGhpcy5taW4ubWF4KHQubWluKSx0aGlzLm1heC5taW4odC5tYXgpLHRoaXMuaXNFbXB0eSgpJiZ0aGlzLm1ha2VFbXB0eSgpLHRoaXN9dW5pb24odCl7cmV0dXJuIHRoaXMubWluLm1pbih0Lm1pbiksdGhpcy5tYXgubWF4KHQubWF4KSx0aGlzfWFwcGx5TWF0cml4NCh0KXtyZXR1cm4gdGhpcy5pc0VtcHR5KCk/dGhpczooR3RbMF0uc2V0KHRoaXMubWluLngsdGhpcy5taW4ueSx0aGlzLm1pbi56KS5hcHBseU1hdHJpeDQodCksR3RbMV0uc2V0KHRoaXMubWluLngsdGhpcy5taW4ueSx0aGlzLm1heC56KS5hcHBseU1hdHJpeDQodCksR3RbMl0uc2V0KHRoaXMubWluLngsdGhpcy5tYXgueSx0aGlzLm1pbi56KS5hcHBseU1hdHJpeDQodCksR3RbM10uc2V0KHRoaXMubWluLngsdGhpcy5tYXgueSx0aGlzLm1heC56KS5hcHBseU1hdHJpeDQodCksR3RbNF0uc2V0KHRoaXMubWF4LngsdGhpcy5taW4ueSx0aGlzLm1pbi56KS5hcHBseU1hdHJpeDQodCksR3RbNV0uc2V0KHRoaXMubWF4LngsdGhpcy5taW4ueSx0aGlzLm1heC56KS5hcHBseU1hdHJpeDQodCksR3RbNl0uc2V0KHRoaXMubWF4LngsdGhpcy5tYXgueSx0aGlzLm1pbi56KS5hcHBseU1hdHJpeDQodCksR3RbN10uc2V0KHRoaXMubWF4LngsdGhpcy5tYXgueSx0aGlzLm1heC56KS5hcHBseU1hdHJpeDQodCksdGhpcy5zZXRGcm9tUG9pbnRzKEd0KSx0aGlzKX10cmFuc2xhdGUodCl7cmV0dXJuIHRoaXMubWluLmFkZCh0KSx0aGlzLm1heC5hZGQodCksdGhpc31lcXVhbHModCl7cmV0dXJuIHQubWluLmVxdWFscyh0aGlzLm1pbikmJnQubWF4LmVxdWFscyh0aGlzLm1heCl9fWNvbnN0IEd0PVtuZXcgQSxuZXcgQSxuZXcgQSxuZXcgQSxuZXcgQSxuZXcgQSxuZXcgQSxuZXcgQV0sUnQ9bmV3IEEsRnM9bmV3IGh0LE5lPW5ldyBBLHdlPW5ldyBBLEFlPW5ldyBBLHRlPW5ldyBBLGVlPW5ldyBBLHVlPW5ldyBBLEtlPW5ldyBBLFJzPW5ldyBBLEJzPW5ldyBBLGxlPW5ldyBBO2Z1bmN0aW9uIEJuKHIsdCxlLHMsbil7Zm9yKGxldCBpPTAsbz1yLmxlbmd0aC0zO2k8PW87aSs9Myl7bGUuZnJvbUFycmF5KHIsaSk7Y29uc3QgYT1uLngqTWF0aC5hYnMobGUueCkrbi55Kk1hdGguYWJzKGxlLnkpK24ueipNYXRoLmFicyhsZS56KSxjPXQuZG90KGxlKSx1PWUuZG90KGxlKSxoPXMuZG90KGxlKTtpZihNYXRoLm1heCgtTWF0aC5tYXgoYyx1LGgpLE1hdGgubWluKGMsdSxoKSk+YSlyZXR1cm4hMX1yZXR1cm4hMH1jb25zdCBhYT1uZXcgaHQsdHM9bmV3IEEsSW49bmV3IEE7Y2xhc3MgY3J7Y29uc3RydWN0b3IodD1uZXcgQSxlPS0xKXt0aGlzLmlzU3BoZXJlPSEwLHRoaXMuY2VudGVyPXQsdGhpcy5yYWRpdXM9ZX1zZXQodCxlKXtyZXR1cm4gdGhpcy5jZW50ZXIuY29weSh0KSx0aGlzLnJhZGl1cz1lLHRoaXN9c2V0RnJvbVBvaW50cyh0LGUpe2NvbnN0IHM9dGhpcy5jZW50ZXI7ZSE9PXZvaWQgMD9zLmNvcHkoZSk6YWEuc2V0RnJvbVBvaW50cyh0KS5nZXRDZW50ZXIocyk7bGV0IG49MDtmb3IobGV0IGk9MCxvPXQubGVuZ3RoO2k8bztpKyspbj1NYXRoLm1heChuLHMuZGlzdGFuY2VUb1NxdWFyZWQodFtpXSkpO3JldHVybiB0aGlzLnJhZGl1cz1NYXRoLnNxcnQobiksdGhpc31jb3B5KHQpe3JldHVybiB0aGlzLmNlbnRlci5jb3B5KHQuY2VudGVyKSx0aGlzLnJhZGl1cz10LnJhZGl1cyx0aGlzfWlzRW1wdHkoKXtyZXR1cm4gdGhpcy5yYWRpdXM8MH1tYWtlRW1wdHkoKXtyZXR1cm4gdGhpcy5jZW50ZXIuc2V0KDAsMCwwKSx0aGlzLnJhZGl1cz0tMSx0aGlzfWNvbnRhaW5zUG9pbnQodCl7cmV0dXJuIHQuZGlzdGFuY2VUb1NxdWFyZWQodGhpcy5jZW50ZXIpPD10aGlzLnJhZGl1cyp0aGlzLnJhZGl1c31kaXN0YW5jZVRvUG9pbnQodCl7cmV0dXJuIHQuZGlzdGFuY2VUbyh0aGlzLmNlbnRlciktdGhpcy5yYWRpdXN9aW50ZXJzZWN0c1NwaGVyZSh0KXtjb25zdCBlPXRoaXMucmFkaXVzK3QucmFkaXVzO3JldHVybiB0LmNlbnRlci5kaXN0YW5jZVRvU3F1YXJlZCh0aGlzLmNlbnRlcik8PWUqZX1pbnRlcnNlY3RzQm94KHQpe3JldHVybiB0LmludGVyc2VjdHNTcGhlcmUodGhpcyl9aW50ZXJzZWN0c1BsYW5lKHQpe3JldHVybiBNYXRoLmFicyh0LmRpc3RhbmNlVG9Qb2ludCh0aGlzLmNlbnRlcikpPD10aGlzLnJhZGl1c31jbGFtcFBvaW50KHQsZSl7Y29uc3Qgcz10aGlzLmNlbnRlci5kaXN0YW5jZVRvU3F1YXJlZCh0KTtyZXR1cm4gZS5jb3B5KHQpLHM+dGhpcy5yYWRpdXMqdGhpcy5yYWRpdXMmJihlLnN1Yih0aGlzLmNlbnRlcikubm9ybWFsaXplKCksZS5tdWx0aXBseVNjYWxhcih0aGlzLnJhZGl1cykuYWRkKHRoaXMuY2VudGVyKSksZX1nZXRCb3VuZGluZ0JveCh0KXtyZXR1cm4gdGhpcy5pc0VtcHR5KCk/KHQubWFrZUVtcHR5KCksdCk6KHQuc2V0KHRoaXMuY2VudGVyLHRoaXMuY2VudGVyKSx0LmV4cGFuZEJ5U2NhbGFyKHRoaXMucmFkaXVzKSx0KX1hcHBseU1hdHJpeDQodCl7cmV0dXJuIHRoaXMuY2VudGVyLmFwcGx5TWF0cml4NCh0KSx0aGlzLnJhZGl1cz10aGlzLnJhZGl1cyp0LmdldE1heFNjYWxlT25BeGlzKCksdGhpc310cmFuc2xhdGUodCl7cmV0dXJuIHRoaXMuY2VudGVyLmFkZCh0KSx0aGlzfWV4cGFuZEJ5UG9pbnQodCl7aWYodGhpcy5pc0VtcHR5KCkpcmV0dXJuIHRoaXMuY2VudGVyLmNvcHkodCksdGhpcy5yYWRpdXM9MCx0aGlzO3RzLnN1YlZlY3RvcnModCx0aGlzLmNlbnRlcik7Y29uc3QgZT10cy5sZW5ndGhTcSgpO2lmKGU+dGhpcy5yYWRpdXMqdGhpcy5yYWRpdXMpe2NvbnN0IHM9TWF0aC5zcXJ0KGUpLG49KHMtdGhpcy5yYWRpdXMpKi41O3RoaXMuY2VudGVyLmFkZFNjYWxlZFZlY3Rvcih0cyxuL3MpLHRoaXMucmFkaXVzKz1ufXJldHVybiB0aGlzfXVuaW9uKHQpe3JldHVybiB0LmlzRW1wdHkoKT90aGlzOnRoaXMuaXNFbXB0eSgpPyh0aGlzLmNvcHkodCksdGhpcyk6KHRoaXMuY2VudGVyLmVxdWFscyh0LmNlbnRlcik9PT0hMD90aGlzLnJhZGl1cz1NYXRoLm1heCh0aGlzLnJhZGl1cyx0LnJhZGl1cyk6KEluLnN1YlZlY3RvcnModC5jZW50ZXIsdGhpcy5jZW50ZXIpLnNldExlbmd0aCh0LnJhZGl1cyksdGhpcy5leHBhbmRCeVBvaW50KHRzLmNvcHkodC5jZW50ZXIpLmFkZChJbikpLHRoaXMuZXhwYW5kQnlQb2ludCh0cy5jb3B5KHQuY2VudGVyKS5zdWIoSW4pKSksdGhpcyl9ZXF1YWxzKHQpe3JldHVybiB0LmNlbnRlci5lcXVhbHModGhpcy5jZW50ZXIpJiZ0LnJhZGl1cz09PXRoaXMucmFkaXVzfWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSh0aGlzKX19Y2xhc3MgbnR7Y29uc3RydWN0b3IodCxlLHMsbixpLG8sYSxjLHUsaCxsLGQsZixwLG0sZyl7bnQucHJvdG90eXBlLmlzTWF0cml4ND0hMCx0aGlzLmVsZW1lbnRzPVsxLDAsMCwwLDAsMSwwLDAsMCwwLDEsMCwwLDAsMCwxXSx0IT09dm9pZCAwJiZ0aGlzLnNldCh0LGUscyxuLGksbyxhLGMsdSxoLGwsZCxmLHAsbSxnKX1zZXQodCxlLHMsbixpLG8sYSxjLHUsaCxsLGQsZixwLG0sZyl7Y29uc3QgeT10aGlzLmVsZW1lbnRzO3JldHVybiB5WzBdPXQseVs0XT1lLHlbOF09cyx5WzEyXT1uLHlbMV09aSx5WzVdPW8seVs5XT1hLHlbMTNdPWMseVsyXT11LHlbNl09aCx5WzEwXT1sLHlbMTRdPWQseVszXT1mLHlbN109cCx5WzExXT1tLHlbMTVdPWcsdGhpc31pZGVudGl0eSgpe3JldHVybiB0aGlzLnNldCgxLDAsMCwwLDAsMSwwLDAsMCwwLDEsMCwwLDAsMCwxKSx0aGlzfWNsb25lKCl7cmV0dXJuIG5ldyBudCgpLmZyb21BcnJheSh0aGlzLmVsZW1lbnRzKX1jb3B5KHQpe2NvbnN0IGU9dGhpcy5lbGVtZW50cyxzPXQuZWxlbWVudHM7cmV0dXJuIGVbMF09c1swXSxlWzFdPXNbMV0sZVsyXT1zWzJdLGVbM109c1szXSxlWzRdPXNbNF0sZVs1XT1zWzVdLGVbNl09c1s2XSxlWzddPXNbN10sZVs4XT1zWzhdLGVbOV09c1s5XSxlWzEwXT1zWzEwXSxlWzExXT1zWzExXSxlWzEyXT1zWzEyXSxlWzEzXT1zWzEzXSxlWzE0XT1zWzE0XSxlWzE1XT1zWzE1XSx0aGlzfWNvcHlQb3NpdGlvbih0KXtjb25zdCBlPXRoaXMuZWxlbWVudHMscz10LmVsZW1lbnRzO3JldHVybiBlWzEyXT1zWzEyXSxlWzEzXT1zWzEzXSxlWzE0XT1zWzE0XSx0aGlzfXNldEZyb21NYXRyaXgzKHQpe2NvbnN0IGU9dC5lbGVtZW50cztyZXR1cm4gdGhpcy5zZXQoZVswXSxlWzNdLGVbNl0sMCxlWzFdLGVbNF0sZVs3XSwwLGVbMl0sZVs1XSxlWzhdLDAsMCwwLDAsMSksdGhpc31leHRyYWN0QmFzaXModCxlLHMpe3JldHVybiB0LnNldEZyb21NYXRyaXhDb2x1bW4odGhpcywwKSxlLnNldEZyb21NYXRyaXhDb2x1bW4odGhpcywxKSxzLnNldEZyb21NYXRyaXhDb2x1bW4odGhpcywyKSx0aGlzfW1ha2VCYXNpcyh0LGUscyl7cmV0dXJuIHRoaXMuc2V0KHQueCxlLngscy54LDAsdC55LGUueSxzLnksMCx0LnosZS56LHMueiwwLDAsMCwwLDEpLHRoaXN9ZXh0cmFjdFJvdGF0aW9uKHQpe2NvbnN0IGU9dGhpcy5lbGVtZW50cyxzPXQuZWxlbWVudHMsbj0xL01lLnNldEZyb21NYXRyaXhDb2x1bW4odCwwKS5sZW5ndGgoKSxpPTEvTWUuc2V0RnJvbU1hdHJpeENvbHVtbih0LDEpLmxlbmd0aCgpLG89MS9NZS5zZXRGcm9tTWF0cml4Q29sdW1uKHQsMikubGVuZ3RoKCk7cmV0dXJuIGVbMF09c1swXSpuLGVbMV09c1sxXSpuLGVbMl09c1syXSpuLGVbM109MCxlWzRdPXNbNF0qaSxlWzVdPXNbNV0qaSxlWzZdPXNbNl0qaSxlWzddPTAsZVs4XT1zWzhdKm8sZVs5XT1zWzldKm8sZVsxMF09c1sxMF0qbyxlWzExXT0wLGVbMTJdPTAsZVsxM109MCxlWzE0XT0wLGVbMTVdPTEsdGhpc31tYWtlUm90YXRpb25Gcm9tRXVsZXIodCl7Y29uc3QgZT10aGlzLmVsZW1lbnRzLHM9dC54LG49dC55LGk9dC56LG89TWF0aC5jb3MocyksYT1NYXRoLnNpbihzKSxjPU1hdGguY29zKG4pLHU9TWF0aC5zaW4obiksaD1NYXRoLmNvcyhpKSxsPU1hdGguc2luKGkpO2lmKHQub3JkZXI9PT0iWFlaIil7Y29uc3QgZD1vKmgsZj1vKmwscD1hKmgsbT1hKmw7ZVswXT1jKmgsZVs0XT0tYypsLGVbOF09dSxlWzFdPWYrcCp1LGVbNV09ZC1tKnUsZVs5XT0tYSpjLGVbMl09bS1kKnUsZVs2XT1wK2YqdSxlWzEwXT1vKmN9ZWxzZSBpZih0Lm9yZGVyPT09IllYWiIpe2NvbnN0IGQ9YypoLGY9YypsLHA9dSpoLG09dSpsO2VbMF09ZCttKmEsZVs0XT1wKmEtZixlWzhdPW8qdSxlWzFdPW8qbCxlWzVdPW8qaCxlWzldPS1hLGVbMl09ZiphLXAsZVs2XT1tK2QqYSxlWzEwXT1vKmN9ZWxzZSBpZih0Lm9yZGVyPT09IlpYWSIpe2NvbnN0IGQ9YypoLGY9YypsLHA9dSpoLG09dSpsO2VbMF09ZC1tKmEsZVs0XT0tbypsLGVbOF09cCtmKmEsZVsxXT1mK3AqYSxlWzVdPW8qaCxlWzldPW0tZCphLGVbMl09LW8qdSxlWzZdPWEsZVsxMF09bypjfWVsc2UgaWYodC5vcmRlcj09PSJaWVgiKXtjb25zdCBkPW8qaCxmPW8qbCxwPWEqaCxtPWEqbDtlWzBdPWMqaCxlWzRdPXAqdS1mLGVbOF09ZCp1K20sZVsxXT1jKmwsZVs1XT1tKnUrZCxlWzldPWYqdS1wLGVbMl09LXUsZVs2XT1hKmMsZVsxMF09bypjfWVsc2UgaWYodC5vcmRlcj09PSJZWlgiKXtjb25zdCBkPW8qYyxmPW8qdSxwPWEqYyxtPWEqdTtlWzBdPWMqaCxlWzRdPW0tZCpsLGVbOF09cCpsK2YsZVsxXT1sLGVbNV09bypoLGVbOV09LWEqaCxlWzJdPS11KmgsZVs2XT1mKmwrcCxlWzEwXT1kLW0qbH1lbHNlIGlmKHQub3JkZXI9PT0iWFpZIil7Y29uc3QgZD1vKmMsZj1vKnUscD1hKmMsbT1hKnU7ZVswXT1jKmgsZVs0XT0tbCxlWzhdPXUqaCxlWzFdPWQqbCttLGVbNV09bypoLGVbOV09ZipsLXAsZVsyXT1wKmwtZixlWzZdPWEqaCxlWzEwXT1tKmwrZH1yZXR1cm4gZVszXT0wLGVbN109MCxlWzExXT0wLGVbMTJdPTAsZVsxM109MCxlWzE0XT0wLGVbMTVdPTEsdGhpc31tYWtlUm90YXRpb25Gcm9tUXVhdGVybmlvbih0KXtyZXR1cm4gdGhpcy5jb21wb3NlKGNhLHQsaGEpfWxvb2tBdCh0LGUscyl7Y29uc3Qgbj10aGlzLmVsZW1lbnRzO3JldHVybiB5dC5zdWJWZWN0b3JzKHQsZSkseXQubGVuZ3RoU3EoKT09PTAmJih5dC56PTEpLHl0Lm5vcm1hbGl6ZSgpLHNlLmNyb3NzVmVjdG9ycyhzLHl0KSxzZS5sZW5ndGhTcSgpPT09MCYmKE1hdGguYWJzKHMueik9PT0xP3l0LngrPTFlLTQ6eXQueis9MWUtNCx5dC5ub3JtYWxpemUoKSxzZS5jcm9zc1ZlY3RvcnMocyx5dCkpLHNlLm5vcm1hbGl6ZSgpLElzLmNyb3NzVmVjdG9ycyh5dCxzZSksblswXT1zZS54LG5bNF09SXMueCxuWzhdPXl0LngsblsxXT1zZS55LG5bNV09SXMueSxuWzldPXl0LnksblsyXT1zZS56LG5bNl09SXMueixuWzEwXT15dC56LHRoaXN9bXVsdGlwbHkodCl7cmV0dXJuIHRoaXMubXVsdGlwbHlNYXRyaWNlcyh0aGlzLHQpfXByZW11bHRpcGx5KHQpe3JldHVybiB0aGlzLm11bHRpcGx5TWF0cmljZXModCx0aGlzKX1tdWx0aXBseU1hdHJpY2VzKHQsZSl7Y29uc3Qgcz10LmVsZW1lbnRzLG49ZS5lbGVtZW50cyxpPXRoaXMuZWxlbWVudHMsbz1zWzBdLGE9c1s0XSxjPXNbOF0sdT1zWzEyXSxoPXNbMV0sbD1zWzVdLGQ9c1s5XSxmPXNbMTNdLHA9c1syXSxtPXNbNl0sZz1zWzEwXSx5PXNbMTRdLFQ9c1szXSx3PXNbN10sTT1zWzExXSxOPXNbMTVdLF89blswXSxTPW5bNF0sRT1uWzhdLEY9blsxMl0sUj1uWzFdLEk9bls1XSxCPW5bOV0sUD1uWzEzXSxMPW5bMl0sVj1uWzZdLEc9blsxMF0sTnQ9blsxNF0sSHQ9blszXSxxdD1uWzddLE5uPW5bMTFdLHduPW5bMTVdO3JldHVybiBpWzBdPW8qXythKlIrYypMK3UqSHQsaVs0XT1vKlMrYSpJK2MqVit1KnF0LGlbOF09bypFK2EqQitjKkcrdSpObixpWzEyXT1vKkYrYSpQK2MqTnQrdSp3bixpWzFdPWgqXytsKlIrZCpMK2YqSHQsaVs1XT1oKlMrbCpJK2QqVitmKnF0LGlbOV09aCpFK2wqQitkKkcrZipObixpWzEzXT1oKkYrbCpQK2QqTnQrZip3bixpWzJdPXAqXyttKlIrZypMK3kqSHQsaVs2XT1wKlMrbSpJK2cqVit5KnF0LGlbMTBdPXAqRSttKkIrZypHK3kqTm4saVsxNF09cCpGK20qUCtnKk50K3kqd24saVszXT1UKl8rdypSK00qTCtOKkh0LGlbN109VCpTK3cqSStNKlYrTipxdCxpWzExXT1UKkUrdypCK00qRytOKk5uLGlbMTVdPVQqRit3KlArTSpOdCtOKnduLHRoaXN9bXVsdGlwbHlTY2FsYXIodCl7Y29uc3QgZT10aGlzLmVsZW1lbnRzO3JldHVybiBlWzBdKj10LGVbNF0qPXQsZVs4XSo9dCxlWzEyXSo9dCxlWzFdKj10LGVbNV0qPXQsZVs5XSo9dCxlWzEzXSo9dCxlWzJdKj10LGVbNl0qPXQsZVsxMF0qPXQsZVsxNF0qPXQsZVszXSo9dCxlWzddKj10LGVbMTFdKj10LGVbMTVdKj10LHRoaXN9ZGV0ZXJtaW5hbnQoKXtjb25zdCB0PXRoaXMuZWxlbWVudHMsZT10WzBdLHM9dFs0XSxuPXRbOF0saT10WzEyXSxvPXRbMV0sYT10WzVdLGM9dFs5XSx1PXRbMTNdLGg9dFsyXSxsPXRbNl0sZD10WzEwXSxmPXRbMTRdLHA9dFszXSxtPXRbN10sZz10WzExXSx5PXRbMTVdO3JldHVybiBwKigraSpjKmwtbip1KmwtaSphKmQrcyp1KmQrbiphKmYtcypjKmYpK20qKCtlKmMqZi1lKnUqZCtpKm8qZC1uKm8qZituKnUqaC1pKmMqaCkrZyooK2UqdSpsLWUqYSpmLWkqbypsK3MqbypmK2kqYSpoLXMqdSpoKSt5KigtbiphKmgtZSpjKmwrZSphKmQrbipvKmwtcypvKmQrcypjKmgpfXRyYW5zcG9zZSgpe2NvbnN0IHQ9dGhpcy5lbGVtZW50cztsZXQgZTtyZXR1cm4gZT10WzFdLHRbMV09dFs0XSx0WzRdPWUsZT10WzJdLHRbMl09dFs4XSx0WzhdPWUsZT10WzZdLHRbNl09dFs5XSx0WzldPWUsZT10WzNdLHRbM109dFsxMl0sdFsxMl09ZSxlPXRbN10sdFs3XT10WzEzXSx0WzEzXT1lLGU9dFsxMV0sdFsxMV09dFsxNF0sdFsxNF09ZSx0aGlzfXNldFBvc2l0aW9uKHQsZSxzKXtjb25zdCBuPXRoaXMuZWxlbWVudHM7cmV0dXJuIHQuaXNWZWN0b3IzPyhuWzEyXT10LngsblsxM109dC55LG5bMTRdPXQueik6KG5bMTJdPXQsblsxM109ZSxuWzE0XT1zKSx0aGlzfWludmVydCgpe2NvbnN0IHQ9dGhpcy5lbGVtZW50cyxlPXRbMF0scz10WzFdLG49dFsyXSxpPXRbM10sbz10WzRdLGE9dFs1XSxjPXRbNl0sdT10WzddLGg9dFs4XSxsPXRbOV0sZD10WzEwXSxmPXRbMTFdLHA9dFsxMl0sbT10WzEzXSxnPXRbMTRdLHk9dFsxNV0sVD1sKmcqdS1tKmQqdSttKmMqZi1hKmcqZi1sKmMqeSthKmQqeSx3PXAqZCp1LWgqZyp1LXAqYypmK28qZypmK2gqYyp5LW8qZCp5LE09aCptKnUtcCpsKnUrcCphKmYtbyptKmYtaCphKnkrbypsKnksTj1wKmwqYy1oKm0qYy1wKmEqZCtvKm0qZCtoKmEqZy1vKmwqZyxfPWUqVCtzKncrbipNK2kqTjtpZihfPT09MClyZXR1cm4gdGhpcy5zZXQoMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCk7Y29uc3QgUz0xL187cmV0dXJuIHRbMF09VCpTLHRbMV09KG0qZCppLWwqZyppLW0qbipmK3MqZypmK2wqbip5LXMqZCp5KSpTLHRbMl09KGEqZyppLW0qYyppK20qbip1LXMqZyp1LWEqbip5K3MqYyp5KSpTLHRbM109KGwqYyppLWEqZCppLWwqbip1K3MqZCp1K2EqbipmLXMqYypmKSpTLHRbNF09dypTLHRbNV09KGgqZyppLXAqZCppK3AqbipmLWUqZypmLWgqbip5K2UqZCp5KSpTLHRbNl09KHAqYyppLW8qZyppLXAqbip1K2UqZyp1K28qbip5LWUqYyp5KSpTLHRbN109KG8qZCppLWgqYyppK2gqbip1LWUqZCp1LW8qbipmK2UqYypmKSpTLHRbOF09TSpTLHRbOV09KHAqbCppLWgqbSppLXAqcypmK2UqbSpmK2gqcyp5LWUqbCp5KSpTLHRbMTBdPShvKm0qaS1wKmEqaStwKnMqdS1lKm0qdS1vKnMqeStlKmEqeSkqUyx0WzExXT0oaCphKmktbypsKmktaCpzKnUrZSpsKnUrbypzKmYtZSphKmYpKlMsdFsxMl09TipTLHRbMTNdPShoKm0qbi1wKmwqbitwKnMqZC1lKm0qZC1oKnMqZytlKmwqZykqUyx0WzE0XT0ocCphKm4tbyptKm4tcCpzKmMrZSptKmMrbypzKmctZSphKmcpKlMsdFsxNV09KG8qbCpuLWgqYSpuK2gqcypjLWUqbCpjLW8qcypkK2UqYSpkKSpTLHRoaXN9c2NhbGUodCl7Y29uc3QgZT10aGlzLmVsZW1lbnRzLHM9dC54LG49dC55LGk9dC56O3JldHVybiBlWzBdKj1zLGVbNF0qPW4sZVs4XSo9aSxlWzFdKj1zLGVbNV0qPW4sZVs5XSo9aSxlWzJdKj1zLGVbNl0qPW4sZVsxMF0qPWksZVszXSo9cyxlWzddKj1uLGVbMTFdKj1pLHRoaXN9Z2V0TWF4U2NhbGVPbkF4aXMoKXtjb25zdCB0PXRoaXMuZWxlbWVudHMsZT10WzBdKnRbMF0rdFsxXSp0WzFdK3RbMl0qdFsyXSxzPXRbNF0qdFs0XSt0WzVdKnRbNV0rdFs2XSp0WzZdLG49dFs4XSp0WzhdK3RbOV0qdFs5XSt0WzEwXSp0WzEwXTtyZXR1cm4gTWF0aC5zcXJ0KE1hdGgubWF4KGUscyxuKSl9bWFrZVRyYW5zbGF0aW9uKHQsZSxzKXtyZXR1cm4gdC5pc1ZlY3RvcjM/dGhpcy5zZXQoMSwwLDAsdC54LDAsMSwwLHQueSwwLDAsMSx0LnosMCwwLDAsMSk6dGhpcy5zZXQoMSwwLDAsdCwwLDEsMCxlLDAsMCwxLHMsMCwwLDAsMSksdGhpc31tYWtlUm90YXRpb25YKHQpe2NvbnN0IGU9TWF0aC5jb3ModCkscz1NYXRoLnNpbih0KTtyZXR1cm4gdGhpcy5zZXQoMSwwLDAsMCwwLGUsLXMsMCwwLHMsZSwwLDAsMCwwLDEpLHRoaXN9bWFrZVJvdGF0aW9uWSh0KXtjb25zdCBlPU1hdGguY29zKHQpLHM9TWF0aC5zaW4odCk7cmV0dXJuIHRoaXMuc2V0KGUsMCxzLDAsMCwxLDAsMCwtcywwLGUsMCwwLDAsMCwxKSx0aGlzfW1ha2VSb3RhdGlvbloodCl7Y29uc3QgZT1NYXRoLmNvcyh0KSxzPU1hdGguc2luKHQpO3JldHVybiB0aGlzLnNldChlLC1zLDAsMCxzLGUsMCwwLDAsMCwxLDAsMCwwLDAsMSksdGhpc31tYWtlUm90YXRpb25BeGlzKHQsZSl7Y29uc3Qgcz1NYXRoLmNvcyhlKSxuPU1hdGguc2luKGUpLGk9MS1zLG89dC54LGE9dC55LGM9dC56LHU9aSpvLGg9aSphO3JldHVybiB0aGlzLnNldCh1Km8rcyx1KmEtbipjLHUqYytuKmEsMCx1KmErbipjLGgqYStzLGgqYy1uKm8sMCx1KmMtbiphLGgqYytuKm8saSpjKmMrcywwLDAsMCwwLDEpLHRoaXN9bWFrZVNjYWxlKHQsZSxzKXtyZXR1cm4gdGhpcy5zZXQodCwwLDAsMCwwLGUsMCwwLDAsMCxzLDAsMCwwLDAsMSksdGhpc31tYWtlU2hlYXIodCxlLHMsbixpLG8pe3JldHVybiB0aGlzLnNldCgxLHMsaSwwLHQsMSxvLDAsZSxuLDEsMCwwLDAsMCwxKSx0aGlzfWNvbXBvc2UodCxlLHMpe2NvbnN0IG49dGhpcy5lbGVtZW50cyxpPWUuX3gsbz1lLl95LGE9ZS5feixjPWUuX3csdT1pK2ksaD1vK28sbD1hK2EsZD1pKnUsZj1pKmgscD1pKmwsbT1vKmgsZz1vKmwseT1hKmwsVD1jKnUsdz1jKmgsTT1jKmwsTj1zLngsXz1zLnksUz1zLno7cmV0dXJuIG5bMF09KDEtKG0reSkpKk4sblsxXT0oZitNKSpOLG5bMl09KHAtdykqTixuWzNdPTAsbls0XT0oZi1NKSpfLG5bNV09KDEtKGQreSkpKl8sbls2XT0oZytUKSpfLG5bN109MCxuWzhdPShwK3cpKlMsbls5XT0oZy1UKSpTLG5bMTBdPSgxLShkK20pKSpTLG5bMTFdPTAsblsxMl09dC54LG5bMTNdPXQueSxuWzE0XT10LnosblsxNV09MSx0aGlzfWRlY29tcG9zZSh0LGUscyl7Y29uc3Qgbj10aGlzLmVsZW1lbnRzO2xldCBpPU1lLnNldChuWzBdLG5bMV0sblsyXSkubGVuZ3RoKCk7Y29uc3Qgbz1NZS5zZXQobls0XSxuWzVdLG5bNl0pLmxlbmd0aCgpLGE9TWUuc2V0KG5bOF0sbls5XSxuWzEwXSkubGVuZ3RoKCk7dGhpcy5kZXRlcm1pbmFudCgpPDAmJihpPS1pKSx0Lng9blsxMl0sdC55PW5bMTNdLHQuej1uWzE0XSxCdC5jb3B5KHRoaXMpO2NvbnN0IHU9MS9pLGg9MS9vLGw9MS9hO3JldHVybiBCdC5lbGVtZW50c1swXSo9dSxCdC5lbGVtZW50c1sxXSo9dSxCdC5lbGVtZW50c1syXSo9dSxCdC5lbGVtZW50c1s0XSo9aCxCdC5lbGVtZW50c1s1XSo9aCxCdC5lbGVtZW50c1s2XSo9aCxCdC5lbGVtZW50c1s4XSo9bCxCdC5lbGVtZW50c1s5XSo9bCxCdC5lbGVtZW50c1sxMF0qPWwsZS5zZXRGcm9tUm90YXRpb25NYXRyaXgoQnQpLHMueD1pLHMueT1vLHMuej1hLHRoaXN9bWFrZVBlcnNwZWN0aXZlKHQsZSxzLG4saSxvLGE9WWUpe2NvbnN0IGM9dGhpcy5lbGVtZW50cyx1PTIqaS8oZS10KSxoPTIqaS8ocy1uKSxsPShlK3QpLyhlLXQpLGQ9KHMrbikvKHMtbik7bGV0IGYscDtpZihhPT09WWUpZj0tKG8raSkvKG8taSkscD0tMipvKmkvKG8taSk7ZWxzZSBpZihhPT09em4pZj0tby8oby1pKSxwPS1vKmkvKG8taSk7ZWxzZSB0aHJvdyBuZXcgRXJyb3IoIlRIUkVFLk1hdHJpeDQubWFrZVBlcnNwZWN0aXZlKCk6IEludmFsaWQgY29vcmRpbmF0ZSBzeXN0ZW06ICIrYSk7cmV0dXJuIGNbMF09dSxjWzRdPTAsY1s4XT1sLGNbMTJdPTAsY1sxXT0wLGNbNV09aCxjWzldPWQsY1sxM109MCxjWzJdPTAsY1s2XT0wLGNbMTBdPWYsY1sxNF09cCxjWzNdPTAsY1s3XT0wLGNbMTFdPS0xLGNbMTVdPTAsdGhpc31tYWtlT3J0aG9ncmFwaGljKHQsZSxzLG4saSxvLGE9WWUpe2NvbnN0IGM9dGhpcy5lbGVtZW50cyx1PTEvKGUtdCksaD0xLyhzLW4pLGw9MS8oby1pKSxkPShlK3QpKnUsZj0ocytuKSpoO2xldCBwLG07aWYoYT09PVllKXA9KG8raSkqbCxtPS0yKmw7ZWxzZSBpZihhPT09em4pcD1pKmwsbT0tMSpsO2Vsc2UgdGhyb3cgbmV3IEVycm9yKCJUSFJFRS5NYXRyaXg0Lm1ha2VPcnRob2dyYXBoaWMoKTogSW52YWxpZCBjb29yZGluYXRlIHN5c3RlbTogIithKTtyZXR1cm4gY1swXT0yKnUsY1s0XT0wLGNbOF09MCxjWzEyXT0tZCxjWzFdPTAsY1s1XT0yKmgsY1s5XT0wLGNbMTNdPS1mLGNbMl09MCxjWzZdPTAsY1sxMF09bSxjWzE0XT0tcCxjWzNdPTAsY1s3XT0wLGNbMTFdPTAsY1sxNV09MSx0aGlzfWVxdWFscyh0KXtjb25zdCBlPXRoaXMuZWxlbWVudHMscz10LmVsZW1lbnRzO2ZvcihsZXQgbj0wO248MTY7bisrKWlmKGVbbl0hPT1zW25dKXJldHVybiExO3JldHVybiEwfWZyb21BcnJheSh0LGU9MCl7Zm9yKGxldCBzPTA7czwxNjtzKyspdGhpcy5lbGVtZW50c1tzXT10W3MrZV07cmV0dXJuIHRoaXN9dG9BcnJheSh0PVtdLGU9MCl7Y29uc3Qgcz10aGlzLmVsZW1lbnRzO3JldHVybiB0W2VdPXNbMF0sdFtlKzFdPXNbMV0sdFtlKzJdPXNbMl0sdFtlKzNdPXNbM10sdFtlKzRdPXNbNF0sdFtlKzVdPXNbNV0sdFtlKzZdPXNbNl0sdFtlKzddPXNbN10sdFtlKzhdPXNbOF0sdFtlKzldPXNbOV0sdFtlKzEwXT1zWzEwXSx0W2UrMTFdPXNbMTFdLHRbZSsxMl09c1sxMl0sdFtlKzEzXT1zWzEzXSx0W2UrMTRdPXNbMTRdLHRbZSsxNV09c1sxNV0sdH19Y29uc3QgTWU9bmV3IEEsQnQ9bmV3IG50LGNhPW5ldyBBKDAsMCwwKSxoYT1uZXcgQSgxLDEsMSksc2U9bmV3IEEsSXM9bmV3IEEseXQ9bmV3IEEsaHI9bmV3IG50LHVyPW5ldyBRZTtjbGFzcyB2c3tjb25zdHJ1Y3Rvcih0PTAsZT0wLHM9MCxuPXZzLkRFRkFVTFRfT1JERVIpe3RoaXMuaXNFdWxlcj0hMCx0aGlzLl94PXQsdGhpcy5feT1lLHRoaXMuX3o9cyx0aGlzLl9vcmRlcj1ufWdldCB4KCl7cmV0dXJuIHRoaXMuX3h9c2V0IHgodCl7dGhpcy5feD10LHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKX1nZXQgeSgpe3JldHVybiB0aGlzLl95fXNldCB5KHQpe3RoaXMuX3k9dCx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCl9Z2V0IHooKXtyZXR1cm4gdGhpcy5fen1zZXQgeih0KXt0aGlzLl96PXQsdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpfWdldCBvcmRlcigpe3JldHVybiB0aGlzLl9vcmRlcn1zZXQgb3JkZXIodCl7dGhpcy5fb3JkZXI9dCx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCl9c2V0KHQsZSxzLG49dGhpcy5fb3JkZXIpe3JldHVybiB0aGlzLl94PXQsdGhpcy5feT1lLHRoaXMuX3o9cyx0aGlzLl9vcmRlcj1uLHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMuX3gsdGhpcy5feSx0aGlzLl96LHRoaXMuX29yZGVyKX1jb3B5KHQpe3JldHVybiB0aGlzLl94PXQuX3gsdGhpcy5feT10Ll95LHRoaXMuX3o9dC5feix0aGlzLl9vcmRlcj10Ll9vcmRlcix0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksdGhpc31zZXRGcm9tUm90YXRpb25NYXRyaXgodCxlPXRoaXMuX29yZGVyLHM9ITApe2NvbnN0IG49dC5lbGVtZW50cyxpPW5bMF0sbz1uWzRdLGE9bls4XSxjPW5bMV0sdT1uWzVdLGg9bls5XSxsPW5bMl0sZD1uWzZdLGY9blsxMF07c3dpdGNoKGUpe2Nhc2UiWFlaIjp0aGlzLl95PU1hdGguYXNpbihhdChhLC0xLDEpKSxNYXRoLmFicyhhKTwuOTk5OTk5OT8odGhpcy5feD1NYXRoLmF0YW4yKC1oLGYpLHRoaXMuX3o9TWF0aC5hdGFuMigtbyxpKSk6KHRoaXMuX3g9TWF0aC5hdGFuMihkLHUpLHRoaXMuX3o9MCk7YnJlYWs7Y2FzZSJZWFoiOnRoaXMuX3g9TWF0aC5hc2luKC1hdChoLC0xLDEpKSxNYXRoLmFicyhoKTwuOTk5OTk5OT8odGhpcy5feT1NYXRoLmF0YW4yKGEsZiksdGhpcy5fej1NYXRoLmF0YW4yKGMsdSkpOih0aGlzLl95PU1hdGguYXRhbjIoLWwsaSksdGhpcy5fej0wKTticmVhaztjYXNlIlpYWSI6dGhpcy5feD1NYXRoLmFzaW4oYXQoZCwtMSwxKSksTWF0aC5hYnMoZCk8Ljk5OTk5OTk/KHRoaXMuX3k9TWF0aC5hdGFuMigtbCxmKSx0aGlzLl96PU1hdGguYXRhbjIoLW8sdSkpOih0aGlzLl95PTAsdGhpcy5fej1NYXRoLmF0YW4yKGMsaSkpO2JyZWFrO2Nhc2UiWllYIjp0aGlzLl95PU1hdGguYXNpbigtYXQobCwtMSwxKSksTWF0aC5hYnMobCk8Ljk5OTk5OTk/KHRoaXMuX3g9TWF0aC5hdGFuMihkLGYpLHRoaXMuX3o9TWF0aC5hdGFuMihjLGkpKToodGhpcy5feD0wLHRoaXMuX3o9TWF0aC5hdGFuMigtbyx1KSk7YnJlYWs7Y2FzZSJZWlgiOnRoaXMuX3o9TWF0aC5hc2luKGF0KGMsLTEsMSkpLE1hdGguYWJzKGMpPC45OTk5OTk5Pyh0aGlzLl94PU1hdGguYXRhbjIoLWgsdSksdGhpcy5feT1NYXRoLmF0YW4yKC1sLGkpKToodGhpcy5feD0wLHRoaXMuX3k9TWF0aC5hdGFuMihhLGYpKTticmVhaztjYXNlIlhaWSI6dGhpcy5fej1NYXRoLmFzaW4oLWF0KG8sLTEsMSkpLE1hdGguYWJzKG8pPC45OTk5OTk5Pyh0aGlzLl94PU1hdGguYXRhbjIoZCx1KSx0aGlzLl95PU1hdGguYXRhbjIoYSxpKSk6KHRoaXMuX3g9TWF0aC5hdGFuMigtaCxmKSx0aGlzLl95PTApO2JyZWFrO2RlZmF1bHQ6Y29uc29sZS53YXJuKCJUSFJFRS5FdWxlcjogLnNldEZyb21Sb3RhdGlvbk1hdHJpeCgpIGVuY291bnRlcmVkIGFuIHVua25vd24gb3JkZXI6ICIrZSl9cmV0dXJuIHRoaXMuX29yZGVyPWUscz09PSEwJiZ0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksdGhpc31zZXRGcm9tUXVhdGVybmlvbih0LGUscyl7cmV0dXJuIGhyLm1ha2VSb3RhdGlvbkZyb21RdWF0ZXJuaW9uKHQpLHRoaXMuc2V0RnJvbVJvdGF0aW9uTWF0cml4KGhyLGUscyl9c2V0RnJvbVZlY3RvcjModCxlPXRoaXMuX29yZGVyKXtyZXR1cm4gdGhpcy5zZXQodC54LHQueSx0LnosZSl9cmVvcmRlcih0KXtyZXR1cm4gdXIuc2V0RnJvbUV1bGVyKHRoaXMpLHRoaXMuc2V0RnJvbVF1YXRlcm5pb24odXIsdCl9ZXF1YWxzKHQpe3JldHVybiB0Ll94PT09dGhpcy5feCYmdC5feT09PXRoaXMuX3kmJnQuX3o9PT10aGlzLl96JiZ0Ll9vcmRlcj09PXRoaXMuX29yZGVyfWZyb21BcnJheSh0KXtyZXR1cm4gdGhpcy5feD10WzBdLHRoaXMuX3k9dFsxXSx0aGlzLl96PXRbMl0sdFszXSE9PXZvaWQgMCYmKHRoaXMuX29yZGVyPXRbM10pLHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfXRvQXJyYXkodD1bXSxlPTApe3JldHVybiB0W2VdPXRoaXMuX3gsdFtlKzFdPXRoaXMuX3ksdFtlKzJdPXRoaXMuX3osdFtlKzNdPXRoaXMuX29yZGVyLHR9X29uQ2hhbmdlKHQpe3JldHVybiB0aGlzLl9vbkNoYW5nZUNhbGxiYWNrPXQsdGhpc31fb25DaGFuZ2VDYWxsYmFjaygpe30qW1N5bWJvbC5pdGVyYXRvcl0oKXt5aWVsZCB0aGlzLl94LHlpZWxkIHRoaXMuX3kseWllbGQgdGhpcy5feix5aWVsZCB0aGlzLl9vcmRlcn19dnMuREVGQVVMVF9PUkRFUj0iWFlaIjtjbGFzcyB1YXtjb25zdHJ1Y3Rvcigpe3RoaXMubWFzaz0xfXNldCh0KXt0aGlzLm1hc2s9KDE8PHR8MCk+Pj4wfWVuYWJsZSh0KXt0aGlzLm1hc2t8PTE8PHR8MH1lbmFibGVBbGwoKXt0aGlzLm1hc2s9LTF9dG9nZ2xlKHQpe3RoaXMubWFza149MTw8dHwwfWRpc2FibGUodCl7dGhpcy5tYXNrJj1+KDE8PHR8MCl9ZGlzYWJsZUFsbCgpe3RoaXMubWFzaz0wfXRlc3QodCl7cmV0dXJuKHRoaXMubWFzayZ0Lm1hc2spIT09MH1pc0VuYWJsZWQodCl7cmV0dXJuKHRoaXMubWFzayYoMTw8dHwwKSkhPT0wfX1sZXQgbGE9MDtjb25zdCBscj1uZXcgQSxTZT1uZXcgUWUsV3Q9bmV3IG50LFBzPW5ldyBBLGVzPW5ldyBBLGRhPW5ldyBBLGZhPW5ldyBRZSxkcj1uZXcgQSgxLDAsMCksZnI9bmV3IEEoMCwxLDApLHByPW5ldyBBKDAsMCwxKSxtcj17dHlwZToiYWRkZWQifSxwYT17dHlwZToicmVtb3ZlZCJ9LF9lPXt0eXBlOiJjaGlsZGFkZGVkIixjaGlsZDpudWxsfSx2bj17dHlwZToiY2hpbGRyZW1vdmVkIixjaGlsZDpudWxsfTtjbGFzcyBuZSBleHRlbmRzIFple2NvbnN0cnVjdG9yKCl7c3VwZXIoKSx0aGlzLmlzT2JqZWN0M0Q9ITAsT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImlkIix7dmFsdWU6bGErK30pLHRoaXMudXVpZD1LdCgpLHRoaXMubmFtZT0iIix0aGlzLnR5cGU9Ik9iamVjdDNEIix0aGlzLnBhcmVudD1udWxsLHRoaXMuY2hpbGRyZW49W10sdGhpcy51cD1uZS5ERUZBVUxUX1VQLmNsb25lKCk7Y29uc3QgdD1uZXcgQSxlPW5ldyB2cyxzPW5ldyBRZSxuPW5ldyBBKDEsMSwxKTtmdW5jdGlvbiBpKCl7cy5zZXRGcm9tRXVsZXIoZSwhMSl9ZnVuY3Rpb24gbygpe2Uuc2V0RnJvbVF1YXRlcm5pb24ocyx2b2lkIDAsITEpfWUuX29uQ2hhbmdlKGkpLHMuX29uQ2hhbmdlKG8pLE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRoaXMse3Bvc2l0aW9uOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCx2YWx1ZTp0fSxyb3RhdGlvbjp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsdmFsdWU6ZX0scXVhdGVybmlvbjp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsdmFsdWU6c30sc2NhbGU6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLHZhbHVlOm59LG1vZGVsVmlld01hdHJpeDp7dmFsdWU6bmV3IG50fSxub3JtYWxNYXRyaXg6e3ZhbHVlOm5ldyBDdH19KSx0aGlzLm1hdHJpeD1uZXcgbnQsdGhpcy5tYXRyaXhXb3JsZD1uZXcgbnQsdGhpcy5tYXRyaXhBdXRvVXBkYXRlPW5lLkRFRkFVTFRfTUFUUklYX0FVVE9fVVBEQVRFLHRoaXMubWF0cml4V29ybGRBdXRvVXBkYXRlPW5lLkRFRkFVTFRfTUFUUklYX1dPUkxEX0FVVE9fVVBEQVRFLHRoaXMubWF0cml4V29ybGROZWVkc1VwZGF0ZT0hMSx0aGlzLmxheWVycz1uZXcgdWEsdGhpcy52aXNpYmxlPSEwLHRoaXMuY2FzdFNoYWRvdz0hMSx0aGlzLnJlY2VpdmVTaGFkb3c9ITEsdGhpcy5mcnVzdHVtQ3VsbGVkPSEwLHRoaXMucmVuZGVyT3JkZXI9MCx0aGlzLmFuaW1hdGlvbnM9W10sdGhpcy51c2VyRGF0YT17fX1vbkJlZm9yZVNoYWRvdygpe31vbkFmdGVyU2hhZG93KCl7fW9uQmVmb3JlUmVuZGVyKCl7fW9uQWZ0ZXJSZW5kZXIoKXt9YXBwbHlNYXRyaXg0KHQpe3RoaXMubWF0cml4QXV0b1VwZGF0ZSYmdGhpcy51cGRhdGVNYXRyaXgoKSx0aGlzLm1hdHJpeC5wcmVtdWx0aXBseSh0KSx0aGlzLm1hdHJpeC5kZWNvbXBvc2UodGhpcy5wb3NpdGlvbix0aGlzLnF1YXRlcm5pb24sdGhpcy5zY2FsZSl9YXBwbHlRdWF0ZXJuaW9uKHQpe3JldHVybiB0aGlzLnF1YXRlcm5pb24ucHJlbXVsdGlwbHkodCksdGhpc31zZXRSb3RhdGlvbkZyb21BeGlzQW5nbGUodCxlKXt0aGlzLnF1YXRlcm5pb24uc2V0RnJvbUF4aXNBbmdsZSh0LGUpfXNldFJvdGF0aW9uRnJvbUV1bGVyKHQpe3RoaXMucXVhdGVybmlvbi5zZXRGcm9tRXVsZXIodCwhMCl9c2V0Um90YXRpb25Gcm9tTWF0cml4KHQpe3RoaXMucXVhdGVybmlvbi5zZXRGcm9tUm90YXRpb25NYXRyaXgodCl9c2V0Um90YXRpb25Gcm9tUXVhdGVybmlvbih0KXt0aGlzLnF1YXRlcm5pb24uY29weSh0KX1yb3RhdGVPbkF4aXModCxlKXtyZXR1cm4gU2Uuc2V0RnJvbUF4aXNBbmdsZSh0LGUpLHRoaXMucXVhdGVybmlvbi5tdWx0aXBseShTZSksdGhpc31yb3RhdGVPbldvcmxkQXhpcyh0LGUpe3JldHVybiBTZS5zZXRGcm9tQXhpc0FuZ2xlKHQsZSksdGhpcy5xdWF0ZXJuaW9uLnByZW11bHRpcGx5KFNlKSx0aGlzfXJvdGF0ZVgodCl7cmV0dXJuIHRoaXMucm90YXRlT25BeGlzKGRyLHQpfXJvdGF0ZVkodCl7cmV0dXJuIHRoaXMucm90YXRlT25BeGlzKGZyLHQpfXJvdGF0ZVoodCl7cmV0dXJuIHRoaXMucm90YXRlT25BeGlzKHByLHQpfXRyYW5zbGF0ZU9uQXhpcyh0LGUpe3JldHVybiBsci5jb3B5KHQpLmFwcGx5UXVhdGVybmlvbih0aGlzLnF1YXRlcm5pb24pLHRoaXMucG9zaXRpb24uYWRkKGxyLm11bHRpcGx5U2NhbGFyKGUpKSx0aGlzfXRyYW5zbGF0ZVgodCl7cmV0dXJuIHRoaXMudHJhbnNsYXRlT25BeGlzKGRyLHQpfXRyYW5zbGF0ZVkodCl7cmV0dXJuIHRoaXMudHJhbnNsYXRlT25BeGlzKGZyLHQpfXRyYW5zbGF0ZVoodCl7cmV0dXJuIHRoaXMudHJhbnNsYXRlT25BeGlzKHByLHQpfWxvY2FsVG9Xb3JsZCh0KXtyZXR1cm4gdGhpcy51cGRhdGVXb3JsZE1hdHJpeCghMCwhMSksdC5hcHBseU1hdHJpeDQodGhpcy5tYXRyaXhXb3JsZCl9d29ybGRUb0xvY2FsKHQpe3JldHVybiB0aGlzLnVwZGF0ZVdvcmxkTWF0cml4KCEwLCExKSx0LmFwcGx5TWF0cml4NChXdC5jb3B5KHRoaXMubWF0cml4V29ybGQpLmludmVydCgpKX1sb29rQXQodCxlLHMpe3QuaXNWZWN0b3IzP1BzLmNvcHkodCk6UHMuc2V0KHQsZSxzKTtjb25zdCBuPXRoaXMucGFyZW50O3RoaXMudXBkYXRlV29ybGRNYXRyaXgoITAsITEpLGVzLnNldEZyb21NYXRyaXhQb3NpdGlvbih0aGlzLm1hdHJpeFdvcmxkKSx0aGlzLmlzQ2FtZXJhfHx0aGlzLmlzTGlnaHQ/V3QubG9va0F0KGVzLFBzLHRoaXMudXApOld0Lmxvb2tBdChQcyxlcyx0aGlzLnVwKSx0aGlzLnF1YXRlcm5pb24uc2V0RnJvbVJvdGF0aW9uTWF0cml4KFd0KSxuJiYoV3QuZXh0cmFjdFJvdGF0aW9uKG4ubWF0cml4V29ybGQpLFNlLnNldEZyb21Sb3RhdGlvbk1hdHJpeChXdCksdGhpcy5xdWF0ZXJuaW9uLnByZW11bHRpcGx5KFNlLmludmVydCgpKSl9YWRkKHQpe2lmKGFyZ3VtZW50cy5sZW5ndGg+MSl7Zm9yKGxldCBlPTA7ZTxhcmd1bWVudHMubGVuZ3RoO2UrKyl0aGlzLmFkZChhcmd1bWVudHNbZV0pO3JldHVybiB0aGlzfXJldHVybiB0PT09dGhpcz8oY29uc29sZS5lcnJvcigiVEhSRUUuT2JqZWN0M0QuYWRkOiBvYmplY3QgY2FuJ3QgYmUgYWRkZWQgYXMgYSBjaGlsZCBvZiBpdHNlbGYuIix0KSx0aGlzKToodCYmdC5pc09iamVjdDNEPyh0LnJlbW92ZUZyb21QYXJlbnQoKSx0LnBhcmVudD10aGlzLHRoaXMuY2hpbGRyZW4ucHVzaCh0KSx0LmRpc3BhdGNoRXZlbnQobXIpLF9lLmNoaWxkPXQsdGhpcy5kaXNwYXRjaEV2ZW50KF9lKSxfZS5jaGlsZD1udWxsKTpjb25zb2xlLmVycm9yKCJUSFJFRS5PYmplY3QzRC5hZGQ6IG9iamVjdCBub3QgYW4gaW5zdGFuY2Ugb2YgVEhSRUUuT2JqZWN0M0QuIix0KSx0aGlzKX1yZW1vdmUodCl7aWYoYXJndW1lbnRzLmxlbmd0aD4xKXtmb3IobGV0IHM9MDtzPGFyZ3VtZW50cy5sZW5ndGg7cysrKXRoaXMucmVtb3ZlKGFyZ3VtZW50c1tzXSk7cmV0dXJuIHRoaXN9Y29uc3QgZT10aGlzLmNoaWxkcmVuLmluZGV4T2YodCk7cmV0dXJuIGUhPT0tMSYmKHQucGFyZW50PW51bGwsdGhpcy5jaGlsZHJlbi5zcGxpY2UoZSwxKSx0LmRpc3BhdGNoRXZlbnQocGEpLHZuLmNoaWxkPXQsdGhpcy5kaXNwYXRjaEV2ZW50KHZuKSx2bi5jaGlsZD1udWxsKSx0aGlzfXJlbW92ZUZyb21QYXJlbnQoKXtjb25zdCB0PXRoaXMucGFyZW50O3JldHVybiB0IT09bnVsbCYmdC5yZW1vdmUodGhpcyksdGhpc31jbGVhcigpe3JldHVybiB0aGlzLnJlbW92ZSguLi50aGlzLmNoaWxkcmVuKX1hdHRhY2godCl7cmV0dXJuIHRoaXMudXBkYXRlV29ybGRNYXRyaXgoITAsITEpLFd0LmNvcHkodGhpcy5tYXRyaXhXb3JsZCkuaW52ZXJ0KCksdC5wYXJlbnQhPT1udWxsJiYodC5wYXJlbnQudXBkYXRlV29ybGRNYXRyaXgoITAsITEpLFd0Lm11bHRpcGx5KHQucGFyZW50Lm1hdHJpeFdvcmxkKSksdC5hcHBseU1hdHJpeDQoV3QpLHQucmVtb3ZlRnJvbVBhcmVudCgpLHQucGFyZW50PXRoaXMsdGhpcy5jaGlsZHJlbi5wdXNoKHQpLHQudXBkYXRlV29ybGRNYXRyaXgoITEsITApLHQuZGlzcGF0Y2hFdmVudChtciksX2UuY2hpbGQ9dCx0aGlzLmRpc3BhdGNoRXZlbnQoX2UpLF9lLmNoaWxkPW51bGwsdGhpc31nZXRPYmplY3RCeUlkKHQpe3JldHVybiB0aGlzLmdldE9iamVjdEJ5UHJvcGVydHkoImlkIix0KX1nZXRPYmplY3RCeU5hbWUodCl7cmV0dXJuIHRoaXMuZ2V0T2JqZWN0QnlQcm9wZXJ0eSgibmFtZSIsdCl9Z2V0T2JqZWN0QnlQcm9wZXJ0eSh0LGUpe2lmKHRoaXNbdF09PT1lKXJldHVybiB0aGlzO2ZvcihsZXQgcz0wLG49dGhpcy5jaGlsZHJlbi5sZW5ndGg7czxuO3MrKyl7Y29uc3Qgbz10aGlzLmNoaWxkcmVuW3NdLmdldE9iamVjdEJ5UHJvcGVydHkodCxlKTtpZihvIT09dm9pZCAwKXJldHVybiBvfX1nZXRPYmplY3RzQnlQcm9wZXJ0eSh0LGUscz1bXSl7dGhpc1t0XT09PWUmJnMucHVzaCh0aGlzKTtjb25zdCBuPXRoaXMuY2hpbGRyZW47Zm9yKGxldCBpPTAsbz1uLmxlbmd0aDtpPG87aSsrKW5baV0uZ2V0T2JqZWN0c0J5UHJvcGVydHkodCxlLHMpO3JldHVybiBzfWdldFdvcmxkUG9zaXRpb24odCl7cmV0dXJuIHRoaXMudXBkYXRlV29ybGRNYXRyaXgoITAsITEpLHQuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKHRoaXMubWF0cml4V29ybGQpfWdldFdvcmxkUXVhdGVybmlvbih0KXtyZXR1cm4gdGhpcy51cGRhdGVXb3JsZE1hdHJpeCghMCwhMSksdGhpcy5tYXRyaXhXb3JsZC5kZWNvbXBvc2UoZXMsdCxkYSksdH1nZXRXb3JsZFNjYWxlKHQpe3JldHVybiB0aGlzLnVwZGF0ZVdvcmxkTWF0cml4KCEwLCExKSx0aGlzLm1hdHJpeFdvcmxkLmRlY29tcG9zZShlcyxmYSx0KSx0fWdldFdvcmxkRGlyZWN0aW9uKHQpe3RoaXMudXBkYXRlV29ybGRNYXRyaXgoITAsITEpO2NvbnN0IGU9dGhpcy5tYXRyaXhXb3JsZC5lbGVtZW50cztyZXR1cm4gdC5zZXQoZVs4XSxlWzldLGVbMTBdKS5ub3JtYWxpemUoKX1yYXljYXN0KCl7fXRyYXZlcnNlKHQpe3QodGhpcyk7Y29uc3QgZT10aGlzLmNoaWxkcmVuO2ZvcihsZXQgcz0wLG49ZS5sZW5ndGg7czxuO3MrKyllW3NdLnRyYXZlcnNlKHQpfXRyYXZlcnNlVmlzaWJsZSh0KXtpZih0aGlzLnZpc2libGU9PT0hMSlyZXR1cm47dCh0aGlzKTtjb25zdCBlPXRoaXMuY2hpbGRyZW47Zm9yKGxldCBzPTAsbj1lLmxlbmd0aDtzPG47cysrKWVbc10udHJhdmVyc2VWaXNpYmxlKHQpfXRyYXZlcnNlQW5jZXN0b3JzKHQpe2NvbnN0IGU9dGhpcy5wYXJlbnQ7ZSE9PW51bGwmJih0KGUpLGUudHJhdmVyc2VBbmNlc3RvcnModCkpfXVwZGF0ZU1hdHJpeCgpe3RoaXMubWF0cml4LmNvbXBvc2UodGhpcy5wb3NpdGlvbix0aGlzLnF1YXRlcm5pb24sdGhpcy5zY2FsZSksdGhpcy5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlPSEwfXVwZGF0ZU1hdHJpeFdvcmxkKHQpe3RoaXMubWF0cml4QXV0b1VwZGF0ZSYmdGhpcy51cGRhdGVNYXRyaXgoKSwodGhpcy5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlfHx0KSYmKHRoaXMubWF0cml4V29ybGRBdXRvVXBkYXRlPT09ITAmJih0aGlzLnBhcmVudD09PW51bGw/dGhpcy5tYXRyaXhXb3JsZC5jb3B5KHRoaXMubWF0cml4KTp0aGlzLm1hdHJpeFdvcmxkLm11bHRpcGx5TWF0cmljZXModGhpcy5wYXJlbnQubWF0cml4V29ybGQsdGhpcy5tYXRyaXgpKSx0aGlzLm1hdHJpeFdvcmxkTmVlZHNVcGRhdGU9ITEsdD0hMCk7Y29uc3QgZT10aGlzLmNoaWxkcmVuO2ZvcihsZXQgcz0wLG49ZS5sZW5ndGg7czxuO3MrKyllW3NdLnVwZGF0ZU1hdHJpeFdvcmxkKHQpfXVwZGF0ZVdvcmxkTWF0cml4KHQsZSl7Y29uc3Qgcz10aGlzLnBhcmVudDtpZih0PT09ITAmJnMhPT1udWxsJiZzLnVwZGF0ZVdvcmxkTWF0cml4KCEwLCExKSx0aGlzLm1hdHJpeEF1dG9VcGRhdGUmJnRoaXMudXBkYXRlTWF0cml4KCksdGhpcy5tYXRyaXhXb3JsZEF1dG9VcGRhdGU9PT0hMCYmKHRoaXMucGFyZW50PT09bnVsbD90aGlzLm1hdHJpeFdvcmxkLmNvcHkodGhpcy5tYXRyaXgpOnRoaXMubWF0cml4V29ybGQubXVsdGlwbHlNYXRyaWNlcyh0aGlzLnBhcmVudC5tYXRyaXhXb3JsZCx0aGlzLm1hdHJpeCkpLGU9PT0hMCl7Y29uc3Qgbj10aGlzLmNoaWxkcmVuO2ZvcihsZXQgaT0wLG89bi5sZW5ndGg7aTxvO2krKyluW2ldLnVwZGF0ZVdvcmxkTWF0cml4KCExLCEwKX19dG9KU09OKHQpe2NvbnN0IGU9dD09PXZvaWQgMHx8dHlwZW9mIHQ9PSJzdHJpbmciLHM9e307ZSYmKHQ9e2dlb21ldHJpZXM6e30sbWF0ZXJpYWxzOnt9LHRleHR1cmVzOnt9LGltYWdlczp7fSxzaGFwZXM6e30sc2tlbGV0b25zOnt9LGFuaW1hdGlvbnM6e30sbm9kZXM6e319LHMubWV0YWRhdGE9e3ZlcnNpb246NC42LHR5cGU6Ik9iamVjdCIsZ2VuZXJhdG9yOiJPYmplY3QzRC50b0pTT04ifSk7Y29uc3Qgbj17fTtuLnV1aWQ9dGhpcy51dWlkLG4udHlwZT10aGlzLnR5cGUsdGhpcy5uYW1lIT09IiImJihuLm5hbWU9dGhpcy5uYW1lKSx0aGlzLmNhc3RTaGFkb3c9PT0hMCYmKG4uY2FzdFNoYWRvdz0hMCksdGhpcy5yZWNlaXZlU2hhZG93PT09ITAmJihuLnJlY2VpdmVTaGFkb3c9ITApLHRoaXMudmlzaWJsZT09PSExJiYobi52aXNpYmxlPSExKSx0aGlzLmZydXN0dW1DdWxsZWQ9PT0hMSYmKG4uZnJ1c3R1bUN1bGxlZD0hMSksdGhpcy5yZW5kZXJPcmRlciE9PTAmJihuLnJlbmRlck9yZGVyPXRoaXMucmVuZGVyT3JkZXIpLE9iamVjdC5rZXlzKHRoaXMudXNlckRhdGEpLmxlbmd0aD4wJiYobi51c2VyRGF0YT10aGlzLnVzZXJEYXRhKSxuLmxheWVycz10aGlzLmxheWVycy5tYXNrLG4ubWF0cml4PXRoaXMubWF0cml4LnRvQXJyYXkoKSxuLnVwPXRoaXMudXAudG9BcnJheSgpLHRoaXMubWF0cml4QXV0b1VwZGF0ZT09PSExJiYobi5tYXRyaXhBdXRvVXBkYXRlPSExKSx0aGlzLmlzSW5zdGFuY2VkTWVzaCYmKG4udHlwZT0iSW5zdGFuY2VkTWVzaCIsbi5jb3VudD10aGlzLmNvdW50LG4uaW5zdGFuY2VNYXRyaXg9dGhpcy5pbnN0YW5jZU1hdHJpeC50b0pTT04oKSx0aGlzLmluc3RhbmNlQ29sb3IhPT1udWxsJiYobi5pbnN0YW5jZUNvbG9yPXRoaXMuaW5zdGFuY2VDb2xvci50b0pTT04oKSkpLHRoaXMuaXNCYXRjaGVkTWVzaCYmKG4udHlwZT0iQmF0Y2hlZE1lc2giLG4ucGVyT2JqZWN0RnJ1c3R1bUN1bGxlZD10aGlzLnBlck9iamVjdEZydXN0dW1DdWxsZWQsbi5zb3J0T2JqZWN0cz10aGlzLnNvcnRPYmplY3RzLG4uZHJhd1Jhbmdlcz10aGlzLl9kcmF3UmFuZ2VzLG4ucmVzZXJ2ZWRSYW5nZXM9dGhpcy5fcmVzZXJ2ZWRSYW5nZXMsbi52aXNpYmlsaXR5PXRoaXMuX3Zpc2liaWxpdHksbi5hY3RpdmU9dGhpcy5fYWN0aXZlLG4uYm91bmRzPXRoaXMuX2JvdW5kcy5tYXAoYT0+KHtib3hJbml0aWFsaXplZDphLmJveEluaXRpYWxpemVkLGJveE1pbjphLmJveC5taW4udG9BcnJheSgpLGJveE1heDphLmJveC5tYXgudG9BcnJheSgpLHNwaGVyZUluaXRpYWxpemVkOmEuc3BoZXJlSW5pdGlhbGl6ZWQsc3BoZXJlUmFkaXVzOmEuc3BoZXJlLnJhZGl1cyxzcGhlcmVDZW50ZXI6YS5zcGhlcmUuY2VudGVyLnRvQXJyYXkoKX0pKSxuLm1heEluc3RhbmNlQ291bnQ9dGhpcy5fbWF4SW5zdGFuY2VDb3VudCxuLm1heFZlcnRleENvdW50PXRoaXMuX21heFZlcnRleENvdW50LG4ubWF4SW5kZXhDb3VudD10aGlzLl9tYXhJbmRleENvdW50LG4uZ2VvbWV0cnlJbml0aWFsaXplZD10aGlzLl9nZW9tZXRyeUluaXRpYWxpemVkLG4uZ2VvbWV0cnlDb3VudD10aGlzLl9nZW9tZXRyeUNvdW50LG4ubWF0cmljZXNUZXh0dXJlPXRoaXMuX21hdHJpY2VzVGV4dHVyZS50b0pTT04odCksdGhpcy5fY29sb3JzVGV4dHVyZSE9PW51bGwmJihuLmNvbG9yc1RleHR1cmU9dGhpcy5fY29sb3JzVGV4dHVyZS50b0pTT04odCkpLHRoaXMuYm91bmRpbmdTcGhlcmUhPT1udWxsJiYobi5ib3VuZGluZ1NwaGVyZT17Y2VudGVyOm4uYm91bmRpbmdTcGhlcmUuY2VudGVyLnRvQXJyYXkoKSxyYWRpdXM6bi5ib3VuZGluZ1NwaGVyZS5yYWRpdXN9KSx0aGlzLmJvdW5kaW5nQm94IT09bnVsbCYmKG4uYm91bmRpbmdCb3g9e21pbjpuLmJvdW5kaW5nQm94Lm1pbi50b0FycmF5KCksbWF4Om4uYm91bmRpbmdCb3gubWF4LnRvQXJyYXkoKX0pKTtmdW5jdGlvbiBpKGEsYyl7cmV0dXJuIGFbYy51dWlkXT09PXZvaWQgMCYmKGFbYy51dWlkXT1jLnRvSlNPTih0KSksYy51dWlkfWlmKHRoaXMuaXNTY2VuZSl0aGlzLmJhY2tncm91bmQmJih0aGlzLmJhY2tncm91bmQuaXNDb2xvcj9uLmJhY2tncm91bmQ9dGhpcy5iYWNrZ3JvdW5kLnRvSlNPTigpOnRoaXMuYmFja2dyb3VuZC5pc1RleHR1cmUmJihuLmJhY2tncm91bmQ9dGhpcy5iYWNrZ3JvdW5kLnRvSlNPTih0KS51dWlkKSksdGhpcy5lbnZpcm9ubWVudCYmdGhpcy5lbnZpcm9ubWVudC5pc1RleHR1cmUmJnRoaXMuZW52aXJvbm1lbnQuaXNSZW5kZXJUYXJnZXRUZXh0dXJlIT09ITAmJihuLmVudmlyb25tZW50PXRoaXMuZW52aXJvbm1lbnQudG9KU09OKHQpLnV1aWQpO2Vsc2UgaWYodGhpcy5pc01lc2h8fHRoaXMuaXNMaW5lfHx0aGlzLmlzUG9pbnRzKXtuLmdlb21ldHJ5PWkodC5nZW9tZXRyaWVzLHRoaXMuZ2VvbWV0cnkpO2NvbnN0IGE9dGhpcy5nZW9tZXRyeS5wYXJhbWV0ZXJzO2lmKGEhPT12b2lkIDAmJmEuc2hhcGVzIT09dm9pZCAwKXtjb25zdCBjPWEuc2hhcGVzO2lmKEFycmF5LmlzQXJyYXkoYykpZm9yKGxldCB1PTAsaD1jLmxlbmd0aDt1PGg7dSsrKXtjb25zdCBsPWNbdV07aSh0LnNoYXBlcyxsKX1lbHNlIGkodC5zaGFwZXMsYyl9fWlmKHRoaXMuaXNTa2lubmVkTWVzaCYmKG4uYmluZE1vZGU9dGhpcy5iaW5kTW9kZSxuLmJpbmRNYXRyaXg9dGhpcy5iaW5kTWF0cml4LnRvQXJyYXkoKSx0aGlzLnNrZWxldG9uIT09dm9pZCAwJiYoaSh0LnNrZWxldG9ucyx0aGlzLnNrZWxldG9uKSxuLnNrZWxldG9uPXRoaXMuc2tlbGV0b24udXVpZCkpLHRoaXMubWF0ZXJpYWwhPT12b2lkIDApaWYoQXJyYXkuaXNBcnJheSh0aGlzLm1hdGVyaWFsKSl7Y29uc3QgYT1bXTtmb3IobGV0IGM9MCx1PXRoaXMubWF0ZXJpYWwubGVuZ3RoO2M8dTtjKyspYS5wdXNoKGkodC5tYXRlcmlhbHMsdGhpcy5tYXRlcmlhbFtjXSkpO24ubWF0ZXJpYWw9YX1lbHNlIG4ubWF0ZXJpYWw9aSh0Lm1hdGVyaWFscyx0aGlzLm1hdGVyaWFsKTtpZih0aGlzLmNoaWxkcmVuLmxlbmd0aD4wKXtuLmNoaWxkcmVuPVtdO2ZvcihsZXQgYT0wO2E8dGhpcy5jaGlsZHJlbi5sZW5ndGg7YSsrKW4uY2hpbGRyZW4ucHVzaCh0aGlzLmNoaWxkcmVuW2FdLnRvSlNPTih0KS5vYmplY3QpfWlmKHRoaXMuYW5pbWF0aW9ucy5sZW5ndGg+MCl7bi5hbmltYXRpb25zPVtdO2ZvcihsZXQgYT0wO2E8dGhpcy5hbmltYXRpb25zLmxlbmd0aDthKyspe2NvbnN0IGM9dGhpcy5hbmltYXRpb25zW2FdO24uYW5pbWF0aW9ucy5wdXNoKGkodC5hbmltYXRpb25zLGMpKX19aWYoZSl7Y29uc3QgYT1vKHQuZ2VvbWV0cmllcyksYz1vKHQubWF0ZXJpYWxzKSx1PW8odC50ZXh0dXJlcyksaD1vKHQuaW1hZ2VzKSxsPW8odC5zaGFwZXMpLGQ9byh0LnNrZWxldG9ucyksZj1vKHQuYW5pbWF0aW9ucykscD1vKHQubm9kZXMpO2EubGVuZ3RoPjAmJihzLmdlb21ldHJpZXM9YSksYy5sZW5ndGg+MCYmKHMubWF0ZXJpYWxzPWMpLHUubGVuZ3RoPjAmJihzLnRleHR1cmVzPXUpLGgubGVuZ3RoPjAmJihzLmltYWdlcz1oKSxsLmxlbmd0aD4wJiYocy5zaGFwZXM9bCksZC5sZW5ndGg+MCYmKHMuc2tlbGV0b25zPWQpLGYubGVuZ3RoPjAmJihzLmFuaW1hdGlvbnM9ZikscC5sZW5ndGg+MCYmKHMubm9kZXM9cCl9cmV0dXJuIHMub2JqZWN0PW4scztmdW5jdGlvbiBvKGEpe2NvbnN0IGM9W107Zm9yKGNvbnN0IHUgaW4gYSl7Y29uc3QgaD1hW3VdO2RlbGV0ZSBoLm1ldGFkYXRhLGMucHVzaChoKX1yZXR1cm4gY319Y2xvbmUodCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSh0aGlzLHQpfWNvcHkodCxlPSEwKXtpZih0aGlzLm5hbWU9dC5uYW1lLHRoaXMudXAuY29weSh0LnVwKSx0aGlzLnBvc2l0aW9uLmNvcHkodC5wb3NpdGlvbiksdGhpcy5yb3RhdGlvbi5vcmRlcj10LnJvdGF0aW9uLm9yZGVyLHRoaXMucXVhdGVybmlvbi5jb3B5KHQucXVhdGVybmlvbiksdGhpcy5zY2FsZS5jb3B5KHQuc2NhbGUpLHRoaXMubWF0cml4LmNvcHkodC5tYXRyaXgpLHRoaXMubWF0cml4V29ybGQuY29weSh0Lm1hdHJpeFdvcmxkKSx0aGlzLm1hdHJpeEF1dG9VcGRhdGU9dC5tYXRyaXhBdXRvVXBkYXRlLHRoaXMubWF0cml4V29ybGRBdXRvVXBkYXRlPXQubWF0cml4V29ybGRBdXRvVXBkYXRlLHRoaXMubWF0cml4V29ybGROZWVkc1VwZGF0ZT10Lm1hdHJpeFdvcmxkTmVlZHNVcGRhdGUsdGhpcy5sYXllcnMubWFzaz10LmxheWVycy5tYXNrLHRoaXMudmlzaWJsZT10LnZpc2libGUsdGhpcy5jYXN0U2hhZG93PXQuY2FzdFNoYWRvdyx0aGlzLnJlY2VpdmVTaGFkb3c9dC5yZWNlaXZlU2hhZG93LHRoaXMuZnJ1c3R1bUN1bGxlZD10LmZydXN0dW1DdWxsZWQsdGhpcy5yZW5kZXJPcmRlcj10LnJlbmRlck9yZGVyLHRoaXMuYW5pbWF0aW9ucz10LmFuaW1hdGlvbnMuc2xpY2UoKSx0aGlzLnVzZXJEYXRhPUpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodC51c2VyRGF0YSkpLGU9PT0hMClmb3IobGV0IHM9MDtzPHQuY2hpbGRyZW4ubGVuZ3RoO3MrKyl7Y29uc3Qgbj10LmNoaWxkcmVuW3NdO3RoaXMuYWRkKG4uY2xvbmUoKSl9cmV0dXJuIHRoaXN9fW5lLkRFRkFVTFRfVVA9bmV3IEEoMCwxLDApLG5lLkRFRkFVTFRfTUFUUklYX0FVVE9fVVBEQVRFPSEwLG5lLkRFRkFVTFRfTUFUUklYX1dPUkxEX0FVVE9fVVBEQVRFPSEwO2NvbnN0IEl0PW5ldyBBLFh0PW5ldyBBLFBuPW5ldyBBLFl0PW5ldyBBLHplPW5ldyBBLGJlPW5ldyBBLHlyPW5ldyBBLExuPW5ldyBBLE9uPW5ldyBBLERuPW5ldyBBLFZuPW5ldyBGdCxVbj1uZXcgRnQsa249bmV3IEZ0O2NsYXNzIHd0e2NvbnN0cnVjdG9yKHQ9bmV3IEEsZT1uZXcgQSxzPW5ldyBBKXt0aGlzLmE9dCx0aGlzLmI9ZSx0aGlzLmM9c31zdGF0aWMgZ2V0Tm9ybWFsKHQsZSxzLG4pe24uc3ViVmVjdG9ycyhzLGUpLEl0LnN1YlZlY3RvcnModCxlKSxuLmNyb3NzKEl0KTtjb25zdCBpPW4ubGVuZ3RoU3EoKTtyZXR1cm4gaT4wP24ubXVsdGlwbHlTY2FsYXIoMS9NYXRoLnNxcnQoaSkpOm4uc2V0KDAsMCwwKX1zdGF0aWMgZ2V0QmFyeWNvb3JkKHQsZSxzLG4saSl7SXQuc3ViVmVjdG9ycyhuLGUpLFh0LnN1YlZlY3RvcnMocyxlKSxQbi5zdWJWZWN0b3JzKHQsZSk7Y29uc3Qgbz1JdC5kb3QoSXQpLGE9SXQuZG90KFh0KSxjPUl0LmRvdChQbiksdT1YdC5kb3QoWHQpLGg9WHQuZG90KFBuKSxsPW8qdS1hKmE7aWYobD09PTApcmV0dXJuIGkuc2V0KDAsMCwwKSxudWxsO2NvbnN0IGQ9MS9sLGY9KHUqYy1hKmgpKmQscD0obypoLWEqYykqZDtyZXR1cm4gaS5zZXQoMS1mLXAscCxmKX1zdGF0aWMgY29udGFpbnNQb2ludCh0LGUscyxuKXtyZXR1cm4gdGhpcy5nZXRCYXJ5Y29vcmQodCxlLHMsbixZdCk9PT1udWxsPyExOll0Lng+PTAmJll0Lnk+PTAmJll0LngrWXQueTw9MX1zdGF0aWMgZ2V0SW50ZXJwb2xhdGlvbih0LGUscyxuLGksbyxhLGMpe3JldHVybiB0aGlzLmdldEJhcnljb29yZCh0LGUscyxuLFl0KT09PW51bGw/KGMueD0wLGMueT0wLCJ6ImluIGMmJihjLno9MCksInciaW4gYyYmKGMudz0wKSxudWxsKTooYy5zZXRTY2FsYXIoMCksYy5hZGRTY2FsZWRWZWN0b3IoaSxZdC54KSxjLmFkZFNjYWxlZFZlY3RvcihvLFl0LnkpLGMuYWRkU2NhbGVkVmVjdG9yKGEsWXQueiksYyl9c3RhdGljIGdldEludGVycG9sYXRlZEF0dHJpYnV0ZSh0LGUscyxuLGksbyl7cmV0dXJuIFZuLnNldFNjYWxhcigwKSxVbi5zZXRTY2FsYXIoMCksa24uc2V0U2NhbGFyKDApLFZuLmZyb21CdWZmZXJBdHRyaWJ1dGUodCxlKSxVbi5mcm9tQnVmZmVyQXR0cmlidXRlKHQscyksa24uZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0LG4pLG8uc2V0U2NhbGFyKDApLG8uYWRkU2NhbGVkVmVjdG9yKFZuLGkueCksby5hZGRTY2FsZWRWZWN0b3IoVW4saS55KSxvLmFkZFNjYWxlZFZlY3RvcihrbixpLnopLG99c3RhdGljIGlzRnJvbnRGYWNpbmcodCxlLHMsbil7cmV0dXJuIEl0LnN1YlZlY3RvcnMocyxlKSxYdC5zdWJWZWN0b3JzKHQsZSksSXQuY3Jvc3MoWHQpLmRvdChuKTwwfXNldCh0LGUscyl7cmV0dXJuIHRoaXMuYS5jb3B5KHQpLHRoaXMuYi5jb3B5KGUpLHRoaXMuYy5jb3B5KHMpLHRoaXN9c2V0RnJvbVBvaW50c0FuZEluZGljZXModCxlLHMsbil7cmV0dXJuIHRoaXMuYS5jb3B5KHRbZV0pLHRoaXMuYi5jb3B5KHRbc10pLHRoaXMuYy5jb3B5KHRbbl0pLHRoaXN9c2V0RnJvbUF0dHJpYnV0ZUFuZEluZGljZXModCxlLHMsbil7cmV0dXJuIHRoaXMuYS5mcm9tQnVmZmVyQXR0cmlidXRlKHQsZSksdGhpcy5iLmZyb21CdWZmZXJBdHRyaWJ1dGUodCxzKSx0aGlzLmMuZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0LG4pLHRoaXN9Y2xvbmUoKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KHRoaXMpfWNvcHkodCl7cmV0dXJuIHRoaXMuYS5jb3B5KHQuYSksdGhpcy5iLmNvcHkodC5iKSx0aGlzLmMuY29weSh0LmMpLHRoaXN9Z2V0QXJlYSgpe3JldHVybiBJdC5zdWJWZWN0b3JzKHRoaXMuYyx0aGlzLmIpLFh0LnN1YlZlY3RvcnModGhpcy5hLHRoaXMuYiksSXQuY3Jvc3MoWHQpLmxlbmd0aCgpKi41fWdldE1pZHBvaW50KHQpe3JldHVybiB0LmFkZFZlY3RvcnModGhpcy5hLHRoaXMuYikuYWRkKHRoaXMuYykubXVsdGlwbHlTY2FsYXIoMS8zKX1nZXROb3JtYWwodCl7cmV0dXJuIHd0LmdldE5vcm1hbCh0aGlzLmEsdGhpcy5iLHRoaXMuYyx0KX1nZXRQbGFuZSh0KXtyZXR1cm4gdC5zZXRGcm9tQ29wbGFuYXJQb2ludHModGhpcy5hLHRoaXMuYix0aGlzLmMpfWdldEJhcnljb29yZCh0LGUpe3JldHVybiB3dC5nZXRCYXJ5Y29vcmQodCx0aGlzLmEsdGhpcy5iLHRoaXMuYyxlKX1nZXRJbnRlcnBvbGF0aW9uKHQsZSxzLG4saSl7cmV0dXJuIHd0LmdldEludGVycG9sYXRpb24odCx0aGlzLmEsdGhpcy5iLHRoaXMuYyxlLHMsbixpKX1jb250YWluc1BvaW50KHQpe3JldHVybiB3dC5jb250YWluc1BvaW50KHQsdGhpcy5hLHRoaXMuYix0aGlzLmMpfWlzRnJvbnRGYWNpbmcodCl7cmV0dXJuIHd0LmlzRnJvbnRGYWNpbmcodGhpcy5hLHRoaXMuYix0aGlzLmMsdCl9aW50ZXJzZWN0c0JveCh0KXtyZXR1cm4gdC5pbnRlcnNlY3RzVHJpYW5nbGUodGhpcyl9Y2xvc2VzdFBvaW50VG9Qb2ludCh0LGUpe2NvbnN0IHM9dGhpcy5hLG49dGhpcy5iLGk9dGhpcy5jO2xldCBvLGE7emUuc3ViVmVjdG9ycyhuLHMpLGJlLnN1YlZlY3RvcnMoaSxzKSxMbi5zdWJWZWN0b3JzKHQscyk7Y29uc3QgYz16ZS5kb3QoTG4pLHU9YmUuZG90KExuKTtpZihjPD0wJiZ1PD0wKXJldHVybiBlLmNvcHkocyk7T24uc3ViVmVjdG9ycyh0LG4pO2NvbnN0IGg9emUuZG90KE9uKSxsPWJlLmRvdChPbik7aWYoaD49MCYmbDw9aClyZXR1cm4gZS5jb3B5KG4pO2NvbnN0IGQ9YypsLWgqdTtpZihkPD0wJiZjPj0wJiZoPD0wKXJldHVybiBvPWMvKGMtaCksZS5jb3B5KHMpLmFkZFNjYWxlZFZlY3Rvcih6ZSxvKTtEbi5zdWJWZWN0b3JzKHQsaSk7Y29uc3QgZj16ZS5kb3QoRG4pLHA9YmUuZG90KERuKTtpZihwPj0wJiZmPD1wKXJldHVybiBlLmNvcHkoaSk7Y29uc3QgbT1mKnUtYypwO2lmKG08PTAmJnU+PTAmJnA8PTApcmV0dXJuIGE9dS8odS1wKSxlLmNvcHkocykuYWRkU2NhbGVkVmVjdG9yKGJlLGEpO2NvbnN0IGc9aCpwLWYqbDtpZihnPD0wJiZsLWg+PTAmJmYtcD49MClyZXR1cm4geXIuc3ViVmVjdG9ycyhpLG4pLGE9KGwtaCkvKGwtaCsoZi1wKSksZS5jb3B5KG4pLmFkZFNjYWxlZFZlY3Rvcih5cixhKTtjb25zdCB5PTEvKGcrbStkKTtyZXR1cm4gbz1tKnksYT1kKnksZS5jb3B5KHMpLmFkZFNjYWxlZFZlY3Rvcih6ZSxvKS5hZGRTY2FsZWRWZWN0b3IoYmUsYSl9ZXF1YWxzKHQpe3JldHVybiB0LmEuZXF1YWxzKHRoaXMuYSkmJnQuYi5lcXVhbHModGhpcy5iKSYmdC5jLmVxdWFscyh0aGlzLmMpfX1jb25zdCBncj17YWxpY2VibHVlOjE1NzkyMzgzLGFudGlxdWV3aGl0ZToxNjQ0NDM3NSxhcXVhOjY1NTM1LGFxdWFtYXJpbmU6ODM4ODU2NCxhenVyZToxNTc5NDE3NSxiZWlnZToxNjExOTI2MCxiaXNxdWU6MTY3NzAyNDQsYmxhY2s6MCxibGFuY2hlZGFsbW9uZDoxNjc3MjA0NSxibHVlOjI1NSxibHVldmlvbGV0OjkwNTUyMDIsYnJvd246MTA4MjQyMzQsYnVybHl3b29kOjE0NTk2MjMxLGNhZGV0Ymx1ZTo2MjY2NTI4LGNoYXJ0cmV1c2U6ODM4ODM1MixjaG9jb2xhdGU6MTM3ODk0NzAsY29yYWw6MTY3NDQyNzIsY29ybmZsb3dlcmJsdWU6NjU5MTk4MSxjb3Juc2lsazoxNjc3NTM4OCxjcmltc29uOjE0NDIzMTAwLGN5YW46NjU1MzUsZGFya2JsdWU6MTM5LGRhcmtjeWFuOjM1NzIzLGRhcmtnb2xkZW5yb2Q6MTIwOTI5MzksZGFya2dyYXk6MTExMTkwMTcsZGFya2dyZWVuOjI1NjAwLGRhcmtncmV5OjExMTE5MDE3LGRhcmtraGFraToxMjQzMzI1OSxkYXJrbWFnZW50YTo5MTA5NjQzLGRhcmtvbGl2ZWdyZWVuOjU1OTc5OTksZGFya29yYW5nZToxNjc0NzUyMCxkYXJrb3JjaGlkOjEwMDQwMDEyLGRhcmtyZWQ6OTEwOTUwNCxkYXJrc2FsbW9uOjE1MzA4NDEwLGRhcmtzZWFncmVlbjo5NDE5OTE5LGRhcmtzbGF0ZWJsdWU6NDczNDM0NyxkYXJrc2xhdGVncmF5OjMxMDA0OTUsZGFya3NsYXRlZ3JleTozMTAwNDk1LGRhcmt0dXJxdW9pc2U6NTI5NDUsZGFya3Zpb2xldDo5Njk5NTM5LGRlZXBwaW5rOjE2NzE2OTQ3LGRlZXBza3libHVlOjQ5MTUxLGRpbWdyYXk6NjkwODI2NSxkaW1ncmV5OjY5MDgyNjUsZG9kZ2VyYmx1ZToyMDAzMTk5LGZpcmVicmljazoxMTY3NDE0NixmbG9yYWx3aGl0ZToxNjc3NTkyMCxmb3Jlc3RncmVlbjoyMjYzODQyLGZ1Y2hzaWE6MTY3MTE5MzUsZ2FpbnNib3JvOjE0NDc0NDYwLGdob3N0d2hpdGU6MTYzMTY2NzEsZ29sZDoxNjc2NjcyMCxnb2xkZW5yb2Q6MTQzMjkxMjAsZ3JheTo4NDIxNTA0LGdyZWVuOjMyNzY4LGdyZWVueWVsbG93OjExNDAzMDU1LGdyZXk6ODQyMTUwNCxob25leWRldzoxNTc5NDE2MCxob3RwaW5rOjE2NzM4NzQwLGluZGlhbnJlZDoxMzQ1ODUyNCxpbmRpZ286NDkxNTMzMCxpdm9yeToxNjc3NzIwMCxraGFraToxNTc4NzY2MCxsYXZlbmRlcjoxNTEzMjQxMCxsYXZlbmRlcmJsdXNoOjE2NzczMzY1LGxhd25ncmVlbjo4MTkwOTc2LGxlbW9uY2hpZmZvbjoxNjc3NTg4NSxsaWdodGJsdWU6MTEzOTMyNTQsbGlnaHRjb3JhbDoxNTc2MTUzNixsaWdodGN5YW46MTQ3NDU1OTksbGlnaHRnb2xkZW5yb2R5ZWxsb3c6MTY0NDgyMTAsbGlnaHRncmF5OjEzODgyMzIzLGxpZ2h0Z3JlZW46OTQ5ODI1NixsaWdodGdyZXk6MTM4ODIzMjMsbGlnaHRwaW5rOjE2NzU4NDY1LGxpZ2h0c2FsbW9uOjE2NzUyNzYyLGxpZ2h0c2VhZ3JlZW46MjE0Mjg5MCxsaWdodHNreWJsdWU6ODkwMDM0NixsaWdodHNsYXRlZ3JheTo3ODMzNzUzLGxpZ2h0c2xhdGVncmV5Ojc4MzM3NTMsbGlnaHRzdGVlbGJsdWU6MTE1ODQ3MzQsbGlnaHR5ZWxsb3c6MTY3NzcxODQsbGltZTo2NTI4MCxsaW1lZ3JlZW46MzMyOTMzMCxsaW5lbjoxNjQ0NTY3MCxtYWdlbnRhOjE2NzExOTM1LG1hcm9vbjo4Mzg4NjA4LG1lZGl1bWFxdWFtYXJpbmU6NjczNzMyMixtZWRpdW1ibHVlOjIwNSxtZWRpdW1vcmNoaWQ6MTIyMTE2NjcsbWVkaXVtcHVycGxlOjk2NjI2ODMsbWVkaXVtc2VhZ3JlZW46Mzk3ODA5NyxtZWRpdW1zbGF0ZWJsdWU6ODA4Nzc5MCxtZWRpdW1zcHJpbmdncmVlbjo2NDE1NCxtZWRpdW10dXJxdW9pc2U6NDc3MjMwMCxtZWRpdW12aW9sZXRyZWQ6MTMwNDcxNzMsbWlkbmlnaHRibHVlOjE2NDQ5MTIsbWludGNyZWFtOjE2MTIxODUwLG1pc3R5cm9zZToxNjc3MDI3Myxtb2NjYXNpbjoxNjc3MDIyOSxuYXZham93aGl0ZToxNjc2ODY4NSxuYXZ5OjEyOCxvbGRsYWNlOjE2NjQzNTU4LG9saXZlOjg0MjEzNzYsb2xpdmVkcmFiOjcwNDg3Mzksb3JhbmdlOjE2NzUzOTIwLG9yYW5nZXJlZDoxNjcyOTM0NCxvcmNoaWQ6MTQzMTU3MzQscGFsZWdvbGRlbnJvZDoxNTY1NzEzMCxwYWxlZ3JlZW46MTAwMjU4ODAscGFsZXR1cnF1b2lzZToxMTUyOTk2NixwYWxldmlvbGV0cmVkOjE0MzgxMjAzLHBhcGF5YXdoaXA6MTY3NzMwNzcscGVhY2hwdWZmOjE2NzY3NjczLHBlcnU6MTM0Njg5OTEscGluazoxNjc2MTAzNSxwbHVtOjE0NTI0NjM3LHBvd2RlcmJsdWU6MTE1OTE5MTAscHVycGxlOjgzODg3MzYscmViZWNjYXB1cnBsZTo2Njk3ODgxLHJlZDoxNjcxMTY4MCxyb3N5YnJvd246MTIzNTc1MTkscm95YWxibHVlOjQyODY5NDUsc2FkZGxlYnJvd246OTEyNzE4NyxzYWxtb246MTY0MTY4ODIsc2FuZHlicm93bjoxNjAzMjg2NCxzZWFncmVlbjozMDUwMzI3LHNlYXNoZWxsOjE2Nzc0NjM4LHNpZW5uYToxMDUwNjc5NyxzaWx2ZXI6MTI2MzIyNTYsc2t5Ymx1ZTo4OTAwMzMxLHNsYXRlYmx1ZTo2OTcwMDYxLHNsYXRlZ3JheTo3MzcyOTQ0LHNsYXRlZ3JleTo3MzcyOTQ0LHNub3c6MTY3NzU5MzAsc3ByaW5nZ3JlZW46NjU0MDcsc3RlZWxibHVlOjQ2MjA5ODAsdGFuOjEzODA4NzgwLHRlYWw6MzI4OTYsdGhpc3RsZToxNDIwNDg4OCx0b21hdG86MTY3MzcwOTUsdHVycXVvaXNlOjQyNTE4NTYsdmlvbGV0OjE1NjMxMDg2LHdoZWF0OjE2MTEzMzMxLHdoaXRlOjE2Nzc3MjE1LHdoaXRlc21va2U6MTYxMTkyODUseWVsbG93OjE2Nzc2OTYwLHllbGxvd2dyZWVuOjEwMTQ1MDc0fSxpZT17aDowLHM6MCxsOjB9LExzPXtoOjAsczowLGw6MH07ZnVuY3Rpb24gSG4ocix0LGUpe3JldHVybiBlPDAmJihlKz0xKSxlPjEmJihlLT0xKSxlPDEvNj9yKyh0LXIpKjYqZTplPDEvMj90OmU8Mi8zP3IrKHQtcikqNiooMi8zLWUpOnJ9Y2xhc3MgcW57Y29uc3RydWN0b3IodCxlLHMpe3JldHVybiB0aGlzLmlzQ29sb3I9ITAsdGhpcy5yPTEsdGhpcy5nPTEsdGhpcy5iPTEsdGhpcy5zZXQodCxlLHMpfXNldCh0LGUscyl7aWYoZT09PXZvaWQgMCYmcz09PXZvaWQgMCl7Y29uc3Qgbj10O24mJm4uaXNDb2xvcj90aGlzLmNvcHkobik6dHlwZW9mIG49PSJudW1iZXIiP3RoaXMuc2V0SGV4KG4pOnR5cGVvZiBuPT0ic3RyaW5nIiYmdGhpcy5zZXRTdHlsZShuKX1lbHNlIHRoaXMuc2V0UkdCKHQsZSxzKTtyZXR1cm4gdGhpc31zZXRTY2FsYXIodCl7cmV0dXJuIHRoaXMucj10LHRoaXMuZz10LHRoaXMuYj10LHRoaXN9c2V0SGV4KHQsZT0kdCl7cmV0dXJuIHQ9TWF0aC5mbG9vcih0KSx0aGlzLnI9KHQ+PjE2JjI1NSkvMjU1LHRoaXMuZz0odD4+OCYyNTUpLzI1NSx0aGlzLmI9KHQmMjU1KS8yNTUsbXQudG9Xb3JraW5nQ29sb3JTcGFjZSh0aGlzLGUpLHRoaXN9c2V0UkdCKHQsZSxzLG49bXQud29ya2luZ0NvbG9yU3BhY2Upe3JldHVybiB0aGlzLnI9dCx0aGlzLmc9ZSx0aGlzLmI9cyxtdC50b1dvcmtpbmdDb2xvclNwYWNlKHRoaXMsbiksdGhpc31zZXRIU0wodCxlLHMsbj1tdC53b3JraW5nQ29sb3JTcGFjZSl7aWYodD1ibih0LDEpLGU9YXQoZSwwLDEpLHM9YXQocywwLDEpLGU9PT0wKXRoaXMucj10aGlzLmc9dGhpcy5iPXM7ZWxzZXtjb25zdCBpPXM8PS41P3MqKDErZSk6cytlLXMqZSxvPTIqcy1pO3RoaXMucj1IbihvLGksdCsxLzMpLHRoaXMuZz1IbihvLGksdCksdGhpcy5iPUhuKG8saSx0LTEvMyl9cmV0dXJuIG10LnRvV29ya2luZ0NvbG9yU3BhY2UodGhpcyxuKSx0aGlzfXNldFN0eWxlKHQsZT0kdCl7ZnVuY3Rpb24gcyhpKXtpIT09dm9pZCAwJiZwYXJzZUZsb2F0KGkpPDEmJmNvbnNvbGUud2FybigiVEhSRUUuQ29sb3I6IEFscGhhIGNvbXBvbmVudCBvZiAiK3QrIiB3aWxsIGJlIGlnbm9yZWQuIil9bGV0IG47aWYobj0vXihcdyspXCgoW15cKV0qKVwpLy5leGVjKHQpKXtsZXQgaTtjb25zdCBvPW5bMV0sYT1uWzJdO3N3aXRjaChvKXtjYXNlInJnYiI6Y2FzZSJyZ2JhIjppZihpPS9eXHMqKFxkKylccyosXHMqKFxkKylccyosXHMqKFxkKylccyooPzosXHMqKFxkKlwuP1xkKylccyopPyQvLmV4ZWMoYSkpcmV0dXJuIHMoaVs0XSksdGhpcy5zZXRSR0IoTWF0aC5taW4oMjU1LHBhcnNlSW50KGlbMV0sMTApKS8yNTUsTWF0aC5taW4oMjU1LHBhcnNlSW50KGlbMl0sMTApKS8yNTUsTWF0aC5taW4oMjU1LHBhcnNlSW50KGlbM10sMTApKS8yNTUsZSk7aWYoaT0vXlxzKihcZCspXCVccyosXHMqKFxkKylcJVxzKixccyooXGQrKVwlXHMqKD86LFxzKihcZCpcLj9cZCspXHMqKT8kLy5leGVjKGEpKXJldHVybiBzKGlbNF0pLHRoaXMuc2V0UkdCKE1hdGgubWluKDEwMCxwYXJzZUludChpWzFdLDEwKSkvMTAwLE1hdGgubWluKDEwMCxwYXJzZUludChpWzJdLDEwKSkvMTAwLE1hdGgubWluKDEwMCxwYXJzZUludChpWzNdLDEwKSkvMTAwLGUpO2JyZWFrO2Nhc2UiaHNsIjpjYXNlImhzbGEiOmlmKGk9L15ccyooXGQqXC4/XGQrKVxzKixccyooXGQqXC4/XGQrKVwlXHMqLFxzKihcZCpcLj9cZCspXCVccyooPzosXHMqKFxkKlwuP1xkKylccyopPyQvLmV4ZWMoYSkpcmV0dXJuIHMoaVs0XSksdGhpcy5zZXRIU0wocGFyc2VGbG9hdChpWzFdKS8zNjAscGFyc2VGbG9hdChpWzJdKS8xMDAscGFyc2VGbG9hdChpWzNdKS8xMDAsZSk7YnJlYWs7ZGVmYXVsdDpjb25zb2xlLndhcm4oIlRIUkVFLkNvbG9yOiBVbmtub3duIGNvbG9yIG1vZGVsICIrdCl9fWVsc2UgaWYobj0vXlwjKFtBLUZhLWZcZF0rKSQvLmV4ZWModCkpe2NvbnN0IGk9blsxXSxvPWkubGVuZ3RoO2lmKG89PT0zKXJldHVybiB0aGlzLnNldFJHQihwYXJzZUludChpLmNoYXJBdCgwKSwxNikvMTUscGFyc2VJbnQoaS5jaGFyQXQoMSksMTYpLzE1LHBhcnNlSW50KGkuY2hhckF0KDIpLDE2KS8xNSxlKTtpZihvPT09NilyZXR1cm4gdGhpcy5zZXRIZXgocGFyc2VJbnQoaSwxNiksZSk7Y29uc29sZS53YXJuKCJUSFJFRS5Db2xvcjogSW52YWxpZCBoZXggY29sb3IgIit0KX1lbHNlIGlmKHQmJnQubGVuZ3RoPjApcmV0dXJuIHRoaXMuc2V0Q29sb3JOYW1lKHQsZSk7cmV0dXJuIHRoaXN9c2V0Q29sb3JOYW1lKHQsZT0kdCl7Y29uc3Qgcz1nclt0LnRvTG93ZXJDYXNlKCldO3JldHVybiBzIT09dm9pZCAwP3RoaXMuc2V0SGV4KHMsZSk6Y29uc29sZS53YXJuKCJUSFJFRS5Db2xvcjogVW5rbm93biBjb2xvciAiK3QpLHRoaXN9Y2xvbmUoKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IodGhpcy5yLHRoaXMuZyx0aGlzLmIpfWNvcHkodCl7cmV0dXJuIHRoaXMucj10LnIsdGhpcy5nPXQuZyx0aGlzLmI9dC5iLHRoaXN9Y29weVNSR0JUb0xpbmVhcih0KXtyZXR1cm4gdGhpcy5yPXhlKHQuciksdGhpcy5nPXhlKHQuZyksdGhpcy5iPXhlKHQuYiksdGhpc31jb3B5TGluZWFyVG9TUkdCKHQpe3JldHVybiB0aGlzLnI9Q24odC5yKSx0aGlzLmc9Q24odC5nKSx0aGlzLmI9Q24odC5iKSx0aGlzfWNvbnZlcnRTUkdCVG9MaW5lYXIoKXtyZXR1cm4gdGhpcy5jb3B5U1JHQlRvTGluZWFyKHRoaXMpLHRoaXN9Y29udmVydExpbmVhclRvU1JHQigpe3JldHVybiB0aGlzLmNvcHlMaW5lYXJUb1NSR0IodGhpcyksdGhpc31nZXRIZXgodD0kdCl7cmV0dXJuIG10LmZyb21Xb3JraW5nQ29sb3JTcGFjZShjdC5jb3B5KHRoaXMpLHQpLE1hdGgucm91bmQoYXQoY3QucioyNTUsMCwyNTUpKSo2NTUzNitNYXRoLnJvdW5kKGF0KGN0LmcqMjU1LDAsMjU1KSkqMjU2K01hdGgucm91bmQoYXQoY3QuYioyNTUsMCwyNTUpKX1nZXRIZXhTdHJpbmcodD0kdCl7cmV0dXJuKCIwMDAwMDAiK3RoaXMuZ2V0SGV4KHQpLnRvU3RyaW5nKDE2KSkuc2xpY2UoLTYpfWdldEhTTCh0LGU9bXQud29ya2luZ0NvbG9yU3BhY2Upe210LmZyb21Xb3JraW5nQ29sb3JTcGFjZShjdC5jb3B5KHRoaXMpLGUpO2NvbnN0IHM9Y3QucixuPWN0LmcsaT1jdC5iLG89TWF0aC5tYXgocyxuLGkpLGE9TWF0aC5taW4ocyxuLGkpO2xldCBjLHU7Y29uc3QgaD0oYStvKS8yO2lmKGE9PT1vKWM9MCx1PTA7ZWxzZXtjb25zdCBsPW8tYTtzd2l0Y2godT1oPD0uNT9sLyhvK2EpOmwvKDItby1hKSxvKXtjYXNlIHM6Yz0obi1pKS9sKyhuPGk/NjowKTticmVhaztjYXNlIG46Yz0oaS1zKS9sKzI7YnJlYWs7Y2FzZSBpOmM9KHMtbikvbCs0O2JyZWFrfWMvPTZ9cmV0dXJuIHQuaD1jLHQucz11LHQubD1oLHR9Z2V0UkdCKHQsZT1tdC53b3JraW5nQ29sb3JTcGFjZSl7cmV0dXJuIG10LmZyb21Xb3JraW5nQ29sb3JTcGFjZShjdC5jb3B5KHRoaXMpLGUpLHQucj1jdC5yLHQuZz1jdC5nLHQuYj1jdC5iLHR9Z2V0U3R5bGUodD0kdCl7bXQuZnJvbVdvcmtpbmdDb2xvclNwYWNlKGN0LmNvcHkodGhpcyksdCk7Y29uc3QgZT1jdC5yLHM9Y3QuZyxuPWN0LmI7cmV0dXJuIHQhPT0kdD9gY29sb3IoJHt0fSAke2UudG9GaXhlZCgzKX0gJHtzLnRvRml4ZWQoMyl9ICR7bi50b0ZpeGVkKDMpfSlgOmByZ2IoJHtNYXRoLnJvdW5kKGUqMjU1KX0sJHtNYXRoLnJvdW5kKHMqMjU1KX0sJHtNYXRoLnJvdW5kKG4qMjU1KX0pYH1vZmZzZXRIU0wodCxlLHMpe3JldHVybiB0aGlzLmdldEhTTChpZSksdGhpcy5zZXRIU0woaWUuaCt0LGllLnMrZSxpZS5sK3MpfWFkZCh0KXtyZXR1cm4gdGhpcy5yKz10LnIsdGhpcy5nKz10LmcsdGhpcy5iKz10LmIsdGhpc31hZGRDb2xvcnModCxlKXtyZXR1cm4gdGhpcy5yPXQucitlLnIsdGhpcy5nPXQuZytlLmcsdGhpcy5iPXQuYitlLmIsdGhpc31hZGRTY2FsYXIodCl7cmV0dXJuIHRoaXMucis9dCx0aGlzLmcrPXQsdGhpcy5iKz10LHRoaXN9c3ViKHQpe3JldHVybiB0aGlzLnI9TWF0aC5tYXgoMCx0aGlzLnItdC5yKSx0aGlzLmc9TWF0aC5tYXgoMCx0aGlzLmctdC5nKSx0aGlzLmI9TWF0aC5tYXgoMCx0aGlzLmItdC5iKSx0aGlzfW11bHRpcGx5KHQpe3JldHVybiB0aGlzLnIqPXQucix0aGlzLmcqPXQuZyx0aGlzLmIqPXQuYix0aGlzfW11bHRpcGx5U2NhbGFyKHQpe3JldHVybiB0aGlzLnIqPXQsdGhpcy5nKj10LHRoaXMuYio9dCx0aGlzfWxlcnAodCxlKXtyZXR1cm4gdGhpcy5yKz0odC5yLXRoaXMucikqZSx0aGlzLmcrPSh0LmctdGhpcy5nKSplLHRoaXMuYis9KHQuYi10aGlzLmIpKmUsdGhpc31sZXJwQ29sb3JzKHQsZSxzKXtyZXR1cm4gdGhpcy5yPXQucisoZS5yLXQucikqcyx0aGlzLmc9dC5nKyhlLmctdC5nKSpzLHRoaXMuYj10LmIrKGUuYi10LmIpKnMsdGhpc31sZXJwSFNMKHQsZSl7dGhpcy5nZXRIU0woaWUpLHQuZ2V0SFNMKExzKTtjb25zdCBzPUplKGllLmgsTHMuaCxlKSxuPUplKGllLnMsTHMucyxlKSxpPUplKGllLmwsTHMubCxlKTtyZXR1cm4gdGhpcy5zZXRIU0wocyxuLGkpLHRoaXN9c2V0RnJvbVZlY3RvcjModCl7cmV0dXJuIHRoaXMucj10LngsdGhpcy5nPXQueSx0aGlzLmI9dC56LHRoaXN9YXBwbHlNYXRyaXgzKHQpe2NvbnN0IGU9dGhpcy5yLHM9dGhpcy5nLG49dGhpcy5iLGk9dC5lbGVtZW50cztyZXR1cm4gdGhpcy5yPWlbMF0qZStpWzNdKnMraVs2XSpuLHRoaXMuZz1pWzFdKmUraVs0XSpzK2lbN10qbix0aGlzLmI9aVsyXSplK2lbNV0qcytpWzhdKm4sdGhpc31lcXVhbHModCl7cmV0dXJuIHQucj09PXRoaXMuciYmdC5nPT09dGhpcy5nJiZ0LmI9PT10aGlzLmJ9ZnJvbUFycmF5KHQsZT0wKXtyZXR1cm4gdGhpcy5yPXRbZV0sdGhpcy5nPXRbZSsxXSx0aGlzLmI9dFtlKzJdLHRoaXN9dG9BcnJheSh0PVtdLGU9MCl7cmV0dXJuIHRbZV09dGhpcy5yLHRbZSsxXT10aGlzLmcsdFtlKzJdPXRoaXMuYix0fWZyb21CdWZmZXJBdHRyaWJ1dGUodCxlKXtyZXR1cm4gdGhpcy5yPXQuZ2V0WChlKSx0aGlzLmc9dC5nZXRZKGUpLHRoaXMuYj10LmdldFooZSksdGhpc310b0pTT04oKXtyZXR1cm4gdGhpcy5nZXRIZXgoKX0qW1N5bWJvbC5pdGVyYXRvcl0oKXt5aWVsZCB0aGlzLnIseWllbGQgdGhpcy5nLHlpZWxkIHRoaXMuYn19Y29uc3QgY3Q9bmV3IHFuO3FuLk5BTUVTPWdyO2NvbnN0IGo9bmV3IEEsT3M9bmV3IEo7Y2xhc3MgdnR7Y29uc3RydWN0b3IodCxlLHM9ITEpe2lmKEFycmF5LmlzQXJyYXkodCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiVEhSRUUuQnVmZmVyQXR0cmlidXRlOiBhcnJheSBzaG91bGQgYmUgYSBUeXBlZCBBcnJheS4iKTt0aGlzLmlzQnVmZmVyQXR0cmlidXRlPSEwLHRoaXMubmFtZT0iIix0aGlzLmFycmF5PXQsdGhpcy5pdGVtU2l6ZT1lLHRoaXMuY291bnQ9dCE9PXZvaWQgMD90Lmxlbmd0aC9lOjAsdGhpcy5ub3JtYWxpemVkPXMsdGhpcy51c2FnZT1Dcyx0aGlzLnVwZGF0ZVJhbmdlcz1bXSx0aGlzLmdwdVR5cGU9SW8sdGhpcy52ZXJzaW9uPTB9b25VcGxvYWRDYWxsYmFjaygpe31zZXQgbmVlZHNVcGRhdGUodCl7dD09PSEwJiZ0aGlzLnZlcnNpb24rK31zZXRVc2FnZSh0KXtyZXR1cm4gdGhpcy51c2FnZT10LHRoaXN9YWRkVXBkYXRlUmFuZ2UodCxlKXt0aGlzLnVwZGF0ZVJhbmdlcy5wdXNoKHtzdGFydDp0LGNvdW50OmV9KX1jbGVhclVwZGF0ZVJhbmdlcygpe3RoaXMudXBkYXRlUmFuZ2VzLmxlbmd0aD0wfWNvcHkodCl7cmV0dXJuIHRoaXMubmFtZT10Lm5hbWUsdGhpcy5hcnJheT1uZXcgdC5hcnJheS5jb25zdHJ1Y3Rvcih0LmFycmF5KSx0aGlzLml0ZW1TaXplPXQuaXRlbVNpemUsdGhpcy5jb3VudD10LmNvdW50LHRoaXMubm9ybWFsaXplZD10Lm5vcm1hbGl6ZWQsdGhpcy51c2FnZT10LnVzYWdlLHRoaXMuZ3B1VHlwZT10LmdwdVR5cGUsdGhpc31jb3B5QXQodCxlLHMpe3QqPXRoaXMuaXRlbVNpemUscyo9ZS5pdGVtU2l6ZTtmb3IobGV0IG49MCxpPXRoaXMuaXRlbVNpemU7bjxpO24rKyl0aGlzLmFycmF5W3Qrbl09ZS5hcnJheVtzK25dO3JldHVybiB0aGlzfWNvcHlBcnJheSh0KXtyZXR1cm4gdGhpcy5hcnJheS5zZXQodCksdGhpc31hcHBseU1hdHJpeDModCl7aWYodGhpcy5pdGVtU2l6ZT09PTIpZm9yKGxldCBlPTAscz10aGlzLmNvdW50O2U8cztlKyspT3MuZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0aGlzLGUpLE9zLmFwcGx5TWF0cml4Myh0KSx0aGlzLnNldFhZKGUsT3MueCxPcy55KTtlbHNlIGlmKHRoaXMuaXRlbVNpemU9PT0zKWZvcihsZXQgZT0wLHM9dGhpcy5jb3VudDtlPHM7ZSsrKWouZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0aGlzLGUpLGouYXBwbHlNYXRyaXgzKHQpLHRoaXMuc2V0WFlaKGUsai54LGoueSxqLnopO3JldHVybiB0aGlzfWFwcGx5TWF0cml4NCh0KXtmb3IobGV0IGU9MCxzPXRoaXMuY291bnQ7ZTxzO2UrKylqLmZyb21CdWZmZXJBdHRyaWJ1dGUodGhpcyxlKSxqLmFwcGx5TWF0cml4NCh0KSx0aGlzLnNldFhZWihlLGoueCxqLnksai56KTtyZXR1cm4gdGhpc31hcHBseU5vcm1hbE1hdHJpeCh0KXtmb3IobGV0IGU9MCxzPXRoaXMuY291bnQ7ZTxzO2UrKylqLmZyb21CdWZmZXJBdHRyaWJ1dGUodGhpcyxlKSxqLmFwcGx5Tm9ybWFsTWF0cml4KHQpLHRoaXMuc2V0WFlaKGUsai54LGoueSxqLnopO3JldHVybiB0aGlzfXRyYW5zZm9ybURpcmVjdGlvbih0KXtmb3IobGV0IGU9MCxzPXRoaXMuY291bnQ7ZTxzO2UrKylqLmZyb21CdWZmZXJBdHRyaWJ1dGUodGhpcyxlKSxqLnRyYW5zZm9ybURpcmVjdGlvbih0KSx0aGlzLnNldFhZWihlLGoueCxqLnksai56KTtyZXR1cm4gdGhpc31zZXQodCxlPTApe3JldHVybiB0aGlzLmFycmF5LnNldCh0LGUpLHRoaXN9Z2V0Q29tcG9uZW50KHQsZSl7bGV0IHM9dGhpcy5hcnJheVt0KnRoaXMuaXRlbVNpemUrZV07cmV0dXJuIHRoaXMubm9ybWFsaXplZCYmKHM9RXQocyx0aGlzLmFycmF5KSksc31zZXRDb21wb25lbnQodCxlLHMpe3JldHVybiB0aGlzLm5vcm1hbGl6ZWQmJihzPSQocyx0aGlzLmFycmF5KSksdGhpcy5hcnJheVt0KnRoaXMuaXRlbVNpemUrZV09cyx0aGlzfWdldFgodCl7bGV0IGU9dGhpcy5hcnJheVt0KnRoaXMuaXRlbVNpemVdO3JldHVybiB0aGlzLm5vcm1hbGl6ZWQmJihlPUV0KGUsdGhpcy5hcnJheSkpLGV9c2V0WCh0LGUpe3JldHVybiB0aGlzLm5vcm1hbGl6ZWQmJihlPSQoZSx0aGlzLmFycmF5KSksdGhpcy5hcnJheVt0KnRoaXMuaXRlbVNpemVdPWUsdGhpc31nZXRZKHQpe2xldCBlPXRoaXMuYXJyYXlbdCp0aGlzLml0ZW1TaXplKzFdO3JldHVybiB0aGlzLm5vcm1hbGl6ZWQmJihlPUV0KGUsdGhpcy5hcnJheSkpLGV9c2V0WSh0LGUpe3JldHVybiB0aGlzLm5vcm1hbGl6ZWQmJihlPSQoZSx0aGlzLmFycmF5KSksdGhpcy5hcnJheVt0KnRoaXMuaXRlbVNpemUrMV09ZSx0aGlzfWdldFoodCl7bGV0IGU9dGhpcy5hcnJheVt0KnRoaXMuaXRlbVNpemUrMl07cmV0dXJuIHRoaXMubm9ybWFsaXplZCYmKGU9RXQoZSx0aGlzLmFycmF5KSksZX1zZXRaKHQsZSl7cmV0dXJuIHRoaXMubm9ybWFsaXplZCYmKGU9JChlLHRoaXMuYXJyYXkpKSx0aGlzLmFycmF5W3QqdGhpcy5pdGVtU2l6ZSsyXT1lLHRoaXN9Z2V0Vyh0KXtsZXQgZT10aGlzLmFycmF5W3QqdGhpcy5pdGVtU2l6ZSszXTtyZXR1cm4gdGhpcy5ub3JtYWxpemVkJiYoZT1FdChlLHRoaXMuYXJyYXkpKSxlfXNldFcodCxlKXtyZXR1cm4gdGhpcy5ub3JtYWxpemVkJiYoZT0kKGUsdGhpcy5hcnJheSkpLHRoaXMuYXJyYXlbdCp0aGlzLml0ZW1TaXplKzNdPWUsdGhpc31zZXRYWSh0LGUscyl7cmV0dXJuIHQqPXRoaXMuaXRlbVNpemUsdGhpcy5ub3JtYWxpemVkJiYoZT0kKGUsdGhpcy5hcnJheSkscz0kKHMsdGhpcy5hcnJheSkpLHRoaXMuYXJyYXlbdCswXT1lLHRoaXMuYXJyYXlbdCsxXT1zLHRoaXN9c2V0WFlaKHQsZSxzLG4pe3JldHVybiB0Kj10aGlzLml0ZW1TaXplLHRoaXMubm9ybWFsaXplZCYmKGU9JChlLHRoaXMuYXJyYXkpLHM9JChzLHRoaXMuYXJyYXkpLG49JChuLHRoaXMuYXJyYXkpKSx0aGlzLmFycmF5W3QrMF09ZSx0aGlzLmFycmF5W3QrMV09cyx0aGlzLmFycmF5W3QrMl09bix0aGlzfXNldFhZWlcodCxlLHMsbixpKXtyZXR1cm4gdCo9dGhpcy5pdGVtU2l6ZSx0aGlzLm5vcm1hbGl6ZWQmJihlPSQoZSx0aGlzLmFycmF5KSxzPSQocyx0aGlzLmFycmF5KSxuPSQobix0aGlzLmFycmF5KSxpPSQoaSx0aGlzLmFycmF5KSksdGhpcy5hcnJheVt0KzBdPWUsdGhpcy5hcnJheVt0KzFdPXMsdGhpcy5hcnJheVt0KzJdPW4sdGhpcy5hcnJheVt0KzNdPWksdGhpc31vblVwbG9hZCh0KXtyZXR1cm4gdGhpcy5vblVwbG9hZENhbGxiYWNrPXQsdGhpc31jbG9uZSgpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3Rvcih0aGlzLmFycmF5LHRoaXMuaXRlbVNpemUpLmNvcHkodGhpcyl9dG9KU09OKCl7Y29uc3QgdD17aXRlbVNpemU6dGhpcy5pdGVtU2l6ZSx0eXBlOnRoaXMuYXJyYXkuY29uc3RydWN0b3IubmFtZSxhcnJheTpBcnJheS5mcm9tKHRoaXMuYXJyYXkpLG5vcm1hbGl6ZWQ6dGhpcy5ub3JtYWxpemVkfTtyZXR1cm4gdGhpcy5uYW1lIT09IiImJih0Lm5hbWU9dGhpcy5uYW1lKSx0aGlzLnVzYWdlIT09Q3MmJih0LnVzYWdlPXRoaXMudXNhZ2UpLHR9fWNsYXNzIG1hIGV4dGVuZHMgdnR7Y29uc3RydWN0b3IodCxlLHMpe3N1cGVyKG5ldyBVaW50MTZBcnJheSh0KSxlLHMpfX1jbGFzcyB5YSBleHRlbmRzIHZ0e2NvbnN0cnVjdG9yKHQsZSxzKXtzdXBlcihuZXcgVWludDMyQXJyYXkodCksZSxzKX19Y2xhc3MgZ2EgZXh0ZW5kcyB2dHtjb25zdHJ1Y3Rvcih0LGUscyl7c3VwZXIobmV3IEZsb2F0MzJBcnJheSh0KSxlLHMpfX1sZXQgeGE9MDtjb25zdCBBdD1uZXcgbnQsJG49bmV3IG5lLEVlPW5ldyBBLGd0PW5ldyBodCxzcz1uZXcgaHQsaXQ9bmV3IEE7Y2xhc3MgR24gZXh0ZW5kcyBaZXtjb25zdHJ1Y3Rvcigpe3N1cGVyKCksdGhpcy5pc0J1ZmZlckdlb21ldHJ5PSEwLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJpZCIse3ZhbHVlOnhhKyt9KSx0aGlzLnV1aWQ9S3QoKSx0aGlzLm5hbWU9IiIsdGhpcy50eXBlPSJCdWZmZXJHZW9tZXRyeSIsdGhpcy5pbmRleD1udWxsLHRoaXMuYXR0cmlidXRlcz17fSx0aGlzLm1vcnBoQXR0cmlidXRlcz17fSx0aGlzLm1vcnBoVGFyZ2V0c1JlbGF0aXZlPSExLHRoaXMuZ3JvdXBzPVtdLHRoaXMuYm91bmRpbmdCb3g9bnVsbCx0aGlzLmJvdW5kaW5nU3BoZXJlPW51bGwsdGhpcy5kcmF3UmFuZ2U9e3N0YXJ0OjAsY291bnQ6MS8wfSx0aGlzLnVzZXJEYXRhPXt9fWdldEluZGV4KCl7cmV0dXJuIHRoaXMuaW5kZXh9c2V0SW5kZXgodCl7cmV0dXJuIEFycmF5LmlzQXJyYXkodCk/dGhpcy5pbmRleD1uZXcoc2EodCk/eWE6bWEpKHQsMSk6dGhpcy5pbmRleD10LHRoaXN9Z2V0QXR0cmlidXRlKHQpe3JldHVybiB0aGlzLmF0dHJpYnV0ZXNbdF19c2V0QXR0cmlidXRlKHQsZSl7cmV0dXJuIHRoaXMuYXR0cmlidXRlc1t0XT1lLHRoaXN9ZGVsZXRlQXR0cmlidXRlKHQpe3JldHVybiBkZWxldGUgdGhpcy5hdHRyaWJ1dGVzW3RdLHRoaXN9aGFzQXR0cmlidXRlKHQpe3JldHVybiB0aGlzLmF0dHJpYnV0ZXNbdF0hPT12b2lkIDB9YWRkR3JvdXAodCxlLHM9MCl7dGhpcy5ncm91cHMucHVzaCh7c3RhcnQ6dCxjb3VudDplLG1hdGVyaWFsSW5kZXg6c30pfWNsZWFyR3JvdXBzKCl7dGhpcy5ncm91cHM9W119c2V0RHJhd1JhbmdlKHQsZSl7dGhpcy5kcmF3UmFuZ2Uuc3RhcnQ9dCx0aGlzLmRyYXdSYW5nZS5jb3VudD1lfWFwcGx5TWF0cml4NCh0KXtjb25zdCBlPXRoaXMuYXR0cmlidXRlcy5wb3NpdGlvbjtlIT09dm9pZCAwJiYoZS5hcHBseU1hdHJpeDQodCksZS5uZWVkc1VwZGF0ZT0hMCk7Y29uc3Qgcz10aGlzLmF0dHJpYnV0ZXMubm9ybWFsO2lmKHMhPT12b2lkIDApe2NvbnN0IGk9bmV3IEN0KCkuZ2V0Tm9ybWFsTWF0cml4KHQpO3MuYXBwbHlOb3JtYWxNYXRyaXgoaSkscy5uZWVkc1VwZGF0ZT0hMH1jb25zdCBuPXRoaXMuYXR0cmlidXRlcy50YW5nZW50O3JldHVybiBuIT09dm9pZCAwJiYobi50cmFuc2Zvcm1EaXJlY3Rpb24odCksbi5uZWVkc1VwZGF0ZT0hMCksdGhpcy5ib3VuZGluZ0JveCE9PW51bGwmJnRoaXMuY29tcHV0ZUJvdW5kaW5nQm94KCksdGhpcy5ib3VuZGluZ1NwaGVyZSE9PW51bGwmJnRoaXMuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCksdGhpc31hcHBseVF1YXRlcm5pb24odCl7cmV0dXJuIEF0Lm1ha2VSb3RhdGlvbkZyb21RdWF0ZXJuaW9uKHQpLHRoaXMuYXBwbHlNYXRyaXg0KEF0KSx0aGlzfXJvdGF0ZVgodCl7cmV0dXJuIEF0Lm1ha2VSb3RhdGlvblgodCksdGhpcy5hcHBseU1hdHJpeDQoQXQpLHRoaXN9cm90YXRlWSh0KXtyZXR1cm4gQXQubWFrZVJvdGF0aW9uWSh0KSx0aGlzLmFwcGx5TWF0cml4NChBdCksdGhpc31yb3RhdGVaKHQpe3JldHVybiBBdC5tYWtlUm90YXRpb25aKHQpLHRoaXMuYXBwbHlNYXRyaXg0KEF0KSx0aGlzfXRyYW5zbGF0ZSh0LGUscyl7cmV0dXJuIEF0Lm1ha2VUcmFuc2xhdGlvbih0LGUscyksdGhpcy5hcHBseU1hdHJpeDQoQXQpLHRoaXN9c2NhbGUodCxlLHMpe3JldHVybiBBdC5tYWtlU2NhbGUodCxlLHMpLHRoaXMuYXBwbHlNYXRyaXg0KEF0KSx0aGlzfWxvb2tBdCh0KXtyZXR1cm4gJG4ubG9va0F0KHQpLCRuLnVwZGF0ZU1hdHJpeCgpLHRoaXMuYXBwbHlNYXRyaXg0KCRuLm1hdHJpeCksdGhpc31jZW50ZXIoKXtyZXR1cm4gdGhpcy5jb21wdXRlQm91bmRpbmdCb3goKSx0aGlzLmJvdW5kaW5nQm94LmdldENlbnRlcihFZSkubmVnYXRlKCksdGhpcy50cmFuc2xhdGUoRWUueCxFZS55LEVlLnopLHRoaXN9c2V0RnJvbVBvaW50cyh0KXtjb25zdCBlPVtdO2ZvcihsZXQgcz0wLG49dC5sZW5ndGg7czxuO3MrKyl7Y29uc3QgaT10W3NdO2UucHVzaChpLngsaS55LGkuenx8MCl9cmV0dXJuIHRoaXMuc2V0QXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IGdhKGUsMykpLHRoaXN9Y29tcHV0ZUJvdW5kaW5nQm94KCl7dGhpcy5ib3VuZGluZ0JveD09PW51bGwmJih0aGlzLmJvdW5kaW5nQm94PW5ldyBodCk7Y29uc3QgdD10aGlzLmF0dHJpYnV0ZXMucG9zaXRpb24sZT10aGlzLm1vcnBoQXR0cmlidXRlcy5wb3NpdGlvbjtpZih0JiZ0LmlzR0xCdWZmZXJBdHRyaWJ1dGUpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLkJ1ZmZlckdlb21ldHJ5LmNvbXB1dGVCb3VuZGluZ0JveCgpOiBHTEJ1ZmZlckF0dHJpYnV0ZSByZXF1aXJlcyBhIG1hbnVhbCBib3VuZGluZyBib3guIix0aGlzKSx0aGlzLmJvdW5kaW5nQm94LnNldChuZXcgQSgtMS8wLC0xLzAsLTEvMCksbmV3IEEoMS8wLDEvMCwxLzApKTtyZXR1cm59aWYodCE9PXZvaWQgMCl7aWYodGhpcy5ib3VuZGluZ0JveC5zZXRGcm9tQnVmZmVyQXR0cmlidXRlKHQpLGUpZm9yKGxldCBzPTAsbj1lLmxlbmd0aDtzPG47cysrKXtjb25zdCBpPWVbc107Z3Quc2V0RnJvbUJ1ZmZlckF0dHJpYnV0ZShpKSx0aGlzLm1vcnBoVGFyZ2V0c1JlbGF0aXZlPyhpdC5hZGRWZWN0b3JzKHRoaXMuYm91bmRpbmdCb3gubWluLGd0Lm1pbiksdGhpcy5ib3VuZGluZ0JveC5leHBhbmRCeVBvaW50KGl0KSxpdC5hZGRWZWN0b3JzKHRoaXMuYm91bmRpbmdCb3gubWF4LGd0Lm1heCksdGhpcy5ib3VuZGluZ0JveC5leHBhbmRCeVBvaW50KGl0KSk6KHRoaXMuYm91bmRpbmdCb3guZXhwYW5kQnlQb2ludChndC5taW4pLHRoaXMuYm91bmRpbmdCb3guZXhwYW5kQnlQb2ludChndC5tYXgpKX19ZWxzZSB0aGlzLmJvdW5kaW5nQm94Lm1ha2VFbXB0eSgpOyhpc05hTih0aGlzLmJvdW5kaW5nQm94Lm1pbi54KXx8aXNOYU4odGhpcy5ib3VuZGluZ0JveC5taW4ueSl8fGlzTmFOKHRoaXMuYm91bmRpbmdCb3gubWluLnopKSYmY29uc29sZS5lcnJvcignVEhSRUUuQnVmZmVyR2VvbWV0cnkuY29tcHV0ZUJvdW5kaW5nQm94KCk6IENvbXB1dGVkIG1pbi9tYXggaGF2ZSBOYU4gdmFsdWVzLiBUaGUgInBvc2l0aW9uIiBhdHRyaWJ1dGUgaXMgbGlrZWx5IHRvIGhhdmUgTmFOIHZhbHVlcy4nLHRoaXMpfWNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpe3RoaXMuYm91bmRpbmdTcGhlcmU9PT1udWxsJiYodGhpcy5ib3VuZGluZ1NwaGVyZT1uZXcgY3IpO2NvbnN0IHQ9dGhpcy5hdHRyaWJ1dGVzLnBvc2l0aW9uLGU9dGhpcy5tb3JwaEF0dHJpYnV0ZXMucG9zaXRpb247aWYodCYmdC5pc0dMQnVmZmVyQXR0cmlidXRlKXtjb25zb2xlLmVycm9yKCJUSFJFRS5CdWZmZXJHZW9tZXRyeS5jb21wdXRlQm91bmRpbmdTcGhlcmUoKTogR0xCdWZmZXJBdHRyaWJ1dGUgcmVxdWlyZXMgYSBtYW51YWwgYm91bmRpbmcgc3BoZXJlLiIsdGhpcyksdGhpcy5ib3VuZGluZ1NwaGVyZS5zZXQobmV3IEEsMS8wKTtyZXR1cm59aWYodCl7Y29uc3Qgcz10aGlzLmJvdW5kaW5nU3BoZXJlLmNlbnRlcjtpZihndC5zZXRGcm9tQnVmZmVyQXR0cmlidXRlKHQpLGUpZm9yKGxldCBpPTAsbz1lLmxlbmd0aDtpPG87aSsrKXtjb25zdCBhPWVbaV07c3Muc2V0RnJvbUJ1ZmZlckF0dHJpYnV0ZShhKSx0aGlzLm1vcnBoVGFyZ2V0c1JlbGF0aXZlPyhpdC5hZGRWZWN0b3JzKGd0Lm1pbixzcy5taW4pLGd0LmV4cGFuZEJ5UG9pbnQoaXQpLGl0LmFkZFZlY3RvcnMoZ3QubWF4LHNzLm1heCksZ3QuZXhwYW5kQnlQb2ludChpdCkpOihndC5leHBhbmRCeVBvaW50KHNzLm1pbiksZ3QuZXhwYW5kQnlQb2ludChzcy5tYXgpKX1ndC5nZXRDZW50ZXIocyk7bGV0IG49MDtmb3IobGV0IGk9MCxvPXQuY291bnQ7aTxvO2krKylpdC5mcm9tQnVmZmVyQXR0cmlidXRlKHQsaSksbj1NYXRoLm1heChuLHMuZGlzdGFuY2VUb1NxdWFyZWQoaXQpKTtpZihlKWZvcihsZXQgaT0wLG89ZS5sZW5ndGg7aTxvO2krKyl7Y29uc3QgYT1lW2ldLGM9dGhpcy5tb3JwaFRhcmdldHNSZWxhdGl2ZTtmb3IobGV0IHU9MCxoPWEuY291bnQ7dTxoO3UrKylpdC5mcm9tQnVmZmVyQXR0cmlidXRlKGEsdSksYyYmKEVlLmZyb21CdWZmZXJBdHRyaWJ1dGUodCx1KSxpdC5hZGQoRWUpKSxuPU1hdGgubWF4KG4scy5kaXN0YW5jZVRvU3F1YXJlZChpdCkpfXRoaXMuYm91bmRpbmdTcGhlcmUucmFkaXVzPU1hdGguc3FydChuKSxpc05hTih0aGlzLmJvdW5kaW5nU3BoZXJlLnJhZGl1cykmJmNvbnNvbGUuZXJyb3IoJ1RIUkVFLkJ1ZmZlckdlb21ldHJ5LmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpOiBDb21wdXRlZCByYWRpdXMgaXMgTmFOLiBUaGUgInBvc2l0aW9uIiBhdHRyaWJ1dGUgaXMgbGlrZWx5IHRvIGhhdmUgTmFOIHZhbHVlcy4nLHRoaXMpfX1jb21wdXRlVGFuZ2VudHMoKXtjb25zdCB0PXRoaXMuaW5kZXgsZT10aGlzLmF0dHJpYnV0ZXM7aWYodD09PW51bGx8fGUucG9zaXRpb249PT12b2lkIDB8fGUubm9ybWFsPT09dm9pZCAwfHxlLnV2PT09dm9pZCAwKXtjb25zb2xlLmVycm9yKCJUSFJFRS5CdWZmZXJHZW9tZXRyeTogLmNvbXB1dGVUYW5nZW50cygpIGZhaWxlZC4gTWlzc2luZyByZXF1aXJlZCBhdHRyaWJ1dGVzIChpbmRleCwgcG9zaXRpb24sIG5vcm1hbCBvciB1dikiKTtyZXR1cm59Y29uc3Qgcz1lLnBvc2l0aW9uLG49ZS5ub3JtYWwsaT1lLnV2O3RoaXMuaGFzQXR0cmlidXRlKCJ0YW5nZW50Iik9PT0hMSYmdGhpcy5zZXRBdHRyaWJ1dGUoInRhbmdlbnQiLG5ldyB2dChuZXcgRmxvYXQzMkFycmF5KDQqcy5jb3VudCksNCkpO2NvbnN0IG89dGhpcy5nZXRBdHRyaWJ1dGUoInRhbmdlbnQiKSxhPVtdLGM9W107Zm9yKGxldCBFPTA7RTxzLmNvdW50O0UrKylhW0VdPW5ldyBBLGNbRV09bmV3IEE7Y29uc3QgdT1uZXcgQSxoPW5ldyBBLGw9bmV3IEEsZD1uZXcgSixmPW5ldyBKLHA9bmV3IEosbT1uZXcgQSxnPW5ldyBBO2Z1bmN0aW9uIHkoRSxGLFIpe3UuZnJvbUJ1ZmZlckF0dHJpYnV0ZShzLEUpLGguZnJvbUJ1ZmZlckF0dHJpYnV0ZShzLEYpLGwuZnJvbUJ1ZmZlckF0dHJpYnV0ZShzLFIpLGQuZnJvbUJ1ZmZlckF0dHJpYnV0ZShpLEUpLGYuZnJvbUJ1ZmZlckF0dHJpYnV0ZShpLEYpLHAuZnJvbUJ1ZmZlckF0dHJpYnV0ZShpLFIpLGguc3ViKHUpLGwuc3ViKHUpLGYuc3ViKGQpLHAuc3ViKGQpO2NvbnN0IEk9MS8oZi54KnAueS1wLngqZi55KTtpc0Zpbml0ZShJKSYmKG0uY29weShoKS5tdWx0aXBseVNjYWxhcihwLnkpLmFkZFNjYWxlZFZlY3RvcihsLC1mLnkpLm11bHRpcGx5U2NhbGFyKEkpLGcuY29weShsKS5tdWx0aXBseVNjYWxhcihmLngpLmFkZFNjYWxlZFZlY3RvcihoLC1wLngpLm11bHRpcGx5U2NhbGFyKEkpLGFbRV0uYWRkKG0pLGFbRl0uYWRkKG0pLGFbUl0uYWRkKG0pLGNbRV0uYWRkKGcpLGNbRl0uYWRkKGcpLGNbUl0uYWRkKGcpKX1sZXQgVD10aGlzLmdyb3VwcztULmxlbmd0aD09PTAmJihUPVt7c3RhcnQ6MCxjb3VudDp0LmNvdW50fV0pO2ZvcihsZXQgRT0wLEY9VC5sZW5ndGg7RTxGOysrRSl7Y29uc3QgUj1UW0VdLEk9Ui5zdGFydCxCPVIuY291bnQ7Zm9yKGxldCBQPUksTD1JK0I7UDxMO1ArPTMpeSh0LmdldFgoUCswKSx0LmdldFgoUCsxKSx0LmdldFgoUCsyKSl9Y29uc3Qgdz1uZXcgQSxNPW5ldyBBLE49bmV3IEEsXz1uZXcgQTtmdW5jdGlvbiBTKEUpe04uZnJvbUJ1ZmZlckF0dHJpYnV0ZShuLEUpLF8uY29weShOKTtjb25zdCBGPWFbRV07dy5jb3B5KEYpLHcuc3ViKE4ubXVsdGlwbHlTY2FsYXIoTi5kb3QoRikpKS5ub3JtYWxpemUoKSxNLmNyb3NzVmVjdG9ycyhfLEYpO2NvbnN0IEk9TS5kb3QoY1tFXSk8MD8tMToxO28uc2V0WFlaVyhFLHcueCx3Lnksdy56LEkpfWZvcihsZXQgRT0wLEY9VC5sZW5ndGg7RTxGOysrRSl7Y29uc3QgUj1UW0VdLEk9Ui5zdGFydCxCPVIuY291bnQ7Zm9yKGxldCBQPUksTD1JK0I7UDxMO1ArPTMpUyh0LmdldFgoUCswKSksUyh0LmdldFgoUCsxKSksUyh0LmdldFgoUCsyKSl9fWNvbXB1dGVWZXJ0ZXhOb3JtYWxzKCl7Y29uc3QgdD10aGlzLmluZGV4LGU9dGhpcy5nZXRBdHRyaWJ1dGUoInBvc2l0aW9uIik7aWYoZSE9PXZvaWQgMCl7bGV0IHM9dGhpcy5nZXRBdHRyaWJ1dGUoIm5vcm1hbCIpO2lmKHM9PT12b2lkIDApcz1uZXcgdnQobmV3IEZsb2F0MzJBcnJheShlLmNvdW50KjMpLDMpLHRoaXMuc2V0QXR0cmlidXRlKCJub3JtYWwiLHMpO2Vsc2UgZm9yKGxldCBkPTAsZj1zLmNvdW50O2Q8ZjtkKyspcy5zZXRYWVooZCwwLDAsMCk7Y29uc3Qgbj1uZXcgQSxpPW5ldyBBLG89bmV3IEEsYT1uZXcgQSxjPW5ldyBBLHU9bmV3IEEsaD1uZXcgQSxsPW5ldyBBO2lmKHQpZm9yKGxldCBkPTAsZj10LmNvdW50O2Q8ZjtkKz0zKXtjb25zdCBwPXQuZ2V0WChkKzApLG09dC5nZXRYKGQrMSksZz10LmdldFgoZCsyKTtuLmZyb21CdWZmZXJBdHRyaWJ1dGUoZSxwKSxpLmZyb21CdWZmZXJBdHRyaWJ1dGUoZSxtKSxvLmZyb21CdWZmZXJBdHRyaWJ1dGUoZSxnKSxoLnN1YlZlY3RvcnMobyxpKSxsLnN1YlZlY3RvcnMobixpKSxoLmNyb3NzKGwpLGEuZnJvbUJ1ZmZlckF0dHJpYnV0ZShzLHApLGMuZnJvbUJ1ZmZlckF0dHJpYnV0ZShzLG0pLHUuZnJvbUJ1ZmZlckF0dHJpYnV0ZShzLGcpLGEuYWRkKGgpLGMuYWRkKGgpLHUuYWRkKGgpLHMuc2V0WFlaKHAsYS54LGEueSxhLnopLHMuc2V0WFlaKG0sYy54LGMueSxjLnopLHMuc2V0WFlaKGcsdS54LHUueSx1LnopfWVsc2UgZm9yKGxldCBkPTAsZj1lLmNvdW50O2Q8ZjtkKz0zKW4uZnJvbUJ1ZmZlckF0dHJpYnV0ZShlLGQrMCksaS5mcm9tQnVmZmVyQXR0cmlidXRlKGUsZCsxKSxvLmZyb21CdWZmZXJBdHRyaWJ1dGUoZSxkKzIpLGguc3ViVmVjdG9ycyhvLGkpLGwuc3ViVmVjdG9ycyhuLGkpLGguY3Jvc3MobCkscy5zZXRYWVooZCswLGgueCxoLnksaC56KSxzLnNldFhZWihkKzEsaC54LGgueSxoLnopLHMuc2V0WFlaKGQrMixoLngsaC55LGgueik7dGhpcy5ub3JtYWxpemVOb3JtYWxzKCkscy5uZWVkc1VwZGF0ZT0hMH19bm9ybWFsaXplTm9ybWFscygpe2NvbnN0IHQ9dGhpcy5hdHRyaWJ1dGVzLm5vcm1hbDtmb3IobGV0IGU9MCxzPXQuY291bnQ7ZTxzO2UrKylpdC5mcm9tQnVmZmVyQXR0cmlidXRlKHQsZSksaXQubm9ybWFsaXplKCksdC5zZXRYWVooZSxpdC54LGl0LnksaXQueil9dG9Ob25JbmRleGVkKCl7ZnVuY3Rpb24gdChhLGMpe2NvbnN0IHU9YS5hcnJheSxoPWEuaXRlbVNpemUsbD1hLm5vcm1hbGl6ZWQsZD1uZXcgdS5jb25zdHJ1Y3RvcihjLmxlbmd0aCpoKTtsZXQgZj0wLHA9MDtmb3IobGV0IG09MCxnPWMubGVuZ3RoO208ZzttKyspe2EuaXNJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZT9mPWNbbV0qYS5kYXRhLnN0cmlkZSthLm9mZnNldDpmPWNbbV0qaDtmb3IobGV0IHk9MDt5PGg7eSsrKWRbcCsrXT11W2YrK119cmV0dXJuIG5ldyB2dChkLGgsbCl9aWYodGhpcy5pbmRleD09PW51bGwpcmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuQnVmZmVyR2VvbWV0cnkudG9Ob25JbmRleGVkKCk6IEJ1ZmZlckdlb21ldHJ5IGlzIGFscmVhZHkgbm9uLWluZGV4ZWQuIiksdGhpcztjb25zdCBlPW5ldyBHbixzPXRoaXMuaW5kZXguYXJyYXksbj10aGlzLmF0dHJpYnV0ZXM7Zm9yKGNvbnN0IGEgaW4gbil7Y29uc3QgYz1uW2FdLHU9dChjLHMpO2Uuc2V0QXR0cmlidXRlKGEsdSl9Y29uc3QgaT10aGlzLm1vcnBoQXR0cmlidXRlcztmb3IoY29uc3QgYSBpbiBpKXtjb25zdCBjPVtdLHU9aVthXTtmb3IobGV0IGg9MCxsPXUubGVuZ3RoO2g8bDtoKyspe2NvbnN0IGQ9dVtoXSxmPXQoZCxzKTtjLnB1c2goZil9ZS5tb3JwaEF0dHJpYnV0ZXNbYV09Y31lLm1vcnBoVGFyZ2V0c1JlbGF0aXZlPXRoaXMubW9ycGhUYXJnZXRzUmVsYXRpdmU7Y29uc3Qgbz10aGlzLmdyb3Vwcztmb3IobGV0IGE9MCxjPW8ubGVuZ3RoO2E8YzthKyspe2NvbnN0IHU9b1thXTtlLmFkZEdyb3VwKHUuc3RhcnQsdS5jb3VudCx1Lm1hdGVyaWFsSW5kZXgpfXJldHVybiBlfXRvSlNPTigpe2NvbnN0IHQ9e21ldGFkYXRhOnt2ZXJzaW9uOjQuNix0eXBlOiJCdWZmZXJHZW9tZXRyeSIsZ2VuZXJhdG9yOiJCdWZmZXJHZW9tZXRyeS50b0pTT04ifX07aWYodC51dWlkPXRoaXMudXVpZCx0LnR5cGU9dGhpcy50eXBlLHRoaXMubmFtZSE9PSIiJiYodC5uYW1lPXRoaXMubmFtZSksT2JqZWN0LmtleXModGhpcy51c2VyRGF0YSkubGVuZ3RoPjAmJih0LnVzZXJEYXRhPXRoaXMudXNlckRhdGEpLHRoaXMucGFyYW1ldGVycyE9PXZvaWQgMCl7Y29uc3QgYz10aGlzLnBhcmFtZXRlcnM7Zm9yKGNvbnN0IHUgaW4gYyljW3VdIT09dm9pZCAwJiYodFt1XT1jW3VdKTtyZXR1cm4gdH10LmRhdGE9e2F0dHJpYnV0ZXM6e319O2NvbnN0IGU9dGhpcy5pbmRleDtlIT09bnVsbCYmKHQuZGF0YS5pbmRleD17dHlwZTplLmFycmF5LmNvbnN0cnVjdG9yLm5hbWUsYXJyYXk6QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZS5hcnJheSl9KTtjb25zdCBzPXRoaXMuYXR0cmlidXRlcztmb3IoY29uc3QgYyBpbiBzKXtjb25zdCB1PXNbY107dC5kYXRhLmF0dHJpYnV0ZXNbY109dS50b0pTT04odC5kYXRhKX1jb25zdCBuPXt9O2xldCBpPSExO2Zvcihjb25zdCBjIGluIHRoaXMubW9ycGhBdHRyaWJ1dGVzKXtjb25zdCB1PXRoaXMubW9ycGhBdHRyaWJ1dGVzW2NdLGg9W107Zm9yKGxldCBsPTAsZD11Lmxlbmd0aDtsPGQ7bCsrKXtjb25zdCBmPXVbbF07aC5wdXNoKGYudG9KU09OKHQuZGF0YSkpfWgubGVuZ3RoPjAmJihuW2NdPWgsaT0hMCl9aSYmKHQuZGF0YS5tb3JwaEF0dHJpYnV0ZXM9bix0LmRhdGEubW9ycGhUYXJnZXRzUmVsYXRpdmU9dGhpcy5tb3JwaFRhcmdldHNSZWxhdGl2ZSk7Y29uc3Qgbz10aGlzLmdyb3VwcztvLmxlbmd0aD4wJiYodC5kYXRhLmdyb3Vwcz1KU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KG8pKSk7Y29uc3QgYT10aGlzLmJvdW5kaW5nU3BoZXJlO3JldHVybiBhIT09bnVsbCYmKHQuZGF0YS5ib3VuZGluZ1NwaGVyZT17Y2VudGVyOmEuY2VudGVyLnRvQXJyYXkoKSxyYWRpdXM6YS5yYWRpdXN9KSx0fWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSh0aGlzKX1jb3B5KHQpe3RoaXMuaW5kZXg9bnVsbCx0aGlzLmF0dHJpYnV0ZXM9e30sdGhpcy5tb3JwaEF0dHJpYnV0ZXM9e30sdGhpcy5ncm91cHM9W10sdGhpcy5ib3VuZGluZ0JveD1udWxsLHRoaXMuYm91bmRpbmdTcGhlcmU9bnVsbDtjb25zdCBlPXt9O3RoaXMubmFtZT10Lm5hbWU7Y29uc3Qgcz10LmluZGV4O3MhPT1udWxsJiZ0aGlzLnNldEluZGV4KHMuY2xvbmUoZSkpO2NvbnN0IG49dC5hdHRyaWJ1dGVzO2Zvcihjb25zdCB1IGluIG4pe2NvbnN0IGg9blt1XTt0aGlzLnNldEF0dHJpYnV0ZSh1LGguY2xvbmUoZSkpfWNvbnN0IGk9dC5tb3JwaEF0dHJpYnV0ZXM7Zm9yKGNvbnN0IHUgaW4gaSl7Y29uc3QgaD1bXSxsPWlbdV07Zm9yKGxldCBkPTAsZj1sLmxlbmd0aDtkPGY7ZCsrKWgucHVzaChsW2RdLmNsb25lKGUpKTt0aGlzLm1vcnBoQXR0cmlidXRlc1t1XT1ofXRoaXMubW9ycGhUYXJnZXRzUmVsYXRpdmU9dC5tb3JwaFRhcmdldHNSZWxhdGl2ZTtjb25zdCBvPXQuZ3JvdXBzO2ZvcihsZXQgdT0wLGg9by5sZW5ndGg7dTxoO3UrKyl7Y29uc3QgbD1vW3VdO3RoaXMuYWRkR3JvdXAobC5zdGFydCxsLmNvdW50LGwubWF0ZXJpYWxJbmRleCl9Y29uc3QgYT10LmJvdW5kaW5nQm94O2EhPT1udWxsJiYodGhpcy5ib3VuZGluZ0JveD1hLmNsb25lKCkpO2NvbnN0IGM9dC5ib3VuZGluZ1NwaGVyZTtyZXR1cm4gYyE9PW51bGwmJih0aGlzLmJvdW5kaW5nU3BoZXJlPWMuY2xvbmUoKSksdGhpcy5kcmF3UmFuZ2Uuc3RhcnQ9dC5kcmF3UmFuZ2Uuc3RhcnQsdGhpcy5kcmF3UmFuZ2UuY291bnQ9dC5kcmF3UmFuZ2UuY291bnQsdGhpcy51c2VyRGF0YT10LnVzZXJEYXRhLHRoaXN9ZGlzcG9zZSgpe3RoaXMuZGlzcGF0Y2hFdmVudCh7dHlwZToiZGlzcG9zZSJ9KX19Y29uc3QgV249bmV3IEEsVGE9bmV3IEEsTmE9bmV3IEN0O2NsYXNzIFhue2NvbnN0cnVjdG9yKHQ9bmV3IEEoMSwwLDApLGU9MCl7dGhpcy5pc1BsYW5lPSEwLHRoaXMubm9ybWFsPXQsdGhpcy5jb25zdGFudD1lfXNldCh0LGUpe3JldHVybiB0aGlzLm5vcm1hbC5jb3B5KHQpLHRoaXMuY29uc3RhbnQ9ZSx0aGlzfXNldENvbXBvbmVudHModCxlLHMsbil7cmV0dXJuIHRoaXMubm9ybWFsLnNldCh0LGUscyksdGhpcy5jb25zdGFudD1uLHRoaXN9c2V0RnJvbU5vcm1hbEFuZENvcGxhbmFyUG9pbnQodCxlKXtyZXR1cm4gdGhpcy5ub3JtYWwuY29weSh0KSx0aGlzLmNvbnN0YW50PS1lLmRvdCh0aGlzLm5vcm1hbCksdGhpc31zZXRGcm9tQ29wbGFuYXJQb2ludHModCxlLHMpe2NvbnN0IG49V24uc3ViVmVjdG9ycyhzLGUpLmNyb3NzKFRhLnN1YlZlY3RvcnModCxlKSkubm9ybWFsaXplKCk7cmV0dXJuIHRoaXMuc2V0RnJvbU5vcm1hbEFuZENvcGxhbmFyUG9pbnQobix0KSx0aGlzfWNvcHkodCl7cmV0dXJuIHRoaXMubm9ybWFsLmNvcHkodC5ub3JtYWwpLHRoaXMuY29uc3RhbnQ9dC5jb25zdGFudCx0aGlzfW5vcm1hbGl6ZSgpe2NvbnN0IHQ9MS90aGlzLm5vcm1hbC5sZW5ndGgoKTtyZXR1cm4gdGhpcy5ub3JtYWwubXVsdGlwbHlTY2FsYXIodCksdGhpcy5jb25zdGFudCo9dCx0aGlzfW5lZ2F0ZSgpe3JldHVybiB0aGlzLmNvbnN0YW50Kj0tMSx0aGlzLm5vcm1hbC5uZWdhdGUoKSx0aGlzfWRpc3RhbmNlVG9Qb2ludCh0KXtyZXR1cm4gdGhpcy5ub3JtYWwuZG90KHQpK3RoaXMuY29uc3RhbnR9ZGlzdGFuY2VUb1NwaGVyZSh0KXtyZXR1cm4gdGhpcy5kaXN0YW5jZVRvUG9pbnQodC5jZW50ZXIpLXQucmFkaXVzfXByb2plY3RQb2ludCh0LGUpe3JldHVybiBlLmNvcHkodCkuYWRkU2NhbGVkVmVjdG9yKHRoaXMubm9ybWFsLC10aGlzLmRpc3RhbmNlVG9Qb2ludCh0KSl9aW50ZXJzZWN0TGluZSh0LGUpe2NvbnN0IHM9dC5kZWx0YShXbiksbj10aGlzLm5vcm1hbC5kb3Qocyk7aWYobj09PTApcmV0dXJuIHRoaXMuZGlzdGFuY2VUb1BvaW50KHQuc3RhcnQpPT09MD9lLmNvcHkodC5zdGFydCk6bnVsbDtjb25zdCBpPS0odC5zdGFydC5kb3QodGhpcy5ub3JtYWwpK3RoaXMuY29uc3RhbnQpL247cmV0dXJuIGk8MHx8aT4xP251bGw6ZS5jb3B5KHQuc3RhcnQpLmFkZFNjYWxlZFZlY3RvcihzLGkpfWludGVyc2VjdHNMaW5lKHQpe2NvbnN0IGU9dGhpcy5kaXN0YW5jZVRvUG9pbnQodC5zdGFydCkscz10aGlzLmRpc3RhbmNlVG9Qb2ludCh0LmVuZCk7cmV0dXJuIGU8MCYmcz4wfHxzPDAmJmU+MH1pbnRlcnNlY3RzQm94KHQpe3JldHVybiB0LmludGVyc2VjdHNQbGFuZSh0aGlzKX1pbnRlcnNlY3RzU3BoZXJlKHQpe3JldHVybiB0LmludGVyc2VjdHNQbGFuZSh0aGlzKX1jb3BsYW5hclBvaW50KHQpe3JldHVybiB0LmNvcHkodGhpcy5ub3JtYWwpLm11bHRpcGx5U2NhbGFyKC10aGlzLmNvbnN0YW50KX1hcHBseU1hdHJpeDQodCxlKXtjb25zdCBzPWV8fE5hLmdldE5vcm1hbE1hdHJpeCh0KSxuPXRoaXMuY29wbGFuYXJQb2ludChXbikuYXBwbHlNYXRyaXg0KHQpLGk9dGhpcy5ub3JtYWwuYXBwbHlNYXRyaXgzKHMpLm5vcm1hbGl6ZSgpO3JldHVybiB0aGlzLmNvbnN0YW50PS1uLmRvdChpKSx0aGlzfXRyYW5zbGF0ZSh0KXtyZXR1cm4gdGhpcy5jb25zdGFudC09dC5kb3QodGhpcy5ub3JtYWwpLHRoaXN9ZXF1YWxzKHQpe3JldHVybiB0Lm5vcm1hbC5lcXVhbHModGhpcy5ub3JtYWwpJiZ0LmNvbnN0YW50PT09dGhpcy5jb25zdGFudH1jbG9uZSgpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkodGhpcyl9fWNsYXNzIHhyIGV4dGVuZHMgRHR7Y29uc3RydWN0b3IodCxlLHMsbixpLG8sYSxjLHUsaD1Tbil7aWYoaCE9PVNuJiZoIT09WGkpdGhyb3cgbmV3IEVycm9yKCJEZXB0aFRleHR1cmUgZm9ybWF0IG11c3QgYmUgZWl0aGVyIFRIUkVFLkRlcHRoRm9ybWF0IG9yIFRIUkVFLkRlcHRoU3RlbmNpbEZvcm1hdCIpO3M9PT12b2lkIDAmJmg9PT1TbiYmKHM9V2kpLHM9PT12b2lkIDAmJmg9PT1YaSYmKHM9UG8pLHN1cGVyKG51bGwsbixpLG8sYSxjLGgscyx1KSx0aGlzLmlzRGVwdGhUZXh0dXJlPSEwLHRoaXMuaW1hZ2U9e3dpZHRoOnQsaGVpZ2h0OmV9LHRoaXMubWFnRmlsdGVyPWEhPT12b2lkIDA/YTp6cyx0aGlzLm1pbkZpbHRlcj1jIT09dm9pZCAwP2M6enMsdGhpcy5mbGlwWT0hMSx0aGlzLmdlbmVyYXRlTWlwbWFwcz0hMSx0aGlzLmNvbXBhcmVGdW5jdGlvbj1udWxsfWNvcHkodCl7cmV0dXJuIHN1cGVyLmNvcHkodCksdGhpcy5jb21wYXJlRnVuY3Rpb249dC5jb21wYXJlRnVuY3Rpb24sdGhpc310b0pTT04odCl7Y29uc3QgZT1zdXBlci50b0pTT04odCk7cmV0dXJuIHRoaXMuY29tcGFyZUZ1bmN0aW9uIT09bnVsbCYmKGUuY29tcGFyZUZ1bmN0aW9uPXRoaXMuY29tcGFyZUZ1bmN0aW9uKSxlfX1jbGFzcyB3YXtjb25zdHJ1Y3Rvcih0LGUpe3RoaXMuaXNJbnRlcmxlYXZlZEJ1ZmZlcj0hMCx0aGlzLmFycmF5PXQsdGhpcy5zdHJpZGU9ZSx0aGlzLmNvdW50PXQhPT12b2lkIDA/dC5sZW5ndGgvZTowLHRoaXMudXNhZ2U9Q3MsdGhpcy51cGRhdGVSYW5nZXM9W10sdGhpcy52ZXJzaW9uPTAsdGhpcy51dWlkPUt0KCl9b25VcGxvYWRDYWxsYmFjaygpe31zZXQgbmVlZHNVcGRhdGUodCl7dD09PSEwJiZ0aGlzLnZlcnNpb24rK31zZXRVc2FnZSh0KXtyZXR1cm4gdGhpcy51c2FnZT10LHRoaXN9YWRkVXBkYXRlUmFuZ2UodCxlKXt0aGlzLnVwZGF0ZVJhbmdlcy5wdXNoKHtzdGFydDp0LGNvdW50OmV9KX1jbGVhclVwZGF0ZVJhbmdlcygpe3RoaXMudXBkYXRlUmFuZ2VzLmxlbmd0aD0wfWNvcHkodCl7cmV0dXJuIHRoaXMuYXJyYXk9bmV3IHQuYXJyYXkuY29uc3RydWN0b3IodC5hcnJheSksdGhpcy5jb3VudD10LmNvdW50LHRoaXMuc3RyaWRlPXQuc3RyaWRlLHRoaXMudXNhZ2U9dC51c2FnZSx0aGlzfWNvcHlBdCh0LGUscyl7dCo9dGhpcy5zdHJpZGUscyo9ZS5zdHJpZGU7Zm9yKGxldCBuPTAsaT10aGlzLnN0cmlkZTtuPGk7bisrKXRoaXMuYXJyYXlbdCtuXT1lLmFycmF5W3Mrbl07cmV0dXJuIHRoaXN9c2V0KHQsZT0wKXtyZXR1cm4gdGhpcy5hcnJheS5zZXQodCxlKSx0aGlzfWNsb25lKHQpe3QuYXJyYXlCdWZmZXJzPT09dm9pZCAwJiYodC5hcnJheUJ1ZmZlcnM9e30pLHRoaXMuYXJyYXkuYnVmZmVyLl91dWlkPT09dm9pZCAwJiYodGhpcy5hcnJheS5idWZmZXIuX3V1aWQ9S3QoKSksdC5hcnJheUJ1ZmZlcnNbdGhpcy5hcnJheS5idWZmZXIuX3V1aWRdPT09dm9pZCAwJiYodC5hcnJheUJ1ZmZlcnNbdGhpcy5hcnJheS5idWZmZXIuX3V1aWRdPXRoaXMuYXJyYXkuc2xpY2UoMCkuYnVmZmVyKTtjb25zdCBlPW5ldyB0aGlzLmFycmF5LmNvbnN0cnVjdG9yKHQuYXJyYXlCdWZmZXJzW3RoaXMuYXJyYXkuYnVmZmVyLl91dWlkXSkscz1uZXcgdGhpcy5jb25zdHJ1Y3RvcihlLHRoaXMuc3RyaWRlKTtyZXR1cm4gcy5zZXRVc2FnZSh0aGlzLnVzYWdlKSxzfW9uVXBsb2FkKHQpe3JldHVybiB0aGlzLm9uVXBsb2FkQ2FsbGJhY2s9dCx0aGlzfXRvSlNPTih0KXtyZXR1cm4gdC5hcnJheUJ1ZmZlcnM9PT12b2lkIDAmJih0LmFycmF5QnVmZmVycz17fSksdGhpcy5hcnJheS5idWZmZXIuX3V1aWQ9PT12b2lkIDAmJih0aGlzLmFycmF5LmJ1ZmZlci5fdXVpZD1LdCgpKSx0LmFycmF5QnVmZmVyc1t0aGlzLmFycmF5LmJ1ZmZlci5fdXVpZF09PT12b2lkIDAmJih0LmFycmF5QnVmZmVyc1t0aGlzLmFycmF5LmJ1ZmZlci5fdXVpZF09QXJyYXkuZnJvbShuZXcgVWludDMyQXJyYXkodGhpcy5hcnJheS5idWZmZXIpKSkse3V1aWQ6dGhpcy51dWlkLGJ1ZmZlcjp0aGlzLmFycmF5LmJ1ZmZlci5fdXVpZCx0eXBlOnRoaXMuYXJyYXkuY29uc3RydWN0b3IubmFtZSxzdHJpZGU6dGhpcy5zdHJpZGV9fX1jb25zdCB1dD1uZXcgQTtjbGFzcyBZbntjb25zdHJ1Y3Rvcih0LGUscyxuPSExKXt0aGlzLmlzSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGU9ITAsdGhpcy5uYW1lPSIiLHRoaXMuZGF0YT10LHRoaXMuaXRlbVNpemU9ZSx0aGlzLm9mZnNldD1zLHRoaXMubm9ybWFsaXplZD1ufWdldCBjb3VudCgpe3JldHVybiB0aGlzLmRhdGEuY291bnR9Z2V0IGFycmF5KCl7cmV0dXJuIHRoaXMuZGF0YS5hcnJheX1zZXQgbmVlZHNVcGRhdGUodCl7dGhpcy5kYXRhLm5lZWRzVXBkYXRlPXR9YXBwbHlNYXRyaXg0KHQpe2ZvcihsZXQgZT0wLHM9dGhpcy5kYXRhLmNvdW50O2U8cztlKyspdXQuZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0aGlzLGUpLHV0LmFwcGx5TWF0cml4NCh0KSx0aGlzLnNldFhZWihlLHV0LngsdXQueSx1dC56KTtyZXR1cm4gdGhpc31hcHBseU5vcm1hbE1hdHJpeCh0KXtmb3IobGV0IGU9MCxzPXRoaXMuY291bnQ7ZTxzO2UrKyl1dC5mcm9tQnVmZmVyQXR0cmlidXRlKHRoaXMsZSksdXQuYXBwbHlOb3JtYWxNYXRyaXgodCksdGhpcy5zZXRYWVooZSx1dC54LHV0LnksdXQueik7cmV0dXJuIHRoaXN9dHJhbnNmb3JtRGlyZWN0aW9uKHQpe2ZvcihsZXQgZT0wLHM9dGhpcy5jb3VudDtlPHM7ZSsrKXV0LmZyb21CdWZmZXJBdHRyaWJ1dGUodGhpcyxlKSx1dC50cmFuc2Zvcm1EaXJlY3Rpb24odCksdGhpcy5zZXRYWVooZSx1dC54LHV0LnksdXQueik7cmV0dXJuIHRoaXN9Z2V0Q29tcG9uZW50KHQsZSl7bGV0IHM9dGhpcy5hcnJheVt0KnRoaXMuZGF0YS5zdHJpZGUrdGhpcy5vZmZzZXQrZV07cmV0dXJuIHRoaXMubm9ybWFsaXplZCYmKHM9RXQocyx0aGlzLmFycmF5KSksc31zZXRDb21wb25lbnQodCxlLHMpe3JldHVybiB0aGlzLm5vcm1hbGl6ZWQmJihzPSQocyx0aGlzLmFycmF5KSksdGhpcy5kYXRhLmFycmF5W3QqdGhpcy5kYXRhLnN0cmlkZSt0aGlzLm9mZnNldCtlXT1zLHRoaXN9c2V0WCh0LGUpe3JldHVybiB0aGlzLm5vcm1hbGl6ZWQmJihlPSQoZSx0aGlzLmFycmF5KSksdGhpcy5kYXRhLmFycmF5W3QqdGhpcy5kYXRhLnN0cmlkZSt0aGlzLm9mZnNldF09ZSx0aGlzfXNldFkodCxlKXtyZXR1cm4gdGhpcy5ub3JtYWxpemVkJiYoZT0kKGUsdGhpcy5hcnJheSkpLHRoaXMuZGF0YS5hcnJheVt0KnRoaXMuZGF0YS5zdHJpZGUrdGhpcy5vZmZzZXQrMV09ZSx0aGlzfXNldFoodCxlKXtyZXR1cm4gdGhpcy5ub3JtYWxpemVkJiYoZT0kKGUsdGhpcy5hcnJheSkpLHRoaXMuZGF0YS5hcnJheVt0KnRoaXMuZGF0YS5zdHJpZGUrdGhpcy5vZmZzZXQrMl09ZSx0aGlzfXNldFcodCxlKXtyZXR1cm4gdGhpcy5ub3JtYWxpemVkJiYoZT0kKGUsdGhpcy5hcnJheSkpLHRoaXMuZGF0YS5hcnJheVt0KnRoaXMuZGF0YS5zdHJpZGUrdGhpcy5vZmZzZXQrM109ZSx0aGlzfWdldFgodCl7bGV0IGU9dGhpcy5kYXRhLmFycmF5W3QqdGhpcy5kYXRhLnN0cmlkZSt0aGlzLm9mZnNldF07cmV0dXJuIHRoaXMubm9ybWFsaXplZCYmKGU9RXQoZSx0aGlzLmFycmF5KSksZX1nZXRZKHQpe2xldCBlPXRoaXMuZGF0YS5hcnJheVt0KnRoaXMuZGF0YS5zdHJpZGUrdGhpcy5vZmZzZXQrMV07cmV0dXJuIHRoaXMubm9ybWFsaXplZCYmKGU9RXQoZSx0aGlzLmFycmF5KSksZX1nZXRaKHQpe2xldCBlPXRoaXMuZGF0YS5hcnJheVt0KnRoaXMuZGF0YS5zdHJpZGUrdGhpcy5vZmZzZXQrMl07cmV0dXJuIHRoaXMubm9ybWFsaXplZCYmKGU9RXQoZSx0aGlzLmFycmF5KSksZX1nZXRXKHQpe2xldCBlPXRoaXMuZGF0YS5hcnJheVt0KnRoaXMuZGF0YS5zdHJpZGUrdGhpcy5vZmZzZXQrM107cmV0dXJuIHRoaXMubm9ybWFsaXplZCYmKGU9RXQoZSx0aGlzLmFycmF5KSksZX1zZXRYWSh0LGUscyl7cmV0dXJuIHQ9dCp0aGlzLmRhdGEuc3RyaWRlK3RoaXMub2Zmc2V0LHRoaXMubm9ybWFsaXplZCYmKGU9JChlLHRoaXMuYXJyYXkpLHM9JChzLHRoaXMuYXJyYXkpKSx0aGlzLmRhdGEuYXJyYXlbdCswXT1lLHRoaXMuZGF0YS5hcnJheVt0KzFdPXMsdGhpc31zZXRYWVoodCxlLHMsbil7cmV0dXJuIHQ9dCp0aGlzLmRhdGEuc3RyaWRlK3RoaXMub2Zmc2V0LHRoaXMubm9ybWFsaXplZCYmKGU9JChlLHRoaXMuYXJyYXkpLHM9JChzLHRoaXMuYXJyYXkpLG49JChuLHRoaXMuYXJyYXkpKSx0aGlzLmRhdGEuYXJyYXlbdCswXT1lLHRoaXMuZGF0YS5hcnJheVt0KzFdPXMsdGhpcy5kYXRhLmFycmF5W3QrMl09bix0aGlzfXNldFhZWlcodCxlLHMsbixpKXtyZXR1cm4gdD10KnRoaXMuZGF0YS5zdHJpZGUrdGhpcy5vZmZzZXQsdGhpcy5ub3JtYWxpemVkJiYoZT0kKGUsdGhpcy5hcnJheSkscz0kKHMsdGhpcy5hcnJheSksbj0kKG4sdGhpcy5hcnJheSksaT0kKGksdGhpcy5hcnJheSkpLHRoaXMuZGF0YS5hcnJheVt0KzBdPWUsdGhpcy5kYXRhLmFycmF5W3QrMV09cyx0aGlzLmRhdGEuYXJyYXlbdCsyXT1uLHRoaXMuZGF0YS5hcnJheVt0KzNdPWksdGhpc31jbG9uZSh0KXtpZih0PT09dm9pZCAwKXtjb25zb2xlLmxvZygiVEhSRUUuSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUuY2xvbmUoKTogQ2xvbmluZyBhbiBpbnRlcmxlYXZlZCBidWZmZXIgYXR0cmlidXRlIHdpbGwgZGUtaW50ZXJsZWF2ZSBidWZmZXIgZGF0YS4iKTtjb25zdCBlPVtdO2ZvcihsZXQgcz0wO3M8dGhpcy5jb3VudDtzKyspe2NvbnN0IG49cyp0aGlzLmRhdGEuc3RyaWRlK3RoaXMub2Zmc2V0O2ZvcihsZXQgaT0wO2k8dGhpcy5pdGVtU2l6ZTtpKyspZS5wdXNoKHRoaXMuZGF0YS5hcnJheVtuK2ldKX1yZXR1cm4gbmV3IHZ0KG5ldyB0aGlzLmFycmF5LmNvbnN0cnVjdG9yKGUpLHRoaXMuaXRlbVNpemUsdGhpcy5ub3JtYWxpemVkKX1lbHNlIHJldHVybiB0LmludGVybGVhdmVkQnVmZmVycz09PXZvaWQgMCYmKHQuaW50ZXJsZWF2ZWRCdWZmZXJzPXt9KSx0LmludGVybGVhdmVkQnVmZmVyc1t0aGlzLmRhdGEudXVpZF09PT12b2lkIDAmJih0LmludGVybGVhdmVkQnVmZmVyc1t0aGlzLmRhdGEudXVpZF09dGhpcy5kYXRhLmNsb25lKHQpKSxuZXcgWW4odC5pbnRlcmxlYXZlZEJ1ZmZlcnNbdGhpcy5kYXRhLnV1aWRdLHRoaXMuaXRlbVNpemUsdGhpcy5vZmZzZXQsdGhpcy5ub3JtYWxpemVkKX10b0pTT04odCl7aWYodD09PXZvaWQgMCl7Y29uc29sZS5sb2coIlRIUkVFLkludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlLnRvSlNPTigpOiBTZXJpYWxpemluZyBhbiBpbnRlcmxlYXZlZCBidWZmZXIgYXR0cmlidXRlIHdpbGwgZGUtaW50ZXJsZWF2ZSBidWZmZXIgZGF0YS4iKTtjb25zdCBlPVtdO2ZvcihsZXQgcz0wO3M8dGhpcy5jb3VudDtzKyspe2NvbnN0IG49cyp0aGlzLmRhdGEuc3RyaWRlK3RoaXMub2Zmc2V0O2ZvcihsZXQgaT0wO2k8dGhpcy5pdGVtU2l6ZTtpKyspZS5wdXNoKHRoaXMuZGF0YS5hcnJheVtuK2ldKX1yZXR1cm57aXRlbVNpemU6dGhpcy5pdGVtU2l6ZSx0eXBlOnRoaXMuYXJyYXkuY29uc3RydWN0b3IubmFtZSxhcnJheTplLG5vcm1hbGl6ZWQ6dGhpcy5ub3JtYWxpemVkfX1lbHNlIHJldHVybiB0LmludGVybGVhdmVkQnVmZmVycz09PXZvaWQgMCYmKHQuaW50ZXJsZWF2ZWRCdWZmZXJzPXt9KSx0LmludGVybGVhdmVkQnVmZmVyc1t0aGlzLmRhdGEudXVpZF09PT12b2lkIDAmJih0LmludGVybGVhdmVkQnVmZmVyc1t0aGlzLmRhdGEudXVpZF09dGhpcy5kYXRhLnRvSlNPTih0KSkse2lzSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGU6ITAsaXRlbVNpemU6dGhpcy5pdGVtU2l6ZSxkYXRhOnRoaXMuZGF0YS51dWlkLG9mZnNldDp0aGlzLm9mZnNldCxub3JtYWxpemVkOnRoaXMubm9ybWFsaXplZH19fWNsYXNzIEFhIGV4dGVuZHMgRHR7Y29uc3RydWN0b3IodCxlKXtzdXBlcih7d2lkdGg6dCxoZWlnaHQ6ZX0pLHRoaXMuaXNGcmFtZWJ1ZmZlclRleHR1cmU9ITAsdGhpcy5tYWdGaWx0ZXI9enMsdGhpcy5taW5GaWx0ZXI9enMsdGhpcy5nZW5lcmF0ZU1pcG1hcHM9ITEsdGhpcy5uZWVkc1VwZGF0ZT0hMH19Y29uc3QgVHI9bmV3IEEsRHM9bmV3IEE7Y2xhc3MgWnR7Y29uc3RydWN0b3IodD1uZXcgQSxlPW5ldyBBKXt0aGlzLnN0YXJ0PXQsdGhpcy5lbmQ9ZX1zZXQodCxlKXtyZXR1cm4gdGhpcy5zdGFydC5jb3B5KHQpLHRoaXMuZW5kLmNvcHkoZSksdGhpc31jb3B5KHQpe3JldHVybiB0aGlzLnN0YXJ0LmNvcHkodC5zdGFydCksdGhpcy5lbmQuY29weSh0LmVuZCksdGhpc31nZXRDZW50ZXIodCl7cmV0dXJuIHQuYWRkVmVjdG9ycyh0aGlzLnN0YXJ0LHRoaXMuZW5kKS5tdWx0aXBseVNjYWxhciguNSl9ZGVsdGEodCl7cmV0dXJuIHQuc3ViVmVjdG9ycyh0aGlzLmVuZCx0aGlzLnN0YXJ0KX1kaXN0YW5jZVNxKCl7cmV0dXJuIHRoaXMuc3RhcnQuZGlzdGFuY2VUb1NxdWFyZWQodGhpcy5lbmQpfWRpc3RhbmNlKCl7cmV0dXJuIHRoaXMuc3RhcnQuZGlzdGFuY2VUbyh0aGlzLmVuZCl9YXQodCxlKXtyZXR1cm4gdGhpcy5kZWx0YShlKS5tdWx0aXBseVNjYWxhcih0KS5hZGQodGhpcy5zdGFydCl9Y2xvc2VzdFBvaW50VG9Qb2ludFBhcmFtZXRlcih0LGUpe1RyLnN1YlZlY3RvcnModCx0aGlzLnN0YXJ0KSxEcy5zdWJWZWN0b3JzKHRoaXMuZW5kLHRoaXMuc3RhcnQpO2NvbnN0IHM9RHMuZG90KERzKTtsZXQgaT1Ecy5kb3QoVHIpL3M7cmV0dXJuIGUmJihpPWF0KGksMCwxKSksaX1jbG9zZXN0UG9pbnRUb1BvaW50KHQsZSxzKXtjb25zdCBuPXRoaXMuY2xvc2VzdFBvaW50VG9Qb2ludFBhcmFtZXRlcih0LGUpO3JldHVybiB0aGlzLmRlbHRhKHMpLm11bHRpcGx5U2NhbGFyKG4pLmFkZCh0aGlzLnN0YXJ0KX1hcHBseU1hdHJpeDQodCl7cmV0dXJuIHRoaXMuc3RhcnQuYXBwbHlNYXRyaXg0KHQpLHRoaXMuZW5kLmFwcGx5TWF0cml4NCh0KSx0aGlzfWVxdWFscyh0KXtyZXR1cm4gdC5zdGFydC5lcXVhbHModGhpcy5zdGFydCkmJnQuZW5kLmVxdWFscyh0aGlzLmVuZCl9Y2xvbmUoKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KHRoaXMpfX1mdW5jdGlvbiBabihyLHQ9MCl7bGV0IGU9MzczNTkyODU1OV50LHM9MTEwMzU0Nzk5MV50O2lmKHIgaW5zdGFuY2VvZiBBcnJheSlmb3IobGV0IG49MCxpO248ci5sZW5ndGg7bisrKWk9cltuXSxlPU1hdGguaW11bChlXmksMjY1NDQzNTc2MSkscz1NYXRoLmltdWwoc15pLDE1OTczMzQ2NzcpO2Vsc2UgZm9yKGxldCBuPTAsaTtuPHIubGVuZ3RoO24rKylpPXIuY2hhckNvZGVBdChuKSxlPU1hdGguaW11bChlXmksMjY1NDQzNTc2MSkscz1NYXRoLmltdWwoc15pLDE1OTczMzQ2NzcpO3JldHVybiBlPU1hdGguaW11bChlXmU+Pj4xNiwyMjQ2ODIyNTA3KSxlXj1NYXRoLmltdWwoc15zPj4+MTMsMzI2NjQ4OTkwOSkscz1NYXRoLmltdWwoc15zPj4+MTYsMjI0NjgyMjUwNyksc149TWF0aC5pbXVsKGVeZT4+PjEzLDMyNjY0ODk5MDkpLDQyOTQ5NjcyOTYqKDIwOTcxNTEmcykrKGU+Pj4wKX1jb25zdCBNYT0oLi4ucik9PlpuKHIpO2Z1bmN0aW9uIFNhKHIsdD0hMSl7Y29uc3QgZT1bXTtyLmlzTm9kZT09PSEwJiYoZS5wdXNoKHIuaWQpLHI9ci5nZXRTZWxmKCkpO2Zvcihjb25zdHtwcm9wZXJ0eTpzLGNoaWxkTm9kZTpufW9mIEpuKHIpKWUucHVzaChlLFpuKHMuc2xpY2UoMCwtNCkpLG4uZ2V0Q2FjaGVLZXkodCkpO3JldHVybiBabihlKX1mdW5jdGlvbipKbihyLHQ9ITEpe2Zvcihjb25zdCBlIGluIHIpe2lmKGUuc3RhcnRzV2l0aCgiXyIpPT09ITApY29udGludWU7Y29uc3Qgcz1yW2VdO2lmKEFycmF5LmlzQXJyYXkocyk9PT0hMClmb3IobGV0IG49MDtuPHMubGVuZ3RoO24rKyl7Y29uc3QgaT1zW25dO2kmJihpLmlzTm9kZT09PSEwfHx0JiZ0eXBlb2YgaS50b0pTT049PSJmdW5jdGlvbiIpJiYoeWllbGR7cHJvcGVydHk6ZSxpbmRleDpuLGNoaWxkTm9kZTppfSl9ZWxzZSBpZihzJiZzLmlzTm9kZT09PSEwKXlpZWxke3Byb3BlcnR5OmUsY2hpbGROb2RlOnN9O2Vsc2UgaWYodHlwZW9mIHM9PSJvYmplY3QiKWZvcihjb25zdCBuIGluIHMpe2NvbnN0IGk9c1tuXTtpJiYoaS5pc05vZGU9PT0hMHx8dCYmdHlwZW9mIGkudG9KU09OPT0iZnVuY3Rpb24iKSYmKHlpZWxke3Byb3BlcnR5OmUsaW5kZXg6bixjaGlsZE5vZGU6aX0pfX19ZnVuY3Rpb24gVnMocil7aWYocj09bnVsbClyZXR1cm4gbnVsbDtjb25zdCB0PXR5cGVvZiByO3JldHVybiByLmlzTm9kZT09PSEwPyJub2RlIjp0PT09Im51bWJlciI/ImZsb2F0Ijp0PT09ImJvb2xlYW4iPyJib29sIjp0PT09InN0cmluZyI/InN0cmluZyI6dD09PSJmdW5jdGlvbiI/InNoYWRlciI6ci5pc1ZlY3RvcjI9PT0hMD8idmVjMiI6ci5pc1ZlY3RvcjM9PT0hMD8idmVjMyI6ci5pc1ZlY3RvcjQ9PT0hMD8idmVjNCI6ci5pc01hdHJpeDM9PT0hMD8ibWF0MyI6ci5pc01hdHJpeDQ9PT0hMD8ibWF0NCI6ci5pc0NvbG9yPT09ITA/ImNvbG9yIjpyIGluc3RhbmNlb2YgQXJyYXlCdWZmZXI/IkFycmF5QnVmZmVyIjpudWxsfWZ1bmN0aW9uIE5yKHIsLi4udCl7Y29uc3QgZT1yP3Iuc2xpY2UoLTQpOnZvaWQgMDtyZXR1cm4gdC5sZW5ndGg9PT0xJiYoZT09PSJ2ZWMyIj90PVt0WzBdLHRbMF1dOmU9PT0idmVjMyI/dD1bdFswXSx0WzBdLHRbMF1dOmU9PT0idmVjNCImJih0PVt0WzBdLHRbMF0sdFswXSx0WzBdXSkpLHI9PT0iY29sb3IiP25ldyBxbiguLi50KTplPT09InZlYzIiP25ldyBKKC4uLnQpOmU9PT0idmVjMyI/bmV3IEEoLi4udCk6ZT09PSJ2ZWM0Ij9uZXcgRnQoLi4udCk6ZT09PSJtYXQzIj9uZXcgQ3QoLi4udCk6ZT09PSJtYXQ0Ij9uZXcgbnQoLi4udCk6cj09PSJib29sIj90WzBdfHwhMTpyPT09ImZsb2F0Inx8cj09PSJpbnQifHxyPT09InVpbnQiP3RbMF18fDA6cj09PSJzdHJpbmciP3RbMF18fCIiOnI9PT0iQXJyYXlCdWZmZXIiP3phKHRbMF0pOm51bGx9ZnVuY3Rpb24gX2Eocil7bGV0IHQ9IiI7Y29uc3QgZT1uZXcgVWludDhBcnJheShyKTtmb3IobGV0IHM9MDtzPGUubGVuZ3RoO3MrKyl0Kz1TdHJpbmcuZnJvbUNoYXJDb2RlKGVbc10pO3JldHVybiBidG9hKHQpfWZ1bmN0aW9uIHphKHIpe3JldHVybiBVaW50OEFycmF5LmZyb20oYXRvYihyKSx0PT50LmNoYXJDb2RlQXQoMCkpLmJ1ZmZlcn1jb25zdCB3cj17VkVSVEVYOiJ2ZXJ0ZXgiLEZSQUdNRU5UOiJmcmFnbWVudCJ9LFE9e05PTkU6Im5vbmUiLEZSQU1FOiJmcmFtZSIsUkVOREVSOiJyZW5kZXIiLE9CSkVDVDoib2JqZWN0In0sbnM9WyJ4IiwieSIsInoiLCJ3Il07bGV0IGJhPTA7Y2xhc3MgVSBleHRlbmRzIFple3N0YXRpYyBnZXQgdHlwZSgpe3JldHVybiJOb2RlIn1jb25zdHJ1Y3Rvcih0PW51bGwpe3N1cGVyKCksdGhpcy5ub2RlVHlwZT10LHRoaXMudXBkYXRlVHlwZT1RLk5PTkUsdGhpcy51cGRhdGVCZWZvcmVUeXBlPVEuTk9ORSx0aGlzLnVwZGF0ZUFmdGVyVHlwZT1RLk5PTkUsdGhpcy51dWlkPWVhLmdlbmVyYXRlVVVJRCgpLHRoaXMudmVyc2lvbj0wLHRoaXMuX2NhY2hlS2V5PW51bGwsdGhpcy5fY2FjaGVLZXlWZXJzaW9uPTAsdGhpcy5nbG9iYWw9ITEsdGhpcy5pc05vZGU9ITAsT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImlkIix7dmFsdWU6YmErK30pfXNldCBuZWVkc1VwZGF0ZSh0KXt0PT09ITAmJnRoaXMudmVyc2lvbisrfWdldCB0eXBlKCl7cmV0dXJuIHRoaXMuY29uc3RydWN0b3IudHlwZX1vblVwZGF0ZSh0LGUpe3JldHVybiB0aGlzLnVwZGF0ZVR5cGU9ZSx0aGlzLnVwZGF0ZT10LmJpbmQodGhpcy5nZXRTZWxmKCkpLHRoaXN9b25GcmFtZVVwZGF0ZSh0KXtyZXR1cm4gdGhpcy5vblVwZGF0ZSh0LFEuRlJBTUUpfW9uUmVuZGVyVXBkYXRlKHQpe3JldHVybiB0aGlzLm9uVXBkYXRlKHQsUS5SRU5ERVIpfW9uT2JqZWN0VXBkYXRlKHQpe3JldHVybiB0aGlzLm9uVXBkYXRlKHQsUS5PQkpFQ1QpfW9uUmVmZXJlbmNlKHQpe3JldHVybiB0aGlzLnVwZGF0ZVJlZmVyZW5jZT10LmJpbmQodGhpcy5nZXRTZWxmKCkpLHRoaXN9Z2V0U2VsZigpe3JldHVybiB0aGlzLnNlbGZ8fHRoaXN9dXBkYXRlUmVmZXJlbmNlKCl7cmV0dXJuIHRoaXN9aXNHbG9iYWwoKXtyZXR1cm4gdGhpcy5nbG9iYWx9KmdldENoaWxkcmVuKCl7Zm9yKGNvbnN0e2NoaWxkTm9kZTp0fW9mIEpuKHRoaXMpKXlpZWxkIHR9ZGlzcG9zZSgpe3RoaXMuZGlzcGF0Y2hFdmVudCh7dHlwZToiZGlzcG9zZSJ9KX10cmF2ZXJzZSh0KXt0KHRoaXMpO2Zvcihjb25zdCBlIG9mIHRoaXMuZ2V0Q2hpbGRyZW4oKSllLnRyYXZlcnNlKHQpfWdldENhY2hlS2V5KHQ9ITEpe3JldHVybiB0PXR8fHRoaXMudmVyc2lvbiE9PXRoaXMuX2NhY2hlS2V5VmVyc2lvbiwodD09PSEwfHx0aGlzLl9jYWNoZUtleT09PW51bGwpJiYodGhpcy5fY2FjaGVLZXk9U2EodGhpcyx0KSx0aGlzLl9jYWNoZUtleVZlcnNpb249dGhpcy52ZXJzaW9uKSx0aGlzLl9jYWNoZUtleX1nZXRTY29wZSgpe3JldHVybiB0aGlzfWdldEhhc2goKXtyZXR1cm4gdGhpcy51dWlkfWdldFVwZGF0ZVR5cGUoKXtyZXR1cm4gdGhpcy51cGRhdGVUeXBlfWdldFVwZGF0ZUJlZm9yZVR5cGUoKXtyZXR1cm4gdGhpcy51cGRhdGVCZWZvcmVUeXBlfWdldFVwZGF0ZUFmdGVyVHlwZSgpe3JldHVybiB0aGlzLnVwZGF0ZUFmdGVyVHlwZX1nZXRFbGVtZW50VHlwZSh0KXtjb25zdCBlPXRoaXMuZ2V0Tm9kZVR5cGUodCk7cmV0dXJuIHQuZ2V0RWxlbWVudFR5cGUoZSl9Z2V0Tm9kZVR5cGUodCl7Y29uc3QgZT10LmdldE5vZGVQcm9wZXJ0aWVzKHRoaXMpO3JldHVybiBlLm91dHB1dE5vZGU/ZS5vdXRwdXROb2RlLmdldE5vZGVUeXBlKHQpOnRoaXMubm9kZVR5cGV9Z2V0U2hhcmVkKHQpe2NvbnN0IGU9dGhpcy5nZXRIYXNoKHQpO3JldHVybiB0LmdldE5vZGVGcm9tSGFzaChlKXx8dGhpc31zZXR1cCh0KXtjb25zdCBlPXQuZ2V0Tm9kZVByb3BlcnRpZXModGhpcyk7bGV0IHM9MDtmb3IoY29uc3QgbiBvZiB0aGlzLmdldENoaWxkcmVuKCkpZVsibm9kZSIrcysrXT1uO3JldHVybiBudWxsfWFuYWx5emUodCl7aWYodC5pbmNyZWFzZVVzYWdlKHRoaXMpPT09MSl7Y29uc3Qgcz10LmdldE5vZGVQcm9wZXJ0aWVzKHRoaXMpO2Zvcihjb25zdCBuIG9mIE9iamVjdC52YWx1ZXMocykpbiYmbi5pc05vZGU9PT0hMCYmbi5idWlsZCh0KX19Z2VuZXJhdGUodCxlKXtjb25zdHtvdXRwdXROb2RlOnN9PXQuZ2V0Tm9kZVByb3BlcnRpZXModGhpcyk7aWYocyYmcy5pc05vZGU9PT0hMClyZXR1cm4gcy5idWlsZCh0LGUpfXVwZGF0ZUJlZm9yZSgpe2NvbnNvbGUud2FybigiQWJzdHJhY3QgZnVuY3Rpb24uIil9dXBkYXRlQWZ0ZXIoKXtjb25zb2xlLndhcm4oIkFic3RyYWN0IGZ1bmN0aW9uLiIpfXVwZGF0ZSgpe2NvbnNvbGUud2FybigiQWJzdHJhY3QgZnVuY3Rpb24uIil9YnVpbGQodCxlPW51bGwpe2NvbnN0IHM9dGhpcy5nZXRTaGFyZWQodCk7aWYodGhpcyE9PXMpcmV0dXJuIHMuYnVpbGQodCxlKTt0LmFkZE5vZGUodGhpcyksdC5hZGRDaGFpbih0aGlzKTtsZXQgbj1udWxsO2NvbnN0IGk9dC5nZXRCdWlsZFN0YWdlKCk7aWYoaT09PSJzZXR1cCIpe3RoaXMudXBkYXRlUmVmZXJlbmNlKHQpO2NvbnN0IG89dC5nZXROb2RlUHJvcGVydGllcyh0aGlzKTtpZihvLmluaXRpYWxpemVkIT09ITApe2NvbnN0IGE9dC5zdGFjay5ub2Rlcy5sZW5ndGg7by5pbml0aWFsaXplZD0hMCxvLm91dHB1dE5vZGU9dGhpcy5zZXR1cCh0KSxvLm91dHB1dE5vZGUhPT1udWxsJiZ0LnN0YWNrLm5vZGVzLmxlbmd0aDtmb3IoY29uc3QgYyBvZiBPYmplY3QudmFsdWVzKG8pKWMmJmMuaXNOb2RlPT09ITAmJmMuYnVpbGQodCl9fWVsc2UgaWYoaT09PSJhbmFseXplIil0aGlzLmFuYWx5emUodCk7ZWxzZSBpZihpPT09ImdlbmVyYXRlIilpZih0aGlzLmdlbmVyYXRlLmxlbmd0aD09PTEpe2NvbnN0IGE9dGhpcy5nZXROb2RlVHlwZSh0KSxjPXQuZ2V0RGF0YUZyb21Ob2RlKHRoaXMpO249Yy5zbmlwcGV0LG49PT12b2lkIDA/KG49dGhpcy5nZW5lcmF0ZSh0KXx8IiIsYy5zbmlwcGV0PW4pOmMuZmxvd0NvZGVzIT09dm9pZCAwJiZ0LmNvbnRleHQubm9kZUJsb2NrIT09dm9pZCAwJiZ0LmFkZEZsb3dDb2RlSGllcmFyY2h5KHRoaXMsdC5jb250ZXh0Lm5vZGVCbG9jayksbj10LmZvcm1hdChuLGEsZSl9ZWxzZSBuPXRoaXMuZ2VuZXJhdGUodCxlKXx8IiI7cmV0dXJuIHQucmVtb3ZlQ2hhaW4odGhpcyksbn1nZXRTZXJpYWxpemVDaGlsZHJlbigpe3JldHVybiBKbih0aGlzKX1zZXJpYWxpemUodCl7Y29uc3QgZT10aGlzLmdldFNlcmlhbGl6ZUNoaWxkcmVuKCkscz17fTtmb3IoY29uc3R7cHJvcGVydHk6bixpbmRleDppLGNoaWxkTm9kZTpvfW9mIGUpaSE9PXZvaWQgMD8oc1tuXT09PXZvaWQgMCYmKHNbbl09TnVtYmVyLmlzSW50ZWdlcihpKT9bXTp7fSksc1tuXVtpXT1vLnRvSlNPTih0Lm1ldGEpLnV1aWQpOnNbbl09by50b0pTT04odC5tZXRhKS51dWlkO09iamVjdC5rZXlzKHMpLmxlbmd0aD4wJiYodC5pbnB1dE5vZGVzPXMpfWRlc2VyaWFsaXplKHQpe2lmKHQuaW5wdXROb2RlcyE9PXZvaWQgMCl7Y29uc3QgZT10Lm1ldGEubm9kZXM7Zm9yKGNvbnN0IHMgaW4gdC5pbnB1dE5vZGVzKWlmKEFycmF5LmlzQXJyYXkodC5pbnB1dE5vZGVzW3NdKSl7Y29uc3Qgbj1bXTtmb3IoY29uc3QgaSBvZiB0LmlucHV0Tm9kZXNbc10pbi5wdXNoKGVbaV0pO3RoaXNbc109bn1lbHNlIGlmKHR5cGVvZiB0LmlucHV0Tm9kZXNbc109PSJvYmplY3QiKXtjb25zdCBuPXt9O2Zvcihjb25zdCBpIGluIHQuaW5wdXROb2Rlc1tzXSl7Y29uc3Qgbz10LmlucHV0Tm9kZXNbc11baV07bltpXT1lW29dfXRoaXNbc109bn1lbHNle2NvbnN0IG49dC5pbnB1dE5vZGVzW3NdO3RoaXNbc109ZVtuXX19fXRvSlNPTih0KXtjb25zdHt1dWlkOmUsdHlwZTpzfT10aGlzLG49dD09PXZvaWQgMHx8dHlwZW9mIHQ9PSJzdHJpbmciO24mJih0PXt0ZXh0dXJlczp7fSxpbWFnZXM6e30sbm9kZXM6e319KTtsZXQgaT10Lm5vZGVzW2VdO2k9PT12b2lkIDAmJihpPXt1dWlkOmUsdHlwZTpzLG1ldGE6dCxtZXRhZGF0YTp7dmVyc2lvbjo0LjYsdHlwZToiTm9kZSIsZ2VuZXJhdG9yOiJOb2RlLnRvSlNPTiJ9fSxuIT09ITAmJih0Lm5vZGVzW2kudXVpZF09aSksdGhpcy5zZXJpYWxpemUoaSksZGVsZXRlIGkubWV0YSk7ZnVuY3Rpb24gbyhhKXtjb25zdCBjPVtdO2Zvcihjb25zdCB1IGluIGEpe2NvbnN0IGg9YVt1XTtkZWxldGUgaC5tZXRhZGF0YSxjLnB1c2goaCl9cmV0dXJuIGN9aWYobil7Y29uc3QgYT1vKHQudGV4dHVyZXMpLGM9byh0LmltYWdlcyksdT1vKHQubm9kZXMpO2EubGVuZ3RoPjAmJihpLnRleHR1cmVzPWEpLGMubGVuZ3RoPjAmJihpLmltYWdlcz1jKSx1Lmxlbmd0aD4wJiYoaS5ub2Rlcz11KX1yZXR1cm4gaX19Y2xhc3MgaXMgZXh0ZW5kcyBVe3N0YXRpYyBnZXQgdHlwZSgpe3JldHVybiJBcnJheUVsZW1lbnROb2RlIn1jb25zdHJ1Y3Rvcih0LGUpe3N1cGVyKCksdGhpcy5ub2RlPXQsdGhpcy5pbmRleE5vZGU9ZSx0aGlzLmlzQXJyYXlFbGVtZW50Tm9kZT0hMH1nZXROb2RlVHlwZSh0KXtyZXR1cm4gdGhpcy5ub2RlLmdldEVsZW1lbnRUeXBlKHQpfWdlbmVyYXRlKHQpe2NvbnN0IGU9dGhpcy5ub2RlLmJ1aWxkKHQpLHM9dGhpcy5pbmRleE5vZGUuYnVpbGQodCwidWludCIpO3JldHVybmAke2V9WyAke3N9IF1gfX1jbGFzcyBBciBleHRlbmRzIFV7c3RhdGljIGdldCB0eXBlKCl7cmV0dXJuIkNvbnZlcnROb2RlIn1jb25zdHJ1Y3Rvcih0LGUpe3N1cGVyKCksdGhpcy5ub2RlPXQsdGhpcy5jb252ZXJ0VG89ZX1nZXROb2RlVHlwZSh0KXtjb25zdCBlPXRoaXMubm9kZS5nZXROb2RlVHlwZSh0KTtsZXQgcz1udWxsO2Zvcihjb25zdCBuIG9mIHRoaXMuY29udmVydFRvLnNwbGl0KCJ8IikpKHM9PT1udWxsfHx0LmdldFR5cGVMZW5ndGgoZSk9PT10LmdldFR5cGVMZW5ndGgobikpJiYocz1uKTtyZXR1cm4gc31zZXJpYWxpemUodCl7c3VwZXIuc2VyaWFsaXplKHQpLHQuY29udmVydFRvPXRoaXMuY29udmVydFRvfWRlc2VyaWFsaXplKHQpe3N1cGVyLmRlc2VyaWFsaXplKHQpLHRoaXMuY29udmVydFRvPXQuY29udmVydFRvfWdlbmVyYXRlKHQsZSl7Y29uc3Qgcz10aGlzLm5vZGUsbj10aGlzLmdldE5vZGVUeXBlKHQpLGk9cy5idWlsZCh0LG4pO3JldHVybiB0LmZvcm1hdChpLG4sZSl9fWNsYXNzIGR0IGV4dGVuZHMgVXtzdGF0aWMgZ2V0IHR5cGUoKXtyZXR1cm4iVGVtcE5vZGUifWNvbnN0cnVjdG9yKHQpe3N1cGVyKHQpLHRoaXMuaXNUZW1wTm9kZT0hMH1oYXNEZXBlbmRlbmNpZXModCl7cmV0dXJuIHQuZ2V0RGF0YUZyb21Ob2RlKHRoaXMpLnVzYWdlQ291bnQ+MX1idWlsZCh0LGUpe2lmKHQuZ2V0QnVpbGRTdGFnZSgpPT09ImdlbmVyYXRlIil7Y29uc3Qgbj10LmdldFZlY3RvclR5cGUodGhpcy5nZXROb2RlVHlwZSh0LGUpKSxpPXQuZ2V0RGF0YUZyb21Ob2RlKHRoaXMpO2lmKGkucHJvcGVydHlOYW1lIT09dm9pZCAwKXJldHVybiB0LmZvcm1hdChpLnByb3BlcnR5TmFtZSxuLGUpO2lmKG4hPT0idm9pZCImJmUhPT0idm9pZCImJnRoaXMuaGFzRGVwZW5kZW5jaWVzKHQpKXtjb25zdCBvPXN1cGVyLmJ1aWxkKHQsbiksYT10LmdldFZhckZyb21Ob2RlKHRoaXMsbnVsbCxuKSxjPXQuZ2V0UHJvcGVydHlOYW1lKGEpO3JldHVybiB0LmFkZExpbmVGbG93Q29kZShgJHtjfSA9ICR7b31gLHRoaXMpLGkuc25pcHBldD1vLGkucHJvcGVydHlOYW1lPWMsdC5mb3JtYXQoaS5wcm9wZXJ0eU5hbWUsbixlKX19cmV0dXJuIHN1cGVyLmJ1aWxkKHQsZSl9fWNsYXNzIEVhIGV4dGVuZHMgZHR7c3RhdGljIGdldCB0eXBlKCl7cmV0dXJuIkpvaW5Ob2RlIn1jb25zdHJ1Y3Rvcih0PVtdLGU9bnVsbCl7c3VwZXIoZSksdGhpcy5ub2Rlcz10fWdldE5vZGVUeXBlKHQpe3JldHVybiB0aGlzLm5vZGVUeXBlIT09bnVsbD90LmdldFZlY3RvclR5cGUodGhpcy5ub2RlVHlwZSk6dC5nZXRUeXBlRnJvbUxlbmd0aCh0aGlzLm5vZGVzLnJlZHVjZSgoZSxzKT0+ZSt0LmdldFR5cGVMZW5ndGgocy5nZXROb2RlVHlwZSh0KSksMCkpfWdlbmVyYXRlKHQsZSl7Y29uc3Qgcz10aGlzLmdldE5vZGVUeXBlKHQpLG49dGhpcy5ub2RlcyxpPXQuZ2V0Q29tcG9uZW50VHlwZShzKSxvPVtdO2Zvcihjb25zdCBjIG9mIG4pe2xldCB1PWMuYnVpbGQodCk7Y29uc3QgaD10LmdldENvbXBvbmVudFR5cGUoYy5nZXROb2RlVHlwZSh0KSk7aCE9PWkmJih1PXQuZm9ybWF0KHUsaCxpKSksby5wdXNoKHUpfWNvbnN0IGE9YCR7dC5nZXRUeXBlKHMpfSggJHtvLmpvaW4oIiwgIil9IClgO3JldHVybiB0LmZvcm1hdChhLHMsZSl9fWNvbnN0IENhPW5zLmpvaW4oIiIpO2NsYXNzIE1yIGV4dGVuZHMgVXtzdGF0aWMgZ2V0IHR5cGUoKXtyZXR1cm4iU3BsaXROb2RlIn1jb25zdHJ1Y3Rvcih0LGU9IngiKXtzdXBlcigpLHRoaXMubm9kZT10LHRoaXMuY29tcG9uZW50cz1lLHRoaXMuaXNTcGxpdE5vZGU9ITB9Z2V0VmVjdG9yTGVuZ3RoKCl7bGV0IHQ9dGhpcy5jb21wb25lbnRzLmxlbmd0aDtmb3IoY29uc3QgZSBvZiB0aGlzLmNvbXBvbmVudHMpdD1NYXRoLm1heChucy5pbmRleE9mKGUpKzEsdCk7cmV0dXJuIHR9Z2V0Q29tcG9uZW50VHlwZSh0KXtyZXR1cm4gdC5nZXRDb21wb25lbnRUeXBlKHRoaXMubm9kZS5nZXROb2RlVHlwZSh0KSl9Z2V0Tm9kZVR5cGUodCl7cmV0dXJuIHQuZ2V0VHlwZUZyb21MZW5ndGgodGhpcy5jb21wb25lbnRzLmxlbmd0aCx0aGlzLmdldENvbXBvbmVudFR5cGUodCkpfWdlbmVyYXRlKHQsZSl7Y29uc3Qgcz10aGlzLm5vZGUsbj10LmdldFR5cGVMZW5ndGgocy5nZXROb2RlVHlwZSh0KSk7bGV0IGk9bnVsbDtpZihuPjEpe2xldCBvPW51bGw7dGhpcy5nZXRWZWN0b3JMZW5ndGgoKT49biYmKG89dC5nZXRUeXBlRnJvbUxlbmd0aCh0aGlzLmdldFZlY3Rvckxlbmd0aCgpLHRoaXMuZ2V0Q29tcG9uZW50VHlwZSh0KSkpO2NvbnN0IGM9cy5idWlsZCh0LG8pO3RoaXMuY29tcG9uZW50cy5sZW5ndGg9PT1uJiZ0aGlzLmNvbXBvbmVudHM9PT1DYS5zbGljZSgwLHRoaXMuY29tcG9uZW50cy5sZW5ndGgpP2k9dC5mb3JtYXQoYyxvLGUpOmk9dC5mb3JtYXQoYCR7Y30uJHt0aGlzLmNvbXBvbmVudHN9YCx0aGlzLmdldE5vZGVUeXBlKHQpLGUpfWVsc2UgaT1zLmJ1aWxkKHQsZSk7cmV0dXJuIGl9c2VyaWFsaXplKHQpe3N1cGVyLnNlcmlhbGl6ZSh0KSx0LmNvbXBvbmVudHM9dGhpcy5jb21wb25lbnRzfWRlc2VyaWFsaXplKHQpe3N1cGVyLmRlc2VyaWFsaXplKHQpLHRoaXMuY29tcG9uZW50cz10LmNvbXBvbmVudHN9fWNsYXNzIEZhIGV4dGVuZHMgZHR7c3RhdGljIGdldCB0eXBlKCl7cmV0dXJuIlNldE5vZGUifWNvbnN0cnVjdG9yKHQsZSxzKXtzdXBlcigpLHRoaXMuc291cmNlTm9kZT10LHRoaXMuY29tcG9uZW50cz1lLHRoaXMudGFyZ2V0Tm9kZT1zfWdldE5vZGVUeXBlKHQpe3JldHVybiB0aGlzLnNvdXJjZU5vZGUuZ2V0Tm9kZVR5cGUodCl9Z2VuZXJhdGUodCl7Y29uc3R7c291cmNlTm9kZTplLGNvbXBvbmVudHM6cyx0YXJnZXROb2RlOm59PXRoaXMsaT10aGlzLmdldE5vZGVUeXBlKHQpLG89dC5nZXRUeXBlRnJvbUxlbmd0aChzLmxlbmd0aCxuLmdldE5vZGVUeXBlKHQpKSxhPW4uYnVpbGQodCxvKSxjPWUuYnVpbGQodCxpKSx1PXQuZ2V0VHlwZUxlbmd0aChpKSxoPVtdO2ZvcihsZXQgbD0wO2w8dTtsKyspe2NvbnN0IGQ9bnNbbF07ZD09PXNbMF0/KGgucHVzaChhKSxsKz1zLmxlbmd0aC0xKTpoLnB1c2goYysiLiIrZCl9cmV0dXJuYCR7dC5nZXRUeXBlKGkpfSggJHtoLmpvaW4oIiwgIil9IClgfX1jbGFzcyBSYSBleHRlbmRzIGR0e3N0YXRpYyBnZXQgdHlwZSgpe3JldHVybiJGbGlwTm9kZSJ9Y29uc3RydWN0b3IodCxlKXtzdXBlcigpLHRoaXMuc291cmNlTm9kZT10LHRoaXMuY29tcG9uZW50cz1lfWdldE5vZGVUeXBlKHQpe3JldHVybiB0aGlzLnNvdXJjZU5vZGUuZ2V0Tm9kZVR5cGUodCl9Z2VuZXJhdGUodCl7Y29uc3R7Y29tcG9uZW50czplLHNvdXJjZU5vZGU6c309dGhpcyxuPXRoaXMuZ2V0Tm9kZVR5cGUodCksaT1zLmJ1aWxkKHQpLG89dC5nZXRWYXJGcm9tTm9kZSh0aGlzKSxhPXQuZ2V0UHJvcGVydHlOYW1lKG8pO3QuYWRkTGluZUZsb3dDb2RlKGErIiA9ICIraSx0aGlzKTtjb25zdCBjPXQuZ2V0VHlwZUxlbmd0aChuKSx1PVtdO2xldCBoPTA7Zm9yKGxldCBsPTA7bDxjO2wrKyl7Y29uc3QgZD1uc1tsXTtkPT09ZVtoXT8odS5wdXNoKCIxLjAgLSAiKyhhKyIuIitkKSksaCsrKTp1LnB1c2goYSsiLiIrZCl9cmV0dXJuYCR7dC5nZXRUeXBlKG4pfSggJHt1LmpvaW4oIiwgIil9IClgfX1jbGFzcyBqbiBleHRlbmRzIFV7c3RhdGljIGdldCB0eXBlKCl7cmV0dXJuIklucHV0Tm9kZSJ9Y29uc3RydWN0b3IodCxlPW51bGwpe3N1cGVyKGUpLHRoaXMuaXNJbnB1dE5vZGU9ITAsdGhpcy52YWx1ZT10LHRoaXMucHJlY2lzaW9uPW51bGx9Z2V0Tm9kZVR5cGUoKXtyZXR1cm4gdGhpcy5ub2RlVHlwZT09PW51bGw/VnModGhpcy52YWx1ZSk6dGhpcy5ub2RlVHlwZX1nZXRJbnB1dFR5cGUodCl7cmV0dXJuIHRoaXMuZ2V0Tm9kZVR5cGUodCl9c2V0UHJlY2lzaW9uKHQpe3JldHVybiB0aGlzLnByZWNpc2lvbj10LHRoaXN9c2VyaWFsaXplKHQpe3N1cGVyLnNlcmlhbGl6ZSh0KSx0LnZhbHVlPXRoaXMudmFsdWUsdGhpcy52YWx1ZSYmdGhpcy52YWx1ZS50b0FycmF5JiYodC52YWx1ZT10aGlzLnZhbHVlLnRvQXJyYXkoKSksdC52YWx1ZVR5cGU9VnModGhpcy52YWx1ZSksdC5ub2RlVHlwZT10aGlzLm5vZGVUeXBlLHQudmFsdWVUeXBlPT09IkFycmF5QnVmZmVyIiYmKHQudmFsdWU9X2EodC52YWx1ZSkpLHQucHJlY2lzaW9uPXRoaXMucHJlY2lzaW9ufWRlc2VyaWFsaXplKHQpe3N1cGVyLmRlc2VyaWFsaXplKHQpLHRoaXMubm9kZVR5cGU9dC5ub2RlVHlwZSx0aGlzLnZhbHVlPUFycmF5LmlzQXJyYXkodC52YWx1ZSk/TnIodC52YWx1ZVR5cGUsLi4udC52YWx1ZSk6dC52YWx1ZSx0aGlzLnByZWNpc2lvbj10LnByZWNpc2lvbnx8bnVsbCx0aGlzLnZhbHVlJiZ0aGlzLnZhbHVlLmZyb21BcnJheSYmKHRoaXMudmFsdWU9dGhpcy52YWx1ZS5mcm9tQXJyYXkodC52YWx1ZSkpfWdlbmVyYXRlKCl7Y29uc29sZS53YXJuKCJBYnN0cmFjdCBmdW5jdGlvbi4iKX19Y2xhc3MgSnQgZXh0ZW5kcyBqbntzdGF0aWMgZ2V0IHR5cGUoKXtyZXR1cm4iQ29uc3ROb2RlIn1jb25zdHJ1Y3Rvcih0LGU9bnVsbCl7c3VwZXIodCxlKSx0aGlzLmlzQ29uc3ROb2RlPSEwfWdlbmVyYXRlQ29uc3QodCl7cmV0dXJuIHQuZ2VuZXJhdGVDb25zdCh0aGlzLmdldE5vZGVUeXBlKHQpLHRoaXMudmFsdWUpfWdlbmVyYXRlKHQsZSl7Y29uc3Qgcz10aGlzLmdldE5vZGVUeXBlKHQpO3JldHVybiB0LmZvcm1hdCh0aGlzLmdlbmVyYXRlQ29uc3QodCkscyxlKX19bGV0IFNyPW51bGw7Y29uc3QgQ2U9bmV3IE1hcDtmdW5jdGlvbiBiKHIsdCl7aWYoQ2UuaGFzKHIpKXtjb25zb2xlLndhcm4oYFJlZGVmaW5pdGlvbiBvZiBtZXRob2QgY2hhaW5pbmcgJHtyfWApO3JldHVybn1pZih0eXBlb2YgdCE9ImZ1bmN0aW9uIil0aHJvdyBuZXcgRXJyb3IoYE5vZGUgZWxlbWVudCAke3J9IGlzIG5vdCBhIGZ1bmN0aW9uYCk7Q2Uuc2V0KHIsdCl9Y29uc3QgX3I9cj0+ci5yZXBsYWNlKC9yfHMvZywieCIpLnJlcGxhY2UoL2d8dC9nLCJ5IikucmVwbGFjZSgvYnxwL2csInoiKS5yZXBsYWNlKC9hfHEvZywidyIpLHpyPXI9Pl9yKHIpLnNwbGl0KCIiKS5zb3J0KCkuam9pbigiIiksYnI9e3NldHVwKHIsdCl7Y29uc3QgZT10LnNoaWZ0KCk7cmV0dXJuIHIoSHMoZSksLi4udCl9LGdldChyLHQsZSl7aWYodHlwZW9mIHQ9PSJzdHJpbmciJiZyW3RdPT09dm9pZCAwKXtpZihyLmlzU3RhY2tOb2RlIT09ITAmJnQ9PT0iYXNzaWduIilyZXR1cm4oLi4ucyk9PihTci5hc3NpZ24oZSwuLi5zKSxlKTtpZihDZS5oYXModCkpe2NvbnN0IHM9Q2UuZ2V0KHQpO3JldHVybiByLmlzU3RhY2tOb2RlPyguLi5uKT0+ZS5hZGQocyguLi5uKSk6KC4uLm4pPT5zKGUsLi4ubil9ZWxzZXtpZih0PT09InNlbGYiKXJldHVybiByO2lmKHQuZW5kc1dpdGgoIkFzc2lnbiIpJiZDZS5oYXModC5zbGljZSgwLHQubGVuZ3RoLTYpKSl7Y29uc3Qgcz1DZS5nZXQodC5zbGljZSgwLHQubGVuZ3RoLTYpKTtyZXR1cm4gci5pc1N0YWNrTm9kZT8oLi4ubik9PmUuYXNzaWduKG5bMF0scyguLi5uKSk6KC4uLm4pPT5lLmFzc2lnbihzKGUsLi4ubikpfWVsc2V7aWYoL15beHl6d3JnYmFzdHBxXXsxLDR9JC8udGVzdCh0KT09PSEwKXJldHVybiB0PV9yKHQpLHYobmV3IE1yKGUsdCkpO2lmKC9ec2V0W1hZWldSR0JBU1RQUV17MSw0fSQvLnRlc3QodCk9PT0hMClyZXR1cm4gdD16cih0LnNsaWNlKDMpLnRvTG93ZXJDYXNlKCkpLHM9PnYobmV3IEZhKHIsdCxzKSk7aWYoL15mbGlwW1hZWldSR0JBU1RQUV17MSw0fSQvLnRlc3QodCk9PT0hMClyZXR1cm4gdD16cih0LnNsaWNlKDQpLnRvTG93ZXJDYXNlKCkpLCgpPT52KG5ldyBSYSh2KHIpLHQpKTtpZih0PT09IndpZHRoInx8dD09PSJoZWlnaHQifHx0PT09ImRlcHRoIilyZXR1cm4gdD09PSJ3aWR0aCI/dD0ieCI6dD09PSJoZWlnaHQiP3Q9InkiOnQ9PT0iZGVwdGgiJiYodD0ieiIpLHYobmV3IE1yKHIsdCkpO2lmKC9eXGQrJC8udGVzdCh0KT09PSEwKXJldHVybiB2KG5ldyBpcyhlLG5ldyBKdChOdW1iZXIodCksInVpbnQiKSkpfX19cmV0dXJuIFJlZmxlY3QuZ2V0KHIsdCxlKX0sc2V0KHIsdCxlLHMpe3JldHVybiB0eXBlb2YgdD09InN0cmluZyImJnJbdF09PT12b2lkIDAmJigvXlt4eXp3cmdiYXN0cHFdezEsNH0kLy50ZXN0KHQpPT09ITB8fHQ9PT0id2lkdGgifHx0PT09ImhlaWdodCJ8fHQ9PT0iZGVwdGgifHwvXlxkKyQvLnRlc3QodCk9PT0hMCk/KHNbdF0uYXNzaWduKGUpLCEwKTpSZWZsZWN0LnNldChyLHQsZSxzKX19LFFuPW5ldyBXZWFrTWFwLEVyPW5ldyBXZWFrTWFwLEJhPWZ1bmN0aW9uKHIsdD1udWxsKXtjb25zdCBlPVZzKHIpO2lmKGU9PT0ibm9kZSIpe2xldCBzPVFuLmdldChyKTtyZXR1cm4gcz09PXZvaWQgMCYmKHM9bmV3IFByb3h5KHIsYnIpLFFuLnNldChyLHMpLFFuLnNldChzLHMpKSxzfWVsc2V7aWYodD09PW51bGwmJihlPT09ImZsb2F0Inx8ZT09PSJib29sZWFuIil8fGUmJmUhPT0ic2hhZGVyIiYmZSE9PSJzdHJpbmciKXJldHVybiB2KHNpKHIsdCkpO2lmKGU9PT0ic2hhZGVyIilyZXR1cm4gdHQocil9cmV0dXJuIHJ9LElhPWZ1bmN0aW9uKHIsdD1udWxsKXtmb3IoY29uc3QgZSBpbiByKXJbZV09dihyW2VdLHQpO3JldHVybiByfSx2YT1mdW5jdGlvbihyLHQ9bnVsbCl7Y29uc3QgZT1yLmxlbmd0aDtmb3IobGV0IHM9MDtzPGU7cysrKXJbc109dihyW3NdLHQpO3JldHVybiByfSxQYT1mdW5jdGlvbihyLHQ9bnVsbCxlPW51bGwscz1udWxsKXtjb25zdCBuPWk9PnYocyE9PW51bGw/T2JqZWN0LmFzc2lnbihpLHMpOmkpO3JldHVybiB0PT09bnVsbD8oLi4uaSk9Pm4obmV3IHIoLi4uRmUoaSkpKTplIT09bnVsbD8oZT12KGUpLCguLi5pKT0+bihuZXcgcih0LC4uLkZlKGkpLGUpKSk6KC4uLmkpPT5uKG5ldyByKHQsLi4uRmUoaSkpKX0sTGE9ZnVuY3Rpb24ociwuLi50KXtyZXR1cm4gdihuZXcgciguLi5GZSh0KSkpfTtjbGFzcyBPYSBleHRlbmRzIFV7Y29uc3RydWN0b3IodCxlKXtzdXBlcigpLHRoaXMuc2hhZGVyTm9kZT10LHRoaXMuaW5wdXROb2Rlcz1lfWdldE5vZGVUeXBlKHQpe3JldHVybiB0aGlzLnNoYWRlck5vZGUubm9kZVR5cGV8fHRoaXMuZ2V0T3V0cHV0Tm9kZSh0KS5nZXROb2RlVHlwZSh0KX1jYWxsKHQpe2NvbnN0e3NoYWRlck5vZGU6ZSxpbnB1dE5vZGVzOnN9PXRoaXMsbj10LmdldE5vZGVQcm9wZXJ0aWVzKGUpO2lmKG4ub25jZU91dHB1dClyZXR1cm4gbi5vbmNlT3V0cHV0O2xldCBpPW51bGw7aWYoZS5sYXlvdXQpe2xldCBvPUVyLmdldCh0LmNvbnN0cnVjdG9yKTtvPT09dm9pZCAwJiYobz1uZXcgV2Vha01hcCxFci5zZXQodC5jb25zdHJ1Y3RvcixvKSk7bGV0IGE9by5nZXQoZSk7YT09PXZvaWQgMCYmKGE9dih0LmJ1aWxkRnVuY3Rpb25Ob2RlKGUpKSxvLnNldChlLGEpKSx0LmN1cnJlbnRGdW5jdGlvbk5vZGUhPT1udWxsJiZ0LmN1cnJlbnRGdW5jdGlvbk5vZGUuaW5jbHVkZXMucHVzaChhKSxpPXYoYS5jYWxsKHMpKX1lbHNle2NvbnN0IG89ZS5qc0Z1bmMsYT1zIT09bnVsbD9vKHMsdCk6byh0KTtpPXYoYSl9cmV0dXJuIGUub25jZSYmKG4ub25jZU91dHB1dD1pKSxpfWdldE91dHB1dE5vZGUodCl7Y29uc3QgZT10LmdldE5vZGVQcm9wZXJ0aWVzKHRoaXMpO3JldHVybiBlLm91dHB1dE5vZGU9PT1udWxsJiYoZS5vdXRwdXROb2RlPXRoaXMuc2V0dXBPdXRwdXQodCkpLGUub3V0cHV0Tm9kZX1zZXR1cCh0KXtyZXR1cm4gdGhpcy5nZXRPdXRwdXROb2RlKHQpfXNldHVwT3V0cHV0KHQpe3JldHVybiB0LmFkZFN0YWNrKCksdC5zdGFjay5vdXRwdXROb2RlPXRoaXMuY2FsbCh0KSx0LnJlbW92ZVN0YWNrKCl9Z2VuZXJhdGUodCxlKXtyZXR1cm4gdGhpcy5nZXRPdXRwdXROb2RlKHQpLmJ1aWxkKHQsZSl9fWNsYXNzIERhIGV4dGVuZHMgVXtjb25zdHJ1Y3Rvcih0LGUpe3N1cGVyKGUpLHRoaXMuanNGdW5jPXQsdGhpcy5sYXlvdXQ9bnVsbCx0aGlzLmdsb2JhbD0hMCx0aGlzLm9uY2U9ITF9c2V0TGF5b3V0KHQpe3JldHVybiB0aGlzLmxheW91dD10LHRoaXN9Y2FsbCh0PW51bGwpe3JldHVybiBIcyh0KSx2KG5ldyBPYSh0aGlzLHQpKX1zZXR1cCgpe3JldHVybiB0aGlzLmNhbGwoKX19Y29uc3QgVmE9WyExLCEwXSxVYT1bMCwxLDIsM10sa2E9Wy0xLC0yXSxDcj1bLjUsMS41LDEvMywxZS02LDFlNixNYXRoLlBJLE1hdGguUEkqMiwxL01hdGguUEksMi9NYXRoLlBJLDEvKE1hdGguUEkqMiksTWF0aC5QSS8yXSxLbj1uZXcgTWFwO2Zvcihjb25zdCByIG9mIFZhKUtuLnNldChyLG5ldyBKdChyKSk7Y29uc3QgdGk9bmV3IE1hcDtmb3IoY29uc3QgciBvZiBVYSl0aS5zZXQocixuZXcgSnQociwidWludCIpKTtjb25zdCBlaT1uZXcgTWFwKFsuLi50aV0ubWFwKHI9Pm5ldyBKdChyLnZhbHVlLCJpbnQiKSkpO2Zvcihjb25zdCByIG9mIGthKWVpLnNldChyLG5ldyBKdChyLCJpbnQiKSk7Y29uc3QgVXM9bmV3IE1hcChbLi4uZWldLm1hcChyPT5uZXcgSnQoci52YWx1ZSkpKTtmb3IoY29uc3QgciBvZiBDcilVcy5zZXQocixuZXcgSnQocikpO2Zvcihjb25zdCByIG9mIENyKVVzLnNldCgtcixuZXcgSnQoLXIpKTtjb25zdCBrcz17Ym9vbDpLbix1aW50OnRpLGludHM6ZWksZmxvYXQ6VXN9LEZyPW5ldyBNYXAoWy4uLktuLC4uLlVzXSksc2k9KHIsdCk9PkZyLmhhcyhyKT9Gci5nZXQocik6ci5pc05vZGU9PT0hMD9yOm5ldyBKdChyLHQpLEhhPXI9Pnt0cnl7cmV0dXJuIHIuZ2V0Tm9kZVR5cGUoKX1jYXRjaHtyZXR1cm59fSxLPWZ1bmN0aW9uKHIsdD1udWxsKXtyZXR1cm4oLi4uZSk9PntpZigoZS5sZW5ndGg9PT0wfHwhWyJib29sIiwiZmxvYXQiLCJpbnQiLCJ1aW50Il0uaW5jbHVkZXMocikmJmUuZXZlcnkobj0+dHlwZW9mIG4hPSJvYmplY3QiKSkmJihlPVtOcihyLC4uLmUpXSksZS5sZW5ndGg9PT0xJiZ0IT09bnVsbCYmdC5oYXMoZVswXSkpcmV0dXJuIHYodC5nZXQoZVswXSkpO2lmKGUubGVuZ3RoPT09MSl7Y29uc3Qgbj1zaShlWzBdLHIpO3JldHVybiBIYShuKT09PXI/dihuKTp2KG5ldyBBcihuLHIpKX1jb25zdCBzPWUubWFwKG49PnNpKG4pKTtyZXR1cm4gdihuZXcgRWEocyxyKSl9fSxxYT1yPT5yIT1udWxsP3Iubm9kZVR5cGV8fHIuY29udmVydFRvfHwodHlwZW9mIHI9PSJzdHJpbmciP3I6bnVsbCk6bnVsbDtmdW5jdGlvbiAkYShyLHQpe3JldHVybiBuZXcgUHJveHkobmV3IERhKHIsdCksYnIpfWNvbnN0IHY9KHIsdD1udWxsKT0+QmEocix0KSxIcz0ocix0PW51bGwpPT5uZXcgSWEocix0KSxGZT0ocix0PW51bGwpPT5uZXcgdmEocix0KSxDPSguLi5yKT0+bmV3IFBhKC4uLnIpLE89KC4uLnIpPT5uZXcgTGEoLi4uciksdHQ9KHIsdCk9Pntjb25zdCBlPW5ldyAkYShyLHQpLHM9KC4uLm4pPT57bGV0IGk7cmV0dXJuIEhzKG4pLG5bMF0mJm5bMF0uaXNOb2RlP2k9Wy4uLm5dOmk9blswXSxlLmNhbGwoaSl9O3JldHVybiBzLnNoYWRlck5vZGU9ZSxzLnNldExheW91dD1uPT4oZS5zZXRMYXlvdXQobikscykscy5vbmNlPSgpPT4oZS5vbmNlPSEwLHMpLHN9O2IoInRvR2xvYmFsIixyPT4oci5nbG9iYWw9ITAscikpO2NvbnN0IG5pPSguLi5yKT0+U3IuSWYoLi4ucik7ZnVuY3Rpb24gR2Eocil7cmV0dXJuIHJ9YigiYXBwZW5kIixHYSk7Y29uc3QgV2E9bmV3IEsoImNvbG9yIikscT1uZXcgSygiZmxvYXQiLGtzLmZsb2F0KSxSZT1uZXcgSygiaW50Iixrcy5pbnRzKSxYYT1uZXcgSygidWludCIsa3MudWludCksWWE9bmV3IEsoImJvb2wiLGtzLmJvb2wpLEQ9bmV3IEsoInZlYzIiKSxaYT1uZXcgSygiaXZlYzIiKSxKYT1uZXcgSygidXZlYzIiKSxqYT1uZXcgSygiYnZlYzIiKSxrPW5ldyBLKCJ2ZWMzIiksUWE9bmV3IEsoIml2ZWMzIiksS2E9bmV3IEsoInV2ZWMzIiksdGM9bmV3IEsoImJ2ZWMzIiksQmU9bmV3IEsoInZlYzQiKSxlYz1uZXcgSygiaXZlYzQiKSxzYz1uZXcgSygidXZlYzQiKSxuYz1uZXcgSygiYnZlYzQiKSxScj1uZXcgSygibWF0MiIpLHFzPW5ldyBLKCJtYXQzIiksaWM9bmV3IEsoIm1hdDQiKTtiKCJ0b0NvbG9yIixXYSksYigidG9GbG9hdCIscSksYigidG9JbnQiLFJlKSxiKCJ0b1VpbnQiLFhhKSxiKCJ0b0Jvb2wiLFlhKSxiKCJ0b1ZlYzIiLEQpLGIoInRvSVZlYzIiLFphKSxiKCJ0b1VWZWMyIixKYSksYigidG9CVmVjMiIsamEpLGIoInRvVmVjMyIsayksYigidG9JVmVjMyIsUWEpLGIoInRvVVZlYzMiLEthKSxiKCJ0b0JWZWMzIix0YyksYigidG9WZWM0IixCZSksYigidG9JVmVjNCIsZWMpLGIoInRvVVZlYzQiLHNjKSxiKCJ0b0JWZWM0IixuYyksYigidG9NYXQyIixSciksYigidG9NYXQzIixxcyksYigidG9NYXQ0IixpYyk7Y29uc3QgcmM9Qyhpcyksb2M9KHIsdCk9PnYobmV3IEFyKHYociksdCkpO2IoImVsZW1lbnQiLHJjKSxiKCJjb252ZXJ0IixvYyk7Y2xhc3MgQnIgZXh0ZW5kcyBVe3N0YXRpYyBnZXQgdHlwZSgpe3JldHVybiJVbmlmb3JtR3JvdXBOb2RlIn1jb25zdHJ1Y3Rvcih0LGU9ITEscz0xKXtzdXBlcigic3RyaW5nIiksdGhpcy5uYW1lPXQsdGhpcy52ZXJzaW9uPTAsdGhpcy5zaGFyZWQ9ZSx0aGlzLm9yZGVyPXMsdGhpcy5pc1VuaWZvcm1Hcm91cD0hMH1zZXQgbmVlZHNVcGRhdGUodCl7dD09PSEwJiZ0aGlzLnZlcnNpb24rK31zZXJpYWxpemUodCl7c3VwZXIuc2VyaWFsaXplKHQpLHQubmFtZT10aGlzLm5hbWUsdC52ZXJzaW9uPXRoaXMudmVyc2lvbix0LnNoYXJlZD10aGlzLnNoYXJlZH1kZXNlcmlhbGl6ZSh0KXtzdXBlci5kZXNlcmlhbGl6ZSh0KSx0aGlzLm5hbWU9dC5uYW1lLHRoaXMudmVyc2lvbj10LnZlcnNpb24sdGhpcy5zaGFyZWQ9dC5zaGFyZWR9fWNvbnN0IGFjPXI9Pm5ldyBCcihyKSxkZT0oKHIsdD0wKT0+bmV3IEJyKHIsITAsdCkpKCJyZW5kZXIiKSxjYz1hYygib2JqZWN0Iik7Y2xhc3MgSWUgZXh0ZW5kcyBqbntzdGF0aWMgZ2V0IHR5cGUoKXtyZXR1cm4iVW5pZm9ybU5vZGUifWNvbnN0cnVjdG9yKHQsZT1udWxsKXtzdXBlcih0LGUpLHRoaXMuaXNVbmlmb3JtTm9kZT0hMCx0aGlzLm5hbWU9IiIsdGhpcy5ncm91cE5vZGU9Y2N9bGFiZWwodCl7cmV0dXJuIHRoaXMubmFtZT10LHRoaXN9c2V0R3JvdXAodCl7cmV0dXJuIHRoaXMuZ3JvdXBOb2RlPXQsdGhpc31nZXRHcm91cCgpe3JldHVybiB0aGlzLmdyb3VwTm9kZX1nZXRVbmlmb3JtSGFzaCh0KXtyZXR1cm4gdGhpcy5nZXRIYXNoKHQpfW9uVXBkYXRlKHQsZSl7Y29uc3Qgcz10aGlzLmdldFNlbGYoKTtyZXR1cm4gdD10LmJpbmQocyksc3VwZXIub25VcGRhdGUobj0+e2NvbnN0IGk9dChuLHMpO2khPT12b2lkIDAmJih0aGlzLnZhbHVlPWkpfSxlKX1nZW5lcmF0ZSh0LGUpe2NvbnN0IHM9dGhpcy5nZXROb2RlVHlwZSh0KSxuPXRoaXMuZ2V0VW5pZm9ybUhhc2godCk7bGV0IGk9dC5nZXROb2RlRnJvbUhhc2gobik7aT09PXZvaWQgMCYmKHQuc2V0SGFzaE5vZGUodGhpcyxuKSxpPXRoaXMpO2NvbnN0IG89aS5nZXRJbnB1dFR5cGUodCksYT10LmdldFVuaWZvcm1Gcm9tTm9kZShpLG8sdC5zaGFkZXJTdGFnZSx0aGlzLm5hbWV8fHQuY29udGV4dC5sYWJlbCksYz10LmdldFByb3BlcnR5TmFtZShhKTtyZXR1cm4gdC5jb250ZXh0LmxhYmVsIT09dm9pZCAwJiZkZWxldGUgdC5jb250ZXh0LmxhYmVsLHQuZm9ybWF0KGMscyxlKX19Y29uc3QgeHQ9KHIsdCk9Pntjb25zdCBlPXFhKHR8fHIpLHM9ciYmci5pc05vZGU9PT0hMD9yLm5vZGUmJnIubm9kZS52YWx1ZXx8ci52YWx1ZTpyO3JldHVybiB2KG5ldyBJZShzLGUpKX07Y2xhc3MgSXIgZXh0ZW5kcyBVe3N0YXRpYyBnZXQgdHlwZSgpe3JldHVybiJQcm9wZXJ0eU5vZGUifWNvbnN0cnVjdG9yKHQsZT1udWxsLHM9ITEpe3N1cGVyKHQpLHRoaXMubmFtZT1lLHRoaXMudmFyeWluZz1zLHRoaXMuaXNQcm9wZXJ0eU5vZGU9ITB9Z2V0SGFzaCh0KXtyZXR1cm4gdGhpcy5uYW1lfHxzdXBlci5nZXRIYXNoKHQpfWlzR2xvYmFsKCl7cmV0dXJuITB9Z2VuZXJhdGUodCl7bGV0IGU7cmV0dXJuIHRoaXMudmFyeWluZz09PSEwPyhlPXQuZ2V0VmFyeWluZ0Zyb21Ob2RlKHRoaXMsdGhpcy5uYW1lKSxlLm5lZWRzSW50ZXJwb2xhdGlvbj0hMCk6ZT10LmdldFZhckZyb21Ob2RlKHRoaXMsdGhpcy5uYW1lKSx0LmdldFByb3BlcnR5TmFtZShlKX19Y29uc3QgdmU9KHIsdCk9PnYobmV3IElyKHIsdCkpLHZyPU8oSXIsInZlYzQiLCJEaWZmdXNlQ29sb3IiKTtjbGFzcyBoYyBleHRlbmRzIGR0e3N0YXRpYyBnZXQgdHlwZSgpe3JldHVybiJBc3NpZ25Ob2RlIn1jb25zdHJ1Y3Rvcih0LGUpe3N1cGVyKCksdGhpcy50YXJnZXROb2RlPXQsdGhpcy5zb3VyY2VOb2RlPWV9aGFzRGVwZW5kZW5jaWVzKCl7cmV0dXJuITF9Z2V0Tm9kZVR5cGUodCxlKXtyZXR1cm4gZSE9PSJ2b2lkIj90aGlzLnRhcmdldE5vZGUuZ2V0Tm9kZVR5cGUodCk6InZvaWQifW5lZWRzU3BsaXRBc3NpZ24odCl7Y29uc3R7dGFyZ2V0Tm9kZTplfT10aGlzO2lmKHQuaXNBdmFpbGFibGUoInN3aXp6bGVBc3NpZ24iKT09PSExJiZlLmlzU3BsaXROb2RlJiZlLmNvbXBvbmVudHMubGVuZ3RoPjEpe2NvbnN0IHM9dC5nZXRUeXBlTGVuZ3RoKGUubm9kZS5nZXROb2RlVHlwZSh0KSk7cmV0dXJuIG5zLmpvaW4oIiIpLnNsaWNlKDAscykhPT1lLmNvbXBvbmVudHN9cmV0dXJuITF9Z2VuZXJhdGUodCxlKXtjb25zdHt0YXJnZXROb2RlOnMsc291cmNlTm9kZTpufT10aGlzLGk9dGhpcy5uZWVkc1NwbGl0QXNzaWduKHQpLG89cy5nZXROb2RlVHlwZSh0KSxhPXMuY29udGV4dCh7YXNzaWduOiEwfSkuYnVpbGQodCksYz1uLmJ1aWxkKHQsbyksdT1uLmdldE5vZGVUeXBlKHQpLGg9dC5nZXREYXRhRnJvbU5vZGUodGhpcyk7bGV0IGw7aWYoaC5pbml0aWFsaXplZD09PSEwKWUhPT0idm9pZCImJihsPWEpO2Vsc2UgaWYoaSl7Y29uc3QgZD10LmdldFZhckZyb21Ob2RlKHRoaXMsbnVsbCxvKSxmPXQuZ2V0UHJvcGVydHlOYW1lKGQpO3QuYWRkTGluZUZsb3dDb2RlKGAke2Z9ID0gJHtjfWAsdGhpcyk7Y29uc3QgcD1zLm5vZGUuY29udGV4dCh7YXNzaWduOiEwfSkuYnVpbGQodCk7Zm9yKGxldCBtPTA7bTxzLmNvbXBvbmVudHMubGVuZ3RoO20rKyl7Y29uc3QgZz1zLmNvbXBvbmVudHNbbV07dC5hZGRMaW5lRmxvd0NvZGUoYCR7cH0uJHtnfSA9ICR7Zn1bICR7bX0gXWAsdGhpcyl9ZSE9PSJ2b2lkIiYmKGw9YSl9ZWxzZSBsPWAke2F9ID0gJHtjfWAsKGU9PT0idm9pZCJ8fHU9PT0idm9pZCIpJiYodC5hZGRMaW5lRmxvd0NvZGUobCx0aGlzKSxlIT09InZvaWQiJiYobD1hKSk7cmV0dXJuIGguaW5pdGlhbGl6ZWQ9ITAsdC5mb3JtYXQobCxvLGUpfX1iKCJhc3NpZ24iLEMoaGMpKTtjbGFzcyB1YyBleHRlbmRzIGR0e3N0YXRpYyBnZXQgdHlwZSgpe3JldHVybiJGdW5jdGlvbkNhbGxOb2RlIn1jb25zdHJ1Y3Rvcih0PW51bGwsZT17fSl7c3VwZXIoKSx0aGlzLmZ1bmN0aW9uTm9kZT10LHRoaXMucGFyYW1ldGVycz1lfXNldFBhcmFtZXRlcnModCl7cmV0dXJuIHRoaXMucGFyYW1ldGVycz10LHRoaXN9Z2V0UGFyYW1ldGVycygpe3JldHVybiB0aGlzLnBhcmFtZXRlcnN9Z2V0Tm9kZVR5cGUodCl7cmV0dXJuIHRoaXMuZnVuY3Rpb25Ob2RlLmdldE5vZGVUeXBlKHQpfWdlbmVyYXRlKHQpe2NvbnN0IGU9W10scz10aGlzLmZ1bmN0aW9uTm9kZSxuPXMuZ2V0SW5wdXRzKHQpLGk9dGhpcy5wYXJhbWV0ZXJzO2lmKEFycmF5LmlzQXJyYXkoaSkpZm9yKGxldCBhPTA7YTxpLmxlbmd0aDthKyspe2NvbnN0IGM9blthXSx1PWlbYV07ZS5wdXNoKHUuYnVpbGQodCxjLnR5cGUpKX1lbHNlIGZvcihjb25zdCBhIG9mIG4pe2NvbnN0IGM9aVthLm5hbWVdO2lmKGMhPT12b2lkIDApZS5wdXNoKGMuYnVpbGQodCxhLnR5cGUpKTtlbHNlIHRocm93IG5ldyBFcnJvcihgRnVuY3Rpb25DYWxsTm9kZTogSW5wdXQgJyR7YS5uYW1lfScgbm90IGZvdW5kIGluIEZ1bmN0aW9uTm9kZS5gKX1yZXR1cm5gJHtzLmJ1aWxkKHQsInByb3BlcnR5Iil9KCAke2Uuam9pbigiLCAiKX0gKWB9fWIoImNhbGwiLChyLC4uLnQpPT4odD10Lmxlbmd0aD4xfHx0WzBdJiZ0WzBdLmlzTm9kZT09PSEwP0ZlKHQpOkhzKHRbMF0pLHYobmV3IHVjKHYociksdCkpKSk7Y2xhc3MgWSBleHRlbmRzIGR0e3N0YXRpYyBnZXQgdHlwZSgpe3JldHVybiJPcGVyYXRvck5vZGUifWNvbnN0cnVjdG9yKHQsZSxzLC4uLm4pe2lmKHN1cGVyKCksbi5sZW5ndGg+MCl7bGV0IGk9bmV3IFkodCxlLHMpO2ZvcihsZXQgbz0wO288bi5sZW5ndGgtMTtvKyspaT1uZXcgWSh0LGksbltvXSk7ZT1pLHM9bltuLmxlbmd0aC0xXX10aGlzLm9wPXQsdGhpcy5hTm9kZT1lLHRoaXMuYk5vZGU9c31nZXROb2RlVHlwZSh0LGUpe2NvbnN0IHM9dGhpcy5vcCxuPXRoaXMuYU5vZGUsaT10aGlzLmJOb2RlLG89bi5nZXROb2RlVHlwZSh0KSxhPXR5cGVvZiBpPCJ1Ij9pLmdldE5vZGVUeXBlKHQpOm51bGw7aWYobz09PSJ2b2lkInx8YT09PSJ2b2lkIilyZXR1cm4idm9pZCI7aWYocz09PSIlIilyZXR1cm4gbztpZihzPT09In4ifHxzPT09IiYifHxzPT09InwifHxzPT09Il4ifHxzPT09Ij4+Inx8cz09PSI8PCIpcmV0dXJuIHQuZ2V0SW50ZWdlclR5cGUobyk7aWYocz09PSIhInx8cz09PSI9PSJ8fHM9PT0iJiYifHxzPT09Inx8Inx8cz09PSJeXiIpcmV0dXJuImJvb2wiO2lmKHM9PT0iPCJ8fHM9PT0iPiJ8fHM9PT0iPD0ifHxzPT09Ij49Iil7Y29uc3QgYz1lP3QuZ2V0VHlwZUxlbmd0aChlKTpNYXRoLm1heCh0LmdldFR5cGVMZW5ndGgobyksdC5nZXRUeXBlTGVuZ3RoKGEpKTtyZXR1cm4gYz4xP2BidmVjJHtjfWA6ImJvb2wifWVsc2UgcmV0dXJuIG89PT0iZmxvYXQiJiZ0LmlzTWF0cml4KGEpP2E6dC5pc01hdHJpeChvKSYmdC5pc1ZlY3RvcihhKT90LmdldFZlY3RvckZyb21NYXRyaXgobyk6dC5pc1ZlY3RvcihvKSYmdC5pc01hdHJpeChhKT90LmdldFZlY3RvckZyb21NYXRyaXgoYSk6dC5nZXRUeXBlTGVuZ3RoKGEpPnQuZ2V0VHlwZUxlbmd0aChvKT9hOm99Z2VuZXJhdGUodCxlKXtjb25zdCBzPXRoaXMub3Asbj10aGlzLmFOb2RlLGk9dGhpcy5iTm9kZSxvPXRoaXMuZ2V0Tm9kZVR5cGUodCxlKTtsZXQgYT1udWxsLGM9bnVsbDtvIT09InZvaWQiPyhhPW4uZ2V0Tm9kZVR5cGUodCksYz10eXBlb2YgaTwidSI/aS5nZXROb2RlVHlwZSh0KTpudWxsLHM9PT0iPCJ8fHM9PT0iPiJ8fHM9PT0iPD0ifHxzPT09Ij49Inx8cz09PSI9PSI/dC5pc1ZlY3RvcihhKT9jPWE6YSE9PWMmJihhPWM9ImZsb2F0Iik6cz09PSI+PiJ8fHM9PT0iPDwiPyhhPW8sYz10LmNoYW5nZUNvbXBvbmVudFR5cGUoYywidWludCIpKTp0LmlzTWF0cml4KGEpJiZ0LmlzVmVjdG9yKGMpP2M9dC5nZXRWZWN0b3JGcm9tTWF0cml4KGEpOnQuaXNWZWN0b3IoYSkmJnQuaXNNYXRyaXgoYyk/YT10LmdldFZlY3RvckZyb21NYXRyaXgoYyk6YT1jPW8pOmE9Yz1vO2NvbnN0IHU9bi5idWlsZCh0LGEpLGg9dHlwZW9mIGk8InUiP2kuYnVpbGQodCxjKTpudWxsLGw9dC5nZXRUeXBlTGVuZ3RoKGUpLGQ9dC5nZXRGdW5jdGlvbk9wZXJhdG9yKHMpO2lmKGUhPT0idm9pZCIpcmV0dXJuIHM9PT0iPCImJmw+MT90LnVzZUNvbXBhcmlzb25NZXRob2Q/dC5mb3JtYXQoYCR7dC5nZXRNZXRob2QoImxlc3NUaGFuIixlKX0oICR7dX0sICR7aH0gKWAsbyxlKTp0LmZvcm1hdChgKCAke3V9IDwgJHtofSApYCxvLGUpOnM9PT0iPD0iJiZsPjE/dC51c2VDb21wYXJpc29uTWV0aG9kP3QuZm9ybWF0KGAke3QuZ2V0TWV0aG9kKCJsZXNzVGhhbkVxdWFsIixlKX0oICR7dX0sICR7aH0gKWAsbyxlKTp0LmZvcm1hdChgKCAke3V9IDw9ICR7aH0gKWAsbyxlKTpzPT09Ij4iJiZsPjE/dC51c2VDb21wYXJpc29uTWV0aG9kP3QuZm9ybWF0KGAke3QuZ2V0TWV0aG9kKCJncmVhdGVyVGhhbiIsZSl9KCAke3V9LCAke2h9IClgLG8sZSk6dC5mb3JtYXQoYCggJHt1fSA+ICR7aH0gKWAsbyxlKTpzPT09Ij49IiYmbD4xP3QudXNlQ29tcGFyaXNvbk1ldGhvZD90LmZvcm1hdChgJHt0LmdldE1ldGhvZCgiZ3JlYXRlclRoYW5FcXVhbCIsZSl9KCAke3V9LCAke2h9IClgLG8sZSk6dC5mb3JtYXQoYCggJHt1fSA+PSAke2h9IClgLG8sZSk6cz09PSIhInx8cz09PSJ+Ij90LmZvcm1hdChgKCR7c30ke3V9KWAsYSxlKTpkP3QuZm9ybWF0KGAke2R9KCAke3V9LCAke2h9IClgLG8sZSk6dC5mb3JtYXQoYCggJHt1fSAke3N9ICR7aH0gKWAsbyxlKTtpZihhIT09InZvaWQiKXJldHVybiBkP3QuZm9ybWF0KGAke2R9KCAke3V9LCAke2h9IClgLG8sZSk6dC5mb3JtYXQoYCR7dX0gJHtzfSAke2h9YCxvLGUpfXNlcmlhbGl6ZSh0KXtzdXBlci5zZXJpYWxpemUodCksdC5vcD10aGlzLm9wfWRlc2VyaWFsaXplKHQpe3N1cGVyLmRlc2VyaWFsaXplKHQpLHRoaXMub3A9dC5vcH19Y29uc3QgZmU9QyhZLCIrIiksJHM9QyhZLCItIiksR3M9QyhZLCIqIiksUHI9QyhZLCIvIiksTHI9QyhZLCIlIiksbGM9QyhZLCI9PSIpLGRjPUMoWSwiIT0iKSxmYz1DKFksIjwiKSxwYz1DKFksIj4iKSxtYz1DKFksIjw9IikseWM9QyhZLCI+PSIpLGdjPUMoWSwiJiYiKSx4Yz1DKFksInx8IiksVGM9QyhZLCIhIiksTmM9QyhZLCJeXiIpLHdjPUMoWSwiJiIpLEFjPUMoWSwifiIpLE1jPUMoWSwifCIpLFNjPUMoWSwiXiIpLF9jPUMoWSwiPDwiKSx6Yz1DKFksIj4+Iik7YigiYWRkIixmZSksYigic3ViIiwkcyksYigibXVsIixHcyksYigiZGl2IixQciksYigibW9kSW50IixMciksYigiZXF1YWwiLGxjKSxiKCJub3RFcXVhbCIsZGMpLGIoImxlc3NUaGFuIixmYyksYigiZ3JlYXRlclRoYW4iLHBjKSxiKCJsZXNzVGhhbkVxdWFsIixtYyksYigiZ3JlYXRlclRoYW5FcXVhbCIseWMpLGIoImFuZCIsZ2MpLGIoIm9yIix4YyksYigibm90IixUYyksYigieG9yIixOYyksYigiYml0QW5kIix3YyksYigiYml0Tm90IixBYyksYigiYml0T3IiLE1jKSxiKCJiaXRYb3IiLFNjKSxiKCJzaGlmdExlZnQiLF9jKSxiKCJzaGlmdFJpZ2h0Iix6YyksYigicmVtYWluZGVyIiwoLi4ucik9Pihjb25zb2xlLndhcm4oIlRTTC5PcGVyYXRvck5vZGU6IC5yZW1haW5kZXIoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5tb2RJbnQoKS4iKSxMciguLi5yKSkpO2NsYXNzIHggZXh0ZW5kcyBkdHtzdGF0aWMgZ2V0IHR5cGUoKXtyZXR1cm4iTWF0aE5vZGUifWNvbnN0cnVjdG9yKHQsZSxzPW51bGwsbj1udWxsKXtzdXBlcigpLHRoaXMubWV0aG9kPXQsdGhpcy5hTm9kZT1lLHRoaXMuYk5vZGU9cyx0aGlzLmNOb2RlPW59Z2V0SW5wdXRUeXBlKHQpe2NvbnN0IGU9dGhpcy5hTm9kZS5nZXROb2RlVHlwZSh0KSxzPXRoaXMuYk5vZGU/dGhpcy5iTm9kZS5nZXROb2RlVHlwZSh0KTpudWxsLG49dGhpcy5jTm9kZT90aGlzLmNOb2RlLmdldE5vZGVUeXBlKHQpOm51bGwsaT10LmlzTWF0cml4KGUpPzA6dC5nZXRUeXBlTGVuZ3RoKGUpLG89dC5pc01hdHJpeChzKT8wOnQuZ2V0VHlwZUxlbmd0aChzKSxhPXQuaXNNYXRyaXgobik/MDp0LmdldFR5cGVMZW5ndGgobik7cmV0dXJuIGk+byYmaT5hP2U6bz5hP3M6YT5pP246ZX1nZXROb2RlVHlwZSh0KXtjb25zdCBlPXRoaXMubWV0aG9kO3JldHVybiBlPT09eC5MRU5HVEh8fGU9PT14LkRJU1RBTkNFfHxlPT09eC5ET1Q/ImZsb2F0IjplPT09eC5DUk9TUz8idmVjMyI6ZT09PXguQUxMPyJib29sIjplPT09eC5FUVVBTFM/dC5jaGFuZ2VDb21wb25lbnRUeXBlKHRoaXMuYU5vZGUuZ2V0Tm9kZVR5cGUodCksImJvb2wiKTplPT09eC5NT0Q/dGhpcy5hTm9kZS5nZXROb2RlVHlwZSh0KTp0aGlzLmdldElucHV0VHlwZSh0KX1nZW5lcmF0ZSh0LGUpe2NvbnN0IHM9dGhpcy5tZXRob2Qsbj10aGlzLmdldE5vZGVUeXBlKHQpLGk9dGhpcy5nZXRJbnB1dFR5cGUodCksbz10aGlzLmFOb2RlLGE9dGhpcy5iTm9kZSxjPXRoaXMuY05vZGUsdT10LnJlbmRlcmVyLmlzV2ViR0xSZW5kZXJlcj09PSEwO2lmKHM9PT14LlRSQU5TRk9STV9ESVJFQ1RJT04pe2xldCBoPW8sbD1hO3QuaXNNYXRyaXgoaC5nZXROb2RlVHlwZSh0KSk/bD1CZShrKGwpLDApOmg9QmUoayhoKSwwKTtjb25zdCBkPUdzKGgsbCkueHl6O3JldHVybiBPcihkKS5idWlsZCh0LGUpfWVsc2V7aWYocz09PXguTkVHQVRFKXJldHVybiB0LmZvcm1hdCgiKCAtICIrby5idWlsZCh0LGkpKyIgKSIsbixlKTtpZihzPT09eC5PTkVfTUlOVVMpcmV0dXJuICRzKDEsbykuYnVpbGQodCxlKTtpZihzPT09eC5SRUNJUFJPQ0FMKXJldHVybiBQcigxLG8pLmJ1aWxkKHQsZSk7aWYocz09PXguRElGRkVSRU5DRSlyZXR1cm4gb2koJHMobyxhKSkuYnVpbGQodCxlKTt7Y29uc3QgaD1bXTtyZXR1cm4gcz09PXguQ1JPU1N8fHM9PT14Lk1PRD9oLnB1c2goby5idWlsZCh0LG4pLGEuYnVpbGQodCxuKSk6dSYmcz09PXguU1RFUD9oLnB1c2goby5idWlsZCh0LHQuZ2V0VHlwZUxlbmd0aChvLmdldE5vZGVUeXBlKHQpKT09PTE/ImZsb2F0IjppKSxhLmJ1aWxkKHQsaSkpOnUmJihzPT09eC5NSU58fHM9PT14Lk1BWCl8fHM9PT14Lk1PRD9oLnB1c2goby5idWlsZCh0LGkpLGEuYnVpbGQodCx0LmdldFR5cGVMZW5ndGgoYS5nZXROb2RlVHlwZSh0KSk9PT0xPyJmbG9hdCI6aSkpOnM9PT14LlJFRlJBQ1Q/aC5wdXNoKG8uYnVpbGQodCxpKSxhLmJ1aWxkKHQsaSksYy5idWlsZCh0LCJmbG9hdCIpKTpzPT09eC5NSVg/aC5wdXNoKG8uYnVpbGQodCxpKSxhLmJ1aWxkKHQsaSksYy5idWlsZCh0LHQuZ2V0VHlwZUxlbmd0aChjLmdldE5vZGVUeXBlKHQpKT09PTE/ImZsb2F0IjppKSk6KGgucHVzaChvLmJ1aWxkKHQsaSkpLGEhPT1udWxsJiZoLnB1c2goYS5idWlsZCh0LGkpKSxjIT09bnVsbCYmaC5wdXNoKGMuYnVpbGQodCxpKSkpLHQuZm9ybWF0KGAke3QuZ2V0TWV0aG9kKHMsbil9KCAke2guam9pbigiLCAiKX0gKWAsbixlKX19fXNlcmlhbGl6ZSh0KXtzdXBlci5zZXJpYWxpemUodCksdC5tZXRob2Q9dGhpcy5tZXRob2R9ZGVzZXJpYWxpemUodCl7c3VwZXIuZGVzZXJpYWxpemUodCksdGhpcy5tZXRob2Q9dC5tZXRob2R9fXguQUxMPSJhbGwiLHguQU5ZPSJhbnkiLHguRVFVQUxTPSJlcXVhbHMiLHguUkFESUFOUz0icmFkaWFucyIseC5ERUdSRUVTPSJkZWdyZWVzIix4LkVYUD0iZXhwIix4LkVYUDI9ImV4cDIiLHguTE9HPSJsb2ciLHguTE9HMj0ibG9nMiIseC5TUVJUPSJzcXJ0Iix4LklOVkVSU0VfU1FSVD0iaW52ZXJzZXNxcnQiLHguRkxPT1I9ImZsb29yIix4LkNFSUw9ImNlaWwiLHguTk9STUFMSVpFPSJub3JtYWxpemUiLHguRlJBQ1Q9ImZyYWN0Iix4LlNJTj0ic2luIix4LkNPUz0iY29zIix4LlRBTj0idGFuIix4LkFTSU49ImFzaW4iLHguQUNPUz0iYWNvcyIseC5BVEFOPSJhdGFuIix4LkFCUz0iYWJzIix4LlNJR049InNpZ24iLHguTEVOR1RIPSJsZW5ndGgiLHguTkVHQVRFPSJuZWdhdGUiLHguT05FX01JTlVTPSJvbmVNaW51cyIseC5ERkRYPSJkRmR4Iix4LkRGRFk9ImRGZHkiLHguUk9VTkQ9InJvdW5kIix4LlJFQ0lQUk9DQUw9InJlY2lwcm9jYWwiLHguVFJVTkM9InRydW5jIix4LkZXSURUSD0iZndpZHRoIix4LkJJVENBU1Q9ImJpdGNhc3QiLHguVFJBTlNQT1NFPSJ0cmFuc3Bvc2UiLHguQVRBTjI9ImF0YW4yIix4Lk1JTj0ibWluIix4Lk1BWD0ibWF4Iix4Lk1PRD0ibW9kIix4LlNURVA9InN0ZXAiLHguUkVGTEVDVD0icmVmbGVjdCIseC5ESVNUQU5DRT0iZGlzdGFuY2UiLHguRElGRkVSRU5DRT0iZGlmZmVyZW5jZSIseC5ET1Q9ImRvdCIseC5DUk9TUz0iY3Jvc3MiLHguUE9XPSJwb3ciLHguVFJBTlNGT1JNX0RJUkVDVElPTj0idHJhbnNmb3JtRGlyZWN0aW9uIix4Lk1JWD0ibWl4Iix4LkNMQU1QPSJjbGFtcCIseC5SRUZSQUNUPSJyZWZyYWN0Iix4LlNNT09USFNURVA9InNtb290aHN0ZXAiLHguRkFDRUZPUldBUkQ9ImZhY2Vmb3J3YXJkIjtjb25zdCBiYz1xKE1hdGguUEkpLEVjPUMoeCx4LkFMTCksQ2M9Qyh4LHguQU5ZKSxGYz1DKHgseC5FUVVBTFMpLFJjPUMoeCx4LlJBRElBTlMpLEJjPUMoeCx4LkRFR1JFRVMpLEljPUMoeCx4LkVYUCksdmM9Qyh4LHguRVhQMiksUGM9Qyh4LHguTE9HKSxMYz1DKHgseC5MT0cyKSxpaT1DKHgseC5TUVJUKSxPYz1DKHgseC5JTlZFUlNFX1NRUlQpLERjPUMoeCx4LkZMT09SKSxWYz1DKHgseC5DRUlMKSxPcj1DKHgseC5OT1JNQUxJWkUpLHJpPUMoeCx4LkZSQUNUKSxEcj1DKHgseC5TSU4pLFVjPUMoeCx4LkNPUyksa2M9Qyh4LHguVEFOKSxIYz1DKHgseC5BU0lOKSxxYz1DKHgseC5BQ09TKSwkYz1DKHgseC5BVEFOKSxvaT1DKHgseC5BQlMpLFZyPUMoeCx4LlNJR04pLEdjPUMoeCx4LkxFTkdUSCksV2M9Qyh4LHguTkVHQVRFKSxYYz1DKHgseC5PTkVfTUlOVVMpLFljPUMoeCx4LkRGRFgpLFpjPUMoeCx4LkRGRFkpLEpjPUMoeCx4LlJPVU5EKSxqYz1DKHgseC5SRUNJUFJPQ0FMKSxRYz1DKHgseC5UUlVOQyksS2M9Qyh4LHguRldJRFRIKTt4LkJJVENBU1Q7Y29uc3QgdGg9Qyh4LHguVFJBTlNQT1NFKSxlaD1DKHgseC5BVEFOMiksc2g9Qyh4LHguTUlOKSxhaT1DKHgseC5NQVgpLFVyPUMoeCx4Lk1PRCksa3I9Qyh4LHguU1RFUCksbmg9Qyh4LHguUkVGTEVDVCksaWg9Qyh4LHguRElTVEFOQ0UpLHJoPUMoeCx4LkRJRkZFUkVOQ0UpLGNpPUMoeCx4LkRPVCksb2g9Qyh4LHguQ1JPU1MpLEhyPUMoeCx4LlBPVyksYWg9Qyh4LHguUE9XLDIpLGNoPUMoeCx4LlBPVywzKSxoaD1DKHgseC5QT1csNCksdWg9Qyh4LHguVFJBTlNGT1JNX0RJUkVDVElPTiksbGg9cj0+R3MoVnIociksSHIob2kociksMS8zKSksZGg9cj0+Y2kocixyKSxyZT1DKHgseC5NSVgpLFdzPShyLHQ9MCxlPTEpPT52KG5ldyB4KHguQ0xBTVAsdihyKSx2KHQpLHYoZSkpKSxmaD1yPT5XcyhyKSxwaD1DKHgseC5SRUZSQUNUKSxoaT1DKHgseC5TTU9PVEhTVEVQKSxtaD1DKHgseC5GQUNFRk9SV0FSRCkseWg9dHQoKFtyXSk9Pntjb25zdCBzPTQzNzU4LjU0NTMsbj1jaShyLnh5LEQoMTIuOTg5OCw3OC4yMzMpKSxpPVVyKG4sYmMpO3JldHVybiByaShEcihpKS5tdWwocykpfSksZ2g9KHIsdCxlKT0+cmUodCxlLHIpLHhoPShyLHQsZSk9PmhpKHQsZSxyKTtiKCJhbGwiLEVjKSxiKCJhbnkiLENjKSxiKCJlcXVhbHMiLEZjKSxiKCJyYWRpYW5zIixSYyksYigiZGVncmVlcyIsQmMpLGIoImV4cCIsSWMpLGIoImV4cDIiLHZjKSxiKCJsb2ciLFBjKSxiKCJsb2cyIixMYyksYigic3FydCIsaWkpLGIoImludmVyc2VTcXJ0IixPYyksYigiZmxvb3IiLERjKSxiKCJjZWlsIixWYyksYigibm9ybWFsaXplIixPciksYigiZnJhY3QiLHJpKSxiKCJzaW4iLERyKSxiKCJjb3MiLFVjKSxiKCJ0YW4iLGtjKSxiKCJhc2luIixIYyksYigiYWNvcyIscWMpLGIoImF0YW4iLCRjKSxiKCJhYnMiLG9pKSxiKCJzaWduIixWciksYigibGVuZ3RoIixHYyksYigibGVuZ3RoU3EiLGRoKSxiKCJuZWdhdGUiLFdjKSxiKCJvbmVNaW51cyIsWGMpLGIoImRGZHgiLFljKSxiKCJkRmR5IixaYyksYigicm91bmQiLEpjKSxiKCJyZWNpcHJvY2FsIixqYyksYigidHJ1bmMiLFFjKSxiKCJmd2lkdGgiLEtjKSxiKCJhdGFuMiIsZWgpLGIoIm1pbiIsc2gpLGIoIm1heCIsYWkpLGIoIm1vZCIsVXIpLGIoInN0ZXAiLGtyKSxiKCJyZWZsZWN0IixuaCksYigiZGlzdGFuY2UiLGloKSxiKCJkb3QiLGNpKSxiKCJjcm9zcyIsb2gpLGIoInBvdyIsSHIpLGIoInBvdzIiLGFoKSxiKCJwb3czIixjaCksYigicG93NCIsaGgpLGIoInRyYW5zZm9ybURpcmVjdGlvbiIsdWgpLGIoIm1peCIsZ2gpLGIoImNsYW1wIixXcyksYigicmVmcmFjdCIscGgpLGIoInNtb290aHN0ZXAiLHhoKSxiKCJmYWNlRm9yd2FyZCIsbWgpLGIoImRpZmZlcmVuY2UiLHJoKSxiKCJzYXR1cmF0ZSIsZmgpLGIoImNicnQiLGxoKSxiKCJ0cmFuc3Bvc2UiLHRoKSxiKCJyYW5kIix5aCk7Y2xhc3MgVGggZXh0ZW5kcyBVe3N0YXRpYyBnZXQgdHlwZSgpe3JldHVybiJDb25kaXRpb25hbE5vZGUifWNvbnN0cnVjdG9yKHQsZSxzPW51bGwpe3N1cGVyKCksdGhpcy5jb25kTm9kZT10LHRoaXMuaWZOb2RlPWUsdGhpcy5lbHNlTm9kZT1zfWdldE5vZGVUeXBlKHQpe2NvbnN0IGU9dGhpcy5pZk5vZGUuZ2V0Tm9kZVR5cGUodCk7aWYodGhpcy5lbHNlTm9kZSE9PW51bGwpe2NvbnN0IHM9dGhpcy5lbHNlTm9kZS5nZXROb2RlVHlwZSh0KTtpZih0LmdldFR5cGVMZW5ndGgocyk+dC5nZXRUeXBlTGVuZ3RoKGUpKXJldHVybiBzfXJldHVybiBlfXNldHVwKHQpe2NvbnN0IGU9dGhpcy5jb25kTm9kZS5jYWNoZSgpLHM9dGhpcy5pZk5vZGUuY2FjaGUoKSxuPXRoaXMuZWxzZU5vZGU/dGhpcy5lbHNlTm9kZS5jYWNoZSgpOm51bGwsaT10LmNvbnRleHQubm9kZUJsb2NrO3QuZ2V0RGF0YUZyb21Ob2RlKHMpLnBhcmVudE5vZGVCbG9jaz1pLG4hPT1udWxsJiYodC5nZXREYXRhRnJvbU5vZGUobikucGFyZW50Tm9kZUJsb2NrPWkpO2NvbnN0IG89dC5nZXROb2RlUHJvcGVydGllcyh0aGlzKTtvLmNvbmROb2RlPWUsby5pZk5vZGU9cy5jb250ZXh0KHtub2RlQmxvY2s6c30pLG8uZWxzZU5vZGU9bj9uLmNvbnRleHQoe25vZGVCbG9jazpufSk6bnVsbH1nZW5lcmF0ZSh0LGUpe2NvbnN0IHM9dGhpcy5nZXROb2RlVHlwZSh0KSxuPXQuZ2V0RGF0YUZyb21Ob2RlKHRoaXMpO2lmKG4ubm9kZVByb3BlcnR5IT09dm9pZCAwKXJldHVybiBuLm5vZGVQcm9wZXJ0eTtjb25zdHtjb25kTm9kZTppLGlmTm9kZTpvLGVsc2VOb2RlOmF9PXQuZ2V0Tm9kZVByb3BlcnRpZXModGhpcyksYz1lIT09InZvaWQiLHU9Yz92ZShzKS5idWlsZCh0KToiIjtuLm5vZGVQcm9wZXJ0eT11O2NvbnN0IGg9aS5idWlsZCh0LCJib29sIik7dC5hZGRGbG93Q29kZShgCiR7dC50YWJ9aWYgKCAke2h9ICkgewoKYCkuYWRkRmxvd1RhYigpO2xldCBsPW8uYnVpbGQodCxzKTtpZihsJiYoYz9sPXUrIiA9ICIrbCsiOyI6bD0icmV0dXJuICIrbCsiOyIpLHQucmVtb3ZlRmxvd1RhYigpLmFkZEZsb3dDb2RlKHQudGFiKyIJIitsK2AKCmArdC50YWIrIn0iKSxhIT09bnVsbCl7dC5hZGRGbG93Q29kZShgIGVsc2UgewoKYCkuYWRkRmxvd1RhYigpO2xldCBkPWEuYnVpbGQodCxzKTtkJiYoYz9kPXUrIiA9ICIrZCsiOyI6ZD0icmV0dXJuICIrZCsiOyIpLHQucmVtb3ZlRmxvd1RhYigpLmFkZEZsb3dDb2RlKHQudGFiKyIJIitkK2AKCmArdC50YWIrYH0KCmApfWVsc2UgdC5hZGRGbG93Q29kZShgCgpgKTtyZXR1cm4gdC5mb3JtYXQodSxzLGUpfX1jb25zdCB1aT1DKFRoKTtiKCJzZWxlY3QiLHVpKSxiKCJjb25kIiwoLi4ucik9Pihjb25zb2xlLndhcm4oIlRTTC5Db25kaXRpb25hbE5vZGU6IGNvbmQoKSBoYXMgYmVlbiByZW5hbWVkIHRvIHNlbGVjdCgpLiIpLHVpKC4uLnIpKSk7Y2xhc3MgTmggZXh0ZW5kcyBVe3N0YXRpYyBnZXQgdHlwZSgpe3JldHVybiJDb250ZXh0Tm9kZSJ9Y29uc3RydWN0b3IodCxlPXt9KXtzdXBlcigpLHRoaXMuaXNDb250ZXh0Tm9kZT0hMCx0aGlzLm5vZGU9dCx0aGlzLnZhbHVlPWV9Z2V0U2NvcGUoKXtyZXR1cm4gdGhpcy5ub2RlLmdldFNjb3BlKCl9Z2V0Tm9kZVR5cGUodCl7cmV0dXJuIHRoaXMubm9kZS5nZXROb2RlVHlwZSh0KX1hbmFseXplKHQpe3RoaXMubm9kZS5idWlsZCh0KX1zZXR1cCh0KXtjb25zdCBlPXQuZ2V0Q29udGV4dCgpO3Quc2V0Q29udGV4dCh7Li4udC5jb250ZXh0LC4uLnRoaXMudmFsdWV9KTtjb25zdCBzPXRoaXMubm9kZS5idWlsZCh0KTtyZXR1cm4gdC5zZXRDb250ZXh0KGUpLHN9Z2VuZXJhdGUodCxlKXtjb25zdCBzPXQuZ2V0Q29udGV4dCgpO3Quc2V0Q29udGV4dCh7Li4udC5jb250ZXh0LC4uLnRoaXMudmFsdWV9KTtjb25zdCBuPXRoaXMubm9kZS5idWlsZCh0LGUpO3JldHVybiB0LnNldENvbnRleHQocyksbn19Y29uc3QgcXI9QyhOaCksd2g9KHIsdCk9PnFyKHIse2xhYmVsOnR9KTtiKCJjb250ZXh0IixxciksYigibGFiZWwiLHdoKTtjbGFzcyBBaCBleHRlbmRzIFV7c3RhdGljIGdldCB0eXBlKCl7cmV0dXJuIlZhck5vZGUifWNvbnN0cnVjdG9yKHQsZT1udWxsKXtzdXBlcigpLHRoaXMubm9kZT10LHRoaXMubmFtZT1lLHRoaXMuZ2xvYmFsPSEwLHRoaXMuaXNWYXJOb2RlPSEwfWdldEhhc2godCl7cmV0dXJuIHRoaXMubmFtZXx8c3VwZXIuZ2V0SGFzaCh0KX1nZXROb2RlVHlwZSh0KXtyZXR1cm4gdGhpcy5ub2RlLmdldE5vZGVUeXBlKHQpfWdlbmVyYXRlKHQpe2NvbnN0e25vZGU6ZSxuYW1lOnN9PXRoaXMsbj10LmdldFZhckZyb21Ob2RlKHRoaXMscyx0LmdldFZlY3RvclR5cGUodGhpcy5nZXROb2RlVHlwZSh0KSkpLGk9dC5nZXRQcm9wZXJ0eU5hbWUobiksbz1lLmJ1aWxkKHQsbi50eXBlKTtyZXR1cm4gdC5hZGRMaW5lRmxvd0NvZGUoYCR7aX0gPSAke299YCx0aGlzKSxpfX1jb25zdCAkcj1DKEFoKTtiKCJ0ZW1wIiwkciksYigidG9WYXIiLCguLi5yKT0+JHIoLi4ucikuYXBwZW5kKCkpO2NsYXNzIE1oIGV4dGVuZHMgVXtzdGF0aWMgZ2V0IHR5cGUoKXtyZXR1cm4iVmFyeWluZ05vZGUifWNvbnN0cnVjdG9yKHQsZT1udWxsKXtzdXBlcigpLHRoaXMubm9kZT10LHRoaXMubmFtZT1lLHRoaXMuaXNWYXJ5aW5nTm9kZT0hMH1pc0dsb2JhbCgpe3JldHVybiEwfWdldEhhc2godCl7cmV0dXJuIHRoaXMubmFtZXx8c3VwZXIuZ2V0SGFzaCh0KX1nZXROb2RlVHlwZSh0KXtyZXR1cm4gdGhpcy5ub2RlLmdldE5vZGVUeXBlKHQpfXNldHVwVmFyeWluZyh0KXtjb25zdCBlPXQuZ2V0Tm9kZVByb3BlcnRpZXModGhpcyk7bGV0IHM9ZS52YXJ5aW5nO2lmKHM9PT12b2lkIDApe2NvbnN0IG49dGhpcy5uYW1lLGk9dGhpcy5nZXROb2RlVHlwZSh0KTtlLnZhcnlpbmc9cz10LmdldFZhcnlpbmdGcm9tTm9kZSh0aGlzLG4saSksZS5ub2RlPXRoaXMubm9kZX1yZXR1cm4gcy5uZWVkc0ludGVycG9sYXRpb258fChzLm5lZWRzSW50ZXJwb2xhdGlvbj10LnNoYWRlclN0YWdlPT09ImZyYWdtZW50Iiksc31zZXR1cCh0KXt0aGlzLnNldHVwVmFyeWluZyh0KX1hbmFseXplKHQpe3JldHVybiB0aGlzLnNldHVwVmFyeWluZyh0KSx0aGlzLm5vZGUuYW5hbHl6ZSh0KX1nZW5lcmF0ZSh0KXtjb25zdCBlPXQuZ2V0Tm9kZVByb3BlcnRpZXModGhpcykscz10aGlzLnNldHVwVmFyeWluZyh0KTtpZihlLnByb3BlcnR5TmFtZT09PXZvaWQgMCl7Y29uc3Qgbj10aGlzLmdldE5vZGVUeXBlKHQpLGk9dC5nZXRQcm9wZXJ0eU5hbWUocyx3ci5WRVJURVgpO3QuZmxvd05vZGVGcm9tU2hhZGVyU3RhZ2Uod3IuVkVSVEVYLHRoaXMubm9kZSxuLGkpLGUucHJvcGVydHlOYW1lPWl9cmV0dXJuIHQuZ2V0UHJvcGVydHlOYW1lKHMpfX1jb25zdCBQZT1DKE1oKTtiKCJ2YXJ5aW5nIixQZSk7Y29uc3QgcnM9IldvcmtpbmdDb2xvclNwYWNlIixsaT0iT3V0cHV0Q29sb3JTcGFjZSI7ZnVuY3Rpb24gR3Iocil7bGV0IHQ9bnVsbDtyZXR1cm4gcj09PUVzP3Q9IkxpbmVhciI6cj09PSR0JiYodD0ic1JHQiIpLHR9ZnVuY3Rpb24gU2gocix0KXtyZXR1cm4gR3IocikrIlRvIitHcih0KX1jbGFzcyBYcyBleHRlbmRzIGR0e3N0YXRpYyBnZXQgdHlwZSgpe3JldHVybiJDb2xvclNwYWNlTm9kZSJ9Y29uc3RydWN0b3IodCxlLHMpe3N1cGVyKCJ2ZWM0IiksdGhpcy5jb2xvck5vZGU9dCx0aGlzLnNvdXJjZT1lLHRoaXMudGFyZ2V0PXN9Z2V0Q29sb3JTcGFjZSh0LGUpe3JldHVybiBlPT09cnM/bXQud29ya2luZ0NvbG9yU3BhY2U6ZT09PWxpP3QuY29udGV4dC5vdXRwdXRDb2xvclNwYWNlfHx0LnJlbmRlcmVyLm91dHB1dENvbG9yU3BhY2U6ZX1zZXR1cCh0KXtjb25zdHtyZW5kZXJlcjplfT10LHtjb2xvck5vZGU6c309dGhpcyxuPXRoaXMuZ2V0Q29sb3JTcGFjZSh0LHRoaXMuc291cmNlKSxpPXRoaXMuZ2V0Q29sb3JTcGFjZSh0LHRoaXMudGFyZ2V0KTtpZihuPT09aSlyZXR1cm4gcztjb25zdCBvPVNoKG4saSk7bGV0IGE9bnVsbDtjb25zdCBjPWUubm9kZXMubGlicmFyeS5nZXRDb2xvclNwYWNlRnVuY3Rpb24obyk7cmV0dXJuIGMhPT1udWxsP2E9QmUoYyhzLnJnYikscy5hKTooY29uc29sZS5lcnJvcigiQ29sb3JTcGFjZU5vZGU6IFVuc3VwcG9ydGVkIENvbG9yIFNwYWNlIGNvbmZpZ3VyYXRpb24uIixvKSxhPXMpLGF9fWNvbnN0IF9oPXI9PnYobmV3IFhzKHYocikscnMsbGkpKSx6aD1yPT52KG5ldyBYcyh2KHIpLGxpLHJzKSksYmg9KHIsdCk9PnYobmV3IFhzKHYocikscnMsdCkpLFdyPShyLHQpPT52KG5ldyBYcyh2KHIpLHQscnMpKTtiKCJ0b091dHB1dENvbG9yU3BhY2UiLF9oKSxiKCJ0b1dvcmtpbmdDb2xvclNwYWNlIix6aCksYigid29ya2luZ1RvQ29sb3JTcGFjZSIsYmgpLGIoImNvbG9yU3BhY2VUb1dvcmtpbmciLFdyKTtsZXQgRWg9Y2xhc3MgZXh0ZW5kcyBpc3tzdGF0aWMgZ2V0IHR5cGUoKXtyZXR1cm4iUmVmZXJlbmNlRWxlbWVudE5vZGUifWNvbnN0cnVjdG9yKHQsZSl7c3VwZXIodCxlKSx0aGlzLnJlZmVyZW5jZU5vZGU9dCx0aGlzLmlzUmVmZXJlbmNlRWxlbWVudE5vZGU9ITB9Z2V0Tm9kZVR5cGUoKXtyZXR1cm4gdGhpcy5yZWZlcmVuY2VOb2RlLnVuaWZvcm1UeXBlfWdlbmVyYXRlKHQpe2NvbnN0IGU9c3VwZXIuZ2VuZXJhdGUodCkscz10aGlzLnJlZmVyZW5jZU5vZGUuZ2V0Tm9kZVR5cGUoKSxuPXRoaXMuZ2V0Tm9kZVR5cGUoKTtyZXR1cm4gdC5mb3JtYXQoZSxzLG4pfX07Y2xhc3MgQ2ggZXh0ZW5kcyBVe3N0YXRpYyBnZXQgdHlwZSgpe3JldHVybiJSZWZlcmVuY2VCYXNlTm9kZSJ9Y29uc3RydWN0b3IodCxlLHM9bnVsbCxuPW51bGwpe3N1cGVyKCksdGhpcy5wcm9wZXJ0eT10LHRoaXMudW5pZm9ybVR5cGU9ZSx0aGlzLm9iamVjdD1zLHRoaXMuY291bnQ9bix0aGlzLnByb3BlcnRpZXM9dC5zcGxpdCgiLiIpLHRoaXMucmVmZXJlbmNlPXMsdGhpcy5ub2RlPW51bGwsdGhpcy5ncm91cD1udWxsLHRoaXMudXBkYXRlVHlwZT1RLk9CSkVDVH1zZXRHcm91cCh0KXtyZXR1cm4gdGhpcy5ncm91cD10LHRoaXN9ZWxlbWVudCh0KXtyZXR1cm4gdihuZXcgRWgodGhpcyx2KHQpKSl9c2V0Tm9kZVR5cGUodCl7Y29uc3QgZT14dChudWxsLHQpLmdldFNlbGYoKTt0aGlzLmdyb3VwIT09bnVsbCYmZS5zZXRHcm91cCh0aGlzLmdyb3VwKSx0aGlzLm5vZGU9ZX1nZXROb2RlVHlwZSh0KXtyZXR1cm4gdGhpcy5ub2RlPT09bnVsbCYmKHRoaXMudXBkYXRlUmVmZXJlbmNlKHQpLHRoaXMudXBkYXRlVmFsdWUoKSksdGhpcy5ub2RlLmdldE5vZGVUeXBlKHQpfWdldFZhbHVlRnJvbVJlZmVyZW5jZSh0PXRoaXMucmVmZXJlbmNlKXtjb25zdHtwcm9wZXJ0aWVzOmV9PXRoaXM7bGV0IHM9dFtlWzBdXTtmb3IobGV0IG49MTtuPGUubGVuZ3RoO24rKylzPXNbZVtuXV07cmV0dXJuIHN9dXBkYXRlUmVmZXJlbmNlKHQpe3JldHVybiB0aGlzLnJlZmVyZW5jZT10aGlzLm9iamVjdCE9PW51bGw/dGhpcy5vYmplY3Q6dC5vYmplY3QsdGhpcy5yZWZlcmVuY2V9c2V0dXAoKXtyZXR1cm4gdGhpcy51cGRhdGVWYWx1ZSgpLHRoaXMubm9kZX11cGRhdGUoKXt0aGlzLnVwZGF0ZVZhbHVlKCl9dXBkYXRlVmFsdWUoKXt0aGlzLm5vZGU9PT1udWxsJiZ0aGlzLnNldE5vZGVUeXBlKHRoaXMudW5pZm9ybVR5cGUpO2NvbnN0IHQ9dGhpcy5nZXRWYWx1ZUZyb21SZWZlcmVuY2UoKTtBcnJheS5pc0FycmF5KHQpP3RoaXMubm9kZS5hcnJheT10OnRoaXMubm9kZS52YWx1ZT10fX1jbGFzcyBGaCBleHRlbmRzIENoe3N0YXRpYyBnZXQgdHlwZSgpe3JldHVybiJSZW5kZXJlclJlZmVyZW5jZU5vZGUifWNvbnN0cnVjdG9yKHQsZSxzPW51bGwpe3N1cGVyKHQsZSxzKSx0aGlzLnJlbmRlcmVyPXMsdGhpcy5zZXRHcm91cChkZSl9dXBkYXRlUmVmZXJlbmNlKHQpe3JldHVybiB0aGlzLnJlZmVyZW5jZT10aGlzLnJlbmRlcmVyIT09bnVsbD90aGlzLnJlbmRlcmVyOnQucmVuZGVyZXIsdGhpcy5yZWZlcmVuY2V9fWNvbnN0IFJoPShyLHQsZSk9PnYobmV3IEZoKHIsdCxlKSk7Y2xhc3MgQmggZXh0ZW5kcyBkdHtzdGF0aWMgZ2V0IHR5cGUoKXtyZXR1cm4iVG9uZU1hcHBpbmdOb2RlIn1jb25zdHJ1Y3Rvcih0LGU9dmgscz1udWxsKXtzdXBlcigidmVjMyIpLHRoaXMudG9uZU1hcHBpbmc9dCx0aGlzLmV4cG9zdXJlTm9kZT1lLHRoaXMuY29sb3JOb2RlPXN9Z2V0Q2FjaGVLZXkoKXtyZXR1cm4gTWEoc3VwZXIuZ2V0Q2FjaGVLZXkoKSx0aGlzLnRvbmVNYXBwaW5nKX1zZXR1cCh0KXtjb25zdCBlPXRoaXMuY29sb3JOb2RlfHx0LmNvbnRleHQuY29sb3Iscz10aGlzLnRvbmVNYXBwaW5nO2lmKHM9PT1NbilyZXR1cm4gZTtsZXQgbj1udWxsO2NvbnN0IGk9dC5yZW5kZXJlci5ub2Rlcy5saWJyYXJ5LmdldFRvbmVNYXBwaW5nRnVuY3Rpb24ocyk7cmV0dXJuIGkhPT1udWxsP249QmUoaShlLnJnYix0aGlzLmV4cG9zdXJlTm9kZSksZS5hKTooY29uc29sZS5lcnJvcigiVG9uZU1hcHBpbmdOb2RlOiBVbnN1cHBvcnRlZCBUb25lIE1hcHBpbmcgY29uZmlndXJhdGlvbi4iLHMpLG49ZSksbn19Y29uc3QgSWg9KHIsdCxlKT0+dihuZXcgQmgocix2KHQpLHYoZSkpKSx2aD1SaCgidG9uZU1hcHBpbmdFeHBvc3VyZSIsImZsb2F0Iik7YigidG9uZU1hcHBpbmciLChyLHQsZSk9PkloKHQsZSxyKSk7Y2xhc3MgUGggZXh0ZW5kcyBqbntzdGF0aWMgZ2V0IHR5cGUoKXtyZXR1cm4iQnVmZmVyQXR0cmlidXRlTm9kZSJ9Y29uc3RydWN0b3IodCxlPW51bGwscz0wLG49MCl7c3VwZXIodCxlKSx0aGlzLmlzQnVmZmVyTm9kZT0hMCx0aGlzLmJ1ZmZlclR5cGU9ZSx0aGlzLmJ1ZmZlclN0cmlkZT1zLHRoaXMuYnVmZmVyT2Zmc2V0PW4sdGhpcy51c2FnZT1Dcyx0aGlzLmluc3RhbmNlZD0hMSx0aGlzLmF0dHJpYnV0ZT1udWxsLHRoaXMuZ2xvYmFsPSEwLHQmJnQuaXNCdWZmZXJBdHRyaWJ1dGU9PT0hMCYmKHRoaXMuYXR0cmlidXRlPXQsdGhpcy51c2FnZT10LnVzYWdlLHRoaXMuaW5zdGFuY2VkPXQuaXNJbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGUpfWdldEhhc2godCl7aWYodGhpcy5idWZmZXJTdHJpZGU9PT0wJiZ0aGlzLmJ1ZmZlck9mZnNldD09PTApe2xldCBlPXQuZ2xvYmFsQ2FjaGUuZ2V0RGF0YSh0aGlzLnZhbHVlKTtyZXR1cm4gZT09PXZvaWQgMCYmKGU9e25vZGU6dGhpc30sdC5nbG9iYWxDYWNoZS5zZXREYXRhKHRoaXMudmFsdWUsZSkpLGUubm9kZS51dWlkfXJldHVybiB0aGlzLnV1aWR9Z2V0Tm9kZVR5cGUodCl7cmV0dXJuIHRoaXMuYnVmZmVyVHlwZT09PW51bGwmJih0aGlzLmJ1ZmZlclR5cGU9dC5nZXRUeXBlRnJvbUF0dHJpYnV0ZSh0aGlzLmF0dHJpYnV0ZSkpLHRoaXMuYnVmZmVyVHlwZX1zZXR1cCh0KXtpZih0aGlzLmF0dHJpYnV0ZSE9PW51bGwpcmV0dXJuO2NvbnN0IGU9dGhpcy5nZXROb2RlVHlwZSh0KSxzPXRoaXMudmFsdWUsbj10LmdldFR5cGVMZW5ndGgoZSksaT10aGlzLmJ1ZmZlclN0cmlkZXx8bixvPXRoaXMuYnVmZmVyT2Zmc2V0LGE9cy5pc0ludGVybGVhdmVkQnVmZmVyPT09ITA/czpuZXcgd2EocyxpKSxjPW5ldyBZbihhLG4sbyk7YS5zZXRVc2FnZSh0aGlzLnVzYWdlKSx0aGlzLmF0dHJpYnV0ZT1jLHRoaXMuYXR0cmlidXRlLmlzSW5zdGFuY2VkQnVmZmVyQXR0cmlidXRlPXRoaXMuaW5zdGFuY2VkfWdlbmVyYXRlKHQpe2NvbnN0IGU9dGhpcy5nZXROb2RlVHlwZSh0KSxzPXQuZ2V0QnVmZmVyQXR0cmlidXRlRnJvbU5vZGUodGhpcyxlKSxuPXQuZ2V0UHJvcGVydHlOYW1lKHMpO2xldCBpPW51bGw7cmV0dXJuIHQuc2hhZGVyU3RhZ2U9PT0idmVydGV4Inx8dC5zaGFkZXJTdGFnZT09PSJjb21wdXRlIj8odGhpcy5uYW1lPW4saT1uKTppPVBlKHRoaXMpLmJ1aWxkKHQsZSksaX1nZXRJbnB1dFR5cGUoKXtyZXR1cm4iYnVmZmVyQXR0cmlidXRlIn1zZXRVc2FnZSh0KXtyZXR1cm4gdGhpcy51c2FnZT10LHRoaXMuYXR0cmlidXRlJiZ0aGlzLmF0dHJpYnV0ZS5pc0J1ZmZlckF0dHJpYnV0ZT09PSEwJiYodGhpcy5hdHRyaWJ1dGUudXNhZ2U9dCksdGhpc31zZXRJbnN0YW5jZWQodCl7cmV0dXJuIHRoaXMuaW5zdGFuY2VkPXQsdGhpc319Y29uc3QgTGg9KHIsdCxlLHMpPT52KG5ldyBQaChyLHQsZSxzKSk7YigidG9BdHRyaWJ1dGUiLHI9PkxoKHIudmFsdWUpKTtjbGFzcyBPaCBleHRlbmRzIFV7c3RhdGljIGdldCB0eXBlKCl7cmV0dXJuIkNvbXB1dGVOb2RlIn1jb25zdHJ1Y3Rvcih0LGUscz1bNjRdKXtzdXBlcigidm9pZCIpLHRoaXMuaXNDb21wdXRlTm9kZT0hMCx0aGlzLmNvbXB1dGVOb2RlPXQsdGhpcy5jb3VudD1lLHRoaXMud29ya2dyb3VwU2l6ZT1zLHRoaXMuZGlzcGF0Y2hDb3VudD0wLHRoaXMudmVyc2lvbj0xLHRoaXMudXBkYXRlQmVmb3JlVHlwZT1RLk9CSkVDVCx0aGlzLnVwZGF0ZURpc3BhdGNoQ291bnQoKX1kaXNwb3NlKCl7dGhpcy5kaXNwYXRjaEV2ZW50KHt0eXBlOiJkaXNwb3NlIn0pfXNldCBuZWVkc1VwZGF0ZSh0KXt0PT09ITAmJnRoaXMudmVyc2lvbisrfXVwZGF0ZURpc3BhdGNoQ291bnQoKXtjb25zdHtjb3VudDp0LHdvcmtncm91cFNpemU6ZX09dGhpcztsZXQgcz1lWzBdO2ZvcihsZXQgbj0xO248ZS5sZW5ndGg7bisrKXMqPWVbbl07dGhpcy5kaXNwYXRjaENvdW50PU1hdGguY2VpbCh0L3MpfW9uSW5pdCgpe311cGRhdGVCZWZvcmUoe3JlbmRlcmVyOnR9KXt0LmNvbXB1dGUodGhpcyl9Z2VuZXJhdGUodCl7Y29uc3R7c2hhZGVyU3RhZ2U6ZX09dDtpZihlPT09ImNvbXB1dGUiKXtjb25zdCBzPXRoaXMuY29tcHV0ZU5vZGUuYnVpbGQodCwidm9pZCIpO3MhPT0iIiYmdC5hZGRMaW5lRmxvd0NvZGUocyx0aGlzKX19fWIoImNvbXB1dGUiLChyLHQsZSk9PnYobmV3IE9oKHYociksdCxlKSkpO2NsYXNzIERoIGV4dGVuZHMgVXtzdGF0aWMgZ2V0IHR5cGUoKXtyZXR1cm4iQ2FjaGVOb2RlIn1jb25zdHJ1Y3Rvcih0LGU9ITApe3N1cGVyKCksdGhpcy5ub2RlPXQsdGhpcy5wYXJlbnQ9ZSx0aGlzLmlzQ2FjaGVOb2RlPSEwfWdldE5vZGVUeXBlKHQpe3JldHVybiB0aGlzLm5vZGUuZ2V0Tm9kZVR5cGUodCl9YnVpbGQodCwuLi5lKXtjb25zdCBzPXQuZ2V0Q2FjaGUoKSxuPXQuZ2V0Q2FjaGVGcm9tTm9kZSh0aGlzLHRoaXMucGFyZW50KTt0LnNldENhY2hlKG4pO2NvbnN0IGk9dGhpcy5ub2RlLmJ1aWxkKHQsLi4uZSk7cmV0dXJuIHQuc2V0Q2FjaGUocyksaX19YigiY2FjaGUiLChyLC4uLnQpPT52KG5ldyBEaCh2KHIpLC4uLnQpKSk7Y2xhc3MgVmggZXh0ZW5kcyBVe3N0YXRpYyBnZXQgdHlwZSgpe3JldHVybiJCeXBhc3NOb2RlIn1jb25zdHJ1Y3Rvcih0LGUpe3N1cGVyKCksdGhpcy5pc0J5cGFzc05vZGU9ITAsdGhpcy5vdXRwdXROb2RlPXQsdGhpcy5jYWxsTm9kZT1lfWdldE5vZGVUeXBlKHQpe3JldHVybiB0aGlzLm91dHB1dE5vZGUuZ2V0Tm9kZVR5cGUodCl9Z2VuZXJhdGUodCl7Y29uc3QgZT10aGlzLmNhbGxOb2RlLmJ1aWxkKHQsInZvaWQiKTtyZXR1cm4gZSE9PSIiJiZ0LmFkZExpbmVGbG93Q29kZShlLHRoaXMpLHRoaXMub3V0cHV0Tm9kZS5idWlsZCh0KX19YigiYnlwYXNzIixDKFZoKSk7Y2xhc3MgWHIgZXh0ZW5kcyBVe3N0YXRpYyBnZXQgdHlwZSgpe3JldHVybiJSZW1hcE5vZGUifWNvbnN0cnVjdG9yKHQsZSxzLG49cSgwKSxpPXEoMSkpe3N1cGVyKCksdGhpcy5ub2RlPXQsdGhpcy5pbkxvd05vZGU9ZSx0aGlzLmluSGlnaE5vZGU9cyx0aGlzLm91dExvd05vZGU9bix0aGlzLm91dEhpZ2hOb2RlPWksdGhpcy5kb0NsYW1wPSEwfXNldHVwKCl7Y29uc3R7bm9kZTp0LGluTG93Tm9kZTplLGluSGlnaE5vZGU6cyxvdXRMb3dOb2RlOm4sb3V0SGlnaE5vZGU6aSxkb0NsYW1wOm99PXRoaXM7bGV0IGE9dC5zdWIoZSkuZGl2KHMuc3ViKGUpKTtyZXR1cm4gbz09PSEwJiYoYT1hLmNsYW1wKCkpLGEubXVsKGkuc3ViKG4pKS5hZGQobil9fWNvbnN0IFVoPUMoWHIsbnVsbCxudWxsLHtkb0NsYW1wOiExfSksa2g9QyhYcik7YigicmVtYXAiLFVoKSxiKCJyZW1hcENsYW1wIixraCk7Y2xhc3MgSGggZXh0ZW5kcyBVe3N0YXRpYyBnZXQgdHlwZSgpe3JldHVybiJFeHByZXNzaW9uTm9kZSJ9Y29uc3RydWN0b3IodD0iIixlPSJ2b2lkIil7c3VwZXIoZSksdGhpcy5zbmlwcGV0PXR9Z2VuZXJhdGUodCxlKXtjb25zdCBzPXRoaXMuZ2V0Tm9kZVR5cGUodCksbj10aGlzLnNuaXBwZXQ7aWYocz09PSJ2b2lkIil0LmFkZExpbmVGbG93Q29kZShuLHRoaXMpO2Vsc2UgcmV0dXJuIHQuZm9ybWF0KGAoICR7bn0gKWAscyxlKX19Y29uc3QgWXM9QyhIaCk7YigiZGlzY2FyZCIscj0+KHI/dWkocixZcygiZGlzY2FyZCIpKTpZcygiZGlzY2FyZCIpKS5hcHBlbmQoKSk7Y2xhc3MgcWggZXh0ZW5kcyBkdHtzdGF0aWMgZ2V0IHR5cGUoKXtyZXR1cm4iUmVuZGVyT3V0cHV0Tm9kZSJ9Y29uc3RydWN0b3IodCxlLHMpe3N1cGVyKCJ2ZWM0IiksdGhpcy5jb2xvck5vZGU9dCx0aGlzLnRvbmVNYXBwaW5nPWUsdGhpcy5vdXRwdXRDb2xvclNwYWNlPXMsdGhpcy5pc1JlbmRlck91dHB1dD0hMH1zZXR1cCh7Y29udGV4dDp0fSl7bGV0IGU9dGhpcy5jb2xvck5vZGV8fHQuY29sb3I7Y29uc3Qgcz0odGhpcy50b25lTWFwcGluZyE9PW51bGw/dGhpcy50b25lTWFwcGluZzp0LnRvbmVNYXBwaW5nKXx8TW4sbj0odGhpcy5vdXRwdXRDb2xvclNwYWNlIT09bnVsbD90aGlzLm91dHB1dENvbG9yU3BhY2U6dC5vdXRwdXRDb2xvclNwYWNlKXx8YnM7cmV0dXJuIHMhPT1NbiYmKGU9ZS50b25lTWFwcGluZyhzKSksbiE9PWJzJiZuIT09bXQud29ya2luZ0NvbG9yU3BhY2UmJihlPWUud29ya2luZ1RvQ29sb3JTcGFjZShuKSksZX19YigicmVuZGVyT3V0cHV0Iiwocix0PW51bGwsZT1udWxsKT0+dihuZXcgcWgodihyKSx0LGUpKSk7Y2xhc3MgJGggZXh0ZW5kcyBVe3N0YXRpYyBnZXQgdHlwZSgpe3JldHVybiJBdHRyaWJ1dGVOb2RlIn1jb25zdHJ1Y3Rvcih0LGU9bnVsbCl7c3VwZXIoZSksdGhpcy5nbG9iYWw9ITAsdGhpcy5fYXR0cmlidXRlTmFtZT10fWdldEhhc2godCl7cmV0dXJuIHRoaXMuZ2V0QXR0cmlidXRlTmFtZSh0KX1nZXROb2RlVHlwZSh0KXtsZXQgZT10aGlzLm5vZGVUeXBlO2lmKGU9PT1udWxsKXtjb25zdCBzPXRoaXMuZ2V0QXR0cmlidXRlTmFtZSh0KTtpZih0Lmhhc0dlb21ldHJ5QXR0cmlidXRlKHMpKXtjb25zdCBuPXQuZ2VvbWV0cnkuZ2V0QXR0cmlidXRlKHMpO2U9dC5nZXRUeXBlRnJvbUF0dHJpYnV0ZShuKX1lbHNlIGU9ImZsb2F0In1yZXR1cm4gZX1zZXRBdHRyaWJ1dGVOYW1lKHQpe3JldHVybiB0aGlzLl9hdHRyaWJ1dGVOYW1lPXQsdGhpc31nZXRBdHRyaWJ1dGVOYW1lKCl7cmV0dXJuIHRoaXMuX2F0dHJpYnV0ZU5hbWV9Z2VuZXJhdGUodCl7Y29uc3QgZT10aGlzLmdldEF0dHJpYnV0ZU5hbWUodCkscz10aGlzLmdldE5vZGVUeXBlKHQpO2lmKHQuaGFzR2VvbWV0cnlBdHRyaWJ1dGUoZSk9PT0hMCl7Y29uc3QgaT10Lmdlb21ldHJ5LmdldEF0dHJpYnV0ZShlKSxvPXQuZ2V0VHlwZUZyb21BdHRyaWJ1dGUoaSksYT10LmdldEF0dHJpYnV0ZShlLG8pO3JldHVybiB0LnNoYWRlclN0YWdlPT09InZlcnRleCI/dC5mb3JtYXQoYS5uYW1lLG8scyk6UGUodGhpcykuYnVpbGQodCxzKX1lbHNlIHJldHVybiBjb25zb2xlLndhcm4oYEF0dHJpYnV0ZU5vZGU6IFZlcnRleCBhdHRyaWJ1dGUgIiR7ZX0iIG5vdCBmb3VuZCBvbiBnZW9tZXRyeS5gKSx0LmdlbmVyYXRlQ29uc3Qocyl9c2VyaWFsaXplKHQpe3N1cGVyLnNlcmlhbGl6ZSh0KSx0Lmdsb2JhbD10aGlzLmdsb2JhbCx0Ll9hdHRyaWJ1dGVOYW1lPXRoaXMuX2F0dHJpYnV0ZU5hbWV9ZGVzZXJpYWxpemUodCl7c3VwZXIuZGVzZXJpYWxpemUodCksdGhpcy5nbG9iYWw9dC5nbG9iYWwsdGhpcy5fYXR0cmlidXRlTmFtZT10Ll9hdHRyaWJ1dGVOYW1lfX1jb25zdCBvcz0ocix0KT0+dihuZXcgJGgocix0KSksWnM9cj0+b3MoInV2Iisocj4wP3I6IiIpLCJ2ZWMyIik7Y2xhc3MgR2ggZXh0ZW5kcyBVe3N0YXRpYyBnZXQgdHlwZSgpe3JldHVybiJUZXh0dXJlU2l6ZU5vZGUifWNvbnN0cnVjdG9yKHQsZT1udWxsKXtzdXBlcigidXZlYzIiKSx0aGlzLmlzVGV4dHVyZVNpemVOb2RlPSEwLHRoaXMudGV4dHVyZU5vZGU9dCx0aGlzLmxldmVsTm9kZT1lfWdlbmVyYXRlKHQsZSl7Y29uc3Qgcz10aGlzLnRleHR1cmVOb2RlLmJ1aWxkKHQsInByb3BlcnR5Iiksbj10aGlzLmxldmVsTm9kZT09PW51bGw/IjAiOnRoaXMubGV2ZWxOb2RlLmJ1aWxkKHQsImludCIpO3JldHVybiB0LmZvcm1hdChgJHt0LmdldE1ldGhvZCgidGV4dHVyZURpbWVuc2lvbnMiKX0oICR7c30sICR7bn0gKWAsdGhpcy5nZXROb2RlVHlwZSh0KSxlKX19Y29uc3QgWXI9QyhHaCk7Y2xhc3MgV2ggZXh0ZW5kcyBJZXtzdGF0aWMgZ2V0IHR5cGUoKXtyZXR1cm4iTWF4TWlwTGV2ZWxOb2RlIn1jb25zdHJ1Y3Rvcih0KXtzdXBlcigwKSx0aGlzLl90ZXh0dXJlTm9kZT10LHRoaXMudXBkYXRlVHlwZT1RLkZSQU1FfWdldCB0ZXh0dXJlTm9kZSgpe3JldHVybiB0aGlzLl90ZXh0dXJlTm9kZX1nZXQgdGV4dHVyZSgpe3JldHVybiB0aGlzLl90ZXh0dXJlTm9kZS52YWx1ZX11cGRhdGUoKXtjb25zdCB0PXRoaXMudGV4dHVyZSxlPXQuaW1hZ2VzLHM9ZSYmZS5sZW5ndGg+MD9lWzBdJiZlWzBdLmltYWdlfHxlWzBdOnQuaW1hZ2U7aWYocyYmcy53aWR0aCE9PXZvaWQgMCl7Y29uc3R7d2lkdGg6bixoZWlnaHQ6aX09czt0aGlzLnZhbHVlPU1hdGgubG9nMihNYXRoLm1heChuLGkpKX19fWNvbnN0IFhoPUMoV2gpO2NsYXNzIEpzIGV4dGVuZHMgSWV7c3RhdGljIGdldCB0eXBlKCl7cmV0dXJuIlRleHR1cmVOb2RlIn1jb25zdHJ1Y3Rvcih0LGU9bnVsbCxzPW51bGwsbj1udWxsKXtzdXBlcih0KSx0aGlzLmlzVGV4dHVyZU5vZGU9ITAsdGhpcy51dk5vZGU9ZSx0aGlzLmxldmVsTm9kZT1zLHRoaXMuYmlhc05vZGU9bix0aGlzLmNvbXBhcmVOb2RlPW51bGwsdGhpcy5kZXB0aE5vZGU9bnVsbCx0aGlzLmdyYWROb2RlPW51bGwsdGhpcy5zYW1wbGVyPSEwLHRoaXMudXBkYXRlTWF0cml4PSExLHRoaXMudXBkYXRlVHlwZT1RLk5PTkUsdGhpcy5yZWZlcmVuY2VOb2RlPW51bGwsdGhpcy5fdmFsdWU9dCx0aGlzLl9tYXRyaXhVbmlmb3JtPW51bGwsdGhpcy5zZXRVcGRhdGVNYXRyaXgoZT09PW51bGwpfXNldCB2YWx1ZSh0KXt0aGlzLnJlZmVyZW5jZU5vZGU/dGhpcy5yZWZlcmVuY2VOb2RlLnZhbHVlPXQ6dGhpcy5fdmFsdWU9dH1nZXQgdmFsdWUoKXtyZXR1cm4gdGhpcy5yZWZlcmVuY2VOb2RlP3RoaXMucmVmZXJlbmNlTm9kZS52YWx1ZTp0aGlzLl92YWx1ZX1nZXRVbmlmb3JtSGFzaCgpe3JldHVybiB0aGlzLnZhbHVlLnV1aWR9Z2V0Tm9kZVR5cGUoKXtyZXR1cm4gdGhpcy52YWx1ZS5pc0RlcHRoVGV4dHVyZT09PSEwPyJmbG9hdCI6dGhpcy52YWx1ZS50eXBlPT09V2k/InV2ZWM0Ijp0aGlzLnZhbHVlLnR5cGU9PT1Cbz8iaXZlYzQiOiJ2ZWM0In1nZXRJbnB1dFR5cGUoKXtyZXR1cm4idGV4dHVyZSJ9Z2V0RGVmYXVsdFVWKCl7cmV0dXJuIFpzKHRoaXMudmFsdWUuY2hhbm5lbCl9dXBkYXRlUmVmZXJlbmNlKCl7cmV0dXJuIHRoaXMudmFsdWV9Z2V0VHJhbnNmb3JtZWRVVih0KXtyZXR1cm4gdGhpcy5fbWF0cml4VW5pZm9ybT09PW51bGwmJih0aGlzLl9tYXRyaXhVbmlmb3JtPXh0KHRoaXMudmFsdWUubWF0cml4KSksdGhpcy5fbWF0cml4VW5pZm9ybS5tdWwoayh0LDEpKS54eX1zZXRVcGRhdGVNYXRyaXgodCl7cmV0dXJuIHRoaXMudXBkYXRlTWF0cml4PXQsdGhpcy51cGRhdGVUeXBlPXQ/US5GUkFNRTpRLk5PTkUsdGhpc31zZXR1cFVWKHQsZSl7Y29uc3Qgcz10aGlzLnZhbHVlO3JldHVybiB0LmlzRmxpcFkoKSYmKHMuaXNSZW5kZXJUYXJnZXRUZXh0dXJlPT09ITB8fHMuaXNGcmFtZWJ1ZmZlclRleHR1cmU9PT0hMHx8cy5pc0RlcHRoVGV4dHVyZT09PSEwKSYmKHRoaXMuc2FtcGxlcj9lPWUuZmxpcFkoKTplPWUuc2V0WShSZShZcih0aGlzLHRoaXMubGV2ZWxOb2RlKS55KS5zdWIoZS55KS5zdWIoMSkpKSxlfXNldHVwKHQpe2NvbnN0IGU9dC5nZXROb2RlUHJvcGVydGllcyh0aGlzKTtlLnJlZmVyZW5jZU5vZGU9dGhpcy5yZWZlcmVuY2VOb2RlO2xldCBzPXRoaXMudXZOb2RlOyhzPT09bnVsbHx8dC5jb250ZXh0LmZvcmNlVVZDb250ZXh0PT09ITApJiZ0LmNvbnRleHQuZ2V0VVYmJihzPXQuY29udGV4dC5nZXRVVih0aGlzKSksc3x8KHM9dGhpcy5nZXREZWZhdWx0VVYoKSksdGhpcy51cGRhdGVNYXRyaXg9PT0hMCYmKHM9dGhpcy5nZXRUcmFuc2Zvcm1lZFVWKHMpKSxzPXRoaXMuc2V0dXBVVih0LHMpO2xldCBuPXRoaXMubGV2ZWxOb2RlO249PT1udWxsJiZ0LmNvbnRleHQuZ2V0VGV4dHVyZUxldmVsJiYobj10LmNvbnRleHQuZ2V0VGV4dHVyZUxldmVsKHRoaXMpKSxlLnV2Tm9kZT1zLGUubGV2ZWxOb2RlPW4sZS5iaWFzTm9kZT10aGlzLmJpYXNOb2RlLGUuY29tcGFyZU5vZGU9dGhpcy5jb21wYXJlTm9kZSxlLmdyYWROb2RlPXRoaXMuZ3JhZE5vZGUsZS5kZXB0aE5vZGU9dGhpcy5kZXB0aE5vZGV9Z2VuZXJhdGVVVih0LGUpe3JldHVybiBlLmJ1aWxkKHQsdGhpcy5zYW1wbGVyPT09ITA/InZlYzIiOiJpdmVjMiIpfWdlbmVyYXRlU25pcHBldCh0LGUscyxuLGksbyxhLGMpe2NvbnN0IHU9dGhpcy52YWx1ZTtsZXQgaDtyZXR1cm4gbj9oPXQuZ2VuZXJhdGVUZXh0dXJlTGV2ZWwodSxlLHMsbixvKTppP2g9dC5nZW5lcmF0ZVRleHR1cmVCaWFzKHUsZSxzLGksbyk6Yz9oPXQuZ2VuZXJhdGVUZXh0dXJlR3JhZCh1LGUscyxjLG8pOmE/aD10LmdlbmVyYXRlVGV4dHVyZUNvbXBhcmUodSxlLHMsYSxvKTp0aGlzLnNhbXBsZXI9PT0hMT9oPXQuZ2VuZXJhdGVUZXh0dXJlTG9hZCh1LGUscyxvKTpoPXQuZ2VuZXJhdGVUZXh0dXJlKHUsZSxzLG8pLGh9Z2VuZXJhdGUodCxlKXtjb25zdCBzPXQuZ2V0Tm9kZVByb3BlcnRpZXModGhpcyksbj10aGlzLnZhbHVlO2lmKCFufHxuLmlzVGV4dHVyZSE9PSEwKXRocm93IG5ldyBFcnJvcigiVGV4dHVyZU5vZGU6IE5lZWQgYSB0aHJlZS5qcyB0ZXh0dXJlLiIpO2NvbnN0IGk9c3VwZXIuZ2VuZXJhdGUodCwicHJvcGVydHkiKTtpZihlPT09InNhbXBsZXIiKXJldHVybiBpKyJfc2FtcGxlciI7aWYodC5pc1JlZmVyZW5jZShlKSlyZXR1cm4gaTt7Y29uc3Qgbz10LmdldERhdGFGcm9tTm9kZSh0aGlzKTtsZXQgYT1vLnByb3BlcnR5TmFtZTtpZihhPT09dm9pZCAwKXtjb25zdHt1dk5vZGU6aCxsZXZlbE5vZGU6bCxiaWFzTm9kZTpkLGNvbXBhcmVOb2RlOmYsZGVwdGhOb2RlOnAsZ3JhZE5vZGU6bX09cyxnPXRoaXMuZ2VuZXJhdGVVVih0LGgpLHk9bD9sLmJ1aWxkKHQsImZsb2F0Iik6bnVsbCxUPWQ/ZC5idWlsZCh0LCJmbG9hdCIpOm51bGwsdz1wP3AuYnVpbGQodCwiaW50Iik6bnVsbCxNPWY/Zi5idWlsZCh0LCJmbG9hdCIpOm51bGwsTj1tP1ttWzBdLmJ1aWxkKHQsInZlYzIiKSxtWzFdLmJ1aWxkKHQsInZlYzIiKV06bnVsbCxfPXQuZ2V0VmFyRnJvbU5vZGUodGhpcyk7YT10LmdldFByb3BlcnR5TmFtZShfKTtjb25zdCBTPXRoaXMuZ2VuZXJhdGVTbmlwcGV0KHQsaSxnLHksVCx3LE0sTik7dC5hZGRMaW5lRmxvd0NvZGUoYCR7YX0gPSAke1N9YCx0aGlzKSxvLnNuaXBwZXQ9UyxvLnByb3BlcnR5TmFtZT1hfWxldCBjPWE7Y29uc3QgdT10aGlzLmdldE5vZGVUeXBlKHQpO3JldHVybiB0Lm5lZWRzVG9Xb3JraW5nQ29sb3JTcGFjZShuKSYmKGM9V3IoWXMoYyx1KSxuLmNvbG9yU3BhY2UpLnNldHVwKHQpLmJ1aWxkKHQsdSkpLHQuZm9ybWF0KGMsdSxlKX19c2V0U2FtcGxlcih0KXtyZXR1cm4gdGhpcy5zYW1wbGVyPXQsdGhpc31nZXRTYW1wbGVyKCl7cmV0dXJuIHRoaXMuc2FtcGxlcn11dih0KXtjb25zdCBlPXRoaXMuY2xvbmUoKTtyZXR1cm4gZS51dk5vZGU9dih0KSxlLnJlZmVyZW5jZU5vZGU9dGhpcy5nZXRTZWxmKCksdihlKX1ibHVyKHQpe2NvbnN0IGU9dGhpcy5jbG9uZSgpO3JldHVybiBlLmJpYXNOb2RlPXYodCkubXVsKFhoKGUpKSxlLnJlZmVyZW5jZU5vZGU9dGhpcy5nZXRTZWxmKCksdihlKX1sZXZlbCh0KXtjb25zdCBlPXRoaXMuY2xvbmUoKTtyZXR1cm4gZS5sZXZlbE5vZGU9dih0KSxlLnJlZmVyZW5jZU5vZGU9dGhpcy5nZXRTZWxmKCksdihlKX1zaXplKHQpe3JldHVybiBZcih0aGlzLHQpfWJpYXModCl7Y29uc3QgZT10aGlzLmNsb25lKCk7cmV0dXJuIGUuYmlhc05vZGU9dih0KSxlLnJlZmVyZW5jZU5vZGU9dGhpcy5nZXRTZWxmKCksdihlKX1jb21wYXJlKHQpe2NvbnN0IGU9dGhpcy5jbG9uZSgpO3JldHVybiBlLmNvbXBhcmVOb2RlPXYodCksZS5yZWZlcmVuY2VOb2RlPXRoaXMuZ2V0U2VsZigpLHYoZSl9Z3JhZCh0LGUpe2NvbnN0IHM9dGhpcy5jbG9uZSgpO3JldHVybiBzLmdyYWROb2RlPVt2KHQpLHYoZSldLHMucmVmZXJlbmNlTm9kZT10aGlzLmdldFNlbGYoKSx2KHMpfWRlcHRoKHQpe2NvbnN0IGU9dGhpcy5jbG9uZSgpO3JldHVybiBlLmRlcHRoTm9kZT12KHQpLGUucmVmZXJlbmNlTm9kZT10aGlzLmdldFNlbGYoKSx2KGUpfXNlcmlhbGl6ZSh0KXtzdXBlci5zZXJpYWxpemUodCksdC52YWx1ZT10aGlzLnZhbHVlLnRvSlNPTih0Lm1ldGEpLnV1aWQsdC5zYW1wbGVyPXRoaXMuc2FtcGxlcix0LnVwZGF0ZU1hdHJpeD10aGlzLnVwZGF0ZU1hdHJpeCx0LnVwZGF0ZVR5cGU9dGhpcy51cGRhdGVUeXBlfWRlc2VyaWFsaXplKHQpe3N1cGVyLmRlc2VyaWFsaXplKHQpLHRoaXMudmFsdWU9dC5tZXRhLnRleHR1cmVzW3QudmFsdWVdLHRoaXMuc2FtcGxlcj10LnNhbXBsZXIsdGhpcy51cGRhdGVNYXRyaXg9dC51cGRhdGVNYXRyaXgsdGhpcy51cGRhdGVUeXBlPXQudXBkYXRlVHlwZX11cGRhdGUoKXtjb25zdCB0PXRoaXMudmFsdWUsZT10aGlzLl9tYXRyaXhVbmlmb3JtO2UhPT1udWxsJiYoZS52YWx1ZT10Lm1hdHJpeCksdC5tYXRyaXhBdXRvVXBkYXRlPT09ITAmJnQudXBkYXRlTWF0cml4KCl9Y2xvbmUoKXtjb25zdCB0PW5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMudmFsdWUsdGhpcy51dk5vZGUsdGhpcy5sZXZlbE5vZGUsdGhpcy5iaWFzTm9kZSk7cmV0dXJuIHQuc2FtcGxlcj10aGlzLnNhbXBsZXIsdH19Y29uc3QgYXM9QyhKcyksY3M9eHQoImZsb2F0IikubGFiZWwoImNhbWVyYU5lYXIiKS5zZXRHcm91cChkZSkub25SZW5kZXJVcGRhdGUoKHtjYW1lcmE6cn0pPT5yLm5lYXIpLGhzPXh0KCJmbG9hdCIpLmxhYmVsKCJjYW1lcmFGYXIiKS5zZXRHcm91cChkZSkub25SZW5kZXJVcGRhdGUoKHtjYW1lcmE6cn0pPT5yLmZhciksanM9eHQoIm1hdDQiKS5sYWJlbCgiY2FtZXJhVmlld01hdHJpeCIpLnNldEdyb3VwKGRlKS5vblJlbmRlclVwZGF0ZSgoe2NhbWVyYTpyfSk9PnIubWF0cml4V29ybGRJbnZlcnNlKTtjbGFzcyBIIGV4dGVuZHMgVXtzdGF0aWMgZ2V0IHR5cGUoKXtyZXR1cm4iT2JqZWN0M0ROb2RlIn1jb25zdHJ1Y3Rvcih0LGU9bnVsbCl7c3VwZXIoKSx0aGlzLnNjb3BlPXQsdGhpcy5vYmplY3QzZD1lLHRoaXMudXBkYXRlVHlwZT1RLk9CSkVDVCx0aGlzLl91bmlmb3JtTm9kZT1uZXcgSWUobnVsbCl9Z2V0Tm9kZVR5cGUoKXtjb25zdCB0PXRoaXMuc2NvcGU7aWYodD09PUguV09STERfTUFUUklYKXJldHVybiJtYXQ0IjtpZih0PT09SC5QT1NJVElPTnx8dD09PUguVklFV19QT1NJVElPTnx8dD09PUguRElSRUNUSU9OfHx0PT09SC5TQ0FMRSlyZXR1cm4idmVjMyJ9dXBkYXRlKHQpe2NvbnN0IGU9dGhpcy5vYmplY3QzZCxzPXRoaXMuX3VuaWZvcm1Ob2RlLG49dGhpcy5zY29wZTtpZihuPT09SC5XT1JMRF9NQVRSSVgpcy52YWx1ZT1lLm1hdHJpeFdvcmxkO2Vsc2UgaWYobj09PUguUE9TSVRJT04pcy52YWx1ZT1zLnZhbHVlfHxuZXcgQSxzLnZhbHVlLnNldEZyb21NYXRyaXhQb3NpdGlvbihlLm1hdHJpeFdvcmxkKTtlbHNlIGlmKG49PT1ILlNDQUxFKXMudmFsdWU9cy52YWx1ZXx8bmV3IEEscy52YWx1ZS5zZXRGcm9tTWF0cml4U2NhbGUoZS5tYXRyaXhXb3JsZCk7ZWxzZSBpZihuPT09SC5ESVJFQ1RJT04pcy52YWx1ZT1zLnZhbHVlfHxuZXcgQSxlLmdldFdvcmxkRGlyZWN0aW9uKHMudmFsdWUpO2Vsc2UgaWYobj09PUguVklFV19QT1NJVElPTil7Y29uc3QgaT10LmNhbWVyYTtzLnZhbHVlPXMudmFsdWV8fG5ldyBBLHMudmFsdWUuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKGUubWF0cml4V29ybGQpLHMudmFsdWUuYXBwbHlNYXRyaXg0KGkubWF0cml4V29ybGRJbnZlcnNlKX19Z2VuZXJhdGUodCl7Y29uc3QgZT10aGlzLnNjb3BlO3JldHVybiBlPT09SC5XT1JMRF9NQVRSSVg/dGhpcy5fdW5pZm9ybU5vZGUubm9kZVR5cGU9Im1hdDQiOihlPT09SC5QT1NJVElPTnx8ZT09PUguVklFV19QT1NJVElPTnx8ZT09PUguRElSRUNUSU9OfHxlPT09SC5TQ0FMRSkmJih0aGlzLl91bmlmb3JtTm9kZS5ub2RlVHlwZT0idmVjMyIpLHRoaXMuX3VuaWZvcm1Ob2RlLmJ1aWxkKHQpfXNlcmlhbGl6ZSh0KXtzdXBlci5zZXJpYWxpemUodCksdC5zY29wZT10aGlzLnNjb3BlfWRlc2VyaWFsaXplKHQpe3N1cGVyLmRlc2VyaWFsaXplKHQpLHRoaXMuc2NvcGU9dC5zY29wZX19SC5XT1JMRF9NQVRSSVg9IndvcmxkTWF0cml4IixILlBPU0lUSU9OPSJwb3NpdGlvbiIsSC5TQ0FMRT0ic2NhbGUiLEguVklFV19QT1NJVElPTj0idmlld1Bvc2l0aW9uIixILkRJUkVDVElPTj0iZGlyZWN0aW9uIixILkRJUkVDVElPTixILldPUkxEX01BVFJJWCxILlBPU0lUSU9OLEguU0NBTEUsSC5WSUVXX1BPU0lUSU9OO2NsYXNzIFZ0IGV4dGVuZHMgSHtzdGF0aWMgZ2V0IHR5cGUoKXtyZXR1cm4iTW9kZWxOb2RlIn1jb25zdHJ1Y3Rvcih0KXtzdXBlcih0KX11cGRhdGUodCl7dGhpcy5vYmplY3QzZD10Lm9iamVjdCxzdXBlci51cGRhdGUodCl9fVZ0LkRJUkVDVElPTjtjb25zdCBZaD1PKFZ0LFZ0LldPUkxEX01BVFJJWCk7VnQuUE9TSVRJT04sVnQuU0NBTEUsVnQuVklFV19QT1NJVElPTjtjb25zdCBaaD14dChuZXcgQ3QpLm9uT2JqZWN0VXBkYXRlKCh7b2JqZWN0OnJ9LHQpPT50LnZhbHVlLmdldE5vcm1hbE1hdHJpeChyLm1hdHJpeFdvcmxkKSksWnI9anMubXVsKFloKS50b1ZhcigibW9kZWxWaWV3TWF0cml4XzIiKSxKaD1vcygicG9zaXRpb24iLCJ2ZWMzIikudmFyeWluZygicG9zaXRpb25Mb2NhbCIpLE10PVpyLm11bChKaCkueHl6LnZhcnlpbmcoInZfcG9zaXRpb25WaWV3IiksSnI9TXQubmVnYXRlKCkudmFyeWluZygidl9wb3NpdGlvblZpZXdEaXJlY3Rpb24iKS5ub3JtYWxpemUoKS50b1ZhcigicG9zaXRpb25WaWV3RGlyZWN0aW9uIik7Y2xhc3MgamggZXh0ZW5kcyBVe3N0YXRpYyBnZXQgdHlwZSgpe3JldHVybiJGcm9udEZhY2luZ05vZGUifWNvbnN0cnVjdG9yKCl7c3VwZXIoImJvb2wiKSx0aGlzLmlzRnJvbnRGYWNpbmdOb2RlPSEwfWdlbmVyYXRlKHQpe2NvbnN0e3JlbmRlcmVyOmUsbWF0ZXJpYWw6c309dDtyZXR1cm4gZS5jb29yZGluYXRlU3lzdGVtPT09WWUmJnMuc2lkZT09PVVpPyJmYWxzZSI6dC5nZXRGcm9udEZhY2luZygpfX1jb25zdCBkaT1xKE8oamgpKS5tdWwoMikuc3ViKDEpLFFoPW9zKCJub3JtYWwiLCJ2ZWMzIiksS2g9dHQocj0+ci5nZW9tZXRyeS5oYXNBdHRyaWJ1dGUoIm5vcm1hbCIpPT09ITE/KGNvbnNvbGUud2FybignVFNMLk5vcm1hbE5vZGU6IFZlcnRleCBhdHRyaWJ1dGUgIm5vcm1hbCIgbm90IGZvdW5kIG9uIGdlb21ldHJ5LicpLGsoMCwxLDApKTpRaCwidmVjMyIpLm9uY2UoKSgpLnRvVmFyKCJub3JtYWxMb2NhbCIpLHR1PU10LmRGZHgoKS5jcm9zcyhNdC5kRmR5KCkpLm5vcm1hbGl6ZSgpLnRvVmFyKCJub3JtYWxGbGF0IiksTGU9dHQocj0+e2xldCB0O3JldHVybiByLm1hdGVyaWFsLmZsYXRTaGFkaW5nPT09ITA/dD10dTp0PVBlKFFyKEtoKSwidl9ub3JtYWxWaWV3Iikubm9ybWFsaXplKCksdH0sInZlYzMiKS5vbmNlKCkoKS50b1Zhcigibm9ybWFsVmlldyIpLGpyPXR0KHI9PnIuY29udGV4dC5zZXR1cE5vcm1hbCgpLCJ2ZWMzIikub25jZSgpKCkubXVsKGRpKS50b1ZhcigidHJhbnNmb3JtZWROb3JtYWxWaWV3IiksUXI9dHQoKFtyXSx0KT0+e2NvbnN0IGU9dC5yZW5kZXJlci5ub2Rlcy5tb2RlbE5vcm1hbFZpZXdNYXRyaXg7aWYoZSE9PW51bGwpcmV0dXJuIGUudHJhbnNmb3JtRGlyZWN0aW9uKHIpO2NvbnN0IHM9WmgubXVsKHIpO3JldHVybiBqcy50cmFuc2Zvcm1EaXJlY3Rpb24ocyl9KSxldT14dCgwKS5vblJlZmVyZW5jZSgoe21hdGVyaWFsOnJ9KT0+cikub25SZW5kZXJVcGRhdGUoKHttYXRlcmlhbDpyfSk9PnIucmVmcmFjdGlvblJhdGlvKSxzdT1Kci5uZWdhdGUoKS5yZWZsZWN0KGpyKSxudT1Kci5uZWdhdGUoKS5yZWZyYWN0KGpyLGV1KSxpdT1zdS50cmFuc2Zvcm1EaXJlY3Rpb24oanMpLnRvVmFyKCJyZWZsZWN0VmVjdG9yIikscnU9bnUudHJhbnNmb3JtRGlyZWN0aW9uKGpzKS50b1ZhcigicmVmbGVjdFZlY3RvciIpO2NsYXNzIG91IGV4dGVuZHMgSnN7c3RhdGljIGdldCB0eXBlKCl7cmV0dXJuIkN1YmVUZXh0dXJlTm9kZSJ9Y29uc3RydWN0b3IodCxlPW51bGwscz1udWxsLG49bnVsbCl7c3VwZXIodCxlLHMsbiksdGhpcy5pc0N1YmVUZXh0dXJlTm9kZT0hMH1nZXRJbnB1dFR5cGUoKXtyZXR1cm4iY3ViZVRleHR1cmUifWdldERlZmF1bHRVVigpe2NvbnN0IHQ9dGhpcy52YWx1ZTtyZXR1cm4gdC5tYXBwaW5nPT09Q28/aXU6dC5tYXBwaW5nPT09Rm8/cnU6KGNvbnNvbGUuZXJyb3IoJ1RIUkVFLkN1YmVUZXh0dXJlTm9kZTogTWFwcGluZyAiJXMiIG5vdCBzdXBwb3J0ZWQuJyx0Lm1hcHBpbmcpLGsoMCwwLDApKX1zZXRVcGRhdGVNYXRyaXgoKXt9c2V0dXBVVih0LGUpe2NvbnN0IHM9dGhpcy52YWx1ZTtyZXR1cm4gdC5yZW5kZXJlci5jb29yZGluYXRlU3lzdGVtPT09em58fCFzLmlzUmVuZGVyVGFyZ2V0VGV4dHVyZT9rKGUueC5uZWdhdGUoKSxlLnl6KTplfWdlbmVyYXRlVVYodCxlKXtyZXR1cm4gZS5idWlsZCh0LCJ2ZWMzIil9fWNvbnN0IGF1PUMob3UpO2NsYXNzIEtyIGV4dGVuZHMgSWV7c3RhdGljIGdldCB0eXBlKCl7cmV0dXJuIkJ1ZmZlck5vZGUifWNvbnN0cnVjdG9yKHQsZSxzPTApe3N1cGVyKHQsZSksdGhpcy5pc0J1ZmZlck5vZGU9ITAsdGhpcy5idWZmZXJUeXBlPWUsdGhpcy5idWZmZXJDb3VudD1zfWdldEVsZW1lbnRUeXBlKHQpe3JldHVybiB0aGlzLmdldE5vZGVUeXBlKHQpfWdldElucHV0VHlwZSgpe3JldHVybiJidWZmZXIifX1jb25zdCBjdT0ocix0LGUpPT52KG5ldyBLcihyLHQsZSkpO2NsYXNzIGh1IGV4dGVuZHMgaXN7c3RhdGljIGdldCB0eXBlKCl7cmV0dXJuIlVuaWZvcm1BcnJheUVsZW1lbnROb2RlIn1jb25zdHJ1Y3Rvcih0LGUpe3N1cGVyKHQsZSksdGhpcy5pc0FycmF5QnVmZmVyRWxlbWVudE5vZGU9ITB9Z2VuZXJhdGUodCl7Y29uc3QgZT1zdXBlci5nZW5lcmF0ZSh0KSxzPXRoaXMuZ2V0Tm9kZVR5cGUoKTtyZXR1cm4gdC5mb3JtYXQoZSwidmVjNCIscyl9fWNsYXNzIHV1IGV4dGVuZHMgS3J7c3RhdGljIGdldCB0eXBlKCl7cmV0dXJuIlVuaWZvcm1BcnJheU5vZGUifWNvbnN0cnVjdG9yKHQsZT1udWxsKXtzdXBlcihudWxsLCJ2ZWM0IiksdGhpcy5hcnJheT10LHRoaXMuZWxlbWVudFR5cGU9ZSx0aGlzLl9lbGVtZW50VHlwZT1udWxsLHRoaXMuX2VsZW1lbnRMZW5ndGg9MCx0aGlzLnVwZGF0ZVR5cGU9US5SRU5ERVIsdGhpcy5pc0FycmF5QnVmZmVyTm9kZT0hMH1nZXRFbGVtZW50VHlwZSgpe3JldHVybiB0aGlzLmVsZW1lbnRUeXBlfHx0aGlzLl9lbGVtZW50VHlwZX1nZXRFbGVtZW50TGVuZ3RoKCl7cmV0dXJuIHRoaXMuX2VsZW1lbnRMZW5ndGh9dXBkYXRlKCl7Y29uc3R7YXJyYXk6dCx2YWx1ZTplfT10aGlzLHM9dGhpcy5nZXRFbGVtZW50TGVuZ3RoKCksbj10aGlzLmdldEVsZW1lbnRUeXBlKCk7aWYocz09PTEpZm9yKGxldCBpPTA7aTx0Lmxlbmd0aDtpKyspe2NvbnN0IG89aSo0O2Vbb109dFtpXX1lbHNlIGlmKG49PT0iY29sb3IiKWZvcihsZXQgaT0wO2k8dC5sZW5ndGg7aSsrKXtjb25zdCBvPWkqNCxhPXRbaV07ZVtvXT1hLnIsZVtvKzFdPWEuZyxlW28rMl09YS5ifHwwfWVsc2UgZm9yKGxldCBpPTA7aTx0Lmxlbmd0aDtpKyspe2NvbnN0IG89aSo0LGE9dFtpXTtlW29dPWEueCxlW28rMV09YS55LGVbbysyXT1hLnp8fDAsZVtvKzNdPWEud3x8MH19c2V0dXAodCl7Y29uc3QgZT10aGlzLmFycmF5Lmxlbmd0aDt0aGlzLl9lbGVtZW50VHlwZT10aGlzLmVsZW1lbnRUeXBlPT09bnVsbD9Wcyh0aGlzLmFycmF5WzBdKTp0aGlzLmVsZW1lbnRUeXBlLHRoaXMuX2VsZW1lbnRMZW5ndGg9dC5nZXRUeXBlTGVuZ3RoKHRoaXMuX2VsZW1lbnRUeXBlKTtsZXQgcz1GbG9hdDMyQXJyYXk7cmV0dXJuIHRoaXMuX2VsZW1lbnRUeXBlLmNoYXJBdCgwKT09PSJpIj9zPUludDMyQXJyYXk6dGhpcy5fZWxlbWVudFR5cGUuY2hhckF0KDApPT09InUiJiYocz1VaW50MzJBcnJheSksdGhpcy52YWx1ZT1uZXcgcyhlKjQpLHRoaXMuYnVmZmVyQ291bnQ9ZSx0aGlzLmJ1ZmZlclR5cGU9dC5jaGFuZ2VDb21wb25lbnRUeXBlKCJ2ZWM0Iix0LmdldENvbXBvbmVudFR5cGUodGhpcy5fZWxlbWVudFR5cGUpKSxzdXBlci5zZXR1cCh0KX1lbGVtZW50KHQpe3JldHVybiB2KG5ldyBodSh0aGlzLHYodCkpKX19Y29uc3QgZmk9KHIsdCk9PnYobmV3IHV1KHIsdCkpO2NsYXNzIGx1IGV4dGVuZHMgaXN7c3RhdGljIGdldCB0eXBlKCl7cmV0dXJuIlJlZmVyZW5jZUVsZW1lbnROb2RlIn1jb25zdHJ1Y3Rvcih0LGUpe3N1cGVyKHQsZSksdGhpcy5yZWZlcmVuY2VOb2RlPXQsdGhpcy5pc1JlZmVyZW5jZUVsZW1lbnROb2RlPSEwfWdldE5vZGVUeXBlKCl7cmV0dXJuIHRoaXMucmVmZXJlbmNlTm9kZS51bmlmb3JtVHlwZX1nZW5lcmF0ZSh0KXtjb25zdCBlPXN1cGVyLmdlbmVyYXRlKHQpLHM9dGhpcy5yZWZlcmVuY2VOb2RlLmdldE5vZGVUeXBlKCksbj10aGlzLmdldE5vZGVUeXBlKCk7cmV0dXJuIHQuZm9ybWF0KGUscyxuKX19Y2xhc3MgdG8gZXh0ZW5kcyBVe3N0YXRpYyBnZXQgdHlwZSgpe3JldHVybiJSZWZlcmVuY2VOb2RlIn1jb25zdHJ1Y3Rvcih0LGUscz1udWxsLG49bnVsbCl7c3VwZXIoKSx0aGlzLnByb3BlcnR5PXQsdGhpcy51bmlmb3JtVHlwZT1lLHRoaXMub2JqZWN0PXMsdGhpcy5jb3VudD1uLHRoaXMucHJvcGVydGllcz10LnNwbGl0KCIuIiksdGhpcy5yZWZlcmVuY2U9cyx0aGlzLm5vZGU9bnVsbCx0aGlzLmdyb3VwPW51bGwsdGhpcy5uYW1lPW51bGwsdGhpcy51cGRhdGVUeXBlPVEuT0JKRUNUfWVsZW1lbnQodCl7cmV0dXJuIHYobmV3IGx1KHRoaXMsdih0KSkpfXNldEdyb3VwKHQpe3JldHVybiB0aGlzLmdyb3VwPXQsdGhpc31sYWJlbCh0KXtyZXR1cm4gdGhpcy5uYW1lPXQsdGhpc31zZXROb2RlVHlwZSh0KXtsZXQgZT1udWxsO3RoaXMuY291bnQhPT1udWxsP2U9Y3UobnVsbCx0LHRoaXMuY291bnQpOkFycmF5LmlzQXJyYXkodGhpcy5nZXRWYWx1ZUZyb21SZWZlcmVuY2UoKSk/ZT1maShudWxsLHQpOnQ9PT0idGV4dHVyZSI/ZT1hcyhudWxsKTp0PT09ImN1YmVUZXh0dXJlIj9lPWF1KG51bGwpOmU9eHQobnVsbCx0KSx0aGlzLmdyb3VwIT09bnVsbCYmZS5zZXRHcm91cCh0aGlzLmdyb3VwKSx0aGlzLm5hbWUhPT1udWxsJiZlLmxhYmVsKHRoaXMubmFtZSksdGhpcy5ub2RlPWUuZ2V0U2VsZigpfWdldE5vZGVUeXBlKHQpe3JldHVybiB0aGlzLm5vZGU9PT1udWxsJiYodGhpcy51cGRhdGVSZWZlcmVuY2UodCksdGhpcy51cGRhdGVWYWx1ZSgpKSx0aGlzLm5vZGUuZ2V0Tm9kZVR5cGUodCl9Z2V0VmFsdWVGcm9tUmVmZXJlbmNlKHQ9dGhpcy5yZWZlcmVuY2Upe2NvbnN0e3Byb3BlcnRpZXM6ZX09dGhpcztsZXQgcz10W2VbMF1dO2ZvcihsZXQgbj0xO248ZS5sZW5ndGg7bisrKXM9c1tlW25dXTtyZXR1cm4gc311cGRhdGVSZWZlcmVuY2UodCl7cmV0dXJuIHRoaXMucmVmZXJlbmNlPXRoaXMub2JqZWN0IT09bnVsbD90aGlzLm9iamVjdDp0Lm9iamVjdCx0aGlzLnJlZmVyZW5jZX1zZXR1cCgpe3JldHVybiB0aGlzLnVwZGF0ZVZhbHVlKCksdGhpcy5ub2RlfXVwZGF0ZSgpe3RoaXMudXBkYXRlVmFsdWUoKX11cGRhdGVWYWx1ZSgpe3RoaXMubm9kZT09PW51bGwmJnRoaXMuc2V0Tm9kZVR5cGUodGhpcy51bmlmb3JtVHlwZSk7Y29uc3QgdD10aGlzLmdldFZhbHVlRnJvbVJlZmVyZW5jZSgpO0FycmF5LmlzQXJyYXkodCk/dGhpcy5ub2RlLmFycmF5PXQ6dGhpcy5ub2RlLnZhbHVlPXR9fWNvbnN0IHBlPShyLHQsZSk9PnYobmV3IHRvKHIsdCxlKSk7Y2xhc3MgZHUgZXh0ZW5kcyB0b3tzdGF0aWMgZ2V0IHR5cGUoKXtyZXR1cm4iTWF0ZXJpYWxSZWZlcmVuY2VOb2RlIn1jb25zdHJ1Y3Rvcih0LGUscz1udWxsKXtzdXBlcih0LGUscyksdGhpcy5tYXRlcmlhbD1zLHRoaXMuaXNNYXRlcmlhbFJlZmVyZW5jZU5vZGU9ITB9dXBkYXRlUmVmZXJlbmNlKHQpe3JldHVybiB0aGlzLnJlZmVyZW5jZT10aGlzLm1hdGVyaWFsIT09bnVsbD90aGlzLm1hdGVyaWFsOnQubWF0ZXJpYWwsdGhpcy5yZWZlcmVuY2V9fWNvbnN0IGZ1PShyLHQsZSk9PnYobmV3IGR1KHIsdCxlKSksZW89dHQocj0+KHIuZ2VvbWV0cnkuaGFzQXR0cmlidXRlKCJ0YW5nZW50Iik9PT0hMSYmci5nZW9tZXRyeS5jb21wdXRlVGFuZ2VudHMoKSxvcygidGFuZ2VudCIsInZlYzQiKSkpKCkscHU9ZW8ueHl6LnRvVmFyKCJ0YW5nZW50TG9jYWwiKSxzbz1aci5tdWwoQmUocHUsMCkpLnh5ei52YXJ5aW5nKCJ2X3RhbmdlbnRWaWV3Iikubm9ybWFsaXplKCkudG9WYXIoInRhbmdlbnRWaWV3IiksbXU9cXMoc28sUGUoKHI9PnIubXVsKGVvLncpLnh5eikoTGUuY3Jvc3Moc28pKSwidl9iaXRhbmdlbnRWaWV3Iikubm9ybWFsaXplKCkudG9WYXIoImJpdGFuZ2VudFZpZXciKSxMZSkseXU9dHQocj0+e2NvbnN0e2V5ZV9wb3M6dCxzdXJmX25vcm06ZSxtYXBOOnMsdXY6bn09cixpPXQuZEZkeCgpLG89dC5kRmR5KCksYT1uLmRGZHgoKSxjPW4uZEZkeSgpLHU9ZSxoPW8uY3Jvc3ModSksbD11LmNyb3NzKGkpLGQ9aC5tdWwoYS54KS5hZGQobC5tdWwoYy54KSksZj1oLm11bChhLnkpLmFkZChsLm11bChjLnkpKSxwPWQuZG90KGQpLm1heChmLmRvdChmKSksbT1kaS5tdWwocC5pbnZlcnNlU3FydCgpKTtyZXR1cm4gZmUoZC5tdWwocy54LG0pLGYubXVsKHMueSxtKSx1Lm11bChzLnopKS5ub3JtYWxpemUoKX0pO2NsYXNzIGd1IGV4dGVuZHMgZHR7c3RhdGljIGdldCB0eXBlKCl7cmV0dXJuIk5vcm1hbE1hcE5vZGUifWNvbnN0cnVjdG9yKHQsZT1udWxsKXtzdXBlcigidmVjMyIpLHRoaXMubm9kZT10LHRoaXMuc2NhbGVOb2RlPWUsdGhpcy5ub3JtYWxNYXBUeXBlPVlpfXNldHVwKHQpe2NvbnN0e25vcm1hbE1hcFR5cGU6ZSxzY2FsZU5vZGU6c309dGhpcztsZXQgbj10aGlzLm5vZGUubXVsKDIpLnN1YigxKTtzIT09bnVsbCYmKG49ayhuLnh5Lm11bChzKSxuLnopKTtsZXQgaT1udWxsO3JldHVybiBlPT09T28/aT1RcihuKTplPT09WWkmJih0Lmhhc0dlb21ldHJ5QXR0cmlidXRlKCJ0YW5nZW50Iik9PT0hMD9pPW11Lm11bChuKS5ub3JtYWxpemUoKTppPXl1KHtleWVfcG9zOk10LHN1cmZfbm9ybTpMZSxtYXBOOm4sdXY6WnMoKX0pKSxpfX1jb25zdCBubz1DKGd1KSx4dT10dCgoe3RleHR1cmVOb2RlOnIsYnVtcFNjYWxlOnR9KT0+e2NvbnN0IGU9bj0+ci5jYWNoZSgpLmNvbnRleHQoe2dldFVWOmk9Pm4oaS51dk5vZGV8fFpzKCkpLGZvcmNlVVZDb250ZXh0OiEwfSkscz1xKGUobj0+bikpO3JldHVybiBEKHEoZShuPT5uLmFkZChuLmRGZHgoKSkpKS5zdWIocykscShlKG49Pm4uYWRkKG4uZEZkeSgpKSkpLnN1YihzKSkubXVsKHQpfSksVHU9dHQocj0+e2NvbnN0e3N1cmZfcG9zOnQsc3VyZl9ub3JtOmUsZEhkeHk6c309cixuPXQuZEZkeCgpLm5vcm1hbGl6ZSgpLGk9dC5kRmR5KCkubm9ybWFsaXplKCksbz1lLGE9aS5jcm9zcyhvKSxjPW8uY3Jvc3MobiksdT1uLmRvdChhKS5tdWwoZGkpLGg9dS5zaWduKCkubXVsKHMueC5tdWwoYSkuYWRkKHMueS5tdWwoYykpKTtyZXR1cm4gdS5hYnMoKS5tdWwoZSkuc3ViKGgpLm5vcm1hbGl6ZSgpfSk7Y2xhc3MgTnUgZXh0ZW5kcyBkdHtzdGF0aWMgZ2V0IHR5cGUoKXtyZXR1cm4iQnVtcE1hcE5vZGUifWNvbnN0cnVjdG9yKHQsZT1udWxsKXtzdXBlcigidmVjMyIpLHRoaXMudGV4dHVyZU5vZGU9dCx0aGlzLnNjYWxlTm9kZT1lfXNldHVwKCl7Y29uc3QgdD10aGlzLnNjYWxlTm9kZSE9PW51bGw/dGhpcy5zY2FsZU5vZGU6MSxlPXh1KHt0ZXh0dXJlTm9kZTp0aGlzLnRleHR1cmVOb2RlLGJ1bXBTY2FsZTp0fSk7cmV0dXJuIFR1KHtzdXJmX3BvczpNdCxzdXJmX25vcm06TGUsZEhkeHk6ZX0pfX1jb25zdCB3dT1DKE51KSxpbz1uZXcgTWFwO2NsYXNzIHogZXh0ZW5kcyBVe3N0YXRpYyBnZXQgdHlwZSgpe3JldHVybiJNYXRlcmlhbE5vZGUifWNvbnN0cnVjdG9yKHQpe3N1cGVyKCksdGhpcy5zY29wZT10fWdldENhY2hlKHQsZSl7bGV0IHM9aW8uZ2V0KHQpO3JldHVybiBzPT09dm9pZCAwJiYocz1mdSh0LGUpLGlvLnNldCh0LHMpKSxzfWdldEZsb2F0KHQpe3JldHVybiB0aGlzLmdldENhY2hlKHQsImZsb2F0Iil9Z2V0Q29sb3IodCl7cmV0dXJuIHRoaXMuZ2V0Q2FjaGUodCwiY29sb3IiKX1nZXRUZXh0dXJlKHQpe3JldHVybiB0aGlzLmdldENhY2hlKHQ9PT0ibWFwIj8ibWFwIjp0KyJNYXAiLCJ0ZXh0dXJlIil9c2V0dXAodCl7Y29uc3QgZT10LmNvbnRleHQubWF0ZXJpYWwscz10aGlzLnNjb3BlO2xldCBuPW51bGw7aWYocz09PXouQ09MT1Ipe2NvbnN0IGk9ZS5jb2xvciE9PXZvaWQgMD90aGlzLmdldENvbG9yKHMpOmsoKTtlLm1hcCYmZS5tYXAuaXNUZXh0dXJlPT09ITA/bj1pLm11bCh0aGlzLmdldFRleHR1cmUoIm1hcCIpKTpuPWl9ZWxzZSBpZihzPT09ei5PUEFDSVRZKXtjb25zdCBpPXRoaXMuZ2V0RmxvYXQocyk7ZS5hbHBoYU1hcCYmZS5hbHBoYU1hcC5pc1RleHR1cmU9PT0hMD9uPWkubXVsKHRoaXMuZ2V0VGV4dHVyZSgiYWxwaGEiKSk6bj1pfWVsc2UgaWYocz09PXouU1BFQ1VMQVJfU1RSRU5HVEgpZS5zcGVjdWxhck1hcCYmZS5zcGVjdWxhck1hcC5pc1RleHR1cmU9PT0hMD9uPXRoaXMuZ2V0VGV4dHVyZSgic3BlY3VsYXIiKS5yOm49cSgxKTtlbHNlIGlmKHM9PT16LlNQRUNVTEFSX0lOVEVOU0lUWSl7Y29uc3QgaT10aGlzLmdldEZsb2F0KHMpO2Uuc3BlY3VsYXJNYXA/bj1pLm11bCh0aGlzLmdldFRleHR1cmUocykuYSk6bj1pfWVsc2UgaWYocz09PXouU1BFQ1VMQVJfQ09MT1Ipe2NvbnN0IGk9dGhpcy5nZXRDb2xvcihzKTtlLnNwZWN1bGFyQ29sb3JNYXAmJmUuc3BlY3VsYXJDb2xvck1hcC5pc1RleHR1cmU9PT0hMD9uPWkubXVsKHRoaXMuZ2V0VGV4dHVyZShzKS5yZ2IpOm49aX1lbHNlIGlmKHM9PT16LlJPVUdITkVTUyl7Y29uc3QgaT10aGlzLmdldEZsb2F0KHMpO2Uucm91Z2huZXNzTWFwJiZlLnJvdWdobmVzc01hcC5pc1RleHR1cmU9PT0hMD9uPWkubXVsKHRoaXMuZ2V0VGV4dHVyZShzKS5nKTpuPWl9ZWxzZSBpZihzPT09ei5NRVRBTE5FU1Mpe2NvbnN0IGk9dGhpcy5nZXRGbG9hdChzKTtlLm1ldGFsbmVzc01hcCYmZS5tZXRhbG5lc3NNYXAuaXNUZXh0dXJlPT09ITA/bj1pLm11bCh0aGlzLmdldFRleHR1cmUocykuYik6bj1pfWVsc2UgaWYocz09PXouRU1JU1NJVkUpe2NvbnN0IGk9dGhpcy5nZXRGbG9hdCgiZW1pc3NpdmVJbnRlbnNpdHkiKSxvPXRoaXMuZ2V0Q29sb3IocykubXVsKGkpO2UuZW1pc3NpdmVNYXAmJmUuZW1pc3NpdmVNYXAuaXNUZXh0dXJlPT09ITA/bj1vLm11bCh0aGlzLmdldFRleHR1cmUocykpOm49b31lbHNlIGlmKHM9PT16Lk5PUk1BTCllLm5vcm1hbE1hcD8obj1ubyh0aGlzLmdldFRleHR1cmUoIm5vcm1hbCIpLHRoaXMuZ2V0Q2FjaGUoIm5vcm1hbFNjYWxlIiwidmVjMiIpKSxuLm5vcm1hbE1hcFR5cGU9ZS5ub3JtYWxNYXBUeXBlKTplLmJ1bXBNYXA/bj13dSh0aGlzLmdldFRleHR1cmUoImJ1bXAiKS5yLHRoaXMuZ2V0RmxvYXQoImJ1bXBTY2FsZSIpKTpuPUxlO2Vsc2UgaWYocz09PXouQ0xFQVJDT0FUKXtjb25zdCBpPXRoaXMuZ2V0RmxvYXQocyk7ZS5jbGVhcmNvYXRNYXAmJmUuY2xlYXJjb2F0TWFwLmlzVGV4dHVyZT09PSEwP249aS5tdWwodGhpcy5nZXRUZXh0dXJlKHMpLnIpOm49aX1lbHNlIGlmKHM9PT16LkNMRUFSQ09BVF9ST1VHSE5FU1Mpe2NvbnN0IGk9dGhpcy5nZXRGbG9hdChzKTtlLmNsZWFyY29hdFJvdWdobmVzc01hcCYmZS5jbGVhcmNvYXRSb3VnaG5lc3NNYXAuaXNUZXh0dXJlPT09ITA/bj1pLm11bCh0aGlzLmdldFRleHR1cmUocykucik6bj1pfWVsc2UgaWYocz09PXouQ0xFQVJDT0FUX05PUk1BTCllLmNsZWFyY29hdE5vcm1hbE1hcD9uPW5vKHRoaXMuZ2V0VGV4dHVyZShzKSx0aGlzLmdldENhY2hlKHMrIlNjYWxlIiwidmVjMiIpKTpuPUxlO2Vsc2UgaWYocz09PXouU0hFRU4pe2NvbnN0IGk9dGhpcy5nZXRDb2xvcigic2hlZW5Db2xvciIpLm11bCh0aGlzLmdldEZsb2F0KCJzaGVlbiIpKTtlLnNoZWVuQ29sb3JNYXAmJmUuc2hlZW5Db2xvck1hcC5pc1RleHR1cmU9PT0hMD9uPWkubXVsKHRoaXMuZ2V0VGV4dHVyZSgic2hlZW5Db2xvciIpLnJnYik6bj1pfWVsc2UgaWYocz09PXouU0hFRU5fUk9VR0hORVNTKXtjb25zdCBpPXRoaXMuZ2V0RmxvYXQocyk7ZS5zaGVlblJvdWdobmVzc01hcCYmZS5zaGVlblJvdWdobmVzc01hcC5pc1RleHR1cmU9PT0hMD9uPWkubXVsKHRoaXMuZ2V0VGV4dHVyZShzKS5hKTpuPWksbj1uLmNsYW1wKC4wNywxKX1lbHNlIGlmKHM9PT16LkFOSVNPVFJPUFkpaWYoZS5hbmlzb3Ryb3B5TWFwJiZlLmFuaXNvdHJvcHlNYXAuaXNUZXh0dXJlPT09ITApe2NvbnN0IGk9dGhpcy5nZXRUZXh0dXJlKHMpO249UnIodXMueCx1cy55LHVzLnkubmVnYXRlKCksdXMueCkubXVsKGkucmcubXVsKDIpLnN1YihEKDEpKS5ub3JtYWxpemUoKS5tdWwoaS5iKSl9ZWxzZSBuPXVzO2Vsc2UgaWYocz09PXouSVJJREVTQ0VOQ0VfVEhJQ0tORVNTKXtjb25zdCBpPXBlKCIxIiwiZmxvYXQiLGUuaXJpZGVzY2VuY2VUaGlja25lc3NSYW5nZSk7aWYoZS5pcmlkZXNjZW5jZVRoaWNrbmVzc01hcCl7Y29uc3Qgbz1wZSgiMCIsImZsb2F0IixlLmlyaWRlc2NlbmNlVGhpY2tuZXNzUmFuZ2UpO249aS5zdWIobykubXVsKHRoaXMuZ2V0VGV4dHVyZShzKS5nKS5hZGQobyl9ZWxzZSBuPWl9ZWxzZSBpZihzPT09ei5UUkFOU01JU1NJT04pe2NvbnN0IGk9dGhpcy5nZXRGbG9hdChzKTtlLnRyYW5zbWlzc2lvbk1hcD9uPWkubXVsKHRoaXMuZ2V0VGV4dHVyZShzKS5yKTpuPWl9ZWxzZSBpZihzPT09ei5USElDS05FU1Mpe2NvbnN0IGk9dGhpcy5nZXRGbG9hdChzKTtlLnRoaWNrbmVzc01hcD9uPWkubXVsKHRoaXMuZ2V0VGV4dHVyZShzKS5nKTpuPWl9ZWxzZSBpZihzPT09ei5JT1Ipbj10aGlzLmdldEZsb2F0KHMpO2Vsc2UgaWYocz09PXouTElHSFRfTUFQKW49dGhpcy5nZXRUZXh0dXJlKHMpLnJnYi5tdWwodGhpcy5nZXRGbG9hdCgibGlnaHRNYXBJbnRlbnNpdHkiKSk7ZWxzZSBpZihzPT09ei5BT19NQVApbj10aGlzLmdldFRleHR1cmUocykuci5zdWIoMSkubXVsKHRoaXMuZ2V0RmxvYXQoImFvTWFwSW50ZW5zaXR5IikpLmFkZCgxKTtlbHNle2NvbnN0IGk9dGhpcy5nZXROb2RlVHlwZSh0KTtuPXRoaXMuZ2V0Q2FjaGUocyxpKX1yZXR1cm4gbn19ei5BTFBIQV9URVNUPSJhbHBoYVRlc3QiLHouQ09MT1I9ImNvbG9yIix6Lk9QQUNJVFk9Im9wYWNpdHkiLHouU0hJTklORVNTPSJzaGluaW5lc3MiLHouU1BFQ1VMQVI9InNwZWN1bGFyIix6LlNQRUNVTEFSX1NUUkVOR1RIPSJzcGVjdWxhclN0cmVuZ3RoIix6LlNQRUNVTEFSX0lOVEVOU0lUWT0ic3BlY3VsYXJJbnRlbnNpdHkiLHouU1BFQ1VMQVJfQ09MT1I9InNwZWN1bGFyQ29sb3IiLHouUkVGTEVDVElWSVRZPSJyZWZsZWN0aXZpdHkiLHouUk9VR0hORVNTPSJyb3VnaG5lc3MiLHouTUVUQUxORVNTPSJtZXRhbG5lc3MiLHouTk9STUFMPSJub3JtYWwiLHouQ0xFQVJDT0FUPSJjbGVhcmNvYXQiLHouQ0xFQVJDT0FUX1JPVUdITkVTUz0iY2xlYXJjb2F0Um91Z2huZXNzIix6LkNMRUFSQ09BVF9OT1JNQUw9ImNsZWFyY29hdE5vcm1hbCIsei5FTUlTU0lWRT0iZW1pc3NpdmUiLHouUk9UQVRJT049InJvdGF0aW9uIix6LlNIRUVOPSJzaGVlbiIsei5TSEVFTl9ST1VHSE5FU1M9InNoZWVuUm91Z2huZXNzIix6LkFOSVNPVFJPUFk9ImFuaXNvdHJvcHkiLHouSVJJREVTQ0VOQ0U9ImlyaWRlc2NlbmNlIix6LklSSURFU0NFTkNFX0lPUj0iaXJpZGVzY2VuY2VJT1IiLHouSVJJREVTQ0VOQ0VfVEhJQ0tORVNTPSJpcmlkZXNjZW5jZVRoaWNrbmVzcyIsei5JT1I9ImlvciIsei5UUkFOU01JU1NJT049InRyYW5zbWlzc2lvbiIsei5USElDS05FU1M9InRoaWNrbmVzcyIsei5BVFRFTlVBVElPTl9ESVNUQU5DRT0iYXR0ZW51YXRpb25EaXN0YW5jZSIsei5BVFRFTlVBVElPTl9DT0xPUj0iYXR0ZW51YXRpb25Db2xvciIsei5MSU5FX1NDQUxFPSJzY2FsZSIsei5MSU5FX0RBU0hfU0laRT0iZGFzaFNpemUiLHouTElORV9HQVBfU0laRT0iZ2FwU2l6ZSIsei5MSU5FX1dJRFRIPSJsaW5ld2lkdGgiLHouTElORV9EQVNIX09GRlNFVD0iZGFzaE9mZnNldCIsei5QT0lOVF9XSURUSD0icG9pbnRXaWR0aCIsei5ESVNQRVJTSU9OPSJkaXNwZXJzaW9uIix6LkxJR0hUX01BUD0ibGlnaHQiLHouQU9fTUFQPSJhbyIsei5BTFBIQV9URVNULHouQ09MT1Isei5TSElOSU5FU1Msei5FTUlTU0lWRSx6Lk9QQUNJVFksei5TUEVDVUxBUix6LlNQRUNVTEFSX0lOVEVOU0lUWSx6LlNQRUNVTEFSX0NPTE9SLHouU1BFQ1VMQVJfU1RSRU5HVEgsei5SRUZMRUNUSVZJVFksei5ST1VHSE5FU1Msei5NRVRBTE5FU1Msei5DTEVBUkNPQVQsei5DTEVBUkNPQVRfUk9VR0hORVNTLHouUk9UQVRJT04sei5TSEVFTix6LlNIRUVOX1JPVUdITkVTUyx6LkFOSVNPVFJPUFksei5JUklERVNDRU5DRSx6LklSSURFU0NFTkNFX0lPUix6LklSSURFU0NFTkNFX1RISUNLTkVTUyx6LlRSQU5TTUlTU0lPTix6LlRISUNLTkVTUyx6LklPUix6LkFUVEVOVUFUSU9OX0RJU1RBTkNFLHouQVRURU5VQVRJT05fQ09MT1Isei5MSU5FX1NDQUxFLHouTElORV9EQVNIX1NJWkUsei5MSU5FX0dBUF9TSVpFLHouTElORV9XSURUSCx6LkxJTkVfREFTSF9PRkZTRVQsei5QT0lOVF9XSURUSCx6LkRJU1BFUlNJT04sei5MSUdIVF9NQVAsei5BT19NQVA7Y29uc3QgdXM9eHQobmV3IEopLm9uUmVmZXJlbmNlKGZ1bmN0aW9uKHIpe3JldHVybiByLm1hdGVyaWFsfSkub25SZW5kZXJVcGRhdGUoZnVuY3Rpb24oe21hdGVyaWFsOnJ9KXt0aGlzLnZhbHVlLnNldChyLmFuaXNvdHJvcHkqTWF0aC5jb3Moci5hbmlzb3Ryb3B5Um90YXRpb24pLHIuYW5pc290cm9weSpNYXRoLnNpbihyLmFuaXNvdHJvcHlSb3RhdGlvbikpfSk7Y2xhc3MgVyBleHRlbmRzIFV7c3RhdGljIGdldCB0eXBlKCl7cmV0dXJuIkluZGV4Tm9kZSJ9Y29uc3RydWN0b3IodCl7c3VwZXIoInVpbnQiKSx0aGlzLnNjb3BlPXQsdGhpcy5pc0luc3RhbmNlSW5kZXhOb2RlPSEwfWdlbmVyYXRlKHQpe2NvbnN0IGU9dGhpcy5nZXROb2RlVHlwZSh0KSxzPXRoaXMuc2NvcGU7bGV0IG47aWYocz09PVcuVkVSVEVYKW49dC5nZXRWZXJ0ZXhJbmRleCgpO2Vsc2UgaWYocz09PVcuSU5TVEFOQ0Upbj10LmdldEluc3RhbmNlSW5kZXgoKTtlbHNlIGlmKHM9PT1XLkRSQVcpbj10LmdldERyYXdJbmRleCgpO2Vsc2UgaWYocz09PVcuSU5WT0NBVElPTl9MT0NBTCluPXQuZ2V0SW52b2NhdGlvbkxvY2FsSW5kZXgoKTtlbHNlIGlmKHM9PT1XLklOVk9DQVRJT05fU1VCR1JPVVApbj10LmdldEludm9jYXRpb25TdWJncm91cEluZGV4KCk7ZWxzZSBpZihzPT09Vy5TVUJHUk9VUCluPXQuZ2V0U3ViZ3JvdXBJbmRleCgpO2Vsc2UgdGhyb3cgbmV3IEVycm9yKCJUSFJFRS5JbmRleE5vZGU6IFVua25vd24gc2NvcGU6ICIrcyk7bGV0IGk7cmV0dXJuIHQuc2hhZGVyU3RhZ2U9PT0idmVydGV4Inx8dC5zaGFkZXJTdGFnZT09PSJjb21wdXRlIj9pPW46aT1QZSh0aGlzKS5idWlsZCh0LGUpLGl9fVcuVkVSVEVYPSJ2ZXJ0ZXgiLFcuSU5TVEFOQ0U9Imluc3RhbmNlIixXLlNVQkdST1VQPSJzdWJncm91cCIsVy5JTlZPQ0FUSU9OX0xPQ0FMPSJpbnZvY2F0aW9uTG9jYWwiLFcuSU5WT0NBVElPTl9TVUJHUk9VUD0iaW52b2NhdGlvblN1Ymdyb3VwIixXLkRSQVc9ImRyYXciLFcuVkVSVEVYLFcuSU5TVEFOQ0UsVy5TVUJHUk9VUCxXLklOVk9DQVRJT05fU1VCR1JPVVAsVy5JTlZPQ0FUSU9OX0xPQ0FMLFcuRFJBVztjbGFzcyBBdSBleHRlbmRzIFV7c3RhdGljIGdldCB0eXBlKCl7cmV0dXJuIkxvb3BOb2RlIn1jb25zdHJ1Y3Rvcih0PVtdKXtzdXBlcigpLHRoaXMucGFyYW1zPXR9Z2V0VmFyTmFtZSh0KXtyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZSgiaSIuY2hhckNvZGVBdCgpK3QpfWdldFByb3BlcnRpZXModCl7Y29uc3QgZT10LmdldE5vZGVQcm9wZXJ0aWVzKHRoaXMpO2lmKGUuc3RhY2tOb2RlIT09dm9pZCAwKXJldHVybiBlO2NvbnN0IHM9e307Zm9yKGxldCBpPTAsbz10aGlzLnBhcmFtcy5sZW5ndGgtMTtpPG87aSsrKXtjb25zdCBhPXRoaXMucGFyYW1zW2ldLGM9YS5pc05vZGUhPT0hMCYmYS5uYW1lfHx0aGlzLmdldFZhck5hbWUoaSksdT1hLmlzTm9kZSE9PSEwJiZhLnR5cGV8fCJpbnQiO3NbY109WXMoYyx1KX1jb25zdCBuPXQuYWRkU3RhY2soKTtyZXR1cm4gZS5yZXR1cm5zTm9kZT10aGlzLnBhcmFtc1t0aGlzLnBhcmFtcy5sZW5ndGgtMV0ocyxuLHQpLGUuc3RhY2tOb2RlPW4sdC5yZW1vdmVTdGFjaygpLGV9Z2V0Tm9kZVR5cGUodCl7Y29uc3R7cmV0dXJuc05vZGU6ZX09dGhpcy5nZXRQcm9wZXJ0aWVzKHQpO3JldHVybiBlP2UuZ2V0Tm9kZVR5cGUodCk6InZvaWQifXNldHVwKHQpe3RoaXMuZ2V0UHJvcGVydGllcyh0KX1nZW5lcmF0ZSh0KXtjb25zdCBlPXRoaXMuZ2V0UHJvcGVydGllcyh0KSxzPXRoaXMucGFyYW1zLG49ZS5zdGFja05vZGU7Zm9yKGxldCBhPTAsYz1zLmxlbmd0aC0xO2E8YzthKyspe2NvbnN0IHU9c1thXTtsZXQgaD1udWxsLGw9bnVsbCxkPW51bGwsZj1udWxsLHA9bnVsbCxtPW51bGw7dS5pc05vZGU/KGY9ImludCIsZD10aGlzLmdldFZhck5hbWUoYSksaD0iMCIsbD11LmJ1aWxkKHQsZikscD0iPCIpOihmPXUudHlwZXx8ImludCIsZD11Lm5hbWV8fHRoaXMuZ2V0VmFyTmFtZShhKSxoPXUuc3RhcnQsbD11LmVuZCxwPXUuY29uZGl0aW9uLG09dS51cGRhdGUsdHlwZW9mIGg9PSJudW1iZXIiP2g9aC50b1N0cmluZygpOmgmJmguaXNOb2RlJiYoaD1oLmJ1aWxkKHQsZikpLHR5cGVvZiBsPT0ibnVtYmVyIj9sPWwudG9TdHJpbmcoKTpsJiZsLmlzTm9kZSYmKGw9bC5idWlsZCh0LGYpKSxoIT09dm9pZCAwJiZsPT09dm9pZCAwPyhoPWgrIiAtIDEiLGw9IjAiLHA9Ij49Iik6bCE9PXZvaWQgMCYmaD09PXZvaWQgMCYmKGg9IjAiLHA9IjwiKSxwPT09dm9pZCAwJiYoTnVtYmVyKGgpPk51bWJlcihsKT9wPSI+PSI6cD0iPCIpKTtjb25zdCBnPXtzdGFydDpoLGVuZDpsLGNvbmRpdGlvbjpwfSx5PWcuc3RhcnQsVD1nLmVuZDtsZXQgdz0iIixNPSIiLE49IiI7bXx8KGY9PT0iaW50Inx8Zj09PSJ1aW50Ij9wLmluY2x1ZGVzKCI8Iik/bT0iKysiOm09Ii0tIjpwLmluY2x1ZGVzKCI8Iik/bT0iKz0gMS4iOm09Ii09IDEuIiksdys9dC5nZXRWYXIoZixkKSsiID0gIit5LE0rPWQrIiAiK3ArIiAiK1QsTis9ZCsiICIrbTtjb25zdCBfPWBmb3IgKCAke3d9OyAke019OyAke059IClgO3QuYWRkRmxvd0NvZGUoKGE9PT0wP2AKYDoiIikrdC50YWIrXytgIHsKCmApLmFkZEZsb3dUYWIoKX1jb25zdCBpPW4uYnVpbGQodCwidm9pZCIpLG89ZS5yZXR1cm5zTm9kZT9lLnJldHVybnNOb2RlLmJ1aWxkKHQpOiIiO3QucmVtb3ZlRmxvd1RhYigpLmFkZEZsb3dDb2RlKGAKYCt0LnRhYitpKTtmb3IobGV0IGE9MCxjPXRoaXMucGFyYW1zLmxlbmd0aC0xO2E8YzthKyspdC5hZGRGbG93Q29kZSgoYT09PTA/IiI6dC50YWIpK2B9CgpgKS5yZW1vdmVGbG93VGFiKCk7cmV0dXJuIHQuYWRkRmxvd1RhYigpLG99fWNvbnN0IE9lPSguLi5yKT0+dihuZXcgQXUoRmUociwiaW50IikpKS5hcHBlbmQoKTtsZXQgbHMsZHM7Y2xhc3MgZXQgZXh0ZW5kcyBVe3N0YXRpYyBnZXQgdHlwZSgpe3JldHVybiJTY3JlZW5Ob2RlIn1jb25zdHJ1Y3Rvcih0KXtzdXBlcigpLHRoaXMuc2NvcGU9dCx0aGlzLmlzVmlld3BvcnROb2RlPSEwfWdldE5vZGVUeXBlKCl7cmV0dXJuIHRoaXMuc2NvcGU9PT1ldC5WSUVXUE9SVD8idmVjNCI6InZlYzIifWdldFVwZGF0ZVR5cGUoKXtsZXQgdD1RLk5PTkU7cmV0dXJuKHRoaXMuc2NvcGU9PT1ldC5TSVpFfHx0aGlzLnNjb3BlPT09ZXQuVklFV1BPUlQpJiYodD1RLlJFTkRFUiksdGhpcy51cGRhdGVUeXBlPXQsdH11cGRhdGUoe3JlbmRlcmVyOnR9KXtjb25zdCBlPXQuZ2V0UmVuZGVyVGFyZ2V0KCk7dGhpcy5zY29wZT09PWV0LlZJRVdQT1JUP2UhPT1udWxsP2RzLmNvcHkoZS52aWV3cG9ydCk6KHQuZ2V0Vmlld3BvcnQoZHMpLGRzLm11bHRpcGx5U2NhbGFyKHQuZ2V0UGl4ZWxSYXRpbygpKSk6ZSE9PW51bGw/KGxzLndpZHRoPWUud2lkdGgsbHMuaGVpZ2h0PWUuaGVpZ2h0KTp0LmdldERyYXdpbmdCdWZmZXJTaXplKGxzKX1zZXR1cCgpe2NvbnN0IHQ9dGhpcy5zY29wZTtsZXQgZT1udWxsO3JldHVybiB0PT09ZXQuU0laRT9lPXh0KGxzfHwobHM9bmV3IEopKTp0PT09ZXQuVklFV1BPUlQ/ZT14dChkc3x8KGRzPW5ldyBGdCkpOmU9RChRcy5kaXYocm8pKSxlfWdlbmVyYXRlKHQpe2lmKHRoaXMuc2NvcGU9PT1ldC5DT09SRElOQVRFKXtsZXQgZT10LmdldEZyYWdDb29yZCgpO2lmKHQuaXNGbGlwWSgpKXtjb25zdCBzPXQuZ2V0Tm9kZVByb3BlcnRpZXMocm8pLm91dHB1dE5vZGUuYnVpbGQodCk7ZT1gJHt0LmdldFR5cGUoInZlYzIiKX0oICR7ZX0ueCwgJHtzfS55IC0gJHtlfS55IClgfXJldHVybiBlfXJldHVybiBzdXBlci5nZW5lcmF0ZSh0KX19ZXQuQ09PUkRJTkFURT0iY29vcmRpbmF0ZSIsZXQuVklFV1BPUlQ9InZpZXdwb3J0IixldC5TSVpFPSJzaXplIixldC5VVj0idXYiO2NvbnN0IHBpPU8oZXQsZXQuVVYpLHJvPU8oZXQsZXQuU0laRSksUXM9TyhldCxldC5DT09SRElOQVRFKSxvbz1PKGV0LGV0LlZJRVdQT1JUKTtvby56dyxvby54eTtjb25zdCBmcz1uZXcgSjtjbGFzcyBNdSBleHRlbmRzIEpze3N0YXRpYyBnZXQgdHlwZSgpe3JldHVybiJWaWV3cG9ydFRleHR1cmVOb2RlIn1jb25zdHJ1Y3Rvcih0PXBpLGU9bnVsbCxzPW51bGwpe3M9PT1udWxsJiYocz1uZXcgQWEscy5taW5GaWx0ZXI9R2kpLHN1cGVyKHMsdCxlKSx0aGlzLmdlbmVyYXRlTWlwbWFwcz0hMSx0aGlzLmlzT3V0cHV0VGV4dHVyZU5vZGU9ITAsdGhpcy51cGRhdGVCZWZvcmVUeXBlPVEuRlJBTUV9dXBkYXRlQmVmb3JlKHQpe2NvbnN0IGU9dC5yZW5kZXJlcjtlLmdldERyYXdpbmdCdWZmZXJTaXplKGZzKTtjb25zdCBzPXRoaXMudmFsdWU7KHMuaW1hZ2Uud2lkdGghPT1mcy53aWR0aHx8cy5pbWFnZS5oZWlnaHQhPT1mcy5oZWlnaHQpJiYocy5pbWFnZS53aWR0aD1mcy53aWR0aCxzLmltYWdlLmhlaWdodD1mcy5oZWlnaHQscy5uZWVkc1VwZGF0ZT0hMCk7Y29uc3Qgbj1zLmdlbmVyYXRlTWlwbWFwcztzLmdlbmVyYXRlTWlwbWFwcz10aGlzLmdlbmVyYXRlTWlwbWFwcyxlLmNvcHlGcmFtZWJ1ZmZlclRvVGV4dHVyZShzKSxzLmdlbmVyYXRlTWlwbWFwcz1ufWNsb25lKCl7Y29uc3QgdD1uZXcgdGhpcy5jb25zdHJ1Y3Rvcih0aGlzLnV2Tm9kZSx0aGlzLmxldmVsTm9kZSx0aGlzLnZhbHVlKTtyZXR1cm4gdC5nZW5lcmF0ZU1pcG1hcHM9dGhpcy5nZW5lcmF0ZU1pcG1hcHMsdH19bGV0IG1pPW51bGw7Y2xhc3MgU3UgZXh0ZW5kcyBNdXtzdGF0aWMgZ2V0IHR5cGUoKXtyZXR1cm4iVmlld3BvcnREZXB0aFRleHR1cmVOb2RlIn1jb25zdHJ1Y3Rvcih0PXBpLGU9bnVsbCl7bWk9PT1udWxsJiYobWk9bmV3IHhyKSxzdXBlcih0LGUsbWkpfX1jb25zdCBfdT1DKFN1KTtjbGFzcyBmdCBleHRlbmRzIFV7c3RhdGljIGdldCB0eXBlKCl7cmV0dXJuIlZpZXdwb3J0RGVwdGhOb2RlIn1jb25zdHJ1Y3Rvcih0LGU9bnVsbCl7c3VwZXIoImZsb2F0IiksdGhpcy5zY29wZT10LHRoaXMudmFsdWVOb2RlPWUsdGhpcy5pc1ZpZXdwb3J0RGVwdGhOb2RlPSEwfWdlbmVyYXRlKHQpe2NvbnN0e3Njb3BlOmV9PXRoaXM7cmV0dXJuIGU9PT1mdC5ERVBUSF9CQVNFP3QuZ2V0RnJhZ0RlcHRoKCk6c3VwZXIuZ2VuZXJhdGUodCl9c2V0dXAoe2NhbWVyYTp0fSl7Y29uc3R7c2NvcGU6ZX09dGhpcyxzPXRoaXMudmFsdWVOb2RlO2xldCBuPW51bGw7aWYoZT09PWZ0LkRFUFRIX0JBU0UpcyE9PW51bGwmJihuPWNvKCkuYXNzaWduKHMpKTtlbHNlIGlmKGU9PT1mdC5ERVBUSCl0LmlzUGVyc3BlY3RpdmVDYW1lcmE/bj16dShNdC56LGNzLGhzKTpuPUtzKE10LnosY3MsaHMpO2Vsc2UgaWYoZT09PWZ0LkxJTkVBUl9ERVBUSClpZihzIT09bnVsbClpZih0LmlzUGVyc3BlY3RpdmVDYW1lcmEpe2NvbnN0IGk9YW8ocyxjcyxocyk7bj1LcyhpLGNzLGhzKX1lbHNlIG49cztlbHNlIG49S3MoTXQueixjcyxocyk7cmV0dXJuIG59fWZ0LkRFUFRIX0JBU0U9ImRlcHRoQmFzZSIsZnQuREVQVEg9ImRlcHRoIixmdC5MSU5FQVJfREVQVEg9ImxpbmVhckRlcHRoIjtjb25zdCBLcz0ocix0LGUpPT5yLmFkZCh0KS5kaXYodC5zdWIoZSkpLHp1PShyLHQsZSk9PnQuYWRkKHIpLm11bChlKS5kaXYoZS5zdWIodCkubXVsKHIpKSxhbz0ocix0LGUpPT50Lm11bChlKS5kaXYoZS5zdWIodCkubXVsKHIpLnN1YihlKSksY289QyhmdCxmdC5ERVBUSF9CQVNFKSxidT1PKGZ0LGZ0LkRFUFRIKSxFdT1DKGZ0LGZ0LkxJTkVBUl9ERVBUSCk7X3UoKSxidS5hc3NpZ249cj0+Y28ocik7Y2xhc3MgcHMgZXh0ZW5kcyBVe3N0YXRpYyBnZXQgdHlwZSgpe3JldHVybiJDbGlwcGluZ05vZGUifWNvbnN0cnVjdG9yKHQ9cHMuREVGQVVMVCl7c3VwZXIoKSx0aGlzLnNjb3BlPXR9c2V0dXAodCl7c3VwZXIuc2V0dXAodCk7Y29uc3QgZT10LmNsaXBwaW5nQ29udGV4dCx7bG9jYWxDbGlwSW50ZXJzZWN0aW9uOnMsbG9jYWxDbGlwcGluZ0NvdW50Om4sZ2xvYmFsQ2xpcHBpbmdDb3VudDppfT1lLG89aStuLGE9cz9vLW46bztyZXR1cm4gdGhpcy5zY29wZT09PXBzLkFMUEhBX1RPX0NPVkVSQUdFP3RoaXMuc2V0dXBBbHBoYVRvQ292ZXJhZ2UoZS5wbGFuZXMsbyxhKTp0aGlzLnNldHVwRGVmYXVsdChlLnBsYW5lcyxvLGEpfXNldHVwQWxwaGFUb0NvdmVyYWdlKHQsZSxzKXtyZXR1cm4gdHQoKCk9Pntjb25zdCBuPWZpKHQpLGk9dmUoImZsb2F0IiwiZGlzdGFuY2VUb1BsYW5lIiksbz12ZSgiZmxvYXQiLCJkaXN0YW5jZVRvR3JhZGllbnQiKSxhPXZlKCJmbG9hdCIsImNsaXBPcGFjaXR5Iik7YS5hc3NpZ24oMSk7bGV0IGM7aWYoT2Uocywoe2k6dX0pPT57Yz1uLmVsZW1lbnQodSksaS5hc3NpZ24oTXQuZG90KGMueHl6KS5uZWdhdGUoKS5hZGQoYy53KSksby5hc3NpZ24oaS5md2lkdGgoKS5kaXYoMikpLGEubXVsQXNzaWduKGhpKG8ubmVnYXRlKCksbyxpKSksYS5lcXVhbCgwKS5kaXNjYXJkKCl9KSxzPGUpe2NvbnN0IHU9dmUoImZsb2F0IiwidW5pb25jbGlwT3BhY2l0eSIpO3UuYXNzaWduKDEpLE9lKHtzdGFydDpzLGVuZDplfSwoe2k6aH0pPT57Yz1uLmVsZW1lbnQoaCksaS5hc3NpZ24oTXQuZG90KGMueHl6KS5uZWdhdGUoKS5hZGQoYy53KSksby5hc3NpZ24oaS5md2lkdGgoKS5kaXYoMikpLHUubXVsQXNzaWduKGhpKG8ubmVnYXRlKCksbyxpKS5vbmVNaW51cygpKX0pLGEubXVsQXNzaWduKHUub25lTWludXMoKSl9dnIuYS5tdWxBc3NpZ24oYSksdnIuYS5lcXVhbCgwKS5kaXNjYXJkKCl9KSgpfXNldHVwRGVmYXVsdCh0LGUscyl7cmV0dXJuIHR0KCgpPT57Y29uc3Qgbj1maSh0KTtsZXQgaTtpZihPZShzLCh7aTpvfSk9PntpPW4uZWxlbWVudChvKSxNdC5kb3QoaS54eXopLmdyZWF0ZXJUaGFuKGkudykuZGlzY2FyZCgpfSksczxlKXtjb25zdCBvPXZlKCJib29sIiwiY2xpcHBlZCIpO28uYXNzaWduKCEwKSxPZSh7c3RhcnQ6cyxlbmQ6ZX0sKHtpOmF9KT0+e2k9bi5lbGVtZW50KGEpLG8uYXNzaWduKE10LmRvdChpLnh5eikuZ3JlYXRlclRoYW4oaS53KS5hbmQobykpfSksby5kaXNjYXJkKCl9fSkoKX19cHMuQUxQSEFfVE9fQ09WRVJBR0U9ImFscGhhVG9Db3ZlcmFnZSIscHMuREVGQVVMVD0iZGVmYXVsdCIsayguMDQpLHEoMSk7Y29uc3QgQ3U9dHQoKFtyLHRdKT0+e2NvbnN0IGU9ci50b1ZhcigpO2UuYXNzaWduKEdzKDIsZSkuc3ViKDEpKTtjb25zdCBzPWsoZSwxKS50b1ZhcigpO3JldHVybiBuaSh0LmVxdWFsKDApLCgpPT57cy5hc3NpZ24ocy56eXgpfSkuRWxzZUlmKHQuZXF1YWwoMSksKCk9PntzLmFzc2lnbihzLnh6eSkscy54ei5tdWxBc3NpZ24oLTEpfSkuRWxzZUlmKHQuZXF1YWwoMiksKCk9PntzLngubXVsQXNzaWduKC0xKX0pLkVsc2VJZih0LmVxdWFsKDMpLCgpPT57cy5hc3NpZ24ocy56eXgpLHMueHoubXVsQXNzaWduKC0xKX0pLkVsc2VJZih0LmVxdWFsKDQpLCgpPT57cy5hc3NpZ24ocy54enkpLHMueHkubXVsQXNzaWduKC0xKX0pLkVsc2VJZih0LmVxdWFsKDUpLCgpPT57cy56Lm11bEFzc2lnbigtMSl9KSxzfSkuc2V0TGF5b3V0KHtuYW1lOiJnZXREaXJlY3Rpb24iLHR5cGU6InZlYzMiLGlucHV0czpbe25hbWU6InV2Iix0eXBlOiJ2ZWMyIn0se25hbWU6ImZhY2UiLHR5cGU6ImZsb2F0In1dfSk7dHQoKHt0ZXh0dXJlOnIsdXY6dH0pPT57Y29uc3Qgcz1rKCkudG9WYXIoKTtyZXR1cm4gbmkodC54Lmxlc3NUaGFuKDFlLTQpLCgpPT57cy5hc3NpZ24oaygxLDAsMCkpfSkuRWxzZUlmKHQueS5sZXNzVGhhbigxZS00KSwoKT0+e3MuYXNzaWduKGsoMCwxLDApKX0pLkVsc2VJZih0LnoubGVzc1RoYW4oMWUtNCksKCk9PntzLmFzc2lnbihrKDAsMCwxKSl9KS5FbHNlSWYodC54LmdyZWF0ZXJUaGFuKDEtMWUtNCksKCk9PntzLmFzc2lnbihrKC0xLDAsMCkpfSkuRWxzZUlmKHQueS5ncmVhdGVyVGhhbigxLTFlLTQpLCgpPT57cy5hc3NpZ24oaygwLC0xLDApKX0pLkVsc2VJZih0LnouZ3JlYXRlclRoYW4oMS0xZS00KSwoKT0+e3MuYXNzaWduKGsoMCwwLC0xKSl9KS5FbHNlKCgpPT57Y29uc3QgaT1yLnV2KHQuYWRkKGsoLS4wMSwwLDApKSkuci5zdWIoci51dih0LmFkZChrKC4wMSwwLDApKSkuciksbz1yLnV2KHQuYWRkKGsoMCwtLjAxLDApKSkuci5zdWIoci51dih0LmFkZChrKDAsLjAxLDApKSkuciksYT1yLnV2KHQuYWRkKGsoMCwwLC0uMDEpKSkuci5zdWIoci51dih0LmFkZChrKDAsMCwuMDEpKSkucik7cy5hc3NpZ24oayhpLG8sYSkpfSkscy5ub3JtYWxpemUoKX0pO2NvbnN0IHlpPUN1KFpzKCksb3MoImZhY2VJbmRleCIpKS5ub3JtYWxpemUoKTtrKHlpLngseWkueS5uZWdhdGUoKSx5aS56KTtjbGFzcyBQdCBleHRlbmRzIElle3N0YXRpYyBnZXQgdHlwZSgpe3JldHVybiJUaW1lck5vZGUifWNvbnN0cnVjdG9yKHQ9UHQuTE9DQUwsZT0xLHM9MCl7c3VwZXIocyksdGhpcy5zY29wZT10LHRoaXMuc2NhbGU9ZSx0aGlzLnVwZGF0ZVR5cGU9US5GUkFNRX11cGRhdGUodCl7Y29uc3QgZT10aGlzLnNjb3BlLHM9dGhpcy5zY2FsZTtlPT09UHQuTE9DQUw/dGhpcy52YWx1ZSs9dC5kZWx0YVRpbWUqczplPT09UHQuREVMVEE/dGhpcy52YWx1ZT10LmRlbHRhVGltZSpzOmU9PT1QdC5GUkFNRT90aGlzLnZhbHVlPXQuZnJhbWVJZDp0aGlzLnZhbHVlPXQudGltZSpzfXNlcmlhbGl6ZSh0KXtzdXBlci5zZXJpYWxpemUodCksdC5zY29wZT10aGlzLnNjb3BlLHQuc2NhbGU9dGhpcy5zY2FsZX1kZXNlcmlhbGl6ZSh0KXtzdXBlci5kZXNlcmlhbGl6ZSh0KSx0aGlzLnNjb3BlPXQuc2NvcGUsdGhpcy5zY2FsZT10LnNjYWxlfX1QdC5MT0NBTD0ibG9jYWwiLFB0LkdMT0JBTD0iZ2xvYmFsIixQdC5ERUxUQT0iZGVsdGEiLFB0LkZSQU1FPSJmcmFtZSI7Y29uc3QgRnU9KHIsdD0wKT0+dihuZXcgUHQoUHQuTE9DQUwscix0KSk7Y2xhc3MgcnQgZXh0ZW5kcyBVe3N0YXRpYyBnZXQgdHlwZSgpe3JldHVybiJPc2NOb2RlIn1jb25zdHJ1Y3Rvcih0PXJ0LlNJTkUsZT1GdSgpKXtzdXBlcigpLHRoaXMubWV0aG9kPXQsdGhpcy50aW1lTm9kZT1lfWdldE5vZGVUeXBlKHQpe3JldHVybiB0aGlzLnRpbWVOb2RlLmdldE5vZGVUeXBlKHQpfXNldHVwKCl7Y29uc3QgdD10aGlzLm1ldGhvZCxlPXYodGhpcy50aW1lTm9kZSk7bGV0IHM9bnVsbDtyZXR1cm4gdD09PXJ0LlNJTkU/cz1lLmFkZCguNzUpLm11bChNYXRoLlBJKjIpLnNpbigpLm11bCguNSkuYWRkKC41KTp0PT09cnQuU1FVQVJFP3M9ZS5mcmFjdCgpLnJvdW5kKCk6dD09PXJ0LlRSSUFOR0xFP3M9ZS5hZGQoLjUpLmZyYWN0KCkubXVsKDIpLnN1YigxKS5hYnMoKTp0PT09cnQuU0FXVE9PVEgmJihzPWUuZnJhY3QoKSksc31zZXJpYWxpemUodCl7c3VwZXIuc2VyaWFsaXplKHQpLHQubWV0aG9kPXRoaXMubWV0aG9kfWRlc2VyaWFsaXplKHQpe3N1cGVyLmRlc2VyaWFsaXplKHQpLHRoaXMubWV0aG9kPXQubWV0aG9kfX1ydC5TSU5FPSJzaW5lIixydC5TUVVBUkU9InNxdWFyZSIscnQuVFJJQU5HTEU9InRyaWFuZ2xlIixydC5TQVdUT09USD0ic2F3dG9vdGgiLHJ0LlNJTkUscnQuU1FVQVJFLHJ0LlRSSUFOR0xFLHJ0LlNBV1RPT1RILG5ldyBYbixuZXcgQSxuZXcgQSxuZXcgQSxuZXcgbnQsbmV3IEEoMCwwLC0xKSxuZXcgRnQsbmV3IEEsbmV3IEEsbmV3IEZ0LG5ldyBKLG5ldyBvcixwaS5mbGlwWCgpO2NsYXNzIFV0IGV4dGVuZHMgVXtzdGF0aWMgZ2V0IHR5cGUoKXtyZXR1cm4iU2NlbmVOb2RlIn1jb25zdHJ1Y3Rvcih0PVV0LkJBQ0tHUk9VTkRfQkxVUlJJTkVTUyxlPW51bGwpe3N1cGVyKCksdGhpcy5zY29wZT10LHRoaXMuc2NlbmU9ZX1zZXR1cCh0KXtjb25zdCBlPXRoaXMuc2NvcGUscz10aGlzLnNjZW5lIT09bnVsbD90aGlzLnNjZW5lOnQuc2NlbmU7bGV0IG47cmV0dXJuIGU9PT1VdC5CQUNLR1JPVU5EX0JMVVJSSU5FU1M/bj1wZSgiYmFja2dyb3VuZEJsdXJyaW5lc3MiLCJmbG9hdCIscyk6ZT09PVV0LkJBQ0tHUk9VTkRfSU5URU5TSVRZP249cGUoImJhY2tncm91bmRJbnRlbnNpdHkiLCJmbG9hdCIscyk6Y29uc29sZS5lcnJvcigiVEhSRUUuU2NlbmVOb2RlOiBVbmtub3duIHNjb3BlOiIsZSksbn19VXQuQkFDS0dST1VORF9CTFVSUklORVNTPSJiYWNrZ3JvdW5kQmx1cnJpbmVzcyIsVXQuQkFDS0dST1VORF9JTlRFTlNJVFk9ImJhY2tncm91bmRJbnRlbnNpdHkiLFV0LkJBQ0tHUk9VTkRfQkxVUlJJTkVTUyxVdC5CQUNLR1JPVU5EX0lOVEVOU0lUWTtjb25zdCBSdT1uZXcgSjtjbGFzcyBCdSBleHRlbmRzIEpze3N0YXRpYyBnZXQgdHlwZSgpe3JldHVybiJQYXNzVGV4dHVyZU5vZGUifWNvbnN0cnVjdG9yKHQsZSl7c3VwZXIoZSksdGhpcy5wYXNzTm9kZT10LHRoaXMuc2V0VXBkYXRlTWF0cml4KCExKX1zZXR1cCh0KXtyZXR1cm4gdC5vYmplY3QuaXNRdWFkTWVzaCYmdGhpcy5wYXNzTm9kZS5idWlsZCh0KSxzdXBlci5zZXR1cCh0KX1jbG9uZSgpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3Rvcih0aGlzLnBhc3NOb2RlLHRoaXMudmFsdWUpfX1jbGFzcyBobyBleHRlbmRzIEJ1e3N0YXRpYyBnZXQgdHlwZSgpe3JldHVybiJQYXNzTXVsdGlwbGVUZXh0dXJlTm9kZSJ9Y29uc3RydWN0b3IodCxlLHM9ITEpe3N1cGVyKHQsbnVsbCksdGhpcy50ZXh0dXJlTmFtZT1lLHRoaXMucHJldmlvdXNUZXh0dXJlPXN9dXBkYXRlVGV4dHVyZSgpe3RoaXMudmFsdWU9dGhpcy5wcmV2aW91c1RleHR1cmU/dGhpcy5wYXNzTm9kZS5nZXRQcmV2aW91c1RleHR1cmUodGhpcy50ZXh0dXJlTmFtZSk6dGhpcy5wYXNzTm9kZS5nZXRUZXh0dXJlKHRoaXMudGV4dHVyZU5hbWUpfXNldHVwKHQpe3JldHVybiB0aGlzLnVwZGF0ZVRleHR1cmUoKSxzdXBlci5zZXR1cCh0KX1jbG9uZSgpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3Rvcih0aGlzLnBhc3NOb2RlLHRoaXMudGV4dHVyZU5hbWUsdGhpcy5wcmV2aW91c1RleHR1cmUpfX1jbGFzcyB0biBleHRlbmRzIGR0e3N0YXRpYyBnZXQgdHlwZSgpe3JldHVybiJQYXNzTm9kZSJ9Y29uc3RydWN0b3IodCxlLHMsbj17fSl7c3VwZXIoInZlYzQiKSx0aGlzLnNjb3BlPXQsdGhpcy5zY2VuZT1lLHRoaXMuY2FtZXJhPXMsdGhpcy5vcHRpb25zPW4sdGhpcy5fcGl4ZWxSYXRpbz0xLHRoaXMuX3dpZHRoPTEsdGhpcy5faGVpZ2h0PTE7Y29uc3QgaT1uZXcgeHI7aS5pc1JlbmRlclRhcmdldFRleHR1cmU9ITAsaS5uYW1lPSJkZXB0aCI7Y29uc3Qgbz1uZXcgb3IodGhpcy5fd2lkdGgqdGhpcy5fcGl4ZWxSYXRpbyx0aGlzLl9oZWlnaHQqdGhpcy5fcGl4ZWxSYXRpbyx7dHlwZTp2bywuLi5ufSk7by50ZXh0dXJlLm5hbWU9Im91dHB1dCIsby5kZXB0aFRleHR1cmU9aSx0aGlzLnJlbmRlclRhcmdldD1vLHRoaXMudXBkYXRlQmVmb3JlVHlwZT1RLkZSQU1FLHRoaXMuX3RleHR1cmVzPXtvdXRwdXQ6by50ZXh0dXJlLGRlcHRoOml9LHRoaXMuX3RleHR1cmVOb2Rlcz17fSx0aGlzLl9saW5lYXJEZXB0aE5vZGVzPXt9LHRoaXMuX3ZpZXdaTm9kZXM9e30sdGhpcy5fcHJldmlvdXNUZXh0dXJlcz17fSx0aGlzLl9wcmV2aW91c1RleHR1cmVOb2Rlcz17fSx0aGlzLl9jYW1lcmFOZWFyPXh0KDApLHRoaXMuX2NhbWVyYUZhcj14dCgwKSx0aGlzLl9tcnQ9bnVsbCx0aGlzLmlzUGFzc05vZGU9ITB9c2V0TVJUKHQpe3JldHVybiB0aGlzLl9tcnQ9dCx0aGlzfWdldE1SVCgpe3JldHVybiB0aGlzLl9tcnR9aXNHbG9iYWwoKXtyZXR1cm4hMH1nZXRUZXh0dXJlKHQpe2xldCBlPXRoaXMuX3RleHR1cmVzW3RdO3JldHVybiBlPT09dm9pZCAwJiYoZT10aGlzLnJlbmRlclRhcmdldC50ZXh0dXJlLmNsb25lKCksZS5pc1JlbmRlclRhcmdldFRleHR1cmU9ITAsZS5uYW1lPXQsdGhpcy5fdGV4dHVyZXNbdF09ZSx0aGlzLnJlbmRlclRhcmdldC50ZXh0dXJlcy5wdXNoKGUpKSxlfWdldFByZXZpb3VzVGV4dHVyZSh0KXtsZXQgZT10aGlzLl9wcmV2aW91c1RleHR1cmVzW3RdO3JldHVybiBlPT09dm9pZCAwJiYoZT10aGlzLmdldFRleHR1cmUodCkuY2xvbmUoKSxlLmlzUmVuZGVyVGFyZ2V0VGV4dHVyZT0hMCx0aGlzLl9wcmV2aW91c1RleHR1cmVzW3RdPWUpLGV9dG9nZ2xlVGV4dHVyZSh0KXtjb25zdCBlPXRoaXMuX3ByZXZpb3VzVGV4dHVyZXNbdF07aWYoZSE9PXZvaWQgMCl7Y29uc3Qgcz10aGlzLl90ZXh0dXJlc1t0XSxuPXRoaXMucmVuZGVyVGFyZ2V0LnRleHR1cmVzLmluZGV4T2Yocyk7dGhpcy5yZW5kZXJUYXJnZXQudGV4dHVyZXNbbl09ZSx0aGlzLl90ZXh0dXJlc1t0XT1lLHRoaXMuX3ByZXZpb3VzVGV4dHVyZXNbdF09cyx0aGlzLl90ZXh0dXJlTm9kZXNbdF0udXBkYXRlVGV4dHVyZSgpLHRoaXMuX3ByZXZpb3VzVGV4dHVyZU5vZGVzW3RdLnVwZGF0ZVRleHR1cmUoKX19Z2V0VGV4dHVyZU5vZGUodD0ib3V0cHV0Iil7bGV0IGU9dGhpcy5fdGV4dHVyZU5vZGVzW3RdO3JldHVybiBlPT09dm9pZCAwJiYodGhpcy5fdGV4dHVyZU5vZGVzW3RdPWU9dihuZXcgaG8odGhpcyx0KSksdGhpcy5fdGV4dHVyZU5vZGVzW3RdLnVwZGF0ZVRleHR1cmUoKSksZX1nZXRQcmV2aW91c1RleHR1cmVOb2RlKHQ9Im91dHB1dCIpe2xldCBlPXRoaXMuX3ByZXZpb3VzVGV4dHVyZU5vZGVzW3RdO3JldHVybiBlPT09dm9pZCAwJiYodGhpcy5fdGV4dHVyZU5vZGVzW3RdPT09dm9pZCAwJiZ0aGlzLmdldFRleHR1cmVOb2RlKHQpLHRoaXMuX3ByZXZpb3VzVGV4dHVyZU5vZGVzW3RdPWU9dihuZXcgaG8odGhpcyx0LCEwKSksdGhpcy5fcHJldmlvdXNUZXh0dXJlTm9kZXNbdF0udXBkYXRlVGV4dHVyZSgpKSxlfWdldFZpZXdaTm9kZSh0PSJkZXB0aCIpe2xldCBlPXRoaXMuX3ZpZXdaTm9kZXNbdF07aWYoZT09PXZvaWQgMCl7Y29uc3Qgcz10aGlzLl9jYW1lcmFOZWFyLG49dGhpcy5fY2FtZXJhRmFyO3RoaXMuX3ZpZXdaTm9kZXNbdF09ZT1hbyh0aGlzLmdldFRleHR1cmVOb2RlKHQpLHMsbil9cmV0dXJuIGV9Z2V0TGluZWFyRGVwdGhOb2RlKHQ9ImRlcHRoIil7bGV0IGU9dGhpcy5fbGluZWFyRGVwdGhOb2Rlc1t0XTtpZihlPT09dm9pZCAwKXtjb25zdCBzPXRoaXMuX2NhbWVyYU5lYXIsbj10aGlzLl9jYW1lcmFGYXIsaT10aGlzLmdldFZpZXdaTm9kZSh0KTt0aGlzLl9saW5lYXJEZXB0aE5vZGVzW3RdPWU9S3MoaSxzLG4pfXJldHVybiBlfXNldHVwKHtyZW5kZXJlcjp0fSl7cmV0dXJuIHRoaXMucmVuZGVyVGFyZ2V0LnNhbXBsZXM9dGhpcy5vcHRpb25zLnNhbXBsZXM9PT12b2lkIDA/dC5zYW1wbGVzOnRoaXMub3B0aW9ucy5zYW1wbGVzLHQuYmFja2VuZC5pc1dlYkdMQmFja2VuZD09PSEwJiYodGhpcy5yZW5kZXJUYXJnZXQuc2FtcGxlcz0wKSx0aGlzLnJlbmRlclRhcmdldC5kZXB0aFRleHR1cmUuaXNNdWx0aXNhbXBsZVJlbmRlclRhcmdldFRleHR1cmU9dGhpcy5yZW5kZXJUYXJnZXQuc2FtcGxlcz4xLHRoaXMuc2NvcGU9PT10bi5DT0xPUj90aGlzLmdldFRleHR1cmVOb2RlKCk6dGhpcy5nZXRMaW5lYXJEZXB0aE5vZGUoKX11cGRhdGVCZWZvcmUodCl7Y29uc3R7cmVuZGVyZXI6ZX09dCx7c2NlbmU6cyxjYW1lcmE6bn09dGhpczt0aGlzLl9waXhlbFJhdGlvPWUuZ2V0UGl4ZWxSYXRpbygpO2NvbnN0IGk9ZS5nZXRTaXplKFJ1KTt0aGlzLnNldFNpemUoaS53aWR0aCxpLmhlaWdodCk7Y29uc3Qgbz1lLmdldFJlbmRlclRhcmdldCgpLGE9ZS5nZXRNUlQoKTt0aGlzLl9jYW1lcmFOZWFyLnZhbHVlPW4ubmVhcix0aGlzLl9jYW1lcmFGYXIudmFsdWU9bi5mYXI7Zm9yKGNvbnN0IGMgaW4gdGhpcy5fcHJldmlvdXNUZXh0dXJlcyl0aGlzLnRvZ2dsZVRleHR1cmUoYyk7ZS5zZXRSZW5kZXJUYXJnZXQodGhpcy5yZW5kZXJUYXJnZXQpLGUuc2V0TVJUKHRoaXMuX21ydCksZS5yZW5kZXIocyxuKSxlLnNldFJlbmRlclRhcmdldChvKSxlLnNldE1SVChhKX1zZXRTaXplKHQsZSl7dGhpcy5fd2lkdGg9dCx0aGlzLl9oZWlnaHQ9ZTtjb25zdCBzPXRoaXMuX3dpZHRoKnRoaXMuX3BpeGVsUmF0aW8sbj10aGlzLl9oZWlnaHQqdGhpcy5fcGl4ZWxSYXRpbzt0aGlzLnJlbmRlclRhcmdldC5zZXRTaXplKHMsbil9c2V0UGl4ZWxSYXRpbyh0KXt0aGlzLl9waXhlbFJhdGlvPXQsdGhpcy5zZXRTaXplKHRoaXMuX3dpZHRoLHRoaXMuX2hlaWdodCl9ZGlzcG9zZSgpe3RoaXMucmVuZGVyVGFyZ2V0LmRpc3Bvc2UoKX19dG4uQ09MT1I9ImNvbG9yIix0bi5ERVBUSD0iZGVwdGgiLHR0KCh7ZGVwdGhUZXh0dXJlOnIsc2hhZG93Q29vcmQ6dH0pPT5hcyhyLHQueHkpLmNvbXBhcmUodC56KSksdHQoKHtkZXB0aFRleHR1cmU6cixzaGFkb3dDb29yZDp0LHNoYWRvdzplfSk9Pntjb25zdCBzPShtLGcpPT5hcyhyLG0pLmNvbXBhcmUoZyksbj1wZSgibWFwU2l6ZSIsInZlYzIiLGUpLnNldEdyb3VwKGRlKSxpPXBlKCJyYWRpdXMiLCJmbG9hdCIsZSkuc2V0R3JvdXAoZGUpLG89RCgxKS5kaXYobiksYT1vLngubmVnYXRlKCkubXVsKGkpLGM9by55Lm5lZ2F0ZSgpLm11bChpKSx1PW8ueC5tdWwoaSksaD1vLnkubXVsKGkpLGw9YS5kaXYoMiksZD1jLmRpdigyKSxmPXUuZGl2KDIpLHA9aC5kaXYoMik7cmV0dXJuIGZlKHModC54eS5hZGQoRChhLGMpKSx0LnopLHModC54eS5hZGQoRCgwLGMpKSx0LnopLHModC54eS5hZGQoRCh1LGMpKSx0LnopLHModC54eS5hZGQoRChsLGQpKSx0LnopLHModC54eS5hZGQoRCgwLGQpKSx0LnopLHModC54eS5hZGQoRChmLGQpKSx0LnopLHModC54eS5hZGQoRChhLDApKSx0LnopLHModC54eS5hZGQoRChsLDApKSx0LnopLHModC54eSx0LnopLHModC54eS5hZGQoRChmLDApKSx0LnopLHModC54eS5hZGQoRCh1LDApKSx0LnopLHModC54eS5hZGQoRChsLHApKSx0LnopLHModC54eS5hZGQoRCgwLHApKSx0LnopLHModC54eS5hZGQoRChmLHApKSx0LnopLHModC54eS5hZGQoRChhLGgpKSx0LnopLHModC54eS5hZGQoRCgwLGgpKSx0LnopLHModC54eS5hZGQoRCh1LGgpKSx0LnopKS5tdWwoMS8xNyl9KSx0dCgoe2RlcHRoVGV4dHVyZTpyLHNoYWRvd0Nvb3JkOnQsc2hhZG93OmV9KT0+e2NvbnN0IHM9KGgsbCk9PmFzKHIsaCkuY29tcGFyZShsKSxuPXBlKCJtYXBTaXplIiwidmVjMiIsZSkuc2V0R3JvdXAoZGUpLGk9RCgxKS5kaXYobiksbz1pLngsYT1pLnksYz10Lnh5LHU9cmkoYy5tdWwobikuYWRkKC41KSk7cmV0dXJuIGMuc3ViQXNzaWduKHUubXVsKGkpKSxmZShzKGMsdC56KSxzKGMuYWRkKEQobywwKSksdC56KSxzKGMuYWRkKEQoMCxhKSksdC56KSxzKGMuYWRkKGkpLHQueikscmUocyhjLmFkZChEKG8ubmVnYXRlKCksMCkpLHQueikscyhjLmFkZChEKG8ubXVsKDIpLDApKSx0LnopLHUueCkscmUocyhjLmFkZChEKG8ubmVnYXRlKCksYSkpLHQueikscyhjLmFkZChEKG8ubXVsKDIpLGEpKSx0LnopLHUueCkscmUocyhjLmFkZChEKDAsYS5uZWdhdGUoKSkpLHQueikscyhjLmFkZChEKDAsYS5tdWwoMikpKSx0LnopLHUueSkscmUocyhjLmFkZChEKG8sYS5uZWdhdGUoKSkpLHQueikscyhjLmFkZChEKG8sYS5tdWwoMikpKSx0LnopLHUueSkscmUocmUocyhjLmFkZChEKG8ubmVnYXRlKCksYS5uZWdhdGUoKSkpLHQueikscyhjLmFkZChEKG8ubXVsKDIpLGEubmVnYXRlKCkpKSx0LnopLHUueCkscmUocyhjLmFkZChEKG8ubmVnYXRlKCksYS5tdWwoMikpKSx0LnopLHMoYy5hZGQoRChvLm11bCgyKSxhLm11bCgyKSkpLHQueiksdS54KSx1LnkpKS5tdWwoMS85KX0pLHR0KCh7ZGVwdGhUZXh0dXJlOnIsc2hhZG93Q29vcmQ6dH0pPT57Y29uc3QgZT1xKDEpLnRvVmFyKCkscz1hcyhyKS51dih0Lnh5KS5yZyxuPWtyKHQueixzLngpO3JldHVybiBuaShuLm5vdEVxdWFsKHEoMSkpLCgpPT57Y29uc3QgaT10Lnouc3ViKHMueCksbz1haSgwLHMueS5tdWwocy55KSk7bGV0IGE9by5kaXYoby5hZGQoaS5tdWwoaSkpKTthPVdzKCRzKGEsLjMpLmRpdiguOTUtLjMpKSxlLmFzc2lnbihXcyhhaShuLGEpKSl9KSxlfSksdHQoKHtzYW1wbGVzOnIscmFkaXVzOnQsc2l6ZTplLHNoYWRvd1Bhc3M6c30pPT57Y29uc3Qgbj1xKDApLnRvVmFyKCksaT1xKDApLnRvVmFyKCksbz1yLmxlc3NUaGFuRXF1YWwocSgxKSkuc2VsZWN0KHEoMCkscSgyKS5kaXYoci5zdWIoMSkpKSxhPXIubGVzc1RoYW5FcXVhbChxKDEpKS5zZWxlY3QocSgwKSxxKC0xKSk7T2Uoe3N0YXJ0OlJlKDApLGVuZDpSZShyKSx0eXBlOiJpbnQiLGNvbmRpdGlvbjoiPCJ9LCh7aTp1fSk9Pntjb25zdCBoPWEuYWRkKHEodSkubXVsKG8pKSxsPXMudXYoZmUoUXMueHksRCgwLGgpLm11bCh0KSkuZGl2KGUpKS54O24uYWRkQXNzaWduKGwpLGkuYWRkQXNzaWduKGwubXVsKGwpKX0pLG4uZGl2QXNzaWduKHIpLGkuZGl2QXNzaWduKHIpO2NvbnN0IGM9aWkoaS5zdWIobi5tdWwobikpKTtyZXR1cm4gRChuLGMpfSksdHQoKHtzYW1wbGVzOnIscmFkaXVzOnQsc2l6ZTplLHNoYWRvd1Bhc3M6c30pPT57Y29uc3Qgbj1xKDApLnRvVmFyKCksaT1xKDApLnRvVmFyKCksbz1yLmxlc3NUaGFuRXF1YWwocSgxKSkuc2VsZWN0KHEoMCkscSgyKS5kaXYoci5zdWIoMSkpKSxhPXIubGVzc1RoYW5FcXVhbChxKDEpKS5zZWxlY3QocSgwKSxxKC0xKSk7T2Uoe3N0YXJ0OlJlKDApLGVuZDpSZShyKSx0eXBlOiJpbnQiLGNvbmRpdGlvbjoiPCJ9LCh7aTp1fSk9Pntjb25zdCBoPWEuYWRkKHEodSkubXVsKG8pKSxsPXMudXYoZmUoUXMueHksRChoLDApLm11bCh0KSkuZGl2KGUpKTtuLmFkZEFzc2lnbihsLngpLGkuYWRkQXNzaWduKGZlKGwueS5tdWwobC55KSxsLngubXVsKGwueCkpKX0pLG4uZGl2QXNzaWduKHIpLGkuZGl2QXNzaWduKHIpO2NvbnN0IGM9aWkoaS5zdWIobi5tdWwobikpKTtyZXR1cm4gRChuLGMpfSksaygxLjY2MDUsLS4xMjQ2LC0uMDE4MiksaygtLjU4NzYsMS4xMzI5LC0uMTAwNiksaygtLjA3MjgsLS4wMDgzLDEuMTE4NyksayguNjI3NCwuMDY5MSwuMDE2NCksayguMzI5MywuOTE5NSwuMDg4KSxrKC4wNDMzLC4wMTEzLC44OTU2KTtjbGFzcyBJdSBleHRlbmRzIFV7Y29uc3RydWN0b3IodCl7c3VwZXIoKSx0aGlzLnNjb3BlPXR9Z2VuZXJhdGUodCl7Y29uc3R7c2NvcGU6ZX09dGhpcyx7cmVuZGVyZXI6c309dDtzLmJhY2tlbmQuaXNXZWJHTEJhY2tlbmQ9PT0hMD90LmFkZEZsb3dDb2RlKGAJLy8gJHtlfUJhcnJpZXIgCmApOnQuYWRkTGluZUZsb3dDb2RlKGAke2V9QmFycmllcigpYCx0aGlzKX19QyhJdSk7Y2xhc3Mga3QgZXh0ZW5kcyBkdHtzdGF0aWMgZ2V0IHR5cGUoKXtyZXR1cm4iQXRvbWljRnVuY3Rpb25Ob2RlIn1jb25zdHJ1Y3Rvcih0LGUscyxuPW51bGwpe3N1cGVyKCJ1aW50IiksdGhpcy5tZXRob2Q9dCx0aGlzLnBvaW50ZXJOb2RlPWUsdGhpcy52YWx1ZU5vZGU9cyx0aGlzLnN0b3JlTm9kZT1ufWdldElucHV0VHlwZSh0KXtyZXR1cm4gdGhpcy5wb2ludGVyTm9kZS5nZXROb2RlVHlwZSh0KX1nZXROb2RlVHlwZSh0KXtyZXR1cm4gdGhpcy5nZXRJbnB1dFR5cGUodCl9Z2VuZXJhdGUodCl7Y29uc3QgZT10aGlzLm1ldGhvZCxzPXRoaXMuZ2V0Tm9kZVR5cGUodCksbj10aGlzLmdldElucHV0VHlwZSh0KSxpPXRoaXMucG9pbnRlck5vZGUsbz10aGlzLnZhbHVlTm9kZSxhPVtdO2EucHVzaChgJiR7aS5idWlsZCh0LG4pfWApLGEucHVzaChvLmJ1aWxkKHQsbikpO2NvbnN0IGM9YCR7dC5nZXRNZXRob2QoZSxzKX0oICR7YS5qb2luKCIsICIpfSApYDtpZih0aGlzLnN0b3JlTm9kZSE9PW51bGwpe2NvbnN0IHU9dGhpcy5zdG9yZU5vZGUuYnVpbGQodCxuKTt0LmFkZExpbmVGbG93Q29kZShgJHt1fSA9ICR7Y31gLHRoaXMpfWVsc2UgdC5hZGRMaW5lRmxvd0NvZGUoYyx0aGlzKX19aWYoa3QuQVRPTUlDX0xPQUQ9ImF0b21pY0xvYWQiLGt0LkFUT01JQ19TVE9SRT0iYXRvbWljU3RvcmUiLGt0LkFUT01JQ19BREQ9ImF0b21pY0FkZCIsa3QuQVRPTUlDX1NVQj0iYXRvbWljU3ViIixrdC5BVE9NSUNfTUFYPSJhdG9taWNNYXgiLGt0LkFUT01JQ19NSU49ImF0b21pY01pbiIsa3QuQVRPTUlDX0FORD0iYXRvbWljQW5kIixrdC5BVE9NSUNfT1I9ImF0b21pY09yIixrdC5BVE9NSUNfWE9SPSJhdG9taWNYb3IiLEMoa3QpLHR5cGVvZiBfX1RIUkVFX0RFVlRPT0xTX188InUiJiZfX1RIUkVFX0RFVlRPT0xTX18uZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoInJlZ2lzdGVyIix7ZGV0YWlsOntyZXZpc2lvbjpYZX19KSksdHlwZW9mIHdpbmRvdzwidSIpe3RyeXtBbiYmQW4udGFnTmFtZS50b1VwcGVyQ2FzZSgpPT09IlNDUklQVCImJkFuLnNyY3x8bmV3IFVSTCgiYXNzZXRzL2dlbmVyYXRlTWVzaEJWSC53b3JrZXItYjc3ODg5MzkuanMiLGRvY3VtZW50LmJhc2VVUkkpLmhyZWYsd2luZG93Ll9fVEhSRUVfX0lNUE9SVFNfX3x8KHdpbmRvdy5fX1RIUkVFX19JTVBPUlRTX189W10pLHdpbmRvdy5fX1RIUkVFX19JTVBPUlRTX18ucHVzaCh7dXJsOnNlbGYubG9jYXRpb24uaHJlZixyZXZpc2lvbjpYZX0pfWNhdGNoe313aW5kb3cuX19USFJFRV9fPyhjb25zb2xlLndhcm4oIldBUk5JTkc6IE11bHRpcGxlIGluc3RhbmNlcyBvZiBUaHJlZS5qcyBiZWluZyBpbXBvcnRlZC4gRXhpc3Rpbmc6ICIrd2luZG93Ll9fVEhSRUVfXysiLCBuZXc6ICIrWGUpLGNvbnNvbGUud2Fybih3aW5kb3cuX19USFJFRV9fSU1QT1JUU19fKSk6d2luZG93Ll9fVEhSRUVfXz1YZX1jb25zdCB1bz0wLHZ1PTEsUHU9Mixsbz0yLGdpPTEuMjUsZm89MSxtcz02KjQrNCs0LGVuPTY1NTM1LEx1PU1hdGgucG93KDIsLTI0KSx4aT1TeW1ib2woIlNLSVBfR0VORVJBVElPTiIpO2Z1bmN0aW9uIE91KHIpe3JldHVybiByLmluZGV4P3IuaW5kZXguY291bnQ6ci5hdHRyaWJ1dGVzLnBvc2l0aW9uLmNvdW50fWZ1bmN0aW9uIERlKHIpe3JldHVybiBPdShyKS8zfWZ1bmN0aW9uIER1KHIsdD1BcnJheUJ1ZmZlcil7cmV0dXJuIHI+NjU1MzU/bmV3IFVpbnQzMkFycmF5KG5ldyB0KDQqcikpOm5ldyBVaW50MTZBcnJheShuZXcgdCgyKnIpKX1mdW5jdGlvbiBWdShyLHQpe2lmKCFyLmluZGV4KXtjb25zdCBlPXIuYXR0cmlidXRlcy5wb3NpdGlvbi5jb3VudCxzPXQudXNlU2hhcmVkQXJyYXlCdWZmZXI/U2hhcmVkQXJyYXlCdWZmZXI6QXJyYXlCdWZmZXIsbj1EdShlLHMpO3Iuc2V0SW5kZXgobmV3IHZ0KG4sMSkpO2ZvcihsZXQgaT0wO2k8ZTtpKyspbltpXT1pfX1mdW5jdGlvbiBwbyhyLHQpe2NvbnN0IGU9RGUocikscz10fHxyLmRyYXdSYW5nZSxuPXMuc3RhcnQvMyxpPShzLnN0YXJ0K3MuY291bnQpLzMsbz1NYXRoLm1heCgwLG4pLGE9TWF0aC5taW4oZSxpKS1vO3JldHVyblt7b2Zmc2V0Ok1hdGguZmxvb3IobyksY291bnQ6TWF0aC5mbG9vcihhKX1dfWZ1bmN0aW9uIG1vKHIsdCl7aWYoIXIuZ3JvdXBzfHwhci5ncm91cHMubGVuZ3RoKXJldHVybiBwbyhyLHQpO2NvbnN0IGU9W10scz1uZXcgU2V0LG49dHx8ci5kcmF3UmFuZ2UsaT1uLnN0YXJ0LzMsbz0obi5zdGFydCtuLmNvdW50KS8zO2Zvcihjb25zdCBjIG9mIHIuZ3JvdXBzKXtjb25zdCB1PWMuc3RhcnQvMyxoPShjLnN0YXJ0K2MuY291bnQpLzM7cy5hZGQoTWF0aC5tYXgoaSx1KSkscy5hZGQoTWF0aC5taW4obyxoKSl9Y29uc3QgYT1BcnJheS5mcm9tKHMudmFsdWVzKCkpLnNvcnQoKGMsdSk9PmMtdSk7Zm9yKGxldCBjPTA7YzxhLmxlbmd0aC0xO2MrKyl7Y29uc3QgdT1hW2NdLGg9YVtjKzFdO2UucHVzaCh7b2Zmc2V0Ok1hdGguZmxvb3IodSksY291bnQ6TWF0aC5mbG9vcihoLXUpfSl9cmV0dXJuIGV9ZnVuY3Rpb24gVXUocix0KXtjb25zdCBlPURlKHIpLHM9bW8ocix0KS5zb3J0KChvLGEpPT5vLm9mZnNldC1hLm9mZnNldCksbj1zW3MubGVuZ3RoLTFdO24uY291bnQ9TWF0aC5taW4oZS1uLm9mZnNldCxuLmNvdW50KTtsZXQgaT0wO3JldHVybiBzLmZvckVhY2goKHtjb3VudDpvfSk9PmkrPW8pLGUhPT1pfWZ1bmN0aW9uIFRpKHIsdCxlLHMsbil7bGV0IGk9MS8wLG89MS8wLGE9MS8wLGM9LTEvMCx1PS0xLzAsaD0tMS8wLGw9MS8wLGQ9MS8wLGY9MS8wLHA9LTEvMCxtPS0xLzAsZz0tMS8wO2ZvcihsZXQgeT10KjYsVD0odCtlKSo2O3k8VDt5Kz02KXtjb25zdCB3PXJbeSswXSxNPXJbeSsxXSxOPXctTSxfPXcrTTtOPGkmJihpPU4pLF8+YyYmKGM9XyksdzxsJiYobD13KSx3PnAmJihwPXcpO2NvbnN0IFM9clt5KzJdLEU9clt5KzNdLEY9Uy1FLFI9UytFO0Y8byYmKG89RiksUj51JiYodT1SKSxTPGQmJihkPVMpLFM+bSYmKG09Uyk7Y29uc3QgST1yW3krNF0sQj1yW3krNV0sUD1JLUIsTD1JK0I7UDxhJiYoYT1QKSxMPmgmJihoPUwpLEk8ZiYmKGY9SSksST5nJiYoZz1JKX1zWzBdPWksc1sxXT1vLHNbMl09YSxzWzNdPWMsc1s0XT11LHNbNV09aCxuWzBdPWwsblsxXT1kLG5bMl09ZixuWzNdPXAsbls0XT1tLG5bNV09Z31mdW5jdGlvbiBrdShyLHQ9bnVsbCxlPW51bGwscz1udWxsKXtjb25zdCBuPXIuYXR0cmlidXRlcy5wb3NpdGlvbixpPXIuaW5kZXg/ci5pbmRleC5hcnJheTpudWxsLG89RGUociksYT1uLm5vcm1hbGl6ZWQ7bGV0IGM7dD09PW51bGw/KGM9bmV3IEZsb2F0MzJBcnJheShvKjYpLGU9MCxzPW8pOihjPXQsZT1lfHwwLHM9c3x8byk7Y29uc3QgdT1uLmFycmF5LGg9bi5vZmZzZXR8fDA7bGV0IGw9MztuLmlzSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUmJihsPW4uZGF0YS5zdHJpZGUpO2NvbnN0IGQ9WyJnZXRYIiwiZ2V0WSIsImdldFoiXTtmb3IobGV0IGY9ZTtmPGUrcztmKyspe2NvbnN0IHA9ZiozLG09Zio2O2xldCBnPXArMCx5PXArMSxUPXArMjtpJiYoZz1pW2ddLHk9aVt5XSxUPWlbVF0pLGF8fChnPWcqbCtoLHk9eSpsK2gsVD1UKmwraCk7Zm9yKGxldCB3PTA7dzwzO3crKyl7bGV0IE0sTixfO2E/KE09bltkW3ddXShnKSxOPW5bZFt3XV0oeSksXz1uW2Rbd11dKFQpKTooTT11W2crd10sTj11W3krd10sXz11W1Qrd10pO2xldCBTPU07TjxTJiYoUz1OKSxfPFMmJihTPV8pO2xldCBFPU07Tj5FJiYoRT1OKSxfPkUmJihFPV8pO2NvbnN0IEY9KEUtUykvMixSPXcqMjtjW20rUiswXT1TK0YsY1ttK1IrMV09RisoTWF0aC5hYnMoUykrRikqTHV9fXJldHVybiBjfWZ1bmN0aW9uIFoocix0LGUpe3JldHVybiBlLm1pbi54PXRbcl0sZS5taW4ueT10W3IrMV0sZS5taW4uej10W3IrMl0sZS5tYXgueD10W3IrM10sZS5tYXgueT10W3IrNF0sZS5tYXguej10W3IrNV0sZX1mdW5jdGlvbiB5byhyKXtsZXQgdD0tMSxlPS0xLzA7Zm9yKGxldCBzPTA7czwzO3MrKyl7Y29uc3Qgbj1yW3MrM10tcltzXTtuPmUmJihlPW4sdD1zKX1yZXR1cm4gdH1mdW5jdGlvbiBnbyhyLHQpe3Quc2V0KHIpfWZ1bmN0aW9uIHhvKHIsdCxlKXtsZXQgcyxuO2ZvcihsZXQgaT0wO2k8MztpKyspe2NvbnN0IG89aSszO3M9cltpXSxuPXRbaV0sZVtpXT1zPG4/czpuLHM9cltvXSxuPXRbb10sZVtvXT1zPm4/czpufX1mdW5jdGlvbiBzbihyLHQsZSl7Zm9yKGxldCBzPTA7czwzO3MrKyl7Y29uc3Qgbj10W3IrMipzXSxpPXRbcisyKnMrMV0sbz1uLWksYT1uK2k7bzxlW3NdJiYoZVtzXT1vKSxhPmVbcyszXSYmKGVbcyszXT1hKX19ZnVuY3Rpb24geXMocil7Y29uc3QgdD1yWzNdLXJbMF0sZT1yWzRdLXJbMV0scz1yWzVdLXJbMl07cmV0dXJuIDIqKHQqZStlKnMrcyp0KX1jb25zdCBqdD0zMixIdT0ocix0KT0+ci5jYW5kaWRhdGUtdC5jYW5kaWRhdGUsb2U9bmV3IEFycmF5KGp0KS5maWxsKCkubWFwKCgpPT4oe2NvdW50OjAsYm91bmRzOm5ldyBGbG9hdDMyQXJyYXkoNikscmlnaHRDYWNoZUJvdW5kczpuZXcgRmxvYXQzMkFycmF5KDYpLGxlZnRDYWNoZUJvdW5kczpuZXcgRmxvYXQzMkFycmF5KDYpLGNhbmRpZGF0ZTowfSkpLG5uPW5ldyBGbG9hdDMyQXJyYXkoNik7ZnVuY3Rpb24gcXUocix0LGUscyxuLGkpe2xldCBvPS0xLGE9MDtpZihpPT09dW8pbz15byh0KSxvIT09LTEmJihhPSh0W29dK3RbbyszXSkvMik7ZWxzZSBpZihpPT09dnUpbz15byhyKSxvIT09LTEmJihhPSR1KGUscyxuLG8pKTtlbHNlIGlmKGk9PT1QdSl7Y29uc3QgYz15cyhyKTtsZXQgdT1naSpuO2NvbnN0IGg9cyo2LGw9KHMrbikqNjtmb3IobGV0IGQ9MDtkPDM7ZCsrKXtjb25zdCBmPXRbZF0sZz0odFtkKzNdLWYpL2p0O2lmKG48anQvNCl7Y29uc3QgeT1bLi4ub2VdO3kubGVuZ3RoPW47bGV0IFQ9MDtmb3IobGV0IE09aDtNPGw7TSs9NixUKyspe2NvbnN0IE49eVtUXTtOLmNhbmRpZGF0ZT1lW00rMipkXSxOLmNvdW50PTA7Y29uc3R7Ym91bmRzOl8sbGVmdENhY2hlQm91bmRzOlMscmlnaHRDYWNoZUJvdW5kczpFfT1OO2ZvcihsZXQgRj0wO0Y8MztGKyspRVtGXT0xLzAsRVtGKzNdPS0xLzAsU1tGXT0xLzAsU1tGKzNdPS0xLzAsX1tGXT0xLzAsX1tGKzNdPS0xLzA7c24oTSxlLF8pfXkuc29ydChIdSk7bGV0IHc9bjtmb3IobGV0IE09MDtNPHc7TSsrKXtjb25zdCBOPXlbTV07Zm9yKDtNKzE8dyYmeVtNKzFdLmNhbmRpZGF0ZT09PU4uY2FuZGlkYXRlOyl5LnNwbGljZShNKzEsMSksdy0tfWZvcihsZXQgTT1oO008bDtNKz02KXtjb25zdCBOPWVbTSsyKmRdO2ZvcihsZXQgXz0wO188dztfKyspe2NvbnN0IFM9eVtfXTtOPj1TLmNhbmRpZGF0ZT9zbihNLGUsUy5yaWdodENhY2hlQm91bmRzKTooc24oTSxlLFMubGVmdENhY2hlQm91bmRzKSxTLmNvdW50KyspfX1mb3IobGV0IE09MDtNPHc7TSsrKXtjb25zdCBOPXlbTV0sXz1OLmNvdW50LFM9bi1OLmNvdW50LEU9Ti5sZWZ0Q2FjaGVCb3VuZHMsRj1OLnJpZ2h0Q2FjaGVCb3VuZHM7bGV0IFI9MDtfIT09MCYmKFI9eXMoRSkvYyk7bGV0IEk9MDtTIT09MCYmKEk9eXMoRikvYyk7Y29uc3QgQj1mbytnaSooUipfK0kqUyk7Qjx1JiYobz1kLHU9QixhPU4uY2FuZGlkYXRlKX19ZWxzZXtmb3IobGV0IHc9MDt3PGp0O3crKyl7Y29uc3QgTT1vZVt3XTtNLmNvdW50PTAsTS5jYW5kaWRhdGU9ZitnK3cqZztjb25zdCBOPU0uYm91bmRzO2ZvcihsZXQgXz0wO188MztfKyspTltfXT0xLzAsTltfKzNdPS0xLzB9Zm9yKGxldCB3PWg7dzxsO3crPTYpe2xldCBfPX5+KChlW3crMipkXS1mKS9nKTtfPj1qdCYmKF89anQtMSk7Y29uc3QgUz1vZVtfXTtTLmNvdW50Kyssc24odyxlLFMuYm91bmRzKX1jb25zdCB5PW9lW2p0LTFdO2dvKHkuYm91bmRzLHkucmlnaHRDYWNoZUJvdW5kcyk7Zm9yKGxldCB3PWp0LTI7dz49MDt3LS0pe2NvbnN0IE09b2Vbd10sTj1vZVt3KzFdO3hvKE0uYm91bmRzLE4ucmlnaHRDYWNoZUJvdW5kcyxNLnJpZ2h0Q2FjaGVCb3VuZHMpfWxldCBUPTA7Zm9yKGxldCB3PTA7dzxqdC0xO3crKyl7Y29uc3QgTT1vZVt3XSxOPU0uY291bnQsXz1NLmJvdW5kcyxFPW9lW3crMV0ucmlnaHRDYWNoZUJvdW5kcztOIT09MCYmKFQ9PT0wP2dvKF8sbm4pOnhvKF8sbm4sbm4pKSxUKz1OO2xldCBGPTAsUj0wO1QhPT0wJiYoRj15cyhubikvYyk7Y29uc3QgST1uLVQ7SSE9PTAmJihSPXlzKEUpL2MpO2NvbnN0IEI9Zm8rZ2kqKEYqVCtSKkkpO0I8dSYmKG89ZCx1PUIsYT1NLmNhbmRpZGF0ZSl9fX19ZWxzZSBjb25zb2xlLndhcm4oYE1lc2hCVkg6IEludmFsaWQgYnVpbGQgc3RyYXRlZ3kgdmFsdWUgJHtpfSB1c2VkLmApO3JldHVybntheGlzOm8scG9zOmF9fWZ1bmN0aW9uICR1KHIsdCxlLHMpe2xldCBuPTA7Zm9yKGxldCBpPXQsbz10K2U7aTxvO2krKyluKz1yW2kqNitzKjJdO3JldHVybiBuL2V9Y2xhc3MgTml7Y29uc3RydWN0b3IoKXt0aGlzLmJvdW5kaW5nRGF0YT1uZXcgRmxvYXQzMkFycmF5KDYpfX1mdW5jdGlvbiBHdShyLHQsZSxzLG4saSl7bGV0IG89cyxhPXMrbi0xO2NvbnN0IGM9aS5wb3MsdT1pLmF4aXMqMjtmb3IoOzspe2Zvcig7bzw9YSYmZVtvKjYrdV08YzspbysrO2Zvcig7bzw9YSYmZVthKjYrdV0+PWM7KWEtLTtpZihvPGEpe2ZvcihsZXQgaD0wO2g8MztoKyspe2xldCBsPXRbbyozK2hdO3RbbyozK2hdPXRbYSozK2hdLHRbYSozK2hdPWx9Zm9yKGxldCBoPTA7aDw2O2grKyl7bGV0IGw9ZVtvKjYraF07ZVtvKjYraF09ZVthKjYraF0sZVthKjYraF09bH1vKyssYS0tfWVsc2UgcmV0dXJuIG99fWZ1bmN0aW9uIFd1KHIsdCxlLHMsbixpKXtsZXQgbz1zLGE9cytuLTE7Y29uc3QgYz1pLnBvcyx1PWkuYXhpcyoyO2Zvcig7Oyl7Zm9yKDtvPD1hJiZlW28qNit1XTxjOylvKys7Zm9yKDtvPD1hJiZlW2EqNit1XT49YzspYS0tO2lmKG88YSl7bGV0IGg9cltvXTtyW29dPXJbYV0sclthXT1oO2ZvcihsZXQgbD0wO2w8NjtsKyspe2xldCBkPWVbbyo2K2xdO2Vbbyo2K2xdPWVbYSo2K2xdLGVbYSo2K2xdPWR9bysrLGEtLX1lbHNlIHJldHVybiBvfX1mdW5jdGlvbiBwdChyLHQpe3JldHVybiB0W3IrMTVdPT09NjU1MzV9ZnVuY3Rpb24gVHQocix0KXtyZXR1cm4gdFtyKzZdfWZ1bmN0aW9uIFN0KHIsdCl7cmV0dXJuIHRbcisxNF19ZnVuY3Rpb24gX3Qocil7cmV0dXJuIHIrOH1mdW5jdGlvbiB6dChyLHQpe3JldHVybiB0W3IrNl19ZnVuY3Rpb24gVG8ocix0KXtyZXR1cm4gdFtyKzddfWZ1bmN0aW9uIGpsKHIpe3JldHVybiByfWxldCBObyxncyxybix3bztjb25zdCBYdT1NYXRoLnBvdygyLDMyKTtmdW5jdGlvbiB3aShyKXtyZXR1cm4iY291bnQiaW4gcj8xOjErd2koci5sZWZ0KSt3aShyLnJpZ2h0KX1mdW5jdGlvbiBZdShyLHQsZSl7cmV0dXJuIE5vPW5ldyBGbG9hdDMyQXJyYXkoZSksZ3M9bmV3IFVpbnQzMkFycmF5KGUpLHJuPW5ldyBVaW50MTZBcnJheShlKSx3bz1uZXcgVWludDhBcnJheShlKSxBaShyLHQpfWZ1bmN0aW9uIEFpKHIsdCl7Y29uc3QgZT1yLzQscz1yLzIsbj0iY291bnQiaW4gdCxpPXQuYm91bmRpbmdEYXRhO2ZvcihsZXQgbz0wO288NjtvKyspTm9bZStvXT1pW29dO2lmKG4paWYodC5idWZmZXIpe2NvbnN0IG89dC5idWZmZXI7d28uc2V0KG5ldyBVaW50OEFycmF5KG8pLHIpO2ZvcihsZXQgYT1yLGM9citvLmJ5dGVMZW5ndGg7YTxjO2ErPW1zKXtjb25zdCB1PWEvMjtwdCh1LHJuKXx8KGdzW2EvNCs2XSs9ZSl9cmV0dXJuIHIrby5ieXRlTGVuZ3RofWVsc2V7Y29uc3Qgbz10Lm9mZnNldCxhPXQuY291bnQ7cmV0dXJuIGdzW2UrNl09byxybltzKzE0XT1hLHJuW3MrMTVdPWVuLHIrbXN9ZWxzZXtjb25zdCBvPXQubGVmdCxhPXQucmlnaHQsYz10LnNwbGl0QXhpcztsZXQgdTtpZih1PUFpKHIrbXMsbyksdS80Plh1KXRocm93IG5ldyBFcnJvcigiTWVzaEJWSDogQ2Fubm90IHN0b3JlIGNoaWxkIHBvaW50ZXIgZ3JlYXRlciB0aGFuIDMyIGJpdHMuIik7cmV0dXJuIGdzW2UrNl09dS80LHU9QWkodSxhKSxnc1tlKzddPWMsdX19ZnVuY3Rpb24gWnUocix0KXtjb25zdCBlPShyLmluZGV4P3IuaW5kZXguY291bnQ6ci5hdHRyaWJ1dGVzLnBvc2l0aW9uLmNvdW50KS8zLHM9ZT4yKioxNixuPXM/NDoyLGk9dD9uZXcgU2hhcmVkQXJyYXlCdWZmZXIoZSpuKTpuZXcgQXJyYXlCdWZmZXIoZSpuKSxvPXM/bmV3IFVpbnQzMkFycmF5KGkpOm5ldyBVaW50MTZBcnJheShpKTtmb3IobGV0IGE9MCxjPW8ubGVuZ3RoO2E8YzthKyspb1thXT1hO3JldHVybiBvfWZ1bmN0aW9uIEp1KHIsdCxlLHMsbil7Y29uc3R7bWF4RGVwdGg6aSx2ZXJib3NlOm8sbWF4TGVhZlRyaXM6YSxzdHJhdGVneTpjLG9uUHJvZ3Jlc3M6dSxpbmRpcmVjdDpofT1uLGw9ci5faW5kaXJlY3RCdWZmZXIsZD1yLmdlb21ldHJ5LGY9ZC5pbmRleD9kLmluZGV4LmFycmF5Om51bGwscD1oP1d1Okd1LG09RGUoZCksZz1uZXcgRmxvYXQzMkFycmF5KDYpO2xldCB5PSExO2NvbnN0IFQ9bmV3IE5pO3JldHVybiBUaSh0LGUscyxULmJvdW5kaW5nRGF0YSxnKSxNKFQsZSxzLGcpLFQ7ZnVuY3Rpb24gdyhOKXt1JiZ1KE4vbSl9ZnVuY3Rpb24gTShOLF8sUyxFPW51bGwsRj0wKXtpZigheSYmRj49aSYmKHk9ITAsbyYmKGNvbnNvbGUud2FybihgTWVzaEJWSDogTWF4IGRlcHRoIG9mICR7aX0gcmVhY2hlZCB3aGVuIGdlbmVyYXRpbmcgQlZILiBDb25zaWRlciBpbmNyZWFzaW5nIG1heERlcHRoLmApLGNvbnNvbGUud2FybihkKSkpLFM8PWF8fEY+PWkpcmV0dXJuIHcoXytTKSxOLm9mZnNldD1fLE4uY291bnQ9UyxOO2NvbnN0IFI9cXUoTi5ib3VuZGluZ0RhdGEsRSx0LF8sUyxjKTtpZihSLmF4aXM9PT0tMSlyZXR1cm4gdyhfK1MpLE4ub2Zmc2V0PV8sTi5jb3VudD1TLE47Y29uc3QgST1wKGwsZix0LF8sUyxSKTtpZihJPT09X3x8ST09PV8rUyl3KF8rUyksTi5vZmZzZXQ9XyxOLmNvdW50PVM7ZWxzZXtOLnNwbGl0QXhpcz1SLmF4aXM7Y29uc3QgQj1uZXcgTmksUD1fLEw9SS1fO04ubGVmdD1CLFRpKHQsUCxMLEIuYm91bmRpbmdEYXRhLGcpLE0oQixQLEwsZyxGKzEpO2NvbnN0IFY9bmV3IE5pLEc9SSxOdD1TLUw7Ti5yaWdodD1WLFRpKHQsRyxOdCxWLmJvdW5kaW5nRGF0YSxnKSxNKFYsRyxOdCxnLEYrMSl9cmV0dXJuIE59fWZ1bmN0aW9uIGp1KHIsdCl7Y29uc3QgZT1yLmdlb21ldHJ5O3QuaW5kaXJlY3QmJihyLl9pbmRpcmVjdEJ1ZmZlcj1adShlLHQudXNlU2hhcmVkQXJyYXlCdWZmZXIpLFV1KGUsdC5yYW5nZSkmJiF0LnZlcmJvc2UmJmNvbnNvbGUud2FybignTWVzaEJWSDogUHJvdmlkZWQgZ2VvbWV0cnkgY29udGFpbnMgZ3JvdXBzIG9yIGEgcmFuZ2UgdGhhdCBkbyBub3QgZnVsbHkgc3BhbiB0aGUgdmVydGV4IGNvbnRlbnRzIHdoaWxlIHVzaW5nIHRoZSAiaW5kaXJlY3QiIG9wdGlvbi4gQlZIIG1heSBpbmNvcnJlY3RseSByZXBvcnQgaW50ZXJzZWN0aW9ucyBvbiB1bnJlbmRlcmVkIHBvcnRpb25zIG9mIHRoZSBnZW9tZXRyeS4nKSksci5faW5kaXJlY3RCdWZmZXJ8fFZ1KGUsdCk7Y29uc3Qgcz10LnVzZVNoYXJlZEFycmF5QnVmZmVyP1NoYXJlZEFycmF5QnVmZmVyOkFycmF5QnVmZmVyLG49a3UoZSksaT10LmluZGlyZWN0P3BvKGUsdC5yYW5nZSk6bW8oZSx0LnJhbmdlKTtyLl9yb290cz1pLm1hcChvPT57Y29uc3QgYT1KdShyLG4sby5vZmZzZXQsby5jb3VudCx0KSxjPXdpKGEpLHU9bmV3IHMobXMqYyk7cmV0dXJuIFl1KDAsYSx1KSx1fSl9Y2xhc3MgUXR7Y29uc3RydWN0b3IoKXt0aGlzLm1pbj0xLzAsdGhpcy5tYXg9LTEvMH1zZXRGcm9tUG9pbnRzRmllbGQodCxlKXtsZXQgcz0xLzAsbj0tMS8wO2ZvcihsZXQgaT0wLG89dC5sZW5ndGg7aTxvO2krKyl7Y29uc3QgYz10W2ldW2VdO3M9YzxzP2M6cyxuPWM+bj9jOm59dGhpcy5taW49cyx0aGlzLm1heD1ufXNldEZyb21Qb2ludHModCxlKXtsZXQgcz0xLzAsbj0tMS8wO2ZvcihsZXQgaT0wLG89ZS5sZW5ndGg7aTxvO2krKyl7Y29uc3QgYT1lW2ldLGM9dC5kb3QoYSk7cz1jPHM/YzpzLG49Yz5uP2M6bn10aGlzLm1pbj1zLHRoaXMubWF4PW59aXNTZXBhcmF0ZWQodCl7cmV0dXJuIHRoaXMubWluPnQubWF4fHx0Lm1pbj50aGlzLm1heH19UXQucHJvdG90eXBlLnNldEZyb21Cb3g9ZnVuY3Rpb24oKXtjb25zdCByPW5ldyBBO3JldHVybiBmdW5jdGlvbihlLHMpe2NvbnN0IG49cy5taW4saT1zLm1heDtsZXQgbz0xLzAsYT0tMS8wO2ZvcihsZXQgYz0wO2M8PTE7YysrKWZvcihsZXQgdT0wO3U8PTE7dSsrKWZvcihsZXQgaD0wO2g8PTE7aCsrKXtyLng9bi54KmMraS54KigxLWMpLHIueT1uLnkqdStpLnkqKDEtdSksci56PW4ueipoK2kueiooMS1oKTtjb25zdCBsPWUuZG90KHIpO289TWF0aC5taW4obCxvKSxhPU1hdGgubWF4KGwsYSl9dGhpcy5taW49byx0aGlzLm1heD1hfX0oKTtjb25zdCBRdT1mdW5jdGlvbigpe2NvbnN0IHI9bmV3IEEsdD1uZXcgQSxlPW5ldyBBO3JldHVybiBmdW5jdGlvbihuLGksbyl7Y29uc3QgYT1uLnN0YXJ0LGM9cix1PWkuc3RhcnQsaD10O2Uuc3ViVmVjdG9ycyhhLHUpLHIuc3ViVmVjdG9ycyhuLmVuZCxuLnN0YXJ0KSx0LnN1YlZlY3RvcnMoaS5lbmQsaS5zdGFydCk7Y29uc3QgbD1lLmRvdChoKSxkPWguZG90KGMpLGY9aC5kb3QoaCkscD1lLmRvdChjKSxnPWMuZG90KGMpKmYtZCpkO2xldCB5LFQ7ZyE9PTA/eT0obCpkLXAqZikvZzp5PTAsVD0obCt5KmQpL2Ysby54PXksby55PVR9fSgpLE1pPWZ1bmN0aW9uKCl7Y29uc3Qgcj1uZXcgSix0PW5ldyBBLGU9bmV3IEE7cmV0dXJuIGZ1bmN0aW9uKG4saSxvLGEpe1F1KG4saSxyKTtsZXQgYz1yLngsdT1yLnk7aWYoYz49MCYmYzw9MSYmdT49MCYmdTw9MSl7bi5hdChjLG8pLGkuYXQodSxhKTtyZXR1cm59ZWxzZSBpZihjPj0wJiZjPD0xKXt1PDA/aS5hdCgwLGEpOmkuYXQoMSxhKSxuLmNsb3Nlc3RQb2ludFRvUG9pbnQoYSwhMCxvKTtyZXR1cm59ZWxzZSBpZih1Pj0wJiZ1PD0xKXtjPDA/bi5hdCgwLG8pOm4uYXQoMSxvKSxpLmNsb3Nlc3RQb2ludFRvUG9pbnQobywhMCxhKTtyZXR1cm59ZWxzZXtsZXQgaDtjPDA/aD1uLnN0YXJ0Omg9bi5lbmQ7bGV0IGw7dTwwP2w9aS5zdGFydDpsPWkuZW5kO2NvbnN0IGQ9dCxmPWU7aWYobi5jbG9zZXN0UG9pbnRUb1BvaW50KGwsITAsdCksaS5jbG9zZXN0UG9pbnRUb1BvaW50KGgsITAsZSksZC5kaXN0YW5jZVRvU3F1YXJlZChsKTw9Zi5kaXN0YW5jZVRvU3F1YXJlZChoKSl7by5jb3B5KGQpLGEuY29weShsKTtyZXR1cm59ZWxzZXtvLmNvcHkoaCksYS5jb3B5KGYpO3JldHVybn19fX0oKSxLdT1mdW5jdGlvbigpe2NvbnN0IHI9bmV3IEEsdD1uZXcgQSxlPW5ldyBYbixzPW5ldyBadDtyZXR1cm4gZnVuY3Rpb24oaSxvKXtjb25zdHtyYWRpdXM6YSxjZW50ZXI6Y309aSx7YTp1LGI6aCxjOmx9PW87aWYocy5zdGFydD11LHMuZW5kPWgscy5jbG9zZXN0UG9pbnRUb1BvaW50KGMsITAscikuZGlzdGFuY2VUbyhjKTw9YXx8KHMuc3RhcnQ9dSxzLmVuZD1sLHMuY2xvc2VzdFBvaW50VG9Qb2ludChjLCEwLHIpLmRpc3RhbmNlVG8oYyk8PWEpfHwocy5zdGFydD1oLHMuZW5kPWwscy5jbG9zZXN0UG9pbnRUb1BvaW50KGMsITAscikuZGlzdGFuY2VUbyhjKTw9YSkpcmV0dXJuITA7Y29uc3QgbT1vLmdldFBsYW5lKGUpO2lmKE1hdGguYWJzKG0uZGlzdGFuY2VUb1BvaW50KGMpKTw9YSl7Y29uc3QgeT1tLnByb2plY3RQb2ludChjLHQpO2lmKG8uY29udGFpbnNQb2ludCh5KSlyZXR1cm4hMH1yZXR1cm4hMX19KCksdGw9MWUtMTU7ZnVuY3Rpb24gU2kocil7cmV0dXJuIE1hdGguYWJzKHIpPHRsfWNsYXNzIEx0IGV4dGVuZHMgd3R7Y29uc3RydWN0b3IoLi4udCl7c3VwZXIoLi4udCksdGhpcy5pc0V4dGVuZGVkVHJpYW5nbGU9ITAsdGhpcy5zYXRBeGVzPW5ldyBBcnJheSg0KS5maWxsKCkubWFwKCgpPT5uZXcgQSksdGhpcy5zYXRCb3VuZHM9bmV3IEFycmF5KDQpLmZpbGwoKS5tYXAoKCk9Pm5ldyBRdCksdGhpcy5wb2ludHM9W3RoaXMuYSx0aGlzLmIsdGhpcy5jXSx0aGlzLnNwaGVyZT1uZXcgY3IsdGhpcy5wbGFuZT1uZXcgWG4sdGhpcy5uZWVkc1VwZGF0ZT0hMH1pbnRlcnNlY3RzU3BoZXJlKHQpe3JldHVybiBLdSh0LHRoaXMpfXVwZGF0ZSgpe2NvbnN0IHQ9dGhpcy5hLGU9dGhpcy5iLHM9dGhpcy5jLG49dGhpcy5wb2ludHMsaT10aGlzLnNhdEF4ZXMsbz10aGlzLnNhdEJvdW5kcyxhPWlbMF0sYz1vWzBdO3RoaXMuZ2V0Tm9ybWFsKGEpLGMuc2V0RnJvbVBvaW50cyhhLG4pO2NvbnN0IHU9aVsxXSxoPW9bMV07dS5zdWJWZWN0b3JzKHQsZSksaC5zZXRGcm9tUG9pbnRzKHUsbik7Y29uc3QgbD1pWzJdLGQ9b1syXTtsLnN1YlZlY3RvcnMoZSxzKSxkLnNldEZyb21Qb2ludHMobCxuKTtjb25zdCBmPWlbM10scD1vWzNdO2Yuc3ViVmVjdG9ycyhzLHQpLHAuc2V0RnJvbVBvaW50cyhmLG4pLHRoaXMuc3BoZXJlLnNldEZyb21Qb2ludHModGhpcy5wb2ludHMpLHRoaXMucGxhbmUuc2V0RnJvbU5vcm1hbEFuZENvcGxhbmFyUG9pbnQoYSx0KSx0aGlzLm5lZWRzVXBkYXRlPSExfX1MdC5wcm90b3R5cGUuY2xvc2VzdFBvaW50VG9TZWdtZW50PWZ1bmN0aW9uKCl7Y29uc3Qgcj1uZXcgQSx0PW5ldyBBLGU9bmV3IFp0O3JldHVybiBmdW5jdGlvbihuLGk9bnVsbCxvPW51bGwpe2NvbnN0e3N0YXJ0OmEsZW5kOmN9PW4sdT10aGlzLnBvaW50cztsZXQgaCxsPTEvMDtmb3IobGV0IGQ9MDtkPDM7ZCsrKXtjb25zdCBmPShkKzEpJTM7ZS5zdGFydC5jb3B5KHVbZF0pLGUuZW5kLmNvcHkodVtmXSksTWkoZSxuLHIsdCksaD1yLmRpc3RhbmNlVG9TcXVhcmVkKHQpLGg8bCYmKGw9aCxpJiZpLmNvcHkociksbyYmby5jb3B5KHQpKX1yZXR1cm4gdGhpcy5jbG9zZXN0UG9pbnRUb1BvaW50KGEsciksaD1hLmRpc3RhbmNlVG9TcXVhcmVkKHIpLGg8bCYmKGw9aCxpJiZpLmNvcHkociksbyYmby5jb3B5KGEpKSx0aGlzLmNsb3Nlc3RQb2ludFRvUG9pbnQoYyxyKSxoPWMuZGlzdGFuY2VUb1NxdWFyZWQociksaDxsJiYobD1oLGkmJmkuY29weShyKSxvJiZvLmNvcHkoYykpLE1hdGguc3FydChsKX19KCksTHQucHJvdG90eXBlLmludGVyc2VjdHNUcmlhbmdsZT1mdW5jdGlvbigpe2NvbnN0IHI9bmV3IEx0LHQ9bmV3IEFycmF5KDMpLGU9bmV3IEFycmF5KDMpLHM9bmV3IFF0LG49bmV3IFF0LGk9bmV3IEEsbz1uZXcgQSxhPW5ldyBBLGM9bmV3IEEsdT1uZXcgQSxoPW5ldyBadCxsPW5ldyBadCxkPW5ldyBadCxmPW5ldyBBO2Z1bmN0aW9uIHAobSxnLHkpe2NvbnN0IFQ9bS5wb2ludHM7bGV0IHc9MCxNPS0xO2ZvcihsZXQgTj0wO048MztOKyspe2NvbnN0e3N0YXJ0Ol8sZW5kOlN9PWg7Xy5jb3B5KFRbTl0pLFMuY29weShUWyhOKzEpJTNdKSxoLmRlbHRhKG8pO2NvbnN0IEU9U2koZy5kaXN0YW5jZVRvUG9pbnQoXykpO2lmKFNpKGcubm9ybWFsLmRvdChvKSkmJkUpe3kuY29weShoKSx3PTI7YnJlYWt9Y29uc3QgRj1nLmludGVyc2VjdExpbmUoaCxmKTtpZighRiYmRSYmZi5jb3B5KF8pLChGfHxFKSYmIVNpKGYuZGlzdGFuY2VUbyhTKSkpe2lmKHc8PTEpKHc9PT0xP3kuc3RhcnQ6eS5lbmQpLmNvcHkoZiksRSYmKE09dyk7ZWxzZSBpZih3Pj0yKXsoTT09PTE/eS5zdGFydDp5LmVuZCkuY29weShmKSx3PTI7YnJlYWt9aWYodysrLHc9PT0yJiZNPT09LTEpYnJlYWt9fXJldHVybiB3fXJldHVybiBmdW5jdGlvbihnLHk9bnVsbCxUPSExKXt0aGlzLm5lZWRzVXBkYXRlJiZ0aGlzLnVwZGF0ZSgpLGcuaXNFeHRlbmRlZFRyaWFuZ2xlP2cubmVlZHNVcGRhdGUmJmcudXBkYXRlKCk6KHIuY29weShnKSxyLnVwZGF0ZSgpLGc9cik7Y29uc3Qgdz10aGlzLnBsYW5lLE09Zy5wbGFuZTtpZihNYXRoLmFicyh3Lm5vcm1hbC5kb3QoTS5ub3JtYWwpKT4xLTFlLTEwKXtjb25zdCBOPXRoaXMuc2F0Qm91bmRzLF89dGhpcy5zYXRBeGVzO2VbMF09Zy5hLGVbMV09Zy5iLGVbMl09Zy5jO2ZvcihsZXQgRj0wO0Y8NDtGKyspe2NvbnN0IFI9TltGXSxJPV9bRl07aWYocy5zZXRGcm9tUG9pbnRzKEksZSksUi5pc1NlcGFyYXRlZChzKSlyZXR1cm4hMX1jb25zdCBTPWcuc2F0Qm91bmRzLEU9Zy5zYXRBeGVzO3RbMF09dGhpcy5hLHRbMV09dGhpcy5iLHRbMl09dGhpcy5jO2ZvcihsZXQgRj0wO0Y8NDtGKyspe2NvbnN0IFI9U1tGXSxJPUVbRl07aWYocy5zZXRGcm9tUG9pbnRzKEksdCksUi5pc1NlcGFyYXRlZChzKSlyZXR1cm4hMX1mb3IobGV0IEY9MDtGPDQ7RisrKXtjb25zdCBSPV9bRl07Zm9yKGxldCBJPTA7STw0O0krKyl7Y29uc3QgQj1FW0ldO2lmKGkuY3Jvc3NWZWN0b3JzKFIsQikscy5zZXRGcm9tUG9pbnRzKGksdCksbi5zZXRGcm9tUG9pbnRzKGksZSkscy5pc1NlcGFyYXRlZChuKSlyZXR1cm4hMX19cmV0dXJuIHkmJihUfHxjb25zb2xlLndhcm4oIkV4dGVuZGVkVHJpYW5nbGUuaW50ZXJzZWN0c1RyaWFuZ2xlOiBUcmlhbmdsZXMgYXJlIGNvcGxhbmFyIHdoaWNoIGRvZXMgbm90IHN1cHBvcnQgYW4gb3V0cHV0IGVkZ2UuIFNldHRpbmcgZWRnZSB0byAwLCAwLCAwLiIpLHkuc3RhcnQuc2V0KDAsMCwwKSx5LmVuZC5zZXQoMCwwLDApKSwhMH1lbHNle2NvbnN0IE49cCh0aGlzLE0sbCk7aWYoTj09PTEmJmcuY29udGFpbnNQb2ludChsLmVuZCkpcmV0dXJuIHkmJih5LnN0YXJ0LmNvcHkobC5lbmQpLHkuZW5kLmNvcHkobC5lbmQpKSwhMDtpZihOIT09MilyZXR1cm4hMTtjb25zdCBfPXAoZyx3LGQpO2lmKF89PT0xJiZ0aGlzLmNvbnRhaW5zUG9pbnQoZC5lbmQpKXJldHVybiB5JiYoeS5zdGFydC5jb3B5KGQuZW5kKSx5LmVuZC5jb3B5KGQuZW5kKSksITA7aWYoXyE9PTIpcmV0dXJuITE7aWYobC5kZWx0YShhKSxkLmRlbHRhKGMpLGEuZG90KGMpPDApe2xldCBQPWQuc3RhcnQ7ZC5zdGFydD1kLmVuZCxkLmVuZD1QfWNvbnN0IFM9bC5zdGFydC5kb3QoYSksRT1sLmVuZC5kb3QoYSksRj1kLnN0YXJ0LmRvdChhKSxSPWQuZW5kLmRvdChhKSxJPUU8RixCPVM8UjtyZXR1cm4gUyE9PVImJkYhPT1FJiZJPT09Qj8hMTooeSYmKHUuc3ViVmVjdG9ycyhsLnN0YXJ0LGQuc3RhcnQpLHUuZG90KGEpPjA/eS5zdGFydC5jb3B5KGwuc3RhcnQpOnkuc3RhcnQuY29weShkLnN0YXJ0KSx1LnN1YlZlY3RvcnMobC5lbmQsZC5lbmQpLHUuZG90KGEpPDA/eS5lbmQuY29weShsLmVuZCk6eS5lbmQuY29weShkLmVuZCkpLCEwKX19fSgpLEx0LnByb3RvdHlwZS5kaXN0YW5jZVRvUG9pbnQ9ZnVuY3Rpb24oKXtjb25zdCByPW5ldyBBO3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5jbG9zZXN0UG9pbnRUb1BvaW50KGUsciksZS5kaXN0YW5jZVRvKHIpfX0oKSxMdC5wcm90b3R5cGUuZGlzdGFuY2VUb1RyaWFuZ2xlPWZ1bmN0aW9uKCl7Y29uc3Qgcj1uZXcgQSx0PW5ldyBBLGU9WyJhIiwiYiIsImMiXSxzPW5ldyBadCxuPW5ldyBadDtyZXR1cm4gZnVuY3Rpb24obyxhPW51bGwsYz1udWxsKXtjb25zdCB1PWF8fGM/czpudWxsO2lmKHRoaXMuaW50ZXJzZWN0c1RyaWFuZ2xlKG8sdSkpcmV0dXJuKGF8fGMpJiYoYSYmdS5nZXRDZW50ZXIoYSksYyYmdS5nZXRDZW50ZXIoYykpLDA7bGV0IGg9MS8wO2ZvcihsZXQgbD0wO2w8MztsKyspe2xldCBkO2NvbnN0IGY9ZVtsXSxwPW9bZl07dGhpcy5jbG9zZXN0UG9pbnRUb1BvaW50KHAsciksZD1wLmRpc3RhbmNlVG9TcXVhcmVkKHIpLGQ8aCYmKGg9ZCxhJiZhLmNvcHkociksYyYmYy5jb3B5KHApKTtjb25zdCBtPXRoaXNbZl07by5jbG9zZXN0UG9pbnRUb1BvaW50KG0sciksZD1tLmRpc3RhbmNlVG9TcXVhcmVkKHIpLGQ8aCYmKGg9ZCxhJiZhLmNvcHkobSksYyYmYy5jb3B5KHIpKX1mb3IobGV0IGw9MDtsPDM7bCsrKXtjb25zdCBkPWVbbF0sZj1lWyhsKzEpJTNdO3Muc2V0KHRoaXNbZF0sdGhpc1tmXSk7Zm9yKGxldCBwPTA7cDwzO3ArKyl7Y29uc3QgbT1lW3BdLGc9ZVsocCsxKSUzXTtuLnNldChvW21dLG9bZ10pLE1pKHMsbixyLHQpO2NvbnN0IHk9ci5kaXN0YW5jZVRvU3F1YXJlZCh0KTt5PGgmJihoPXksYSYmYS5jb3B5KHIpLGMmJmMuY29weSh0KSl9fXJldHVybiBNYXRoLnNxcnQoaCl9fSgpO2NsYXNzIGx0e2NvbnN0cnVjdG9yKHQsZSxzKXt0aGlzLmlzT3JpZW50ZWRCb3g9ITAsdGhpcy5taW49bmV3IEEsdGhpcy5tYXg9bmV3IEEsdGhpcy5tYXRyaXg9bmV3IG50LHRoaXMuaW52TWF0cml4PW5ldyBudCx0aGlzLnBvaW50cz1uZXcgQXJyYXkoOCkuZmlsbCgpLm1hcCgoKT0+bmV3IEEpLHRoaXMuc2F0QXhlcz1uZXcgQXJyYXkoMykuZmlsbCgpLm1hcCgoKT0+bmV3IEEpLHRoaXMuc2F0Qm91bmRzPW5ldyBBcnJheSgzKS5maWxsKCkubWFwKCgpPT5uZXcgUXQpLHRoaXMuYWxpZ25lZFNhdEJvdW5kcz1uZXcgQXJyYXkoMykuZmlsbCgpLm1hcCgoKT0+bmV3IFF0KSx0aGlzLm5lZWRzVXBkYXRlPSExLHQmJnRoaXMubWluLmNvcHkodCksZSYmdGhpcy5tYXguY29weShlKSxzJiZ0aGlzLm1hdHJpeC5jb3B5KHMpfXNldCh0LGUscyl7dGhpcy5taW4uY29weSh0KSx0aGlzLm1heC5jb3B5KGUpLHRoaXMubWF0cml4LmNvcHkocyksdGhpcy5uZWVkc1VwZGF0ZT0hMH1jb3B5KHQpe3RoaXMubWluLmNvcHkodC5taW4pLHRoaXMubWF4LmNvcHkodC5tYXgpLHRoaXMubWF0cml4LmNvcHkodC5tYXRyaXgpLHRoaXMubmVlZHNVcGRhdGU9ITB9fWx0LnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24oKXtjb25zdCB0PXRoaXMubWF0cml4LGU9dGhpcy5taW4scz10aGlzLm1heCxuPXRoaXMucG9pbnRzO2ZvcihsZXQgdT0wO3U8PTE7dSsrKWZvcihsZXQgaD0wO2g8PTE7aCsrKWZvcihsZXQgbD0wO2w8PTE7bCsrKXtjb25zdCBkPTEqdXwyKmh8NCpsLGY9bltkXTtmLng9dT9zLng6ZS54LGYueT1oP3MueTplLnksZi56PWw/cy56OmUueixmLmFwcGx5TWF0cml4NCh0KX1jb25zdCBpPXRoaXMuc2F0Qm91bmRzLG89dGhpcy5zYXRBeGVzLGE9blswXTtmb3IobGV0IHU9MDt1PDM7dSsrKXtjb25zdCBoPW9bdV0sbD1pW3VdLGQ9MTw8dSxmPW5bZF07aC5zdWJWZWN0b3JzKGEsZiksbC5zZXRGcm9tUG9pbnRzKGgsbil9Y29uc3QgYz10aGlzLmFsaWduZWRTYXRCb3VuZHM7Y1swXS5zZXRGcm9tUG9pbnRzRmllbGQobiwieCIpLGNbMV0uc2V0RnJvbVBvaW50c0ZpZWxkKG4sInkiKSxjWzJdLnNldEZyb21Qb2ludHNGaWVsZChuLCJ6IiksdGhpcy5pbnZNYXRyaXguY29weSh0aGlzLm1hdHJpeCkuaW52ZXJ0KCksdGhpcy5uZWVkc1VwZGF0ZT0hMX19KCksbHQucHJvdG90eXBlLmludGVyc2VjdHNCb3g9ZnVuY3Rpb24oKXtjb25zdCByPW5ldyBRdDtyZXR1cm4gZnVuY3Rpb24oZSl7dGhpcy5uZWVkc1VwZGF0ZSYmdGhpcy51cGRhdGUoKTtjb25zdCBzPWUubWluLG49ZS5tYXgsaT10aGlzLnNhdEJvdW5kcyxvPXRoaXMuc2F0QXhlcyxhPXRoaXMuYWxpZ25lZFNhdEJvdW5kcztpZihyLm1pbj1zLngsci5tYXg9bi54LGFbMF0uaXNTZXBhcmF0ZWQocil8fChyLm1pbj1zLnksci5tYXg9bi55LGFbMV0uaXNTZXBhcmF0ZWQocikpfHwoci5taW49cy56LHIubWF4PW4ueixhWzJdLmlzU2VwYXJhdGVkKHIpKSlyZXR1cm4hMTtmb3IobGV0IGM9MDtjPDM7YysrKXtjb25zdCB1PW9bY10saD1pW2NdO2lmKHIuc2V0RnJvbUJveCh1LGUpLGguaXNTZXBhcmF0ZWQocikpcmV0dXJuITF9cmV0dXJuITB9fSgpLGx0LnByb3RvdHlwZS5pbnRlcnNlY3RzVHJpYW5nbGU9ZnVuY3Rpb24oKXtjb25zdCByPW5ldyBMdCx0PW5ldyBBcnJheSgzKSxlPW5ldyBRdCxzPW5ldyBRdCxuPW5ldyBBO3JldHVybiBmdW5jdGlvbihvKXt0aGlzLm5lZWRzVXBkYXRlJiZ0aGlzLnVwZGF0ZSgpLG8uaXNFeHRlbmRlZFRyaWFuZ2xlP28ubmVlZHNVcGRhdGUmJm8udXBkYXRlKCk6KHIuY29weShvKSxyLnVwZGF0ZSgpLG89cik7Y29uc3QgYT10aGlzLnNhdEJvdW5kcyxjPXRoaXMuc2F0QXhlczt0WzBdPW8uYSx0WzFdPW8uYix0WzJdPW8uYztmb3IobGV0IGQ9MDtkPDM7ZCsrKXtjb25zdCBmPWFbZF0scD1jW2RdO2lmKGUuc2V0RnJvbVBvaW50cyhwLHQpLGYuaXNTZXBhcmF0ZWQoZSkpcmV0dXJuITF9Y29uc3QgdT1vLnNhdEJvdW5kcyxoPW8uc2F0QXhlcyxsPXRoaXMucG9pbnRzO2ZvcihsZXQgZD0wO2Q8MztkKyspe2NvbnN0IGY9dVtkXSxwPWhbZF07aWYoZS5zZXRGcm9tUG9pbnRzKHAsbCksZi5pc1NlcGFyYXRlZChlKSlyZXR1cm4hMX1mb3IobGV0IGQ9MDtkPDM7ZCsrKXtjb25zdCBmPWNbZF07Zm9yKGxldCBwPTA7cDw0O3ArKyl7Y29uc3QgbT1oW3BdO2lmKG4uY3Jvc3NWZWN0b3JzKGYsbSksZS5zZXRGcm9tUG9pbnRzKG4sdCkscy5zZXRGcm9tUG9pbnRzKG4sbCksZS5pc1NlcGFyYXRlZChzKSlyZXR1cm4hMX19cmV0dXJuITB9fSgpLGx0LnByb3RvdHlwZS5jbG9zZXN0UG9pbnRUb1BvaW50PWZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMubmVlZHNVcGRhdGUmJnRoaXMudXBkYXRlKCksZS5jb3B5KHQpLmFwcGx5TWF0cml4NCh0aGlzLmludk1hdHJpeCkuY2xhbXAodGhpcy5taW4sdGhpcy5tYXgpLmFwcGx5TWF0cml4NCh0aGlzLm1hdHJpeCksZX19KCksbHQucHJvdG90eXBlLmRpc3RhbmNlVG9Qb2ludD1mdW5jdGlvbigpe2NvbnN0IHI9bmV3IEE7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmNsb3Nlc3RQb2ludFRvUG9pbnQoZSxyKSxlLmRpc3RhbmNlVG8ocil9fSgpLGx0LnByb3RvdHlwZS5kaXN0YW5jZVRvQm94PWZ1bmN0aW9uKCl7Y29uc3Qgcj1bIngiLCJ5IiwieiJdLHQ9bmV3IEFycmF5KDEyKS5maWxsKCkubWFwKCgpPT5uZXcgWnQpLGU9bmV3IEFycmF5KDEyKS5maWxsKCkubWFwKCgpPT5uZXcgWnQpLHM9bmV3IEEsbj1uZXcgQTtyZXR1cm4gZnVuY3Rpb24obyxhPTAsYz1udWxsLHU9bnVsbCl7aWYodGhpcy5uZWVkc1VwZGF0ZSYmdGhpcy51cGRhdGUoKSx0aGlzLmludGVyc2VjdHNCb3gobykpcmV0dXJuKGN8fHUpJiYoby5nZXRDZW50ZXIobiksdGhpcy5jbG9zZXN0UG9pbnRUb1BvaW50KG4scyksby5jbG9zZXN0UG9pbnRUb1BvaW50KHMsbiksYyYmYy5jb3B5KHMpLHUmJnUuY29weShuKSksMDtjb25zdCBoPWEqYSxsPW8ubWluLGQ9by5tYXgsZj10aGlzLnBvaW50cztsZXQgcD0xLzA7Zm9yKGxldCBnPTA7Zzw4O2crKyl7Y29uc3QgeT1mW2ddO24uY29weSh5KS5jbGFtcChsLGQpO2NvbnN0IFQ9eS5kaXN0YW5jZVRvU3F1YXJlZChuKTtpZihUPHAmJihwPVQsYyYmYy5jb3B5KHkpLHUmJnUuY29weShuKSxUPGgpKXJldHVybiBNYXRoLnNxcnQoVCl9bGV0IG09MDtmb3IobGV0IGc9MDtnPDM7ZysrKWZvcihsZXQgeT0wO3k8PTE7eSsrKWZvcihsZXQgVD0wO1Q8PTE7VCsrKXtjb25zdCB3PShnKzEpJTMsTT0oZysyKSUzLE49eTw8d3xUPDxNLF89MTw8Z3x5PDx3fFQ8PE0sUz1mW05dLEU9ZltfXTt0W21dLnNldChTLEUpO2NvbnN0IFI9cltnXSxJPXJbd10sQj1yW01dLFA9ZVttXSxMPVAuc3RhcnQsVj1QLmVuZDtMW1JdPWxbUl0sTFtJXT15P2xbSV06ZFtJXSxMW0JdPVQ/bFtCXTpkW0ldLFZbUl09ZFtSXSxWW0ldPXk/bFtJXTpkW0ldLFZbQl09VD9sW0JdOmRbSV0sbSsrfWZvcihsZXQgZz0wO2c8PTE7ZysrKWZvcihsZXQgeT0wO3k8PTE7eSsrKWZvcihsZXQgVD0wO1Q8PTE7VCsrKXtuLng9Zz9kLng6bC54LG4ueT15P2QueTpsLnksbi56PVQ/ZC56Omwueix0aGlzLmNsb3Nlc3RQb2ludFRvUG9pbnQobixzKTtjb25zdCB3PW4uZGlzdGFuY2VUb1NxdWFyZWQocyk7aWYodzxwJiYocD13LGMmJmMuY29weShzKSx1JiZ1LmNvcHkobiksdzxoKSlyZXR1cm4gTWF0aC5zcXJ0KHcpfWZvcihsZXQgZz0wO2c8MTI7ZysrKXtjb25zdCB5PXRbZ107Zm9yKGxldCBUPTA7VDwxMjtUKyspe2NvbnN0IHc9ZVtUXTtNaSh5LHcscyxuKTtjb25zdCBNPXMuZGlzdGFuY2VUb1NxdWFyZWQobik7aWYoTTxwJiYocD1NLGMmJmMuY29weShzKSx1JiZ1LmNvcHkobiksTTxoKSlyZXR1cm4gTWF0aC5zcXJ0KE0pfX1yZXR1cm4gTWF0aC5zcXJ0KHApfX0oKTtjbGFzcyBfaXtjb25zdHJ1Y3Rvcih0KXt0aGlzLl9nZXROZXdQcmltaXRpdmU9dCx0aGlzLl9wcmltaXRpdmVzPVtdfWdldFByaW1pdGl2ZSgpe2NvbnN0IHQ9dGhpcy5fcHJpbWl0aXZlcztyZXR1cm4gdC5sZW5ndGg9PT0wP3RoaXMuX2dldE5ld1ByaW1pdGl2ZSgpOnQucG9wKCl9cmVsZWFzZVByaW1pdGl2ZSh0KXt0aGlzLl9wcmltaXRpdmVzLnB1c2godCl9fWNsYXNzIGVsIGV4dGVuZHMgX2l7Y29uc3RydWN0b3IoKXtzdXBlcigoKT0+bmV3IEx0KX19Y29uc3QgYnQ9bmV3IGVsO2NsYXNzIHNse2NvbnN0cnVjdG9yKCl7dGhpcy5mbG9hdDMyQXJyYXk9bnVsbCx0aGlzLnVpbnQxNkFycmF5PW51bGwsdGhpcy51aW50MzJBcnJheT1udWxsO2NvbnN0IHQ9W107bGV0IGU9bnVsbDt0aGlzLnNldEJ1ZmZlcj1zPT57ZSYmdC5wdXNoKGUpLGU9cyx0aGlzLmZsb2F0MzJBcnJheT1uZXcgRmxvYXQzMkFycmF5KHMpLHRoaXMudWludDE2QXJyYXk9bmV3IFVpbnQxNkFycmF5KHMpLHRoaXMudWludDMyQXJyYXk9bmV3IFVpbnQzMkFycmF5KHMpfSx0aGlzLmNsZWFyQnVmZmVyPSgpPT57ZT1udWxsLHRoaXMuZmxvYXQzMkFycmF5PW51bGwsdGhpcy51aW50MTZBcnJheT1udWxsLHRoaXMudWludDMyQXJyYXk9bnVsbCx0Lmxlbmd0aCE9PTAmJnRoaXMuc2V0QnVmZmVyKHQucG9wKCkpfX19Y29uc3QgWD1uZXcgc2w7bGV0IGFlLFZlO2NvbnN0IFVlPVtdLG9uPW5ldyBfaSgoKT0+bmV3IGh0KTtmdW5jdGlvbiBubChyLHQsZSxzLG4saSl7YWU9b24uZ2V0UHJpbWl0aXZlKCksVmU9b24uZ2V0UHJpbWl0aXZlKCksVWUucHVzaChhZSxWZSksWC5zZXRCdWZmZXIoci5fcm9vdHNbdF0pO2NvbnN0IG89emkoMCxyLmdlb21ldHJ5LGUscyxuLGkpO1guY2xlYXJCdWZmZXIoKSxvbi5yZWxlYXNlUHJpbWl0aXZlKGFlKSxvbi5yZWxlYXNlUHJpbWl0aXZlKFZlKSxVZS5wb3AoKSxVZS5wb3AoKTtjb25zdCBhPVVlLmxlbmd0aDtyZXR1cm4gYT4wJiYoVmU9VWVbYS0xXSxhZT1VZVthLTJdKSxvfWZ1bmN0aW9uIHppKHIsdCxlLHMsbj1udWxsLGk9MCxvPTApe2NvbnN0e2Zsb2F0MzJBcnJheTphLHVpbnQxNkFycmF5OmMsdWludDMyQXJyYXk6dX09WDtsZXQgaD1yKjI7aWYocHQoaCxjKSl7Y29uc3QgZD1UdChyLHUpLGY9U3QoaCxjKTtyZXR1cm4gWihyLGEsYWUpLHMoZCxmLCExLG8saStyLGFlKX1lbHNle2xldCBSPWZ1bmN0aW9uKEIpe2NvbnN0e3VpbnQxNkFycmF5OlAsdWludDMyQXJyYXk6TH09WDtsZXQgVj1CKjI7Zm9yKDshcHQoVixQKTspQj1fdChCKSxWPUIqMjtyZXR1cm4gVHQoQixMKX0sST1mdW5jdGlvbihCKXtjb25zdHt1aW50MTZBcnJheTpQLHVpbnQzMkFycmF5Okx9PVg7bGV0IFY9QioyO2Zvcig7IXB0KFYsUCk7KUI9enQoQixMKSxWPUIqMjtyZXR1cm4gVHQoQixMKStTdChWLFApfTtjb25zdCBkPV90KHIpLGY9enQocix1KTtsZXQgcD1kLG09ZixnLHksVCx3O2lmKG4mJihUPWFlLHc9VmUsWihwLGEsVCksWihtLGEsdyksZz1uKFQpLHk9bih3KSx5PGcpKXtwPWYsbT1kO2NvbnN0IEI9ZztnPXkseT1CLFQ9d31UfHwoVD1hZSxaKHAsYSxUKSk7Y29uc3QgTT1wdChwKjIsYyksTj1lKFQsTSxnLG8rMSxpK3ApO2xldCBfO2lmKE49PT1sbyl7Y29uc3QgQj1SKHApLEw9SShwKS1CO189cyhCLEwsITAsbysxLGkrcCxUKX1lbHNlIF89TiYmemkocCx0LGUscyxuLGksbysxKTtpZihfKXJldHVybiEwO3c9VmUsWihtLGEsdyk7Y29uc3QgUz1wdChtKjIsYyksRT1lKHcsUyx5LG8rMSxpK20pO2xldCBGO2lmKEU9PT1sbyl7Y29uc3QgQj1SKG0pLEw9SShtKS1CO0Y9cyhCLEwsITAsbysxLGkrbSx3KX1lbHNlIEY9RSYmemkobSx0LGUscyxuLGksbysxKTtyZXR1cm4hIUZ9fWNvbnN0IHhzPW5ldyBBLGJpPW5ldyBBO2Z1bmN0aW9uIGlsKHIsdCxlPXt9LHM9MCxuPTEvMCl7Y29uc3QgaT1zKnMsbz1uKm47bGV0IGE9MS8wLGM9bnVsbDtpZihyLnNoYXBlY2FzdCh7Ym91bmRzVHJhdmVyc2VPcmRlcjpoPT4oeHMuY29weSh0KS5jbGFtcChoLm1pbixoLm1heCkseHMuZGlzdGFuY2VUb1NxdWFyZWQodCkpLGludGVyc2VjdHNCb3VuZHM6KGgsbCxkKT0+ZDxhJiZkPG8saW50ZXJzZWN0c1RyaWFuZ2xlOihoLGwpPT57aC5jbG9zZXN0UG9pbnRUb1BvaW50KHQseHMpO2NvbnN0IGQ9dC5kaXN0YW5jZVRvU3F1YXJlZCh4cyk7cmV0dXJuIGQ8YSYmKGJpLmNvcHkoeHMpLGE9ZCxjPWwpLGQ8aX19KSxhPT09MS8wKXJldHVybiBudWxsO2NvbnN0IHU9TWF0aC5zcXJ0KGEpO3JldHVybiBlLnBvaW50P2UucG9pbnQuY29weShiaSk6ZS5wb2ludD1iaS5jbG9uZSgpLGUuZGlzdGFuY2U9dSxlLmZhY2VJbmRleD1jLGV9Y29uc3Qgcmw9cGFyc2VJbnQoWGUpPj0xNjksbWU9bmV3IEEseWU9bmV3IEEsZ2U9bmV3IEEsYW49bmV3IEosY249bmV3IEosaG49bmV3IEosQW89bmV3IEEsTW89bmV3IEEsU289bmV3IEEsVHM9bmV3IEE7ZnVuY3Rpb24gb2wocix0LGUscyxuLGksbyxhKXtsZXQgYztpZihpPT09VWk/Yz1yLmludGVyc2VjdFRyaWFuZ2xlKHMsZSx0LCEwLG4pOmM9ci5pbnRlcnNlY3RUcmlhbmdsZSh0LGUscyxpIT09RW8sbiksYz09PW51bGwpcmV0dXJuIG51bGw7Y29uc3QgdT1yLm9yaWdpbi5kaXN0YW5jZVRvKG4pO3JldHVybiB1PG98fHU+YT9udWxsOntkaXN0YW5jZTp1LHBvaW50Om4uY2xvbmUoKX19ZnVuY3Rpb24gYWwocix0LGUscyxuLGksbyxhLGMsdSxoKXttZS5mcm9tQnVmZmVyQXR0cmlidXRlKHQsaSkseWUuZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0LG8pLGdlLmZyb21CdWZmZXJBdHRyaWJ1dGUodCxhKTtjb25zdCBsPW9sKHIsbWUseWUsZ2UsVHMsYyx1LGgpO2lmKGwpe2NvbnN0IGQ9bmV3IEE7d3QuZ2V0QmFyeWNvb3JkKFRzLG1lLHllLGdlLGQpLHMmJihhbi5mcm9tQnVmZmVyQXR0cmlidXRlKHMsaSksY24uZnJvbUJ1ZmZlckF0dHJpYnV0ZShzLG8pLGhuLmZyb21CdWZmZXJBdHRyaWJ1dGUocyxhKSxsLnV2PXd0LmdldEludGVycG9sYXRpb24oVHMsbWUseWUsZ2UsYW4sY24saG4sbmV3IEopKSxuJiYoYW4uZnJvbUJ1ZmZlckF0dHJpYnV0ZShuLGkpLGNuLmZyb21CdWZmZXJBdHRyaWJ1dGUobixvKSxobi5mcm9tQnVmZmVyQXR0cmlidXRlKG4sYSksbC51djE9d3QuZ2V0SW50ZXJwb2xhdGlvbihUcyxtZSx5ZSxnZSxhbixjbixobixuZXcgSikpLGUmJihBby5mcm9tQnVmZmVyQXR0cmlidXRlKGUsaSksTW8uZnJvbUJ1ZmZlckF0dHJpYnV0ZShlLG8pLFNvLmZyb21CdWZmZXJBdHRyaWJ1dGUoZSxhKSxsLm5vcm1hbD13dC5nZXRJbnRlcnBvbGF0aW9uKFRzLG1lLHllLGdlLEFvLE1vLFNvLG5ldyBBKSxsLm5vcm1hbC5kb3Qoci5kaXJlY3Rpb24pPjAmJmwubm9ybWFsLm11bHRpcGx5U2NhbGFyKC0xKSk7Y29uc3QgZj17YTppLGI6byxjOmEsbm9ybWFsOm5ldyBBLG1hdGVyaWFsSW5kZXg6MH07d3QuZ2V0Tm9ybWFsKG1lLHllLGdlLGYubm9ybWFsKSxsLmZhY2U9ZixsLmZhY2VJbmRleD1pLHJsJiYobC5iYXJ5Y29vcmQ9ZCl9cmV0dXJuIGx9ZnVuY3Rpb24gdW4ocix0LGUscyxuLGksbyl7Y29uc3QgYT1zKjM7bGV0IGM9YSswLHU9YSsxLGg9YSsyO2NvbnN0IGw9ci5pbmRleDtyLmluZGV4JiYoYz1sLmdldFgoYyksdT1sLmdldFgodSksaD1sLmdldFgoaCkpO2NvbnN0e3Bvc2l0aW9uOmQsbm9ybWFsOmYsdXY6cCx1djE6bX09ci5hdHRyaWJ1dGVzLGc9YWwoZSxkLGYscCxtLGMsdSxoLHQsaSxvKTtyZXR1cm4gZz8oZy5mYWNlSW5kZXg9cyxuJiZuLnB1c2goZyksZyk6bnVsbH1mdW5jdGlvbiBzdChyLHQsZSxzKXtjb25zdCBuPXIuYSxpPXIuYixvPXIuYztsZXQgYT10LGM9dCsxLHU9dCsyO2UmJihhPWUuZ2V0WChhKSxjPWUuZ2V0WChjKSx1PWUuZ2V0WCh1KSksbi54PXMuZ2V0WChhKSxuLnk9cy5nZXRZKGEpLG4uej1zLmdldFooYSksaS54PXMuZ2V0WChjKSxpLnk9cy5nZXRZKGMpLGkuej1zLmdldFooYyksby54PXMuZ2V0WCh1KSxvLnk9cy5nZXRZKHUpLG8uej1zLmdldFoodSl9ZnVuY3Rpb24gY2wocix0LGUscyxuLGksbyxhKXtjb25zdHtnZW9tZXRyeTpjLF9pbmRpcmVjdEJ1ZmZlcjp1fT1yO2ZvcihsZXQgaD1zLGw9cytuO2g8bDtoKyspdW4oYyx0LGUsaCxpLG8sYSl9ZnVuY3Rpb24gaGwocix0LGUscyxuLGksbyl7Y29uc3R7Z2VvbWV0cnk6YSxfaW5kaXJlY3RCdWZmZXI6Y309cjtsZXQgdT0xLzAsaD1udWxsO2ZvcihsZXQgbD1zLGQ9cytuO2w8ZDtsKyspe2xldCBmO2Y9dW4oYSx0LGUsbCxudWxsLGksbyksZiYmZi5kaXN0YW5jZTx1JiYoaD1mLHU9Zi5kaXN0YW5jZSl9cmV0dXJuIGh9ZnVuY3Rpb24gdWwocix0LGUscyxuLGksbyl7Y29uc3R7Z2VvbWV0cnk6YX09ZSx7aW5kZXg6Y309YSx1PWEuYXR0cmlidXRlcy5wb3NpdGlvbjtmb3IobGV0IGg9cixsPXQrcjtoPGw7aCsrKXtsZXQgZDtpZihkPWgsc3QobyxkKjMsYyx1KSxvLm5lZWRzVXBkYXRlPSEwLHMobyxkLG4saSkpcmV0dXJuITB9cmV0dXJuITF9ZnVuY3Rpb24gbGwocix0PW51bGwpe3QmJkFycmF5LmlzQXJyYXkodCkmJih0PW5ldyBTZXQodCkpO2NvbnN0IGU9ci5nZW9tZXRyeSxzPWUuaW5kZXg/ZS5pbmRleC5hcnJheTpudWxsLG49ZS5hdHRyaWJ1dGVzLnBvc2l0aW9uO2xldCBpLG8sYSxjLHU9MDtjb25zdCBoPXIuX3Jvb3RzO2ZvcihsZXQgZD0wLGY9aC5sZW5ndGg7ZDxmO2QrKylpPWhbZF0sbz1uZXcgVWludDMyQXJyYXkoaSksYT1uZXcgVWludDE2QXJyYXkoaSksYz1uZXcgRmxvYXQzMkFycmF5KGkpLGwoMCx1KSx1Kz1pLmJ5dGVMZW5ndGg7ZnVuY3Rpb24gbChkLGYscD0hMSl7Y29uc3QgbT1kKjI7aWYoYVttKzE1XT09PWVuKXtjb25zdCB5PW9bZCs2XSxUPWFbbSsxNF07bGV0IHc9MS8wLE09MS8wLE49MS8wLF89LTEvMCxTPS0xLzAsRT0tMS8wO2ZvcihsZXQgRj0zKnksUj0zKih5K1QpO0Y8UjtGKyspe2xldCBJPXNbRl07Y29uc3QgQj1uLmdldFgoSSksUD1uLmdldFkoSSksTD1uLmdldFooSSk7Qjx3JiYodz1CKSxCPl8mJihfPUIpLFA8TSYmKE09UCksUD5TJiYoUz1QKSxMPE4mJihOPUwpLEw+RSYmKEU9TCl9cmV0dXJuIGNbZCswXSE9PXd8fGNbZCsxXSE9PU18fGNbZCsyXSE9PU58fGNbZCszXSE9PV98fGNbZCs0XSE9PVN8fGNbZCs1XSE9PUU/KGNbZCswXT13LGNbZCsxXT1NLGNbZCsyXT1OLGNbZCszXT1fLGNbZCs0XT1TLGNbZCs1XT1FLCEwKTohMX1lbHNle2NvbnN0IHk9ZCs4LFQ9b1tkKzZdLHc9eStmLE09VCtmO2xldCBOPXAsXz0hMSxTPSExO3Q/Tnx8KF89dC5oYXModyksUz10LmhhcyhNKSxOPSFfJiYhUyk6KF89ITAsUz0hMCk7Y29uc3QgRT1OfHxfLEY9Tnx8UztsZXQgUj0hMTtFJiYoUj1sKHksZixOKSk7bGV0IEk9ITE7RiYmKEk9bChULGYsTikpO2NvbnN0IEI9Unx8STtpZihCKWZvcihsZXQgUD0wO1A8MztQKyspe2NvbnN0IEw9eStQLFY9VCtQLEc9Y1tMXSxOdD1jW0wrM10sSHQ9Y1tWXSxxdD1jW1YrM107Y1tkK1BdPUc8SHQ/RzpIdCxjW2QrUCszXT1OdD5xdD9OdDpxdH1yZXR1cm4gQn19fWZ1bmN0aW9uIGNlKHIsdCxlLHMsbil7bGV0IGksbyxhLGMsdSxoO2NvbnN0IGw9MS9lLmRpcmVjdGlvbi54LGQ9MS9lLmRpcmVjdGlvbi55LGY9MS9lLmRpcmVjdGlvbi56LHA9ZS5vcmlnaW4ueCxtPWUub3JpZ2luLnksZz1lLm9yaWdpbi56O2xldCB5PXRbcl0sVD10W3IrM10sdz10W3IrMV0sTT10W3IrMysxXSxOPXRbcisyXSxfPXRbciszKzJdO3JldHVybiBsPj0wPyhpPSh5LXApKmwsbz0oVC1wKSpsKTooaT0oVC1wKSpsLG89KHktcCkqbCksZD49MD8oYT0ody1tKSpkLGM9KE0tbSkqZCk6KGE9KE0tbSkqZCxjPSh3LW0pKmQpLGk+Y3x8YT5vfHwoKGE+aXx8aXNOYU4oaSkpJiYoaT1hKSwoYzxvfHxpc05hTihvKSkmJihvPWMpLGY+PTA/KHU9KE4tZykqZixoPShfLWcpKmYpOih1PShfLWcpKmYsaD0oTi1nKSpmKSxpPmh8fHU+byk/ITE6KCh1Pml8fGkhPT1pKSYmKGk9dSksKGg8b3x8byE9PW8pJiYobz1oKSxpPD1uJiZvPj1zKX1mdW5jdGlvbiBkbChyLHQsZSxzLG4saSxvLGEpe2NvbnN0e2dlb21ldHJ5OmMsX2luZGlyZWN0QnVmZmVyOnV9PXI7Zm9yKGxldCBoPXMsbD1zK247aDxsO2grKyl7bGV0IGQ9dT91W2hdOmg7dW4oYyx0LGUsZCxpLG8sYSl9fWZ1bmN0aW9uIGZsKHIsdCxlLHMsbixpLG8pe2NvbnN0e2dlb21ldHJ5OmEsX2luZGlyZWN0QnVmZmVyOmN9PXI7bGV0IHU9MS8wLGg9bnVsbDtmb3IobGV0IGw9cyxkPXMrbjtsPGQ7bCsrKXtsZXQgZjtmPXVuKGEsdCxlLGM/Y1tsXTpsLG51bGwsaSxvKSxmJiZmLmRpc3RhbmNlPHUmJihoPWYsdT1mLmRpc3RhbmNlKX1yZXR1cm4gaH1mdW5jdGlvbiBwbChyLHQsZSxzLG4saSxvKXtjb25zdHtnZW9tZXRyeTphfT1lLHtpbmRleDpjfT1hLHU9YS5hdHRyaWJ1dGVzLnBvc2l0aW9uO2ZvcihsZXQgaD1yLGw9dCtyO2g8bDtoKyspe2xldCBkO2lmKGQ9ZS5yZXNvbHZlVHJpYW5nbGVJbmRleChoKSxzdChvLGQqMyxjLHUpLG8ubmVlZHNVcGRhdGU9ITAscyhvLGQsbixpKSlyZXR1cm4hMH1yZXR1cm4hMX1mdW5jdGlvbiBtbChyLHQsZSxzLG4saSxvKXtYLnNldEJ1ZmZlcihyLl9yb290c1t0XSksRWkoMCxyLGUscyxuLGksbyksWC5jbGVhckJ1ZmZlcigpfWZ1bmN0aW9uIEVpKHIsdCxlLHMsbixpLG8pe2NvbnN0e2Zsb2F0MzJBcnJheTphLHVpbnQxNkFycmF5OmMsdWludDMyQXJyYXk6dX09WCxoPXIqMjtpZihwdChoLGMpKXtjb25zdCBkPVR0KHIsdSksZj1TdChoLGMpO2NsKHQsZSxzLGQsZixuLGksbyl9ZWxzZXtjb25zdCBkPV90KHIpO2NlKGQsYSxzLGksbykmJkVpKGQsdCxlLHMsbixpLG8pO2NvbnN0IGY9enQocix1KTtjZShmLGEscyxpLG8pJiZFaShmLHQsZSxzLG4saSxvKX19Y29uc3QgeWw9WyJ4IiwieSIsInoiXTtmdW5jdGlvbiBnbChyLHQsZSxzLG4saSl7WC5zZXRCdWZmZXIoci5fcm9vdHNbdF0pO2NvbnN0IG89Q2koMCxyLGUscyxuLGkpO3JldHVybiBYLmNsZWFyQnVmZmVyKCksb31mdW5jdGlvbiBDaShyLHQsZSxzLG4saSl7Y29uc3R7ZmxvYXQzMkFycmF5Om8sdWludDE2QXJyYXk6YSx1aW50MzJBcnJheTpjfT1YO2xldCB1PXIqMjtpZihwdCh1LGEpKXtjb25zdCBsPVR0KHIsYyksZD1TdCh1LGEpO3JldHVybiBobCh0LGUscyxsLGQsbixpKX1lbHNle2NvbnN0IGw9VG8ocixjKSxkPXlsW2xdLHA9cy5kaXJlY3Rpb25bZF0+PTA7bGV0IG0sZztwPyhtPV90KHIpLGc9enQocixjKSk6KG09enQocixjKSxnPV90KHIpKTtjb25zdCBUPWNlKG0sbyxzLG4saSk/Q2kobSx0LGUscyxuLGkpOm51bGw7aWYoVCl7Y29uc3QgTj1ULnBvaW50W2RdO2lmKHA/Tjw9b1tnK2xdOk4+PW9bZytsKzNdKXJldHVybiBUfWNvbnN0IE09Y2UoZyxvLHMsbixpKT9DaShnLHQsZSxzLG4saSk6bnVsbDtyZXR1cm4gVCYmTT9ULmRpc3RhbmNlPD1NLmRpc3RhbmNlP1Q6TTpUfHxNfHxudWxsfX1jb25zdCBsbj1uZXcgaHQsa2U9bmV3IEx0LEhlPW5ldyBMdCxOcz1uZXcgbnQsX289bmV3IGx0LGRuPW5ldyBsdDtmdW5jdGlvbiB4bChyLHQsZSxzKXtYLnNldEJ1ZmZlcihyLl9yb290c1t0XSk7Y29uc3Qgbj1GaSgwLHIsZSxzKTtyZXR1cm4gWC5jbGVhckJ1ZmZlcigpLG59ZnVuY3Rpb24gRmkocix0LGUscyxuPW51bGwpe2NvbnN0e2Zsb2F0MzJBcnJheTppLHVpbnQxNkFycmF5Om8sdWludDMyQXJyYXk6YX09WDtsZXQgYz1yKjI7aWYobj09PW51bGwmJihlLmJvdW5kaW5nQm94fHxlLmNvbXB1dGVCb3VuZGluZ0JveCgpLF9vLnNldChlLmJvdW5kaW5nQm94Lm1pbixlLmJvdW5kaW5nQm94Lm1heCxzKSxuPV9vKSxwdChjLG8pKXtjb25zdCBoPXQuZ2VvbWV0cnksbD1oLmluZGV4LGQ9aC5hdHRyaWJ1dGVzLnBvc2l0aW9uLGY9ZS5pbmRleCxwPWUuYXR0cmlidXRlcy5wb3NpdGlvbixtPVR0KHIsYSksZz1TdChjLG8pO2lmKE5zLmNvcHkocykuaW52ZXJ0KCksZS5ib3VuZHNUcmVlKXJldHVybiBaKHIsaSxkbiksZG4ubWF0cml4LmNvcHkoTnMpLGRuLm5lZWRzVXBkYXRlPSEwLGUuYm91bmRzVHJlZS5zaGFwZWNhc3Qoe2ludGVyc2VjdHNCb3VuZHM6VD0+ZG4uaW50ZXJzZWN0c0JveChUKSxpbnRlcnNlY3RzVHJpYW5nbGU6VD0+e1QuYS5hcHBseU1hdHJpeDQocyksVC5iLmFwcGx5TWF0cml4NChzKSxULmMuYXBwbHlNYXRyaXg0KHMpLFQubmVlZHNVcGRhdGU9ITA7Zm9yKGxldCB3PW0qMyxNPShnK20pKjM7dzxNO3crPTMpaWYoc3QoSGUsdyxsLGQpLEhlLm5lZWRzVXBkYXRlPSEwLFQuaW50ZXJzZWN0c1RyaWFuZ2xlKEhlKSlyZXR1cm4hMDtyZXR1cm4hMX19KTtmb3IobGV0IHk9bSozLFQ9KGcrbSkqMzt5PFQ7eSs9Myl7c3Qoa2UseSxsLGQpLGtlLmEuYXBwbHlNYXRyaXg0KE5zKSxrZS5iLmFwcGx5TWF0cml4NChOcyksa2UuYy5hcHBseU1hdHJpeDQoTnMpLGtlLm5lZWRzVXBkYXRlPSEwO2ZvcihsZXQgdz0wLE09Zi5jb3VudDt3PE07dys9MylpZihzdChIZSx3LGYscCksSGUubmVlZHNVcGRhdGU9ITAsa2UuaW50ZXJzZWN0c1RyaWFuZ2xlKEhlKSlyZXR1cm4hMH19ZWxzZXtjb25zdCBoPXIrOCxsPWFbcis2XTtyZXR1cm4gWihoLGksbG4pLCEhKG4uaW50ZXJzZWN0c0JveChsbikmJkZpKGgsdCxlLHMsbil8fChaKGwsaSxsbiksbi5pbnRlcnNlY3RzQm94KGxuKSYmRmkobCx0LGUscyxuKSkpfX1jb25zdCBmbj1uZXcgbnQsUmk9bmV3IGx0LHdzPW5ldyBsdCxUbD1uZXcgQSxObD1uZXcgQSx3bD1uZXcgQSxBbD1uZXcgQTtmdW5jdGlvbiBNbChyLHQsZSxzPXt9LG49e30saT0wLG89MS8wKXt0LmJvdW5kaW5nQm94fHx0LmNvbXB1dGVCb3VuZGluZ0JveCgpLFJpLnNldCh0LmJvdW5kaW5nQm94Lm1pbix0LmJvdW5kaW5nQm94Lm1heCxlKSxSaS5uZWVkc1VwZGF0ZT0hMDtjb25zdCBhPXIuZ2VvbWV0cnksYz1hLmF0dHJpYnV0ZXMucG9zaXRpb24sdT1hLmluZGV4LGg9dC5hdHRyaWJ1dGVzLnBvc2l0aW9uLGw9dC5pbmRleCxkPWJ0LmdldFByaW1pdGl2ZSgpLGY9YnQuZ2V0UHJpbWl0aXZlKCk7bGV0IHA9VGwsbT1ObCxnPW51bGwseT1udWxsO24mJihnPXdsLHk9QWwpO2xldCBUPTEvMCx3PW51bGwsTT1udWxsO3JldHVybiBmbi5jb3B5KGUpLmludmVydCgpLHdzLm1hdHJpeC5jb3B5KGZuKSxyLnNoYXBlY2FzdCh7Ym91bmRzVHJhdmVyc2VPcmRlcjpOPT5SaS5kaXN0YW5jZVRvQm94KE4pLGludGVyc2VjdHNCb3VuZHM6KE4sXyxTKT0+UzxUJiZTPG8/KF8mJih3cy5taW4uY29weShOLm1pbiksd3MubWF4LmNvcHkoTi5tYXgpLHdzLm5lZWRzVXBkYXRlPSEwKSwhMCk6ITEsaW50ZXJzZWN0c1JhbmdlOihOLF8pPT57aWYodC5ib3VuZHNUcmVlKXJldHVybiB0LmJvdW5kc1RyZWUuc2hhcGVjYXN0KHtib3VuZHNUcmF2ZXJzZU9yZGVyOkU9PndzLmRpc3RhbmNlVG9Cb3goRSksaW50ZXJzZWN0c0JvdW5kczooRSxGLFIpPT5SPFQmJlI8byxpbnRlcnNlY3RzUmFuZ2U6KEUsRik9Pntmb3IobGV0IFI9RSxJPUUrRjtSPEk7UisrKXtzdChmLDMqUixsLGgpLGYuYS5hcHBseU1hdHJpeDQoZSksZi5iLmFwcGx5TWF0cml4NChlKSxmLmMuYXBwbHlNYXRyaXg0KGUpLGYubmVlZHNVcGRhdGU9ITA7Zm9yKGxldCBCPU4sUD1OK187QjxQO0IrKyl7c3QoZCwzKkIsdSxjKSxkLm5lZWRzVXBkYXRlPSEwO2NvbnN0IEw9ZC5kaXN0YW5jZVRvVHJpYW5nbGUoZixwLGcpO2lmKEw8VCYmKG0uY29weShwKSx5JiZ5LmNvcHkoZyksVD1MLHc9QixNPVIpLEw8aSlyZXR1cm4hMH19fX0pO3tjb25zdCBTPURlKHQpO2ZvcihsZXQgRT0wLEY9UztFPEY7RSsrKXtzdChmLDMqRSxsLGgpLGYuYS5hcHBseU1hdHJpeDQoZSksZi5iLmFwcGx5TWF0cml4NChlKSxmLmMuYXBwbHlNYXRyaXg0KGUpLGYubmVlZHNVcGRhdGU9ITA7Zm9yKGxldCBSPU4sST1OK187UjxJO1IrKyl7c3QoZCwzKlIsdSxjKSxkLm5lZWRzVXBkYXRlPSEwO2NvbnN0IEI9ZC5kaXN0YW5jZVRvVHJpYW5nbGUoZixwLGcpO2lmKEI8VCYmKG0uY29weShwKSx5JiZ5LmNvcHkoZyksVD1CLHc9UixNPUUpLEI8aSlyZXR1cm4hMH19fX19KSxidC5yZWxlYXNlUHJpbWl0aXZlKGQpLGJ0LnJlbGVhc2VQcmltaXRpdmUoZiksVD09PTEvMD9udWxsOihzLnBvaW50P3MucG9pbnQuY29weShtKTpzLnBvaW50PW0uY2xvbmUoKSxzLmRpc3RhbmNlPVQscy5mYWNlSW5kZXg9dyxuJiYobi5wb2ludD9uLnBvaW50LmNvcHkoeSk6bi5wb2ludD15LmNsb25lKCksbi5wb2ludC5hcHBseU1hdHJpeDQoZm4pLG0uYXBwbHlNYXRyaXg0KGZuKSxuLmRpc3RhbmNlPW0uc3ViKG4ucG9pbnQpLmxlbmd0aCgpLG4uZmFjZUluZGV4PU0pLHMpfWZ1bmN0aW9uIFNsKHIsdD1udWxsKXt0JiZBcnJheS5pc0FycmF5KHQpJiYodD1uZXcgU2V0KHQpKTtjb25zdCBlPXIuZ2VvbWV0cnkscz1lLmluZGV4P2UuaW5kZXguYXJyYXk6bnVsbCxuPWUuYXR0cmlidXRlcy5wb3NpdGlvbjtsZXQgaSxvLGEsYyx1PTA7Y29uc3QgaD1yLl9yb290cztmb3IobGV0IGQ9MCxmPWgubGVuZ3RoO2Q8ZjtkKyspaT1oW2RdLG89bmV3IFVpbnQzMkFycmF5KGkpLGE9bmV3IFVpbnQxNkFycmF5KGkpLGM9bmV3IEZsb2F0MzJBcnJheShpKSxsKDAsdSksdSs9aS5ieXRlTGVuZ3RoO2Z1bmN0aW9uIGwoZCxmLHA9ITEpe2NvbnN0IG09ZCoyO2lmKGFbbSsxNV09PT1lbil7Y29uc3QgeT1vW2QrNl0sVD1hW20rMTRdO2xldCB3PTEvMCxNPTEvMCxOPTEvMCxfPS0xLzAsUz0tMS8wLEU9LTEvMDtmb3IobGV0IEY9eSxSPXkrVDtGPFI7RisrKXtjb25zdCBJPTMqci5yZXNvbHZlVHJpYW5nbGVJbmRleChGKTtmb3IobGV0IEI9MDtCPDM7QisrKXtsZXQgUD1JK0I7UD1zP3NbUF06UDtjb25zdCBMPW4uZ2V0WChQKSxWPW4uZ2V0WShQKSxHPW4uZ2V0WihQKTtMPHcmJih3PUwpLEw+XyYmKF89TCksVjxNJiYoTT1WKSxWPlMmJihTPVYpLEc8TiYmKE49RyksRz5FJiYoRT1HKX19cmV0dXJuIGNbZCswXSE9PXd8fGNbZCsxXSE9PU18fGNbZCsyXSE9PU58fGNbZCszXSE9PV98fGNbZCs0XSE9PVN8fGNbZCs1XSE9PUU/KGNbZCswXT13LGNbZCsxXT1NLGNbZCsyXT1OLGNbZCszXT1fLGNbZCs0XT1TLGNbZCs1XT1FLCEwKTohMX1lbHNle2NvbnN0IHk9ZCs4LFQ9b1tkKzZdLHc9eStmLE09VCtmO2xldCBOPXAsXz0hMSxTPSExO3Q/Tnx8KF89dC5oYXModyksUz10LmhhcyhNKSxOPSFfJiYhUyk6KF89ITAsUz0hMCk7Y29uc3QgRT1OfHxfLEY9Tnx8UztsZXQgUj0hMTtFJiYoUj1sKHksZixOKSk7bGV0IEk9ITE7RiYmKEk9bChULGYsTikpO2NvbnN0IEI9Unx8STtpZihCKWZvcihsZXQgUD0wO1A8MztQKyspe2NvbnN0IEw9eStQLFY9VCtQLEc9Y1tMXSxOdD1jW0wrM10sSHQ9Y1tWXSxxdD1jW1YrM107Y1tkK1BdPUc8SHQ/RzpIdCxjW2QrUCszXT1OdD5xdD9OdDpxdH1yZXR1cm4gQn19fWZ1bmN0aW9uIF9sKHIsdCxlLHMsbixpLG8pe1guc2V0QnVmZmVyKHIuX3Jvb3RzW3RdKSxCaSgwLHIsZSxzLG4saSxvKSxYLmNsZWFyQnVmZmVyKCl9ZnVuY3Rpb24gQmkocix0LGUscyxuLGksbyl7Y29uc3R7ZmxvYXQzMkFycmF5OmEsdWludDE2QXJyYXk6Yyx1aW50MzJBcnJheTp1fT1YLGg9cioyO2lmKHB0KGgsYykpe2NvbnN0IGQ9VHQocix1KSxmPVN0KGgsYyk7ZGwodCxlLHMsZCxmLG4saSxvKX1lbHNle2NvbnN0IGQ9X3Qocik7Y2UoZCxhLHMsaSxvKSYmQmkoZCx0LGUscyxuLGksbyk7Y29uc3QgZj16dChyLHUpO2NlKGYsYSxzLGksbykmJkJpKGYsdCxlLHMsbixpLG8pfX1jb25zdCB6bD1bIngiLCJ5IiwieiJdO2Z1bmN0aW9uIGJsKHIsdCxlLHMsbixpKXtYLnNldEJ1ZmZlcihyLl9yb290c1t0XSk7Y29uc3Qgbz1JaSgwLHIsZSxzLG4saSk7cmV0dXJuIFguY2xlYXJCdWZmZXIoKSxvfWZ1bmN0aW9uIElpKHIsdCxlLHMsbixpKXtjb25zdHtmbG9hdDMyQXJyYXk6byx1aW50MTZBcnJheTphLHVpbnQzMkFycmF5OmN9PVg7bGV0IHU9cioyO2lmKHB0KHUsYSkpe2NvbnN0IGw9VHQocixjKSxkPVN0KHUsYSk7cmV0dXJuIGZsKHQsZSxzLGwsZCxuLGkpfWVsc2V7Y29uc3QgbD1UbyhyLGMpLGQ9emxbbF0scD1zLmRpcmVjdGlvbltkXT49MDtsZXQgbSxnO3A/KG09X3QociksZz16dChyLGMpKToobT16dChyLGMpLGc9X3QocikpO2NvbnN0IFQ9Y2UobSxvLHMsbixpKT9JaShtLHQsZSxzLG4saSk6bnVsbDtpZihUKXtjb25zdCBOPVQucG9pbnRbZF07aWYocD9OPD1vW2crbF06Tj49b1tnK2wrM10pcmV0dXJuIFR9Y29uc3QgTT1jZShnLG8scyxuLGkpP0lpKGcsdCxlLHMsbixpKTpudWxsO3JldHVybiBUJiZNP1QuZGlzdGFuY2U8PU0uZGlzdGFuY2U/VDpNOlR8fE18fG51bGx9fWNvbnN0IHBuPW5ldyBodCxxZT1uZXcgTHQsJGU9bmV3IEx0LEFzPW5ldyBudCx6bz1uZXcgbHQsbW49bmV3IGx0O2Z1bmN0aW9uIEVsKHIsdCxlLHMpe1guc2V0QnVmZmVyKHIuX3Jvb3RzW3RdKTtjb25zdCBuPXZpKDAscixlLHMpO3JldHVybiBYLmNsZWFyQnVmZmVyKCksbn1mdW5jdGlvbiB2aShyLHQsZSxzLG49bnVsbCl7Y29uc3R7ZmxvYXQzMkFycmF5OmksdWludDE2QXJyYXk6byx1aW50MzJBcnJheTphfT1YO2xldCBjPXIqMjtpZihuPT09bnVsbCYmKGUuYm91bmRpbmdCb3h8fGUuY29tcHV0ZUJvdW5kaW5nQm94KCksem8uc2V0KGUuYm91bmRpbmdCb3gubWluLGUuYm91bmRpbmdCb3gubWF4LHMpLG49em8pLHB0KGMsbykpe2NvbnN0IGg9dC5nZW9tZXRyeSxsPWguaW5kZXgsZD1oLmF0dHJpYnV0ZXMucG9zaXRpb24sZj1lLmluZGV4LHA9ZS5hdHRyaWJ1dGVzLnBvc2l0aW9uLG09VHQocixhKSxnPVN0KGMsbyk7aWYoQXMuY29weShzKS5pbnZlcnQoKSxlLmJvdW5kc1RyZWUpcmV0dXJuIFoocixpLG1uKSxtbi5tYXRyaXguY29weShBcyksbW4ubmVlZHNVcGRhdGU9ITAsZS5ib3VuZHNUcmVlLnNoYXBlY2FzdCh7aW50ZXJzZWN0c0JvdW5kczpUPT5tbi5pbnRlcnNlY3RzQm94KFQpLGludGVyc2VjdHNUcmlhbmdsZTpUPT57VC5hLmFwcGx5TWF0cml4NChzKSxULmIuYXBwbHlNYXRyaXg0KHMpLFQuYy5hcHBseU1hdHJpeDQocyksVC5uZWVkc1VwZGF0ZT0hMDtmb3IobGV0IHc9bSxNPWcrbTt3PE07dysrKWlmKHN0KCRlLDMqdC5yZXNvbHZlVHJpYW5nbGVJbmRleCh3KSxsLGQpLCRlLm5lZWRzVXBkYXRlPSEwLFQuaW50ZXJzZWN0c1RyaWFuZ2xlKCRlKSlyZXR1cm4hMDtyZXR1cm4hMX19KTtmb3IobGV0IHk9bSxUPWcrbTt5PFQ7eSsrKXtjb25zdCB3PXQucmVzb2x2ZVRyaWFuZ2xlSW5kZXgoeSk7c3QocWUsMyp3LGwsZCkscWUuYS5hcHBseU1hdHJpeDQoQXMpLHFlLmIuYXBwbHlNYXRyaXg0KEFzKSxxZS5jLmFwcGx5TWF0cml4NChBcykscWUubmVlZHNVcGRhdGU9ITA7Zm9yKGxldCBNPTAsTj1mLmNvdW50O008TjtNKz0zKWlmKHN0KCRlLE0sZixwKSwkZS5uZWVkc1VwZGF0ZT0hMCxxZS5pbnRlcnNlY3RzVHJpYW5nbGUoJGUpKXJldHVybiEwfX1lbHNle2NvbnN0IGg9cis4LGw9YVtyKzZdO3JldHVybiBaKGgsaSxwbiksISEobi5pbnRlcnNlY3RzQm94KHBuKSYmdmkoaCx0LGUscyxuKXx8KFoobCxpLHBuKSxuLmludGVyc2VjdHNCb3gocG4pJiZ2aShsLHQsZSxzLG4pKSl9fWNvbnN0IHluPW5ldyBudCxQaT1uZXcgbHQsTXM9bmV3IGx0LENsPW5ldyBBLEZsPW5ldyBBLFJsPW5ldyBBLEJsPW5ldyBBO2Z1bmN0aW9uIElsKHIsdCxlLHM9e30sbj17fSxpPTAsbz0xLzApe3QuYm91bmRpbmdCb3h8fHQuY29tcHV0ZUJvdW5kaW5nQm94KCksUGkuc2V0KHQuYm91bmRpbmdCb3gubWluLHQuYm91bmRpbmdCb3gubWF4LGUpLFBpLm5lZWRzVXBkYXRlPSEwO2NvbnN0IGE9ci5nZW9tZXRyeSxjPWEuYXR0cmlidXRlcy5wb3NpdGlvbix1PWEuaW5kZXgsaD10LmF0dHJpYnV0ZXMucG9zaXRpb24sbD10LmluZGV4LGQ9YnQuZ2V0UHJpbWl0aXZlKCksZj1idC5nZXRQcmltaXRpdmUoKTtsZXQgcD1DbCxtPUZsLGc9bnVsbCx5PW51bGw7biYmKGc9UmwseT1CbCk7bGV0IFQ9MS8wLHc9bnVsbCxNPW51bGw7cmV0dXJuIHluLmNvcHkoZSkuaW52ZXJ0KCksTXMubWF0cml4LmNvcHkoeW4pLHIuc2hhcGVjYXN0KHtib3VuZHNUcmF2ZXJzZU9yZGVyOk49PlBpLmRpc3RhbmNlVG9Cb3goTiksaW50ZXJzZWN0c0JvdW5kczooTixfLFMpPT5TPFQmJlM8bz8oXyYmKE1zLm1pbi5jb3B5KE4ubWluKSxNcy5tYXguY29weShOLm1heCksTXMubmVlZHNVcGRhdGU9ITApLCEwKTohMSxpbnRlcnNlY3RzUmFuZ2U6KE4sXyk9PntpZih0LmJvdW5kc1RyZWUpe2NvbnN0IFM9dC5ib3VuZHNUcmVlO3JldHVybiBTLnNoYXBlY2FzdCh7Ym91bmRzVHJhdmVyc2VPcmRlcjpFPT5Ncy5kaXN0YW5jZVRvQm94KEUpLGludGVyc2VjdHNCb3VuZHM6KEUsRixSKT0+UjxUJiZSPG8saW50ZXJzZWN0c1JhbmdlOihFLEYpPT57Zm9yKGxldCBSPUUsST1FK0Y7UjxJO1IrKyl7Y29uc3QgQj1TLnJlc29sdmVUcmlhbmdsZUluZGV4KFIpO3N0KGYsMypCLGwsaCksZi5hLmFwcGx5TWF0cml4NChlKSxmLmIuYXBwbHlNYXRyaXg0KGUpLGYuYy5hcHBseU1hdHJpeDQoZSksZi5uZWVkc1VwZGF0ZT0hMDtmb3IobGV0IFA9TixMPU4rXztQPEw7UCsrKXtjb25zdCBWPXIucmVzb2x2ZVRyaWFuZ2xlSW5kZXgoUCk7c3QoZCwzKlYsdSxjKSxkLm5lZWRzVXBkYXRlPSEwO2NvbnN0IEc9ZC5kaXN0YW5jZVRvVHJpYW5nbGUoZixwLGcpO2lmKEc8VCYmKG0uY29weShwKSx5JiZ5LmNvcHkoZyksVD1HLHc9UCxNPVIpLEc8aSlyZXR1cm4hMH19fX0pfWVsc2V7Y29uc3QgUz1EZSh0KTtmb3IobGV0IEU9MCxGPVM7RTxGO0UrKyl7c3QoZiwzKkUsbCxoKSxmLmEuYXBwbHlNYXRyaXg0KGUpLGYuYi5hcHBseU1hdHJpeDQoZSksZi5jLmFwcGx5TWF0cml4NChlKSxmLm5lZWRzVXBkYXRlPSEwO2ZvcihsZXQgUj1OLEk9TitfO1I8STtSKyspe2NvbnN0IEI9ci5yZXNvbHZlVHJpYW5nbGVJbmRleChSKTtzdChkLDMqQix1LGMpLGQubmVlZHNVcGRhdGU9ITA7Y29uc3QgUD1kLmRpc3RhbmNlVG9UcmlhbmdsZShmLHAsZyk7aWYoUDxUJiYobS5jb3B5KHApLHkmJnkuY29weShnKSxUPVAsdz1SLE09RSksUDxpKXJldHVybiEwfX19fX0pLGJ0LnJlbGVhc2VQcmltaXRpdmUoZCksYnQucmVsZWFzZVByaW1pdGl2ZShmKSxUPT09MS8wP251bGw6KHMucG9pbnQ/cy5wb2ludC5jb3B5KG0pOnMucG9pbnQ9bS5jbG9uZSgpLHMuZGlzdGFuY2U9VCxzLmZhY2VJbmRleD13LG4mJihuLnBvaW50P24ucG9pbnQuY29weSh5KTpuLnBvaW50PXkuY2xvbmUoKSxuLnBvaW50LmFwcGx5TWF0cml4NCh5biksbS5hcHBseU1hdHJpeDQoeW4pLG4uZGlzdGFuY2U9bS5zdWIobi5wb2ludCkubGVuZ3RoKCksbi5mYWNlSW5kZXg9TSkscyl9ZnVuY3Rpb24gdmwoKXtyZXR1cm4gdHlwZW9mIFNoYXJlZEFycmF5QnVmZmVyPCJ1In1jb25zdCBTcz1uZXcgWC5jb25zdHJ1Y3Rvcixnbj1uZXcgWC5jb25zdHJ1Y3RvcixoZT1uZXcgX2koKCk9Pm5ldyBodCksR2U9bmV3IGh0LFdlPW5ldyBodCxMaT1uZXcgaHQsT2k9bmV3IGh0O2xldCBEaT0hMTtmdW5jdGlvbiBQbChyLHQsZSxzKXtpZihEaSl0aHJvdyBuZXcgRXJyb3IoIk1lc2hCVkg6IFJlY3Vyc2l2ZSBjYWxscyB0byBidmhjYXN0IG5vdCBzdXBwb3J0ZWQuIik7RGk9ITA7Y29uc3Qgbj1yLl9yb290cyxpPXQuX3Jvb3RzO2xldCBvLGE9MCxjPTA7Y29uc3QgdT1uZXcgbnQoKS5jb3B5KGUpLmludmVydCgpO2ZvcihsZXQgaD0wLGw9bi5sZW5ndGg7aDxsO2grKyl7U3Muc2V0QnVmZmVyKG5baF0pLGM9MDtjb25zdCBkPWhlLmdldFByaW1pdGl2ZSgpO1ooMCxTcy5mbG9hdDMyQXJyYXksZCksZC5hcHBseU1hdHJpeDQodSk7Zm9yKGxldCBmPTAscD1pLmxlbmd0aDtmPHAmJihnbi5zZXRCdWZmZXIoaVtmXSksbz1PdCgwLDAsZSx1LHMsYSxjLDAsMCxkKSxnbi5jbGVhckJ1ZmZlcigpLGMrPWlbZl0ubGVuZ3RoLCFvKTtmKyspO2lmKGhlLnJlbGVhc2VQcmltaXRpdmUoZCksU3MuY2xlYXJCdWZmZXIoKSxhKz1uW2hdLmxlbmd0aCxvKWJyZWFrfXJldHVybiBEaT0hMSxvfWZ1bmN0aW9uIE90KHIsdCxlLHMsbixpPTAsbz0wLGE9MCxjPTAsdT1udWxsLGg9ITEpe2xldCBsLGQ7aD8obD1nbixkPVNzKToobD1TcyxkPWduKTtjb25zdCBmPWwuZmxvYXQzMkFycmF5LHA9bC51aW50MzJBcnJheSxtPWwudWludDE2QXJyYXksZz1kLmZsb2F0MzJBcnJheSx5PWQudWludDMyQXJyYXksVD1kLnVpbnQxNkFycmF5LHc9cioyLE09dCoyLE49cHQodyxtKSxfPXB0KE0sVCk7bGV0IFM9ITE7aWYoXyYmTiloP1M9bihUdCh0LHkpLFN0KHQqMixUKSxUdChyLHApLFN0KHIqMixtKSxjLG8rdCxhLGkrcik6Uz1uKFR0KHIscCksU3QocioyLG0pLFR0KHQseSksU3QodCoyLFQpLGEsaStyLGMsbyt0KTtlbHNlIGlmKF8pe2NvbnN0IEU9aGUuZ2V0UHJpbWl0aXZlKCk7Wih0LGcsRSksRS5hcHBseU1hdHJpeDQoZSk7Y29uc3QgRj1fdChyKSxSPXp0KHIscCk7WihGLGYsR2UpLFooUixmLFdlKTtjb25zdCBJPUUuaW50ZXJzZWN0c0JveChHZSksQj1FLmludGVyc2VjdHNCb3goV2UpO1M9SSYmT3QodCxGLHMsZSxuLG8saSxjLGErMSxFLCFoKXx8QiYmT3QodCxSLHMsZSxuLG8saSxjLGErMSxFLCFoKSxoZS5yZWxlYXNlUHJpbWl0aXZlKEUpfWVsc2V7Y29uc3QgRT1fdCh0KSxGPXp0KHQseSk7WihFLGcsTGkpLFooRixnLE9pKTtjb25zdCBSPXUuaW50ZXJzZWN0c0JveChMaSksST11LmludGVyc2VjdHNCb3goT2kpO2lmKFImJkkpUz1PdChyLEUsZSxzLG4saSxvLGEsYysxLHUsaCl8fE90KHIsRixlLHMsbixpLG8sYSxjKzEsdSxoKTtlbHNlIGlmKFIpaWYoTilTPU90KHIsRSxlLHMsbixpLG8sYSxjKzEsdSxoKTtlbHNle2NvbnN0IEI9aGUuZ2V0UHJpbWl0aXZlKCk7Qi5jb3B5KExpKS5hcHBseU1hdHJpeDQoZSk7Y29uc3QgUD1fdChyKSxMPXp0KHIscCk7WihQLGYsR2UpLFooTCxmLFdlKTtjb25zdCBWPUIuaW50ZXJzZWN0c0JveChHZSksRz1CLmludGVyc2VjdHNCb3goV2UpO1M9ViYmT3QoRSxQLHMsZSxuLG8saSxjLGErMSxCLCFoKXx8RyYmT3QoRSxMLHMsZSxuLG8saSxjLGErMSxCLCFoKSxoZS5yZWxlYXNlUHJpbWl0aXZlKEIpfWVsc2UgaWYoSSlpZihOKVM9T3QocixGLGUscyxuLGksbyxhLGMrMSx1LGgpO2Vsc2V7Y29uc3QgQj1oZS5nZXRQcmltaXRpdmUoKTtCLmNvcHkoT2kpLmFwcGx5TWF0cml4NChlKTtjb25zdCBQPV90KHIpLEw9enQocixwKTtaKFAsZixHZSksWihMLGYsV2UpO2NvbnN0IFY9Qi5pbnRlcnNlY3RzQm94KEdlKSxHPUIuaW50ZXJzZWN0c0JveChXZSk7Uz1WJiZPdChGLFAscyxlLG4sbyxpLGMsYSsxLEIsIWgpfHxHJiZPdChGLEwscyxlLG4sbyxpLGMsYSsxLEIsIWgpLGhlLnJlbGVhc2VQcmltaXRpdmUoQil9fXJldHVybiBTfWNvbnN0IHhuPW5ldyBsdCxibz1uZXcgaHQsTGw9e3N0cmF0ZWd5OnVvLG1heERlcHRoOjQwLG1heExlYWZUcmlzOjEwLHVzZVNoYXJlZEFycmF5QnVmZmVyOiExLHNldEJvdW5kaW5nQm94OiEwLG9uUHJvZ3Jlc3M6bnVsbCxpbmRpcmVjdDohMSx2ZXJib3NlOiEwLHJhbmdlOm51bGx9O2NsYXNzIFRue3N0YXRpYyBzZXJpYWxpemUodCxlPXt9KXtlPXtjbG9uZUJ1ZmZlcnM6ITAsLi4uZX07Y29uc3Qgcz10Lmdlb21ldHJ5LG49dC5fcm9vdHMsaT10Ll9pbmRpcmVjdEJ1ZmZlcixvPXMuZ2V0SW5kZXgoKTtsZXQgYTtyZXR1cm4gZS5jbG9uZUJ1ZmZlcnM/YT17cm9vdHM6bi5tYXAoYz0+Yy5zbGljZSgpKSxpbmRleDpvP28uYXJyYXkuc2xpY2UoKTpudWxsLGluZGlyZWN0QnVmZmVyOmk/aS5zbGljZSgpOm51bGx9OmE9e3Jvb3RzOm4saW5kZXg6bz9vLmFycmF5Om51bGwsaW5kaXJlY3RCdWZmZXI6aX0sYX1zdGF0aWMgZGVzZXJpYWxpemUodCxlLHM9e30pe3M9e3NldEluZGV4OiEwLGluZGlyZWN0OiEhdC5pbmRpcmVjdEJ1ZmZlciwuLi5zfTtjb25zdHtpbmRleDpuLHJvb3RzOmksaW5kaXJlY3RCdWZmZXI6b309dCxhPW5ldyBUbihlLHsuLi5zLFt4aV06ITB9KTtpZihhLl9yb290cz1pLGEuX2luZGlyZWN0QnVmZmVyPW98fG51bGwscy5zZXRJbmRleCl7Y29uc3QgYz1lLmdldEluZGV4KCk7aWYoYz09PW51bGwpe2NvbnN0IHU9bmV3IHZ0KHQuaW5kZXgsMSwhMSk7ZS5zZXRJbmRleCh1KX1lbHNlIGMuYXJyYXkhPT1uJiYoYy5hcnJheS5zZXQobiksYy5uZWVkc1VwZGF0ZT0hMCl9cmV0dXJuIGF9Z2V0IGluZGlyZWN0KCl7cmV0dXJuISF0aGlzLl9pbmRpcmVjdEJ1ZmZlcn1jb25zdHJ1Y3Rvcih0LGU9e30pe2lmKHQuaXNCdWZmZXJHZW9tZXRyeSl7aWYodC5pbmRleCYmdC5pbmRleC5pc0ludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlKXRocm93IG5ldyBFcnJvcigiTWVzaEJWSDogSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUgaXMgbm90IHN1cHBvcnRlZCBmb3IgdGhlIGluZGV4IGF0dHJpYnV0ZS4iKX1lbHNlIHRocm93IG5ldyBFcnJvcigiTWVzaEJWSDogT25seSBCdWZmZXJHZW9tZXRyaWVzIGFyZSBzdXBwb3J0ZWQuIik7aWYoZT1PYmplY3QuYXNzaWduKHsuLi5MbCxbeGldOiExfSxlKSxlLnVzZVNoYXJlZEFycmF5QnVmZmVyJiYhdmwoKSl0aHJvdyBuZXcgRXJyb3IoIk1lc2hCVkg6IFNoYXJlZEFycmF5QnVmZmVyIGlzIG5vdCBhdmFpbGFibGUuIik7dGhpcy5nZW9tZXRyeT10LHRoaXMuX3Jvb3RzPW51bGwsdGhpcy5faW5kaXJlY3RCdWZmZXI9bnVsbCxlW3hpXXx8KGp1KHRoaXMsZSksIXQuYm91bmRpbmdCb3gmJmUuc2V0Qm91bmRpbmdCb3gmJih0LmJvdW5kaW5nQm94PXRoaXMuZ2V0Qm91bmRpbmdCb3gobmV3IGh0KSkpLHRoaXMucmVzb2x2ZVRyaWFuZ2xlSW5kZXg9ZS5pbmRpcmVjdD9zPT50aGlzLl9pbmRpcmVjdEJ1ZmZlcltzXTpzPT5zfXJlZml0KHQ9bnVsbCl7cmV0dXJuKHRoaXMuaW5kaXJlY3Q/U2w6bGwpKHRoaXMsdCl9dHJhdmVyc2UodCxlPTApe2NvbnN0IHM9dGhpcy5fcm9vdHNbZV0sbj1uZXcgVWludDMyQXJyYXkocyksaT1uZXcgVWludDE2QXJyYXkocyk7bygwKTtmdW5jdGlvbiBvKGEsYz0wKXtjb25zdCB1PWEqMixoPWlbdSsxNV09PT1lbjtpZihoKXtjb25zdCBsPW5bYSs2XSxkPWlbdSsxNF07dChjLGgsbmV3IEZsb2F0MzJBcnJheShzLGEqNCw2KSxsLGQpfWVsc2V7Y29uc3QgbD1hK21zLzQsZD1uW2ErNl0sZj1uW2ErN107dChjLGgsbmV3IEZsb2F0MzJBcnJheShzLGEqNCw2KSxmKXx8KG8obCxjKzEpLG8oZCxjKzEpKX19fXJheWNhc3QodCxlPVZpLHM9MCxuPTEvMCl7Y29uc3QgaT10aGlzLl9yb290cyxvPXRoaXMuZ2VvbWV0cnksYT1bXSxjPWUuaXNNYXRlcmlhbCx1PUFycmF5LmlzQXJyYXkoZSksaD1vLmdyb3VwcyxsPWM/ZS5zaWRlOmUsZD10aGlzLmluZGlyZWN0P19sOm1sO2ZvcihsZXQgZj0wLHA9aS5sZW5ndGg7ZjxwO2YrKyl7Y29uc3QgbT11P2VbaFtmXS5tYXRlcmlhbEluZGV4XS5zaWRlOmwsZz1hLmxlbmd0aDtpZihkKHRoaXMsZixtLHQsYSxzLG4pLHUpe2NvbnN0IHk9aFtmXS5tYXRlcmlhbEluZGV4O2ZvcihsZXQgVD1nLHc9YS5sZW5ndGg7VDx3O1QrKylhW1RdLmZhY2UubWF0ZXJpYWxJbmRleD15fX1yZXR1cm4gYX1yYXljYXN0Rmlyc3QodCxlPVZpLHM9MCxuPTEvMCl7Y29uc3QgaT10aGlzLl9yb290cyxvPXRoaXMuZ2VvbWV0cnksYT1lLmlzTWF0ZXJpYWwsYz1BcnJheS5pc0FycmF5KGUpO2xldCB1PW51bGw7Y29uc3QgaD1vLmdyb3VwcyxsPWE/ZS5zaWRlOmUsZD10aGlzLmluZGlyZWN0P2JsOmdsO2ZvcihsZXQgZj0wLHA9aS5sZW5ndGg7ZjxwO2YrKyl7Y29uc3QgbT1jP2VbaFtmXS5tYXRlcmlhbEluZGV4XS5zaWRlOmwsZz1kKHRoaXMsZixtLHQscyxuKTtnIT1udWxsJiYodT09bnVsbHx8Zy5kaXN0YW5jZTx1LmRpc3RhbmNlKSYmKHU9ZyxjJiYoZy5mYWNlLm1hdGVyaWFsSW5kZXg9aFtmXS5tYXRlcmlhbEluZGV4KSl9cmV0dXJuIHV9aW50ZXJzZWN0c0dlb21ldHJ5KHQsZSl7bGV0IHM9ITE7Y29uc3Qgbj10aGlzLl9yb290cyxpPXRoaXMuaW5kaXJlY3Q/RWw6eGw7Zm9yKGxldCBvPTAsYT1uLmxlbmd0aDtvPGEmJihzPWkodGhpcyxvLHQsZSksIXMpO28rKyk7cmV0dXJuIHN9c2hhcGVjYXN0KHQpe2NvbnN0IGU9YnQuZ2V0UHJpbWl0aXZlKCkscz10aGlzLmluZGlyZWN0P3BsOnVsO2xldHtib3VuZHNUcmF2ZXJzZU9yZGVyOm4saW50ZXJzZWN0c0JvdW5kczppLGludGVyc2VjdHNSYW5nZTpvLGludGVyc2VjdHNUcmlhbmdsZTphfT10O2lmKG8mJmEpe2NvbnN0IGw9bztvPShkLGYscCxtLGcpPT5sKGQsZixwLG0sZyk/ITA6cyhkLGYsdGhpcyxhLHAsbSxlKX1lbHNlIG98fChhP289KGwsZCxmLHApPT5zKGwsZCx0aGlzLGEsZixwLGUpOm89KGwsZCxmKT0+Zik7bGV0IGM9ITEsdT0wO2NvbnN0IGg9dGhpcy5fcm9vdHM7Zm9yKGxldCBsPTAsZD1oLmxlbmd0aDtsPGQ7bCsrKXtjb25zdCBmPWhbbF07aWYoYz1ubCh0aGlzLGwsaSxvLG4sdSksYylicmVhazt1Kz1mLmJ5dGVMZW5ndGh9cmV0dXJuIGJ0LnJlbGVhc2VQcmltaXRpdmUoZSksY31idmhjYXN0KHQsZSxzKXtsZXR7aW50ZXJzZWN0c1JhbmdlczpuLGludGVyc2VjdHNUcmlhbmdsZXM6aX09cztjb25zdCBvPWJ0LmdldFByaW1pdGl2ZSgpLGE9dGhpcy5nZW9tZXRyeS5pbmRleCxjPXRoaXMuZ2VvbWV0cnkuYXR0cmlidXRlcy5wb3NpdGlvbix1PXRoaXMuaW5kaXJlY3Q/cD0+e2NvbnN0IG09dGhpcy5yZXNvbHZlVHJpYW5nbGVJbmRleChwKTtzdChvLG0qMyxhLGMpfTpwPT57c3QobyxwKjMsYSxjKX0saD1idC5nZXRQcmltaXRpdmUoKSxsPXQuZ2VvbWV0cnkuaW5kZXgsZD10Lmdlb21ldHJ5LmF0dHJpYnV0ZXMucG9zaXRpb24sZj10LmluZGlyZWN0P3A9Pntjb25zdCBtPXQucmVzb2x2ZVRyaWFuZ2xlSW5kZXgocCk7c3QoaCxtKjMsbCxkKX06cD0+e3N0KGgscCozLGwsZCl9O2lmKGkpe2NvbnN0IHA9KG0sZyx5LFQsdyxNLE4sXyk9Pntmb3IobGV0IFM9eSxFPXkrVDtTPEU7UysrKXtmKFMpLGguYS5hcHBseU1hdHJpeDQoZSksaC5iLmFwcGx5TWF0cml4NChlKSxoLmMuYXBwbHlNYXRyaXg0KGUpLGgubmVlZHNVcGRhdGU9ITA7Zm9yKGxldCBGPW0sUj1tK2c7RjxSO0YrKylpZih1KEYpLG8ubmVlZHNVcGRhdGU9ITAsaShvLGgsRixTLHcsTSxOLF8pKXJldHVybiEwfXJldHVybiExfTtpZihuKXtjb25zdCBtPW47bj1mdW5jdGlvbihnLHksVCx3LE0sTixfLFMpe3JldHVybiBtKGcseSxULHcsTSxOLF8sUyk/ITA6cChnLHksVCx3LE0sTixfLFMpfX1lbHNlIG49cH1yZXR1cm4gUGwodGhpcyx0LGUsbil9aW50ZXJzZWN0c0JveCh0LGUpe3JldHVybiB4bi5zZXQodC5taW4sdC5tYXgsZSkseG4ubmVlZHNVcGRhdGU9ITAsdGhpcy5zaGFwZWNhc3Qoe2ludGVyc2VjdHNCb3VuZHM6cz0+eG4uaW50ZXJzZWN0c0JveChzKSxpbnRlcnNlY3RzVHJpYW5nbGU6cz0+eG4uaW50ZXJzZWN0c1RyaWFuZ2xlKHMpfSl9aW50ZXJzZWN0c1NwaGVyZSh0KXtyZXR1cm4gdGhpcy5zaGFwZWNhc3Qoe2ludGVyc2VjdHNCb3VuZHM6ZT0+dC5pbnRlcnNlY3RzQm94KGUpLGludGVyc2VjdHNUcmlhbmdsZTplPT5lLmludGVyc2VjdHNTcGhlcmUodCl9KX1jbG9zZXN0UG9pbnRUb0dlb21ldHJ5KHQsZSxzPXt9LG49e30saT0wLG89MS8wKXtyZXR1cm4odGhpcy5pbmRpcmVjdD9JbDpNbCkodGhpcyx0LGUscyxuLGksbyl9Y2xvc2VzdFBvaW50VG9Qb2ludCh0LGU9e30scz0wLG49MS8wKXtyZXR1cm4gaWwodGhpcyx0LGUscyxuKX1nZXRCb3VuZGluZ0JveCh0KXtyZXR1cm4gdC5tYWtlRW1wdHkoKSx0aGlzLl9yb290cy5mb3JFYWNoKHM9PntaKDAsbmV3IEZsb2F0MzJBcnJheShzKSxibyksdC51bmlvbihibyl9KSx0fX1vbm1lc3NhZ2U9KHtkYXRhOnJ9KT0+e2xldCB0PXBlcmZvcm1hbmNlLm5vdygpO2Z1bmN0aW9uIGUobyl7bz1NYXRoLm1pbihvLDEpO2NvbnN0IGE9cGVyZm9ybWFuY2Uubm93KCk7YS10Pj0xMCYmbyE9PTEmJihwb3N0TWVzc2FnZSh7ZXJyb3I6bnVsbCxzZXJpYWxpemVkOm51bGwscG9zaXRpb246bnVsbCxwcm9ncmVzczpvfSksdD1hKX1jb25zdHtpbmRleDpzLHBvc2l0aW9uOm4sb3B0aW9uczppfT1yO3RyeXtjb25zdCBvPW5ldyBHbjtpZihvLnNldEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyB2dChuLDMsITEpKSxzJiZvLnNldEluZGV4KG5ldyB2dChzLDEsITEpKSxpLmluY2x1ZGVkUHJvZ3Jlc3NDYWxsYmFjayYmKGkub25Qcm9ncmVzcz1lKSxpLmdyb3Vwcyl7Y29uc3QgaD1pLmdyb3Vwcztmb3IoY29uc3QgbCBpbiBoKXtjb25zdCBkPWhbbF07by5hZGRHcm91cChkLnN0YXJ0LGQuY291bnQsZC5tYXRlcmlhbEluZGV4KX19Y29uc3QgYT1uZXcgVG4obyxpKSxjPVRuLnNlcmlhbGl6ZShhLHtjb3B5SW5kZXhCdWZmZXI6ITF9KTtsZXQgdT1bbi5idWZmZXIsLi4uYy5yb290c107Yy5pbmRleCYmdS5wdXNoKGMuaW5kZXguYnVmZmVyKSx1PXUuZmlsdGVyKGg9PnR5cGVvZiBTaGFyZWRBcnJheUJ1ZmZlcj4idSJ8fCEoaCBpbnN0YW5jZW9mIFNoYXJlZEFycmF5QnVmZmVyKSksYS5faW5kaXJlY3RCdWZmZXImJnUucHVzaChjLmluZGlyZWN0QnVmZmVyLmJ1ZmZlcikscG9zdE1lc3NhZ2Uoe2Vycm9yOm51bGwsc2VyaWFsaXplZDpjLHBvc2l0aW9uOm4scHJvZ3Jlc3M6MX0sdSl9Y2F0Y2gobyl7cG9zdE1lc3NhZ2Uoe2Vycm9yOm8sc2VyaWFsaXplZDpudWxsLHBvc2l0aW9uOm51bGwscHJvZ3Jlc3M6MX0pfX19KSgpOwo=",Vl=typeof window<"u"&&window.Blob&&new Blob([atob(Xl)],{type:"text/javascript;charset=utf-8"});function wu(){let n;try{if(n=Vl&&(window.URL||window.webkitURL).createObjectURL(Vl),!n)throw"";return new Worker(n)}catch{return new Worker("data:application/javascript;base64,"+Xl)}finally{n&&(window.URL||window.webkitURL).revokeObjectURL(n)}}export{dr as $70d766613f57b014$export$2e2bcd8739ae039,Dd as BatchedParticleRenderer,ko as Builder,Bi as ByteBuffer,Qt as ConstantColor,U as ConstantValue,je as Matrix4,xt as MeshBVH,wl as MotionController,Ls as ParticleSystem,v as RenderMode,Do as SIZE_PREFIX_LENGTH,En as TrailParticle,Ce as Vector4,Pu as WorkerBase,wu as WorkerWrapper,xc as bundler,Ad as createNoise4D,Nl as fetchProfile,oh as index,Uu as index$1,Uc as md5,Hc as v5};