/*! For license information please see bundle.js.LICENSE.txt */ !function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.physicalSvg=t():e.physicalSvg=t()}(self,(()=>(()=>{var e={842:function(e,t,n){var o;o=function(){return function(e){var t={};function n(o){if(t[o])return t[o].exports;var r=t[o]={i:o,l:!1,exports:{}};return e[o].call(r.exports,r,r.exports,n),r.l=!0,r.exports}return n.m=e,n.c=t,n.d=function(e,t,o){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:o})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var o=Object.create(null);if(n.r(o),Object.defineProperty(o,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var r in e)n.d(o,r,function(t){return e[t]}.bind(null,r));return o},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=21)}([function(e,t){var o={};e.exports=o,function(){o._nextId=0,o._seed=0,o._nowStartTime=+new Date,o._warnedOnce={},o._decomp=null,o.extend=function(e,t){var n,r;"boolean"==typeof t?(n=2,r=t):(n=1,r=!0);for(var i=n;i0;t--){var n=Math.floor(o.random()*(t+1)),r=e[t];e[t]=e[n],e[n]=r}return e},o.choose=function(e){return e[Math.floor(o.random()*e.length)]},o.isElement=function(e){return"undefined"!=typeof HTMLElement?e instanceof HTMLElement:!!(e&&e.nodeType&&e.nodeName)},o.isArray=function(e){return"[object Array]"===Object.prototype.toString.call(e)},o.isFunction=function(e){return"function"==typeof e},o.isPlainObject=function(e){return"object"==typeof e&&e.constructor===Object},o.isString=function(e){return"[object String]"===toString.call(e)},o.clamp=function(e,t,n){return en?n:e},o.sign=function(e){return e<0?-1:1},o.now=function(){if("undefined"!=typeof window&&window.performance){if(window.performance.now)return window.performance.now();if(window.performance.webkitNow)return window.performance.webkitNow()}return Date.now?Date.now():new Date-o._nowStartTime},o.random=function(t,n){return n=void 0!==n?n:1,(t=void 0!==t?t:0)+e()*(n-t)};var e=function(){return o._seed=(9301*o._seed+49297)%233280,o._seed/233280};o.colorToNumber=function(e){return 3==(e=e.replace("#","")).length&&(e=e.charAt(0)+e.charAt(0)+e.charAt(1)+e.charAt(1)+e.charAt(2)+e.charAt(2)),parseInt(e,16)},o.logLevel=1,o.log=function(){console&&o.logLevel>0&&o.logLevel<=3&&console.log.apply(console,["matter-js:"].concat(Array.prototype.slice.call(arguments)))},o.info=function(){console&&o.logLevel>0&&o.logLevel<=2&&console.info.apply(console,["matter-js:"].concat(Array.prototype.slice.call(arguments)))},o.warn=function(){console&&o.logLevel>0&&o.logLevel<=3&&console.warn.apply(console,["matter-js:"].concat(Array.prototype.slice.call(arguments)))},o.warnOnce=function(){var e=Array.prototype.slice.call(arguments).join(" ");o._warnedOnce[e]||(o.warn(e),o._warnedOnce[e]=!0)},o.deprecated=function(e,t,n){e[t]=o.chain((function(){o.warnOnce("🔅 deprecated 🔅",n)}),e[t])},o.nextId=function(){return o._nextId++},o.indexOf=function(e,t){if(e.indexOf)return e.indexOf(t);for(var n=0;ne.max.x&&(e.max.x=r.x),r.xe.max.y&&(e.max.y=r.y),r.y0?e.max.x+=n.x:e.min.x+=n.x,n.y>0?e.max.y+=n.y:e.min.y+=n.y)},n.contains=function(e,t){return t.x>=e.min.x&&t.x<=e.max.x&&t.y>=e.min.y&&t.y<=e.max.y},n.overlaps=function(e,t){return e.min.x<=t.max.x&&e.max.x>=t.min.x&&e.max.y>=t.min.y&&e.min.y<=t.max.y},n.translate=function(e,t){e.min.x+=t.x,e.max.x+=t.x,e.min.y+=t.y,e.max.y+=t.y},n.shift=function(e,t){var n=e.max.x-e.min.x,o=e.max.y-e.min.y;e.min.x=t.x,e.max.x=t.x+n,e.min.y=t.y,e.max.y=t.y+o}},function(e,t){var n={};e.exports=n,n.create=function(e,t){return{x:e||0,y:t||0}},n.clone=function(e){return{x:e.x,y:e.y}},n.magnitude=function(e){return Math.sqrt(e.x*e.x+e.y*e.y)},n.magnitudeSquared=function(e){return e.x*e.x+e.y*e.y},n.rotate=function(e,t,n){var o=Math.cos(t),r=Math.sin(t);n||(n={});var i=e.x*o-e.y*r;return n.y=e.x*r+e.y*o,n.x=i,n},n.rotateAbout=function(e,t,n,o){var r=Math.cos(t),i=Math.sin(t);o||(o={});var s=n.x+((e.x-n.x)*r-(e.y-n.y)*i);return o.y=n.y+((e.x-n.x)*i+(e.y-n.y)*r),o.x=s,o},n.normalise=function(e){var t=n.magnitude(e);return 0===t?{x:0,y:0}:{x:e.x/t,y:e.y/t}},n.dot=function(e,t){return e.x*t.x+e.y*t.y},n.cross=function(e,t){return e.x*t.y-e.y*t.x},n.cross3=function(e,t,n){return(t.x-e.x)*(n.y-e.y)-(t.y-e.y)*(n.x-e.x)},n.add=function(e,t,n){return n||(n={}),n.x=e.x+t.x,n.y=e.y+t.y,n},n.sub=function(e,t,n){return n||(n={}),n.x=e.x-t.x,n.y=e.y-t.y,n},n.mult=function(e,t){return{x:e.x*t,y:e.y*t}},n.div=function(e,t){return{x:e.x/t,y:e.y/t}},n.perp=function(e,t){return{x:(t=!0===t?-1:1)*-e.y,y:t*e.x}},n.neg=function(e){return{x:-e.x,y:-e.y}},n.angle=function(e,t){return Math.atan2(t.y-e.y,t.x-e.x)},n._temp=[n.create(),n.create(),n.create(),n.create(),n.create(),n.create()]},function(e,t,n){var o={};e.exports=o;var r=n(2),i=n(0);o.create=function(e,t){for(var n=[],o=0;o0)return!1;s=n}return!0},o.scale=function(e,t,n,i){if(1===t&&1===n)return e;var s,a;i=i||o.centre(e);for(var c=0;c=0?c-1:e.length-1],u=e[c],p=e[(c+1)%e.length],d=t[c0&&(i|=2),3===i)return!1;return 0!==i||null},o.hull=function(e){var t,n,o=[],i=[];for((e=e.slice(0)).sort((function(e,t){var n=e.x-t.x;return 0!==n?n:e.y-t.y})),n=0;n=2&&r.cross3(i[i.length-2],i[i.length-1],t)<=0;)i.pop();i.push(t)}for(n=e.length-1;n>=0;n-=1){for(t=e[n];o.length>=2&&r.cross3(o[o.length-2],o[o.length-1],t)<=0;)o.pop();o.push(t)}return o.pop(),i.pop(),o.concat(i)}},function(e,t,n){var o={};e.exports=o;var r=n(0);o.on=function(e,t,n){for(var o,r=t.split(" "),i=0;i0){n||(n={}),o=t.split(" ");for(var l=0;l0&&i.rotateAbout(s.position,n,e.position,s.position)}},o.setVelocity=function(e,t){e.positionPrev.x=e.position.x-t.x,e.positionPrev.y=e.position.y-t.y,e.velocity.x=t.x,e.velocity.y=t.y,e.speed=i.magnitude(e.velocity)},o.setAngularVelocity=function(e,t){e.anglePrev=e.angle-t,e.angularVelocity=t,e.angularSpeed=Math.abs(e.angularVelocity)},o.translate=function(e,t){o.setPosition(e,i.add(e.position,t))},o.rotate=function(e,t,n){if(n){var r=Math.cos(t),i=Math.sin(t),s=e.position.x-n.x,a=e.position.y-n.y;o.setPosition(e,{x:n.x+(s*r-a*i),y:n.y+(s*i+a*r)}),o.setAngle(e,e.angle+t)}else o.setAngle(e,e.angle+t)},o.scale=function(e,t,n,i){var s=0,a=0;i=i||e.position;for(var u=0;u0&&(s+=p.area,a+=p.inertia),p.position.x=i.x+(p.position.x-i.x)*t,p.position.y=i.y+(p.position.y-i.y)*n,c.update(p.bounds,p.vertices,e.velocity)}e.parts.length>1&&(e.area=s,e.isStatic||(o.setMass(e,e.density*s),o.setInertia(e,a))),e.circleRadius&&(t===n?e.circleRadius*=t:e.circleRadius=null)},o.update=function(e,t,n,o){var s=Math.pow(t*n*e.timeScale,2),a=1-e.frictionAir*n*e.timeScale,u=e.position.x-e.positionPrev.x,p=e.position.y-e.positionPrev.y;e.velocity.x=u*a*o+e.force.x/e.mass*s,e.velocity.y=p*a*o+e.force.y/e.mass*s,e.positionPrev.x=e.position.x,e.positionPrev.y=e.position.y,e.position.x+=e.velocity.x,e.position.y+=e.velocity.y,e.angularVelocity=(e.angle-e.anglePrev)*a*o+e.torque/e.inertia*s,e.anglePrev=e.angle,e.angle+=e.angularVelocity,e.speed=i.magnitude(e.velocity),e.angularSpeed=Math.abs(e.angularVelocity);for(var d=0;d0&&(f.position.x+=e.velocity.x,f.position.y+=e.velocity.y),0!==e.angularVelocity&&(r.rotate(f.vertices,e.angularVelocity,e.position),l.rotate(f.axes,e.angularVelocity),d>0&&i.rotateAbout(f.position,e.angularVelocity,e.position,f.position)),c.update(f.bounds,f.vertices,e.velocity)}},o.applyForce=function(e,t,n){e.force.x+=n.x,e.force.y+=n.y;var o=t.x-e.position.x,r=t.y-e.position.y;e.torque+=o*n.y-r*n.x},o._totalProperties=function(e){for(var t={mass:0,area:0,inertia:0,centre:{x:0,y:0}},n=1===e.parts.length?0:1;n0&&i.motion=i.sleepThreshold&&o.set(i,!0)):i.sleepCounter>0&&(i.sleepCounter-=1)}else o.set(i,!1)}},o.afterCollisions=function(e,t){for(var n=t*t*t,r=0;ro._motionWakeThreshold*n&&o.set(l,!1)}}}},o.set=function(e,t){var n=e.isSleeping;t?(e.isSleeping=!0,e.sleepCounter=e.sleepThreshold,e.positionImpulse.x=0,e.positionImpulse.y=0,e.positionPrev.x=e.position.x,e.positionPrev.y=e.position.y,e.anglePrev=e.angle,e.speed=0,e.angularSpeed=0,e.motion=0,n||r.trigger(e,"sleepStart")):(e.isSleeping=!1,e.sleepCounter=0,n&&r.trigger(e,"sleepEnd"))}},function(e,t,n){var o={};e.exports=o;var r,i,s,a=n(3),c=n(9);r=[],i={overlap:0,axis:null},s={overlap:0,axis:null},o.create=function(e,t){return{pair:null,collided:!1,bodyA:e,bodyB:t,parentA:e.parent,parentB:t.parent,depth:0,normal:{x:0,y:0},tangent:{x:0,y:0},penetration:{x:0,y:0},supports:[]}},o.collides=function(e,t,n){if(o._overlapAxes(i,e.vertices,t.vertices,e.axes),i.overlap<=0)return null;if(o._overlapAxes(s,t.vertices,e.vertices,t.axes),s.overlap<=0)return null;var r,l,u=n&&n.table[c.id(e,t)];u?r=u.collision:((r=o.create(e,t)).collided=!0,r.bodyA=e.idA?A=a:aP?P=a:ar?r=s:sc.frictionStatic?a.frictionStatic:c.frictionStatic,e.restitution=a.restitution>c.restitution?a.restitution:c.restitution,e.slop=a.slop>c.slop?a.slop:c.slop,t.pair=e,s.length=0;for(var u=0;u0?1:.7),t.damping=t.damping||0,t.angularStiffness=t.angularStiffness||0,t.angleA=t.bodyA?t.bodyA.angle:t.angleA,t.angleB=t.bodyB?t.bodyB.angle:t.angleB,t.plugin={};var s={visible:!0,lineWidth:2,strokeStyle:"#ffffff",type:"line",anchors:!0};return 0===t.length&&t.stiffness>.1?(s.type="pin",s.anchors=!1):t.stiffness<.9&&(s.type="spring"),t.render=l.extend(s,t.render),t},o.preSolveAll=function(e){for(var t=0;t0&&(p.position.x+=l.x,p.position.y+=l.y),0!==l.angle&&(r.rotate(p.vertices,l.angle,n.position),c.rotate(p.axes,l.angle),u>0&&i.rotateAbout(p.position,l.angle,n.position,p.position)),a.update(p.bounds,p.vertices,n.velocity)}l.angle*=o._warming,l.x*=o._warming,l.y*=o._warming}}},o.pointAWorld=function(e){return{x:(e.bodyA?e.bodyA.position.x:0)+e.pointA.x,y:(e.bodyA?e.bodyA.position.y:0)+e.pointA.y}},o.pointBWorld=function(e){return{x:(e.bodyB?e.bodyB.position.x:0)+e.pointB.x,y:(e.bodyB?e.bodyB.position.y:0)+e.pointB.y}}},function(e,t,n){var o={};e.exports=o;var r=n(2),i=n(0);o.fromVertices=function(e){for(var t={},n=0;n0&&r.area(C)1?(y=s.create(i.extend({parts:h.slice(0)},o)),s.setPosition(y,{x:e,y:t}),y):h[0]}},function(e,t,n){var o={};e.exports=o;var r=n(0);o.create=function(e){var t={};return e||r.log("Mouse.create: element was undefined, defaulting to document.body","warn"),t.element=e||document.body,t.absolute={x:0,y:0},t.position={x:0,y:0},t.mousedownPosition={x:0,y:0},t.mouseupPosition={x:0,y:0},t.offset={x:0,y:0},t.scale={x:1,y:1},t.wheelDelta=0,t.button=-1,t.pixelRatio=parseInt(t.element.getAttribute("data-pixel-ratio"),10)||1,t.sourceEvents={mousemove:null,mousedown:null,mouseup:null,mousewheel:null},t.mousemove=function(e){var n=o._getRelativeMousePosition(e,t.element,t.pixelRatio);e.changedTouches&&(t.button=0,e.preventDefault()),t.absolute.x=n.x,t.absolute.y=n.y,t.position.x=t.absolute.x*t.scale.x+t.offset.x,t.position.y=t.absolute.y*t.scale.y+t.offset.y,t.sourceEvents.mousemove=e},t.mousedown=function(e){var n=o._getRelativeMousePosition(e,t.element,t.pixelRatio);e.changedTouches?(t.button=0,e.preventDefault()):t.button=e.button,t.absolute.x=n.x,t.absolute.y=n.y,t.position.x=t.absolute.x*t.scale.x+t.offset.x,t.position.y=t.absolute.y*t.scale.y+t.offset.y,t.mousedownPosition.x=t.position.x,t.mousedownPosition.y=t.position.y,t.sourceEvents.mousedown=e},t.mouseup=function(e){var n=o._getRelativeMousePosition(e,t.element,t.pixelRatio);e.changedTouches&&e.preventDefault(),t.button=-1,t.absolute.x=n.x,t.absolute.y=n.y,t.position.x=t.absolute.x*t.scale.x+t.offset.x,t.position.y=t.absolute.y*t.scale.y+t.offset.y,t.mouseupPosition.x=t.position.x,t.mouseupPosition.y=t.position.y,t.sourceEvents.mouseup=e},t.mousewheel=function(e){t.wheelDelta=Math.max(-1,Math.min(1,e.wheelDelta||-e.detail)),e.preventDefault()},o.setElement(t,t.element),t},o.setElement=function(e,t){e.element=t,t.addEventListener("mousemove",e.mousemove),t.addEventListener("mousedown",e.mousedown),t.addEventListener("mouseup",e.mouseup),t.addEventListener("mousewheel",e.mousewheel),t.addEventListener("DOMMouseScroll",e.mousewheel),t.addEventListener("touchmove",e.mousemove),t.addEventListener("touchstart",e.mousedown),t.addEventListener("touchend",e.mouseup)},o.clearSourceEvents=function(e){e.sourceEvents.mousemove=null,e.sourceEvents.mousedown=null,e.sourceEvents.mouseup=null,e.sourceEvents.mousewheel=null,e.wheelDelta=0},o.setOffset=function(e,t){e.offset.x=t.x,e.offset.y=t.y,e.position.x=e.absolute.x*e.scale.x+e.offset.x,e.position.y=e.absolute.y*e.scale.y+e.offset.y},o.setScale=function(e,t){e.scale.x=t.x,e.scale.y=t.y,e.position.x=e.absolute.x*e.scale.x+e.offset.x,e.position.y=e.absolute.y*e.scale.y+e.offset.y},o._getRelativeMousePosition=function(e,t,n){var o,r,i=t.getBoundingClientRect(),s=document.documentElement||document.body.parentNode||document.body,a=void 0!==window.pageXOffset?window.pageXOffset:s.scrollLeft,c=void 0!==window.pageYOffset?window.pageYOffset:s.scrollTop,l=e.changedTouches;return l?(o=l[0].pageX-i.left-a,r=l[0].pageY-i.top-c):(o=e.pageX-i.left-a,r=e.pageY-i.top-c),{x:o/(t.clientWidth/(t.width||t.clientWidth)*n),y:r/(t.clientHeight/(t.height||t.clientHeight)*n)}}},function(e,t,n){var o={};e.exports=o;var r=n(0),i=n(8);o.create=function(e){return r.extend({bodies:[],pairs:null},e)},o.setBodies=function(e,t){e.bodies=t.slice(0)},o.clear=function(e){e.bodies=[]},o.collisions=function(e){var t,n,r=[],s=e.pairs,a=e.bodies,c=a.length,l=o.canCollide,u=i.collides;for(a.sort(o._compareBoundsX),t=0;tf)break;if(!(yB.max.y)&&(!v||!g.isStatic&&!g.isSleeping)&&l(p.collisionFilter,g.collisionFilter)){var b=g.parts.length;if(m&&1===b)(P=u(p,g,s))&&r.push(P);else for(var _=b>1?1:0,w=x>1?1:0;wB.max.x||d.max.xB.max.y||(P=u(S,C,s))&&r.push(P)}}}}return r},o.canCollide=function(e,t){return e.group===t.group&&0!==e.group?e.group>0:0!=(e.mask&t.category)&&0!=(t.mask&e.category)},o._compareBoundsX=function(e,t){return e.bounds.min.x-t.bounds.min.x}},function(e,t,n){var o={};e.exports=o;var r=n(0);o._registry={},o.register=function(e){if(o.isPlugin(e)||r.warn("Plugin.register:",o.toString(e),"does not implement all required fields."),e.name in o._registry){var t=o._registry[e.name],n=o.versionParse(e.version).number,i=o.versionParse(t.version).number;n>i?(r.warn("Plugin.register:",o.toString(t),"was upgraded to",o.toString(e)),o._registry[e.name]=e):n-1},o.isFor=function(e,t){var n=e.for&&o.dependencyParse(e.for);return!e.for||t.name===n.name&&o.versionSatisfies(t.version,n.range)},o.use=function(e,t){if(e.uses=(e.uses||[]).concat(t||[]),0!==e.uses.length){for(var n=o.dependencies(e),i=r.topologicalSort(n),s=[],a=0;a0&&r.info(s.join(" "))}else r.warn("Plugin.use:",o.toString(e),"does not specify any dependencies to install.")},o.dependencies=function(e,t){var n=o.dependencyParse(e),i=n.name;if(!(i in(t=t||{}))){e=o.resolve(e)||e,t[i]=r.map(e.uses||[],(function(t){o.isPlugin(t)&&o.register(t);var i=o.dependencyParse(t),s=o.resolve(t);return s&&!o.versionSatisfies(s.version,i.range)?(r.warn("Plugin.dependencies:",o.toString(s),"does not satisfy",o.toString(i),"used by",o.toString(n)+"."),s._warned=!0,e._warned=!0):s||(r.warn("Plugin.dependencies:",o.toString(t),"used by",o.toString(n),"could not be resolved."),e._warned=!0),i.name}));for(var s=0;s=|>)?\s*((\d+)\.(\d+)\.(\d+))(-[0-9A-Za-z-+]+)?$/;t.test(e)||r.warn("Plugin.versionParse:",e,"is not a valid version or range.");var n=t.exec(e),o=Number(n[4]),i=Number(n[5]),s=Number(n[6]);return{isRange:Boolean(n[1]||n[2]),version:n[3],range:e,operator:n[1]||n[2]||"",major:o,minor:i,patch:s,parts:[o,i,s],prerelease:n[7],number:1e8*o+1e4*i+s}},o.versionSatisfies=function(e,t){t=t||"*";var n=o.versionParse(t),r=o.versionParse(e);if(n.isRange){if("*"===n.operator||"*"===e)return!0;if(">"===n.operator)return r.number>n.number;if(">="===n.operator)return r.number>=n.number;if("~"===n.operator)return r.major===n.major&&r.minor===n.minor&&r.patch>=n.patch;if("^"===n.operator)return n.major>0?r.major===n.major&&r.number>=n.number:n.minor>0?r.minor===n.minor&&r.patch>=n.patch:r.patch===n.patch}return e===t||"*"===e}},function(e,t,n){var o={};e.exports=o;var r=n(0),i=n(5),s=n(1),a=n(4),c=n(2),l=n(13);!function(){var e,t;"undefined"!=typeof window&&(e=window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.msRequestAnimationFrame||function(e){window.setTimeout((function(){e(r.now())}),1e3/60)},t=window.cancelAnimationFrame||window.mozCancelAnimationFrame||window.webkitCancelAnimationFrame||window.msCancelAnimationFrame),o._goodFps=30,o._goodDelta=1e3/60,o.create=function(e){var t={controller:o,engine:null,element:null,canvas:null,mouse:null,frameRequestId:null,timing:{historySize:60,delta:0,deltaHistory:[],lastTime:0,lastTimestamp:0,lastElapsed:0,timestampElapsed:0,timestampElapsedHistory:[],engineDeltaHistory:[],engineElapsedHistory:[],elapsedHistory:[]},options:{width:800,height:600,pixelRatio:1,background:"#14151f",wireframeBackground:"#14151f",hasBounds:!!e.bounds,enabled:!0,wireframes:!0,showSleeping:!0,showDebug:!1,showStats:!1,showPerformance:!1,showBounds:!1,showVelocity:!1,showCollisions:!1,showSeparations:!1,showAxes:!1,showPositions:!1,showAngleIndicator:!1,showIds:!1,showVertexNumbers:!1,showConvexHulls:!1,showInternalEdges:!1,showMousePosition:!1}},n=r.extend(t,e);return n.canvas&&(n.canvas.width=n.options.width||n.canvas.width,n.canvas.height=n.options.height||n.canvas.height),n.mouse=e.mouse,n.engine=e.engine,n.canvas=n.canvas||p(n.options.width,n.options.height),n.context=n.canvas.getContext("2d"),n.textures={},n.bounds=n.bounds||{min:{x:0,y:0},max:{x:n.canvas.width,y:n.canvas.height}},n.options.showBroadphase=!1,1!==n.options.pixelRatio&&o.setPixelRatio(n,n.options.pixelRatio),r.isElement(n.element)?n.element.appendChild(n.canvas):n.canvas.parentNode||r.log("Render.create: options.element was undefined, render.canvas was created but not appended","warn"),n},o.run=function(t){!function r(i){t.frameRequestId=e(r),n(t,i),o.world(t,i),(t.options.showStats||t.options.showDebug)&&o.stats(t,t.context,i),(t.options.showPerformance||t.options.showDebug)&&o.performance(t,t.context,i)}()},o.stop=function(e){t(e.frameRequestId)},o.setPixelRatio=function(e,t){var n=e.options,o=e.canvas;"auto"===t&&(t=d(o)),n.pixelRatio=t,o.setAttribute("data-pixel-ratio",t),o.width=n.width*t,o.height=n.height*t,o.style.width=n.width+"px",o.style.height=n.height+"px"},o.lookAt=function(e,t,n,o){o=void 0===o||o,t=r.isArray(t)?t:[t],n=n||{x:0,y:0};for(var i={min:{x:1/0,y:1/0},max:{x:-1/0,y:-1/0}},s=0;si.max.x&&(i.max.x=u.x),c.yi.max.y&&(i.max.y=u.y))}var p=i.max.x-i.min.x+2*n.x,d=i.max.y-i.min.y+2*n.y,f=e.canvas.height,y=e.canvas.width/f,h=p/d,v=1,x=1;h>y?x=h/y:v=y/h,e.options.hasBounds=!0,e.bounds.min.x=i.min.x,e.bounds.max.x=i.min.x+p*v,e.bounds.min.y=i.min.y,e.bounds.max.y=i.min.y+d*x,o&&(e.bounds.min.x+=.5*p-p*v*.5,e.bounds.max.x+=.5*p-p*v*.5,e.bounds.min.y+=.5*d-d*x*.5,e.bounds.max.y+=.5*d-d*x*.5),e.bounds.min.x-=n.x,e.bounds.max.x-=n.x,e.bounds.min.y-=n.y,e.bounds.max.y-=n.y,e.mouse&&(l.setScale(e.mouse,{x:(e.bounds.max.x-e.bounds.min.x)/e.canvas.width,y:(e.bounds.max.y-e.bounds.min.y)/e.canvas.height}),l.setOffset(e.mouse,e.bounds.min))},o.startViewTransform=function(e){var t=e.bounds.max.x-e.bounds.min.x,n=e.bounds.max.y-e.bounds.min.y,o=t/e.options.width,r=n/e.options.height;e.context.setTransform(e.options.pixelRatio/o,0,0,e.options.pixelRatio/r,0,0),e.context.translate(-e.bounds.min.x,-e.bounds.min.y)},o.endViewTransform=function(e){e.context.setTransform(e.options.pixelRatio,0,0,e.options.pixelRatio,0,0)},o.world=function(e,t){var n,u=r.now(),p=e.engine,d=p.world,f=e.canvas,h=e.context,v=e.options,x=e.timing,m=i.allBodies(d),g=i.allConstraints(d),b=v.wireframes?v.wireframeBackground:v.background,_=[],w=[],S={timestamp:p.timing.timestamp};if(a.trigger(e,"beforeRender",S),e.currentBackground!==b&&y(e,b),h.globalCompositeOperation="source-in",h.fillStyle="transparent",h.fillRect(0,0,f.width,f.height),h.globalCompositeOperation="source-over",v.hasBounds){for(n=0;n1?1:0;s1?1:0;a1?1:0;i1?1:0;a1?1:0;i1?1:0;i1?1:0;r0)){var u=o.activeContacts[0].vertex.x,p=o.activeContacts[0].vertex.y;2===o.activeContacts.length&&(u=(o.activeContacts[0].vertex.x+o.activeContacts[1].vertex.x)/2,p=(o.activeContacts[0].vertex.y+o.activeContacts[1].vertex.y)/2),r.bodyB===r.supports[0].body||!0===r.bodyA.isStatic?a.moveTo(u-8*r.normal.x,p-8*r.normal.y):a.moveTo(u+8*r.normal.x,p+8*r.normal.y),a.lineTo(u,p)}c.wireframes?a.strokeStyle="rgba(255,165,0,0.7)":a.strokeStyle="orange",a.lineWidth=1,a.stroke()},o.separations=function(e,t,n){var o,r,i,s,a,c=n,l=e.options;for(c.beginPath(),a=0;a0&&c.trigger(e,"collisionStart",{pairs:v.collisionStart}),i.preSolvePosition(v.list),f=0;f0&&c.trigger(e,"collisionActive",{pairs:v.collisionActive}),v.collisionEnd.length>0&&c.trigger(e,"collisionEnd",{pairs:v.collisionEnd}),o._bodiesClearForces(b),c.trigger(e,"afterUpdate",g),e.timing.lastElapsed=p.now()-d,e},o.merge=function(e,t){if(p.extend(e,t),t.world){e.world=t.world,o.clear(e);for(var n=l.allBodies(e.world),i=0;iW||-L>W?(r=L>0?L:-L,(n=f.friction*(L>0?1:-1)*a)<-r?n=-r:n>r&&(n=r)):(n=L,r=p);var H=I*b-V*g,U=T*b-E*g,N=P/(C+h.inverseInertia*H*H+v.inverseInertia*U*U),G=(1+f.restitution)*j*N;if(n*=N,j*j>c&&j<0)M.normalImpulse=0;else{var Z=M.normalImpulse;M.normalImpulse+=G,M.normalImpulse=Math.min(M.normalImpulse,0),G=M.normalImpulse-Z}if(L*L>u)M.tangentImpulse=0;else{var Q=M.tangentImpulse;M.tangentImpulse+=n,M.tangentImpulse<-r&&(M.tangentImpulse=-r),M.tangentImpulse>r&&(M.tangentImpulse=r),n=M.tangentImpulse-Q}var X=g*G+_*n,Y=b*G+w*n;h.isStatic||h.isSleeping||(h.positionPrev.x+=X*h.inverseMass,h.positionPrev.y+=Y*h.inverseMass,h.anglePrev+=(I*Y-V*X)*h.inverseInertia),v.isStatic||v.isSleeping||(v.positionPrev.x-=X*v.inverseMass,v.positionPrev.y-=Y*v.inverseMass,v.anglePrev-=(T*Y-E*X)*v.inverseInertia)}}}}},function(e,t,n){var o={};e.exports=o;var r=n(9),i=n(0);o.create=function(e){return i.extend({table:{},list:[],collisionStart:[],collisionActive:[],collisionEnd:[]},e)},o.update=function(e,t,n){var o,i,s,a,c=e.list,l=c.length,u=e.table,p=t.length,d=e.collisionStart,f=e.collisionEnd,y=e.collisionActive;for(d.length=0,f.length=0,y.length=0,a=0;ah&&(h=m),a.translate(x,{x:.5*g,y:.5*m}),p=x.bounds.max.x+i,r.addBody(u,x),l=x,f+=1}else p+=i}d+=h+s,p=e}return u},o.chain=function(e,t,n,o,a,c){for(var l=e.bodies,u=1;u0)for(l=0;l0&&(d=f[l-1+(c-1)*t],r.addConstraint(e,i.create(s.extend({bodyA:d,bodyB:p},a)))),o&&ld||s<(l=d-l)||s>n-1-l))return 1===p&&a.translate(u,{x:(s+(n%2==1?1:-1))*f,y:0}),c(e+(u?s*f:0)+s*i,o,s,l,u,p)}))},o.newtonsCradle=function(e,t,n,o,s){for(var a=r.create({label:"Newtons Cradle"}),l=0;lu.bounds.max.x||f.bounds.max.yu.bounds.max.y))){var y=o._getRegion(e,f);if(!f.region||y.id!==f.region.id||r){f.region&&!r||(f.region=y);var h=o._regionUnion(y,f.region);for(s=h.startCol;s<=h.endCol;s++)for(a=h.startRow;a<=h.endRow;a++){c=p[l=o._getBucketId(s,a)];var v=s>=y.startCol&&s<=y.endCol&&a>=y.startRow&&a<=y.endRow,x=s>=f.region.startCol&&s<=f.region.endCol&&a>=f.region.startRow&&a<=f.region.endRow;!v&&x&&x&&c&&o._bucketRemoveBody(e,c,f),(f.region===y||v&&!x||r)&&(c||(c=o._createBucket(p,l)),o._bucketAddBody(e,c,f))}f.region=y,d=!0}}}d&&(e.pairsList=o._createActivePairsList(e))},s(o,"update","Grid.update ➤ replaced by Matter.Detector"),o.clear=function(e){e.buckets={},e.pairs={},e.pairsList=[]},s(o,"clear","Grid.clear ➤ replaced by Matter.Detector"),o._regionUnion=function(e,t){var n=Math.min(e.startCol,t.startCol),r=Math.max(e.endCol,t.endCol),i=Math.min(e.startRow,t.startRow),s=Math.max(e.endRow,t.endRow);return o._createRegion(n,r,i,s)},o._getRegion=function(e,t){var n=t.bounds,r=Math.floor(n.min.x/e.bucketWidth),i=Math.floor(n.max.x/e.bucketWidth),s=Math.floor(n.min.y/e.bucketHeight),a=Math.floor(n.max.y/e.bucketHeight);return o._createRegion(r,i,s,a)},o._createRegion=function(e,t,n,o){return{id:e+","+t+","+n+","+o,startCol:e,endCol:t,startRow:n,endRow:o}},o._getBucketId=function(e,t){return"C"+e+"R"+t},o._createBucket=function(e,t){return e[t]=[]},o._bucketAddBody=function(e,t,n){var o,i=e.pairs,s=r.id,a=t.length;for(o=0;o0?a.push(t):delete o[r[n]];return a}},function(e,t,n){var o={};e.exports=o;var r=n(3),i=n(7),s=n(13),a=n(4),c=n(14),l=n(10),u=n(5),p=n(0),d=n(1);o.create=function(e,t){var n=(e?e.mouse:null)||(t?t.mouse:null);n||(e&&e.render&&e.render.canvas?n=s.create(e.render.canvas):t&&t.element?n=s.create(t.element):(n=s.create(),p.warn("MouseConstraint.create: options.mouse was undefined, options.element was undefined, may not function as expected")));var r={type:"mouseConstraint",mouse:n,element:null,body:null,constraint:l.create({label:"Mouse Constraint",pointA:n.position,pointB:{x:0,y:0},length:.01,stiffness:.1,angularStiffness:1,render:{strokeStyle:"#90EE90",lineWidth:3}}),collisionFilter:{category:1,mask:4294967295,group:0}},i=p.extend(r,t);return a.on(e,"beforeUpdate",(function(){var t=u.allBodies(e.world);o.update(i,t),o._triggerEvents(i)})),i},o.update=function(e,t){var n=e.mouse,o=e.constraint,s=e.body;if(0===n.button){if(o.bodyB)i.set(o.bodyB,!1),o.pointA=n.position;else for(var l=0;l1?1:0;ue.deltaMax?e.deltaMax:o)/e.delta,e.delta=o),0!==e.timeScalePrev&&(i*=r.timeScale/e.timeScalePrev),0===r.timeScale&&(i=0),e.timeScalePrev=r.timeScale,e.correction=i,e.frameCounter+=1,n-e.counterTimestamp>=1e3&&(e.fps=e.frameCounter*((n-e.counterTimestamp)/1e3),e.counterTimestamp=n,e.frameCounter=0),a.trigger(e,"tick",s),a.trigger(e,"beforeUpdate",s),c.update(t,o,i),a.trigger(e,"afterUpdate",s),a.trigger(e,"afterTick",s)},o.stop=function(e){i(e.frameRequestId)},o.start=function(e,t){o.run(e,t)}},function(e,t,n){var o={};e.exports=o;var r=n(8),i=n(0).deprecated;o.collides=function(e,t){return r.collides(e,t)},i(o,"collides","SAT.collides ➤ replaced by Collision.collides")},function(e,t,n){var o={};e.exports=o,n(1);var r=n(0);o.pathToVertices=function(e,t){"undefined"==typeof window||"SVGPathSeg"in window||r.warn("Svg.pathToVertices: SVGPathSeg not defined, a polyfill is required.");var n,i,s,a,c,l,u,p,d,f,y,h=[],v=0,x=0,m=0;t=t||15;var g=function(e,t,n){var o=n%2==1&&n>1;if(!d||e!=d.x||t!=d.y){d&&o?(f=d.x,y=d.y):(f=0,y=0);var r={x:f+e,y:y+t};!o&&d||(d=r),h.push(r),x=f+e,m=y+t}},b=function(e){var t=e.pathSegTypeAsLetter.toUpperCase();if("Z"!==t){switch(t){case"M":case"L":case"T":case"C":case"S":case"Q":x=e.x,m=e.y;break;case"H":x=e.x;break;case"V":m=e.y}g(x,m,e.pathSegType)}};for(o._svgPathToAbsolute(e),s=e.getTotalLength(),l=[],n=0;n{var o=n(60).parse;o.parseSVG=o,o.makeAbsolute=function(e){var t,n={x:0,y:0},o={x:"x0",y:"y0",x1:"x0",y1:"y0",x2:"x0",y2:"y0"};return e.forEach((function(e){for(var r in"moveto"===e.command&&(t=e),e.x0=n.x,e.y0=n.y,o)r in e&&(e[r]+=e.relative?e[o[r]]:0);"x"in e||(e.x=n.x),"y"in e||(e.y=n.y),e.relative=!1,e.code=e.code.toUpperCase(),"closepath"==e.command&&(e.x=t.x,e.y=t.y),n=e})),e},e.exports=o},60:e=>{"use strict";function t(e,n,o,r){this.message=e,this.expected=n,this.found=o,this.location=r,this.name="SyntaxError","function"==typeof Error.captureStackTrace&&Error.captureStackTrace(this,t)}!function(e,t){function n(){this.constructor=e}n.prototype=t.prototype,e.prototype=new n}(t,Error),t.buildMessage=function(e,t){var n={literal:function(e){return'"'+r(e.text)+'"'},class:function(e){var t,n="";for(t=0;t0){for(t=1,o=1;tU&&(U=W,N=[]),N.push(e))}function J(){var e,t,n,o,i;for(e=W,t=[],n=ve();n!==r;)t.push(n),n=ve();if(t!==r)if(n=function(){var e,t,n,o,i,s;if(e=W,(t=$())!==r){for(n=[],o=W,i=[],s=ve();s!==r;)i.push(s),s=ve();for(i!==r&&(s=$())!==r?o=i=[i,s]:(W=o,o=r);o!==r;){for(n.push(o),o=W,i=[],s=ve();s!==r;)i.push(s),s=ve();i!==r&&(s=$())!==r?o=i=[i,s]:(W=o,o=r)}n!==r?e=t=a(t,n):(W=e,e=r)}else W=e,e=r;return e}(),n===r&&(n=null),n!==r){for(o=[],i=ve();i!==r;)o.push(i),i=ve();o!==r?(t=function(e){if(!e)return[];for(var t=[],n=0;n{for(var n in t)o.o(t,n)&&!o.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},o.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),o.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),o.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var r={};return(()=>{"use strict";o.r(r),o.d(r,{PhysicalSvg:()=>Ie,StopPhysicalSvg:()=>Be});var e=o(842),n=function(e,t){return n=e.x,o=e.y,r=t.x,i=t.y,Math.sqrt(Math.pow(n-r,2)+Math.pow(o-i,2));var n,o,r,i},i=function(t,n){return e.Vector.create(t.x*n.x,t.y*n.y)},s=function(e,t){return e.x===t.x&&e.y===t.y},a=function(e,t,n,o){var r,i=e-n,s=t-o;return(r=i||s?Math.atan2(s,i)-Math.PI:0)<0&&(r+=2*Math.PI),r},c=function(){function t(){}return t.prototype.intersects=function(t,n){var o=e.Vector.create(t.x,t.y),r=e.Vector.create(t.x0,t.y0),s=e.Vector.create(n.x,n.y),a=e.Vector.create(n.x0,n.y0),c=e.Vector.sub(r,o),l=e.Vector.sub(a,s),u=e.Vector.cross(c,l),p=e.Vector.cross(e.Vector.sub(s,o),c);if(this.isZero(u)&&this.isZero(p)){var d=e.Vector.magnitude(i(e.Vector.sub(s,o),c)),f=e.Vector.magnitude(i(e.Vector.sub(o,s),l)),y=e.Vector.magnitude(i(c,c)),h=e.Vector.magnitude(i(l,l));return 0<=d&&d<=y||0<=(f&&f<=h)}if(this.isZero(u)&&!this.isZero(p))return!1;var v=e.Vector.cross(e.Vector.sub(s,o),l)/u,x=e.Vector.cross(e.Vector.sub(s,o),c)/u;return!this.isZero(u)&&0<=v&&v<=1&&0<=x&&x<=1},t.prototype.supportedCommandTypes=function(){return[["L","Z"],["L","Z"]]},t.prototype.isZero=function(e){return Math.abs(e)<1e-10},t}();const l={randomUUID:"undefined"!=typeof crypto&&crypto.randomUUID&&crypto.randomUUID.bind(crypto)};let u;const p=new Uint8Array(16);function d(){if(!u&&(u="undefined"!=typeof crypto&&crypto.getRandomValues&&crypto.getRandomValues.bind(crypto),!u))throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported");return u(p)}const f=[];for(let e=0;e<256;++e)f.push((e+256).toString(16).slice(1));const y=function(e,t,n){if(l.randomUUID&&!t&&!e)return l.randomUUID();const o=(e=e||{}).random||(e.rng||d)();if(o[6]=15&o[6]|64,o[8]=63&o[8]|128,t){n=n||0;for(let e=0;e<16;++e)t[n+e]=o[e];return t}return function(e,t=0){return(f[e[t+0]]+f[e[t+1]]+f[e[t+2]]+f[e[t+3]]+"-"+f[e[t+4]]+f[e[t+5]]+"-"+f[e[t+6]]+f[e[t+7]]+"-"+f[e[t+8]]+f[e[t+9]]+"-"+f[e[t+10]]+f[e[t+11]]+f[e[t+12]]+f[e[t+13]]+f[e[t+14]]+f[e[t+15]]).toLowerCase()}(o)};var h=function(){function e(e,t){this._id=y(),this._parent=t,this._value=e,this._children=[]}return Object.defineProperty(e.prototype,"id",{get:function(){return this._id},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"value",{get:function(){return this._value},enumerable:!1,configurable:!0}),e.prototype.addChild=function(t){var n=new e(t,this);return n._parent=this,this._children.push(n),n},e.prototype.addChildNode=function(e){return e._parent=this,this._children.push(e),e},e.prototype.getChildrenRecursively=function(){var e=new Array(this);return this._children.forEach((function(t){t.getChildrenRecursively().forEach((function(t){e.push(t)}))})),e},e.prototype.getRoot=function(){return void 0===this._parent?this:this._parent.getRoot()},e}(),v=function(){function e(e){this._roots=[],this._aggregationFcn=e}return e.prototype.getAggregatedCommands=function(){return this._roots.map((function(e){return e.getChildrenRecursively().map((function(e){return e.value}))}))},e.prototype.addValue=function(e){var t=this;if(0===this._roots.length)this._roots.push(new h(e,void 0));else{var n=this.getAllNodes().filter((function(n){return t._aggregationFcn(n.value,e)}));if(0===n.length)this._roots.push(new h(e,void 0));else{var o=n[0].addChild(e);n.slice(1,n.length).map((function(e){return e.getRoot()})).filter((function(e){return e.id!==o.getRoot().id})).filter((function(e,t,n){return t===n.findIndex((function(t){return t.id===e.id}))})).forEach((function(e){o.addChildNode(e),t._roots.splice(t._roots.indexOf(e),1)}))}}},e.prototype.getAllNodes=function(){return this._roots.flatMap((function(e){return e.getChildrenRecursively()}))},e}(),x=function(){function e(){}return e.prototype.intersects=function(e,t){var n=e.x,o=e.y,r=e.x0,i=e.y0,s=t.x,a=t.y,c=(a-o)*(r-n)-(s-n)*(i-o);if(Math.abs(c)>1e-10)return!1;var l=(s-n)*(r-n)+(a-o)*(i-o);return!(l<0)&&l<=(r-n)*(r-n)+(i-o)*(i-o)},e.prototype.supportedCommandTypes=function(){return[["L","Z"],["M"]]},e}();const{abs:m,cos:g,sin:b,acos:_,atan2:w,sqrt:S,pow:A}=Math;function P(e){return e<0?-A(-e,1/3):A(e,1/3)}const C=Math.PI,B=2*C,M=C/2,k=Number.MAX_SAFE_INTEGER||9007199254740991,I=Number.MIN_SAFE_INTEGER||-9007199254740991,V={x:0,y:0,z:0},T={Tvalues:[-.06405689286260563,.06405689286260563,-.1911188674736163,.1911188674736163,-.3150426796961634,.3150426796961634,-.4337935076260451,.4337935076260451,-.5454214713888396,.5454214713888396,-.6480936519369755,.6480936519369755,-.7401241915785544,.7401241915785544,-.820001985973903,.820001985973903,-.8864155270044011,.8864155270044011,-.9382745520027328,.9382745520027328,-.9747285559713095,.9747285559713095,-.9951872199970213,.9951872199970213],Cvalues:[.12793819534675216,.12793819534675216,.1258374563468283,.1258374563468283,.12167047292780339,.12167047292780339,.1155056680537256,.1155056680537256,.10744427011596563,.10744427011596563,.09761865210411388,.09761865210411388,.08619016153195327,.08619016153195327,.0733464814110803,.0733464814110803,.05929858491543678,.05929858491543678,.04427743881741981,.04427743881741981,.028531388628933663,.028531388628933663,.0123412297999872,.0123412297999872],arcfn:function(e,t){const n=t(e);let o=n.x*n.x+n.y*n.y;return void 0!==n.z&&(o+=n.z*n.z),S(o)},compute:function(e,t,n){if(0===e)return t[0].t=0,t[0];const o=t.length-1;if(1===e)return t[o].t=1,t[o];const r=1-e;let i=t;if(0===o)return t[0].t=e,t[0];if(1===o){const t={x:r*i[0].x+e*i[1].x,y:r*i[0].y+e*i[1].y,t:e};return n&&(t.z=r*i[0].z+e*i[1].z),t}if(o<4){let t,s,a,c=r*r,l=e*e,u=0;2===o?(i=[i[0],i[1],i[2],V],t=c,s=r*e*2,a=l):3===o&&(t=c*r,s=c*e*3,a=r*l*3,u=e*l);const p={x:t*i[0].x+s*i[1].x+a*i[2].x+u*i[3].x,y:t*i[0].y+s*i[1].y+a*i[2].y+u*i[3].y,t:e};return n&&(p.z=t*i[0].z+s*i[1].z+a*i[2].z+u*i[3].z),p}const s=JSON.parse(JSON.stringify(t));for(;s.length>1;){for(let t=0;t1;r--,i--){const e=[];for(let n,r=0;ri.x.min&&(t=i.x.min),n>i.y.min&&(n=i.y.min),o0&&(s.c1=t,s.c2=o,s.s1=e,s.s2=n,i.push(s))}))})),i},makeshape:function(e,t,n){const o=t.points.length,r=e.points.length,i=T.makeline(t.points[o-1],e.points[0]),s=T.makeline(e.points[r-1],t.points[0]),a={startcap:i,forward:e,back:t,endcap:s,bbox:T.findbbox([i,e,t,s]),intersections:function(e){return T.shapeintersections(a,a.bbox,e,e.bbox,n)}};return a},getminmax:function(e,t,n){if(!n)return{min:0,max:0};let o,r,i=k,s=I;-1===n.indexOf(0)&&(n=[0].concat(n)),-1===n.indexOf(1)&&n.push(1);for(let a=0,c=n.length;as&&(s=r[t]);return{min:i,mid:(i+s)/2,max:s,size:s-i}},align:function(e,t){const n=t.p1.x,o=t.p1.y,r=-w(t.p2.y-o,t.p2.x-n);return e.map((function(e){return{x:(e.x-n)*g(r)-(e.y-o)*b(r),y:(e.x-n)*b(r)+(e.y-o)*g(r)}}))},roots:function(e,t){t=t||{p1:{x:0,y:0},p2:{x:1,y:0}};const n=e.length-1,o=T.align(e,t),r=function(e){return 0<=e&&e<=1};if(2===n){const e=o[0].y,t=o[1].y,n=o[2].y,i=e-2*t+n;if(0!==i){const o=-S(t*t-e*n),s=-e+t;return[-(o+s)/i,-(-o+s)/i].filter(r)}return t!==n&&0===i?[(2*t-n)/(2*t-2*n)].filter(r):[]}const i=o[0].y,s=o[1].y,a=o[2].y;let c=3*s-i-3*a+o[3].y,l=3*i-6*s+3*a,u=-3*i+3*s,p=i;if(T.approximately(c,0)){if(T.approximately(l,0))return T.approximately(u,0)?[]:[-p/u].filter(r);const e=S(u*u-4*l*p),t=2*l;return[(e-u)/t,(-u-e)/t].filter(r)}l/=c,u/=c,p/=c;const d=(3*u-l*l)/3,f=d/3,y=(2*l*l*l-9*l*u+27*p)/27,h=y/2,v=h*h+f*f*f;let x,m,b,w,A;if(v<0){const e=-d/3,t=S(e*e*e),n=-y/(2*t),o=_(n<-1?-1:n>1?1:n),i=2*P(t);return b=i*g(o/3)-l/3,w=i*g((o+B)/3)-l/3,A=i*g((o+2*B)/3)-l/3,[b,w,A].filter(r)}if(0===v)return x=h<0?P(-h):-P(h),b=2*x-l/3,w=-x-l/3,[b,w].filter(r);{const e=S(v);return x=P(-h+e),m=P(h+e),[x-m-l/3].filter(r)}},droots:function(e){if(3===e.length){const t=e[0],n=e[1],o=e[2],r=t-2*n+o;if(0!==r){const e=-S(n*n-t*o),i=-t+n;return[-(e+i)/r,-(-e+i)/r]}return n!==o&&0===r?[(2*n-o)/(2*(n-o))]:[]}if(2===e.length){const t=e[0],n=e[1];return t!==n?[t/(t-n)]:[]}return[]},curvature:function(e,t,n,o,r){let i,s,a,c,l=0,u=0;const p=T.compute(e,t),d=T.compute(e,n),f=p.x*p.x+p.y*p.y;if(o?(i=S(A(p.y*d.z-d.y*p.z,2)+A(p.z*d.x-d.z*p.x,2)+A(p.x*d.y-d.x*p.y,2)),s=A(f+p.z*p.z,1.5)):(i=p.x*d.y-p.y*d.x,s=A(f,1.5)),0===i||0===s)return{k:0,r:0};if(l=i/s,u=s/i,!r){const r=T.curvature(e-.001,t,n,o,!0).k,i=T.curvature(e+.001,t,n,o,!0).k;c=(i-l+(l-r))/2,a=(m(i-l)+m(l-r))/2}return{k:l,r:u,dk:c,adk:a}},inflections:function(e){if(e.length<4)return[];const t=T.align(e,{p1:e[0],p2:e.slice(-1)[0]}),n=t[2].x*t[1].y,o=t[3].x*t[1].y,r=t[1].x*t[2].y,i=18*(-3*n+2*o+3*r-t[3].x*t[2].y),s=18*(3*n-o-3*r),a=18*(r-n);if(T.approximately(i,0)){if(!T.approximately(s,0)){let e=-a/s;if(0<=e&&e<=1)return[e]}return[]}const c=s*s-4*i*a,l=Math.sqrt(c),u=2*i;return T.approximately(u,0)?[]:[(l-s)/u,-(s+l)/u].filter((function(e){return 0<=e&&e<=1}))},bboxoverlap:function(e,t){const n=["x","y"],o=n.length;for(let r,i,s,a,c=0;c=a)return!1;return!0},expandbox:function(e,t){t.x.mine.x.max&&(e.x.max=t.x.max),t.y.max>e.y.max&&(e.y.max=t.y.max),t.z&&t.z.max>e.z.max&&(e.z.max=t.z.max),e.x.mid=(e.x.min+e.x.max)/2,e.y.mid=(e.y.min+e.y.max)/2,e.z&&(e.z.mid=(e.z.min+e.z.max)/2),e.x.size=e.x.max-e.x.min,e.y.size=e.y.max-e.y.min,e.z&&(e.z.size=e.z.max-e.z.min)},pairiteration:function(e,t,n){const o=e.bbox(),r=t.bbox(),i=1e5,s=n||.5;if(o.x.size+o.y.sizeC||C>k)&&(P+=B),P>k&&(A=k,k=P,P=A)):k4){if(1!==arguments.length)throw new Error("Only new Bezier(point[]) is accepted for 4th and higher order curves");o=!0}}else if(6!==r&&8!==r&&9!==r&&12!==r&&1!==arguments.length)throw new Error("Only new Bezier(point[]) is accepted for 4th and higher order curves");const i=this._3d=!o&&(9===r||12===r)||e&&e[0]&&void 0!==e[0].z,s=this.points=[];for(let e=0,n=i?3:2;ee+z(t.y)),0)

0}length(){return T.length(this.derivative.bind(this))}static getABC(e=2,t,n,o,r=.5){const i=T.projectionratio(r,e),s=1-i,a={x:i*t.x+s*o.x,y:i*t.y+s*o.y},c=T.abcratio(r,e);return{A:{x:n.x+(n.x-a.x)/c,y:n.y+(n.y-a.y)/c},B:n,C:a,S:t,E:o}}getABC(e,t){t=t||this.get(e);let n=this.points[0],o=this.points[this.order];return W.getABC(this.order,n,t,o,e)}getLUT(e){if(this.verify(),e=e||100,this._lut.length===e)return this._lut;this._lut=[],e++,this._lut=[];for(let t,n,o=0;o1?1:d,c=this.compute(d),c.t=d,c.d=u,c}get(e){return this.compute(e)}point(e){return this.points[e]}compute(e){return this.ratios?T.computeWithRatios(e,this.points,this.ratios,this._3d):T.compute(e,this.points,this._3d,this.ratios)}raise(){const e=this.points,t=[e[0]],n=e.length;for(let o,r,i=1;i1;){n=[];for(let i,s=0,a=t.length-1;s=0&&e<=1})),t=t.concat(e[n].sort(T.numberSort))}.bind(this)),e.values=t.sort(T.numberSort).filter((function(e,n){return t.indexOf(e)===n})),e}bbox(){const e=this.extrema(),t={};return this.dims.forEach(function(n){t[n]=T.getminmax(this,n,e[n])}.bind(this)),t}overlaps(e){const t=this.bbox(),n=e.bbox();return T.bboxoverlap(t,n)}offset(e,t){if(void 0!==t){const n=this.get(e),o=this.normal(e),r={c:n,n:o,x:n.x+o.x*t,y:n.y+o.y*t};return this._3d&&(r.z=n.z+o.z*t),r}if(this._linear){const t=this.normal(0),n=this.points.map((function(n){const o={x:n.x+e*t.x,y:n.y+e*t.y};return n.z&&t.z&&(o.z=n.z+e*t.z),o}));return[new W(n)]}return this.reduce().map((function(t){return t._linear?t.offset(e)[0]:t.scale(e)}))}simple(){if(3===this.order){const e=T.angle(this.points[0],this.points[3],this.points[1]),t=T.angle(this.points[0],this.points[3],this.points[2]);if(e>0&&t<0||e<0&&t>0)return!1}const e=this.normal(0),t=this.normal(1);let n=e.x*t.x+e.y*t.y;return this._3d&&(n+=e.z*t.z),z(L(n))(1-r/o)*t+r/o*n));return new W(this.points.map(((t,n)=>({x:t.x+e.x*r[n],y:t.y+e.y*r[n]}))))}scale(e){const t=this.order;let n=!1;if("function"==typeof e&&(n=e),n&&2===t)return this.raise().scale(n);const o=this.clockwise,r=this.points;if(this._linear)return this.translate(this.normal(0),n?n(0):e,n?n(1):e);const i=n?n(0):e,s=n?n(1):e,a=[this.offset(0,10),this.offset(1,10)],c=[],l=T.lli4(a[0],a[0].c,a[1],a[1].c);if(!l)throw new Error("cannot scale this curve. Try reducing it first.");return[0,1].forEach((function(e){const n=c[e*t]=T.copy(r[e*t]);n.x+=(e?s:i)*a[e].n.x,n.y+=(e?s:i)*a[e].n.y})),n?([0,1].forEach((function(i){if(2!==t||!i){var s=r[i+1],a={x:s.x-l.x,y:s.y-l.y},u=n?n((i+1)/t):e;n&&!o&&(u=-u);var p=D(a.x*a.x+a.y*a.y);a.x/=p,a.y/=p,c[i+1]={x:s.x+u*a.x,y:s.y+u*a.y}}})),new W(c)):([0,1].forEach((e=>{if(2===t&&e)return;const n=c[e*t],o=this.derivative(e),i={x:n.x+o.x,y:n.y+o.y};c[e+1]=T.lli4(n,i,l,r[e+1])})),new W(c))}outline(e,t,n,o){if(t=void 0===t?e:t,this._linear){const r=this.normal(0),i=this.points[0],s=this.points[this.points.length-1];let a,c,l;void 0===n&&(n=e,o=t),a={x:i.x+r.x*e,y:i.y+r.y*e},l={x:s.x+r.x*n,y:s.y+r.y*n},c={x:(a.x+l.x)/2,y:(a.y+l.y)/2};const u=[a,c,l];a={x:i.x-r.x*t,y:i.y-r.y*t},l={x:s.x-r.x*o,y:s.y-r.y*o},c={x:(a.x+l.x)/2,y:(a.y+l.y)/2};const p=[l,c,a],d=T.makeline(p[2],u[0]),f=T.makeline(u[2],p[0]),y=[d,new W(u),f,new W(p)];return new E(y)}const r=this.reduce(),i=r.length,s=[];let a,c=[],l=0,u=this.length();const p=void 0!==n&&void 0!==o;function d(e,t,n,o,r){return function(i){const s=o/n,a=(o+r)/n,c=t-e;return T.map(i,0,1,e+s*c,e+a*c)}}r.forEach((function(r){const i=r.length();p?(s.push(r.scale(d(e,n,u,l,i))),c.push(r.scale(d(-t,-o,u,l,i)))):(s.push(r.scale(e)),c.push(r.scale(-t))),l+=i})),c=c.map((function(e){return a=e.points,a[3]?e.points=[a[3],a[2],a[1],a[0]]:e.points=[a[2],a[1],a[0]],e})).reverse();const f=s[0].points[0],y=s[i-1].points[s[i-1].points.length-1],h=c[i-1].points[c[i-1].points.length-1],v=c[0].points[0],x=T.makeline(h,f),m=T.makeline(y,v),g=[x].concat(s).concat([m]).concat(c);return new E(g)}outlineshapes(e,t,n){t=t||e;const o=this.outline(e,t).curves,r=[];for(let e=1,t=o.length;e1,i.endcap.virtual=e{var i=this.get(e);return T.between(i.x,t,o)&&T.between(i.y,n,r)}))}selfintersects(e){const t=this.reduce(),n=t.length-2,o=[];for(let r,i,s,a=0;a0&&(r=r.concat(t))})),r}arcs(e){return e=e||.5,this._iterate(e,[])}_error(e,t,n,o){const r=(o-n)/4,i=this.get(n+r),s=this.get(o-r),a=T.dist(e,t),c=T.dist(e,i),l=T.dist(e,s);return z(c-a)+z(l-a)}_iterate(e,t){let n,o=0,r=1;do{n=0,r=1;let i,s,a,c,l,u=this.get(o),p=!1,d=!1,f=r,y=1;do{if(d=p,c=a,f=(o+r)/2,i=this.get(f),s=this.get(r),a=T.getccenter(u,i,s),a.interval={start:o,end:r},p=this._error(a,u,o,r)<=e,l=d&&!p,l||(y=r),p){if(r>=1){if(a.interval.end=y=1,c=a,r>1){let e={x:a.x+a.r*F(a.e),y:a.y+a.r*j(a.e)};a.e+=T.angle({x:a.x,y:a.y},e,this.get(1))}break}r+=(r-o)/2}else r=f}while(!l&&n++<100);if(n>=100)break;c=c||a,t.push(c),o=y}while(r<1);return t}}var H,U=function(t){switch(t.code){case"M":return e.Vector.create(t.x,t.y);case"T":throw new Error("T not supported");case"Z":case"L":return G(t);case"C":case"Q":case"S":return N(t)}},N=function(t){var n=X(t),o=new W(n).get(.5);return e.Vector.create(o.x,o.y)},G=function(t){return n=e.Vector.create(t.x,t.y),o=e.Vector.create(t.x0,t.y0),e.Vector.create((n.x+o.x)/2,(n.y+o.y)/2);var n,o},Z=function(e){return a(e.x,e.y,e.x0,e.y0)},Q=function(t){return n(e.Vector.create(t.x,t.y),e.Vector.create(t.x0,t.y0))},X=function(t){switch(t.code){case"C":return[e.Vector.create(t.x0,t.y0),e.Vector.create(t.x1,t.y1),e.Vector.create(t.x2,t.y2),e.Vector.create(t.x,t.y)];case"Q":return[e.Vector.create(t.x0,t.y0),e.Vector.create(t.x1,t.y1),e.Vector.create(t.x,t.y)];case"S":return[e.Vector.create(t.x0,t.y0),e.Vector.create(t.x2,t.y2),e.Vector.create(t.x,t.y)];case"T":throw new Error("T not defined")}},Y=function(){function t(){}return t.prototype.intersects=function(t,n){var o=e.Vector.create(t.x0,t.y0),r=e.Vector.create(t.x,t.y),i=e.Vector.create(n.x0,n.y0),a=e.Vector.create(n.x,n.y);return!!(s(o,i)||s(o,a)||s(r,i)||s(r,a))||0!==new W(X(t)).intersects({p1:i,p2:a}).length},t.prototype.supportedCommandTypes=function(){return[["C","S","Q"],["L","Z"]]},t}(),J=function(){function t(){}return t.prototype.intersects=function(t,n){var o=e.Vector.create(t.x0,t.y0),r=e.Vector.create(t.x,t.y),i=e.Vector.create(n.x0,n.y0),a=e.Vector.create(n.x,n.y);if(s(o,i)||s(o,a)||s(r,i)||s(r,a))return!0;var c=new W(X(t)),l=new W(X(n));return 0!==c.curveintersects([c],[l]).length},t.prototype.supportedCommandTypes=function(){return[["C","S","Q"],["C","S","Q"]]},t}(),$=function(){function t(){}return t.prototype.intersects=function(t,n){var o=e.Vector.create(t.x0,t.y0),r=e.Vector.create(t.x,t.y),i=e.Vector.create(n.x,n.y);return s(o,i)||s(r,i)},t.prototype.supportedCommandTypes=function(){return[["C","S","Q"],["M"]]},t}(),K=function(){function t(){}return t.prototype.intersects=function(t,n){var o=e.Vector.create(t.x,t.y),r=e.Vector.create(n.x,n.y);return s(o,r)},t.prototype.supportedCommandTypes=function(){return[["M"],["M"]]},t}(),ee=function(){function e(){this._intersectorRegistry=[new c,new x,new Y,new J,new $,new K]}return e.prototype.aggregate=function(e){var t=this,n=e.flatMap((function(e){return e})),o=new v((function(e,n){return t.intersect(e,n,t._intersectorRegistry)}));return n.forEach((function(e){o.addValue(e)})),o.getAggregatedCommands()},e.prototype.intersect=function(e,t,n){var o=n.find((function(n){var o=n.supportedCommandTypes();return o[0].includes(e.code)&&o[1].includes(t.code)||o[1].includes(e.code)&&o[0].includes(t.code)}));if(void 0===o)throw new Error("intersector not defined for types ".concat(e.code," ").concat(t.code));return o.supportedCommandTypes()[0].includes(e.code)?o.intersects(e,t):o.intersects(t,e)},e}(),te=function(){function e(){}return e.prototype.aggregate=function(e){return e},e}(),ne=function(){function t(t,n){this._lineCmd=t;var o=G(t),r=Q(t),i=Z(t);e.Vector.create(t.x,t.y),e.Vector.create(t.x0,t.y0),this._point=e.Bodies.circle(t.x,t.y,1,{isSensor:!0}),e.Body.setDensity(this._point,0),this._body=e.Bodies.rectangle(o.x,o.y,r,n,{angle:i}),this._bodies=[this._point,this._body]}return Object.defineProperty(t.prototype,"bodies",{get:function(){return this._bodies},enumerable:!1,configurable:!0}),t.prototype.updateSvgCommand=function(){this._lineCmd.x=this._point.position.x,this._lineCmd.y=this._point.position.y},t}(),oe=function(){function t(t){this._moveCmd=t,this._point=e.Bodies.circle(t.x,t.y,1,{render:{fillStyle:"white"},isSensor:!0}),e.Body.setDensity(this._point,0),this._bodies=[this._point]}return Object.defineProperty(t.prototype,"bodies",{get:function(){return this._bodies},enumerable:!1,configurable:!0}),t.prototype.updateSvgCommand=function(){this._moveCmd.x=this._point.position.x,this._moveCmd.y=this._point.position.y},t}(),re=function(){function t(){}return t.prototype.createPoints=function(e,t){var n=1/t;return Array.from(Array(t+1).keys()).map((function(t){return e.get(t*n)}))},t.prototype.createInnerBodies=function(t,o){var r=X(o),i=this.createPoints(new W(r),3);return i.filter((function(e,t){return tr._maxSpeed&&e.Body.setVelocity(t,{x:r._maxSpeed,y:t.velocity.y}),t.velocity.x<-r._maxSpeed&&e.Body.setVelocity(t,{x:-r._maxSpeed,y:t.velocity.y}),t.velocity.y>r._maxSpeed&&e.Body.setVelocity(t,{x:t.velocity.x,y:r._maxSpeed}),t.velocity.y<-r._maxSpeed&&e.Body.setVelocity(t,{x:-t.velocity.x,y:-r._maxSpeed})}))}))},t.prototype.stop=function(){},t}(),Ce=function(){function t(e){this._maxSpeed=e}return t.prototype.setup=function(t,n,o){var r=this;e.Events.on(n,"beforeUpdate",(function(){o.forEach((function(t){t.angularVelocity>r._maxSpeed&&e.Body.setAngularVelocity(t,r._maxSpeed),t.angularVelocity<-r._maxSpeed&&e.Body.setAngularVelocity(t,-r._maxSpeed)}))}))},t.prototype.stop=function(){},t}(),Be=function(){function e(e,t){this._physics=e,this._renderer=t}return e.prototype.stop=function(){this._renderer.stop(),this._physics.stop()},e}(),Me=function(){function e(e,t){this._aggregator=e,this._svg=t,this._plugins=[]}return e.prototype.withGravity=function(e){return this._plugins.push(new me(e)),this},e.prototype.withBorderCollider=function(){return this._plugins.push(new ge),this},e.prototype.withMouseInteraction=function(e){return this._plugins.push(new be(e)),this},e.prototype.withScrollInteraction=function(e){return this._plugins.push(new Ae(e)),this},e.prototype.withDebugRenderer=function(e){return this._plugins.push(new _e(e)),this},e.prototype.withCustomPlugin=function(e){return this._plugins.push(e),this},e.prototype.withLimitVelocityPlugin=function(e){return this._plugins.push(new Pe(e)),this},e.prototype.withLimitAngularVelocityPlugin=function(e){return this._plugins.push(new Ce(e)),this},e.prototype.startSimulation=function(e){var t=this.createSvgData(),n=new ye(t,e,this._plugins),o=new Se;return o.renderLoop(t,n),new Be(n,o)},e.prototype.createSvgData=function(){var e=Array.prototype.slice.call(this._svg.getElementsByTagName("path")).map((function(e){return e.getAttribute("d")})).map((function(e){return(0,xe.makeAbsolute)((0,xe.parseSVG)(e)).filter((function(e){return"Z"!==e.code||0!==Q(e)})).map((function(e){switch(e.code){case"H":case"V":return new ve(e.x,e.y,e.x0,e.y0);case"A":throw new Error("A not supported yet");default:return e}}))})),t=this._aggregator.aggregate(e);return new he(this._svg,e,t)},e}(),ke=function(){function e(e){this._svg=e}return e.prototype.useCollisionAggregator=function(){return new Me(new ee,this._svg)},e.prototype.usePathAggregator=function(){return new Me(new te,this._svg)},e.prototype.useCustomAggregator=function(e){return new Me(e,this._svg)},e}(),Ie=function(e){return new ke(e)}})(),r})())); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVuZGxlLmpzIiwibWFwcGluZ3MiOiI7Q0FBQSxTQUEyQ0EsRUFBTUMsR0FDMUIsaUJBQVpDLFNBQTBDLGlCQUFYQyxPQUN4Q0EsT0FBT0QsUUFBVUQsSUFDUSxtQkFBWEcsUUFBeUJBLE9BQU9DLElBQzlDRCxPQUFPLEdBQUlILEdBQ2UsaUJBQVpDLFFBQ2RBLFFBQXFCLFlBQUlELElBRXpCRCxFQUFrQixZQUFJQyxHQUN2QixDQVRELENBU0dLLE1BQU0scUNDa0JULElBQWlETCxJQVN4QyxXQUNULE9BQWdCLFNBQVVNLEdBRWhCLElBQUlDLEVBQW1CLENBQUMsRUFHeEIsU0FBUyxFQUFvQkMsR0FHNUIsR0FBR0QsRUFBaUJDLEdBQ25CLE9BQU9ELEVBQWlCQyxHQUFVUCxRQUduQyxJQUFJQyxFQUFTSyxFQUFpQkMsR0FBWSxDQUN6Q0MsRUFBR0QsRUFDSEUsR0FBRyxFQUNIVCxRQUFTLENBQUMsR0FVWCxPQU5BSyxFQUFRRSxHQUFVRyxLQUFLVCxFQUFPRCxRQUFTQyxFQUFRQSxFQUFPRCxRQUFTLEdBRy9EQyxFQUFPUSxHQUFJLEVBR0pSLEVBQU9ELE9BQ2YsQ0F5REEsT0FyREEsRUFBb0JXLEVBQUlOLEVBR3hCLEVBQW9CTyxFQUFJTixFQUd4QixFQUFvQk8sRUFBSSxTQUFTYixFQUFTYyxFQUFNQyxHQUMzQyxFQUFvQkMsRUFBRWhCLEVBQVNjLElBQ2xDRyxPQUFPQyxlQUFlbEIsRUFBU2MsRUFBTSxDQUFFSyxZQUFZLEVBQU1DLElBQUtMLEdBRWhFLEVBR0EsRUFBb0JNLEVBQUksU0FBU3JCLEdBQ1gsb0JBQVhzQixRQUEwQkEsT0FBT0MsYUFDMUNOLE9BQU9DLGVBQWVsQixFQUFTc0IsT0FBT0MsWUFBYSxDQUFFQyxNQUFPLFdBRTdEUCxPQUFPQyxlQUFlbEIsRUFBUyxhQUFjLENBQUV3QixPQUFPLEdBQ3ZELEVBT0EsRUFBb0JDLEVBQUksU0FBU0QsRUFBT0UsR0FFdkMsR0FEVSxFQUFQQSxJQUFVRixFQUFRLEVBQW9CQSxJQUMvQixFQUFQRSxFQUFVLE9BQU9GLEVBQ3BCLEdBQVcsRUFBUEUsR0FBOEIsaUJBQVZGLEdBQXNCQSxHQUFTQSxFQUFNRyxXQUFZLE9BQU9ILEVBQ2hGLElBQUlJLEVBQUtYLE9BQU9ZLE9BQU8sTUFHdkIsR0FGQSxFQUFvQlIsRUFBRU8sR0FDdEJYLE9BQU9DLGVBQWVVLEVBQUksVUFBVyxDQUFFVCxZQUFZLEVBQU1LLE1BQU9BLElBQ3RELEVBQVBFLEdBQTRCLGlCQUFURixFQUFtQixJQUFJLElBQUlNLEtBQU9OLEVBQU8sRUFBb0JYLEVBQUVlLEVBQUlFLEVBQUssU0FBU0EsR0FBTyxPQUFPTixFQUFNTSxFQUFNLEVBQUVDLEtBQUssS0FBTUQsSUFDOUksT0FBT0YsQ0FDUixFQUdBLEVBQW9CSSxFQUFJLFNBQVMvQixHQUNoQyxJQUFJYyxFQUFTZCxHQUFVQSxFQUFPMEIsV0FDN0IsV0FBd0IsT0FBTzFCLEVBQWdCLE9BQUcsRUFDbEQsV0FBOEIsT0FBT0EsQ0FBUSxFQUU5QyxPQURBLEVBQW9CWSxFQUFFRSxFQUFRLElBQUtBLEdBQzVCQSxDQUNSLEVBR0EsRUFBb0JDLEVBQUksU0FBU2lCLEVBQVFDLEdBQVksT0FBT2pCLE9BQU9rQixVQUFVQyxlQUFlMUIsS0FBS3VCLEVBQVFDLEVBQVcsRUFHcEgsRUFBb0JHLEVBQUksR0FJakIsRUFBb0IsRUFBb0JDLEVBQUksR0FDbkQsQ0FwRk0sQ0FzRk4sQ0FFSixTQUFVckMsRUFBUUQsR0FReEIsSUFBSXVDLEVBQVMsQ0FBQyxFQUVkdEMsRUFBT0QsUUFBVXVDLEVBRWpCLFdBRUlBLEVBQU9DLFFBQVUsRUFDakJELEVBQU9FLE1BQVEsRUFDZkYsRUFBT0csZUFBaUIsSUFBS0MsS0FDN0JKLEVBQU9LLFlBQWMsQ0FBQyxFQUN0QkwsRUFBT00sUUFBVSxLQVNqQk4sRUFBT08sT0FBUyxTQUFTQyxFQUFLQyxHQUMxQixJQUFJQyxFQUVBQyxFQUVnQixrQkFBVEYsR0FDUEMsRUFBWSxFQUNaQyxFQUFZRixJQUVaQyxFQUFZLEVBQ1pDLEdBQVksR0FHaEIsSUFBSyxJQUFJMUMsRUFBSXlDLEVBQVd6QyxFQUFJMkMsVUFBVUMsT0FBUTVDLElBQUssQ0FDL0MsSUFBSTZDLEVBQVNGLFVBQVUzQyxHQUV2QixHQUFJNkMsRUFDQSxJQUFLLElBQUlDLEtBQVFELEVBQ1RILEdBQWFHLEVBQU9DLElBQVNELEVBQU9DLEdBQU1DLGNBQWdCdEMsT0FDckQ4QixFQUFJTyxJQUFTUCxFQUFJTyxHQUFNQyxjQUFnQnRDLE9BSXhDOEIsRUFBSU8sR0FBUUQsRUFBT0MsSUFIbkJQLEVBQUlPLEdBQVFQLEVBQUlPLElBQVMsQ0FBQyxFQUMxQmYsRUFBT08sT0FBT0MsRUFBSU8sR0FBT0osRUFBV0csRUFBT0MsS0FLL0NQLEVBQUlPLEdBQVFELEVBQU9DLEVBSW5DLENBRUEsT0FBT1AsQ0FDWCxFQVNBUixFQUFPaUIsTUFBUSxTQUFTVCxFQUFLQyxHQUN6QixPQUFPVCxFQUFPTyxPQUFPLENBQUMsRUFBR0UsRUFBTUQsRUFDbkMsRUFRQVIsRUFBT2tCLEtBQU8sU0FBU1YsR0FDbkIsR0FBSTlCLE9BQU93QyxLQUNQLE9BQU94QyxPQUFPd0MsS0FBS1YsR0FHdkIsSUFBSVUsRUFBTyxHQUNYLElBQUssSUFBSTNCLEtBQU9pQixFQUNaVSxFQUFLQyxLQUFLNUIsR0FDZCxPQUFPMkIsQ0FDWCxFQVFBbEIsRUFBT29CLE9BQVMsU0FBU1osR0FDckIsSUFBSVksRUFBUyxHQUViLEdBQUkxQyxPQUFPd0MsS0FBTSxDQUViLElBREEsSUFBSUEsRUFBT3hDLE9BQU93QyxLQUFLVixHQUNkdkMsRUFBSSxFQUFHQSxFQUFJaUQsRUFBS0wsT0FBUTVDLElBQzdCbUQsRUFBT0QsS0FBS1gsRUFBSVUsRUFBS2pELEtBRXpCLE9BQU9tRCxDQUNYLENBR0EsSUFBSyxJQUFJN0IsS0FBT2lCLEVBQ1pZLEVBQU9ELEtBQUtYLEVBQUlqQixJQUNwQixPQUFPNkIsQ0FDWCxFQVdBcEIsRUFBT25CLElBQU0sU0FBUzJCLEVBQUthLEVBQU1DLEVBQU9DLEdBQ3BDRixFQUFPQSxFQUFLRyxNQUFNLEtBQUtDLE1BQU1ILEVBQU9DLEdBRXBDLElBQUssSUFBSXRELEVBQUksRUFBR0EsRUFBSW9ELEVBQUtSLE9BQVE1QyxHQUFLLEVBQ2xDdUMsRUFBTUEsRUFBSWEsRUFBS3BELElBR25CLE9BQU91QyxDQUNYLEVBWUFSLEVBQU8wQixJQUFNLFNBQVNsQixFQUFLYSxFQUFNTSxFQUFLTCxFQUFPQyxHQUN6QyxJQUFJSyxFQUFRUCxFQUFLRyxNQUFNLEtBQUtDLE1BQU1ILEVBQU9DLEdBRXpDLE9BREF2QixFQUFPbkIsSUFBSTJCLEVBQUthLEVBQU0sR0FBSSxHQUFHTyxFQUFNQSxFQUFNZixPQUFTLElBQU1jLEVBQ2pEQSxDQUNYLEVBU0EzQixFQUFPNkIsUUFBVSxTQUFTQyxHQUN0QixJQUFLLElBQUk3RCxFQUFJNkQsRUFBTWpCLE9BQVMsRUFBRzVDLEVBQUksRUFBR0EsSUFBSyxDQUN2QyxJQUFJOEQsRUFBSUMsS0FBS0MsTUFBTWpDLEVBQU9rQyxVQUFZakUsRUFBSSxJQUN0Q2tFLEVBQU9MLEVBQU03RCxHQUNqQjZELEVBQU03RCxHQUFLNkQsRUFBTUMsR0FDakJELEVBQU1DLEdBQUtJLENBQ2YsQ0FDQSxPQUFPTCxDQUNYLEVBU0E5QixFQUFPb0MsT0FBUyxTQUFTQyxHQUNyQixPQUFPQSxFQUFRTCxLQUFLQyxNQUFNakMsRUFBT2tDLFNBQVdHLEVBQVF4QixRQUN4RCxFQVFBYixFQUFPc0MsVUFBWSxTQUFTOUIsR0FDeEIsTUFBMkIsb0JBQWhCK0IsWUFDQS9CLGFBQWUrQixlQUdoQi9CLEdBQU9BLEVBQUlnQyxVQUFZaEMsRUFBSWlDLFNBQ3pDLEVBUUF6QyxFQUFPMEMsUUFBVSxTQUFTbEMsR0FDdEIsTUFBK0MsbUJBQXhDOUIsT0FBT2tCLFVBQVUrQyxTQUFTeEUsS0FBS3FDLEVBQzFDLEVBUUFSLEVBQU80QyxXQUFhLFNBQVNwQyxHQUN6QixNQUFzQixtQkFBUkEsQ0FDbEIsRUFRQVIsRUFBTzZDLGNBQWdCLFNBQVNyQyxHQUM1QixNQUFzQixpQkFBUkEsR0FBb0JBLEVBQUlRLGNBQWdCdEMsTUFDMUQsRUFRQXNCLEVBQU84QyxTQUFXLFNBQVN0QyxHQUN2QixNQUE4QixvQkFBdkJtQyxTQUFTeEUsS0FBS3FDLEVBQ3pCLEVBVUFSLEVBQU8rQyxNQUFRLFNBQVM5RCxFQUFPK0QsRUFBS0MsR0FDaEMsT0FBSWhFLEVBQVErRCxFQUNEQSxFQUNQL0QsRUFBUWdFLEVBQ0RBLEVBQ0poRSxDQUNYLEVBUUFlLEVBQU9rRCxLQUFPLFNBQVNqRSxHQUNuQixPQUFPQSxFQUFRLEdBQUssRUFBSSxDQUM1QixFQVFBZSxFQUFPbUQsSUFBTSxXQUNULEdBQXNCLG9CQUFYQyxRQUEwQkEsT0FBT0MsWUFBYSxDQUNyRCxHQUFJRCxPQUFPQyxZQUFZRixJQUNuQixPQUFPQyxPQUFPQyxZQUFZRixNQUN2QixHQUFJQyxPQUFPQyxZQUFZQyxVQUMxQixPQUFPRixPQUFPQyxZQUFZQyxXQUVsQyxDQUVBLE9BQUlsRCxLQUFLK0MsSUFDRS9DLEtBQUsrQyxNQUdULElBQUsvQyxLQUFVSixFQUFPRyxhQUNqQyxFQVVBSCxFQUFPa0MsT0FBUyxTQUFTYyxFQUFLQyxHQUcxQixPQURBQSxPQUFzQixJQUFSQSxFQUF1QkEsRUFBTSxHQUQzQ0QsT0FBc0IsSUFBUkEsRUFBdUJBLEVBQU0sR0FFOUJPLEtBQW1CTixFQUFNRCxFQUMxQyxFQUVBLElBQUlPLEVBQWdCLFdBR2hCLE9BREF2RCxFQUFPRSxPQUF3QixLQUFmRixFQUFPRSxNQUFlLE9BQVMsT0FDeENGLEVBQU9FLE1BQVEsTUFDMUIsRUFRQUYsRUFBT3dELGNBQWdCLFNBQVNDLEdBUzVCLE9BTjBCLElBRjFCQSxFQUFjQSxFQUFZQyxRQUFRLElBQUksS0FFdEI3QyxTQUNaNEMsRUFBY0EsRUFBWUUsT0FBTyxHQUFLRixFQUFZRSxPQUFPLEdBQzNDRixFQUFZRSxPQUFPLEdBQUtGLEVBQVlFLE9BQU8sR0FDM0NGLEVBQVlFLE9BQU8sR0FBS0YsRUFBWUUsT0FBTyxJQUd0REMsU0FBU0gsRUFBYSxHQUNqQyxFQWdCQXpELEVBQU82RCxTQUFXLEVBUWxCN0QsRUFBTzhELElBQU0sV0FDTEMsU0FBVy9ELEVBQU82RCxTQUFXLEdBQUs3RCxFQUFPNkQsVUFBWSxHQUNyREUsUUFBUUQsSUFBSUUsTUFBTUQsUUFBUyxDQUFDLGNBQWNFLE9BQU9DLE1BQU10RSxVQUFVNkIsTUFBTXRELEtBQUt5QyxZQUVwRixFQVFBWixFQUFPbUUsS0FBTyxXQUNOSixTQUFXL0QsRUFBTzZELFNBQVcsR0FBSzdELEVBQU82RCxVQUFZLEdBQ3JERSxRQUFRSSxLQUFLSCxNQUFNRCxRQUFTLENBQUMsY0FBY0UsT0FBT0MsTUFBTXRFLFVBQVU2QixNQUFNdEQsS0FBS3lDLFlBRXJGLEVBUUFaLEVBQU9vRSxLQUFPLFdBQ05MLFNBQVcvRCxFQUFPNkQsU0FBVyxHQUFLN0QsRUFBTzZELFVBQVksR0FDckRFLFFBQVFLLEtBQUtKLE1BQU1ELFFBQVMsQ0FBQyxjQUFjRSxPQUFPQyxNQUFNdEUsVUFBVTZCLE1BQU10RCxLQUFLeUMsWUFFckYsRUFPQVosRUFBT3FFLFNBQVcsV0FDZCxJQUFJQyxFQUFVSixNQUFNdEUsVUFBVTZCLE1BQU10RCxLQUFLeUMsV0FBVzJELEtBQUssS0FFcER2RSxFQUFPSyxZQUFZaUUsS0FDcEJ0RSxFQUFPb0UsS0FBS0UsR0FDWnRFLEVBQU9LLFlBQVlpRSxJQUFXLEVBRXRDLEVBV0F0RSxFQUFPd0UsV0FBYSxTQUFTaEUsRUFBS08sRUFBTTBELEdBQ3BDakUsRUFBSU8sR0FBUWYsRUFBTzBFLE9BQU0sV0FDckIxRSxFQUFPcUUsU0FBUyxtQkFBb0JJLEVBQ3hDLEdBQUdqRSxFQUFJTyxHQUNYLEVBT0FmLEVBQU8yRSxPQUFTLFdBQ1osT0FBTzNFLEVBQU9DLFNBQ2xCLEVBU0FELEVBQU80RSxRQUFVLFNBQVNDLEVBQVVDLEdBQ2hDLEdBQUlELEVBQVNELFFBQ1QsT0FBT0MsRUFBU0QsUUFBUUUsR0FFNUIsSUFBSyxJQUFJN0csRUFBSSxFQUFHQSxFQUFJNEcsRUFBU2hFLE9BQVE1QyxJQUNqQyxHQUFJNEcsRUFBUzVHLEtBQU82RyxFQUNoQixPQUFPN0csRUFHZixPQUFRLENBQ1osRUFTQStCLEVBQU8rRSxJQUFNLFNBQVNDLEVBQU1DLEdBQ3hCLEdBQUlELEVBQUtELElBQ0wsT0FBT0MsRUFBS0QsSUFBSUUsR0FLcEIsSUFGQSxJQUFJQyxFQUFTLEdBRUpqSCxFQUFJLEVBQUdBLEVBQUkrRyxFQUFLbkUsT0FBUTVDLEdBQUssRUFDbENpSCxFQUFPL0QsS0FBSzhELEVBQUtELEVBQUsvRyxLQUcxQixPQUFPaUgsQ0FDWCxFQVNBbEYsRUFBT21GLGdCQUFrQixTQUFTQyxHQUk5QixJQUFJQyxFQUFTLEdBQ1RDLEVBQVUsR0FDVm5ELEVBQU8sR0FFWCxJQUFLLElBQUlvRCxLQUFRSCxFQUNSRSxFQUFRQyxJQUFVcEQsRUFBS29ELElBQ3hCdkYsRUFBT3dGLGlCQUFpQkQsRUFBTUQsRUFBU25ELEVBQU1pRCxFQUFPQyxHQUk1RCxPQUFPQSxDQUNYLEVBRUFyRixFQUFPd0YsaUJBQW1CLFNBQVNELEVBQU1ELEVBQVNuRCxFQUFNaUQsRUFBT0MsR0FDM0QsSUFBSUksRUFBWUwsRUFBTUcsSUFBUyxHQUMvQnBELEVBQUtvRCxJQUFRLEVBRWIsSUFBSyxJQUFJdEgsRUFBSSxFQUFHQSxFQUFJd0gsRUFBVTVFLE9BQVE1QyxHQUFLLEVBQUcsQ0FDMUMsSUFBSXlILEVBQVdELEVBQVV4SCxHQUVyQmtFLEVBQUt1RCxJQUtKSixFQUFRSSxJQUNUMUYsRUFBT3dGLGlCQUFpQkUsRUFBVUosRUFBU25ELEVBQU1pRCxFQUFPQyxFQUVoRSxDQUVBbEQsRUFBS29ELElBQVEsRUFDYkQsRUFBUUMsSUFBUSxFQUVoQkYsRUFBT2xFLEtBQUtvRSxFQUNoQixFQWFBdkYsRUFBTzBFLE1BQVEsV0FHWCxJQUZBLElBQUlpQixFQUFRLEdBRUgxSCxFQUFJLEVBQUdBLEVBQUkyQyxVQUFVQyxPQUFRNUMsR0FBSyxFQUFHLENBQzFDLElBQUlnSCxFQUFPckUsVUFBVTNDLEdBRWpCZ0gsRUFBS1csU0FFTEQsRUFBTXhFLEtBQUs2QyxNQUFNMkIsRUFBT1YsRUFBS1csVUFFN0JELEVBQU14RSxLQUFLOEQsRUFFbkIsQ0FFQSxJQUFJUCxFQUFRLFdBS1IsSUFIQSxJQUFJbUIsRUFDQUMsRUFBTyxJQUFJNUIsTUFBTXRELFVBQVVDLFFBRXRCNUMsRUFBSSxFQUFHQyxFQUFJMEMsVUFBVUMsT0FBUTVDLEVBQUlDLEVBQUdELElBQ3pDNkgsRUFBSzdILEdBQUsyQyxVQUFVM0MsR0FHeEIsSUFBS0EsRUFBSSxFQUFHQSxFQUFJMEgsRUFBTTlFLE9BQVE1QyxHQUFLLEVBQUcsQ0FDbEMsSUFBSW9ILEVBQVNNLEVBQU0xSCxHQUFHK0YsTUFBTTZCLEVBQVlDLFFBRWxCLElBQVhULElBQ1BRLEVBQWFSLEVBRXJCLENBRUEsT0FBT1EsQ0FDWCxFQUlBLE9BRkFuQixFQUFNa0IsU0FBV0QsRUFFVmpCLENBQ1gsRUFXQTFFLEVBQU8rRixnQkFBa0IsU0FBU0MsRUFBTTNFLEVBQU00RCxHQUMxQyxPQUFPakYsRUFBTzBCLElBQUlzRSxFQUFNM0UsRUFBTXJCLEVBQU8wRSxNQUNqQ08sRUFDQWpGLEVBQU9uQixJQUFJbUgsRUFBTTNFLElBRXpCLEVBV0FyQixFQUFPaUcsZUFBaUIsU0FBU0QsRUFBTTNFLEVBQU00RCxHQUN6QyxPQUFPakYsRUFBTzBCLElBQUlzRSxFQUFNM0UsRUFBTXJCLEVBQU8wRSxNQUNqQzFFLEVBQU9uQixJQUFJbUgsRUFBTTNFLEdBQ2pCNEQsR0FFUixFQVFBakYsRUFBT2tHLFVBQVksU0FBU0MsR0FDeEJuRyxFQUFPTSxRQUFVNkYsQ0FDckIsRUFRQW5HLEVBQU9vRyxVQUFZLFdBRWYsSUFBSUQsRUFBU25HLEVBQU9NLFFBRXBCLElBRVM2RixHQUE0QixvQkFBWC9DLFNBQ2xCK0MsRUFBUy9DLE9BQU8rQyxRQUlmQSxRQUE0QixJQUFYLEVBQUFFLElBQ2xCRixFQUFTLEVBQUFFLEVBQU9GLE9BS3hCLENBSEUsTUFBT0csR0FFTEgsRUFBUyxJQUNiLENBRUEsT0FBT0EsQ0FDWCxDQUNILENBeGxCRCxFQTJsQk8sRUFFRCxTQUFVekksRUFBUUQsR0FReEIsSUFBSThJLEVBQVMsQ0FBQyxFQUVkN0ksRUFBT0QsUUFBVThJLEVBVWJBLEVBQU9qSCxPQUFTLFNBQVNrSCxHQUNyQixJQUFJQyxFQUFTLENBQ1R6RCxJQUFLLENBQUUwRCxFQUFHLEVBQUdDLEVBQUcsR0FDaEIxRCxJQUFLLENBQUV5RCxFQUFHLEVBQUdDLEVBQUcsSUFNcEIsT0FISUgsR0FDQUQsRUFBT0ssT0FBT0gsRUFBUUQsR0FFbkJDLENBQ1gsRUFTQUYsRUFBT0ssT0FBUyxTQUFTSCxFQUFRRCxFQUFVSyxHQUN2Q0osRUFBT3pELElBQUkwRCxFQUFJSSxJQUNmTCxFQUFPeEQsSUFBSXlELEdBQUksSUFDZkQsRUFBT3pELElBQUkyRCxFQUFJRyxJQUNmTCxFQUFPeEQsSUFBSTBELEdBQUksSUFFZixJQUFLLElBQUkxSSxFQUFJLEVBQUdBLEVBQUl1SSxFQUFTM0YsT0FBUTVDLElBQUssQ0FDdEMsSUFBSThJLEVBQVNQLEVBQVN2SSxHQUNsQjhJLEVBQU9MLEVBQUlELEVBQU94RCxJQUFJeUQsSUFBR0QsRUFBT3hELElBQUl5RCxFQUFJSyxFQUFPTCxHQUMvQ0ssRUFBT0wsRUFBSUQsRUFBT3pELElBQUkwRCxJQUFHRCxFQUFPekQsSUFBSTBELEVBQUlLLEVBQU9MLEdBQy9DSyxFQUFPSixFQUFJRixFQUFPeEQsSUFBSTBELElBQUdGLEVBQU94RCxJQUFJMEQsRUFBSUksRUFBT0osR0FDL0NJLEVBQU9KLEVBQUlGLEVBQU96RCxJQUFJMkQsSUFBR0YsRUFBT3pELElBQUkyRCxFQUFJSSxFQUFPSixFQUN2RCxDQUVJRSxJQUNJQSxFQUFTSCxFQUFJLEVBQ2JELEVBQU94RCxJQUFJeUQsR0FBS0csRUFBU0gsRUFFekJELEVBQU96RCxJQUFJMEQsR0FBS0csRUFBU0gsRUFHekJHLEVBQVNGLEVBQUksRUFDYkYsRUFBT3hELElBQUkwRCxHQUFLRSxFQUFTRixFQUV6QkYsRUFBT3pELElBQUkyRCxHQUFLRSxFQUFTRixFQUdyQyxFQVNBSixFQUFPUyxTQUFXLFNBQVNQLEVBQVFRLEdBQy9CLE9BQU9BLEVBQU1QLEdBQUtELEVBQU96RCxJQUFJMEQsR0FBS08sRUFBTVAsR0FBS0QsRUFBT3hELElBQUl5RCxHQUM5Q08sRUFBTU4sR0FBS0YsRUFBT3pELElBQUkyRCxHQUFLTSxFQUFNTixHQUFLRixFQUFPeEQsSUFBSTBELENBQy9ELEVBU0FKLEVBQU9XLFNBQVcsU0FBU0MsRUFBU0MsR0FDaEMsT0FBUUQsRUFBUW5FLElBQUkwRCxHQUFLVSxFQUFRbkUsSUFBSXlELEdBQUtTLEVBQVFsRSxJQUFJeUQsR0FBS1UsRUFBUXBFLElBQUkwRCxHQUM1RFMsRUFBUWxFLElBQUkwRCxHQUFLUyxFQUFRcEUsSUFBSTJELEdBQUtRLEVBQVFuRSxJQUFJMkQsR0FBS1MsRUFBUW5FLElBQUkwRCxDQUM5RSxFQVFBSixFQUFPYyxVQUFZLFNBQVNaLEVBQVFhLEdBQ2hDYixFQUFPekQsSUFBSTBELEdBQUtZLEVBQU9aLEVBQ3ZCRCxFQUFPeEQsSUFBSXlELEdBQUtZLEVBQU9aLEVBQ3ZCRCxFQUFPekQsSUFBSTJELEdBQUtXLEVBQU9YLEVBQ3ZCRixFQUFPeEQsSUFBSTBELEdBQUtXLEVBQU9YLENBQzNCLEVBUUFKLEVBQU9nQixNQUFRLFNBQVNkLEVBQVFlLEdBQzVCLElBQUlDLEVBQVNoQixFQUFPeEQsSUFBSXlELEVBQUlELEVBQU96RCxJQUFJMEQsRUFDbkNnQixFQUFTakIsRUFBT3hELElBQUkwRCxFQUFJRixFQUFPekQsSUFBSTJELEVBRXZDRixFQUFPekQsSUFBSTBELEVBQUljLEVBQVNkLEVBQ3hCRCxFQUFPeEQsSUFBSXlELEVBQUljLEVBQVNkLEVBQUllLEVBQzVCaEIsRUFBT3pELElBQUkyRCxFQUFJYSxFQUFTYixFQUN4QkYsRUFBT3hELElBQUkwRCxFQUFJYSxFQUFTYixFQUFJZSxDQUNoQyxDQUtHLEVBRUQsU0FBVWhLLEVBQVFELEdBY3hCLElBQUlrSyxFQUFTLENBQUMsRUFFZGpLLEVBQU9ELFFBQVVrSyxFQVdiQSxFQUFPckksT0FBUyxTQUFTb0gsRUFBR0MsR0FDeEIsTUFBTyxDQUFFRCxFQUFHQSxHQUFLLEVBQUdDLEVBQUdBLEdBQUssRUFDaEMsRUFRQWdCLEVBQU8xRyxNQUFRLFNBQVNxRyxHQUNwQixNQUFPLENBQUVaLEVBQUdZLEVBQU9aLEVBQUdDLEVBQUdXLEVBQU9YLEVBQ3BDLEVBUUFnQixFQUFPQyxVQUFZLFNBQVNOLEdBQ3hCLE9BQU90RixLQUFLNkYsS0FBTVAsRUFBT1osRUFBSVksRUFBT1osRUFBTVksRUFBT1gsRUFBSVcsRUFBT1gsRUFDaEUsRUFRQWdCLEVBQU9HLGlCQUFtQixTQUFTUixHQUMvQixPQUFRQSxFQUFPWixFQUFJWSxFQUFPWixFQUFNWSxFQUFPWCxFQUFJVyxFQUFPWCxDQUN0RCxFQVVBZ0IsRUFBT0ksT0FBUyxTQUFTVCxFQUFRVSxFQUFPQyxHQUNwQyxJQUFJQyxFQUFNbEcsS0FBS2tHLElBQUlGLEdBQVFHLEVBQU1uRyxLQUFLbUcsSUFBSUgsR0FDckNDLElBQVFBLEVBQVMsQ0FBQyxHQUN2QixJQUFJdkIsRUFBSVksRUFBT1osRUFBSXdCLEVBQU1aLEVBQU9YLEVBQUl3QixFQUdwQyxPQUZBRixFQUFPdEIsRUFBSVcsRUFBT1osRUFBSXlCLEVBQU1iLEVBQU9YLEVBQUl1QixFQUN2Q0QsRUFBT3ZCLEVBQUlBLEVBQ0p1QixDQUNYLEVBV0FOLEVBQU9TLFlBQWMsU0FBU2QsRUFBUVUsRUFBT2YsRUFBT2dCLEdBQ2hELElBQUlDLEVBQU1sRyxLQUFLa0csSUFBSUYsR0FBUUcsRUFBTW5HLEtBQUttRyxJQUFJSCxHQUNyQ0MsSUFBUUEsRUFBUyxDQUFDLEdBQ3ZCLElBQUl2QixFQUFJTyxFQUFNUCxJQUFNWSxFQUFPWixFQUFJTyxFQUFNUCxHQUFLd0IsR0FBT1osRUFBT1gsRUFBSU0sRUFBTU4sR0FBS3dCLEdBR3ZFLE9BRkFGLEVBQU90QixFQUFJTSxFQUFNTixJQUFNVyxFQUFPWixFQUFJTyxFQUFNUCxHQUFLeUIsR0FBT2IsRUFBT1gsRUFBSU0sRUFBTU4sR0FBS3VCLEdBQzFFRCxFQUFPdkIsRUFBSUEsRUFDSnVCLENBQ1gsRUFRQU4sRUFBT1UsVUFBWSxTQUFTZixHQUN4QixJQUFJTSxFQUFZRCxFQUFPQyxVQUFVTixHQUNqQyxPQUFrQixJQUFkTSxFQUNPLENBQUVsQixFQUFHLEVBQUdDLEVBQUcsR0FDZixDQUFFRCxFQUFHWSxFQUFPWixFQUFJa0IsRUFBV2pCLEVBQUdXLEVBQU9YLEVBQUlpQixFQUNwRCxFQVNBRCxFQUFPVyxJQUFNLFNBQVNDLEVBQVNDLEdBQzNCLE9BQVFELEVBQVE3QixFQUFJOEIsRUFBUTlCLEVBQU02QixFQUFRNUIsRUFBSTZCLEVBQVE3QixDQUMxRCxFQVNBZ0IsRUFBT2MsTUFBUSxTQUFTRixFQUFTQyxHQUM3QixPQUFRRCxFQUFRN0IsRUFBSThCLEVBQVE3QixFQUFNNEIsRUFBUTVCLEVBQUk2QixFQUFROUIsQ0FDMUQsRUFVQWlCLEVBQU9lLE9BQVMsU0FBU0gsRUFBU0MsRUFBU0csR0FDdkMsT0FBUUgsRUFBUTlCLEVBQUk2QixFQUFRN0IsSUFBTWlDLEVBQVFoQyxFQUFJNEIsRUFBUTVCLElBQU02QixFQUFRN0IsRUFBSTRCLEVBQVE1QixJQUFNZ0MsRUFBUWpDLEVBQUk2QixFQUFRN0IsRUFDOUcsRUFVQWlCLEVBQU9pQixJQUFNLFNBQVNMLEVBQVNDLEVBQVNQLEdBSXBDLE9BSEtBLElBQVFBLEVBQVMsQ0FBQyxHQUN2QkEsRUFBT3ZCLEVBQUk2QixFQUFRN0IsRUFBSThCLEVBQVE5QixFQUMvQnVCLEVBQU90QixFQUFJNEIsRUFBUTVCLEVBQUk2QixFQUFRN0IsRUFDeEJzQixDQUNYLEVBVUFOLEVBQU9rQixJQUFNLFNBQVNOLEVBQVNDLEVBQVNQLEdBSXBDLE9BSEtBLElBQVFBLEVBQVMsQ0FBQyxHQUN2QkEsRUFBT3ZCLEVBQUk2QixFQUFRN0IsRUFBSThCLEVBQVE5QixFQUMvQnVCLEVBQU90QixFQUFJNEIsRUFBUTVCLEVBQUk2QixFQUFRN0IsRUFDeEJzQixDQUNYLEVBU0FOLEVBQU9tQixLQUFPLFNBQVN4QixFQUFReUIsR0FDM0IsTUFBTyxDQUFFckMsRUFBR1ksRUFBT1osRUFBSXFDLEVBQVFwQyxFQUFHVyxFQUFPWCxFQUFJb0MsRUFDakQsRUFTQXBCLEVBQU9xQixJQUFNLFNBQVMxQixFQUFReUIsR0FDMUIsTUFBTyxDQUFFckMsRUFBR1ksRUFBT1osRUFBSXFDLEVBQVFwQyxFQUFHVyxFQUFPWCxFQUFJb0MsRUFDakQsRUFTQXBCLEVBQU9zQixLQUFPLFNBQVMzQixFQUFRNEIsR0FFM0IsTUFBTyxDQUFFeEMsR0FEVHdDLEdBQW9CLElBQVhBLEdBQW1CLEVBQUksSUFDVjVCLEVBQU9YLEVBQUdBLEVBQUd1QyxFQUFTNUIsRUFBT1osRUFDdkQsRUFRQWlCLEVBQU93QixJQUFNLFNBQVM3QixHQUNsQixNQUFPLENBQUVaLEdBQUlZLEVBQU9aLEVBQUdDLEdBQUlXLEVBQU9YLEVBQ3RDLEVBU0FnQixFQUFPSyxNQUFRLFNBQVNPLEVBQVNDLEdBQzdCLE9BQU94RyxLQUFLb0gsTUFBTVosRUFBUTdCLEVBQUk0QixFQUFRNUIsRUFBRzZCLEVBQVE5QixFQUFJNkIsRUFBUTdCLEVBQ2pFLEVBUUFpQixFQUFPMEIsTUFBUSxDQUNYMUIsRUFBT3JJLFNBQVVxSSxFQUFPckksU0FDeEJxSSxFQUFPckksU0FBVXFJLEVBQU9ySSxTQUN4QnFJLEVBQU9ySSxTQUFVcUksRUFBT3JJLFNBS3pCLEVBRUQsU0FBVTVCLEVBQVFELEVBQVMsR0FZakMsSUFBSTZMLEVBQVcsQ0FBQyxFQUVoQjVMLEVBQU9ELFFBQVU2TCxFQUVqQixJQUFJM0IsRUFBUyxFQUFvQixHQUM3QjNILEVBQVMsRUFBb0IsR0FxQjdCc0osRUFBU2hLLE9BQVMsU0FBU2lLLEVBQVFDLEdBRy9CLElBRkEsSUFBSWhELEVBQVcsR0FFTnZJLEVBQUksRUFBR0EsRUFBSXNMLEVBQU8xSSxPQUFRNUMsSUFBSyxDQUNwQyxJQUFJZ0osRUFBUXNDLEVBQU90TCxHQUNmOEksRUFBUyxDQUNMTCxFQUFHTyxFQUFNUCxFQUNUQyxFQUFHTSxFQUFNTixFQUNUOEMsTUFBT3hMLEVBQ1B1TCxLQUFNQSxFQUNORSxZQUFZLEdBR3BCbEQsRUFBU3JGLEtBQUs0RixFQUNsQixDQUVBLE9BQU9QLENBQ1gsRUFXQThDLEVBQVNLLFNBQVcsU0FBU3RJLEVBQU1tSSxHQUMvQixJQUNJRCxFQUFTLEdBTWIsT0FKQWxJLEVBQUtxQyxRQUhhLHNDQUdRLFNBQVNrRyxFQUFPbEQsRUFBR0MsR0FDekM0QyxFQUFPcEksS0FBSyxDQUFFdUYsRUFBR21ELFdBQVduRCxHQUFJQyxFQUFHa0QsV0FBV2xELElBQ2xELElBRU8yQyxFQUFTaEssT0FBT2lLLEVBQVFDLEVBQ25DLEVBUUFGLEVBQVNRLE9BQVMsU0FBU3RELEdBT3ZCLElBTkEsSUFFSWlDLEVBQ0F0RyxFQUNBSixFQUpBZ0ksRUFBT1QsRUFBU1MsS0FBS3ZELEdBQVUsR0FDL0JzRCxFQUFTLENBQUVwRCxFQUFHLEVBQUdDLEVBQUcsR0FLZjFJLEVBQUksRUFBR0EsRUFBSXVJLEVBQVMzRixPQUFRNUMsSUFDakM4RCxHQUFLOUQsRUFBSSxHQUFLdUksRUFBUzNGLE9BQ3ZCNEgsRUFBUWQsRUFBT2MsTUFBTWpDLEVBQVN2SSxHQUFJdUksRUFBU3pFLElBQzNDSSxFQUFPd0YsRUFBT21CLEtBQUtuQixFQUFPaUIsSUFBSXBDLEVBQVN2SSxHQUFJdUksRUFBU3pFLElBQUswRyxHQUN6RHFCLEVBQVNuQyxFQUFPaUIsSUFBSWtCLEVBQVEzSCxHQUdoQyxPQUFPd0YsRUFBT3FCLElBQUljLEVBQVEsRUFBSUMsRUFDbEMsRUFRQVQsRUFBU1UsS0FBTyxTQUFTeEQsR0FHckIsSUFGQSxJQUFJeUQsRUFBVSxDQUFFdkQsRUFBRyxFQUFHQyxFQUFHLEdBRWhCMUksRUFBSSxFQUFHQSxFQUFJdUksRUFBUzNGLE9BQVE1QyxJQUNqQ2dNLEVBQVF2RCxHQUFLRixFQUFTdkksR0FBR3lJLEVBQ3pCdUQsRUFBUXRELEdBQUtILEVBQVN2SSxHQUFHMEksRUFHN0IsT0FBT2dCLEVBQU9xQixJQUFJaUIsRUFBU3pELEVBQVMzRixPQUN4QyxFQVNBeUksRUFBU1MsS0FBTyxTQUFTdkQsRUFBVTBELEdBSS9CLElBSEEsSUFBSUgsRUFBTyxFQUNQaEksRUFBSXlFLEVBQVMzRixPQUFTLEVBRWpCNUMsRUFBSSxFQUFHQSxFQUFJdUksRUFBUzNGLE9BQVE1QyxJQUNqQzhMLElBQVN2RCxFQUFTekUsR0FBRzJFLEVBQUlGLEVBQVN2SSxHQUFHeUksSUFBTUYsRUFBU3pFLEdBQUc0RSxFQUFJSCxFQUFTdkksR0FBRzBJLEdBQ3ZFNUUsRUFBSTlELEVBR1IsT0FBSWlNLEVBQ09ILEVBQU8sRUFFWC9ILEtBQUttSSxJQUFJSixHQUFRLENBQzVCLEVBU0FULEVBQVNjLFFBQVUsU0FBUzVELEVBQVU2RCxHQVNsQyxJQVJBLElBR0k1QixFQUNBMUcsRUFKQXVJLEVBQVksRUFDWkMsRUFBYyxFQUNkQyxFQUFJaEUsRUFNQy9HLEVBQUksRUFBR0EsRUFBSStLLEVBQUUzSixPQUFRcEIsSUFDMUJzQyxHQUFLdEMsRUFBSSxHQUFLK0ssRUFBRTNKLE9BRWhCeUosSUFEQTdCLEVBQVF6RyxLQUFLbUksSUFBSXhDLEVBQU9jLE1BQU0rQixFQUFFekksR0FBSXlJLEVBQUUvSyxPQUNoQmtJLEVBQU9XLElBQUlrQyxFQUFFekksR0FBSXlJLEVBQUV6SSxJQUFNNEYsRUFBT1csSUFBSWtDLEVBQUV6SSxHQUFJeUksRUFBRS9LLElBQU1rSSxFQUFPVyxJQUFJa0MsRUFBRS9LLEdBQUkrSyxFQUFFL0ssS0FDM0Y4SyxHQUFlOUIsRUFHbkIsT0FBUTRCLEVBQU8sR0FBTUMsRUFBWUMsRUFDckMsRUFTQWpCLEVBQVNqQyxVQUFZLFNBQVNiLEVBQVVjLEVBQVF5QixHQUM1Q0EsT0FBMkIsSUFBWEEsRUFBeUJBLEVBQVMsRUFFbEQsSUFHSTlLLEVBSEF3TSxFQUFpQmpFLEVBQVMzRixPQUMxQjZKLEVBQWFwRCxFQUFPWixFQUFJcUMsRUFDeEI0QixFQUFhckQsRUFBT1gsRUFBSW9DLEVBRzVCLElBQUs5SyxFQUFJLEVBQUdBLEVBQUl3TSxFQUFnQnhNLElBQzVCdUksRUFBU3ZJLEdBQUd5SSxHQUFLZ0UsRUFDakJsRSxFQUFTdkksR0FBRzBJLEdBQUtnRSxFQUdyQixPQUFPbkUsQ0FDWCxFQVNBOEMsRUFBU3ZCLE9BQVMsU0FBU3ZCLEVBQVV3QixFQUFPZixHQUN4QyxHQUFjLElBQVZlLEVBQUosQ0FHQSxJQUtJakIsRUFDQTZELEVBQ0FDLEVBQ0E1TSxFQVJBaUssRUFBTWxHLEtBQUtrRyxJQUFJRixHQUNmRyxFQUFNbkcsS0FBS21HLElBQUlILEdBQ2Y4QyxFQUFTN0QsRUFBTVAsRUFDZnFFLEVBQVM5RCxFQUFNTixFQUNmOEQsRUFBaUJqRSxFQUFTM0YsT0FNOUIsSUFBSzVDLEVBQUksRUFBR0EsRUFBSXdNLEVBQWdCeE0sSUFFNUIyTSxHQURBN0QsRUFBU1AsRUFBU3ZJLElBQ055SSxFQUFJb0UsRUFDaEJELEVBQUs5RCxFQUFPSixFQUFJb0UsRUFDaEJoRSxFQUFPTCxFQUFJb0UsR0FBVUYsRUFBSzFDLEVBQU0yQyxFQUFLMUMsR0FDckNwQixFQUFPSixFQUFJb0UsR0FBVUgsRUFBS3pDLEVBQU0wQyxFQUFLM0MsR0FHekMsT0FBTzFCLENBcEJHLENBcUJkLEVBU0E4QyxFQUFTdEMsU0FBVyxTQUFTUixFQUFVUyxHQU9uQyxJQU5BLElBSUkrRCxFQUpBRixFQUFTN0QsRUFBTVAsRUFDZnFFLEVBQVM5RCxFQUFNTixFQUNmOEQsRUFBaUJqRSxFQUFTM0YsT0FDMUJrRyxFQUFTUCxFQUFTaUUsRUFBaUIsR0FHOUJ4TSxFQUFJLEVBQUdBLEVBQUl3TSxFQUFnQnhNLElBQUssQ0FHckMsR0FGQStNLEVBQWF4RSxFQUFTdkksSUFFakI2TSxFQUFTL0QsRUFBT0wsSUFBTXNFLEVBQVdyRSxFQUFJSSxFQUFPSixJQUMxQ29FLEVBQVNoRSxFQUFPSixJQUFNSSxFQUFPTCxFQUFJc0UsRUFBV3RFLEdBQUssRUFDcEQsT0FBTyxFQUdYSyxFQUFTaUUsQ0FDYixDQUVBLE9BQU8sQ0FDWCxFQVVBMUIsRUFBUzJCLE1BQVEsU0FBU3pFLEVBQVUwRSxFQUFRQyxFQUFRbEUsR0FDaEQsR0FBZSxJQUFYaUUsR0FBMkIsSUFBWEMsRUFDaEIsT0FBTzNFLEVBSVgsSUFBSU8sRUFDQXFFLEVBSEpuRSxFQUFRQSxHQUFTcUMsRUFBU1EsT0FBT3RELEdBS2pDLElBQUssSUFBSXZJLEVBQUksRUFBR0EsRUFBSXVJLEVBQVMzRixPQUFRNUMsSUFDakM4SSxFQUFTUCxFQUFTdkksR0FDbEJtTixFQUFRekQsRUFBT2tCLElBQUk5QixFQUFRRSxHQUMzQlQsRUFBU3ZJLEdBQUd5SSxFQUFJTyxFQUFNUCxFQUFJMEUsRUFBTTFFLEVBQUl3RSxFQUNwQzFFLEVBQVN2SSxHQUFHMEksRUFBSU0sRUFBTU4sRUFBSXlFLEVBQU16RSxFQUFJd0UsRUFHeEMsT0FBTzNFLENBQ1gsRUFZQThDLEVBQVMrQixRQUFVLFNBQVM3RSxFQUFVOEUsRUFBUUMsRUFBU0MsRUFBWUMsR0FFM0RILEVBRGtCLGlCQUFYQSxFQUNFLENBQUNBLEdBRURBLEdBQVUsQ0FBQyxHQUl4QkMsT0FBOEIsSUFBWkEsRUFBMkJBLEdBQVcsRUFDeERDLEVBQWFBLEdBQWMsRUFDM0JDLEVBQWFBLEdBQWMsR0FJM0IsSUFGQSxJQUFJQyxFQUFjLEdBRVR6TixFQUFJLEVBQUdBLEVBQUl1SSxFQUFTM0YsT0FBUTVDLElBQUssQ0FDdEMsSUFBSTBOLEVBQWFuRixFQUFTdkksRUFBSSxHQUFLLEVBQUlBLEVBQUksRUFBSXVJLEVBQVMzRixPQUFTLEdBQzdEa0csRUFBU1AsRUFBU3ZJLEdBQ2xCK00sRUFBYXhFLEdBQVV2SSxFQUFJLEdBQUt1SSxFQUFTM0YsUUFDekMrSyxFQUFnQk4sRUFBT3JOLEVBQUlxTixFQUFPekssT0FBUzVDLEVBQUlxTixFQUFPekssT0FBUyxHQUVuRSxHQUFzQixJQUFsQitLLEVBQUosQ0FLQSxJQUFJQyxFQUFhbEUsRUFBT1UsVUFBVSxDQUM5QjNCLEVBQUdLLEVBQU9KLEVBQUlnRixFQUFXaEYsRUFDekJBLEVBQUdnRixFQUFXakYsRUFBSUssRUFBT0wsSUFHekJvRixFQUFhbkUsRUFBT1UsVUFBVSxDQUM5QjNCLEVBQUdzRSxFQUFXckUsRUFBSUksRUFBT0osRUFDekJBLEVBQUdJLEVBQU9MLEVBQUlzRSxFQUFXdEUsSUFHekJxRixFQUFpQi9KLEtBQUs2RixLQUFLLEVBQUk3RixLQUFLZ0ssSUFBSUosRUFBZSxJQUN2REssRUFBZXRFLEVBQU9tQixLQUFLOUksRUFBT2lCLE1BQU00SyxHQUFhRCxHQUNyRE0sRUFBWXZFLEVBQU9VLFVBQVVWLEVBQU9tQixLQUFLbkIsRUFBT2lCLElBQUlpRCxFQUFZQyxHQUFhLEtBQzdFSyxFQUFleEUsRUFBT2tCLElBQUk5QixFQUFRWSxFQUFPbUIsS0FBS29ELEVBQVdILElBRXpESyxFQUFZYixHQUVDLElBQWJBLElBRUFhLEVBQTRDLEtBQWhDcEssS0FBS2dLLElBQUlKLEVBQWUsT0FHeENRLEVBQVlwTSxFQUFPK0MsTUFBTXFKLEVBQVdaLEVBQVlDLElBR2hDLEdBQU0sSUFDbEJXLEdBQWEsR0FLakIsSUFIQSxJQUNJQyxFQURRckssS0FBS3NLLEtBQUszRSxFQUFPVyxJQUFJdUQsRUFBWUMsSUFDekJNLEVBRVhySyxFQUFJLEVBQUdBLEVBQUlxSyxFQUFXckssSUFDM0IySixFQUFZdkssS0FBS3dHLEVBQU9pQixJQUFJakIsRUFBT0ksT0FBT2tFLEVBQWNJLEVBQVF0SyxHQUFJb0ssR0FsQ3hFLE1BRklULEVBQVl2SyxLQUFLNEYsRUFzQ3pCLENBRUEsT0FBTzJFLENBQ1gsRUFRQXBDLEVBQVNpRCxjQUFnQixTQUFTL0YsR0FDOUIsSUFBSXNELEVBQVNSLEVBQVNVLEtBQUt4RCxHQU0zQixPQUpBQSxFQUFTZ0csTUFBSyxTQUFTQyxFQUFTQyxHQUM1QixPQUFPL0UsRUFBT0ssTUFBTThCLEVBQVEyQyxHQUFXOUUsRUFBT0ssTUFBTThCLEVBQVE0QyxFQUNoRSxJQUVPbEcsQ0FDWCxFQVFBOEMsRUFBU3FELFNBQVcsU0FBU25HLEdBSXpCLElBRUl2SSxFQUNBOEQsRUFDQTZLLEVBQ0FDLEVBTEFDLEVBQU8sRUFDUHJOLEVBQUkrRyxFQUFTM0YsT0FNakIsR0FBSXBCLEVBQUksRUFDSixPQUFPLEtBRVgsSUFBS3hCLEVBQUksRUFBR0EsRUFBSXdCLEVBQUd4QixJQVlmLEdBVkEyTyxHQUFLM08sRUFBSSxHQUFLd0IsRUFDZG9OLEdBQUtyRyxFQUZMekUsR0FBSzlELEVBQUksR0FBS3dCLEdBRUdpSCxFQUFJRixFQUFTdkksR0FBR3lJLElBQU1GLEVBQVNvRyxHQUFHakcsRUFBSUgsRUFBU3pFLEdBQUc0RSxJQUNuRWtHLElBQU1yRyxFQUFTekUsR0FBRzRFLEVBQUlILEVBQVN2SSxHQUFHMEksSUFBTUgsRUFBU29HLEdBQUdsRyxFQUFJRixFQUFTekUsR0FBRzJFLElBRTVELEVBQ0pvRyxHQUFRLEVBQ0RELEVBQUksSUFDWEMsR0FBUSxHQUdDLElBQVRBLEVBQ0EsT0FBTyxFQUlmLE9BQWEsSUFBVEEsR0FHTyxJQUVmLEVBUUF4RCxFQUFTeUQsS0FBTyxTQUFTdkcsR0FHckIsSUFFSU8sRUFDQTlJLEVBSEErTyxFQUFRLEdBQ1JDLEVBQVEsR0FZWixLQVBBekcsRUFBV0EsRUFBUy9FLE1BQU0sSUFDakIrSyxNQUFLLFNBQVNDLEVBQVNDLEdBQzVCLElBQUk5QixFQUFLNkIsRUFBUS9GLEVBQUlnRyxFQUFRaEcsRUFDN0IsT0FBYyxJQUFQa0UsRUFBV0EsRUFBSzZCLEVBQVE5RixFQUFJK0YsRUFBUS9GLENBQy9DLElBR0sxSSxFQUFJLEVBQUdBLEVBQUl1SSxFQUFTM0YsT0FBUTVDLEdBQUssRUFBRyxDQUdyQyxJQUZBOEksRUFBU1AsRUFBU3ZJLEdBRVhnUCxFQUFNcE0sUUFBVSxHQUNiOEcsRUFBT2UsT0FBT3VFLEVBQU1BLEVBQU1wTSxPQUFTLEdBQUlvTSxFQUFNQSxFQUFNcE0sT0FBUyxHQUFJa0csSUFBVyxHQUNqRmtHLEVBQU1DLE1BR1ZELEVBQU05TCxLQUFLNEYsRUFDZixDQUdBLElBQUs5SSxFQUFJdUksRUFBUzNGLE9BQVMsRUFBRzVDLEdBQUssRUFBR0EsR0FBSyxFQUFHLENBRzFDLElBRkE4SSxFQUFTUCxFQUFTdkksR0FFWCtPLEVBQU1uTSxRQUFVLEdBQ2I4RyxFQUFPZSxPQUFPc0UsRUFBTUEsRUFBTW5NLE9BQVMsR0FBSW1NLEVBQU1BLEVBQU1uTSxPQUFTLEdBQUlrRyxJQUFXLEdBQ2pGaUcsRUFBTUUsTUFHVkYsRUFBTTdMLEtBQUs0RixFQUNmLENBT0EsT0FIQWlHLEVBQU1FLE1BQ05ELEVBQU1DLE1BRUNGLEVBQU0vSSxPQUFPZ0osRUFDeEIsQ0FLRyxFQUVELFNBQVV2UCxFQUFRRCxFQUFTLEdBVWpDLElBQUkwUCxFQUFTLENBQUMsRUFFZHpQLEVBQU9ELFFBQVUwUCxFQUVqQixJQUFJbk4sRUFBUyxFQUFvQixHQVc3Qm1OLEVBQU9DLEdBQUssU0FBUzFOLEVBQVEyTixFQUFZQyxHQUlyQyxJQUhBLElBQ0kvTyxFQURBZ1AsRUFBUUYsRUFBVzdMLE1BQU0sS0FHcEJ2RCxFQUFJLEVBQUdBLEVBQUlzUCxFQUFNMU0sT0FBUTVDLElBQzlCTSxFQUFPZ1AsRUFBTXRQLEdBQ2J5QixFQUFPOE4sT0FBUzlOLEVBQU84TixRQUFVLENBQUMsRUFDbEM5TixFQUFPOE4sT0FBT2pQLEdBQVFtQixFQUFPOE4sT0FBT2pQLElBQVMsR0FDN0NtQixFQUFPOE4sT0FBT2pQLEdBQU00QyxLQUFLbU0sR0FHN0IsT0FBT0EsQ0FDWCxFQVNBSCxFQUFPTSxJQUFNLFNBQVMvTixFQUFRMk4sRUFBWUMsR0FDdEMsR0FBS0QsRUFBTCxDQU0wQixtQkFBZkEsSUFDUEMsRUFBV0QsRUFDWEEsRUFBYXJOLEVBQU9rQixLQUFLeEIsRUFBTzhOLFFBQVFqSixLQUFLLE1BS2pELElBRkEsSUFBSWdKLEVBQVFGLEVBQVc3TCxNQUFNLEtBRXBCdkQsRUFBSSxFQUFHQSxFQUFJc1AsRUFBTTFNLE9BQVE1QyxJQUFLLENBQ25DLElBQUl5UCxFQUFZaE8sRUFBTzhOLE9BQU9ELEVBQU10UCxJQUNoQzBQLEVBQWUsR0FFbkIsR0FBSUwsR0FBWUksRUFDWixJQUFLLElBQUkzTCxFQUFJLEVBQUdBLEVBQUkyTCxFQUFVN00sT0FBUWtCLElBQzlCMkwsRUFBVTNMLEtBQU91TCxHQUNqQkssRUFBYXhNLEtBQUt1TSxFQUFVM0wsSUFJeENyQyxFQUFPOE4sT0FBT0QsRUFBTXRQLElBQU0wUCxDQUM5QixDQXRCQSxNQUZJak8sRUFBTzhOLE9BQVMsQ0FBQyxDQXlCekIsRUFTQUwsRUFBT1MsUUFBVSxTQUFTbE8sRUFBUTJOLEVBQVlRLEdBQzFDLElBQUlOLEVBQ0FoUCxFQUNBbVAsRUFDQUksRUFFQU4sRUFBUzlOLEVBQU84TixPQUVwQixHQUFJQSxHQUFVeE4sRUFBT2tCLEtBQUtzTSxHQUFRM00sT0FBUyxFQUFHLENBQ3JDZ04sSUFDREEsRUFBUSxDQUFDLEdBRWJOLEVBQVFGLEVBQVc3TCxNQUFNLEtBRXpCLElBQUssSUFBSXZELEVBQUksRUFBR0EsRUFBSXNQLEVBQU0xTSxPQUFRNUMsSUFJOUIsR0FGQXlQLEVBQVlGLEVBRFpqUCxFQUFPZ1AsRUFBTXRQLElBR0UsRUFDWDZQLEVBQWE5TixFQUFPaUIsTUFBTTRNLEdBQU8sSUFDdEJ0UCxLQUFPQSxFQUNsQnVQLEVBQVdoTixPQUFTcEIsRUFFcEIsSUFBSyxJQUFJcUMsRUFBSSxFQUFHQSxFQUFJMkwsRUFBVTdNLE9BQVFrQixJQUNsQzJMLEVBQVUzTCxHQUFHaUMsTUFBTXRFLEVBQVEsQ0FBQ29PLEdBRXBDLENBRVIsQ0FDSixDQUtHLEVBRUQsU0FBVXBRLEVBQVFELEVBQVMsR0FlakMsSUFBSXNRLEVBQVksQ0FBQyxFQUVqQnJRLEVBQU9ELFFBQVVzUSxFQUVqQixJQUFJWixFQUFTLEVBQW9CLEdBQzdCbk4sRUFBUyxFQUFvQixHQUM3QnVHLEVBQVMsRUFBb0IsR0FDN0J5SCxFQUFPLEVBQW9CLEdBVzNCRCxFQUFVek8sT0FBUyxTQUFTMk8sR0FDeEIsT0FBT2pPLEVBQU9PLE9BQU8sQ0FDakIyTixHQUFJbE8sRUFBTzJFLFNBQ1h3SixLQUFNLFlBQ05DLE9BQVEsS0FDUkMsWUFBWSxFQUNaQyxPQUFRLEdBQ1JDLFlBQWEsR0FDYkMsV0FBWSxHQUNaQyxNQUFPLFlBQ1BDLE9BQVEsQ0FBQyxFQUNUQyxNQUFPLENBQ0hDLFVBQVcsS0FDWEMsZUFBZ0IsS0FDaEJDLGNBQWUsT0FFcEJiLEVBQ1AsRUFhQUYsRUFBVWdCLFlBQWMsU0FBU0MsRUFBV1gsRUFBWVksRUFBZUMsR0FhbkUsR0FaQUYsRUFBVVgsV0FBYUEsRUFFbkJBLEdBQWNXLEVBQVVMLFFBQ3hCSyxFQUFVTCxNQUFNQyxVQUFZLEtBQzVCSSxFQUFVTCxNQUFNRSxlQUFpQixLQUNqQ0csRUFBVUwsTUFBTUcsY0FBZ0IsTUFHaENHLEdBQWlCRCxFQUFVWixRQUMzQkwsRUFBVWdCLFlBQVlDLEVBQVVaLE9BQVFDLEVBQVlZLEVBQWVDLEdBR25FQSxFQUNBLElBQUssSUFBSWpSLEVBQUksRUFBR0EsRUFBSStRLEVBQVVSLFdBQVczTixPQUFRNUMsSUFBSyxDQUNsRCxJQUFJa1IsRUFBaUJILEVBQVVSLFdBQVd2USxHQUMxQzhQLEVBQVVnQixZQUFZSSxFQUFnQmQsRUFBWVksRUFBZUMsRUFDckUsQ0FFUixFQVVBbkIsRUFBVW5GLElBQU0sU0FBU29HLEVBQVd0UCxHQUNoQyxJQUFJMFAsRUFBVSxHQUFHbkwsT0FBT3ZFLEdBRXhCeU4sRUFBT1MsUUFBUW9CLEVBQVcsWUFBYSxDQUFFdFAsT0FBUUEsSUFFakQsSUFBSyxJQUFJekIsRUFBSSxFQUFHQSxFQUFJbVIsRUFBUXZPLE9BQVE1QyxJQUFLLENBQ3JDLElBQUl1QyxFQUFNNE8sRUFBUW5SLEdBRWxCLE9BQVF1QyxFQUFJMk4sTUFFWixJQUFLLE9BRUQsR0FBSTNOLEVBQUk0TixTQUFXNU4sRUFBSyxDQUNwQlIsRUFBT29FLEtBQUssd0ZBQ1osS0FDSixDQUVBMkosRUFBVXNCLFFBQVFMLEVBQVd4TyxHQUM3QixNQUNKLElBQUssYUFDRHVOLEVBQVV1QixjQUFjTixFQUFXeE8sR0FDbkMsTUFDSixJQUFLLFlBQ0R1TixFQUFVd0IsYUFBYVAsRUFBV3hPLEdBQ2xDLE1BQ0osSUFBSyxrQkFDRHVOLEVBQVV1QixjQUFjTixFQUFXeE8sRUFBSWdQLFlBSS9DLENBSUEsT0FGQXJDLEVBQU9TLFFBQVFvQixFQUFXLFdBQVksQ0FBRXRQLE9BQVFBLElBRXpDc1AsQ0FDWCxFQVlBakIsRUFBVTBCLE9BQVMsU0FBU1QsRUFBV3RQLEVBQVFlLEdBQzNDLElBQUkyTyxFQUFVLEdBQUduTCxPQUFPdkUsR0FFeEJ5TixFQUFPUyxRQUFRb0IsRUFBVyxlQUFnQixDQUFFdFAsT0FBUUEsSUFFcEQsSUFBSyxJQUFJekIsRUFBSSxFQUFHQSxFQUFJbVIsRUFBUXZPLE9BQVE1QyxJQUFLLENBQ3JDLElBQUl1QyxFQUFNNE8sRUFBUW5SLEdBRWxCLE9BQVF1QyxFQUFJMk4sTUFFWixJQUFLLE9BQ0RKLEVBQVUyQixXQUFXVixFQUFXeE8sRUFBS0MsR0FDckMsTUFDSixJQUFLLGFBQ0RzTixFQUFVNEIsaUJBQWlCWCxFQUFXeE8sRUFBS0MsR0FDM0MsTUFDSixJQUFLLFlBQ0RzTixFQUFVNkIsZ0JBQWdCWixFQUFXeE8sRUFBS0MsR0FDMUMsTUFDSixJQUFLLGtCQUNEc04sRUFBVTRCLGlCQUFpQlgsRUFBV3hPLEVBQUlnUCxZQUlsRCxDQUlBLE9BRkFyQyxFQUFPUyxRQUFRb0IsRUFBVyxjQUFlLENBQUV0UCxPQUFRQSxJQUU1Q3NQLENBQ1gsRUFVQWpCLEVBQVV3QixhQUFlLFNBQVNNLEVBQVlDLEdBSTFDLE9BSEFELEVBQVdyQixXQUFXck4sS0FBSzJPLEdBQzNCQSxFQUFXMUIsT0FBU3lCLEVBQ3BCOUIsRUFBVWdCLFlBQVljLEdBQVksR0FBTSxHQUFNLEdBQ3ZDQSxDQUNYLEVBV0E5QixFQUFVNkIsZ0JBQWtCLFNBQVNDLEVBQVlDLEVBQVlyUCxHQUN6RCxJQUFJK0csRUFBV3hILEVBQU80RSxRQUFRaUwsRUFBV3JCLFdBQVlzQixHQUtyRCxJQUprQixJQUFkdEksR0FDQXVHLEVBQVVnQyxrQkFBa0JGLEVBQVlySSxHQUd4Qy9HLEVBQ0EsSUFBSyxJQUFJeEMsRUFBSSxFQUFHQSxFQUFJNFIsRUFBV3JCLFdBQVczTixPQUFRNUMsSUFDOUM4UCxFQUFVNkIsZ0JBQWdCQyxFQUFXckIsV0FBV3ZRLEdBQUk2UixHQUFZLEdBSXhFLE9BQU9ELENBQ1gsRUFVQTlCLEVBQVVnQyxrQkFBb0IsU0FBU2YsRUFBV3hILEdBRzlDLE9BRkF3SCxFQUFVUixXQUFXd0IsT0FBT3hJLEVBQVUsR0FDdEN1RyxFQUFVZ0IsWUFBWUMsR0FBVyxHQUFNLEdBQU0sR0FDdENBLENBQ1gsRUFVQWpCLEVBQVVzQixRQUFVLFNBQVNMLEVBQVd4RixHQUdwQyxPQUZBd0YsRUFBVVYsT0FBT25OLEtBQUtxSSxHQUN0QnVFLEVBQVVnQixZQUFZQyxHQUFXLEdBQU0sR0FBTSxHQUN0Q0EsQ0FDWCxFQVdBakIsRUFBVTJCLFdBQWEsU0FBU1YsRUFBV3hGLEVBQU0vSSxHQUM3QyxJQUFJK0csRUFBV3hILEVBQU80RSxRQUFRb0ssRUFBVVYsT0FBUTlFLEdBS2hELElBSmtCLElBQWRoQyxHQUNBdUcsRUFBVWtDLGFBQWFqQixFQUFXeEgsR0FHbEMvRyxFQUNBLElBQUssSUFBSXhDLEVBQUksRUFBR0EsRUFBSStRLEVBQVVSLFdBQVczTixPQUFRNUMsSUFDN0M4UCxFQUFVMkIsV0FBV1YsRUFBVVIsV0FBV3ZRLEdBQUl1TCxHQUFNLEdBSTVELE9BQU93RixDQUNYLEVBVUFqQixFQUFVa0MsYUFBZSxTQUFTakIsRUFBV3hILEdBR3pDLE9BRkF3SCxFQUFVVixPQUFPMEIsT0FBT3hJLEVBQVUsR0FDbEN1RyxFQUFVZ0IsWUFBWUMsR0FBVyxHQUFNLEdBQU0sR0FDdENBLENBQ1gsRUFVQWpCLEVBQVV1QixjQUFnQixTQUFTTixFQUFXUSxHQUcxQyxPQUZBUixFQUFVVCxZQUFZcE4sS0FBS3FPLEdBQzNCekIsRUFBVWdCLFlBQVlDLEdBQVcsR0FBTSxHQUFNLEdBQ3RDQSxDQUNYLEVBV0FqQixFQUFVNEIsaUJBQW1CLFNBQVNYLEVBQVdRLEVBQVkvTyxHQUN6RCxJQUFJK0csRUFBV3hILEVBQU80RSxRQUFRb0ssRUFBVVQsWUFBYWlCLEdBS3JELElBSmtCLElBQWRoSSxHQUNBdUcsRUFBVW1DLG1CQUFtQmxCLEVBQVd4SCxHQUd4Qy9HLEVBQ0EsSUFBSyxJQUFJeEMsRUFBSSxFQUFHQSxFQUFJK1EsRUFBVVIsV0FBVzNOLE9BQVE1QyxJQUM3QzhQLEVBQVU0QixpQkFBaUJYLEVBQVVSLFdBQVd2USxHQUFJdVIsR0FBWSxHQUl4RSxPQUFPUixDQUNYLEVBVUFqQixFQUFVbUMsbUJBQXFCLFNBQVNsQixFQUFXeEgsR0FHL0MsT0FGQXdILEVBQVVULFlBQVl5QixPQUFPeEksRUFBVSxHQUN2Q3VHLEVBQVVnQixZQUFZQyxHQUFXLEdBQU0sR0FBTSxHQUN0Q0EsQ0FDWCxFQVVBakIsRUFBVW9DLE1BQVEsU0FBU25CLEVBQVdvQixFQUFZM1AsR0FDOUMsR0FBSUEsRUFDQSxJQUFLLElBQUl4QyxFQUFJLEVBQUdBLEVBQUkrUSxFQUFVUixXQUFXM04sT0FBUTVDLElBQzdDOFAsRUFBVW9DLE1BQU1uQixFQUFVUixXQUFXdlEsR0FBSW1TLEdBQVksR0FlN0QsT0FYSUEsRUFDQXBCLEVBQVVWLE9BQVNVLEVBQVVWLE9BQU8rQixRQUFPLFNBQVM3RyxHQUFRLE9BQU9BLEVBQUs4RyxRQUFVLElBRWxGdEIsRUFBVVYsT0FBT3pOLE9BQVMsRUFHOUJtTyxFQUFVVCxZQUFZMU4sT0FBUyxFQUMvQm1PLEVBQVVSLFdBQVczTixPQUFTLEVBRTlCa04sRUFBVWdCLFlBQVlDLEdBQVcsR0FBTSxHQUFNLEdBRXRDQSxDQUNYLEVBUUFqQixFQUFVYSxVQUFZLFNBQVNJLEdBQzNCLEdBQUlBLEVBQVVMLE9BQVNLLEVBQVVMLE1BQU1DLFVBQ25DLE9BQU9JLEVBQVVMLE1BQU1DLFVBSzNCLElBRkEsSUFBSU4sRUFBUyxHQUFHckssT0FBTytLLEVBQVVWLFFBRXhCclEsRUFBSSxFQUFHQSxFQUFJK1EsRUFBVVIsV0FBVzNOLE9BQVE1QyxJQUM3Q3FRLEVBQVNBLEVBQU9ySyxPQUFPOEosRUFBVWEsVUFBVUksRUFBVVIsV0FBV3ZRLEtBTXBFLE9BSkkrUSxFQUFVTCxRQUNWSyxFQUFVTCxNQUFNQyxVQUFZTixHQUd6QkEsQ0FDWCxFQVFBUCxFQUFVYyxlQUFpQixTQUFTRyxHQUNoQyxHQUFJQSxFQUFVTCxPQUFTSyxFQUFVTCxNQUFNRSxlQUNuQyxPQUFPRyxFQUFVTCxNQUFNRSxlQUszQixJQUZBLElBQUlOLEVBQWMsR0FBR3RLLE9BQU8rSyxFQUFVVCxhQUU3QnRRLEVBQUksRUFBR0EsRUFBSStRLEVBQVVSLFdBQVczTixPQUFRNUMsSUFDN0NzUSxFQUFjQSxFQUFZdEssT0FBTzhKLEVBQVVjLGVBQWVHLEVBQVVSLFdBQVd2USxLQU1uRixPQUpJK1EsRUFBVUwsUUFDVkssRUFBVUwsTUFBTUUsZUFBaUJOLEdBRzlCQSxDQUNYLEVBUUFSLEVBQVVlLGNBQWdCLFNBQVNFLEdBQy9CLEdBQUlBLEVBQVVMLE9BQVNLLEVBQVVMLE1BQU1HLGNBQ25DLE9BQU9FLEVBQVVMLE1BQU1HLGNBSzNCLElBRkEsSUFBSU4sRUFBYSxHQUFHdkssT0FBTytLLEVBQVVSLFlBRTVCdlEsRUFBSSxFQUFHQSxFQUFJK1EsRUFBVVIsV0FBVzNOLE9BQVE1QyxJQUM3Q3VRLEVBQWFBLEVBQVd2SyxPQUFPOEosRUFBVWUsY0FBY0UsRUFBVVIsV0FBV3ZRLEtBTWhGLE9BSkkrUSxFQUFVTCxRQUNWSyxFQUFVTCxNQUFNRyxjQUFnQk4sR0FHN0JBLENBQ1gsRUFVQVQsRUFBVWxQLElBQU0sU0FBU21RLEVBQVdkLEVBQUlDLEdBQ3BDLElBQUlpQixFQUNBMVAsRUFFSixPQUFReU8sR0FDUixJQUFLLE9BQ0RpQixFQUFVckIsRUFBVWEsVUFBVUksR0FDOUIsTUFDSixJQUFLLGFBQ0RJLEVBQVVyQixFQUFVYyxlQUFlRyxHQUNuQyxNQUNKLElBQUssWUFDREksRUFBVXJCLEVBQVVlLGNBQWNFLEdBQVcvSyxPQUFPK0ssR0FJeEQsT0FBS0ksRUFPb0IsS0FKekIxUCxFQUFTMFAsRUFBUWlCLFFBQU8sU0FBUzNRLEdBQzdCLE9BQU9BLEVBQU93TyxHQUFHdkwsYUFBZXVMLEVBQUd2TCxVQUN2QyxLQUVjOUIsT0FBZSxLQUFPbkIsRUFBTyxHQU5oQyxJQU9mLEVBVUFxTyxFQUFVd0MsS0FBTyxTQUFTVixFQUFZVCxFQUFTVSxHQUczQyxPQUZBL0IsRUFBVTBCLE9BQU9JLEVBQVlULEdBQzdCckIsRUFBVW5GLElBQUlrSCxFQUFZVixHQUNuQlMsQ0FDWCxFQVFBOUIsRUFBVXlDLE9BQVMsU0FBU3hCLEdBS3hCLElBSkEsSUFBSUksRUFBVXJCLEVBQVVhLFVBQVVJLEdBQzdCL0ssT0FBTzhKLEVBQVVjLGVBQWVHLElBQ2hDL0ssT0FBTzhKLEVBQVVlLGNBQWNFLElBRTNCL1EsRUFBSSxFQUFHQSxFQUFJbVIsRUFBUXZPLE9BQVE1QyxJQUNoQ21SLEVBQVFuUixHQUFHaVEsR0FBS2xPLEVBQU8yRSxTQUczQixPQUFPcUssQ0FDWCxFQVVBakIsRUFBVTFHLFVBQVksU0FBUzJILEVBQVd5QixFQUFhQyxHQUduRCxJQUZBLElBQUlwQyxFQUFTb0MsRUFBWTNDLEVBQVVhLFVBQVVJLEdBQWFBLEVBQVVWLE9BRTNEclEsRUFBSSxFQUFHQSxFQUFJcVEsRUFBT3pOLE9BQVE1QyxJQUMvQitQLEVBQUszRyxVQUFVaUgsRUFBT3JRLEdBQUl3UyxHQUc5QixPQUFPekIsQ0FDWCxFQVVBakIsRUFBVWhHLE9BQVMsU0FBU2lILEVBQVcyQixFQUFVMUosRUFBT3lKLEdBS3BELElBSkEsSUFBSXhJLEVBQU1sRyxLQUFLa0csSUFBSXlJLEdBQ2Z4SSxFQUFNbkcsS0FBS21HLElBQUl3SSxHQUNmckMsRUFBU29DLEVBQVkzQyxFQUFVYSxVQUFVSSxHQUFhQSxFQUFVVixPQUUzRHJRLEVBQUksRUFBR0EsRUFBSXFRLEVBQU96TixPQUFRNUMsSUFBSyxDQUNwQyxJQUFJdUwsRUFBTzhFLEVBQU9yUSxHQUNkMk0sRUFBS3BCLEVBQUtoQyxTQUFTZCxFQUFJTyxFQUFNUCxFQUM3Qm1FLEVBQUtyQixFQUFLaEMsU0FBU2IsRUFBSU0sRUFBTU4sRUFFakNxSCxFQUFLNEMsWUFBWXBILEVBQU0sQ0FDbkI5QyxFQUFHTyxFQUFNUCxHQUFLa0UsRUFBSzFDLEVBQU0yQyxFQUFLMUMsR0FDOUJ4QixFQUFHTSxFQUFNTixHQUFLaUUsRUFBS3pDLEVBQU0wQyxFQUFLM0MsS0FHbEM4RixFQUFLakcsT0FBT3lCLEVBQU1tSCxFQUN0QixDQUVBLE9BQU8zQixDQUNYLEVBV0FqQixFQUFVOUMsTUFBUSxTQUFTK0QsRUFBVzlELEVBQVFDLEVBQVFsRSxFQUFPeUosR0FHekQsSUFGQSxJQUFJcEMsRUFBU29DLEVBQVkzQyxFQUFVYSxVQUFVSSxHQUFhQSxFQUFVVixPQUUzRHJRLEVBQUksRUFBR0EsRUFBSXFRLEVBQU96TixPQUFRNUMsSUFBSyxDQUNwQyxJQUFJdUwsRUFBTzhFLEVBQU9yUSxHQUNkMk0sRUFBS3BCLEVBQUtoQyxTQUFTZCxFQUFJTyxFQUFNUCxFQUM3Qm1FLEVBQUtyQixFQUFLaEMsU0FBU2IsRUFBSU0sRUFBTU4sRUFFakNxSCxFQUFLNEMsWUFBWXBILEVBQU0sQ0FDbkI5QyxFQUFHTyxFQUFNUCxFQUFJa0UsRUFBS00sRUFDbEJ2RSxFQUFHTSxFQUFNTixFQUFJa0UsRUFBS00sSUFHdEI2QyxFQUFLL0MsTUFBTXpCLEVBQU0wQixFQUFRQyxFQUM3QixDQUVBLE9BQU82RCxDQUNYLEVBUUFqQixFQUFVdEgsT0FBUyxTQUFTdUksR0FJeEIsSUFIQSxJQUFJVixFQUFTUCxFQUFVYSxVQUFVSSxHQUM3QnhJLEVBQVcsR0FFTnZJLEVBQUksRUFBR0EsRUFBSXFRLEVBQU96TixPQUFRNUMsR0FBSyxFQUFHLENBQ3ZDLElBQUl1TCxFQUFPOEUsRUFBT3JRLEdBQ2xCdUksRUFBU3JGLEtBQUtxSSxFQUFLL0MsT0FBT3pELElBQUt3RyxFQUFLL0MsT0FBT3hELElBQy9DLENBRUEsT0FBT3NELEVBQU9qSCxPQUFPa0gsRUFDekIsQ0FnSkcsRUFFRCxTQUFVOUksRUFBUUQsRUFBUyxHQVlqQyxJQUFJdVEsRUFBTyxDQUFDLEVBRVp0USxFQUFPRCxRQUFVdVEsRUFFakIsSUFBSTFFLEVBQVcsRUFBb0IsR0FDL0IzQixFQUFTLEVBQW9CLEdBQzdCa0osRUFBVyxFQUFvQixHQUUvQjdRLEdBRFMsRUFBb0IsSUFDcEIsRUFBb0IsSUFDN0J1RyxFQUFTLEVBQW9CLEdBQzdCdUssRUFBTyxFQUFvQixLQUUvQixXQUVJOUMsRUFBSytDLGNBQWdCLEVBQ3JCL0MsRUFBS2dELHNCQUF3QixFQUM3QmhELEVBQUtpRCwwQkFBNEIsRUFDakNqRCxFQUFLa0QsY0FBZ0IsRUFXckJsRCxFQUFLMU8sT0FBUyxTQUFTMk8sR0FDbkIsSUFBSWtELEVBQVcsQ0FDWGpELEdBQUlsTyxFQUFPMkUsU0FDWHdKLEtBQU0sT0FDTk0sTUFBTyxPQUNQN00sTUFBTyxHQUNQOE0sT0FBUSxDQUFDLEVBQ1QxRyxNQUFPLEVBQ1B4QixTQUFVOEMsRUFBU0ssU0FBUywrQkFDNUJuQyxTQUFVLENBQUVkLEVBQUcsRUFBR0MsRUFBRyxHQUNyQnlLLE1BQU8sQ0FBRTFLLEVBQUcsRUFBR0MsRUFBRyxHQUNsQjBLLE9BQVEsRUFDUkMsZ0JBQWlCLENBQUU1SyxFQUFHLEVBQUdDLEVBQUcsR0FDNUI0SyxrQkFBbUIsQ0FBRTdLLEVBQUcsRUFBR0MsRUFBRyxFQUFHcUIsTUFBTyxHQUN4Q3dKLGNBQWUsRUFDZkMsTUFBTyxFQUNQQyxhQUFjLEVBQ2Q3SyxTQUFVLENBQUVILEVBQUcsRUFBR0MsRUFBRyxHQUNyQmdMLGdCQUFpQixFQUNqQkMsVUFBVSxFQUNWdEIsVUFBVSxFQUNWdUIsWUFBWSxFQUNaQyxPQUFRLEVBQ1JDLGVBQWdCLEdBQ2hCQyxRQUFTLEtBQ1RDLFlBQWEsRUFDYkMsU0FBVSxHQUNWQyxlQUFnQixHQUNoQkMsWUFBYSxJQUNiQyxnQkFBaUIsQ0FDYkMsU0FBVSxFQUNWQyxLQUFNLFdBQ05DLE1BQU8sR0FFWEMsS0FBTSxJQUNOQyxVQUFXLEVBQ1hDLE9BQVEsQ0FDSkMsU0FBUyxFQUNUQyxRQUFTLEVBQ1RDLFlBQWEsS0FDYkMsVUFBVyxLQUNYQyxVQUFXLEtBQ1hDLE9BQVEsQ0FDSkMsT0FBUSxFQUNSQyxPQUFRLEVBQ1JDLFFBQVMsRUFDVEMsUUFBUyxJQUdqQjdGLE9BQVEsS0FDUi9HLE9BQVEsS0FDUjRFLFFBQVMsS0FDVGlJLGFBQWMsRUFDZEMsYUFBYyxLQUNkQyxVQUFXLEVBQ1hwRixPQUFRLEtBQ1JxRixLQUFNLEtBQ04xSixLQUFNLEVBQ05NLEtBQU0sRUFDTkQsUUFBUyxFQUNUc0osVUFBVyxNQUdYbEssRUFBT3hKLEVBQU9PLE9BQU80USxFQUFVbEQsR0FJbkMsT0FGQTBGLEVBQWdCbkssRUFBTXlFLEdBRWZ6RSxDQUNYLEVBVUF3RSxFQUFLNEYsVUFBWSxTQUFTQyxHQUN0QixPQUFJQSxFQUNPN0YsRUFBS2lELDJCQUVUakQsRUFBS2dELHVCQUNoQixFQVFBaEQsRUFBSzhGLGFBQWUsV0FFaEIsT0FEQTlGLEVBQUtrRCxjQUFnQmxELEVBQUtrRCxlQUFpQixFQUNwQ2xELEVBQUtrRCxhQUNoQixFQVNBLElBQUl5QyxFQUFrQixTQUFTbkssRUFBTXlFLEdBQ2pDQSxFQUFVQSxHQUFXLENBQUMsRUFHdEJELEVBQUt0TSxJQUFJOEgsRUFBTSxDQUNYL0MsT0FBUStDLEVBQUsvQyxRQUFVRixFQUFPakgsT0FBT2tLLEVBQUtoRCxVQUMxQytNLGFBQWMvSixFQUFLK0osY0FBZ0I1TCxFQUFPMUcsTUFBTXVJLEVBQUtoQyxVQUNyRGdNLFVBQVdoSyxFQUFLZ0ssV0FBYWhLLEVBQUt4QixNQUNsQ3hCLFNBQVVnRCxFQUFLaEQsU0FDZjVFLE1BQU80SCxFQUFLNUgsT0FBUyxDQUFDNEgsR0FDdEI4RyxTQUFVOUcsRUFBSzhHLFNBQ2Z1QixXQUFZckksRUFBS3FJLFdBQ2pCekQsT0FBUTVFLEVBQUs0RSxRQUFVNUUsSUFHM0JGLEVBQVN2QixPQUFPeUIsRUFBS2hELFNBQVVnRCxFQUFLeEIsTUFBT3dCLEVBQUtoQyxVQUNoRHNKLEVBQUsvSSxPQUFPeUIsRUFBS2lLLEtBQU1qSyxFQUFLeEIsT0FDNUJ6QixFQUFPSyxPQUFPNEMsRUFBSy9DLE9BQVErQyxFQUFLaEQsU0FBVWdELEVBQUszQyxVQUcvQ21ILEVBQUt0TSxJQUFJOEgsRUFBTSxDQUNYaUssS0FBTXhGLEVBQVF3RixNQUFRakssRUFBS2lLLEtBQzNCMUosS0FBTWtFLEVBQVFsRSxNQUFRUCxFQUFLTyxLQUMzQk0sS0FBTTRELEVBQVE1RCxNQUFRYixFQUFLYSxLQUMzQkQsUUFBUzZELEVBQVE3RCxTQUFXWixFQUFLWSxVQUlyQyxJQUFJMkosRUFBb0J2SyxFQUFLOEcsU0FBVyxVQUFZdFEsRUFBT29DLE9BQU8sQ0FBQyxVQUFXLFVBQVcsVUFBVyxVQUFXLFlBQzNHNFIsRUFBcUJ4SyxFQUFLOEcsU0FBVyxPQUFTLE9BQzlDMkQsRUFBbUJ6SyxFQUFLOEcsVUFBc0MsT0FBMUI5RyxFQUFLbUosT0FBT0ksVUFBcUIsRUFBSSxFQUM3RXZKLEVBQUttSixPQUFPSSxVQUFZdkosRUFBS21KLE9BQU9JLFdBQWFnQixFQUNqRHZLLEVBQUttSixPQUFPRyxZQUFjdEosRUFBS21KLE9BQU9HLGFBQWVrQixFQUNyRHhLLEVBQUttSixPQUFPSyxVQUFZeEosRUFBS21KLE9BQU9LLFdBQWFpQixFQUNqRHpLLEVBQUttSixPQUFPTSxPQUFPRyxXQUFhNUosRUFBSy9DLE9BQU96RCxJQUFJMEQsRUFBSThDLEVBQUtoQyxTQUFTZCxJQUFNOEMsRUFBSy9DLE9BQU94RCxJQUFJeUQsRUFBSThDLEVBQUsvQyxPQUFPekQsSUFBSTBELEdBQzVHOEMsRUFBS21KLE9BQU9NLE9BQU9JLFdBQWE3SixFQUFLL0MsT0FBT3pELElBQUkyRCxFQUFJNkMsRUFBS2hDLFNBQVNiLElBQU02QyxFQUFLL0MsT0FBT3hELElBQUkwRCxFQUFJNkMsRUFBSy9DLE9BQU96RCxJQUFJMkQsRUFDaEgsRUFVQXFILEVBQUt0TSxJQUFNLFNBQVM4SCxFQUFNMEssRUFBVWpWLEdBQ2hDLElBQUlVLEVBUUosSUFBS0EsSUFObUIsaUJBQWJ1VSxJQUNQdlUsRUFBV3VVLEdBQ1hBLEVBQVcsQ0FBQyxHQUNIdlUsR0FBWVYsR0FHUmlWLEVBQ2IsR0FBS3hWLE9BQU9rQixVQUFVQyxlQUFlMUIsS0FBSytWLEVBQVV2VSxHQUlwRCxPQURBVixFQUFRaVYsRUFBU3ZVLEdBQ1RBLEdBRVIsSUFBSyxXQUNEcU8sRUFBS21HLFVBQVUzSyxFQUFNdkssR0FDckIsTUFDSixJQUFLLGFBQ0Q0UixFQUFTblAsSUFBSThILEVBQU12SyxHQUNuQixNQUNKLElBQUssT0FDRCtPLEVBQUtvRyxRQUFRNUssRUFBTXZLLEdBQ25CLE1BQ0osSUFBSyxVQUNEK08sRUFBS3FHLFdBQVc3SyxFQUFNdkssR0FDdEIsTUFDSixJQUFLLFVBQ0QrTyxFQUFLc0csV0FBVzlLLEVBQU12SyxHQUN0QixNQUNKLElBQUssV0FDRCtPLEVBQUt1RyxZQUFZL0ssRUFBTXZLLEdBQ3ZCLE1BQ0osSUFBSyxXQUNEK08sRUFBSzRDLFlBQVlwSCxFQUFNdkssR0FDdkIsTUFDSixJQUFLLFFBQ0QrTyxFQUFLd0csU0FBU2hMLEVBQU12SyxHQUNwQixNQUNKLElBQUssV0FDRCtPLEVBQUt5RyxZQUFZakwsRUFBTXZLLEdBQ3ZCLE1BQ0osSUFBSyxrQkFDRCtPLEVBQUswRyxtQkFBbUJsTCxFQUFNdkssR0FDOUIsTUFDSixJQUFLLFFBQ0QrTyxFQUFLMkcsU0FBU25MLEVBQU12SyxHQUNwQixNQUNKLElBQUssU0FDRCtPLEVBQUs0RyxVQUFVcEwsRUFBTXZLLEdBQ3JCLE1BQ0osUUFDSXVLLEVBQUs3SixHQUFZVixFQUk3QixFQVFBK08sRUFBS21HLFVBQVksU0FBUzNLLEVBQU04RyxHQUM1QixJQUFLLElBQUlyUyxFQUFJLEVBQUdBLEVBQUl1TCxFQUFLNUgsTUFBTWYsT0FBUTVDLElBQUssQ0FDeEMsSUFBSTRXLEVBQU9yTCxFQUFLNUgsTUFBTTNELEdBQ3RCNFcsRUFBS3ZFLFNBQVdBLEVBRVpBLEdBQ0F1RSxFQUFLbkIsVUFBWSxDQUNiekIsWUFBYTRDLEVBQUs1QyxZQUNsQkMsU0FBVTJDLEVBQUszQyxTQUNmN0gsS0FBTXdLLEVBQUt4SyxLQUNYRCxRQUFTeUssRUFBS3pLLFFBQ2Q0SCxRQUFTNkMsRUFBSzdDLFFBQ2Q4QyxZQUFhRCxFQUFLQyxZQUNsQkMsZUFBZ0JGLEVBQUtFLGdCQUd6QkYsRUFBSzVDLFlBQWMsRUFDbkI0QyxFQUFLM0MsU0FBVyxFQUNoQjJDLEVBQUt4SyxLQUFPd0ssRUFBS3pLLFFBQVV5SyxFQUFLN0MsUUFBVWxMLElBQzFDK04sRUFBS0MsWUFBY0QsRUFBS0UsZUFBaUIsRUFFekNGLEVBQUt0QixhQUFhN00sRUFBSW1PLEVBQUtyTixTQUFTZCxFQUNwQ21PLEVBQUt0QixhQUFhNU0sRUFBSWtPLEVBQUtyTixTQUFTYixFQUNwQ2tPLEVBQUtyQixVQUFZcUIsRUFBSzdNLE1BQ3RCNk0sRUFBS2xELGdCQUFrQixFQUN2QmtELEVBQUtwRCxNQUFRLEVBQ2JvRCxFQUFLbkQsYUFBZSxFQUNwQm1ELEVBQUsvQyxPQUFTLEdBQ1ArQyxFQUFLbkIsWUFDWm1CLEVBQUs1QyxZQUFjNEMsRUFBS25CLFVBQVV6QixZQUNsQzRDLEVBQUszQyxTQUFXMkMsRUFBS25CLFVBQVV4QixTQUMvQjJDLEVBQUt4SyxLQUFPd0ssRUFBS25CLFVBQVVySixLQUMzQndLLEVBQUt6SyxRQUFVeUssRUFBS25CLFVBQVV0SixRQUM5QnlLLEVBQUs3QyxRQUFVNkMsRUFBS25CLFVBQVUxQixRQUM5QjZDLEVBQUtDLFlBQWNELEVBQUtuQixVQUFVb0IsWUFDbENELEVBQUtFLGVBQWlCRixFQUFLbkIsVUFBVXFCLGVBRXJDRixFQUFLbkIsVUFBWSxLQUV6QixDQUNKLEVBUUExRixFQUFLb0csUUFBVSxTQUFTNUssRUFBTWEsR0FDMUIsSUFBSTJLLEVBQVN4TCxFQUFLWSxTQUFXWixFQUFLYSxLQUFPLEdBQ3pDYixFQUFLWSxRQUFVNEssR0FBVTNLLEVBQU8sR0FDaENiLEVBQUt1TCxlQUFpQixFQUFJdkwsRUFBS1ksUUFFL0JaLEVBQUthLEtBQU9BLEVBQ1piLEVBQUtzTCxZQUFjLEVBQUl0TCxFQUFLYSxLQUM1QmIsRUFBS3dJLFFBQVV4SSxFQUFLYSxLQUFPYixFQUFLTyxJQUNwQyxFQVFBaUUsRUFBS3FHLFdBQWEsU0FBUzdLLEVBQU13SSxHQUM3QmhFLEVBQUtvRyxRQUFRNUssRUFBTXdJLEVBQVV4SSxFQUFLTyxNQUNsQ1AsRUFBS3dJLFFBQVVBLENBQ25CLEVBU0FoRSxFQUFLc0csV0FBYSxTQUFTOUssRUFBTVksR0FDN0JaLEVBQUtZLFFBQVVBLEVBQ2ZaLEVBQUt1TCxlQUFpQixFQUFJdkwsRUFBS1ksT0FDbkMsRUFjQTRELEVBQUt1RyxZQUFjLFNBQVMvSyxFQUFNaEQsR0FFMUJBLEVBQVMsR0FBR2dELE9BQVNBLEVBQ3JCQSxFQUFLaEQsU0FBV0EsRUFFaEJnRCxFQUFLaEQsU0FBVzhDLEVBQVNoSyxPQUFPa0gsRUFBVWdELEdBSTlDQSxFQUFLaUssS0FBTzNDLEVBQUttRSxhQUFhekwsRUFBS2hELFVBQ25DZ0QsRUFBS08sS0FBT1QsRUFBU1MsS0FBS1AsRUFBS2hELFVBQy9Cd0gsRUFBS29HLFFBQVE1SyxFQUFNQSxFQUFLd0ksUUFBVXhJLEVBQUtPLE1BR3ZDLElBQUlELEVBQVNSLEVBQVNRLE9BQU9OLEVBQUtoRCxVQUNsQzhDLEVBQVNqQyxVQUFVbUMsRUFBS2hELFNBQVVzRCxHQUFTLEdBRzNDa0UsRUFBS3NHLFdBQVc5SyxFQUFNd0UsRUFBSytDLGNBQWdCekgsRUFBU2MsUUFBUVosRUFBS2hELFNBQVVnRCxFQUFLYSxPQUdoRmYsRUFBU2pDLFVBQVVtQyxFQUFLaEQsU0FBVWdELEVBQUtoQyxVQUN2Q2pCLEVBQU9LLE9BQU80QyxFQUFLL0MsT0FBUStDLEVBQUtoRCxTQUFVZ0QsRUFBSzNDLFNBQ25ELEVBWUFtSCxFQUFLMkcsU0FBVyxTQUFTbkwsRUFBTTVILEVBQU9zVCxHQUNsQyxJQUFJalgsRUFRSixJQUxBMkQsRUFBUUEsRUFBTUgsTUFBTSxHQUNwQitILEVBQUs1SCxNQUFNZixPQUFTLEVBQ3BCMkksRUFBSzVILE1BQU1ULEtBQUtxSSxHQUNoQkEsRUFBSzRFLE9BQVM1RSxFQUVUdkwsRUFBSSxFQUFHQSxFQUFJMkQsRUFBTWYsT0FBUTVDLElBQUssQ0FDL0IsSUFBSTRXLEVBQU9qVCxFQUFNM0QsR0FDYjRXLElBQVNyTCxJQUNUcUwsRUFBS3pHLE9BQVM1RSxFQUNkQSxFQUFLNUgsTUFBTVQsS0FBSzBULEdBRXhCLENBRUEsR0FBMEIsSUFBdEJyTCxFQUFLNUgsTUFBTWYsT0FBZixDQU1BLEdBSEFxVSxPQUErQixJQUFiQSxHQUEyQkEsRUFHL0IsQ0FDVixJQUFJMU8sRUFBVyxHQUNmLElBQUt2SSxFQUFJLEVBQUdBLEVBQUkyRCxFQUFNZixPQUFRNUMsSUFDMUJ1SSxFQUFXQSxFQUFTdkMsT0FBT3JDLEVBQU0zRCxHQUFHdUksVUFHeEM4QyxFQUFTaUQsY0FBYy9GLEdBRXZCLElBQUl1RyxFQUFPekQsRUFBU3lELEtBQUt2RyxHQUNyQjJPLEVBQWE3TCxFQUFTUSxPQUFPaUQsR0FFakNpQixFQUFLdUcsWUFBWS9LLEVBQU11RCxHQUN2QnpELEVBQVNqQyxVQUFVbUMsRUFBS2hELFNBQVUyTyxFQUN0QyxDQUdBLElBQUlDLEVBQVFwSCxFQUFLcUgsaUJBQWlCN0wsR0FFbENBLEVBQUtPLEtBQU9xTCxFQUFNckwsS0FDbEJQLEVBQUs0RSxPQUFTNUUsRUFDZEEsRUFBS2hDLFNBQVNkLEVBQUkwTyxFQUFNdEwsT0FBT3BELEVBQy9COEMsRUFBS2hDLFNBQVNiLEVBQUl5TyxFQUFNdEwsT0FBT25ELEVBQy9CNkMsRUFBSytKLGFBQWE3TSxFQUFJME8sRUFBTXRMLE9BQU9wRCxFQUNuQzhDLEVBQUsrSixhQUFhNU0sRUFBSXlPLEVBQU10TCxPQUFPbkQsRUFFbkNxSCxFQUFLb0csUUFBUTVLLEVBQU00TCxFQUFNL0ssTUFDekIyRCxFQUFLc0csV0FBVzlLLEVBQU00TCxFQUFNaEwsU0FDNUI0RCxFQUFLNEMsWUFBWXBILEVBQU00TCxFQUFNdEwsT0FoQ25CLENBaUNkLEVBYUFrRSxFQUFLNEcsVUFBWSxTQUFTcEwsRUFBTU0sRUFBUXdMLEdBQy9CQSxHQU1EOUwsRUFBSytKLGFBQWE3TSxHQUFLb0QsRUFBT3BELEVBQzlCOEMsRUFBSytKLGFBQWE1TSxHQUFLbUQsRUFBT25ELEVBQzlCNkMsRUFBS2hDLFNBQVNkLEdBQUtvRCxFQUFPcEQsRUFDMUI4QyxFQUFLaEMsU0FBU2IsR0FBS21ELEVBQU9uRCxJQVIxQjZDLEVBQUsrSixhQUFhN00sRUFBSW9ELEVBQU9wRCxHQUFLOEMsRUFBS2hDLFNBQVNkLEVBQUk4QyxFQUFLK0osYUFBYTdNLEdBQ3RFOEMsRUFBSytKLGFBQWE1TSxFQUFJbUQsRUFBT25ELEdBQUs2QyxFQUFLaEMsU0FBU2IsRUFBSTZDLEVBQUsrSixhQUFhNU0sR0FDdEU2QyxFQUFLaEMsU0FBU2QsRUFBSW9ELEVBQU9wRCxFQUN6QjhDLEVBQUtoQyxTQUFTYixFQUFJbUQsRUFBT25ELEVBT2pDLEVBUUFxSCxFQUFLNEMsWUFBYyxTQUFTcEgsRUFBTWhDLEdBQzlCLElBQUk0RCxFQUFRekQsRUFBT2tCLElBQUlyQixFQUFVZ0MsRUFBS2hDLFVBQ3RDZ0MsRUFBSytKLGFBQWE3TSxHQUFLMEUsRUFBTTFFLEVBQzdCOEMsRUFBSytKLGFBQWE1TSxHQUFLeUUsRUFBTXpFLEVBRTdCLElBQUssSUFBSTFJLEVBQUksRUFBR0EsRUFBSXVMLEVBQUs1SCxNQUFNZixPQUFRNUMsSUFBSyxDQUN4QyxJQUFJNFcsRUFBT3JMLEVBQUs1SCxNQUFNM0QsR0FDdEI0VyxFQUFLck4sU0FBU2QsR0FBSzBFLEVBQU0xRSxFQUN6Qm1PLEVBQUtyTixTQUFTYixHQUFLeUUsRUFBTXpFLEVBQ3pCMkMsRUFBU2pDLFVBQVV3TixFQUFLck8sU0FBVTRFLEdBQ2xDN0UsRUFBT0ssT0FBT2lPLEVBQUtwTyxPQUFRb08sRUFBS3JPLFNBQVVnRCxFQUFLM0MsU0FDbkQsQ0FDSixFQVFBbUgsRUFBS3dHLFNBQVcsU0FBU2hMLEVBQU14QixHQUMzQixJQUFJb0QsRUFBUXBELEVBQVF3QixFQUFLeEIsTUFDekJ3QixFQUFLZ0ssV0FBYXBJLEVBRWxCLElBQUssSUFBSW5OLEVBQUksRUFBR0EsRUFBSXVMLEVBQUs1SCxNQUFNZixPQUFRNUMsSUFBSyxDQUN4QyxJQUFJNFcsRUFBT3JMLEVBQUs1SCxNQUFNM0QsR0FDdEI0VyxFQUFLN00sT0FBU29ELEVBQ2Q5QixFQUFTdkIsT0FBTzhNLEVBQUtyTyxTQUFVNEUsRUFBTzVCLEVBQUtoQyxVQUMzQ3NKLEVBQUsvSSxPQUFPOE0sRUFBS3BCLEtBQU1ySSxHQUN2QjdFLEVBQU9LLE9BQU9pTyxFQUFLcE8sT0FBUW9PLEVBQUtyTyxTQUFVZ0QsRUFBSzNDLFVBQzNDNUksRUFBSSxHQUNKMEosRUFBT1MsWUFBWXlNLEVBQUtyTixTQUFVNEQsRUFBTzVCLEVBQUtoQyxTQUFVcU4sRUFBS3JOLFNBRXJFLENBQ0osRUFRQXdHLEVBQUt5RyxZQUFjLFNBQVNqTCxFQUFNM0MsR0FDOUIyQyxFQUFLK0osYUFBYTdNLEVBQUk4QyxFQUFLaEMsU0FBU2QsRUFBSUcsRUFBU0gsRUFDakQ4QyxFQUFLK0osYUFBYTVNLEVBQUk2QyxFQUFLaEMsU0FBU2IsRUFBSUUsRUFBU0YsRUFDakQ2QyxFQUFLM0MsU0FBU0gsRUFBSUcsRUFBU0gsRUFDM0I4QyxFQUFLM0MsU0FBU0YsRUFBSUUsRUFBU0YsRUFDM0I2QyxFQUFLaUksTUFBUTlKLEVBQU9DLFVBQVU0QixFQUFLM0MsU0FDdkMsRUFRQW1ILEVBQUswRyxtQkFBcUIsU0FBU2xMLEVBQU0zQyxHQUNyQzJDLEVBQUtnSyxVQUFZaEssRUFBS3hCLE1BQVFuQixFQUM5QjJDLEVBQUttSSxnQkFBa0I5SyxFQUN2QjJDLEVBQUtrSSxhQUFlMVAsS0FBS21JLElBQUlYLEVBQUttSSxnQkFDdEMsRUFRQTNELEVBQUszRyxVQUFZLFNBQVNtQyxFQUFNaUgsR0FDNUJ6QyxFQUFLNEMsWUFBWXBILEVBQU03QixFQUFPaUIsSUFBSVksRUFBS2hDLFNBQVVpSixHQUNyRCxFQVNBekMsRUFBS2pHLE9BQVMsU0FBU3lCLEVBQU1tSCxFQUFVMUosR0FDbkMsR0FBS0EsRUFFRSxDQUNILElBQUlpQixFQUFNbEcsS0FBS2tHLElBQUl5SSxHQUNmeEksRUFBTW5HLEtBQUttRyxJQUFJd0ksR0FDZi9GLEVBQUtwQixFQUFLaEMsU0FBU2QsRUFBSU8sRUFBTVAsRUFDN0JtRSxFQUFLckIsRUFBS2hDLFNBQVNiLEVBQUlNLEVBQU1OLEVBRWpDcUgsRUFBSzRDLFlBQVlwSCxFQUFNLENBQ25COUMsRUFBR08sRUFBTVAsR0FBS2tFLEVBQUsxQyxFQUFNMkMsRUFBSzFDLEdBQzlCeEIsRUFBR00sRUFBTU4sR0FBS2lFLEVBQUt6QyxFQUFNMEMsRUFBSzNDLEtBR2xDOEYsRUFBS3dHLFNBQVNoTCxFQUFNQSxFQUFLeEIsTUFBUTJJLEVBQ3JDLE1BYkkzQyxFQUFLd0csU0FBU2hMLEVBQU1BLEVBQUt4QixNQUFRMkksRUFjekMsRUFVQTNDLEVBQUsvQyxNQUFRLFNBQVN6QixFQUFNMEIsRUFBUUMsRUFBUWxFLEdBQ3hDLElBQUlzTyxFQUFZLEVBQ1pDLEVBQWUsRUFFbkJ2TyxFQUFRQSxHQUFTdUMsRUFBS2hDLFNBRXRCLElBQUssSUFBSXZKLEVBQUksRUFBR0EsRUFBSXVMLEVBQUs1SCxNQUFNZixPQUFRNUMsSUFBSyxDQUN4QyxJQUFJNFcsRUFBT3JMLEVBQUs1SCxNQUFNM0QsR0FHdEJxTCxFQUFTMkIsTUFBTTRKLEVBQUtyTyxTQUFVMEUsRUFBUUMsRUFBUWxFLEdBRzlDNE4sRUFBS3BCLEtBQU8zQyxFQUFLbUUsYUFBYUosRUFBS3JPLFVBQ25DcU8sRUFBSzlLLEtBQU9ULEVBQVNTLEtBQUs4SyxFQUFLck8sVUFDL0J3SCxFQUFLb0csUUFBUVMsRUFBTXJMLEVBQUt3SSxRQUFVNkMsRUFBSzlLLE1BR3ZDVCxFQUFTakMsVUFBVXdOLEVBQUtyTyxTQUFVLENBQUVFLEdBQUltTyxFQUFLck4sU0FBU2QsRUFBR0MsR0FBSWtPLEVBQUtyTixTQUFTYixJQUMzRXFILEVBQUtzRyxXQUFXTyxFQUFNN0csRUFBSytDLGNBQWdCekgsRUFBU2MsUUFBUXlLLEVBQUtyTyxTQUFVcU8sRUFBS3hLLE9BQ2hGZixFQUFTakMsVUFBVXdOLEVBQUtyTyxTQUFVLENBQUVFLEVBQUdtTyxFQUFLck4sU0FBU2QsRUFBR0MsRUFBR2tPLEVBQUtyTixTQUFTYixJQUVyRTFJLEVBQUksSUFDSnNYLEdBQWFWLEVBQUs5SyxLQUNsQnlMLEdBQWdCWCxFQUFLekssU0FJekJ5SyxFQUFLck4sU0FBU2QsRUFBSU8sRUFBTVAsR0FBS21PLEVBQUtyTixTQUFTZCxFQUFJTyxFQUFNUCxHQUFLd0UsRUFDMUQySixFQUFLck4sU0FBU2IsRUFBSU0sRUFBTU4sR0FBS2tPLEVBQUtyTixTQUFTYixFQUFJTSxFQUFNTixHQUFLd0UsRUFHMUQ1RSxFQUFPSyxPQUFPaU8sRUFBS3BPLE9BQVFvTyxFQUFLck8sU0FBVWdELEVBQUszQyxTQUNuRCxDQUdJMkMsRUFBSzVILE1BQU1mLE9BQVMsSUFDcEIySSxFQUFLTyxLQUFPd0wsRUFFUC9MLEVBQUs4RyxXQUNOdEMsRUFBS29HLFFBQVE1SyxFQUFNQSxFQUFLd0ksUUFBVXVELEdBQ2xDdkgsRUFBS3NHLFdBQVc5SyxFQUFNZ00sS0FLMUJoTSxFQUFLOEosZUFDRHBJLElBQVdDLEVBQ1gzQixFQUFLOEosY0FBZ0JwSSxFQUdyQjFCLEVBQUs4SixhQUFlLEtBR2hDLEVBVUF0RixFQUFLcEgsT0FBUyxTQUFTNEMsRUFBTWlNLEVBQVcvQyxFQUFXZ0QsR0FDL0MsSUFBSUMsRUFBbUIzVCxLQUFLZ0ssSUFBSXlKLEVBQVkvQyxFQUFZbEosRUFBS2tKLFVBQVcsR0FHcEVOLEVBQWMsRUFBSTVJLEVBQUs0SSxZQUFjTSxFQUFZbEosRUFBS2tKLFVBQ3REa0QsRUFBZ0JwTSxFQUFLaEMsU0FBU2QsRUFBSThDLEVBQUsrSixhQUFhN00sRUFDcERtUCxFQUFnQnJNLEVBQUtoQyxTQUFTYixFQUFJNkMsRUFBSytKLGFBQWE1TSxFQUd4RDZDLEVBQUszQyxTQUFTSCxFQUFLa1AsRUFBZ0J4RCxFQUFjc0QsRUFBZWxNLEVBQUs0SCxNQUFNMUssRUFBSThDLEVBQUthLEtBQVFzTCxFQUM1Rm5NLEVBQUszQyxTQUFTRixFQUFLa1AsRUFBZ0J6RCxFQUFjc0QsRUFBZWxNLEVBQUs0SCxNQUFNekssRUFBSTZDLEVBQUthLEtBQVFzTCxFQUU1Rm5NLEVBQUsrSixhQUFhN00sRUFBSThDLEVBQUtoQyxTQUFTZCxFQUNwQzhDLEVBQUsrSixhQUFhNU0sRUFBSTZDLEVBQUtoQyxTQUFTYixFQUNwQzZDLEVBQUtoQyxTQUFTZCxHQUFLOEMsRUFBSzNDLFNBQVNILEVBQ2pDOEMsRUFBS2hDLFNBQVNiLEdBQUs2QyxFQUFLM0MsU0FBU0YsRUFHakM2QyxFQUFLbUksaUJBQW9CbkksRUFBS3hCLE1BQVF3QixFQUFLZ0ssV0FBYXBCLEVBQWNzRCxFQUFlbE0sRUFBSzZILE9BQVM3SCxFQUFLWSxRQUFXdUwsRUFDbkhuTSxFQUFLZ0ssVUFBWWhLLEVBQUt4QixNQUN0QndCLEVBQUt4QixPQUFTd0IsRUFBS21JLGdCQUduQm5JLEVBQUtpSSxNQUFROUosRUFBT0MsVUFBVTRCLEVBQUszQyxVQUNuQzJDLEVBQUtrSSxhQUFlMVAsS0FBS21JLElBQUlYLEVBQUttSSxpQkFHbEMsSUFBSyxJQUFJMVQsRUFBSSxFQUFHQSxFQUFJdUwsRUFBSzVILE1BQU1mLE9BQVE1QyxJQUFLLENBQ3hDLElBQUk0VyxFQUFPckwsRUFBSzVILE1BQU0zRCxHQUV0QnFMLEVBQVNqQyxVQUFVd04sRUFBS3JPLFNBQVVnRCxFQUFLM0MsVUFFbkM1SSxFQUFJLElBQ0o0VyxFQUFLck4sU0FBU2QsR0FBSzhDLEVBQUszQyxTQUFTSCxFQUNqQ21PLEVBQUtyTixTQUFTYixHQUFLNkMsRUFBSzNDLFNBQVNGLEdBR1IsSUFBekI2QyxFQUFLbUksa0JBQ0xySSxFQUFTdkIsT0FBTzhNLEVBQUtyTyxTQUFVZ0QsRUFBS21JLGdCQUFpQm5JLEVBQUtoQyxVQUMxRHNKLEVBQUsvSSxPQUFPOE0sRUFBS3BCLEtBQU1qSyxFQUFLbUksaUJBQ3hCMVQsRUFBSSxHQUNKMEosRUFBT1MsWUFBWXlNLEVBQUtyTixTQUFVZ0MsRUFBS21JLGdCQUFpQm5JLEVBQUtoQyxTQUFVcU4sRUFBS3JOLFdBSXBGakIsRUFBT0ssT0FBT2lPLEVBQUtwTyxPQUFRb08sRUFBS3JPLFNBQVVnRCxFQUFLM0MsU0FDbkQsQ0FDSixFQVNBbUgsRUFBSzhILFdBQWEsU0FBU3RNLEVBQU1oQyxFQUFVNEosR0FDdkM1SCxFQUFLNEgsTUFBTTFLLEdBQUswSyxFQUFNMUssRUFDdEI4QyxFQUFLNEgsTUFBTXpLLEdBQUt5SyxFQUFNekssRUFDdEIsSUFBSW9QLEVBQWN2TyxFQUFTZCxFQUFJOEMsRUFBS2hDLFNBQVNkLEVBQXpDcVAsRUFBK0N2TyxFQUFTYixFQUFJNkMsRUFBS2hDLFNBQVNiLEVBQzlFNkMsRUFBSzZILFFBQVUwRSxFQUFXM0UsRUFBTXpLLEVBQUlvUCxFQUFXM0UsRUFBTTFLLENBQ3pELEVBU0FzSCxFQUFLcUgsaUJBQW1CLFNBQVM3TCxHQWE3QixJQVJBLElBQUl3TSxFQUFhLENBQ2IzTCxLQUFNLEVBQ05OLEtBQU0sRUFDTkssUUFBUyxFQUNUTixPQUFRLENBQUVwRCxFQUFHLEVBQUdDLEVBQUcsSUFJZDFJLEVBQTBCLElBQXRCdUwsRUFBSzVILE1BQU1mLE9BQWUsRUFBSSxFQUFHNUMsRUFBSXVMLEVBQUs1SCxNQUFNZixPQUFRNUMsSUFBSyxDQUN0RSxJQUFJNFcsRUFBT3JMLEVBQUs1SCxNQUFNM0QsR0FDbEJvTSxFQUFPd0ssRUFBS3hLLE9BQVN2RCxJQUFXK04sRUFBS3hLLEtBQU8sRUFFaEQyTCxFQUFXM0wsTUFBUUEsRUFDbkIyTCxFQUFXak0sTUFBUThLLEVBQUs5SyxLQUN4QmlNLEVBQVc1TCxTQUFXeUssRUFBS3pLLFFBQzNCNEwsRUFBV2xNLE9BQVNuQyxFQUFPaUIsSUFBSW9OLEVBQVdsTSxPQUFRbkMsRUFBT21CLEtBQUsrTCxFQUFLck4sU0FBVTZDLEdBQ2pGLENBSUEsT0FGQTJMLEVBQVdsTSxPQUFTbkMsRUFBT3FCLElBQUlnTixFQUFXbE0sT0FBUWtNLEVBQVczTCxNQUV0RDJMLENBQ1gsQ0F5ZkgsQ0E1ckNELEVBK3JDTyxFQUVELFNBQVV0WSxFQUFRRCxFQUFTLEdBUWpDLElBQUlvVCxFQUFXLENBQUMsRUFFaEJuVCxFQUFPRCxRQUFVb1QsRUFFakIsSUFBSTFELEVBQVMsRUFBb0IsR0FJN0IwRCxFQUFTb0YscUJBQXVCLElBQ2hDcEYsRUFBU3FGLHNCQUF3QixJQUNqQ3JGLEVBQVNzRixTQUFXLEdBUXBCdEYsRUFBU2pLLE9BQVMsU0FBUzBILEVBQVFvRSxHQUkvQixJQUhBLElBQUkwRCxFQUFhMUQsRUFBWUEsRUFBWUEsRUFHaEN6VSxFQUFJLEVBQUdBLEVBQUlxUSxFQUFPek4sT0FBUTVDLElBQUssQ0FDcEMsSUFBSXVMLEVBQU84RSxFQUFPclEsR0FDZDZULEVBQVN0SSxFQUFLaUksTUFBUWpJLEVBQUtpSSxNQUFRakksRUFBS2tJLGFBQWVsSSxFQUFLa0ksYUFHaEUsR0FBcUIsSUFBakJsSSxFQUFLNEgsTUFBTTFLLEdBQTRCLElBQWpCOEMsRUFBSzRILE1BQU16SyxFQUFyQyxDQUtBLElBQUkwUCxFQUFZclUsS0FBS2dCLElBQUl3RyxFQUFLc0ksT0FBUUEsR0FDbEN3RSxFQUFZdFUsS0FBS2lCLElBQUl1RyxFQUFLc0ksT0FBUUEsR0FHdEN0SSxFQUFLc0ksT0FBU2pCLEVBQVNzRixTQUFXRSxHQUFhLEVBQUl4RixFQUFTc0YsVUFBWUcsRUFFcEU5TSxFQUFLdUksZUFBaUIsR0FBS3ZJLEVBQUtzSSxPQUFTakIsRUFBU3FGLHNCQUF3QkUsR0FDMUU1TSxFQUFLK00sY0FBZ0IsRUFFakIvTSxFQUFLK00sY0FBZ0IvTSxFQUFLdUksZ0JBQzFCbEIsRUFBU25QLElBQUk4SCxHQUFNLElBQ2hCQSxFQUFLK00sYUFBZSxJQUMzQi9NLEVBQUsrTSxjQUFnQixFQWR6QixNQUZJMUYsRUFBU25QLElBQUk4SCxHQUFNLEVBa0IzQixDQUNKLEVBUUFxSCxFQUFTMkYsZ0JBQWtCLFNBQVNDLEVBQU8vRCxHQUl2QyxJQUhBLElBQUkwRCxFQUFhMUQsRUFBWUEsRUFBWUEsRUFHaEN6VSxFQUFJLEVBQUdBLEVBQUl3WSxFQUFNNVYsT0FBUTVDLElBQUssQ0FDbkMsSUFBSXlZLEVBQU9ELEVBQU14WSxHQUdqQixHQUFLeVksRUFBS0MsU0FBVixDQUdBLElBQUlDLEVBQVlGLEVBQUtFLFVBQ2pCQyxFQUFRRCxFQUFVQyxNQUFNekksT0FDeEIwSSxFQUFRRixFQUFVRSxNQUFNMUksT0FHNUIsS0FBS3lJLEVBQU1oRixZQUFjaUYsRUFBTWpGLFlBQWVnRixFQUFNdkcsVUFBWXdHLEVBQU14RyxZQUdsRXVHLEVBQU1oRixZQUFjaUYsRUFBTWpGLFlBQVksQ0FDdEMsSUFBSWtGLEVBQWdCRixFQUFNaEYsYUFBZWdGLEVBQU12RyxTQUFZdUcsRUFBUUMsRUFDL0RFLEVBQWFELElBQWlCRixFQUFRQyxFQUFRRCxHQUU3Q0UsRUFBYXpHLFVBQVkwRyxFQUFXbEYsT0FBU2pCLEVBQVNvRixxQkFBdUJHLEdBQzlFdkYsRUFBU25QLElBQUlxVixHQUFjLEVBRW5DLENBakJZLENBa0JoQixDQUNKLEVBUUFsRyxFQUFTblAsSUFBTSxTQUFTOEgsRUFBTXFJLEdBQzFCLElBQUlvRixFQUFjek4sRUFBS3FJLFdBRW5CQSxHQUNBckksRUFBS3FJLFlBQWEsRUFDbEJySSxFQUFLK00sYUFBZS9NLEVBQUt1SSxlQUV6QnZJLEVBQUs4SCxnQkFBZ0I1SyxFQUFJLEVBQ3pCOEMsRUFBSzhILGdCQUFnQjNLLEVBQUksRUFFekI2QyxFQUFLK0osYUFBYTdNLEVBQUk4QyxFQUFLaEMsU0FBU2QsRUFDcEM4QyxFQUFLK0osYUFBYTVNLEVBQUk2QyxFQUFLaEMsU0FBU2IsRUFFcEM2QyxFQUFLZ0ssVUFBWWhLLEVBQUt4QixNQUN0QndCLEVBQUtpSSxNQUFRLEVBQ2JqSSxFQUFLa0ksYUFBZSxFQUNwQmxJLEVBQUtzSSxPQUFTLEVBRVRtRixHQUNEOUosRUFBT1MsUUFBUXBFLEVBQU0sZ0JBR3pCQSxFQUFLcUksWUFBYSxFQUNsQnJJLEVBQUsrTSxhQUFlLEVBRWhCVSxHQUNBOUosRUFBT1MsUUFBUXBFLEVBQU0sWUFHakMsQ0FLRyxFQUVELFNBQVU5TCxFQUFRRCxFQUFTLEdBWWpDLElBQUl5WixFQUFZLENBQUMsRUFFakJ4WixFQUFPRCxRQUFVeVosRUFFakIsSUFJUUMsRUFFQUMsRUFLQUMsRUFYSi9OLEVBQVcsRUFBb0IsR0FDL0JnTyxFQUFPLEVBQW9CLEdBR3ZCSCxFQUFZLEdBRVpDLEVBQWEsQ0FDYkcsUUFBUyxFQUNUQyxLQUFNLE1BR05ILEVBQWEsQ0FDYkUsUUFBUyxFQUNUQyxLQUFNLE1BVVZOLEVBQVU1WCxPQUFTLFNBQVN1WCxFQUFPQyxHQUMvQixNQUFPLENBQ0hKLEtBQU0sS0FDTmUsVUFBVSxFQUNWWixNQUFPQSxFQUNQQyxNQUFPQSxFQUNQWSxRQUFTYixFQUFNekksT0FDZnVKLFFBQVNiLEVBQU0xSSxPQUNmd0osTUFBTyxFQUNQQyxPQUFRLENBQUVuUixFQUFHLEVBQUdDLEVBQUcsR0FDbkJtUixRQUFTLENBQUVwUixFQUFHLEVBQUdDLEVBQUcsR0FDcEJvUixZQUFhLENBQUVyUixFQUFHLEVBQUdDLEVBQUcsR0FDeEJxUixTQUFVLEdBRWxCLEVBVUFkLEVBQVVlLFNBQVcsU0FBU3BCLEVBQU9DLEVBQU9MLEdBR3hDLEdBRkFTLEVBQVVnQixhQUFhZCxFQUFZUCxFQUFNclEsU0FBVXNRLEVBQU10USxTQUFVcVEsRUFBTXBELE1BRXJFMkQsRUFBV0csU0FBVyxFQUN0QixPQUFPLEtBS1gsR0FGQUwsRUFBVWdCLGFBQWFiLEVBQVlQLEVBQU10USxTQUFVcVEsRUFBTXJRLFNBQVVzUSxFQUFNckQsTUFFckU0RCxFQUFXRSxTQUFXLEVBQ3RCLE9BQU8sS0FJWCxJQUNJWCxFQWdCQXVCLEVBakJBekIsRUFBT0QsR0FBU0EsRUFBTTJCLE1BQU1kLEVBQUtwSixHQUFHMkksRUFBT0MsSUFHMUNKLEVBUURFLEVBQVlGLEVBQUtFLFlBUGpCQSxFQUFZTSxFQUFVNVgsT0FBT3VYLEVBQU9DLElBQzFCVyxVQUFXLEVBQ3JCYixFQUFVQyxNQUFRQSxFQUFNM0ksR0FBSzRJLEVBQU01SSxHQUFLMkksRUFBUUMsRUFDaERGLEVBQVVFLE1BQVFELEVBQU0zSSxHQUFLNEksRUFBTTVJLEdBQUs0SSxFQUFRRCxFQUNoREQsRUFBVWMsUUFBVWQsRUFBVUMsTUFBTXpJLE9BQ3BDd0ksRUFBVWUsUUFBVWYsRUFBVUUsTUFBTTFJLFFBS3hDeUksRUFBUUQsRUFBVUMsTUFDbEJDLEVBQVFGLEVBQVVFLE1BS2RxQixFQURBZixFQUFXRyxRQUFVRixFQUFXRSxRQUNuQkgsRUFFQUMsRUFHakIsSUFBSVEsRUFBU2pCLEVBQVVpQixPQUNuQkcsRUFBV3BCLEVBQVVvQixTQUNyQkssRUFBVUYsRUFBV1gsS0FDckJjLEVBQVdELEVBQVEzUixFQUNuQjZSLEVBQVdGLEVBQVExUixFQUduQjJSLEdBQVl4QixFQUFNdFAsU0FBU2QsRUFBSW1RLEVBQU1yUCxTQUFTZCxHQUFLNlIsR0FBWXpCLEVBQU10UCxTQUFTYixFQUFJa1EsRUFBTXJQLFNBQVNiLEdBQUssR0FDdEdrUixFQUFPblIsRUFBSTRSLEVBQ1hULEVBQU9sUixFQUFJNFIsSUFFWFYsRUFBT25SLEdBQUs0UixFQUNaVCxFQUFPbFIsR0FBSzRSLEdBR2hCM0IsRUFBVWtCLFFBQVFwUixHQUFLbVIsRUFBT2xSLEVBQzlCaVEsRUFBVWtCLFFBQVFuUixFQUFJa1IsRUFBT25SLEVBRTdCa1EsRUFBVWdCLE1BQVFPLEVBQVdaLFFBRTdCWCxFQUFVbUIsWUFBWXJSLEVBQUltUixFQUFPblIsRUFBSWtRLEVBQVVnQixNQUMvQ2hCLEVBQVVtQixZQUFZcFIsRUFBSWtSLEVBQU9sUixFQUFJaVEsRUFBVWdCLE1BRy9DLElBQUlZLEVBQVl0QixFQUFVdUIsY0FBYzVCLEVBQU9DLEVBQU9lLEVBQVEsR0FDMURhLEVBQWUsRUFZbkIsR0FUSXBQLEVBQVN0QyxTQUFTNlAsRUFBTXJRLFNBQVVnUyxFQUFVLE1BQzVDUixFQUFTVSxLQUFrQkYsRUFBVSxJQUdyQ2xQLEVBQVN0QyxTQUFTNlAsRUFBTXJRLFNBQVVnUyxFQUFVLE1BQzVDUixFQUFTVSxLQUFrQkYsRUFBVSxJQUlyQ0UsRUFBZSxFQUFHLENBQ2xCLElBQUlDLEVBQVl6QixFQUFVdUIsY0FBYzNCLEVBQU9ELEVBQU9nQixHQUFTLEdBRTNEdk8sRUFBU3RDLFNBQVM4UCxFQUFNdFEsU0FBVW1TLEVBQVUsTUFDNUNYLEVBQVNVLEtBQWtCQyxFQUFVLElBR3JDRCxFQUFlLEdBQUtwUCxFQUFTdEMsU0FBUzhQLEVBQU10USxTQUFVbVMsRUFBVSxNQUNoRVgsRUFBU1UsS0FBa0JDLEVBQVUsR0FFN0MsQ0FVQSxPQVBxQixJQUFqQkQsSUFDQVYsRUFBU1UsS0FBa0JGLEVBQVUsSUFJekNSLEVBQVNuWCxPQUFTNlgsRUFFWDlCLENBQ1gsRUFXQU0sRUFBVWdCLGFBQWUsU0FBUzdTLEVBQVF1VCxFQUFXQyxFQUFXcEYsR0FDNUQsSUFTSThELEVBQ0F1QixFQUNBQyxFQUNBelEsRUFDQXJLLEVBQ0E4RCxFQWRBaVgsRUFBa0JKLEVBQVUvWCxPQUM1Qm9ZLEVBQWtCSixFQUFVaFksT0FDNUJxWSxFQUFhTixFQUFVLEdBQUdsUyxFQUMxQnlTLEVBQWFQLEVBQVUsR0FBR2pTLEVBQzFCeVMsRUFBYVAsRUFBVSxHQUFHblMsRUFDMUIyUyxFQUFhUixFQUFVLEdBQUdsUyxFQUMxQjJTLEVBQWE3RixFQUFLNVMsT0FDbEIwWSxFQUFhQyxPQUFPQyxVQUNwQkMsRUFBb0IsRUFReEIsSUFBS3piLEVBQUksRUFBR0EsRUFBSXFiLEVBQVlyYixJQUFLLENBQzdCLElBQUl1WixFQUFPL0QsRUFBS3hWLEdBQ1owYixFQUFRbkMsRUFBSzlRLEVBQ2JrVCxFQUFRcEMsRUFBSzdRLEVBQ2JrVCxFQUFPWCxFQUFhUyxFQUFRUixFQUFhUyxFQUN6Q0UsRUFBT1YsRUFBYU8sRUFBUU4sRUFBYU8sRUFDekNHLEVBQU9GLEVBQ1BHLEVBQU9GLEVBRVgsSUFBSy9YLEVBQUksRUFBR0EsRUFBSWlYLEVBQWlCalgsR0FBSyxHQUNsQ3VHLEVBQU1zUSxFQUFVN1csR0FBRzJFLEVBQUlpVCxFQUFRZixFQUFVN1csR0FBRzRFLEVBQUlpVCxHQUV0Q0csRUFDTkEsRUFBT3pSLEVBQ0FBLEVBQU11UixJQUNiQSxFQUFPdlIsR0FJZixJQUFLdkcsRUFBSSxFQUFHQSxFQUFJa1gsRUFBaUJsWCxHQUFLLEdBQ2xDdUcsRUFBTXVRLEVBQVU5VyxHQUFHMkUsRUFBSWlULEVBQVFkLEVBQVU5VyxHQUFHNEUsRUFBSWlULEdBRXRDSSxFQUNOQSxFQUFPMVIsRUFDQUEsRUFBTXdSLElBQ2JBLEVBQU94UixHQVFmLElBRkFpUCxHQUZBdUIsRUFBWWlCLEVBQU9ELElBQ25CZixFQUFZaUIsRUFBT0gsR0FDZWYsRUFBWUMsR0FFaENRLElBQ1ZBLEVBQWFoQyxFQUNibUMsRUFBb0J6YixFQUVoQnNaLEdBQVcsR0FFWCxLQUdaLENBRUFsUyxFQUFPbVMsS0FBTy9ELEVBQUtpRyxHQUNuQnJVLEVBQU9rUyxRQUFVZ0MsQ0FDckIsRUFVQXJDLEVBQVUrQyxlQUFpQixTQUFTQyxFQUFZMVQsRUFBVWdSLEdBSXRELElBSEEsSUFBSXhVLEVBQU13RCxFQUFTLEdBQUdFLEVBQUk4USxFQUFLOVEsRUFBSUYsRUFBUyxHQUFHRyxFQUFJNlEsRUFBSzdRLEVBQ3BEMUQsRUFBTUQsRUFFRC9FLEVBQUksRUFBR0EsRUFBSXVJLEVBQVMzRixPQUFRNUMsR0FBSyxFQUFHLENBQ3pDLElBQUlxSyxFQUFNOUIsRUFBU3ZJLEdBQUd5SSxFQUFJOFEsRUFBSzlRLEVBQUlGLEVBQVN2SSxHQUFHMEksRUFBSTZRLEVBQUs3USxFQUVwRDJCLEVBQU1yRixFQUNOQSxFQUFNcUYsRUFDQ0EsRUFBTXRGLElBQ2JBLEVBQU1zRixFQUVkLENBRUE0UixFQUFXbFgsSUFBTUEsRUFDakJrWCxFQUFXalgsSUFBTUEsQ0FDckIsRUFZQWlVLEVBQVV1QixjQUFnQixTQUFTNUIsRUFBT0MsRUFBT2UsRUFBUXNDLEdBQ3JELElBT0kxTixFQUNBQyxFQUNBME4sRUFDQUMsRUFDQXRZLEVBWEF5RSxFQUFXc1EsRUFBTXRRLFNBQ2pCaUUsRUFBaUJqRSxFQUFTM0YsT0FDMUJ5WixFQUFpQnpELEVBQU1yUCxTQUFTZCxFQUNoQzZULEVBQWlCMUQsRUFBTXJQLFNBQVNiLEVBQ2hDNlQsRUFBVTNDLEVBQU9uUixFQUFJeVQsRUFDckJNLEVBQVU1QyxFQUFPbFIsRUFBSXdULEVBQ3JCTyxFQUFrQmxCLE9BQU9DLFVBUTdCLElBQUsxWCxFQUFJLEVBQUdBLEVBQUkwSSxFQUFnQjFJLEdBQUssR0FFakNzWSxFQUFXRyxHQUFXRixHQUR0QjVOLEVBQVVsRyxFQUFTekUsSUFDNEIyRSxHQUFLK1QsR0FBV0YsRUFBaUI3TixFQUFRL0YsSUFHekUrVCxJQUNYQSxFQUFrQkwsRUFDbEI1TixFQUFVQyxHQVVsQixPQUpBZ08sRUFBa0JGLEdBQVdGLEdBRDdCRixFQUFVNVQsR0FBVWlFLEVBQWlCZ0MsRUFBUWhELE1BQVEsR0FBS2dCLElBQ0ovRCxHQUFLK1QsR0FBV0YsRUFBaUJILEVBQVF6VCxHQUkzRjZULEdBQVdGLEdBRGY1TixFQUFVbEcsR0FBVWlHLEVBQVFoRCxNQUFRLEdBQUtnQixJQUNEL0QsR0FBSytULEdBQVdGLEVBQWlCN04sRUFBUS9GLEdBQUsrVCxHQUNsRnZELEVBQVUsR0FBSzFLLEVBQ2YwSyxFQUFVLEdBQUt6SyxFQUVSeUssSUFHWEEsRUFBVSxHQUFLMUssRUFDZjBLLEVBQVUsR0FBS2lELEVBRVJqRCxFQUNYLENBaUdHLEVBRUQsU0FBVXpaLEVBQVFELEVBQVMsR0FRakMsSUFBSTZaLEVBQU8sQ0FBQyxFQUVaNVosRUFBT0QsUUFBVTZaLEVBRWpCLElBQUlxRCxFQUFVLEVBQW9CLElBVzlCckQsRUFBS2hZLE9BQVMsU0FBU3NYLEVBQVdnRSxHQUM5QixJQUFJL0QsRUFBUUQsRUFBVUMsTUFDbEJDLEVBQVFGLEVBQVVFLE1BRWxCSixFQUFPLENBQ1B4SSxHQUFJb0osRUFBS3BKLEdBQUcySSxFQUFPQyxHQUNuQkQsTUFBT0EsRUFDUEMsTUFBT0EsRUFDUEYsVUFBV0EsRUFDWGlFLFNBQVUsR0FDVkMsZUFBZ0IsR0FDaEJDLFdBQVksRUFDWnBFLFVBQVUsRUFDVnFFLGlCQUFpQixFQUNqQnBKLFNBQVVpRixFQUFNakYsVUFBWWtGLEVBQU1sRixTQUNsQ3FKLFlBQWFMLEVBQ2JNLFlBQWFOLEVBQ2I5RixZQUFhLEVBQ2I1QyxTQUFVLEVBQ1ZDLGVBQWdCLEVBQ2hCRixZQUFhLEVBQ2JRLEtBQU0sR0FLVixPQUZBNkUsRUFBSzFRLE9BQU84UCxFQUFNRSxFQUFXZ0UsR0FFdEJsRSxDQUNYLEVBU0FZLEVBQUsxUSxPQUFTLFNBQVM4UCxFQUFNRSxFQUFXZ0UsR0FDcEMsSUFBSUMsRUFBV25FLEVBQUttRSxTQUNoQjdDLEVBQVdwQixFQUFVb0IsU0FDckI4QyxFQUFpQnBFLEVBQUtvRSxlQUN0QnBELEVBQVVkLEVBQVVjLFFBQ3BCQyxFQUFVZixFQUFVZSxRQUNwQndELEVBQXdCekQsRUFBUWxSLFNBQVMzRixPQUU3QzZWLEVBQUtDLFVBQVcsRUFDaEJELEVBQUt3RSxZQUFjTixFQUNuQmxFLEVBQUtFLFVBQVlBLEVBQ2pCRixFQUFLcUUsV0FBYW5FLEVBQVVnQixNQUM1QmxCLEVBQUs1QixZQUFjNEMsRUFBUTVDLFlBQWM2QyxFQUFRN0MsWUFDakQ0QixFQUFLeEUsU0FBV3dGLEVBQVF4RixTQUFXeUYsRUFBUXpGLFNBQVd3RixFQUFReEYsU0FBV3lGLEVBQVF6RixTQUNqRndFLEVBQUt2RSxlQUFpQnVGLEVBQVF2RixlQUFpQndGLEVBQVF4RixlQUFpQnVGLEVBQVF2RixlQUFpQndGLEVBQVF4RixlQUN6R3VFLEVBQUt6RSxZQUFjeUYsRUFBUXpGLFlBQWMwRixFQUFRMUYsWUFBY3lGLEVBQVF6RixZQUFjMEYsRUFBUTFGLFlBQzdGeUUsRUFBS2pFLEtBQU9pRixFQUFRakYsS0FBT2tGLEVBQVFsRixLQUFPaUYsRUFBUWpGLEtBQU9rRixFQUFRbEYsS0FFakVtRSxFQUFVRixLQUFPQSxFQUNqQm9FLEVBQWVqYSxPQUFTLEVBRXhCLElBQUssSUFBSTVDLEVBQUksRUFBR0EsRUFBSStaLEVBQVNuWCxPQUFRNUMsSUFBSyxDQUN0QyxJQUFJbWQsRUFBVXBELEVBQVMvWixHQUNuQm9kLEVBQVlELEVBQVE1UixPQUFTa08sRUFBVTBELEVBQVEzUixNQUFRMFIsRUFBd0JDLEVBQVEzUixNQUN2RjZSLEVBQVVULEVBQVNRLEdBRW5CQyxFQUNBUixFQUFlM1osS0FBS21hLEdBRXBCUixFQUFlM1osS0FBSzBaLEVBQVNRLEdBQWFWLEVBQVFyYixPQUFPOGIsR0FFakUsQ0FDSixFQVNBOUQsRUFBS2lFLFVBQVksU0FBUzdFLEVBQU1DLEVBQVVpRSxHQUNsQ2pFLEdBQ0FELEVBQUtDLFVBQVcsRUFDaEJELEVBQUt3RSxZQUFjTixJQUVuQmxFLEVBQUtDLFVBQVcsRUFDaEJELEVBQUtvRSxlQUFlamEsT0FBUyxFQUVyQyxFQVNBeVcsRUFBS3BKLEdBQUssU0FBUzJJLEVBQU9DLEdBQ3RCLE9BQUlELEVBQU0zSSxHQUFLNEksRUFBTTVJLEdBQ1YsSUFBTTJJLEVBQU0zSSxHQUFLLElBQU00SSxFQUFNNUksR0FFN0IsSUFBTTRJLEVBQU01SSxHQUFLLElBQU0ySSxFQUFNM0ksRUFFNUMsQ0FLRyxFQUVELFNBQVV4USxFQUFRRCxFQUFTLEdBWWpDLElBQUkrZCxFQUFhLENBQUMsRUFFbEI5ZCxFQUFPRCxRQUFVK2QsRUFFakIsSUFBSWxTLEVBQVcsRUFBb0IsR0FDL0IzQixFQUFTLEVBQW9CLEdBQzdCa0osRUFBVyxFQUFvQixHQUMvQnRLLEVBQVMsRUFBb0IsR0FDN0J1SyxFQUFPLEVBQW9CLElBQzNCOVEsRUFBUyxFQUFvQixHQUk3QndiLEVBQVdDLFNBQVcsR0FDdEJELEVBQVdFLGNBQWdCLEVBQzNCRixFQUFXRyxXQUFhLEtBYXhCSCxFQUFXbGMsT0FBUyxTQUFTMk8sR0FDekIsSUFBSXVCLEVBQWF2QixFQUdidUIsRUFBV3FILFFBQVVySCxFQUFXb00sU0FDaENwTSxFQUFXb00sT0FBUyxDQUFFbFYsRUFBRyxFQUFHQyxFQUFHLElBQy9CNkksRUFBV3NILFFBQVV0SCxFQUFXcU0sU0FDaENyTSxFQUFXcU0sT0FBUyxDQUFFblYsRUFBRyxFQUFHQyxFQUFHLElBR25DLElBQUltVixFQUFnQnRNLEVBQVdxSCxNQUFRbFAsRUFBT2lCLElBQUk0RyxFQUFXcUgsTUFBTXJQLFNBQVVnSSxFQUFXb00sUUFBVXBNLEVBQVdvTSxPQUN6R0csRUFBZ0J2TSxFQUFXc0gsTUFBUW5QLEVBQU9pQixJQUFJNEcsRUFBV3NILE1BQU10UCxTQUFVZ0ksRUFBV3FNLFFBQVVyTSxFQUFXcU0sT0FDekdoYixFQUFTOEcsRUFBT0MsVUFBVUQsRUFBT2tCLElBQUlpVCxFQUFlQyxJQUV4RHZNLEVBQVczTyxZQUFzQyxJQUF0QjJPLEVBQVczTyxPQUF5QjJPLEVBQVczTyxPQUFTQSxFQUduRjJPLEVBQVd0QixHQUFLc0IsRUFBV3RCLElBQU1sTyxFQUFPMkUsU0FDeEM2SyxFQUFXZixNQUFRZSxFQUFXZixPQUFTLGFBQ3ZDZSxFQUFXckIsS0FBTyxhQUNsQnFCLEVBQVd3TSxVQUFZeE0sRUFBV3dNLFlBQWN4TSxFQUFXM08sT0FBUyxFQUFJLEVBQUksSUFDNUUyTyxFQUFXeU0sUUFBVXpNLEVBQVd5TSxTQUFXLEVBQzNDek0sRUFBVzBNLGlCQUFtQjFNLEVBQVcwTSxrQkFBb0IsRUFDN0QxTSxFQUFXMk0sT0FBUzNNLEVBQVdxSCxNQUFRckgsRUFBV3FILE1BQU03TyxNQUFRd0gsRUFBVzJNLE9BQzNFM00sRUFBVzRNLE9BQVM1TSxFQUFXc0gsTUFBUXRILEVBQVdzSCxNQUFNOU8sTUFBUXdILEVBQVc0TSxPQUMzRTVNLEVBQVdkLE9BQVMsQ0FBQyxFQUdyQixJQUFJaUUsRUFBUyxDQUNUQyxTQUFTLEVBQ1RJLFVBQVcsRUFDWEYsWUFBYSxVQUNiM0UsS0FBTSxPQUNOa08sU0FBUyxHQVliLE9BVDBCLElBQXRCN00sRUFBVzNPLFFBQWdCMk8sRUFBV3dNLFVBQVksSUFDbERySixFQUFPeEUsS0FBTyxNQUNkd0UsRUFBTzBKLFNBQVUsR0FDVjdNLEVBQVd3TSxVQUFZLEtBQzlCckosRUFBT3hFLEtBQU8sVUFHbEJxQixFQUFXbUQsT0FBUzNTLEVBQU9PLE9BQU9vUyxFQUFRbkQsRUFBV21ELFFBRTlDbkQsQ0FDWCxFQVFBZ00sRUFBV2MsWUFBYyxTQUFTaE8sR0FDOUIsSUFBSyxJQUFJclEsRUFBSSxFQUFHQSxFQUFJcVEsRUFBT3pOLE9BQVE1QyxHQUFLLEVBQUcsQ0FDdkMsSUFBSXVMLEVBQU84RSxFQUFPclEsR0FDZHNlLEVBQVUvUyxFQUFLK0gsa0JBRWYvSCxFQUFLOEcsVUFBMkIsSUFBZGlNLEVBQVE3VixHQUF5QixJQUFkNlYsRUFBUTVWLEdBQTZCLElBQWxCNFYsRUFBUXZVLFFBSXBFd0IsRUFBS2hDLFNBQVNkLEdBQUs2VixFQUFRN1YsRUFDM0I4QyxFQUFLaEMsU0FBU2IsR0FBSzRWLEVBQVE1VixFQUMzQjZDLEVBQUt4QixPQUFTdVUsRUFBUXZVLE1BQzFCLENBQ0osRUFTQXdULEVBQVdnQixTQUFXLFNBQVNqTyxFQUFhbUUsR0FFeEMsSUFBSyxJQUFJelUsRUFBSSxFQUFHQSxFQUFJc1EsRUFBWTFOLE9BQVE1QyxHQUFLLEVBQUcsQ0FDNUMsSUFBSXVSLEVBQWFqQixFQUFZdFEsR0FDekJ3ZSxHQUFVak4sRUFBV3FILE9BQVVySCxFQUFXcUgsT0FBU3JILEVBQVdxSCxNQUFNdkcsU0FDcEVvTSxHQUFVbE4sRUFBV3NILE9BQVV0SCxFQUFXc0gsT0FBU3RILEVBQVdzSCxNQUFNeEcsVUFFcEVtTSxHQUFVQyxJQUNWbEIsRUFBV21CLE1BQU1wTyxFQUFZdFEsR0FBSXlVLEVBRXpDLENBR0EsSUFBS3pVLEVBQUksRUFBR0EsRUFBSXNRLEVBQVkxTixPQUFRNUMsR0FBSyxFQUVyQ3dlLElBREFqTixFQUFhakIsRUFBWXRRLElBQ0o0WSxPQUFVckgsRUFBV3FILE9BQVNySCxFQUFXcUgsTUFBTXZHLFNBQ3BFb00sR0FBVWxOLEVBQVdzSCxPQUFVdEgsRUFBV3NILE9BQVN0SCxFQUFXc0gsTUFBTXhHLFNBRS9EbU0sR0FBV0MsR0FDWmxCLEVBQVdtQixNQUFNcE8sRUFBWXRRLEdBQUl5VSxFQUc3QyxFQVNBOEksRUFBV21CLE1BQVEsU0FBU25OLEVBQVlrRCxHQUNwQyxJQUFJbUUsRUFBUXJILEVBQVdxSCxNQUNuQkMsRUFBUXRILEVBQVdzSCxNQUNuQjhFLEVBQVNwTSxFQUFXb00sT0FDcEJDLEVBQVNyTSxFQUFXcU0sT0FFeEIsR0FBS2hGLEdBQVVDLEVBQWYsQ0FJSUQsSUFBVUEsRUFBTXZHLFdBQ2hCM0ksRUFBT0ksT0FBTzZULEVBQVEvRSxFQUFNN08sTUFBUXdILEVBQVcyTSxPQUFRUCxHQUN2RHBNLEVBQVcyTSxPQUFTdEYsRUFBTTdPLE9BSTFCOE8sSUFBVUEsRUFBTXhHLFdBQ2hCM0ksRUFBT0ksT0FBTzhULEVBQVEvRSxFQUFNOU8sTUFBUXdILEVBQVc0TSxPQUFRUCxHQUN2RHJNLEVBQVc0TSxPQUFTdEYsRUFBTTlPLE9BRzlCLElBQUk0VSxFQUFjaEIsRUFDZGlCLEVBQWNoQixFQUtsQixHQUhJaEYsSUFBTytGLEVBQWNqVixFQUFPaUIsSUFBSWlPLEVBQU1yUCxTQUFVb1UsSUFDaEQ5RSxJQUFPK0YsRUFBY2xWLEVBQU9pQixJQUFJa08sRUFBTXRQLFNBQVVxVSxJQUUvQ2UsR0FBZ0JDLEVBQXJCLENBR0EsSUFBSXpSLEVBQVF6RCxFQUFPa0IsSUFBSStULEVBQWFDLEdBQ2hDQyxFQUFnQm5WLEVBQU9DLFVBQVV3RCxHQUdqQzBSLEVBQWdCdEIsRUFBV0csYUFDM0JtQixFQUFnQnRCLEVBQVdHLFlBSS9CLElBTUl0SyxFQUNBMEwsRUFDQWxGLEVBQ0FtRixFQUNBQyxFQVZBQyxHQUFjSixFQUFnQnROLEVBQVczTyxRQUFVaWMsRUFDbkRkLEVBQVl4TSxFQUFXd00sVUFBWSxFQUFJeE0sRUFBV3dNLFVBQVl0SixFQUFZbEQsRUFBV3dNLFVBQ3JGNUssRUFBUXpKLEVBQU9tQixLQUFLc0MsRUFBTzhSLEVBQWFsQixHQUN4Q21CLEdBQWF0RyxFQUFRQSxFQUFNL0IsWUFBYyxJQUFNZ0MsRUFBUUEsRUFBTWhDLFlBQWMsR0FFM0VzSSxFQUFrQkQsSUFERnRHLEVBQVFBLEVBQU05QixlQUFpQixJQUFNK0IsRUFBUUEsRUFBTS9CLGVBQWlCLElBUXhGLEdBQUl2RixFQUFXeU0sUUFBUyxDQUNwQixJQUFJb0IsRUFBTzFWLEVBQU9ySSxTQUNsQnVZLEVBQVNsUSxFQUFPcUIsSUFBSW9DLEVBQU8wUixHQUUzQkcsRUFBbUJ0VixFQUFPa0IsSUFDdEJpTyxHQUFTblAsRUFBT2tCLElBQUlpTyxFQUFNdFAsU0FBVXNQLEVBQU12RCxlQUFpQjhKLEVBQzNEeEcsR0FBU2xQLEVBQU9rQixJQUFJZ08sRUFBTXJQLFNBQVVxUCxFQUFNdEQsZUFBaUI4SixHQUcvREwsRUFBaUJyVixFQUFPVyxJQUFJdVAsRUFBUW9GLEVBQ3hDLENBRUlwRyxJQUFVQSxFQUFNdkcsV0FDaEJ5TSxFQUFRbEcsRUFBTS9CLFlBQWNxSSxFQUc1QnRHLEVBQU10RixrQkFBa0I3SyxHQUFLMEssRUFBTTFLLEVBQUlxVyxFQUN2Q2xHLEVBQU10RixrQkFBa0I1SyxHQUFLeUssRUFBTXpLLEVBQUlvVyxFQUd2Q2xHLEVBQU1yUCxTQUFTZCxHQUFLMEssRUFBTTFLLEVBQUlxVyxFQUM5QmxHLEVBQU1yUCxTQUFTYixHQUFLeUssRUFBTXpLLEVBQUlvVyxFQUcxQnZOLEVBQVd5TSxVQUNYcEYsRUFBTXRELGFBQWE3TSxHQUFLOEksRUFBV3lNLFFBQVVwRSxFQUFPblIsRUFBSXNXLEVBQWlCRCxFQUN6RWxHLEVBQU10RCxhQUFhNU0sR0FBSzZJLEVBQVd5TSxRQUFVcEUsRUFBT2xSLEVBQUlxVyxFQUFpQkQsR0FJN0UxTCxFQUFVMUosRUFBT2MsTUFBTW1ULEVBQVF4SyxHQUFTZ00sRUFBbUI1QixFQUFXRSxjQUFnQjdFLEVBQU05QixnQkFBa0IsRUFBSXZGLEVBQVcwTSxrQkFDN0hyRixFQUFNdEYsa0JBQWtCdkosT0FBU3FKLEVBQ2pDd0YsRUFBTTdPLE9BQVNxSixHQUdmeUYsSUFBVUEsRUFBTXhHLFdBQ2hCeU0sRUFBUWpHLEVBQU1oQyxZQUFjcUksRUFHNUJyRyxFQUFNdkYsa0JBQWtCN0ssR0FBSzBLLEVBQU0xSyxFQUFJcVcsRUFDdkNqRyxFQUFNdkYsa0JBQWtCNUssR0FBS3lLLEVBQU16SyxFQUFJb1csRUFHdkNqRyxFQUFNdFAsU0FBU2QsR0FBSzBLLEVBQU0xSyxFQUFJcVcsRUFDOUJqRyxFQUFNdFAsU0FBU2IsR0FBS3lLLEVBQU16SyxFQUFJb1csRUFHMUJ2TixFQUFXeU0sVUFDWG5GLEVBQU12RCxhQUFhN00sR0FBSzhJLEVBQVd5TSxRQUFVcEUsRUFBT25SLEVBQUlzVyxFQUFpQkQsRUFDekVqRyxFQUFNdkQsYUFBYTVNLEdBQUs2SSxFQUFXeU0sUUFBVXBFLEVBQU9sUixFQUFJcVcsRUFBaUJELEdBSTdFMUwsRUFBVTFKLEVBQU9jLE1BQU1vVCxFQUFRekssR0FBU2dNLEVBQW1CNUIsRUFBV0UsY0FBZ0I1RSxFQUFNL0IsZ0JBQWtCLEVBQUl2RixFQUFXME0sa0JBQzdIcEYsRUFBTXZGLGtCQUFrQnZKLE9BQVNxSixFQUNqQ3lGLEVBQU05TyxPQUFTcUosRUE5RVQsQ0FyQkEsQ0FzR2QsRUFRQW1LLEVBQVc4QixhQUFlLFNBQVNoUCxHQUMvQixJQUFLLElBQUlyUSxFQUFJLEVBQUdBLEVBQUlxUSxFQUFPek4sT0FBUTVDLElBQUssQ0FDcEMsSUFBSXVMLEVBQU84RSxFQUFPclEsR0FDZHNlLEVBQVUvUyxFQUFLK0gsa0JBRW5CLEtBQUkvSCxFQUFLOEcsVUFBMkIsSUFBZGlNLEVBQVE3VixHQUF5QixJQUFkNlYsRUFBUTVWLEdBQTZCLElBQWxCNFYsRUFBUXZVLE9BQXBFLENBSUE2SSxFQUFTblAsSUFBSThILEdBQU0sR0FHbkIsSUFBSyxJQUFJekgsRUFBSSxFQUFHQSxFQUFJeUgsRUFBSzVILE1BQU1mLE9BQVFrQixJQUFLLENBQ3hDLElBQUk4UyxFQUFPckwsRUFBSzVILE1BQU1HLEdBRXRCdUgsRUFBU2pDLFVBQVV3TixFQUFLck8sU0FBVStWLEdBRTlCeGEsRUFBSSxJQUNKOFMsRUFBS3JOLFNBQVNkLEdBQUs2VixFQUFRN1YsRUFDM0JtTyxFQUFLck4sU0FBU2IsR0FBSzRWLEVBQVE1VixHQUdULElBQWxCNFYsRUFBUXZVLFFBQ1JzQixFQUFTdkIsT0FBTzhNLEVBQUtyTyxTQUFVK1YsRUFBUXZVLE1BQU93QixFQUFLaEMsVUFDbkRzSixFQUFLL0ksT0FBTzhNLEVBQUtwQixLQUFNOEksRUFBUXZVLE9BQzNCakcsRUFBSSxHQUNKNEYsRUFBT1MsWUFBWXlNLEVBQUtyTixTQUFVK1UsRUFBUXZVLE1BQU93QixFQUFLaEMsU0FBVXFOLEVBQUtyTixXQUk3RWpCLEVBQU9LLE9BQU9pTyxFQUFLcE8sT0FBUW9PLEVBQUtyTyxTQUFVZ0QsRUFBSzNDLFNBQ25ELENBR0EwVixFQUFRdlUsT0FBU3dULEVBQVdDLFNBQzVCYyxFQUFRN1YsR0FBSzhVLEVBQVdDLFNBQ3hCYyxFQUFRNVYsR0FBSzZVLEVBQVdDLFFBN0J4QixDQThCSixDQUNKLEVBUUFELEVBQVdvQixZQUFjLFNBQVNwTixHQUM5QixNQUFPLENBQ0g5SSxHQUFJOEksRUFBV3FILE1BQVFySCxFQUFXcUgsTUFBTXJQLFNBQVNkLEVBQUksR0FBSzhJLEVBQVdvTSxPQUFPbFYsRUFDNUVDLEdBQUk2SSxFQUFXcUgsTUFBUXJILEVBQVdxSCxNQUFNclAsU0FBU2IsRUFBSSxHQUFLNkksRUFBV29NLE9BQU9qVixFQUVwRixFQVFBNlUsRUFBV3FCLFlBQWMsU0FBU3JOLEdBQzlCLE1BQU8sQ0FDSDlJLEdBQUk4SSxFQUFXc0gsTUFBUXRILEVBQVdzSCxNQUFNdFAsU0FBU2QsRUFBSSxHQUFLOEksRUFBV3FNLE9BQU9uVixFQUM1RUMsR0FBSTZJLEVBQVdzSCxNQUFRdEgsRUFBV3NILE1BQU10UCxTQUFTYixFQUFJLEdBQUs2SSxFQUFXcU0sT0FBT2xWLEVBRXBGLENBMkpHLEVBRUQsU0FBVWpKLEVBQVFELEVBQVMsR0FRakMsSUFBSXFULEVBQU8sQ0FBQyxFQUVacFQsRUFBT0QsUUFBVXFULEVBRWpCLElBQUluSixFQUFTLEVBQW9CLEdBQzdCM0gsRUFBUyxFQUFvQixHQVU3QjhRLEVBQUttRSxhQUFlLFNBQVN6TyxHQUl6QixJQUhBLElBQUlpTixFQUFPLENBQUMsRUFHSHhWLEVBQUksRUFBR0EsRUFBSXVJLEVBQVMzRixPQUFRNUMsSUFBSyxDQUN0QyxJQUFJOEQsR0FBSzlELEVBQUksR0FBS3VJLEVBQVMzRixPQUN2QmdYLEVBQVNsUSxFQUFPVSxVQUFVLENBQ3RCM0IsRUFBR0YsRUFBU3pFLEdBQUc0RSxFQUFJSCxFQUFTdkksR0FBRzBJLEVBQy9CQSxFQUFHSCxFQUFTdkksR0FBR3lJLEVBQUlGLEVBQVN6RSxHQUFHMkUsSUFFbkM2VyxFQUF5QixJQUFiMUYsRUFBT2xSLEVBQVdHLElBQVkrUSxFQUFPblIsRUFBSW1SLEVBQU9sUixFQUloRThNLEVBREE4SixFQUFXQSxFQUFTQyxRQUFRLEdBQUc3YSxZQUNka1YsQ0FDckIsQ0FFQSxPQUFPN1gsRUFBT29CLE9BQU9xUyxFQUN6QixFQVFBM0MsRUFBSy9JLE9BQVMsU0FBUzBMLEVBQU16TCxHQUN6QixHQUFjLElBQVZBLEVBTUosSUFIQSxJQUFJRSxFQUFNbEcsS0FBS2tHLElBQUlGLEdBQ2ZHLEVBQU1uRyxLQUFLbUcsSUFBSUgsR0FFVi9KLEVBQUksRUFBR0EsRUFBSXdWLEVBQUs1UyxPQUFRNUMsSUFBSyxDQUNsQyxJQUNJd2YsRUFEQWpHLEVBQU8vRCxFQUFLeFYsR0FFaEJ3ZixFQUFLakcsRUFBSzlRLEVBQUl3QixFQUFNc1AsRUFBSzdRLEVBQUl3QixFQUM3QnFQLEVBQUs3USxFQUFJNlEsRUFBSzlRLEVBQUl5QixFQUFNcVAsRUFBSzdRLEVBQUl1QixFQUNqQ3NQLEVBQUs5USxFQUFJK1csQ0FDYixDQUNKLENBS0csRUFFRCxTQUFVL2YsRUFBUUQsRUFBUyxHQWFqQyxJQUFJaWdCLEVBQVMsQ0FBQyxFQUVkaGdCLEVBQU9ELFFBQVVpZ0IsRUFFakIsSUFBSXBVLEVBQVcsRUFBb0IsR0FDL0J0SixFQUFTLEVBQW9CLEdBQzdCZ08sRUFBTyxFQUFvQixHQUMzQnpILEVBQVMsRUFBb0IsR0FDN0JvQixFQUFTLEVBQW9CLEdBZ0I3QitWLEVBQU9DLFVBQVksU0FBU2pYLEVBQUdDLEVBQUdpWCxFQUFPQyxFQUFRNVAsR0FDN0NBLEVBQVVBLEdBQVcsQ0FBQyxFQUV0QixJQUFJMFAsRUFBWSxDQUNabFAsTUFBTyxpQkFDUGpILFNBQVUsQ0FBRWQsRUFBR0EsRUFBR0MsRUFBR0EsR0FDckJILFNBQVU4QyxFQUFTSyxTQUFTLFdBQWFpVSxFQUFRLFFBQVVBLEVBQVEsSUFBTUMsRUFBUyxRQUFVQSxJQUdoRyxHQUFJNVAsRUFBUTVDLFFBQVMsQ0FDakIsSUFBSUEsRUFBVTRDLEVBQVE1QyxRQUN0QnNTLEVBQVVuWCxTQUFXOEMsRUFBUytCLFFBQVFzUyxFQUFVblgsU0FBVTZFLEVBQVFDLE9BQzlERCxFQUFRRSxRQUFTRixFQUFRRyxXQUFZSCxFQUFRSSxtQkFDMUN3QyxFQUFRNUMsT0FDbkIsQ0FFQSxPQUFPMkMsRUFBSzFPLE9BQU9VLEVBQU9PLE9BQU8sQ0FBQyxFQUFHb2QsRUFBVzFQLEdBQ3BELEVBZUF5UCxFQUFPSSxVQUFZLFNBQVNwWCxFQUFHQyxFQUFHaVgsRUFBT0MsRUFBUUUsRUFBTzlQLEdBQ3BEQSxFQUFVQSxHQUFXLENBQUMsRUFHdEIsSUFLSStQLEVBSEFDLEVBQUtMLEdBSFRHLEdBQVMsSUFJTEcsRUFBS0QsR0FIRyxFQUFhLEVBQVJGLEdBQWNILEVBSTNCTyxFQUFLRCxFQUFLRCxFQUlWRCxFQURBRCxFQUFRLEdBQ08sV0FBYUUsRUFBSyxLQUFRSixFQUFVLE1BQVFLLEVBQUssS0FBUUwsRUFBVSxNQUFRTSxFQUFLLEtBRWhGLFdBQWFELEVBQUssS0FBUUwsRUFBVSxNQUFRTSxFQUFLLEtBR3BFLElBQUlMLEVBQVksQ0FDWnJQLE1BQU8saUJBQ1BqSCxTQUFVLENBQUVkLEVBQUdBLEVBQUdDLEVBQUdBLEdBQ3JCSCxTQUFVOEMsRUFBU0ssU0FBU3FVLElBR2hDLEdBQUkvUCxFQUFRNUMsUUFBUyxDQUNqQixJQUFJQSxFQUFVNEMsRUFBUTVDLFFBQ3RCeVMsRUFBVXRYLFNBQVc4QyxFQUFTK0IsUUFBUXlTLEVBQVV0WCxTQUFVNkUsRUFBUUMsT0FDOURELEVBQVFFLFFBQVNGLEVBQVFHLFdBQVlILEVBQVFJLG1CQUMxQ3dDLEVBQVE1QyxPQUNuQixDQUVBLE9BQU8yQyxFQUFLMU8sT0FBT1UsRUFBT08sT0FBTyxDQUFDLEVBQUd1ZCxFQUFXN1AsR0FDcEQsRUFjQXlQLEVBQU9VLE9BQVMsU0FBUzFYLEVBQUdDLEVBQUcyRSxFQUFRMkMsRUFBU29RLEdBQzVDcFEsRUFBVUEsR0FBVyxDQUFDLEVBRXRCLElBQUltUSxFQUFTLENBQ1QzUCxNQUFPLGNBQ1A2RSxhQUFjaEksR0FJbEIrUyxFQUFXQSxHQUFZLEdBQ3ZCLElBQUlDLEVBQVF0YyxLQUFLdWMsS0FBS3ZjLEtBQUtpQixJQUFJLEdBQUlqQixLQUFLZ0IsSUFBSXFiLEVBQVUvUyxLQU10RCxPQUhJZ1QsRUFBUSxHQUFNLElBQ2RBLEdBQVMsR0FFTlosRUFBT2MsUUFBUTlYLEVBQUdDLEVBQUcyWCxFQUFPaFQsRUFBUXRMLEVBQU9PLE9BQU8sQ0FBQyxFQUFHNmQsRUFBUW5RLEdBQ3pFLEVBY0F5UCxFQUFPYyxRQUFVLFNBQVM5WCxFQUFHQyxFQUFHMlgsRUFBT2hULEVBQVEyQyxHQUczQyxHQUZBQSxFQUFVQSxHQUFXLENBQUMsRUFFbEJxUSxFQUFRLEVBQ1IsT0FBT1osRUFBT1UsT0FBTzFYLEVBQUdDLEVBQUcyRSxFQUFRMkMsR0FNdkMsSUFKQSxJQUFJNUIsRUFBUSxFQUFJckssS0FBS3ljLEdBQUtILEVBQ3RCamQsRUFBTyxHQUNQMFUsRUFBaUIsR0FBUjFKLEVBRUpwTyxFQUFJLEVBQUdBLEVBQUlxZ0IsRUFBT3JnQixHQUFLLEVBQUcsQ0FDL0IsSUFBSStKLEVBQVErTixFQUFVOVgsRUFBSW9PLEVBQ3RCb1IsRUFBS3piLEtBQUtrRyxJQUFJRixHQUFTc0QsRUFDdkJvVCxFQUFLMWMsS0FBS21HLElBQUlILEdBQVNzRCxFQUUzQmpLLEdBQVEsS0FBT29jLEVBQUdELFFBQVEsR0FBSyxJQUFNa0IsRUFBR2xCLFFBQVEsR0FBSyxHQUN6RCxDQUVBLElBQUlnQixFQUFVLENBQ1YvUCxNQUFPLGVBQ1BqSCxTQUFVLENBQUVkLEVBQUdBLEVBQUdDLEVBQUdBLEdBQ3JCSCxTQUFVOEMsRUFBU0ssU0FBU3RJLElBR2hDLEdBQUk0TSxFQUFRNUMsUUFBUyxDQUNqQixJQUFJQSxFQUFVNEMsRUFBUTVDLFFBQ3RCbVQsRUFBUWhZLFNBQVc4QyxFQUFTK0IsUUFBUW1ULEVBQVFoWSxTQUFVNkUsRUFBUUMsT0FDMURELEVBQVFFLFFBQVNGLEVBQVFHLFdBQVlILEVBQVFJLG1CQUMxQ3dDLEVBQVE1QyxPQUNuQixDQUVBLE9BQU8yQyxFQUFLMU8sT0FBT1UsRUFBT08sT0FBTyxDQUFDLEVBQUdpZSxFQUFTdlEsR0FDbEQsRUFvQ0F5UCxFQUFPekksYUFBZSxTQUFTdk8sRUFBR0MsRUFBR2dZLEVBQVkxUSxFQUFTMlEsRUFBY0MsRUFBaUJDLEVBQWFDLEdBQ2xHLElBQ0lDLEVBQ0F4VixFQUNBNUgsRUFDQStLLEVBRUFuRyxFQUNBdkksRUFDQThELEVBQ0E2SyxFQUNBcEMsRUFDQXFDLEVBWEExRyxFQUFTbkcsRUFBT29HLFlBNkJwQixJQWZBNFksRUFBWUMsUUFBUTlZLEdBQVVBLEVBQU8rWSxhQUVyQ2pSLEVBQVVBLEdBQVcsQ0FBQyxFQUN0QnJNLEVBQVEsR0FFUmdkLE9BQXVDLElBQWpCQSxHQUErQkEsRUFDckRDLE9BQTZDLElBQXBCQSxFQUFrQ0EsRUFBa0IsSUFDN0VDLE9BQXFDLElBQWhCQSxFQUE4QkEsRUFBYyxHQUNqRUMsT0FBeUQsSUFBMUJBLEVBQXdDQSxFQUF3QixJQUcxRi9lLEVBQU8wQyxRQUFRaWMsRUFBVyxNQUMzQkEsRUFBYSxDQUFDQSxJQUdiblUsRUFBSSxFQUFHQSxFQUFJbVUsRUFBVzlkLE9BQVEySixHQUFLLEVBV3BDLEdBVkFoRSxFQUFXbVksRUFBV25VLEtBQ3RCbUMsRUFBV3JELEVBQVNxRCxTQUFTbkcsTUFHWHdZLEdBQ2RoZixFQUFPcUUsU0FDSCxrSkFJSnNJLElBQWFxUyxFQUVUeFksRUFEQW1HLEVBQ1dyRCxFQUFTaUQsY0FBYy9GLEdBR3ZCOEMsRUFBU3lELEtBQUt2RyxHQUc3QjVFLEVBQU1ULEtBQUssQ0FDUHFHLFNBQVUsQ0FBRWQsRUFBR0EsRUFBR0MsRUFBR0EsR0FDckJILFNBQVVBLFFBRVgsQ0FFSCxJQUFJMlksRUFBVTNZLEVBQVN6QixLQUFJLFNBQVNnQyxHQUNoQyxNQUFPLENBQUNBLEVBQU9MLEVBQUdLLEVBQU9KLEVBQzdCLElBR0FSLEVBQU9pWixRQUFRRCxJQUNTLElBQXBCTixHQUNBMVksRUFBT2taLHNCQUFzQkYsRUFBU04sSUFDWixJQUExQkUsR0FBbUM1WSxFQUFPNFksdUJBQzFDNVksRUFBTzRZLHNCQUFzQkksRUFBU0osR0FHMUMsSUFBSU8sRUFBYW5aLEVBQU8rWSxZQUFZQyxHQUdwQyxJQUFLbGhCLEVBQUksRUFBR0EsRUFBSXFoQixFQUFXemUsT0FBUTVDLElBQUssQ0FDcEMsSUFHSXNoQixFQUhRRCxFQUFXcmhCLEdBR0c4RyxLQUFJLFNBQVN5QixHQUNuQyxNQUFPLENBQ0hFLEVBQUdGLEVBQVMsR0FDWkcsRUFBR0gsRUFBUyxHQUVwQixJQUdJc1ksRUFBYyxHQUFLeFYsRUFBU1MsS0FBS3dWLEdBQWlCVCxHQUl0RGxkLEVBQU1ULEtBQUssQ0FDUHFHLFNBQVU4QixFQUFTUSxPQUFPeVYsR0FDMUIvWSxTQUFVK1ksR0FFbEIsQ0FDSixDQUlKLElBQUt0aEIsRUFBSSxFQUFHQSxFQUFJMkQsRUFBTWYsT0FBUTVDLElBQzFCMkQsRUFBTTNELEdBQUsrUCxFQUFLMU8sT0FBT1UsRUFBT08sT0FBT3FCLEVBQU0zRCxHQUFJZ1EsSUFJbkQsR0FBSTJRLEVBR0EsSUFBSzNnQixFQUFJLEVBQUdBLEVBQUkyRCxFQUFNZixPQUFRNUMsSUFBSyxDQUMvQixJQUFJdWhCLEVBQVE1ZCxFQUFNM0QsR0FFbEIsSUFBSzhELEVBQUk5RCxFQUFJLEVBQUc4RCxFQUFJSCxFQUFNZixPQUFRa0IsSUFBSyxDQUNuQyxJQUFJMGQsRUFBUTdkLEVBQU1HLEdBRWxCLEdBQUl3RSxFQUFPVyxTQUFTc1ksRUFBTS9ZLE9BQVFnWixFQUFNaFosUUFBUyxDQUM3QyxJQUFJaVosRUFBTUYsRUFBTWhaLFNBQ1ptWixFQUFNRixFQUFNalosU0FHaEIsSUFBS29HLEVBQUksRUFBR0EsRUFBSTRTLEVBQU1oWixTQUFTM0YsT0FBUStMLElBQ25DLElBQUtDLEVBQUksRUFBR0EsRUFBSTRTLEVBQU1qWixTQUFTM0YsT0FBUWdNLElBQUssQ0FFeEMsSUFBSStTLEVBQUtqWSxFQUFPRyxpQkFBaUJILEVBQU9rQixJQUFJNlcsR0FBSzlTLEVBQUksR0FBSzhTLEVBQUk3ZSxRQUFTOGUsRUFBSTlTLEtBQ3ZFZ1QsRUFBS2xZLEVBQU9HLGlCQUFpQkgsRUFBT2tCLElBQUk2VyxFQUFJOVMsR0FBSStTLEdBQUs5UyxFQUFJLEdBQUs4UyxFQUFJOWUsVUFHbEUrZSxFQXBCRSxHQW9CMEJDLEVBcEIxQixJQXFCRkgsRUFBSTlTLEdBQUdsRCxZQUFhLEVBQ3BCaVcsRUFBSTlTLEdBQUduRCxZQUFhLEVBRTVCLENBR1IsQ0FDSixDQUNKLENBR0osT0FBSTlILEVBQU1mLE9BQVMsR0FFZjJJLEVBQU93RSxFQUFLMU8sT0FBT1UsRUFBT08sT0FBTyxDQUFFcUIsTUFBT0EsRUFBTUgsTUFBTSxJQUFNd00sSUFHNURELEVBQUs0QyxZQUFZcEgsRUFBTSxDQUFFOUMsRUFBR0EsRUFBR0MsRUFBR0EsSUFFM0I2QyxHQUVBNUgsRUFBTSxFQUVyQixDQUtHLEVBRUQsU0FBVWxFLEVBQVFELEVBQVMsR0FRakMsSUFBSXFpQixFQUFRLENBQUMsRUFFYnBpQixFQUFPRCxRQUFVcWlCLEVBRWpCLElBQUk5ZixFQUFTLEVBQW9CLEdBVTdCOGYsRUFBTXhnQixPQUFTLFNBQVN5Z0IsR0FDcEIsSUFBSUMsRUFBUSxDQUFDLEVBcUZiLE9BbkZLRCxHQUNEL2YsRUFBTzhELElBQUksbUVBQW9FLFFBR25Ga2MsRUFBTUQsUUFBVUEsR0FBV0UsU0FBU3pXLEtBQ3BDd1csRUFBTUUsU0FBVyxDQUFFeFosRUFBRyxFQUFHQyxFQUFHLEdBQzVCcVosRUFBTXhZLFNBQVcsQ0FBRWQsRUFBRyxFQUFHQyxFQUFHLEdBQzVCcVosRUFBTUcsa0JBQW9CLENBQUV6WixFQUFHLEVBQUdDLEVBQUcsR0FDckNxWixFQUFNSSxnQkFBa0IsQ0FBRTFaLEVBQUcsRUFBR0MsRUFBRyxHQUNuQ3FaLEVBQU1qSyxPQUFTLENBQUVyUCxFQUFHLEVBQUdDLEVBQUcsR0FDMUJxWixFQUFNL1UsTUFBUSxDQUFFdkUsRUFBRyxFQUFHQyxFQUFHLEdBQ3pCcVosRUFBTUssV0FBYSxFQUNuQkwsRUFBTU0sUUFBVSxFQUNoQk4sRUFBTU8sV0FBYTNjLFNBQVNvYyxFQUFNRCxRQUFRUyxhQUFhLG9CQUFxQixLQUFPLEVBRW5GUixFQUFNUyxhQUFlLENBQ2pCQyxVQUFXLEtBQ1hDLFVBQVcsS0FDWEMsUUFBUyxLQUNUQyxXQUFZLE1BR2hCYixFQUFNVSxVQUFZLFNBQVM3UyxHQUN2QixJQUFJckcsRUFBV3NZLEVBQU1nQiwwQkFBMEJqVCxFQUFPbVMsRUFBTUQsUUFBU0MsRUFBTU8sWUFDN0QxUyxFQUFNa1QsaUJBR2hCZixFQUFNTSxPQUFTLEVBQ2Z6UyxFQUFNbVQsa0JBR1ZoQixFQUFNRSxTQUFTeFosRUFBSWMsRUFBU2QsRUFDNUJzWixFQUFNRSxTQUFTdlosRUFBSWEsRUFBU2IsRUFDNUJxWixFQUFNeFksU0FBU2QsRUFBSXNaLEVBQU1FLFNBQVN4WixFQUFJc1osRUFBTS9VLE1BQU12RSxFQUFJc1osRUFBTWpLLE9BQU9yUCxFQUNuRXNaLEVBQU14WSxTQUFTYixFQUFJcVosRUFBTUUsU0FBU3ZaLEVBQUlxWixFQUFNL1UsTUFBTXRFLEVBQUlxWixFQUFNakssT0FBT3BQLEVBQ25FcVosRUFBTVMsYUFBYUMsVUFBWTdTLENBQ25DLEVBRUFtUyxFQUFNVyxVQUFZLFNBQVM5UyxHQUN2QixJQUFJckcsRUFBV3NZLEVBQU1nQiwwQkFBMEJqVCxFQUFPbVMsRUFBTUQsUUFBU0MsRUFBTU8sWUFDN0QxUyxFQUFNa1QsZ0JBR2hCZixFQUFNTSxPQUFTLEVBQ2Z6UyxFQUFNbVQsa0JBRU5oQixFQUFNTSxPQUFTelMsRUFBTXlTLE9BR3pCTixFQUFNRSxTQUFTeFosRUFBSWMsRUFBU2QsRUFDNUJzWixFQUFNRSxTQUFTdlosRUFBSWEsRUFBU2IsRUFDNUJxWixFQUFNeFksU0FBU2QsRUFBSXNaLEVBQU1FLFNBQVN4WixFQUFJc1osRUFBTS9VLE1BQU12RSxFQUFJc1osRUFBTWpLLE9BQU9yUCxFQUNuRXNaLEVBQU14WSxTQUFTYixFQUFJcVosRUFBTUUsU0FBU3ZaLEVBQUlxWixFQUFNL1UsTUFBTXRFLEVBQUlxWixFQUFNakssT0FBT3BQLEVBQ25FcVosRUFBTUcsa0JBQWtCelosRUFBSXNaLEVBQU14WSxTQUFTZCxFQUMzQ3NaLEVBQU1HLGtCQUFrQnhaLEVBQUlxWixFQUFNeFksU0FBU2IsRUFDM0NxWixFQUFNUyxhQUFhRSxVQUFZOVMsQ0FDbkMsRUFFQW1TLEVBQU1ZLFFBQVUsU0FBUy9TLEdBQ3JCLElBQUlyRyxFQUFXc1ksRUFBTWdCLDBCQUEwQmpULEVBQU9tUyxFQUFNRCxRQUFTQyxFQUFNTyxZQUM3RDFTLEVBQU1rVCxnQkFHaEJsVCxFQUFNbVQsaUJBR1ZoQixFQUFNTSxRQUFVLEVBQ2hCTixFQUFNRSxTQUFTeFosRUFBSWMsRUFBU2QsRUFDNUJzWixFQUFNRSxTQUFTdlosRUFBSWEsRUFBU2IsRUFDNUJxWixFQUFNeFksU0FBU2QsRUFBSXNaLEVBQU1FLFNBQVN4WixFQUFJc1osRUFBTS9VLE1BQU12RSxFQUFJc1osRUFBTWpLLE9BQU9yUCxFQUNuRXNaLEVBQU14WSxTQUFTYixFQUFJcVosRUFBTUUsU0FBU3ZaLEVBQUlxWixFQUFNL1UsTUFBTXRFLEVBQUlxWixFQUFNakssT0FBT3BQLEVBQ25FcVosRUFBTUksZ0JBQWdCMVosRUFBSXNaLEVBQU14WSxTQUFTZCxFQUN6Q3NaLEVBQU1JLGdCQUFnQnpaLEVBQUlxWixFQUFNeFksU0FBU2IsRUFDekNxWixFQUFNUyxhQUFhRyxRQUFVL1MsQ0FDakMsRUFFQW1TLEVBQU1hLFdBQWEsU0FBU2hULEdBQ3hCbVMsRUFBTUssV0FBYXJlLEtBQUtpQixLQUFLLEVBQUdqQixLQUFLZ0IsSUFBSSxFQUFHNkssRUFBTXdTLGFBQWV4UyxFQUFNb1QsU0FDdkVwVCxFQUFNbVQsZ0JBQ1YsRUFFQWxCLEVBQU1vQixXQUFXbEIsRUFBT0EsRUFBTUQsU0FFdkJDLENBQ1gsRUFRQUYsRUFBTW9CLFdBQWEsU0FBU2xCLEVBQU9ELEdBQy9CQyxFQUFNRCxRQUFVQSxFQUVoQkEsRUFBUW9CLGlCQUFpQixZQUFhbkIsRUFBTVUsV0FDNUNYLEVBQVFvQixpQkFBaUIsWUFBYW5CLEVBQU1XLFdBQzVDWixFQUFRb0IsaUJBQWlCLFVBQVduQixFQUFNWSxTQUUxQ2IsRUFBUW9CLGlCQUFpQixhQUFjbkIsRUFBTWEsWUFDN0NkLEVBQVFvQixpQkFBaUIsaUJBQWtCbkIsRUFBTWEsWUFFakRkLEVBQVFvQixpQkFBaUIsWUFBYW5CLEVBQU1VLFdBQzVDWCxFQUFRb0IsaUJBQWlCLGFBQWNuQixFQUFNVyxXQUM3Q1osRUFBUW9CLGlCQUFpQixXQUFZbkIsRUFBTVksUUFDL0MsRUFPQWQsRUFBTXNCLGtCQUFvQixTQUFTcEIsR0FDL0JBLEVBQU1TLGFBQWFDLFVBQVksS0FDL0JWLEVBQU1TLGFBQWFFLFVBQVksS0FDL0JYLEVBQU1TLGFBQWFHLFFBQVUsS0FDN0JaLEVBQU1TLGFBQWFJLFdBQWEsS0FDaENiLEVBQU1LLFdBQWEsQ0FDdkIsRUFRQVAsRUFBTXVCLFVBQVksU0FBU3JCLEVBQU9qSyxHQUM5QmlLLEVBQU1qSyxPQUFPclAsRUFBSXFQLEVBQU9yUCxFQUN4QnNaLEVBQU1qSyxPQUFPcFAsRUFBSW9QLEVBQU9wUCxFQUN4QnFaLEVBQU14WSxTQUFTZCxFQUFJc1osRUFBTUUsU0FBU3haLEVBQUlzWixFQUFNL1UsTUFBTXZFLEVBQUlzWixFQUFNakssT0FBT3JQLEVBQ25Fc1osRUFBTXhZLFNBQVNiLEVBQUlxWixFQUFNRSxTQUFTdlosRUFBSXFaLEVBQU0vVSxNQUFNdEUsRUFBSXFaLEVBQU1qSyxPQUFPcFAsQ0FDdkUsRUFRQW1aLEVBQU13QixTQUFXLFNBQVN0QixFQUFPL1UsR0FDN0IrVSxFQUFNL1UsTUFBTXZFLEVBQUl1RSxFQUFNdkUsRUFDdEJzWixFQUFNL1UsTUFBTXRFLEVBQUlzRSxFQUFNdEUsRUFDdEJxWixFQUFNeFksU0FBU2QsRUFBSXNaLEVBQU1FLFNBQVN4WixFQUFJc1osRUFBTS9VLE1BQU12RSxFQUFJc1osRUFBTWpLLE9BQU9yUCxFQUNuRXNaLEVBQU14WSxTQUFTYixFQUFJcVosRUFBTUUsU0FBU3ZaLEVBQUlxWixFQUFNL1UsTUFBTXRFLEVBQUlxWixFQUFNakssT0FBT3BQLENBQ3ZFLEVBV0FtWixFQUFNZ0IsMEJBQTRCLFNBQVNqVCxFQUFPa1MsRUFBU1EsR0FDdkQsSUFLSTdaLEVBQUdDLEVBTEg0YSxFQUFnQnhCLEVBQVF5Qix3QkFDeEJDLEVBQVl4QixTQUFTeUIsaUJBQW1CekIsU0FBU3pXLEtBQUttWSxZQUFjMUIsU0FBU3pXLEtBQzdFb1ksT0FBa0NDLElBQXZCemUsT0FBTzBlLFlBQTZCMWUsT0FBTzBlLFlBQWNMLEVBQVNNLFdBQzdFQyxPQUFrQ0gsSUFBdkJ6ZSxPQUFPNmUsWUFBNkI3ZSxPQUFPNmUsWUFBY1IsRUFBU1MsVUFDN0VDLEVBQVV0VSxFQUFNa1QsZUFXcEIsT0FSSW9CLEdBQ0F6YixFQUFJeWIsRUFBUSxHQUFHQyxNQUFRYixFQUFjYyxLQUFPVCxFQUM1Q2piLEVBQUl3YixFQUFRLEdBQUdHLE1BQVFmLEVBQWNnQixJQUFNUCxJQUUzQ3RiLEVBQUltSCxFQUFNdVUsTUFBUWIsRUFBY2MsS0FBT1QsRUFDdkNqYixFQUFJa0gsRUFBTXlVLE1BQVFmLEVBQWNnQixJQUFNUCxHQUduQyxDQUNIdGIsRUFBR0EsR0FBS3FaLEVBQVF5QyxhQUFlekMsRUFBUW5DLE9BQVNtQyxFQUFReUMsYUFBZWpDLEdBQ3ZFNVosRUFBR0EsR0FBS29aLEVBQVEwQyxjQUFnQjFDLEVBQVFsQyxRQUFVa0MsRUFBUTBDLGNBQWdCbEMsR0FFbEYsQ0FLRyxFQUVELFNBQVU3aUIsRUFBUUQsRUFBUyxHQVFqQyxJQUFJaWxCLEVBQVcsQ0FBQyxFQUVoQmhsQixFQUFPRCxRQUFVaWxCLEVBRWpCLElBQUkxaUIsRUFBUyxFQUFvQixHQUM3QmtYLEVBQVksRUFBb0IsR0FVaEN3TCxFQUFTcGpCLE9BQVMsU0FBUzJPLEdBTXZCLE9BQU9qTyxFQUFPTyxPQUxDLENBQ1grTixPQUFRLEdBQ1JtSSxNQUFPLE1BR29CeEksRUFDbkMsRUFRQXlVLEVBQVNDLFVBQVksU0FBU0MsRUFBVXRVLEdBQ3BDc1UsRUFBU3RVLE9BQVNBLEVBQU83TSxNQUFNLEVBQ25DLEVBT0FpaEIsRUFBU3ZTLE1BQVEsU0FBU3lTLEdBQ3RCQSxFQUFTdFUsT0FBUyxFQUN0QixFQVdBb1UsRUFBU0csV0FBYSxTQUFTRCxHQUMzQixJQU1JM2tCLEVBQ0E4RCxFQVBBOGdCLEVBQWEsR0FDYnBNLEVBQVFtTSxFQUFTbk0sTUFDakJuSSxFQUFTc1UsRUFBU3RVLE9BQ2xCd1UsRUFBZXhVLEVBQU96TixPQUN0QmtpQixFQUFhTCxFQUFTSyxXQUN0QjlLLEVBQVdmLEVBQVVlLFNBTXpCLElBRkEzSixFQUFPOUIsS0FBS2tXLEVBQVNNLGlCQUVoQi9rQixFQUFJLEVBQUdBLEVBQUk2a0IsRUFBYzdrQixJQUFLLENBQy9CLElBQUk0WSxFQUFRdkksRUFBT3JRLEdBQ2ZrSixFQUFVMFAsRUFBTXBRLE9BQ2hCd2MsRUFBWXBNLEVBQU1wUSxPQUFPeEQsSUFBSXlELEVBQzdCd2MsRUFBWXJNLEVBQU1wUSxPQUFPeEQsSUFBSTBELEVBQzdCd2MsRUFBWXRNLEVBQU1wUSxPQUFPekQsSUFBSTJELEVBQzdCeWMsRUFBY3ZNLEVBQU12RyxVQUFZdUcsRUFBTWhGLFdBQ3RDd1IsRUFBZXhNLEVBQU1qVixNQUFNZixPQUMzQnlpQixFQUFnQyxJQUFqQkQsRUFFbkIsSUFBS3RoQixFQUFJOUQsRUFBSSxFQUFHOEQsRUFBSStnQixFQUFjL2dCLElBQUssQ0FDbkMsSUFBSStVLEVBQVF4SSxFQUFPdk0sR0FHbkIsSUFGSXFGLEVBQVUwUCxFQUFNclEsUUFFUnpELElBQUkwRCxFQUFJdWMsRUFDaEIsTUFHSixLQUFJQyxFQUFZOWIsRUFBUXBFLElBQUkyRCxHQUFLd2MsRUFBWS9iLEVBQVFuRSxJQUFJMEQsTUFJckR5YyxJQUFnQnRNLEVBQU14RyxXQUFZd0csRUFBTWpGLGFBSXZDa1IsRUFBV2xNLEVBQU14RSxnQkFBaUJ5RSxFQUFNekUsaUJBQTdDLENBSUEsSUFBSWtSLEVBQWV6TSxFQUFNbFYsTUFBTWYsT0FFL0IsR0FBSXlpQixHQUFpQyxJQUFqQkMsR0FDWjNNLEVBQVlxQixFQUFTcEIsRUFBT0MsRUFBT0wsS0FHbkNvTSxFQUFXMWhCLEtBQUt5VixRQU1wQixJQUhBLElBQ0k0TSxFQUFjRCxFQUFlLEVBQUksRUFBSSxFQUVoQzNXLEVBSFN5VyxFQUFlLEVBQUksRUFBSSxFQUdmelcsRUFBSXlXLEVBQWN6VyxJQUl4QyxJQUhBLElBQUk0UyxFQUFRM0ksRUFBTWpWLE1BQU1nTCxHQUdmQyxHQUZMMUYsRUFBVXFZLEVBQU0vWSxPQUVQK2MsR0FBYTNXLEVBQUkwVyxFQUFjMVcsSUFBSyxDQUM3QyxJQVFJK0osRUFSQTZJLEVBQVEzSSxFQUFNbFYsTUFBTWlMLEdBQ3BCekYsRUFBVXFZLEVBQU1oWixPQUVoQlUsRUFBUW5FLElBQUkwRCxFQUFJVSxFQUFRbkUsSUFBSXlELEdBQUtTLEVBQVFsRSxJQUFJeUQsRUFBSVUsRUFBUXBFLElBQUkwRCxHQUMxRFMsRUFBUWxFLElBQUkwRCxFQUFJUyxFQUFRcEUsSUFBSTJELEdBQUtRLEVBQVFuRSxJQUFJMkQsRUFBSVMsRUFBUW5FLElBQUkwRCxJQUloRWlRLEVBQVlxQixFQUFTdUgsRUFBT0MsRUFBT2hKLEtBR25Db00sRUFBVzFoQixLQUFLeVYsRUFFeEIsQ0FoQ1IsQ0FtQ0osQ0FDSixDQUVBLE9BQU9pTSxDQUNYLEVBVUFILEVBQVNLLFdBQWEsU0FBU1UsRUFBU0MsR0FDcEMsT0FBSUQsRUFBUWpSLFFBQVVrUixFQUFRbFIsT0FBMkIsSUFBbEJpUixFQUFRalIsTUFDcENpUixFQUFRalIsTUFBUSxFQUVrQixJQUFyQ2lSLEVBQVFsUixLQUFPbVIsRUFBUXBSLFdBQXlELElBQXJDb1IsRUFBUW5SLEtBQU9rUixFQUFRblIsU0FDOUUsRUFXQW9RLEVBQVNNLGdCQUFrQixTQUFTbk0sRUFBT0MsR0FDdkMsT0FBT0QsRUFBTXBRLE9BQU96RCxJQUFJMEQsRUFBSW9RLEVBQU1yUSxPQUFPekQsSUFBSTBELENBQ2pELENBMkJHLEVBRUQsU0FBVWhKLEVBQVFELEVBQVMsR0FRakMsSUFBSWttQixFQUFTLENBQUMsRUFFZGptQixFQUFPRCxRQUFVa21CLEVBRWpCLElBQUkzakIsRUFBUyxFQUFvQixHQUk3QjJqQixFQUFPQyxVQUFZLENBQUMsRUFRcEJELEVBQU9FLFNBQVcsU0FBU25WLEdBS3ZCLEdBSktpVixFQUFPRyxTQUFTcFYsSUFDakIxTyxFQUFPb0UsS0FBSyxtQkFBb0J1ZixFQUFPaGhCLFNBQVMrTCxHQUFTLDJDQUd6REEsRUFBT25RLFFBQVFvbEIsRUFBT0MsVUFBVyxDQUNqQyxJQUFJRyxFQUFhSixFQUFPQyxVQUFVbFYsRUFBT25RLE1BQ3JDeWxCLEVBQWdCTCxFQUFPTSxhQUFhdlYsRUFBT3dWLFNBQVNDLE9BQ3BEQyxFQUFvQlQsRUFBT00sYUFBYUYsRUFBV0csU0FBU0MsT0FFNURILEVBQWdCSSxHQUNoQnBrQixFQUFPb0UsS0FBSyxtQkFBb0J1ZixFQUFPaGhCLFNBQVNvaEIsR0FBYSxrQkFBbUJKLEVBQU9oaEIsU0FBUytMLElBQ2hHaVYsRUFBT0MsVUFBVWxWLEVBQU9uUSxNQUFRbVEsR0FDekJzVixFQUFnQkksRUFDdkJwa0IsRUFBT29FLEtBQUssbUJBQW9CdWYsRUFBT2hoQixTQUFTb2hCLEdBQWEsMkJBQTRCSixFQUFPaGhCLFNBQVMrTCxJQUNsR0EsSUFBV3FWLEdBQ2xCL2pCLEVBQU9vRSxLQUFLLG1CQUFvQnVmLEVBQU9oaEIsU0FBUytMLEdBQVMsbURBRWpFLE1BQ0lpVixFQUFPQyxVQUFVbFYsRUFBT25RLE1BQVFtUSxFQUdwQyxPQUFPQSxDQUNYLEVBU0FpVixFQUFPVSxRQUFVLFNBQVNDLEdBQ3RCLE9BQU9YLEVBQU9DLFVBQVVELEVBQU9ZLGdCQUFnQkQsR0FBWS9sQixLQUMvRCxFQVFBb2xCLEVBQU9oaEIsU0FBVyxTQUFTK0wsR0FDdkIsTUFBeUIsaUJBQVhBLEVBQXNCQSxHQUFVQSxFQUFPblEsTUFBUSxhQUFlLEtBQU9tUSxFQUFPd1YsU0FBV3hWLEVBQU84VixPQUFTLFFBQ3pILEVBWUFiLEVBQU9HLFNBQVcsU0FBU3RqQixHQUN2QixPQUFPQSxHQUFPQSxFQUFJakMsTUFBUWlDLEVBQUkwakIsU0FBVzFqQixFQUFJaWtCLE9BQ2pELEVBU0FkLEVBQU9lLE9BQVMsU0FBU2huQixFQUFRYSxHQUM3QixPQUFPYixFQUFPaW5CLEtBQUsvZixRQUFRckcsSUFBUyxDQUN4QyxFQVdBb2xCLEVBQU9pQixNQUFRLFNBQVNsVyxFQUFRaFIsR0FDNUIsSUFBSW1uQixFQUFTblcsRUFBT29XLEtBQU9uQixFQUFPWSxnQkFBZ0I3VixFQUFPb1csS0FDekQsT0FBUXBXLEVBQU9vVyxLQUFRcG5CLEVBQU9hLE9BQVNzbUIsRUFBT3RtQixNQUFRb2xCLEVBQU9vQixpQkFBaUJybkIsRUFBT3dtQixRQUFTVyxFQUFPTCxNQUN6RyxFQWtCQWIsRUFBT3FCLElBQU0sU0FBU3RuQixFQUFRdW5CLEdBRzFCLEdBRkF2bkIsRUFBT3duQixNQUFReG5CLEVBQU93bkIsTUFBUSxJQUFJamhCLE9BQU9naEIsR0FBVyxJQUV6QixJQUF2QnZuQixFQUFPd25CLEtBQUtya0IsT0FBaEIsQ0FTQSxJQUpBLElBQUlza0IsRUFBZXhCLEVBQU93QixhQUFhem5CLEdBQ25DMG5CLEVBQXFCcGxCLEVBQU9tRixnQkFBZ0JnZ0IsR0FDNUNFLEVBQVMsR0FFSnBuQixFQUFJLEVBQUdBLEVBQUltbkIsRUFBbUJ2a0IsT0FBUTVDLEdBQUssRUFDaEQsR0FBSW1uQixFQUFtQm5uQixLQUFPUCxFQUFPYSxLQUFyQyxDQUlBLElBQUltUSxFQUFTaVYsRUFBT1UsUUFBUWUsRUFBbUJubkIsSUFFMUN5USxFQUtEaVYsRUFBT2UsT0FBT2huQixFQUFRZ1IsRUFBT25RLFFBSTVCb2xCLEVBQU9pQixNQUFNbFcsRUFBUWhSLEtBQ3RCc0MsRUFBT29FLEtBQUssY0FBZXVmLEVBQU9oaEIsU0FBUytMLEdBQVMsU0FBVUEsRUFBT29XLElBQUssbUJBQW9CbkIsRUFBT2hoQixTQUFTakYsR0FBVSxLQUN4SGdSLEVBQU80VyxTQUFVLEdBR2pCNVcsRUFBTytWLFFBQ1AvVixFQUFPK1YsUUFBUS9tQixJQUVmc0MsRUFBT29FLEtBQUssY0FBZXVmLEVBQU9oaEIsU0FBUytMLEdBQVMseUNBQ3BEQSxFQUFPNFcsU0FBVSxHQUdqQjVXLEVBQU80VyxTQUNQRCxFQUFPbGtCLEtBQUssTUFBUXdpQixFQUFPaGhCLFNBQVMrTCxXQUM3QkEsRUFBTzRXLFNBRWRELEVBQU9sa0IsS0FBSyxLQUFPd2lCLEVBQU9oaEIsU0FBUytMLElBR3ZDaFIsRUFBT2luQixLQUFLeGpCLEtBQUt1TixFQUFPblEsT0EzQnBCOG1CLEVBQU9sa0IsS0FBSyxLQUFPaWtCLEVBQW1Cbm5CLEdBTDFDLENBbUNBb25CLEVBQU94a0IsT0FBUyxHQUNoQmIsRUFBT21FLEtBQUtraEIsRUFBTzlnQixLQUFLLE1BN0M1QixNQUZJdkUsRUFBT29FLEtBQUssY0FBZXVmLEVBQU9oaEIsU0FBU2pGLEdBQVMsZ0RBaUQ1RCxFQVFBaW1CLEVBQU93QixhQUFlLFNBQVN6bkIsRUFBUTZuQixHQUNuQyxJQUFJQyxFQUFhN0IsRUFBT1ksZ0JBQWdCN21CLEdBQ3BDYSxFQUFPaW5CLEVBQVdqbkIsS0FJdEIsS0FBSUEsS0FGSmduQixFQUFVQSxHQUFXLENBQUMsSUFFdEIsQ0FJQTduQixFQUFTaW1CLEVBQU9VLFFBQVEzbUIsSUFBV0EsRUFFbkM2bkIsRUFBUWhuQixHQUFReUIsRUFBTytFLElBQUlySCxFQUFPd25CLE1BQVEsSUFBSSxTQUFTWixHQUMvQ1gsRUFBT0csU0FBU1EsSUFDaEJYLEVBQU9FLFNBQVNTLEdBR3BCLElBQUlPLEVBQVNsQixFQUFPWSxnQkFBZ0JELEdBQ2hDbUIsRUFBVzlCLEVBQU9VLFFBQVFDLEdBbUI5QixPQWpCSW1CLElBQWE5QixFQUFPb0IsaUJBQWlCVSxFQUFTdkIsUUFBU1csRUFBT0wsUUFDOUR4a0IsRUFBT29FLEtBQ0gsdUJBQXdCdWYsRUFBT2hoQixTQUFTOGlCLEdBQVcsbUJBQ25EOUIsRUFBT2hoQixTQUFTa2lCLEdBQVMsVUFBV2xCLEVBQU9oaEIsU0FBUzZpQixHQUFjLEtBR3RFQyxFQUFTSCxTQUFVLEVBQ25CNW5CLEVBQU80bkIsU0FBVSxHQUNURyxJQUNSemxCLEVBQU9vRSxLQUNILHVCQUF3QnVmLEVBQU9oaEIsU0FBUzJoQixHQUFhLFVBQ3JEWCxFQUFPaGhCLFNBQVM2aUIsR0FBYSwwQkFHakM5bkIsRUFBTzRuQixTQUFVLEdBR2RULEVBQU90bUIsSUFDbEIsSUFFQSxJQUFLLElBQUlOLEVBQUksRUFBR0EsRUFBSXNuQixFQUFRaG5CLEdBQU1zQyxPQUFRNUMsR0FBSyxFQUMzQzBsQixFQUFPd0IsYUFBYUksRUFBUWhuQixHQUFNTixHQUFJc25CLEdBRzFDLE9BQU9BLENBcENQLENBcUNKLEVBV0E1QixFQUFPWSxnQkFBa0IsU0FBU0QsR0FDOUIsT0FBSXRrQixFQUFPOEMsU0FBU3doQixJQUNGLHlEQUVEb0IsS0FBS3BCLElBQ2R0a0IsRUFBT29FLEtBQUssMEJBQTJCa2dCLEVBQVkscUNBR2hELENBQ0gvbEIsS0FBTStsQixFQUFXOWlCLE1BQU0sS0FBSyxHQUM1QmdqQixNQUFPRixFQUFXOWlCLE1BQU0sS0FBSyxJQUFNLE1BSXBDLENBQ0hqRCxLQUFNK2xCLEVBQVcvbEIsS0FDakJpbUIsTUFBT0YsRUFBV0UsT0FBU0YsRUFBV0osUUFFOUMsRUFrQkFQLEVBQU9NLGFBQWUsU0FBU08sR0FDM0IsSUFBSW1CLEVBQVUsZ0VBRVRBLEVBQVFELEtBQUtsQixJQUNkeGtCLEVBQU9vRSxLQUFLLHVCQUF3Qm9nQixFQUFPLG9DQUcvQyxJQUFJNWlCLEVBQVErakIsRUFBUUMsS0FBS3BCLEdBQ3JCcUIsRUFBUXJNLE9BQU81WCxFQUFNLElBQ3JCa2tCLEVBQVF0TSxPQUFPNVgsRUFBTSxJQUNyQm1rQixFQUFRdk0sT0FBTzVYLEVBQU0sSUFFekIsTUFBTyxDQUNIb2tCLFFBQVMvRyxRQUFRcmQsRUFBTSxJQUFNQSxFQUFNLElBQ25Dc2lCLFFBQVN0aUIsRUFBTSxHQUNmNGlCLE1BQU9BLEVBQ1B5QixTQUFVcmtCLEVBQU0sSUFBTUEsRUFBTSxJQUFNLEdBQ2xDaWtCLE1BQU9BLEVBQ1BDLE1BQU9BLEVBQ1BDLE1BQU9BLEVBQ1Bua0IsTUFBTyxDQUFDaWtCLEVBQU9DLEVBQU9DLEdBQ3RCRyxXQUFZdGtCLEVBQU0sR0FDbEJ1aUIsT0FBZ0IsSUFBUjBCLEVBQXNCLElBQVJDLEVBQWNDLEVBRTVDLEVBV0FwQyxFQUFPb0IsaUJBQW1CLFNBQVNiLEVBQVNNLEdBQ3hDQSxFQUFRQSxHQUFTLElBRWpCLElBQUkxbEIsRUFBSTZrQixFQUFPTSxhQUFhTyxHQUN4QmhhLEVBQUltWixFQUFPTSxhQUFhQyxHQUU1QixHQUFJcGxCLEVBQUVrbkIsUUFBUyxDQUNYLEdBQW1CLE1BQWZsbkIsRUFBRW1uQixVQUFnQyxNQUFaL0IsRUFDdEIsT0FBTyxFQUdYLEdBQW1CLE1BQWZwbEIsRUFBRW1uQixTQUNGLE9BQU96YixFQUFFMlosT0FBU3JsQixFQUFFcWxCLE9BR3hCLEdBQW1CLE9BQWZybEIsRUFBRW1uQixTQUNGLE9BQU96YixFQUFFMlosUUFBVXJsQixFQUFFcWxCLE9BR3pCLEdBQW1CLE1BQWZybEIsRUFBRW1uQixTQUNGLE9BQU96YixFQUFFcWIsUUFBVS9tQixFQUFFK21CLE9BQVNyYixFQUFFc2IsUUFBVWhuQixFQUFFZ25CLE9BQVN0YixFQUFFdWIsT0FBU2puQixFQUFFaW5CLE1BR3RFLEdBQW1CLE1BQWZqbkIsRUFBRW1uQixTQUNGLE9BQUlubkIsRUFBRSttQixNQUFRLEVBQ0hyYixFQUFFcWIsUUFBVS9tQixFQUFFK21CLE9BQVNyYixFQUFFMlosUUFBVXJsQixFQUFFcWxCLE9BRzVDcmxCLEVBQUVnbkIsTUFBUSxFQUNIdGIsRUFBRXNiLFFBQVVobkIsRUFBRWduQixPQUFTdGIsRUFBRXViLE9BQVNqbkIsRUFBRWluQixNQUd4Q3ZiLEVBQUV1YixRQUFVam5CLEVBQUVpbkIsS0FFN0IsQ0FFQSxPQUFPN0IsSUFBWU0sR0FBcUIsTUFBWk4sQ0FDaEMsQ0FLRyxFQUVELFNBQVV4bUIsRUFBUUQsRUFBUyxHQVVqQyxJQUFJMG9CLEVBQVMsQ0FBQyxFQUVkem9CLEVBQU9ELFFBQVUwb0IsRUFFakIsSUFBSW5tQixFQUFTLEVBQW9CLEdBQzdCK04sRUFBWSxFQUFvQixHQUNoQ3hILEVBQVMsRUFBb0IsR0FDN0I0RyxFQUFTLEVBQW9CLEdBQzdCeEYsRUFBUyxFQUFvQixHQUM3Qm1ZLEVBQVEsRUFBb0IsS0FFaEMsV0FFSSxJQUFJc0csRUFDQUMsRUFFa0Isb0JBQVhqakIsU0FDUGdqQixFQUF5QmhqQixPQUFPa2pCLHVCQUF5QmxqQixPQUFPbWpCLDZCQUMvQm5qQixPQUFPb2pCLDBCQUE0QnBqQixPQUFPcWpCLHlCQUMxQyxTQUFTblosR0FBV2xLLE9BQU9zakIsWUFBVyxXQUFhcFosRUFBU3ROLEVBQU9tRCxNQUFRLEdBQUcsSUFBTyxHQUFLLEVBRTNIa2pCLEVBQXdCampCLE9BQU91akIsc0JBQXdCdmpCLE9BQU93akIseUJBQzdCeGpCLE9BQU95akIsNEJBQThCempCLE9BQU8wakIsd0JBR2pGWCxFQUFPWSxTQUFXLEdBQ2xCWixFQUFPYSxXQUFhLElBQU8sR0FVM0JiLEVBQU83bUIsT0FBUyxTQUFTMk8sR0FDckIsSUFBSWtELEVBQVcsQ0FDWDhWLFdBQVlkLEVBQ1plLE9BQVEsS0FDUm5ILFFBQVMsS0FDVG9ILE9BQVEsS0FDUm5ILE1BQU8sS0FDUG9ILGVBQWdCLEtBQ2hCQyxPQUFRLENBQ0pDLFlBQWEsR0FDYmxjLE1BQU8sRUFDUG1jLGFBQWMsR0FDZEMsU0FBVSxFQUNWQyxjQUFlLEVBQ2ZDLFlBQWEsRUFDYkMsaUJBQWtCLEVBQ2xCQyx3QkFBeUIsR0FDekJDLG1CQUFvQixHQUNwQkMscUJBQXNCLEdBQ3RCQyxlQUFnQixJQUVwQjlaLFFBQVMsQ0FDTDJQLE1BQU8sSUFDUEMsT0FBUSxJQUNSMEMsV0FBWSxFQUNaeUgsV0FBWSxVQUNaQyxvQkFBcUIsVUFDckJDLFlBQWFqYSxFQUFReEgsT0FDckIwaEIsU0FBUyxFQUNUQyxZQUFZLEVBQ1pDLGNBQWMsRUFDZEMsV0FBVyxFQUNYQyxXQUFXLEVBQ1hDLGlCQUFpQixFQUNqQkMsWUFBWSxFQUNaQyxjQUFjLEVBQ2RDLGdCQUFnQixFQUNoQkMsaUJBQWlCLEVBQ2pCQyxVQUFVLEVBQ1ZDLGVBQWUsRUFDZkMsb0JBQW9CLEVBQ3BCQyxTQUFTLEVBQ1RDLG1CQUFtQixFQUNuQkMsaUJBQWlCLEVBQ2pCQyxtQkFBbUIsRUFDbkJDLG1CQUFtQixJQUl2QnpXLEVBQVMzUyxFQUFPTyxPQUFPNFEsRUFBVWxELEdBcUNyQyxPQW5DSTBFLEVBQU93VSxTQUNQeFUsRUFBT3dVLE9BQU92SixNQUFRakwsRUFBTzFFLFFBQVEyUCxPQUFTakwsRUFBT3dVLE9BQU92SixNQUM1RGpMLEVBQU93VSxPQUFPdEosT0FBU2xMLEVBQU8xRSxRQUFRNFAsUUFBVWxMLEVBQU93VSxPQUFPdEosUUFHbEVsTCxFQUFPcU4sTUFBUS9SLEVBQVErUixNQUN2QnJOLEVBQU91VSxPQUFTalosRUFBUWlaLE9BQ3hCdlUsRUFBT3dVLE9BQVN4VSxFQUFPd1UsUUFBVWtDLEVBQWMxVyxFQUFPMUUsUUFBUTJQLE1BQU9qTCxFQUFPMUUsUUFBUTRQLFFBQ3BGbEwsRUFBTzJXLFFBQVUzVyxFQUFPd1UsT0FBT29DLFdBQVcsTUFDMUM1VyxFQUFPNlcsU0FBVyxDQUFDLEVBRW5CN1csRUFBT2xNLE9BQVNrTSxFQUFPbE0sUUFBVSxDQUM3QnpELElBQUssQ0FDRDBELEVBQUcsRUFDSEMsRUFBRyxHQUVQMUQsSUFBSyxDQUNEeUQsRUFBR2lNLEVBQU93VSxPQUFPdkosTUFDakJqWCxFQUFHZ00sRUFBT3dVLE9BQU90SixTQUt6QmxMLEVBQU8xRSxRQUFRd2IsZ0JBQWlCLEVBRUUsSUFBOUI5VyxFQUFPMUUsUUFBUXNTLFlBQ2Y0RixFQUFPdUQsY0FBYy9XLEVBQVFBLEVBQU8xRSxRQUFRc1MsWUFHNUN2Z0IsRUFBT3NDLFVBQVVxUSxFQUFPb04sU0FDeEJwTixFQUFPb04sUUFBUTRKLFlBQVloWCxFQUFPd1UsUUFDMUJ4VSxFQUFPd1UsT0FBT3hGLFlBQ3RCM2hCLEVBQU84RCxJQUFJLDJGQUE0RixRQUdwRzZPLENBQ1gsRUFPQXdULEVBQU95RCxJQUFNLFNBQVNqWCxJQUNsQixTQUFVa1gsRUFBS0MsR0FDWG5YLEVBQU95VSxlQUFpQmhCLEVBQXVCeUQsR0FFL0NFLEVBQWNwWCxFQUFRbVgsR0FFdEIzRCxFQUFPNkQsTUFBTXJYLEVBQVFtWCxJQUVqQm5YLEVBQU8xRSxRQUFRc2EsV0FBYTVWLEVBQU8xRSxRQUFRcWEsWUFDM0NuQyxFQUFPOEQsTUFBTXRYLEVBQVFBLEVBQU8yVyxRQUFTUSxJQUdyQ25YLEVBQU8xRSxRQUFRdWEsaUJBQW1CN1YsRUFBTzFFLFFBQVFxYSxZQUNqRG5DLEVBQU85aUIsWUFBWXNQLEVBQVFBLEVBQU8yVyxRQUFTUSxFQUVsRCxDQWRELEVBZUosRUFPQTNELEVBQU8rRCxLQUFPLFNBQVN2WCxHQUNuQjBULEVBQXNCMVQsRUFBT3lVLGVBQ2pDLEVBU0FqQixFQUFPdUQsY0FBZ0IsU0FBUy9XLEVBQVE0TixHQUNwQyxJQUFJdFMsRUFBVTBFLEVBQU8xRSxRQUNqQmtaLEVBQVN4VSxFQUFPd1UsT0FFRCxTQUFmNUcsSUFDQUEsRUFBYTRKLEVBQWVoRCxJQUdoQ2xaLEVBQVFzUyxXQUFhQSxFQUNyQjRHLEVBQU9pRCxhQUFhLG1CQUFvQjdKLEdBQ3hDNEcsRUFBT3ZKLE1BQVEzUCxFQUFRMlAsTUFBUTJDLEVBQy9CNEcsRUFBT3RKLE9BQVM1UCxFQUFRNFAsT0FBUzBDLEVBQ2pDNEcsRUFBT2tELE1BQU16TSxNQUFRM1AsRUFBUTJQLE1BQVEsS0FDckN1SixFQUFPa0QsTUFBTXhNLE9BQVM1UCxFQUFRNFAsT0FBUyxJQUMzQyxFQWVBc0ksRUFBT21FLE9BQVMsU0FBUzNYLEVBQVF2RCxFQUFTbWIsRUFBU0MsR0FDL0NBLE9BQTJCLElBQVhBLEdBQXlCQSxFQUN6Q3BiLEVBQVVwUCxFQUFPMEMsUUFBUTBNLEdBQVdBLEVBQVUsQ0FBQ0EsR0FDL0NtYixFQUFVQSxHQUFXLENBQ2pCN2pCLEVBQUcsRUFDSEMsRUFBRyxHQVNQLElBTEEsSUFBSUYsRUFBUyxDQUNUekQsSUFBSyxDQUFFMEQsRUFBR0ksSUFBVUgsRUFBR0csS0FDdkI3RCxJQUFLLENBQUV5RCxHQUFHLElBQVdDLEdBQUcsTUFHbkIxSSxFQUFJLEVBQUdBLEVBQUltUixFQUFRdk8sT0FBUTVDLEdBQUssRUFBRyxDQUN4QyxJQUFJeUIsRUFBUzBQLEVBQVFuUixHQUNqQitFLEVBQU10RCxFQUFPK0csT0FBUy9HLEVBQU8rRyxPQUFPekQsSUFBT3RELEVBQU9zRCxLQUFPdEQsRUFBTzhILFVBQVk5SCxFQUM1RXVELEVBQU12RCxFQUFPK0csT0FBUy9HLEVBQU8rRyxPQUFPeEQsSUFBT3ZELEVBQU91RCxLQUFPdkQsRUFBTzhILFVBQVk5SCxFQUU1RXNELEdBQU9DLElBQ0hELEVBQUkwRCxFQUFJRCxFQUFPekQsSUFBSTBELElBQ25CRCxFQUFPekQsSUFBSTBELEVBQUkxRCxFQUFJMEQsR0FFbkJ6RCxFQUFJeUQsRUFBSUQsRUFBT3hELElBQUl5RCxJQUNuQkQsRUFBT3hELElBQUl5RCxFQUFJekQsRUFBSXlELEdBRW5CMUQsRUFBSTJELEVBQUlGLEVBQU96RCxJQUFJMkQsSUFDbkJGLEVBQU96RCxJQUFJMkQsRUFBSTNELEVBQUkyRCxHQUVuQjFELEVBQUkwRCxFQUFJRixFQUFPeEQsSUFBSTBELElBQ25CRixFQUFPeEQsSUFBSTBELEVBQUkxRCxFQUFJMEQsR0FFL0IsQ0FHQSxJQUFJaVgsRUFBU25YLEVBQU94RCxJQUFJeUQsRUFBSUQsRUFBT3pELElBQUkwRCxFQUFLLEVBQUk2akIsRUFBUTdqQixFQUNwRG1YLEVBQVVwWCxFQUFPeEQsSUFBSTBELEVBQUlGLEVBQU96RCxJQUFJMkQsRUFBSyxFQUFJNGpCLEVBQVE1akIsRUFDckQ4akIsRUFBYTlYLEVBQU93VSxPQUFPdEosT0FFM0I2TSxFQURZL1gsRUFBT3dVLE9BQU92SixNQUNENk0sRUFDekJFLEVBQWEvTSxFQUFRQyxFQUNyQjNTLEVBQVMsRUFDVEMsRUFBUyxFQUdUd2YsRUFBYUQsRUFDYnZmLEVBQVN3ZixFQUFhRCxFQUV0QnhmLEVBQVN3ZixFQUFhQyxFQUkxQmhZLEVBQU8xRSxRQUFRaWEsV0FBWSxFQUczQnZWLEVBQU9sTSxPQUFPekQsSUFBSTBELEVBQUlELEVBQU96RCxJQUFJMEQsRUFDakNpTSxFQUFPbE0sT0FBT3hELElBQUl5RCxFQUFJRCxFQUFPekQsSUFBSTBELEVBQUlrWCxFQUFRMVMsRUFDN0N5SCxFQUFPbE0sT0FBT3pELElBQUkyRCxFQUFJRixFQUFPekQsSUFBSTJELEVBQ2pDZ00sRUFBT2xNLE9BQU94RCxJQUFJMEQsRUFBSUYsRUFBT3pELElBQUkyRCxFQUFJa1gsRUFBUzFTLEVBRzFDcWYsSUFDQTdYLEVBQU9sTSxPQUFPekQsSUFBSTBELEdBQWEsR0FBUmtYLEVBQWVBLEVBQVExUyxFQUFVLEdBQ3hEeUgsRUFBT2xNLE9BQU94RCxJQUFJeUQsR0FBYSxHQUFSa1gsRUFBZUEsRUFBUTFTLEVBQVUsR0FDeER5SCxFQUFPbE0sT0FBT3pELElBQUkyRCxHQUFjLEdBQVRrWCxFQUFnQkEsRUFBUzFTLEVBQVUsR0FDMUR3SCxFQUFPbE0sT0FBT3hELElBQUkwRCxHQUFjLEdBQVRrWCxFQUFnQkEsRUFBUzFTLEVBQVUsSUFJOUR3SCxFQUFPbE0sT0FBT3pELElBQUkwRCxHQUFLNmpCLEVBQVE3akIsRUFDL0JpTSxFQUFPbE0sT0FBT3hELElBQUl5RCxHQUFLNmpCLEVBQVE3akIsRUFDL0JpTSxFQUFPbE0sT0FBT3pELElBQUkyRCxHQUFLNGpCLEVBQVE1akIsRUFDL0JnTSxFQUFPbE0sT0FBT3hELElBQUkwRCxHQUFLNGpCLEVBQVE1akIsRUFHM0JnTSxFQUFPcU4sUUFDUEYsRUFBTXdCLFNBQVMzTyxFQUFPcU4sTUFBTyxDQUN6QnRaLEdBQUlpTSxFQUFPbE0sT0FBT3hELElBQUl5RCxFQUFJaU0sRUFBT2xNLE9BQU96RCxJQUFJMEQsR0FBS2lNLEVBQU93VSxPQUFPdkosTUFDL0RqWCxHQUFJZ00sRUFBT2xNLE9BQU94RCxJQUFJMEQsRUFBSWdNLEVBQU9sTSxPQUFPekQsSUFBSTJELEdBQUtnTSxFQUFPd1UsT0FBT3RKLFNBR25FaUMsRUFBTXVCLFVBQVUxTyxFQUFPcU4sTUFBT3JOLEVBQU9sTSxPQUFPekQsS0FFcEQsRUFPQW1qQixFQUFPeUUsbUJBQXFCLFNBQVNqWSxHQUNqQyxJQUFJa1ksRUFBY2xZLEVBQU9sTSxPQUFPeEQsSUFBSXlELEVBQUlpTSxFQUFPbE0sT0FBT3pELElBQUkwRCxFQUN0RG9rQixFQUFlblksRUFBT2xNLE9BQU94RCxJQUFJMEQsRUFBSWdNLEVBQU9sTSxPQUFPekQsSUFBSTJELEVBQ3ZEb2tCLEVBQWVGLEVBQWNsWSxFQUFPMUUsUUFBUTJQLE1BQzVDb04sRUFBZUYsRUFBZW5ZLEVBQU8xRSxRQUFRNFAsT0FFakRsTCxFQUFPMlcsUUFBUTJCLGFBQ1h0WSxFQUFPMUUsUUFBUXNTLFdBQWF3SyxFQUFjLEVBQUcsRUFDN0NwWSxFQUFPMUUsUUFBUXNTLFdBQWF5SyxFQUFjLEVBQUcsR0FHakRyWSxFQUFPMlcsUUFBUWppQixXQUFXc0wsRUFBT2xNLE9BQU96RCxJQUFJMEQsR0FBSWlNLEVBQU9sTSxPQUFPekQsSUFBSTJELEVBQ3RFLEVBT0F3ZixFQUFPK0UsaUJBQW1CLFNBQVN2WSxHQUMvQkEsRUFBTzJXLFFBQVEyQixhQUFhdFksRUFBTzFFLFFBQVFzUyxXQUFZLEVBQUcsRUFBRzVOLEVBQU8xRSxRQUFRc1MsV0FBWSxFQUFHLEVBQy9GLEVBUUE0RixFQUFPNkQsTUFBUSxTQUFTclgsRUFBUW1YLEdBQzVCLElBYUk3ckIsRUFiQWt0QixFQUFZbnJCLEVBQU9tRCxNQUNuQitqQixFQUFTdlUsRUFBT3VVLE9BQ2hCOEMsRUFBUTlDLEVBQU84QyxNQUNmN0MsRUFBU3hVLEVBQU93VSxPQUNoQm1DLEVBQVUzVyxFQUFPMlcsUUFDakJyYixFQUFVMEUsRUFBTzFFLFFBQ2pCb1osRUFBUzFVLEVBQU8wVSxPQUVoQnpZLEVBQVliLEVBQVVhLFVBQVVvYixHQUNoQ25iLEVBQWlCZCxFQUFVYyxlQUFlbWIsR0FDMUNoQyxFQUFhL1osRUFBUW1hLFdBQWFuYSxFQUFRZ2Esb0JBQXNCaGEsRUFBUStaLFdBQ3hFMVosRUFBUyxHQUNUQyxFQUFjLEdBR2RWLEVBQVEsQ0FDUitNLFVBQVdzTSxFQUFPRyxPQUFPek0sV0FnQjdCLEdBYkF6TixFQUFPUyxRQUFRK0UsRUFBUSxlQUFnQjlFLEdBR25DOEUsRUFBT3lZLG9CQUFzQnBELEdBQzdCcUQsRUFBaUIxWSxFQUFRcVYsR0FHN0JzQixFQUFRZ0MseUJBQTJCLFlBQ25DaEMsRUFBUXZXLFVBQVksY0FDcEJ1VyxFQUFRaUMsU0FBUyxFQUFHLEVBQUdwRSxFQUFPdkosTUFBT3VKLEVBQU90SixRQUM1Q3lMLEVBQVFnQyx5QkFBMkIsY0FHL0JyZCxFQUFRaWEsVUFBVyxDQUVuQixJQUFLanFCLEVBQUksRUFBR0EsRUFBSTJRLEVBQVUvTixPQUFRNUMsSUFBSyxDQUNuQyxJQUFJdUwsRUFBT29GLEVBQVUzUSxHQUNqQnNJLEVBQU9XLFNBQVNzQyxFQUFLL0MsT0FBUWtNLEVBQU9sTSxTQUNwQzZILEVBQU9uTixLQUFLcUksRUFDcEIsQ0FHQSxJQUFLdkwsRUFBSSxFQUFHQSxFQUFJNFEsRUFBZWhPLE9BQVE1QyxJQUFLLENBQ3hDLElBQUl1UixFQUFhWCxFQUFlNVEsR0FDNUI0WSxFQUFRckgsRUFBV3FILE1BQ25CQyxFQUFRdEgsRUFBV3NILE1BQ25COEYsRUFBY3BOLEVBQVdvTSxPQUN6QmlCLEVBQWNyTixFQUFXcU0sT0FFekJoRixJQUFPK0YsRUFBY2pWLEVBQU9pQixJQUFJaU8sRUFBTXJQLFNBQVVnSSxFQUFXb00sU0FDM0Q5RSxJQUFPK0YsRUFBY2xWLEVBQU9pQixJQUFJa08sRUFBTXRQLFNBQVVnSSxFQUFXcU0sU0FFMURlLEdBQWdCQyxJQUdqQnRXLEVBQU9TLFNBQVMyTCxFQUFPbE0sT0FBUW1XLElBQWdCclcsRUFBT1MsU0FBUzJMLEVBQU9sTSxPQUFRb1csS0FDOUV0TyxFQUFZcE4sS0FBS3FPLEVBQ3pCLENBR0EyVyxFQUFPeUUsbUJBQW1CalksR0FHdEJBLEVBQU9xTixRQUNQRixFQUFNd0IsU0FBUzNPLEVBQU9xTixNQUFPLENBQ3pCdFosR0FBSWlNLEVBQU9sTSxPQUFPeEQsSUFBSXlELEVBQUlpTSxFQUFPbE0sT0FBT3pELElBQUkwRCxHQUFLaU0sRUFBTzFFLFFBQVEyUCxNQUNoRWpYLEdBQUlnTSxFQUFPbE0sT0FBT3hELElBQUkwRCxFQUFJZ00sRUFBT2xNLE9BQU96RCxJQUFJMkQsR0FBS2dNLEVBQU8xRSxRQUFRNFAsU0FHcEVpQyxFQUFNdUIsVUFBVTFPLEVBQU9xTixNQUFPck4sRUFBT2xNLE9BQU96RCxLQUVwRCxNQUNJdUwsRUFBY00sRUFDZFAsRUFBU00sRUFFeUIsSUFBOUIrRCxFQUFPMUUsUUFBUXNTLFlBQ2Y1TixFQUFPMlcsUUFBUTJCLGFBQWF0WSxFQUFPMUUsUUFBUXNTLFdBQVksRUFBRyxFQUFHNU4sRUFBTzFFLFFBQVFzUyxXQUFZLEVBQUcsSUFJOUZ0UyxFQUFRbWEsWUFBZWxCLEVBQU9zRSxnQkFBa0J2ZCxFQUFRb2EsYUFFekRsQyxFQUFPN1gsT0FBT3FFLEVBQVFyRSxFQUFRZ2IsSUFFMUJyYixFQUFRaWIsaUJBQ1IvQyxFQUFPc0YsZ0JBQWdCOVksRUFBUXJFLEVBQVFnYixHQUczQ25ELEVBQU91RixlQUFlL1ksRUFBUXJFLEVBQVFnYixJQUd0Q3JiLEVBQVF3YSxZQUNSdEMsRUFBT3dGLFdBQVdoWixFQUFRckUsRUFBUWdiLElBRWxDcmIsRUFBUTRhLFVBQVk1YSxFQUFROGEscUJBQzVCNUMsRUFBT3lGLFNBQVNqWixFQUFRckUsRUFBUWdiLEdBRWhDcmIsRUFBUTZhLGVBQ1IzQyxFQUFPMEYsY0FBY2xaLEVBQVFyRSxFQUFRZ2IsR0FFckNyYixFQUFReWEsY0FDUnZDLEVBQU8yRixhQUFhblosRUFBUXJFLEVBQVFnYixHQUVwQ3JiLEVBQVErYSxTQUNSN0MsRUFBTzRGLFFBQVFwWixFQUFRckUsRUFBUWdiLEdBRS9CcmIsRUFBUTJhLGlCQUNSekMsRUFBTzZGLFlBQVlyWixFQUFRdVUsRUFBT3pRLE1BQU16UixLQUFNc2tCLEdBRTlDcmIsRUFBUTBhLGdCQUNSeEMsRUFBT3RELFdBQVdsUSxFQUFRdVUsRUFBT3pRLE1BQU16UixLQUFNc2tCLEdBRTdDcmIsRUFBUWdiLG1CQUNSOUMsRUFBTzhGLGNBQWN0WixFQUFRckUsRUFBUWdiLEdBRXJDcmIsRUFBUW1iLG1CQUNSakQsRUFBTytGLGNBQWN2WixFQUFRQSxFQUFPcU4sTUFBT3NKLEdBRS9DbkQsRUFBTzVYLFlBQVlBLEVBQWErYSxHQUU1QnJiLEVBQVFpYSxXQUVSL0IsRUFBTytFLGlCQUFpQnZZLEdBRzVCeEYsRUFBT1MsUUFBUStFLEVBQVEsY0FBZTlFLEdBR3RDd1osRUFBT0ssWUFBYzFuQixFQUFPbUQsTUFBUWdvQixDQUN4QyxFQVVBaEYsRUFBTzhELE1BQVEsU0FBU3RYLEVBQVEyVyxFQUFTUSxHQVdyQyxJQVZBLElBQUk1QyxFQUFTdlUsRUFBT3VVLE9BQ2hCOEMsRUFBUTlDLEVBQU84QyxNQUNmMWIsRUFBU1AsRUFBVWEsVUFBVW9iLEdBQzdCcG9CLEVBQVEsRUFHUjhFLEVBQUksRUFJQ3pJLEVBQUksRUFBR0EsRUFBSXFRLEVBQU96TixPQUFRNUMsR0FBSyxFQUNwQzJELEdBQVMwTSxFQUFPclEsR0FBRzJELE1BQU1mLE9BSTdCLElBQUlzckIsRUFBVyxDQUNYLEtBQVF2cUIsRUFDUixLQUFRME0sRUFBT3pOLE9BQ2YsS0FBUWtOLEVBQVVjLGVBQWVtYixHQUFPbnBCLE9BQ3hDLEtBQVFrTixFQUFVZSxjQUFja2IsR0FBT25wQixPQUN2QyxLQUFRcW1CLEVBQU96USxNQUFNelIsS0FBS25FLFFBWTlCLElBQUssSUFBSXRCLEtBUlQrcEIsRUFBUXZXLFVBQVksVUFDcEJ1VyxFQUFRaUMsU0FBUzdrQixFQWxCVCxFQWtCZWtYLE1BcEJWLElBc0JiMEwsRUFBUThDLEtBQU8sYUFDZjlDLEVBQVErQyxhQUFlLE1BQ3ZCL0MsRUFBUWdELFVBQVksUUFHSkgsRUFBVSxDQUN0QixJQUFJSSxFQUFVSixFQUFTNXNCLEdBRXZCK3BCLEVBQVF2VyxVQUFZLE9BQ3BCdVcsRUFBUWtELFNBQVNqdEIsRUFBS21ILEVBaENkLEdBZ0N5QkMsR0FHakMyaUIsRUFBUXZXLFVBQVksT0FDcEJ1VyxFQUFRa0QsU0FBU0QsRUFBUzdsQixFQXBDbEIsR0FvQzZCQyxJQUVyQ0QsR0F0Q1EsRUF1Q1osQ0FDSixFQVNBeWYsRUFBTzlpQixZQUFjLFNBQVNzUCxFQUFRMlcsR0FDbEMsSUFBSXBDLEVBQVN2VSxFQUFPdVUsT0FDaEJHLEVBQVMxVSxFQUFPMFUsT0FDaEJFLEVBQWVGLEVBQU9FLGFBQ3RCUSxFQUFpQlYsRUFBT1UsZUFDeEJILEVBQTBCUCxFQUFPTyx3QkFDakNDLEVBQXFCUixFQUFPUSxtQkFDNUJDLEVBQXVCVCxFQUFPUyxxQkFDOUIyRSxFQUFrQnZGLEVBQU9HLE9BQU9xRixVQUVoQ0MsRUFBWUMsRUFBTXJGLEdBQ2xCc0YsRUFBY0QsRUFBTTdFLEdBQ3BCK0UsRUFBa0JGLEVBQU0vRSxHQUN4QmtGLEVBQW9CSCxFQUFNOUUsR0FFMUJrRixFQUR1QkosRUFBTWhGLEdBQ00rRSxHQUFjLEVBQ2pETSxFQUFPLElBQU9OLEdBQWMsRUFVaENyRCxFQUFRdlcsVUFBWSxVQUNwQnVXLEVBQVFpQyxTQUFTLEVBQUcsR0FBSTJCLElBTlgsSUFTYi9HLEVBQU9kLE9BQ0hpRSxFQVRJLEdBQ0EsR0FISSxHQUZNLEVBYXFCL0IsRUFBYTFtQixPQUNoRG1CLEtBQUttckIsTUFBTUYsR0FBTyxPQUNsQkEsRUFBTTlHLEVBQU9ZLFVBQ2IsU0FBUzlvQixHQUFLLE9BQVFzcEIsRUFBYXRwQixHQUFLMHVCLEVBQWEsQ0FBRyxJQUk1RHhHLEVBQU9kLE9BQ0hpRSxFQUFTNWlCLEdBaEJMLEdBSEksR0FGTSxFQXFCbUNtaEIsRUFBbUJobkIsT0FDcEU0ckIsRUFBZ0JqUCxRQUFRLEdBQUssTUFDN0IySSxFQUFPYSxXQUFheUYsR0FDcEIsU0FBU3h1QixHQUFLLE9BQVE0cEIsRUFBbUI1cEIsR0FBSzZ1QixFQUFtQixDQUFHLElBSXhFM0csRUFBT2QsT0FDSGlFLEVBQVM1aUIsSUF4QkwsR0FISSxHQUZNLEVBNkJ5Q29oQixFQUFxQmpuQixPQUM1RWtzQixFQUFrQnZQLFFBQVEsR0FBSyxNQUMvQixFQUFLdVAsRUFBb0I1RyxFQUFPWSxVQUNoQyxTQUFTOW9CLEdBQUssT0FBUTZwQixFQUFxQjdwQixHQUFLOHVCLEVBQXFCLENBQUcsSUFJNUU1RyxFQUFPZCxPQUNIaUUsRUFBUzVpQixJQWhDTCxHQUhJLEdBRk0sRUFxQ3lDcWhCLEVBQWVsbkIsT0FDdEVnc0IsRUFBWXJQLFFBQVEsR0FBSyxNQUN6QixFQUFLcVAsRUFBYzFHLEVBQU9ZLFVBQzFCLFNBQVM5b0IsR0FBSyxPQUFROHBCLEVBQWU5cEIsR0FBSzR1QixFQUFlLENBQUcsSUFJaEUxRyxFQUFPZCxPQUNIaUUsRUFBUzVpQixJQXhDTCxHQUhJLEdBRk0sRUE2Q3lDa2hCLEVBQXdCL21CLE9BQy9FbXNCLEVBQVN4UCxRQUFRLEdBQUssS0FDdEJ3UCxFQUFXQSxFQUFXQSxHQUN0QixTQUFTL3VCLEdBQUssT0FBVTJwQixFQUF3QjNwQixHQUFLc3BCLEVBQWF0cEIsR0FBTSt1QixHQUFhLEdBQUssQ0FBRyxHQUVyRyxFQWdCQTdHLEVBQU9kLE9BQVMsU0FBU2lFLEVBQVM1aUIsRUFBR0MsRUFBR2lYLEVBQU9DLEVBQVF1UCxFQUFPM2UsRUFBTzRlLEVBQVdDLEdBRTVFaEUsRUFBUXhXLFlBQWMsT0FDdEJ3VyxFQUFRdlcsVUFBWSxPQUNwQnVXLEVBQVF0VyxVQUFZLEVBQ3BCc1csRUFBUWlDLFNBQVM3a0IsRUFBR0MsRUFBSSxFQUFHaVgsRUFBTyxHQUdsQzBMLEVBQVFpRSxZQUNSakUsRUFBUWtFLE9BQU85bUIsRUFBR0MsRUFBSSxFQUFJa1gsRUFBUzdkLEVBQU8rQyxNQUFNLEdBQU11cUIsRUFBTSxJQUFLLEVBQUcsSUFDcEUsSUFBSyxJQUFJcnZCLEVBQUksRUFBR0EsRUFBSTJmLEVBQU8zZixHQUFLLEVBQzVCcXJCLEVBQVFtRSxPQUFPL21CLEVBQUl6SSxFQUFHMEksRUFBSSxHQUFLMUksRUFBSW12QixFQUFRdlAsRUFBUzdkLEVBQU8rQyxNQUFNLEdBQU11cUIsRUFBTXJ2QixJQUFLLEVBQUcsR0FBSyxJQUU5RnFyQixFQUFRb0UsU0FHUnBFLEVBQVF2VyxVQUFZLE9BQVMvUyxFQUFPK0MsTUFBTSxHQUFLLEdBQUtzcUIsRUFBVyxFQUFHLEtBQU8sYUFDekUvRCxFQUFRaUMsU0FBUzdrQixFQUFHQyxFQUFJLEVBQUcsRUFBRyxHQUc5QjJpQixFQUFROEMsS0FBTyxhQUNmOUMsRUFBUStDLGFBQWUsU0FDdkIvQyxFQUFRZ0QsVUFBWSxRQUNwQmhELEVBQVF2VyxVQUFZLE9BQ3BCdVcsRUFBUWtELFNBQVMvZCxFQUFPL0gsRUFBSWtYLEVBQU9qWCxFQUFJLEVBQzNDLEVBU0F3ZixFQUFPNVgsWUFBYyxTQUFTQSxFQUFhK2EsR0FHdkMsSUFGQSxJQUFJanJCLEVBQUlpckIsRUFFQ3JyQixFQUFJLEVBQUdBLEVBQUlzUSxFQUFZMU4sT0FBUTVDLElBQUssQ0FDekMsSUFBSXVSLEVBQWFqQixFQUFZdFEsR0FFN0IsR0FBS3VSLEVBQVdtRCxPQUFPQyxTQUFZcEQsRUFBV29NLFFBQVdwTSxFQUFXcU0sT0FBcEUsQ0FHQSxJQUVJOFIsRUFDQXBzQixFQUhBc1YsRUFBUXJILEVBQVdxSCxNQUNuQkMsRUFBUXRILEVBQVdzSCxNQVV2QixHQUxJNlcsRUFEQTlXLEVBQ1FsUCxFQUFPaUIsSUFBSWlPLEVBQU1yUCxTQUFVZ0ksRUFBV29NLFFBRXRDcE0sRUFBV29NLE9BR1EsUUFBM0JwTSxFQUFXbUQsT0FBT3hFLEtBQ2xCOVAsRUFBRWt2QixZQUNGbHZCLEVBQUV1dkIsSUFBSUQsRUFBTWpuQixFQUFHaW5CLEVBQU1obkIsRUFBRyxFQUFHLEVBQUcsRUFBSTNFLEtBQUt5YyxJQUN2Q3BnQixFQUFFd3ZCLGdCQUNDLENBVUgsR0FSSXRzQixFQURBdVYsRUFDTW5QLEVBQU9pQixJQUFJa08sRUFBTXRQLFNBQVVnSSxFQUFXcU0sUUFFdENyTSxFQUFXcU0sT0FHckJ4ZCxFQUFFa3ZCLFlBQ0ZsdkIsRUFBRW12QixPQUFPRyxFQUFNam5CLEVBQUdpbkIsRUFBTWhuQixHQUVPLFdBQTNCNkksRUFBV21ELE9BQU94RSxLQU1sQixJQUxBLElBR0k0SCxFQUhBM0ssRUFBUXpELEVBQU9rQixJQUFJdEgsRUFBS29zQixHQUN4QjlWLEVBQVNsUSxFQUFPc0IsS0FBS3RCLEVBQU9VLFVBQVUrQyxJQUN0QzBpQixFQUFROXJCLEtBQUt1YyxLQUFLdmUsRUFBTytDLE1BQU15TSxFQUFXM08sT0FBUyxFQUFHLEdBQUksS0FHckRrQixFQUFJLEVBQUdBLEVBQUkrckIsRUFBTy9yQixHQUFLLEVBQzVCZ1UsRUFBU2hVLEVBQUksR0FBTSxFQUFJLEdBQUssRUFFNUIxRCxFQUFFb3ZCLE9BQ0VFLEVBQU1qbkIsRUFBSTBFLEVBQU0xRSxHQUFLM0UsRUFBSStyQixHQUFTalcsRUFBT25SLEVBQUlxUCxFQUFTLEVBQ3RENFgsRUFBTWhuQixFQUFJeUUsRUFBTXpFLEdBQUs1RSxFQUFJK3JCLEdBQVNqVyxFQUFPbFIsRUFBSW9QLEVBQVMsR0FLbEUxWCxFQUFFb3ZCLE9BQU9sc0IsRUFBSW1GLEVBQUduRixFQUFJb0YsRUFDeEIsQ0FFSTZJLEVBQVdtRCxPQUFPSyxZQUNsQjNVLEVBQUUyVSxVQUFZeEQsRUFBV21ELE9BQU9LLFVBQ2hDM1UsRUFBRXlVLFlBQWN0RCxFQUFXbUQsT0FBT0csWUFDbEN6VSxFQUFFcXZCLFVBR0ZsZSxFQUFXbUQsT0FBTzBKLFVBQ2xCaGUsRUFBRTBVLFVBQVl2RCxFQUFXbUQsT0FBT0csWUFDaEN6VSxFQUFFa3ZCLFlBQ0ZsdkIsRUFBRXV2QixJQUFJRCxFQUFNam5CLEVBQUdpbkIsRUFBTWhuQixFQUFHLEVBQUcsRUFBRyxFQUFJM0UsS0FBS3ljLElBQ3ZDcGdCLEVBQUV1dkIsSUFBSXJzQixFQUFJbUYsRUFBR25GLEVBQUlvRixFQUFHLEVBQUcsRUFBRyxFQUFJM0UsS0FBS3ljLElBQ25DcGdCLEVBQUV3dkIsWUFDRnh2QixFQUFFMHZCLE9BMURNLENBNERoQixDQUNKLEVBVUE1SCxFQUFPN1gsT0FBUyxTQUFTcUUsRUFBUXJFLEVBQVFnYixHQUNyQyxJQUlJOWYsRUFDQXFMLEVBQ0E1VyxFQUNBMk8sRUFQQXZPLEVBQUlpckIsRUFFSnJiLEdBRFMwRSxFQUFPdVUsT0FDTnZVLEVBQU8xRSxTQUNqQmtiLEVBQW9CbGIsRUFBUWtiLG9CQUFzQmxiLEVBQVFtYSxXQU05RCxJQUFLbnFCLEVBQUksRUFBR0EsRUFBSXFRLEVBQU96TixPQUFRNUMsSUFHM0IsSUFGQXVMLEVBQU84RSxFQUFPclEsSUFFSjBVLE9BQU9DLFFBSWpCLElBQUtoRyxFQUFJcEQsRUFBSzVILE1BQU1mLE9BQVMsRUFBSSxFQUFJLEVBQUcrTCxFQUFJcEQsRUFBSzVILE1BQU1mLE9BQVErTCxJQUczRCxJQUZBaUksRUFBT3JMLEVBQUs1SCxNQUFNZ0wsSUFFUitGLE9BQU9DLFFBQWpCLENBU0EsR0FOSTNFLEVBQVFvYSxjQUFnQjdlLEVBQUtxSSxXQUM3QnhULEVBQUUydkIsWUFBYyxHQUFNblosRUFBS2xDLE9BQU9FLFFBQ0gsSUFBeEJnQyxFQUFLbEMsT0FBT0UsVUFDbkJ4VSxFQUFFMnZCLFlBQWNuWixFQUFLbEMsT0FBT0UsU0FHNUJnQyxFQUFLbEMsT0FBT00sUUFBVTRCLEVBQUtsQyxPQUFPTSxPQUFPZ2IsVUFBWWhnQixFQUFRbWEsV0FBWSxDQUV6RSxJQUFJblYsRUFBUzRCLEVBQUtsQyxPQUFPTSxPQUNyQmdiLEVBQVVDLEVBQVl2YixFQUFRTSxFQUFPZ2IsU0FFekM1dkIsRUFBRWdKLFVBQVV3TixFQUFLck4sU0FBU2QsRUFBR21PLEVBQUtyTixTQUFTYixHQUMzQ3RJLEVBQUUwSixPQUFPOE0sRUFBSzdNLE9BRWQzSixFQUFFOHZCLFVBQ0VGLEVBQ0FBLEVBQVFyUSxPQUFTM0ssRUFBT0csUUFBVUgsRUFBT0MsT0FDekMrYSxFQUFRcFEsUUFBVTVLLEVBQU9JLFFBQVVKLEVBQU9FLE9BQzFDOGEsRUFBUXJRLE1BQVEzSyxFQUFPQyxPQUN2QithLEVBQVFwUSxPQUFTNUssRUFBT0UsUUFJNUI5VSxFQUFFMEosUUFBUThNLEVBQUs3TSxPQUNmM0osRUFBRWdKLFdBQVd3TixFQUFLck4sU0FBU2QsR0FBSW1PLEVBQUtyTixTQUFTYixFQUNqRCxLQUFPLENBRUgsR0FBSWtPLEVBQUt2QixhQUNMalYsRUFBRWt2QixZQUNGbHZCLEVBQUV1dkIsSUFBSS9ZLEVBQUtyTixTQUFTZCxFQUFHbU8sRUFBS3JOLFNBQVNiLEVBQUdrTyxFQUFLdkIsYUFBYyxFQUFHLEVBQUl0UixLQUFLeWMsUUFDcEUsQ0FDSHBnQixFQUFFa3ZCLFlBQ0ZsdkIsRUFBRW12QixPQUFPM1ksRUFBS3JPLFNBQVMsR0FBR0UsRUFBR21PLEVBQUtyTyxTQUFTLEdBQUdHLEdBRTlDLElBQUssSUFBSTVFLEVBQUksRUFBR0EsRUFBSThTLEVBQUtyTyxTQUFTM0YsT0FBUWtCLEtBQ2pDOFMsRUFBS3JPLFNBQVN6RSxFQUFJLEdBQUcySCxZQUFjeWYsRUFDcEM5cUIsRUFBRW92QixPQUFPNVksRUFBS3JPLFNBQVN6RSxHQUFHMkUsRUFBR21PLEVBQUtyTyxTQUFTekUsR0FBRzRFLEdBRTlDdEksRUFBRW12QixPQUFPM1ksRUFBS3JPLFNBQVN6RSxHQUFHMkUsRUFBR21PLEVBQUtyTyxTQUFTekUsR0FBRzRFLEdBRzlDa08sRUFBS3JPLFNBQVN6RSxHQUFHMkgsYUFBZXlmLEdBQ2hDOXFCLEVBQUVtdkIsT0FBTzNZLEVBQUtyTyxVQUFVekUsRUFBSSxHQUFLOFMsRUFBS3JPLFNBQVMzRixRQUFRNkYsRUFBR21PLEVBQUtyTyxVQUFVekUsRUFBSSxHQUFLOFMsRUFBS3JPLFNBQVMzRixRQUFROEYsR0FJaEh0SSxFQUFFb3ZCLE9BQU81WSxFQUFLck8sU0FBUyxHQUFHRSxFQUFHbU8sRUFBS3JPLFNBQVMsR0FBR0csR0FDOUN0SSxFQUFFd3ZCLFdBQ04sQ0FFSzVmLEVBQVFtYSxZQVdUL3BCLEVBQUUyVSxVQUFZLEVBQ2QzVSxFQUFFeVUsWUFBYyxPQUNoQnpVLEVBQUVxdkIsV0FaRnJ2QixFQUFFMFUsVUFBWThCLEVBQUtsQyxPQUFPSSxVQUV0QjhCLEVBQUtsQyxPQUFPSyxZQUNaM1UsRUFBRTJVLFVBQVk2QixFQUFLbEMsT0FBT0ssVUFDMUIzVSxFQUFFeVUsWUFBYytCLEVBQUtsQyxPQUFPRyxZQUM1QnpVLEVBQUVxdkIsVUFHTnJ2QixFQUFFMHZCLE9BTVYsQ0FFQTF2QixFQUFFMnZCLFlBQWMsQ0FyRUosQ0F3RXhCLEVBVUE3SCxFQUFPdUYsZUFBaUIsU0FBUy9ZLEVBQVFyRSxFQUFRZ2IsR0FDN0MsSUFFSTlmLEVBQ0FxTCxFQUNBNVcsRUFDQThELEVBQ0E2SyxFQU5Bdk8sRUFBSWlyQixFQUNKSCxFQUFvQnhXLEVBQU8xRSxRQUFRa2Isa0JBVXZDLElBSEE5cUIsRUFBRWt2QixZQUdHdHZCLEVBQUksRUFBR0EsRUFBSXFRLEVBQU96TixPQUFRNUMsSUFHM0IsSUFGQXVMLEVBQU84RSxFQUFPclEsSUFFSjBVLE9BQU9DLFFBSWpCLElBQUtoRyxFQUFJcEQsRUFBSzVILE1BQU1mLE9BQVMsRUFBSSxFQUFJLEVBQUcrTCxFQUFJcEQsRUFBSzVILE1BQU1mLE9BQVErTCxJQUFLLENBS2hFLElBSkFpSSxFQUFPckwsRUFBSzVILE1BQU1nTCxHQUVsQnZPLEVBQUVtdkIsT0FBTzNZLEVBQUtyTyxTQUFTLEdBQUdFLEVBQUdtTyxFQUFLck8sU0FBUyxHQUFHRyxHQUV6QzVFLEVBQUksRUFBR0EsRUFBSThTLEVBQUtyTyxTQUFTM0YsT0FBUWtCLEtBQzdCOFMsRUFBS3JPLFNBQVN6RSxFQUFJLEdBQUcySCxZQUFjeWYsRUFDcEM5cUIsRUFBRW92QixPQUFPNVksRUFBS3JPLFNBQVN6RSxHQUFHMkUsRUFBR21PLEVBQUtyTyxTQUFTekUsR0FBRzRFLEdBRTlDdEksRUFBRW12QixPQUFPM1ksRUFBS3JPLFNBQVN6RSxHQUFHMkUsRUFBR21PLEVBQUtyTyxTQUFTekUsR0FBRzRFLEdBRzlDa08sRUFBS3JPLFNBQVN6RSxHQUFHMkgsYUFBZXlmLEdBQ2hDOXFCLEVBQUVtdkIsT0FBTzNZLEVBQUtyTyxVQUFVekUsRUFBSSxHQUFLOFMsRUFBS3JPLFNBQVMzRixRQUFRNkYsRUFBR21PLEVBQUtyTyxVQUFVekUsRUFBSSxHQUFLOFMsRUFBS3JPLFNBQVMzRixRQUFROEYsR0FJaEh0SSxFQUFFb3ZCLE9BQU81WSxFQUFLck8sU0FBUyxHQUFHRSxFQUFHbU8sRUFBS3JPLFNBQVMsR0FBR0csRUFDbEQsQ0FHSnRJLEVBQUUyVSxVQUFZLEVBQ2QzVSxFQUFFeVUsWUFBYyxPQUNoQnpVLEVBQUVxdkIsUUFDTixFQVVBdkgsRUFBT3NGLGdCQUFrQixTQUFTOVksRUFBUXJFLEVBQVFnYixHQUM5QyxJQUNJOWYsRUFFQXZMLEVBQ0E4RCxFQUpBMUQsRUFBSWlyQixFQVVSLElBSEFqckIsRUFBRWt2QixZQUdHdHZCLEVBQUksRUFBR0EsRUFBSXFRLEVBQU96TixPQUFRNUMsSUFHM0IsSUFGQXVMLEVBQU84RSxFQUFPclEsSUFFSjBVLE9BQU9DLFNBQWlDLElBQXRCcEosRUFBSzVILE1BQU1mLE9BQXZDLENBS0EsSUFGQXhDLEVBQUVtdkIsT0FBT2hrQixFQUFLaEQsU0FBUyxHQUFHRSxFQUFHOEMsRUFBS2hELFNBQVMsR0FBR0csR0FFekM1RSxFQUFJLEVBQUdBLEVBQUl5SCxFQUFLaEQsU0FBUzNGLE9BQVFrQixJQUNsQzFELEVBQUVvdkIsT0FBT2prQixFQUFLaEQsU0FBU3pFLEdBQUcyRSxFQUFHOEMsRUFBS2hELFNBQVN6RSxHQUFHNEUsR0FHbER0SSxFQUFFb3ZCLE9BQU9qa0IsRUFBS2hELFNBQVMsR0FBR0UsRUFBRzhDLEVBQUtoRCxTQUFTLEdBQUdHLEVBUmxDLENBV2hCdEksRUFBRTJVLFVBQVksRUFDZDNVLEVBQUV5VSxZQUFjLHdCQUNoQnpVLEVBQUVxdkIsUUFDTixFQVVBdkgsRUFBTzhGLGNBQWdCLFNBQVN0WixFQUFRckUsRUFBUWdiLEdBQzVDLElBQ0lyckIsRUFDQThELEVBQ0E2SyxFQUhBdk8sRUFBSWlyQixFQUtSLElBQUtyckIsRUFBSSxFQUFHQSxFQUFJcVEsRUFBT3pOLE9BQVE1QyxJQUFLLENBQ2hDLElBQUkyRCxFQUFRME0sRUFBT3JRLEdBQUcyRCxNQUN0QixJQUFLZ0wsRUFBSWhMLEVBQU1mLE9BQVMsRUFBSSxFQUFJLEVBQUcrTCxFQUFJaEwsRUFBTWYsT0FBUStMLElBQUssQ0FDdEQsSUFBSWlJLEVBQU9qVCxFQUFNZ0wsR0FDakIsSUFBSzdLLEVBQUksRUFBR0EsRUFBSThTLEVBQUtyTyxTQUFTM0YsT0FBUWtCLElBQ2xDMUQsRUFBRTBVLFVBQVksd0JBQ2QxVSxFQUFFbXVCLFNBQVN2dUIsRUFBSSxJQUFNOEQsRUFBRzhTLEVBQUtyTixTQUFTZCxFQUE2QyxJQUF4Q21PLEVBQUtyTyxTQUFTekUsR0FBRzJFLEVBQUltTyxFQUFLck4sU0FBU2QsR0FBVW1PLEVBQUtyTixTQUFTYixFQUE2QyxJQUF4Q2tPLEVBQUtyTyxTQUFTekUsR0FBRzRFLEVBQUlrTyxFQUFLck4sU0FBU2IsR0FFdEosQ0FDSixDQUNKLEVBVUF3ZixFQUFPK0YsY0FBZ0IsU0FBU3ZaLEVBQVFxTixFQUFPc0osR0FDM0MsSUFBSWpyQixFQUFJaXJCLEVBQ1JqckIsRUFBRTBVLFVBQVksd0JBQ2QxVSxFQUFFbXVCLFNBQVN4TSxFQUFNeFksU0FBU2QsRUFBSSxLQUFPc1osRUFBTXhZLFNBQVNiLEVBQUdxWixFQUFNeFksU0FBU2QsRUFBSSxFQUFHc1osRUFBTXhZLFNBQVNiLEVBQUksRUFDcEcsRUFVQXdmLEVBQU93RixXQUFhLFNBQVNoWixFQUFRckUsRUFBUWdiLEdBQ3pDLElBQUlqckIsRUFBSWlyQixFQUVKcmIsR0FEUzBFLEVBQU91VSxPQUNOdlUsRUFBTzFFLFNBRXJCNVAsRUFBRWt2QixZQUVGLElBQUssSUFBSXR2QixFQUFJLEVBQUdBLEVBQUlxUSxFQUFPek4sT0FBUTVDLElBRy9CLEdBRldxUSxFQUFPclEsR0FFVDBVLE9BQU9DLFFBRVosSUFEQSxJQUFJaFIsRUFBUTBNLEVBQU9yUSxHQUFHMkQsTUFDYkcsRUFBSUgsRUFBTWYsT0FBUyxFQUFJLEVBQUksRUFBR2tCLEVBQUlILEVBQU1mLE9BQVFrQixJQUFLLENBQzFELElBQUk4UyxFQUFPalQsRUFBTUcsR0FDakIxRCxFQUFFK3ZCLEtBQUt2WixFQUFLcE8sT0FBT3pELElBQUkwRCxFQUFHbU8sRUFBS3BPLE9BQU96RCxJQUFJMkQsRUFBR2tPLEVBQUtwTyxPQUFPeEQsSUFBSXlELEVBQUltTyxFQUFLcE8sT0FBT3pELElBQUkwRCxFQUFHbU8sRUFBS3BPLE9BQU94RCxJQUFJMEQsRUFBSWtPLEVBQUtwTyxPQUFPekQsSUFBSTJELEVBQzVILENBSUpzSCxFQUFRbWEsV0FDUi9wQixFQUFFeVUsWUFBYyx5QkFFaEJ6VSxFQUFFeVUsWUFBYyxrQkFHcEJ6VSxFQUFFMlUsVUFBWSxFQUNkM1UsRUFBRXF2QixRQUNOLEVBVUF2SCxFQUFPeUYsU0FBVyxTQUFTalosRUFBUXJFLEVBQVFnYixHQUN2QyxJQUdJelUsRUFDQTVXLEVBQ0E4RCxFQUNBNkssRUFOQXZPLEVBQUlpckIsRUFFSnJiLEdBRFMwRSxFQUFPdVUsT0FDTnZVLEVBQU8xRSxTQVFyQixJQUZBNVAsRUFBRWt2QixZQUVHdHZCLEVBQUksRUFBR0EsRUFBSXFRLEVBQU96TixPQUFRNUMsSUFBSyxDQUNoQyxJQUFJdUwsRUFBTzhFLEVBQU9yUSxHQUNkMkQsRUFBUTRILEVBQUs1SCxNQUVqQixHQUFLNEgsRUFBS21KLE9BQU9DLFFBR2pCLEdBQUkzRSxFQUFRNGEsU0FFUixJQUFLOW1CLEVBQUlILEVBQU1mLE9BQVMsRUFBSSxFQUFJLEVBQUdrQixFQUFJSCxFQUFNZixPQUFRa0IsSUFFakQsSUFEQThTLEVBQU9qVCxFQUFNRyxHQUNSNkssRUFBSSxFQUFHQSxFQUFJaUksRUFBS3BCLEtBQUs1UyxPQUFRK0wsSUFBSyxDQUNuQyxJQUFJNEssRUFBTzNDLEVBQUtwQixLQUFLN0csR0FDckJ2TyxFQUFFbXZCLE9BQU8zWSxFQUFLck4sU0FBU2QsRUFBR21PLEVBQUtyTixTQUFTYixHQUN4Q3RJLEVBQUVvdkIsT0FBTzVZLEVBQUtyTixTQUFTZCxFQUFhLEdBQVQ4USxFQUFLOVEsRUFBUW1PLEVBQUtyTixTQUFTYixFQUFhLEdBQVQ2USxFQUFLN1EsRUFDbkUsTUFHSixJQUFLNUUsRUFBSUgsRUFBTWYsT0FBUyxFQUFJLEVBQUksRUFBR2tCLEVBQUlILEVBQU1mLE9BQVFrQixJQUVqRCxJQURBOFMsRUFBT2pULEVBQU1HLEdBQ1I2SyxFQUFJLEVBQUdBLEVBQUlpSSxFQUFLcEIsS0FBSzVTLE9BQVErTCxJQUU5QnZPLEVBQUVtdkIsT0FBTzNZLEVBQUtyTixTQUFTZCxFQUFHbU8sRUFBS3JOLFNBQVNiLEdBQ3hDdEksRUFBRW92QixRQUFRNVksRUFBS3JPLFNBQVMsR0FBR0UsRUFBSW1PLEVBQUtyTyxTQUFTcU8sRUFBS3JPLFNBQVMzRixPQUFPLEdBQUc2RixHQUFLLEdBQ3JFbU8sRUFBS3JPLFNBQVMsR0FBR0csRUFBSWtPLEVBQUtyTyxTQUFTcU8sRUFBS3JPLFNBQVMzRixPQUFPLEdBQUc4RixHQUFLLEVBSXJGLENBRUlzSCxFQUFRbWEsWUFDUi9wQixFQUFFeVUsWUFBYyxZQUNoQnpVLEVBQUUyVSxVQUFZLElBRWQzVSxFQUFFeVUsWUFBYywyQkFDaEJ6VSxFQUFFaXRCLHlCQUEyQixVQUM3Qmp0QixFQUFFMlUsVUFBWSxHQUdsQjNVLEVBQUVxdkIsU0FDRnJ2QixFQUFFaXRCLHlCQUEyQixhQUNqQyxFQVVBbkYsRUFBTzBGLGNBQWdCLFNBQVNsWixFQUFRckUsRUFBUWdiLEdBQzVDLElBR0k5ZixFQUNBcUwsRUFDQTVXLEVBQ0EyTyxFQU5Bdk8sRUFBSWlyQixFQUVKcmIsR0FEUzBFLEVBQU91VSxPQUNOdlUsRUFBTzFFLFNBU3JCLElBSEE1UCxFQUFFa3ZCLFlBR0d0dkIsRUFBSSxFQUFHQSxFQUFJcVEsRUFBT3pOLE9BQVE1QyxJQUczQixJQUZBdUwsRUFBTzhFLEVBQU9yUSxJQUVKMFUsT0FBT0MsUUFJakIsSUFBS2hHLEVBQUksRUFBR0EsRUFBSXBELEVBQUs1SCxNQUFNZixPQUFRK0wsSUFDL0JpSSxFQUFPckwsRUFBSzVILE1BQU1nTCxHQUNsQnZPLEVBQUV1dkIsSUFBSS9ZLEVBQUtyTixTQUFTZCxFQUFHbU8sRUFBS3JOLFNBQVNiLEVBQUcsRUFBRyxFQUFHLEVBQUkzRSxLQUFLeWMsSUFBSSxHQUMzRHBnQixFQUFFd3ZCLFlBY1YsSUFWSTVmLEVBQVFtYSxXQUNSL3BCLEVBQUUwVSxVQUFZLFlBRWQxVSxFQUFFMFUsVUFBWSxrQkFFbEIxVSxFQUFFMHZCLE9BRUYxdkIsRUFBRWt2QixZQUdHdHZCLEVBQUksRUFBR0EsRUFBSXFRLEVBQU96TixPQUFRNUMsS0FDM0J1TCxFQUFPOEUsRUFBT3JRLElBQ0wwVSxPQUFPQyxVQUNadlUsRUFBRXV2QixJQUFJcGtCLEVBQUsrSixhQUFhN00sRUFBRzhDLEVBQUsrSixhQUFhNU0sRUFBRyxFQUFHLEVBQUcsRUFBSTNFLEtBQUt5YyxJQUFJLEdBQ25FcGdCLEVBQUV3dkIsYUFJVnh2QixFQUFFMFUsVUFBWSxzQkFDZDFVLEVBQUUwdkIsTUFDTixFQVVBNUgsRUFBTzJGLGFBQWUsU0FBU25aLEVBQVFyRSxFQUFRZ2IsR0FDM0MsSUFBSWpyQixFQUFJaXJCLEVBRVJqckIsRUFBRWt2QixZQUVGLElBQUssSUFBSXR2QixFQUFJLEVBQUdBLEVBQUlxUSxFQUFPek4sT0FBUTVDLElBQUssQ0FDcEMsSUFBSXVMLEVBQU84RSxFQUFPclEsR0FFYnVMLEVBQUttSixPQUFPQyxVQUdqQnZVLEVBQUVtdkIsT0FBT2hrQixFQUFLaEMsU0FBU2QsRUFBRzhDLEVBQUtoQyxTQUFTYixHQUN4Q3RJLEVBQUVvdkIsT0FBT2prQixFQUFLaEMsU0FBU2QsRUFBOEMsR0FBekM4QyxFQUFLaEMsU0FBU2QsRUFBSThDLEVBQUsrSixhQUFhN00sR0FBUThDLEVBQUtoQyxTQUFTYixFQUE4QyxHQUF6QzZDLEVBQUtoQyxTQUFTYixFQUFJNkMsRUFBSytKLGFBQWE1TSxJQUNuSSxDQUVBdEksRUFBRTJVLFVBQVksRUFDZDNVLEVBQUV5VSxZQUFjLGlCQUNoQnpVLEVBQUVxdkIsUUFDTixFQVVBdkgsRUFBTzRGLFFBQVUsU0FBU3BaLEVBQVFyRSxFQUFRZ2IsR0FDdEMsSUFDSXJyQixFQUNBOEQsRUFGQTFELEVBQUlpckIsRUFJUixJQUFLcnJCLEVBQUksRUFBR0EsRUFBSXFRLEVBQU96TixPQUFRNUMsSUFDM0IsR0FBS3FRLEVBQU9yUSxHQUFHMFUsT0FBT0MsUUFBdEIsQ0FHQSxJQUFJaFIsRUFBUTBNLEVBQU9yUSxHQUFHMkQsTUFDdEIsSUFBS0csRUFBSUgsRUFBTWYsT0FBUyxFQUFJLEVBQUksRUFBR2tCLEVBQUlILEVBQU1mLE9BQVFrQixJQUFLLENBQ3RELElBQUk4UyxFQUFPalQsRUFBTUcsR0FDakIxRCxFQUFFK3RCLEtBQU8sYUFDVC90QixFQUFFMFUsVUFBWSx3QkFDZDFVLEVBQUVtdUIsU0FBUzNYLEVBQUszRyxHQUFJMkcsRUFBS3JOLFNBQVNkLEVBQUksR0FBSW1PLEVBQUtyTixTQUFTYixFQUFJLEdBQ2hFLENBUlksQ0FVcEIsRUFVQXdmLEVBQU90RCxXQUFhLFNBQVNsUSxFQUFROEQsRUFBTzZTLEdBQ3hDLElBRUk1UyxFQUNBRSxFQUlBM1ksRUFDQThELEVBUkExRCxFQUFJaXJCLEVBQ0pyYixFQUFVMEUsRUFBTzFFLFFBWXJCLElBSEE1UCxFQUFFa3ZCLFlBR0d0dkIsRUFBSSxFQUFHQSxFQUFJd1ksRUFBTTVWLE9BQVE1QyxJQUcxQixJQUZBeVksRUFBT0QsRUFBTXhZLElBRUgwWSxTQUlWLElBREFDLEVBQVlGLEVBQUtFLFVBQ1o3VSxFQUFJLEVBQUdBLEVBQUkyVSxFQUFLb0UsZUFBZWphLE9BQVFrQixJQUFLLENBQzdDLElBQ0lnRixFQURVMlAsRUFBS29FLGVBQWUvWSxHQUNiZ0YsT0FDckIxSSxFQUFFK3ZCLEtBQUtybkIsRUFBT0wsRUFBSSxJQUFLSyxFQUFPSixFQUFJLElBQUssSUFBSyxJQUNoRCxDQWFKLElBVklzSCxFQUFRbWEsV0FDUi9wQixFQUFFMFUsVUFBWSx3QkFFZDFVLEVBQUUwVSxVQUFZLFNBRWxCMVUsRUFBRTB2QixPQUVGMXZCLEVBQUVrdkIsWUFHR3R2QixFQUFJLEVBQUdBLEVBQUl3WSxFQUFNNVYsT0FBUTVDLElBRzFCLElBRkF5WSxFQUFPRCxFQUFNeFksSUFFSDBZLFdBR1ZDLEVBQVlGLEVBQUtFLFVBRWJGLEVBQUtvRSxlQUFlamEsT0FBUyxHQUFHLENBQ2hDLElBQUl3dEIsRUFBYTNYLEVBQUtvRSxlQUFlLEdBQUcvVCxPQUFPTCxFQUMzQzRuQixFQUFhNVgsRUFBS29FLGVBQWUsR0FBRy9ULE9BQU9KLEVBRVosSUFBL0IrUCxFQUFLb0UsZUFBZWphLFNBQ3BCd3RCLEdBQWMzWCxFQUFLb0UsZUFBZSxHQUFHL1QsT0FBT0wsRUFBSWdRLEVBQUtvRSxlQUFlLEdBQUcvVCxPQUFPTCxHQUFLLEVBQ25GNG5CLEdBQWM1WCxFQUFLb0UsZUFBZSxHQUFHL1QsT0FBT0osRUFBSStQLEVBQUtvRSxlQUFlLEdBQUcvVCxPQUFPSixHQUFLLEdBR25GaVEsRUFBVUUsUUFBVUYsRUFBVW9CLFNBQVMsR0FBR3hPLE9BQXFDLElBQTdCb04sRUFBVUMsTUFBTXZHLFNBQ2xFalMsRUFBRW12QixPQUFPYSxFQUFrQyxFQUFyQnpYLEVBQVVpQixPQUFPblIsRUFBTzRuQixFQUFrQyxFQUFyQjFYLEVBQVVpQixPQUFPbFIsR0FFNUV0SSxFQUFFbXZCLE9BQU9hLEVBQWtDLEVBQXJCelgsRUFBVWlCLE9BQU9uUixFQUFPNG5CLEVBQWtDLEVBQXJCMVgsRUFBVWlCLE9BQU9sUixHQUdoRnRJLEVBQUVvdkIsT0FBT1ksRUFBWUMsRUFDekIsQ0FHQXJnQixFQUFRbWEsV0FDUi9wQixFQUFFeVUsWUFBYyxzQkFFaEJ6VSxFQUFFeVUsWUFBYyxTQUdwQnpVLEVBQUUyVSxVQUFZLEVBQ2QzVSxFQUFFcXZCLFFBQ04sRUFVQXZILEVBQU82RixZQUFjLFNBQVNyWixFQUFROEQsRUFBTzZTLEdBQ3pDLElBRUk1UyxFQUNBRSxFQUVBQyxFQUNBQyxFQUNBN1ksRUFQQUksRUFBSWlyQixFQUNKcmIsRUFBVTBFLEVBQU8xRSxRQVlyQixJQUhBNVAsRUFBRWt2QixZQUdHdHZCLEVBQUksRUFBR0EsRUFBSXdZLEVBQU01VixPQUFRNUMsSUFHMUIsSUFGQXlZLEVBQU9ELEVBQU14WSxJQUVIMFksU0FBVixDQUlBRSxHQURBRCxFQUFZRixFQUFLRSxXQUNDQyxNQUdsQixJQUFJakssRUFBSSxHQUZSa0ssRUFBUUYsRUFBVUUsT0FJUHhHLFVBQWF1RyxFQUFNdkcsV0FBVTFELEVBQUksSUFDeENrSyxFQUFNeEcsV0FBVTFELEVBQUksR0FFeEJ2TyxFQUFFbXZCLE9BQU8xVyxFQUFNdFAsU0FBU2QsRUFBR29RLEVBQU10UCxTQUFTYixHQUMxQ3RJLEVBQUVvdkIsT0FBTzNXLEVBQU10UCxTQUFTZCxFQUFJa1EsRUFBVW1CLFlBQVlyUixFQUFJa0csRUFBR2tLLEVBQU10UCxTQUFTYixFQUFJaVEsRUFBVW1CLFlBQVlwUixFQUFJaUcsR0FFdEdBLEVBQUksRUFFQ2tLLEVBQU14RyxVQUFhdUcsRUFBTXZHLFdBQVUxRCxFQUFJLElBQ3hDaUssRUFBTXZHLFdBQVUxRCxFQUFJLEdBRXhCdk8sRUFBRW12QixPQUFPM1csRUFBTXJQLFNBQVNkLEVBQUdtUSxFQUFNclAsU0FBU2IsR0FDMUN0SSxFQUFFb3ZCLE9BQU81VyxFQUFNclAsU0FBU2QsRUFBSWtRLEVBQVVtQixZQUFZclIsRUFBSWtHLEVBQUdpSyxFQUFNclAsU0FBU2IsRUFBSWlRLEVBQVVtQixZQUFZcFIsRUFBSWlHLEVBcEIxRixDQXVCWnFCLEVBQVFtYSxXQUNSL3BCLEVBQUV5VSxZQUFjLHNCQUVoQnpVLEVBQUV5VSxZQUFjLFNBRXBCelUsRUFBRXF2QixRQUNOLEVBU0F2SCxFQUFPb0ksVUFBWSxTQUFTQSxFQUFXakYsR0FDdEJpRixFQUFVckgsT0FBdkIsSUFJSXpnQixFQUhBK25CLEVBQVdELEVBQVVDLFNBQ3JCN2IsRUFBUzRiLEVBQVU1YixPQUNuQjFFLEVBQVUwRSxFQUFPMUUsUUFHckIsR0FBSUEsRUFBUWlhLFVBQVcsQ0FDbkIsSUFBSTJDLEVBQWNsWSxFQUFPbE0sT0FBT3hELElBQUl5RCxFQUFJaU0sRUFBT2xNLE9BQU96RCxJQUFJMEQsRUFDdERva0IsRUFBZW5ZLEVBQU9sTSxPQUFPeEQsSUFBSTBELEVBQUlnTSxFQUFPbE0sT0FBT3pELElBQUkyRCxFQUN2RG9rQixFQUFlRixFQUFjbFksRUFBTzFFLFFBQVEyUCxNQUM1Q29OLEVBQWVGLEVBQWVuWSxFQUFPMUUsUUFBUTRQLE9BRWpEeUwsRUFBUXJlLE1BQU0sRUFBSThmLEVBQWMsRUFBSUMsR0FDcEMxQixFQUFRamlCLFdBQVdzTCxFQUFPbE0sT0FBT3pELElBQUkwRCxHQUFJaU0sRUFBT2xNLE9BQU96RCxJQUFJMkQsRUFDL0QsQ0FFQSxJQUFLLElBQUkxSSxFQUFJLEVBQUdBLEVBQUl1d0IsRUFBUzN0QixPQUFRNUMsSUFBSyxDQUN0QyxJQUFJd3dCLEVBQU9ELEVBQVN2d0IsR0FBR3l3QixLQU92QixPQUxBcEYsRUFBUWppQixVQUFVLEdBQUssSUFDdkJpaUIsRUFBUXRXLFVBQVksRUFDcEJzVyxFQUFReFcsWUFBYyxzQkFDdEJ3VyxFQUFRcUYsWUFBWSxDQUFDLEVBQUUsSUFFZkYsRUFBS3RnQixNQUViLElBQUssT0FHRDFILEVBQVNnb0IsRUFBS2hvQixPQUNkNmlCLEVBQVFpRSxZQUNSakUsRUFBUThFLEtBQUtwc0IsS0FBS0MsTUFBTXdFLEVBQU96RCxJQUFJMEQsRUFBSSxHQUFJMUUsS0FBS0MsTUFBTXdFLEVBQU96RCxJQUFJMkQsRUFBSSxHQUNqRTNFLEtBQUtDLE1BQU13RSxFQUFPeEQsSUFBSXlELEVBQUlELEVBQU96RCxJQUFJMEQsRUFBSSxHQUFJMUUsS0FBS0MsTUFBTXdFLEVBQU94RCxJQUFJMEQsRUFBSUYsRUFBT3pELElBQUkyRCxFQUFJLElBQzFGMmlCLEVBQVF1RSxZQUNSdkUsRUFBUW9FLFNBRVIsTUFFSixJQUFLLGFBR0QsSUFBSXptQixFQUFRd25CLEVBQUs3UyxPQUNiNlMsRUFBSzVYLFFBQ0w1UCxFQUFRd25CLEVBQUs1UyxRQUNqQnlOLEVBQVFpRSxZQUNSakUsRUFBUXNFLElBQUkzbUIsRUFBTVAsRUFBR08sRUFBTU4sRUFBRyxHQUFJLEVBQUcsRUFBSTNFLEtBQUt5YyxJQUM5QzZLLEVBQVF1RSxZQUNSdkUsRUFBUW9FLFNBTVpwRSxFQUFRcUYsWUFBWSxJQUNwQnJGLEVBQVFqaUIsV0FBVyxJQUFNLEdBQzdCLENBRzhCLE9BQTFCa25CLEVBQVVLLGNBQ1Z0RixFQUFRamlCLFVBQVUsR0FBSyxJQUN2QmlpQixFQUFRdFcsVUFBWSxFQUNwQnNXLEVBQVF4VyxZQUFjLHNCQUN0QndXLEVBQVF2VyxVQUFZLHNCQUNwQnRNLEVBQVM4bkIsRUFBVU0sYUFDbkJ2RixFQUFRaUUsWUFDUmpFLEVBQVE4RSxLQUFLcHNCLEtBQUtDLE1BQU13RSxFQUFPekQsSUFBSTBELEdBQUkxRSxLQUFLQyxNQUFNd0UsRUFBT3pELElBQUkyRCxHQUN6RDNFLEtBQUtDLE1BQU13RSxFQUFPeEQsSUFBSXlELEVBQUlELEVBQU96RCxJQUFJMEQsR0FBSTFFLEtBQUtDLE1BQU13RSxFQUFPeEQsSUFBSTBELEVBQUlGLEVBQU96RCxJQUFJMkQsSUFDbEYyaUIsRUFBUXVFLFlBQ1J2RSxFQUFRb0UsU0FDUnBFLEVBQVF5RSxPQUNSekUsRUFBUWppQixXQUFXLElBQU0sS0FHekI0RyxFQUFRaWEsV0FDUm9CLEVBQVEyQixhQUFhLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxFQUM1QyxFQVNBLElBQUlsQixFQUFnQixTQUFTcFgsRUFBUW1YLEdBQ2pDLElBQUk1QyxFQUFTdlUsRUFBT3VVLE9BQ2hCRyxFQUFTMVUsRUFBTzBVLE9BQ2hCQyxFQUFjRCxFQUFPQyxZQUNyQjFNLEVBQVlzTSxFQUFPRyxPQUFPek0sVUFFOUJ5TSxFQUFPamMsTUFBUTBlLEVBQU96QyxFQUFPRyxVQUFZckIsRUFBT2EsV0FDaERLLEVBQU9HLFNBQVdzQyxFQUVsQnpDLEVBQU9NLGlCQUFtQi9NLEVBQVl5TSxFQUFPSSxlQUFpQixFQUM5REosRUFBT0ksY0FBZ0I3TSxFQUV2QnlNLEVBQU9FLGFBQWF1SCxRQUFRekgsRUFBT2pjLE9BQ25DaWMsRUFBT0UsYUFBYTFtQixPQUFTbUIsS0FBS2dCLElBQUlxa0IsRUFBT0UsYUFBYTFtQixPQUFReW1CLEdBRWxFRCxFQUFPUSxtQkFBbUJpSCxRQUFRNUgsRUFBT0csT0FBT3FGLFdBQ2hEckYsRUFBT1EsbUJBQW1CaG5CLE9BQVNtQixLQUFLZ0IsSUFBSXFrQixFQUFPUSxtQkFBbUJobkIsT0FBUXltQixHQUU5RUQsRUFBT08sd0JBQXdCa0gsUUFBUXpILEVBQU9NLGtCQUM5Q04sRUFBT08sd0JBQXdCL21CLE9BQVNtQixLQUFLZ0IsSUFBSXFrQixFQUFPTyx3QkFBd0IvbUIsT0FBUXltQixHQUV4RkQsRUFBT1MscUJBQXFCZ0gsUUFBUTVILEVBQU9HLE9BQU9LLGFBQ2xETCxFQUFPUyxxQkFBcUJqbkIsT0FBU21CLEtBQUtnQixJQUFJcWtCLEVBQU9TLHFCQUFxQmpuQixPQUFReW1CLEdBRWxGRCxFQUFPVSxlQUFlK0csUUFBUXpILEVBQU9LLGFBQ3JDTCxFQUFPVSxlQUFlbG5CLE9BQVNtQixLQUFLZ0IsSUFBSXFrQixFQUFPVSxlQUFlbG5CLE9BQVF5bUIsRUFDMUUsRUFTSXNGLEVBQVEsU0FBU3hyQixHQUVqQixJQURBLElBQUlpRSxFQUFTLEVBQ0pwSCxFQUFJLEVBQUdBLEVBQUltRCxFQUFPUCxPQUFRNUMsR0FBSyxFQUNwQ29ILEdBQVVqRSxFQUFPbkQsR0FFckIsT0FBUW9ILEVBQVNqRSxFQUFPUCxRQUFXLENBQ3ZDLEVBU0l3b0IsRUFBZ0IsU0FBU3pMLEVBQU9DLEdBQ2hDLElBQUlzSixFQUFTbEgsU0FBUzhPLGNBQWMsVUFLcEMsT0FKQTVILEVBQU92SixNQUFRQSxFQUNmdUosRUFBT3RKLE9BQVNBLEVBQ2hCc0osRUFBTzZILGNBQWdCLFdBQWEsT0FBTyxDQUFPLEVBQ2xEN0gsRUFBTzhILGNBQWdCLFdBQWEsT0FBTyxDQUFPLEVBQzNDOUgsQ0FDWCxFQVNJZ0QsRUFBaUIsU0FBU2hELEdBQzFCLElBQUltQyxFQUFVbkMsRUFBT29DLFdBQVcsTUFNaEMsT0FMdUJubUIsT0FBTzhyQixrQkFBb0IsSUFDckI1RixFQUFRNkYsOEJBQWdDN0YsRUFBUThGLDJCQUM1QzlGLEVBQVErRiwwQkFBNEIvRixFQUFRZ0cseUJBQzVDaEcsRUFBUWlHLHdCQUEwQixFQUd2RSxFQVVJckIsRUFBYyxTQUFTdmIsRUFBUTZjLEdBQy9CLElBQUlDLEVBQVE5YyxFQUFPNlcsU0FBU2dHLEdBRTVCLE9BQUlDLEtBR0pBLEVBQVE5YyxFQUFPNlcsU0FBU2dHLEdBQWEsSUFBSUUsT0FDbkNDLElBQU1ILEVBRUxDLEVBQ1gsRUFTSXBFLEVBQW1CLFNBQVMxWSxFQUFRcVYsR0FDcEMsSUFBSTRILEVBQWdCNUgsRUFFaEIsaUJBQWlCdEMsS0FBS3NDLEtBQ3RCNEgsRUFBZ0IsT0FBUzVILEVBQWEsS0FFMUNyVixFQUFPd1UsT0FBT2tELE1BQU1yQyxXQUFhNEgsRUFDakNqZCxFQUFPd1UsT0FBT2tELE1BQU13RixlQUFpQixVQUNyQ2xkLEVBQU95WSxrQkFBb0JwRCxDQUMvQixDQW1WSCxDQWx4REQsRUFxeERPLEVBRUQsU0FBVXRxQixFQUFRRCxHQVF4QixJQUFJa2QsRUFBVSxDQUFDLEVBRWZqZCxFQUFPRCxRQUFVa2QsRUFVYkEsRUFBUXJiLE9BQVMsU0FBU3lILEdBQ3RCLE1BQU8sQ0FDSEEsT0FBUUEsRUFDUitvQixjQUFlLEVBQ2ZDLGVBQWdCLEVBRXhCLENBS0csRUFFRCxTQUFVcnlCLEVBQVFELEVBQVMsR0FZakMsSUFBSXV5QixFQUFTLENBQUMsRUFFZHR5QixFQUFPRCxRQUFVdXlCLEVBRWpCLElBQUluZixFQUFXLEVBQW9CLEdBQy9Cb2YsRUFBVyxFQUFvQixJQUMvQnZOLEVBQVcsRUFBb0IsSUFDL0J3TixFQUFRLEVBQW9CLElBQzVCL2lCLEVBQVMsRUFBb0IsR0FDN0JZLEVBQVksRUFBb0IsR0FDaEN5TixFQUFhLEVBQW9CLElBQ2pDeGIsRUFBUyxFQUFvQixHQUM3QmdPLEVBQU8sRUFBb0IsR0FZM0JnaUIsRUFBTzF3QixPQUFTLFNBQVMyTyxHQUNyQkEsRUFBVUEsR0FBVyxDQUFDLEVBRXRCLElBb0JJaVosRUFBU2xuQixFQUFPTyxPQXBCTCxDQUNYNHZCLG1CQUFvQixFQUNwQkMsbUJBQW9CLEVBQ3BCQyxxQkFBc0IsRUFDdEI3RSxnQkFBZ0IsRUFDaEJoZSxPQUFRLEdBQ1JrQixPQUFRLENBQUMsRUFDVDRoQixRQUFTLENBQ0w1cEIsRUFBRyxFQUNIQyxFQUFHLEVBQ0hzRSxNQUFPLE1BRVhvYyxPQUFRLENBQ0p6TSxVQUFXLEVBQ1hsSSxVQUFXLEVBQ1hnYSxVQUFXLEVBQ1hoRixZQUFhLElBSWdCelosR0FZckMsT0FWQWlaLEVBQU84QyxNQUFRL2IsRUFBUStiLE9BQVNqYyxFQUFVek8sT0FBTyxDQUFFbVAsTUFBTyxVQUMxRHlZLEVBQU96USxNQUFReEksRUFBUXdJLE9BQVN5WixFQUFNNXdCLFNBQ3RDNG5CLEVBQU90RSxTQUFXM1UsRUFBUTJVLFVBQVlGLEVBQVNwakIsU0FHL0M0bkIsRUFBT3FKLEtBQU8sQ0FBRUMsUUFBUyxJQUN6QnRKLEVBQU84QyxNQUFNc0csUUFBVXBKLEVBQU9vSixRQUM5QnBKLEVBQU91SixXQUFhdkosRUFBT3FKLEtBQzNCckosRUFBT3dKLFFBQVUsQ0FBQyxFQUVYeEosQ0FDWCxFQWlCQThJLEVBQU9wcEIsT0FBUyxTQUFTc2dCLEVBQVE5YixFQUFPc0ssR0FDcEMsSUFBSXlWLEVBQVluckIsRUFBT21ELE1BRXZCaUksRUFBUUEsR0FBUyxJQUFPLEdBQ3hCc0ssRUFBYUEsR0FBYyxFQUUzQixJQUtJelgsRUFMQStyQixFQUFROUMsRUFBTzhDLE1BQ2ZwSCxFQUFXc0UsRUFBT3RFLFNBQ2xCbk0sRUFBUXlRLEVBQU96USxNQUNmNFEsRUFBU0gsRUFBT0csT0FDaEJ6TSxFQUFZeU0sRUFBT3pNLFVBSXZCeU0sRUFBT3pNLFdBQWF4UCxFQUFRaWMsRUFBTzNVLFVBQ25DMlUsRUFBT3FGLFVBQVl0aEIsRUFBUWljLEVBQU8zVSxVQUdsQyxJQUFJN0UsRUFBUSxDQUNSK00sVUFBV3lNLEVBQU96TSxXQUd0QnpOLEVBQU9TLFFBQVFzWixFQUFRLGVBQWdCclosR0FHdkMsSUFBSWUsRUFBWWIsRUFBVWEsVUFBVW9iLEdBQ2hDbmIsRUFBaUJkLEVBQVVjLGVBQWVtYixHQXdCOUMsSUFyQklBLEVBQU0zYixZQUNOcVUsRUFBU0MsVUFBVUMsRUFBVWhVLEdBSTdCb2IsRUFBTTNiLFlBQ05OLEVBQVVnQixZQUFZaWIsR0FBTyxHQUFPLEdBQU8sR0FJM0M5QyxFQUFPc0UsZ0JBQ1AzYSxFQUFTakssT0FBT2dJLEVBQVd5WSxFQUFPM1UsV0FHdENzZCxFQUFPVyxvQkFBb0IvaEIsRUFBV3NZLEVBQU9vSixTQUc3Q04sRUFBT1ksY0FBY2hpQixFQUFXeEQsRUFBT2ljLEVBQU8zVSxVQUFXZ0QsRUFBWXNVLEVBQU12akIsUUFHM0UrVSxFQUFXYyxZQUFZMU4sR0FDbEIzUSxFQUFJLEVBQUdBLEVBQUlpcEIsRUFBT21KLHFCQUFzQnB5QixJQUN6Q3VkLEVBQVdnQixTQUFTM04sRUFBZ0J3WSxFQUFPM1UsV0FFL0M4SSxFQUFXOEIsYUFBYTFPLEdBR3hCZ1UsRUFBU25NLE1BQVF5USxFQUFPelEsTUFDeEIsSUFBSW9NLEVBQWFILEVBQVNHLFdBQVdELEdBZXJDLElBWkFzTixFQUFNdHBCLE9BQU82UCxFQUFPb00sRUFBWWpJLEdBRzVCc00sRUFBT3NFLGdCQUNQM2EsRUFBUzJGLGdCQUFnQkMsRUFBTXpSLEtBQU1xaUIsRUFBTzNVLFdBRzVDK0QsRUFBTW9hLGVBQWVod0IsT0FBUyxHQUM5QnNNLEVBQU9TLFFBQVFzWixFQUFRLGlCQUFrQixDQUFFelEsTUFBT0EsRUFBTW9hLGlCQUc1RFosRUFBU2EsaUJBQWlCcmEsRUFBTXpSLE1BQzNCL0csRUFBSSxFQUFHQSxFQUFJaXBCLEVBQU9pSixtQkFBb0JseUIsSUFDdkNneUIsRUFBU2MsY0FBY3RhLEVBQU16UixLQUFNcWlCLEVBQU8zVSxXQU05QyxJQUpBdWQsRUFBU2Usa0JBQWtCcGlCLEdBRzNCNE0sRUFBV2MsWUFBWTFOLEdBQ2xCM1EsRUFBSSxFQUFHQSxFQUFJaXBCLEVBQU9tSixxQkFBc0JweUIsSUFDekN1ZCxFQUFXZ0IsU0FBUzNOLEVBQWdCd1ksRUFBTzNVLFdBTS9DLElBSkE4SSxFQUFXOEIsYUFBYTFPLEdBR3hCcWhCLEVBQVNnQixpQkFBaUJ4YSxFQUFNelIsTUFDM0IvRyxFQUFJLEVBQUdBLEVBQUlpcEIsRUFBT2tKLG1CQUFvQm55QixJQUN2Q2d5QixFQUFTaUIsY0FBY3phLEVBQU16UixLQUFNcWlCLEVBQU8zVSxXQWtCOUMsT0FkSStELEVBQU0wYSxnQkFBZ0J0d0IsT0FBUyxHQUMvQnNNLEVBQU9TLFFBQVFzWixFQUFRLGtCQUFtQixDQUFFelEsTUFBT0EsRUFBTTBhLGtCQUV6RDFhLEVBQU0yYSxhQUFhdndCLE9BQVMsR0FDNUJzTSxFQUFPUyxRQUFRc1osRUFBUSxlQUFnQixDQUFFelEsTUFBT0EsRUFBTTJhLGVBRzFEcEIsRUFBT3FCLG1CQUFtQnppQixHQUUxQnpCLEVBQU9TLFFBQVFzWixFQUFRLGNBQWVyWixHQUd0Q3FaLEVBQU9HLE9BQU9LLFlBQWMxbkIsRUFBT21ELE1BQVFnb0IsRUFFcENqRSxDQUNYLEVBUUE4SSxFQUFPc0IsTUFBUSxTQUFTQyxFQUFTQyxHQUc3QixHQUZBeHhCLEVBQU9PLE9BQU9neEIsRUFBU0MsR0FFbkJBLEVBQVF4SCxNQUFPLENBQ2Z1SCxFQUFRdkgsTUFBUXdILEVBQVF4SCxNQUV4QmdHLEVBQU83ZixNQUFNb2hCLEdBSWIsSUFGQSxJQUFJampCLEVBQVNQLEVBQVVhLFVBQVUyaUIsRUFBUXZILE9BRWhDL3JCLEVBQUksRUFBR0EsRUFBSXFRLEVBQU96TixPQUFRNUMsSUFBSyxDQUNwQyxJQUFJdUwsRUFBTzhFLEVBQU9yUSxHQUNsQjRTLEVBQVNuUCxJQUFJOEgsR0FBTSxHQUNuQkEsRUFBSzBFLEdBQUtsTyxFQUFPMkUsUUFDckIsQ0FDSixDQUNKLEVBT0FxckIsRUFBTzdmLE1BQVEsU0FBUytXLEdBQ3BCZ0osRUFBTS9mLE1BQU0rVyxFQUFPelEsT0FDbkJpTSxFQUFTdlMsTUFBTStXLEVBQU90RSxTQUMxQixFQVFBb04sRUFBT3FCLG1CQUFxQixTQUFTL2lCLEdBQ2pDLElBQUssSUFBSXJRLEVBQUksRUFBR0EsRUFBSXFRLEVBQU96TixPQUFRNUMsSUFBSyxDQUNwQyxJQUFJdUwsRUFBTzhFLEVBQU9yUSxHQUdsQnVMLEVBQUs0SCxNQUFNMUssRUFBSSxFQUNmOEMsRUFBSzRILE1BQU16SyxFQUFJLEVBQ2Y2QyxFQUFLNkgsT0FBUyxDQUNsQixDQUNKLEVBU0EyZSxFQUFPVyxvQkFBc0IsU0FBU3JpQixFQUFRZ2lCLEdBQzFDLElBQUltQixPQUF3QyxJQUFsQm5CLEVBQVFybEIsTUFBd0JxbEIsRUFBUXJsQixNQUFRLEtBRTFFLElBQW1CLElBQWRxbEIsRUFBUTVwQixHQUF5QixJQUFkNHBCLEVBQVEzcEIsSUFBNkIsSUFBakI4cUIsRUFJNUMsSUFBSyxJQUFJeHpCLEVBQUksRUFBR0EsRUFBSXFRLEVBQU96TixPQUFRNUMsSUFBSyxDQUNwQyxJQUFJdUwsRUFBTzhFLEVBQU9yUSxHQUVkdUwsRUFBSzhHLFVBQVk5RyxFQUFLcUksYUFJMUJySSxFQUFLNEgsTUFBTXpLLEdBQUs2QyxFQUFLYSxLQUFPaW1CLEVBQVEzcEIsRUFBSThxQixFQUN4Q2pvQixFQUFLNEgsTUFBTTFLLEdBQUs4QyxFQUFLYSxLQUFPaW1CLEVBQVE1cEIsRUFBSStxQixFQUM1QyxDQUNKLEVBY0F6QixFQUFPWSxjQUFnQixTQUFTdGlCLEVBQVFtSCxFQUFXL0MsRUFBV2dELEVBQVlnYyxHQUN0RSxJQUFLLElBQUl6ekIsRUFBSSxFQUFHQSxFQUFJcVEsRUFBT3pOLE9BQVE1QyxJQUFLLENBQ3BDLElBQUl1TCxFQUFPOEUsRUFBT3JRLEdBRWR1TCxFQUFLOEcsVUFBWTlHLEVBQUtxSSxZQUcxQjdELEVBQUtwSCxPQUFPNEMsRUFBTWlNLEVBQVcvQyxFQUFXZ0QsRUFDNUMsQ0FDSixDQWtPRyxFQUVELFNBQVVoWSxFQUFRRCxFQUFTLEdBUWpDLElBQUl3eUIsRUFBVyxDQUFDLEVBRWhCdnlCLEVBQU9ELFFBQVV3eUIsRUFFakIsSUFBSTNtQixFQUFXLEVBQW9CLEdBQy9CL0MsRUFBUyxFQUFvQixHQUk3QjBwQixFQUFTMEIsZUFBaUIsRUFDMUIxQixFQUFTMkIsc0JBQXdCLEVBQ2pDM0IsRUFBUzRCLGdCQUFrQixHQUMzQjVCLEVBQVM2QixpQkFBbUIsR0FDNUI3QixFQUFTOEIsMEJBQTRCLEVBT3JDOUIsRUFBU2EsaUJBQW1CLFNBQVNyYSxHQUNqQyxJQUFJeFksRUFDQXlZLEVBQ0FzYixFQUNBQyxFQUFjeGIsRUFBTTVWLE9BR3hCLElBQUs1QyxFQUFJLEVBQUdBLEVBQUlnMEIsRUFBYWgwQixLQUN6QnlZLEVBQU9ELEVBQU14WSxJQUVIMFksV0FHVnFiLEVBQWN0YixFQUFLb0UsZUFBZWphLE9BQ2xDNlYsRUFBS0UsVUFBVWMsUUFBUWxHLGVBQWlCd2dCLEVBQ3hDdGIsRUFBS0UsVUFBVWUsUUFBUW5HLGVBQWlCd2dCLEVBRWhELEVBUUEvQixFQUFTYyxjQUFnQixTQUFTdGEsRUFBTy9ELEdBQ3JDLElBQUl6VSxFQUNBeVksRUFDQUUsRUFDQUMsRUFDQUMsRUFDQWUsRUFDQXFhLEVBQ0E1Z0IsRUFDQTZnQixFQUFpQmxDLEVBQVM0QixnQkFDMUJJLEVBQWN4YixFQUFNNVYsT0FHeEIsSUFBSzVDLEVBQUksRUFBR0EsRUFBSWcwQixFQUFhaDBCLEtBQ3pCeVksRUFBT0QsRUFBTXhZLElBRUgwWSxXQUFZRCxFQUFLOUUsV0FJM0JpRixHQURBRCxFQUFZRixFQUFLRSxXQUNDYyxRQUNsQlosRUFBUUYsRUFBVWUsUUFDbEJFLEVBQVNqQixFQUFVaUIsT0FHbkJuQixFQUFLcUUsV0FDRGxELEVBQU9uUixHQUFLb1EsRUFBTXhGLGdCQUFnQjVLLEVBQUlrUSxFQUFVbUIsWUFBWXJSLEVBQUltUSxFQUFNdkYsZ0JBQWdCNUssR0FDcEZtUixFQUFPbFIsR0FBS21RLEVBQU14RixnQkFBZ0IzSyxFQUFJaVEsRUFBVW1CLFlBQVlwUixFQUFJa1EsRUFBTXZGLGdCQUFnQjNLLElBR2hHLElBQUsxSSxFQUFJLEVBQUdBLEVBQUlnMEIsRUFBYWgwQixLQUN6QnlZLEVBQU9ELEVBQU14WSxJQUVIMFksV0FBWUQsRUFBSzlFLFdBSTNCaUYsR0FEQUQsRUFBWUYsRUFBS0UsV0FDQ2MsUUFDbEJaLEVBQVFGLEVBQVVlLFFBQ2xCRSxFQUFTakIsRUFBVWlCLE9BQ25CdkcsR0FBbUJvRixFQUFLcUUsV0FBYXJFLEVBQUtqRSxNQUFRQyxHQUU5Q21FLEVBQU12RyxVQUFZd0csRUFBTXhHLFlBQ3hCZ0IsR0FBbUIsR0FFakJ1RixFQUFNdkcsVUFBWXVHLEVBQU1oRixhQUMxQnFnQixFQUFlQyxFQUFpQnRiLEVBQU1yRixjQUN0Q3FGLEVBQU12RixnQkFBZ0I1SyxHQUFLbVIsRUFBT25SLEVBQUk0SyxFQUFrQjRnQixFQUN4RHJiLEVBQU12RixnQkFBZ0IzSyxHQUFLa1IsRUFBT2xSLEVBQUkySyxFQUFrQjRnQixHQUd0RHBiLEVBQU14RyxVQUFZd0csRUFBTWpGLGFBQzFCcWdCLEVBQWVDLEVBQWlCcmIsRUFBTXRGLGNBQ3RDc0YsRUFBTXhGLGdCQUFnQjVLLEdBQUttUixFQUFPblIsRUFBSTRLLEVBQWtCNGdCLEVBQ3hEcGIsRUFBTXhGLGdCQUFnQjNLLEdBQUtrUixFQUFPbFIsRUFBSTJLLEVBQWtCNGdCLEdBR3BFLEVBT0FqQyxFQUFTZSxrQkFBb0IsU0FBUzFpQixHQU1sQyxJQUxBLElBQUk4akIsRUFBa0JuQyxFQUFTNkIsaUJBQzNCaFAsRUFBZXhVLEVBQU96TixPQUN0Qnd4QixFQUFvQi9vQixFQUFTakMsVUFDN0JpckIsRUFBZS9yQixFQUFPSyxPQUVqQjNJLEVBQUksRUFBR0EsRUFBSTZrQixFQUFjN2tCLElBQUssQ0FDbkMsSUFBSXVMLEVBQU84RSxFQUFPclEsR0FDZHFULEVBQWtCOUgsRUFBSzhILGdCQUN2QmloQixFQUFtQmpoQixFQUFnQjVLLEVBQ25DOHJCLEVBQW1CbGhCLEVBQWdCM0ssRUFDbkNFLEVBQVcyQyxFQUFLM0MsU0FLcEIsR0FGQTJDLEVBQUtnSSxjQUFnQixFQUVJLElBQXJCK2dCLEdBQStDLElBQXJCQyxFQUF3QixDQUVsRCxJQUFLLElBQUl6d0IsRUFBSSxFQUFHQSxFQUFJeUgsRUFBSzVILE1BQU1mLE9BQVFrQixJQUFLLENBQ3hDLElBQUk4UyxFQUFPckwsRUFBSzVILE1BQU1HLEdBQ3RCc3dCLEVBQWtCeGQsRUFBS3JPLFNBQVU4SyxHQUNqQ2doQixFQUFhemQsRUFBS3BPLE9BQVFvTyxFQUFLck8sU0FBVUssR0FDekNnTyxFQUFLck4sU0FBU2QsR0FBSzZyQixFQUNuQjFkLEVBQUtyTixTQUFTYixHQUFLNnJCLENBQ3ZCLENBR0FocEIsRUFBSytKLGFBQWE3TSxHQUFLNnJCLEVBQ3ZCL29CLEVBQUsrSixhQUFhNU0sR0FBSzZyQixFQUVuQkQsRUFBbUIxckIsRUFBU0gsRUFBSThyQixFQUFtQjNyQixFQUFTRixFQUFJLEdBRWhFMkssRUFBZ0I1SyxFQUFJLEVBQ3BCNEssRUFBZ0IzSyxFQUFJLElBR3BCMkssRUFBZ0I1SyxHQUFLMHJCLEVBQ3JCOWdCLEVBQWdCM0ssR0FBS3lyQixFQUU3QixDQUNKLENBQ0osRUFPQW5DLEVBQVNnQixpQkFBbUIsU0FBU3hhLEdBQ2pDLElBQ0l4WSxFQUNBOEQsRUFGQWt3QixFQUFjeGIsRUFBTTVWLE9BSXhCLElBQUs1QyxFQUFJLEVBQUdBLEVBQUlnMEIsRUFBYWgwQixJQUFLLENBQzlCLElBQUl5WSxFQUFPRCxFQUFNeFksR0FFakIsR0FBS3lZLEVBQUtDLFdBQVlELEVBQUs5RSxTQUEzQixDQUdBLElBQUlpSixFQUFXbkUsRUFBS29FLGVBQ2hCMlgsRUFBaUI1WCxFQUFTaGEsT0FDMUIrVixFQUFZRixFQUFLRSxVQUNqQkMsRUFBUUQsRUFBVWMsUUFDbEJaLEVBQVFGLEVBQVVlLFFBQ2xCRSxFQUFTakIsRUFBVWlCLE9BQ25CQyxFQUFVbEIsRUFBVWtCLFFBR3hCLElBQUsvVixFQUFJLEVBQUdBLEVBQUkwd0IsRUFBZ0Ixd0IsSUFBSyxDQUNqQyxJQUFJdVosRUFBVVQsRUFBUzlZLEdBQ25CMndCLEVBQWdCcFgsRUFBUXZVLE9BQ3hCK29CLEVBQWdCeFUsRUFBUXdVLGNBQ3hCQyxFQUFpQnpVLEVBQVF5VSxlQUU3QixHQUFzQixJQUFsQkQsR0FBMEMsSUFBbkJDLEVBQXNCLENBRTdDLElBQUk0QyxFQUFXOWEsRUFBT25SLEVBQUlvcEIsRUFBZ0JoWSxFQUFRcFIsRUFBSXFwQixFQUNsRDZDLEVBQVcvYSxFQUFPbFIsRUFBSW1wQixFQUFnQmhZLEVBQVFuUixFQUFJb3BCLEVBR2hEbFosRUFBTXZHLFVBQVl1RyxFQUFNaEYsYUFDMUJnRixFQUFNdEQsYUFBYTdNLEdBQUtpc0IsRUFBVzliLEVBQU0vQixZQUN6QytCLEVBQU10RCxhQUFhNU0sR0FBS2lzQixFQUFXL2IsRUFBTS9CLFlBQ3pDK0IsRUFBTXJELFdBQWFxRCxFQUFNOUIsaUJBQ3BCMmQsRUFBY2hzQixFQUFJbVEsRUFBTXJQLFNBQVNkLEdBQUtrc0IsR0FDcENGLEVBQWMvckIsRUFBSWtRLEVBQU1yUCxTQUFTYixHQUFLZ3NCLElBSTNDN2IsRUFBTXhHLFVBQVl3RyxFQUFNakYsYUFDMUJpRixFQUFNdkQsYUFBYTdNLEdBQUtpc0IsRUFBVzdiLEVBQU1oQyxZQUN6Q2dDLEVBQU12RCxhQUFhNU0sR0FBS2lzQixFQUFXOWIsRUFBTWhDLFlBQ3pDZ0MsRUFBTXRELFdBQWFzRCxFQUFNL0IsaUJBQ3BCMmQsRUFBY2hzQixFQUFJb1EsRUFBTXRQLFNBQVNkLEdBQUtrc0IsR0FDcENGLEVBQWMvckIsRUFBSW1RLEVBQU10UCxTQUFTYixHQUFLZ3NCLEdBR3JELENBQ0osQ0F6Q1ksQ0EwQ2hCLENBQ0osRUFRQTFDLEVBQVNpQixjQUFnQixTQUFTemEsRUFBTy9ELEdBQ3JDLElBTUlxZCxFQUNBOEMsRUFDQTUwQixFQUNBOEQsRUFUQSt3QixFQUFtQnBnQixFQUFZQSxFQUMvQnFnQixFQUFnQjlDLEVBQVMwQixlQUFpQm1CLEVBQzFDRSxFQUEyQi9DLEVBQVM4QiwwQkFDcENrQixFQUF1QmhELEVBQVMyQixzQkFBd0JrQixFQUN4REksRUFBaUIxWixPQUFPQyxVQUN4QndZLEVBQWN4YixFQUFNNVYsT0FNeEIsSUFBSzVDLEVBQUksRUFBR0EsRUFBSWcwQixFQUFhaDBCLElBQUssQ0FDOUIsSUFBSXlZLEVBQU9ELEVBQU14WSxHQUVqQixHQUFLeVksRUFBS0MsV0FBWUQsRUFBSzlFLFNBQTNCLENBR0EsSUFBSWdGLEVBQVlGLEVBQUtFLFVBQ2pCQyxFQUFRRCxFQUFVYyxRQUNsQlosRUFBUUYsRUFBVWUsUUFDbEJ3YixFQUFnQnRjLEVBQU1oUSxTQUN0QnVzQixFQUFnQnRjLEVBQU1qUSxTQUN0QjJULEVBQVU1RCxFQUFVaUIsT0FBT25SLEVBQzNCK1QsRUFBVTdELEVBQVVpQixPQUFPbFIsRUFDM0Iwc0IsRUFBV3pjLEVBQVVrQixRQUFRcFIsRUFDN0I0c0IsRUFBVzFjLEVBQVVrQixRQUFRblIsRUFDN0JrVSxFQUFXbkUsRUFBS29FLGVBQ2hCMlgsRUFBaUI1WCxFQUFTaGEsT0FDMUJxeEIsRUFBZSxFQUFJTyxFQUNuQmMsRUFBbUIxYyxFQUFNL0IsWUFBY2dDLEVBQU1oQyxZQUM3QzVDLEVBQVd3RSxFQUFLeEUsU0FBV3dFLEVBQUt2RSxlQUFpQjZnQixFQUEyQkYsRUFXaEYsSUFSQUssRUFBY3pzQixFQUFJbVEsRUFBTXJQLFNBQVNkLEVBQUltUSxFQUFNdEQsYUFBYTdNLEVBQ3hEeXNCLEVBQWN4c0IsRUFBSWtRLEVBQU1yUCxTQUFTYixFQUFJa1EsRUFBTXRELGFBQWE1TSxFQUN4RHlzQixFQUFjMXNCLEVBQUlvUSxFQUFNdFAsU0FBU2QsRUFBSW9RLEVBQU12RCxhQUFhN00sRUFDeEQwc0IsRUFBY3pzQixFQUFJbVEsRUFBTXRQLFNBQVNiLEVBQUltUSxFQUFNdkQsYUFBYTVNLEVBQ3hEa1EsRUFBTWxGLGdCQUFrQmtGLEVBQU03TyxNQUFRNk8sRUFBTXJELFVBQzVDc0QsRUFBTW5GLGdCQUFrQm1GLEVBQU05TyxNQUFROE8sRUFBTXRELFVBR3ZDelIsRUFBSSxFQUFHQSxFQUFJMHdCLEVBQWdCMXdCLElBQUssQ0FDakMsSUFBSXVaLEVBQVVULEVBQVM5WSxHQUNuQjJ3QixFQUFnQnBYLEVBQVF2VSxPQUV4QnlzQixFQUFXZCxFQUFjaHNCLEVBQUltUSxFQUFNclAsU0FBU2QsRUFDNUMrc0IsRUFBV2YsRUFBYy9yQixFQUFJa1EsRUFBTXJQLFNBQVNiLEVBQzVDK3NCLEVBQVdoQixFQUFjaHNCLEVBQUlvUSxFQUFNdFAsU0FBU2QsRUFDNUNpdEIsRUFBV2pCLEVBQWMvckIsRUFBSW1RLEVBQU10UCxTQUFTYixFQUU1Q2l0QixFQUFrQlQsRUFBY3pzQixFQUFJK3NCLEVBQVc1YyxFQUFNbEYsZ0JBQ3JEa2lCLEVBQWtCVixFQUFjeHNCLEVBQUk2c0IsRUFBVzNjLEVBQU1sRixnQkFJckRtaUIsRUFBb0JGLEdBSEZSLEVBQWMxc0IsRUFBSWl0QixFQUFXN2MsRUFBTW5GLGlCQUlyRG9pQixFQUFvQkYsR0FIRlQsRUFBY3pzQixFQUFJK3NCLEVBQVc1YyxFQUFNbkYsaUJBS3JEcUwsRUFBaUJ4QyxFQUFVc1osRUFBb0JyWixFQUFVc1osRUFDekRDLEVBQWtCWCxFQUFXUyxFQUFvQlIsRUFBV1MsRUFHNURFLEVBQWdCdmQsRUFBS3FFLFdBQWFpQyxFQUNsQ2tYLEVBQWNseUIsS0FBS2dCLElBQUlpeEIsRUFBZSxHQUd0Q0UsR0FGSkQsRUFBY0QsRUFBZ0IsRUFBSSxFQUFJQyxHQUVKaGlCLEVBRTlCOGhCLEVBQWtCRyxJQUFrQkgsRUFBa0JHLEdBQ3REdEIsRUFBY21CLEVBQWtCLEVBQUlBLEdBQW1CQSxHQUN2RGpFLEVBQWlCclosRUFBS3hFLFVBQVk4aEIsRUFBa0IsRUFBSSxHQUFLLEdBQUtsQixJQUU1Q0QsRUFDbEI5QyxHQUFrQjhDLEVBQ1g5QyxFQUFpQjhDLElBQ3hCOUMsRUFBaUI4QyxLQUdyQjlDLEVBQWlCaUUsRUFDakJuQixFQUFjSyxHQUlsQixJQUFJa0IsRUFBT1osRUFBVy9ZLEVBQVVnWixFQUFXalosRUFDdkM2WixFQUFPWCxFQUFXalosRUFBVWtaLEVBQVduWixFQUN2Q3VDLEVBQVFtVixHQUFnQnFCLEVBQW1CMWMsRUFBTTlCLGVBQWlCcWYsRUFBT0EsRUFBT3RkLEVBQU0vQixlQUFpQnNmLEVBQU9BLEdBRzlHdkUsR0FBaUIsRUFBSXBaLEVBQUt6RSxhQUFlK0ssRUFBaUJELEVBSTlELEdBSEFnVCxHQUFrQmhULEVBR2RDLEVBQWlCQSxFQUFpQitWLEdBQWlCL1YsRUFBaUIsRUFFcEUxQixFQUFRd1UsY0FBZ0IsTUFDckIsQ0FHSCxJQUFJd0UsRUFBdUJoWixFQUFRd1UsY0FDbkN4VSxFQUFRd1UsZUFBaUJBLEVBQ3pCeFUsRUFBUXdVLGNBQWdCOXRCLEtBQUtnQixJQUFJc1ksRUFBUXdVLGNBQWUsR0FDeERBLEVBQWdCeFUsRUFBUXdVLGNBQWdCd0UsQ0FDNUMsQ0FHQSxHQUFJTixFQUFrQkEsRUFBa0JmLEVBRXBDM1gsRUFBUXlVLGVBQWlCLE1BQ3RCLENBR0gsSUFBSXdFLEVBQXdCalosRUFBUXlVLGVBQ3BDelUsRUFBUXlVLGdCQUFrQkEsRUFDdEJ6VSxFQUFReVUsZ0JBQWtCOEMsSUFBYXZYLEVBQVF5VSxnQkFBa0I4QyxHQUNqRXZYLEVBQVF5VSxlQUFpQjhDLElBQWF2WCxFQUFReVUsZUFBaUI4QyxHQUNuRTlDLEVBQWlCelUsRUFBUXlVLGVBQWlCd0UsQ0FDOUMsQ0FHQSxJQUFJNUIsRUFBV25ZLEVBQVVzVixFQUFnQnVELEVBQVd0RCxFQUNoRDZDLEVBQVduWSxFQUFVcVYsRUFBZ0J3RCxFQUFXdkQsRUFHOUNsWixFQUFNdkcsVUFBWXVHLEVBQU1oRixhQUMxQmdGLEVBQU10RCxhQUFhN00sR0FBS2lzQixFQUFXOWIsRUFBTS9CLFlBQ3pDK0IsRUFBTXRELGFBQWE1TSxHQUFLaXNCLEVBQVcvYixFQUFNL0IsWUFDekMrQixFQUFNckQsWUFBY2dnQixFQUFXWixFQUFXYSxFQUFXZCxHQUFZOWIsRUFBTTlCLGdCQUdyRStCLEVBQU14RyxVQUFZd0csRUFBTWpGLGFBQzFCaUYsRUFBTXZELGFBQWE3TSxHQUFLaXNCLEVBQVc3YixFQUFNaEMsWUFDekNnQyxFQUFNdkQsYUFBYTVNLEdBQUtpc0IsRUFBVzliLEVBQU1oQyxZQUN6Q2dDLEVBQU10RCxZQUFja2dCLEVBQVdkLEVBQVdlLEVBQVdoQixHQUFZN2IsRUFBTS9CLGVBRS9FLENBdkhZLENBd0hoQixDQUNKLENBS0csRUFFRCxTQUFVclgsRUFBUUQsRUFBUyxHQVFqQyxJQUFJeXlCLEVBQVEsQ0FBQyxFQUVieHlCLEVBQU9ELFFBQVV5eUIsRUFFakIsSUFBSTVZLEVBQU8sRUFBb0IsR0FDM0J0WCxFQUFTLEVBQW9CLEdBVTdCa3dCLEVBQU01d0IsT0FBUyxTQUFTMk8sR0FDcEIsT0FBT2pPLEVBQU9PLE9BQU8sQ0FDakI2WCxNQUFPLENBQUMsRUFDUnBULEtBQU0sR0FDTjZyQixlQUFnQixHQUNoQk0sZ0JBQWlCLEdBQ2pCQyxhQUFjLElBQ2ZuakIsRUFDUCxFQVNBaWlCLEVBQU10cEIsT0FBUyxTQUFTNlAsRUFBT29NLEVBQVlqSSxHQUN2QyxJQU9JaEUsRUFDQTRkLEVBQ0E5ZCxFQUNBelksRUFWQXcyQixFQUFZaGUsRUFBTXpSLEtBQ2xCMHZCLEVBQWtCRCxFQUFVNXpCLE9BQzVCOHpCLEVBQWFsZSxFQUFNMkIsTUFDbkJ3YyxFQUFtQi9SLEVBQVdoaUIsT0FDOUJnd0IsRUFBaUJwYSxFQUFNb2EsZUFDdkJPLEVBQWUzYSxFQUFNMmEsYUFDckJELEVBQWtCMWEsRUFBTTBhLGdCQVc1QixJQUpBTixFQUFlaHdCLE9BQVMsRUFDeEJ1d0IsRUFBYXZ3QixPQUFTLEVBQ3RCc3dCLEVBQWdCdHdCLE9BQVMsRUFFcEI1QyxFQUFJLEVBQUdBLEVBQUl5MkIsRUFBaUJ6MkIsSUFDN0J3MkIsRUFBVXgyQixHQUFHK2MsaUJBQWtCLEVBR25DLElBQUsvYyxFQUFJLEVBQUdBLEVBQUkyMkIsRUFBa0IzMkIsS0FFOUJ5WSxHQURBRSxFQUFZaU0sRUFBVzVrQixJQUNOeVksT0FJVEEsRUFBS0MsU0FFTHdhLEVBQWdCaHdCLEtBQUt1VixHQUdyQm1hLEVBQWUxdkIsS0FBS3VWLEdBSXhCWSxFQUFLMVEsT0FBTzhQLEVBQU1FLEVBQVdnRSxHQUM3QmxFLEVBQUtzRSxpQkFBa0IsSUFJdkIyWixHQURBamUsRUFBT1ksRUFBS2hZLE9BQU9zWCxFQUFXZ0UsSUFDZDFNLElBQU13SSxFQUd0Qm1hLEVBQWUxdkIsS0FBS3VWLEdBQ3BCK2QsRUFBVXR6QixLQUFLdVYsSUFLdkIsSUFBSW1lLEVBQWtCLEdBR3RCLElBRkFILEVBQWtCRCxFQUFVNXpCLE9BRXZCNUMsRUFBSSxFQUFHQSxFQUFJeTJCLEVBQWlCejJCLEtBQzdCeVksRUFBTytkLEVBQVV4MkIsSUFFUCtjLGtCQUNOMUQsRUFBS2lFLFVBQVU3RSxHQUFNLEVBQU9rRSxHQUM1QndXLEVBQWFqd0IsS0FBS3VWLEdBRWJBLEVBQUtFLFVBQVVDLE1BQU1oRixZQUFlNkUsRUFBS0UsVUFBVUUsTUFBTWpGLFlBQzFEZ2pCLEVBQWdCMXpCLEtBQUtsRCxJQU1qQyxJQUFLQSxFQUFJLEVBQUdBLEVBQUk0MkIsRUFBZ0JoMEIsT0FBUTVDLElBRXBDeVksRUFBTytkLEVBRFBELEVBQVlLLEVBQWdCNTJCLEdBQUtBLEdBRWpDdzJCLEVBQVV6a0IsT0FBT3drQixFQUFXLFVBQ3JCRyxFQUFXamUsRUFBS3hJLEdBRS9CLEVBUUFnaUIsRUFBTS9mLE1BQVEsU0FBU3NHLEdBTW5CLE9BTEFBLEVBQU0yQixNQUFRLENBQUMsRUFDZjNCLEVBQU16UixLQUFLbkUsT0FBUyxFQUNwQjRWLEVBQU1vYSxlQUFlaHdCLE9BQVMsRUFDOUI0VixFQUFNMGEsZ0JBQWdCdHdCLE9BQVMsRUFDL0I0VixFQUFNMmEsYUFBYXZ3QixPQUFTLEVBQ3JCNFYsQ0FDWCxDQUtHLEVBRUQsU0FBVS9ZLEVBQVFELEVBQVMsR0FFakMsSUFBSXEzQixFQUFTcDNCLEVBQU9ELFFBQVUsRUFBb0IsSUFFbERxM0IsRUFBT2hrQixLQUFPLEVBQW9CLElBQ2xDZ2tCLEVBQU9wWCxPQUFTLEVBQW9CLElBQ3BDb1gsRUFBTzltQixLQUFPLEVBQW9CLEdBQ2xDOG1CLEVBQU92dUIsT0FBUyxFQUFvQixHQUNwQ3V1QixFQUFPNWQsVUFBWSxFQUFvQixHQUN2QzRkLEVBQU85MEIsT0FBUyxFQUFvQixHQUNwQzgwQixFQUFPL21CLFVBQVksRUFBb0IsR0FDdkMrbUIsRUFBT0MsV0FBYSxFQUFvQixJQUN4Q0QsRUFBT3RaLFdBQWEsRUFBb0IsSUFDeENzWixFQUFPbmEsUUFBVSxFQUFvQixJQUNyQ21hLEVBQU9wUyxTQUFXLEVBQW9CLElBQ3RDb1MsRUFBTzlFLE9BQVMsRUFBb0IsSUFDcEM4RSxFQUFPM25CLE9BQVMsRUFBb0IsR0FDcEMybkIsRUFBT0UsS0FBTyxFQUFvQixJQUNsQ0YsRUFBT2hWLE1BQVEsRUFBb0IsSUFDbkNnVixFQUFPRyxnQkFBa0IsRUFBb0IsSUFDN0NILEVBQU94ZCxLQUFPLEVBQW9CLEdBQ2xDd2QsRUFBTzVFLE1BQVEsRUFBb0IsSUFDbkM0RSxFQUFPblIsT0FBUyxFQUFvQixJQUNwQ21SLEVBQU9JLE1BQVEsRUFBb0IsSUFDbkNKLEVBQU8zTyxPQUFTLEVBQW9CLElBQ3BDMk8sRUFBTzdFLFNBQVcsRUFBb0IsSUFDdEM2RSxFQUFPSyxPQUFTLEVBQW9CLElBQ3BDTCxFQUFPTSxJQUFNLEVBQW9CLElBQ2pDTixFQUFPamtCLFNBQVcsRUFBb0IsR0FDdENpa0IsRUFBT08sSUFBTSxFQUFvQixJQUNqQ1AsRUFBT250QixPQUFTLEVBQW9CLEdBQ3BDbXRCLEVBQU94ckIsU0FBVyxFQUFvQixHQUN0Q3dyQixFQUFPUSxNQUFRLEVBQW9CLElBR25DUixFQUFPOUUsT0FBT3BHLElBQU1rTCxFQUFPSyxPQUFPdkwsSUFDbENrTCxFQUFPOTBCLE9BQU93RSxXQUFXc3dCLEVBQU85RSxPQUFRLE1BQU8scURBR3hDLEVBRUQsU0FBVXR5QixFQUFRRCxFQUFTLEdBUWpDLElBQUlxM0IsRUFBUyxDQUFDLEVBRWRwM0IsRUFBT0QsUUFBVXEzQixFQUVqQixJQUFJblIsRUFBUyxFQUFvQixJQUM3QjNqQixFQUFTLEVBQW9CLEdBVTdCODBCLEVBQU92MkIsS0FBTyxZQVFkdTJCLEVBQU81USxRQUFrQixTQVF6QjRRLEVBQU81UCxLQUFPLEdBUWQ0UCxFQUFPblEsS0FBTyxHQVVkbVEsRUFBTzlQLElBQU0sV0FDVHJCLEVBQU9xQixJQUFJOFAsRUFBUTV3QixNQUFNdEUsVUFBVTZCLE1BQU10RCxLQUFLeUMsV0FDbEQsRUFVQWswQixFQUFPUyxPQUFTLFNBQVNsMEIsRUFBTTRELEdBRTNCLE9BREE1RCxFQUFPQSxFQUFLcUMsUUFBUSxXQUFZLElBQ3pCMUQsRUFBTytGLGdCQUFnQit1QixFQUFRenpCLEVBQU00RCxFQUNoRCxFQVVBNnZCLEVBQU9VLE1BQVEsU0FBU24wQixFQUFNNEQsR0FFMUIsT0FEQTVELEVBQU9BLEVBQUtxQyxRQUFRLFdBQVksSUFDekIxRCxFQUFPaUcsZUFBZTZ1QixFQUFRenpCLEVBQU00RCxFQUMvQyxDQUtHLEVBRUQsU0FBVXZILEVBQVFELEVBQVMsR0FXakMsSUFBSXMzQixFQUFhLENBQUMsRUFFbEJyM0IsRUFBT0QsUUFBVXMzQixFQUVqQixJQUFJaG5CLEVBQVksRUFBb0IsR0FDaEN5TixFQUFhLEVBQW9CLElBQ2pDeGIsRUFBUyxFQUFvQixHQUM3QmdPLEVBQU8sRUFBb0IsR0FDM0IwUCxFQUFTLEVBQW9CLElBQzdCbFosRUFBYXhFLEVBQU93RSxXQWlCcEJ1d0IsRUFBV1UsTUFBUSxTQUFTaFksRUFBSWlCLEVBQUlnWCxFQUFTQyxFQUFNQyxFQUFXQyxFQUFRdm9CLEdBT2xFLElBTkEsSUFHSXdvQixFQUhBTCxFQUFRMW5CLEVBQVV6TyxPQUFPLENBQUVtUCxNQUFPLFVBQ2xDL0gsRUFBSStXLEVBQ0o5VyxFQUFJK1gsRUFFSnpnQixFQUFJLEVBRUM4M0IsRUFBTSxFQUFHQSxFQUFNSixFQUFNSSxJQUFPLENBR2pDLElBRkEsSUFBSUMsRUFBWSxFQUVQQyxFQUFTLEVBQUdBLEVBQVNQLEVBQVNPLElBQVUsQ0FDN0MsSUFBSXpzQixFQUFPOEQsRUFBUzVHLEVBQUdDLEVBQUdzdkIsRUFBUUYsRUFBS0QsRUFBVTczQixHQUVqRCxHQUFJdUwsRUFBTSxDQUNOLElBQUkwc0IsRUFBYTFzQixFQUFLL0MsT0FBT3hELElBQUkwRCxFQUFJNkMsRUFBSy9DLE9BQU96RCxJQUFJMkQsRUFDakR3dkIsRUFBWTNzQixFQUFLL0MsT0FBT3hELElBQUl5RCxFQUFJOEMsRUFBSy9DLE9BQU96RCxJQUFJMEQsRUFFaER3dkIsRUFBYUYsSUFDYkEsRUFBWUUsR0FFaEJsb0IsRUFBSzNHLFVBQVVtQyxFQUFNLENBQUU5QyxFQUFlLEdBQVp5dkIsRUFBaUJ4dkIsRUFBZ0IsR0FBYnV2QixJQUU5Q3h2QixFQUFJOEMsRUFBSy9DLE9BQU94RCxJQUFJeUQsRUFBSWt2QixFQUV4QjduQixFQUFVc0IsUUFBUW9tQixFQUFPanNCLEdBRXpCc3NCLEVBQVd0c0IsRUFDWHZMLEdBQUssQ0FDVCxNQUNJeUksR0FBS2t2QixDQUViLENBRUFqdkIsR0FBS3F2QixFQUFZSCxFQUNqQm52QixFQUFJK1csQ0FDUixDQUVBLE9BQU9nWSxDQUNYLEVBYUFWLEVBQVdyd0IsTUFBUSxTQUFTc0ssRUFBV29uQixFQUFVQyxFQUFVQyxFQUFVQyxFQUFVdG9CLEdBRzNFLElBRkEsSUFBSUssRUFBU1UsRUFBVVYsT0FFZHJRLEVBQUksRUFBR0EsRUFBSXFRLEVBQU96TixPQUFRNUMsSUFBSyxDQUNwQyxJQUFJNFksRUFBUXZJLEVBQU9yUSxFQUFJLEdBQ25CNlksRUFBUXhJLEVBQU9yUSxHQUNmdTRCLEVBQWMzZixFQUFNcFEsT0FBT3hELElBQUkwRCxFQUFJa1EsRUFBTXBRLE9BQU96RCxJQUFJMkQsRUFDcEQ4dkIsRUFBYTVmLEVBQU1wUSxPQUFPeEQsSUFBSXlELEVBQUltUSxFQUFNcFEsT0FBT3pELElBQUkwRCxFQUNuRGd3QixFQUFjNWYsRUFBTXJRLE9BQU94RCxJQUFJMEQsRUFBSW1RLEVBQU1yUSxPQUFPekQsSUFBSTJELEVBR3BEd0ssRUFBVyxDQUNYMEYsTUFBT0EsRUFDUCtFLE9BQVEsQ0FBRWxWLEVBQUcrdkIsRUFBYUwsRUFBVXp2QixFQUFHNnZCLEVBQWNILEdBQ3JEdmYsTUFBT0EsRUFDUCtFLE9BQVEsQ0FBRW5WLEdBTkdvUSxFQUFNclEsT0FBT3hELElBQUl5RCxFQUFJb1EsRUFBTXJRLE9BQU96RCxJQUFJMEQsR0FNekI0dkIsRUFBVTN2QixFQUFHK3ZCLEVBQWNILElBR3JEL21CLEVBQWF4UCxFQUFPTyxPQUFPNFEsRUFBVWxELEdBRXpDRixFQUFVdUIsY0FBY04sRUFBV3dNLEVBQVdsYyxPQUFPa1EsR0FDekQsQ0FJQSxPQUZBUixFQUFVUCxPQUFTLFNBRVpPLENBQ1gsRUFZQStsQixFQUFXNEIsS0FBTyxTQUFTM25CLEVBQVcwbUIsRUFBU0MsRUFBTWlCLEVBQVkzb0IsR0FDN0QsSUFDSThuQixFQUNBYyxFQUNBaGdCLEVBQ0FDLEVBQ0FnZ0IsRUFMQXhvQixFQUFTVSxFQUFVVixPQU92QixJQUFLeW5CLEVBQU0sRUFBR0EsRUFBTUosRUFBTUksSUFBTyxDQUM3QixJQUFLYyxFQUFNLEVBQUdBLEVBQU1uQixFQUFTbUIsSUFDekJoZ0IsRUFBUXZJLEVBQVF1b0IsRUFBTSxFQUFNZCxFQUFNTCxHQUNsQzVlLEVBQVF4SSxFQUFPdW9CLEVBQU9kLEVBQU1MLEdBQzVCM25CLEVBQVV1QixjQUFjTixFQUFXd00sRUFBV2xjLE9BQU9VLEVBQU9PLE9BQU8sQ0FBRXNXLE1BQU9BLEVBQU9DLE1BQU9BLEdBQVM3SSxLQUd2RyxHQUFJOG5CLEVBQU0sRUFDTixJQUFLYyxFQUFNLEVBQUdBLEVBQU1uQixFQUFTbUIsSUFDekJoZ0IsRUFBUXZJLEVBQU91b0IsR0FBUWQsRUFBTSxHQUFLTCxHQUNsQzVlLEVBQVF4SSxFQUFPdW9CLEVBQU9kLEVBQU1MLEdBQzVCM25CLEVBQVV1QixjQUFjTixFQUFXd00sRUFBV2xjLE9BQU9VLEVBQU9PLE9BQU8sQ0FBRXNXLE1BQU9BLEVBQU9DLE1BQU9BLEdBQVM3SSxLQUUvRjJvQixHQUFjQyxFQUFNLElBQ3BCQyxFQUFReG9CLEVBQVF1b0IsRUFBTSxHQUFPZCxFQUFNLEdBQUtMLEdBQ3hDM25CLEVBQVV1QixjQUFjTixFQUFXd00sRUFBV2xjLE9BQU9VLEVBQU9PLE9BQU8sQ0FBRXNXLE1BQU9pZ0IsRUFBT2hnQixNQUFPQSxHQUFTN0ksTUFHbkcyb0IsR0FBY0MsRUFBTW5CLEVBQVUsSUFDOUJvQixFQUFReG9CLEVBQVF1b0IsRUFBTSxHQUFPZCxFQUFNLEdBQUtMLEdBQ3hDM25CLEVBQVV1QixjQUFjTixFQUFXd00sRUFBV2xjLE9BQU9VLEVBQU9PLE9BQU8sQ0FBRXNXLE1BQU9pZ0IsRUFBT2hnQixNQUFPQSxHQUFTN0ksS0FJbkgsQ0FJQSxPQUZBZSxFQUFVUCxPQUFTLFFBRVpPLENBQ1gsRUFlQStsQixFQUFXZ0MsUUFBVSxTQUFTdFosRUFBSWlCLEVBQUlnWCxFQUFTQyxFQUFNQyxFQUFXQyxFQUFRdm9CLEdBQ3BFLE9BQU95bkIsRUFBV1UsTUFBTWhZLEVBQUlpQixFQUFJZ1gsRUFBU0MsRUFBTUMsRUFBV0MsR0FBUSxTQUFTbnZCLEVBQUdDLEVBQUdzdkIsRUFBUUYsRUFBS0QsRUFBVTczQixHQUNwRyxJQUFJKzRCLEVBQWFoMUIsS0FBS2dCLElBQUkyeUIsRUFBTTN6QixLQUFLdWMsS0FBS21YLEVBQVUsSUFDaER1QixFQUFnQm5CLEVBQVdBLEVBQVNydkIsT0FBT3hELElBQUl5RCxFQUFJb3ZCLEVBQVNydkIsT0FBT3pELElBQUkwRCxFQUFJLEVBRS9FLEtBQUlxdkIsRUFBTWlCLEdBU05mLEdBTEpGLEVBQU1pQixFQUFhakIsSUFLR0UsRUFGWlAsRUFBVSxFQUFJSyxHQVl4QixPQU5VLElBQU45M0IsR0FDQStQLEVBQUszRyxVQUFVeXVCLEVBQVUsQ0FBRXB2QixHQUFJdXZCLEdBQVVQLEVBQVUsR0FBTSxFQUFJLEdBQUssSUFBTXVCLEVBQWV0d0IsRUFBRyxJQUt2RjJHLEVBQVNtUSxHQUZGcVksRUFBV0csRUFBU2dCLEVBQWdCLEdBRW5CaEIsRUFBU0wsRUFBV2p2QixFQUFHc3ZCLEVBQVFGLEVBQUtELEVBQVU3M0IsRUFDakYsR0FDSixFQWFBODJCLEVBQVdtQyxjQUFnQixTQUFTelosRUFBSWlCLEVBQUl5RixFQUFRZ1QsRUFBTXQyQixHQUd0RCxJQUZBLElBQUlxMkIsRUFBZ0JucEIsRUFBVXpPLE9BQU8sQ0FBRW1QLE1BQU8sbUJBRXJDeFEsRUFBSSxFQUFHQSxFQUFJa21CLEVBQVFsbUIsSUFBSyxDQUM3QixJQUNJbWdCLEVBQVNWLEVBQU9VLE9BQU9YLEVBQUt4ZixHQURmLElBQ29CazVCLEdBQW9CelksRUFBSzdkLEVBQVFzMkIsRUFDOUQsQ0FBRS9zQixRQUFTdEQsSUFBVW1MLFlBQWEsRUFBR0MsU0FBVSxFQUFHRSxZQUFhLEtBQVFLLEtBQU0sSUFDakZqRCxFQUFhZ00sRUFBV2xjLE9BQU8sQ0FBRXNjLE9BQVEsQ0FBRWxWLEVBQUcrVyxFQUFLeGYsR0FIdEMsSUFHMkNrNUIsR0FBb0J4d0IsRUFBRytYLEdBQU01SCxNQUFPc0gsSUFFaEdyUSxFQUFVc0IsUUFBUTZuQixFQUFlOVksR0FDakNyUSxFQUFVdUIsY0FBYzRuQixFQUFlMW5CLEVBQzNDLENBRUEsT0FBTzBuQixDQUNYLEVBRUExeUIsRUFBV3V3QixFQUFZLGdCQUFpQiw2REFheENBLEVBQVdxQyxJQUFNLFNBQVMzWixFQUFJaUIsRUFBSWQsRUFBT0MsRUFBUXdaLEdBQzdDLElBQUk3a0IsRUFBUXhFLEVBQUs0RixXQUFVLEdBRXZCMGpCLEVBQXdCLElBQVIxWixFQURKLEdBRVoyWixFQUF1QixHQUFSM1osRUFGSCxHQUtad1osRUFBTXJwQixFQUFVek8sT0FBTyxDQUFFbVAsTUFBTyxRQUNoQ2pGLEVBQU9rVSxFQUFPQyxVQUFVRixFQUFJaUIsRUFBSWQsRUFBT0MsRUFBUSxDQUMzQ3hMLGdCQUFpQixDQUNiRyxNQUFPQSxHQUVYbkgsUUFBUyxDQUNMQyxPQUFpQixHQUFUdVMsR0FFWjdMLFFBQVMsT0FHYndsQixFQUFTOVosRUFBT1UsT0FBT1gsRUFBSzZaLEVBQWM1WSxFQWIzQixFQWE4QzJZLEVBQVcsQ0FDeEVobEIsZ0JBQWlCLENBQ2JHLE1BQU9BLEdBRVhOLFNBQVUsS0FHVnVsQixFQUFTL1osRUFBT1UsT0FBT1gsRUFBSzhaLEVBQWM3WSxFQXBCM0IsRUFvQjhDMlksRUFBVyxDQUN4RWhsQixnQkFBaUIsQ0FDYkcsTUFBT0EsR0FFWE4sU0FBVSxLQUdWd2xCLEVBQVFsYyxFQUFXbGMsT0FBTyxDQUMxQndYLE1BQU90TixFQUNQcVMsT0FBUSxDQUFFblYsRUFBRzR3QixFQUFjM3dCLEVBN0JaLEdBOEJma1EsTUFBTzJnQixFQUNQeGIsVUFBVyxFQUNYbmIsT0FBUSxJQUdSODJCLEVBQVFuYyxFQUFXbGMsT0FBTyxDQUMxQndYLE1BQU90TixFQUNQcVMsT0FBUSxDQUFFblYsRUFBRzZ3QixFQUFjNXdCLEVBckNaLEdBc0Nma1EsTUFBTzRnQixFQUNQemIsVUFBVyxFQUNYbmIsT0FBUSxJQVNaLE9BTkFrTixFQUFVc0IsUUFBUStuQixFQUFLNXRCLEdBQ3ZCdUUsRUFBVXNCLFFBQVErbkIsRUFBS0ksR0FDdkJ6cEIsRUFBVXNCLFFBQVErbkIsRUFBS0ssR0FDdkIxcEIsRUFBVXVCLGNBQWM4bkIsRUFBS00sR0FDN0IzcEIsRUFBVXVCLGNBQWM4bkIsRUFBS08sR0FFdEJQLENBQ1gsRUFFQTV5QixFQUFXdXdCLEVBQVksTUFBTyx5Q0FtQjlCQSxFQUFXNkMsU0FBVyxTQUFTbmEsRUFBSWlCLEVBQUlnWCxFQUFTQyxFQUFNQyxFQUFXQyxFQUFRZSxFQUFZaUIsRUFBZ0JDLEVBQWlCQyxHQUNsSEQsRUFBa0I5M0IsRUFBT08sT0FBTyxDQUFFNkosUUFBU3RELEtBQVlneEIsR0FDdkRDLEVBQW9CLzNCLEVBQU9PLE9BQU8sQ0FBRXliLFVBQVcsR0FBS3JKLE9BQVEsQ0FBRXhFLEtBQU0sT0FBUWtPLFNBQVMsSUFBVzBiLEdBRWhHLElBQUlILEVBQVc3QyxFQUFXVSxNQUFNaFksRUFBSWlCLEVBQUlnWCxFQUFTQyxFQUFNQyxFQUFXQyxHQUFRLFNBQVNudkIsRUFBR0MsR0FDbEYsT0FBTytXLEVBQU9VLE9BQU8xWCxFQUFHQyxFQUFHa3hCLEVBQWdCQyxFQUMvQyxJQU1BLE9BSkEvQyxFQUFXNEIsS0FBS2lCLEVBQVVsQyxFQUFTQyxFQUFNaUIsRUFBWW1CLEdBRXJESCxFQUFTbnBCLE1BQVEsWUFFVm1wQixDQUNYLEVBRUFwekIsRUFBV3V3QixFQUFZLFdBQVksNkRBSWhDLEVBRUQsU0FBVXIzQixFQUFRRCxFQUFTLEdBY2pDLElBQUl1M0IsRUFBTyxDQUFDLEVBRVp0M0IsRUFBT0QsUUFBVXUzQixFQUVqQixJQUFJMWQsRUFBTyxFQUFvQixHQUMzQnRYLEVBQVMsRUFBb0IsR0FDN0J3RSxFQUFheEUsRUFBT3dFLFdBV3BCd3dCLEVBQUsxMUIsT0FBUyxTQUFTMk8sR0FTbkIsT0FBT2pPLEVBQU9PLE9BUkMsQ0FDWGl3QixRQUFTLENBQUMsRUFDVi9aLE1BQU8sQ0FBQyxFQUNSZ2UsVUFBVyxHQUNYdUQsWUFBYSxHQUNiQyxhQUFjLElBR2FocUIsRUFDbkMsRUEyQkErbUIsRUFBS3B1QixPQUFTLFNBQVMycEIsRUFBTWppQixFQUFRNFksRUFBUWdSLEdBQ3pDLElBQUlqNkIsRUFBRzQ0QixFQUFLZCxFQUdSb0MsRUFDQUMsRUFIQXBPLEVBQVE5QyxFQUFPOEMsTUFDZndHLEVBQVVELEVBQUtDLFFBR2Y2SCxHQUFjLEVBRWxCLElBQUtwNkIsRUFBSSxFQUFHQSxFQUFJcVEsRUFBT3pOLE9BQVE1QyxJQUFLLENBQ2hDLElBQUl1TCxFQUFPOEUsRUFBT3JRLEdBRWxCLEtBQUl1TCxFQUFLcUksWUFBZXFtQixNQUlwQmxPLEVBQU12akIsVUFBVytDLEVBQUsvQyxPQUFPeEQsSUFBSXlELEVBQUlzakIsRUFBTXZqQixPQUFPekQsSUFBSTBELEdBQUs4QyxFQUFLL0MsT0FBT3pELElBQUkwRCxFQUFJc2pCLEVBQU12akIsT0FBT3hELElBQUl5RCxHQUM3RjhDLEVBQUsvQyxPQUFPeEQsSUFBSTBELEVBQUlxakIsRUFBTXZqQixPQUFPekQsSUFBSTJELEdBQUs2QyxFQUFLL0MsT0FBT3pELElBQUkyRCxFQUFJcWpCLEVBQU12akIsT0FBT3hELElBQUkwRCxJQUR0RixDQUlBLElBQUkyeEIsRUFBWXRELEVBQUt1RCxXQUFXaEksRUFBTS9tQixHQUd0QyxJQUFLQSxFQUFLZ3ZCLFFBQVVGLEVBQVVwcUIsS0FBTzFFLEVBQUtndkIsT0FBT3RxQixJQUFNZ3FCLEVBQWEsQ0FFM0QxdUIsRUFBS2d2QixTQUFVTixJQUNoQjF1QixFQUFLZ3ZCLE9BQVNGLEdBRWxCLElBQUlHLEVBQVF6RCxFQUFLMEQsYUFBYUosRUFBVzl1QixFQUFLZ3ZCLFFBSTlDLElBQUszQixFQUFNNEIsRUFBTUUsU0FBVTlCLEdBQU80QixFQUFNRyxPQUFRL0IsSUFDNUMsSUFBS2QsRUFBTTBDLEVBQU1JLFNBQVU5QyxHQUFPMEMsRUFBTUssT0FBUS9DLElBQU8sQ0FFbkRvQyxFQUFTM0gsRUFEVDRILEVBQVdwRCxFQUFLK0QsYUFBYWxDLEVBQUtkLElBR2xDLElBQUlpRCxFQUFxQm5DLEdBQU95QixFQUFVSyxVQUFZOUIsR0FBT3lCLEVBQVVNLFFBQzVDN0MsR0FBT3VDLEVBQVVPLFVBQVk5QyxHQUFPdUMsRUFBVVEsT0FFckVHLEVBQXFCcEMsR0FBT3J0QixFQUFLZ3ZCLE9BQU9HLFVBQVk5QixHQUFPcnRCLEVBQUtndkIsT0FBT0ksUUFDaEQ3QyxHQUFPdnNCLEVBQUtndkIsT0FBT0ssVUFBWTlDLEdBQU92c0IsRUFBS2d2QixPQUFPTSxRQUd4RUUsR0FBcUJDLEdBQ2xCQSxHQUNJZCxHQUNBbkQsRUFBS2tFLGtCQUFrQjNJLEVBQU00SCxFQUFRM3VCLElBSzdDQSxFQUFLZ3ZCLFNBQVdGLEdBQWNVLElBQXNCQyxHQUFzQmYsS0FDckVDLElBQ0RBLEVBQVNuRCxFQUFLbUUsY0FBYzNJLEVBQVM0SCxJQUN6Q3BELEVBQUtvRSxlQUFlN0ksRUFBTTRILEVBQVEzdUIsR0FFMUMsQ0FJSkEsRUFBS2d2QixPQUFTRixFQUdkRCxHQUFjLENBQ2xCLENBL0NZLENBZ0RoQixDQUdJQSxJQUNBOUgsRUFBS2tFLFVBQVlPLEVBQUtxRSx1QkFBdUI5SSxHQUNyRCxFQUVBL3JCLEVBQVd3d0IsRUFBTSxTQUFVLDZDQVEzQkEsRUFBSzdrQixNQUFRLFNBQVNvZ0IsR0FDbEJBLEVBQUtDLFFBQVUsQ0FBQyxFQUNoQkQsRUFBSzlaLE1BQVEsQ0FBQyxFQUNkOFosRUFBS2tFLFVBQVksRUFDckIsRUFFQWp3QixFQUFXd3dCLEVBQU0sUUFBUyw0Q0FXMUJBLEVBQUswRCxhQUFlLFNBQVNZLEVBQVNDLEdBQ2xDLElBQUlaLEVBQVczMkIsS0FBS2dCLElBQUlzMkIsRUFBUVgsU0FBVVksRUFBUVosVUFDOUNDLEVBQVM1MkIsS0FBS2lCLElBQUlxMkIsRUFBUVYsT0FBUVcsRUFBUVgsUUFDMUNDLEVBQVc3MkIsS0FBS2dCLElBQUlzMkIsRUFBUVQsU0FBVVUsRUFBUVYsVUFDOUNDLEVBQVM5MkIsS0FBS2lCLElBQUlxMkIsRUFBUVIsT0FBUVMsRUFBUVQsUUFFOUMsT0FBTzlELEVBQUt3RSxjQUFjYixFQUFVQyxFQUFRQyxFQUFVQyxFQUMxRCxFQVdBOUQsRUFBS3VELFdBQWEsU0FBU2hJLEVBQU0vbUIsR0FDN0IsSUFBSS9DLEVBQVMrQyxFQUFLL0MsT0FDZGt5QixFQUFXMzJCLEtBQUtDLE1BQU13RSxFQUFPekQsSUFBSTBELEVBQUk2cEIsRUFBS3lILGFBQzFDWSxFQUFTNTJCLEtBQUtDLE1BQU13RSxFQUFPeEQsSUFBSXlELEVBQUk2cEIsRUFBS3lILGFBQ3hDYSxFQUFXNzJCLEtBQUtDLE1BQU13RSxFQUFPekQsSUFBSTJELEVBQUk0cEIsRUFBSzBILGNBQzFDYSxFQUFTOTJCLEtBQUtDLE1BQU13RSxFQUFPeEQsSUFBSTBELEVBQUk0cEIsRUFBSzBILGNBRTVDLE9BQU9qRCxFQUFLd0UsY0FBY2IsRUFBVUMsRUFBUUMsRUFBVUMsRUFDMUQsRUFhQTlELEVBQUt3RSxjQUFnQixTQUFTYixFQUFVQyxFQUFRQyxFQUFVQyxHQUN0RCxNQUFPLENBQ0g1cUIsR0FBSXlxQixFQUFXLElBQU1DLEVBQVMsSUFBTUMsRUFBVyxJQUFNQyxFQUNyREgsU0FBVUEsRUFDVkMsT0FBUUEsRUFDUkMsU0FBVUEsRUFDVkMsT0FBUUEsRUFFaEIsRUFXQTlELEVBQUsrRCxhQUFlLFNBQVM5QyxFQUFRRixHQUNqQyxNQUFPLElBQU1FLEVBQVMsSUFBTUYsQ0FDaEMsRUFXQWYsRUFBS21FLGNBQWdCLFNBQVMzSSxFQUFTNEgsR0FFbkMsT0FEYTVILEVBQVE0SCxHQUFZLEVBRXJDLEVBV0FwRCxFQUFLb0UsZUFBaUIsU0FBUzdJLEVBQU00SCxFQUFRM3VCLEdBQ3pDLElBR0l2TCxFQUhBdzdCLEVBQVlsSixFQUFLOVosTUFDakJpakIsRUFBU3BpQixFQUFLcEosR0FDZHlyQixFQUFleEIsRUFBT3QzQixPQUkxQixJQUFLNUMsRUFBSSxFQUFHQSxFQUFJMDdCLEVBQWMxN0IsSUFBSyxDQUMvQixJQUFJNlksRUFBUXFoQixFQUFPbDZCLEdBRW5CLEtBQUl1TCxFQUFLMEUsS0FBTzRJLEVBQU01SSxJQUFPMUUsRUFBSzhHLFVBQVl3RyxFQUFNeEcsVUFBcEQsQ0FLQSxJQUFJcEMsRUFBS3dyQixFQUFPbHdCLEVBQU1zTixHQUNsQkosRUFBTytpQixFQUFVdnJCLEdBRWpCd0ksRUFDQUEsRUFBSyxJQUFNLEVBRVgraUIsRUFBVXZyQixHQUFNLENBQUMxRSxFQUFNc04sRUFBTyxFQVZ0QixDQVloQixDQUdBcWhCLEVBQU9oM0IsS0FBS3FJLEVBQ2hCLEVBV0F3ckIsRUFBS2tFLGtCQUFvQixTQUFTM0ksRUFBTTRILEVBQVEzdUIsR0FDNUMsSUFFSXZMLEVBRkF3N0IsRUFBWWxKLEVBQUs5WixNQUNqQmlqQixFQUFTcGlCLEVBQUtwSixHQUlsQmlxQixFQUFPbm9CLE9BQU9oUSxFQUFPNEUsUUFBUXV6QixFQUFRM3VCLEdBQU8sR0FFNUMsSUFBSW13QixFQUFleEIsRUFBT3QzQixPQUcxQixJQUFLNUMsRUFBSSxFQUFHQSxFQUFJMDdCLEVBQWMxN0IsSUFBSyxDQUcvQixJQUFJeVksRUFBTytpQixFQUFVQyxFQUFPbHdCLEVBQU0ydUIsRUFBT2w2QixLQUVyQ3lZLElBQ0FBLEVBQUssSUFBTSxFQUNuQixDQUNKLEVBVUFzZSxFQUFLcUUsdUJBQXlCLFNBQVM5SSxHQUNuQyxJQUFJN1osRUFLQTlKLEVBSkE2c0IsRUFBWWxKLEVBQUs5WixNQUNqQm1qQixFQUFXNTVCLEVBQU9rQixLQUFLdTRCLEdBQ3ZCSSxFQUFpQkQsRUFBUy80QixPQUMxQjRWLEVBQVEsR0FJWixJQUFLN0osRUFBSSxFQUFHQSxFQUFJaXRCLEVBQWdCanRCLEtBQzVCOEosRUFBTytpQixFQUFVRyxFQUFTaHRCLEtBSWpCLEdBQUssRUFDVjZKLEVBQU10VixLQUFLdVYsVUFFSitpQixFQUFVRyxFQUFTaHRCLElBSWxDLE9BQU82SixDQUNYLENBS0csRUFFRCxTQUFVL1ksRUFBUUQsRUFBUyxHQVdqQyxJQUFJdzNCLEVBQWtCLENBQUMsRUFFdkJ2M0IsRUFBT0QsUUFBVXczQixFQUVqQixJQUFJM3JCLEVBQVcsRUFBb0IsR0FDL0J1SCxFQUFXLEVBQW9CLEdBQy9CaVAsRUFBUSxFQUFvQixJQUM1QjNTLEVBQVMsRUFBb0IsR0FDN0J1VixFQUFXLEVBQW9CLElBQy9CbEgsRUFBYSxFQUFvQixJQUNqQ3pOLEVBQVksRUFBb0IsR0FDaEMvTixFQUFTLEVBQW9CLEdBQzdCdUcsRUFBUyxFQUFvQixHQWE3QjB1QixFQUFnQjMxQixPQUFTLFNBQVM0bkIsRUFBUWpaLEdBQ3RDLElBQUkrUixHQUFTa0gsRUFBU0EsRUFBT2xILE1BQVEsUUFBVS9SLEVBQVVBLEVBQVErUixNQUFRLE1BRXBFQSxJQUNHa0gsR0FBVUEsRUFBT3ZVLFFBQVV1VSxFQUFPdlUsT0FBT3dVLE9BQ3pDbkgsRUFBUUYsRUFBTXhnQixPQUFPNG5CLEVBQU92VSxPQUFPd1UsUUFDNUJsWixHQUFXQSxFQUFROFIsUUFDMUJDLEVBQVFGLEVBQU14Z0IsT0FBTzJPLEVBQVE4UixVQUU3QkMsRUFBUUYsRUFBTXhnQixTQUNkVSxFQUFPb0UsS0FBSyxzSEFJcEIsSUFhSStNLEVBQVcsQ0FDWGhELEtBQU0sa0JBQ042UixNQUFPQSxFQUNQRCxRQUFTLEtBQ1R2VyxLQUFNLEtBQ05nRyxXQWxCYWdNLEVBQVdsYyxPQUFPLENBQy9CbVAsTUFBTyxtQkFDUG1OLE9BQVFvRSxFQUFNeFksU0FDZHFVLE9BQVEsQ0FBRW5WLEVBQUcsRUFBR0MsRUFBRyxHQUNuQjlGLE9BQVEsSUFDUm1iLFVBQVcsR0FDWEUsaUJBQWtCLEVBQ2xCdkosT0FBUSxDQUNKRyxZQUFhLFVBQ2JFLFVBQVcsS0FVZlgsZ0JBQWlCLENBQ2JDLFNBQVUsRUFDVkMsS0FBTSxXQUNOQyxNQUFPLElBSVhzbkIsRUFBa0I5NUIsRUFBT08sT0FBTzRRLEVBQVVsRCxHQVE5QyxPQU5BZCxFQUFPQyxHQUFHOFosRUFBUSxnQkFBZ0IsV0FDOUIsSUFBSXRZLEVBQVliLEVBQVVhLFVBQVVzWSxFQUFPOEMsT0FDM0NpTCxFQUFnQnJ1QixPQUFPa3pCLEVBQWlCbHJCLEdBQ3hDcW1CLEVBQWdCOEUsZUFBZUQsRUFDbkMsSUFFT0EsQ0FDWCxFQVNBN0UsRUFBZ0JydUIsT0FBUyxTQUFTa3pCLEVBQWlCeHJCLEdBQy9DLElBQUkwUixFQUFROFosRUFBZ0I5WixNQUN4QnhRLEVBQWFzcUIsRUFBZ0J0cUIsV0FDN0JoRyxFQUFPc3dCLEVBQWdCdHdCLEtBRTNCLEdBQXFCLElBQWpCd1csRUFBTU0sUUFDTixHQUFLOVEsRUFBV3NILE1Bc0JaakcsRUFBU25QLElBQUk4TixFQUFXc0gsT0FBTyxHQUMvQnRILEVBQVdvTSxPQUFTb0UsRUFBTXhZLGNBdEIxQixJQUFLLElBQUl2SixFQUFJLEVBQUdBLEVBQUlxUSxFQUFPek4sT0FBUTVDLElBRS9CLEdBREF1TCxFQUFPOEUsRUFBT3JRLEdBQ1ZzSSxFQUFPUyxTQUFTd0MsRUFBSy9DLE9BQVF1WixFQUFNeFksV0FDNUJrYixFQUFTSyxXQUFXdlosRUFBSzZJLGdCQUFpQnluQixFQUFnQnpuQixpQkFDakUsSUFBSyxJQUFJdFEsRUFBSXlILEVBQUs1SCxNQUFNZixPQUFTLEVBQUksRUFBSSxFQUFHa0IsRUFBSXlILEVBQUs1SCxNQUFNZixPQUFRa0IsSUFBSyxDQUNwRSxJQUFJOFMsRUFBT3JMLEVBQUs1SCxNQUFNRyxHQUN0QixHQUFJdUgsRUFBU3RDLFNBQVM2TixFQUFLck8sU0FBVXdaLEVBQU14WSxVQUFXLENBQ2xEZ0ksRUFBV29NLE9BQVNvRSxFQUFNeFksU0FDMUJnSSxFQUFXc0gsTUFBUWdqQixFQUFnQnR3QixLQUFPQSxFQUMxQ2dHLEVBQVdxTSxPQUFTLENBQUVuVixFQUFHc1osRUFBTXhZLFNBQVNkLEVBQUk4QyxFQUFLaEMsU0FBU2QsRUFBR0MsRUFBR3FaLEVBQU14WSxTQUFTYixFQUFJNkMsRUFBS2hDLFNBQVNiLEdBQ2pHNkksRUFBVzRNLE9BQVM1UyxFQUFLeEIsTUFFekI2SSxFQUFTblAsSUFBSThILEdBQU0sR0FDbkIyRCxFQUFPUyxRQUFRa3NCLEVBQWlCLFlBQWEsQ0FBRTlaLE1BQU9BLEVBQU94VyxLQUFNQSxJQUVuRSxLQUNKLENBQ0osT0FRWmdHLEVBQVdzSCxNQUFRZ2pCLEVBQWdCdHdCLEtBQU8sS0FDMUNnRyxFQUFXcU0sT0FBUyxLQUVoQnJTLEdBQ0EyRCxFQUFPUyxRQUFRa3NCLEVBQWlCLFVBQVcsQ0FBRTlaLE1BQU9BLEVBQU94VyxLQUFNQSxHQUU3RSxFQVFBeXJCLEVBQWdCOEUsZUFBaUIsU0FBU0QsR0FDdEMsSUFBSTlaLEVBQVE4WixFQUFnQjlaLE1BQ3hCZ2EsRUFBY2hhLEVBQU1TLGFBRXBCdVosRUFBWXRaLFdBQ1p2VCxFQUFPUyxRQUFRa3NCLEVBQWlCLFlBQWEsQ0FBRTlaLE1BQU9BLElBRXREZ2EsRUFBWXJaLFdBQ1p4VCxFQUFPUyxRQUFRa3NCLEVBQWlCLFlBQWEsQ0FBRTlaLE1BQU9BLElBRXREZ2EsRUFBWXBaLFNBQ1p6VCxFQUFPUyxRQUFRa3NCLEVBQWlCLFVBQVcsQ0FBRTlaLE1BQU9BLElBR3hERixFQUFNc0Isa0JBQWtCcEIsRUFDNUIsQ0E4R0csRUFFRCxTQUFVdGlCLEVBQVFELEVBQVMsR0FVakMsSUFBSXkzQixFQUFRLENBQUMsRUFFYngzQixFQUFPRCxRQUFVeTNCLEVBRWpCLElBQUl2dEIsRUFBUyxFQUFvQixHQUM3QnVQLEVBQVksRUFBb0IsR0FDaEMzUSxFQUFTLEVBQW9CLEdBQzdCbVgsRUFBUyxFQUFvQixJQUM3QnBVLEVBQVcsRUFBb0IsR0FXL0I0ckIsRUFBTWpkLFNBQVcsU0FBU3pPLEVBQU04RSxHQU81QixJQU5BLElBQUl1VSxFQUFhLEdBQ2JDLEVBQWV4VSxFQUFPek4sT0FDdEI0RixFQUFTK0MsRUFBSy9DLE9BQ2R3UixFQUFXZixFQUFVZSxTQUNyQi9RLEVBQVdYLEVBQU9XLFNBRWJqSixFQUFJLEVBQUdBLEVBQUk2a0IsRUFBYzdrQixJQUFLLENBQ25DLElBQUk0WSxFQUFRdkksRUFBT3JRLEdBQ2ZvbEIsRUFBZXhNLEVBQU1qVixNQUFNZixPQUMzQm81QixFQUErQixJQUFqQjVXLEVBQXFCLEVBQUksRUFFM0MsR0FBSW5jLEVBQVMyUCxFQUFNcFEsT0FBUUEsR0FDdkIsSUFBSyxJQUFJMUUsRUFBSWs0QixFQUFhbDRCLEVBQUlzaEIsRUFBY3RoQixJQUFLLENBQzdDLElBQUk4UyxFQUFPZ0MsRUFBTWpWLE1BQU1HLEdBRXZCLEdBQUltRixFQUFTMk4sRUFBS3BPLE9BQVFBLEdBQVMsQ0FDL0IsSUFBSW1RLEVBQVlxQixFQUFTcEQsRUFBTXJMLEdBRS9CLEdBQUlvTixFQUFXLENBQ1hpTSxFQUFXMWhCLEtBQUt5VixHQUNoQixLQUNKLENBQ0osQ0FDSixDQUVSLENBRUEsT0FBT2lNLENBQ1gsRUFXQXFTLEVBQU1nRixJQUFNLFNBQVM1ckIsRUFBUTZyQixFQUFZQyxFQUFVQyxHQUMvQ0EsRUFBV0EsR0FBWSxPQVN2QixJQVBBLElBQUlDLEVBQVczeUIsRUFBT0ssTUFBTW15QixFQUFZQyxHQUNwQ0csRUFBWTV5QixFQUFPQyxVQUFVRCxFQUFPa0IsSUFBSXN4QixFQUFZQyxJQUNwREksRUFBcUMsSUFBN0JKLEVBQVMxekIsRUFBSXl6QixFQUFXenpCLEdBQ2hDK3pCLEVBQXFDLElBQTdCTCxFQUFTenpCLEVBQUl3ekIsRUFBV3h6QixHQUNoQ3V6QixFQUFNeGMsRUFBT0MsVUFBVTZjLEVBQU1DLEVBQU1GLEVBQVdGLEVBQVUsQ0FBRXJ5QixNQUFPc3lCLElBQ2pFelgsRUFBYXFTLEVBQU1qZCxTQUFTaWlCLEVBQUs1ckIsR0FFNUJyUSxFQUFJLEVBQUdBLEVBQUk0a0IsRUFBV2hpQixPQUFRNUMsR0FBSyxFQUFHLENBQzNDLElBQUkyWSxFQUFZaU0sRUFBVzVrQixHQUMzQjJZLEVBQVVwTixLQUFPb04sRUFBVUUsTUFBUUYsRUFBVUMsS0FDakQsQ0FFQSxPQUFPZ00sQ0FDWCxFQVVBcVMsRUFBTXNELE9BQVMsU0FBU2xxQixFQUFRN0gsRUFBUWkwQixHQUdwQyxJQUZBLElBQUlyMUIsRUFBUyxHQUVKcEgsRUFBSSxFQUFHQSxFQUFJcVEsRUFBT3pOLE9BQVE1QyxJQUFLLENBQ3BDLElBQUl1TCxFQUFPOEUsRUFBT3JRLEdBQ2RpSixFQUFXWCxFQUFPVyxTQUFTc0MsRUFBSy9DLE9BQVFBLElBQ3ZDUyxJQUFhd3pCLElBQWN4ekIsR0FBWXd6QixJQUN4Q3IxQixFQUFPbEUsS0FBS3FJLEVBQ3BCLENBRUEsT0FBT25FLENBQ1gsRUFTQTZ2QixFQUFNanVCLE1BQVEsU0FBU3FILEVBQVFySCxHQUczQixJQUZBLElBQUk1QixFQUFTLEdBRUpwSCxFQUFJLEVBQUdBLEVBQUlxUSxFQUFPek4sT0FBUTVDLElBQUssQ0FDcEMsSUFBSXVMLEVBQU84RSxFQUFPclEsR0FFbEIsR0FBSXNJLEVBQU9TLFNBQVN3QyxFQUFLL0MsT0FBUVEsR0FDN0IsSUFBSyxJQUFJbEYsRUFBMEIsSUFBdEJ5SCxFQUFLNUgsTUFBTWYsT0FBZSxFQUFJLEVBQUdrQixFQUFJeUgsRUFBSzVILE1BQU1mLE9BQVFrQixJQUFLLENBQ3RFLElBQUk4UyxFQUFPckwsRUFBSzVILE1BQU1HLEdBRXRCLEdBQUl3RSxFQUFPUyxTQUFTNk4sRUFBS3BPLE9BQVFRLElBQzFCcUMsRUFBU3RDLFNBQVM2TixFQUFLck8sU0FBVVMsR0FBUSxDQUM1QzVCLEVBQU9sRSxLQUFLcUksR0FDWixLQUNKLENBQ0osQ0FFUixDQUVBLE9BQU9uRSxDQUNYLENBS0csRUFFRCxTQUFVM0gsRUFBUUQsRUFBUyxHQWNqQyxJQUFJMDNCLEVBQVMsQ0FBQyxFQUVkejNCLEVBQU9ELFFBQVUwM0IsRUFFakIsSUFNUS9PLEVBQ0FDLEVBV0lzVSxFQWxCUnh0QixFQUFTLEVBQW9CLEdBQzdCNmlCLEVBQVMsRUFBb0IsSUFDN0Jod0IsRUFBUyxFQUFvQixHQU9QLG9CQUFYb0QsU0FDUGdqQixFQUF5QmhqQixPQUFPa2pCLHVCQUF5QmxqQixPQUFPbWpCLDZCQUMvQm5qQixPQUFPb2pCLDBCQUE0QnBqQixPQUFPcWpCLHdCQUUzRUosRUFBd0JqakIsT0FBT3VqQixzQkFBd0J2akIsT0FBT3dqQix5QkFDN0J4akIsT0FBT3lqQiw0QkFBOEJ6akIsT0FBTzBqQix3QkFHNUVWLElBR0RBLEVBQXlCLFNBQVM5WSxHQUM5QnF0QixFQUFnQmpVLFlBQVcsV0FDdkJwWixFQUFTdE4sRUFBT21ELE1BQ3BCLEdBQUcsSUFBTyxHQUNkLEVBRUFrakIsRUFBd0IsV0FDcEJ1VSxhQUFhRCxFQUNqQixHQVFKeEYsRUFBTzcxQixPQUFTLFNBQVMyTyxHQUNyQixJQWNJNHNCLEVBQVM3NkIsRUFBT08sT0FkTCxDQUNYMHNCLElBQUssR0FDTHZYLFdBQVksRUFDWm9sQixnQkFBaUIsR0FDakJDLGlCQUFrQixFQUNsQkMsYUFBYyxFQUNkelQsYUFBYyxHQUNkMFQsU0FBVSxLQUNWQyxjQUFlLEVBQ2Y5VCxlQUFnQixLQUNoQitULFNBQVMsRUFDVGhULFNBQVMsR0FHd0JsYSxHQU9yQyxPQUxBNHNCLEVBQU96dkIsTUFBUXl2QixFQUFPenZCLE9BQVMsSUFBT3l2QixFQUFPNU4sSUFDN0M0TixFQUFPTyxTQUFXUCxFQUFPTyxVQUFZLElBQU9QLEVBQU81TixJQUNuRDROLEVBQU9RLFNBQVdSLEVBQU9RLFVBQVksS0FBcUIsR0FBYlIsRUFBTzVOLEtBQ3BENE4sRUFBTzVOLElBQU0sSUFBTzROLEVBQU96dkIsTUFFcEJ5dkIsQ0FDWCxFQU9BMUYsRUFBT3ZMLElBQU0sU0FBU2lSLEVBQVEzVCxHQWUxQixZQWJ5QyxJQUE5QjJULEVBQU8xSyxxQkFDZGpKLEVBQVMyVCxFQUNUQSxFQUFTMUYsRUFBTzcxQixVQUdwQixTQUFVcVQsRUFBT21YLEdBQ2IrUSxFQUFPelQsZUFBaUJoQixFQUF1QnpULEdBRTNDbVgsR0FBUStRLEVBQU8xUyxTQUNmZ04sRUFBT21HLEtBQUtULEVBQVEzVCxFQUFRNEMsRUFFbkMsQ0FORCxHQVFPK1EsQ0FDWCxFQVdBMUYsRUFBT21HLEtBQU8sU0FBU1QsRUFBUTNULEVBQVE0QyxHQUNuQyxJQUVJMWUsRUFGQWljLEVBQVNILEVBQU9HLE9BQ2hCM1IsRUFBYSxFQUliN0gsRUFBUSxDQUNSK00sVUFBV3lNLEVBQU96TSxXQUd0QnpOLEVBQU9TLFFBQVFpdEIsRUFBUSxhQUFjaHRCLEdBRWpDZ3RCLEVBQU9NLFFBRVAvdkIsRUFBUXl2QixFQUFPenZCLE9BR2ZBLEVBQVMwZSxFQUFPK1EsRUFBT0ksVUFBYUosRUFBT3p2QixNQUMzQ3l2QixFQUFPSSxTQUFXblIsRUFHbEIrUSxFQUFPdFQsYUFBYXBtQixLQUFLaUssR0FDekJ5dkIsRUFBT3RULGFBQWVzVCxFQUFPdFQsYUFBYTlsQixPQUFPbzVCLEVBQU9DLGlCQVF4RHBsQixHQUhBdEssR0FEQUEsR0FIQUEsRUFBUXBKLEtBQUtnQixJQUFJZ0IsTUFBTSxLQUFNNjJCLEVBQU90VCxlQUdwQnNULEVBQU9PLFNBQVdQLEVBQU9PLFNBQVdod0IsR0FDcEN5dkIsRUFBT1EsU0FBV1IsRUFBT1EsU0FBV2p3QixHQUcvQnl2QixFQUFPenZCLE1BRzVCeXZCLEVBQU96dkIsTUFBUUEsR0FJVSxJQUF6Qnl2QixFQUFPSyxnQkFDUHhsQixHQUFjMlIsRUFBTzNVLFVBQVltb0IsRUFBT0ssZUFFbkIsSUFBckI3VCxFQUFPM1UsWUFDUGdELEVBQWEsR0FFakJtbEIsRUFBT0ssY0FBZ0I3VCxFQUFPM1UsVUFDOUJtb0IsRUFBT25sQixXQUFhQSxFQUdwQm1sQixFQUFPRyxjQUFnQixFQUNuQmxSLEVBQU8rUSxFQUFPRSxrQkFBb0IsTUFDbENGLEVBQU81TixJQUFNNE4sRUFBT0csZUFBaUJsUixFQUFPK1EsRUFBT0Usa0JBQW9CLEtBQ3ZFRixFQUFPRSxpQkFBbUJqUixFQUMxQitRLEVBQU9HLGFBQWUsR0FHMUI3dEIsRUFBT1MsUUFBUWl0QixFQUFRLE9BQVFodEIsR0FHL0JWLEVBQU9TLFFBQVFpdEIsRUFBUSxlQUFnQmh0QixHQUN2Q21pQixFQUFPcHBCLE9BQU9zZ0IsRUFBUTliLEVBQU9zSyxHQUM3QnZJLEVBQU9TLFFBQVFpdEIsRUFBUSxjQUFlaHRCLEdBRXRDVixFQUFPUyxRQUFRaXRCLEVBQVEsWUFBYWh0QixFQUN4QyxFQVFBc25CLEVBQU9qTCxLQUFPLFNBQVMyUSxHQUNuQnhVLEVBQXNCd1UsRUFBT3pULGVBQ2pDLEVBUUErTixFQUFPeEgsTUFBUSxTQUFTa04sRUFBUTNULEdBQzVCaU8sRUFBT3ZMLElBQUlpUixFQUFRM1QsRUFDdkIsQ0ErRkcsRUFFRCxTQUFVeHBCLEVBQVFELEVBQVMsR0FjakMsSUFBSTIzQixFQUFNLENBQUMsRUFFWDEzQixFQUFPRCxRQUFVMjNCLEVBRWpCLElBQUlsZSxFQUFZLEVBQW9CLEdBRWhDMVMsRUFEUyxFQUFvQixHQUNUQSxXQVlwQjR3QixFQUFJbmQsU0FBVyxTQUFTcEIsRUFBT0MsR0FDM0IsT0FBT0ksRUFBVWUsU0FBU3BCLEVBQU9DLEVBQ3JDLEVBRUF0UyxFQUFXNHdCLEVBQUssV0FBWSxnREFLekIsRUFFRCxTQUFVMTNCLEVBQVFELEVBQVMsR0FZakMsSUFBSTQzQixFQUFNLENBQUMsRUFFWDMzQixFQUFPRCxRQUFVNDNCLEVBRUosRUFBb0IsR0FBakMsSUFDSXIxQixFQUFTLEVBQW9CLEdBZTdCcTFCLEVBQUlrRyxlQUFpQixTQUFTbDZCLEVBQU1tNkIsR0FDVixvQkFBWHA0QixRQUE0QixlQUFnQkEsUUFDbkRwRCxFQUFPb0UsS0FBSyx1RUFJaEIsSUFBSW5HLEVBQUd3OUIsRUFBSXJtQixFQUFPbk8sRUFBT3kwQixFQUFTQyxFQUM5QkMsRUFBZUMsRUFDZkMsRUFDQUMsRUFBSUMsRUFEcUJ6eUIsRUFBUyxHQUMxQjFJLEVBQVMsRUFBRzZGLEVBQUksRUFBR0MsRUFBSSxFQUVuQzYwQixFQUFlQSxHQUFnQixHQUUvQixJQUFJUyxFQUFXLFNBQVNDLEVBQUlDLEVBQUlDLEdBRTVCLElBQUlDLEVBQWFELEVBQWMsR0FBTSxHQUFLQSxFQUFjLEVBR3hELElBQUtOLEdBQWFJLEdBQU1KLEVBQVVwMUIsR0FBS3kxQixHQUFNTCxFQUFVbjFCLEVBQUcsQ0FDbERtMUIsR0FBYU8sR0FDYk4sRUFBS0QsRUFBVXAxQixFQUNmczFCLEVBQUtGLEVBQVVuMUIsSUFFZm8xQixFQUFLLEVBQ0xDLEVBQUssR0FHVCxJQUFJLzBCLEVBQVEsQ0FDUlAsRUFBR3ExQixFQUFLRyxFQUNSdjFCLEVBQUdxMUIsRUFBS0csSUFJUkUsR0FBZVAsSUFDZkEsRUFBWTcwQixHQUdoQnNDLEVBQU9wSSxLQUFLOEYsR0FFWlAsRUFBSXExQixFQUFLRyxFQUNUdjFCLEVBQUlxMUIsRUFBS0csQ0FDYixDQUNKLEVBRUlHLEVBQWtCLFNBQVNaLEdBQzNCLElBQUlhLEVBQVViLEVBQVFjLG9CQUFvQkMsY0FHMUMsR0FBZ0IsTUFBWkYsRUFBSixDQUlBLE9BQVFBLEdBRVIsSUFBSyxJQUNMLElBQUssSUFDTCxJQUFLLElBQ0wsSUFBSyxJQUNMLElBQUssSUFDTCxJQUFLLElBQ0Q3MUIsRUFBSWcxQixFQUFRaDFCLEVBQ1pDLEVBQUkrMEIsRUFBUS8wQixFQUNaLE1BQ0osSUFBSyxJQUNERCxFQUFJZzFCLEVBQVFoMUIsRUFDWixNQUNKLElBQUssSUFDREMsRUFBSSswQixFQUFRLzBCLEVBSWhCczFCLEVBQVN2MUIsRUFBR0MsRUFBRyswQixFQUFRVSxZQXRCYixDQXVCZCxFQVVBLElBUEEvRyxFQUFJcUgsbUJBQW1CcjdCLEdBR3ZCK1QsRUFBUS9ULEVBQUtzN0IsaUJBR2JoQixFQUFXLEdBQ04xOUIsRUFBSSxFQUFHQSxFQUFJb0QsRUFBS3U3QixZQUFZQyxjQUFlNStCLEdBQUssRUFDakQwOUIsRUFBU3g2QixLQUFLRSxFQUFLdTdCLFlBQVlFLFFBQVE3K0IsSUFLM0MsSUFIQTI5QixFQUFnQkQsRUFBUzEzQixTQUdsQnBELEVBQVN1VSxHQUFPLENBTW5CLElBSEFzbUIsRUFBVUMsRUFES3Q2QixFQUFLMDdCLG1CQUFtQmw4QixNQUl4Qmc3QixFQUFhLENBQ3hCLEtBQU9ELEVBQWMvNkIsUUFBVSs2QixFQUFjLElBQU1GLEdBQy9DWSxFQUFnQlYsRUFBY3IwQixTQUVsQ3MwQixFQUFjSCxDQUNsQixDQUlBLE9BQVFBLEVBQVFjLG9CQUFvQkMsZUFFcEMsSUFBSyxJQUNMLElBQUssSUFDTCxJQUFLLElBQ0wsSUFBSyxJQUNMLElBQUssSUFDRHgxQixFQUFRNUYsRUFBSzI3QixpQkFBaUJuOEIsR0FDOUJvN0IsRUFBU2gxQixFQUFNUCxFQUFHTyxFQUFNTixFQUFHLEdBTS9COUYsR0FBVTI2QixDQUNkLENBR0EsSUFBS3Y5QixFQUFJLEVBQUd3OUIsRUFBS0csRUFBYy82QixPQUFRNUMsRUFBSXc5QixJQUFNeDlCLEVBQzdDcStCLEVBQWdCVixFQUFjMzlCLElBRWxDLE9BQU9zTCxDQUNYLEVBRUE4ckIsRUFBSXFILG1CQUFxQixTQUFTcjdCLEdBUTlCLElBSEEsSUFBSTQ3QixFQUFJQyxFQUFJamYsRUFBSWtmLEVBQUlqZixFQUFJa2YsRUFBSUMsRUFBT2g4QixFQUFLdTdCLFlBQ3BDbDJCLEVBQUksRUFBR0MsRUFBSSxFQUFHMjJCLEVBQU1ELEVBQUtSLGNBRXBCNStCLEVBQUksRUFBR0EsRUFBSXEvQixJQUFPci9CLEVBQUcsQ0FDMUIsSUFBSXMvQixFQUFNRixFQUFLUCxRQUFRNytCLEdBQ25CcytCLEVBQVVnQixFQUFJZixvQkFFbEIsR0FBSSxjQUFjOVcsS0FBSzZXLEdBQ2YsTUFBT2dCLElBQUs3MkIsRUFBSTYyQixFQUFJNzJCLEdBQ3BCLE1BQU82MkIsSUFBSzUyQixFQUFJNDJCLEVBQUk1MkIsUUFTeEIsT0FQSSxPQUFRNDJCLElBQUt0ZixFQUFLdlgsRUFBSTYyQixFQUFJdGYsSUFDMUIsT0FBUXNmLElBQUtyZixFQUFLeFgsRUFBSTYyQixFQUFJcmYsSUFDMUIsT0FBUXFmLElBQUtKLEVBQUt4MkIsRUFBSTQyQixFQUFJSixJQUMxQixPQUFRSSxJQUFLSCxFQUFLejJCLEVBQUk0MkIsRUFBSUgsSUFDMUIsTUFBT0csSUFBSzcyQixHQUFLNjJCLEVBQUk3MkIsR0FDckIsTUFBTzYyQixJQUFLNTJCLEdBQUs0MkIsRUFBSTUyQixHQUVqQjQxQixHQUVSLElBQUssSUFDRGMsRUFBS0csWUFBWW44QixFQUFLbzhCLDBCQUEwQi8yQixFQUFHQyxHQUFJMUksR0FDdkQsTUFDSixJQUFLLElBQ0RvL0IsRUFBS0csWUFBWW44QixFQUFLcThCLDBCQUEwQmgzQixFQUFHQyxHQUFJMUksR0FDdkQsTUFDSixJQUFLLElBQ0RvL0IsRUFBS0csWUFBWW44QixFQUFLczhCLG9DQUFvQ2ozQixHQUFJekksR0FDOUQsTUFDSixJQUFLLElBQ0RvL0IsRUFBS0csWUFBWW44QixFQUFLdThCLGtDQUFrQ2ozQixHQUFJMUksR0FDNUQsTUFDSixJQUFLLElBQ0RvL0IsRUFBS0csWUFBWW44QixFQUFLdzhCLGdDQUFnQ24zQixFQUFHQyxFQUFHc1gsRUFBSWtmLEVBQUlqZixFQUFJa2YsR0FBS24vQixHQUM3RSxNQUNKLElBQUssSUFDRG8vQixFQUFLRyxZQUFZbjhCLEVBQUt5OEIsc0NBQXNDcDNCLEVBQUdDLEVBQUd1WCxFQUFJa2YsR0FBS24vQixHQUMzRSxNQUNKLElBQUssSUFDRG8vQixFQUFLRyxZQUFZbjhCLEVBQUswOEIsb0NBQW9DcjNCLEVBQUdDLEVBQUdzWCxFQUFJa2YsR0FBS2wvQixHQUN6RSxNQUNKLElBQUssSUFDRG8vQixFQUFLRyxZQUFZbjhCLEVBQUsyOEIsMENBQTBDdDNCLEVBQUdDLEdBQUkxSSxHQUN2RSxNQUNKLElBQUssSUFDRG8vQixFQUFLRyxZQUFZbjhCLEVBQUs0OEIsdUJBQXVCdjNCLEVBQUdDLEVBQUc0MkIsRUFBSVcsR0FBSVgsRUFBSVksR0FBSVosRUFBSXYxQixNQUFPdTFCLEVBQUlhLGFBQWNiLEVBQUljLFdBQVlwZ0MsR0FDaEgsTUFDSixJQUFLLElBQ0wsSUFBSyxJQUNEeUksRUFBSXUyQixFQUNKdDJCLEVBQUl1MkIsRUFNRyxLQUFYWCxHQUE2QixLQUFYQSxJQUNsQlUsRUFBS3YyQixFQUNMdzJCLEVBQUt2MkIsRUFFYixDQUNKLENBSUcsRUFFRCxTQUFVakosRUFBUUQsRUFBUyxHQWdCakMsSUFBSTYzQixFQUFRLENBQUMsRUFFYjUzQixFQUFPRCxRQUFVNjNCLEVBRWpCLElBQUl2bkIsRUFBWSxFQUFvQixHQUN2QixFQUFvQixHQU83QnVuQixFQUFNaDJCLE9BQVN5TyxFQUFVek8sT0FDekJnMkIsRUFBTTFzQixJQUFNbUYsRUFBVW5GLElBQ3RCMHNCLEVBQU03bEIsT0FBUzFCLEVBQVUwQixPQUN6QjZsQixFQUFNbmxCLE1BQVFwQyxFQUFVb0MsTUFDeEJtbEIsRUFBTS9sQixhQUFleEIsRUFBVXdCLGFBQy9CK2xCLEVBQU1qbUIsUUFBVXRCLEVBQVVzQixRQUMxQmltQixFQUFNaG1CLGNBQWdCdkIsRUFBVXVCLGFBSzdCLEdBRVAsRUF4K1VFNVIsRUFBT0QsUUFBVUQsbUJDM0JuQixJQUFJOGdDLEVBQWlCLFlBQ3JCQSxFQUFlQyxTQUFXRCxFQUMxQkEsRUFBZUUsYUFHZixTQUFxQ0MsR0FDcEMsSUFBSUMsRUFBY0MsRUFBUSxDQUFDajRCLEVBQUUsRUFBRUMsRUFBRSxHQUM3Qmk0QixFQUFPLENBQUNsNEIsRUFBRSxLQUFLQyxFQUFFLEtBQUtzWCxHQUFHLEtBQUtrZixHQUFHLEtBQUtqZixHQUFHLEtBQUtrZixHQUFHLE1BZXJELE9BZEFxQixFQUFTSSxTQUFRLFNBQVNDLEdBR3pCLElBQUssSUFBSUMsSUFGUyxXQUFkRCxFQUFJRSxVQUFvQk4sRUFBYUksR0FDekNBLEVBQUk3QixHQUFHMEIsRUFBUWo0QixFQUFHbzRCLEVBQUk1QixHQUFHeUIsRUFBUWg0QixFQUNuQmk0QixFQUFVRyxLQUFLRCxJQUFLQSxFQUFJQyxJQUFNRCxFQUFJeHBCLFNBQVd3cEIsRUFBSUYsRUFBS0csSUFBTSxHQUNwRSxNQUFPRCxJQUFNQSxFQUFJcDRCLEVBQUlpNEIsRUFBUWo0QixHQUM3QixNQUFPbzRCLElBQU1BLEVBQUluNEIsRUFBSWc0QixFQUFRaDRCLEdBQ25DbTRCLEVBQUl4cEIsVUFBVyxFQUNmd3BCLEVBQUlHLEtBQU9ILEVBQUlHLEtBQUt4QyxjQUNILGFBQWJxQyxFQUFJRSxVQUNQRixFQUFJcDRCLEVBQUlnNEIsRUFBYWg0QixFQUNyQm80QixFQUFJbjRCLEVBQUkrM0IsRUFBYS8zQixHQUV0Qmc0QixFQUFVRyxDQUNYLElBQ09MLENBQ1IsRUFwQkEvZ0MsRUFBT0QsUUFBVTZnQyx1QkNTakIsU0FBU1ksRUFBZ0I1NkIsRUFBUzY2QixFQUFVQyxFQUFPQyxHQUNqREMsS0FBS2g3QixRQUFXQSxFQUNoQmc3QixLQUFLSCxTQUFXQSxFQUNoQkcsS0FBS0YsTUFBV0EsRUFDaEJFLEtBQUtELFNBQVdBLEVBQ2hCQyxLQUFLL2dDLEtBQVcsY0FFdUIsbUJBQTVCZ2hDLE1BQU1DLG1CQUNmRCxNQUFNQyxrQkFBa0JGLEtBQU1KLEVBRWxDLEVBaEJBLFNBQXNCTyxFQUFPcnhCLEdBQzNCLFNBQVNzeEIsSUFBU0osS0FBS3QrQixZQUFjeStCLENBQU8sQ0FDNUNDLEVBQUs5L0IsVUFBWXdPLEVBQU94TyxVQUN4QjYvQixFQUFNNy9CLFVBQVksSUFBSTgvQixDQUN4QixDQWNBQyxDQUFhVCxFQUFpQkssT0FFOUJMLEVBQWdCVSxhQUFlLFNBQVNULEVBQVVDLEdBQ2hELElBQUlTLEVBQTJCLENBQ3pCQyxRQUFTLFNBQVNDLEdBQ2hCLE1BQU8sSUFBT0MsRUFBY0QsRUFBWUUsTUFBUSxHQUNsRCxFQUVBLE1BQVMsU0FBU0YsR0FDaEIsSUFDSTloQyxFQURBaWlDLEVBQWUsR0FHbkIsSUFBS2ppQyxFQUFJLEVBQUdBLEVBQUk4aEMsRUFBWW4rQixNQUFNZixPQUFRNUMsSUFDeENpaUMsR0FBZ0JILEVBQVluK0IsTUFBTTNELGFBQWNpRyxNQUM1Q2k4QixFQUFZSixFQUFZbitCLE1BQU0zRCxHQUFHLElBQU0sSUFBTWtpQyxFQUFZSixFQUFZbitCLE1BQU0zRCxHQUFHLElBQzlFa2lDLEVBQVlKLEVBQVluK0IsTUFBTTNELElBR3BDLE1BQU8sS0FBTzhoQyxFQUFZSyxTQUFXLElBQU0sSUFBTUYsRUFBZSxHQUNsRSxFQUVBRyxJQUFLLFNBQVNOLEdBQ1osTUFBTyxlQUNULEVBRUF4K0IsSUFBSyxTQUFTdytCLEdBQ1osTUFBTyxjQUNULEVBRUFPLE1BQU8sU0FBU1AsR0FDZCxPQUFPQSxFQUFZUSxXQUNyQixHQUdOLFNBQVNDLEVBQUlDLEdBQ1gsT0FBT0EsRUFBR0MsV0FBVyxHQUFHLzlCLFNBQVMsSUFBSTg1QixhQUN2QyxDQUVBLFNBQVN1RCxFQUFjamdDLEdBQ3JCLE9BQU9BLEVBQ0oyRCxRQUFRLE1BQU8sUUFDZkEsUUFBUSxLQUFPLE9BQ2ZBLFFBQVEsTUFBTyxPQUNmQSxRQUFRLE1BQU8sT0FDZkEsUUFBUSxNQUFPLE9BQ2ZBLFFBQVEsTUFBTyxPQUNmQSxRQUFRLGdCQUF5QixTQUFTKzhCLEdBQU0sTUFBTyxPQUFTRCxFQUFJQyxFQUFLLElBQ3pFLzhCLFFBQVEseUJBQXlCLFNBQVMrOEIsR0FBTSxNQUFPLE1BQVNELEVBQUlDLEVBQUssR0FDOUUsQ0FFQSxTQUFTTixFQUFZcGdDLEdBQ25CLE9BQU9BLEVBQ0oyRCxRQUFRLE1BQU8sUUFDZkEsUUFBUSxNQUFPLE9BQ2ZBLFFBQVEsTUFBTyxPQUNmQSxRQUFRLEtBQU8sT0FDZkEsUUFBUSxNQUFPLE9BQ2ZBLFFBQVEsTUFBTyxPQUNmQSxRQUFRLE1BQU8sT0FDZkEsUUFBUSxNQUFPLE9BQ2ZBLFFBQVEsZ0JBQXlCLFNBQVMrOEIsR0FBTSxNQUFPLE9BQVNELEVBQUlDLEVBQUssSUFDekUvOEIsUUFBUSx5QkFBeUIsU0FBUys4QixHQUFNLE1BQU8sTUFBU0QsRUFBSUMsRUFBSyxHQUM5RSxDQTRDQSxNQUFPLFlBdENQLFNBQTBCdEIsR0FDeEIsSUFDSWxoQyxFQUFHOEQsRUFOb0JnK0IsRUFLdkJZLEVBQWUsSUFBSXo4QixNQUFNaTdCLEVBQVN0K0IsUUFHdEMsSUFBSzVDLEVBQUksRUFBR0EsRUFBSWtoQyxFQUFTdCtCLE9BQVE1QyxJQUMvQjBpQyxFQUFhMWlDLElBVFk4aEMsRUFTYVosRUFBU2xoQyxHQVIxQzRoQyxFQUF5QkUsRUFBWTV4QixNQUFNNHhCLElBYWxELEdBRkFZLEVBQWFuMEIsT0FFVG0wQixFQUFhOS9CLE9BQVMsRUFBRyxDQUMzQixJQUFLNUMsRUFBSSxFQUFHOEQsRUFBSSxFQUFHOUQsRUFBSTBpQyxFQUFhOS9CLE9BQVE1QyxJQUN0QzBpQyxFQUFhMWlDLEVBQUksS0FBTzBpQyxFQUFhMWlDLEtBQ3ZDMGlDLEVBQWE1K0IsR0FBSzQrQixFQUFhMWlDLEdBQy9COEQsS0FHSjQrQixFQUFhOS9CLE9BQVNrQixDQUN4QixDQUVBLE9BQVE0K0IsRUFBYTkvQixRQUNuQixLQUFLLEVBQ0gsT0FBTzgvQixFQUFhLEdBRXRCLEtBQUssRUFDSCxPQUFPQSxFQUFhLEdBQUssT0FBU0EsRUFBYSxHQUVqRCxRQUNFLE9BQU9BLEVBQWFsL0IsTUFBTSxHQUFJLEdBQUc4QyxLQUFLLE1BQ2xDLFFBQ0FvOEIsRUFBYUEsRUFBYTkvQixPQUFTLEdBRTdDLENBTXFCKy9CLENBQWlCekIsR0FBWSxRQUpsRCxTQUF1QkMsR0FDckIsT0FBT0EsRUFBUSxJQUFPWSxFQUFjWixHQUFTLElBQU8sY0FDdEQsQ0FFNER5QixDQUFjekIsR0FBUyxTQUNyRixFQTI0REExaEMsRUFBT0QsUUFBVSxDQUNmcWpDLFlBQWE1QixFQUNiNkIsTUEzNERGLFNBQW1CQyxFQUFPL3lCLEdBQ3hCQSxPQUFzQixJQUFaQSxFQUFxQkEsRUFBVSxDQUFDLEVBRTFDLElBOEVJZ3pCLEVBOUVBQyxFQUFhLENBQUMsRUFFZEMsRUFBeUIsQ0FBRUMsU0FBVUMsR0FDckNDLEVBQXlCRCxFQVl6QkUsRUFBUyxTQUFTQyxFQUFPQyxHQUFRLE9BZzFEbkMsU0FBZUQsRUFBTUMsR0FDbkIsSUFBS0EsRUFBTSxNQUFPLENBQUNELEdBQ25CLElBQUssSUFBSXpDLEVBQUUsQ0FBQ3lDLEdBQU92akMsRUFBRSxFQUFFQyxFQUFFdWpDLEVBQUs1Z0MsT0FBTzVDLEVBQUVDLEVBQUVELElBQUs4Z0MsRUFBRTlnQyxFQUFFLEdBQUd3akMsRUFBS3hqQyxHQUFHLEdBQzdELE9BQU84Z0MsQ0FDVCxDQXAxRDBDek4sQ0FBTWtRLEVBQU1DLEVBQU0sRUFDMURDLEVBQVMsUUFDVEMsRUFBU0MsRUFBcUIsQ0FBQyxJQUFLLE1BQU0sR0FBTyxHQU1qREMsRUFBUyxRQUNUQyxFQUFTRixFQUFxQixDQUFDLElBQUssTUFBTSxHQUFPLEdBRWpERyxFQUFTLFFBQ1RDLEVBQVNKLEVBQXFCLENBQUMsSUFBSyxNQUFNLEdBQU8sR0FDakRLLEVBQVUsU0FBUzVqQyxFQUFHeUgsR0FBUSxPQUFPMjRCLEdBQVNwZ0MsRUFBRXlILEVBQU0sRUFDdERvOEIsRUFBVSxRQUNWQyxFQUFVUCxFQUFxQixDQUFDLElBQUssTUFBTSxHQUFPLEdBRWxEUSxFQUFVLFFBQ1ZDLEVBQVVULEVBQXFCLENBQUMsSUFBSyxNQUFNLEdBQU8sR0FFbERVLEVBQVUsUUFDVkMsRUFBVVgsRUFBcUIsQ0FBQyxJQUFLLE1BQU0sR0FBTyxHQUVsRFksRUFBVSxRQUNWQyxFQUFVYixFQUFxQixDQUFDLElBQUssTUFBTSxHQUFPLEdBRWxEYyxFQUFVLFFBQ1ZDLEVBQVVmLEVBQXFCLENBQUMsSUFBSyxNQUFNLEdBQU8sR0FFbERnQixFQUFVLFFBQ1ZDLEVBQVVqQixFQUFxQixDQUFDLElBQUssTUFBTSxHQUFPLEdBQ2xEa0IsRUFBVSxRQUNWQyxFQUFVbkIsRUFBcUIsQ0FBQyxJQUFLLE1BQU0sR0FBTyxHQUtsRG9CLEVBQVUsUUFDVkMsRUFBVXJCLEVBQXFCLENBQUMsSUFBSyxNQUFNLEdBQU8sR0FJbERzQixFQUFVQyxFQUF1QixLQUFLLEdBQ3RDQyxFQUFVLFNBQVN4aEMsR0FBUyxPQUFPQSxFQUFNMkMsS0FBSyxHQUFJLEVBRWxEOCtCLEVBQVVGLEVBQXVCLEtBQUssR0FDdENHLEVBQVUsUUFDVkMsRUFBVTNCLEVBQXFCLENBQUMsSUFBSyxNQUFNLEdBQU8sR0FDbEQ0QixFQUFVLFNBQ1ZDLEVBQVU3QixFQUFxQixDQUFDLElBQUssTUFBTSxHQUFPLEdBQ2xEOEIsRUFBVSxTQUNWQyxFQUFVL0IsRUFBcUIsQ0FBQyxDQUFDLElBQUssT0FBTyxHQUFPLEdBRXBEZ0MsRUFBVSxhQUNWQyxFQUFVakMsRUFBcUIsQ0FBQyxJQUFLLEtBQU0sS0FBTSxPQUFPLEdBQU8sR0FFL0RrQyxFQUF1QixFQUV2QkMsRUFBdUIsQ0FBQyxDQUFFQyxLQUFNLEVBQUcvTixPQUFRLElBQzNDZ08sRUFBdUIsRUFDdkJDLEVBQXVCLEdBSzNCLEdBQUksY0FBZWoyQixFQUFTLENBQzFCLEtBQU1BLEVBQVFrMkIsYUFBYWhELEdBQ3pCLE1BQU0sSUFBSTVCLE1BQU0sbUNBQXFDdHhCLEVBQVFrMkIsVUFBWSxNQUczRTdDLEVBQXdCSCxFQUF1Qmx6QixFQUFRazJCLFVBQ3pELENBMEJBLFNBQVNoQixFQUF1QmxELEVBQU1tRSxHQUNwQyxNQUFPLENBQUVqMkIsS0FBTSxVQUFXOHhCLEtBQU1BLEVBQU1tRSxXQUFZQSxFQUNwRCxDQUVBLFNBQVN4QyxFQUFxQmhnQyxFQUFPdytCLEVBQVVnRSxHQUM3QyxNQUFPLENBQUVqMkIsS0FBTSxRQUFTdk0sTUFBT0EsRUFBT3crQixTQUFVQSxFQUFVZ0UsV0FBWUEsRUFDeEUsQ0FjQSxTQUFTQyxFQUFzQkMsR0FDN0IsSUFBd0N4a0MsRUFBcEN5a0MsRUFBVVIsRUFBb0JPLEdBRWxDLEdBQUlDLEVBQ0YsT0FBT0EsRUFHUCxJQURBemtDLEVBQUl3a0MsRUFBTSxHQUNGUCxFQUFvQmprQyxJQUMxQkEsSUFTRixJQUxBeWtDLEVBQVUsQ0FDUlAsTUFGRk8sRUFBVVIsRUFBb0Jqa0MsSUFFWmtrQyxLQUNoQi9OLE9BQVFzTyxFQUFRdE8sUUFHWG4yQixFQUFJd2tDLEdBQ21CLEtBQXhCdEQsRUFBTU4sV0FBVzVnQyxJQUNuQnlrQyxFQUFRUCxPQUNSTyxFQUFRdE8sT0FBUyxHQUVqQnNPLEVBQVF0TyxTQUdWbjJCLElBSUYsT0FEQWlrQyxFQUFvQk8sR0FBT0MsRUFDcEJBLENBRVgsQ0FFQSxTQUFTQyxFQUFvQkMsRUFBVUMsR0FDckMsSUFBSUMsRUFBa0JOLEVBQXNCSSxHQUN4Q0csRUFBa0JQLEVBQXNCSyxHQUU1QyxNQUFPLENBQ0wvVyxNQUFPLENBQ0w1WCxPQUFRMHVCLEVBQ1JULEtBQVFXLEVBQWdCWCxLQUN4Qi9OLE9BQVEwTyxFQUFnQjFPLFFBRTFCMTBCLElBQUssQ0FDSHdVLE9BQVEydUIsRUFDUlYsS0FBUVksRUFBY1osS0FDdEIvTixPQUFRMk8sRUFBYzNPLFFBRzVCLENBRUEsU0FBUzRPLEVBQVMxRixHQUNaMkUsRUFBY0csSUFFZEgsRUFBY0csSUFDaEJBLEVBQWlCSCxFQUNqQkksRUFBc0IsSUFHeEJBLEVBQW9CL2lDLEtBQUtnK0IsR0FDM0IsQ0FlQSxTQUFTa0MsSUFDUCxJQUFJeUQsRUFBSUMsRUFBSUMsRUFBSUMsRUFBSUMsRUFLcEIsSUFIQUosRUFBS2hCLEVBQ0xpQixFQUFLLEdBQ0xDLEVBQUtHLEtBQ0VILElBQU85RCxHQUNaNkQsRUFBRzVqQyxLQUFLNmpDLEdBQ1JBLEVBQUtHLEtBRVAsR0FBSUosSUFBTzdELEVBS1QsR0FKQThELEVBK0JKLFdBQ0UsSUFBSUYsRUFBSUMsRUFBSUMsRUFBSUMsRUFBSUMsRUFBSUUsRUFJeEIsR0FGQU4sRUFBS2hCLEdBQ0xpQixFQUFLTSxPQUNNbkUsRUFBWSxDQUtyQixJQUpBOEQsRUFBSyxHQUNMQyxFQUFLbkIsRUFDTG9CLEVBQUssR0FDTEUsRUFBS0QsS0FDRUMsSUFBT2xFLEdBQ1pnRSxFQUFHL2pDLEtBQUtpa0MsR0FDUkEsRUFBS0QsS0FlUCxJQWJJRCxJQUFPaEUsSUFDVGtFLEVBQUtDLE9BQ01uRSxFQUVUK0QsRUFEQUMsRUFBSyxDQUFDQSxFQUFJRSxJQU9adEIsRUFBY21CLEVBQ2RBLEVBQUsvRCxHQUVBK0QsSUFBTy9ELEdBQVksQ0FLeEIsSUFKQThELEVBQUc3akMsS0FBSzhqQyxHQUNSQSxFQUFLbkIsRUFDTG9CLEVBQUssR0FDTEUsRUFBS0QsS0FDRUMsSUFBT2xFLEdBQ1pnRSxFQUFHL2pDLEtBQUtpa0MsR0FDUkEsRUFBS0QsS0FFSEQsSUFBT2hFLElBQ1RrRSxFQUFLQyxPQUNNbkUsRUFFVCtELEVBREFDLEVBQUssQ0FBQ0EsRUFBSUUsSUFPWnRCLEVBQWNtQixFQUNkQSxFQUFLL0QsRUFFVCxDQUNJOEQsSUFBTzlELEVBR1Q0RCxFQURBQyxFQUFLeEQsRUFBT3dELEVBQUlDLElBR2hCbEIsRUFBY2dCLEVBQ2RBLEVBQUs1RCxFQUVULE1BQ0U0QyxFQUFjZ0IsRUFDZEEsRUFBSzVELEVBR1AsT0FBTzRELENBQ1QsQ0EvRlNRLEdBQ0ROLElBQU85RCxJQUNUOEQsRUFBSyxNQUVIQSxJQUFPOUQsRUFBWSxDQUdyQixJQUZBK0QsRUFBSyxHQUNMQyxFQUFLQyxLQUNFRCxJQUFPaEUsR0FDWitELEVBQUc5akMsS0FBSytqQyxHQUNSQSxFQUFLQyxLQUVIRixJQUFPL0QsR0FFVDZELEVBbE9LLFNBQVNyVyxHQUNkLElBQUtBLEVBQU0sTUFBTyxHQUNsQixJQUFLLElBQUk2VyxFQUFLLEdBQUd0bkMsRUFBRSxFQUFFQSxFQUFFeXdCLEVBQUs3dEIsT0FBTzVDLElBQUtzbkMsRUFBS0EsRUFBS3RoQyxPQUFPRCxNQUFNdWhDLEVBQUs3VyxFQUFLendCLElBQ3pFLElBQUl1akMsRUFBTStELEVBQUssR0FLZixPQUpJL0QsR0FBcUIsS0FBWkEsRUFBTXZDLGNBQ1Z1QyxFQUFNbHNCLFNBQ2Jrc0IsRUFBTXZDLEtBQU8sS0FFUnNHLENBQ1QsQ0F5Tk9DLENBQU9SLEdBQ1pGLEVBQUtDLElBRUxqQixFQUFjZ0IsRUFDZEEsRUFBSzVELEVBRVQsTUFDRTRDLEVBQWNnQixFQUNkQSxFQUFLNUQsT0FHUDRDLEVBQWNnQixFQUNkQSxFQUFLNUQsRUFHUCxPQUFPNEQsQ0FDVCxDQW9FQSxTQUFTTyxJQUNQLElBQUlQLEVBQUlDLEVBQUlDLEVBQUlDLEVBQUlDLEVBQUlFLEVBSXhCLEdBRkFOLEVBQUtoQixFQUNMaUIsRUE4RkYsV0FDRSxJQUFJRCxFQUFJQyxFQUFJQyxFQUFJQyxFQUFJQyxFQUFJRSxFQUFJSyxFQTVZUnBuQyxFQUFVb2pDLEVBQ3BCbHhCLEVBcVpWLEdBUkF1MEIsRUFBS2hCLEVBQ0RwQyxFQUFPaGMsS0FBS3NiLEVBQU1yOUIsT0FBT21nQyxLQUMzQmlCLEVBQUsvRCxFQUFNcjlCLE9BQU9tZ0MsR0FDbEJBLE1BRUFpQixFQUFLN0QsRUFDd0IyRCxFQUFTbEQsSUFFcENvRCxJQUFPN0QsRUFBWSxDQUdyQixJQUZBOEQsRUFBSyxHQUNMQyxFQUFLRSxLQUNFRixJQUFPL0QsR0FDWjhELEVBQUc3akMsS0FBSzhqQyxHQUNSQSxFQUFLRSxLQUVISCxJQUFPOUQsSUFDVCtELEVBQUtTLFFBQ014RSxHQUNUZ0UsRUFBS3BCLEdBQ0xzQixFQUFLTyxRQUNNekUsSUFDVGtFLEVBQUssTUFFSEEsSUFBT2xFLElBQ1R1RSxFQUFLRyxRQUNNMUUsRUFFVGdFLEVBREFFLEVBQUssQ0FBQ0EsRUFBSUssSUFPWjNCLEVBQWNvQixFQUNkQSxFQUFLaEUsR0FFSGdFLElBQU9oRSxJQUNUZ0UsRUFBSyxNQUVIQSxJQUFPaEUsR0FyYmFPLEVBdWJGeUQsRUF0YmxCMzBCLEVBQU9rdUIsR0FER3BnQyxFQXViQTBtQyxFQXRiUSxDQXNiSkUsSUFyYmR4RCxJQUFNbHhCLEVBQU9BLEVBQUt0TSxPQUFPdzZCLEdBQVksS0FBSHBnQyxFQUFTLElBQU0sSUFBSW9qQyxFQUFLLE1Bc2I1RHFELEVBREFDLEVBcGJLeDBCLElBdWJMdXpCLEVBQWNnQixFQUNkQSxFQUFLNUQsS0FPVDRDLEVBQWNnQixFQUNkQSxFQUFLNUQsRUFFVCxNQUNFNEMsRUFBY2dCLEVBQ2RBLEVBQUs1RCxFQUdQLE9BQU80RCxDQUNULENBOUpPZSxHQUNEZCxJQUFPN0QsRUFBWSxDQUtyQixJQUpBOEQsRUFBSyxHQUNMQyxFQUFLbkIsRUFDTG9CLEVBQUssR0FDTEUsRUFBS0QsS0FDRUMsSUFBT2xFLEdBQ1pnRSxFQUFHL2pDLEtBQUtpa0MsR0FDUkEsRUFBS0QsS0FlUCxJQWJJRCxJQUFPaEUsSUFDVGtFLEVBQUtVLE9BQ001RSxFQUVUK0QsRUFEQUMsRUFBSyxDQUFDQSxFQUFJRSxJQU9adEIsRUFBY21CLEVBQ2RBLEVBQUsvRCxHQUVBK0QsSUFBTy9ELEdBQVksQ0FLeEIsSUFKQThELEVBQUc3akMsS0FBSzhqQyxHQUNSQSxFQUFLbkIsRUFDTG9CLEVBQUssR0FDTEUsRUFBS0QsS0FDRUMsSUFBT2xFLEdBQ1pnRSxFQUFHL2pDLEtBQUtpa0MsR0FDUkEsRUFBS0QsS0FFSEQsSUFBT2hFLElBQ1RrRSxFQUFLVSxPQUNNNUUsRUFFVCtELEVBREFDLEVBQUssQ0FBQ0EsRUFBSUUsSUFPWnRCLEVBQWNtQixFQUNkQSxFQUFLL0QsRUFFVCxDQUNJOEQsSUFBTzlELEVBR1Q0RCxFQURBQyxFQUFLeEQsRUFBT3dELEVBQUlDLElBR2hCbEIsRUFBY2dCLEVBQ2RBLEVBQUs1RCxFQUVULE1BQ0U0QyxFQUFjZ0IsRUFDZEEsRUFBSzVELEVBR1AsT0FBTzRELENBQ1QsQ0FFQSxTQUFTZ0IsSUFDUCxJQUFJaEIsRUFrR0lDLEVBdEVSLE9BeUVJbEQsRUFBT25jLEtBQUtzYixFQUFNcjlCLE9BQU9tZ0MsS0FDM0JpQixFQUFLL0QsRUFBTXI5QixPQUFPbWdDLEdBQ2xCQSxNQUVBaUIsRUFBSzdELEVBQ3dCMkQsRUFBUy9DLElBRXBDaUQsSUFBTzdELElBRVQ2RCxFQW5kNkJ0RyxHQUFTLE9BdVd4Q3FHLEVBOEdLQyxLQTdHTTdELElBQ1Q0RCxFQWlISixXQUNFLElBQUlBLEVBQUlDLEVBQUlDLEVBQUlDLEVBVWhCLEdBUkFILEVBQUtoQixFQUNEL0IsRUFBT3JjLEtBQUtzYixFQUFNcjlCLE9BQU9tZ0MsS0FDM0JpQixFQUFLL0QsRUFBTXI5QixPQUFPbWdDLEdBQ2xCQSxNQUVBaUIsRUFBSzdELEVBQ3dCMkQsRUFBUzdDLElBRXBDK0MsSUFBTzdELEVBQVksQ0FHckIsSUFGQThELEVBQUssR0FDTEMsRUFBS0UsS0FDRUYsSUFBTy9ELEdBQ1o4RCxFQUFHN2pDLEtBQUs4akMsR0FDUkEsRUFBS0UsS0FFSEgsSUFBTzlELElBQ1QrRCxFQUFLVyxRQUNNMUUsRUFHVDRELEVBREFDLEVBQUs5QyxFQUFROEMsRUFBSUUsSUFPbkJuQixFQUFjZ0IsRUFDZEEsRUFBSzVELEVBRVQsTUFDRTRDLEVBQWNnQixFQUNkQSxFQUFLNUQsRUFHUCxPQUFPNEQsQ0FDVCxDQXZKU2lCLE1BQ003RSxJQUNUNEQsRUFxTk4sV0FDRSxJQUFJQSxFQUFJQyxFQUFJQyxFQUFJQyxFQVVoQixHQVJBSCxFQUFLaEIsRUFDRDVCLEVBQVF4YyxLQUFLc2IsRUFBTXI5QixPQUFPbWdDLEtBQzVCaUIsRUFBSy9ELEVBQU1yOUIsT0FBT21nQyxHQUNsQkEsTUFFQWlCLEVBQUs3RCxFQUN3QjJELEVBQVMxQyxJQUVwQzRDLElBQU83RCxFQUFZLENBR3JCLElBRkE4RCxFQUFLLEdBQ0xDLEVBQUtFLEtBQ0VGLElBQU8vRCxHQUNaOEQsRUFBRzdqQyxLQUFLOGpDLEdBQ1JBLEVBQUtFLEtBRUhILElBQU85RCxJQUNUK0QsRUFBS2UsUUFDTTlFLEVBR1Q0RCxFQURBQyxFQWhsQmlDdEcsR0FnbEJwQnNHLEVBQUlFLEVBaGxCZ0NsZ0MsS0FBSSxTQUFTMkIsR0FBSSxNQUFPLENBQUNBLEVBQUVBLEVBQUUsTUF1bEJoRm85QixFQUFjZ0IsRUFDZEEsRUFBSzVELEVBRVQsTUFDRTRDLEVBQWNnQixFQUNkQSxFQUFLNUQsRUFHUCxPQUFPNEQsQ0FDVCxDQTNQV21CLE1BQ00vRSxJQUNUNEQsRUF5VFIsV0FDRSxJQUFJQSxFQUFJQyxFQUFJQyxFQUFJQyxFQVVoQixHQVJBSCxFQUFLaEIsRUFDRDFCLEVBQVExYyxLQUFLc2IsRUFBTXI5QixPQUFPbWdDLEtBQzVCaUIsRUFBSy9ELEVBQU1yOUIsT0FBT21nQyxHQUNsQkEsTUFFQWlCLEVBQUs3RCxFQUN3QjJELEVBQVN4QyxJQUVwQzBDLElBQU83RCxFQUFZLENBR3JCLElBRkE4RCxFQUFLLEdBQ0xDLEVBQUtFLEtBQ0VGLElBQU8vRCxHQUNaOEQsRUFBRzdqQyxLQUFLOGpDLEdBQ1JBLEVBQUtFLEtBRUhILElBQU85RCxJQUNUK0QsRUFBS2UsUUFDTTlFLEVBR1Q0RCxFQURBQyxFQW5yQmlDdEcsR0FtckJwQnNHLEVBQUlFLEVBbnJCZ0NsZ0MsS0FBSSxTQUFTNEIsR0FBSSxNQUFPLENBQUNBLEVBQUVBLEVBQUUsTUEwckJoRm05QixFQUFjZ0IsRUFDZEEsRUFBSzVELEVBRVQsTUFDRTRDLEVBQWNnQixFQUNkQSxFQUFLNUQsRUFHUCxPQUFPNEQsQ0FDVCxDQS9WYW9CLE1BQ01oRixJQUNUNEQsRUErVlYsV0FDRSxJQUFJQSxFQUFJQyxFQUFJQyxFQUFJQyxFQVVoQixHQVJBSCxFQUFLaEIsRUFDRHhCLEVBQVE1YyxLQUFLc2IsRUFBTXI5QixPQUFPbWdDLEtBQzVCaUIsRUFBSy9ELEVBQU1yOUIsT0FBT21nQyxHQUNsQkEsTUFFQWlCLEVBQUs3RCxFQUN3QjJELEVBQVN0QyxJQUVwQ3dDLElBQU83RCxFQUFZLENBR3JCLElBRkE4RCxFQUFLLEdBQ0xDLEVBQUtFLEtBQ0VGLElBQU8vRCxHQUNaOEQsRUFBRzdqQyxLQUFLOGpDLEdBQ1JBLEVBQUtFLEtBRUhILElBQU85RCxHQUNUK0QsRUFxQk4sV0FDRSxJQUFJSCxFQUFJQyxFQUFJQyxFQUFJQyxFQUFJQyxFQUFJRSxFQUl4QixHQUZBTixFQUFLaEIsR0FDTGlCLEVBQUtvQixRQUNNakYsRUFBWSxDQW9CckIsSUFuQkE4RCxFQUFLLEdBQ0xDLEVBQUtuQixHQUNMb0IsRUFBS1MsUUFDTXpFLElBQ1RnRSxFQUFLLE1BRUhBLElBQU9oRSxJQUNUa0UsRUFBS2UsUUFDTWpGLEVBRVQrRCxFQURBQyxFQUFLLENBQUNBLEVBQUlFLElBT1p0QixFQUFjbUIsRUFDZEEsRUFBSy9ELEdBRUErRCxJQUFPL0QsR0FDWjhELEVBQUc3akMsS0FBSzhqQyxHQUNSQSxFQUFLbkIsR0FDTG9CLEVBQUtTLFFBQ016RSxJQUNUZ0UsRUFBSyxNQUVIQSxJQUFPaEUsSUFDVGtFLEVBQUtlLFFBQ01qRixFQUVUK0QsRUFEQUMsRUFBSyxDQUFDQSxFQUFJRSxJQU9adEIsRUFBY21CLEVBQ2RBLEVBQUsvRCxHQUdMOEQsSUFBTzlELEVBR1Q0RCxFQURBQyxFQUFLeEQsRUFBT3dELEVBQUlDLElBR2hCbEIsRUFBY2dCLEVBQ2RBLEVBQUs1RCxFQUVULE1BQ0U0QyxFQUFjZ0IsRUFDZEEsRUFBSzVELEVBR1AsT0FBTzRELENBQ1QsQ0FqRldzQixHQUNEbkIsSUFBTy9ELEVBR1Q0RCxFQURBQyxFQUFLOUMsRUFBUThDLEVBQUlFLElBR2pCbkIsRUFBY2dCLEVBQ2RBLEVBQUs1RCxLQUdQNEMsRUFBY2dCLEVBQ2RBLEVBQUs1RCxFQUVULE1BQ0U0QyxFQUFjZ0IsRUFDZEEsRUFBSzVELEVBR1AsT0FBTzRELENBQ1QsQ0FyWWV1QixNQUNNbkYsSUFDVDRELEVBa2ZaLFdBQ0UsSUFBSUEsRUFBSUMsRUFBSUMsRUFBSUMsRUFVaEIsR0FSQUgsRUFBS2hCLEVBQ0R0QixFQUFROWMsS0FBS3NiLEVBQU1yOUIsT0FBT21nQyxLQUM1QmlCLEVBQUsvRCxFQUFNcjlCLE9BQU9tZ0MsR0FDbEJBLE1BRUFpQixFQUFLN0QsRUFDd0IyRCxFQUFTcEMsSUFFcENzQyxJQUFPN0QsRUFBWSxDQUdyQixJQUZBOEQsRUFBSyxHQUNMQyxFQUFLRSxLQUNFRixJQUFPL0QsR0FDWjhELEVBQUc3akMsS0FBSzhqQyxHQUNSQSxFQUFLRSxLQUVISCxJQUFPOUQsR0FDVCtELEVBcUJOLFdBQ0UsSUFBSUgsRUFBSUMsRUFBSUMsRUFBSUMsRUFBSUMsRUFBSUUsRUFJeEIsR0FGQU4sRUFBS2hCLEdBQ0xpQixFQUFLdUIsUUFDTXBGLEVBQVksQ0FvQnJCLElBbkJBOEQsRUFBSyxHQUNMQyxFQUFLbkIsR0FDTG9CLEVBQUtTLFFBQ016RSxJQUNUZ0UsRUFBSyxNQUVIQSxJQUFPaEUsSUFDVGtFLEVBQUtrQixRQUNNcEYsRUFFVCtELEVBREFDLEVBQUssQ0FBQ0EsRUFBSUUsSUFPWnRCLEVBQWNtQixFQUNkQSxFQUFLL0QsR0FFQStELElBQU8vRCxHQUNaOEQsRUFBRzdqQyxLQUFLOGpDLEdBQ1JBLEVBQUtuQixHQUNMb0IsRUFBS1MsUUFDTXpFLElBQ1RnRSxFQUFLLE1BRUhBLElBQU9oRSxJQUNUa0UsRUFBS2tCLFFBQ01wRixFQUVUK0QsRUFEQUMsRUFBSyxDQUFDQSxFQUFJRSxJQU9adEIsRUFBY21CLEVBQ2RBLEVBQUsvRCxHQUdMOEQsSUFBTzlELEVBR1Q0RCxFQURBQyxFQUFLeEQsRUFBT3dELEVBQUlDLElBR2hCbEIsRUFBY2dCLEVBQ2RBLEVBQUs1RCxFQUVULE1BQ0U0QyxFQUFjZ0IsRUFDZEEsRUFBSzVELEVBR1AsT0FBTzRELENBQ1QsQ0FqRld5QixHQUNEdEIsSUFBTy9ELEVBR1Q0RCxFQURBQyxFQUFLOUMsRUFBUThDLEVBQUlFLElBR2pCbkIsRUFBY2dCLEVBQ2RBLEVBQUs1RCxLQUdQNEMsRUFBY2dCLEVBQ2RBLEVBQUs1RCxFQUVULE1BQ0U0QyxFQUFjZ0IsRUFDZEEsRUFBSzVELEVBR1AsT0FBTzRELENBQ1QsQ0F4aEJpQjBCLE1BQ010RixJQUNUNEQsRUFzbkJkLFdBQ0UsSUFBSUEsRUFBSUMsRUFBSUMsRUFBSUMsRUFVaEIsR0FSQUgsRUFBS2hCLEVBQ0RwQixFQUFRaGQsS0FBS3NiLEVBQU1yOUIsT0FBT21nQyxLQUM1QmlCLEVBQUsvRCxFQUFNcjlCLE9BQU9tZ0MsR0FDbEJBLE1BRUFpQixFQUFLN0QsRUFDd0IyRCxFQUFTbEMsSUFFcENvQyxJQUFPN0QsRUFBWSxDQUdyQixJQUZBOEQsRUFBSyxHQUNMQyxFQUFLRSxLQUNFRixJQUFPL0QsR0FDWjhELEVBQUc3akMsS0FBSzhqQyxHQUNSQSxFQUFLRSxLQUVISCxJQUFPOUQsR0FDVCtELEVBcUJOLFdBQ0UsSUFBSUgsRUFBSUMsRUFBSUMsRUFBSUMsRUFBSUMsRUFBSUUsRUFJeEIsR0FGQU4sRUFBS2hCLEdBQ0xpQixFQUFLMEIsUUFDTXZGLEVBQVksQ0FvQnJCLElBbkJBOEQsRUFBSyxHQUNMQyxFQUFLbkIsR0FDTG9CLEVBQUtTLFFBQ016RSxJQUNUZ0UsRUFBSyxNQUVIQSxJQUFPaEUsSUFDVGtFLEVBQUtxQixRQUNNdkYsRUFFVCtELEVBREFDLEVBQUssQ0FBQ0EsRUFBSUUsSUFPWnRCLEVBQWNtQixFQUNkQSxFQUFLL0QsR0FFQStELElBQU8vRCxHQUNaOEQsRUFBRzdqQyxLQUFLOGpDLEdBQ1JBLEVBQUtuQixHQUNMb0IsRUFBS1MsUUFDTXpFLElBQ1RnRSxFQUFLLE1BRUhBLElBQU9oRSxJQUNUa0UsRUFBS3FCLFFBQ012RixFQUVUK0QsRUFEQUMsRUFBSyxDQUFDQSxFQUFJRSxJQU9adEIsRUFBY21CLEVBQ2RBLEVBQUsvRCxHQUdMOEQsSUFBTzlELEVBR1Q0RCxFQURBQyxFQUFLeEQsRUFBT3dELEVBQUlDLElBR2hCbEIsRUFBY2dCLEVBQ2RBLEVBQUs1RCxFQUVULE1BQ0U0QyxFQUFjZ0IsRUFDZEEsRUFBSzVELEVBR1AsT0FBTzRELENBQ1QsQ0FqRlc0QixHQUNEekIsSUFBTy9ELEVBR1Q0RCxFQURBQyxFQUFLOUMsRUFBUThDLEVBQUlFLElBR2pCbkIsRUFBY2dCLEVBQ2RBLEVBQUs1RCxLQUdQNEMsRUFBY2dCLEVBQ2RBLEVBQUs1RCxFQUVULE1BQ0U0QyxFQUFjZ0IsRUFDZEEsRUFBSzVELEVBR1AsT0FBTzRELENBQ1QsQ0E1cEJtQjZCLE1BQ016RixJQUNUNEQsRUEwdkJoQixXQUNFLElBQUlBLEVBQUlDLEVBQUlDLEVBQUlDLEVBVWhCLEdBUkFILEVBQUtoQixFQUNEbEIsRUFBUWxkLEtBQUtzYixFQUFNcjlCLE9BQU9tZ0MsS0FDNUJpQixFQUFLL0QsRUFBTXI5QixPQUFPbWdDLEdBQ2xCQSxNQUVBaUIsRUFBSzdELEVBQ3dCMkQsRUFBU2hDLElBRXBDa0MsSUFBTzdELEVBQVksQ0FHckIsSUFGQThELEVBQUssR0FDTEMsRUFBS0UsS0FDRUYsSUFBTy9ELEdBQ1o4RCxFQUFHN2pDLEtBQUs4akMsR0FDUkEsRUFBS0UsS0FFSEgsSUFBTzlELEdBQ1QrRCxFQXFCTixXQUNFLElBQUlILEVBQUlDLEVBQUlDLEVBQUlDLEVBQUlDLEVBQUlFLEVBSXhCLEdBRkFOLEVBQUtoQixHQUNMaUIsRUFBS1csUUFDTXhFLEVBQVksQ0FvQnJCLElBbkJBOEQsRUFBSyxHQUNMQyxFQUFLbkIsR0FDTG9CLEVBQUtTLFFBQ016RSxJQUNUZ0UsRUFBSyxNQUVIQSxJQUFPaEUsSUFDVGtFLEVBQUtNLFFBQ014RSxFQUVUK0QsRUFEQUMsRUFBSyxDQUFDQSxFQUFJRSxJQU9adEIsRUFBY21CLEVBQ2RBLEVBQUsvRCxHQUVBK0QsSUFBTy9ELEdBQ1o4RCxFQUFHN2pDLEtBQUs4akMsR0FDUkEsRUFBS25CLEdBQ0xvQixFQUFLUyxRQUNNekUsSUFDVGdFLEVBQUssTUFFSEEsSUFBT2hFLElBQ1RrRSxFQUFLTSxRQUNNeEUsRUFFVCtELEVBREFDLEVBQUssQ0FBQ0EsRUFBSUUsSUFPWnRCLEVBQWNtQixFQUNkQSxFQUFLL0QsR0FHTDhELElBQU85RCxFQUdUNEQsRUFEQUMsRUFBS3hELEVBQU93RCxFQUFJQyxJQUdoQmxCLEVBQWNnQixFQUNkQSxFQUFLNUQsRUFFVCxNQUNFNEMsRUFBY2dCLEVBQ2RBLEVBQUs1RCxFQUdQLE9BQU80RCxDQUNULENBakZXOEIsR0FDRDNCLElBQU8vRCxFQUdUNEQsRUFEQUMsRUFBSzlDLEVBQVE4QyxFQUFJRSxJQUdqQm5CLEVBQWNnQixFQUNkQSxFQUFLNUQsS0FHUDRDLEVBQWNnQixFQUNkQSxFQUFLNUQsRUFFVCxNQUNFNEMsRUFBY2dCLEVBQ2RBLEVBQUs1RCxFQUdQLE9BQU80RCxDQUNULENBaHlCcUIrQixNQUNNM0YsSUFDVDRELEVBODFCbEIsV0FDRSxJQUFJQSxFQUFJQyxFQUFJQyxFQUFJQyxFQVVoQixHQVJBSCxFQUFLaEIsRUFDRGhCLEVBQVFwZCxLQUFLc2IsRUFBTXI5QixPQUFPbWdDLEtBQzVCaUIsRUFBSy9ELEVBQU1yOUIsT0FBT21nQyxHQUNsQkEsTUFFQWlCLEVBQUs3RCxFQUN3QjJELEVBQVM5QixJQUVwQ2dDLElBQU83RCxFQUFZLENBR3JCLElBRkE4RCxFQUFLLEdBQ0xDLEVBQUtFLEtBQ0VGLElBQU8vRCxHQUNaOEQsRUFBRzdqQyxLQUFLOGpDLEdBQ1JBLEVBQUtFLEtBRUhILElBQU85RCxHQUNUK0QsRUFxQk4sV0FDRSxJQUFJSCxFQUFJQyxFQUFJQyxFQUFJQyxFQUFJQyxFQUFJRSxFQUl4QixHQUZBTixFQUFLaEIsR0FDTGlCLEVBQUsrQixRQUNNNUYsRUFBWSxDQW9CckIsSUFuQkE4RCxFQUFLLEdBQ0xDLEVBQUtuQixHQUNMb0IsRUFBS1MsUUFDTXpFLElBQ1RnRSxFQUFLLE1BRUhBLElBQU9oRSxJQUNUa0UsRUFBSzBCLFFBQ001RixFQUVUK0QsRUFEQUMsRUFBSyxDQUFDQSxFQUFJRSxJQU9adEIsRUFBY21CLEVBQ2RBLEVBQUsvRCxHQUVBK0QsSUFBTy9ELEdBQ1o4RCxFQUFHN2pDLEtBQUs4akMsR0FDUkEsRUFBS25CLEdBQ0xvQixFQUFLUyxRQUNNekUsSUFDVGdFLEVBQUssTUFFSEEsSUFBT2hFLElBQ1RrRSxFQUFLMEIsUUFDTTVGLEVBRVQrRCxFQURBQyxFQUFLLENBQUNBLEVBQUlFLElBT1p0QixFQUFjbUIsRUFDZEEsRUFBSy9ELEdBR0w4RCxJQUFPOUQsRUFHVDRELEVBREFDLEVBQUt4RCxFQUFPd0QsRUFBSUMsSUFHaEJsQixFQUFjZ0IsRUFDZEEsRUFBSzVELEVBRVQsTUFDRTRDLEVBQWNnQixFQUNkQSxFQUFLNUQsRUFHUCxPQUFPNEQsQ0FDVCxDQWpGV2lDLEdBQ0Q5QixJQUFPL0QsRUFHVDRELEVBREFDLEVBQUs5QyxFQUFROEMsRUFBSUUsSUFHakJuQixFQUFjZ0IsRUFDZEEsRUFBSzVELEtBR1A0QyxFQUFjZ0IsRUFDZEEsRUFBSzVELEVBRVQsTUFDRTRDLEVBQWNnQixFQUNkQSxFQUFLNUQsRUFHUCxPQUFPNEQsQ0FDVCxDQXA0QnVCa0MsSUFVZGxDLENBQ1QsQ0FnSUEsU0FBU2MsS0FDUCxJQUFJZCxFQUFJQyxFQUFJQyxFQUFJQyxFQUFJQyxFQUFJRSxFQUl4QixHQUZBTixFQUFLaEIsR0FDTGlCLEVBQUtXLFFBQ014RSxFQUFZLENBb0JyQixJQW5CQThELEVBQUssR0FDTEMsRUFBS25CLEdBQ0xvQixFQUFLUyxRQUNNekUsSUFDVGdFLEVBQUssTUFFSEEsSUFBT2hFLElBQ1RrRSxFQUFLTSxRQUNNeEUsRUFFVCtELEVBREFDLEVBQUssQ0FBQ0EsRUFBSUUsSUFPWnRCLEVBQWNtQixFQUNkQSxFQUFLL0QsR0FFQStELElBQU8vRCxHQUNaOEQsRUFBRzdqQyxLQUFLOGpDLEdBQ1JBLEVBQUtuQixHQUNMb0IsRUFBS1MsUUFDTXpFLElBQ1RnRSxFQUFLLE1BRUhBLElBQU9oRSxJQUNUa0UsRUFBS00sUUFDTXhFLEVBRVQrRCxFQURBQyxFQUFLLENBQUNBLEVBQUlFLElBT1p0QixFQUFjbUIsRUFDZEEsRUFBSy9ELEdBR0w4RCxJQUFPOUQsRUFHVDRELEVBREFDLEVBQUt4RCxFQUFPd0QsRUFBSUMsSUFHaEJsQixFQUFjZ0IsRUFDZEEsRUFBSzVELEVBRVQsTUFDRTRDLEVBQWNnQixFQUNkQSxFQUFLNUQsRUFHUCxPQUFPNEQsQ0FDVCxDQTBDQSxTQUFTa0IsS0FDUCxJQUFJbEIsRUFBSUMsRUFBSUMsRUFBSUMsRUFBSUMsRUFBSUUsRUFJeEIsR0FGQU4sRUFBS2hCLEdBQ0xpQixFQUFLa0MsUUFDTS9GLEVBQVksQ0FvQnJCLElBbkJBOEQsRUFBSyxHQUNMQyxFQUFLbkIsR0FDTG9CLEVBQUtTLFFBQ016RSxJQUNUZ0UsRUFBSyxNQUVIQSxJQUFPaEUsSUFDVGtFLEVBQUs2QixRQUNNL0YsRUFFVCtELEVBREFDLEVBQUssQ0FBQ0EsRUFBSUUsSUFPWnRCLEVBQWNtQixFQUNkQSxFQUFLL0QsR0FFQStELElBQU8vRCxHQUNaOEQsRUFBRzdqQyxLQUFLOGpDLEdBQ1JBLEVBQUtuQixHQUNMb0IsRUFBS1MsUUFDTXpFLElBQ1RnRSxFQUFLLE1BRUhBLElBQU9oRSxJQUNUa0UsRUFBSzZCLFFBQ00vRixFQUVUK0QsRUFEQUMsRUFBSyxDQUFDQSxFQUFJRSxJQU9adEIsRUFBY21CLEVBQ2RBLEVBQUsvRCxHQUdMOEQsSUFBTzlELEVBR1Q0RCxFQURBQyxFQUFLeEQsRUFBT3dELEVBQUlDLElBR2hCbEIsRUFBY2dCLEVBQ2RBLEVBQUs1RCxFQUVULE1BQ0U0QyxFQUFjZ0IsRUFDZEEsRUFBSzVELEVBR1AsT0FBTzRELENBQ1QsQ0FnSkEsU0FBU3FCLEtBQ1AsSUFBSXJCLEVBQUlDLEVBQUlDLEVBQUlDLEVBQUlDLEVBQUlFLEVBenlCSHJHLEVBQUdtSSxFQUFHN29DLEVBbzFCM0IsT0F6Q0F5bUMsRUFBS2hCLEdBQ0xpQixFQUFLVyxRQUNNeEUsSUFDVDhELEVBQUtXLFFBQ016RSxJQUNUOEQsRUFBSyxNQUVIQSxJQUFPOUQsSUFDVCtELEVBQUtTLFFBQ014RSxJQUNUZ0UsRUFBS1MsUUFDTXpFLElBQ1RnRSxFQUFLLE1BRUhBLElBQU9oRSxJQUNUa0UsRUFBS00sUUFDTXhFLEdBM3pCS2dHLEVBNnpCR2pDLEVBN3pCQTVtQyxFQTZ6QkkrbUMsRUFDckJOLEVBREFDLEVBN3pCNkIsQ0FBRTltQixJQUFwQjhnQixFQTZ6QkVnRyxHQTd6QnVCcitCLEVBQUd5MkIsR0FBRzRCLEVBQUVwNEIsRUFBR3VYLEdBQUdncEIsRUFBRXhnQyxFQUFHMDJCLEdBQUc4SixFQUFFdmdDLEVBQUdELEVBQUVySSxFQUFFcUksRUFBR0MsRUFBRXRJLEVBQUVzSSxLQW8wQjVFbTlCLEVBQWNnQixFQUNkQSxFQUFLNUQsS0FPVDRDLEVBQWNnQixFQUNkQSxFQUFLNUQsS0FHUDRDLEVBQWNnQixFQUNkQSxFQUFLNUQsR0FHQTRELENBQ1QsQ0F3R0EsU0FBU3dCLEtBQ1AsSUFBSXhCLEVBQUlDLEVBQUlDLEVBQUlDLEVBMzdCS2lDLEVBQUc3b0MsRUF1OUJ4QixPQTFCQXltQyxFQUFLaEIsR0FDTGlCLEVBQUtXLFFBQ014RSxJQUNUOEQsRUFBS1csUUFDTXpFLElBQ1Q4RCxFQUFLLE1BRUhBLElBQU85RCxJQUNUK0QsRUFBS1MsUUFDTXhFLEdBdDhCUzdpQyxFQXc4QkQ0bUMsRUFDakJILEVBREFDLEVBeDhCOEIsQ0FBRTdtQixJQUFqQmdwQixFQXc4QkZuQyxHQXg4QndCcitCLEVBQUcwMkIsR0FBRzhKLEVBQUV2Z0MsRUFBR0QsRUFBRXJJLEVBQUVxSSxFQUFHQyxFQUFFdEksRUFBRXNJLEtBKzhCN0RtOUIsRUFBY2dCLEVBQ2RBLEVBQUs1RCxLQUdQNEMsRUFBY2dCLEVBQ2RBLEVBQUs1RCxHQUdBNEQsQ0FDVCxDQXdHQSxTQUFTMkIsS0FDUCxJQUFJM0IsRUFBSUMsRUFBSUMsRUFBSUMsRUE5akNLbEcsRUFBR21JLEVBMGxDeEIsT0ExQkFwQyxFQUFLaEIsR0FDTGlCLEVBQUtXLFFBQ014RSxJQUNUOEQsRUFBS1csUUFDTXpFLElBQ1Q4RCxFQUFLLE1BRUhBLElBQU85RCxJQUNUK0QsRUFBS1MsUUFDTXhFLEdBemtDU2dHLEVBMmtDRGpDLEVBQ2pCSCxFQURBQyxFQTNrQzhCLENBQUU5bUIsSUFBakI4Z0IsRUEya0NGZ0csR0Eza0N3QnIrQixFQUFHeTJCLEdBQUc0QixFQUFFcDRCLEVBQUdELEVBQUV3Z0MsRUFBRXhnQyxFQUFHQyxFQUFFdWdDLEVBQUV2Z0MsS0FrbEM3RG05QixFQUFjZ0IsRUFDZEEsRUFBSzVELEtBR1A0QyxFQUFjZ0IsRUFDZEEsRUFBSzVELEdBR0E0RCxDQUNULENBOE1BLFNBQVNnQyxLQUNQLElBQUloQyxFQUFJQyxFQUFJQyxFQUFJQyxFQUFJQyxFQUFJRSxFQUFRK0IsRUFBSUMsRUFBSUMsRUFBSUMsRUFBS0MsRUFyeUNBQyxFQTAzQ2pELE9BbkZBMUMsRUFBS2hCLEdBQ0xpQixFQUFLMEMsUUFDTXZHLElBQ1Q4RCxFQUFLVyxRQUNNekUsSUFDVDhELEVBQUssTUFFSEEsSUFBTzlELElBQ1QrRCxFQUFLd0MsUUFDTXZHLElBQ1RnRSxFQUFLUyxRQUNNekUsSUFDVGdFLEVBQUssTUFFSEEsSUFBT2hFLElBQ1RrRSxFQUFLNkIsUUFDTS9GLEdBQ0p5RSxPQUNNekUsSUFDVGlHLEVBQUtPLFFBQ014RyxJQUNUa0csRUFBS3pCLFFBQ016RSxJQUNUa0csRUFBSyxNQUVIQSxJQUFPbEcsSUFDVG1HLEVBQUtLLFFBQ014RyxJQUNUb0csRUFBTTNCLFFBQ016RSxJQUNWb0csRUFBTSxNQUVKQSxJQUFRcEcsSUFDVnFHLEVBQU03QixRQUNNeEUsRUFHVjRELEVBREFDLEVBMzBDd0MsQ0FBRTRDLEdBMjBDN0I1QyxFQTMwQ29DNkMsR0EyMENoQzNDLEVBMzBDdUM0QyxjQTIwQ25DekMsRUEzMEN1RDBDLFNBMjBDbkRYLEVBMzBDbUVZLE1BMjBDL0RWLEVBMzBDNEUzZ0MsR0FBOUU4Z0MsRUEyMENNRCxHQTMwQzZFN2dDLEVBQUdDLEVBQUU2Z0MsRUFBRzdnQyxJQWsxQ3hIbTlCLEVBQWNnQixFQUNkQSxFQUFLNUQsS0FPVDRDLEVBQWNnQixFQUNkQSxFQUFLNUQsS0FlYjRDLEVBQWNnQixFQUNkQSxFQUFLNUQsS0FPVDRDLEVBQWNnQixFQUNkQSxFQUFLNUQsS0FHUDRDLEVBQWNnQixFQUNkQSxFQUFLNUQsR0FHQTRELENBQ1QsQ0FFQSxTQUFTWSxLQUNQLElBQUlaLEVBQUlDLEVBQUlDLEVBQUlDLEVBNEJoQixPQTFCQUgsRUFBS2hCLEdBQ0xpQixFQUFLa0MsUUFDTS9GLElBQ1Q4RCxFQUFLVyxRQUNNekUsSUFDVDhELEVBQUssTUFFSEEsSUFBTzlELElBQ1QrRCxFQUFLZ0MsUUFDTS9GLEVBR1Q0RCxFQURBQyxFQTE0QzhCLENBQUVyK0IsRUEwNENuQnErQixFQTE0Q3dCcCtCLEVBMDRDcEJzK0IsSUFPbkJuQixFQUFjZ0IsRUFDZEEsRUFBSzVELEtBR1A0QyxFQUFjZ0IsRUFDZEEsRUFBSzVELEdBR0E0RCxDQUNULENBRUEsU0FBUzJDLEtBQ1AsSUFBUTFDLEVBYVIsT0FYS2pCLEdBQ0xpQixFQUFLaUQsUUFDTTlHLElBQ1Q2RCxFQUFLa0QsTUFFSGxELElBQU83RCxJQUVUNkQsR0FyNkNpQyxHQXU2QzlCQSxDQUdQLENBRUEsU0FBU2tDLEtBQ1AsSUFBUWxDLEVBQUlDLEVBQUlDLEVBK0NoQixPQTdDS25CLEVBQ0xpQixFQUFLakIsR0FDTGtCLEVBQUtrRCxRQUNNaEgsSUFDVDhELEVBQUssTUFFSEEsSUFBTzlELElBQ1QrRCxFQUFLK0MsUUFDTTlHLEVBRVQ2RCxFQURBQyxFQUFLLENBQUNBLEVBQUlDLElBT1puQixFQUFjaUIsRUFDZEEsRUFBSzdELEdBRUg2RCxJQUFPN0QsSUFDVDZELEVBQUtqQixHQUNMa0IsRUFBS2tELFFBQ01oSCxJQUNUOEQsRUFBSyxNQUVIQSxJQUFPOUQsSUFDVCtELEVBQUtnRCxRQUNNL0csRUFFVDZELEVBREFDLEVBQUssQ0FBQ0EsRUFBSUMsSUFPWm5CLEVBQWNpQixFQUNkQSxFQUFLN0QsSUFHTDZELElBQU83RCxJQUVUNkQsRUF2OUNrRCxFQXU5Q3JDQSxFQXY5QzRCeGdDLEtBQUssS0F5OUMzQ3dnQyxDQUdQLENBRUEsU0FBUzJDLEtBQ1AsSUFBUTNDLEVBZ0JSLE9BZEtqQixFQUNEZCxFQUFRdGQsS0FBS3NiLEVBQU1yOUIsT0FBT21nQyxLQUM1QmlCLEVBQUsvRCxFQUFNcjlCLE9BQU9tZ0MsR0FDbEJBLE1BRUFpQixFQUFLN0QsRUFDd0IyRCxFQUFTNUIsSUFFcEM4QixJQUFPN0QsSUFFVDZELEVBeCtDc0MsS0F3K0N6QkEsR0FFVkEsQ0FHUCxDQUVBLFNBQVNZLEtBQ1AsSUFBSWIsRUFBSUMsRUFBSUMsRUFBSUMsRUFBSUMsRUFLcEIsR0FIQUosRUFBS2hCLEVBQ0xpQixFQUFLLElBQ0xDLEVBQUtHLFFBQ01qRSxFQUNULEtBQU84RCxJQUFPOUQsR0FDWjZELEVBQUc1akMsS0FBSzZqQyxHQUNSQSxFQUFLRyxVQUdQSixFQUFLN0QsRUFFUCxHQUFJNkQsSUFBTzdELEVBS1QsSUFKQThELEVBQUttRCxRQUNNakgsSUFDVDhELEVBQUssTUFFSEEsSUFBTzlELEVBQVksQ0FHckIsSUFGQStELEVBQUssR0FDTEMsRUFBS0MsS0FDRUQsSUFBT2hFLEdBQ1orRCxFQUFHOWpDLEtBQUsrakMsR0FDUkEsRUFBS0MsS0FFSEYsSUFBTy9ELEVBRVQ0RCxFQURBQyxFQUFLLENBQUNBLEVBQUlDLEVBQUlDLElBR2RuQixFQUFjZ0IsRUFDZEEsRUFBSzVELEVBRVQsTUFDRTRDLEVBQWNnQixFQUNkQSxFQUFLNUQsT0FHUDRDLEVBQWNnQixFQUNkQSxFQUFLNUQsRUFFUCxHQUFJNEQsSUFBTzVELEVBQVksQ0FJckIsR0FIQTRELEVBQUtoQixFQUNMaUIsRUFBS2pCLEdBQ0xrQixFQUFLbUQsUUFDTWpILEVBQVksQ0FHckIsSUFGQStELEVBQUssR0FDTEMsRUFBS0MsS0FDRUQsSUFBT2hFLEdBQ1orRCxFQUFHOWpDLEtBQUsrakMsR0FDUkEsRUFBS0MsS0FFSEYsSUFBTy9ELEVBRVQ2RCxFQURBQyxFQUFLLENBQUNBLEVBQUlDLElBR1ZuQixFQUFjaUIsRUFDZEEsRUFBSzdELEVBRVQsTUFDRTRDLEVBQWNpQixFQUNkQSxFQUFLN0QsRUFFSDZELElBQU83RCxJQUVUNkQsRUEvaUQ0QixJQWlqRDlCRCxFQUFLQyxDQUNQLENBRUEsT0FBT0QsQ0FDVCxDQUVBLFNBQVNxRCxLQUNQLElBQUlyRCxFQVVKLE9BUnNDLEtBQWxDOUQsRUFBTU4sV0FBV29ELElBQ25CZ0IsRUExakRVLElBMmpEVmhCLE1BRUFnQixFQUFLNUQsRUFDd0IyRCxFQUFTM0IsSUFHakM0QixDQUNULENBRUEsU0FBU2tELEtBQ1AsSUFBUWpELEVBQUlDLEVBQUlDLEVBNENoQixPQTFDS25CLEVBQ0xpQixFQUFLakIsRUFDTGtCLEVBMkNGLFdBQ0UsSUFBUUQsRUFBSUMsRUFBSUMsRUFBSUMsRUE4RHBCLE9BNURLcEIsRUFDTGlCLEVBQUtqQixHQUNMa0IsRUFBS2lELFFBQ00vRyxJQUNUOEQsRUFBSyxNQUVIQSxJQUFPOUQsR0FDNkIsS0FBbENGLEVBQU1OLFdBQVdvRCxJQUNuQm1CLEVBNW5EUSxJQTZuRFJuQixNQUVBbUIsRUFBSy9ELEVBQ3dCMkQsRUFBU3hCLElBRXBDNEIsSUFBTy9ELElBQ1RnRSxFQUFLK0MsUUFDTS9HLEVBRVQ2RCxFQURBQyxFQUFLLENBQUNBLEVBQUlDLEVBQUlDLElBT2hCcEIsRUFBY2lCLEVBQ2RBLEVBQUs3RCxLQUdQNEMsRUFBY2lCLEVBQ2RBLEVBQUs3RCxHQUVINkQsSUFBTzdELElBQ1Q2RCxFQUFLakIsR0FDTGtCLEVBQUtpRCxRQUNNL0csR0FDNkIsS0FBbENGLEVBQU1OLFdBQVdvRCxJQUNuQm1CLEVBeHBETSxJQXlwRE5uQixNQUVBbUIsRUFBSy9ELEVBQ3dCMkQsRUFBU3hCLElBRXBDNEIsSUFBTy9ELEVBRVQ2RCxFQURBQyxFQUFLLENBQUNBLEVBQUlDLElBR1ZuQixFQUFjaUIsRUFDZEEsRUFBSzdELEtBR1A0QyxFQUFjaUIsRUFDZEEsRUFBSzdELElBR0w2RCxJQUFPN0QsSUFFVDZELEVBQUszQixFQUFRMkIsSUFFVkEsQ0FHUCxDQTNHT3FELEdBQ0RwRCxJQUFPOUQsSUFDVCtELEVBQUtvRCxRQUNNbkgsSUFDVCtELEVBQUssTUFFSEEsSUFBTy9ELEVBRVQ2RCxFQURBQyxFQUFLLENBQUNBLEVBQUlDLElBR1ZuQixFQUFjaUIsRUFDZEEsRUFBSzdELEtBR1A0QyxFQUFjaUIsRUFDZEEsRUFBSzdELEdBRUg2RCxJQUFPN0QsSUFDVDZELEVBQUtqQixHQUNMa0IsRUFBS2lELFFBQ00vRyxJQUNUK0QsRUFBS29ELFFBQ01uSCxFQUVUNkQsRUFEQUMsRUFBSyxDQUFDQSxFQUFJQyxJQU9abkIsRUFBY2lCLEVBQ2RBLEVBQUs3RCxJQUdMNkQsSUFBTzdELElBRVQ2RCxFQUFLM0IsRUFBUTJCLElBRVZBLENBR1AsQ0FvRUEsU0FBU3NELEtBQ1AsSUFBUXRELEVBQUlDLEVBQUlDLEVBQUlDLEVBdUNwQixPQXJDS3BCLEVBQ0xpQixFQUFLakIsRUFDRFIsRUFBUTVkLEtBQUtzYixFQUFNcjlCLE9BQU9tZ0MsS0FDNUJrQixFQUFLaEUsRUFBTXI5QixPQUFPbWdDLEdBQ2xCQSxNQUVBa0IsRUFBSzlELEVBQ3dCMkQsRUFBU3RCLElBRXBDeUIsSUFBTzlELElBQ1QrRCxFQUFLaUQsUUFDTWhILElBQ1QrRCxFQUFLLE1BRUhBLElBQU8vRCxJQUNUZ0UsRUFBSytDLFFBQ00vRyxFQUVUNkQsRUFEQUMsRUFBSyxDQUFDQSxFQUFJQyxFQUFJQyxJQU9oQnBCLEVBQWNpQixFQUNkQSxFQUFLN0QsS0FHUDRDLEVBQWNpQixFQUNkQSxFQUFLN0QsR0FFSDZELElBQU83RCxJQUVUNkQsRUFBSzNCLEVBQVEyQixJQUVWQSxDQUdQLENBRUEsU0FBU21ELEtBQ1AsSUFBSXBELEVBVUosT0FSSXRCLEVBQVE5ZCxLQUFLc2IsRUFBTXI5QixPQUFPbWdDLEtBQzVCZ0IsRUFBSzlELEVBQU1yOUIsT0FBT21nQyxHQUNsQkEsTUFFQWdCLEVBQUs1RCxFQUN3QjJELEVBQVNwQixJQUdqQ3FCLENBQ1QsQ0FFQSxTQUFTbUQsS0FDUCxJQUFRbEQsRUFBSUMsRUFXWixHQVRLbEIsRUFDTGlCLEVBQUssR0FDRHJCLEVBQVFoZSxLQUFLc2IsRUFBTXI5QixPQUFPbWdDLEtBQzVCa0IsRUFBS2hFLEVBQU1yOUIsT0FBT21nQyxHQUNsQkEsTUFFQWtCLEVBQUs5RCxFQUN3QjJELEVBQVNsQixJQUVwQ3FCLElBQU85RCxFQUNULEtBQU84RCxJQUFPOUQsR0FDWjZELEVBQUc1akMsS0FBSzZqQyxHQUNKdEIsRUFBUWhlLEtBQUtzYixFQUFNcjlCLE9BQU9tZ0MsS0FDNUJrQixFQUFLaEUsRUFBTXI5QixPQUFPbWdDLEdBQ2xCQSxNQUVBa0IsRUFBSzlELEVBQ3dCMkQsRUFBU2xCLFNBSTFDb0IsRUFBSzdELEVBUVAsT0FOSTZELElBQU83RCxJQUVUNkQsRUFBYUEsRUFod0Q4QnhnQyxLQUFLLEtBa3dEN0N3Z0MsQ0FHUCxDQUVBLFNBQVNJLEtBQ1AsSUFBUUosRUFnQlIsT0FkS2pCLEVBQ0RGLEVBQVFsZSxLQUFLc2IsRUFBTXI5QixPQUFPbWdDLEtBQzVCaUIsRUFBSy9ELEVBQU1yOUIsT0FBT21nQyxHQUNsQkEsTUFFQWlCLEVBQUs3RCxFQUN3QjJELEVBQVNoQixJQUVwQ2tCLElBQU83RCxJQUVUNkQsRUFoeUQ4QixJQWt5RDNCQSxDQUdQLENBU0UsSUEvcERnQzVGLEdBQVVDLEdBQU9DLEdBK3BEN0NrRyxHQUFPLENBQUNubkMsRUFBRSxTQUFTRixFQUFFLFNBQVNvcUMsRUFBRSxvQkFBb0I5OUIsRUFBRSxrQkFBa0JuTSxFQUFFLFVBQVUwQixFQUFFLGlCQUFpQndvQyxFQUFFLG9CQUFvQnJwQyxFQUFFLDJCQUEyQjYvQixFQUFFLGlCQUFpQmx5QixFQUFFLGFBQ25MLElBQUssSUFBSW95QixNQUFRc0csR0FBTUEsR0FBS3RHLEdBQUt4QyxlQUFlOEksR0FBS3RHLElBQ3JELFNBQVNSLEdBQVNRLEVBQUtuNUIsR0FDaEJBLElBQU1BLEVBQUssQ0FBQyxDQUFDLElBQ2xCLElBQUssSUFBSTdILEVBQUU2SCxFQUFLakYsT0FBTzVDLEtBQUssQ0FDMUIsSUFBSTZnQyxFQUFJLENBQUNHLEtBQUtBLEVBQUtELFFBQVF1RyxHQUFLdEcsSUFFaEMsSUFBSyxJQUFJcnlCLEtBRExxeUIsR0FBTUEsRUFBS3VKLGdCQUFlMUosRUFBSXhwQixVQUFTLEdBQzdCeFAsRUFBSzdILEdBQUk2Z0MsRUFBSWx5QixHQUFHOUcsRUFBSzdILEdBQUcyTyxHQUN0QzlHLEVBQUs3SCxHQUFLNmdDLENBQ1osQ0FDQSxPQUFPaDVCLENBQ1QsQ0FLRixJQUZBbTdCLEVBQWFLLE9BRU1KLEdBQWM0QyxJQUFnQjlDLEVBQU1uZ0MsT0FDckQsT0FBT29nQyxFQU1QLE1BSklBLElBQWVDLEdBQWM0QyxFQUFjOUMsRUFBTW5nQyxRQUNuRGdrQyxFQTV2REssQ0FBRTEyQixLQUFNLFFBeUVpQmd4QixHQXVyRDlCK0UsRUF2ckR3QzlFLEdBd3JEeEM2RSxFQUFpQmpELEVBQU1uZ0MsT0FBU21nQyxFQUFNcjlCLE9BQU9zZ0MsR0FBa0IsS0F4ckRoQjVFLEdBeXJEL0M0RSxFQUFpQmpELEVBQU1uZ0MsT0FDbkIyakMsRUFBb0JQLEVBQWdCQSxFQUFpQixHQUNyRE8sRUFBb0JQLEVBQWdCQSxHQTFyRG5DLElBQUkvRSxFQUNUQSxFQUFnQlUsYUFBYVQsR0FBVUMsSUFDdkNELEdBQ0FDLEdBQ0FDLEdBeXJETixLQzdnRUlvSixFQUEyQixDQUFDLEVBR2hDLFNBQVNDLEVBQW9CMXFDLEdBRTVCLElBQUkycUMsRUFBZUYsRUFBeUJ6cUMsR0FDNUMsUUFBcUI2akIsSUFBakI4bUIsRUFDSCxPQUFPQSxFQUFhbHJDLFFBR3JCLElBQUlDLEVBQVMrcUMsRUFBeUJ6cUMsR0FBWSxDQUdqRFAsUUFBUyxDQUFDLEdBT1gsT0FIQW1yQyxFQUFvQjVxQyxHQUFVRyxLQUFLVCxFQUFPRCxRQUFTQyxFQUFRQSxFQUFPRCxRQUFTaXJDLEdBR3BFaHJDLEVBQU9ELE9BQ2YsQ0NyQkFpckMsRUFBb0JwcUMsRUFBSSxDQUFDYixFQUFTb3JDLEtBQ2pDLElBQUksSUFBSXRwQyxLQUFPc3BDLEVBQ1hILEVBQW9CanFDLEVBQUVvcUMsRUFBWXRwQyxLQUFTbXBDLEVBQW9CanFDLEVBQUVoQixFQUFTOEIsSUFDNUViLE9BQU9DLGVBQWVsQixFQUFTOEIsRUFBSyxDQUFFWCxZQUFZLEVBQU1DLElBQUtncUMsRUFBV3RwQyxJQUUxRSxFQ05EbXBDLEVBQW9CcmlDLEVBQUksV0FDdkIsR0FBMEIsaUJBQWZ5aUMsV0FBeUIsT0FBT0EsV0FDM0MsSUFDQyxPQUFPeEosTUFBUSxJQUFJeUosU0FBUyxjQUFiLEVBR2hCLENBRkUsTUFBT3ppQyxHQUNSLEdBQXNCLGlCQUFYbEQsT0FBcUIsT0FBT0EsTUFDeEMsQ0FDQSxDQVB1QixHQ0F4QnNsQyxFQUFvQmpxQyxFQUFJLENBQUMrQixFQUFLTyxJQUFVckMsT0FBT2tCLFVBQVVDLGVBQWUxQixLQUFLcUMsRUFBS08sR0NDbEYybkMsRUFBb0I1cEMsRUFBS3JCLElBQ0gsb0JBQVhzQixRQUEwQkEsT0FBT0MsYUFDMUNOLE9BQU9DLGVBQWVsQixFQUFTc0IsT0FBT0MsWUFBYSxDQUFFQyxNQUFPLFdBRTdEUCxPQUFPQyxlQUFlbEIsRUFBUyxhQUFjLENBQUV3QixPQUFPLEdBQU8sMkdDRWpEK3BDLEVBQWtCLFNBQUNDLEVBQVlDLEdBRXhDLE9BUHlCeGlDLEVBT0x1aUMsRUFBR3ZpQyxFQVBhQyxFQU9Wc2lDLEVBQUd0aUMsRUFQa0JzWCxFQU9maXJCLEVBQUd4aUMsRUFQd0J5MkIsRUFPckIrTCxFQUFHdmlDLEVBTGxDM0UsS0FBSzZGLEtBQUs3RixLQUFLZ0ssSUFBSXRGLEVBQUl1WCxFQUFJLEdBQUtqYyxLQUFLZ0ssSUFBSXJGLEVBQUl3MkIsRUFBSSxJQUZoQyxJQUFDejJCLEVBQVdDLEVBQVdzWCxFQUFZa2YsQ0FRL0QsRUFZYWdNLEVBQWMsU0FBQ0YsRUFBWUMsR0FFcEMsT0FBTyxFQUFBdmhDLE9BQUEsT0FBY3NoQyxFQUFHdmlDLEVBQUl3aUMsRUFBR3hpQyxFQUFHdWlDLEVBQUd0aUMsRUFBSXVpQyxFQUFHdmlDLEVBQ2hELEVBRWF5aUMsRUFBZSxTQUFDSCxFQUFZQyxHQUVyQyxPQUFPRCxFQUFHdmlDLElBQU13aUMsRUFBR3hpQyxHQUFLdWlDLEVBQUd0aUMsSUFBTXVpQyxFQUFHdmlDLENBQ3hDLEVBRWEwaUMsRUFBWSxTQUFDM2lDLEVBQVdDLEVBQVdzWCxFQUFZa2YsR0FFeEQsSUFHSW1NLEVBSEVDLEVBQUs3aUMsRUFBSXVYLEVBQ1R1ckIsRUFBSzdpQyxFQUFJdzJCLEVBZWYsT0FUSW1NLEVBRkFDLEdBQU1DLEVBRUl4bkMsS0FBS29ILE1BQU1vZ0MsRUFBSUQsR0FBTXZuQyxLQUFLeWMsR0FHMUIsR0FHQSxJQUNWNnFCLEdBQVcsRUFBRXRuQyxLQUFLeWMsSUFFZjZxQixDQUNYLEVDN0NBLDBCQXVFQSxRQXJFSSxZQUFBRyxXQUFBLFNBQVdDLEVBQXdCQyxHQUUvQixJQUFNVixFQUFLLEVBQUF0aEMsT0FBQSxPQUFjK2hDLEVBQU1oakMsRUFBR2dqQyxFQUFNL2lDLEdBQ2xDdWlDLEVBQUssRUFBQXZoQyxPQUFBLE9BQWMraEMsRUFBTXpNLEdBQUl5TSxFQUFNeE0sSUFFbkMwTSxFQUFLLEVBQUFqaUMsT0FBQSxPQUFjZ2lDLEVBQU1qakMsRUFBR2lqQyxFQUFNaGpDLEdBQ2xDa2pDLEVBQUssRUFBQWxpQyxPQUFBLE9BQWNnaUMsRUFBTTFNLEdBQUkwTSxFQUFNek0sSUFFbkNwK0IsRUFBSSxFQUFBNkksT0FBQSxJQUFXdWhDLEVBQUlELEdBQ25CbHBDLEVBQUksRUFBQTRILE9BQUEsSUFBV2tpQyxFQUFJRCxHQUNuQkUsRUFBTSxFQUFBbmlDLE9BQUEsTUFBYTdJLEVBQUdpQixHQUN0QmdxQyxFQUFPLEVBQUFwaUMsT0FBQSxNQUFhLEVBQUFBLE9BQUEsSUFBV2lpQyxFQUFJWCxHQUFLbnFDLEdBRzlDLEdBQUl3Z0MsS0FBSzBLLE9BQU9GLElBQVF4SyxLQUFLMEssT0FBT0QsR0FDcEMsQ0FDSSxJQUFNRSxFQUFjLEVBQUF0aUMsT0FBQSxVQUFpQndoQyxFQUFZLEVBQUF4aEMsT0FBQSxJQUFXaWlDLEVBQUlYLEdBQUtucUMsSUFDL0RvckMsRUFBYyxFQUFBdmlDLE9BQUEsVUFBaUJ3aEMsRUFBWSxFQUFBeGhDLE9BQUEsSUFBV3NoQyxFQUFJVyxHQUFLN3BDLElBQy9Eb3FDLEVBQWlCLEVBQUF4aUMsT0FBQSxVQUFpQndoQyxFQUFZcnFDLEVBQUdBLElBQ2pEc3JDLEVBQWlCLEVBQUF6aUMsT0FBQSxVQUFpQndoQyxFQUFZcHBDLEVBQUdBLElBSXZELE9BQUssR0FBS2txQyxHQUFlQSxHQUFlRSxHQUNwQyxJQUFNRCxHQUFlQSxHQUFlRSxHQVk1QyxHQUFJOUssS0FBSzBLLE9BQU9GLEtBQVN4SyxLQUFLMEssT0FBT0QsR0FFakMsT0FBTyxFQUlYLElBQU03cUMsRUFBSSxFQUFBeUksT0FBQSxNQUFhLEVBQUFBLE9BQUEsSUFBV2lpQyxFQUFJWCxHQUFLbHBDLEdBQUsrcEMsRUFHMUNPLEVBQUksRUFBQTFpQyxPQUFBLE1BQWEsRUFBQUEsT0FBQSxJQUFXaWlDLEVBQUlYLEdBQUtucUMsR0FBS2dyQyxFQUloRCxPQUFLeEssS0FBSzBLLE9BQU9GLElBQVMsR0FBSzVxQyxHQUFLQSxHQUFLLEdBQU8sR0FBS21yQyxHQUFLQSxHQUFLLENBUW5FLEVBRUEsWUFBQUMsc0JBQUEsV0FFSSxNQUFPLENBQUMsQ0FBQyxJQUFLLEtBQU0sQ0FBQyxJQUFLLEtBQzlCLEVBRVEsWUFBQU4sT0FBUixTQUFlMXJDLEdBRVgsT0FBTzBELEtBQUttSSxJQUFJN0wsR0FBSyxLQUN6QixFQUVKLEVBdkVBLEdDTkEsTUFDQSxHQUNFaXNDLFdBRm1DLG9CQUFYQyxRQUEwQkEsT0FBT0QsWUFBY0MsT0FBT0QsV0FBVy9xQyxLQUFLZ3JDLFNDR2hHLElBQUlDLEVBQ0osTUFBTUMsRUFBUSxJQUFJQyxXQUFXLElBQ2QsU0FBU0MsSUFFdEIsSUFBS0gsSUFFSEEsRUFBb0Msb0JBQVhELFFBQTBCQSxPQUFPQyxpQkFBbUJELE9BQU9DLGdCQUFnQmpyQyxLQUFLZ3JDLFNBRXBHQyxHQUNILE1BQU0sSUFBSWxMLE1BQU0sNEdBSXBCLE9BQU9rTCxFQUFnQkMsRUFDekIsQ0NYQSxNQUFNRyxFQUFZLEdBRWxCLElBQUssSUFBSTVzQyxFQUFJLEVBQUdBLEVBQUksTUFBT0EsRUFDekI0c0MsRUFBVTFwQyxNQUFNbEQsRUFBSSxLQUFPMEUsU0FBUyxJQUFJbEIsTUFBTSxJQ21CaEQsUUF4QkEsU0FBWXdNLEVBQVM2OEIsRUFBSy8wQixHQUN4QixHQUFJLGVBQXNCKzBCLElBQVE3OEIsRUFDaEMsT0FBTyxlQUlULE1BQU04OEIsR0FETjk4QixFQUFVQSxHQUFXLENBQUMsR0FDRC9MLFNBQVcrTCxFQUFRMjhCLEtBQU9BLEtBSy9DLEdBSEFHLEVBQUssR0FBZSxHQUFWQSxFQUFLLEdBQVksR0FDM0JBLEVBQUssR0FBZSxHQUFWQSxFQUFLLEdBQVksSUFFdkJELEVBQUssQ0FDUC8wQixFQUFTQSxHQUFVLEVBRW5CLElBQUssSUFBSTlYLEVBQUksRUFBR0EsRUFBSSxLQUFNQSxFQUN4QjZzQyxFQUFJLzBCLEVBQVM5WCxHQUFLOHNDLEVBQUs5c0MsR0FHekIsT0FBTzZzQyxDQUNULENBRUEsT0RiSyxTQUF5QkUsRUFBS2oxQixFQUFTLEdBRzVDLE9BQVE4MEIsRUFBVUcsRUFBSWoxQixFQUFTLElBQU04MEIsRUFBVUcsRUFBSWoxQixFQUFTLElBQU04MEIsRUFBVUcsRUFBSWoxQixFQUFTLElBQU04MEIsRUFBVUcsRUFBSWoxQixFQUFTLElBQU0sSUFBTTgwQixFQUFVRyxFQUFJajFCLEVBQVMsSUFBTTgwQixFQUFVRyxFQUFJajFCLEVBQVMsSUFBTSxJQUFNODBCLEVBQVVHLEVBQUlqMUIsRUFBUyxJQUFNODBCLEVBQVVHLEVBQUlqMUIsRUFBUyxJQUFNLElBQU04MEIsRUFBVUcsRUFBSWoxQixFQUFTLElBQU04MEIsRUFBVUcsRUFBSWoxQixFQUFTLElBQU0sSUFBTTgwQixFQUFVRyxFQUFJajFCLEVBQVMsS0FBTzgwQixFQUFVRyxFQUFJajFCLEVBQVMsS0FBTzgwQixFQUFVRyxFQUFJajFCLEVBQVMsS0FBTzgwQixFQUFVRyxFQUFJajFCLEVBQVMsS0FBTzgwQixFQUFVRyxFQUFJajFCLEVBQVMsS0FBTzgwQixFQUFVRyxFQUFJajFCLEVBQVMsTUFBTXl5QixhQUN2ZixDQ1NTeUMsQ0FBZ0JGLEVBQ3pCLEVDeEJBLGlCQU9JLFdBQVk5ckMsRUFBVW1QLEdBRWxCa3hCLEtBQUs0TCxJQUFNLElBQ1g1TCxLQUFLNkwsUUFBVS84QixFQUNma3hCLEtBQUs4TCxPQUFTbnNDLEVBQ2RxZ0MsS0FBSytMLFVBQVksRUFDckIsQ0FpREosT0EvQ0ksc0JBQUksaUJBQUUsS0FBTixXQUVJLE9BQU8vTCxLQUFLNEwsR0FDaEIsa0NBRUEsc0JBQUksb0JBQUssS0FBVCxXQUVJLE9BQU81TCxLQUFLOEwsTUFDaEIsa0NBRUEsWUFBQUUsU0FBQSxTQUFTcnNDLEdBRUwsSUFBTXNHLEVBQU8sSUFBSWdtQyxFQUFnQnRzQyxFQUFPcWdDLE1BR3hDLE9BRkEvNUIsRUFBSzRsQyxRQUFVN0wsS0FDZkEsS0FBSytMLFVBQVVscUMsS0FBS29FLEdBQ2JBLENBQ1gsRUFFQSxZQUFBaW1DLGFBQUEsU0FBYWptQyxHQUlULE9BRkFBLEVBQUs0bEMsUUFBVTdMLEtBQ2ZBLEtBQUsrTCxVQUFVbHFDLEtBQUtvRSxHQUNiQSxDQUNYLEVBRUEsWUFBQWttQyx1QkFBQSxXQUVJLElBQU1DLEVBQVcsSUFBSXhuQyxNQUEwQm83QixNQVMvQyxPQVJBQSxLQUFLK0wsVUFBVXhNLFNBQVEsU0FBQVksR0FFbkJBLEVBQU1nTSx5QkFBeUI1TSxTQUFRLFNBQUE4TSxHQUVuQ0QsRUFBU3ZxQyxLQUFLd3FDLEVBQ2xCLEdBQ0osSUFFT0QsQ0FDWCxFQUVBLFlBQUFFLFFBQUEsV0FFSSxZQUFxQi9wQixJQUFqQnlkLEtBQUs2TCxRQUVFN0wsS0FFSkEsS0FBSzZMLFFBQVFTLFNBQ3hCLEVBQ0osRUE5REEsR0NBQSxhQUtJLFdBQVlDLEdBRVJ2TSxLQUFLd00sT0FBUyxHQUNkeE0sS0FBS3lNLGdCQUFrQkYsQ0FDM0IsQ0FpREosT0EvQ0ksWUFBQUcsc0JBQUEsV0FFSSxPQUFPMU0sS0FBS3dNLE9BQU8vbUMsS0FBSSxTQUFBeEgsR0FFbkIsT0FBT0EsRUFBS2t1Qyx5QkFBeUIxbUMsS0FBSSxTQUFBUSxHQUFRLE9BQUFBLEVBQUt0RyxLQUFMLEdBQ3JELEdBQ0osRUFFQSxZQUFBZ3RDLFNBQUEsU0FBU2h0QyxHQUFULFdBRUksR0FBMkIsSUFBdkJxZ0MsS0FBS3dNLE9BQU9qckMsT0FFWnkrQixLQUFLd00sT0FBTzNxQyxLQUFLLElBQUlvcUMsRUFBZ0J0c0MsT0FBTzRpQixRQUdoRCxDQUNJLElBQU1xcUIsRUFBZ0I1TSxLQUFLNk0sY0FDdEI5N0IsUUFBTyxTQUFBOUssR0FBUSxTQUFLd21DLGdCQUFnQnhtQyxFQUFLdEcsTUFBT0EsRUFBakMsSUFHcEIsR0FBNkIsSUFBekJpdEMsRUFBY3JyQyxPQUdkeStCLEtBQUt3TSxPQUFPM3FDLEtBQUssSUFBSW9xQyxFQUFnQnRzQyxPQUFPNGlCLFFBR2hELENBQ0ksSUFBTSxFQUFZcXFCLEVBQWMsR0FBR1osU0FBU3JzQyxHQUM1Q2l0QyxFQUFjenFDLE1BQU0sRUFBR3lxQyxFQUFjcnJDLFFBQ2hDa0UsS0FBSSxTQUFBUSxHQUFRLE9BQUFBLEVBQUtxbUMsU0FBTCxJQUNadjdCLFFBQU8sU0FBQTlTLEdBQVEsT0FBQUEsRUFBSzJRLEtBQU8sRUFBVTA5QixVQUFVMTlCLEVBQWhDLElBQ2ZtQyxRQUFPLFNBQUM5SyxFQUFNa0UsRUFBTzVMLEdBQ2QsT0FBQTRMLElBQVU1TCxFQUFLdXVDLFdBQVUsU0FBQ2x0QyxHQUFNLE9BQUNBLEVBQUVnUCxLQUFPM0ksRUFBSzJJLEVBQWYsR0FBaEMsSUFFUDJ3QixTQUFRLFNBQUF0aEMsR0FFTCxFQUFVaXVDLGFBQWFqdUMsR0FDdkIsRUFBS3V1QyxPQUFPOTdCLE9BQU8sRUFBSzg3QixPQUFPbG5DLFFBQVFySCxHQUFPLEVBQ2xELEtBR2hCLEVBRUEsWUFBQTR1QyxZQUFBLFdBRUksT0FBTzdNLEtBQUt3TSxPQUFPTyxTQUFRLFNBQUM5bUMsR0FBUyxPQUFBQSxFQUFLa21DLHdCQUFMLEdBQ3pDLEVBQ0osRUExREEsR0NHQSwwQkE4QkEsUUE1QkksWUFBQWhDLFdBQUEsU0FBV3pGLEVBQXVCLzhCLEdBRTlCLElBQU04M0IsRUFBUWlGLEVBQUt0OUIsRUFBYnE0QixFQUFtQmlGLEVBQUtyOUIsRUFDeEJ1Z0MsRUFBUWxELEVBQUsvRyxHQUFiaUssRUFBb0JsRCxFQUFLOUcsR0FDekI3K0IsRUFBUTRJLEVBQU1QLEVBQWRySSxFQUFvQjRJLEVBQU1OLEVBQzFCMmxDLEdBQWdCanVDLEVBQU0wZ0MsSUFBUW1JLEVBQU1uSSxJQUFRMWdDLEVBQU0wZ0MsSUFBUW1JLEVBQU1uSSxHQUd0RSxHQUFJLzhCLEtBQUttSSxJQUFJbWlDLEdBQWdCLE1BRXpCLE9BQU8sRUFHWCxJQUFNQyxHQUFjbHVDLEVBQU0wZ0MsSUFBUW1JLEVBQU1uSSxJQUFRMWdDLEVBQU0wZ0MsSUFBTW1JLEVBQU1uSSxHQUNsRSxRQUFJd04sRUFBYSxJQU1WQSxJQURrQnJGLEVBQU1uSSxJQUFNbUksRUFBTW5JLElBQVFtSSxFQUFNbkksSUFBTW1JLEVBQU1uSSxFQUV6RSxFQUVBLFlBQUF1TCxzQkFBQSxXQUVJLE1BQU8sQ0FBQyxDQUFDLElBQUssS0FBTSxDQUFDLEtBQ3pCLEVBRUosRUE5QkEsR0NGQSxNQUFNLElBQUVuZ0MsRUFBRyxJQUFFakMsRUFBRyxJQUFFQyxFQUFHLEtBQUVtRSxFQUFJLE1BQUVsRCxFQUFLLEtBQUV2QixFQUFJLElBQUVtRSxHQUFRaEssS0FHbEQsU0FBU3dxQyxFQUFJaGlDLEdBQ1gsT0FBT0EsRUFBSSxHQUFLd0IsR0FBS3hCLEVBQUcsRUFBSSxHQUFLd0IsRUFBSXhCLEVBQUcsRUFBSSxFQUM5QyxDQUdBLE1BQU1paUMsRUFBS3pxQyxLQUFLeWMsR0FDZGl1QixFQUFNLEVBQUlELEVBQ1ZFLEVBQVFGLEVBQUssRUFJYkcsRUFBT3B6QixPQUFPcXpCLGtCQUFvQixpQkFDbENDLEVBQU90ekIsT0FBT3V6QixtQkFBcUIsaUJBRW5DQyxFQUFPLENBQUV0bUMsRUFBRyxFQUFHQyxFQUFHLEVBQUdrRyxFQUFHLEdBR3BCb2dDLEVBQVEsQ0FFWkMsUUFBUyxFQUNOLG1CQUNELG9CQUNDLGtCQUNELG1CQUNDLGtCQUNELG1CQUNDLGtCQUNELG1CQUNDLGtCQUNELG1CQUNDLGtCQUNELG1CQUNDLGtCQUNELG1CQUNDLGlCQUNELGtCQUNDLGtCQUNELG1CQUNDLGtCQUNELG1CQUNDLGtCQUNELG1CQUNDLGtCQUNELG1CQUlGQyxRQUFTLENBQ1AsbUJBQ0EsbUJBQ0Esa0JBQ0Esa0JBQ0EsbUJBQ0EsbUJBQ0Esa0JBQ0Esa0JBQ0EsbUJBQ0EsbUJBQ0EsbUJBQ0EsbUJBQ0EsbUJBQ0EsbUJBQ0Esa0JBQ0Esa0JBQ0EsbUJBQ0EsbUJBQ0EsbUJBQ0EsbUJBQ0Esb0JBQ0Esb0JBQ0Esa0JBQ0EsbUJBR0ZDLE1BQU8sU0FBVWx1QyxFQUFHbXVDLEdBQ2xCLE1BQU0vdUMsRUFBSSt1QyxFQUFhbnVDLEdBQ3ZCLElBQUloQixFQUFJSSxFQUFFb0ksRUFBSXBJLEVBQUVvSSxFQUFJcEksRUFBRXFJLEVBQUlySSxFQUFFcUksRUFJNUIsWUFIbUIsSUFBUnJJLEVBQUV1TyxJQUNYM08sR0FBS0ksRUFBRXVPLEVBQUl2TyxFQUFFdU8sR0FFUmhGLEVBQUszSixFQUNkLEVBRUFvdkMsUUFBUyxTQUFVcHVDLEVBQUdxSyxFQUFRZ2tDLEdBRTVCLEdBQVUsSUFBTnJ1QyxFQUVGLE9BREFxSyxFQUFPLEdBQUdySyxFQUFJLEVBQ1BxSyxFQUFPLEdBR2hCLE1BQU1pa0MsRUFBUWprQyxFQUFPMUksT0FBUyxFQUU5QixHQUFVLElBQU4zQixFQUVGLE9BREFxSyxFQUFPaWtDLEdBQU90dUMsRUFBSSxFQUNYcUssRUFBT2lrQyxHQUdoQixNQUFNQyxFQUFLLEVBQUl2dUMsRUFDZixJQUFJWSxFQUFJeUosRUFHUixHQUFjLElBQVZpa0MsRUFFRixPQURBamtDLEVBQU8sR0FBR3JLLEVBQUlBLEVBQ1BxSyxFQUFPLEdBSWhCLEdBQWMsSUFBVmlrQyxFQUFhLENBQ2YsTUFBTUUsRUFBTSxDQUNWaG5DLEVBQUcrbUMsRUFBSzN0QyxFQUFFLEdBQUc0RyxFQUFJeEgsRUFBSVksRUFBRSxHQUFHNEcsRUFDMUJDLEVBQUc4bUMsRUFBSzN0QyxFQUFFLEdBQUc2RyxFQUFJekgsRUFBSVksRUFBRSxHQUFHNkcsRUFDMUJ6SCxFQUFHQSxHQUtMLE9BSElxdUMsSUFDRkcsRUFBSTdnQyxFQUFJNGdDLEVBQUszdEMsRUFBRSxHQUFHK00sRUFBSTNOLEVBQUlZLEVBQUUsR0FBRytNLEdBRTFCNmdDLENBQ1QsQ0FHQSxHQUFJRixFQUFRLEVBQUcsQ0FDYixJQUVFek8sRUFDQW1JLEVBQ0E3b0MsRUFKRXN2QyxFQUFNRixFQUFLQSxFQUNiRyxFQUFLMXVDLEVBQUlBLEVBSVRaLEVBQUksRUFDUSxJQUFWa3ZDLEdBQ0YxdEMsRUFBSSxDQUFDQSxFQUFFLEdBQUlBLEVBQUUsR0FBSUEsRUFBRSxHQUFJa3RDLEdBQ3ZCak8sRUFBSTRPLEVBQ0p6RyxFQUFJdUcsRUFBS3Z1QyxFQUFJLEVBQ2JiLEVBQUl1dkMsR0FDZSxJQUFWSixJQUNUek8sRUFBSTRPLEVBQU1GLEVBQ1Z2RyxFQUFJeUcsRUFBTXp1QyxFQUFJLEVBQ2RiLEVBQUlvdkMsRUFBS0csRUFBSyxFQUNkdHZDLEVBQUlZLEVBQUkwdUMsR0FFVixNQUFNRixFQUFNLENBQ1ZobkMsRUFBR3E0QixFQUFJai9CLEVBQUUsR0FBRzRHLEVBQUl3Z0MsRUFBSXBuQyxFQUFFLEdBQUc0RyxFQUFJckksRUFBSXlCLEVBQUUsR0FBRzRHLEVBQUlwSSxFQUFJd0IsRUFBRSxHQUFHNEcsRUFDbkRDLEVBQUdvNEIsRUFBSWovQixFQUFFLEdBQUc2RyxFQUFJdWdDLEVBQUlwbkMsRUFBRSxHQUFHNkcsRUFBSXRJLEVBQUl5QixFQUFFLEdBQUc2RyxFQUFJckksRUFBSXdCLEVBQUUsR0FBRzZHLEVBQ25EekgsRUFBR0EsR0FLTCxPQUhJcXVDLElBQ0ZHLEVBQUk3Z0MsRUFBSWt5QixFQUFJai9CLEVBQUUsR0FBRytNLEVBQUlxNkIsRUFBSXBuQyxFQUFFLEdBQUcrTSxFQUFJeE8sRUFBSXlCLEVBQUUsR0FBRytNLEVBQUl2TyxFQUFJd0IsRUFBRSxHQUFHK00sR0FFbkQ2Z0MsQ0FDVCxDQUdBLE1BQU1HLEVBQVFDLEtBQUsvTSxNQUFNK00sS0FBS0MsVUFBVXhrQyxJQUN4QyxLQUFPc2tDLEVBQU1odEMsT0FBUyxHQUFHLENBQ3ZCLElBQUssSUFBSTVDLEVBQUksRUFBR0EsRUFBSTR2QyxFQUFNaHRDLE9BQVMsRUFBRzVDLElBQ3BDNHZDLEVBQU01dkMsR0FBSyxDQUNUeUksRUFBR21uQyxFQUFNNXZDLEdBQUd5SSxHQUFLbW5DLEVBQU01dkMsRUFBSSxHQUFHeUksRUFBSW1uQyxFQUFNNXZDLEdBQUd5SSxHQUFLeEgsRUFDaER5SCxFQUFHa25DLEVBQU01dkMsR0FBRzBJLEdBQUtrbkMsRUFBTTV2QyxFQUFJLEdBQUcwSSxFQUFJa25DLEVBQU01dkMsR0FBRzBJLEdBQUt6SCxRQUV4QixJQUFmMnVDLEVBQU01dkMsR0FBRzRPLElBQ2xCZ2hDLEVBQU01dkMsR0FBSzR2QyxFQUFNNXZDLEdBQUc0TyxHQUFLZ2hDLEVBQU01dkMsRUFBSSxHQUFHNE8sRUFBSWdoQyxFQUFNNXZDLEdBQUc0TyxHQUFLM04sR0FHNUQydUMsRUFBTTc5QixPQUFPNjlCLEVBQU1odEMsT0FBUyxFQUFHLEVBQ2pDLENBRUEsT0FEQWd0QyxFQUFNLEdBQUczdUMsRUFBSUEsRUFDTjJ1QyxFQUFNLEVBQ2YsRUFFQUcsa0JBQW1CLFNBQVU5dUMsRUFBR3FLLEVBQVEwa0MsRUFBUVYsR0FDOUMsTUFBTUUsRUFBSyxFQUFJdnVDLEVBQ2JKLEVBQUltdkMsRUFDSm51QyxFQUFJeUosRUFFTixJQUlFakwsRUFKRTR2QyxFQUFLcHZDLEVBQUUsR0FDVHF2QyxFQUFLcnZDLEVBQUUsR0FDUHN2QyxFQUFLdHZDLEVBQUUsR0FDUHV2QyxFQUFLdnZDLEVBQUUsR0FPVCxPQUhBb3ZDLEdBQU1ULEVBQ05VLEdBQU1qdkMsRUFFVyxJQUFiWSxFQUFFZSxRQUNKdkMsRUFBSTR2QyxFQUFLQyxFQUNGLENBQ0x6bkMsR0FBSXduQyxFQUFLcHVDLEVBQUUsR0FBRzRHLEVBQUl5bkMsRUFBS3J1QyxFQUFFLEdBQUc0RyxHQUFLcEksRUFDakNxSSxHQUFJdW5DLEVBQUtwdUMsRUFBRSxHQUFHNkcsRUFBSXduQyxFQUFLcnVDLEVBQUUsR0FBRzZHLEdBQUtySSxFQUNqQ3VPLElBQUkwZ0MsSUFBZVcsRUFBS3B1QyxFQUFFLEdBQUcrTSxFQUFJc2hDLEVBQUtydUMsRUFBRSxHQUFHK00sR0FBS3ZPLEVBQ2hEWSxFQUFHQSxLQUtQZ3ZDLEdBQU1ULEVBQ05VLEdBQU0sRUFBSVYsRUFDVlcsR0FBTWx2QyxFQUFJQSxFQUVPLElBQWJZLEVBQUVlLFFBQ0p2QyxFQUFJNHZDLEVBQUtDLEVBQUtDLEVBQ1AsQ0FDTDFuQyxHQUFJd25DLEVBQUtwdUMsRUFBRSxHQUFHNEcsRUFBSXluQyxFQUFLcnVDLEVBQUUsR0FBRzRHLEVBQUkwbkMsRUFBS3R1QyxFQUFFLEdBQUc0RyxHQUFLcEksRUFDL0NxSSxHQUFJdW5DLEVBQUtwdUMsRUFBRSxHQUFHNkcsRUFBSXduQyxFQUFLcnVDLEVBQUUsR0FBRzZHLEVBQUl5bkMsRUFBS3R1QyxFQUFFLEdBQUc2RyxHQUFLckksRUFDL0N1TyxJQUFJMGdDLElBQWVXLEVBQUtwdUMsRUFBRSxHQUFHK00sRUFBSXNoQyxFQUFLcnVDLEVBQUUsR0FBRytNLEVBQUl1aEMsRUFBS3R1QyxFQUFFLEdBQUcrTSxHQUFLdk8sRUFDOURZLEVBQUdBLEtBS1BndkMsR0FBTVQsRUFDTlUsR0FBTSxJQUFNVixFQUNaVyxHQUFNLEVBQUlYLEVBQ1ZZLEdBQU1udkMsRUFBSUEsRUFBSUEsRUFFRyxJQUFiWSxFQUFFZSxRQUNKdkMsRUFBSTR2QyxFQUFLQyxFQUFLQyxFQUFLQyxFQUNaLENBQ0wzbkMsR0FBSXduQyxFQUFLcHVDLEVBQUUsR0FBRzRHLEVBQUl5bkMsRUFBS3J1QyxFQUFFLEdBQUc0RyxFQUFJMG5DLEVBQUt0dUMsRUFBRSxHQUFHNEcsRUFBSTJuQyxFQUFLdnVDLEVBQUUsR0FBRzRHLEdBQUtwSSxFQUM3RHFJLEdBQUl1bkMsRUFBS3B1QyxFQUFFLEdBQUc2RyxFQUFJd25DLEVBQUtydUMsRUFBRSxHQUFHNkcsRUFBSXluQyxFQUFLdHVDLEVBQUUsR0FBRzZHLEVBQUkwbkMsRUFBS3Z1QyxFQUFFLEdBQUc2RyxHQUFLckksRUFDN0R1TyxJQUFJMGdDLElBRUNXLEVBQUtwdUMsRUFBRSxHQUFHK00sRUFBSXNoQyxFQUFLcnVDLEVBQUUsR0FBRytNLEVBQUl1aEMsRUFBS3R1QyxFQUFFLEdBQUcrTSxFQUFJd2hDLEVBQUt2dUMsRUFBRSxHQUFHK00sR0FBS3ZPLEVBQzlEWSxFQUFHQSxTQVJQLEdBV0YsRUFFQW92QyxPQUFRLFNBQVUva0MsRUFBUWdrQyxHQUN4QixNQUFNZ0IsRUFBVSxHQUNoQixJQUFLLElBQUl6dUMsRUFBSXlKLEVBQVFqTCxFQUFJd0IsRUFBRWUsT0FBUXhDLEVBQUlDLEVBQUksRUFBR0EsRUFBSSxFQUFHQSxJQUFLRCxJQUFLLENBQzdELE1BQU0yRyxFQUFPLEdBQ2IsSUFBSyxJQUFXd3BDLEVBQVB6c0MsRUFBSSxFQUFRQSxFQUFJMUQsRUFBRzBELElBQzFCeXNDLEVBQU0sQ0FDSjluQyxFQUFHckksR0FBS3lCLEVBQUVpQyxFQUFJLEdBQUcyRSxFQUFJNUcsRUFBRWlDLEdBQUcyRSxHQUMxQkMsRUFBR3RJLEdBQUt5QixFQUFFaUMsRUFBSSxHQUFHNEUsRUFBSTdHLEVBQUVpQyxHQUFHNEUsSUFFeEI0bUMsSUFDRmlCLEVBQUkzaEMsRUFBSXhPLEdBQUt5QixFQUFFaUMsRUFBSSxHQUFHOEssRUFBSS9NLEVBQUVpQyxHQUFHOEssSUFFakM3SCxFQUFLN0QsS0FBS3F0QyxHQUVaRCxFQUFRcHRDLEtBQUs2RCxHQUNibEYsRUFBSWtGLENBQ04sQ0FDQSxPQUFPdXBDLENBQ1QsRUFFQUUsUUFBUyxTQUFVamtDLEVBQUdwTSxFQUFHc3dDLEdBQ3ZCLE9BQ0d0d0MsR0FBS29NLEdBQUtBLEdBQUtra0MsR0FDaEJ6QixFQUFNMEIsY0FBY25rQyxFQUFHcE0sSUFDdkI2dUMsRUFBTTBCLGNBQWNua0MsRUFBR2trQyxFQUUzQixFQUVBQyxjQUFlLFNBQVU1UCxFQUFHbUksRUFBRzk2QixHQUM3QixPQUFPakMsRUFBSTQwQixFQUFJbUksS0FBTzk2QixHQXRQZCxLQXVQVixFQUVBdkwsT0FBUSxTQUFVd3NDLEdBQ2hCLE1BQ0UvUCxFQUFNMlAsRUFBTUMsUUFBUXJzQyxPQUV0QixJQUFJK3RDLEVBQU0sRUFFVixJQUFLLElBQVcxdkMsRUFBUGpCLEVBQUksRUFBTUEsRUFBSXEvQixFQUFLci9CLElBQzFCaUIsRUFOUSxHQU1BK3RDLEVBQU1DLFFBQVFqdkMsR0FOZCxHQU9SMndDLEdBQU8zQixFQUFNRSxRQUFRbHZDLEdBQUtndkMsRUFBTUcsTUFBTWx1QyxFQUFHbXVDLEdBRTNDLE1BVFUsR0FTQ3VCLENBQ2IsRUFFQTdwQyxJQUFLLFNBQVV5RixFQUFHcWtDLEVBQUlDLEVBQUlDLEVBQUlDLEdBSzVCLE9BQU9ELEdBRkF2a0MsRUFBSXFrQyxJQUZBQyxFQUFLRCxJQUNURyxFQUFLRCxFQUlkLEVBRUFFLEtBQU0sU0FBVW53QyxFQUFHb3dDLEVBQUlDLEdBQ3JCLE1BQU16QixFQUFNLENBQ1ZobkMsRUFBR3dvQyxFQUFHeG9DLEVBQUk1SCxHQUFLcXdDLEVBQUd6b0MsRUFBSXdvQyxFQUFHeG9DLEdBQ3pCQyxFQUFHdW9DLEVBQUd2b0MsRUFBSTdILEdBQUtxd0MsRUFBR3hvQyxFQUFJdW9DLEVBQUd2b0MsSUFLM0IsWUFIYWtiLElBQVRxdEIsRUFBR3JpQyxRQUE0QmdWLElBQVRzdEIsRUFBR3RpQyxJQUMzQjZnQyxFQUFJN2dDLEVBQUlxaUMsRUFBR3JpQyxFQUFJL04sR0FBS3F3QyxFQUFHdGlDLEVBQUlxaUMsRUFBR3JpQyxJQUV6QjZnQyxDQUNULEVBRUEwQixjQUFlLFNBQVV0dkMsR0FDdkIsSUFBSUMsRUFBSUQsRUFBRTRHLEVBQUksSUFBTTVHLEVBQUU2RyxFQUl0QixZQUhtQixJQUFSN0csRUFBRStNLElBQ1g5TSxHQUFLLElBQU1ELEVBQUUrTSxHQUVSOU0sQ0FDVCxFQUVBc3ZDLGVBQWdCLFNBQVU5bEMsR0FDeEIsTUFBTyxJQUFNQSxFQUFPeEUsSUFBSWtvQyxFQUFNbUMsZUFBZTdxQyxLQUFLLE1BQVEsR0FDNUQsRUFFQStxQyxLQUFNLFNBQVU5dUMsR0FDZCxPQUFPc3RDLEtBQUsvTSxNQUFNK00sS0FBS0MsVUFBVXZ0QyxHQUNuQyxFQUVBd0gsTUFBTyxTQUFVdkosRUFBR3l3QyxFQUFJQyxHQUN0QixNQUFNSSxFQUFNTCxFQUFHeG9DLEVBQUlqSSxFQUFFaUksRUFDbkI4b0MsRUFBTU4sRUFBR3ZvQyxFQUFJbEksRUFBRWtJLEVBQ2Y4b0MsRUFBTU4sRUFBR3pvQyxFQUFJakksRUFBRWlJLEVBQ2ZncEMsRUFBTVAsRUFBR3hvQyxFQUFJbEksRUFBRWtJLEVBR2pCLE9BQU95QyxFQUZHbW1DLEVBQU1HLEVBQU1GLEVBQU1DLEVBQ3BCRixFQUFNRSxFQUFNRCxFQUFNRSxFQUU1QixFQUdBdmlCLE1BQU8sU0FBVTNpQixFQUFHbE0sR0FDbEIsTUFBTXlCLEVBQUksR0FBS3lLLEVBQ1Q4NUIsRUFBTXZrQyxFQUFFNkUsUUFBUSxLQUN0QixPQUFPaUYsV0FBVzlKLEVBQUU0dkMsVUFBVSxFQUFHckwsRUFBTSxFQUFJaG1DLEdBQzdDLEVBRUFzeEMsS0FBTSxTQUFVM0csRUFBSUMsR0FDbEIsTUFBTXQrQixFQUFLcStCLEVBQUd2aUMsRUFBSXdpQyxFQUFHeGlDLEVBQ25CbUUsRUFBS28rQixFQUFHdGlDLEVBQUl1aUMsRUFBR3ZpQyxFQUNqQixPQUFPa0IsRUFBSytDLEVBQUtBLEVBQUtDLEVBQUtBLEVBQzdCLEVBRUFnbEMsUUFBUyxTQUFVQyxFQUFLN29DLEdBQ3RCLElBQ0U4b0MsRUFDQXp4QyxFQUZFMHhDLEVBQVFoa0MsRUFBSSxFQUFHLElBVW5CLE9BUEE4akMsRUFBSWpSLFNBQVEsU0FBVS8rQixFQUFHbXdDLEdBQ3ZCM3hDLEVBQUkydUMsRUFBTTJDLEtBQUszb0MsRUFBT25ILEdBQ2xCeEIsRUFBSTB4QyxJQUNOQSxFQUFRMXhDLEVBQ1J5eEMsRUFBT0UsRUFFWCxJQUNPLENBQUVELE1BQU9BLEVBQU9ELEtBQU1BLEVBQy9CLEVBRUFHLFNBQVUsU0FBVWh4QyxFQUFHTyxHQUVyQixHQUFVLElBQU5BLEdBQWlCLElBQU5BLEVBQ2IsT0FBTyxFQUVULFFBQWlCLElBQU5QLEVBQ1RBLEVBQUksUUFDQyxHQUFVLElBQU5BLEdBQWlCLElBQU5BLEVBQ3BCLE9BQU9BLEVBRVQsTUFBTWl4QyxFQUFTbmtDLEVBQUk5TSxFQUFHTyxHQUFLdU0sRUFBSSxFQUFJOU0sRUFBR08sR0FFdEMsT0FBTzBLLEdBRENnbUMsRUFBUyxHQUNBQSxFQUNuQixFQUVBQyxnQkFBaUIsU0FBVWx4QyxFQUFHTyxHQUU1QixHQUFVLElBQU5BLEdBQWlCLElBQU5BLEVBQ2IsT0FBTyxFQUVULFFBQWlCLElBQU5QLEVBQ1RBLEVBQUksUUFDQyxHQUFVLElBQU5BLEdBQWlCLElBQU5BLEVBQ3BCLE9BQU9BLEVBRVQsTUFBTXFqQixFQUFNdlcsRUFBSSxFQUFJOU0sRUFBR08sR0FFdkIsT0FBTzhpQixHQURJdlcsRUFBSTlNLEVBQUdPLEdBQUs4aUIsRUFFekIsRUFFQTh0QixLQUFNLFNBQVVweUIsRUFBSWtmLEVBQUlqZixFQUFJa2YsRUFBSWpmLEVBQUlteUIsRUFBSUMsRUFBSUMsR0FDMUMsTUFHRWx5QyxHQUFLMmYsRUFBS0MsSUFBT295QixFQUFLRSxJQUFPclQsRUFBS0MsSUFBT2pmLEVBQUtveUIsR0FDaEQsT0FBUyxHQUFManlDLEdBR0csQ0FBRW9JLElBTkp1WCxFQUFLbWYsRUFBS0QsRUFBS2pmLElBQU9DLEVBQUtveUIsSUFBT3R5QixFQUFLQyxJQUFPQyxFQUFLcXlCLEVBQUtGLEVBQUtDLElBTWpEanlDLEVBQUdxSSxJQUxac1gsRUFBS21mLEVBQUtELEVBQUtqZixJQUFPb3lCLEVBQUtFLElBQU9yVCxFQUFLQyxJQUFPamYsRUFBS3F5QixFQUFLRixFQUFLQyxJQUt6Q2p5QyxFQUM5QixFQUVBbXlDLEtBQU0sU0FBVXhILEVBQUlDLEVBQUl3SCxFQUFJQyxHQUMxQixNQUFNMXlCLEVBQUtnckIsRUFBR3ZpQyxFQUNaeTJCLEVBQUs4TCxFQUFHdGlDLEVBQ1J1WCxFQUFLZ3JCLEVBQUd4aUMsRUFDUjAyQixFQUFLOEwsRUFBR3ZpQyxFQUNSd1gsRUFBS3V5QixFQUFHaHFDLEVBQ1I0cEMsRUFBS0ksRUFBRy9wQyxFQUNSNHBDLEVBQUtJLEVBQUdqcUMsRUFDUjhwQyxFQUFLRyxFQUFHaHFDLEVBQ1YsT0FBT3NtQyxFQUFNb0QsS0FBS3B5QixFQUFJa2YsRUFBSWpmLEVBQUlrZixFQUFJamYsRUFBSW15QixFQUFJQyxFQUFJQyxFQUNoRCxFQUVBSSxJQUFLLFNBQVUxQixFQUFJQyxHQUNqQixPQUFPbEMsRUFBTXdELEtBQUt2QixFQUFJQSxFQUFHN3dDLEVBQUc4d0MsRUFBSUEsRUFBRzl3QyxFQUNyQyxFQUVBd3lDLFNBQVUsU0FBVTVILEVBQUlDLEdBQ3RCLE9BQU8sSUFBSTRILEVBQ1Q3SCxFQUFHdmlDLEVBQ0h1aUMsRUFBR3RpQyxHQUNGc2lDLEVBQUd2aUMsRUFBSXdpQyxFQUFHeGlDLEdBQUssR0FDZnVpQyxFQUFHdGlDLEVBQUl1aUMsRUFBR3ZpQyxHQUFLLEVBQ2hCdWlDLEVBQUd4aUMsRUFDSHdpQyxFQUFHdmlDLEVBRVAsRUFFQW9xQyxTQUFVLFNBQVU1a0IsR0FDbEIsSUFBSTZrQixFQUFLcEUsRUFDUHFFLEVBQUtyRSxFQUNMc0UsRUFBS3BFLEVBQ0xxRSxFQUFLckUsRUFRUCxPQVBBM2dCLEVBQVMwUyxTQUFRLFNBQVU5K0IsR0FDekIsTUFBTXF4QyxFQUFPcnhDLEVBQUVxeEMsT0FDWEosRUFBS0ksRUFBSzFxQyxFQUFFMUQsTUFBS2d1QyxFQUFLSSxFQUFLMXFDLEVBQUUxRCxLQUM3Qml1QyxFQUFLRyxFQUFLenFDLEVBQUUzRCxNQUFLaXVDLEVBQUtHLEVBQUt6cUMsRUFBRTNELEtBQzdCa3VDLEVBQUtFLEVBQUsxcUMsRUFBRXpELE1BQUtpdUMsRUFBS0UsRUFBSzFxQyxFQUFFekQsS0FDN0JrdUMsRUFBS0MsRUFBS3pxQyxFQUFFMUQsTUFBS2t1QyxFQUFLQyxFQUFLenFDLEVBQUUxRCxJQUNuQyxJQUNPLENBQ0x5RCxFQUFHLENBQUUxRCxJQUFLZ3VDLEVBQUlLLEtBQU1MLEVBQUtFLEdBQU0sRUFBR2p1QyxJQUFLaXVDLEVBQUkvWixLQUFNK1osRUFBS0YsR0FDdERycUMsRUFBRyxDQUFFM0QsSUFBS2l1QyxFQUFJSSxLQUFNSixFQUFLRSxHQUFNLEVBQUdsdUMsSUFBS2t1QyxFQUFJaGEsS0FBTWdhLEVBQUtGLEdBRTFELEVBRUFLLG1CQUFvQixTQUNsQnZNLEVBQ0F3TSxFQUNBdk0sRUFDQXdNLEVBQ0FDLEdBRUEsSUFBS3hFLEVBQU15RSxZQUFZSCxFQUFPQyxHQUFRLE1BQU8sR0FDN0MsTUFBTUcsRUFBZ0IsR0FDaEJDLEVBQUssQ0FBQzdNLEVBQUc4TSxTQUFVOU0sRUFBRytNLFFBQVMvTSxFQUFHZ04sS0FBTWhOLEVBQUdpTixRQUMzQ0MsRUFBSyxDQUFDak4sRUFBRzZNLFNBQVU3TSxFQUFHOE0sUUFBUzlNLEVBQUcrTSxLQUFNL00sRUFBR2dOLFFBZWpELE9BZEFKLEVBQUcvUyxTQUFRLFNBQVVxVCxHQUNmQSxFQUFHQyxTQUNQRixFQUFHcFQsU0FBUSxTQUFVdVQsR0FDbkIsR0FBSUEsRUFBR0QsUUFBUyxPQUNoQixNQUFNRSxFQUFNSCxFQUFHekksV0FBVzJJLEVBQUlYLEdBQzFCWSxFQUFJeHhDLE9BQVMsSUFDZnd4QyxFQUFJQyxHQUFLSixFQUNURyxFQUFJRSxHQUFLSCxFQUNUQyxFQUFJdE4sR0FBS0EsRUFDVHNOLEVBQUlyTixHQUFLQSxFQUNUMk0sRUFBY3h3QyxLQUFLa3hDLEdBRXZCLEdBQ0YsSUFDT1YsQ0FDVCxFQUVBYSxVQUFXLFNBQVVWLEVBQVNDLEVBQU1OLEdBQ2xDLE1BQU1nQixFQUFNVixFQUFLeG9DLE9BQU8xSSxPQUNsQjZ4QyxFQUFNWixFQUFRdm9DLE9BQU8xSSxPQUNyQjhzQixFQUFRc2YsRUFBTTRELFNBQVNrQixFQUFLeG9DLE9BQU9rcEMsRUFBTSxHQUFJWCxFQUFRdm9DLE9BQU8sSUFDNURoSSxFQUFNMHJDLEVBQU00RCxTQUFTaUIsRUFBUXZvQyxPQUFPbXBDLEVBQU0sR0FBSVgsRUFBS3hvQyxPQUFPLElBQzFEb3BDLEVBQVEsQ0FDWmQsU0FBVWxrQixFQUNWbWtCLFFBQVNBLEVBQ1RDLEtBQU1BLEVBQ05DLE9BQVF6d0MsRUFDUjZ2QyxLQUFNbkUsRUFBTThELFNBQVMsQ0FBQ3BqQixFQUFPbWtCLEVBQVNDLEVBQU14d0MsSUFFOUNveEMsY0FBc0IsU0FBVTNOLEdBQzlCLE9BQU9pSSxFQUFNcUUsbUJBQ1hxQixFQUNBQSxFQUFNdkIsS0FDTnBNLEVBQ0FBLEVBQUdvTSxLQUNISyxFQUVKLEdBQ0EsT0FBT2tCLENBQ1QsRUFFQUMsVUFBVyxTQUFVQyxFQUFPdjBDLEVBQUcwRyxHQUM3QixJQUFLQSxFQUFNLE1BQU8sQ0FBRWhDLElBQUssRUFBR0MsSUFBSyxHQUNqQyxJQUVFL0QsRUFDQWIsRUFIRTJFLEVBQU00cEMsRUFDUjNwQyxFQUFNNnBDLEdBR2lCLElBQXJCOW5DLEVBQUtKLFFBQVEsS0FDZkksRUFBTyxDQUFDLEdBQUdmLE9BQU9lLEtBRUssSUFBckJBLEVBQUtKLFFBQVEsSUFDZkksRUFBSzdELEtBQUssR0FFWixJQUFLLElBQUlsRCxFQUFJLEVBQUdxL0IsRUFBTXQ0QixFQUFLbkUsT0FBUTVDLEVBQUlxL0IsRUFBS3IvQixJQUMxQ2lCLEVBQUk4RixFQUFLL0csR0FDVEksRUFBSXcwQyxFQUFNaDBDLElBQUlLLEdBQ1ZiLEVBQUVDLEdBQUswRSxJQUNUQSxFQUFNM0UsRUFBRUMsSUFFTkQsRUFBRUMsR0FBSzJFLElBQ1RBLEVBQU01RSxFQUFFQyxJQUdaLE1BQU8sQ0FBRTBFLElBQUtBLEVBQUtxdUMsS0FBTXJ1QyxFQUFNQyxHQUFPLEVBQUdBLElBQUtBLEVBQUtrMEIsS0FBTWwwQixFQUFNRCxFQUNqRSxFQUVBOHZDLE1BQU8sU0FBVXZwQyxFQUFReTZCLEdBQ3ZCLE1BQU0rTyxFQUFLL08sRUFBS2lGLEdBQUd2aUMsRUFDakJzc0MsRUFBS2hQLEVBQUtpRixHQUFHdGlDLEVBQ2JvNEIsR0FBSzMxQixFQUFNNDZCLEVBQUtrRixHQUFHdmlDLEVBQUlxc0MsRUFBSWhQLEVBQUtrRixHQUFHeGlDLEVBQUlxc0MsR0FPekMsT0FBT3hwQyxFQUFPeEUsS0FOUixTQUFVeUYsR0FDWixNQUFPLENBQ0w5RCxHQUFJOEQsRUFBRTlELEVBQUlxc0MsR0FBTTdxQyxFQUFJNjJCLElBQU12MEIsRUFBRTdELEVBQUlxc0MsR0FBTTdxQyxFQUFJNDJCLEdBQzFDcDRCLEdBQUk2RCxFQUFFOUQsRUFBSXFzQyxHQUFNNXFDLEVBQUk0MkIsSUFBTXYwQixFQUFFN0QsRUFBSXFzQyxHQUFNOXFDLEVBQUk2MkIsR0FFOUMsR0FFSixFQUVBa1UsTUFBTyxTQUFVMXBDLEVBQVF5NkIsR0FDdkJBLEVBQU9BLEdBQVEsQ0FBRWlGLEdBQUksQ0FBRXZpQyxFQUFHLEVBQUdDLEVBQUcsR0FBS3VpQyxHQUFJLENBQUV4aUMsRUFBRyxFQUFHQyxFQUFHLElBRXBELE1BQU02bUMsRUFBUWprQyxFQUFPMUksT0FBUyxFQUN4QnF5QyxFQUFVakcsRUFBTTZGLE1BQU12cEMsRUFBUXk2QixHQUM5Qm1QLEVBQVMsU0FBVWowQyxHQUN2QixPQUFPLEdBQUtBLEdBQUtBLEdBQUssQ0FDeEIsRUFFQSxHQUFjLElBQVZzdUMsRUFBYSxDQUNmLE1BQU16TyxFQUFJbVUsRUFBUSxHQUFHdnNDLEVBQ25CdWdDLEVBQUlnTSxFQUFRLEdBQUd2c0MsRUFDZnRJLEVBQUk2MEMsRUFBUSxHQUFHdnNDLEVBQ2ZySSxFQUFJeWdDLEVBQUksRUFBSW1JLEVBQUk3b0MsRUFDbEIsR0FBVSxJQUFOQyxFQUFTLENBQ1gsTUFBTTgwQyxHQUFNdnJDLEVBQUtxL0IsRUFBSUEsRUFBSW5JLEVBQUkxZ0MsR0FDM0JnMUMsR0FBTXRVLEVBQUltSSxFQUdaLE1BQU8sR0FGRWtNLEVBQUtDLEdBQU0vMEMsS0FDVjgwQyxFQUFLQyxHQUFNLzBDLEdBQ0wrUixPQUFPOGlDLEVBQ3pCLENBQU8sT0FBSWpNLElBQU03b0MsR0FBVyxJQUFOQyxFQUNiLEVBQUUsRUFBSTRvQyxFQUFJN29DLElBQU0sRUFBSTZvQyxFQUFJLEVBQUk3b0MsSUFBSWdTLE9BQU84aUMsR0FFekMsRUFDVCxDQUdBLE1BQU1HLEVBQUtKLEVBQVEsR0FBR3ZzQyxFQUNwQjRzQyxFQUFLTCxFQUFRLEdBQUd2c0MsRUFDaEI2c0MsRUFBS04sRUFBUSxHQUFHdnNDLEVBR2xCLElBQUlySSxFQUFVLEVBQUlpMUMsRUFBVEQsRUFBYyxFQUFJRSxFQUZwQk4sRUFBUSxHQUFHdnNDLEVBR2hCbzRCLEVBQUksRUFBSXVVLEVBQUssRUFBSUMsRUFBSyxFQUFJQyxFQUMxQnRNLEdBQUssRUFBSW9NLEVBQUssRUFBSUMsRUFDbEJsMUMsRUFBSWkxQyxFQUVOLEdBQUlyRyxFQUFNMEIsY0FBY3J3QyxFQUFHLEdBQUksQ0FFN0IsR0FBSTJ1QyxFQUFNMEIsY0FBYzVQLEVBQUcsR0FFekIsT0FBSWtPLEVBQU0wQixjQUFjekgsRUFBRyxHQUVsQixHQUdGLEVBQUU3b0MsRUFBSTZvQyxHQUFHNzJCLE9BQU84aUMsR0FHekIsTUFBTTVLLEVBQUkxZ0MsRUFBS3EvQixFQUFJQSxFQUFJLEVBQUluSSxFQUFJMWdDLEdBQzdCNHpDLEVBQUssRUFBSWxULEVBQ1gsTUFBTyxFQUFFd0osRUFBSXJCLEdBQUsrSyxJQUFNL0ssRUFBSXFCLEdBQUswSixHQUFJNWhDLE9BQU84aUMsRUFDOUMsQ0FJQXBVLEdBQUt6Z0MsRUFDTDRvQyxHQUFLNW9DLEVBQ0xELEdBQUtDLEVBRUwsTUFBTXdCLEdBQUssRUFBSW9uQyxFQUFJbkksRUFBSUEsR0FBSyxFQUMxQjJSLEVBQUs1d0MsRUFBSSxFQUNUeW9DLEdBQUssRUFBSXhKLEVBQUlBLEVBQUlBLEVBQUksRUFBSUEsRUFBSW1JLEVBQUksR0FBSzdvQyxHQUFLLEdBQzNDd3JDLEVBQUt0QixFQUFJLEVBQ1RrTCxFQUFlNUosRUFBS0EsRUFBSzZHLEVBQUtBLEVBQUtBLEVBRXJDLElBQUlnRCxFQUFJeEUsRUFBSWp4QixFQUFJQyxFQUFJQyxFQUNwQixHQUFJczFCLEVBQWUsRUFBRyxDQUNwQixNQUFNRSxHQUFPN3pDLEVBQUksRUFFZmhCLEVBQUkrSSxFQURHOHJDLEVBQU1BLEVBQU1BLEdBRW5CejBDLEdBQUtxcEMsR0FBSyxFQUFJenBDLEdBRWQ4MEMsRUFBTXRuQyxFQURHcE4sR0FBSyxHQUFLLEVBQUlBLEVBQUksRUFBSSxFQUFJQSxHQUduQzIwQyxFQUFLLEVBREVySCxFQUFJMXRDLEdBS2IsT0FIQW1mLEVBQUs0MUIsRUFBSzNyQyxFQUFJMHJDLEVBQU0sR0FBSzdVLEVBQUksRUFDN0I3Z0IsRUFBSzIxQixFQUFLM3JDLEdBQUswckMsRUFBTWxILEdBQU8sR0FBSzNOLEVBQUksRUFDckM1Z0IsRUFBSzAxQixFQUFLM3JDLEdBQUswckMsRUFBTSxFQUFJbEgsR0FBTyxHQUFLM04sRUFBSSxFQUNsQyxDQUFDOWdCLEVBQUlDLEVBQUlDLEdBQUk5TixPQUFPOGlDLEVBQzdCLENBQU8sR0FBcUIsSUFBakJNLEVBSVQsT0FIQUMsRUFBSzdKLEVBQUssRUFBSTJDLEdBQUszQyxJQUFPMkMsRUFBSTNDLEdBQzlCNXJCLEVBQUssRUFBSXkxQixFQUFLM1UsRUFBSSxFQUNsQjdnQixHQUFNdzFCLEVBQUszVSxFQUFJLEVBQ1IsQ0FBQzlnQixFQUFJQyxHQUFJN04sT0FBTzhpQyxHQUNsQixDQUNMLE1BQU1XLEVBQUtqc0MsRUFBSzRyQyxHQUdoQixPQUZBQyxFQUFLbEgsR0FBSzNDLEVBQUtpSyxHQUNmNUUsRUFBSzFDLEVBQUkzQyxFQUFLaUssR0FDUCxDQUFDSixFQUFLeEUsRUFBS25RLEVBQUksR0FBRzF1QixPQUFPOGlDLEVBQ2xDLENBQ0YsRUFFQVksT0FBUSxTQUFVajBDLEdBRWhCLEdBQWlCLElBQWJBLEVBQUVlLE9BQWMsQ0FDbEIsTUFBTWsrQixFQUFJai9CLEVBQUUsR0FDVm9uQyxFQUFJcG5DLEVBQUUsR0FDTnpCLEVBQUl5QixFQUFFLEdBQ054QixFQUFJeWdDLEVBQUksRUFBSW1JLEVBQUk3b0MsRUFDbEIsR0FBVSxJQUFOQyxFQUFTLENBQ1gsTUFBTTgwQyxHQUFNdnJDLEVBQUtxL0IsRUFBSUEsRUFBSW5JLEVBQUkxZ0MsR0FDM0JnMUMsR0FBTXRVLEVBQUltSSxFQUdaLE1BQU8sR0FGRWtNLEVBQUtDLEdBQU0vMEMsS0FDVjgwQyxFQUFLQyxHQUFNLzBDLEVBRXZCLENBQU8sT0FBSTRvQyxJQUFNN29DLEdBQVcsSUFBTkMsRUFDYixFQUFFLEVBQUk0b0MsRUFBSTdvQyxJQUFNLEdBQUs2b0MsRUFBSTdvQyxLQUUzQixFQUNULENBR0EsR0FBaUIsSUFBYnlCLEVBQUVlLE9BQWMsQ0FDbEIsTUFBTWsrQixFQUFJai9CLEVBQUUsR0FDVm9uQyxFQUFJcG5DLEVBQUUsR0FDUixPQUFJaS9CLElBQU1tSSxFQUNELENBQUNuSSxHQUFLQSxFQUFJbUksSUFFWixFQUNULENBRUEsTUFBTyxFQUNULEVBRUE4TSxVQUFXLFNBQVU5MEMsRUFBRyswQyxFQUFJQyxFQUFJM0csRUFBSzRHLEdBQ25DLElBQUlDLEVBQ0ZDLEVBQ0FDLEVBQ0FDLEVBQ0EzbkMsRUFBSSxFQUNKOU4sRUFBSSxFQWtCTixNQUFNUixFQUFJMnVDLEVBQU1LLFFBQVFwdUMsRUFBRyswQyxHQUNyQk8sRUFBS3ZILEVBQU1LLFFBQVFwdUMsRUFBR2cxQyxHQUN0Qk8sRUFBUW4yQyxFQUFFb0ksRUFBSXBJLEVBQUVvSSxFQUFJcEksRUFBRXFJLEVBQUlySSxFQUFFcUksRUFjbEMsR0FaSTRtQyxHQUNGNkcsRUFBTXZzQyxFQUNKbUUsRUFBSTFOLEVBQUVxSSxFQUFJNnRDLEVBQUczbkMsRUFBSTJuQyxFQUFHN3RDLEVBQUlySSxFQUFFdU8sRUFBRyxHQUMzQmIsRUFBSTFOLEVBQUV1TyxFQUFJMm5DLEVBQUc5dEMsRUFBSTh0QyxFQUFHM25DLEVBQUl2TyxFQUFFb0ksRUFBRyxHQUM3QnNGLEVBQUkxTixFQUFFb0ksRUFBSTh0QyxFQUFHN3RDLEVBQUk2dEMsRUFBRzl0QyxFQUFJcEksRUFBRXFJLEVBQUcsSUFFakMwdEMsRUFBTXJvQyxFQUFJeW9DLEVBQVFuMkMsRUFBRXVPLEVBQUl2TyxFQUFFdU8sRUFBRyxPQUU3QnVuQyxFQUFNOTFDLEVBQUVvSSxFQUFJOHRDLEVBQUc3dEMsRUFBSXJJLEVBQUVxSSxFQUFJNnRDLEVBQUc5dEMsRUFDNUIydEMsRUFBTXJvQyxFQUFJeW9DLEVBQU8sTUFHUCxJQUFSTCxHQUFxQixJQUFSQyxFQUNmLE1BQU8sQ0FBRXpuQyxFQUFHLEVBQUc5TixFQUFHLEdBVXBCLEdBUEE4TixFQUFJd25DLEVBQU1DLEVBQ1Z2MUMsRUFBSXUxQyxFQUFNRCxHQU1MRCxFQUFPLENBR1YsTUFBTU8sRUFBS3pILEVBQU0rRyxVQUFVOTBDLEVBQUksS0FBTyswQyxFQUFJQyxFQUFJM0csR0FBSyxHQUFNM2dDLEVBQ25EK25DLEVBQUsxSCxFQUFNK0csVUFBVTkwQyxFQUFJLEtBQU8rMEMsRUFBSUMsRUFBSTNHLEdBQUssR0FBTTNnQyxFQUN6RDJuQyxHQUFNSSxFQUFLL25DLEdBQUtBLEVBQUk4bkMsSUFBTyxFQUMzQkosR0FBT25xQyxFQUFJd3FDLEVBQUsvbkMsR0FBS3pDLEVBQUl5QyxFQUFJOG5DLElBQU8sQ0FDdEMsQ0FFQSxNQUFPLENBQUU5bkMsRUFBR0EsRUFBRzlOLEVBQUdBLEVBQUd5MUMsR0FBSUEsRUFBSUQsSUFBS0EsRUFDcEMsRUFFQU0sWUFBYSxTQUFVcnJDLEdBQ3JCLEdBQUlBLEVBQU8xSSxPQUFTLEVBQUcsTUFBTyxHQUk5QixNQUFNZixFQUFJbXRDLEVBQU02RixNQUFNdnBDLEVBQVEsQ0FBRTAvQixHQUFJMS9CLEVBQU8sR0FBSTIvQixHQUFJMy9CLEVBQU85SCxPQUFPLEdBQUcsS0FDbEVzOUIsRUFBSWovQixFQUFFLEdBQUc0RyxFQUFJNUcsRUFBRSxHQUFHNkcsRUFDbEJ1Z0MsRUFBSXBuQyxFQUFFLEdBQUc0RyxFQUFJNUcsRUFBRSxHQUFHNkcsRUFDbEJ0SSxFQUFJeUIsRUFBRSxHQUFHNEcsRUFBSTVHLEVBQUUsR0FBRzZHLEVBRWxCdW9DLEVBQUssS0FBTyxFQUFJblEsRUFBSSxFQUFJbUksRUFBSSxFQUFJN29DLEVBRDVCeUIsRUFBRSxHQUFHNEcsRUFBSTVHLEVBQUUsR0FBRzZHLEdBRWxCd29DLEVBQUssSUFBTSxFQUFJcFEsRUFBSW1JLEVBQUksRUFBSTdvQyxHQUMzQncyQyxFQUFLLElBQU14MkMsRUFBSTBnQyxHQUVqQixHQUFJa08sRUFBTTBCLGNBQWNPLEVBQUksR0FBSSxDQUM5QixJQUFLakMsRUFBTTBCLGNBQWNRLEVBQUksR0FBSSxDQUMvQixJQUFJandDLEdBQUsyMUMsRUFBSzFGLEVBQ2QsR0FBSSxHQUFLandDLEdBQUtBLEdBQUssRUFBRyxNQUFPLENBQUNBLEVBQ2hDLENBQ0EsTUFBTyxFQUNULENBRUEsTUFBTTQxQyxFQUFNM0YsRUFBS0EsRUFBSyxFQUFJRCxFQUFLMkYsRUFDN0JFLEVBQUsveUMsS0FBSzZGLEtBQUtpdEMsR0FDZlosRUFBSyxFQUFJaEYsRUFFWCxPQUFJakMsRUFBTTBCLGNBQWN1RixFQUFJLEdBQVcsR0FFaEMsRUFBRWEsRUFBSzVGLEdBQU0rRSxJQUFNL0UsRUFBSzRGLEdBQU1iLEdBQUk3akMsUUFBTyxTQUFVdlIsR0FDeEQsT0FBTyxHQUFLQSxHQUFLQSxHQUFLLENBQ3hCLEdBQ0YsRUFFQTR5QyxZQUFhLFNBQVVzRCxFQUFJQyxHQUN6QixNQUFNQyxFQUFPLENBQUMsSUFBSyxLQUNqQjVYLEVBQU00WCxFQUFLcjBDLE9BRWIsSUFBSyxJQUFXczBDLEVBQUtqM0MsRUFBR2dCLEVBQUdaLEVBQWxCTCxFQUFJLEVBQWlCQSxFQUFJcS9CLEVBQUtyL0IsSUFLckMsR0FKQWszQyxFQUFNRCxFQUFLajNDLEdBQ1hDLEVBQUk4MkMsRUFBR0csR0FBSzlELElBQ1pueUMsRUFBSSsxQyxFQUFHRSxHQUFLOUQsSUFDWi95QyxHQUFLMDJDLEVBQUdHLEdBQUtoZSxLQUFPOGQsRUFBR0UsR0FBS2hlLE1BQVEsRUFDaENodEIsRUFBSWpNLEVBQUlnQixJQUFNWixFQUFHLE9BQU8sRUFFOUIsT0FBTyxDQUNULEVBRUE4MkMsVUFBVyxTQUFVaEUsRUFBTWlFLEdBQ3JCQSxFQUFNM3VDLEVBQUUxRCxJQUFNb3VDLEVBQUsxcUMsRUFBRTFELE1BQ3ZCb3VDLEVBQUsxcUMsRUFBRTFELElBQU1xeUMsRUFBTTN1QyxFQUFFMUQsS0FFbkJxeUMsRUFBTTF1QyxFQUFFM0QsSUFBTW91QyxFQUFLenFDLEVBQUUzRCxNQUN2Qm91QyxFQUFLenFDLEVBQUUzRCxJQUFNcXlDLEVBQU0xdUMsRUFBRTNELEtBRW5CcXlDLEVBQU14b0MsR0FBS3dvQyxFQUFNeG9DLEVBQUU3SixJQUFNb3VDLEVBQUt2a0MsRUFBRTdKLE1BQ2xDb3VDLEVBQUt2a0MsRUFBRTdKLElBQU1xeUMsRUFBTXhvQyxFQUFFN0osS0FFbkJxeUMsRUFBTTN1QyxFQUFFekQsSUFBTW11QyxFQUFLMXFDLEVBQUV6RCxNQUN2Qm11QyxFQUFLMXFDLEVBQUV6RCxJQUFNb3lDLEVBQU0zdUMsRUFBRXpELEtBRW5Cb3lDLEVBQU0xdUMsRUFBRTFELElBQU1tdUMsRUFBS3pxQyxFQUFFMUQsTUFDdkJtdUMsRUFBS3pxQyxFQUFFMUQsSUFBTW95QyxFQUFNMXVDLEVBQUUxRCxLQUVuQm95QyxFQUFNeG9DLEdBQUt3b0MsRUFBTXhvQyxFQUFFNUosSUFBTW11QyxFQUFLdmtDLEVBQUU1SixNQUNsQ211QyxFQUFLdmtDLEVBQUU1SixJQUFNb3lDLEVBQU14b0MsRUFBRTVKLEtBRXZCbXVDLEVBQUsxcUMsRUFBRTJxQyxLQUFPRCxFQUFLMXFDLEVBQUUxRCxJQUFNb3VDLEVBQUsxcUMsRUFBRXpELEtBQU8sRUFDekNtdUMsRUFBS3pxQyxFQUFFMHFDLEtBQU9ELEVBQUt6cUMsRUFBRTNELElBQU1vdUMsRUFBS3pxQyxFQUFFMUQsS0FBTyxFQUNyQ211QyxFQUFLdmtDLElBQ1B1a0MsRUFBS3ZrQyxFQUFFd2tDLEtBQU9ELEVBQUt2a0MsRUFBRTdKLElBQU1vdUMsRUFBS3ZrQyxFQUFFNUosS0FBTyxHQUUzQ211QyxFQUFLMXFDLEVBQUV5d0IsS0FBT2lhLEVBQUsxcUMsRUFBRXpELElBQU1tdUMsRUFBSzFxQyxFQUFFMUQsSUFDbENvdUMsRUFBS3pxQyxFQUFFd3dCLEtBQU9pYSxFQUFLenFDLEVBQUUxRCxJQUFNbXVDLEVBQUt6cUMsRUFBRTNELElBQzlCb3VDLEVBQUt2a0MsSUFDUHVrQyxFQUFLdmtDLEVBQUVzcUIsS0FBT2lhLEVBQUt2a0MsRUFBRTVKLElBQU1tdUMsRUFBS3ZrQyxFQUFFN0osSUFFdEMsRUFFQXN5QyxjQUFlLFNBQVVoRCxFQUFJQyxFQUFJZCxHQUMvQixNQUFNOEQsRUFBTWpELEVBQUdsQixPQUNib0UsRUFBTWpELEVBQUduQixPQUNUdHlDLEVBQUksSUFDSjIyQyxFQUFZaEUsR0FBOEIsR0FFNUMsR0FDRThELEVBQUk3dUMsRUFBRXl3QixLQUFPb2UsRUFBSTV1QyxFQUFFd3dCLEtBQU9zZSxHQUMxQkQsRUFBSTl1QyxFQUFFeXdCLEtBQU9xZSxFQUFJN3VDLEVBQUV3d0IsS0FBT3NlLEVBRTFCLE1BQU8sRUFDRjMyQyxHQUFLd3pDLEVBQUdvRCxJQUFNcEQsRUFBR3FELEtBQVEsRUFBSyxHQUFLNzJDLEVBQ3BDLEtBQ0dBLEdBQUt5ekMsRUFBR21ELElBQU1uRCxFQUFHb0QsS0FBUSxFQUFLLEdBQUs3MkMsR0FJNUMsSUFBSTgyQyxFQUFNdEQsRUFBRzl3QyxNQUFNLElBQ2pCcTBDLEVBQU10RCxFQUFHL3dDLE1BQU0sSUFDZmlWLEVBQVEsQ0FDTixDQUFFNEwsS0FBTXV6QixFQUFJdnpCLEtBQU15ekIsTUFBT0QsRUFBSXh6QixNQUM3QixDQUFFQSxLQUFNdXpCLEVBQUl2ekIsS0FBTXl6QixNQUFPRCxFQUFJQyxPQUM3QixDQUFFenpCLEtBQU11ekIsRUFBSUUsTUFBT0EsTUFBT0QsRUFBSUMsT0FDOUIsQ0FBRXp6QixLQUFNdXpCLEVBQUlFLE1BQU9BLE1BQU9ELEVBQUl4ekIsT0FHbEM1TCxFQUFRQSxFQUFNcEcsUUFBTyxTQUFVcUcsR0FDN0IsT0FBT3UyQixFQUFNeUUsWUFBWWg3QixFQUFLMkwsS0FBSyt1QixPQUFRMTZCLEVBQUtvL0IsTUFBTTFFLE9BQ3hELElBRUEsSUFBSTJFLEVBQVUsR0FFZCxPQUFxQixJQUFqQnQvQixFQUFNNVYsU0FFVjRWLEVBQU1vb0IsU0FBUSxTQUFVbm9CLEdBQ3RCcS9CLEVBQVVBLEVBQVE5eEMsT0FDaEJncEMsRUFBTXFJLGNBQWM1K0IsRUFBSzJMLEtBQU0zTCxFQUFLby9CLE1BQU9MLEdBRS9DLElBRUFNLEVBQVVBLEVBQVExbEMsUUFBTyxTQUFVN0YsRUFBR3ZNLEdBQ3BDLE9BQU84M0MsRUFBUW54QyxRQUFRNEYsS0FBT3ZNLENBQ2hDLEtBVitCODNDLENBYWpDLEVBRUFDLFdBQVksU0FBVS9NLEVBQUlDLEVBQUl3SCxHQUM1QixNQUFNbkIsRUFBTXJHLEVBQUd4aUMsRUFBSXVpQyxFQUFHdmlDLEVBQ3BCOG9DLEVBQU10RyxFQUFHdmlDLEVBQUlzaUMsRUFBR3RpQyxFQUNoQjhvQyxFQUFNaUIsRUFBR2hxQyxFQUFJd2lDLEVBQUd4aUMsRUFDaEJncEMsRUFBTWdCLEVBQUcvcEMsRUFBSXVpQyxFQUFHdmlDLEVBQ2hCc3ZDLEVBQU8xRyxFQUFNcm5DLEVBQUl5a0MsR0FBUzZDLEVBQU1ybkMsRUFBSXdrQyxHQUNwQ3VKLEVBQU8zRyxFQUFNcG5DLEVBQUl3a0MsR0FBUzZDLEVBQU10bkMsRUFBSXlrQyxHQUNwQ3dKLEVBQU8xRyxFQUFNdm5DLEVBQUl5a0MsR0FBUytDLEVBQU12bkMsRUFBSXdrQyxHQUNwQ3lKLEVBQU8zRyxFQUFNdG5DLEVBQUl3a0MsR0FBUytDLEVBQU14bkMsRUFBSXlrQyxHQUVwQzBKLEdBQU9wTixFQUFHdmlDLEVBQUl3aUMsRUFBR3hpQyxHQUFLLEVBQ3RCNHZDLEdBQU9yTixFQUFHdGlDLEVBQUl1aUMsRUFBR3ZpQyxHQUFLLEVBQ3RCNHZDLEdBQU9yTixFQUFHeGlDLEVBQUlncUMsRUFBR2hxQyxHQUFLLEVBQ3RCOHZDLEdBQU90TixFQUFHdmlDLEVBQUkrcEMsRUFBRy9wQyxHQUFLLEVBRXRCOHZDLEVBQU9KLEVBQU1KLEVBQ2JTLEVBQU9KLEVBQU1KLEVBQ2JTLEVBQU9KLEVBQU1KLEVBQ2JTLEVBQU9KLEVBQU1KLEVBRWJ4b0IsRUFBTXFmLEVBQU1vRCxLQUFLZ0csRUFBS0MsRUFBS0csRUFBTUMsRUFBTUgsRUFBS0MsRUFBS0csRUFBTUMsR0FDdkQ5M0MsRUFBSW11QyxFQUFNMkMsS0FBS2hpQixFQUFLcWIsR0FHdEIsSUFHRTROLEVBSEU5MkMsRUFBSXFKLEVBQU02L0IsRUFBR3RpQyxFQUFJaW5CLEVBQUlqbkIsRUFBR3NpQyxFQUFHdmlDLEVBQUlrbkIsRUFBSWxuQixHQUNyQ3RJLEVBQUlnTCxFQUFNOC9CLEVBQUd2aUMsRUFBSWluQixFQUFJam5CLEVBQUd1aUMsRUFBR3hpQyxFQUFJa25CLEVBQUlsbkIsR0FDbkNKLEVBQUk4QyxFQUFNc25DLEVBQUcvcEMsRUFBSWluQixFQUFJam5CLEVBQUcrcEMsRUFBR2hxQyxFQUFJa25CLEVBQUlsbkIsR0FnQ3JDLE9BNUJJM0csRUFBSXVHLElBSUZ2RyxFQUFJM0IsR0FBS0EsRUFBSWtJLEtBQ2Z2RyxHQUFLMnNDLEdBRUgzc0MsRUFBSXVHLElBQ051d0MsRUFBSXZ3QyxFQUNKQSxFQUFJdkcsRUFDSkEsRUFBSTgyQyxJQU1GdndDLEVBQUlsSSxHQUFLQSxFQUFJMkIsR0FDZjgyQyxFQUFJdndDLEVBQ0pBLEVBQUl2RyxFQUNKQSxFQUFJODJDLEdBRUp2d0MsR0FBS29tQyxFQUlUOWUsRUFBSTd0QixFQUFJQSxFQUNSNnRCLEVBQUl0bkIsRUFBSUEsRUFDUnNuQixFQUFJOXVCLEVBQUlBLEVBQ0Q4dUIsQ0FDVCxFQUVBa3BCLFdBQVksU0FBVS9YLEVBQUdtSSxHQUN2QixPQUFPbkksRUFBSW1JLENBQ2IsR0FPRixNQUFNNlAsRUFDSi8xQyxZQUFZZzJDLEdBQ1YxWCxLQUFLMFgsT0FBUyxHQUNkMVgsS0FBS2lPLEtBQU0sRUFDTHlKLElBQ0oxWCxLQUFLMFgsT0FBU0EsRUFDZDFYLEtBQUtpTyxJQUFNak8sS0FBSzBYLE9BQU8sR0FBR3pKLElBRTlCLENBRUEwSixVQUNFLE9BQU8zWCxLQUFLMzhCLFVBQ2QsQ0FFQUEsV0FDRSxNQUNFLElBQ0EyOEIsS0FBSzBYLE9BQ0ZqeUMsS0FBSSxTQUFVOHRDLEdBQ2IsT0FBTzVGLEVBQU1vQyxlQUFld0QsRUFBTXRwQyxPQUNwQyxJQUNDaEYsS0FBSyxNQUNSLEdBRUosQ0FFQTJ5QyxTQUFTckUsR0FDUHZULEtBQUswWCxPQUFPNzFDLEtBQUsweEMsR0FDakJ2VCxLQUFLaU8sSUFBTWpPLEtBQUtpTyxLQUFPc0YsRUFBTXRGLEdBQy9CLENBRUExc0MsU0FDRSxPQUFPeStCLEtBQUswWCxPQUNUanlDLEtBQUksU0FBVXlGLEdBQ2IsT0FBT0EsRUFBRTNKLFFBQ1gsSUFDQ3N5QyxRQUFPLFNBQVVwVSxFQUFHbUksR0FDbkIsT0FBT25JLEVBQUltSSxDQUNiLEdBQ0osQ0FFQTJMLE1BQU01QyxHQUNKLE9BQU8zUSxLQUFLMFgsT0FBTy9HLEVBQ3JCLENBRUFtQixPQUNFLE1BQU0veUMsRUFBSWloQyxLQUFLMFgsT0FFZixJQURBLElBQUk1RixFQUFPL3lDLEVBQUUsR0FBRyt5QyxPQUNQbnpDLEVBQUksRUFBR0EsRUFBSUksRUFBRXdDLE9BQVE1QyxJQUM1Qmd2QyxFQUFNbUksVUFBVWhFLEVBQU0veUMsRUFBRUosR0FBR216QyxRQUU3QixPQUFPQSxDQUNULENBRUFyN0IsT0FBT3pYLEdBQ0wsTUFBTXlYLEVBQVMsR0FJZixPQUhBdXBCLEtBQUswWCxPQUFPblksU0FBUSxTQUFVcjBCLEdBQzVCdUwsRUFBTzVVLFFBQVFxSixFQUFFdUwsT0FBT3pYLEdBQzFCLElBQ08sSUFBSXk0QyxFQUFXaGhDLEVBQ3hCLEVBWUYsTUFBUTVMLElBQUtndEMsRUFBSyxJQUFFbjBDLEVBQUcsSUFBRUMsRUFBS2lGLElBQUtrdkMsRUFBT2p2QyxJQUFLa3ZDLEVBQU8vcUMsS0FBTWdyQyxFQUFRenZDLEtBQU0wdkMsR0FBV3YxQyxLQUMvRXcxQyxFQUFPeDFDLEtBQUt5YyxHQU9sQixNQUFNcXlCLEVBQ0o5dkMsWUFBWXkyQyxHQUNWLElBQUkzeEMsRUFDRjJ4QyxHQUFVQSxFQUFPNVksUUFBVTRZLEVBQVN2ekMsTUFBTXd6QyxLQUFLOTJDLFdBQVdhLFFBQ3hEazJDLEdBQVcsRUFFZixHQUF1QixpQkFBWjd4QyxFQUFLLEdBQWlCLENBQy9CNnhDLEVBQVc3eEMsRUFBS2pGLE9BQ2hCLE1BQU0rMkMsRUFBVSxHQUNoQjl4QyxFQUFLKzRCLFNBQVEsU0FBVTUzQixHQUNyQixDQUFDLElBQUssSUFBSyxLQUFLNDNCLFNBQVEsU0FBVXZnQyxRQUNSLElBQWIySSxFQUFNM0ksSUFDZnM1QyxFQUFRejJDLEtBQUs4RixFQUFNM0ksR0FFdkIsR0FDRixJQUNBd0gsRUFBTzh4QyxDQUNULENBRUEsSUFBSUMsR0FBUyxFQUNiLE1BQU12YSxFQUFNeDNCLEVBQUtqRixPQUVqQixHQUFJODJDLEdBQ0YsR0FBSUEsRUFBVyxFQUFHLENBQ2hCLEdBQXlCLElBQXJCLzJDLFVBQVVDLE9BQ1osTUFBTSxJQUFJMCtCLE1BQ1Isd0VBR0pzWSxHQUFTLENBQ1gsT0FFQSxHQUFZLElBQVJ2YSxHQUFxQixJQUFSQSxHQUFxQixJQUFSQSxHQUFxQixLQUFSQSxHQUNoQixJQUFyQjE4QixVQUFVQyxPQUNaLE1BQU0sSUFBSTArQixNQUNSLHdFQU1SLE1BQU1nTyxFQUFPak8sS0FBS2lPLEtBQ2RzSyxJQUFtQixJQUFSdmEsR0FBcUIsS0FBUkEsSUFDekJtYSxHQUFVQSxFQUFPLFNBQTZCLElBQWhCQSxFQUFPLEdBQUc1cUMsRUFFckN0RCxFQUFVKzFCLEtBQUsvMUIsT0FBUyxHQUM5QixJQUFLLElBQUkwbUMsRUFBTSxFQUFHNkgsRUFBT3ZLLEVBQU0sRUFBSSxFQUFHMEMsRUFBTTNTLEVBQUsyUyxHQUFPNkgsRUFBTSxDQUM1RCxJQUFJN3dDLEVBQVEsQ0FDVlAsRUFBR1osRUFBS21xQyxHQUNSdHBDLEVBQUdiLEVBQUttcUMsRUFBTSxJQUVaMUMsSUFDRnRtQyxFQUFNNEYsRUFBSS9HLEVBQUttcUMsRUFBTSxJQUV2QjFtQyxFQUFPcEksS0FBSzhGLEVBQ2QsQ0FDQSxNQUFNdW1DLEVBQVNsTyxLQUFLa08sTUFBUWprQyxFQUFPMUksT0FBUyxFQUV0Q3EwQyxFQUFRNVYsS0FBSzRWLEtBQU8sQ0FBQyxJQUFLLEtBQzVCM0gsR0FBSzJILEVBQUsvekMsS0FBSyxLQUNuQm0rQixLQUFLeVksT0FBUzdDLEVBQUtyMEMsT0FHbkIsTUFBTXF5QyxFQUFVakcsRUFBTTZGLE1BQU12cEMsRUFBUSxDQUFFMC9CLEdBQUkxL0IsRUFBTyxHQUFJMi9CLEdBQUkzL0IsRUFBT2lrQyxLQUMxRHdLLEVBQWEvSyxFQUFNMkMsS0FBS3JtQyxFQUFPLEdBQUlBLEVBQU9pa0MsSUFDaERsTyxLQUFLMlksUUFBVS9FLEVBQVFDLFFBQU8sQ0FBQ2owQyxFQUFHWSxJQUFNWixFQUFJaTRDLEVBQU1yM0MsRUFBRTZHLElBQUksR0FBS3F4QyxFQUFhLEdBRTFFMVksS0FBSzRZLEtBQU8sR0FFWjVZLEtBQUtvVyxJQUFNLEVBQ1hwVyxLQUFLcVcsSUFBTSxFQUNYclcsS0FBSzE0QixRQUNQLENBRUF1eEMsMkJBQTJCbFAsRUFBSUMsRUFBSXdILEVBQUl4eEMsR0FLckMsUUFKaUIsSUFBTkEsSUFDVEEsRUFBSSxJQUdJLElBQU5BLEVBQ0YsT0FBTyxJQUFJNHhDLEVBQU81SCxFQUFJQSxFQUFJd0gsR0FFNUIsR0FBVSxJQUFOeHhDLEVBQ0YsT0FBTyxJQUFJNHhDLEVBQU83SCxFQUFJQyxFQUFJQSxHQUc1QixNQUFNa1AsRUFBTXRILEVBQU91SCxPQUFPLEVBQUdwUCxFQUFJQyxFQUFJd0gsRUFBSXh4QyxHQUN6QyxPQUFPLElBQUk0eEMsRUFBTzdILEVBQUltUCxFQUFJRSxFQUFHNUgsRUFDL0IsQ0FFQXlILHVCQUF1QkksRUFBR0MsRUFBR0MsRUFBR3Y1QyxFQUFHKzBDLFFBQ2hCLElBQU4vMEMsSUFDVEEsRUFBSSxJQUVOLE1BQU1rNUMsRUFBTXRILEVBQU91SCxPQUFPLEVBQUdFLEVBQUdDLEVBQUdDLEVBQUd2NUMsUUFDcEIsSUFBUCswQyxJQUNUQSxFQUFLaEgsRUFBTTJDLEtBQUs0SSxFQUFHSixFQUFJTSxJQUV6QixNQUFNeEUsRUFBTUQsR0FBTSxFQUFJLzBDLEdBQU1BLEVBRXRCeTVDLEVBQVExTCxFQUFNMkMsS0FBSzJJLEVBQUdFLEdBQzFCMWMsR0FBTTBjLEVBQUUveEMsRUFBSTZ4QyxFQUFFN3hDLEdBQUtpeUMsRUFDbkIzYyxHQUFNeWMsRUFBRTl4QyxFQUFJNHhDLEVBQUU1eEMsR0FBS2d5QyxFQUNuQkMsRUFBTTNFLEVBQUtsWSxFQUNYOGMsRUFBTTVFLEVBQUtqWSxFQUNYOGMsRUFBTTVFLEVBQUtuWSxFQUNYZ2QsRUFBTTdFLEVBQUtsWSxFQUVQZ2QsRUFBVVIsRUFBRTl4QyxFQUFJa3lDLEVBQWhCSSxFQUF3QlIsRUFBRTd4QyxFQUFJa3lDLEVBQ2xDSSxFQUFVVCxFQUFFOXhDLEVBQUlveUMsRUFBaEJHLEVBQXdCVCxFQUFFN3hDLEVBQUlveUMsRUFDOUJULEVBQUlGLEVBQUlFLEVBQ1JwSixFQUFVb0osRUFBRTV4QyxHQUFLc3lDLEVBQU9WLEVBQUU1eEMsSUFBTSxFQUFJeEgsR0FBcENnd0MsRUFBMkNvSixFQUFFM3hDLEdBQUtxeUMsRUFBT1YsRUFBRTN4QyxJQUFNLEVBQUl6SCxHQUNyRWl3QyxFQUFVbUosRUFBRTV4QyxHQUFLdXlDLEVBQU9YLEVBQUU1eEMsR0FBS3hILEVBQS9CaXdDLEVBQXFDbUosRUFBRTN4QyxHQUFLc3lDLEVBQU9YLEVBQUUzeEMsR0FBS3pILEVBQzFEZzZDLEVBQU0sQ0FBRXh5QyxFQUFHNnhDLEVBQUU3eEMsR0FBS3dvQyxFQUFPcUosRUFBRTd4QyxHQUFLeEgsRUFBR3lILEVBQUc0eEMsRUFBRTV4QyxHQUFLdW9DLEVBQU9xSixFQUFFNXhDLEdBQUt6SCxHQUMzRGk2QyxFQUFNLENBQ0p6eUMsRUFBRyt4QyxFQUFFL3hDLEdBQUt5b0MsRUFBT3NKLEVBQUUveEMsSUFBTSxFQUFJeEgsR0FDN0J5SCxFQUFHOHhDLEVBQUU5eEMsR0FBS3dvQyxFQUFPc0osRUFBRTl4QyxJQUFNLEVBQUl6SCxJQUdqQyxPQUFPLElBQUk0eEMsRUFBT3lILEVBQUdXLEVBQUtDLEVBQUtWLEVBQ2pDLENBRUFOLGtCQUNFLE9BQU9sTCxDQUNULENBRUFtTSxXQUNFLE9BQU90SSxFQUFPc0ksVUFDaEIsQ0FFV3JDLHdCQUNULE9BQU9BLENBQ1QsQ0FFQUUsVUFDRSxPQUFPM1gsS0FBSzM4QixVQUNkLENBRUFBLFdBQ0UsT0FBT3NxQyxFQUFNb0MsZUFBZS9QLEtBQUsvMUIsT0FDbkMsQ0FFQTh2QyxRQUNFLEdBQUkvWixLQUFLaU8sSUFBSyxPQUFPLEVBQ3JCLE1BQU16dEMsRUFBSXcvQixLQUFLLzFCLE9BR2J4SixFQUFJLENBQUMsSUFGREQsRUFBRSxHQUFHNEcsRUFDTDVHLEVBQUUsR0FBRzZHLEVBQ3NCLElBQWYyNEIsS0FBS2tPLE1BQWMsSUFBTSxLQUMzQyxJQUFLLElBQUl2dkMsRUFBSSxFQUFHcTdDLEVBQU94NUMsRUFBRWUsT0FBUTVDLEVBQUlxN0MsRUFBTXI3QyxJQUN6QzhCLEVBQUVvQixLQUFLckIsRUFBRTdCLEdBQUd5SSxHQUNaM0csRUFBRW9CLEtBQUtyQixFQUFFN0IsR0FBRzBJLEdBRWQsT0FBTzVHLEVBQUV3RSxLQUFLLElBQ2hCLENBRUFnMUMsVUFBVXRMLEdBQ1IsR0FBSUEsRUFBT3B0QyxTQUFXeStCLEtBQUsvMUIsT0FBTzFJLE9BQ2hDLE1BQU0sSUFBSTArQixNQUFNLG9DQUVsQkQsS0FBSzJPLE9BQVNBLEVBQ2QzTyxLQUFLNFksS0FBTyxFQUNkLENBRUFzQixTQUNFLE1BQU1DLEVBQVFuYSxLQUFLb2EsY0FDZkQsSUFBVW5hLEtBQUtxYSxTQUNqQnJhLEtBQUtxYSxPQUFTRixFQUNkbmEsS0FBSzE0QixTQUVULENBRUE4eUMsY0FDRSxPQUFPcGEsS0FBSy8xQixPQUNUeEUsS0FBSSxTQUFVMUcsRUFBR2ltQyxHQUNoQixNQUFPLEdBQUtBLEVBQU1qbUMsRUFBRXFJLEVBQUlySSxFQUFFc0ksR0FBS3RJLEVBQUV3TyxFQUFJeE8sRUFBRXdPLEVBQUksRUFDN0MsSUFDQ3RJLEtBQUssR0FDVixDQUVBcUMsU0FFRTA0QixLQUFLNFksS0FBTyxHQUNaNVksS0FBS2lQLFFBQVV0QixFQUFNcUIsT0FBT2hQLEtBQUsvMUIsT0FBUSsxQixLQUFLaU8sS0FDOUNqTyxLQUFLc2Esa0JBQ1AsQ0FFQUEsbUJBQ0UsTUFBTXJ3QyxFQUFTKzFCLEtBQUsvMUIsT0FDZHZCLEVBQVFpbEMsRUFBTWpsQyxNQUFNdUIsRUFBTyxHQUFJQSxFQUFPKzFCLEtBQUtrTyxPQUFRamtDLEVBQU8sSUFDaEUrMUIsS0FBS3VhLFVBQVk3eEMsRUFBUSxDQUMzQixDQUVBbkgsU0FDRSxPQUFPb3NDLEVBQU1wc0MsT0FBT3krQixLQUFLd2EsV0FBV3Q2QyxLQUFLOC9CLE1BQzNDLENBRUE2WSxjQUFjM0ssRUFBUSxFQUFHK0ssRUFBR0MsRUFBR0MsRUFBR3Y1QyxFQUFJLElBQ3BDLE1BQU1tckMsRUFBSTRDLEVBQU1tRCxnQkFBZ0JseEMsRUFBR3N1QyxHQUNqQ3VNLEVBQUssRUFBSTFQLEVBQ1RxTyxFQUFJLENBQ0ZoeUMsRUFBRzJqQyxFQUFJa08sRUFBRTd4QyxFQUFJcXpDLEVBQUt0QixFQUFFL3hDLEVBQ3BCQyxFQUFHMGpDLEVBQUlrTyxFQUFFNXhDLEVBQUlvekMsRUFBS3RCLEVBQUU5eEMsR0FFdEI1RyxFQUFJa3RDLEVBQU1pRCxTQUFTaHhDLEVBQUdzdUMsR0FLeEIsTUFBTyxDQUFFOEssRUFKSCxDQUNGNXhDLEVBQUc4eEMsRUFBRTl4QyxHQUFLOHhDLEVBQUU5eEMsRUFBSWd5QyxFQUFFaHlDLEdBQUszRyxFQUN2QjRHLEVBQUc2eEMsRUFBRTd4QyxHQUFLNnhDLEVBQUU3eEMsRUFBSSt4QyxFQUFFL3hDLEdBQUs1RyxHQUVmeTRDLElBQUdFLElBQUdILElBQUdFLElBQ3ZCLENBRUFKLE9BQU9uNUMsRUFBR3M1QyxHQUNSQSxFQUFJQSxHQUFLbFosS0FBS3pnQyxJQUFJSyxHQUNsQixJQUFJcTVDLEVBQUlqWixLQUFLLzFCLE9BQU8sR0FDaEJrdkMsRUFBSW5aLEtBQUsvMUIsT0FBTysxQixLQUFLa08sT0FDekIsT0FBT3NELEVBQU91SCxPQUFPL1ksS0FBS2tPLE1BQU8rSyxFQUFHQyxFQUFHQyxFQUFHdjVDLEVBQzVDLENBRUE4NkMsT0FBT0MsR0FHTCxHQUZBM2EsS0FBS2thLFNBQ0xTLEVBQVFBLEdBQVMsSUFDYjNhLEtBQUs0WSxLQUFLcjNDLFNBQVdvNUMsRUFDdkIsT0FBTzNhLEtBQUs0WSxLQUVkNVksS0FBSzRZLEtBQU8sR0FFWitCLElBQ0EzYSxLQUFLNFksS0FBTyxHQUNaLElBQUssSUFBV3A0QyxFQUFHWixFQUFWakIsRUFBSSxFQUFTQSxFQUFJZzhDLEVBQU9oOEMsSUFDL0JpQixFQUFJakIsR0FBS2c4QyxFQUFRLEdBQ2pCbjZDLEVBQUl3L0IsS0FBS2dPLFFBQVFwdUMsR0FDakJZLEVBQUVaLEVBQUlBLEVBQ05vZ0MsS0FBSzRZLEtBQUsvMkMsS0FBS3JCLEdBRWpCLE9BQU93L0IsS0FBSzRZLElBQ2QsQ0FFQTlxQyxHQUFHbkcsRUFBT2l6QyxHQUNSQSxFQUFRQSxHQUFTLEVBQ2pCLE1BQU1DLEVBQU03YSxLQUFLMGEsU0FDZkksRUFBTyxHQUNULElBQUssSUFBVy83QyxFQUFQSixFQUFJLEVBQU1pQixFQUFJLEVBQUdqQixFQUFJazhDLEVBQUl0NUMsT0FBUTVDLElBQ3hDSSxFQUFJODdDLEVBQUlsOEMsR0FDSmd2QyxFQUFNMkMsS0FBS3Z4QyxFQUFHNEksR0FBU2l6QyxJQUN6QkUsRUFBS2o1QyxLQUFLOUMsR0FDVmEsR0FBS2pCLEVBQUlrOEMsRUFBSXQ1QyxRQUdqQixRQUFLdTVDLEVBQUt2NUMsU0FDRjNCLEdBQUtrN0MsRUFBS3Y1QyxPQUNwQixDQUVBdzVDLFFBQVFwekMsR0FFTixNQUFNNm9DLEVBQU14USxLQUFLMGEsU0FDZjk3QyxFQUFJNHhDLEVBQUlqdkMsT0FBUyxFQUNqQmd2QyxFQUFVNUMsRUFBTTRDLFFBQVFDLEVBQUs3b0MsR0FDN0I4b0MsRUFBT0YsRUFBUUUsS0FDZjhELEdBQU05RCxFQUFPLEdBQUs3eEMsRUFDbEIwdkMsR0FBTW1DLEVBQU8sR0FBSzd4QyxFQUNsQjQ1QyxFQUFPLEdBQU01NUMsRUFHZixJQUdFNEIsRUFFT3hCLEVBTEwweEMsRUFBUUgsRUFBUUcsTUFDbEI5d0MsRUFBSTIwQyxFQUNKeUcsRUFBS3A3QyxFQUdQLElBREE4d0MsR0FBUyxFQUNHOXdDLEVBQUkwdUMsRUFBS2tLLEVBQU01NEMsR0FBSzQ0QyxFQUM5Qmg0QyxFQUFJdy9CLEtBQUtnTyxRQUFRcHVDLEdBQ2pCWixFQUFJMnVDLEVBQU0yQyxLQUFLM29DLEVBQU9uSCxHQUNsQnhCLEVBQUkweEMsSUFDTkEsRUFBUTF4QyxFQUNSZzhDLEVBQUtwN0MsR0FPVCxPQUpBbzdDLEVBQUtBLEVBQUssRUFBSSxFQUFJQSxFQUFLLEVBQUksRUFBSUEsRUFDL0J4NkMsRUFBSXcvQixLQUFLZ08sUUFBUWdOLEdBQ2pCeDZDLEVBQUVaLEVBQUlvN0MsRUFDTng2QyxFQUFFeEIsRUFBSTB4QyxFQUNDbHdDLENBQ1QsQ0FFQWpCLElBQUlLLEdBQ0YsT0FBT29nQyxLQUFLZ08sUUFBUXB1QyxFQUN0QixDQUVBK0gsTUFBTWdwQyxHQUNKLE9BQU8zUSxLQUFLLzFCLE9BQU8wbUMsRUFDckIsQ0FFQTNDLFFBQVFwdUMsR0FDTixPQUFJb2dDLEtBQUsyTyxPQUNBaEIsRUFBTWUsa0JBQWtCOXVDLEVBQUdvZ0MsS0FBSy8xQixPQUFRKzFCLEtBQUsyTyxPQUFRM08sS0FBS2lPLEtBRTVETixFQUFNSyxRQUFRcHVDLEVBQUdvZ0MsS0FBSy8xQixPQUFRKzFCLEtBQUtpTyxJQUFLak8sS0FBSzJPLE9BQ3RELENBRUFzTSxRQUNFLE1BQU16NkMsRUFBSXcvQixLQUFLLzFCLE9BQ2JpeEMsRUFBSyxDQUFDMTZDLEVBQUUsSUFDUjhNLEVBQUk5TSxFQUFFZSxPQUNSLElBQUssSUFBVzRyQyxFQUFJZ08sRUFBWHg4QyxFQUFJLEVBQVlBLEVBQUkyTyxFQUFHM08sSUFDOUJ3dUMsRUFBSzNzQyxFQUFFN0IsR0FDUHc4QyxFQUFNMzZDLEVBQUU3QixFQUFJLEdBQ1p1OEMsRUFBR3Y4QyxHQUFLLENBQ055SSxHQUFLa0csRUFBSTNPLEdBQUsyTyxFQUFLNi9CLEVBQUcvbEMsRUFBS3pJLEVBQUkyTyxFQUFLNnRDLEVBQUkvekMsRUFDeENDLEdBQUtpRyxFQUFJM08sR0FBSzJPLEVBQUs2L0IsRUFBRzlsQyxFQUFLMUksRUFBSTJPLEVBQUs2dEMsRUFBSTl6QyxHQUk1QyxPQURBNnpDLEVBQUc1dEMsR0FBSzlNLEVBQUU4TSxFQUFJLEdBQ1AsSUFBSWtrQyxFQUFPMEosRUFDcEIsQ0FFQVYsV0FBVzU2QyxHQUNULE9BQU8rdEMsRUFBTUssUUFBUXB1QyxFQUFHb2dDLEtBQUtpUCxRQUFRLEdBQUlqUCxLQUFLaU8sSUFDaEQsQ0FFQW1OLFlBQVl4N0MsR0FDVixPQUFPK3RDLEVBQU1LLFFBQVFwdUMsRUFBR29nQyxLQUFLaVAsUUFBUSxHQUFJalAsS0FBS2lPLElBQ2hELENBRUF1RixRQUNFLElBQUloekMsRUFBSXcvQixLQUFLLzFCLE9BQ2IsT0FBTyxJQUFJdW5DLEVBQU83RCxFQUFNNkYsTUFBTWh6QyxFQUFHLENBQUVtcEMsR0FBSW5wQyxFQUFFLEdBQUlvcEMsR0FBSXBwQyxFQUFFQSxFQUFFZSxPQUFTLEtBQ2hFLENBRUFtekMsVUFBVTkwQyxHQUNSLE9BQU8rdEMsRUFBTStHLFVBQVU5MEMsRUFBR29nQyxLQUFLaVAsUUFBUSxHQUFJalAsS0FBS2lQLFFBQVEsR0FBSWpQLEtBQUtpTyxJQUNuRSxDQUVBcUgsY0FDRSxPQUFPM0gsRUFBTTJILFlBQVl0VixLQUFLLzFCLE9BQ2hDLENBRUFzTyxPQUFPM1ksR0FDTCxPQUFPb2dDLEtBQUtpTyxJQUFNak8sS0FBS3FiLFVBQVV6N0MsR0FBS29nQyxLQUFLc2IsVUFBVTE3QyxFQUN2RCxDQUVBMDdDLFVBQVUxN0MsR0FDUixNQUFNWixFQUFJZ2hDLEtBQUt3YSxXQUFXNTZDLEdBQ3BCcXBDLEVBQUlnUCxFQUFPajVDLEVBQUVvSSxFQUFJcEksRUFBRW9JLEVBQUlwSSxFQUFFcUksRUFBSXJJLEVBQUVxSSxHQUNyQyxNQUFPLENBQUVELEdBQUlwSSxFQUFFcUksRUFBSTRoQyxFQUFHNWhDLEVBQUdySSxFQUFFb0ksRUFBSTZoQyxFQUNqQyxDQUVBb1MsVUFBVXo3QyxHQUVSLE1BQU1nL0IsRUFBS29CLEtBQUt3YSxXQUFXNTZDLEdBQ3pCaS9CLEVBQUttQixLQUFLd2EsV0FBVzU2QyxFQUFJLEtBQ3pCMHFDLEVBQUsyTixFQUFPclosRUFBR3gzQixFQUFJdzNCLEVBQUd4M0IsRUFBSXczQixFQUFHdjNCLEVBQUl1M0IsRUFBR3YzQixFQUFJdTNCLEVBQUdyeEIsRUFBSXF4QixFQUFHcnhCLEdBQ2xEZzlCLEVBQUswTixFQUFPcFosRUFBR3ozQixFQUFJeTNCLEVBQUd6M0IsRUFBSXkzQixFQUFHeDNCLEVBQUl3M0IsRUFBR3gzQixFQUFJdzNCLEVBQUd0eEIsRUFBSXN4QixFQUFHdHhCLEdBQ3BEcXhCLEVBQUd4M0IsR0FBS2tqQyxFQUNSMUwsRUFBR3YzQixHQUFLaWpDLEVBQ1IxTCxFQUFHcnhCLEdBQUsrOEIsRUFDUnpMLEVBQUd6M0IsR0FBS21qQyxFQUNSMUwsRUFBR3gzQixHQUFLa2pDLEVBQ1IxTCxFQUFHdHhCLEdBQUtnOUIsRUFFUixNQUFNeHJDLEVBQUksQ0FDUnFJLEVBQUd5M0IsRUFBR3gzQixFQUFJdTNCLEVBQUdyeEIsRUFBSXN4QixFQUFHdHhCLEVBQUlxeEIsRUFBR3YzQixFQUMzQkEsRUFBR3czQixFQUFHdHhCLEVBQUlxeEIsRUFBR3gzQixFQUFJeTNCLEVBQUd6M0IsRUFBSXczQixFQUFHcnhCLEVBQzNCQSxFQUFHc3hCLEVBQUd6M0IsRUFBSXczQixFQUFHdjNCLEVBQUl3M0IsRUFBR3gzQixFQUFJdTNCLEVBQUd4M0IsR0FFdkJ0SSxFQUFJbTVDLEVBQU9sNUMsRUFBRXFJLEVBQUlySSxFQUFFcUksRUFBSXJJLEVBQUVzSSxFQUFJdEksRUFBRXNJLEVBQUl0SSxFQUFFd08sRUFBSXhPLEVBQUV3TyxHQUNqRHhPLEVBQUVxSSxHQUFLdEksRUFDUEMsRUFBRXNJLEdBQUt2SSxFQUNQQyxFQUFFd08sR0FBS3pPLEVBRVAsTUFBTXk4QyxFQUFJLENBQ1J4OEMsRUFBRXFJLEVBQUlySSxFQUFFcUksRUFDUnJJLEVBQUVxSSxFQUFJckksRUFBRXNJLEVBQUl0SSxFQUFFd08sRUFDZHhPLEVBQUVxSSxFQUFJckksRUFBRXdPLEVBQUl4TyxFQUFFc0ksRUFDZHRJLEVBQUVxSSxFQUFJckksRUFBRXNJLEVBQUl0SSxFQUFFd08sRUFDZHhPLEVBQUVzSSxFQUFJdEksRUFBRXNJLEVBQ1J0SSxFQUFFc0ksRUFBSXRJLEVBQUV3TyxFQUFJeE8sRUFBRXFJLEVBQ2RySSxFQUFFcUksRUFBSXJJLEVBQUV3TyxFQUFJeE8sRUFBRXNJLEVBQ2R0SSxFQUFFc0ksRUFBSXRJLEVBQUV3TyxFQUFJeE8sRUFBRXFJLEVBQ2RySSxFQUFFd08sRUFBSXhPLEVBQUV3TyxHQVFWLE1BTFUsQ0FDUm5HLEVBQUdtMEMsRUFBRSxHQUFLM2MsRUFBR3gzQixFQUFJbTBDLEVBQUUsR0FBSzNjLEVBQUd2M0IsRUFBSWswQyxFQUFFLEdBQUszYyxFQUFHcnhCLEVBQ3pDbEcsRUFBR2swQyxFQUFFLEdBQUszYyxFQUFHeDNCLEVBQUltMEMsRUFBRSxHQUFLM2MsRUFBR3YzQixFQUFJazBDLEVBQUUsR0FBSzNjLEVBQUdyeEIsRUFDekNBLEVBQUdndUMsRUFBRSxHQUFLM2MsRUFBR3gzQixFQUFJbTBDLEVBQUUsR0FBSzNjLEVBQUd2M0IsRUFBSWswQyxFQUFFLEdBQUszYyxFQUFHcnhCLEVBRzdDLENBRUFFLEtBQUs3TixHQUNILElBQUlZLEVBQUl3L0IsS0FBSy8xQixPQUNYdXhDLEVBQUssR0FDTHZTLEVBQUksR0FDSjBILEVBQU0sRUFRUixJQVBBMUgsRUFBRTBILEtBQVNud0MsRUFBRSxHQUNieW9DLEVBQUUwSCxLQUFTbndDLEVBQUUsR0FDYnlvQyxFQUFFMEgsS0FBU253QyxFQUFFLEdBQ00sSUFBZncvQixLQUFLa08sUUFDUGpGLEVBQUUwSCxLQUFTbndDLEVBQUUsSUFHUkEsRUFBRWUsT0FBUyxHQUFHLENBQ25CaTZDLEVBQUssR0FDTCxJQUFLLElBQVdDLEVBQVA5OEMsRUFBSSxFQUFPQyxFQUFJNEIsRUFBRWUsT0FBUyxFQUFHNUMsRUFBSUMsRUFBR0QsSUFDM0M4OEMsRUFBSzlOLEVBQU1nQyxLQUFLL3ZDLEVBQUdZLEVBQUU3QixHQUFJNkIsRUFBRTdCLEVBQUksSUFDL0JzcUMsRUFBRTBILEtBQVM4SyxFQUNYRCxFQUFHMzVDLEtBQUs0NUMsR0FFVmo3QyxFQUFJZzdDLENBQ04sQ0FDQSxPQUFPdlMsQ0FDVCxDQUVBL21DLE1BQU1xeUMsRUFBSWpHLEdBRVIsR0FBVyxJQUFQaUcsR0FBY2pHLEVBQ2hCLE9BQU90TyxLQUFLOTlCLE1BQU1vc0MsR0FBSXZyQixLQUV4QixHQUFXLElBQVB1ckIsRUFDRixPQUFPdE8sS0FBSzk5QixNQUFNcXlDLEdBQUlpQyxNQUl4QixNQUFNdk4sRUFBSWpKLEtBQUt2eUIsS0FBSzhtQyxHQUNkeHVDLEVBQVMsQ0FDYmdkLEtBQ2lCLElBQWZpZCxLQUFLa08sTUFDRCxJQUFJc0QsRUFBTyxDQUFDdkksRUFBRSxHQUFJQSxFQUFFLEdBQUlBLEVBQUUsS0FDMUIsSUFBSXVJLEVBQU8sQ0FBQ3ZJLEVBQUUsR0FBSUEsRUFBRSxHQUFJQSxFQUFFLEdBQUlBLEVBQUUsS0FDdEN1TixNQUNpQixJQUFmeFcsS0FBS2tPLE1BQ0QsSUFBSXNELEVBQU8sQ0FBQ3ZJLEVBQUUsR0FBSUEsRUFBRSxHQUFJQSxFQUFFLEtBQzFCLElBQUl1SSxFQUFPLENBQUN2SSxFQUFFLEdBQUlBLEVBQUUsR0FBSUEsRUFBRSxHQUFJQSxFQUFFLEtBQ3RDeVMsS0FBTXpTLEdBVVIsT0FOQWxqQyxFQUFPZ2QsS0FBS3F6QixJQUFNekksRUFBTWxvQyxJQUFJLEVBQUcsRUFBRyxFQUFHdTZCLEtBQUtvVyxJQUFLcFcsS0FBS3FXLEtBQ3BEdHdDLEVBQU9nZCxLQUFLc3pCLElBQU0xSSxFQUFNbG9DLElBQUk4dUMsRUFBSSxFQUFHLEVBQUd2VSxLQUFLb1csSUFBS3BXLEtBQUtxVyxLQUNyRHR3QyxFQUFPeXdDLE1BQU1KLElBQU16SSxFQUFNbG9DLElBQUk4dUMsRUFBSSxFQUFHLEVBQUd2VSxLQUFLb1csSUFBS3BXLEtBQUtxVyxLQUN0RHR3QyxFQUFPeXdDLE1BQU1ILElBQU0xSSxFQUFNbG9DLElBQUksRUFBRyxFQUFHLEVBQUd1NkIsS0FBS29XLElBQUtwVyxLQUFLcVcsS0FHaEQvSCxHQUtMQSxFQUFLWCxFQUFNbG9DLElBQUk2b0MsRUFBSWlHLEVBQUksRUFBRyxFQUFHLEdBQ3RCeHVDLEVBQU95d0MsTUFBTXQwQyxNQUFNb3NDLEdBQUl2ckIsTUFMckJoZCxDQU1YLENBRUE0MUMsVUFDRSxNQUFNNTFDLEVBQVMsQ0FBQyxFQUNoQixJQUFJNHRDLEVBQVEsR0F3QlosT0F0QkEzVCxLQUFLNFYsS0FBS3JXLFFBQ1IsU0FBVXNXLEdBQ1IsSUFBSStGLEVBQU0sU0FBVTF3QyxHQUNsQixPQUFPQSxFQUFFMnFDLEVBQ1gsRUFDSXIxQyxFQUFJdy9CLEtBQUtpUCxRQUFRLEdBQUd4cEMsSUFBSW0yQyxHQUM1QjcxQyxFQUFPOHZDLEdBQU9sSSxFQUFNOEcsT0FBT2owQyxHQUNSLElBQWZ3L0IsS0FBS2tPLFFBQ1AxdEMsRUFBSXcvQixLQUFLaVAsUUFBUSxHQUFHeHBDLElBQUltMkMsR0FDeEI3MUMsRUFBTzh2QyxHQUFPOXZDLEVBQU84dkMsR0FBS2x4QyxPQUFPZ3BDLEVBQU04RyxPQUFPajBDLEtBRWhEdUYsRUFBTzh2QyxHQUFPOXZDLEVBQU84dkMsR0FBSzlrQyxRQUFPLFNBQVVuUixHQUN6QyxPQUFPQSxHQUFLLEdBQUtBLEdBQUssQ0FDeEIsSUFDQSt6QyxFQUFRQSxFQUFNaHZDLE9BQU9vQixFQUFPOHZDLEdBQUszb0MsS0FBS3lnQyxFQUFNNkosWUFDOUMsRUFBRXQzQyxLQUFLOC9CLE9BR1RqNkIsRUFBT2pFLE9BQVM2eEMsRUFBTXptQyxLQUFLeWdDLEVBQU02SixZQUFZem1DLFFBQU8sU0FBVTdGLEVBQUd5bEMsR0FDL0QsT0FBT2dELEVBQU1ydUMsUUFBUTRGLEtBQU95bEMsQ0FDOUIsSUFFTzVxQyxDQUNULENBRUErckMsT0FDRSxNQUFNNkosRUFBVTNiLEtBQUsyYixVQUNuQjUxQyxFQUFTLENBQUMsRUFNWixPQUxBaTZCLEtBQUs0VixLQUFLclcsUUFDUixTQUFVdmdDLEdBQ1IrRyxFQUFPL0csR0FBSzJ1QyxFQUFNMkYsVUFBVXRULEtBQU1oaEMsRUFBRzI4QyxFQUFRMzhDLEdBQy9DLEVBQUVrQixLQUFLOC9CLE9BRUZqNkIsQ0FDVCxDQUVBNkIsU0FBUzJyQyxHQUNQLE1BQU1zSSxFQUFRN2IsS0FBSzhSLE9BQ2pCZ0ssRUFBUXZJLEVBQU16QixPQUNoQixPQUFPbkUsRUFBTXlFLFlBQVl5SixFQUFPQyxFQUNsQyxDQUVBcmxDLE9BQU83VyxFQUFHWixHQUNSLFFBQWlCLElBQU5BLEVBQW1CLENBQzVCLE1BQU1ELEVBQUlpaEMsS0FBS3pnQyxJQUFJSyxHQUNqQk8sRUFBSTYvQixLQUFLem5CLE9BQU8zWSxHQUNad3VDLEVBQU0sQ0FDVnJ2QyxFQUFHQSxFQUNIb0IsRUFBR0EsRUFDSGlILEVBQUdySSxFQUFFcUksRUFBSWpILEVBQUVpSCxFQUFJcEksRUFDZnFJLEVBQUd0SSxFQUFFc0ksRUFBSWxILEVBQUVrSCxFQUFJckksR0FLakIsT0FISWdoQyxLQUFLaU8sTUFDUEcsRUFBSTdnQyxFQUFJeE8sRUFBRXdPLEVBQUlwTixFQUFFb04sRUFBSXZPLEdBRWZvdkMsQ0FDVCxDQUNBLEdBQUlwTyxLQUFLMlksUUFBUyxDQUNoQixNQUFNb0QsRUFBSy9iLEtBQUt6bkIsT0FBTyxHQUNyQjQvQixFQUFTblksS0FBSy8xQixPQUFPeEUsS0FBSSxTQUFVakYsR0FDakMsTUFBTTR0QyxFQUFNLENBQ1ZobkMsRUFBRzVHLEVBQUU0RyxFQUFJeEgsRUFBSW04QyxFQUFHMzBDLEVBQ2hCQyxFQUFHN0csRUFBRTZHLEVBQUl6SCxFQUFJbThDLEVBQUcxMEMsR0FLbEIsT0FISTdHLEVBQUUrTSxHQUFLd3VDLEVBQUd4dUMsSUFDWjZnQyxFQUFJN2dDLEVBQUkvTSxFQUFFK00sRUFBSTNOLEVBQUltOEMsRUFBR3h1QyxHQUVoQjZnQyxDQUNULElBQ0YsTUFBTyxDQUFDLElBQUlvRCxFQUFPMkcsR0FDckIsQ0FDQSxPQUFPblksS0FBSzZULFNBQVNwdUMsS0FBSSxTQUFVaEYsR0FDakMsT0FBSUEsRUFBRWs0QyxRQUNHbDRDLEVBQUVnVyxPQUFPN1csR0FBRyxHQUVkYSxFQUFFa0wsTUFBTS9MLEVBQ2pCLEdBQ0YsQ0FFQW84QyxTQUNFLEdBQW1CLElBQWZoYyxLQUFLa08sTUFBYSxDQUNwQixNQUFNb0UsRUFBSzNFLEVBQU1qbEMsTUFBTXMzQixLQUFLLzFCLE9BQU8sR0FBSSsxQixLQUFLLzFCLE9BQU8sR0FBSSsxQixLQUFLLzFCLE9BQU8sSUFDN0Qwb0MsRUFBS2hGLEVBQU1qbEMsTUFBTXMzQixLQUFLLzFCLE9BQU8sR0FBSSsxQixLQUFLLzFCLE9BQU8sR0FBSSsxQixLQUFLLzFCLE9BQU8sSUFDbkUsR0FBS3FvQyxFQUFLLEdBQUtLLEVBQUssR0FBT0wsRUFBSyxHQUFLSyxFQUFLLEVBQUksT0FBTyxDQUN2RCxDQUNBLE1BQU1zSixFQUFLamMsS0FBS3puQixPQUFPLEdBQ2pCMmpDLEVBQUtsYyxLQUFLem5CLE9BQU8sR0FDdkIsSUFBSTlYLEVBQUl3N0MsRUFBRzcwQyxFQUFJODBDLEVBQUc5MEMsRUFBSTYwQyxFQUFHNTBDLEVBQUk2MEMsRUFBRzcwQyxFQUloQyxPQUhJMjRCLEtBQUtpTyxNQUNQeHRDLEdBQUt3N0MsRUFBRzF1QyxFQUFJMnVDLEVBQUczdUMsR0FFVnNxQyxFQUFNRyxFQUFPdjNDLElBQU15M0MsRUFBTyxDQUNuQyxDQUVBckUsU0FFRSxJQUFJbDFDLEVBSUZ5OUIsRUFIQW1ZLEVBQUssRUFDTGpHLEVBQUssRUFDTGtLLEVBQU8sSUFFUDJELEVBQVEsR0FDUkMsRUFBUSxHQUVOVCxFQUFVM2IsS0FBSzJiLFVBQVU3NUMsT0FRN0IsS0FQNEIsSUFBeEI2NUMsRUFBUXIyQyxRQUFRLEtBQ2xCcTJDLEVBQVUsQ0FBQyxHQUFHaDNDLE9BQU9nM0MsS0FFSyxJQUF4QkEsRUFBUXIyQyxRQUFRLElBQ2xCcTJDLEVBQVE5NUMsS0FBSyxHQUdWMHlDLEVBQUtvSCxFQUFRLEdBQUloOUMsRUFBSSxFQUFHQSxFQUFJZzlDLEVBQVFwNkMsT0FBUTVDLElBQy9DMnZDLEVBQUtxTixFQUFRaDlDLEdBQ2J5OUIsRUFBVTRELEtBQUs5OUIsTUFBTXF5QyxFQUFJakcsR0FDekJsUyxFQUFRZ2EsSUFBTTdCLEVBQ2RuWSxFQUFRaWEsSUFBTS9ILEVBQ2Q2TixFQUFNdDZDLEtBQUt1NkIsR0FDWG1ZLEVBQUtqRyxFQWdDUCxPQTVCQTZOLEVBQU01YyxTQUFRLFNBQVVvSyxHQUd0QixJQUZBNEssRUFBSyxFQUNMakcsRUFBSyxFQUNFQSxHQUFNLEdBQ1gsSUFBS0EsRUFBS2lHLEVBQUtpRSxFQUFNbEssR0FBTSxLQUFVQSxHQUFNa0ssRUFFekMsR0FEQXBjLEVBQVV1TixFQUFHem5DLE1BQU1xeUMsRUFBSWpHLElBQ2xCbFMsRUFBUTRmLFNBQVUsQ0FFckIsR0FEQTFOLEdBQU1rSyxFQUNGWCxFQUFNdEQsRUFBS2pHLEdBQU1rSyxFQUVuQixNQUFPLEdBRVRwYyxFQUFVdU4sRUFBR3puQyxNQUFNcXlDLEVBQUlqRyxHQUN2QmxTLEVBQVFnYSxJQUFNekksRUFBTWxvQyxJQUFJOHVDLEVBQUksRUFBRyxFQUFHNUssRUFBR3lNLElBQUt6TSxFQUFHME0sS0FDN0NqYSxFQUFRaWEsSUFBTTFJLEVBQU1sb0MsSUFBSTZvQyxFQUFJLEVBQUcsRUFBRzNFLEVBQUd5TSxJQUFLek0sRUFBRzBNLEtBQzdDK0YsRUFBTXY2QyxLQUFLdTZCLEdBQ1htWSxFQUFLakcsRUFDTCxLQUNGLENBR0FpRyxFQUFLLElBQ1BuWSxFQUFVdU4sRUFBR3puQyxNQUFNcXlDLEVBQUksR0FDdkJuWSxFQUFRZ2EsSUFBTXpJLEVBQU1sb0MsSUFBSTh1QyxFQUFJLEVBQUcsRUFBRzVLLEVBQUd5TSxJQUFLek0sRUFBRzBNLEtBQzdDamEsRUFBUWlhLElBQU0xTSxFQUFHME0sSUFDakIrRixFQUFNdjZDLEtBQUt1NkIsR0FFZixJQUNPZ2dCLENBQ1QsQ0FFQXIwQyxVQUFVbUQsRUFBR3lwQyxFQUFJQyxHQUNmQSxFQUFtQixpQkFBUEEsRUFBa0JBLEVBQUtELEVBS25DLE1BQU14MUMsRUFBSTZnQyxLQUFLa08sTUFDZixJQUFJbHZDLEVBQUlnaEMsS0FBSy8xQixPQUFPeEUsS0FBSSxDQUFDOHhDLEVBQUc1NEMsS0FBTyxFQUFJQSxFQUFJUSxHQUFLdzFDLEVBQU1oMkMsRUFBSVEsRUFBS3kxQyxJQUMvRCxPQUFPLElBQUlwRCxFQUNUeFIsS0FBSy8xQixPQUFPeEUsS0FBSSxDQUFDakYsRUFBRzdCLEtBQU0sQ0FDeEJ5SSxFQUFHNUcsRUFBRTRHLEVBQUk4RCxFQUFFOUQsRUFBSXBJLEVBQUVMLEdBQ2pCMEksRUFBRzdHLEVBQUU2RyxFQUFJNkQsRUFBRTdELEVBQUlySSxFQUFFTCxPQUd2QixDQUVBZ04sTUFBTTNNLEdBQ0osTUFBTWt2QyxFQUFRbE8sS0FBS2tPLE1BQ25CLElBQUltTyxHQUFhLEVBSWpCLEdBSGlCLG1CQUFOcjlDLElBQ1RxOUMsRUFBYXI5QyxHQUVYcTlDLEdBQXdCLElBQVZuTyxFQUNoQixPQUFPbE8sS0FBS2liLFFBQVF0dkMsTUFBTTB3QyxHQUs1QixNQUFNOUIsRUFBWXZhLEtBQUt1YSxVQUNqQnR3QyxFQUFTKzFCLEtBQUsvMUIsT0FFcEIsR0FBSSsxQixLQUFLMlksUUFDUCxPQUFPM1ksS0FBS2o0QixVQUNWaTRCLEtBQUt6bkIsT0FBTyxHQUNaOGpDLEVBQWFBLEVBQVcsR0FBS3I5QyxFQUM3QnE5QyxFQUFhQSxFQUFXLEdBQUtyOUMsR0FJakMsTUFBTTQvQixFQUFLeWQsRUFBYUEsRUFBVyxHQUFLcjlDLEVBQ2xDNi9CLEVBQUt3ZCxFQUFhQSxFQUFXLEdBQUtyOUMsRUFDbENrTSxFQUFJLENBQUM4MEIsS0FBS3ZwQixPQUFPLEVBQUcsSUFBS3VwQixLQUFLdnBCLE9BQU8sRUFBRyxLQUN4Q3lrQyxFQUFLLEdBQ0wvN0MsRUFBSXd1QyxFQUFNd0QsS0FBS2ptQyxFQUFFLEdBQUlBLEVBQUUsR0FBR25NLEVBQUdtTSxFQUFFLEdBQUlBLEVBQUUsR0FBR25NLEdBRTlDLElBQUtJLEVBQ0gsTUFBTSxJQUFJOGdDLE1BQU0sbURBV2xCLE1BTkEsQ0FBQyxFQUFHLEdBQUdWLFNBQVEsU0FBVTMvQixHQUN2QixNQUFNWSxFQUFLMDZDLEVBQUd0N0MsRUFBSXN1QyxHQUFTUCxFQUFNcUMsS0FBSy9sQyxFQUFPckssRUFBSXN1QyxJQUNqRDF0QyxFQUFFNEcsSUFBTXhILEVBQUlpL0IsRUFBS0QsR0FBTTF6QixFQUFFdEwsR0FBR08sRUFBRWlILEVBQzlCNUcsRUFBRTZHLElBQU16SCxFQUFJaS9CLEVBQUtELEdBQU0xekIsRUFBRXRMLEdBQUdPLEVBQUVrSCxDQUNoQyxJQUVLZzFDLEdBZUwsQ0FBQyxFQUFHLEdBQUc5YyxTQUFRLFNBQVUzL0IsR0FDdkIsR0FBYyxJQUFWc3VDLElBQWlCdHVDLEVBQXJCLENBQ0EsSUFBSVksRUFBSXlKLEVBQU9ySyxFQUFJLEdBQ2YwOEMsRUFBSyxDQUNQbDFDLEVBQUc1RyxFQUFFNEcsRUFBSWpJLEVBQUVpSSxFQUNYQyxFQUFHN0csRUFBRTZHLEVBQUlsSSxFQUFFa0ksR0FFVGsxQyxFQUFLRixFQUFhQSxHQUFZejhDLEVBQUksR0FBS3N1QyxHQUFTbHZDLEVBQ2hEcTlDLElBQWU5QixJQUFXZ0MsR0FBTUEsR0FDcEMsSUFBSXo5QyxFQUFJbTVDLEVBQU9xRSxFQUFHbDFDLEVBQUlrMUMsRUFBR2wxQyxFQUFJazFDLEVBQUdqMUMsRUFBSWkxQyxFQUFHajFDLEdBQ3ZDaTFDLEVBQUdsMUMsR0FBS3RJLEVBQ1J3OUMsRUFBR2oxQyxHQUFLdkksRUFDUm84QyxFQUFHdDdDLEVBQUksR0FBSyxDQUNWd0gsRUFBRzVHLEVBQUU0RyxFQUFJbTFDLEVBQUtELEVBQUdsMUMsRUFDakJDLEVBQUc3RyxFQUFFNkcsRUFBSWsxQyxFQUFLRCxFQUFHajFDLEVBYlcsQ0FlaEMsSUFDTyxJQUFJbXFDLEVBQU8wSixLQTdCaEIsQ0FBQyxFQUFHLEdBQUczYixTQUFTMy9CLElBQ2QsR0FBYyxJQUFWc3VDLEdBQWlCdHVDLEVBQUcsT0FDeEIsTUFBTVksRUFBSTA2QyxFQUFHdDdDLEVBQUlzdUMsR0FDWGx2QyxFQUFJZ2hDLEtBQUt3YSxXQUFXNTZDLEdBQ3BCZ3FDLEVBQUssQ0FBRXhpQyxFQUFHNUcsRUFBRTRHLEVBQUlwSSxFQUFFb0ksRUFBR0MsRUFBRzdHLEVBQUU2RyxFQUFJckksRUFBRXFJLEdBQ3RDNnpDLEVBQUd0N0MsRUFBSSxHQUFLK3RDLEVBQU13RCxLQUFLM3dDLEVBQUdvcEMsRUFBSXpxQyxFQUFHOEssRUFBT3JLLEVBQUksR0FBRyxJQUUxQyxJQUFJNHhDLEVBQU8wSixHQXVCdEIsQ0FFQXNCLFFBQVE3SCxFQUFJQyxFQUFJNkgsRUFBSUMsR0FHbEIsR0FGQTlILE9BQVlyeUIsSUFBUHF5QixFQUFtQkQsRUFBS0MsRUFFekI1VSxLQUFLMlksUUFBUyxDQUloQixNQUFNeDRDLEVBQUk2L0IsS0FBS3puQixPQUFPLEdBQ2hCOFYsRUFBUTJSLEtBQUsvMUIsT0FBTyxHQUNwQmhJLEVBQU0rOUIsS0FBSy8xQixPQUFPKzFCLEtBQUsvMUIsT0FBTzFJLE9BQVMsR0FDN0MsSUFBSWQsRUFBR3N4QyxFQUFLL3FDLE9BRUR1YixJQUFQazZCLElBQ0ZBLEVBQUs5SCxFQUNMK0gsRUFBSzlILEdBR1BuMEMsRUFBSSxDQUFFMkcsRUFBR2luQixFQUFNam5CLEVBQUlqSCxFQUFFaUgsRUFBSXV0QyxFQUFJdHRDLEVBQUdnbkIsRUFBTWhuQixFQUFJbEgsRUFBRWtILEVBQUlzdEMsR0FDaEQzdEMsRUFBSSxDQUFFSSxFQUFHbkYsRUFBSW1GLEVBQUlqSCxFQUFFaUgsRUFBSXExQyxFQUFJcDFDLEVBQUdwRixFQUFJb0YsRUFBSWxILEVBQUVrSCxFQUFJbzFDLEdBQzVDMUssRUFBTSxDQUFFM3FDLEdBQUkzRyxFQUFFMkcsRUFBSUosRUFBRUksR0FBSyxFQUFHQyxHQUFJNUcsRUFBRTRHLEVBQUlMLEVBQUVLLEdBQUssR0FDN0MsTUFBTXMxQyxFQUFRLENBQUNsOEMsRUFBR3N4QyxFQUFLL3FDLEdBRXZCdkcsRUFBSSxDQUFFMkcsRUFBR2luQixFQUFNam5CLEVBQUlqSCxFQUFFaUgsRUFBSXd0QyxFQUFJdnRDLEVBQUdnbkIsRUFBTWhuQixFQUFJbEgsRUFBRWtILEVBQUl1dEMsR0FDaEQ1dEMsRUFBSSxDQUFFSSxFQUFHbkYsRUFBSW1GLEVBQUlqSCxFQUFFaUgsRUFBSXMxQyxFQUFJcjFDLEVBQUdwRixFQUFJb0YsRUFBSWxILEVBQUVrSCxFQUFJcTFDLEdBQzVDM0ssRUFBTSxDQUFFM3FDLEdBQUkzRyxFQUFFMkcsRUFBSUosRUFBRUksR0FBSyxFQUFHQyxHQUFJNUcsRUFBRTRHLEVBQUlMLEVBQUVLLEdBQUssR0FDN0MsTUFBTXUxQyxFQUFRLENBQUM1MUMsRUFBRytxQyxFQUFLdHhDLEdBRWpCbzhDLEVBQUtsUCxFQUFNNEQsU0FBU3FMLEVBQU0sR0FBSUQsRUFBTSxJQUNwQ0csRUFBS25QLEVBQU00RCxTQUFTb0wsRUFBTSxHQUFJQyxFQUFNLElBQ3BDdmdCLEVBQVcsQ0FBQ3dnQixFQUFJLElBQUlyTCxFQUFPbUwsR0FBUUcsRUFBSSxJQUFJdEwsRUFBT29MLElBQ3hELE9BQU8sSUFBSW5GLEVBQVdwYixFQUN4QixDQUVBLE1BQU0wZ0IsRUFBVS9jLEtBQUs2VCxTQUNuQjdWLEVBQU0rZSxFQUFReDdDLE9BQ2R5N0MsRUFBVSxHQUVaLElBQ0V4OEMsRUFERXk4QyxFQUFVLEdBRVpDLEVBQU8sRUFDUEMsRUFBT25kLEtBQUt6K0IsU0FFZCxNQUFNNjdDLE9BQTBCLElBQVBYLFFBQW9DLElBQVBDLEVBRXRELFNBQVNXLEVBQXVCNThDLEVBQUd1RyxFQUFHbTJDLEVBQU1ELEVBQU1JLEdBQ2hELE9BQU8sU0FBVXB5QyxHQUNmLE1BQU0wakMsRUFBS3NPLEVBQU9DLEVBQ2hCdE8sR0FBTXFPLEVBQU9JLEdBQVFILEVBQ3JCbitDLEVBQUlnSSxFQUFJdkcsRUFDVixPQUFPa3RDLEVBQU1sb0MsSUFBSXlGLEVBQUcsRUFBRyxFQUFHekssRUFBSW11QyxFQUFLNXZDLEVBQUd5QixFQUFJb3VDLEVBQUs3dkMsRUFDakQsQ0FDRixDQUdBKzlDLEVBQVF4ZCxTQUFRLFNBQVVuRCxHQUN4QixNQUFNa2hCLEVBQU9saEIsRUFBUTc2QixTQUNqQjY3QyxHQUNGSixFQUFRbjdDLEtBQ051NkIsRUFBUXp3QixNQUFNMHhDLEVBQXVCMUksRUFBSThILEVBQUlVLEVBQU1ELEVBQU1JLEtBRTNETCxFQUFRcDdDLEtBQ051NkIsRUFBUXp3QixNQUFNMHhDLEdBQXdCekksR0FBSzhILEVBQUlTLEVBQU1ELEVBQU1JLE9BRzdETixFQUFRbjdDLEtBQUt1NkIsRUFBUXp3QixNQUFNZ3BDLElBQzNCc0ksRUFBUXA3QyxLQUFLdTZCLEVBQVF6d0IsT0FBT2lwQyxLQUU5QnNJLEdBQVFJLENBQ1YsSUFHQUwsRUFBVUEsRUFDUHgzQyxLQUFJLFNBQVVoRixHQU9iLE9BTkFELEVBQUlDLEVBQUV3SixPQUNGekosRUFBRSxHQUNKQyxFQUFFd0osT0FBUyxDQUFDekosRUFBRSxHQUFJQSxFQUFFLEdBQUlBLEVBQUUsR0FBSUEsRUFBRSxJQUVoQ0MsRUFBRXdKLE9BQVMsQ0FBQ3pKLEVBQUUsR0FBSUEsRUFBRSxHQUFJQSxFQUFFLElBRXJCQyxDQUNULElBQ0M4OEMsVUFHSCxNQUFNQyxFQUFLUixFQUFRLEdBQUcveUMsT0FBTyxHQUMzQnd6QyxFQUFLVCxFQUFRaGYsRUFBTSxHQUFHL3pCLE9BQU8reUMsRUFBUWhmLEVBQU0sR0FBRy96QixPQUFPMUksT0FBUyxHQUM5RG04QyxFQUFLVCxFQUFRamYsRUFBTSxHQUFHL3pCLE9BQU9nekMsRUFBUWpmLEVBQU0sR0FBRy96QixPQUFPMUksT0FBUyxHQUM5RG84QyxFQUFLVixFQUFRLEdBQUdoekMsT0FBTyxHQUN2QjR5QyxFQUFLbFAsRUFBTTRELFNBQVNtTSxFQUFJRixHQUN4QlYsRUFBS25QLEVBQU00RCxTQUFTa00sRUFBSUUsR0FDeEJ0aEIsRUFBVyxDQUFDd2dCLEdBQUlsNEMsT0FBT3E0QyxHQUFTcjRDLE9BQU8sQ0FBQ200QyxJQUFLbjRDLE9BQU9zNEMsR0FFdEQsT0FBTyxJQUFJeEYsRUFBV3BiLEVBQ3hCLENBRUF1aEIsY0FBY2pKLEVBQUlDLEVBQUl6QyxHQUNwQnlDLEVBQUtBLEdBQU1ELEVBQ1gsTUFBTTZILEVBQVV4YyxLQUFLd2MsUUFBUTdILEVBQUlDLEdBQUk4QyxPQUMvQm1HLEVBQVMsR0FDZixJQUFLLElBQUlsL0MsRUFBSSxFQUFHcS9CLEVBQU13ZSxFQUFRajdDLE9BQVE1QyxFQUFJcS9CLEVBQU0sRUFBR3IvQixJQUFLLENBQ3RELE1BQU0wMEMsRUFBUTFGLEVBQU11RixVQUNsQnNKLEVBQVE3OUMsR0FDUjY5QyxFQUFReGUsRUFBTXIvQixHQUNkd3pDLEdBRUZrQixFQUFNZCxTQUFTTSxRQUFVbDBDLEVBQUksRUFDN0IwMEMsRUFBTVgsT0FBT0csUUFBVWwwQyxFQUFJcS9CLEVBQU0sRUFBSSxFQUNyQzZmLEVBQU9oOEMsS0FBS3d4QyxFQUNkLENBQ0EsT0FBT3dLLENBQ1QsQ0FFQTFULFdBQVdvSixFQUFPcEIsR0FDaEIsT0FBS29CLEVBQ0RBLEVBQU01SixJQUFNNEosRUFBTTNKLEdBQ2I1SixLQUFLOGQsZUFBZXZLLElBRXpCQSxhQUFpQi9CLElBQ25CK0IsRUFBUUEsRUFBTU0sVUFFVDdULEtBQUsrZCxnQkFDVi9kLEtBQUs2VCxTQUNMTixFQUNBcEIsSUFWaUJuUyxLQUFLZ2UsZUFBZTdMLEVBWXpDLENBRUEyTCxlQUFlcFosR0FDYixNQUFNZ04sRUFBS2h1QyxFQUFJZ2hDLEVBQUtpRixHQUFHdmlDLEVBQUdzOUIsRUFBS2tGLEdBQUd4aUMsR0FDaEN1cUMsRUFBS2p1QyxFQUFJZ2hDLEVBQUtpRixHQUFHdGlDLEVBQUdxOUIsRUFBS2tGLEdBQUd2aUMsR0FDNUJ1cUMsRUFBS2p1QyxFQUFJK2dDLEVBQUtpRixHQUFHdmlDLEVBQUdzOUIsRUFBS2tGLEdBQUd4aUMsR0FDNUJ5cUMsRUFBS2x1QyxFQUFJK2dDLEVBQUtpRixHQUFHdGlDLEVBQUdxOUIsRUFBS2tGLEdBQUd2aUMsR0FDOUIsT0FBT3NtQyxFQUFNZ0csTUFBTTNULEtBQUsvMUIsT0FBUXk2QixHQUFNM3pCLFFBQVFuUixJQUM1QyxJQUFJWSxFQUFJdy9CLEtBQUt6Z0MsSUFBSUssR0FDakIsT0FBTyt0QyxFQUFNd0IsUUFBUTN1QyxFQUFFNEcsRUFBR3NxQyxFQUFJRSxJQUFPakUsRUFBTXdCLFFBQVEzdUMsRUFBRTZHLEVBQUdzcUMsRUFBSUUsRUFBRyxHQUVuRSxDQUVBbU0sZUFBZTdMLEdBS2IsTUFBTTRLLEVBQVUvYyxLQUFLNlQsU0FDbkI3VixFQUFNK2UsRUFBUXg3QyxPQUFTLEVBQ3ZCazFDLEVBQVUsR0FFWixJQUFLLElBQVcxd0MsRUFBUWdkLEVBQU15ekIsRUFBckI3M0MsRUFBSSxFQUF3QkEsRUFBSXEvQixFQUFLci9CLElBQzVDb2tCLEVBQU9nNkIsRUFBUTU2QyxNQUFNeEQsRUFBR0EsRUFBSSxHQUM1QjYzQyxFQUFRdUcsRUFBUTU2QyxNQUFNeEQsRUFBSSxHQUMxQm9ILEVBQVNpNkIsS0FBSytkLGdCQUFnQmg3QixFQUFNeXpCLEVBQU9yRSxHQUMzQ3NFLEVBQVE1MEMsUUFBUWtFLEdBRWxCLE9BQU8wd0MsQ0FDVCxDQUVBc0gsZ0JBQWdCL0ssRUFBSUMsRUFBSWQsR0FDdEIsTUFBTWg3QixFQUFRLEdBRWQ2N0IsRUFBR3pULFNBQVEsU0FBVTNnQyxHQUNuQnEwQyxFQUFHMVQsU0FBUSxTQUFVLy9CLEdBQ2ZaLEVBQUVnSixTQUFTcEksSUFDYjJYLEVBQU10VixLQUFLLENBQUVraEIsS0FBTW5rQixFQUFHNDNDLE1BQU9oM0MsR0FFakMsR0FDRixJQUVBLElBQUk2eUMsRUFBZ0IsR0FXcEIsT0FWQWw3QixFQUFNb29CLFNBQVEsU0FBVW5vQixHQUN0QixNQUFNclIsRUFBUzRuQyxFQUFNcUksY0FDbkI1K0IsRUFBSzJMLEtBQ0wzTCxFQUFLby9CLE1BQ0xyRSxHQUVFcHNDLEVBQU94RSxPQUFTLElBQ2xCOHdDLEVBQWdCQSxFQUFjMXRDLE9BQU9vQixHQUV6QyxJQUNPc3NDLENBQ1QsQ0FFQTRMLEtBQUtDLEdBRUgsT0FEQUEsRUFBaUJBLEdBQWtCLEdBQzVCbGUsS0FBS21lLFNBQVNELEVBQWdCLEdBQ3ZDLENBRUFFLE9BQU9sSyxFQUFJbUssRUFBSzU5QyxFQUFHdUcsR0FDakIsTUFBTWlpQyxHQUFLamlDLEVBQUl2RyxHQUFLLEVBQ2xCdXlDLEVBQUtoVCxLQUFLemdDLElBQUlrQixFQUFJd29DLEdBQ2xCZ0ssRUFBS2pULEtBQUt6Z0MsSUFBSXlILEVBQUlpaUMsR0FDbEJxVixFQUFNM1EsRUFBTTJDLEtBQUs0RCxFQUFJbUssR0FDckIxSixFQUFLaEgsRUFBTTJDLEtBQUs0RCxFQUFJbEIsR0FDcEI0QixFQUFLakgsRUFBTTJDLEtBQUs0RCxFQUFJakIsR0FDdEIsT0FBTzRFLEVBQU1sRCxFQUFLMkosR0FBT3pHLEVBQU1qRCxFQUFLMEosRUFDdEMsQ0FFQUgsU0FBU0QsRUFBZ0JLLEdBQ3ZCLElBRUVDLEVBRkVDLEVBQU0sRUFDUkMsRUFBTSxFQUdSLEVBQUcsQ0FDREYsRUFBUyxFQUdURSxFQUFNLEVBR04sSUFDRUMsRUFDQUMsRUFDQXR3QixFQUNBdXdCLEVBS0FDLEVBVEVULEVBQU1yZSxLQUFLemdDLElBQUlrL0MsR0FPZk0sR0FBWSxFQUNkQyxHQUFZLEVBSVZDLEVBQU1QLEVBQ1JRLEVBQVMsRUFHWCxHQXVCRSxHQXRCQUYsRUFBWUQsRUFDWkYsRUFBV3Z3QixFQUNYMndCLEdBQU9SLEVBQU1DLEdBQU8sRUFFcEJDLEVBQU0zZSxLQUFLemdDLElBQUkwL0MsR0FDZkwsRUFBTTVlLEtBQUt6Z0MsSUFBSW0vQyxHQUVmcHdCLEVBQU1xZixFQUFNK0ksV0FBVzJILEVBQUtNLEVBQUtDLEdBR2pDdHdCLEVBQUk2d0IsU0FBVyxDQUNiOXdCLE1BQU9vd0IsRUFDUHg4QyxJQUFLeThDLEdBSVBLLEVBRFkvZSxLQUFLb2UsT0FBTzl2QixFQUFLK3ZCLEVBQUtJLEVBQUtDLElBQ2xCUixFQUVyQlksRUFBT0UsSUFBY0QsRUFDaEJELElBQU1JLEVBQVNSLEdBR2hCSyxFQUFXLENBRWIsR0FBSUwsR0FBTyxFQUFHLENBTVosR0FKQXB3QixFQUFJNndCLFNBQVNsOUMsSUFBTWk5QyxFQUFTLEVBQzVCTCxFQUFXdndCLEVBR1Bvd0IsRUFBTSxFQUFHLENBQ1gsSUFBSTEvQyxFQUFJLENBQ05vSSxFQUFHa25CLEVBQUlsbkIsRUFBSWtuQixFQUFJOXVCLEVBQUlzNEMsRUFBTXhwQixFQUFJdG5CLEdBQzdCSyxFQUFHaW5CLEVBQUlqbkIsRUFBSWluQixFQUFJOXVCLEVBQUl1NEMsRUFBTXpwQixFQUFJdG5CLElBRS9Cc25CLEVBQUl0bkIsR0FBSzJtQyxFQUFNamxDLE1BQU0sQ0FBRXRCLEVBQUdrbkIsRUFBSWxuQixFQUFHQyxFQUFHaW5CLEVBQUlqbkIsR0FBS3JJLEVBQUdnaEMsS0FBS3pnQyxJQUFJLEdBQzNELENBQ0EsS0FDRixDQUVBbS9DLElBQWFBLEVBQU1ELEdBQU8sQ0FDNUIsTUFFRUMsRUFBTU8sU0FFQUgsR0FBUU4sSUFBVyxLQUU3QixHQUFJQSxHQUFVLElBQ1osTUFLRkssRUFBV0EsR0FBc0J2d0IsRUFDakNpd0IsRUFBUTE4QyxLQUFLZzlDLEdBQ2JKLEVBQU1TLENBQ1IsT0FBU1IsRUFBTSxHQUNmLE9BQU9ILENBQ1QsRUM5NkRLLE1BQU1hLEVBQXNCLFNBQUMxZixHQUVoQyxPQUFPQSxFQUFRQyxNQUVYLElBQUssSUFBSyxPQUFPLEVBQUF0M0IsT0FBQSxPQUFjcTNCLEVBQVF0NEIsRUFBR3M0QixFQUFRcjRCLEdBQ2xELElBQUssSUFBSyxNQUFNLElBQUk0NEIsTUFBTSxtQkFDMUIsSUFBSyxJQUlMLElBQUssSUFBSyxPQUFPb2YsRUFBd0IzZixHQUh6QyxJQUFLLElBQ0wsSUFBSyxJQUNMLElBQUssSUFBSyxPQUFPNGYsRUFBeUI1ZixHQUdsRCxFQUVhNGYsRUFBMkIsU0FBQzVmLEdBRXJDLElBQU16MUIsRUFBU3MxQyxFQUFnQjdmLEdBQ3pCOGYsRUFBZSxJQUFJaE8sRUFBT3ZuQyxHQUFRMUssSUFBSSxJQUM1QyxPQUFPLEVBQUE4SSxPQUFBLE9BQWNtM0MsRUFBYXA0QyxFQUFHbzRDLEVBQWFuNEMsRUFDdEQsRUFFYWc0QyxFQUEwQixTQUFDM2YsR0FFcEMsT1ZoQjZCaUssRVVnQkwsRUFBQXRoQyxPQUFBLE9BQWNxM0IsRUFBUXQ0QixFQUFHczRCLEVBQVFyNEIsR1ZoQmhCdWlDLEVVZ0JvQixFQUFBdmhDLE9BQUEsT0FBY3EzQixFQUFRL0IsR0FBSStCLEVBQVE5QixJVmR4RixFQUFBdjFCLE9BQUEsUUFBZXNoQyxFQUFHdmlDLEVBQUl3aUMsRUFBR3hpQyxHQUFLLEdBQUl1aUMsRUFBR3RpQyxFQUFJdWlDLEVBQUd2aUMsR0FBSyxHQUY1QixJQUFDc2lDLEVBQVlDLENVaUI3QyxFQUVhNlYsRUFBeUIsU0FBQy9mLEdBRW5DLE9BQU9xSyxFQUFVckssRUFBUXQ0QixFQUFHczRCLEVBQVFyNEIsRUFBR3E0QixFQUFRL0IsR0FBSStCLEVBQVE5QixHQUMvRCxFQUVhOGhCLEVBQTBCLFNBQUNoZ0IsR0FFcEMsT0FBT2dLLEVBQWdCLEVBQUFyaEMsT0FBQSxPQUFjcTNCLEVBQVF0NEIsRUFBR3M0QixFQUFRcjRCLEdBQUksRUFBQWdCLE9BQUEsT0FBY3EzQixFQUFRL0IsR0FBSStCLEVBQVE5QixJQUNsRyxFQUVhMmhCLEVBQWtCLFNBQUM3ZixHQUU1QixPQUFRQSxFQUFRQyxNQUVaLElBQUssSUFFRCxNQUFPLENBQ0gsRUFBQXQzQixPQUFBLE9BQWNxM0IsRUFBUS9CLEdBQUkrQixFQUFROUIsSUFDbEMsRUFBQXYxQixPQUFBLE9BQWNxM0IsRUFBUS9nQixHQUFJK2dCLEVBQVE3QixJQUNsQyxFQUFBeDFCLE9BQUEsT0FBY3EzQixFQUFROWdCLEdBQUk4Z0IsRUFBUTVCLElBQ2xDLEVBQUF6MUIsT0FBQSxPQUFjcTNCLEVBQVF0NEIsRUFBR3M0QixFQUFRcjRCLElBR3pDLElBQUssSUFFRCxNQUFPLENBQ0gsRUFBQWdCLE9BQUEsT0FBY3EzQixFQUFRL0IsR0FBSStCLEVBQVE5QixJQUNsQyxFQUFBdjFCLE9BQUEsT0FBY3EzQixFQUFRL2dCLEdBQUkrZ0IsRUFBUTdCLElBQ2xDLEVBQUF4MUIsT0FBQSxPQUFjcTNCLEVBQVF0NEIsRUFBR3M0QixFQUFRcjRCLElBR3pDLElBQUssSUFFRCxNQUFPLENBQ0gsRUFBQWdCLE9BQUEsT0FBY3EzQixFQUFRL0IsR0FBSStCLEVBQVE5QixJQUNsQyxFQUFBdjFCLE9BQUEsT0FBY3EzQixFQUFROWdCLEdBQUk4Z0IsRUFBUTVCLElBQ2xDLEVBQUF6MUIsT0FBQSxPQUFjcTNCLEVBQVF0NEIsRUFBR3M0QixFQUFRcjRCLElBR3pDLElBQUssSUFFRCxNQUFNLElBQUk0NEIsTUFBTSxpQkFHNUIsRUNwRUEsMEJBMEJBLFFBeEJJLFlBQUFrSyxXQUFBLFNBQVdvSixFQUF5QjdPLEdBRWhDLElBQU1pYixFQUFhLEVBQUF0M0MsT0FBQSxPQUFja3JDLEVBQU01VixHQUFJNFYsRUFBTTNWLElBQzNDZ2lCLEVBQVcsRUFBQXYzQyxPQUFBLE9BQWNrckMsRUFBTW5zQyxFQUFHbXNDLEVBQU1sc0MsR0FDeEN3NEMsRUFBWSxFQUFBeDNDLE9BQUEsT0FBY3E4QixFQUFLL0csR0FBSStHLEVBQUs5RyxJQUN4Q2tpQixFQUFVLEVBQUF6M0MsT0FBQSxPQUFjcThCLEVBQUt0OUIsRUFBR3M5QixFQUFLcjlCLEdBRTNDLFNBQUl5aUMsRUFBYTZWLEVBQVlFLElBQ3pCL1YsRUFBYTZWLEVBQVlHLElBQ3pCaFcsRUFBYThWLEVBQVVDLElBQ3ZCL1YsRUFBYThWLEVBQVVFLEtBT3dDLElBRnBELElBQUl0TyxFQUFPK04sRUFBZ0JoTSxJQUU1QnBKLFdBQVcsQ0FBRVIsR0FBSWtXLEVBQVdqVyxHQUFJa1csSUFBVXYrQyxNQUM1RCxFQUVBLFlBQUF5cEMsc0JBQUEsV0FFSSxNQUFPLENBQUMsQ0FBQyxJQUFLLElBQUssS0FBTSxDQUFDLElBQUssS0FDbkMsRUFDSixFQTFCQSxHQ0FBLDBCQTZCQSxRQTNCSSxZQUFBYixXQUFBLFNBQVc0VixFQUEwQkMsR0FFakMsSUFBTUMsRUFBYyxFQUFBNTNDLE9BQUEsT0FBYzAzQyxFQUFPcGlCLEdBQUlvaUIsRUFBT25pQixJQUM5Q3NpQixFQUFZLEVBQUE3M0MsT0FBQSxPQUFjMDNDLEVBQU8zNEMsRUFBRzI0QyxFQUFPMTRDLEdBQzNDODRDLEVBQWMsRUFBQTkzQyxPQUFBLE9BQWMyM0MsRUFBT3JpQixHQUFJcWlCLEVBQU9waUIsSUFDOUN3aUIsRUFBWSxFQUFBLzNDLE9BQUEsT0FBYzIzQyxFQUFPNTRDLEVBQUc0NEMsRUFBTzM0QyxHQUVqRCxHQUFJeWlDLEVBQWFtVyxFQUFhRSxJQUMxQnJXLEVBQWFtVyxFQUFhRyxJQUMxQnRXLEVBQWFvVyxFQUFXQyxJQUN4QnJXLEVBQWFvVyxFQUFXRSxHQUV4QixPQUFPLEVBR1gsSUFBTUMsRUFBVSxJQUFJN08sRUFBTytOLEVBQWdCUSxJQUNyQ08sRUFBVSxJQUFJOU8sRUFBTytOLEVBQWdCUyxJQUkzQyxPQUF5QixJQUZWSyxFQUFRdEMsZ0JBQWdCLENBQUNzQyxHQUFVLENBQUNDLElBRXJDLytDLE1BQ2xCLEVBRUEsWUFBQXlwQyxzQkFBQSxXQUVJLE1BQU8sQ0FBQyxDQUFDLElBQUssSUFBSyxLQUFNLENBQUMsSUFBSyxJQUFLLEtBQ3hDLEVBQ0osRUE3QkEsR0NHQSwwQkFlQSxRQWJJLFlBQUFiLFdBQUEsU0FBV29KLEVBQTRHNXJDLEdBRW5ILElBQU1nNEMsRUFBYSxFQUFBdDNDLE9BQUEsT0FBY2tyQyxFQUFNNVYsR0FBSTRWLEVBQU0zVixJQUMzQ2dpQixFQUFXLEVBQUF2M0MsT0FBQSxPQUFja3JDLEVBQU1uc0MsRUFBR21zQyxFQUFNbHNDLEdBQ3hDazVDLEVBQVcsRUFBQWw0QyxPQUFBLE9BQWNWLEVBQU1QLEVBQUdPLEVBQU1OLEdBRTlDLE9BQU95aUMsRUFBYTZWLEVBQVlZLElBQWF6VyxFQUFhOFYsRUFBVVcsRUFDeEUsRUFFQSxZQUFBdlYsc0JBQUEsV0FFSSxNQUFPLENBQUMsQ0FBQyxJQUFLLElBQUssS0FBTSxDQUFDLEtBQzlCLEVBQ0osRUFmQSxHQ0xBLDBCQWNBLFFBWkksWUFBQWIsV0FBQSxTQUFXcVcsRUFBbUNDLEdBRTFDLElBQU1DLEVBQVksRUFBQXI0QyxPQUFBLE9BQWNtNEMsRUFBT3A1QyxFQUFHbzVDLEVBQU9uNUMsR0FDM0NzNUMsRUFBWSxFQUFBdDRDLE9BQUEsT0FBY280QyxFQUFPcjVDLEVBQUdxNUMsRUFBT3A1QyxHQUVqRCxPQUFPeWlDLEVBQWE0VyxFQUFXQyxFQUNuQyxFQUVBLFlBQUEzVixzQkFBQSxXQUVJLE1BQU8sQ0FBQyxDQUFDLEtBQU0sQ0FBQyxLQUNwQixFQUNKLEVBZEEsR0NPQSxjQUlJLGFBRUloTCxLQUFLNGdCLHFCQUF1QixDQUFDLElBQUlDLEVBQXVCLElBQUlDLEVBQ3hELElBQUlDLEVBQXdCLElBQUlDLEVBQXlCLElBQUlDLEVBQXlCLElBQUlDLEVBQ2xHLENBMkNKLE9BeENJLFlBQUFDLFVBQUEsU0FBVUMsR0FBVixXQUVVQyxFQUFlRCxFQUNoQnJVLFNBQVEsU0FBQTVOLEdBQVksT0FBQUEsQ0FBQSxJQUVuQm1pQixFQUFrQixJQUFJQyxHQUN4QixTQUFDQyxFQUFRQyxHQUFXLFNBQUtDLFVBQVVGLEVBQVFDLEVBQVEsRUFBS2IscUJBQXBDLElBT3hCLE9BTEFTLEVBQWE5aEIsU0FBUSxTQUFBRyxHQUVqQjRoQixFQUFnQjNVLFNBQVNqTixFQUM3QixJQUVPNGhCLEVBQWdCNVUsdUJBQzNCLEVBR1EsWUFBQWdWLFVBQVIsU0FBa0JDLEVBQXVCQyxFQUF1QkMsR0FFNUQsSUFBTUMsRUFBc0JELEVBQVNFLE1BQUssU0FBQUMsR0FFdEMsSUFBTUMsRUFBVUQsRUFBWWhYLHdCQUM1QixPQUFRaVgsRUFBUSxHQUFHQyxTQUFTUCxFQUFLaGlCLE9BQVNzaUIsRUFBUSxHQUFHQyxTQUFTTixFQUFLamlCLE9BQzlEc2lCLEVBQVEsR0FBR0MsU0FBU1AsRUFBS2hpQixPQUFTc2lCLEVBQVEsR0FBR0MsU0FBU04sRUFBS2ppQixLQUNwRSxJQUVBLFFBQTRCcGQsSUFBeEJ1L0IsRUFFQSxNQUFNLElBQUk3aEIsTUFBTSw0Q0FBcUMwaEIsRUFBS2hpQixLQUFJLFlBQUlpaUIsRUFBS2ppQixPQUczRSxPQUFJbWlCLEVBQW9COVcsd0JBQXdCLEdBQUdrWCxTQUFTUCxFQUFLaGlCLE1BRXREbWlCLEVBQW9CM1gsV0FBV3dYLEVBQU1DLEdBSXJDRSxFQUFvQjNYLFdBQVd5WCxFQUFNRCxFQUVwRCxFQUNKLEVBbkRBLEdDVEEsMkJBT0EsUUFMSSxZQUFBUixVQUFBLFNBQVVDLEdBRU4sT0FBT0EsQ0FDWCxFQUVKLEVBUEEsR0NJQSxjQU9JLFdBQVllLEVBQW9DQyxHQUU1Q3BpQixLQUFLcWlCLFNBQVdGLEVBRWhCLElBQU1HLEVBQWVqRCxFQUF3QjhDLEdBQ3ZDSSxFQUFhN0MsRUFBd0J5QyxHQUNyQ0ssRUFBWS9DLEVBQXVCMEMsR0FFOUIsRUFBQTk1QyxPQUFBLE9BQWM4NUMsRUFBUS82QyxFQUFHKzZDLEVBQVE5NkMsR0FDakMsRUFBQWdCLE9BQUEsT0FBYzg1QyxFQUFReGtCLEdBQUl3a0IsRUFBUXZrQixJQUU3Q29DLEtBQUt5aUIsT0FBUyxFQUFBcmtDLE9BQUEsT0FBYytqQyxFQUFRLzZDLEVBQUcrNkMsRUFBUTk2QyxFQUFFLEVBQUcsQ0FBQ2lMLFVBQVUsSUFDL0QsRUFBQTVELEtBQUEsV0FBZ0JzeEIsS0FBS3lpQixPQUFRLEdBRTdCemlCLEtBQUswaUIsTUFBUSxFQUFBdGtDLE9BQUEsVUFDVGtrQyxFQUFhbDdDLEVBQUdrN0MsRUFBYWo3QyxFQUFHazdDLEVBQVlILEVBQzVDLENBQ0kxNUMsTUFBTzg1QyxJQUdmeGlCLEtBQUsyaUIsUUFBVSxDQUFDM2lCLEtBQUt5aUIsT0FBUXppQixLQUFLMGlCLE1BQ3RDLENBYUosT0FYSSxzQkFBSSxxQkFBTSxLQUFWLFdBRUksT0FBTzFpQixLQUFLMmlCLE9BQ2hCLGtDQUVBLFlBQUFDLGlCQUFBLFdBRUk1aUIsS0FBS3FpQixTQUFTajdDLEVBQUk0NEIsS0FBS3lpQixPQUFPdjZDLFNBQVNkLEVBQ3ZDNDRCLEtBQUtxaUIsU0FBU2g3QyxFQUFJMjRCLEtBQUt5aUIsT0FBT3Y2QyxTQUFTYixDQUMzQyxFQUVKLEVBekNBLEdDSEEsY0FNSSxXQUFZdzdDLEdBRVI3aUIsS0FBSzhpQixTQUFXRCxFQUVoQjdpQixLQUFLeWlCLE9BQVMsRUFBQXJrQyxPQUFBLE9BQWN5a0MsRUFBUXo3QyxFQUFHeTdDLEVBQVF4N0MsRUFBRSxFQUM3QyxDQUFDZ00sT0FBUSxDQUFDSSxVQUFXLFNBQVVuQixVQUFVLElBQzdDLEVBQUE1RCxLQUFBLFdBQWdCc3hCLEtBQUt5aUIsT0FBUSxHQUU3QnppQixLQUFLMmlCLFFBQVUsQ0FBQzNpQixLQUFLeWlCLE9BQ3pCLENBYUosT0FYSSxzQkFBSSxxQkFBTSxLQUFWLFdBRUksT0FBT3ppQixLQUFLMmlCLE9BQ2hCLGtDQUVBLFlBQUFDLGlCQUFBLFdBRUk1aUIsS0FBSzhpQixTQUFTMTdDLEVBQUk0NEIsS0FBS3lpQixPQUFPdjZDLFNBQVNkLEVBQ3ZDNDRCLEtBQUs4aUIsU0FBU3o3QyxFQUFJMjRCLEtBQUt5aUIsT0FBT3Y2QyxTQUFTYixDQUMzQyxFQUVKLEVBNUJBLEdDR0EsMkJBbUNBLFFBaENZLFlBQUEwN0MsYUFBUixTQUFxQkMsRUFBZ0JDLEdBRWpDLElBQU1DLEVBQVcsRUFBSUQsRUFDckIsT0FBT3IrQyxNQUFNd3pDLEtBQUt4ekMsTUFBTXErQyxFQUFpQixHQUFHcmhELFFBQVE2RCxLQUFJLFNBQUE5RyxHQUFLLE9BQUFxa0QsRUFBT3pqRCxJQUFJWixFQUFJdWtELEVBQWYsR0FDakUsRUFFVSxZQUFBQyxrQkFBVixTQUE0QmYsRUFBc0I3TyxHQUU5QyxJQUFNNlAsRUFBYzdELEVBQWdCaE0sR0FDOUI4UCxFQUFlcmpCLEtBQUsraUIsYUFBYSxJQUFJdlIsRUFBTzRSLEdBQWMsR0FFaEUsT0FBT0MsRUFDRnR5QyxRQUFPLFNBQUN1eUMsRUFBSW41QyxHQUFVLE9BQUFBLEVBQVFrNUMsRUFBYTloRCxPQUFTLENBQTlCLElBQ3RCa0UsS0FBSSxTQUFDNjlDLEVBQUluNUMsR0FFTixJQUFNbzVDLEVBQVUsRUFBQWw3QyxPQUFBLE9BQWNpN0MsRUFBR2w4QyxFQUFHazhDLEVBQUdqOEMsR0FDakNtOEMsRUFBTyxFQUFBbjdDLE9BQUEsT0FBY2c3QyxFQUFhbDVDLEVBQVEsR0FBRy9DLEVBQUdpOEMsRUFBYWw1QyxFQUFRLEdBQUc5QyxHQUd4RW84QyxHQUZZLEVBQUFwN0MsT0FBQSxVQUFpQixFQUFBQSxPQUFBLElBQVdtN0MsRUFBTUQsSUFFbkMsRUFBQWw3QyxPQUFBLFFBQWVrN0MsRUFBUW44QyxFQUFJbzhDLEVBQUtwOEMsR0FBSyxHQUFHbThDLEVBQVFsOEMsRUFBSW04QyxFQUFLbjhDLEdBQUssSUFDekVySSxFQUFJMHFDLEVBQWdCOFosRUFBTUQsR0FFaEMsT0FBTyxFQUFBbmxDLE9BQUEsVUFBaUJxbEMsRUFBU3I4QyxFQUFHcThDLEVBQVNwOEMsRUFBR3JJLEVBQUdvakQsRUFDL0MsQ0FDSTE1QyxNQUFPcWhDLEVBQVV5WixFQUFLcDhDLEVBQUdvOEMsRUFBS244QyxFQUFHazhDLEVBQVFuOEMsRUFBR204QyxFQUFRbDhDLElBRWhFLEdBQ1IsRUFLSixFQW5DQSx1Y0NEQSxlQVFJLFdBQVlrc0MsRUFBbUM2TyxHQUEvQyxNQUVJLGNBQU8sWUFFUCxFQUFLc0IsT0FBU25RLEVBRWQsRUFBS29QLFFBQVUsRUFBS1Esa0JBQWtCZixFQUFjN08sR0FFcEQsRUFBS29RLFFBQVUsRUFBQXZsQyxPQUFBLE9BQWNtMUIsRUFBTW5zQyxFQUFHbXNDLEVBQU1sc0MsRUFBRSxFQUMxQyxDQUFDaUwsVUFBVSxFQUFNZSxPQUFRLENBQUNJLFVBQVcsZUFDekMsRUFBQS9FLEtBQUEsV0FBZ0IsRUFBS2kxQyxRQUFTLEdBQzlCLEVBQUtoQixRQUFROWdELEtBQUssRUFBSzhoRCxTQUV2QixFQUFLQyxRQUFVLEVBQUF4bEMsT0FBQSxPQUFjbTFCLEVBQU01MEIsR0FBSTQwQixFQUFNMVYsR0FBRyxFQUM1QyxDQUFDdnJCLFVBQVUsRUFBTWUsT0FBUSxDQUFDSSxVQUFXLGVBQ3pDLEVBQUEvRSxLQUFBLFdBQWdCLEVBQUtrMUMsUUFBUyxHQUM5QixFQUFLakIsUUFBUTlnRCxLQUFLLEVBQUsraEQsU0FFdkIsRUFBS0MsUUFBVSxFQUFBemxDLE9BQUEsT0FBY20xQixFQUFNMzBCLEdBQUkyMEIsRUFBTXpWLEdBQUcsRUFDNUMsQ0FBQ3hyQixVQUFVLEVBQU1lLE9BQVEsQ0FBQ0ksVUFBVyxlQUN6QyxFQUFBL0UsS0FBQSxXQUFnQixFQUFLbTFDLFFBQVMsR0FDOUIsRUFBS2xCLFFBQVE5Z0QsS0FBSyxFQUFLZ2lELFVBQzNCLENBa0JKLE9BaEQrQixRQWdDM0Isc0JBQUkscUJBQU0sS0FBVixXQUVJLE9BQU83akIsS0FBSzJpQixPQUNoQixrQ0FFQSxZQUFBQyxpQkFBQSxXQUVJNWlCLEtBQUswakIsT0FBT3Q4QyxFQUFJNDRCLEtBQUsyakIsUUFBUXo3QyxTQUFTZCxFQUN0QzQ0QixLQUFLMGpCLE9BQU9yOEMsRUFBSTI0QixLQUFLMmpCLFFBQVF6N0MsU0FBU2IsRUFFdEMyNEIsS0FBSzBqQixPQUFPL2tDLEdBQUtxaEIsS0FBSzRqQixRQUFRMTdDLFNBQVNkLEVBQ3ZDNDRCLEtBQUswakIsT0FBTzdsQixHQUFLbUMsS0FBSzRqQixRQUFRMTdDLFNBQVNiLEVBRXZDMjRCLEtBQUswakIsT0FBTzlrQyxHQUFLb2hCLEtBQUs2akIsUUFBUTM3QyxTQUFTZCxFQUN2QzQ0QixLQUFLMGpCLE9BQU81bEIsR0FBS2tDLEtBQUs2akIsUUFBUTM3QyxTQUFTYixDQUMzQyxFQUNKLEVBaERBLENBQStCeThDLCtkQ0EvQixlQU9JLFdBQVl2USxFQUF5QzZPLEdBQXJELE1BRUksY0FBTyxZQUVQLEVBQUtzQixPQUFTblEsRUFFZCxFQUFLb1AsUUFBVSxFQUFLUSxrQkFBa0JmLEVBQWM3TyxHQUVwRCxFQUFLb1EsUUFBVSxFQUFBdmxDLE9BQUEsT0FBY20xQixFQUFNbnNDLEVBQUdtc0MsRUFBTWxzQyxFQUFFLEVBQzFDLENBQUNpTCxVQUFVLEVBQU1lLE9BQVEsQ0FBQ0ksVUFBVyxlQUN6QyxFQUFBL0UsS0FBQSxXQUFnQixFQUFLaTFDLFFBQVMsR0FDOUIsRUFBS2hCLFFBQVE5Z0QsS0FBSyxFQUFLOGhELFNBRXZCLEVBQUtFLFFBQVUsRUFBQXpsQyxPQUFBLE9BQWNtMUIsRUFBTTMwQixHQUFJMjBCLEVBQU16VixHQUFHLEVBQzVDLENBQUN4ckIsVUFBVSxFQUFNZSxPQUFRLENBQUNJLFVBQVcsZUFDekMsRUFBQS9FLEtBQUEsV0FBZ0IsRUFBS20xQyxRQUFTLEdBQzlCLEVBQUtsQixRQUFROWdELEtBQUssRUFBS2dpRCxVQUMzQixDQWdCSixPQXhDeUMsUUEwQnJDLHNCQUFJLHFCQUFNLEtBQVYsV0FFSSxPQUFPN2pCLEtBQUsyaUIsT0FDaEIsa0NBRUEsWUFBQUMsaUJBQUEsV0FFSTVpQixLQUFLMGpCLE9BQU90OEMsRUFBSTQ0QixLQUFLMmpCLFFBQVF6N0MsU0FBU2QsRUFDdEM0NEIsS0FBSzBqQixPQUFPcjhDLEVBQUkyNEIsS0FBSzJqQixRQUFRejdDLFNBQVNiLEVBRXRDMjRCLEtBQUswakIsT0FBTzlrQyxHQUFLb2hCLEtBQUs2akIsUUFBUTM3QyxTQUFTZCxFQUN2QzQ0QixLQUFLMGpCLE9BQU81bEIsR0FBS2tDLEtBQUs2akIsUUFBUTM3QyxTQUFTYixDQUMzQyxFQUVKLEVBeENBLENBQXlDeThDLCtkQ0F6QyxlQU9JLFdBQVl2USxFQUE0QzZPLEdBQXhELE1BRUksY0FBTyxZQUVQLEVBQUtzQixPQUFTblEsRUFFZCxFQUFLb1AsUUFBVSxFQUFLUSxrQkFBa0JmLEVBQWM3TyxHQUVwRCxFQUFLb1EsUUFBVSxFQUFBdmxDLE9BQUEsT0FBY20xQixFQUFNbnNDLEVBQUdtc0MsRUFBTWxzQyxFQUFFLEVBQzFDLENBQUNpTCxVQUFVLEVBQU1lLE9BQVEsQ0FBQ0ksVUFBVyxlQUN6QyxFQUFBL0UsS0FBQSxXQUFnQixFQUFLaTFDLFFBQVMsR0FDOUIsRUFBS2hCLFFBQVE5Z0QsS0FBSyxFQUFLOGhELFNBRXZCLEVBQUtDLFFBQVUsRUFBQXhsQyxPQUFBLE9BQWNtMUIsRUFBTTUwQixHQUFJNDBCLEVBQU0xVixHQUFHLEVBQzVDLENBQUN2ckIsVUFBVSxFQUFNZSxPQUFRLENBQUNJLFVBQVcsZUFDekMsRUFBQS9FLEtBQUEsV0FBZ0IsRUFBS2sxQyxRQUFTLEdBQzlCLEVBQUtqQixRQUFROWdELEtBQUssRUFBSytoRCxVQUMzQixDQWdCSixPQXhDd0MsUUEwQnBDLHNCQUFJLHFCQUFNLEtBQVYsV0FFSSxPQUFPNWpCLEtBQUsyaUIsT0FDaEIsa0NBRUEsWUFBQUMsaUJBQUEsV0FFSTVpQixLQUFLMGpCLE9BQU90OEMsRUFBSTQ0QixLQUFLMmpCLFFBQVF6N0MsU0FBU2QsRUFDdEM0NEIsS0FBSzBqQixPQUFPcjhDLEVBQUkyNEIsS0FBSzJqQixRQUFRejdDLFNBQVNiLEVBRXRDMjRCLEtBQUswakIsT0FBTy9rQyxHQUFLcWhCLEtBQUs0akIsUUFBUzE3QyxTQUFTZCxFQUN4QzQ0QixLQUFLMGpCLE9BQU83bEIsR0FBS21DLEtBQUs0akIsUUFBUzE3QyxTQUFTYixDQUM1QyxFQUVKLEVBeENBLENBQXdDeThDLElDQ3hDLGNBS0ksV0FBWUMsR0FFUi9qQixLQUFLZ2tCLFVBQVlELEVBR2pCLElBRU1wYSxFQUFLLEVBQUF0aEMsT0FBQSxPQUFjMDdDLEVBQVMzOEMsRUFBRzI4QyxFQUFTMThDLEdBQ3hDdWlDLEVBQUssRUFBQXZoQyxPQUFBLE9BQWMwN0MsRUFBU3BtQixHQUFJb21CLEVBQVNubUIsSUFFL0MsR0FBS2tNLEVBQWFILEVBQUlDLEdBZ0JsQjVKLEtBQUsyaUIsUUFBVSxPQWZuQixDQUNJLElBQU1MLEVBQWVqRCxFQUF3QjBFLEdBQ3ZDeEIsRUFBYTdDLEVBQXdCcUUsR0FDckN2QixFQUFZL0MsRUFBdUJzRSxHQUVuQzc1QyxFQUFPLEVBQUFrVSxPQUFBLFVBQ1Rra0MsRUFBYWw3QyxFQUFHazdDLEVBQWFqN0MsRUFBR2s3QyxFQVp6QixFQWFQLENBQ0k3NUMsTUFBTzg1QyxJQUdmeGlCLEtBQUsyaUIsUUFBVSxDQUFDejRDLEdBTXhCLENBWUosT0FWSSxzQkFBSSxxQkFBTSxLQUFWLFdBRUksT0FBTzgxQixLQUFLMmlCLE9BQ2hCLGtDQUVBLFlBQUFDLGlCQUFBLFdBR0EsRUFFSixFQTdDQSxHQ0dNbHlCLEdBQVMsU0FFVHRTLElBRFMsU0FDQSxVQUVmLGNBUUksV0FBWTZsQyxFQUFrQkMsRUFBMEJ2K0IsR0FBeEQsV0FFSXFhLEtBQUtta0IsU0FBV0YsRUFDaEJqa0IsS0FBS29rQixRQUFVMXpCLEdBQU8xd0IsU0FDdEJnZ0MsS0FBS3FrQixPQUFTcmtCLEtBQUtva0IsUUFBUTE1QixNQUMzQnNWLEtBQUtza0IsZUFBaUIsR0FDdEJ0a0IsS0FBS3VrQixTQUFXNStCLEVBQ2hCLElBQU02K0IsRUFBcUIsR0FFM0JQLEVBQVFRLG1CQUFtQmxsQixTQUFRLFNBQUFKLEdBRS9CLElBQU11bEIsRUFBT3ZsQixFQUNSMTVCLEtBQUksU0FBQWk2QixHQUFXLE9BQUEwZixFQUFvQjFmLEdBQVN0NEIsQ0FBN0IsSUFDZnlzQyxRQUFPLFNBQUM4USxFQUFLQyxHQUFRLE9BQUFELEVBQU1DLENBQU4sSUFBYXpsQixFQUFTNTlCLE9BQzFDc2pELEVBQU8xbEIsRUFDUjE1QixLQUFJLFNBQUFpNkIsR0FBVyxPQUFBMGYsRUFBb0IxZixHQUFTcjRCLENBQTdCLElBQ2Z3c0MsUUFBTyxTQUFDOFEsRUFBS0MsR0FBUSxPQUFBRCxFQUFNQyxDQUFOLElBQWF6bEIsRUFBUzU5QixPQUUxQ3VqRCxFQUFXMW1DLEdBQU9VLE9BQU80bEMsRUFBTUcsRUFBTSxJQUFNWCxHQUUzQ2EsRUFBZ0I1bEIsRUFBUzE1QixLQUFJLFNBQUFpNkIsR0FBVyxPQ2hDM0IsU0FBQ0EsRUFBMEIwaUIsR0FFdEQsT0FBUTFpQixFQUFRQyxNQUVaLElBQUssSUFFRCxPQUFPLElBQUlxbEIsR0FBU3RsQixFQUFTMGlCLEdBRWpDLElBQUssSUFFRCxPQUFPLElBQUk2QyxHQUFVdmxCLEdBRXpCLElBQUssSUFFRCxPQUFPLElBQUl3bEIsR0FBVXhsQixFQUFTMGlCLEdBRWxDLElBQUssSUFFRCxPQUFPLElBQUkrQyxHQUFtQnpsQixFQUFTMGlCLEdBRTNDLElBQUssSUFFRCxPQUFPLElBQUlnRCxHQUFvQjFsQixFQUFTMGlCLEdBRTVDLElBQUssSUFFRCxNQUFNLElBQUluaUIsTUFBTSx3QkFFcEIsSUFBSyxJQUVELE9BQU8sSUFBSW9sQixHQUFjM2xCLEdBR3JDLENERDBENGxCLENBQWdCNWxCLEVBQVN3a0IsRUFBYXFCLGNBQXRDLElBQzlDLEVBQUtqQixlQUFpQixFQUFLQSxlQUFlMy9DLE9BQU9vZ0QsR0FFakQsSUFBTVMsRUFBYVQsRUFBY3QvQyxLQUFJLFNBQUFnZ0QsR0FBWSxPQUFBQSxFQUFTejJDLE1BQVQsSUFBaUIrOUIsU0FBUSxTQUFBN2lDLEdBQVEsT0FBQUEsQ0FBQSxJQUNsRixFQUFBd0UsS0FBQSxTQUFjbzJDLEVBQVVVLEdBQVksR0FDcEMsRUFBQXh2QixNQUFBLElBQVUsRUFBS3F1QixPQUFRUyxHQUV2Qk4sRUFBVzNpRCxLQUFLaWpELEVBQ3BCLElBRUFuL0IsRUFBUTRaLFNBQVEsU0FBQW53QixHQUFVLE9BQUFBLEVBQU9zMkMsTUFBTXpCLEVBQVMsRUFBS0csUUFBU0ksRUFBcEMsR0FDOUIsQ0FjSixPQVpJLFlBQUFsOUMsT0FBQSxTQUFPcStDLEdBR0hqMUIsR0FBT3BwQixPQUFPMDRCLEtBQUtva0IsU0FDbkJwa0IsS0FBS3NrQixlQUFlL2tCLFNBQVEsU0FBQXIxQixHQUFRLE9BQUFBLEVBQUswNEMsa0JBQUwsR0FDeEMsRUFFQSxZQUFBaDRCLEtBQUEsV0FFSW9WLEtBQUt1a0IsU0FBU2hsQixTQUFRLFNBQUFud0IsR0FBVSxPQUFBQSxFQUFPd2IsTUFBUCxHQUNwQyxFQUVKLEVBckRBLEdFWEEsY0FZSSxXQUFZZzdCLEVBQWtCeEUsRUFBdUNxRCxHQUVqRXprQixLQUFLNmxCLEtBQU9ELEVBRVo1bEIsS0FBSzhsQixhQUFlLEdBQ3BCOWxCLEtBQUsrbEIsT0FBU0gsRUFBSTFpQyxZQUNsQjhjLEtBQUtnbUIsUUFBVUosRUFBSXppQyxhQUVuQjZjLEtBQUtpbUIsY0FBZ0I3RSxFQUNyQnBoQixLQUFLa21CLG9CQUFzQnpCLEVBRTNCLElBQU0wQixFQUFnQlAsRUFBSTFrQyxhQUFhLFdBQ3ZDLEdBQXNCLE9BQWxCaWxDLEVBQUosQ0FJQSxJQUFNcmtELEVBQVNxa0QsRUFBY2prRCxNQUFNLFFBQVE2TyxPQUFPNE8sU0FBU2xhLElBQUl5VSxRQUUvRDhsQixLQUFLb21CLFNBQVcsQ0FBQ0MsS0FBTXZrRCxFQUFPLEdBQUl3a0QsS0FBTXhrRCxFQUFPLEdBQUl3YyxNQUFPeGMsRUFBTyxHQUFJeWMsT0FBUXpjLEVBQU8sSUFDeEYsQ0FxQ0osT0FuQ0ksc0JBQUksMkJBQVksS0FBaEIsV0FFSSxPQUFPaytCLEtBQUtpbUIsYUFDaEIsa0NBRUEsc0JBQUksaUNBQWtCLEtBQXRCLFdBRUksT0FBT2ptQixLQUFLa21CLG1CQUNoQixrQ0FFQSxzQkFBSSxrQkFBRyxLQUFQLFdBRUksT0FBT2xtQixLQUFLNmxCLElBQ2hCLGtDQUVBLHNCQUFJLG9CQUFLLEtBQVQsV0FFSSxPQUFPN2xCLEtBQUsrbEIsTUFDaEIsa0NBRUEsc0JBQUkscUJBQU0sS0FBVixXQUVJLE9BQU8vbEIsS0FBS2dtQixPQUNoQixrQ0FFQSxzQkFBSSxzQkFBTyxLQUFYLFdBRUksT0FBT2htQixLQUFLb21CLFFBQ2hCLGtDQUdBLHNCQUFJLGtDQUFtQixLQUF2QixXQUVJLE9BQU9wbUIsS0FBSzhsQixZQUNoQixrQ0FDSixFQXBFQSxHQzZEQSxHQVVJLFNBQVkxK0MsRUFBV0MsRUFBV3MyQixFQUFZQyxHQUUxQ29DLEtBQUtMLEtBQU8sSUFDWkssS0FBS2hxQixVQUFXLEVBQ2hCZ3FCLEtBQUtOLFFBQVUsU0FDZk0sS0FBSzU0QixFQUFJQSxFQUNUNDRCLEtBQUszNEIsRUFBSUEsRUFDVDI0QixLQUFLckMsR0FBS0EsRUFDVnFDLEtBQUtwQyxHQUFLQSxDQUNkLFlDL0VKLGNBSUksV0FBWTVNLEdBRVJnUCxLQUFLdW1CLFNBQVd2MUIsQ0FDcEIsQ0FhSixPQVhJLFlBQUEwMEIsTUFBQSxTQUFNekIsRUFBa0JyOEIsRUFBZ0I0OEIsR0FFcEM1OEIsRUFBT29KLFFBQVE1cEIsRUFBSTQ0QixLQUFLdW1CLFNBQVNuL0MsRUFDakN3Z0IsRUFBT29KLFFBQVEzcEIsRUFBSTI0QixLQUFLdW1CLFNBQVNsL0MsQ0FDckMsRUFFQSxZQUFBdWpCLEtBQUEsV0FHQSxFQUVKLEVBcEJBLEdDQUEsMkJBZ0ZBLFFBOUVJLFlBQUE4NkIsTUFBQSxTQUFNekIsRUFBa0JyOEIsRUFBZ0I0OEIsR0FFcEMsSUFBTTk1QixFQUFROUMsRUFBTzhDLE1BRWpCcE0sRUFBUTJsQyxFQUFRM2xDLE1BQ2hCQyxFQUFTMGxDLEVBQVExbEMsT0FDakJpb0MsRUFBVSxFQUNWQyxFQUFVLEVBQ1JDLEVBQVcsSUFFakIsUUFBd0Jua0MsSUFBcEIwaEMsRUFBUTBDLFFBQ1osQ0FDSSxJQUFNQyxFQUFXM0MsRUFBUTBDLFFBQVFyb0MsTUFDM0J1b0MsRUFBVzVDLEVBQVEwQyxRQUFRcG9DLE9BQzNCdW9DLEVBQVlGLEVBQVVDLEVBQVlBLEVBQVdELEVBQVlBLEVBQVVDLEVBQ25FRSxFQUFVem9DLEVBQVFDLEVBQVVBLEVBQVNELEVBQVVBLEVBQVFDLEVBRXpERCxFQUFRQyxFQUVKcW9DLEVBQVVDLEdBRVZ0b0MsRUFBU3NvQyxHQUFZLEVBQUlFLEdBQVdELEVBQ3BDeG9DLEVBQVFzb0MsSUFJUnJvQyxFQUFTc29DLEVBQVdFLEVBQVVELEVBQzlCeG9DLEVBQVFzb0MsR0FLUkEsRUFBVUMsR0FFVnZvQyxFQUFTc29DLEVBQVVHLEVBQVVELEVBQzdCdm9DLEVBQVNzb0MsSUFJVHZvQyxFQUFTc29DLEdBQVcsRUFBSUcsR0FBV0QsRUFDbkN2b0MsRUFBU3NvQyxHQUlqQkwsRUFBVXZDLEVBQVEwQyxRQUFRTixNQUFRL25DLEVBQVFzb0MsR0FBVyxFQUNyREgsRUFBVXhDLEVBQVEwQyxRQUFRTCxNQUFRL25DLEVBQVNzb0MsR0FBWSxFQUczRCxJQUFNaFcsRUFBUyxFQUFBenlCLE9BQUEsVUFDVkUsRUFBUSxFQUFLa29DLEVBQ2Rqb0MsRUFBUyxHQUFpQmtvQyxFQUMxQm5vQyxFQUFPb29DLEVBQVUsQ0FBQzExQyxVQUFVLElBQ2hDLEVBQUFnbEIsTUFBQSxJQUFVdEwsRUFBT21tQixHQUVqQixJQUFNNXRCLEVBQU0sRUFBQTdFLE9BQUEsVUFDUEUsRUFBUSxFQUFNa29DLEdBQ2QsR0FBaUJDLEVBQ2xCbm9DLEVBQU9vb0MsRUFBVSxDQUFDMTFDLFVBQVUsSUFDaEMsRUFBQWdsQixNQUFBLElBQVV0TCxFQUFPekgsR0FFakIsSUFBTUYsRUFBTyxFQUFBM0UsT0FBQSxXQUNSLEdBQWlCb29DLEVBQ2pCam9DLEVBQVMsRUFBTWtvQyxFQUNoQkMsRUFBVW5vQyxFQUFRLENBQUN2TixVQUFVLElBQ2pDLEVBQUFnbEIsTUFBQSxJQUFVdEwsRUFBTzNILEdBRWpCLElBQU15ekIsRUFBUSxFQUFBcDRCLE9BQUEsVUFDVkUsRUFBUSxHQUFpQmtvQyxFQUN4QmpvQyxFQUFTLEVBQUtrb0MsRUFDZkMsRUFBVW5vQyxFQUFRLENBQUN2TixVQUFVLElBQ2pDLEVBQUFnbEIsTUFBQSxJQUFVdEwsRUFBTzhyQixFQUNyQixFQUVBLFlBQUE1ckIsS0FBQSxXQUdBLEVBRUosRUFoRkEsR0NBQSxjQU1JLFdBQVlvOEIsR0FFUmhuQixLQUFLaW5CLFlBQWNELENBQ3ZCLENBK0JKLE9BN0JJLFlBQUF0QixNQUFBLFNBQU16QixFQUFrQnI4QixFQUFnQjQ4QixHQUF4QyxXQUVVOTVCLEVBQVE5QyxFQUFPOEMsTUFFckJ1NUIsRUFBUTJCLElBQUkvakMsaUJBQWlCLGFBQWEsU0FBQXFsQyxHQUV0QyxFQUFLQyxVQUFZLEVBQUE5K0MsT0FBQSxPQUFjNitDLEVBQUdWLFFBQVNVLEVBQUdULFFBQ2xELElBRUEsRUFBQTU0QyxPQUFBLEdBQVUrWixFQUFRLGVBQWUsZ0JBRUVyRixJQUEzQixFQUFLNmtDLHdCQUFzRDdrQyxJQUFuQixFQUFLNGtDLFdBRTlCLEVBQUF2eEIsTUFBQSxNQUFZLEVBQUFubkIsVUFBQSxVQUFvQmljLEdBQVEsRUFBS3k4QixXQUNyRDVuQixTQUFRLFNBQUFyMUIsR0FFWCxJQUFNMlEsRUFBWSxFQUFBeFMsT0FBQSxVQUFpQixFQUFBQSxPQUFBLElBQVcsRUFBSzgrQyxVQUFZLEVBQUtDLG9CQUNwRSxFQUFBMTRDLEtBQUEsV0FBZ0J4RSxFQUFNLEVBQUtpOUMsVUFBWSxFQUFBOStDLE9BQUEsS0FBWXdTLEVBQVcsRUFBS29zQyxhQUN2RSxJQUdKLEVBQUtHLGtCQUFvQixFQUFLRCxTQUNsQyxHQUNKLEVBRUEsWUFBQXY4QixLQUFBLFdBR0EsRUFDSixFQXhDQSxHQ0FBLGNBS0ksV0FBWXk4QixHQUVScm5CLEtBQUtzbkIsb0JBQXNCRCxDQUMvQixDQXlDSixPQXZDSSxZQUFBM0IsTUFBQSxTQUFNekIsRUFBa0JzRCxFQUFvQi9DLEdBRXhDLElBQUlnRCxFQUFnQjdtQyxTQUFTelcsS0FFSSxNQUE3Qis1QyxFQUFRMkIsSUFBSTZCLGdCQUVaRCxFQUFnQnZELEVBQVEyQixJQUFJNkIsb0JBR0NsbEMsSUFBN0J5ZCxLQUFLc25CLHNCQUVMRSxFQUFnQnhuQixLQUFLc25CLHFCQUl6QnRuQixLQUFLMG5CLFVBQVksRUFBQTdnQyxPQUFBLE9BQWMsQ0FDM0JwRyxRQUFTK21DLEVBQ1Q1L0IsT0FBUTIvQixFQUNSNTRDLFFBQVMsQ0FDTG1hLFlBQVksRUFDWnhLLE1BQU8ybEMsRUFBUTNsQyxNQUNmQyxPQUFRMGxDLEVBQVExbEMsT0FFaEJrTCxvQkFBb0IsS0FJNUIsRUFBQTVDLE9BQUEsSUFBV21aLEtBQUswbkIsVUFDcEIsRUFHQSxZQUFBOThCLEtBQUEsZ0JBRTJCckksSUFBbkJ5ZCxLQUFLMG5CLFlBRUwsRUFBQTdnQyxPQUFBLEtBQVltWixLQUFLMG5CLFdBQ2pCMW5CLEtBQUswbkIsVUFBVTcvQixPQUFPMVgsU0FFOUIsRUFDSixFQWpEQSxHQ2NhdzNDLEdBQW1CLFNBQUNqb0IsR0FFN0IsT0FBUUEsRUFBUUMsTUFFWixJQUFLLElBRUQsSUFBTTF1QixFQUFPeXVCLEVBQ2IsTUFBTyxZQUFLenVCLEVBQUs3SixFQUFFOFcsUUFBUSxHQUFFLFlBQUlqTixFQUFLNUosRUFBRTZXLFFBQVEsSUFFcEQsSUFBSyxJQUVELElBQU13bUIsRUFBT2hGLEVBQ2IsTUFBTyxZQUFLZ0YsRUFBS3Q5QixFQUFFOFcsUUFBUSxHQUFFLFlBQUl3bUIsRUFBS3I5QixFQUFFNlcsUUFBUSxJQUVwRCxJQUFLLElBRUQsTUFBTyxJQUVYLElBQUssSUFHRCxNQUFPLGFBRERxMUIsRUFBUTdULEdBQ0kvZ0IsR0FBR1QsUUFBUSxHQUFFLFlBQUlxMUIsRUFBTTFWLEdBQUczZixRQUFRLEdBQUUsWUFBSXExQixFQUFNMzBCLEdBQUdWLFFBQVEsR0FBRSxZQUFJcTFCLEVBQU16VixHQUFHNWYsUUFBUSxHQUFFLGFBQUtxMUIsRUFBTW5zQyxFQUFFOFcsUUFBUSxHQUFFLFlBQUlxMUIsRUFBTWxzQyxFQUFFNlcsUUFBUSxJQUVuSixJQUFLLElBR0QsTUFBTyxhQUREcTFCLEVBQVE3VCxHQUNJOWdCLEdBQUdWLFFBQVEsR0FBRSxZQUFJcTFCLEVBQU16VixHQUFHNWYsUUFBUSxHQUFFLGFBQUtxMUIsRUFBTW5zQyxFQUFFOFcsUUFBUSxHQUFFLFlBQUlxMUIsRUFBTWxzQyxFQUFFNlcsUUFBUSxJQUVyRyxJQUFLLElBRUQsSUFBTXExQixFQUNOLE1BQU8sYUFEREEsRUFBUTdULEdBQ0kvZ0IsR0FBR1QsUUFBUSxHQUFFLFlBQUlxMUIsRUFBTTFWLEdBQUczZixRQUFRLEdBQUUsWUFBSXExQixFQUFNbnNDLEVBQUU4VyxRQUFRLEdBQUUsWUFBSXExQixFQUFNbHNDLEVBQUU2VyxRQUFRLElBRXBHLFFBRUksTUFBTSxJQUFJK2hCLE1BQU0sa0NBQTJCUCxFQUFRQyxPQUcvRCxFQ25EQSwyQkFFWSxLQUFBaW9CLFVBQVcsQ0E0QnZCLFFBMUJJLFlBQUFDLFdBQUEsU0FBVzVELEVBQWtCNkQsR0FFekIsSUFBTUMsRUFBV25qRCxNQUFNdEUsVUFBVTZCLE1BQU10RCxLQUFLb2xELEVBQVEyQixJQUFJb0MscUJBQXFCLFNBQzdFaG9CLEtBQUtpb0IsWUFBWWhFLEVBQVM2RCxFQUFTQyxFQUN2QyxFQUVBLFlBQUFFLFlBQUEsU0FBWWhFLEVBQWtCNkQsRUFBMEJDLEdBQXhELFdBRUlELEVBQVF4Z0QsT0FBTzI4QyxFQUFRUSxvQkFFdkJSLEVBQVM3QyxhQUFhN2hCLFNBQVEsU0FBQ0osRUFBcUJoMUIsR0FFaEQsSUFBTSs5QyxFQUFhL29CLEVBQVMxNUIsSUFBSWtpRCxJQUFrQjFpRCxLQUFLLEtBQ3ZEOGlELEVBQVM1OUMsR0FBTzJnQixhQUFhLElBQUtvOUIsRUFDdEMsSUFFS2xvQixLQUFLNG5CLFVBRU45akQsT0FBT2tqQix1QkFBc0IsU0FBQ3BuQixHQUFNLFNBQUtxb0QsWUFBWWhFLEVBQVM2RCxFQUFTQyxFQUFuQyxHQUU1QyxFQUVBLFlBQUFuOUIsS0FBQSxXQUVJb1YsS0FBSzRuQixVQUFXLENBQ3BCLEVBQ0osRUE5QkEsR0NEQSxjQU9JLFdBQVk5MUMsR0FFUmt1QixLQUFLbW9CLE9BQVNyMkMsQ0FDbEIsQ0E2QkosT0EzQkksWUFBQTR6QyxNQUFBLFNBQU16QixFQUFrQnNELEVBQW9CL0MsR0FBNUMsV0FFVTk1QixFQUFRNjhCLEVBQVc3OEIsTUFFekJzVixLQUFLb29CLFVBQVksU0FBQ2xCLEdBQU8sU0FBS21CLFdBQWEsRUFBQWhnRCxPQUFBLE9BQWN2RSxPQUFPd2UsUUFBU3hlLE9BQU80ZSxRQUF2RCxFQUN6QjVlLE9BQU8rZCxpQkFBaUIsU0FBVW1lLEtBQUtvb0IsV0FFdkMsRUFBQXY2QyxPQUFBLEdBQVUwNUMsRUFBWSxlQUFlLGdCQUVUaGxDLElBQXBCLEVBQUs4bEMsaUJBQXdEOWxDLElBQTVCLEVBQUsrbEMsb0JBRXZCLEVBQUE3NUMsVUFBQSxVQUFvQmljLEdBQzVCNlUsU0FBUSxTQUFBcjFCLEdBRVgsSUFBTTJRLEVBQVksRUFBQXhTLE9BQUEsVUFBaUIsRUFBQUEsT0FBQSxJQUFXLEVBQUtnZ0QsV0FBYSxFQUFLQyxxQkFDckUsRUFBQTU1QyxLQUFBLFdBQWdCeEUsRUFBTUEsRUFBS2hDLFNBQVUsRUFBQUcsT0FBQSxLQUFZd1MsRUFBVyxFQUFLc3RDLFFBQ3JFLElBR0osRUFBS0csbUJBQXFCLEVBQUtELFVBQ25DLEdBQ0osRUFFQSxZQUFBejlCLEtBQUEsV0FFSTltQixPQUFPeWtELG9CQUFvQixTQUFVdm9CLEtBQUtvb0IsVUFDOUMsRUFDSixFQXZDQSxHQ0FBLGNBSUksV0FBWUksR0FFUnhvQixLQUFLeW9CLFVBQVlELENBQ3JCLENBc0NKLE9BcENJLFlBQUE5QyxNQUFBLFNBQU16QixFQUFrQnI4QixFQUFnQjQ4QixHQUF4QyxXQTJCSSxFQUFBMzJDLE9BQUEsR0FBVStaLEVBQVEsZ0JBekJJLFdBRWxCNDhCLEVBQVdqbEIsU0FBUSxTQUFBcjFCLEdBRVhBLEVBQUszQyxTQUFTSCxFQUFJLEVBQUtxaEQsV0FFdkIsRUFBQS81QyxLQUFBLFlBQWlCeEUsRUFBTSxDQUFDOUMsRUFBRyxFQUFLcWhELFVBQVdwaEQsRUFBRzZDLEVBQUszQyxTQUFTRixJQUc1RDZDLEVBQUszQyxTQUFTSCxHQUFLLEVBQUtxaEQsV0FFeEIsRUFBQS81QyxLQUFBLFlBQWlCeEUsRUFBTSxDQUFDOUMsR0FBSSxFQUFLcWhELFVBQVdwaEQsRUFBRzZDLEVBQUszQyxTQUFTRixJQUc3RDZDLEVBQUszQyxTQUFTRixFQUFJLEVBQUtvaEQsV0FFdkIsRUFBQS81QyxLQUFBLFlBQWlCeEUsRUFBTSxDQUFDOUMsRUFBRzhDLEVBQUszQyxTQUFTSCxFQUFHQyxFQUFHLEVBQUtvaEQsWUFHcER2K0MsRUFBSzNDLFNBQVNGLEdBQUssRUFBS29oRCxXQUV4QixFQUFBLzVDLEtBQUEsWUFBaUJ4RSxFQUFNLENBQUM5QyxHQUFJOEMsRUFBSzNDLFNBQVNILEVBQUdDLEdBQUksRUFBS29oRCxXQUU5RCxHQUNKLEdBRUosRUFHQSxZQUFBNzlCLEtBQUEsV0FHQSxFQUVKLEVBN0NBLEdDQUEsY0FJSSxXQUFZNDlCLEdBRVJ4b0IsS0FBS3lvQixVQUFZRCxDQUNyQixDQTBCSixPQXhCSSxZQUFBOUMsTUFBQSxTQUFNekIsRUFBa0JyOEIsRUFBZ0I0OEIsR0FBeEMsV0FnQkksRUFBQTMyQyxPQUFBLEdBQVUrWixFQUFRLGdCQWRJLFdBRWxCNDhCLEVBQVdqbEIsU0FBUSxTQUFBcjFCLEdBRVhBLEVBQUttSSxnQkFBa0IsRUFBS28yQyxXQUU1QixFQUFBLzVDLEtBQUEsbUJBQXdCeEUsRUFBTSxFQUFLdStDLFdBRW5DditDLEVBQUttSSxpQkFBbUIsRUFBS28yQyxXQUU3QixFQUFBLzVDLEtBQUEsbUJBQXdCeEUsR0FBTyxFQUFLdStDLFVBRTVDLEdBQ0osR0FFSixFQUdBLFlBQUE3OUIsS0FBQSxXQUdBLEVBQ0osRUFqQ0EsR0NEQSxjQUtJLFdBQVlrOUIsRUFBMEJZLEdBRWxDMW9CLEtBQUsyb0IsU0FBV2IsRUFDaEI5bkIsS0FBSzBuQixVQUFZZ0IsQ0FDckIsQ0FPSixPQUxXLFlBQUE5OUIsS0FBUCxXQUVJb1YsS0FBSzBuQixVQUFVOThCLE9BQ2ZvVixLQUFLMm9CLFNBQVMvOUIsTUFDbEIsRUFDSixFQWhCQSxHQ2NBLGNBTUksV0FBWWcrQixFQUF3QmhELEdBRWhDNWxCLEtBQUs2b0IsWUFBY0QsRUFDbkI1b0IsS0FBSzZsQixLQUFPRCxFQUNaNWxCLEtBQUt1a0IsU0FBVyxFQUNwQixDQXlFSixPQXZFVyxZQUFBdUUsWUFBUCxTQUFtQjkzQixHQUdmLE9BREFnUCxLQUFLdWtCLFNBQVMxaUQsS0FBSyxJQUFJa25ELEdBQWMvM0IsSUFDOUJnUCxJQUNYLEVBRU8sWUFBQWdwQixtQkFBUCxXQUdJLE9BREFocEIsS0FBS3VrQixTQUFTMWlELEtBQUssSUFBSW9uRCxJQUNoQmpwQixJQUNYLEVBRU8sWUFBQWtwQixxQkFBUCxTQUE0QmxDLEdBR3hCLE9BREFobkIsS0FBS3VrQixTQUFTMWlELEtBQUssSUFBSXNuRCxHQUFZbkMsSUFDNUJobkIsSUFDWCxFQUVPLFlBQUFvcEIsc0JBQVAsU0FBNkJDLEdBR3pCLE9BREFycEIsS0FBS3VrQixTQUFTMWlELEtBQUssSUFBSXluRCxHQUFhRCxJQUM3QnJwQixJQUNYLEVBRU8sWUFBQXVwQixrQkFBUCxTQUF5QmxDLEdBR3JCLE9BREFybkIsS0FBS3VrQixTQUFTMWlELEtBQUssSUFBSTJuRCxHQUFlbkMsSUFDL0JybkIsSUFDWCxFQUVPLFlBQUF5cEIsaUJBQVAsU0FBd0JyNkMsR0FHcEIsT0FEQTR3QixLQUFLdWtCLFNBQVMxaUQsS0FBS3VOLEdBQ1o0d0IsSUFDWCxFQUVPLFlBQUEwcEIsd0JBQVAsU0FBK0JsQixHQUczQixPQURBeG9CLEtBQUt1a0IsU0FBUzFpRCxLQUFLLElBQUk4bkQsR0FBb0JuQixJQUNwQ3hvQixJQUNYLEVBRU8sWUFBQTRwQiwrQkFBUCxTQUFzQ3BCLEdBR2xDLE9BREF4b0IsS0FBS3VrQixTQUFTMWlELEtBQUssSUFBSWdvRCxHQUEyQnJCLElBQzNDeG9CLElBQ1gsRUFFTyxZQUFBOHBCLGdCQUFQLFNBQXVCQyxHQUVuQixJQUFNOUYsRUFBVWprQixLQUFLZ3FCLGdCQUNmbEMsRUFBVSxJQUFJbUMsR0FBZ0JoRyxFQUFTOEYsRUFBUS9wQixLQUFLdWtCLFVBRXBEbUUsRUFBVyxJQUFJd0IsR0FHckIsT0FGQXhCLEVBQVNiLFdBQVc1RCxFQUFTNkQsR0FFdEIsSUFBSXFDLEdBQWdCckMsRUFBU1ksRUFDeEMsRUFFUSxZQUFBc0IsY0FBUixXQUVJLElBRU1JLEVBRlF4bEQsTUFBTXRFLFVBQVU2QixNQUFNdEQsS0FBS21oQyxLQUFLNmxCLEtBQUttQyxxQkFBcUIsU0FHbkV2aUQsS0FBSSxTQUFBMUQsR0FBUSxPQUFBQSxFQUFLbWYsYUFBYSxJQUFsQixJQUNaemIsS0FBSSxTQUFBeWlELEdBQWMsT0FBZSxLQUFBaHBCLGVBQWEsS0FBQUQsVUFBU2lwQixJWHRFM0RuM0MsUUFBTyxTQUFBMnVCLEdBRUosTUFFUyxNQUZEQSxFQUFRQyxNQUtpQyxJQUFyQytmLEVBQXdCaGdCLEVBT3hDLElBQ0NqNkIsS0FBSSxTQUFBaTZCLEdBRUQsT0FBUUEsRUFBUUMsTUFFWixJQUFLLElBSUwsSUFBSyxJQUVELE9BQU8sSUFBSTBxQixHQUFLM3FCLEVBQVF0NEIsRUFBR3M0QixFQUFRcjRCLEVBQUdxNEIsRUFBUS9CLEdBQUkrQixFQUFROUIsSUFFOUQsSUFBSyxJQUVELE1BQU0sSUFBSXFDLE1BQU0sdUJBRXBCLFFBRUksT0FBT1AsRUFHbkIsR1drQ3VCLElBRWpCK2tCLEVBQXFCemtCLEtBQUs2b0IsWUFBWTFILFVBQVVpSixHQUV0RCxPQUFPLElBQUlFLEdBQVF0cUIsS0FBSzZsQixLQUFNdUUsRUFBa0IzRixFQUNwRCxFQUNKLEVBcEZBLEdDWkEsY0FJSSxXQUFZbUIsR0FFUjVsQixLQUFLNmxCLEtBQU9ELENBQ2hCLENBaUJKLE9BZkksWUFBQTJFLHVCQUFBLFdBRUksT0FBTyxJQUFJQyxHQUFrQixJQUFJQyxHQUF1QnpxQixLQUFLNmxCLEtBQ2pFLEVBRUEsWUFBQTZFLGtCQUFBLFdBRUksT0FBTyxJQUFJRixHQUFrQixJQUFJRyxHQUFrQjNxQixLQUFLNmxCLEtBQzVELEVBRUEsWUFBQStFLG9CQUFBLFNBQW9CaEMsR0FFaEIsT0FBTyxJQUFJNEIsR0FBa0I1QixFQUFZNW9CLEtBQUs2bEIsS0FDbEQsRUFFSixFQXhCQSxHQ0FhZ0YsR0FBYyxTQUFDakYsR0FFeEIsT0FBTyxJQUFJa0YsR0FBa0JsRixFQUNqQyIsInNvdXJjZXMiOlsid2VicGFjazovL3BoeXNpY2FsU3ZnL3dlYnBhY2svdW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbiIsIndlYnBhY2s6Ly9waHlzaWNhbFN2Zy8uL25vZGVfbW9kdWxlcy9tYXR0ZXItanMvYnVpbGQvbWF0dGVyLmpzIiwid2VicGFjazovL3BoeXNpY2FsU3ZnLy4vbm9kZV9tb2R1bGVzL3N2Zy1wYXRoLXBhcnNlci9pbmRleC5qcyIsIndlYnBhY2s6Ly9waHlzaWNhbFN2Zy8uL25vZGVfbW9kdWxlcy9zdmctcGF0aC1wYXJzZXIvcGFyc2VyLmpzIiwid2VicGFjazovL3BoeXNpY2FsU3ZnL3dlYnBhY2svYm9vdHN0cmFwIiwid2VicGFjazovL3BoeXNpY2FsU3ZnL3dlYnBhY2svcnVudGltZS9kZWZpbmUgcHJvcGVydHkgZ2V0dGVycyIsIndlYnBhY2s6Ly9waHlzaWNhbFN2Zy93ZWJwYWNrL3J1bnRpbWUvZ2xvYmFsIiwid2VicGFjazovL3BoeXNpY2FsU3ZnL3dlYnBhY2svcnVudGltZS9oYXNPd25Qcm9wZXJ0eSBzaG9ydGhhbmQiLCJ3ZWJwYWNrOi8vcGh5c2ljYWxTdmcvd2VicGFjay9ydW50aW1lL21ha2UgbmFtZXNwYWNlIG9iamVjdCIsIndlYnBhY2s6Ly9waHlzaWNhbFN2Zy8uL3NyYy9iYXNlL21hdGhfdXRpbHMudHMiLCJ3ZWJwYWNrOi8vcGh5c2ljYWxTdmcvLi9zcmMvYWdyZWdhdG9yL2NvbGxpc2lvbi9saW5lX2xpbmVfaW50ZXJzZWN0b3IudHMiLCJ3ZWJwYWNrOi8vcGh5c2ljYWxTdmcvLi9ub2RlX21vZHVsZXMvdXVpZC9kaXN0L2VzbS1icm93c2VyL25hdGl2ZS5qcyIsIndlYnBhY2s6Ly9waHlzaWNhbFN2Zy8uL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvZXNtLWJyb3dzZXIvcm5nLmpzIiwid2VicGFjazovL3BoeXNpY2FsU3ZnLy4vbm9kZV9tb2R1bGVzL3V1aWQvZGlzdC9lc20tYnJvd3Nlci9zdHJpbmdpZnkuanMiLCJ3ZWJwYWNrOi8vcGh5c2ljYWxTdmcvLi9ub2RlX21vZHVsZXMvdXVpZC9kaXN0L2VzbS1icm93c2VyL3Y0LmpzIiwid2VicGFjazovL3BoeXNpY2FsU3ZnLy4vc3JjL2FncmVnYXRvci9jb2xsaXNpb24vdHJlZS9hZ2dyZWdhdGlvbl9ub2RlLnRzIiwid2VicGFjazovL3BoeXNpY2FsU3ZnLy4vc3JjL2FncmVnYXRvci9jb2xsaXNpb24vdHJlZS9hZ2dyZWdhdGlvbl90cmVlLnRzIiwid2VicGFjazovL3BoeXNpY2FsU3ZnLy4vc3JjL2FncmVnYXRvci9jb2xsaXNpb24vbGluZV9wb2ludF9pbnRlcnNlY3Rvci50cyIsIndlYnBhY2s6Ly9waHlzaWNhbFN2Zy8uL3NyYy9iZXppZXJqcy9iZXppZXIuanMiLCJ3ZWJwYWNrOi8vcGh5c2ljYWxTdmcvLi9zcmMvYmFzZS9jb21tYW5kX3V0aWxzLnRzIiwid2VicGFjazovL3BoeXNpY2FsU3ZnLy4vc3JjL2FncmVnYXRvci9jb2xsaXNpb24vbGluZV9jdXJ2ZV9pbnRlcnNlY3Rvci50cyIsIndlYnBhY2s6Ly9waHlzaWNhbFN2Zy8uL3NyYy9hZ3JlZ2F0b3IvY29sbGlzaW9uL2N1cnZlX2N1cnZlX2ludGVyc2VjdG9yLnRzIiwid2VicGFjazovL3BoeXNpY2FsU3ZnLy4vc3JjL2FncmVnYXRvci9jb2xsaXNpb24vY3VydmVfcG9pbnRfaW50ZXJzZWN0b3IudHMiLCJ3ZWJwYWNrOi8vcGh5c2ljYWxTdmcvLi9zcmMvYWdyZWdhdG9yL2NvbGxpc2lvbi9wb2ludF9wb2ludF9pbnRlcnNlY3Rvci50cyIsIndlYnBhY2s6Ly9waHlzaWNhbFN2Zy8uL3NyYy9hZ3JlZ2F0b3IvY29sbGlzaW9uX2FnZ3JlZ2F0b3IudHMiLCJ3ZWJwYWNrOi8vcGh5c2ljYWxTdmcvLi9zcmMvYWdyZWdhdG9yL3BhdGhfYWdncmVnYXRvci50cyIsIndlYnBhY2s6Ly9waHlzaWNhbFN2Zy8uL3NyYy9waHlzaWNzL2JvZHkvbGluZV9ib2R5LnRzIiwid2VicGFjazovL3BoeXNpY2FsU3ZnLy4vc3JjL3BoeXNpY3MvYm9keS9wb2ludF9ib2R5LnRzIiwid2VicGFjazovL3BoeXNpY2FsU3ZnLy4vc3JjL3BoeXNpY3MvYm9keS9hYnN0cmFjdF9jdXJ2ZV9ib2R5LnRzIiwid2VicGFjazovL3BoeXNpY2FsU3ZnLy4vc3JjL3BoeXNpY3MvYm9keS9jdXJ2ZV9ib2R5LnRzIiwid2VicGFjazovL3BoeXNpY2FsU3ZnLy4vc3JjL3BoeXNpY3MvYm9keS9yZWZsZWN0aW9uX2N1cnZlX2JvZHkudHMiLCJ3ZWJwYWNrOi8vcGh5c2ljYWxTdmcvLi9zcmMvcGh5c2ljcy9ib2R5L3F1YWRyYXRpY19jdXJ2ZV9ib2R5LnRzIiwid2VicGFjazovL3BoeXNpY2FsU3ZnLy4vc3JjL3BoeXNpY3MvYm9keS9jbG9zZV9wYXRoX2JvZHkudHMiLCJ3ZWJwYWNrOi8vcGh5c2ljYWxTdmcvLi9zcmMvcGh5c2ljcy9tYXR0ZXJqc19waHlzaWNzLnRzIiwid2VicGFjazovL3BoeXNpY2FsU3ZnLy4vc3JjL3BoeXNpY3MvYm9keS9ib2R5X2ZhY3RvcnkudHMiLCJ3ZWJwYWNrOi8vcGh5c2ljYWxTdmcvLi9zcmMvYmFzZS9zdmdfZGF0YS50cyIsIndlYnBhY2s6Ly9waHlzaWNhbFN2Zy8uL3NyYy9iYXNlL2NvbW1hbmRfbWFwcGVyLnRzIiwid2VicGFjazovL3BoeXNpY2FsU3ZnLy4vc3JjL3BoeXNpY3MvcGx1Z2lucy9ncmF2aXR5X3BsdWdpbi50cyIsIndlYnBhY2s6Ly9waHlzaWNhbFN2Zy8uL3NyYy9waHlzaWNzL3BsdWdpbnMvdmlld19jb2xsaWRlcl9ib3JkZXJfcGx1Z2luLnRzIiwid2VicGFjazovL3BoeXNpY2FsU3ZnLy4vc3JjL3BoeXNpY3MvcGx1Z2lucy9tb3VzZV9wbHVnaW4udHMiLCJ3ZWJwYWNrOi8vcGh5c2ljYWxTdmcvLi9zcmMvcGh5c2ljcy9wbHVnaW5zL3JlbmRlcmVyX3BsdWdpbi50cyIsIndlYnBhY2s6Ly9waHlzaWNhbFN2Zy8uL3NyYy9yZW5kZXJlci9yZW5kZXJlci50cyIsIndlYnBhY2s6Ly9waHlzaWNhbFN2Zy8uL3NyYy9yZW5kZXJlci9wcm9kdWN0aW9uX3JlbmRlcmVyLnRzIiwid2VicGFjazovL3BoeXNpY2FsU3ZnLy4vc3JjL3BoeXNpY3MvcGx1Z2lucy9zY3JvbGxfcGx1Z2luLnRzIiwid2VicGFjazovL3BoeXNpY2FsU3ZnLy4vc3JjL3BoeXNpY3MvcGx1Z2lucy9saW1pdF92ZWxvY2l0eV9wbHVnaW4udHMiLCJ3ZWJwYWNrOi8vcGh5c2ljYWxTdmcvLi9zcmMvcGh5c2ljcy9wbHVnaW5zL2xpbWl0X2FuZ3VsYXJfdmVsb2NpdHlfcGx1Z2luLnRzIiwid2VicGFjazovL3BoeXNpY2FsU3ZnLy4vc3JjL2FwaS9zdG9wX2J1aWxkZXIudHMiLCJ3ZWJwYWNrOi8vcGh5c2ljYWxTdmcvLi9zcmMvYXBpL3NpbXVsYXRpb25fYnVpbGRlci50cyIsIndlYnBhY2s6Ly9waHlzaWNhbFN2Zy8uL3NyYy9hcGkvYWdncmVnYXRvcl9idWlsZGVyLnRzIiwid2VicGFjazovL3BoeXNpY2FsU3ZnLy4vc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbiB3ZWJwYWNrVW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbihyb290LCBmYWN0b3J5KSB7XG5cdGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0Jylcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKTtcblx0ZWxzZSBpZih0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpXG5cdFx0ZGVmaW5lKFtdLCBmYWN0b3J5KTtcblx0ZWxzZSBpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpXG5cdFx0ZXhwb3J0c1tcInBoeXNpY2FsU3ZnXCJdID0gZmFjdG9yeSgpO1xuXHRlbHNlXG5cdFx0cm9vdFtcInBoeXNpY2FsU3ZnXCJdID0gZmFjdG9yeSgpO1xufSkoc2VsZiwgKCkgPT4ge1xucmV0dXJuICIsIi8qIVxuICogbWF0dGVyLWpzIDAuMTguMCBieSBAbGlhYnJ1XG4gKiBodHRwOi8vYnJtLmlvL21hdHRlci1qcy9cbiAqIExpY2Vuc2UgTUlUXG4gKiBcbiAqIFRoZSBNSVQgTGljZW5zZSAoTUlUKVxuICogXG4gKiBDb3B5cmlnaHQgKGMpIExpYW0gQnJ1bW1pdHQgYW5kIGNvbnRyaWJ1dG9ycy5cbiAqIFxuICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4gKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuICogXG4gKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpblxuICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4gKiBcbiAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1JcbiAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4gKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4gKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTlxuICogVEhFIFNPRlRXQVJFLlxuICovXG4oZnVuY3Rpb24gd2VicGFja1VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24ocm9vdCwgZmFjdG9yeSkge1xuXHRpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSA9PT0gJ29iamVjdCcpXG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCk7XG5cdGVsc2UgaWYodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKVxuXHRcdGRlZmluZShcIk1hdHRlclwiLCBbXSwgZmFjdG9yeSk7XG5cdGVsc2UgaWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKVxuXHRcdGV4cG9ydHNbXCJNYXR0ZXJcIl0gPSBmYWN0b3J5KCk7XG5cdGVsc2Vcblx0XHRyb290W1wiTWF0dGVyXCJdID0gZmFjdG9yeSgpO1xufSkodGhpcywgZnVuY3Rpb24oKSB7XG5yZXR1cm4gLyoqKioqKi8gKGZ1bmN0aW9uKG1vZHVsZXMpIHsgLy8gd2VicGFja0Jvb3RzdHJhcFxuLyoqKioqKi8gXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4vKioqKioqLyBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuLyoqKioqKi8gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuLyoqKioqKi8gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKSB7XG4vKioqKioqLyBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcbi8qKioqKiovIFx0XHR9XG4vKioqKioqLyBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbi8qKioqKiovIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4vKioqKioqLyBcdFx0XHRpOiBtb2R1bGVJZCxcbi8qKioqKiovIFx0XHRcdGw6IGZhbHNlLFxuLyoqKioqKi8gXHRcdFx0ZXhwb3J0czoge31cbi8qKioqKiovIFx0XHR9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbi8qKioqKiovIFx0XHRtb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuLyoqKioqKi8gXHRcdG1vZHVsZS5sID0gdHJ1ZTtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbi8qKioqKiovIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4vKioqKioqLyBcdH1cbi8qKioqKiovXG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb24gZm9yIGhhcm1vbnkgZXhwb3J0c1xuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbi8qKioqKiovIFx0XHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIG5hbWUpKSB7XG4vKioqKioqLyBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgbmFtZSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGdldHRlciB9KTtcbi8qKioqKiovIFx0XHR9XG4vKioqKioqLyBcdH07XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18uciA9IGZ1bmN0aW9uKGV4cG9ydHMpIHtcbi8qKioqKiovIFx0XHRpZih0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHtcbi8qKioqKiovIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuLyoqKioqKi8gXHRcdH1cbi8qKioqKiovIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuLyoqKioqKi8gXHR9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gY3JlYXRlIGEgZmFrZSBuYW1lc3BhY2Ugb2JqZWN0XG4vKioqKioqLyBcdC8vIG1vZGUgJiAxOiB2YWx1ZSBpcyBhIG1vZHVsZSBpZCwgcmVxdWlyZSBpdFxuLyoqKioqKi8gXHQvLyBtb2RlICYgMjogbWVyZ2UgYWxsIHByb3BlcnRpZXMgb2YgdmFsdWUgaW50byB0aGUgbnNcbi8qKioqKiovIFx0Ly8gbW9kZSAmIDQ6IHJldHVybiB2YWx1ZSB3aGVuIGFscmVhZHkgbnMgb2JqZWN0XG4vKioqKioqLyBcdC8vIG1vZGUgJiA4fDE6IGJlaGF2ZSBsaWtlIHJlcXVpcmVcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy50ID0gZnVuY3Rpb24odmFsdWUsIG1vZGUpIHtcbi8qKioqKiovIFx0XHRpZihtb2RlICYgMSkgdmFsdWUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKHZhbHVlKTtcbi8qKioqKiovIFx0XHRpZihtb2RlICYgOCkgcmV0dXJuIHZhbHVlO1xuLyoqKioqKi8gXHRcdGlmKChtb2RlICYgNCkgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAmJiB2YWx1ZS5fX2VzTW9kdWxlKSByZXR1cm4gdmFsdWU7XG4vKioqKioqLyBcdFx0dmFyIG5zID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbi8qKioqKiovIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIobnMpO1xuLyoqKioqKi8gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShucywgJ2RlZmF1bHQnLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2YWx1ZSB9KTtcbi8qKioqKiovIFx0XHRpZihtb2RlICYgMiAmJiB0eXBlb2YgdmFsdWUgIT0gJ3N0cmluZycpIGZvcih2YXIga2V5IGluIHZhbHVlKSBfX3dlYnBhY2tfcmVxdWlyZV9fLmQobnMsIGtleSwgZnVuY3Rpb24oa2V5KSB7IHJldHVybiB2YWx1ZVtrZXldOyB9LmJpbmQobnVsbCwga2V5KSk7XG4vKioqKioqLyBcdFx0cmV0dXJuIG5zO1xuLyoqKioqKi8gXHR9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5uID0gZnVuY3Rpb24obW9kdWxlKSB7XG4vKioqKioqLyBcdFx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG4vKioqKioqLyBcdFx0XHRmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuLyoqKioqKi8gXHRcdFx0ZnVuY3Rpb24gZ2V0TW9kdWxlRXhwb3J0cygpIHsgcmV0dXJuIG1vZHVsZTsgfTtcbi8qKioqKiovIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCAnYScsIGdldHRlcik7XG4vKioqKioqLyBcdFx0cmV0dXJuIGdldHRlcjtcbi8qKioqKiovIFx0fTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbFxuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSBmdW5jdGlvbihvYmplY3QsIHByb3BlcnR5KSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSk7IH07XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBcIlwiO1xuLyoqKioqKi9cbi8qKioqKiovXG4vKioqKioqLyBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuLyoqKioqKi8gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhfX3dlYnBhY2tfcmVxdWlyZV9fLnMgPSAyMSk7XG4vKioqKioqLyB9KVxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qKioqKiovIChbXG4vKiAwICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cbi8qKlxuKiBUaGUgYE1hdHRlci5Db21tb25gIG1vZHVsZSBjb250YWlucyB1dGlsaXR5IGZ1bmN0aW9ucyB0aGF0IGFyZSBjb21tb24gdG8gYWxsIG1vZHVsZXMuXG4qXG4qIEBjbGFzcyBDb21tb25cbiovXG5cbnZhciBDb21tb24gPSB7fTtcblxubW9kdWxlLmV4cG9ydHMgPSBDb21tb247XG5cbihmdW5jdGlvbigpIHtcblxuICAgIENvbW1vbi5fbmV4dElkID0gMDtcbiAgICBDb21tb24uX3NlZWQgPSAwO1xuICAgIENvbW1vbi5fbm93U3RhcnRUaW1lID0gKyhuZXcgRGF0ZSgpKTtcbiAgICBDb21tb24uX3dhcm5lZE9uY2UgPSB7fTtcbiAgICBDb21tb24uX2RlY29tcCA9IG51bGw7XG4gICAgXG4gICAgLyoqXG4gICAgICogRXh0ZW5kcyB0aGUgb2JqZWN0IGluIHRoZSBmaXJzdCBhcmd1bWVudCB1c2luZyB0aGUgb2JqZWN0IGluIHRoZSBzZWNvbmQgYXJndW1lbnQuXG4gICAgICogQG1ldGhvZCBleHRlbmRcbiAgICAgKiBAcGFyYW0ge30gb2JqXG4gICAgICogQHBhcmFtIHtib29sZWFufSBkZWVwXG4gICAgICogQHJldHVybiB7fSBvYmogZXh0ZW5kZWRcbiAgICAgKi9cbiAgICBDb21tb24uZXh0ZW5kID0gZnVuY3Rpb24ob2JqLCBkZWVwKSB7XG4gICAgICAgIHZhciBhcmdzU3RhcnQsXG4gICAgICAgICAgICBhcmdzLFxuICAgICAgICAgICAgZGVlcENsb25lO1xuXG4gICAgICAgIGlmICh0eXBlb2YgZGVlcCA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgICBhcmdzU3RhcnQgPSAyO1xuICAgICAgICAgICAgZGVlcENsb25lID0gZGVlcDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGFyZ3NTdGFydCA9IDE7XG4gICAgICAgICAgICBkZWVwQ2xvbmUgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yICh2YXIgaSA9IGFyZ3NTdGFydDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXTtcblxuICAgICAgICAgICAgaWYgKHNvdXJjZSkge1xuICAgICAgICAgICAgICAgIGZvciAodmFyIHByb3AgaW4gc291cmNlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkZWVwQ2xvbmUgJiYgc291cmNlW3Byb3BdICYmIHNvdXJjZVtwcm9wXS5jb25zdHJ1Y3RvciA9PT0gT2JqZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW9ialtwcm9wXSB8fCBvYmpbcHJvcF0uY29uc3RydWN0b3IgPT09IE9iamVjdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9ialtwcm9wXSA9IG9ialtwcm9wXSB8fCB7fTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21tb24uZXh0ZW5kKG9ialtwcm9wXSwgZGVlcENsb25lLCBzb3VyY2VbcHJvcF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmpbcHJvcF0gPSBzb3VyY2VbcHJvcF07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBvYmpbcHJvcF0gPSBzb3VyY2VbcHJvcF07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIHJldHVybiBvYmo7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgY2xvbmUgb2YgdGhlIG9iamVjdCwgaWYgZGVlcCBpcyB0cnVlIHJlZmVyZW5jZXMgd2lsbCBhbHNvIGJlIGNsb25lZC5cbiAgICAgKiBAbWV0aG9kIGNsb25lXG4gICAgICogQHBhcmFtIHt9IG9ialxuICAgICAqIEBwYXJhbSB7Ym9vbH0gZGVlcFxuICAgICAqIEByZXR1cm4ge30gb2JqIGNsb25lZFxuICAgICAqL1xuICAgIENvbW1vbi5jbG9uZSA9IGZ1bmN0aW9uKG9iaiwgZGVlcCkge1xuICAgICAgICByZXR1cm4gQ29tbW9uLmV4dGVuZCh7fSwgZGVlcCwgb2JqKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgbGlzdCBvZiBrZXlzIGZvciB0aGUgZ2l2ZW4gb2JqZWN0LlxuICAgICAqIEBtZXRob2Qga2V5c1xuICAgICAqIEBwYXJhbSB7fSBvYmpcbiAgICAgKiBAcmV0dXJuIHtzdHJpbmdbXX0ga2V5c1xuICAgICAqL1xuICAgIENvbW1vbi5rZXlzID0gZnVuY3Rpb24ob2JqKSB7XG4gICAgICAgIGlmIChPYmplY3Qua2V5cylcbiAgICAgICAgICAgIHJldHVybiBPYmplY3Qua2V5cyhvYmopO1xuXG4gICAgICAgIC8vIGF2b2lkIGhhc093blByb3BlcnR5IGZvciBwZXJmb3JtYW5jZVxuICAgICAgICB2YXIga2V5cyA9IFtdO1xuICAgICAgICBmb3IgKHZhciBrZXkgaW4gb2JqKVxuICAgICAgICAgICAga2V5cy5wdXNoKGtleSk7XG4gICAgICAgIHJldHVybiBrZXlzO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBsaXN0IG9mIHZhbHVlcyBmb3IgdGhlIGdpdmVuIG9iamVjdC5cbiAgICAgKiBAbWV0aG9kIHZhbHVlc1xuICAgICAqIEBwYXJhbSB7fSBvYmpcbiAgICAgKiBAcmV0dXJuIHthcnJheX0gQXJyYXkgb2YgdGhlIG9iamVjdHMgcHJvcGVydHkgdmFsdWVzXG4gICAgICovXG4gICAgQ29tbW9uLnZhbHVlcyA9IGZ1bmN0aW9uKG9iaikge1xuICAgICAgICB2YXIgdmFsdWVzID0gW107XG4gICAgICAgIFxuICAgICAgICBpZiAoT2JqZWN0LmtleXMpIHtcbiAgICAgICAgICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqKTtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIHZhbHVlcy5wdXNoKG9ialtrZXlzW2ldXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdmFsdWVzO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyBhdm9pZCBoYXNPd25Qcm9wZXJ0eSBmb3IgcGVyZm9ybWFuY2VcbiAgICAgICAgZm9yICh2YXIga2V5IGluIG9iailcbiAgICAgICAgICAgIHZhbHVlcy5wdXNoKG9ialtrZXldKTtcbiAgICAgICAgcmV0dXJuIHZhbHVlcztcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogR2V0cyBhIHZhbHVlIGZyb20gYGJhc2VgIHJlbGF0aXZlIHRvIHRoZSBgcGF0aGAgc3RyaW5nLlxuICAgICAqIEBtZXRob2QgZ2V0XG4gICAgICogQHBhcmFtIHt9IG9iaiBUaGUgYmFzZSBvYmplY3RcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aCBUaGUgcGF0aCByZWxhdGl2ZSB0byBgYmFzZWAsIGUuZy4gJ0Zvby5CYXIuYmF6J1xuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbYmVnaW5dIFBhdGggc2xpY2UgYmVnaW5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2VuZF0gUGF0aCBzbGljZSBlbmRcbiAgICAgKiBAcmV0dXJuIHt9IFRoZSBvYmplY3QgYXQgdGhlIGdpdmVuIHBhdGhcbiAgICAgKi9cbiAgICBDb21tb24uZ2V0ID0gZnVuY3Rpb24ob2JqLCBwYXRoLCBiZWdpbiwgZW5kKSB7XG4gICAgICAgIHBhdGggPSBwYXRoLnNwbGl0KCcuJykuc2xpY2UoYmVnaW4sIGVuZCk7XG5cbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYXRoLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgICAgICBvYmogPSBvYmpbcGF0aFtpXV07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gb2JqO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIGEgdmFsdWUgb24gYGJhc2VgIHJlbGF0aXZlIHRvIHRoZSBnaXZlbiBgcGF0aGAgc3RyaW5nLlxuICAgICAqIEBtZXRob2Qgc2V0XG4gICAgICogQHBhcmFtIHt9IG9iaiBUaGUgYmFzZSBvYmplY3RcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aCBUaGUgcGF0aCByZWxhdGl2ZSB0byBgYmFzZWAsIGUuZy4gJ0Zvby5CYXIuYmF6J1xuICAgICAqIEBwYXJhbSB7fSB2YWwgVGhlIHZhbHVlIHRvIHNldFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbYmVnaW5dIFBhdGggc2xpY2UgYmVnaW5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2VuZF0gUGF0aCBzbGljZSBlbmRcbiAgICAgKiBAcmV0dXJuIHt9IFBhc3MgdGhyb3VnaCBgdmFsYCBmb3IgY2hhaW5pbmdcbiAgICAgKi9cbiAgICBDb21tb24uc2V0ID0gZnVuY3Rpb24ob2JqLCBwYXRoLCB2YWwsIGJlZ2luLCBlbmQpIHtcbiAgICAgICAgdmFyIHBhcnRzID0gcGF0aC5zcGxpdCgnLicpLnNsaWNlKGJlZ2luLCBlbmQpO1xuICAgICAgICBDb21tb24uZ2V0KG9iaiwgcGF0aCwgMCwgLTEpW3BhcnRzW3BhcnRzLmxlbmd0aCAtIDFdXSA9IHZhbDtcbiAgICAgICAgcmV0dXJuIHZhbDtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogU2h1ZmZsZXMgdGhlIGdpdmVuIGFycmF5IGluLXBsYWNlLlxuICAgICAqIFRoZSBmdW5jdGlvbiB1c2VzIGEgc2VlZGVkIHJhbmRvbSBnZW5lcmF0b3IuXG4gICAgICogQG1ldGhvZCBzaHVmZmxlXG4gICAgICogQHBhcmFtIHthcnJheX0gYXJyYXlcbiAgICAgKiBAcmV0dXJuIHthcnJheX0gYXJyYXkgc2h1ZmZsZWQgcmFuZG9tbHlcbiAgICAgKi9cbiAgICBDb21tb24uc2h1ZmZsZSA9IGZ1bmN0aW9uKGFycmF5KSB7XG4gICAgICAgIGZvciAodmFyIGkgPSBhcnJheS5sZW5ndGggLSAxOyBpID4gMDsgaS0tKSB7XG4gICAgICAgICAgICB2YXIgaiA9IE1hdGguZmxvb3IoQ29tbW9uLnJhbmRvbSgpICogKGkgKyAxKSk7XG4gICAgICAgICAgICB2YXIgdGVtcCA9IGFycmF5W2ldO1xuICAgICAgICAgICAgYXJyYXlbaV0gPSBhcnJheVtqXTtcbiAgICAgICAgICAgIGFycmF5W2pdID0gdGVtcDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXJyYXk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFJhbmRvbWx5IGNob29zZXMgYSB2YWx1ZSBmcm9tIGEgbGlzdCB3aXRoIGVxdWFsIHByb2JhYmlsaXR5LlxuICAgICAqIFRoZSBmdW5jdGlvbiB1c2VzIGEgc2VlZGVkIHJhbmRvbSBnZW5lcmF0b3IuXG4gICAgICogQG1ldGhvZCBjaG9vc2VcbiAgICAgKiBAcGFyYW0ge2FycmF5fSBjaG9pY2VzXG4gICAgICogQHJldHVybiB7b2JqZWN0fSBBIHJhbmRvbSBjaG9pY2Ugb2JqZWN0IGZyb20gdGhlIGFycmF5XG4gICAgICovXG4gICAgQ29tbW9uLmNob29zZSA9IGZ1bmN0aW9uKGNob2ljZXMpIHtcbiAgICAgICAgcmV0dXJuIGNob2ljZXNbTWF0aC5mbG9vcihDb21tb24ucmFuZG9tKCkgKiBjaG9pY2VzLmxlbmd0aCldO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIG9iamVjdCBpcyBhIEhUTUxFbGVtZW50LCBvdGhlcndpc2UgZmFsc2UuXG4gICAgICogQG1ldGhvZCBpc0VsZW1lbnRcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gb2JqXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIGEgSFRNTEVsZW1lbnQsIG90aGVyd2lzZSBmYWxzZVxuICAgICAqL1xuICAgIENvbW1vbi5pc0VsZW1lbnQgPSBmdW5jdGlvbihvYmopIHtcbiAgICAgICAgaWYgKHR5cGVvZiBIVE1MRWxlbWVudCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHJldHVybiBvYmogaW5zdGFuY2VvZiBIVE1MRWxlbWVudDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAhIShvYmogJiYgb2JqLm5vZGVUeXBlICYmIG9iai5ub2RlTmFtZSk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIGFuIGFycmF5LlxuICAgICAqIEBtZXRob2QgaXNBcnJheVxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBvYmpcbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIHRoZSBvYmplY3QgaXMgYW4gYXJyYXksIG90aGVyd2lzZSBmYWxzZVxuICAgICAqL1xuICAgIENvbW1vbi5pc0FycmF5ID0gZnVuY3Rpb24ob2JqKSB7XG4gICAgICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqKSA9PT0gJ1tvYmplY3QgQXJyYXldJztcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBvYmplY3QgaXMgYSBmdW5jdGlvbi5cbiAgICAgKiBAbWV0aG9kIGlzRnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gb2JqXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIGEgZnVuY3Rpb24sIG90aGVyd2lzZSBmYWxzZVxuICAgICAqL1xuICAgIENvbW1vbi5pc0Z1bmN0aW9uID0gZnVuY3Rpb24ob2JqKSB7XG4gICAgICAgIHJldHVybiB0eXBlb2Ygb2JqID09PSBcImZ1bmN0aW9uXCI7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIGEgcGxhaW4gb2JqZWN0LlxuICAgICAqIEBtZXRob2QgaXNQbGFpbk9iamVjdFxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBvYmpcbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIHRoZSBvYmplY3QgaXMgYSBwbGFpbiBvYmplY3QsIG90aGVyd2lzZSBmYWxzZVxuICAgICAqL1xuICAgIENvbW1vbi5pc1BsYWluT2JqZWN0ID0gZnVuY3Rpb24ob2JqKSB7XG4gICAgICAgIHJldHVybiB0eXBlb2Ygb2JqID09PSAnb2JqZWN0JyAmJiBvYmouY29uc3RydWN0b3IgPT09IE9iamVjdDtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBvYmplY3QgaXMgYSBzdHJpbmcuXG4gICAgICogQG1ldGhvZCBpc1N0cmluZ1xuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBvYmpcbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIHRoZSBvYmplY3QgaXMgYSBzdHJpbmcsIG90aGVyd2lzZSBmYWxzZVxuICAgICAqL1xuICAgIENvbW1vbi5pc1N0cmluZyA9IGZ1bmN0aW9uKG9iaikge1xuICAgICAgICByZXR1cm4gdG9TdHJpbmcuY2FsbChvYmopID09PSAnW29iamVjdCBTdHJpbmddJztcbiAgICB9O1xuICAgIFxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGdpdmVuIHZhbHVlIGNsYW1wZWQgYmV0d2VlbiBhIG1pbmltdW0gYW5kIG1heGltdW0gdmFsdWUuXG4gICAgICogQG1ldGhvZCBjbGFtcFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZVxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBtaW5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbWF4XG4gICAgICogQHJldHVybiB7bnVtYmVyfSBUaGUgdmFsdWUgY2xhbXBlZCBiZXR3ZWVuIG1pbiBhbmQgbWF4IGluY2x1c2l2ZVxuICAgICAqL1xuICAgIENvbW1vbi5jbGFtcCA9IGZ1bmN0aW9uKHZhbHVlLCBtaW4sIG1heCkge1xuICAgICAgICBpZiAodmFsdWUgPCBtaW4pXG4gICAgICAgICAgICByZXR1cm4gbWluO1xuICAgICAgICBpZiAodmFsdWUgPiBtYXgpXG4gICAgICAgICAgICByZXR1cm4gbWF4O1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfTtcbiAgICBcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBzaWduIG9mIHRoZSBnaXZlbiB2YWx1ZS5cbiAgICAgKiBAbWV0aG9kIHNpZ25cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gdmFsdWVcbiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9IC0xIGlmIG5lZ2F0aXZlLCArMSBpZiAwIG9yIHBvc2l0aXZlXG4gICAgICovXG4gICAgQ29tbW9uLnNpZ24gPSBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdmFsdWUgPCAwID8gLTEgOiAxO1xuICAgIH07XG4gICAgXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgY3VycmVudCB0aW1lc3RhbXAgc2luY2UgdGhlIHRpbWUgb3JpZ2luIChlLmcuIGZyb20gcGFnZSBsb2FkKS5cbiAgICAgKiBUaGUgcmVzdWx0IGlzIGluIG1pbGxpc2Vjb25kcyBhbmQgd2lsbCB1c2UgaGlnaC1yZXNvbHV0aW9uIHRpbWluZyBpZiBhdmFpbGFibGUuXG4gICAgICogQG1ldGhvZCBub3dcbiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9IHRoZSBjdXJyZW50IHRpbWVzdGFtcCBpbiBtaWxsaXNlY29uZHNcbiAgICAgKi9cbiAgICBDb21tb24ubm93ID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB3aW5kb3cucGVyZm9ybWFuY2UpIHtcbiAgICAgICAgICAgIGlmICh3aW5kb3cucGVyZm9ybWFuY2Uubm93KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHdpbmRvdy5wZXJmb3JtYW5jZS5ub3coKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAod2luZG93LnBlcmZvcm1hbmNlLndlYmtpdE5vdykge1xuICAgICAgICAgICAgICAgIHJldHVybiB3aW5kb3cucGVyZm9ybWFuY2Uud2Via2l0Tm93KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoRGF0ZS5ub3cpIHtcbiAgICAgICAgICAgIHJldHVybiBEYXRlLm5vdygpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIChuZXcgRGF0ZSgpKSAtIENvbW1vbi5fbm93U3RhcnRUaW1lO1xuICAgIH07XG4gICAgXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIHJhbmRvbSB2YWx1ZSBiZXR3ZWVuIGEgbWluaW11bSBhbmQgYSBtYXhpbXVtIHZhbHVlIGluY2x1c2l2ZS5cbiAgICAgKiBUaGUgZnVuY3Rpb24gdXNlcyBhIHNlZWRlZCByYW5kb20gZ2VuZXJhdG9yLlxuICAgICAqIEBtZXRob2QgcmFuZG9tXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG1pblxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBtYXhcbiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9IEEgcmFuZG9tIG51bWJlciBiZXR3ZWVuIG1pbiBhbmQgbWF4IGluY2x1c2l2ZVxuICAgICAqL1xuICAgIENvbW1vbi5yYW5kb20gPSBmdW5jdGlvbihtaW4sIG1heCkge1xuICAgICAgICBtaW4gPSAodHlwZW9mIG1pbiAhPT0gXCJ1bmRlZmluZWRcIikgPyBtaW4gOiAwO1xuICAgICAgICBtYXggPSAodHlwZW9mIG1heCAhPT0gXCJ1bmRlZmluZWRcIikgPyBtYXggOiAxO1xuICAgICAgICByZXR1cm4gbWluICsgX3NlZWRlZFJhbmRvbSgpICogKG1heCAtIG1pbik7XG4gICAgfTtcblxuICAgIHZhciBfc2VlZGVkUmFuZG9tID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIC8vIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0xpbmVhcl9jb25ncnVlbnRpYWxfZ2VuZXJhdG9yXG4gICAgICAgIENvbW1vbi5fc2VlZCA9IChDb21tb24uX3NlZWQgKiA5MzAxICsgNDkyOTcpICUgMjMzMjgwO1xuICAgICAgICByZXR1cm4gQ29tbW9uLl9zZWVkIC8gMjMzMjgwO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBhIENTUyBoZXggY29sb3VyIHN0cmluZyBpbnRvIGFuIGludGVnZXIuXG4gICAgICogQG1ldGhvZCBjb2xvclRvTnVtYmVyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGNvbG9yU3RyaW5nXG4gICAgICogQHJldHVybiB7bnVtYmVyfSBBbiBpbnRlZ2VyIHJlcHJlc2VudGluZyB0aGUgQ1NTIGhleCBzdHJpbmdcbiAgICAgKi9cbiAgICBDb21tb24uY29sb3JUb051bWJlciA9IGZ1bmN0aW9uKGNvbG9yU3RyaW5nKSB7XG4gICAgICAgIGNvbG9yU3RyaW5nID0gY29sb3JTdHJpbmcucmVwbGFjZSgnIycsJycpO1xuXG4gICAgICAgIGlmIChjb2xvclN0cmluZy5sZW5ndGggPT0gMykge1xuICAgICAgICAgICAgY29sb3JTdHJpbmcgPSBjb2xvclN0cmluZy5jaGFyQXQoMCkgKyBjb2xvclN0cmluZy5jaGFyQXQoMClcbiAgICAgICAgICAgICAgICAgICAgICAgICsgY29sb3JTdHJpbmcuY2hhckF0KDEpICsgY29sb3JTdHJpbmcuY2hhckF0KDEpXG4gICAgICAgICAgICAgICAgICAgICAgICArIGNvbG9yU3RyaW5nLmNoYXJBdCgyKSArIGNvbG9yU3RyaW5nLmNoYXJBdCgyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBwYXJzZUludChjb2xvclN0cmluZywgMTYpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBUaGUgY29uc29sZSBsb2dnaW5nIGxldmVsIHRvIHVzZSwgd2hlcmUgZWFjaCBsZXZlbCBpbmNsdWRlcyBhbGwgbGV2ZWxzIGFib3ZlIGFuZCBleGNsdWRlcyB0aGUgbGV2ZWxzIGJlbG93LlxuICAgICAqIFRoZSBkZWZhdWx0IGxldmVsIGlzICdkZWJ1Zycgd2hpY2ggc2hvd3MgYWxsIGNvbnNvbGUgbWVzc2FnZXMuICBcbiAgICAgKlxuICAgICAqIFBvc3NpYmxlIGxldmVsIHZhbHVlcyBhcmU6XG4gICAgICogLSAwID0gTm9uZVxuICAgICAqIC0gMSA9IERlYnVnXG4gICAgICogLSAyID0gSW5mb1xuICAgICAqIC0gMyA9IFdhcm5cbiAgICAgKiAtIDQgPSBFcnJvclxuICAgICAqIEBwcm9wZXJ0eSBDb21tb24ubG9nTGV2ZWxcbiAgICAgKiBAdHlwZSB7TnVtYmVyfVxuICAgICAqIEBkZWZhdWx0IDFcbiAgICAgKi9cbiAgICBDb21tb24ubG9nTGV2ZWwgPSAxO1xuXG4gICAgLyoqXG4gICAgICogU2hvd3MgYSBgY29uc29sZS5sb2dgIG1lc3NhZ2Ugb25seSBpZiB0aGUgY3VycmVudCBgQ29tbW9uLmxvZ0xldmVsYCBhbGxvd3MgaXQuXG4gICAgICogVGhlIG1lc3NhZ2Ugd2lsbCBiZSBwcmVmaXhlZCB3aXRoICdtYXR0ZXItanMnIHRvIG1ha2UgaXQgZWFzaWx5IGlkZW50aWZpYWJsZS5cbiAgICAgKiBAbWV0aG9kIGxvZ1xuICAgICAqIEBwYXJhbSAuLi5vYmpzIHt9IFRoZSBvYmplY3RzIHRvIGxvZy5cbiAgICAgKi9cbiAgICBDb21tb24ubG9nID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmIChjb25zb2xlICYmIENvbW1vbi5sb2dMZXZlbCA+IDAgJiYgQ29tbW9uLmxvZ0xldmVsIDw9IDMpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nLmFwcGx5KGNvbnNvbGUsIFsnbWF0dGVyLWpzOiddLmNvbmNhdChBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpKSk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogU2hvd3MgYSBgY29uc29sZS5pbmZvYCBtZXNzYWdlIG9ubHkgaWYgdGhlIGN1cnJlbnQgYENvbW1vbi5sb2dMZXZlbGAgYWxsb3dzIGl0LlxuICAgICAqIFRoZSBtZXNzYWdlIHdpbGwgYmUgcHJlZml4ZWQgd2l0aCAnbWF0dGVyLWpzJyB0byBtYWtlIGl0IGVhc2lseSBpZGVudGlmaWFibGUuXG4gICAgICogQG1ldGhvZCBpbmZvXG4gICAgICogQHBhcmFtIC4uLm9ianMge30gVGhlIG9iamVjdHMgdG8gbG9nLlxuICAgICAqL1xuICAgIENvbW1vbi5pbmZvID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmIChjb25zb2xlICYmIENvbW1vbi5sb2dMZXZlbCA+IDAgJiYgQ29tbW9uLmxvZ0xldmVsIDw9IDIpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuaW5mby5hcHBseShjb25zb2xlLCBbJ21hdHRlci1qczonXS5jb25jYXQoQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKSkpO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFNob3dzIGEgYGNvbnNvbGUud2FybmAgbWVzc2FnZSBvbmx5IGlmIHRoZSBjdXJyZW50IGBDb21tb24ubG9nTGV2ZWxgIGFsbG93cyBpdC5cbiAgICAgKiBUaGUgbWVzc2FnZSB3aWxsIGJlIHByZWZpeGVkIHdpdGggJ21hdHRlci1qcycgdG8gbWFrZSBpdCBlYXNpbHkgaWRlbnRpZmlhYmxlLlxuICAgICAqIEBtZXRob2Qgd2FyblxuICAgICAqIEBwYXJhbSAuLi5vYmpzIHt9IFRoZSBvYmplY3RzIHRvIGxvZy5cbiAgICAgKi9cbiAgICBDb21tb24ud2FybiA9IGZ1bmN0aW9uKCkge1xuICAgICAgICBpZiAoY29uc29sZSAmJiBDb21tb24ubG9nTGV2ZWwgPiAwICYmIENvbW1vbi5sb2dMZXZlbCA8PSAzKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4uYXBwbHkoY29uc29sZSwgWydtYXR0ZXItanM6J10uY29uY2F0KEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cykpKTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBVc2VzIGBDb21tb24ud2FybmAgdG8gbG9nIHRoZSBnaXZlbiBtZXNzYWdlIG9uZSB0aW1lIG9ubHkuXG4gICAgICogQG1ldGhvZCB3YXJuT25jZVxuICAgICAqIEBwYXJhbSAuLi5vYmpzIHt9IFRoZSBvYmplY3RzIHRvIGxvZy5cbiAgICAgKi9cbiAgICBDb21tb24ud2Fybk9uY2UgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIG1lc3NhZ2UgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpLmpvaW4oJyAnKTtcblxuICAgICAgICBpZiAoIUNvbW1vbi5fd2FybmVkT25jZVttZXNzYWdlXSkge1xuICAgICAgICAgICAgQ29tbW9uLndhcm4obWVzc2FnZSk7XG4gICAgICAgICAgICBDb21tb24uX3dhcm5lZE9uY2VbbWVzc2FnZV0gPSB0cnVlO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFNob3dzIGEgZGVwcmVjYXRlZCBjb25zb2xlIHdhcm5pbmcgd2hlbiB0aGUgZnVuY3Rpb24gb24gdGhlIGdpdmVuIG9iamVjdCBpcyBjYWxsZWQuXG4gICAgICogVGhlIHRhcmdldCBmdW5jdGlvbiB3aWxsIGJlIHJlcGxhY2VkIHdpdGggYSBuZXcgZnVuY3Rpb24gdGhhdCBmaXJzdCBzaG93cyB0aGUgd2FybmluZ1xuICAgICAqIGFuZCB0aGVuIGNhbGxzIHRoZSBvcmlnaW5hbCBmdW5jdGlvbi5cbiAgICAgKiBAbWV0aG9kIGRlcHJlY2F0ZWRcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gb2JqIFRoZSBvYmplY3Qgb3IgbW9kdWxlXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgVGhlIHByb3BlcnR5IG5hbWUgb2YgdGhlIGZ1bmN0aW9uIG9uIG9ialxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB3YXJuaW5nIFRoZSBvbmUtdGltZSBtZXNzYWdlIHRvIHNob3cgaWYgdGhlIGZ1bmN0aW9uIGlzIGNhbGxlZFxuICAgICAqL1xuICAgIENvbW1vbi5kZXByZWNhdGVkID0gZnVuY3Rpb24ob2JqLCBwcm9wLCB3YXJuaW5nKSB7XG4gICAgICAgIG9ialtwcm9wXSA9IENvbW1vbi5jaGFpbihmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIENvbW1vbi53YXJuT25jZSgn8J+UhSBkZXByZWNhdGVkIPCflIUnLCB3YXJuaW5nKTtcbiAgICAgICAgfSwgb2JqW3Byb3BdKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgbmV4dCB1bmlxdWUgc2VxdWVudGlhbCBJRC5cbiAgICAgKiBAbWV0aG9kIG5leHRJZFxuICAgICAqIEByZXR1cm4ge051bWJlcn0gVW5pcXVlIHNlcXVlbnRpYWwgSURcbiAgICAgKi9cbiAgICBDb21tb24ubmV4dElkID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBDb21tb24uX25leHRJZCsrO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBBIGNyb3NzIGJyb3dzZXIgY29tcGF0aWJsZSBpbmRleE9mIGltcGxlbWVudGF0aW9uLlxuICAgICAqIEBtZXRob2QgaW5kZXhPZlxuICAgICAqIEBwYXJhbSB7YXJyYXl9IGhheXN0YWNrXG4gICAgICogQHBhcmFtIHtvYmplY3R9IG5lZWRsZVxuICAgICAqIEByZXR1cm4ge251bWJlcn0gVGhlIHBvc2l0aW9uIG9mIG5lZWRsZSBpbiBoYXlzdGFjaywgb3RoZXJ3aXNlIC0xLlxuICAgICAqL1xuICAgIENvbW1vbi5pbmRleE9mID0gZnVuY3Rpb24oaGF5c3RhY2ssIG5lZWRsZSkge1xuICAgICAgICBpZiAoaGF5c3RhY2suaW5kZXhPZilcbiAgICAgICAgICAgIHJldHVybiBoYXlzdGFjay5pbmRleE9mKG5lZWRsZSk7XG5cbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBoYXlzdGFjay5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKGhheXN0YWNrW2ldID09PSBuZWVkbGUpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gLTE7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEEgY3Jvc3MgYnJvd3NlciBjb21wYXRpYmxlIGFycmF5IG1hcCBpbXBsZW1lbnRhdGlvbi5cbiAgICAgKiBAbWV0aG9kIG1hcFxuICAgICAqIEBwYXJhbSB7YXJyYXl9IGxpc3RcbiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBmdW5jXG4gICAgICogQHJldHVybiB7YXJyYXl9IFZhbHVlcyBmcm9tIGxpc3QgdHJhbnNmb3JtZWQgYnkgZnVuYy5cbiAgICAgKi9cbiAgICBDb21tb24ubWFwID0gZnVuY3Rpb24obGlzdCwgZnVuYykge1xuICAgICAgICBpZiAobGlzdC5tYXApIHtcbiAgICAgICAgICAgIHJldHVybiBsaXN0Lm1hcChmdW5jKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBtYXBwZWQgPSBbXTtcblxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgICAgIG1hcHBlZC5wdXNoKGZ1bmMobGlzdFtpXSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG1hcHBlZDtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogVGFrZXMgYSBkaXJlY3RlZCBncmFwaCBhbmQgcmV0dXJucyB0aGUgcGFydGlhbGx5IG9yZGVyZWQgc2V0IG9mIHZlcnRpY2VzIGluIHRvcG9sb2dpY2FsIG9yZGVyLlxuICAgICAqIENpcmN1bGFyIGRlcGVuZGVuY2llcyBhcmUgYWxsb3dlZC5cbiAgICAgKiBAbWV0aG9kIHRvcG9sb2dpY2FsU29ydFxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBncmFwaFxuICAgICAqIEByZXR1cm4ge2FycmF5fSBQYXJ0aWFsbHkgb3JkZXJlZCBzZXQgb2YgdmVydGljZXMgaW4gdG9wb2xvZ2ljYWwgb3JkZXIuXG4gICAgICovXG4gICAgQ29tbW9uLnRvcG9sb2dpY2FsU29ydCA9IGZ1bmN0aW9uKGdyYXBoKSB7XG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9tZ2VjaGV2L2phdmFzY3JpcHQtYWxnb3JpdGhtc1xuICAgICAgICAvLyBDb3B5cmlnaHQgKGMpIE1pbmtvIEdlY2hldiAoTUlUIGxpY2Vuc2UpXG4gICAgICAgIC8vIE1vZGlmaWNhdGlvbnM6IHRpZHkgZm9ybWF0dGluZyBhbmQgbmFtaW5nXG4gICAgICAgIHZhciByZXN1bHQgPSBbXSxcbiAgICAgICAgICAgIHZpc2l0ZWQgPSBbXSxcbiAgICAgICAgICAgIHRlbXAgPSBbXTtcblxuICAgICAgICBmb3IgKHZhciBub2RlIGluIGdyYXBoKSB7XG4gICAgICAgICAgICBpZiAoIXZpc2l0ZWRbbm9kZV0gJiYgIXRlbXBbbm9kZV0pIHtcbiAgICAgICAgICAgICAgICBDb21tb24uX3RvcG9sb2dpY2FsU29ydChub2RlLCB2aXNpdGVkLCB0ZW1wLCBncmFwaCwgcmVzdWx0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcblxuICAgIENvbW1vbi5fdG9wb2xvZ2ljYWxTb3J0ID0gZnVuY3Rpb24obm9kZSwgdmlzaXRlZCwgdGVtcCwgZ3JhcGgsIHJlc3VsdCkge1xuICAgICAgICB2YXIgbmVpZ2hib3JzID0gZ3JhcGhbbm9kZV0gfHwgW107XG4gICAgICAgIHRlbXBbbm9kZV0gPSB0cnVlO1xuXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbmVpZ2hib3JzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgICAgICB2YXIgbmVpZ2hib3IgPSBuZWlnaGJvcnNbaV07XG5cbiAgICAgICAgICAgIGlmICh0ZW1wW25laWdoYm9yXSkge1xuICAgICAgICAgICAgICAgIC8vIHNraXAgY2lyY3VsYXIgZGVwZW5kZW5jaWVzXG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICghdmlzaXRlZFtuZWlnaGJvcl0pIHtcbiAgICAgICAgICAgICAgICBDb21tb24uX3RvcG9sb2dpY2FsU29ydChuZWlnaGJvciwgdmlzaXRlZCwgdGVtcCwgZ3JhcGgsIHJlc3VsdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0ZW1wW25vZGVdID0gZmFsc2U7XG4gICAgICAgIHZpc2l0ZWRbbm9kZV0gPSB0cnVlO1xuXG4gICAgICAgIHJlc3VsdC5wdXNoKG5vZGUpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBUYWtlcyBfbl8gZnVuY3Rpb25zIGFzIGFyZ3VtZW50cyBhbmQgcmV0dXJucyBhIG5ldyBmdW5jdGlvbiB0aGF0IGNhbGxzIHRoZW0gaW4gb3JkZXIuXG4gICAgICogVGhlIGFyZ3VtZW50cyBhcHBsaWVkIHdoZW4gY2FsbGluZyB0aGUgbmV3IGZ1bmN0aW9uIHdpbGwgYWxzbyBiZSBhcHBsaWVkIHRvIGV2ZXJ5IGZ1bmN0aW9uIHBhc3NlZC5cbiAgICAgKiBUaGUgdmFsdWUgb2YgYHRoaXNgIHJlZmVycyB0byB0aGUgbGFzdCB2YWx1ZSByZXR1cm5lZCBpbiB0aGUgY2hhaW4gdGhhdCB3YXMgbm90IGB1bmRlZmluZWRgLlxuICAgICAqIFRoZXJlZm9yZSBpZiBhIHBhc3NlZCBmdW5jdGlvbiBkb2VzIG5vdCByZXR1cm4gYSB2YWx1ZSwgdGhlIHByZXZpb3VzbHkgcmV0dXJuZWQgdmFsdWUgaXMgbWFpbnRhaW5lZC5cbiAgICAgKiBBZnRlciBhbGwgcGFzc2VkIGZ1bmN0aW9ucyBoYXZlIGJlZW4gY2FsbGVkIHRoZSBuZXcgZnVuY3Rpb24gcmV0dXJucyB0aGUgbGFzdCByZXR1cm5lZCB2YWx1ZSAoaWYgYW55KS5cbiAgICAgKiBJZiBhbnkgb2YgdGhlIHBhc3NlZCBmdW5jdGlvbnMgYXJlIGEgY2hhaW4sIHRoZW4gdGhlIGNoYWluIHdpbGwgYmUgZmxhdHRlbmVkLlxuICAgICAqIEBtZXRob2QgY2hhaW5cbiAgICAgKiBAcGFyYW0gLi4uZnVuY3Mge2Z1bmN0aW9ufSBUaGUgZnVuY3Rpb25zIHRvIGNoYWluLlxuICAgICAqIEByZXR1cm4ge2Z1bmN0aW9ufSBBIG5ldyBmdW5jdGlvbiB0aGF0IGNhbGxzIHRoZSBwYXNzZWQgZnVuY3Rpb25zIGluIG9yZGVyLlxuICAgICAqL1xuICAgIENvbW1vbi5jaGFpbiA9IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgZnVuY3MgPSBbXTtcblxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICAgICAgdmFyIGZ1bmMgPSBhcmd1bWVudHNbaV07XG5cbiAgICAgICAgICAgIGlmIChmdW5jLl9jaGFpbmVkKSB7XG4gICAgICAgICAgICAgICAgLy8gZmxhdHRlbiBhbHJlYWR5IGNoYWluZWQgZnVuY3Rpb25zXG4gICAgICAgICAgICAgICAgZnVuY3MucHVzaC5hcHBseShmdW5jcywgZnVuYy5fY2hhaW5lZCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGZ1bmNzLnB1c2goZnVuYyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgY2hhaW4gPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9Hb29nbGVDaHJvbWUvZGV2dG9vbHMtZG9jcy9pc3N1ZXMvNTMjaXNzdWVjb21tZW50LTUxOTQxMzU4XG4gICAgICAgICAgICB2YXIgbGFzdFJlc3VsdCxcbiAgICAgICAgICAgICAgICBhcmdzID0gbmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGgpO1xuXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgbCA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgICAgICAgICBhcmdzW2ldID0gYXJndW1lbnRzW2ldO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZnVuY3MubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuY3NbaV0uYXBwbHkobGFzdFJlc3VsdCwgYXJncyk7XG5cbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHJlc3VsdCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgbGFzdFJlc3VsdCA9IHJlc3VsdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBsYXN0UmVzdWx0O1xuICAgICAgICB9O1xuXG4gICAgICAgIGNoYWluLl9jaGFpbmVkID0gZnVuY3M7XG5cbiAgICAgICAgcmV0dXJuIGNoYWluO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBDaGFpbnMgYSBmdW5jdGlvbiB0byBleGN1dGUgYmVmb3JlIHRoZSBvcmlnaW5hbCBmdW5jdGlvbiBvbiB0aGUgZ2l2ZW4gYHBhdGhgIHJlbGF0aXZlIHRvIGBiYXNlYC5cbiAgICAgKiBTZWUgYWxzbyBkb2NzIGZvciBgQ29tbW9uLmNoYWluYC5cbiAgICAgKiBAbWV0aG9kIGNoYWluUGF0aEJlZm9yZVxuICAgICAqIEBwYXJhbSB7fSBiYXNlIFRoZSBiYXNlIG9iamVjdFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIFRoZSBwYXRoIHJlbGF0aXZlIHRvIGBiYXNlYFxuICAgICAqIEBwYXJhbSB7ZnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGNoYWluIGJlZm9yZSB0aGUgb3JpZ2luYWxcbiAgICAgKiBAcmV0dXJuIHtmdW5jdGlvbn0gVGhlIGNoYWluZWQgZnVuY3Rpb24gdGhhdCByZXBsYWNlZCB0aGUgb3JpZ2luYWxcbiAgICAgKi9cbiAgICBDb21tb24uY2hhaW5QYXRoQmVmb3JlID0gZnVuY3Rpb24oYmFzZSwgcGF0aCwgZnVuYykge1xuICAgICAgICByZXR1cm4gQ29tbW9uLnNldChiYXNlLCBwYXRoLCBDb21tb24uY2hhaW4oXG4gICAgICAgICAgICBmdW5jLFxuICAgICAgICAgICAgQ29tbW9uLmdldChiYXNlLCBwYXRoKVxuICAgICAgICApKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQ2hhaW5zIGEgZnVuY3Rpb24gdG8gZXhjdXRlIGFmdGVyIHRoZSBvcmlnaW5hbCBmdW5jdGlvbiBvbiB0aGUgZ2l2ZW4gYHBhdGhgIHJlbGF0aXZlIHRvIGBiYXNlYC5cbiAgICAgKiBTZWUgYWxzbyBkb2NzIGZvciBgQ29tbW9uLmNoYWluYC5cbiAgICAgKiBAbWV0aG9kIGNoYWluUGF0aEFmdGVyXG4gICAgICogQHBhcmFtIHt9IGJhc2UgVGhlIGJhc2Ugb2JqZWN0XG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggVGhlIHBhdGggcmVsYXRpdmUgdG8gYGJhc2VgXG4gICAgICogQHBhcmFtIHtmdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gY2hhaW4gYWZ0ZXIgdGhlIG9yaWdpbmFsXG4gICAgICogQHJldHVybiB7ZnVuY3Rpb259IFRoZSBjaGFpbmVkIGZ1bmN0aW9uIHRoYXQgcmVwbGFjZWQgdGhlIG9yaWdpbmFsXG4gICAgICovXG4gICAgQ29tbW9uLmNoYWluUGF0aEFmdGVyID0gZnVuY3Rpb24oYmFzZSwgcGF0aCwgZnVuYykge1xuICAgICAgICByZXR1cm4gQ29tbW9uLnNldChiYXNlLCBwYXRoLCBDb21tb24uY2hhaW4oXG4gICAgICAgICAgICBDb21tb24uZ2V0KGJhc2UsIHBhdGgpLFxuICAgICAgICAgICAgZnVuY1xuICAgICAgICApKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogUHJvdmlkZSB0aGUgW3BvbHktZGVjb21wXShodHRwczovL2dpdGh1Yi5jb20vc2NodGVwcGUvcG9seS1kZWNvbXAuanMpIGxpYnJhcnkgbW9kdWxlIHRvIGVuYWJsZVxuICAgICAqIGNvbmNhdmUgdmVydGV4IGRlY29tcG9zaXRpb24gc3VwcG9ydCB3aGVuIHVzaW5nIGBCb2RpZXMuZnJvbVZlcnRpY2VzYCBlLmcuIGBDb21tb24uc2V0RGVjb21wKHJlcXVpcmUoJ3BvbHktZGVjb21wJykpYC5cbiAgICAgKiBAbWV0aG9kIHNldERlY29tcFxuICAgICAqIEBwYXJhbSB7fSBkZWNvbXAgVGhlIFtwb2x5LWRlY29tcF0oaHR0cHM6Ly9naXRodWIuY29tL3NjaHRlcHBlL3BvbHktZGVjb21wLmpzKSBsaWJyYXJ5IG1vZHVsZS5cbiAgICAgKi9cbiAgICBDb21tb24uc2V0RGVjb21wID0gZnVuY3Rpb24oZGVjb21wKSB7XG4gICAgICAgIENvbW1vbi5fZGVjb21wID0gZGVjb21wO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBbcG9seS1kZWNvbXBdKGh0dHBzOi8vZ2l0aHViLmNvbS9zY2h0ZXBwZS9wb2x5LWRlY29tcC5qcykgbGlicmFyeSBtb2R1bGUgcHJvdmlkZWQgdGhyb3VnaCBgQ29tbW9uLnNldERlY29tcGAsXG4gICAgICogb3RoZXJ3aXNlIHJldHVybnMgdGhlIGdsb2JhbCBgZGVjb21wYCBpZiBzZXQuXG4gICAgICogQG1ldGhvZCBnZXREZWNvbXBcbiAgICAgKiBAcmV0dXJuIHt9IFRoZSBbcG9seS1kZWNvbXBdKGh0dHBzOi8vZ2l0aHViLmNvbS9zY2h0ZXBwZS9wb2x5LWRlY29tcC5qcykgbGlicmFyeSBtb2R1bGUgaWYgcHJvdmlkZWQuXG4gICAgICovXG4gICAgQ29tbW9uLmdldERlY29tcCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAvLyBnZXQgdXNlciBwcm92aWRlZCBkZWNvbXAgaWYgc2V0XG4gICAgICAgIHZhciBkZWNvbXAgPSBDb21tb24uX2RlY29tcDtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gb3RoZXJ3aXNlIGZyb20gd2luZG93IGdsb2JhbFxuICAgICAgICAgICAgaWYgKCFkZWNvbXAgJiYgdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICBkZWNvbXAgPSB3aW5kb3cuZGVjb21wO1xuICAgICAgICAgICAgfVxuICAgIFxuICAgICAgICAgICAgLy8gb3RoZXJ3aXNlIGZyb20gbm9kZSBnbG9iYWxcbiAgICAgICAgICAgIGlmICghZGVjb21wICYmIHR5cGVvZiBnbG9iYWwgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgZGVjb21wID0gZ2xvYmFsLmRlY29tcDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgLy8gZGVjb21wIG5vdCBhdmFpbGFibGVcbiAgICAgICAgICAgIGRlY29tcCA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZGVjb21wO1xuICAgIH07XG59KSgpO1xuXG5cbi8qKiovIH0pLFxuLyogMSAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG4vKipcbiogVGhlIGBNYXR0ZXIuQm91bmRzYCBtb2R1bGUgY29udGFpbnMgbWV0aG9kcyBmb3IgY3JlYXRpbmcgYW5kIG1hbmlwdWxhdGluZyBheGlzLWFsaWduZWQgYm91bmRpbmcgYm94ZXMgKEFBQkIpLlxuKlxuKiBAY2xhc3MgQm91bmRzXG4qL1xuXG52YXIgQm91bmRzID0ge307XG5cbm1vZHVsZS5leHBvcnRzID0gQm91bmRzO1xuXG4oZnVuY3Rpb24oKSB7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IGF4aXMtYWxpZ25lZCBib3VuZGluZyBib3ggKEFBQkIpIGZvciB0aGUgZ2l2ZW4gdmVydGljZXMuXG4gICAgICogQG1ldGhvZCBjcmVhdGVcbiAgICAgKiBAcGFyYW0ge3ZlcnRpY2VzfSB2ZXJ0aWNlc1xuICAgICAqIEByZXR1cm4ge2JvdW5kc30gQSBuZXcgYm91bmRzIG9iamVjdFxuICAgICAqL1xuICAgIEJvdW5kcy5jcmVhdGUgPSBmdW5jdGlvbih2ZXJ0aWNlcykge1xuICAgICAgICB2YXIgYm91bmRzID0geyBcbiAgICAgICAgICAgIG1pbjogeyB4OiAwLCB5OiAwIH0sIFxuICAgICAgICAgICAgbWF4OiB7IHg6IDAsIHk6IDAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIGlmICh2ZXJ0aWNlcylcbiAgICAgICAgICAgIEJvdW5kcy51cGRhdGUoYm91bmRzLCB2ZXJ0aWNlcyk7XG4gICAgICAgIFxuICAgICAgICByZXR1cm4gYm91bmRzO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBVcGRhdGVzIGJvdW5kcyB1c2luZyB0aGUgZ2l2ZW4gdmVydGljZXMgYW5kIGV4dGVuZHMgdGhlIGJvdW5kcyBnaXZlbiBhIHZlbG9jaXR5LlxuICAgICAqIEBtZXRob2QgdXBkYXRlXG4gICAgICogQHBhcmFtIHtib3VuZHN9IGJvdW5kc1xuICAgICAqIEBwYXJhbSB7dmVydGljZXN9IHZlcnRpY2VzXG4gICAgICogQHBhcmFtIHt2ZWN0b3J9IHZlbG9jaXR5XG4gICAgICovXG4gICAgQm91bmRzLnVwZGF0ZSA9IGZ1bmN0aW9uKGJvdW5kcywgdmVydGljZXMsIHZlbG9jaXR5KSB7XG4gICAgICAgIGJvdW5kcy5taW4ueCA9IEluZmluaXR5O1xuICAgICAgICBib3VuZHMubWF4LnggPSAtSW5maW5pdHk7XG4gICAgICAgIGJvdW5kcy5taW4ueSA9IEluZmluaXR5O1xuICAgICAgICBib3VuZHMubWF4LnkgPSAtSW5maW5pdHk7XG5cbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2ZXJ0aWNlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIHZlcnRleCA9IHZlcnRpY2VzW2ldO1xuICAgICAgICAgICAgaWYgKHZlcnRleC54ID4gYm91bmRzLm1heC54KSBib3VuZHMubWF4LnggPSB2ZXJ0ZXgueDtcbiAgICAgICAgICAgIGlmICh2ZXJ0ZXgueCA8IGJvdW5kcy5taW4ueCkgYm91bmRzLm1pbi54ID0gdmVydGV4Lng7XG4gICAgICAgICAgICBpZiAodmVydGV4LnkgPiBib3VuZHMubWF4LnkpIGJvdW5kcy5tYXgueSA9IHZlcnRleC55O1xuICAgICAgICAgICAgaWYgKHZlcnRleC55IDwgYm91bmRzLm1pbi55KSBib3VuZHMubWluLnkgPSB2ZXJ0ZXgueTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgaWYgKHZlbG9jaXR5KSB7XG4gICAgICAgICAgICBpZiAodmVsb2NpdHkueCA+IDApIHtcbiAgICAgICAgICAgICAgICBib3VuZHMubWF4LnggKz0gdmVsb2NpdHkueDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgYm91bmRzLm1pbi54ICs9IHZlbG9jaXR5Lng7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmICh2ZWxvY2l0eS55ID4gMCkge1xuICAgICAgICAgICAgICAgIGJvdW5kcy5tYXgueSArPSB2ZWxvY2l0eS55O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBib3VuZHMubWluLnkgKz0gdmVsb2NpdHkueTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGJvdW5kcyBjb250YWlucyB0aGUgZ2l2ZW4gcG9pbnQuXG4gICAgICogQG1ldGhvZCBjb250YWluc1xuICAgICAqIEBwYXJhbSB7Ym91bmRzfSBib3VuZHNcbiAgICAgKiBAcGFyYW0ge3ZlY3Rvcn0gcG9pbnRcbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIHRoZSBib3VuZHMgY29udGFpbiB0aGUgcG9pbnQsIG90aGVyd2lzZSBmYWxzZVxuICAgICAqL1xuICAgIEJvdW5kcy5jb250YWlucyA9IGZ1bmN0aW9uKGJvdW5kcywgcG9pbnQpIHtcbiAgICAgICAgcmV0dXJuIHBvaW50LnggPj0gYm91bmRzLm1pbi54ICYmIHBvaW50LnggPD0gYm91bmRzLm1heC54IFxuICAgICAgICAgICAgICAgJiYgcG9pbnQueSA+PSBib3VuZHMubWluLnkgJiYgcG9pbnQueSA8PSBib3VuZHMubWF4Lnk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgdHdvIGJvdW5kcyBpbnRlcnNlY3QuXG4gICAgICogQG1ldGhvZCBvdmVybGFwc1xuICAgICAqIEBwYXJhbSB7Ym91bmRzfSBib3VuZHNBXG4gICAgICogQHBhcmFtIHtib3VuZHN9IGJvdW5kc0JcbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIHRoZSBib3VuZHMgb3ZlcmxhcCwgb3RoZXJ3aXNlIGZhbHNlXG4gICAgICovXG4gICAgQm91bmRzLm92ZXJsYXBzID0gZnVuY3Rpb24oYm91bmRzQSwgYm91bmRzQikge1xuICAgICAgICByZXR1cm4gKGJvdW5kc0EubWluLnggPD0gYm91bmRzQi5tYXgueCAmJiBib3VuZHNBLm1heC54ID49IGJvdW5kc0IubWluLnhcbiAgICAgICAgICAgICAgICAmJiBib3VuZHNBLm1heC55ID49IGJvdW5kc0IubWluLnkgJiYgYm91bmRzQS5taW4ueSA8PSBib3VuZHNCLm1heC55KTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogVHJhbnNsYXRlcyB0aGUgYm91bmRzIGJ5IHRoZSBnaXZlbiB2ZWN0b3IuXG4gICAgICogQG1ldGhvZCB0cmFuc2xhdGVcbiAgICAgKiBAcGFyYW0ge2JvdW5kc30gYm91bmRzXG4gICAgICogQHBhcmFtIHt2ZWN0b3J9IHZlY3RvclxuICAgICAqL1xuICAgIEJvdW5kcy50cmFuc2xhdGUgPSBmdW5jdGlvbihib3VuZHMsIHZlY3Rvcikge1xuICAgICAgICBib3VuZHMubWluLnggKz0gdmVjdG9yLng7XG4gICAgICAgIGJvdW5kcy5tYXgueCArPSB2ZWN0b3IueDtcbiAgICAgICAgYm91bmRzLm1pbi55ICs9IHZlY3Rvci55O1xuICAgICAgICBib3VuZHMubWF4LnkgKz0gdmVjdG9yLnk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFNoaWZ0cyB0aGUgYm91bmRzIHRvIHRoZSBnaXZlbiBwb3NpdGlvbi5cbiAgICAgKiBAbWV0aG9kIHNoaWZ0XG4gICAgICogQHBhcmFtIHtib3VuZHN9IGJvdW5kc1xuICAgICAqIEBwYXJhbSB7dmVjdG9yfSBwb3NpdGlvblxuICAgICAqL1xuICAgIEJvdW5kcy5zaGlmdCA9IGZ1bmN0aW9uKGJvdW5kcywgcG9zaXRpb24pIHtcbiAgICAgICAgdmFyIGRlbHRhWCA9IGJvdW5kcy5tYXgueCAtIGJvdW5kcy5taW4ueCxcbiAgICAgICAgICAgIGRlbHRhWSA9IGJvdW5kcy5tYXgueSAtIGJvdW5kcy5taW4ueTtcbiAgICAgICAgICAgIFxuICAgICAgICBib3VuZHMubWluLnggPSBwb3NpdGlvbi54O1xuICAgICAgICBib3VuZHMubWF4LnggPSBwb3NpdGlvbi54ICsgZGVsdGFYO1xuICAgICAgICBib3VuZHMubWluLnkgPSBwb3NpdGlvbi55O1xuICAgICAgICBib3VuZHMubWF4LnkgPSBwb3NpdGlvbi55ICsgZGVsdGFZO1xuICAgIH07XG4gICAgXG59KSgpO1xuXG5cbi8qKiovIH0pLFxuLyogMiAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG4vKipcbiogVGhlIGBNYXR0ZXIuVmVjdG9yYCBtb2R1bGUgY29udGFpbnMgbWV0aG9kcyBmb3IgY3JlYXRpbmcgYW5kIG1hbmlwdWxhdGluZyB2ZWN0b3JzLlxuKiBWZWN0b3JzIGFyZSB0aGUgYmFzaXMgb2YgYWxsIHRoZSBnZW9tZXRyeSByZWxhdGVkIG9wZXJhdGlvbnMgaW4gdGhlIGVuZ2luZS5cbiogQSBgTWF0dGVyLlZlY3RvcmAgb2JqZWN0IGlzIG9mIHRoZSBmb3JtIGB7IHg6IDAsIHk6IDAgfWAuXG4qXG4qIFNlZSB0aGUgaW5jbHVkZWQgdXNhZ2UgW2V4YW1wbGVzXShodHRwczovL2dpdGh1Yi5jb20vbGlhYnJ1L21hdHRlci1qcy90cmVlL21hc3Rlci9leGFtcGxlcykuXG4qXG4qIEBjbGFzcyBWZWN0b3JcbiovXG5cbi8vIFRPRE86IGNvbnNpZGVyIHBhcmFtcyBmb3IgcmV1c2luZyB2ZWN0b3Igb2JqZWN0c1xuXG52YXIgVmVjdG9yID0ge307XG5cbm1vZHVsZS5leHBvcnRzID0gVmVjdG9yO1xuXG4oZnVuY3Rpb24oKSB7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IHZlY3Rvci5cbiAgICAgKiBAbWV0aG9kIGNyZWF0ZVxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB4XG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHlcbiAgICAgKiBAcmV0dXJuIHt2ZWN0b3J9IEEgbmV3IHZlY3RvclxuICAgICAqL1xuICAgIFZlY3Rvci5jcmVhdGUgPSBmdW5jdGlvbih4LCB5KSB7XG4gICAgICAgIHJldHVybiB7IHg6IHggfHwgMCwgeTogeSB8fCAwIH07XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBuZXcgdmVjdG9yIHdpdGggYHhgIGFuZCBgeWAgY29waWVkIGZyb20gdGhlIGdpdmVuIGB2ZWN0b3JgLlxuICAgICAqIEBtZXRob2QgY2xvbmVcbiAgICAgKiBAcGFyYW0ge3ZlY3Rvcn0gdmVjdG9yXG4gICAgICogQHJldHVybiB7dmVjdG9yfSBBIG5ldyBjbG9uZWQgdmVjdG9yXG4gICAgICovXG4gICAgVmVjdG9yLmNsb25lID0gZnVuY3Rpb24odmVjdG9yKSB7XG4gICAgICAgIHJldHVybiB7IHg6IHZlY3Rvci54LCB5OiB2ZWN0b3IueSB9O1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBtYWduaXR1ZGUgKGxlbmd0aCkgb2YgYSB2ZWN0b3IuXG4gICAgICogQG1ldGhvZCBtYWduaXR1ZGVcbiAgICAgKiBAcGFyYW0ge3ZlY3Rvcn0gdmVjdG9yXG4gICAgICogQHJldHVybiB7bnVtYmVyfSBUaGUgbWFnbml0dWRlIG9mIHRoZSB2ZWN0b3JcbiAgICAgKi9cbiAgICBWZWN0b3IubWFnbml0dWRlID0gZnVuY3Rpb24odmVjdG9yKSB7XG4gICAgICAgIHJldHVybiBNYXRoLnNxcnQoKHZlY3Rvci54ICogdmVjdG9yLngpICsgKHZlY3Rvci55ICogdmVjdG9yLnkpKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgbWFnbml0dWRlIChsZW5ndGgpIG9mIGEgdmVjdG9yICh0aGVyZWZvcmUgc2F2aW5nIGEgYHNxcnRgIG9wZXJhdGlvbikuXG4gICAgICogQG1ldGhvZCBtYWduaXR1ZGVTcXVhcmVkXG4gICAgICogQHBhcmFtIHt2ZWN0b3J9IHZlY3RvclxuICAgICAqIEByZXR1cm4ge251bWJlcn0gVGhlIHNxdWFyZWQgbWFnbml0dWRlIG9mIHRoZSB2ZWN0b3JcbiAgICAgKi9cbiAgICBWZWN0b3IubWFnbml0dWRlU3F1YXJlZCA9IGZ1bmN0aW9uKHZlY3Rvcikge1xuICAgICAgICByZXR1cm4gKHZlY3Rvci54ICogdmVjdG9yLngpICsgKHZlY3Rvci55ICogdmVjdG9yLnkpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBSb3RhdGVzIHRoZSB2ZWN0b3IgYWJvdXQgKDAsIDApIGJ5IHNwZWNpZmllZCBhbmdsZS5cbiAgICAgKiBAbWV0aG9kIHJvdGF0ZVxuICAgICAqIEBwYXJhbSB7dmVjdG9yfSB2ZWN0b3JcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gYW5nbGVcbiAgICAgKiBAcGFyYW0ge3ZlY3Rvcn0gW291dHB1dF1cbiAgICAgKiBAcmV0dXJuIHt2ZWN0b3J9IFRoZSB2ZWN0b3Igcm90YXRlZCBhYm91dCAoMCwgMClcbiAgICAgKi9cbiAgICBWZWN0b3Iucm90YXRlID0gZnVuY3Rpb24odmVjdG9yLCBhbmdsZSwgb3V0cHV0KSB7XG4gICAgICAgIHZhciBjb3MgPSBNYXRoLmNvcyhhbmdsZSksIHNpbiA9IE1hdGguc2luKGFuZ2xlKTtcbiAgICAgICAgaWYgKCFvdXRwdXQpIG91dHB1dCA9IHt9O1xuICAgICAgICB2YXIgeCA9IHZlY3Rvci54ICogY29zIC0gdmVjdG9yLnkgKiBzaW47XG4gICAgICAgIG91dHB1dC55ID0gdmVjdG9yLnggKiBzaW4gKyB2ZWN0b3IueSAqIGNvcztcbiAgICAgICAgb3V0cHV0LnggPSB4O1xuICAgICAgICByZXR1cm4gb3V0cHV0O1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBSb3RhdGVzIHRoZSB2ZWN0b3IgYWJvdXQgYSBzcGVjaWZpZWQgcG9pbnQgYnkgc3BlY2lmaWVkIGFuZ2xlLlxuICAgICAqIEBtZXRob2Qgcm90YXRlQWJvdXRcbiAgICAgKiBAcGFyYW0ge3ZlY3Rvcn0gdmVjdG9yXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGFuZ2xlXG4gICAgICogQHBhcmFtIHt2ZWN0b3J9IHBvaW50XG4gICAgICogQHBhcmFtIHt2ZWN0b3J9IFtvdXRwdXRdXG4gICAgICogQHJldHVybiB7dmVjdG9yfSBBIG5ldyB2ZWN0b3Igcm90YXRlZCBhYm91dCB0aGUgcG9pbnRcbiAgICAgKi9cbiAgICBWZWN0b3Iucm90YXRlQWJvdXQgPSBmdW5jdGlvbih2ZWN0b3IsIGFuZ2xlLCBwb2ludCwgb3V0cHV0KSB7XG4gICAgICAgIHZhciBjb3MgPSBNYXRoLmNvcyhhbmdsZSksIHNpbiA9IE1hdGguc2luKGFuZ2xlKTtcbiAgICAgICAgaWYgKCFvdXRwdXQpIG91dHB1dCA9IHt9O1xuICAgICAgICB2YXIgeCA9IHBvaW50LnggKyAoKHZlY3Rvci54IC0gcG9pbnQueCkgKiBjb3MgLSAodmVjdG9yLnkgLSBwb2ludC55KSAqIHNpbik7XG4gICAgICAgIG91dHB1dC55ID0gcG9pbnQueSArICgodmVjdG9yLnggLSBwb2ludC54KSAqIHNpbiArICh2ZWN0b3IueSAtIHBvaW50LnkpICogY29zKTtcbiAgICAgICAgb3V0cHV0LnggPSB4O1xuICAgICAgICByZXR1cm4gb3V0cHV0O1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBOb3JtYWxpc2VzIGEgdmVjdG9yIChzdWNoIHRoYXQgaXRzIG1hZ25pdHVkZSBpcyBgMWApLlxuICAgICAqIEBtZXRob2Qgbm9ybWFsaXNlXG4gICAgICogQHBhcmFtIHt2ZWN0b3J9IHZlY3RvclxuICAgICAqIEByZXR1cm4ge3ZlY3Rvcn0gQSBuZXcgdmVjdG9yIG5vcm1hbGlzZWRcbiAgICAgKi9cbiAgICBWZWN0b3Iubm9ybWFsaXNlID0gZnVuY3Rpb24odmVjdG9yKSB7XG4gICAgICAgIHZhciBtYWduaXR1ZGUgPSBWZWN0b3IubWFnbml0dWRlKHZlY3Rvcik7XG4gICAgICAgIGlmIChtYWduaXR1ZGUgPT09IDApXG4gICAgICAgICAgICByZXR1cm4geyB4OiAwLCB5OiAwIH07XG4gICAgICAgIHJldHVybiB7IHg6IHZlY3Rvci54IC8gbWFnbml0dWRlLCB5OiB2ZWN0b3IueSAvIG1hZ25pdHVkZSB9O1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBkb3QtcHJvZHVjdCBvZiB0d28gdmVjdG9ycy5cbiAgICAgKiBAbWV0aG9kIGRvdFxuICAgICAqIEBwYXJhbSB7dmVjdG9yfSB2ZWN0b3JBXG4gICAgICogQHBhcmFtIHt2ZWN0b3J9IHZlY3RvckJcbiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBkb3QgcHJvZHVjdCBvZiB0aGUgdHdvIHZlY3RvcnNcbiAgICAgKi9cbiAgICBWZWN0b3IuZG90ID0gZnVuY3Rpb24odmVjdG9yQSwgdmVjdG9yQikge1xuICAgICAgICByZXR1cm4gKHZlY3RvckEueCAqIHZlY3RvckIueCkgKyAodmVjdG9yQS55ICogdmVjdG9yQi55KTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgY3Jvc3MtcHJvZHVjdCBvZiB0d28gdmVjdG9ycy5cbiAgICAgKiBAbWV0aG9kIGNyb3NzXG4gICAgICogQHBhcmFtIHt2ZWN0b3J9IHZlY3RvckFcbiAgICAgKiBAcGFyYW0ge3ZlY3Rvcn0gdmVjdG9yQlxuICAgICAqIEByZXR1cm4ge251bWJlcn0gVGhlIGNyb3NzIHByb2R1Y3Qgb2YgdGhlIHR3byB2ZWN0b3JzXG4gICAgICovXG4gICAgVmVjdG9yLmNyb3NzID0gZnVuY3Rpb24odmVjdG9yQSwgdmVjdG9yQikge1xuICAgICAgICByZXR1cm4gKHZlY3RvckEueCAqIHZlY3RvckIueSkgLSAodmVjdG9yQS55ICogdmVjdG9yQi54KTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgY3Jvc3MtcHJvZHVjdCBvZiB0aHJlZSB2ZWN0b3JzLlxuICAgICAqIEBtZXRob2QgY3Jvc3MzXG4gICAgICogQHBhcmFtIHt2ZWN0b3J9IHZlY3RvckFcbiAgICAgKiBAcGFyYW0ge3ZlY3Rvcn0gdmVjdG9yQlxuICAgICAqIEBwYXJhbSB7dmVjdG9yfSB2ZWN0b3JDXG4gICAgICogQHJldHVybiB7bnVtYmVyfSBUaGUgY3Jvc3MgcHJvZHVjdCBvZiB0aGUgdGhyZWUgdmVjdG9yc1xuICAgICAqL1xuICAgIFZlY3Rvci5jcm9zczMgPSBmdW5jdGlvbih2ZWN0b3JBLCB2ZWN0b3JCLCB2ZWN0b3JDKSB7XG4gICAgICAgIHJldHVybiAodmVjdG9yQi54IC0gdmVjdG9yQS54KSAqICh2ZWN0b3JDLnkgLSB2ZWN0b3JBLnkpIC0gKHZlY3RvckIueSAtIHZlY3RvckEueSkgKiAodmVjdG9yQy54IC0gdmVjdG9yQS54KTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQWRkcyB0aGUgdHdvIHZlY3RvcnMuXG4gICAgICogQG1ldGhvZCBhZGRcbiAgICAgKiBAcGFyYW0ge3ZlY3Rvcn0gdmVjdG9yQVxuICAgICAqIEBwYXJhbSB7dmVjdG9yfSB2ZWN0b3JCXG4gICAgICogQHBhcmFtIHt2ZWN0b3J9IFtvdXRwdXRdXG4gICAgICogQHJldHVybiB7dmVjdG9yfSBBIG5ldyB2ZWN0b3Igb2YgdmVjdG9yQSBhbmQgdmVjdG9yQiBhZGRlZFxuICAgICAqL1xuICAgIFZlY3Rvci5hZGQgPSBmdW5jdGlvbih2ZWN0b3JBLCB2ZWN0b3JCLCBvdXRwdXQpIHtcbiAgICAgICAgaWYgKCFvdXRwdXQpIG91dHB1dCA9IHt9O1xuICAgICAgICBvdXRwdXQueCA9IHZlY3RvckEueCArIHZlY3RvckIueDtcbiAgICAgICAgb3V0cHV0LnkgPSB2ZWN0b3JBLnkgKyB2ZWN0b3JCLnk7XG4gICAgICAgIHJldHVybiBvdXRwdXQ7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFN1YnRyYWN0cyB0aGUgdHdvIHZlY3RvcnMuXG4gICAgICogQG1ldGhvZCBzdWJcbiAgICAgKiBAcGFyYW0ge3ZlY3Rvcn0gdmVjdG9yQVxuICAgICAqIEBwYXJhbSB7dmVjdG9yfSB2ZWN0b3JCXG4gICAgICogQHBhcmFtIHt2ZWN0b3J9IFtvdXRwdXRdXG4gICAgICogQHJldHVybiB7dmVjdG9yfSBBIG5ldyB2ZWN0b3Igb2YgdmVjdG9yQSBhbmQgdmVjdG9yQiBzdWJ0cmFjdGVkXG4gICAgICovXG4gICAgVmVjdG9yLnN1YiA9IGZ1bmN0aW9uKHZlY3RvckEsIHZlY3RvckIsIG91dHB1dCkge1xuICAgICAgICBpZiAoIW91dHB1dCkgb3V0cHV0ID0ge307XG4gICAgICAgIG91dHB1dC54ID0gdmVjdG9yQS54IC0gdmVjdG9yQi54O1xuICAgICAgICBvdXRwdXQueSA9IHZlY3RvckEueSAtIHZlY3RvckIueTtcbiAgICAgICAgcmV0dXJuIG91dHB1dDtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogTXVsdGlwbGllcyBhIHZlY3RvciBhbmQgYSBzY2FsYXIuXG4gICAgICogQG1ldGhvZCBtdWx0XG4gICAgICogQHBhcmFtIHt2ZWN0b3J9IHZlY3RvclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBzY2FsYXJcbiAgICAgKiBAcmV0dXJuIHt2ZWN0b3J9IEEgbmV3IHZlY3RvciBtdWx0aXBsaWVkIGJ5IHNjYWxhclxuICAgICAqL1xuICAgIFZlY3Rvci5tdWx0ID0gZnVuY3Rpb24odmVjdG9yLCBzY2FsYXIpIHtcbiAgICAgICAgcmV0dXJuIHsgeDogdmVjdG9yLnggKiBzY2FsYXIsIHk6IHZlY3Rvci55ICogc2NhbGFyIH07XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIERpdmlkZXMgYSB2ZWN0b3IgYW5kIGEgc2NhbGFyLlxuICAgICAqIEBtZXRob2QgZGl2XG4gICAgICogQHBhcmFtIHt2ZWN0b3J9IHZlY3RvclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBzY2FsYXJcbiAgICAgKiBAcmV0dXJuIHt2ZWN0b3J9IEEgbmV3IHZlY3RvciBkaXZpZGVkIGJ5IHNjYWxhclxuICAgICAqL1xuICAgIFZlY3Rvci5kaXYgPSBmdW5jdGlvbih2ZWN0b3IsIHNjYWxhcikge1xuICAgICAgICByZXR1cm4geyB4OiB2ZWN0b3IueCAvIHNjYWxhciwgeTogdmVjdG9yLnkgLyBzY2FsYXIgfTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgcGVycGVuZGljdWxhciB2ZWN0b3IuIFNldCBgbmVnYXRlYCB0byB0cnVlIGZvciB0aGUgcGVycGVuZGljdWxhciBpbiB0aGUgb3Bwb3NpdGUgZGlyZWN0aW9uLlxuICAgICAqIEBtZXRob2QgcGVycFxuICAgICAqIEBwYXJhbSB7dmVjdG9yfSB2ZWN0b3JcbiAgICAgKiBAcGFyYW0ge2Jvb2x9IFtuZWdhdGU9ZmFsc2VdXG4gICAgICogQHJldHVybiB7dmVjdG9yfSBUaGUgcGVycGVuZGljdWxhciB2ZWN0b3JcbiAgICAgKi9cbiAgICBWZWN0b3IucGVycCA9IGZ1bmN0aW9uKHZlY3RvciwgbmVnYXRlKSB7XG4gICAgICAgIG5lZ2F0ZSA9IG5lZ2F0ZSA9PT0gdHJ1ZSA/IC0xIDogMTtcbiAgICAgICAgcmV0dXJuIHsgeDogbmVnYXRlICogLXZlY3Rvci55LCB5OiBuZWdhdGUgKiB2ZWN0b3IueCB9O1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBOZWdhdGVzIGJvdGggY29tcG9uZW50cyBvZiBhIHZlY3RvciBzdWNoIHRoYXQgaXQgcG9pbnRzIGluIHRoZSBvcHBvc2l0ZSBkaXJlY3Rpb24uXG4gICAgICogQG1ldGhvZCBuZWdcbiAgICAgKiBAcGFyYW0ge3ZlY3Rvcn0gdmVjdG9yXG4gICAgICogQHJldHVybiB7dmVjdG9yfSBUaGUgbmVnYXRlZCB2ZWN0b3JcbiAgICAgKi9cbiAgICBWZWN0b3IubmVnID0gZnVuY3Rpb24odmVjdG9yKSB7XG4gICAgICAgIHJldHVybiB7IHg6IC12ZWN0b3IueCwgeTogLXZlY3Rvci55IH07XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGFuZ2xlIGJldHdlZW4gdGhlIHZlY3RvciBgdmVjdG9yQiAtIHZlY3RvckFgIGFuZCB0aGUgeC1heGlzIGluIHJhZGlhbnMuXG4gICAgICogQG1ldGhvZCBhbmdsZVxuICAgICAqIEBwYXJhbSB7dmVjdG9yfSB2ZWN0b3JBXG4gICAgICogQHBhcmFtIHt2ZWN0b3J9IHZlY3RvckJcbiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBhbmdsZSBpbiByYWRpYW5zXG4gICAgICovXG4gICAgVmVjdG9yLmFuZ2xlID0gZnVuY3Rpb24odmVjdG9yQSwgdmVjdG9yQikge1xuICAgICAgICByZXR1cm4gTWF0aC5hdGFuMih2ZWN0b3JCLnkgLSB2ZWN0b3JBLnksIHZlY3RvckIueCAtIHZlY3RvckEueCk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFRlbXBvcmFyeSB2ZWN0b3IgcG9vbCAobm90IHRocmVhZC1zYWZlKS5cbiAgICAgKiBAcHJvcGVydHkgX3RlbXBcbiAgICAgKiBAdHlwZSB7dmVjdG9yW119XG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBWZWN0b3IuX3RlbXAgPSBbXG4gICAgICAgIFZlY3Rvci5jcmVhdGUoKSwgVmVjdG9yLmNyZWF0ZSgpLCBcbiAgICAgICAgVmVjdG9yLmNyZWF0ZSgpLCBWZWN0b3IuY3JlYXRlKCksIFxuICAgICAgICBWZWN0b3IuY3JlYXRlKCksIFZlY3Rvci5jcmVhdGUoKVxuICAgIF07XG5cbn0pKCk7XG5cbi8qKiovIH0pLFxuLyogMyAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG4vKipcbiogVGhlIGBNYXR0ZXIuVmVydGljZXNgIG1vZHVsZSBjb250YWlucyBtZXRob2RzIGZvciBjcmVhdGluZyBhbmQgbWFuaXB1bGF0aW5nIHNldHMgb2YgdmVydGljZXMuXG4qIEEgc2V0IG9mIHZlcnRpY2VzIGlzIGFuIGFycmF5IG9mIGBNYXR0ZXIuVmVjdG9yYCB3aXRoIGFkZGl0aW9uYWwgaW5kZXhpbmcgcHJvcGVydGllcyBpbnNlcnRlZCBieSBgVmVydGljZXMuY3JlYXRlYC5cbiogQSBgTWF0dGVyLkJvZHlgIG1haW50YWlucyBhIHNldCBvZiB2ZXJ0aWNlcyB0byByZXByZXNlbnQgdGhlIHNoYXBlIG9mIHRoZSBvYmplY3QgKGl0cyBjb252ZXggaHVsbCkuXG4qXG4qIFNlZSB0aGUgaW5jbHVkZWQgdXNhZ2UgW2V4YW1wbGVzXShodHRwczovL2dpdGh1Yi5jb20vbGlhYnJ1L21hdHRlci1qcy90cmVlL21hc3Rlci9leGFtcGxlcykuXG4qXG4qIEBjbGFzcyBWZXJ0aWNlc1xuKi9cblxudmFyIFZlcnRpY2VzID0ge307XG5cbm1vZHVsZS5leHBvcnRzID0gVmVydGljZXM7XG5cbnZhciBWZWN0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIpO1xudmFyIENvbW1vbiA9IF9fd2VicGFja19yZXF1aXJlX18oMCk7XG5cbihmdW5jdGlvbigpIHtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgc2V0IG9mIGBNYXR0ZXIuQm9keWAgY29tcGF0aWJsZSB2ZXJ0aWNlcy5cbiAgICAgKiBUaGUgYHBvaW50c2AgYXJndW1lbnQgYWNjZXB0cyBhbiBhcnJheSBvZiBgTWF0dGVyLlZlY3RvcmAgcG9pbnRzIG9yaWVudGF0ZWQgYXJvdW5kIHRoZSBvcmlnaW4gYCgwLCAwKWAsIGZvciBleGFtcGxlOlxuICAgICAqXG4gICAgICogICAgIFt7IHg6IDAsIHk6IDAgfSwgeyB4OiAyNSwgeTogNTAgfSwgeyB4OiA1MCwgeTogMCB9XVxuICAgICAqXG4gICAgICogVGhlIGBWZXJ0aWNlcy5jcmVhdGVgIG1ldGhvZCByZXR1cm5zIGEgbmV3IGFycmF5IG9mIHZlcnRpY2VzLCB3aGljaCBhcmUgc2ltaWxhciB0byBNYXR0ZXIuVmVjdG9yIG9iamVjdHMsXG4gICAgICogYnV0IHdpdGggc29tZSBhZGRpdGlvbmFsIHJlZmVyZW5jZXMgcmVxdWlyZWQgZm9yIGVmZmljaWVudCBjb2xsaXNpb24gZGV0ZWN0aW9uIHJvdXRpbmVzLlxuICAgICAqXG4gICAgICogVmVydGljZXMgbXVzdCBiZSBzcGVjaWZpZWQgaW4gY2xvY2t3aXNlIG9yZGVyLlxuICAgICAqXG4gICAgICogTm90ZSB0aGF0IHRoZSBgYm9keWAgYXJndW1lbnQgaXMgbm90IG9wdGlvbmFsLCBhIGBNYXR0ZXIuQm9keWAgcmVmZXJlbmNlIG11c3QgYmUgcHJvdmlkZWQuXG4gICAgICpcbiAgICAgKiBAbWV0aG9kIGNyZWF0ZVxuICAgICAqIEBwYXJhbSB7dmVjdG9yW119IHBvaW50c1xuICAgICAqIEBwYXJhbSB7Ym9keX0gYm9keVxuICAgICAqL1xuICAgIFZlcnRpY2VzLmNyZWF0ZSA9IGZ1bmN0aW9uKHBvaW50cywgYm9keSkge1xuICAgICAgICB2YXIgdmVydGljZXMgPSBbXTtcblxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBvaW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIHBvaW50ID0gcG9pbnRzW2ldLFxuICAgICAgICAgICAgICAgIHZlcnRleCA9IHtcbiAgICAgICAgICAgICAgICAgICAgeDogcG9pbnQueCxcbiAgICAgICAgICAgICAgICAgICAgeTogcG9pbnQueSxcbiAgICAgICAgICAgICAgICAgICAgaW5kZXg6IGksXG4gICAgICAgICAgICAgICAgICAgIGJvZHk6IGJvZHksXG4gICAgICAgICAgICAgICAgICAgIGlzSW50ZXJuYWw6IGZhbHNlXG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgdmVydGljZXMucHVzaCh2ZXJ0ZXgpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHZlcnRpY2VzO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBQYXJzZXMgYSBzdHJpbmcgY29udGFpbmluZyBvcmRlcmVkIHggeSBwYWlycyBzZXBhcmF0ZWQgYnkgc3BhY2VzIChhbmQgb3B0aW9uYWxseSBjb21tYXMpLCBcbiAgICAgKiBpbnRvIGEgYE1hdHRlci5WZXJ0aWNlc2Agb2JqZWN0IGZvciB0aGUgZ2l2ZW4gYE1hdHRlci5Cb2R5YC5cbiAgICAgKiBGb3IgcGFyc2luZyBTVkcgcGF0aHMsIHNlZSBgU3ZnLnBhdGhUb1ZlcnRpY2VzYC5cbiAgICAgKiBAbWV0aG9kIGZyb21QYXRoXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAgICAgKiBAcGFyYW0ge2JvZHl9IGJvZHlcbiAgICAgKiBAcmV0dXJuIHt2ZXJ0aWNlc30gdmVydGljZXNcbiAgICAgKi9cbiAgICBWZXJ0aWNlcy5mcm9tUGF0aCA9IGZ1bmN0aW9uKHBhdGgsIGJvZHkpIHtcbiAgICAgICAgdmFyIHBhdGhQYXR0ZXJuID0gL0w/XFxzKihbLVxcZC5lXSspW1xccyxdKihbLVxcZC5lXSspKi9pZyxcbiAgICAgICAgICAgIHBvaW50cyA9IFtdO1xuXG4gICAgICAgIHBhdGgucmVwbGFjZShwYXRoUGF0dGVybiwgZnVuY3Rpb24obWF0Y2gsIHgsIHkpIHtcbiAgICAgICAgICAgIHBvaW50cy5wdXNoKHsgeDogcGFyc2VGbG9hdCh4KSwgeTogcGFyc2VGbG9hdCh5KSB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIFZlcnRpY2VzLmNyZWF0ZShwb2ludHMsIGJvZHkpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBjZW50cmUgKGNlbnRyb2lkKSBvZiB0aGUgc2V0IG9mIHZlcnRpY2VzLlxuICAgICAqIEBtZXRob2QgY2VudHJlXG4gICAgICogQHBhcmFtIHt2ZXJ0aWNlc30gdmVydGljZXNcbiAgICAgKiBAcmV0dXJuIHt2ZWN0b3J9IFRoZSBjZW50cmUgcG9pbnRcbiAgICAgKi9cbiAgICBWZXJ0aWNlcy5jZW50cmUgPSBmdW5jdGlvbih2ZXJ0aWNlcykge1xuICAgICAgICB2YXIgYXJlYSA9IFZlcnRpY2VzLmFyZWEodmVydGljZXMsIHRydWUpLFxuICAgICAgICAgICAgY2VudHJlID0geyB4OiAwLCB5OiAwIH0sXG4gICAgICAgICAgICBjcm9zcyxcbiAgICAgICAgICAgIHRlbXAsXG4gICAgICAgICAgICBqO1xuXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmVydGljZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGogPSAoaSArIDEpICUgdmVydGljZXMubGVuZ3RoO1xuICAgICAgICAgICAgY3Jvc3MgPSBWZWN0b3IuY3Jvc3ModmVydGljZXNbaV0sIHZlcnRpY2VzW2pdKTtcbiAgICAgICAgICAgIHRlbXAgPSBWZWN0b3IubXVsdChWZWN0b3IuYWRkKHZlcnRpY2VzW2ldLCB2ZXJ0aWNlc1tqXSksIGNyb3NzKTtcbiAgICAgICAgICAgIGNlbnRyZSA9IFZlY3Rvci5hZGQoY2VudHJlLCB0ZW1wKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBWZWN0b3IuZGl2KGNlbnRyZSwgNiAqIGFyZWEpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBhdmVyYWdlIChtZWFuKSBvZiB0aGUgc2V0IG9mIHZlcnRpY2VzLlxuICAgICAqIEBtZXRob2QgbWVhblxuICAgICAqIEBwYXJhbSB7dmVydGljZXN9IHZlcnRpY2VzXG4gICAgICogQHJldHVybiB7dmVjdG9yfSBUaGUgYXZlcmFnZSBwb2ludFxuICAgICAqL1xuICAgIFZlcnRpY2VzLm1lYW4gPSBmdW5jdGlvbih2ZXJ0aWNlcykge1xuICAgICAgICB2YXIgYXZlcmFnZSA9IHsgeDogMCwgeTogMCB9O1xuXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmVydGljZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGF2ZXJhZ2UueCArPSB2ZXJ0aWNlc1tpXS54O1xuICAgICAgICAgICAgYXZlcmFnZS55ICs9IHZlcnRpY2VzW2ldLnk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gVmVjdG9yLmRpdihhdmVyYWdlLCB2ZXJ0aWNlcy5sZW5ndGgpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBhcmVhIG9mIHRoZSBzZXQgb2YgdmVydGljZXMuXG4gICAgICogQG1ldGhvZCBhcmVhXG4gICAgICogQHBhcmFtIHt2ZXJ0aWNlc30gdmVydGljZXNcbiAgICAgKiBAcGFyYW0ge2Jvb2x9IHNpZ25lZFxuICAgICAqIEByZXR1cm4ge251bWJlcn0gVGhlIGFyZWFcbiAgICAgKi9cbiAgICBWZXJ0aWNlcy5hcmVhID0gZnVuY3Rpb24odmVydGljZXMsIHNpZ25lZCkge1xuICAgICAgICB2YXIgYXJlYSA9IDAsXG4gICAgICAgICAgICBqID0gdmVydGljZXMubGVuZ3RoIC0gMTtcblxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZlcnRpY2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBhcmVhICs9ICh2ZXJ0aWNlc1tqXS54IC0gdmVydGljZXNbaV0ueCkgKiAodmVydGljZXNbal0ueSArIHZlcnRpY2VzW2ldLnkpO1xuICAgICAgICAgICAgaiA9IGk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc2lnbmVkKVxuICAgICAgICAgICAgcmV0dXJuIGFyZWEgLyAyO1xuXG4gICAgICAgIHJldHVybiBNYXRoLmFicyhhcmVhKSAvIDI7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIG1vbWVudCBvZiBpbmVydGlhIChzZWNvbmQgbW9tZW50IG9mIGFyZWEpIG9mIHRoZSBzZXQgb2YgdmVydGljZXMgZ2l2ZW4gdGhlIHRvdGFsIG1hc3MuXG4gICAgICogQG1ldGhvZCBpbmVydGlhXG4gICAgICogQHBhcmFtIHt2ZXJ0aWNlc30gdmVydGljZXNcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbWFzc1xuICAgICAqIEByZXR1cm4ge251bWJlcn0gVGhlIHBvbHlnb24ncyBtb21lbnQgb2YgaW5lcnRpYVxuICAgICAqL1xuICAgIFZlcnRpY2VzLmluZXJ0aWEgPSBmdW5jdGlvbih2ZXJ0aWNlcywgbWFzcykge1xuICAgICAgICB2YXIgbnVtZXJhdG9yID0gMCxcbiAgICAgICAgICAgIGRlbm9taW5hdG9yID0gMCxcbiAgICAgICAgICAgIHYgPSB2ZXJ0aWNlcyxcbiAgICAgICAgICAgIGNyb3NzLFxuICAgICAgICAgICAgajtcblxuICAgICAgICAvLyBmaW5kIHRoZSBwb2x5Z29uJ3MgbW9tZW50IG9mIGluZXJ0aWEsIHVzaW5nIHNlY29uZCBtb21lbnQgb2YgYXJlYVxuICAgICAgICAvLyBmcm9tIGVxdWF0aW9ucyBhdCBodHRwOi8vd3d3LnBoeXNpY3Nmb3J1bXMuY29tL3Nob3d0aHJlYWQucGhwP3Q9MjUyOTNcbiAgICAgICAgZm9yICh2YXIgbiA9IDA7IG4gPCB2Lmxlbmd0aDsgbisrKSB7XG4gICAgICAgICAgICBqID0gKG4gKyAxKSAlIHYubGVuZ3RoO1xuICAgICAgICAgICAgY3Jvc3MgPSBNYXRoLmFicyhWZWN0b3IuY3Jvc3ModltqXSwgdltuXSkpO1xuICAgICAgICAgICAgbnVtZXJhdG9yICs9IGNyb3NzICogKFZlY3Rvci5kb3QodltqXSwgdltqXSkgKyBWZWN0b3IuZG90KHZbal0sIHZbbl0pICsgVmVjdG9yLmRvdCh2W25dLCB2W25dKSk7XG4gICAgICAgICAgICBkZW5vbWluYXRvciArPSBjcm9zcztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAobWFzcyAvIDYpICogKG51bWVyYXRvciAvIGRlbm9taW5hdG9yKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogVHJhbnNsYXRlcyB0aGUgc2V0IG9mIHZlcnRpY2VzIGluLXBsYWNlLlxuICAgICAqIEBtZXRob2QgdHJhbnNsYXRlXG4gICAgICogQHBhcmFtIHt2ZXJ0aWNlc30gdmVydGljZXNcbiAgICAgKiBAcGFyYW0ge3ZlY3Rvcn0gdmVjdG9yXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHNjYWxhclxuICAgICAqL1xuICAgIFZlcnRpY2VzLnRyYW5zbGF0ZSA9IGZ1bmN0aW9uKHZlcnRpY2VzLCB2ZWN0b3IsIHNjYWxhcikge1xuICAgICAgICBzY2FsYXIgPSB0eXBlb2Ygc2NhbGFyICE9PSAndW5kZWZpbmVkJyA/IHNjYWxhciA6IDE7XG5cbiAgICAgICAgdmFyIHZlcnRpY2VzTGVuZ3RoID0gdmVydGljZXMubGVuZ3RoLFxuICAgICAgICAgICAgdHJhbnNsYXRlWCA9IHZlY3Rvci54ICogc2NhbGFyLFxuICAgICAgICAgICAgdHJhbnNsYXRlWSA9IHZlY3Rvci55ICogc2NhbGFyLFxuICAgICAgICAgICAgaTtcbiAgICAgICAgXG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCB2ZXJ0aWNlc0xlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2ZXJ0aWNlc1tpXS54ICs9IHRyYW5zbGF0ZVg7XG4gICAgICAgICAgICB2ZXJ0aWNlc1tpXS55ICs9IHRyYW5zbGF0ZVk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdmVydGljZXM7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFJvdGF0ZXMgdGhlIHNldCBvZiB2ZXJ0aWNlcyBpbi1wbGFjZS5cbiAgICAgKiBAbWV0aG9kIHJvdGF0ZVxuICAgICAqIEBwYXJhbSB7dmVydGljZXN9IHZlcnRpY2VzXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGFuZ2xlXG4gICAgICogQHBhcmFtIHt2ZWN0b3J9IHBvaW50XG4gICAgICovXG4gICAgVmVydGljZXMucm90YXRlID0gZnVuY3Rpb24odmVydGljZXMsIGFuZ2xlLCBwb2ludCkge1xuICAgICAgICBpZiAoYW5nbGUgPT09IDApXG4gICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgdmFyIGNvcyA9IE1hdGguY29zKGFuZ2xlKSxcbiAgICAgICAgICAgIHNpbiA9IE1hdGguc2luKGFuZ2xlKSxcbiAgICAgICAgICAgIHBvaW50WCA9IHBvaW50LngsXG4gICAgICAgICAgICBwb2ludFkgPSBwb2ludC55LFxuICAgICAgICAgICAgdmVydGljZXNMZW5ndGggPSB2ZXJ0aWNlcy5sZW5ndGgsXG4gICAgICAgICAgICB2ZXJ0ZXgsXG4gICAgICAgICAgICBkeCxcbiAgICAgICAgICAgIGR5LFxuICAgICAgICAgICAgaTtcblxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdmVydGljZXNMZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmVydGV4ID0gdmVydGljZXNbaV07XG4gICAgICAgICAgICBkeCA9IHZlcnRleC54IC0gcG9pbnRYO1xuICAgICAgICAgICAgZHkgPSB2ZXJ0ZXgueSAtIHBvaW50WTtcbiAgICAgICAgICAgIHZlcnRleC54ID0gcG9pbnRYICsgKGR4ICogY29zIC0gZHkgKiBzaW4pO1xuICAgICAgICAgICAgdmVydGV4LnkgPSBwb2ludFkgKyAoZHggKiBzaW4gKyBkeSAqIGNvcyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdmVydGljZXM7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYHRydWVgIGlmIHRoZSBgcG9pbnRgIGlzIGluc2lkZSB0aGUgc2V0IG9mIGB2ZXJ0aWNlc2AuXG4gICAgICogQG1ldGhvZCBjb250YWluc1xuICAgICAqIEBwYXJhbSB7dmVydGljZXN9IHZlcnRpY2VzXG4gICAgICogQHBhcmFtIHt2ZWN0b3J9IHBvaW50XG4gICAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgdmVydGljZXMgY29udGFpbnMgcG9pbnQsIG90aGVyd2lzZSBmYWxzZVxuICAgICAqL1xuICAgIFZlcnRpY2VzLmNvbnRhaW5zID0gZnVuY3Rpb24odmVydGljZXMsIHBvaW50KSB7XG4gICAgICAgIHZhciBwb2ludFggPSBwb2ludC54LFxuICAgICAgICAgICAgcG9pbnRZID0gcG9pbnQueSxcbiAgICAgICAgICAgIHZlcnRpY2VzTGVuZ3RoID0gdmVydGljZXMubGVuZ3RoLFxuICAgICAgICAgICAgdmVydGV4ID0gdmVydGljZXNbdmVydGljZXNMZW5ndGggLSAxXSxcbiAgICAgICAgICAgIG5leHRWZXJ0ZXg7XG5cbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2ZXJ0aWNlc0xlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBuZXh0VmVydGV4ID0gdmVydGljZXNbaV07XG5cbiAgICAgICAgICAgIGlmICgocG9pbnRYIC0gdmVydGV4LngpICogKG5leHRWZXJ0ZXgueSAtIHZlcnRleC55KSBcbiAgICAgICAgICAgICAgICArIChwb2ludFkgLSB2ZXJ0ZXgueSkgKiAodmVydGV4LnggLSBuZXh0VmVydGV4LngpID4gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmVydGV4ID0gbmV4dFZlcnRleDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBTY2FsZXMgdGhlIHZlcnRpY2VzIGZyb20gYSBwb2ludCAoZGVmYXVsdCBpcyBjZW50cmUpIGluLXBsYWNlLlxuICAgICAqIEBtZXRob2Qgc2NhbGVcbiAgICAgKiBAcGFyYW0ge3ZlcnRpY2VzfSB2ZXJ0aWNlc1xuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBzY2FsZVhcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gc2NhbGVZXG4gICAgICogQHBhcmFtIHt2ZWN0b3J9IHBvaW50XG4gICAgICovXG4gICAgVmVydGljZXMuc2NhbGUgPSBmdW5jdGlvbih2ZXJ0aWNlcywgc2NhbGVYLCBzY2FsZVksIHBvaW50KSB7XG4gICAgICAgIGlmIChzY2FsZVggPT09IDEgJiYgc2NhbGVZID09PSAxKVxuICAgICAgICAgICAgcmV0dXJuIHZlcnRpY2VzO1xuXG4gICAgICAgIHBvaW50ID0gcG9pbnQgfHwgVmVydGljZXMuY2VudHJlKHZlcnRpY2VzKTtcblxuICAgICAgICB2YXIgdmVydGV4LFxuICAgICAgICAgICAgZGVsdGE7XG5cbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2ZXJ0aWNlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmVydGV4ID0gdmVydGljZXNbaV07XG4gICAgICAgICAgICBkZWx0YSA9IFZlY3Rvci5zdWIodmVydGV4LCBwb2ludCk7XG4gICAgICAgICAgICB2ZXJ0aWNlc1tpXS54ID0gcG9pbnQueCArIGRlbHRhLnggKiBzY2FsZVg7XG4gICAgICAgICAgICB2ZXJ0aWNlc1tpXS55ID0gcG9pbnQueSArIGRlbHRhLnkgKiBzY2FsZVk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdmVydGljZXM7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIENoYW1mZXJzIGEgc2V0IG9mIHZlcnRpY2VzIGJ5IGdpdmluZyB0aGVtIHJvdW5kZWQgY29ybmVycywgcmV0dXJucyBhIG5ldyBzZXQgb2YgdmVydGljZXMuXG4gICAgICogVGhlIHJhZGl1cyBwYXJhbWV0ZXIgaXMgYSBzaW5nbGUgbnVtYmVyIG9yIGFuIGFycmF5IHRvIHNwZWNpZnkgdGhlIHJhZGl1cyBmb3IgZWFjaCB2ZXJ0ZXguXG4gICAgICogQG1ldGhvZCBjaGFtZmVyXG4gICAgICogQHBhcmFtIHt2ZXJ0aWNlc30gdmVydGljZXNcbiAgICAgKiBAcGFyYW0ge251bWJlcltdfSByYWRpdXNcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcXVhbGl0eVxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBxdWFsaXR5TWluXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHF1YWxpdHlNYXhcbiAgICAgKi9cbiAgICBWZXJ0aWNlcy5jaGFtZmVyID0gZnVuY3Rpb24odmVydGljZXMsIHJhZGl1cywgcXVhbGl0eSwgcXVhbGl0eU1pbiwgcXVhbGl0eU1heCkge1xuICAgICAgICBpZiAodHlwZW9mIHJhZGl1cyA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIHJhZGl1cyA9IFtyYWRpdXNdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmFkaXVzID0gcmFkaXVzIHx8IFs4XTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHF1YWxpdHkgZGVmYXVsdHMgdG8gLTEsIHdoaWNoIGlzIGF1dG9cbiAgICAgICAgcXVhbGl0eSA9ICh0eXBlb2YgcXVhbGl0eSAhPT0gJ3VuZGVmaW5lZCcpID8gcXVhbGl0eSA6IC0xO1xuICAgICAgICBxdWFsaXR5TWluID0gcXVhbGl0eU1pbiB8fCAyO1xuICAgICAgICBxdWFsaXR5TWF4ID0gcXVhbGl0eU1heCB8fCAxNDtcblxuICAgICAgICB2YXIgbmV3VmVydGljZXMgPSBbXTtcblxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZlcnRpY2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgcHJldlZlcnRleCA9IHZlcnRpY2VzW2kgLSAxID49IDAgPyBpIC0gMSA6IHZlcnRpY2VzLmxlbmd0aCAtIDFdLFxuICAgICAgICAgICAgICAgIHZlcnRleCA9IHZlcnRpY2VzW2ldLFxuICAgICAgICAgICAgICAgIG5leHRWZXJ0ZXggPSB2ZXJ0aWNlc1soaSArIDEpICUgdmVydGljZXMubGVuZ3RoXSxcbiAgICAgICAgICAgICAgICBjdXJyZW50UmFkaXVzID0gcmFkaXVzW2kgPCByYWRpdXMubGVuZ3RoID8gaSA6IHJhZGl1cy5sZW5ndGggLSAxXTtcblxuICAgICAgICAgICAgaWYgKGN1cnJlbnRSYWRpdXMgPT09IDApIHtcbiAgICAgICAgICAgICAgICBuZXdWZXJ0aWNlcy5wdXNoKHZlcnRleCk7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciBwcmV2Tm9ybWFsID0gVmVjdG9yLm5vcm1hbGlzZSh7IFxuICAgICAgICAgICAgICAgIHg6IHZlcnRleC55IC0gcHJldlZlcnRleC55LCBcbiAgICAgICAgICAgICAgICB5OiBwcmV2VmVydGV4LnggLSB2ZXJ0ZXgueFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHZhciBuZXh0Tm9ybWFsID0gVmVjdG9yLm5vcm1hbGlzZSh7IFxuICAgICAgICAgICAgICAgIHg6IG5leHRWZXJ0ZXgueSAtIHZlcnRleC55LCBcbiAgICAgICAgICAgICAgICB5OiB2ZXJ0ZXgueCAtIG5leHRWZXJ0ZXgueFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHZhciBkaWFnb25hbFJhZGl1cyA9IE1hdGguc3FydCgyICogTWF0aC5wb3coY3VycmVudFJhZGl1cywgMikpLFxuICAgICAgICAgICAgICAgIHJhZGl1c1ZlY3RvciA9IFZlY3Rvci5tdWx0KENvbW1vbi5jbG9uZShwcmV2Tm9ybWFsKSwgY3VycmVudFJhZGl1cyksXG4gICAgICAgICAgICAgICAgbWlkTm9ybWFsID0gVmVjdG9yLm5vcm1hbGlzZShWZWN0b3IubXVsdChWZWN0b3IuYWRkKHByZXZOb3JtYWwsIG5leHROb3JtYWwpLCAwLjUpKSxcbiAgICAgICAgICAgICAgICBzY2FsZWRWZXJ0ZXggPSBWZWN0b3Iuc3ViKHZlcnRleCwgVmVjdG9yLm11bHQobWlkTm9ybWFsLCBkaWFnb25hbFJhZGl1cykpO1xuXG4gICAgICAgICAgICB2YXIgcHJlY2lzaW9uID0gcXVhbGl0eTtcblxuICAgICAgICAgICAgaWYgKHF1YWxpdHkgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgLy8gYXV0b21hdGljYWxseSBkZWNpZGUgcHJlY2lzaW9uXG4gICAgICAgICAgICAgICAgcHJlY2lzaW9uID0gTWF0aC5wb3coY3VycmVudFJhZGl1cywgMC4zMikgKiAxLjc1O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBwcmVjaXNpb24gPSBDb21tb24uY2xhbXAocHJlY2lzaW9uLCBxdWFsaXR5TWluLCBxdWFsaXR5TWF4KTtcblxuICAgICAgICAgICAgLy8gdXNlIGFuIGV2ZW4gdmFsdWUgZm9yIHByZWNpc2lvbiwgbW9yZSBsaWtlbHkgdG8gcmVkdWNlIGF4ZXMgYnkgdXNpbmcgc3ltbWV0cnlcbiAgICAgICAgICAgIGlmIChwcmVjaXNpb24gJSAyID09PSAxKVxuICAgICAgICAgICAgICAgIHByZWNpc2lvbiArPSAxO1xuXG4gICAgICAgICAgICB2YXIgYWxwaGEgPSBNYXRoLmFjb3MoVmVjdG9yLmRvdChwcmV2Tm9ybWFsLCBuZXh0Tm9ybWFsKSksXG4gICAgICAgICAgICAgICAgdGhldGEgPSBhbHBoYSAvIHByZWNpc2lvbjtcblxuICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBwcmVjaXNpb247IGorKykge1xuICAgICAgICAgICAgICAgIG5ld1ZlcnRpY2VzLnB1c2goVmVjdG9yLmFkZChWZWN0b3Iucm90YXRlKHJhZGl1c1ZlY3RvciwgdGhldGEgKiBqKSwgc2NhbGVkVmVydGV4KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmV3VmVydGljZXM7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFNvcnRzIHRoZSBpbnB1dCB2ZXJ0aWNlcyBpbnRvIGNsb2Nrd2lzZSBvcmRlciBpbiBwbGFjZS5cbiAgICAgKiBAbWV0aG9kIGNsb2Nrd2lzZVNvcnRcbiAgICAgKiBAcGFyYW0ge3ZlcnRpY2VzfSB2ZXJ0aWNlc1xuICAgICAqIEByZXR1cm4ge3ZlcnRpY2VzfSB2ZXJ0aWNlc1xuICAgICAqL1xuICAgIFZlcnRpY2VzLmNsb2Nrd2lzZVNvcnQgPSBmdW5jdGlvbih2ZXJ0aWNlcykge1xuICAgICAgICB2YXIgY2VudHJlID0gVmVydGljZXMubWVhbih2ZXJ0aWNlcyk7XG5cbiAgICAgICAgdmVydGljZXMuc29ydChmdW5jdGlvbih2ZXJ0ZXhBLCB2ZXJ0ZXhCKSB7XG4gICAgICAgICAgICByZXR1cm4gVmVjdG9yLmFuZ2xlKGNlbnRyZSwgdmVydGV4QSkgLSBWZWN0b3IuYW5nbGUoY2VudHJlLCB2ZXJ0ZXhCKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHZlcnRpY2VzO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHZlcnRpY2VzIGZvcm0gYSBjb252ZXggc2hhcGUgKHZlcnRpY2VzIG11c3QgYmUgaW4gY2xvY2t3aXNlIG9yZGVyKS5cbiAgICAgKiBAbWV0aG9kIGlzQ29udmV4XG4gICAgICogQHBhcmFtIHt2ZXJ0aWNlc30gdmVydGljZXNcbiAgICAgKiBAcmV0dXJuIHtib29sfSBgdHJ1ZWAgaWYgdGhlIGB2ZXJ0aWNlc2AgYXJlIGNvbnZleCwgYGZhbHNlYCBpZiBub3QgKG9yIGBudWxsYCBpZiBub3QgY29tcHV0YWJsZSkuXG4gICAgICovXG4gICAgVmVydGljZXMuaXNDb252ZXggPSBmdW5jdGlvbih2ZXJ0aWNlcykge1xuICAgICAgICAvLyBodHRwOi8vcGF1bGJvdXJrZS5uZXQvZ2VvbWV0cnkvcG9seWdvbm1lc2gvXG4gICAgICAgIC8vIENvcHlyaWdodCAoYykgUGF1bCBCb3Vya2UgKHVzZSBwZXJtaXR0ZWQpXG5cbiAgICAgICAgdmFyIGZsYWcgPSAwLFxuICAgICAgICAgICAgbiA9IHZlcnRpY2VzLmxlbmd0aCxcbiAgICAgICAgICAgIGksXG4gICAgICAgICAgICBqLFxuICAgICAgICAgICAgayxcbiAgICAgICAgICAgIHo7XG5cbiAgICAgICAgaWYgKG4gPCAzKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykge1xuICAgICAgICAgICAgaiA9IChpICsgMSkgJSBuO1xuICAgICAgICAgICAgayA9IChpICsgMikgJSBuO1xuICAgICAgICAgICAgeiA9ICh2ZXJ0aWNlc1tqXS54IC0gdmVydGljZXNbaV0ueCkgKiAodmVydGljZXNba10ueSAtIHZlcnRpY2VzW2pdLnkpO1xuICAgICAgICAgICAgeiAtPSAodmVydGljZXNbal0ueSAtIHZlcnRpY2VzW2ldLnkpICogKHZlcnRpY2VzW2tdLnggLSB2ZXJ0aWNlc1tqXS54KTtcblxuICAgICAgICAgICAgaWYgKHogPCAwKSB7XG4gICAgICAgICAgICAgICAgZmxhZyB8PSAxO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh6ID4gMCkge1xuICAgICAgICAgICAgICAgIGZsYWcgfD0gMjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGZsYWcgPT09IDMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZmxhZyAhPT0gMCl7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGNvbnZleCBodWxsIG9mIHRoZSBpbnB1dCB2ZXJ0aWNlcyBhcyBhIG5ldyBhcnJheSBvZiBwb2ludHMuXG4gICAgICogQG1ldGhvZCBodWxsXG4gICAgICogQHBhcmFtIHt2ZXJ0aWNlc30gdmVydGljZXNcbiAgICAgKiBAcmV0dXJuIFt2ZXJ0ZXhdIHZlcnRpY2VzXG4gICAgICovXG4gICAgVmVydGljZXMuaHVsbCA9IGZ1bmN0aW9uKHZlcnRpY2VzKSB7XG4gICAgICAgIC8vIGh0dHA6Ly9nZW9tYWxnb3JpdGhtcy5jb20vYTEwLV9odWxsLTEuaHRtbFxuXG4gICAgICAgIHZhciB1cHBlciA9IFtdLFxuICAgICAgICAgICAgbG93ZXIgPSBbXSwgXG4gICAgICAgICAgICB2ZXJ0ZXgsXG4gICAgICAgICAgICBpO1xuXG4gICAgICAgIC8vIHNvcnQgdmVydGljZXMgb24geC1heGlzICh5LWF4aXMgZm9yIHRpZXMpXG4gICAgICAgIHZlcnRpY2VzID0gdmVydGljZXMuc2xpY2UoMCk7XG4gICAgICAgIHZlcnRpY2VzLnNvcnQoZnVuY3Rpb24odmVydGV4QSwgdmVydGV4Qikge1xuICAgICAgICAgICAgdmFyIGR4ID0gdmVydGV4QS54IC0gdmVydGV4Qi54O1xuICAgICAgICAgICAgcmV0dXJuIGR4ICE9PSAwID8gZHggOiB2ZXJ0ZXhBLnkgLSB2ZXJ0ZXhCLnk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIGJ1aWxkIGxvd2VyIGh1bGxcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IHZlcnRpY2VzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgICAgICB2ZXJ0ZXggPSB2ZXJ0aWNlc1tpXTtcblxuICAgICAgICAgICAgd2hpbGUgKGxvd2VyLmxlbmd0aCA+PSAyIFxuICAgICAgICAgICAgICAgICAgICYmIFZlY3Rvci5jcm9zczMobG93ZXJbbG93ZXIubGVuZ3RoIC0gMl0sIGxvd2VyW2xvd2VyLmxlbmd0aCAtIDFdLCB2ZXJ0ZXgpIDw9IDApIHtcbiAgICAgICAgICAgICAgICBsb3dlci5wb3AoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbG93ZXIucHVzaCh2ZXJ0ZXgpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gYnVpbGQgdXBwZXIgaHVsbFxuICAgICAgICBmb3IgKGkgPSB2ZXJ0aWNlcy5sZW5ndGggLSAxOyBpID49IDA7IGkgLT0gMSkge1xuICAgICAgICAgICAgdmVydGV4ID0gdmVydGljZXNbaV07XG5cbiAgICAgICAgICAgIHdoaWxlICh1cHBlci5sZW5ndGggPj0gMiBcbiAgICAgICAgICAgICAgICAgICAmJiBWZWN0b3IuY3Jvc3MzKHVwcGVyW3VwcGVyLmxlbmd0aCAtIDJdLCB1cHBlclt1cHBlci5sZW5ndGggLSAxXSwgdmVydGV4KSA8PSAwKSB7XG4gICAgICAgICAgICAgICAgdXBwZXIucG9wKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHVwcGVyLnB1c2godmVydGV4KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGNvbmNhdGVuYXRpb24gb2YgdGhlIGxvd2VyIGFuZCB1cHBlciBodWxscyBnaXZlcyB0aGUgY29udmV4IGh1bGxcbiAgICAgICAgLy8gb21pdCBsYXN0IHBvaW50cyBiZWNhdXNlIHRoZXkgYXJlIHJlcGVhdGVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIG90aGVyIGxpc3RcbiAgICAgICAgdXBwZXIucG9wKCk7XG4gICAgICAgIGxvd2VyLnBvcCgpO1xuXG4gICAgICAgIHJldHVybiB1cHBlci5jb25jYXQobG93ZXIpO1xuICAgIH07XG5cbn0pKCk7XG5cblxuLyoqKi8gfSksXG4vKiA0ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cbi8qKlxuKiBUaGUgYE1hdHRlci5FdmVudHNgIG1vZHVsZSBjb250YWlucyBtZXRob2RzIHRvIGZpcmUgYW5kIGxpc3RlbiB0byBldmVudHMgb24gb3RoZXIgb2JqZWN0cy5cbipcbiogU2VlIHRoZSBpbmNsdWRlZCB1c2FnZSBbZXhhbXBsZXNdKGh0dHBzOi8vZ2l0aHViLmNvbS9saWFicnUvbWF0dGVyLWpzL3RyZWUvbWFzdGVyL2V4YW1wbGVzKS5cbipcbiogQGNsYXNzIEV2ZW50c1xuKi9cblxudmFyIEV2ZW50cyA9IHt9O1xuXG5tb2R1bGUuZXhwb3J0cyA9IEV2ZW50cztcblxudmFyIENvbW1vbiA9IF9fd2VicGFja19yZXF1aXJlX18oMCk7XG5cbihmdW5jdGlvbigpIHtcblxuICAgIC8qKlxuICAgICAqIFN1YnNjcmliZXMgYSBjYWxsYmFjayBmdW5jdGlvbiB0byB0aGUgZ2l2ZW4gb2JqZWN0J3MgYGV2ZW50TmFtZWAuXG4gICAgICogQG1ldGhvZCBvblxuICAgICAqIEBwYXJhbSB7fSBvYmplY3RcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lc1xuICAgICAqIEBwYXJhbSB7ZnVuY3Rpb259IGNhbGxiYWNrXG4gICAgICovXG4gICAgRXZlbnRzLm9uID0gZnVuY3Rpb24ob2JqZWN0LCBldmVudE5hbWVzLCBjYWxsYmFjaykge1xuICAgICAgICB2YXIgbmFtZXMgPSBldmVudE5hbWVzLnNwbGl0KCcgJyksXG4gICAgICAgICAgICBuYW1lO1xuXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbmFtZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIG5hbWUgPSBuYW1lc1tpXTtcbiAgICAgICAgICAgIG9iamVjdC5ldmVudHMgPSBvYmplY3QuZXZlbnRzIHx8IHt9O1xuICAgICAgICAgICAgb2JqZWN0LmV2ZW50c1tuYW1lXSA9IG9iamVjdC5ldmVudHNbbmFtZV0gfHwgW107XG4gICAgICAgICAgICBvYmplY3QuZXZlbnRzW25hbWVdLnB1c2goY2FsbGJhY2spO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGNhbGxiYWNrO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIHRoZSBnaXZlbiBldmVudCBjYWxsYmFjay4gSWYgbm8gY2FsbGJhY2ssIGNsZWFycyBhbGwgY2FsbGJhY2tzIGluIGBldmVudE5hbWVzYC4gSWYgbm8gYGV2ZW50TmFtZXNgLCBjbGVhcnMgYWxsIGV2ZW50cy5cbiAgICAgKiBAbWV0aG9kIG9mZlxuICAgICAqIEBwYXJhbSB7fSBvYmplY3RcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lc1xuICAgICAqIEBwYXJhbSB7ZnVuY3Rpb259IGNhbGxiYWNrXG4gICAgICovXG4gICAgRXZlbnRzLm9mZiA9IGZ1bmN0aW9uKG9iamVjdCwgZXZlbnROYW1lcywgY2FsbGJhY2spIHtcbiAgICAgICAgaWYgKCFldmVudE5hbWVzKSB7XG4gICAgICAgICAgICBvYmplY3QuZXZlbnRzID0ge307XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBoYW5kbGUgRXZlbnRzLm9mZihvYmplY3QsIGNhbGxiYWNrKVxuICAgICAgICBpZiAodHlwZW9mIGV2ZW50TmFtZXMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGNhbGxiYWNrID0gZXZlbnROYW1lcztcbiAgICAgICAgICAgIGV2ZW50TmFtZXMgPSBDb21tb24ua2V5cyhvYmplY3QuZXZlbnRzKS5qb2luKCcgJyk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgbmFtZXMgPSBldmVudE5hbWVzLnNwbGl0KCcgJyk7XG5cbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuYW1lcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIGNhbGxiYWNrcyA9IG9iamVjdC5ldmVudHNbbmFtZXNbaV1dLFxuICAgICAgICAgICAgICAgIG5ld0NhbGxiYWNrcyA9IFtdO1xuXG4gICAgICAgICAgICBpZiAoY2FsbGJhY2sgJiYgY2FsbGJhY2tzKSB7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBjYWxsYmFja3MubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrc1tqXSAhPT0gY2FsbGJhY2spXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXdDYWxsYmFja3MucHVzaChjYWxsYmFja3Nbal0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgb2JqZWN0LmV2ZW50c1tuYW1lc1tpXV0gPSBuZXdDYWxsYmFja3M7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogRmlyZXMgYWxsIHRoZSBjYWxsYmFja3Mgc3Vic2NyaWJlZCB0byB0aGUgZ2l2ZW4gb2JqZWN0J3MgYGV2ZW50TmFtZWAsIGluIHRoZSBvcmRlciB0aGV5IHN1YnNjcmliZWQsIGlmIGFueS5cbiAgICAgKiBAbWV0aG9kIHRyaWdnZXJcbiAgICAgKiBAcGFyYW0ge30gb2JqZWN0XG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZXNcbiAgICAgKiBAcGFyYW0ge30gZXZlbnRcbiAgICAgKi9cbiAgICBFdmVudHMudHJpZ2dlciA9IGZ1bmN0aW9uKG9iamVjdCwgZXZlbnROYW1lcywgZXZlbnQpIHtcbiAgICAgICAgdmFyIG5hbWVzLFxuICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgIGNhbGxiYWNrcyxcbiAgICAgICAgICAgIGV2ZW50Q2xvbmU7XG5cbiAgICAgICAgdmFyIGV2ZW50cyA9IG9iamVjdC5ldmVudHM7XG4gICAgICAgIFxuICAgICAgICBpZiAoZXZlbnRzICYmIENvbW1vbi5rZXlzKGV2ZW50cykubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgaWYgKCFldmVudClcbiAgICAgICAgICAgICAgICBldmVudCA9IHt9O1xuXG4gICAgICAgICAgICBuYW1lcyA9IGV2ZW50TmFtZXMuc3BsaXQoJyAnKTtcblxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuYW1lcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIG5hbWUgPSBuYW1lc1tpXTtcbiAgICAgICAgICAgICAgICBjYWxsYmFja3MgPSBldmVudHNbbmFtZV07XG5cbiAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2tzKSB7XG4gICAgICAgICAgICAgICAgICAgIGV2ZW50Q2xvbmUgPSBDb21tb24uY2xvbmUoZXZlbnQsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgZXZlbnRDbG9uZS5uYW1lID0gbmFtZTtcbiAgICAgICAgICAgICAgICAgICAgZXZlbnRDbG9uZS5zb3VyY2UgPSBvYmplY3Q7XG5cbiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBjYWxsYmFja3MubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrc1tqXS5hcHBseShvYmplY3QsIFtldmVudENsb25lXSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuXG59KSgpO1xuXG5cbi8qKiovIH0pLFxuLyogNSAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG4vKipcbiogQSBjb21wb3NpdGUgaXMgYSBjb2xsZWN0aW9uIG9mIGBNYXR0ZXIuQm9keWAsIGBNYXR0ZXIuQ29uc3RyYWludGAgYW5kIG90aGVyIGBNYXR0ZXIuQ29tcG9zaXRlYCBvYmplY3RzLlxuKlxuKiBUaGV5IGFyZSBhIGNvbnRhaW5lciB0aGF0IGNhbiByZXByZXNlbnQgY29tcGxleCBvYmplY3RzIG1hZGUgb2YgbXVsdGlwbGUgcGFydHMsIGV2ZW4gaWYgdGhleSBhcmUgbm90IHBoeXNpY2FsbHkgY29ubmVjdGVkLlxuKiBBIGNvbXBvc2l0ZSBjb3VsZCBjb250YWluIGFueXRoaW5nIGZyb20gYSBzaW5nbGUgYm9keSBhbGwgdGhlIHdheSB1cCB0byBhIHdob2xlIHdvcmxkLlxuKiBcbiogV2hlbiBtYWtpbmcgYW55IGNoYW5nZXMgdG8gY29tcG9zaXRlcywgdXNlIHRoZSBpbmNsdWRlZCBmdW5jdGlvbnMgcmF0aGVyIHRoYW4gY2hhbmdpbmcgdGhlaXIgcHJvcGVydGllcyBkaXJlY3RseS5cbipcbiogU2VlIHRoZSBpbmNsdWRlZCB1c2FnZSBbZXhhbXBsZXNdKGh0dHBzOi8vZ2l0aHViLmNvbS9saWFicnUvbWF0dGVyLWpzL3RyZWUvbWFzdGVyL2V4YW1wbGVzKS5cbipcbiogQGNsYXNzIENvbXBvc2l0ZVxuKi9cblxudmFyIENvbXBvc2l0ZSA9IHt9O1xuXG5tb2R1bGUuZXhwb3J0cyA9IENvbXBvc2l0ZTtcblxudmFyIEV2ZW50cyA9IF9fd2VicGFja19yZXF1aXJlX18oNCk7XG52YXIgQ29tbW9uID0gX193ZWJwYWNrX3JlcXVpcmVfXygwKTtcbnZhciBCb3VuZHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpO1xudmFyIEJvZHkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDYpO1xuXG4oZnVuY3Rpb24oKSB7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IGNvbXBvc2l0ZS4gVGhlIG9wdGlvbnMgcGFyYW1ldGVyIGlzIGFuIG9iamVjdCB0aGF0IHNwZWNpZmllcyBhbnkgcHJvcGVydGllcyB5b3Ugd2lzaCB0byBvdmVycmlkZSB0aGUgZGVmYXVsdHMuXG4gICAgICogU2VlIHRoZSBwcm9wZXJpdGVzIHNlY3Rpb24gYmVsb3cgZm9yIGRldGFpbGVkIGluZm9ybWF0aW9uIG9uIHdoYXQgeW91IGNhbiBwYXNzIHZpYSB0aGUgYG9wdGlvbnNgIG9iamVjdC5cbiAgICAgKiBAbWV0aG9kIGNyZWF0ZVxuICAgICAqIEBwYXJhbSB7fSBbb3B0aW9uc11cbiAgICAgKiBAcmV0dXJuIHtjb21wb3NpdGV9IEEgbmV3IGNvbXBvc2l0ZVxuICAgICAqL1xuICAgIENvbXBvc2l0ZS5jcmVhdGUgPSBmdW5jdGlvbihvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiBDb21tb24uZXh0ZW5kKHsgXG4gICAgICAgICAgICBpZDogQ29tbW9uLm5leHRJZCgpLFxuICAgICAgICAgICAgdHlwZTogJ2NvbXBvc2l0ZScsXG4gICAgICAgICAgICBwYXJlbnQ6IG51bGwsXG4gICAgICAgICAgICBpc01vZGlmaWVkOiBmYWxzZSxcbiAgICAgICAgICAgIGJvZGllczogW10sIFxuICAgICAgICAgICAgY29uc3RyYWludHM6IFtdLCBcbiAgICAgICAgICAgIGNvbXBvc2l0ZXM6IFtdLFxuICAgICAgICAgICAgbGFiZWw6ICdDb21wb3NpdGUnLFxuICAgICAgICAgICAgcGx1Z2luOiB7fSxcbiAgICAgICAgICAgIGNhY2hlOiB7XG4gICAgICAgICAgICAgICAgYWxsQm9kaWVzOiBudWxsLFxuICAgICAgICAgICAgICAgIGFsbENvbnN0cmFpbnRzOiBudWxsLFxuICAgICAgICAgICAgICAgIGFsbENvbXBvc2l0ZXM6IG51bGxcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgb3B0aW9ucyk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIGNvbXBvc2l0ZSdzIGBpc01vZGlmaWVkYCBmbGFnLiBcbiAgICAgKiBJZiBgdXBkYXRlUGFyZW50c2AgaXMgdHJ1ZSwgYWxsIHBhcmVudHMgd2lsbCBiZSBzZXQgKGRlZmF1bHQ6IGZhbHNlKS5cbiAgICAgKiBJZiBgdXBkYXRlQ2hpbGRyZW5gIGlzIHRydWUsIGFsbCBjaGlsZHJlbiB3aWxsIGJlIHNldCAoZGVmYXVsdDogZmFsc2UpLlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQG1ldGhvZCBzZXRNb2RpZmllZFxuICAgICAqIEBwYXJhbSB7Y29tcG9zaXRlfSBjb21wb3NpdGVcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGlzTW9kaWZpZWRcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFt1cGRhdGVQYXJlbnRzPWZhbHNlXVxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3VwZGF0ZUNoaWxkcmVuPWZhbHNlXVxuICAgICAqL1xuICAgIENvbXBvc2l0ZS5zZXRNb2RpZmllZCA9IGZ1bmN0aW9uKGNvbXBvc2l0ZSwgaXNNb2RpZmllZCwgdXBkYXRlUGFyZW50cywgdXBkYXRlQ2hpbGRyZW4pIHtcbiAgICAgICAgY29tcG9zaXRlLmlzTW9kaWZpZWQgPSBpc01vZGlmaWVkO1xuXG4gICAgICAgIGlmIChpc01vZGlmaWVkICYmIGNvbXBvc2l0ZS5jYWNoZSkge1xuICAgICAgICAgICAgY29tcG9zaXRlLmNhY2hlLmFsbEJvZGllcyA9IG51bGw7XG4gICAgICAgICAgICBjb21wb3NpdGUuY2FjaGUuYWxsQ29uc3RyYWludHMgPSBudWxsO1xuICAgICAgICAgICAgY29tcG9zaXRlLmNhY2hlLmFsbENvbXBvc2l0ZXMgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHVwZGF0ZVBhcmVudHMgJiYgY29tcG9zaXRlLnBhcmVudCkge1xuICAgICAgICAgICAgQ29tcG9zaXRlLnNldE1vZGlmaWVkKGNvbXBvc2l0ZS5wYXJlbnQsIGlzTW9kaWZpZWQsIHVwZGF0ZVBhcmVudHMsIHVwZGF0ZUNoaWxkcmVuKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh1cGRhdGVDaGlsZHJlbikge1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb21wb3NpdGUuY29tcG9zaXRlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIHZhciBjaGlsZENvbXBvc2l0ZSA9IGNvbXBvc2l0ZS5jb21wb3NpdGVzW2ldO1xuICAgICAgICAgICAgICAgIENvbXBvc2l0ZS5zZXRNb2RpZmllZChjaGlsZENvbXBvc2l0ZSwgaXNNb2RpZmllZCwgdXBkYXRlUGFyZW50cywgdXBkYXRlQ2hpbGRyZW4pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEdlbmVyaWMgc2luZ2xlIG9yIG11bHRpLWFkZCBmdW5jdGlvbi4gQWRkcyBhIHNpbmdsZSBvciBhbiBhcnJheSBvZiBib2R5KHMpLCBjb25zdHJhaW50KHMpIG9yIGNvbXBvc2l0ZShzKSB0byB0aGUgZ2l2ZW4gY29tcG9zaXRlLlxuICAgICAqIFRyaWdnZXJzIGBiZWZvcmVBZGRgIGFuZCBgYWZ0ZXJBZGRgIGV2ZW50cyBvbiB0aGUgYGNvbXBvc2l0ZWAuXG4gICAgICogQG1ldGhvZCBhZGRcbiAgICAgKiBAcGFyYW0ge2NvbXBvc2l0ZX0gY29tcG9zaXRlXG4gICAgICogQHBhcmFtIHtvYmplY3R8YXJyYXl9IG9iamVjdCBBIHNpbmdsZSBvciBhbiBhcnJheSBvZiBib2R5KHMpLCBjb25zdHJhaW50KHMpIG9yIGNvbXBvc2l0ZShzKVxuICAgICAqIEByZXR1cm4ge2NvbXBvc2l0ZX0gVGhlIG9yaWdpbmFsIGNvbXBvc2l0ZSB3aXRoIHRoZSBvYmplY3RzIGFkZGVkXG4gICAgICovXG4gICAgQ29tcG9zaXRlLmFkZCA9IGZ1bmN0aW9uKGNvbXBvc2l0ZSwgb2JqZWN0KSB7XG4gICAgICAgIHZhciBvYmplY3RzID0gW10uY29uY2F0KG9iamVjdCk7XG5cbiAgICAgICAgRXZlbnRzLnRyaWdnZXIoY29tcG9zaXRlLCAnYmVmb3JlQWRkJywgeyBvYmplY3Q6IG9iamVjdCB9KTtcblxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG9iamVjdHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBvYmogPSBvYmplY3RzW2ldO1xuXG4gICAgICAgICAgICBzd2l0Y2ggKG9iai50eXBlKSB7XG5cbiAgICAgICAgICAgIGNhc2UgJ2JvZHknOlxuICAgICAgICAgICAgICAgIC8vIHNraXAgYWRkaW5nIGNvbXBvdW5kIHBhcnRzXG4gICAgICAgICAgICAgICAgaWYgKG9iai5wYXJlbnQgIT09IG9iaikge1xuICAgICAgICAgICAgICAgICAgICBDb21tb24ud2FybignQ29tcG9zaXRlLmFkZDogc2tpcHBlZCBhZGRpbmcgYSBjb21wb3VuZCBib2R5IHBhcnQgKHlvdSBtdXN0IGFkZCBpdHMgcGFyZW50IGluc3RlYWQpJyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIENvbXBvc2l0ZS5hZGRCb2R5KGNvbXBvc2l0ZSwgb2JqKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2NvbnN0cmFpbnQnOlxuICAgICAgICAgICAgICAgIENvbXBvc2l0ZS5hZGRDb25zdHJhaW50KGNvbXBvc2l0ZSwgb2JqKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2NvbXBvc2l0ZSc6XG4gICAgICAgICAgICAgICAgQ29tcG9zaXRlLmFkZENvbXBvc2l0ZShjb21wb3NpdGUsIG9iaik7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdtb3VzZUNvbnN0cmFpbnQnOlxuICAgICAgICAgICAgICAgIENvbXBvc2l0ZS5hZGRDb25zdHJhaW50KGNvbXBvc2l0ZSwgb2JqLmNvbnN0cmFpbnQpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBFdmVudHMudHJpZ2dlcihjb21wb3NpdGUsICdhZnRlckFkZCcsIHsgb2JqZWN0OiBvYmplY3QgfSk7XG5cbiAgICAgICAgcmV0dXJuIGNvbXBvc2l0ZTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogR2VuZXJpYyByZW1vdmUgZnVuY3Rpb24uIFJlbW92ZXMgb25lIG9yIG1hbnkgYm9keShzKSwgY29uc3RyYWludChzKSBvciBhIGNvbXBvc2l0ZShzKSB0byB0aGUgZ2l2ZW4gY29tcG9zaXRlLlxuICAgICAqIE9wdGlvbmFsbHkgc2VhcmNoaW5nIGl0cyBjaGlsZHJlbiByZWN1cnNpdmVseS5cbiAgICAgKiBUcmlnZ2VycyBgYmVmb3JlUmVtb3ZlYCBhbmQgYGFmdGVyUmVtb3ZlYCBldmVudHMgb24gdGhlIGBjb21wb3NpdGVgLlxuICAgICAqIEBtZXRob2QgcmVtb3ZlXG4gICAgICogQHBhcmFtIHtjb21wb3NpdGV9IGNvbXBvc2l0ZVxuICAgICAqIEBwYXJhbSB7b2JqZWN0fGFycmF5fSBvYmplY3RcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtkZWVwPWZhbHNlXVxuICAgICAqIEByZXR1cm4ge2NvbXBvc2l0ZX0gVGhlIG9yaWdpbmFsIGNvbXBvc2l0ZSB3aXRoIHRoZSBvYmplY3RzIHJlbW92ZWRcbiAgICAgKi9cbiAgICBDb21wb3NpdGUucmVtb3ZlID0gZnVuY3Rpb24oY29tcG9zaXRlLCBvYmplY3QsIGRlZXApIHtcbiAgICAgICAgdmFyIG9iamVjdHMgPSBbXS5jb25jYXQob2JqZWN0KTtcblxuICAgICAgICBFdmVudHMudHJpZ2dlcihjb21wb3NpdGUsICdiZWZvcmVSZW1vdmUnLCB7IG9iamVjdDogb2JqZWN0IH0pO1xuXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgb2JqZWN0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIG9iaiA9IG9iamVjdHNbaV07XG5cbiAgICAgICAgICAgIHN3aXRjaCAob2JqLnR5cGUpIHtcblxuICAgICAgICAgICAgY2FzZSAnYm9keSc6XG4gICAgICAgICAgICAgICAgQ29tcG9zaXRlLnJlbW92ZUJvZHkoY29tcG9zaXRlLCBvYmosIGRlZXApO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnY29uc3RyYWludCc6XG4gICAgICAgICAgICAgICAgQ29tcG9zaXRlLnJlbW92ZUNvbnN0cmFpbnQoY29tcG9zaXRlLCBvYmosIGRlZXApO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnY29tcG9zaXRlJzpcbiAgICAgICAgICAgICAgICBDb21wb3NpdGUucmVtb3ZlQ29tcG9zaXRlKGNvbXBvc2l0ZSwgb2JqLCBkZWVwKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ21vdXNlQ29uc3RyYWludCc6XG4gICAgICAgICAgICAgICAgQ29tcG9zaXRlLnJlbW92ZUNvbnN0cmFpbnQoY29tcG9zaXRlLCBvYmouY29uc3RyYWludCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIEV2ZW50cy50cmlnZ2VyKGNvbXBvc2l0ZSwgJ2FmdGVyUmVtb3ZlJywgeyBvYmplY3Q6IG9iamVjdCB9KTtcblxuICAgICAgICByZXR1cm4gY29tcG9zaXRlO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBBZGRzIGEgY29tcG9zaXRlIHRvIHRoZSBnaXZlbiBjb21wb3NpdGUuXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbWV0aG9kIGFkZENvbXBvc2l0ZVxuICAgICAqIEBwYXJhbSB7Y29tcG9zaXRlfSBjb21wb3NpdGVBXG4gICAgICogQHBhcmFtIHtjb21wb3NpdGV9IGNvbXBvc2l0ZUJcbiAgICAgKiBAcmV0dXJuIHtjb21wb3NpdGV9IFRoZSBvcmlnaW5hbCBjb21wb3NpdGVBIHdpdGggdGhlIG9iamVjdHMgZnJvbSBjb21wb3NpdGVCIGFkZGVkXG4gICAgICovXG4gICAgQ29tcG9zaXRlLmFkZENvbXBvc2l0ZSA9IGZ1bmN0aW9uKGNvbXBvc2l0ZUEsIGNvbXBvc2l0ZUIpIHtcbiAgICAgICAgY29tcG9zaXRlQS5jb21wb3NpdGVzLnB1c2goY29tcG9zaXRlQik7XG4gICAgICAgIGNvbXBvc2l0ZUIucGFyZW50ID0gY29tcG9zaXRlQTtcbiAgICAgICAgQ29tcG9zaXRlLnNldE1vZGlmaWVkKGNvbXBvc2l0ZUEsIHRydWUsIHRydWUsIGZhbHNlKTtcbiAgICAgICAgcmV0dXJuIGNvbXBvc2l0ZUE7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgYSBjb21wb3NpdGUgZnJvbSB0aGUgZ2l2ZW4gY29tcG9zaXRlLCBhbmQgb3B0aW9uYWxseSBzZWFyY2hpbmcgaXRzIGNoaWxkcmVuIHJlY3Vyc2l2ZWx5LlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQG1ldGhvZCByZW1vdmVDb21wb3NpdGVcbiAgICAgKiBAcGFyYW0ge2NvbXBvc2l0ZX0gY29tcG9zaXRlQVxuICAgICAqIEBwYXJhbSB7Y29tcG9zaXRlfSBjb21wb3NpdGVCXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbZGVlcD1mYWxzZV1cbiAgICAgKiBAcmV0dXJuIHtjb21wb3NpdGV9IFRoZSBvcmlnaW5hbCBjb21wb3NpdGVBIHdpdGggdGhlIGNvbXBvc2l0ZSByZW1vdmVkXG4gICAgICovXG4gICAgQ29tcG9zaXRlLnJlbW92ZUNvbXBvc2l0ZSA9IGZ1bmN0aW9uKGNvbXBvc2l0ZUEsIGNvbXBvc2l0ZUIsIGRlZXApIHtcbiAgICAgICAgdmFyIHBvc2l0aW9uID0gQ29tbW9uLmluZGV4T2YoY29tcG9zaXRlQS5jb21wb3NpdGVzLCBjb21wb3NpdGVCKTtcbiAgICAgICAgaWYgKHBvc2l0aW9uICE9PSAtMSkge1xuICAgICAgICAgICAgQ29tcG9zaXRlLnJlbW92ZUNvbXBvc2l0ZUF0KGNvbXBvc2l0ZUEsIHBvc2l0aW9uKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChkZWVwKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbXBvc2l0ZUEuY29tcG9zaXRlcy5sZW5ndGg7IGkrKyl7XG4gICAgICAgICAgICAgICAgQ29tcG9zaXRlLnJlbW92ZUNvbXBvc2l0ZShjb21wb3NpdGVBLmNvbXBvc2l0ZXNbaV0sIGNvbXBvc2l0ZUIsIHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGNvbXBvc2l0ZUE7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgYSBjb21wb3NpdGUgZnJvbSB0aGUgZ2l2ZW4gY29tcG9zaXRlLlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQG1ldGhvZCByZW1vdmVDb21wb3NpdGVBdFxuICAgICAqIEBwYXJhbSB7Y29tcG9zaXRlfSBjb21wb3NpdGVcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcG9zaXRpb25cbiAgICAgKiBAcmV0dXJuIHtjb21wb3NpdGV9IFRoZSBvcmlnaW5hbCBjb21wb3NpdGUgd2l0aCB0aGUgY29tcG9zaXRlIHJlbW92ZWRcbiAgICAgKi9cbiAgICBDb21wb3NpdGUucmVtb3ZlQ29tcG9zaXRlQXQgPSBmdW5jdGlvbihjb21wb3NpdGUsIHBvc2l0aW9uKSB7XG4gICAgICAgIGNvbXBvc2l0ZS5jb21wb3NpdGVzLnNwbGljZShwb3NpdGlvbiwgMSk7XG4gICAgICAgIENvbXBvc2l0ZS5zZXRNb2RpZmllZChjb21wb3NpdGUsIHRydWUsIHRydWUsIGZhbHNlKTtcbiAgICAgICAgcmV0dXJuIGNvbXBvc2l0ZTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQWRkcyBhIGJvZHkgdG8gdGhlIGdpdmVuIGNvbXBvc2l0ZS5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBtZXRob2QgYWRkQm9keVxuICAgICAqIEBwYXJhbSB7Y29tcG9zaXRlfSBjb21wb3NpdGVcbiAgICAgKiBAcGFyYW0ge2JvZHl9IGJvZHlcbiAgICAgKiBAcmV0dXJuIHtjb21wb3NpdGV9IFRoZSBvcmlnaW5hbCBjb21wb3NpdGUgd2l0aCB0aGUgYm9keSBhZGRlZFxuICAgICAqL1xuICAgIENvbXBvc2l0ZS5hZGRCb2R5ID0gZnVuY3Rpb24oY29tcG9zaXRlLCBib2R5KSB7XG4gICAgICAgIGNvbXBvc2l0ZS5ib2RpZXMucHVzaChib2R5KTtcbiAgICAgICAgQ29tcG9zaXRlLnNldE1vZGlmaWVkKGNvbXBvc2l0ZSwgdHJ1ZSwgdHJ1ZSwgZmFsc2UpO1xuICAgICAgICByZXR1cm4gY29tcG9zaXRlO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGEgYm9keSBmcm9tIHRoZSBnaXZlbiBjb21wb3NpdGUsIGFuZCBvcHRpb25hbGx5IHNlYXJjaGluZyBpdHMgY2hpbGRyZW4gcmVjdXJzaXZlbHkuXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbWV0aG9kIHJlbW92ZUJvZHlcbiAgICAgKiBAcGFyYW0ge2NvbXBvc2l0ZX0gY29tcG9zaXRlXG4gICAgICogQHBhcmFtIHtib2R5fSBib2R5XG4gICAgICogQHBhcmFtIHtib29sZWFufSBbZGVlcD1mYWxzZV1cbiAgICAgKiBAcmV0dXJuIHtjb21wb3NpdGV9IFRoZSBvcmlnaW5hbCBjb21wb3NpdGUgd2l0aCB0aGUgYm9keSByZW1vdmVkXG4gICAgICovXG4gICAgQ29tcG9zaXRlLnJlbW92ZUJvZHkgPSBmdW5jdGlvbihjb21wb3NpdGUsIGJvZHksIGRlZXApIHtcbiAgICAgICAgdmFyIHBvc2l0aW9uID0gQ29tbW9uLmluZGV4T2YoY29tcG9zaXRlLmJvZGllcywgYm9keSk7XG4gICAgICAgIGlmIChwb3NpdGlvbiAhPT0gLTEpIHtcbiAgICAgICAgICAgIENvbXBvc2l0ZS5yZW1vdmVCb2R5QXQoY29tcG9zaXRlLCBwb3NpdGlvbik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZGVlcCkge1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb21wb3NpdGUuY29tcG9zaXRlcy5sZW5ndGg7IGkrKyl7XG4gICAgICAgICAgICAgICAgQ29tcG9zaXRlLnJlbW92ZUJvZHkoY29tcG9zaXRlLmNvbXBvc2l0ZXNbaV0sIGJvZHksIHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGNvbXBvc2l0ZTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBhIGJvZHkgZnJvbSB0aGUgZ2l2ZW4gY29tcG9zaXRlLlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQG1ldGhvZCByZW1vdmVCb2R5QXRcbiAgICAgKiBAcGFyYW0ge2NvbXBvc2l0ZX0gY29tcG9zaXRlXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHBvc2l0aW9uXG4gICAgICogQHJldHVybiB7Y29tcG9zaXRlfSBUaGUgb3JpZ2luYWwgY29tcG9zaXRlIHdpdGggdGhlIGJvZHkgcmVtb3ZlZFxuICAgICAqL1xuICAgIENvbXBvc2l0ZS5yZW1vdmVCb2R5QXQgPSBmdW5jdGlvbihjb21wb3NpdGUsIHBvc2l0aW9uKSB7XG4gICAgICAgIGNvbXBvc2l0ZS5ib2RpZXMuc3BsaWNlKHBvc2l0aW9uLCAxKTtcbiAgICAgICAgQ29tcG9zaXRlLnNldE1vZGlmaWVkKGNvbXBvc2l0ZSwgdHJ1ZSwgdHJ1ZSwgZmFsc2UpO1xuICAgICAgICByZXR1cm4gY29tcG9zaXRlO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBBZGRzIGEgY29uc3RyYWludCB0byB0aGUgZ2l2ZW4gY29tcG9zaXRlLlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQG1ldGhvZCBhZGRDb25zdHJhaW50XG4gICAgICogQHBhcmFtIHtjb21wb3NpdGV9IGNvbXBvc2l0ZVxuICAgICAqIEBwYXJhbSB7Y29uc3RyYWludH0gY29uc3RyYWludFxuICAgICAqIEByZXR1cm4ge2NvbXBvc2l0ZX0gVGhlIG9yaWdpbmFsIGNvbXBvc2l0ZSB3aXRoIHRoZSBjb25zdHJhaW50IGFkZGVkXG4gICAgICovXG4gICAgQ29tcG9zaXRlLmFkZENvbnN0cmFpbnQgPSBmdW5jdGlvbihjb21wb3NpdGUsIGNvbnN0cmFpbnQpIHtcbiAgICAgICAgY29tcG9zaXRlLmNvbnN0cmFpbnRzLnB1c2goY29uc3RyYWludCk7XG4gICAgICAgIENvbXBvc2l0ZS5zZXRNb2RpZmllZChjb21wb3NpdGUsIHRydWUsIHRydWUsIGZhbHNlKTtcbiAgICAgICAgcmV0dXJuIGNvbXBvc2l0ZTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBhIGNvbnN0cmFpbnQgZnJvbSB0aGUgZ2l2ZW4gY29tcG9zaXRlLCBhbmQgb3B0aW9uYWxseSBzZWFyY2hpbmcgaXRzIGNoaWxkcmVuIHJlY3Vyc2l2ZWx5LlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQG1ldGhvZCByZW1vdmVDb25zdHJhaW50XG4gICAgICogQHBhcmFtIHtjb21wb3NpdGV9IGNvbXBvc2l0ZVxuICAgICAqIEBwYXJhbSB7Y29uc3RyYWludH0gY29uc3RyYWludFxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2RlZXA9ZmFsc2VdXG4gICAgICogQHJldHVybiB7Y29tcG9zaXRlfSBUaGUgb3JpZ2luYWwgY29tcG9zaXRlIHdpdGggdGhlIGNvbnN0cmFpbnQgcmVtb3ZlZFxuICAgICAqL1xuICAgIENvbXBvc2l0ZS5yZW1vdmVDb25zdHJhaW50ID0gZnVuY3Rpb24oY29tcG9zaXRlLCBjb25zdHJhaW50LCBkZWVwKSB7XG4gICAgICAgIHZhciBwb3NpdGlvbiA9IENvbW1vbi5pbmRleE9mKGNvbXBvc2l0ZS5jb25zdHJhaW50cywgY29uc3RyYWludCk7XG4gICAgICAgIGlmIChwb3NpdGlvbiAhPT0gLTEpIHtcbiAgICAgICAgICAgIENvbXBvc2l0ZS5yZW1vdmVDb25zdHJhaW50QXQoY29tcG9zaXRlLCBwb3NpdGlvbik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZGVlcCkge1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb21wb3NpdGUuY29tcG9zaXRlcy5sZW5ndGg7IGkrKyl7XG4gICAgICAgICAgICAgICAgQ29tcG9zaXRlLnJlbW92ZUNvbnN0cmFpbnQoY29tcG9zaXRlLmNvbXBvc2l0ZXNbaV0sIGNvbnN0cmFpbnQsIHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGNvbXBvc2l0ZTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBhIGJvZHkgZnJvbSB0aGUgZ2l2ZW4gY29tcG9zaXRlLlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQG1ldGhvZCByZW1vdmVDb25zdHJhaW50QXRcbiAgICAgKiBAcGFyYW0ge2NvbXBvc2l0ZX0gY29tcG9zaXRlXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHBvc2l0aW9uXG4gICAgICogQHJldHVybiB7Y29tcG9zaXRlfSBUaGUgb3JpZ2luYWwgY29tcG9zaXRlIHdpdGggdGhlIGNvbnN0cmFpbnQgcmVtb3ZlZFxuICAgICAqL1xuICAgIENvbXBvc2l0ZS5yZW1vdmVDb25zdHJhaW50QXQgPSBmdW5jdGlvbihjb21wb3NpdGUsIHBvc2l0aW9uKSB7XG4gICAgICAgIGNvbXBvc2l0ZS5jb25zdHJhaW50cy5zcGxpY2UocG9zaXRpb24sIDEpO1xuICAgICAgICBDb21wb3NpdGUuc2V0TW9kaWZpZWQoY29tcG9zaXRlLCB0cnVlLCB0cnVlLCBmYWxzZSk7XG4gICAgICAgIHJldHVybiBjb21wb3NpdGU7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgYWxsIGJvZGllcywgY29uc3RyYWludHMgYW5kIGNvbXBvc2l0ZXMgZnJvbSB0aGUgZ2l2ZW4gY29tcG9zaXRlLlxuICAgICAqIE9wdGlvbmFsbHkgY2xlYXJpbmcgaXRzIGNoaWxkcmVuIHJlY3Vyc2l2ZWx5LlxuICAgICAqIEBtZXRob2QgY2xlYXJcbiAgICAgKiBAcGFyYW0ge2NvbXBvc2l0ZX0gY29tcG9zaXRlXG4gICAgICogQHBhcmFtIHtib29sZWFufSBrZWVwU3RhdGljXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbZGVlcD1mYWxzZV1cbiAgICAgKi9cbiAgICBDb21wb3NpdGUuY2xlYXIgPSBmdW5jdGlvbihjb21wb3NpdGUsIGtlZXBTdGF0aWMsIGRlZXApIHtcbiAgICAgICAgaWYgKGRlZXApIHtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29tcG9zaXRlLmNvbXBvc2l0ZXMubGVuZ3RoOyBpKyspe1xuICAgICAgICAgICAgICAgIENvbXBvc2l0ZS5jbGVhcihjb21wb3NpdGUuY29tcG9zaXRlc1tpXSwga2VlcFN0YXRpYywgdHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGlmIChrZWVwU3RhdGljKSB7XG4gICAgICAgICAgICBjb21wb3NpdGUuYm9kaWVzID0gY29tcG9zaXRlLmJvZGllcy5maWx0ZXIoZnVuY3Rpb24oYm9keSkgeyByZXR1cm4gYm9keS5pc1N0YXRpYzsgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb21wb3NpdGUuYm9kaWVzLmxlbmd0aCA9IDA7XG4gICAgICAgIH1cblxuICAgICAgICBjb21wb3NpdGUuY29uc3RyYWludHMubGVuZ3RoID0gMDtcbiAgICAgICAgY29tcG9zaXRlLmNvbXBvc2l0ZXMubGVuZ3RoID0gMDtcblxuICAgICAgICBDb21wb3NpdGUuc2V0TW9kaWZpZWQoY29tcG9zaXRlLCB0cnVlLCB0cnVlLCBmYWxzZSk7XG5cbiAgICAgICAgcmV0dXJuIGNvbXBvc2l0ZTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhbGwgYm9kaWVzIGluIHRoZSBnaXZlbiBjb21wb3NpdGUsIGluY2x1ZGluZyBhbGwgYm9kaWVzIGluIGl0cyBjaGlsZHJlbiwgcmVjdXJzaXZlbHkuXG4gICAgICogQG1ldGhvZCBhbGxCb2RpZXNcbiAgICAgKiBAcGFyYW0ge2NvbXBvc2l0ZX0gY29tcG9zaXRlXG4gICAgICogQHJldHVybiB7Ym9keVtdfSBBbGwgdGhlIGJvZGllc1xuICAgICAqL1xuICAgIENvbXBvc2l0ZS5hbGxCb2RpZXMgPSBmdW5jdGlvbihjb21wb3NpdGUpIHtcbiAgICAgICAgaWYgKGNvbXBvc2l0ZS5jYWNoZSAmJiBjb21wb3NpdGUuY2FjaGUuYWxsQm9kaWVzKSB7XG4gICAgICAgICAgICByZXR1cm4gY29tcG9zaXRlLmNhY2hlLmFsbEJvZGllcztcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBib2RpZXMgPSBbXS5jb25jYXQoY29tcG9zaXRlLmJvZGllcyk7XG5cbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb21wb3NpdGUuY29tcG9zaXRlcy5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgIGJvZGllcyA9IGJvZGllcy5jb25jYXQoQ29tcG9zaXRlLmFsbEJvZGllcyhjb21wb3NpdGUuY29tcG9zaXRlc1tpXSkpO1xuXG4gICAgICAgIGlmIChjb21wb3NpdGUuY2FjaGUpIHtcbiAgICAgICAgICAgIGNvbXBvc2l0ZS5jYWNoZS5hbGxCb2RpZXMgPSBib2RpZXM7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYm9kaWVzO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGFsbCBjb25zdHJhaW50cyBpbiB0aGUgZ2l2ZW4gY29tcG9zaXRlLCBpbmNsdWRpbmcgYWxsIGNvbnN0cmFpbnRzIGluIGl0cyBjaGlsZHJlbiwgcmVjdXJzaXZlbHkuXG4gICAgICogQG1ldGhvZCBhbGxDb25zdHJhaW50c1xuICAgICAqIEBwYXJhbSB7Y29tcG9zaXRlfSBjb21wb3NpdGVcbiAgICAgKiBAcmV0dXJuIHtjb25zdHJhaW50W119IEFsbCB0aGUgY29uc3RyYWludHNcbiAgICAgKi9cbiAgICBDb21wb3NpdGUuYWxsQ29uc3RyYWludHMgPSBmdW5jdGlvbihjb21wb3NpdGUpIHtcbiAgICAgICAgaWYgKGNvbXBvc2l0ZS5jYWNoZSAmJiBjb21wb3NpdGUuY2FjaGUuYWxsQ29uc3RyYWludHMpIHtcbiAgICAgICAgICAgIHJldHVybiBjb21wb3NpdGUuY2FjaGUuYWxsQ29uc3RyYWludHM7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgY29uc3RyYWludHMgPSBbXS5jb25jYXQoY29tcG9zaXRlLmNvbnN0cmFpbnRzKTtcblxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbXBvc2l0ZS5jb21wb3NpdGVzLmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgY29uc3RyYWludHMgPSBjb25zdHJhaW50cy5jb25jYXQoQ29tcG9zaXRlLmFsbENvbnN0cmFpbnRzKGNvbXBvc2l0ZS5jb21wb3NpdGVzW2ldKSk7XG5cbiAgICAgICAgaWYgKGNvbXBvc2l0ZS5jYWNoZSkge1xuICAgICAgICAgICAgY29tcG9zaXRlLmNhY2hlLmFsbENvbnN0cmFpbnRzID0gY29uc3RyYWludHM7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY29uc3RyYWludHM7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYWxsIGNvbXBvc2l0ZXMgaW4gdGhlIGdpdmVuIGNvbXBvc2l0ZSwgaW5jbHVkaW5nIGFsbCBjb21wb3NpdGVzIGluIGl0cyBjaGlsZHJlbiwgcmVjdXJzaXZlbHkuXG4gICAgICogQG1ldGhvZCBhbGxDb21wb3NpdGVzXG4gICAgICogQHBhcmFtIHtjb21wb3NpdGV9IGNvbXBvc2l0ZVxuICAgICAqIEByZXR1cm4ge2NvbXBvc2l0ZVtdfSBBbGwgdGhlIGNvbXBvc2l0ZXNcbiAgICAgKi9cbiAgICBDb21wb3NpdGUuYWxsQ29tcG9zaXRlcyA9IGZ1bmN0aW9uKGNvbXBvc2l0ZSkge1xuICAgICAgICBpZiAoY29tcG9zaXRlLmNhY2hlICYmIGNvbXBvc2l0ZS5jYWNoZS5hbGxDb21wb3NpdGVzKSB7XG4gICAgICAgICAgICByZXR1cm4gY29tcG9zaXRlLmNhY2hlLmFsbENvbXBvc2l0ZXM7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgY29tcG9zaXRlcyA9IFtdLmNvbmNhdChjb21wb3NpdGUuY29tcG9zaXRlcyk7XG5cbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb21wb3NpdGUuY29tcG9zaXRlcy5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgIGNvbXBvc2l0ZXMgPSBjb21wb3NpdGVzLmNvbmNhdChDb21wb3NpdGUuYWxsQ29tcG9zaXRlcyhjb21wb3NpdGUuY29tcG9zaXRlc1tpXSkpO1xuXG4gICAgICAgIGlmIChjb21wb3NpdGUuY2FjaGUpIHtcbiAgICAgICAgICAgIGNvbXBvc2l0ZS5jYWNoZS5hbGxDb21wb3NpdGVzID0gY29tcG9zaXRlcztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjb21wb3NpdGVzO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBTZWFyY2hlcyB0aGUgY29tcG9zaXRlIHJlY3Vyc2l2ZWx5IGZvciBhbiBvYmplY3QgbWF0Y2hpbmcgdGhlIHR5cGUgYW5kIGlkIHN1cHBsaWVkLCBudWxsIGlmIG5vdCBmb3VuZC5cbiAgICAgKiBAbWV0aG9kIGdldFxuICAgICAqIEBwYXJhbSB7Y29tcG9zaXRlfSBjb21wb3NpdGVcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gaWRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdHlwZVxuICAgICAqIEByZXR1cm4ge29iamVjdH0gVGhlIHJlcXVlc3RlZCBvYmplY3QsIGlmIGZvdW5kXG4gICAgICovXG4gICAgQ29tcG9zaXRlLmdldCA9IGZ1bmN0aW9uKGNvbXBvc2l0ZSwgaWQsIHR5cGUpIHtcbiAgICAgICAgdmFyIG9iamVjdHMsXG4gICAgICAgICAgICBvYmplY3Q7XG5cbiAgICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgIGNhc2UgJ2JvZHknOlxuICAgICAgICAgICAgb2JqZWN0cyA9IENvbXBvc2l0ZS5hbGxCb2RpZXMoY29tcG9zaXRlKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdjb25zdHJhaW50JzpcbiAgICAgICAgICAgIG9iamVjdHMgPSBDb21wb3NpdGUuYWxsQ29uc3RyYWludHMoY29tcG9zaXRlKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdjb21wb3NpdGUnOlxuICAgICAgICAgICAgb2JqZWN0cyA9IENvbXBvc2l0ZS5hbGxDb21wb3NpdGVzKGNvbXBvc2l0ZSkuY29uY2F0KGNvbXBvc2l0ZSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghb2JqZWN0cylcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIG9iamVjdCA9IG9iamVjdHMuZmlsdGVyKGZ1bmN0aW9uKG9iamVjdCkgeyBcbiAgICAgICAgICAgIHJldHVybiBvYmplY3QuaWQudG9TdHJpbmcoKSA9PT0gaWQudG9TdHJpbmcoKTsgXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBvYmplY3QubGVuZ3RoID09PSAwID8gbnVsbCA6IG9iamVjdFswXTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogTW92ZXMgdGhlIGdpdmVuIG9iamVjdChzKSBmcm9tIGNvbXBvc2l0ZUEgdG8gY29tcG9zaXRlQiAoZXF1YWwgdG8gYSByZW1vdmUgZm9sbG93ZWQgYnkgYW4gYWRkKS5cbiAgICAgKiBAbWV0aG9kIG1vdmVcbiAgICAgKiBAcGFyYW0ge2NvbXBvc2l0ZUF9IGNvbXBvc2l0ZUFcbiAgICAgKiBAcGFyYW0ge29iamVjdFtdfSBvYmplY3RzXG4gICAgICogQHBhcmFtIHtjb21wb3NpdGVCfSBjb21wb3NpdGVCXG4gICAgICogQHJldHVybiB7Y29tcG9zaXRlfSBSZXR1cm5zIGNvbXBvc2l0ZUFcbiAgICAgKi9cbiAgICBDb21wb3NpdGUubW92ZSA9IGZ1bmN0aW9uKGNvbXBvc2l0ZUEsIG9iamVjdHMsIGNvbXBvc2l0ZUIpIHtcbiAgICAgICAgQ29tcG9zaXRlLnJlbW92ZShjb21wb3NpdGVBLCBvYmplY3RzKTtcbiAgICAgICAgQ29tcG9zaXRlLmFkZChjb21wb3NpdGVCLCBvYmplY3RzKTtcbiAgICAgICAgcmV0dXJuIGNvbXBvc2l0ZUE7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEFzc2lnbnMgbmV3IGlkcyBmb3IgYWxsIG9iamVjdHMgaW4gdGhlIGNvbXBvc2l0ZSwgcmVjdXJzaXZlbHkuXG4gICAgICogQG1ldGhvZCByZWJhc2VcbiAgICAgKiBAcGFyYW0ge2NvbXBvc2l0ZX0gY29tcG9zaXRlXG4gICAgICogQHJldHVybiB7Y29tcG9zaXRlfSBSZXR1cm5zIGNvbXBvc2l0ZVxuICAgICAqL1xuICAgIENvbXBvc2l0ZS5yZWJhc2UgPSBmdW5jdGlvbihjb21wb3NpdGUpIHtcbiAgICAgICAgdmFyIG9iamVjdHMgPSBDb21wb3NpdGUuYWxsQm9kaWVzKGNvbXBvc2l0ZSlcbiAgICAgICAgICAgIC5jb25jYXQoQ29tcG9zaXRlLmFsbENvbnN0cmFpbnRzKGNvbXBvc2l0ZSkpXG4gICAgICAgICAgICAuY29uY2F0KENvbXBvc2l0ZS5hbGxDb21wb3NpdGVzKGNvbXBvc2l0ZSkpO1xuXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgb2JqZWN0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgb2JqZWN0c1tpXS5pZCA9IENvbW1vbi5uZXh0SWQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjb21wb3NpdGU7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFRyYW5zbGF0ZXMgYWxsIGNoaWxkcmVuIGluIHRoZSBjb21wb3NpdGUgYnkgYSBnaXZlbiB2ZWN0b3IgcmVsYXRpdmUgdG8gdGhlaXIgY3VycmVudCBwb3NpdGlvbnMsIFxuICAgICAqIHdpdGhvdXQgaW1wYXJ0aW5nIGFueSB2ZWxvY2l0eS5cbiAgICAgKiBAbWV0aG9kIHRyYW5zbGF0ZVxuICAgICAqIEBwYXJhbSB7Y29tcG9zaXRlfSBjb21wb3NpdGVcbiAgICAgKiBAcGFyYW0ge3ZlY3Rvcn0gdHJhbnNsYXRpb25cbiAgICAgKiBAcGFyYW0ge2Jvb2x9IFtyZWN1cnNpdmU9dHJ1ZV1cbiAgICAgKi9cbiAgICBDb21wb3NpdGUudHJhbnNsYXRlID0gZnVuY3Rpb24oY29tcG9zaXRlLCB0cmFuc2xhdGlvbiwgcmVjdXJzaXZlKSB7XG4gICAgICAgIHZhciBib2RpZXMgPSByZWN1cnNpdmUgPyBDb21wb3NpdGUuYWxsQm9kaWVzKGNvbXBvc2l0ZSkgOiBjb21wb3NpdGUuYm9kaWVzO1xuXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYm9kaWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBCb2R5LnRyYW5zbGF0ZShib2RpZXNbaV0sIHRyYW5zbGF0aW9uKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjb21wb3NpdGU7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFJvdGF0ZXMgYWxsIGNoaWxkcmVuIGluIHRoZSBjb21wb3NpdGUgYnkgYSBnaXZlbiBhbmdsZSBhYm91dCB0aGUgZ2l2ZW4gcG9pbnQsIHdpdGhvdXQgaW1wYXJ0aW5nIGFueSBhbmd1bGFyIHZlbG9jaXR5LlxuICAgICAqIEBtZXRob2Qgcm90YXRlXG4gICAgICogQHBhcmFtIHtjb21wb3NpdGV9IGNvbXBvc2l0ZVxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSByb3RhdGlvblxuICAgICAqIEBwYXJhbSB7dmVjdG9yfSBwb2ludFxuICAgICAqIEBwYXJhbSB7Ym9vbH0gW3JlY3Vyc2l2ZT10cnVlXVxuICAgICAqL1xuICAgIENvbXBvc2l0ZS5yb3RhdGUgPSBmdW5jdGlvbihjb21wb3NpdGUsIHJvdGF0aW9uLCBwb2ludCwgcmVjdXJzaXZlKSB7XG4gICAgICAgIHZhciBjb3MgPSBNYXRoLmNvcyhyb3RhdGlvbiksXG4gICAgICAgICAgICBzaW4gPSBNYXRoLnNpbihyb3RhdGlvbiksXG4gICAgICAgICAgICBib2RpZXMgPSByZWN1cnNpdmUgPyBDb21wb3NpdGUuYWxsQm9kaWVzKGNvbXBvc2l0ZSkgOiBjb21wb3NpdGUuYm9kaWVzO1xuXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYm9kaWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgYm9keSA9IGJvZGllc1tpXSxcbiAgICAgICAgICAgICAgICBkeCA9IGJvZHkucG9zaXRpb24ueCAtIHBvaW50LngsXG4gICAgICAgICAgICAgICAgZHkgPSBib2R5LnBvc2l0aW9uLnkgLSBwb2ludC55O1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgQm9keS5zZXRQb3NpdGlvbihib2R5LCB7XG4gICAgICAgICAgICAgICAgeDogcG9pbnQueCArIChkeCAqIGNvcyAtIGR5ICogc2luKSxcbiAgICAgICAgICAgICAgICB5OiBwb2ludC55ICsgKGR4ICogc2luICsgZHkgKiBjb3MpXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgQm9keS5yb3RhdGUoYm9keSwgcm90YXRpb24pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGNvbXBvc2l0ZTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogU2NhbGVzIGFsbCBjaGlsZHJlbiBpbiB0aGUgY29tcG9zaXRlLCBpbmNsdWRpbmcgdXBkYXRpbmcgcGh5c2ljYWwgcHJvcGVydGllcyAobWFzcywgYXJlYSwgYXhlcywgaW5lcnRpYSksIGZyb20gYSB3b3JsZC1zcGFjZSBwb2ludC5cbiAgICAgKiBAbWV0aG9kIHNjYWxlXG4gICAgICogQHBhcmFtIHtjb21wb3NpdGV9IGNvbXBvc2l0ZVxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBzY2FsZVhcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gc2NhbGVZXG4gICAgICogQHBhcmFtIHt2ZWN0b3J9IHBvaW50XG4gICAgICogQHBhcmFtIHtib29sfSBbcmVjdXJzaXZlPXRydWVdXG4gICAgICovXG4gICAgQ29tcG9zaXRlLnNjYWxlID0gZnVuY3Rpb24oY29tcG9zaXRlLCBzY2FsZVgsIHNjYWxlWSwgcG9pbnQsIHJlY3Vyc2l2ZSkge1xuICAgICAgICB2YXIgYm9kaWVzID0gcmVjdXJzaXZlID8gQ29tcG9zaXRlLmFsbEJvZGllcyhjb21wb3NpdGUpIDogY29tcG9zaXRlLmJvZGllcztcblxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGJvZGllcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIGJvZHkgPSBib2RpZXNbaV0sXG4gICAgICAgICAgICAgICAgZHggPSBib2R5LnBvc2l0aW9uLnggLSBwb2ludC54LFxuICAgICAgICAgICAgICAgIGR5ID0gYm9keS5wb3NpdGlvbi55IC0gcG9pbnQueTtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgIEJvZHkuc2V0UG9zaXRpb24oYm9keSwge1xuICAgICAgICAgICAgICAgIHg6IHBvaW50LnggKyBkeCAqIHNjYWxlWCxcbiAgICAgICAgICAgICAgICB5OiBwb2ludC55ICsgZHkgKiBzY2FsZVlcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBCb2R5LnNjYWxlKGJvZHksIHNjYWxlWCwgc2NhbGVZKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjb21wb3NpdGU7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHVuaW9uIG9mIHRoZSBib3VuZHMgb2YgYWxsIG9mIHRoZSBjb21wb3NpdGUncyBib2RpZXMuXG4gICAgICogQG1ldGhvZCBib3VuZHNcbiAgICAgKiBAcGFyYW0ge2NvbXBvc2l0ZX0gY29tcG9zaXRlIFRoZSBjb21wb3NpdGUuXG4gICAgICogQHJldHVybnMge2JvdW5kc30gVGhlIGNvbXBvc2l0ZSBib3VuZHMuXG4gICAgICovXG4gICAgQ29tcG9zaXRlLmJvdW5kcyA9IGZ1bmN0aW9uKGNvbXBvc2l0ZSkge1xuICAgICAgICB2YXIgYm9kaWVzID0gQ29tcG9zaXRlLmFsbEJvZGllcyhjb21wb3NpdGUpLFxuICAgICAgICAgICAgdmVydGljZXMgPSBbXTtcblxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGJvZGllcy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICAgICAgdmFyIGJvZHkgPSBib2RpZXNbaV07XG4gICAgICAgICAgICB2ZXJ0aWNlcy5wdXNoKGJvZHkuYm91bmRzLm1pbiwgYm9keS5ib3VuZHMubWF4KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBCb3VuZHMuY3JlYXRlKHZlcnRpY2VzKTtcbiAgICB9O1xuXG4gICAgLypcbiAgICAqXG4gICAgKiAgRXZlbnRzIERvY3VtZW50YXRpb25cbiAgICAqXG4gICAgKi9cblxuICAgIC8qKlxuICAgICogRmlyZWQgd2hlbiBhIGNhbGwgdG8gYENvbXBvc2l0ZS5hZGRgIGlzIG1hZGUsIGJlZm9yZSBvYmplY3RzIGhhdmUgYmVlbiBhZGRlZC5cbiAgICAqXG4gICAgKiBAZXZlbnQgYmVmb3JlQWRkXG4gICAgKiBAcGFyYW0ge30gZXZlbnQgQW4gZXZlbnQgb2JqZWN0XG4gICAgKiBAcGFyYW0ge30gZXZlbnQub2JqZWN0IFRoZSBvYmplY3QocykgdG8gYmUgYWRkZWQgKG1heSBiZSBhIHNpbmdsZSBib2R5LCBjb25zdHJhaW50LCBjb21wb3NpdGUgb3IgYSBtaXhlZCBhcnJheSBvZiB0aGVzZSlcbiAgICAqIEBwYXJhbSB7fSBldmVudC5zb3VyY2UgVGhlIHNvdXJjZSBvYmplY3Qgb2YgdGhlIGV2ZW50XG4gICAgKiBAcGFyYW0ge30gZXZlbnQubmFtZSBUaGUgbmFtZSBvZiB0aGUgZXZlbnRcbiAgICAqL1xuXG4gICAgLyoqXG4gICAgKiBGaXJlZCB3aGVuIGEgY2FsbCB0byBgQ29tcG9zaXRlLmFkZGAgaXMgbWFkZSwgYWZ0ZXIgb2JqZWN0cyBoYXZlIGJlZW4gYWRkZWQuXG4gICAgKlxuICAgICogQGV2ZW50IGFmdGVyQWRkXG4gICAgKiBAcGFyYW0ge30gZXZlbnQgQW4gZXZlbnQgb2JqZWN0XG4gICAgKiBAcGFyYW0ge30gZXZlbnQub2JqZWN0IFRoZSBvYmplY3QocykgdGhhdCBoYXZlIGJlZW4gYWRkZWQgKG1heSBiZSBhIHNpbmdsZSBib2R5LCBjb25zdHJhaW50LCBjb21wb3NpdGUgb3IgYSBtaXhlZCBhcnJheSBvZiB0aGVzZSlcbiAgICAqIEBwYXJhbSB7fSBldmVudC5zb3VyY2UgVGhlIHNvdXJjZSBvYmplY3Qgb2YgdGhlIGV2ZW50XG4gICAgKiBAcGFyYW0ge30gZXZlbnQubmFtZSBUaGUgbmFtZSBvZiB0aGUgZXZlbnRcbiAgICAqL1xuXG4gICAgLyoqXG4gICAgKiBGaXJlZCB3aGVuIGEgY2FsbCB0byBgQ29tcG9zaXRlLnJlbW92ZWAgaXMgbWFkZSwgYmVmb3JlIG9iamVjdHMgaGF2ZSBiZWVuIHJlbW92ZWQuXG4gICAgKlxuICAgICogQGV2ZW50IGJlZm9yZVJlbW92ZVxuICAgICogQHBhcmFtIHt9IGV2ZW50IEFuIGV2ZW50IG9iamVjdFxuICAgICogQHBhcmFtIHt9IGV2ZW50Lm9iamVjdCBUaGUgb2JqZWN0KHMpIHRvIGJlIHJlbW92ZWQgKG1heSBiZSBhIHNpbmdsZSBib2R5LCBjb25zdHJhaW50LCBjb21wb3NpdGUgb3IgYSBtaXhlZCBhcnJheSBvZiB0aGVzZSlcbiAgICAqIEBwYXJhbSB7fSBldmVudC5zb3VyY2UgVGhlIHNvdXJjZSBvYmplY3Qgb2YgdGhlIGV2ZW50XG4gICAgKiBAcGFyYW0ge30gZXZlbnQubmFtZSBUaGUgbmFtZSBvZiB0aGUgZXZlbnRcbiAgICAqL1xuXG4gICAgLyoqXG4gICAgKiBGaXJlZCB3aGVuIGEgY2FsbCB0byBgQ29tcG9zaXRlLnJlbW92ZWAgaXMgbWFkZSwgYWZ0ZXIgb2JqZWN0cyBoYXZlIGJlZW4gcmVtb3ZlZC5cbiAgICAqXG4gICAgKiBAZXZlbnQgYWZ0ZXJSZW1vdmVcbiAgICAqIEBwYXJhbSB7fSBldmVudCBBbiBldmVudCBvYmplY3RcbiAgICAqIEBwYXJhbSB7fSBldmVudC5vYmplY3QgVGhlIG9iamVjdChzKSB0aGF0IGhhdmUgYmVlbiByZW1vdmVkIChtYXkgYmUgYSBzaW5nbGUgYm9keSwgY29uc3RyYWludCwgY29tcG9zaXRlIG9yIGEgbWl4ZWQgYXJyYXkgb2YgdGhlc2UpXG4gICAgKiBAcGFyYW0ge30gZXZlbnQuc291cmNlIFRoZSBzb3VyY2Ugb2JqZWN0IG9mIHRoZSBldmVudFxuICAgICogQHBhcmFtIHt9IGV2ZW50Lm5hbWUgVGhlIG5hbWUgb2YgdGhlIGV2ZW50XG4gICAgKi9cblxuICAgIC8qXG4gICAgKlxuICAgICogIFByb3BlcnRpZXMgRG9jdW1lbnRhdGlvblxuICAgICpcbiAgICAqL1xuXG4gICAgLyoqXG4gICAgICogQW4gaW50ZWdlciBgTnVtYmVyYCB1bmlxdWVseSBpZGVudGlmeWluZyBudW1iZXIgZ2VuZXJhdGVkIGluIGBDb21wb3NpdGUuY3JlYXRlYCBieSBgQ29tbW9uLm5leHRJZGAuXG4gICAgICpcbiAgICAgKiBAcHJvcGVydHkgaWRcbiAgICAgKiBAdHlwZSBudW1iZXJcbiAgICAgKi9cblxuICAgIC8qKlxuICAgICAqIEEgYFN0cmluZ2AgZGVub3RpbmcgdGhlIHR5cGUgb2Ygb2JqZWN0LlxuICAgICAqXG4gICAgICogQHByb3BlcnR5IHR5cGVcbiAgICAgKiBAdHlwZSBzdHJpbmdcbiAgICAgKiBAZGVmYXVsdCBcImNvbXBvc2l0ZVwiXG4gICAgICogQHJlYWRPbmx5XG4gICAgICovXG5cbiAgICAvKipcbiAgICAgKiBBbiBhcmJpdHJhcnkgYFN0cmluZ2AgbmFtZSB0byBoZWxwIHRoZSB1c2VyIGlkZW50aWZ5IGFuZCBtYW5hZ2UgY29tcG9zaXRlcy5cbiAgICAgKlxuICAgICAqIEBwcm9wZXJ0eSBsYWJlbFxuICAgICAqIEB0eXBlIHN0cmluZ1xuICAgICAqIEBkZWZhdWx0IFwiQ29tcG9zaXRlXCJcbiAgICAgKi9cblxuICAgIC8qKlxuICAgICAqIEEgZmxhZyB0aGF0IHNwZWNpZmllcyB3aGV0aGVyIHRoZSBjb21wb3NpdGUgaGFzIGJlZW4gbW9kaWZpZWQgZHVyaW5nIHRoZSBjdXJyZW50IHN0ZXAuXG4gICAgICogVGhpcyBpcyBhdXRvbWF0aWNhbGx5IG1hbmFnZWQgd2hlbiBib2RpZXMsIGNvbnN0cmFpbnRzIG9yIGNvbXBvc2l0ZXMgYXJlIGFkZGVkIG9yIHJlbW92ZWQuXG4gICAgICpcbiAgICAgKiBAcHJvcGVydHkgaXNNb2RpZmllZFxuICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAqL1xuXG4gICAgLyoqXG4gICAgICogVGhlIGBDb21wb3NpdGVgIHRoYXQgaXMgdGhlIHBhcmVudCBvZiB0aGlzIGNvbXBvc2l0ZS4gSXQgaXMgYXV0b21hdGljYWxseSBtYW5hZ2VkIGJ5IHRoZSBgTWF0dGVyLkNvbXBvc2l0ZWAgbWV0aG9kcy5cbiAgICAgKlxuICAgICAqIEBwcm9wZXJ0eSBwYXJlbnRcbiAgICAgKiBAdHlwZSBjb21wb3NpdGVcbiAgICAgKiBAZGVmYXVsdCBudWxsXG4gICAgICovXG5cbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBgQm9keWAgdGhhdCBhcmUgX2RpcmVjdF8gY2hpbGRyZW4gb2YgdGhpcyBjb21wb3NpdGUuXG4gICAgICogVG8gYWRkIG9yIHJlbW92ZSBib2RpZXMgeW91IHNob3VsZCB1c2UgYENvbXBvc2l0ZS5hZGRgIGFuZCBgQ29tcG9zaXRlLnJlbW92ZWAgbWV0aG9kcyByYXRoZXIgdGhhbiBkaXJlY3RseSBtb2RpZnlpbmcgdGhpcyBwcm9wZXJ0eS5cbiAgICAgKiBJZiB5b3Ugd2lzaCB0byByZWN1cnNpdmVseSBmaW5kIGFsbCBkZXNjZW5kYW50cywgeW91IHNob3VsZCB1c2UgdGhlIGBDb21wb3NpdGUuYWxsQm9kaWVzYCBtZXRob2QuXG4gICAgICpcbiAgICAgKiBAcHJvcGVydHkgYm9kaWVzXG4gICAgICogQHR5cGUgYm9keVtdXG4gICAgICogQGRlZmF1bHQgW11cbiAgICAgKi9cblxuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIGBDb25zdHJhaW50YCB0aGF0IGFyZSBfZGlyZWN0XyBjaGlsZHJlbiBvZiB0aGlzIGNvbXBvc2l0ZS5cbiAgICAgKiBUbyBhZGQgb3IgcmVtb3ZlIGNvbnN0cmFpbnRzIHlvdSBzaG91bGQgdXNlIGBDb21wb3NpdGUuYWRkYCBhbmQgYENvbXBvc2l0ZS5yZW1vdmVgIG1ldGhvZHMgcmF0aGVyIHRoYW4gZGlyZWN0bHkgbW9kaWZ5aW5nIHRoaXMgcHJvcGVydHkuXG4gICAgICogSWYgeW91IHdpc2ggdG8gcmVjdXJzaXZlbHkgZmluZCBhbGwgZGVzY2VuZGFudHMsIHlvdSBzaG91bGQgdXNlIHRoZSBgQ29tcG9zaXRlLmFsbENvbnN0cmFpbnRzYCBtZXRob2QuXG4gICAgICpcbiAgICAgKiBAcHJvcGVydHkgY29uc3RyYWludHNcbiAgICAgKiBAdHlwZSBjb25zdHJhaW50W11cbiAgICAgKiBAZGVmYXVsdCBbXVxuICAgICAqL1xuXG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgYENvbXBvc2l0ZWAgdGhhdCBhcmUgX2RpcmVjdF8gY2hpbGRyZW4gb2YgdGhpcyBjb21wb3NpdGUuXG4gICAgICogVG8gYWRkIG9yIHJlbW92ZSBjb21wb3NpdGVzIHlvdSBzaG91bGQgdXNlIGBDb21wb3NpdGUuYWRkYCBhbmQgYENvbXBvc2l0ZS5yZW1vdmVgIG1ldGhvZHMgcmF0aGVyIHRoYW4gZGlyZWN0bHkgbW9kaWZ5aW5nIHRoaXMgcHJvcGVydHkuXG4gICAgICogSWYgeW91IHdpc2ggdG8gcmVjdXJzaXZlbHkgZmluZCBhbGwgZGVzY2VuZGFudHMsIHlvdSBzaG91bGQgdXNlIHRoZSBgQ29tcG9zaXRlLmFsbENvbXBvc2l0ZXNgIG1ldGhvZC5cbiAgICAgKlxuICAgICAqIEBwcm9wZXJ0eSBjb21wb3NpdGVzXG4gICAgICogQHR5cGUgY29tcG9zaXRlW11cbiAgICAgKiBAZGVmYXVsdCBbXVxuICAgICAqL1xuXG4gICAgLyoqXG4gICAgICogQW4gb2JqZWN0IHJlc2VydmVkIGZvciBzdG9yaW5nIHBsdWdpbi1zcGVjaWZpYyBwcm9wZXJ0aWVzLlxuICAgICAqXG4gICAgICogQHByb3BlcnR5IHBsdWdpblxuICAgICAqIEB0eXBlIHt9XG4gICAgICovXG5cbiAgICAvKipcbiAgICAgKiBBbiBvYmplY3QgdXNlZCBmb3Igc3RvcmluZyBjYWNoZWQgcmVzdWx0cyBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucy5cbiAgICAgKiBUaGlzIGlzIHVzZWQgaW50ZXJuYWxseSBvbmx5IGFuZCBpcyBhdXRvbWF0aWNhbGx5IG1hbmFnZWQuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwcm9wZXJ0eSBjYWNoZVxuICAgICAqIEB0eXBlIHt9XG4gICAgICovXG5cbn0pKCk7XG5cblxuLyoqKi8gfSksXG4vKiA2ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cbi8qKlxuKiBUaGUgYE1hdHRlci5Cb2R5YCBtb2R1bGUgY29udGFpbnMgbWV0aG9kcyBmb3IgY3JlYXRpbmcgYW5kIG1hbmlwdWxhdGluZyBib2R5IG1vZGVscy5cbiogQSBgTWF0dGVyLkJvZHlgIGlzIGEgcmlnaWQgYm9keSB0aGF0IGNhbiBiZSBzaW11bGF0ZWQgYnkgYSBgTWF0dGVyLkVuZ2luZWAuXG4qIEZhY3RvcmllcyBmb3IgY29tbW9ubHkgdXNlZCBib2R5IGNvbmZpZ3VyYXRpb25zIChzdWNoIGFzIHJlY3RhbmdsZXMsIGNpcmNsZXMgYW5kIG90aGVyIHBvbHlnb25zKSBjYW4gYmUgZm91bmQgaW4gdGhlIG1vZHVsZSBgTWF0dGVyLkJvZGllc2AuXG4qXG4qIFNlZSB0aGUgaW5jbHVkZWQgdXNhZ2UgW2V4YW1wbGVzXShodHRwczovL2dpdGh1Yi5jb20vbGlhYnJ1L21hdHRlci1qcy90cmVlL21hc3Rlci9leGFtcGxlcykuXG5cbiogQGNsYXNzIEJvZHlcbiovXG5cbnZhciBCb2R5ID0ge307XG5cbm1vZHVsZS5leHBvcnRzID0gQm9keTtcblxudmFyIFZlcnRpY2VzID0gX193ZWJwYWNrX3JlcXVpcmVfXygzKTtcbnZhciBWZWN0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIpO1xudmFyIFNsZWVwaW5nID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3KTtcbnZhciBSZW5kZXIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE2KTtcbnZhciBDb21tb24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDApO1xudmFyIEJvdW5kcyA9IF9fd2VicGFja19yZXF1aXJlX18oMSk7XG52YXIgQXhlcyA9IF9fd2VicGFja19yZXF1aXJlX18oMTEpO1xuXG4oZnVuY3Rpb24oKSB7XG5cbiAgICBCb2R5Ll9pbmVydGlhU2NhbGUgPSA0O1xuICAgIEJvZHkuX25leHRDb2xsaWRpbmdHcm91cElkID0gMTtcbiAgICBCb2R5Ll9uZXh0Tm9uQ29sbGlkaW5nR3JvdXBJZCA9IC0xO1xuICAgIEJvZHkuX25leHRDYXRlZ29yeSA9IDB4MDAwMTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgcmlnaWQgYm9keSBtb2RlbC4gVGhlIG9wdGlvbnMgcGFyYW1ldGVyIGlzIGFuIG9iamVjdCB0aGF0IHNwZWNpZmllcyBhbnkgcHJvcGVydGllcyB5b3Ugd2lzaCB0byBvdmVycmlkZSB0aGUgZGVmYXVsdHMuXG4gICAgICogQWxsIHByb3BlcnRpZXMgaGF2ZSBkZWZhdWx0IHZhbHVlcywgYW5kIG1hbnkgYXJlIHByZS1jYWxjdWxhdGVkIGF1dG9tYXRpY2FsbHkgYmFzZWQgb24gb3RoZXIgcHJvcGVydGllcy5cbiAgICAgKiBWZXJ0aWNlcyBtdXN0IGJlIHNwZWNpZmllZCBpbiBjbG9ja3dpc2Ugb3JkZXIuXG4gICAgICogU2VlIHRoZSBwcm9wZXJ0aWVzIHNlY3Rpb24gYmVsb3cgZm9yIGRldGFpbGVkIGluZm9ybWF0aW9uIG9uIHdoYXQgeW91IGNhbiBwYXNzIHZpYSB0aGUgYG9wdGlvbnNgIG9iamVjdC5cbiAgICAgKiBAbWV0aG9kIGNyZWF0ZVxuICAgICAqIEBwYXJhbSB7fSBvcHRpb25zXG4gICAgICogQHJldHVybiB7Ym9keX0gYm9keVxuICAgICAqL1xuICAgIEJvZHkuY3JlYXRlID0gZnVuY3Rpb24ob3B0aW9ucykge1xuICAgICAgICB2YXIgZGVmYXVsdHMgPSB7XG4gICAgICAgICAgICBpZDogQ29tbW9uLm5leHRJZCgpLFxuICAgICAgICAgICAgdHlwZTogJ2JvZHknLFxuICAgICAgICAgICAgbGFiZWw6ICdCb2R5JyxcbiAgICAgICAgICAgIHBhcnRzOiBbXSxcbiAgICAgICAgICAgIHBsdWdpbjoge30sXG4gICAgICAgICAgICBhbmdsZTogMCxcbiAgICAgICAgICAgIHZlcnRpY2VzOiBWZXJ0aWNlcy5mcm9tUGF0aCgnTCAwIDAgTCA0MCAwIEwgNDAgNDAgTCAwIDQwJyksXG4gICAgICAgICAgICBwb3NpdGlvbjogeyB4OiAwLCB5OiAwIH0sXG4gICAgICAgICAgICBmb3JjZTogeyB4OiAwLCB5OiAwIH0sXG4gICAgICAgICAgICB0b3JxdWU6IDAsXG4gICAgICAgICAgICBwb3NpdGlvbkltcHVsc2U6IHsgeDogMCwgeTogMCB9LFxuICAgICAgICAgICAgY29uc3RyYWludEltcHVsc2U6IHsgeDogMCwgeTogMCwgYW5nbGU6IDAgfSxcbiAgICAgICAgICAgIHRvdGFsQ29udGFjdHM6IDAsXG4gICAgICAgICAgICBzcGVlZDogMCxcbiAgICAgICAgICAgIGFuZ3VsYXJTcGVlZDogMCxcbiAgICAgICAgICAgIHZlbG9jaXR5OiB7IHg6IDAsIHk6IDAgfSxcbiAgICAgICAgICAgIGFuZ3VsYXJWZWxvY2l0eTogMCxcbiAgICAgICAgICAgIGlzU2Vuc29yOiBmYWxzZSxcbiAgICAgICAgICAgIGlzU3RhdGljOiBmYWxzZSxcbiAgICAgICAgICAgIGlzU2xlZXBpbmc6IGZhbHNlLFxuICAgICAgICAgICAgbW90aW9uOiAwLFxuICAgICAgICAgICAgc2xlZXBUaHJlc2hvbGQ6IDYwLFxuICAgICAgICAgICAgZGVuc2l0eTogMC4wMDEsXG4gICAgICAgICAgICByZXN0aXR1dGlvbjogMCxcbiAgICAgICAgICAgIGZyaWN0aW9uOiAwLjEsXG4gICAgICAgICAgICBmcmljdGlvblN0YXRpYzogMC41LFxuICAgICAgICAgICAgZnJpY3Rpb25BaXI6IDAuMDEsXG4gICAgICAgICAgICBjb2xsaXNpb25GaWx0ZXI6IHtcbiAgICAgICAgICAgICAgICBjYXRlZ29yeTogMHgwMDAxLFxuICAgICAgICAgICAgICAgIG1hc2s6IDB4RkZGRkZGRkYsXG4gICAgICAgICAgICAgICAgZ3JvdXA6IDBcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzbG9wOiAwLjA1LFxuICAgICAgICAgICAgdGltZVNjYWxlOiAxLFxuICAgICAgICAgICAgcmVuZGVyOiB7XG4gICAgICAgICAgICAgICAgdmlzaWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBvcGFjaXR5OiAxLFxuICAgICAgICAgICAgICAgIHN0cm9rZVN0eWxlOiBudWxsLFxuICAgICAgICAgICAgICAgIGZpbGxTdHlsZTogbnVsbCxcbiAgICAgICAgICAgICAgICBsaW5lV2lkdGg6IG51bGwsXG4gICAgICAgICAgICAgICAgc3ByaXRlOiB7XG4gICAgICAgICAgICAgICAgICAgIHhTY2FsZTogMSxcbiAgICAgICAgICAgICAgICAgICAgeVNjYWxlOiAxLFxuICAgICAgICAgICAgICAgICAgICB4T2Zmc2V0OiAwLFxuICAgICAgICAgICAgICAgICAgICB5T2Zmc2V0OiAwXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGV2ZW50czogbnVsbCxcbiAgICAgICAgICAgIGJvdW5kczogbnVsbCxcbiAgICAgICAgICAgIGNoYW1mZXI6IG51bGwsXG4gICAgICAgICAgICBjaXJjbGVSYWRpdXM6IDAsXG4gICAgICAgICAgICBwb3NpdGlvblByZXY6IG51bGwsXG4gICAgICAgICAgICBhbmdsZVByZXY6IDAsXG4gICAgICAgICAgICBwYXJlbnQ6IG51bGwsXG4gICAgICAgICAgICBheGVzOiBudWxsLFxuICAgICAgICAgICAgYXJlYTogMCxcbiAgICAgICAgICAgIG1hc3M6IDAsXG4gICAgICAgICAgICBpbmVydGlhOiAwLFxuICAgICAgICAgICAgX29yaWdpbmFsOiBudWxsXG4gICAgICAgIH07XG5cbiAgICAgICAgdmFyIGJvZHkgPSBDb21tb24uZXh0ZW5kKGRlZmF1bHRzLCBvcHRpb25zKTtcblxuICAgICAgICBfaW5pdFByb3BlcnRpZXMoYm9keSwgb3B0aW9ucyk7XG5cbiAgICAgICAgcmV0dXJuIGJvZHk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIG5leHQgdW5pcXVlIGdyb3VwIGluZGV4IGZvciB3aGljaCBib2RpZXMgd2lsbCBjb2xsaWRlLlxuICAgICAqIElmIGBpc05vbkNvbGxpZGluZ2AgaXMgYHRydWVgLCByZXR1cm5zIHRoZSBuZXh0IHVuaXF1ZSBncm91cCBpbmRleCBmb3Igd2hpY2ggYm9kaWVzIHdpbGwgX25vdF8gY29sbGlkZS5cbiAgICAgKiBTZWUgYGJvZHkuY29sbGlzaW9uRmlsdGVyYCBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbiAgICAgKiBAbWV0aG9kIG5leHRHcm91cFxuICAgICAqIEBwYXJhbSB7Ym9vbH0gW2lzTm9uQ29sbGlkaW5nPWZhbHNlXVxuICAgICAqIEByZXR1cm4ge051bWJlcn0gVW5pcXVlIGdyb3VwIGluZGV4XG4gICAgICovXG4gICAgQm9keS5uZXh0R3JvdXAgPSBmdW5jdGlvbihpc05vbkNvbGxpZGluZykge1xuICAgICAgICBpZiAoaXNOb25Db2xsaWRpbmcpXG4gICAgICAgICAgICByZXR1cm4gQm9keS5fbmV4dE5vbkNvbGxpZGluZ0dyb3VwSWQtLTtcblxuICAgICAgICByZXR1cm4gQm9keS5fbmV4dENvbGxpZGluZ0dyb3VwSWQrKztcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgbmV4dCB1bmlxdWUgY2F0ZWdvcnkgYml0ZmllbGQgKHN0YXJ0aW5nIGFmdGVyIHRoZSBpbml0aWFsIGRlZmF1bHQgY2F0ZWdvcnkgYDB4MDAwMWApLlxuICAgICAqIFRoZXJlIGFyZSAzMiBhdmFpbGFibGUuIFNlZSBgYm9keS5jb2xsaXNpb25GaWx0ZXJgIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuICAgICAqIEBtZXRob2QgbmV4dENhdGVnb3J5XG4gICAgICogQHJldHVybiB7TnVtYmVyfSBVbmlxdWUgY2F0ZWdvcnkgYml0ZmllbGRcbiAgICAgKi9cbiAgICBCb2R5Lm5leHRDYXRlZ29yeSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICBCb2R5Ll9uZXh0Q2F0ZWdvcnkgPSBCb2R5Ll9uZXh0Q2F0ZWdvcnkgPDwgMTtcbiAgICAgICAgcmV0dXJuIEJvZHkuX25leHRDYXRlZ29yeTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogSW5pdGlhbGlzZXMgYm9keSBwcm9wZXJ0aWVzLlxuICAgICAqIEBtZXRob2QgX2luaXRQcm9wZXJ0aWVzXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge2JvZHl9IGJvZHlcbiAgICAgKiBAcGFyYW0ge30gW29wdGlvbnNdXG4gICAgICovXG4gICAgdmFyIF9pbml0UHJvcGVydGllcyA9IGZ1bmN0aW9uKGJvZHksIG9wdGlvbnMpIHtcbiAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgICAgICAgLy8gaW5pdCByZXF1aXJlZCBwcm9wZXJ0aWVzIChvcmRlciBpcyBpbXBvcnRhbnQpXG4gICAgICAgIEJvZHkuc2V0KGJvZHksIHtcbiAgICAgICAgICAgIGJvdW5kczogYm9keS5ib3VuZHMgfHwgQm91bmRzLmNyZWF0ZShib2R5LnZlcnRpY2VzKSxcbiAgICAgICAgICAgIHBvc2l0aW9uUHJldjogYm9keS5wb3NpdGlvblByZXYgfHwgVmVjdG9yLmNsb25lKGJvZHkucG9zaXRpb24pLFxuICAgICAgICAgICAgYW5nbGVQcmV2OiBib2R5LmFuZ2xlUHJldiB8fCBib2R5LmFuZ2xlLFxuICAgICAgICAgICAgdmVydGljZXM6IGJvZHkudmVydGljZXMsXG4gICAgICAgICAgICBwYXJ0czogYm9keS5wYXJ0cyB8fCBbYm9keV0sXG4gICAgICAgICAgICBpc1N0YXRpYzogYm9keS5pc1N0YXRpYyxcbiAgICAgICAgICAgIGlzU2xlZXBpbmc6IGJvZHkuaXNTbGVlcGluZyxcbiAgICAgICAgICAgIHBhcmVudDogYm9keS5wYXJlbnQgfHwgYm9keVxuICAgICAgICB9KTtcblxuICAgICAgICBWZXJ0aWNlcy5yb3RhdGUoYm9keS52ZXJ0aWNlcywgYm9keS5hbmdsZSwgYm9keS5wb3NpdGlvbik7XG4gICAgICAgIEF4ZXMucm90YXRlKGJvZHkuYXhlcywgYm9keS5hbmdsZSk7XG4gICAgICAgIEJvdW5kcy51cGRhdGUoYm9keS5ib3VuZHMsIGJvZHkudmVydGljZXMsIGJvZHkudmVsb2NpdHkpO1xuXG4gICAgICAgIC8vIGFsbG93IG9wdGlvbnMgdG8gb3ZlcnJpZGUgdGhlIGF1dG9tYXRpY2FsbHkgY2FsY3VsYXRlZCBwcm9wZXJ0aWVzXG4gICAgICAgIEJvZHkuc2V0KGJvZHksIHtcbiAgICAgICAgICAgIGF4ZXM6IG9wdGlvbnMuYXhlcyB8fCBib2R5LmF4ZXMsXG4gICAgICAgICAgICBhcmVhOiBvcHRpb25zLmFyZWEgfHwgYm9keS5hcmVhLFxuICAgICAgICAgICAgbWFzczogb3B0aW9ucy5tYXNzIHx8IGJvZHkubWFzcyxcbiAgICAgICAgICAgIGluZXJ0aWE6IG9wdGlvbnMuaW5lcnRpYSB8fCBib2R5LmluZXJ0aWFcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gcmVuZGVyIHByb3BlcnRpZXNcbiAgICAgICAgdmFyIGRlZmF1bHRGaWxsU3R5bGUgPSAoYm9keS5pc1N0YXRpYyA/ICcjMTQxNTFmJyA6IENvbW1vbi5jaG9vc2UoWycjZjE5NjQ4JywgJyNmNWQyNTknLCAnI2Y1NWEzYycsICcjMDYzZTdiJywgJyNlY2VjZDEnXSkpLFxuICAgICAgICAgICAgZGVmYXVsdFN0cm9rZVN0eWxlID0gYm9keS5pc1N0YXRpYyA/ICcjNTU1JyA6ICcjY2NjJyxcbiAgICAgICAgICAgIGRlZmF1bHRMaW5lV2lkdGggPSBib2R5LmlzU3RhdGljICYmIGJvZHkucmVuZGVyLmZpbGxTdHlsZSA9PT0gbnVsbCA/IDEgOiAwO1xuICAgICAgICBib2R5LnJlbmRlci5maWxsU3R5bGUgPSBib2R5LnJlbmRlci5maWxsU3R5bGUgfHwgZGVmYXVsdEZpbGxTdHlsZTtcbiAgICAgICAgYm9keS5yZW5kZXIuc3Ryb2tlU3R5bGUgPSBib2R5LnJlbmRlci5zdHJva2VTdHlsZSB8fCBkZWZhdWx0U3Ryb2tlU3R5bGU7XG4gICAgICAgIGJvZHkucmVuZGVyLmxpbmVXaWR0aCA9IGJvZHkucmVuZGVyLmxpbmVXaWR0aCB8fCBkZWZhdWx0TGluZVdpZHRoO1xuICAgICAgICBib2R5LnJlbmRlci5zcHJpdGUueE9mZnNldCArPSAtKGJvZHkuYm91bmRzLm1pbi54IC0gYm9keS5wb3NpdGlvbi54KSAvIChib2R5LmJvdW5kcy5tYXgueCAtIGJvZHkuYm91bmRzLm1pbi54KTtcbiAgICAgICAgYm9keS5yZW5kZXIuc3ByaXRlLnlPZmZzZXQgKz0gLShib2R5LmJvdW5kcy5taW4ueSAtIGJvZHkucG9zaXRpb24ueSkgLyAoYm9keS5ib3VuZHMubWF4LnkgLSBib2R5LmJvdW5kcy5taW4ueSk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEdpdmVuIGEgcHJvcGVydHkgYW5kIGEgdmFsdWUgKG9yIG1hcCBvZiksIHNldHMgdGhlIHByb3BlcnR5KHMpIG9uIHRoZSBib2R5LCB1c2luZyB0aGUgYXBwcm9wcmlhdGUgc2V0dGVyIGZ1bmN0aW9ucyBpZiB0aGV5IGV4aXN0LlxuICAgICAqIFByZWZlciB0byB1c2UgdGhlIGFjdHVhbCBzZXR0ZXIgZnVuY3Rpb25zIGluIHBlcmZvcm1hbmNlIGNyaXRpY2FsIHNpdHVhdGlvbnMuXG4gICAgICogQG1ldGhvZCBzZXRcbiAgICAgKiBAcGFyYW0ge2JvZHl9IGJvZHlcbiAgICAgKiBAcGFyYW0ge30gc2V0dGluZ3MgQSBwcm9wZXJ0eSBuYW1lIChvciBtYXAgb2YgcHJvcGVydGllcyBhbmQgdmFsdWVzKSB0byBzZXQgb24gdGhlIGJvZHkuXG4gICAgICogQHBhcmFtIHt9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZXQgaWYgYHNldHRpbmdzYCBpcyBhIHNpbmdsZSBwcm9wZXJ0eSBuYW1lLlxuICAgICAqL1xuICAgIEJvZHkuc2V0ID0gZnVuY3Rpb24oYm9keSwgc2V0dGluZ3MsIHZhbHVlKSB7XG4gICAgICAgIHZhciBwcm9wZXJ0eTtcblxuICAgICAgICBpZiAodHlwZW9mIHNldHRpbmdzID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgcHJvcGVydHkgPSBzZXR0aW5ncztcbiAgICAgICAgICAgIHNldHRpbmdzID0ge307XG4gICAgICAgICAgICBzZXR0aW5nc1twcm9wZXJ0eV0gPSB2YWx1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAocHJvcGVydHkgaW4gc2V0dGluZ3MpIHtcbiAgICAgICAgICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNldHRpbmdzLCBwcm9wZXJ0eSkpXG4gICAgICAgICAgICAgICAgY29udGludWU7XG5cbiAgICAgICAgICAgIHZhbHVlID0gc2V0dGluZ3NbcHJvcGVydHldO1xuICAgICAgICAgICAgc3dpdGNoIChwcm9wZXJ0eSkge1xuXG4gICAgICAgICAgICBjYXNlICdpc1N0YXRpYyc6XG4gICAgICAgICAgICAgICAgQm9keS5zZXRTdGF0aWMoYm9keSwgdmFsdWUpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnaXNTbGVlcGluZyc6XG4gICAgICAgICAgICAgICAgU2xlZXBpbmcuc2V0KGJvZHksIHZhbHVlKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ21hc3MnOlxuICAgICAgICAgICAgICAgIEJvZHkuc2V0TWFzcyhib2R5LCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdkZW5zaXR5JzpcbiAgICAgICAgICAgICAgICBCb2R5LnNldERlbnNpdHkoYm9keSwgdmFsdWUpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnaW5lcnRpYSc6XG4gICAgICAgICAgICAgICAgQm9keS5zZXRJbmVydGlhKGJvZHksIHZhbHVlKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ3ZlcnRpY2VzJzpcbiAgICAgICAgICAgICAgICBCb2R5LnNldFZlcnRpY2VzKGJvZHksIHZhbHVlKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ3Bvc2l0aW9uJzpcbiAgICAgICAgICAgICAgICBCb2R5LnNldFBvc2l0aW9uKGJvZHksIHZhbHVlKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2FuZ2xlJzpcbiAgICAgICAgICAgICAgICBCb2R5LnNldEFuZ2xlKGJvZHksIHZhbHVlKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ3ZlbG9jaXR5JzpcbiAgICAgICAgICAgICAgICBCb2R5LnNldFZlbG9jaXR5KGJvZHksIHZhbHVlKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2FuZ3VsYXJWZWxvY2l0eSc6XG4gICAgICAgICAgICAgICAgQm9keS5zZXRBbmd1bGFyVmVsb2NpdHkoYm9keSwgdmFsdWUpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAncGFydHMnOlxuICAgICAgICAgICAgICAgIEJvZHkuc2V0UGFydHMoYm9keSwgdmFsdWUpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnY2VudHJlJzpcbiAgICAgICAgICAgICAgICBCb2R5LnNldENlbnRyZShib2R5LCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIGJvZHlbcHJvcGVydHldID0gdmFsdWU7XG5cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBib2R5IGFzIHN0YXRpYywgaW5jbHVkaW5nIGlzU3RhdGljIGZsYWcgYW5kIHNldHRpbmcgbWFzcyBhbmQgaW5lcnRpYSB0byBJbmZpbml0eS5cbiAgICAgKiBAbWV0aG9kIHNldFN0YXRpY1xuICAgICAqIEBwYXJhbSB7Ym9keX0gYm9keVxuICAgICAqIEBwYXJhbSB7Ym9vbH0gaXNTdGF0aWNcbiAgICAgKi9cbiAgICBCb2R5LnNldFN0YXRpYyA9IGZ1bmN0aW9uKGJvZHksIGlzU3RhdGljKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYm9keS5wYXJ0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIHBhcnQgPSBib2R5LnBhcnRzW2ldO1xuICAgICAgICAgICAgcGFydC5pc1N0YXRpYyA9IGlzU3RhdGljO1xuXG4gICAgICAgICAgICBpZiAoaXNTdGF0aWMpIHtcbiAgICAgICAgICAgICAgICBwYXJ0Ll9vcmlnaW5hbCA9IHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdGl0dXRpb246IHBhcnQucmVzdGl0dXRpb24sXG4gICAgICAgICAgICAgICAgICAgIGZyaWN0aW9uOiBwYXJ0LmZyaWN0aW9uLFxuICAgICAgICAgICAgICAgICAgICBtYXNzOiBwYXJ0Lm1hc3MsXG4gICAgICAgICAgICAgICAgICAgIGluZXJ0aWE6IHBhcnQuaW5lcnRpYSxcbiAgICAgICAgICAgICAgICAgICAgZGVuc2l0eTogcGFydC5kZW5zaXR5LFxuICAgICAgICAgICAgICAgICAgICBpbnZlcnNlTWFzczogcGFydC5pbnZlcnNlTWFzcyxcbiAgICAgICAgICAgICAgICAgICAgaW52ZXJzZUluZXJ0aWE6IHBhcnQuaW52ZXJzZUluZXJ0aWFcbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgcGFydC5yZXN0aXR1dGlvbiA9IDA7XG4gICAgICAgICAgICAgICAgcGFydC5mcmljdGlvbiA9IDE7XG4gICAgICAgICAgICAgICAgcGFydC5tYXNzID0gcGFydC5pbmVydGlhID0gcGFydC5kZW5zaXR5ID0gSW5maW5pdHk7XG4gICAgICAgICAgICAgICAgcGFydC5pbnZlcnNlTWFzcyA9IHBhcnQuaW52ZXJzZUluZXJ0aWEgPSAwO1xuXG4gICAgICAgICAgICAgICAgcGFydC5wb3NpdGlvblByZXYueCA9IHBhcnQucG9zaXRpb24ueDtcbiAgICAgICAgICAgICAgICBwYXJ0LnBvc2l0aW9uUHJldi55ID0gcGFydC5wb3NpdGlvbi55O1xuICAgICAgICAgICAgICAgIHBhcnQuYW5nbGVQcmV2ID0gcGFydC5hbmdsZTtcbiAgICAgICAgICAgICAgICBwYXJ0LmFuZ3VsYXJWZWxvY2l0eSA9IDA7XG4gICAgICAgICAgICAgICAgcGFydC5zcGVlZCA9IDA7XG4gICAgICAgICAgICAgICAgcGFydC5hbmd1bGFyU3BlZWQgPSAwO1xuICAgICAgICAgICAgICAgIHBhcnQubW90aW9uID0gMDtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocGFydC5fb3JpZ2luYWwpIHtcbiAgICAgICAgICAgICAgICBwYXJ0LnJlc3RpdHV0aW9uID0gcGFydC5fb3JpZ2luYWwucmVzdGl0dXRpb247XG4gICAgICAgICAgICAgICAgcGFydC5mcmljdGlvbiA9IHBhcnQuX29yaWdpbmFsLmZyaWN0aW9uO1xuICAgICAgICAgICAgICAgIHBhcnQubWFzcyA9IHBhcnQuX29yaWdpbmFsLm1hc3M7XG4gICAgICAgICAgICAgICAgcGFydC5pbmVydGlhID0gcGFydC5fb3JpZ2luYWwuaW5lcnRpYTtcbiAgICAgICAgICAgICAgICBwYXJ0LmRlbnNpdHkgPSBwYXJ0Ll9vcmlnaW5hbC5kZW5zaXR5O1xuICAgICAgICAgICAgICAgIHBhcnQuaW52ZXJzZU1hc3MgPSBwYXJ0Ll9vcmlnaW5hbC5pbnZlcnNlTWFzcztcbiAgICAgICAgICAgICAgICBwYXJ0LmludmVyc2VJbmVydGlhID0gcGFydC5fb3JpZ2luYWwuaW52ZXJzZUluZXJ0aWE7XG5cbiAgICAgICAgICAgICAgICBwYXJ0Ll9vcmlnaW5hbCA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgbWFzcyBvZiB0aGUgYm9keS4gSW52ZXJzZSBtYXNzLCBkZW5zaXR5IGFuZCBpbmVydGlhIGFyZSBhdXRvbWF0aWNhbGx5IHVwZGF0ZWQgdG8gcmVmbGVjdCB0aGUgY2hhbmdlLlxuICAgICAqIEBtZXRob2Qgc2V0TWFzc1xuICAgICAqIEBwYXJhbSB7Ym9keX0gYm9keVxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBtYXNzXG4gICAgICovXG4gICAgQm9keS5zZXRNYXNzID0gZnVuY3Rpb24oYm9keSwgbWFzcykge1xuICAgICAgICB2YXIgbW9tZW50ID0gYm9keS5pbmVydGlhIC8gKGJvZHkubWFzcyAvIDYpO1xuICAgICAgICBib2R5LmluZXJ0aWEgPSBtb21lbnQgKiAobWFzcyAvIDYpO1xuICAgICAgICBib2R5LmludmVyc2VJbmVydGlhID0gMSAvIGJvZHkuaW5lcnRpYTtcblxuICAgICAgICBib2R5Lm1hc3MgPSBtYXNzO1xuICAgICAgICBib2R5LmludmVyc2VNYXNzID0gMSAvIGJvZHkubWFzcztcbiAgICAgICAgYm9keS5kZW5zaXR5ID0gYm9keS5tYXNzIC8gYm9keS5hcmVhO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBkZW5zaXR5IG9mIHRoZSBib2R5LiBNYXNzIGFuZCBpbmVydGlhIGFyZSBhdXRvbWF0aWNhbGx5IHVwZGF0ZWQgdG8gcmVmbGVjdCB0aGUgY2hhbmdlLlxuICAgICAqIEBtZXRob2Qgc2V0RGVuc2l0eVxuICAgICAqIEBwYXJhbSB7Ym9keX0gYm9keVxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBkZW5zaXR5XG4gICAgICovXG4gICAgQm9keS5zZXREZW5zaXR5ID0gZnVuY3Rpb24oYm9keSwgZGVuc2l0eSkge1xuICAgICAgICBCb2R5LnNldE1hc3MoYm9keSwgZGVuc2l0eSAqIGJvZHkuYXJlYSk7XG4gICAgICAgIGJvZHkuZGVuc2l0eSA9IGRlbnNpdHk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIG1vbWVudCBvZiBpbmVydGlhIChpLmUuIHNlY29uZCBtb21lbnQgb2YgYXJlYSkgb2YgdGhlIGJvZHkuIFxuICAgICAqIEludmVyc2UgaW5lcnRpYSBpcyBhdXRvbWF0aWNhbGx5IHVwZGF0ZWQgdG8gcmVmbGVjdCB0aGUgY2hhbmdlLiBNYXNzIGlzIG5vdCBjaGFuZ2VkLlxuICAgICAqIEBtZXRob2Qgc2V0SW5lcnRpYVxuICAgICAqIEBwYXJhbSB7Ym9keX0gYm9keVxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBpbmVydGlhXG4gICAgICovXG4gICAgQm9keS5zZXRJbmVydGlhID0gZnVuY3Rpb24oYm9keSwgaW5lcnRpYSkge1xuICAgICAgICBib2R5LmluZXJ0aWEgPSBpbmVydGlhO1xuICAgICAgICBib2R5LmludmVyc2VJbmVydGlhID0gMSAvIGJvZHkuaW5lcnRpYTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgYm9keSdzIHZlcnRpY2VzIGFuZCB1cGRhdGVzIGJvZHkgcHJvcGVydGllcyBhY2NvcmRpbmdseSwgaW5jbHVkaW5nIGluZXJ0aWEsIGFyZWEgYW5kIG1hc3MgKHdpdGggcmVzcGVjdCB0byBgYm9keS5kZW5zaXR5YCkuXG4gICAgICogVmVydGljZXMgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IHRyYW5zZm9ybWVkIHRvIGJlIG9yaWVudGF0ZWQgYXJvdW5kIHRoZWlyIGNlbnRyZSBvZiBtYXNzIGFzIHRoZSBvcmlnaW4uXG4gICAgICogVGhleSBhcmUgdGhlbiBhdXRvbWF0aWNhbGx5IHRyYW5zbGF0ZWQgdG8gd29ybGQgc3BhY2UgYmFzZWQgb24gYGJvZHkucG9zaXRpb25gLlxuICAgICAqXG4gICAgICogVGhlIGB2ZXJ0aWNlc2AgYXJndW1lbnQgc2hvdWxkIGJlIHBhc3NlZCBhcyBhbiBhcnJheSBvZiBgTWF0dGVyLlZlY3RvcmAgcG9pbnRzIChvciBhIGBNYXR0ZXIuVmVydGljZXNgIGFycmF5KS5cbiAgICAgKiBWZXJ0aWNlcyBtdXN0IGZvcm0gYSBjb252ZXggaHVsbCwgY29uY2F2ZSBodWxscyBhcmUgbm90IHN1cHBvcnRlZC5cbiAgICAgKlxuICAgICAqIEBtZXRob2Qgc2V0VmVydGljZXNcbiAgICAgKiBAcGFyYW0ge2JvZHl9IGJvZHlcbiAgICAgKiBAcGFyYW0ge3ZlY3RvcltdfSB2ZXJ0aWNlc1xuICAgICAqL1xuICAgIEJvZHkuc2V0VmVydGljZXMgPSBmdW5jdGlvbihib2R5LCB2ZXJ0aWNlcykge1xuICAgICAgICAvLyBjaGFuZ2UgdmVydGljZXNcbiAgICAgICAgaWYgKHZlcnRpY2VzWzBdLmJvZHkgPT09IGJvZHkpIHtcbiAgICAgICAgICAgIGJvZHkudmVydGljZXMgPSB2ZXJ0aWNlcztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGJvZHkudmVydGljZXMgPSBWZXJ0aWNlcy5jcmVhdGUodmVydGljZXMsIGJvZHkpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gdXBkYXRlIHByb3BlcnRpZXNcbiAgICAgICAgYm9keS5heGVzID0gQXhlcy5mcm9tVmVydGljZXMoYm9keS52ZXJ0aWNlcyk7XG4gICAgICAgIGJvZHkuYXJlYSA9IFZlcnRpY2VzLmFyZWEoYm9keS52ZXJ0aWNlcyk7XG4gICAgICAgIEJvZHkuc2V0TWFzcyhib2R5LCBib2R5LmRlbnNpdHkgKiBib2R5LmFyZWEpO1xuXG4gICAgICAgIC8vIG9yaWVudCB2ZXJ0aWNlcyBhcm91bmQgdGhlIGNlbnRyZSBvZiBtYXNzIGF0IG9yaWdpbiAoMCwgMClcbiAgICAgICAgdmFyIGNlbnRyZSA9IFZlcnRpY2VzLmNlbnRyZShib2R5LnZlcnRpY2VzKTtcbiAgICAgICAgVmVydGljZXMudHJhbnNsYXRlKGJvZHkudmVydGljZXMsIGNlbnRyZSwgLTEpO1xuXG4gICAgICAgIC8vIHVwZGF0ZSBpbmVydGlhIHdoaWxlIHZlcnRpY2VzIGFyZSBhdCBvcmlnaW4gKDAsIDApXG4gICAgICAgIEJvZHkuc2V0SW5lcnRpYShib2R5LCBCb2R5Ll9pbmVydGlhU2NhbGUgKiBWZXJ0aWNlcy5pbmVydGlhKGJvZHkudmVydGljZXMsIGJvZHkubWFzcykpO1xuXG4gICAgICAgIC8vIHVwZGF0ZSBnZW9tZXRyeVxuICAgICAgICBWZXJ0aWNlcy50cmFuc2xhdGUoYm9keS52ZXJ0aWNlcywgYm9keS5wb3NpdGlvbik7XG4gICAgICAgIEJvdW5kcy51cGRhdGUoYm9keS5ib3VuZHMsIGJvZHkudmVydGljZXMsIGJvZHkudmVsb2NpdHkpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBwYXJ0cyBvZiB0aGUgYGJvZHlgIGFuZCB1cGRhdGVzIG1hc3MsIGluZXJ0aWEgYW5kIGNlbnRyb2lkLlxuICAgICAqIEVhY2ggcGFydCB3aWxsIGhhdmUgaXRzIHBhcmVudCBzZXQgdG8gYGJvZHlgLlxuICAgICAqIEJ5IGRlZmF1bHQgdGhlIGNvbnZleCBodWxsIHdpbGwgYmUgYXV0b21hdGljYWxseSBjb21wdXRlZCBhbmQgc2V0IG9uIGBib2R5YCwgdW5sZXNzIGBhdXRvSHVsbGAgaXMgc2V0IHRvIGBmYWxzZS5gXG4gICAgICogTm90ZSB0aGF0IHRoaXMgbWV0aG9kIHdpbGwgZW5zdXJlIHRoYXQgdGhlIGZpcnN0IHBhcnQgaW4gYGJvZHkucGFydHNgIHdpbGwgYWx3YXlzIGJlIHRoZSBgYm9keWAuXG4gICAgICogQG1ldGhvZCBzZXRQYXJ0c1xuICAgICAqIEBwYXJhbSB7Ym9keX0gYm9keVxuICAgICAqIEBwYXJhbSBbYm9keV0gcGFydHNcbiAgICAgKiBAcGFyYW0ge2Jvb2x9IFthdXRvSHVsbD10cnVlXVxuICAgICAqL1xuICAgIEJvZHkuc2V0UGFydHMgPSBmdW5jdGlvbihib2R5LCBwYXJ0cywgYXV0b0h1bGwpIHtcbiAgICAgICAgdmFyIGk7XG5cbiAgICAgICAgLy8gYWRkIGFsbCB0aGUgcGFydHMsIGVuc3VyaW5nIHRoYXQgdGhlIGZpcnN0IHBhcnQgaXMgYWx3YXlzIHRoZSBwYXJlbnQgYm9keVxuICAgICAgICBwYXJ0cyA9IHBhcnRzLnNsaWNlKDApO1xuICAgICAgICBib2R5LnBhcnRzLmxlbmd0aCA9IDA7XG4gICAgICAgIGJvZHkucGFydHMucHVzaChib2R5KTtcbiAgICAgICAgYm9keS5wYXJlbnQgPSBib2R5O1xuXG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBwYXJ0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIHBhcnQgPSBwYXJ0c1tpXTtcbiAgICAgICAgICAgIGlmIChwYXJ0ICE9PSBib2R5KSB7XG4gICAgICAgICAgICAgICAgcGFydC5wYXJlbnQgPSBib2R5O1xuICAgICAgICAgICAgICAgIGJvZHkucGFydHMucHVzaChwYXJ0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChib2R5LnBhcnRzLmxlbmd0aCA9PT0gMSlcbiAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICBhdXRvSHVsbCA9IHR5cGVvZiBhdXRvSHVsbCAhPT0gJ3VuZGVmaW5lZCcgPyBhdXRvSHVsbCA6IHRydWU7XG5cbiAgICAgICAgLy8gZmluZCB0aGUgY29udmV4IGh1bGwgb2YgYWxsIHBhcnRzIHRvIHNldCBvbiB0aGUgcGFyZW50IGJvZHlcbiAgICAgICAgaWYgKGF1dG9IdWxsKSB7XG4gICAgICAgICAgICB2YXIgdmVydGljZXMgPSBbXTtcbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwYXJ0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIHZlcnRpY2VzID0gdmVydGljZXMuY29uY2F0KHBhcnRzW2ldLnZlcnRpY2VzKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgVmVydGljZXMuY2xvY2t3aXNlU29ydCh2ZXJ0aWNlcyk7XG5cbiAgICAgICAgICAgIHZhciBodWxsID0gVmVydGljZXMuaHVsbCh2ZXJ0aWNlcyksXG4gICAgICAgICAgICAgICAgaHVsbENlbnRyZSA9IFZlcnRpY2VzLmNlbnRyZShodWxsKTtcblxuICAgICAgICAgICAgQm9keS5zZXRWZXJ0aWNlcyhib2R5LCBodWxsKTtcbiAgICAgICAgICAgIFZlcnRpY2VzLnRyYW5zbGF0ZShib2R5LnZlcnRpY2VzLCBodWxsQ2VudHJlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHN1bSB0aGUgcHJvcGVydGllcyBvZiBhbGwgY29tcG91bmQgcGFydHMgb2YgdGhlIHBhcmVudCBib2R5XG4gICAgICAgIHZhciB0b3RhbCA9IEJvZHkuX3RvdGFsUHJvcGVydGllcyhib2R5KTtcblxuICAgICAgICBib2R5LmFyZWEgPSB0b3RhbC5hcmVhO1xuICAgICAgICBib2R5LnBhcmVudCA9IGJvZHk7XG4gICAgICAgIGJvZHkucG9zaXRpb24ueCA9IHRvdGFsLmNlbnRyZS54O1xuICAgICAgICBib2R5LnBvc2l0aW9uLnkgPSB0b3RhbC5jZW50cmUueTtcbiAgICAgICAgYm9keS5wb3NpdGlvblByZXYueCA9IHRvdGFsLmNlbnRyZS54O1xuICAgICAgICBib2R5LnBvc2l0aW9uUHJldi55ID0gdG90YWwuY2VudHJlLnk7XG5cbiAgICAgICAgQm9keS5zZXRNYXNzKGJvZHksIHRvdGFsLm1hc3MpO1xuICAgICAgICBCb2R5LnNldEluZXJ0aWEoYm9keSwgdG90YWwuaW5lcnRpYSk7XG4gICAgICAgIEJvZHkuc2V0UG9zaXRpb24oYm9keSwgdG90YWwuY2VudHJlKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogU2V0IHRoZSBjZW50cmUgb2YgbWFzcyBvZiB0aGUgYm9keS4gXG4gICAgICogVGhlIGBjZW50cmVgIGlzIGEgdmVjdG9yIGluIHdvcmxkLXNwYWNlIHVubGVzcyBgcmVsYXRpdmVgIGlzIHNldCwgaW4gd2hpY2ggY2FzZSBpdCBpcyBhIHRyYW5zbGF0aW9uLlxuICAgICAqIFRoZSBjZW50cmUgb2YgbWFzcyBpcyB0aGUgcG9pbnQgdGhlIGJvZHkgcm90YXRlcyBhYm91dCBhbmQgY2FuIGJlIHVzZWQgdG8gc2ltdWxhdGUgbm9uLXVuaWZvcm0gZGVuc2l0eS5cbiAgICAgKiBUaGlzIGlzIGVxdWFsIHRvIG1vdmluZyBgYm9keS5wb3NpdGlvbmAgYnV0IG5vdCB0aGUgYGJvZHkudmVydGljZXNgLlxuICAgICAqIEludmFsaWQgaWYgdGhlIGBjZW50cmVgIGZhbGxzIG91dHNpZGUgdGhlIGJvZHkncyBjb252ZXggaHVsbC5cbiAgICAgKiBAbWV0aG9kIHNldENlbnRyZVxuICAgICAqIEBwYXJhbSB7Ym9keX0gYm9keVxuICAgICAqIEBwYXJhbSB7dmVjdG9yfSBjZW50cmVcbiAgICAgKiBAcGFyYW0ge2Jvb2x9IHJlbGF0aXZlXG4gICAgICovXG4gICAgQm9keS5zZXRDZW50cmUgPSBmdW5jdGlvbihib2R5LCBjZW50cmUsIHJlbGF0aXZlKSB7XG4gICAgICAgIGlmICghcmVsYXRpdmUpIHtcbiAgICAgICAgICAgIGJvZHkucG9zaXRpb25QcmV2LnggPSBjZW50cmUueCAtIChib2R5LnBvc2l0aW9uLnggLSBib2R5LnBvc2l0aW9uUHJldi54KTtcbiAgICAgICAgICAgIGJvZHkucG9zaXRpb25QcmV2LnkgPSBjZW50cmUueSAtIChib2R5LnBvc2l0aW9uLnkgLSBib2R5LnBvc2l0aW9uUHJldi55KTtcbiAgICAgICAgICAgIGJvZHkucG9zaXRpb24ueCA9IGNlbnRyZS54O1xuICAgICAgICAgICAgYm9keS5wb3NpdGlvbi55ID0gY2VudHJlLnk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBib2R5LnBvc2l0aW9uUHJldi54ICs9IGNlbnRyZS54O1xuICAgICAgICAgICAgYm9keS5wb3NpdGlvblByZXYueSArPSBjZW50cmUueTtcbiAgICAgICAgICAgIGJvZHkucG9zaXRpb24ueCArPSBjZW50cmUueDtcbiAgICAgICAgICAgIGJvZHkucG9zaXRpb24ueSArPSBjZW50cmUueTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBwb3NpdGlvbiBvZiB0aGUgYm9keSBpbnN0YW50bHkuIFZlbG9jaXR5LCBhbmdsZSwgZm9yY2UgZXRjLiBhcmUgdW5jaGFuZ2VkLlxuICAgICAqIEBtZXRob2Qgc2V0UG9zaXRpb25cbiAgICAgKiBAcGFyYW0ge2JvZHl9IGJvZHlcbiAgICAgKiBAcGFyYW0ge3ZlY3Rvcn0gcG9zaXRpb25cbiAgICAgKi9cbiAgICBCb2R5LnNldFBvc2l0aW9uID0gZnVuY3Rpb24oYm9keSwgcG9zaXRpb24pIHtcbiAgICAgICAgdmFyIGRlbHRhID0gVmVjdG9yLnN1Yihwb3NpdGlvbiwgYm9keS5wb3NpdGlvbik7XG4gICAgICAgIGJvZHkucG9zaXRpb25QcmV2LnggKz0gZGVsdGEueDtcbiAgICAgICAgYm9keS5wb3NpdGlvblByZXYueSArPSBkZWx0YS55O1xuXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYm9keS5wYXJ0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIHBhcnQgPSBib2R5LnBhcnRzW2ldO1xuICAgICAgICAgICAgcGFydC5wb3NpdGlvbi54ICs9IGRlbHRhLng7XG4gICAgICAgICAgICBwYXJ0LnBvc2l0aW9uLnkgKz0gZGVsdGEueTtcbiAgICAgICAgICAgIFZlcnRpY2VzLnRyYW5zbGF0ZShwYXJ0LnZlcnRpY2VzLCBkZWx0YSk7XG4gICAgICAgICAgICBCb3VuZHMudXBkYXRlKHBhcnQuYm91bmRzLCBwYXJ0LnZlcnRpY2VzLCBib2R5LnZlbG9jaXR5KTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBhbmdsZSBvZiB0aGUgYm9keSBpbnN0YW50bHkuIEFuZ3VsYXIgdmVsb2NpdHksIHBvc2l0aW9uLCBmb3JjZSBldGMuIGFyZSB1bmNoYW5nZWQuXG4gICAgICogQG1ldGhvZCBzZXRBbmdsZVxuICAgICAqIEBwYXJhbSB7Ym9keX0gYm9keVxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBhbmdsZVxuICAgICAqL1xuICAgIEJvZHkuc2V0QW5nbGUgPSBmdW5jdGlvbihib2R5LCBhbmdsZSkge1xuICAgICAgICB2YXIgZGVsdGEgPSBhbmdsZSAtIGJvZHkuYW5nbGU7XG4gICAgICAgIGJvZHkuYW5nbGVQcmV2ICs9IGRlbHRhO1xuXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYm9keS5wYXJ0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIHBhcnQgPSBib2R5LnBhcnRzW2ldO1xuICAgICAgICAgICAgcGFydC5hbmdsZSArPSBkZWx0YTtcbiAgICAgICAgICAgIFZlcnRpY2VzLnJvdGF0ZShwYXJ0LnZlcnRpY2VzLCBkZWx0YSwgYm9keS5wb3NpdGlvbik7XG4gICAgICAgICAgICBBeGVzLnJvdGF0ZShwYXJ0LmF4ZXMsIGRlbHRhKTtcbiAgICAgICAgICAgIEJvdW5kcy51cGRhdGUocGFydC5ib3VuZHMsIHBhcnQudmVydGljZXMsIGJvZHkudmVsb2NpdHkpO1xuICAgICAgICAgICAgaWYgKGkgPiAwKSB7XG4gICAgICAgICAgICAgICAgVmVjdG9yLnJvdGF0ZUFib3V0KHBhcnQucG9zaXRpb24sIGRlbHRhLCBib2R5LnBvc2l0aW9uLCBwYXJ0LnBvc2l0aW9uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBsaW5lYXIgdmVsb2NpdHkgb2YgdGhlIGJvZHkgaW5zdGFudGx5LiBQb3NpdGlvbiwgYW5nbGUsIGZvcmNlIGV0Yy4gYXJlIHVuY2hhbmdlZC4gU2VlIGFsc28gYEJvZHkuYXBwbHlGb3JjZWAuXG4gICAgICogQG1ldGhvZCBzZXRWZWxvY2l0eVxuICAgICAqIEBwYXJhbSB7Ym9keX0gYm9keVxuICAgICAqIEBwYXJhbSB7dmVjdG9yfSB2ZWxvY2l0eVxuICAgICAqL1xuICAgIEJvZHkuc2V0VmVsb2NpdHkgPSBmdW5jdGlvbihib2R5LCB2ZWxvY2l0eSkge1xuICAgICAgICBib2R5LnBvc2l0aW9uUHJldi54ID0gYm9keS5wb3NpdGlvbi54IC0gdmVsb2NpdHkueDtcbiAgICAgICAgYm9keS5wb3NpdGlvblByZXYueSA9IGJvZHkucG9zaXRpb24ueSAtIHZlbG9jaXR5Lnk7XG4gICAgICAgIGJvZHkudmVsb2NpdHkueCA9IHZlbG9jaXR5Lng7XG4gICAgICAgIGJvZHkudmVsb2NpdHkueSA9IHZlbG9jaXR5Lnk7XG4gICAgICAgIGJvZHkuc3BlZWQgPSBWZWN0b3IubWFnbml0dWRlKGJvZHkudmVsb2NpdHkpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBhbmd1bGFyIHZlbG9jaXR5IG9mIHRoZSBib2R5IGluc3RhbnRseS4gUG9zaXRpb24sIGFuZ2xlLCBmb3JjZSBldGMuIGFyZSB1bmNoYW5nZWQuIFNlZSBhbHNvIGBCb2R5LmFwcGx5Rm9yY2VgLlxuICAgICAqIEBtZXRob2Qgc2V0QW5ndWxhclZlbG9jaXR5XG4gICAgICogQHBhcmFtIHtib2R5fSBib2R5XG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHZlbG9jaXR5XG4gICAgICovXG4gICAgQm9keS5zZXRBbmd1bGFyVmVsb2NpdHkgPSBmdW5jdGlvbihib2R5LCB2ZWxvY2l0eSkge1xuICAgICAgICBib2R5LmFuZ2xlUHJldiA9IGJvZHkuYW5nbGUgLSB2ZWxvY2l0eTtcbiAgICAgICAgYm9keS5hbmd1bGFyVmVsb2NpdHkgPSB2ZWxvY2l0eTtcbiAgICAgICAgYm9keS5hbmd1bGFyU3BlZWQgPSBNYXRoLmFicyhib2R5LmFuZ3VsYXJWZWxvY2l0eSk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIE1vdmVzIGEgYm9keSBieSBhIGdpdmVuIHZlY3RvciByZWxhdGl2ZSB0byBpdHMgY3VycmVudCBwb3NpdGlvbiwgd2l0aG91dCBpbXBhcnRpbmcgYW55IHZlbG9jaXR5LlxuICAgICAqIEBtZXRob2QgdHJhbnNsYXRlXG4gICAgICogQHBhcmFtIHtib2R5fSBib2R5XG4gICAgICogQHBhcmFtIHt2ZWN0b3J9IHRyYW5zbGF0aW9uXG4gICAgICovXG4gICAgQm9keS50cmFuc2xhdGUgPSBmdW5jdGlvbihib2R5LCB0cmFuc2xhdGlvbikge1xuICAgICAgICBCb2R5LnNldFBvc2l0aW9uKGJvZHksIFZlY3Rvci5hZGQoYm9keS5wb3NpdGlvbiwgdHJhbnNsYXRpb24pKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogUm90YXRlcyBhIGJvZHkgYnkgYSBnaXZlbiBhbmdsZSByZWxhdGl2ZSB0byBpdHMgY3VycmVudCBhbmdsZSwgd2l0aG91dCBpbXBhcnRpbmcgYW55IGFuZ3VsYXIgdmVsb2NpdHkuXG4gICAgICogQG1ldGhvZCByb3RhdGVcbiAgICAgKiBAcGFyYW0ge2JvZHl9IGJvZHlcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcm90YXRpb25cbiAgICAgKiBAcGFyYW0ge3ZlY3Rvcn0gW3BvaW50XVxuICAgICAqL1xuICAgIEJvZHkucm90YXRlID0gZnVuY3Rpb24oYm9keSwgcm90YXRpb24sIHBvaW50KSB7XG4gICAgICAgIGlmICghcG9pbnQpIHtcbiAgICAgICAgICAgIEJvZHkuc2V0QW5nbGUoYm9keSwgYm9keS5hbmdsZSArIHJvdGF0aW9uKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhciBjb3MgPSBNYXRoLmNvcyhyb3RhdGlvbiksXG4gICAgICAgICAgICAgICAgc2luID0gTWF0aC5zaW4ocm90YXRpb24pLFxuICAgICAgICAgICAgICAgIGR4ID0gYm9keS5wb3NpdGlvbi54IC0gcG9pbnQueCxcbiAgICAgICAgICAgICAgICBkeSA9IGJvZHkucG9zaXRpb24ueSAtIHBvaW50Lnk7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICBCb2R5LnNldFBvc2l0aW9uKGJvZHksIHtcbiAgICAgICAgICAgICAgICB4OiBwb2ludC54ICsgKGR4ICogY29zIC0gZHkgKiBzaW4pLFxuICAgICAgICAgICAgICAgIHk6IHBvaW50LnkgKyAoZHggKiBzaW4gKyBkeSAqIGNvcylcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBCb2R5LnNldEFuZ2xlKGJvZHksIGJvZHkuYW5nbGUgKyByb3RhdGlvbik7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogU2NhbGVzIHRoZSBib2R5LCBpbmNsdWRpbmcgdXBkYXRpbmcgcGh5c2ljYWwgcHJvcGVydGllcyAobWFzcywgYXJlYSwgYXhlcywgaW5lcnRpYSksIGZyb20gYSB3b3JsZC1zcGFjZSBwb2ludCAoZGVmYXVsdCBpcyBib2R5IGNlbnRyZSkuXG4gICAgICogQG1ldGhvZCBzY2FsZVxuICAgICAqIEBwYXJhbSB7Ym9keX0gYm9keVxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBzY2FsZVhcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gc2NhbGVZXG4gICAgICogQHBhcmFtIHt2ZWN0b3J9IFtwb2ludF1cbiAgICAgKi9cbiAgICBCb2R5LnNjYWxlID0gZnVuY3Rpb24oYm9keSwgc2NhbGVYLCBzY2FsZVksIHBvaW50KSB7XG4gICAgICAgIHZhciB0b3RhbEFyZWEgPSAwLFxuICAgICAgICAgICAgdG90YWxJbmVydGlhID0gMDtcblxuICAgICAgICBwb2ludCA9IHBvaW50IHx8IGJvZHkucG9zaXRpb247XG5cbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBib2R5LnBhcnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgcGFydCA9IGJvZHkucGFydHNbaV07XG5cbiAgICAgICAgICAgIC8vIHNjYWxlIHZlcnRpY2VzXG4gICAgICAgICAgICBWZXJ0aWNlcy5zY2FsZShwYXJ0LnZlcnRpY2VzLCBzY2FsZVgsIHNjYWxlWSwgcG9pbnQpO1xuXG4gICAgICAgICAgICAvLyB1cGRhdGUgcHJvcGVydGllc1xuICAgICAgICAgICAgcGFydC5heGVzID0gQXhlcy5mcm9tVmVydGljZXMocGFydC52ZXJ0aWNlcyk7XG4gICAgICAgICAgICBwYXJ0LmFyZWEgPSBWZXJ0aWNlcy5hcmVhKHBhcnQudmVydGljZXMpO1xuICAgICAgICAgICAgQm9keS5zZXRNYXNzKHBhcnQsIGJvZHkuZGVuc2l0eSAqIHBhcnQuYXJlYSk7XG5cbiAgICAgICAgICAgIC8vIHVwZGF0ZSBpbmVydGlhIChyZXF1aXJlcyB2ZXJ0aWNlcyB0byBiZSBhdCBvcmlnaW4pXG4gICAgICAgICAgICBWZXJ0aWNlcy50cmFuc2xhdGUocGFydC52ZXJ0aWNlcywgeyB4OiAtcGFydC5wb3NpdGlvbi54LCB5OiAtcGFydC5wb3NpdGlvbi55IH0pO1xuICAgICAgICAgICAgQm9keS5zZXRJbmVydGlhKHBhcnQsIEJvZHkuX2luZXJ0aWFTY2FsZSAqIFZlcnRpY2VzLmluZXJ0aWEocGFydC52ZXJ0aWNlcywgcGFydC5tYXNzKSk7XG4gICAgICAgICAgICBWZXJ0aWNlcy50cmFuc2xhdGUocGFydC52ZXJ0aWNlcywgeyB4OiBwYXJ0LnBvc2l0aW9uLngsIHk6IHBhcnQucG9zaXRpb24ueSB9KTtcblxuICAgICAgICAgICAgaWYgKGkgPiAwKSB7XG4gICAgICAgICAgICAgICAgdG90YWxBcmVhICs9IHBhcnQuYXJlYTtcbiAgICAgICAgICAgICAgICB0b3RhbEluZXJ0aWEgKz0gcGFydC5pbmVydGlhO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBzY2FsZSBwb3NpdGlvblxuICAgICAgICAgICAgcGFydC5wb3NpdGlvbi54ID0gcG9pbnQueCArIChwYXJ0LnBvc2l0aW9uLnggLSBwb2ludC54KSAqIHNjYWxlWDtcbiAgICAgICAgICAgIHBhcnQucG9zaXRpb24ueSA9IHBvaW50LnkgKyAocGFydC5wb3NpdGlvbi55IC0gcG9pbnQueSkgKiBzY2FsZVk7XG5cbiAgICAgICAgICAgIC8vIHVwZGF0ZSBib3VuZHNcbiAgICAgICAgICAgIEJvdW5kcy51cGRhdGUocGFydC5ib3VuZHMsIHBhcnQudmVydGljZXMsIGJvZHkudmVsb2NpdHkpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gaGFuZGxlIHBhcmVudCBib2R5XG4gICAgICAgIGlmIChib2R5LnBhcnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgIGJvZHkuYXJlYSA9IHRvdGFsQXJlYTtcblxuICAgICAgICAgICAgaWYgKCFib2R5LmlzU3RhdGljKSB7XG4gICAgICAgICAgICAgICAgQm9keS5zZXRNYXNzKGJvZHksIGJvZHkuZGVuc2l0eSAqIHRvdGFsQXJlYSk7XG4gICAgICAgICAgICAgICAgQm9keS5zZXRJbmVydGlhKGJvZHksIHRvdGFsSW5lcnRpYSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBoYW5kbGUgY2lyY2xlc1xuICAgICAgICBpZiAoYm9keS5jaXJjbGVSYWRpdXMpIHsgXG4gICAgICAgICAgICBpZiAoc2NhbGVYID09PSBzY2FsZVkpIHtcbiAgICAgICAgICAgICAgICBib2R5LmNpcmNsZVJhZGl1cyAqPSBzY2FsZVg7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIGJvZHkgaXMgbm8gbG9uZ2VyIGEgY2lyY2xlXG4gICAgICAgICAgICAgICAgYm9keS5jaXJjbGVSYWRpdXMgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFBlcmZvcm1zIGEgc2ltdWxhdGlvbiBzdGVwIGZvciB0aGUgZ2l2ZW4gYGJvZHlgLCBpbmNsdWRpbmcgdXBkYXRpbmcgcG9zaXRpb24gYW5kIGFuZ2xlIHVzaW5nIFZlcmxldCBpbnRlZ3JhdGlvbi5cbiAgICAgKiBAbWV0aG9kIHVwZGF0ZVxuICAgICAqIEBwYXJhbSB7Ym9keX0gYm9keVxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBkZWx0YVRpbWVcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gdGltZVNjYWxlXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGNvcnJlY3Rpb25cbiAgICAgKi9cbiAgICBCb2R5LnVwZGF0ZSA9IGZ1bmN0aW9uKGJvZHksIGRlbHRhVGltZSwgdGltZVNjYWxlLCBjb3JyZWN0aW9uKSB7XG4gICAgICAgIHZhciBkZWx0YVRpbWVTcXVhcmVkID0gTWF0aC5wb3coZGVsdGFUaW1lICogdGltZVNjYWxlICogYm9keS50aW1lU2NhbGUsIDIpO1xuXG4gICAgICAgIC8vIGZyb20gdGhlIHByZXZpb3VzIHN0ZXBcbiAgICAgICAgdmFyIGZyaWN0aW9uQWlyID0gMSAtIGJvZHkuZnJpY3Rpb25BaXIgKiB0aW1lU2NhbGUgKiBib2R5LnRpbWVTY2FsZSxcbiAgICAgICAgICAgIHZlbG9jaXR5UHJldlggPSBib2R5LnBvc2l0aW9uLnggLSBib2R5LnBvc2l0aW9uUHJldi54LFxuICAgICAgICAgICAgdmVsb2NpdHlQcmV2WSA9IGJvZHkucG9zaXRpb24ueSAtIGJvZHkucG9zaXRpb25QcmV2Lnk7XG5cbiAgICAgICAgLy8gdXBkYXRlIHZlbG9jaXR5IHdpdGggVmVybGV0IGludGVncmF0aW9uXG4gICAgICAgIGJvZHkudmVsb2NpdHkueCA9ICh2ZWxvY2l0eVByZXZYICogZnJpY3Rpb25BaXIgKiBjb3JyZWN0aW9uKSArIChib2R5LmZvcmNlLnggLyBib2R5Lm1hc3MpICogZGVsdGFUaW1lU3F1YXJlZDtcbiAgICAgICAgYm9keS52ZWxvY2l0eS55ID0gKHZlbG9jaXR5UHJldlkgKiBmcmljdGlvbkFpciAqIGNvcnJlY3Rpb24pICsgKGJvZHkuZm9yY2UueSAvIGJvZHkubWFzcykgKiBkZWx0YVRpbWVTcXVhcmVkO1xuXG4gICAgICAgIGJvZHkucG9zaXRpb25QcmV2LnggPSBib2R5LnBvc2l0aW9uLng7XG4gICAgICAgIGJvZHkucG9zaXRpb25QcmV2LnkgPSBib2R5LnBvc2l0aW9uLnk7XG4gICAgICAgIGJvZHkucG9zaXRpb24ueCArPSBib2R5LnZlbG9jaXR5Lng7XG4gICAgICAgIGJvZHkucG9zaXRpb24ueSArPSBib2R5LnZlbG9jaXR5Lnk7XG5cbiAgICAgICAgLy8gdXBkYXRlIGFuZ3VsYXIgdmVsb2NpdHkgd2l0aCBWZXJsZXQgaW50ZWdyYXRpb25cbiAgICAgICAgYm9keS5hbmd1bGFyVmVsb2NpdHkgPSAoKGJvZHkuYW5nbGUgLSBib2R5LmFuZ2xlUHJldikgKiBmcmljdGlvbkFpciAqIGNvcnJlY3Rpb24pICsgKGJvZHkudG9ycXVlIC8gYm9keS5pbmVydGlhKSAqIGRlbHRhVGltZVNxdWFyZWQ7XG4gICAgICAgIGJvZHkuYW5nbGVQcmV2ID0gYm9keS5hbmdsZTtcbiAgICAgICAgYm9keS5hbmdsZSArPSBib2R5LmFuZ3VsYXJWZWxvY2l0eTtcblxuICAgICAgICAvLyB0cmFjayBzcGVlZCBhbmQgYWNjZWxlcmF0aW9uXG4gICAgICAgIGJvZHkuc3BlZWQgPSBWZWN0b3IubWFnbml0dWRlKGJvZHkudmVsb2NpdHkpO1xuICAgICAgICBib2R5LmFuZ3VsYXJTcGVlZCA9IE1hdGguYWJzKGJvZHkuYW5ndWxhclZlbG9jaXR5KTtcblxuICAgICAgICAvLyB0cmFuc2Zvcm0gdGhlIGJvZHkgZ2VvbWV0cnlcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBib2R5LnBhcnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgcGFydCA9IGJvZHkucGFydHNbaV07XG5cbiAgICAgICAgICAgIFZlcnRpY2VzLnRyYW5zbGF0ZShwYXJ0LnZlcnRpY2VzLCBib2R5LnZlbG9jaXR5KTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgaWYgKGkgPiAwKSB7XG4gICAgICAgICAgICAgICAgcGFydC5wb3NpdGlvbi54ICs9IGJvZHkudmVsb2NpdHkueDtcbiAgICAgICAgICAgICAgICBwYXJ0LnBvc2l0aW9uLnkgKz0gYm9keS52ZWxvY2l0eS55O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoYm9keS5hbmd1bGFyVmVsb2NpdHkgIT09IDApIHtcbiAgICAgICAgICAgICAgICBWZXJ0aWNlcy5yb3RhdGUocGFydC52ZXJ0aWNlcywgYm9keS5hbmd1bGFyVmVsb2NpdHksIGJvZHkucG9zaXRpb24pO1xuICAgICAgICAgICAgICAgIEF4ZXMucm90YXRlKHBhcnQuYXhlcywgYm9keS5hbmd1bGFyVmVsb2NpdHkpO1xuICAgICAgICAgICAgICAgIGlmIChpID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBWZWN0b3Iucm90YXRlQWJvdXQocGFydC5wb3NpdGlvbiwgYm9keS5hbmd1bGFyVmVsb2NpdHksIGJvZHkucG9zaXRpb24sIHBhcnQucG9zaXRpb24pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgQm91bmRzLnVwZGF0ZShwYXJ0LmJvdW5kcywgcGFydC52ZXJ0aWNlcywgYm9keS52ZWxvY2l0eSk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQXBwbGllcyBhIGZvcmNlIHRvIGEgYm9keSBmcm9tIGEgZ2l2ZW4gd29ybGQtc3BhY2UgcG9zaXRpb24sIGluY2x1ZGluZyByZXN1bHRpbmcgdG9ycXVlLlxuICAgICAqIEBtZXRob2QgYXBwbHlGb3JjZVxuICAgICAqIEBwYXJhbSB7Ym9keX0gYm9keVxuICAgICAqIEBwYXJhbSB7dmVjdG9yfSBwb3NpdGlvblxuICAgICAqIEBwYXJhbSB7dmVjdG9yfSBmb3JjZVxuICAgICAqL1xuICAgIEJvZHkuYXBwbHlGb3JjZSA9IGZ1bmN0aW9uKGJvZHksIHBvc2l0aW9uLCBmb3JjZSkge1xuICAgICAgICBib2R5LmZvcmNlLnggKz0gZm9yY2UueDtcbiAgICAgICAgYm9keS5mb3JjZS55ICs9IGZvcmNlLnk7XG4gICAgICAgIHZhciBvZmZzZXQgPSB7IHg6IHBvc2l0aW9uLnggLSBib2R5LnBvc2l0aW9uLngsIHk6IHBvc2l0aW9uLnkgLSBib2R5LnBvc2l0aW9uLnkgfTtcbiAgICAgICAgYm9keS50b3JxdWUgKz0gb2Zmc2V0LnggKiBmb3JjZS55IC0gb2Zmc2V0LnkgKiBmb3JjZS54O1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBzdW1zIG9mIHRoZSBwcm9wZXJ0aWVzIG9mIGFsbCBjb21wb3VuZCBwYXJ0cyBvZiB0aGUgcGFyZW50IGJvZHkuXG4gICAgICogQG1ldGhvZCBfdG90YWxQcm9wZXJ0aWVzXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge2JvZHl9IGJvZHlcbiAgICAgKiBAcmV0dXJuIHt9XG4gICAgICovXG4gICAgQm9keS5fdG90YWxQcm9wZXJ0aWVzID0gZnVuY3Rpb24oYm9keSkge1xuICAgICAgICAvLyBmcm9tIGVxdWF0aW9ucyBhdDpcbiAgICAgICAgLy8gaHR0cHM6Ly9lY291cnNlcy5vdS5lZHUvY2dpLWJpbi9lYm9vay5jZ2k/ZG9jPSZ0b3BpYz1zdCZjaGFwX3NlYz0wNy4yJnBhZ2U9dGhlb3J5XG4gICAgICAgIC8vIGh0dHA6Ly9vdXRwdXQudG8vc2lkZXdheS9kZWZhdWx0LmFzcD9xbm89MTIxMTAwMDg3XG5cbiAgICAgICAgdmFyIHByb3BlcnRpZXMgPSB7XG4gICAgICAgICAgICBtYXNzOiAwLFxuICAgICAgICAgICAgYXJlYTogMCxcbiAgICAgICAgICAgIGluZXJ0aWE6IDAsXG4gICAgICAgICAgICBjZW50cmU6IHsgeDogMCwgeTogMCB9XG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gc3VtIHRoZSBwcm9wZXJ0aWVzIG9mIGFsbCBjb21wb3VuZCBwYXJ0cyBvZiB0aGUgcGFyZW50IGJvZHlcbiAgICAgICAgZm9yICh2YXIgaSA9IGJvZHkucGFydHMubGVuZ3RoID09PSAxID8gMCA6IDE7IGkgPCBib2R5LnBhcnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgcGFydCA9IGJvZHkucGFydHNbaV0sXG4gICAgICAgICAgICAgICAgbWFzcyA9IHBhcnQubWFzcyAhPT0gSW5maW5pdHkgPyBwYXJ0Lm1hc3MgOiAxO1xuXG4gICAgICAgICAgICBwcm9wZXJ0aWVzLm1hc3MgKz0gbWFzcztcbiAgICAgICAgICAgIHByb3BlcnRpZXMuYXJlYSArPSBwYXJ0LmFyZWE7XG4gICAgICAgICAgICBwcm9wZXJ0aWVzLmluZXJ0aWEgKz0gcGFydC5pbmVydGlhO1xuICAgICAgICAgICAgcHJvcGVydGllcy5jZW50cmUgPSBWZWN0b3IuYWRkKHByb3BlcnRpZXMuY2VudHJlLCBWZWN0b3IubXVsdChwYXJ0LnBvc2l0aW9uLCBtYXNzKSk7XG4gICAgICAgIH1cblxuICAgICAgICBwcm9wZXJ0aWVzLmNlbnRyZSA9IFZlY3Rvci5kaXYocHJvcGVydGllcy5jZW50cmUsIHByb3BlcnRpZXMubWFzcyk7XG5cbiAgICAgICAgcmV0dXJuIHByb3BlcnRpZXM7XG4gICAgfTtcblxuICAgIC8qXG4gICAgKlxuICAgICogIEV2ZW50cyBEb2N1bWVudGF0aW9uXG4gICAgKlxuICAgICovXG5cbiAgICAvKipcbiAgICAqIEZpcmVkIHdoZW4gYSBib2R5IHN0YXJ0cyBzbGVlcGluZyAod2hlcmUgYHRoaXNgIGlzIHRoZSBib2R5KS5cbiAgICAqXG4gICAgKiBAZXZlbnQgc2xlZXBTdGFydFxuICAgICogQHRoaXMge2JvZHl9IFRoZSBib2R5IHRoYXQgaGFzIHN0YXJ0ZWQgc2xlZXBpbmdcbiAgICAqIEBwYXJhbSB7fSBldmVudCBBbiBldmVudCBvYmplY3RcbiAgICAqIEBwYXJhbSB7fSBldmVudC5zb3VyY2UgVGhlIHNvdXJjZSBvYmplY3Qgb2YgdGhlIGV2ZW50XG4gICAgKiBAcGFyYW0ge30gZXZlbnQubmFtZSBUaGUgbmFtZSBvZiB0aGUgZXZlbnRcbiAgICAqL1xuXG4gICAgLyoqXG4gICAgKiBGaXJlZCB3aGVuIGEgYm9keSBlbmRzIHNsZWVwaW5nICh3aGVyZSBgdGhpc2AgaXMgdGhlIGJvZHkpLlxuICAgICpcbiAgICAqIEBldmVudCBzbGVlcEVuZFxuICAgICogQHRoaXMge2JvZHl9IFRoZSBib2R5IHRoYXQgaGFzIGVuZGVkIHNsZWVwaW5nXG4gICAgKiBAcGFyYW0ge30gZXZlbnQgQW4gZXZlbnQgb2JqZWN0XG4gICAgKiBAcGFyYW0ge30gZXZlbnQuc291cmNlIFRoZSBzb3VyY2Ugb2JqZWN0IG9mIHRoZSBldmVudFxuICAgICogQHBhcmFtIHt9IGV2ZW50Lm5hbWUgVGhlIG5hbWUgb2YgdGhlIGV2ZW50XG4gICAgKi9cblxuICAgIC8qXG4gICAgKlxuICAgICogIFByb3BlcnRpZXMgRG9jdW1lbnRhdGlvblxuICAgICpcbiAgICAqL1xuXG4gICAgLyoqXG4gICAgICogQW4gaW50ZWdlciBgTnVtYmVyYCB1bmlxdWVseSBpZGVudGlmeWluZyBudW1iZXIgZ2VuZXJhdGVkIGluIGBCb2R5LmNyZWF0ZWAgYnkgYENvbW1vbi5uZXh0SWRgLlxuICAgICAqXG4gICAgICogQHByb3BlcnR5IGlkXG4gICAgICogQHR5cGUgbnVtYmVyXG4gICAgICovXG5cbiAgICAvKipcbiAgICAgKiBBIGBTdHJpbmdgIGRlbm90aW5nIHRoZSB0eXBlIG9mIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBwcm9wZXJ0eSB0eXBlXG4gICAgICogQHR5cGUgc3RyaW5nXG4gICAgICogQGRlZmF1bHQgXCJib2R5XCJcbiAgICAgKiBAcmVhZE9ubHlcbiAgICAgKi9cblxuICAgIC8qKlxuICAgICAqIEFuIGFyYml0cmFyeSBgU3RyaW5nYCBuYW1lIHRvIGhlbHAgdGhlIHVzZXIgaWRlbnRpZnkgYW5kIG1hbmFnZSBib2RpZXMuXG4gICAgICpcbiAgICAgKiBAcHJvcGVydHkgbGFiZWxcbiAgICAgKiBAdHlwZSBzdHJpbmdcbiAgICAgKiBAZGVmYXVsdCBcIkJvZHlcIlxuICAgICAqL1xuXG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgYm9kaWVzIHRoYXQgbWFrZSB1cCB0aGlzIGJvZHkuIFxuICAgICAqIFRoZSBmaXJzdCBib2R5IGluIHRoZSBhcnJheSBtdXN0IGFsd2F5cyBiZSBhIHNlbGYgcmVmZXJlbmNlIHRvIHRoZSBjdXJyZW50IGJvZHkgaW5zdGFuY2UuXG4gICAgICogQWxsIGJvZGllcyBpbiB0aGUgYHBhcnRzYCBhcnJheSB0b2dldGhlciBmb3JtIGEgc2luZ2xlIHJpZ2lkIGNvbXBvdW5kIGJvZHkuXG4gICAgICogUGFydHMgYXJlIGFsbG93ZWQgdG8gb3ZlcmxhcCwgaGF2ZSBnYXBzIG9yIGhvbGVzIG9yIGV2ZW4gZm9ybSBjb25jYXZlIGJvZGllcy5cbiAgICAgKiBQYXJ0cyB0aGVtc2VsdmVzIHNob3VsZCBuZXZlciBiZSBhZGRlZCB0byBhIGBXb3JsZGAsIG9ubHkgdGhlIHBhcmVudCBib2R5IHNob3VsZCBiZS5cbiAgICAgKiBVc2UgYEJvZHkuc2V0UGFydHNgIHdoZW4gc2V0dGluZyBwYXJ0cyB0byBlbnN1cmUgY29ycmVjdCB1cGRhdGVzIG9mIGFsbCBwcm9wZXJ0aWVzLlxuICAgICAqXG4gICAgICogQHByb3BlcnR5IHBhcnRzXG4gICAgICogQHR5cGUgYm9keVtdXG4gICAgICovXG5cbiAgICAvKipcbiAgICAgKiBBbiBvYmplY3QgcmVzZXJ2ZWQgZm9yIHN0b3JpbmcgcGx1Z2luLXNwZWNpZmljIHByb3BlcnRpZXMuXG4gICAgICpcbiAgICAgKiBAcHJvcGVydHkgcGx1Z2luXG4gICAgICogQHR5cGUge31cbiAgICAgKi9cblxuICAgIC8qKlxuICAgICAqIEEgc2VsZiByZWZlcmVuY2UgaWYgdGhlIGJvZHkgaXMgX25vdF8gYSBwYXJ0IG9mIGFub3RoZXIgYm9keS5cbiAgICAgKiBPdGhlcndpc2UgdGhpcyBpcyBhIHJlZmVyZW5jZSB0byB0aGUgYm9keSB0aGF0IHRoaXMgaXMgYSBwYXJ0IG9mLlxuICAgICAqIFNlZSBgYm9keS5wYXJ0c2AuXG4gICAgICpcbiAgICAgKiBAcHJvcGVydHkgcGFyZW50XG4gICAgICogQHR5cGUgYm9keVxuICAgICAqL1xuXG4gICAgLyoqXG4gICAgICogQSBgTnVtYmVyYCBzcGVjaWZ5aW5nIHRoZSBhbmdsZSBvZiB0aGUgYm9keSwgaW4gcmFkaWFucy5cbiAgICAgKlxuICAgICAqIEBwcm9wZXJ0eSBhbmdsZVxuICAgICAqIEB0eXBlIG51bWJlclxuICAgICAqIEBkZWZhdWx0IDBcbiAgICAgKi9cblxuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIGBWZWN0b3JgIG9iamVjdHMgdGhhdCBzcGVjaWZ5IHRoZSBjb252ZXggaHVsbCBvZiB0aGUgcmlnaWQgYm9keS5cbiAgICAgKiBUaGVzZSBzaG91bGQgYmUgcHJvdmlkZWQgYWJvdXQgdGhlIG9yaWdpbiBgKDAsIDApYC4gRS5nLlxuICAgICAqXG4gICAgICogICAgIFt7IHg6IDAsIHk6IDAgfSwgeyB4OiAyNSwgeTogNTAgfSwgeyB4OiA1MCwgeTogMCB9XVxuICAgICAqXG4gICAgICogV2hlbiBwYXNzZWQgdmlhIGBCb2R5LmNyZWF0ZWAsIHRoZSB2ZXJ0aWNlcyBhcmUgdHJhbnNsYXRlZCByZWxhdGl2ZSB0byBgYm9keS5wb3NpdGlvbmAgKGkuZS4gd29ybGQtc3BhY2UsIGFuZCBjb25zdGFudGx5IHVwZGF0ZWQgYnkgYEJvZHkudXBkYXRlYCBkdXJpbmcgc2ltdWxhdGlvbikuXG4gICAgICogVGhlIGBWZWN0b3JgIG9iamVjdHMgYXJlIGFsc28gYXVnbWVudGVkIHdpdGggYWRkaXRpb25hbCBwcm9wZXJ0aWVzIHJlcXVpcmVkIGZvciBlZmZpY2llbnQgY29sbGlzaW9uIGRldGVjdGlvbi4gXG4gICAgICpcbiAgICAgKiBPdGhlciBwcm9wZXJ0aWVzIHN1Y2ggYXMgYGluZXJ0aWFgIGFuZCBgYm91bmRzYCBhcmUgYXV0b21hdGljYWxseSBjYWxjdWxhdGVkIGZyb20gdGhlIHBhc3NlZCB2ZXJ0aWNlcyAodW5sZXNzIHByb3ZpZGVkIHZpYSBgb3B0aW9uc2ApLlxuICAgICAqIENvbmNhdmUgaHVsbHMgYXJlIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkLiBUaGUgbW9kdWxlIGBNYXR0ZXIuVmVydGljZXNgIGNvbnRhaW5zIHVzZWZ1bCBtZXRob2RzIGZvciB3b3JraW5nIHdpdGggdmVydGljZXMuXG4gICAgICpcbiAgICAgKiBAcHJvcGVydHkgdmVydGljZXNcbiAgICAgKiBAdHlwZSB2ZWN0b3JbXVxuICAgICAqL1xuXG4gICAgLyoqXG4gICAgICogQSBgVmVjdG9yYCB0aGF0IHNwZWNpZmllcyB0aGUgY3VycmVudCB3b3JsZC1zcGFjZSBwb3NpdGlvbiBvZiB0aGUgYm9keS5cbiAgICAgKlxuICAgICAqIEBwcm9wZXJ0eSBwb3NpdGlvblxuICAgICAqIEB0eXBlIHZlY3RvclxuICAgICAqIEBkZWZhdWx0IHsgeDogMCwgeTogMCB9XG4gICAgICovXG5cbiAgICAvKipcbiAgICAgKiBBIGBWZWN0b3JgIHRoYXQgc3BlY2lmaWVzIHRoZSBmb3JjZSB0byBhcHBseSBpbiB0aGUgY3VycmVudCBzdGVwLiBJdCBpcyB6ZXJvZWQgYWZ0ZXIgZXZlcnkgYEJvZHkudXBkYXRlYC4gU2VlIGFsc28gYEJvZHkuYXBwbHlGb3JjZWAuXG4gICAgICpcbiAgICAgKiBAcHJvcGVydHkgZm9yY2VcbiAgICAgKiBAdHlwZSB2ZWN0b3JcbiAgICAgKiBAZGVmYXVsdCB7IHg6IDAsIHk6IDAgfVxuICAgICAqL1xuXG4gICAgLyoqXG4gICAgICogQSBgTnVtYmVyYCB0aGF0IHNwZWNpZmllcyB0aGUgdG9ycXVlICh0dXJuaW5nIGZvcmNlKSB0byBhcHBseSBpbiB0aGUgY3VycmVudCBzdGVwLiBJdCBpcyB6ZXJvZWQgYWZ0ZXIgZXZlcnkgYEJvZHkudXBkYXRlYC5cbiAgICAgKlxuICAgICAqIEBwcm9wZXJ0eSB0b3JxdWVcbiAgICAgKiBAdHlwZSBudW1iZXJcbiAgICAgKiBAZGVmYXVsdCAwXG4gICAgICovXG5cbiAgICAvKipcbiAgICAgKiBBIGBOdW1iZXJgIHRoYXQgX21lYXN1cmVzXyB0aGUgY3VycmVudCBzcGVlZCBvZiB0aGUgYm9keSBhZnRlciB0aGUgbGFzdCBgQm9keS51cGRhdGVgLiBJdCBpcyByZWFkLW9ubHkgYW5kIGFsd2F5cyBwb3NpdGl2ZSAoaXQncyB0aGUgbWFnbml0dWRlIG9mIGBib2R5LnZlbG9jaXR5YCkuXG4gICAgICpcbiAgICAgKiBAcmVhZE9ubHlcbiAgICAgKiBAcHJvcGVydHkgc3BlZWRcbiAgICAgKiBAdHlwZSBudW1iZXJcbiAgICAgKiBAZGVmYXVsdCAwXG4gICAgICovXG5cbiAgICAvKipcbiAgICAgKiBBIGBOdW1iZXJgIHRoYXQgX21lYXN1cmVzXyB0aGUgY3VycmVudCBhbmd1bGFyIHNwZWVkIG9mIHRoZSBib2R5IGFmdGVyIHRoZSBsYXN0IGBCb2R5LnVwZGF0ZWAuIEl0IGlzIHJlYWQtb25seSBhbmQgYWx3YXlzIHBvc2l0aXZlIChpdCdzIHRoZSBtYWduaXR1ZGUgb2YgYGJvZHkuYW5ndWxhclZlbG9jaXR5YCkuXG4gICAgICpcbiAgICAgKiBAcmVhZE9ubHlcbiAgICAgKiBAcHJvcGVydHkgYW5ndWxhclNwZWVkXG4gICAgICogQHR5cGUgbnVtYmVyXG4gICAgICogQGRlZmF1bHQgMFxuICAgICAqL1xuXG4gICAgLyoqXG4gICAgICogQSBgVmVjdG9yYCB0aGF0IF9tZWFzdXJlc18gdGhlIGN1cnJlbnQgdmVsb2NpdHkgb2YgdGhlIGJvZHkgYWZ0ZXIgdGhlIGxhc3QgYEJvZHkudXBkYXRlYC4gSXQgaXMgcmVhZC1vbmx5LiBcbiAgICAgKiBJZiB5b3UgbmVlZCB0byBtb2RpZnkgYSBib2R5J3MgdmVsb2NpdHkgZGlyZWN0bHksIHlvdSBzaG91bGQgZWl0aGVyIGFwcGx5IGEgZm9yY2Ugb3Igc2ltcGx5IGNoYW5nZSB0aGUgYm9keSdzIGBwb3NpdGlvbmAgKGFzIHRoZSBlbmdpbmUgdXNlcyBwb3NpdGlvbi1WZXJsZXQgaW50ZWdyYXRpb24pLlxuICAgICAqXG4gICAgICogQHJlYWRPbmx5XG4gICAgICogQHByb3BlcnR5IHZlbG9jaXR5XG4gICAgICogQHR5cGUgdmVjdG9yXG4gICAgICogQGRlZmF1bHQgeyB4OiAwLCB5OiAwIH1cbiAgICAgKi9cblxuICAgIC8qKlxuICAgICAqIEEgYE51bWJlcmAgdGhhdCBfbWVhc3VyZXNfIHRoZSBjdXJyZW50IGFuZ3VsYXIgdmVsb2NpdHkgb2YgdGhlIGJvZHkgYWZ0ZXIgdGhlIGxhc3QgYEJvZHkudXBkYXRlYC4gSXQgaXMgcmVhZC1vbmx5LiBcbiAgICAgKiBJZiB5b3UgbmVlZCB0byBtb2RpZnkgYSBib2R5J3MgYW5ndWxhciB2ZWxvY2l0eSBkaXJlY3RseSwgeW91IHNob3VsZCBhcHBseSBhIHRvcnF1ZSBvciBzaW1wbHkgY2hhbmdlIHRoZSBib2R5J3MgYGFuZ2xlYCAoYXMgdGhlIGVuZ2luZSB1c2VzIHBvc2l0aW9uLVZlcmxldCBpbnRlZ3JhdGlvbikuXG4gICAgICpcbiAgICAgKiBAcmVhZE9ubHlcbiAgICAgKiBAcHJvcGVydHkgYW5ndWxhclZlbG9jaXR5XG4gICAgICogQHR5cGUgbnVtYmVyXG4gICAgICogQGRlZmF1bHQgMFxuICAgICAqL1xuXG4gICAgLyoqXG4gICAgICogQSBmbGFnIHRoYXQgaW5kaWNhdGVzIHdoZXRoZXIgYSBib2R5IGlzIGNvbnNpZGVyZWQgc3RhdGljLiBBIHN0YXRpYyBib2R5IGNhbiBuZXZlciBjaGFuZ2UgcG9zaXRpb24gb3IgYW5nbGUgYW5kIGlzIGNvbXBsZXRlbHkgZml4ZWQuXG4gICAgICogSWYgeW91IG5lZWQgdG8gc2V0IGEgYm9keSBhcyBzdGF0aWMgYWZ0ZXIgaXRzIGNyZWF0aW9uLCB5b3Ugc2hvdWxkIHVzZSBgQm9keS5zZXRTdGF0aWNgIGFzIHRoaXMgcmVxdWlyZXMgbW9yZSB0aGFuIGp1c3Qgc2V0dGluZyB0aGlzIGZsYWcuXG4gICAgICpcbiAgICAgKiBAcHJvcGVydHkgaXNTdGF0aWNcbiAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgKi9cblxuICAgIC8qKlxuICAgICAqIEEgZmxhZyB0aGF0IGluZGljYXRlcyB3aGV0aGVyIGEgYm9keSBpcyBhIHNlbnNvci4gU2Vuc29yIHRyaWdnZXJzIGNvbGxpc2lvbiBldmVudHMsIGJ1dCBkb2Vzbid0IHJlYWN0IHdpdGggY29sbGlkaW5nIGJvZHkgcGh5c2ljYWxseS5cbiAgICAgKlxuICAgICAqIEBwcm9wZXJ0eSBpc1NlbnNvclxuICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAqL1xuXG4gICAgLyoqXG4gICAgICogQSBmbGFnIHRoYXQgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGJvZHkgaXMgY29uc2lkZXJlZCBzbGVlcGluZy4gQSBzbGVlcGluZyBib2R5IGFjdHMgc2ltaWxhciB0byBhIHN0YXRpYyBib2R5LCBleGNlcHQgaXQgaXMgb25seSB0ZW1wb3JhcnkgYW5kIGNhbiBiZSBhd29rZW4uXG4gICAgICogSWYgeW91IG5lZWQgdG8gc2V0IGEgYm9keSBhcyBzbGVlcGluZywgeW91IHNob3VsZCB1c2UgYFNsZWVwaW5nLnNldGAgYXMgdGhpcyByZXF1aXJlcyBtb3JlIHRoYW4ganVzdCBzZXR0aW5nIHRoaXMgZmxhZy5cbiAgICAgKlxuICAgICAqIEBwcm9wZXJ0eSBpc1NsZWVwaW5nXG4gICAgICogQHR5cGUgYm9vbGVhblxuICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICovXG5cbiAgICAvKipcbiAgICAgKiBBIGBOdW1iZXJgIHRoYXQgX21lYXN1cmVzXyB0aGUgYW1vdW50IG9mIG1vdmVtZW50IGEgYm9keSBjdXJyZW50bHkgaGFzIChhIGNvbWJpbmF0aW9uIG9mIGBzcGVlZGAgYW5kIGBhbmd1bGFyU3BlZWRgKS4gSXQgaXMgcmVhZC1vbmx5IGFuZCBhbHdheXMgcG9zaXRpdmUuXG4gICAgICogSXQgaXMgdXNlZCBhbmQgdXBkYXRlZCBieSB0aGUgYE1hdHRlci5TbGVlcGluZ2AgbW9kdWxlIGR1cmluZyBzaW11bGF0aW9uIHRvIGRlY2lkZSBpZiBhIGJvZHkgaGFzIGNvbWUgdG8gcmVzdC5cbiAgICAgKlxuICAgICAqIEByZWFkT25seVxuICAgICAqIEBwcm9wZXJ0eSBtb3Rpb25cbiAgICAgKiBAdHlwZSBudW1iZXJcbiAgICAgKiBAZGVmYXVsdCAwXG4gICAgICovXG5cbiAgICAvKipcbiAgICAgKiBBIGBOdW1iZXJgIHRoYXQgZGVmaW5lcyB0aGUgbnVtYmVyIG9mIHVwZGF0ZXMgaW4gd2hpY2ggdGhpcyBib2R5IG11c3QgaGF2ZSBuZWFyLXplcm8gdmVsb2NpdHkgYmVmb3JlIGl0IGlzIHNldCBhcyBzbGVlcGluZyBieSB0aGUgYE1hdHRlci5TbGVlcGluZ2AgbW9kdWxlIChpZiBzbGVlcGluZyBpcyBlbmFibGVkIGJ5IHRoZSBlbmdpbmUpLlxuICAgICAqXG4gICAgICogQHByb3BlcnR5IHNsZWVwVGhyZXNob2xkXG4gICAgICogQHR5cGUgbnVtYmVyXG4gICAgICogQGRlZmF1bHQgNjBcbiAgICAgKi9cblxuICAgIC8qKlxuICAgICAqIEEgYE51bWJlcmAgdGhhdCBkZWZpbmVzIHRoZSBkZW5zaXR5IG9mIHRoZSBib2R5LCB0aGF0IGlzIGl0cyBtYXNzIHBlciB1bml0IGFyZWEuXG4gICAgICogSWYgeW91IHBhc3MgdGhlIGRlbnNpdHkgdmlhIGBCb2R5LmNyZWF0ZWAgdGhlIGBtYXNzYCBwcm9wZXJ0eSBpcyBhdXRvbWF0aWNhbGx5IGNhbGN1bGF0ZWQgZm9yIHlvdSBiYXNlZCBvbiB0aGUgc2l6ZSAoYXJlYSkgb2YgdGhlIG9iamVjdC5cbiAgICAgKiBUaGlzIGlzIGdlbmVyYWxseSBwcmVmZXJhYmxlIHRvIHNpbXBseSBzZXR0aW5nIG1hc3MgYW5kIGFsbG93cyBmb3IgbW9yZSBpbnR1aXRpdmUgZGVmaW5pdGlvbiBvZiBtYXRlcmlhbHMgKGUuZy4gcm9jayBoYXMgYSBoaWdoZXIgZGVuc2l0eSB0aGFuIHdvb2QpLlxuICAgICAqXG4gICAgICogQHByb3BlcnR5IGRlbnNpdHlcbiAgICAgKiBAdHlwZSBudW1iZXJcbiAgICAgKiBAZGVmYXVsdCAwLjAwMVxuICAgICAqL1xuXG4gICAgLyoqXG4gICAgICogQSBgTnVtYmVyYCB0aGF0IGRlZmluZXMgdGhlIG1hc3Mgb2YgdGhlIGJvZHksIGFsdGhvdWdoIGl0IG1heSBiZSBtb3JlIGFwcHJvcHJpYXRlIHRvIHNwZWNpZnkgdGhlIGBkZW5zaXR5YCBwcm9wZXJ0eSBpbnN0ZWFkLlxuICAgICAqIElmIHlvdSBtb2RpZnkgdGhpcyB2YWx1ZSwgeW91IG11c3QgYWxzbyBtb2RpZnkgdGhlIGBib2R5LmludmVyc2VNYXNzYCBwcm9wZXJ0eSAoYDEgLyBtYXNzYCkuXG4gICAgICpcbiAgICAgKiBAcHJvcGVydHkgbWFzc1xuICAgICAqIEB0eXBlIG51bWJlclxuICAgICAqL1xuXG4gICAgLyoqXG4gICAgICogQSBgTnVtYmVyYCB0aGF0IGRlZmluZXMgdGhlIGludmVyc2UgbWFzcyBvZiB0aGUgYm9keSAoYDEgLyBtYXNzYCkuXG4gICAgICogSWYgeW91IG1vZGlmeSB0aGlzIHZhbHVlLCB5b3UgbXVzdCBhbHNvIG1vZGlmeSB0aGUgYGJvZHkubWFzc2AgcHJvcGVydHkuXG4gICAgICpcbiAgICAgKiBAcHJvcGVydHkgaW52ZXJzZU1hc3NcbiAgICAgKiBAdHlwZSBudW1iZXJcbiAgICAgKi9cblxuICAgIC8qKlxuICAgICAqIEEgYE51bWJlcmAgdGhhdCBkZWZpbmVzIHRoZSBtb21lbnQgb2YgaW5lcnRpYSAoaS5lLiBzZWNvbmQgbW9tZW50IG9mIGFyZWEpIG9mIHRoZSBib2R5LlxuICAgICAqIEl0IGlzIGF1dG9tYXRpY2FsbHkgY2FsY3VsYXRlZCBmcm9tIHRoZSBnaXZlbiBjb252ZXggaHVsbCAoYHZlcnRpY2VzYCBhcnJheSkgYW5kIGRlbnNpdHkgaW4gYEJvZHkuY3JlYXRlYC5cbiAgICAgKiBJZiB5b3UgbW9kaWZ5IHRoaXMgdmFsdWUsIHlvdSBtdXN0IGFsc28gbW9kaWZ5IHRoZSBgYm9keS5pbnZlcnNlSW5lcnRpYWAgcHJvcGVydHkgKGAxIC8gaW5lcnRpYWApLlxuICAgICAqXG4gICAgICogQHByb3BlcnR5IGluZXJ0aWFcbiAgICAgKiBAdHlwZSBudW1iZXJcbiAgICAgKi9cblxuICAgIC8qKlxuICAgICAqIEEgYE51bWJlcmAgdGhhdCBkZWZpbmVzIHRoZSBpbnZlcnNlIG1vbWVudCBvZiBpbmVydGlhIG9mIHRoZSBib2R5IChgMSAvIGluZXJ0aWFgKS5cbiAgICAgKiBJZiB5b3UgbW9kaWZ5IHRoaXMgdmFsdWUsIHlvdSBtdXN0IGFsc28gbW9kaWZ5IHRoZSBgYm9keS5pbmVydGlhYCBwcm9wZXJ0eS5cbiAgICAgKlxuICAgICAqIEBwcm9wZXJ0eSBpbnZlcnNlSW5lcnRpYVxuICAgICAqIEB0eXBlIG51bWJlclxuICAgICAqL1xuXG4gICAgLyoqXG4gICAgICogQSBgTnVtYmVyYCB0aGF0IGRlZmluZXMgdGhlIHJlc3RpdHV0aW9uIChlbGFzdGljaXR5KSBvZiB0aGUgYm9keS4gVGhlIHZhbHVlIGlzIGFsd2F5cyBwb3NpdGl2ZSBhbmQgaXMgaW4gdGhlIHJhbmdlIGAoMCwgMSlgLlxuICAgICAqIEEgdmFsdWUgb2YgYDBgIG1lYW5zIGNvbGxpc2lvbnMgbWF5IGJlIHBlcmZlY3RseSBpbmVsYXN0aWMgYW5kIG5vIGJvdW5jaW5nIG1heSBvY2N1ci4gXG4gICAgICogQSB2YWx1ZSBvZiBgMC44YCBtZWFucyB0aGUgYm9keSBtYXkgYm91bmNlIGJhY2sgd2l0aCBhcHByb3hpbWF0ZWx5IDgwJSBvZiBpdHMga2luZXRpYyBlbmVyZ3kuXG4gICAgICogTm90ZSB0aGF0IGNvbGxpc2lvbiByZXNwb25zZSBpcyBiYXNlZCBvbiBfcGFpcnNfIG9mIGJvZGllcywgYW5kIHRoYXQgYHJlc3RpdHV0aW9uYCB2YWx1ZXMgYXJlIF9jb21iaW5lZF8gd2l0aCB0aGUgZm9sbG93aW5nIGZvcm11bGE6XG4gICAgICpcbiAgICAgKiAgICAgTWF0aC5tYXgoYm9keUEucmVzdGl0dXRpb24sIGJvZHlCLnJlc3RpdHV0aW9uKVxuICAgICAqXG4gICAgICogQHByb3BlcnR5IHJlc3RpdHV0aW9uXG4gICAgICogQHR5cGUgbnVtYmVyXG4gICAgICogQGRlZmF1bHQgMFxuICAgICAqL1xuXG4gICAgLyoqXG4gICAgICogQSBgTnVtYmVyYCB0aGF0IGRlZmluZXMgdGhlIGZyaWN0aW9uIG9mIHRoZSBib2R5LiBUaGUgdmFsdWUgaXMgYWx3YXlzIHBvc2l0aXZlIGFuZCBpcyBpbiB0aGUgcmFuZ2UgYCgwLCAxKWAuXG4gICAgICogQSB2YWx1ZSBvZiBgMGAgbWVhbnMgdGhhdCB0aGUgYm9keSBtYXkgc2xpZGUgaW5kZWZpbml0ZWx5LlxuICAgICAqIEEgdmFsdWUgb2YgYDFgIG1lYW5zIHRoZSBib2R5IG1heSBjb21lIHRvIGEgc3RvcCBhbG1vc3QgaW5zdGFudGx5IGFmdGVyIGEgZm9yY2UgaXMgYXBwbGllZC5cbiAgICAgKlxuICAgICAqIFRoZSBlZmZlY3RzIG9mIHRoZSB2YWx1ZSBtYXkgYmUgbm9uLWxpbmVhci4gXG4gICAgICogSGlnaCB2YWx1ZXMgbWF5IGJlIHVuc3RhYmxlIGRlcGVuZGluZyBvbiB0aGUgYm9keS5cbiAgICAgKiBUaGUgZW5naW5lIHVzZXMgYSBDb3Vsb21iIGZyaWN0aW9uIG1vZGVsIGluY2x1ZGluZyBzdGF0aWMgYW5kIGtpbmV0aWMgZnJpY3Rpb24uXG4gICAgICogTm90ZSB0aGF0IGNvbGxpc2lvbiByZXNwb25zZSBpcyBiYXNlZCBvbiBfcGFpcnNfIG9mIGJvZGllcywgYW5kIHRoYXQgYGZyaWN0aW9uYCB2YWx1ZXMgYXJlIF9jb21iaW5lZF8gd2l0aCB0aGUgZm9sbG93aW5nIGZvcm11bGE6XG4gICAgICpcbiAgICAgKiAgICAgTWF0aC5taW4oYm9keUEuZnJpY3Rpb24sIGJvZHlCLmZyaWN0aW9uKVxuICAgICAqXG4gICAgICogQHByb3BlcnR5IGZyaWN0aW9uXG4gICAgICogQHR5cGUgbnVtYmVyXG4gICAgICogQGRlZmF1bHQgMC4xXG4gICAgICovXG5cbiAgICAvKipcbiAgICAgKiBBIGBOdW1iZXJgIHRoYXQgZGVmaW5lcyB0aGUgc3RhdGljIGZyaWN0aW9uIG9mIHRoZSBib2R5IChpbiB0aGUgQ291bG9tYiBmcmljdGlvbiBtb2RlbCkuIFxuICAgICAqIEEgdmFsdWUgb2YgYDBgIG1lYW5zIHRoZSBib2R5IHdpbGwgbmV2ZXIgJ3N0aWNrJyB3aGVuIGl0IGlzIG5lYXJseSBzdGF0aW9uYXJ5IGFuZCBvbmx5IGR5bmFtaWMgYGZyaWN0aW9uYCBpcyB1c2VkLlxuICAgICAqIFRoZSBoaWdoZXIgdGhlIHZhbHVlIChlLmcuIGAxMGApLCB0aGUgbW9yZSBmb3JjZSBpdCB3aWxsIHRha2UgdG8gaW5pdGlhbGx5IGdldCB0aGUgYm9keSBtb3Zpbmcgd2hlbiBuZWFybHkgc3RhdGlvbmFyeS5cbiAgICAgKiBUaGlzIHZhbHVlIGlzIG11bHRpcGxpZWQgd2l0aCB0aGUgYGZyaWN0aW9uYCBwcm9wZXJ0eSB0byBtYWtlIGl0IGVhc2llciB0byBjaGFuZ2UgYGZyaWN0aW9uYCBhbmQgbWFpbnRhaW4gYW4gYXBwcm9wcmlhdGUgYW1vdW50IG9mIHN0YXRpYyBmcmljdGlvbi5cbiAgICAgKlxuICAgICAqIEBwcm9wZXJ0eSBmcmljdGlvblN0YXRpY1xuICAgICAqIEB0eXBlIG51bWJlclxuICAgICAqIEBkZWZhdWx0IDAuNVxuICAgICAqL1xuXG4gICAgLyoqXG4gICAgICogQSBgTnVtYmVyYCB0aGF0IGRlZmluZXMgdGhlIGFpciBmcmljdGlvbiBvZiB0aGUgYm9keSAoYWlyIHJlc2lzdGFuY2UpLiBcbiAgICAgKiBBIHZhbHVlIG9mIGAwYCBtZWFucyB0aGUgYm9keSB3aWxsIG5ldmVyIHNsb3cgYXMgaXQgbW92ZXMgdGhyb3VnaCBzcGFjZS5cbiAgICAgKiBUaGUgaGlnaGVyIHRoZSB2YWx1ZSwgdGhlIGZhc3RlciBhIGJvZHkgc2xvd3Mgd2hlbiBtb3ZpbmcgdGhyb3VnaCBzcGFjZS5cbiAgICAgKiBUaGUgZWZmZWN0cyBvZiB0aGUgdmFsdWUgYXJlIG5vbi1saW5lYXIuIFxuICAgICAqXG4gICAgICogQHByb3BlcnR5IGZyaWN0aW9uQWlyXG4gICAgICogQHR5cGUgbnVtYmVyXG4gICAgICogQGRlZmF1bHQgMC4wMVxuICAgICAqL1xuXG4gICAgLyoqXG4gICAgICogQW4gYE9iamVjdGAgdGhhdCBzcGVjaWZpZXMgdGhlIGNvbGxpc2lvbiBmaWx0ZXJpbmcgcHJvcGVydGllcyBvZiB0aGlzIGJvZHkuXG4gICAgICpcbiAgICAgKiBDb2xsaXNpb25zIGJldHdlZW4gdHdvIGJvZGllcyB3aWxsIG9iZXkgdGhlIGZvbGxvd2luZyBydWxlczpcbiAgICAgKiAtIElmIHRoZSB0d28gYm9kaWVzIGhhdmUgdGhlIHNhbWUgbm9uLXplcm8gdmFsdWUgb2YgYGNvbGxpc2lvbkZpbHRlci5ncm91cGAsXG4gICAgICogICB0aGV5IHdpbGwgYWx3YXlzIGNvbGxpZGUgaWYgdGhlIHZhbHVlIGlzIHBvc2l0aXZlLCBhbmQgdGhleSB3aWxsIG5ldmVyIGNvbGxpZGVcbiAgICAgKiAgIGlmIHRoZSB2YWx1ZSBpcyBuZWdhdGl2ZS5cbiAgICAgKiAtIElmIHRoZSB0d28gYm9kaWVzIGhhdmUgZGlmZmVyZW50IHZhbHVlcyBvZiBgY29sbGlzaW9uRmlsdGVyLmdyb3VwYCBvciBpZiBvbmVcbiAgICAgKiAgIChvciBib3RoKSBvZiB0aGUgYm9kaWVzIGhhcyBhIHZhbHVlIG9mIDAsIHRoZW4gdGhlIGNhdGVnb3J5L21hc2sgcnVsZXMgYXBwbHkgYXMgZm9sbG93czpcbiAgICAgKlxuICAgICAqIEVhY2ggYm9keSBiZWxvbmdzIHRvIGEgY29sbGlzaW9uIGNhdGVnb3J5LCBnaXZlbiBieSBgY29sbGlzaW9uRmlsdGVyLmNhdGVnb3J5YC4gVGhpc1xuICAgICAqIHZhbHVlIGlzIHVzZWQgYXMgYSBiaXQgZmllbGQgYW5kIHRoZSBjYXRlZ29yeSBzaG91bGQgaGF2ZSBvbmx5IG9uZSBiaXQgc2V0LCBtZWFuaW5nIHRoYXRcbiAgICAgKiB0aGUgdmFsdWUgb2YgdGhpcyBwcm9wZXJ0eSBpcyBhIHBvd2VyIG9mIHR3byBpbiB0aGUgcmFuZ2UgWzEsIDJeMzFdLiBUaHVzLCB0aGVyZSBhcmUgMzJcbiAgICAgKiBkaWZmZXJlbnQgY29sbGlzaW9uIGNhdGVnb3JpZXMgYXZhaWxhYmxlLlxuICAgICAqXG4gICAgICogRWFjaCBib2R5IGFsc28gZGVmaW5lcyBhIGNvbGxpc2lvbiBiaXRtYXNrLCBnaXZlbiBieSBgY29sbGlzaW9uRmlsdGVyLm1hc2tgIHdoaWNoIHNwZWNpZmllc1xuICAgICAqIHRoZSBjYXRlZ29yaWVzIGl0IGNvbGxpZGVzIHdpdGggKHRoZSB2YWx1ZSBpcyB0aGUgYml0d2lzZSBBTkQgdmFsdWUgb2YgYWxsIHRoZXNlIGNhdGVnb3JpZXMpLlxuICAgICAqXG4gICAgICogVXNpbmcgdGhlIGNhdGVnb3J5L21hc2sgcnVsZXMsIHR3byBib2RpZXMgYEFgIGFuZCBgQmAgY29sbGlkZSBpZiBlYWNoIGluY2x1ZGVzIHRoZSBvdGhlcidzXG4gICAgICogY2F0ZWdvcnkgaW4gaXRzIG1hc2ssIGkuZS4gYChjYXRlZ29yeUEgJiBtYXNrQikgIT09IDBgIGFuZCBgKGNhdGVnb3J5QiAmIG1hc2tBKSAhPT0gMGBcbiAgICAgKiBhcmUgYm90aCB0cnVlLlxuICAgICAqXG4gICAgICogQHByb3BlcnR5IGNvbGxpc2lvbkZpbHRlclxuICAgICAqIEB0eXBlIG9iamVjdFxuICAgICAqL1xuXG4gICAgLyoqXG4gICAgICogQW4gSW50ZWdlciBgTnVtYmVyYCwgdGhhdCBzcGVjaWZpZXMgdGhlIGNvbGxpc2lvbiBncm91cCB0aGlzIGJvZHkgYmVsb25ncyB0by5cbiAgICAgKiBTZWUgYGJvZHkuY29sbGlzaW9uRmlsdGVyYCBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbiAgICAgKlxuICAgICAqIEBwcm9wZXJ0eSBjb2xsaXNpb25GaWx0ZXIuZ3JvdXBcbiAgICAgKiBAdHlwZSBvYmplY3RcbiAgICAgKiBAZGVmYXVsdCAwXG4gICAgICovXG5cbiAgICAvKipcbiAgICAgKiBBIGJpdCBmaWVsZCB0aGF0IHNwZWNpZmllcyB0aGUgY29sbGlzaW9uIGNhdGVnb3J5IHRoaXMgYm9keSBiZWxvbmdzIHRvLlxuICAgICAqIFRoZSBjYXRlZ29yeSB2YWx1ZSBzaG91bGQgaGF2ZSBvbmx5IG9uZSBiaXQgc2V0LCBmb3IgZXhhbXBsZSBgMHgwMDAxYC5cbiAgICAgKiBUaGlzIG1lYW5zIHRoZXJlIGFyZSB1cCB0byAzMiB1bmlxdWUgY29sbGlzaW9uIGNhdGVnb3JpZXMgYXZhaWxhYmxlLlxuICAgICAqIFNlZSBgYm9keS5jb2xsaXNpb25GaWx0ZXJgIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuICAgICAqXG4gICAgICogQHByb3BlcnR5IGNvbGxpc2lvbkZpbHRlci5jYXRlZ29yeVxuICAgICAqIEB0eXBlIG9iamVjdFxuICAgICAqIEBkZWZhdWx0IDFcbiAgICAgKi9cblxuICAgIC8qKlxuICAgICAqIEEgYml0IG1hc2sgdGhhdCBzcGVjaWZpZXMgdGhlIGNvbGxpc2lvbiBjYXRlZ29yaWVzIHRoaXMgYm9keSBtYXkgY29sbGlkZSB3aXRoLlxuICAgICAqIFNlZSBgYm9keS5jb2xsaXNpb25GaWx0ZXJgIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuICAgICAqXG4gICAgICogQHByb3BlcnR5IGNvbGxpc2lvbkZpbHRlci5tYXNrXG4gICAgICogQHR5cGUgb2JqZWN0XG4gICAgICogQGRlZmF1bHQgLTFcbiAgICAgKi9cblxuICAgIC8qKlxuICAgICAqIEEgYE51bWJlcmAgdGhhdCBzcGVjaWZpZXMgYSB0b2xlcmFuY2Ugb24gaG93IGZhciBhIGJvZHkgaXMgYWxsb3dlZCB0byAnc2luaycgb3Igcm90YXRlIGludG8gb3RoZXIgYm9kaWVzLlxuICAgICAqIEF2b2lkIGNoYW5naW5nIHRoaXMgdmFsdWUgdW5sZXNzIHlvdSB1bmRlcnN0YW5kIHRoZSBwdXJwb3NlIG9mIGBzbG9wYCBpbiBwaHlzaWNzIGVuZ2luZXMuXG4gICAgICogVGhlIGRlZmF1bHQgc2hvdWxkIGdlbmVyYWxseSBzdWZmaWNlLCBhbHRob3VnaCB2ZXJ5IGxhcmdlIGJvZGllcyBtYXkgcmVxdWlyZSBsYXJnZXIgdmFsdWVzIGZvciBzdGFibGUgc3RhY2tpbmcuXG4gICAgICpcbiAgICAgKiBAcHJvcGVydHkgc2xvcFxuICAgICAqIEB0eXBlIG51bWJlclxuICAgICAqIEBkZWZhdWx0IDAuMDVcbiAgICAgKi9cblxuICAgIC8qKlxuICAgICAqIEEgYE51bWJlcmAgdGhhdCBhbGxvd3MgcGVyLWJvZHkgdGltZSBzY2FsaW5nLCBlLmcuIGEgZm9yY2UtZmllbGQgd2hlcmUgYm9kaWVzIGluc2lkZSBhcmUgaW4gc2xvdy1tb3Rpb24sIHdoaWxlIG90aGVycyBhcmUgYXQgZnVsbCBzcGVlZC5cbiAgICAgKlxuICAgICAqIEBwcm9wZXJ0eSB0aW1lU2NhbGVcbiAgICAgKiBAdHlwZSBudW1iZXJcbiAgICAgKiBAZGVmYXVsdCAxXG4gICAgICovXG5cbiAgICAvKipcbiAgICAgKiBBbiBgT2JqZWN0YCB0aGF0IGRlZmluZXMgdGhlIHJlbmRlcmluZyBwcm9wZXJ0aWVzIHRvIGJlIGNvbnN1bWVkIGJ5IHRoZSBtb2R1bGUgYE1hdHRlci5SZW5kZXJgLlxuICAgICAqXG4gICAgICogQHByb3BlcnR5IHJlbmRlclxuICAgICAqIEB0eXBlIG9iamVjdFxuICAgICAqL1xuXG4gICAgLyoqXG4gICAgICogQSBmbGFnIHRoYXQgaW5kaWNhdGVzIGlmIHRoZSBib2R5IHNob3VsZCBiZSByZW5kZXJlZC5cbiAgICAgKlxuICAgICAqIEBwcm9wZXJ0eSByZW5kZXIudmlzaWJsZVxuICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgKiBAZGVmYXVsdCB0cnVlXG4gICAgICovXG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBvcGFjaXR5IHRvIHVzZSB3aGVuIHJlbmRlcmluZy5cbiAgICAgKlxuICAgICAqIEBwcm9wZXJ0eSByZW5kZXIub3BhY2l0eVxuICAgICAqIEB0eXBlIG51bWJlclxuICAgICAqIEBkZWZhdWx0IDFcbiAgICAqL1xuXG4gICAgLyoqXG4gICAgICogQW4gYE9iamVjdGAgdGhhdCBkZWZpbmVzIHRoZSBzcHJpdGUgcHJvcGVydGllcyB0byB1c2Ugd2hlbiByZW5kZXJpbmcsIGlmIGFueS5cbiAgICAgKlxuICAgICAqIEBwcm9wZXJ0eSByZW5kZXIuc3ByaXRlXG4gICAgICogQHR5cGUgb2JqZWN0XG4gICAgICovXG5cbiAgICAvKipcbiAgICAgKiBBbiBgU3RyaW5nYCB0aGF0IGRlZmluZXMgdGhlIHBhdGggdG8gdGhlIGltYWdlIHRvIHVzZSBhcyB0aGUgc3ByaXRlIHRleHR1cmUsIGlmIGFueS5cbiAgICAgKlxuICAgICAqIEBwcm9wZXJ0eSByZW5kZXIuc3ByaXRlLnRleHR1cmVcbiAgICAgKiBAdHlwZSBzdHJpbmdcbiAgICAgKi9cbiAgICAgXG4gICAgLyoqXG4gICAgICogQSBgTnVtYmVyYCB0aGF0IGRlZmluZXMgdGhlIHNjYWxpbmcgaW4gdGhlIHgtYXhpcyBmb3IgdGhlIHNwcml0ZSwgaWYgYW55LlxuICAgICAqXG4gICAgICogQHByb3BlcnR5IHJlbmRlci5zcHJpdGUueFNjYWxlXG4gICAgICogQHR5cGUgbnVtYmVyXG4gICAgICogQGRlZmF1bHQgMVxuICAgICAqL1xuXG4gICAgLyoqXG4gICAgICogQSBgTnVtYmVyYCB0aGF0IGRlZmluZXMgdGhlIHNjYWxpbmcgaW4gdGhlIHktYXhpcyBmb3IgdGhlIHNwcml0ZSwgaWYgYW55LlxuICAgICAqXG4gICAgICogQHByb3BlcnR5IHJlbmRlci5zcHJpdGUueVNjYWxlXG4gICAgICogQHR5cGUgbnVtYmVyXG4gICAgICogQGRlZmF1bHQgMVxuICAgICAqL1xuXG4gICAgLyoqXG4gICAgICAqIEEgYE51bWJlcmAgdGhhdCBkZWZpbmVzIHRoZSBvZmZzZXQgaW4gdGhlIHgtYXhpcyBmb3IgdGhlIHNwcml0ZSAobm9ybWFsaXNlZCBieSB0ZXh0dXJlIHdpZHRoKS5cbiAgICAgICpcbiAgICAgICogQHByb3BlcnR5IHJlbmRlci5zcHJpdGUueE9mZnNldFxuICAgICAgKiBAdHlwZSBudW1iZXJcbiAgICAgICogQGRlZmF1bHQgMFxuICAgICAgKi9cblxuICAgIC8qKlxuICAgICAgKiBBIGBOdW1iZXJgIHRoYXQgZGVmaW5lcyB0aGUgb2Zmc2V0IGluIHRoZSB5LWF4aXMgZm9yIHRoZSBzcHJpdGUgKG5vcm1hbGlzZWQgYnkgdGV4dHVyZSBoZWlnaHQpLlxuICAgICAgKlxuICAgICAgKiBAcHJvcGVydHkgcmVuZGVyLnNwcml0ZS55T2Zmc2V0XG4gICAgICAqIEB0eXBlIG51bWJlclxuICAgICAgKiBAZGVmYXVsdCAwXG4gICAgICAqL1xuXG4gICAgLyoqXG4gICAgICogQSBgTnVtYmVyYCB0aGF0IGRlZmluZXMgdGhlIGxpbmUgd2lkdGggdG8gdXNlIHdoZW4gcmVuZGVyaW5nIHRoZSBib2R5IG91dGxpbmUgKGlmIGEgc3ByaXRlIGlzIG5vdCBkZWZpbmVkKS5cbiAgICAgKiBBIHZhbHVlIG9mIGAwYCBtZWFucyBubyBvdXRsaW5lIHdpbGwgYmUgcmVuZGVyZWQuXG4gICAgICpcbiAgICAgKiBAcHJvcGVydHkgcmVuZGVyLmxpbmVXaWR0aFxuICAgICAqIEB0eXBlIG51bWJlclxuICAgICAqIEBkZWZhdWx0IDBcbiAgICAgKi9cblxuICAgIC8qKlxuICAgICAqIEEgYFN0cmluZ2AgdGhhdCBkZWZpbmVzIHRoZSBmaWxsIHN0eWxlIHRvIHVzZSB3aGVuIHJlbmRlcmluZyB0aGUgYm9keSAoaWYgYSBzcHJpdGUgaXMgbm90IGRlZmluZWQpLlxuICAgICAqIEl0IGlzIHRoZSBzYW1lIGFzIHdoZW4gdXNpbmcgYSBjYW52YXMsIHNvIGl0IGFjY2VwdHMgQ1NTIHN0eWxlIHByb3BlcnR5IHZhbHVlcy5cbiAgICAgKlxuICAgICAqIEBwcm9wZXJ0eSByZW5kZXIuZmlsbFN0eWxlXG4gICAgICogQHR5cGUgc3RyaW5nXG4gICAgICogQGRlZmF1bHQgYSByYW5kb20gY29sb3VyXG4gICAgICovXG5cbiAgICAvKipcbiAgICAgKiBBIGBTdHJpbmdgIHRoYXQgZGVmaW5lcyB0aGUgc3Ryb2tlIHN0eWxlIHRvIHVzZSB3aGVuIHJlbmRlcmluZyB0aGUgYm9keSBvdXRsaW5lIChpZiBhIHNwcml0ZSBpcyBub3QgZGVmaW5lZCkuXG4gICAgICogSXQgaXMgdGhlIHNhbWUgYXMgd2hlbiB1c2luZyBhIGNhbnZhcywgc28gaXQgYWNjZXB0cyBDU1Mgc3R5bGUgcHJvcGVydHkgdmFsdWVzLlxuICAgICAqXG4gICAgICogQHByb3BlcnR5IHJlbmRlci5zdHJva2VTdHlsZVxuICAgICAqIEB0eXBlIHN0cmluZ1xuICAgICAqIEBkZWZhdWx0IGEgcmFuZG9tIGNvbG91clxuICAgICAqL1xuXG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgdW5pcXVlIGF4aXMgdmVjdG9ycyAoZWRnZSBub3JtYWxzKSB1c2VkIGZvciBjb2xsaXNpb24gZGV0ZWN0aW9uLlxuICAgICAqIFRoZXNlIGFyZSBhdXRvbWF0aWNhbGx5IGNhbGN1bGF0ZWQgZnJvbSB0aGUgZ2l2ZW4gY29udmV4IGh1bGwgKGB2ZXJ0aWNlc2AgYXJyYXkpIGluIGBCb2R5LmNyZWF0ZWAuXG4gICAgICogVGhleSBhcmUgY29uc3RhbnRseSB1cGRhdGVkIGJ5IGBCb2R5LnVwZGF0ZWAgZHVyaW5nIHRoZSBzaW11bGF0aW9uLlxuICAgICAqXG4gICAgICogQHByb3BlcnR5IGF4ZXNcbiAgICAgKiBAdHlwZSB2ZWN0b3JbXVxuICAgICAqL1xuICAgICBcbiAgICAvKipcbiAgICAgKiBBIGBOdW1iZXJgIHRoYXQgX21lYXN1cmVzXyB0aGUgYXJlYSBvZiB0aGUgYm9keSdzIGNvbnZleCBodWxsLCBjYWxjdWxhdGVkIGF0IGNyZWF0aW9uIGJ5IGBCb2R5LmNyZWF0ZWAuXG4gICAgICpcbiAgICAgKiBAcHJvcGVydHkgYXJlYVxuICAgICAqIEB0eXBlIHN0cmluZ1xuICAgICAqIEBkZWZhdWx0IFxuICAgICAqL1xuXG4gICAgLyoqXG4gICAgICogQSBgQm91bmRzYCBvYmplY3QgdGhhdCBkZWZpbmVzIHRoZSBBQUJCIHJlZ2lvbiBmb3IgdGhlIGJvZHkuXG4gICAgICogSXQgaXMgYXV0b21hdGljYWxseSBjYWxjdWxhdGVkIGZyb20gdGhlIGdpdmVuIGNvbnZleCBodWxsIChgdmVydGljZXNgIGFycmF5KSBpbiBgQm9keS5jcmVhdGVgIGFuZCBjb25zdGFudGx5IHVwZGF0ZWQgYnkgYEJvZHkudXBkYXRlYCBkdXJpbmcgc2ltdWxhdGlvbi5cbiAgICAgKlxuICAgICAqIEBwcm9wZXJ0eSBib3VuZHNcbiAgICAgKiBAdHlwZSBib3VuZHNcbiAgICAgKi9cblxufSkoKTtcblxuXG4vKioqLyB9KSxcbi8qIDcgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuLyoqXG4qIFRoZSBgTWF0dGVyLlNsZWVwaW5nYCBtb2R1bGUgY29udGFpbnMgbWV0aG9kcyB0byBtYW5hZ2UgdGhlIHNsZWVwaW5nIHN0YXRlIG9mIGJvZGllcy5cbipcbiogQGNsYXNzIFNsZWVwaW5nXG4qL1xuXG52YXIgU2xlZXBpbmcgPSB7fTtcblxubW9kdWxlLmV4cG9ydHMgPSBTbGVlcGluZztcblxudmFyIEV2ZW50cyA9IF9fd2VicGFja19yZXF1aXJlX18oNCk7XG5cbihmdW5jdGlvbigpIHtcblxuICAgIFNsZWVwaW5nLl9tb3Rpb25XYWtlVGhyZXNob2xkID0gMC4xODtcbiAgICBTbGVlcGluZy5fbW90aW9uU2xlZXBUaHJlc2hvbGQgPSAwLjA4O1xuICAgIFNsZWVwaW5nLl9taW5CaWFzID0gMC45O1xuXG4gICAgLyoqXG4gICAgICogUHV0cyBib2RpZXMgdG8gc2xlZXAgb3Igd2FrZXMgdGhlbSB1cCBkZXBlbmRpbmcgb24gdGhlaXIgbW90aW9uLlxuICAgICAqIEBtZXRob2QgdXBkYXRlXG4gICAgICogQHBhcmFtIHtib2R5W119IGJvZGllc1xuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB0aW1lU2NhbGVcbiAgICAgKi9cbiAgICBTbGVlcGluZy51cGRhdGUgPSBmdW5jdGlvbihib2RpZXMsIHRpbWVTY2FsZSkge1xuICAgICAgICB2YXIgdGltZUZhY3RvciA9IHRpbWVTY2FsZSAqIHRpbWVTY2FsZSAqIHRpbWVTY2FsZTtcblxuICAgICAgICAvLyB1cGRhdGUgYm9kaWVzIHNsZWVwaW5nIHN0YXR1c1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGJvZGllcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIGJvZHkgPSBib2RpZXNbaV0sXG4gICAgICAgICAgICAgICAgbW90aW9uID0gYm9keS5zcGVlZCAqIGJvZHkuc3BlZWQgKyBib2R5LmFuZ3VsYXJTcGVlZCAqIGJvZHkuYW5ndWxhclNwZWVkO1xuXG4gICAgICAgICAgICAvLyB3YWtlIHVwIGJvZGllcyBpZiB0aGV5IGhhdmUgYSBmb3JjZSBhcHBsaWVkXG4gICAgICAgICAgICBpZiAoYm9keS5mb3JjZS54ICE9PSAwIHx8IGJvZHkuZm9yY2UueSAhPT0gMCkge1xuICAgICAgICAgICAgICAgIFNsZWVwaW5nLnNldChib2R5LCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciBtaW5Nb3Rpb24gPSBNYXRoLm1pbihib2R5Lm1vdGlvbiwgbW90aW9uKSxcbiAgICAgICAgICAgICAgICBtYXhNb3Rpb24gPSBNYXRoLm1heChib2R5Lm1vdGlvbiwgbW90aW9uKTtcbiAgICAgICAgXG4gICAgICAgICAgICAvLyBiaWFzZWQgYXZlcmFnZSBtb3Rpb24gZXN0aW1hdGlvbiBiZXR3ZWVuIGZyYW1lc1xuICAgICAgICAgICAgYm9keS5tb3Rpb24gPSBTbGVlcGluZy5fbWluQmlhcyAqIG1pbk1vdGlvbiArICgxIC0gU2xlZXBpbmcuX21pbkJpYXMpICogbWF4TW90aW9uO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBpZiAoYm9keS5zbGVlcFRocmVzaG9sZCA+IDAgJiYgYm9keS5tb3Rpb24gPCBTbGVlcGluZy5fbW90aW9uU2xlZXBUaHJlc2hvbGQgKiB0aW1lRmFjdG9yKSB7XG4gICAgICAgICAgICAgICAgYm9keS5zbGVlcENvdW50ZXIgKz0gMTtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBpZiAoYm9keS5zbGVlcENvdW50ZXIgPj0gYm9keS5zbGVlcFRocmVzaG9sZClcbiAgICAgICAgICAgICAgICAgICAgU2xlZXBpbmcuc2V0KGJvZHksIHRydWUpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChib2R5LnNsZWVwQ291bnRlciA+IDApIHtcbiAgICAgICAgICAgICAgICBib2R5LnNsZWVwQ291bnRlciAtPSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEdpdmVuIGEgc2V0IG9mIGNvbGxpZGluZyBwYWlycywgd2FrZXMgdGhlIHNsZWVwaW5nIGJvZGllcyBpbnZvbHZlZC5cbiAgICAgKiBAbWV0aG9kIGFmdGVyQ29sbGlzaW9uc1xuICAgICAqIEBwYXJhbSB7cGFpcltdfSBwYWlyc1xuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB0aW1lU2NhbGVcbiAgICAgKi9cbiAgICBTbGVlcGluZy5hZnRlckNvbGxpc2lvbnMgPSBmdW5jdGlvbihwYWlycywgdGltZVNjYWxlKSB7XG4gICAgICAgIHZhciB0aW1lRmFjdG9yID0gdGltZVNjYWxlICogdGltZVNjYWxlICogdGltZVNjYWxlO1xuXG4gICAgICAgIC8vIHdha2UgdXAgYm9kaWVzIGludm9sdmVkIGluIGNvbGxpc2lvbnNcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYWlycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIHBhaXIgPSBwYWlyc1tpXTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gZG9uJ3Qgd2FrZSBpbmFjdGl2ZSBwYWlyc1xuICAgICAgICAgICAgaWYgKCFwYWlyLmlzQWN0aXZlKVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICB2YXIgY29sbGlzaW9uID0gcGFpci5jb2xsaXNpb24sXG4gICAgICAgICAgICAgICAgYm9keUEgPSBjb2xsaXNpb24uYm9keUEucGFyZW50LCBcbiAgICAgICAgICAgICAgICBib2R5QiA9IGNvbGxpc2lvbi5ib2R5Qi5wYXJlbnQ7XG4gICAgICAgIFxuICAgICAgICAgICAgLy8gZG9uJ3Qgd2FrZSBpZiBhdCBsZWFzdCBvbmUgYm9keSBpcyBzdGF0aWNcbiAgICAgICAgICAgIGlmICgoYm9keUEuaXNTbGVlcGluZyAmJiBib2R5Qi5pc1NsZWVwaW5nKSB8fCBib2R5QS5pc1N0YXRpYyB8fCBib2R5Qi5pc1N0YXRpYylcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgXG4gICAgICAgICAgICBpZiAoYm9keUEuaXNTbGVlcGluZyB8fCBib2R5Qi5pc1NsZWVwaW5nKSB7XG4gICAgICAgICAgICAgICAgdmFyIHNsZWVwaW5nQm9keSA9IChib2R5QS5pc1NsZWVwaW5nICYmICFib2R5QS5pc1N0YXRpYykgPyBib2R5QSA6IGJvZHlCLFxuICAgICAgICAgICAgICAgICAgICBtb3ZpbmdCb2R5ID0gc2xlZXBpbmdCb2R5ID09PSBib2R5QSA/IGJvZHlCIDogYm9keUE7XG5cbiAgICAgICAgICAgICAgICBpZiAoIXNsZWVwaW5nQm9keS5pc1N0YXRpYyAmJiBtb3ZpbmdCb2R5Lm1vdGlvbiA+IFNsZWVwaW5nLl9tb3Rpb25XYWtlVGhyZXNob2xkICogdGltZUZhY3Rvcikge1xuICAgICAgICAgICAgICAgICAgICBTbGVlcGluZy5zZXQoc2xlZXBpbmdCb2R5LCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbiAgXG4gICAgLyoqXG4gICAgICogU2V0IGEgYm9keSBhcyBzbGVlcGluZyBvciBhd2FrZS5cbiAgICAgKiBAbWV0aG9kIHNldFxuICAgICAqIEBwYXJhbSB7Ym9keX0gYm9keVxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gaXNTbGVlcGluZ1xuICAgICAqL1xuICAgIFNsZWVwaW5nLnNldCA9IGZ1bmN0aW9uKGJvZHksIGlzU2xlZXBpbmcpIHtcbiAgICAgICAgdmFyIHdhc1NsZWVwaW5nID0gYm9keS5pc1NsZWVwaW5nO1xuXG4gICAgICAgIGlmIChpc1NsZWVwaW5nKSB7XG4gICAgICAgICAgICBib2R5LmlzU2xlZXBpbmcgPSB0cnVlO1xuICAgICAgICAgICAgYm9keS5zbGVlcENvdW50ZXIgPSBib2R5LnNsZWVwVGhyZXNob2xkO1xuXG4gICAgICAgICAgICBib2R5LnBvc2l0aW9uSW1wdWxzZS54ID0gMDtcbiAgICAgICAgICAgIGJvZHkucG9zaXRpb25JbXB1bHNlLnkgPSAwO1xuXG4gICAgICAgICAgICBib2R5LnBvc2l0aW9uUHJldi54ID0gYm9keS5wb3NpdGlvbi54O1xuICAgICAgICAgICAgYm9keS5wb3NpdGlvblByZXYueSA9IGJvZHkucG9zaXRpb24ueTtcblxuICAgICAgICAgICAgYm9keS5hbmdsZVByZXYgPSBib2R5LmFuZ2xlO1xuICAgICAgICAgICAgYm9keS5zcGVlZCA9IDA7XG4gICAgICAgICAgICBib2R5LmFuZ3VsYXJTcGVlZCA9IDA7XG4gICAgICAgICAgICBib2R5Lm1vdGlvbiA9IDA7XG5cbiAgICAgICAgICAgIGlmICghd2FzU2xlZXBpbmcpIHtcbiAgICAgICAgICAgICAgICBFdmVudHMudHJpZ2dlcihib2R5LCAnc2xlZXBTdGFydCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYm9keS5pc1NsZWVwaW5nID0gZmFsc2U7XG4gICAgICAgICAgICBib2R5LnNsZWVwQ291bnRlciA9IDA7XG5cbiAgICAgICAgICAgIGlmICh3YXNTbGVlcGluZykge1xuICAgICAgICAgICAgICAgIEV2ZW50cy50cmlnZ2VyKGJvZHksICdzbGVlcEVuZCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcblxufSkoKTtcblxuXG4vKioqLyB9KSxcbi8qIDggKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuLyoqXG4qIFRoZSBgTWF0dGVyLkNvbGxpc2lvbmAgbW9kdWxlIGNvbnRhaW5zIG1ldGhvZHMgZm9yIGRldGVjdGluZyBjb2xsaXNpb25zIGJldHdlZW4gYSBnaXZlbiBwYWlyIG9mIGJvZGllcy5cbipcbiogRm9yIGVmZmljaWVudCBkZXRlY3Rpb24gYmV0d2VlbiBhIGxpc3Qgb2YgYm9kaWVzLCBzZWUgYE1hdHRlci5EZXRlY3RvcmAgYW5kIGBNYXR0ZXIuUXVlcnlgLlxuKlxuKiBTZWUgYE1hdHRlci5FbmdpbmVgIGZvciBjb2xsaXNpb24gZXZlbnRzLlxuKlxuKiBAY2xhc3MgQ29sbGlzaW9uXG4qL1xuXG52YXIgQ29sbGlzaW9uID0ge307XG5cbm1vZHVsZS5leHBvcnRzID0gQ29sbGlzaW9uO1xuXG52YXIgVmVydGljZXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMpO1xudmFyIFBhaXIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDkpO1xuXG4oZnVuY3Rpb24oKSB7XG4gICAgdmFyIF9zdXBwb3J0cyA9IFtdO1xuXG4gICAgdmFyIF9vdmVybGFwQUIgPSB7XG4gICAgICAgIG92ZXJsYXA6IDAsXG4gICAgICAgIGF4aXM6IG51bGxcbiAgICB9O1xuXG4gICAgdmFyIF9vdmVybGFwQkEgPSB7XG4gICAgICAgIG92ZXJsYXA6IDAsXG4gICAgICAgIGF4aXM6IG51bGxcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBjb2xsaXNpb24gcmVjb3JkLlxuICAgICAqIEBtZXRob2QgY3JlYXRlXG4gICAgICogQHBhcmFtIHtib2R5fSBib2R5QSBUaGUgZmlyc3QgYm9keSBwYXJ0IHJlcHJlc2VudGVkIGJ5IHRoZSBjb2xsaXNpb24gcmVjb3JkXG4gICAgICogQHBhcmFtIHtib2R5fSBib2R5QiBUaGUgc2Vjb25kIGJvZHkgcGFydCByZXByZXNlbnRlZCBieSB0aGUgY29sbGlzaW9uIHJlY29yZFxuICAgICAqIEByZXR1cm4ge2NvbGxpc2lvbn0gQSBuZXcgY29sbGlzaW9uIHJlY29yZFxuICAgICAqL1xuICAgIENvbGxpc2lvbi5jcmVhdGUgPSBmdW5jdGlvbihib2R5QSwgYm9keUIpIHtcbiAgICAgICAgcmV0dXJuIHsgXG4gICAgICAgICAgICBwYWlyOiBudWxsLFxuICAgICAgICAgICAgY29sbGlkZWQ6IGZhbHNlLFxuICAgICAgICAgICAgYm9keUE6IGJvZHlBLFxuICAgICAgICAgICAgYm9keUI6IGJvZHlCLFxuICAgICAgICAgICAgcGFyZW50QTogYm9keUEucGFyZW50LFxuICAgICAgICAgICAgcGFyZW50QjogYm9keUIucGFyZW50LFxuICAgICAgICAgICAgZGVwdGg6IDAsXG4gICAgICAgICAgICBub3JtYWw6IHsgeDogMCwgeTogMCB9LFxuICAgICAgICAgICAgdGFuZ2VudDogeyB4OiAwLCB5OiAwIH0sXG4gICAgICAgICAgICBwZW5ldHJhdGlvbjogeyB4OiAwLCB5OiAwIH0sXG4gICAgICAgICAgICBzdXBwb3J0czogW11cbiAgICAgICAgfTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogRGV0ZWN0IGNvbGxpc2lvbiBiZXR3ZWVuIHR3byBib2RpZXMuXG4gICAgICogQG1ldGhvZCBjb2xsaWRlc1xuICAgICAqIEBwYXJhbSB7Ym9keX0gYm9keUFcbiAgICAgKiBAcGFyYW0ge2JvZHl9IGJvZHlCXG4gICAgICogQHBhcmFtIHtwYWlyc30gW3BhaXJzXSBPcHRpb25hbGx5IHJldXNlIGNvbGxpc2lvbiByZWNvcmRzIGZyb20gZXhpc3RpbmcgcGFpcnMuXG4gICAgICogQHJldHVybiB7Y29sbGlzaW9ufG51bGx9IEEgY29sbGlzaW9uIHJlY29yZCBpZiBkZXRlY3RlZCwgb3RoZXJ3aXNlIG51bGxcbiAgICAgKi9cbiAgICBDb2xsaXNpb24uY29sbGlkZXMgPSBmdW5jdGlvbihib2R5QSwgYm9keUIsIHBhaXJzKSB7XG4gICAgICAgIENvbGxpc2lvbi5fb3ZlcmxhcEF4ZXMoX292ZXJsYXBBQiwgYm9keUEudmVydGljZXMsIGJvZHlCLnZlcnRpY2VzLCBib2R5QS5heGVzKTtcblxuICAgICAgICBpZiAoX292ZXJsYXBBQi5vdmVybGFwIDw9IDApIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgQ29sbGlzaW9uLl9vdmVybGFwQXhlcyhfb3ZlcmxhcEJBLCBib2R5Qi52ZXJ0aWNlcywgYm9keUEudmVydGljZXMsIGJvZHlCLmF4ZXMpO1xuXG4gICAgICAgIGlmIChfb3ZlcmxhcEJBLm92ZXJsYXAgPD0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICAvLyByZXVzZSBjb2xsaXNpb24gcmVjb3JkcyBmb3IgZ2MgZWZmaWNpZW5jeVxuICAgICAgICB2YXIgcGFpciA9IHBhaXJzICYmIHBhaXJzLnRhYmxlW1BhaXIuaWQoYm9keUEsIGJvZHlCKV0sXG4gICAgICAgICAgICBjb2xsaXNpb247XG5cbiAgICAgICAgaWYgKCFwYWlyKSB7XG4gICAgICAgICAgICBjb2xsaXNpb24gPSBDb2xsaXNpb24uY3JlYXRlKGJvZHlBLCBib2R5Qik7XG4gICAgICAgICAgICBjb2xsaXNpb24uY29sbGlkZWQgPSB0cnVlO1xuICAgICAgICAgICAgY29sbGlzaW9uLmJvZHlBID0gYm9keUEuaWQgPCBib2R5Qi5pZCA/IGJvZHlBIDogYm9keUI7XG4gICAgICAgICAgICBjb2xsaXNpb24uYm9keUIgPSBib2R5QS5pZCA8IGJvZHlCLmlkID8gYm9keUIgOiBib2R5QTtcbiAgICAgICAgICAgIGNvbGxpc2lvbi5wYXJlbnRBID0gY29sbGlzaW9uLmJvZHlBLnBhcmVudDtcbiAgICAgICAgICAgIGNvbGxpc2lvbi5wYXJlbnRCID0gY29sbGlzaW9uLmJvZHlCLnBhcmVudDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbGxpc2lvbiA9IHBhaXIuY29sbGlzaW9uO1xuICAgICAgICB9XG5cbiAgICAgICAgYm9keUEgPSBjb2xsaXNpb24uYm9keUE7XG4gICAgICAgIGJvZHlCID0gY29sbGlzaW9uLmJvZHlCO1xuXG4gICAgICAgIHZhciBtaW5PdmVybGFwO1xuXG4gICAgICAgIGlmIChfb3ZlcmxhcEFCLm92ZXJsYXAgPCBfb3ZlcmxhcEJBLm92ZXJsYXApIHtcbiAgICAgICAgICAgIG1pbk92ZXJsYXAgPSBfb3ZlcmxhcEFCO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbWluT3ZlcmxhcCA9IF9vdmVybGFwQkE7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgbm9ybWFsID0gY29sbGlzaW9uLm5vcm1hbCxcbiAgICAgICAgICAgIHN1cHBvcnRzID0gY29sbGlzaW9uLnN1cHBvcnRzLFxuICAgICAgICAgICAgbWluQXhpcyA9IG1pbk92ZXJsYXAuYXhpcyxcbiAgICAgICAgICAgIG1pbkF4aXNYID0gbWluQXhpcy54LFxuICAgICAgICAgICAgbWluQXhpc1kgPSBtaW5BeGlzLnk7XG5cbiAgICAgICAgLy8gZW5zdXJlIG5vcm1hbCBpcyBmYWNpbmcgYXdheSBmcm9tIGJvZHlBXG4gICAgICAgIGlmIChtaW5BeGlzWCAqIChib2R5Qi5wb3NpdGlvbi54IC0gYm9keUEucG9zaXRpb24ueCkgKyBtaW5BeGlzWSAqIChib2R5Qi5wb3NpdGlvbi55IC0gYm9keUEucG9zaXRpb24ueSkgPCAwKSB7XG4gICAgICAgICAgICBub3JtYWwueCA9IG1pbkF4aXNYO1xuICAgICAgICAgICAgbm9ybWFsLnkgPSBtaW5BeGlzWTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG5vcm1hbC54ID0gLW1pbkF4aXNYO1xuICAgICAgICAgICAgbm9ybWFsLnkgPSAtbWluQXhpc1k7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGNvbGxpc2lvbi50YW5nZW50LnggPSAtbm9ybWFsLnk7XG4gICAgICAgIGNvbGxpc2lvbi50YW5nZW50LnkgPSBub3JtYWwueDtcblxuICAgICAgICBjb2xsaXNpb24uZGVwdGggPSBtaW5PdmVybGFwLm92ZXJsYXA7XG5cbiAgICAgICAgY29sbGlzaW9uLnBlbmV0cmF0aW9uLnggPSBub3JtYWwueCAqIGNvbGxpc2lvbi5kZXB0aDtcbiAgICAgICAgY29sbGlzaW9uLnBlbmV0cmF0aW9uLnkgPSBub3JtYWwueSAqIGNvbGxpc2lvbi5kZXB0aDtcblxuICAgICAgICAvLyBmaW5kIHN1cHBvcnQgcG9pbnRzLCB0aGVyZSBpcyBhbHdheXMgZWl0aGVyIGV4YWN0bHkgb25lIG9yIHR3b1xuICAgICAgICB2YXIgc3VwcG9ydHNCID0gQ29sbGlzaW9uLl9maW5kU3VwcG9ydHMoYm9keUEsIGJvZHlCLCBub3JtYWwsIDEpLFxuICAgICAgICAgICAgc3VwcG9ydENvdW50ID0gMDtcblxuICAgICAgICAvLyBmaW5kIHRoZSBzdXBwb3J0cyBmcm9tIGJvZHlCIHRoYXQgYXJlIGluc2lkZSBib2R5QVxuICAgICAgICBpZiAoVmVydGljZXMuY29udGFpbnMoYm9keUEudmVydGljZXMsIHN1cHBvcnRzQlswXSkpIHtcbiAgICAgICAgICAgIHN1cHBvcnRzW3N1cHBvcnRDb3VudCsrXSA9IHN1cHBvcnRzQlswXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChWZXJ0aWNlcy5jb250YWlucyhib2R5QS52ZXJ0aWNlcywgc3VwcG9ydHNCWzFdKSkge1xuICAgICAgICAgICAgc3VwcG9ydHNbc3VwcG9ydENvdW50KytdID0gc3VwcG9ydHNCWzFdO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gZmluZCB0aGUgc3VwcG9ydHMgZnJvbSBib2R5QSB0aGF0IGFyZSBpbnNpZGUgYm9keUJcbiAgICAgICAgaWYgKHN1cHBvcnRDb3VudCA8IDIpIHtcbiAgICAgICAgICAgIHZhciBzdXBwb3J0c0EgPSBDb2xsaXNpb24uX2ZpbmRTdXBwb3J0cyhib2R5QiwgYm9keUEsIG5vcm1hbCwgLTEpO1xuXG4gICAgICAgICAgICBpZiAoVmVydGljZXMuY29udGFpbnMoYm9keUIudmVydGljZXMsIHN1cHBvcnRzQVswXSkpIHtcbiAgICAgICAgICAgICAgICBzdXBwb3J0c1tzdXBwb3J0Q291bnQrK10gPSBzdXBwb3J0c0FbMF07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChzdXBwb3J0Q291bnQgPCAyICYmIFZlcnRpY2VzLmNvbnRhaW5zKGJvZHlCLnZlcnRpY2VzLCBzdXBwb3J0c0FbMV0pKSB7XG4gICAgICAgICAgICAgICAgc3VwcG9ydHNbc3VwcG9ydENvdW50KytdID0gc3VwcG9ydHNBWzFdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gYWNjb3VudCBmb3IgdGhlIGVkZ2UgY2FzZSBvZiBvdmVybGFwcGluZyBidXQgbm8gdmVydGV4IGNvbnRhaW5tZW50XG4gICAgICAgIGlmIChzdXBwb3J0Q291bnQgPT09IDApIHtcbiAgICAgICAgICAgIHN1cHBvcnRzW3N1cHBvcnRDb3VudCsrXSA9IHN1cHBvcnRzQlswXTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHVwZGF0ZSBzdXBwb3J0cyBhcnJheSBzaXplXG4gICAgICAgIHN1cHBvcnRzLmxlbmd0aCA9IHN1cHBvcnRDb3VudDtcblxuICAgICAgICByZXR1cm4gY29sbGlzaW9uO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBGaW5kIHRoZSBvdmVybGFwIGJldHdlZW4gdHdvIHNldHMgb2YgdmVydGljZXMuXG4gICAgICogQG1ldGhvZCBfb3ZlcmxhcEF4ZXNcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSByZXN1bHRcbiAgICAgKiBAcGFyYW0ge3ZlcnRpY2VzfSB2ZXJ0aWNlc0FcbiAgICAgKiBAcGFyYW0ge3ZlcnRpY2VzfSB2ZXJ0aWNlc0JcbiAgICAgKiBAcGFyYW0ge2F4ZXN9IGF4ZXNcbiAgICAgKi9cbiAgICBDb2xsaXNpb24uX292ZXJsYXBBeGVzID0gZnVuY3Rpb24ocmVzdWx0LCB2ZXJ0aWNlc0EsIHZlcnRpY2VzQiwgYXhlcykge1xuICAgICAgICB2YXIgdmVydGljZXNBTGVuZ3RoID0gdmVydGljZXNBLmxlbmd0aCxcbiAgICAgICAgICAgIHZlcnRpY2VzQkxlbmd0aCA9IHZlcnRpY2VzQi5sZW5ndGgsXG4gICAgICAgICAgICB2ZXJ0aWNlc0FYID0gdmVydGljZXNBWzBdLngsXG4gICAgICAgICAgICB2ZXJ0aWNlc0FZID0gdmVydGljZXNBWzBdLnksXG4gICAgICAgICAgICB2ZXJ0aWNlc0JYID0gdmVydGljZXNCWzBdLngsXG4gICAgICAgICAgICB2ZXJ0aWNlc0JZID0gdmVydGljZXNCWzBdLnksXG4gICAgICAgICAgICBheGVzTGVuZ3RoID0gYXhlcy5sZW5ndGgsXG4gICAgICAgICAgICBvdmVybGFwTWluID0gTnVtYmVyLk1BWF9WQUxVRSxcbiAgICAgICAgICAgIG92ZXJsYXBBeGlzTnVtYmVyID0gMCxcbiAgICAgICAgICAgIG92ZXJsYXAsXG4gICAgICAgICAgICBvdmVybGFwQUIsXG4gICAgICAgICAgICBvdmVybGFwQkEsXG4gICAgICAgICAgICBkb3QsXG4gICAgICAgICAgICBpLFxuICAgICAgICAgICAgajtcblxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYXhlc0xlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgYXhpcyA9IGF4ZXNbaV0sXG4gICAgICAgICAgICAgICAgYXhpc1ggPSBheGlzLngsXG4gICAgICAgICAgICAgICAgYXhpc1kgPSBheGlzLnksXG4gICAgICAgICAgICAgICAgbWluQSA9IHZlcnRpY2VzQVggKiBheGlzWCArIHZlcnRpY2VzQVkgKiBheGlzWSxcbiAgICAgICAgICAgICAgICBtaW5CID0gdmVydGljZXNCWCAqIGF4aXNYICsgdmVydGljZXNCWSAqIGF4aXNZLFxuICAgICAgICAgICAgICAgIG1heEEgPSBtaW5BLFxuICAgICAgICAgICAgICAgIG1heEIgPSBtaW5CO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBmb3IgKGogPSAxOyBqIDwgdmVydGljZXNBTGVuZ3RoOyBqICs9IDEpIHtcbiAgICAgICAgICAgICAgICBkb3QgPSB2ZXJ0aWNlc0Fbal0ueCAqIGF4aXNYICsgdmVydGljZXNBW2pdLnkgKiBheGlzWTtcblxuICAgICAgICAgICAgICAgIGlmIChkb3QgPiBtYXhBKSB7IFxuICAgICAgICAgICAgICAgICAgICBtYXhBID0gZG90O1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZG90IDwgbWluQSkgeyBcbiAgICAgICAgICAgICAgICAgICAgbWluQSA9IGRvdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZvciAoaiA9IDE7IGogPCB2ZXJ0aWNlc0JMZW5ndGg7IGogKz0gMSkge1xuICAgICAgICAgICAgICAgIGRvdCA9IHZlcnRpY2VzQltqXS54ICogYXhpc1ggKyB2ZXJ0aWNlc0Jbal0ueSAqIGF4aXNZO1xuXG4gICAgICAgICAgICAgICAgaWYgKGRvdCA+IG1heEIpIHsgXG4gICAgICAgICAgICAgICAgICAgIG1heEIgPSBkb3Q7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkb3QgPCBtaW5CKSB7IFxuICAgICAgICAgICAgICAgICAgICBtaW5CID0gZG90O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgb3ZlcmxhcEFCID0gbWF4QSAtIG1pbkI7XG4gICAgICAgICAgICBvdmVybGFwQkEgPSBtYXhCIC0gbWluQTtcbiAgICAgICAgICAgIG92ZXJsYXAgPSBvdmVybGFwQUIgPCBvdmVybGFwQkEgPyBvdmVybGFwQUIgOiBvdmVybGFwQkE7XG5cbiAgICAgICAgICAgIGlmIChvdmVybGFwIDwgb3ZlcmxhcE1pbikge1xuICAgICAgICAgICAgICAgIG92ZXJsYXBNaW4gPSBvdmVybGFwO1xuICAgICAgICAgICAgICAgIG92ZXJsYXBBeGlzTnVtYmVyID0gaTtcblxuICAgICAgICAgICAgICAgIGlmIChvdmVybGFwIDw9IDApIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gY2FuIG5vdCBiZSBpbnRlcnNlY3RpbmdcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBcbiAgICAgICAgfVxuXG4gICAgICAgIHJlc3VsdC5heGlzID0gYXhlc1tvdmVybGFwQXhpc051bWJlcl07XG4gICAgICAgIHJlc3VsdC5vdmVybGFwID0gb3ZlcmxhcE1pbjtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogUHJvamVjdHMgdmVydGljZXMgb24gYW4gYXhpcyBhbmQgcmV0dXJucyBhbiBpbnRlcnZhbC5cbiAgICAgKiBAbWV0aG9kIF9wcm9qZWN0VG9BeGlzXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge30gcHJvamVjdGlvblxuICAgICAqIEBwYXJhbSB7fSB2ZXJ0aWNlc1xuICAgICAqIEBwYXJhbSB7fSBheGlzXG4gICAgICovXG4gICAgQ29sbGlzaW9uLl9wcm9qZWN0VG9BeGlzID0gZnVuY3Rpb24ocHJvamVjdGlvbiwgdmVydGljZXMsIGF4aXMpIHtcbiAgICAgICAgdmFyIG1pbiA9IHZlcnRpY2VzWzBdLnggKiBheGlzLnggKyB2ZXJ0aWNlc1swXS55ICogYXhpcy55LFxuICAgICAgICAgICAgbWF4ID0gbWluO1xuXG4gICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDwgdmVydGljZXMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgICAgIHZhciBkb3QgPSB2ZXJ0aWNlc1tpXS54ICogYXhpcy54ICsgdmVydGljZXNbaV0ueSAqIGF4aXMueTtcblxuICAgICAgICAgICAgaWYgKGRvdCA+IG1heCkgeyBcbiAgICAgICAgICAgICAgICBtYXggPSBkb3Q7IFxuICAgICAgICAgICAgfSBlbHNlIGlmIChkb3QgPCBtaW4pIHsgXG4gICAgICAgICAgICAgICAgbWluID0gZG90OyBcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHByb2plY3Rpb24ubWluID0gbWluO1xuICAgICAgICBwcm9qZWN0aW9uLm1heCA9IG1heDtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogRmluZHMgc3VwcG9ydGluZyB2ZXJ0aWNlcyBnaXZlbiB0d28gYm9kaWVzIGFsb25nIGEgZ2l2ZW4gZGlyZWN0aW9uIHVzaW5nIGhpbGwtY2xpbWJpbmcuXG4gICAgICogQG1ldGhvZCBfZmluZFN1cHBvcnRzXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge2JvZHl9IGJvZHlBXG4gICAgICogQHBhcmFtIHtib2R5fSBib2R5QlxuICAgICAqIEBwYXJhbSB7dmVjdG9yfSBub3JtYWxcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZGlyZWN0aW9uXG4gICAgICogQHJldHVybiBbdmVjdG9yXVxuICAgICAqL1xuICAgIENvbGxpc2lvbi5fZmluZFN1cHBvcnRzID0gZnVuY3Rpb24oYm9keUEsIGJvZHlCLCBub3JtYWwsIGRpcmVjdGlvbikge1xuICAgICAgICB2YXIgdmVydGljZXMgPSBib2R5Qi52ZXJ0aWNlcyxcbiAgICAgICAgICAgIHZlcnRpY2VzTGVuZ3RoID0gdmVydGljZXMubGVuZ3RoLFxuICAgICAgICAgICAgYm9keUFQb3NpdGlvblggPSBib2R5QS5wb3NpdGlvbi54LFxuICAgICAgICAgICAgYm9keUFQb3NpdGlvblkgPSBib2R5QS5wb3NpdGlvbi55LFxuICAgICAgICAgICAgbm9ybWFsWCA9IG5vcm1hbC54ICogZGlyZWN0aW9uLFxuICAgICAgICAgICAgbm9ybWFsWSA9IG5vcm1hbC55ICogZGlyZWN0aW9uLFxuICAgICAgICAgICAgbmVhcmVzdERpc3RhbmNlID0gTnVtYmVyLk1BWF9WQUxVRSxcbiAgICAgICAgICAgIHZlcnRleEEsXG4gICAgICAgICAgICB2ZXJ0ZXhCLFxuICAgICAgICAgICAgdmVydGV4QyxcbiAgICAgICAgICAgIGRpc3RhbmNlLFxuICAgICAgICAgICAgajtcblxuICAgICAgICAvLyBmaW5kIGRlZXBlc3QgdmVydGV4IHJlbGF0aXZlIHRvIHRoZSBheGlzXG4gICAgICAgIGZvciAoaiA9IDA7IGogPCB2ZXJ0aWNlc0xlbmd0aDsgaiArPSAxKSB7XG4gICAgICAgICAgICB2ZXJ0ZXhCID0gdmVydGljZXNbal07XG4gICAgICAgICAgICBkaXN0YW5jZSA9IG5vcm1hbFggKiAoYm9keUFQb3NpdGlvblggLSB2ZXJ0ZXhCLngpICsgbm9ybWFsWSAqIChib2R5QVBvc2l0aW9uWSAtIHZlcnRleEIueSk7XG5cbiAgICAgICAgICAgIC8vIGNvbnZleCBoaWxsLWNsaW1iaW5nXG4gICAgICAgICAgICBpZiAoZGlzdGFuY2UgPCBuZWFyZXN0RGlzdGFuY2UpIHtcbiAgICAgICAgICAgICAgICBuZWFyZXN0RGlzdGFuY2UgPSBkaXN0YW5jZTtcbiAgICAgICAgICAgICAgICB2ZXJ0ZXhBID0gdmVydGV4QjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIG1lYXN1cmUgbmV4dCB2ZXJ0ZXhcbiAgICAgICAgdmVydGV4QyA9IHZlcnRpY2VzWyh2ZXJ0aWNlc0xlbmd0aCArIHZlcnRleEEuaW5kZXggLSAxKSAlIHZlcnRpY2VzTGVuZ3RoXTtcbiAgICAgICAgbmVhcmVzdERpc3RhbmNlID0gbm9ybWFsWCAqIChib2R5QVBvc2l0aW9uWCAtIHZlcnRleEMueCkgKyBub3JtYWxZICogKGJvZHlBUG9zaXRpb25ZIC0gdmVydGV4Qy55KTtcblxuICAgICAgICAvLyBjb21wYXJlIHdpdGggcHJldmlvdXMgdmVydGV4XG4gICAgICAgIHZlcnRleEIgPSB2ZXJ0aWNlc1sodmVydGV4QS5pbmRleCArIDEpICUgdmVydGljZXNMZW5ndGhdO1xuICAgICAgICBpZiAobm9ybWFsWCAqIChib2R5QVBvc2l0aW9uWCAtIHZlcnRleEIueCkgKyBub3JtYWxZICogKGJvZHlBUG9zaXRpb25ZIC0gdmVydGV4Qi55KSA8IG5lYXJlc3REaXN0YW5jZSkge1xuICAgICAgICAgICAgX3N1cHBvcnRzWzBdID0gdmVydGV4QTtcbiAgICAgICAgICAgIF9zdXBwb3J0c1sxXSA9IHZlcnRleEI7XG5cbiAgICAgICAgICAgIHJldHVybiBfc3VwcG9ydHM7XG4gICAgICAgIH1cblxuICAgICAgICBfc3VwcG9ydHNbMF0gPSB2ZXJ0ZXhBO1xuICAgICAgICBfc3VwcG9ydHNbMV0gPSB2ZXJ0ZXhDO1xuXG4gICAgICAgIHJldHVybiBfc3VwcG9ydHM7XG4gICAgfTtcblxuICAgIC8qXG4gICAgKlxuICAgICogIFByb3BlcnRpZXMgRG9jdW1lbnRhdGlvblxuICAgICpcbiAgICAqL1xuXG4gICAgLyoqXG4gICAgICogQSByZWZlcmVuY2UgdG8gdGhlIHBhaXIgdXNpbmcgdGhpcyBjb2xsaXNpb24gcmVjb3JkLCBpZiB0aGVyZSBpcyBvbmUuXG4gICAgICpcbiAgICAgKiBAcHJvcGVydHkgcGFpclxuICAgICAqIEB0eXBlIHtwYWlyfG51bGx9XG4gICAgICogQGRlZmF1bHQgbnVsbFxuICAgICAqL1xuXG4gICAgLyoqXG4gICAgICogQSBmbGFnIHRoYXQgaW5kaWNhdGVzIGlmIHRoZSBib2RpZXMgd2VyZSBjb2xsaWRpbmcgd2hlbiB0aGUgY29sbGlzaW9uIHdhcyBsYXN0IHVwZGF0ZWQuXG4gICAgICogXG4gICAgICogQHByb3BlcnR5IGNvbGxpZGVkXG4gICAgICogQHR5cGUgYm9vbGVhblxuICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICovXG5cbiAgICAvKipcbiAgICAgKiBUaGUgZmlyc3QgYm9keSBwYXJ0IHJlcHJlc2VudGVkIGJ5IHRoZSBjb2xsaXNpb24gKHNlZSBhbHNvIGBjb2xsaXNpb24ucGFyZW50QWApLlxuICAgICAqIFxuICAgICAqIEBwcm9wZXJ0eSBib2R5QVxuICAgICAqIEB0eXBlIGJvZHlcbiAgICAgKi9cblxuICAgIC8qKlxuICAgICAqIFRoZSBzZWNvbmQgYm9keSBwYXJ0IHJlcHJlc2VudGVkIGJ5IHRoZSBjb2xsaXNpb24gKHNlZSBhbHNvIGBjb2xsaXNpb24ucGFyZW50QmApLlxuICAgICAqIFxuICAgICAqIEBwcm9wZXJ0eSBib2R5QlxuICAgICAqIEB0eXBlIGJvZHlcbiAgICAgKi9cblxuICAgIC8qKlxuICAgICAqIFRoZSBmaXJzdCBib2R5IHJlcHJlc2VudGVkIGJ5IHRoZSBjb2xsaXNpb24gKGkuZS4gYGNvbGxpc2lvbi5ib2R5QS5wYXJlbnRgKS5cbiAgICAgKiBcbiAgICAgKiBAcHJvcGVydHkgcGFyZW50QVxuICAgICAqIEB0eXBlIGJvZHlcbiAgICAgKi9cblxuICAgIC8qKlxuICAgICAqIFRoZSBzZWNvbmQgYm9keSByZXByZXNlbnRlZCBieSB0aGUgY29sbGlzaW9uIChpLmUuIGBjb2xsaXNpb24uYm9keUIucGFyZW50YCkuXG4gICAgICogXG4gICAgICogQHByb3BlcnR5IHBhcmVudEJcbiAgICAgKiBAdHlwZSBib2R5XG4gICAgICovXG5cbiAgICAvKipcbiAgICAgKiBBIGBOdW1iZXJgIHRoYXQgcmVwcmVzZW50cyB0aGUgbWluaW11bSBzZXBhcmF0aW5nIGRpc3RhbmNlIGJldHdlZW4gdGhlIGJvZGllcyBhbG9uZyB0aGUgY29sbGlzaW9uIG5vcm1hbC5cbiAgICAgKlxuICAgICAqIEByZWFkT25seVxuICAgICAqIEBwcm9wZXJ0eSBkZXB0aFxuICAgICAqIEB0eXBlIG51bWJlclxuICAgICAqIEBkZWZhdWx0IDBcbiAgICAgKi9cblxuICAgIC8qKlxuICAgICAqIEEgbm9ybWFsaXNlZCBgVmVjdG9yYCB0aGF0IHJlcHJlc2VudHMgdGhlIGRpcmVjdGlvbiBiZXR3ZWVuIHRoZSBib2RpZXMgdGhhdCBwcm92aWRlcyB0aGUgbWluaW11bSBzZXBhcmF0aW5nIGRpc3RhbmNlLlxuICAgICAqXG4gICAgICogQHByb3BlcnR5IG5vcm1hbFxuICAgICAqIEB0eXBlIHZlY3RvclxuICAgICAqIEBkZWZhdWx0IHsgeDogMCwgeTogMCB9XG4gICAgICovXG5cbiAgICAvKipcbiAgICAgKiBBIG5vcm1hbGlzZWQgYFZlY3RvcmAgdGhhdCBpcyB0aGUgdGFuZ2VudCBkaXJlY3Rpb24gdG8gdGhlIGNvbGxpc2lvbiBub3JtYWwuXG4gICAgICpcbiAgICAgKiBAcHJvcGVydHkgdGFuZ2VudFxuICAgICAqIEB0eXBlIHZlY3RvclxuICAgICAqIEBkZWZhdWx0IHsgeDogMCwgeTogMCB9XG4gICAgICovXG5cbiAgICAvKipcbiAgICAgKiBBIGBWZWN0b3JgIHRoYXQgcmVwcmVzZW50cyB0aGUgZGlyZWN0aW9uIGFuZCBkZXB0aCBvZiB0aGUgY29sbGlzaW9uLlxuICAgICAqXG4gICAgICogQHByb3BlcnR5IHBlbmV0cmF0aW9uXG4gICAgICogQHR5cGUgdmVjdG9yXG4gICAgICogQGRlZmF1bHQgeyB4OiAwLCB5OiAwIH1cbiAgICAgKi9cblxuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIGJvZHkgdmVydGljZXMgdGhhdCByZXByZXNlbnQgdGhlIHN1cHBvcnQgcG9pbnRzIGluIHRoZSBjb2xsaXNpb24uXG4gICAgICogVGhlc2UgYXJlIHRoZSBkZWVwZXN0IHZlcnRpY2VzIChhbG9uZyB0aGUgY29sbGlzaW9uIG5vcm1hbCkgb2YgZWFjaCBib2R5IHRoYXQgYXJlIGNvbnRhaW5lZCBieSB0aGUgb3RoZXIgYm9keSdzIHZlcnRpY2VzLlxuICAgICAqXG4gICAgICogQHByb3BlcnR5IHN1cHBvcnRzXG4gICAgICogQHR5cGUgdmVjdG9yW11cbiAgICAgKiBAZGVmYXVsdCBbXVxuICAgICAqL1xuXG59KSgpO1xuXG5cbi8qKiovIH0pLFxuLyogOSAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG4vKipcbiogVGhlIGBNYXR0ZXIuUGFpcmAgbW9kdWxlIGNvbnRhaW5zIG1ldGhvZHMgZm9yIGNyZWF0aW5nIGFuZCBtYW5pcHVsYXRpbmcgY29sbGlzaW9uIHBhaXJzLlxuKlxuKiBAY2xhc3MgUGFpclxuKi9cblxudmFyIFBhaXIgPSB7fTtcblxubW9kdWxlLmV4cG9ydHMgPSBQYWlyO1xuXG52YXIgQ29udGFjdCA9IF9fd2VicGFja19yZXF1aXJlX18oMTcpO1xuXG4oZnVuY3Rpb24oKSB7XG4gICAgXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHBhaXIuXG4gICAgICogQG1ldGhvZCBjcmVhdGVcbiAgICAgKiBAcGFyYW0ge2NvbGxpc2lvbn0gY29sbGlzaW9uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHRpbWVzdGFtcFxuICAgICAqIEByZXR1cm4ge3BhaXJ9IEEgbmV3IHBhaXJcbiAgICAgKi9cbiAgICBQYWlyLmNyZWF0ZSA9IGZ1bmN0aW9uKGNvbGxpc2lvbiwgdGltZXN0YW1wKSB7XG4gICAgICAgIHZhciBib2R5QSA9IGNvbGxpc2lvbi5ib2R5QSxcbiAgICAgICAgICAgIGJvZHlCID0gY29sbGlzaW9uLmJvZHlCO1xuXG4gICAgICAgIHZhciBwYWlyID0ge1xuICAgICAgICAgICAgaWQ6IFBhaXIuaWQoYm9keUEsIGJvZHlCKSxcbiAgICAgICAgICAgIGJvZHlBOiBib2R5QSxcbiAgICAgICAgICAgIGJvZHlCOiBib2R5QixcbiAgICAgICAgICAgIGNvbGxpc2lvbjogY29sbGlzaW9uLFxuICAgICAgICAgICAgY29udGFjdHM6IFtdLFxuICAgICAgICAgICAgYWN0aXZlQ29udGFjdHM6IFtdLFxuICAgICAgICAgICAgc2VwYXJhdGlvbjogMCxcbiAgICAgICAgICAgIGlzQWN0aXZlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlybWVkQWN0aXZlOiB0cnVlLFxuICAgICAgICAgICAgaXNTZW5zb3I6IGJvZHlBLmlzU2Vuc29yIHx8IGJvZHlCLmlzU2Vuc29yLFxuICAgICAgICAgICAgdGltZUNyZWF0ZWQ6IHRpbWVzdGFtcCxcbiAgICAgICAgICAgIHRpbWVVcGRhdGVkOiB0aW1lc3RhbXAsXG4gICAgICAgICAgICBpbnZlcnNlTWFzczogMCxcbiAgICAgICAgICAgIGZyaWN0aW9uOiAwLFxuICAgICAgICAgICAgZnJpY3Rpb25TdGF0aWM6IDAsXG4gICAgICAgICAgICByZXN0aXR1dGlvbjogMCxcbiAgICAgICAgICAgIHNsb3A6IDBcbiAgICAgICAgfTtcblxuICAgICAgICBQYWlyLnVwZGF0ZShwYWlyLCBjb2xsaXNpb24sIHRpbWVzdGFtcCk7XG5cbiAgICAgICAgcmV0dXJuIHBhaXI7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFVwZGF0ZXMgYSBwYWlyIGdpdmVuIGEgY29sbGlzaW9uLlxuICAgICAqIEBtZXRob2QgdXBkYXRlXG4gICAgICogQHBhcmFtIHtwYWlyfSBwYWlyXG4gICAgICogQHBhcmFtIHtjb2xsaXNpb259IGNvbGxpc2lvblxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB0aW1lc3RhbXBcbiAgICAgKi9cbiAgICBQYWlyLnVwZGF0ZSA9IGZ1bmN0aW9uKHBhaXIsIGNvbGxpc2lvbiwgdGltZXN0YW1wKSB7XG4gICAgICAgIHZhciBjb250YWN0cyA9IHBhaXIuY29udGFjdHMsXG4gICAgICAgICAgICBzdXBwb3J0cyA9IGNvbGxpc2lvbi5zdXBwb3J0cyxcbiAgICAgICAgICAgIGFjdGl2ZUNvbnRhY3RzID0gcGFpci5hY3RpdmVDb250YWN0cyxcbiAgICAgICAgICAgIHBhcmVudEEgPSBjb2xsaXNpb24ucGFyZW50QSxcbiAgICAgICAgICAgIHBhcmVudEIgPSBjb2xsaXNpb24ucGFyZW50QixcbiAgICAgICAgICAgIHBhcmVudEFWZXJ0aWNlc0xlbmd0aCA9IHBhcmVudEEudmVydGljZXMubGVuZ3RoO1xuICAgICAgICBcbiAgICAgICAgcGFpci5pc0FjdGl2ZSA9IHRydWU7XG4gICAgICAgIHBhaXIudGltZVVwZGF0ZWQgPSB0aW1lc3RhbXA7XG4gICAgICAgIHBhaXIuY29sbGlzaW9uID0gY29sbGlzaW9uO1xuICAgICAgICBwYWlyLnNlcGFyYXRpb24gPSBjb2xsaXNpb24uZGVwdGg7XG4gICAgICAgIHBhaXIuaW52ZXJzZU1hc3MgPSBwYXJlbnRBLmludmVyc2VNYXNzICsgcGFyZW50Qi5pbnZlcnNlTWFzcztcbiAgICAgICAgcGFpci5mcmljdGlvbiA9IHBhcmVudEEuZnJpY3Rpb24gPCBwYXJlbnRCLmZyaWN0aW9uID8gcGFyZW50QS5mcmljdGlvbiA6IHBhcmVudEIuZnJpY3Rpb247XG4gICAgICAgIHBhaXIuZnJpY3Rpb25TdGF0aWMgPSBwYXJlbnRBLmZyaWN0aW9uU3RhdGljID4gcGFyZW50Qi5mcmljdGlvblN0YXRpYyA/IHBhcmVudEEuZnJpY3Rpb25TdGF0aWMgOiBwYXJlbnRCLmZyaWN0aW9uU3RhdGljO1xuICAgICAgICBwYWlyLnJlc3RpdHV0aW9uID0gcGFyZW50QS5yZXN0aXR1dGlvbiA+IHBhcmVudEIucmVzdGl0dXRpb24gPyBwYXJlbnRBLnJlc3RpdHV0aW9uIDogcGFyZW50Qi5yZXN0aXR1dGlvbjtcbiAgICAgICAgcGFpci5zbG9wID0gcGFyZW50QS5zbG9wID4gcGFyZW50Qi5zbG9wID8gcGFyZW50QS5zbG9wIDogcGFyZW50Qi5zbG9wO1xuXG4gICAgICAgIGNvbGxpc2lvbi5wYWlyID0gcGFpcjtcbiAgICAgICAgYWN0aXZlQ29udGFjdHMubGVuZ3RoID0gMDtcbiAgICAgICAgXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3VwcG9ydHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBzdXBwb3J0ID0gc3VwcG9ydHNbaV0sXG4gICAgICAgICAgICAgICAgY29udGFjdElkID0gc3VwcG9ydC5ib2R5ID09PSBwYXJlbnRBID8gc3VwcG9ydC5pbmRleCA6IHBhcmVudEFWZXJ0aWNlc0xlbmd0aCArIHN1cHBvcnQuaW5kZXgsXG4gICAgICAgICAgICAgICAgY29udGFjdCA9IGNvbnRhY3RzW2NvbnRhY3RJZF07XG5cbiAgICAgICAgICAgIGlmIChjb250YWN0KSB7XG4gICAgICAgICAgICAgICAgYWN0aXZlQ29udGFjdHMucHVzaChjb250YWN0KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgYWN0aXZlQ29udGFjdHMucHVzaChjb250YWN0c1tjb250YWN0SWRdID0gQ29udGFjdC5jcmVhdGUoc3VwcG9ydCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbiAgICBcbiAgICAvKipcbiAgICAgKiBTZXQgYSBwYWlyIGFzIGFjdGl2ZSBvciBpbmFjdGl2ZS5cbiAgICAgKiBAbWV0aG9kIHNldEFjdGl2ZVxuICAgICAqIEBwYXJhbSB7cGFpcn0gcGFpclxuICAgICAqIEBwYXJhbSB7Ym9vbH0gaXNBY3RpdmVcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gdGltZXN0YW1wXG4gICAgICovXG4gICAgUGFpci5zZXRBY3RpdmUgPSBmdW5jdGlvbihwYWlyLCBpc0FjdGl2ZSwgdGltZXN0YW1wKSB7XG4gICAgICAgIGlmIChpc0FjdGl2ZSkge1xuICAgICAgICAgICAgcGFpci5pc0FjdGl2ZSA9IHRydWU7XG4gICAgICAgICAgICBwYWlyLnRpbWVVcGRhdGVkID0gdGltZXN0YW1wO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGFpci5pc0FjdGl2ZSA9IGZhbHNlO1xuICAgICAgICAgICAgcGFpci5hY3RpdmVDb250YWN0cy5sZW5ndGggPSAwO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgaWQgZm9yIHRoZSBnaXZlbiBwYWlyLlxuICAgICAqIEBtZXRob2QgaWRcbiAgICAgKiBAcGFyYW0ge2JvZHl9IGJvZHlBXG4gICAgICogQHBhcmFtIHtib2R5fSBib2R5QlxuICAgICAqIEByZXR1cm4ge3N0cmluZ30gVW5pcXVlIHBhaXJJZFxuICAgICAqL1xuICAgIFBhaXIuaWQgPSBmdW5jdGlvbihib2R5QSwgYm9keUIpIHtcbiAgICAgICAgaWYgKGJvZHlBLmlkIDwgYm9keUIuaWQpIHtcbiAgICAgICAgICAgIHJldHVybiAnQScgKyBib2R5QS5pZCArICdCJyArIGJvZHlCLmlkO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuICdBJyArIGJvZHlCLmlkICsgJ0InICsgYm9keUEuaWQ7XG4gICAgICAgIH1cbiAgICB9O1xuXG59KSgpO1xuXG5cbi8qKiovIH0pLFxuLyogMTAgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuLyoqXG4qIFRoZSBgTWF0dGVyLkNvbnN0cmFpbnRgIG1vZHVsZSBjb250YWlucyBtZXRob2RzIGZvciBjcmVhdGluZyBhbmQgbWFuaXB1bGF0aW5nIGNvbnN0cmFpbnRzLlxuKiBDb25zdHJhaW50cyBhcmUgdXNlZCBmb3Igc3BlY2lmeWluZyB0aGF0IGEgZml4ZWQgZGlzdGFuY2UgbXVzdCBiZSBtYWludGFpbmVkIGJldHdlZW4gdHdvIGJvZGllcyAob3IgYSBib2R5IGFuZCBhIGZpeGVkIHdvcmxkLXNwYWNlIHBvc2l0aW9uKS5cbiogVGhlIHN0aWZmbmVzcyBvZiBjb25zdHJhaW50cyBjYW4gYmUgbW9kaWZpZWQgdG8gY3JlYXRlIHNwcmluZ3Mgb3IgZWxhc3RpYy5cbipcbiogU2VlIHRoZSBpbmNsdWRlZCB1c2FnZSBbZXhhbXBsZXNdKGh0dHBzOi8vZ2l0aHViLmNvbS9saWFicnUvbWF0dGVyLWpzL3RyZWUvbWFzdGVyL2V4YW1wbGVzKS5cbipcbiogQGNsYXNzIENvbnN0cmFpbnRcbiovXG5cbnZhciBDb25zdHJhaW50ID0ge307XG5cbm1vZHVsZS5leHBvcnRzID0gQ29uc3RyYWludDtcblxudmFyIFZlcnRpY2VzID0gX193ZWJwYWNrX3JlcXVpcmVfXygzKTtcbnZhciBWZWN0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIpO1xudmFyIFNsZWVwaW5nID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3KTtcbnZhciBCb3VuZHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpO1xudmFyIEF4ZXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDExKTtcbnZhciBDb21tb24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDApO1xuXG4oZnVuY3Rpb24oKSB7XG5cbiAgICBDb25zdHJhaW50Ll93YXJtaW5nID0gMC40O1xuICAgIENvbnN0cmFpbnQuX3RvcnF1ZURhbXBlbiA9IDE7XG4gICAgQ29uc3RyYWludC5fbWluTGVuZ3RoID0gMC4wMDAwMDE7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IGNvbnN0cmFpbnQuXG4gICAgICogQWxsIHByb3BlcnRpZXMgaGF2ZSBkZWZhdWx0IHZhbHVlcywgYW5kIG1hbnkgYXJlIHByZS1jYWxjdWxhdGVkIGF1dG9tYXRpY2FsbHkgYmFzZWQgb24gb3RoZXIgcHJvcGVydGllcy5cbiAgICAgKiBUbyBzaW11bGF0ZSBhIHJldm9sdXRlIGNvbnN0cmFpbnQgKG9yIHBpbiBqb2ludCkgc2V0IGBsZW5ndGg6IDBgIGFuZCBhIGhpZ2ggYHN0aWZmbmVzc2AgdmFsdWUgKGUuZy4gYDAuN2Agb3IgYWJvdmUpLlxuICAgICAqIElmIHRoZSBjb25zdHJhaW50IGlzIHVuc3RhYmxlLCB0cnkgbG93ZXJpbmcgdGhlIGBzdGlmZm5lc3NgIHZhbHVlIGFuZCAvIG9yIGluY3JlYXNpbmcgYGVuZ2luZS5jb25zdHJhaW50SXRlcmF0aW9uc2AuXG4gICAgICogRm9yIGNvbXBvdW5kIGJvZGllcywgY29uc3RyYWludHMgbXVzdCBiZSBhcHBsaWVkIHRvIHRoZSBwYXJlbnQgYm9keSAobm90IG9uZSBvZiBpdHMgcGFydHMpLlxuICAgICAqIFNlZSB0aGUgcHJvcGVydGllcyBzZWN0aW9uIGJlbG93IGZvciBkZXRhaWxlZCBpbmZvcm1hdGlvbiBvbiB3aGF0IHlvdSBjYW4gcGFzcyB2aWEgdGhlIGBvcHRpb25zYCBvYmplY3QuXG4gICAgICogQG1ldGhvZCBjcmVhdGVcbiAgICAgKiBAcGFyYW0ge30gb3B0aW9uc1xuICAgICAqIEByZXR1cm4ge2NvbnN0cmFpbnR9IGNvbnN0cmFpbnRcbiAgICAgKi9cbiAgICBDb25zdHJhaW50LmNyZWF0ZSA9IGZ1bmN0aW9uKG9wdGlvbnMpIHtcbiAgICAgICAgdmFyIGNvbnN0cmFpbnQgPSBvcHRpb25zO1xuXG4gICAgICAgIC8vIGlmIGJvZGllcyBkZWZpbmVkIGJ1dCBubyBwb2ludHMsIHVzZSBib2R5IGNlbnRyZVxuICAgICAgICBpZiAoY29uc3RyYWludC5ib2R5QSAmJiAhY29uc3RyYWludC5wb2ludEEpXG4gICAgICAgICAgICBjb25zdHJhaW50LnBvaW50QSA9IHsgeDogMCwgeTogMCB9O1xuICAgICAgICBpZiAoY29uc3RyYWludC5ib2R5QiAmJiAhY29uc3RyYWludC5wb2ludEIpXG4gICAgICAgICAgICBjb25zdHJhaW50LnBvaW50QiA9IHsgeDogMCwgeTogMCB9O1xuXG4gICAgICAgIC8vIGNhbGN1bGF0ZSBzdGF0aWMgbGVuZ3RoIHVzaW5nIGluaXRpYWwgd29ybGQgc3BhY2UgcG9pbnRzXG4gICAgICAgIHZhciBpbml0aWFsUG9pbnRBID0gY29uc3RyYWludC5ib2R5QSA/IFZlY3Rvci5hZGQoY29uc3RyYWludC5ib2R5QS5wb3NpdGlvbiwgY29uc3RyYWludC5wb2ludEEpIDogY29uc3RyYWludC5wb2ludEEsXG4gICAgICAgICAgICBpbml0aWFsUG9pbnRCID0gY29uc3RyYWludC5ib2R5QiA/IFZlY3Rvci5hZGQoY29uc3RyYWludC5ib2R5Qi5wb3NpdGlvbiwgY29uc3RyYWludC5wb2ludEIpIDogY29uc3RyYWludC5wb2ludEIsXG4gICAgICAgICAgICBsZW5ndGggPSBWZWN0b3IubWFnbml0dWRlKFZlY3Rvci5zdWIoaW5pdGlhbFBvaW50QSwgaW5pdGlhbFBvaW50QikpO1xuICAgIFxuICAgICAgICBjb25zdHJhaW50Lmxlbmd0aCA9IHR5cGVvZiBjb25zdHJhaW50Lmxlbmd0aCAhPT0gJ3VuZGVmaW5lZCcgPyBjb25zdHJhaW50Lmxlbmd0aCA6IGxlbmd0aDtcblxuICAgICAgICAvLyBvcHRpb24gZGVmYXVsdHNcbiAgICAgICAgY29uc3RyYWludC5pZCA9IGNvbnN0cmFpbnQuaWQgfHwgQ29tbW9uLm5leHRJZCgpO1xuICAgICAgICBjb25zdHJhaW50LmxhYmVsID0gY29uc3RyYWludC5sYWJlbCB8fCAnQ29uc3RyYWludCc7XG4gICAgICAgIGNvbnN0cmFpbnQudHlwZSA9ICdjb25zdHJhaW50JztcbiAgICAgICAgY29uc3RyYWludC5zdGlmZm5lc3MgPSBjb25zdHJhaW50LnN0aWZmbmVzcyB8fCAoY29uc3RyYWludC5sZW5ndGggPiAwID8gMSA6IDAuNyk7XG4gICAgICAgIGNvbnN0cmFpbnQuZGFtcGluZyA9IGNvbnN0cmFpbnQuZGFtcGluZyB8fCAwO1xuICAgICAgICBjb25zdHJhaW50LmFuZ3VsYXJTdGlmZm5lc3MgPSBjb25zdHJhaW50LmFuZ3VsYXJTdGlmZm5lc3MgfHwgMDtcbiAgICAgICAgY29uc3RyYWludC5hbmdsZUEgPSBjb25zdHJhaW50LmJvZHlBID8gY29uc3RyYWludC5ib2R5QS5hbmdsZSA6IGNvbnN0cmFpbnQuYW5nbGVBO1xuICAgICAgICBjb25zdHJhaW50LmFuZ2xlQiA9IGNvbnN0cmFpbnQuYm9keUIgPyBjb25zdHJhaW50LmJvZHlCLmFuZ2xlIDogY29uc3RyYWludC5hbmdsZUI7XG4gICAgICAgIGNvbnN0cmFpbnQucGx1Z2luID0ge307XG5cbiAgICAgICAgLy8gcmVuZGVyXG4gICAgICAgIHZhciByZW5kZXIgPSB7XG4gICAgICAgICAgICB2aXNpYmxlOiB0cnVlLFxuICAgICAgICAgICAgbGluZVdpZHRoOiAyLFxuICAgICAgICAgICAgc3Ryb2tlU3R5bGU6ICcjZmZmZmZmJyxcbiAgICAgICAgICAgIHR5cGU6ICdsaW5lJyxcbiAgICAgICAgICAgIGFuY2hvcnM6IHRydWVcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAoY29uc3RyYWludC5sZW5ndGggPT09IDAgJiYgY29uc3RyYWludC5zdGlmZm5lc3MgPiAwLjEpIHtcbiAgICAgICAgICAgIHJlbmRlci50eXBlID0gJ3Bpbic7XG4gICAgICAgICAgICByZW5kZXIuYW5jaG9ycyA9IGZhbHNlO1xuICAgICAgICB9IGVsc2UgaWYgKGNvbnN0cmFpbnQuc3RpZmZuZXNzIDwgMC45KSB7XG4gICAgICAgICAgICByZW5kZXIudHlwZSA9ICdzcHJpbmcnO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3RyYWludC5yZW5kZXIgPSBDb21tb24uZXh0ZW5kKHJlbmRlciwgY29uc3RyYWludC5yZW5kZXIpO1xuXG4gICAgICAgIHJldHVybiBjb25zdHJhaW50O1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBQcmVwYXJlcyBmb3Igc29sdmluZyBieSBjb25zdHJhaW50IHdhcm1pbmcuXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbWV0aG9kIHByZVNvbHZlQWxsXG4gICAgICogQHBhcmFtIHtib2R5W119IGJvZGllc1xuICAgICAqL1xuICAgIENvbnN0cmFpbnQucHJlU29sdmVBbGwgPSBmdW5jdGlvbihib2RpZXMpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBib2RpZXMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgICAgIHZhciBib2R5ID0gYm9kaWVzW2ldLFxuICAgICAgICAgICAgICAgIGltcHVsc2UgPSBib2R5LmNvbnN0cmFpbnRJbXB1bHNlO1xuXG4gICAgICAgICAgICBpZiAoYm9keS5pc1N0YXRpYyB8fCAoaW1wdWxzZS54ID09PSAwICYmIGltcHVsc2UueSA9PT0gMCAmJiBpbXB1bHNlLmFuZ2xlID09PSAwKSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBib2R5LnBvc2l0aW9uLnggKz0gaW1wdWxzZS54O1xuICAgICAgICAgICAgYm9keS5wb3NpdGlvbi55ICs9IGltcHVsc2UueTtcbiAgICAgICAgICAgIGJvZHkuYW5nbGUgKz0gaW1wdWxzZS5hbmdsZTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBTb2x2ZXMgYWxsIGNvbnN0cmFpbnRzIGluIGEgbGlzdCBvZiBjb2xsaXNpb25zLlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQG1ldGhvZCBzb2x2ZUFsbFxuICAgICAqIEBwYXJhbSB7Y29uc3RyYWludFtdfSBjb25zdHJhaW50c1xuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB0aW1lU2NhbGVcbiAgICAgKi9cbiAgICBDb25zdHJhaW50LnNvbHZlQWxsID0gZnVuY3Rpb24oY29uc3RyYWludHMsIHRpbWVTY2FsZSkge1xuICAgICAgICAvLyBTb2x2ZSBmaXhlZCBjb25zdHJhaW50cyBmaXJzdC5cbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb25zdHJhaW50cy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICAgICAgdmFyIGNvbnN0cmFpbnQgPSBjb25zdHJhaW50c1tpXSxcbiAgICAgICAgICAgICAgICBmaXhlZEEgPSAhY29uc3RyYWludC5ib2R5QSB8fCAoY29uc3RyYWludC5ib2R5QSAmJiBjb25zdHJhaW50LmJvZHlBLmlzU3RhdGljKSxcbiAgICAgICAgICAgICAgICBmaXhlZEIgPSAhY29uc3RyYWludC5ib2R5QiB8fCAoY29uc3RyYWludC5ib2R5QiAmJiBjb25zdHJhaW50LmJvZHlCLmlzU3RhdGljKTtcblxuICAgICAgICAgICAgaWYgKGZpeGVkQSB8fCBmaXhlZEIpIHtcbiAgICAgICAgICAgICAgICBDb25zdHJhaW50LnNvbHZlKGNvbnN0cmFpbnRzW2ldLCB0aW1lU2NhbGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gU29sdmUgZnJlZSBjb25zdHJhaW50cyBsYXN0LlxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY29uc3RyYWludHMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgICAgIGNvbnN0cmFpbnQgPSBjb25zdHJhaW50c1tpXTtcbiAgICAgICAgICAgIGZpeGVkQSA9ICFjb25zdHJhaW50LmJvZHlBIHx8IChjb25zdHJhaW50LmJvZHlBICYmIGNvbnN0cmFpbnQuYm9keUEuaXNTdGF0aWMpO1xuICAgICAgICAgICAgZml4ZWRCID0gIWNvbnN0cmFpbnQuYm9keUIgfHwgKGNvbnN0cmFpbnQuYm9keUIgJiYgY29uc3RyYWludC5ib2R5Qi5pc1N0YXRpYyk7XG5cbiAgICAgICAgICAgIGlmICghZml4ZWRBICYmICFmaXhlZEIpIHtcbiAgICAgICAgICAgICAgICBDb25zdHJhaW50LnNvbHZlKGNvbnN0cmFpbnRzW2ldLCB0aW1lU2NhbGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFNvbHZlcyBhIGRpc3RhbmNlIGNvbnN0cmFpbnQgd2l0aCBHYXVzcy1TaWVkZWwgbWV0aG9kLlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQG1ldGhvZCBzb2x2ZVxuICAgICAqIEBwYXJhbSB7Y29uc3RyYWludH0gY29uc3RyYWludFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB0aW1lU2NhbGVcbiAgICAgKi9cbiAgICBDb25zdHJhaW50LnNvbHZlID0gZnVuY3Rpb24oY29uc3RyYWludCwgdGltZVNjYWxlKSB7XG4gICAgICAgIHZhciBib2R5QSA9IGNvbnN0cmFpbnQuYm9keUEsXG4gICAgICAgICAgICBib2R5QiA9IGNvbnN0cmFpbnQuYm9keUIsXG4gICAgICAgICAgICBwb2ludEEgPSBjb25zdHJhaW50LnBvaW50QSxcbiAgICAgICAgICAgIHBvaW50QiA9IGNvbnN0cmFpbnQucG9pbnRCO1xuXG4gICAgICAgIGlmICghYm9keUEgJiYgIWJvZHlCKVxuICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIC8vIHVwZGF0ZSByZWZlcmVuY2UgYW5nbGVcbiAgICAgICAgaWYgKGJvZHlBICYmICFib2R5QS5pc1N0YXRpYykge1xuICAgICAgICAgICAgVmVjdG9yLnJvdGF0ZShwb2ludEEsIGJvZHlBLmFuZ2xlIC0gY29uc3RyYWludC5hbmdsZUEsIHBvaW50QSk7XG4gICAgICAgICAgICBjb25zdHJhaW50LmFuZ2xlQSA9IGJvZHlBLmFuZ2xlO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyB1cGRhdGUgcmVmZXJlbmNlIGFuZ2xlXG4gICAgICAgIGlmIChib2R5QiAmJiAhYm9keUIuaXNTdGF0aWMpIHtcbiAgICAgICAgICAgIFZlY3Rvci5yb3RhdGUocG9pbnRCLCBib2R5Qi5hbmdsZSAtIGNvbnN0cmFpbnQuYW5nbGVCLCBwb2ludEIpO1xuICAgICAgICAgICAgY29uc3RyYWludC5hbmdsZUIgPSBib2R5Qi5hbmdsZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBwb2ludEFXb3JsZCA9IHBvaW50QSxcbiAgICAgICAgICAgIHBvaW50QldvcmxkID0gcG9pbnRCO1xuXG4gICAgICAgIGlmIChib2R5QSkgcG9pbnRBV29ybGQgPSBWZWN0b3IuYWRkKGJvZHlBLnBvc2l0aW9uLCBwb2ludEEpO1xuICAgICAgICBpZiAoYm9keUIpIHBvaW50QldvcmxkID0gVmVjdG9yLmFkZChib2R5Qi5wb3NpdGlvbiwgcG9pbnRCKTtcblxuICAgICAgICBpZiAoIXBvaW50QVdvcmxkIHx8ICFwb2ludEJXb3JsZClcbiAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICB2YXIgZGVsdGEgPSBWZWN0b3Iuc3ViKHBvaW50QVdvcmxkLCBwb2ludEJXb3JsZCksXG4gICAgICAgICAgICBjdXJyZW50TGVuZ3RoID0gVmVjdG9yLm1hZ25pdHVkZShkZWx0YSk7XG5cbiAgICAgICAgLy8gcHJldmVudCBzaW5ndWxhcml0eVxuICAgICAgICBpZiAoY3VycmVudExlbmd0aCA8IENvbnN0cmFpbnQuX21pbkxlbmd0aCkge1xuICAgICAgICAgICAgY3VycmVudExlbmd0aCA9IENvbnN0cmFpbnQuX21pbkxlbmd0aDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHNvbHZlIGRpc3RhbmNlIGNvbnN0cmFpbnQgd2l0aCBHYXVzcy1TaWVkZWwgbWV0aG9kXG4gICAgICAgIHZhciBkaWZmZXJlbmNlID0gKGN1cnJlbnRMZW5ndGggLSBjb25zdHJhaW50Lmxlbmd0aCkgLyBjdXJyZW50TGVuZ3RoLFxuICAgICAgICAgICAgc3RpZmZuZXNzID0gY29uc3RyYWludC5zdGlmZm5lc3MgPCAxID8gY29uc3RyYWludC5zdGlmZm5lc3MgKiB0aW1lU2NhbGUgOiBjb25zdHJhaW50LnN0aWZmbmVzcyxcbiAgICAgICAgICAgIGZvcmNlID0gVmVjdG9yLm11bHQoZGVsdGEsIGRpZmZlcmVuY2UgKiBzdGlmZm5lc3MpLFxuICAgICAgICAgICAgbWFzc1RvdGFsID0gKGJvZHlBID8gYm9keUEuaW52ZXJzZU1hc3MgOiAwKSArIChib2R5QiA/IGJvZHlCLmludmVyc2VNYXNzIDogMCksXG4gICAgICAgICAgICBpbmVydGlhVG90YWwgPSAoYm9keUEgPyBib2R5QS5pbnZlcnNlSW5lcnRpYSA6IDApICsgKGJvZHlCID8gYm9keUIuaW52ZXJzZUluZXJ0aWEgOiAwKSxcbiAgICAgICAgICAgIHJlc2lzdGFuY2VUb3RhbCA9IG1hc3NUb3RhbCArIGluZXJ0aWFUb3RhbCxcbiAgICAgICAgICAgIHRvcnF1ZSxcbiAgICAgICAgICAgIHNoYXJlLFxuICAgICAgICAgICAgbm9ybWFsLFxuICAgICAgICAgICAgbm9ybWFsVmVsb2NpdHksXG4gICAgICAgICAgICByZWxhdGl2ZVZlbG9jaXR5O1xuXG4gICAgICAgIGlmIChjb25zdHJhaW50LmRhbXBpbmcpIHtcbiAgICAgICAgICAgIHZhciB6ZXJvID0gVmVjdG9yLmNyZWF0ZSgpO1xuICAgICAgICAgICAgbm9ybWFsID0gVmVjdG9yLmRpdihkZWx0YSwgY3VycmVudExlbmd0aCk7XG5cbiAgICAgICAgICAgIHJlbGF0aXZlVmVsb2NpdHkgPSBWZWN0b3Iuc3ViKFxuICAgICAgICAgICAgICAgIGJvZHlCICYmIFZlY3Rvci5zdWIoYm9keUIucG9zaXRpb24sIGJvZHlCLnBvc2l0aW9uUHJldikgfHwgemVybyxcbiAgICAgICAgICAgICAgICBib2R5QSAmJiBWZWN0b3Iuc3ViKGJvZHlBLnBvc2l0aW9uLCBib2R5QS5wb3NpdGlvblByZXYpIHx8IHplcm9cbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIG5vcm1hbFZlbG9jaXR5ID0gVmVjdG9yLmRvdChub3JtYWwsIHJlbGF0aXZlVmVsb2NpdHkpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGJvZHlBICYmICFib2R5QS5pc1N0YXRpYykge1xuICAgICAgICAgICAgc2hhcmUgPSBib2R5QS5pbnZlcnNlTWFzcyAvIG1hc3NUb3RhbDtcblxuICAgICAgICAgICAgLy8ga2VlcCB0cmFjayBvZiBhcHBsaWVkIGltcHVsc2VzIGZvciBwb3N0IHNvbHZpbmdcbiAgICAgICAgICAgIGJvZHlBLmNvbnN0cmFpbnRJbXB1bHNlLnggLT0gZm9yY2UueCAqIHNoYXJlO1xuICAgICAgICAgICAgYm9keUEuY29uc3RyYWludEltcHVsc2UueSAtPSBmb3JjZS55ICogc2hhcmU7XG5cbiAgICAgICAgICAgIC8vIGFwcGx5IGZvcmNlc1xuICAgICAgICAgICAgYm9keUEucG9zaXRpb24ueCAtPSBmb3JjZS54ICogc2hhcmU7XG4gICAgICAgICAgICBib2R5QS5wb3NpdGlvbi55IC09IGZvcmNlLnkgKiBzaGFyZTtcblxuICAgICAgICAgICAgLy8gYXBwbHkgZGFtcGluZ1xuICAgICAgICAgICAgaWYgKGNvbnN0cmFpbnQuZGFtcGluZykge1xuICAgICAgICAgICAgICAgIGJvZHlBLnBvc2l0aW9uUHJldi54IC09IGNvbnN0cmFpbnQuZGFtcGluZyAqIG5vcm1hbC54ICogbm9ybWFsVmVsb2NpdHkgKiBzaGFyZTtcbiAgICAgICAgICAgICAgICBib2R5QS5wb3NpdGlvblByZXYueSAtPSBjb25zdHJhaW50LmRhbXBpbmcgKiBub3JtYWwueSAqIG5vcm1hbFZlbG9jaXR5ICogc2hhcmU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGFwcGx5IHRvcnF1ZVxuICAgICAgICAgICAgdG9ycXVlID0gKFZlY3Rvci5jcm9zcyhwb2ludEEsIGZvcmNlKSAvIHJlc2lzdGFuY2VUb3RhbCkgKiBDb25zdHJhaW50Ll90b3JxdWVEYW1wZW4gKiBib2R5QS5pbnZlcnNlSW5lcnRpYSAqICgxIC0gY29uc3RyYWludC5hbmd1bGFyU3RpZmZuZXNzKTtcbiAgICAgICAgICAgIGJvZHlBLmNvbnN0cmFpbnRJbXB1bHNlLmFuZ2xlIC09IHRvcnF1ZTtcbiAgICAgICAgICAgIGJvZHlBLmFuZ2xlIC09IHRvcnF1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChib2R5QiAmJiAhYm9keUIuaXNTdGF0aWMpIHtcbiAgICAgICAgICAgIHNoYXJlID0gYm9keUIuaW52ZXJzZU1hc3MgLyBtYXNzVG90YWw7XG5cbiAgICAgICAgICAgIC8vIGtlZXAgdHJhY2sgb2YgYXBwbGllZCBpbXB1bHNlcyBmb3IgcG9zdCBzb2x2aW5nXG4gICAgICAgICAgICBib2R5Qi5jb25zdHJhaW50SW1wdWxzZS54ICs9IGZvcmNlLnggKiBzaGFyZTtcbiAgICAgICAgICAgIGJvZHlCLmNvbnN0cmFpbnRJbXB1bHNlLnkgKz0gZm9yY2UueSAqIHNoYXJlO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBhcHBseSBmb3JjZXNcbiAgICAgICAgICAgIGJvZHlCLnBvc2l0aW9uLnggKz0gZm9yY2UueCAqIHNoYXJlO1xuICAgICAgICAgICAgYm9keUIucG9zaXRpb24ueSArPSBmb3JjZS55ICogc2hhcmU7XG5cbiAgICAgICAgICAgIC8vIGFwcGx5IGRhbXBpbmdcbiAgICAgICAgICAgIGlmIChjb25zdHJhaW50LmRhbXBpbmcpIHtcbiAgICAgICAgICAgICAgICBib2R5Qi5wb3NpdGlvblByZXYueCArPSBjb25zdHJhaW50LmRhbXBpbmcgKiBub3JtYWwueCAqIG5vcm1hbFZlbG9jaXR5ICogc2hhcmU7XG4gICAgICAgICAgICAgICAgYm9keUIucG9zaXRpb25QcmV2LnkgKz0gY29uc3RyYWludC5kYW1waW5nICogbm9ybWFsLnkgKiBub3JtYWxWZWxvY2l0eSAqIHNoYXJlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBhcHBseSB0b3JxdWVcbiAgICAgICAgICAgIHRvcnF1ZSA9IChWZWN0b3IuY3Jvc3MocG9pbnRCLCBmb3JjZSkgLyByZXNpc3RhbmNlVG90YWwpICogQ29uc3RyYWludC5fdG9ycXVlRGFtcGVuICogYm9keUIuaW52ZXJzZUluZXJ0aWEgKiAoMSAtIGNvbnN0cmFpbnQuYW5ndWxhclN0aWZmbmVzcyk7XG4gICAgICAgICAgICBib2R5Qi5jb25zdHJhaW50SW1wdWxzZS5hbmdsZSArPSB0b3JxdWU7XG4gICAgICAgICAgICBib2R5Qi5hbmdsZSArPSB0b3JxdWU7XG4gICAgICAgIH1cblxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBQZXJmb3JtcyBib2R5IHVwZGF0ZXMgcmVxdWlyZWQgYWZ0ZXIgc29sdmluZyBjb25zdHJhaW50cy5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBtZXRob2QgcG9zdFNvbHZlQWxsXG4gICAgICogQHBhcmFtIHtib2R5W119IGJvZGllc1xuICAgICAqL1xuICAgIENvbnN0cmFpbnQucG9zdFNvbHZlQWxsID0gZnVuY3Rpb24oYm9kaWVzKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYm9kaWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgYm9keSA9IGJvZGllc1tpXSxcbiAgICAgICAgICAgICAgICBpbXB1bHNlID0gYm9keS5jb25zdHJhaW50SW1wdWxzZTtcblxuICAgICAgICAgICAgaWYgKGJvZHkuaXNTdGF0aWMgfHwgKGltcHVsc2UueCA9PT0gMCAmJiBpbXB1bHNlLnkgPT09IDAgJiYgaW1wdWxzZS5hbmdsZSA9PT0gMCkpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgU2xlZXBpbmcuc2V0KGJvZHksIGZhbHNlKTtcblxuICAgICAgICAgICAgLy8gdXBkYXRlIGdlb21ldHJ5IGFuZCByZXNldFxuICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBib2R5LnBhcnRzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgdmFyIHBhcnQgPSBib2R5LnBhcnRzW2pdO1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIFZlcnRpY2VzLnRyYW5zbGF0ZShwYXJ0LnZlcnRpY2VzLCBpbXB1bHNlKTtcblxuICAgICAgICAgICAgICAgIGlmIChqID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBwYXJ0LnBvc2l0aW9uLnggKz0gaW1wdWxzZS54O1xuICAgICAgICAgICAgICAgICAgICBwYXJ0LnBvc2l0aW9uLnkgKz0gaW1wdWxzZS55O1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChpbXB1bHNlLmFuZ2xlICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIFZlcnRpY2VzLnJvdGF0ZShwYXJ0LnZlcnRpY2VzLCBpbXB1bHNlLmFuZ2xlLCBib2R5LnBvc2l0aW9uKTtcbiAgICAgICAgICAgICAgICAgICAgQXhlcy5yb3RhdGUocGFydC5heGVzLCBpbXB1bHNlLmFuZ2xlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGogPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3Iucm90YXRlQWJvdXQocGFydC5wb3NpdGlvbiwgaW1wdWxzZS5hbmdsZSwgYm9keS5wb3NpdGlvbiwgcGFydC5wb3NpdGlvbik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBCb3VuZHMudXBkYXRlKHBhcnQuYm91bmRzLCBwYXJ0LnZlcnRpY2VzLCBib2R5LnZlbG9jaXR5KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gZGFtcGVuIHRoZSBjYWNoZWQgaW1wdWxzZSBmb3Igd2FybWluZyBuZXh0IHN0ZXBcbiAgICAgICAgICAgIGltcHVsc2UuYW5nbGUgKj0gQ29uc3RyYWludC5fd2FybWluZztcbiAgICAgICAgICAgIGltcHVsc2UueCAqPSBDb25zdHJhaW50Ll93YXJtaW5nO1xuICAgICAgICAgICAgaW1wdWxzZS55ICo9IENvbnN0cmFpbnQuX3dhcm1pbmc7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgd29ybGQtc3BhY2UgcG9zaXRpb24gb2YgYGNvbnN0cmFpbnQucG9pbnRBYCwgYWNjb3VudGluZyBmb3IgYGNvbnN0cmFpbnQuYm9keUFgLlxuICAgICAqIEBtZXRob2QgcG9pbnRBV29ybGRcbiAgICAgKiBAcGFyYW0ge2NvbnN0cmFpbnR9IGNvbnN0cmFpbnRcbiAgICAgKiBAcmV0dXJucyB7dmVjdG9yfSB0aGUgd29ybGQtc3BhY2UgcG9zaXRpb25cbiAgICAgKi9cbiAgICBDb25zdHJhaW50LnBvaW50QVdvcmxkID0gZnVuY3Rpb24oY29uc3RyYWludCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgeDogKGNvbnN0cmFpbnQuYm9keUEgPyBjb25zdHJhaW50LmJvZHlBLnBvc2l0aW9uLnggOiAwKSArIGNvbnN0cmFpbnQucG9pbnRBLngsXG4gICAgICAgICAgICB5OiAoY29uc3RyYWludC5ib2R5QSA/IGNvbnN0cmFpbnQuYm9keUEucG9zaXRpb24ueSA6IDApICsgY29uc3RyYWludC5wb2ludEEueVxuICAgICAgICB9O1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSB3b3JsZC1zcGFjZSBwb3NpdGlvbiBvZiBgY29uc3RyYWludC5wb2ludEJgLCBhY2NvdW50aW5nIGZvciBgY29uc3RyYWludC5ib2R5QmAuXG4gICAgICogQG1ldGhvZCBwb2ludEJXb3JsZFxuICAgICAqIEBwYXJhbSB7Y29uc3RyYWludH0gY29uc3RyYWludFxuICAgICAqIEByZXR1cm5zIHt2ZWN0b3J9IHRoZSB3b3JsZC1zcGFjZSBwb3NpdGlvblxuICAgICAqL1xuICAgIENvbnN0cmFpbnQucG9pbnRCV29ybGQgPSBmdW5jdGlvbihjb25zdHJhaW50KSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB4OiAoY29uc3RyYWludC5ib2R5QiA/IGNvbnN0cmFpbnQuYm9keUIucG9zaXRpb24ueCA6IDApICsgY29uc3RyYWludC5wb2ludEIueCxcbiAgICAgICAgICAgIHk6IChjb25zdHJhaW50LmJvZHlCID8gY29uc3RyYWludC5ib2R5Qi5wb3NpdGlvbi55IDogMCkgKyBjb25zdHJhaW50LnBvaW50Qi55XG4gICAgICAgIH07XG4gICAgfTtcblxuICAgIC8qXG4gICAgKlxuICAgICogIFByb3BlcnRpZXMgRG9jdW1lbnRhdGlvblxuICAgICpcbiAgICAqL1xuXG4gICAgLyoqXG4gICAgICogQW4gaW50ZWdlciBgTnVtYmVyYCB1bmlxdWVseSBpZGVudGlmeWluZyBudW1iZXIgZ2VuZXJhdGVkIGluIGBDb21wb3NpdGUuY3JlYXRlYCBieSBgQ29tbW9uLm5leHRJZGAuXG4gICAgICpcbiAgICAgKiBAcHJvcGVydHkgaWRcbiAgICAgKiBAdHlwZSBudW1iZXJcbiAgICAgKi9cblxuICAgIC8qKlxuICAgICAqIEEgYFN0cmluZ2AgZGVub3RpbmcgdGhlIHR5cGUgb2Ygb2JqZWN0LlxuICAgICAqXG4gICAgICogQHByb3BlcnR5IHR5cGVcbiAgICAgKiBAdHlwZSBzdHJpbmdcbiAgICAgKiBAZGVmYXVsdCBcImNvbnN0cmFpbnRcIlxuICAgICAqIEByZWFkT25seVxuICAgICAqL1xuXG4gICAgLyoqXG4gICAgICogQW4gYXJiaXRyYXJ5IGBTdHJpbmdgIG5hbWUgdG8gaGVscCB0aGUgdXNlciBpZGVudGlmeSBhbmQgbWFuYWdlIGJvZGllcy5cbiAgICAgKlxuICAgICAqIEBwcm9wZXJ0eSBsYWJlbFxuICAgICAqIEB0eXBlIHN0cmluZ1xuICAgICAqIEBkZWZhdWx0IFwiQ29uc3RyYWludFwiXG4gICAgICovXG5cbiAgICAvKipcbiAgICAgKiBBbiBgT2JqZWN0YCB0aGF0IGRlZmluZXMgdGhlIHJlbmRlcmluZyBwcm9wZXJ0aWVzIHRvIGJlIGNvbnN1bWVkIGJ5IHRoZSBtb2R1bGUgYE1hdHRlci5SZW5kZXJgLlxuICAgICAqXG4gICAgICogQHByb3BlcnR5IHJlbmRlclxuICAgICAqIEB0eXBlIG9iamVjdFxuICAgICAqL1xuXG4gICAgLyoqXG4gICAgICogQSBmbGFnIHRoYXQgaW5kaWNhdGVzIGlmIHRoZSBjb25zdHJhaW50IHNob3VsZCBiZSByZW5kZXJlZC5cbiAgICAgKlxuICAgICAqIEBwcm9wZXJ0eSByZW5kZXIudmlzaWJsZVxuICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgKiBAZGVmYXVsdCB0cnVlXG4gICAgICovXG5cbiAgICAvKipcbiAgICAgKiBBIGBOdW1iZXJgIHRoYXQgZGVmaW5lcyB0aGUgbGluZSB3aWR0aCB0byB1c2Ugd2hlbiByZW5kZXJpbmcgdGhlIGNvbnN0cmFpbnQgb3V0bGluZS5cbiAgICAgKiBBIHZhbHVlIG9mIGAwYCBtZWFucyBubyBvdXRsaW5lIHdpbGwgYmUgcmVuZGVyZWQuXG4gICAgICpcbiAgICAgKiBAcHJvcGVydHkgcmVuZGVyLmxpbmVXaWR0aFxuICAgICAqIEB0eXBlIG51bWJlclxuICAgICAqIEBkZWZhdWx0IDJcbiAgICAgKi9cblxuICAgIC8qKlxuICAgICAqIEEgYFN0cmluZ2AgdGhhdCBkZWZpbmVzIHRoZSBzdHJva2Ugc3R5bGUgdG8gdXNlIHdoZW4gcmVuZGVyaW5nIHRoZSBjb25zdHJhaW50IG91dGxpbmUuXG4gICAgICogSXQgaXMgdGhlIHNhbWUgYXMgd2hlbiB1c2luZyBhIGNhbnZhcywgc28gaXQgYWNjZXB0cyBDU1Mgc3R5bGUgcHJvcGVydHkgdmFsdWVzLlxuICAgICAqXG4gICAgICogQHByb3BlcnR5IHJlbmRlci5zdHJva2VTdHlsZVxuICAgICAqIEB0eXBlIHN0cmluZ1xuICAgICAqIEBkZWZhdWx0IGEgcmFuZG9tIGNvbG91clxuICAgICAqL1xuXG4gICAgLyoqXG4gICAgICogQSBgU3RyaW5nYCB0aGF0IGRlZmluZXMgdGhlIGNvbnN0cmFpbnQgcmVuZGVyaW5nIHR5cGUuIFxuICAgICAqIFRoZSBwb3NzaWJsZSB2YWx1ZXMgYXJlICdsaW5lJywgJ3BpbicsICdzcHJpbmcnLlxuICAgICAqIEFuIGFwcHJvcHJpYXRlIHJlbmRlciB0eXBlIHdpbGwgYmUgYXV0b21hdGljYWxseSBjaG9zZW4gdW5sZXNzIG9uZSBpcyBnaXZlbiBpbiBvcHRpb25zLlxuICAgICAqXG4gICAgICogQHByb3BlcnR5IHJlbmRlci50eXBlXG4gICAgICogQHR5cGUgc3RyaW5nXG4gICAgICogQGRlZmF1bHQgJ2xpbmUnXG4gICAgICovXG5cbiAgICAvKipcbiAgICAgKiBBIGBCb29sZWFuYCB0aGF0IGRlZmluZXMgaWYgdGhlIGNvbnN0cmFpbnQncyBhbmNob3IgcG9pbnRzIHNob3VsZCBiZSByZW5kZXJlZC5cbiAgICAgKlxuICAgICAqIEBwcm9wZXJ0eSByZW5kZXIuYW5jaG9yc1xuICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgKiBAZGVmYXVsdCB0cnVlXG4gICAgICovXG5cbiAgICAvKipcbiAgICAgKiBUaGUgZmlyc3QgcG9zc2libGUgYEJvZHlgIHRoYXQgdGhpcyBjb25zdHJhaW50IGlzIGF0dGFjaGVkIHRvLlxuICAgICAqXG4gICAgICogQHByb3BlcnR5IGJvZHlBXG4gICAgICogQHR5cGUgYm9keVxuICAgICAqIEBkZWZhdWx0IG51bGxcbiAgICAgKi9cblxuICAgIC8qKlxuICAgICAqIFRoZSBzZWNvbmQgcG9zc2libGUgYEJvZHlgIHRoYXQgdGhpcyBjb25zdHJhaW50IGlzIGF0dGFjaGVkIHRvLlxuICAgICAqXG4gICAgICogQHByb3BlcnR5IGJvZHlCXG4gICAgICogQHR5cGUgYm9keVxuICAgICAqIEBkZWZhdWx0IG51bGxcbiAgICAgKi9cblxuICAgIC8qKlxuICAgICAqIEEgYFZlY3RvcmAgdGhhdCBzcGVjaWZpZXMgdGhlIG9mZnNldCBvZiB0aGUgY29uc3RyYWludCBmcm9tIGNlbnRlciBvZiB0aGUgYGNvbnN0cmFpbnQuYm9keUFgIGlmIGRlZmluZWQsIG90aGVyd2lzZSBhIHdvcmxkLXNwYWNlIHBvc2l0aW9uLlxuICAgICAqXG4gICAgICogQHByb3BlcnR5IHBvaW50QVxuICAgICAqIEB0eXBlIHZlY3RvclxuICAgICAqIEBkZWZhdWx0IHsgeDogMCwgeTogMCB9XG4gICAgICovXG5cbiAgICAvKipcbiAgICAgKiBBIGBWZWN0b3JgIHRoYXQgc3BlY2lmaWVzIHRoZSBvZmZzZXQgb2YgdGhlIGNvbnN0cmFpbnQgZnJvbSBjZW50ZXIgb2YgdGhlIGBjb25zdHJhaW50LmJvZHlCYCBpZiBkZWZpbmVkLCBvdGhlcndpc2UgYSB3b3JsZC1zcGFjZSBwb3NpdGlvbi5cbiAgICAgKlxuICAgICAqIEBwcm9wZXJ0eSBwb2ludEJcbiAgICAgKiBAdHlwZSB2ZWN0b3JcbiAgICAgKiBAZGVmYXVsdCB7IHg6IDAsIHk6IDAgfVxuICAgICAqL1xuXG4gICAgLyoqXG4gICAgICogQSBgTnVtYmVyYCB0aGF0IHNwZWNpZmllcyB0aGUgc3RpZmZuZXNzIG9mIHRoZSBjb25zdHJhaW50LCBpLmUuIHRoZSByYXRlIGF0IHdoaWNoIGl0IHJldHVybnMgdG8gaXRzIHJlc3RpbmcgYGNvbnN0cmFpbnQubGVuZ3RoYC5cbiAgICAgKiBBIHZhbHVlIG9mIGAxYCBtZWFucyB0aGUgY29uc3RyYWludCBzaG91bGQgYmUgdmVyeSBzdGlmZi5cbiAgICAgKiBBIHZhbHVlIG9mIGAwLjJgIG1lYW5zIHRoZSBjb25zdHJhaW50IGFjdHMgbGlrZSBhIHNvZnQgc3ByaW5nLlxuICAgICAqXG4gICAgICogQHByb3BlcnR5IHN0aWZmbmVzc1xuICAgICAqIEB0eXBlIG51bWJlclxuICAgICAqIEBkZWZhdWx0IDFcbiAgICAgKi9cblxuICAgIC8qKlxuICAgICAqIEEgYE51bWJlcmAgdGhhdCBzcGVjaWZpZXMgdGhlIGRhbXBpbmcgb2YgdGhlIGNvbnN0cmFpbnQsIFxuICAgICAqIGkuZS4gdGhlIGFtb3VudCBvZiByZXNpc3RhbmNlIGFwcGxpZWQgdG8gZWFjaCBib2R5IGJhc2VkIG9uIHRoZWlyIHZlbG9jaXRpZXMgdG8gbGltaXQgdGhlIGFtb3VudCBvZiBvc2NpbGxhdGlvbi5cbiAgICAgKiBEYW1waW5nIHdpbGwgb25seSBiZSBhcHBhcmVudCB3aGVuIHRoZSBjb25zdHJhaW50IGFsc28gaGFzIGEgdmVyeSBsb3cgYHN0aWZmbmVzc2AuXG4gICAgICogQSB2YWx1ZSBvZiBgMC4xYCBtZWFucyB0aGUgY29uc3RyYWludCB3aWxsIGFwcGx5IGhlYXZ5IGRhbXBpbmcsIHJlc3VsdGluZyBpbiBsaXR0bGUgdG8gbm8gb3NjaWxsYXRpb24uXG4gICAgICogQSB2YWx1ZSBvZiBgMGAgbWVhbnMgdGhlIGNvbnN0cmFpbnQgd2lsbCBhcHBseSBubyBkYW1waW5nLlxuICAgICAqXG4gICAgICogQHByb3BlcnR5IGRhbXBpbmdcbiAgICAgKiBAdHlwZSBudW1iZXJcbiAgICAgKiBAZGVmYXVsdCAwXG4gICAgICovXG5cbiAgICAvKipcbiAgICAgKiBBIGBOdW1iZXJgIHRoYXQgc3BlY2lmaWVzIHRoZSB0YXJnZXQgcmVzdGluZyBsZW5ndGggb2YgdGhlIGNvbnN0cmFpbnQuIFxuICAgICAqIEl0IGlzIGNhbGN1bGF0ZWQgYXV0b21hdGljYWxseSBpbiBgQ29uc3RyYWludC5jcmVhdGVgIGZyb20gaW5pdGlhbCBwb3NpdGlvbnMgb2YgdGhlIGBjb25zdHJhaW50LmJvZHlBYCBhbmQgYGNvbnN0cmFpbnQuYm9keUJgLlxuICAgICAqXG4gICAgICogQHByb3BlcnR5IGxlbmd0aFxuICAgICAqIEB0eXBlIG51bWJlclxuICAgICAqL1xuXG4gICAgLyoqXG4gICAgICogQW4gb2JqZWN0IHJlc2VydmVkIGZvciBzdG9yaW5nIHBsdWdpbi1zcGVjaWZpYyBwcm9wZXJ0aWVzLlxuICAgICAqXG4gICAgICogQHByb3BlcnR5IHBsdWdpblxuICAgICAqIEB0eXBlIHt9XG4gICAgICovXG5cbn0pKCk7XG5cblxuLyoqKi8gfSksXG4vKiAxMSAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG4vKipcbiogVGhlIGBNYXR0ZXIuQXhlc2AgbW9kdWxlIGNvbnRhaW5zIG1ldGhvZHMgZm9yIGNyZWF0aW5nIGFuZCBtYW5pcHVsYXRpbmcgc2V0cyBvZiBheGVzLlxuKlxuKiBAY2xhc3MgQXhlc1xuKi9cblxudmFyIEF4ZXMgPSB7fTtcblxubW9kdWxlLmV4cG9ydHMgPSBBeGVzO1xuXG52YXIgVmVjdG9yID0gX193ZWJwYWNrX3JlcXVpcmVfXygyKTtcbnZhciBDb21tb24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDApO1xuXG4oZnVuY3Rpb24oKSB7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IHNldCBvZiBheGVzIGZyb20gdGhlIGdpdmVuIHZlcnRpY2VzLlxuICAgICAqIEBtZXRob2QgZnJvbVZlcnRpY2VzXG4gICAgICogQHBhcmFtIHt2ZXJ0aWNlc30gdmVydGljZXNcbiAgICAgKiBAcmV0dXJuIHtheGVzfSBBIG5ldyBheGVzIGZyb20gdGhlIGdpdmVuIHZlcnRpY2VzXG4gICAgICovXG4gICAgQXhlcy5mcm9tVmVydGljZXMgPSBmdW5jdGlvbih2ZXJ0aWNlcykge1xuICAgICAgICB2YXIgYXhlcyA9IHt9O1xuXG4gICAgICAgIC8vIGZpbmQgdGhlIHVuaXF1ZSBheGVzLCB1c2luZyBlZGdlIG5vcm1hbCBncmFkaWVudHNcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2ZXJ0aWNlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIGogPSAoaSArIDEpICUgdmVydGljZXMubGVuZ3RoLCBcbiAgICAgICAgICAgICAgICBub3JtYWwgPSBWZWN0b3Iubm9ybWFsaXNlKHsgXG4gICAgICAgICAgICAgICAgICAgIHg6IHZlcnRpY2VzW2pdLnkgLSB2ZXJ0aWNlc1tpXS55LCBcbiAgICAgICAgICAgICAgICAgICAgeTogdmVydGljZXNbaV0ueCAtIHZlcnRpY2VzW2pdLnhcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICBncmFkaWVudCA9IChub3JtYWwueSA9PT0gMCkgPyBJbmZpbml0eSA6IChub3JtYWwueCAvIG5vcm1hbC55KTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gbGltaXQgcHJlY2lzaW9uXG4gICAgICAgICAgICBncmFkaWVudCA9IGdyYWRpZW50LnRvRml4ZWQoMykudG9TdHJpbmcoKTtcbiAgICAgICAgICAgIGF4ZXNbZ3JhZGllbnRdID0gbm9ybWFsO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIENvbW1vbi52YWx1ZXMoYXhlcyk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFJvdGF0ZXMgYSBzZXQgb2YgYXhlcyBieSB0aGUgZ2l2ZW4gYW5nbGUuXG4gICAgICogQG1ldGhvZCByb3RhdGVcbiAgICAgKiBAcGFyYW0ge2F4ZXN9IGF4ZXNcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gYW5nbGVcbiAgICAgKi9cbiAgICBBeGVzLnJvdGF0ZSA9IGZ1bmN0aW9uKGF4ZXMsIGFuZ2xlKSB7XG4gICAgICAgIGlmIChhbmdsZSA9PT0gMClcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgXG4gICAgICAgIHZhciBjb3MgPSBNYXRoLmNvcyhhbmdsZSksXG4gICAgICAgICAgICBzaW4gPSBNYXRoLnNpbihhbmdsZSk7XG5cbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBheGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgYXhpcyA9IGF4ZXNbaV0sXG4gICAgICAgICAgICAgICAgeHg7XG4gICAgICAgICAgICB4eCA9IGF4aXMueCAqIGNvcyAtIGF4aXMueSAqIHNpbjtcbiAgICAgICAgICAgIGF4aXMueSA9IGF4aXMueCAqIHNpbiArIGF4aXMueSAqIGNvcztcbiAgICAgICAgICAgIGF4aXMueCA9IHh4O1xuICAgICAgICB9XG4gICAgfTtcblxufSkoKTtcblxuXG4vKioqLyB9KSxcbi8qIDEyICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cbi8qKlxuKiBUaGUgYE1hdHRlci5Cb2RpZXNgIG1vZHVsZSBjb250YWlucyBmYWN0b3J5IG1ldGhvZHMgZm9yIGNyZWF0aW5nIHJpZ2lkIGJvZHkgbW9kZWxzIFxuKiB3aXRoIGNvbW1vbmx5IHVzZWQgYm9keSBjb25maWd1cmF0aW9ucyAoc3VjaCBhcyByZWN0YW5nbGVzLCBjaXJjbGVzIGFuZCBvdGhlciBwb2x5Z29ucykuXG4qXG4qIFNlZSB0aGUgaW5jbHVkZWQgdXNhZ2UgW2V4YW1wbGVzXShodHRwczovL2dpdGh1Yi5jb20vbGlhYnJ1L21hdHRlci1qcy90cmVlL21hc3Rlci9leGFtcGxlcykuXG4qXG4qIEBjbGFzcyBCb2RpZXNcbiovXG5cbi8vIFRPRE86IHRydWUgY2lyY2xlIGJvZGllc1xuXG52YXIgQm9kaWVzID0ge307XG5cbm1vZHVsZS5leHBvcnRzID0gQm9kaWVzO1xuXG52YXIgVmVydGljZXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMpO1xudmFyIENvbW1vbiA9IF9fd2VicGFja19yZXF1aXJlX18oMCk7XG52YXIgQm9keSA9IF9fd2VicGFja19yZXF1aXJlX18oNik7XG52YXIgQm91bmRzID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKTtcbnZhciBWZWN0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIpO1xuXG4oZnVuY3Rpb24oKSB7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IHJpZ2lkIGJvZHkgbW9kZWwgd2l0aCBhIHJlY3RhbmdsZSBodWxsLiBcbiAgICAgKiBUaGUgb3B0aW9ucyBwYXJhbWV0ZXIgaXMgYW4gb2JqZWN0IHRoYXQgc3BlY2lmaWVzIGFueSBwcm9wZXJ0aWVzIHlvdSB3aXNoIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0cy5cbiAgICAgKiBTZWUgdGhlIHByb3BlcnRpZXMgc2VjdGlvbiBvZiB0aGUgYE1hdHRlci5Cb2R5YCBtb2R1bGUgZm9yIGRldGFpbGVkIGluZm9ybWF0aW9uIG9uIHdoYXQgeW91IGNhbiBwYXNzIHZpYSB0aGUgYG9wdGlvbnNgIG9iamVjdC5cbiAgICAgKiBAbWV0aG9kIHJlY3RhbmdsZVxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB4XG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHlcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gd2lkdGhcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gaGVpZ2h0XG4gICAgICogQHBhcmFtIHtvYmplY3R9IFtvcHRpb25zXVxuICAgICAqIEByZXR1cm4ge2JvZHl9IEEgbmV3IHJlY3RhbmdsZSBib2R5XG4gICAgICovXG4gICAgQm9kaWVzLnJlY3RhbmdsZSA9IGZ1bmN0aW9uKHgsIHksIHdpZHRoLCBoZWlnaHQsIG9wdGlvbnMpIHtcbiAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgICAgICAgdmFyIHJlY3RhbmdsZSA9IHsgXG4gICAgICAgICAgICBsYWJlbDogJ1JlY3RhbmdsZSBCb2R5JyxcbiAgICAgICAgICAgIHBvc2l0aW9uOiB7IHg6IHgsIHk6IHkgfSxcbiAgICAgICAgICAgIHZlcnRpY2VzOiBWZXJ0aWNlcy5mcm9tUGF0aCgnTCAwIDAgTCAnICsgd2lkdGggKyAnIDAgTCAnICsgd2lkdGggKyAnICcgKyBoZWlnaHQgKyAnIEwgMCAnICsgaGVpZ2h0KVxuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChvcHRpb25zLmNoYW1mZXIpIHtcbiAgICAgICAgICAgIHZhciBjaGFtZmVyID0gb3B0aW9ucy5jaGFtZmVyO1xuICAgICAgICAgICAgcmVjdGFuZ2xlLnZlcnRpY2VzID0gVmVydGljZXMuY2hhbWZlcihyZWN0YW5nbGUudmVydGljZXMsIGNoYW1mZXIucmFkaXVzLCBcbiAgICAgICAgICAgICAgICBjaGFtZmVyLnF1YWxpdHksIGNoYW1mZXIucXVhbGl0eU1pbiwgY2hhbWZlci5xdWFsaXR5TWF4KTtcbiAgICAgICAgICAgIGRlbGV0ZSBvcHRpb25zLmNoYW1mZXI7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gQm9keS5jcmVhdGUoQ29tbW9uLmV4dGVuZCh7fSwgcmVjdGFuZ2xlLCBvcHRpb25zKSk7XG4gICAgfTtcbiAgICBcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IHJpZ2lkIGJvZHkgbW9kZWwgd2l0aCBhIHRyYXBlem9pZCBodWxsLiBcbiAgICAgKiBUaGUgb3B0aW9ucyBwYXJhbWV0ZXIgaXMgYW4gb2JqZWN0IHRoYXQgc3BlY2lmaWVzIGFueSBwcm9wZXJ0aWVzIHlvdSB3aXNoIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0cy5cbiAgICAgKiBTZWUgdGhlIHByb3BlcnRpZXMgc2VjdGlvbiBvZiB0aGUgYE1hdHRlci5Cb2R5YCBtb2R1bGUgZm9yIGRldGFpbGVkIGluZm9ybWF0aW9uIG9uIHdoYXQgeW91IGNhbiBwYXNzIHZpYSB0aGUgYG9wdGlvbnNgIG9iamVjdC5cbiAgICAgKiBAbWV0aG9kIHRyYXBlem9pZFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB4XG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHlcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gd2lkdGhcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gaGVpZ2h0XG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHNsb3BlXG4gICAgICogQHBhcmFtIHtvYmplY3R9IFtvcHRpb25zXVxuICAgICAqIEByZXR1cm4ge2JvZHl9IEEgbmV3IHRyYXBlem9pZCBib2R5XG4gICAgICovXG4gICAgQm9kaWVzLnRyYXBlem9pZCA9IGZ1bmN0aW9uKHgsIHksIHdpZHRoLCBoZWlnaHQsIHNsb3BlLCBvcHRpb25zKSB7XG4gICAgICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gICAgICAgIHNsb3BlICo9IDAuNTtcbiAgICAgICAgdmFyIHJvb2YgPSAoMSAtIChzbG9wZSAqIDIpKSAqIHdpZHRoO1xuICAgICAgICBcbiAgICAgICAgdmFyIHgxID0gd2lkdGggKiBzbG9wZSxcbiAgICAgICAgICAgIHgyID0geDEgKyByb29mLFxuICAgICAgICAgICAgeDMgPSB4MiArIHgxLFxuICAgICAgICAgICAgdmVydGljZXNQYXRoO1xuXG4gICAgICAgIGlmIChzbG9wZSA8IDAuNSkge1xuICAgICAgICAgICAgdmVydGljZXNQYXRoID0gJ0wgMCAwIEwgJyArIHgxICsgJyAnICsgKC1oZWlnaHQpICsgJyBMICcgKyB4MiArICcgJyArICgtaGVpZ2h0KSArICcgTCAnICsgeDMgKyAnIDAnO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmVydGljZXNQYXRoID0gJ0wgMCAwIEwgJyArIHgyICsgJyAnICsgKC1oZWlnaHQpICsgJyBMICcgKyB4MyArICcgMCc7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgdHJhcGV6b2lkID0geyBcbiAgICAgICAgICAgIGxhYmVsOiAnVHJhcGV6b2lkIEJvZHknLFxuICAgICAgICAgICAgcG9zaXRpb246IHsgeDogeCwgeTogeSB9LFxuICAgICAgICAgICAgdmVydGljZXM6IFZlcnRpY2VzLmZyb21QYXRoKHZlcnRpY2VzUGF0aClcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAob3B0aW9ucy5jaGFtZmVyKSB7XG4gICAgICAgICAgICB2YXIgY2hhbWZlciA9IG9wdGlvbnMuY2hhbWZlcjtcbiAgICAgICAgICAgIHRyYXBlem9pZC52ZXJ0aWNlcyA9IFZlcnRpY2VzLmNoYW1mZXIodHJhcGV6b2lkLnZlcnRpY2VzLCBjaGFtZmVyLnJhZGl1cywgXG4gICAgICAgICAgICAgICAgY2hhbWZlci5xdWFsaXR5LCBjaGFtZmVyLnF1YWxpdHlNaW4sIGNoYW1mZXIucXVhbGl0eU1heCk7XG4gICAgICAgICAgICBkZWxldGUgb3B0aW9ucy5jaGFtZmVyO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIEJvZHkuY3JlYXRlKENvbW1vbi5leHRlbmQoe30sIHRyYXBlem9pZCwgb3B0aW9ucykpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IHJpZ2lkIGJvZHkgbW9kZWwgd2l0aCBhIGNpcmNsZSBodWxsLiBcbiAgICAgKiBUaGUgb3B0aW9ucyBwYXJhbWV0ZXIgaXMgYW4gb2JqZWN0IHRoYXQgc3BlY2lmaWVzIGFueSBwcm9wZXJ0aWVzIHlvdSB3aXNoIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0cy5cbiAgICAgKiBTZWUgdGhlIHByb3BlcnRpZXMgc2VjdGlvbiBvZiB0aGUgYE1hdHRlci5Cb2R5YCBtb2R1bGUgZm9yIGRldGFpbGVkIGluZm9ybWF0aW9uIG9uIHdoYXQgeW91IGNhbiBwYXNzIHZpYSB0aGUgYG9wdGlvbnNgIG9iamVjdC5cbiAgICAgKiBAbWV0aG9kIGNpcmNsZVxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB4XG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHlcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcmFkaXVzXG4gICAgICogQHBhcmFtIHtvYmplY3R9IFtvcHRpb25zXVxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbbWF4U2lkZXNdXG4gICAgICogQHJldHVybiB7Ym9keX0gQSBuZXcgY2lyY2xlIGJvZHlcbiAgICAgKi9cbiAgICBCb2RpZXMuY2lyY2xlID0gZnVuY3Rpb24oeCwgeSwgcmFkaXVzLCBvcHRpb25zLCBtYXhTaWRlcykge1xuICAgICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuICAgICAgICB2YXIgY2lyY2xlID0ge1xuICAgICAgICAgICAgbGFiZWw6ICdDaXJjbGUgQm9keScsXG4gICAgICAgICAgICBjaXJjbGVSYWRpdXM6IHJhZGl1c1xuICAgICAgICB9O1xuICAgICAgICBcbiAgICAgICAgLy8gYXBwcm94aW1hdGUgY2lyY2xlcyB3aXRoIHBvbHlnb25zIHVudGlsIHRydWUgY2lyY2xlcyBpbXBsZW1lbnRlZCBpbiBTQVRcbiAgICAgICAgbWF4U2lkZXMgPSBtYXhTaWRlcyB8fCAyNTtcbiAgICAgICAgdmFyIHNpZGVzID0gTWF0aC5jZWlsKE1hdGgubWF4KDEwLCBNYXRoLm1pbihtYXhTaWRlcywgcmFkaXVzKSkpO1xuXG4gICAgICAgIC8vIG9wdGltaXNhdGlvbjogYWx3YXlzIHVzZSBldmVuIG51bWJlciBvZiBzaWRlcyAoaGFsZiB0aGUgbnVtYmVyIG9mIHVuaXF1ZSBheGVzKVxuICAgICAgICBpZiAoc2lkZXMgJSAyID09PSAxKVxuICAgICAgICAgICAgc2lkZXMgKz0gMTtcblxuICAgICAgICByZXR1cm4gQm9kaWVzLnBvbHlnb24oeCwgeSwgc2lkZXMsIHJhZGl1cywgQ29tbW9uLmV4dGVuZCh7fSwgY2lyY2xlLCBvcHRpb25zKSk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgcmlnaWQgYm9keSBtb2RlbCB3aXRoIGEgcmVndWxhciBwb2x5Z29uIGh1bGwgd2l0aCB0aGUgZ2l2ZW4gbnVtYmVyIG9mIHNpZGVzLiBcbiAgICAgKiBUaGUgb3B0aW9ucyBwYXJhbWV0ZXIgaXMgYW4gb2JqZWN0IHRoYXQgc3BlY2lmaWVzIGFueSBwcm9wZXJ0aWVzIHlvdSB3aXNoIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0cy5cbiAgICAgKiBTZWUgdGhlIHByb3BlcnRpZXMgc2VjdGlvbiBvZiB0aGUgYE1hdHRlci5Cb2R5YCBtb2R1bGUgZm9yIGRldGFpbGVkIGluZm9ybWF0aW9uIG9uIHdoYXQgeW91IGNhbiBwYXNzIHZpYSB0aGUgYG9wdGlvbnNgIG9iamVjdC5cbiAgICAgKiBAbWV0aG9kIHBvbHlnb25cbiAgICAgKiBAcGFyYW0ge251bWJlcn0geFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB5XG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHNpZGVzXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHJhZGl1c1xuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBbb3B0aW9uc11cbiAgICAgKiBAcmV0dXJuIHtib2R5fSBBIG5ldyByZWd1bGFyIHBvbHlnb24gYm9keVxuICAgICAqL1xuICAgIEJvZGllcy5wb2x5Z29uID0gZnVuY3Rpb24oeCwgeSwgc2lkZXMsIHJhZGl1cywgb3B0aW9ucykge1xuICAgICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuICAgICAgICBpZiAoc2lkZXMgPCAzKVxuICAgICAgICAgICAgcmV0dXJuIEJvZGllcy5jaXJjbGUoeCwgeSwgcmFkaXVzLCBvcHRpb25zKTtcblxuICAgICAgICB2YXIgdGhldGEgPSAyICogTWF0aC5QSSAvIHNpZGVzLFxuICAgICAgICAgICAgcGF0aCA9ICcnLFxuICAgICAgICAgICAgb2Zmc2V0ID0gdGhldGEgKiAwLjU7XG5cbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzaWRlczsgaSArPSAxKSB7XG4gICAgICAgICAgICB2YXIgYW5nbGUgPSBvZmZzZXQgKyAoaSAqIHRoZXRhKSxcbiAgICAgICAgICAgICAgICB4eCA9IE1hdGguY29zKGFuZ2xlKSAqIHJhZGl1cyxcbiAgICAgICAgICAgICAgICB5eSA9IE1hdGguc2luKGFuZ2xlKSAqIHJhZGl1cztcblxuICAgICAgICAgICAgcGF0aCArPSAnTCAnICsgeHgudG9GaXhlZCgzKSArICcgJyArIHl5LnRvRml4ZWQoMykgKyAnICc7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgcG9seWdvbiA9IHsgXG4gICAgICAgICAgICBsYWJlbDogJ1BvbHlnb24gQm9keScsXG4gICAgICAgICAgICBwb3NpdGlvbjogeyB4OiB4LCB5OiB5IH0sXG4gICAgICAgICAgICB2ZXJ0aWNlczogVmVydGljZXMuZnJvbVBhdGgocGF0aClcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAob3B0aW9ucy5jaGFtZmVyKSB7XG4gICAgICAgICAgICB2YXIgY2hhbWZlciA9IG9wdGlvbnMuY2hhbWZlcjtcbiAgICAgICAgICAgIHBvbHlnb24udmVydGljZXMgPSBWZXJ0aWNlcy5jaGFtZmVyKHBvbHlnb24udmVydGljZXMsIGNoYW1mZXIucmFkaXVzLCBcbiAgICAgICAgICAgICAgICBjaGFtZmVyLnF1YWxpdHksIGNoYW1mZXIucXVhbGl0eU1pbiwgY2hhbWZlci5xdWFsaXR5TWF4KTtcbiAgICAgICAgICAgIGRlbGV0ZSBvcHRpb25zLmNoYW1mZXI7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gQm9keS5jcmVhdGUoQ29tbW9uLmV4dGVuZCh7fSwgcG9seWdvbiwgb3B0aW9ucykpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBVdGlsaXR5IHRvIGNyZWF0ZSBhIGNvbXBvdW5kIGJvZHkgYmFzZWQgb24gc2V0KHMpIG9mIHZlcnRpY2VzLlxuICAgICAqIFxuICAgICAqIF9Ob3RlOl8gVG8gb3B0aW9uYWxseSBlbmFibGUgYXV0b21hdGljIGNvbmNhdmUgdmVydGljZXMgZGVjb21wb3NpdGlvbiB0aGUgW3BvbHktZGVjb21wXShodHRwczovL2dpdGh1Yi5jb20vc2NodGVwcGUvcG9seS1kZWNvbXAuanMpIFxuICAgICAqIHBhY2thZ2UgbXVzdCBiZSBmaXJzdCBpbnN0YWxsZWQgYW5kIHByb3ZpZGVkIHNlZSBgQ29tbW9uLnNldERlY29tcGAsIG90aGVyd2lzZSB0aGUgY29udmV4IGh1bGwgb2YgZWFjaCB2ZXJ0ZXggc2V0IHdpbGwgYmUgdXNlZC5cbiAgICAgKiBcbiAgICAgKiBUaGUgcmVzdWx0aW5nIHZlcnRpY2VzIGFyZSByZW9yaWVudGF0ZWQgYWJvdXQgdGhlaXIgY2VudHJlIG9mIG1hc3MsXG4gICAgICogYW5kIG9mZnNldCBzdWNoIHRoYXQgYGJvZHkucG9zaXRpb25gIGNvcnJlc3BvbmRzIHRvIHRoaXMgcG9pbnQuXG4gICAgICogXG4gICAgICogVGhlIHJlc3VsdGluZyBvZmZzZXQgbWF5IGJlIGZvdW5kIGlmIG5lZWRlZCBieSBzdWJ0cmFjdGluZyBgYm9keS5ib3VuZHNgIGZyb20gdGhlIG9yaWdpbmFsIGlucHV0IGJvdW5kcy5cbiAgICAgKiBUbyBsYXRlciBtb3ZlIHRoZSBjZW50cmUgb2YgbWFzcyBzZWUgYEJvZHkuc2V0Q2VudHJlYC5cbiAgICAgKiBcbiAgICAgKiBOb3RlIHRoYXQgYXV0b21hdGljIGNvbmNvbmNhdmUgZGVjb21wb3NpdGlvbiByZXN1bHRzIGFyZSBub3QgYWx3YXlzIG9wdGltYWwuIFxuICAgICAqIEZvciBiZXN0IHJlc3VsdHMsIHNpbXBsaWZ5IHRoZSBpbnB1dCB2ZXJ0aWNlcyBhcyBtdWNoIGFzIHBvc3NpYmxlIGZpcnN0LlxuICAgICAqIEJ5IGRlZmF1bHQgdGhpcyBmdW5jdGlvbiBhcHBsaWVzIHNvbWUgYWRkdGlvbmFsIHNpbXBsaWZpY2F0aW9uIHRvIGhlbHAuXG4gICAgICogXG4gICAgICogU29tZSBvdXRwdXRzIG1heSBhbHNvIHJlcXVpcmUgZnVydGhlciBtYW51YWwgcHJvY2Vzc2luZyBhZnRlcndhcmRzIHRvIGJlIHJvYnVzdC5cbiAgICAgKiBJbiBwYXJ0aWN1bGFyIHNvbWUgcGFydHMgbWF5IG5lZWQgdG8gYmUgb3ZlcmxhcHBlZCB0byBhdm9pZCBjb2xsaXNpb24gZ2Fwcy5cbiAgICAgKiBUaGluIHBhcnRzIGFuZCBzaGFycCBwb2ludHMgc2hvdWxkIGJlIGF2b2lkZWQgb3IgcmVtb3ZlZCB3aGVyZSBwb3NzaWJsZS5cbiAgICAgKlxuICAgICAqIFRoZSBvcHRpb25zIHBhcmFtZXRlciBvYmplY3Qgc3BlY2lmaWVzIGFueSBgTWF0dGVyLkJvZHlgIHByb3BlcnRpZXMgeW91IHdpc2ggdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHRzLlxuICAgICAqIFxuICAgICAqIFNlZSB0aGUgcHJvcGVydGllcyBzZWN0aW9uIG9mIHRoZSBgTWF0dGVyLkJvZHlgIG1vZHVsZSBmb3IgZGV0YWlsZWQgaW5mb3JtYXRpb24gb24gd2hhdCB5b3UgY2FuIHBhc3MgdmlhIHRoZSBgb3B0aW9uc2Agb2JqZWN0LlxuICAgICAqIEBtZXRob2QgZnJvbVZlcnRpY2VzXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHhcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geVxuICAgICAqIEBwYXJhbSB7YXJyYXl9IHZlcnRleFNldHMgT25lIG9yIG1vcmUgYXJyYXlzIG9mIHZlcnRleCBwb2ludHMgZS5nLiBgW1t7IHg6IDAsIHk6IDAgfS4uLl0sIC4uLl1gLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBbb3B0aW9uc10gVGhlIGJvZHkgb3B0aW9ucy5cbiAgICAgKiBAcGFyYW0ge2Jvb2x9IFtmbGFnSW50ZXJuYWw9ZmFsc2VdIE9wdGlvbmFsbHkgbWFya3MgaW50ZXJuYWwgZWRnZXMgd2l0aCBgaXNJbnRlcm5hbGAuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtyZW1vdmVDb2xsaW5lYXI9MC4wMV0gVGhyZXNob2xkIHdoZW4gc2ltcGxpZnlpbmcgdmVydGljZXMgYWxvbmcgdGhlIHNhbWUgZWRnZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW21pbmltdW1BcmVhPTEwXSBUaHJlc2hvbGQgd2hlbiByZW1vdmluZyBzbWFsbCBwYXJ0cy5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3JlbW92ZUR1cGxpY2F0ZVBvaW50cz0wLjAxXSBUaHJlc2hvbGQgd2hlbiBzaW1wbGlmeWluZyBuZWFyYnkgdmVydGljZXMuXG4gICAgICogQHJldHVybiB7Ym9keX1cbiAgICAgKi9cbiAgICBCb2RpZXMuZnJvbVZlcnRpY2VzID0gZnVuY3Rpb24oeCwgeSwgdmVydGV4U2V0cywgb3B0aW9ucywgZmxhZ0ludGVybmFsLCByZW1vdmVDb2xsaW5lYXIsIG1pbmltdW1BcmVhLCByZW1vdmVEdXBsaWNhdGVQb2ludHMpIHtcbiAgICAgICAgdmFyIGRlY29tcCA9IENvbW1vbi5nZXREZWNvbXAoKSxcbiAgICAgICAgICAgIGNhbkRlY29tcCxcbiAgICAgICAgICAgIGJvZHksXG4gICAgICAgICAgICBwYXJ0cyxcbiAgICAgICAgICAgIGlzQ29udmV4LFxuICAgICAgICAgICAgaXNDb25jYXZlLFxuICAgICAgICAgICAgdmVydGljZXMsXG4gICAgICAgICAgICBpLFxuICAgICAgICAgICAgaixcbiAgICAgICAgICAgIGssXG4gICAgICAgICAgICB2LFxuICAgICAgICAgICAgejtcblxuICAgICAgICAvLyBjaGVjayBkZWNvbXAgaXMgYXMgZXhwZWN0ZWRcbiAgICAgICAgY2FuRGVjb21wID0gQm9vbGVhbihkZWNvbXAgJiYgZGVjb21wLnF1aWNrRGVjb21wKTtcblxuICAgICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICAgICAgcGFydHMgPSBbXTtcblxuICAgICAgICBmbGFnSW50ZXJuYWwgPSB0eXBlb2YgZmxhZ0ludGVybmFsICE9PSAndW5kZWZpbmVkJyA/IGZsYWdJbnRlcm5hbCA6IGZhbHNlO1xuICAgICAgICByZW1vdmVDb2xsaW5lYXIgPSB0eXBlb2YgcmVtb3ZlQ29sbGluZWFyICE9PSAndW5kZWZpbmVkJyA/IHJlbW92ZUNvbGxpbmVhciA6IDAuMDE7XG4gICAgICAgIG1pbmltdW1BcmVhID0gdHlwZW9mIG1pbmltdW1BcmVhICE9PSAndW5kZWZpbmVkJyA/IG1pbmltdW1BcmVhIDogMTA7XG4gICAgICAgIHJlbW92ZUR1cGxpY2F0ZVBvaW50cyA9IHR5cGVvZiByZW1vdmVEdXBsaWNhdGVQb2ludHMgIT09ICd1bmRlZmluZWQnID8gcmVtb3ZlRHVwbGljYXRlUG9pbnRzIDogMC4wMTtcblxuICAgICAgICAvLyBlbnN1cmUgdmVydGV4U2V0cyBpcyBhbiBhcnJheSBvZiBhcnJheXNcbiAgICAgICAgaWYgKCFDb21tb24uaXNBcnJheSh2ZXJ0ZXhTZXRzWzBdKSkge1xuICAgICAgICAgICAgdmVydGV4U2V0cyA9IFt2ZXJ0ZXhTZXRzXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAodiA9IDA7IHYgPCB2ZXJ0ZXhTZXRzLmxlbmd0aDsgdiArPSAxKSB7XG4gICAgICAgICAgICB2ZXJ0aWNlcyA9IHZlcnRleFNldHNbdl07XG4gICAgICAgICAgICBpc0NvbnZleCA9IFZlcnRpY2VzLmlzQ29udmV4KHZlcnRpY2VzKTtcbiAgICAgICAgICAgIGlzQ29uY2F2ZSA9ICFpc0NvbnZleDtcblxuICAgICAgICAgICAgaWYgKGlzQ29uY2F2ZSAmJiAhY2FuRGVjb21wKSB7XG4gICAgICAgICAgICAgICAgQ29tbW9uLndhcm5PbmNlKFxuICAgICAgICAgICAgICAgICAgICAnQm9kaWVzLmZyb21WZXJ0aWNlczogSW5zdGFsbCB0aGUgXFwncG9seS1kZWNvbXBcXCcgbGlicmFyeSBhbmQgdXNlIENvbW1vbi5zZXREZWNvbXAgb3IgcHJvdmlkZSBcXCdkZWNvbXBcXCcgYXMgYSBnbG9iYWwgdG8gZGVjb21wb3NlIGNvbmNhdmUgdmVydGljZXMuJ1xuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChpc0NvbnZleCB8fCAhY2FuRGVjb21wKSB7XG4gICAgICAgICAgICAgICAgaWYgKGlzQ29udmV4KSB7XG4gICAgICAgICAgICAgICAgICAgIHZlcnRpY2VzID0gVmVydGljZXMuY2xvY2t3aXNlU29ydCh2ZXJ0aWNlcyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gZmFsbGJhY2sgdG8gY29udmV4IGh1bGwgd2hlbiBkZWNvbXBvc2l0aW9uIGlzIG5vdCBwb3NzaWJsZVxuICAgICAgICAgICAgICAgICAgICB2ZXJ0aWNlcyA9IFZlcnRpY2VzLmh1bGwodmVydGljZXMpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHBhcnRzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjogeyB4OiB4LCB5OiB5IH0sXG4gICAgICAgICAgICAgICAgICAgIHZlcnRpY2VzOiB2ZXJ0aWNlc1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBpbml0aWFsaXNlIGEgZGVjb21wb3NpdGlvblxuICAgICAgICAgICAgICAgIHZhciBjb25jYXZlID0gdmVydGljZXMubWFwKGZ1bmN0aW9uKHZlcnRleCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gW3ZlcnRleC54LCB2ZXJ0ZXgueV07XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAvLyB2ZXJ0aWNlcyBhcmUgY29uY2F2ZSBhbmQgc2ltcGxlLCB3ZSBjYW4gZGVjb21wb3NlIGludG8gcGFydHNcbiAgICAgICAgICAgICAgICBkZWNvbXAubWFrZUNDVyhjb25jYXZlKTtcbiAgICAgICAgICAgICAgICBpZiAocmVtb3ZlQ29sbGluZWFyICE9PSBmYWxzZSlcbiAgICAgICAgICAgICAgICAgICAgZGVjb21wLnJlbW92ZUNvbGxpbmVhclBvaW50cyhjb25jYXZlLCByZW1vdmVDb2xsaW5lYXIpO1xuICAgICAgICAgICAgICAgIGlmIChyZW1vdmVEdXBsaWNhdGVQb2ludHMgIT09IGZhbHNlICYmIGRlY29tcC5yZW1vdmVEdXBsaWNhdGVQb2ludHMpXG4gICAgICAgICAgICAgICAgICAgIGRlY29tcC5yZW1vdmVEdXBsaWNhdGVQb2ludHMoY29uY2F2ZSwgcmVtb3ZlRHVwbGljYXRlUG9pbnRzKTtcblxuICAgICAgICAgICAgICAgIC8vIHVzZSB0aGUgcXVpY2sgZGVjb21wb3NpdGlvbiBhbGdvcml0aG0gKEJheWF6aXQpXG4gICAgICAgICAgICAgICAgdmFyIGRlY29tcG9zZWQgPSBkZWNvbXAucXVpY2tEZWNvbXAoY29uY2F2ZSk7XG5cbiAgICAgICAgICAgICAgICAvLyBmb3IgZWFjaCBkZWNvbXBvc2VkIGNodW5rXG4gICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGRlY29tcG9zZWQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGNodW5rID0gZGVjb21wb3NlZFtpXTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBjb252ZXJ0IHZlcnRpY2VzIGludG8gdGhlIGNvcnJlY3Qgc3RydWN0dXJlXG4gICAgICAgICAgICAgICAgICAgIHZhciBjaHVua1ZlcnRpY2VzID0gY2h1bmsubWFwKGZ1bmN0aW9uKHZlcnRpY2VzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHg6IHZlcnRpY2VzWzBdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHk6IHZlcnRpY2VzWzFdXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBza2lwIHNtYWxsIGNodW5rc1xuICAgICAgICAgICAgICAgICAgICBpZiAobWluaW11bUFyZWEgPiAwICYmIFZlcnRpY2VzLmFyZWEoY2h1bmtWZXJ0aWNlcykgPCBtaW5pbXVtQXJlYSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBhIGNvbXBvdW5kIHBhcnRcbiAgICAgICAgICAgICAgICAgICAgcGFydHMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjogVmVydGljZXMuY2VudHJlKGNodW5rVmVydGljZXMpLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmVydGljZXM6IGNodW5rVmVydGljZXNcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gY3JlYXRlIGJvZHkgcGFydHNcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IHBhcnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBwYXJ0c1tpXSA9IEJvZHkuY3JlYXRlKENvbW1vbi5leHRlbmQocGFydHNbaV0sIG9wdGlvbnMpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGZsYWcgaW50ZXJuYWwgZWRnZXMgKGNvaW5jaWRlbnQgcGFydCBlZGdlcylcbiAgICAgICAgaWYgKGZsYWdJbnRlcm5hbCkge1xuICAgICAgICAgICAgdmFyIGNvaW5jaWRlbnRfbWF4X2Rpc3QgPSA1O1xuXG4gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcGFydHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICB2YXIgcGFydEEgPSBwYXJ0c1tpXTtcblxuICAgICAgICAgICAgICAgIGZvciAoaiA9IGkgKyAxOyBqIDwgcGFydHMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHBhcnRCID0gcGFydHNbal07XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKEJvdW5kcy5vdmVybGFwcyhwYXJ0QS5ib3VuZHMsIHBhcnRCLmJvdW5kcykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwYXYgPSBwYXJ0QS52ZXJ0aWNlcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYnYgPSBwYXJ0Qi52ZXJ0aWNlcztcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXRlcmF0ZSB2ZXJ0aWNlcyBvZiBib3RoIHBhcnRzXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgcGFydEEudmVydGljZXMubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHogPSAwOyB6IDwgcGFydEIudmVydGljZXMubGVuZ3RoOyB6KyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmluZCBkaXN0YW5jZXMgYmV0d2VlbiB0aGUgdmVydGljZXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGRhID0gVmVjdG9yLm1hZ25pdHVkZVNxdWFyZWQoVmVjdG9yLnN1YihwYXZbKGsgKyAxKSAlIHBhdi5sZW5ndGhdLCBwYnZbel0pKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRiID0gVmVjdG9yLm1hZ25pdHVkZVNxdWFyZWQoVmVjdG9yLnN1YihwYXZba10sIHBidlsoeiArIDEpICUgcGJ2Lmxlbmd0aF0pKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiBib3RoIHZlcnRpY2VzIGFyZSB2ZXJ5IGNsb3NlLCBjb25zaWRlciB0aGUgZWRnZSBjb25jaWRlbnQgKGludGVybmFsKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGEgPCBjb2luY2lkZW50X21heF9kaXN0ICYmIGRiIDwgY29pbmNpZGVudF9tYXhfZGlzdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF2W2tdLmlzSW50ZXJuYWwgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGJ2W3pdLmlzSW50ZXJuYWwgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocGFydHMubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgLy8gY3JlYXRlIHRoZSBwYXJlbnQgYm9keSB0byBiZSByZXR1cm5lZCwgdGhhdCBjb250YWlucyBnZW5lcmF0ZWQgY29tcG91bmQgcGFydHNcbiAgICAgICAgICAgIGJvZHkgPSBCb2R5LmNyZWF0ZShDb21tb24uZXh0ZW5kKHsgcGFydHM6IHBhcnRzLnNsaWNlKDApIH0sIG9wdGlvbnMpKTtcblxuICAgICAgICAgICAgLy8gb2Zmc2V0IHN1Y2ggdGhhdCBib2R5LnBvc2l0aW9uIGlzIGF0IHRoZSBjZW50cmUgb2ZmIG1hc3NcbiAgICAgICAgICAgIEJvZHkuc2V0UG9zaXRpb24oYm9keSwgeyB4OiB4LCB5OiB5IH0pO1xuXG4gICAgICAgICAgICByZXR1cm4gYm9keTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBwYXJ0c1swXTtcbiAgICAgICAgfVxuICAgIH07XG5cbn0pKCk7XG5cblxuLyoqKi8gfSksXG4vKiAxMyAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG4vKipcbiogVGhlIGBNYXR0ZXIuTW91c2VgIG1vZHVsZSBjb250YWlucyBtZXRob2RzIGZvciBjcmVhdGluZyBhbmQgbWFuaXB1bGF0aW5nIG1vdXNlIGlucHV0cy5cbipcbiogQGNsYXNzIE1vdXNlXG4qL1xuXG52YXIgTW91c2UgPSB7fTtcblxubW9kdWxlLmV4cG9ydHMgPSBNb3VzZTtcblxudmFyIENvbW1vbiA9IF9fd2VicGFja19yZXF1aXJlX18oMCk7XG5cbihmdW5jdGlvbigpIHtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBtb3VzZSBpbnB1dC5cbiAgICAgKiBAbWV0aG9kIGNyZWF0ZVxuICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnRcbiAgICAgKiBAcmV0dXJuIHttb3VzZX0gQSBuZXcgbW91c2VcbiAgICAgKi9cbiAgICBNb3VzZS5jcmVhdGUgPSBmdW5jdGlvbihlbGVtZW50KSB7XG4gICAgICAgIHZhciBtb3VzZSA9IHt9O1xuXG4gICAgICAgIGlmICghZWxlbWVudCkge1xuICAgICAgICAgICAgQ29tbW9uLmxvZygnTW91c2UuY3JlYXRlOiBlbGVtZW50IHdhcyB1bmRlZmluZWQsIGRlZmF1bHRpbmcgdG8gZG9jdW1lbnQuYm9keScsICd3YXJuJyk7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIG1vdXNlLmVsZW1lbnQgPSBlbGVtZW50IHx8IGRvY3VtZW50LmJvZHk7XG4gICAgICAgIG1vdXNlLmFic29sdXRlID0geyB4OiAwLCB5OiAwIH07XG4gICAgICAgIG1vdXNlLnBvc2l0aW9uID0geyB4OiAwLCB5OiAwIH07XG4gICAgICAgIG1vdXNlLm1vdXNlZG93blBvc2l0aW9uID0geyB4OiAwLCB5OiAwIH07XG4gICAgICAgIG1vdXNlLm1vdXNldXBQb3NpdGlvbiA9IHsgeDogMCwgeTogMCB9O1xuICAgICAgICBtb3VzZS5vZmZzZXQgPSB7IHg6IDAsIHk6IDAgfTtcbiAgICAgICAgbW91c2Uuc2NhbGUgPSB7IHg6IDEsIHk6IDEgfTtcbiAgICAgICAgbW91c2Uud2hlZWxEZWx0YSA9IDA7XG4gICAgICAgIG1vdXNlLmJ1dHRvbiA9IC0xO1xuICAgICAgICBtb3VzZS5waXhlbFJhdGlvID0gcGFyc2VJbnQobW91c2UuZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtcGl4ZWwtcmF0aW8nKSwgMTApIHx8IDE7XG5cbiAgICAgICAgbW91c2Uuc291cmNlRXZlbnRzID0ge1xuICAgICAgICAgICAgbW91c2Vtb3ZlOiBudWxsLFxuICAgICAgICAgICAgbW91c2Vkb3duOiBudWxsLFxuICAgICAgICAgICAgbW91c2V1cDogbnVsbCxcbiAgICAgICAgICAgIG1vdXNld2hlZWw6IG51bGxcbiAgICAgICAgfTtcbiAgICAgICAgXG4gICAgICAgIG1vdXNlLm1vdXNlbW92ZSA9IGZ1bmN0aW9uKGV2ZW50KSB7IFxuICAgICAgICAgICAgdmFyIHBvc2l0aW9uID0gTW91c2UuX2dldFJlbGF0aXZlTW91c2VQb3NpdGlvbihldmVudCwgbW91c2UuZWxlbWVudCwgbW91c2UucGl4ZWxSYXRpbyksXG4gICAgICAgICAgICAgICAgdG91Y2hlcyA9IGV2ZW50LmNoYW5nZWRUb3VjaGVzO1xuXG4gICAgICAgICAgICBpZiAodG91Y2hlcykge1xuICAgICAgICAgICAgICAgIG1vdXNlLmJ1dHRvbiA9IDA7XG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbW91c2UuYWJzb2x1dGUueCA9IHBvc2l0aW9uLng7XG4gICAgICAgICAgICBtb3VzZS5hYnNvbHV0ZS55ID0gcG9zaXRpb24ueTtcbiAgICAgICAgICAgIG1vdXNlLnBvc2l0aW9uLnggPSBtb3VzZS5hYnNvbHV0ZS54ICogbW91c2Uuc2NhbGUueCArIG1vdXNlLm9mZnNldC54O1xuICAgICAgICAgICAgbW91c2UucG9zaXRpb24ueSA9IG1vdXNlLmFic29sdXRlLnkgKiBtb3VzZS5zY2FsZS55ICsgbW91c2Uub2Zmc2V0Lnk7XG4gICAgICAgICAgICBtb3VzZS5zb3VyY2VFdmVudHMubW91c2Vtb3ZlID0gZXZlbnQ7XG4gICAgICAgIH07XG4gICAgICAgIFxuICAgICAgICBtb3VzZS5tb3VzZWRvd24gPSBmdW5jdGlvbihldmVudCkge1xuICAgICAgICAgICAgdmFyIHBvc2l0aW9uID0gTW91c2UuX2dldFJlbGF0aXZlTW91c2VQb3NpdGlvbihldmVudCwgbW91c2UuZWxlbWVudCwgbW91c2UucGl4ZWxSYXRpbyksXG4gICAgICAgICAgICAgICAgdG91Y2hlcyA9IGV2ZW50LmNoYW5nZWRUb3VjaGVzO1xuXG4gICAgICAgICAgICBpZiAodG91Y2hlcykge1xuICAgICAgICAgICAgICAgIG1vdXNlLmJ1dHRvbiA9IDA7XG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbW91c2UuYnV0dG9uID0gZXZlbnQuYnV0dG9uO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBtb3VzZS5hYnNvbHV0ZS54ID0gcG9zaXRpb24ueDtcbiAgICAgICAgICAgIG1vdXNlLmFic29sdXRlLnkgPSBwb3NpdGlvbi55O1xuICAgICAgICAgICAgbW91c2UucG9zaXRpb24ueCA9IG1vdXNlLmFic29sdXRlLnggKiBtb3VzZS5zY2FsZS54ICsgbW91c2Uub2Zmc2V0Lng7XG4gICAgICAgICAgICBtb3VzZS5wb3NpdGlvbi55ID0gbW91c2UuYWJzb2x1dGUueSAqIG1vdXNlLnNjYWxlLnkgKyBtb3VzZS5vZmZzZXQueTtcbiAgICAgICAgICAgIG1vdXNlLm1vdXNlZG93blBvc2l0aW9uLnggPSBtb3VzZS5wb3NpdGlvbi54O1xuICAgICAgICAgICAgbW91c2UubW91c2Vkb3duUG9zaXRpb24ueSA9IG1vdXNlLnBvc2l0aW9uLnk7XG4gICAgICAgICAgICBtb3VzZS5zb3VyY2VFdmVudHMubW91c2Vkb3duID0gZXZlbnQ7XG4gICAgICAgIH07XG4gICAgICAgIFxuICAgICAgICBtb3VzZS5tb3VzZXVwID0gZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgICAgIHZhciBwb3NpdGlvbiA9IE1vdXNlLl9nZXRSZWxhdGl2ZU1vdXNlUG9zaXRpb24oZXZlbnQsIG1vdXNlLmVsZW1lbnQsIG1vdXNlLnBpeGVsUmF0aW8pLFxuICAgICAgICAgICAgICAgIHRvdWNoZXMgPSBldmVudC5jaGFuZ2VkVG91Y2hlcztcblxuICAgICAgICAgICAgaWYgKHRvdWNoZXMpIHtcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICBtb3VzZS5idXR0b24gPSAtMTtcbiAgICAgICAgICAgIG1vdXNlLmFic29sdXRlLnggPSBwb3NpdGlvbi54O1xuICAgICAgICAgICAgbW91c2UuYWJzb2x1dGUueSA9IHBvc2l0aW9uLnk7XG4gICAgICAgICAgICBtb3VzZS5wb3NpdGlvbi54ID0gbW91c2UuYWJzb2x1dGUueCAqIG1vdXNlLnNjYWxlLnggKyBtb3VzZS5vZmZzZXQueDtcbiAgICAgICAgICAgIG1vdXNlLnBvc2l0aW9uLnkgPSBtb3VzZS5hYnNvbHV0ZS55ICogbW91c2Uuc2NhbGUueSArIG1vdXNlLm9mZnNldC55O1xuICAgICAgICAgICAgbW91c2UubW91c2V1cFBvc2l0aW9uLnggPSBtb3VzZS5wb3NpdGlvbi54O1xuICAgICAgICAgICAgbW91c2UubW91c2V1cFBvc2l0aW9uLnkgPSBtb3VzZS5wb3NpdGlvbi55O1xuICAgICAgICAgICAgbW91c2Uuc291cmNlRXZlbnRzLm1vdXNldXAgPSBldmVudDtcbiAgICAgICAgfTtcblxuICAgICAgICBtb3VzZS5tb3VzZXdoZWVsID0gZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgICAgIG1vdXNlLndoZWVsRGVsdGEgPSBNYXRoLm1heCgtMSwgTWF0aC5taW4oMSwgZXZlbnQud2hlZWxEZWx0YSB8fCAtZXZlbnQuZGV0YWlsKSk7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB9O1xuXG4gICAgICAgIE1vdXNlLnNldEVsZW1lbnQobW91c2UsIG1vdXNlLmVsZW1lbnQpO1xuXG4gICAgICAgIHJldHVybiBtb3VzZTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgZWxlbWVudCB0aGUgbW91c2UgaXMgYm91bmQgdG8gKGFuZCByZWxhdGl2ZSB0bykuXG4gICAgICogQG1ldGhvZCBzZXRFbGVtZW50XG4gICAgICogQHBhcmFtIHttb3VzZX0gbW91c2VcbiAgICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50XG4gICAgICovXG4gICAgTW91c2Uuc2V0RWxlbWVudCA9IGZ1bmN0aW9uKG1vdXNlLCBlbGVtZW50KSB7XG4gICAgICAgIG1vdXNlLmVsZW1lbnQgPSBlbGVtZW50O1xuXG4gICAgICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgbW91c2UubW91c2Vtb3ZlKTtcbiAgICAgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCBtb3VzZS5tb3VzZWRvd24pO1xuICAgICAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCBtb3VzZS5tb3VzZXVwKTtcbiAgICAgICAgXG4gICAgICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V3aGVlbCcsIG1vdXNlLm1vdXNld2hlZWwpO1xuICAgICAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTU1vdXNlU2Nyb2xsJywgbW91c2UubW91c2V3aGVlbCk7XG5cbiAgICAgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaG1vdmUnLCBtb3VzZS5tb3VzZW1vdmUpO1xuICAgICAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoc3RhcnQnLCBtb3VzZS5tb3VzZWRvd24pO1xuICAgICAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoZW5kJywgbW91c2UubW91c2V1cCk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIENsZWFycyBhbGwgY2FwdHVyZWQgc291cmNlIGV2ZW50cy5cbiAgICAgKiBAbWV0aG9kIGNsZWFyU291cmNlRXZlbnRzXG4gICAgICogQHBhcmFtIHttb3VzZX0gbW91c2VcbiAgICAgKi9cbiAgICBNb3VzZS5jbGVhclNvdXJjZUV2ZW50cyA9IGZ1bmN0aW9uKG1vdXNlKSB7XG4gICAgICAgIG1vdXNlLnNvdXJjZUV2ZW50cy5tb3VzZW1vdmUgPSBudWxsO1xuICAgICAgICBtb3VzZS5zb3VyY2VFdmVudHMubW91c2Vkb3duID0gbnVsbDtcbiAgICAgICAgbW91c2Uuc291cmNlRXZlbnRzLm1vdXNldXAgPSBudWxsO1xuICAgICAgICBtb3VzZS5zb3VyY2VFdmVudHMubW91c2V3aGVlbCA9IG51bGw7XG4gICAgICAgIG1vdXNlLndoZWVsRGVsdGEgPSAwO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBtb3VzZSBwb3NpdGlvbiBvZmZzZXQuXG4gICAgICogQG1ldGhvZCBzZXRPZmZzZXRcbiAgICAgKiBAcGFyYW0ge21vdXNlfSBtb3VzZVxuICAgICAqIEBwYXJhbSB7dmVjdG9yfSBvZmZzZXRcbiAgICAgKi9cbiAgICBNb3VzZS5zZXRPZmZzZXQgPSBmdW5jdGlvbihtb3VzZSwgb2Zmc2V0KSB7XG4gICAgICAgIG1vdXNlLm9mZnNldC54ID0gb2Zmc2V0Lng7XG4gICAgICAgIG1vdXNlLm9mZnNldC55ID0gb2Zmc2V0Lnk7XG4gICAgICAgIG1vdXNlLnBvc2l0aW9uLnggPSBtb3VzZS5hYnNvbHV0ZS54ICogbW91c2Uuc2NhbGUueCArIG1vdXNlLm9mZnNldC54O1xuICAgICAgICBtb3VzZS5wb3NpdGlvbi55ID0gbW91c2UuYWJzb2x1dGUueSAqIG1vdXNlLnNjYWxlLnkgKyBtb3VzZS5vZmZzZXQueTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgbW91c2UgcG9zaXRpb24gc2NhbGUuXG4gICAgICogQG1ldGhvZCBzZXRTY2FsZVxuICAgICAqIEBwYXJhbSB7bW91c2V9IG1vdXNlXG4gICAgICogQHBhcmFtIHt2ZWN0b3J9IHNjYWxlXG4gICAgICovXG4gICAgTW91c2Uuc2V0U2NhbGUgPSBmdW5jdGlvbihtb3VzZSwgc2NhbGUpIHtcbiAgICAgICAgbW91c2Uuc2NhbGUueCA9IHNjYWxlLng7XG4gICAgICAgIG1vdXNlLnNjYWxlLnkgPSBzY2FsZS55O1xuICAgICAgICBtb3VzZS5wb3NpdGlvbi54ID0gbW91c2UuYWJzb2x1dGUueCAqIG1vdXNlLnNjYWxlLnggKyBtb3VzZS5vZmZzZXQueDtcbiAgICAgICAgbW91c2UucG9zaXRpb24ueSA9IG1vdXNlLmFic29sdXRlLnkgKiBtb3VzZS5zY2FsZS55ICsgbW91c2Uub2Zmc2V0Lnk7XG4gICAgfTtcbiAgICBcbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBtb3VzZSBwb3NpdGlvbiByZWxhdGl2ZSB0byBhbiBlbGVtZW50IGdpdmVuIGEgc2NyZWVuIHBpeGVsIHJhdGlvLlxuICAgICAqIEBtZXRob2QgX2dldFJlbGF0aXZlTW91c2VQb3NpdGlvblxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHt9IGV2ZW50XG4gICAgICogQHBhcmFtIHt9IGVsZW1lbnRcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcGl4ZWxSYXRpb1xuICAgICAqIEByZXR1cm4ge31cbiAgICAgKi9cbiAgICBNb3VzZS5fZ2V0UmVsYXRpdmVNb3VzZVBvc2l0aW9uID0gZnVuY3Rpb24oZXZlbnQsIGVsZW1lbnQsIHBpeGVsUmF0aW8pIHtcbiAgICAgICAgdmFyIGVsZW1lbnRCb3VuZHMgPSBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLFxuICAgICAgICAgICAgcm9vdE5vZGUgPSAoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50IHx8IGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZSB8fCBkb2N1bWVudC5ib2R5KSxcbiAgICAgICAgICAgIHNjcm9sbFggPSAod2luZG93LnBhZ2VYT2Zmc2V0ICE9PSB1bmRlZmluZWQpID8gd2luZG93LnBhZ2VYT2Zmc2V0IDogcm9vdE5vZGUuc2Nyb2xsTGVmdCxcbiAgICAgICAgICAgIHNjcm9sbFkgPSAod2luZG93LnBhZ2VZT2Zmc2V0ICE9PSB1bmRlZmluZWQpID8gd2luZG93LnBhZ2VZT2Zmc2V0IDogcm9vdE5vZGUuc2Nyb2xsVG9wLFxuICAgICAgICAgICAgdG91Y2hlcyA9IGV2ZW50LmNoYW5nZWRUb3VjaGVzLFxuICAgICAgICAgICAgeCwgeTtcbiAgICAgICAgXG4gICAgICAgIGlmICh0b3VjaGVzKSB7XG4gICAgICAgICAgICB4ID0gdG91Y2hlc1swXS5wYWdlWCAtIGVsZW1lbnRCb3VuZHMubGVmdCAtIHNjcm9sbFg7XG4gICAgICAgICAgICB5ID0gdG91Y2hlc1swXS5wYWdlWSAtIGVsZW1lbnRCb3VuZHMudG9wIC0gc2Nyb2xsWTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHggPSBldmVudC5wYWdlWCAtIGVsZW1lbnRCb3VuZHMubGVmdCAtIHNjcm9sbFg7XG4gICAgICAgICAgICB5ID0gZXZlbnQucGFnZVkgLSBlbGVtZW50Qm91bmRzLnRvcCAtIHNjcm9sbFk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4geyBcbiAgICAgICAgICAgIHg6IHggLyAoZWxlbWVudC5jbGllbnRXaWR0aCAvIChlbGVtZW50LndpZHRoIHx8IGVsZW1lbnQuY2xpZW50V2lkdGgpICogcGl4ZWxSYXRpbyksXG4gICAgICAgICAgICB5OiB5IC8gKGVsZW1lbnQuY2xpZW50SGVpZ2h0IC8gKGVsZW1lbnQuaGVpZ2h0IHx8IGVsZW1lbnQuY2xpZW50SGVpZ2h0KSAqIHBpeGVsUmF0aW8pXG4gICAgICAgIH07XG4gICAgfTtcblxufSkoKTtcblxuXG4vKioqLyB9KSxcbi8qIDE0ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cbi8qKlxuKiBUaGUgYE1hdHRlci5EZXRlY3RvcmAgbW9kdWxlIGNvbnRhaW5zIG1ldGhvZHMgZm9yIGVmZmljaWVudGx5IGRldGVjdGluZyBjb2xsaXNpb25zIGJldHdlZW4gYSBsaXN0IG9mIGJvZGllcyB1c2luZyBhIGJyb2FkcGhhc2UgYWxnb3JpdGhtLlxuKlxuKiBAY2xhc3MgRGV0ZWN0b3JcbiovXG5cbnZhciBEZXRlY3RvciA9IHt9O1xuXG5tb2R1bGUuZXhwb3J0cyA9IERldGVjdG9yO1xuXG52YXIgQ29tbW9uID0gX193ZWJwYWNrX3JlcXVpcmVfXygwKTtcbnZhciBDb2xsaXNpb24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDgpO1xuXG4oZnVuY3Rpb24oKSB7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IGNvbGxpc2lvbiBkZXRlY3Rvci5cbiAgICAgKiBAbWV0aG9kIGNyZWF0ZVxuICAgICAqIEBwYXJhbSB7fSBvcHRpb25zXG4gICAgICogQHJldHVybiB7ZGV0ZWN0b3J9IEEgbmV3IGNvbGxpc2lvbiBkZXRlY3RvclxuICAgICAqL1xuICAgIERldGVjdG9yLmNyZWF0ZSA9IGZ1bmN0aW9uKG9wdGlvbnMpIHtcbiAgICAgICAgdmFyIGRlZmF1bHRzID0ge1xuICAgICAgICAgICAgYm9kaWVzOiBbXSxcbiAgICAgICAgICAgIHBhaXJzOiBudWxsXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIENvbW1vbi5leHRlbmQoZGVmYXVsdHMsIG9wdGlvbnMpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBsaXN0IG9mIGJvZGllcyBpbiB0aGUgZGV0ZWN0b3IuXG4gICAgICogQG1ldGhvZCBzZXRCb2RpZXNcbiAgICAgKiBAcGFyYW0ge2RldGVjdG9yfSBkZXRlY3RvclxuICAgICAqIEBwYXJhbSB7Ym9keVtdfSBib2RpZXNcbiAgICAgKi9cbiAgICBEZXRlY3Rvci5zZXRCb2RpZXMgPSBmdW5jdGlvbihkZXRlY3RvciwgYm9kaWVzKSB7XG4gICAgICAgIGRldGVjdG9yLmJvZGllcyA9IGJvZGllcy5zbGljZSgwKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQ2xlYXJzIHRoZSBkZXRlY3RvciBpbmNsdWRpbmcgaXRzIGxpc3Qgb2YgYm9kaWVzLlxuICAgICAqIEBtZXRob2QgY2xlYXJcbiAgICAgKiBAcGFyYW0ge2RldGVjdG9yfSBkZXRlY3RvclxuICAgICAqL1xuICAgIERldGVjdG9yLmNsZWFyID0gZnVuY3Rpb24oZGV0ZWN0b3IpIHtcbiAgICAgICAgZGV0ZWN0b3IuYm9kaWVzID0gW107XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEVmZmljaWVudGx5IGZpbmRzIGFsbCBjb2xsaXNpb25zIGFtb25nIGFsbCB0aGUgYm9kaWVzIGluIGBkZXRlY3Rvci5ib2RpZXNgIHVzaW5nIGEgYnJvYWRwaGFzZSBhbGdvcml0aG0uXG4gICAgICogXG4gICAgICogX05vdGU6XyBUaGUgc3BlY2lmaWMgb3JkZXJpbmcgb2YgY29sbGlzaW9ucyByZXR1cm5lZCBpcyBub3QgZ3VhcmFudGVlZCBiZXR3ZWVuIHJlbGVhc2VzIGFuZCBtYXkgY2hhbmdlIGZvciBwZXJmb3JtYW5jZSByZWFzb25zLlxuICAgICAqIElmIGEgc3BlY2lmaWMgb3JkZXJpbmcgaXMgcmVxdWlyZWQgdGhlbiBhcHBseSBhIHNvcnQgdG8gdGhlIHJlc3VsdGluZyBhcnJheS5cbiAgICAgKiBAbWV0aG9kIGNvbGxpc2lvbnNcbiAgICAgKiBAcGFyYW0ge2RldGVjdG9yfSBkZXRlY3RvclxuICAgICAqIEByZXR1cm4ge2NvbGxpc2lvbltdfSBjb2xsaXNpb25zXG4gICAgICovXG4gICAgRGV0ZWN0b3IuY29sbGlzaW9ucyA9IGZ1bmN0aW9uKGRldGVjdG9yKSB7XG4gICAgICAgIHZhciBjb2xsaXNpb25zID0gW10sXG4gICAgICAgICAgICBwYWlycyA9IGRldGVjdG9yLnBhaXJzLFxuICAgICAgICAgICAgYm9kaWVzID0gZGV0ZWN0b3IuYm9kaWVzLFxuICAgICAgICAgICAgYm9kaWVzTGVuZ3RoID0gYm9kaWVzLmxlbmd0aCxcbiAgICAgICAgICAgIGNhbkNvbGxpZGUgPSBEZXRlY3Rvci5jYW5Db2xsaWRlLFxuICAgICAgICAgICAgY29sbGlkZXMgPSBDb2xsaXNpb24uY29sbGlkZXMsXG4gICAgICAgICAgICBpLFxuICAgICAgICAgICAgajtcblxuICAgICAgICBib2RpZXMuc29ydChEZXRlY3Rvci5fY29tcGFyZUJvdW5kc1gpO1xuXG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBib2RpZXNMZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIGJvZHlBID0gYm9kaWVzW2ldLFxuICAgICAgICAgICAgICAgIGJvdW5kc0EgPSBib2R5QS5ib3VuZHMsXG4gICAgICAgICAgICAgICAgYm91bmRYTWF4ID0gYm9keUEuYm91bmRzLm1heC54LFxuICAgICAgICAgICAgICAgIGJvdW5kWU1heCA9IGJvZHlBLmJvdW5kcy5tYXgueSxcbiAgICAgICAgICAgICAgICBib3VuZFlNaW4gPSBib2R5QS5ib3VuZHMubWluLnksXG4gICAgICAgICAgICAgICAgYm9keUFTdGF0aWMgPSBib2R5QS5pc1N0YXRpYyB8fCBib2R5QS5pc1NsZWVwaW5nLFxuICAgICAgICAgICAgICAgIHBhcnRzQUxlbmd0aCA9IGJvZHlBLnBhcnRzLmxlbmd0aCxcbiAgICAgICAgICAgICAgICBwYXJ0c0FTaW5nbGUgPSBwYXJ0c0FMZW5ndGggPT09IDE7XG5cbiAgICAgICAgICAgIGZvciAoaiA9IGkgKyAxOyBqIDwgYm9kaWVzTGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICB2YXIgYm9keUIgPSBib2RpZXNbal0sXG4gICAgICAgICAgICAgICAgICAgIGJvdW5kc0IgPSBib2R5Qi5ib3VuZHM7XG5cbiAgICAgICAgICAgICAgICBpZiAoYm91bmRzQi5taW4ueCA+IGJvdW5kWE1heCkge1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoYm91bmRZTWF4IDwgYm91bmRzQi5taW4ueSB8fCBib3VuZFlNaW4gPiBib3VuZHNCLm1heC55KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChib2R5QVN0YXRpYyAmJiAoYm9keUIuaXNTdGF0aWMgfHwgYm9keUIuaXNTbGVlcGluZykpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKCFjYW5Db2xsaWRlKGJvZHlBLmNvbGxpc2lvbkZpbHRlciwgYm9keUIuY29sbGlzaW9uRmlsdGVyKSkge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB2YXIgcGFydHNCTGVuZ3RoID0gYm9keUIucGFydHMubGVuZ3RoO1xuXG4gICAgICAgICAgICAgICAgaWYgKHBhcnRzQVNpbmdsZSAmJiBwYXJ0c0JMZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGNvbGxpc2lvbiA9IGNvbGxpZGVzKGJvZHlBLCBib2R5QiwgcGFpcnMpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChjb2xsaXNpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbGxpc2lvbnMucHVzaChjb2xsaXNpb24pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHBhcnRzQVN0YXJ0ID0gcGFydHNBTGVuZ3RoID4gMSA/IDEgOiAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFydHNCU3RhcnQgPSBwYXJ0c0JMZW5ndGggPiAxID8gMSA6IDA7XG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrID0gcGFydHNBU3RhcnQ7IGsgPCBwYXJ0c0FMZW5ndGg7IGsrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHBhcnRBID0gYm9keUEucGFydHNba10sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYm91bmRzQSA9IHBhcnRBLmJvdW5kcztcblxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgeiA9IHBhcnRzQlN0YXJ0OyB6IDwgcGFydHNCTGVuZ3RoOyB6KyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcGFydEIgPSBib2R5Qi5wYXJ0c1t6XSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm91bmRzQiA9IHBhcnRCLmJvdW5kcztcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChib3VuZHNBLm1pbi54ID4gYm91bmRzQi5tYXgueCB8fCBib3VuZHNBLm1heC54IDwgYm91bmRzQi5taW4ueFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBib3VuZHNBLm1heC55IDwgYm91bmRzQi5taW4ueSB8fCBib3VuZHNBLm1pbi55ID4gYm91bmRzQi5tYXgueSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY29sbGlzaW9uID0gY29sbGlkZXMocGFydEEsIHBhcnRCLCBwYWlycyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29sbGlzaW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbGxpc2lvbnMucHVzaChjb2xsaXNpb24pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjb2xsaXNpb25zO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGB0cnVlYCBpZiBib3RoIHN1cHBsaWVkIGNvbGxpc2lvbiBmaWx0ZXJzIHdpbGwgYWxsb3cgYSBjb2xsaXNpb24gdG8gb2NjdXIuXG4gICAgICogU2VlIGBib2R5LmNvbGxpc2lvbkZpbHRlcmAgZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gICAgICogQG1ldGhvZCBjYW5Db2xsaWRlXG4gICAgICogQHBhcmFtIHt9IGZpbHRlckFcbiAgICAgKiBAcGFyYW0ge30gZmlsdGVyQlxuICAgICAqIEByZXR1cm4ge2Jvb2x9IGB0cnVlYCBpZiBjb2xsaXNpb24gY2FuIG9jY3VyXG4gICAgICovXG4gICAgRGV0ZWN0b3IuY2FuQ29sbGlkZSA9IGZ1bmN0aW9uKGZpbHRlckEsIGZpbHRlckIpIHtcbiAgICAgICAgaWYgKGZpbHRlckEuZ3JvdXAgPT09IGZpbHRlckIuZ3JvdXAgJiYgZmlsdGVyQS5ncm91cCAhPT0gMClcbiAgICAgICAgICAgIHJldHVybiBmaWx0ZXJBLmdyb3VwID4gMDtcblxuICAgICAgICByZXR1cm4gKGZpbHRlckEubWFzayAmIGZpbHRlckIuY2F0ZWdvcnkpICE9PSAwICYmIChmaWx0ZXJCLm1hc2sgJiBmaWx0ZXJBLmNhdGVnb3J5KSAhPT0gMDtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogVGhlIGNvbXBhcmlzb24gZnVuY3Rpb24gdXNlZCBpbiB0aGUgYnJvYWRwaGFzZSBhbGdvcml0aG0uXG4gICAgICogUmV0dXJucyB0aGUgc2lnbmVkIGRlbHRhIG9mIHRoZSBib2RpZXMgYm91bmRzIG9uIHRoZSB4LWF4aXMuXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbWV0aG9kIF9zb3J0Q29tcGFyZVxuICAgICAqIEBwYXJhbSB7Ym9keX0gYm9keUFcbiAgICAgKiBAcGFyYW0ge2JvZHl9IGJvZHlCXG4gICAgICogQHJldHVybiB7bnVtYmVyfSBUaGUgc2lnbmVkIGRlbHRhIHVzZWQgZm9yIHNvcnRpbmdcbiAgICAgKi9cbiAgICBEZXRlY3Rvci5fY29tcGFyZUJvdW5kc1ggPSBmdW5jdGlvbihib2R5QSwgYm9keUIpIHtcbiAgICAgICAgcmV0dXJuIGJvZHlBLmJvdW5kcy5taW4ueCAtIGJvZHlCLmJvdW5kcy5taW4ueDtcbiAgICB9O1xuXG4gICAgLypcbiAgICAqXG4gICAgKiAgUHJvcGVydGllcyBEb2N1bWVudGF0aW9uXG4gICAgKlxuICAgICovXG5cbiAgICAvKipcbiAgICAgKiBUaGUgYXJyYXkgb2YgYE1hdHRlci5Cb2R5YCBiZXR3ZWVuIHdoaWNoIHRoZSBkZXRlY3RvciBmaW5kcyBjb2xsaXNpb25zLlxuICAgICAqIFxuICAgICAqIF9Ob3RlOl8gVGhlIG9yZGVyIG9mIGJvZGllcyBpbiB0aGlzIGFycmF5IF9pcyBub3QgZml4ZWRfIGFuZCB3aWxsIGJlIGNvbnRpbnVhbGx5IG1hbmFnZWQgYnkgdGhlIGRldGVjdG9yLlxuICAgICAqIEBwcm9wZXJ0eSBib2RpZXNcbiAgICAgKiBAdHlwZSBib2R5W11cbiAgICAgKiBAZGVmYXVsdCBbXVxuICAgICAqL1xuXG4gICAgLyoqXG4gICAgICogT3B0aW9uYWwuIEEgYE1hdHRlci5QYWlyc2Agb2JqZWN0IGZyb20gd2hpY2ggcHJldmlvdXMgY29sbGlzaW9uIG9iamVjdHMgbWF5IGJlIHJldXNlZC4gSW50ZW5kZWQgZm9yIGludGVybmFsIGBNYXR0ZXIuRW5naW5lYCB1c2FnZS5cbiAgICAgKiBAcHJvcGVydHkgcGFpcnNcbiAgICAgKiBAdHlwZSB7cGFpcnN8bnVsbH1cbiAgICAgKiBAZGVmYXVsdCBudWxsXG4gICAgICovXG5cbn0pKCk7XG5cblxuLyoqKi8gfSksXG4vKiAxNSAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG4vKipcbiogVGhlIGBNYXR0ZXIuUGx1Z2luYCBtb2R1bGUgY29udGFpbnMgZnVuY3Rpb25zIGZvciByZWdpc3RlcmluZyBhbmQgaW5zdGFsbGluZyBwbHVnaW5zIG9uIG1vZHVsZXMuXG4qXG4qIEBjbGFzcyBQbHVnaW5cbiovXG5cbnZhciBQbHVnaW4gPSB7fTtcblxubW9kdWxlLmV4cG9ydHMgPSBQbHVnaW47XG5cbnZhciBDb21tb24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDApO1xuXG4oZnVuY3Rpb24oKSB7XG5cbiAgICBQbHVnaW4uX3JlZ2lzdHJ5ID0ge307XG5cbiAgICAvKipcbiAgICAgKiBSZWdpc3RlcnMgYSBwbHVnaW4gb2JqZWN0IHNvIGl0IGNhbiBiZSByZXNvbHZlZCBsYXRlciBieSBuYW1lLlxuICAgICAqIEBtZXRob2QgcmVnaXN0ZXJcbiAgICAgKiBAcGFyYW0gcGx1Z2luIHt9IFRoZSBwbHVnaW4gdG8gcmVnaXN0ZXIuXG4gICAgICogQHJldHVybiB7b2JqZWN0fSBUaGUgcGx1Z2luLlxuICAgICAqL1xuICAgIFBsdWdpbi5yZWdpc3RlciA9IGZ1bmN0aW9uKHBsdWdpbikge1xuICAgICAgICBpZiAoIVBsdWdpbi5pc1BsdWdpbihwbHVnaW4pKSB7XG4gICAgICAgICAgICBDb21tb24ud2FybignUGx1Z2luLnJlZ2lzdGVyOicsIFBsdWdpbi50b1N0cmluZyhwbHVnaW4pLCAnZG9lcyBub3QgaW1wbGVtZW50IGFsbCByZXF1aXJlZCBmaWVsZHMuJyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocGx1Z2luLm5hbWUgaW4gUGx1Z2luLl9yZWdpc3RyeSkge1xuICAgICAgICAgICAgdmFyIHJlZ2lzdGVyZWQgPSBQbHVnaW4uX3JlZ2lzdHJ5W3BsdWdpbi5uYW1lXSxcbiAgICAgICAgICAgICAgICBwbHVnaW5WZXJzaW9uID0gUGx1Z2luLnZlcnNpb25QYXJzZShwbHVnaW4udmVyc2lvbikubnVtYmVyLFxuICAgICAgICAgICAgICAgIHJlZ2lzdGVyZWRWZXJzaW9uID0gUGx1Z2luLnZlcnNpb25QYXJzZShyZWdpc3RlcmVkLnZlcnNpb24pLm51bWJlcjtcblxuICAgICAgICAgICAgaWYgKHBsdWdpblZlcnNpb24gPiByZWdpc3RlcmVkVmVyc2lvbikge1xuICAgICAgICAgICAgICAgIENvbW1vbi53YXJuKCdQbHVnaW4ucmVnaXN0ZXI6JywgUGx1Z2luLnRvU3RyaW5nKHJlZ2lzdGVyZWQpLCAnd2FzIHVwZ3JhZGVkIHRvJywgUGx1Z2luLnRvU3RyaW5nKHBsdWdpbikpO1xuICAgICAgICAgICAgICAgIFBsdWdpbi5fcmVnaXN0cnlbcGx1Z2luLm5hbWVdID0gcGx1Z2luO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChwbHVnaW5WZXJzaW9uIDwgcmVnaXN0ZXJlZFZlcnNpb24pIHtcbiAgICAgICAgICAgICAgICBDb21tb24ud2FybignUGx1Z2luLnJlZ2lzdGVyOicsIFBsdWdpbi50b1N0cmluZyhyZWdpc3RlcmVkKSwgJ2NhbiBub3QgYmUgZG93bmdyYWRlZCB0bycsIFBsdWdpbi50b1N0cmluZyhwbHVnaW4pKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocGx1Z2luICE9PSByZWdpc3RlcmVkKSB7XG4gICAgICAgICAgICAgICAgQ29tbW9uLndhcm4oJ1BsdWdpbi5yZWdpc3RlcjonLCBQbHVnaW4udG9TdHJpbmcocGx1Z2luKSwgJ2lzIGFscmVhZHkgcmVnaXN0ZXJlZCB0byBkaWZmZXJlbnQgcGx1Z2luIG9iamVjdCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgUGx1Z2luLl9yZWdpc3RyeVtwbHVnaW4ubmFtZV0gPSBwbHVnaW47XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcGx1Z2luO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBSZXNvbHZlcyBhIGRlcGVuZGVuY3kgdG8gYSBwbHVnaW4gb2JqZWN0IGZyb20gdGhlIHJlZ2lzdHJ5IGlmIGl0IGV4aXN0cy4gXG4gICAgICogVGhlIGBkZXBlbmRlbmN5YCBtYXkgY29udGFpbiBhIHZlcnNpb24sIGJ1dCBvbmx5IHRoZSBuYW1lIG1hdHRlcnMgd2hlbiByZXNvbHZpbmcuXG4gICAgICogQG1ldGhvZCByZXNvbHZlXG4gICAgICogQHBhcmFtIGRlcGVuZGVuY3kge3N0cmluZ30gVGhlIGRlcGVuZGVuY3kuXG4gICAgICogQHJldHVybiB7b2JqZWN0fSBUaGUgcGx1Z2luIGlmIHJlc29sdmVkLCBvdGhlcndpc2UgYHVuZGVmaW5lZGAuXG4gICAgICovXG4gICAgUGx1Z2luLnJlc29sdmUgPSBmdW5jdGlvbihkZXBlbmRlbmN5KSB7XG4gICAgICAgIHJldHVybiBQbHVnaW4uX3JlZ2lzdHJ5W1BsdWdpbi5kZXBlbmRlbmN5UGFyc2UoZGVwZW5kZW5jeSkubmFtZV07XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBwcmV0dHkgcHJpbnRlZCBwbHVnaW4gbmFtZSBhbmQgdmVyc2lvbi5cbiAgICAgKiBAbWV0aG9kIHRvU3RyaW5nXG4gICAgICogQHBhcmFtIHBsdWdpbiB7fSBUaGUgcGx1Z2luLlxuICAgICAqIEByZXR1cm4ge3N0cmluZ30gUHJldHR5IHByaW50ZWQgcGx1Z2luIG5hbWUgYW5kIHZlcnNpb24uXG4gICAgICovXG4gICAgUGx1Z2luLnRvU3RyaW5nID0gZnVuY3Rpb24ocGx1Z2luKSB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgcGx1Z2luID09PSAnc3RyaW5nJyA/IHBsdWdpbiA6IChwbHVnaW4ubmFtZSB8fCAnYW5vbnltb3VzJykgKyAnQCcgKyAocGx1Z2luLnZlcnNpb24gfHwgcGx1Z2luLnJhbmdlIHx8ICcwLjAuMCcpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgb2JqZWN0IG1lZXRzIHRoZSBtaW5pbXVtIHN0YW5kYXJkIHRvIGJlIGNvbnNpZGVyZWQgYSBwbHVnaW4uXG4gICAgICogVGhpcyBtZWFucyBpdCBtdXN0IGRlZmluZSB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gICAgICogLSBgbmFtZWBcbiAgICAgKiAtIGB2ZXJzaW9uYFxuICAgICAqIC0gYGluc3RhbGxgXG4gICAgICogQG1ldGhvZCBpc1BsdWdpblxuICAgICAqIEBwYXJhbSBvYmoge30gVGhlIG9iaiB0byB0ZXN0LlxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgb2JqZWN0IGNhbiBiZSBjb25zaWRlcmVkIGEgcGx1Z2luIG90aGVyd2lzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIFBsdWdpbi5pc1BsdWdpbiA9IGZ1bmN0aW9uKG9iaikge1xuICAgICAgICByZXR1cm4gb2JqICYmIG9iai5uYW1lICYmIG9iai52ZXJzaW9uICYmIG9iai5pbnN0YWxsO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGB0cnVlYCBpZiBhIHBsdWdpbiB3aXRoIHRoZSBnaXZlbiBgbmFtZWAgYmVlbiBpbnN0YWxsZWQgb24gYG1vZHVsZWAuXG4gICAgICogQG1ldGhvZCBpc1VzZWRcbiAgICAgKiBAcGFyYW0gbW9kdWxlIHt9IFRoZSBtb2R1bGUuXG4gICAgICogQHBhcmFtIG5hbWUge3N0cmluZ30gVGhlIHBsdWdpbiBuYW1lLlxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IGB0cnVlYCBpZiBhIHBsdWdpbiB3aXRoIHRoZSBnaXZlbiBgbmFtZWAgYmVlbiBpbnN0YWxsZWQgb24gYG1vZHVsZWAsIG90aGVyd2lzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIFBsdWdpbi5pc1VzZWQgPSBmdW5jdGlvbihtb2R1bGUsIG5hbWUpIHtcbiAgICAgICAgcmV0dXJuIG1vZHVsZS51c2VkLmluZGV4T2YobmFtZSkgPiAtMTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBgdHJ1ZWAgaWYgYHBsdWdpbi5mb3JgIGlzIGFwcGxpY2FibGUgdG8gYG1vZHVsZWAgYnkgY29tcGFyaW5nIGFnYWluc3QgYG1vZHVsZS5uYW1lYCBhbmQgYG1vZHVsZS52ZXJzaW9uYC5cbiAgICAgKiBJZiBgcGx1Z2luLmZvcmAgaXMgbm90IHNwZWNpZmllZCB0aGVuIGl0IGlzIGFzc3VtZWQgdG8gYmUgYXBwbGljYWJsZS5cbiAgICAgKiBUaGUgdmFsdWUgb2YgYHBsdWdpbi5mb3JgIGlzIGEgc3RyaW5nIG9mIHRoZSBmb3JtYXQgYCdtb2R1bGUtbmFtZSdgIG9yIGAnbW9kdWxlLW5hbWVAdmVyc2lvbidgLlxuICAgICAqIEBtZXRob2QgaXNGb3JcbiAgICAgKiBAcGFyYW0gcGx1Z2luIHt9IFRoZSBwbHVnaW4uXG4gICAgICogQHBhcmFtIG1vZHVsZSB7fSBUaGUgbW9kdWxlLlxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IGB0cnVlYCBpZiBgcGx1Z2luLmZvcmAgaXMgYXBwbGljYWJsZSB0byBgbW9kdWxlYCwgb3RoZXJ3aXNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgUGx1Z2luLmlzRm9yID0gZnVuY3Rpb24ocGx1Z2luLCBtb2R1bGUpIHtcbiAgICAgICAgdmFyIHBhcnNlZCA9IHBsdWdpbi5mb3IgJiYgUGx1Z2luLmRlcGVuZGVuY3lQYXJzZShwbHVnaW4uZm9yKTtcbiAgICAgICAgcmV0dXJuICFwbHVnaW4uZm9yIHx8IChtb2R1bGUubmFtZSA9PT0gcGFyc2VkLm5hbWUgJiYgUGx1Z2luLnZlcnNpb25TYXRpc2ZpZXMobW9kdWxlLnZlcnNpb24sIHBhcnNlZC5yYW5nZSkpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBJbnN0YWxscyB0aGUgcGx1Z2lucyBieSBjYWxsaW5nIGBwbHVnaW4uaW5zdGFsbGAgb24gZWFjaCBwbHVnaW4gc3BlY2lmaWVkIGluIGBwbHVnaW5zYCBpZiBwYXNzZWQsIG90aGVyd2lzZSBgbW9kdWxlLnVzZXNgLlxuICAgICAqIEZvciBpbnN0YWxsaW5nIHBsdWdpbnMgb24gYE1hdHRlcmAgc2VlIHRoZSBjb252ZW5pZW5jZSBmdW5jdGlvbiBgTWF0dGVyLnVzZWAuXG4gICAgICogUGx1Z2lucyBtYXkgYmUgc3BlY2lmaWVkIGVpdGhlciBieSB0aGVpciBuYW1lIG9yIGEgcmVmZXJlbmNlIHRvIHRoZSBwbHVnaW4gb2JqZWN0LlxuICAgICAqIFBsdWdpbnMgdGhlbXNlbHZlcyBtYXkgc3BlY2lmeSBmdXJ0aGVyIGRlcGVuZGVuY2llcywgYnV0IGVhY2ggcGx1Z2luIGlzIGluc3RhbGxlZCBvbmx5IG9uY2UuXG4gICAgICogT3JkZXIgaXMgaW1wb3J0YW50LCBhIHRvcG9sb2dpY2FsIHNvcnQgaXMgcGVyZm9ybWVkIHRvIGZpbmQgdGhlIGJlc3QgcmVzdWx0aW5nIG9yZGVyIG9mIGluc3RhbGxhdGlvbi5cbiAgICAgKiBUaGlzIHNvcnRpbmcgYXR0ZW1wdHMgdG8gc2F0aXNmeSBldmVyeSBkZXBlbmRlbmN5J3MgcmVxdWVzdGVkIG9yZGVyaW5nLCBidXQgbWF5IG5vdCBiZSBleGFjdCBpbiBhbGwgY2FzZXMuXG4gICAgICogVGhpcyBmdW5jdGlvbiBsb2dzIHRoZSByZXN1bHRpbmcgc3RhdHVzIG9mIGVhY2ggZGVwZW5kZW5jeSBpbiB0aGUgY29uc29sZSwgYWxvbmcgd2l0aCBhbnkgd2FybmluZ3MuXG4gICAgICogLSBBIGdyZWVuIHRpY2sg4pyFIGluZGljYXRlcyBhIGRlcGVuZGVuY3kgd2FzIHJlc29sdmVkIGFuZCBpbnN0YWxsZWQuXG4gICAgICogLSBBbiBvcmFuZ2UgZGlhbW9uZCDwn5S2IGluZGljYXRlcyBhIGRlcGVuZGVuY3kgd2FzIHJlc29sdmVkIGJ1dCBhIHdhcm5pbmcgd2FzIHRocm93biBmb3IgaXQgb3Igb25lIGlmIGl0cyBkZXBlbmRlbmNpZXMuXG4gICAgICogLSBBIHJlZCBjcm9zcyDinYwgaW5kaWNhdGVzIGEgZGVwZW5kZW5jeSBjb3VsZCBub3QgYmUgcmVzb2x2ZWQuXG4gICAgICogQXZvaWQgY2FsbGluZyB0aGlzIGZ1bmN0aW9uIG11bHRpcGxlIHRpbWVzIG9uIHRoZSBzYW1lIG1vZHVsZSB1bmxlc3MgeW91IGludGVuZCB0byBtYW51YWxseSBjb250cm9sIGluc3RhbGxhdGlvbiBvcmRlci5cbiAgICAgKiBAbWV0aG9kIHVzZVxuICAgICAqIEBwYXJhbSBtb2R1bGUge30gVGhlIG1vZHVsZSBpbnN0YWxsIHBsdWdpbnMgb24uXG4gICAgICogQHBhcmFtIFtwbHVnaW5zPW1vZHVsZS51c2VzXSB7fSBUaGUgcGx1Z2lucyB0byBpbnN0YWxsIG9uIG1vZHVsZSAob3B0aW9uYWwsIGRlZmF1bHRzIHRvIGBtb2R1bGUudXNlc2ApLlxuICAgICAqL1xuICAgIFBsdWdpbi51c2UgPSBmdW5jdGlvbihtb2R1bGUsIHBsdWdpbnMpIHtcbiAgICAgICAgbW9kdWxlLnVzZXMgPSAobW9kdWxlLnVzZXMgfHwgW10pLmNvbmNhdChwbHVnaW5zIHx8IFtdKTtcblxuICAgICAgICBpZiAobW9kdWxlLnVzZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICBDb21tb24ud2FybignUGx1Z2luLnVzZTonLCBQbHVnaW4udG9TdHJpbmcobW9kdWxlKSwgJ2RvZXMgbm90IHNwZWNpZnkgYW55IGRlcGVuZGVuY2llcyB0byBpbnN0YWxsLicpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGRlcGVuZGVuY2llcyA9IFBsdWdpbi5kZXBlbmRlbmNpZXMobW9kdWxlKSxcbiAgICAgICAgICAgIHNvcnRlZERlcGVuZGVuY2llcyA9IENvbW1vbi50b3BvbG9naWNhbFNvcnQoZGVwZW5kZW5jaWVzKSxcbiAgICAgICAgICAgIHN0YXR1cyA9IFtdO1xuXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc29ydGVkRGVwZW5kZW5jaWVzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgICAgICBpZiAoc29ydGVkRGVwZW5kZW5jaWVzW2ldID09PSBtb2R1bGUubmFtZSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgcGx1Z2luID0gUGx1Z2luLnJlc29sdmUoc29ydGVkRGVwZW5kZW5jaWVzW2ldKTtcblxuICAgICAgICAgICAgaWYgKCFwbHVnaW4pIHtcbiAgICAgICAgICAgICAgICBzdGF0dXMucHVzaCgn4p2MICcgKyBzb3J0ZWREZXBlbmRlbmNpZXNbaV0pO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoUGx1Z2luLmlzVXNlZChtb2R1bGUsIHBsdWdpbi5uYW1lKSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIVBsdWdpbi5pc0ZvcihwbHVnaW4sIG1vZHVsZSkpIHtcbiAgICAgICAgICAgICAgICBDb21tb24ud2FybignUGx1Z2luLnVzZTonLCBQbHVnaW4udG9TdHJpbmcocGx1Z2luKSwgJ2lzIGZvcicsIHBsdWdpbi5mb3IsICdidXQgaW5zdGFsbGVkIG9uJywgUGx1Z2luLnRvU3RyaW5nKG1vZHVsZSkgKyAnLicpO1xuICAgICAgICAgICAgICAgIHBsdWdpbi5fd2FybmVkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHBsdWdpbi5pbnN0YWxsKSB7XG4gICAgICAgICAgICAgICAgcGx1Z2luLmluc3RhbGwobW9kdWxlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgQ29tbW9uLndhcm4oJ1BsdWdpbi51c2U6JywgUGx1Z2luLnRvU3RyaW5nKHBsdWdpbiksICdkb2VzIG5vdCBzcGVjaWZ5IGFuIGluc3RhbGwgZnVuY3Rpb24uJyk7XG4gICAgICAgICAgICAgICAgcGx1Z2luLl93YXJuZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAocGx1Z2luLl93YXJuZWQpIHtcbiAgICAgICAgICAgICAgICBzdGF0dXMucHVzaCgn8J+UtiAnICsgUGx1Z2luLnRvU3RyaW5nKHBsdWdpbikpO1xuICAgICAgICAgICAgICAgIGRlbGV0ZSBwbHVnaW4uX3dhcm5lZDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgc3RhdHVzLnB1c2goJ+KchSAnICsgUGx1Z2luLnRvU3RyaW5nKHBsdWdpbikpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBtb2R1bGUudXNlZC5wdXNoKHBsdWdpbi5uYW1lKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzdGF0dXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgQ29tbW9uLmluZm8oc3RhdHVzLmpvaW4oJyAgJykpO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFJlY3Vyc2l2ZWx5IGZpbmRzIGFsbCBvZiBhIG1vZHVsZSdzIGRlcGVuZGVuY2llcyBhbmQgcmV0dXJucyBhIGZsYXQgZGVwZW5kZW5jeSBncmFwaC5cbiAgICAgKiBAbWV0aG9kIGRlcGVuZGVuY2llc1xuICAgICAqIEBwYXJhbSBtb2R1bGUge30gVGhlIG1vZHVsZS5cbiAgICAgKiBAcmV0dXJuIHtvYmplY3R9IEEgZGVwZW5kZW5jeSBncmFwaC5cbiAgICAgKi9cbiAgICBQbHVnaW4uZGVwZW5kZW5jaWVzID0gZnVuY3Rpb24obW9kdWxlLCB0cmFja2VkKSB7XG4gICAgICAgIHZhciBwYXJzZWRCYXNlID0gUGx1Z2luLmRlcGVuZGVuY3lQYXJzZShtb2R1bGUpLFxuICAgICAgICAgICAgbmFtZSA9IHBhcnNlZEJhc2UubmFtZTtcblxuICAgICAgICB0cmFja2VkID0gdHJhY2tlZCB8fCB7fTtcblxuICAgICAgICBpZiAobmFtZSBpbiB0cmFja2VkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBtb2R1bGUgPSBQbHVnaW4ucmVzb2x2ZShtb2R1bGUpIHx8IG1vZHVsZTtcblxuICAgICAgICB0cmFja2VkW25hbWVdID0gQ29tbW9uLm1hcChtb2R1bGUudXNlcyB8fCBbXSwgZnVuY3Rpb24oZGVwZW5kZW5jeSkge1xuICAgICAgICAgICAgaWYgKFBsdWdpbi5pc1BsdWdpbihkZXBlbmRlbmN5KSkge1xuICAgICAgICAgICAgICAgIFBsdWdpbi5yZWdpc3RlcihkZXBlbmRlbmN5KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIHBhcnNlZCA9IFBsdWdpbi5kZXBlbmRlbmN5UGFyc2UoZGVwZW5kZW5jeSksXG4gICAgICAgICAgICAgICAgcmVzb2x2ZWQgPSBQbHVnaW4ucmVzb2x2ZShkZXBlbmRlbmN5KTtcblxuICAgICAgICAgICAgaWYgKHJlc29sdmVkICYmICFQbHVnaW4udmVyc2lvblNhdGlzZmllcyhyZXNvbHZlZC52ZXJzaW9uLCBwYXJzZWQucmFuZ2UpKSB7XG4gICAgICAgICAgICAgICAgQ29tbW9uLndhcm4oXG4gICAgICAgICAgICAgICAgICAgICdQbHVnaW4uZGVwZW5kZW5jaWVzOicsIFBsdWdpbi50b1N0cmluZyhyZXNvbHZlZCksICdkb2VzIG5vdCBzYXRpc2Z5JyxcbiAgICAgICAgICAgICAgICAgICAgUGx1Z2luLnRvU3RyaW5nKHBhcnNlZCksICd1c2VkIGJ5JywgUGx1Z2luLnRvU3RyaW5nKHBhcnNlZEJhc2UpICsgJy4nXG4gICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgIHJlc29sdmVkLl93YXJuZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIG1vZHVsZS5fd2FybmVkID0gdHJ1ZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoIXJlc29sdmVkKSB7XG4gICAgICAgICAgICAgICAgQ29tbW9uLndhcm4oXG4gICAgICAgICAgICAgICAgICAgICdQbHVnaW4uZGVwZW5kZW5jaWVzOicsIFBsdWdpbi50b1N0cmluZyhkZXBlbmRlbmN5KSwgJ3VzZWQgYnknLFxuICAgICAgICAgICAgICAgICAgICBQbHVnaW4udG9TdHJpbmcocGFyc2VkQmFzZSksICdjb3VsZCBub3QgYmUgcmVzb2x2ZWQuJ1xuICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICBtb2R1bGUuX3dhcm5lZCA9IHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBwYXJzZWQubmFtZTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0cmFja2VkW25hbWVdLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgICAgICBQbHVnaW4uZGVwZW5kZW5jaWVzKHRyYWNrZWRbbmFtZV1baV0sIHRyYWNrZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRyYWNrZWQ7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFBhcnNlcyBhIGRlcGVuZGVuY3kgc3RyaW5nIGludG8gaXRzIGNvbXBvbmVudHMuXG4gICAgICogVGhlIGBkZXBlbmRlbmN5YCBpcyBhIHN0cmluZyBvZiB0aGUgZm9ybWF0IGAnbW9kdWxlLW5hbWUnYCBvciBgJ21vZHVsZS1uYW1lQHZlcnNpb24nYC5cbiAgICAgKiBTZWUgZG9jdW1lbnRhdGlvbiBmb3IgYFBsdWdpbi52ZXJzaW9uUGFyc2VgIGZvciBhIGRlc2NyaXB0aW9uIG9mIHRoZSBmb3JtYXQuXG4gICAgICogVGhpcyBmdW5jdGlvbiBjYW4gYWxzbyBoYW5kbGUgZGVwZW5kZW5jaWVzIHRoYXQgYXJlIGFscmVhZHkgcmVzb2x2ZWQgKGUuZy4gYSBtb2R1bGUgb2JqZWN0KS5cbiAgICAgKiBAbWV0aG9kIGRlcGVuZGVuY3lQYXJzZVxuICAgICAqIEBwYXJhbSBkZXBlbmRlbmN5IHtzdHJpbmd9IFRoZSBkZXBlbmRlbmN5IG9mIHRoZSBmb3JtYXQgYCdtb2R1bGUtbmFtZSdgIG9yIGAnbW9kdWxlLW5hbWVAdmVyc2lvbidgLlxuICAgICAqIEByZXR1cm4ge29iamVjdH0gVGhlIGRlcGVuZGVuY3kgcGFyc2VkIGludG8gaXRzIGNvbXBvbmVudHMuXG4gICAgICovXG4gICAgUGx1Z2luLmRlcGVuZGVuY3lQYXJzZSA9IGZ1bmN0aW9uKGRlcGVuZGVuY3kpIHtcbiAgICAgICAgaWYgKENvbW1vbi5pc1N0cmluZyhkZXBlbmRlbmN5KSkge1xuICAgICAgICAgICAgdmFyIHBhdHRlcm4gPSAvXltcXHctXSsoQChcXCp8W1xcXn5dP1xcZCtcXC5cXGQrXFwuXFxkKygtWzAtOUEtWmEtei0rXSspPykpPyQvO1xuXG4gICAgICAgICAgICBpZiAoIXBhdHRlcm4udGVzdChkZXBlbmRlbmN5KSkge1xuICAgICAgICAgICAgICAgIENvbW1vbi53YXJuKCdQbHVnaW4uZGVwZW5kZW5jeVBhcnNlOicsIGRlcGVuZGVuY3ksICdpcyBub3QgYSB2YWxpZCBkZXBlbmRlbmN5IHN0cmluZy4nKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBuYW1lOiBkZXBlbmRlbmN5LnNwbGl0KCdAJylbMF0sXG4gICAgICAgICAgICAgICAgcmFuZ2U6IGRlcGVuZGVuY3kuc3BsaXQoJ0AnKVsxXSB8fCAnKidcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbmFtZTogZGVwZW5kZW5jeS5uYW1lLFxuICAgICAgICAgICAgcmFuZ2U6IGRlcGVuZGVuY3kucmFuZ2UgfHwgZGVwZW5kZW5jeS52ZXJzaW9uXG4gICAgICAgIH07XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFBhcnNlcyBhIHZlcnNpb24gc3RyaW5nIGludG8gaXRzIGNvbXBvbmVudHMuICBcbiAgICAgKiBWZXJzaW9ucyBhcmUgc3RyaWN0bHkgb2YgdGhlIGZvcm1hdCBgeC55LnpgIChhcyBpbiBbc2VtdmVyXShodHRwOi8vc2VtdmVyLm9yZy8pKS5cbiAgICAgKiBWZXJzaW9ucyBtYXkgb3B0aW9uYWxseSBoYXZlIGEgcHJlcmVsZWFzZSB0YWcgaW4gdGhlIGZvcm1hdCBgeC55LnotYWxwaGFgLlxuICAgICAqIFJhbmdlcyBhcmUgYSBzdHJpY3Qgc3Vic2V0IG9mIFtucG0gcmFuZ2VzXShodHRwczovL2RvY3MubnBtanMuY29tL21pc2Mvc2VtdmVyI2FkdmFuY2VkLXJhbmdlLXN5bnRheCkuXG4gICAgICogT25seSB0aGUgZm9sbG93aW5nIHJhbmdlIHR5cGVzIGFyZSBzdXBwb3J0ZWQ6XG4gICAgICogLSBUaWxkZSByYW5nZXMgZS5nLiBgfjEuMi4zYFxuICAgICAqIC0gQ2FyZXQgcmFuZ2VzIGUuZy4gYF4xLjIuM2BcbiAgICAgKiAtIEdyZWF0ZXIgdGhhbiByYW5nZXMgZS5nLiBgPjEuMi4zYFxuICAgICAqIC0gR3JlYXRlciB0aGFuIG9yIGVxdWFsIHJhbmdlcyBlLmcuIGA+PTEuMi4zYFxuICAgICAqIC0gRXhhY3QgdmVyc2lvbiBlLmcuIGAxLjIuM2BcbiAgICAgKiAtIEFueSB2ZXJzaW9uIGAqYFxuICAgICAqIEBtZXRob2QgdmVyc2lvblBhcnNlXG4gICAgICogQHBhcmFtIHJhbmdlIHtzdHJpbmd9IFRoZSB2ZXJzaW9uIHN0cmluZy5cbiAgICAgKiBAcmV0dXJuIHtvYmplY3R9IFRoZSB2ZXJzaW9uIHJhbmdlIHBhcnNlZCBpbnRvIGl0cyBjb21wb25lbnRzLlxuICAgICAqL1xuICAgIFBsdWdpbi52ZXJzaW9uUGFyc2UgPSBmdW5jdGlvbihyYW5nZSkge1xuICAgICAgICB2YXIgcGF0dGVybiA9IC9eKFxcKil8KFxcXnx+fD49fD4pP1xccyooKFxcZCspXFwuKFxcZCspXFwuKFxcZCspKSgtWzAtOUEtWmEtei0rXSspPyQvO1xuXG4gICAgICAgIGlmICghcGF0dGVybi50ZXN0KHJhbmdlKSkge1xuICAgICAgICAgICAgQ29tbW9uLndhcm4oJ1BsdWdpbi52ZXJzaW9uUGFyc2U6JywgcmFuZ2UsICdpcyBub3QgYSB2YWxpZCB2ZXJzaW9uIG9yIHJhbmdlLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHBhcnRzID0gcGF0dGVybi5leGVjKHJhbmdlKTtcbiAgICAgICAgdmFyIG1ham9yID0gTnVtYmVyKHBhcnRzWzRdKTtcbiAgICAgICAgdmFyIG1pbm9yID0gTnVtYmVyKHBhcnRzWzVdKTtcbiAgICAgICAgdmFyIHBhdGNoID0gTnVtYmVyKHBhcnRzWzZdKTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgaXNSYW5nZTogQm9vbGVhbihwYXJ0c1sxXSB8fCBwYXJ0c1syXSksXG4gICAgICAgICAgICB2ZXJzaW9uOiBwYXJ0c1szXSxcbiAgICAgICAgICAgIHJhbmdlOiByYW5nZSxcbiAgICAgICAgICAgIG9wZXJhdG9yOiBwYXJ0c1sxXSB8fCBwYXJ0c1syXSB8fCAnJyxcbiAgICAgICAgICAgIG1ham9yOiBtYWpvcixcbiAgICAgICAgICAgIG1pbm9yOiBtaW5vcixcbiAgICAgICAgICAgIHBhdGNoOiBwYXRjaCxcbiAgICAgICAgICAgIHBhcnRzOiBbbWFqb3IsIG1pbm9yLCBwYXRjaF0sXG4gICAgICAgICAgICBwcmVyZWxlYXNlOiBwYXJ0c1s3XSxcbiAgICAgICAgICAgIG51bWJlcjogbWFqb3IgKiAxZTggKyBtaW5vciAqIDFlNCArIHBhdGNoXG4gICAgICAgIH07XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYHRydWVgIGlmIGB2ZXJzaW9uYCBzYXRpc2ZpZXMgdGhlIGdpdmVuIGByYW5nZWAuXG4gICAgICogU2VlIGRvY3VtZW50YXRpb24gZm9yIGBQbHVnaW4udmVyc2lvblBhcnNlYCBmb3IgYSBkZXNjcmlwdGlvbiBvZiB0aGUgZm9ybWF0LlxuICAgICAqIElmIGEgdmVyc2lvbiBvciByYW5nZSBpcyBub3Qgc3BlY2lmaWVkLCB0aGVuIGFueSB2ZXJzaW9uIChgKmApIGlzIGFzc3VtZWQgdG8gc2F0aXNmeS5cbiAgICAgKiBAbWV0aG9kIHZlcnNpb25TYXRpc2ZpZXNcbiAgICAgKiBAcGFyYW0gdmVyc2lvbiB7c3RyaW5nfSBUaGUgdmVyc2lvbiBzdHJpbmcuXG4gICAgICogQHBhcmFtIHJhbmdlIHtzdHJpbmd9IFRoZSByYW5nZSBzdHJpbmcuXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn0gYHRydWVgIGlmIGB2ZXJzaW9uYCBzYXRpc2ZpZXMgYHJhbmdlYCwgb3RoZXJ3aXNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgUGx1Z2luLnZlcnNpb25TYXRpc2ZpZXMgPSBmdW5jdGlvbih2ZXJzaW9uLCByYW5nZSkge1xuICAgICAgICByYW5nZSA9IHJhbmdlIHx8ICcqJztcblxuICAgICAgICB2YXIgciA9IFBsdWdpbi52ZXJzaW9uUGFyc2UocmFuZ2UpLFxuICAgICAgICAgICAgdiA9IFBsdWdpbi52ZXJzaW9uUGFyc2UodmVyc2lvbik7XG5cbiAgICAgICAgaWYgKHIuaXNSYW5nZSkge1xuICAgICAgICAgICAgaWYgKHIub3BlcmF0b3IgPT09ICcqJyB8fCB2ZXJzaW9uID09PSAnKicpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHIub3BlcmF0b3IgPT09ICc+Jykge1xuICAgICAgICAgICAgICAgIHJldHVybiB2Lm51bWJlciA+IHIubnVtYmVyO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoci5vcGVyYXRvciA9PT0gJz49Jykge1xuICAgICAgICAgICAgICAgIHJldHVybiB2Lm51bWJlciA+PSByLm51bWJlcjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHIub3BlcmF0b3IgPT09ICd+Jykge1xuICAgICAgICAgICAgICAgIHJldHVybiB2Lm1ham9yID09PSByLm1ham9yICYmIHYubWlub3IgPT09IHIubWlub3IgJiYgdi5wYXRjaCA+PSByLnBhdGNoO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoci5vcGVyYXRvciA9PT0gJ14nKSB7XG4gICAgICAgICAgICAgICAgaWYgKHIubWFqb3IgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB2Lm1ham9yID09PSByLm1ham9yICYmIHYubnVtYmVyID49IHIubnVtYmVyO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChyLm1pbm9yID4gMCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdi5taW5vciA9PT0gci5taW5vciAmJiB2LnBhdGNoID49IHIucGF0Y2g7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHYucGF0Y2ggPT09IHIucGF0Y2g7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdmVyc2lvbiA9PT0gcmFuZ2UgfHwgdmVyc2lvbiA9PT0gJyonO1xuICAgIH07XG5cbn0pKCk7XG5cblxuLyoqKi8gfSksXG4vKiAxNiAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG4vKipcbiogVGhlIGBNYXR0ZXIuUmVuZGVyYCBtb2R1bGUgaXMgYSBzaW1wbGUgY2FudmFzIGJhc2VkIHJlbmRlcmVyIGZvciB2aXN1YWxpc2luZyBpbnN0YW5jZXMgb2YgYE1hdHRlci5FbmdpbmVgLlxuKiBJdCBpcyBpbnRlbmRlZCBmb3IgZGV2ZWxvcG1lbnQgYW5kIGRlYnVnZ2luZyBwdXJwb3NlcywgYnV0IG1heSBhbHNvIGJlIHN1aXRhYmxlIGZvciBzaW1wbGUgZ2FtZXMuXG4qIEl0IGluY2x1ZGVzIGEgbnVtYmVyIG9mIGRyYXdpbmcgb3B0aW9ucyBpbmNsdWRpbmcgd2lyZWZyYW1lLCB2ZWN0b3Igd2l0aCBzdXBwb3J0IGZvciBzcHJpdGVzIGFuZCB2aWV3cG9ydHMuXG4qXG4qIEBjbGFzcyBSZW5kZXJcbiovXG5cbnZhciBSZW5kZXIgPSB7fTtcblxubW9kdWxlLmV4cG9ydHMgPSBSZW5kZXI7XG5cbnZhciBDb21tb24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDApO1xudmFyIENvbXBvc2l0ZSA9IF9fd2VicGFja19yZXF1aXJlX18oNSk7XG52YXIgQm91bmRzID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKTtcbnZhciBFdmVudHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQpO1xudmFyIFZlY3RvciA9IF9fd2VicGFja19yZXF1aXJlX18oMik7XG52YXIgTW91c2UgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEzKTtcblxuKGZ1bmN0aW9uKCkge1xuXG4gICAgdmFyIF9yZXF1ZXN0QW5pbWF0aW9uRnJhbWUsXG4gICAgICAgIF9jYW5jZWxBbmltYXRpb25GcmFtZTtcblxuICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICBfcmVxdWVzdEFuaW1hdGlvbkZyYW1lID0gd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSB8fCB3aW5kb3cud2Via2l0UmVxdWVzdEFuaW1hdGlvbkZyYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IHdpbmRvdy5tb3pSZXF1ZXN0QW5pbWF0aW9uRnJhbWUgfHwgd2luZG93Lm1zUmVxdWVzdEFuaW1hdGlvbkZyYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IGZ1bmN0aW9uKGNhbGxiYWNrKXsgd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7IGNhbGxiYWNrKENvbW1vbi5ub3coKSk7IH0sIDEwMDAgLyA2MCk7IH07XG5cbiAgICAgICAgX2NhbmNlbEFuaW1hdGlvbkZyYW1lID0gd2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lIHx8IHdpbmRvdy5tb3pDYW5jZWxBbmltYXRpb25GcmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCB3aW5kb3cud2Via2l0Q2FuY2VsQW5pbWF0aW9uRnJhbWUgfHwgd2luZG93Lm1zQ2FuY2VsQW5pbWF0aW9uRnJhbWU7XG4gICAgfVxuXG4gICAgUmVuZGVyLl9nb29kRnBzID0gMzA7XG4gICAgUmVuZGVyLl9nb29kRGVsdGEgPSAxMDAwIC8gNjA7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IHJlbmRlcmVyLiBUaGUgb3B0aW9ucyBwYXJhbWV0ZXIgaXMgYW4gb2JqZWN0IHRoYXQgc3BlY2lmaWVzIGFueSBwcm9wZXJ0aWVzIHlvdSB3aXNoIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0cy5cbiAgICAgKiBBbGwgcHJvcGVydGllcyBoYXZlIGRlZmF1bHQgdmFsdWVzLCBhbmQgbWFueSBhcmUgcHJlLWNhbGN1bGF0ZWQgYXV0b21hdGljYWxseSBiYXNlZCBvbiBvdGhlciBwcm9wZXJ0aWVzLlxuICAgICAqIFNlZSB0aGUgcHJvcGVydGllcyBzZWN0aW9uIGJlbG93IGZvciBkZXRhaWxlZCBpbmZvcm1hdGlvbiBvbiB3aGF0IHlvdSBjYW4gcGFzcyB2aWEgdGhlIGBvcHRpb25zYCBvYmplY3QuXG4gICAgICogQG1ldGhvZCBjcmVhdGVcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gW29wdGlvbnNdXG4gICAgICogQHJldHVybiB7cmVuZGVyfSBBIG5ldyByZW5kZXJlclxuICAgICAqL1xuICAgIFJlbmRlci5jcmVhdGUgPSBmdW5jdGlvbihvcHRpb25zKSB7XG4gICAgICAgIHZhciBkZWZhdWx0cyA9IHtcbiAgICAgICAgICAgIGNvbnRyb2xsZXI6IFJlbmRlcixcbiAgICAgICAgICAgIGVuZ2luZTogbnVsbCxcbiAgICAgICAgICAgIGVsZW1lbnQ6IG51bGwsXG4gICAgICAgICAgICBjYW52YXM6IG51bGwsXG4gICAgICAgICAgICBtb3VzZTogbnVsbCxcbiAgICAgICAgICAgIGZyYW1lUmVxdWVzdElkOiBudWxsLFxuICAgICAgICAgICAgdGltaW5nOiB7XG4gICAgICAgICAgICAgICAgaGlzdG9yeVNpemU6IDYwLFxuICAgICAgICAgICAgICAgIGRlbHRhOiAwLFxuICAgICAgICAgICAgICAgIGRlbHRhSGlzdG9yeTogW10sXG4gICAgICAgICAgICAgICAgbGFzdFRpbWU6IDAsXG4gICAgICAgICAgICAgICAgbGFzdFRpbWVzdGFtcDogMCxcbiAgICAgICAgICAgICAgICBsYXN0RWxhcHNlZDogMCxcbiAgICAgICAgICAgICAgICB0aW1lc3RhbXBFbGFwc2VkOiAwLFxuICAgICAgICAgICAgICAgIHRpbWVzdGFtcEVsYXBzZWRIaXN0b3J5OiBbXSxcbiAgICAgICAgICAgICAgICBlbmdpbmVEZWx0YUhpc3Rvcnk6IFtdLFxuICAgICAgICAgICAgICAgIGVuZ2luZUVsYXBzZWRIaXN0b3J5OiBbXSxcbiAgICAgICAgICAgICAgICBlbGFwc2VkSGlzdG9yeTogW11cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgICAgICAgd2lkdGg6IDgwMCxcbiAgICAgICAgICAgICAgICBoZWlnaHQ6IDYwMCxcbiAgICAgICAgICAgICAgICBwaXhlbFJhdGlvOiAxLFxuICAgICAgICAgICAgICAgIGJhY2tncm91bmQ6ICcjMTQxNTFmJyxcbiAgICAgICAgICAgICAgICB3aXJlZnJhbWVCYWNrZ3JvdW5kOiAnIzE0MTUxZicsXG4gICAgICAgICAgICAgICAgaGFzQm91bmRzOiAhIW9wdGlvbnMuYm91bmRzLFxuICAgICAgICAgICAgICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgd2lyZWZyYW1lczogdHJ1ZSxcbiAgICAgICAgICAgICAgICBzaG93U2xlZXBpbmc6IHRydWUsXG4gICAgICAgICAgICAgICAgc2hvd0RlYnVnOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBzaG93U3RhdHM6IGZhbHNlLFxuICAgICAgICAgICAgICAgIHNob3dQZXJmb3JtYW5jZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgc2hvd0JvdW5kczogZmFsc2UsXG4gICAgICAgICAgICAgICAgc2hvd1ZlbG9jaXR5OiBmYWxzZSxcbiAgICAgICAgICAgICAgICBzaG93Q29sbGlzaW9uczogZmFsc2UsXG4gICAgICAgICAgICAgICAgc2hvd1NlcGFyYXRpb25zOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBzaG93QXhlczogZmFsc2UsXG4gICAgICAgICAgICAgICAgc2hvd1Bvc2l0aW9uczogZmFsc2UsXG4gICAgICAgICAgICAgICAgc2hvd0FuZ2xlSW5kaWNhdG9yOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBzaG93SWRzOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBzaG93VmVydGV4TnVtYmVyczogZmFsc2UsXG4gICAgICAgICAgICAgICAgc2hvd0NvbnZleEh1bGxzOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBzaG93SW50ZXJuYWxFZGdlczogZmFsc2UsXG4gICAgICAgICAgICAgICAgc2hvd01vdXNlUG9zaXRpb246IGZhbHNlXG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgdmFyIHJlbmRlciA9IENvbW1vbi5leHRlbmQoZGVmYXVsdHMsIG9wdGlvbnMpO1xuXG4gICAgICAgIGlmIChyZW5kZXIuY2FudmFzKSB7XG4gICAgICAgICAgICByZW5kZXIuY2FudmFzLndpZHRoID0gcmVuZGVyLm9wdGlvbnMud2lkdGggfHwgcmVuZGVyLmNhbnZhcy53aWR0aDtcbiAgICAgICAgICAgIHJlbmRlci5jYW52YXMuaGVpZ2h0ID0gcmVuZGVyLm9wdGlvbnMuaGVpZ2h0IHx8IHJlbmRlci5jYW52YXMuaGVpZ2h0O1xuICAgICAgICB9XG5cbiAgICAgICAgcmVuZGVyLm1vdXNlID0gb3B0aW9ucy5tb3VzZTtcbiAgICAgICAgcmVuZGVyLmVuZ2luZSA9IG9wdGlvbnMuZW5naW5lO1xuICAgICAgICByZW5kZXIuY2FudmFzID0gcmVuZGVyLmNhbnZhcyB8fCBfY3JlYXRlQ2FudmFzKHJlbmRlci5vcHRpb25zLndpZHRoLCByZW5kZXIub3B0aW9ucy5oZWlnaHQpO1xuICAgICAgICByZW5kZXIuY29udGV4dCA9IHJlbmRlci5jYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtcbiAgICAgICAgcmVuZGVyLnRleHR1cmVzID0ge307XG5cbiAgICAgICAgcmVuZGVyLmJvdW5kcyA9IHJlbmRlci5ib3VuZHMgfHwge1xuICAgICAgICAgICAgbWluOiB7XG4gICAgICAgICAgICAgICAgeDogMCxcbiAgICAgICAgICAgICAgICB5OiAwXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbWF4OiB7XG4gICAgICAgICAgICAgICAgeDogcmVuZGVyLmNhbnZhcy53aWR0aCxcbiAgICAgICAgICAgICAgICB5OiByZW5kZXIuY2FudmFzLmhlaWdodFxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIC8vIGZvciB0ZW1wb3JhcnkgYmFjayBjb21wYXRpYmlsaXR5IG9ubHlcbiAgICAgICAgcmVuZGVyLm9wdGlvbnMuc2hvd0Jyb2FkcGhhc2UgPSBmYWxzZTtcblxuICAgICAgICBpZiAocmVuZGVyLm9wdGlvbnMucGl4ZWxSYXRpbyAhPT0gMSkge1xuICAgICAgICAgICAgUmVuZGVyLnNldFBpeGVsUmF0aW8ocmVuZGVyLCByZW5kZXIub3B0aW9ucy5waXhlbFJhdGlvKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChDb21tb24uaXNFbGVtZW50KHJlbmRlci5lbGVtZW50KSkge1xuICAgICAgICAgICAgcmVuZGVyLmVsZW1lbnQuYXBwZW5kQ2hpbGQocmVuZGVyLmNhbnZhcyk7XG4gICAgICAgIH0gZWxzZSBpZiAoIXJlbmRlci5jYW52YXMucGFyZW50Tm9kZSkge1xuICAgICAgICAgICAgQ29tbW9uLmxvZygnUmVuZGVyLmNyZWF0ZTogb3B0aW9ucy5lbGVtZW50IHdhcyB1bmRlZmluZWQsIHJlbmRlci5jYW52YXMgd2FzIGNyZWF0ZWQgYnV0IG5vdCBhcHBlbmRlZCcsICd3YXJuJyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVuZGVyO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBDb250aW51b3VzbHkgdXBkYXRlcyB0aGUgcmVuZGVyIGNhbnZhcyBvbiB0aGUgYHJlcXVlc3RBbmltYXRpb25GcmFtZWAgZXZlbnQuXG4gICAgICogQG1ldGhvZCBydW5cbiAgICAgKiBAcGFyYW0ge3JlbmRlcn0gcmVuZGVyXG4gICAgICovXG4gICAgUmVuZGVyLnJ1biA9IGZ1bmN0aW9uKHJlbmRlcikge1xuICAgICAgICAoZnVuY3Rpb24gbG9vcCh0aW1lKXtcbiAgICAgICAgICAgIHJlbmRlci5mcmFtZVJlcXVlc3RJZCA9IF9yZXF1ZXN0QW5pbWF0aW9uRnJhbWUobG9vcCk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIF91cGRhdGVUaW1pbmcocmVuZGVyLCB0aW1lKTtcblxuICAgICAgICAgICAgUmVuZGVyLndvcmxkKHJlbmRlciwgdGltZSk7XG5cbiAgICAgICAgICAgIGlmIChyZW5kZXIub3B0aW9ucy5zaG93U3RhdHMgfHwgcmVuZGVyLm9wdGlvbnMuc2hvd0RlYnVnKSB7XG4gICAgICAgICAgICAgICAgUmVuZGVyLnN0YXRzKHJlbmRlciwgcmVuZGVyLmNvbnRleHQsIHRpbWUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAocmVuZGVyLm9wdGlvbnMuc2hvd1BlcmZvcm1hbmNlIHx8IHJlbmRlci5vcHRpb25zLnNob3dEZWJ1Zykge1xuICAgICAgICAgICAgICAgIFJlbmRlci5wZXJmb3JtYW5jZShyZW5kZXIsIHJlbmRlci5jb250ZXh0LCB0aW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSkoKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogRW5kcyBleGVjdXRpb24gb2YgYFJlbmRlci5ydW5gIG9uIHRoZSBnaXZlbiBgcmVuZGVyYCwgYnkgY2FuY2VsaW5nIHRoZSBhbmltYXRpb24gZnJhbWUgcmVxdWVzdCBldmVudCBsb29wLlxuICAgICAqIEBtZXRob2Qgc3RvcFxuICAgICAqIEBwYXJhbSB7cmVuZGVyfSByZW5kZXJcbiAgICAgKi9cbiAgICBSZW5kZXIuc3RvcCA9IGZ1bmN0aW9uKHJlbmRlcikge1xuICAgICAgICBfY2FuY2VsQW5pbWF0aW9uRnJhbWUocmVuZGVyLmZyYW1lUmVxdWVzdElkKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgcGl4ZWwgcmF0aW8gb2YgdGhlIHJlbmRlcmVyIGFuZCB1cGRhdGVzIHRoZSBjYW52YXMuXG4gICAgICogVG8gYXV0b21hdGljYWxseSBkZXRlY3QgdGhlIGNvcnJlY3QgcmF0aW8sIHBhc3MgdGhlIHN0cmluZyBgJ2F1dG8nYCBmb3IgYHBpeGVsUmF0aW9gLlxuICAgICAqIEBtZXRob2Qgc2V0UGl4ZWxSYXRpb1xuICAgICAqIEBwYXJhbSB7cmVuZGVyfSByZW5kZXJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcGl4ZWxSYXRpb1xuICAgICAqL1xuICAgIFJlbmRlci5zZXRQaXhlbFJhdGlvID0gZnVuY3Rpb24ocmVuZGVyLCBwaXhlbFJhdGlvKSB7XG4gICAgICAgIHZhciBvcHRpb25zID0gcmVuZGVyLm9wdGlvbnMsXG4gICAgICAgICAgICBjYW52YXMgPSByZW5kZXIuY2FudmFzO1xuXG4gICAgICAgIGlmIChwaXhlbFJhdGlvID09PSAnYXV0bycpIHtcbiAgICAgICAgICAgIHBpeGVsUmF0aW8gPSBfZ2V0UGl4ZWxSYXRpbyhjYW52YXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgb3B0aW9ucy5waXhlbFJhdGlvID0gcGl4ZWxSYXRpbztcbiAgICAgICAgY2FudmFzLnNldEF0dHJpYnV0ZSgnZGF0YS1waXhlbC1yYXRpbycsIHBpeGVsUmF0aW8pO1xuICAgICAgICBjYW52YXMud2lkdGggPSBvcHRpb25zLndpZHRoICogcGl4ZWxSYXRpbztcbiAgICAgICAgY2FudmFzLmhlaWdodCA9IG9wdGlvbnMuaGVpZ2h0ICogcGl4ZWxSYXRpbztcbiAgICAgICAgY2FudmFzLnN0eWxlLndpZHRoID0gb3B0aW9ucy53aWR0aCArICdweCc7XG4gICAgICAgIGNhbnZhcy5zdHlsZS5oZWlnaHQgPSBvcHRpb25zLmhlaWdodCArICdweCc7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFBvc2l0aW9ucyBhbmQgc2l6ZXMgdGhlIHZpZXdwb3J0IGFyb3VuZCB0aGUgZ2l2ZW4gb2JqZWN0IGJvdW5kcy5cbiAgICAgKiBPYmplY3RzIG11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICAgICAqIC0gYG9iamVjdC5ib3VuZHNgXG4gICAgICogLSBgb2JqZWN0LnBvc2l0aW9uYFxuICAgICAqIC0gYG9iamVjdC5taW5gIGFuZCBgb2JqZWN0Lm1heGBcbiAgICAgKiAtIGBvYmplY3QueGAgYW5kIGBvYmplY3QueWBcbiAgICAgKiBAbWV0aG9kIGxvb2tBdFxuICAgICAqIEBwYXJhbSB7cmVuZGVyfSByZW5kZXJcbiAgICAgKiBAcGFyYW0ge29iamVjdFtdfSBvYmplY3RzXG4gICAgICogQHBhcmFtIHt2ZWN0b3J9IFtwYWRkaW5nXVxuICAgICAqIEBwYXJhbSB7Ym9vbH0gW2NlbnRlcj10cnVlXVxuICAgICAqL1xuICAgIFJlbmRlci5sb29rQXQgPSBmdW5jdGlvbihyZW5kZXIsIG9iamVjdHMsIHBhZGRpbmcsIGNlbnRlcikge1xuICAgICAgICBjZW50ZXIgPSB0eXBlb2YgY2VudGVyICE9PSAndW5kZWZpbmVkJyA/IGNlbnRlciA6IHRydWU7XG4gICAgICAgIG9iamVjdHMgPSBDb21tb24uaXNBcnJheShvYmplY3RzKSA/IG9iamVjdHMgOiBbb2JqZWN0c107XG4gICAgICAgIHBhZGRpbmcgPSBwYWRkaW5nIHx8IHtcbiAgICAgICAgICAgIHg6IDAsXG4gICAgICAgICAgICB5OiAwXG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gZmluZCBib3VuZHMgb2YgYWxsIG9iamVjdHNcbiAgICAgICAgdmFyIGJvdW5kcyA9IHtcbiAgICAgICAgICAgIG1pbjogeyB4OiBJbmZpbml0eSwgeTogSW5maW5pdHkgfSxcbiAgICAgICAgICAgIG1heDogeyB4OiAtSW5maW5pdHksIHk6IC1JbmZpbml0eSB9XG4gICAgICAgIH07XG5cbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvYmplY3RzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgICAgICB2YXIgb2JqZWN0ID0gb2JqZWN0c1tpXSxcbiAgICAgICAgICAgICAgICBtaW4gPSBvYmplY3QuYm91bmRzID8gb2JqZWN0LmJvdW5kcy5taW4gOiAob2JqZWN0Lm1pbiB8fCBvYmplY3QucG9zaXRpb24gfHwgb2JqZWN0KSxcbiAgICAgICAgICAgICAgICBtYXggPSBvYmplY3QuYm91bmRzID8gb2JqZWN0LmJvdW5kcy5tYXggOiAob2JqZWN0Lm1heCB8fCBvYmplY3QucG9zaXRpb24gfHwgb2JqZWN0KTtcblxuICAgICAgICAgICAgaWYgKG1pbiAmJiBtYXgpIHtcbiAgICAgICAgICAgICAgICBpZiAobWluLnggPCBib3VuZHMubWluLngpXG4gICAgICAgICAgICAgICAgICAgIGJvdW5kcy5taW4ueCA9IG1pbi54O1xuXG4gICAgICAgICAgICAgICAgaWYgKG1heC54ID4gYm91bmRzLm1heC54KVxuICAgICAgICAgICAgICAgICAgICBib3VuZHMubWF4LnggPSBtYXgueDtcblxuICAgICAgICAgICAgICAgIGlmIChtaW4ueSA8IGJvdW5kcy5taW4ueSlcbiAgICAgICAgICAgICAgICAgICAgYm91bmRzLm1pbi55ID0gbWluLnk7XG5cbiAgICAgICAgICAgICAgICBpZiAobWF4LnkgPiBib3VuZHMubWF4LnkpXG4gICAgICAgICAgICAgICAgICAgIGJvdW5kcy5tYXgueSA9IG1heC55O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gZmluZCByYXRpb3NcbiAgICAgICAgdmFyIHdpZHRoID0gKGJvdW5kcy5tYXgueCAtIGJvdW5kcy5taW4ueCkgKyAyICogcGFkZGluZy54LFxuICAgICAgICAgICAgaGVpZ2h0ID0gKGJvdW5kcy5tYXgueSAtIGJvdW5kcy5taW4ueSkgKyAyICogcGFkZGluZy55LFxuICAgICAgICAgICAgdmlld0hlaWdodCA9IHJlbmRlci5jYW52YXMuaGVpZ2h0LFxuICAgICAgICAgICAgdmlld1dpZHRoID0gcmVuZGVyLmNhbnZhcy53aWR0aCxcbiAgICAgICAgICAgIG91dGVyUmF0aW8gPSB2aWV3V2lkdGggLyB2aWV3SGVpZ2h0LFxuICAgICAgICAgICAgaW5uZXJSYXRpbyA9IHdpZHRoIC8gaGVpZ2h0LFxuICAgICAgICAgICAgc2NhbGVYID0gMSxcbiAgICAgICAgICAgIHNjYWxlWSA9IDE7XG5cbiAgICAgICAgLy8gZmluZCBzY2FsZSBmYWN0b3JcbiAgICAgICAgaWYgKGlubmVyUmF0aW8gPiBvdXRlclJhdGlvKSB7XG4gICAgICAgICAgICBzY2FsZVkgPSBpbm5lclJhdGlvIC8gb3V0ZXJSYXRpbztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNjYWxlWCA9IG91dGVyUmF0aW8gLyBpbm5lclJhdGlvO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gZW5hYmxlIGJvdW5kc1xuICAgICAgICByZW5kZXIub3B0aW9ucy5oYXNCb3VuZHMgPSB0cnVlO1xuXG4gICAgICAgIC8vIHBvc2l0aW9uIGFuZCBzaXplXG4gICAgICAgIHJlbmRlci5ib3VuZHMubWluLnggPSBib3VuZHMubWluLng7XG4gICAgICAgIHJlbmRlci5ib3VuZHMubWF4LnggPSBib3VuZHMubWluLnggKyB3aWR0aCAqIHNjYWxlWDtcbiAgICAgICAgcmVuZGVyLmJvdW5kcy5taW4ueSA9IGJvdW5kcy5taW4ueTtcbiAgICAgICAgcmVuZGVyLmJvdW5kcy5tYXgueSA9IGJvdW5kcy5taW4ueSArIGhlaWdodCAqIHNjYWxlWTtcblxuICAgICAgICAvLyBjZW50ZXJcbiAgICAgICAgaWYgKGNlbnRlcikge1xuICAgICAgICAgICAgcmVuZGVyLmJvdW5kcy5taW4ueCArPSB3aWR0aCAqIDAuNSAtICh3aWR0aCAqIHNjYWxlWCkgKiAwLjU7XG4gICAgICAgICAgICByZW5kZXIuYm91bmRzLm1heC54ICs9IHdpZHRoICogMC41IC0gKHdpZHRoICogc2NhbGVYKSAqIDAuNTtcbiAgICAgICAgICAgIHJlbmRlci5ib3VuZHMubWluLnkgKz0gaGVpZ2h0ICogMC41IC0gKGhlaWdodCAqIHNjYWxlWSkgKiAwLjU7XG4gICAgICAgICAgICByZW5kZXIuYm91bmRzLm1heC55ICs9IGhlaWdodCAqIDAuNSAtIChoZWlnaHQgKiBzY2FsZVkpICogMC41O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gcGFkZGluZ1xuICAgICAgICByZW5kZXIuYm91bmRzLm1pbi54IC09IHBhZGRpbmcueDtcbiAgICAgICAgcmVuZGVyLmJvdW5kcy5tYXgueCAtPSBwYWRkaW5nLng7XG4gICAgICAgIHJlbmRlci5ib3VuZHMubWluLnkgLT0gcGFkZGluZy55O1xuICAgICAgICByZW5kZXIuYm91bmRzLm1heC55IC09IHBhZGRpbmcueTtcblxuICAgICAgICAvLyB1cGRhdGUgbW91c2VcbiAgICAgICAgaWYgKHJlbmRlci5tb3VzZSkge1xuICAgICAgICAgICAgTW91c2Uuc2V0U2NhbGUocmVuZGVyLm1vdXNlLCB7XG4gICAgICAgICAgICAgICAgeDogKHJlbmRlci5ib3VuZHMubWF4LnggLSByZW5kZXIuYm91bmRzLm1pbi54KSAvIHJlbmRlci5jYW52YXMud2lkdGgsXG4gICAgICAgICAgICAgICAgeTogKHJlbmRlci5ib3VuZHMubWF4LnkgLSByZW5kZXIuYm91bmRzLm1pbi55KSAvIHJlbmRlci5jYW52YXMuaGVpZ2h0XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgTW91c2Uuc2V0T2Zmc2V0KHJlbmRlci5tb3VzZSwgcmVuZGVyLmJvdW5kcy5taW4pO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEFwcGxpZXMgdmlld3BvcnQgdHJhbnNmb3JtcyBiYXNlZCBvbiBgcmVuZGVyLmJvdW5kc2AgdG8gYSByZW5kZXIgY29udGV4dC5cbiAgICAgKiBAbWV0aG9kIHN0YXJ0Vmlld1RyYW5zZm9ybVxuICAgICAqIEBwYXJhbSB7cmVuZGVyfSByZW5kZXJcbiAgICAgKi9cbiAgICBSZW5kZXIuc3RhcnRWaWV3VHJhbnNmb3JtID0gZnVuY3Rpb24ocmVuZGVyKSB7XG4gICAgICAgIHZhciBib3VuZHNXaWR0aCA9IHJlbmRlci5ib3VuZHMubWF4LnggLSByZW5kZXIuYm91bmRzLm1pbi54LFxuICAgICAgICAgICAgYm91bmRzSGVpZ2h0ID0gcmVuZGVyLmJvdW5kcy5tYXgueSAtIHJlbmRlci5ib3VuZHMubWluLnksXG4gICAgICAgICAgICBib3VuZHNTY2FsZVggPSBib3VuZHNXaWR0aCAvIHJlbmRlci5vcHRpb25zLndpZHRoLFxuICAgICAgICAgICAgYm91bmRzU2NhbGVZID0gYm91bmRzSGVpZ2h0IC8gcmVuZGVyLm9wdGlvbnMuaGVpZ2h0O1xuXG4gICAgICAgIHJlbmRlci5jb250ZXh0LnNldFRyYW5zZm9ybShcbiAgICAgICAgICAgIHJlbmRlci5vcHRpb25zLnBpeGVsUmF0aW8gLyBib3VuZHNTY2FsZVgsIDAsIDAsIFxuICAgICAgICAgICAgcmVuZGVyLm9wdGlvbnMucGl4ZWxSYXRpbyAvIGJvdW5kc1NjYWxlWSwgMCwgMFxuICAgICAgICApO1xuICAgICAgICBcbiAgICAgICAgcmVuZGVyLmNvbnRleHQudHJhbnNsYXRlKC1yZW5kZXIuYm91bmRzLm1pbi54LCAtcmVuZGVyLmJvdW5kcy5taW4ueSk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFJlc2V0cyBhbGwgdHJhbnNmb3JtcyBvbiB0aGUgcmVuZGVyIGNvbnRleHQuXG4gICAgICogQG1ldGhvZCBlbmRWaWV3VHJhbnNmb3JtXG4gICAgICogQHBhcmFtIHtyZW5kZXJ9IHJlbmRlclxuICAgICAqL1xuICAgIFJlbmRlci5lbmRWaWV3VHJhbnNmb3JtID0gZnVuY3Rpb24ocmVuZGVyKSB7XG4gICAgICAgIHJlbmRlci5jb250ZXh0LnNldFRyYW5zZm9ybShyZW5kZXIub3B0aW9ucy5waXhlbFJhdGlvLCAwLCAwLCByZW5kZXIub3B0aW9ucy5waXhlbFJhdGlvLCAwLCAwKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogUmVuZGVycyB0aGUgZ2l2ZW4gYGVuZ2luZWAncyBgTWF0dGVyLldvcmxkYCBvYmplY3QuXG4gICAgICogVGhpcyBpcyB0aGUgZW50cnkgcG9pbnQgZm9yIGFsbCByZW5kZXJpbmcgYW5kIHNob3VsZCBiZSBjYWxsZWQgZXZlcnkgdGltZSB0aGUgc2NlbmUgY2hhbmdlcy5cbiAgICAgKiBAbWV0aG9kIHdvcmxkXG4gICAgICogQHBhcmFtIHtyZW5kZXJ9IHJlbmRlclxuICAgICAqL1xuICAgIFJlbmRlci53b3JsZCA9IGZ1bmN0aW9uKHJlbmRlciwgdGltZSkge1xuICAgICAgICB2YXIgc3RhcnRUaW1lID0gQ29tbW9uLm5vdygpLFxuICAgICAgICAgICAgZW5naW5lID0gcmVuZGVyLmVuZ2luZSxcbiAgICAgICAgICAgIHdvcmxkID0gZW5naW5lLndvcmxkLFxuICAgICAgICAgICAgY2FudmFzID0gcmVuZGVyLmNhbnZhcyxcbiAgICAgICAgICAgIGNvbnRleHQgPSByZW5kZXIuY29udGV4dCxcbiAgICAgICAgICAgIG9wdGlvbnMgPSByZW5kZXIub3B0aW9ucyxcbiAgICAgICAgICAgIHRpbWluZyA9IHJlbmRlci50aW1pbmc7XG5cbiAgICAgICAgdmFyIGFsbEJvZGllcyA9IENvbXBvc2l0ZS5hbGxCb2RpZXMod29ybGQpLFxuICAgICAgICAgICAgYWxsQ29uc3RyYWludHMgPSBDb21wb3NpdGUuYWxsQ29uc3RyYWludHMod29ybGQpLFxuICAgICAgICAgICAgYmFja2dyb3VuZCA9IG9wdGlvbnMud2lyZWZyYW1lcyA/IG9wdGlvbnMud2lyZWZyYW1lQmFja2dyb3VuZCA6IG9wdGlvbnMuYmFja2dyb3VuZCxcbiAgICAgICAgICAgIGJvZGllcyA9IFtdLFxuICAgICAgICAgICAgY29uc3RyYWludHMgPSBbXSxcbiAgICAgICAgICAgIGk7XG5cbiAgICAgICAgdmFyIGV2ZW50ID0ge1xuICAgICAgICAgICAgdGltZXN0YW1wOiBlbmdpbmUudGltaW5nLnRpbWVzdGFtcFxuICAgICAgICB9O1xuXG4gICAgICAgIEV2ZW50cy50cmlnZ2VyKHJlbmRlciwgJ2JlZm9yZVJlbmRlcicsIGV2ZW50KTtcblxuICAgICAgICAvLyBhcHBseSBiYWNrZ3JvdW5kIGlmIGl0IGhhcyBjaGFuZ2VkXG4gICAgICAgIGlmIChyZW5kZXIuY3VycmVudEJhY2tncm91bmQgIT09IGJhY2tncm91bmQpXG4gICAgICAgICAgICBfYXBwbHlCYWNrZ3JvdW5kKHJlbmRlciwgYmFja2dyb3VuZCk7XG5cbiAgICAgICAgLy8gY2xlYXIgdGhlIGNhbnZhcyB3aXRoIGEgdHJhbnNwYXJlbnQgZmlsbCwgdG8gYWxsb3cgdGhlIGNhbnZhcyBiYWNrZ3JvdW5kIHRvIHNob3dcbiAgICAgICAgY29udGV4dC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb24gPSAnc291cmNlLWluJztcbiAgICAgICAgY29udGV4dC5maWxsU3R5bGUgPSBcInRyYW5zcGFyZW50XCI7XG4gICAgICAgIGNvbnRleHQuZmlsbFJlY3QoMCwgMCwgY2FudmFzLndpZHRoLCBjYW52YXMuaGVpZ2h0KTtcbiAgICAgICAgY29udGV4dC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb24gPSAnc291cmNlLW92ZXInO1xuXG4gICAgICAgIC8vIGhhbmRsZSBib3VuZHNcbiAgICAgICAgaWYgKG9wdGlvbnMuaGFzQm91bmRzKSB7XG4gICAgICAgICAgICAvLyBmaWx0ZXIgb3V0IGJvZGllcyB0aGF0IGFyZSBub3QgaW4gdmlld1xuICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGFsbEJvZGllcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIHZhciBib2R5ID0gYWxsQm9kaWVzW2ldO1xuICAgICAgICAgICAgICAgIGlmIChCb3VuZHMub3ZlcmxhcHMoYm9keS5ib3VuZHMsIHJlbmRlci5ib3VuZHMpKVxuICAgICAgICAgICAgICAgICAgICBib2RpZXMucHVzaChib2R5KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gZmlsdGVyIG91dCBjb25zdHJhaW50cyB0aGF0IGFyZSBub3QgaW4gdmlld1xuICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGFsbENvbnN0cmFpbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgdmFyIGNvbnN0cmFpbnQgPSBhbGxDb25zdHJhaW50c1tpXSxcbiAgICAgICAgICAgICAgICAgICAgYm9keUEgPSBjb25zdHJhaW50LmJvZHlBLFxuICAgICAgICAgICAgICAgICAgICBib2R5QiA9IGNvbnN0cmFpbnQuYm9keUIsXG4gICAgICAgICAgICAgICAgICAgIHBvaW50QVdvcmxkID0gY29uc3RyYWludC5wb2ludEEsXG4gICAgICAgICAgICAgICAgICAgIHBvaW50QldvcmxkID0gY29uc3RyYWludC5wb2ludEI7XG5cbiAgICAgICAgICAgICAgICBpZiAoYm9keUEpIHBvaW50QVdvcmxkID0gVmVjdG9yLmFkZChib2R5QS5wb3NpdGlvbiwgY29uc3RyYWludC5wb2ludEEpO1xuICAgICAgICAgICAgICAgIGlmIChib2R5QikgcG9pbnRCV29ybGQgPSBWZWN0b3IuYWRkKGJvZHlCLnBvc2l0aW9uLCBjb25zdHJhaW50LnBvaW50Qik7XG5cbiAgICAgICAgICAgICAgICBpZiAoIXBvaW50QVdvcmxkIHx8ICFwb2ludEJXb3JsZClcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG5cbiAgICAgICAgICAgICAgICBpZiAoQm91bmRzLmNvbnRhaW5zKHJlbmRlci5ib3VuZHMsIHBvaW50QVdvcmxkKSB8fCBCb3VuZHMuY29udGFpbnMocmVuZGVyLmJvdW5kcywgcG9pbnRCV29ybGQpKVxuICAgICAgICAgICAgICAgICAgICBjb25zdHJhaW50cy5wdXNoKGNvbnN0cmFpbnQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyB0cmFuc2Zvcm0gdGhlIHZpZXdcbiAgICAgICAgICAgIFJlbmRlci5zdGFydFZpZXdUcmFuc2Zvcm0ocmVuZGVyKTtcblxuICAgICAgICAgICAgLy8gdXBkYXRlIG1vdXNlXG4gICAgICAgICAgICBpZiAocmVuZGVyLm1vdXNlKSB7XG4gICAgICAgICAgICAgICAgTW91c2Uuc2V0U2NhbGUocmVuZGVyLm1vdXNlLCB7XG4gICAgICAgICAgICAgICAgICAgIHg6IChyZW5kZXIuYm91bmRzLm1heC54IC0gcmVuZGVyLmJvdW5kcy5taW4ueCkgLyByZW5kZXIub3B0aW9ucy53aWR0aCxcbiAgICAgICAgICAgICAgICAgICAgeTogKHJlbmRlci5ib3VuZHMubWF4LnkgLSByZW5kZXIuYm91bmRzLm1pbi55KSAvIHJlbmRlci5vcHRpb25zLmhlaWdodFxuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgTW91c2Uuc2V0T2Zmc2V0KHJlbmRlci5tb3VzZSwgcmVuZGVyLmJvdW5kcy5taW4pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3RyYWludHMgPSBhbGxDb25zdHJhaW50cztcbiAgICAgICAgICAgIGJvZGllcyA9IGFsbEJvZGllcztcblxuICAgICAgICAgICAgaWYgKHJlbmRlci5vcHRpb25zLnBpeGVsUmF0aW8gIT09IDEpIHtcbiAgICAgICAgICAgICAgICByZW5kZXIuY29udGV4dC5zZXRUcmFuc2Zvcm0ocmVuZGVyLm9wdGlvbnMucGl4ZWxSYXRpbywgMCwgMCwgcmVuZGVyLm9wdGlvbnMucGl4ZWxSYXRpbywgMCwgMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIW9wdGlvbnMud2lyZWZyYW1lcyB8fCAoZW5naW5lLmVuYWJsZVNsZWVwaW5nICYmIG9wdGlvbnMuc2hvd1NsZWVwaW5nKSkge1xuICAgICAgICAgICAgLy8gZnVsbHkgZmVhdHVyZWQgcmVuZGVyaW5nIG9mIGJvZGllc1xuICAgICAgICAgICAgUmVuZGVyLmJvZGllcyhyZW5kZXIsIGJvZGllcywgY29udGV4dCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAob3B0aW9ucy5zaG93Q29udmV4SHVsbHMpXG4gICAgICAgICAgICAgICAgUmVuZGVyLmJvZHlDb252ZXhIdWxscyhyZW5kZXIsIGJvZGllcywgY29udGV4dCk7XG5cbiAgICAgICAgICAgIC8vIG9wdGltaXNlZCBtZXRob2QgZm9yIHdpcmVmcmFtZXMgb25seVxuICAgICAgICAgICAgUmVuZGVyLmJvZHlXaXJlZnJhbWVzKHJlbmRlciwgYm9kaWVzLCBjb250ZXh0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChvcHRpb25zLnNob3dCb3VuZHMpXG4gICAgICAgICAgICBSZW5kZXIuYm9keUJvdW5kcyhyZW5kZXIsIGJvZGllcywgY29udGV4dCk7XG5cbiAgICAgICAgaWYgKG9wdGlvbnMuc2hvd0F4ZXMgfHwgb3B0aW9ucy5zaG93QW5nbGVJbmRpY2F0b3IpXG4gICAgICAgICAgICBSZW5kZXIuYm9keUF4ZXMocmVuZGVyLCBib2RpZXMsIGNvbnRleHQpO1xuXG4gICAgICAgIGlmIChvcHRpb25zLnNob3dQb3NpdGlvbnMpXG4gICAgICAgICAgICBSZW5kZXIuYm9keVBvc2l0aW9ucyhyZW5kZXIsIGJvZGllcywgY29udGV4dCk7XG5cbiAgICAgICAgaWYgKG9wdGlvbnMuc2hvd1ZlbG9jaXR5KVxuICAgICAgICAgICAgUmVuZGVyLmJvZHlWZWxvY2l0eShyZW5kZXIsIGJvZGllcywgY29udGV4dCk7XG5cbiAgICAgICAgaWYgKG9wdGlvbnMuc2hvd0lkcylcbiAgICAgICAgICAgIFJlbmRlci5ib2R5SWRzKHJlbmRlciwgYm9kaWVzLCBjb250ZXh0KTtcblxuICAgICAgICBpZiAob3B0aW9ucy5zaG93U2VwYXJhdGlvbnMpXG4gICAgICAgICAgICBSZW5kZXIuc2VwYXJhdGlvbnMocmVuZGVyLCBlbmdpbmUucGFpcnMubGlzdCwgY29udGV4dCk7XG5cbiAgICAgICAgaWYgKG9wdGlvbnMuc2hvd0NvbGxpc2lvbnMpXG4gICAgICAgICAgICBSZW5kZXIuY29sbGlzaW9ucyhyZW5kZXIsIGVuZ2luZS5wYWlycy5saXN0LCBjb250ZXh0KTtcblxuICAgICAgICBpZiAob3B0aW9ucy5zaG93VmVydGV4TnVtYmVycylcbiAgICAgICAgICAgIFJlbmRlci52ZXJ0ZXhOdW1iZXJzKHJlbmRlciwgYm9kaWVzLCBjb250ZXh0KTtcblxuICAgICAgICBpZiAob3B0aW9ucy5zaG93TW91c2VQb3NpdGlvbilcbiAgICAgICAgICAgIFJlbmRlci5tb3VzZVBvc2l0aW9uKHJlbmRlciwgcmVuZGVyLm1vdXNlLCBjb250ZXh0KTtcblxuICAgICAgICBSZW5kZXIuY29uc3RyYWludHMoY29uc3RyYWludHMsIGNvbnRleHQpO1xuXG4gICAgICAgIGlmIChvcHRpb25zLmhhc0JvdW5kcykge1xuICAgICAgICAgICAgLy8gcmV2ZXJ0IHZpZXcgdHJhbnNmb3Jtc1xuICAgICAgICAgICAgUmVuZGVyLmVuZFZpZXdUcmFuc2Zvcm0ocmVuZGVyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIEV2ZW50cy50cmlnZ2VyKHJlbmRlciwgJ2FmdGVyUmVuZGVyJywgZXZlbnQpO1xuXG4gICAgICAgIC8vIGxvZyB0aGUgdGltZSBlbGFwc2VkIGNvbXB1dGluZyB0aGlzIHVwZGF0ZVxuICAgICAgICB0aW1pbmcubGFzdEVsYXBzZWQgPSBDb21tb24ubm93KCkgLSBzdGFydFRpbWU7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFJlbmRlcnMgc3RhdGlzdGljcyBhYm91dCB0aGUgZW5naW5lIGFuZCB3b3JsZCB1c2VmdWwgZm9yIGRlYnVnZ2luZy5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBtZXRob2Qgc3RhdHNcbiAgICAgKiBAcGFyYW0ge3JlbmRlcn0gcmVuZGVyXG4gICAgICogQHBhcmFtIHtSZW5kZXJpbmdDb250ZXh0fSBjb250ZXh0XG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IHRpbWVcbiAgICAgKi9cbiAgICBSZW5kZXIuc3RhdHMgPSBmdW5jdGlvbihyZW5kZXIsIGNvbnRleHQsIHRpbWUpIHtcbiAgICAgICAgdmFyIGVuZ2luZSA9IHJlbmRlci5lbmdpbmUsXG4gICAgICAgICAgICB3b3JsZCA9IGVuZ2luZS53b3JsZCxcbiAgICAgICAgICAgIGJvZGllcyA9IENvbXBvc2l0ZS5hbGxCb2RpZXMod29ybGQpLFxuICAgICAgICAgICAgcGFydHMgPSAwLFxuICAgICAgICAgICAgd2lkdGggPSA1NSxcbiAgICAgICAgICAgIGhlaWdodCA9IDQ0LFxuICAgICAgICAgICAgeCA9IDAsXG4gICAgICAgICAgICB5ID0gMDtcbiAgICAgICAgXG4gICAgICAgIC8vIGNvdW50IHBhcnRzXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYm9kaWVzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgICAgICBwYXJ0cyArPSBib2RpZXNbaV0ucGFydHMubGVuZ3RoO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gc2VjdGlvbnNcbiAgICAgICAgdmFyIHNlY3Rpb25zID0ge1xuICAgICAgICAgICAgJ1BhcnQnOiBwYXJ0cyxcbiAgICAgICAgICAgICdCb2R5JzogYm9kaWVzLmxlbmd0aCxcbiAgICAgICAgICAgICdDb25zJzogQ29tcG9zaXRlLmFsbENvbnN0cmFpbnRzKHdvcmxkKS5sZW5ndGgsXG4gICAgICAgICAgICAnQ29tcCc6IENvbXBvc2l0ZS5hbGxDb21wb3NpdGVzKHdvcmxkKS5sZW5ndGgsXG4gICAgICAgICAgICAnUGFpcic6IGVuZ2luZS5wYWlycy5saXN0Lmxlbmd0aFxuICAgICAgICB9O1xuXG4gICAgICAgIC8vIGJhY2tncm91bmRcbiAgICAgICAgY29udGV4dC5maWxsU3R5bGUgPSAnIzBlMGYxOSc7XG4gICAgICAgIGNvbnRleHQuZmlsbFJlY3QoeCwgeSwgd2lkdGggKiA1LjUsIGhlaWdodCk7XG5cbiAgICAgICAgY29udGV4dC5mb250ID0gJzEycHggQXJpYWwnO1xuICAgICAgICBjb250ZXh0LnRleHRCYXNlbGluZSA9ICd0b3AnO1xuICAgICAgICBjb250ZXh0LnRleHRBbGlnbiA9ICdyaWdodCc7XG5cbiAgICAgICAgLy8gc2VjdGlvbnNcbiAgICAgICAgZm9yICh2YXIga2V5IGluIHNlY3Rpb25zKSB7XG4gICAgICAgICAgICB2YXIgc2VjdGlvbiA9IHNlY3Rpb25zW2tleV07XG4gICAgICAgICAgICAvLyBsYWJlbFxuICAgICAgICAgICAgY29udGV4dC5maWxsU3R5bGUgPSAnI2FhYSc7XG4gICAgICAgICAgICBjb250ZXh0LmZpbGxUZXh0KGtleSwgeCArIHdpZHRoLCB5ICsgOCk7XG5cbiAgICAgICAgICAgIC8vIHZhbHVlXG4gICAgICAgICAgICBjb250ZXh0LmZpbGxTdHlsZSA9ICcjZWVlJztcbiAgICAgICAgICAgIGNvbnRleHQuZmlsbFRleHQoc2VjdGlvbiwgeCArIHdpZHRoLCB5ICsgMjYpO1xuXG4gICAgICAgICAgICB4ICs9IHdpZHRoO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFJlbmRlcnMgZW5naW5lIGFuZCByZW5kZXIgcGVyZm9ybWFuY2UgaW5mb3JtYXRpb24uXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbWV0aG9kIHBlcmZvcm1hbmNlXG4gICAgICogQHBhcmFtIHtyZW5kZXJ9IHJlbmRlclxuICAgICAqIEBwYXJhbSB7UmVuZGVyaW5nQ29udGV4dH0gY29udGV4dFxuICAgICAqL1xuICAgIFJlbmRlci5wZXJmb3JtYW5jZSA9IGZ1bmN0aW9uKHJlbmRlciwgY29udGV4dCkge1xuICAgICAgICB2YXIgZW5naW5lID0gcmVuZGVyLmVuZ2luZSxcbiAgICAgICAgICAgIHRpbWluZyA9IHJlbmRlci50aW1pbmcsXG4gICAgICAgICAgICBkZWx0YUhpc3RvcnkgPSB0aW1pbmcuZGVsdGFIaXN0b3J5LFxuICAgICAgICAgICAgZWxhcHNlZEhpc3RvcnkgPSB0aW1pbmcuZWxhcHNlZEhpc3RvcnksXG4gICAgICAgICAgICB0aW1lc3RhbXBFbGFwc2VkSGlzdG9yeSA9IHRpbWluZy50aW1lc3RhbXBFbGFwc2VkSGlzdG9yeSxcbiAgICAgICAgICAgIGVuZ2luZURlbHRhSGlzdG9yeSA9IHRpbWluZy5lbmdpbmVEZWx0YUhpc3RvcnksXG4gICAgICAgICAgICBlbmdpbmVFbGFwc2VkSGlzdG9yeSA9IHRpbWluZy5lbmdpbmVFbGFwc2VkSGlzdG9yeSxcbiAgICAgICAgICAgIGxhc3RFbmdpbmVEZWx0YSA9IGVuZ2luZS50aW1pbmcubGFzdERlbHRhO1xuICAgICAgICBcbiAgICAgICAgdmFyIGRlbHRhTWVhbiA9IF9tZWFuKGRlbHRhSGlzdG9yeSksXG4gICAgICAgICAgICBlbGFwc2VkTWVhbiA9IF9tZWFuKGVsYXBzZWRIaXN0b3J5KSxcbiAgICAgICAgICAgIGVuZ2luZURlbHRhTWVhbiA9IF9tZWFuKGVuZ2luZURlbHRhSGlzdG9yeSksXG4gICAgICAgICAgICBlbmdpbmVFbGFwc2VkTWVhbiA9IF9tZWFuKGVuZ2luZUVsYXBzZWRIaXN0b3J5KSxcbiAgICAgICAgICAgIHRpbWVzdGFtcEVsYXBzZWRNZWFuID0gX21lYW4odGltZXN0YW1wRWxhcHNlZEhpc3RvcnkpLFxuICAgICAgICAgICAgcmF0ZU1lYW4gPSAodGltZXN0YW1wRWxhcHNlZE1lYW4gLyBkZWx0YU1lYW4pIHx8IDAsXG4gICAgICAgICAgICBmcHMgPSAoMTAwMCAvIGRlbHRhTWVhbikgfHwgMDtcblxuICAgICAgICB2YXIgZ3JhcGhIZWlnaHQgPSA0LFxuICAgICAgICAgICAgZ2FwID0gMTIsXG4gICAgICAgICAgICB3aWR0aCA9IDYwLFxuICAgICAgICAgICAgaGVpZ2h0ID0gMzQsXG4gICAgICAgICAgICB4ID0gMTAsXG4gICAgICAgICAgICB5ID0gNjk7XG5cbiAgICAgICAgLy8gYmFja2dyb3VuZFxuICAgICAgICBjb250ZXh0LmZpbGxTdHlsZSA9ICcjMGUwZjE5JztcbiAgICAgICAgY29udGV4dC5maWxsUmVjdCgwLCA1MCwgZ2FwICogNCArIHdpZHRoICogNSArIDIyLCBoZWlnaHQpO1xuXG4gICAgICAgIC8vIHNob3cgRlBTXG4gICAgICAgIFJlbmRlci5zdGF0dXMoXG4gICAgICAgICAgICBjb250ZXh0LCB4LCB5LCB3aWR0aCwgZ3JhcGhIZWlnaHQsIGRlbHRhSGlzdG9yeS5sZW5ndGgsIFxuICAgICAgICAgICAgTWF0aC5yb3VuZChmcHMpICsgJyBmcHMnLCBcbiAgICAgICAgICAgIGZwcyAvIFJlbmRlci5fZ29vZEZwcyxcbiAgICAgICAgICAgIGZ1bmN0aW9uKGkpIHsgcmV0dXJuIChkZWx0YUhpc3RvcnlbaV0gLyBkZWx0YU1lYW4pIC0gMTsgfVxuICAgICAgICApO1xuXG4gICAgICAgIC8vIHNob3cgZW5naW5lIGRlbHRhXG4gICAgICAgIFJlbmRlci5zdGF0dXMoXG4gICAgICAgICAgICBjb250ZXh0LCB4ICsgZ2FwICsgd2lkdGgsIHksIHdpZHRoLCBncmFwaEhlaWdodCwgZW5naW5lRGVsdGFIaXN0b3J5Lmxlbmd0aCxcbiAgICAgICAgICAgIGxhc3RFbmdpbmVEZWx0YS50b0ZpeGVkKDIpICsgJyBkdCcsIFxuICAgICAgICAgICAgUmVuZGVyLl9nb29kRGVsdGEgLyBsYXN0RW5naW5lRGVsdGEsXG4gICAgICAgICAgICBmdW5jdGlvbihpKSB7IHJldHVybiAoZW5naW5lRGVsdGFIaXN0b3J5W2ldIC8gZW5naW5lRGVsdGFNZWFuKSAtIDE7IH1cbiAgICAgICAgKTtcblxuICAgICAgICAvLyBzaG93IGVuZ2luZSB1cGRhdGUgdGltZVxuICAgICAgICBSZW5kZXIuc3RhdHVzKFxuICAgICAgICAgICAgY29udGV4dCwgeCArIChnYXAgKyB3aWR0aCkgKiAyLCB5LCB3aWR0aCwgZ3JhcGhIZWlnaHQsIGVuZ2luZUVsYXBzZWRIaXN0b3J5Lmxlbmd0aCxcbiAgICAgICAgICAgIGVuZ2luZUVsYXBzZWRNZWFuLnRvRml4ZWQoMikgKyAnIHV0JywgXG4gICAgICAgICAgICAxIC0gKGVuZ2luZUVsYXBzZWRNZWFuIC8gUmVuZGVyLl9nb29kRnBzKSxcbiAgICAgICAgICAgIGZ1bmN0aW9uKGkpIHsgcmV0dXJuIChlbmdpbmVFbGFwc2VkSGlzdG9yeVtpXSAvIGVuZ2luZUVsYXBzZWRNZWFuKSAtIDE7IH1cbiAgICAgICAgKTtcblxuICAgICAgICAvLyBzaG93IHJlbmRlciB0aW1lXG4gICAgICAgIFJlbmRlci5zdGF0dXMoXG4gICAgICAgICAgICBjb250ZXh0LCB4ICsgKGdhcCArIHdpZHRoKSAqIDMsIHksIHdpZHRoLCBncmFwaEhlaWdodCwgZWxhcHNlZEhpc3RvcnkubGVuZ3RoLFxuICAgICAgICAgICAgZWxhcHNlZE1lYW4udG9GaXhlZCgyKSArICcgcnQnLCBcbiAgICAgICAgICAgIDEgLSAoZWxhcHNlZE1lYW4gLyBSZW5kZXIuX2dvb2RGcHMpLFxuICAgICAgICAgICAgZnVuY3Rpb24oaSkgeyByZXR1cm4gKGVsYXBzZWRIaXN0b3J5W2ldIC8gZWxhcHNlZE1lYW4pIC0gMTsgfVxuICAgICAgICApO1xuXG4gICAgICAgIC8vIHNob3cgZWZmZWN0aXZlIHNwZWVkXG4gICAgICAgIFJlbmRlci5zdGF0dXMoXG4gICAgICAgICAgICBjb250ZXh0LCB4ICsgKGdhcCArIHdpZHRoKSAqIDQsIHksIHdpZHRoLCBncmFwaEhlaWdodCwgdGltZXN0YW1wRWxhcHNlZEhpc3RvcnkubGVuZ3RoLCBcbiAgICAgICAgICAgIHJhdGVNZWFuLnRvRml4ZWQoMikgKyAnIHgnLCBcbiAgICAgICAgICAgIHJhdGVNZWFuICogcmF0ZU1lYW4gKiByYXRlTWVhbixcbiAgICAgICAgICAgIGZ1bmN0aW9uKGkpIHsgcmV0dXJuICgoKHRpbWVzdGFtcEVsYXBzZWRIaXN0b3J5W2ldIC8gZGVsdGFIaXN0b3J5W2ldKSAvIHJhdGVNZWFuKSB8fCAwKSAtIDE7IH1cbiAgICAgICAgKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogUmVuZGVycyBhIGxhYmVsLCBpbmRpY2F0b3IgYW5kIGEgY2hhcnQuXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbWV0aG9kIHN0YXR1c1xuICAgICAqIEBwYXJhbSB7UmVuZGVyaW5nQ29udGV4dH0gY29udGV4dFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB4XG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHlcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gd2lkdGhcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gaGVpZ2h0XG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGNvdW50XG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGxhYmVsXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGluZGljYXRvclxuICAgICAqIEBwYXJhbSB7ZnVuY3Rpb259IHBsb3RZXG4gICAgICovXG4gICAgUmVuZGVyLnN0YXR1cyA9IGZ1bmN0aW9uKGNvbnRleHQsIHgsIHksIHdpZHRoLCBoZWlnaHQsIGNvdW50LCBsYWJlbCwgaW5kaWNhdG9yLCBwbG90WSkge1xuICAgICAgICAvLyBiYWNrZ3JvdW5kXG4gICAgICAgIGNvbnRleHQuc3Ryb2tlU3R5bGUgPSAnIzg4OCc7XG4gICAgICAgIGNvbnRleHQuZmlsbFN0eWxlID0gJyM0NDQnO1xuICAgICAgICBjb250ZXh0LmxpbmVXaWR0aCA9IDE7XG4gICAgICAgIGNvbnRleHQuZmlsbFJlY3QoeCwgeSArIDcsIHdpZHRoLCAxKTtcblxuICAgICAgICAvLyBjaGFydFxuICAgICAgICBjb250ZXh0LmJlZ2luUGF0aCgpO1xuICAgICAgICBjb250ZXh0Lm1vdmVUbyh4LCB5ICsgNyAtIGhlaWdodCAqIENvbW1vbi5jbGFtcCgwLjQgKiBwbG90WSgwKSwgLTIsIDIpKTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB3aWR0aDsgaSArPSAxKSB7XG4gICAgICAgICAgICBjb250ZXh0LmxpbmVUbyh4ICsgaSwgeSArIDcgLSAoaSA8IGNvdW50ID8gaGVpZ2h0ICogQ29tbW9uLmNsYW1wKDAuNCAqIHBsb3RZKGkpLCAtMiwgMikgOiAwKSk7XG4gICAgICAgIH1cbiAgICAgICAgY29udGV4dC5zdHJva2UoKTtcblxuICAgICAgICAvLyBpbmRpY2F0b3JcbiAgICAgICAgY29udGV4dC5maWxsU3R5bGUgPSAnaHNsKCcgKyBDb21tb24uY2xhbXAoMjUgKyA5NSAqIGluZGljYXRvciwgMCwgMTIwKSArICcsMTAwJSw2MCUpJztcbiAgICAgICAgY29udGV4dC5maWxsUmVjdCh4LCB5IC0gNywgNCwgNCk7XG5cbiAgICAgICAgLy8gbGFiZWxcbiAgICAgICAgY29udGV4dC5mb250ID0gJzEycHggQXJpYWwnO1xuICAgICAgICBjb250ZXh0LnRleHRCYXNlbGluZSA9ICdtaWRkbGUnO1xuICAgICAgICBjb250ZXh0LnRleHRBbGlnbiA9ICdyaWdodCc7XG4gICAgICAgIGNvbnRleHQuZmlsbFN0eWxlID0gJyNlZWUnO1xuICAgICAgICBjb250ZXh0LmZpbGxUZXh0KGxhYmVsLCB4ICsgd2lkdGgsIHkgLSA1KTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogRGVzY3JpcHRpb25cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBtZXRob2QgY29uc3RyYWludHNcbiAgICAgKiBAcGFyYW0ge2NvbnN0cmFpbnRbXX0gY29uc3RyYWludHNcbiAgICAgKiBAcGFyYW0ge1JlbmRlcmluZ0NvbnRleHR9IGNvbnRleHRcbiAgICAgKi9cbiAgICBSZW5kZXIuY29uc3RyYWludHMgPSBmdW5jdGlvbihjb25zdHJhaW50cywgY29udGV4dCkge1xuICAgICAgICB2YXIgYyA9IGNvbnRleHQ7XG5cbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb25zdHJhaW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIGNvbnN0cmFpbnQgPSBjb25zdHJhaW50c1tpXTtcblxuICAgICAgICAgICAgaWYgKCFjb25zdHJhaW50LnJlbmRlci52aXNpYmxlIHx8ICFjb25zdHJhaW50LnBvaW50QSB8fCAhY29uc3RyYWludC5wb2ludEIpXG4gICAgICAgICAgICAgICAgY29udGludWU7XG5cbiAgICAgICAgICAgIHZhciBib2R5QSA9IGNvbnN0cmFpbnQuYm9keUEsXG4gICAgICAgICAgICAgICAgYm9keUIgPSBjb25zdHJhaW50LmJvZHlCLFxuICAgICAgICAgICAgICAgIHN0YXJ0LFxuICAgICAgICAgICAgICAgIGVuZDtcblxuICAgICAgICAgICAgaWYgKGJvZHlBKSB7XG4gICAgICAgICAgICAgICAgc3RhcnQgPSBWZWN0b3IuYWRkKGJvZHlBLnBvc2l0aW9uLCBjb25zdHJhaW50LnBvaW50QSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHN0YXJ0ID0gY29uc3RyYWludC5wb2ludEE7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChjb25zdHJhaW50LnJlbmRlci50eXBlID09PSAncGluJykge1xuICAgICAgICAgICAgICAgIGMuYmVnaW5QYXRoKCk7XG4gICAgICAgICAgICAgICAgYy5hcmMoc3RhcnQueCwgc3RhcnQueSwgMywgMCwgMiAqIE1hdGguUEkpO1xuICAgICAgICAgICAgICAgIGMuY2xvc2VQYXRoKCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChib2R5Qikge1xuICAgICAgICAgICAgICAgICAgICBlbmQgPSBWZWN0b3IuYWRkKGJvZHlCLnBvc2l0aW9uLCBjb25zdHJhaW50LnBvaW50Qik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZW5kID0gY29uc3RyYWludC5wb2ludEI7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgYy5iZWdpblBhdGgoKTtcbiAgICAgICAgICAgICAgICBjLm1vdmVUbyhzdGFydC54LCBzdGFydC55KTtcblxuICAgICAgICAgICAgICAgIGlmIChjb25zdHJhaW50LnJlbmRlci50eXBlID09PSAnc3ByaW5nJykge1xuICAgICAgICAgICAgICAgICAgICB2YXIgZGVsdGEgPSBWZWN0b3Iuc3ViKGVuZCwgc3RhcnQpLFxuICAgICAgICAgICAgICAgICAgICAgICAgbm9ybWFsID0gVmVjdG9yLnBlcnAoVmVjdG9yLm5vcm1hbGlzZShkZWx0YSkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29pbHMgPSBNYXRoLmNlaWwoQ29tbW9uLmNsYW1wKGNvbnN0cmFpbnQubGVuZ3RoIC8gNSwgMTIsIDIwKSksXG4gICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQ7XG5cbiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaiA9IDE7IGogPCBjb2lsczsgaiArPSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSBqICUgMiA9PT0gMCA/IDEgOiAtMTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgYy5saW5lVG8oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQueCArIGRlbHRhLnggKiAoaiAvIGNvaWxzKSArIG5vcm1hbC54ICogb2Zmc2V0ICogNCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydC55ICsgZGVsdGEueSAqIChqIC8gY29pbHMpICsgbm9ybWFsLnkgKiBvZmZzZXQgKiA0XG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgYy5saW5lVG8oZW5kLngsIGVuZC55KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGNvbnN0cmFpbnQucmVuZGVyLmxpbmVXaWR0aCkge1xuICAgICAgICAgICAgICAgIGMubGluZVdpZHRoID0gY29uc3RyYWludC5yZW5kZXIubGluZVdpZHRoO1xuICAgICAgICAgICAgICAgIGMuc3Ryb2tlU3R5bGUgPSBjb25zdHJhaW50LnJlbmRlci5zdHJva2VTdHlsZTtcbiAgICAgICAgICAgICAgICBjLnN0cm9rZSgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoY29uc3RyYWludC5yZW5kZXIuYW5jaG9ycykge1xuICAgICAgICAgICAgICAgIGMuZmlsbFN0eWxlID0gY29uc3RyYWludC5yZW5kZXIuc3Ryb2tlU3R5bGU7XG4gICAgICAgICAgICAgICAgYy5iZWdpblBhdGgoKTtcbiAgICAgICAgICAgICAgICBjLmFyYyhzdGFydC54LCBzdGFydC55LCAzLCAwLCAyICogTWF0aC5QSSk7XG4gICAgICAgICAgICAgICAgYy5hcmMoZW5kLngsIGVuZC55LCAzLCAwLCAyICogTWF0aC5QSSk7XG4gICAgICAgICAgICAgICAgYy5jbG9zZVBhdGgoKTtcbiAgICAgICAgICAgICAgICBjLmZpbGwoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBEZXNjcmlwdGlvblxuICAgICAqIEBwcml2YXRlXG4gICAgICogQG1ldGhvZCBib2RpZXNcbiAgICAgKiBAcGFyYW0ge3JlbmRlcn0gcmVuZGVyXG4gICAgICogQHBhcmFtIHtib2R5W119IGJvZGllc1xuICAgICAqIEBwYXJhbSB7UmVuZGVyaW5nQ29udGV4dH0gY29udGV4dFxuICAgICAqL1xuICAgIFJlbmRlci5ib2RpZXMgPSBmdW5jdGlvbihyZW5kZXIsIGJvZGllcywgY29udGV4dCkge1xuICAgICAgICB2YXIgYyA9IGNvbnRleHQsXG4gICAgICAgICAgICBlbmdpbmUgPSByZW5kZXIuZW5naW5lLFxuICAgICAgICAgICAgb3B0aW9ucyA9IHJlbmRlci5vcHRpb25zLFxuICAgICAgICAgICAgc2hvd0ludGVybmFsRWRnZXMgPSBvcHRpb25zLnNob3dJbnRlcm5hbEVkZ2VzIHx8ICFvcHRpb25zLndpcmVmcmFtZXMsXG4gICAgICAgICAgICBib2R5LFxuICAgICAgICAgICAgcGFydCxcbiAgICAgICAgICAgIGksXG4gICAgICAgICAgICBrO1xuXG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBib2RpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGJvZHkgPSBib2RpZXNbaV07XG5cbiAgICAgICAgICAgIGlmICghYm9keS5yZW5kZXIudmlzaWJsZSlcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcblxuICAgICAgICAgICAgLy8gaGFuZGxlIGNvbXBvdW5kIHBhcnRzXG4gICAgICAgICAgICBmb3IgKGsgPSBib2R5LnBhcnRzLmxlbmd0aCA+IDEgPyAxIDogMDsgayA8IGJvZHkucGFydHMubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgICAgICAgICBwYXJ0ID0gYm9keS5wYXJ0c1trXTtcblxuICAgICAgICAgICAgICAgIGlmICghcGFydC5yZW5kZXIudmlzaWJsZSlcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG5cbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5zaG93U2xlZXBpbmcgJiYgYm9keS5pc1NsZWVwaW5nKSB7XG4gICAgICAgICAgICAgICAgICAgIGMuZ2xvYmFsQWxwaGEgPSAwLjUgKiBwYXJ0LnJlbmRlci5vcGFjaXR5O1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocGFydC5yZW5kZXIub3BhY2l0eSAhPT0gMSkge1xuICAgICAgICAgICAgICAgICAgICBjLmdsb2JhbEFscGhhID0gcGFydC5yZW5kZXIub3BhY2l0eTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAocGFydC5yZW5kZXIuc3ByaXRlICYmIHBhcnQucmVuZGVyLnNwcml0ZS50ZXh0dXJlICYmICFvcHRpb25zLndpcmVmcmFtZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gcGFydCBzcHJpdGVcbiAgICAgICAgICAgICAgICAgICAgdmFyIHNwcml0ZSA9IHBhcnQucmVuZGVyLnNwcml0ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHR1cmUgPSBfZ2V0VGV4dHVyZShyZW5kZXIsIHNwcml0ZS50ZXh0dXJlKTtcblxuICAgICAgICAgICAgICAgICAgICBjLnRyYW5zbGF0ZShwYXJ0LnBvc2l0aW9uLngsIHBhcnQucG9zaXRpb24ueSk7XG4gICAgICAgICAgICAgICAgICAgIGMucm90YXRlKHBhcnQuYW5nbGUpO1xuXG4gICAgICAgICAgICAgICAgICAgIGMuZHJhd0ltYWdlKFxuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dHVyZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHR1cmUud2lkdGggKiAtc3ByaXRlLnhPZmZzZXQgKiBzcHJpdGUueFNjYWxlLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dHVyZS5oZWlnaHQgKiAtc3ByaXRlLnlPZmZzZXQgKiBzcHJpdGUueVNjYWxlLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dHVyZS53aWR0aCAqIHNwcml0ZS54U2NhbGUsXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0dXJlLmhlaWdodCAqIHNwcml0ZS55U2NhbGVcbiAgICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgICAvLyByZXZlcnQgdHJhbnNsYXRpb24sIGhvcGVmdWxseSBmYXN0ZXIgdGhhbiBzYXZlIC8gcmVzdG9yZVxuICAgICAgICAgICAgICAgICAgICBjLnJvdGF0ZSgtcGFydC5hbmdsZSk7XG4gICAgICAgICAgICAgICAgICAgIGMudHJhbnNsYXRlKC1wYXJ0LnBvc2l0aW9uLngsIC1wYXJ0LnBvc2l0aW9uLnkpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHBhcnQgcG9seWdvblxuICAgICAgICAgICAgICAgICAgICBpZiAocGFydC5jaXJjbGVSYWRpdXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGMuYmVnaW5QYXRoKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjLmFyYyhwYXJ0LnBvc2l0aW9uLngsIHBhcnQucG9zaXRpb24ueSwgcGFydC5jaXJjbGVSYWRpdXMsIDAsIDIgKiBNYXRoLlBJKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGMuYmVnaW5QYXRoKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjLm1vdmVUbyhwYXJ0LnZlcnRpY2VzWzBdLngsIHBhcnQudmVydGljZXNbMF0ueSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGogPSAxOyBqIDwgcGFydC52ZXJ0aWNlcy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcGFydC52ZXJ0aWNlc1tqIC0gMV0uaXNJbnRlcm5hbCB8fCBzaG93SW50ZXJuYWxFZGdlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLmxpbmVUbyhwYXJ0LnZlcnRpY2VzW2pdLngsIHBhcnQudmVydGljZXNbal0ueSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYy5tb3ZlVG8ocGFydC52ZXJ0aWNlc1tqXS54LCBwYXJ0LnZlcnRpY2VzW2pdLnkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJ0LnZlcnRpY2VzW2pdLmlzSW50ZXJuYWwgJiYgIXNob3dJbnRlcm5hbEVkZ2VzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMubW92ZVRvKHBhcnQudmVydGljZXNbKGogKyAxKSAlIHBhcnQudmVydGljZXMubGVuZ3RoXS54LCBwYXJ0LnZlcnRpY2VzWyhqICsgMSkgJSBwYXJ0LnZlcnRpY2VzLmxlbmd0aF0ueSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBjLmxpbmVUbyhwYXJ0LnZlcnRpY2VzWzBdLngsIHBhcnQudmVydGljZXNbMF0ueSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjLmNsb3NlUGF0aCgpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFvcHRpb25zLndpcmVmcmFtZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGMuZmlsbFN0eWxlID0gcGFydC5yZW5kZXIuZmlsbFN0eWxlO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFydC5yZW5kZXIubGluZVdpZHRoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYy5saW5lV2lkdGggPSBwYXJ0LnJlbmRlci5saW5lV2lkdGg7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYy5zdHJva2VTdHlsZSA9IHBhcnQucmVuZGVyLnN0cm9rZVN0eWxlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMuc3Ryb2tlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGMuZmlsbCgpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgYy5saW5lV2lkdGggPSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgYy5zdHJva2VTdHlsZSA9ICcjYmJiJztcbiAgICAgICAgICAgICAgICAgICAgICAgIGMuc3Ryb2tlKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjLmdsb2JhbEFscGhhID0gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBPcHRpbWlzZWQgbWV0aG9kIGZvciBkcmF3aW5nIGJvZHkgd2lyZWZyYW1lcyBpbiBvbmUgcGFzc1xuICAgICAqIEBwcml2YXRlXG4gICAgICogQG1ldGhvZCBib2R5V2lyZWZyYW1lc1xuICAgICAqIEBwYXJhbSB7cmVuZGVyfSByZW5kZXJcbiAgICAgKiBAcGFyYW0ge2JvZHlbXX0gYm9kaWVzXG4gICAgICogQHBhcmFtIHtSZW5kZXJpbmdDb250ZXh0fSBjb250ZXh0XG4gICAgICovXG4gICAgUmVuZGVyLmJvZHlXaXJlZnJhbWVzID0gZnVuY3Rpb24ocmVuZGVyLCBib2RpZXMsIGNvbnRleHQpIHtcbiAgICAgICAgdmFyIGMgPSBjb250ZXh0LFxuICAgICAgICAgICAgc2hvd0ludGVybmFsRWRnZXMgPSByZW5kZXIub3B0aW9ucy5zaG93SW50ZXJuYWxFZGdlcyxcbiAgICAgICAgICAgIGJvZHksXG4gICAgICAgICAgICBwYXJ0LFxuICAgICAgICAgICAgaSxcbiAgICAgICAgICAgIGosXG4gICAgICAgICAgICBrO1xuXG4gICAgICAgIGMuYmVnaW5QYXRoKCk7XG5cbiAgICAgICAgLy8gcmVuZGVyIGFsbCBib2RpZXNcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGJvZGllcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgYm9keSA9IGJvZGllc1tpXTtcblxuICAgICAgICAgICAgaWYgKCFib2R5LnJlbmRlci52aXNpYmxlKVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICAvLyBoYW5kbGUgY29tcG91bmQgcGFydHNcbiAgICAgICAgICAgIGZvciAoayA9IGJvZHkucGFydHMubGVuZ3RoID4gMSA/IDEgOiAwOyBrIDwgYm9keS5wYXJ0cy5sZW5ndGg7IGsrKykge1xuICAgICAgICAgICAgICAgIHBhcnQgPSBib2R5LnBhcnRzW2tdO1xuXG4gICAgICAgICAgICAgICAgYy5tb3ZlVG8ocGFydC52ZXJ0aWNlc1swXS54LCBwYXJ0LnZlcnRpY2VzWzBdLnkpO1xuXG4gICAgICAgICAgICAgICAgZm9yIChqID0gMTsgaiA8IHBhcnQudmVydGljZXMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFwYXJ0LnZlcnRpY2VzW2ogLSAxXS5pc0ludGVybmFsIHx8IHNob3dJbnRlcm5hbEVkZ2VzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjLmxpbmVUbyhwYXJ0LnZlcnRpY2VzW2pdLngsIHBhcnQudmVydGljZXNbal0ueSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjLm1vdmVUbyhwYXJ0LnZlcnRpY2VzW2pdLngsIHBhcnQudmVydGljZXNbal0ueSk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAocGFydC52ZXJ0aWNlc1tqXS5pc0ludGVybmFsICYmICFzaG93SW50ZXJuYWxFZGdlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgYy5tb3ZlVG8ocGFydC52ZXJ0aWNlc1soaiArIDEpICUgcGFydC52ZXJ0aWNlcy5sZW5ndGhdLngsIHBhcnQudmVydGljZXNbKGogKyAxKSAlIHBhcnQudmVydGljZXMubGVuZ3RoXS55KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGMubGluZVRvKHBhcnQudmVydGljZXNbMF0ueCwgcGFydC52ZXJ0aWNlc1swXS55KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGMubGluZVdpZHRoID0gMTtcbiAgICAgICAgYy5zdHJva2VTdHlsZSA9ICcjYmJiJztcbiAgICAgICAgYy5zdHJva2UoKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogT3B0aW1pc2VkIG1ldGhvZCBmb3IgZHJhd2luZyBib2R5IGNvbnZleCBodWxsIHdpcmVmcmFtZXMgaW4gb25lIHBhc3NcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBtZXRob2QgYm9keUNvbnZleEh1bGxzXG4gICAgICogQHBhcmFtIHtyZW5kZXJ9IHJlbmRlclxuICAgICAqIEBwYXJhbSB7Ym9keVtdfSBib2RpZXNcbiAgICAgKiBAcGFyYW0ge1JlbmRlcmluZ0NvbnRleHR9IGNvbnRleHRcbiAgICAgKi9cbiAgICBSZW5kZXIuYm9keUNvbnZleEh1bGxzID0gZnVuY3Rpb24ocmVuZGVyLCBib2RpZXMsIGNvbnRleHQpIHtcbiAgICAgICAgdmFyIGMgPSBjb250ZXh0LFxuICAgICAgICAgICAgYm9keSxcbiAgICAgICAgICAgIHBhcnQsXG4gICAgICAgICAgICBpLFxuICAgICAgICAgICAgaixcbiAgICAgICAgICAgIGs7XG5cbiAgICAgICAgYy5iZWdpblBhdGgoKTtcblxuICAgICAgICAvLyByZW5kZXIgY29udmV4IGh1bGxzXG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBib2RpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGJvZHkgPSBib2RpZXNbaV07XG5cbiAgICAgICAgICAgIGlmICghYm9keS5yZW5kZXIudmlzaWJsZSB8fCBib2R5LnBhcnRzLmxlbmd0aCA9PT0gMSlcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcblxuICAgICAgICAgICAgYy5tb3ZlVG8oYm9keS52ZXJ0aWNlc1swXS54LCBib2R5LnZlcnRpY2VzWzBdLnkpO1xuXG4gICAgICAgICAgICBmb3IgKGogPSAxOyBqIDwgYm9keS52ZXJ0aWNlcy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgIGMubGluZVRvKGJvZHkudmVydGljZXNbal0ueCwgYm9keS52ZXJ0aWNlc1tqXS55KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYy5saW5lVG8oYm9keS52ZXJ0aWNlc1swXS54LCBib2R5LnZlcnRpY2VzWzBdLnkpO1xuICAgICAgICB9XG5cbiAgICAgICAgYy5saW5lV2lkdGggPSAxO1xuICAgICAgICBjLnN0cm9rZVN0eWxlID0gJ3JnYmEoMjU1LDI1NSwyNTUsMC4yKSc7XG4gICAgICAgIGMuc3Ryb2tlKCk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFJlbmRlcnMgYm9keSB2ZXJ0ZXggbnVtYmVycy5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBtZXRob2QgdmVydGV4TnVtYmVyc1xuICAgICAqIEBwYXJhbSB7cmVuZGVyfSByZW5kZXJcbiAgICAgKiBAcGFyYW0ge2JvZHlbXX0gYm9kaWVzXG4gICAgICogQHBhcmFtIHtSZW5kZXJpbmdDb250ZXh0fSBjb250ZXh0XG4gICAgICovXG4gICAgUmVuZGVyLnZlcnRleE51bWJlcnMgPSBmdW5jdGlvbihyZW5kZXIsIGJvZGllcywgY29udGV4dCkge1xuICAgICAgICB2YXIgYyA9IGNvbnRleHQsXG4gICAgICAgICAgICBpLFxuICAgICAgICAgICAgaixcbiAgICAgICAgICAgIGs7XG5cbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGJvZGllcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIHBhcnRzID0gYm9kaWVzW2ldLnBhcnRzO1xuICAgICAgICAgICAgZm9yIChrID0gcGFydHMubGVuZ3RoID4gMSA/IDEgOiAwOyBrIDwgcGFydHMubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgICAgICAgICB2YXIgcGFydCA9IHBhcnRzW2tdO1xuICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBwYXJ0LnZlcnRpY2VzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgICAgIGMuZmlsbFN0eWxlID0gJ3JnYmEoMjU1LDI1NSwyNTUsMC4yKSc7XG4gICAgICAgICAgICAgICAgICAgIGMuZmlsbFRleHQoaSArICdfJyArIGosIHBhcnQucG9zaXRpb24ueCArIChwYXJ0LnZlcnRpY2VzW2pdLnggLSBwYXJ0LnBvc2l0aW9uLngpICogMC44LCBwYXJ0LnBvc2l0aW9uLnkgKyAocGFydC52ZXJ0aWNlc1tqXS55IC0gcGFydC5wb3NpdGlvbi55KSAqIDAuOCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFJlbmRlcnMgbW91c2UgcG9zaXRpb24uXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbWV0aG9kIG1vdXNlUG9zaXRpb25cbiAgICAgKiBAcGFyYW0ge3JlbmRlcn0gcmVuZGVyXG4gICAgICogQHBhcmFtIHttb3VzZX0gbW91c2VcbiAgICAgKiBAcGFyYW0ge1JlbmRlcmluZ0NvbnRleHR9IGNvbnRleHRcbiAgICAgKi9cbiAgICBSZW5kZXIubW91c2VQb3NpdGlvbiA9IGZ1bmN0aW9uKHJlbmRlciwgbW91c2UsIGNvbnRleHQpIHtcbiAgICAgICAgdmFyIGMgPSBjb250ZXh0O1xuICAgICAgICBjLmZpbGxTdHlsZSA9ICdyZ2JhKDI1NSwyNTUsMjU1LDAuOCknO1xuICAgICAgICBjLmZpbGxUZXh0KG1vdXNlLnBvc2l0aW9uLnggKyAnICAnICsgbW91c2UucG9zaXRpb24ueSwgbW91c2UucG9zaXRpb24ueCArIDUsIG1vdXNlLnBvc2l0aW9uLnkgLSA1KTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogRHJhd3MgYm9keSBib3VuZHNcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBtZXRob2QgYm9keUJvdW5kc1xuICAgICAqIEBwYXJhbSB7cmVuZGVyfSByZW5kZXJcbiAgICAgKiBAcGFyYW0ge2JvZHlbXX0gYm9kaWVzXG4gICAgICogQHBhcmFtIHtSZW5kZXJpbmdDb250ZXh0fSBjb250ZXh0XG4gICAgICovXG4gICAgUmVuZGVyLmJvZHlCb3VuZHMgPSBmdW5jdGlvbihyZW5kZXIsIGJvZGllcywgY29udGV4dCkge1xuICAgICAgICB2YXIgYyA9IGNvbnRleHQsXG4gICAgICAgICAgICBlbmdpbmUgPSByZW5kZXIuZW5naW5lLFxuICAgICAgICAgICAgb3B0aW9ucyA9IHJlbmRlci5vcHRpb25zO1xuXG4gICAgICAgIGMuYmVnaW5QYXRoKCk7XG5cbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBib2RpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBib2R5ID0gYm9kaWVzW2ldO1xuXG4gICAgICAgICAgICBpZiAoYm9keS5yZW5kZXIudmlzaWJsZSkge1xuICAgICAgICAgICAgICAgIHZhciBwYXJ0cyA9IGJvZGllc1tpXS5wYXJ0cztcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBqID0gcGFydHMubGVuZ3RoID4gMSA/IDEgOiAwOyBqIDwgcGFydHMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHBhcnQgPSBwYXJ0c1tqXTtcbiAgICAgICAgICAgICAgICAgICAgYy5yZWN0KHBhcnQuYm91bmRzLm1pbi54LCBwYXJ0LmJvdW5kcy5taW4ueSwgcGFydC5ib3VuZHMubWF4LnggLSBwYXJ0LmJvdW5kcy5taW4ueCwgcGFydC5ib3VuZHMubWF4LnkgLSBwYXJ0LmJvdW5kcy5taW4ueSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG9wdGlvbnMud2lyZWZyYW1lcykge1xuICAgICAgICAgICAgYy5zdHJva2VTdHlsZSA9ICdyZ2JhKDI1NSwyNTUsMjU1LDAuMDgpJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGMuc3Ryb2tlU3R5bGUgPSAncmdiYSgwLDAsMCwwLjEpJztcbiAgICAgICAgfVxuXG4gICAgICAgIGMubGluZVdpZHRoID0gMTtcbiAgICAgICAgYy5zdHJva2UoKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogRHJhd3MgYm9keSBhbmdsZSBpbmRpY2F0b3JzIGFuZCBheGVzXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbWV0aG9kIGJvZHlBeGVzXG4gICAgICogQHBhcmFtIHtyZW5kZXJ9IHJlbmRlclxuICAgICAqIEBwYXJhbSB7Ym9keVtdfSBib2RpZXNcbiAgICAgKiBAcGFyYW0ge1JlbmRlcmluZ0NvbnRleHR9IGNvbnRleHRcbiAgICAgKi9cbiAgICBSZW5kZXIuYm9keUF4ZXMgPSBmdW5jdGlvbihyZW5kZXIsIGJvZGllcywgY29udGV4dCkge1xuICAgICAgICB2YXIgYyA9IGNvbnRleHQsXG4gICAgICAgICAgICBlbmdpbmUgPSByZW5kZXIuZW5naW5lLFxuICAgICAgICAgICAgb3B0aW9ucyA9IHJlbmRlci5vcHRpb25zLFxuICAgICAgICAgICAgcGFydCxcbiAgICAgICAgICAgIGksXG4gICAgICAgICAgICBqLFxuICAgICAgICAgICAgaztcblxuICAgICAgICBjLmJlZ2luUGF0aCgpO1xuXG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBib2RpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBib2R5ID0gYm9kaWVzW2ldLFxuICAgICAgICAgICAgICAgIHBhcnRzID0gYm9keS5wYXJ0cztcblxuICAgICAgICAgICAgaWYgKCFib2R5LnJlbmRlci52aXNpYmxlKVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICBpZiAob3B0aW9ucy5zaG93QXhlcykge1xuICAgICAgICAgICAgICAgIC8vIHJlbmRlciBhbGwgYXhlc1xuICAgICAgICAgICAgICAgIGZvciAoaiA9IHBhcnRzLmxlbmd0aCA+IDEgPyAxIDogMDsgaiA8IHBhcnRzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcnQgPSBwYXJ0c1tqXTtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IHBhcnQuYXhlcy5sZW5ndGg7IGsrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGF4aXMgPSBwYXJ0LmF4ZXNba107XG4gICAgICAgICAgICAgICAgICAgICAgICBjLm1vdmVUbyhwYXJ0LnBvc2l0aW9uLngsIHBhcnQucG9zaXRpb24ueSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjLmxpbmVUbyhwYXJ0LnBvc2l0aW9uLnggKyBheGlzLnggKiAyMCwgcGFydC5wb3NpdGlvbi55ICsgYXhpcy55ICogMjApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBmb3IgKGogPSBwYXJ0cy5sZW5ndGggPiAxID8gMSA6IDA7IGogPCBwYXJ0cy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgICAgICBwYXJ0ID0gcGFydHNbal07XG4gICAgICAgICAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCBwYXJ0LmF4ZXMubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlbmRlciBhIHNpbmdsZSBheGlzIGluZGljYXRvclxuICAgICAgICAgICAgICAgICAgICAgICAgYy5tb3ZlVG8ocGFydC5wb3NpdGlvbi54LCBwYXJ0LnBvc2l0aW9uLnkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYy5saW5lVG8oKHBhcnQudmVydGljZXNbMF0ueCArIHBhcnQudmVydGljZXNbcGFydC52ZXJ0aWNlcy5sZW5ndGgtMV0ueCkgLyAyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwYXJ0LnZlcnRpY2VzWzBdLnkgKyBwYXJ0LnZlcnRpY2VzW3BhcnQudmVydGljZXMubGVuZ3RoLTFdLnkpIC8gMik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAob3B0aW9ucy53aXJlZnJhbWVzKSB7XG4gICAgICAgICAgICBjLnN0cm9rZVN0eWxlID0gJ2luZGlhbnJlZCc7XG4gICAgICAgICAgICBjLmxpbmVXaWR0aCA9IDE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjLnN0cm9rZVN0eWxlID0gJ3JnYmEoMjU1LCAyNTUsIDI1NSwgMC40KSc7XG4gICAgICAgICAgICBjLmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiA9ICdvdmVybGF5JztcbiAgICAgICAgICAgIGMubGluZVdpZHRoID0gMjtcbiAgICAgICAgfVxuXG4gICAgICAgIGMuc3Ryb2tlKCk7XG4gICAgICAgIGMuZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uID0gJ3NvdXJjZS1vdmVyJztcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogRHJhd3MgYm9keSBwb3NpdGlvbnNcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBtZXRob2QgYm9keVBvc2l0aW9uc1xuICAgICAqIEBwYXJhbSB7cmVuZGVyfSByZW5kZXJcbiAgICAgKiBAcGFyYW0ge2JvZHlbXX0gYm9kaWVzXG4gICAgICogQHBhcmFtIHtSZW5kZXJpbmdDb250ZXh0fSBjb250ZXh0XG4gICAgICovXG4gICAgUmVuZGVyLmJvZHlQb3NpdGlvbnMgPSBmdW5jdGlvbihyZW5kZXIsIGJvZGllcywgY29udGV4dCkge1xuICAgICAgICB2YXIgYyA9IGNvbnRleHQsXG4gICAgICAgICAgICBlbmdpbmUgPSByZW5kZXIuZW5naW5lLFxuICAgICAgICAgICAgb3B0aW9ucyA9IHJlbmRlci5vcHRpb25zLFxuICAgICAgICAgICAgYm9keSxcbiAgICAgICAgICAgIHBhcnQsXG4gICAgICAgICAgICBpLFxuICAgICAgICAgICAgaztcblxuICAgICAgICBjLmJlZ2luUGF0aCgpO1xuXG4gICAgICAgIC8vIHJlbmRlciBjdXJyZW50IHBvc2l0aW9uc1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYm9kaWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBib2R5ID0gYm9kaWVzW2ldO1xuXG4gICAgICAgICAgICBpZiAoIWJvZHkucmVuZGVyLnZpc2libGUpXG4gICAgICAgICAgICAgICAgY29udGludWU7XG5cbiAgICAgICAgICAgIC8vIGhhbmRsZSBjb21wb3VuZCBwYXJ0c1xuICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IGJvZHkucGFydHMubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgICAgICAgICBwYXJ0ID0gYm9keS5wYXJ0c1trXTtcbiAgICAgICAgICAgICAgICBjLmFyYyhwYXJ0LnBvc2l0aW9uLngsIHBhcnQucG9zaXRpb24ueSwgMywgMCwgMiAqIE1hdGguUEksIGZhbHNlKTtcbiAgICAgICAgICAgICAgICBjLmNsb3NlUGF0aCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG9wdGlvbnMud2lyZWZyYW1lcykge1xuICAgICAgICAgICAgYy5maWxsU3R5bGUgPSAnaW5kaWFucmVkJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGMuZmlsbFN0eWxlID0gJ3JnYmEoMCwwLDAsMC41KSc7XG4gICAgICAgIH1cbiAgICAgICAgYy5maWxsKCk7XG5cbiAgICAgICAgYy5iZWdpblBhdGgoKTtcblxuICAgICAgICAvLyByZW5kZXIgcHJldmlvdXMgcG9zaXRpb25zXG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBib2RpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGJvZHkgPSBib2RpZXNbaV07XG4gICAgICAgICAgICBpZiAoYm9keS5yZW5kZXIudmlzaWJsZSkge1xuICAgICAgICAgICAgICAgIGMuYXJjKGJvZHkucG9zaXRpb25QcmV2LngsIGJvZHkucG9zaXRpb25QcmV2LnksIDIsIDAsIDIgKiBNYXRoLlBJLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgYy5jbG9zZVBhdGgoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGMuZmlsbFN0eWxlID0gJ3JnYmEoMjU1LDE2NSwwLDAuOCknO1xuICAgICAgICBjLmZpbGwoKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogRHJhd3MgYm9keSB2ZWxvY2l0eVxuICAgICAqIEBwcml2YXRlXG4gICAgICogQG1ldGhvZCBib2R5VmVsb2NpdHlcbiAgICAgKiBAcGFyYW0ge3JlbmRlcn0gcmVuZGVyXG4gICAgICogQHBhcmFtIHtib2R5W119IGJvZGllc1xuICAgICAqIEBwYXJhbSB7UmVuZGVyaW5nQ29udGV4dH0gY29udGV4dFxuICAgICAqL1xuICAgIFJlbmRlci5ib2R5VmVsb2NpdHkgPSBmdW5jdGlvbihyZW5kZXIsIGJvZGllcywgY29udGV4dCkge1xuICAgICAgICB2YXIgYyA9IGNvbnRleHQ7XG5cbiAgICAgICAgYy5iZWdpblBhdGgoKTtcblxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGJvZGllcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIGJvZHkgPSBib2RpZXNbaV07XG5cbiAgICAgICAgICAgIGlmICghYm9keS5yZW5kZXIudmlzaWJsZSlcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcblxuICAgICAgICAgICAgYy5tb3ZlVG8oYm9keS5wb3NpdGlvbi54LCBib2R5LnBvc2l0aW9uLnkpO1xuICAgICAgICAgICAgYy5saW5lVG8oYm9keS5wb3NpdGlvbi54ICsgKGJvZHkucG9zaXRpb24ueCAtIGJvZHkucG9zaXRpb25QcmV2LngpICogMiwgYm9keS5wb3NpdGlvbi55ICsgKGJvZHkucG9zaXRpb24ueSAtIGJvZHkucG9zaXRpb25QcmV2LnkpICogMik7XG4gICAgICAgIH1cblxuICAgICAgICBjLmxpbmVXaWR0aCA9IDM7XG4gICAgICAgIGMuc3Ryb2tlU3R5bGUgPSAnY29ybmZsb3dlcmJsdWUnO1xuICAgICAgICBjLnN0cm9rZSgpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBEcmF3cyBib2R5IGlkc1xuICAgICAqIEBwcml2YXRlXG4gICAgICogQG1ldGhvZCBib2R5SWRzXG4gICAgICogQHBhcmFtIHtyZW5kZXJ9IHJlbmRlclxuICAgICAqIEBwYXJhbSB7Ym9keVtdfSBib2RpZXNcbiAgICAgKiBAcGFyYW0ge1JlbmRlcmluZ0NvbnRleHR9IGNvbnRleHRcbiAgICAgKi9cbiAgICBSZW5kZXIuYm9keUlkcyA9IGZ1bmN0aW9uKHJlbmRlciwgYm9kaWVzLCBjb250ZXh0KSB7XG4gICAgICAgIHZhciBjID0gY29udGV4dCxcbiAgICAgICAgICAgIGksXG4gICAgICAgICAgICBqO1xuXG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBib2RpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmICghYm9kaWVzW2ldLnJlbmRlci52aXNpYmxlKVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICB2YXIgcGFydHMgPSBib2RpZXNbaV0ucGFydHM7XG4gICAgICAgICAgICBmb3IgKGogPSBwYXJ0cy5sZW5ndGggPiAxID8gMSA6IDA7IGogPCBwYXJ0cy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgIHZhciBwYXJ0ID0gcGFydHNbal07XG4gICAgICAgICAgICAgICAgYy5mb250ID0gXCIxMnB4IEFyaWFsXCI7XG4gICAgICAgICAgICAgICAgYy5maWxsU3R5bGUgPSAncmdiYSgyNTUsMjU1LDI1NSwwLjUpJztcbiAgICAgICAgICAgICAgICBjLmZpbGxUZXh0KHBhcnQuaWQsIHBhcnQucG9zaXRpb24ueCArIDEwLCBwYXJ0LnBvc2l0aW9uLnkgLSAxMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogRGVzY3JpcHRpb25cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBtZXRob2QgY29sbGlzaW9uc1xuICAgICAqIEBwYXJhbSB7cmVuZGVyfSByZW5kZXJcbiAgICAgKiBAcGFyYW0ge3BhaXJbXX0gcGFpcnNcbiAgICAgKiBAcGFyYW0ge1JlbmRlcmluZ0NvbnRleHR9IGNvbnRleHRcbiAgICAgKi9cbiAgICBSZW5kZXIuY29sbGlzaW9ucyA9IGZ1bmN0aW9uKHJlbmRlciwgcGFpcnMsIGNvbnRleHQpIHtcbiAgICAgICAgdmFyIGMgPSBjb250ZXh0LFxuICAgICAgICAgICAgb3B0aW9ucyA9IHJlbmRlci5vcHRpb25zLFxuICAgICAgICAgICAgcGFpcixcbiAgICAgICAgICAgIGNvbGxpc2lvbixcbiAgICAgICAgICAgIGNvcnJlY3RlZCxcbiAgICAgICAgICAgIGJvZHlBLFxuICAgICAgICAgICAgYm9keUIsXG4gICAgICAgICAgICBpLFxuICAgICAgICAgICAgajtcblxuICAgICAgICBjLmJlZ2luUGF0aCgpO1xuXG4gICAgICAgIC8vIHJlbmRlciBjb2xsaXNpb24gcG9zaXRpb25zXG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBwYWlycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgcGFpciA9IHBhaXJzW2ldO1xuXG4gICAgICAgICAgICBpZiAoIXBhaXIuaXNBY3RpdmUpXG4gICAgICAgICAgICAgICAgY29udGludWU7XG5cbiAgICAgICAgICAgIGNvbGxpc2lvbiA9IHBhaXIuY29sbGlzaW9uO1xuICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IHBhaXIuYWN0aXZlQ29udGFjdHMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICB2YXIgY29udGFjdCA9IHBhaXIuYWN0aXZlQ29udGFjdHNbal0sXG4gICAgICAgICAgICAgICAgICAgIHZlcnRleCA9IGNvbnRhY3QudmVydGV4O1xuICAgICAgICAgICAgICAgIGMucmVjdCh2ZXJ0ZXgueCAtIDEuNSwgdmVydGV4LnkgLSAxLjUsIDMuNSwgMy41KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChvcHRpb25zLndpcmVmcmFtZXMpIHtcbiAgICAgICAgICAgIGMuZmlsbFN0eWxlID0gJ3JnYmEoMjU1LDI1NSwyNTUsMC43KSc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjLmZpbGxTdHlsZSA9ICdvcmFuZ2UnO1xuICAgICAgICB9XG4gICAgICAgIGMuZmlsbCgpO1xuXG4gICAgICAgIGMuYmVnaW5QYXRoKCk7XG5cbiAgICAgICAgLy8gcmVuZGVyIGNvbGxpc2lvbiBub3JtYWxzXG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBwYWlycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgcGFpciA9IHBhaXJzW2ldO1xuXG4gICAgICAgICAgICBpZiAoIXBhaXIuaXNBY3RpdmUpXG4gICAgICAgICAgICAgICAgY29udGludWU7XG5cbiAgICAgICAgICAgIGNvbGxpc2lvbiA9IHBhaXIuY29sbGlzaW9uO1xuXG4gICAgICAgICAgICBpZiAocGFpci5hY3RpdmVDb250YWN0cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgdmFyIG5vcm1hbFBvc1ggPSBwYWlyLmFjdGl2ZUNvbnRhY3RzWzBdLnZlcnRleC54LFxuICAgICAgICAgICAgICAgICAgICBub3JtYWxQb3NZID0gcGFpci5hY3RpdmVDb250YWN0c1swXS52ZXJ0ZXgueTtcblxuICAgICAgICAgICAgICAgIGlmIChwYWlyLmFjdGl2ZUNvbnRhY3RzLmxlbmd0aCA9PT0gMikge1xuICAgICAgICAgICAgICAgICAgICBub3JtYWxQb3NYID0gKHBhaXIuYWN0aXZlQ29udGFjdHNbMF0udmVydGV4LnggKyBwYWlyLmFjdGl2ZUNvbnRhY3RzWzFdLnZlcnRleC54KSAvIDI7XG4gICAgICAgICAgICAgICAgICAgIG5vcm1hbFBvc1kgPSAocGFpci5hY3RpdmVDb250YWN0c1swXS52ZXJ0ZXgueSArIHBhaXIuYWN0aXZlQ29udGFjdHNbMV0udmVydGV4LnkpIC8gMjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoY29sbGlzaW9uLmJvZHlCID09PSBjb2xsaXNpb24uc3VwcG9ydHNbMF0uYm9keSB8fCBjb2xsaXNpb24uYm9keUEuaXNTdGF0aWMgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgYy5tb3ZlVG8obm9ybWFsUG9zWCAtIGNvbGxpc2lvbi5ub3JtYWwueCAqIDgsIG5vcm1hbFBvc1kgLSBjb2xsaXNpb24ubm9ybWFsLnkgKiA4KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjLm1vdmVUbyhub3JtYWxQb3NYICsgY29sbGlzaW9uLm5vcm1hbC54ICogOCwgbm9ybWFsUG9zWSArIGNvbGxpc2lvbi5ub3JtYWwueSAqIDgpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGMubGluZVRvKG5vcm1hbFBvc1gsIG5vcm1hbFBvc1kpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG9wdGlvbnMud2lyZWZyYW1lcykge1xuICAgICAgICAgICAgYy5zdHJva2VTdHlsZSA9ICdyZ2JhKDI1NSwxNjUsMCwwLjcpJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGMuc3Ryb2tlU3R5bGUgPSAnb3JhbmdlJztcbiAgICAgICAgfVxuXG4gICAgICAgIGMubGluZVdpZHRoID0gMTtcbiAgICAgICAgYy5zdHJva2UoKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogRGVzY3JpcHRpb25cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBtZXRob2Qgc2VwYXJhdGlvbnNcbiAgICAgKiBAcGFyYW0ge3JlbmRlcn0gcmVuZGVyXG4gICAgICogQHBhcmFtIHtwYWlyW119IHBhaXJzXG4gICAgICogQHBhcmFtIHtSZW5kZXJpbmdDb250ZXh0fSBjb250ZXh0XG4gICAgICovXG4gICAgUmVuZGVyLnNlcGFyYXRpb25zID0gZnVuY3Rpb24ocmVuZGVyLCBwYWlycywgY29udGV4dCkge1xuICAgICAgICB2YXIgYyA9IGNvbnRleHQsXG4gICAgICAgICAgICBvcHRpb25zID0gcmVuZGVyLm9wdGlvbnMsXG4gICAgICAgICAgICBwYWlyLFxuICAgICAgICAgICAgY29sbGlzaW9uLFxuICAgICAgICAgICAgY29ycmVjdGVkLFxuICAgICAgICAgICAgYm9keUEsXG4gICAgICAgICAgICBib2R5QixcbiAgICAgICAgICAgIGksXG4gICAgICAgICAgICBqO1xuXG4gICAgICAgIGMuYmVnaW5QYXRoKCk7XG5cbiAgICAgICAgLy8gcmVuZGVyIHNlcGFyYXRpb25zXG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBwYWlycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgcGFpciA9IHBhaXJzW2ldO1xuXG4gICAgICAgICAgICBpZiAoIXBhaXIuaXNBY3RpdmUpXG4gICAgICAgICAgICAgICAgY29udGludWU7XG5cbiAgICAgICAgICAgIGNvbGxpc2lvbiA9IHBhaXIuY29sbGlzaW9uO1xuICAgICAgICAgICAgYm9keUEgPSBjb2xsaXNpb24uYm9keUE7XG4gICAgICAgICAgICBib2R5QiA9IGNvbGxpc2lvbi5ib2R5QjtcblxuICAgICAgICAgICAgdmFyIGsgPSAxO1xuXG4gICAgICAgICAgICBpZiAoIWJvZHlCLmlzU3RhdGljICYmICFib2R5QS5pc1N0YXRpYykgayA9IDAuNTtcbiAgICAgICAgICAgIGlmIChib2R5Qi5pc1N0YXRpYykgayA9IDA7XG5cbiAgICAgICAgICAgIGMubW92ZVRvKGJvZHlCLnBvc2l0aW9uLngsIGJvZHlCLnBvc2l0aW9uLnkpO1xuICAgICAgICAgICAgYy5saW5lVG8oYm9keUIucG9zaXRpb24ueCAtIGNvbGxpc2lvbi5wZW5ldHJhdGlvbi54ICogaywgYm9keUIucG9zaXRpb24ueSAtIGNvbGxpc2lvbi5wZW5ldHJhdGlvbi55ICogayk7XG5cbiAgICAgICAgICAgIGsgPSAxO1xuXG4gICAgICAgICAgICBpZiAoIWJvZHlCLmlzU3RhdGljICYmICFib2R5QS5pc1N0YXRpYykgayA9IDAuNTtcbiAgICAgICAgICAgIGlmIChib2R5QS5pc1N0YXRpYykgayA9IDA7XG5cbiAgICAgICAgICAgIGMubW92ZVRvKGJvZHlBLnBvc2l0aW9uLngsIGJvZHlBLnBvc2l0aW9uLnkpO1xuICAgICAgICAgICAgYy5saW5lVG8oYm9keUEucG9zaXRpb24ueCArIGNvbGxpc2lvbi5wZW5ldHJhdGlvbi54ICogaywgYm9keUEucG9zaXRpb24ueSArIGNvbGxpc2lvbi5wZW5ldHJhdGlvbi55ICogayk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAob3B0aW9ucy53aXJlZnJhbWVzKSB7XG4gICAgICAgICAgICBjLnN0cm9rZVN0eWxlID0gJ3JnYmEoMjU1LDE2NSwwLDAuNSknO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYy5zdHJva2VTdHlsZSA9ICdvcmFuZ2UnO1xuICAgICAgICB9XG4gICAgICAgIGMuc3Ryb2tlKCk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIERlc2NyaXB0aW9uXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbWV0aG9kIGluc3BlY3RvclxuICAgICAqIEBwYXJhbSB7aW5zcGVjdG9yfSBpbnNwZWN0b3JcbiAgICAgKiBAcGFyYW0ge1JlbmRlcmluZ0NvbnRleHR9IGNvbnRleHRcbiAgICAgKi9cbiAgICBSZW5kZXIuaW5zcGVjdG9yID0gZnVuY3Rpb24oaW5zcGVjdG9yLCBjb250ZXh0KSB7XG4gICAgICAgIHZhciBlbmdpbmUgPSBpbnNwZWN0b3IuZW5naW5lLFxuICAgICAgICAgICAgc2VsZWN0ZWQgPSBpbnNwZWN0b3Iuc2VsZWN0ZWQsXG4gICAgICAgICAgICByZW5kZXIgPSBpbnNwZWN0b3IucmVuZGVyLFxuICAgICAgICAgICAgb3B0aW9ucyA9IHJlbmRlci5vcHRpb25zLFxuICAgICAgICAgICAgYm91bmRzO1xuXG4gICAgICAgIGlmIChvcHRpb25zLmhhc0JvdW5kcykge1xuICAgICAgICAgICAgdmFyIGJvdW5kc1dpZHRoID0gcmVuZGVyLmJvdW5kcy5tYXgueCAtIHJlbmRlci5ib3VuZHMubWluLngsXG4gICAgICAgICAgICAgICAgYm91bmRzSGVpZ2h0ID0gcmVuZGVyLmJvdW5kcy5tYXgueSAtIHJlbmRlci5ib3VuZHMubWluLnksXG4gICAgICAgICAgICAgICAgYm91bmRzU2NhbGVYID0gYm91bmRzV2lkdGggLyByZW5kZXIub3B0aW9ucy53aWR0aCxcbiAgICAgICAgICAgICAgICBib3VuZHNTY2FsZVkgPSBib3VuZHNIZWlnaHQgLyByZW5kZXIub3B0aW9ucy5oZWlnaHQ7XG5cbiAgICAgICAgICAgIGNvbnRleHQuc2NhbGUoMSAvIGJvdW5kc1NjYWxlWCwgMSAvIGJvdW5kc1NjYWxlWSk7XG4gICAgICAgICAgICBjb250ZXh0LnRyYW5zbGF0ZSgtcmVuZGVyLmJvdW5kcy5taW4ueCwgLXJlbmRlci5ib3VuZHMubWluLnkpO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxlY3RlZC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIGl0ZW0gPSBzZWxlY3RlZFtpXS5kYXRhO1xuXG4gICAgICAgICAgICBjb250ZXh0LnRyYW5zbGF0ZSgwLjUsIDAuNSk7XG4gICAgICAgICAgICBjb250ZXh0LmxpbmVXaWR0aCA9IDE7XG4gICAgICAgICAgICBjb250ZXh0LnN0cm9rZVN0eWxlID0gJ3JnYmEoMjU1LDE2NSwwLDAuOSknO1xuICAgICAgICAgICAgY29udGV4dC5zZXRMaW5lRGFzaChbMSwyXSk7XG5cbiAgICAgICAgICAgIHN3aXRjaCAoaXRlbS50eXBlKSB7XG5cbiAgICAgICAgICAgIGNhc2UgJ2JvZHknOlxuXG4gICAgICAgICAgICAgICAgLy8gcmVuZGVyIGJvZHkgc2VsZWN0aW9uc1xuICAgICAgICAgICAgICAgIGJvdW5kcyA9IGl0ZW0uYm91bmRzO1xuICAgICAgICAgICAgICAgIGNvbnRleHQuYmVnaW5QYXRoKCk7XG4gICAgICAgICAgICAgICAgY29udGV4dC5yZWN0KE1hdGguZmxvb3IoYm91bmRzLm1pbi54IC0gMyksIE1hdGguZmxvb3IoYm91bmRzLm1pbi55IC0gMyksXG4gICAgICAgICAgICAgICAgICAgIE1hdGguZmxvb3IoYm91bmRzLm1heC54IC0gYm91bmRzLm1pbi54ICsgNiksIE1hdGguZmxvb3IoYm91bmRzLm1heC55IC0gYm91bmRzLm1pbi55ICsgNikpO1xuICAgICAgICAgICAgICAgIGNvbnRleHQuY2xvc2VQYXRoKCk7XG4gICAgICAgICAgICAgICAgY29udGV4dC5zdHJva2UoKTtcblxuICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlICdjb25zdHJhaW50JzpcblxuICAgICAgICAgICAgICAgIC8vIHJlbmRlciBjb25zdHJhaW50IHNlbGVjdGlvbnNcbiAgICAgICAgICAgICAgICB2YXIgcG9pbnQgPSBpdGVtLnBvaW50QTtcbiAgICAgICAgICAgICAgICBpZiAoaXRlbS5ib2R5QSlcbiAgICAgICAgICAgICAgICAgICAgcG9pbnQgPSBpdGVtLnBvaW50QjtcbiAgICAgICAgICAgICAgICBjb250ZXh0LmJlZ2luUGF0aCgpO1xuICAgICAgICAgICAgICAgIGNvbnRleHQuYXJjKHBvaW50LngsIHBvaW50LnksIDEwLCAwLCAyICogTWF0aC5QSSk7XG4gICAgICAgICAgICAgICAgY29udGV4dC5jbG9zZVBhdGgoKTtcbiAgICAgICAgICAgICAgICBjb250ZXh0LnN0cm9rZSgpO1xuXG4gICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29udGV4dC5zZXRMaW5lRGFzaChbXSk7XG4gICAgICAgICAgICBjb250ZXh0LnRyYW5zbGF0ZSgtMC41LCAtMC41KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHJlbmRlciBzZWxlY3Rpb24gcmVnaW9uXG4gICAgICAgIGlmIChpbnNwZWN0b3Iuc2VsZWN0U3RhcnQgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnRleHQudHJhbnNsYXRlKDAuNSwgMC41KTtcbiAgICAgICAgICAgIGNvbnRleHQubGluZVdpZHRoID0gMTtcbiAgICAgICAgICAgIGNvbnRleHQuc3Ryb2tlU3R5bGUgPSAncmdiYSgyNTUsMTY1LDAsMC42KSc7XG4gICAgICAgICAgICBjb250ZXh0LmZpbGxTdHlsZSA9ICdyZ2JhKDI1NSwxNjUsMCwwLjEpJztcbiAgICAgICAgICAgIGJvdW5kcyA9IGluc3BlY3Rvci5zZWxlY3RCb3VuZHM7XG4gICAgICAgICAgICBjb250ZXh0LmJlZ2luUGF0aCgpO1xuICAgICAgICAgICAgY29udGV4dC5yZWN0KE1hdGguZmxvb3IoYm91bmRzLm1pbi54KSwgTWF0aC5mbG9vcihib3VuZHMubWluLnkpLFxuICAgICAgICAgICAgICAgIE1hdGguZmxvb3IoYm91bmRzLm1heC54IC0gYm91bmRzLm1pbi54KSwgTWF0aC5mbG9vcihib3VuZHMubWF4LnkgLSBib3VuZHMubWluLnkpKTtcbiAgICAgICAgICAgIGNvbnRleHQuY2xvc2VQYXRoKCk7XG4gICAgICAgICAgICBjb250ZXh0LnN0cm9rZSgpO1xuICAgICAgICAgICAgY29udGV4dC5maWxsKCk7XG4gICAgICAgICAgICBjb250ZXh0LnRyYW5zbGF0ZSgtMC41LCAtMC41KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChvcHRpb25zLmhhc0JvdW5kcylcbiAgICAgICAgICAgIGNvbnRleHQuc2V0VHJhbnNmb3JtKDEsIDAsIDAsIDEsIDAsIDApO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBVcGRhdGVzIHJlbmRlciB0aW1pbmcuXG4gICAgICogQG1ldGhvZCBfdXBkYXRlVGltaW5nXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge3JlbmRlcn0gcmVuZGVyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHRpbWVcbiAgICAgKi9cbiAgICB2YXIgX3VwZGF0ZVRpbWluZyA9IGZ1bmN0aW9uKHJlbmRlciwgdGltZSkge1xuICAgICAgICB2YXIgZW5naW5lID0gcmVuZGVyLmVuZ2luZSxcbiAgICAgICAgICAgIHRpbWluZyA9IHJlbmRlci50aW1pbmcsXG4gICAgICAgICAgICBoaXN0b3J5U2l6ZSA9IHRpbWluZy5oaXN0b3J5U2l6ZSxcbiAgICAgICAgICAgIHRpbWVzdGFtcCA9IGVuZ2luZS50aW1pbmcudGltZXN0YW1wO1xuXG4gICAgICAgIHRpbWluZy5kZWx0YSA9IHRpbWUgLSB0aW1pbmcubGFzdFRpbWUgfHwgUmVuZGVyLl9nb29kRGVsdGE7XG4gICAgICAgIHRpbWluZy5sYXN0VGltZSA9IHRpbWU7XG5cbiAgICAgICAgdGltaW5nLnRpbWVzdGFtcEVsYXBzZWQgPSB0aW1lc3RhbXAgLSB0aW1pbmcubGFzdFRpbWVzdGFtcCB8fCAwO1xuICAgICAgICB0aW1pbmcubGFzdFRpbWVzdGFtcCA9IHRpbWVzdGFtcDtcblxuICAgICAgICB0aW1pbmcuZGVsdGFIaXN0b3J5LnVuc2hpZnQodGltaW5nLmRlbHRhKTtcbiAgICAgICAgdGltaW5nLmRlbHRhSGlzdG9yeS5sZW5ndGggPSBNYXRoLm1pbih0aW1pbmcuZGVsdGFIaXN0b3J5Lmxlbmd0aCwgaGlzdG9yeVNpemUpO1xuXG4gICAgICAgIHRpbWluZy5lbmdpbmVEZWx0YUhpc3RvcnkudW5zaGlmdChlbmdpbmUudGltaW5nLmxhc3REZWx0YSk7XG4gICAgICAgIHRpbWluZy5lbmdpbmVEZWx0YUhpc3RvcnkubGVuZ3RoID0gTWF0aC5taW4odGltaW5nLmVuZ2luZURlbHRhSGlzdG9yeS5sZW5ndGgsIGhpc3RvcnlTaXplKTtcblxuICAgICAgICB0aW1pbmcudGltZXN0YW1wRWxhcHNlZEhpc3RvcnkudW5zaGlmdCh0aW1pbmcudGltZXN0YW1wRWxhcHNlZCk7XG4gICAgICAgIHRpbWluZy50aW1lc3RhbXBFbGFwc2VkSGlzdG9yeS5sZW5ndGggPSBNYXRoLm1pbih0aW1pbmcudGltZXN0YW1wRWxhcHNlZEhpc3RvcnkubGVuZ3RoLCBoaXN0b3J5U2l6ZSk7XG5cbiAgICAgICAgdGltaW5nLmVuZ2luZUVsYXBzZWRIaXN0b3J5LnVuc2hpZnQoZW5naW5lLnRpbWluZy5sYXN0RWxhcHNlZCk7XG4gICAgICAgIHRpbWluZy5lbmdpbmVFbGFwc2VkSGlzdG9yeS5sZW5ndGggPSBNYXRoLm1pbih0aW1pbmcuZW5naW5lRWxhcHNlZEhpc3RvcnkubGVuZ3RoLCBoaXN0b3J5U2l6ZSk7XG5cbiAgICAgICAgdGltaW5nLmVsYXBzZWRIaXN0b3J5LnVuc2hpZnQodGltaW5nLmxhc3RFbGFwc2VkKTtcbiAgICAgICAgdGltaW5nLmVsYXBzZWRIaXN0b3J5Lmxlbmd0aCA9IE1hdGgubWluKHRpbWluZy5lbGFwc2VkSGlzdG9yeS5sZW5ndGgsIGhpc3RvcnlTaXplKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgbWVhbiB2YWx1ZSBvZiB0aGUgZ2l2ZW4gbnVtYmVycy5cbiAgICAgKiBAbWV0aG9kIF9tZWFuXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge051bWJlcltdfSB2YWx1ZXNcbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9IHRoZSBtZWFuIG9mIGdpdmVuIHZhbHVlc1xuICAgICAqL1xuICAgIHZhciBfbWVhbiA9IGZ1bmN0aW9uKHZhbHVlcykge1xuICAgICAgICB2YXIgcmVzdWx0ID0gMDtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgICAgIHJlc3VsdCArPSB2YWx1ZXNbaV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIChyZXN1bHQgLyB2YWx1ZXMubGVuZ3RoKSB8fCAwO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBAbWV0aG9kIF9jcmVhdGVDYW52YXNcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7fSB3aWR0aFxuICAgICAqIEBwYXJhbSB7fSBoZWlnaHRcbiAgICAgKiBAcmV0dXJuIGNhbnZhc1xuICAgICAqL1xuICAgIHZhciBfY3JlYXRlQ2FudmFzID0gZnVuY3Rpb24od2lkdGgsIGhlaWdodCkge1xuICAgICAgICB2YXIgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgICAgIGNhbnZhcy53aWR0aCA9IHdpZHRoO1xuICAgICAgICBjYW52YXMuaGVpZ2h0ID0gaGVpZ2h0O1xuICAgICAgICBjYW52YXMub25jb250ZXh0bWVudSA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gZmFsc2U7IH07XG4gICAgICAgIGNhbnZhcy5vbnNlbGVjdHN0YXJ0ID0gZnVuY3Rpb24oKSB7IHJldHVybiBmYWxzZTsgfTtcbiAgICAgICAgcmV0dXJuIGNhbnZhcztcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgcGl4ZWwgcmF0aW8gb2YgdGhlIGNhbnZhcy5cbiAgICAgKiBAbWV0aG9kIF9nZXRQaXhlbFJhdGlvXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBjYW52YXNcbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9IHBpeGVsIHJhdGlvXG4gICAgICovXG4gICAgdmFyIF9nZXRQaXhlbFJhdGlvID0gZnVuY3Rpb24oY2FudmFzKSB7XG4gICAgICAgIHZhciBjb250ZXh0ID0gY2FudmFzLmdldENvbnRleHQoJzJkJyksXG4gICAgICAgICAgICBkZXZpY2VQaXhlbFJhdGlvID0gd2luZG93LmRldmljZVBpeGVsUmF0aW8gfHwgMSxcbiAgICAgICAgICAgIGJhY2tpbmdTdG9yZVBpeGVsUmF0aW8gPSBjb250ZXh0LndlYmtpdEJhY2tpbmdTdG9yZVBpeGVsUmF0aW8gfHwgY29udGV4dC5tb3pCYWNraW5nU3RvcmVQaXhlbFJhdGlvXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IGNvbnRleHQubXNCYWNraW5nU3RvcmVQaXhlbFJhdGlvIHx8IGNvbnRleHQub0JhY2tpbmdTdG9yZVBpeGVsUmF0aW9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgY29udGV4dC5iYWNraW5nU3RvcmVQaXhlbFJhdGlvIHx8IDE7XG5cbiAgICAgICAgcmV0dXJuIGRldmljZVBpeGVsUmF0aW8gLyBiYWNraW5nU3RvcmVQaXhlbFJhdGlvO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSByZXF1ZXN0ZWQgdGV4dHVyZSAoYW4gSW1hZ2UpIHZpYSBpdHMgcGF0aFxuICAgICAqIEBtZXRob2QgX2dldFRleHR1cmVcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7cmVuZGVyfSByZW5kZXJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gaW1hZ2VQYXRoXG4gICAgICogQHJldHVybiB7SW1hZ2V9IHRleHR1cmVcbiAgICAgKi9cbiAgICB2YXIgX2dldFRleHR1cmUgPSBmdW5jdGlvbihyZW5kZXIsIGltYWdlUGF0aCkge1xuICAgICAgICB2YXIgaW1hZ2UgPSByZW5kZXIudGV4dHVyZXNbaW1hZ2VQYXRoXTtcblxuICAgICAgICBpZiAoaW1hZ2UpXG4gICAgICAgICAgICByZXR1cm4gaW1hZ2U7XG5cbiAgICAgICAgaW1hZ2UgPSByZW5kZXIudGV4dHVyZXNbaW1hZ2VQYXRoXSA9IG5ldyBJbWFnZSgpO1xuICAgICAgICBpbWFnZS5zcmMgPSBpbWFnZVBhdGg7XG5cbiAgICAgICAgcmV0dXJuIGltYWdlO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBBcHBsaWVzIHRoZSBiYWNrZ3JvdW5kIHRvIHRoZSBjYW52YXMgdXNpbmcgQ1NTLlxuICAgICAqIEBtZXRob2QgYXBwbHlCYWNrZ3JvdW5kXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge3JlbmRlcn0gcmVuZGVyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGJhY2tncm91bmRcbiAgICAgKi9cbiAgICB2YXIgX2FwcGx5QmFja2dyb3VuZCA9IGZ1bmN0aW9uKHJlbmRlciwgYmFja2dyb3VuZCkge1xuICAgICAgICB2YXIgY3NzQmFja2dyb3VuZCA9IGJhY2tncm91bmQ7XG5cbiAgICAgICAgaWYgKC8oanBnfGdpZnxwbmcpJC8udGVzdChiYWNrZ3JvdW5kKSlcbiAgICAgICAgICAgIGNzc0JhY2tncm91bmQgPSAndXJsKCcgKyBiYWNrZ3JvdW5kICsgJyknO1xuXG4gICAgICAgIHJlbmRlci5jYW52YXMuc3R5bGUuYmFja2dyb3VuZCA9IGNzc0JhY2tncm91bmQ7XG4gICAgICAgIHJlbmRlci5jYW52YXMuc3R5bGUuYmFja2dyb3VuZFNpemUgPSBcImNvbnRhaW5cIjtcbiAgICAgICAgcmVuZGVyLmN1cnJlbnRCYWNrZ3JvdW5kID0gYmFja2dyb3VuZDtcbiAgICB9O1xuXG4gICAgLypcbiAgICAqXG4gICAgKiAgRXZlbnRzIERvY3VtZW50YXRpb25cbiAgICAqXG4gICAgKi9cblxuICAgIC8qKlxuICAgICogRmlyZWQgYmVmb3JlIHJlbmRlcmluZ1xuICAgICpcbiAgICAqIEBldmVudCBiZWZvcmVSZW5kZXJcbiAgICAqIEBwYXJhbSB7fSBldmVudCBBbiBldmVudCBvYmplY3RcbiAgICAqIEBwYXJhbSB7bnVtYmVyfSBldmVudC50aW1lc3RhbXAgVGhlIGVuZ2luZS50aW1pbmcudGltZXN0YW1wIG9mIHRoZSBldmVudFxuICAgICogQHBhcmFtIHt9IGV2ZW50LnNvdXJjZSBUaGUgc291cmNlIG9iamVjdCBvZiB0aGUgZXZlbnRcbiAgICAqIEBwYXJhbSB7fSBldmVudC5uYW1lIFRoZSBuYW1lIG9mIHRoZSBldmVudFxuICAgICovXG5cbiAgICAvKipcbiAgICAqIEZpcmVkIGFmdGVyIHJlbmRlcmluZ1xuICAgICpcbiAgICAqIEBldmVudCBhZnRlclJlbmRlclxuICAgICogQHBhcmFtIHt9IGV2ZW50IEFuIGV2ZW50IG9iamVjdFxuICAgICogQHBhcmFtIHtudW1iZXJ9IGV2ZW50LnRpbWVzdGFtcCBUaGUgZW5naW5lLnRpbWluZy50aW1lc3RhbXAgb2YgdGhlIGV2ZW50XG4gICAgKiBAcGFyYW0ge30gZXZlbnQuc291cmNlIFRoZSBzb3VyY2Ugb2JqZWN0IG9mIHRoZSBldmVudFxuICAgICogQHBhcmFtIHt9IGV2ZW50Lm5hbWUgVGhlIG5hbWUgb2YgdGhlIGV2ZW50XG4gICAgKi9cblxuICAgIC8qXG4gICAgKlxuICAgICogIFByb3BlcnRpZXMgRG9jdW1lbnRhdGlvblxuICAgICpcbiAgICAqL1xuXG4gICAgLyoqXG4gICAgICogQSBiYWNrLXJlZmVyZW5jZSB0byB0aGUgYE1hdHRlci5SZW5kZXJgIG1vZHVsZS5cbiAgICAgKlxuICAgICAqIEBwcm9wZXJ0eSBjb250cm9sbGVyXG4gICAgICogQHR5cGUgcmVuZGVyXG4gICAgICovXG5cbiAgICAvKipcbiAgICAgKiBBIHJlZmVyZW5jZSB0byB0aGUgYE1hdHRlci5FbmdpbmVgIGluc3RhbmNlIHRvIGJlIHVzZWQuXG4gICAgICpcbiAgICAgKiBAcHJvcGVydHkgZW5naW5lXG4gICAgICogQHR5cGUgZW5naW5lXG4gICAgICovXG5cbiAgICAvKipcbiAgICAgKiBBIHJlZmVyZW5jZSB0byB0aGUgZWxlbWVudCB3aGVyZSB0aGUgY2FudmFzIGlzIHRvIGJlIGluc2VydGVkIChpZiBgcmVuZGVyLmNhbnZhc2AgaGFzIG5vdCBiZWVuIHNwZWNpZmllZClcbiAgICAgKlxuICAgICAqIEBwcm9wZXJ0eSBlbGVtZW50XG4gICAgICogQHR5cGUgSFRNTEVsZW1lbnRcbiAgICAgKiBAZGVmYXVsdCBudWxsXG4gICAgICovXG5cbiAgICAvKipcbiAgICAgKiBUaGUgY2FudmFzIGVsZW1lbnQgdG8gcmVuZGVyIHRvLiBJZiBub3Qgc3BlY2lmaWVkLCBvbmUgd2lsbCBiZSBjcmVhdGVkIGlmIGByZW5kZXIuZWxlbWVudGAgaGFzIGJlZW4gc3BlY2lmaWVkLlxuICAgICAqXG4gICAgICogQHByb3BlcnR5IGNhbnZhc1xuICAgICAqIEB0eXBlIEhUTUxDYW52YXNFbGVtZW50XG4gICAgICogQGRlZmF1bHQgbnVsbFxuICAgICAqL1xuXG4gICAgLyoqXG4gICAgICogQSBgQm91bmRzYCBvYmplY3QgdGhhdCBzcGVjaWZpZXMgdGhlIGRyYXdpbmcgdmlldyByZWdpb24uXG4gICAgICogUmVuZGVyaW5nIHdpbGwgYmUgYXV0b21hdGljYWxseSB0cmFuc2Zvcm1lZCBhbmQgc2NhbGVkIHRvIGZpdCB3aXRoaW4gdGhlIGNhbnZhcyBzaXplIChgcmVuZGVyLm9wdGlvbnMud2lkdGhgIGFuZCBgcmVuZGVyLm9wdGlvbnMuaGVpZ2h0YCkuXG4gICAgICogVGhpcyBhbGxvd3MgZm9yIGNyZWF0aW5nIHZpZXdzIHRoYXQgY2FuIHBhbiBvciB6b29tIGFyb3VuZCB0aGUgc2NlbmUuXG4gICAgICogWW91IG11c3QgYWxzbyBzZXQgYHJlbmRlci5vcHRpb25zLmhhc0JvdW5kc2AgdG8gYHRydWVgIHRvIGVuYWJsZSBib3VuZGVkIHJlbmRlcmluZy5cbiAgICAgKlxuICAgICAqIEBwcm9wZXJ0eSBib3VuZHNcbiAgICAgKiBAdHlwZSBib3VuZHNcbiAgICAgKi9cblxuICAgIC8qKlxuICAgICAqIFRoZSAyZCByZW5kZXJpbmcgY29udGV4dCBmcm9tIHRoZSBgcmVuZGVyLmNhbnZhc2AgZWxlbWVudC5cbiAgICAgKlxuICAgICAqIEBwcm9wZXJ0eSBjb250ZXh0XG4gICAgICogQHR5cGUgQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEXG4gICAgICovXG5cbiAgICAvKipcbiAgICAgKiBUaGUgc3ByaXRlIHRleHR1cmUgY2FjaGUuXG4gICAgICpcbiAgICAgKiBAcHJvcGVydHkgdGV4dHVyZXNcbiAgICAgKiBAdHlwZSB7fVxuICAgICAqL1xuXG4gICAgLyoqXG4gICAgICogVGhlIG1vdXNlIHRvIHJlbmRlciBpZiBgcmVuZGVyLm9wdGlvbnMuc2hvd01vdXNlUG9zaXRpb25gIGlzIGVuYWJsZWQuXG4gICAgICpcbiAgICAgKiBAcHJvcGVydHkgbW91c2VcbiAgICAgKiBAdHlwZSBtb3VzZVxuICAgICAqIEBkZWZhdWx0IG51bGxcbiAgICAgKi9cblxuICAgIC8qKlxuICAgICAqIFRoZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgb2YgdGhlIHJlbmRlcmVyLlxuICAgICAqXG4gICAgICogQHByb3BlcnR5IG9wdGlvbnNcbiAgICAgKiBAdHlwZSB7fVxuICAgICAqL1xuXG4gICAgLyoqXG4gICAgICogVGhlIHRhcmdldCB3aWR0aCBpbiBwaXhlbHMgb2YgdGhlIGByZW5kZXIuY2FudmFzYCB0byBiZSBjcmVhdGVkLlxuICAgICAqIFNlZSBhbHNvIHRoZSBgb3B0aW9ucy5waXhlbFJhdGlvYCBwcm9wZXJ0eSB0byBjaGFuZ2UgcmVuZGVyIHF1YWxpdHkuXG4gICAgICpcbiAgICAgKiBAcHJvcGVydHkgb3B0aW9ucy53aWR0aFxuICAgICAqIEB0eXBlIG51bWJlclxuICAgICAqIEBkZWZhdWx0IDgwMFxuICAgICAqL1xuXG4gICAgLyoqXG4gICAgICogVGhlIHRhcmdldCBoZWlnaHQgaW4gcGl4ZWxzIG9mIHRoZSBgcmVuZGVyLmNhbnZhc2AgdG8gYmUgY3JlYXRlZC5cbiAgICAgKiBTZWUgYWxzbyB0aGUgYG9wdGlvbnMucGl4ZWxSYXRpb2AgcHJvcGVydHkgdG8gY2hhbmdlIHJlbmRlciBxdWFsaXR5LlxuICAgICAqXG4gICAgICogQHByb3BlcnR5IG9wdGlvbnMuaGVpZ2h0XG4gICAgICogQHR5cGUgbnVtYmVyXG4gICAgICogQGRlZmF1bHQgNjAwXG4gICAgICovXG5cbiAgICAvKipcbiAgICAgKiBUaGUgW3BpeGVsIHJhdGlvXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvV2luZG93L2RldmljZVBpeGVsUmF0aW8pIHRvIHVzZSB3aGVuIHJlbmRlcmluZy5cbiAgICAgKlxuICAgICAqIEBwcm9wZXJ0eSBvcHRpb25zLnBpeGVsUmF0aW9cbiAgICAgKiBAdHlwZSBudW1iZXJcbiAgICAgKiBAZGVmYXVsdCAxXG4gICAgICovXG5cbiAgICAvKipcbiAgICAgKiBBIENTUyBiYWNrZ3JvdW5kIGNvbG9yIHN0cmluZyB0byB1c2Ugd2hlbiBgcmVuZGVyLm9wdGlvbnMud2lyZWZyYW1lc2AgaXMgZGlzYWJsZWQuXG4gICAgICogVGhpcyBtYXkgYmUgYWxzbyBzZXQgdG8gYCd0cmFuc3BhcmVudCdgIG9yIGVxdWl2YWxlbnQuXG4gICAgICpcbiAgICAgKiBAcHJvcGVydHkgb3B0aW9ucy5iYWNrZ3JvdW5kXG4gICAgICogQHR5cGUgc3RyaW5nXG4gICAgICogQGRlZmF1bHQgJyMxNDE1MWYnXG4gICAgICovXG5cbiAgICAvKipcbiAgICAgKiBBIENTUyBiYWNrZ3JvdW5kIGNvbG9yIHN0cmluZyB0byB1c2Ugd2hlbiBgcmVuZGVyLm9wdGlvbnMud2lyZWZyYW1lc2AgaXMgZW5hYmxlZC5cbiAgICAgKiBUaGlzIG1heSBiZSBhbHNvIHNldCB0byBgJ3RyYW5zcGFyZW50J2Agb3IgZXF1aXZhbGVudC5cbiAgICAgKlxuICAgICAqIEBwcm9wZXJ0eSBvcHRpb25zLndpcmVmcmFtZUJhY2tncm91bmRcbiAgICAgKiBAdHlwZSBzdHJpbmdcbiAgICAgKiBAZGVmYXVsdCAnIzE0MTUxZidcbiAgICAgKi9cblxuICAgIC8qKlxuICAgICAqIEEgZmxhZyB0aGF0IHNwZWNpZmllcyBpZiBgcmVuZGVyLmJvdW5kc2Agc2hvdWxkIGJlIHVzZWQgd2hlbiByZW5kZXJpbmcuXG4gICAgICpcbiAgICAgKiBAcHJvcGVydHkgb3B0aW9ucy5oYXNCb3VuZHNcbiAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgKi9cblxuICAgIC8qKlxuICAgICAqIEEgZmxhZyB0byBlbmFibGUgb3IgZGlzYWJsZSBhbGwgZGVidWcgaW5mb3JtYXRpb24gb3ZlcmxheXMgdG9nZXRoZXIuICBcbiAgICAgKiBUaGlzIGluY2x1ZGVzIGFuZCBoYXMgcHJpb3JpdHkgb3ZlciB0aGUgdmFsdWVzIG9mOlxuICAgICAqXG4gICAgICogLSBgcmVuZGVyLm9wdGlvbnMuc2hvd1N0YXRzYFxuICAgICAqIC0gYHJlbmRlci5vcHRpb25zLnNob3dQZXJmb3JtYW5jZWBcbiAgICAgKlxuICAgICAqIEBwcm9wZXJ0eSBvcHRpb25zLnNob3dEZWJ1Z1xuICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAqL1xuXG4gICAgLyoqXG4gICAgICogQSBmbGFnIHRvIGVuYWJsZSBvciBkaXNhYmxlIHRoZSBlbmdpbmUgc3RhdHMgaW5mbyBvdmVybGF5LiAgXG4gICAgICogRnJvbSBsZWZ0IHRvIHJpZ2h0LCB0aGUgdmFsdWVzIHNob3duIGFyZTpcbiAgICAgKlxuICAgICAqIC0gYm9keSBwYXJ0cyB0b3RhbFxuICAgICAqIC0gYm9keSB0b3RhbFxuICAgICAqIC0gY29uc3RyYWludHMgdG90YWxcbiAgICAgKiAtIGNvbXBvc2l0ZXMgdG90YWxcbiAgICAgKiAtIGNvbGxpc2lvbiBwYWlycyB0b3RhbFxuICAgICAqXG4gICAgICogQHByb3BlcnR5IG9wdGlvbnMuc2hvd1N0YXRzXG4gICAgICogQHR5cGUgYm9vbGVhblxuICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICovXG5cbiAgICAvKipcbiAgICAgKiBBIGZsYWcgdG8gZW5hYmxlIG9yIGRpc2FibGUgcGVyZm9ybWFuY2UgY2hhcnRzLiAgXG4gICAgICogRnJvbSBsZWZ0IHRvIHJpZ2h0LCB0aGUgdmFsdWVzIHNob3duIGFyZTpcbiAgICAgKlxuICAgICAqIC0gYXZlcmFnZSByZW5kZXIgZnJlcXVlbmN5IChlLmcuIDYwIGZwcylcbiAgICAgKiAtIGV4YWN0IGVuZ2luZSBkZWx0YSB0aW1lIHVzZWQgZm9yIGxhc3QgdXBkYXRlIChlLmcuIDE2LjY2bXMpXG4gICAgICogLSBhdmVyYWdlIGVuZ2luZSBleGVjdXRpb24gZHVyYXRpb24gKGUuZy4gNS4wMG1zKVxuICAgICAqIC0gYXZlcmFnZSByZW5kZXIgZXhlY3V0aW9uIGR1cmF0aW9uIChlLmcuIDAuNDBtcylcbiAgICAgKiAtIGF2ZXJhZ2UgZWZmZWN0aXZlIHBsYXkgc3BlZWQgKGUuZy4gJzEuMDB4JyBpcyAncmVhbC10aW1lJylcbiAgICAgKlxuICAgICAqIEVhY2ggdmFsdWUgaXMgcmVjb3JkZWQgb3ZlciBhIGZpeGVkIHNhbXBsZSBvZiBwYXN0IGZyYW1lcyAoNjAgZnJhbWVzKS5cbiAgICAgKlxuICAgICAqIEEgY2hhcnQgc2hvd24gYmVsb3cgZWFjaCB2YWx1ZSBpbmRpY2F0ZXMgdGhlIHZhcmlhbmNlIGZyb20gdGhlIGF2ZXJhZ2Ugb3ZlciB0aGUgc2FtcGxlLlxuICAgICAqIFRoZSBtb3JlIHN0YWJsZSBvciBmaXhlZCB0aGUgdmFsdWUgaXMgdGhlIGZsYXR0ZXIgdGhlIGNoYXJ0IHdpbGwgYXBwZWFyLlxuICAgICAqXG4gICAgICogQHByb3BlcnR5IG9wdGlvbnMuc2hvd1BlcmZvcm1hbmNlXG4gICAgICogQHR5cGUgYm9vbGVhblxuICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICovXG4gICAgXG4gICAgLyoqXG4gICAgICogQSBmbGFnIHRvIGVuYWJsZSBvciBkaXNhYmxlIHJlbmRlcmluZyBlbnRpcmVseS5cbiAgICAgKlxuICAgICAqIEBwcm9wZXJ0eSBvcHRpb25zLmVuYWJsZWRcbiAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgKi9cblxuICAgIC8qKlxuICAgICAqIEEgZmxhZyB0byB0b2dnbGUgd2lyZWZyYW1lIHJlbmRlcmluZyBvdGhlcndpc2Ugc29saWQgZmlsbCByZW5kZXJpbmcgaXMgdXNlZC5cbiAgICAgKlxuICAgICAqIEBwcm9wZXJ0eSBvcHRpb25zLndpcmVmcmFtZXNcbiAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICogQGRlZmF1bHQgdHJ1ZVxuICAgICAqL1xuXG4gICAgLyoqXG4gICAgICogQSBmbGFnIHRvIGVuYWJsZSBvciBkaXNhYmxlIHNsZWVwaW5nIGJvZGllcyBpbmRpY2F0b3JzLlxuICAgICAqXG4gICAgICogQHByb3BlcnR5IG9wdGlvbnMuc2hvd1NsZWVwaW5nXG4gICAgICogQHR5cGUgYm9vbGVhblxuICAgICAqIEBkZWZhdWx0IHRydWVcbiAgICAgKi9cblxuICAgIC8qKlxuICAgICAqIEEgZmxhZyB0byBlbmFibGUgb3IgZGlzYWJsZSB0aGUgZGVidWcgaW5mb3JtYXRpb24gb3ZlcmxheS5cbiAgICAgKlxuICAgICAqIEBwcm9wZXJ0eSBvcHRpb25zLnNob3dEZWJ1Z1xuICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAqL1xuXG4gICAgLyoqXG4gICAgICogQSBmbGFnIHRvIGVuYWJsZSBvciBkaXNhYmxlIHRoZSBjb2xsaXNpb24gYnJvYWRwaGFzZSBkZWJ1ZyBvdmVybGF5LlxuICAgICAqXG4gICAgICogQGRlcHJlY2F0ZWQgbm8gbG9uZ2VyIGltcGxlbWVudGVkXG4gICAgICogQHByb3BlcnR5IG9wdGlvbnMuc2hvd0Jyb2FkcGhhc2VcbiAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgKi9cblxuICAgIC8qKlxuICAgICAqIEEgZmxhZyB0byBlbmFibGUgb3IgZGlzYWJsZSB0aGUgYm9keSBib3VuZHMgZGVidWcgb3ZlcmxheS5cbiAgICAgKlxuICAgICAqIEBwcm9wZXJ0eSBvcHRpb25zLnNob3dCb3VuZHNcbiAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgKi9cblxuICAgIC8qKlxuICAgICAqIEEgZmxhZyB0byBlbmFibGUgb3IgZGlzYWJsZSB0aGUgYm9keSB2ZWxvY2l0eSBkZWJ1ZyBvdmVybGF5LlxuICAgICAqXG4gICAgICogQHByb3BlcnR5IG9wdGlvbnMuc2hvd1ZlbG9jaXR5XG4gICAgICogQHR5cGUgYm9vbGVhblxuICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICovXG5cbiAgICAvKipcbiAgICAgKiBBIGZsYWcgdG8gZW5hYmxlIG9yIGRpc2FibGUgdGhlIGJvZHkgY29sbGlzaW9ucyBkZWJ1ZyBvdmVybGF5LlxuICAgICAqXG4gICAgICogQHByb3BlcnR5IG9wdGlvbnMuc2hvd0NvbGxpc2lvbnNcbiAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgKi9cblxuICAgIC8qKlxuICAgICAqIEEgZmxhZyB0byBlbmFibGUgb3IgZGlzYWJsZSB0aGUgY29sbGlzaW9uIHJlc29sdmVyIHNlcGFyYXRpb25zIGRlYnVnIG92ZXJsYXkuXG4gICAgICpcbiAgICAgKiBAcHJvcGVydHkgb3B0aW9ucy5zaG93U2VwYXJhdGlvbnNcbiAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgKi9cblxuICAgIC8qKlxuICAgICAqIEEgZmxhZyB0byBlbmFibGUgb3IgZGlzYWJsZSB0aGUgYm9keSBheGVzIGRlYnVnIG92ZXJsYXkuXG4gICAgICpcbiAgICAgKiBAcHJvcGVydHkgb3B0aW9ucy5zaG93QXhlc1xuICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAqL1xuXG4gICAgLyoqXG4gICAgICogQSBmbGFnIHRvIGVuYWJsZSBvciBkaXNhYmxlIHRoZSBib2R5IHBvc2l0aW9ucyBkZWJ1ZyBvdmVybGF5LlxuICAgICAqXG4gICAgICogQHByb3BlcnR5IG9wdGlvbnMuc2hvd1Bvc2l0aW9uc1xuICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAqL1xuXG4gICAgLyoqXG4gICAgICogQSBmbGFnIHRvIGVuYWJsZSBvciBkaXNhYmxlIHRoZSBib2R5IGFuZ2xlIGRlYnVnIG92ZXJsYXkuXG4gICAgICpcbiAgICAgKiBAcHJvcGVydHkgb3B0aW9ucy5zaG93QW5nbGVJbmRpY2F0b3JcbiAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgKi9cblxuICAgIC8qKlxuICAgICAqIEEgZmxhZyB0byBlbmFibGUgb3IgZGlzYWJsZSB0aGUgYm9keSBhbmQgcGFydCBpZHMgZGVidWcgb3ZlcmxheS5cbiAgICAgKlxuICAgICAqIEBwcm9wZXJ0eSBvcHRpb25zLnNob3dJZHNcbiAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgKi9cblxuICAgIC8qKlxuICAgICAqIEEgZmxhZyB0byBlbmFibGUgb3IgZGlzYWJsZSB0aGUgYm9keSB2ZXJ0ZXggbnVtYmVycyBkZWJ1ZyBvdmVybGF5LlxuICAgICAqXG4gICAgICogQHByb3BlcnR5IG9wdGlvbnMuc2hvd1ZlcnRleE51bWJlcnNcbiAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgKi9cblxuICAgIC8qKlxuICAgICAqIEEgZmxhZyB0byBlbmFibGUgb3IgZGlzYWJsZSB0aGUgYm9keSBjb252ZXggaHVsbHMgZGVidWcgb3ZlcmxheS5cbiAgICAgKlxuICAgICAqIEBwcm9wZXJ0eSBvcHRpb25zLnNob3dDb252ZXhIdWxsc1xuICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAqL1xuXG4gICAgLyoqXG4gICAgICogQSBmbGFnIHRvIGVuYWJsZSBvciBkaXNhYmxlIHRoZSBib2R5IGludGVybmFsIGVkZ2VzIGRlYnVnIG92ZXJsYXkuXG4gICAgICpcbiAgICAgKiBAcHJvcGVydHkgb3B0aW9ucy5zaG93SW50ZXJuYWxFZGdlc1xuICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAqL1xuXG4gICAgLyoqXG4gICAgICogQSBmbGFnIHRvIGVuYWJsZSBvciBkaXNhYmxlIHRoZSBtb3VzZSBwb3NpdGlvbiBkZWJ1ZyBvdmVybGF5LlxuICAgICAqXG4gICAgICogQHByb3BlcnR5IG9wdGlvbnMuc2hvd01vdXNlUG9zaXRpb25cbiAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgKi9cblxufSkoKTtcblxuXG4vKioqLyB9KSxcbi8qIDE3ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cbi8qKlxuKiBUaGUgYE1hdHRlci5Db250YWN0YCBtb2R1bGUgY29udGFpbnMgbWV0aG9kcyBmb3IgY3JlYXRpbmcgYW5kIG1hbmlwdWxhdGluZyBjb2xsaXNpb24gY29udGFjdHMuXG4qXG4qIEBjbGFzcyBDb250YWN0XG4qL1xuXG52YXIgQ29udGFjdCA9IHt9O1xuXG5tb2R1bGUuZXhwb3J0cyA9IENvbnRhY3Q7XG5cbihmdW5jdGlvbigpIHtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgY29udGFjdC5cbiAgICAgKiBAbWV0aG9kIGNyZWF0ZVxuICAgICAqIEBwYXJhbSB7dmVydGV4fSB2ZXJ0ZXhcbiAgICAgKiBAcmV0dXJuIHtjb250YWN0fSBBIG5ldyBjb250YWN0XG4gICAgICovXG4gICAgQ29udGFjdC5jcmVhdGUgPSBmdW5jdGlvbih2ZXJ0ZXgpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHZlcnRleDogdmVydGV4LFxuICAgICAgICAgICAgbm9ybWFsSW1wdWxzZTogMCxcbiAgICAgICAgICAgIHRhbmdlbnRJbXB1bHNlOiAwXG4gICAgICAgIH07XG4gICAgfTtcblxufSkoKTtcblxuXG4vKioqLyB9KSxcbi8qIDE4ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cbi8qKlxuKiBUaGUgYE1hdHRlci5FbmdpbmVgIG1vZHVsZSBjb250YWlucyBtZXRob2RzIGZvciBjcmVhdGluZyBhbmQgbWFuaXB1bGF0aW5nIGVuZ2luZXMuXG4qIEFuIGVuZ2luZSBpcyBhIGNvbnRyb2xsZXIgdGhhdCBtYW5hZ2VzIHVwZGF0aW5nIHRoZSBzaW11bGF0aW9uIG9mIHRoZSB3b3JsZC5cbiogU2VlIGBNYXR0ZXIuUnVubmVyYCBmb3IgYW4gb3B0aW9uYWwgZ2FtZSBsb29wIHV0aWxpdHkuXG4qXG4qIFNlZSB0aGUgaW5jbHVkZWQgdXNhZ2UgW2V4YW1wbGVzXShodHRwczovL2dpdGh1Yi5jb20vbGlhYnJ1L21hdHRlci1qcy90cmVlL21hc3Rlci9leGFtcGxlcykuXG4qXG4qIEBjbGFzcyBFbmdpbmVcbiovXG5cbnZhciBFbmdpbmUgPSB7fTtcblxubW9kdWxlLmV4cG9ydHMgPSBFbmdpbmU7XG5cbnZhciBTbGVlcGluZyA9IF9fd2VicGFja19yZXF1aXJlX18oNyk7XG52YXIgUmVzb2x2ZXIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE5KTtcbnZhciBEZXRlY3RvciA9IF9fd2VicGFja19yZXF1aXJlX18oMTQpO1xudmFyIFBhaXJzID0gX193ZWJwYWNrX3JlcXVpcmVfXygyMCk7XG52YXIgRXZlbnRzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0KTtcbnZhciBDb21wb3NpdGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDUpO1xudmFyIENvbnN0cmFpbnQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEwKTtcbnZhciBDb21tb24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDApO1xudmFyIEJvZHkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDYpO1xuXG4oZnVuY3Rpb24oKSB7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IGVuZ2luZS4gVGhlIG9wdGlvbnMgcGFyYW1ldGVyIGlzIGFuIG9iamVjdCB0aGF0IHNwZWNpZmllcyBhbnkgcHJvcGVydGllcyB5b3Ugd2lzaCB0byBvdmVycmlkZSB0aGUgZGVmYXVsdHMuXG4gICAgICogQWxsIHByb3BlcnRpZXMgaGF2ZSBkZWZhdWx0IHZhbHVlcywgYW5kIG1hbnkgYXJlIHByZS1jYWxjdWxhdGVkIGF1dG9tYXRpY2FsbHkgYmFzZWQgb24gb3RoZXIgcHJvcGVydGllcy5cbiAgICAgKiBTZWUgdGhlIHByb3BlcnRpZXMgc2VjdGlvbiBiZWxvdyBmb3IgZGV0YWlsZWQgaW5mb3JtYXRpb24gb24gd2hhdCB5b3UgY2FuIHBhc3MgdmlhIHRoZSBgb3B0aW9uc2Agb2JqZWN0LlxuICAgICAqIEBtZXRob2QgY3JlYXRlXG4gICAgICogQHBhcmFtIHtvYmplY3R9IFtvcHRpb25zXVxuICAgICAqIEByZXR1cm4ge2VuZ2luZX0gZW5naW5lXG4gICAgICovXG4gICAgRW5naW5lLmNyZWF0ZSA9IGZ1bmN0aW9uKG9wdGlvbnMpIHtcbiAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgICAgICAgdmFyIGRlZmF1bHRzID0ge1xuICAgICAgICAgICAgcG9zaXRpb25JdGVyYXRpb25zOiA2LFxuICAgICAgICAgICAgdmVsb2NpdHlJdGVyYXRpb25zOiA0LFxuICAgICAgICAgICAgY29uc3RyYWludEl0ZXJhdGlvbnM6IDIsXG4gICAgICAgICAgICBlbmFibGVTbGVlcGluZzogZmFsc2UsXG4gICAgICAgICAgICBldmVudHM6IFtdLFxuICAgICAgICAgICAgcGx1Z2luOiB7fSxcbiAgICAgICAgICAgIGdyYXZpdHk6IHtcbiAgICAgICAgICAgICAgICB4OiAwLFxuICAgICAgICAgICAgICAgIHk6IDEsXG4gICAgICAgICAgICAgICAgc2NhbGU6IDAuMDAxXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdGltaW5nOiB7XG4gICAgICAgICAgICAgICAgdGltZXN0YW1wOiAwLFxuICAgICAgICAgICAgICAgIHRpbWVTY2FsZTogMSxcbiAgICAgICAgICAgICAgICBsYXN0RGVsdGE6IDAsXG4gICAgICAgICAgICAgICAgbGFzdEVsYXBzZWQ6IDBcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICB2YXIgZW5naW5lID0gQ29tbW9uLmV4dGVuZChkZWZhdWx0cywgb3B0aW9ucyk7XG5cbiAgICAgICAgZW5naW5lLndvcmxkID0gb3B0aW9ucy53b3JsZCB8fCBDb21wb3NpdGUuY3JlYXRlKHsgbGFiZWw6ICdXb3JsZCcgfSk7XG4gICAgICAgIGVuZ2luZS5wYWlycyA9IG9wdGlvbnMucGFpcnMgfHwgUGFpcnMuY3JlYXRlKCk7XG4gICAgICAgIGVuZ2luZS5kZXRlY3RvciA9IG9wdGlvbnMuZGV0ZWN0b3IgfHwgRGV0ZWN0b3IuY3JlYXRlKCk7XG5cbiAgICAgICAgLy8gZm9yIHRlbXBvcmFyeSBiYWNrIGNvbXBhdGliaWxpdHkgb25seVxuICAgICAgICBlbmdpbmUuZ3JpZCA9IHsgYnVja2V0czogW10gfTtcbiAgICAgICAgZW5naW5lLndvcmxkLmdyYXZpdHkgPSBlbmdpbmUuZ3Jhdml0eTtcbiAgICAgICAgZW5naW5lLmJyb2FkcGhhc2UgPSBlbmdpbmUuZ3JpZDtcbiAgICAgICAgZW5naW5lLm1ldHJpY3MgPSB7fTtcbiAgICAgICAgXG4gICAgICAgIHJldHVybiBlbmdpbmU7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIE1vdmVzIHRoZSBzaW11bGF0aW9uIGZvcndhcmQgaW4gdGltZSBieSBgZGVsdGFgIG1zLlxuICAgICAqIFRoZSBgY29ycmVjdGlvbmAgYXJndW1lbnQgaXMgYW4gb3B0aW9uYWwgYE51bWJlcmAgdGhhdCBzcGVjaWZpZXMgdGhlIHRpbWUgY29ycmVjdGlvbiBmYWN0b3IgdG8gYXBwbHkgdG8gdGhlIHVwZGF0ZS5cbiAgICAgKiBUaGlzIGNhbiBoZWxwIGltcHJvdmUgdGhlIGFjY3VyYWN5IG9mIHRoZSBzaW11bGF0aW9uIGluIGNhc2VzIHdoZXJlIGBkZWx0YWAgaXMgY2hhbmdpbmcgYmV0d2VlbiB1cGRhdGVzLlxuICAgICAqIFRoZSB2YWx1ZSBvZiBgY29ycmVjdGlvbmAgaXMgZGVmaW5lZCBhcyBgZGVsdGEgLyBsYXN0RGVsdGFgLCBpLmUuIHRoZSBwZXJjZW50YWdlIGNoYW5nZSBvZiBgZGVsdGFgIG92ZXIgdGhlIGxhc3Qgc3RlcC5cbiAgICAgKiBUaGVyZWZvcmUgdGhlIHZhbHVlIGlzIGFsd2F5cyBgMWAgKG5vIGNvcnJlY3Rpb24pIHdoZW4gYGRlbHRhYCBjb25zdGFudCAob3Igd2hlbiBubyBjb3JyZWN0aW9uIGlzIGRlc2lyZWQsIHdoaWNoIGlzIHRoZSBkZWZhdWx0KS5cbiAgICAgKiBTZWUgdGhlIHBhcGVyIG9uIDxhIGhyZWY9XCJodHRwOi8vbG9uZXNvY2submV0L2FydGljbGUvdmVybGV0Lmh0bWxcIj5UaW1lIENvcnJlY3RlZCBWZXJsZXQ8L2E+IGZvciBtb3JlIGluZm9ybWF0aW9uLlxuICAgICAqXG4gICAgICogVHJpZ2dlcnMgYGJlZm9yZVVwZGF0ZWAgYW5kIGBhZnRlclVwZGF0ZWAgZXZlbnRzLlxuICAgICAqIFRyaWdnZXJzIGBjb2xsaXNpb25TdGFydGAsIGBjb2xsaXNpb25BY3RpdmVgIGFuZCBgY29sbGlzaW9uRW5kYCBldmVudHMuXG4gICAgICogQG1ldGhvZCB1cGRhdGVcbiAgICAgKiBAcGFyYW0ge2VuZ2luZX0gZW5naW5lXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtkZWx0YT0xNi42NjZdXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtjb3JyZWN0aW9uPTFdXG4gICAgICovXG4gICAgRW5naW5lLnVwZGF0ZSA9IGZ1bmN0aW9uKGVuZ2luZSwgZGVsdGEsIGNvcnJlY3Rpb24pIHtcbiAgICAgICAgdmFyIHN0YXJ0VGltZSA9IENvbW1vbi5ub3coKTtcblxuICAgICAgICBkZWx0YSA9IGRlbHRhIHx8IDEwMDAgLyA2MDtcbiAgICAgICAgY29ycmVjdGlvbiA9IGNvcnJlY3Rpb24gfHwgMTtcblxuICAgICAgICB2YXIgd29ybGQgPSBlbmdpbmUud29ybGQsXG4gICAgICAgICAgICBkZXRlY3RvciA9IGVuZ2luZS5kZXRlY3RvcixcbiAgICAgICAgICAgIHBhaXJzID0gZW5naW5lLnBhaXJzLFxuICAgICAgICAgICAgdGltaW5nID0gZW5naW5lLnRpbWluZyxcbiAgICAgICAgICAgIHRpbWVzdGFtcCA9IHRpbWluZy50aW1lc3RhbXAsXG4gICAgICAgICAgICBpO1xuXG4gICAgICAgIC8vIGluY3JlbWVudCB0aW1lc3RhbXBcbiAgICAgICAgdGltaW5nLnRpbWVzdGFtcCArPSBkZWx0YSAqIHRpbWluZy50aW1lU2NhbGU7XG4gICAgICAgIHRpbWluZy5sYXN0RGVsdGEgPSBkZWx0YSAqIHRpbWluZy50aW1lU2NhbGU7XG5cbiAgICAgICAgLy8gY3JlYXRlIGFuIGV2ZW50IG9iamVjdFxuICAgICAgICB2YXIgZXZlbnQgPSB7XG4gICAgICAgICAgICB0aW1lc3RhbXA6IHRpbWluZy50aW1lc3RhbXBcbiAgICAgICAgfTtcblxuICAgICAgICBFdmVudHMudHJpZ2dlcihlbmdpbmUsICdiZWZvcmVVcGRhdGUnLCBldmVudCk7XG5cbiAgICAgICAgLy8gZ2V0IGFsbCBib2RpZXMgYW5kIGFsbCBjb25zdHJhaW50cyBpbiB0aGUgd29ybGRcbiAgICAgICAgdmFyIGFsbEJvZGllcyA9IENvbXBvc2l0ZS5hbGxCb2RpZXMod29ybGQpLFxuICAgICAgICAgICAgYWxsQ29uc3RyYWludHMgPSBDb21wb3NpdGUuYWxsQ29uc3RyYWludHMod29ybGQpO1xuXG4gICAgICAgIC8vIHVwZGF0ZSB0aGUgZGV0ZWN0b3IgYm9kaWVzIGlmIHRoZXkgaGF2ZSBjaGFuZ2VkXG4gICAgICAgIGlmICh3b3JsZC5pc01vZGlmaWVkKSB7XG4gICAgICAgICAgICBEZXRlY3Rvci5zZXRCb2RpZXMoZGV0ZWN0b3IsIGFsbEJvZGllcyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyByZXNldCBhbGwgY29tcG9zaXRlIG1vZGlmaWVkIGZsYWdzXG4gICAgICAgIGlmICh3b3JsZC5pc01vZGlmaWVkKSB7XG4gICAgICAgICAgICBDb21wb3NpdGUuc2V0TW9kaWZpZWQod29ybGQsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyB1cGRhdGUgc2xlZXBpbmcgaWYgZW5hYmxlZFxuICAgICAgICBpZiAoZW5naW5lLmVuYWJsZVNsZWVwaW5nKVxuICAgICAgICAgICAgU2xlZXBpbmcudXBkYXRlKGFsbEJvZGllcywgdGltaW5nLnRpbWVTY2FsZSk7XG5cbiAgICAgICAgLy8gYXBwbHkgZ3Jhdml0eSB0byBhbGwgYm9kaWVzXG4gICAgICAgIEVuZ2luZS5fYm9kaWVzQXBwbHlHcmF2aXR5KGFsbEJvZGllcywgZW5naW5lLmdyYXZpdHkpO1xuXG4gICAgICAgIC8vIHVwZGF0ZSBhbGwgYm9keSBwb3NpdGlvbiBhbmQgcm90YXRpb24gYnkgaW50ZWdyYXRpb25cbiAgICAgICAgRW5naW5lLl9ib2RpZXNVcGRhdGUoYWxsQm9kaWVzLCBkZWx0YSwgdGltaW5nLnRpbWVTY2FsZSwgY29ycmVjdGlvbiwgd29ybGQuYm91bmRzKTtcblxuICAgICAgICAvLyB1cGRhdGUgYWxsIGNvbnN0cmFpbnRzIChmaXJzdCBwYXNzKVxuICAgICAgICBDb25zdHJhaW50LnByZVNvbHZlQWxsKGFsbEJvZGllcyk7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBlbmdpbmUuY29uc3RyYWludEl0ZXJhdGlvbnM7IGkrKykge1xuICAgICAgICAgICAgQ29uc3RyYWludC5zb2x2ZUFsbChhbGxDb25zdHJhaW50cywgdGltaW5nLnRpbWVTY2FsZSk7XG4gICAgICAgIH1cbiAgICAgICAgQ29uc3RyYWludC5wb3N0U29sdmVBbGwoYWxsQm9kaWVzKTtcblxuICAgICAgICAvLyBmaW5kIGFsbCBjb2xsaXNpb25zXG4gICAgICAgIGRldGVjdG9yLnBhaXJzID0gZW5naW5lLnBhaXJzO1xuICAgICAgICB2YXIgY29sbGlzaW9ucyA9IERldGVjdG9yLmNvbGxpc2lvbnMoZGV0ZWN0b3IpO1xuXG4gICAgICAgIC8vIHVwZGF0ZSBjb2xsaXNpb24gcGFpcnNcbiAgICAgICAgUGFpcnMudXBkYXRlKHBhaXJzLCBjb2xsaXNpb25zLCB0aW1lc3RhbXApO1xuXG4gICAgICAgIC8vIHdha2UgdXAgYm9kaWVzIGludm9sdmVkIGluIGNvbGxpc2lvbnNcbiAgICAgICAgaWYgKGVuZ2luZS5lbmFibGVTbGVlcGluZylcbiAgICAgICAgICAgIFNsZWVwaW5nLmFmdGVyQ29sbGlzaW9ucyhwYWlycy5saXN0LCB0aW1pbmcudGltZVNjYWxlKTtcblxuICAgICAgICAvLyB0cmlnZ2VyIGNvbGxpc2lvbiBldmVudHNcbiAgICAgICAgaWYgKHBhaXJzLmNvbGxpc2lvblN0YXJ0Lmxlbmd0aCA+IDApXG4gICAgICAgICAgICBFdmVudHMudHJpZ2dlcihlbmdpbmUsICdjb2xsaXNpb25TdGFydCcsIHsgcGFpcnM6IHBhaXJzLmNvbGxpc2lvblN0YXJ0IH0pO1xuXG4gICAgICAgIC8vIGl0ZXJhdGl2ZWx5IHJlc29sdmUgcG9zaXRpb24gYmV0d2VlbiBjb2xsaXNpb25zXG4gICAgICAgIFJlc29sdmVyLnByZVNvbHZlUG9zaXRpb24ocGFpcnMubGlzdCk7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBlbmdpbmUucG9zaXRpb25JdGVyYXRpb25zOyBpKyspIHtcbiAgICAgICAgICAgIFJlc29sdmVyLnNvbHZlUG9zaXRpb24ocGFpcnMubGlzdCwgdGltaW5nLnRpbWVTY2FsZSk7XG4gICAgICAgIH1cbiAgICAgICAgUmVzb2x2ZXIucG9zdFNvbHZlUG9zaXRpb24oYWxsQm9kaWVzKTtcblxuICAgICAgICAvLyB1cGRhdGUgYWxsIGNvbnN0cmFpbnRzIChzZWNvbmQgcGFzcylcbiAgICAgICAgQ29uc3RyYWludC5wcmVTb2x2ZUFsbChhbGxCb2RpZXMpO1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZW5naW5lLmNvbnN0cmFpbnRJdGVyYXRpb25zOyBpKyspIHtcbiAgICAgICAgICAgIENvbnN0cmFpbnQuc29sdmVBbGwoYWxsQ29uc3RyYWludHMsIHRpbWluZy50aW1lU2NhbGUpO1xuICAgICAgICB9XG4gICAgICAgIENvbnN0cmFpbnQucG9zdFNvbHZlQWxsKGFsbEJvZGllcyk7XG5cbiAgICAgICAgLy8gaXRlcmF0aXZlbHkgcmVzb2x2ZSB2ZWxvY2l0eSBiZXR3ZWVuIGNvbGxpc2lvbnNcbiAgICAgICAgUmVzb2x2ZXIucHJlU29sdmVWZWxvY2l0eShwYWlycy5saXN0KTtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGVuZ2luZS52ZWxvY2l0eUl0ZXJhdGlvbnM7IGkrKykge1xuICAgICAgICAgICAgUmVzb2x2ZXIuc29sdmVWZWxvY2l0eShwYWlycy5saXN0LCB0aW1pbmcudGltZVNjYWxlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHRyaWdnZXIgY29sbGlzaW9uIGV2ZW50c1xuICAgICAgICBpZiAocGFpcnMuY29sbGlzaW9uQWN0aXZlLmxlbmd0aCA+IDApXG4gICAgICAgICAgICBFdmVudHMudHJpZ2dlcihlbmdpbmUsICdjb2xsaXNpb25BY3RpdmUnLCB7IHBhaXJzOiBwYWlycy5jb2xsaXNpb25BY3RpdmUgfSk7XG5cbiAgICAgICAgaWYgKHBhaXJzLmNvbGxpc2lvbkVuZC5sZW5ndGggPiAwKVxuICAgICAgICAgICAgRXZlbnRzLnRyaWdnZXIoZW5naW5lLCAnY29sbGlzaW9uRW5kJywgeyBwYWlyczogcGFpcnMuY29sbGlzaW9uRW5kIH0pO1xuXG4gICAgICAgIC8vIGNsZWFyIGZvcmNlIGJ1ZmZlcnNcbiAgICAgICAgRW5naW5lLl9ib2RpZXNDbGVhckZvcmNlcyhhbGxCb2RpZXMpO1xuXG4gICAgICAgIEV2ZW50cy50cmlnZ2VyKGVuZ2luZSwgJ2FmdGVyVXBkYXRlJywgZXZlbnQpO1xuXG4gICAgICAgIC8vIGxvZyB0aGUgdGltZSBlbGFwc2VkIGNvbXB1dGluZyB0aGlzIHVwZGF0ZVxuICAgICAgICBlbmdpbmUudGltaW5nLmxhc3RFbGFwc2VkID0gQ29tbW9uLm5vdygpIC0gc3RhcnRUaW1lO1xuXG4gICAgICAgIHJldHVybiBlbmdpbmU7XG4gICAgfTtcbiAgICBcbiAgICAvKipcbiAgICAgKiBNZXJnZXMgdHdvIGVuZ2luZXMgYnkga2VlcGluZyB0aGUgY29uZmlndXJhdGlvbiBvZiBgZW5naW5lQWAgYnV0IHJlcGxhY2luZyB0aGUgd29ybGQgd2l0aCB0aGUgb25lIGZyb20gYGVuZ2luZUJgLlxuICAgICAqIEBtZXRob2QgbWVyZ2VcbiAgICAgKiBAcGFyYW0ge2VuZ2luZX0gZW5naW5lQVxuICAgICAqIEBwYXJhbSB7ZW5naW5lfSBlbmdpbmVCXG4gICAgICovXG4gICAgRW5naW5lLm1lcmdlID0gZnVuY3Rpb24oZW5naW5lQSwgZW5naW5lQikge1xuICAgICAgICBDb21tb24uZXh0ZW5kKGVuZ2luZUEsIGVuZ2luZUIpO1xuICAgICAgICBcbiAgICAgICAgaWYgKGVuZ2luZUIud29ybGQpIHtcbiAgICAgICAgICAgIGVuZ2luZUEud29ybGQgPSBlbmdpbmVCLndvcmxkO1xuXG4gICAgICAgICAgICBFbmdpbmUuY2xlYXIoZW5naW5lQSk7XG5cbiAgICAgICAgICAgIHZhciBib2RpZXMgPSBDb21wb3NpdGUuYWxsQm9kaWVzKGVuZ2luZUEud29ybGQpO1xuXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGJvZGllcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIHZhciBib2R5ID0gYm9kaWVzW2ldO1xuICAgICAgICAgICAgICAgIFNsZWVwaW5nLnNldChib2R5LCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgYm9keS5pZCA9IENvbW1vbi5uZXh0SWQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBDbGVhcnMgdGhlIGVuZ2luZSBwYWlycyBhbmQgZGV0ZWN0b3IuXG4gICAgICogQG1ldGhvZCBjbGVhclxuICAgICAqIEBwYXJhbSB7ZW5naW5lfSBlbmdpbmVcbiAgICAgKi9cbiAgICBFbmdpbmUuY2xlYXIgPSBmdW5jdGlvbihlbmdpbmUpIHtcbiAgICAgICAgUGFpcnMuY2xlYXIoZW5naW5lLnBhaXJzKTtcbiAgICAgICAgRGV0ZWN0b3IuY2xlYXIoZW5naW5lLmRldGVjdG9yKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogWmVyb2VzIHRoZSBgYm9keS5mb3JjZWAgYW5kIGBib2R5LnRvcnF1ZWAgZm9yY2UgYnVmZmVycy5cbiAgICAgKiBAbWV0aG9kIF9ib2RpZXNDbGVhckZvcmNlc1xuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtib2R5W119IGJvZGllc1xuICAgICAqL1xuICAgIEVuZ2luZS5fYm9kaWVzQ2xlYXJGb3JjZXMgPSBmdW5jdGlvbihib2RpZXMpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBib2RpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBib2R5ID0gYm9kaWVzW2ldO1xuXG4gICAgICAgICAgICAvLyByZXNldCBmb3JjZSBidWZmZXJzXG4gICAgICAgICAgICBib2R5LmZvcmNlLnggPSAwO1xuICAgICAgICAgICAgYm9keS5mb3JjZS55ID0gMDtcbiAgICAgICAgICAgIGJvZHkudG9ycXVlID0gMDtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBBcHBseXMgYSBtYXNzIGRlcGVuZGFudCBmb3JjZSB0byBhbGwgZ2l2ZW4gYm9kaWVzLlxuICAgICAqIEBtZXRob2QgX2JvZGllc0FwcGx5R3Jhdml0eVxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtib2R5W119IGJvZGllc1xuICAgICAqIEBwYXJhbSB7dmVjdG9yfSBncmF2aXR5XG4gICAgICovXG4gICAgRW5naW5lLl9ib2RpZXNBcHBseUdyYXZpdHkgPSBmdW5jdGlvbihib2RpZXMsIGdyYXZpdHkpIHtcbiAgICAgICAgdmFyIGdyYXZpdHlTY2FsZSA9IHR5cGVvZiBncmF2aXR5LnNjYWxlICE9PSAndW5kZWZpbmVkJyA/IGdyYXZpdHkuc2NhbGUgOiAwLjAwMTtcblxuICAgICAgICBpZiAoKGdyYXZpdHkueCA9PT0gMCAmJiBncmF2aXR5LnkgPT09IDApIHx8IGdyYXZpdHlTY2FsZSA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGJvZGllcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIGJvZHkgPSBib2RpZXNbaV07XG5cbiAgICAgICAgICAgIGlmIChib2R5LmlzU3RhdGljIHx8IGJvZHkuaXNTbGVlcGluZylcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcblxuICAgICAgICAgICAgLy8gYXBwbHkgZ3Jhdml0eVxuICAgICAgICAgICAgYm9keS5mb3JjZS55ICs9IGJvZHkubWFzcyAqIGdyYXZpdHkueSAqIGdyYXZpdHlTY2FsZTtcbiAgICAgICAgICAgIGJvZHkuZm9yY2UueCArPSBib2R5Lm1hc3MgKiBncmF2aXR5LnggKiBncmF2aXR5U2NhbGU7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQXBwbHlzIGBCb2R5LnVwZGF0ZWAgdG8gYWxsIGdpdmVuIGBib2RpZXNgLlxuICAgICAqIEBtZXRob2QgX2JvZGllc1VwZGF0ZVxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtib2R5W119IGJvZGllc1xuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBkZWx0YVRpbWUgXG4gICAgICogVGhlIGFtb3VudCBvZiB0aW1lIGVsYXBzZWQgYmV0d2VlbiB1cGRhdGVzXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHRpbWVTY2FsZVxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBjb3JyZWN0aW9uIFxuICAgICAqIFRoZSBWZXJsZXQgY29ycmVjdGlvbiBmYWN0b3IgKGRlbHRhVGltZSAvIGxhc3REZWx0YVRpbWUpXG4gICAgICogQHBhcmFtIHtib3VuZHN9IHdvcmxkQm91bmRzXG4gICAgICovXG4gICAgRW5naW5lLl9ib2RpZXNVcGRhdGUgPSBmdW5jdGlvbihib2RpZXMsIGRlbHRhVGltZSwgdGltZVNjYWxlLCBjb3JyZWN0aW9uLCB3b3JsZEJvdW5kcykge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGJvZGllcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIGJvZHkgPSBib2RpZXNbaV07XG5cbiAgICAgICAgICAgIGlmIChib2R5LmlzU3RhdGljIHx8IGJvZHkuaXNTbGVlcGluZylcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcblxuICAgICAgICAgICAgQm9keS51cGRhdGUoYm9keSwgZGVsdGFUaW1lLCB0aW1lU2NhbGUsIGNvcnJlY3Rpb24pO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEEgZGVwcmVjYXRlZCBhbGlhcyBmb3IgYFJ1bm5lci5ydW5gLCB1c2UgYE1hdHRlci5SdW5uZXIucnVuKGVuZ2luZSlgIGluc3RlYWQgYW5kIHNlZSBgTWF0dGVyLlJ1bm5lcmAgZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gICAgICogQGRlcHJlY2F0ZWQgdXNlIE1hdHRlci5SdW5uZXIucnVuKGVuZ2luZSkgaW5zdGVhZFxuICAgICAqIEBtZXRob2QgcnVuXG4gICAgICogQHBhcmFtIHtlbmdpbmV9IGVuZ2luZVxuICAgICAqL1xuXG4gICAgLyoqXG4gICAgKiBGaXJlZCBqdXN0IGJlZm9yZSBhbiB1cGRhdGVcbiAgICAqXG4gICAgKiBAZXZlbnQgYmVmb3JlVXBkYXRlXG4gICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgQW4gZXZlbnQgb2JqZWN0XG4gICAgKiBAcGFyYW0ge251bWJlcn0gZXZlbnQudGltZXN0YW1wIFRoZSBlbmdpbmUudGltaW5nLnRpbWVzdGFtcCBvZiB0aGUgZXZlbnRcbiAgICAqIEBwYXJhbSB7ZW5naW5lfSBldmVudC5zb3VyY2UgVGhlIHNvdXJjZSBvYmplY3Qgb2YgdGhlIGV2ZW50XG4gICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnQubmFtZSBUaGUgbmFtZSBvZiB0aGUgZXZlbnRcbiAgICAqL1xuXG4gICAgLyoqXG4gICAgKiBGaXJlZCBhZnRlciBlbmdpbmUgdXBkYXRlIGFuZCBhbGwgY29sbGlzaW9uIGV2ZW50c1xuICAgICpcbiAgICAqIEBldmVudCBhZnRlclVwZGF0ZVxuICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEFuIGV2ZW50IG9iamVjdFxuICAgICogQHBhcmFtIHtudW1iZXJ9IGV2ZW50LnRpbWVzdGFtcCBUaGUgZW5naW5lLnRpbWluZy50aW1lc3RhbXAgb2YgdGhlIGV2ZW50XG4gICAgKiBAcGFyYW0ge2VuZ2luZX0gZXZlbnQuc291cmNlIFRoZSBzb3VyY2Ugb2JqZWN0IG9mIHRoZSBldmVudFxuICAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50Lm5hbWUgVGhlIG5hbWUgb2YgdGhlIGV2ZW50XG4gICAgKi9cblxuICAgIC8qKlxuICAgICogRmlyZWQgYWZ0ZXIgZW5naW5lIHVwZGF0ZSwgcHJvdmlkZXMgYSBsaXN0IG9mIGFsbCBwYWlycyB0aGF0IGhhdmUgc3RhcnRlZCB0byBjb2xsaWRlIGluIHRoZSBjdXJyZW50IHRpY2sgKGlmIGFueSlcbiAgICAqXG4gICAgKiBAZXZlbnQgY29sbGlzaW9uU3RhcnRcbiAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBBbiBldmVudCBvYmplY3RcbiAgICAqIEBwYXJhbSB7cGFpcltdfSBldmVudC5wYWlycyBMaXN0IG9mIGFmZmVjdGVkIHBhaXJzXG4gICAgKiBAcGFyYW0ge251bWJlcn0gZXZlbnQudGltZXN0YW1wIFRoZSBlbmdpbmUudGltaW5nLnRpbWVzdGFtcCBvZiB0aGUgZXZlbnRcbiAgICAqIEBwYXJhbSB7ZW5naW5lfSBldmVudC5zb3VyY2UgVGhlIHNvdXJjZSBvYmplY3Qgb2YgdGhlIGV2ZW50XG4gICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnQubmFtZSBUaGUgbmFtZSBvZiB0aGUgZXZlbnRcbiAgICAqL1xuXG4gICAgLyoqXG4gICAgKiBGaXJlZCBhZnRlciBlbmdpbmUgdXBkYXRlLCBwcm92aWRlcyBhIGxpc3Qgb2YgYWxsIHBhaXJzIHRoYXQgYXJlIGNvbGxpZGluZyBpbiB0aGUgY3VycmVudCB0aWNrIChpZiBhbnkpXG4gICAgKlxuICAgICogQGV2ZW50IGNvbGxpc2lvbkFjdGl2ZVxuICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEFuIGV2ZW50IG9iamVjdFxuICAgICogQHBhcmFtIHtwYWlyW119IGV2ZW50LnBhaXJzIExpc3Qgb2YgYWZmZWN0ZWQgcGFpcnNcbiAgICAqIEBwYXJhbSB7bnVtYmVyfSBldmVudC50aW1lc3RhbXAgVGhlIGVuZ2luZS50aW1pbmcudGltZXN0YW1wIG9mIHRoZSBldmVudFxuICAgICogQHBhcmFtIHtlbmdpbmV9IGV2ZW50LnNvdXJjZSBUaGUgc291cmNlIG9iamVjdCBvZiB0aGUgZXZlbnRcbiAgICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudC5uYW1lIFRoZSBuYW1lIG9mIHRoZSBldmVudFxuICAgICovXG5cbiAgICAvKipcbiAgICAqIEZpcmVkIGFmdGVyIGVuZ2luZSB1cGRhdGUsIHByb3ZpZGVzIGEgbGlzdCBvZiBhbGwgcGFpcnMgdGhhdCBoYXZlIGVuZGVkIGNvbGxpc2lvbiBpbiB0aGUgY3VycmVudCB0aWNrIChpZiBhbnkpXG4gICAgKlxuICAgICogQGV2ZW50IGNvbGxpc2lvbkVuZFxuICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEFuIGV2ZW50IG9iamVjdFxuICAgICogQHBhcmFtIHtwYWlyW119IGV2ZW50LnBhaXJzIExpc3Qgb2YgYWZmZWN0ZWQgcGFpcnNcbiAgICAqIEBwYXJhbSB7bnVtYmVyfSBldmVudC50aW1lc3RhbXAgVGhlIGVuZ2luZS50aW1pbmcudGltZXN0YW1wIG9mIHRoZSBldmVudFxuICAgICogQHBhcmFtIHtlbmdpbmV9IGV2ZW50LnNvdXJjZSBUaGUgc291cmNlIG9iamVjdCBvZiB0aGUgZXZlbnRcbiAgICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudC5uYW1lIFRoZSBuYW1lIG9mIHRoZSBldmVudFxuICAgICovXG5cbiAgICAvKlxuICAgICpcbiAgICAqICBQcm9wZXJ0aWVzIERvY3VtZW50YXRpb25cbiAgICAqXG4gICAgKi9cblxuICAgIC8qKlxuICAgICAqIEFuIGludGVnZXIgYE51bWJlcmAgdGhhdCBzcGVjaWZpZXMgdGhlIG51bWJlciBvZiBwb3NpdGlvbiBpdGVyYXRpb25zIHRvIHBlcmZvcm0gZWFjaCB1cGRhdGUuXG4gICAgICogVGhlIGhpZ2hlciB0aGUgdmFsdWUsIHRoZSBoaWdoZXIgcXVhbGl0eSB0aGUgc2ltdWxhdGlvbiB3aWxsIGJlIGF0IHRoZSBleHBlbnNlIG9mIHBlcmZvcm1hbmNlLlxuICAgICAqXG4gICAgICogQHByb3BlcnR5IHBvc2l0aW9uSXRlcmF0aW9uc1xuICAgICAqIEB0eXBlIG51bWJlclxuICAgICAqIEBkZWZhdWx0IDZcbiAgICAgKi9cblxuICAgIC8qKlxuICAgICAqIEFuIGludGVnZXIgYE51bWJlcmAgdGhhdCBzcGVjaWZpZXMgdGhlIG51bWJlciBvZiB2ZWxvY2l0eSBpdGVyYXRpb25zIHRvIHBlcmZvcm0gZWFjaCB1cGRhdGUuXG4gICAgICogVGhlIGhpZ2hlciB0aGUgdmFsdWUsIHRoZSBoaWdoZXIgcXVhbGl0eSB0aGUgc2ltdWxhdGlvbiB3aWxsIGJlIGF0IHRoZSBleHBlbnNlIG9mIHBlcmZvcm1hbmNlLlxuICAgICAqXG4gICAgICogQHByb3BlcnR5IHZlbG9jaXR5SXRlcmF0aW9uc1xuICAgICAqIEB0eXBlIG51bWJlclxuICAgICAqIEBkZWZhdWx0IDRcbiAgICAgKi9cblxuICAgIC8qKlxuICAgICAqIEFuIGludGVnZXIgYE51bWJlcmAgdGhhdCBzcGVjaWZpZXMgdGhlIG51bWJlciBvZiBjb25zdHJhaW50IGl0ZXJhdGlvbnMgdG8gcGVyZm9ybSBlYWNoIHVwZGF0ZS5cbiAgICAgKiBUaGUgaGlnaGVyIHRoZSB2YWx1ZSwgdGhlIGhpZ2hlciBxdWFsaXR5IHRoZSBzaW11bGF0aW9uIHdpbGwgYmUgYXQgdGhlIGV4cGVuc2Ugb2YgcGVyZm9ybWFuY2UuXG4gICAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgYDJgIGlzIHVzdWFsbHkgdmVyeSBhZGVxdWF0ZS5cbiAgICAgKlxuICAgICAqIEBwcm9wZXJ0eSBjb25zdHJhaW50SXRlcmF0aW9uc1xuICAgICAqIEB0eXBlIG51bWJlclxuICAgICAqIEBkZWZhdWx0IDJcbiAgICAgKi9cblxuICAgIC8qKlxuICAgICAqIEEgZmxhZyB0aGF0IHNwZWNpZmllcyB3aGV0aGVyIHRoZSBlbmdpbmUgc2hvdWxkIGFsbG93IHNsZWVwaW5nIHZpYSB0aGUgYE1hdHRlci5TbGVlcGluZ2AgbW9kdWxlLlxuICAgICAqIFNsZWVwaW5nIGNhbiBpbXByb3ZlIHN0YWJpbGl0eSBhbmQgcGVyZm9ybWFuY2UsIGJ1dCBvZnRlbiBhdCB0aGUgZXhwZW5zZSBvZiBhY2N1cmFjeS5cbiAgICAgKlxuICAgICAqIEBwcm9wZXJ0eSBlbmFibGVTbGVlcGluZ1xuICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAqL1xuXG4gICAgLyoqXG4gICAgICogQW4gYE9iamVjdGAgY29udGFpbmluZyBwcm9wZXJ0aWVzIHJlZ2FyZGluZyB0aGUgdGltaW5nIHN5c3RlbXMgb2YgdGhlIGVuZ2luZS4gXG4gICAgICpcbiAgICAgKiBAcHJvcGVydHkgdGltaW5nXG4gICAgICogQHR5cGUgb2JqZWN0XG4gICAgICovXG5cbiAgICAvKipcbiAgICAgKiBBIGBOdW1iZXJgIHRoYXQgc3BlY2lmaWVzIHRoZSBnbG9iYWwgc2NhbGluZyBmYWN0b3Igb2YgdGltZSBmb3IgYWxsIGJvZGllcy5cbiAgICAgKiBBIHZhbHVlIG9mIGAwYCBmcmVlemVzIHRoZSBzaW11bGF0aW9uLlxuICAgICAqIEEgdmFsdWUgb2YgYDAuMWAgZ2l2ZXMgYSBzbG93LW1vdGlvbiBlZmZlY3QuXG4gICAgICogQSB2YWx1ZSBvZiBgMS4yYCBnaXZlcyBhIHNwZWVkLXVwIGVmZmVjdC5cbiAgICAgKlxuICAgICAqIEBwcm9wZXJ0eSB0aW1pbmcudGltZVNjYWxlXG4gICAgICogQHR5cGUgbnVtYmVyXG4gICAgICogQGRlZmF1bHQgMVxuICAgICAqL1xuXG4gICAgLyoqXG4gICAgICogQSBgTnVtYmVyYCB0aGF0IHNwZWNpZmllcyB0aGUgY3VycmVudCBzaW11bGF0aW9uLXRpbWUgaW4gbWlsbGlzZWNvbmRzIHN0YXJ0aW5nIGZyb20gYDBgLiBcbiAgICAgKiBJdCBpcyBpbmNyZW1lbnRlZCBvbiBldmVyeSBgRW5naW5lLnVwZGF0ZWAgYnkgdGhlIGdpdmVuIGBkZWx0YWAgYXJndW1lbnQuIFxuICAgICAqXG4gICAgICogQHByb3BlcnR5IHRpbWluZy50aW1lc3RhbXBcbiAgICAgKiBAdHlwZSBudW1iZXJcbiAgICAgKiBAZGVmYXVsdCAwXG4gICAgICovXG5cbiAgICAvKipcbiAgICAgKiBBIGBOdW1iZXJgIHRoYXQgcmVwcmVzZW50cyB0aGUgdG90YWwgZXhlY3V0aW9uIHRpbWUgZWxhcHNlZCBkdXJpbmcgdGhlIGxhc3QgYEVuZ2luZS51cGRhdGVgIGluIG1pbGxpc2Vjb25kcy5cbiAgICAgKiBJdCBpcyB1cGRhdGVkIGJ5IHRpbWluZyBmcm9tIHRoZSBzdGFydCBvZiB0aGUgbGFzdCBgRW5naW5lLnVwZGF0ZWAgY2FsbCB1bnRpbCBpdCBlbmRzLlxuICAgICAqXG4gICAgICogVGhpcyB2YWx1ZSB3aWxsIGFsc28gaW5jbHVkZSB0aGUgdG90YWwgZXhlY3V0aW9uIHRpbWUgb2YgYWxsIGV2ZW50IGhhbmRsZXJzIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgdHJpZ2dlcmVkIGJ5IHRoZSBlbmdpbmUgdXBkYXRlLlxuICAgICAqXG4gICAgICogQHByb3BlcnR5IHRpbWluZy5sYXN0RWxhcHNlZFxuICAgICAqIEB0eXBlIG51bWJlclxuICAgICAqIEBkZWZhdWx0IDBcbiAgICAgKi9cblxuICAgIC8qKlxuICAgICAqIEEgYE51bWJlcmAgdGhhdCByZXByZXNlbnRzIHRoZSBgZGVsdGFgIHZhbHVlIHVzZWQgaW4gdGhlIGxhc3QgZW5naW5lIHVwZGF0ZS5cbiAgICAgKlxuICAgICAqIEBwcm9wZXJ0eSB0aW1pbmcubGFzdERlbHRhXG4gICAgICogQHR5cGUgbnVtYmVyXG4gICAgICogQGRlZmF1bHQgMFxuICAgICAqL1xuXG4gICAgLyoqXG4gICAgICogQSBgTWF0dGVyLkRldGVjdG9yYCBpbnN0YW5jZS5cbiAgICAgKlxuICAgICAqIEBwcm9wZXJ0eSBkZXRlY3RvclxuICAgICAqIEB0eXBlIGRldGVjdG9yXG4gICAgICogQGRlZmF1bHQgYSBNYXR0ZXIuRGV0ZWN0b3IgaW5zdGFuY2VcbiAgICAgKi9cblxuICAgIC8qKlxuICAgICAqIEEgYE1hdHRlci5HcmlkYCBpbnN0YW5jZS5cbiAgICAgKlxuICAgICAqIEBkZXByZWNhdGVkIHJlcGxhY2VkIGJ5IGBlbmdpbmUuZGV0ZWN0b3JgXG4gICAgICogQHByb3BlcnR5IGdyaWRcbiAgICAgKiBAdHlwZSBncmlkXG4gICAgICogQGRlZmF1bHQgYSBNYXR0ZXIuR3JpZCBpbnN0YW5jZVxuICAgICAqL1xuXG4gICAgLyoqXG4gICAgICogUmVwbGFjZWQgYnkgYW5kIG5vdyBhbGlhcyBmb3IgYGVuZ2luZS5ncmlkYC5cbiAgICAgKlxuICAgICAqIEBkZXByZWNhdGVkIHJlcGxhY2VkIGJ5IGBlbmdpbmUuZGV0ZWN0b3JgXG4gICAgICogQHByb3BlcnR5IGJyb2FkcGhhc2VcbiAgICAgKiBAdHlwZSBncmlkXG4gICAgICogQGRlZmF1bHQgYSBNYXR0ZXIuR3JpZCBpbnN0YW5jZVxuICAgICAqL1xuXG4gICAgLyoqXG4gICAgICogVGhlIHJvb3QgYE1hdHRlci5Db21wb3NpdGVgIGluc3RhbmNlIHRoYXQgd2lsbCBjb250YWluIGFsbCBib2RpZXMsIGNvbnN0cmFpbnRzIGFuZCBvdGhlciBjb21wb3NpdGVzIHRvIGJlIHNpbXVsYXRlZCBieSB0aGlzIGVuZ2luZS5cbiAgICAgKlxuICAgICAqIEBwcm9wZXJ0eSB3b3JsZFxuICAgICAqIEB0eXBlIGNvbXBvc2l0ZVxuICAgICAqIEBkZWZhdWx0IGEgTWF0dGVyLkNvbXBvc2l0ZSBpbnN0YW5jZVxuICAgICAqL1xuXG4gICAgLyoqXG4gICAgICogQW4gb2JqZWN0IHJlc2VydmVkIGZvciBzdG9yaW5nIHBsdWdpbi1zcGVjaWZpYyBwcm9wZXJ0aWVzLlxuICAgICAqXG4gICAgICogQHByb3BlcnR5IHBsdWdpblxuICAgICAqIEB0eXBlIHt9XG4gICAgICovXG5cbiAgICAvKipcbiAgICAgKiBUaGUgZ3Jhdml0eSB0byBhcHBseSBvbiBhbGwgYm9kaWVzIGluIGBlbmdpbmUud29ybGRgLlxuICAgICAqXG4gICAgICogQHByb3BlcnR5IGdyYXZpdHlcbiAgICAgKiBAdHlwZSBvYmplY3RcbiAgICAgKi9cblxuICAgIC8qKlxuICAgICAqIFRoZSBncmF2aXR5IHggY29tcG9uZW50LlxuICAgICAqXG4gICAgICogQHByb3BlcnR5IGdyYXZpdHkueFxuICAgICAqIEB0eXBlIG9iamVjdFxuICAgICAqIEBkZWZhdWx0IDBcbiAgICAgKi9cblxuICAgIC8qKlxuICAgICAqIFRoZSBncmF2aXR5IHkgY29tcG9uZW50LlxuICAgICAqXG4gICAgICogQHByb3BlcnR5IGdyYXZpdHkueVxuICAgICAqIEB0eXBlIG9iamVjdFxuICAgICAqIEBkZWZhdWx0IDFcbiAgICAgKi9cblxuICAgIC8qKlxuICAgICAqIFRoZSBncmF2aXR5IHNjYWxlIGZhY3Rvci5cbiAgICAgKlxuICAgICAqIEBwcm9wZXJ0eSBncmF2aXR5LnNjYWxlXG4gICAgICogQHR5cGUgb2JqZWN0XG4gICAgICogQGRlZmF1bHQgMC4wMDFcbiAgICAgKi9cblxufSkoKTtcblxuXG4vKioqLyB9KSxcbi8qIDE5ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cbi8qKlxuKiBUaGUgYE1hdHRlci5SZXNvbHZlcmAgbW9kdWxlIGNvbnRhaW5zIG1ldGhvZHMgZm9yIHJlc29sdmluZyBjb2xsaXNpb24gcGFpcnMuXG4qXG4qIEBjbGFzcyBSZXNvbHZlclxuKi9cblxudmFyIFJlc29sdmVyID0ge307XG5cbm1vZHVsZS5leHBvcnRzID0gUmVzb2x2ZXI7XG5cbnZhciBWZXJ0aWNlcyA9IF9fd2VicGFja19yZXF1aXJlX18oMyk7XG52YXIgQm91bmRzID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKTtcblxuKGZ1bmN0aW9uKCkge1xuXG4gICAgUmVzb2x2ZXIuX3Jlc3RpbmdUaHJlc2ggPSA0O1xuICAgIFJlc29sdmVyLl9yZXN0aW5nVGhyZXNoVGFuZ2VudCA9IDY7XG4gICAgUmVzb2x2ZXIuX3Bvc2l0aW9uRGFtcGVuID0gMC45O1xuICAgIFJlc29sdmVyLl9wb3NpdGlvbldhcm1pbmcgPSAwLjg7XG4gICAgUmVzb2x2ZXIuX2ZyaWN0aW9uTm9ybWFsTXVsdGlwbGllciA9IDU7XG5cbiAgICAvKipcbiAgICAgKiBQcmVwYXJlIHBhaXJzIGZvciBwb3NpdGlvbiBzb2x2aW5nLlxuICAgICAqIEBtZXRob2QgcHJlU29sdmVQb3NpdGlvblxuICAgICAqIEBwYXJhbSB7cGFpcltdfSBwYWlyc1xuICAgICAqL1xuICAgIFJlc29sdmVyLnByZVNvbHZlUG9zaXRpb24gPSBmdW5jdGlvbihwYWlycykge1xuICAgICAgICB2YXIgaSxcbiAgICAgICAgICAgIHBhaXIsXG4gICAgICAgICAgICBhY3RpdmVDb3VudCxcbiAgICAgICAgICAgIHBhaXJzTGVuZ3RoID0gcGFpcnMubGVuZ3RoO1xuXG4gICAgICAgIC8vIGZpbmQgdG90YWwgY29udGFjdHMgb24gZWFjaCBib2R5XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBwYWlyc0xlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBwYWlyID0gcGFpcnNbaV07XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmICghcGFpci5pc0FjdGl2ZSlcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgYWN0aXZlQ291bnQgPSBwYWlyLmFjdGl2ZUNvbnRhY3RzLmxlbmd0aDtcbiAgICAgICAgICAgIHBhaXIuY29sbGlzaW9uLnBhcmVudEEudG90YWxDb250YWN0cyArPSBhY3RpdmVDb3VudDtcbiAgICAgICAgICAgIHBhaXIuY29sbGlzaW9uLnBhcmVudEIudG90YWxDb250YWN0cyArPSBhY3RpdmVDb3VudDtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBGaW5kIGEgc29sdXRpb24gZm9yIHBhaXIgcG9zaXRpb25zLlxuICAgICAqIEBtZXRob2Qgc29sdmVQb3NpdGlvblxuICAgICAqIEBwYXJhbSB7cGFpcltdfSBwYWlyc1xuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB0aW1lU2NhbGVcbiAgICAgKi9cbiAgICBSZXNvbHZlci5zb2x2ZVBvc2l0aW9uID0gZnVuY3Rpb24ocGFpcnMsIHRpbWVTY2FsZSkge1xuICAgICAgICB2YXIgaSxcbiAgICAgICAgICAgIHBhaXIsXG4gICAgICAgICAgICBjb2xsaXNpb24sXG4gICAgICAgICAgICBib2R5QSxcbiAgICAgICAgICAgIGJvZHlCLFxuICAgICAgICAgICAgbm9ybWFsLFxuICAgICAgICAgICAgY29udGFjdFNoYXJlLFxuICAgICAgICAgICAgcG9zaXRpb25JbXB1bHNlLFxuICAgICAgICAgICAgcG9zaXRpb25EYW1wZW4gPSBSZXNvbHZlci5fcG9zaXRpb25EYW1wZW4sXG4gICAgICAgICAgICBwYWlyc0xlbmd0aCA9IHBhaXJzLmxlbmd0aDtcblxuICAgICAgICAvLyBmaW5kIGltcHVsc2VzIHJlcXVpcmVkIHRvIHJlc29sdmUgcGVuZXRyYXRpb25cbiAgICAgICAgZm9yIChpID0gMDsgaSA8IHBhaXJzTGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHBhaXIgPSBwYWlyc1tpXTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgaWYgKCFwYWlyLmlzQWN0aXZlIHx8IHBhaXIuaXNTZW5zb3IpXG4gICAgICAgICAgICAgICAgY29udGludWU7XG5cbiAgICAgICAgICAgIGNvbGxpc2lvbiA9IHBhaXIuY29sbGlzaW9uO1xuICAgICAgICAgICAgYm9keUEgPSBjb2xsaXNpb24ucGFyZW50QTtcbiAgICAgICAgICAgIGJvZHlCID0gY29sbGlzaW9uLnBhcmVudEI7XG4gICAgICAgICAgICBub3JtYWwgPSBjb2xsaXNpb24ubm9ybWFsO1xuXG4gICAgICAgICAgICAvLyBnZXQgY3VycmVudCBzZXBhcmF0aW9uIGJldHdlZW4gYm9keSBlZGdlcyBpbnZvbHZlZCBpbiBjb2xsaXNpb25cbiAgICAgICAgICAgIHBhaXIuc2VwYXJhdGlvbiA9IFxuICAgICAgICAgICAgICAgIG5vcm1hbC54ICogKGJvZHlCLnBvc2l0aW9uSW1wdWxzZS54ICsgY29sbGlzaW9uLnBlbmV0cmF0aW9uLnggLSBib2R5QS5wb3NpdGlvbkltcHVsc2UueClcbiAgICAgICAgICAgICAgICArIG5vcm1hbC55ICogKGJvZHlCLnBvc2l0aW9uSW1wdWxzZS55ICsgY29sbGlzaW9uLnBlbmV0cmF0aW9uLnkgLSBib2R5QS5wb3NpdGlvbkltcHVsc2UueSk7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBwYWlyc0xlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBwYWlyID0gcGFpcnNbaV07XG5cbiAgICAgICAgICAgIGlmICghcGFpci5pc0FjdGl2ZSB8fCBwYWlyLmlzU2Vuc29yKVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBjb2xsaXNpb24gPSBwYWlyLmNvbGxpc2lvbjtcbiAgICAgICAgICAgIGJvZHlBID0gY29sbGlzaW9uLnBhcmVudEE7XG4gICAgICAgICAgICBib2R5QiA9IGNvbGxpc2lvbi5wYXJlbnRCO1xuICAgICAgICAgICAgbm9ybWFsID0gY29sbGlzaW9uLm5vcm1hbDtcbiAgICAgICAgICAgIHBvc2l0aW9uSW1wdWxzZSA9IChwYWlyLnNlcGFyYXRpb24gLSBwYWlyLnNsb3ApICogdGltZVNjYWxlO1xuXG4gICAgICAgICAgICBpZiAoYm9keUEuaXNTdGF0aWMgfHwgYm9keUIuaXNTdGF0aWMpXG4gICAgICAgICAgICAgICAgcG9zaXRpb25JbXB1bHNlICo9IDI7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmICghKGJvZHlBLmlzU3RhdGljIHx8IGJvZHlBLmlzU2xlZXBpbmcpKSB7XG4gICAgICAgICAgICAgICAgY29udGFjdFNoYXJlID0gcG9zaXRpb25EYW1wZW4gLyBib2R5QS50b3RhbENvbnRhY3RzO1xuICAgICAgICAgICAgICAgIGJvZHlBLnBvc2l0aW9uSW1wdWxzZS54ICs9IG5vcm1hbC54ICogcG9zaXRpb25JbXB1bHNlICogY29udGFjdFNoYXJlO1xuICAgICAgICAgICAgICAgIGJvZHlBLnBvc2l0aW9uSW1wdWxzZS55ICs9IG5vcm1hbC55ICogcG9zaXRpb25JbXB1bHNlICogY29udGFjdFNoYXJlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIShib2R5Qi5pc1N0YXRpYyB8fCBib2R5Qi5pc1NsZWVwaW5nKSkge1xuICAgICAgICAgICAgICAgIGNvbnRhY3RTaGFyZSA9IHBvc2l0aW9uRGFtcGVuIC8gYm9keUIudG90YWxDb250YWN0cztcbiAgICAgICAgICAgICAgICBib2R5Qi5wb3NpdGlvbkltcHVsc2UueCAtPSBub3JtYWwueCAqIHBvc2l0aW9uSW1wdWxzZSAqIGNvbnRhY3RTaGFyZTtcbiAgICAgICAgICAgICAgICBib2R5Qi5wb3NpdGlvbkltcHVsc2UueSAtPSBub3JtYWwueSAqIHBvc2l0aW9uSW1wdWxzZSAqIGNvbnRhY3RTaGFyZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBBcHBseSBwb3NpdGlvbiByZXNvbHV0aW9uLlxuICAgICAqIEBtZXRob2QgcG9zdFNvbHZlUG9zaXRpb25cbiAgICAgKiBAcGFyYW0ge2JvZHlbXX0gYm9kaWVzXG4gICAgICovXG4gICAgUmVzb2x2ZXIucG9zdFNvbHZlUG9zaXRpb24gPSBmdW5jdGlvbihib2RpZXMpIHtcbiAgICAgICAgdmFyIHBvc2l0aW9uV2FybWluZyA9IFJlc29sdmVyLl9wb3NpdGlvbldhcm1pbmcsXG4gICAgICAgICAgICBib2RpZXNMZW5ndGggPSBib2RpZXMubGVuZ3RoLFxuICAgICAgICAgICAgdmVydGljZXNUcmFuc2xhdGUgPSBWZXJ0aWNlcy50cmFuc2xhdGUsXG4gICAgICAgICAgICBib3VuZHNVcGRhdGUgPSBCb3VuZHMudXBkYXRlO1xuXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYm9kaWVzTGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBib2R5ID0gYm9kaWVzW2ldLFxuICAgICAgICAgICAgICAgIHBvc2l0aW9uSW1wdWxzZSA9IGJvZHkucG9zaXRpb25JbXB1bHNlLFxuICAgICAgICAgICAgICAgIHBvc2l0aW9uSW1wdWxzZVggPSBwb3NpdGlvbkltcHVsc2UueCxcbiAgICAgICAgICAgICAgICBwb3NpdGlvbkltcHVsc2VZID0gcG9zaXRpb25JbXB1bHNlLnksXG4gICAgICAgICAgICAgICAgdmVsb2NpdHkgPSBib2R5LnZlbG9jaXR5O1xuXG4gICAgICAgICAgICAvLyByZXNldCBjb250YWN0IGNvdW50XG4gICAgICAgICAgICBib2R5LnRvdGFsQ29udGFjdHMgPSAwO1xuXG4gICAgICAgICAgICBpZiAocG9zaXRpb25JbXB1bHNlWCAhPT0gMCB8fCBwb3NpdGlvbkltcHVsc2VZICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgLy8gdXBkYXRlIGJvZHkgZ2VvbWV0cnlcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGJvZHkucGFydHMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHBhcnQgPSBib2R5LnBhcnRzW2pdO1xuICAgICAgICAgICAgICAgICAgICB2ZXJ0aWNlc1RyYW5zbGF0ZShwYXJ0LnZlcnRpY2VzLCBwb3NpdGlvbkltcHVsc2UpO1xuICAgICAgICAgICAgICAgICAgICBib3VuZHNVcGRhdGUocGFydC5ib3VuZHMsIHBhcnQudmVydGljZXMsIHZlbG9jaXR5KTtcbiAgICAgICAgICAgICAgICAgICAgcGFydC5wb3NpdGlvbi54ICs9IHBvc2l0aW9uSW1wdWxzZVg7XG4gICAgICAgICAgICAgICAgICAgIHBhcnQucG9zaXRpb24ueSArPSBwb3NpdGlvbkltcHVsc2VZO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIG1vdmUgdGhlIGJvZHkgd2l0aG91dCBjaGFuZ2luZyB2ZWxvY2l0eVxuICAgICAgICAgICAgICAgIGJvZHkucG9zaXRpb25QcmV2LnggKz0gcG9zaXRpb25JbXB1bHNlWDtcbiAgICAgICAgICAgICAgICBib2R5LnBvc2l0aW9uUHJldi55ICs9IHBvc2l0aW9uSW1wdWxzZVk7XG5cbiAgICAgICAgICAgICAgICBpZiAocG9zaXRpb25JbXB1bHNlWCAqIHZlbG9jaXR5LnggKyBwb3NpdGlvbkltcHVsc2VZICogdmVsb2NpdHkueSA8IDApIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gcmVzZXQgY2FjaGVkIGltcHVsc2UgaWYgdGhlIGJvZHkgaGFzIHZlbG9jaXR5IGFsb25nIGl0XG4gICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uSW1wdWxzZS54ID0gMDtcbiAgICAgICAgICAgICAgICAgICAgcG9zaXRpb25JbXB1bHNlLnkgPSAwO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHdhcm0gdGhlIG5leHQgaXRlcmF0aW9uXG4gICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uSW1wdWxzZS54ICo9IHBvc2l0aW9uV2FybWluZztcbiAgICAgICAgICAgICAgICAgICAgcG9zaXRpb25JbXB1bHNlLnkgKj0gcG9zaXRpb25XYXJtaW5nO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBQcmVwYXJlIHBhaXJzIGZvciB2ZWxvY2l0eSBzb2x2aW5nLlxuICAgICAqIEBtZXRob2QgcHJlU29sdmVWZWxvY2l0eVxuICAgICAqIEBwYXJhbSB7cGFpcltdfSBwYWlyc1xuICAgICAqL1xuICAgIFJlc29sdmVyLnByZVNvbHZlVmVsb2NpdHkgPSBmdW5jdGlvbihwYWlycykge1xuICAgICAgICB2YXIgcGFpcnNMZW5ndGggPSBwYWlycy5sZW5ndGgsXG4gICAgICAgICAgICBpLFxuICAgICAgICAgICAgajtcbiAgICAgICAgXG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBwYWlyc0xlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgcGFpciA9IHBhaXJzW2ldO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBpZiAoIXBhaXIuaXNBY3RpdmUgfHwgcGFpci5pc1NlbnNvcilcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgdmFyIGNvbnRhY3RzID0gcGFpci5hY3RpdmVDb250YWN0cyxcbiAgICAgICAgICAgICAgICBjb250YWN0c0xlbmd0aCA9IGNvbnRhY3RzLmxlbmd0aCxcbiAgICAgICAgICAgICAgICBjb2xsaXNpb24gPSBwYWlyLmNvbGxpc2lvbixcbiAgICAgICAgICAgICAgICBib2R5QSA9IGNvbGxpc2lvbi5wYXJlbnRBLFxuICAgICAgICAgICAgICAgIGJvZHlCID0gY29sbGlzaW9uLnBhcmVudEIsXG4gICAgICAgICAgICAgICAgbm9ybWFsID0gY29sbGlzaW9uLm5vcm1hbCxcbiAgICAgICAgICAgICAgICB0YW5nZW50ID0gY29sbGlzaW9uLnRhbmdlbnQ7XG4gICAgXG4gICAgICAgICAgICAvLyByZXNvbHZlIGVhY2ggY29udGFjdFxuICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGNvbnRhY3RzTGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICB2YXIgY29udGFjdCA9IGNvbnRhY3RzW2pdLFxuICAgICAgICAgICAgICAgICAgICBjb250YWN0VmVydGV4ID0gY29udGFjdC52ZXJ0ZXgsXG4gICAgICAgICAgICAgICAgICAgIG5vcm1hbEltcHVsc2UgPSBjb250YWN0Lm5vcm1hbEltcHVsc2UsXG4gICAgICAgICAgICAgICAgICAgIHRhbmdlbnRJbXB1bHNlID0gY29udGFjdC50YW5nZW50SW1wdWxzZTtcbiAgICBcbiAgICAgICAgICAgICAgICBpZiAobm9ybWFsSW1wdWxzZSAhPT0gMCB8fCB0YW5nZW50SW1wdWxzZSAhPT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAvLyB0b3RhbCBpbXB1bHNlIGZyb20gY29udGFjdFxuICAgICAgICAgICAgICAgICAgICB2YXIgaW1wdWxzZVggPSBub3JtYWwueCAqIG5vcm1hbEltcHVsc2UgKyB0YW5nZW50LnggKiB0YW5nZW50SW1wdWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGltcHVsc2VZID0gbm9ybWFsLnkgKiBub3JtYWxJbXB1bHNlICsgdGFuZ2VudC55ICogdGFuZ2VudEltcHVsc2U7XG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAvLyBhcHBseSBpbXB1bHNlIGZyb20gY29udGFjdFxuICAgICAgICAgICAgICAgICAgICBpZiAoIShib2R5QS5pc1N0YXRpYyB8fCBib2R5QS5pc1NsZWVwaW5nKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYm9keUEucG9zaXRpb25QcmV2LnggKz0gaW1wdWxzZVggKiBib2R5QS5pbnZlcnNlTWFzcztcbiAgICAgICAgICAgICAgICAgICAgICAgIGJvZHlBLnBvc2l0aW9uUHJldi55ICs9IGltcHVsc2VZICogYm9keUEuaW52ZXJzZU1hc3M7XG4gICAgICAgICAgICAgICAgICAgICAgICBib2R5QS5hbmdsZVByZXYgKz0gYm9keUEuaW52ZXJzZUluZXJ0aWEgKiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnRhY3RWZXJ0ZXgueCAtIGJvZHlBLnBvc2l0aW9uLngpICogaW1wdWxzZVlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIChjb250YWN0VmVydGV4LnkgLSBib2R5QS5wb3NpdGlvbi55KSAqIGltcHVsc2VYXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgXG4gICAgICAgICAgICAgICAgICAgIGlmICghKGJvZHlCLmlzU3RhdGljIHx8IGJvZHlCLmlzU2xlZXBpbmcpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBib2R5Qi5wb3NpdGlvblByZXYueCAtPSBpbXB1bHNlWCAqIGJvZHlCLmludmVyc2VNYXNzO1xuICAgICAgICAgICAgICAgICAgICAgICAgYm9keUIucG9zaXRpb25QcmV2LnkgLT0gaW1wdWxzZVkgKiBib2R5Qi5pbnZlcnNlTWFzcztcbiAgICAgICAgICAgICAgICAgICAgICAgIGJvZHlCLmFuZ2xlUHJldiAtPSBib2R5Qi5pbnZlcnNlSW5lcnRpYSAqIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29udGFjdFZlcnRleC54IC0gYm9keUIucG9zaXRpb24ueCkgKiBpbXB1bHNlWSBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIChjb250YWN0VmVydGV4LnkgLSBib2R5Qi5wb3NpdGlvbi55KSAqIGltcHVsc2VYXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEZpbmQgYSBzb2x1dGlvbiBmb3IgcGFpciB2ZWxvY2l0aWVzLlxuICAgICAqIEBtZXRob2Qgc29sdmVWZWxvY2l0eVxuICAgICAqIEBwYXJhbSB7cGFpcltdfSBwYWlyc1xuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB0aW1lU2NhbGVcbiAgICAgKi9cbiAgICBSZXNvbHZlci5zb2x2ZVZlbG9jaXR5ID0gZnVuY3Rpb24ocGFpcnMsIHRpbWVTY2FsZSkge1xuICAgICAgICB2YXIgdGltZVNjYWxlU3F1YXJlZCA9IHRpbWVTY2FsZSAqIHRpbWVTY2FsZSxcbiAgICAgICAgICAgIHJlc3RpbmdUaHJlc2ggPSBSZXNvbHZlci5fcmVzdGluZ1RocmVzaCAqIHRpbWVTY2FsZVNxdWFyZWQsXG4gICAgICAgICAgICBmcmljdGlvbk5vcm1hbE11bHRpcGxpZXIgPSBSZXNvbHZlci5fZnJpY3Rpb25Ob3JtYWxNdWx0aXBsaWVyLFxuICAgICAgICAgICAgcmVzdGluZ1RocmVzaFRhbmdlbnQgPSBSZXNvbHZlci5fcmVzdGluZ1RocmVzaFRhbmdlbnQgKiB0aW1lU2NhbGVTcXVhcmVkLFxuICAgICAgICAgICAgTnVtYmVyTWF4VmFsdWUgPSBOdW1iZXIuTUFYX1ZBTFVFLFxuICAgICAgICAgICAgcGFpcnNMZW5ndGggPSBwYWlycy5sZW5ndGgsXG4gICAgICAgICAgICB0YW5nZW50SW1wdWxzZSxcbiAgICAgICAgICAgIG1heEZyaWN0aW9uLFxuICAgICAgICAgICAgaSxcbiAgICAgICAgICAgIGo7XG5cbiAgICAgICAgZm9yIChpID0gMDsgaSA8IHBhaXJzTGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBwYWlyID0gcGFpcnNbaV07XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmICghcGFpci5pc0FjdGl2ZSB8fCBwYWlyLmlzU2Vuc29yKVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICB2YXIgY29sbGlzaW9uID0gcGFpci5jb2xsaXNpb24sXG4gICAgICAgICAgICAgICAgYm9keUEgPSBjb2xsaXNpb24ucGFyZW50QSxcbiAgICAgICAgICAgICAgICBib2R5QiA9IGNvbGxpc2lvbi5wYXJlbnRCLFxuICAgICAgICAgICAgICAgIGJvZHlBVmVsb2NpdHkgPSBib2R5QS52ZWxvY2l0eSxcbiAgICAgICAgICAgICAgICBib2R5QlZlbG9jaXR5ID0gYm9keUIudmVsb2NpdHksXG4gICAgICAgICAgICAgICAgbm9ybWFsWCA9IGNvbGxpc2lvbi5ub3JtYWwueCxcbiAgICAgICAgICAgICAgICBub3JtYWxZID0gY29sbGlzaW9uLm5vcm1hbC55LFxuICAgICAgICAgICAgICAgIHRhbmdlbnRYID0gY29sbGlzaW9uLnRhbmdlbnQueCxcbiAgICAgICAgICAgICAgICB0YW5nZW50WSA9IGNvbGxpc2lvbi50YW5nZW50LnksXG4gICAgICAgICAgICAgICAgY29udGFjdHMgPSBwYWlyLmFjdGl2ZUNvbnRhY3RzLFxuICAgICAgICAgICAgICAgIGNvbnRhY3RzTGVuZ3RoID0gY29udGFjdHMubGVuZ3RoLFxuICAgICAgICAgICAgICAgIGNvbnRhY3RTaGFyZSA9IDEgLyBjb250YWN0c0xlbmd0aCxcbiAgICAgICAgICAgICAgICBpbnZlcnNlTWFzc1RvdGFsID0gYm9keUEuaW52ZXJzZU1hc3MgKyBib2R5Qi5pbnZlcnNlTWFzcyxcbiAgICAgICAgICAgICAgICBmcmljdGlvbiA9IHBhaXIuZnJpY3Rpb24gKiBwYWlyLmZyaWN0aW9uU3RhdGljICogZnJpY3Rpb25Ob3JtYWxNdWx0aXBsaWVyICogdGltZVNjYWxlU3F1YXJlZDtcblxuICAgICAgICAgICAgLy8gdXBkYXRlIGJvZHkgdmVsb2NpdGllc1xuICAgICAgICAgICAgYm9keUFWZWxvY2l0eS54ID0gYm9keUEucG9zaXRpb24ueCAtIGJvZHlBLnBvc2l0aW9uUHJldi54O1xuICAgICAgICAgICAgYm9keUFWZWxvY2l0eS55ID0gYm9keUEucG9zaXRpb24ueSAtIGJvZHlBLnBvc2l0aW9uUHJldi55O1xuICAgICAgICAgICAgYm9keUJWZWxvY2l0eS54ID0gYm9keUIucG9zaXRpb24ueCAtIGJvZHlCLnBvc2l0aW9uUHJldi54O1xuICAgICAgICAgICAgYm9keUJWZWxvY2l0eS55ID0gYm9keUIucG9zaXRpb24ueSAtIGJvZHlCLnBvc2l0aW9uUHJldi55O1xuICAgICAgICAgICAgYm9keUEuYW5ndWxhclZlbG9jaXR5ID0gYm9keUEuYW5nbGUgLSBib2R5QS5hbmdsZVByZXY7XG4gICAgICAgICAgICBib2R5Qi5hbmd1bGFyVmVsb2NpdHkgPSBib2R5Qi5hbmdsZSAtIGJvZHlCLmFuZ2xlUHJldjtcblxuICAgICAgICAgICAgLy8gcmVzb2x2ZSBlYWNoIGNvbnRhY3RcbiAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBjb250YWN0c0xlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgdmFyIGNvbnRhY3QgPSBjb250YWN0c1tqXSxcbiAgICAgICAgICAgICAgICAgICAgY29udGFjdFZlcnRleCA9IGNvbnRhY3QudmVydGV4O1xuXG4gICAgICAgICAgICAgICAgdmFyIG9mZnNldEFYID0gY29udGFjdFZlcnRleC54IC0gYm9keUEucG9zaXRpb24ueCxcbiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0QVkgPSBjb250YWN0VmVydGV4LnkgLSBib2R5QS5wb3NpdGlvbi55LFxuICAgICAgICAgICAgICAgICAgICBvZmZzZXRCWCA9IGNvbnRhY3RWZXJ0ZXgueCAtIGJvZHlCLnBvc2l0aW9uLngsXG4gICAgICAgICAgICAgICAgICAgIG9mZnNldEJZID0gY29udGFjdFZlcnRleC55IC0gYm9keUIucG9zaXRpb24ueTtcbiBcbiAgICAgICAgICAgICAgICB2YXIgdmVsb2NpdHlQb2ludEFYID0gYm9keUFWZWxvY2l0eS54IC0gb2Zmc2V0QVkgKiBib2R5QS5hbmd1bGFyVmVsb2NpdHksXG4gICAgICAgICAgICAgICAgICAgIHZlbG9jaXR5UG9pbnRBWSA9IGJvZHlBVmVsb2NpdHkueSArIG9mZnNldEFYICogYm9keUEuYW5ndWxhclZlbG9jaXR5LFxuICAgICAgICAgICAgICAgICAgICB2ZWxvY2l0eVBvaW50QlggPSBib2R5QlZlbG9jaXR5LnggLSBvZmZzZXRCWSAqIGJvZHlCLmFuZ3VsYXJWZWxvY2l0eSxcbiAgICAgICAgICAgICAgICAgICAgdmVsb2NpdHlQb2ludEJZID0gYm9keUJWZWxvY2l0eS55ICsgb2Zmc2V0QlggKiBib2R5Qi5hbmd1bGFyVmVsb2NpdHk7XG5cbiAgICAgICAgICAgICAgICB2YXIgcmVsYXRpdmVWZWxvY2l0eVggPSB2ZWxvY2l0eVBvaW50QVggLSB2ZWxvY2l0eVBvaW50QlgsXG4gICAgICAgICAgICAgICAgICAgIHJlbGF0aXZlVmVsb2NpdHlZID0gdmVsb2NpdHlQb2ludEFZIC0gdmVsb2NpdHlQb2ludEJZO1xuXG4gICAgICAgICAgICAgICAgdmFyIG5vcm1hbFZlbG9jaXR5ID0gbm9ybWFsWCAqIHJlbGF0aXZlVmVsb2NpdHlYICsgbm9ybWFsWSAqIHJlbGF0aXZlVmVsb2NpdHlZLFxuICAgICAgICAgICAgICAgICAgICB0YW5nZW50VmVsb2NpdHkgPSB0YW5nZW50WCAqIHJlbGF0aXZlVmVsb2NpdHlYICsgdGFuZ2VudFkgKiByZWxhdGl2ZVZlbG9jaXR5WTtcblxuICAgICAgICAgICAgICAgIC8vIGNvdWxvbWIgZnJpY3Rpb25cbiAgICAgICAgICAgICAgICB2YXIgbm9ybWFsT3ZlcmxhcCA9IHBhaXIuc2VwYXJhdGlvbiArIG5vcm1hbFZlbG9jaXR5O1xuICAgICAgICAgICAgICAgIHZhciBub3JtYWxGb3JjZSA9IE1hdGgubWluKG5vcm1hbE92ZXJsYXAsIDEpO1xuICAgICAgICAgICAgICAgIG5vcm1hbEZvcmNlID0gbm9ybWFsT3ZlcmxhcCA8IDAgPyAwIDogbm9ybWFsRm9yY2U7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgdmFyIGZyaWN0aW9uTGltaXQgPSBub3JtYWxGb3JjZSAqIGZyaWN0aW9uO1xuXG4gICAgICAgICAgICAgICAgaWYgKHRhbmdlbnRWZWxvY2l0eSA+IGZyaWN0aW9uTGltaXQgfHwgLXRhbmdlbnRWZWxvY2l0eSA+IGZyaWN0aW9uTGltaXQpIHtcbiAgICAgICAgICAgICAgICAgICAgbWF4RnJpY3Rpb24gPSB0YW5nZW50VmVsb2NpdHkgPiAwID8gdGFuZ2VudFZlbG9jaXR5IDogLXRhbmdlbnRWZWxvY2l0eTtcbiAgICAgICAgICAgICAgICAgICAgdGFuZ2VudEltcHVsc2UgPSBwYWlyLmZyaWN0aW9uICogKHRhbmdlbnRWZWxvY2l0eSA+IDAgPyAxIDogLTEpICogdGltZVNjYWxlU3F1YXJlZDtcbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIGlmICh0YW5nZW50SW1wdWxzZSA8IC1tYXhGcmljdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGFuZ2VudEltcHVsc2UgPSAtbWF4RnJpY3Rpb247XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGFuZ2VudEltcHVsc2UgPiBtYXhGcmljdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGFuZ2VudEltcHVsc2UgPSBtYXhGcmljdGlvbjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRhbmdlbnRJbXB1bHNlID0gdGFuZ2VudFZlbG9jaXR5O1xuICAgICAgICAgICAgICAgICAgICBtYXhGcmljdGlvbiA9IE51bWJlck1heFZhbHVlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIGFjY291bnQgZm9yIG1hc3MsIGluZXJ0aWEgYW5kIGNvbnRhY3Qgb2Zmc2V0XG4gICAgICAgICAgICAgICAgdmFyIG9BY04gPSBvZmZzZXRBWCAqIG5vcm1hbFkgLSBvZmZzZXRBWSAqIG5vcm1hbFgsXG4gICAgICAgICAgICAgICAgICAgIG9CY04gPSBvZmZzZXRCWCAqIG5vcm1hbFkgLSBvZmZzZXRCWSAqIG5vcm1hbFgsXG4gICAgICAgICAgICAgICAgICAgIHNoYXJlID0gY29udGFjdFNoYXJlIC8gKGludmVyc2VNYXNzVG90YWwgKyBib2R5QS5pbnZlcnNlSW5lcnRpYSAqIG9BY04gKiBvQWNOICsgYm9keUIuaW52ZXJzZUluZXJ0aWEgKiBvQmNOICogb0JjTik7XG5cbiAgICAgICAgICAgICAgICAvLyByYXcgaW1wdWxzZXNcbiAgICAgICAgICAgICAgICB2YXIgbm9ybWFsSW1wdWxzZSA9ICgxICsgcGFpci5yZXN0aXR1dGlvbikgKiBub3JtYWxWZWxvY2l0eSAqIHNoYXJlO1xuICAgICAgICAgICAgICAgIHRhbmdlbnRJbXB1bHNlICo9IHNoYXJlO1xuXG4gICAgICAgICAgICAgICAgLy8gaGFuZGxlIGhpZ2ggdmVsb2NpdHkgYW5kIHJlc3RpbmcgY29sbGlzaW9ucyBzZXBhcmF0ZWx5XG4gICAgICAgICAgICAgICAgaWYgKG5vcm1hbFZlbG9jaXR5ICogbm9ybWFsVmVsb2NpdHkgPiByZXN0aW5nVGhyZXNoICYmIG5vcm1hbFZlbG9jaXR5IDwgMCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBoaWdoIG5vcm1hbCB2ZWxvY2l0eSBzbyBjbGVhciBjYWNoZWQgY29udGFjdCBub3JtYWwgaW1wdWxzZVxuICAgICAgICAgICAgICAgICAgICBjb250YWN0Lm5vcm1hbEltcHVsc2UgPSAwO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHNvbHZlIHJlc3RpbmcgY29sbGlzaW9uIGNvbnN0cmFpbnRzIHVzaW5nIEVyaW4gQ2F0dG8ncyBtZXRob2QgKEdEQzA4KVxuICAgICAgICAgICAgICAgICAgICAvLyBpbXB1bHNlIGNvbnN0cmFpbnQgdGVuZHMgdG8gMFxuICAgICAgICAgICAgICAgICAgICB2YXIgY29udGFjdE5vcm1hbEltcHVsc2UgPSBjb250YWN0Lm5vcm1hbEltcHVsc2U7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRhY3Qubm9ybWFsSW1wdWxzZSArPSBub3JtYWxJbXB1bHNlO1xuICAgICAgICAgICAgICAgICAgICBjb250YWN0Lm5vcm1hbEltcHVsc2UgPSBNYXRoLm1pbihjb250YWN0Lm5vcm1hbEltcHVsc2UsIDApO1xuICAgICAgICAgICAgICAgICAgICBub3JtYWxJbXB1bHNlID0gY29udGFjdC5ub3JtYWxJbXB1bHNlIC0gY29udGFjdE5vcm1hbEltcHVsc2U7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gaGFuZGxlIGhpZ2ggdmVsb2NpdHkgYW5kIHJlc3RpbmcgY29sbGlzaW9ucyBzZXBhcmF0ZWx5XG4gICAgICAgICAgICAgICAgaWYgKHRhbmdlbnRWZWxvY2l0eSAqIHRhbmdlbnRWZWxvY2l0eSA+IHJlc3RpbmdUaHJlc2hUYW5nZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGhpZ2ggdGFuZ2VudCB2ZWxvY2l0eSBzbyBjbGVhciBjYWNoZWQgY29udGFjdCB0YW5nZW50IGltcHVsc2VcbiAgICAgICAgICAgICAgICAgICAgY29udGFjdC50YW5nZW50SW1wdWxzZSA9IDA7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gc29sdmUgcmVzdGluZyBjb2xsaXNpb24gY29uc3RyYWludHMgdXNpbmcgRXJpbiBDYXR0bydzIG1ldGhvZCAoR0RDMDgpXG4gICAgICAgICAgICAgICAgICAgIC8vIHRhbmdlbnQgaW1wdWxzZSB0ZW5kcyB0byAtdGFuZ2VudFNwZWVkIG9yICt0YW5nZW50U3BlZWRcbiAgICAgICAgICAgICAgICAgICAgdmFyIGNvbnRhY3RUYW5nZW50SW1wdWxzZSA9IGNvbnRhY3QudGFuZ2VudEltcHVsc2U7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRhY3QudGFuZ2VudEltcHVsc2UgKz0gdGFuZ2VudEltcHVsc2U7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb250YWN0LnRhbmdlbnRJbXB1bHNlIDwgLW1heEZyaWN0aW9uKSBjb250YWN0LnRhbmdlbnRJbXB1bHNlID0gLW1heEZyaWN0aW9uO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY29udGFjdC50YW5nZW50SW1wdWxzZSA+IG1heEZyaWN0aW9uKSBjb250YWN0LnRhbmdlbnRJbXB1bHNlID0gbWF4RnJpY3Rpb247XG4gICAgICAgICAgICAgICAgICAgIHRhbmdlbnRJbXB1bHNlID0gY29udGFjdC50YW5nZW50SW1wdWxzZSAtIGNvbnRhY3RUYW5nZW50SW1wdWxzZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyB0b3RhbCBpbXB1bHNlIGZyb20gY29udGFjdFxuICAgICAgICAgICAgICAgIHZhciBpbXB1bHNlWCA9IG5vcm1hbFggKiBub3JtYWxJbXB1bHNlICsgdGFuZ2VudFggKiB0YW5nZW50SW1wdWxzZSxcbiAgICAgICAgICAgICAgICAgICAgaW1wdWxzZVkgPSBub3JtYWxZICogbm9ybWFsSW1wdWxzZSArIHRhbmdlbnRZICogdGFuZ2VudEltcHVsc2U7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gYXBwbHkgaW1wdWxzZSBmcm9tIGNvbnRhY3RcbiAgICAgICAgICAgICAgICBpZiAoIShib2R5QS5pc1N0YXRpYyB8fCBib2R5QS5pc1NsZWVwaW5nKSkge1xuICAgICAgICAgICAgICAgICAgICBib2R5QS5wb3NpdGlvblByZXYueCArPSBpbXB1bHNlWCAqIGJvZHlBLmludmVyc2VNYXNzO1xuICAgICAgICAgICAgICAgICAgICBib2R5QS5wb3NpdGlvblByZXYueSArPSBpbXB1bHNlWSAqIGJvZHlBLmludmVyc2VNYXNzO1xuICAgICAgICAgICAgICAgICAgICBib2R5QS5hbmdsZVByZXYgKz0gKG9mZnNldEFYICogaW1wdWxzZVkgLSBvZmZzZXRBWSAqIGltcHVsc2VYKSAqIGJvZHlBLmludmVyc2VJbmVydGlhO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICghKGJvZHlCLmlzU3RhdGljIHx8IGJvZHlCLmlzU2xlZXBpbmcpKSB7XG4gICAgICAgICAgICAgICAgICAgIGJvZHlCLnBvc2l0aW9uUHJldi54IC09IGltcHVsc2VYICogYm9keUIuaW52ZXJzZU1hc3M7XG4gICAgICAgICAgICAgICAgICAgIGJvZHlCLnBvc2l0aW9uUHJldi55IC09IGltcHVsc2VZICogYm9keUIuaW52ZXJzZU1hc3M7XG4gICAgICAgICAgICAgICAgICAgIGJvZHlCLmFuZ2xlUHJldiAtPSAob2Zmc2V0QlggKiBpbXB1bHNlWSAtIG9mZnNldEJZICogaW1wdWxzZVgpICogYm9keUIuaW52ZXJzZUluZXJ0aWE7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcblxufSkoKTtcblxuXG4vKioqLyB9KSxcbi8qIDIwICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cbi8qKlxuKiBUaGUgYE1hdHRlci5QYWlyc2AgbW9kdWxlIGNvbnRhaW5zIG1ldGhvZHMgZm9yIGNyZWF0aW5nIGFuZCBtYW5pcHVsYXRpbmcgY29sbGlzaW9uIHBhaXIgc2V0cy5cbipcbiogQGNsYXNzIFBhaXJzXG4qL1xuXG52YXIgUGFpcnMgPSB7fTtcblxubW9kdWxlLmV4cG9ydHMgPSBQYWlycztcblxudmFyIFBhaXIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDkpO1xudmFyIENvbW1vbiA9IF9fd2VicGFja19yZXF1aXJlX18oMCk7XG5cbihmdW5jdGlvbigpIHtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgcGFpcnMgc3RydWN0dXJlLlxuICAgICAqIEBtZXRob2QgY3JlYXRlXG4gICAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnNcbiAgICAgKiBAcmV0dXJuIHtwYWlyc30gQSBuZXcgcGFpcnMgc3RydWN0dXJlXG4gICAgICovXG4gICAgUGFpcnMuY3JlYXRlID0gZnVuY3Rpb24ob3B0aW9ucykge1xuICAgICAgICByZXR1cm4gQ29tbW9uLmV4dGVuZCh7IFxuICAgICAgICAgICAgdGFibGU6IHt9LFxuICAgICAgICAgICAgbGlzdDogW10sXG4gICAgICAgICAgICBjb2xsaXNpb25TdGFydDogW10sXG4gICAgICAgICAgICBjb2xsaXNpb25BY3RpdmU6IFtdLFxuICAgICAgICAgICAgY29sbGlzaW9uRW5kOiBbXVxuICAgICAgICB9LCBvcHRpb25zKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogVXBkYXRlcyBwYWlycyBnaXZlbiBhIGxpc3Qgb2YgY29sbGlzaW9ucy5cbiAgICAgKiBAbWV0aG9kIHVwZGF0ZVxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBwYWlyc1xuICAgICAqIEBwYXJhbSB7Y29sbGlzaW9uW119IGNvbGxpc2lvbnNcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gdGltZXN0YW1wXG4gICAgICovXG4gICAgUGFpcnMudXBkYXRlID0gZnVuY3Rpb24ocGFpcnMsIGNvbGxpc2lvbnMsIHRpbWVzdGFtcCkge1xuICAgICAgICB2YXIgcGFpcnNMaXN0ID0gcGFpcnMubGlzdCxcbiAgICAgICAgICAgIHBhaXJzTGlzdExlbmd0aCA9IHBhaXJzTGlzdC5sZW5ndGgsXG4gICAgICAgICAgICBwYWlyc1RhYmxlID0gcGFpcnMudGFibGUsXG4gICAgICAgICAgICBjb2xsaXNpb25zTGVuZ3RoID0gY29sbGlzaW9ucy5sZW5ndGgsXG4gICAgICAgICAgICBjb2xsaXNpb25TdGFydCA9IHBhaXJzLmNvbGxpc2lvblN0YXJ0LFxuICAgICAgICAgICAgY29sbGlzaW9uRW5kID0gcGFpcnMuY29sbGlzaW9uRW5kLFxuICAgICAgICAgICAgY29sbGlzaW9uQWN0aXZlID0gcGFpcnMuY29sbGlzaW9uQWN0aXZlLFxuICAgICAgICAgICAgY29sbGlzaW9uLFxuICAgICAgICAgICAgcGFpckluZGV4LFxuICAgICAgICAgICAgcGFpcixcbiAgICAgICAgICAgIGk7XG5cbiAgICAgICAgLy8gY2xlYXIgY29sbGlzaW9uIHN0YXRlIGFycmF5cywgYnV0IG1haW50YWluIG9sZCByZWZlcmVuY2VcbiAgICAgICAgY29sbGlzaW9uU3RhcnQubGVuZ3RoID0gMDtcbiAgICAgICAgY29sbGlzaW9uRW5kLmxlbmd0aCA9IDA7XG4gICAgICAgIGNvbGxpc2lvbkFjdGl2ZS5sZW5ndGggPSAwO1xuXG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBwYWlyc0xpc3RMZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgcGFpcnNMaXN0W2ldLmNvbmZpcm1lZEFjdGl2ZSA9IGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGNvbGxpc2lvbnNMZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29sbGlzaW9uID0gY29sbGlzaW9uc1tpXTtcbiAgICAgICAgICAgIHBhaXIgPSBjb2xsaXNpb24ucGFpcjtcblxuICAgICAgICAgICAgaWYgKHBhaXIpIHtcbiAgICAgICAgICAgICAgICAvLyBwYWlyIGFscmVhZHkgZXhpc3RzIChidXQgbWF5IG9yIG1heSBub3QgYmUgYWN0aXZlKVxuICAgICAgICAgICAgICAgIGlmIChwYWlyLmlzQWN0aXZlKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHBhaXIgZXhpc3RzIGFuZCBpcyBhY3RpdmVcbiAgICAgICAgICAgICAgICAgICAgY29sbGlzaW9uQWN0aXZlLnB1c2gocGFpcik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gcGFpciBleGlzdHMgYnV0IHdhcyBpbmFjdGl2ZSwgc28gYSBjb2xsaXNpb24gaGFzIGp1c3Qgc3RhcnRlZCBhZ2FpblxuICAgICAgICAgICAgICAgICAgICBjb2xsaXNpb25TdGFydC5wdXNoKHBhaXIpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgcGFpclxuICAgICAgICAgICAgICAgIFBhaXIudXBkYXRlKHBhaXIsIGNvbGxpc2lvbiwgdGltZXN0YW1wKTtcbiAgICAgICAgICAgICAgICBwYWlyLmNvbmZpcm1lZEFjdGl2ZSA9IHRydWU7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIHBhaXIgZGlkIG5vdCBleGlzdCwgY3JlYXRlIGEgbmV3IHBhaXJcbiAgICAgICAgICAgICAgICBwYWlyID0gUGFpci5jcmVhdGUoY29sbGlzaW9uLCB0aW1lc3RhbXApO1xuICAgICAgICAgICAgICAgIHBhaXJzVGFibGVbcGFpci5pZF0gPSBwYWlyO1xuXG4gICAgICAgICAgICAgICAgLy8gcHVzaCB0aGUgbmV3IHBhaXJcbiAgICAgICAgICAgICAgICBjb2xsaXNpb25TdGFydC5wdXNoKHBhaXIpO1xuICAgICAgICAgICAgICAgIHBhaXJzTGlzdC5wdXNoKHBhaXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gZmluZCBwYWlycyB0aGF0IGFyZSBubyBsb25nZXIgYWN0aXZlXG4gICAgICAgIHZhciByZW1vdmVQYWlySW5kZXggPSBbXTtcbiAgICAgICAgcGFpcnNMaXN0TGVuZ3RoID0gcGFpcnNMaXN0Lmxlbmd0aDtcblxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcGFpcnNMaXN0TGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHBhaXIgPSBwYWlyc0xpc3RbaV07XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmICghcGFpci5jb25maXJtZWRBY3RpdmUpIHtcbiAgICAgICAgICAgICAgICBQYWlyLnNldEFjdGl2ZShwYWlyLCBmYWxzZSwgdGltZXN0YW1wKTtcbiAgICAgICAgICAgICAgICBjb2xsaXNpb25FbmQucHVzaChwYWlyKTtcblxuICAgICAgICAgICAgICAgIGlmICghcGFpci5jb2xsaXNpb24uYm9keUEuaXNTbGVlcGluZyAmJiAhcGFpci5jb2xsaXNpb24uYm9keUIuaXNTbGVlcGluZykge1xuICAgICAgICAgICAgICAgICAgICByZW1vdmVQYWlySW5kZXgucHVzaChpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyByZW1vdmUgaW5hY3RpdmUgcGFpcnNcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IHJlbW92ZVBhaXJJbmRleC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgcGFpckluZGV4ID0gcmVtb3ZlUGFpckluZGV4W2ldIC0gaTtcbiAgICAgICAgICAgIHBhaXIgPSBwYWlyc0xpc3RbcGFpckluZGV4XTtcbiAgICAgICAgICAgIHBhaXJzTGlzdC5zcGxpY2UocGFpckluZGV4LCAxKTtcbiAgICAgICAgICAgIGRlbGV0ZSBwYWlyc1RhYmxlW3BhaXIuaWRdO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIENsZWFycyB0aGUgZ2l2ZW4gcGFpcnMgc3RydWN0dXJlLlxuICAgICAqIEBtZXRob2QgY2xlYXJcbiAgICAgKiBAcGFyYW0ge3BhaXJzfSBwYWlyc1xuICAgICAqIEByZXR1cm4ge3BhaXJzfSBwYWlyc1xuICAgICAqL1xuICAgIFBhaXJzLmNsZWFyID0gZnVuY3Rpb24ocGFpcnMpIHtcbiAgICAgICAgcGFpcnMudGFibGUgPSB7fTtcbiAgICAgICAgcGFpcnMubGlzdC5sZW5ndGggPSAwO1xuICAgICAgICBwYWlycy5jb2xsaXNpb25TdGFydC5sZW5ndGggPSAwO1xuICAgICAgICBwYWlycy5jb2xsaXNpb25BY3RpdmUubGVuZ3RoID0gMDtcbiAgICAgICAgcGFpcnMuY29sbGlzaW9uRW5kLmxlbmd0aCA9IDA7XG4gICAgICAgIHJldHVybiBwYWlycztcbiAgICB9O1xuXG59KSgpO1xuXG5cbi8qKiovIH0pLFxuLyogMjEgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxudmFyIE1hdHRlciA9IG1vZHVsZS5leHBvcnRzID0gX193ZWJwYWNrX3JlcXVpcmVfXygyMik7XHJcblxyXG5NYXR0ZXIuQXhlcyA9IF9fd2VicGFja19yZXF1aXJlX18oMTEpO1xyXG5NYXR0ZXIuQm9kaWVzID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMik7XHJcbk1hdHRlci5Cb2R5ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2KTtcclxuTWF0dGVyLkJvdW5kcyA9IF9fd2VicGFja19yZXF1aXJlX18oMSk7XHJcbk1hdHRlci5Db2xsaXNpb24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDgpO1xyXG5NYXR0ZXIuQ29tbW9uID0gX193ZWJwYWNrX3JlcXVpcmVfXygwKTtcclxuTWF0dGVyLkNvbXBvc2l0ZSA9IF9fd2VicGFja19yZXF1aXJlX18oNSk7XHJcbk1hdHRlci5Db21wb3NpdGVzID0gX193ZWJwYWNrX3JlcXVpcmVfXygyMyk7XHJcbk1hdHRlci5Db25zdHJhaW50ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMCk7XHJcbk1hdHRlci5Db250YWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNyk7XHJcbk1hdHRlci5EZXRlY3RvciA9IF9fd2VicGFja19yZXF1aXJlX18oMTQpO1xyXG5NYXR0ZXIuRW5naW5lID0gX193ZWJwYWNrX3JlcXVpcmVfXygxOCk7XHJcbk1hdHRlci5FdmVudHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQpO1xyXG5NYXR0ZXIuR3JpZCA9IF9fd2VicGFja19yZXF1aXJlX18oMjQpO1xyXG5NYXR0ZXIuTW91c2UgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEzKTtcclxuTWF0dGVyLk1vdXNlQ29uc3RyYWludCA9IF9fd2VicGFja19yZXF1aXJlX18oMjUpO1xyXG5NYXR0ZXIuUGFpciA9IF9fd2VicGFja19yZXF1aXJlX18oOSk7XHJcbk1hdHRlci5QYWlycyA9IF9fd2VicGFja19yZXF1aXJlX18oMjApO1xyXG5NYXR0ZXIuUGx1Z2luID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNSk7XHJcbk1hdHRlci5RdWVyeSA9IF9fd2VicGFja19yZXF1aXJlX18oMjYpO1xyXG5NYXR0ZXIuUmVuZGVyID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNik7XHJcbk1hdHRlci5SZXNvbHZlciA9IF9fd2VicGFja19yZXF1aXJlX18oMTkpO1xyXG5NYXR0ZXIuUnVubmVyID0gX193ZWJwYWNrX3JlcXVpcmVfXygyNyk7XHJcbk1hdHRlci5TQVQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI4KTtcclxuTWF0dGVyLlNsZWVwaW5nID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3KTtcclxuTWF0dGVyLlN2ZyA9IF9fd2VicGFja19yZXF1aXJlX18oMjkpO1xyXG5NYXR0ZXIuVmVjdG9yID0gX193ZWJwYWNrX3JlcXVpcmVfXygyKTtcclxuTWF0dGVyLlZlcnRpY2VzID0gX193ZWJwYWNrX3JlcXVpcmVfXygzKTtcclxuTWF0dGVyLldvcmxkID0gX193ZWJwYWNrX3JlcXVpcmVfXygzMCk7XHJcblxyXG4vLyB0ZW1wb3JhcnkgYmFjayBjb21wYXRpYmlsaXR5XHJcbk1hdHRlci5FbmdpbmUucnVuID0gTWF0dGVyLlJ1bm5lci5ydW47XHJcbk1hdHRlci5Db21tb24uZGVwcmVjYXRlZChNYXR0ZXIuRW5naW5lLCAncnVuJywgJ0VuZ2luZS5ydW4g4p6kIHVzZSBNYXR0ZXIuUnVubmVyLnJ1bihlbmdpbmUpIGluc3RlYWQnKTtcclxuXG5cbi8qKiovIH0pLFxuLyogMjIgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuLyoqXHJcbiogVGhlIGBNYXR0ZXJgIG1vZHVsZSBpcyB0aGUgdG9wIGxldmVsIG5hbWVzcGFjZS4gSXQgYWxzbyBpbmNsdWRlcyBhIGZ1bmN0aW9uIGZvciBpbnN0YWxsaW5nIHBsdWdpbnMgb24gdG9wIG9mIHRoZSBsaWJyYXJ5LlxyXG4qXHJcbiogQGNsYXNzIE1hdHRlclxyXG4qL1xyXG5cclxudmFyIE1hdHRlciA9IHt9O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBNYXR0ZXI7XHJcblxyXG52YXIgUGx1Z2luID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNSk7XHJcbnZhciBDb21tb24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDApO1xyXG5cclxuKGZ1bmN0aW9uKCkge1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIGxpYnJhcnkgbmFtZS5cclxuICAgICAqIEBwcm9wZXJ0eSBuYW1lXHJcbiAgICAgKiBAcmVhZE9ubHlcclxuICAgICAqIEB0eXBlIHtTdHJpbmd9XHJcbiAgICAgKi9cclxuICAgIE1hdHRlci5uYW1lID0gJ21hdHRlci1qcyc7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgbGlicmFyeSB2ZXJzaW9uLlxyXG4gICAgICogQHByb3BlcnR5IHZlcnNpb25cclxuICAgICAqIEByZWFkT25seVxyXG4gICAgICogQHR5cGUge1N0cmluZ31cclxuICAgICAqL1xyXG4gICAgTWF0dGVyLnZlcnNpb24gPSAgdHJ1ZSA/IFwiMC4xOC4wXCIgOiB1bmRlZmluZWQ7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBIGxpc3Qgb2YgcGx1Z2luIGRlcGVuZGVuY2llcyB0byBiZSBpbnN0YWxsZWQuIFRoZXNlIGFyZSBub3JtYWxseSBzZXQgYW5kIGluc3RhbGxlZCB0aHJvdWdoIGBNYXR0ZXIudXNlYC5cclxuICAgICAqIEFsdGVybmF0aXZlbHkgeW91IG1heSBzZXQgYE1hdHRlci51c2VzYCBtYW51YWxseSBhbmQgaW5zdGFsbCB0aGVtIGJ5IGNhbGxpbmcgYFBsdWdpbi51c2UoTWF0dGVyKWAuXHJcbiAgICAgKiBAcHJvcGVydHkgdXNlc1xyXG4gICAgICogQHR5cGUge0FycmF5fVxyXG4gICAgICovXHJcbiAgICBNYXR0ZXIudXNlcyA9IFtdO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIHBsdWdpbnMgdGhhdCBoYXZlIGJlZW4gaW5zdGFsbGVkIHRocm91Z2ggYE1hdHRlci5QbHVnaW4uaW5zdGFsbGAuIFJlYWQgb25seS5cclxuICAgICAqIEBwcm9wZXJ0eSB1c2VkXHJcbiAgICAgKiBAcmVhZE9ubHlcclxuICAgICAqIEB0eXBlIHtBcnJheX1cclxuICAgICAqL1xyXG4gICAgTWF0dGVyLnVzZWQgPSBbXTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEluc3RhbGxzIHRoZSBnaXZlbiBwbHVnaW5zIG9uIHRoZSBgTWF0dGVyYCBuYW1lc3BhY2UuXHJcbiAgICAgKiBUaGlzIGlzIGEgc2hvcnQtaGFuZCBmb3IgYFBsdWdpbi51c2VgLCBzZWUgaXQgZm9yIG1vcmUgaW5mb3JtYXRpb24uXHJcbiAgICAgKiBDYWxsIHRoaXMgZnVuY3Rpb24gb25jZSBhdCB0aGUgc3RhcnQgb2YgeW91ciBjb2RlLCB3aXRoIGFsbCBvZiB0aGUgcGx1Z2lucyB5b3Ugd2lzaCB0byBpbnN0YWxsIGFzIGFyZ3VtZW50cy5cclxuICAgICAqIEF2b2lkIGNhbGxpbmcgdGhpcyBmdW5jdGlvbiBtdWx0aXBsZSB0aW1lcyB1bmxlc3MgeW91IGludGVuZCB0byBtYW51YWxseSBjb250cm9sIGluc3RhbGxhdGlvbiBvcmRlci5cclxuICAgICAqIEBtZXRob2QgdXNlXHJcbiAgICAgKiBAcGFyYW0gLi4ucGx1Z2luIHtGdW5jdGlvbn0gVGhlIHBsdWdpbihzKSB0byBpbnN0YWxsIG9uIGBiYXNlYCAobXVsdGktYXJndW1lbnQpLlxyXG4gICAgICovXHJcbiAgICBNYXR0ZXIudXNlID0gZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgUGx1Z2luLnVzZShNYXR0ZXIsIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cykpO1xyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIENoYWlucyBhIGZ1bmN0aW9uIHRvIGV4Y3V0ZSBiZWZvcmUgdGhlIG9yaWdpbmFsIGZ1bmN0aW9uIG9uIHRoZSBnaXZlbiBgcGF0aGAgcmVsYXRpdmUgdG8gYE1hdHRlcmAuXHJcbiAgICAgKiBTZWUgYWxzbyBkb2NzIGZvciBgQ29tbW9uLmNoYWluYC5cclxuICAgICAqIEBtZXRob2QgYmVmb3JlXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aCBUaGUgcGF0aCByZWxhdGl2ZSB0byBgTWF0dGVyYFxyXG4gICAgICogQHBhcmFtIHtmdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gY2hhaW4gYmVmb3JlIHRoZSBvcmlnaW5hbFxyXG4gICAgICogQHJldHVybiB7ZnVuY3Rpb259IFRoZSBjaGFpbmVkIGZ1bmN0aW9uIHRoYXQgcmVwbGFjZWQgdGhlIG9yaWdpbmFsXHJcbiAgICAgKi9cclxuICAgIE1hdHRlci5iZWZvcmUgPSBmdW5jdGlvbihwYXRoLCBmdW5jKSB7XHJcbiAgICAgICAgcGF0aCA9IHBhdGgucmVwbGFjZSgvXk1hdHRlci4vLCAnJyk7XHJcbiAgICAgICAgcmV0dXJuIENvbW1vbi5jaGFpblBhdGhCZWZvcmUoTWF0dGVyLCBwYXRoLCBmdW5jKTtcclxuICAgIH07XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDaGFpbnMgYSBmdW5jdGlvbiB0byBleGN1dGUgYWZ0ZXIgdGhlIG9yaWdpbmFsIGZ1bmN0aW9uIG9uIHRoZSBnaXZlbiBgcGF0aGAgcmVsYXRpdmUgdG8gYE1hdHRlcmAuXHJcbiAgICAgKiBTZWUgYWxzbyBkb2NzIGZvciBgQ29tbW9uLmNoYWluYC5cclxuICAgICAqIEBtZXRob2QgYWZ0ZXJcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIFRoZSBwYXRoIHJlbGF0aXZlIHRvIGBNYXR0ZXJgXHJcbiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBjaGFpbiBhZnRlciB0aGUgb3JpZ2luYWxcclxuICAgICAqIEByZXR1cm4ge2Z1bmN0aW9ufSBUaGUgY2hhaW5lZCBmdW5jdGlvbiB0aGF0IHJlcGxhY2VkIHRoZSBvcmlnaW5hbFxyXG4gICAgICovXHJcbiAgICBNYXR0ZXIuYWZ0ZXIgPSBmdW5jdGlvbihwYXRoLCBmdW5jKSB7XHJcbiAgICAgICAgcGF0aCA9IHBhdGgucmVwbGFjZSgvXk1hdHRlci4vLCAnJyk7XHJcbiAgICAgICAgcmV0dXJuIENvbW1vbi5jaGFpblBhdGhBZnRlcihNYXR0ZXIsIHBhdGgsIGZ1bmMpO1xyXG4gICAgfTtcclxuXHJcbn0pKCk7XHJcblxuXG4vKioqLyB9KSxcbi8qIDIzICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cbi8qKlxuKiBUaGUgYE1hdHRlci5Db21wb3NpdGVzYCBtb2R1bGUgY29udGFpbnMgZmFjdG9yeSBtZXRob2RzIGZvciBjcmVhdGluZyBjb21wb3NpdGUgYm9kaWVzXG4qIHdpdGggY29tbW9ubHkgdXNlZCBjb25maWd1cmF0aW9ucyAoc3VjaCBhcyBzdGFja3MgYW5kIGNoYWlucykuXG4qXG4qIFNlZSB0aGUgaW5jbHVkZWQgdXNhZ2UgW2V4YW1wbGVzXShodHRwczovL2dpdGh1Yi5jb20vbGlhYnJ1L21hdHRlci1qcy90cmVlL21hc3Rlci9leGFtcGxlcykuXG4qXG4qIEBjbGFzcyBDb21wb3NpdGVzXG4qL1xuXG52YXIgQ29tcG9zaXRlcyA9IHt9O1xuXG5tb2R1bGUuZXhwb3J0cyA9IENvbXBvc2l0ZXM7XG5cbnZhciBDb21wb3NpdGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDUpO1xudmFyIENvbnN0cmFpbnQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEwKTtcbnZhciBDb21tb24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDApO1xudmFyIEJvZHkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDYpO1xudmFyIEJvZGllcyA9IF9fd2VicGFja19yZXF1aXJlX18oMTIpO1xudmFyIGRlcHJlY2F0ZWQgPSBDb21tb24uZGVwcmVjYXRlZDtcblxuKGZ1bmN0aW9uKCkge1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGEgbmV3IGNvbXBvc2l0ZSBjb250YWluaW5nIGJvZGllcyBjcmVhdGVkIGluIHRoZSBjYWxsYmFjayBpbiBhIGdyaWQgYXJyYW5nZW1lbnQuXG4gICAgICogVGhpcyBmdW5jdGlvbiB1c2VzIHRoZSBib2R5J3MgYm91bmRzIHRvIHByZXZlbnQgb3ZlcmxhcHMuXG4gICAgICogQG1ldGhvZCBzdGFja1xuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB4eFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB5eVxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBjb2x1bW5zXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHJvd3NcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gY29sdW1uR2FwXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHJvd0dhcFxuICAgICAqIEBwYXJhbSB7ZnVuY3Rpb259IGNhbGxiYWNrXG4gICAgICogQHJldHVybiB7Y29tcG9zaXRlfSBBIG5ldyBjb21wb3NpdGUgY29udGFpbmluZyBvYmplY3RzIGNyZWF0ZWQgaW4gdGhlIGNhbGxiYWNrXG4gICAgICovXG4gICAgQ29tcG9zaXRlcy5zdGFjayA9IGZ1bmN0aW9uKHh4LCB5eSwgY29sdW1ucywgcm93cywgY29sdW1uR2FwLCByb3dHYXAsIGNhbGxiYWNrKSB7XG4gICAgICAgIHZhciBzdGFjayA9IENvbXBvc2l0ZS5jcmVhdGUoeyBsYWJlbDogJ1N0YWNrJyB9KSxcbiAgICAgICAgICAgIHggPSB4eCxcbiAgICAgICAgICAgIHkgPSB5eSxcbiAgICAgICAgICAgIGxhc3RCb2R5LFxuICAgICAgICAgICAgaSA9IDA7XG5cbiAgICAgICAgZm9yICh2YXIgcm93ID0gMDsgcm93IDwgcm93czsgcm93KyspIHtcbiAgICAgICAgICAgIHZhciBtYXhIZWlnaHQgPSAwO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBmb3IgKHZhciBjb2x1bW4gPSAwOyBjb2x1bW4gPCBjb2x1bW5zOyBjb2x1bW4rKykge1xuICAgICAgICAgICAgICAgIHZhciBib2R5ID0gY2FsbGJhY2soeCwgeSwgY29sdW1uLCByb3csIGxhc3RCb2R5LCBpKTtcbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgaWYgKGJvZHkpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGJvZHlIZWlnaHQgPSBib2R5LmJvdW5kcy5tYXgueSAtIGJvZHkuYm91bmRzLm1pbi55LFxuICAgICAgICAgICAgICAgICAgICAgICAgYm9keVdpZHRoID0gYm9keS5ib3VuZHMubWF4LnggLSBib2R5LmJvdW5kcy5taW4ueDsgXG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGJvZHlIZWlnaHQgPiBtYXhIZWlnaHQpXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXhIZWlnaHQgPSBib2R5SGVpZ2h0O1xuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgQm9keS50cmFuc2xhdGUoYm9keSwgeyB4OiBib2R5V2lkdGggKiAwLjUsIHk6IGJvZHlIZWlnaHQgKiAwLjUgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgeCA9IGJvZHkuYm91bmRzLm1heC54ICsgY29sdW1uR2FwO1xuXG4gICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZS5hZGRCb2R5KHN0YWNrLCBib2R5KTtcbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIGxhc3RCb2R5ID0gYm9keTtcbiAgICAgICAgICAgICAgICAgICAgaSArPSAxO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHggKz0gY29sdW1uR2FwO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgeSArPSBtYXhIZWlnaHQgKyByb3dHYXA7XG4gICAgICAgICAgICB4ID0geHg7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gc3RhY2s7XG4gICAgfTtcbiAgICBcbiAgICAvKipcbiAgICAgKiBDaGFpbnMgYWxsIGJvZGllcyBpbiB0aGUgZ2l2ZW4gY29tcG9zaXRlIHRvZ2V0aGVyIHVzaW5nIGNvbnN0cmFpbnRzLlxuICAgICAqIEBtZXRob2QgY2hhaW5cbiAgICAgKiBAcGFyYW0ge2NvbXBvc2l0ZX0gY29tcG9zaXRlXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHhPZmZzZXRBXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHlPZmZzZXRBXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHhPZmZzZXRCXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHlPZmZzZXRCXG4gICAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnNcbiAgICAgKiBAcmV0dXJuIHtjb21wb3NpdGV9IEEgbmV3IGNvbXBvc2l0ZSBjb250YWluaW5nIG9iamVjdHMgY2hhaW5lZCB0b2dldGhlciB3aXRoIGNvbnN0cmFpbnRzXG4gICAgICovXG4gICAgQ29tcG9zaXRlcy5jaGFpbiA9IGZ1bmN0aW9uKGNvbXBvc2l0ZSwgeE9mZnNldEEsIHlPZmZzZXRBLCB4T2Zmc2V0QiwgeU9mZnNldEIsIG9wdGlvbnMpIHtcbiAgICAgICAgdmFyIGJvZGllcyA9IGNvbXBvc2l0ZS5ib2RpZXM7XG4gICAgICAgIFxuICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8IGJvZGllcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIGJvZHlBID0gYm9kaWVzW2kgLSAxXSxcbiAgICAgICAgICAgICAgICBib2R5QiA9IGJvZGllc1tpXSxcbiAgICAgICAgICAgICAgICBib2R5QUhlaWdodCA9IGJvZHlBLmJvdW5kcy5tYXgueSAtIGJvZHlBLmJvdW5kcy5taW4ueSxcbiAgICAgICAgICAgICAgICBib2R5QVdpZHRoID0gYm9keUEuYm91bmRzLm1heC54IC0gYm9keUEuYm91bmRzLm1pbi54LCBcbiAgICAgICAgICAgICAgICBib2R5QkhlaWdodCA9IGJvZHlCLmJvdW5kcy5tYXgueSAtIGJvZHlCLmJvdW5kcy5taW4ueSxcbiAgICAgICAgICAgICAgICBib2R5QldpZHRoID0gYm9keUIuYm91bmRzLm1heC54IC0gYm9keUIuYm91bmRzLm1pbi54O1xuICAgICAgICBcbiAgICAgICAgICAgIHZhciBkZWZhdWx0cyA9IHtcbiAgICAgICAgICAgICAgICBib2R5QTogYm9keUEsXG4gICAgICAgICAgICAgICAgcG9pbnRBOiB7IHg6IGJvZHlBV2lkdGggKiB4T2Zmc2V0QSwgeTogYm9keUFIZWlnaHQgKiB5T2Zmc2V0QSB9LFxuICAgICAgICAgICAgICAgIGJvZHlCOiBib2R5QixcbiAgICAgICAgICAgICAgICBwb2ludEI6IHsgeDogYm9keUJXaWR0aCAqIHhPZmZzZXRCLCB5OiBib2R5QkhlaWdodCAqIHlPZmZzZXRCIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHZhciBjb25zdHJhaW50ID0gQ29tbW9uLmV4dGVuZChkZWZhdWx0cywgb3B0aW9ucyk7XG4gICAgICAgIFxuICAgICAgICAgICAgQ29tcG9zaXRlLmFkZENvbnN0cmFpbnQoY29tcG9zaXRlLCBDb25zdHJhaW50LmNyZWF0ZShjb25zdHJhaW50KSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb21wb3NpdGUubGFiZWwgKz0gJyBDaGFpbic7XG4gICAgICAgIFxuICAgICAgICByZXR1cm4gY29tcG9zaXRlO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBDb25uZWN0cyBib2RpZXMgaW4gdGhlIGNvbXBvc2l0ZSB3aXRoIGNvbnN0cmFpbnRzIGluIGEgZ3JpZCBwYXR0ZXJuLCB3aXRoIG9wdGlvbmFsIGNyb3NzIGJyYWNlcy5cbiAgICAgKiBAbWV0aG9kIG1lc2hcbiAgICAgKiBAcGFyYW0ge2NvbXBvc2l0ZX0gY29tcG9zaXRlXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGNvbHVtbnNcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcm93c1xuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gY3Jvc3NCcmFjZVxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zXG4gICAgICogQHJldHVybiB7Y29tcG9zaXRlfSBUaGUgY29tcG9zaXRlIGNvbnRhaW5pbmcgb2JqZWN0cyBtZXNoZWQgdG9nZXRoZXIgd2l0aCBjb25zdHJhaW50c1xuICAgICAqL1xuICAgIENvbXBvc2l0ZXMubWVzaCA9IGZ1bmN0aW9uKGNvbXBvc2l0ZSwgY29sdW1ucywgcm93cywgY3Jvc3NCcmFjZSwgb3B0aW9ucykge1xuICAgICAgICB2YXIgYm9kaWVzID0gY29tcG9zaXRlLmJvZGllcyxcbiAgICAgICAgICAgIHJvdyxcbiAgICAgICAgICAgIGNvbCxcbiAgICAgICAgICAgIGJvZHlBLFxuICAgICAgICAgICAgYm9keUIsXG4gICAgICAgICAgICBib2R5QztcbiAgICAgICAgXG4gICAgICAgIGZvciAocm93ID0gMDsgcm93IDwgcm93czsgcm93KyspIHtcbiAgICAgICAgICAgIGZvciAoY29sID0gMTsgY29sIDwgY29sdW1uczsgY29sKyspIHtcbiAgICAgICAgICAgICAgICBib2R5QSA9IGJvZGllc1soY29sIC0gMSkgKyAocm93ICogY29sdW1ucyldO1xuICAgICAgICAgICAgICAgIGJvZHlCID0gYm9kaWVzW2NvbCArIChyb3cgKiBjb2x1bW5zKV07XG4gICAgICAgICAgICAgICAgQ29tcG9zaXRlLmFkZENvbnN0cmFpbnQoY29tcG9zaXRlLCBDb25zdHJhaW50LmNyZWF0ZShDb21tb24uZXh0ZW5kKHsgYm9keUE6IGJvZHlBLCBib2R5QjogYm9keUIgfSwgb3B0aW9ucykpKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHJvdyA+IDApIHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbCA9IDA7IGNvbCA8IGNvbHVtbnM7IGNvbCsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGJvZHlBID0gYm9kaWVzW2NvbCArICgocm93IC0gMSkgKiBjb2x1bW5zKV07XG4gICAgICAgICAgICAgICAgICAgIGJvZHlCID0gYm9kaWVzW2NvbCArIChyb3cgKiBjb2x1bW5zKV07XG4gICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZS5hZGRDb25zdHJhaW50KGNvbXBvc2l0ZSwgQ29uc3RyYWludC5jcmVhdGUoQ29tbW9uLmV4dGVuZCh7IGJvZHlBOiBib2R5QSwgYm9keUI6IGJvZHlCIH0sIG9wdGlvbnMpKSk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGNyb3NzQnJhY2UgJiYgY29sID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYm9keUMgPSBib2RpZXNbKGNvbCAtIDEpICsgKChyb3cgLSAxKSAqIGNvbHVtbnMpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZS5hZGRDb25zdHJhaW50KGNvbXBvc2l0ZSwgQ29uc3RyYWludC5jcmVhdGUoQ29tbW9uLmV4dGVuZCh7IGJvZHlBOiBib2R5QywgYm9keUI6IGJvZHlCIH0sIG9wdGlvbnMpKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAoY3Jvc3NCcmFjZSAmJiBjb2wgPCBjb2x1bW5zIC0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYm9keUMgPSBib2RpZXNbKGNvbCArIDEpICsgKChyb3cgLSAxKSAqIGNvbHVtbnMpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZS5hZGRDb25zdHJhaW50KGNvbXBvc2l0ZSwgQ29uc3RyYWludC5jcmVhdGUoQ29tbW9uLmV4dGVuZCh7IGJvZHlBOiBib2R5QywgYm9keUI6IGJvZHlCIH0sIG9wdGlvbnMpKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb21wb3NpdGUubGFiZWwgKz0gJyBNZXNoJztcbiAgICAgICAgXG4gICAgICAgIHJldHVybiBjb21wb3NpdGU7XG4gICAgfTtcbiAgICBcbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSBuZXcgY29tcG9zaXRlIGNvbnRhaW5pbmcgYm9kaWVzIGNyZWF0ZWQgaW4gdGhlIGNhbGxiYWNrIGluIGEgcHlyYW1pZCBhcnJhbmdlbWVudC5cbiAgICAgKiBUaGlzIGZ1bmN0aW9uIHVzZXMgdGhlIGJvZHkncyBib3VuZHMgdG8gcHJldmVudCBvdmVybGFwcy5cbiAgICAgKiBAbWV0aG9kIHB5cmFtaWRcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geHhcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geXlcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gY29sdW1uc1xuICAgICAqIEBwYXJhbSB7bnVtYmVyfSByb3dzXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGNvbHVtbkdhcFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSByb3dHYXBcbiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBjYWxsYmFja1xuICAgICAqIEByZXR1cm4ge2NvbXBvc2l0ZX0gQSBuZXcgY29tcG9zaXRlIGNvbnRhaW5pbmcgb2JqZWN0cyBjcmVhdGVkIGluIHRoZSBjYWxsYmFja1xuICAgICAqL1xuICAgIENvbXBvc2l0ZXMucHlyYW1pZCA9IGZ1bmN0aW9uKHh4LCB5eSwgY29sdW1ucywgcm93cywgY29sdW1uR2FwLCByb3dHYXAsIGNhbGxiYWNrKSB7XG4gICAgICAgIHJldHVybiBDb21wb3NpdGVzLnN0YWNrKHh4LCB5eSwgY29sdW1ucywgcm93cywgY29sdW1uR2FwLCByb3dHYXAsIGZ1bmN0aW9uKHgsIHksIGNvbHVtbiwgcm93LCBsYXN0Qm9keSwgaSkge1xuICAgICAgICAgICAgdmFyIGFjdHVhbFJvd3MgPSBNYXRoLm1pbihyb3dzLCBNYXRoLmNlaWwoY29sdW1ucyAvIDIpKSxcbiAgICAgICAgICAgICAgICBsYXN0Qm9keVdpZHRoID0gbGFzdEJvZHkgPyBsYXN0Qm9keS5ib3VuZHMubWF4LnggLSBsYXN0Qm9keS5ib3VuZHMubWluLnggOiAwO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBpZiAocm93ID4gYWN0dWFsUm93cylcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIHJldmVyc2Ugcm93IG9yZGVyXG4gICAgICAgICAgICByb3cgPSBhY3R1YWxSb3dzIC0gcm93O1xuICAgICAgICAgICAgXG4gICAgICAgICAgICB2YXIgc3RhcnQgPSByb3csXG4gICAgICAgICAgICAgICAgZW5kID0gY29sdW1ucyAtIDEgLSByb3c7XG5cbiAgICAgICAgICAgIGlmIChjb2x1bW4gPCBzdGFydCB8fCBjb2x1bW4gPiBlbmQpXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyByZXRyb2FjdGl2ZWx5IGZpeCB0aGUgZmlyc3QgYm9keSdzIHBvc2l0aW9uLCBzaW5jZSB3aWR0aCB3YXMgdW5rbm93blxuICAgICAgICAgICAgaWYgKGkgPT09IDEpIHtcbiAgICAgICAgICAgICAgICBCb2R5LnRyYW5zbGF0ZShsYXN0Qm9keSwgeyB4OiAoY29sdW1uICsgKGNvbHVtbnMgJSAyID09PSAxID8gMSA6IC0xKSkgKiBsYXN0Qm9keVdpZHRoLCB5OiAwIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgeE9mZnNldCA9IGxhc3RCb2R5ID8gY29sdW1uICogbGFzdEJvZHlXaWR0aCA6IDA7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayh4eCArIHhPZmZzZXQgKyBjb2x1bW4gKiBjb2x1bW5HYXAsIHksIGNvbHVtbiwgcm93LCBsYXN0Qm9keSwgaSk7XG4gICAgICAgIH0pO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGhhcyBub3cgbW92ZWQgdG8gdGhlIFtuZXd0b25zQ3JhZGxlIGV4YW1wbGVdKGh0dHBzOi8vZ2l0aHViLmNvbS9saWFicnUvbWF0dGVyLWpzL2Jsb2IvbWFzdGVyL2V4YW1wbGVzL25ld3RvbnNDcmFkbGUuanMpLCBmb2xsb3cgdGhhdCBpbnN0ZWFkIGFzIHRoaXMgZnVuY3Rpb24gaXMgZGVwcmVjYXRlZCBoZXJlLlxuICAgICAqIEBkZXByZWNhdGVkIG1vdmVkIHRvIG5ld3RvbnNDcmFkbGUgZXhhbXBsZVxuICAgICAqIEBtZXRob2QgbmV3dG9uc0NyYWRsZVxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB4eFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB5eVxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBudW1iZXJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gc2l6ZVxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBsZW5ndGhcbiAgICAgKiBAcmV0dXJuIHtjb21wb3NpdGV9IEEgbmV3IGNvbXBvc2l0ZSBuZXd0b25zQ3JhZGxlIGJvZHlcbiAgICAgKi9cbiAgICBDb21wb3NpdGVzLm5ld3RvbnNDcmFkbGUgPSBmdW5jdGlvbih4eCwgeXksIG51bWJlciwgc2l6ZSwgbGVuZ3RoKSB7XG4gICAgICAgIHZhciBuZXd0b25zQ3JhZGxlID0gQ29tcG9zaXRlLmNyZWF0ZSh7IGxhYmVsOiAnTmV3dG9ucyBDcmFkbGUnIH0pO1xuXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBzZXBhcmF0aW9uID0gMS45LFxuICAgICAgICAgICAgICAgIGNpcmNsZSA9IEJvZGllcy5jaXJjbGUoeHggKyBpICogKHNpemUgKiBzZXBhcmF0aW9uKSwgeXkgKyBsZW5ndGgsIHNpemUsIFxuICAgICAgICAgICAgICAgICAgICB7IGluZXJ0aWE6IEluZmluaXR5LCByZXN0aXR1dGlvbjogMSwgZnJpY3Rpb246IDAsIGZyaWN0aW9uQWlyOiAwLjAwMDEsIHNsb3A6IDEgfSksXG4gICAgICAgICAgICAgICAgY29uc3RyYWludCA9IENvbnN0cmFpbnQuY3JlYXRlKHsgcG9pbnRBOiB7IHg6IHh4ICsgaSAqIChzaXplICogc2VwYXJhdGlvbiksIHk6IHl5IH0sIGJvZHlCOiBjaXJjbGUgfSk7XG5cbiAgICAgICAgICAgIENvbXBvc2l0ZS5hZGRCb2R5KG5ld3RvbnNDcmFkbGUsIGNpcmNsZSk7XG4gICAgICAgICAgICBDb21wb3NpdGUuYWRkQ29uc3RyYWludChuZXd0b25zQ3JhZGxlLCBjb25zdHJhaW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXd0b25zQ3JhZGxlO1xuICAgIH07XG5cbiAgICBkZXByZWNhdGVkKENvbXBvc2l0ZXMsICduZXd0b25zQ3JhZGxlJywgJ0NvbXBvc2l0ZXMubmV3dG9uc0NyYWRsZSDinqQgbW92ZWQgdG8gbmV3dG9uc0NyYWRsZSBleGFtcGxlJyk7XG4gICAgXG4gICAgLyoqXG4gICAgICogVGhpcyBoYXMgbm93IG1vdmVkIHRvIHRoZSBbY2FyIGV4YW1wbGVdKGh0dHBzOi8vZ2l0aHViLmNvbS9saWFicnUvbWF0dGVyLWpzL2Jsb2IvbWFzdGVyL2V4YW1wbGVzL2Nhci5qcyksIGZvbGxvdyB0aGF0IGluc3RlYWQgYXMgdGhpcyBmdW5jdGlvbiBpcyBkZXByZWNhdGVkIGhlcmUuXG4gICAgICogQGRlcHJlY2F0ZWQgbW92ZWQgdG8gY2FyIGV4YW1wbGVcbiAgICAgKiBAbWV0aG9kIGNhclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB4eFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB5eVxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB3aWR0aFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBoZWlnaHRcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gd2hlZWxTaXplXG4gICAgICogQHJldHVybiB7Y29tcG9zaXRlfSBBIG5ldyBjb21wb3NpdGUgY2FyIGJvZHlcbiAgICAgKi9cbiAgICBDb21wb3NpdGVzLmNhciA9IGZ1bmN0aW9uKHh4LCB5eSwgd2lkdGgsIGhlaWdodCwgd2hlZWxTaXplKSB7XG4gICAgICAgIHZhciBncm91cCA9IEJvZHkubmV4dEdyb3VwKHRydWUpLFxuICAgICAgICAgICAgd2hlZWxCYXNlID0gMjAsXG4gICAgICAgICAgICB3aGVlbEFPZmZzZXQgPSAtd2lkdGggKiAwLjUgKyB3aGVlbEJhc2UsXG4gICAgICAgICAgICB3aGVlbEJPZmZzZXQgPSB3aWR0aCAqIDAuNSAtIHdoZWVsQmFzZSxcbiAgICAgICAgICAgIHdoZWVsWU9mZnNldCA9IDA7XG4gICAgXG4gICAgICAgIHZhciBjYXIgPSBDb21wb3NpdGUuY3JlYXRlKHsgbGFiZWw6ICdDYXInIH0pLFxuICAgICAgICAgICAgYm9keSA9IEJvZGllcy5yZWN0YW5nbGUoeHgsIHl5LCB3aWR0aCwgaGVpZ2h0LCB7IFxuICAgICAgICAgICAgICAgIGNvbGxpc2lvbkZpbHRlcjoge1xuICAgICAgICAgICAgICAgICAgICBncm91cDogZ3JvdXBcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGNoYW1mZXI6IHtcbiAgICAgICAgICAgICAgICAgICAgcmFkaXVzOiBoZWlnaHQgKiAwLjVcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGRlbnNpdHk6IDAuMDAwMlxuICAgICAgICAgICAgfSk7XG4gICAgXG4gICAgICAgIHZhciB3aGVlbEEgPSBCb2RpZXMuY2lyY2xlKHh4ICsgd2hlZWxBT2Zmc2V0LCB5eSArIHdoZWVsWU9mZnNldCwgd2hlZWxTaXplLCB7IFxuICAgICAgICAgICAgY29sbGlzaW9uRmlsdGVyOiB7XG4gICAgICAgICAgICAgICAgZ3JvdXA6IGdyb3VwXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZnJpY3Rpb246IDAuOFxuICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgIHZhciB3aGVlbEIgPSBCb2RpZXMuY2lyY2xlKHh4ICsgd2hlZWxCT2Zmc2V0LCB5eSArIHdoZWVsWU9mZnNldCwgd2hlZWxTaXplLCB7IFxuICAgICAgICAgICAgY29sbGlzaW9uRmlsdGVyOiB7XG4gICAgICAgICAgICAgICAgZ3JvdXA6IGdyb3VwXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZnJpY3Rpb246IDAuOFxuICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgIHZhciBheGVsQSA9IENvbnN0cmFpbnQuY3JlYXRlKHtcbiAgICAgICAgICAgIGJvZHlCOiBib2R5LFxuICAgICAgICAgICAgcG9pbnRCOiB7IHg6IHdoZWVsQU9mZnNldCwgeTogd2hlZWxZT2Zmc2V0IH0sXG4gICAgICAgICAgICBib2R5QTogd2hlZWxBLFxuICAgICAgICAgICAgc3RpZmZuZXNzOiAxLFxuICAgICAgICAgICAgbGVuZ3RoOiAwXG4gICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgIHZhciBheGVsQiA9IENvbnN0cmFpbnQuY3JlYXRlKHtcbiAgICAgICAgICAgIGJvZHlCOiBib2R5LFxuICAgICAgICAgICAgcG9pbnRCOiB7IHg6IHdoZWVsQk9mZnNldCwgeTogd2hlZWxZT2Zmc2V0IH0sXG4gICAgICAgICAgICBib2R5QTogd2hlZWxCLFxuICAgICAgICAgICAgc3RpZmZuZXNzOiAxLFxuICAgICAgICAgICAgbGVuZ3RoOiAwXG4gICAgICAgIH0pO1xuICAgICAgICBcbiAgICAgICAgQ29tcG9zaXRlLmFkZEJvZHkoY2FyLCBib2R5KTtcbiAgICAgICAgQ29tcG9zaXRlLmFkZEJvZHkoY2FyLCB3aGVlbEEpO1xuICAgICAgICBDb21wb3NpdGUuYWRkQm9keShjYXIsIHdoZWVsQik7XG4gICAgICAgIENvbXBvc2l0ZS5hZGRDb25zdHJhaW50KGNhciwgYXhlbEEpO1xuICAgICAgICBDb21wb3NpdGUuYWRkQ29uc3RyYWludChjYXIsIGF4ZWxCKTtcblxuICAgICAgICByZXR1cm4gY2FyO1xuICAgIH07XG5cbiAgICBkZXByZWNhdGVkKENvbXBvc2l0ZXMsICdjYXInLCAnQ29tcG9zaXRlcy5jYXIg4p6kIG1vdmVkIHRvIGNhciBleGFtcGxlJyk7XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGhhcyBub3cgbW92ZWQgdG8gdGhlIFtzb2Z0Qm9keSBleGFtcGxlXShodHRwczovL2dpdGh1Yi5jb20vbGlhYnJ1L21hdHRlci1qcy9ibG9iL21hc3Rlci9leGFtcGxlcy9zb2Z0Qm9keS5qcylcbiAgICAgKiBhbmQgdGhlIFtjbG90aCBleGFtcGxlXShodHRwczovL2dpdGh1Yi5jb20vbGlhYnJ1L21hdHRlci1qcy9ibG9iL21hc3Rlci9leGFtcGxlcy9jbG90aC5qcyksIGZvbGxvdyB0aG9zZSBpbnN0ZWFkIGFzIHRoaXMgZnVuY3Rpb24gaXMgZGVwcmVjYXRlZCBoZXJlLlxuICAgICAqIEBkZXByZWNhdGVkIG1vdmVkIHRvIHNvZnRCb2R5IGFuZCBjbG90aCBleGFtcGxlc1xuICAgICAqIEBtZXRob2Qgc29mdEJvZHlcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geHhcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geXlcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gY29sdW1uc1xuICAgICAqIEBwYXJhbSB7bnVtYmVyfSByb3dzXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGNvbHVtbkdhcFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSByb3dHYXBcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGNyb3NzQnJhY2VcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcGFydGljbGVSYWRpdXNcbiAgICAgKiBAcGFyYW0ge30gcGFydGljbGVPcHRpb25zXG4gICAgICogQHBhcmFtIHt9IGNvbnN0cmFpbnRPcHRpb25zXG4gICAgICogQHJldHVybiB7Y29tcG9zaXRlfSBBIG5ldyBjb21wb3NpdGUgc29mdEJvZHlcbiAgICAgKi9cbiAgICBDb21wb3NpdGVzLnNvZnRCb2R5ID0gZnVuY3Rpb24oeHgsIHl5LCBjb2x1bW5zLCByb3dzLCBjb2x1bW5HYXAsIHJvd0dhcCwgY3Jvc3NCcmFjZSwgcGFydGljbGVSYWRpdXMsIHBhcnRpY2xlT3B0aW9ucywgY29uc3RyYWludE9wdGlvbnMpIHtcbiAgICAgICAgcGFydGljbGVPcHRpb25zID0gQ29tbW9uLmV4dGVuZCh7IGluZXJ0aWE6IEluZmluaXR5IH0sIHBhcnRpY2xlT3B0aW9ucyk7XG4gICAgICAgIGNvbnN0cmFpbnRPcHRpb25zID0gQ29tbW9uLmV4dGVuZCh7IHN0aWZmbmVzczogMC4yLCByZW5kZXI6IHsgdHlwZTogJ2xpbmUnLCBhbmNob3JzOiBmYWxzZSB9IH0sIGNvbnN0cmFpbnRPcHRpb25zKTtcblxuICAgICAgICB2YXIgc29mdEJvZHkgPSBDb21wb3NpdGVzLnN0YWNrKHh4LCB5eSwgY29sdW1ucywgcm93cywgY29sdW1uR2FwLCByb3dHYXAsIGZ1bmN0aW9uKHgsIHkpIHtcbiAgICAgICAgICAgIHJldHVybiBCb2RpZXMuY2lyY2xlKHgsIHksIHBhcnRpY2xlUmFkaXVzLCBwYXJ0aWNsZU9wdGlvbnMpO1xuICAgICAgICB9KTtcblxuICAgICAgICBDb21wb3NpdGVzLm1lc2goc29mdEJvZHksIGNvbHVtbnMsIHJvd3MsIGNyb3NzQnJhY2UsIGNvbnN0cmFpbnRPcHRpb25zKTtcblxuICAgICAgICBzb2Z0Qm9keS5sYWJlbCA9ICdTb2Z0IEJvZHknO1xuXG4gICAgICAgIHJldHVybiBzb2Z0Qm9keTtcbiAgICB9O1xuXG4gICAgZGVwcmVjYXRlZChDb21wb3NpdGVzLCAnc29mdEJvZHknLCAnQ29tcG9zaXRlcy5zb2Z0Qm9keSDinqQgbW92ZWQgdG8gc29mdEJvZHkgYW5kIGNsb3RoIGV4YW1wbGVzJyk7XG59KSgpO1xuXG5cbi8qKiovIH0pLFxuLyogMjQgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuLyoqXG4qIFRoaXMgbW9kdWxlIGhhcyBub3cgYmVlbiByZXBsYWNlZCBieSBgTWF0dGVyLkRldGVjdG9yYC5cbipcbiogQWxsIHVzYWdlIHNob3VsZCBiZSBtaWdyYXRlZCB0byBgTWF0dGVyLkRldGVjdG9yYCBvciBhbm90aGVyIGFsdGVybmF0aXZlLlxuKiBGb3IgYmFjay1jb21wYXRpYmlsaXR5IHB1cnBvc2VzIHRoaXMgbW9kdWxlIHdpbGwgcmVtYWluIGZvciBhIHNob3J0IHRlcm0gYW5kIHRoZW4gbGF0ZXIgcmVtb3ZlZCBpbiBhIGZ1dHVyZSByZWxlYXNlLlxuKlxuKiBUaGUgYE1hdHRlci5HcmlkYCBtb2R1bGUgY29udGFpbnMgbWV0aG9kcyBmb3IgY3JlYXRpbmcgYW5kIG1hbmlwdWxhdGluZyBjb2xsaXNpb24gYnJvYWRwaGFzZSBncmlkIHN0cnVjdHVyZXMuXG4qXG4qIEBjbGFzcyBHcmlkXG4qIEBkZXByZWNhdGVkXG4qL1xuXG52YXIgR3JpZCA9IHt9O1xuXG5tb2R1bGUuZXhwb3J0cyA9IEdyaWQ7XG5cbnZhciBQYWlyID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5KTtcbnZhciBDb21tb24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDApO1xudmFyIGRlcHJlY2F0ZWQgPSBDb21tb24uZGVwcmVjYXRlZDtcblxuKGZ1bmN0aW9uKCkge1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBncmlkLlxuICAgICAqIEBkZXByZWNhdGVkIHJlcGxhY2VkIGJ5IE1hdHRlci5EZXRlY3RvclxuICAgICAqIEBtZXRob2QgY3JlYXRlXG4gICAgICogQHBhcmFtIHt9IG9wdGlvbnNcbiAgICAgKiBAcmV0dXJuIHtncmlkfSBBIG5ldyBncmlkXG4gICAgICovXG4gICAgR3JpZC5jcmVhdGUgPSBmdW5jdGlvbihvcHRpb25zKSB7XG4gICAgICAgIHZhciBkZWZhdWx0cyA9IHtcbiAgICAgICAgICAgIGJ1Y2tldHM6IHt9LFxuICAgICAgICAgICAgcGFpcnM6IHt9LFxuICAgICAgICAgICAgcGFpcnNMaXN0OiBbXSxcbiAgICAgICAgICAgIGJ1Y2tldFdpZHRoOiA0OCxcbiAgICAgICAgICAgIGJ1Y2tldEhlaWdodDogNDhcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gQ29tbW9uLmV4dGVuZChkZWZhdWx0cywgb3B0aW9ucyk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFRoZSB3aWR0aCBvZiBhIHNpbmdsZSBncmlkIGJ1Y2tldC5cbiAgICAgKlxuICAgICAqIEBwcm9wZXJ0eSBidWNrZXRXaWR0aFxuICAgICAqIEB0eXBlIG51bWJlclxuICAgICAqIEBkZWZhdWx0IDQ4XG4gICAgICovXG5cbiAgICAvKipcbiAgICAgKiBUaGUgaGVpZ2h0IG9mIGEgc2luZ2xlIGdyaWQgYnVja2V0LlxuICAgICAqXG4gICAgICogQHByb3BlcnR5IGJ1Y2tldEhlaWdodFxuICAgICAqIEB0eXBlIG51bWJlclxuICAgICAqIEBkZWZhdWx0IDQ4XG4gICAgICovXG5cbiAgICAvKipcbiAgICAgKiBVcGRhdGVzIHRoZSBncmlkLlxuICAgICAqIEBkZXByZWNhdGVkIHJlcGxhY2VkIGJ5IE1hdHRlci5EZXRlY3RvclxuICAgICAqIEBtZXRob2QgdXBkYXRlXG4gICAgICogQHBhcmFtIHtncmlkfSBncmlkXG4gICAgICogQHBhcmFtIHtib2R5W119IGJvZGllc1xuICAgICAqIEBwYXJhbSB7ZW5naW5lfSBlbmdpbmVcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGZvcmNlVXBkYXRlXG4gICAgICovXG4gICAgR3JpZC51cGRhdGUgPSBmdW5jdGlvbihncmlkLCBib2RpZXMsIGVuZ2luZSwgZm9yY2VVcGRhdGUpIHtcbiAgICAgICAgdmFyIGksIGNvbCwgcm93LFxuICAgICAgICAgICAgd29ybGQgPSBlbmdpbmUud29ybGQsXG4gICAgICAgICAgICBidWNrZXRzID0gZ3JpZC5idWNrZXRzLFxuICAgICAgICAgICAgYnVja2V0LFxuICAgICAgICAgICAgYnVja2V0SWQsXG4gICAgICAgICAgICBncmlkQ2hhbmdlZCA9IGZhbHNlO1xuXG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBib2RpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBib2R5ID0gYm9kaWVzW2ldO1xuXG4gICAgICAgICAgICBpZiAoYm9keS5pc1NsZWVwaW5nICYmICFmb3JjZVVwZGF0ZSlcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcblxuICAgICAgICAgICAgLy8gdGVtcG9yYXJ5IGJhY2sgY29tcGF0aWJpbGl0eSBib3VuZHMgY2hlY2tcbiAgICAgICAgICAgIGlmICh3b3JsZC5ib3VuZHMgJiYgKGJvZHkuYm91bmRzLm1heC54IDwgd29ybGQuYm91bmRzLm1pbi54IHx8IGJvZHkuYm91bmRzLm1pbi54ID4gd29ybGQuYm91bmRzLm1heC54XG4gICAgICAgICAgICAgICAgfHwgYm9keS5ib3VuZHMubWF4LnkgPCB3b3JsZC5ib3VuZHMubWluLnkgfHwgYm9keS5ib3VuZHMubWluLnkgPiB3b3JsZC5ib3VuZHMubWF4LnkpKVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICB2YXIgbmV3UmVnaW9uID0gR3JpZC5fZ2V0UmVnaW9uKGdyaWQsIGJvZHkpO1xuXG4gICAgICAgICAgICAvLyBpZiB0aGUgYm9keSBoYXMgY2hhbmdlZCBncmlkIHJlZ2lvblxuICAgICAgICAgICAgaWYgKCFib2R5LnJlZ2lvbiB8fCBuZXdSZWdpb24uaWQgIT09IGJvZHkucmVnaW9uLmlkIHx8IGZvcmNlVXBkYXRlKSB7XG5cbiAgICAgICAgICAgICAgICBpZiAoIWJvZHkucmVnaW9uIHx8IGZvcmNlVXBkYXRlKVxuICAgICAgICAgICAgICAgICAgICBib2R5LnJlZ2lvbiA9IG5ld1JlZ2lvbjtcblxuICAgICAgICAgICAgICAgIHZhciB1bmlvbiA9IEdyaWQuX3JlZ2lvblVuaW9uKG5ld1JlZ2lvbiwgYm9keS5yZWdpb24pO1xuXG4gICAgICAgICAgICAgICAgLy8gdXBkYXRlIGdyaWQgYnVja2V0cyBhZmZlY3RlZCBieSByZWdpb24gY2hhbmdlXG4gICAgICAgICAgICAgICAgLy8gaXRlcmF0ZSBvdmVyIHRoZSB1bmlvbiBvZiBib3RoIHJlZ2lvbnNcbiAgICAgICAgICAgICAgICBmb3IgKGNvbCA9IHVuaW9uLnN0YXJ0Q29sOyBjb2wgPD0gdW5pb24uZW5kQ29sOyBjb2wrKykge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKHJvdyA9IHVuaW9uLnN0YXJ0Um93OyByb3cgPD0gdW5pb24uZW5kUm93OyByb3crKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnVja2V0SWQgPSBHcmlkLl9nZXRCdWNrZXRJZChjb2wsIHJvdyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBidWNrZXQgPSBidWNrZXRzW2J1Y2tldElkXTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGlzSW5zaWRlTmV3UmVnaW9uID0gKGNvbCA+PSBuZXdSZWdpb24uc3RhcnRDb2wgJiYgY29sIDw9IG5ld1JlZ2lvbi5lbmRDb2xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIHJvdyA+PSBuZXdSZWdpb24uc3RhcnRSb3cgJiYgcm93IDw9IG5ld1JlZ2lvbi5lbmRSb3cpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgaXNJbnNpZGVPbGRSZWdpb24gPSAoY29sID49IGJvZHkucmVnaW9uLnN0YXJ0Q29sICYmIGNvbCA8PSBib2R5LnJlZ2lvbi5lbmRDb2xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIHJvdyA+PSBib2R5LnJlZ2lvbi5zdGFydFJvdyAmJiByb3cgPD0gYm9keS5yZWdpb24uZW5kUm93KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVtb3ZlIGZyb20gb2xkIHJlZ2lvbiBidWNrZXRzXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzSW5zaWRlTmV3UmVnaW9uICYmIGlzSW5zaWRlT2xkUmVnaW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzSW5zaWRlT2xkUmVnaW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChidWNrZXQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcmlkLl9idWNrZXRSZW1vdmVCb2R5KGdyaWQsIGJ1Y2tldCwgYm9keSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhZGQgdG8gbmV3IHJlZ2lvbiBidWNrZXRzXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYm9keS5yZWdpb24gPT09IG5ld1JlZ2lvbiB8fCAoaXNJbnNpZGVOZXdSZWdpb24gJiYgIWlzSW5zaWRlT2xkUmVnaW9uKSB8fCBmb3JjZVVwZGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYnVja2V0KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWNrZXQgPSBHcmlkLl9jcmVhdGVCdWNrZXQoYnVja2V0cywgYnVja2V0SWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdyaWQuX2J1Y2tldEFkZEJvZHkoZ3JpZCwgYnVja2V0LCBib2R5KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIHNldCB0aGUgbmV3IHJlZ2lvblxuICAgICAgICAgICAgICAgIGJvZHkucmVnaW9uID0gbmV3UmVnaW9uO1xuXG4gICAgICAgICAgICAgICAgLy8gZmxhZyBjaGFuZ2VzIHNvIHdlIGNhbiB1cGRhdGUgcGFpcnNcbiAgICAgICAgICAgICAgICBncmlkQ2hhbmdlZCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyB1cGRhdGUgcGFpcnMgbGlzdCBvbmx5IGlmIHBhaXJzIGNoYW5nZWQgKGkuZS4gYSBib2R5IGNoYW5nZWQgcmVnaW9uKVxuICAgICAgICBpZiAoZ3JpZENoYW5nZWQpXG4gICAgICAgICAgICBncmlkLnBhaXJzTGlzdCA9IEdyaWQuX2NyZWF0ZUFjdGl2ZVBhaXJzTGlzdChncmlkKTtcbiAgICB9O1xuXG4gICAgZGVwcmVjYXRlZChHcmlkLCAndXBkYXRlJywgJ0dyaWQudXBkYXRlIOKepCByZXBsYWNlZCBieSBNYXR0ZXIuRGV0ZWN0b3InKTtcblxuICAgIC8qKlxuICAgICAqIENsZWFycyB0aGUgZ3JpZC5cbiAgICAgKiBAZGVwcmVjYXRlZCByZXBsYWNlZCBieSBNYXR0ZXIuRGV0ZWN0b3JcbiAgICAgKiBAbWV0aG9kIGNsZWFyXG4gICAgICogQHBhcmFtIHtncmlkfSBncmlkXG4gICAgICovXG4gICAgR3JpZC5jbGVhciA9IGZ1bmN0aW9uKGdyaWQpIHtcbiAgICAgICAgZ3JpZC5idWNrZXRzID0ge307XG4gICAgICAgIGdyaWQucGFpcnMgPSB7fTtcbiAgICAgICAgZ3JpZC5wYWlyc0xpc3QgPSBbXTtcbiAgICB9O1xuXG4gICAgZGVwcmVjYXRlZChHcmlkLCAnY2xlYXInLCAnR3JpZC5jbGVhciDinqQgcmVwbGFjZWQgYnkgTWF0dGVyLkRldGVjdG9yJyk7XG5cbiAgICAvKipcbiAgICAgKiBGaW5kcyB0aGUgdW5pb24gb2YgdHdvIHJlZ2lvbnMuXG4gICAgICogQG1ldGhvZCBfcmVnaW9uVW5pb25cbiAgICAgKiBAZGVwcmVjYXRlZCByZXBsYWNlZCBieSBNYXR0ZXIuRGV0ZWN0b3JcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7fSByZWdpb25BXG4gICAgICogQHBhcmFtIHt9IHJlZ2lvbkJcbiAgICAgKiBAcmV0dXJuIHt9IHJlZ2lvblxuICAgICAqL1xuICAgIEdyaWQuX3JlZ2lvblVuaW9uID0gZnVuY3Rpb24ocmVnaW9uQSwgcmVnaW9uQikge1xuICAgICAgICB2YXIgc3RhcnRDb2wgPSBNYXRoLm1pbihyZWdpb25BLnN0YXJ0Q29sLCByZWdpb25CLnN0YXJ0Q29sKSxcbiAgICAgICAgICAgIGVuZENvbCA9IE1hdGgubWF4KHJlZ2lvbkEuZW5kQ29sLCByZWdpb25CLmVuZENvbCksXG4gICAgICAgICAgICBzdGFydFJvdyA9IE1hdGgubWluKHJlZ2lvbkEuc3RhcnRSb3csIHJlZ2lvbkIuc3RhcnRSb3cpLFxuICAgICAgICAgICAgZW5kUm93ID0gTWF0aC5tYXgocmVnaW9uQS5lbmRSb3csIHJlZ2lvbkIuZW5kUm93KTtcblxuICAgICAgICByZXR1cm4gR3JpZC5fY3JlYXRlUmVnaW9uKHN0YXJ0Q29sLCBlbmRDb2wsIHN0YXJ0Um93LCBlbmRSb3cpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSByZWdpb24gYSBnaXZlbiBib2R5IGZhbGxzIGluIGZvciBhIGdpdmVuIGdyaWQuXG4gICAgICogQG1ldGhvZCBfZ2V0UmVnaW9uXG4gICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgYnkgTWF0dGVyLkRldGVjdG9yXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge30gZ3JpZFxuICAgICAqIEBwYXJhbSB7fSBib2R5XG4gICAgICogQHJldHVybiB7fSByZWdpb25cbiAgICAgKi9cbiAgICBHcmlkLl9nZXRSZWdpb24gPSBmdW5jdGlvbihncmlkLCBib2R5KSB7XG4gICAgICAgIHZhciBib3VuZHMgPSBib2R5LmJvdW5kcyxcbiAgICAgICAgICAgIHN0YXJ0Q29sID0gTWF0aC5mbG9vcihib3VuZHMubWluLnggLyBncmlkLmJ1Y2tldFdpZHRoKSxcbiAgICAgICAgICAgIGVuZENvbCA9IE1hdGguZmxvb3IoYm91bmRzLm1heC54IC8gZ3JpZC5idWNrZXRXaWR0aCksXG4gICAgICAgICAgICBzdGFydFJvdyA9IE1hdGguZmxvb3IoYm91bmRzLm1pbi55IC8gZ3JpZC5idWNrZXRIZWlnaHQpLFxuICAgICAgICAgICAgZW5kUm93ID0gTWF0aC5mbG9vcihib3VuZHMubWF4LnkgLyBncmlkLmJ1Y2tldEhlaWdodCk7XG5cbiAgICAgICAgcmV0dXJuIEdyaWQuX2NyZWF0ZVJlZ2lvbihzdGFydENvbCwgZW5kQ29sLCBzdGFydFJvdywgZW5kUm93KTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHJlZ2lvbi5cbiAgICAgKiBAbWV0aG9kIF9jcmVhdGVSZWdpb25cbiAgICAgKiBAZGVwcmVjYXRlZCByZXBsYWNlZCBieSBNYXR0ZXIuRGV0ZWN0b3JcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7fSBzdGFydENvbFxuICAgICAqIEBwYXJhbSB7fSBlbmRDb2xcbiAgICAgKiBAcGFyYW0ge30gc3RhcnRSb3dcbiAgICAgKiBAcGFyYW0ge30gZW5kUm93XG4gICAgICogQHJldHVybiB7fSByZWdpb25cbiAgICAgKi9cbiAgICBHcmlkLl9jcmVhdGVSZWdpb24gPSBmdW5jdGlvbihzdGFydENvbCwgZW5kQ29sLCBzdGFydFJvdywgZW5kUm93KSB7XG4gICAgICAgIHJldHVybiB7IFxuICAgICAgICAgICAgaWQ6IHN0YXJ0Q29sICsgJywnICsgZW5kQ29sICsgJywnICsgc3RhcnRSb3cgKyAnLCcgKyBlbmRSb3csXG4gICAgICAgICAgICBzdGFydENvbDogc3RhcnRDb2wsIFxuICAgICAgICAgICAgZW5kQ29sOiBlbmRDb2wsIFxuICAgICAgICAgICAgc3RhcnRSb3c6IHN0YXJ0Um93LCBcbiAgICAgICAgICAgIGVuZFJvdzogZW5kUm93IFxuICAgICAgICB9O1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBidWNrZXQgaWQgYXQgdGhlIGdpdmVuIHBvc2l0aW9uLlxuICAgICAqIEBtZXRob2QgX2dldEJ1Y2tldElkXG4gICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgYnkgTWF0dGVyLkRldGVjdG9yXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge30gY29sdW1uXG4gICAgICogQHBhcmFtIHt9IHJvd1xuICAgICAqIEByZXR1cm4ge3N0cmluZ30gYnVja2V0IGlkXG4gICAgICovXG4gICAgR3JpZC5fZ2V0QnVja2V0SWQgPSBmdW5jdGlvbihjb2x1bW4sIHJvdykge1xuICAgICAgICByZXR1cm4gJ0MnICsgY29sdW1uICsgJ1InICsgcm93O1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgYnVja2V0LlxuICAgICAqIEBtZXRob2QgX2NyZWF0ZUJ1Y2tldFxuICAgICAqIEBkZXByZWNhdGVkIHJlcGxhY2VkIGJ5IE1hdHRlci5EZXRlY3RvclxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHt9IGJ1Y2tldHNcbiAgICAgKiBAcGFyYW0ge30gYnVja2V0SWRcbiAgICAgKiBAcmV0dXJuIHt9IGJ1Y2tldFxuICAgICAqL1xuICAgIEdyaWQuX2NyZWF0ZUJ1Y2tldCA9IGZ1bmN0aW9uKGJ1Y2tldHMsIGJ1Y2tldElkKSB7XG4gICAgICAgIHZhciBidWNrZXQgPSBidWNrZXRzW2J1Y2tldElkXSA9IFtdO1xuICAgICAgICByZXR1cm4gYnVja2V0O1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBBZGRzIGEgYm9keSB0byBhIGJ1Y2tldC5cbiAgICAgKiBAbWV0aG9kIF9idWNrZXRBZGRCb2R5XG4gICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgYnkgTWF0dGVyLkRldGVjdG9yXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge30gZ3JpZFxuICAgICAqIEBwYXJhbSB7fSBidWNrZXRcbiAgICAgKiBAcGFyYW0ge30gYm9keVxuICAgICAqL1xuICAgIEdyaWQuX2J1Y2tldEFkZEJvZHkgPSBmdW5jdGlvbihncmlkLCBidWNrZXQsIGJvZHkpIHtcbiAgICAgICAgdmFyIGdyaWRQYWlycyA9IGdyaWQucGFpcnMsXG4gICAgICAgICAgICBwYWlySWQgPSBQYWlyLmlkLFxuICAgICAgICAgICAgYnVja2V0TGVuZ3RoID0gYnVja2V0Lmxlbmd0aCxcbiAgICAgICAgICAgIGk7XG5cbiAgICAgICAgLy8gYWRkIG5ldyBwYWlyc1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYnVja2V0TGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBib2R5QiA9IGJ1Y2tldFtpXTtcblxuICAgICAgICAgICAgaWYgKGJvZHkuaWQgPT09IGJvZHlCLmlkIHx8IChib2R5LmlzU3RhdGljICYmIGJvZHlCLmlzU3RhdGljKSlcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcblxuICAgICAgICAgICAgLy8ga2VlcCB0cmFjayBvZiB0aGUgbnVtYmVyIG9mIGJ1Y2tldHMgdGhlIHBhaXIgZXhpc3RzIGluXG4gICAgICAgICAgICAvLyBpbXBvcnRhbnQgZm9yIEdyaWQudXBkYXRlIHRvIHdvcmtcbiAgICAgICAgICAgIHZhciBpZCA9IHBhaXJJZChib2R5LCBib2R5QiksXG4gICAgICAgICAgICAgICAgcGFpciA9IGdyaWRQYWlyc1tpZF07XG5cbiAgICAgICAgICAgIGlmIChwYWlyKSB7XG4gICAgICAgICAgICAgICAgcGFpclsyXSArPSAxO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBncmlkUGFpcnNbaWRdID0gW2JvZHksIGJvZHlCLCAxXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGFkZCB0byBib2RpZXMgKGFmdGVyIHBhaXJzLCBvdGhlcndpc2UgcGFpcnMgd2l0aCBzZWxmKVxuICAgICAgICBidWNrZXQucHVzaChib2R5KTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBhIGJvZHkgZnJvbSBhIGJ1Y2tldC5cbiAgICAgKiBAbWV0aG9kIF9idWNrZXRSZW1vdmVCb2R5XG4gICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgYnkgTWF0dGVyLkRldGVjdG9yXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge30gZ3JpZFxuICAgICAqIEBwYXJhbSB7fSBidWNrZXRcbiAgICAgKiBAcGFyYW0ge30gYm9keVxuICAgICAqL1xuICAgIEdyaWQuX2J1Y2tldFJlbW92ZUJvZHkgPSBmdW5jdGlvbihncmlkLCBidWNrZXQsIGJvZHkpIHtcbiAgICAgICAgdmFyIGdyaWRQYWlycyA9IGdyaWQucGFpcnMsXG4gICAgICAgICAgICBwYWlySWQgPSBQYWlyLmlkLFxuICAgICAgICAgICAgaTtcblxuICAgICAgICAvLyByZW1vdmUgZnJvbSBidWNrZXRcbiAgICAgICAgYnVja2V0LnNwbGljZShDb21tb24uaW5kZXhPZihidWNrZXQsIGJvZHkpLCAxKTtcblxuICAgICAgICB2YXIgYnVja2V0TGVuZ3RoID0gYnVja2V0Lmxlbmd0aDtcblxuICAgICAgICAvLyB1cGRhdGUgcGFpciBjb3VudHNcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGJ1Y2tldExlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAvLyBrZWVwIHRyYWNrIG9mIHRoZSBudW1iZXIgb2YgYnVja2V0cyB0aGUgcGFpciBleGlzdHMgaW5cbiAgICAgICAgICAgIC8vIGltcG9ydGFudCBmb3IgX2NyZWF0ZUFjdGl2ZVBhaXJzTGlzdCB0byB3b3JrXG4gICAgICAgICAgICB2YXIgcGFpciA9IGdyaWRQYWlyc1twYWlySWQoYm9keSwgYnVja2V0W2ldKV07XG5cbiAgICAgICAgICAgIGlmIChwYWlyKVxuICAgICAgICAgICAgICAgIHBhaXJbMl0gLT0gMTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBHZW5lcmF0ZXMgYSBsaXN0IG9mIHRoZSBhY3RpdmUgcGFpcnMgaW4gdGhlIGdyaWQuXG4gICAgICogQG1ldGhvZCBfY3JlYXRlQWN0aXZlUGFpcnNMaXN0XG4gICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgYnkgTWF0dGVyLkRldGVjdG9yXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge30gZ3JpZFxuICAgICAqIEByZXR1cm4gW10gcGFpcnNcbiAgICAgKi9cbiAgICBHcmlkLl9jcmVhdGVBY3RpdmVQYWlyc0xpc3QgPSBmdW5jdGlvbihncmlkKSB7XG4gICAgICAgIHZhciBwYWlyLFxuICAgICAgICAgICAgZ3JpZFBhaXJzID0gZ3JpZC5wYWlycyxcbiAgICAgICAgICAgIHBhaXJLZXlzID0gQ29tbW9uLmtleXMoZ3JpZFBhaXJzKSxcbiAgICAgICAgICAgIHBhaXJLZXlzTGVuZ3RoID0gcGFpcktleXMubGVuZ3RoLFxuICAgICAgICAgICAgcGFpcnMgPSBbXSxcbiAgICAgICAgICAgIGs7XG5cbiAgICAgICAgLy8gaXRlcmF0ZSBvdmVyIGdyaWQucGFpcnNcbiAgICAgICAgZm9yIChrID0gMDsgayA8IHBhaXJLZXlzTGVuZ3RoOyBrKyspIHtcbiAgICAgICAgICAgIHBhaXIgPSBncmlkUGFpcnNbcGFpcktleXNba11dO1xuXG4gICAgICAgICAgICAvLyBpZiBwYWlyIGV4aXN0cyBpbiBhdCBsZWFzdCBvbmUgYnVja2V0XG4gICAgICAgICAgICAvLyBpdCBpcyBhIHBhaXIgdGhhdCBuZWVkcyBmdXJ0aGVyIGNvbGxpc2lvbiB0ZXN0aW5nIHNvIHB1c2ggaXRcbiAgICAgICAgICAgIGlmIChwYWlyWzJdID4gMCkge1xuICAgICAgICAgICAgICAgIHBhaXJzLnB1c2gocGFpcik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGRlbGV0ZSBncmlkUGFpcnNbcGFpcktleXNba11dO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHBhaXJzO1xuICAgIH07XG4gICAgXG59KSgpO1xuXG5cbi8qKiovIH0pLFxuLyogMjUgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuLyoqXG4qIFRoZSBgTWF0dGVyLk1vdXNlQ29uc3RyYWludGAgbW9kdWxlIGNvbnRhaW5zIG1ldGhvZHMgZm9yIGNyZWF0aW5nIG1vdXNlIGNvbnN0cmFpbnRzLlxuKiBNb3VzZSBjb25zdHJhaW50cyBhcmUgdXNlZCBmb3IgYWxsb3dpbmcgdXNlciBpbnRlcmFjdGlvbiwgcHJvdmlkaW5nIHRoZSBhYmlsaXR5IHRvIG1vdmUgYm9kaWVzIHZpYSB0aGUgbW91c2Ugb3IgdG91Y2guXG4qXG4qIFNlZSB0aGUgaW5jbHVkZWQgdXNhZ2UgW2V4YW1wbGVzXShodHRwczovL2dpdGh1Yi5jb20vbGlhYnJ1L21hdHRlci1qcy90cmVlL21hc3Rlci9leGFtcGxlcykuXG4qXG4qIEBjbGFzcyBNb3VzZUNvbnN0cmFpbnRcbiovXG5cbnZhciBNb3VzZUNvbnN0cmFpbnQgPSB7fTtcblxubW9kdWxlLmV4cG9ydHMgPSBNb3VzZUNvbnN0cmFpbnQ7XG5cbnZhciBWZXJ0aWNlcyA9IF9fd2VicGFja19yZXF1aXJlX18oMyk7XG52YXIgU2xlZXBpbmcgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDcpO1xudmFyIE1vdXNlID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMyk7XG52YXIgRXZlbnRzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0KTtcbnZhciBEZXRlY3RvciA9IF9fd2VicGFja19yZXF1aXJlX18oMTQpO1xudmFyIENvbnN0cmFpbnQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEwKTtcbnZhciBDb21wb3NpdGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDUpO1xudmFyIENvbW1vbiA9IF9fd2VicGFja19yZXF1aXJlX18oMCk7XG52YXIgQm91bmRzID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKTtcblxuKGZ1bmN0aW9uKCkge1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBtb3VzZSBjb25zdHJhaW50LlxuICAgICAqIEFsbCBwcm9wZXJ0aWVzIGhhdmUgZGVmYXVsdCB2YWx1ZXMsIGFuZCBtYW55IGFyZSBwcmUtY2FsY3VsYXRlZCBhdXRvbWF0aWNhbGx5IGJhc2VkIG9uIG90aGVyIHByb3BlcnRpZXMuXG4gICAgICogU2VlIHRoZSBwcm9wZXJ0aWVzIHNlY3Rpb24gYmVsb3cgZm9yIGRldGFpbGVkIGluZm9ybWF0aW9uIG9uIHdoYXQgeW91IGNhbiBwYXNzIHZpYSB0aGUgYG9wdGlvbnNgIG9iamVjdC5cbiAgICAgKiBAbWV0aG9kIGNyZWF0ZVxuICAgICAqIEBwYXJhbSB7ZW5naW5lfSBlbmdpbmVcbiAgICAgKiBAcGFyYW0ge30gb3B0aW9uc1xuICAgICAqIEByZXR1cm4ge01vdXNlQ29uc3RyYWludH0gQSBuZXcgTW91c2VDb25zdHJhaW50XG4gICAgICovXG4gICAgTW91c2VDb25zdHJhaW50LmNyZWF0ZSA9IGZ1bmN0aW9uKGVuZ2luZSwgb3B0aW9ucykge1xuICAgICAgICB2YXIgbW91c2UgPSAoZW5naW5lID8gZW5naW5lLm1vdXNlIDogbnVsbCkgfHwgKG9wdGlvbnMgPyBvcHRpb25zLm1vdXNlIDogbnVsbCk7XG5cbiAgICAgICAgaWYgKCFtb3VzZSkge1xuICAgICAgICAgICAgaWYgKGVuZ2luZSAmJiBlbmdpbmUucmVuZGVyICYmIGVuZ2luZS5yZW5kZXIuY2FudmFzKSB7XG4gICAgICAgICAgICAgICAgbW91c2UgPSBNb3VzZS5jcmVhdGUoZW5naW5lLnJlbmRlci5jYW52YXMpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChvcHRpb25zICYmIG9wdGlvbnMuZWxlbWVudCkge1xuICAgICAgICAgICAgICAgIG1vdXNlID0gTW91c2UuY3JlYXRlKG9wdGlvbnMuZWxlbWVudCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIG1vdXNlID0gTW91c2UuY3JlYXRlKCk7XG4gICAgICAgICAgICAgICAgQ29tbW9uLndhcm4oJ01vdXNlQ29uc3RyYWludC5jcmVhdGU6IG9wdGlvbnMubW91c2Ugd2FzIHVuZGVmaW5lZCwgb3B0aW9ucy5lbGVtZW50IHdhcyB1bmRlZmluZWQsIG1heSBub3QgZnVuY3Rpb24gYXMgZXhwZWN0ZWQnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBjb25zdHJhaW50ID0gQ29uc3RyYWludC5jcmVhdGUoeyBcbiAgICAgICAgICAgIGxhYmVsOiAnTW91c2UgQ29uc3RyYWludCcsXG4gICAgICAgICAgICBwb2ludEE6IG1vdXNlLnBvc2l0aW9uLFxuICAgICAgICAgICAgcG9pbnRCOiB7IHg6IDAsIHk6IDAgfSxcbiAgICAgICAgICAgIGxlbmd0aDogMC4wMSwgXG4gICAgICAgICAgICBzdGlmZm5lc3M6IDAuMSxcbiAgICAgICAgICAgIGFuZ3VsYXJTdGlmZm5lc3M6IDEsXG4gICAgICAgICAgICByZW5kZXI6IHtcbiAgICAgICAgICAgICAgICBzdHJva2VTdHlsZTogJyM5MEVFOTAnLFxuICAgICAgICAgICAgICAgIGxpbmVXaWR0aDogM1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICB2YXIgZGVmYXVsdHMgPSB7XG4gICAgICAgICAgICB0eXBlOiAnbW91c2VDb25zdHJhaW50JyxcbiAgICAgICAgICAgIG1vdXNlOiBtb3VzZSxcbiAgICAgICAgICAgIGVsZW1lbnQ6IG51bGwsXG4gICAgICAgICAgICBib2R5OiBudWxsLFxuICAgICAgICAgICAgY29uc3RyYWludDogY29uc3RyYWludCxcbiAgICAgICAgICAgIGNvbGxpc2lvbkZpbHRlcjoge1xuICAgICAgICAgICAgICAgIGNhdGVnb3J5OiAweDAwMDEsXG4gICAgICAgICAgICAgICAgbWFzazogMHhGRkZGRkZGRixcbiAgICAgICAgICAgICAgICBncm91cDogMFxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIHZhciBtb3VzZUNvbnN0cmFpbnQgPSBDb21tb24uZXh0ZW5kKGRlZmF1bHRzLCBvcHRpb25zKTtcblxuICAgICAgICBFdmVudHMub24oZW5naW5lLCAnYmVmb3JlVXBkYXRlJywgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB2YXIgYWxsQm9kaWVzID0gQ29tcG9zaXRlLmFsbEJvZGllcyhlbmdpbmUud29ybGQpO1xuICAgICAgICAgICAgTW91c2VDb25zdHJhaW50LnVwZGF0ZShtb3VzZUNvbnN0cmFpbnQsIGFsbEJvZGllcyk7XG4gICAgICAgICAgICBNb3VzZUNvbnN0cmFpbnQuX3RyaWdnZXJFdmVudHMobW91c2VDb25zdHJhaW50KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIG1vdXNlQ29uc3RyYWludDtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogVXBkYXRlcyB0aGUgZ2l2ZW4gbW91c2UgY29uc3RyYWludC5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBtZXRob2QgdXBkYXRlXG4gICAgICogQHBhcmFtIHtNb3VzZUNvbnN0cmFpbnR9IG1vdXNlQ29uc3RyYWludFxuICAgICAqIEBwYXJhbSB7Ym9keVtdfSBib2RpZXNcbiAgICAgKi9cbiAgICBNb3VzZUNvbnN0cmFpbnQudXBkYXRlID0gZnVuY3Rpb24obW91c2VDb25zdHJhaW50LCBib2RpZXMpIHtcbiAgICAgICAgdmFyIG1vdXNlID0gbW91c2VDb25zdHJhaW50Lm1vdXNlLFxuICAgICAgICAgICAgY29uc3RyYWludCA9IG1vdXNlQ29uc3RyYWludC5jb25zdHJhaW50LFxuICAgICAgICAgICAgYm9keSA9IG1vdXNlQ29uc3RyYWludC5ib2R5O1xuXG4gICAgICAgIGlmIChtb3VzZS5idXR0b24gPT09IDApIHtcbiAgICAgICAgICAgIGlmICghY29uc3RyYWludC5ib2R5Qikge1xuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYm9kaWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGJvZHkgPSBib2RpZXNbaV07XG4gICAgICAgICAgICAgICAgICAgIGlmIChCb3VuZHMuY29udGFpbnMoYm9keS5ib3VuZHMsIG1vdXNlLnBvc2l0aW9uKSBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBEZXRlY3Rvci5jYW5Db2xsaWRlKGJvZHkuY29sbGlzaW9uRmlsdGVyLCBtb3VzZUNvbnN0cmFpbnQuY29sbGlzaW9uRmlsdGVyKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaiA9IGJvZHkucGFydHMubGVuZ3RoID4gMSA/IDEgOiAwOyBqIDwgYm9keS5wYXJ0cy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwYXJ0ID0gYm9keS5wYXJ0c1tqXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoVmVydGljZXMuY29udGFpbnMocGFydC52ZXJ0aWNlcywgbW91c2UucG9zaXRpb24pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0cmFpbnQucG9pbnRBID0gbW91c2UucG9zaXRpb247XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0cmFpbnQuYm9keUIgPSBtb3VzZUNvbnN0cmFpbnQuYm9keSA9IGJvZHk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0cmFpbnQucG9pbnRCID0geyB4OiBtb3VzZS5wb3NpdGlvbi54IC0gYm9keS5wb3NpdGlvbi54LCB5OiBtb3VzZS5wb3NpdGlvbi55IC0gYm9keS5wb3NpdGlvbi55IH07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0cmFpbnQuYW5nbGVCID0gYm9keS5hbmdsZTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbGVlcGluZy5zZXQoYm9keSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFdmVudHMudHJpZ2dlcihtb3VzZUNvbnN0cmFpbnQsICdzdGFydGRyYWcnLCB7IG1vdXNlOiBtb3VzZSwgYm9keTogYm9keSB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIFNsZWVwaW5nLnNldChjb25zdHJhaW50LmJvZHlCLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgY29uc3RyYWludC5wb2ludEEgPSBtb3VzZS5wb3NpdGlvbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0cmFpbnQuYm9keUIgPSBtb3VzZUNvbnN0cmFpbnQuYm9keSA9IG51bGw7XG4gICAgICAgICAgICBjb25zdHJhaW50LnBvaW50QiA9IG51bGw7XG5cbiAgICAgICAgICAgIGlmIChib2R5KVxuICAgICAgICAgICAgICAgIEV2ZW50cy50cmlnZ2VyKG1vdXNlQ29uc3RyYWludCwgJ2VuZGRyYWcnLCB7IG1vdXNlOiBtb3VzZSwgYm9keTogYm9keSB9KTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBUcmlnZ2VycyBtb3VzZSBjb25zdHJhaW50IGV2ZW50cy5cbiAgICAgKiBAbWV0aG9kIF90cmlnZ2VyRXZlbnRzXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge21vdXNlfSBtb3VzZUNvbnN0cmFpbnRcbiAgICAgKi9cbiAgICBNb3VzZUNvbnN0cmFpbnQuX3RyaWdnZXJFdmVudHMgPSBmdW5jdGlvbihtb3VzZUNvbnN0cmFpbnQpIHtcbiAgICAgICAgdmFyIG1vdXNlID0gbW91c2VDb25zdHJhaW50Lm1vdXNlLFxuICAgICAgICAgICAgbW91c2VFdmVudHMgPSBtb3VzZS5zb3VyY2VFdmVudHM7XG5cbiAgICAgICAgaWYgKG1vdXNlRXZlbnRzLm1vdXNlbW92ZSlcbiAgICAgICAgICAgIEV2ZW50cy50cmlnZ2VyKG1vdXNlQ29uc3RyYWludCwgJ21vdXNlbW92ZScsIHsgbW91c2U6IG1vdXNlIH0pO1xuXG4gICAgICAgIGlmIChtb3VzZUV2ZW50cy5tb3VzZWRvd24pXG4gICAgICAgICAgICBFdmVudHMudHJpZ2dlcihtb3VzZUNvbnN0cmFpbnQsICdtb3VzZWRvd24nLCB7IG1vdXNlOiBtb3VzZSB9KTtcblxuICAgICAgICBpZiAobW91c2VFdmVudHMubW91c2V1cClcbiAgICAgICAgICAgIEV2ZW50cy50cmlnZ2VyKG1vdXNlQ29uc3RyYWludCwgJ21vdXNldXAnLCB7IG1vdXNlOiBtb3VzZSB9KTtcblxuICAgICAgICAvLyByZXNldCB0aGUgbW91c2Ugc3RhdGUgcmVhZHkgZm9yIHRoZSBuZXh0IHN0ZXBcbiAgICAgICAgTW91c2UuY2xlYXJTb3VyY2VFdmVudHMobW91c2UpO1xuICAgIH07XG5cbiAgICAvKlxuICAgICpcbiAgICAqICBFdmVudHMgRG9jdW1lbnRhdGlvblxuICAgICpcbiAgICAqL1xuXG4gICAgLyoqXG4gICAgKiBGaXJlZCB3aGVuIHRoZSBtb3VzZSBoYXMgbW92ZWQgKG9yIGEgdG91Y2ggbW92ZXMpIGR1cmluZyB0aGUgbGFzdCBzdGVwXG4gICAgKlxuICAgICogQGV2ZW50IG1vdXNlbW92ZVxuICAgICogQHBhcmFtIHt9IGV2ZW50IEFuIGV2ZW50IG9iamVjdFxuICAgICogQHBhcmFtIHttb3VzZX0gZXZlbnQubW91c2UgVGhlIGVuZ2luZSdzIG1vdXNlIGluc3RhbmNlXG4gICAgKiBAcGFyYW0ge30gZXZlbnQuc291cmNlIFRoZSBzb3VyY2Ugb2JqZWN0IG9mIHRoZSBldmVudFxuICAgICogQHBhcmFtIHt9IGV2ZW50Lm5hbWUgVGhlIG5hbWUgb2YgdGhlIGV2ZW50XG4gICAgKi9cblxuICAgIC8qKlxuICAgICogRmlyZWQgd2hlbiB0aGUgbW91c2UgaXMgZG93biAob3IgYSB0b3VjaCBoYXMgc3RhcnRlZCkgZHVyaW5nIHRoZSBsYXN0IHN0ZXBcbiAgICAqXG4gICAgKiBAZXZlbnQgbW91c2Vkb3duXG4gICAgKiBAcGFyYW0ge30gZXZlbnQgQW4gZXZlbnQgb2JqZWN0XG4gICAgKiBAcGFyYW0ge21vdXNlfSBldmVudC5tb3VzZSBUaGUgZW5naW5lJ3MgbW91c2UgaW5zdGFuY2VcbiAgICAqIEBwYXJhbSB7fSBldmVudC5zb3VyY2UgVGhlIHNvdXJjZSBvYmplY3Qgb2YgdGhlIGV2ZW50XG4gICAgKiBAcGFyYW0ge30gZXZlbnQubmFtZSBUaGUgbmFtZSBvZiB0aGUgZXZlbnRcbiAgICAqL1xuXG4gICAgLyoqXG4gICAgKiBGaXJlZCB3aGVuIHRoZSBtb3VzZSBpcyB1cCAob3IgYSB0b3VjaCBoYXMgZW5kZWQpIGR1cmluZyB0aGUgbGFzdCBzdGVwXG4gICAgKlxuICAgICogQGV2ZW50IG1vdXNldXBcbiAgICAqIEBwYXJhbSB7fSBldmVudCBBbiBldmVudCBvYmplY3RcbiAgICAqIEBwYXJhbSB7bW91c2V9IGV2ZW50Lm1vdXNlIFRoZSBlbmdpbmUncyBtb3VzZSBpbnN0YW5jZVxuICAgICogQHBhcmFtIHt9IGV2ZW50LnNvdXJjZSBUaGUgc291cmNlIG9iamVjdCBvZiB0aGUgZXZlbnRcbiAgICAqIEBwYXJhbSB7fSBldmVudC5uYW1lIFRoZSBuYW1lIG9mIHRoZSBldmVudFxuICAgICovXG5cbiAgICAvKipcbiAgICAqIEZpcmVkIHdoZW4gdGhlIHVzZXIgc3RhcnRzIGRyYWdnaW5nIGEgYm9keVxuICAgICpcbiAgICAqIEBldmVudCBzdGFydGRyYWdcbiAgICAqIEBwYXJhbSB7fSBldmVudCBBbiBldmVudCBvYmplY3RcbiAgICAqIEBwYXJhbSB7bW91c2V9IGV2ZW50Lm1vdXNlIFRoZSBlbmdpbmUncyBtb3VzZSBpbnN0YW5jZVxuICAgICogQHBhcmFtIHtib2R5fSBldmVudC5ib2R5IFRoZSBib2R5IGJlaW5nIGRyYWdnZWRcbiAgICAqIEBwYXJhbSB7fSBldmVudC5zb3VyY2UgVGhlIHNvdXJjZSBvYmplY3Qgb2YgdGhlIGV2ZW50XG4gICAgKiBAcGFyYW0ge30gZXZlbnQubmFtZSBUaGUgbmFtZSBvZiB0aGUgZXZlbnRcbiAgICAqL1xuXG4gICAgLyoqXG4gICAgKiBGaXJlZCB3aGVuIHRoZSB1c2VyIGVuZHMgZHJhZ2dpbmcgYSBib2R5XG4gICAgKlxuICAgICogQGV2ZW50IGVuZGRyYWdcbiAgICAqIEBwYXJhbSB7fSBldmVudCBBbiBldmVudCBvYmplY3RcbiAgICAqIEBwYXJhbSB7bW91c2V9IGV2ZW50Lm1vdXNlIFRoZSBlbmdpbmUncyBtb3VzZSBpbnN0YW5jZVxuICAgICogQHBhcmFtIHtib2R5fSBldmVudC5ib2R5IFRoZSBib2R5IHRoYXQgaGFzIHN0b3BwZWQgYmVpbmcgZHJhZ2dlZFxuICAgICogQHBhcmFtIHt9IGV2ZW50LnNvdXJjZSBUaGUgc291cmNlIG9iamVjdCBvZiB0aGUgZXZlbnRcbiAgICAqIEBwYXJhbSB7fSBldmVudC5uYW1lIFRoZSBuYW1lIG9mIHRoZSBldmVudFxuICAgICovXG5cbiAgICAvKlxuICAgICpcbiAgICAqICBQcm9wZXJ0aWVzIERvY3VtZW50YXRpb25cbiAgICAqXG4gICAgKi9cblxuICAgIC8qKlxuICAgICAqIEEgYFN0cmluZ2AgZGVub3RpbmcgdGhlIHR5cGUgb2Ygb2JqZWN0LlxuICAgICAqXG4gICAgICogQHByb3BlcnR5IHR5cGVcbiAgICAgKiBAdHlwZSBzdHJpbmdcbiAgICAgKiBAZGVmYXVsdCBcImNvbnN0cmFpbnRcIlxuICAgICAqIEByZWFkT25seVxuICAgICAqL1xuXG4gICAgLyoqXG4gICAgICogVGhlIGBNb3VzZWAgaW5zdGFuY2UgaW4gdXNlLiBJZiBub3Qgc3VwcGxpZWQgaW4gYE1vdXNlQ29uc3RyYWludC5jcmVhdGVgLCBvbmUgd2lsbCBiZSBjcmVhdGVkLlxuICAgICAqXG4gICAgICogQHByb3BlcnR5IG1vdXNlXG4gICAgICogQHR5cGUgbW91c2VcbiAgICAgKiBAZGVmYXVsdCBtb3VzZVxuICAgICAqL1xuXG4gICAgLyoqXG4gICAgICogVGhlIGBCb2R5YCB0aGF0IGlzIGN1cnJlbnRseSBiZWluZyBtb3ZlZCBieSB0aGUgdXNlciwgb3IgYG51bGxgIGlmIG5vIGJvZHkuXG4gICAgICpcbiAgICAgKiBAcHJvcGVydHkgYm9keVxuICAgICAqIEB0eXBlIGJvZHlcbiAgICAgKiBAZGVmYXVsdCBudWxsXG4gICAgICovXG5cbiAgICAvKipcbiAgICAgKiBUaGUgYENvbnN0cmFpbnRgIG9iamVjdCB0aGF0IGlzIHVzZWQgdG8gbW92ZSB0aGUgYm9keSBkdXJpbmcgaW50ZXJhY3Rpb24uXG4gICAgICpcbiAgICAgKiBAcHJvcGVydHkgY29uc3RyYWludFxuICAgICAqIEB0eXBlIGNvbnN0cmFpbnRcbiAgICAgKi9cblxuICAgIC8qKlxuICAgICAqIEFuIGBPYmplY3RgIHRoYXQgc3BlY2lmaWVzIHRoZSBjb2xsaXNpb24gZmlsdGVyIHByb3BlcnRpZXMuXG4gICAgICogVGhlIGNvbGxpc2lvbiBmaWx0ZXIgYWxsb3dzIHRoZSB1c2VyIHRvIGRlZmluZSB3aGljaCB0eXBlcyBvZiBib2R5IHRoaXMgbW91c2UgY29uc3RyYWludCBjYW4gaW50ZXJhY3Qgd2l0aC5cbiAgICAgKiBTZWUgYGJvZHkuY29sbGlzaW9uRmlsdGVyYCBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbiAgICAgKlxuICAgICAqIEBwcm9wZXJ0eSBjb2xsaXNpb25GaWx0ZXJcbiAgICAgKiBAdHlwZSBvYmplY3RcbiAgICAgKi9cblxufSkoKTtcblxuXG4vKioqLyB9KSxcbi8qIDI2ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cbi8qKlxuKiBUaGUgYE1hdHRlci5RdWVyeWAgbW9kdWxlIGNvbnRhaW5zIG1ldGhvZHMgZm9yIHBlcmZvcm1pbmcgY29sbGlzaW9uIHF1ZXJpZXMuXG4qXG4qIFNlZSB0aGUgaW5jbHVkZWQgdXNhZ2UgW2V4YW1wbGVzXShodHRwczovL2dpdGh1Yi5jb20vbGlhYnJ1L21hdHRlci1qcy90cmVlL21hc3Rlci9leGFtcGxlcykuXG4qXG4qIEBjbGFzcyBRdWVyeVxuKi9cblxudmFyIFF1ZXJ5ID0ge307XG5cbm1vZHVsZS5leHBvcnRzID0gUXVlcnk7XG5cbnZhciBWZWN0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIpO1xudmFyIENvbGxpc2lvbiA9IF9fd2VicGFja19yZXF1aXJlX18oOCk7XG52YXIgQm91bmRzID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKTtcbnZhciBCb2RpZXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEyKTtcbnZhciBWZXJ0aWNlcyA9IF9fd2VicGFja19yZXF1aXJlX18oMyk7XG5cbihmdW5jdGlvbigpIHtcblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBsaXN0IG9mIGNvbGxpc2lvbnMgYmV0d2VlbiBgYm9keWAgYW5kIGBib2RpZXNgLlxuICAgICAqIEBtZXRob2QgY29sbGlkZXNcbiAgICAgKiBAcGFyYW0ge2JvZHl9IGJvZHlcbiAgICAgKiBAcGFyYW0ge2JvZHlbXX0gYm9kaWVzXG4gICAgICogQHJldHVybiB7Y29sbGlzaW9uW119IENvbGxpc2lvbnNcbiAgICAgKi9cbiAgICBRdWVyeS5jb2xsaWRlcyA9IGZ1bmN0aW9uKGJvZHksIGJvZGllcykge1xuICAgICAgICB2YXIgY29sbGlzaW9ucyA9IFtdLFxuICAgICAgICAgICAgYm9kaWVzTGVuZ3RoID0gYm9kaWVzLmxlbmd0aCxcbiAgICAgICAgICAgIGJvdW5kcyA9IGJvZHkuYm91bmRzLFxuICAgICAgICAgICAgY29sbGlkZXMgPSBDb2xsaXNpb24uY29sbGlkZXMsXG4gICAgICAgICAgICBvdmVybGFwcyA9IEJvdW5kcy5vdmVybGFwcztcblxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGJvZGllc0xlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgYm9keUEgPSBib2RpZXNbaV0sXG4gICAgICAgICAgICAgICAgcGFydHNBTGVuZ3RoID0gYm9keUEucGFydHMubGVuZ3RoLFxuICAgICAgICAgICAgICAgIHBhcnRzQVN0YXJ0ID0gcGFydHNBTGVuZ3RoID09PSAxID8gMCA6IDE7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmIChvdmVybGFwcyhib2R5QS5ib3VuZHMsIGJvdW5kcykpIHtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBqID0gcGFydHNBU3RhcnQ7IGogPCBwYXJ0c0FMZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgICAgICB2YXIgcGFydCA9IGJvZHlBLnBhcnRzW2pdO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChvdmVybGFwcyhwYXJ0LmJvdW5kcywgYm91bmRzKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNvbGxpc2lvbiA9IGNvbGxpZGVzKHBhcnQsIGJvZHkpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29sbGlzaW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbGlzaW9ucy5wdXNoKGNvbGxpc2lvbik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY29sbGlzaW9ucztcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQ2FzdHMgYSByYXkgc2VnbWVudCBhZ2FpbnN0IGEgc2V0IG9mIGJvZGllcyBhbmQgcmV0dXJucyBhbGwgY29sbGlzaW9ucywgcmF5IHdpZHRoIGlzIG9wdGlvbmFsLiBJbnRlcnNlY3Rpb24gcG9pbnRzIGFyZSBub3QgcHJvdmlkZWQuXG4gICAgICogQG1ldGhvZCByYXlcbiAgICAgKiBAcGFyYW0ge2JvZHlbXX0gYm9kaWVzXG4gICAgICogQHBhcmFtIHt2ZWN0b3J9IHN0YXJ0UG9pbnRcbiAgICAgKiBAcGFyYW0ge3ZlY3Rvcn0gZW5kUG9pbnRcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3JheVdpZHRoXVxuICAgICAqIEByZXR1cm4ge2NvbGxpc2lvbltdfSBDb2xsaXNpb25zXG4gICAgICovXG4gICAgUXVlcnkucmF5ID0gZnVuY3Rpb24oYm9kaWVzLCBzdGFydFBvaW50LCBlbmRQb2ludCwgcmF5V2lkdGgpIHtcbiAgICAgICAgcmF5V2lkdGggPSByYXlXaWR0aCB8fCAxZS0xMDA7XG5cbiAgICAgICAgdmFyIHJheUFuZ2xlID0gVmVjdG9yLmFuZ2xlKHN0YXJ0UG9pbnQsIGVuZFBvaW50KSxcbiAgICAgICAgICAgIHJheUxlbmd0aCA9IFZlY3Rvci5tYWduaXR1ZGUoVmVjdG9yLnN1YihzdGFydFBvaW50LCBlbmRQb2ludCkpLFxuICAgICAgICAgICAgcmF5WCA9IChlbmRQb2ludC54ICsgc3RhcnRQb2ludC54KSAqIDAuNSxcbiAgICAgICAgICAgIHJheVkgPSAoZW5kUG9pbnQueSArIHN0YXJ0UG9pbnQueSkgKiAwLjUsXG4gICAgICAgICAgICByYXkgPSBCb2RpZXMucmVjdGFuZ2xlKHJheVgsIHJheVksIHJheUxlbmd0aCwgcmF5V2lkdGgsIHsgYW5nbGU6IHJheUFuZ2xlIH0pLFxuICAgICAgICAgICAgY29sbGlzaW9ucyA9IFF1ZXJ5LmNvbGxpZGVzKHJheSwgYm9kaWVzKTtcblxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbGxpc2lvbnMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgICAgIHZhciBjb2xsaXNpb24gPSBjb2xsaXNpb25zW2ldO1xuICAgICAgICAgICAgY29sbGlzaW9uLmJvZHkgPSBjb2xsaXNpb24uYm9keUIgPSBjb2xsaXNpb24uYm9keUE7ICAgICAgICAgICAgXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY29sbGlzaW9ucztcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhbGwgYm9kaWVzIHdob3NlIGJvdW5kcyBhcmUgaW5zaWRlIChvciBvdXRzaWRlIGlmIHNldCkgdGhlIGdpdmVuIHNldCBvZiBib3VuZHMsIGZyb20gdGhlIGdpdmVuIHNldCBvZiBib2RpZXMuXG4gICAgICogQG1ldGhvZCByZWdpb25cbiAgICAgKiBAcGFyYW0ge2JvZHlbXX0gYm9kaWVzXG4gICAgICogQHBhcmFtIHtib3VuZHN9IGJvdW5kc1xuICAgICAqIEBwYXJhbSB7Ym9vbH0gW291dHNpZGU9ZmFsc2VdXG4gICAgICogQHJldHVybiB7Ym9keVtdfSBUaGUgYm9kaWVzIG1hdGNoaW5nIHRoZSBxdWVyeVxuICAgICAqL1xuICAgIFF1ZXJ5LnJlZ2lvbiA9IGZ1bmN0aW9uKGJvZGllcywgYm91bmRzLCBvdXRzaWRlKSB7XG4gICAgICAgIHZhciByZXN1bHQgPSBbXTtcblxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGJvZGllcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIGJvZHkgPSBib2RpZXNbaV0sXG4gICAgICAgICAgICAgICAgb3ZlcmxhcHMgPSBCb3VuZHMub3ZlcmxhcHMoYm9keS5ib3VuZHMsIGJvdW5kcyk7XG4gICAgICAgICAgICBpZiAoKG92ZXJsYXBzICYmICFvdXRzaWRlKSB8fCAoIW92ZXJsYXBzICYmIG91dHNpZGUpKVxuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGJvZHkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhbGwgYm9kaWVzIHdob3NlIHZlcnRpY2VzIGNvbnRhaW4gdGhlIGdpdmVuIHBvaW50LCBmcm9tIHRoZSBnaXZlbiBzZXQgb2YgYm9kaWVzLlxuICAgICAqIEBtZXRob2QgcG9pbnRcbiAgICAgKiBAcGFyYW0ge2JvZHlbXX0gYm9kaWVzXG4gICAgICogQHBhcmFtIHt2ZWN0b3J9IHBvaW50XG4gICAgICogQHJldHVybiB7Ym9keVtdfSBUaGUgYm9kaWVzIG1hdGNoaW5nIHRoZSBxdWVyeVxuICAgICAqL1xuICAgIFF1ZXJ5LnBvaW50ID0gZnVuY3Rpb24oYm9kaWVzLCBwb2ludCkge1xuICAgICAgICB2YXIgcmVzdWx0ID0gW107XG5cbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBib2RpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBib2R5ID0gYm9kaWVzW2ldO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBpZiAoQm91bmRzLmNvbnRhaW5zKGJvZHkuYm91bmRzLCBwb2ludCkpIHtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBqID0gYm9keS5wYXJ0cy5sZW5ndGggPT09IDEgPyAwIDogMTsgaiA8IGJvZHkucGFydHMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHBhcnQgPSBib2R5LnBhcnRzW2pdO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChCb3VuZHMuY29udGFpbnMocGFydC5ib3VuZHMsIHBvaW50KVxuICAgICAgICAgICAgICAgICAgICAgICAgJiYgVmVydGljZXMuY29udGFpbnMocGFydC52ZXJ0aWNlcywgcG9pbnQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChib2R5KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuXG59KSgpO1xuXG5cbi8qKiovIH0pLFxuLyogMjcgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuLyoqXG4qIFRoZSBgTWF0dGVyLlJ1bm5lcmAgbW9kdWxlIGlzIGFuIG9wdGlvbmFsIHV0aWxpdHkgd2hpY2ggcHJvdmlkZXMgYSBnYW1lIGxvb3AsIFxuKiB0aGF0IGhhbmRsZXMgY29udGludW91c2x5IHVwZGF0aW5nIGEgYE1hdHRlci5FbmdpbmVgIGZvciB5b3Ugd2l0aGluIGEgYnJvd3Nlci5cbiogSXQgaXMgaW50ZW5kZWQgZm9yIGRldmVsb3BtZW50IGFuZCBkZWJ1Z2dpbmcgcHVycG9zZXMsIGJ1dCBtYXkgYWxzbyBiZSBzdWl0YWJsZSBmb3Igc2ltcGxlIGdhbWVzLlxuKiBJZiB5b3UgYXJlIHVzaW5nIHlvdXIgb3duIGdhbWUgbG9vcCBpbnN0ZWFkLCB0aGVuIHlvdSBkbyBub3QgbmVlZCB0aGUgYE1hdHRlci5SdW5uZXJgIG1vZHVsZS5cbiogSW5zdGVhZCBqdXN0IGNhbGwgYEVuZ2luZS51cGRhdGUoZW5naW5lLCBkZWx0YSlgIGluIHlvdXIgb3duIGxvb3AuXG4qXG4qIFNlZSB0aGUgaW5jbHVkZWQgdXNhZ2UgW2V4YW1wbGVzXShodHRwczovL2dpdGh1Yi5jb20vbGlhYnJ1L21hdHRlci1qcy90cmVlL21hc3Rlci9leGFtcGxlcykuXG4qXG4qIEBjbGFzcyBSdW5uZXJcbiovXG5cbnZhciBSdW5uZXIgPSB7fTtcblxubW9kdWxlLmV4cG9ydHMgPSBSdW5uZXI7XG5cbnZhciBFdmVudHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQpO1xudmFyIEVuZ2luZSA9IF9fd2VicGFja19yZXF1aXJlX18oMTgpO1xudmFyIENvbW1vbiA9IF9fd2VicGFja19yZXF1aXJlX18oMCk7XG5cbihmdW5jdGlvbigpIHtcblxuICAgIHZhciBfcmVxdWVzdEFuaW1hdGlvbkZyYW1lLFxuICAgICAgICBfY2FuY2VsQW5pbWF0aW9uRnJhbWU7XG5cbiAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgX3JlcXVlc3RBbmltYXRpb25GcmFtZSA9IHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUgfHwgd2luZG93LndlYmtpdFJlcXVlc3RBbmltYXRpb25GcmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCB3aW5kb3cubW96UmVxdWVzdEFuaW1hdGlvbkZyYW1lIHx8IHdpbmRvdy5tc1JlcXVlc3RBbmltYXRpb25GcmFtZTtcbiAgIFxuICAgICAgICBfY2FuY2VsQW5pbWF0aW9uRnJhbWUgPSB3aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWUgfHwgd2luZG93Lm1vekNhbmNlbEFuaW1hdGlvbkZyYW1lIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCB3aW5kb3cud2Via2l0Q2FuY2VsQW5pbWF0aW9uRnJhbWUgfHwgd2luZG93Lm1zQ2FuY2VsQW5pbWF0aW9uRnJhbWU7XG4gICAgfVxuXG4gICAgaWYgKCFfcmVxdWVzdEFuaW1hdGlvbkZyYW1lKSB7XG4gICAgICAgIHZhciBfZnJhbWVUaW1lb3V0O1xuXG4gICAgICAgIF9yZXF1ZXN0QW5pbWF0aW9uRnJhbWUgPSBmdW5jdGlvbihjYWxsYmFjayl7IFxuICAgICAgICAgICAgX2ZyYW1lVGltZW91dCA9IHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7IFxuICAgICAgICAgICAgICAgIGNhbGxiYWNrKENvbW1vbi5ub3coKSk7IFxuICAgICAgICAgICAgfSwgMTAwMCAvIDYwKTtcbiAgICAgICAgfTtcblxuICAgICAgICBfY2FuY2VsQW5pbWF0aW9uRnJhbWUgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChfZnJhbWVUaW1lb3V0KTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IFJ1bm5lci4gVGhlIG9wdGlvbnMgcGFyYW1ldGVyIGlzIGFuIG9iamVjdCB0aGF0IHNwZWNpZmllcyBhbnkgcHJvcGVydGllcyB5b3Ugd2lzaCB0byBvdmVycmlkZSB0aGUgZGVmYXVsdHMuXG4gICAgICogQG1ldGhvZCBjcmVhdGVcbiAgICAgKiBAcGFyYW0ge30gb3B0aW9uc1xuICAgICAqL1xuICAgIFJ1bm5lci5jcmVhdGUgPSBmdW5jdGlvbihvcHRpb25zKSB7XG4gICAgICAgIHZhciBkZWZhdWx0cyA9IHtcbiAgICAgICAgICAgIGZwczogNjAsXG4gICAgICAgICAgICBjb3JyZWN0aW9uOiAxLFxuICAgICAgICAgICAgZGVsdGFTYW1wbGVTaXplOiA2MCxcbiAgICAgICAgICAgIGNvdW50ZXJUaW1lc3RhbXA6IDAsXG4gICAgICAgICAgICBmcmFtZUNvdW50ZXI6IDAsXG4gICAgICAgICAgICBkZWx0YUhpc3Rvcnk6IFtdLFxuICAgICAgICAgICAgdGltZVByZXY6IG51bGwsXG4gICAgICAgICAgICB0aW1lU2NhbGVQcmV2OiAxLFxuICAgICAgICAgICAgZnJhbWVSZXF1ZXN0SWQ6IG51bGwsXG4gICAgICAgICAgICBpc0ZpeGVkOiBmYWxzZSxcbiAgICAgICAgICAgIGVuYWJsZWQ6IHRydWVcbiAgICAgICAgfTtcblxuICAgICAgICB2YXIgcnVubmVyID0gQ29tbW9uLmV4dGVuZChkZWZhdWx0cywgb3B0aW9ucyk7XG5cbiAgICAgICAgcnVubmVyLmRlbHRhID0gcnVubmVyLmRlbHRhIHx8IDEwMDAgLyBydW5uZXIuZnBzO1xuICAgICAgICBydW5uZXIuZGVsdGFNaW4gPSBydW5uZXIuZGVsdGFNaW4gfHwgMTAwMCAvIHJ1bm5lci5mcHM7XG4gICAgICAgIHJ1bm5lci5kZWx0YU1heCA9IHJ1bm5lci5kZWx0YU1heCB8fCAxMDAwIC8gKHJ1bm5lci5mcHMgKiAwLjUpO1xuICAgICAgICBydW5uZXIuZnBzID0gMTAwMCAvIHJ1bm5lci5kZWx0YTtcblxuICAgICAgICByZXR1cm4gcnVubmVyO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBDb250aW51b3VzbHkgdGlja3MgYSBgTWF0dGVyLkVuZ2luZWAgYnkgY2FsbGluZyBgUnVubmVyLnRpY2tgIG9uIHRoZSBgcmVxdWVzdEFuaW1hdGlvbkZyYW1lYCBldmVudC5cbiAgICAgKiBAbWV0aG9kIHJ1blxuICAgICAqIEBwYXJhbSB7ZW5naW5lfSBlbmdpbmVcbiAgICAgKi9cbiAgICBSdW5uZXIucnVuID0gZnVuY3Rpb24ocnVubmVyLCBlbmdpbmUpIHtcbiAgICAgICAgLy8gY3JlYXRlIHJ1bm5lciBpZiBlbmdpbmUgaXMgZmlyc3QgYXJndW1lbnRcbiAgICAgICAgaWYgKHR5cGVvZiBydW5uZXIucG9zaXRpb25JdGVyYXRpb25zICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgZW5naW5lID0gcnVubmVyO1xuICAgICAgICAgICAgcnVubmVyID0gUnVubmVyLmNyZWF0ZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgKGZ1bmN0aW9uIHJlbmRlcih0aW1lKXtcbiAgICAgICAgICAgIHJ1bm5lci5mcmFtZVJlcXVlc3RJZCA9IF9yZXF1ZXN0QW5pbWF0aW9uRnJhbWUocmVuZGVyKTtcblxuICAgICAgICAgICAgaWYgKHRpbWUgJiYgcnVubmVyLmVuYWJsZWQpIHtcbiAgICAgICAgICAgICAgICBSdW5uZXIudGljayhydW5uZXIsIGVuZ2luZSwgdGltZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pKCk7XG5cbiAgICAgICAgcmV0dXJuIHJ1bm5lcjtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQSBnYW1lIGxvb3AgdXRpbGl0eSB0aGF0IHVwZGF0ZXMgdGhlIGVuZ2luZSBhbmQgcmVuZGVyZXIgYnkgb25lIHN0ZXAgKGEgJ3RpY2snKS5cbiAgICAgKiBGZWF0dXJlcyBkZWx0YSBzbW9vdGhpbmcsIHRpbWUgY29ycmVjdGlvbiBhbmQgZml4ZWQgb3IgZHluYW1pYyB0aW1pbmcuXG4gICAgICogQ29uc2lkZXIganVzdCBgRW5naW5lLnVwZGF0ZShlbmdpbmUsIGRlbHRhKWAgaWYgeW91J3JlIHVzaW5nIHlvdXIgb3duIGxvb3AuXG4gICAgICogQG1ldGhvZCB0aWNrXG4gICAgICogQHBhcmFtIHtydW5uZXJ9IHJ1bm5lclxuICAgICAqIEBwYXJhbSB7ZW5naW5lfSBlbmdpbmVcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gdGltZVxuICAgICAqL1xuICAgIFJ1bm5lci50aWNrID0gZnVuY3Rpb24ocnVubmVyLCBlbmdpbmUsIHRpbWUpIHtcbiAgICAgICAgdmFyIHRpbWluZyA9IGVuZ2luZS50aW1pbmcsXG4gICAgICAgICAgICBjb3JyZWN0aW9uID0gMSxcbiAgICAgICAgICAgIGRlbHRhO1xuXG4gICAgICAgIC8vIGNyZWF0ZSBhbiBldmVudCBvYmplY3RcbiAgICAgICAgdmFyIGV2ZW50ID0ge1xuICAgICAgICAgICAgdGltZXN0YW1wOiB0aW1pbmcudGltZXN0YW1wXG4gICAgICAgIH07XG5cbiAgICAgICAgRXZlbnRzLnRyaWdnZXIocnVubmVyLCAnYmVmb3JlVGljaycsIGV2ZW50KTtcblxuICAgICAgICBpZiAocnVubmVyLmlzRml4ZWQpIHtcbiAgICAgICAgICAgIC8vIGZpeGVkIHRpbWVzdGVwXG4gICAgICAgICAgICBkZWx0YSA9IHJ1bm5lci5kZWx0YTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIGR5bmFtaWMgdGltZXN0ZXAgYmFzZWQgb24gd2FsbCBjbG9jayBiZXR3ZWVuIGNhbGxzXG4gICAgICAgICAgICBkZWx0YSA9ICh0aW1lIC0gcnVubmVyLnRpbWVQcmV2KSB8fCBydW5uZXIuZGVsdGE7XG4gICAgICAgICAgICBydW5uZXIudGltZVByZXYgPSB0aW1lO1xuXG4gICAgICAgICAgICAvLyBvcHRpbWlzdGljYWxseSBmaWx0ZXIgZGVsdGEgb3ZlciBhIGZldyBmcmFtZXMsIHRvIGltcHJvdmUgc3RhYmlsaXR5XG4gICAgICAgICAgICBydW5uZXIuZGVsdGFIaXN0b3J5LnB1c2goZGVsdGEpO1xuICAgICAgICAgICAgcnVubmVyLmRlbHRhSGlzdG9yeSA9IHJ1bm5lci5kZWx0YUhpc3Rvcnkuc2xpY2UoLXJ1bm5lci5kZWx0YVNhbXBsZVNpemUpO1xuICAgICAgICAgICAgZGVsdGEgPSBNYXRoLm1pbi5hcHBseShudWxsLCBydW5uZXIuZGVsdGFIaXN0b3J5KTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gbGltaXQgZGVsdGFcbiAgICAgICAgICAgIGRlbHRhID0gZGVsdGEgPCBydW5uZXIuZGVsdGFNaW4gPyBydW5uZXIuZGVsdGFNaW4gOiBkZWx0YTtcbiAgICAgICAgICAgIGRlbHRhID0gZGVsdGEgPiBydW5uZXIuZGVsdGFNYXggPyBydW5uZXIuZGVsdGFNYXggOiBkZWx0YTtcblxuICAgICAgICAgICAgLy8gY29ycmVjdGlvbiBmb3IgZGVsdGFcbiAgICAgICAgICAgIGNvcnJlY3Rpb24gPSBkZWx0YSAvIHJ1bm5lci5kZWx0YTtcblxuICAgICAgICAgICAgLy8gdXBkYXRlIGVuZ2luZSB0aW1pbmcgb2JqZWN0XG4gICAgICAgICAgICBydW5uZXIuZGVsdGEgPSBkZWx0YTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHRpbWUgY29ycmVjdGlvbiBmb3IgdGltZSBzY2FsaW5nXG4gICAgICAgIGlmIChydW5uZXIudGltZVNjYWxlUHJldiAhPT0gMClcbiAgICAgICAgICAgIGNvcnJlY3Rpb24gKj0gdGltaW5nLnRpbWVTY2FsZSAvIHJ1bm5lci50aW1lU2NhbGVQcmV2O1xuXG4gICAgICAgIGlmICh0aW1pbmcudGltZVNjYWxlID09PSAwKVxuICAgICAgICAgICAgY29ycmVjdGlvbiA9IDA7XG5cbiAgICAgICAgcnVubmVyLnRpbWVTY2FsZVByZXYgPSB0aW1pbmcudGltZVNjYWxlO1xuICAgICAgICBydW5uZXIuY29ycmVjdGlvbiA9IGNvcnJlY3Rpb247XG5cbiAgICAgICAgLy8gZnBzIGNvdW50ZXJcbiAgICAgICAgcnVubmVyLmZyYW1lQ291bnRlciArPSAxO1xuICAgICAgICBpZiAodGltZSAtIHJ1bm5lci5jb3VudGVyVGltZXN0YW1wID49IDEwMDApIHtcbiAgICAgICAgICAgIHJ1bm5lci5mcHMgPSBydW5uZXIuZnJhbWVDb3VudGVyICogKCh0aW1lIC0gcnVubmVyLmNvdW50ZXJUaW1lc3RhbXApIC8gMTAwMCk7XG4gICAgICAgICAgICBydW5uZXIuY291bnRlclRpbWVzdGFtcCA9IHRpbWU7XG4gICAgICAgICAgICBydW5uZXIuZnJhbWVDb3VudGVyID0gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIEV2ZW50cy50cmlnZ2VyKHJ1bm5lciwgJ3RpY2snLCBldmVudCk7XG5cbiAgICAgICAgLy8gdXBkYXRlXG4gICAgICAgIEV2ZW50cy50cmlnZ2VyKHJ1bm5lciwgJ2JlZm9yZVVwZGF0ZScsIGV2ZW50KTtcbiAgICAgICAgRW5naW5lLnVwZGF0ZShlbmdpbmUsIGRlbHRhLCBjb3JyZWN0aW9uKTtcbiAgICAgICAgRXZlbnRzLnRyaWdnZXIocnVubmVyLCAnYWZ0ZXJVcGRhdGUnLCBldmVudCk7XG5cbiAgICAgICAgRXZlbnRzLnRyaWdnZXIocnVubmVyLCAnYWZ0ZXJUaWNrJywgZXZlbnQpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBFbmRzIGV4ZWN1dGlvbiBvZiBgUnVubmVyLnJ1bmAgb24gdGhlIGdpdmVuIGBydW5uZXJgLCBieSBjYW5jZWxpbmcgdGhlIGFuaW1hdGlvbiBmcmFtZSByZXF1ZXN0IGV2ZW50IGxvb3AuXG4gICAgICogSWYgeW91IHdpc2ggdG8gb25seSB0ZW1wb3JhcmlseSBwYXVzZSB0aGUgZW5naW5lLCBzZWUgYGVuZ2luZS5lbmFibGVkYCBpbnN0ZWFkLlxuICAgICAqIEBtZXRob2Qgc3RvcFxuICAgICAqIEBwYXJhbSB7cnVubmVyfSBydW5uZXJcbiAgICAgKi9cbiAgICBSdW5uZXIuc3RvcCA9IGZ1bmN0aW9uKHJ1bm5lcikge1xuICAgICAgICBfY2FuY2VsQW5pbWF0aW9uRnJhbWUocnVubmVyLmZyYW1lUmVxdWVzdElkKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQWxpYXMgZm9yIGBSdW5uZXIucnVuYC5cbiAgICAgKiBAbWV0aG9kIHN0YXJ0XG4gICAgICogQHBhcmFtIHtydW5uZXJ9IHJ1bm5lclxuICAgICAqIEBwYXJhbSB7ZW5naW5lfSBlbmdpbmVcbiAgICAgKi9cbiAgICBSdW5uZXIuc3RhcnQgPSBmdW5jdGlvbihydW5uZXIsIGVuZ2luZSkge1xuICAgICAgICBSdW5uZXIucnVuKHJ1bm5lciwgZW5naW5lKTtcbiAgICB9O1xuXG4gICAgLypcbiAgICAqXG4gICAgKiAgRXZlbnRzIERvY3VtZW50YXRpb25cbiAgICAqXG4gICAgKi9cblxuICAgIC8qKlxuICAgICogRmlyZWQgYXQgdGhlIHN0YXJ0IG9mIGEgdGljaywgYmVmb3JlIGFueSB1cGRhdGVzIHRvIHRoZSBlbmdpbmUgb3IgdGltaW5nXG4gICAgKlxuICAgICogQGV2ZW50IGJlZm9yZVRpY2tcbiAgICAqIEBwYXJhbSB7fSBldmVudCBBbiBldmVudCBvYmplY3RcbiAgICAqIEBwYXJhbSB7bnVtYmVyfSBldmVudC50aW1lc3RhbXAgVGhlIGVuZ2luZS50aW1pbmcudGltZXN0YW1wIG9mIHRoZSBldmVudFxuICAgICogQHBhcmFtIHt9IGV2ZW50LnNvdXJjZSBUaGUgc291cmNlIG9iamVjdCBvZiB0aGUgZXZlbnRcbiAgICAqIEBwYXJhbSB7fSBldmVudC5uYW1lIFRoZSBuYW1lIG9mIHRoZSBldmVudFxuICAgICovXG5cbiAgICAvKipcbiAgICAqIEZpcmVkIGFmdGVyIGVuZ2luZSB0aW1pbmcgdXBkYXRlZCwgYnV0IGp1c3QgYmVmb3JlIHVwZGF0ZVxuICAgICpcbiAgICAqIEBldmVudCB0aWNrXG4gICAgKiBAcGFyYW0ge30gZXZlbnQgQW4gZXZlbnQgb2JqZWN0XG4gICAgKiBAcGFyYW0ge251bWJlcn0gZXZlbnQudGltZXN0YW1wIFRoZSBlbmdpbmUudGltaW5nLnRpbWVzdGFtcCBvZiB0aGUgZXZlbnRcbiAgICAqIEBwYXJhbSB7fSBldmVudC5zb3VyY2UgVGhlIHNvdXJjZSBvYmplY3Qgb2YgdGhlIGV2ZW50XG4gICAgKiBAcGFyYW0ge30gZXZlbnQubmFtZSBUaGUgbmFtZSBvZiB0aGUgZXZlbnRcbiAgICAqL1xuXG4gICAgLyoqXG4gICAgKiBGaXJlZCBhdCB0aGUgZW5kIG9mIGEgdGljaywgYWZ0ZXIgZW5naW5lIHVwZGF0ZSBhbmQgYWZ0ZXIgcmVuZGVyaW5nXG4gICAgKlxuICAgICogQGV2ZW50IGFmdGVyVGlja1xuICAgICogQHBhcmFtIHt9IGV2ZW50IEFuIGV2ZW50IG9iamVjdFxuICAgICogQHBhcmFtIHtudW1iZXJ9IGV2ZW50LnRpbWVzdGFtcCBUaGUgZW5naW5lLnRpbWluZy50aW1lc3RhbXAgb2YgdGhlIGV2ZW50XG4gICAgKiBAcGFyYW0ge30gZXZlbnQuc291cmNlIFRoZSBzb3VyY2Ugb2JqZWN0IG9mIHRoZSBldmVudFxuICAgICogQHBhcmFtIHt9IGV2ZW50Lm5hbWUgVGhlIG5hbWUgb2YgdGhlIGV2ZW50XG4gICAgKi9cblxuICAgIC8qKlxuICAgICogRmlyZWQgYmVmb3JlIHVwZGF0ZVxuICAgICpcbiAgICAqIEBldmVudCBiZWZvcmVVcGRhdGVcbiAgICAqIEBwYXJhbSB7fSBldmVudCBBbiBldmVudCBvYmplY3RcbiAgICAqIEBwYXJhbSB7bnVtYmVyfSBldmVudC50aW1lc3RhbXAgVGhlIGVuZ2luZS50aW1pbmcudGltZXN0YW1wIG9mIHRoZSBldmVudFxuICAgICogQHBhcmFtIHt9IGV2ZW50LnNvdXJjZSBUaGUgc291cmNlIG9iamVjdCBvZiB0aGUgZXZlbnRcbiAgICAqIEBwYXJhbSB7fSBldmVudC5uYW1lIFRoZSBuYW1lIG9mIHRoZSBldmVudFxuICAgICovXG5cbiAgICAvKipcbiAgICAqIEZpcmVkIGFmdGVyIHVwZGF0ZVxuICAgICpcbiAgICAqIEBldmVudCBhZnRlclVwZGF0ZVxuICAgICogQHBhcmFtIHt9IGV2ZW50IEFuIGV2ZW50IG9iamVjdFxuICAgICogQHBhcmFtIHtudW1iZXJ9IGV2ZW50LnRpbWVzdGFtcCBUaGUgZW5naW5lLnRpbWluZy50aW1lc3RhbXAgb2YgdGhlIGV2ZW50XG4gICAgKiBAcGFyYW0ge30gZXZlbnQuc291cmNlIFRoZSBzb3VyY2Ugb2JqZWN0IG9mIHRoZSBldmVudFxuICAgICogQHBhcmFtIHt9IGV2ZW50Lm5hbWUgVGhlIG5hbWUgb2YgdGhlIGV2ZW50XG4gICAgKi9cblxuICAgIC8qXG4gICAgKlxuICAgICogIFByb3BlcnRpZXMgRG9jdW1lbnRhdGlvblxuICAgICpcbiAgICAqL1xuXG4gICAgLyoqXG4gICAgICogQSBmbGFnIHRoYXQgc3BlY2lmaWVzIHdoZXRoZXIgdGhlIHJ1bm5lciBpcyBydW5uaW5nIG9yIG5vdC5cbiAgICAgKlxuICAgICAqIEBwcm9wZXJ0eSBlbmFibGVkXG4gICAgICogQHR5cGUgYm9vbGVhblxuICAgICAqIEBkZWZhdWx0IHRydWVcbiAgICAgKi9cblxuICAgIC8qKlxuICAgICAqIEEgYEJvb2xlYW5gIHRoYXQgc3BlY2lmaWVzIGlmIHRoZSBydW5uZXIgc2hvdWxkIHVzZSBhIGZpeGVkIHRpbWVzdGVwIChvdGhlcndpc2UgaXQgaXMgdmFyaWFibGUpLlxuICAgICAqIElmIHRpbWluZyBpcyBmaXhlZCwgdGhlbiB0aGUgYXBwYXJlbnQgc2ltdWxhdGlvbiBzcGVlZCB3aWxsIGNoYW5nZSBkZXBlbmRpbmcgb24gdGhlIGZyYW1lIHJhdGUgKGJ1dCBiZWhhdmlvdXIgd2lsbCBiZSBkZXRlcm1pbmlzdGljKS5cbiAgICAgKiBJZiB0aGUgdGltaW5nIGlzIHZhcmlhYmxlLCB0aGVuIHRoZSBhcHBhcmVudCBzaW11bGF0aW9uIHNwZWVkIHdpbGwgYmUgY29uc3RhbnQgKGFwcHJveGltYXRlbHksIGJ1dCBhdCB0aGUgY29zdCBvZiBkZXRlcm1pbmluaXNtKS5cbiAgICAgKlxuICAgICAqIEBwcm9wZXJ0eSBpc0ZpeGVkXG4gICAgICogQHR5cGUgYm9vbGVhblxuICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICovXG5cbiAgICAvKipcbiAgICAgKiBBIGBOdW1iZXJgIHRoYXQgc3BlY2lmaWVzIHRoZSB0aW1lIHN0ZXAgYmV0d2VlbiB1cGRhdGVzIGluIG1pbGxpc2Vjb25kcy5cbiAgICAgKiBJZiBgZW5naW5lLnRpbWluZy5pc0ZpeGVkYCBpcyBzZXQgdG8gYHRydWVgLCB0aGVuIGBkZWx0YWAgaXMgZml4ZWQuXG4gICAgICogSWYgaXQgaXMgYGZhbHNlYCwgdGhlbiBgZGVsdGFgIGNhbiBkeW5hbWljYWxseSBjaGFuZ2UgdG8gbWFpbnRhaW4gdGhlIGNvcnJlY3QgYXBwYXJlbnQgc2ltdWxhdGlvbiBzcGVlZC5cbiAgICAgKlxuICAgICAqIEBwcm9wZXJ0eSBkZWx0YVxuICAgICAqIEB0eXBlIG51bWJlclxuICAgICAqIEBkZWZhdWx0IDEwMDAgLyA2MFxuICAgICAqL1xuXG59KSgpO1xuXG5cbi8qKiovIH0pLFxuLyogMjggKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuLyoqXG4qIFRoaXMgbW9kdWxlIGhhcyBub3cgYmVlbiByZXBsYWNlZCBieSBgTWF0dGVyLkNvbGxpc2lvbmAuXG4qXG4qIEFsbCB1c2FnZSBzaG91bGQgYmUgbWlncmF0ZWQgdG8gYE1hdHRlci5Db2xsaXNpb25gLlxuKiBGb3IgYmFjay1jb21wYXRpYmlsaXR5IHB1cnBvc2VzIHRoaXMgbW9kdWxlIHdpbGwgcmVtYWluIGZvciBhIHNob3J0IHRlcm0gYW5kIHRoZW4gbGF0ZXIgcmVtb3ZlZCBpbiBhIGZ1dHVyZSByZWxlYXNlLlxuKlxuKiBUaGUgYE1hdHRlci5TQVRgIG1vZHVsZSBjb250YWlucyBtZXRob2RzIGZvciBkZXRlY3RpbmcgY29sbGlzaW9ucyB1c2luZyB0aGUgU2VwYXJhdGluZyBBeGlzIFRoZW9yZW0uXG4qXG4qIEBjbGFzcyBTQVRcbiogQGRlcHJlY2F0ZWRcbiovXG5cbnZhciBTQVQgPSB7fTtcblxubW9kdWxlLmV4cG9ydHMgPSBTQVQ7XG5cbnZhciBDb2xsaXNpb24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDgpO1xudmFyIENvbW1vbiA9IF9fd2VicGFja19yZXF1aXJlX18oMCk7XG52YXIgZGVwcmVjYXRlZCA9IENvbW1vbi5kZXByZWNhdGVkO1xuXG4oZnVuY3Rpb24oKSB7XG5cbiAgICAvKipcbiAgICAgKiBEZXRlY3QgY29sbGlzaW9uIGJldHdlZW4gdHdvIGJvZGllcyB1c2luZyB0aGUgU2VwYXJhdGluZyBBeGlzIFRoZW9yZW0uXG4gICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgYnkgQ29sbGlzaW9uLmNvbGxpZGVzXG4gICAgICogQG1ldGhvZCBjb2xsaWRlc1xuICAgICAqIEBwYXJhbSB7Ym9keX0gYm9keUFcbiAgICAgKiBAcGFyYW0ge2JvZHl9IGJvZHlCXG4gICAgICogQHJldHVybiB7Y29sbGlzaW9ufSBjb2xsaXNpb25cbiAgICAgKi9cbiAgICBTQVQuY29sbGlkZXMgPSBmdW5jdGlvbihib2R5QSwgYm9keUIpIHtcbiAgICAgICAgcmV0dXJuIENvbGxpc2lvbi5jb2xsaWRlcyhib2R5QSwgYm9keUIpO1xuICAgIH07XG5cbiAgICBkZXByZWNhdGVkKFNBVCwgJ2NvbGxpZGVzJywgJ1NBVC5jb2xsaWRlcyDinqQgcmVwbGFjZWQgYnkgQ29sbGlzaW9uLmNvbGxpZGVzJyk7XG5cbn0pKCk7XG5cblxuLyoqKi8gfSksXG4vKiAyOSAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG4vKipcbiogVGhlIGBNYXR0ZXIuU3ZnYCBtb2R1bGUgY29udGFpbnMgbWV0aG9kcyBmb3IgY29udmVydGluZyBTVkcgaW1hZ2VzIGludG8gYW4gYXJyYXkgb2YgdmVjdG9yIHBvaW50cy5cbipcbiogVG8gdXNlIHRoaXMgbW9kdWxlIHlvdSBhbHNvIG5lZWQgdGhlIFNWR1BhdGhTZWcgcG9seWZpbGw6IGh0dHBzOi8vZ2l0aHViLmNvbS9wcm9nZXJzL3BhdGhzZWdcbipcbiogU2VlIHRoZSBpbmNsdWRlZCB1c2FnZSBbZXhhbXBsZXNdKGh0dHBzOi8vZ2l0aHViLmNvbS9saWFicnUvbWF0dGVyLWpzL3RyZWUvbWFzdGVyL2V4YW1wbGVzKS5cbipcbiogQGNsYXNzIFN2Z1xuKi9cblxudmFyIFN2ZyA9IHt9O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFN2ZztcblxudmFyIEJvdW5kcyA9IF9fd2VicGFja19yZXF1aXJlX18oMSk7XG52YXIgQ29tbW9uID0gX193ZWJwYWNrX3JlcXVpcmVfXygwKTtcblxuKGZ1bmN0aW9uKCkge1xuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYW4gU1ZHIHBhdGggaW50byBhbiBhcnJheSBvZiB2ZWN0b3IgcG9pbnRzLlxuICAgICAqIElmIHRoZSBpbnB1dCBwYXRoIGZvcm1zIGEgY29uY2F2ZSBzaGFwZSwgeW91IG11c3QgZGVjb21wb3NlIHRoZSByZXN1bHQgaW50byBjb252ZXggcGFydHMgYmVmb3JlIHVzZS5cbiAgICAgKiBTZWUgYEJvZGllcy5mcm9tVmVydGljZXNgIHdoaWNoIHByb3ZpZGVzIHN1cHBvcnQgZm9yIHRoaXMuXG4gICAgICogTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gaXMgbm90IGd1YXJhbnRlZWQgdG8gc3VwcG9ydCBjb21wbGV4IHBhdGhzIChzdWNoIGFzIHRob3NlIHdpdGggaG9sZXMpLlxuICAgICAqIFlvdSBtdXN0IGxvYWQgdGhlIGBwYXRoc2VnLmpzYCBwb2x5ZmlsbCBvbiBuZXdlciBicm93c2Vycy5cbiAgICAgKiBAbWV0aG9kIHBhdGhUb1ZlcnRpY2VzXG4gICAgICogQHBhcmFtIHtTVkdQYXRoRWxlbWVudH0gcGF0aFxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBbc2FtcGxlTGVuZ3RoPTE1XVxuICAgICAqIEByZXR1cm4ge1ZlY3RvcltdfSBwb2ludHNcbiAgICAgKi9cbiAgICBTdmcucGF0aFRvVmVydGljZXMgPSBmdW5jdGlvbihwYXRoLCBzYW1wbGVMZW5ndGgpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmICEoJ1NWR1BhdGhTZWcnIGluIHdpbmRvdykpIHtcbiAgICAgICAgICAgIENvbW1vbi53YXJuKCdTdmcucGF0aFRvVmVydGljZXM6IFNWR1BhdGhTZWcgbm90IGRlZmluZWQsIGEgcG9seWZpbGwgaXMgcmVxdWlyZWQuJyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vd291dC9zdmcudG9wb2x5LmpzL2Jsb2IvbWFzdGVyL3N2Zy50b3BvbHkuanNcbiAgICAgICAgdmFyIGksIGlsLCB0b3RhbCwgcG9pbnQsIHNlZ21lbnQsIHNlZ21lbnRzLCBcbiAgICAgICAgICAgIHNlZ21lbnRzUXVldWUsIGxhc3RTZWdtZW50LCBcbiAgICAgICAgICAgIGxhc3RQb2ludCwgc2VnbWVudEluZGV4LCBwb2ludHMgPSBbXSxcbiAgICAgICAgICAgIGx4LCBseSwgbGVuZ3RoID0gMCwgeCA9IDAsIHkgPSAwO1xuXG4gICAgICAgIHNhbXBsZUxlbmd0aCA9IHNhbXBsZUxlbmd0aCB8fCAxNTtcblxuICAgICAgICB2YXIgYWRkUG9pbnQgPSBmdW5jdGlvbihweCwgcHksIHBhdGhTZWdUeXBlKSB7XG4gICAgICAgICAgICAvLyBhbGwgb2RkLW51bWJlcmVkIHBhdGggdHlwZXMgYXJlIHJlbGF0aXZlIGV4Y2VwdCBQQVRIU0VHX0NMT1NFUEFUSCAoMSlcbiAgICAgICAgICAgIHZhciBpc1JlbGF0aXZlID0gcGF0aFNlZ1R5cGUgJSAyID09PSAxICYmIHBhdGhTZWdUeXBlID4gMTtcblxuICAgICAgICAgICAgLy8gd2hlbiB0aGUgbGFzdCBwb2ludCBkb2Vzbid0IGVxdWFsIHRoZSBjdXJyZW50IHBvaW50IGFkZCB0aGUgY3VycmVudCBwb2ludFxuICAgICAgICAgICAgaWYgKCFsYXN0UG9pbnQgfHwgcHggIT0gbGFzdFBvaW50LnggfHwgcHkgIT0gbGFzdFBvaW50LnkpIHtcbiAgICAgICAgICAgICAgICBpZiAobGFzdFBvaW50ICYmIGlzUmVsYXRpdmUpIHtcbiAgICAgICAgICAgICAgICAgICAgbHggPSBsYXN0UG9pbnQueDtcbiAgICAgICAgICAgICAgICAgICAgbHkgPSBsYXN0UG9pbnQueTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBseCA9IDA7XG4gICAgICAgICAgICAgICAgICAgIGx5ID0gMDtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB2YXIgcG9pbnQgPSB7XG4gICAgICAgICAgICAgICAgICAgIHg6IGx4ICsgcHgsXG4gICAgICAgICAgICAgICAgICAgIHk6IGx5ICsgcHlcbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgLy8gc2V0IGxhc3QgcG9pbnRcbiAgICAgICAgICAgICAgICBpZiAoaXNSZWxhdGl2ZSB8fCAhbGFzdFBvaW50KSB7XG4gICAgICAgICAgICAgICAgICAgIGxhc3RQb2ludCA9IHBvaW50O1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHBvaW50cy5wdXNoKHBvaW50KTtcblxuICAgICAgICAgICAgICAgIHggPSBseCArIHB4O1xuICAgICAgICAgICAgICAgIHkgPSBseSArIHB5O1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIHZhciBhZGRTZWdtZW50UG9pbnQgPSBmdW5jdGlvbihzZWdtZW50KSB7XG4gICAgICAgICAgICB2YXIgc2VnVHlwZSA9IHNlZ21lbnQucGF0aFNlZ1R5cGVBc0xldHRlci50b1VwcGVyQ2FzZSgpO1xuXG4gICAgICAgICAgICAvLyBza2lwIHBhdGggZW5kc1xuICAgICAgICAgICAgaWYgKHNlZ1R5cGUgPT09ICdaJykgXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgICAgICAvLyBtYXAgc2VnbWVudCB0byB4IGFuZCB5XG4gICAgICAgICAgICBzd2l0Y2ggKHNlZ1R5cGUpIHtcblxuICAgICAgICAgICAgY2FzZSAnTSc6XG4gICAgICAgICAgICBjYXNlICdMJzpcbiAgICAgICAgICAgIGNhc2UgJ1QnOlxuICAgICAgICAgICAgY2FzZSAnQyc6XG4gICAgICAgICAgICBjYXNlICdTJzpcbiAgICAgICAgICAgIGNhc2UgJ1EnOlxuICAgICAgICAgICAgICAgIHggPSBzZWdtZW50Lng7XG4gICAgICAgICAgICAgICAgeSA9IHNlZ21lbnQueTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ0gnOlxuICAgICAgICAgICAgICAgIHggPSBzZWdtZW50Lng7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdWJzpcbiAgICAgICAgICAgICAgICB5ID0gc2VnbWVudC55O1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBhZGRQb2ludCh4LCB5LCBzZWdtZW50LnBhdGhTZWdUeXBlKTtcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBlbnN1cmUgcGF0aCBpcyBhYnNvbHV0ZVxuICAgICAgICBTdmcuX3N2Z1BhdGhUb0Fic29sdXRlKHBhdGgpO1xuXG4gICAgICAgIC8vIGdldCB0b3RhbCBsZW5ndGhcbiAgICAgICAgdG90YWwgPSBwYXRoLmdldFRvdGFsTGVuZ3RoKCk7XG5cbiAgICAgICAgLy8gcXVldWUgc2VnbWVudHNcbiAgICAgICAgc2VnbWVudHMgPSBbXTtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IHBhdGgucGF0aFNlZ0xpc3QubnVtYmVyT2ZJdGVtczsgaSArPSAxKVxuICAgICAgICAgICAgc2VnbWVudHMucHVzaChwYXRoLnBhdGhTZWdMaXN0LmdldEl0ZW0oaSkpO1xuXG4gICAgICAgIHNlZ21lbnRzUXVldWUgPSBzZWdtZW50cy5jb25jYXQoKTtcblxuICAgICAgICAvLyBzYW1wbGUgdGhyb3VnaCBwYXRoXG4gICAgICAgIHdoaWxlIChsZW5ndGggPCB0b3RhbCkge1xuICAgICAgICAgICAgLy8gZ2V0IHNlZ21lbnQgYXQgcG9zaXRpb25cbiAgICAgICAgICAgIHNlZ21lbnRJbmRleCA9IHBhdGguZ2V0UGF0aFNlZ0F0TGVuZ3RoKGxlbmd0aCk7XG4gICAgICAgICAgICBzZWdtZW50ID0gc2VnbWVudHNbc2VnbWVudEluZGV4XTtcblxuICAgICAgICAgICAgLy8gbmV3IHNlZ21lbnRcbiAgICAgICAgICAgIGlmIChzZWdtZW50ICE9IGxhc3RTZWdtZW50KSB7XG4gICAgICAgICAgICAgICAgd2hpbGUgKHNlZ21lbnRzUXVldWUubGVuZ3RoICYmIHNlZ21lbnRzUXVldWVbMF0gIT0gc2VnbWVudClcbiAgICAgICAgICAgICAgICAgICAgYWRkU2VnbWVudFBvaW50KHNlZ21lbnRzUXVldWUuc2hpZnQoKSk7XG5cbiAgICAgICAgICAgICAgICBsYXN0U2VnbWVudCA9IHNlZ21lbnQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGFkZCBwb2ludHMgaW4gYmV0d2VlbiB3aGVuIGN1cnZpbmdcbiAgICAgICAgICAgIC8vIFRPRE86IGFkYXB0aXZlIHNhbXBsaW5nXG4gICAgICAgICAgICBzd2l0Y2ggKHNlZ21lbnQucGF0aFNlZ1R5cGVBc0xldHRlci50b1VwcGVyQ2FzZSgpKSB7XG5cbiAgICAgICAgICAgIGNhc2UgJ0MnOlxuICAgICAgICAgICAgY2FzZSAnVCc6XG4gICAgICAgICAgICBjYXNlICdTJzpcbiAgICAgICAgICAgIGNhc2UgJ1EnOlxuICAgICAgICAgICAgY2FzZSAnQSc6XG4gICAgICAgICAgICAgICAgcG9pbnQgPSBwYXRoLmdldFBvaW50QXRMZW5ndGgobGVuZ3RoKTtcbiAgICAgICAgICAgICAgICBhZGRQb2ludChwb2ludC54LCBwb2ludC55LCAwKTtcbiAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBpbmNyZW1lbnQgYnkgc2FtcGxlIHZhbHVlXG4gICAgICAgICAgICBsZW5ndGggKz0gc2FtcGxlTGVuZ3RoO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gYWRkIHJlbWFpbmluZyBzZWdtZW50cyBub3QgcGFzc2VkIGJ5IHNhbXBsaW5nXG4gICAgICAgIGZvciAoaSA9IDAsIGlsID0gc2VnbWVudHNRdWV1ZS5sZW5ndGg7IGkgPCBpbDsgKytpKVxuICAgICAgICAgICAgYWRkU2VnbWVudFBvaW50KHNlZ21lbnRzUXVldWVbaV0pO1xuXG4gICAgICAgIHJldHVybiBwb2ludHM7XG4gICAgfTtcblxuICAgIFN2Zy5fc3ZnUGF0aFRvQWJzb2x1dGUgPSBmdW5jdGlvbihwYXRoKSB7XG4gICAgICAgIC8vIGh0dHA6Ly9waHJvZ3oubmV0L2NvbnZlcnQtc3ZnLXBhdGgtdG8tYWxsLWFic29sdXRlLWNvbW1hbmRzXG4gICAgICAgIC8vIENvcHlyaWdodCAoYykgR2F2aW4gS2lzdG5lclxuICAgICAgICAvLyBodHRwOi8vcGhyb2d6Lm5ldC9qcy9fUmV1c2VMaWNlbnNlLnR4dFxuICAgICAgICAvLyBNb2RpZmljYXRpb25zOiB0aWR5IGZvcm1hdHRpbmcgYW5kIG5hbWluZ1xuICAgICAgICB2YXIgeDAsIHkwLCB4MSwgeTEsIHgyLCB5Miwgc2VncyA9IHBhdGgucGF0aFNlZ0xpc3QsXG4gICAgICAgICAgICB4ID0gMCwgeSA9IDAsIGxlbiA9IHNlZ3MubnVtYmVyT2ZJdGVtcztcblxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgKytpKSB7XG4gICAgICAgICAgICB2YXIgc2VnID0gc2Vncy5nZXRJdGVtKGkpLFxuICAgICAgICAgICAgICAgIHNlZ1R5cGUgPSBzZWcucGF0aFNlZ1R5cGVBc0xldHRlcjtcblxuICAgICAgICAgICAgaWYgKC9bTUxIVkNTUVRBXS8udGVzdChzZWdUeXBlKSkge1xuICAgICAgICAgICAgICAgIGlmICgneCcgaW4gc2VnKSB4ID0gc2VnLng7XG4gICAgICAgICAgICAgICAgaWYgKCd5JyBpbiBzZWcpIHkgPSBzZWcueTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKCd4MScgaW4gc2VnKSB4MSA9IHggKyBzZWcueDE7XG4gICAgICAgICAgICAgICAgaWYgKCd4MicgaW4gc2VnKSB4MiA9IHggKyBzZWcueDI7XG4gICAgICAgICAgICAgICAgaWYgKCd5MScgaW4gc2VnKSB5MSA9IHkgKyBzZWcueTE7XG4gICAgICAgICAgICAgICAgaWYgKCd5MicgaW4gc2VnKSB5MiA9IHkgKyBzZWcueTI7XG4gICAgICAgICAgICAgICAgaWYgKCd4JyBpbiBzZWcpIHggKz0gc2VnLng7XG4gICAgICAgICAgICAgICAgaWYgKCd5JyBpbiBzZWcpIHkgKz0gc2VnLnk7XG5cbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHNlZ1R5cGUpIHtcblxuICAgICAgICAgICAgICAgIGNhc2UgJ20nOlxuICAgICAgICAgICAgICAgICAgICBzZWdzLnJlcGxhY2VJdGVtKHBhdGguY3JlYXRlU1ZHUGF0aFNlZ01vdmV0b0Ficyh4LCB5KSwgaSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ2wnOlxuICAgICAgICAgICAgICAgICAgICBzZWdzLnJlcGxhY2VJdGVtKHBhdGguY3JlYXRlU1ZHUGF0aFNlZ0xpbmV0b0Ficyh4LCB5KSwgaSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ2gnOlxuICAgICAgICAgICAgICAgICAgICBzZWdzLnJlcGxhY2VJdGVtKHBhdGguY3JlYXRlU1ZHUGF0aFNlZ0xpbmV0b0hvcml6b250YWxBYnMoeCksIGkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICd2JzpcbiAgICAgICAgICAgICAgICAgICAgc2Vncy5yZXBsYWNlSXRlbShwYXRoLmNyZWF0ZVNWR1BhdGhTZWdMaW5ldG9WZXJ0aWNhbEFicyh5KSwgaSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ2MnOlxuICAgICAgICAgICAgICAgICAgICBzZWdzLnJlcGxhY2VJdGVtKHBhdGguY3JlYXRlU1ZHUGF0aFNlZ0N1cnZldG9DdWJpY0Ficyh4LCB5LCB4MSwgeTEsIHgyLCB5MiksIGkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdzJzpcbiAgICAgICAgICAgICAgICAgICAgc2Vncy5yZXBsYWNlSXRlbShwYXRoLmNyZWF0ZVNWR1BhdGhTZWdDdXJ2ZXRvQ3ViaWNTbW9vdGhBYnMoeCwgeSwgeDIsIHkyKSwgaSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ3EnOlxuICAgICAgICAgICAgICAgICAgICBzZWdzLnJlcGxhY2VJdGVtKHBhdGguY3JlYXRlU1ZHUGF0aFNlZ0N1cnZldG9RdWFkcmF0aWNBYnMoeCwgeSwgeDEsIHkxKSwgaSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ3QnOlxuICAgICAgICAgICAgICAgICAgICBzZWdzLnJlcGxhY2VJdGVtKHBhdGguY3JlYXRlU1ZHUGF0aFNlZ0N1cnZldG9RdWFkcmF0aWNTbW9vdGhBYnMoeCwgeSksIGkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdhJzpcbiAgICAgICAgICAgICAgICAgICAgc2Vncy5yZXBsYWNlSXRlbShwYXRoLmNyZWF0ZVNWR1BhdGhTZWdBcmNBYnMoeCwgeSwgc2VnLnIxLCBzZWcucjIsIHNlZy5hbmdsZSwgc2VnLmxhcmdlQXJjRmxhZywgc2VnLnN3ZWVwRmxhZyksIGkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICd6JzpcbiAgICAgICAgICAgICAgICBjYXNlICdaJzpcbiAgICAgICAgICAgICAgICAgICAgeCA9IHgwO1xuICAgICAgICAgICAgICAgICAgICB5ID0geTA7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoc2VnVHlwZSA9PSAnTScgfHwgc2VnVHlwZSA9PSAnbScpIHtcbiAgICAgICAgICAgICAgICB4MCA9IHg7XG4gICAgICAgICAgICAgICAgeTAgPSB5O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcblxufSkoKTtcblxuLyoqKi8gfSksXG4vKiAzMCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG4vKipcbiogVGhpcyBtb2R1bGUgaGFzIG5vdyBiZWVuIHJlcGxhY2VkIGJ5IGBNYXR0ZXIuQ29tcG9zaXRlYC5cbipcbiogQWxsIHVzYWdlIHNob3VsZCBiZSBtaWdyYXRlZCB0byB0aGUgZXF1aXZhbGVudCBmdW5jdGlvbnMgZm91bmQgb24gYE1hdHRlci5Db21wb3NpdGVgLlxuKiBGb3IgZXhhbXBsZSBgV29ybGQuYWRkKHdvcmxkLCBib2R5KWAgbm93IGJlY29tZXMgYENvbXBvc2l0ZS5hZGQod29ybGQsIGJvZHkpYC5cbipcbiogVGhlIHByb3BlcnR5IGB3b3JsZC5ncmF2aXR5YCBoYXMgYmVlbiBtb3ZlZCB0byBgZW5naW5lLmdyYXZpdHlgLlxuKlxuKiBGb3IgYmFjay1jb21wYXRpYmlsaXR5IHB1cnBvc2VzIHRoaXMgbW9kdWxlIHdpbGwgcmVtYWluIGFzIGEgZGlyZWN0IGFsaWFzIHRvIGBNYXR0ZXIuQ29tcG9zaXRlYCBpbiB0aGUgc2hvcnQgdGVybSBkdXJpbmcgbWlncmF0aW9uLlxuKiBFdmVudHVhbGx5IHRoaXMgYWxpYXMgbW9kdWxlIHdpbGwgYmUgbWFya2VkIGFzIGRlcHJlY2F0ZWQgYW5kIHRoZW4gbGF0ZXIgcmVtb3ZlZCBpbiBhIGZ1dHVyZSByZWxlYXNlLlxuKlxuKiBAY2xhc3MgV29ybGRcbiovXG5cbnZhciBXb3JsZCA9IHt9O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFdvcmxkO1xuXG52YXIgQ29tcG9zaXRlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1KTtcbnZhciBDb21tb24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDApO1xuXG4oZnVuY3Rpb24oKSB7XG5cbiAgICAvKipcbiAgICAgKiBTZWUgYWJvdmUsIGFsaWFzZXMgZm9yIGJhY2sgY29tcGF0aWJpbGl0eSBvbmx5XG4gICAgICovXG4gICAgV29ybGQuY3JlYXRlID0gQ29tcG9zaXRlLmNyZWF0ZTtcbiAgICBXb3JsZC5hZGQgPSBDb21wb3NpdGUuYWRkO1xuICAgIFdvcmxkLnJlbW92ZSA9IENvbXBvc2l0ZS5yZW1vdmU7XG4gICAgV29ybGQuY2xlYXIgPSBDb21wb3NpdGUuY2xlYXI7XG4gICAgV29ybGQuYWRkQ29tcG9zaXRlID0gQ29tcG9zaXRlLmFkZENvbXBvc2l0ZTtcbiAgICBXb3JsZC5hZGRCb2R5ID0gQ29tcG9zaXRlLmFkZEJvZHk7XG4gICAgV29ybGQuYWRkQ29uc3RyYWludCA9IENvbXBvc2l0ZS5hZGRDb25zdHJhaW50O1xuXG59KSgpO1xuXG5cbi8qKiovIH0pXG4vKioqKioqLyBdKTtcbn0pOyIsIi8vIHYxLjAgZXhwb3J0ZWQganVzdCB0aGUgcGFyc2VyIGZ1bmN0aW9uLiBUbyBtYWludGFpbiBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSxcbi8vIHdlIGV4cG9ydCBhZGRpdGlvbmFsIG5hbWVkIGZlYXR1cmVzIGFzIHByb3BlcnRpZXMgb2YgdGhhdCBmdW5jdGlvbi5cbnZhciBwYXJzZXJGdW5jdGlvbiA9IHJlcXVpcmUoJy4vcGFyc2VyLmpzJykucGFyc2U7XG5wYXJzZXJGdW5jdGlvbi5wYXJzZVNWRyA9IHBhcnNlckZ1bmN0aW9uO1xucGFyc2VyRnVuY3Rpb24ubWFrZUFic29sdXRlID0gbWFrZVNWR1BhdGhDb21tYW5kc0Fic29sdXRlO1xubW9kdWxlLmV4cG9ydHMgPSBwYXJzZXJGdW5jdGlvbjtcblxuZnVuY3Rpb24gbWFrZVNWR1BhdGhDb21tYW5kc0Fic29sdXRlKGNvbW1hbmRzKSB7XG5cdHZhciBzdWJwYXRoU3RhcnQsIHByZXZDbWQ9e3g6MCx5OjB9O1xuXHR2YXIgYXR0ciA9IHt4Oid4MCcseToneTAnLHgxOid4MCcseTE6J3kwJyx4MjoneDAnLHkyOid5MCd9O1xuXHRjb21tYW5kcy5mb3JFYWNoKGZ1bmN0aW9uKGNtZCkge1xuXHRcdGlmIChjbWQuY29tbWFuZD09PSdtb3ZldG8nKSBzdWJwYXRoU3RhcnQ9Y21kO1xuXHRcdGNtZC54MD1wcmV2Q21kLng7IGNtZC55MD1wcmV2Q21kLnk7XG5cdFx0Zm9yICh2YXIgYSBpbiBhdHRyKSBpZiAoYSBpbiBjbWQpIGNtZFthXSArPSBjbWQucmVsYXRpdmUgPyBjbWRbYXR0clthXV0gOiAwO1xuXHRcdGlmICghKCd4JyBpbiBjbWQpKSBjbWQueCA9IHByZXZDbWQueDsgLy8gVlxuXHRcdGlmICghKCd5JyBpbiBjbWQpKSBjbWQueSA9IHByZXZDbWQueTsgLy8gWFxuXHRcdGNtZC5yZWxhdGl2ZSA9IGZhbHNlO1xuXHRcdGNtZC5jb2RlID0gY21kLmNvZGUudG9VcHBlckNhc2UoKTtcblx0XHRpZiAoY21kLmNvbW1hbmQ9PSdjbG9zZXBhdGgnKSB7XG5cdFx0XHRjbWQueCA9IHN1YnBhdGhTdGFydC54O1xuXHRcdFx0Y21kLnkgPSBzdWJwYXRoU3RhcnQueTtcblx0XHR9XG5cdFx0cHJldkNtZCA9IGNtZDtcblx0fSk7XG5cdHJldHVybiBjb21tYW5kcztcbn1cbiIsIi8qXG4gKiBHZW5lcmF0ZWQgYnkgUEVHLmpzIDAuMTAuMC5cbiAqXG4gKiBodHRwOi8vcGVnanMub3JnL1xuICovXG5cblwidXNlIHN0cmljdFwiO1xuXG5mdW5jdGlvbiBwZWckc3ViY2xhc3MoY2hpbGQsIHBhcmVudCkge1xuICBmdW5jdGlvbiBjdG9yKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gY2hpbGQ7IH1cbiAgY3Rvci5wcm90b3R5cGUgPSBwYXJlbnQucHJvdG90eXBlO1xuICBjaGlsZC5wcm90b3R5cGUgPSBuZXcgY3RvcigpO1xufVxuXG5mdW5jdGlvbiBwZWckU3ludGF4RXJyb3IobWVzc2FnZSwgZXhwZWN0ZWQsIGZvdW5kLCBsb2NhdGlvbikge1xuICB0aGlzLm1lc3NhZ2UgID0gbWVzc2FnZTtcbiAgdGhpcy5leHBlY3RlZCA9IGV4cGVjdGVkO1xuICB0aGlzLmZvdW5kICAgID0gZm91bmQ7XG4gIHRoaXMubG9jYXRpb24gPSBsb2NhdGlvbjtcbiAgdGhpcy5uYW1lICAgICA9IFwiU3ludGF4RXJyb3JcIjtcblxuICBpZiAodHlwZW9mIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCBwZWckU3ludGF4RXJyb3IpO1xuICB9XG59XG5cbnBlZyRzdWJjbGFzcyhwZWckU3ludGF4RXJyb3IsIEVycm9yKTtcblxucGVnJFN5bnRheEVycm9yLmJ1aWxkTWVzc2FnZSA9IGZ1bmN0aW9uKGV4cGVjdGVkLCBmb3VuZCkge1xuICB2YXIgREVTQ1JJQkVfRVhQRUNUQVRJT05fRk5TID0ge1xuICAgICAgICBsaXRlcmFsOiBmdW5jdGlvbihleHBlY3RhdGlvbikge1xuICAgICAgICAgIHJldHVybiBcIlxcXCJcIiArIGxpdGVyYWxFc2NhcGUoZXhwZWN0YXRpb24udGV4dCkgKyBcIlxcXCJcIjtcbiAgICAgICAgfSxcblxuICAgICAgICBcImNsYXNzXCI6IGZ1bmN0aW9uKGV4cGVjdGF0aW9uKSB7XG4gICAgICAgICAgdmFyIGVzY2FwZWRQYXJ0cyA9IFwiXCIsXG4gICAgICAgICAgICAgIGk7XG5cbiAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZXhwZWN0YXRpb24ucGFydHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGVzY2FwZWRQYXJ0cyArPSBleHBlY3RhdGlvbi5wYXJ0c1tpXSBpbnN0YW5jZW9mIEFycmF5XG4gICAgICAgICAgICAgID8gY2xhc3NFc2NhcGUoZXhwZWN0YXRpb24ucGFydHNbaV1bMF0pICsgXCItXCIgKyBjbGFzc0VzY2FwZShleHBlY3RhdGlvbi5wYXJ0c1tpXVsxXSlcbiAgICAgICAgICAgICAgOiBjbGFzc0VzY2FwZShleHBlY3RhdGlvbi5wYXJ0c1tpXSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIFwiW1wiICsgKGV4cGVjdGF0aW9uLmludmVydGVkID8gXCJeXCIgOiBcIlwiKSArIGVzY2FwZWRQYXJ0cyArIFwiXVwiO1xuICAgICAgICB9LFxuXG4gICAgICAgIGFueTogZnVuY3Rpb24oZXhwZWN0YXRpb24pIHtcbiAgICAgICAgICByZXR1cm4gXCJhbnkgY2hhcmFjdGVyXCI7XG4gICAgICAgIH0sXG5cbiAgICAgICAgZW5kOiBmdW5jdGlvbihleHBlY3RhdGlvbikge1xuICAgICAgICAgIHJldHVybiBcImVuZCBvZiBpbnB1dFwiO1xuICAgICAgICB9LFxuXG4gICAgICAgIG90aGVyOiBmdW5jdGlvbihleHBlY3RhdGlvbikge1xuICAgICAgICAgIHJldHVybiBleHBlY3RhdGlvbi5kZXNjcmlwdGlvbjtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICBmdW5jdGlvbiBoZXgoY2gpIHtcbiAgICByZXR1cm4gY2guY2hhckNvZGVBdCgwKS50b1N0cmluZygxNikudG9VcHBlckNhc2UoKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGxpdGVyYWxFc2NhcGUocykge1xuICAgIHJldHVybiBzXG4gICAgICAucmVwbGFjZSgvXFxcXC9nLCAnXFxcXFxcXFwnKVxuICAgICAgLnJlcGxhY2UoL1wiL2csICAnXFxcXFwiJylcbiAgICAgIC5yZXBsYWNlKC9cXDAvZywgJ1xcXFwwJylcbiAgICAgIC5yZXBsYWNlKC9cXHQvZywgJ1xcXFx0JylcbiAgICAgIC5yZXBsYWNlKC9cXG4vZywgJ1xcXFxuJylcbiAgICAgIC5yZXBsYWNlKC9cXHIvZywgJ1xcXFxyJylcbiAgICAgIC5yZXBsYWNlKC9bXFx4MDAtXFx4MEZdL2csICAgICAgICAgIGZ1bmN0aW9uKGNoKSB7IHJldHVybiAnXFxcXHgwJyArIGhleChjaCk7IH0pXG4gICAgICAucmVwbGFjZSgvW1xceDEwLVxceDFGXFx4N0YtXFx4OUZdL2csIGZ1bmN0aW9uKGNoKSB7IHJldHVybiAnXFxcXHgnICArIGhleChjaCk7IH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gY2xhc3NFc2NhcGUocykge1xuICAgIHJldHVybiBzXG4gICAgICAucmVwbGFjZSgvXFxcXC9nLCAnXFxcXFxcXFwnKVxuICAgICAgLnJlcGxhY2UoL1xcXS9nLCAnXFxcXF0nKVxuICAgICAgLnJlcGxhY2UoL1xcXi9nLCAnXFxcXF4nKVxuICAgICAgLnJlcGxhY2UoLy0vZywgICdcXFxcLScpXG4gICAgICAucmVwbGFjZSgvXFwwL2csICdcXFxcMCcpXG4gICAgICAucmVwbGFjZSgvXFx0L2csICdcXFxcdCcpXG4gICAgICAucmVwbGFjZSgvXFxuL2csICdcXFxcbicpXG4gICAgICAucmVwbGFjZSgvXFxyL2csICdcXFxccicpXG4gICAgICAucmVwbGFjZSgvW1xceDAwLVxceDBGXS9nLCAgICAgICAgICBmdW5jdGlvbihjaCkgeyByZXR1cm4gJ1xcXFx4MCcgKyBoZXgoY2gpOyB9KVxuICAgICAgLnJlcGxhY2UoL1tcXHgxMC1cXHgxRlxceDdGLVxceDlGXS9nLCBmdW5jdGlvbihjaCkgeyByZXR1cm4gJ1xcXFx4JyAgKyBoZXgoY2gpOyB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGRlc2NyaWJlRXhwZWN0YXRpb24oZXhwZWN0YXRpb24pIHtcbiAgICByZXR1cm4gREVTQ1JJQkVfRVhQRUNUQVRJT05fRk5TW2V4cGVjdGF0aW9uLnR5cGVdKGV4cGVjdGF0aW9uKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGRlc2NyaWJlRXhwZWN0ZWQoZXhwZWN0ZWQpIHtcbiAgICB2YXIgZGVzY3JpcHRpb25zID0gbmV3IEFycmF5KGV4cGVjdGVkLmxlbmd0aCksXG4gICAgICAgIGksIGo7XG5cbiAgICBmb3IgKGkgPSAwOyBpIDwgZXhwZWN0ZWQubGVuZ3RoOyBpKyspIHtcbiAgICAgIGRlc2NyaXB0aW9uc1tpXSA9IGRlc2NyaWJlRXhwZWN0YXRpb24oZXhwZWN0ZWRbaV0pO1xuICAgIH1cblxuICAgIGRlc2NyaXB0aW9ucy5zb3J0KCk7XG5cbiAgICBpZiAoZGVzY3JpcHRpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgIGZvciAoaSA9IDEsIGogPSAxOyBpIDwgZGVzY3JpcHRpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChkZXNjcmlwdGlvbnNbaSAtIDFdICE9PSBkZXNjcmlwdGlvbnNbaV0pIHtcbiAgICAgICAgICBkZXNjcmlwdGlvbnNbal0gPSBkZXNjcmlwdGlvbnNbaV07XG4gICAgICAgICAgaisrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBkZXNjcmlwdGlvbnMubGVuZ3RoID0gajtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKGRlc2NyaXB0aW9ucy5sZW5ndGgpIHtcbiAgICAgIGNhc2UgMTpcbiAgICAgICAgcmV0dXJuIGRlc2NyaXB0aW9uc1swXTtcblxuICAgICAgY2FzZSAyOlxuICAgICAgICByZXR1cm4gZGVzY3JpcHRpb25zWzBdICsgXCIgb3IgXCIgKyBkZXNjcmlwdGlvbnNbMV07XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBkZXNjcmlwdGlvbnMuc2xpY2UoMCwgLTEpLmpvaW4oXCIsIFwiKVxuICAgICAgICAgICsgXCIsIG9yIFwiXG4gICAgICAgICAgKyBkZXNjcmlwdGlvbnNbZGVzY3JpcHRpb25zLmxlbmd0aCAtIDFdO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGRlc2NyaWJlRm91bmQoZm91bmQpIHtcbiAgICByZXR1cm4gZm91bmQgPyBcIlxcXCJcIiArIGxpdGVyYWxFc2NhcGUoZm91bmQpICsgXCJcXFwiXCIgOiBcImVuZCBvZiBpbnB1dFwiO1xuICB9XG5cbiAgcmV0dXJuIFwiRXhwZWN0ZWQgXCIgKyBkZXNjcmliZUV4cGVjdGVkKGV4cGVjdGVkKSArIFwiIGJ1dCBcIiArIGRlc2NyaWJlRm91bmQoZm91bmQpICsgXCIgZm91bmQuXCI7XG59O1xuXG5mdW5jdGlvbiBwZWckcGFyc2UoaW5wdXQsIG9wdGlvbnMpIHtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgIT09IHZvaWQgMCA/IG9wdGlvbnMgOiB7fTtcblxuICB2YXIgcGVnJEZBSUxFRCA9IHt9LFxuXG4gICAgICBwZWckc3RhcnRSdWxlRnVuY3Rpb25zID0geyBzdmdfcGF0aDogcGVnJHBhcnNlc3ZnX3BhdGggfSxcbiAgICAgIHBlZyRzdGFydFJ1bGVGdW5jdGlvbiAgPSBwZWckcGFyc2VzdmdfcGF0aCxcblxuICAgICAgcGVnJGMwID0gZnVuY3Rpb24oZGF0YSkge1xuICAgICAgICAgIGlmICghZGF0YSkgcmV0dXJuIFtdO1xuICAgICAgICAgIGZvciAodmFyIGNtZHM9W10saT0wO2k8ZGF0YS5sZW5ndGg7aSsrKSBjbWRzPWNtZHMuY29uY2F0LmFwcGx5KGNtZHMsZGF0YVtpXSk7XG4gICAgICAgICAgdmFyIGZpcnN0PWNtZHNbMF07XG4gICAgICAgICAgaWYgKGZpcnN0ICYmIGZpcnN0LmNvZGU9PSdtJyl7IC8vIFBlciBzcGVjLCBmaXJzdCBtb3ZldG8gaXMgbmV2ZXIgcmVsYXRpdmVcbiAgICAgICAgICAgIGRlbGV0ZSBmaXJzdC5yZWxhdGl2ZTtcbiAgICAgICAgICAgIGZpcnN0LmNvZGUgPSAnTSc7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBjbWRzO1xuICAgICAgICB9LFxuICAgICAgcGVnJGMxID0gZnVuY3Rpb24oZmlyc3QsIG1vcmUpIHsgcmV0dXJuIG1lcmdlKGZpcnN0LG1vcmUpIH0sXG4gICAgICBwZWckYzIgPSAvXltNbV0vLFxuICAgICAgcGVnJGMzID0gcGVnJGNsYXNzRXhwZWN0YXRpb24oW1wiTVwiLCBcIm1cIl0sIGZhbHNlLCBmYWxzZSksXG4gICAgICBwZWckYzQgPSBmdW5jdGlvbihjLCBmaXJzdCwgbW9yZSkge1xuICAgICAgICAgIHZhciBtb3ZlID0gY29tbWFuZHMoYyxbZmlyc3RdKTtcbiAgICAgICAgICBpZiAobW9yZSkgbW92ZSA9IG1vdmUuY29uY2F0KGNvbW1hbmRzKGM9PSdNJyA/ICdMJyA6ICdsJyxtb3JlWzFdKSk7XG4gICAgICAgICAgcmV0dXJuIG1vdmU7XG4gICAgICAgIH0sXG4gICAgICBwZWckYzUgPSAvXltael0vLFxuICAgICAgcGVnJGM2ID0gcGVnJGNsYXNzRXhwZWN0YXRpb24oW1wiWlwiLCBcInpcIl0sIGZhbHNlLCBmYWxzZSksXG4gICAgICBwZWckYzcgPSBmdW5jdGlvbigpIHsgcmV0dXJuIGNvbW1hbmRzKCdaJykgfSxcbiAgICAgIHBlZyRjOCA9IC9eW0xsXS8sXG4gICAgICBwZWckYzkgPSBwZWckY2xhc3NFeHBlY3RhdGlvbihbXCJMXCIsIFwibFwiXSwgZmFsc2UsIGZhbHNlKSxcbiAgICAgIHBlZyRjMTAgPSBmdW5jdGlvbihjLCBhcmdzKSB7IHJldHVybiBjb21tYW5kcyhjLGFyZ3MpIH0sXG4gICAgICBwZWckYzExID0gL15bSGhdLyxcbiAgICAgIHBlZyRjMTIgPSBwZWckY2xhc3NFeHBlY3RhdGlvbihbXCJIXCIsIFwiaFwiXSwgZmFsc2UsIGZhbHNlKSxcbiAgICAgIHBlZyRjMTMgPSBmdW5jdGlvbihjLCBhcmdzKSB7IHJldHVybiBjb21tYW5kcyhjLGFyZ3MubWFwKGZ1bmN0aW9uKHgpeyByZXR1cm4ge3g6eH19KSkgfSxcbiAgICAgIHBlZyRjMTQgPSAvXltWdl0vLFxuICAgICAgcGVnJGMxNSA9IHBlZyRjbGFzc0V4cGVjdGF0aW9uKFtcIlZcIiwgXCJ2XCJdLCBmYWxzZSwgZmFsc2UpLFxuICAgICAgcGVnJGMxNiA9IGZ1bmN0aW9uKGMsIGFyZ3MpIHsgcmV0dXJuIGNvbW1hbmRzKGMsYXJncy5tYXAoZnVuY3Rpb24oeSl7IHJldHVybiB7eTp5fX0pKSB9LFxuICAgICAgcGVnJGMxNyA9IC9eW0NjXS8sXG4gICAgICBwZWckYzE4ID0gcGVnJGNsYXNzRXhwZWN0YXRpb24oW1wiQ1wiLCBcImNcIl0sIGZhbHNlLCBmYWxzZSksXG4gICAgICBwZWckYzE5ID0gZnVuY3Rpb24oYSwgYiwgYykgeyByZXR1cm4geyB4MTphLngsIHkxOmEueSwgeDI6Yi54LCB5MjpiLnksIHg6Yy54LCB5OmMueSB9IH0sXG4gICAgICBwZWckYzIwID0gL15bU3NdLyxcbiAgICAgIHBlZyRjMjEgPSBwZWckY2xhc3NFeHBlY3RhdGlvbihbXCJTXCIsIFwic1wiXSwgZmFsc2UsIGZhbHNlKSxcbiAgICAgIHBlZyRjMjIgPSBmdW5jdGlvbihiLCBjKSB7IHJldHVybiB7IHgyOmIueCwgeTI6Yi55LCB4OmMueCwgeTpjLnkgfSB9LFxuICAgICAgcGVnJGMyMyA9IC9eW1FxXS8sXG4gICAgICBwZWckYzI0ID0gcGVnJGNsYXNzRXhwZWN0YXRpb24oW1wiUVwiLCBcInFcIl0sIGZhbHNlLCBmYWxzZSksXG4gICAgICBwZWckYzI1ID0gZnVuY3Rpb24oYSwgYikgeyByZXR1cm4geyB4MTphLngsIHkxOmEueSwgeDpiLngsIHk6Yi55IH0gfSxcbiAgICAgIHBlZyRjMjYgPSAvXltUdF0vLFxuICAgICAgcGVnJGMyNyA9IHBlZyRjbGFzc0V4cGVjdGF0aW9uKFtcIlRcIiwgXCJ0XCJdLCBmYWxzZSwgZmFsc2UpLFxuICAgICAgcGVnJGMyOCA9IC9eW0FhXS8sXG4gICAgICBwZWckYzI5ID0gcGVnJGNsYXNzRXhwZWN0YXRpb24oW1wiQVwiLCBcImFcIl0sIGZhbHNlLCBmYWxzZSksXG4gICAgICBwZWckYzMwID0gZnVuY3Rpb24ocngsIHJ5LCB4cm90LCBsYXJnZSwgc3dlZXAsIHh5KSB7IHJldHVybiB7IHJ4OnJ4LCByeTpyeSwgeEF4aXNSb3RhdGlvbjp4cm90LCBsYXJnZUFyYzpsYXJnZSwgc3dlZXA6c3dlZXAsIHg6eHkueCwgeTp4eS55IH0gfSxcbiAgICAgIHBlZyRjMzEgPSBmdW5jdGlvbih4LCB5KSB7IHJldHVybiB7IHg6eCwgeTp5IH0gfSxcbiAgICAgIHBlZyRjMzIgPSBmdW5jdGlvbihuKSB7IHJldHVybiBuKjEgfSxcbiAgICAgIHBlZyRjMzMgPSBmdW5jdGlvbihwYXJ0cykgeyByZXR1cm4gcGFydHMuam9pbignJykqMSB9LFxuICAgICAgcGVnJGMzNCA9IC9eWzAxXS8sXG4gICAgICBwZWckYzM1ID0gcGVnJGNsYXNzRXhwZWN0YXRpb24oW1wiMFwiLCBcIjFcIl0sIGZhbHNlLCBmYWxzZSksXG4gICAgICBwZWckYzM2ID0gZnVuY3Rpb24oYml0KSB7IHJldHVybiBiaXQ9PScxJyB9LFxuICAgICAgcGVnJGMzNyA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gJycgfSxcbiAgICAgIHBlZyRjMzggPSBcIixcIixcbiAgICAgIHBlZyRjMzkgPSBwZWckbGl0ZXJhbEV4cGVjdGF0aW9uKFwiLFwiLCBmYWxzZSksXG4gICAgICBwZWckYzQwID0gZnVuY3Rpb24ocGFydHMpIHsgcmV0dXJuIHBhcnRzLmpvaW4oJycpIH0sXG4gICAgICBwZWckYzQxID0gXCIuXCIsXG4gICAgICBwZWckYzQyID0gcGVnJGxpdGVyYWxFeHBlY3RhdGlvbihcIi5cIiwgZmFsc2UpLFxuICAgICAgcGVnJGM0MyA9IC9eW2VFXS8sXG4gICAgICBwZWckYzQ0ID0gcGVnJGNsYXNzRXhwZWN0YXRpb24oW1wiZVwiLCBcIkVcIl0sIGZhbHNlLCBmYWxzZSksXG4gICAgICBwZWckYzQ1ID0gL15bK1xcLV0vLFxuICAgICAgcGVnJGM0NiA9IHBlZyRjbGFzc0V4cGVjdGF0aW9uKFtcIitcIiwgXCItXCJdLCBmYWxzZSwgZmFsc2UpLFxuICAgICAgcGVnJGM0NyA9IC9eWzAtOV0vLFxuICAgICAgcGVnJGM0OCA9IHBlZyRjbGFzc0V4cGVjdGF0aW9uKFtbXCIwXCIsIFwiOVwiXV0sIGZhbHNlLCBmYWxzZSksXG4gICAgICBwZWckYzQ5ID0gZnVuY3Rpb24oZGlnaXRzKSB7IHJldHVybiBkaWdpdHMuam9pbignJykgfSxcbiAgICAgIHBlZyRjNTAgPSAvXlsgXFx0XFxuXFxyXS8sXG4gICAgICBwZWckYzUxID0gcGVnJGNsYXNzRXhwZWN0YXRpb24oW1wiIFwiLCBcIlxcdFwiLCBcIlxcblwiLCBcIlxcclwiXSwgZmFsc2UsIGZhbHNlKSxcblxuICAgICAgcGVnJGN1cnJQb3MgICAgICAgICAgPSAwLFxuICAgICAgcGVnJHNhdmVkUG9zICAgICAgICAgPSAwLFxuICAgICAgcGVnJHBvc0RldGFpbHNDYWNoZSAgPSBbeyBsaW5lOiAxLCBjb2x1bW46IDEgfV0sXG4gICAgICBwZWckbWF4RmFpbFBvcyAgICAgICA9IDAsXG4gICAgICBwZWckbWF4RmFpbEV4cGVjdGVkICA9IFtdLFxuICAgICAgcGVnJHNpbGVudEZhaWxzICAgICAgPSAwLFxuXG4gICAgICBwZWckcmVzdWx0O1xuXG4gIGlmIChcInN0YXJ0UnVsZVwiIGluIG9wdGlvbnMpIHtcbiAgICBpZiAoIShvcHRpb25zLnN0YXJ0UnVsZSBpbiBwZWckc3RhcnRSdWxlRnVuY3Rpb25zKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2FuJ3Qgc3RhcnQgcGFyc2luZyBmcm9tIHJ1bGUgXFxcIlwiICsgb3B0aW9ucy5zdGFydFJ1bGUgKyBcIlxcXCIuXCIpO1xuICAgIH1cblxuICAgIHBlZyRzdGFydFJ1bGVGdW5jdGlvbiA9IHBlZyRzdGFydFJ1bGVGdW5jdGlvbnNbb3B0aW9ucy5zdGFydFJ1bGVdO1xuICB9XG5cbiAgZnVuY3Rpb24gdGV4dCgpIHtcbiAgICByZXR1cm4gaW5wdXQuc3Vic3RyaW5nKHBlZyRzYXZlZFBvcywgcGVnJGN1cnJQb3MpO1xuICB9XG5cbiAgZnVuY3Rpb24gbG9jYXRpb24oKSB7XG4gICAgcmV0dXJuIHBlZyRjb21wdXRlTG9jYXRpb24ocGVnJHNhdmVkUG9zLCBwZWckY3VyclBvcyk7XG4gIH1cblxuICBmdW5jdGlvbiBleHBlY3RlZChkZXNjcmlwdGlvbiwgbG9jYXRpb24pIHtcbiAgICBsb2NhdGlvbiA9IGxvY2F0aW9uICE9PSB2b2lkIDAgPyBsb2NhdGlvbiA6IHBlZyRjb21wdXRlTG9jYXRpb24ocGVnJHNhdmVkUG9zLCBwZWckY3VyclBvcylcblxuICAgIHRocm93IHBlZyRidWlsZFN0cnVjdHVyZWRFcnJvcihcbiAgICAgIFtwZWckb3RoZXJFeHBlY3RhdGlvbihkZXNjcmlwdGlvbildLFxuICAgICAgaW5wdXQuc3Vic3RyaW5nKHBlZyRzYXZlZFBvcywgcGVnJGN1cnJQb3MpLFxuICAgICAgbG9jYXRpb25cbiAgICApO1xuICB9XG5cbiAgZnVuY3Rpb24gZXJyb3IobWVzc2FnZSwgbG9jYXRpb24pIHtcbiAgICBsb2NhdGlvbiA9IGxvY2F0aW9uICE9PSB2b2lkIDAgPyBsb2NhdGlvbiA6IHBlZyRjb21wdXRlTG9jYXRpb24ocGVnJHNhdmVkUG9zLCBwZWckY3VyclBvcylcblxuICAgIHRocm93IHBlZyRidWlsZFNpbXBsZUVycm9yKG1lc3NhZ2UsIGxvY2F0aW9uKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHBlZyRsaXRlcmFsRXhwZWN0YXRpb24odGV4dCwgaWdub3JlQ2FzZSkge1xuICAgIHJldHVybiB7IHR5cGU6IFwibGl0ZXJhbFwiLCB0ZXh0OiB0ZXh0LCBpZ25vcmVDYXNlOiBpZ25vcmVDYXNlIH07XG4gIH1cblxuICBmdW5jdGlvbiBwZWckY2xhc3NFeHBlY3RhdGlvbihwYXJ0cywgaW52ZXJ0ZWQsIGlnbm9yZUNhc2UpIHtcbiAgICByZXR1cm4geyB0eXBlOiBcImNsYXNzXCIsIHBhcnRzOiBwYXJ0cywgaW52ZXJ0ZWQ6IGludmVydGVkLCBpZ25vcmVDYXNlOiBpZ25vcmVDYXNlIH07XG4gIH1cblxuICBmdW5jdGlvbiBwZWckYW55RXhwZWN0YXRpb24oKSB7XG4gICAgcmV0dXJuIHsgdHlwZTogXCJhbnlcIiB9O1xuICB9XG5cbiAgZnVuY3Rpb24gcGVnJGVuZEV4cGVjdGF0aW9uKCkge1xuICAgIHJldHVybiB7IHR5cGU6IFwiZW5kXCIgfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHBlZyRvdGhlckV4cGVjdGF0aW9uKGRlc2NyaXB0aW9uKSB7XG4gICAgcmV0dXJuIHsgdHlwZTogXCJvdGhlclwiLCBkZXNjcmlwdGlvbjogZGVzY3JpcHRpb24gfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHBlZyRjb21wdXRlUG9zRGV0YWlscyhwb3MpIHtcbiAgICB2YXIgZGV0YWlscyA9IHBlZyRwb3NEZXRhaWxzQ2FjaGVbcG9zXSwgcDtcblxuICAgIGlmIChkZXRhaWxzKSB7XG4gICAgICByZXR1cm4gZGV0YWlscztcbiAgICB9IGVsc2Uge1xuICAgICAgcCA9IHBvcyAtIDE7XG4gICAgICB3aGlsZSAoIXBlZyRwb3NEZXRhaWxzQ2FjaGVbcF0pIHtcbiAgICAgICAgcC0tO1xuICAgICAgfVxuXG4gICAgICBkZXRhaWxzID0gcGVnJHBvc0RldGFpbHNDYWNoZVtwXTtcbiAgICAgIGRldGFpbHMgPSB7XG4gICAgICAgIGxpbmU6ICAgZGV0YWlscy5saW5lLFxuICAgICAgICBjb2x1bW46IGRldGFpbHMuY29sdW1uXG4gICAgICB9O1xuXG4gICAgICB3aGlsZSAocCA8IHBvcykge1xuICAgICAgICBpZiAoaW5wdXQuY2hhckNvZGVBdChwKSA9PT0gMTApIHtcbiAgICAgICAgICBkZXRhaWxzLmxpbmUrKztcbiAgICAgICAgICBkZXRhaWxzLmNvbHVtbiA9IDE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZGV0YWlscy5jb2x1bW4rKztcbiAgICAgICAgfVxuXG4gICAgICAgIHArKztcbiAgICAgIH1cblxuICAgICAgcGVnJHBvc0RldGFpbHNDYWNoZVtwb3NdID0gZGV0YWlscztcbiAgICAgIHJldHVybiBkZXRhaWxzO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHBlZyRjb21wdXRlTG9jYXRpb24oc3RhcnRQb3MsIGVuZFBvcykge1xuICAgIHZhciBzdGFydFBvc0RldGFpbHMgPSBwZWckY29tcHV0ZVBvc0RldGFpbHMoc3RhcnRQb3MpLFxuICAgICAgICBlbmRQb3NEZXRhaWxzICAgPSBwZWckY29tcHV0ZVBvc0RldGFpbHMoZW5kUG9zKTtcblxuICAgIHJldHVybiB7XG4gICAgICBzdGFydDoge1xuICAgICAgICBvZmZzZXQ6IHN0YXJ0UG9zLFxuICAgICAgICBsaW5lOiAgIHN0YXJ0UG9zRGV0YWlscy5saW5lLFxuICAgICAgICBjb2x1bW46IHN0YXJ0UG9zRGV0YWlscy5jb2x1bW5cbiAgICAgIH0sXG4gICAgICBlbmQ6IHtcbiAgICAgICAgb2Zmc2V0OiBlbmRQb3MsXG4gICAgICAgIGxpbmU6ICAgZW5kUG9zRGV0YWlscy5saW5lLFxuICAgICAgICBjb2x1bW46IGVuZFBvc0RldGFpbHMuY29sdW1uXG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHBlZyRmYWlsKGV4cGVjdGVkKSB7XG4gICAgaWYgKHBlZyRjdXJyUG9zIDwgcGVnJG1heEZhaWxQb3MpIHsgcmV0dXJuOyB9XG5cbiAgICBpZiAocGVnJGN1cnJQb3MgPiBwZWckbWF4RmFpbFBvcykge1xuICAgICAgcGVnJG1heEZhaWxQb3MgPSBwZWckY3VyclBvcztcbiAgICAgIHBlZyRtYXhGYWlsRXhwZWN0ZWQgPSBbXTtcbiAgICB9XG5cbiAgICBwZWckbWF4RmFpbEV4cGVjdGVkLnB1c2goZXhwZWN0ZWQpO1xuICB9XG5cbiAgZnVuY3Rpb24gcGVnJGJ1aWxkU2ltcGxlRXJyb3IobWVzc2FnZSwgbG9jYXRpb24pIHtcbiAgICByZXR1cm4gbmV3IHBlZyRTeW50YXhFcnJvcihtZXNzYWdlLCBudWxsLCBudWxsLCBsb2NhdGlvbik7XG4gIH1cblxuICBmdW5jdGlvbiBwZWckYnVpbGRTdHJ1Y3R1cmVkRXJyb3IoZXhwZWN0ZWQsIGZvdW5kLCBsb2NhdGlvbikge1xuICAgIHJldHVybiBuZXcgcGVnJFN5bnRheEVycm9yKFxuICAgICAgcGVnJFN5bnRheEVycm9yLmJ1aWxkTWVzc2FnZShleHBlY3RlZCwgZm91bmQpLFxuICAgICAgZXhwZWN0ZWQsXG4gICAgICBmb3VuZCxcbiAgICAgIGxvY2F0aW9uXG4gICAgKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHBlZyRwYXJzZXN2Z19wYXRoKCkge1xuICAgIHZhciBzMCwgczEsIHMyLCBzMywgczQ7XG5cbiAgICBzMCA9IHBlZyRjdXJyUG9zO1xuICAgIHMxID0gW107XG4gICAgczIgPSBwZWckcGFyc2V3c3AoKTtcbiAgICB3aGlsZSAoczIgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgIHMxLnB1c2goczIpO1xuICAgICAgczIgPSBwZWckcGFyc2V3c3AoKTtcbiAgICB9XG4gICAgaWYgKHMxICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICBzMiA9IHBlZyRwYXJzZW1vdmVUb19kcmF3VG9fY29tbWFuZEdyb3VwcygpO1xuICAgICAgaWYgKHMyID09PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHMyID0gbnVsbDtcbiAgICAgIH1cbiAgICAgIGlmIChzMiAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBzMyA9IFtdO1xuICAgICAgICBzNCA9IHBlZyRwYXJzZXdzcCgpO1xuICAgICAgICB3aGlsZSAoczQgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICBzMy5wdXNoKHM0KTtcbiAgICAgICAgICBzNCA9IHBlZyRwYXJzZXdzcCgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzMyAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgIHBlZyRzYXZlZFBvcyA9IHMwO1xuICAgICAgICAgIHMxID0gcGVnJGMwKHMyKTtcbiAgICAgICAgICBzMCA9IHMxO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHMwO1xuICB9XG5cbiAgZnVuY3Rpb24gcGVnJHBhcnNlbW92ZVRvX2RyYXdUb19jb21tYW5kR3JvdXBzKCkge1xuICAgIHZhciBzMCwgczEsIHMyLCBzMywgczQsIHM1O1xuXG4gICAgczAgPSBwZWckY3VyclBvcztcbiAgICBzMSA9IHBlZyRwYXJzZW1vdmVUb19kcmF3VG9fY29tbWFuZEdyb3VwKCk7XG4gICAgaWYgKHMxICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICBzMiA9IFtdO1xuICAgICAgczMgPSBwZWckY3VyclBvcztcbiAgICAgIHM0ID0gW107XG4gICAgICBzNSA9IHBlZyRwYXJzZXdzcCgpO1xuICAgICAgd2hpbGUgKHM1ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHM0LnB1c2goczUpO1xuICAgICAgICBzNSA9IHBlZyRwYXJzZXdzcCgpO1xuICAgICAgfVxuICAgICAgaWYgKHM0ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHM1ID0gcGVnJHBhcnNlbW92ZVRvX2RyYXdUb19jb21tYW5kR3JvdXAoKTtcbiAgICAgICAgaWYgKHM1ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgczQgPSBbczQsIHM1XTtcbiAgICAgICAgICBzMyA9IHM0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBlZyRjdXJyUG9zID0gczM7XG4gICAgICAgICAgczMgPSBwZWckRkFJTEVEO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwZWckY3VyclBvcyA9IHMzO1xuICAgICAgICBzMyA9IHBlZyRGQUlMRUQ7XG4gICAgICB9XG4gICAgICB3aGlsZSAoczMgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgczIucHVzaChzMyk7XG4gICAgICAgIHMzID0gcGVnJGN1cnJQb3M7XG4gICAgICAgIHM0ID0gW107XG4gICAgICAgIHM1ID0gcGVnJHBhcnNld3NwKCk7XG4gICAgICAgIHdoaWxlIChzNSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgIHM0LnB1c2goczUpO1xuICAgICAgICAgIHM1ID0gcGVnJHBhcnNld3NwKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHM0ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgczUgPSBwZWckcGFyc2Vtb3ZlVG9fZHJhd1RvX2NvbW1hbmRHcm91cCgpO1xuICAgICAgICAgIGlmIChzNSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgczQgPSBbczQsIHM1XTtcbiAgICAgICAgICAgIHMzID0gczQ7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczM7XG4gICAgICAgICAgICBzMyA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBlZyRjdXJyUG9zID0gczM7XG4gICAgICAgICAgczMgPSBwZWckRkFJTEVEO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoczIgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgcGVnJHNhdmVkUG9zID0gczA7XG4gICAgICAgIHMxID0gcGVnJGMxKHMxLCBzMik7XG4gICAgICAgIHMwID0gczE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHMwO1xuICB9XG5cbiAgZnVuY3Rpb24gcGVnJHBhcnNlbW92ZVRvX2RyYXdUb19jb21tYW5kR3JvdXAoKSB7XG4gICAgdmFyIHMwLCBzMSwgczIsIHMzLCBzNCwgczU7XG5cbiAgICBzMCA9IHBlZyRjdXJyUG9zO1xuICAgIHMxID0gcGVnJHBhcnNlbW92ZXRvKCk7XG4gICAgaWYgKHMxICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICBzMiA9IFtdO1xuICAgICAgczMgPSBwZWckY3VyclBvcztcbiAgICAgIHM0ID0gW107XG4gICAgICBzNSA9IHBlZyRwYXJzZXdzcCgpO1xuICAgICAgd2hpbGUgKHM1ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHM0LnB1c2goczUpO1xuICAgICAgICBzNSA9IHBlZyRwYXJzZXdzcCgpO1xuICAgICAgfVxuICAgICAgaWYgKHM0ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHM1ID0gcGVnJHBhcnNlZHJhd3RvX2NvbW1hbmQoKTtcbiAgICAgICAgaWYgKHM1ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgczQgPSBbczQsIHM1XTtcbiAgICAgICAgICBzMyA9IHM0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBlZyRjdXJyUG9zID0gczM7XG4gICAgICAgICAgczMgPSBwZWckRkFJTEVEO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwZWckY3VyclBvcyA9IHMzO1xuICAgICAgICBzMyA9IHBlZyRGQUlMRUQ7XG4gICAgICB9XG4gICAgICB3aGlsZSAoczMgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgczIucHVzaChzMyk7XG4gICAgICAgIHMzID0gcGVnJGN1cnJQb3M7XG4gICAgICAgIHM0ID0gW107XG4gICAgICAgIHM1ID0gcGVnJHBhcnNld3NwKCk7XG4gICAgICAgIHdoaWxlIChzNSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgIHM0LnB1c2goczUpO1xuICAgICAgICAgIHM1ID0gcGVnJHBhcnNld3NwKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHM0ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgczUgPSBwZWckcGFyc2VkcmF3dG9fY29tbWFuZCgpO1xuICAgICAgICAgIGlmIChzNSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgczQgPSBbczQsIHM1XTtcbiAgICAgICAgICAgIHMzID0gczQ7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczM7XG4gICAgICAgICAgICBzMyA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBlZyRjdXJyUG9zID0gczM7XG4gICAgICAgICAgczMgPSBwZWckRkFJTEVEO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoczIgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgcGVnJHNhdmVkUG9zID0gczA7XG4gICAgICAgIHMxID0gcGVnJGMxKHMxLCBzMik7XG4gICAgICAgIHMwID0gczE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHMwO1xuICB9XG5cbiAgZnVuY3Rpb24gcGVnJHBhcnNlZHJhd3RvX2NvbW1hbmQoKSB7XG4gICAgdmFyIHMwO1xuXG4gICAgczAgPSBwZWckcGFyc2VjbG9zZXBhdGgoKTtcbiAgICBpZiAoczAgPT09IHBlZyRGQUlMRUQpIHtcbiAgICAgIHMwID0gcGVnJHBhcnNlbGluZXRvKCk7XG4gICAgICBpZiAoczAgPT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgczAgPSBwZWckcGFyc2Vob3Jpem9udGFsX2xpbmV0bygpO1xuICAgICAgICBpZiAoczAgPT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICBzMCA9IHBlZyRwYXJzZXZlcnRpY2FsX2xpbmV0bygpO1xuICAgICAgICAgIGlmIChzMCA9PT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgczAgPSBwZWckcGFyc2VjdXJ2ZXRvKCk7XG4gICAgICAgICAgICBpZiAoczAgPT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgICAgczAgPSBwZWckcGFyc2VzbW9vdGhfY3VydmV0bygpO1xuICAgICAgICAgICAgICBpZiAoczAgPT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgICAgICBzMCA9IHBlZyRwYXJzZXF1YWRyYXRpY19iZXppZXJfY3VydmV0bygpO1xuICAgICAgICAgICAgICAgIGlmIChzMCA9PT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgICAgICAgczAgPSBwZWckcGFyc2VzbW9vdGhfcXVhZHJhdGljX2Jlemllcl9jdXJ2ZXRvKCk7XG4gICAgICAgICAgICAgICAgICBpZiAoczAgPT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgICAgICAgICAgczAgPSBwZWckcGFyc2VlbGxpcHRpY2FsX2FyYygpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBzMDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHBlZyRwYXJzZW1vdmV0bygpIHtcbiAgICB2YXIgczAsIHMxLCBzMiwgczMsIHM0LCBzNSwgczY7XG5cbiAgICBzMCA9IHBlZyRjdXJyUG9zO1xuICAgIGlmIChwZWckYzIudGVzdChpbnB1dC5jaGFyQXQocGVnJGN1cnJQb3MpKSkge1xuICAgICAgczEgPSBpbnB1dC5jaGFyQXQocGVnJGN1cnJQb3MpO1xuICAgICAgcGVnJGN1cnJQb3MrKztcbiAgICB9IGVsc2Uge1xuICAgICAgczEgPSBwZWckRkFJTEVEO1xuICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzMpOyB9XG4gICAgfVxuICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgczIgPSBbXTtcbiAgICAgIHMzID0gcGVnJHBhcnNld3NwKCk7XG4gICAgICB3aGlsZSAoczMgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgczIucHVzaChzMyk7XG4gICAgICAgIHMzID0gcGVnJHBhcnNld3NwKCk7XG4gICAgICB9XG4gICAgICBpZiAoczIgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgczMgPSBwZWckcGFyc2Vjb29yZGluYXRlX3BhaXIoKTtcbiAgICAgICAgaWYgKHMzICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgczQgPSBwZWckY3VyclBvcztcbiAgICAgICAgICBzNSA9IHBlZyRwYXJzZWNvbW1hX3dzcCgpO1xuICAgICAgICAgIGlmIChzNSA9PT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgczUgPSBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoczUgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgIHM2ID0gcGVnJHBhcnNlbGluZXRvX2FyZ3VtZW50X3NlcXVlbmNlKCk7XG4gICAgICAgICAgICBpZiAoczYgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgICAgczUgPSBbczUsIHM2XTtcbiAgICAgICAgICAgICAgczQgPSBzNTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczQ7XG4gICAgICAgICAgICAgIHM0ID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzNDtcbiAgICAgICAgICAgIHM0ID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHM0ID09PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICBzNCA9IG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChzNCAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgcGVnJHNhdmVkUG9zID0gczA7XG4gICAgICAgICAgICBzMSA9IHBlZyRjNChzMSwgczMsIHM0KTtcbiAgICAgICAgICAgIHMwID0gczE7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHMwO1xuICB9XG5cbiAgZnVuY3Rpb24gcGVnJHBhcnNlY2xvc2VwYXRoKCkge1xuICAgIHZhciBzMCwgczE7XG5cbiAgICBzMCA9IHBlZyRjdXJyUG9zO1xuICAgIGlmIChwZWckYzUudGVzdChpbnB1dC5jaGFyQXQocGVnJGN1cnJQb3MpKSkge1xuICAgICAgczEgPSBpbnB1dC5jaGFyQXQocGVnJGN1cnJQb3MpO1xuICAgICAgcGVnJGN1cnJQb3MrKztcbiAgICB9IGVsc2Uge1xuICAgICAgczEgPSBwZWckRkFJTEVEO1xuICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzYpOyB9XG4gICAgfVxuICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgcGVnJHNhdmVkUG9zID0gczA7XG4gICAgICBzMSA9IHBlZyRjNygpO1xuICAgIH1cbiAgICBzMCA9IHMxO1xuXG4gICAgcmV0dXJuIHMwO1xuICB9XG5cbiAgZnVuY3Rpb24gcGVnJHBhcnNlbGluZXRvKCkge1xuICAgIHZhciBzMCwgczEsIHMyLCBzMztcblxuICAgIHMwID0gcGVnJGN1cnJQb3M7XG4gICAgaWYgKHBlZyRjOC50ZXN0KGlucHV0LmNoYXJBdChwZWckY3VyclBvcykpKSB7XG4gICAgICBzMSA9IGlucHV0LmNoYXJBdChwZWckY3VyclBvcyk7XG4gICAgICBwZWckY3VyclBvcysrO1xuICAgIH0gZWxzZSB7XG4gICAgICBzMSA9IHBlZyRGQUlMRUQ7XG4gICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjOSk7IH1cbiAgICB9XG4gICAgaWYgKHMxICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICBzMiA9IFtdO1xuICAgICAgczMgPSBwZWckcGFyc2V3c3AoKTtcbiAgICAgIHdoaWxlIChzMyAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBzMi5wdXNoKHMzKTtcbiAgICAgICAgczMgPSBwZWckcGFyc2V3c3AoKTtcbiAgICAgIH1cbiAgICAgIGlmIChzMiAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBzMyA9IHBlZyRwYXJzZWxpbmV0b19hcmd1bWVudF9zZXF1ZW5jZSgpO1xuICAgICAgICBpZiAoczMgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICBwZWckc2F2ZWRQb3MgPSBzMDtcbiAgICAgICAgICBzMSA9IHBlZyRjMTAoczEsIHMzKTtcbiAgICAgICAgICBzMCA9IHMxO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHMwO1xuICB9XG5cbiAgZnVuY3Rpb24gcGVnJHBhcnNlbGluZXRvX2FyZ3VtZW50X3NlcXVlbmNlKCkge1xuICAgIHZhciBzMCwgczEsIHMyLCBzMywgczQsIHM1O1xuXG4gICAgczAgPSBwZWckY3VyclBvcztcbiAgICBzMSA9IHBlZyRwYXJzZWNvb3JkaW5hdGVfcGFpcigpO1xuICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgczIgPSBbXTtcbiAgICAgIHMzID0gcGVnJGN1cnJQb3M7XG4gICAgICBzNCA9IHBlZyRwYXJzZWNvbW1hX3dzcCgpO1xuICAgICAgaWYgKHM0ID09PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHM0ID0gbnVsbDtcbiAgICAgIH1cbiAgICAgIGlmIChzNCAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBzNSA9IHBlZyRwYXJzZWNvb3JkaW5hdGVfcGFpcigpO1xuICAgICAgICBpZiAoczUgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICBzNCA9IFtzNCwgczVdO1xuICAgICAgICAgIHMzID0gczQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMztcbiAgICAgICAgICBzMyA9IHBlZyRGQUlMRUQ7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBlZyRjdXJyUG9zID0gczM7XG4gICAgICAgIHMzID0gcGVnJEZBSUxFRDtcbiAgICAgIH1cbiAgICAgIHdoaWxlIChzMyAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBzMi5wdXNoKHMzKTtcbiAgICAgICAgczMgPSBwZWckY3VyclBvcztcbiAgICAgICAgczQgPSBwZWckcGFyc2Vjb21tYV93c3AoKTtcbiAgICAgICAgaWYgKHM0ID09PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgczQgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzNCAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgIHM1ID0gcGVnJHBhcnNlY29vcmRpbmF0ZV9wYWlyKCk7XG4gICAgICAgICAgaWYgKHM1ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICBzNCA9IFtzNCwgczVdO1xuICAgICAgICAgICAgczMgPSBzNDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMztcbiAgICAgICAgICAgIHMzID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMztcbiAgICAgICAgICBzMyA9IHBlZyRGQUlMRUQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChzMiAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBwZWckc2F2ZWRQb3MgPSBzMDtcbiAgICAgICAgczEgPSBwZWckYzEoczEsIHMyKTtcbiAgICAgICAgczAgPSBzMTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICB9XG5cbiAgICByZXR1cm4gczA7XG4gIH1cblxuICBmdW5jdGlvbiBwZWckcGFyc2Vob3Jpem9udGFsX2xpbmV0bygpIHtcbiAgICB2YXIgczAsIHMxLCBzMiwgczM7XG5cbiAgICBzMCA9IHBlZyRjdXJyUG9zO1xuICAgIGlmIChwZWckYzExLnRlc3QoaW5wdXQuY2hhckF0KHBlZyRjdXJyUG9zKSkpIHtcbiAgICAgIHMxID0gaW5wdXQuY2hhckF0KHBlZyRjdXJyUG9zKTtcbiAgICAgIHBlZyRjdXJyUG9zKys7XG4gICAgfSBlbHNlIHtcbiAgICAgIHMxID0gcGVnJEZBSUxFRDtcbiAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGMxMik7IH1cbiAgICB9XG4gICAgaWYgKHMxICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICBzMiA9IFtdO1xuICAgICAgczMgPSBwZWckcGFyc2V3c3AoKTtcbiAgICAgIHdoaWxlIChzMyAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBzMi5wdXNoKHMzKTtcbiAgICAgICAgczMgPSBwZWckcGFyc2V3c3AoKTtcbiAgICAgIH1cbiAgICAgIGlmIChzMiAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBzMyA9IHBlZyRwYXJzZWNvb3JkaW5hdGVfc2VxdWVuY2UoKTtcbiAgICAgICAgaWYgKHMzICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgcGVnJHNhdmVkUG9zID0gczA7XG4gICAgICAgICAgczEgPSBwZWckYzEzKHMxLCBzMyk7XG4gICAgICAgICAgczAgPSBzMTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgIH1cblxuICAgIHJldHVybiBzMDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHBlZyRwYXJzZWNvb3JkaW5hdGVfc2VxdWVuY2UoKSB7XG4gICAgdmFyIHMwLCBzMSwgczIsIHMzLCBzNCwgczU7XG5cbiAgICBzMCA9IHBlZyRjdXJyUG9zO1xuICAgIHMxID0gcGVnJHBhcnNlbnVtYmVyKCk7XG4gICAgaWYgKHMxICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICBzMiA9IFtdO1xuICAgICAgczMgPSBwZWckY3VyclBvcztcbiAgICAgIHM0ID0gcGVnJHBhcnNlY29tbWFfd3NwKCk7XG4gICAgICBpZiAoczQgPT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgczQgPSBudWxsO1xuICAgICAgfVxuICAgICAgaWYgKHM0ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHM1ID0gcGVnJHBhcnNlbnVtYmVyKCk7XG4gICAgICAgIGlmIChzNSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgIHM0ID0gW3M0LCBzNV07XG4gICAgICAgICAgczMgPSBzNDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwZWckY3VyclBvcyA9IHMzO1xuICAgICAgICAgIHMzID0gcGVnJEZBSUxFRDtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGVnJGN1cnJQb3MgPSBzMztcbiAgICAgICAgczMgPSBwZWckRkFJTEVEO1xuICAgICAgfVxuICAgICAgd2hpbGUgKHMzICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHMyLnB1c2goczMpO1xuICAgICAgICBzMyA9IHBlZyRjdXJyUG9zO1xuICAgICAgICBzNCA9IHBlZyRwYXJzZWNvbW1hX3dzcCgpO1xuICAgICAgICBpZiAoczQgPT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICBzNCA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHM0ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgczUgPSBwZWckcGFyc2VudW1iZXIoKTtcbiAgICAgICAgICBpZiAoczUgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgIHM0ID0gW3M0LCBzNV07XG4gICAgICAgICAgICBzMyA9IHM0O1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwZWckY3VyclBvcyA9IHMzO1xuICAgICAgICAgICAgczMgPSBwZWckRkFJTEVEO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwZWckY3VyclBvcyA9IHMzO1xuICAgICAgICAgIHMzID0gcGVnJEZBSUxFRDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHMyICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHBlZyRzYXZlZFBvcyA9IHMwO1xuICAgICAgICBzMSA9IHBlZyRjMShzMSwgczIpO1xuICAgICAgICBzMCA9IHMxO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgIH1cblxuICAgIHJldHVybiBzMDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHBlZyRwYXJzZXZlcnRpY2FsX2xpbmV0bygpIHtcbiAgICB2YXIgczAsIHMxLCBzMiwgczM7XG5cbiAgICBzMCA9IHBlZyRjdXJyUG9zO1xuICAgIGlmIChwZWckYzE0LnRlc3QoaW5wdXQuY2hhckF0KHBlZyRjdXJyUG9zKSkpIHtcbiAgICAgIHMxID0gaW5wdXQuY2hhckF0KHBlZyRjdXJyUG9zKTtcbiAgICAgIHBlZyRjdXJyUG9zKys7XG4gICAgfSBlbHNlIHtcbiAgICAgIHMxID0gcGVnJEZBSUxFRDtcbiAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGMxNSk7IH1cbiAgICB9XG4gICAgaWYgKHMxICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICBzMiA9IFtdO1xuICAgICAgczMgPSBwZWckcGFyc2V3c3AoKTtcbiAgICAgIHdoaWxlIChzMyAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBzMi5wdXNoKHMzKTtcbiAgICAgICAgczMgPSBwZWckcGFyc2V3c3AoKTtcbiAgICAgIH1cbiAgICAgIGlmIChzMiAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBzMyA9IHBlZyRwYXJzZWNvb3JkaW5hdGVfc2VxdWVuY2UoKTtcbiAgICAgICAgaWYgKHMzICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgcGVnJHNhdmVkUG9zID0gczA7XG4gICAgICAgICAgczEgPSBwZWckYzE2KHMxLCBzMyk7XG4gICAgICAgICAgczAgPSBzMTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgIH1cblxuICAgIHJldHVybiBzMDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHBlZyRwYXJzZWN1cnZldG8oKSB7XG4gICAgdmFyIHMwLCBzMSwgczIsIHMzO1xuXG4gICAgczAgPSBwZWckY3VyclBvcztcbiAgICBpZiAocGVnJGMxNy50ZXN0KGlucHV0LmNoYXJBdChwZWckY3VyclBvcykpKSB7XG4gICAgICBzMSA9IGlucHV0LmNoYXJBdChwZWckY3VyclBvcyk7XG4gICAgICBwZWckY3VyclBvcysrO1xuICAgIH0gZWxzZSB7XG4gICAgICBzMSA9IHBlZyRGQUlMRUQ7XG4gICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjMTgpOyB9XG4gICAgfVxuICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgczIgPSBbXTtcbiAgICAgIHMzID0gcGVnJHBhcnNld3NwKCk7XG4gICAgICB3aGlsZSAoczMgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgczIucHVzaChzMyk7XG4gICAgICAgIHMzID0gcGVnJHBhcnNld3NwKCk7XG4gICAgICB9XG4gICAgICBpZiAoczIgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgczMgPSBwZWckcGFyc2VjdXJ2ZXRvX2FyZ3VtZW50X3NlcXVlbmNlKCk7XG4gICAgICAgIGlmIChzMyAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgIHBlZyRzYXZlZFBvcyA9IHMwO1xuICAgICAgICAgIHMxID0gcGVnJGMxMChzMSwgczMpO1xuICAgICAgICAgIHMwID0gczE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICB9XG5cbiAgICByZXR1cm4gczA7XG4gIH1cblxuICBmdW5jdGlvbiBwZWckcGFyc2VjdXJ2ZXRvX2FyZ3VtZW50X3NlcXVlbmNlKCkge1xuICAgIHZhciBzMCwgczEsIHMyLCBzMywgczQsIHM1O1xuXG4gICAgczAgPSBwZWckY3VyclBvcztcbiAgICBzMSA9IHBlZyRwYXJzZWN1cnZldG9fYXJndW1lbnQoKTtcbiAgICBpZiAoczEgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgIHMyID0gW107XG4gICAgICBzMyA9IHBlZyRjdXJyUG9zO1xuICAgICAgczQgPSBwZWckcGFyc2Vjb21tYV93c3AoKTtcbiAgICAgIGlmIChzNCA9PT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBzNCA9IG51bGw7XG4gICAgICB9XG4gICAgICBpZiAoczQgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgczUgPSBwZWckcGFyc2VjdXJ2ZXRvX2FyZ3VtZW50KCk7XG4gICAgICAgIGlmIChzNSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgIHM0ID0gW3M0LCBzNV07XG4gICAgICAgICAgczMgPSBzNDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwZWckY3VyclBvcyA9IHMzO1xuICAgICAgICAgIHMzID0gcGVnJEZBSUxFRDtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGVnJGN1cnJQb3MgPSBzMztcbiAgICAgICAgczMgPSBwZWckRkFJTEVEO1xuICAgICAgfVxuICAgICAgd2hpbGUgKHMzICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHMyLnB1c2goczMpO1xuICAgICAgICBzMyA9IHBlZyRjdXJyUG9zO1xuICAgICAgICBzNCA9IHBlZyRwYXJzZWNvbW1hX3dzcCgpO1xuICAgICAgICBpZiAoczQgPT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICBzNCA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHM0ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgczUgPSBwZWckcGFyc2VjdXJ2ZXRvX2FyZ3VtZW50KCk7XG4gICAgICAgICAgaWYgKHM1ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICBzNCA9IFtzNCwgczVdO1xuICAgICAgICAgICAgczMgPSBzNDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMztcbiAgICAgICAgICAgIHMzID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMztcbiAgICAgICAgICBzMyA9IHBlZyRGQUlMRUQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChzMiAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBwZWckc2F2ZWRQb3MgPSBzMDtcbiAgICAgICAgczEgPSBwZWckYzEoczEsIHMyKTtcbiAgICAgICAgczAgPSBzMTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICB9XG5cbiAgICByZXR1cm4gczA7XG4gIH1cblxuICBmdW5jdGlvbiBwZWckcGFyc2VjdXJ2ZXRvX2FyZ3VtZW50KCkge1xuICAgIHZhciBzMCwgczEsIHMyLCBzMywgczQsIHM1O1xuXG4gICAgczAgPSBwZWckY3VyclBvcztcbiAgICBzMSA9IHBlZyRwYXJzZWNvb3JkaW5hdGVfcGFpcigpO1xuICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgczIgPSBwZWckcGFyc2Vjb21tYV93c3AoKTtcbiAgICAgIGlmIChzMiA9PT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBzMiA9IG51bGw7XG4gICAgICB9XG4gICAgICBpZiAoczIgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgczMgPSBwZWckcGFyc2Vjb29yZGluYXRlX3BhaXIoKTtcbiAgICAgICAgaWYgKHMzICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgczQgPSBwZWckcGFyc2Vjb21tYV93c3AoKTtcbiAgICAgICAgICBpZiAoczQgPT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgIHM0ID0gbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHM0ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICBzNSA9IHBlZyRwYXJzZWNvb3JkaW5hdGVfcGFpcigpO1xuICAgICAgICAgICAgaWYgKHM1ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICAgIHBlZyRzYXZlZFBvcyA9IHMwO1xuICAgICAgICAgICAgICBzMSA9IHBlZyRjMTkoczEsIHMzLCBzNSk7XG4gICAgICAgICAgICAgIHMwID0gczE7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICAgICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHMwO1xuICB9XG5cbiAgZnVuY3Rpb24gcGVnJHBhcnNlc21vb3RoX2N1cnZldG8oKSB7XG4gICAgdmFyIHMwLCBzMSwgczIsIHMzO1xuXG4gICAgczAgPSBwZWckY3VyclBvcztcbiAgICBpZiAocGVnJGMyMC50ZXN0KGlucHV0LmNoYXJBdChwZWckY3VyclBvcykpKSB7XG4gICAgICBzMSA9IGlucHV0LmNoYXJBdChwZWckY3VyclBvcyk7XG4gICAgICBwZWckY3VyclBvcysrO1xuICAgIH0gZWxzZSB7XG4gICAgICBzMSA9IHBlZyRGQUlMRUQ7XG4gICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjMjEpOyB9XG4gICAgfVxuICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgczIgPSBbXTtcbiAgICAgIHMzID0gcGVnJHBhcnNld3NwKCk7XG4gICAgICB3aGlsZSAoczMgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgczIucHVzaChzMyk7XG4gICAgICAgIHMzID0gcGVnJHBhcnNld3NwKCk7XG4gICAgICB9XG4gICAgICBpZiAoczIgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgczMgPSBwZWckcGFyc2VzbW9vdGhfY3VydmV0b19hcmd1bWVudF9zZXF1ZW5jZSgpO1xuICAgICAgICBpZiAoczMgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICBwZWckc2F2ZWRQb3MgPSBzMDtcbiAgICAgICAgICBzMSA9IHBlZyRjMTAoczEsIHMzKTtcbiAgICAgICAgICBzMCA9IHMxO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHMwO1xuICB9XG5cbiAgZnVuY3Rpb24gcGVnJHBhcnNlc21vb3RoX2N1cnZldG9fYXJndW1lbnRfc2VxdWVuY2UoKSB7XG4gICAgdmFyIHMwLCBzMSwgczIsIHMzLCBzNCwgczU7XG5cbiAgICBzMCA9IHBlZyRjdXJyUG9zO1xuICAgIHMxID0gcGVnJHBhcnNlc21vb3RoX2N1cnZldG9fYXJndW1lbnQoKTtcbiAgICBpZiAoczEgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgIHMyID0gW107XG4gICAgICBzMyA9IHBlZyRjdXJyUG9zO1xuICAgICAgczQgPSBwZWckcGFyc2Vjb21tYV93c3AoKTtcbiAgICAgIGlmIChzNCA9PT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBzNCA9IG51bGw7XG4gICAgICB9XG4gICAgICBpZiAoczQgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgczUgPSBwZWckcGFyc2VzbW9vdGhfY3VydmV0b19hcmd1bWVudCgpO1xuICAgICAgICBpZiAoczUgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICBzNCA9IFtzNCwgczVdO1xuICAgICAgICAgIHMzID0gczQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMztcbiAgICAgICAgICBzMyA9IHBlZyRGQUlMRUQ7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBlZyRjdXJyUG9zID0gczM7XG4gICAgICAgIHMzID0gcGVnJEZBSUxFRDtcbiAgICAgIH1cbiAgICAgIHdoaWxlIChzMyAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBzMi5wdXNoKHMzKTtcbiAgICAgICAgczMgPSBwZWckY3VyclBvcztcbiAgICAgICAgczQgPSBwZWckcGFyc2Vjb21tYV93c3AoKTtcbiAgICAgICAgaWYgKHM0ID09PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgczQgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzNCAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgIHM1ID0gcGVnJHBhcnNlc21vb3RoX2N1cnZldG9fYXJndW1lbnQoKTtcbiAgICAgICAgICBpZiAoczUgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgIHM0ID0gW3M0LCBzNV07XG4gICAgICAgICAgICBzMyA9IHM0O1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwZWckY3VyclBvcyA9IHMzO1xuICAgICAgICAgICAgczMgPSBwZWckRkFJTEVEO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwZWckY3VyclBvcyA9IHMzO1xuICAgICAgICAgIHMzID0gcGVnJEZBSUxFRDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHMyICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHBlZyRzYXZlZFBvcyA9IHMwO1xuICAgICAgICBzMSA9IHBlZyRjMShzMSwgczIpO1xuICAgICAgICBzMCA9IHMxO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgIH1cblxuICAgIHJldHVybiBzMDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHBlZyRwYXJzZXNtb290aF9jdXJ2ZXRvX2FyZ3VtZW50KCkge1xuICAgIHZhciBzMCwgczEsIHMyLCBzMztcblxuICAgIHMwID0gcGVnJGN1cnJQb3M7XG4gICAgczEgPSBwZWckcGFyc2Vjb29yZGluYXRlX3BhaXIoKTtcbiAgICBpZiAoczEgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgIHMyID0gcGVnJHBhcnNlY29tbWFfd3NwKCk7XG4gICAgICBpZiAoczIgPT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgczIgPSBudWxsO1xuICAgICAgfVxuICAgICAgaWYgKHMyICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHMzID0gcGVnJHBhcnNlY29vcmRpbmF0ZV9wYWlyKCk7XG4gICAgICAgIGlmIChzMyAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgIHBlZyRzYXZlZFBvcyA9IHMwO1xuICAgICAgICAgIHMxID0gcGVnJGMyMihzMSwgczMpO1xuICAgICAgICAgIHMwID0gczE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICB9XG5cbiAgICByZXR1cm4gczA7XG4gIH1cblxuICBmdW5jdGlvbiBwZWckcGFyc2VxdWFkcmF0aWNfYmV6aWVyX2N1cnZldG8oKSB7XG4gICAgdmFyIHMwLCBzMSwgczIsIHMzO1xuXG4gICAgczAgPSBwZWckY3VyclBvcztcbiAgICBpZiAocGVnJGMyMy50ZXN0KGlucHV0LmNoYXJBdChwZWckY3VyclBvcykpKSB7XG4gICAgICBzMSA9IGlucHV0LmNoYXJBdChwZWckY3VyclBvcyk7XG4gICAgICBwZWckY3VyclBvcysrO1xuICAgIH0gZWxzZSB7XG4gICAgICBzMSA9IHBlZyRGQUlMRUQ7XG4gICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjMjQpOyB9XG4gICAgfVxuICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgczIgPSBbXTtcbiAgICAgIHMzID0gcGVnJHBhcnNld3NwKCk7XG4gICAgICB3aGlsZSAoczMgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgczIucHVzaChzMyk7XG4gICAgICAgIHMzID0gcGVnJHBhcnNld3NwKCk7XG4gICAgICB9XG4gICAgICBpZiAoczIgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgczMgPSBwZWckcGFyc2VxdWFkcmF0aWNfYmV6aWVyX2N1cnZldG9fYXJndW1lbnRfc2VxdWVuY2UoKTtcbiAgICAgICAgaWYgKHMzICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgcGVnJHNhdmVkUG9zID0gczA7XG4gICAgICAgICAgczEgPSBwZWckYzEwKHMxLCBzMyk7XG4gICAgICAgICAgczAgPSBzMTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgIH1cblxuICAgIHJldHVybiBzMDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHBlZyRwYXJzZXF1YWRyYXRpY19iZXppZXJfY3VydmV0b19hcmd1bWVudF9zZXF1ZW5jZSgpIHtcbiAgICB2YXIgczAsIHMxLCBzMiwgczMsIHM0LCBzNTtcblxuICAgIHMwID0gcGVnJGN1cnJQb3M7XG4gICAgczEgPSBwZWckcGFyc2VxdWFkcmF0aWNfYmV6aWVyX2N1cnZldG9fYXJndW1lbnQoKTtcbiAgICBpZiAoczEgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgIHMyID0gW107XG4gICAgICBzMyA9IHBlZyRjdXJyUG9zO1xuICAgICAgczQgPSBwZWckcGFyc2Vjb21tYV93c3AoKTtcbiAgICAgIGlmIChzNCA9PT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBzNCA9IG51bGw7XG4gICAgICB9XG4gICAgICBpZiAoczQgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgczUgPSBwZWckcGFyc2VxdWFkcmF0aWNfYmV6aWVyX2N1cnZldG9fYXJndW1lbnQoKTtcbiAgICAgICAgaWYgKHM1ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgczQgPSBbczQsIHM1XTtcbiAgICAgICAgICBzMyA9IHM0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBlZyRjdXJyUG9zID0gczM7XG4gICAgICAgICAgczMgPSBwZWckRkFJTEVEO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwZWckY3VyclBvcyA9IHMzO1xuICAgICAgICBzMyA9IHBlZyRGQUlMRUQ7XG4gICAgICB9XG4gICAgICB3aGlsZSAoczMgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgczIucHVzaChzMyk7XG4gICAgICAgIHMzID0gcGVnJGN1cnJQb3M7XG4gICAgICAgIHM0ID0gcGVnJHBhcnNlY29tbWFfd3NwKCk7XG4gICAgICAgIGlmIChzNCA9PT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgIHM0ID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoczQgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICBzNSA9IHBlZyRwYXJzZXF1YWRyYXRpY19iZXppZXJfY3VydmV0b19hcmd1bWVudCgpO1xuICAgICAgICAgIGlmIChzNSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgczQgPSBbczQsIHM1XTtcbiAgICAgICAgICAgIHMzID0gczQ7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczM7XG4gICAgICAgICAgICBzMyA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBlZyRjdXJyUG9zID0gczM7XG4gICAgICAgICAgczMgPSBwZWckRkFJTEVEO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoczIgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgcGVnJHNhdmVkUG9zID0gczA7XG4gICAgICAgIHMxID0gcGVnJGMxKHMxLCBzMik7XG4gICAgICAgIHMwID0gczE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHMwO1xuICB9XG5cbiAgZnVuY3Rpb24gcGVnJHBhcnNlcXVhZHJhdGljX2Jlemllcl9jdXJ2ZXRvX2FyZ3VtZW50KCkge1xuICAgIHZhciBzMCwgczEsIHMyLCBzMztcblxuICAgIHMwID0gcGVnJGN1cnJQb3M7XG4gICAgczEgPSBwZWckcGFyc2Vjb29yZGluYXRlX3BhaXIoKTtcbiAgICBpZiAoczEgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgIHMyID0gcGVnJHBhcnNlY29tbWFfd3NwKCk7XG4gICAgICBpZiAoczIgPT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgczIgPSBudWxsO1xuICAgICAgfVxuICAgICAgaWYgKHMyICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHMzID0gcGVnJHBhcnNlY29vcmRpbmF0ZV9wYWlyKCk7XG4gICAgICAgIGlmIChzMyAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgIHBlZyRzYXZlZFBvcyA9IHMwO1xuICAgICAgICAgIHMxID0gcGVnJGMyNShzMSwgczMpO1xuICAgICAgICAgIHMwID0gczE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICB9XG5cbiAgICByZXR1cm4gczA7XG4gIH1cblxuICBmdW5jdGlvbiBwZWckcGFyc2VzbW9vdGhfcXVhZHJhdGljX2Jlemllcl9jdXJ2ZXRvKCkge1xuICAgIHZhciBzMCwgczEsIHMyLCBzMztcblxuICAgIHMwID0gcGVnJGN1cnJQb3M7XG4gICAgaWYgKHBlZyRjMjYudGVzdChpbnB1dC5jaGFyQXQocGVnJGN1cnJQb3MpKSkge1xuICAgICAgczEgPSBpbnB1dC5jaGFyQXQocGVnJGN1cnJQb3MpO1xuICAgICAgcGVnJGN1cnJQb3MrKztcbiAgICB9IGVsc2Uge1xuICAgICAgczEgPSBwZWckRkFJTEVEO1xuICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzI3KTsgfVxuICAgIH1cbiAgICBpZiAoczEgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgIHMyID0gW107XG4gICAgICBzMyA9IHBlZyRwYXJzZXdzcCgpO1xuICAgICAgd2hpbGUgKHMzICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHMyLnB1c2goczMpO1xuICAgICAgICBzMyA9IHBlZyRwYXJzZXdzcCgpO1xuICAgICAgfVxuICAgICAgaWYgKHMyICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHMzID0gcGVnJHBhcnNlc21vb3RoX3F1YWRyYXRpY19iZXppZXJfY3VydmV0b19hcmd1bWVudF9zZXF1ZW5jZSgpO1xuICAgICAgICBpZiAoczMgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICBwZWckc2F2ZWRQb3MgPSBzMDtcbiAgICAgICAgICBzMSA9IHBlZyRjMTAoczEsIHMzKTtcbiAgICAgICAgICBzMCA9IHMxO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHMwO1xuICB9XG5cbiAgZnVuY3Rpb24gcGVnJHBhcnNlc21vb3RoX3F1YWRyYXRpY19iZXppZXJfY3VydmV0b19hcmd1bWVudF9zZXF1ZW5jZSgpIHtcbiAgICB2YXIgczAsIHMxLCBzMiwgczMsIHM0LCBzNTtcblxuICAgIHMwID0gcGVnJGN1cnJQb3M7XG4gICAgczEgPSBwZWckcGFyc2Vjb29yZGluYXRlX3BhaXIoKTtcbiAgICBpZiAoczEgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgIHMyID0gW107XG4gICAgICBzMyA9IHBlZyRjdXJyUG9zO1xuICAgICAgczQgPSBwZWckcGFyc2Vjb21tYV93c3AoKTtcbiAgICAgIGlmIChzNCA9PT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBzNCA9IG51bGw7XG4gICAgICB9XG4gICAgICBpZiAoczQgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgczUgPSBwZWckcGFyc2Vjb29yZGluYXRlX3BhaXIoKTtcbiAgICAgICAgaWYgKHM1ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgczQgPSBbczQsIHM1XTtcbiAgICAgICAgICBzMyA9IHM0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBlZyRjdXJyUG9zID0gczM7XG4gICAgICAgICAgczMgPSBwZWckRkFJTEVEO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwZWckY3VyclBvcyA9IHMzO1xuICAgICAgICBzMyA9IHBlZyRGQUlMRUQ7XG4gICAgICB9XG4gICAgICB3aGlsZSAoczMgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgczIucHVzaChzMyk7XG4gICAgICAgIHMzID0gcGVnJGN1cnJQb3M7XG4gICAgICAgIHM0ID0gcGVnJHBhcnNlY29tbWFfd3NwKCk7XG4gICAgICAgIGlmIChzNCA9PT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgIHM0ID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoczQgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICBzNSA9IHBlZyRwYXJzZWNvb3JkaW5hdGVfcGFpcigpO1xuICAgICAgICAgIGlmIChzNSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgczQgPSBbczQsIHM1XTtcbiAgICAgICAgICAgIHMzID0gczQ7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczM7XG4gICAgICAgICAgICBzMyA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBlZyRjdXJyUG9zID0gczM7XG4gICAgICAgICAgczMgPSBwZWckRkFJTEVEO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoczIgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgcGVnJHNhdmVkUG9zID0gczA7XG4gICAgICAgIHMxID0gcGVnJGMxKHMxLCBzMik7XG4gICAgICAgIHMwID0gczE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHMwO1xuICB9XG5cbiAgZnVuY3Rpb24gcGVnJHBhcnNlZWxsaXB0aWNhbF9hcmMoKSB7XG4gICAgdmFyIHMwLCBzMSwgczIsIHMzO1xuXG4gICAgczAgPSBwZWckY3VyclBvcztcbiAgICBpZiAocGVnJGMyOC50ZXN0KGlucHV0LmNoYXJBdChwZWckY3VyclBvcykpKSB7XG4gICAgICBzMSA9IGlucHV0LmNoYXJBdChwZWckY3VyclBvcyk7XG4gICAgICBwZWckY3VyclBvcysrO1xuICAgIH0gZWxzZSB7XG4gICAgICBzMSA9IHBlZyRGQUlMRUQ7XG4gICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjMjkpOyB9XG4gICAgfVxuICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgczIgPSBbXTtcbiAgICAgIHMzID0gcGVnJHBhcnNld3NwKCk7XG4gICAgICB3aGlsZSAoczMgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgczIucHVzaChzMyk7XG4gICAgICAgIHMzID0gcGVnJHBhcnNld3NwKCk7XG4gICAgICB9XG4gICAgICBpZiAoczIgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgczMgPSBwZWckcGFyc2VlbGxpcHRpY2FsX2FyY19hcmd1bWVudF9zZXF1ZW5jZSgpO1xuICAgICAgICBpZiAoczMgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICBwZWckc2F2ZWRQb3MgPSBzMDtcbiAgICAgICAgICBzMSA9IHBlZyRjMTAoczEsIHMzKTtcbiAgICAgICAgICBzMCA9IHMxO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHMwO1xuICB9XG5cbiAgZnVuY3Rpb24gcGVnJHBhcnNlZWxsaXB0aWNhbF9hcmNfYXJndW1lbnRfc2VxdWVuY2UoKSB7XG4gICAgdmFyIHMwLCBzMSwgczIsIHMzLCBzNCwgczU7XG5cbiAgICBzMCA9IHBlZyRjdXJyUG9zO1xuICAgIHMxID0gcGVnJHBhcnNlZWxsaXB0aWNhbF9hcmNfYXJndW1lbnQoKTtcbiAgICBpZiAoczEgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgIHMyID0gW107XG4gICAgICBzMyA9IHBlZyRjdXJyUG9zO1xuICAgICAgczQgPSBwZWckcGFyc2Vjb21tYV93c3AoKTtcbiAgICAgIGlmIChzNCA9PT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBzNCA9IG51bGw7XG4gICAgICB9XG4gICAgICBpZiAoczQgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgczUgPSBwZWckcGFyc2VlbGxpcHRpY2FsX2FyY19hcmd1bWVudCgpO1xuICAgICAgICBpZiAoczUgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICBzNCA9IFtzNCwgczVdO1xuICAgICAgICAgIHMzID0gczQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMztcbiAgICAgICAgICBzMyA9IHBlZyRGQUlMRUQ7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBlZyRjdXJyUG9zID0gczM7XG4gICAgICAgIHMzID0gcGVnJEZBSUxFRDtcbiAgICAgIH1cbiAgICAgIHdoaWxlIChzMyAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBzMi5wdXNoKHMzKTtcbiAgICAgICAgczMgPSBwZWckY3VyclBvcztcbiAgICAgICAgczQgPSBwZWckcGFyc2Vjb21tYV93c3AoKTtcbiAgICAgICAgaWYgKHM0ID09PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgczQgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzNCAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgIHM1ID0gcGVnJHBhcnNlZWxsaXB0aWNhbF9hcmNfYXJndW1lbnQoKTtcbiAgICAgICAgICBpZiAoczUgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgIHM0ID0gW3M0LCBzNV07XG4gICAgICAgICAgICBzMyA9IHM0O1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwZWckY3VyclBvcyA9IHMzO1xuICAgICAgICAgICAgczMgPSBwZWckRkFJTEVEO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwZWckY3VyclBvcyA9IHMzO1xuICAgICAgICAgIHMzID0gcGVnJEZBSUxFRDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHMyICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHBlZyRzYXZlZFBvcyA9IHMwO1xuICAgICAgICBzMSA9IHBlZyRjMShzMSwgczIpO1xuICAgICAgICBzMCA9IHMxO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgIH1cblxuICAgIHJldHVybiBzMDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHBlZyRwYXJzZWVsbGlwdGljYWxfYXJjX2FyZ3VtZW50KCkge1xuICAgIHZhciBzMCwgczEsIHMyLCBzMywgczQsIHM1LCBzNiwgczcsIHM4LCBzOSwgczEwLCBzMTE7XG5cbiAgICBzMCA9IHBlZyRjdXJyUG9zO1xuICAgIHMxID0gcGVnJHBhcnNlbm9ubmVnYXRpdmVfbnVtYmVyKCk7XG4gICAgaWYgKHMxICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICBzMiA9IHBlZyRwYXJzZWNvbW1hX3dzcCgpO1xuICAgICAgaWYgKHMyID09PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHMyID0gbnVsbDtcbiAgICAgIH1cbiAgICAgIGlmIChzMiAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBzMyA9IHBlZyRwYXJzZW5vbm5lZ2F0aXZlX251bWJlcigpO1xuICAgICAgICBpZiAoczMgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICBzNCA9IHBlZyRwYXJzZWNvbW1hX3dzcCgpO1xuICAgICAgICAgIGlmIChzNCA9PT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgczQgPSBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoczQgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgIHM1ID0gcGVnJHBhcnNlbnVtYmVyKCk7XG4gICAgICAgICAgICBpZiAoczUgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgICAgczYgPSBwZWckcGFyc2Vjb21tYV93c3AoKTtcbiAgICAgICAgICAgICAgaWYgKHM2ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICAgICAgczcgPSBwZWckcGFyc2VmbGFnKCk7XG4gICAgICAgICAgICAgICAgaWYgKHM3ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICAgICAgICBzOCA9IHBlZyRwYXJzZWNvbW1hX3dzcCgpO1xuICAgICAgICAgICAgICAgICAgaWYgKHM4ID09PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICAgICAgICAgIHM4ID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGlmIChzOCAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgICAgICAgICBzOSA9IHBlZyRwYXJzZWZsYWcoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHM5ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICAgICAgICAgICAgczEwID0gcGVnJHBhcnNlY29tbWFfd3NwKCk7XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKHMxMCA9PT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgczEwID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKHMxMCAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgczExID0gcGVnJHBhcnNlY29vcmRpbmF0ZV9wYWlyKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoczExICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHBlZyRzYXZlZFBvcyA9IHMwO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBzMSA9IHBlZyRjMzAoczEsIHMzLCBzNSwgczcsIHM5LCBzMTEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBzMCA9IHMxO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICAgICAgICAgICAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICAgICAgICAgICAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgICAgICAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICAgICAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICAgICAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgIH1cblxuICAgIHJldHVybiBzMDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHBlZyRwYXJzZWNvb3JkaW5hdGVfcGFpcigpIHtcbiAgICB2YXIgczAsIHMxLCBzMiwgczM7XG5cbiAgICBzMCA9IHBlZyRjdXJyUG9zO1xuICAgIHMxID0gcGVnJHBhcnNlbnVtYmVyKCk7XG4gICAgaWYgKHMxICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICBzMiA9IHBlZyRwYXJzZWNvbW1hX3dzcCgpO1xuICAgICAgaWYgKHMyID09PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHMyID0gbnVsbDtcbiAgICAgIH1cbiAgICAgIGlmIChzMiAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBzMyA9IHBlZyRwYXJzZW51bWJlcigpO1xuICAgICAgICBpZiAoczMgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICBwZWckc2F2ZWRQb3MgPSBzMDtcbiAgICAgICAgICBzMSA9IHBlZyRjMzEoczEsIHMzKTtcbiAgICAgICAgICBzMCA9IHMxO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHMwO1xuICB9XG5cbiAgZnVuY3Rpb24gcGVnJHBhcnNlbm9ubmVnYXRpdmVfbnVtYmVyKCkge1xuICAgIHZhciBzMCwgczE7XG5cbiAgICBzMCA9IHBlZyRjdXJyUG9zO1xuICAgIHMxID0gcGVnJHBhcnNlZmxvYXRpbmdfcG9pbnRfY29uc3RhbnQoKTtcbiAgICBpZiAoczEgPT09IHBlZyRGQUlMRUQpIHtcbiAgICAgIHMxID0gcGVnJHBhcnNlZGlnaXRfc2VxdWVuY2UoKTtcbiAgICB9XG4gICAgaWYgKHMxICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICBwZWckc2F2ZWRQb3MgPSBzMDtcbiAgICAgIHMxID0gcGVnJGMzMihzMSk7XG4gICAgfVxuICAgIHMwID0gczE7XG5cbiAgICByZXR1cm4gczA7XG4gIH1cblxuICBmdW5jdGlvbiBwZWckcGFyc2VudW1iZXIoKSB7XG4gICAgdmFyIHMwLCBzMSwgczIsIHMzO1xuXG4gICAgczAgPSBwZWckY3VyclBvcztcbiAgICBzMSA9IHBlZyRjdXJyUG9zO1xuICAgIHMyID0gcGVnJHBhcnNlc2lnbigpO1xuICAgIGlmIChzMiA9PT0gcGVnJEZBSUxFRCkge1xuICAgICAgczIgPSBudWxsO1xuICAgIH1cbiAgICBpZiAoczIgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgIHMzID0gcGVnJHBhcnNlZmxvYXRpbmdfcG9pbnRfY29uc3RhbnQoKTtcbiAgICAgIGlmIChzMyAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBzMiA9IFtzMiwgczNdO1xuICAgICAgICBzMSA9IHMyO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGVnJGN1cnJQb3MgPSBzMTtcbiAgICAgICAgczEgPSBwZWckRkFJTEVEO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBwZWckY3VyclBvcyA9IHMxO1xuICAgICAgczEgPSBwZWckRkFJTEVEO1xuICAgIH1cbiAgICBpZiAoczEgPT09IHBlZyRGQUlMRUQpIHtcbiAgICAgIHMxID0gcGVnJGN1cnJQb3M7XG4gICAgICBzMiA9IHBlZyRwYXJzZXNpZ24oKTtcbiAgICAgIGlmIChzMiA9PT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBzMiA9IG51bGw7XG4gICAgICB9XG4gICAgICBpZiAoczIgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgczMgPSBwZWckcGFyc2VkaWdpdF9zZXF1ZW5jZSgpO1xuICAgICAgICBpZiAoczMgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICBzMiA9IFtzMiwgczNdO1xuICAgICAgICAgIHMxID0gczI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMTtcbiAgICAgICAgICBzMSA9IHBlZyRGQUlMRUQ7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBlZyRjdXJyUG9zID0gczE7XG4gICAgICAgIHMxID0gcGVnJEZBSUxFRDtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHMxICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICBwZWckc2F2ZWRQb3MgPSBzMDtcbiAgICAgIHMxID0gcGVnJGMzMyhzMSk7XG4gICAgfVxuICAgIHMwID0gczE7XG5cbiAgICByZXR1cm4gczA7XG4gIH1cblxuICBmdW5jdGlvbiBwZWckcGFyc2VmbGFnKCkge1xuICAgIHZhciBzMCwgczE7XG5cbiAgICBzMCA9IHBlZyRjdXJyUG9zO1xuICAgIGlmIChwZWckYzM0LnRlc3QoaW5wdXQuY2hhckF0KHBlZyRjdXJyUG9zKSkpIHtcbiAgICAgIHMxID0gaW5wdXQuY2hhckF0KHBlZyRjdXJyUG9zKTtcbiAgICAgIHBlZyRjdXJyUG9zKys7XG4gICAgfSBlbHNlIHtcbiAgICAgIHMxID0gcGVnJEZBSUxFRDtcbiAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGMzNSk7IH1cbiAgICB9XG4gICAgaWYgKHMxICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICBwZWckc2F2ZWRQb3MgPSBzMDtcbiAgICAgIHMxID0gcGVnJGMzNihzMSk7XG4gICAgfVxuICAgIHMwID0gczE7XG5cbiAgICByZXR1cm4gczA7XG4gIH1cblxuICBmdW5jdGlvbiBwZWckcGFyc2Vjb21tYV93c3AoKSB7XG4gICAgdmFyIHMwLCBzMSwgczIsIHMzLCBzNDtcblxuICAgIHMwID0gcGVnJGN1cnJQb3M7XG4gICAgczEgPSBbXTtcbiAgICBzMiA9IHBlZyRwYXJzZXdzcCgpO1xuICAgIGlmIChzMiAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgd2hpbGUgKHMyICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHMxLnB1c2goczIpO1xuICAgICAgICBzMiA9IHBlZyRwYXJzZXdzcCgpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBzMSA9IHBlZyRGQUlMRUQ7XG4gICAgfVxuICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgczIgPSBwZWckcGFyc2Vjb21tYSgpO1xuICAgICAgaWYgKHMyID09PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHMyID0gbnVsbDtcbiAgICAgIH1cbiAgICAgIGlmIChzMiAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBzMyA9IFtdO1xuICAgICAgICBzNCA9IHBlZyRwYXJzZXdzcCgpO1xuICAgICAgICB3aGlsZSAoczQgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICBzMy5wdXNoKHM0KTtcbiAgICAgICAgICBzNCA9IHBlZyRwYXJzZXdzcCgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzMyAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgIHMxID0gW3MxLCBzMiwgczNdO1xuICAgICAgICAgIHMwID0gczE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICB9XG4gICAgaWYgKHMwID09PSBwZWckRkFJTEVEKSB7XG4gICAgICBzMCA9IHBlZyRjdXJyUG9zO1xuICAgICAgczEgPSBwZWckY3VyclBvcztcbiAgICAgIHMyID0gcGVnJHBhcnNlY29tbWEoKTtcbiAgICAgIGlmIChzMiAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBzMyA9IFtdO1xuICAgICAgICBzNCA9IHBlZyRwYXJzZXdzcCgpO1xuICAgICAgICB3aGlsZSAoczQgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICBzMy5wdXNoKHM0KTtcbiAgICAgICAgICBzNCA9IHBlZyRwYXJzZXdzcCgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzMyAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgIHMyID0gW3MyLCBzM107XG4gICAgICAgICAgczEgPSBzMjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwZWckY3VyclBvcyA9IHMxO1xuICAgICAgICAgIHMxID0gcGVnJEZBSUxFRDtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGVnJGN1cnJQb3MgPSBzMTtcbiAgICAgICAgczEgPSBwZWckRkFJTEVEO1xuICAgICAgfVxuICAgICAgaWYgKHMxICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHBlZyRzYXZlZFBvcyA9IHMwO1xuICAgICAgICBzMSA9IHBlZyRjMzcoKTtcbiAgICAgIH1cbiAgICAgIHMwID0gczE7XG4gICAgfVxuXG4gICAgcmV0dXJuIHMwO1xuICB9XG5cbiAgZnVuY3Rpb24gcGVnJHBhcnNlY29tbWEoKSB7XG4gICAgdmFyIHMwO1xuXG4gICAgaWYgKGlucHV0LmNoYXJDb2RlQXQocGVnJGN1cnJQb3MpID09PSA0NCkge1xuICAgICAgczAgPSBwZWckYzM4O1xuICAgICAgcGVnJGN1cnJQb3MrKztcbiAgICB9IGVsc2Uge1xuICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzM5KTsgfVxuICAgIH1cblxuICAgIHJldHVybiBzMDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHBlZyRwYXJzZWZsb2F0aW5nX3BvaW50X2NvbnN0YW50KCkge1xuICAgIHZhciBzMCwgczEsIHMyLCBzMztcblxuICAgIHMwID0gcGVnJGN1cnJQb3M7XG4gICAgczEgPSBwZWckY3VyclBvcztcbiAgICBzMiA9IHBlZyRwYXJzZWZyYWN0aW9uYWxfY29uc3RhbnQoKTtcbiAgICBpZiAoczIgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgIHMzID0gcGVnJHBhcnNlZXhwb25lbnQoKTtcbiAgICAgIGlmIChzMyA9PT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBzMyA9IG51bGw7XG4gICAgICB9XG4gICAgICBpZiAoczMgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgczIgPSBbczIsIHMzXTtcbiAgICAgICAgczEgPSBzMjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBlZyRjdXJyUG9zID0gczE7XG4gICAgICAgIHMxID0gcGVnJEZBSUxFRDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcGVnJGN1cnJQb3MgPSBzMTtcbiAgICAgIHMxID0gcGVnJEZBSUxFRDtcbiAgICB9XG4gICAgaWYgKHMxID09PSBwZWckRkFJTEVEKSB7XG4gICAgICBzMSA9IHBlZyRjdXJyUG9zO1xuICAgICAgczIgPSBwZWckcGFyc2VkaWdpdF9zZXF1ZW5jZSgpO1xuICAgICAgaWYgKHMyICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHMzID0gcGVnJHBhcnNlZXhwb25lbnQoKTtcbiAgICAgICAgaWYgKHMzICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgczIgPSBbczIsIHMzXTtcbiAgICAgICAgICBzMSA9IHMyO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBlZyRjdXJyUG9zID0gczE7XG4gICAgICAgICAgczEgPSBwZWckRkFJTEVEO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwZWckY3VyclBvcyA9IHMxO1xuICAgICAgICBzMSA9IHBlZyRGQUlMRUQ7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgcGVnJHNhdmVkUG9zID0gczA7XG4gICAgICBzMSA9IHBlZyRjNDAoczEpO1xuICAgIH1cbiAgICBzMCA9IHMxO1xuXG4gICAgcmV0dXJuIHMwO1xuICB9XG5cbiAgZnVuY3Rpb24gcGVnJHBhcnNlZnJhY3Rpb25hbF9jb25zdGFudCgpIHtcbiAgICB2YXIgczAsIHMxLCBzMiwgczMsIHM0O1xuXG4gICAgczAgPSBwZWckY3VyclBvcztcbiAgICBzMSA9IHBlZyRjdXJyUG9zO1xuICAgIHMyID0gcGVnJHBhcnNlZGlnaXRfc2VxdWVuY2UoKTtcbiAgICBpZiAoczIgPT09IHBlZyRGQUlMRUQpIHtcbiAgICAgIHMyID0gbnVsbDtcbiAgICB9XG4gICAgaWYgKHMyICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICBpZiAoaW5wdXQuY2hhckNvZGVBdChwZWckY3VyclBvcykgPT09IDQ2KSB7XG4gICAgICAgIHMzID0gcGVnJGM0MTtcbiAgICAgICAgcGVnJGN1cnJQb3MrKztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHMzID0gcGVnJEZBSUxFRDtcbiAgICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzQyKTsgfVxuICAgICAgfVxuICAgICAgaWYgKHMzICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHM0ID0gcGVnJHBhcnNlZGlnaXRfc2VxdWVuY2UoKTtcbiAgICAgICAgaWYgKHM0ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgczIgPSBbczIsIHMzLCBzNF07XG4gICAgICAgICAgczEgPSBzMjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwZWckY3VyclBvcyA9IHMxO1xuICAgICAgICAgIHMxID0gcGVnJEZBSUxFRDtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGVnJGN1cnJQb3MgPSBzMTtcbiAgICAgICAgczEgPSBwZWckRkFJTEVEO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBwZWckY3VyclBvcyA9IHMxO1xuICAgICAgczEgPSBwZWckRkFJTEVEO1xuICAgIH1cbiAgICBpZiAoczEgPT09IHBlZyRGQUlMRUQpIHtcbiAgICAgIHMxID0gcGVnJGN1cnJQb3M7XG4gICAgICBzMiA9IHBlZyRwYXJzZWRpZ2l0X3NlcXVlbmNlKCk7XG4gICAgICBpZiAoczIgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgaWYgKGlucHV0LmNoYXJDb2RlQXQocGVnJGN1cnJQb3MpID09PSA0Nikge1xuICAgICAgICAgIHMzID0gcGVnJGM0MTtcbiAgICAgICAgICBwZWckY3VyclBvcysrO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHMzID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjNDIpOyB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHMzICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgczIgPSBbczIsIHMzXTtcbiAgICAgICAgICBzMSA9IHMyO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBlZyRjdXJyUG9zID0gczE7XG4gICAgICAgICAgczEgPSBwZWckRkFJTEVEO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwZWckY3VyclBvcyA9IHMxO1xuICAgICAgICBzMSA9IHBlZyRGQUlMRUQ7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgcGVnJHNhdmVkUG9zID0gczA7XG4gICAgICBzMSA9IHBlZyRjNDAoczEpO1xuICAgIH1cbiAgICBzMCA9IHMxO1xuXG4gICAgcmV0dXJuIHMwO1xuICB9XG5cbiAgZnVuY3Rpb24gcGVnJHBhcnNlZXhwb25lbnQoKSB7XG4gICAgdmFyIHMwLCBzMSwgczIsIHMzLCBzNDtcblxuICAgIHMwID0gcGVnJGN1cnJQb3M7XG4gICAgczEgPSBwZWckY3VyclBvcztcbiAgICBpZiAocGVnJGM0My50ZXN0KGlucHV0LmNoYXJBdChwZWckY3VyclBvcykpKSB7XG4gICAgICBzMiA9IGlucHV0LmNoYXJBdChwZWckY3VyclBvcyk7XG4gICAgICBwZWckY3VyclBvcysrO1xuICAgIH0gZWxzZSB7XG4gICAgICBzMiA9IHBlZyRGQUlMRUQ7XG4gICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjNDQpOyB9XG4gICAgfVxuICAgIGlmIChzMiAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgczMgPSBwZWckcGFyc2VzaWduKCk7XG4gICAgICBpZiAoczMgPT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgczMgPSBudWxsO1xuICAgICAgfVxuICAgICAgaWYgKHMzICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHM0ID0gcGVnJHBhcnNlZGlnaXRfc2VxdWVuY2UoKTtcbiAgICAgICAgaWYgKHM0ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgczIgPSBbczIsIHMzLCBzNF07XG4gICAgICAgICAgczEgPSBzMjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwZWckY3VyclBvcyA9IHMxO1xuICAgICAgICAgIHMxID0gcGVnJEZBSUxFRDtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGVnJGN1cnJQb3MgPSBzMTtcbiAgICAgICAgczEgPSBwZWckRkFJTEVEO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBwZWckY3VyclBvcyA9IHMxO1xuICAgICAgczEgPSBwZWckRkFJTEVEO1xuICAgIH1cbiAgICBpZiAoczEgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgIHBlZyRzYXZlZFBvcyA9IHMwO1xuICAgICAgczEgPSBwZWckYzQwKHMxKTtcbiAgICB9XG4gICAgczAgPSBzMTtcblxuICAgIHJldHVybiBzMDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHBlZyRwYXJzZXNpZ24oKSB7XG4gICAgdmFyIHMwO1xuXG4gICAgaWYgKHBlZyRjNDUudGVzdChpbnB1dC5jaGFyQXQocGVnJGN1cnJQb3MpKSkge1xuICAgICAgczAgPSBpbnB1dC5jaGFyQXQocGVnJGN1cnJQb3MpO1xuICAgICAgcGVnJGN1cnJQb3MrKztcbiAgICB9IGVsc2Uge1xuICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzQ2KTsgfVxuICAgIH1cblxuICAgIHJldHVybiBzMDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHBlZyRwYXJzZWRpZ2l0X3NlcXVlbmNlKCkge1xuICAgIHZhciBzMCwgczEsIHMyO1xuXG4gICAgczAgPSBwZWckY3VyclBvcztcbiAgICBzMSA9IFtdO1xuICAgIGlmIChwZWckYzQ3LnRlc3QoaW5wdXQuY2hhckF0KHBlZyRjdXJyUG9zKSkpIHtcbiAgICAgIHMyID0gaW5wdXQuY2hhckF0KHBlZyRjdXJyUG9zKTtcbiAgICAgIHBlZyRjdXJyUG9zKys7XG4gICAgfSBlbHNlIHtcbiAgICAgIHMyID0gcGVnJEZBSUxFRDtcbiAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGM0OCk7IH1cbiAgICB9XG4gICAgaWYgKHMyICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICB3aGlsZSAoczIgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgczEucHVzaChzMik7XG4gICAgICAgIGlmIChwZWckYzQ3LnRlc3QoaW5wdXQuY2hhckF0KHBlZyRjdXJyUG9zKSkpIHtcbiAgICAgICAgICBzMiA9IGlucHV0LmNoYXJBdChwZWckY3VyclBvcyk7XG4gICAgICAgICAgcGVnJGN1cnJQb3MrKztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzMiA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzQ4KTsgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHMxID0gcGVnJEZBSUxFRDtcbiAgICB9XG4gICAgaWYgKHMxICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICBwZWckc2F2ZWRQb3MgPSBzMDtcbiAgICAgIHMxID0gcGVnJGM0OShzMSk7XG4gICAgfVxuICAgIHMwID0gczE7XG5cbiAgICByZXR1cm4gczA7XG4gIH1cblxuICBmdW5jdGlvbiBwZWckcGFyc2V3c3AoKSB7XG4gICAgdmFyIHMwLCBzMTtcblxuICAgIHMwID0gcGVnJGN1cnJQb3M7XG4gICAgaWYgKHBlZyRjNTAudGVzdChpbnB1dC5jaGFyQXQocGVnJGN1cnJQb3MpKSkge1xuICAgICAgczEgPSBpbnB1dC5jaGFyQXQocGVnJGN1cnJQb3MpO1xuICAgICAgcGVnJGN1cnJQb3MrKztcbiAgICB9IGVsc2Uge1xuICAgICAgczEgPSBwZWckRkFJTEVEO1xuICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzUxKTsgfVxuICAgIH1cbiAgICBpZiAoczEgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgIHBlZyRzYXZlZFBvcyA9IHMwO1xuICAgICAgczEgPSBwZWckYzM3KCk7XG4gICAgfVxuICAgIHMwID0gczE7XG5cbiAgICByZXR1cm4gczA7XG4gIH1cblxuXG4gICAgZnVuY3Rpb24gbWVyZ2UoZmlyc3QsbW9yZSl7XG4gICAgICBpZiAoIW1vcmUpIHJldHVybiBbZmlyc3RdO1xuICAgICAgZm9yICh2YXIgYT1bZmlyc3RdLGk9MCxsPW1vcmUubGVuZ3RoO2k8bDtpKyspIGFbaSsxXT1tb3JlW2ldWzFdO1xuICAgICAgcmV0dXJuIGE7XG4gICAgfVxuXG4gICAgdmFyIGNtZHMgPSB7bTonbW92ZXRvJyxsOidsaW5ldG8nLGg6J2hvcml6b250YWwgbGluZXRvJyx2Oid2ZXJ0aWNhbCBsaW5ldG8nLGM6J2N1cnZldG8nLHM6J3Ntb290aCBjdXJ2ZXRvJyxxOidxdWFkcmF0aWMgY3VydmV0bycsdDonc21vb3RoIHF1YWRyYXRpYyBjdXJ2ZXRvJyxhOidlbGxpcHRpY2FsIGFyYycsejonY2xvc2VwYXRoJ307XG4gICAgZm9yICh2YXIgY29kZSBpbiBjbWRzKSBjbWRzW2NvZGUudG9VcHBlckNhc2UoKV09Y21kc1tjb2RlXTtcbiAgICBmdW5jdGlvbiBjb21tYW5kcyhjb2RlLGFyZ3Mpe1xuICAgICAgaWYgKCFhcmdzKSBhcmdzPVt7fV07XG4gICAgICBmb3IgKHZhciBpPWFyZ3MubGVuZ3RoO2ktLTspe1xuICAgICAgICB2YXIgY21kPXtjb2RlOmNvZGUsY29tbWFuZDpjbWRzW2NvZGVdfTtcbiAgICAgICAgaWYgKGNvZGU9PWNvZGUudG9Mb3dlckNhc2UoKSkgY21kLnJlbGF0aXZlPXRydWU7XG4gICAgICAgIGZvciAodmFyIGsgaW4gYXJnc1tpXSkgY21kW2tdPWFyZ3NbaV1ba107XG4gICAgICAgIGFyZ3NbaV0gPSBjbWQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gYXJncztcbiAgICB9XG5cblxuICBwZWckcmVzdWx0ID0gcGVnJHN0YXJ0UnVsZUZ1bmN0aW9uKCk7XG5cbiAgaWYgKHBlZyRyZXN1bHQgIT09IHBlZyRGQUlMRUQgJiYgcGVnJGN1cnJQb3MgPT09IGlucHV0Lmxlbmd0aCkge1xuICAgIHJldHVybiBwZWckcmVzdWx0O1xuICB9IGVsc2Uge1xuICAgIGlmIChwZWckcmVzdWx0ICE9PSBwZWckRkFJTEVEICYmIHBlZyRjdXJyUG9zIDwgaW5wdXQubGVuZ3RoKSB7XG4gICAgICBwZWckZmFpbChwZWckZW5kRXhwZWN0YXRpb24oKSk7XG4gICAgfVxuXG4gICAgdGhyb3cgcGVnJGJ1aWxkU3RydWN0dXJlZEVycm9yKFxuICAgICAgcGVnJG1heEZhaWxFeHBlY3RlZCxcbiAgICAgIHBlZyRtYXhGYWlsUG9zIDwgaW5wdXQubGVuZ3RoID8gaW5wdXQuY2hhckF0KHBlZyRtYXhGYWlsUG9zKSA6IG51bGwsXG4gICAgICBwZWckbWF4RmFpbFBvcyA8IGlucHV0Lmxlbmd0aFxuICAgICAgICA/IHBlZyRjb21wdXRlTG9jYXRpb24ocGVnJG1heEZhaWxQb3MsIHBlZyRtYXhGYWlsUG9zICsgMSlcbiAgICAgICAgOiBwZWckY29tcHV0ZUxvY2F0aW9uKHBlZyRtYXhGYWlsUG9zLCBwZWckbWF4RmFpbFBvcylcbiAgICApO1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBTeW50YXhFcnJvcjogcGVnJFN5bnRheEVycm9yLFxuICBwYXJzZTogICAgICAgcGVnJHBhcnNlXG59O1xuIiwiLy8gVGhlIG1vZHVsZSBjYWNoZVxudmFyIF9fd2VicGFja19tb2R1bGVfY2FjaGVfXyA9IHt9O1xuXG4vLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcblx0dmFyIGNhY2hlZE1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF07XG5cdGlmIChjYWNoZWRNb2R1bGUgIT09IHVuZGVmaW5lZCkge1xuXHRcdHJldHVybiBjYWNoZWRNb2R1bGUuZXhwb3J0cztcblx0fVxuXHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuXHR2YXIgbW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXSA9IHtcblx0XHQvLyBubyBtb2R1bGUuaWQgbmVlZGVkXG5cdFx0Ly8gbm8gbW9kdWxlLmxvYWRlZCBuZWVkZWRcblx0XHRleHBvcnRzOiB7fVxuXHR9O1xuXG5cdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuXHRfX3dlYnBhY2tfbW9kdWxlc19fW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuXHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuXHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG59XG5cbiIsIi8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb25zIGZvciBoYXJtb255IGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uZCA9IChleHBvcnRzLCBkZWZpbml0aW9uKSA9PiB7XG5cdGZvcih2YXIga2V5IGluIGRlZmluaXRpb24pIHtcblx0XHRpZihfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZGVmaW5pdGlvbiwga2V5KSAmJiAhX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIGtleSkpIHtcblx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBrZXksIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBkZWZpbml0aW9uW2tleV0gfSk7XG5cdFx0fVxuXHR9XG59OyIsIl9fd2VicGFja19yZXF1aXJlX18uZyA9IChmdW5jdGlvbigpIHtcblx0aWYgKHR5cGVvZiBnbG9iYWxUaGlzID09PSAnb2JqZWN0JykgcmV0dXJuIGdsb2JhbFRoaXM7XG5cdHRyeSB7XG5cdFx0cmV0dXJuIHRoaXMgfHwgbmV3IEZ1bmN0aW9uKCdyZXR1cm4gdGhpcycpKCk7XG5cdH0gY2F0Y2ggKGUpIHtcblx0XHRpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ29iamVjdCcpIHJldHVybiB3aW5kb3c7XG5cdH1cbn0pKCk7IiwiX193ZWJwYWNrX3JlcXVpcmVfXy5vID0gKG9iaiwgcHJvcCkgPT4gKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIHByb3ApKSIsIi8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uciA9IChleHBvcnRzKSA9PiB7XG5cdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuXHR9XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG59OyIsImltcG9ydCB7VmVjdG9yfSBmcm9tIFwibWF0dGVyLWpzXCI7XG5cbmV4cG9ydCBjb25zdCBmaW5kRGlzdGFuY2UgPSAoeDogbnVtYmVyLCB5OiBudW1iZXIsIHgxOiBudW1iZXIsIHkxOiBudW1iZXIpOiBudW1iZXIgPT5cbntcbiAgICByZXR1cm4gTWF0aC5zcXJ0KE1hdGgucG93KHggLSB4MSwgMikgKyBNYXRoLnBvdyh5IC0geTEsIDIpKTtcbn1cblxuZXhwb3J0IGNvbnN0IGZpbmREaXN0YW5jZVZlYyA9IChwMTogVmVjdG9yLCBwMjogVmVjdG9yKTogbnVtYmVyID0+XG57XG4gICAgcmV0dXJuIGZpbmREaXN0YW5jZShwMS54LCBwMS55LCBwMi54LCBwMi55KTtcbn1cblxuZXhwb3J0IGNvbnN0IGZpbmRDZW50ZXJPZkxpbmUgPSAocDE6IFZlY3RvciwgcDI6IFZlY3Rvcik6IFZlY3RvciA9Plxue1xuICAgIHJldHVybiBWZWN0b3IuY3JlYXRlKChwMS54ICsgcDIueCkgLyAyLCAocDEueSArIHAyLnkpIC8gMik7XG59XG5cbmV4cG9ydCBjb25zdCBsZW5ndGggPSAocDogVmVjdG9yKTogbnVtYmVyID0+XG57XG4gICAgcmV0dXJuIE1hdGguc3FydChNYXRoLnBvdyhwLngsIDIpICsgTWF0aC5wb3cocC55LCAyKSk7XG59XG5cbmV4cG9ydCBjb25zdCBtdWx0aXBseVZlYyA9IChwMTogVmVjdG9yLCBwMjogVmVjdG9yKTogVmVjdG9yID0+XG57XG4gICAgcmV0dXJuIFZlY3Rvci5jcmVhdGUocDEueCAqIHAyLngsIHAxLnkgKiBwMi55KTtcbn1cblxuZXhwb3J0IGNvbnN0IHZlY3RvckVxdWFscyA9IChwMTogVmVjdG9yLCBwMjogVmVjdG9yKTogYm9vbGVhbiA9Plxue1xuICAgIHJldHVybiBwMS54ID09PSBwMi54ICYmIHAxLnkgPT09IHAyLnk7XG59XG5cbmV4cG9ydCBjb25zdCBmaW5kQW5nbGUgPSAoeDogbnVtYmVyLCB5OiBudW1iZXIsIHgxOiBudW1iZXIsIHkxOiBudW1iZXIpOiBudW1iZXIgPT5cbntcbiAgICBjb25zdCBWeCA9IHggLSB4MTtcbiAgICBjb25zdCBWeSA9IHkgLSB5MTtcblxuICAgIGxldCByYWRpYW5zO1xuXG4gICAgaWYgKFZ4IHx8IFZ5KVxuICAgIHtcbiAgICAgICAgcmFkaWFucyA9IE1hdGguYXRhbjIoVnksIFZ4KSAtIE1hdGguUEk7XG4gICAgfSBlbHNlXG4gICAge1xuICAgICAgICByYWRpYW5zID0gMDtcbiAgICB9XG5cbiAgICBpZiAocmFkaWFucyA8IDApIHtcbiAgICAgICAgcmFkaWFucyArPSAyKk1hdGguUEk7XG4gICAgfVxuICAgIHJldHVybiByYWRpYW5zO1xufVxuXG5leHBvcnQgY29uc3Qgcm90YXRlUG9pbnRBcm91bmRDZW50ZXJQb2ludCA9IChjeDogbnVtYmVyLCBjeTogbnVtYmVyLCB4OiBudW1iZXIsIHk6IG51bWJlciwgYW5nbGU6IG51bWJlcik6IHt4OiBudW1iZXIsIHk6IG51bWJlcn0gPT5cbntcbiAgICBjb25zdCBjb3MgPSBNYXRoLmNvcyhhbmdsZSk7XG4gICAgY29uc3Qgc2luID0gTWF0aC5zaW4oYW5nbGUpO1xuICAgIGNvbnN0IG54ID0gKGNvcyAqICh4IC0gY3gpKSArIChzaW4gKiAoeSAtIGN5KSkgKyBjeDtcbiAgICBjb25zdCBueSA9IChjb3MgKiAoeSAtIGN5KSkgLSAoc2luICogKHggLSBjeCkpICsgY3k7XG4gICAgcmV0dXJuIHt4OiBueCwgeTogbnl9O1xufSIsImltcG9ydCB7SW50ZXJzZWN0b3J9IGZyb20gXCIuL0ludGVyc2VjdG9yXCI7XG5pbXBvcnQge1ZlY3Rvcn0gZnJvbSBcIm1hdHRlci1qc1wiO1xuaW1wb3J0IHttdWx0aXBseVZlY30gZnJvbSBcIi4uLy4uL2Jhc2UvbWF0aF91dGlsc1wiO1xuaW1wb3J0IHtMaW5lQ29tbWFuZFR5cGV9IGZyb20gXCIuLi8uLi9iYXNlL2NvbW1hbmRfbWFwcGVyXCI7XG5pbXBvcnQge2ZpbmRMZW5ndGhPZkxpbmVDb21tYW5kfSBmcm9tIFwiLi4vLi4vYmFzZS9jb21tYW5kX3V0aWxzXCI7XG5cbmV4cG9ydCBjbGFzcyBMaW5lTGluZUludGVyc2VjdG9yIGltcGxlbWVudHMgSW50ZXJzZWN0b3I8TGluZUNvbW1hbmRUeXBlLCBMaW5lQ29tbWFuZFR5cGU+XG57XG4gICAgaW50ZXJzZWN0cyhsaW5lMTogTGluZUNvbW1hbmRUeXBlLCBsaW5lMjogTGluZUNvbW1hbmRUeXBlKTogYm9vbGVhblxuICAgIHtcbiAgICAgICAgY29uc3QgcDEgPSBWZWN0b3IuY3JlYXRlKGxpbmUxLngsIGxpbmUxLnkpO1xuICAgICAgICBjb25zdCBwMiA9IFZlY3Rvci5jcmVhdGUobGluZTEueDAsIGxpbmUxLnkwKTtcblxuICAgICAgICBjb25zdCBxMSA9IFZlY3Rvci5jcmVhdGUobGluZTIueCwgbGluZTIueSk7XG4gICAgICAgIGNvbnN0IHEyID0gVmVjdG9yLmNyZWF0ZShsaW5lMi54MCwgbGluZTIueTApO1xuXG4gICAgICAgIGNvbnN0IHIgPSBWZWN0b3Iuc3ViKHAyLCBwMSk7XG4gICAgICAgIGNvbnN0IHMgPSBWZWN0b3Iuc3ViKHEyLCBxMSk7XG4gICAgICAgIGNvbnN0IHJ4cyA9IFZlY3Rvci5jcm9zcyhyLCBzKTtcbiAgICAgICAgY29uc3QgcXB4ciA9IFZlY3Rvci5jcm9zcyhWZWN0b3Iuc3ViKHExLCBwMSksIHIpO1xuXG4gICAgICAgIC8vIElmIHIgeCBzID0gMCBhbmQgKHEgLSBwKSB4IHIgPSAwLCB0aGVuIHRoZSB0d28gbGluZXMgYXJlIGNvbGxpbmVhci5cbiAgICAgICAgaWYgKHRoaXMuaXNaZXJvKHJ4cykgJiYgdGhpcy5pc1plcm8ocXB4cikpXG4gICAgICAgIHtcbiAgICAgICAgICAgIGNvbnN0IHExcDFyTGVuZ3RoID0gVmVjdG9yLm1hZ25pdHVkZShtdWx0aXBseVZlYyhWZWN0b3Iuc3ViKHExLCBwMSksIHIpKTtcbiAgICAgICAgICAgIGNvbnN0IHAxcTFzTGVuZ3RoID0gVmVjdG9yLm1hZ25pdHVkZShtdWx0aXBseVZlYyhWZWN0b3Iuc3ViKHAxLCBxMSksIHMpKTtcbiAgICAgICAgICAgIGNvbnN0IHJTcXVhcmVkTGVuZ3RoID0gVmVjdG9yLm1hZ25pdHVkZShtdWx0aXBseVZlYyhyLCByKSk7XG4gICAgICAgICAgICBjb25zdCBzU3F1YXJlZExlbmd0aCA9IFZlY3Rvci5tYWduaXR1ZGUobXVsdGlwbHlWZWMocywgcykpO1xuXG4gICAgICAgICAgICAvLyAxLiBJZiBlaXRoZXIgIDAgPD0gKHEgLSBwKSAqIHIgPD0gciAqIHIgb3IgMCA8PSAocCAtIHEpICogcyA8PSAqIHNcbiAgICAgICAgICAgIC8vIHRoZW4gdGhlIHR3byBsaW5lcyBhcmUgb3ZlcmxhcHBpbmcsXG4gICAgICAgICAgICBpZiAoKDAgPD0gcTFwMXJMZW5ndGggJiYgcTFwMXJMZW5ndGggPD0gclNxdWFyZWRMZW5ndGgpIHx8XG4gICAgICAgICAgICAgICAgMCA8PSAocDFxMXNMZW5ndGggJiYgcDFxMXNMZW5ndGggPD0gc1NxdWFyZWRMZW5ndGgpKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyAyLiBJZiBuZWl0aGVyIDAgPD0gKHEgLSBwKSAqIHIgPSByICogciBub3IgMCA8PSAocCAtIHEpICogcyA8PSBzICogc1xuICAgICAgICAgICAgLy8gdGhlbiB0aGUgdHdvIGxpbmVzIGFyZSBjb2xsaW5lYXIgYnV0IGRpc2pvaW50LlxuICAgICAgICAgICAgLy8gTm8gbmVlZCB0byBpbXBsZW1lbnQgdGhpcyBleHByZXNzaW9uLCBhcyBpdCBmb2xsb3dzIGZyb20gdGhlIGV4cHJlc3Npb24gYWJvdmUuXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICAvLyAzLiBJZiByIHggcyA9IDAgYW5kIChxIC0gcCkgeCByICE9IDAsIHRoZW4gdGhlIHR3byBsaW5lcyBhcmUgcGFyYWxsZWwgYW5kIG5vbi1pbnRlcnNlY3RpbmcuXG4gICAgICAgIGlmICh0aGlzLmlzWmVybyhyeHMpICYmICF0aGlzLmlzWmVybyhxcHhyKSlcbiAgICAgICAge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gdCA9IChxIC0gcCkgeCBzIC8gKHIgeCBzKVxuICAgICAgICBjb25zdCB0ID0gVmVjdG9yLmNyb3NzKFZlY3Rvci5zdWIocTEsIHAxKSwgcykgLyByeHM7XG5cbiAgICAgICAgLy8gdSA9IChxIC0gcCkgeCByIC8gKHIgeCBzKVxuICAgICAgICBjb25zdCB1ID0gVmVjdG9yLmNyb3NzKFZlY3Rvci5zdWIocTEsIHAxKSwgcikgLyByeHM7XG5cbiAgICAgICAgLy8gNC4gSWYgciB4IHMgIT0gMCBhbmQgMCA8PSB0IDw9IDEgYW5kIDAgPD0gdSA8PSAxXG4gICAgICAgIC8vIHRoZSB0d28gbGluZSBzZWdtZW50cyBtZWV0IGF0IHRoZSBwb2ludCBwICsgdCByID0gcSArIHUgcy5cbiAgICAgICAgaWYgKCF0aGlzLmlzWmVybyhyeHMpICYmICgwIDw9IHQgJiYgdCA8PSAxKSAmJiAoMCA8PSB1ICYmIHUgPD0gMSkpXG4gICAgICAgIHtcbiAgICAgICAgICAgIC8vIEFuIGludGVyc2VjdGlvbiB3YXMgZm91bmQuXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIDUuIE90aGVyd2lzZSwgdGhlIHR3byBsaW5lIHNlZ21lbnRzIGFyZSBub3QgcGFyYWxsZWwgYnV0IGRvIG5vdCBpbnRlcnNlY3QuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBzdXBwb3J0ZWRDb21tYW5kVHlwZXMoKTogW3N0cmluZ1tdLCBzdHJpbmdbXV1cbiAgICB7XG4gICAgICAgIHJldHVybiBbW1wiTFwiLCBcIlpcIl0sIFtcIkxcIiwgXCJaXCJdXTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGlzWmVybyhkOiBudW1iZXIpOiBib29sZWFuXG4gICAge1xuICAgICAgICByZXR1cm4gTWF0aC5hYnMoZCkgPCAxZS0xMDtcbiAgICB9XG5cbn0iLCJjb25zdCByYW5kb21VVUlEID0gdHlwZW9mIGNyeXB0byAhPT0gJ3VuZGVmaW5lZCcgJiYgY3J5cHRvLnJhbmRvbVVVSUQgJiYgY3J5cHRvLnJhbmRvbVVVSUQuYmluZChjcnlwdG8pO1xuZXhwb3J0IGRlZmF1bHQge1xuICByYW5kb21VVUlEXG59OyIsIi8vIFVuaXF1ZSBJRCBjcmVhdGlvbiByZXF1aXJlcyBhIGhpZ2ggcXVhbGl0eSByYW5kb20gIyBnZW5lcmF0b3IuIEluIHRoZSBicm93c2VyIHdlIHRoZXJlZm9yZVxuLy8gcmVxdWlyZSB0aGUgY3J5cHRvIEFQSSBhbmQgZG8gbm90IHN1cHBvcnQgYnVpbHQtaW4gZmFsbGJhY2sgdG8gbG93ZXIgcXVhbGl0eSByYW5kb20gbnVtYmVyXG4vLyBnZW5lcmF0b3JzIChsaWtlIE1hdGgucmFuZG9tKCkpLlxubGV0IGdldFJhbmRvbVZhbHVlcztcbmNvbnN0IHJuZHM4ID0gbmV3IFVpbnQ4QXJyYXkoMTYpO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gcm5nKCkge1xuICAvLyBsYXp5IGxvYWQgc28gdGhhdCBlbnZpcm9ubWVudHMgdGhhdCBuZWVkIHRvIHBvbHlmaWxsIGhhdmUgYSBjaGFuY2UgdG8gZG8gc29cbiAgaWYgKCFnZXRSYW5kb21WYWx1ZXMpIHtcbiAgICAvLyBnZXRSYW5kb21WYWx1ZXMgbmVlZHMgdG8gYmUgaW52b2tlZCBpbiBhIGNvbnRleHQgd2hlcmUgXCJ0aGlzXCIgaXMgYSBDcnlwdG8gaW1wbGVtZW50YXRpb24uXG4gICAgZ2V0UmFuZG9tVmFsdWVzID0gdHlwZW9mIGNyeXB0byAhPT0gJ3VuZGVmaW5lZCcgJiYgY3J5cHRvLmdldFJhbmRvbVZhbHVlcyAmJiBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzLmJpbmQoY3J5cHRvKTtcblxuICAgIGlmICghZ2V0UmFuZG9tVmFsdWVzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NyeXB0by5nZXRSYW5kb21WYWx1ZXMoKSBub3Qgc3VwcG9ydGVkLiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3V1aWRqcy91dWlkI2dldHJhbmRvbXZhbHVlcy1ub3Qtc3VwcG9ydGVkJyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGdldFJhbmRvbVZhbHVlcyhybmRzOCk7XG59IiwiaW1wb3J0IHZhbGlkYXRlIGZyb20gJy4vdmFsaWRhdGUuanMnO1xuLyoqXG4gKiBDb252ZXJ0IGFycmF5IG9mIDE2IGJ5dGUgdmFsdWVzIHRvIFVVSUQgc3RyaW5nIGZvcm1hdCBvZiB0aGUgZm9ybTpcbiAqIFhYWFhYWFhYLVhYWFgtWFhYWC1YWFhYLVhYWFhYWFhYWFhYWFxuICovXG5cbmNvbnN0IGJ5dGVUb0hleCA9IFtdO1xuXG5mb3IgKGxldCBpID0gMDsgaSA8IDI1NjsgKytpKSB7XG4gIGJ5dGVUb0hleC5wdXNoKChpICsgMHgxMDApLnRvU3RyaW5nKDE2KS5zbGljZSgxKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1bnNhZmVTdHJpbmdpZnkoYXJyLCBvZmZzZXQgPSAwKSB7XG4gIC8vIE5vdGU6IEJlIGNhcmVmdWwgZWRpdGluZyB0aGlzIGNvZGUhICBJdCdzIGJlZW4gdHVuZWQgZm9yIHBlcmZvcm1hbmNlXG4gIC8vIGFuZCB3b3JrcyBpbiB3YXlzIHlvdSBtYXkgbm90IGV4cGVjdC4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS91dWlkanMvdXVpZC9wdWxsLzQzNFxuICByZXR1cm4gKGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgMF1dICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyAxXV0gKyBieXRlVG9IZXhbYXJyW29mZnNldCArIDJdXSArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgM11dICsgJy0nICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyA0XV0gKyBieXRlVG9IZXhbYXJyW29mZnNldCArIDVdXSArICctJyArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgNl1dICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyA3XV0gKyAnLScgKyBieXRlVG9IZXhbYXJyW29mZnNldCArIDhdXSArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgOV1dICsgJy0nICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyAxMF1dICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyAxMV1dICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyAxMl1dICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyAxM11dICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyAxNF1dICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyAxNV1dKS50b0xvd2VyQ2FzZSgpO1xufVxuXG5mdW5jdGlvbiBzdHJpbmdpZnkoYXJyLCBvZmZzZXQgPSAwKSB7XG4gIGNvbnN0IHV1aWQgPSB1bnNhZmVTdHJpbmdpZnkoYXJyLCBvZmZzZXQpOyAvLyBDb25zaXN0ZW5jeSBjaGVjayBmb3IgdmFsaWQgVVVJRC4gIElmIHRoaXMgdGhyb3dzLCBpdCdzIGxpa2VseSBkdWUgdG8gb25lXG4gIC8vIG9mIHRoZSBmb2xsb3dpbmc6XG4gIC8vIC0gT25lIG9yIG1vcmUgaW5wdXQgYXJyYXkgdmFsdWVzIGRvbid0IG1hcCB0byBhIGhleCBvY3RldCAobGVhZGluZyB0b1xuICAvLyBcInVuZGVmaW5lZFwiIGluIHRoZSB1dWlkKVxuICAvLyAtIEludmFsaWQgaW5wdXQgdmFsdWVzIGZvciB0aGUgUkZDIGB2ZXJzaW9uYCBvciBgdmFyaWFudGAgZmllbGRzXG5cbiAgaWYgKCF2YWxpZGF0ZSh1dWlkKSkge1xuICAgIHRocm93IFR5cGVFcnJvcignU3RyaW5naWZpZWQgVVVJRCBpcyBpbnZhbGlkJyk7XG4gIH1cblxuICByZXR1cm4gdXVpZDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgc3RyaW5naWZ5OyIsImltcG9ydCBuYXRpdmUgZnJvbSAnLi9uYXRpdmUuanMnO1xuaW1wb3J0IHJuZyBmcm9tICcuL3JuZy5qcyc7XG5pbXBvcnQgeyB1bnNhZmVTdHJpbmdpZnkgfSBmcm9tICcuL3N0cmluZ2lmeS5qcyc7XG5cbmZ1bmN0aW9uIHY0KG9wdGlvbnMsIGJ1Ziwgb2Zmc2V0KSB7XG4gIGlmIChuYXRpdmUucmFuZG9tVVVJRCAmJiAhYnVmICYmICFvcHRpb25zKSB7XG4gICAgcmV0dXJuIG5hdGl2ZS5yYW5kb21VVUlEKCk7XG4gIH1cblxuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgY29uc3Qgcm5kcyA9IG9wdGlvbnMucmFuZG9tIHx8IChvcHRpb25zLnJuZyB8fCBybmcpKCk7IC8vIFBlciA0LjQsIHNldCBiaXRzIGZvciB2ZXJzaW9uIGFuZCBgY2xvY2tfc2VxX2hpX2FuZF9yZXNlcnZlZGBcblxuICBybmRzWzZdID0gcm5kc1s2XSAmIDB4MGYgfCAweDQwO1xuICBybmRzWzhdID0gcm5kc1s4XSAmIDB4M2YgfCAweDgwOyAvLyBDb3B5IGJ5dGVzIHRvIGJ1ZmZlciwgaWYgcHJvdmlkZWRcblxuICBpZiAoYnVmKSB7XG4gICAgb2Zmc2V0ID0gb2Zmc2V0IHx8IDA7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IDE2OyArK2kpIHtcbiAgICAgIGJ1ZltvZmZzZXQgKyBpXSA9IHJuZHNbaV07XG4gICAgfVxuXG4gICAgcmV0dXJuIGJ1ZjtcbiAgfVxuXG4gIHJldHVybiB1bnNhZmVTdHJpbmdpZnkocm5kcyk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHY0OyIsImltcG9ydCB7IHY0IGFzIHV1aWR2NCB9IGZyb20gJ3V1aWQnO1xuXG5leHBvcnQgY2xhc3MgQWdncmVnYXRpb25Ob2RlPFQ+XG57XG4gICAgcHJpdmF0ZSBfcGFyZW50OiBBZ2dyZWdhdGlvbk5vZGU8VD4gfCB1bmRlZmluZWQ7XG4gICAgcHJpdmF0ZSBfdmFsdWU6IFQ7XG4gICAgcHJpdmF0ZSBfY2hpbGRyZW46IEFnZ3JlZ2F0aW9uTm9kZTxUPltdO1xuICAgIHByaXZhdGUgX2lkOiBzdHJpbmc7XG5cbiAgICBjb25zdHJ1Y3Rvcih2YWx1ZTogVCwgcGFyZW50OiBBZ2dyZWdhdGlvbk5vZGU8VD4gfCB1bmRlZmluZWQpXG4gICAge1xuICAgICAgICB0aGlzLl9pZCA9IHV1aWR2NCgpO1xuICAgICAgICB0aGlzLl9wYXJlbnQgPSBwYXJlbnQ7XG4gICAgICAgIHRoaXMuX3ZhbHVlID0gdmFsdWU7XG4gICAgICAgIHRoaXMuX2NoaWxkcmVuID0gW107XG4gICAgfVxuXG4gICAgZ2V0IGlkKCk6IHN0cmluZ1xuICAgIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2lkO1xuICAgIH1cblxuICAgIGdldCB2YWx1ZSgpOiBUXG4gICAge1xuICAgICAgICByZXR1cm4gdGhpcy5fdmFsdWU7XG4gICAgfVxuXG4gICAgYWRkQ2hpbGQodmFsdWU6IFQpOiBBZ2dyZWdhdGlvbk5vZGU8VD5cbiAgICB7XG4gICAgICAgIGNvbnN0IG5vZGUgPSBuZXcgQWdncmVnYXRpb25Ob2RlKHZhbHVlLCB0aGlzKTtcbiAgICAgICAgbm9kZS5fcGFyZW50ID0gdGhpcztcbiAgICAgICAgdGhpcy5fY2hpbGRyZW4ucHVzaChub2RlKTtcbiAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfVxuXG4gICAgYWRkQ2hpbGROb2RlKG5vZGU6IEFnZ3JlZ2F0aW9uTm9kZTxUPik6IEFnZ3JlZ2F0aW9uTm9kZTxUPlxuICAgIHtcbiAgICAgICAgbm9kZS5fcGFyZW50ID0gdGhpcztcbiAgICAgICAgdGhpcy5fY2hpbGRyZW4ucHVzaChub2RlKTtcbiAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfVxuXG4gICAgZ2V0Q2hpbGRyZW5SZWN1cnNpdmVseSgpOiBBZ2dyZWdhdGlvbk5vZGU8VD5bXVxuICAgIHtcbiAgICAgICAgY29uc3QgY2hpbGRyZW4gPSBuZXcgQXJyYXk8QWdncmVnYXRpb25Ob2RlPFQ+Pih0aGlzKTtcbiAgICAgICAgdGhpcy5fY2hpbGRyZW4uZm9yRWFjaChjaGlsZCA9PlxuICAgICAgICB7XG4gICAgICAgICAgICBjaGlsZC5nZXRDaGlsZHJlblJlY3Vyc2l2ZWx5KCkuZm9yRWFjaChzdWJDaGlsZCA9PlxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNoaWxkcmVuLnB1c2goc3ViQ2hpbGQpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIGNoaWxkcmVuO1xuICAgIH1cblxuICAgIGdldFJvb3QoKTogQWdncmVnYXRpb25Ob2RlPFQ+XG4gICAge1xuICAgICAgICBpZiAodGhpcy5fcGFyZW50ID09PSB1bmRlZmluZWQpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9wYXJlbnQuZ2V0Um9vdCgpO1xuICAgIH1cbn0iLCJpbXBvcnQge0FnZ3JlZ2F0aW9uTm9kZX0gZnJvbSBcIi4vYWdncmVnYXRpb25fbm9kZVwiO1xuXG5leHBvcnQgY2xhc3MgQWdncmVnYXRpb25UcmVlPFQ+XG57XG4gICAgcHJpdmF0ZSBfcm9vdHM6IEFnZ3JlZ2F0aW9uTm9kZTxUPltdO1xuICAgIHByaXZhdGUgX2FnZ3JlZ2F0aW9uRmNuOiAoY21kMTogVCwgY21kMjogVCkgPT4gYm9vbGVhbjtcblxuICAgIGNvbnN0cnVjdG9yKGFnZ3JlZ2F0aW9uRmNuOiAoY21kMTogVCwgY21kMjogVCkgPT4gYm9vbGVhbilcbiAgICB7XG4gICAgICAgIHRoaXMuX3Jvb3RzID0gW107XG4gICAgICAgIHRoaXMuX2FnZ3JlZ2F0aW9uRmNuID0gYWdncmVnYXRpb25GY247XG4gICAgfVxuXG4gICAgZ2V0QWdncmVnYXRlZENvbW1hbmRzKCk6IFRbXVtdXG4gICAge1xuICAgICAgICByZXR1cm4gdGhpcy5fcm9vdHMubWFwKHJvb3QgPT5cbiAgICAgICAge1xuICAgICAgICAgICAgcmV0dXJuIHJvb3QuZ2V0Q2hpbGRyZW5SZWN1cnNpdmVseSgpLm1hcChub2RlID0+IG5vZGUudmFsdWUpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBhZGRWYWx1ZSh2YWx1ZTogVClcbiAgICB7XG4gICAgICAgIGlmICh0aGlzLl9yb290cy5sZW5ndGggPT09IDApXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMuX3Jvb3RzLnB1c2gobmV3IEFnZ3JlZ2F0aW9uTm9kZSh2YWx1ZSwgdW5kZWZpbmVkKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICB7XG4gICAgICAgICAgICBjb25zdCBub2Rlc0NvbGxpZGVkID0gdGhpcy5nZXRBbGxOb2RlcygpXG4gICAgICAgICAgICAgICAgLmZpbHRlcihub2RlID0+IHRoaXMuX2FnZ3JlZ2F0aW9uRmNuKG5vZGUudmFsdWUsIHZhbHVlKSk7XG5cbiAgICAgICAgICAgIC8vIGRpZCBub3QgY29sbGlkZSB3aXRoIGFueXRoaW5nXG4gICAgICAgICAgICBpZiAobm9kZXNDb2xsaWRlZC5sZW5ndGggPT09IDApXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgLy8gYWRkIGFzIHJvb3RcbiAgICAgICAgICAgICAgICB0aGlzLl9yb290cy5wdXNoKG5ldyBBZ2dyZWdhdGlvbk5vZGUodmFsdWUsIHVuZGVmaW5lZCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNvbnN0IGFkZGVkTm9kZSA9IG5vZGVzQ29sbGlkZWRbMF0uYWRkQ2hpbGQodmFsdWUpO1xuICAgICAgICAgICAgICAgIG5vZGVzQ29sbGlkZWQuc2xpY2UoMSwgbm9kZXNDb2xsaWRlZC5sZW5ndGgpXG4gICAgICAgICAgICAgICAgICAgIC5tYXAobm9kZSA9PiBub2RlLmdldFJvb3QoKSlcbiAgICAgICAgICAgICAgICAgICAgLmZpbHRlcihyb290ID0+IHJvb3QuaWQgIT09IGFkZGVkTm9kZS5nZXRSb290KCkuaWQpXG4gICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoKG5vZGUsIGluZGV4LCBzZWxmKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4ID09PSBzZWxmLmZpbmRJbmRleCgodCkgPT4gKHQuaWQgPT09IG5vZGUuaWQpKVxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgIC5mb3JFYWNoKHJvb3QgPT5cbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgYWRkZWROb2RlLmFkZENoaWxkTm9kZShyb290KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3Jvb3RzLnNwbGljZSh0aGlzLl9yb290cy5pbmRleE9mKHJvb3QpLCAxKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXRBbGxOb2RlcygpOiBBZ2dyZWdhdGlvbk5vZGU8VD5bXVxuICAgIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Jvb3RzLmZsYXRNYXAoKG5vZGUpID0+IG5vZGUuZ2V0Q2hpbGRyZW5SZWN1cnNpdmVseSgpKTtcbiAgICB9XG59IiwiaW1wb3J0IHtJbnRlcnNlY3Rvcn0gZnJvbSBcIi4vaW50ZXJzZWN0b3JcIjtcbmltcG9ydCB7Q2xvc2VQYXRoQ29tbWFuZE1hZGVBYnNvbHV0ZSwgTGluZVRvQ29tbWFuZE1hZGVBYnNvbHV0ZSwgTW92ZVRvQ29tbWFuZE1hZGVBYnNvbHV0ZX0gZnJvbSBcInN2Zy1wYXRoLXBhcnNlclwiO1xuaW1wb3J0IHtMaW5lQ29tbWFuZFR5cGV9IGZyb20gXCIuLi8uLi9iYXNlL2NvbW1hbmRfbWFwcGVyXCI7XG5pbXBvcnQge2ZpbmRMZW5ndGhPZkxpbmVDb21tYW5kfSBmcm9tIFwiLi4vLi4vYmFzZS9jb21tYW5kX3V0aWxzXCI7XG5cbmV4cG9ydCBjbGFzcyBMaW5lUG9pbnRJbnRlcnNlY3RvciBpbXBsZW1lbnRzIEludGVyc2VjdG9yPExpbmVDb21tYW5kVHlwZSwgTW92ZVRvQ29tbWFuZE1hZGVBYnNvbHV0ZT5cbntcbiAgICBpbnRlcnNlY3RzKGxpbmU6IExpbmVDb21tYW5kVHlwZSwgcG9pbnQ6IE1vdmVUb0NvbW1hbmRNYWRlQWJzb2x1dGUpOiBib29sZWFuXG4gICAge1xuICAgICAgICBjb25zdCBhID0ge3g6IGxpbmUueCwgeTogbGluZS55fTtcbiAgICAgICAgY29uc3QgYiA9IHt4OiBsaW5lLngwLCB5OiBsaW5lLnkwfTtcbiAgICAgICAgY29uc3QgYyA9IHt4OiBwb2ludC54LCB5OiBwb2ludC55fTtcbiAgICAgICAgY29uc3QgY3Jvc3NQcm9kdWN0ID0gKGMueSAtIGEueSkgKiAoYi54IC0gYS54KSAtIChjLnggLSBhLngpICogKGIueSAtIGEueSlcblxuICAgICAgICAvLyBjb21wYXJlIHZlcnN1cyBlcHNpbG9uIGZvciBmbG9hdGluZyBwb2ludCB2YWx1ZXMsIG9yICE9IDAgaWYgdXNpbmcgaW50ZWdlcnNcbiAgICAgICAgaWYgKE1hdGguYWJzKGNyb3NzUHJvZHVjdCkgPiAxZS0xMClcbiAgICAgICAge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZG90UHJvZHVjdCA9IChjLnggLSBhLngpICogKGIueCAtIGEueCkgKyAoYy55IC0gYS55KSooYi55IC0gYS55KVxuICAgICAgICBpZiAoZG90UHJvZHVjdCA8IDApXG4gICAgICAgIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNxdWFyZWRMZW5ndGhCQSA9IChiLnggLSBhLngpKihiLnggLSBhLngpICsgKGIueSAtIGEueSkqKGIueSAtIGEueSlcbiAgICAgICAgcmV0dXJuIGRvdFByb2R1Y3QgPD0gc3F1YXJlZExlbmd0aEJBO1xuICAgIH1cblxuICAgIHN1cHBvcnRlZENvbW1hbmRUeXBlcygpOiBbc3RyaW5nW10sIHN0cmluZ1tdXVxuICAgIHtcbiAgICAgICAgcmV0dXJuIFtbXCJMXCIsIFwiWlwiXSwgW1wiTVwiXV07XG4gICAgfVxuXG59IiwiLyogdHNsaW50OmRpc2FibGUgKi9cblxuLy8gbWF0aC1pbmxpbmluZy5cbmNvbnN0IHsgYWJzLCBjb3MsIHNpbiwgYWNvcywgYXRhbjIsIHNxcnQsIHBvdyB9ID0gTWF0aDtcblxuLy8gY3ViZSByb290IGZ1bmN0aW9uIHlpZWxkaW5nIHJlYWwgcm9vdHNcbmZ1bmN0aW9uIGNydCh2KSB7XG4gIHJldHVybiB2IDwgMCA/IC1wb3coLXYsIDEgLyAzKSA6IHBvdyh2LCAxIC8gMyk7XG59XG5cbi8vIHRyaWcgY29uc3RhbnRzXG5jb25zdCBwaSA9IE1hdGguUEksXG4gIHRhdSA9IDIgKiBwaSxcbiAgcXVhcnQgPSBwaSAvIDIsXG4gIC8vIGZsb2F0IHByZWNpc2lvbiBzaWduaWZpY2FudCBkZWNpbWFsXG4gIGVwc2lsb24gPSAwLjAwMDAwMSxcbiAgLy8gZXh0cmVtYXMgdXNlZCBpbiBiYm94IGNhbGN1bGF0aW9uIGFuZCBzaW1pbGFyIGFsZ29yaXRobXNcbiAgbk1heCA9IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSIHx8IDkwMDcxOTkyNTQ3NDA5OTEsXG4gIG5NaW4gPSBOdW1iZXIuTUlOX1NBRkVfSU5URUdFUiB8fCAtOTAwNzE5OTI1NDc0MDk5MSxcbiAgLy8gYSB6ZXJvIGNvb3JkaW5hdGUsIHdoaWNoIGlzIHN1cnByaXNpbmdseSB1c2VmdWxcbiAgWkVSTyA9IHsgeDogMCwgeTogMCwgejogMCB9O1xuXG4vLyBCZXppZXIgdXRpbGl0eSBmdW5jdGlvbnNcbmNvbnN0IHV0aWxzID0ge1xuICAvLyBMZWdlbmRyZS1HYXVzcyBhYnNjaXNzYWUgd2l0aCBuPTI0ICh4X2kgdmFsdWVzLCBkZWZpbmVkIGF0IGk9biBhcyB0aGUgcm9vdHMgb2YgdGhlIG50aCBvcmRlciBMZWdlbmRyZSBwb2x5bm9taWFsIFBuKHgpKVxuICBUdmFsdWVzOiBbXG4gICAgLTAuMDY0MDU2ODkyODYyNjA1NjI2MDg1MDQzMDgyNjI0NzQ1MDM4NTkwOSxcbiAgICAwLjA2NDA1Njg5Mjg2MjYwNTYyNjA4NTA0MzA4MjYyNDc0NTAzODU5MDksXG4gICAgLTAuMTkxMTE4ODY3NDczNjE2MzA5MTU4NjM5ODIwNzU3MDY5NjMxODQwNCxcbiAgICAwLjE5MTExODg2NzQ3MzYxNjMwOTE1ODYzOTgyMDc1NzA2OTYzMTg0MDQsXG4gICAgLTAuMzE1MDQyNjc5Njk2MTYzMzc0Mzg2NzkzMjkxMzE5ODEwMjQwNzg2NCxcbiAgICAwLjMxNTA0MjY3OTY5NjE2MzM3NDM4Njc5MzI5MTMxOTgxMDI0MDc4NjQsXG4gICAgLTAuNDMzNzkzNTA3NjI2MDQ1MTM4NDg3MDg0MjMxOTEzMzQ5NzEyNDUyNCxcbiAgICAwLjQzMzc5MzUwNzYyNjA0NTEzODQ4NzA4NDIzMTkxMzM0OTcxMjQ1MjQsXG4gICAgLTAuNTQ1NDIxNDcxMzg4ODM5NTM1NjU4Mzc1NjE3MjE4MzcyMzcwMDEwNyxcbiAgICAwLjU0NTQyMTQ3MTM4ODgzOTUzNTY1ODM3NTYxNzIxODM3MjM3MDAxMDcsXG4gICAgLTAuNjQ4MDkzNjUxOTM2OTc1NTY5MjUyNDk1Nzg2OTEwNzQ3NjI2NjY5NixcbiAgICAwLjY0ODA5MzY1MTkzNjk3NTU2OTI1MjQ5NTc4NjkxMDc0NzYyNjY2OTYsXG4gICAgLTAuNzQwMTI0MTkxNTc4NTU0MzY0MjQzODI4MTAzMDk5OTc4NDI1NTIzMixcbiAgICAwLjc0MDEyNDE5MTU3ODU1NDM2NDI0MzgyODEwMzA5OTk3ODQyNTUyMzIsXG4gICAgLTAuODIwMDAxOTg1OTczOTAyOTIxOTUzOTQ5ODcyNjY5NzQ1MjA4MDc2MSxcbiAgICAwLjgyMDAwMTk4NTk3MzkwMjkyMTk1Mzk0OTg3MjY2OTc0NTIwODA3NjEsXG4gICAgLTAuODg2NDE1NTI3MDA0NDAxMDM0MjEzMTU0MzQxOTgyMTk2NzU1MDg3MyxcbiAgICAwLjg4NjQxNTUyNzAwNDQwMTAzNDIxMzE1NDM0MTk4MjE5Njc1NTA4NzMsXG4gICAgLTAuOTM4Mjc0NTUyMDAyNzMyNzU4NTIzNjQ5MDAxNzA4NzIxNDQ5NjU0OCxcbiAgICAwLjkzODI3NDU1MjAwMjczMjc1ODUyMzY0OTAwMTcwODcyMTQ0OTY1NDgsXG4gICAgLTAuOTc0NzI4NTU1OTcxMzA5NDk4MTk4MzkxOTkzMDA4MTY5MDYxNzQxMSxcbiAgICAwLjk3NDcyODU1NTk3MTMwOTQ5ODE5ODM5MTk5MzAwODE2OTA2MTc0MTEsXG4gICAgLTAuOTk1MTg3MjE5OTk3MDIxMzYwMTc5OTk3NDA5NzAwNzM2ODExODc0NSxcbiAgICAwLjk5NTE4NzIxOTk5NzAyMTM2MDE3OTk5NzQwOTcwMDczNjgxMTg3NDUsXG4gIF0sXG5cbiAgLy8gTGVnZW5kcmUtR2F1c3Mgd2VpZ2h0cyB3aXRoIG49MjQgKHdfaSB2YWx1ZXMsIGRlZmluZWQgYnkgYSBmdW5jdGlvbiBsaW5rZWQgdG8gaW4gdGhlIEJlemllciBwcmltZXIgYXJ0aWNsZSlcbiAgQ3ZhbHVlczogW1xuICAgIDAuMTI3OTM4MTk1MzQ2NzUyMTU2OTc0MDU2MTY1MjI0Njk1MzcxODUxNyxcbiAgICAwLjEyNzkzODE5NTM0Njc1MjE1Njk3NDA1NjE2NTIyNDY5NTM3MTg1MTcsXG4gICAgMC4xMjU4Mzc0NTYzNDY4MjgyOTYxMjEzNzUzODI1MTExODM2ODg3MjY0LFxuICAgIDAuMTI1ODM3NDU2MzQ2ODI4Mjk2MTIxMzc1MzgyNTExMTgzNjg4NzI2NCxcbiAgICAwLjEyMTY3MDQ3MjkyNzgwMzM5MTIwNDQ2MzE1MzQ3NjI2MjQyNTYwNyxcbiAgICAwLjEyMTY3MDQ3MjkyNzgwMzM5MTIwNDQ2MzE1MzQ3NjI2MjQyNTYwNyxcbiAgICAwLjExNTUwNTY2ODA1MzcyNTYwMTM1MzM0NDQ4MzkwNjc4MzU1OTg2MjIsXG4gICAgMC4xMTU1MDU2NjgwNTM3MjU2MDEzNTMzNDQ0ODM5MDY3ODM1NTk4NjIyLFxuICAgIDAuMTA3NDQ0MjcwMTE1OTY1NjM0NzgyNTc3MzQyNDQ2NjA2MjIyNzk0NixcbiAgICAwLjEwNzQ0NDI3MDExNTk2NTYzNDc4MjU3NzM0MjQ0NjYwNjIyMjc5NDYsXG4gICAgMC4wOTc2MTg2NTIxMDQxMTM4ODgyNjk4ODA2NjQ0NjQyNDcxNTQ0Mjc5LFxuICAgIDAuMDk3NjE4NjUyMTA0MTEzODg4MjY5ODgwNjY0NDY0MjQ3MTU0NDI3OSxcbiAgICAwLjA4NjE5MDE2MTUzMTk1MzI3NTkxNzE4NTIwMjk4Mzc0MjY2NzE4NSxcbiAgICAwLjA4NjE5MDE2MTUzMTk1MzI3NTkxNzE4NTIwMjk4Mzc0MjY2NzE4NSxcbiAgICAwLjA3MzM0NjQ4MTQxMTA4MDMwNTczNDAzMzYxNTI1MzExNjUxODExOTMsXG4gICAgMC4wNzMzNDY0ODE0MTEwODAzMDU3MzQwMzM2MTUyNTMxMTY1MTgxMTkzLFxuICAgIDAuMDU5Mjk4NTg0OTE1NDM2NzgwNzQ2MzY3NzU4NTAwMTA4NTg0NTQxMixcbiAgICAwLjA1OTI5ODU4NDkxNTQzNjc4MDc0NjM2Nzc1ODUwMDEwODU4NDU0MTIsXG4gICAgMC4wNDQyNzc0Mzg4MTc0MTk4MDYxNjg2MDI3NDgyMTEzMzgyMjg4NTkzLFxuICAgIDAuMDQ0Mjc3NDM4ODE3NDE5ODA2MTY4NjAyNzQ4MjExMzM4MjI4ODU5MyxcbiAgICAwLjAyODUzMTM4ODYyODkzMzY2MzE4MTMwNzgxNTk1MTg3ODI4NjQ0OTEsXG4gICAgMC4wMjg1MzEzODg2Mjg5MzM2NjMxODEzMDc4MTU5NTE4NzgyODY0NDkxLFxuICAgIDAuMDEyMzQxMjI5Nzk5OTg3MTk5NTQ2ODA1NjY3MDcwMDM3MjkxNTc1OSxcbiAgICAwLjAxMjM0MTIyOTc5OTk4NzE5OTU0NjgwNTY2NzA3MDAzNzI5MTU3NTksXG4gIF0sXG5cbiAgYXJjZm46IGZ1bmN0aW9uICh0LCBkZXJpdmF0aXZlRm4pIHtcbiAgICBjb25zdCBkID0gZGVyaXZhdGl2ZUZuKHQpO1xuICAgIGxldCBsID0gZC54ICogZC54ICsgZC55ICogZC55O1xuICAgIGlmICh0eXBlb2YgZC56ICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICBsICs9IGQueiAqIGQuejtcbiAgICB9XG4gICAgcmV0dXJuIHNxcnQobCk7XG4gIH0sXG5cbiAgY29tcHV0ZTogZnVuY3Rpb24gKHQsIHBvaW50cywgXzNkKSB7XG4gICAgLy8gc2hvcnRjdXRzXG4gICAgaWYgKHQgPT09IDApIHtcbiAgICAgIHBvaW50c1swXS50ID0gMDtcbiAgICAgIHJldHVybiBwb2ludHNbMF07XG4gICAgfVxuXG4gICAgY29uc3Qgb3JkZXIgPSBwb2ludHMubGVuZ3RoIC0gMTtcblxuICAgIGlmICh0ID09PSAxKSB7XG4gICAgICBwb2ludHNbb3JkZXJdLnQgPSAxO1xuICAgICAgcmV0dXJuIHBvaW50c1tvcmRlcl07XG4gICAgfVxuXG4gICAgY29uc3QgbXQgPSAxIC0gdDtcbiAgICBsZXQgcCA9IHBvaW50cztcblxuICAgIC8vIGNvbnN0YW50P1xuICAgIGlmIChvcmRlciA9PT0gMCkge1xuICAgICAgcG9pbnRzWzBdLnQgPSB0O1xuICAgICAgcmV0dXJuIHBvaW50c1swXTtcbiAgICB9XG5cbiAgICAvLyBsaW5lYXI/XG4gICAgaWYgKG9yZGVyID09PSAxKSB7XG4gICAgICBjb25zdCByZXQgPSB7XG4gICAgICAgIHg6IG10ICogcFswXS54ICsgdCAqIHBbMV0ueCxcbiAgICAgICAgeTogbXQgKiBwWzBdLnkgKyB0ICogcFsxXS55LFxuICAgICAgICB0OiB0LFxuICAgICAgfTtcbiAgICAgIGlmIChfM2QpIHtcbiAgICAgICAgcmV0LnogPSBtdCAqIHBbMF0ueiArIHQgKiBwWzFdLno7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmV0O1xuICAgIH1cblxuICAgIC8vIHF1YWRyYXRpYy9jdWJpYyBjdXJ2ZT9cbiAgICBpZiAob3JkZXIgPCA0KSB7XG4gICAgICBsZXQgbXQyID0gbXQgKiBtdCxcbiAgICAgICAgdDIgPSB0ICogdCxcbiAgICAgICAgYSxcbiAgICAgICAgYixcbiAgICAgICAgYyxcbiAgICAgICAgZCA9IDA7XG4gICAgICBpZiAob3JkZXIgPT09IDIpIHtcbiAgICAgICAgcCA9IFtwWzBdLCBwWzFdLCBwWzJdLCBaRVJPXTtcbiAgICAgICAgYSA9IG10MjtcbiAgICAgICAgYiA9IG10ICogdCAqIDI7XG4gICAgICAgIGMgPSB0MjtcbiAgICAgIH0gZWxzZSBpZiAob3JkZXIgPT09IDMpIHtcbiAgICAgICAgYSA9IG10MiAqIG10O1xuICAgICAgICBiID0gbXQyICogdCAqIDM7XG4gICAgICAgIGMgPSBtdCAqIHQyICogMztcbiAgICAgICAgZCA9IHQgKiB0MjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJldCA9IHtcbiAgICAgICAgeDogYSAqIHBbMF0ueCArIGIgKiBwWzFdLnggKyBjICogcFsyXS54ICsgZCAqIHBbM10ueCxcbiAgICAgICAgeTogYSAqIHBbMF0ueSArIGIgKiBwWzFdLnkgKyBjICogcFsyXS55ICsgZCAqIHBbM10ueSxcbiAgICAgICAgdDogdCxcbiAgICAgIH07XG4gICAgICBpZiAoXzNkKSB7XG4gICAgICAgIHJldC56ID0gYSAqIHBbMF0ueiArIGIgKiBwWzFdLnogKyBjICogcFsyXS56ICsgZCAqIHBbM10uejtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXQ7XG4gICAgfVxuXG4gICAgLy8gaGlnaGVyIG9yZGVyIGN1cnZlczogdXNlIGRlIENhc3RlbGphdSdzIGNvbXB1dGF0aW9uXG4gICAgY29uc3QgZENwdHMgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHBvaW50cykpO1xuICAgIHdoaWxlIChkQ3B0cy5sZW5ndGggPiAxKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRDcHRzLmxlbmd0aCAtIDE7IGkrKykge1xuICAgICAgICBkQ3B0c1tpXSA9IHtcbiAgICAgICAgICB4OiBkQ3B0c1tpXS54ICsgKGRDcHRzW2kgKyAxXS54IC0gZENwdHNbaV0ueCkgKiB0LFxuICAgICAgICAgIHk6IGRDcHRzW2ldLnkgKyAoZENwdHNbaSArIDFdLnkgLSBkQ3B0c1tpXS55KSAqIHQsXG4gICAgICAgIH07XG4gICAgICAgIGlmICh0eXBlb2YgZENwdHNbaV0ueiAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgIGRDcHRzW2ldID0gZENwdHNbaV0ueiArIChkQ3B0c1tpICsgMV0ueiAtIGRDcHRzW2ldLnopICogdDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZENwdHMuc3BsaWNlKGRDcHRzLmxlbmd0aCAtIDEsIDEpO1xuICAgIH1cbiAgICBkQ3B0c1swXS50ID0gdDtcbiAgICByZXR1cm4gZENwdHNbMF07XG4gIH0sXG5cbiAgY29tcHV0ZVdpdGhSYXRpb3M6IGZ1bmN0aW9uICh0LCBwb2ludHMsIHJhdGlvcywgXzNkKSB7XG4gICAgY29uc3QgbXQgPSAxIC0gdCxcbiAgICAgIHIgPSByYXRpb3MsXG4gICAgICBwID0gcG9pbnRzO1xuXG4gICAgbGV0IGYxID0gclswXSxcbiAgICAgIGYyID0gclsxXSxcbiAgICAgIGYzID0gclsyXSxcbiAgICAgIGY0ID0gclszXSxcbiAgICAgIGQ7XG5cbiAgICAvLyBzcGVjIGZvciBsaW5lYXJcbiAgICBmMSAqPSBtdDtcbiAgICBmMiAqPSB0O1xuXG4gICAgaWYgKHAubGVuZ3RoID09PSAyKSB7XG4gICAgICBkID0gZjEgKyBmMjtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHg6IChmMSAqIHBbMF0ueCArIGYyICogcFsxXS54KSAvIGQsXG4gICAgICAgIHk6IChmMSAqIHBbMF0ueSArIGYyICogcFsxXS55KSAvIGQsXG4gICAgICAgIHo6ICFfM2QgPyBmYWxzZSA6IChmMSAqIHBbMF0ueiArIGYyICogcFsxXS56KSAvIGQsXG4gICAgICAgIHQ6IHQsXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIHVwZ3JhZGUgdG8gcXVhZHJhdGljXG4gICAgZjEgKj0gbXQ7XG4gICAgZjIgKj0gMiAqIG10O1xuICAgIGYzICo9IHQgKiB0O1xuXG4gICAgaWYgKHAubGVuZ3RoID09PSAzKSB7XG4gICAgICBkID0gZjEgKyBmMiArIGYzO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgeDogKGYxICogcFswXS54ICsgZjIgKiBwWzFdLnggKyBmMyAqIHBbMl0ueCkgLyBkLFxuICAgICAgICB5OiAoZjEgKiBwWzBdLnkgKyBmMiAqIHBbMV0ueSArIGYzICogcFsyXS55KSAvIGQsXG4gICAgICAgIHo6ICFfM2QgPyBmYWxzZSA6IChmMSAqIHBbMF0ueiArIGYyICogcFsxXS56ICsgZjMgKiBwWzJdLnopIC8gZCxcbiAgICAgICAgdDogdCxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gdXBncmFkZSB0byBjdWJpY1xuICAgIGYxICo9IG10O1xuICAgIGYyICo9IDEuNSAqIG10O1xuICAgIGYzICo9IDMgKiBtdDtcbiAgICBmNCAqPSB0ICogdCAqIHQ7XG5cbiAgICBpZiAocC5sZW5ndGggPT09IDQpIHtcbiAgICAgIGQgPSBmMSArIGYyICsgZjMgKyBmNDtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHg6IChmMSAqIHBbMF0ueCArIGYyICogcFsxXS54ICsgZjMgKiBwWzJdLnggKyBmNCAqIHBbM10ueCkgLyBkLFxuICAgICAgICB5OiAoZjEgKiBwWzBdLnkgKyBmMiAqIHBbMV0ueSArIGYzICogcFsyXS55ICsgZjQgKiBwWzNdLnkpIC8gZCxcbiAgICAgICAgejogIV8zZFxuICAgICAgICAgID8gZmFsc2VcbiAgICAgICAgICA6IChmMSAqIHBbMF0ueiArIGYyICogcFsxXS56ICsgZjMgKiBwWzJdLnogKyBmNCAqIHBbM10ueikgLyBkLFxuICAgICAgICB0OiB0LFxuICAgICAgfTtcbiAgICB9XG4gIH0sXG5cbiAgZGVyaXZlOiBmdW5jdGlvbiAocG9pbnRzLCBfM2QpIHtcbiAgICBjb25zdCBkcG9pbnRzID0gW107XG4gICAgZm9yIChsZXQgcCA9IHBvaW50cywgZCA9IHAubGVuZ3RoLCBjID0gZCAtIDE7IGQgPiAxOyBkLS0sIGMtLSkge1xuICAgICAgY29uc3QgbGlzdCA9IFtdO1xuICAgICAgZm9yIChsZXQgaiA9IDAsIGRwdDsgaiA8IGM7IGorKykge1xuICAgICAgICBkcHQgPSB7XG4gICAgICAgICAgeDogYyAqIChwW2ogKyAxXS54IC0gcFtqXS54KSxcbiAgICAgICAgICB5OiBjICogKHBbaiArIDFdLnkgLSBwW2pdLnkpLFxuICAgICAgICB9O1xuICAgICAgICBpZiAoXzNkKSB7XG4gICAgICAgICAgZHB0LnogPSBjICogKHBbaiArIDFdLnogLSBwW2pdLnopO1xuICAgICAgICB9XG4gICAgICAgIGxpc3QucHVzaChkcHQpO1xuICAgICAgfVxuICAgICAgZHBvaW50cy5wdXNoKGxpc3QpO1xuICAgICAgcCA9IGxpc3Q7XG4gICAgfVxuICAgIHJldHVybiBkcG9pbnRzO1xuICB9LFxuXG4gIGJldHdlZW46IGZ1bmN0aW9uICh2LCBtLCBNKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIChtIDw9IHYgJiYgdiA8PSBNKSB8fFxuICAgICAgdXRpbHMuYXBwcm94aW1hdGVseSh2LCBtKSB8fFxuICAgICAgdXRpbHMuYXBwcm94aW1hdGVseSh2LCBNKVxuICAgICk7XG4gIH0sXG5cbiAgYXBwcm94aW1hdGVseTogZnVuY3Rpb24gKGEsIGIsIHByZWNpc2lvbikge1xuICAgIHJldHVybiBhYnMoYSAtIGIpIDw9IChwcmVjaXNpb24gfHwgZXBzaWxvbik7XG4gIH0sXG5cbiAgbGVuZ3RoOiBmdW5jdGlvbiAoZGVyaXZhdGl2ZUZuKSB7XG4gICAgY29uc3QgeiA9IDAuNSxcbiAgICAgIGxlbiA9IHV0aWxzLlR2YWx1ZXMubGVuZ3RoO1xuXG4gICAgbGV0IHN1bSA9IDA7XG5cbiAgICBmb3IgKGxldCBpID0gMCwgdDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICB0ID0geiAqIHV0aWxzLlR2YWx1ZXNbaV0gKyB6O1xuICAgICAgc3VtICs9IHV0aWxzLkN2YWx1ZXNbaV0gKiB1dGlscy5hcmNmbih0LCBkZXJpdmF0aXZlRm4pO1xuICAgIH1cbiAgICByZXR1cm4geiAqIHN1bTtcbiAgfSxcblxuICBtYXA6IGZ1bmN0aW9uICh2LCBkcywgZGUsIHRzLCB0ZSkge1xuICAgIGNvbnN0IGQxID0gZGUgLSBkcyxcbiAgICAgIGQyID0gdGUgLSB0cyxcbiAgICAgIHYyID0gdiAtIGRzLFxuICAgICAgciA9IHYyIC8gZDE7XG4gICAgcmV0dXJuIHRzICsgZDIgKiByO1xuICB9LFxuXG4gIGxlcnA6IGZ1bmN0aW9uIChyLCB2MSwgdjIpIHtcbiAgICBjb25zdCByZXQgPSB7XG4gICAgICB4OiB2MS54ICsgciAqICh2Mi54IC0gdjEueCksXG4gICAgICB5OiB2MS55ICsgciAqICh2Mi55IC0gdjEueSksXG4gICAgfTtcbiAgICBpZiAodjEueiAhPT0gdW5kZWZpbmVkICYmIHYyLnogIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0LnogPSB2MS56ICsgciAqICh2Mi56IC0gdjEueik7XG4gICAgfVxuICAgIHJldHVybiByZXQ7XG4gIH0sXG5cbiAgcG9pbnRUb1N0cmluZzogZnVuY3Rpb24gKHApIHtcbiAgICBsZXQgcyA9IHAueCArIFwiL1wiICsgcC55O1xuICAgIGlmICh0eXBlb2YgcC56ICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICBzICs9IFwiL1wiICsgcC56O1xuICAgIH1cbiAgICByZXR1cm4gcztcbiAgfSxcblxuICBwb2ludHNUb1N0cmluZzogZnVuY3Rpb24gKHBvaW50cykge1xuICAgIHJldHVybiBcIltcIiArIHBvaW50cy5tYXAodXRpbHMucG9pbnRUb1N0cmluZykuam9pbihcIiwgXCIpICsgXCJdXCI7XG4gIH0sXG5cbiAgY29weTogZnVuY3Rpb24gKG9iaikge1xuICAgIHJldHVybiBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KG9iaikpO1xuICB9LFxuXG4gIGFuZ2xlOiBmdW5jdGlvbiAobywgdjEsIHYyKSB7XG4gICAgY29uc3QgZHgxID0gdjEueCAtIG8ueCxcbiAgICAgIGR5MSA9IHYxLnkgLSBvLnksXG4gICAgICBkeDIgPSB2Mi54IC0gby54LFxuICAgICAgZHkyID0gdjIueSAtIG8ueSxcbiAgICAgIGNyb3NzID0gZHgxICogZHkyIC0gZHkxICogZHgyLFxuICAgICAgZG90ID0gZHgxICogZHgyICsgZHkxICogZHkyO1xuICAgIHJldHVybiBhdGFuMihjcm9zcywgZG90KTtcbiAgfSxcblxuICAvLyByb3VuZCBhcyBzdHJpbmcsIHRvIGF2b2lkIHJvdW5kaW5nIGVycm9yc1xuICByb3VuZDogZnVuY3Rpb24gKHYsIGQpIHtcbiAgICBjb25zdCBzID0gXCJcIiArIHY7XG4gICAgY29uc3QgcG9zID0gcy5pbmRleE9mKFwiLlwiKTtcbiAgICByZXR1cm4gcGFyc2VGbG9hdChzLnN1YnN0cmluZygwLCBwb3MgKyAxICsgZCkpO1xuICB9LFxuXG4gIGRpc3Q6IGZ1bmN0aW9uIChwMSwgcDIpIHtcbiAgICBjb25zdCBkeCA9IHAxLnggLSBwMi54LFxuICAgICAgZHkgPSBwMS55IC0gcDIueTtcbiAgICByZXR1cm4gc3FydChkeCAqIGR4ICsgZHkgKiBkeSk7XG4gIH0sXG5cbiAgY2xvc2VzdDogZnVuY3Rpb24gKExVVCwgcG9pbnQpIHtcbiAgICBsZXQgbWRpc3QgPSBwb3coMiwgNjMpLFxuICAgICAgbXBvcyxcbiAgICAgIGQ7XG4gICAgTFVULmZvckVhY2goZnVuY3Rpb24gKHAsIGlkeCkge1xuICAgICAgZCA9IHV0aWxzLmRpc3QocG9pbnQsIHApO1xuICAgICAgaWYgKGQgPCBtZGlzdCkge1xuICAgICAgICBtZGlzdCA9IGQ7XG4gICAgICAgIG1wb3MgPSBpZHg7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHsgbWRpc3Q6IG1kaXN0LCBtcG9zOiBtcG9zIH07XG4gIH0sXG5cbiAgYWJjcmF0aW86IGZ1bmN0aW9uICh0LCBuKSB7XG4gICAgLy8gc2VlIHJhdGlvKHQpIG5vdGUgb24gaHR0cDovL3BvbWF4LmdpdGh1Yi5pby9iZXppZXJpbmZvLyNhYmNcbiAgICBpZiAobiAhPT0gMiAmJiBuICE9PSAzKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgdCA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgdCA9IDAuNTtcbiAgICB9IGVsc2UgaWYgKHQgPT09IDAgfHwgdCA9PT0gMSkge1xuICAgICAgcmV0dXJuIHQ7XG4gICAgfVxuICAgIGNvbnN0IGJvdHRvbSA9IHBvdyh0LCBuKSArIHBvdygxIC0gdCwgbiksXG4gICAgICB0b3AgPSBib3R0b20gLSAxO1xuICAgIHJldHVybiBhYnModG9wIC8gYm90dG9tKTtcbiAgfSxcblxuICBwcm9qZWN0aW9ucmF0aW86IGZ1bmN0aW9uICh0LCBuKSB7XG4gICAgLy8gc2VlIHUodCkgbm90ZSBvbiBodHRwOi8vcG9tYXguZ2l0aHViLmlvL2JlemllcmluZm8vI2FiY1xuICAgIGlmIChuICE9PSAyICYmIG4gIT09IDMpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiB0ID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICB0ID0gMC41O1xuICAgIH0gZWxzZSBpZiAodCA9PT0gMCB8fCB0ID09PSAxKSB7XG4gICAgICByZXR1cm4gdDtcbiAgICB9XG4gICAgY29uc3QgdG9wID0gcG93KDEgLSB0LCBuKSxcbiAgICAgIGJvdHRvbSA9IHBvdyh0LCBuKSArIHRvcDtcbiAgICByZXR1cm4gdG9wIC8gYm90dG9tO1xuICB9LFxuXG4gIGxsaTg6IGZ1bmN0aW9uICh4MSwgeTEsIHgyLCB5MiwgeDMsIHkzLCB4NCwgeTQpIHtcbiAgICBjb25zdCBueCA9XG4gICAgICAgICh4MSAqIHkyIC0geTEgKiB4MikgKiAoeDMgLSB4NCkgLSAoeDEgLSB4MikgKiAoeDMgKiB5NCAtIHkzICogeDQpLFxuICAgICAgbnkgPSAoeDEgKiB5MiAtIHkxICogeDIpICogKHkzIC0geTQpIC0gKHkxIC0geTIpICogKHgzICogeTQgLSB5MyAqIHg0KSxcbiAgICAgIGQgPSAoeDEgLSB4MikgKiAoeTMgLSB5NCkgLSAoeTEgLSB5MikgKiAoeDMgLSB4NCk7XG4gICAgaWYgKGQgPT0gMCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4geyB4OiBueCAvIGQsIHk6IG55IC8gZCB9O1xuICB9LFxuXG4gIGxsaTQ6IGZ1bmN0aW9uIChwMSwgcDIsIHAzLCBwNCkge1xuICAgIGNvbnN0IHgxID0gcDEueCxcbiAgICAgIHkxID0gcDEueSxcbiAgICAgIHgyID0gcDIueCxcbiAgICAgIHkyID0gcDIueSxcbiAgICAgIHgzID0gcDMueCxcbiAgICAgIHkzID0gcDMueSxcbiAgICAgIHg0ID0gcDQueCxcbiAgICAgIHk0ID0gcDQueTtcbiAgICByZXR1cm4gdXRpbHMubGxpOCh4MSwgeTEsIHgyLCB5MiwgeDMsIHkzLCB4NCwgeTQpO1xuICB9LFxuXG4gIGxsaTogZnVuY3Rpb24gKHYxLCB2Mikge1xuICAgIHJldHVybiB1dGlscy5sbGk0KHYxLCB2MS5jLCB2MiwgdjIuYyk7XG4gIH0sXG5cbiAgbWFrZWxpbmU6IGZ1bmN0aW9uIChwMSwgcDIpIHtcbiAgICByZXR1cm4gbmV3IEJlemllcihcbiAgICAgIHAxLngsXG4gICAgICBwMS55LFxuICAgICAgKHAxLnggKyBwMi54KSAvIDIsXG4gICAgICAocDEueSArIHAyLnkpIC8gMixcbiAgICAgIHAyLngsXG4gICAgICBwMi55XG4gICAgKTtcbiAgfSxcblxuICBmaW5kYmJveDogZnVuY3Rpb24gKHNlY3Rpb25zKSB7XG4gICAgbGV0IG14ID0gbk1heCxcbiAgICAgIG15ID0gbk1heCxcbiAgICAgIE1YID0gbk1pbixcbiAgICAgIE1ZID0gbk1pbjtcbiAgICBzZWN0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uIChzKSB7XG4gICAgICBjb25zdCBiYm94ID0gcy5iYm94KCk7XG4gICAgICBpZiAobXggPiBiYm94LngubWluKSBteCA9IGJib3gueC5taW47XG4gICAgICBpZiAobXkgPiBiYm94LnkubWluKSBteSA9IGJib3gueS5taW47XG4gICAgICBpZiAoTVggPCBiYm94LngubWF4KSBNWCA9IGJib3gueC5tYXg7XG4gICAgICBpZiAoTVkgPCBiYm94LnkubWF4KSBNWSA9IGJib3gueS5tYXg7XG4gICAgfSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHg6IHsgbWluOiBteCwgbWlkOiAobXggKyBNWCkgLyAyLCBtYXg6IE1YLCBzaXplOiBNWCAtIG14IH0sXG4gICAgICB5OiB7IG1pbjogbXksIG1pZDogKG15ICsgTVkpIC8gMiwgbWF4OiBNWSwgc2l6ZTogTVkgLSBteSB9LFxuICAgIH07XG4gIH0sXG5cbiAgc2hhcGVpbnRlcnNlY3Rpb25zOiBmdW5jdGlvbiAoXG4gICAgczEsXG4gICAgYmJveDEsXG4gICAgczIsXG4gICAgYmJveDIsXG4gICAgY3VydmVJbnRlcnNlY3Rpb25UaHJlc2hvbGRcbiAgKSB7XG4gICAgaWYgKCF1dGlscy5iYm94b3ZlcmxhcChiYm94MSwgYmJveDIpKSByZXR1cm4gW107XG4gICAgY29uc3QgaW50ZXJzZWN0aW9ucyA9IFtdO1xuICAgIGNvbnN0IGExID0gW3MxLnN0YXJ0Y2FwLCBzMS5mb3J3YXJkLCBzMS5iYWNrLCBzMS5lbmRjYXBdO1xuICAgIGNvbnN0IGEyID0gW3MyLnN0YXJ0Y2FwLCBzMi5mb3J3YXJkLCBzMi5iYWNrLCBzMi5lbmRjYXBdO1xuICAgIGExLmZvckVhY2goZnVuY3Rpb24gKGwxKSB7XG4gICAgICBpZiAobDEudmlydHVhbCkgcmV0dXJuO1xuICAgICAgYTIuZm9yRWFjaChmdW5jdGlvbiAobDIpIHtcbiAgICAgICAgaWYgKGwyLnZpcnR1YWwpIHJldHVybjtcbiAgICAgICAgY29uc3QgaXNzID0gbDEuaW50ZXJzZWN0cyhsMiwgY3VydmVJbnRlcnNlY3Rpb25UaHJlc2hvbGQpO1xuICAgICAgICBpZiAoaXNzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBpc3MuYzEgPSBsMTtcbiAgICAgICAgICBpc3MuYzIgPSBsMjtcbiAgICAgICAgICBpc3MuczEgPSBzMTtcbiAgICAgICAgICBpc3MuczIgPSBzMjtcbiAgICAgICAgICBpbnRlcnNlY3Rpb25zLnB1c2goaXNzKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGludGVyc2VjdGlvbnM7XG4gIH0sXG5cbiAgbWFrZXNoYXBlOiBmdW5jdGlvbiAoZm9yd2FyZCwgYmFjaywgY3VydmVJbnRlcnNlY3Rpb25UaHJlc2hvbGQpIHtcbiAgICBjb25zdCBicGwgPSBiYWNrLnBvaW50cy5sZW5ndGg7XG4gICAgY29uc3QgZnBsID0gZm9yd2FyZC5wb2ludHMubGVuZ3RoO1xuICAgIGNvbnN0IHN0YXJ0ID0gdXRpbHMubWFrZWxpbmUoYmFjay5wb2ludHNbYnBsIC0gMV0sIGZvcndhcmQucG9pbnRzWzBdKTtcbiAgICBjb25zdCBlbmQgPSB1dGlscy5tYWtlbGluZShmb3J3YXJkLnBvaW50c1tmcGwgLSAxXSwgYmFjay5wb2ludHNbMF0pO1xuICAgIGNvbnN0IHNoYXBlID0ge1xuICAgICAgc3RhcnRjYXA6IHN0YXJ0LFxuICAgICAgZm9yd2FyZDogZm9yd2FyZCxcbiAgICAgIGJhY2s6IGJhY2ssXG4gICAgICBlbmRjYXA6IGVuZCxcbiAgICAgIGJib3g6IHV0aWxzLmZpbmRiYm94KFtzdGFydCwgZm9yd2FyZCwgYmFjaywgZW5kXSksXG4gICAgfTtcbiAgICBzaGFwZS5pbnRlcnNlY3Rpb25zID0gZnVuY3Rpb24gKHMyKSB7XG4gICAgICByZXR1cm4gdXRpbHMuc2hhcGVpbnRlcnNlY3Rpb25zKFxuICAgICAgICBzaGFwZSxcbiAgICAgICAgc2hhcGUuYmJveCxcbiAgICAgICAgczIsXG4gICAgICAgIHMyLmJib3gsXG4gICAgICAgIGN1cnZlSW50ZXJzZWN0aW9uVGhyZXNob2xkXG4gICAgICApO1xuICAgIH07XG4gICAgcmV0dXJuIHNoYXBlO1xuICB9LFxuXG4gIGdldG1pbm1heDogZnVuY3Rpb24gKGN1cnZlLCBkLCBsaXN0KSB7XG4gICAgaWYgKCFsaXN0KSByZXR1cm4geyBtaW46IDAsIG1heDogMCB9O1xuICAgIGxldCBtaW4gPSBuTWF4LFxuICAgICAgbWF4ID0gbk1pbixcbiAgICAgIHQsXG4gICAgICBjO1xuICAgIGlmIChsaXN0LmluZGV4T2YoMCkgPT09IC0xKSB7XG4gICAgICBsaXN0ID0gWzBdLmNvbmNhdChsaXN0KTtcbiAgICB9XG4gICAgaWYgKGxpc3QuaW5kZXhPZigxKSA9PT0gLTEpIHtcbiAgICAgIGxpc3QucHVzaCgxKTtcbiAgICB9XG4gICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IGxpc3QubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIHQgPSBsaXN0W2ldO1xuICAgICAgYyA9IGN1cnZlLmdldCh0KTtcbiAgICAgIGlmIChjW2RdIDwgbWluKSB7XG4gICAgICAgIG1pbiA9IGNbZF07XG4gICAgICB9XG4gICAgICBpZiAoY1tkXSA+IG1heCkge1xuICAgICAgICBtYXggPSBjW2RdO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4geyBtaW46IG1pbiwgbWlkOiAobWluICsgbWF4KSAvIDIsIG1heDogbWF4LCBzaXplOiBtYXggLSBtaW4gfTtcbiAgfSxcblxuICBhbGlnbjogZnVuY3Rpb24gKHBvaW50cywgbGluZSkge1xuICAgIGNvbnN0IHR4ID0gbGluZS5wMS54LFxuICAgICAgdHkgPSBsaW5lLnAxLnksXG4gICAgICBhID0gLWF0YW4yKGxpbmUucDIueSAtIHR5LCBsaW5lLnAyLnggLSB0eCksXG4gICAgICBkID0gZnVuY3Rpb24gKHYpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB4OiAodi54IC0gdHgpICogY29zKGEpIC0gKHYueSAtIHR5KSAqIHNpbihhKSxcbiAgICAgICAgICB5OiAodi54IC0gdHgpICogc2luKGEpICsgKHYueSAtIHR5KSAqIGNvcyhhKSxcbiAgICAgICAgfTtcbiAgICAgIH07XG4gICAgcmV0dXJuIHBvaW50cy5tYXAoZCk7XG4gIH0sXG5cbiAgcm9vdHM6IGZ1bmN0aW9uIChwb2ludHMsIGxpbmUpIHtcbiAgICBsaW5lID0gbGluZSB8fCB7IHAxOiB7IHg6IDAsIHk6IDAgfSwgcDI6IHsgeDogMSwgeTogMCB9IH07XG5cbiAgICBjb25zdCBvcmRlciA9IHBvaW50cy5sZW5ndGggLSAxO1xuICAgIGNvbnN0IGFsaWduZWQgPSB1dGlscy5hbGlnbihwb2ludHMsIGxpbmUpO1xuICAgIGNvbnN0IHJlZHVjZSA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICByZXR1cm4gMCA8PSB0ICYmIHQgPD0gMTtcbiAgICB9O1xuXG4gICAgaWYgKG9yZGVyID09PSAyKSB7XG4gICAgICBjb25zdCBhID0gYWxpZ25lZFswXS55LFxuICAgICAgICBiID0gYWxpZ25lZFsxXS55LFxuICAgICAgICBjID0gYWxpZ25lZFsyXS55LFxuICAgICAgICBkID0gYSAtIDIgKiBiICsgYztcbiAgICAgIGlmIChkICE9PSAwKSB7XG4gICAgICAgIGNvbnN0IG0xID0gLXNxcnQoYiAqIGIgLSBhICogYyksXG4gICAgICAgICAgbTIgPSAtYSArIGIsXG4gICAgICAgICAgdjEgPSAtKG0xICsgbTIpIC8gZCxcbiAgICAgICAgICB2MiA9IC0oLW0xICsgbTIpIC8gZDtcbiAgICAgICAgcmV0dXJuIFt2MSwgdjJdLmZpbHRlcihyZWR1Y2UpO1xuICAgICAgfSBlbHNlIGlmIChiICE9PSBjICYmIGQgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIFsoMiAqIGIgLSBjKSAvICgyICogYiAtIDIgKiBjKV0uZmlsdGVyKHJlZHVjZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgLy8gc2VlIGh0dHA6Ly93d3cudHJhbnM0bWluZC5jb20vcGVyc29uYWxfZGV2ZWxvcG1lbnQvbWF0aGVtYXRpY3MvcG9seW5vbWlhbHMvY3ViaWNBbGdlYnJhLmh0bVxuICAgIGNvbnN0IHBhID0gYWxpZ25lZFswXS55LFxuICAgICAgcGIgPSBhbGlnbmVkWzFdLnksXG4gICAgICBwYyA9IGFsaWduZWRbMl0ueSxcbiAgICAgIHBkID0gYWxpZ25lZFszXS55O1xuXG4gICAgbGV0IGQgPSAtcGEgKyAzICogcGIgLSAzICogcGMgKyBwZCxcbiAgICAgIGEgPSAzICogcGEgLSA2ICogcGIgKyAzICogcGMsXG4gICAgICBiID0gLTMgKiBwYSArIDMgKiBwYixcbiAgICAgIGMgPSBwYTtcblxuICAgIGlmICh1dGlscy5hcHByb3hpbWF0ZWx5KGQsIDApKSB7XG4gICAgICAvLyB0aGlzIGlzIG5vdCBhIGN1YmljIGN1cnZlLlxuICAgICAgaWYgKHV0aWxzLmFwcHJveGltYXRlbHkoYSwgMCkpIHtcbiAgICAgICAgLy8gaW4gZmFjdCwgdGhpcyBpcyBub3QgYSBxdWFkcmF0aWMgY3VydmUgZWl0aGVyLlxuICAgICAgICBpZiAodXRpbHMuYXBwcm94aW1hdGVseShiLCAwKSkge1xuICAgICAgICAgIC8vIGluIGZhY3QgaW4gZmFjdCwgdGhlcmUgYXJlIG5vIHNvbHV0aW9ucy5cbiAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cbiAgICAgICAgLy8gbGluZWFyIHNvbHV0aW9uOlxuICAgICAgICByZXR1cm4gWy1jIC8gYl0uZmlsdGVyKHJlZHVjZSk7XG4gICAgICB9XG4gICAgICAvLyBxdWFkcmF0aWMgc29sdXRpb246XG4gICAgICBjb25zdCBxID0gc3FydChiICogYiAtIDQgKiBhICogYyksXG4gICAgICAgIGEyID0gMiAqIGE7XG4gICAgICByZXR1cm4gWyhxIC0gYikgLyBhMiwgKC1iIC0gcSkgLyBhMl0uZmlsdGVyKHJlZHVjZSk7XG4gICAgfVxuXG4gICAgLy8gYXQgdGhpcyBwb2ludCwgd2Uga25vdyB3ZSBuZWVkIGEgY3ViaWMgc29sdXRpb246XG5cbiAgICBhIC89IGQ7XG4gICAgYiAvPSBkO1xuICAgIGMgLz0gZDtcblxuICAgIGNvbnN0IHAgPSAoMyAqIGIgLSBhICogYSkgLyAzLFxuICAgICAgcDMgPSBwIC8gMyxcbiAgICAgIHEgPSAoMiAqIGEgKiBhICogYSAtIDkgKiBhICogYiArIDI3ICogYykgLyAyNyxcbiAgICAgIHEyID0gcSAvIDIsXG4gICAgICBkaXNjcmltaW5hbnQgPSBxMiAqIHEyICsgcDMgKiBwMyAqIHAzO1xuXG4gICAgbGV0IHUxLCB2MSwgeDEsIHgyLCB4MztcbiAgICBpZiAoZGlzY3JpbWluYW50IDwgMCkge1xuICAgICAgY29uc3QgbXAzID0gLXAgLyAzLFxuICAgICAgICBtcDMzID0gbXAzICogbXAzICogbXAzLFxuICAgICAgICByID0gc3FydChtcDMzKSxcbiAgICAgICAgdCA9IC1xIC8gKDIgKiByKSxcbiAgICAgICAgY29zcGhpID0gdCA8IC0xID8gLTEgOiB0ID4gMSA/IDEgOiB0LFxuICAgICAgICBwaGkgPSBhY29zKGNvc3BoaSksXG4gICAgICAgIGNydHIgPSBjcnQociksXG4gICAgICAgIHQxID0gMiAqIGNydHI7XG4gICAgICB4MSA9IHQxICogY29zKHBoaSAvIDMpIC0gYSAvIDM7XG4gICAgICB4MiA9IHQxICogY29zKChwaGkgKyB0YXUpIC8gMykgLSBhIC8gMztcbiAgICAgIHgzID0gdDEgKiBjb3MoKHBoaSArIDIgKiB0YXUpIC8gMykgLSBhIC8gMztcbiAgICAgIHJldHVybiBbeDEsIHgyLCB4M10uZmlsdGVyKHJlZHVjZSk7XG4gICAgfSBlbHNlIGlmIChkaXNjcmltaW5hbnQgPT09IDApIHtcbiAgICAgIHUxID0gcTIgPCAwID8gY3J0KC1xMikgOiAtY3J0KHEyKTtcbiAgICAgIHgxID0gMiAqIHUxIC0gYSAvIDM7XG4gICAgICB4MiA9IC11MSAtIGEgLyAzO1xuICAgICAgcmV0dXJuIFt4MSwgeDJdLmZpbHRlcihyZWR1Y2UpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBzZCA9IHNxcnQoZGlzY3JpbWluYW50KTtcbiAgICAgIHUxID0gY3J0KC1xMiArIHNkKTtcbiAgICAgIHYxID0gY3J0KHEyICsgc2QpO1xuICAgICAgcmV0dXJuIFt1MSAtIHYxIC0gYSAvIDNdLmZpbHRlcihyZWR1Y2UpO1xuICAgIH1cbiAgfSxcblxuICBkcm9vdHM6IGZ1bmN0aW9uIChwKSB7XG4gICAgLy8gcXVhZHJhdGljIHJvb3RzIGFyZSBlYXN5XG4gICAgaWYgKHAubGVuZ3RoID09PSAzKSB7XG4gICAgICBjb25zdCBhID0gcFswXSxcbiAgICAgICAgYiA9IHBbMV0sXG4gICAgICAgIGMgPSBwWzJdLFxuICAgICAgICBkID0gYSAtIDIgKiBiICsgYztcbiAgICAgIGlmIChkICE9PSAwKSB7XG4gICAgICAgIGNvbnN0IG0xID0gLXNxcnQoYiAqIGIgLSBhICogYyksXG4gICAgICAgICAgbTIgPSAtYSArIGIsXG4gICAgICAgICAgdjEgPSAtKG0xICsgbTIpIC8gZCxcbiAgICAgICAgICB2MiA9IC0oLW0xICsgbTIpIC8gZDtcbiAgICAgICAgcmV0dXJuIFt2MSwgdjJdO1xuICAgICAgfSBlbHNlIGlmIChiICE9PSBjICYmIGQgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIFsoMiAqIGIgLSBjKSAvICgyICogKGIgLSBjKSldO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIC8vIGxpbmVhciByb290cyBhcmUgZXZlbiBlYXNpZXJcbiAgICBpZiAocC5sZW5ndGggPT09IDIpIHtcbiAgICAgIGNvbnN0IGEgPSBwWzBdLFxuICAgICAgICBiID0gcFsxXTtcbiAgICAgIGlmIChhICE9PSBiKSB7XG4gICAgICAgIHJldHVybiBbYSAvIChhIC0gYildO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIHJldHVybiBbXTtcbiAgfSxcblxuICBjdXJ2YXR1cmU6IGZ1bmN0aW9uICh0LCBkMSwgZDIsIF8zZCwga09ubHkpIHtcbiAgICBsZXQgbnVtLFxuICAgICAgZG5tLFxuICAgICAgYWRrLFxuICAgICAgZGssXG4gICAgICBrID0gMCxcbiAgICAgIHIgPSAwO1xuXG4gICAgLy9cbiAgICAvLyBXZSdyZSB1c2luZyB0aGUgZm9sbG93aW5nIGZvcm11bGEgZm9yIGN1cnZhdHVyZTpcbiAgICAvL1xuICAgIC8vICAgICAgICAgICAgICB4J3lcIiAtIHkneFwiXG4gICAgLy8gICBrKHQpID0gLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gICAgICAgICAgICh4J8KyICsgeSfCsileKDMvMilcbiAgICAvL1xuICAgIC8vIGZyb20gaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvUmFkaXVzX29mX2N1cnZhdHVyZSNEZWZpbml0aW9uXG4gICAgLy9cbiAgICAvLyBXaXRoIGl0IGNvcnJlc3BvbmRpbmcgM0QgY291bnRlcnBhcnQ6XG4gICAgLy9cbiAgICAvLyAgICAgICAgICBzcXJ0KCAoeSd6XCIgLSB5XCJ6JynCsiArICh6J3hcIiAtIHpcIngnKcKyICsgKHgneVwiIC0geFwieScpwrIpXG4gICAgLy8gICBrKHQpID0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgKHgnwrIgKyB5J8KyICsgeifCsileKDMvMilcbiAgICAvL1xuXG4gICAgY29uc3QgZCA9IHV0aWxzLmNvbXB1dGUodCwgZDEpO1xuICAgIGNvbnN0IGRkID0gdXRpbHMuY29tcHV0ZSh0LCBkMik7XG4gICAgY29uc3QgcWRzdW0gPSBkLnggKiBkLnggKyBkLnkgKiBkLnk7XG5cbiAgICBpZiAoXzNkKSB7XG4gICAgICBudW0gPSBzcXJ0KFxuICAgICAgICBwb3coZC55ICogZGQueiAtIGRkLnkgKiBkLnosIDIpICtcbiAgICAgICAgICBwb3coZC56ICogZGQueCAtIGRkLnogKiBkLngsIDIpICtcbiAgICAgICAgICBwb3coZC54ICogZGQueSAtIGRkLnggKiBkLnksIDIpXG4gICAgICApO1xuICAgICAgZG5tID0gcG93KHFkc3VtICsgZC56ICogZC56LCAzIC8gMik7XG4gICAgfSBlbHNlIHtcbiAgICAgIG51bSA9IGQueCAqIGRkLnkgLSBkLnkgKiBkZC54O1xuICAgICAgZG5tID0gcG93KHFkc3VtLCAzIC8gMik7XG4gICAgfVxuXG4gICAgaWYgKG51bSA9PT0gMCB8fCBkbm0gPT09IDApIHtcbiAgICAgIHJldHVybiB7IGs6IDAsIHI6IDAgfTtcbiAgICB9XG5cbiAgICBrID0gbnVtIC8gZG5tO1xuICAgIHIgPSBkbm0gLyBudW07XG5cbiAgICAvLyBXZSdyZSBhbHNvIGNvbXB1dGluZyB0aGUgZGVyaXZhdGl2ZSBvZiBrYXBwYSwgYmVjYXVzZVxuICAgIC8vIHRoZXJlIGlzIHZhbHVlIGluIGtub3dpbmcgdGhlIHJhdGUgb2YgY2hhbmdlIGZvciB0aGVcbiAgICAvLyBjdXJ2YXR1cmUgYWxvbmcgdGhlIGN1cnZlLiBBbmQgd2UncmUganVzdCBnb2luZyB0b1xuICAgIC8vIGJhbGxwYXJrIGl0IGJhc2VkIG9uIGFuIGVwc2lsb24uXG4gICAgaWYgKCFrT25seSkge1xuICAgICAgLy8gY29tcHV0ZSBrJyh0KSBiYXNlZCBvbiB0aGUgaW50ZXJ2YWwgYmVmb3JlLCBhbmQgYWZ0ZXIgaXQsXG4gICAgICAvLyB0byBhdCBsZWFzdCB0cnkgdG8gbm90IGludHJvZHVjZSBmb3J3YXJkL2JhY2t3YXJkIHBhc3MgYmlhcy5cbiAgICAgIGNvbnN0IHBrID0gdXRpbHMuY3VydmF0dXJlKHQgLSAwLjAwMSwgZDEsIGQyLCBfM2QsIHRydWUpLms7XG4gICAgICBjb25zdCBuayA9IHV0aWxzLmN1cnZhdHVyZSh0ICsgMC4wMDEsIGQxLCBkMiwgXzNkLCB0cnVlKS5rO1xuICAgICAgZGsgPSAobmsgLSBrICsgKGsgLSBwaykpIC8gMjtcbiAgICAgIGFkayA9IChhYnMobmsgLSBrKSArIGFicyhrIC0gcGspKSAvIDI7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgazogaywgcjogciwgZGs6IGRrLCBhZGs6IGFkayB9O1xuICB9LFxuXG4gIGluZmxlY3Rpb25zOiBmdW5jdGlvbiAocG9pbnRzKSB7XG4gICAgaWYgKHBvaW50cy5sZW5ndGggPCA0KSByZXR1cm4gW107XG5cbiAgICAvLyBGSVhNRTogVE9ETzogYWRkIGluIGluZmxlY3Rpb24gYWJzdHJhY3Rpb24gZm9yIHF1YXJ0aWMrIGN1cnZlcz9cblxuICAgIGNvbnN0IHAgPSB1dGlscy5hbGlnbihwb2ludHMsIHsgcDE6IHBvaW50c1swXSwgcDI6IHBvaW50cy5zbGljZSgtMSlbMF0gfSksXG4gICAgICBhID0gcFsyXS54ICogcFsxXS55LFxuICAgICAgYiA9IHBbM10ueCAqIHBbMV0ueSxcbiAgICAgIGMgPSBwWzFdLnggKiBwWzJdLnksXG4gICAgICBkID0gcFszXS54ICogcFsyXS55LFxuICAgICAgdjEgPSAxOCAqICgtMyAqIGEgKyAyICogYiArIDMgKiBjIC0gZCksXG4gICAgICB2MiA9IDE4ICogKDMgKiBhIC0gYiAtIDMgKiBjKSxcbiAgICAgIHYzID0gMTggKiAoYyAtIGEpO1xuXG4gICAgaWYgKHV0aWxzLmFwcHJveGltYXRlbHkodjEsIDApKSB7XG4gICAgICBpZiAoIXV0aWxzLmFwcHJveGltYXRlbHkodjIsIDApKSB7XG4gICAgICAgIGxldCB0ID0gLXYzIC8gdjI7XG4gICAgICAgIGlmICgwIDw9IHQgJiYgdCA8PSAxKSByZXR1cm4gW3RdO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIGNvbnN0IHRybSA9IHYyICogdjIgLSA0ICogdjEgKiB2MyxcbiAgICAgIHNxID0gTWF0aC5zcXJ0KHRybSksXG4gICAgICBkMiA9IDIgKiB2MTtcblxuICAgIGlmICh1dGlscy5hcHByb3hpbWF0ZWx5KGQyLCAwKSkgcmV0dXJuIFtdO1xuXG4gICAgcmV0dXJuIFsoc3EgLSB2MikgLyBkMiwgLSh2MiArIHNxKSAvIGQyXS5maWx0ZXIoZnVuY3Rpb24gKHIpIHtcbiAgICAgIHJldHVybiAwIDw9IHIgJiYgciA8PSAxO1xuICAgIH0pO1xuICB9LFxuXG4gIGJib3hvdmVybGFwOiBmdW5jdGlvbiAoYjEsIGIyKSB7XG4gICAgY29uc3QgZGltcyA9IFtcInhcIiwgXCJ5XCJdLFxuICAgICAgbGVuID0gZGltcy5sZW5ndGg7XG5cbiAgICBmb3IgKGxldCBpID0gMCwgZGltLCBsLCB0LCBkOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIGRpbSA9IGRpbXNbaV07XG4gICAgICBsID0gYjFbZGltXS5taWQ7XG4gICAgICB0ID0gYjJbZGltXS5taWQ7XG4gICAgICBkID0gKGIxW2RpbV0uc2l6ZSArIGIyW2RpbV0uc2l6ZSkgLyAyO1xuICAgICAgaWYgKGFicyhsIC0gdCkgPj0gZCkgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSxcblxuICBleHBhbmRib3g6IGZ1bmN0aW9uIChiYm94LCBfYmJveCkge1xuICAgIGlmIChfYmJveC54Lm1pbiA8IGJib3gueC5taW4pIHtcbiAgICAgIGJib3gueC5taW4gPSBfYmJveC54Lm1pbjtcbiAgICB9XG4gICAgaWYgKF9iYm94LnkubWluIDwgYmJveC55Lm1pbikge1xuICAgICAgYmJveC55Lm1pbiA9IF9iYm94LnkubWluO1xuICAgIH1cbiAgICBpZiAoX2Jib3gueiAmJiBfYmJveC56Lm1pbiA8IGJib3guei5taW4pIHtcbiAgICAgIGJib3guei5taW4gPSBfYmJveC56Lm1pbjtcbiAgICB9XG4gICAgaWYgKF9iYm94LngubWF4ID4gYmJveC54Lm1heCkge1xuICAgICAgYmJveC54Lm1heCA9IF9iYm94LngubWF4O1xuICAgIH1cbiAgICBpZiAoX2Jib3gueS5tYXggPiBiYm94LnkubWF4KSB7XG4gICAgICBiYm94LnkubWF4ID0gX2Jib3gueS5tYXg7XG4gICAgfVxuICAgIGlmIChfYmJveC56ICYmIF9iYm94LnoubWF4ID4gYmJveC56Lm1heCkge1xuICAgICAgYmJveC56Lm1heCA9IF9iYm94LnoubWF4O1xuICAgIH1cbiAgICBiYm94LngubWlkID0gKGJib3gueC5taW4gKyBiYm94LngubWF4KSAvIDI7XG4gICAgYmJveC55Lm1pZCA9IChiYm94LnkubWluICsgYmJveC55Lm1heCkgLyAyO1xuICAgIGlmIChiYm94LnopIHtcbiAgICAgIGJib3guei5taWQgPSAoYmJveC56Lm1pbiArIGJib3guei5tYXgpIC8gMjtcbiAgICB9XG4gICAgYmJveC54LnNpemUgPSBiYm94LngubWF4IC0gYmJveC54Lm1pbjtcbiAgICBiYm94Lnkuc2l6ZSA9IGJib3gueS5tYXggLSBiYm94LnkubWluO1xuICAgIGlmIChiYm94LnopIHtcbiAgICAgIGJib3guei5zaXplID0gYmJveC56Lm1heCAtIGJib3guei5taW47XG4gICAgfVxuICB9LFxuXG4gIHBhaXJpdGVyYXRpb246IGZ1bmN0aW9uIChjMSwgYzIsIGN1cnZlSW50ZXJzZWN0aW9uVGhyZXNob2xkKSB7XG4gICAgY29uc3QgYzFiID0gYzEuYmJveCgpLFxuICAgICAgYzJiID0gYzIuYmJveCgpLFxuICAgICAgciA9IDEwMDAwMCxcbiAgICAgIHRocmVzaG9sZCA9IGN1cnZlSW50ZXJzZWN0aW9uVGhyZXNob2xkIHx8IDAuNTtcblxuICAgIGlmIChcbiAgICAgIGMxYi54LnNpemUgKyBjMWIueS5zaXplIDwgdGhyZXNob2xkICYmXG4gICAgICBjMmIueC5zaXplICsgYzJiLnkuc2l6ZSA8IHRocmVzaG9sZFxuICAgICkge1xuICAgICAgcmV0dXJuIFtcbiAgICAgICAgKCgociAqIChjMS5fdDEgKyBjMS5fdDIpKSAvIDIpIHwgMCkgLyByICtcbiAgICAgICAgICBcIi9cIiArXG4gICAgICAgICAgKCgociAqIChjMi5fdDEgKyBjMi5fdDIpKSAvIDIpIHwgMCkgLyByLFxuICAgICAgXTtcbiAgICB9XG5cbiAgICBsZXQgY2MxID0gYzEuc3BsaXQoMC41KSxcbiAgICAgIGNjMiA9IGMyLnNwbGl0KDAuNSksXG4gICAgICBwYWlycyA9IFtcbiAgICAgICAgeyBsZWZ0OiBjYzEubGVmdCwgcmlnaHQ6IGNjMi5sZWZ0IH0sXG4gICAgICAgIHsgbGVmdDogY2MxLmxlZnQsIHJpZ2h0OiBjYzIucmlnaHQgfSxcbiAgICAgICAgeyBsZWZ0OiBjYzEucmlnaHQsIHJpZ2h0OiBjYzIucmlnaHQgfSxcbiAgICAgICAgeyBsZWZ0OiBjYzEucmlnaHQsIHJpZ2h0OiBjYzIubGVmdCB9LFxuICAgICAgXTtcblxuICAgIHBhaXJzID0gcGFpcnMuZmlsdGVyKGZ1bmN0aW9uIChwYWlyKSB7XG4gICAgICByZXR1cm4gdXRpbHMuYmJveG92ZXJsYXAocGFpci5sZWZ0LmJib3goKSwgcGFpci5yaWdodC5iYm94KCkpO1xuICAgIH0pO1xuXG4gICAgbGV0IHJlc3VsdHMgPSBbXTtcblxuICAgIGlmIChwYWlycy5sZW5ndGggPT09IDApIHJldHVybiByZXN1bHRzO1xuXG4gICAgcGFpcnMuZm9yRWFjaChmdW5jdGlvbiAocGFpcikge1xuICAgICAgcmVzdWx0cyA9IHJlc3VsdHMuY29uY2F0KFxuICAgICAgICB1dGlscy5wYWlyaXRlcmF0aW9uKHBhaXIubGVmdCwgcGFpci5yaWdodCwgdGhyZXNob2xkKVxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIHJlc3VsdHMgPSByZXN1bHRzLmZpbHRlcihmdW5jdGlvbiAodiwgaSkge1xuICAgICAgcmV0dXJuIHJlc3VsdHMuaW5kZXhPZih2KSA9PT0gaTtcbiAgICB9KTtcblxuICAgIHJldHVybiByZXN1bHRzO1xuICB9LFxuXG4gIGdldGNjZW50ZXI6IGZ1bmN0aW9uIChwMSwgcDIsIHAzKSB7XG4gICAgY29uc3QgZHgxID0gcDIueCAtIHAxLngsXG4gICAgICBkeTEgPSBwMi55IC0gcDEueSxcbiAgICAgIGR4MiA9IHAzLnggLSBwMi54LFxuICAgICAgZHkyID0gcDMueSAtIHAyLnksXG4gICAgICBkeDFwID0gZHgxICogY29zKHF1YXJ0KSAtIGR5MSAqIHNpbihxdWFydCksXG4gICAgICBkeTFwID0gZHgxICogc2luKHF1YXJ0KSArIGR5MSAqIGNvcyhxdWFydCksXG4gICAgICBkeDJwID0gZHgyICogY29zKHF1YXJ0KSAtIGR5MiAqIHNpbihxdWFydCksXG4gICAgICBkeTJwID0gZHgyICogc2luKHF1YXJ0KSArIGR5MiAqIGNvcyhxdWFydCksXG4gICAgICAvLyBjaG9yZCBtaWRwb2ludHNcbiAgICAgIG14MSA9IChwMS54ICsgcDIueCkgLyAyLFxuICAgICAgbXkxID0gKHAxLnkgKyBwMi55KSAvIDIsXG4gICAgICBteDIgPSAocDIueCArIHAzLngpIC8gMixcbiAgICAgIG15MiA9IChwMi55ICsgcDMueSkgLyAyLFxuICAgICAgLy8gbWlkcG9pbnQgb2Zmc2V0c1xuICAgICAgbXgxbiA9IG14MSArIGR4MXAsXG4gICAgICBteTFuID0gbXkxICsgZHkxcCxcbiAgICAgIG14Mm4gPSBteDIgKyBkeDJwLFxuICAgICAgbXkybiA9IG15MiArIGR5MnAsXG4gICAgICAvLyBpbnRlcnNlY3Rpb24gb2YgdGhlc2UgbGluZXM6XG4gICAgICBhcmMgPSB1dGlscy5sbGk4KG14MSwgbXkxLCBteDFuLCBteTFuLCBteDIsIG15MiwgbXgybiwgbXkybiksXG4gICAgICByID0gdXRpbHMuZGlzdChhcmMsIHAxKTtcblxuICAgIC8vIGFyYyBzdGFydC9lbmQgdmFsdWVzLCBvdmVyIG1pZCBwb2ludDpcbiAgICBsZXQgcyA9IGF0YW4yKHAxLnkgLSBhcmMueSwgcDEueCAtIGFyYy54KSxcbiAgICAgIG0gPSBhdGFuMihwMi55IC0gYXJjLnksIHAyLnggLSBhcmMueCksXG4gICAgICBlID0gYXRhbjIocDMueSAtIGFyYy55LCBwMy54IC0gYXJjLngpLFxuICAgICAgXztcblxuICAgIC8vIGRldGVybWluZSBhcmMgZGlyZWN0aW9uIChjdy9jY3cgY29ycmVjdGlvbilcbiAgICBpZiAocyA8IGUpIHtcbiAgICAgIC8vIGlmIHM8bTxlLCBhcmMocywgZSlcbiAgICAgIC8vIGlmIG08czxlLCBhcmMoZSwgcyArIHRhdSlcbiAgICAgIC8vIGlmIHM8ZTxtLCBhcmMoZSwgcyArIHRhdSlcbiAgICAgIGlmIChzID4gbSB8fCBtID4gZSkge1xuICAgICAgICBzICs9IHRhdTtcbiAgICAgIH1cbiAgICAgIGlmIChzID4gZSkge1xuICAgICAgICBfID0gZTtcbiAgICAgICAgZSA9IHM7XG4gICAgICAgIHMgPSBfO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBpZiBlPG08cywgYXJjKGUsIHMpXG4gICAgICAvLyBpZiBtPGU8cywgYXJjKHMsIGUgKyB0YXUpXG4gICAgICAvLyBpZiBlPHM8bSwgYXJjKHMsIGUgKyB0YXUpXG4gICAgICBpZiAoZSA8IG0gJiYgbSA8IHMpIHtcbiAgICAgICAgXyA9IGU7XG4gICAgICAgIGUgPSBzO1xuICAgICAgICBzID0gXztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGUgKz0gdGF1O1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBhc3NpZ24gYW5kIGRvbmUuXG4gICAgYXJjLnMgPSBzO1xuICAgIGFyYy5lID0gZTtcbiAgICBhcmMuciA9IHI7XG4gICAgcmV0dXJuIGFyYztcbiAgfSxcblxuICBudW1iZXJTb3J0OiBmdW5jdGlvbiAoYSwgYikge1xuICAgIHJldHVybiBhIC0gYjtcbiAgfSxcbn07XG5cbi8qKlxuICogUG9seSBCZXppZXJcbiAqIEBwYXJhbSB7W3R5cGVdfSBjdXJ2ZXMgW2Rlc2NyaXB0aW9uXVxuICovXG5jbGFzcyBQb2x5QmV6aWVyIHtcbiAgY29uc3RydWN0b3IoY3VydmVzKSB7XG4gICAgdGhpcy5jdXJ2ZXMgPSBbXTtcbiAgICB0aGlzLl8zZCA9IGZhbHNlO1xuICAgIGlmICghIWN1cnZlcykge1xuICAgICAgdGhpcy5jdXJ2ZXMgPSBjdXJ2ZXM7XG4gICAgICB0aGlzLl8zZCA9IHRoaXMuY3VydmVzWzBdLl8zZDtcbiAgICB9XG4gIH1cblxuICB2YWx1ZU9mKCkge1xuICAgIHJldHVybiB0aGlzLnRvU3RyaW5nKCk7XG4gIH1cblxuICB0b1N0cmluZygpIHtcbiAgICByZXR1cm4gKFxuICAgICAgXCJbXCIgK1xuICAgICAgdGhpcy5jdXJ2ZXNcbiAgICAgICAgLm1hcChmdW5jdGlvbiAoY3VydmUpIHtcbiAgICAgICAgICByZXR1cm4gdXRpbHMucG9pbnRzVG9TdHJpbmcoY3VydmUucG9pbnRzKTtcbiAgICAgICAgfSlcbiAgICAgICAgLmpvaW4oXCIsIFwiKSArXG4gICAgICBcIl1cIlxuICAgICk7XG4gIH1cblxuICBhZGRDdXJ2ZShjdXJ2ZSkge1xuICAgIHRoaXMuY3VydmVzLnB1c2goY3VydmUpO1xuICAgIHRoaXMuXzNkID0gdGhpcy5fM2QgfHwgY3VydmUuXzNkO1xuICB9XG5cbiAgbGVuZ3RoKCkge1xuICAgIHJldHVybiB0aGlzLmN1cnZlc1xuICAgICAgLm1hcChmdW5jdGlvbiAodikge1xuICAgICAgICByZXR1cm4gdi5sZW5ndGgoKTtcbiAgICAgIH0pXG4gICAgICAucmVkdWNlKGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICAgIHJldHVybiBhICsgYjtcbiAgICAgIH0pO1xuICB9XG5cbiAgY3VydmUoaWR4KSB7XG4gICAgcmV0dXJuIHRoaXMuY3VydmVzW2lkeF07XG4gIH1cblxuICBiYm94KCkge1xuICAgIGNvbnN0IGMgPSB0aGlzLmN1cnZlcztcbiAgICB2YXIgYmJveCA9IGNbMF0uYmJveCgpO1xuICAgIGZvciAodmFyIGkgPSAxOyBpIDwgYy5sZW5ndGg7IGkrKykge1xuICAgICAgdXRpbHMuZXhwYW5kYm94KGJib3gsIGNbaV0uYmJveCgpKTtcbiAgICB9XG4gICAgcmV0dXJuIGJib3g7XG4gIH1cblxuICBvZmZzZXQoZCkge1xuICAgIGNvbnN0IG9mZnNldCA9IFtdO1xuICAgIHRoaXMuY3VydmVzLmZvckVhY2goZnVuY3Rpb24gKHYpIHtcbiAgICAgIG9mZnNldC5wdXNoKC4uLnYub2Zmc2V0KGQpKTtcbiAgICB9KTtcbiAgICByZXR1cm4gbmV3IFBvbHlCZXppZXIob2Zmc2V0KTtcbiAgfVxufVxuXG4vKipcbiAgQSBqYXZhc2NyaXB0IEJlemllciBjdXJ2ZSBsaWJyYXJ5IGJ5IFBvbWF4LlxuXG4gIEJhc2VkIG9uIGh0dHA6Ly9wb21heC5naXRodWIuaW8vYmV6aWVyaW5mb1xuXG4gIFRoaXMgY29kZSBpcyBNSVQgbGljZW5zZWQuXG4qKi9cblxuLy8gbWF0aC1pbmxpbmluZy5cbmNvbnN0IHsgYWJzOiBhYnMkMSwgbWluLCBtYXgsIGNvczogY29zJDEsIHNpbjogc2luJDEsIGFjb3M6IGFjb3MkMSwgc3FydDogc3FydCQxIH0gPSBNYXRoO1xuY29uc3QgcGkkMSA9IE1hdGguUEk7XG5cbi8qKlxuICogQmV6aWVyIGN1cnZlIGNvbnN0cnVjdG9yLlxuICpcbiAqIC4uLmRvY3MgcGVuZGluZy4uLlxuICovXG5jbGFzcyBCZXppZXIge1xuICBjb25zdHJ1Y3Rvcihjb29yZHMpIHtcbiAgICBsZXQgYXJncyA9XG4gICAgICBjb29yZHMgJiYgY29vcmRzLmZvckVhY2ggPyBjb29yZHMgOiBBcnJheS5mcm9tKGFyZ3VtZW50cykuc2xpY2UoKTtcbiAgICBsZXQgY29vcmRsZW4gPSBmYWxzZTtcblxuICAgIGlmICh0eXBlb2YgYXJnc1swXSA9PT0gXCJvYmplY3RcIikge1xuICAgICAgY29vcmRsZW4gPSBhcmdzLmxlbmd0aDtcbiAgICAgIGNvbnN0IG5ld2FyZ3MgPSBbXTtcbiAgICAgIGFyZ3MuZm9yRWFjaChmdW5jdGlvbiAocG9pbnQpIHtcbiAgICAgICAgW1wieFwiLCBcInlcIiwgXCJ6XCJdLmZvckVhY2goZnVuY3Rpb24gKGQpIHtcbiAgICAgICAgICBpZiAodHlwZW9mIHBvaW50W2RdICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICBuZXdhcmdzLnB1c2gocG9pbnRbZF0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICAgIGFyZ3MgPSBuZXdhcmdzO1xuICAgIH1cblxuICAgIGxldCBoaWdoZXIgPSBmYWxzZTtcbiAgICBjb25zdCBsZW4gPSBhcmdzLmxlbmd0aDtcblxuICAgIGlmIChjb29yZGxlbikge1xuICAgICAgaWYgKGNvb3JkbGVuID4gNCkge1xuICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCAhPT0gMSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIFwiT25seSBuZXcgQmV6aWVyKHBvaW50W10pIGlzIGFjY2VwdGVkIGZvciA0dGggYW5kIGhpZ2hlciBvcmRlciBjdXJ2ZXNcIlxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgaGlnaGVyID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGxlbiAhPT0gNiAmJiBsZW4gIT09IDggJiYgbGVuICE9PSA5ICYmIGxlbiAhPT0gMTIpIHtcbiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggIT09IDEpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBcIk9ubHkgbmV3IEJlemllcihwb2ludFtdKSBpcyBhY2NlcHRlZCBmb3IgNHRoIGFuZCBoaWdoZXIgb3JkZXIgY3VydmVzXCJcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgXzNkID0gKHRoaXMuXzNkID1cbiAgICAgICghaGlnaGVyICYmIChsZW4gPT09IDkgfHwgbGVuID09PSAxMikpIHx8XG4gICAgICAoY29vcmRzICYmIGNvb3Jkc1swXSAmJiB0eXBlb2YgY29vcmRzWzBdLnogIT09IFwidW5kZWZpbmVkXCIpKTtcblxuICAgIGNvbnN0IHBvaW50cyA9ICh0aGlzLnBvaW50cyA9IFtdKTtcbiAgICBmb3IgKGxldCBpZHggPSAwLCBzdGVwID0gXzNkID8gMyA6IDI7IGlkeCA8IGxlbjsgaWR4ICs9IHN0ZXApIHtcbiAgICAgIHZhciBwb2ludCA9IHtcbiAgICAgICAgeDogYXJnc1tpZHhdLFxuICAgICAgICB5OiBhcmdzW2lkeCArIDFdLFxuICAgICAgfTtcbiAgICAgIGlmIChfM2QpIHtcbiAgICAgICAgcG9pbnQueiA9IGFyZ3NbaWR4ICsgMl07XG4gICAgICB9XG4gICAgICBwb2ludHMucHVzaChwb2ludCk7XG4gICAgfVxuICAgIGNvbnN0IG9yZGVyID0gKHRoaXMub3JkZXIgPSBwb2ludHMubGVuZ3RoIC0gMSk7XG5cbiAgICBjb25zdCBkaW1zID0gKHRoaXMuZGltcyA9IFtcInhcIiwgXCJ5XCJdKTtcbiAgICBpZiAoXzNkKSBkaW1zLnB1c2goXCJ6XCIpO1xuICAgIHRoaXMuZGltbGVuID0gZGltcy5sZW5ndGg7XG5cbiAgICAvLyBpcyB0aGlzIGN1cnZlLCBwcmFjdGljYWxseSBzcGVha2luZywgYSBzdHJhaWdodCBsaW5lP1xuICAgIGNvbnN0IGFsaWduZWQgPSB1dGlscy5hbGlnbihwb2ludHMsIHsgcDE6IHBvaW50c1swXSwgcDI6IHBvaW50c1tvcmRlcl0gfSk7XG4gICAgY29uc3QgYmFzZWxlbmd0aCA9IHV0aWxzLmRpc3QocG9pbnRzWzBdLCBwb2ludHNbb3JkZXJdKTtcbiAgICB0aGlzLl9saW5lYXIgPSBhbGlnbmVkLnJlZHVjZSgodCwgcCkgPT4gdCArIGFicyQxKHAueSksIDApIDwgYmFzZWxlbmd0aCAvIDUwO1xuXG4gICAgdGhpcy5fbHV0ID0gW107XG5cbiAgICB0aGlzLl90MSA9IDA7XG4gICAgdGhpcy5fdDIgPSAxO1xuICAgIHRoaXMudXBkYXRlKCk7XG4gIH1cblxuICBzdGF0aWMgcXVhZHJhdGljRnJvbVBvaW50cyhwMSwgcDIsIHAzLCB0KSB7XG4gICAgaWYgKHR5cGVvZiB0ID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICB0ID0gMC41O1xuICAgIH1cbiAgICAvLyBzaG9ydGN1dHMsIGFsdGhvdWdoIHRoZXkncmUgcmVhbGx5IGR1bWJcbiAgICBpZiAodCA9PT0gMCkge1xuICAgICAgcmV0dXJuIG5ldyBCZXppZXIocDIsIHAyLCBwMyk7XG4gICAgfVxuICAgIGlmICh0ID09PSAxKSB7XG4gICAgICByZXR1cm4gbmV3IEJlemllcihwMSwgcDIsIHAyKTtcbiAgICB9XG4gICAgLy8gcmVhbCBmaXR0aW5nLlxuICAgIGNvbnN0IGFiYyA9IEJlemllci5nZXRBQkMoMiwgcDEsIHAyLCBwMywgdCk7XG4gICAgcmV0dXJuIG5ldyBCZXppZXIocDEsIGFiYy5BLCBwMyk7XG4gIH1cblxuICBzdGF0aWMgY3ViaWNGcm9tUG9pbnRzKFMsIEIsIEUsIHQsIGQxKSB7XG4gICAgaWYgKHR5cGVvZiB0ID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICB0ID0gMC41O1xuICAgIH1cbiAgICBjb25zdCBhYmMgPSBCZXppZXIuZ2V0QUJDKDMsIFMsIEIsIEUsIHQpO1xuICAgIGlmICh0eXBlb2YgZDEgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgIGQxID0gdXRpbHMuZGlzdChCLCBhYmMuQyk7XG4gICAgfVxuICAgIGNvbnN0IGQyID0gKGQxICogKDEgLSB0KSkgLyB0O1xuXG4gICAgY29uc3Qgc2VsZW4gPSB1dGlscy5kaXN0KFMsIEUpLFxuICAgICAgbHggPSAoRS54IC0gUy54KSAvIHNlbGVuLFxuICAgICAgbHkgPSAoRS55IC0gUy55KSAvIHNlbGVuLFxuICAgICAgYngxID0gZDEgKiBseCxcbiAgICAgIGJ5MSA9IGQxICogbHksXG4gICAgICBieDIgPSBkMiAqIGx4LFxuICAgICAgYnkyID0gZDIgKiBseTtcbiAgICAvLyBkZXJpdmF0aW9uIG9mIG5ldyBodWxsIGNvb3JkaW5hdGVzXG4gICAgY29uc3QgZTEgPSB7IHg6IEIueCAtIGJ4MSwgeTogQi55IC0gYnkxIH0sXG4gICAgICBlMiA9IHsgeDogQi54ICsgYngyLCB5OiBCLnkgKyBieTIgfSxcbiAgICAgIEEgPSBhYmMuQSxcbiAgICAgIHYxID0geyB4OiBBLnggKyAoZTEueCAtIEEueCkgLyAoMSAtIHQpLCB5OiBBLnkgKyAoZTEueSAtIEEueSkgLyAoMSAtIHQpIH0sXG4gICAgICB2MiA9IHsgeDogQS54ICsgKGUyLnggLSBBLngpIC8gdCwgeTogQS55ICsgKGUyLnkgLSBBLnkpIC8gdCB9LFxuICAgICAgbmMxID0geyB4OiBTLnggKyAodjEueCAtIFMueCkgLyB0LCB5OiBTLnkgKyAodjEueSAtIFMueSkgLyB0IH0sXG4gICAgICBuYzIgPSB7XG4gICAgICAgIHg6IEUueCArICh2Mi54IC0gRS54KSAvICgxIC0gdCksXG4gICAgICAgIHk6IEUueSArICh2Mi55IC0gRS55KSAvICgxIC0gdCksXG4gICAgICB9O1xuICAgIC8vIC4uLmRvbmVcbiAgICByZXR1cm4gbmV3IEJlemllcihTLCBuYzEsIG5jMiwgRSk7XG4gIH1cblxuICBzdGF0aWMgZ2V0VXRpbHMoKSB7XG4gICAgcmV0dXJuIHV0aWxzO1xuICB9XG5cbiAgZ2V0VXRpbHMoKSB7XG4gICAgcmV0dXJuIEJlemllci5nZXRVdGlscygpO1xuICB9XG5cbiAgc3RhdGljIGdldCBQb2x5QmV6aWVyKCkge1xuICAgIHJldHVybiBQb2x5QmV6aWVyO1xuICB9XG5cbiAgdmFsdWVPZigpIHtcbiAgICByZXR1cm4gdGhpcy50b1N0cmluZygpO1xuICB9XG5cbiAgdG9TdHJpbmcoKSB7XG4gICAgcmV0dXJuIHV0aWxzLnBvaW50c1RvU3RyaW5nKHRoaXMucG9pbnRzKTtcbiAgfVxuXG4gIHRvU1ZHKCkge1xuICAgIGlmICh0aGlzLl8zZCkgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IHAgPSB0aGlzLnBvaW50cyxcbiAgICAgIHggPSBwWzBdLngsXG4gICAgICB5ID0gcFswXS55LFxuICAgICAgcyA9IFtcIk1cIiwgeCwgeSwgdGhpcy5vcmRlciA9PT0gMiA/IFwiUVwiIDogXCJDXCJdO1xuICAgIGZvciAobGV0IGkgPSAxLCBsYXN0ID0gcC5sZW5ndGg7IGkgPCBsYXN0OyBpKyspIHtcbiAgICAgIHMucHVzaChwW2ldLngpO1xuICAgICAgcy5wdXNoKHBbaV0ueSk7XG4gICAgfVxuICAgIHJldHVybiBzLmpvaW4oXCIgXCIpO1xuICB9XG5cbiAgc2V0UmF0aW9zKHJhdGlvcykge1xuICAgIGlmIChyYXRpb3MubGVuZ3RoICE9PSB0aGlzLnBvaW50cy5sZW5ndGgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcImluY29ycmVjdCBudW1iZXIgb2YgcmF0aW8gdmFsdWVzXCIpO1xuICAgIH1cbiAgICB0aGlzLnJhdGlvcyA9IHJhdGlvcztcbiAgICB0aGlzLl9sdXQgPSBbXTsgLy8gIGludmFsaWRhdGUgYW55IHByZWNvbXB1dGVkIExVVFxuICB9XG5cbiAgdmVyaWZ5KCkge1xuICAgIGNvbnN0IHByaW50ID0gdGhpcy5jb29yZERpZ2VzdCgpO1xuICAgIGlmIChwcmludCAhPT0gdGhpcy5fcHJpbnQpIHtcbiAgICAgIHRoaXMuX3ByaW50ID0gcHJpbnQ7XG4gICAgICB0aGlzLnVwZGF0ZSgpO1xuICAgIH1cbiAgfVxuXG4gIGNvb3JkRGlnZXN0KCkge1xuICAgIHJldHVybiB0aGlzLnBvaW50c1xuICAgICAgLm1hcChmdW5jdGlvbiAoYywgcG9zKSB7XG4gICAgICAgIHJldHVybiBcIlwiICsgcG9zICsgYy54ICsgYy55ICsgKGMueiA/IGMueiA6IDApO1xuICAgICAgfSlcbiAgICAgIC5qb2luKFwiXCIpO1xuICB9XG5cbiAgdXBkYXRlKCkge1xuICAgIC8vIGludmFsaWRhdGUgYW55IHByZWNvbXB1dGVkIExVVFxuICAgIHRoaXMuX2x1dCA9IFtdO1xuICAgIHRoaXMuZHBvaW50cyA9IHV0aWxzLmRlcml2ZSh0aGlzLnBvaW50cywgdGhpcy5fM2QpO1xuICAgIHRoaXMuY29tcHV0ZWRpcmVjdGlvbigpO1xuICB9XG5cbiAgY29tcHV0ZWRpcmVjdGlvbigpIHtcbiAgICBjb25zdCBwb2ludHMgPSB0aGlzLnBvaW50cztcbiAgICBjb25zdCBhbmdsZSA9IHV0aWxzLmFuZ2xlKHBvaW50c1swXSwgcG9pbnRzW3RoaXMub3JkZXJdLCBwb2ludHNbMV0pO1xuICAgIHRoaXMuY2xvY2t3aXNlID0gYW5nbGUgPiAwO1xuICB9XG5cbiAgbGVuZ3RoKCkge1xuICAgIHJldHVybiB1dGlscy5sZW5ndGgodGhpcy5kZXJpdmF0aXZlLmJpbmQodGhpcykpO1xuICB9XG5cbiAgc3RhdGljIGdldEFCQyhvcmRlciA9IDIsIFMsIEIsIEUsIHQgPSAwLjUpIHtcbiAgICBjb25zdCB1ID0gdXRpbHMucHJvamVjdGlvbnJhdGlvKHQsIG9yZGVyKSxcbiAgICAgIHVtID0gMSAtIHUsXG4gICAgICBDID0ge1xuICAgICAgICB4OiB1ICogUy54ICsgdW0gKiBFLngsXG4gICAgICAgIHk6IHUgKiBTLnkgKyB1bSAqIEUueSxcbiAgICAgIH0sXG4gICAgICBzID0gdXRpbHMuYWJjcmF0aW8odCwgb3JkZXIpLFxuICAgICAgQSA9IHtcbiAgICAgICAgeDogQi54ICsgKEIueCAtIEMueCkgLyBzLFxuICAgICAgICB5OiBCLnkgKyAoQi55IC0gQy55KSAvIHMsXG4gICAgICB9O1xuICAgIHJldHVybiB7IEEsIEIsIEMsIFMsIEUgfTtcbiAgfVxuXG4gIGdldEFCQyh0LCBCKSB7XG4gICAgQiA9IEIgfHwgdGhpcy5nZXQodCk7XG4gICAgbGV0IFMgPSB0aGlzLnBvaW50c1swXTtcbiAgICBsZXQgRSA9IHRoaXMucG9pbnRzW3RoaXMub3JkZXJdO1xuICAgIHJldHVybiBCZXppZXIuZ2V0QUJDKHRoaXMub3JkZXIsIFMsIEIsIEUsIHQpO1xuICB9XG5cbiAgZ2V0TFVUKHN0ZXBzKSB7XG4gICAgdGhpcy52ZXJpZnkoKTtcbiAgICBzdGVwcyA9IHN0ZXBzIHx8IDEwMDtcbiAgICBpZiAodGhpcy5fbHV0Lmxlbmd0aCA9PT0gc3RlcHMpIHtcbiAgICAgIHJldHVybiB0aGlzLl9sdXQ7XG4gICAgfVxuICAgIHRoaXMuX2x1dCA9IFtdO1xuICAgIC8vIG4gc3RlcHMgbWVhbnMgbisxIHBvaW50c1xuICAgIHN0ZXBzKys7XG4gICAgdGhpcy5fbHV0ID0gW107XG4gICAgZm9yIChsZXQgaSA9IDAsIHAsIHQ7IGkgPCBzdGVwczsgaSsrKSB7XG4gICAgICB0ID0gaSAvIChzdGVwcyAtIDEpO1xuICAgICAgcCA9IHRoaXMuY29tcHV0ZSh0KTtcbiAgICAgIHAudCA9IHQ7XG4gICAgICB0aGlzLl9sdXQucHVzaChwKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2x1dDtcbiAgfVxuXG4gIG9uKHBvaW50LCBlcnJvcikge1xuICAgIGVycm9yID0gZXJyb3IgfHwgNTtcbiAgICBjb25zdCBsdXQgPSB0aGlzLmdldExVVCgpLFxuICAgICAgaGl0cyA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwLCBjLCB0ID0gMDsgaSA8IGx1dC5sZW5ndGg7IGkrKykge1xuICAgICAgYyA9IGx1dFtpXTtcbiAgICAgIGlmICh1dGlscy5kaXN0KGMsIHBvaW50KSA8IGVycm9yKSB7XG4gICAgICAgIGhpdHMucHVzaChjKTtcbiAgICAgICAgdCArPSBpIC8gbHV0Lmxlbmd0aDtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCFoaXRzLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiAodCAvPSBoaXRzLmxlbmd0aCk7XG4gIH1cblxuICBwcm9qZWN0KHBvaW50KSB7XG4gICAgLy8gc3RlcCAxOiBjb2Fyc2UgY2hlY2tcbiAgICBjb25zdCBMVVQgPSB0aGlzLmdldExVVCgpLFxuICAgICAgbCA9IExVVC5sZW5ndGggLSAxLFxuICAgICAgY2xvc2VzdCA9IHV0aWxzLmNsb3Nlc3QoTFVULCBwb2ludCksXG4gICAgICBtcG9zID0gY2xvc2VzdC5tcG9zLFxuICAgICAgdDEgPSAobXBvcyAtIDEpIC8gbCxcbiAgICAgIHQyID0gKG1wb3MgKyAxKSAvIGwsXG4gICAgICBzdGVwID0gMC4xIC8gbDtcblxuICAgIC8vIHN0ZXAgMjogZmluZSBjaGVja1xuICAgIGxldCBtZGlzdCA9IGNsb3Nlc3QubWRpc3QsXG4gICAgICB0ID0gdDEsXG4gICAgICBmdCA9IHQsXG4gICAgICBwO1xuICAgIG1kaXN0ICs9IDE7XG4gICAgZm9yIChsZXQgZDsgdCA8IHQyICsgc3RlcDsgdCArPSBzdGVwKSB7XG4gICAgICBwID0gdGhpcy5jb21wdXRlKHQpO1xuICAgICAgZCA9IHV0aWxzLmRpc3QocG9pbnQsIHApO1xuICAgICAgaWYgKGQgPCBtZGlzdCkge1xuICAgICAgICBtZGlzdCA9IGQ7XG4gICAgICAgIGZ0ID0gdDtcbiAgICAgIH1cbiAgICB9XG4gICAgZnQgPSBmdCA8IDAgPyAwIDogZnQgPiAxID8gMSA6IGZ0O1xuICAgIHAgPSB0aGlzLmNvbXB1dGUoZnQpO1xuICAgIHAudCA9IGZ0O1xuICAgIHAuZCA9IG1kaXN0O1xuICAgIHJldHVybiBwO1xuICB9XG5cbiAgZ2V0KHQpIHtcbiAgICByZXR1cm4gdGhpcy5jb21wdXRlKHQpO1xuICB9XG5cbiAgcG9pbnQoaWR4KSB7XG4gICAgcmV0dXJuIHRoaXMucG9pbnRzW2lkeF07XG4gIH1cblxuICBjb21wdXRlKHQpIHtcbiAgICBpZiAodGhpcy5yYXRpb3MpIHtcbiAgICAgIHJldHVybiB1dGlscy5jb21wdXRlV2l0aFJhdGlvcyh0LCB0aGlzLnBvaW50cywgdGhpcy5yYXRpb3MsIHRoaXMuXzNkKTtcbiAgICB9XG4gICAgcmV0dXJuIHV0aWxzLmNvbXB1dGUodCwgdGhpcy5wb2ludHMsIHRoaXMuXzNkLCB0aGlzLnJhdGlvcyk7XG4gIH1cblxuICByYWlzZSgpIHtcbiAgICBjb25zdCBwID0gdGhpcy5wb2ludHMsXG4gICAgICBucCA9IFtwWzBdXSxcbiAgICAgIGsgPSBwLmxlbmd0aDtcbiAgICBmb3IgKGxldCBpID0gMSwgcGksIHBpbTsgaSA8IGs7IGkrKykge1xuICAgICAgcGkgPSBwW2ldO1xuICAgICAgcGltID0gcFtpIC0gMV07XG4gICAgICBucFtpXSA9IHtcbiAgICAgICAgeDogKChrIC0gaSkgLyBrKSAqIHBpLnggKyAoaSAvIGspICogcGltLngsXG4gICAgICAgIHk6ICgoayAtIGkpIC8gaykgKiBwaS55ICsgKGkgLyBrKSAqIHBpbS55LFxuICAgICAgfTtcbiAgICB9XG4gICAgbnBba10gPSBwW2sgLSAxXTtcbiAgICByZXR1cm4gbmV3IEJlemllcihucCk7XG4gIH1cblxuICBkZXJpdmF0aXZlKHQpIHtcbiAgICByZXR1cm4gdXRpbHMuY29tcHV0ZSh0LCB0aGlzLmRwb2ludHNbMF0sIHRoaXMuXzNkKTtcbiAgfVxuXG4gIGRkZXJpdmF0aXZlKHQpIHtcbiAgICByZXR1cm4gdXRpbHMuY29tcHV0ZSh0LCB0aGlzLmRwb2ludHNbMV0sIHRoaXMuXzNkKTtcbiAgfVxuXG4gIGFsaWduKCkge1xuICAgIGxldCBwID0gdGhpcy5wb2ludHM7XG4gICAgcmV0dXJuIG5ldyBCZXppZXIodXRpbHMuYWxpZ24ocCwgeyBwMTogcFswXSwgcDI6IHBbcC5sZW5ndGggLSAxXSB9KSk7XG4gIH1cblxuICBjdXJ2YXR1cmUodCkge1xuICAgIHJldHVybiB1dGlscy5jdXJ2YXR1cmUodCwgdGhpcy5kcG9pbnRzWzBdLCB0aGlzLmRwb2ludHNbMV0sIHRoaXMuXzNkKTtcbiAgfVxuXG4gIGluZmxlY3Rpb25zKCkge1xuICAgIHJldHVybiB1dGlscy5pbmZsZWN0aW9ucyh0aGlzLnBvaW50cyk7XG4gIH1cblxuICBub3JtYWwodCkge1xuICAgIHJldHVybiB0aGlzLl8zZCA/IHRoaXMuX19ub3JtYWwzKHQpIDogdGhpcy5fX25vcm1hbDIodCk7XG4gIH1cblxuICBfX25vcm1hbDIodCkge1xuICAgIGNvbnN0IGQgPSB0aGlzLmRlcml2YXRpdmUodCk7XG4gICAgY29uc3QgcSA9IHNxcnQkMShkLnggKiBkLnggKyBkLnkgKiBkLnkpO1xuICAgIHJldHVybiB7IHg6IC1kLnkgLyBxLCB5OiBkLnggLyBxIH07XG4gIH1cblxuICBfX25vcm1hbDModCkge1xuICAgIC8vIHNlZSBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzI1NDUzMTU5XG4gICAgY29uc3QgcjEgPSB0aGlzLmRlcml2YXRpdmUodCksXG4gICAgICByMiA9IHRoaXMuZGVyaXZhdGl2ZSh0ICsgMC4wMSksXG4gICAgICBxMSA9IHNxcnQkMShyMS54ICogcjEueCArIHIxLnkgKiByMS55ICsgcjEueiAqIHIxLnopLFxuICAgICAgcTIgPSBzcXJ0JDEocjIueCAqIHIyLnggKyByMi55ICogcjIueSArIHIyLnogKiByMi56KTtcbiAgICByMS54IC89IHExO1xuICAgIHIxLnkgLz0gcTE7XG4gICAgcjEueiAvPSBxMTtcbiAgICByMi54IC89IHEyO1xuICAgIHIyLnkgLz0gcTI7XG4gICAgcjIueiAvPSBxMjtcbiAgICAvLyBjcm9zcyBwcm9kdWN0XG4gICAgY29uc3QgYyA9IHtcbiAgICAgIHg6IHIyLnkgKiByMS56IC0gcjIueiAqIHIxLnksXG4gICAgICB5OiByMi56ICogcjEueCAtIHIyLnggKiByMS56LFxuICAgICAgejogcjIueCAqIHIxLnkgLSByMi55ICogcjEueCxcbiAgICB9O1xuICAgIGNvbnN0IG0gPSBzcXJ0JDEoYy54ICogYy54ICsgYy55ICogYy55ICsgYy56ICogYy56KTtcbiAgICBjLnggLz0gbTtcbiAgICBjLnkgLz0gbTtcbiAgICBjLnogLz0gbTtcbiAgICAvLyByb3RhdGlvbiBtYXRyaXhcbiAgICBjb25zdCBSID0gW1xuICAgICAgYy54ICogYy54LFxuICAgICAgYy54ICogYy55IC0gYy56LFxuICAgICAgYy54ICogYy56ICsgYy55LFxuICAgICAgYy54ICogYy55ICsgYy56LFxuICAgICAgYy55ICogYy55LFxuICAgICAgYy55ICogYy56IC0gYy54LFxuICAgICAgYy54ICogYy56IC0gYy55LFxuICAgICAgYy55ICogYy56ICsgYy54LFxuICAgICAgYy56ICogYy56LFxuICAgIF07XG4gICAgLy8gbm9ybWFsIHZlY3RvcjpcbiAgICBjb25zdCBuID0ge1xuICAgICAgeDogUlswXSAqIHIxLnggKyBSWzFdICogcjEueSArIFJbMl0gKiByMS56LFxuICAgICAgeTogUlszXSAqIHIxLnggKyBSWzRdICogcjEueSArIFJbNV0gKiByMS56LFxuICAgICAgejogUls2XSAqIHIxLnggKyBSWzddICogcjEueSArIFJbOF0gKiByMS56LFxuICAgIH07XG4gICAgcmV0dXJuIG47XG4gIH1cblxuICBodWxsKHQpIHtcbiAgICBsZXQgcCA9IHRoaXMucG9pbnRzLFxuICAgICAgX3AgPSBbXSxcbiAgICAgIHEgPSBbXSxcbiAgICAgIGlkeCA9IDA7XG4gICAgcVtpZHgrK10gPSBwWzBdO1xuICAgIHFbaWR4KytdID0gcFsxXTtcbiAgICBxW2lkeCsrXSA9IHBbMl07XG4gICAgaWYgKHRoaXMub3JkZXIgPT09IDMpIHtcbiAgICAgIHFbaWR4KytdID0gcFszXTtcbiAgICB9XG4gICAgLy8gd2UgbGVycCBiZXR3ZWVuIGFsbCBwb2ludHMgYXQgZWFjaCBpdGVyYXRpb24sIHVudGlsIHdlIGhhdmUgMSBwb2ludCBsZWZ0LlxuICAgIHdoaWxlIChwLmxlbmd0aCA+IDEpIHtcbiAgICAgIF9wID0gW107XG4gICAgICBmb3IgKGxldCBpID0gMCwgcHQsIGwgPSBwLmxlbmd0aCAtIDE7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgcHQgPSB1dGlscy5sZXJwKHQsIHBbaV0sIHBbaSArIDFdKTtcbiAgICAgICAgcVtpZHgrK10gPSBwdDtcbiAgICAgICAgX3AucHVzaChwdCk7XG4gICAgICB9XG4gICAgICBwID0gX3A7XG4gICAgfVxuICAgIHJldHVybiBxO1xuICB9XG5cbiAgc3BsaXQodDEsIHQyKSB7XG4gICAgLy8gc2hvcnRjdXRzXG4gICAgaWYgKHQxID09PSAwICYmICEhdDIpIHtcbiAgICAgIHJldHVybiB0aGlzLnNwbGl0KHQyKS5sZWZ0O1xuICAgIH1cbiAgICBpZiAodDIgPT09IDEpIHtcbiAgICAgIHJldHVybiB0aGlzLnNwbGl0KHQxKS5yaWdodDtcbiAgICB9XG5cbiAgICAvLyBubyBzaG9ydGN1dDogdXNlIFwiZGUgQ2FzdGVsamF1XCIgaXRlcmF0aW9uLlxuICAgIGNvbnN0IHEgPSB0aGlzLmh1bGwodDEpO1xuICAgIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAgIGxlZnQ6XG4gICAgICAgIHRoaXMub3JkZXIgPT09IDJcbiAgICAgICAgICA/IG5ldyBCZXppZXIoW3FbMF0sIHFbM10sIHFbNV1dKVxuICAgICAgICAgIDogbmV3IEJlemllcihbcVswXSwgcVs0XSwgcVs3XSwgcVs5XV0pLFxuICAgICAgcmlnaHQ6XG4gICAgICAgIHRoaXMub3JkZXIgPT09IDJcbiAgICAgICAgICA/IG5ldyBCZXppZXIoW3FbNV0sIHFbNF0sIHFbMl1dKVxuICAgICAgICAgIDogbmV3IEJlemllcihbcVs5XSwgcVs4XSwgcVs2XSwgcVszXV0pLFxuICAgICAgc3BhbjogcSxcbiAgICB9O1xuXG4gICAgLy8gbWFrZSBzdXJlIHdlIGJpbmQgX3QxL190MiBpbmZvcm1hdGlvbiFcbiAgICByZXN1bHQubGVmdC5fdDEgPSB1dGlscy5tYXAoMCwgMCwgMSwgdGhpcy5fdDEsIHRoaXMuX3QyKTtcbiAgICByZXN1bHQubGVmdC5fdDIgPSB1dGlscy5tYXAodDEsIDAsIDEsIHRoaXMuX3QxLCB0aGlzLl90Mik7XG4gICAgcmVzdWx0LnJpZ2h0Ll90MSA9IHV0aWxzLm1hcCh0MSwgMCwgMSwgdGhpcy5fdDEsIHRoaXMuX3QyKTtcbiAgICByZXN1bHQucmlnaHQuX3QyID0gdXRpbHMubWFwKDEsIDAsIDEsIHRoaXMuX3QxLCB0aGlzLl90Mik7XG5cbiAgICAvLyBpZiB3ZSBoYXZlIG5vIHQyLCB3ZSdyZSBkb25lXG4gICAgaWYgKCF0Mikge1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvLyBpZiB3ZSBoYXZlIGEgdDIsIHNwbGl0IGFnYWluOlxuICAgIHQyID0gdXRpbHMubWFwKHQyLCB0MSwgMSwgMCwgMSk7XG4gICAgcmV0dXJuIHJlc3VsdC5yaWdodC5zcGxpdCh0MikubGVmdDtcbiAgfVxuXG4gIGV4dHJlbWEoKSB7XG4gICAgY29uc3QgcmVzdWx0ID0ge307XG4gICAgbGV0IHJvb3RzID0gW107XG5cbiAgICB0aGlzLmRpbXMuZm9yRWFjaChcbiAgICAgIGZ1bmN0aW9uIChkaW0pIHtcbiAgICAgICAgbGV0IG1mbiA9IGZ1bmN0aW9uICh2KSB7XG4gICAgICAgICAgcmV0dXJuIHZbZGltXTtcbiAgICAgICAgfTtcbiAgICAgICAgbGV0IHAgPSB0aGlzLmRwb2ludHNbMF0ubWFwKG1mbik7XG4gICAgICAgIHJlc3VsdFtkaW1dID0gdXRpbHMuZHJvb3RzKHApO1xuICAgICAgICBpZiAodGhpcy5vcmRlciA9PT0gMykge1xuICAgICAgICAgIHAgPSB0aGlzLmRwb2ludHNbMV0ubWFwKG1mbik7XG4gICAgICAgICAgcmVzdWx0W2RpbV0gPSByZXN1bHRbZGltXS5jb25jYXQodXRpbHMuZHJvb3RzKHApKTtcbiAgICAgICAgfVxuICAgICAgICByZXN1bHRbZGltXSA9IHJlc3VsdFtkaW1dLmZpbHRlcihmdW5jdGlvbiAodCkge1xuICAgICAgICAgIHJldHVybiB0ID49IDAgJiYgdCA8PSAxO1xuICAgICAgICB9KTtcbiAgICAgICAgcm9vdHMgPSByb290cy5jb25jYXQocmVzdWx0W2RpbV0uc29ydCh1dGlscy5udW1iZXJTb3J0KSk7XG4gICAgICB9LmJpbmQodGhpcylcbiAgICApO1xuXG4gICAgcmVzdWx0LnZhbHVlcyA9IHJvb3RzLnNvcnQodXRpbHMubnVtYmVyU29ydCkuZmlsdGVyKGZ1bmN0aW9uICh2LCBpZHgpIHtcbiAgICAgIHJldHVybiByb290cy5pbmRleE9mKHYpID09PSBpZHg7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgYmJveCgpIHtcbiAgICBjb25zdCBleHRyZW1hID0gdGhpcy5leHRyZW1hKCksXG4gICAgICByZXN1bHQgPSB7fTtcbiAgICB0aGlzLmRpbXMuZm9yRWFjaChcbiAgICAgIGZ1bmN0aW9uIChkKSB7XG4gICAgICAgIHJlc3VsdFtkXSA9IHV0aWxzLmdldG1pbm1heCh0aGlzLCBkLCBleHRyZW1hW2RdKTtcbiAgICAgIH0uYmluZCh0aGlzKVxuICAgICk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIG92ZXJsYXBzKGN1cnZlKSB7XG4gICAgY29uc3QgbGJib3ggPSB0aGlzLmJib3goKSxcbiAgICAgIHRiYm94ID0gY3VydmUuYmJveCgpO1xuICAgIHJldHVybiB1dGlscy5iYm94b3ZlcmxhcChsYmJveCwgdGJib3gpO1xuICB9XG5cbiAgb2Zmc2V0KHQsIGQpIHtcbiAgICBpZiAodHlwZW9mIGQgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgIGNvbnN0IGMgPSB0aGlzLmdldCh0KSxcbiAgICAgICAgbiA9IHRoaXMubm9ybWFsKHQpO1xuICAgICAgY29uc3QgcmV0ID0ge1xuICAgICAgICBjOiBjLFxuICAgICAgICBuOiBuLFxuICAgICAgICB4OiBjLnggKyBuLnggKiBkLFxuICAgICAgICB5OiBjLnkgKyBuLnkgKiBkLFxuICAgICAgfTtcbiAgICAgIGlmICh0aGlzLl8zZCkge1xuICAgICAgICByZXQueiA9IGMueiArIG4ueiAqIGQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmV0O1xuICAgIH1cbiAgICBpZiAodGhpcy5fbGluZWFyKSB7XG4gICAgICBjb25zdCBudiA9IHRoaXMubm9ybWFsKDApLFxuICAgICAgICBjb29yZHMgPSB0aGlzLnBvaW50cy5tYXAoZnVuY3Rpb24gKHApIHtcbiAgICAgICAgICBjb25zdCByZXQgPSB7XG4gICAgICAgICAgICB4OiBwLnggKyB0ICogbnYueCxcbiAgICAgICAgICAgIHk6IHAueSArIHQgKiBudi55LFxuICAgICAgICAgIH07XG4gICAgICAgICAgaWYgKHAueiAmJiBudi56KSB7XG4gICAgICAgICAgICByZXQueiA9IHAueiArIHQgKiBudi56O1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gcmV0O1xuICAgICAgICB9KTtcbiAgICAgIHJldHVybiBbbmV3IEJlemllcihjb29yZHMpXTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMucmVkdWNlKCkubWFwKGZ1bmN0aW9uIChzKSB7XG4gICAgICBpZiAocy5fbGluZWFyKSB7XG4gICAgICAgIHJldHVybiBzLm9mZnNldCh0KVswXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBzLnNjYWxlKHQpO1xuICAgIH0pO1xuICB9XG5cbiAgc2ltcGxlKCkge1xuICAgIGlmICh0aGlzLm9yZGVyID09PSAzKSB7XG4gICAgICBjb25zdCBhMSA9IHV0aWxzLmFuZ2xlKHRoaXMucG9pbnRzWzBdLCB0aGlzLnBvaW50c1szXSwgdGhpcy5wb2ludHNbMV0pO1xuICAgICAgY29uc3QgYTIgPSB1dGlscy5hbmdsZSh0aGlzLnBvaW50c1swXSwgdGhpcy5wb2ludHNbM10sIHRoaXMucG9pbnRzWzJdKTtcbiAgICAgIGlmICgoYTEgPiAwICYmIGEyIDwgMCkgfHwgKGExIDwgMCAmJiBhMiA+IDApKSByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IG4xID0gdGhpcy5ub3JtYWwoMCk7XG4gICAgY29uc3QgbjIgPSB0aGlzLm5vcm1hbCgxKTtcbiAgICBsZXQgcyA9IG4xLnggKiBuMi54ICsgbjEueSAqIG4yLnk7XG4gICAgaWYgKHRoaXMuXzNkKSB7XG4gICAgICBzICs9IG4xLnogKiBuMi56O1xuICAgIH1cbiAgICByZXR1cm4gYWJzJDEoYWNvcyQxKHMpKSA8IHBpJDEgLyAzO1xuICB9XG5cbiAgcmVkdWNlKCkge1xuICAgIC8vIFRPRE86IGV4YW1pbmUgdGhlc2UgdmFyIHR5cGVzIGluIG1vcmUgZGV0YWlsLi4uXG4gICAgbGV0IGksXG4gICAgICB0MSA9IDAsXG4gICAgICB0MiA9IDAsXG4gICAgICBzdGVwID0gMC4wMSxcbiAgICAgIHNlZ21lbnQsXG4gICAgICBwYXNzMSA9IFtdLFxuICAgICAgcGFzczIgPSBbXTtcbiAgICAvLyBmaXJzdCBwYXNzOiBzcGxpdCBvbiBleHRyZW1hXG4gICAgbGV0IGV4dHJlbWEgPSB0aGlzLmV4dHJlbWEoKS52YWx1ZXM7XG4gICAgaWYgKGV4dHJlbWEuaW5kZXhPZigwKSA9PT0gLTEpIHtcbiAgICAgIGV4dHJlbWEgPSBbMF0uY29uY2F0KGV4dHJlbWEpO1xuICAgIH1cbiAgICBpZiAoZXh0cmVtYS5pbmRleE9mKDEpID09PSAtMSkge1xuICAgICAgZXh0cmVtYS5wdXNoKDEpO1xuICAgIH1cblxuICAgIGZvciAodDEgPSBleHRyZW1hWzBdLCBpID0gMTsgaSA8IGV4dHJlbWEubGVuZ3RoOyBpKyspIHtcbiAgICAgIHQyID0gZXh0cmVtYVtpXTtcbiAgICAgIHNlZ21lbnQgPSB0aGlzLnNwbGl0KHQxLCB0Mik7XG4gICAgICBzZWdtZW50Ll90MSA9IHQxO1xuICAgICAgc2VnbWVudC5fdDIgPSB0MjtcbiAgICAgIHBhc3MxLnB1c2goc2VnbWVudCk7XG4gICAgICB0MSA9IHQyO1xuICAgIH1cblxuICAgIC8vIHNlY29uZCBwYXNzOiBmdXJ0aGVyIHJlZHVjZSB0aGVzZSBzZWdtZW50cyB0byBzaW1wbGUgc2VnbWVudHNcbiAgICBwYXNzMS5mb3JFYWNoKGZ1bmN0aW9uIChwMSkge1xuICAgICAgdDEgPSAwO1xuICAgICAgdDIgPSAwO1xuICAgICAgd2hpbGUgKHQyIDw9IDEpIHtcbiAgICAgICAgZm9yICh0MiA9IHQxICsgc3RlcDsgdDIgPD0gMSArIHN0ZXA7IHQyICs9IHN0ZXApIHtcbiAgICAgICAgICBzZWdtZW50ID0gcDEuc3BsaXQodDEsIHQyKTtcbiAgICAgICAgICBpZiAoIXNlZ21lbnQuc2ltcGxlKCkpIHtcbiAgICAgICAgICAgIHQyIC09IHN0ZXA7XG4gICAgICAgICAgICBpZiAoYWJzJDEodDEgLSB0MikgPCBzdGVwKSB7XG4gICAgICAgICAgICAgIC8vIHdlIGNhbiBuZXZlciBmb3JtIGEgcmVkdWN0aW9uXG4gICAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNlZ21lbnQgPSBwMS5zcGxpdCh0MSwgdDIpO1xuICAgICAgICAgICAgc2VnbWVudC5fdDEgPSB1dGlscy5tYXAodDEsIDAsIDEsIHAxLl90MSwgcDEuX3QyKTtcbiAgICAgICAgICAgIHNlZ21lbnQuX3QyID0gdXRpbHMubWFwKHQyLCAwLCAxLCBwMS5fdDEsIHAxLl90Mik7XG4gICAgICAgICAgICBwYXNzMi5wdXNoKHNlZ21lbnQpO1xuICAgICAgICAgICAgdDEgPSB0MjtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHQxIDwgMSkge1xuICAgICAgICBzZWdtZW50ID0gcDEuc3BsaXQodDEsIDEpO1xuICAgICAgICBzZWdtZW50Ll90MSA9IHV0aWxzLm1hcCh0MSwgMCwgMSwgcDEuX3QxLCBwMS5fdDIpO1xuICAgICAgICBzZWdtZW50Ll90MiA9IHAxLl90MjtcbiAgICAgICAgcGFzczIucHVzaChzZWdtZW50KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gcGFzczI7XG4gIH1cblxuICB0cmFuc2xhdGUodiwgZDEsIGQyKSB7XG4gICAgZDIgPSB0eXBlb2YgZDIgPT09IFwibnVtYmVyXCIgPyBkMiA6IGQxO1xuXG4gICAgLy8gVE9ETzogbWFrZSB0aGlzIHRha2UgY3VydmVzIHdpdGggY29udHJvbCBwb2ludHMgb3V0c2lkZVxuICAgIC8vICAgICAgIG9mIHRoZSBzdGFydC1lbmQgaW50ZXJ2YWwgaW50byBhY2NvdW50XG5cbiAgICBjb25zdCBvID0gdGhpcy5vcmRlcjtcbiAgICBsZXQgZCA9IHRoaXMucG9pbnRzLm1hcCgoXywgaSkgPT4gKDEgLSBpIC8gbykgKiBkMSArIChpIC8gbykgKiBkMik7XG4gICAgcmV0dXJuIG5ldyBCZXppZXIoXG4gICAgICB0aGlzLnBvaW50cy5tYXAoKHAsIGkpID0+ICh7XG4gICAgICAgIHg6IHAueCArIHYueCAqIGRbaV0sXG4gICAgICAgIHk6IHAueSArIHYueSAqIGRbaV0sXG4gICAgICB9KSlcbiAgICApO1xuICB9XG5cbiAgc2NhbGUoZCkge1xuICAgIGNvbnN0IG9yZGVyID0gdGhpcy5vcmRlcjtcbiAgICBsZXQgZGlzdGFuY2VGbiA9IGZhbHNlO1xuICAgIGlmICh0eXBlb2YgZCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICBkaXN0YW5jZUZuID0gZDtcbiAgICB9XG4gICAgaWYgKGRpc3RhbmNlRm4gJiYgb3JkZXIgPT09IDIpIHtcbiAgICAgIHJldHVybiB0aGlzLnJhaXNlKCkuc2NhbGUoZGlzdGFuY2VGbik7XG4gICAgfVxuXG4gICAgLy8gVE9ETzogYWRkIHNwZWNpYWwgaGFuZGxpbmcgZm9yIG5vbi1saW5lYXIgZGVnZW5lcmF0ZSBjdXJ2ZXMuXG5cbiAgICBjb25zdCBjbG9ja3dpc2UgPSB0aGlzLmNsb2Nrd2lzZTtcbiAgICBjb25zdCBwb2ludHMgPSB0aGlzLnBvaW50cztcblxuICAgIGlmICh0aGlzLl9saW5lYXIpIHtcbiAgICAgIHJldHVybiB0aGlzLnRyYW5zbGF0ZShcbiAgICAgICAgdGhpcy5ub3JtYWwoMCksXG4gICAgICAgIGRpc3RhbmNlRm4gPyBkaXN0YW5jZUZuKDApIDogZCxcbiAgICAgICAgZGlzdGFuY2VGbiA/IGRpc3RhbmNlRm4oMSkgOiBkXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHIxID0gZGlzdGFuY2VGbiA/IGRpc3RhbmNlRm4oMCkgOiBkO1xuICAgIGNvbnN0IHIyID0gZGlzdGFuY2VGbiA/IGRpc3RhbmNlRm4oMSkgOiBkO1xuICAgIGNvbnN0IHYgPSBbdGhpcy5vZmZzZXQoMCwgMTApLCB0aGlzLm9mZnNldCgxLCAxMCldO1xuICAgIGNvbnN0IG5wID0gW107XG4gICAgY29uc3QgbyA9IHV0aWxzLmxsaTQodlswXSwgdlswXS5jLCB2WzFdLCB2WzFdLmMpO1xuXG4gICAgaWYgKCFvKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJjYW5ub3Qgc2NhbGUgdGhpcyBjdXJ2ZS4gVHJ5IHJlZHVjaW5nIGl0IGZpcnN0LlwiKTtcbiAgICB9XG5cbiAgICAvLyBtb3ZlIGFsbCBwb2ludHMgYnkgZGlzdGFuY2UgJ2QnIHdydCB0aGUgb3JpZ2luICdvJyxcbiAgICAvLyBhbmQgbW92ZSBlbmQgcG9pbnRzIGJ5IGZpeGVkIGRpc3RhbmNlIGFsb25nIG5vcm1hbC5cbiAgICBbMCwgMV0uZm9yRWFjaChmdW5jdGlvbiAodCkge1xuICAgICAgY29uc3QgcCA9IChucFt0ICogb3JkZXJdID0gdXRpbHMuY29weShwb2ludHNbdCAqIG9yZGVyXSkpO1xuICAgICAgcC54ICs9ICh0ID8gcjIgOiByMSkgKiB2W3RdLm4ueDtcbiAgICAgIHAueSArPSAodCA/IHIyIDogcjEpICogdlt0XS5uLnk7XG4gICAgfSk7XG5cbiAgICBpZiAoIWRpc3RhbmNlRm4pIHtcbiAgICAgIC8vIG1vdmUgY29udHJvbCBwb2ludHMgdG8gbGllIG9uIHRoZSBpbnRlcnNlY3Rpb24gb2YgdGhlIG9mZnNldFxuICAgICAgLy8gZGVyaXZhdGl2ZSB2ZWN0b3IsIGFuZCB0aGUgb3JpZ2luLXRocm91Z2gtY29udHJvbCB2ZWN0b3JcbiAgICAgIFswLCAxXS5mb3JFYWNoKCh0KSA9PiB7XG4gICAgICAgIGlmIChvcmRlciA9PT0gMiAmJiAhIXQpIHJldHVybjtcbiAgICAgICAgY29uc3QgcCA9IG5wW3QgKiBvcmRlcl07XG4gICAgICAgIGNvbnN0IGQgPSB0aGlzLmRlcml2YXRpdmUodCk7XG4gICAgICAgIGNvbnN0IHAyID0geyB4OiBwLnggKyBkLngsIHk6IHAueSArIGQueSB9O1xuICAgICAgICBucFt0ICsgMV0gPSB1dGlscy5sbGk0KHAsIHAyLCBvLCBwb2ludHNbdCArIDFdKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIG5ldyBCZXppZXIobnApO1xuICAgIH1cblxuICAgIC8vIG1vdmUgY29udHJvbCBwb2ludHMgYnkgXCJob3dldmVyIG11Y2ggbmVjZXNzYXJ5IHRvXG4gICAgLy8gZW5zdXJlIHRoZSBjb3JyZWN0IHRhbmdlbnQgdG8gZW5kcG9pbnRcIi5cbiAgICBbMCwgMV0uZm9yRWFjaChmdW5jdGlvbiAodCkge1xuICAgICAgaWYgKG9yZGVyID09PSAyICYmICEhdCkgcmV0dXJuO1xuICAgICAgdmFyIHAgPSBwb2ludHNbdCArIDFdO1xuICAgICAgdmFyIG92ID0ge1xuICAgICAgICB4OiBwLnggLSBvLngsXG4gICAgICAgIHk6IHAueSAtIG8ueSxcbiAgICAgIH07XG4gICAgICB2YXIgcmMgPSBkaXN0YW5jZUZuID8gZGlzdGFuY2VGbigodCArIDEpIC8gb3JkZXIpIDogZDtcbiAgICAgIGlmIChkaXN0YW5jZUZuICYmICFjbG9ja3dpc2UpIHJjID0gLXJjO1xuICAgICAgdmFyIG0gPSBzcXJ0JDEob3YueCAqIG92LnggKyBvdi55ICogb3YueSk7XG4gICAgICBvdi54IC89IG07XG4gICAgICBvdi55IC89IG07XG4gICAgICBucFt0ICsgMV0gPSB7XG4gICAgICAgIHg6IHAueCArIHJjICogb3YueCxcbiAgICAgICAgeTogcC55ICsgcmMgKiBvdi55LFxuICAgICAgfTtcbiAgICB9KTtcbiAgICByZXR1cm4gbmV3IEJlemllcihucCk7XG4gIH1cblxuICBvdXRsaW5lKGQxLCBkMiwgZDMsIGQ0KSB7XG4gICAgZDIgPSBkMiA9PT0gdW5kZWZpbmVkID8gZDEgOiBkMjtcblxuICAgIGlmICh0aGlzLl9saW5lYXIpIHtcbiAgICAgIC8vIFRPRE86IGZpbmQgdGhlIGFjdHVhbCBleHRyZW1hLCBiZWNhdXNlIHRoZXkgbWlnaHRcbiAgICAgIC8vICAgICAgIGJlIGJlZm9yZSB0aGUgc3RhcnQsIG9yIHBhc3QgdGhlIGVuZC5cblxuICAgICAgY29uc3QgbiA9IHRoaXMubm9ybWFsKDApO1xuICAgICAgY29uc3Qgc3RhcnQgPSB0aGlzLnBvaW50c1swXTtcbiAgICAgIGNvbnN0IGVuZCA9IHRoaXMucG9pbnRzW3RoaXMucG9pbnRzLmxlbmd0aCAtIDFdO1xuICAgICAgbGV0IHMsIG1pZCwgZTtcblxuICAgICAgaWYgKGQzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZDMgPSBkMTtcbiAgICAgICAgZDQgPSBkMjtcbiAgICAgIH1cblxuICAgICAgcyA9IHsgeDogc3RhcnQueCArIG4ueCAqIGQxLCB5OiBzdGFydC55ICsgbi55ICogZDEgfTtcbiAgICAgIGUgPSB7IHg6IGVuZC54ICsgbi54ICogZDMsIHk6IGVuZC55ICsgbi55ICogZDMgfTtcbiAgICAgIG1pZCA9IHsgeDogKHMueCArIGUueCkgLyAyLCB5OiAocy55ICsgZS55KSAvIDIgfTtcbiAgICAgIGNvbnN0IGZsaW5lID0gW3MsIG1pZCwgZV07XG5cbiAgICAgIHMgPSB7IHg6IHN0YXJ0LnggLSBuLnggKiBkMiwgeTogc3RhcnQueSAtIG4ueSAqIGQyIH07XG4gICAgICBlID0geyB4OiBlbmQueCAtIG4ueCAqIGQ0LCB5OiBlbmQueSAtIG4ueSAqIGQ0IH07XG4gICAgICBtaWQgPSB7IHg6IChzLnggKyBlLngpIC8gMiwgeTogKHMueSArIGUueSkgLyAyIH07XG4gICAgICBjb25zdCBibGluZSA9IFtlLCBtaWQsIHNdO1xuXG4gICAgICBjb25zdCBscyA9IHV0aWxzLm1ha2VsaW5lKGJsaW5lWzJdLCBmbGluZVswXSk7XG4gICAgICBjb25zdCBsZSA9IHV0aWxzLm1ha2VsaW5lKGZsaW5lWzJdLCBibGluZVswXSk7XG4gICAgICBjb25zdCBzZWdtZW50cyA9IFtscywgbmV3IEJlemllcihmbGluZSksIGxlLCBuZXcgQmV6aWVyKGJsaW5lKV07XG4gICAgICByZXR1cm4gbmV3IFBvbHlCZXppZXIoc2VnbWVudHMpO1xuICAgIH1cblxuICAgIGNvbnN0IHJlZHVjZWQgPSB0aGlzLnJlZHVjZSgpLFxuICAgICAgbGVuID0gcmVkdWNlZC5sZW5ndGgsXG4gICAgICBmY3VydmVzID0gW107XG5cbiAgICBsZXQgYmN1cnZlcyA9IFtdLFxuICAgICAgcCxcbiAgICAgIGFsZW4gPSAwLFxuICAgICAgdGxlbiA9IHRoaXMubGVuZ3RoKCk7XG5cbiAgICBjb25zdCBncmFkdWF0ZWQgPSB0eXBlb2YgZDMgIT09IFwidW5kZWZpbmVkXCIgJiYgdHlwZW9mIGQ0ICE9PSBcInVuZGVmaW5lZFwiO1xuXG4gICAgZnVuY3Rpb24gbGluZWFyRGlzdGFuY2VGdW5jdGlvbihzLCBlLCB0bGVuLCBhbGVuLCBzbGVuKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24gKHYpIHtcbiAgICAgICAgY29uc3QgZjEgPSBhbGVuIC8gdGxlbixcbiAgICAgICAgICBmMiA9IChhbGVuICsgc2xlbikgLyB0bGVuLFxuICAgICAgICAgIGQgPSBlIC0gcztcbiAgICAgICAgcmV0dXJuIHV0aWxzLm1hcCh2LCAwLCAxLCBzICsgZjEgKiBkLCBzICsgZjIgKiBkKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gZm9ybSBjdXJ2ZSBvdWxpbmVzXG4gICAgcmVkdWNlZC5mb3JFYWNoKGZ1bmN0aW9uIChzZWdtZW50KSB7XG4gICAgICBjb25zdCBzbGVuID0gc2VnbWVudC5sZW5ndGgoKTtcbiAgICAgIGlmIChncmFkdWF0ZWQpIHtcbiAgICAgICAgZmN1cnZlcy5wdXNoKFxuICAgICAgICAgIHNlZ21lbnQuc2NhbGUobGluZWFyRGlzdGFuY2VGdW5jdGlvbihkMSwgZDMsIHRsZW4sIGFsZW4sIHNsZW4pKVxuICAgICAgICApO1xuICAgICAgICBiY3VydmVzLnB1c2goXG4gICAgICAgICAgc2VnbWVudC5zY2FsZShsaW5lYXJEaXN0YW5jZUZ1bmN0aW9uKC1kMiwgLWQ0LCB0bGVuLCBhbGVuLCBzbGVuKSlcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZjdXJ2ZXMucHVzaChzZWdtZW50LnNjYWxlKGQxKSk7XG4gICAgICAgIGJjdXJ2ZXMucHVzaChzZWdtZW50LnNjYWxlKC1kMikpO1xuICAgICAgfVxuICAgICAgYWxlbiArPSBzbGVuO1xuICAgIH0pO1xuXG4gICAgLy8gcmV2ZXJzZSB0aGUgXCJyZXR1cm5cIiBvdXRsaW5lXG4gICAgYmN1cnZlcyA9IGJjdXJ2ZXNcbiAgICAgIC5tYXAoZnVuY3Rpb24gKHMpIHtcbiAgICAgICAgcCA9IHMucG9pbnRzO1xuICAgICAgICBpZiAocFszXSkge1xuICAgICAgICAgIHMucG9pbnRzID0gW3BbM10sIHBbMl0sIHBbMV0sIHBbMF1dO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHMucG9pbnRzID0gW3BbMl0sIHBbMV0sIHBbMF1dO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzO1xuICAgICAgfSlcbiAgICAgIC5yZXZlcnNlKCk7XG5cbiAgICAvLyBmb3JtIHRoZSBlbmRjYXBzIGFzIGxpbmVzXG4gICAgY29uc3QgZnMgPSBmY3VydmVzWzBdLnBvaW50c1swXSxcbiAgICAgIGZlID0gZmN1cnZlc1tsZW4gLSAxXS5wb2ludHNbZmN1cnZlc1tsZW4gLSAxXS5wb2ludHMubGVuZ3RoIC0gMV0sXG4gICAgICBicyA9IGJjdXJ2ZXNbbGVuIC0gMV0ucG9pbnRzW2JjdXJ2ZXNbbGVuIC0gMV0ucG9pbnRzLmxlbmd0aCAtIDFdLFxuICAgICAgYmUgPSBiY3VydmVzWzBdLnBvaW50c1swXSxcbiAgICAgIGxzID0gdXRpbHMubWFrZWxpbmUoYnMsIGZzKSxcbiAgICAgIGxlID0gdXRpbHMubWFrZWxpbmUoZmUsIGJlKSxcbiAgICAgIHNlZ21lbnRzID0gW2xzXS5jb25jYXQoZmN1cnZlcykuY29uY2F0KFtsZV0pLmNvbmNhdChiY3VydmVzKTtcblxuICAgIHJldHVybiBuZXcgUG9seUJlemllcihzZWdtZW50cyk7XG4gIH1cblxuICBvdXRsaW5lc2hhcGVzKGQxLCBkMiwgY3VydmVJbnRlcnNlY3Rpb25UaHJlc2hvbGQpIHtcbiAgICBkMiA9IGQyIHx8IGQxO1xuICAgIGNvbnN0IG91dGxpbmUgPSB0aGlzLm91dGxpbmUoZDEsIGQyKS5jdXJ2ZXM7XG4gICAgY29uc3Qgc2hhcGVzID0gW107XG4gICAgZm9yIChsZXQgaSA9IDEsIGxlbiA9IG91dGxpbmUubGVuZ3RoOyBpIDwgbGVuIC8gMjsgaSsrKSB7XG4gICAgICBjb25zdCBzaGFwZSA9IHV0aWxzLm1ha2VzaGFwZShcbiAgICAgICAgb3V0bGluZVtpXSxcbiAgICAgICAgb3V0bGluZVtsZW4gLSBpXSxcbiAgICAgICAgY3VydmVJbnRlcnNlY3Rpb25UaHJlc2hvbGRcbiAgICAgICk7XG4gICAgICBzaGFwZS5zdGFydGNhcC52aXJ0dWFsID0gaSA+IDE7XG4gICAgICBzaGFwZS5lbmRjYXAudmlydHVhbCA9IGkgPCBsZW4gLyAyIC0gMTtcbiAgICAgIHNoYXBlcy5wdXNoKHNoYXBlKTtcbiAgICB9XG4gICAgcmV0dXJuIHNoYXBlcztcbiAgfVxuXG4gIGludGVyc2VjdHMoY3VydmUsIGN1cnZlSW50ZXJzZWN0aW9uVGhyZXNob2xkKSB7XG4gICAgaWYgKCFjdXJ2ZSkgcmV0dXJuIHRoaXMuc2VsZmludGVyc2VjdHMoY3VydmVJbnRlcnNlY3Rpb25UaHJlc2hvbGQpO1xuICAgIGlmIChjdXJ2ZS5wMSAmJiBjdXJ2ZS5wMikge1xuICAgICAgcmV0dXJuIHRoaXMubGluZUludGVyc2VjdHMoY3VydmUpO1xuICAgIH1cbiAgICBpZiAoY3VydmUgaW5zdGFuY2VvZiBCZXppZXIpIHtcbiAgICAgIGN1cnZlID0gY3VydmUucmVkdWNlKCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmN1cnZlaW50ZXJzZWN0cyhcbiAgICAgIHRoaXMucmVkdWNlKCksXG4gICAgICBjdXJ2ZSxcbiAgICAgIGN1cnZlSW50ZXJzZWN0aW9uVGhyZXNob2xkXG4gICAgKTtcbiAgfVxuXG4gIGxpbmVJbnRlcnNlY3RzKGxpbmUpIHtcbiAgICBjb25zdCBteCA9IG1pbihsaW5lLnAxLngsIGxpbmUucDIueCksXG4gICAgICBteSA9IG1pbihsaW5lLnAxLnksIGxpbmUucDIueSksXG4gICAgICBNWCA9IG1heChsaW5lLnAxLngsIGxpbmUucDIueCksXG4gICAgICBNWSA9IG1heChsaW5lLnAxLnksIGxpbmUucDIueSk7XG4gICAgcmV0dXJuIHV0aWxzLnJvb3RzKHRoaXMucG9pbnRzLCBsaW5lKS5maWx0ZXIoKHQpID0+IHtcbiAgICAgIHZhciBwID0gdGhpcy5nZXQodCk7XG4gICAgICByZXR1cm4gdXRpbHMuYmV0d2VlbihwLngsIG14LCBNWCkgJiYgdXRpbHMuYmV0d2VlbihwLnksIG15LCBNWSk7XG4gICAgfSk7XG4gIH1cblxuICBzZWxmaW50ZXJzZWN0cyhjdXJ2ZUludGVyc2VjdGlvblRocmVzaG9sZCkge1xuICAgIC8vIFwic2ltcGxlXCIgY3VydmVzIGNhbm5vdCBpbnRlcnNlY3Qgd2l0aCB0aGVpciBkaXJlY3RcbiAgICAvLyBuZWlnaGJvdXIsIHNvIGZvciBlYWNoIHNlZ21lbnQgWCB3ZSBjaGVjayB3aGV0aGVyXG4gICAgLy8gaXQgaW50ZXJzZWN0cyBbMDp4LTJdW3grMjpsYXN0XS5cblxuICAgIGNvbnN0IHJlZHVjZWQgPSB0aGlzLnJlZHVjZSgpLFxuICAgICAgbGVuID0gcmVkdWNlZC5sZW5ndGggLSAyLFxuICAgICAgcmVzdWx0cyA9IFtdO1xuXG4gICAgZm9yIChsZXQgaSA9IDAsIHJlc3VsdCwgbGVmdCwgcmlnaHQ7IGkgPCBsZW47IGkrKykge1xuICAgICAgbGVmdCA9IHJlZHVjZWQuc2xpY2UoaSwgaSArIDEpO1xuICAgICAgcmlnaHQgPSByZWR1Y2VkLnNsaWNlKGkgKyAyKTtcbiAgICAgIHJlc3VsdCA9IHRoaXMuY3VydmVpbnRlcnNlY3RzKGxlZnQsIHJpZ2h0LCBjdXJ2ZUludGVyc2VjdGlvblRocmVzaG9sZCk7XG4gICAgICByZXN1bHRzLnB1c2goLi4ucmVzdWx0KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdHM7XG4gIH1cblxuICBjdXJ2ZWludGVyc2VjdHMoYzEsIGMyLCBjdXJ2ZUludGVyc2VjdGlvblRocmVzaG9sZCkge1xuICAgIGNvbnN0IHBhaXJzID0gW107XG4gICAgLy8gc3RlcCAxOiBwYWlyIG9mZiBhbnkgb3ZlcmxhcHBpbmcgc2VnbWVudHNcbiAgICBjMS5mb3JFYWNoKGZ1bmN0aW9uIChsKSB7XG4gICAgICBjMi5mb3JFYWNoKGZ1bmN0aW9uIChyKSB7XG4gICAgICAgIGlmIChsLm92ZXJsYXBzKHIpKSB7XG4gICAgICAgICAgcGFpcnMucHVzaCh7IGxlZnQ6IGwsIHJpZ2h0OiByIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICAvLyBzdGVwIDI6IGZvciBlYWNoIHBhaXJpbmcsIHJ1biB0aHJvdWdoIHRoZSBjb252ZXJnZW5jZSBhbGdvcml0aG0uXG4gICAgbGV0IGludGVyc2VjdGlvbnMgPSBbXTtcbiAgICBwYWlycy5mb3JFYWNoKGZ1bmN0aW9uIChwYWlyKSB7XG4gICAgICBjb25zdCByZXN1bHQgPSB1dGlscy5wYWlyaXRlcmF0aW9uKFxuICAgICAgICBwYWlyLmxlZnQsXG4gICAgICAgIHBhaXIucmlnaHQsXG4gICAgICAgIGN1cnZlSW50ZXJzZWN0aW9uVGhyZXNob2xkXG4gICAgICApO1xuICAgICAgaWYgKHJlc3VsdC5sZW5ndGggPiAwKSB7XG4gICAgICAgIGludGVyc2VjdGlvbnMgPSBpbnRlcnNlY3Rpb25zLmNvbmNhdChyZXN1bHQpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBpbnRlcnNlY3Rpb25zO1xuICB9XG5cbiAgYXJjcyhlcnJvclRocmVzaG9sZCkge1xuICAgIGVycm9yVGhyZXNob2xkID0gZXJyb3JUaHJlc2hvbGQgfHwgMC41O1xuICAgIHJldHVybiB0aGlzLl9pdGVyYXRlKGVycm9yVGhyZXNob2xkLCBbXSk7XG4gIH1cblxuICBfZXJyb3IocGMsIG5wMSwgcywgZSkge1xuICAgIGNvbnN0IHEgPSAoZSAtIHMpIC8gNCxcbiAgICAgIGMxID0gdGhpcy5nZXQocyArIHEpLFxuICAgICAgYzIgPSB0aGlzLmdldChlIC0gcSksXG4gICAgICByZWYgPSB1dGlscy5kaXN0KHBjLCBucDEpLFxuICAgICAgZDEgPSB1dGlscy5kaXN0KHBjLCBjMSksXG4gICAgICBkMiA9IHV0aWxzLmRpc3QocGMsIGMyKTtcbiAgICByZXR1cm4gYWJzJDEoZDEgLSByZWYpICsgYWJzJDEoZDIgLSByZWYpO1xuICB9XG5cbiAgX2l0ZXJhdGUoZXJyb3JUaHJlc2hvbGQsIGNpcmNsZXMpIHtcbiAgICBsZXQgdF9zID0gMCxcbiAgICAgIHRfZSA9IDEsXG4gICAgICBzYWZldHk7XG4gICAgLy8gd2UgZG8gYSBiaW5hcnkgc2VhcmNoIHRvIGZpbmQgdGhlIFwiZ29vZCBgdGAgY2xvc2VzdCB0byBuby1sb25nZXItZ29vZFwiXG4gICAgZG8ge1xuICAgICAgc2FmZXR5ID0gMDtcblxuICAgICAgLy8gc3RlcCAxOiBzdGFydCB3aXRoIHRoZSBtYXhpbXVtIHBvc3NpYmxlIGFyY1xuICAgICAgdF9lID0gMTtcblxuICAgICAgLy8gcG9pbnRzOlxuICAgICAgbGV0IG5wMSA9IHRoaXMuZ2V0KHRfcyksXG4gICAgICAgIG5wMixcbiAgICAgICAgbnAzLFxuICAgICAgICBhcmMsXG4gICAgICAgIHByZXZfYXJjO1xuXG4gICAgICAvLyBib29sZWFuczpcbiAgICAgIGxldCBjdXJyX2dvb2QgPSBmYWxzZSxcbiAgICAgICAgcHJldl9nb29kID0gZmFsc2UsXG4gICAgICAgIGRvbmU7XG5cbiAgICAgIC8vIG51bWJlcnM6XG4gICAgICBsZXQgdF9tID0gdF9lLFxuICAgICAgICBwcmV2X2UgPSAxO1xuXG4gICAgICAvLyBzdGVwIDI6IGZpbmQgdGhlIGJlc3QgcG9zc2libGUgYXJjXG4gICAgICBkbyB7XG4gICAgICAgIHByZXZfZ29vZCA9IGN1cnJfZ29vZDtcbiAgICAgICAgcHJldl9hcmMgPSBhcmM7XG4gICAgICAgIHRfbSA9ICh0X3MgKyB0X2UpIC8gMjtcblxuICAgICAgICBucDIgPSB0aGlzLmdldCh0X20pO1xuICAgICAgICBucDMgPSB0aGlzLmdldCh0X2UpO1xuXG4gICAgICAgIGFyYyA9IHV0aWxzLmdldGNjZW50ZXIobnAxLCBucDIsIG5wMyk7XG5cbiAgICAgICAgLy9hbHNvIHNhdmUgdGhlIHQgdmFsdWVzXG4gICAgICAgIGFyYy5pbnRlcnZhbCA9IHtcbiAgICAgICAgICBzdGFydDogdF9zLFxuICAgICAgICAgIGVuZDogdF9lLFxuICAgICAgICB9O1xuXG4gICAgICAgIGxldCBlcnJvciA9IHRoaXMuX2Vycm9yKGFyYywgbnAxLCB0X3MsIHRfZSk7XG4gICAgICAgIGN1cnJfZ29vZCA9IGVycm9yIDw9IGVycm9yVGhyZXNob2xkO1xuXG4gICAgICAgIGRvbmUgPSBwcmV2X2dvb2QgJiYgIWN1cnJfZ29vZDtcbiAgICAgICAgaWYgKCFkb25lKSBwcmV2X2UgPSB0X2U7XG5cbiAgICAgICAgLy8gdGhpcyBhcmMgaXMgZmluZTogd2UgY2FuIG1vdmUgJ2UnIHVwIHRvIHNlZSBpZiB3ZSBjYW4gZmluZCBhIHdpZGVyIGFyY1xuICAgICAgICBpZiAoY3Vycl9nb29kKSB7XG4gICAgICAgICAgLy8gaWYgZSBpcyBhbHJlYWR5IGF0IG1heCwgdGhlbiB3ZSdyZSBkb25lIGZvciB0aGlzIGFyYy5cbiAgICAgICAgICBpZiAodF9lID49IDEpIHtcbiAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSB3ZSBjYXAgYXQgdD0xXG4gICAgICAgICAgICBhcmMuaW50ZXJ2YWwuZW5kID0gcHJldl9lID0gMTtcbiAgICAgICAgICAgIHByZXZfYXJjID0gYXJjO1xuICAgICAgICAgICAgLy8gaWYgd2UgY2FwcGVkIHRoZSBhcmMgc2VnbWVudCB0byB0PTEgd2UgYWxzbyBuZWVkIHRvIG1ha2Ugc3VyZSB0aGF0XG4gICAgICAgICAgICAvLyB0aGUgYXJjJ3MgZW5kIGFuZ2xlIGlzIGNvcnJlY3Qgd2l0aCByZXNwZWN0IHRvIHRoZSBiZXppZXIgZW5kIHBvaW50LlxuICAgICAgICAgICAgaWYgKHRfZSA+IDEpIHtcbiAgICAgICAgICAgICAgbGV0IGQgPSB7XG4gICAgICAgICAgICAgICAgeDogYXJjLnggKyBhcmMuciAqIGNvcyQxKGFyYy5lKSxcbiAgICAgICAgICAgICAgICB5OiBhcmMueSArIGFyYy5yICogc2luJDEoYXJjLmUpLFxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICBhcmMuZSArPSB1dGlscy5hbmdsZSh7IHg6IGFyYy54LCB5OiBhcmMueSB9LCBkLCB0aGlzLmdldCgxKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gaWYgbm90LCBtb3ZlIGl0IHVwIGJ5IGhhbGYgdGhlIGl0ZXJhdGlvbiBkaXN0YW5jZVxuICAgICAgICAgIHRfZSA9IHRfZSArICh0X2UgLSB0X3MpIC8gMjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyB0aGlzIGlzIGEgYmFkIGFyYzogd2UgbmVlZCB0byBtb3ZlICdlJyBkb3duIHRvIGZpbmQgYSBnb29kIGFyY1xuICAgICAgICAgIHRfZSA9IHRfbTtcbiAgICAgICAgfVxuICAgICAgfSB3aGlsZSAoIWRvbmUgJiYgc2FmZXR5KysgPCAxMDApO1xuXG4gICAgICBpZiAoc2FmZXR5ID49IDEwMCkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgLy8gY29uc29sZS5sb2coXCJMODM1OiBbRl0gYXJjIGZvdW5kXCIsIHRfcywgcHJldl9lLCBwcmV2X2FyYy54LCBwcmV2X2FyYy55LCBwcmV2X2FyYy5zLCBwcmV2X2FyYy5lKTtcblxuICAgICAgcHJldl9hcmMgPSBwcmV2X2FyYyA/IHByZXZfYXJjIDogYXJjO1xuICAgICAgY2lyY2xlcy5wdXNoKHByZXZfYXJjKTtcbiAgICAgIHRfcyA9IHByZXZfZTtcbiAgICB9IHdoaWxlICh0X2UgPCAxKTtcbiAgICByZXR1cm4gY2lyY2xlcztcbiAgfVxufVxuXG5leHBvcnQgeyBCZXppZXIgfTsiLCJpbXBvcnQge1ZlY3Rvcn0gZnJvbSBcIm1hdHRlci1qc1wiO1xuaW1wb3J0IHtmaW5kQW5nbGUsIGZpbmRDZW50ZXJPZkxpbmUsIGZpbmREaXN0YW5jZVZlY30gZnJvbSBcIi4vbWF0aF91dGlsc1wiO1xuaW1wb3J0IHtDdXJ2ZUNvbW1hbmRUeXBlLCBMaW5lQ29tbWFuZFR5cGUsIEFsbENvbW1hbmRUeXBlc30gZnJvbSBcIi4vY29tbWFuZF9tYXBwZXJcIjtcbmltcG9ydCB7QmV6aWVyfSBmcm9tIFwiLi8uLi9iZXppZXJqcy9iZXppZXIuanNcIjtcblxuZXhwb3J0IGNvbnN0IGZpbmRDZW50ZXJPZkNvbW1hbmQgPSAoY29tbWFuZDogQWxsQ29tbWFuZFR5cGVzKTogVmVjdG9yID0+XG57XG4gICAgc3dpdGNoKGNvbW1hbmQuY29kZSlcbiAgICB7XG4gICAgICAgIGNhc2UgXCJNXCI6IHJldHVybiBWZWN0b3IuY3JlYXRlKGNvbW1hbmQueCwgY29tbWFuZC55KTtcbiAgICAgICAgY2FzZSBcIlRcIjogdGhyb3cgbmV3IEVycm9yKFwiVCBub3Qgc3VwcG9ydGVkXCIpO1xuICAgICAgICBjYXNlIFwiWlwiOiByZXR1cm4gZmluZENlbnRlck9mTGluZUNvbW1hbmQoY29tbWFuZCk7XG4gICAgICAgIGNhc2UgXCJDXCI6IHJldHVybiBmaW5kQ2VudGVyT2ZDdXJ2ZUNvbW1hbmQoY29tbWFuZCk7XG4gICAgICAgIGNhc2UgXCJRXCI6IHJldHVybiBmaW5kQ2VudGVyT2ZDdXJ2ZUNvbW1hbmQoY29tbWFuZCk7XG4gICAgICAgIGNhc2UgXCJTXCI6IHJldHVybiBmaW5kQ2VudGVyT2ZDdXJ2ZUNvbW1hbmQoY29tbWFuZCk7XG4gICAgICAgIGNhc2UgXCJMXCI6IHJldHVybiBmaW5kQ2VudGVyT2ZMaW5lQ29tbWFuZChjb21tYW5kKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjb25zdCBmaW5kQ2VudGVyT2ZDdXJ2ZUNvbW1hbmQgPSAoY29tbWFuZDogQ3VydmVDb21tYW5kVHlwZSk6IFZlY3RvciA9Plxue1xuICAgIGNvbnN0IHBvaW50cyA9IGZpbmRDdXJ2ZVBvaW50cyhjb21tYW5kKTtcbiAgICBjb25zdCBiZXppZXJDZW50ZXIgPSBuZXcgQmV6aWVyKHBvaW50cykuZ2V0KDAuNSk7XG4gICAgcmV0dXJuIFZlY3Rvci5jcmVhdGUoYmV6aWVyQ2VudGVyLngsIGJlemllckNlbnRlci55KTtcbn1cblxuZXhwb3J0IGNvbnN0IGZpbmRDZW50ZXJPZkxpbmVDb21tYW5kID0gKGNvbW1hbmQ6IExpbmVDb21tYW5kVHlwZSk6IFZlY3RvciA9Plxue1xuICAgIHJldHVybiBmaW5kQ2VudGVyT2ZMaW5lKFZlY3Rvci5jcmVhdGUoY29tbWFuZC54LCBjb21tYW5kLnkpLCBWZWN0b3IuY3JlYXRlKGNvbW1hbmQueDAsIGNvbW1hbmQueTApKTtcbn1cblxuZXhwb3J0IGNvbnN0IGZpbmRBbmdsZU9mTGluZUNvbW1hbmQgPSAoY29tbWFuZDogTGluZUNvbW1hbmRUeXBlKTogbnVtYmVyID0+XG57XG4gICAgcmV0dXJuIGZpbmRBbmdsZShjb21tYW5kLngsIGNvbW1hbmQueSwgY29tbWFuZC54MCwgY29tbWFuZC55MCk7XG59XG5cbmV4cG9ydCBjb25zdCBmaW5kTGVuZ3RoT2ZMaW5lQ29tbWFuZCA9IChjb21tYW5kOiBMaW5lQ29tbWFuZFR5cGUpOiBudW1iZXIgPT5cbntcbiAgICByZXR1cm4gZmluZERpc3RhbmNlVmVjKFZlY3Rvci5jcmVhdGUoY29tbWFuZC54LCBjb21tYW5kLnkpLCBWZWN0b3IuY3JlYXRlKGNvbW1hbmQueDAsIGNvbW1hbmQueTApKTtcbn1cblxuZXhwb3J0IGNvbnN0IGZpbmRDdXJ2ZVBvaW50cyA9IChjb21tYW5kOiBDdXJ2ZUNvbW1hbmRUeXBlKTogVmVjdG9yW10gPT5cbntcbiAgICBzd2l0Y2ggKGNvbW1hbmQuY29kZSlcbiAgICB7XG4gICAgICAgIGNhc2UgJ0MnOlxuICAgICAgICB7XG4gICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgIFZlY3Rvci5jcmVhdGUoY29tbWFuZC54MCwgY29tbWFuZC55MCksXG4gICAgICAgICAgICAgICAgVmVjdG9yLmNyZWF0ZShjb21tYW5kLngxLCBjb21tYW5kLnkxKSxcbiAgICAgICAgICAgICAgICBWZWN0b3IuY3JlYXRlKGNvbW1hbmQueDIsIGNvbW1hbmQueTIpLFxuICAgICAgICAgICAgICAgIFZlY3Rvci5jcmVhdGUoY29tbWFuZC54LCBjb21tYW5kLnkpLFxuICAgICAgICAgICAgXTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdRJzpcbiAgICAgICAge1xuICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICBWZWN0b3IuY3JlYXRlKGNvbW1hbmQueDAsIGNvbW1hbmQueTApLFxuICAgICAgICAgICAgICAgIFZlY3Rvci5jcmVhdGUoY29tbWFuZC54MSwgY29tbWFuZC55MSksXG4gICAgICAgICAgICAgICAgVmVjdG9yLmNyZWF0ZShjb21tYW5kLngsIGNvbW1hbmQueSksXG4gICAgICAgICAgICBdO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgXCJTXCI6XG4gICAgICAgIHtcbiAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgVmVjdG9yLmNyZWF0ZShjb21tYW5kLngwLCBjb21tYW5kLnkwKSxcbiAgICAgICAgICAgICAgICBWZWN0b3IuY3JlYXRlKGNvbW1hbmQueDIsIGNvbW1hbmQueTIpLFxuICAgICAgICAgICAgICAgIFZlY3Rvci5jcmVhdGUoY29tbWFuZC54LCBjb21tYW5kLnkpLFxuICAgICAgICAgICAgXTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlIFwiVFwiOlxuICAgICAgICB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUIG5vdCBkZWZpbmVkXCIpO1xuICAgICAgICB9XG4gICAgfVxufSIsImltcG9ydCB7SW50ZXJzZWN0b3J9IGZyb20gXCIuL2ludGVyc2VjdG9yXCI7XG5pbXBvcnQge0Jlemllcn0gZnJvbSBcIi4vLi4vLi4vYmV6aWVyanMvYmV6aWVyLmpzXCI7XG5pbXBvcnQge1ZlY3Rvcn0gZnJvbSBcIm1hdHRlci1qc1wiO1xuaW1wb3J0IHt2ZWN0b3JFcXVhbHN9IGZyb20gXCIuLi8uLi9iYXNlL21hdGhfdXRpbHNcIjtcbmltcG9ydCB7ZmluZEN1cnZlUG9pbnRzLCBmaW5kTGVuZ3RoT2ZMaW5lQ29tbWFuZH0gZnJvbSBcIi4uLy4uL2Jhc2UvY29tbWFuZF91dGlsc1wiO1xuaW1wb3J0IHtDdXJ2ZUNvbW1hbmRUeXBlLCBMaW5lQ29tbWFuZFR5cGV9IGZyb20gXCIuLi8uLi9iYXNlL2NvbW1hbmRfbWFwcGVyXCI7XG5cbmV4cG9ydCBjbGFzcyBMaW5lQ3VydmVJbnRlcnNlY3RvciBpbXBsZW1lbnRzIEludGVyc2VjdG9yPEN1cnZlQ29tbWFuZFR5cGUsIExpbmVDb21tYW5kVHlwZT5cbntcbiAgICBpbnRlcnNlY3RzKGN1cnZlOiBDdXJ2ZUNvbW1hbmRUeXBlLCBsaW5lOiBMaW5lQ29tbWFuZFR5cGUpOiBib29sZWFuXG4gICAge1xuICAgICAgICBjb25zdCBjdXJ2ZVN0YXJ0ID0gVmVjdG9yLmNyZWF0ZShjdXJ2ZS54MCwgY3VydmUueTApO1xuICAgICAgICBjb25zdCBjdXJ2ZUVuZCA9IFZlY3Rvci5jcmVhdGUoY3VydmUueCwgY3VydmUueSk7XG4gICAgICAgIGNvbnN0IGxpbmVTdGFydCA9IFZlY3Rvci5jcmVhdGUobGluZS54MCwgbGluZS55MCk7XG4gICAgICAgIGNvbnN0IGxpbmVFbmQgPSBWZWN0b3IuY3JlYXRlKGxpbmUueCwgbGluZS55KTtcblxuICAgICAgICBpZiAodmVjdG9yRXF1YWxzKGN1cnZlU3RhcnQsIGxpbmVTdGFydCkgfHxcbiAgICAgICAgICAgIHZlY3RvckVxdWFscyhjdXJ2ZVN0YXJ0LCBsaW5lRW5kKSB8fFxuICAgICAgICAgICAgdmVjdG9yRXF1YWxzKGN1cnZlRW5kLCBsaW5lU3RhcnQpIHx8XG4gICAgICAgICAgICB2ZWN0b3JFcXVhbHMoY3VydmVFbmQsIGxpbmVFbmQpKVxuICAgICAgICB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGJlemllciA9IG5ldyBCZXppZXIoZmluZEN1cnZlUG9pbnRzKGN1cnZlKSk7XG5cbiAgICAgICAgcmV0dXJuIGJlemllci5pbnRlcnNlY3RzKHsgcDE6IGxpbmVTdGFydCwgcDI6IGxpbmVFbmR9KS5sZW5ndGggIT09IDA7XG4gICAgfVxuXG4gICAgc3VwcG9ydGVkQ29tbWFuZFR5cGVzKCk6IFtzdHJpbmdbXSwgc3RyaW5nW11dXG4gICAge1xuICAgICAgICByZXR1cm4gW1tcIkNcIiwgXCJTXCIsIFwiUVwiXSwgW1wiTFwiLCBcIlpcIl1dO1xuICAgIH1cbn0iLCJpbXBvcnQge0ludGVyc2VjdG9yfSBmcm9tIFwiLi9pbnRlcnNlY3RvclwiO1xuaW1wb3J0IHtWZWN0b3J9IGZyb20gXCJtYXR0ZXItanNcIjtcbmltcG9ydCB7dmVjdG9yRXF1YWxzfSBmcm9tIFwiLi4vLi4vYmFzZS9tYXRoX3V0aWxzXCI7XG5pbXBvcnQge2ZpbmRDdXJ2ZVBvaW50c30gZnJvbSBcIi4uLy4uL2Jhc2UvY29tbWFuZF91dGlsc1wiO1xuaW1wb3J0IHtCZXppZXJ9IGZyb20gXCIuLy4uLy4uL2JlemllcmpzL2Jlemllci5qc1wiO1xuaW1wb3J0IHtDdXJ2ZUNvbW1hbmRUeXBlfSBmcm9tIFwiLi4vLi4vYmFzZS9jb21tYW5kX21hcHBlclwiO1xuXG5leHBvcnQgY2xhc3MgQ3VydmVDdXJ2ZUludGVyc2VjdG9yIGltcGxlbWVudHMgSW50ZXJzZWN0b3I8Q3VydmVDb21tYW5kVHlwZSwgQ3VydmVDb21tYW5kVHlwZT5cbntcbiAgICBpbnRlcnNlY3RzKGN1cnZlMTogQ3VydmVDb21tYW5kVHlwZSwgY3VydmUyOiBDdXJ2ZUNvbW1hbmRUeXBlKTogYm9vbGVhblxuICAgIHtcbiAgICAgICAgY29uc3QgY3VydmUxU3RhcnQgPSBWZWN0b3IuY3JlYXRlKGN1cnZlMS54MCwgY3VydmUxLnkwKTtcbiAgICAgICAgY29uc3QgY3VydmUxRW5kID0gVmVjdG9yLmNyZWF0ZShjdXJ2ZTEueCwgY3VydmUxLnkpO1xuICAgICAgICBjb25zdCBjdXJ2ZTJTdGFydCA9IFZlY3Rvci5jcmVhdGUoY3VydmUyLngwLCBjdXJ2ZTIueTApO1xuICAgICAgICBjb25zdCBjdXJ2ZTJFbmQgPSBWZWN0b3IuY3JlYXRlKGN1cnZlMi54LCBjdXJ2ZTIueSk7XG5cbiAgICAgICAgaWYgKHZlY3RvckVxdWFscyhjdXJ2ZTFTdGFydCwgY3VydmUyU3RhcnQpIHx8XG4gICAgICAgICAgICB2ZWN0b3JFcXVhbHMoY3VydmUxU3RhcnQsIGN1cnZlMkVuZCkgfHxcbiAgICAgICAgICAgIHZlY3RvckVxdWFscyhjdXJ2ZTFFbmQsIGN1cnZlMlN0YXJ0KSB8fFxuICAgICAgICAgICAgdmVjdG9yRXF1YWxzKGN1cnZlMUVuZCwgY3VydmUyRW5kKSlcbiAgICAgICAge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBiZXppZXIxID0gbmV3IEJlemllcihmaW5kQ3VydmVQb2ludHMoY3VydmUxKSk7XG4gICAgICAgIGNvbnN0IGJlemllcjIgPSBuZXcgQmV6aWVyKGZpbmRDdXJ2ZVBvaW50cyhjdXJ2ZTIpKTtcblxuICAgICAgICBjb25zdCByZXN1bHQgPSBiZXppZXIxLmN1cnZlaW50ZXJzZWN0cyhbYmV6aWVyMV0sIFtiZXppZXIyXSk7XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdC5sZW5ndGggIT09IDA7XG4gICAgfVxuXG4gICAgc3VwcG9ydGVkQ29tbWFuZFR5cGVzKCk6IFtzdHJpbmdbXSwgc3RyaW5nW11dXG4gICAge1xuICAgICAgICByZXR1cm4gW1tcIkNcIiwgXCJTXCIsIFwiUVwiXSwgW1wiQ1wiLCBcIlNcIiwgXCJRXCJdXTtcbiAgICB9XG59IiwiaW1wb3J0IHtJbnRlcnNlY3Rvcn0gZnJvbSBcIi4vaW50ZXJzZWN0b3JcIjtcbmltcG9ydCB7VmVjdG9yfSBmcm9tIFwibWF0dGVyLWpzXCI7XG5pbXBvcnQge3ZlY3RvckVxdWFsc30gZnJvbSBcIi4uLy4uL2Jhc2UvbWF0aF91dGlsc1wiO1xuaW1wb3J0IHtcbiAgICBDdXJ2ZVRvQ29tbWFuZE1hZGVBYnNvbHV0ZSwgTW92ZVRvQ29tbWFuZE1hZGVBYnNvbHV0ZSxcbiAgICBRdWFkcmF0aWNDdXJ2ZVRvQ29tbWFuZE1hZGVBYnNvbHV0ZSxcbiAgICBTbW9vdGhDdXJ2ZVRvQ29tbWFuZE1hZGVBYnNvbHV0ZVxufSBmcm9tIFwic3ZnLXBhdGgtcGFyc2VyXCI7XG5pbXBvcnQge0N1cnZlQ29tbWFuZFR5cGV9IGZyb20gXCIuLi8uLi9iYXNlL2NvbW1hbmRfbWFwcGVyXCI7XG5cbmV4cG9ydCBjbGFzcyBDdXJ2ZVBvaW50SW50ZXJzZWN0b3IgaW1wbGVtZW50cyBJbnRlcnNlY3RvcjxDdXJ2ZUNvbW1hbmRUeXBlLCBNb3ZlVG9Db21tYW5kTWFkZUFic29sdXRlPlxue1xuICAgIGludGVyc2VjdHMoY3VydmU6IEN1cnZlVG9Db21tYW5kTWFkZUFic29sdXRlIHwgU21vb3RoQ3VydmVUb0NvbW1hbmRNYWRlQWJzb2x1dGUgfCBRdWFkcmF0aWNDdXJ2ZVRvQ29tbWFuZE1hZGVBYnNvbHV0ZSwgcG9pbnQ6IE1vdmVUb0NvbW1hbmRNYWRlQWJzb2x1dGUpOiBib29sZWFuXG4gICAge1xuICAgICAgICBjb25zdCBjdXJ2ZVN0YXJ0ID0gVmVjdG9yLmNyZWF0ZShjdXJ2ZS54MCwgY3VydmUueTApO1xuICAgICAgICBjb25zdCBjdXJ2ZUVuZCA9IFZlY3Rvci5jcmVhdGUoY3VydmUueCwgY3VydmUueSk7XG4gICAgICAgIGNvbnN0IHBvaW50VmVjID0gVmVjdG9yLmNyZWF0ZShwb2ludC54LCBwb2ludC55KTtcblxuICAgICAgICByZXR1cm4gdmVjdG9yRXF1YWxzKGN1cnZlU3RhcnQsIHBvaW50VmVjKSB8fCB2ZWN0b3JFcXVhbHMoY3VydmVFbmQsIHBvaW50VmVjKTtcbiAgICB9XG5cbiAgICBzdXBwb3J0ZWRDb21tYW5kVHlwZXMoKTogW3N0cmluZ1tdLCBzdHJpbmdbXV1cbiAgICB7XG4gICAgICAgIHJldHVybiBbW1wiQ1wiLCBcIlNcIiwgXCJRXCJdLCBbXCJNXCJdXTtcbiAgICB9XG59IiwiaW1wb3J0IHtJbnRlcnNlY3Rvcn0gZnJvbSBcIi4vaW50ZXJzZWN0b3JcIjtcbmltcG9ydCB7VmVjdG9yfSBmcm9tIFwibWF0dGVyLWpzXCI7XG5pbXBvcnQge3ZlY3RvckVxdWFsc30gZnJvbSBcIi4uLy4uL2Jhc2UvbWF0aF91dGlsc1wiO1xuaW1wb3J0IHtNb3ZlVG9Db21tYW5kTWFkZUFic29sdXRlfSBmcm9tIFwic3ZnLXBhdGgtcGFyc2VyXCI7XG5cbmV4cG9ydCBjbGFzcyBQb2ludFBvaW50SW50ZXJzZWN0b3IgaW1wbGVtZW50cyBJbnRlcnNlY3RvcjxNb3ZlVG9Db21tYW5kTWFkZUFic29sdXRlLCBNb3ZlVG9Db21tYW5kTWFkZUFic29sdXRlPlxue1xuICAgIGludGVyc2VjdHMocG9pbnQxOiBNb3ZlVG9Db21tYW5kTWFkZUFic29sdXRlLCBwb2ludDI6IE1vdmVUb0NvbW1hbmRNYWRlQWJzb2x1dGUpOiBib29sZWFuXG4gICAge1xuICAgICAgICBjb25zdCBwb2ludDFWZWMgPSBWZWN0b3IuY3JlYXRlKHBvaW50MS54LCBwb2ludDEueSk7XG4gICAgICAgIGNvbnN0IHBvaW50MlZlYyA9IFZlY3Rvci5jcmVhdGUocG9pbnQyLngsIHBvaW50Mi55KTtcblxuICAgICAgICByZXR1cm4gdmVjdG9yRXF1YWxzKHBvaW50MVZlYywgcG9pbnQyVmVjKTtcbiAgICB9XG5cbiAgICBzdXBwb3J0ZWRDb21tYW5kVHlwZXMoKTogW3N0cmluZ1tdLCBzdHJpbmdbXV1cbiAgICB7XG4gICAgICAgIHJldHVybiBbW1wiTVwiXSwgW1wiTVwiXV07XG4gICAgfVxufSIsImltcG9ydCB7SW50ZXJzZWN0b3J9IGZyb20gXCIuL2NvbGxpc2lvbi9pbnRlcnNlY3RvclwiO1xuaW1wb3J0IHtDb21tYW5kfSBmcm9tIFwic3ZnLXBhdGgtcGFyc2VyXCI7XG5pbXBvcnQge0FnZ3JlZ2F0b3J9IGZyb20gXCIuL2FnZ3JlZ2F0b3JcIjtcbmltcG9ydCB7TGluZUxpbmVJbnRlcnNlY3Rvcn0gZnJvbSBcIi4vY29sbGlzaW9uL2xpbmVfbGluZV9pbnRlcnNlY3RvclwiO1xuaW1wb3J0IHtBZ2dyZWdhdGlvblRyZWV9IGZyb20gXCIuL2NvbGxpc2lvbi90cmVlL2FnZ3JlZ2F0aW9uX3RyZWVcIjtcbmltcG9ydCB7TGluZVBvaW50SW50ZXJzZWN0b3J9IGZyb20gXCIuL2NvbGxpc2lvbi9saW5lX3BvaW50X2ludGVyc2VjdG9yXCI7XG5pbXBvcnQge0xpbmVDdXJ2ZUludGVyc2VjdG9yfSBmcm9tIFwiLi9jb2xsaXNpb24vbGluZV9jdXJ2ZV9pbnRlcnNlY3RvclwiO1xuaW1wb3J0IHtDdXJ2ZUN1cnZlSW50ZXJzZWN0b3J9IGZyb20gXCIuL2NvbGxpc2lvbi9jdXJ2ZV9jdXJ2ZV9pbnRlcnNlY3RvclwiO1xuaW1wb3J0IHtDdXJ2ZVBvaW50SW50ZXJzZWN0b3J9IGZyb20gXCIuL2NvbGxpc2lvbi9jdXJ2ZV9wb2ludF9pbnRlcnNlY3RvclwiO1xuaW1wb3J0IHtQb2ludFBvaW50SW50ZXJzZWN0b3J9IGZyb20gXCIuL2NvbGxpc2lvbi9wb2ludF9wb2ludF9pbnRlcnNlY3RvclwiO1xuaW1wb3J0IHtBbGxDb21tYW5kVHlwZXN9IGZyb20gXCIuLi9iYXNlL2NvbW1hbmRfbWFwcGVyXCI7XG5cbmV4cG9ydCBjbGFzcyBDb2xsaXNpb25BZ2dyZWdhdG9yIGltcGxlbWVudHMgQWdncmVnYXRvclxue1xuICAgIHByaXZhdGUgX2ludGVyc2VjdG9yUmVnaXN0cnk6IEludGVyc2VjdG9yPEFsbENvbW1hbmRUeXBlcywgQWxsQ29tbWFuZFR5cGVzPltdO1xuXG4gICAgY29uc3RydWN0b3IoKVxuICAgIHtcbiAgICAgICAgdGhpcy5faW50ZXJzZWN0b3JSZWdpc3RyeSA9IFtuZXcgTGluZUxpbmVJbnRlcnNlY3RvcigpLCBuZXcgTGluZVBvaW50SW50ZXJzZWN0b3IoKSxcbiAgICAgICAgICAgIG5ldyBMaW5lQ3VydmVJbnRlcnNlY3RvcigpLCBuZXcgQ3VydmVDdXJ2ZUludGVyc2VjdG9yKCksIG5ldyBDdXJ2ZVBvaW50SW50ZXJzZWN0b3IoKSwgbmV3IFBvaW50UG9pbnRJbnRlcnNlY3RvcigpXTtcbiAgICB9XG5cbiAgICAvLyBhZ2dyZWdhdGUgY29tbWFuZHMgdG9nZXRoZXIgaWYgdGhleSBpbnRlcnNlY3RcbiAgICBhZ2dyZWdhdGUocGF0aENvbW1hbmRzOiBBbGxDb21tYW5kVHlwZXNbXVtdKTogQWxsQ29tbWFuZFR5cGVzW11bXVxuICAgIHtcbiAgICAgICAgY29uc3QgZmxhdENvbW1hbmRzID0gcGF0aENvbW1hbmRzXG4gICAgICAgICAgICAuZmxhdE1hcChjb21tYW5kcyA9PiBjb21tYW5kcyk7XG5cbiAgICAgICAgY29uc3QgYWdncmVnYXRpb25UcmVlID0gbmV3IEFnZ3JlZ2F0aW9uVHJlZTxBbGxDb21tYW5kVHlwZXM+KFxuICAgICAgICAgICAgKHNoYXBlMSwgc2hhcGUyKSA9PiB0aGlzLmludGVyc2VjdChzaGFwZTEsIHNoYXBlMiwgdGhpcy5faW50ZXJzZWN0b3JSZWdpc3RyeSkpO1xuXG4gICAgICAgIGZsYXRDb21tYW5kcy5mb3JFYWNoKGNvbW1hbmQgPT5cbiAgICAgICAge1xuICAgICAgICAgICAgYWdncmVnYXRpb25UcmVlLmFkZFZhbHVlKGNvbW1hbmQpO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gYWdncmVnYXRpb25UcmVlLmdldEFnZ3JlZ2F0ZWRDb21tYW5kcygpO1xuICAgIH1cblxuICAgIC8vIGZpbmQgaW50ZXJzZWN0b3IgZm9yIHR3byBjb21tYW5kcyBhbmQgY2FsbCBpdFxuICAgIHByaXZhdGUgaW50ZXJzZWN0KGNtZDE6IEFsbENvbW1hbmRUeXBlcywgY21kMjogQWxsQ29tbWFuZFR5cGVzLCByZWdpc3RyeTogSW50ZXJzZWN0b3I8QWxsQ29tbWFuZFR5cGVzLCBBbGxDb21tYW5kVHlwZXM+W10pOiBib29sZWFuXG4gICAge1xuICAgICAgICBjb25zdCBtYXRjaGluZ0ludGVyc2VjdG9yID0gcmVnaXN0cnkuZmluZChpbnRlcnNlY3RvciA9PlxuICAgICAgICB7XG4gICAgICAgICAgICBjb25zdCBjbWRUeXBlID0gaW50ZXJzZWN0b3Iuc3VwcG9ydGVkQ29tbWFuZFR5cGVzKCk7XG4gICAgICAgICAgICByZXR1cm4gKGNtZFR5cGVbMF0uaW5jbHVkZXMoY21kMS5jb2RlKSAmJiBjbWRUeXBlWzFdLmluY2x1ZGVzKGNtZDIuY29kZSkpIHx8XG4gICAgICAgICAgICAgICAgKGNtZFR5cGVbMV0uaW5jbHVkZXMoY21kMS5jb2RlKSAmJiBjbWRUeXBlWzBdLmluY2x1ZGVzKGNtZDIuY29kZSkpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAobWF0Y2hpbmdJbnRlcnNlY3RvciA9PT0gdW5kZWZpbmVkKVxuICAgICAgICB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGludGVyc2VjdG9yIG5vdCBkZWZpbmVkIGZvciB0eXBlcyAke2NtZDEuY29kZX0gJHtjbWQyLmNvZGV9YCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobWF0Y2hpbmdJbnRlcnNlY3Rvci5zdXBwb3J0ZWRDb21tYW5kVHlwZXMoKVswXS5pbmNsdWRlcyhjbWQxLmNvZGUpKVxuICAgICAgICB7XG4gICAgICAgICAgICByZXR1cm4gbWF0Y2hpbmdJbnRlcnNlY3Rvci5pbnRlcnNlY3RzKGNtZDEsIGNtZDIpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgcmV0dXJuIG1hdGNoaW5nSW50ZXJzZWN0b3IuaW50ZXJzZWN0cyhjbWQyLCBjbWQxKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCJpbXBvcnQge0FnZ3JlZ2F0b3J9IGZyb20gXCIuL2FnZ3JlZ2F0b3JcIjtcbmltcG9ydCB7QWxsQ29tbWFuZFR5cGVzfSBmcm9tIFwiLi4vYmFzZS9jb21tYW5kX21hcHBlclwiO1xuXG5leHBvcnQgY2xhc3MgUGF0aEFnZ3JlZ2F0b3IgaW1wbGVtZW50cyBBZ2dyZWdhdG9yXG57XG4gICAgYWdncmVnYXRlKHBhdGhDb21tYW5kczogQWxsQ29tbWFuZFR5cGVzW11bXSk6IEFsbENvbW1hbmRUeXBlc1tdW11cbiAgICB7XG4gICAgICAgIHJldHVybiBwYXRoQ29tbWFuZHM7XG4gICAgfVxuXG59IiwiaW1wb3J0IHtCb2RpZXMsIEJvZHksIFZlY3Rvcn0gZnJvbSBcIm1hdHRlci1qc1wiO1xuaW1wb3J0IHtMaW5lQ29tbWFuZFR5cGV9IGZyb20gXCIuLi8uLi9iYXNlL2NvbW1hbmRfbWFwcGVyXCI7XG5pbXBvcnQge2ZpbmRBbmdsZU9mTGluZUNvbW1hbmQsIGZpbmRDZW50ZXJPZkxpbmVDb21tYW5kLCBmaW5kTGVuZ3RoT2ZMaW5lQ29tbWFuZH0gZnJvbSBcIi4uLy4uL2Jhc2UvY29tbWFuZF91dGlsc1wiO1xuaW1wb3J0IHtDb21tYW5kQm9keX0gZnJvbSBcIi4vY29tbWFuZF9ib2R5XCI7XG5pbXBvcnQge3ZlY3RvckVxdWFsc30gZnJvbSBcIi4uLy4uL2Jhc2UvbWF0aF91dGlsc1wiO1xuaW1wb3J0IHtMaW5lVG9Db21tYW5kTWFkZUFic29sdXRlfSBmcm9tIFwic3ZnLXBhdGgtcGFyc2VyXCI7XG5cbmV4cG9ydCBjbGFzcyBMaW5lQm9keSBpbXBsZW1lbnRzIENvbW1hbmRCb2R5PExpbmVUb0NvbW1hbmRNYWRlQWJzb2x1dGU+XG57XG4gICAgcmVhZG9ubHkgX2JvZGllczogQm9keVtdO1xuICAgIHJlYWRvbmx5IF9saW5lQ21kOiBMaW5lVG9Db21tYW5kTWFkZUFic29sdXRlO1xuICAgIHJlYWRvbmx5IF9ib2R5OiBCb2R5O1xuICAgIHJlYWRvbmx5IF9wb2ludDogQm9keTtcblxuICAgIGNvbnN0cnVjdG9yKGxpbmVDbWQ6IExpbmVUb0NvbW1hbmRNYWRlQWJzb2x1dGUsIGNvbGxpZGVyU2l6ZTogbnVtYmVyKVxuICAgIHtcbiAgICAgICAgdGhpcy5fbGluZUNtZCA9IGxpbmVDbWQ7XG5cbiAgICAgICAgY29uc3QgbGluZU1pZFBvaW50ID0gZmluZENlbnRlck9mTGluZUNvbW1hbmQobGluZUNtZCk7XG4gICAgICAgIGNvbnN0IGxpbmVMZW5ndGggPSBmaW5kTGVuZ3RoT2ZMaW5lQ29tbWFuZChsaW5lQ21kKTtcbiAgICAgICAgY29uc3QgbGluZUFuZ2xlID0gZmluZEFuZ2xlT2ZMaW5lQ29tbWFuZChsaW5lQ21kKTtcblxuICAgICAgICBjb25zdCBwMSA9IFZlY3Rvci5jcmVhdGUobGluZUNtZC54LCBsaW5lQ21kLnkpO1xuICAgICAgICBjb25zdCBwMiA9IFZlY3Rvci5jcmVhdGUobGluZUNtZC54MCwgbGluZUNtZC55MCk7XG5cbiAgICAgICAgdGhpcy5fcG9pbnQgPSBCb2RpZXMuY2lyY2xlKGxpbmVDbWQueCwgbGluZUNtZC55LDEsIHtpc1NlbnNvcjogdHJ1ZX0pO1xuICAgICAgICBCb2R5LnNldERlbnNpdHkodGhpcy5fcG9pbnQsIDApO1xuXG4gICAgICAgIHRoaXMuX2JvZHkgPSBCb2RpZXMucmVjdGFuZ2xlKFxuICAgICAgICAgICAgbGluZU1pZFBvaW50LngsIGxpbmVNaWRQb2ludC55LCBsaW5lTGVuZ3RoLCBjb2xsaWRlclNpemUsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgYW5nbGU6IGxpbmVBbmdsZVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5fYm9kaWVzID0gW3RoaXMuX3BvaW50LCB0aGlzLl9ib2R5XTtcbiAgICB9XG5cbiAgICBnZXQgYm9kaWVzKCk6IEJvZHlbXVxuICAgIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2JvZGllcztcbiAgICB9XG5cbiAgICB1cGRhdGVTdmdDb21tYW5kKCk6IHZvaWRcbiAgICB7XG4gICAgICAgIHRoaXMuX2xpbmVDbWQueCA9IHRoaXMuX3BvaW50LnBvc2l0aW9uLng7XG4gICAgICAgIHRoaXMuX2xpbmVDbWQueSA9IHRoaXMuX3BvaW50LnBvc2l0aW9uLnk7XG4gICAgfVxuXG59XG4iLCJpbXBvcnQge0JvZGllcywgQm9keX0gZnJvbSBcIm1hdHRlci1qc1wiO1xuaW1wb3J0IHtNb3ZlVG9Db21tYW5kTWFkZUFic29sdXRlfSBmcm9tIFwic3ZnLXBhdGgtcGFyc2VyXCI7XG5pbXBvcnQge0NvbW1hbmRCb2R5fSBmcm9tIFwiLi9jb21tYW5kX2JvZHlcIjtcblxuZXhwb3J0IGNsYXNzIFBvaW50Qm9keSBpbXBsZW1lbnRzIENvbW1hbmRCb2R5PE1vdmVUb0NvbW1hbmRNYWRlQWJzb2x1dGU+XG57XG4gICAgcmVhZG9ubHkgX2JvZGllczogQm9keVtdO1xuICAgIHJlYWRvbmx5IF9wb2ludDogQm9keTtcbiAgICByZWFkb25seSBfbW92ZUNtZDogTW92ZVRvQ29tbWFuZE1hZGVBYnNvbHV0ZTtcblxuICAgIGNvbnN0cnVjdG9yKG1vdmVDbWQ6IE1vdmVUb0NvbW1hbmRNYWRlQWJzb2x1dGUpXG4gICAge1xuICAgICAgICB0aGlzLl9tb3ZlQ21kID0gbW92ZUNtZDtcblxuICAgICAgICB0aGlzLl9wb2ludCA9IEJvZGllcy5jaXJjbGUobW92ZUNtZC54LCBtb3ZlQ21kLnksMSxcbiAgICAgICAgICAgIHtyZW5kZXI6IHtmaWxsU3R5bGU6IFwid2hpdGVcIn0sIGlzU2Vuc29yOiB0cnVlfSk7XG4gICAgICAgIEJvZHkuc2V0RGVuc2l0eSh0aGlzLl9wb2ludCwgMCk7XG5cbiAgICAgICAgdGhpcy5fYm9kaWVzID0gW3RoaXMuX3BvaW50XTtcbiAgICB9XG5cbiAgICBnZXQgYm9kaWVzKCk6IEJvZHlbXVxuICAgIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2JvZGllcztcbiAgICB9XG5cbiAgICB1cGRhdGVTdmdDb21tYW5kKCk6IHZvaWRcbiAgICB7XG4gICAgICAgIHRoaXMuX21vdmVDbWQueCA9IHRoaXMuX3BvaW50LnBvc2l0aW9uLng7XG4gICAgICAgIHRoaXMuX21vdmVDbWQueSA9IHRoaXMuX3BvaW50LnBvc2l0aW9uLnk7XG4gICAgfVxuXG59IiwiaW1wb3J0IHtCZXppZXJ9IGZyb20gXCIuLi8uLi9iZXppZXJqcy9iZXppZXIuanNcIjtcbmltcG9ydCB7Qm9kaWVzLCBCb2R5LCBWZWN0b3J9IGZyb20gXCJtYXR0ZXItanNcIjtcbmltcG9ydCB7ZmluZERpc3RhbmNlVmVjLCBmaW5kQW5nbGV9IGZyb20gXCIuLi8uLi9iYXNlL21hdGhfdXRpbHNcIjtcbmltcG9ydCB7Q3VydmVDb21tYW5kVHlwZX0gZnJvbSBcIi4uLy4uL2Jhc2UvY29tbWFuZF9tYXBwZXJcIjtcbmltcG9ydCB7ZmluZEN1cnZlUG9pbnRzfSBmcm9tIFwiLi4vLi4vYmFzZS9jb21tYW5kX3V0aWxzXCI7XG5pbXBvcnQge0NvbW1hbmRCb2R5fSBmcm9tIFwiLi9jb21tYW5kX2JvZHlcIjtcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEFic3RyYWN0Q3VydmVCb2R5PFQgZXh0ZW5kcyBDdXJ2ZUNvbW1hbmRUeXBlPiBpbXBsZW1lbnRzIENvbW1hbmRCb2R5PFQ+XG57XG5cbiAgICBwcml2YXRlIGNyZWF0ZVBvaW50cyhiZXppZXI6IEJlemllciwgbnVtYmVyT2ZQb2ludHM6IG51bWJlcik6IHt4OiBudW1iZXIsIHk6IG51bWJlcn1bXVxuICAgIHtcbiAgICAgICAgY29uc3QgZnJhY3Rpb24gPSAxIC8gbnVtYmVyT2ZQb2ludHM7XG4gICAgICAgIHJldHVybiBBcnJheS5mcm9tKEFycmF5KG51bWJlck9mUG9pbnRzICsgMSkua2V5cygpKS5tYXAoaSA9PiBiZXppZXIuZ2V0KGkgKiBmcmFjdGlvbikpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBjcmVhdGVJbm5lckJvZGllcyhjb2xsaWRlclNpemU6IG51bWJlciwgY3VydmU6IEN1cnZlQ29tbWFuZFR5cGUpOiBCb2R5W11cbiAgICB7XG4gICAgICAgIGNvbnN0IGN1cnZlUG9pbnRzID0gZmluZEN1cnZlUG9pbnRzKGN1cnZlKTtcbiAgICAgICAgY29uc3QgYmV6aWVyUG9pbnRzID0gdGhpcy5jcmVhdGVQb2ludHMobmV3IEJlemllcihjdXJ2ZVBvaW50cyksIDMpO1xuXG4gICAgICAgIHJldHVybiBiZXppZXJQb2ludHNcbiAgICAgICAgICAgIC5maWx0ZXIoKGJwLCBpbmRleCkgPT4gaW5kZXggPCBiZXppZXJQb2ludHMubGVuZ3RoIC0gMSlcbiAgICAgICAgICAgIC5tYXAoKGJwLCBpbmRleCkgPT5cbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50ID0gVmVjdG9yLmNyZWF0ZShicC54LCBicC55KTtcbiAgICAgICAgICAgICAgICBjb25zdCBuZXh0ID0gVmVjdG9yLmNyZWF0ZShiZXppZXJQb2ludHNbaW5kZXggKyAxXS54LCBiZXppZXJQb2ludHNbaW5kZXggKyAxXS55KTtcbiAgICAgICAgICAgICAgICBjb25zdCBkaXJlY3Rpb24gPSBWZWN0b3Iubm9ybWFsaXNlKFZlY3Rvci5zdWIobmV4dCwgY3VycmVudCkpO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgbWlkUG9pbnQgPSBWZWN0b3IuY3JlYXRlKChjdXJyZW50LnggKyBuZXh0LngpIC8gMiwoY3VycmVudC55ICsgbmV4dC55KSAvIDIpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGQgPSBmaW5kRGlzdGFuY2VWZWMobmV4dCwgY3VycmVudCk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gQm9kaWVzLnJlY3RhbmdsZShtaWRQb2ludC54LCBtaWRQb2ludC55LCBkLCBjb2xsaWRlclNpemUsXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFuZ2xlOiBmaW5kQW5nbGUobmV4dC54LCBuZXh0LnksIGN1cnJlbnQueCwgY3VycmVudC55KVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pXG4gICAgfVxuXG4gICAgYWJzdHJhY3QgZ2V0IGJvZGllcygpOiBCb2R5W107XG5cbiAgICBhYnN0cmFjdCB1cGRhdGVTdmdDb21tYW5kKCk6IHZvaWQ7XG59IiwiaW1wb3J0IHtCb2RpZXMsIEJvZHl9IGZyb20gXCJtYXR0ZXItanNcIjtcbmltcG9ydCB7XG4gICAgQ3VydmVUb0NvbW1hbmRNYWRlQWJzb2x1dGUsXG59IGZyb20gXCJzdmctcGF0aC1wYXJzZXJcIjtcbmltcG9ydCB7QWJzdHJhY3RDdXJ2ZUJvZHl9IGZyb20gXCIuL2Fic3RyYWN0X2N1cnZlX2JvZHlcIjtcblxuZXhwb3J0IGNsYXNzIEN1cnZlQm9keSBleHRlbmRzIEFic3RyYWN0Q3VydmVCb2R5PEN1cnZlVG9Db21tYW5kTWFkZUFic29sdXRlPlxue1xuICAgIHJlYWRvbmx5IF9jdXJ2ZTogQ3VydmVUb0NvbW1hbmRNYWRlQWJzb2x1dGU7XG4gICAgcmVhZG9ubHkgX2JvZGllczogQm9keVtdO1xuICAgIHJlYWRvbmx5IF9wb2ludDE6IEJvZHk7XG4gICAgcmVhZG9ubHkgX3BvaW50MjogQm9keTtcbiAgICByZWFkb25seSBfcG9pbnQzOiBCb2R5O1xuXG4gICAgY29uc3RydWN0b3IoY3VydmU6IEN1cnZlVG9Db21tYW5kTWFkZUFic29sdXRlLCBjb2xsaWRlclNpemU6IG51bWJlcilcbiAgICB7XG4gICAgICAgIHN1cGVyKCk7XG5cbiAgICAgICAgdGhpcy5fY3VydmUgPSBjdXJ2ZTtcblxuICAgICAgICB0aGlzLl9ib2RpZXMgPSB0aGlzLmNyZWF0ZUlubmVyQm9kaWVzKGNvbGxpZGVyU2l6ZSwgY3VydmUpO1xuXG4gICAgICAgIHRoaXMuX3BvaW50MSA9IEJvZGllcy5jaXJjbGUoY3VydmUueCwgY3VydmUueSwxLFxuICAgICAgICAgICAge2lzU2Vuc29yOiB0cnVlLCByZW5kZXI6IHtmaWxsU3R5bGU6IFwibGlnaHRibHVlXCJ9fSk7XG4gICAgICAgIEJvZHkuc2V0RGVuc2l0eSh0aGlzLl9wb2ludDEsIDApO1xuICAgICAgICB0aGlzLl9ib2RpZXMucHVzaCh0aGlzLl9wb2ludDEpO1xuXG4gICAgICAgIHRoaXMuX3BvaW50MiA9IEJvZGllcy5jaXJjbGUoY3VydmUueDEsIGN1cnZlLnkxLDEsXG4gICAgICAgICAgICB7aXNTZW5zb3I6IHRydWUsIHJlbmRlcjoge2ZpbGxTdHlsZTogXCJsaWdodGJsdWVcIn19KTtcbiAgICAgICAgQm9keS5zZXREZW5zaXR5KHRoaXMuX3BvaW50MiwgMCk7XG4gICAgICAgIHRoaXMuX2JvZGllcy5wdXNoKHRoaXMuX3BvaW50Mik7XG5cbiAgICAgICAgdGhpcy5fcG9pbnQzID0gQm9kaWVzLmNpcmNsZShjdXJ2ZS54MiwgY3VydmUueTIsMSxcbiAgICAgICAgICAgIHtpc1NlbnNvcjogdHJ1ZSwgcmVuZGVyOiB7ZmlsbFN0eWxlOiBcImxpZ2h0Ymx1ZVwifX0pO1xuICAgICAgICBCb2R5LnNldERlbnNpdHkodGhpcy5fcG9pbnQzLCAwKTtcbiAgICAgICAgdGhpcy5fYm9kaWVzLnB1c2godGhpcy5fcG9pbnQzKTtcbiAgICB9XG5cbiAgICBnZXQgYm9kaWVzKCk6IEJvZHlbXVxuICAgIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2JvZGllcztcbiAgICB9XG5cbiAgICB1cGRhdGVTdmdDb21tYW5kKCk6IHZvaWRcbiAgICB7XG4gICAgICAgIHRoaXMuX2N1cnZlLnggPSB0aGlzLl9wb2ludDEucG9zaXRpb24ueDtcbiAgICAgICAgdGhpcy5fY3VydmUueSA9IHRoaXMuX3BvaW50MS5wb3NpdGlvbi55O1xuXG4gICAgICAgIHRoaXMuX2N1cnZlLngxID0gdGhpcy5fcG9pbnQyLnBvc2l0aW9uLng7XG4gICAgICAgIHRoaXMuX2N1cnZlLnkxID0gdGhpcy5fcG9pbnQyLnBvc2l0aW9uLnk7XG5cbiAgICAgICAgdGhpcy5fY3VydmUueDIgPSB0aGlzLl9wb2ludDMucG9zaXRpb24ueDtcbiAgICAgICAgdGhpcy5fY3VydmUueTIgPSB0aGlzLl9wb2ludDMucG9zaXRpb24ueTtcbiAgICB9XG59XG4iLCJpbXBvcnQge0JvZGllcywgQm9keX0gZnJvbSBcIm1hdHRlci1qc1wiO1xuaW1wb3J0IHtBYnN0cmFjdEN1cnZlQm9keX0gZnJvbSBcIi4vYWJzdHJhY3RfY3VydmVfYm9keVwiO1xuaW1wb3J0IHtcbiAgICBTbW9vdGhDdXJ2ZVRvQ29tbWFuZE1hZGVBYnNvbHV0ZVxufSBmcm9tIFwic3ZnLXBhdGgtcGFyc2VyXCI7XG5cbmV4cG9ydCBjbGFzcyBSZWZsZWN0aW9uQ3VydmVCb2R5IGV4dGVuZHMgQWJzdHJhY3RDdXJ2ZUJvZHk8U21vb3RoQ3VydmVUb0NvbW1hbmRNYWRlQWJzb2x1dGU+XG57XG4gICAgcmVhZG9ubHkgX2N1cnZlOiBTbW9vdGhDdXJ2ZVRvQ29tbWFuZE1hZGVBYnNvbHV0ZTtcbiAgICByZWFkb25seSBfYm9kaWVzOiBCb2R5W107XG4gICAgcmVhZG9ubHkgX3BvaW50MTogQm9keTtcbiAgICByZWFkb25seSBfcG9pbnQzOiBCb2R5XG5cbiAgICBjb25zdHJ1Y3RvcihjdXJ2ZTogU21vb3RoQ3VydmVUb0NvbW1hbmRNYWRlQWJzb2x1dGUsIGNvbGxpZGVyU2l6ZTogbnVtYmVyKVxuICAgIHtcbiAgICAgICAgc3VwZXIoKTtcblxuICAgICAgICB0aGlzLl9jdXJ2ZSA9IGN1cnZlO1xuXG4gICAgICAgIHRoaXMuX2JvZGllcyA9IHRoaXMuY3JlYXRlSW5uZXJCb2RpZXMoY29sbGlkZXJTaXplLCBjdXJ2ZSk7XG5cbiAgICAgICAgdGhpcy5fcG9pbnQxID0gQm9kaWVzLmNpcmNsZShjdXJ2ZS54LCBjdXJ2ZS55LDEsXG4gICAgICAgICAgICB7aXNTZW5zb3I6IHRydWUsIHJlbmRlcjoge2ZpbGxTdHlsZTogXCJsaWdodGJsdWVcIn19KTtcbiAgICAgICAgQm9keS5zZXREZW5zaXR5KHRoaXMuX3BvaW50MSwgMCk7XG4gICAgICAgIHRoaXMuX2JvZGllcy5wdXNoKHRoaXMuX3BvaW50MSk7XG5cbiAgICAgICAgdGhpcy5fcG9pbnQzID0gQm9kaWVzLmNpcmNsZShjdXJ2ZS54MiwgY3VydmUueTIsMSxcbiAgICAgICAgICAgIHtpc1NlbnNvcjogdHJ1ZSwgcmVuZGVyOiB7ZmlsbFN0eWxlOiBcImxpZ2h0Ymx1ZVwifX0pO1xuICAgICAgICBCb2R5LnNldERlbnNpdHkodGhpcy5fcG9pbnQzLCAwKTtcbiAgICAgICAgdGhpcy5fYm9kaWVzLnB1c2godGhpcy5fcG9pbnQzKTtcbiAgICB9XG5cbiAgICBnZXQgYm9kaWVzKCk6IEJvZHlbXVxuICAgIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2JvZGllcztcbiAgICB9XG5cbiAgICB1cGRhdGVTdmdDb21tYW5kKCk6IHZvaWRcbiAgICB7XG4gICAgICAgIHRoaXMuX2N1cnZlLnggPSB0aGlzLl9wb2ludDEucG9zaXRpb24ueDtcbiAgICAgICAgdGhpcy5fY3VydmUueSA9IHRoaXMuX3BvaW50MS5wb3NpdGlvbi55O1xuXG4gICAgICAgIHRoaXMuX2N1cnZlLngyID0gdGhpcy5fcG9pbnQzLnBvc2l0aW9uLng7XG4gICAgICAgIHRoaXMuX2N1cnZlLnkyID0gdGhpcy5fcG9pbnQzLnBvc2l0aW9uLnk7XG4gICAgfVxuXG59IiwiaW1wb3J0IHtBYnN0cmFjdEN1cnZlQm9keX0gZnJvbSBcIi4vYWJzdHJhY3RfY3VydmVfYm9keVwiO1xuaW1wb3J0IHtCb2RpZXMsIEJvZHl9IGZyb20gXCJtYXR0ZXItanNcIjtcbmltcG9ydCB7XG4gICAgUXVhZHJhdGljQ3VydmVUb0NvbW1hbmRNYWRlQWJzb2x1dGUsXG59IGZyb20gXCJzdmctcGF0aC1wYXJzZXJcIjtcblxuZXhwb3J0IGNsYXNzIFF1YWRyYXRpY0N1cnZlQm9keSBleHRlbmRzIEFic3RyYWN0Q3VydmVCb2R5PFF1YWRyYXRpY0N1cnZlVG9Db21tYW5kTWFkZUFic29sdXRlPlxue1xuICAgIHJlYWRvbmx5IF9jdXJ2ZTogUXVhZHJhdGljQ3VydmVUb0NvbW1hbmRNYWRlQWJzb2x1dGU7XG4gICAgcmVhZG9ubHkgX2JvZGllczogQm9keVtdO1xuICAgIHJlYWRvbmx5IF9wb2ludDE6IEJvZHk7XG4gICAgcmVhZG9ubHkgX3BvaW50MjogQm9keTtcblxuICAgIGNvbnN0cnVjdG9yKGN1cnZlOiBRdWFkcmF0aWNDdXJ2ZVRvQ29tbWFuZE1hZGVBYnNvbHV0ZSwgY29sbGlkZXJTaXplOiBudW1iZXIpXG4gICAge1xuICAgICAgICBzdXBlcigpO1xuXG4gICAgICAgIHRoaXMuX2N1cnZlID0gY3VydmU7XG5cbiAgICAgICAgdGhpcy5fYm9kaWVzID0gdGhpcy5jcmVhdGVJbm5lckJvZGllcyhjb2xsaWRlclNpemUsIGN1cnZlKTtcblxuICAgICAgICB0aGlzLl9wb2ludDEgPSBCb2RpZXMuY2lyY2xlKGN1cnZlLngsIGN1cnZlLnksMSxcbiAgICAgICAgICAgIHtpc1NlbnNvcjogdHJ1ZSwgcmVuZGVyOiB7ZmlsbFN0eWxlOiBcImxpZ2h0Ymx1ZVwifX0pO1xuICAgICAgICBCb2R5LnNldERlbnNpdHkodGhpcy5fcG9pbnQxLCAwKTtcbiAgICAgICAgdGhpcy5fYm9kaWVzLnB1c2godGhpcy5fcG9pbnQxKTtcblxuICAgICAgICB0aGlzLl9wb2ludDIgPSBCb2RpZXMuY2lyY2xlKGN1cnZlLngxLCBjdXJ2ZS55MSwxLFxuICAgICAgICAgICAge2lzU2Vuc29yOiB0cnVlLCByZW5kZXI6IHtmaWxsU3R5bGU6IFwibGlnaHRibHVlXCJ9fSk7XG4gICAgICAgIEJvZHkuc2V0RGVuc2l0eSh0aGlzLl9wb2ludDIsIDApO1xuICAgICAgICB0aGlzLl9ib2RpZXMucHVzaCh0aGlzLl9wb2ludDIpO1xuICAgIH1cblxuICAgIGdldCBib2RpZXMoKTogQm9keVtdXG4gICAge1xuICAgICAgICByZXR1cm4gdGhpcy5fYm9kaWVzO1xuICAgIH1cblxuICAgIHVwZGF0ZVN2Z0NvbW1hbmQoKTogdm9pZFxuICAgIHtcbiAgICAgICAgdGhpcy5fY3VydmUueCA9IHRoaXMuX3BvaW50MS5wb3NpdGlvbi54O1xuICAgICAgICB0aGlzLl9jdXJ2ZS55ID0gdGhpcy5fcG9pbnQxLnBvc2l0aW9uLnk7XG5cbiAgICAgICAgdGhpcy5fY3VydmUueDEgPSB0aGlzLl9wb2ludDIhLnBvc2l0aW9uLng7XG4gICAgICAgIHRoaXMuX2N1cnZlLnkxID0gdGhpcy5fcG9pbnQyIS5wb3NpdGlvbi55O1xuICAgIH1cblxufSIsImltcG9ydCB7Q29tbWFuZEJvZHl9IGZyb20gXCIuL2NvbW1hbmRfYm9keVwiO1xuaW1wb3J0IHtDbG9zZVBhdGhDb21tYW5kTWFkZUFic29sdXRlfSBmcm9tIFwic3ZnLXBhdGgtcGFyc2VyXCI7XG5pbXBvcnQge0JvZGllcywgQm9keSwgVmVjdG9yfSBmcm9tIFwibWF0dGVyLWpzXCI7XG5pbXBvcnQge0xpbmVDb21tYW5kVHlwZX0gZnJvbSBcIi4uLy4uL2Jhc2UvY29tbWFuZF9tYXBwZXJcIjtcbmltcG9ydCB7ZmluZEFuZ2xlT2ZMaW5lQ29tbWFuZCwgZmluZENlbnRlck9mTGluZUNvbW1hbmQsIGZpbmRMZW5ndGhPZkxpbmVDb21tYW5kfSBmcm9tIFwiLi4vLi4vYmFzZS9jb21tYW5kX3V0aWxzXCI7XG5pbXBvcnQge3ZlY3RvckVxdWFsc30gZnJvbSBcIi4uLy4uL2Jhc2UvbWF0aF91dGlsc1wiO1xuXG5leHBvcnQgY2xhc3MgQ2xvc2VQYXRoQm9keSBpbXBsZW1lbnRzIENvbW1hbmRCb2R5PENsb3NlUGF0aENvbW1hbmRNYWRlQWJzb2x1dGU+XG57XG4gICAgcmVhZG9ubHkgX2JvZGllczogQm9keVtdO1xuICAgIHJlYWRvbmx5IF9jbG9zZUNtZDogTGluZUNvbW1hbmRUeXBlO1xuXG4gICAgY29uc3RydWN0b3IoY2xvc2VDbWQ6IExpbmVDb21tYW5kVHlwZSlcbiAgICB7XG4gICAgICAgIHRoaXMuX2Nsb3NlQ21kID0gY2xvc2VDbWQ7XG5cbiAgICAgICAgLy8gVE9ETzogcGFyYW1ldHJpemVcbiAgICAgICAgY29uc3QgaGVpZ2h0ID0gNTtcblxuICAgICAgICBjb25zdCBwMSA9IFZlY3Rvci5jcmVhdGUoY2xvc2VDbWQueCwgY2xvc2VDbWQueSk7XG4gICAgICAgIGNvbnN0IHAyID0gVmVjdG9yLmNyZWF0ZShjbG9zZUNtZC54MCwgY2xvc2VDbWQueTApO1xuXG4gICAgICAgIGlmICghdmVjdG9yRXF1YWxzKHAxLCBwMikpXG4gICAgICAgIHtcbiAgICAgICAgICAgIGNvbnN0IGxpbmVNaWRQb2ludCA9IGZpbmRDZW50ZXJPZkxpbmVDb21tYW5kKGNsb3NlQ21kKTtcbiAgICAgICAgICAgIGNvbnN0IGxpbmVMZW5ndGggPSBmaW5kTGVuZ3RoT2ZMaW5lQ29tbWFuZChjbG9zZUNtZCk7XG4gICAgICAgICAgICBjb25zdCBsaW5lQW5nbGUgPSBmaW5kQW5nbGVPZkxpbmVDb21tYW5kKGNsb3NlQ21kKTtcblxuICAgICAgICAgICAgY29uc3QgYm9keSA9IEJvZGllcy5yZWN0YW5nbGUoXG4gICAgICAgICAgICAgICAgbGluZU1pZFBvaW50LngsIGxpbmVNaWRQb2ludC55LCBsaW5lTGVuZ3RoLCBoZWlnaHQsXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBhbmdsZTogbGluZUFuZ2xlXG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHRoaXMuX2JvZGllcyA9IFtib2R5XTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMuX2JvZGllcyA9IFtdO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0IGJvZGllcygpOiBCb2R5W11cbiAgICB7XG4gICAgICAgIHJldHVybiB0aGlzLl9ib2RpZXM7XG4gICAgfVxuXG4gICAgdXBkYXRlU3ZnQ29tbWFuZCgpOiB2b2lkXG4gICAge1xuICAgICAgICAvLyBGb3IgWiBjb21tYW5kIGRvbid0IHVwZGF0ZSBhbnl0aGluZ1xuICAgIH1cblxufSIsImltcG9ydCAqIGFzIE1hdHRlciBmcm9tIFwibWF0dGVyLWpzXCI7XG5pbXBvcnQge0JvZHksIFdvcmxkfSBmcm9tIFwibWF0dGVyLWpzXCI7XG5pbXBvcnQge1N2Z0RhdGF9IGZyb20gXCIuLi9iYXNlL3N2Z19kYXRhXCI7XG5pbXBvcnQge0FsbENvbW1hbmRUeXBlc30gZnJvbSBcIi4uL2Jhc2UvY29tbWFuZF9tYXBwZXJcIjtcbmltcG9ydCB7ZmluZENlbnRlck9mQ29tbWFuZH0gZnJvbSBcIi4uL2Jhc2UvY29tbWFuZF91dGlsc1wiO1xuaW1wb3J0IHtwaHlzQm9keUZhY3Rvcnl9IGZyb20gXCIuL2JvZHkvYm9keV9mYWN0b3J5XCI7XG5pbXBvcnQge0NvbW1hbmRCb2R5fSBmcm9tIFwiLi9ib2R5L2NvbW1hbmRfYm9keVwiO1xuaW1wb3J0IHtCb2R5Q29uZmlnfSBmcm9tIFwiLi9ib2R5L2JvZHlfY29uZmlnXCI7XG5pbXBvcnQge1BoeXNpY3NQbHVnaW59IGZyb20gXCIuL3BoeXNpY3NfcGx1Z2luXCI7XG5cbmNvbnN0IEVuZ2luZSA9IE1hdHRlci5FbmdpbmU7XG5jb25zdCBSdW5uZXIgPSBNYXR0ZXIuUnVubmVyO1xuY29uc3QgQm9kaWVzID0gTWF0dGVyLkJvZGllcztcblxuZXhwb3J0IGNsYXNzIE1hdHRlckpzUGh5c2ljc1xue1xuICAgIHJlYWRvbmx5IF9zdmdEYXRhOiBTdmdEYXRhO1xuICAgIHJlYWRvbmx5IF9lbmdpbmU6IE1hdHRlci5FbmdpbmU7XG4gICAgcmVhZG9ubHkgX3dvcmxkOiBNYXR0ZXIuV29ybGQ7XG4gICAgcHJpdmF0ZSBfY29tbWFuZEJvZGllczogQ29tbWFuZEJvZHk8QWxsQ29tbWFuZFR5cGVzPltdO1xuICAgIHByaXZhdGUgX3BsdWdpbnM6IFBoeXNpY3NQbHVnaW5bXTtcblxuICAgIGNvbnN0cnVjdG9yKHN2Z0RhdGE6IFN2Z0RhdGEsIGdsb2JhbENvbmZpZzogQm9keUNvbmZpZywgcGx1Z2luczogUGh5c2ljc1BsdWdpbltdKVxuICAgIHtcbiAgICAgICAgdGhpcy5fc3ZnRGF0YSA9IHN2Z0RhdGE7XG4gICAgICAgIHRoaXMuX2VuZ2luZSA9IEVuZ2luZS5jcmVhdGUoKTtcbiAgICAgICAgdGhpcy5fd29ybGQgPSB0aGlzLl9lbmdpbmUud29ybGQ7XG4gICAgICAgIHRoaXMuX2NvbW1hbmRCb2RpZXMgPSBbXTtcbiAgICAgICAgdGhpcy5fcGx1Z2lucyA9IHBsdWdpbnM7XG4gICAgICAgIGNvbnN0IHJvb3RCb2RpZXM6IEJvZHlbXSA9IFtdO1xuXG4gICAgICAgIHN2Z0RhdGEuYWdncmVnYXRlZENvbW1hbmRzLmZvckVhY2goY29tbWFuZHMgPT5cbiAgICAgICAge1xuICAgICAgICAgICAgY29uc3QgbWlkWCA9IGNvbW1hbmRzXG4gICAgICAgICAgICAgICAgLm1hcChjb21tYW5kID0+IGZpbmRDZW50ZXJPZkNvbW1hbmQoY29tbWFuZCkueClcbiAgICAgICAgICAgICAgICAucmVkdWNlKChhY2MsIGN1cikgPT4gYWNjICsgY3VyKSAvIGNvbW1hbmRzLmxlbmd0aDtcbiAgICAgICAgICAgIGNvbnN0IG1pZFkgPSBjb21tYW5kc1xuICAgICAgICAgICAgICAgIC5tYXAoY29tbWFuZCA9PiBmaW5kQ2VudGVyT2ZDb21tYW5kKGNvbW1hbmQpLnkpXG4gICAgICAgICAgICAgICAgLnJlZHVjZSgoYWNjLCBjdXIpID0+IGFjYyArIGN1cikgLyBjb21tYW5kcy5sZW5ndGg7XG5cbiAgICAgICAgICAgIGNvbnN0IHJvb3RCb2R5ID0gQm9kaWVzLmNpcmNsZShtaWRYLCBtaWRZLCAzMDAwLCBnbG9iYWxDb25maWcpO1xuXG4gICAgICAgICAgICBjb25zdCBjb21tYW5kQm9kaWVzID0gY29tbWFuZHMubWFwKGNvbW1hbmQgPT4gcGh5c0JvZHlGYWN0b3J5KGNvbW1hbmQsIGdsb2JhbENvbmZpZy5jb2xsaWRlcldpZHRoKSk7XG4gICAgICAgICAgICB0aGlzLl9jb21tYW5kQm9kaWVzID0gdGhpcy5fY29tbWFuZEJvZGllcy5jb25jYXQoY29tbWFuZEJvZGllcyk7XG5cbiAgICAgICAgICAgIGNvbnN0IHBoeXNCb2RpZXMgPSBjb21tYW5kQm9kaWVzLm1hcChwaHlzQm9keSA9PiBwaHlzQm9keS5ib2RpZXMpLmZsYXRNYXAoYm9keSA9PiBib2R5KTtcbiAgICAgICAgICAgIEJvZHkuc2V0UGFydHMocm9vdEJvZHksIHBoeXNCb2RpZXMsIGZhbHNlKTtcbiAgICAgICAgICAgIFdvcmxkLmFkZCh0aGlzLl93b3JsZCwgcm9vdEJvZHkpO1xuXG4gICAgICAgICAgICByb290Qm9kaWVzLnB1c2gocm9vdEJvZHkpO1xuICAgICAgICB9KTtcblxuICAgICAgICBwbHVnaW5zLmZvckVhY2gocGx1Z2luID0+IHBsdWdpbi5zZXR1cChzdmdEYXRhLCB0aGlzLl9lbmdpbmUsIHJvb3RCb2RpZXMpKTtcbiAgICB9XG5cbiAgICB1cGRhdGUoYWdncmVnYXRlZFNoYXBlczogQWxsQ29tbWFuZFR5cGVzW11bXSk6IHZvaWRcbiAgICB7XG4gICAgICAgIC8vIHVwZGF0ZSBwaHlzaWNzXG4gICAgICAgIEVuZ2luZS51cGRhdGUodGhpcy5fZW5naW5lKTtcbiAgICAgICAgdGhpcy5fY29tbWFuZEJvZGllcy5mb3JFYWNoKGJvZHkgPT4gYm9keS51cGRhdGVTdmdDb21tYW5kKCkpO1xuICAgIH1cblxuICAgIHN0b3AoKTogdm9pZFxuICAgIHtcbiAgICAgICAgdGhpcy5fcGx1Z2lucy5mb3JFYWNoKHBsdWdpbiA9PiBwbHVnaW4uc3RvcCgpKTtcbiAgICB9XG5cbn0iLCJpbXBvcnQge1dvcmxkLCBCb2R5fSBmcm9tIFwibWF0dGVyLWpzXCI7XG5pbXBvcnQge0xpbmVCb2R5fSBmcm9tIFwiLi9saW5lX2JvZHlcIjtcbmltcG9ydCB7UG9pbnRCb2R5fSBmcm9tIFwiLi9wb2ludF9ib2R5XCI7XG5pbXBvcnQge0N1cnZlQm9keX0gZnJvbSBcIi4vY3VydmVfYm9keVwiO1xuaW1wb3J0IHtSZWZsZWN0aW9uQ3VydmVCb2R5fSBmcm9tIFwiLi9yZWZsZWN0aW9uX2N1cnZlX2JvZHlcIjtcbmltcG9ydCB7UXVhZHJhdGljQ3VydmVCb2R5fSBmcm9tIFwiLi9xdWFkcmF0aWNfY3VydmVfYm9keVwiO1xuaW1wb3J0IHtBbGxDb21tYW5kVHlwZXN9IGZyb20gXCIuLi8uLi9iYXNlL2NvbW1hbmRfbWFwcGVyXCI7XG5pbXBvcnQge0NvbW1hbmRCb2R5fSBmcm9tIFwiLi9jb21tYW5kX2JvZHlcIjtcbmltcG9ydCB7Q2xvc2VQYXRoQm9keX0gZnJvbSBcIi4vY2xvc2VfcGF0aF9ib2R5XCI7XG5cbmV4cG9ydCBjb25zdCBwaHlzQm9keUZhY3RvcnkgPSAoY29tbWFuZDogQWxsQ29tbWFuZFR5cGVzLCBjb2xsaWRlclNpemU6IG51bWJlcik6IENvbW1hbmRCb2R5PEFsbENvbW1hbmRUeXBlcz4gPT5cbntcbiAgICBzd2l0Y2ggKGNvbW1hbmQuY29kZSlcbiAgICB7XG4gICAgICAgIGNhc2UgXCJMXCI6XG4gICAgICAgIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgTGluZUJvZHkoY29tbWFuZCwgY29sbGlkZXJTaXplKTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlIFwiTVwiOlxuICAgICAgICB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFBvaW50Qm9keShjb21tYW5kKTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlIFwiQ1wiOlxuICAgICAgICB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEN1cnZlQm9keShjb21tYW5kLCBjb2xsaWRlclNpemUpO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgXCJRXCI6XG4gICAgICAgIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUXVhZHJhdGljQ3VydmVCb2R5KGNvbW1hbmQsIGNvbGxpZGVyU2l6ZSk7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBcIlNcIjpcbiAgICAgICAge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBSZWZsZWN0aW9uQ3VydmVCb2R5KGNvbW1hbmQsIGNvbGxpZGVyU2l6ZSk7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBcIlRcIjpcbiAgICAgICAge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVCBub3Qgc3VwcG9ydGVkIHlldCFcIik7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBcIlpcIjpcbiAgICAgICAge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBDbG9zZVBhdGhCb2R5KGNvbW1hbmQpO1xuICAgICAgICB9XG4gICAgfVxufSIsImltcG9ydCB7Q29tbWFuZE1hZGVBYnNvbHV0ZX0gZnJvbSBcInN2Zy1wYXRoLXBhcnNlclwiO1xuaW1wb3J0IHtBbGxDb21tYW5kVHlwZXN9IGZyb20gXCIuL2NvbW1hbmRfbWFwcGVyXCI7XG5cbmV4cG9ydCBjbGFzcyBTdmdEYXRhXG57XG4gICAgcHJpdmF0ZSByZWFkb25seSBfc3ZnOiBIVE1MRWxlbWVudDtcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9zdHJva2VXaWR0aDogbnVtYmVyO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX3dpZHRoOiBudW1iZXI7XG4gICAgcHJpdmF0ZSByZWFkb25seSBfaGVpZ2h0OiBudW1iZXI7XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IF92aWV3Qm94OiB7bWlueDogbnVtYmVyLCBtaW55OiBudW1iZXI7IHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyfSB8IHVuZGVmaW5lZDtcblxuICAgIHByaXZhdGUgcmVhZG9ubHkgX3BhdGhDb21tYW5kczogQ29tbWFuZE1hZGVBYnNvbHV0ZVtdW107XG4gICAgcHJpdmF0ZSByZWFkb25seSBfYWdncmVnYXRlZENvbW1hbmRzOiBBbGxDb21tYW5kVHlwZXNbXVtdO1xuXG4gICAgY29uc3RydWN0b3Ioc3ZnOiBIVE1MRWxlbWVudCwgcGF0aENvbW1hbmRzOiBDb21tYW5kTWFkZUFic29sdXRlW11bXSwgYWdncmVnYXRlZENvbW1hbmRzOiBBbGxDb21tYW5kVHlwZXNbXVtdKVxuICAgIHtcbiAgICAgICAgdGhpcy5fc3ZnID0gc3ZnO1xuICAgICAgICAvLyB0aGlzLl9zdHJva2VXaWR0aCA9IE51bWJlcihzdmcuZ2V0QXR0cmlidXRlKFwic3Ryb2tlLXdpZHRoXCIpIS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoXCJweFwiLCBcIlwiKSk7XG4gICAgICAgIHRoaXMuX3N0cm9rZVdpZHRoID0gMTU7XG4gICAgICAgIHRoaXMuX3dpZHRoID0gc3ZnLmNsaWVudFdpZHRoO1xuICAgICAgICB0aGlzLl9oZWlnaHQgPSBzdmcuY2xpZW50SGVpZ2h0O1xuXG4gICAgICAgIHRoaXMuX3BhdGhDb21tYW5kcyA9IHBhdGhDb21tYW5kcztcbiAgICAgICAgdGhpcy5fYWdncmVnYXRlZENvbW1hbmRzID0gYWdncmVnYXRlZENvbW1hbmRzO1xuXG4gICAgICAgIGNvbnN0IHZpZXdCb3hTdHJpbmcgPSBzdmcuZ2V0QXR0cmlidXRlKFwidmlld0JveFwiKTtcbiAgICAgICAgaWYgKHZpZXdCb3hTdHJpbmcgPT09IG51bGwpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB2YWx1ZXMgPSB2aWV3Qm94U3RyaW5nLnNwbGl0KC9bICxdLykuZmlsdGVyKEJvb2xlYW4pLm1hcChOdW1iZXIpO1xuXG4gICAgICAgIHRoaXMuX3ZpZXdCb3ggPSB7bWlueDogdmFsdWVzWzBdLCBtaW55OiB2YWx1ZXNbMV0sIHdpZHRoOiB2YWx1ZXNbMl0sIGhlaWdodDogdmFsdWVzWzNdfTtcbiAgICB9XG5cbiAgICBnZXQgcGF0aENvbW1hbmRzKCk6IENvbW1hbmRNYWRlQWJzb2x1dGVbXVtdXG4gICAge1xuICAgICAgICByZXR1cm4gdGhpcy5fcGF0aENvbW1hbmRzO1xuICAgIH1cblxuICAgIGdldCBhZ2dyZWdhdGVkQ29tbWFuZHMoKTogQWxsQ29tbWFuZFR5cGVzW11bXVxuICAgIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FnZ3JlZ2F0ZWRDb21tYW5kcztcbiAgICB9XG5cbiAgICBnZXQgc3ZnKCk6IEhUTUxFbGVtZW50XG4gICAge1xuICAgICAgICByZXR1cm4gdGhpcy5fc3ZnO1xuICAgIH1cblxuICAgIGdldCB3aWR0aCgpOiBudW1iZXJcbiAgICB7XG4gICAgICAgIHJldHVybiB0aGlzLl93aWR0aDtcbiAgICB9XG5cbiAgICBnZXQgaGVpZ2h0KCk6IG51bWJlclxuICAgIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2hlaWdodDtcbiAgICB9XG5cbiAgICBnZXQgdmlld0JveCgpOiB7bWlueDogbnVtYmVyLCBtaW55OiBudW1iZXI7IHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyfSB8IHVuZGVmaW5lZFxuICAgIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3ZpZXdCb3g7XG4gICAgfVxuXG4gICAgLy8gVE9ETzogY2FsY3VsYXRlXG4gICAgZ2V0IHJlbGF0aXZlU3Ryb2tlV2lkdGgoKTogbnVtYmVyXG4gICAge1xuICAgICAgICByZXR1cm4gdGhpcy5fc3Ryb2tlV2lkdGg7XG4gICAgfVxufSIsImltcG9ydCB7XG4gICAgQ2xvc2VQYXRoQ29tbWFuZE1hZGVBYnNvbHV0ZSxcbiAgICBDb21tYW5kLCBDb21tYW5kTWFkZUFic29sdXRlLFxuICAgIEN1cnZlVG9Db21tYW5kTWFkZUFic29sdXRlLFxuICAgIEhvcml6b250YWxMaW5lVG9Db21tYW5kTWFkZUFic29sdXRlLFxuICAgIExpbmVUb0NvbW1hbmRNYWRlQWJzb2x1dGUsIE1vdmVUb0NvbW1hbmRNYWRlQWJzb2x1dGUsXG4gICAgUXVhZHJhdGljQ3VydmVUb0NvbW1hbmRNYWRlQWJzb2x1dGUsXG4gICAgU21vb3RoQ3VydmVUb0NvbW1hbmRNYWRlQWJzb2x1dGUsIFNtb290aFF1YWRyYXRpY0N1cnZlVG9Db21tYW5kTWFkZUFic29sdXRlLFxuICAgIFZlcnRpY2FsTGluZVRvQ29tbWFuZE1hZGVBYnNvbHV0ZVxufSBmcm9tIFwic3ZnLXBhdGgtcGFyc2VyXCI7XG5pbXBvcnQge2ZpbmRMZW5ndGhPZkxpbmVDb21tYW5kfSBmcm9tIFwiLi9jb21tYW5kX3V0aWxzXCI7XG5cbmV4cG9ydCB0eXBlIEFsbENvbW1hbmRUeXBlcyA9IChDdXJ2ZUNvbW1hbmRUeXBlIHwgTGluZUNvbW1hbmRUeXBlIHwgTW92ZVRvQ29tbWFuZE1hZGVBYnNvbHV0ZSk7XG5cbmV4cG9ydCB0eXBlIEN1cnZlQ29tbWFuZFR5cGUgPSAoQ3VydmVUb0NvbW1hbmRNYWRlQWJzb2x1dGUgfFxuICAgIFNtb290aEN1cnZlVG9Db21tYW5kTWFkZUFic29sdXRlIHxcbiAgICBRdWFkcmF0aWNDdXJ2ZVRvQ29tbWFuZE1hZGVBYnNvbHV0ZSB8XG4gICAgU21vb3RoUXVhZHJhdGljQ3VydmVUb0NvbW1hbmRNYWRlQWJzb2x1dGUpO1xuXG5leHBvcnQgdHlwZSBMaW5lQ29tbWFuZFR5cGUgPSAoTGluZVRvQ29tbWFuZE1hZGVBYnNvbHV0ZSB8IENsb3NlUGF0aENvbW1hbmRNYWRlQWJzb2x1dGUpO1xuXG4vLyBleHBhbmQgc2hvcnRlbiBsaW5lIGNvbW1hbmRzIHRvIGZ1bGwgbGluZSBjb21tYW5kc1xuZXhwb3J0IGNvbnN0IGV4cGFuZENvbW1hbmRzID0gKGNvbW1hbmRzOiBDb21tYW5kTWFkZUFic29sdXRlW10pOiBBbGxDb21tYW5kVHlwZXNbXSA9Plxue1xuICAgIHJldHVybiBjb21tYW5kc1xuICAgICAgICAuZmlsdGVyKGNvbW1hbmQgPT5cbiAgICAgICAge1xuICAgICAgICAgICAgc3dpdGNoIChjb21tYW5kLmNvZGUpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY2FzZSAnWic6XG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAvLyBmaWx0ZXIgWiBjb21tYW5kcyB0aGF0IGRvbid0IGhhdmUgbGVuZ3RoXG4gICAgICAgICAgICAgICAgICAgIGlmIChmaW5kTGVuZ3RoT2ZMaW5lQ29tbWFuZChjb21tYW5kKSA9PT0gMClcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgICAubWFwKGNvbW1hbmQgPT5cbiAgICAgICAge1xuICAgICAgICAgICAgc3dpdGNoIChjb21tYW5kLmNvZGUpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY2FzZSAnSCc6XG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IExpbmUoY29tbWFuZC54LCBjb21tYW5kLnksIGNvbW1hbmQueDAsIGNvbW1hbmQueTApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXNlICdWJzpcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgTGluZShjb21tYW5kLngsIGNvbW1hbmQueSwgY29tbWFuZC54MCwgY29tbWFuZC55MCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhc2UgXCJBXCI6XG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJBIG5vdCBzdXBwb3J0ZWQgeWV0XCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbW1hbmQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KVxufVxuXG5leHBvcnQgY2xhc3MgTGluZSBpbXBsZW1lbnRzIExpbmVUb0NvbW1hbmRNYWRlQWJzb2x1dGVcbntcbiAgICBjb2RlOiAnTCc7XG4gICAgY29tbWFuZDogXCJsaW5ldG9cIjtcbiAgICByZWxhdGl2ZTogZmFsc2U7XG4gICAgeDogbnVtYmVyO1xuICAgIHgwOiBudW1iZXI7XG4gICAgeTogbnVtYmVyO1xuICAgIHkwOiBudW1iZXI7XG5cbiAgICBjb25zdHJ1Y3Rvcih4OiBudW1iZXIsIHk6IG51bWJlciwgeDA6IG51bWJlciwgeTA6IG51bWJlcilcbiAgICB7XG4gICAgICAgIHRoaXMuY29kZSA9ICdMJztcbiAgICAgICAgdGhpcy5yZWxhdGl2ZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLmNvbW1hbmQgPSBcImxpbmV0b1wiO1xuICAgICAgICB0aGlzLnggPSB4O1xuICAgICAgICB0aGlzLnkgPSB5O1xuICAgICAgICB0aGlzLngwID0geDA7XG4gICAgICAgIHRoaXMueTAgPSB5MDtcbiAgICB9XG59IiwiaW1wb3J0IHtQaHlzaWNzUGx1Z2lufSBmcm9tIFwiLi4vcGh5c2ljc19wbHVnaW5cIjtcbmltcG9ydCB7RW5naW5lLCBCb2R5fSBmcm9tIFwibWF0dGVyLWpzXCI7XG5pbXBvcnQge1N2Z0RhdGF9IGZyb20gXCIuLi8uLi9iYXNlL3N2Z19kYXRhXCI7XG5cbmV4cG9ydCBjbGFzcyBHcmF2aXR5UGx1Z2luIGltcGxlbWVudHMgUGh5c2ljc1BsdWdpblxue1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX2dyYXZpdHk6IHt4OiBudW1iZXIsIHk6IG51bWJlcn07XG5cbiAgICBjb25zdHJ1Y3RvcihncmF2aXR5OiB7eDogbnVtYmVyLCB5OiBudW1iZXJ9KVxuICAgIHtcbiAgICAgICAgdGhpcy5fZ3Jhdml0eSA9IGdyYXZpdHk7XG4gICAgfVxuXG4gICAgc2V0dXAoc3ZnRGF0YTogU3ZnRGF0YSwgZW5naW5lOiBFbmdpbmUsIHJvb3RCb2RpZXM6IEJvZHlbXSk6IHZvaWRcbiAgICB7XG4gICAgICAgIGVuZ2luZS5ncmF2aXR5LnggPSB0aGlzLl9ncmF2aXR5Lng7XG4gICAgICAgIGVuZ2luZS5ncmF2aXR5LnkgPSB0aGlzLl9ncmF2aXR5Lnk7XG4gICAgfVxuXG4gICAgc3RvcCgpOiB2b2lkXG4gICAge1xuICAgICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuXG59IiwiaW1wb3J0IHtQaHlzaWNzUGx1Z2lufSBmcm9tIFwiLi4vcGh5c2ljc19wbHVnaW5cIjtcbmltcG9ydCB7Qm9kaWVzLCBFbmdpbmUsIFdvcmxkLCBCb2R5fSBmcm9tIFwibWF0dGVyLWpzXCI7XG5pbXBvcnQge1N2Z0RhdGF9IGZyb20gXCIuLi8uLi9iYXNlL3N2Z19kYXRhXCI7XG5cbmV4cG9ydCBjbGFzcyBWaWV3Q29sbGlkZXJCb3JkZXIgaW1wbGVtZW50cyBQaHlzaWNzUGx1Z2luXG57XG4gICAgc2V0dXAoc3ZnRGF0YTogU3ZnRGF0YSwgZW5naW5lOiBFbmdpbmUsIHJvb3RCb2RpZXM6IEJvZHlbXSk6IHZvaWRcbiAgICB7XG4gICAgICAgIGNvbnN0IHdvcmxkID0gZW5naW5lLndvcmxkO1xuXG4gICAgICAgIGxldCB3aWR0aCA9IHN2Z0RhdGEud2lkdGg7XG4gICAgICAgIGxldCBoZWlnaHQgPSBzdmdEYXRhLmhlaWdodDtcbiAgICAgICAgbGV0IG9mZnNldFggPSAwO1xuICAgICAgICBsZXQgb2Zmc2V0WSA9IDA7XG4gICAgICAgIGNvbnN0IHdhbGxTaXplID0gMTAwO1xuXG4gICAgICAgIGlmIChzdmdEYXRhLnZpZXdCb3ggIT09IHVuZGVmaW5lZClcbiAgICAgICAge1xuICAgICAgICAgICAgY29uc3QgdmJXaWR0aCA9ICBzdmdEYXRhLnZpZXdCb3gud2lkdGg7XG4gICAgICAgICAgICBjb25zdCB2YkhlaWdodCA9IHN2Z0RhdGEudmlld0JveC5oZWlnaHQ7XG4gICAgICAgICAgICBjb25zdCB2YldoUmF0aW8gPSB2YldpZHRoIDwgdmJIZWlnaHQgPyAodmJIZWlnaHQgLyB2YldpZHRoKSA6ICh2YldpZHRoIC8gdmJIZWlnaHQpO1xuICAgICAgICAgICAgY29uc3Qgd2hSYXRpbyA9IHdpZHRoIDwgaGVpZ2h0ID8gKGhlaWdodCAvIHdpZHRoKSA6ICh3aWR0aCAvIGhlaWdodCk7XG5cbiAgICAgICAgICAgIGlmICh3aWR0aCA8IGhlaWdodClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBpZiAodmJXaWR0aCA8IHZiSGVpZ2h0KVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0ID0gdmJIZWlnaHQgKiAoMSAvIHdoUmF0aW8pICogdmJXaFJhdGlvO1xuICAgICAgICAgICAgICAgICAgICB3aWR0aCA9IHZiV2lkdGg7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGhlaWdodCA9IHZiSGVpZ2h0ICogd2hSYXRpbyAqIHZiV2hSYXRpbztcbiAgICAgICAgICAgICAgICAgICAgd2lkdGggPSB2YldpZHRoO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBpZiAodmJXaWR0aCA8IHZiSGVpZ2h0KVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgd2lkdGggPSAgdmJXaWR0aCAqIHdoUmF0aW8gKiB2YldoUmF0aW87XG4gICAgICAgICAgICAgICAgICAgIGhlaWdodCA9IHZiSGVpZ2h0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB3aWR0aCA9ICB2YldpZHRoICogKDEgLyB3aFJhdGlvKSAqIHZiV2hSYXRpbztcbiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0ID0gdmJIZWlnaHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBvZmZzZXRYID0gc3ZnRGF0YS52aWV3Qm94Lm1pbnggLSAod2lkdGggLSB2YldpZHRoKSAvIDI7XG4gICAgICAgICAgICBvZmZzZXRZID0gc3ZnRGF0YS52aWV3Qm94Lm1pbnkgLSAoaGVpZ2h0IC0gdmJIZWlnaHQpIC8gMjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGJvdHRvbSA9IEJvZGllcy5yZWN0YW5nbGUoXG4gICAgICAgICAgICAod2lkdGggLyAyKSArIG9mZnNldFgsXG4gICAgICAgICAgICBoZWlnaHQgKyAod2FsbFNpemUgLyAyKSArIG9mZnNldFksXG4gICAgICAgICAgICB3aWR0aCwgd2FsbFNpemUsIHtpc1N0YXRpYzogdHJ1ZX0pO1xuICAgICAgICBXb3JsZC5hZGQod29ybGQsIGJvdHRvbSk7XG5cbiAgICAgICAgY29uc3QgdG9wID0gQm9kaWVzLnJlY3RhbmdsZShcbiAgICAgICAgICAgICh3aWR0aCAvIDIpICArIG9mZnNldFgsXG4gICAgICAgICAgICAtKHdhbGxTaXplIC8gMikgKyBvZmZzZXRZLFxuICAgICAgICAgICAgd2lkdGgsIHdhbGxTaXplLCB7aXNTdGF0aWM6IHRydWV9KTtcbiAgICAgICAgV29ybGQuYWRkKHdvcmxkLCB0b3ApO1xuXG4gICAgICAgIGNvbnN0IGxlZnQgPSBCb2RpZXMucmVjdGFuZ2xlKFxuICAgICAgICAgICAgLSh3YWxsU2l6ZSAvIDIpICsgb2Zmc2V0WCxcbiAgICAgICAgICAgIChoZWlnaHQgLyAyKSAgKyBvZmZzZXRZLFxuICAgICAgICAgICAgd2FsbFNpemUsIGhlaWdodCwge2lzU3RhdGljOiB0cnVlfSk7XG4gICAgICAgIFdvcmxkLmFkZCh3b3JsZCwgbGVmdCk7XG5cbiAgICAgICAgY29uc3QgcmlnaHQgPSBCb2RpZXMucmVjdGFuZ2xlKFxuICAgICAgICAgICAgd2lkdGggKyAod2FsbFNpemUgLyAyKSArIG9mZnNldFgsXG4gICAgICAgICAgICAoaGVpZ2h0IC8gMikgKyBvZmZzZXRZLFxuICAgICAgICAgICAgd2FsbFNpemUsIGhlaWdodCwge2lzU3RhdGljOiB0cnVlfSk7XG4gICAgICAgIFdvcmxkLmFkZCh3b3JsZCwgcmlnaHQpO1xuICAgIH1cblxuICAgIHN0b3AoKTogdm9pZFxuICAgIHtcbiAgICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cblxufSIsImltcG9ydCB7UGh5c2ljc1BsdWdpbn0gZnJvbSBcIi4uL3BoeXNpY3NfcGx1Z2luXCI7XG5pbXBvcnQge1N2Z0RhdGF9IGZyb20gXCIuLi8uLi9iYXNlL3N2Z19kYXRhXCI7XG5pbXBvcnQge0JvZHksIENvbXBvc2l0ZSwgRW5naW5lLCBFdmVudHMsIFF1ZXJ5LCBSZW5kZXIsIFZlY3RvciwgV29ybGR9IGZyb20gXCJtYXR0ZXItanNcIjtcblxuZXhwb3J0IGNsYXNzIE1vdXNlUGx1Z2luIGltcGxlbWVudHMgUGh5c2ljc1BsdWdpblxue1xuICAgIHByaXZhdGUgX21vdXNlUG9zOiBWZWN0b3IgfCB1bmRlZmluZWQ7XG4gICAgcHJpdmF0ZSBfcHJldmlvdXNNb3VzZVBvczogVmVjdG9yIHwgdW5kZWZpbmVkO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX21vdXNlRm9yY2U6IG51bWJlcjtcblxuICAgIGNvbnN0cnVjdG9yKG1vdXNlRm9yY2U6IG51bWJlcilcbiAgICB7XG4gICAgICAgIHRoaXMuX21vdXNlRm9yY2UgPSBtb3VzZUZvcmNlO1xuICAgIH1cblxuICAgIHNldHVwKHN2Z0RhdGE6IFN2Z0RhdGEsIGVuZ2luZTogRW5naW5lLCByb290Qm9kaWVzOiBCb2R5W10pOiB2b2lkXG4gICAge1xuICAgICAgICBjb25zdCB3b3JsZCA9IGVuZ2luZS53b3JsZDtcblxuICAgICAgICBzdmdEYXRhLnN2Zy5hZGRFdmVudExpc3RlbmVyKFwibW91c2Vtb3ZlXCIsIGV2ID0+XG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMuX21vdXNlUG9zID0gVmVjdG9yLmNyZWF0ZShldi5vZmZzZXRYLCBldi5vZmZzZXRZKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgRXZlbnRzLm9uKGVuZ2luZSwgJ2FmdGVyVXBkYXRlJywgKCkgPT5cbiAgICAgICAge1xuICAgICAgICAgICAgaWYgKHRoaXMuX3ByZXZpb3VzTW91c2VQb3MgIT09IHVuZGVmaW5lZCAmJiB0aGlzLl9tb3VzZVBvcyAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNvbnN0IGJvZGllcyA9IFF1ZXJ5LnBvaW50KENvbXBvc2l0ZS5hbGxCb2RpZXMod29ybGQpLCB0aGlzLl9tb3VzZVBvcyk7XG4gICAgICAgICAgICAgICAgYm9kaWVzLmZvckVhY2goYm9keSA9PlxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGlyZWN0aW9uID0gVmVjdG9yLm5vcm1hbGlzZShWZWN0b3Iuc3ViKHRoaXMuX21vdXNlUG9zISwgdGhpcy5fcHJldmlvdXNNb3VzZVBvcyEpKTtcbiAgICAgICAgICAgICAgICAgICAgQm9keS5hcHBseUZvcmNlKGJvZHksIHRoaXMuX21vdXNlUG9zISwgVmVjdG9yLm11bHQoZGlyZWN0aW9uLCB0aGlzLl9tb3VzZUZvcmNlKSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuX3ByZXZpb3VzTW91c2VQb3MgPSB0aGlzLl9tb3VzZVBvcztcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgc3RvcCgpOiB2b2lkXG4gICAge1xuICAgICAgICAvLyBUT0RPOiByZW1vdmUgbW91c2UgbGlzdGVuZXJcbiAgICB9XG59IiwiaW1wb3J0IHtQaHlzaWNzUGx1Z2lufSBmcm9tIFwiLi4vcGh5c2ljc19wbHVnaW5cIjtcbmltcG9ydCB7U3ZnRGF0YX0gZnJvbSBcIi4uLy4uL2Jhc2Uvc3ZnX2RhdGFcIjtcbmltcG9ydCB7RW5naW5lLCBSZW5kZXIsIEJvZHl9IGZyb20gXCJtYXR0ZXItanNcIjtcblxuZXhwb3J0IGNsYXNzIFJlbmRlcmVyUGx1Z2luIGltcGxlbWVudHMgUGh5c2ljc1BsdWdpblxue1xuICAgIHByaXZhdGUgX3JlbmRlcmVyOiBSZW5kZXIgfCB1bmRlZmluZWQ7XG4gICAgcHJpdmF0ZSBfZWxlbWVudFRvQWRkQ2FudmFzOiBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZDtcblxuICAgIGNvbnN0cnVjdG9yKGVsZW1lbnRUb0FkZENhbnZhczogSFRNTEVsZW1lbnQgfCB1bmRlZmluZWQpXG4gICAge1xuICAgICAgICB0aGlzLl9lbGVtZW50VG9BZGRDYW52YXMgPSBlbGVtZW50VG9BZGRDYW52YXM7XG4gICAgfVxuXG4gICAgc2V0dXAoc3ZnRGF0YTogU3ZnRGF0YSwgcGh5c0VuZ2luZTogRW5naW5lLCByb290Qm9kaWVzOiBCb2R5W10pOiB2b2lkXG4gICAge1xuICAgICAgICBsZXQgcmVuZGVyRWxlbWVudCA9IGRvY3VtZW50LmJvZHk7XG5cbiAgICAgICAgaWYgKHN2Z0RhdGEuc3ZnLnBhcmVudEVsZW1lbnQgIT0gbnVsbClcbiAgICAgICAge1xuICAgICAgICAgICAgcmVuZGVyRWxlbWVudCA9IHN2Z0RhdGEuc3ZnLnBhcmVudEVsZW1lbnQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5fZWxlbWVudFRvQWRkQ2FudmFzICE9PSB1bmRlZmluZWQpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHJlbmRlckVsZW1lbnQgPSB0aGlzLl9lbGVtZW50VG9BZGRDYW52YXM7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBjcmVhdGUgcmVuZGVyZXJcbiAgICAgICAgdGhpcy5fcmVuZGVyZXIgPSBSZW5kZXIuY3JlYXRlKHtcbiAgICAgICAgICAgIGVsZW1lbnQ6IHJlbmRlckVsZW1lbnQsXG4gICAgICAgICAgICBlbmdpbmU6IHBoeXNFbmdpbmUsXG4gICAgICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgICAgICAgd2lyZWZyYW1lczogdHJ1ZSxcbiAgICAgICAgICAgICAgICB3aWR0aDogc3ZnRGF0YS53aWR0aCxcbiAgICAgICAgICAgICAgICBoZWlnaHQ6IHN2Z0RhdGEuaGVpZ2h0LFxuICAgICAgICAgICAgICAgIC8vIHNob3dQb3NpdGlvbnM6IHRydWUsXG4gICAgICAgICAgICAgICAgc2hvd0FuZ2xlSW5kaWNhdG9yOiBmYWxzZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIFJlbmRlci5ydW4odGhpcy5fcmVuZGVyZXIpO1xuICAgIH1cblxuXG4gICAgc3RvcCgpOiB2b2lkXG4gICAge1xuICAgICAgICBpZiAodGhpcy5fcmVuZGVyZXIgIT09IHVuZGVmaW5lZClcbiAgICAgICAge1xuICAgICAgICAgICAgUmVuZGVyLnN0b3AodGhpcy5fcmVuZGVyZXIpO1xuICAgICAgICAgICAgdGhpcy5fcmVuZGVyZXIuY2FudmFzLnJlbW92ZSgpO1xuICAgICAgICB9XG4gICAgfVxufSIsImltcG9ydCB7U3ZnRGF0YX0gZnJvbSBcIi4uL2Jhc2Uvc3ZnX2RhdGFcIjtcbmltcG9ydCB7XG4gICAgQ29tbWFuZCxcbiAgICBDdXJ2ZVRvQ29tbWFuZE1hZGVBYnNvbHV0ZSxcbiAgICBMaW5lVG9Db21tYW5kTWFkZUFic29sdXRlLFxuICAgIE1vdmVUb0NvbW1hbmRNYWRlQWJzb2x1dGUsIFF1YWRyYXRpY0N1cnZlVG9Db21tYW5kTWFkZUFic29sdXRlLCBTbW9vdGhDdXJ2ZVRvQ29tbWFuZE1hZGVBYnNvbHV0ZVxufSBmcm9tIFwic3ZnLXBhdGgtcGFyc2VyXCI7XG5pbXBvcnQge01hdHRlckpzUGh5c2ljc30gZnJvbSBcIi4uL3BoeXNpY3MvbWF0dGVyanNfcGh5c2ljc1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIFJlbmRlcmVyXG57XG4gICAgLy8gZnVuY3Rpb24gY2FsbGVkIGVhY2ggZnJhbWVcbiAgICByZW5kZXJMb29wKHN2Z0RhdGE6IFN2Z0RhdGEsIHBoeXNpY3M6IE1hdHRlckpzUGh5c2ljcyk6IHZvaWQ7XG5cbiAgICAvLyBzdG9wIHJlbmRlciBsb29wXG4gICAgc3RvcCgpOiB2b2lkO1xufVxuXG5leHBvcnQgY29uc3Qgc2VyaWFsaXplQ29tbWFuZCA9IChjb21tYW5kOiBDb21tYW5kKTogc3RyaW5nID0+XG57XG4gICAgc3dpdGNoIChjb21tYW5kLmNvZGUpXG4gICAge1xuICAgICAgICBjYXNlICdNJzpcbiAgICAgICAge1xuICAgICAgICAgICAgY29uc3QgbW92ZSA9IGNvbW1hbmQgYXMgTW92ZVRvQ29tbWFuZE1hZGVBYnNvbHV0ZTtcbiAgICAgICAgICAgIHJldHVybiBgTSAke21vdmUueC50b0ZpeGVkKDIpfSAke21vdmUueS50b0ZpeGVkKDIpfWA7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnTCc6XG4gICAgICAgIHtcbiAgICAgICAgICAgIGNvbnN0IGxpbmUgPSBjb21tYW5kIGFzIExpbmVUb0NvbW1hbmRNYWRlQWJzb2x1dGU7XG4gICAgICAgICAgICByZXR1cm4gYEwgJHtsaW5lLngudG9GaXhlZCgyKX0gJHtsaW5lLnkudG9GaXhlZCgyKX1gO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ1onOlxuICAgICAgICB7XG4gICAgICAgICAgICByZXR1cm4gXCJaXCI7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnQyc6XG4gICAgICAgIHtcbiAgICAgICAgICAgIGNvbnN0IGN1cnZlID0gY29tbWFuZCBhcyBDdXJ2ZVRvQ29tbWFuZE1hZGVBYnNvbHV0ZTtcbiAgICAgICAgICAgIHJldHVybiBgQyAke2N1cnZlLngxLnRvRml4ZWQoMil9ICR7Y3VydmUueTEudG9GaXhlZCgyKX0gJHtjdXJ2ZS54Mi50b0ZpeGVkKDIpfSAke2N1cnZlLnkyLnRvRml4ZWQoMil9ICAke2N1cnZlLngudG9GaXhlZCgyKX0gJHtjdXJ2ZS55LnRvRml4ZWQoMil9YFxuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ1MnOlxuICAgICAgICB7XG4gICAgICAgICAgICBjb25zdCBjdXJ2ZSA9IGNvbW1hbmQgYXMgU21vb3RoQ3VydmVUb0NvbW1hbmRNYWRlQWJzb2x1dGU7XG4gICAgICAgICAgICByZXR1cm4gYFMgJHtjdXJ2ZS54Mi50b0ZpeGVkKDIpfSAke2N1cnZlLnkyLnRvRml4ZWQoMil9ICAke2N1cnZlLngudG9GaXhlZCgyKX0gJHtjdXJ2ZS55LnRvRml4ZWQoMil9YFxuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ1EnOlxuICAgICAgICB7XG4gICAgICAgICAgICBjb25zdCBjdXJ2ZSA9IGNvbW1hbmQgYXMgUXVhZHJhdGljQ3VydmVUb0NvbW1hbmRNYWRlQWJzb2x1dGU7XG4gICAgICAgICAgICByZXR1cm4gYFEgJHtjdXJ2ZS54MS50b0ZpeGVkKDIpfSAke2N1cnZlLnkxLnRvRml4ZWQoMil9ICR7Y3VydmUueC50b0ZpeGVkKDIpfSAke2N1cnZlLnkudG9GaXhlZCgyKX1gXG4gICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBubyBzZXJpYWxpemVyIGZvdW5kIGZvciAke2NvbW1hbmQuY29kZX1gKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCJpbXBvcnQge1JlbmRlcmVyLCBzZXJpYWxpemVDb21tYW5kfSBmcm9tIFwiLi9yZW5kZXJlclwiO1xuaW1wb3J0IHtTdmdEYXRhfSBmcm9tIFwiLi4vYmFzZS9zdmdfZGF0YVwiO1xuaW1wb3J0IHtDb21tYW5kfSBmcm9tIFwic3ZnLXBhdGgtcGFyc2VyXCI7XG5pbXBvcnQge01hdHRlckpzUGh5c2ljc30gZnJvbSBcIi4uL3BoeXNpY3MvbWF0dGVyanNfcGh5c2ljc1wiO1xuXG5leHBvcnQgY2xhc3MgUHJvZHVjdGlvblJlbmRlcmVyIGltcGxlbWVudHMgUmVuZGVyZXJcbntcbiAgICBwcml2YXRlIF9zdG9wcGVkID0gZmFsc2U7XG5cbiAgICByZW5kZXJMb29wKHN2Z0RhdGE6IFN2Z0RhdGEsIHBoeXNpY3M6IE1hdHRlckpzUGh5c2ljcylcbiAgICB7XG4gICAgICAgIGNvbnN0IHN2Z1BhdGhzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoc3ZnRGF0YS5zdmcuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ3BhdGgnKSk7XG4gICAgICAgIHRoaXMudXBkYXRlRnJhbWUoc3ZnRGF0YSwgcGh5c2ljcywgc3ZnUGF0aHMpO1xuICAgIH1cblxuICAgIHVwZGF0ZUZyYW1lKHN2Z0RhdGE6IFN2Z0RhdGEsIHBoeXNpY3M6IE1hdHRlckpzUGh5c2ljcywgc3ZnUGF0aHM6IFNWR1BhdGhFbGVtZW50W10pOiB2b2lkXG4gICAge1xuICAgICAgICBwaHlzaWNzLnVwZGF0ZShzdmdEYXRhLmFnZ3JlZ2F0ZWRDb21tYW5kcyk7XG5cbiAgICAgICAgc3ZnRGF0YSEucGF0aENvbW1hbmRzLmZvckVhY2goKGNvbW1hbmRzOiBDb21tYW5kW10sIGluZGV4OiBudW1iZXIpID0+XG4gICAgICAgIHtcbiAgICAgICAgICAgIGNvbnN0IHBhdGhTdHJpbmcgPSBjb21tYW5kcy5tYXAoc2VyaWFsaXplQ29tbWFuZCkuam9pbihcIiBcIik7XG4gICAgICAgICAgICBzdmdQYXRoc1tpbmRleF0uc2V0QXR0cmlidXRlKFwiZFwiLCBwYXRoU3RyaW5nKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKCF0aGlzLl9zdG9wcGVkKVxuICAgICAgICB7XG4gICAgICAgICAgICB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCh0KSA9PiB0aGlzLnVwZGF0ZUZyYW1lKHN2Z0RhdGEsIHBoeXNpY3MsIHN2Z1BhdGhzKSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzdG9wKCk6IHZvaWRcbiAgICB7XG4gICAgICAgIHRoaXMuX3N0b3BwZWQgPSB0cnVlO1xuICAgIH1cbn0iLCJpbXBvcnQge1BoeXNpY3NQbHVnaW59IGZyb20gXCIuLi9waHlzaWNzX3BsdWdpblwiO1xuaW1wb3J0IHtTdmdEYXRhfSBmcm9tIFwiLi4vLi4vYmFzZS9zdmdfZGF0YVwiO1xuaW1wb3J0IHtCb2R5LCBDb21wb3NpdGUsIEVuZ2luZSwgRXZlbnRzLCBRdWVyeSwgVmVjdG9yLCBXb3JsZH0gZnJvbSBcIm1hdHRlci1qc1wiO1xuXG5leHBvcnQgY2xhc3MgU2Nyb2xsUGx1Z2luIGltcGxlbWVudHMgUGh5c2ljc1BsdWdpblxue1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX2ZvcmNlOiBudW1iZXI7XG4gICAgcHJpdmF0ZSBfcHJldmlvdXNTY3JvbGxQb3M6IFZlY3RvciB8IHVuZGVmaW5lZDtcbiAgICBwcml2YXRlIF9zY3JvbGxQb3M6IFZlY3RvciB8IHVuZGVmaW5lZDtcbiAgICBwcml2YXRlIF9saXN0ZW5lcjogYW55O1xuXG4gICAgY29uc3RydWN0b3IoZm9yY2U6IG51bWJlcilcbiAgICB7XG4gICAgICAgIHRoaXMuX2ZvcmNlID0gZm9yY2U7XG4gICAgfVxuXG4gICAgc2V0dXAoc3ZnRGF0YTogU3ZnRGF0YSwgcGh5c0VuZ2luZTogRW5naW5lLCByb290Qm9kaWVzOiBCb2R5W10pOiB2b2lkXG4gICAge1xuICAgICAgICBjb25zdCB3b3JsZCA9IHBoeXNFbmdpbmUud29ybGQ7XG5cbiAgICAgICAgdGhpcy5fbGlzdGVuZXIgPSAoZXYpID0+IHRoaXMuX3Njcm9sbFBvcyA9IFZlY3Rvci5jcmVhdGUod2luZG93LnNjcm9sbFgsIHdpbmRvdy5zY3JvbGxZKVxuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInNjcm9sbFwiLCB0aGlzLl9saXN0ZW5lcik7XG5cbiAgICAgICAgRXZlbnRzLm9uKHBoeXNFbmdpbmUsICdhZnRlclVwZGF0ZScsICgpID0+XG4gICAgICAgIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9zY3JvbGxQb3MgIT09IHVuZGVmaW5lZCAmJiB0aGlzLl9wcmV2aW91c1Njcm9sbFBvcyAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNvbnN0IGJvZGllcyA9IENvbXBvc2l0ZS5hbGxCb2RpZXMod29ybGQpO1xuICAgICAgICAgICAgICAgIGJvZGllcy5mb3JFYWNoKGJvZHkgPT5cbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRpcmVjdGlvbiA9IFZlY3Rvci5ub3JtYWxpc2UoVmVjdG9yLnN1Yih0aGlzLl9zY3JvbGxQb3MhLCB0aGlzLl9wcmV2aW91c1Njcm9sbFBvcyEpKTtcbiAgICAgICAgICAgICAgICAgICAgQm9keS5hcHBseUZvcmNlKGJvZHksIGJvZHkucG9zaXRpb24sIFZlY3Rvci5tdWx0KGRpcmVjdGlvbiwgdGhpcy5fZm9yY2UpKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5fcHJldmlvdXNTY3JvbGxQb3MgPSB0aGlzLl9zY3JvbGxQb3M7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHN0b3AoKTogdm9pZFxuICAgIHtcbiAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJzY3JvbGxcIiwgdGhpcy5fbGlzdGVuZXIpO1xuICAgIH1cbn0iLCJpbXBvcnQge1BoeXNpY3NQbHVnaW59IGZyb20gXCIuLi9waHlzaWNzX3BsdWdpblwiO1xuaW1wb3J0IHtFbmdpbmUsIEJvZHksIEV2ZW50cywgVmVjdG9yfSBmcm9tIFwibWF0dGVyLWpzXCI7XG5pbXBvcnQge1N2Z0RhdGF9IGZyb20gXCIuLi8uLi9iYXNlL3N2Z19kYXRhXCI7XG5cbmV4cG9ydCBjbGFzcyBMaW1pdFZlbG9jaXR5UGx1Z2luIGltcGxlbWVudHMgUGh5c2ljc1BsdWdpblxue1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX21heFNwZWVkOiBudW1iZXI7XG5cbiAgICBjb25zdHJ1Y3RvcihtYXhTcGVlZDogbnVtYmVyKVxuICAgIHtcbiAgICAgICAgdGhpcy5fbWF4U3BlZWQgPSBtYXhTcGVlZDtcbiAgICB9XG5cbiAgICBzZXR1cChzdmdEYXRhOiBTdmdEYXRhLCBlbmdpbmU6IEVuZ2luZSwgcm9vdEJvZGllczogQm9keVtdKTogdm9pZFxuICAgIHtcbiAgICAgICAgY29uc3QgbGltaXRNYXhTcGVlZCA9ICgpID0+XG4gICAgICAgIHtcbiAgICAgICAgICAgIHJvb3RCb2RpZXMuZm9yRWFjaChib2R5ID0+XG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgaWYgKGJvZHkudmVsb2NpdHkueCA+IHRoaXMuX21heFNwZWVkKVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgQm9keS5zZXRWZWxvY2l0eShib2R5LCB7eDogdGhpcy5fbWF4U3BlZWQsIHk6IGJvZHkudmVsb2NpdHkueX0pO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChib2R5LnZlbG9jaXR5LnggPCAtdGhpcy5fbWF4U3BlZWQpXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBCb2R5LnNldFZlbG9jaXR5KGJvZHksIHt4OiAtdGhpcy5fbWF4U3BlZWQsIHk6IGJvZHkudmVsb2NpdHkueX0pO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChib2R5LnZlbG9jaXR5LnkgPiB0aGlzLl9tYXhTcGVlZClcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIEJvZHkuc2V0VmVsb2NpdHkoYm9keSwge3g6IGJvZHkudmVsb2NpdHkueCwgeTogdGhpcy5fbWF4U3BlZWR9KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoYm9keS52ZWxvY2l0eS55IDwgLXRoaXMuX21heFNwZWVkKVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgQm9keS5zZXRWZWxvY2l0eShib2R5LCB7eDogLWJvZHkudmVsb2NpdHkueCwgeTogLXRoaXMuX21heFNwZWVkfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgRXZlbnRzLm9uKGVuZ2luZSwgJ2JlZm9yZVVwZGF0ZScsIGxpbWl0TWF4U3BlZWQpO1xuICAgIH1cblxuXG4gICAgc3RvcCgpOiB2b2lkXG4gICAge1xuICAgICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuXG59IiwiaW1wb3J0IHtQaHlzaWNzUGx1Z2lufSBmcm9tIFwiLi4vcGh5c2ljc19wbHVnaW5cIjtcbmltcG9ydCB7RW5naW5lLCBCb2R5LCBFdmVudHN9IGZyb20gXCJtYXR0ZXItanNcIjtcbmltcG9ydCB7U3ZnRGF0YX0gZnJvbSBcIi4uLy4uL2Jhc2Uvc3ZnX2RhdGFcIjtcblxuZXhwb3J0IGNsYXNzIExpbWl0QW5ndWxhclZlbG9jaXR5UGx1Z2luIGltcGxlbWVudHMgUGh5c2ljc1BsdWdpblxue1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX21heFNwZWVkOiBudW1iZXI7XG5cbiAgICBjb25zdHJ1Y3RvcihtYXhTcGVlZDogbnVtYmVyKVxuICAgIHtcbiAgICAgICAgdGhpcy5fbWF4U3BlZWQgPSBtYXhTcGVlZDtcbiAgICB9XG5cbiAgICBzZXR1cChzdmdEYXRhOiBTdmdEYXRhLCBlbmdpbmU6IEVuZ2luZSwgcm9vdEJvZGllczogQm9keVtdKTogdm9pZFxuICAgIHtcbiAgICAgICAgY29uc3QgbGltaXRNYXhTcGVlZCA9ICgpID0+XG4gICAgICAgIHtcbiAgICAgICAgICAgIHJvb3RCb2RpZXMuZm9yRWFjaChib2R5ID0+XG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgaWYgKGJvZHkuYW5ndWxhclZlbG9jaXR5ID4gdGhpcy5fbWF4U3BlZWQpXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBCb2R5LnNldEFuZ3VsYXJWZWxvY2l0eShib2R5LCB0aGlzLl9tYXhTcGVlZClcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGJvZHkuYW5ndWxhclZlbG9jaXR5IDwgLXRoaXMuX21heFNwZWVkKVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgQm9keS5zZXRBbmd1bGFyVmVsb2NpdHkoYm9keSwgLXRoaXMuX21heFNwZWVkKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIEV2ZW50cy5vbihlbmdpbmUsICdiZWZvcmVVcGRhdGUnLCBsaW1pdE1heFNwZWVkKTtcbiAgICB9XG5cblxuICAgIHN0b3AoKTogdm9pZFxuICAgIHtcbiAgICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cbn0iLCJpbXBvcnQge01hdHRlckpzUGh5c2ljc30gZnJvbSBcIi4uL3BoeXNpY3MvbWF0dGVyanNfcGh5c2ljc1wiO1xuaW1wb3J0IHtSZW5kZXJlcn0gZnJvbSBcIi4uL3JlbmRlcmVyL3JlbmRlcmVyXCI7XG5cbmV4cG9ydCBjbGFzcyBTdG9wUGh5c2ljYWxTdmdcbntcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9waHlzaWNzOiBNYXR0ZXJKc1BoeXNpY3M7XG4gICAgcHJpdmF0ZSByZWFkb25seSBfcmVuZGVyZXI6IFJlbmRlcmVyO1xuXG4gICAgY29uc3RydWN0b3IocGh5c2ljczogTWF0dGVySnNQaHlzaWNzLCByZW5kZXJlcjogUmVuZGVyZXIpXG4gICAge1xuICAgICAgICB0aGlzLl9waHlzaWNzID0gcGh5c2ljcztcbiAgICAgICAgdGhpcy5fcmVuZGVyZXIgPSByZW5kZXJlcjtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RvcCgpOiB2b2lkXG4gICAge1xuICAgICAgICB0aGlzLl9yZW5kZXJlci5zdG9wKCk7XG4gICAgICAgIHRoaXMuX3BoeXNpY3Muc3RvcCgpO1xuICAgIH1cbn0iLCJpbXBvcnQge0JvZHlDb25maWd9IGZyb20gXCIuLi9waHlzaWNzL2JvZHkvYm9keV9jb25maWdcIjtcbmltcG9ydCB7TWF0dGVySnNQaHlzaWNzfSBmcm9tIFwiLi4vcGh5c2ljcy9tYXR0ZXJqc19waHlzaWNzXCI7XG5pbXBvcnQge1N2Z0RhdGF9IGZyb20gXCIuLi9iYXNlL3N2Z19kYXRhXCI7XG5pbXBvcnQge2V4cGFuZENvbW1hbmRzfSBmcm9tIFwiLi4vYmFzZS9jb21tYW5kX21hcHBlclwiO1xuaW1wb3J0IHttYWtlQWJzb2x1dGUsIHBhcnNlU1ZHfSBmcm9tIFwic3ZnLXBhdGgtcGFyc2VyXCI7XG5pbXBvcnQge0FnZ3JlZ2F0b3J9IGZyb20gXCIuLi9hZ3JlZ2F0b3IvYWdncmVnYXRvclwiO1xuaW1wb3J0IHtQaHlzaWNzUGx1Z2lufSBmcm9tIFwiLi4vcGh5c2ljcy9waHlzaWNzX3BsdWdpblwiO1xuaW1wb3J0IHtHcmF2aXR5UGx1Z2lufSBmcm9tIFwiLi4vcGh5c2ljcy9wbHVnaW5zL2dyYXZpdHlfcGx1Z2luXCI7XG5pbXBvcnQge1ZpZXdDb2xsaWRlckJvcmRlcn0gZnJvbSBcIi4uL3BoeXNpY3MvcGx1Z2lucy92aWV3X2NvbGxpZGVyX2JvcmRlcl9wbHVnaW5cIjtcbmltcG9ydCB7TW91c2VQbHVnaW59IGZyb20gXCIuLi9waHlzaWNzL3BsdWdpbnMvbW91c2VfcGx1Z2luXCI7XG5pbXBvcnQge1JlbmRlcmVyUGx1Z2lufSBmcm9tIFwiLi4vcGh5c2ljcy9wbHVnaW5zL3JlbmRlcmVyX3BsdWdpblwiO1xuaW1wb3J0IHtQcm9kdWN0aW9uUmVuZGVyZXJ9IGZyb20gXCIuLi9yZW5kZXJlci9wcm9kdWN0aW9uX3JlbmRlcmVyXCI7XG5pbXBvcnQge1Njcm9sbFBsdWdpbn0gZnJvbSBcIi4uL3BoeXNpY3MvcGx1Z2lucy9zY3JvbGxfcGx1Z2luXCI7XG5pbXBvcnQge0xpbWl0VmVsb2NpdHlQbHVnaW59IGZyb20gXCIuLi9waHlzaWNzL3BsdWdpbnMvbGltaXRfdmVsb2NpdHlfcGx1Z2luXCI7XG5pbXBvcnQge0xpbWl0QW5ndWxhclZlbG9jaXR5UGx1Z2lufSBmcm9tIFwiLi4vcGh5c2ljcy9wbHVnaW5zL2xpbWl0X2FuZ3VsYXJfdmVsb2NpdHlfcGx1Z2luXCI7XG5pbXBvcnQge1N0b3BQaHlzaWNhbFN2Z30gZnJvbSBcIi4vc3RvcF9idWlsZGVyXCI7XG5cbmV4cG9ydCBjbGFzcyBTaW11bGF0aW9uQnVpbGRlclxue1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX2FnZ3JlZ2F0b3I6IEFnZ3JlZ2F0b3I7XG4gICAgcHJpdmF0ZSByZWFkb25seSBfc3ZnOiBIVE1MRWxlbWVudDtcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9wbHVnaW5zOiBQaHlzaWNzUGx1Z2luW107XG5cbiAgICBjb25zdHJ1Y3RvcihhZ2dyZWdhdG9yOiBBZ2dyZWdhdG9yLCBzdmc6IEhUTUxFbGVtZW50KVxuICAgIHtcbiAgICAgICAgdGhpcy5fYWdncmVnYXRvciA9IGFnZ3JlZ2F0b3I7XG4gICAgICAgIHRoaXMuX3N2ZyA9IHN2ZztcbiAgICAgICAgdGhpcy5fcGx1Z2lucyA9IFtdO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoR3Jhdml0eShncmF2aXR5OiB7IHg6IG51bWJlciwgeTogbnVtYmVyfSk6IFNpbXVsYXRpb25CdWlsZGVyXG4gICAge1xuICAgICAgICB0aGlzLl9wbHVnaW5zLnB1c2gobmV3IEdyYXZpdHlQbHVnaW4oZ3Jhdml0eSkpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aEJvcmRlckNvbGxpZGVyKCk6IFNpbXVsYXRpb25CdWlsZGVyXG4gICAge1xuICAgICAgICB0aGlzLl9wbHVnaW5zLnB1c2gobmV3IFZpZXdDb2xsaWRlckJvcmRlcigpKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhNb3VzZUludGVyYWN0aW9uKG1vdXNlRm9yY2U6IG51bWJlcik6IFNpbXVsYXRpb25CdWlsZGVyXG4gICAge1xuICAgICAgICB0aGlzLl9wbHVnaW5zLnB1c2gobmV3IE1vdXNlUGx1Z2luKG1vdXNlRm9yY2UpKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhTY3JvbGxJbnRlcmFjdGlvbihzY3JvbGxGb3JjZTogbnVtYmVyKTogU2ltdWxhdGlvbkJ1aWxkZXJcbiAgICB7XG4gICAgICAgIHRoaXMuX3BsdWdpbnMucHVzaChuZXcgU2Nyb2xsUGx1Z2luKHNjcm9sbEZvcmNlKSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoRGVidWdSZW5kZXJlcihlbGVtZW50VG9BZGRDYW52YXM/OiBIVE1MRWxlbWVudCk6IFNpbXVsYXRpb25CdWlsZGVyXG4gICAge1xuICAgICAgICB0aGlzLl9wbHVnaW5zLnB1c2gobmV3IFJlbmRlcmVyUGx1Z2luKGVsZW1lbnRUb0FkZENhbnZhcykpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aEN1c3RvbVBsdWdpbihwbHVnaW46IFBoeXNpY3NQbHVnaW4pOiBTaW11bGF0aW9uQnVpbGRlclxuICAgIHtcbiAgICAgICAgdGhpcy5fcGx1Z2lucy5wdXNoKHBsdWdpbik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoTGltaXRWZWxvY2l0eVBsdWdpbihtYXhTcGVlZDogbnVtYmVyKVxuICAgIHtcbiAgICAgICAgdGhpcy5fcGx1Z2lucy5wdXNoKG5ldyBMaW1pdFZlbG9jaXR5UGx1Z2luKG1heFNwZWVkKSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoTGltaXRBbmd1bGFyVmVsb2NpdHlQbHVnaW4obWF4U3BlZWQ6IG51bWJlcilcbiAgICB7XG4gICAgICAgIHRoaXMuX3BsdWdpbnMucHVzaChuZXcgTGltaXRBbmd1bGFyVmVsb2NpdHlQbHVnaW4obWF4U3BlZWQpKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXJ0U2ltdWxhdGlvbihjb25maWc6IEJvZHlDb25maWcpOiBTdG9wUGh5c2ljYWxTdmdcbiAgICB7XG4gICAgICAgIGNvbnN0IHN2Z0RhdGEgPSB0aGlzLmNyZWF0ZVN2Z0RhdGEoKTtcbiAgICAgICAgY29uc3QgcGh5c2ljcyA9IG5ldyBNYXR0ZXJKc1BoeXNpY3Moc3ZnRGF0YSwgY29uZmlnLCB0aGlzLl9wbHVnaW5zKTtcblxuICAgICAgICBjb25zdCByZW5kZXJlciA9IG5ldyBQcm9kdWN0aW9uUmVuZGVyZXIoKTtcbiAgICAgICAgcmVuZGVyZXIucmVuZGVyTG9vcChzdmdEYXRhLCBwaHlzaWNzKTtcblxuICAgICAgICByZXR1cm4gbmV3IFN0b3BQaHlzaWNhbFN2ZyhwaHlzaWNzLCByZW5kZXJlcik7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjcmVhdGVTdmdEYXRhKCk6IFN2Z0RhdGFcbiAgICB7XG4gICAgICAgIGNvbnN0IHBhdGhzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodGhpcy5fc3ZnLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdwYXRoJykpO1xuXG4gICAgICAgIGNvbnN0IHBhdGhDb21tYW5kQXJyYXkgPSBwYXRoc1xuICAgICAgICAgICAgLm1hcChwYXRoID0+IHBhdGguZ2V0QXR0cmlidXRlKFwiZFwiKSlcbiAgICAgICAgICAgIC5tYXAocGF0aFN0cmluZyA9PiBleHBhbmRDb21tYW5kcyhtYWtlQWJzb2x1dGUocGFyc2VTVkcocGF0aFN0cmluZykpKSk7XG5cbiAgICAgICAgY29uc3QgYWdncmVnYXRlZENvbW1hbmRzID0gdGhpcy5fYWdncmVnYXRvci5hZ2dyZWdhdGUocGF0aENvbW1hbmRBcnJheSk7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBTdmdEYXRhKHRoaXMuX3N2ZywgcGF0aENvbW1hbmRBcnJheSwgYWdncmVnYXRlZENvbW1hbmRzKTtcbiAgICB9XG59IiwiaW1wb3J0IHtBZ2dyZWdhdG9yfSBmcm9tIFwiLi4vYWdyZWdhdG9yL2FnZ3JlZ2F0b3JcIjtcbmltcG9ydCB7Q29sbGlzaW9uQWdncmVnYXRvcn0gZnJvbSBcIi4uL2FncmVnYXRvci9jb2xsaXNpb25fYWdncmVnYXRvclwiO1xuaW1wb3J0IHtQYXRoQWdncmVnYXRvcn0gZnJvbSBcIi4uL2FncmVnYXRvci9wYXRoX2FnZ3JlZ2F0b3JcIjtcbmltcG9ydCB7U2ltdWxhdGlvbkJ1aWxkZXJ9IGZyb20gXCIuL3NpbXVsYXRpb25fYnVpbGRlclwiO1xuXG5leHBvcnQgY2xhc3MgQWdncmVnYXRvckJ1aWxkZXJcbntcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9zdmc6IEhUTUxFbGVtZW50O1xuXG4gICAgY29uc3RydWN0b3Ioc3ZnOiBIVE1MRWxlbWVudClcbiAgICB7XG4gICAgICAgIHRoaXMuX3N2ZyA9IHN2ZztcbiAgICB9XG5cbiAgICB1c2VDb2xsaXNpb25BZ2dyZWdhdG9yKCk6IFNpbXVsYXRpb25CdWlsZGVyXG4gICAge1xuICAgICAgICByZXR1cm4gbmV3IFNpbXVsYXRpb25CdWlsZGVyKG5ldyBDb2xsaXNpb25BZ2dyZWdhdG9yKCksIHRoaXMuX3N2Zyk7XG4gICAgfVxuXG4gICAgdXNlUGF0aEFnZ3JlZ2F0b3IoKTogU2ltdWxhdGlvbkJ1aWxkZXJcbiAgICB7XG4gICAgICAgIHJldHVybiBuZXcgU2ltdWxhdGlvbkJ1aWxkZXIobmV3IFBhdGhBZ2dyZWdhdG9yKCksIHRoaXMuX3N2Zyk7XG4gICAgfVxuXG4gICAgdXNlQ3VzdG9tQWdncmVnYXRvcihhZ2dyZWdhdG9yOiBBZ2dyZWdhdG9yKTogU2ltdWxhdGlvbkJ1aWxkZXJcbiAgICB7XG4gICAgICAgIHJldHVybiBuZXcgU2ltdWxhdGlvbkJ1aWxkZXIoYWdncmVnYXRvciwgdGhpcy5fc3ZnKTtcbiAgICB9XG5cbn0iLCJpbXBvcnQge0FnZ3JlZ2F0b3JCdWlsZGVyfSBmcm9tIFwiLi9hcGkvYWdncmVnYXRvcl9idWlsZGVyXCI7XG5pbXBvcnQge0FnZ3JlZ2F0b3J9IGZyb20gXCIuL2FncmVnYXRvci9hZ2dyZWdhdG9yXCI7XG5pbXBvcnQge1N0b3BQaHlzaWNhbFN2Z30gZnJvbSBcIi4vYXBpL3N0b3BfYnVpbGRlclwiO1xuaW1wb3J0IHtQaHlzaWNzUGx1Z2lufSBmcm9tIFwiLi9waHlzaWNzL3BoeXNpY3NfcGx1Z2luXCI7XG5cbmV4cG9ydCBjb25zdCBQaHlzaWNhbFN2ZyA9IChzdmc6IEhUTUxFbGVtZW50KTogQWdncmVnYXRvckJ1aWxkZXIgPT5cbntcbiAgICByZXR1cm4gbmV3IEFnZ3JlZ2F0b3JCdWlsZGVyKHN2Zyk7XG59XG5cbmV4cG9ydCB7U3RvcFBoeXNpY2FsU3ZnLCBQaHlzaWNzUGx1Z2luLCBBZ2dyZWdhdG9yfTsiXSwibmFtZXMiOlsicm9vdCIsImZhY3RvcnkiLCJleHBvcnRzIiwibW9kdWxlIiwiZGVmaW5lIiwiYW1kIiwic2VsZiIsIm1vZHVsZXMiLCJpbnN0YWxsZWRNb2R1bGVzIiwibW9kdWxlSWQiLCJpIiwibCIsImNhbGwiLCJtIiwiYyIsImQiLCJuYW1lIiwiZ2V0dGVyIiwibyIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZW51bWVyYWJsZSIsImdldCIsInIiLCJTeW1ib2wiLCJ0b1N0cmluZ1RhZyIsInZhbHVlIiwidCIsIm1vZGUiLCJfX2VzTW9kdWxlIiwibnMiLCJjcmVhdGUiLCJrZXkiLCJiaW5kIiwibiIsIm9iamVjdCIsInByb3BlcnR5IiwicHJvdG90eXBlIiwiaGFzT3duUHJvcGVydHkiLCJwIiwicyIsIkNvbW1vbiIsIl9uZXh0SWQiLCJfc2VlZCIsIl9ub3dTdGFydFRpbWUiLCJEYXRlIiwiX3dhcm5lZE9uY2UiLCJfZGVjb21wIiwiZXh0ZW5kIiwib2JqIiwiZGVlcCIsImFyZ3NTdGFydCIsImRlZXBDbG9uZSIsImFyZ3VtZW50cyIsImxlbmd0aCIsInNvdXJjZSIsInByb3AiLCJjb25zdHJ1Y3RvciIsImNsb25lIiwia2V5cyIsInB1c2giLCJ2YWx1ZXMiLCJwYXRoIiwiYmVnaW4iLCJlbmQiLCJzcGxpdCIsInNsaWNlIiwic2V0IiwidmFsIiwicGFydHMiLCJzaHVmZmxlIiwiYXJyYXkiLCJqIiwiTWF0aCIsImZsb29yIiwicmFuZG9tIiwidGVtcCIsImNob29zZSIsImNob2ljZXMiLCJpc0VsZW1lbnQiLCJIVE1MRWxlbWVudCIsIm5vZGVUeXBlIiwibm9kZU5hbWUiLCJpc0FycmF5IiwidG9TdHJpbmciLCJpc0Z1bmN0aW9uIiwiaXNQbGFpbk9iamVjdCIsImlzU3RyaW5nIiwiY2xhbXAiLCJtaW4iLCJtYXgiLCJzaWduIiwibm93Iiwid2luZG93IiwicGVyZm9ybWFuY2UiLCJ3ZWJraXROb3ciLCJfc2VlZGVkUmFuZG9tIiwiY29sb3JUb051bWJlciIsImNvbG9yU3RyaW5nIiwicmVwbGFjZSIsImNoYXJBdCIsInBhcnNlSW50IiwibG9nTGV2ZWwiLCJsb2ciLCJjb25zb2xlIiwiYXBwbHkiLCJjb25jYXQiLCJBcnJheSIsImluZm8iLCJ3YXJuIiwid2Fybk9uY2UiLCJtZXNzYWdlIiwiam9pbiIsImRlcHJlY2F0ZWQiLCJ3YXJuaW5nIiwiY2hhaW4iLCJuZXh0SWQiLCJpbmRleE9mIiwiaGF5c3RhY2siLCJuZWVkbGUiLCJtYXAiLCJsaXN0IiwiZnVuYyIsIm1hcHBlZCIsInRvcG9sb2dpY2FsU29ydCIsImdyYXBoIiwicmVzdWx0IiwidmlzaXRlZCIsIm5vZGUiLCJfdG9wb2xvZ2ljYWxTb3J0IiwibmVpZ2hib3JzIiwibmVpZ2hib3IiLCJmdW5jcyIsIl9jaGFpbmVkIiwibGFzdFJlc3VsdCIsImFyZ3MiLCJjaGFpblBhdGhCZWZvcmUiLCJiYXNlIiwiY2hhaW5QYXRoQWZ0ZXIiLCJzZXREZWNvbXAiLCJkZWNvbXAiLCJnZXREZWNvbXAiLCJnIiwiZSIsIkJvdW5kcyIsInZlcnRpY2VzIiwiYm91bmRzIiwieCIsInkiLCJ1cGRhdGUiLCJ2ZWxvY2l0eSIsIkluZmluaXR5IiwidmVydGV4IiwiY29udGFpbnMiLCJwb2ludCIsIm92ZXJsYXBzIiwiYm91bmRzQSIsImJvdW5kc0IiLCJ0cmFuc2xhdGUiLCJ2ZWN0b3IiLCJzaGlmdCIsInBvc2l0aW9uIiwiZGVsdGFYIiwiZGVsdGFZIiwiVmVjdG9yIiwibWFnbml0dWRlIiwic3FydCIsIm1hZ25pdHVkZVNxdWFyZWQiLCJyb3RhdGUiLCJhbmdsZSIsIm91dHB1dCIsImNvcyIsInNpbiIsInJvdGF0ZUFib3V0Iiwibm9ybWFsaXNlIiwiZG90IiwidmVjdG9yQSIsInZlY3RvckIiLCJjcm9zcyIsImNyb3NzMyIsInZlY3RvckMiLCJhZGQiLCJzdWIiLCJtdWx0Iiwic2NhbGFyIiwiZGl2IiwicGVycCIsIm5lZ2F0ZSIsIm5lZyIsImF0YW4yIiwiX3RlbXAiLCJWZXJ0aWNlcyIsInBvaW50cyIsImJvZHkiLCJpbmRleCIsImlzSW50ZXJuYWwiLCJmcm9tUGF0aCIsIm1hdGNoIiwicGFyc2VGbG9hdCIsImNlbnRyZSIsImFyZWEiLCJtZWFuIiwiYXZlcmFnZSIsInNpZ25lZCIsImFicyIsImluZXJ0aWEiLCJtYXNzIiwibnVtZXJhdG9yIiwiZGVub21pbmF0b3IiLCJ2IiwidmVydGljZXNMZW5ndGgiLCJ0cmFuc2xhdGVYIiwidHJhbnNsYXRlWSIsImR4IiwiZHkiLCJwb2ludFgiLCJwb2ludFkiLCJuZXh0VmVydGV4Iiwic2NhbGUiLCJzY2FsZVgiLCJzY2FsZVkiLCJkZWx0YSIsImNoYW1mZXIiLCJyYWRpdXMiLCJxdWFsaXR5IiwicXVhbGl0eU1pbiIsInF1YWxpdHlNYXgiLCJuZXdWZXJ0aWNlcyIsInByZXZWZXJ0ZXgiLCJjdXJyZW50UmFkaXVzIiwicHJldk5vcm1hbCIsIm5leHROb3JtYWwiLCJkaWFnb25hbFJhZGl1cyIsInBvdyIsInJhZGl1c1ZlY3RvciIsIm1pZE5vcm1hbCIsInNjYWxlZFZlcnRleCIsInByZWNpc2lvbiIsInRoZXRhIiwiYWNvcyIsImNsb2Nrd2lzZVNvcnQiLCJzb3J0IiwidmVydGV4QSIsInZlcnRleEIiLCJpc0NvbnZleCIsImsiLCJ6IiwiZmxhZyIsImh1bGwiLCJ1cHBlciIsImxvd2VyIiwicG9wIiwiRXZlbnRzIiwib24iLCJldmVudE5hbWVzIiwiY2FsbGJhY2siLCJuYW1lcyIsImV2ZW50cyIsIm9mZiIsImNhbGxiYWNrcyIsIm5ld0NhbGxiYWNrcyIsInRyaWdnZXIiLCJldmVudCIsImV2ZW50Q2xvbmUiLCJDb21wb3NpdGUiLCJCb2R5Iiwib3B0aW9ucyIsImlkIiwidHlwZSIsInBhcmVudCIsImlzTW9kaWZpZWQiLCJib2RpZXMiLCJjb25zdHJhaW50cyIsImNvbXBvc2l0ZXMiLCJsYWJlbCIsInBsdWdpbiIsImNhY2hlIiwiYWxsQm9kaWVzIiwiYWxsQ29uc3RyYWludHMiLCJhbGxDb21wb3NpdGVzIiwic2V0TW9kaWZpZWQiLCJjb21wb3NpdGUiLCJ1cGRhdGVQYXJlbnRzIiwidXBkYXRlQ2hpbGRyZW4iLCJjaGlsZENvbXBvc2l0ZSIsIm9iamVjdHMiLCJhZGRCb2R5IiwiYWRkQ29uc3RyYWludCIsImFkZENvbXBvc2l0ZSIsImNvbnN0cmFpbnQiLCJyZW1vdmUiLCJyZW1vdmVCb2R5IiwicmVtb3ZlQ29uc3RyYWludCIsInJlbW92ZUNvbXBvc2l0ZSIsImNvbXBvc2l0ZUEiLCJjb21wb3NpdGVCIiwicmVtb3ZlQ29tcG9zaXRlQXQiLCJzcGxpY2UiLCJyZW1vdmVCb2R5QXQiLCJyZW1vdmVDb25zdHJhaW50QXQiLCJjbGVhciIsImtlZXBTdGF0aWMiLCJmaWx0ZXIiLCJpc1N0YXRpYyIsIm1vdmUiLCJyZWJhc2UiLCJ0cmFuc2xhdGlvbiIsInJlY3Vyc2l2ZSIsInJvdGF0aW9uIiwic2V0UG9zaXRpb24iLCJTbGVlcGluZyIsIkF4ZXMiLCJfaW5lcnRpYVNjYWxlIiwiX25leHRDb2xsaWRpbmdHcm91cElkIiwiX25leHROb25Db2xsaWRpbmdHcm91cElkIiwiX25leHRDYXRlZ29yeSIsImRlZmF1bHRzIiwiZm9yY2UiLCJ0b3JxdWUiLCJwb3NpdGlvbkltcHVsc2UiLCJjb25zdHJhaW50SW1wdWxzZSIsInRvdGFsQ29udGFjdHMiLCJzcGVlZCIsImFuZ3VsYXJTcGVlZCIsImFuZ3VsYXJWZWxvY2l0eSIsImlzU2Vuc29yIiwiaXNTbGVlcGluZyIsIm1vdGlvbiIsInNsZWVwVGhyZXNob2xkIiwiZGVuc2l0eSIsInJlc3RpdHV0aW9uIiwiZnJpY3Rpb24iLCJmcmljdGlvblN0YXRpYyIsImZyaWN0aW9uQWlyIiwiY29sbGlzaW9uRmlsdGVyIiwiY2F0ZWdvcnkiLCJtYXNrIiwiZ3JvdXAiLCJzbG9wIiwidGltZVNjYWxlIiwicmVuZGVyIiwidmlzaWJsZSIsIm9wYWNpdHkiLCJzdHJva2VTdHlsZSIsImZpbGxTdHlsZSIsImxpbmVXaWR0aCIsInNwcml0ZSIsInhTY2FsZSIsInlTY2FsZSIsInhPZmZzZXQiLCJ5T2Zmc2V0IiwiY2lyY2xlUmFkaXVzIiwicG9zaXRpb25QcmV2IiwiYW5nbGVQcmV2IiwiYXhlcyIsIl9vcmlnaW5hbCIsIl9pbml0UHJvcGVydGllcyIsIm5leHRHcm91cCIsImlzTm9uQ29sbGlkaW5nIiwibmV4dENhdGVnb3J5IiwiZGVmYXVsdEZpbGxTdHlsZSIsImRlZmF1bHRTdHJva2VTdHlsZSIsImRlZmF1bHRMaW5lV2lkdGgiLCJzZXR0aW5ncyIsInNldFN0YXRpYyIsInNldE1hc3MiLCJzZXREZW5zaXR5Iiwic2V0SW5lcnRpYSIsInNldFZlcnRpY2VzIiwic2V0QW5nbGUiLCJzZXRWZWxvY2l0eSIsInNldEFuZ3VsYXJWZWxvY2l0eSIsInNldFBhcnRzIiwic2V0Q2VudHJlIiwicGFydCIsImludmVyc2VNYXNzIiwiaW52ZXJzZUluZXJ0aWEiLCJtb21lbnQiLCJmcm9tVmVydGljZXMiLCJhdXRvSHVsbCIsImh1bGxDZW50cmUiLCJ0b3RhbCIsIl90b3RhbFByb3BlcnRpZXMiLCJyZWxhdGl2ZSIsInRvdGFsQXJlYSIsInRvdGFsSW5lcnRpYSIsImRlbHRhVGltZSIsImNvcnJlY3Rpb24iLCJkZWx0YVRpbWVTcXVhcmVkIiwidmVsb2NpdHlQcmV2WCIsInZlbG9jaXR5UHJldlkiLCJhcHBseUZvcmNlIiwib2Zmc2V0IiwicHJvcGVydGllcyIsIl9tb3Rpb25XYWtlVGhyZXNob2xkIiwiX21vdGlvblNsZWVwVGhyZXNob2xkIiwiX21pbkJpYXMiLCJ0aW1lRmFjdG9yIiwibWluTW90aW9uIiwibWF4TW90aW9uIiwic2xlZXBDb3VudGVyIiwiYWZ0ZXJDb2xsaXNpb25zIiwicGFpcnMiLCJwYWlyIiwiaXNBY3RpdmUiLCJjb2xsaXNpb24iLCJib2R5QSIsImJvZHlCIiwic2xlZXBpbmdCb2R5IiwibW92aW5nQm9keSIsIndhc1NsZWVwaW5nIiwiQ29sbGlzaW9uIiwiX3N1cHBvcnRzIiwiX292ZXJsYXBBQiIsIl9vdmVybGFwQkEiLCJQYWlyIiwib3ZlcmxhcCIsImF4aXMiLCJjb2xsaWRlZCIsInBhcmVudEEiLCJwYXJlbnRCIiwiZGVwdGgiLCJub3JtYWwiLCJ0YW5nZW50IiwicGVuZXRyYXRpb24iLCJzdXBwb3J0cyIsImNvbGxpZGVzIiwiX292ZXJsYXBBeGVzIiwibWluT3ZlcmxhcCIsInRhYmxlIiwibWluQXhpcyIsIm1pbkF4aXNYIiwibWluQXhpc1kiLCJzdXBwb3J0c0IiLCJfZmluZFN1cHBvcnRzIiwic3VwcG9ydENvdW50Iiwic3VwcG9ydHNBIiwidmVydGljZXNBIiwidmVydGljZXNCIiwib3ZlcmxhcEFCIiwib3ZlcmxhcEJBIiwidmVydGljZXNBTGVuZ3RoIiwidmVydGljZXNCTGVuZ3RoIiwidmVydGljZXNBWCIsInZlcnRpY2VzQVkiLCJ2ZXJ0aWNlc0JYIiwidmVydGljZXNCWSIsImF4ZXNMZW5ndGgiLCJvdmVybGFwTWluIiwiTnVtYmVyIiwiTUFYX1ZBTFVFIiwib3ZlcmxhcEF4aXNOdW1iZXIiLCJheGlzWCIsImF4aXNZIiwibWluQSIsIm1pbkIiLCJtYXhBIiwibWF4QiIsIl9wcm9qZWN0VG9BeGlzIiwicHJvamVjdGlvbiIsImRpcmVjdGlvbiIsInZlcnRleEMiLCJkaXN0YW5jZSIsImJvZHlBUG9zaXRpb25YIiwiYm9keUFQb3NpdGlvblkiLCJub3JtYWxYIiwibm9ybWFsWSIsIm5lYXJlc3REaXN0YW5jZSIsIkNvbnRhY3QiLCJ0aW1lc3RhbXAiLCJjb250YWN0cyIsImFjdGl2ZUNvbnRhY3RzIiwic2VwYXJhdGlvbiIsImNvbmZpcm1lZEFjdGl2ZSIsInRpbWVDcmVhdGVkIiwidGltZVVwZGF0ZWQiLCJwYXJlbnRBVmVydGljZXNMZW5ndGgiLCJzdXBwb3J0IiwiY29udGFjdElkIiwiY29udGFjdCIsInNldEFjdGl2ZSIsIkNvbnN0cmFpbnQiLCJfd2FybWluZyIsIl90b3JxdWVEYW1wZW4iLCJfbWluTGVuZ3RoIiwicG9pbnRBIiwicG9pbnRCIiwiaW5pdGlhbFBvaW50QSIsImluaXRpYWxQb2ludEIiLCJzdGlmZm5lc3MiLCJkYW1waW5nIiwiYW5ndWxhclN0aWZmbmVzcyIsImFuZ2xlQSIsImFuZ2xlQiIsImFuY2hvcnMiLCJwcmVTb2x2ZUFsbCIsImltcHVsc2UiLCJzb2x2ZUFsbCIsImZpeGVkQSIsImZpeGVkQiIsInNvbHZlIiwicG9pbnRBV29ybGQiLCJwb2ludEJXb3JsZCIsImN1cnJlbnRMZW5ndGgiLCJzaGFyZSIsIm5vcm1hbFZlbG9jaXR5IiwicmVsYXRpdmVWZWxvY2l0eSIsImRpZmZlcmVuY2UiLCJtYXNzVG90YWwiLCJyZXNpc3RhbmNlVG90YWwiLCJ6ZXJvIiwicG9zdFNvbHZlQWxsIiwiZ3JhZGllbnQiLCJ0b0ZpeGVkIiwieHgiLCJCb2RpZXMiLCJyZWN0YW5nbGUiLCJ3aWR0aCIsImhlaWdodCIsInRyYXBlem9pZCIsInNsb3BlIiwidmVydGljZXNQYXRoIiwieDEiLCJ4MiIsIngzIiwiY2lyY2xlIiwibWF4U2lkZXMiLCJzaWRlcyIsImNlaWwiLCJwb2x5Z29uIiwiUEkiLCJ5eSIsInZlcnRleFNldHMiLCJmbGFnSW50ZXJuYWwiLCJyZW1vdmVDb2xsaW5lYXIiLCJtaW5pbXVtQXJlYSIsInJlbW92ZUR1cGxpY2F0ZVBvaW50cyIsImNhbkRlY29tcCIsIkJvb2xlYW4iLCJxdWlja0RlY29tcCIsImNvbmNhdmUiLCJtYWtlQ0NXIiwicmVtb3ZlQ29sbGluZWFyUG9pbnRzIiwiZGVjb21wb3NlZCIsImNodW5rVmVydGljZXMiLCJwYXJ0QSIsInBhcnRCIiwicGF2IiwicGJ2IiwiZGEiLCJkYiIsIk1vdXNlIiwiZWxlbWVudCIsIm1vdXNlIiwiZG9jdW1lbnQiLCJhYnNvbHV0ZSIsIm1vdXNlZG93blBvc2l0aW9uIiwibW91c2V1cFBvc2l0aW9uIiwid2hlZWxEZWx0YSIsImJ1dHRvbiIsInBpeGVsUmF0aW8iLCJnZXRBdHRyaWJ1dGUiLCJzb3VyY2VFdmVudHMiLCJtb3VzZW1vdmUiLCJtb3VzZWRvd24iLCJtb3VzZXVwIiwibW91c2V3aGVlbCIsIl9nZXRSZWxhdGl2ZU1vdXNlUG9zaXRpb24iLCJjaGFuZ2VkVG91Y2hlcyIsInByZXZlbnREZWZhdWx0IiwiZGV0YWlsIiwic2V0RWxlbWVudCIsImFkZEV2ZW50TGlzdGVuZXIiLCJjbGVhclNvdXJjZUV2ZW50cyIsInNldE9mZnNldCIsInNldFNjYWxlIiwiZWxlbWVudEJvdW5kcyIsImdldEJvdW5kaW5nQ2xpZW50UmVjdCIsInJvb3ROb2RlIiwiZG9jdW1lbnRFbGVtZW50IiwicGFyZW50Tm9kZSIsInNjcm9sbFgiLCJ1bmRlZmluZWQiLCJwYWdlWE9mZnNldCIsInNjcm9sbExlZnQiLCJzY3JvbGxZIiwicGFnZVlPZmZzZXQiLCJzY3JvbGxUb3AiLCJ0b3VjaGVzIiwicGFnZVgiLCJsZWZ0IiwicGFnZVkiLCJ0b3AiLCJjbGllbnRXaWR0aCIsImNsaWVudEhlaWdodCIsIkRldGVjdG9yIiwic2V0Qm9kaWVzIiwiZGV0ZWN0b3IiLCJjb2xsaXNpb25zIiwiYm9kaWVzTGVuZ3RoIiwiY2FuQ29sbGlkZSIsIl9jb21wYXJlQm91bmRzWCIsImJvdW5kWE1heCIsImJvdW5kWU1heCIsImJvdW5kWU1pbiIsImJvZHlBU3RhdGljIiwicGFydHNBTGVuZ3RoIiwicGFydHNBU2luZ2xlIiwicGFydHNCTGVuZ3RoIiwicGFydHNCU3RhcnQiLCJmaWx0ZXJBIiwiZmlsdGVyQiIsIlBsdWdpbiIsIl9yZWdpc3RyeSIsInJlZ2lzdGVyIiwiaXNQbHVnaW4iLCJyZWdpc3RlcmVkIiwicGx1Z2luVmVyc2lvbiIsInZlcnNpb25QYXJzZSIsInZlcnNpb24iLCJudW1iZXIiLCJyZWdpc3RlcmVkVmVyc2lvbiIsInJlc29sdmUiLCJkZXBlbmRlbmN5IiwiZGVwZW5kZW5jeVBhcnNlIiwicmFuZ2UiLCJpbnN0YWxsIiwiaXNVc2VkIiwidXNlZCIsImlzRm9yIiwicGFyc2VkIiwiZm9yIiwidmVyc2lvblNhdGlzZmllcyIsInVzZSIsInBsdWdpbnMiLCJ1c2VzIiwiZGVwZW5kZW5jaWVzIiwic29ydGVkRGVwZW5kZW5jaWVzIiwic3RhdHVzIiwiX3dhcm5lZCIsInRyYWNrZWQiLCJwYXJzZWRCYXNlIiwicmVzb2x2ZWQiLCJ0ZXN0IiwicGF0dGVybiIsImV4ZWMiLCJtYWpvciIsIm1pbm9yIiwicGF0Y2giLCJpc1JhbmdlIiwib3BlcmF0b3IiLCJwcmVyZWxlYXNlIiwiUmVuZGVyIiwiX3JlcXVlc3RBbmltYXRpb25GcmFtZSIsIl9jYW5jZWxBbmltYXRpb25GcmFtZSIsInJlcXVlc3RBbmltYXRpb25GcmFtZSIsIndlYmtpdFJlcXVlc3RBbmltYXRpb25GcmFtZSIsIm1velJlcXVlc3RBbmltYXRpb25GcmFtZSIsIm1zUmVxdWVzdEFuaW1hdGlvbkZyYW1lIiwic2V0VGltZW91dCIsImNhbmNlbEFuaW1hdGlvbkZyYW1lIiwibW96Q2FuY2VsQW5pbWF0aW9uRnJhbWUiLCJ3ZWJraXRDYW5jZWxBbmltYXRpb25GcmFtZSIsIm1zQ2FuY2VsQW5pbWF0aW9uRnJhbWUiLCJfZ29vZEZwcyIsIl9nb29kRGVsdGEiLCJjb250cm9sbGVyIiwiZW5naW5lIiwiY2FudmFzIiwiZnJhbWVSZXF1ZXN0SWQiLCJ0aW1pbmciLCJoaXN0b3J5U2l6ZSIsImRlbHRhSGlzdG9yeSIsImxhc3RUaW1lIiwibGFzdFRpbWVzdGFtcCIsImxhc3RFbGFwc2VkIiwidGltZXN0YW1wRWxhcHNlZCIsInRpbWVzdGFtcEVsYXBzZWRIaXN0b3J5IiwiZW5naW5lRGVsdGFIaXN0b3J5IiwiZW5naW5lRWxhcHNlZEhpc3RvcnkiLCJlbGFwc2VkSGlzdG9yeSIsImJhY2tncm91bmQiLCJ3aXJlZnJhbWVCYWNrZ3JvdW5kIiwiaGFzQm91bmRzIiwiZW5hYmxlZCIsIndpcmVmcmFtZXMiLCJzaG93U2xlZXBpbmciLCJzaG93RGVidWciLCJzaG93U3RhdHMiLCJzaG93UGVyZm9ybWFuY2UiLCJzaG93Qm91bmRzIiwic2hvd1ZlbG9jaXR5Iiwic2hvd0NvbGxpc2lvbnMiLCJzaG93U2VwYXJhdGlvbnMiLCJzaG93QXhlcyIsInNob3dQb3NpdGlvbnMiLCJzaG93QW5nbGVJbmRpY2F0b3IiLCJzaG93SWRzIiwic2hvd1ZlcnRleE51bWJlcnMiLCJzaG93Q29udmV4SHVsbHMiLCJzaG93SW50ZXJuYWxFZGdlcyIsInNob3dNb3VzZVBvc2l0aW9uIiwiX2NyZWF0ZUNhbnZhcyIsImNvbnRleHQiLCJnZXRDb250ZXh0IiwidGV4dHVyZXMiLCJzaG93QnJvYWRwaGFzZSIsInNldFBpeGVsUmF0aW8iLCJhcHBlbmRDaGlsZCIsInJ1biIsImxvb3AiLCJ0aW1lIiwiX3VwZGF0ZVRpbWluZyIsIndvcmxkIiwic3RhdHMiLCJzdG9wIiwiX2dldFBpeGVsUmF0aW8iLCJzZXRBdHRyaWJ1dGUiLCJzdHlsZSIsImxvb2tBdCIsInBhZGRpbmciLCJjZW50ZXIiLCJ2aWV3SGVpZ2h0Iiwib3V0ZXJSYXRpbyIsImlubmVyUmF0aW8iLCJzdGFydFZpZXdUcmFuc2Zvcm0iLCJib3VuZHNXaWR0aCIsImJvdW5kc0hlaWdodCIsImJvdW5kc1NjYWxlWCIsImJvdW5kc1NjYWxlWSIsInNldFRyYW5zZm9ybSIsImVuZFZpZXdUcmFuc2Zvcm0iLCJzdGFydFRpbWUiLCJjdXJyZW50QmFja2dyb3VuZCIsIl9hcHBseUJhY2tncm91bmQiLCJnbG9iYWxDb21wb3NpdGVPcGVyYXRpb24iLCJmaWxsUmVjdCIsImVuYWJsZVNsZWVwaW5nIiwiYm9keUNvbnZleEh1bGxzIiwiYm9keVdpcmVmcmFtZXMiLCJib2R5Qm91bmRzIiwiYm9keUF4ZXMiLCJib2R5UG9zaXRpb25zIiwiYm9keVZlbG9jaXR5IiwiYm9keUlkcyIsInNlcGFyYXRpb25zIiwidmVydGV4TnVtYmVycyIsIm1vdXNlUG9zaXRpb24iLCJzZWN0aW9ucyIsImZvbnQiLCJ0ZXh0QmFzZWxpbmUiLCJ0ZXh0QWxpZ24iLCJzZWN0aW9uIiwiZmlsbFRleHQiLCJsYXN0RW5naW5lRGVsdGEiLCJsYXN0RGVsdGEiLCJkZWx0YU1lYW4iLCJfbWVhbiIsImVsYXBzZWRNZWFuIiwiZW5naW5lRGVsdGFNZWFuIiwiZW5naW5lRWxhcHNlZE1lYW4iLCJyYXRlTWVhbiIsImZwcyIsImdhcCIsInJvdW5kIiwiY291bnQiLCJpbmRpY2F0b3IiLCJwbG90WSIsImJlZ2luUGF0aCIsIm1vdmVUbyIsImxpbmVUbyIsInN0cm9rZSIsInN0YXJ0IiwiYXJjIiwiY2xvc2VQYXRoIiwiY29pbHMiLCJmaWxsIiwiZ2xvYmFsQWxwaGEiLCJ0ZXh0dXJlIiwiX2dldFRleHR1cmUiLCJkcmF3SW1hZ2UiLCJyZWN0Iiwibm9ybWFsUG9zWCIsIm5vcm1hbFBvc1kiLCJpbnNwZWN0b3IiLCJzZWxlY3RlZCIsIml0ZW0iLCJkYXRhIiwic2V0TGluZURhc2giLCJzZWxlY3RTdGFydCIsInNlbGVjdEJvdW5kcyIsInVuc2hpZnQiLCJjcmVhdGVFbGVtZW50Iiwib25jb250ZXh0bWVudSIsIm9uc2VsZWN0c3RhcnQiLCJkZXZpY2VQaXhlbFJhdGlvIiwid2Via2l0QmFja2luZ1N0b3JlUGl4ZWxSYXRpbyIsIm1vekJhY2tpbmdTdG9yZVBpeGVsUmF0aW8iLCJtc0JhY2tpbmdTdG9yZVBpeGVsUmF0aW8iLCJvQmFja2luZ1N0b3JlUGl4ZWxSYXRpbyIsImJhY2tpbmdTdG9yZVBpeGVsUmF0aW8iLCJpbWFnZVBhdGgiLCJpbWFnZSIsIkltYWdlIiwic3JjIiwiY3NzQmFja2dyb3VuZCIsImJhY2tncm91bmRTaXplIiwibm9ybWFsSW1wdWxzZSIsInRhbmdlbnRJbXB1bHNlIiwiRW5naW5lIiwiUmVzb2x2ZXIiLCJQYWlycyIsInBvc2l0aW9uSXRlcmF0aW9ucyIsInZlbG9jaXR5SXRlcmF0aW9ucyIsImNvbnN0cmFpbnRJdGVyYXRpb25zIiwiZ3Jhdml0eSIsImdyaWQiLCJidWNrZXRzIiwiYnJvYWRwaGFzZSIsIm1ldHJpY3MiLCJfYm9kaWVzQXBwbHlHcmF2aXR5IiwiX2JvZGllc1VwZGF0ZSIsImNvbGxpc2lvblN0YXJ0IiwicHJlU29sdmVQb3NpdGlvbiIsInNvbHZlUG9zaXRpb24iLCJwb3N0U29sdmVQb3NpdGlvbiIsInByZVNvbHZlVmVsb2NpdHkiLCJzb2x2ZVZlbG9jaXR5IiwiY29sbGlzaW9uQWN0aXZlIiwiY29sbGlzaW9uRW5kIiwiX2JvZGllc0NsZWFyRm9yY2VzIiwibWVyZ2UiLCJlbmdpbmVBIiwiZW5naW5lQiIsImdyYXZpdHlTY2FsZSIsIndvcmxkQm91bmRzIiwiX3Jlc3RpbmdUaHJlc2giLCJfcmVzdGluZ1RocmVzaFRhbmdlbnQiLCJfcG9zaXRpb25EYW1wZW4iLCJfcG9zaXRpb25XYXJtaW5nIiwiX2ZyaWN0aW9uTm9ybWFsTXVsdGlwbGllciIsImFjdGl2ZUNvdW50IiwicGFpcnNMZW5ndGgiLCJjb250YWN0U2hhcmUiLCJwb3NpdGlvbkRhbXBlbiIsInBvc2l0aW9uV2FybWluZyIsInZlcnRpY2VzVHJhbnNsYXRlIiwiYm91bmRzVXBkYXRlIiwicG9zaXRpb25JbXB1bHNlWCIsInBvc2l0aW9uSW1wdWxzZVkiLCJjb250YWN0c0xlbmd0aCIsImNvbnRhY3RWZXJ0ZXgiLCJpbXB1bHNlWCIsImltcHVsc2VZIiwibWF4RnJpY3Rpb24iLCJ0aW1lU2NhbGVTcXVhcmVkIiwicmVzdGluZ1RocmVzaCIsImZyaWN0aW9uTm9ybWFsTXVsdGlwbGllciIsInJlc3RpbmdUaHJlc2hUYW5nZW50IiwiTnVtYmVyTWF4VmFsdWUiLCJib2R5QVZlbG9jaXR5IiwiYm9keUJWZWxvY2l0eSIsInRhbmdlbnRYIiwidGFuZ2VudFkiLCJpbnZlcnNlTWFzc1RvdGFsIiwib2Zmc2V0QVgiLCJvZmZzZXRBWSIsIm9mZnNldEJYIiwib2Zmc2V0QlkiLCJ2ZWxvY2l0eVBvaW50QVgiLCJ2ZWxvY2l0eVBvaW50QVkiLCJyZWxhdGl2ZVZlbG9jaXR5WCIsInJlbGF0aXZlVmVsb2NpdHlZIiwidGFuZ2VudFZlbG9jaXR5Iiwibm9ybWFsT3ZlcmxhcCIsIm5vcm1hbEZvcmNlIiwiZnJpY3Rpb25MaW1pdCIsIm9BY04iLCJvQmNOIiwiY29udGFjdE5vcm1hbEltcHVsc2UiLCJjb250YWN0VGFuZ2VudEltcHVsc2UiLCJwYWlySW5kZXgiLCJwYWlyc0xpc3QiLCJwYWlyc0xpc3RMZW5ndGgiLCJwYWlyc1RhYmxlIiwiY29sbGlzaW9uc0xlbmd0aCIsInJlbW92ZVBhaXJJbmRleCIsIk1hdHRlciIsIkNvbXBvc2l0ZXMiLCJHcmlkIiwiTW91c2VDb25zdHJhaW50IiwiUXVlcnkiLCJSdW5uZXIiLCJTQVQiLCJTdmciLCJXb3JsZCIsImJlZm9yZSIsImFmdGVyIiwic3RhY2siLCJjb2x1bW5zIiwicm93cyIsImNvbHVtbkdhcCIsInJvd0dhcCIsImxhc3RCb2R5Iiwicm93IiwibWF4SGVpZ2h0IiwiY29sdW1uIiwiYm9keUhlaWdodCIsImJvZHlXaWR0aCIsInhPZmZzZXRBIiwieU9mZnNldEEiLCJ4T2Zmc2V0QiIsInlPZmZzZXRCIiwiYm9keUFIZWlnaHQiLCJib2R5QVdpZHRoIiwiYm9keUJIZWlnaHQiLCJtZXNoIiwiY3Jvc3NCcmFjZSIsImNvbCIsImJvZHlDIiwicHlyYW1pZCIsImFjdHVhbFJvd3MiLCJsYXN0Qm9keVdpZHRoIiwibmV3dG9uc0NyYWRsZSIsInNpemUiLCJjYXIiLCJ3aGVlbFNpemUiLCJ3aGVlbEFPZmZzZXQiLCJ3aGVlbEJPZmZzZXQiLCJ3aGVlbEEiLCJ3aGVlbEIiLCJheGVsQSIsImF4ZWxCIiwic29mdEJvZHkiLCJwYXJ0aWNsZVJhZGl1cyIsInBhcnRpY2xlT3B0aW9ucyIsImNvbnN0cmFpbnRPcHRpb25zIiwiYnVja2V0V2lkdGgiLCJidWNrZXRIZWlnaHQiLCJmb3JjZVVwZGF0ZSIsImJ1Y2tldCIsImJ1Y2tldElkIiwiZ3JpZENoYW5nZWQiLCJuZXdSZWdpb24iLCJfZ2V0UmVnaW9uIiwicmVnaW9uIiwidW5pb24iLCJfcmVnaW9uVW5pb24iLCJzdGFydENvbCIsImVuZENvbCIsInN0YXJ0Um93IiwiZW5kUm93IiwiX2dldEJ1Y2tldElkIiwiaXNJbnNpZGVOZXdSZWdpb24iLCJpc0luc2lkZU9sZFJlZ2lvbiIsIl9idWNrZXRSZW1vdmVCb2R5IiwiX2NyZWF0ZUJ1Y2tldCIsIl9idWNrZXRBZGRCb2R5IiwiX2NyZWF0ZUFjdGl2ZVBhaXJzTGlzdCIsInJlZ2lvbkEiLCJyZWdpb25CIiwiX2NyZWF0ZVJlZ2lvbiIsImdyaWRQYWlycyIsInBhaXJJZCIsImJ1Y2tldExlbmd0aCIsInBhaXJLZXlzIiwicGFpcktleXNMZW5ndGgiLCJtb3VzZUNvbnN0cmFpbnQiLCJfdHJpZ2dlckV2ZW50cyIsIm1vdXNlRXZlbnRzIiwicGFydHNBU3RhcnQiLCJyYXkiLCJzdGFydFBvaW50IiwiZW5kUG9pbnQiLCJyYXlXaWR0aCIsInJheUFuZ2xlIiwicmF5TGVuZ3RoIiwicmF5WCIsInJheVkiLCJvdXRzaWRlIiwiX2ZyYW1lVGltZW91dCIsImNsZWFyVGltZW91dCIsInJ1bm5lciIsImRlbHRhU2FtcGxlU2l6ZSIsImNvdW50ZXJUaW1lc3RhbXAiLCJmcmFtZUNvdW50ZXIiLCJ0aW1lUHJldiIsInRpbWVTY2FsZVByZXYiLCJpc0ZpeGVkIiwiZGVsdGFNaW4iLCJkZWx0YU1heCIsInRpY2siLCJwYXRoVG9WZXJ0aWNlcyIsInNhbXBsZUxlbmd0aCIsImlsIiwic2VnbWVudCIsInNlZ21lbnRzIiwic2VnbWVudHNRdWV1ZSIsImxhc3RTZWdtZW50IiwibGFzdFBvaW50IiwibHgiLCJseSIsImFkZFBvaW50IiwicHgiLCJweSIsInBhdGhTZWdUeXBlIiwiaXNSZWxhdGl2ZSIsImFkZFNlZ21lbnRQb2ludCIsInNlZ1R5cGUiLCJwYXRoU2VnVHlwZUFzTGV0dGVyIiwidG9VcHBlckNhc2UiLCJfc3ZnUGF0aFRvQWJzb2x1dGUiLCJnZXRUb3RhbExlbmd0aCIsInBhdGhTZWdMaXN0IiwibnVtYmVyT2ZJdGVtcyIsImdldEl0ZW0iLCJnZXRQYXRoU2VnQXRMZW5ndGgiLCJnZXRQb2ludEF0TGVuZ3RoIiwieDAiLCJ5MCIsInkxIiwieTIiLCJzZWdzIiwibGVuIiwic2VnIiwicmVwbGFjZUl0ZW0iLCJjcmVhdGVTVkdQYXRoU2VnTW92ZXRvQWJzIiwiY3JlYXRlU1ZHUGF0aFNlZ0xpbmV0b0FicyIsImNyZWF0ZVNWR1BhdGhTZWdMaW5ldG9Ib3Jpem9udGFsQWJzIiwiY3JlYXRlU1ZHUGF0aFNlZ0xpbmV0b1ZlcnRpY2FsQWJzIiwiY3JlYXRlU1ZHUGF0aFNlZ0N1cnZldG9DdWJpY0FicyIsImNyZWF0ZVNWR1BhdGhTZWdDdXJ2ZXRvQ3ViaWNTbW9vdGhBYnMiLCJjcmVhdGVTVkdQYXRoU2VnQ3VydmV0b1F1YWRyYXRpY0FicyIsImNyZWF0ZVNWR1BhdGhTZWdDdXJ2ZXRvUXVhZHJhdGljU21vb3RoQWJzIiwiY3JlYXRlU1ZHUGF0aFNlZ0FyY0FicyIsInIxIiwicjIiLCJsYXJnZUFyY0ZsYWciLCJzd2VlcEZsYWciLCJwYXJzZXJGdW5jdGlvbiIsInBhcnNlU1ZHIiwibWFrZUFic29sdXRlIiwiY29tbWFuZHMiLCJzdWJwYXRoU3RhcnQiLCJwcmV2Q21kIiwiYXR0ciIsImZvckVhY2giLCJjbWQiLCJhIiwiY29tbWFuZCIsImNvZGUiLCJwZWckU3ludGF4RXJyb3IiLCJleHBlY3RlZCIsImZvdW5kIiwibG9jYXRpb24iLCJ0aGlzIiwiRXJyb3IiLCJjYXB0dXJlU3RhY2tUcmFjZSIsImNoaWxkIiwiY3RvciIsInBlZyRzdWJjbGFzcyIsImJ1aWxkTWVzc2FnZSIsIkRFU0NSSUJFX0VYUEVDVEFUSU9OX0ZOUyIsImxpdGVyYWwiLCJleHBlY3RhdGlvbiIsImxpdGVyYWxFc2NhcGUiLCJ0ZXh0IiwiZXNjYXBlZFBhcnRzIiwiY2xhc3NFc2NhcGUiLCJpbnZlcnRlZCIsImFueSIsIm90aGVyIiwiZGVzY3JpcHRpb24iLCJoZXgiLCJjaCIsImNoYXJDb2RlQXQiLCJkZXNjcmlwdGlvbnMiLCJkZXNjcmliZUV4cGVjdGVkIiwiZGVzY3JpYmVGb3VuZCIsIlN5bnRheEVycm9yIiwicGFyc2UiLCJpbnB1dCIsInBlZyRyZXN1bHQiLCJwZWckRkFJTEVEIiwicGVnJHN0YXJ0UnVsZUZ1bmN0aW9ucyIsInN2Z19wYXRoIiwicGVnJHBhcnNlc3ZnX3BhdGgiLCJwZWckc3RhcnRSdWxlRnVuY3Rpb24iLCJwZWckYzEiLCJmaXJzdCIsIm1vcmUiLCJwZWckYzIiLCJwZWckYzMiLCJwZWckY2xhc3NFeHBlY3RhdGlvbiIsInBlZyRjNSIsInBlZyRjNiIsInBlZyRjOCIsInBlZyRjOSIsInBlZyRjMTAiLCJwZWckYzExIiwicGVnJGMxMiIsInBlZyRjMTQiLCJwZWckYzE1IiwicGVnJGMxNyIsInBlZyRjMTgiLCJwZWckYzIwIiwicGVnJGMyMSIsInBlZyRjMjMiLCJwZWckYzI0IiwicGVnJGMyNiIsInBlZyRjMjciLCJwZWckYzI4IiwicGVnJGMyOSIsInBlZyRjMzQiLCJwZWckYzM1IiwicGVnJGMzOSIsInBlZyRsaXRlcmFsRXhwZWN0YXRpb24iLCJwZWckYzQwIiwicGVnJGM0MiIsInBlZyRjNDMiLCJwZWckYzQ0IiwicGVnJGM0NSIsInBlZyRjNDYiLCJwZWckYzQ3IiwicGVnJGM0OCIsInBlZyRjNTAiLCJwZWckYzUxIiwicGVnJGN1cnJQb3MiLCJwZWckcG9zRGV0YWlsc0NhY2hlIiwibGluZSIsInBlZyRtYXhGYWlsUG9zIiwicGVnJG1heEZhaWxFeHBlY3RlZCIsInN0YXJ0UnVsZSIsImlnbm9yZUNhc2UiLCJwZWckY29tcHV0ZVBvc0RldGFpbHMiLCJwb3MiLCJkZXRhaWxzIiwicGVnJGNvbXB1dGVMb2NhdGlvbiIsInN0YXJ0UG9zIiwiZW5kUG9zIiwic3RhcnRQb3NEZXRhaWxzIiwiZW5kUG9zRGV0YWlscyIsInBlZyRmYWlsIiwiczAiLCJzMSIsInMyIiwiczMiLCJzNCIsInBlZyRwYXJzZXdzcCIsInM1IiwicGVnJHBhcnNlbW92ZVRvX2RyYXdUb19jb21tYW5kR3JvdXAiLCJwZWckcGFyc2Vtb3ZlVG9fZHJhd1RvX2NvbW1hbmRHcm91cHMiLCJjbWRzIiwicGVnJGMwIiwiczYiLCJwZWckcGFyc2Vjb29yZGluYXRlX3BhaXIiLCJwZWckcGFyc2Vjb21tYV93c3AiLCJwZWckcGFyc2VsaW5ldG9fYXJndW1lbnRfc2VxdWVuY2UiLCJwZWckcGFyc2Vtb3ZldG8iLCJwZWckcGFyc2VkcmF3dG9fY29tbWFuZCIsInBlZyRwYXJzZWxpbmV0byIsInBlZyRwYXJzZWNvb3JkaW5hdGVfc2VxdWVuY2UiLCJwZWckcGFyc2Vob3Jpem9udGFsX2xpbmV0byIsInBlZyRwYXJzZXZlcnRpY2FsX2xpbmV0byIsInBlZyRwYXJzZWN1cnZldG9fYXJndW1lbnQiLCJwZWckcGFyc2VjdXJ2ZXRvX2FyZ3VtZW50X3NlcXVlbmNlIiwicGVnJHBhcnNlY3VydmV0byIsInBlZyRwYXJzZXNtb290aF9jdXJ2ZXRvX2FyZ3VtZW50IiwicGVnJHBhcnNlc21vb3RoX2N1cnZldG9fYXJndW1lbnRfc2VxdWVuY2UiLCJwZWckcGFyc2VzbW9vdGhfY3VydmV0byIsInBlZyRwYXJzZXF1YWRyYXRpY19iZXppZXJfY3VydmV0b19hcmd1bWVudCIsInBlZyRwYXJzZXF1YWRyYXRpY19iZXppZXJfY3VydmV0b19hcmd1bWVudF9zZXF1ZW5jZSIsInBlZyRwYXJzZXF1YWRyYXRpY19iZXppZXJfY3VydmV0byIsInBlZyRwYXJzZXNtb290aF9xdWFkcmF0aWNfYmV6aWVyX2N1cnZldG9fYXJndW1lbnRfc2VxdWVuY2UiLCJwZWckcGFyc2VzbW9vdGhfcXVhZHJhdGljX2Jlemllcl9jdXJ2ZXRvIiwicGVnJHBhcnNlZWxsaXB0aWNhbF9hcmNfYXJndW1lbnQiLCJwZWckcGFyc2VlbGxpcHRpY2FsX2FyY19hcmd1bWVudF9zZXF1ZW5jZSIsInBlZyRwYXJzZWVsbGlwdGljYWxfYXJjIiwicGVnJHBhcnNlbnVtYmVyIiwiYiIsInM3IiwiczgiLCJzOSIsInMxMCIsInMxMSIsInh5IiwicGVnJHBhcnNlbm9ubmVnYXRpdmVfbnVtYmVyIiwicGVnJHBhcnNlZmxhZyIsInJ4IiwicnkiLCJ4QXhpc1JvdGF0aW9uIiwibGFyZ2VBcmMiLCJzd2VlcCIsInBlZyRwYXJzZWZsb2F0aW5nX3BvaW50X2NvbnN0YW50IiwicGVnJHBhcnNlZGlnaXRfc2VxdWVuY2UiLCJwZWckcGFyc2VzaWduIiwicGVnJHBhcnNlY29tbWEiLCJwZWckcGFyc2VmcmFjdGlvbmFsX2NvbnN0YW50IiwicGVnJHBhcnNlZXhwb25lbnQiLCJoIiwicSIsInRvTG93ZXJDYXNlIiwiX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fIiwiX193ZWJwYWNrX3JlcXVpcmVfXyIsImNhY2hlZE1vZHVsZSIsIl9fd2VicGFja19tb2R1bGVzX18iLCJkZWZpbml0aW9uIiwiZ2xvYmFsVGhpcyIsIkZ1bmN0aW9uIiwiZmluZERpc3RhbmNlVmVjIiwicDEiLCJwMiIsIm11bHRpcGx5VmVjIiwidmVjdG9yRXF1YWxzIiwiZmluZEFuZ2xlIiwicmFkaWFucyIsIlZ4IiwiVnkiLCJpbnRlcnNlY3RzIiwibGluZTEiLCJsaW5lMiIsInExIiwicTIiLCJyeHMiLCJxcHhyIiwiaXNaZXJvIiwicTFwMXJMZW5ndGgiLCJwMXExc0xlbmd0aCIsInJTcXVhcmVkTGVuZ3RoIiwic1NxdWFyZWRMZW5ndGgiLCJ1Iiwic3VwcG9ydGVkQ29tbWFuZFR5cGVzIiwicmFuZG9tVVVJRCIsImNyeXB0byIsImdldFJhbmRvbVZhbHVlcyIsInJuZHM4IiwiVWludDhBcnJheSIsInJuZyIsImJ5dGVUb0hleCIsImJ1ZiIsInJuZHMiLCJhcnIiLCJ1bnNhZmVTdHJpbmdpZnkiLCJfaWQiLCJfcGFyZW50IiwiX3ZhbHVlIiwiX2NoaWxkcmVuIiwiYWRkQ2hpbGQiLCJBZ2dyZWdhdGlvbk5vZGUiLCJhZGRDaGlsZE5vZGUiLCJnZXRDaGlsZHJlblJlY3Vyc2l2ZWx5IiwiY2hpbGRyZW4iLCJzdWJDaGlsZCIsImdldFJvb3QiLCJhZ2dyZWdhdGlvbkZjbiIsIl9yb290cyIsIl9hZ2dyZWdhdGlvbkZjbiIsImdldEFnZ3JlZ2F0ZWRDb21tYW5kcyIsImFkZFZhbHVlIiwibm9kZXNDb2xsaWRlZCIsImdldEFsbE5vZGVzIiwiZmluZEluZGV4IiwiZmxhdE1hcCIsImNyb3NzUHJvZHVjdCIsImRvdFByb2R1Y3QiLCJjcnQiLCJwaSIsInRhdSIsInF1YXJ0Iiwibk1heCIsIk1BWF9TQUZFX0lOVEVHRVIiLCJuTWluIiwiTUlOX1NBRkVfSU5URUdFUiIsIlpFUk8iLCJ1dGlscyIsIlR2YWx1ZXMiLCJDdmFsdWVzIiwiYXJjZm4iLCJkZXJpdmF0aXZlRm4iLCJjb21wdXRlIiwiXzNkIiwib3JkZXIiLCJtdCIsInJldCIsIm10MiIsInQyIiwiZENwdHMiLCJKU09OIiwic3RyaW5naWZ5IiwiY29tcHV0ZVdpdGhSYXRpb3MiLCJyYXRpb3MiLCJmMSIsImYyIiwiZjMiLCJmNCIsImRlcml2ZSIsImRwb2ludHMiLCJkcHQiLCJiZXR3ZWVuIiwiTSIsImFwcHJveGltYXRlbHkiLCJzdW0iLCJkcyIsImRlIiwidHMiLCJ0ZSIsImxlcnAiLCJ2MSIsInYyIiwicG9pbnRUb1N0cmluZyIsInBvaW50c1RvU3RyaW5nIiwiY29weSIsImR4MSIsImR5MSIsImR4MiIsImR5MiIsInN1YnN0cmluZyIsImRpc3QiLCJjbG9zZXN0IiwiTFVUIiwibXBvcyIsIm1kaXN0IiwiaWR4IiwiYWJjcmF0aW8iLCJib3R0b20iLCJwcm9qZWN0aW9ucmF0aW8iLCJsbGk4IiwieTMiLCJ4NCIsInk0IiwibGxpNCIsInAzIiwicDQiLCJsbGkiLCJtYWtlbGluZSIsIkJlemllciIsImZpbmRiYm94IiwibXgiLCJteSIsIk1YIiwiTVkiLCJiYm94IiwibWlkIiwic2hhcGVpbnRlcnNlY3Rpb25zIiwiYmJveDEiLCJiYm94MiIsImN1cnZlSW50ZXJzZWN0aW9uVGhyZXNob2xkIiwiYmJveG92ZXJsYXAiLCJpbnRlcnNlY3Rpb25zIiwiYTEiLCJzdGFydGNhcCIsImZvcndhcmQiLCJiYWNrIiwiZW5kY2FwIiwiYTIiLCJsMSIsInZpcnR1YWwiLCJsMiIsImlzcyIsImMxIiwiYzIiLCJtYWtlc2hhcGUiLCJicGwiLCJmcGwiLCJzaGFwZSIsImdldG1pbm1heCIsImN1cnZlIiwiYWxpZ24iLCJ0eCIsInR5Iiwicm9vdHMiLCJhbGlnbmVkIiwicmVkdWNlIiwibTEiLCJtMiIsInBhIiwicGIiLCJwYyIsImRpc2NyaW1pbmFudCIsInUxIiwibXAzIiwicGhpIiwidDEiLCJzZCIsImRyb290cyIsImN1cnZhdHVyZSIsImQxIiwiZDIiLCJrT25seSIsIm51bSIsImRubSIsImFkayIsImRrIiwiZGQiLCJxZHN1bSIsInBrIiwibmsiLCJpbmZsZWN0aW9ucyIsInYzIiwidHJtIiwic3EiLCJiMSIsImIyIiwiZGltcyIsImRpbSIsImV4cGFuZGJveCIsIl9iYm94IiwicGFpcml0ZXJhdGlvbiIsImMxYiIsImMyYiIsInRocmVzaG9sZCIsIl90MSIsIl90MiIsImNjMSIsImNjMiIsInJpZ2h0IiwicmVzdWx0cyIsImdldGNjZW50ZXIiLCJkeDFwIiwiZHkxcCIsImR4MnAiLCJkeTJwIiwibXgxIiwibXkxIiwibXgyIiwibXkyIiwibXgxbiIsIm15MW4iLCJteDJuIiwibXkybiIsIl8iLCJudW1iZXJTb3J0IiwiUG9seUJlemllciIsImN1cnZlcyIsInZhbHVlT2YiLCJhZGRDdXJ2ZSIsImFicyQxIiwiY29zJDEiLCJzaW4kMSIsImFjb3MkMSIsInNxcnQkMSIsInBpJDEiLCJjb29yZHMiLCJmcm9tIiwiY29vcmRsZW4iLCJuZXdhcmdzIiwiaGlnaGVyIiwic3RlcCIsImRpbWxlbiIsImJhc2VsZW5ndGgiLCJfbGluZWFyIiwiX2x1dCIsInN0YXRpYyIsImFiYyIsImdldEFCQyIsIkEiLCJTIiwiQiIsIkUiLCJDIiwic2VsZW4iLCJieDEiLCJieTEiLCJieDIiLCJieTIiLCJlMSIsImUyIiwibmMxIiwibmMyIiwiZ2V0VXRpbHMiLCJ0b1NWRyIsImxhc3QiLCJzZXRSYXRpb3MiLCJ2ZXJpZnkiLCJwcmludCIsImNvb3JkRGlnZXN0IiwiX3ByaW50IiwiY29tcHV0ZWRpcmVjdGlvbiIsImNsb2Nrd2lzZSIsImRlcml2YXRpdmUiLCJ1bSIsImdldExVVCIsInN0ZXBzIiwiZXJyb3IiLCJsdXQiLCJoaXRzIiwicHJvamVjdCIsImZ0IiwicmFpc2UiLCJucCIsInBpbSIsImRkZXJpdmF0aXZlIiwiX19ub3JtYWwzIiwiX19ub3JtYWwyIiwiUiIsIl9wIiwicHQiLCJzcGFuIiwiZXh0cmVtYSIsIm1mbiIsImxiYm94IiwidGJib3giLCJudiIsInNpbXBsZSIsIm4xIiwibjIiLCJwYXNzMSIsInBhc3MyIiwiZGlzdGFuY2VGbiIsIm92IiwicmMiLCJvdXRsaW5lIiwiZDMiLCJkNCIsImZsaW5lIiwiYmxpbmUiLCJscyIsImxlIiwicmVkdWNlZCIsImZjdXJ2ZXMiLCJiY3VydmVzIiwiYWxlbiIsInRsZW4iLCJncmFkdWF0ZWQiLCJsaW5lYXJEaXN0YW5jZUZ1bmN0aW9uIiwic2xlbiIsInJldmVyc2UiLCJmcyIsImZlIiwiYnMiLCJiZSIsIm91dGxpbmVzaGFwZXMiLCJzaGFwZXMiLCJsaW5lSW50ZXJzZWN0cyIsImN1cnZlaW50ZXJzZWN0cyIsInNlbGZpbnRlcnNlY3RzIiwiYXJjcyIsImVycm9yVGhyZXNob2xkIiwiX2l0ZXJhdGUiLCJfZXJyb3IiLCJucDEiLCJyZWYiLCJjaXJjbGVzIiwic2FmZXR5IiwidF9zIiwidF9lIiwibnAyIiwibnAzIiwicHJldl9hcmMiLCJkb25lIiwiY3Vycl9nb29kIiwicHJldl9nb29kIiwidF9tIiwicHJldl9lIiwiaW50ZXJ2YWwiLCJmaW5kQ2VudGVyT2ZDb21tYW5kIiwiZmluZENlbnRlck9mTGluZUNvbW1hbmQiLCJmaW5kQ2VudGVyT2ZDdXJ2ZUNvbW1hbmQiLCJmaW5kQ3VydmVQb2ludHMiLCJiZXppZXJDZW50ZXIiLCJmaW5kQW5nbGVPZkxpbmVDb21tYW5kIiwiZmluZExlbmd0aE9mTGluZUNvbW1hbmQiLCJjdXJ2ZVN0YXJ0IiwiY3VydmVFbmQiLCJsaW5lU3RhcnQiLCJsaW5lRW5kIiwiY3VydmUxIiwiY3VydmUyIiwiY3VydmUxU3RhcnQiLCJjdXJ2ZTFFbmQiLCJjdXJ2ZTJTdGFydCIsImN1cnZlMkVuZCIsImJlemllcjEiLCJiZXppZXIyIiwicG9pbnRWZWMiLCJwb2ludDEiLCJwb2ludDIiLCJwb2ludDFWZWMiLCJwb2ludDJWZWMiLCJfaW50ZXJzZWN0b3JSZWdpc3RyeSIsIkxpbmVMaW5lSW50ZXJzZWN0b3IiLCJMaW5lUG9pbnRJbnRlcnNlY3RvciIsIkxpbmVDdXJ2ZUludGVyc2VjdG9yIiwiQ3VydmVDdXJ2ZUludGVyc2VjdG9yIiwiQ3VydmVQb2ludEludGVyc2VjdG9yIiwiUG9pbnRQb2ludEludGVyc2VjdG9yIiwiYWdncmVnYXRlIiwicGF0aENvbW1hbmRzIiwiZmxhdENvbW1hbmRzIiwiYWdncmVnYXRpb25UcmVlIiwiQWdncmVnYXRpb25UcmVlIiwic2hhcGUxIiwic2hhcGUyIiwiaW50ZXJzZWN0IiwiY21kMSIsImNtZDIiLCJyZWdpc3RyeSIsIm1hdGNoaW5nSW50ZXJzZWN0b3IiLCJmaW5kIiwiaW50ZXJzZWN0b3IiLCJjbWRUeXBlIiwiaW5jbHVkZXMiLCJsaW5lQ21kIiwiY29sbGlkZXJTaXplIiwiX2xpbmVDbWQiLCJsaW5lTWlkUG9pbnQiLCJsaW5lTGVuZ3RoIiwibGluZUFuZ2xlIiwiX3BvaW50IiwiX2JvZHkiLCJfYm9kaWVzIiwidXBkYXRlU3ZnQ29tbWFuZCIsIm1vdmVDbWQiLCJfbW92ZUNtZCIsImNyZWF0ZVBvaW50cyIsImJlemllciIsIm51bWJlck9mUG9pbnRzIiwiZnJhY3Rpb24iLCJjcmVhdGVJbm5lckJvZGllcyIsImN1cnZlUG9pbnRzIiwiYmV6aWVyUG9pbnRzIiwiYnAiLCJjdXJyZW50IiwibmV4dCIsIm1pZFBvaW50IiwiX2N1cnZlIiwiX3BvaW50MSIsIl9wb2ludDIiLCJfcG9pbnQzIiwiQWJzdHJhY3RDdXJ2ZUJvZHkiLCJjbG9zZUNtZCIsIl9jbG9zZUNtZCIsInN2Z0RhdGEiLCJnbG9iYWxDb25maWciLCJfc3ZnRGF0YSIsIl9lbmdpbmUiLCJfd29ybGQiLCJfY29tbWFuZEJvZGllcyIsIl9wbHVnaW5zIiwicm9vdEJvZGllcyIsImFnZ3JlZ2F0ZWRDb21tYW5kcyIsIm1pZFgiLCJhY2MiLCJjdXIiLCJtaWRZIiwicm9vdEJvZHkiLCJjb21tYW5kQm9kaWVzIiwiTGluZUJvZHkiLCJQb2ludEJvZHkiLCJDdXJ2ZUJvZHkiLCJRdWFkcmF0aWNDdXJ2ZUJvZHkiLCJSZWZsZWN0aW9uQ3VydmVCb2R5IiwiQ2xvc2VQYXRoQm9keSIsInBoeXNCb2R5RmFjdG9yeSIsImNvbGxpZGVyV2lkdGgiLCJwaHlzQm9kaWVzIiwicGh5c0JvZHkiLCJzZXR1cCIsImFnZ3JlZ2F0ZWRTaGFwZXMiLCJzdmciLCJfc3ZnIiwiX3N0cm9rZVdpZHRoIiwiX3dpZHRoIiwiX2hlaWdodCIsIl9wYXRoQ29tbWFuZHMiLCJfYWdncmVnYXRlZENvbW1hbmRzIiwidmlld0JveFN0cmluZyIsIl92aWV3Qm94IiwibWlueCIsIm1pbnkiLCJfZ3Jhdml0eSIsIm9mZnNldFgiLCJvZmZzZXRZIiwid2FsbFNpemUiLCJ2aWV3Qm94IiwidmJXaWR0aCIsInZiSGVpZ2h0IiwidmJXaFJhdGlvIiwid2hSYXRpbyIsIm1vdXNlRm9yY2UiLCJfbW91c2VGb3JjZSIsImV2IiwiX21vdXNlUG9zIiwiX3ByZXZpb3VzTW91c2VQb3MiLCJlbGVtZW50VG9BZGRDYW52YXMiLCJfZWxlbWVudFRvQWRkQ2FudmFzIiwicGh5c0VuZ2luZSIsInJlbmRlckVsZW1lbnQiLCJwYXJlbnRFbGVtZW50IiwiX3JlbmRlcmVyIiwic2VyaWFsaXplQ29tbWFuZCIsIl9zdG9wcGVkIiwicmVuZGVyTG9vcCIsInBoeXNpY3MiLCJzdmdQYXRocyIsImdldEVsZW1lbnRzQnlUYWdOYW1lIiwidXBkYXRlRnJhbWUiLCJwYXRoU3RyaW5nIiwiX2ZvcmNlIiwiX2xpc3RlbmVyIiwiX3Njcm9sbFBvcyIsIl9wcmV2aW91c1Njcm9sbFBvcyIsInJlbW92ZUV2ZW50TGlzdGVuZXIiLCJtYXhTcGVlZCIsIl9tYXhTcGVlZCIsInJlbmRlcmVyIiwiX3BoeXNpY3MiLCJhZ2dyZWdhdG9yIiwiX2FnZ3JlZ2F0b3IiLCJ3aXRoR3Jhdml0eSIsIkdyYXZpdHlQbHVnaW4iLCJ3aXRoQm9yZGVyQ29sbGlkZXIiLCJWaWV3Q29sbGlkZXJCb3JkZXIiLCJ3aXRoTW91c2VJbnRlcmFjdGlvbiIsIk1vdXNlUGx1Z2luIiwid2l0aFNjcm9sbEludGVyYWN0aW9uIiwic2Nyb2xsRm9yY2UiLCJTY3JvbGxQbHVnaW4iLCJ3aXRoRGVidWdSZW5kZXJlciIsIlJlbmRlcmVyUGx1Z2luIiwid2l0aEN1c3RvbVBsdWdpbiIsIndpdGhMaW1pdFZlbG9jaXR5UGx1Z2luIiwiTGltaXRWZWxvY2l0eVBsdWdpbiIsIndpdGhMaW1pdEFuZ3VsYXJWZWxvY2l0eVBsdWdpbiIsIkxpbWl0QW5ndWxhclZlbG9jaXR5UGx1Z2luIiwic3RhcnRTaW11bGF0aW9uIiwiY29uZmlnIiwiY3JlYXRlU3ZnRGF0YSIsIk1hdHRlckpzUGh5c2ljcyIsIlByb2R1Y3Rpb25SZW5kZXJlciIsIlN0b3BQaHlzaWNhbFN2ZyIsInBhdGhDb21tYW5kQXJyYXkiLCJMaW5lIiwiU3ZnRGF0YSIsInVzZUNvbGxpc2lvbkFnZ3JlZ2F0b3IiLCJTaW11bGF0aW9uQnVpbGRlciIsIkNvbGxpc2lvbkFnZ3JlZ2F0b3IiLCJ1c2VQYXRoQWdncmVnYXRvciIsIlBhdGhBZ2dyZWdhdG9yIiwidXNlQ3VzdG9tQWdncmVnYXRvciIsIlBoeXNpY2FsU3ZnIiwiQWdncmVnYXRvckJ1aWxkZXIiXSwic291cmNlUm9vdCI6IiJ9