-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path30.js
14 lines (10 loc) · 718 KB
/
30.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
((typeof self !== 'undefined' ? self : this)["webpackJsonp"] = (typeof self !== 'undefined' ? self : this)["webpackJsonp"] || []).push([[30],{
/***/ "./node_modules/highcharts/highstock.js":
/*!**********************************************!*\
!*** ./node_modules/highcharts/highstock.js ***!
\**********************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
eval("var __WEBPACK_AMD_DEFINE_RESULT__;/*\n Highcharts JS v7.1.2 (2019-06-03)\n\n (c) 2009-2018 Torstein Honsi\n\n License: www.highcharts.com/license\n*/\n(function(Q,I){ true&&module.exports?(I[\"default\"]=I,module.exports=Q.document?I(Q):I): true?!(__WEBPACK_AMD_DEFINE_RESULT__ = (function(){return I(Q)}).call(exports, __webpack_require__, exports, module),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)):(undefined)})(\"undefined\"!==typeof window?window:this,function(Q){function I(a,C,A,E){a.hasOwnProperty(C)||(a[C]=E.apply(null,A))}var H={};I(H,\"parts/Globals.js\",[],function(){var a=\"undefined\"===typeof Q?\"undefined\"!==typeof window?window:{}:Q,C=a.document,\nA=a.navigator&&a.navigator.userAgent||\"\",E=C&&C.createElementNS&&!!C.createElementNS(\"http://www.w3.org/2000/svg\",\"svg\").createSVGRect,m=/(edge|msie|trident)/i.test(A)&&!a.opera,g=-1!==A.indexOf(\"Firefox\"),v=-1!==A.indexOf(\"Chrome\"),x=g&&4>parseInt(A.split(\"Firefox/\")[1],10);return{product:\"Highcharts\",version:\"7.1.2\",deg2rad:2*Math.PI/360,doc:C,hasBidiBug:x,hasTouch:C&&\"undefined\"!==typeof C.documentElement.ontouchstart,isMS:m,isWebKit:-1!==A.indexOf(\"AppleWebKit\"),isFirefox:g,isChrome:v,isSafari:!v&&\n-1!==A.indexOf(\"Safari\"),isTouchDevice:/(Mobile|Android|Windows Phone)/.test(A),SVG_NS:\"http://www.w3.org/2000/svg\",chartCount:0,seriesTypes:{},symbolSizes:{},svg:E,win:a,marginNames:[\"plotTop\",\"marginRight\",\"marginBottom\",\"plotLeft\"],noop:function(){},charts:[],dateFormats:{}}});I(H,\"parts/Utilities.js\",[H[\"parts/Globals.js\"]],function(a){a.timers=[];var C=a.charts,A=a.doc,E=a.win;a.error=function(m,g,v){var x=a.isNumber(m)?\"Highcharts error #\"+m+\": www.highcharts.com/errors/\"+m:m,y=function(){if(g)throw Error(x);\nE.console&&console.log(x)};v?a.fireEvent(v,\"displayError\",{code:m,message:x},y):y()};a.Fx=function(a,g,v){this.options=g;this.elem=a;this.prop=v};a.Fx.prototype={dSetter:function(){var a=this.paths[0],g=this.paths[1],v=[],x=this.now,y=a.length,z;if(1===x)v=this.toD;else if(y===g.length&&1>x)for(;y--;)z=parseFloat(a[y]),v[y]=isNaN(z)?g[y]:x*parseFloat(g[y]-z)+z;else v=g;this.elem.attr(\"d\",v,null,!0)},update:function(){var a=this.elem,g=this.prop,v=this.now,x=this.options.step;if(this[g+\"Setter\"])this[g+\n\"Setter\"]();else a.attr?a.element&&a.attr(g,v,null,!0):a.style[g]=v+this.unit;x&&x.call(a,v,this)},run:function(m,g,v){var x=this,y=x.options,z=function(a){return z.stopped?!1:x.step(a)},n=E.requestAnimationFrame||function(a){setTimeout(a,13)},f=function(){for(var h=0;h<a.timers.length;h++)a.timers[h]()||a.timers.splice(h--,1);a.timers.length&&n(f)};m!==g||this.elem[\"forceAnimate:\"+this.prop]?(this.startTime=+new Date,this.start=m,this.end=g,this.unit=v,this.now=this.start,this.pos=0,z.elem=this.elem,\nz.prop=this.prop,z()&&1===a.timers.push(z)&&n(f)):(delete y.curAnim[this.prop],y.complete&&0===Object.keys(y.curAnim).length&&y.complete.call(this.elem))},step:function(m){var g=+new Date,v,x=this.options,y=this.elem,z=x.complete,n=x.duration,f=x.curAnim;y.attr&&!y.element?m=!1:m||g>=n+this.startTime?(this.now=this.end,this.pos=1,this.update(),v=f[this.prop]=!0,a.objectEach(f,function(a){!0!==a&&(v=!1)}),v&&z&&z.call(y),m=!1):(this.pos=x.easing((g-this.startTime)/n),this.now=this.start+(this.end-\nthis.start)*this.pos,this.update(),m=!0);return m},initPath:function(m,g,v){function x(a){var b,d;for(c=a.length;c--;)b=\"M\"===a[c]||\"L\"===a[c],d=/[a-zA-Z]/.test(a[c+3]),b&&d&&a.splice(c+1,0,a[c+1],a[c+2],a[c+1],a[c+2])}function y(a,l){for(;a.length<b;){a[0]=l[b-a.length];var d=a.slice(0,e);[].splice.apply(a,[0,0].concat(d));t&&(d=a.slice(a.length-e),[].splice.apply(a,[a.length,0].concat(d)),c--)}a[0]=\"M\"}function z(a,c){for(var d=(b-a.length)/e;0<d&&d--;)l=a.slice().splice(a.length/F-e,e*F),l[0]=\nc[b-e-d*e],r&&(l[e-6]=l[e-2],l[e-5]=l[e-1]),[].splice.apply(a,[a.length/F,0].concat(l)),t&&d--}g=g||\"\";var n,f=m.startX,h=m.endX,r=-1<g.indexOf(\"C\"),e=r?7:3,b,l,c;g=g.split(\" \");v=v.slice();var t=m.isArea,F=t?2:1,w;r&&(x(g),x(v));if(f&&h){for(c=0;c<f.length;c++)if(f[c]===h[0]){n=c;break}else if(f[0]===h[h.length-f.length+c]){n=c;w=!0;break}else if(f[f.length-1]===h[h.length-f.length+c]){n=f.length-c;break}\"undefined\"===typeof n&&(g=[])}g.length&&a.isNumber(n)&&(b=v.length+n*F*e,w?(y(g,v),z(v,g)):\n(y(v,g),z(g,v)));return[g,v]},fillSetter:function(){a.Fx.prototype.strokeSetter.apply(this,arguments)},strokeSetter:function(){this.elem.attr(this.prop,a.color(this.start).tweenTo(a.color(this.end),this.pos),null,!0)}};a.merge=function(){var m,g=arguments,v,x={},y=function(g,n){\"object\"!==typeof g&&(g={});a.objectEach(n,function(f,h){!a.isObject(f,!0)||a.isClass(f)||a.isDOMElement(f)?g[h]=n[h]:g[h]=y(g[h]||{},f)});return g};!0===g[0]&&(x=g[1],g=Array.prototype.slice.call(g,2));v=g.length;for(m=0;m<\nv;m++)x=y(x,g[m]);return x};a.pInt=function(a,g){return parseInt(a,g||10)};a.isString=function(a){return\"string\"===typeof a};a.isArray=function(a){a=Object.prototype.toString.call(a);return\"[object Array]\"===a||\"[object Array Iterator]\"===a};a.isObject=function(m,g){return!!m&&\"object\"===typeof m&&(!g||!a.isArray(m))};a.isDOMElement=function(m){return a.isObject(m)&&\"number\"===typeof m.nodeType};a.isClass=function(m){var g=m&&m.constructor;return!(!a.isObject(m,!0)||a.isDOMElement(m)||!g||!g.name||\n\"Object\"===g.name)};a.isNumber=function(a){return\"number\"===typeof a&&!isNaN(a)&&Infinity>a&&-Infinity<a};a.erase=function(a,g){for(var m=a.length;m--;)if(a[m]===g){a.splice(m,1);break}};a.defined=function(a){return\"undefined\"!==typeof a&&null!==a};a.attr=function(m,g,v){var x;a.isString(g)?a.defined(v)?m.setAttribute(g,v):m&&m.getAttribute&&((x=m.getAttribute(g))||\"class\"!==g||(x=m.getAttribute(g+\"Name\"))):a.defined(g)&&a.isObject(g)&&a.objectEach(g,function(a,g){m.setAttribute(g,a)});return x};\na.splat=function(m){return a.isArray(m)?m:[m]};a.syncTimeout=function(a,g,v){if(g)return setTimeout(a,g,v);a.call(0,v)};a.clearTimeout=function(m){a.defined(m)&&clearTimeout(m)};a.extend=function(a,g){var m;a||(a={});for(m in g)a[m]=g[m];return a};a.pick=function(){var a=arguments,g,v,x=a.length;for(g=0;g<x;g++)if(v=a[g],\"undefined\"!==typeof v&&null!==v)return v};a.css=function(m,g){a.isMS&&!a.svg&&g&&\"undefined\"!==typeof g.opacity&&(g.filter=\"alpha(opacity\\x3d\"+100*g.opacity+\")\");a.extend(m.style,\ng)};a.createElement=function(m,g,v,x,y){m=A.createElement(m);var z=a.css;g&&a.extend(m,g);y&&z(m,{padding:\"0\",border:\"none\",margin:\"0\"});v&&z(m,v);x&&x.appendChild(m);return m};a.extendClass=function(m,g){var v=function(){};v.prototype=new m;a.extend(v.prototype,g);return v};a.pad=function(a,g,v){return Array((g||2)+1-String(a).replace(\"-\",\"\").length).join(v||\"0\")+a};a.relativeLength=function(a,g,v){return/%$/.test(a)?g*parseFloat(a)/100+(v||0):parseFloat(a)};a.wrap=function(a,g,v){var m=a[g];a[g]=\nfunction(){var a=Array.prototype.slice.call(arguments),g=arguments,n=this;n.proceed=function(){m.apply(n,arguments.length?arguments:g)};a.unshift(m);a=v.apply(this,a);n.proceed=null;return a}};a.datePropsToTimestamps=function(m){a.objectEach(m,function(g,v){a.isObject(g)&&\"function\"===typeof g.getTime?m[v]=g.getTime():(a.isObject(g)||a.isArray(g))&&a.datePropsToTimestamps(g)})};a.formatSingle=function(m,g,v){var x=/\\.([0-9])/,y=a.defaultOptions.lang;/f$/.test(m)?(v=(v=m.match(x))?v[1]:-1,null!==g&&\n(g=a.numberFormat(g,v,y.decimalPoint,-1<m.indexOf(\",\")?y.thousandsSep:\"\"))):g=(v||a.time).dateFormat(m,g);return g};a.format=function(m,g,v){for(var x=\"{\",y=!1,z,n,f,h,r=[],e;m;){x=m.indexOf(x);if(-1===x)break;z=m.slice(0,x);if(y){z=z.split(\":\");n=z.shift().split(\".\");h=n.length;e=g;for(f=0;f<h;f++)e&&(e=e[n[f]]);z.length&&(e=a.formatSingle(z.join(\":\"),e,v));r.push(e)}else r.push(z);m=m.slice(x+1);x=(y=!y)?\"}\":\"{\"}r.push(m);return r.join(\"\")};a.getMagnitude=function(a){return Math.pow(10,Math.floor(Math.log(a)/\nMath.LN10))};a.normalizeTickInterval=function(m,g,v,x,y){var z,n=m;v=a.pick(v,1);z=m/v;g||(g=y?[1,1.2,1.5,2,2.5,3,4,5,6,8,10]:[1,2,2.5,5,10],!1===x&&(1===v?g=g.filter(function(a){return 0===a%1}):.1>=v&&(g=[1/v])));for(x=0;x<g.length&&!(n=g[x],y&&n*v>=m||!y&&z<=(g[x]+(g[x+1]||g[x]))/2);x++);return n=a.correctFloat(n*v,-Math.round(Math.log(.001)/Math.LN10))};a.stableSort=function(a,g){var m=a.length,x,y;for(y=0;y<m;y++)a[y].safeI=y;a.sort(function(a,n){x=g(a,n);return 0===x?a.safeI-n.safeI:x});for(y=\n0;y<m;y++)delete a[y].safeI};a.arrayMin=function(a){for(var g=a.length,m=a[0];g--;)a[g]<m&&(m=a[g]);return m};a.arrayMax=function(a){for(var g=a.length,m=a[0];g--;)a[g]>m&&(m=a[g]);return m};a.destroyObjectProperties=function(m,g){a.objectEach(m,function(a,x){a&&a!==g&&a.destroy&&a.destroy();delete m[x]})};a.discardElement=function(m){var g=a.garbageBin;g||(g=a.createElement(\"div\"));m&&g.appendChild(m);g.innerHTML=\"\"};a.correctFloat=function(a,g){return parseFloat(a.toPrecision(g||14))};a.setAnimation=\nfunction(m,g){g.renderer.globalAnimation=a.pick(m,g.options.chart.animation,!0)};a.animObject=function(m){return a.isObject(m)?a.merge(m):{duration:m?500:0}};a.timeUnits={millisecond:1,second:1E3,minute:6E4,hour:36E5,day:864E5,week:6048E5,month:24192E5,year:314496E5};a.numberFormat=function(m,g,v,x){m=+m||0;g=+g;var y=a.defaultOptions.lang,z=(m.toString().split(\".\")[1]||\"\").split(\"e\")[0].length,n,f,h=m.toString().split(\"e\");-1===g?g=Math.min(z,20):a.isNumber(g)?g&&h[1]&&0>h[1]&&(n=g+ +h[1],0<=n?(h[0]=\n(+h[0]).toExponential(n).split(\"e\")[0],g=n):(h[0]=h[0].split(\".\")[0]||0,m=20>g?(h[0]*Math.pow(10,h[1])).toFixed(g):0,h[1]=0)):g=2;f=(Math.abs(h[1]?h[0]:m)+Math.pow(10,-Math.max(g,z)-1)).toFixed(g);z=String(a.pInt(f));n=3<z.length?z.length%3:0;v=a.pick(v,y.decimalPoint);x=a.pick(x,y.thousandsSep);m=(0>m?\"-\":\"\")+(n?z.substr(0,n)+x:\"\");m+=z.substr(n).replace(/(\\d{3})(?=\\d)/g,\"$1\"+x);g&&(m+=v+f.slice(-g));h[1]&&0!==+m&&(m+=\"e\"+h[1]);return m};Math.easeInOutSine=function(a){return-.5*(Math.cos(Math.PI*\na)-1)};a.getStyle=function(m,g,v){if(\"width\"===g)return Math.max(0,Math.min(m.offsetWidth,m.scrollWidth,m.getBoundingClientRect&&\"none\"===a.getStyle(m,\"transform\",!1)?Math.floor(m.getBoundingClientRect().width):Infinity)-a.getStyle(m,\"padding-left\")-a.getStyle(m,\"padding-right\"));if(\"height\"===g)return Math.max(0,Math.min(m.offsetHeight,m.scrollHeight)-a.getStyle(m,\"padding-top\")-a.getStyle(m,\"padding-bottom\"));E.getComputedStyle||a.error(27,!0);if(m=E.getComputedStyle(m,void 0))m=m.getPropertyValue(g),\na.pick(v,\"opacity\"!==g)&&(m=a.pInt(m));return m};a.inArray=function(a,g,v){return g.indexOf(a,v)};a.find=Array.prototype.find?function(a,g){return a.find(g)}:function(a,g){var m,x=a.length;for(m=0;m<x;m++)if(g(a[m],m))return a[m]};a.keys=Object.keys;a.offset=function(a){var g=A.documentElement;a=a.parentElement||a.parentNode?a.getBoundingClientRect():{top:0,left:0};return{top:a.top+(E.pageYOffset||g.scrollTop)-(g.clientTop||0),left:a.left+(E.pageXOffset||g.scrollLeft)-(g.clientLeft||0)}};a.stop=function(m,\ng){for(var v=a.timers.length;v--;)a.timers[v].elem!==m||g&&g!==a.timers[v].prop||(a.timers[v].stopped=!0)};a.objectEach=function(a,g,v){for(var m in a)a.hasOwnProperty(m)&&g.call(v||a[m],a[m],m,a)};a.objectEach({map:\"map\",each:\"forEach\",grep:\"filter\",reduce:\"reduce\",some:\"some\"},function(m,g){a[g]=function(a){return Array.prototype[m].apply(a,[].slice.call(arguments,1))}});a.addEvent=function(m,g,v,x){void 0===x&&(x={});var y,z=m.addEventListener||a.addEventListenerPolyfill;y=\"function\"===typeof m&&\nm.prototype?m.prototype.protoEvents=m.prototype.protoEvents||{}:m.hcEvents=m.hcEvents||{};a.Point&&m instanceof a.Point&&m.series&&m.series.chart&&(m.series.chart.runTrackerClick=!0);z&&z.call(m,g,v,!1);y[g]||(y[g]=[]);y[g].push({fn:v,order:\"number\"===typeof x.order?x.order:Infinity});y[g].sort(function(a,f){return a.order-f.order});return function(){a.removeEvent(m,g,v)}};a.removeEvent=function(m,g,v){function x(n,f){var h=m.removeEventListener||a.removeEventListenerPolyfill;h&&h.call(m,n,f,!1)}\nfunction y(n){var f,h;m.nodeName&&(g?(f={},f[g]=!0):f=n,a.objectEach(f,function(a,e){if(n[e])for(h=n[e].length;h--;)x(e,n[e][h].fn)}))}var z;[\"protoEvents\",\"hcEvents\"].forEach(function(a){var f=m[a];f&&(g?(z=f[g]||[],v?(f[g]=z.filter(function(a){return v!==a.fn}),x(g,v)):(y(f),f[g]=[])):(y(f),m[a]={}))})};a.fireEvent=function(m,g,v,x){var y,z;v=v||{};A.createEvent&&(m.dispatchEvent||m.fireEvent)?(y=A.createEvent(\"Events\"),y.initEvent(g,!0,!0),a.extend(y,v),m.dispatchEvent?m.dispatchEvent(y):m.fireEvent(g,\ny)):(v.target||a.extend(v,{preventDefault:function(){v.defaultPrevented=!0},target:m,type:g}),function(a,f){void 0===a&&(a=[]);void 0===f&&(f=[]);var h=0,r=0,e=a.length+f.length;for(z=0;z<e;z++)!1===(a[h]?f[r]?a[h].order<=f[r].order?a[h++]:f[r++]:a[h++]:f[r++]).fn.call(m,v)&&v.preventDefault()}(m.protoEvents&&m.protoEvents[g],m.hcEvents&&m.hcEvents[g]));x&&!v.defaultPrevented&&x.call(m,v)};a.animate=function(m,g,v){var x,y=\"\",z,n,f;a.isObject(v)||(f=arguments,v={duration:f[2],easing:f[3],complete:f[4]});\na.isNumber(v.duration)||(v.duration=400);v.easing=\"function\"===typeof v.easing?v.easing:Math[v.easing]||Math.easeInOutSine;v.curAnim=a.merge(g);a.objectEach(g,function(h,f){a.stop(m,f);n=new a.Fx(m,v,f);z=null;\"d\"===f?(n.paths=n.initPath(m,m.d,g.d),n.toD=g.d,x=0,z=1):m.attr?x=m.attr(f):(x=parseFloat(a.getStyle(m,f))||0,\"opacity\"!==f&&(y=\"px\"));z||(z=h);z&&z.match&&z.match(\"px\")&&(z=z.replace(/px/g,\"\"));n.run(x,z,y)})};a.seriesType=function(m,g,v,x,y){var z=a.getOptions(),n=a.seriesTypes;z.plotOptions[m]=\na.merge(z.plotOptions[g],v);n[m]=a.extendClass(n[g]||function(){},x);n[m].prototype.type=m;y&&(n[m].prototype.pointClass=a.extendClass(a.Point,y));return n[m]};a.uniqueKey=function(){var a=Math.random().toString(36).substring(2,9),g=0;return function(){return\"highcharts-\"+a+\"-\"+g++}}();a.isFunction=function(a){return\"function\"===typeof a};E.jQuery&&(E.jQuery.fn.highcharts=function(){var m=[].slice.call(arguments);if(this[0])return m[0]?(new (a[a.isString(m[0])?m.shift():\"Chart\"])(this[0],m[0],m[1]),\nthis):C[a.attr(this[0],\"data-highcharts-chart\")]})});I(H,\"parts/Color.js\",[H[\"parts/Globals.js\"]],function(a){var C=a.isNumber,A=a.merge,E=a.pInt;a.Color=function(m){if(!(this instanceof a.Color))return new a.Color(m);this.init(m)};a.Color.prototype={parsers:[{regex:/rgba\\(\\s*([0-9]{1,3})\\s*,\\s*([0-9]{1,3})\\s*,\\s*([0-9]{1,3})\\s*,\\s*([0-9]?(?:\\.[0-9]+)?)\\s*\\)/,parse:function(a){return[E(a[1]),E(a[2]),E(a[3]),parseFloat(a[4],10)]}},{regex:/rgb\\(\\s*([0-9]{1,3})\\s*,\\s*([0-9]{1,3})\\s*,\\s*([0-9]{1,3})\\s*\\)/,\nparse:function(a){return[E(a[1]),E(a[2]),E(a[3]),1]}}],names:{white:\"#ffffff\",black:\"#000000\"},init:function(m){var g,v,x,y;if((this.input=m=this.names[m&&m.toLowerCase?m.toLowerCase():\"\"]||m)&&m.stops)this.stops=m.stops.map(function(g){return new a.Color(g[1])});else if(m&&m.charAt&&\"#\"===m.charAt()&&(g=m.length,m=parseInt(m.substr(1),16),7===g?v=[(m&16711680)>>16,(m&65280)>>8,m&255,1]:4===g&&(v=[(m&3840)>>4|(m&3840)>>8,(m&240)>>4|m&240,(m&15)<<4|m&15,1])),!v)for(x=this.parsers.length;x--&&!v;)y=\nthis.parsers[x],(g=y.regex.exec(m))&&(v=y.parse(g));this.rgba=v||[]},get:function(a){var g=this.input,m=this.rgba,x;this.stops?(x=A(g),x.stops=[].concat(x.stops),this.stops.forEach(function(g,m){x.stops[m]=[x.stops[m][0],g.get(a)]})):x=m&&C(m[0])?\"rgb\"===a||!a&&1===m[3]?\"rgb(\"+m[0]+\",\"+m[1]+\",\"+m[2]+\")\":\"a\"===a?m[3]:\"rgba(\"+m.join(\",\")+\")\":g;return x},brighten:function(a){var g,m=this.rgba;if(this.stops)this.stops.forEach(function(g){g.brighten(a)});else if(C(a)&&0!==a)for(g=0;3>g;g++)m[g]+=E(255*\na),0>m[g]&&(m[g]=0),255<m[g]&&(m[g]=255);return this},setOpacity:function(a){this.rgba[3]=a;return this},tweenTo:function(a,g){var m=this.rgba,x=a.rgba;x.length&&m&&m.length?(a=1!==x[3]||1!==m[3],g=(a?\"rgba(\":\"rgb(\")+Math.round(x[0]+(m[0]-x[0])*(1-g))+\",\"+Math.round(x[1]+(m[1]-x[1])*(1-g))+\",\"+Math.round(x[2]+(m[2]-x[2])*(1-g))+(a?\",\"+(x[3]+(m[3]-x[3])*(1-g)):\"\")+\")\"):g=a.input||\"none\";return g}};a.color=function(m){return new a.Color(m)}});I(H,\"parts/SvgRenderer.js\",[H[\"parts/Globals.js\"]],function(a){var C,\nA,E=a.addEvent,m=a.animate,g=a.attr,v=a.charts,x=a.color,y=a.css,z=a.createElement,n=a.defined,f=a.deg2rad,h=a.destroyObjectProperties,r=a.doc,e=a.extend,b=a.erase,l=a.hasTouch,c=a.isArray,t=a.isFirefox,F=a.isMS,w=a.isObject,B=a.isString,p=a.isWebKit,d=a.merge,k=a.noop,u=a.objectEach,D=a.pick,G=a.pInt,q=a.removeEvent,K=a.splat,N=a.stop,O=a.svg,L=a.SVG_NS,R=a.symbolSizes,M=a.win;C=a.SVGElement=function(){return this};e(C.prototype,{opacity:1,SVG_NS:L,textProps:\"direction fontSize fontWeight fontFamily fontStyle color lineHeight width textAlign textDecoration textOverflow textOutline cursor\".split(\" \"),\ninit:function(d,q){this.element=\"span\"===q?z(q):r.createElementNS(this.SVG_NS,q);this.renderer=d;a.fireEvent(this,\"afterInit\")},animate:function(d,q,b){var J=a.animObject(D(q,this.renderer.globalAnimation,!0));D(r.hidden,r.msHidden,r.webkitHidden,!1)&&(J.duration=0);0!==J.duration?(b&&(J.complete=b),m(this,d,J)):(this.attr(d,void 0,b),a.objectEach(d,function(a,d){J.step&&J.step.call(this,a,{prop:d,pos:1})},this));return this},complexColor:function(q,b,k){var J=this.renderer,e,l,t,p,K,h,f,D,r,w,G,\nL=[],O;a.fireEvent(this.renderer,\"complexColor\",{args:arguments},function(){q.radialGradient?l=\"radialGradient\":q.linearGradient&&(l=\"linearGradient\");l&&(t=q[l],K=J.gradients,f=q.stops,w=k.radialReference,c(t)&&(q[l]=t={x1:t[0],y1:t[1],x2:t[2],y2:t[3],gradientUnits:\"userSpaceOnUse\"}),\"radialGradient\"===l&&w&&!n(t.gradientUnits)&&(p=t,t=d(t,J.getRadialAttr(w,p),{gradientUnits:\"userSpaceOnUse\"})),u(t,function(a,d){\"id\"!==d&&L.push(d,a)}),u(f,function(a){L.push(a)}),L=L.join(\",\"),K[L]?G=K[L].attr(\"id\"):\n(t.id=G=a.uniqueKey(),K[L]=h=J.createElement(l).attr(t).add(J.defs),h.radAttr=p,h.stops=[],f.forEach(function(d){0===d[1].indexOf(\"rgba\")?(e=a.color(d[1]),D=e.get(\"rgb\"),r=e.get(\"a\")):(D=d[1],r=1);d=J.createElement(\"stop\").attr({offset:d[0],\"stop-color\":D,\"stop-opacity\":r}).add(h);h.stops.push(d)})),O=\"url(\"+J.url+\"#\"+G+\")\",k.setAttribute(b,O),k.gradient=L,q.toString=function(){return O})})},applyTextOutline:function(d){var q=this.element,b,J,k;-1!==d.indexOf(\"contrast\")&&(d=d.replace(/contrast/g,\nthis.renderer.getContrast(q.style.fill)));d=d.split(\" \");b=d[d.length-1];(J=d[0])&&\"none\"!==J&&a.svg&&(this.fakeTS=!0,d=[].slice.call(q.getElementsByTagName(\"tspan\")),this.ySetter=this.xSetter,J=J.replace(/(^[\\d\\.]+)(.*?)$/g,function(a,d,q){return 2*d+q}),this.removeTextOutline(d),k=q.firstChild,d.forEach(function(a,d){0===d&&(a.setAttribute(\"x\",q.getAttribute(\"x\")),d=q.getAttribute(\"y\"),a.setAttribute(\"y\",d||0),null===d&&q.setAttribute(\"y\",0));a=a.cloneNode(1);g(a,{\"class\":\"highcharts-text-outline\",\nfill:b,stroke:b,\"stroke-width\":J,\"stroke-linejoin\":\"round\"});q.insertBefore(a,k)}))},removeTextOutline:function(a){for(var d=a.length,q;d--;)q=a[d],\"highcharts-text-outline\"===q.getAttribute(\"class\")&&b(a,this.element.removeChild(q))},symbolCustomAttribs:\"x y width height r start end innerR anchorX anchorY rounded\".split(\" \"),attr:function(d,q,b,k){var J,e=this.element,c,l=this,t,p,K=this.symbolCustomAttribs;\"string\"===typeof d&&void 0!==q&&(J=d,d={},d[J]=q);\"string\"===typeof d?l=(this[d+\"Getter\"]||\nthis._defaultGetter).call(this,d,e):(u(d,function(q,b){t=!1;k||N(this,b);this.symbolName&&-1!==a.inArray(b,K)&&(c||(this.symbolAttr(d),c=!0),t=!0);!this.rotation||\"x\"!==b&&\"y\"!==b||(this.doTransform=!0);t||(p=this[b+\"Setter\"]||this._defaultSetter,p.call(this,q,b,e),!this.styledMode&&this.shadows&&/^(width|height|visibility|x|y|d|transform|cx|cy|r)$/.test(b)&&this.updateShadows(b,q,p))},this),this.afterSetters());b&&b.call(this);return l},afterSetters:function(){this.doTransform&&(this.updateTransform(),\nthis.doTransform=!1)},updateShadows:function(a,d,q){for(var b=this.shadows,J=b.length;J--;)q.call(b[J],\"height\"===a?Math.max(d-(b[J].cutHeight||0),0):\"d\"===a?this.d:d,a,b[J])},addClass:function(a,d){var q=this.attr(\"class\")||\"\";d||(a=(a||\"\").split(/ /g).reduce(function(a,d){-1===q.indexOf(d)&&a.push(d);return a},q?[q]:[]).join(\" \"));a!==q&&this.attr(\"class\",a);return this},hasClass:function(a){return-1!==(this.attr(\"class\")||\"\").split(\" \").indexOf(a)},removeClass:function(a){return this.attr(\"class\",\n(this.attr(\"class\")||\"\").replace(a,\"\"))},symbolAttr:function(a){var d=this;\"x y r start end width height innerR anchorX anchorY clockwise\".split(\" \").forEach(function(q){d[q]=D(a[q],d[q])});d.attr({d:d.renderer.symbols[d.symbolName](d.x,d.y,d.width,d.height,d)})},clip:function(a){return this.attr(\"clip-path\",a?\"url(\"+this.renderer.url+\"#\"+a.id+\")\":\"none\")},crisp:function(a,d){var q;d=d||a.strokeWidth||0;q=Math.round(d)%2/2;a.x=Math.floor(a.x||this.x||0)+q;a.y=Math.floor(a.y||this.y||0)+q;a.width=\nMath.floor((a.width||this.width||0)-2*q);a.height=Math.floor((a.height||this.height||0)-2*q);n(a.strokeWidth)&&(a.strokeWidth=d);return a},css:function(a){var d=this.styles,q={},b=this.element,k,J=\"\",c,l=!d,t=[\"textOutline\",\"textOverflow\",\"width\"];a&&a.color&&(a.fill=a.color);d&&u(a,function(a,b){a!==d[b]&&(q[b]=a,l=!0)});l&&(d&&(a=e(d,q)),a&&(null===a.width||\"auto\"===a.width?delete this.textWidth:\"text\"===b.nodeName.toLowerCase()&&a.width&&(k=this.textWidth=G(a.width))),this.styles=a,k&&!O&&this.renderer.forExport&&\ndelete a.width,b.namespaceURI===this.SVG_NS?(c=function(a,d){return\"-\"+d.toLowerCase()},u(a,function(a,d){-1===t.indexOf(d)&&(J+=d.replace(/([A-Z])/g,c)+\":\"+a+\";\")}),J&&g(b,\"style\",J)):y(b,a),this.added&&(\"text\"===this.element.nodeName&&this.renderer.buildText(this),a&&a.textOutline&&this.applyTextOutline(a.textOutline)));return this},getStyle:function(a){return M.getComputedStyle(this.element||this,\"\").getPropertyValue(a)},strokeWidth:function(){if(!this.renderer.styledMode)return this[\"stroke-width\"]||\n0;var a=this.getStyle(\"stroke-width\"),d;a.indexOf(\"px\")===a.length-2?a=G(a):(d=r.createElementNS(L,\"rect\"),g(d,{width:a,\"stroke-width\":0}),this.element.parentNode.appendChild(d),a=d.getBBox().width,d.parentNode.removeChild(d));return a},on:function(a,d){var q=this,b=q.element;l&&\"click\"===a?(b.ontouchstart=function(a){q.touchEventFired=Date.now();a.preventDefault();d.call(b,a)},b.onclick=function(a){(-1===M.navigator.userAgent.indexOf(\"Android\")||1100<Date.now()-(q.touchEventFired||0))&&d.call(b,\na)}):b[\"on\"+a]=d;return this},setRadialReference:function(a){var d=this.renderer.gradients[this.element.gradient];this.element.radialReference=a;d&&d.radAttr&&d.animate(this.renderer.getRadialAttr(a,d.radAttr));return this},translate:function(a,d){return this.attr({translateX:a,translateY:d})},invert:function(a){this.inverted=a;this.updateTransform();return this},updateTransform:function(){var a=this.translateX||0,d=this.translateY||0,q=this.scaleX,b=this.scaleY,k=this.inverted,e=this.rotation,c=\nthis.matrix,l=this.element;k&&(a+=this.width,d+=this.height);a=[\"translate(\"+a+\",\"+d+\")\"];n(c)&&a.push(\"matrix(\"+c.join(\",\")+\")\");k?a.push(\"rotate(90) scale(-1,1)\"):e&&a.push(\"rotate(\"+e+\" \"+D(this.rotationOriginX,l.getAttribute(\"x\"),0)+\" \"+D(this.rotationOriginY,l.getAttribute(\"y\")||0)+\")\");(n(q)||n(b))&&a.push(\"scale(\"+D(q,1)+\" \"+D(b,1)+\")\");a.length&&l.setAttribute(\"transform\",a.join(\" \"))},toFront:function(){var a=this.element;a.parentNode.appendChild(a);return this},align:function(a,d,q){var k,\ne,l,c,t={};e=this.renderer;l=e.alignedObjects;var u,J;if(a){if(this.alignOptions=a,this.alignByTranslate=d,!q||B(q))this.alignTo=k=q||\"renderer\",b(l,this),l.push(this),q=null}else a=this.alignOptions,d=this.alignByTranslate,k=this.alignTo;q=D(q,e[k],e);k=a.align;e=a.verticalAlign;l=(q.x||0)+(a.x||0);c=(q.y||0)+(a.y||0);\"right\"===k?u=1:\"center\"===k&&(u=2);u&&(l+=(q.width-(a.width||0))/u);t[d?\"translateX\":\"x\"]=Math.round(l);\"bottom\"===e?J=1:\"middle\"===e&&(J=2);J&&(c+=(q.height-(a.height||0))/J);t[d?\n\"translateY\":\"y\"]=Math.round(c);this[this.placed?\"animate\":\"attr\"](t);this.placed=!0;this.alignAttr=t;return this},getBBox:function(a,d){var q,b=this.renderer,k,l=this.element,c=this.styles,t,u=this.textStr,J,p=b.cache,K=b.cacheKeys,h=l.namespaceURI===this.SVG_NS,r;d=D(d,this.rotation);k=d*f;t=b.styledMode?l&&C.prototype.getStyle.call(l,\"font-size\"):c&&c.fontSize;n(u)&&(r=u.toString(),-1===r.indexOf(\"\\x3c\")&&(r=r.replace(/[0-9]/g,\"0\")),r+=[\"\",d||0,t,this.textWidth,c&&c.textOverflow].join());r&&!a&&\n(q=p[r]);if(!q){if(h||b.forExport){try{(J=this.fakeTS&&function(a){[].forEach.call(l.querySelectorAll(\".highcharts-text-outline\"),function(d){d.style.display=a})})&&J(\"none\"),q=l.getBBox?e({},l.getBBox()):{width:l.offsetWidth,height:l.offsetHeight},J&&J(\"\")}catch(Z){\"\"}if(!q||0>q.width)q={width:0,height:0}}else q=this.htmlGetBBox();b.isSVG&&(a=q.width,b=q.height,h&&(q.height=b={\"11px,17\":14,\"13px,20\":16}[c&&c.fontSize+\",\"+Math.round(b)]||b),d&&(q.width=Math.abs(b*Math.sin(k))+Math.abs(a*Math.cos(k)),\nq.height=Math.abs(b*Math.cos(k))+Math.abs(a*Math.sin(k))));if(r&&0<q.height){for(;250<K.length;)delete p[K.shift()];p[r]||K.push(r);p[r]=q}}return q},show:function(a){return this.attr({visibility:a?\"inherit\":\"visible\"})},hide:function(){return this.attr({visibility:\"hidden\"})},fadeOut:function(a){var d=this;d.animate({opacity:0},{duration:a||150,complete:function(){d.attr({y:-9999})}})},add:function(a){var d=this.renderer,q=this.element,b;a&&(this.parentGroup=a);this.parentInverted=a&&a.inverted;\nvoid 0!==this.textStr&&d.buildText(this);this.added=!0;if(!a||a.handleZ||this.zIndex)b=this.zIndexSetter();b||(a?a.element:d.box).appendChild(q);if(this.onAdd)this.onAdd();return this},safeRemoveChild:function(a){var d=a.parentNode;d&&d.removeChild(a)},destroy:function(){var a=this,d=a.element||{},q=a.renderer,k=q.isSVG&&\"SPAN\"===d.nodeName&&a.parentGroup,e=d.ownerSVGElement,l=a.clipPath;d.onclick=d.onmouseout=d.onmouseover=d.onmousemove=d.point=null;N(a);l&&e&&([].forEach.call(e.querySelectorAll(\"[clip-path],[CLIP-PATH]\"),\nfunction(a){-1<a.getAttribute(\"clip-path\").indexOf(l.element.id)&&a.removeAttribute(\"clip-path\")}),a.clipPath=l.destroy());if(a.stops){for(e=0;e<a.stops.length;e++)a.stops[e]=a.stops[e].destroy();a.stops=null}a.safeRemoveChild(d);for(q.styledMode||a.destroyShadows();k&&k.div&&0===k.div.childNodes.length;)d=k.parentGroup,a.safeRemoveChild(k.div),delete k.div,k=d;a.alignTo&&b(q.alignedObjects,a);u(a,function(d,q){delete a[q]})},shadow:function(a,d,q){var b=[],k,e,l=this.element,c,t,u,p;if(!a)this.destroyShadows();\nelse if(!this.shadows){t=D(a.width,3);u=(a.opacity||.15)/t;p=this.parentInverted?\"(-1,-1)\":\"(\"+D(a.offsetX,1)+\", \"+D(a.offsetY,1)+\")\";for(k=1;k<=t;k++)e=l.cloneNode(0),c=2*t+1-2*k,g(e,{stroke:a.color||\"#000000\",\"stroke-opacity\":u*k,\"stroke-width\":c,transform:\"translate\"+p,fill:\"none\"}),e.setAttribute(\"class\",(e.getAttribute(\"class\")||\"\")+\" highcharts-shadow\"),q&&(g(e,\"height\",Math.max(g(e,\"height\")-c,0)),e.cutHeight=c),d?d.element.appendChild(e):l.parentNode&&l.parentNode.insertBefore(e,l),b.push(e);\nthis.shadows=b}return this},destroyShadows:function(){(this.shadows||[]).forEach(function(a){this.safeRemoveChild(a)},this);this.shadows=void 0},xGetter:function(a){\"circle\"===this.element.nodeName&&(\"x\"===a?a=\"cx\":\"y\"===a&&(a=\"cy\"));return this._defaultGetter(a)},_defaultGetter:function(a){a=D(this[a+\"Value\"],this[a],this.element?this.element.getAttribute(a):null,0);/^[\\-0-9\\.]+$/.test(a)&&(a=parseFloat(a));return a},dSetter:function(a,d,q){a&&a.join&&(a=a.join(\" \"));/(NaN| {2}|^$)/.test(a)&&(a=\n\"M 0 0\");this[d]!==a&&(q.setAttribute(d,a),this[d]=a)},dashstyleSetter:function(a){var d,q=this[\"stroke-width\"];\"inherit\"===q&&(q=1);if(a=a&&a.toLowerCase()){a=a.replace(\"shortdashdotdot\",\"3,1,1,1,1,1,\").replace(\"shortdashdot\",\"3,1,1,1\").replace(\"shortdot\",\"1,1,\").replace(\"shortdash\",\"3,1,\").replace(\"longdash\",\"8,3,\").replace(/dot/g,\"1,3,\").replace(\"dash\",\"4,3,\").replace(/,$/,\"\").split(\",\");for(d=a.length;d--;)a[d]=G(a[d])*q;a=a.join(\",\").replace(/NaN/g,\"none\");this.element.setAttribute(\"stroke-dasharray\",\na)}},alignSetter:function(a){var d={left:\"start\",center:\"middle\",right:\"end\"};d[a]&&(this.alignValue=a,this.element.setAttribute(\"text-anchor\",d[a]))},opacitySetter:function(a,d,q){this[d]=a;q.setAttribute(d,a)},titleSetter:function(a){var d=this.element.getElementsByTagName(\"title\")[0];d||(d=r.createElementNS(this.SVG_NS,\"title\"),this.element.appendChild(d));d.firstChild&&d.removeChild(d.firstChild);d.appendChild(r.createTextNode(String(D(a,\"\")).replace(/<[^>]*>/g,\"\").replace(/</g,\"\\x3c\").replace(/>/g,\n\"\\x3e\")))},textSetter:function(a){a!==this.textStr&&(delete this.bBox,delete this.textPxLength,this.textStr=a,this.added&&this.renderer.buildText(this))},setTextPath:function(q,b){var e=this.element,l={textAnchor:\"text-anchor\"},c,t=!1,u,p=this.textPathWrapper,K=!p;b=d(!0,{enabled:!0,attributes:{dy:-5,startOffset:\"50%\",textAnchor:\"middle\"}},b);c=b.attributes;if(q&&b&&b.enabled){this.options&&this.options.padding&&(c.dx=-this.options.padding);p||(this.textPathWrapper=p=this.renderer.createElement(\"textPath\"),\nt=!0);u=p.element;(b=q.element.getAttribute(\"id\"))||q.element.setAttribute(\"id\",b=a.uniqueKey());if(K)for(q=e.getElementsByTagName(\"tspan\");q.length;)q[0].setAttribute(\"y\",0),u.appendChild(q[0]);t&&p.add({element:this.text?this.text.element:e});u.setAttributeNS(\"http://www.w3.org/1999/xlink\",\"href\",this.renderer.url+\"#\"+b);n(c.dy)&&(u.parentNode.setAttribute(\"dy\",c.dy),delete c.dy);n(c.dx)&&(u.parentNode.setAttribute(\"dx\",c.dx),delete c.dx);a.objectEach(c,function(a,d){u.setAttribute(l[d]||d,a)});\ne.removeAttribute(\"transform\");this.removeTextOutline.call(p,[].slice.call(e.getElementsByTagName(\"tspan\")));this.text&&!this.renderer.styledMode&&this.attr({fill:\"none\",\"stroke-width\":0});this.applyTextOutline=this.updateTransform=k}else p&&(delete this.updateTransform,delete this.applyTextOutline,this.destroyTextPath(e,q));return this},destroyTextPath:function(a,d){var q;d.element.setAttribute(\"id\",\"\");for(q=this.textPathWrapper.element.childNodes;q.length;)a.firstChild.appendChild(q[0]);a.firstChild.removeChild(this.textPathWrapper.element);\ndelete d.textPathWrapper},fillSetter:function(a,d,q){\"string\"===typeof a?q.setAttribute(d,a):a&&this.complexColor(a,d,q)},visibilitySetter:function(a,d,q){\"inherit\"===a?q.removeAttribute(d):this[d]!==a&&q.setAttribute(d,a);this[d]=a},zIndexSetter:function(a,d){var q=this.renderer,b=this.parentGroup,k=(b||q).element||q.box,e,l=this.element,c=!1,t,q=k===q.box;e=this.added;var u;n(a)?(l.setAttribute(\"data-z-index\",a),a=+a,this[d]===a&&(e=!1)):n(this[d])&&l.removeAttribute(\"data-z-index\");this[d]=a;if(e){(a=\nthis.zIndex)&&b&&(b.handleZ=!0);d=k.childNodes;for(u=d.length-1;0<=u&&!c;u--)if(b=d[u],e=b.getAttribute(\"data-z-index\"),t=!n(e),b!==l)if(0>a&&t&&!q&&!u)k.insertBefore(l,d[u]),c=!0;else if(G(e)<=a||t&&(!n(a)||0<=a))k.insertBefore(l,d[u+1]||null),c=!0;c||(k.insertBefore(l,d[q?3:0]||null),c=!0)}return c},_defaultSetter:function(a,d,q){q.setAttribute(d,a)}});C.prototype.yGetter=C.prototype.xGetter;C.prototype.translateXSetter=C.prototype.translateYSetter=C.prototype.rotationSetter=C.prototype.verticalAlignSetter=\nC.prototype.rotationOriginXSetter=C.prototype.rotationOriginYSetter=C.prototype.scaleXSetter=C.prototype.scaleYSetter=C.prototype.matrixSetter=function(a,d){this[d]=a;this.doTransform=!0};C.prototype[\"stroke-widthSetter\"]=C.prototype.strokeSetter=function(a,d,q){this[d]=a;this.stroke&&this[\"stroke-width\"]?(C.prototype.fillSetter.call(this,this.stroke,\"stroke\",q),q.setAttribute(\"stroke-width\",this[\"stroke-width\"]),this.hasStroke=!0):\"stroke-width\"===d&&0===a&&this.hasStroke&&(q.removeAttribute(\"stroke\"),\nthis.hasStroke=!1)};A=a.SVGRenderer=function(){this.init.apply(this,arguments)};e(A.prototype,{Element:C,SVG_NS:L,init:function(a,d,q,b,k,e,l){var c;c=this.createElement(\"svg\").attr({version:\"1.1\",\"class\":\"highcharts-root\"});l||c.css(this.getStyle(b));b=c.element;a.appendChild(b);g(a,\"dir\",\"ltr\");-1===a.innerHTML.indexOf(\"xmlns\")&&g(b,\"xmlns\",this.SVG_NS);this.isSVG=!0;this.box=b;this.boxWrapper=c;this.alignedObjects=[];this.url=(t||p)&&r.getElementsByTagName(\"base\").length?M.location.href.split(\"#\")[0].replace(/<[^>]*>/g,\n\"\").replace(/([\\('\\)])/g,\"\\\\$1\").replace(/ /g,\"%20\"):\"\";this.createElement(\"desc\").add().element.appendChild(r.createTextNode(\"Created with Highcharts 7.1.2\"));this.defs=this.createElement(\"defs\").add();this.allowHTML=e;this.forExport=k;this.styledMode=l;this.gradients={};this.cache={};this.cacheKeys=[];this.imgCount=0;this.setSize(d,q,!1);var u;t&&a.getBoundingClientRect&&(d=function(){y(a,{left:0,top:0});u=a.getBoundingClientRect();y(a,{left:Math.ceil(u.left)-u.left+\"px\",top:Math.ceil(u.top)-u.top+\n\"px\"})},d(),this.unSubPixelFix=E(M,\"resize\",d))},definition:function(a){function d(a,b){var k;K(a).forEach(function(a){var e=q.createElement(a.tagName),c={};u(a,function(a,d){\"tagName\"!==d&&\"children\"!==d&&\"textContent\"!==d&&(c[d]=a)});e.attr(c);e.add(b||q.defs);a.textContent&&e.element.appendChild(r.createTextNode(a.textContent));d(a.children||[],e);k=e});return k}var q=this;return d(a)},getStyle:function(a){return this.style=e({fontFamily:'\"Lucida Grande\", \"Lucida Sans Unicode\", Arial, Helvetica, sans-serif',\nfontSize:\"12px\"},a)},setStyle:function(a){this.boxWrapper.css(this.getStyle(a))},isHidden:function(){return!this.boxWrapper.getBBox().width},destroy:function(){var a=this.defs;this.box=null;this.boxWrapper=this.boxWrapper.destroy();h(this.gradients||{});this.gradients=null;a&&(this.defs=a.destroy());this.unSubPixelFix&&this.unSubPixelFix();return this.alignedObjects=null},createElement:function(a){var d=new this.Element;d.init(this,a);return d},draw:k,getRadialAttr:function(a,d){return{cx:a[0]-a[2]/\n2+d.cx*a[2],cy:a[1]-a[2]/2+d.cy*a[2],r:d.r*a[2]}},truncate:function(a,d,q,b,k,e,c){var l=this,u=a.rotation,t,p=b?1:0,K=(q||b).length,h=K,f=[],D=function(a){d.firstChild&&d.removeChild(d.firstChild);a&&d.appendChild(r.createTextNode(a))},w=function(e,u){u=u||e;if(void 0===f[u])if(d.getSubStringLength)try{f[u]=k+d.getSubStringLength(0,b?u+1:u)}catch(ea){\"\"}else l.getSpanWidth&&(D(c(q||b,e)),f[u]=k+l.getSpanWidth(a,d));return f[u]},n,L;a.rotation=0;n=w(d.textContent.length);if(L=k+n>e){for(;p<=K;)h=\nMath.ceil((p+K)/2),b&&(t=c(b,h)),n=w(h,t&&t.length-1),p===K?p=K+1:n>e?K=h-1:p=h;0===K?D(\"\"):q&&K===q.length-1||D(t||c(q||b,h))}b&&b.splice(0,h);a.actualWidth=n;a.rotation=u;return L},escapes:{\"\\x26\":\"\\x26amp;\",\"\\x3c\":\"\\x26lt;\",\"\\x3e\":\"\\x26gt;\",\"'\":\"\\x26#39;\",'\"':\"\\x26quot;\"},buildText:function(a){var d=a.element,q=this,b=q.forExport,k=D(a.textStr,\"\").toString(),e=-1!==k.indexOf(\"\\x3c\"),c=d.childNodes,l,t=g(d,\"x\"),p=a.styles,K=a.textWidth,h=p&&p.lineHeight,f=p&&p.textOutline,w=p&&\"ellipsis\"===p.textOverflow,\nn=p&&\"nowrap\"===p.whiteSpace,J=p&&p.fontSize,F,N,R=c.length,p=K&&!a.added&&this.box,B=function(a){var b;q.styledMode||(b=/(px|em)$/.test(a&&a.style.fontSize)?a.style.fontSize:J||q.style.fontSize||12);return h?G(h):q.fontMetrics(b,a.getAttribute(\"style\")?a:d).h},m=function(a,d){u(q.escapes,function(q,b){d&&-1!==d.indexOf(q)||(a=a.toString().replace(new RegExp(q,\"g\"),b))});return a},M=function(a,d){var q;q=a.indexOf(\"\\x3c\");a=a.substring(q,a.indexOf(\"\\x3e\")-q);q=a.indexOf(d+\"\\x3d\");if(-1!==q&&(q=q+\nd.length+1,d=a.charAt(q),'\"'===d||\"'\"===d))return a=a.substring(q+1),a.substring(0,a.indexOf(d))};F=[k,w,n,h,f,J,K].join();if(F!==a.textCache){for(a.textCache=F;R--;)d.removeChild(c[R]);e||f||w||K||-1!==k.indexOf(\" \")?(p&&p.appendChild(d),e?(k=q.styledMode?k.replace(/<(b|strong)>/g,'\\x3cspan class\\x3d\"highcharts-strong\"\\x3e').replace(/<(i|em)>/g,'\\x3cspan class\\x3d\"highcharts-emphasized\"\\x3e'):k.replace(/<(b|strong)>/g,'\\x3cspan style\\x3d\"font-weight:bold\"\\x3e').replace(/<(i|em)>/g,'\\x3cspan style\\x3d\"font-style:italic\"\\x3e'),\nk=k.replace(/<a/g,\"\\x3cspan\").replace(/<\\/(b|strong|i|em|a)>/g,\"\\x3c/span\\x3e\").split(/<br.*?>/g)):k=[k],k=k.filter(function(a){return\"\"!==a}),k.forEach(function(k,e){var c,u=0,p=0;k=k.replace(/^\\s+|\\s+$/g,\"\").replace(/<span/g,\"|||\\x3cspan\").replace(/<\\/span>/g,\"\\x3c/span\\x3e|||\");c=k.split(\"|||\");c.forEach(function(k){if(\"\"!==k||1===c.length){var h={},f=r.createElementNS(q.SVG_NS,\"tspan\"),D,G;(D=M(k,\"class\"))&&g(f,\"class\",D);if(D=M(k,\"style\"))D=D.replace(/(;| |^)color([ :])/,\"$1fill$2\"),g(f,\"style\",\nD);(G=M(k,\"href\"))&&!b&&(g(f,\"onclick\",'location.href\\x3d\"'+G+'\"'),g(f,\"class\",\"highcharts-anchor\"),q.styledMode||y(f,{cursor:\"pointer\"}));k=m(k.replace(/<[a-zA-Z\\/](.|\\n)*?>/g,\"\")||\" \");if(\" \"!==k){f.appendChild(r.createTextNode(k));u?h.dx=0:e&&null!==t&&(h.x=t);g(f,h);d.appendChild(f);!u&&N&&(!O&&b&&y(f,{display:\"block\"}),g(f,\"dy\",B(f)));if(K){var F=k.replace(/([^\\^])-/g,\"$1- \").split(\" \"),h=!n&&(1<c.length||e||1<F.length);G=0;var R=B(f);if(w)l=q.truncate(a,f,k,void 0,0,Math.max(0,K-parseInt(J||\n12,10)),function(a,d){return a.substring(0,d)+\"\\u2026\"});else if(h)for(;F.length;)F.length&&!n&&0<G&&(f=r.createElementNS(L,\"tspan\"),g(f,{dy:R,x:t}),D&&g(f,\"style\",D),f.appendChild(r.createTextNode(F.join(\" \").replace(/- /g,\"-\"))),d.appendChild(f)),q.truncate(a,f,null,F,0===G?p:0,K,function(a,d){return F.slice(0,d).join(\" \").replace(/- /g,\"-\")}),p=a.actualWidth,G++}u++}}});N=N||d.childNodes.length}),w&&l&&a.attr(\"title\",m(a.textStr,[\"\\x26lt;\",\"\\x26gt;\"])),p&&p.removeChild(d),f&&a.applyTextOutline&&\na.applyTextOutline(f)):d.appendChild(r.createTextNode(m(k)))}},getContrast:function(a){a=x(a).rgba;a[0]*=1;a[1]*=1.2;a[2]*=.5;return 459<a[0]+a[1]+a[2]?\"#000000\":\"#FFFFFF\"},button:function(a,q,b,k,c,l,u,t,p,K){var h=this.label(a,q,b,p,null,null,K,null,\"button\"),f=0,D=this.styledMode;h.attr(d({padding:8,r:2},c));if(!D){var r,w,n,G;c=d({fill:\"#f7f7f7\",stroke:\"#cccccc\",\"stroke-width\":1,style:{color:\"#333333\",cursor:\"pointer\",fontWeight:\"normal\"}},c);r=c.style;delete c.style;l=d(c,{fill:\"#e6e6e6\"},l);\nw=l.style;delete l.style;u=d(c,{fill:\"#e6ebf5\",style:{color:\"#000000\",fontWeight:\"bold\"}},u);n=u.style;delete u.style;t=d(c,{style:{color:\"#cccccc\"}},t);G=t.style;delete t.style}E(h.element,F?\"mouseover\":\"mouseenter\",function(){3!==f&&h.setState(1)});E(h.element,F?\"mouseout\":\"mouseleave\",function(){3!==f&&h.setState(f)});h.setState=function(a){1!==a&&(h.state=f=a);h.removeClass(/highcharts-button-(normal|hover|pressed|disabled)/).addClass(\"highcharts-button-\"+[\"normal\",\"hover\",\"pressed\",\"disabled\"][a||\n0]);D||h.attr([c,l,u,t][a||0]).css([r,w,n,G][a||0])};D||h.attr(c).css(e({cursor:\"default\"},r));return h.on(\"click\",function(a){3!==f&&k.call(h,a)})},crispLine:function(a,d){a[1]===a[4]&&(a[1]=a[4]=Math.round(a[1])-d%2/2);a[2]===a[5]&&(a[2]=a[5]=Math.round(a[2])+d%2/2);return a},path:function(a){var d=this.styledMode?{}:{fill:\"none\"};c(a)?d.d=a:w(a)&&e(d,a);return this.createElement(\"path\").attr(d)},circle:function(a,d,q){a=w(a)?a:void 0===a?{}:{x:a,y:d,r:q};d=this.createElement(\"circle\");d.xSetter=\nd.ySetter=function(a,d,q){q.setAttribute(\"c\"+d,a)};return d.attr(a)},arc:function(a,d,q,b,k,e){w(a)?(b=a,d=b.y,q=b.r,a=b.x):b={innerR:b,start:k,end:e};a=this.symbol(\"arc\",a,d,q,q,b);a.r=q;return a},rect:function(a,d,q,b,k,e){k=w(a)?a.r:k;var c=this.createElement(\"rect\");a=w(a)?a:void 0===a?{}:{x:a,y:d,width:Math.max(q,0),height:Math.max(b,0)};this.styledMode||(void 0!==e&&(a.strokeWidth=e,a=c.crisp(a)),a.fill=\"none\");k&&(a.r=k);c.rSetter=function(a,d,q){c.r=a;g(q,{rx:a,ry:a})};c.rGetter=function(){return c.r};\nreturn c.attr(a)},setSize:function(a,d,q){var b=this.alignedObjects,k=b.length;this.width=a;this.height=d;for(this.boxWrapper.animate({width:a,height:d},{step:function(){this.attr({viewBox:\"0 0 \"+this.attr(\"width\")+\" \"+this.attr(\"height\")})},duration:D(q,!0)?void 0:0});k--;)b[k].align()},g:function(a){var d=this.createElement(\"g\");return a?d.attr({\"class\":\"highcharts-\"+a}):d},image:function(a,d,q,b,k,c){var l={preserveAspectRatio:\"none\"},u,t=function(a,d){a.setAttributeNS?a.setAttributeNS(\"http://www.w3.org/1999/xlink\",\n\"href\",d):a.setAttribute(\"hc-svg-href\",d)},p=function(d){t(u.element,a);c.call(u,d)};1<arguments.length&&e(l,{x:d,y:q,width:b,height:k});u=this.createElement(\"image\").attr(l);c?(t(u.element,\"data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw\\x3d\\x3d\"),l=new M.Image,E(l,\"load\",p),l.src=a,l.complete&&p({})):t(u.element,a);return u},symbol:function(a,d,q,b,k,c){var l=this,u,t=/^url\\((.*?)\\)$/,p=t.test(a),K=!p&&(this.symbols[a]?a:\"circle\"),h=K&&this.symbols[K],f=n(d)&&h&&h.call(this.symbols,\nMath.round(d),Math.round(q),b,k,c),w,G;h?(u=this.path(f),l.styledMode||u.attr(\"fill\",\"none\"),e(u,{symbolName:K,x:d,y:q,width:b,height:k}),c&&e(u,c)):p&&(w=a.match(t)[1],u=this.image(w),u.imgwidth=D(R[w]&&R[w].width,c&&c.width),u.imgheight=D(R[w]&&R[w].height,c&&c.height),G=function(){u.attr({width:u.width,height:u.height})},[\"width\",\"height\"].forEach(function(a){u[a+\"Setter\"]=function(a,d){var q={},b=this[\"img\"+d],k=\"width\"===d?\"translateX\":\"translateY\";this[d]=a;n(b)&&(c&&\"within\"===c.backgroundSize&&\nthis.width&&this.height&&(b=Math.round(b*Math.min(this.width/this.imgwidth,this.height/this.imgheight))),this.element&&this.element.setAttribute(d,b),this.alignByTranslate||(q[k]=((this[d]||0)-b)/2,this.attr(q)))}}),n(d)&&u.attr({x:d,y:q}),u.isImg=!0,n(u.imgwidth)&&n(u.imgheight)?G():(u.attr({width:0,height:0}),z(\"img\",{onload:function(){var a=v[l.chartIndex];0===this.width&&(y(this,{position:\"absolute\",top:\"-999em\"}),r.body.appendChild(this));R[w]={width:this.width,height:this.height};u.imgwidth=\nthis.width;u.imgheight=this.height;u.element&&G();this.parentNode&&this.parentNode.removeChild(this);l.imgCount--;if(!l.imgCount&&a&&a.onload)a.onload()},src:w}),this.imgCount++));return u},symbols:{circle:function(a,d,q,b){return this.arc(a+q/2,d+b/2,q/2,b/2,{start:.5*Math.PI,end:2.5*Math.PI,open:!1})},square:function(a,d,q,b){return[\"M\",a,d,\"L\",a+q,d,a+q,d+b,a,d+b,\"Z\"]},triangle:function(a,d,q,b){return[\"M\",a+q/2,d,\"L\",a+q,d+b,a,d+b,\"Z\"]},\"triangle-down\":function(a,d,q,b){return[\"M\",a,d,\"L\",a+q,\nd,a+q/2,d+b,\"Z\"]},diamond:function(a,d,q,b){return[\"M\",a+q/2,d,\"L\",a+q,d+b/2,a+q/2,d+b,a,d+b/2,\"Z\"]},arc:function(a,d,q,b,k){var e=k.start,c=k.r||q,u=k.r||b||q,l=k.end-.001;q=k.innerR;b=D(k.open,.001>Math.abs(k.end-k.start-2*Math.PI));var t=Math.cos(e),p=Math.sin(e),K=Math.cos(l),l=Math.sin(l),e=.001>k.end-e-Math.PI?0:1;k=[\"M\",a+c*t,d+u*p,\"A\",c,u,0,e,D(k.clockwise,1),a+c*K,d+u*l];n(q)&&k.push(b?\"M\":\"L\",a+q*K,d+q*l,\"A\",q,q,0,e,0,a+q*t,d+q*p);k.push(b?\"\":\"Z\");return k},callout:function(a,d,q,b,k){var e=\nMath.min(k&&k.r||0,q,b),c=e+6,u=k&&k.anchorX;k=k&&k.anchorY;var l;l=[\"M\",a+e,d,\"L\",a+q-e,d,\"C\",a+q,d,a+q,d,a+q,d+e,\"L\",a+q,d+b-e,\"C\",a+q,d+b,a+q,d+b,a+q-e,d+b,\"L\",a+e,d+b,\"C\",a,d+b,a,d+b,a,d+b-e,\"L\",a,d+e,\"C\",a,d,a,d,a+e,d];u&&u>q?k>d+c&&k<d+b-c?l.splice(13,3,\"L\",a+q,k-6,a+q+6,k,a+q,k+6,a+q,d+b-e):l.splice(13,3,\"L\",a+q,b/2,u,k,a+q,b/2,a+q,d+b-e):u&&0>u?k>d+c&&k<d+b-c?l.splice(33,3,\"L\",a,k+6,a-6,k,a,k-6,a,d+e):l.splice(33,3,\"L\",a,b/2,u,k,a,b/2,a,d+e):k&&k>b&&u>a+c&&u<a+q-c?l.splice(23,3,\"L\",u+6,d+\nb,u,d+b+6,u-6,d+b,a+e,d+b):k&&0>k&&u>a+c&&u<a+q-c&&l.splice(3,3,\"L\",u-6,d,u,d-6,u+6,d,q-e,d);return l}},clipRect:function(d,q,b,k){var e=a.uniqueKey()+\"-\",c=this.createElement(\"clipPath\").attr({id:e}).add(this.defs);d=this.rect(d,q,b,k,0).add(c);d.id=e;d.clipPath=c;d.count=0;return d},text:function(a,d,q,b){var k={};if(b&&(this.allowHTML||!this.forExport))return this.html(a,d,q);k.x=Math.round(d||0);q&&(k.y=Math.round(q));n(a)&&(k.text=a);a=this.createElement(\"text\").attr(k);b||(a.xSetter=function(a,\nd,q){var b=q.getElementsByTagName(\"tspan\"),k,e=q.getAttribute(d),c;for(c=0;c<b.length;c++)k=b[c],k.getAttribute(d)===e&&k.setAttribute(d,a);q.setAttribute(d,a)});return a},fontMetrics:function(a,d){a=!this.styledMode&&/px/.test(a)||!M.getComputedStyle?a||d&&d.style&&d.style.fontSize||this.style&&this.style.fontSize:d&&C.prototype.getStyle.call(d,\"font-size\");a=/px/.test(a)?G(a):12;d=24>a?a+3:Math.round(1.2*a);return{h:d,b:Math.round(.8*d),f:a}},rotCorr:function(a,d,q){var b=a;d&&q&&(b=Math.max(b*\nMath.cos(d*f),4));return{x:-a/3*Math.sin(d*f),y:b}},label:function(b,k,c,u,l,t,p,K,h){var f=this,D=f.styledMode,w=f.g(\"button\"!==h&&\"label\"),r=w.text=f.text(\"\",0,0,p).attr({zIndex:1}),G,L,O=0,F=3,g=0,N,R,B,m,J,M={},z,v,x=/^url\\((.*?)\\)$/.test(u),y=D||x,da=function(){return D?G.strokeWidth()%2/2:(z?parseInt(z,10):0)%2/2},ba,P,A;h&&w.addClass(\"highcharts-\"+h);ba=function(){var a=r.element.style,d={};L=(void 0===N||void 0===R||J)&&n(r.textStr)&&r.getBBox();w.width=(N||L.width||0)+2*F+g;w.height=(R||\nL.height||0)+2*F;v=F+Math.min(f.fontMetrics(a&&a.fontSize,r).b,L?L.height:Infinity);y&&(G||(w.box=G=f.symbols[u]||x?f.symbol(u):f.rect(),G.addClass((\"button\"===h?\"\":\"highcharts-label-box\")+(h?\" highcharts-\"+h+\"-box\":\"\")),G.add(w),a=da(),d.x=a,d.y=(K?-v:0)+a),d.width=Math.round(w.width),d.height=Math.round(w.height),G.attr(e(d,M)),M={})};P=function(){var a=g+F,d;d=K?0:v;n(N)&&L&&(\"center\"===J||\"right\"===J)&&(a+={center:.5,right:1}[J]*(N-L.width));if(a!==r.x||d!==r.y)r.attr(\"x\",a),r.hasBoxWidthChanged&&\n(L=r.getBBox(!0),ba()),void 0!==d&&r.attr(\"y\",d);r.x=a;r.y=d};A=function(a,d){G?G.attr(a,d):M[a]=d};w.onAdd=function(){r.add(w);w.attr({text:b||0===b?b:\"\",x:k,y:c});G&&n(l)&&w.attr({anchorX:l,anchorY:t})};w.widthSetter=function(d){N=a.isNumber(d)?d:null};w.heightSetter=function(a){R=a};w[\"text-alignSetter\"]=function(a){J=a};w.paddingSetter=function(a){n(a)&&a!==F&&(F=w.padding=a,P())};w.paddingLeftSetter=function(a){n(a)&&a!==g&&(g=a,P())};w.alignSetter=function(a){a={left:0,center:.5,right:1}[a];\na!==O&&(O=a,L&&w.attr({x:B}))};w.textSetter=function(a){void 0!==a&&r.attr({text:a});ba();P()};w[\"stroke-widthSetter\"]=function(a,d){a&&(y=!0);z=this[\"stroke-width\"]=a;A(d,a)};D?w.rSetter=function(a,d){A(d,a)}:w.strokeSetter=w.fillSetter=w.rSetter=function(a,d){\"r\"!==d&&(\"fill\"===d&&a&&(y=!0),w[d]=a);A(d,a)};w.anchorXSetter=function(a,d){l=w.anchorX=a;A(d,Math.round(a)-da()-B)};w.anchorYSetter=function(a,d){t=w.anchorY=a;A(d,a-m)};w.xSetter=function(a){w.x=a;O&&(a-=O*((N||L.width)+2*F),w[\"forceAnimate:x\"]=\n!0);B=Math.round(a);w.attr(\"translateX\",B)};w.ySetter=function(a){m=w.y=Math.round(a);w.attr(\"translateY\",m)};var S=w.css;p={css:function(a){if(a){var q={};a=d(a);w.textProps.forEach(function(d){void 0!==a[d]&&(q[d]=a[d],delete a[d])});r.css(q);\"width\"in q&&ba();\"fontSize\"in q&&(ba(),P())}return S.call(w,a)},getBBox:function(){return{width:L.width+2*F,height:L.height+2*F,x:L.x-F,y:L.y-F}},destroy:function(){q(w.element,\"mouseenter\");q(w.element,\"mouseleave\");r&&(r=r.destroy());G&&(G=G.destroy());\nC.prototype.destroy.call(w);w=f=ba=P=A=null}};D||(p.shadow=function(a){a&&(ba(),G&&G.shadow(a));return w});return e(w,p)}});a.Renderer=A});I(H,\"parts/Html.js\",[H[\"parts/Globals.js\"]],function(a){var C=a.attr,A=a.createElement,E=a.css,m=a.defined,g=a.extend,v=a.isFirefox,x=a.isMS,y=a.isWebKit,z=a.pick,n=a.pInt,f=a.SVGElement,h=a.SVGRenderer,r=a.win;g(f.prototype,{htmlCss:function(a){var b=\"SPAN\"===this.element.tagName&&a&&\"width\"in a,e=z(b&&a.width,void 0),c;b&&(delete a.width,this.textWidth=e,c=!0);\na&&\"ellipsis\"===a.textOverflow&&(a.whiteSpace=\"nowrap\",a.overflow=\"hidden\");this.styles=g(this.styles,a);E(this.element,a);c&&this.htmlUpdateTransform();return this},htmlGetBBox:function(){var a=this.element;return{x:a.offsetLeft,y:a.offsetTop,width:a.offsetWidth,height:a.offsetHeight}},htmlUpdateTransform:function(){if(this.added){var a=this.renderer,b=this.element,l=this.translateX||0,c=this.translateY||0,t=this.x||0,h=this.y||0,f=this.textAlign||\"left\",r={left:0,center:.5,right:1}[f],p=this.styles,\nd=p&&p.whiteSpace;E(b,{marginLeft:l,marginTop:c});!a.styledMode&&this.shadows&&this.shadows.forEach(function(a){E(a,{marginLeft:l+1,marginTop:c+1})});this.inverted&&[].forEach.call(b.childNodes,function(d){a.invertChild(d,b)});if(\"SPAN\"===b.tagName){var p=this.rotation,k=this.textWidth&&n(this.textWidth),u=[p,f,b.innerHTML,this.textWidth,this.textAlign].join(),D;(D=k!==this.oldTextWidth)&&!(D=k>this.oldTextWidth)&&((D=this.textPxLength)||(E(b,{width:\"\",whiteSpace:d||\"nowrap\"}),D=b.offsetWidth),D=\nD>k);D&&(/[ \\-]/.test(b.textContent||b.innerText)||\"ellipsis\"===b.style.textOverflow)?(E(b,{width:k+\"px\",display:\"block\",whiteSpace:d||\"normal\"}),this.oldTextWidth=k,this.hasBoxWidthChanged=!0):this.hasBoxWidthChanged=!1;u!==this.cTT&&(d=a.fontMetrics(b.style.fontSize,b).b,!m(p)||p===(this.oldRotation||0)&&f===this.oldAlign||this.setSpanRotation(p,r,d),this.getSpanCorrection(!m(p)&&this.textPxLength||b.offsetWidth,d,r,p,f));E(b,{left:t+(this.xCorr||0)+\"px\",top:h+(this.yCorr||0)+\"px\"});this.cTT=u;\nthis.oldRotation=p;this.oldAlign=f}}else this.alignOnAdd=!0},setSpanRotation:function(a,b,l){var c={},e=this.renderer.getTransformKey();c[e]=c.transform=\"rotate(\"+a+\"deg)\";c[e+(v?\"Origin\":\"-origin\")]=c.transformOrigin=100*b+\"% \"+l+\"px\";E(this.element,c)},getSpanCorrection:function(a,b,l){this.xCorr=-a*l;this.yCorr=-b}});g(h.prototype,{getTransformKey:function(){return x&&!/Edge/.test(r.navigator.userAgent)?\"-ms-transform\":y?\"-webkit-transform\":v?\"MozTransform\":r.opera?\"-o-transform\":\"\"},html:function(e,\nb,l){var c=this.createElement(\"span\"),t=c.element,h=c.renderer,w=h.isSVG,r=function(a,b){[\"opacity\",\"visibility\"].forEach(function(d){a[d+\"Setter\"]=function(k,c,q){var e=a.div?a.div.style:b;f.prototype[d+\"Setter\"].call(this,k,c,q);e&&(e[c]=k)}});a.addedSetters=!0},p=a.charts[h.chartIndex],p=p&&p.styledMode;c.textSetter=function(a){a!==t.innerHTML&&(delete this.bBox,delete this.oldTextWidth);this.textStr=a;t.innerHTML=z(a,\"\");c.doTransform=!0};w&&r(c,c.element.style);c.xSetter=c.ySetter=c.alignSetter=\nc.rotationSetter=function(a,b){\"align\"===b&&(b=\"textAlign\");c[b]=a;c.doTransform=!0};c.afterSetters=function(){this.doTransform&&(this.htmlUpdateTransform(),this.doTransform=!1)};c.attr({text:e,x:Math.round(b),y:Math.round(l)}).css({position:\"absolute\"});p||c.css({fontFamily:this.style.fontFamily,fontSize:this.style.fontSize});t.style.whiteSpace=\"nowrap\";c.css=c.htmlCss;w&&(c.add=function(a){var d,b=h.box.parentNode,e=[];if(this.parentGroup=a){if(d=a.div,!d){for(;a;)e.push(a),a=a.parentGroup;e.reverse().forEach(function(a){function q(d,\nq){a[q]=d;\"translateX\"===q?k.left=d+\"px\":k.top=d+\"px\";a.doTransform=!0}var k,u=C(a.element,\"class\");u&&(u={className:u});d=a.div=a.div||A(\"div\",u,{position:\"absolute\",left:(a.translateX||0)+\"px\",top:(a.translateY||0)+\"px\",display:a.display,opacity:a.opacity,pointerEvents:a.styles&&a.styles.pointerEvents},d||b);k=d.style;g(a,{classSetter:function(a){return function(d){this.element.setAttribute(\"class\",d);a.className=d}}(d),on:function(){e[0].div&&c.on.apply({element:e[0].div},arguments);return a},\ntranslateXSetter:q,translateYSetter:q});a.addedSetters||r(a)})}}else d=b;d.appendChild(t);c.added=!0;c.alignOnAdd&&c.htmlUpdateTransform();return c});return c}})});I(H,\"parts/Time.js\",[H[\"parts/Globals.js\"]],function(a){var C=a.defined,A=a.extend,E=a.merge,m=a.pick,g=a.timeUnits,v=a.win;a.Time=function(a){this.update(a,!1)};a.Time.prototype={defaultOptions:{},update:function(a){var g=m(a&&a.useUTC,!0),z=this;this.options=a=E(!0,this.options||{},a);this.Date=a.Date||v.Date||Date;this.timezoneOffset=\n(this.useUTC=g)&&a.timezoneOffset;this.getTimezoneOffset=this.timezoneOffsetFunction();(this.variableTimezone=!(g&&!a.getTimezoneOffset&&!a.timezone))||this.timezoneOffset?(this.get=function(a,f){var h=f.getTime(),r=h-z.getTimezoneOffset(f);f.setTime(r);a=f[\"getUTC\"+a]();f.setTime(h);return a},this.set=function(a,f,h){var r;if(\"Milliseconds\"===a||\"Seconds\"===a||\"Minutes\"===a&&0===f.getTimezoneOffset()%60)f[\"set\"+a](h);else r=z.getTimezoneOffset(f),r=f.getTime()-r,f.setTime(r),f[\"setUTC\"+a](h),a=z.getTimezoneOffset(f),\nr=f.getTime()+a,f.setTime(r)}):g?(this.get=function(a,f){return f[\"getUTC\"+a]()},this.set=function(a,f,h){return f[\"setUTC\"+a](h)}):(this.get=function(a,f){return f[\"get\"+a]()},this.set=function(a,f,h){return f[\"set\"+a](h)})},makeTime:function(g,v,z,n,f,h){var r,e,b;this.useUTC?(r=this.Date.UTC.apply(0,arguments),e=this.getTimezoneOffset(r),r+=e,b=this.getTimezoneOffset(r),e!==b?r+=b-e:e-36E5!==this.getTimezoneOffset(r-36E5)||a.isSafari||(r-=36E5)):r=(new this.Date(g,v,m(z,1),m(n,0),m(f,0),m(h,0))).getTime();\nreturn r},timezoneOffsetFunction:function(){var g=this,m=this.options,z=v.moment;if(!this.useUTC)return function(a){return 6E4*(new Date(a)).getTimezoneOffset()};if(m.timezone){if(z)return function(a){return 6E4*-z.tz(a,m.timezone).utcOffset()};a.error(25)}return this.useUTC&&m.getTimezoneOffset?function(a){return 6E4*m.getTimezoneOffset(a)}:function(){return 6E4*(g.timezoneOffset||0)}},dateFormat:function(g,m,v){if(!a.defined(m)||isNaN(m))return a.defaultOptions.lang.invalidDate||\"\";g=a.pick(g,\"%Y-%m-%d %H:%M:%S\");\nvar n=this,f=new this.Date(m),h=this.get(\"Hours\",f),r=this.get(\"Day\",f),e=this.get(\"Date\",f),b=this.get(\"Month\",f),l=this.get(\"FullYear\",f),c=a.defaultOptions.lang,t=c.weekdays,F=c.shortWeekdays,w=a.pad,f=a.extend({a:F?F[r]:t[r].substr(0,3),A:t[r],d:w(e),e:w(e,2,\" \"),w:r,b:c.shortMonths[b],B:c.months[b],m:w(b+1),o:b+1,y:l.toString().substr(2,2),Y:l,H:w(h),k:h,I:w(h%12||12),l:h%12||12,M:w(n.get(\"Minutes\",f)),p:12>h?\"AM\":\"PM\",P:12>h?\"am\":\"pm\",S:w(f.getSeconds()),L:w(Math.floor(m%1E3),3)},a.dateFormats);\na.objectEach(f,function(a,b){for(;-1!==g.indexOf(\"%\"+b);)g=g.replace(\"%\"+b,\"function\"===typeof a?a.call(n,m):a)});return v?g.substr(0,1).toUpperCase()+g.substr(1):g},resolveDTLFormat:function(g){return a.isObject(g,!0)?g:(g=a.splat(g),{main:g[0],from:g[1],to:g[2]})},getTimeTicks:function(a,v,z,n){var f=this,h=[],r,e={},b;r=new f.Date(v);var l=a.unitRange,c=a.count||1,t;n=m(n,1);if(C(v)){f.set(\"Milliseconds\",r,l>=g.second?0:c*Math.floor(f.get(\"Milliseconds\",r)/c));l>=g.second&&f.set(\"Seconds\",r,l>=\ng.minute?0:c*Math.floor(f.get(\"Seconds\",r)/c));l>=g.minute&&f.set(\"Minutes\",r,l>=g.hour?0:c*Math.floor(f.get(\"Minutes\",r)/c));l>=g.hour&&f.set(\"Hours\",r,l>=g.day?0:c*Math.floor(f.get(\"Hours\",r)/c));l>=g.day&&f.set(\"Date\",r,l>=g.month?1:Math.max(1,c*Math.floor(f.get(\"Date\",r)/c)));l>=g.month&&(f.set(\"Month\",r,l>=g.year?0:c*Math.floor(f.get(\"Month\",r)/c)),b=f.get(\"FullYear\",r));l>=g.year&&f.set(\"FullYear\",r,b-b%c);l===g.week&&(b=f.get(\"Day\",r),f.set(\"Date\",r,f.get(\"Date\",r)-b+n+(b<n?-7:0)));b=f.get(\"FullYear\",\nr);n=f.get(\"Month\",r);var F=f.get(\"Date\",r),w=f.get(\"Hours\",r);v=r.getTime();f.variableTimezone&&(t=z-v>4*g.month||f.getTimezoneOffset(v)!==f.getTimezoneOffset(z));v=r.getTime();for(r=1;v<z;)h.push(v),v=l===g.year?f.makeTime(b+r*c,0):l===g.month?f.makeTime(b,n+r*c):!t||l!==g.day&&l!==g.week?t&&l===g.hour&&1<c?f.makeTime(b,n,F,w+r*c):v+l*c:f.makeTime(b,n,F+r*c*(l===g.day?1:7)),r++;h.push(v);l<=g.hour&&1E4>h.length&&h.forEach(function(a){0===a%18E5&&\"000000000\"===f.dateFormat(\"%H%M%S%L\",a)&&(e[a]=\"day\")})}h.info=\nA(a,{higherRanks:e,totalRange:l*c});return h}}});I(H,\"parts/Options.js\",[H[\"parts/Globals.js\"]],function(a){var C=a.color,A=a.merge;a.defaultOptions={colors:\"#7cb5ec #434348 #90ed7d #f7a35c #8085e9 #f15c80 #e4d354 #2b908f #f45b5b #91e8e1\".split(\" \"),symbols:[\"circle\",\"diamond\",\"square\",\"triangle\",\"triangle-down\"],lang:{loading:\"Loading...\",months:\"January February March April May June July August September October November December\".split(\" \"),shortMonths:\"Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec\".split(\" \"),\nweekdays:\"Sunday Monday Tuesday Wednesday Thursday Friday Saturday\".split(\" \"),decimalPoint:\".\",numericSymbols:\"kMGTPE\".split(\"\"),resetZoom:\"Reset zoom\",resetZoomTitle:\"Reset zoom level 1:1\",thousandsSep:\" \"},global:{},time:a.Time.prototype.defaultOptions,chart:{styledMode:!1,borderRadius:0,colorCount:10,defaultSeriesType:\"line\",ignoreHiddenSeries:!0,spacing:[10,10,15,10],resetZoomButton:{theme:{zIndex:6},position:{align:\"right\",x:-10,y:10}},width:null,height:null,borderColor:\"#335cad\",backgroundColor:\"#ffffff\",\nplotBorderColor:\"#cccccc\"},title:{text:\"Chart title\",align:\"center\",margin:15,widthAdjust:-44},subtitle:{text:\"\",align:\"center\",widthAdjust:-44},plotOptions:{},labels:{style:{position:\"absolute\",color:\"#333333\"}},legend:{enabled:!0,align:\"center\",alignColumns:!0,layout:\"horizontal\",labelFormatter:function(){return this.name},borderColor:\"#999999\",borderRadius:0,navigation:{activeColor:\"#003399\",inactiveColor:\"#cccccc\"},itemStyle:{color:\"#333333\",cursor:\"pointer\",fontSize:\"12px\",fontWeight:\"bold\",\ntextOverflow:\"ellipsis\"},itemHoverStyle:{color:\"#000000\"},itemHiddenStyle:{color:\"#cccccc\"},shadow:!1,itemCheckboxStyle:{position:\"absolute\",width:\"13px\",height:\"13px\"},squareSymbol:!0,symbolPadding:5,verticalAlign:\"bottom\",x:0,y:0,title:{style:{fontWeight:\"bold\"}}},loading:{labelStyle:{fontWeight:\"bold\",position:\"relative\",top:\"45%\"},style:{position:\"absolute\",backgroundColor:\"#ffffff\",opacity:.5,textAlign:\"center\"}},tooltip:{enabled:!0,animation:a.svg,borderRadius:3,dateTimeLabelFormats:{millisecond:\"%A, %b %e, %H:%M:%S.%L\",\nsecond:\"%A, %b %e, %H:%M:%S\",minute:\"%A, %b %e, %H:%M\",hour:\"%A, %b %e, %H:%M\",day:\"%A, %b %e, %Y\",week:\"Week from %A, %b %e, %Y\",month:\"%B %Y\",year:\"%Y\"},footerFormat:\"\",padding:8,snap:a.isTouchDevice?25:10,headerFormat:'\\x3cspan style\\x3d\"font-size: 10px\"\\x3e{point.key}\\x3c/span\\x3e\\x3cbr/\\x3e',pointFormat:'\\x3cspan style\\x3d\"color:{point.color}\"\\x3e\\u25cf\\x3c/span\\x3e {series.name}: \\x3cb\\x3e{point.y}\\x3c/b\\x3e\\x3cbr/\\x3e',backgroundColor:C(\"#f7f7f7\").setOpacity(.85).get(),borderWidth:1,shadow:!0,\nstyle:{color:\"#333333\",cursor:\"default\",fontSize:\"12px\",pointerEvents:\"none\",whiteSpace:\"nowrap\"}},credits:{enabled:!0,href:\"https://www.highcharts.com?credits\",position:{align:\"right\",x:-10,verticalAlign:\"bottom\",y:-5},style:{cursor:\"pointer\",color:\"#999999\",fontSize:\"9px\"},text:\"Highcharts.com\"}};a.setOptions=function(C){a.defaultOptions=A(!0,a.defaultOptions,C);a.time.update(A(a.defaultOptions.global,a.defaultOptions.time),!1);return a.defaultOptions};a.getOptions=function(){return a.defaultOptions};\na.defaultPlotOptions=a.defaultOptions.plotOptions;a.time=new a.Time(A(a.defaultOptions.global,a.defaultOptions.time));a.dateFormat=function(A,m,g){return a.time.dateFormat(A,m,g)};\"\"});I(H,\"parts/Tick.js\",[H[\"parts/Globals.js\"]],function(a){var C=a.correctFloat,A=a.defined,E=a.destroyObjectProperties,m=a.fireEvent,g=a.isNumber,v=a.merge,x=a.pick,y=a.deg2rad;a.Tick=function(a,n,f,h,r){this.axis=a;this.pos=n;this.type=f||\"\";this.isNewLabel=this.isNew=!0;this.parameters=r||{};this.tickmarkOffset=this.parameters.tickmarkOffset;\nthis.options=this.parameters.options;f||h||this.addLabel()};a.Tick.prototype={addLabel:function(){var g=this,n=g.axis,f=n.options,h=n.chart,r=n.categories,e=n.names,b=g.pos,l=x(g.options&&g.options.labels,f.labels),c=n.tickPositions,t=b===c[0],F=b===c[c.length-1],r=this.parameters.category||(r?x(r[b],e[b],b):b),w=g.label,c=c.info,B,p,d,k;n.isDatetimeAxis&&c&&(p=h.time.resolveDTLFormat(f.dateTimeLabelFormats[!f.grid&&c.higherRanks[b]||c.unitName]),B=p.main);g.isFirst=t;g.isLast=F;g.formatCtx={axis:n,\nchart:h,isFirst:t,isLast:F,dateTimeLabelFormat:B,tickPositionInfo:c,value:n.isLog?C(n.lin2log(r)):r,pos:b};f=n.labelFormatter.call(g.formatCtx,this.formatCtx);if(k=p&&p.list)g.shortenLabel=function(){for(d=0;d<k.length;d++)if(w.attr({text:n.labelFormatter.call(a.extend(g.formatCtx,{dateTimeLabelFormat:k[d]}))}),w.getBBox().width<n.getSlotWidth(g)-2*x(l.padding,5))return;w.attr({text:\"\"})};if(A(w))w&&w.textStr!==f&&(!w.textWidth||l.style&&l.style.width||w.styles.width||w.css({width:null}),w.attr({text:f}),\nw.textPxLength=w.getBBox().width);else{if(g.label=w=A(f)&&l.enabled?h.renderer.text(f,0,0,l.useHTML).add(n.labelGroup):null)h.styledMode||w.css(v(l.style)),w.textPxLength=w.getBBox().width;g.rotation=0}},getLabelSize:function(){return this.label?this.label.getBBox()[this.axis.horiz?\"height\":\"width\"]:0},handleOverflow:function(a){var n=this.axis,f=n.options.labels,h=a.x,r=n.chart.chartWidth,e=n.chart.spacing,b=x(n.labelLeft,Math.min(n.pos,e[3])),e=x(n.labelRight,Math.max(n.isRadial?0:n.pos+n.len,r-\ne[1])),l=this.label,c=this.rotation,t={left:0,center:.5,right:1}[n.labelAlign||l.attr(\"align\")],g=l.getBBox().width,w=n.getSlotWidth(this),B=w,p=1,d,k={};if(c||\"justify\"!==x(f.overflow,\"justify\"))0>c&&h-t*g<b?d=Math.round(h/Math.cos(c*y)-b):0<c&&h+t*g>e&&(d=Math.round((r-h)/Math.cos(c*y)));else if(r=h+(1-t)*g,h-t*g<b?B=a.x+B*(1-t)-b:r>e&&(B=e-a.x+B*t,p=-1),B=Math.min(w,B),B<w&&\"center\"===n.labelAlign&&(a.x+=p*(w-B-t*(w-Math.min(g,B)))),g>B||n.autoRotation&&(l.styles||{}).width)d=B;d&&(this.shortenLabel?\nthis.shortenLabel():(k.width=Math.floor(d),(f.style||{}).textOverflow||(k.textOverflow=\"ellipsis\"),l.css(k)))},getPosition:function(g,n,f,h){var r=this.axis,e=r.chart,b=h&&e.oldChartHeight||e.chartHeight;g={x:g?a.correctFloat(r.translate(n+f,null,null,h)+r.transB):r.left+r.offset+(r.opposite?(h&&e.oldChartWidth||e.chartWidth)-r.right-r.left:0),y:g?b-r.bottom+r.offset-(r.opposite?r.height:0):a.correctFloat(b-r.translate(n+f,null,null,h)-r.transB)};g.y=Math.max(Math.min(g.y,1E5),-1E5);m(this,\"afterGetPosition\",\n{pos:g});return g},getLabelPosition:function(a,n,f,h,r,e,b,l){var c=this.axis,t=c.transA,g=c.reversed,w=c.staggerLines,B=c.tickRotCorr||{x:0,y:0},p=r.y,d=h||c.reserveSpaceDefault?0:-c.labelOffset*(\"center\"===c.labelAlign?.5:1),k={};A(p)||(p=0===c.side?f.rotation?-8:-f.getBBox().height:2===c.side?B.y+8:Math.cos(f.rotation*y)*(B.y-f.getBBox(!1,0).height/2));a=a+r.x+d+B.x-(e&&h?e*t*(g?-1:1):0);n=n+p-(e&&!h?e*t*(g?1:-1):0);w&&(f=b/(l||1)%w,c.opposite&&(f=w-f-1),n+=c.labelOffset/w*f);k.x=a;k.y=Math.round(n);\nm(this,\"afterGetLabelPosition\",{pos:k,tickmarkOffset:e,index:b});return k},getMarkPath:function(a,n,f,h,r,e){return e.crispLine([\"M\",a,n,\"L\",a+(r?0:-f),n+(r?f:0)],h)},renderGridLine:function(a,n,f){var h=this.axis,r=h.options,e=this.gridLine,b={},l=this.pos,c=this.type,t=x(this.tickmarkOffset,h.tickmarkOffset),g=h.chart.renderer,w=c?c+\"Grid\":\"grid\",B=r[w+\"LineWidth\"],p=r[w+\"LineColor\"],r=r[w+\"LineDashStyle\"];e||(h.chart.styledMode||(b.stroke=p,b[\"stroke-width\"]=B,r&&(b.dashstyle=r)),c||(b.zIndex=\n1),a&&(n=0),this.gridLine=e=g.path().attr(b).addClass(\"highcharts-\"+(c?c+\"-\":\"\")+\"grid-line\").add(h.gridGroup));if(e&&(f=h.getPlotLinePath({value:l+t,lineWidth:e.strokeWidth()*f,force:\"pass\",old:a})))e[a||this.isNew?\"attr\":\"animate\"]({d:f,opacity:n})},renderMark:function(a,n,f){var h=this.axis,r=h.options,e=h.chart.renderer,b=this.type,l=b?b+\"Tick\":\"tick\",c=h.tickSize(l),t=this.mark,g=!t,w=a.x;a=a.y;var B=x(r[l+\"Width\"],!b&&h.isXAxis?1:0),r=r[l+\"Color\"];c&&(h.opposite&&(c[0]=-c[0]),g&&(this.mark=\nt=e.path().addClass(\"highcharts-\"+(b?b+\"-\":\"\")+\"tick\").add(h.axisGroup),h.chart.styledMode||t.attr({stroke:r,\"stroke-width\":B})),t[g?\"attr\":\"animate\"]({d:this.getMarkPath(w,a,c[0],t.strokeWidth()*f,h.horiz,e),opacity:n}))},renderLabel:function(a,n,f,h){var r=this.axis,e=r.horiz,b=r.options,l=this.label,c=b.labels,t=c.step,r=x(this.tickmarkOffset,r.tickmarkOffset),F=!0,w=a.x;a=a.y;l&&g(w)&&(l.xy=a=this.getLabelPosition(w,a,l,e,c,r,h,t),this.isFirst&&!this.isLast&&!x(b.showFirstLabel,1)||this.isLast&&\n!this.isFirst&&!x(b.showLastLabel,1)?F=!1:!e||c.step||c.rotation||n||0===f||this.handleOverflow(a),t&&h%t&&(F=!1),F&&g(a.y)?(a.opacity=f,l[this.isNewLabel?\"attr\":\"animate\"](a),this.isNewLabel=!1):(l.attr(\"y\",-9999),this.isNewLabel=!0))},render:function(g,n,f){var h=this.axis,r=h.horiz,e=this.pos,b=x(this.tickmarkOffset,h.tickmarkOffset),e=this.getPosition(r,e,b,n),b=e.x,l=e.y,h=r&&b===h.pos+h.len||!r&&l===h.pos?-1:1;f=x(f,1);this.isActive=!0;this.renderGridLine(n,f,h);this.renderMark(e,f,h);this.renderLabel(e,\nn,f,g);this.isNew=!1;a.fireEvent(this,\"afterRender\")},destroy:function(){E(this,this.axis)}}});I(H,\"parts/Axis.js\",[H[\"parts/Globals.js\"]],function(a){var C=a.addEvent,A=a.animObject,E=a.arrayMax,m=a.arrayMin,g=a.color,v=a.correctFloat,x=a.defaultOptions,y=a.defined,z=a.deg2rad,n=a.destroyObjectProperties,f=a.extend,h=a.fireEvent,r=a.format,e=a.getMagnitude,b=a.isArray,l=a.isNumber,c=a.isString,t=a.merge,F=a.normalizeTickInterval,w=a.objectEach,B=a.pick,p=a.removeEvent,d=a.seriesTypes,k=a.splat,u=\na.syncTimeout,D=a.Tick,G=function(){this.init.apply(this,arguments)};a.extend(G.prototype,{defaultOptions:{dateTimeLabelFormats:{millisecond:{main:\"%H:%M:%S.%L\",range:!1},second:{main:\"%H:%M:%S\",range:!1},minute:{main:\"%H:%M\",range:!1},hour:{main:\"%H:%M\",range:!1},day:{main:\"%e. %b\"},week:{main:\"%e. %b\"},month:{main:\"%b '%y\"},year:{main:\"%Y\"}},endOnTick:!1,labels:{enabled:!0,indentation:10,x:0,style:{color:\"#666666\",cursor:\"default\",fontSize:\"11px\"}},maxPadding:.01,minorTickLength:2,minorTickPosition:\"outside\",\nminPadding:.01,showEmpty:!0,startOfWeek:1,startOnTick:!1,tickLength:10,tickPixelInterval:100,tickmarkPlacement:\"between\",tickPosition:\"outside\",title:{align:\"middle\",style:{color:\"#666666\"}},type:\"linear\",minorGridLineColor:\"#f2f2f2\",minorGridLineWidth:1,minorTickColor:\"#999999\",lineColor:\"#ccd6eb\",lineWidth:1,gridLineColor:\"#e6e6e6\",tickColor:\"#ccd6eb\"},defaultYAxisOptions:{endOnTick:!0,maxPadding:.05,minPadding:.05,tickPixelInterval:72,showLastLabel:!0,labels:{x:-8},startOnTick:!0,title:{rotation:270,\ntext:\"Values\"},stackLabels:{allowOverlap:!1,enabled:!1,formatter:function(){return a.numberFormat(this.total,-1)},style:{color:\"#000000\",fontSize:\"11px\",fontWeight:\"bold\",textOutline:\"1px contrast\"}},gridLineWidth:1,lineWidth:0},defaultLeftAxisOptions:{labels:{x:-15},title:{rotation:270}},defaultRightAxisOptions:{labels:{x:15},title:{rotation:90}},defaultBottomAxisOptions:{labels:{autoRotation:[-45],x:0},margin:15,title:{rotation:0}},defaultTopAxisOptions:{labels:{autoRotation:[-45],x:0},margin:15,\ntitle:{rotation:0}},init:function(d,b){var q=b.isX,c=this;c.chart=d;c.horiz=d.inverted&&!c.isZAxis?!q:q;c.isXAxis=q;c.coll=c.coll||(q?\"xAxis\":\"yAxis\");h(this,\"init\",{userOptions:b});c.opposite=b.opposite;c.side=b.side||(c.horiz?c.opposite?0:2:c.opposite?1:3);c.setOptions(b);var e=this.options,u=e.type;c.labelFormatter=e.labels.formatter||c.defaultLabelFormatter;c.userOptions=b;c.minPixelPadding=0;c.reversed=e.reversed;c.visible=!1!==e.visible;c.zoomEnabled=!1!==e.zoomEnabled;c.hasNames=\"category\"===\nu||!0===e.categories;c.categories=e.categories||c.hasNames;c.names||(c.names=[],c.names.keys={});c.plotLinesAndBandsGroups={};c.isLog=\"logarithmic\"===u;c.isDatetimeAxis=\"datetime\"===u;c.positiveValuesOnly=c.isLog&&!c.allowNegativeLog;c.isLinked=y(e.linkedTo);c.ticks={};c.labelEdge=[];c.minorTicks={};c.plotLinesAndBands=[];c.alternateBands={};c.len=0;c.minRange=c.userMinRange=e.minRange||e.maxZoom;c.range=e.range;c.offset=e.offset||0;c.stacks={};c.oldStacks={};c.stacksTouched=0;c.max=null;c.min=null;\nc.crosshair=B(e.crosshair,k(d.options.tooltip.crosshairs)[q?0:1],!1);b=c.options.events;-1===d.axes.indexOf(c)&&(q?d.axes.splice(d.xAxis.length,0,c):d.axes.push(c),d[c.coll].push(c));c.series=c.series||[];d.inverted&&!c.isZAxis&&q&&void 0===c.reversed&&(c.reversed=!0);w(b,function(d,q){a.isFunction(d)&&C(c,q,d)});c.lin2log=e.linearToLogConverter||c.lin2log;c.isLog&&(c.val2lin=c.log2lin,c.lin2val=c.lin2log);h(this,\"afterInit\")},setOptions:function(a){this.options=t(this.defaultOptions,\"yAxis\"===this.coll&&\nthis.defaultYAxisOptions,[this.defaultTopAxisOptions,this.defaultRightAxisOptions,this.defaultBottomAxisOptions,this.defaultLeftAxisOptions][this.side],t(x[this.coll],a));h(this,\"afterSetOptions\",{userOptions:a})},defaultLabelFormatter:function(){var d=this.axis,b=this.value,c=d.chart.time,k=d.categories,e=this.dateTimeLabelFormat,u=x.lang,l=u.numericSymbols,u=u.numericSymbolMagnitude||1E3,t=l&&l.length,p,h=d.options.labels.format,d=d.isLog?Math.abs(b):d.tickInterval;if(h)p=r(h,this,c);else if(k)p=\nb;else if(e)p=c.dateFormat(e,b);else if(t&&1E3<=d)for(;t--&&void 0===p;)c=Math.pow(u,t+1),d>=c&&0===10*b%c&&null!==l[t]&&0!==b&&(p=a.numberFormat(b/c,-1)+l[t]);void 0===p&&(p=1E4<=Math.abs(b)?a.numberFormat(b,-1):a.numberFormat(b,-1,void 0,\"\"));return p},getSeriesExtremes:function(){var a=this,d=a.chart,b;h(this,\"getSeriesExtremes\",null,function(){a.hasVisibleSeries=!1;a.dataMin=a.dataMax=a.threshold=null;a.softThreshold=!a.isXAxis;a.buildStacks&&a.buildStacks();a.series.forEach(function(q){if(q.visible||\n!d.options.chart.ignoreHiddenSeries){var c=q.options,k=c.threshold,e,u;a.hasVisibleSeries=!0;a.positiveValuesOnly&&0>=k&&(k=null);if(a.isXAxis)c=q.xData,c.length&&(b=q.getXExtremes(c),e=b.min,u=b.max,l(e)||e instanceof Date||(c=c.filter(l),b=q.getXExtremes(c),e=b.min,u=b.max),c.length&&(a.dataMin=Math.min(B(a.dataMin,e),e),a.dataMax=Math.max(B(a.dataMax,u),u)));else if(q.getExtremes(),u=q.dataMax,e=q.dataMin,y(e)&&y(u)&&(a.dataMin=Math.min(B(a.dataMin,e),e),a.dataMax=Math.max(B(a.dataMax,u),u)),y(k)&&\n(a.threshold=k),!c.softThreshold||a.positiveValuesOnly)a.softThreshold=!1}})});h(this,\"afterGetSeriesExtremes\")},translate:function(a,d,b,c,k,e){var q=this.linkedParent||this,u=1,t=0,p=c?q.oldTransA:q.transA;c=c?q.oldMin:q.min;var K=q.minPixelPadding;k=(q.isOrdinal||q.isBroken||q.isLog&&k)&&q.lin2val;p||(p=q.transA);b&&(u*=-1,t=q.len);q.reversed&&(u*=-1,t-=u*(q.sector||q.len));d?(a=(a*u+t-K)/p+c,k&&(a=q.lin2val(a))):(k&&(a=q.val2lin(a)),a=l(c)?u*(a-c)*p+t+u*K+(l(e)?p*e:0):void 0);return a},toPixels:function(a,\nd){return this.translate(a,!1,!this.horiz,null,!0)+(d?0:this.pos)},toValue:function(a,d){return this.translate(a-(d?0:this.pos),!0,!this.horiz,null,!0)},getPlotLinePath:function(a){var d=this,q=d.chart,b=d.left,c=d.top,k=a.old,e=a.value,u=a.translatedValue,t=a.lineWidth,p=a.force,f,w,r,D,G=k&&q.oldChartHeight||q.chartHeight,n=k&&q.oldChartWidth||q.chartWidth,g,F=d.transB,m=function(a,d,q){if(\"pass\"!==p&&a<d||a>q)p?a=Math.min(Math.max(d,a),q):g=!0;return a};a={value:e,lineWidth:t,old:k,force:p,acrossPanes:a.acrossPanes,\ntranslatedValue:u};h(this,\"getPlotLinePath\",a,function(a){u=B(u,d.translate(e,null,null,k));u=Math.min(Math.max(-1E5,u),1E5);f=r=Math.round(u+F);w=D=Math.round(G-u-F);l(u)?d.horiz?(w=c,D=G-d.bottom,f=r=m(f,b,b+d.width)):(f=b,r=n-d.right,w=D=m(w,c,c+d.height)):(g=!0,p=!1);a.path=g&&!p?null:q.renderer.crispLine([\"M\",f,w,\"L\",r,D],t||1)});return a.path},getLinearTickPositions:function(a,d,b){var q,c=v(Math.floor(d/a)*a);b=v(Math.ceil(b/a)*a);var k=[],e;v(c+a)===c&&(e=20);if(this.single)return[d];for(d=\nc;d<=b;){k.push(d);d=v(d+a,e);if(d===q)break;q=d}return k},getMinorTickInterval:function(){var a=this.options;return!0===a.minorTicks?B(a.minorTickInterval,\"auto\"):!1===a.minorTicks?null:a.minorTickInterval},getMinorTickPositions:function(){var a=this,d=a.options,b=a.tickPositions,c=a.minorTickInterval,k=[],e=a.pointRangePadding||0,u=a.min-e,e=a.max+e,l=e-u;if(l&&l/c<a.len/3)if(a.isLog)this.paddedTicks.forEach(function(d,q,b){q&&k.push.apply(k,a.getLogTickPositions(c,b[q-1],b[q],!0))});else if(a.isDatetimeAxis&&\n\"auto\"===this.getMinorTickInterval())k=k.concat(a.getTimeTicks(a.normalizeTimeTickInterval(c),u,e,d.startOfWeek));else for(d=u+(b[0]-u)%c;d<=e&&d!==k[0];d+=c)k.push(d);0!==k.length&&a.trimTicks(k);return k},adjustForMinRange:function(){var a=this.options,d=this.min,b=this.max,c,k,e,u,l,t,p,h;this.isXAxis&&void 0===this.minRange&&!this.isLog&&(y(a.min)||y(a.max)?this.minRange=null:(this.series.forEach(function(a){t=a.xData;for(u=p=a.xIncrement?1:t.length-1;0<u;u--)if(l=t[u]-t[u-1],void 0===e||l<e)e=\nl}),this.minRange=Math.min(5*e,this.dataMax-this.dataMin)));b-d<this.minRange&&(k=this.dataMax-this.dataMin>=this.minRange,h=this.minRange,c=(h-b+d)/2,c=[d-c,B(a.min,d-c)],k&&(c[2]=this.isLog?this.log2lin(this.dataMin):this.dataMin),d=E(c),b=[d+h,B(a.max,d+h)],k&&(b[2]=this.isLog?this.log2lin(this.dataMax):this.dataMax),b=m(b),b-d<h&&(c[0]=b-h,c[1]=B(a.min,b-h),d=E(c)));this.min=d;this.max=b},getClosest:function(){var a;this.categories?a=1:this.series.forEach(function(d){var b=d.closestPointRange,\nq=d.visible||!d.chart.options.chart.ignoreHiddenSeries;!d.noSharedTooltip&&y(b)&&q&&(a=y(a)?Math.min(a,b):b)});return a},nameToX:function(a){var d=b(this.categories),q=d?this.categories:this.names,c=a.options.x,k;a.series.requireSorting=!1;y(c)||(c=!1===this.options.uniqueNames?a.series.autoIncrement():d?q.indexOf(a.name):B(q.keys[a.name],-1));-1===c?d||(k=q.length):k=c;void 0!==k&&(this.names[k]=a.name,this.names.keys[a.name]=k);return k},updateNames:function(){var a=this,d=this.names;0<d.length&&\n(Object.keys(d.keys).forEach(function(a){delete d.keys[a]}),d.length=0,this.minRange=this.userMinRange,(this.series||[]).forEach(function(d){d.xIncrement=null;if(!d.points||d.isDirtyData)a.max=Math.max(a.max,d.xData.length-1),d.processData(),d.generatePoints();d.data.forEach(function(b,q){var c;b&&b.options&&void 0!==b.name&&(c=a.nameToX(b),void 0!==c&&c!==b.x&&(b.x=c,d.xData[q]=c))})}))},setAxisTranslation:function(a){var b=this,q=b.max-b.min,k=b.axisPointRange||0,e,u=0,l=0,t=b.linkedParent,p=!!b.categories,\nf=b.transA,w=b.isXAxis;if(w||p||k)e=b.getClosest(),t?(u=t.minPointOffset,l=t.pointRangePadding):b.series.forEach(function(a){var q=p?1:w?B(a.options.pointRange,e,0):b.axisPointRange||0,t=a.options.pointPlacement;k=Math.max(k,q);if(!b.single||p)a=d.xrange&&a instanceof d.xrange?!w:w,u=Math.max(u,a&&c(t)?0:q/2),l=Math.max(l,a&&\"on\"===t?0:q)}),t=b.ordinalSlope&&e?b.ordinalSlope/e:1,b.minPointOffset=u*=t,b.pointRangePadding=l*=t,b.pointRange=Math.min(k,q),w&&(b.closestPointRange=e);a&&(b.oldTransA=f);\nb.translationSlope=b.transA=f=b.staticScale||b.len/(q+l||1);b.transB=b.horiz?b.left:b.bottom;b.minPixelPadding=f*u;h(this,\"afterSetAxisTranslation\")},minFromRange:function(){return this.max-this.range},setTickInterval:function(d){var b=this,q=b.chart,c=b.options,k=b.isLog,u=b.isDatetimeAxis,t=b.isXAxis,p=b.isLinked,f=c.maxPadding,w=c.minPadding,r,D=c.tickInterval,G=c.tickPixelInterval,n=b.categories,g=l(b.threshold)?b.threshold:null,m=b.softThreshold,x,z,A;u||n||p||this.getTickAmount();z=B(b.userMin,\nc.min);A=B(b.userMax,c.max);p?(b.linkedParent=q[b.coll][c.linkedTo],r=b.linkedParent.getExtremes(),b.min=B(r.min,r.dataMin),b.max=B(r.max,r.dataMax),c.type!==b.linkedParent.options.type&&a.error(11,1,q)):(!m&&y(g)&&(b.dataMin>=g?(r=g,w=0):b.dataMax<=g&&(x=g,f=0)),b.min=B(z,r,b.dataMin),b.max=B(A,x,b.dataMax));k&&(b.positiveValuesOnly&&!d&&0>=Math.min(b.min,B(b.dataMin,b.min))&&a.error(10,1,q),b.min=v(b.log2lin(b.min),15),b.max=v(b.log2lin(b.max),15));b.range&&y(b.max)&&(b.userMin=b.min=z=Math.max(b.dataMin,\nb.minFromRange()),b.userMax=A=b.max,b.range=null);h(b,\"foundExtremes\");b.beforePadding&&b.beforePadding();b.adjustForMinRange();!(n||b.axisPointRange||b.usePercentage||p)&&y(b.min)&&y(b.max)&&(q=b.max-b.min)&&(!y(z)&&w&&(b.min-=q*w),!y(A)&&f&&(b.max+=q*f));l(c.softMin)&&!l(b.userMin)&&c.softMin<b.min&&(b.min=z=c.softMin);l(c.softMax)&&!l(b.userMax)&&c.softMax>b.max&&(b.max=A=c.softMax);l(c.floor)&&(b.min=Math.min(Math.max(b.min,c.floor),Number.MAX_VALUE));l(c.ceiling)&&(b.max=Math.max(Math.min(b.max,\nc.ceiling),B(b.userMax,-Number.MAX_VALUE)));m&&y(b.dataMin)&&(g=g||0,!y(z)&&b.min<g&&b.dataMin>=g?b.min=b.options.minRange?Math.min(g,b.max-b.minRange):g:!y(A)&&b.max>g&&b.dataMax<=g&&(b.max=b.options.minRange?Math.max(g,b.min+b.minRange):g));b.tickInterval=b.min===b.max||void 0===b.min||void 0===b.max?1:p&&!D&&G===b.linkedParent.options.tickPixelInterval?D=b.linkedParent.tickInterval:B(D,this.tickAmount?(b.max-b.min)/Math.max(this.tickAmount-1,1):void 0,n?1:(b.max-b.min)*G/Math.max(b.len,G));t&&\n!d&&b.series.forEach(function(a){a.processData(b.min!==b.oldMin||b.max!==b.oldMax)});b.setAxisTranslation(!0);b.beforeSetTickPositions&&b.beforeSetTickPositions();b.postProcessTickInterval&&(b.tickInterval=b.postProcessTickInterval(b.tickInterval));b.pointRange&&!D&&(b.tickInterval=Math.max(b.pointRange,b.tickInterval));d=B(c.minTickInterval,b.isDatetimeAxis&&b.closestPointRange);!D&&b.tickInterval<d&&(b.tickInterval=d);u||k||D||(b.tickInterval=F(b.tickInterval,null,e(b.tickInterval),B(c.allowDecimals,\n!(.5<b.tickInterval&&5>b.tickInterval&&1E3<b.max&&9999>b.max)),!!this.tickAmount));this.tickAmount||(b.tickInterval=b.unsquish());this.setTickPositions()},setTickPositions:function(){var d=this.options,b,c=d.tickPositions;b=this.getMinorTickInterval();var k=d.tickPositioner,e=d.startOnTick,u=d.endOnTick;this.tickmarkOffset=this.categories&&\"between\"===d.tickmarkPlacement&&1===this.tickInterval?.5:0;this.minorTickInterval=\"auto\"===b&&this.tickInterval?this.tickInterval/5:b;this.single=this.min===this.max&&\ny(this.min)&&!this.tickAmount&&(parseInt(this.min,10)===this.min||!1!==d.allowDecimals);this.tickPositions=b=c&&c.slice();!b&&(!this.ordinalPositions&&(this.max-this.min)/this.tickInterval>Math.max(2*this.len,200)?(b=[this.min,this.max],a.error(19,!1,this.chart)):b=this.isDatetimeAxis?this.getTimeTicks(this.normalizeTimeTickInterval(this.tickInterval,d.units),this.min,this.max,d.startOfWeek,this.ordinalPositions,this.closestPointRange,!0):this.isLog?this.getLogTickPositions(this.tickInterval,this.min,\nthis.max):this.getLinearTickPositions(this.tickInterval,this.min,this.max),b.length>this.len&&(b=[b[0],b.pop()],b[0]===b[1]&&(b.length=1)),this.tickPositions=b,k&&(k=k.apply(this,[this.min,this.max])))&&(this.tickPositions=b=k);this.paddedTicks=b.slice(0);this.trimTicks(b,e,u);this.isLinked||(this.single&&2>b.length&&!this.categories&&(this.min-=.5,this.max+=.5),c||k||this.adjustTickAmount());h(this,\"afterSetTickPositions\")},trimTicks:function(a,d,b){var q=a[0],c=a[a.length-1],k=this.minPointOffset||\n0;h(this,\"trimTicks\");if(!this.isLinked){if(d&&-Infinity!==q)this.min=q;else for(;this.min-k>a[0];)a.shift();if(b)this.max=c;else for(;this.max+k<a[a.length-1];)a.pop();0===a.length&&y(q)&&!this.options.tickPositions&&a.push((c+q)/2)}},alignToOthers:function(){var a={},d,b=this.options;!1===this.chart.options.chart.alignTicks||!1===b.alignTicks||!1===b.startOnTick||!1===b.endOnTick||this.isLog||this.chart[this.coll].forEach(function(b){var q=b.options,q=[b.horiz?q.left:q.top,q.width,q.height,q.pane].join();\nb.series.length&&(a[q]?d=!0:a[q]=1)});return d},getTickAmount:function(){var a=this.options,d=a.tickAmount,b=a.tickPixelInterval;!y(a.tickInterval)&&this.len<b&&!this.isRadial&&!this.isLog&&a.startOnTick&&a.endOnTick&&(d=2);!d&&this.alignToOthers()&&(d=Math.ceil(this.len/b)+1);4>d&&(this.finalTickAmt=d,d=5);this.tickAmount=d},adjustTickAmount:function(){var a=this.options,d=this.tickInterval,b=this.tickPositions,c=this.tickAmount,k=this.finalTickAmt,e=b&&b.length,u=B(this.threshold,this.softThreshold?\n0:null),l;if(this.hasData()){if(e<c){for(l=this.min;b.length<c;)b.length%2||l===u?b.push(v(b[b.length-1]+d)):b.unshift(v(b[0]-d));this.transA*=(e-1)/(c-1);this.min=a.startOnTick?b[0]:Math.min(this.min,b[0]);this.max=a.endOnTick?b[b.length-1]:Math.max(this.max,b[b.length-1])}else e>c&&(this.tickInterval*=2,this.setTickPositions());if(y(k)){for(d=a=b.length;d--;)(3===k&&1===d%2||2>=k&&0<d&&d<a-1)&&b.splice(d,1);this.finalTickAmt=void 0}}},setScale:function(){var a=this.series.some(function(a){return a.isDirtyData||\na.isDirty||a.xAxis.isDirty}),d;this.oldMin=this.min;this.oldMax=this.max;this.oldAxisLength=this.len;this.setAxisSize();(d=this.len!==this.oldAxisLength)||a||this.isLinked||this.forceRedraw||this.userMin!==this.oldUserMin||this.userMax!==this.oldUserMax||this.alignToOthers()?(this.resetStacks&&this.resetStacks(),this.forceRedraw=!1,this.getSeriesExtremes(),this.setTickInterval(),this.oldUserMin=this.userMin,this.oldUserMax=this.userMax,this.isDirty||(this.isDirty=d||this.min!==this.oldMin||this.max!==\nthis.oldMax)):this.cleanStacks&&this.cleanStacks();h(this,\"afterSetScale\")},setExtremes:function(a,d,b,c,k){var q=this,e=q.chart;b=B(b,!0);q.series.forEach(function(a){delete a.kdTree});k=f(k,{min:a,max:d});h(q,\"setExtremes\",k,function(){q.userMin=a;q.userMax=d;q.eventArgs=k;b&&e.redraw(c)})},zoom:function(a,d){var b=this.dataMin,q=this.dataMax,c=this.options,k=Math.min(b,B(c.min,b)),e=Math.max(q,B(c.max,q));a={newMin:a,newMax:d};h(this,\"zoom\",a,function(a){var d=a.newMin,c=a.newMax;if(d!==this.min||\nc!==this.max)this.allowZoomOutside||(y(b)&&(d<k&&(d=k),d>e&&(d=e)),y(q)&&(c<k&&(c=k),c>e&&(c=e))),this.displayBtn=void 0!==d||void 0!==c,this.setExtremes(d,c,!1,void 0,{trigger:\"zoom\"});a.zoomed=!0});return a.zoomed},setAxisSize:function(){var d=this.chart,b=this.options,c=b.offsets||[0,0,0,0],k=this.horiz,e=this.width=Math.round(a.relativeLength(B(b.width,d.plotWidth-c[3]+c[1]),d.plotWidth)),u=this.height=Math.round(a.relativeLength(B(b.height,d.plotHeight-c[0]+c[2]),d.plotHeight)),l=this.top=Math.round(a.relativeLength(B(b.top,\nd.plotTop+c[0]),d.plotHeight,d.plotTop)),b=this.left=Math.round(a.relativeLength(B(b.left,d.plotLeft+c[3]),d.plotWidth,d.plotLeft));this.bottom=d.chartHeight-u-l;this.right=d.chartWidth-e-b;this.len=Math.max(k?e:u,0);this.pos=k?b:l},getExtremes:function(){var a=this.isLog;return{min:a?v(this.lin2log(this.min)):this.min,max:a?v(this.lin2log(this.max)):this.max,dataMin:this.dataMin,dataMax:this.dataMax,userMin:this.userMin,userMax:this.userMax}},getThreshold:function(a){var d=this.isLog,b=d?this.lin2log(this.min):\nthis.min,d=d?this.lin2log(this.max):this.max;null===a||-Infinity===a?a=b:Infinity===a?a=d:b>a?a=b:d<a&&(a=d);return this.translate(a,0,1,0,1)},autoLabelAlign:function(a){var d=(B(a,0)-90*this.side+720)%360;a={align:\"center\"};h(this,\"autoLabelAlign\",a,function(a){15<d&&165>d?a.align=\"right\":195<d&&345>d&&(a.align=\"left\")});return a.align},tickSize:function(a){var d=this.options,b=d[a+\"Length\"],c=B(d[a+\"Width\"],\"tick\"===a&&this.isXAxis&&!this.categories?1:0),q;c&&b&&(\"inside\"===d[a+\"Position\"]&&(b=\n-b),q=[b,c]);a={tickSize:q};h(this,\"afterTickSize\",a);return a.tickSize},labelMetrics:function(){var a=this.tickPositions&&this.tickPositions[0]||0;return this.chart.renderer.fontMetrics(this.options.labels.style&&this.options.labels.style.fontSize,this.ticks[a]&&this.ticks[a].label)},unsquish:function(){var a=this.options.labels,d=this.horiz,b=this.tickInterval,c=b,k=this.len/(((this.categories?1:0)+this.max-this.min)/b),e,u=a.rotation,l=this.labelMetrics(),t,p=Number.MAX_VALUE,h,f=this.max-this.min,\nw=function(a){var d=a/(k||1),d=1<d?Math.ceil(d):1;d*b>f&&Infinity!==a&&Infinity!==k&&(d=Math.ceil(f/b));return v(d*b)};d?(h=!a.staggerLines&&!a.step&&(y(u)?[u]:k<B(a.autoRotationLimit,80)&&a.autoRotation))&&h.forEach(function(a){var d;if(a===u||a&&-90<=a&&90>=a)t=w(Math.abs(l.h/Math.sin(z*a))),d=t+Math.abs(a/360),d<p&&(p=d,e=a,c=t)}):a.step||(c=w(l.h));this.autoRotation=h;this.labelRotation=B(e,u);return c},getSlotWidth:function(a){var d=this.chart,b=this.horiz,c=this.options.labels,k=Math.max(this.tickPositions.length-\n(this.categories?0:1),1),q=d.margin[3];return a&&a.slotWidth||b&&2>(c.step||0)&&!c.rotation&&(this.staggerLines||1)*this.len/k||!b&&(c.style&&parseInt(c.style.width,10)||q&&q-d.spacing[3]||.33*d.chartWidth)},renderUnsquish:function(){var a=this.chart,d=a.renderer,b=this.tickPositions,k=this.ticks,e=this.options.labels,u=e&&e.style||{},l=this.horiz,t=this.getSlotWidth(),p=Math.max(1,Math.round(t-2*(e.padding||5))),h={},f=this.labelMetrics(),w=e.style&&e.style.textOverflow,r,D,G=0,g;c(e.rotation)||\n(h.rotation=e.rotation||0);b.forEach(function(a){(a=k[a])&&a.label&&a.label.textPxLength>G&&(G=a.label.textPxLength)});this.maxLabelLength=G;if(this.autoRotation)G>p&&G>f.h?h.rotation=this.labelRotation:this.labelRotation=0;else if(t&&(r=p,!w))for(D=\"clip\",p=b.length;!l&&p--;)if(g=b[p],g=k[g].label)g.styles&&\"ellipsis\"===g.styles.textOverflow?g.css({textOverflow:\"clip\"}):g.textPxLength>t&&g.css({width:t+\"px\"}),g.getBBox().height>this.len/b.length-(f.h-f.f)&&(g.specificTextOverflow=\"ellipsis\");h.rotation&&\n(r=G>.5*a.chartHeight?.33*a.chartHeight:G,w||(D=\"ellipsis\"));if(this.labelAlign=e.align||this.autoLabelAlign(this.labelRotation))h.align=this.labelAlign;b.forEach(function(a){var d=(a=k[a])&&a.label,b=u.width,c={};d&&(d.attr(h),a.shortenLabel?a.shortenLabel():r&&!b&&\"nowrap\"!==u.whiteSpace&&(r<d.textPxLength||\"SPAN\"===d.element.tagName)?(c.width=r,w||(c.textOverflow=d.specificTextOverflow||D),d.css(c)):d.styles&&d.styles.width&&!c.width&&!b&&d.css({width:null}),delete d.specificTextOverflow,a.rotation=\nh.rotation)},this);this.tickRotCorr=d.rotCorr(f.b,this.labelRotation||0,0!==this.side)},hasData:function(){return this.series.some(function(a){return a.hasData()})||this.options.showEmpty&&y(this.min)&&y(this.max)},addTitle:function(a){var d=this.chart.renderer,b=this.horiz,c=this.opposite,k=this.options.title,q,e=this.chart.styledMode;this.axisTitle||((q=k.textAlign)||(q=(b?{low:\"left\",middle:\"center\",high:\"right\"}:{low:c?\"right\":\"left\",middle:\"center\",high:c?\"left\":\"right\"})[k.align]),this.axisTitle=\nd.text(k.text,0,0,k.useHTML).attr({zIndex:7,rotation:k.rotation||0,align:q}).addClass(\"highcharts-axis-title\"),e||this.axisTitle.css(t(k.style)),this.axisTitle.add(this.axisGroup),this.axisTitle.isNew=!0);e||k.style.width||this.isRadial||this.axisTitle.css({width:this.len});this.axisTitle[a?\"show\":\"hide\"](!0)},generateTick:function(a){var d=this.ticks;d[a]?d[a].addLabel():d[a]=new D(this,a)},getOffset:function(){var a=this,d=a.chart,b=d.renderer,c=a.options,k=a.tickPositions,e=a.ticks,u=a.horiz,l=\na.side,t=d.inverted&&!a.isZAxis?[1,0,3,2][l]:l,p,f,r=0,D,G=0,g=c.title,n=c.labels,F=0,m=d.axisOffset,d=d.clipOffset,v=[-1,1,1,-1][l],x=c.className,z=a.axisParent;p=a.hasData();a.showAxis=f=p||B(c.showEmpty,!0);a.staggerLines=a.horiz&&n.staggerLines;a.axisGroup||(a.gridGroup=b.g(\"grid\").attr({zIndex:c.gridZIndex||1}).addClass(\"highcharts-\"+this.coll.toLowerCase()+\"-grid \"+(x||\"\")).add(z),a.axisGroup=b.g(\"axis\").attr({zIndex:c.zIndex||2}).addClass(\"highcharts-\"+this.coll.toLowerCase()+\" \"+(x||\"\")).add(z),\na.labelGroup=b.g(\"axis-labels\").attr({zIndex:n.zIndex||7}).addClass(\"highcharts-\"+a.coll.toLowerCase()+\"-labels \"+(x||\"\")).add(z));p||a.isLinked?(k.forEach(function(d,b){a.generateTick(d,b)}),a.renderUnsquish(),a.reserveSpaceDefault=0===l||2===l||{1:\"left\",3:\"right\"}[l]===a.labelAlign,B(n.reserveSpace,\"center\"===a.labelAlign?!0:null,a.reserveSpaceDefault)&&k.forEach(function(a){F=Math.max(e[a].getLabelSize(),F)}),a.staggerLines&&(F*=a.staggerLines),a.labelOffset=F*(a.opposite?-1:1)):w(e,function(a,\nd){a.destroy();delete e[d]});g&&g.text&&!1!==g.enabled&&(a.addTitle(f),f&&!1!==g.reserveSpace&&(a.titleOffset=r=a.axisTitle.getBBox()[u?\"height\":\"width\"],D=g.offset,G=y(D)?0:B(g.margin,u?5:10)));a.renderLine();a.offset=v*B(c.offset,m[l]?m[l]+(c.margin||0):0);a.tickRotCorr=a.tickRotCorr||{x:0,y:0};b=0===l?-a.labelMetrics().h:2===l?a.tickRotCorr.y:0;G=Math.abs(F)+G;F&&(G=G-b+v*(u?B(n.y,a.tickRotCorr.y+8*v):n.x));a.axisTitleMargin=B(D,G);a.getMaxLabelDimensions&&(a.maxLabelDimensions=a.getMaxLabelDimensions(e,\nk));u=this.tickSize(\"tick\");m[l]=Math.max(m[l],a.axisTitleMargin+r+v*a.offset,G,k&&k.length&&u?u[0]+v*a.offset:0);c=c.offset?0:2*Math.floor(a.axisLine.strokeWidth()/2);d[t]=Math.max(d[t],c);h(this,\"afterGetOffset\")},getLinePath:function(a){var d=this.chart,b=this.opposite,c=this.offset,k=this.horiz,e=this.left+(b?this.width:0)+c,c=d.chartHeight-this.bottom-(b?this.height:0)+c;b&&(a*=-1);return d.renderer.crispLine([\"M\",k?this.left:e,k?c:this.top,\"L\",k?d.chartWidth-this.right:e,k?c:d.chartHeight-this.bottom],\na)},renderLine:function(){this.axisLine||(this.axisLine=this.chart.renderer.path().addClass(\"highcharts-axis-line\").add(this.axisGroup),this.chart.styledMode||this.axisLine.attr({stroke:this.options.lineColor,\"stroke-width\":this.options.lineWidth,zIndex:7}))},getTitlePosition:function(){var a=this.horiz,d=this.left,b=this.top,c=this.len,k=this.options.title,e=a?d:b,u=this.opposite,l=this.offset,t=k.x||0,p=k.y||0,f=this.axisTitle,w=this.chart.renderer.fontMetrics(k.style&&k.style.fontSize,f),f=Math.max(f.getBBox(null,\n0).height-w.h-1,0),c={low:e+(a?0:c),middle:e+c/2,high:e+(a?c:0)}[k.align],d=(a?b+this.height:d)+(a?1:-1)*(u?-1:1)*this.axisTitleMargin+[-f,f,w.f,-f][this.side],a={x:a?c+t:d+(u?this.width:0)+l+t,y:a?d+p-(u?this.height:0)+l:c+p};h(this,\"afterGetTitlePosition\",{titlePosition:a});return a},renderMinorTick:function(a){var d=this.chart.hasRendered&&l(this.oldMin),b=this.minorTicks;b[a]||(b[a]=new D(this,a,\"minor\"));d&&b[a].isNew&&b[a].render(null,!0);b[a].render(null,!1,1)},renderTick:function(a,d){var b=\nthis.isLinked,c=this.ticks,k=this.chart.hasRendered&&l(this.oldMin);if(!b||a>=this.min&&a<=this.max)c[a]||(c[a]=new D(this,a)),k&&c[a].isNew&&c[a].render(d,!0,-1),c[a].render(d)},render:function(){var d=this,b=d.chart,c=d.options,k=d.isLog,e=d.isLinked,t=d.tickPositions,p=d.axisTitle,f=d.ticks,r=d.minorTicks,G=d.alternateBands,g=c.stackLabels,n=c.alternateGridColor,F=d.tickmarkOffset,B=d.axisLine,m=d.showAxis,v=A(b.renderer.globalAnimation),x,z;d.labelEdge.length=0;d.overlap=!1;[f,r,G].forEach(function(a){w(a,\nfunction(a){a.isActive=!1})});if(d.hasData()||e)d.minorTickInterval&&!d.categories&&d.getMinorTickPositions().forEach(function(a){d.renderMinorTick(a)}),t.length&&(t.forEach(function(a,b){d.renderTick(a,b)}),F&&(0===d.min||d.single)&&(f[-1]||(f[-1]=new D(d,-1,null,!0)),f[-1].render(-1))),n&&t.forEach(function(c,e){z=void 0!==t[e+1]?t[e+1]+F:d.max-F;0===e%2&&c<d.max&&z<=d.max+(b.polar?-F:F)&&(G[c]||(G[c]=new a.PlotLineOrBand(d)),x=c+F,G[c].options={from:k?d.lin2log(x):x,to:k?d.lin2log(z):z,color:n},\nG[c].render(),G[c].isActive=!0)}),d._addedPlotLB||((c.plotLines||[]).concat(c.plotBands||[]).forEach(function(a){d.addPlotBandOrLine(a)}),d._addedPlotLB=!0);[f,r,G].forEach(function(a){var d,c=[],k=v.duration;w(a,function(a,d){a.isActive||(a.render(d,!1,0),a.isActive=!1,c.push(d))});u(function(){for(d=c.length;d--;)a[c[d]]&&!a[c[d]].isActive&&(a[c[d]].destroy(),delete a[c[d]])},a!==G&&b.hasRendered&&k?k:0)});B&&(B[B.isPlaced?\"animate\":\"attr\"]({d:this.getLinePath(B.strokeWidth())}),B.isPlaced=!0,B[m?\n\"show\":\"hide\"](!0));p&&m&&(c=d.getTitlePosition(),l(c.y)?(p[p.isNew?\"attr\":\"animate\"](c),p.isNew=!1):(p.attr(\"y\",-9999),p.isNew=!0));g&&g.enabled&&d.renderStackTotals();d.isDirty=!1;h(this,\"afterRender\")},redraw:function(){this.visible&&(this.render(),this.plotLinesAndBands.forEach(function(a){a.render()}));this.series.forEach(function(a){a.isDirty=!0})},keepProps:\"extKey hcEvents names series userMax userMin\".split(\" \"),destroy:function(a){var d=this,b=d.stacks,c=d.plotLinesAndBands,k;h(this,\"destroy\",\n{keepEvents:a});a||p(d);w(b,function(a,d){n(a);b[d]=null});[d.ticks,d.minorTicks,d.alternateBands].forEach(function(a){n(a)});if(c)for(a=c.length;a--;)c[a].destroy();\"stackTotalGroup axisLine axisTitle axisGroup gridGroup labelGroup cross scrollbar\".split(\" \").forEach(function(a){d[a]&&(d[a]=d[a].destroy())});for(k in d.plotLinesAndBandsGroups)d.plotLinesAndBandsGroups[k]=d.plotLinesAndBandsGroups[k].destroy();w(d,function(a,b){-1===d.keepProps.indexOf(b)&&delete d[b]})},drawCrosshair:function(a,\nd){var b,c=this.crosshair,k=B(c.snap,!0),e,u=this.cross;h(this,\"drawCrosshair\",{e:a,point:d});a||(a=this.cross&&this.cross.e);if(this.crosshair&&!1!==(y(d)||!k)){k?y(d)&&(e=B(d.crosshairPos,this.isXAxis?d.plotX:this.len-d.plotY)):e=a&&(this.horiz?a.chartX-this.pos:this.len-a.chartY+this.pos);y(e)&&(b=this.getPlotLinePath({value:d&&(this.isXAxis?d.x:B(d.stackY,d.y)),translatedValue:e})||null);if(!y(b)){this.hideCrosshair();return}k=this.categories&&!this.isRadial;u||(this.cross=u=this.chart.renderer.path().addClass(\"highcharts-crosshair highcharts-crosshair-\"+\n(k?\"category \":\"thin \")+c.className).attr({zIndex:B(c.zIndex,2)}).add(),this.chart.styledMode||(u.attr({stroke:c.color||(k?g(\"#ccd6eb\").setOpacity(.25).get():\"#cccccc\"),\"stroke-width\":B(c.width,1)}).css({\"pointer-events\":\"none\"}),c.dashStyle&&u.attr({dashstyle:c.dashStyle})));u.show().attr({d:b});k&&!c.width&&u.attr({\"stroke-width\":this.transA});this.cross.e=a}else this.hideCrosshair();h(this,\"afterDrawCrosshair\",{e:a,point:d})},hideCrosshair:function(){this.cross&&this.cross.hide();h(this,\"afterHideCrosshair\")}});\nreturn a.Axis=G});I(H,\"parts/DateTimeAxis.js\",[H[\"parts/Globals.js\"]],function(a){var C=a.Axis,A=a.getMagnitude,E=a.normalizeTickInterval,m=a.timeUnits;C.prototype.getTimeTicks=function(){return this.chart.time.getTimeTicks.apply(this.chart.time,arguments)};C.prototype.normalizeTimeTickInterval=function(a,v){var g=v||[[\"millisecond\",[1,2,5,10,20,25,50,100,200,500]],[\"second\",[1,2,5,10,15,30]],[\"minute\",[1,2,5,10,15,30]],[\"hour\",[1,2,3,4,6,8,12]],[\"day\",[1,2]],[\"week\",[1,2]],[\"month\",[1,2,3,4,6]],\n[\"year\",null]];v=g[g.length-1];var y=m[v[0]],z=v[1],n;for(n=0;n<g.length&&!(v=g[n],y=m[v[0]],z=v[1],g[n+1]&&a<=(y*z[z.length-1]+m[g[n+1][0]])/2);n++);y===m.year&&a<5*y&&(z=[1,2,5]);a=E(a/y,z,\"year\"===v[0]?Math.max(A(a/y),1):1);return{unitRange:y,count:a,unitName:v[0]}}});I(H,\"parts/LogarithmicAxis.js\",[H[\"parts/Globals.js\"]],function(a){var C=a.Axis,A=a.getMagnitude,E=a.normalizeTickInterval,m=a.pick;C.prototype.getLogTickPositions=function(a,v,x,y){var g=this.options,n=this.len,f=[];y||(this._minorAutoInterval=\nnull);if(.5<=a)a=Math.round(a),f=this.getLinearTickPositions(a,v,x);else if(.08<=a)for(var n=Math.floor(v),h,r,e,b,l,g=.3<a?[1,2,4]:.15<a?[1,2,4,6,8]:[1,2,3,4,5,6,7,8,9];n<x+1&&!l;n++)for(r=g.length,h=0;h<r&&!l;h++)e=this.log2lin(this.lin2log(n)*g[h]),e>v&&(!y||b<=x)&&void 0!==b&&f.push(b),b>x&&(l=!0),b=e;else v=this.lin2log(v),x=this.lin2log(x),a=y?this.getMinorTickInterval():g.tickInterval,a=m(\"auto\"===a?null:a,this._minorAutoInterval,g.tickPixelInterval/(y?5:1)*(x-v)/((y?n/this.tickPositions.length:\nn)||1)),a=E(a,null,A(a)),f=this.getLinearTickPositions(a,v,x).map(this.log2lin),y||(this._minorAutoInterval=a/5);y||(this.tickInterval=a);return f};C.prototype.log2lin=function(a){return Math.log(a)/Math.LN10};C.prototype.lin2log=function(a){return Math.pow(10,a)}});I(H,\"parts/PlotLineOrBand.js\",[H[\"parts/Globals.js\"],H[\"parts/Axis.js\"]],function(a,C){var A=a.arrayMax,E=a.arrayMin,m=a.defined,g=a.destroyObjectProperties,v=a.erase,x=a.merge,y=a.pick;a.PlotLineOrBand=function(a,n){this.axis=a;n&&(this.options=\nn,this.id=n.id)};a.PlotLineOrBand.prototype={render:function(){a.fireEvent(this,\"render\");var g=this,n=g.axis,f=n.horiz,h=g.options,r=h.label,e=g.label,b=h.to,l=h.from,c=h.value,t=m(l)&&m(b),F=m(c),w=g.svgElem,B=!w,p=[],d=h.color,k=y(h.zIndex,0),u=h.events,p={\"class\":\"highcharts-plot-\"+(t?\"band \":\"line \")+(h.className||\"\")},D={},G=n.chart.renderer,q=t?\"bands\":\"lines\";n.isLog&&(l=n.log2lin(l),b=n.log2lin(b),c=n.log2lin(c));n.chart.styledMode||(F?(p.stroke=d,p[\"stroke-width\"]=h.width,h.dashStyle&&(p.dashstyle=\nh.dashStyle)):t&&(d&&(p.fill=d),h.borderWidth&&(p.stroke=h.borderColor,p[\"stroke-width\"]=h.borderWidth)));D.zIndex=k;q+=\"-\"+k;(d=n.plotLinesAndBandsGroups[q])||(n.plotLinesAndBandsGroups[q]=d=G.g(\"plot-\"+q).attr(D).add());B&&(g.svgElem=w=G.path().attr(p).add(d));if(F)p=n.getPlotLinePath({value:c,lineWidth:w.strokeWidth(),acrossPanes:h.acrossPanes});else if(t)p=n.getPlotBandPath(l,b,h);else return;(B||!w.d)&&p&&p.length?(w.attr({d:p}),u&&a.objectEach(u,function(a,d){w.on(d,function(a){u[d].apply(g,\n[a])})})):w&&(p?(w.show(!0),w.animate({d:p})):w.d&&(w.hide(),e&&(g.label=e=e.destroy())));r&&m(r.text)&&p&&p.length&&0<n.width&&0<n.height&&!p.isFlat?(r=x({align:f&&t&&\"center\",x:f?!t&&4:10,verticalAlign:!f&&t&&\"middle\",y:f?t?16:10:t?6:-4,rotation:f&&!t&&90},r),this.renderLabel(r,p,t,k)):e&&e.hide();return g},renderLabel:function(a,g,f,h){var r=this.label,e=this.axis.chart.renderer;r||(r={align:a.textAlign||a.align,rotation:a.rotation,\"class\":\"highcharts-plot-\"+(f?\"band\":\"line\")+\"-label \"+(a.className||\n\"\")},r.zIndex=h,this.label=r=e.text(a.text,0,0,a.useHTML).attr(r).add(),this.axis.chart.styledMode||r.css(a.style));h=g.xBounds||[g[1],g[4],f?g[6]:g[1]];g=g.yBounds||[g[2],g[5],f?g[7]:g[2]];f=E(h);e=E(g);r.align(a,!1,{x:f,y:e,width:A(h)-f,height:A(g)-e});r.show(!0)},destroy:function(){v(this.axis.plotLinesAndBands,this);delete this.axis;g(this)}};a.extend(C.prototype,{getPlotBandPath:function(a,g){var f=this.getPlotLinePath({value:g,force:!0,acrossPanes:this.options.acrossPanes}),h=this.getPlotLinePath({value:a,\nforce:!0,acrossPanes:this.options.acrossPanes}),r=[],e=this.horiz,b=1,l;a=a<this.min&&g<this.min||a>this.max&&g>this.max;if(h&&f)for(a&&(l=h.toString()===f.toString(),b=0),a=0;a<h.length;a+=6)e&&f[a+1]===h[a+1]?(f[a+1]+=b,f[a+4]+=b):e||f[a+2]!==h[a+2]||(f[a+2]+=b,f[a+5]+=b),r.push(\"M\",h[a+1],h[a+2],\"L\",h[a+4],h[a+5],f[a+4],f[a+5],f[a+1],f[a+2],\"z\"),r.isFlat=l;return r},addPlotBand:function(a){return this.addPlotBandOrLine(a,\"plotBands\")},addPlotLine:function(a){return this.addPlotBandOrLine(a,\"plotLines\")},\naddPlotBandOrLine:function(g,n){var f=(new a.PlotLineOrBand(this,g)).render(),h=this.userOptions;f&&(n&&(h[n]=h[n]||[],h[n].push(g)),this.plotLinesAndBands.push(f));return f},removePlotBandOrLine:function(a){for(var g=this.plotLinesAndBands,f=this.options,h=this.userOptions,r=g.length;r--;)g[r].id===a&&g[r].destroy();[f.plotLines||[],h.plotLines||[],f.plotBands||[],h.plotBands||[]].forEach(function(e){for(r=e.length;r--;)e[r].id===a&&v(e,e[r])})},removePlotBand:function(a){this.removePlotBandOrLine(a)},\nremovePlotLine:function(a){this.removePlotBandOrLine(a)}})});I(H,\"parts/Tooltip.js\",[H[\"parts/Globals.js\"]],function(a){var C=a.doc,A=a.extend,E=a.format,m=a.isNumber,g=a.merge,v=a.pick,x=a.splat,y=a.syncTimeout,z=a.timeUnits;a.Tooltip=function(){this.init.apply(this,arguments)};a.Tooltip.prototype={init:function(a,f){this.chart=a;this.options=f;this.crosshairs=[];this.now={x:0,y:0};this.isHidden=!0;this.split=f.split&&!a.inverted;this.shared=f.shared||this.split;this.outside=v(f.outside,!(!a.scrollablePixelsX&&\n!a.scrollablePixelsY))&&!this.split},cleanSplit:function(a){this.chart.series.forEach(function(f){var h=f&&f.tt;h&&(!h.isActive||a?f.tt=h.destroy():h.isActive=!1)})},applyFilter:function(){var a=this.chart;a.renderer.definition({tagName:\"filter\",id:\"drop-shadow-\"+a.index,opacity:.5,children:[{tagName:\"feGaussianBlur\",\"in\":\"SourceAlpha\",stdDeviation:1},{tagName:\"feOffset\",dx:1,dy:1},{tagName:\"feComponentTransfer\",children:[{tagName:\"feFuncA\",type:\"linear\",slope:.3}]},{tagName:\"feMerge\",children:[{tagName:\"feMergeNode\"},\n{tagName:\"feMergeNode\",\"in\":\"SourceGraphic\"}]}]});a.renderer.definition({tagName:\"style\",textContent:\".highcharts-tooltip-\"+a.index+\"{filter:url(#drop-shadow-\"+a.index+\")}\"})},getLabel:function(){var g=this,f=this.chart.renderer,h=this.chart.styledMode,r=this.options,e,b;this.label||(this.outside&&(this.container=e=a.doc.createElement(\"div\"),e.className=\"highcharts-tooltip-container\",a.css(e,{position:\"absolute\",top:\"1px\",pointerEvents:r.style&&r.style.pointerEvents,zIndex:3}),a.doc.body.appendChild(e),\nthis.renderer=f=new a.Renderer(e,0,0)),this.split?this.label=f.g(\"tooltip\"):(this.label=f.label(\"\",0,0,r.shape||\"callout\",null,null,r.useHTML,null,\"tooltip\").attr({padding:r.padding,r:r.borderRadius}),h||this.label.attr({fill:r.backgroundColor,\"stroke-width\":r.borderWidth}).css(r.style).shadow(r.shadow)),h&&(this.applyFilter(),this.label.addClass(\"highcharts-tooltip-\"+this.chart.index)),this.outside&&(b={x:this.label.xSetter,y:this.label.ySetter},this.label.xSetter=function(a,c){b[c].call(this.label,\ng.distance);e.style.left=a+\"px\"},this.label.ySetter=function(a,c){b[c].call(this.label,g.distance);e.style.top=a+\"px\"}),this.label.attr({zIndex:8}).add());return this.label},update:function(a){this.destroy();g(!0,this.chart.options.tooltip.userOptions,a);this.init(this.chart,g(!0,this.options,a))},destroy:function(){this.label&&(this.label=this.label.destroy());this.split&&this.tt&&(this.cleanSplit(this.chart,!0),this.tt=this.tt.destroy());this.renderer&&(this.renderer=this.renderer.destroy(),a.discardElement(this.container));\na.clearTimeout(this.hideTimer);a.clearTimeout(this.tooltipTimeout)},move:function(g,f,h,r){var e=this,b=e.now,l=!1!==e.options.animation&&!e.isHidden&&(1<Math.abs(g-b.x)||1<Math.abs(f-b.y)),c=e.followPointer||1<e.len;A(b,{x:l?(2*b.x+g)/3:g,y:l?(b.y+f)/2:f,anchorX:c?void 0:l?(2*b.anchorX+h)/3:h,anchorY:c?void 0:l?(b.anchorY+r)/2:r});e.getLabel().attr(b);l&&(a.clearTimeout(this.tooltipTimeout),this.tooltipTimeout=setTimeout(function(){e&&e.move(g,f,h,r)},32))},hide:function(g){var f=this;a.clearTimeout(this.hideTimer);\ng=v(g,this.options.hideDelay,500);this.isHidden||(this.hideTimer=y(function(){f.getLabel()[g?\"fadeOut\":\"hide\"]();f.isHidden=!0},g))},getAnchor:function(a,f){var h=this.chart,r=h.pointer,e=h.inverted,b=h.plotTop,l=h.plotLeft,c=0,t=0,g,w;a=x(a);this.followPointer&&f?(void 0===f.chartX&&(f=r.normalize(f)),a=[f.chartX-h.plotLeft,f.chartY-b]):a[0].tooltipPos?a=a[0].tooltipPos:(a.forEach(function(a){g=a.series.yAxis;w=a.series.xAxis;c+=a.plotX+(!e&&w?w.left-l:0);t+=(a.plotLow?(a.plotLow+a.plotHigh)/2:a.plotY)+\n(!e&&g?g.top-b:0)}),c/=a.length,t/=a.length,a=[e?h.plotWidth-t:c,this.shared&&!e&&1<a.length&&f?f.chartY-b:e?h.plotHeight-c:t]);return a.map(Math.round)},getPosition:function(a,f,h){var r=this.chart,e=this.distance,b={},l=r.inverted&&h.h||0,c,t=this.outside,g=t?C.documentElement.clientWidth-2*e:r.chartWidth,w=t?Math.max(C.body.scrollHeight,C.documentElement.scrollHeight,C.body.offsetHeight,C.documentElement.offsetHeight,C.documentElement.clientHeight):r.chartHeight,n=r.pointer.chartPosition,p=[\"y\",\nw,f,(t?n.top-e:0)+h.plotY+r.plotTop,t?0:r.plotTop,t?w:r.plotTop+r.plotHeight],d=[\"x\",g,a,(t?n.left-e:0)+h.plotX+r.plotLeft,t?0:r.plotLeft,t?g:r.plotLeft+r.plotWidth],k=!this.followPointer&&v(h.ttBelow,!r.inverted===!!h.negative),u=function(a,d,c,u,q,t){var p=c<u-e,h=u+e+c<d,f=u-e-c;u+=e;if(k&&h)b[a]=u;else if(!k&&p)b[a]=f;else if(p)b[a]=Math.min(t-c,0>f-l?f:f-l);else if(h)b[a]=Math.max(q,u+l+c>d?u:u+l);else return!1},D=function(a,d,c,k){var u;k<e||k>d-e?u=!1:b[a]=k<c/2?1:k>d-c/2?d-c-2:k-c/2;return u},\nG=function(a){var b=p;p=d;d=b;c=a},q=function(){!1!==u.apply(0,p)?!1!==D.apply(0,d)||c||(G(!0),q()):c?b.x=b.y=0:(G(!0),q())};(r.inverted||1<this.len)&&G();q();return b},defaultFormatter:function(a){var f=this.points||x(this),h;h=[a.tooltipFooterHeaderFormatter(f[0])];h=h.concat(a.bodyFormatter(f));h.push(a.tooltipFooterHeaderFormatter(f[0],!0));return h},refresh:function(g,f){var h=this.chart,r=this.options,e,b=g,l,c={},t,n=[];t=r.formatter||this.defaultFormatter;var c=this.shared,w=h.styledMode,\nB=[];r.enabled&&(a.clearTimeout(this.hideTimer),this.followPointer=x(b)[0].series.tooltipOptions.followPointer,l=this.getAnchor(b,f),f=l[0],e=l[1],!c||b.series&&b.series.noSharedTooltip?c=b.getLabelConfig():(B=h.pointer.getActiveSeries(b),h.series.forEach(function(a){(a.options.inactiveOtherPoints||-1===B.indexOf(a))&&a.setState(\"inactive\",!0)}),b.forEach(function(a){a.setState(\"hover\");n.push(a.getLabelConfig())}),c={x:b[0].category,y:b[0].y},c.points=n,b=b[0]),this.len=n.length,t=t.call(c,this),\nc=b.series,this.distance=v(c.tooltipOptions.distance,16),!1===t?this.hide():(h=this.getLabel(),this.isHidden&&h.attr({opacity:1}).show(),this.split?this.renderSplit(t,x(g)):(r.style.width&&!w||h.css({width:this.chart.spacingBox.width}),h.attr({text:t&&t.join?t.join(\"\"):t}),h.removeClass(/highcharts-color-[\\d]+/g).addClass(\"highcharts-color-\"+v(b.colorIndex,c.colorIndex)),w||h.attr({stroke:r.borderColor||b.color||c.color||\"#666666\"}),this.updatePosition({plotX:f,plotY:e,negative:b.negative,ttBelow:b.ttBelow,\nh:l[2]||0})),this.isHidden=!1),a.fireEvent(this,\"refresh\"))},renderSplit:function(g,f){var h=this,r=[],e=this.chart,b=e.renderer,l=!0,c=this.options,t=0,n,w=this.getLabel(),B=e.plotTop;a.isString(g)&&(g=[!1,g]);g.slice(0,f.length+1).forEach(function(a,d){if(!1!==a&&\"\"!==a){d=f[d-1]||{isHeader:!0,plotX:f[0].plotX,plotY:e.plotHeight};var k=d.series||h,u=k.tt,p=d.series||{},g=\"highcharts-color-\"+v(d.colorIndex,p.colorIndex,\"none\");u||(u={padding:c.padding,r:c.borderRadius},e.styledMode||(u.fill=c.backgroundColor,\nu[\"stroke-width\"]=c.borderWidth),k.tt=u=b.label(null,null,null,(d.isHeader?c.headerShape:c.shape)||\"callout\",null,null,c.useHTML).addClass(\"highcharts-tooltip-box \"+g).attr(u).add(w));u.isActive=!0;u.attr({text:a});e.styledMode||u.css(c.style).shadow(c.shadow).attr({stroke:c.borderColor||d.color||p.color||\"#333333\"});a=u.getBBox();p=a.width+u.strokeWidth();d.isHeader?(t=a.height,e.xAxis[0].opposite&&(n=!0,B-=t),p=Math.max(0,Math.min(d.plotX+e.plotLeft-p/2,e.chartWidth+(e.scrollablePixelsX?e.scrollablePixelsX-\ne.marginRight:0)-p))):p=d.plotX+e.plotLeft-v(c.distance,16)-p;0>p&&(l=!1);a=(d.series&&d.series.yAxis&&d.series.yAxis.pos)+(d.plotY||0);a-=B;d.isHeader&&(a=n?-t:e.plotHeight+t);r.push({target:a,rank:d.isHeader?1:0,size:k.tt.getBBox().height+1,point:d,x:p,tt:u})}});this.cleanSplit();c.positioner&&r.forEach(function(a){var d=c.positioner.call(h,a.tt.getBBox().width,a.size,a.point);a.x=d.x;a.align=0;a.target=d.y;a.rank=v(d.rank,a.rank)});a.distribute(r,e.plotHeight+t);r.forEach(function(a){var d=a.point,\nb=d.series;a.tt.attr({visibility:void 0===a.pos?\"hidden\":\"inherit\",x:l||d.isHeader||c.positioner?a.x:d.plotX+e.plotLeft+h.distance,y:a.pos+B,anchorX:d.isHeader?d.plotX+e.plotLeft:d.plotX+b.xAxis.pos,anchorY:d.isHeader?e.plotTop+e.plotHeight/2:d.plotY+b.yAxis.pos})})},updatePosition:function(a){var f=this.chart,h=this.getLabel(),r=(this.options.positioner||this.getPosition).call(this,h.width,h.height,a),e=a.plotX+f.plotLeft;a=a.plotY+f.plotTop;var b;this.outside&&(b=(this.options.borderWidth||0)+2*\nthis.distance,this.renderer.setSize(h.width+b,h.height+b,!1),e+=f.pointer.chartPosition.left-r.x,a+=f.pointer.chartPosition.top-r.y);this.move(Math.round(r.x),Math.round(r.y||0),e,a)},getDateFormat:function(a,f,h,r){var e=this.chart.time,b=e.dateFormat(\"%m-%d %H:%M:%S.%L\",f),l,c,t={millisecond:15,second:12,minute:9,hour:6,day:3},g=\"millisecond\";for(c in z){if(a===z.week&&+e.dateFormat(\"%w\",f)===h&&\"00:00:00.000\"===b.substr(6)){c=\"week\";break}if(z[c]>a){c=g;break}if(t[c]&&b.substr(t[c])!==\"01-01 00:00:00.000\".substr(t[c]))break;\n\"week\"!==c&&(g=c)}c&&(l=e.resolveDTLFormat(r[c]).main);return l},getXDateFormat:function(a,f,h){f=f.dateTimeLabelFormats;var r=h&&h.closestPointRange;return(r?this.getDateFormat(r,a.x,h.options.startOfWeek,f):f.day)||f.year},tooltipFooterHeaderFormatter:function(g,f){var h=f?\"footer\":\"header\",r=g.series,e=r.tooltipOptions,b=e.xDateFormat,l=r.xAxis,c=l&&\"datetime\"===l.options.type&&m(g.key),t=e[h+\"Format\"];f={isFooter:f,labelConfig:g};a.fireEvent(this,\"headerFormatter\",f,function(a){c&&!b&&(b=this.getXDateFormat(g,\ne,l));c&&b&&(g.point&&g.point.tooltipDateKeys||[\"key\"]).forEach(function(a){t=t.replace(\"{point.\"+a+\"}\",\"{point.\"+a+\":\"+b+\"}\")});r.chart.styledMode&&(t=this.styledModeFormat(t));a.text=E(t,{point:g,series:r},this.chart.time)});return f.text},bodyFormatter:function(a){return a.map(function(a){var h=a.series.tooltipOptions;return(h[(a.point.formatPrefix||\"point\")+\"Formatter\"]||a.point.tooltipFormatter).call(a.point,h[(a.point.formatPrefix||\"point\")+\"Format\"]||\"\")})},styledModeFormat:function(a){return a.replace('style\\x3d\"font-size: 10px\"',\n'class\\x3d\"highcharts-header\"').replace(/style=\"color:{(point|series)\\.color}\"/g,'class\\x3d\"highcharts-color-{$1.colorIndex}\"')}}});I(H,\"parts/Pointer.js\",[H[\"parts/Globals.js\"]],function(a){var C=a.addEvent,A=a.attr,E=a.charts,m=a.color,g=a.css,v=a.defined,x=a.extend,y=a.find,z=a.fireEvent,n=a.isNumber,f=a.isObject,h=a.offset,r=a.pick,e=a.splat,b=a.Tooltip;a.Pointer=function(a,b){this.init(a,b)};a.Pointer.prototype={init:function(a,c){this.options=c;this.chart=a;this.runChartClick=c.chart.events&&\n!!c.chart.events.click;this.pinchDown=[];this.lastValidTouch={};b&&(a.tooltip=new b(a,c.tooltip),this.followTouchMove=r(c.tooltip.followTouchMove,!0));this.setDOMEvents()},zoomOption:function(a){var b=this.chart,e=b.options.chart,l=e.zoomType||\"\",b=b.inverted;/touch/.test(a.type)&&(l=r(e.pinchType,l));this.zoomX=a=/x/.test(l);this.zoomY=l=/y/.test(l);this.zoomHor=a&&!b||l&&b;this.zoomVert=l&&!b||a&&b;this.hasZoom=a||l},normalize:function(a,b){var c;c=a.touches?a.touches.length?a.touches.item(0):a.changedTouches[0]:\na;b||(this.chartPosition=b=h(this.chart.container));return x(a,{chartX:Math.round(c.pageX-b.left),chartY:Math.round(c.pageY-b.top)})},getCoordinates:function(a){var b={xAxis:[],yAxis:[]};this.chart.axes.forEach(function(c){b[c.isXAxis?\"xAxis\":\"yAxis\"].push({axis:c,value:c.toValue(a[c.horiz?\"chartX\":\"chartY\"])})});return b},findNearestKDPoint:function(a,b,e){var c;a.forEach(function(a){var l=!(a.noSharedTooltip&&b)&&0>a.options.findNearestPointBy.indexOf(\"y\");a=a.searchPoint(e,l);if((l=f(a,!0))&&!(l=\n!f(c,!0)))var l=c.distX-a.distX,t=c.dist-a.dist,d=(a.series.group&&a.series.group.zIndex)-(c.series.group&&c.series.group.zIndex),l=0<(0!==l&&b?l:0!==t?t:0!==d?d:c.series.index>a.series.index?-1:1);l&&(c=a)});return c},getPointFromEvent:function(a){a=a.target;for(var b;a&&!b;)b=a.point,a=a.parentNode;return b},getChartCoordinatesFromPoint:function(a,b){var c=a.series,e=c.xAxis,c=c.yAxis,l=r(a.clientX,a.plotX),h=a.shapeArgs;if(e&&c)return b?{chartX:e.len+e.pos-l,chartY:c.len+c.pos-a.plotY}:{chartX:l+\ne.pos,chartY:a.plotY+c.pos};if(h&&h.x&&h.y)return{chartX:h.x,chartY:h.y}},getHoverData:function(a,b,e,h,w,g){var c,d=[];h=!(!h||!a);var k=b&&!b.stickyTracking?[b]:e.filter(function(a){return a.visible&&!(!w&&a.directTouch)&&r(a.options.enableMouseTracking,!0)&&a.stickyTracking});b=(c=h?a:this.findNearestKDPoint(k,w,g))&&c.series;c&&(w&&!b.noSharedTooltip?(k=e.filter(function(a){return a.visible&&!(!w&&a.directTouch)&&r(a.options.enableMouseTracking,!0)&&!a.noSharedTooltip}),k.forEach(function(a){var b=\ny(a.points,function(a){return a.x===c.x&&!a.isNull});f(b)&&(a.chart.isBoosting&&(b=a.getPoint(b)),d.push(b))})):d.push(c));return{hoverPoint:c,hoverSeries:b,hoverPoints:d}},runPointActions:function(b,c){var e=this.chart,l=e.tooltip&&e.tooltip.options.enabled?e.tooltip:void 0,h=l?l.shared:!1,f=c||e.hoverPoint,p=f&&f.series||e.hoverSeries,p=this.getHoverData(f,p,e.series,\"touchmove\"!==b.type&&(!!c||p&&p.directTouch&&this.isDirectTouch),h,b),d=[],k,f=p.hoverPoint;k=p.hoverPoints;c=(p=p.hoverSeries)&&\np.tooltipOptions.followPointer;h=h&&p&&!p.noSharedTooltip;if(f&&(f!==e.hoverPoint||l&&l.isHidden)){(e.hoverPoints||[]).forEach(function(a){-1===k.indexOf(a)&&a.setState()});if(e.hoverSeries!==p)p.onMouseOver();d=this.getActiveSeries(k);e.series.forEach(function(a){(a.options.inactiveOtherPoints||-1===d.indexOf(a))&&a.setState(\"inactive\",!0)});(k||[]).forEach(function(a){a.setState(\"hover\")});e.hoverPoint&&e.hoverPoint.firePointEvent(\"mouseOut\");if(!f.series)return;f.firePointEvent(\"mouseOver\");e.hoverPoints=\nk;e.hoverPoint=f;l&&l.refresh(h?k:f,b)}else c&&l&&!l.isHidden&&(f=l.getAnchor([{}],b),l.updatePosition({plotX:f[0],plotY:f[1]}));this.unDocMouseMove||(this.unDocMouseMove=C(e.container.ownerDocument,\"mousemove\",function(d){var b=E[a.hoverChartIndex];if(b)b.pointer.onDocumentMouseMove(d)}));e.axes.forEach(function(d){var c=r(d.crosshair.snap,!0),e=c?a.find(k,function(a){return a.series[d.coll]===d}):void 0;e||!c?d.drawCrosshair(b,e):d.hideCrosshair()})},getActiveSeries:function(a){var b=[],e;(a||[]).forEach(function(a){e=\na.series;b.push(e);e.linkedParent&&b.push(e.linkedParent);e.linkedSeries&&(b=b.concat(e.linkedSeries));e.navigatorSeries&&b.push(e.navigatorSeries)});return b},reset:function(a,b){var c=this.chart,l=c.hoverSeries,h=c.hoverPoint,f=c.hoverPoints,p=c.tooltip,d=p&&p.shared?f:h;a&&d&&e(d).forEach(function(d){d.series.isCartesian&&void 0===d.plotX&&(a=!1)});if(a)p&&d&&e(d).length&&(p.refresh(d),p.shared&&f?f.forEach(function(a){a.setState(a.state,!0);a.series.isCartesian&&(a.series.xAxis.crosshair&&a.series.xAxis.drawCrosshair(null,\na),a.series.yAxis.crosshair&&a.series.yAxis.drawCrosshair(null,a))}):h&&(h.setState(h.state,!0),c.axes.forEach(function(a){a.crosshair&&a.drawCrosshair(null,h)})));else{if(h)h.onMouseOut();f&&f.forEach(function(a){a.setState()});if(l)l.onMouseOut();p&&p.hide(b);this.unDocMouseMove&&(this.unDocMouseMove=this.unDocMouseMove());c.axes.forEach(function(a){a.hideCrosshair()});this.hoverX=c.hoverPoints=c.hoverPoint=null}},scaleGroups:function(a,b){var c=this.chart,e;c.series.forEach(function(l){e=a||l.getPlotBox();\nl.xAxis&&l.xAxis.zoomEnabled&&l.group&&(l.group.attr(e),l.markerGroup&&(l.markerGroup.attr(e),l.markerGroup.clip(b?c.clipRect:null)),l.dataLabelsGroup&&l.dataLabelsGroup.attr(e))});c.clipRect.attr(b||c.clipBox)},dragStart:function(a){var b=this.chart;b.mouseIsDown=a.type;b.cancelClick=!1;b.mouseDownX=this.mouseDownX=a.chartX;b.mouseDownY=this.mouseDownY=a.chartY},drag:function(a){var b=this.chart,e=b.options.chart,l=a.chartX,h=a.chartY,f=this.zoomHor,p=this.zoomVert,d=b.plotLeft,k=b.plotTop,u=b.plotWidth,\ng=b.plotHeight,r,q=this.selectionMarker,n=this.mouseDownX,v=this.mouseDownY,x=e.panKey&&a[e.panKey+\"Key\"];q&&q.touch||(l<d?l=d:l>d+u&&(l=d+u),h<k?h=k:h>k+g&&(h=k+g),this.hasDragged=Math.sqrt(Math.pow(n-l,2)+Math.pow(v-h,2)),10<this.hasDragged&&(r=b.isInsidePlot(n-d,v-k),b.hasCartesianSeries&&(this.zoomX||this.zoomY)&&r&&!x&&!q&&(this.selectionMarker=q=b.renderer.rect(d,k,f?1:u,p?1:g,0).attr({\"class\":\"highcharts-selection-marker\",zIndex:7}).add(),b.styledMode||q.attr({fill:e.selectionMarkerFill||m(\"#335cad\").setOpacity(.25).get()})),\nq&&f&&(l-=n,q.attr({width:Math.abs(l),x:(0<l?0:l)+n})),q&&p&&(l=h-v,q.attr({height:Math.abs(l),y:(0<l?0:l)+v})),r&&!q&&e.panning&&b.pan(a,e.panning)))},drop:function(a){var b=this,e=this.chart,l=this.hasPinched;if(this.selectionMarker){var h={originalEvent:a,xAxis:[],yAxis:[]},f=this.selectionMarker,p=f.attr?f.attr(\"x\"):f.x,d=f.attr?f.attr(\"y\"):f.y,k=f.attr?f.attr(\"width\"):f.width,u=f.attr?f.attr(\"height\"):f.height,r;if(this.hasDragged||l)e.axes.forEach(function(c){if(c.zoomEnabled&&v(c.min)&&(l||\nb[{xAxis:\"zoomX\",yAxis:\"zoomY\"}[c.coll]])){var e=c.horiz,t=\"touchend\"===a.type?c.minPixelPadding:0,f=c.toValue((e?p:d)+t),e=c.toValue((e?p+k:d+u)-t);h[c.coll].push({axis:c,min:Math.min(f,e),max:Math.max(f,e)});r=!0}}),r&&z(e,\"selection\",h,function(a){e.zoom(x(a,l?{animation:!1}:null))});n(e.index)&&(this.selectionMarker=this.selectionMarker.destroy());l&&this.scaleGroups()}e&&n(e.index)&&(g(e.container,{cursor:e._cursor}),e.cancelClick=10<this.hasDragged,e.mouseIsDown=this.hasDragged=this.hasPinched=\n!1,this.pinchDown=[])},onContainerMouseDown:function(a){a=this.normalize(a);2!==a.button&&(this.zoomOption(a),a.preventDefault&&a.preventDefault(),this.dragStart(a))},onDocumentMouseUp:function(b){E[a.hoverChartIndex]&&E[a.hoverChartIndex].pointer.drop(b)},onDocumentMouseMove:function(a){var b=this.chart,e=this.chartPosition;a=this.normalize(a,e);!e||this.inClass(a.target,\"highcharts-tracker\")||b.isInsidePlot(a.chartX-b.plotLeft,a.chartY-b.plotTop)||this.reset()},onContainerMouseLeave:function(b){var c=\nE[a.hoverChartIndex];c&&(b.relatedTarget||b.toElement)&&(c.pointer.reset(),c.pointer.chartPosition=null)},onContainerMouseMove:function(b){var c=this.chart;v(a.hoverChartIndex)&&E[a.hoverChartIndex]&&E[a.hoverChartIndex].mouseIsDown||(a.hoverChartIndex=c.index);b=this.normalize(b);b.preventDefault||(b.returnValue=!1);\"mousedown\"===c.mouseIsDown&&this.drag(b);!this.inClass(b.target,\"highcharts-tracker\")&&!c.isInsidePlot(b.chartX-c.plotLeft,b.chartY-c.plotTop)||c.openMenu||this.runPointActions(b)},\ninClass:function(a,b){for(var c;a;){if(c=A(a,\"class\")){if(-1!==c.indexOf(b))return!0;if(-1!==c.indexOf(\"highcharts-container\"))return!1}a=a.parentNode}},onTrackerMouseOut:function(a){var b=this.chart.hoverSeries;a=a.relatedTarget||a.toElement;this.isDirectTouch=!1;if(!(!b||!a||b.stickyTracking||this.inClass(a,\"highcharts-tooltip\")||this.inClass(a,\"highcharts-series-\"+b.index)&&this.inClass(a,\"highcharts-tracker\")))b.onMouseOut()},onContainerClick:function(a){var b=this.chart,e=b.hoverPoint,l=b.plotLeft,\nf=b.plotTop;a=this.normalize(a);b.cancelClick||(e&&this.inClass(a.target,\"highcharts-tracker\")?(z(e.series,\"click\",x(a,{point:e})),b.hoverPoint&&e.firePointEvent(\"click\",a)):(x(a,this.getCoordinates(a)),b.isInsidePlot(a.chartX-l,a.chartY-f)&&z(b,\"click\",a)))},setDOMEvents:function(){var b=this,c=b.chart.container,e=c.ownerDocument;c.onmousedown=function(a){b.onContainerMouseDown(a)};c.onmousemove=function(a){b.onContainerMouseMove(a)};c.onclick=function(a){b.onContainerClick(a)};this.unbindContainerMouseLeave=\nC(c,\"mouseleave\",b.onContainerMouseLeave);a.unbindDocumentMouseUp||(a.unbindDocumentMouseUp=C(e,\"mouseup\",b.onDocumentMouseUp));a.hasTouch&&(c.ontouchstart=function(a){b.onContainerTouchStart(a)},c.ontouchmove=function(a){b.onContainerTouchMove(a)},a.unbindDocumentTouchEnd||(a.unbindDocumentTouchEnd=C(e,\"touchend\",b.onDocumentTouchEnd)))},destroy:function(){var b=this;b.unDocMouseMove&&b.unDocMouseMove();this.unbindContainerMouseLeave();a.chartCount||(a.unbindDocumentMouseUp&&(a.unbindDocumentMouseUp=\na.unbindDocumentMouseUp()),a.unbindDocumentTouchEnd&&(a.unbindDocumentTouchEnd=a.unbindDocumentTouchEnd()));clearInterval(b.tooltipTimeout);a.objectEach(b,function(a,e){b[e]=null})}}});I(H,\"parts/TouchPointer.js\",[H[\"parts/Globals.js\"]],function(a){var C=a.charts,A=a.extend,E=a.noop,m=a.pick;A(a.Pointer.prototype,{pinchTranslate:function(a,m,x,y,z,n){this.zoomHor&&this.pinchTranslateDirection(!0,a,m,x,y,z,n);this.zoomVert&&this.pinchTranslateDirection(!1,a,m,x,y,z,n)},pinchTranslateDirection:function(a,\nm,x,y,z,n,f,h){var r=this.chart,e=a?\"x\":\"y\",b=a?\"X\":\"Y\",l=\"chart\"+b,c=a?\"width\":\"height\",t=r[\"plot\"+(a?\"Left\":\"Top\")],g,w,B=h||1,p=r.inverted,d=r.bounds[a?\"h\":\"v\"],k=1===m.length,u=m[0][l],D=x[0][l],G=!k&&m[1][l],q=!k&&x[1][l],K;x=function(){!k&&20<Math.abs(u-G)&&(B=h||Math.abs(D-q)/Math.abs(u-G));w=(t-D)/B+u;g=r[\"plot\"+(a?\"Width\":\"Height\")]/B};x();m=w;m<d.min?(m=d.min,K=!0):m+g>d.max&&(m=d.max-g,K=!0);K?(D-=.8*(D-f[e][0]),k||(q-=.8*(q-f[e][1])),x()):f[e]=[D,q];p||(n[e]=w-t,n[c]=g);n=p?1/B:B;z[c]=\ng;z[e]=m;y[p?a?\"scaleY\":\"scaleX\":\"scale\"+b]=B;y[\"translate\"+b]=n*t+(D-n*u)},pinch:function(a){var g=this,x=g.chart,y=g.pinchDown,z=a.touches,n=z.length,f=g.lastValidTouch,h=g.hasZoom,r=g.selectionMarker,e={},b=1===n&&(g.inClass(a.target,\"highcharts-tracker\")&&x.runTrackerClick||g.runChartClick),l={};1<n&&(g.initiated=!0);h&&g.initiated&&!b&&a.preventDefault();[].map.call(z,function(a){return g.normalize(a)});\"touchstart\"===a.type?([].forEach.call(z,function(a,b){y[b]={chartX:a.chartX,chartY:a.chartY}}),\nf.x=[y[0].chartX,y[1]&&y[1].chartX],f.y=[y[0].chartY,y[1]&&y[1].chartY],x.axes.forEach(function(a){if(a.zoomEnabled){var b=x.bounds[a.horiz?\"h\":\"v\"],c=a.minPixelPadding,e=a.toPixels(Math.min(m(a.options.min,a.dataMin),a.dataMin)),l=a.toPixels(Math.max(m(a.options.max,a.dataMax),a.dataMax)),p=Math.max(e,l);b.min=Math.min(a.pos,Math.min(e,l)-c);b.max=Math.max(a.pos+a.len,p+c)}}),g.res=!0):g.followTouchMove&&1===n?this.runPointActions(g.normalize(a)):y.length&&(r||(g.selectionMarker=r=A({destroy:E,touch:!0},\nx.plotBox)),g.pinchTranslate(y,z,e,r,l,f),g.hasPinched=h,g.scaleGroups(e,l),g.res&&(g.res=!1,this.reset(!1,0)))},touch:function(g,v){var x=this.chart,y,z;if(x.index!==a.hoverChartIndex)this.onContainerMouseLeave({relatedTarget:!0});a.hoverChartIndex=x.index;1===g.touches.length?(g=this.normalize(g),(z=x.isInsidePlot(g.chartX-x.plotLeft,g.chartY-x.plotTop))&&!x.openMenu?(v&&this.runPointActions(g),\"touchmove\"===g.type&&(v=this.pinchDown,y=v[0]?4<=Math.sqrt(Math.pow(v[0].chartX-g.chartX,2)+Math.pow(v[0].chartY-\ng.chartY,2)):!1),m(y,!0)&&this.pinch(g)):v&&this.reset()):2===g.touches.length&&this.pinch(g)},onContainerTouchStart:function(a){this.zoomOption(a);this.touch(a,!0)},onContainerTouchMove:function(a){this.touch(a)},onDocumentTouchEnd:function(g){C[a.hoverChartIndex]&&C[a.hoverChartIndex].pointer.drop(g)}})});I(H,\"parts/MSPointer.js\",[H[\"parts/Globals.js\"]],function(a){var C=a.addEvent,A=a.charts,E=a.css,m=a.doc,g=a.extend,v=a.noop,x=a.Pointer,y=a.removeEvent,z=a.win,n=a.wrap;if(!a.hasTouch&&(z.PointerEvent||\nz.MSPointerEvent)){var f={},h=!!z.PointerEvent,r=function(){var b=[];b.item=function(a){return this[a]};a.objectEach(f,function(a){b.push({pageX:a.pageX,pageY:a.pageY,target:a.target})});return b},e=function(b,e,c,f){\"touch\"!==b.pointerType&&b.pointerType!==b.MSPOINTER_TYPE_TOUCH||!A[a.hoverChartIndex]||(f(b),f=A[a.hoverChartIndex].pointer,f[e]({type:c,target:b.currentTarget,preventDefault:v,touches:r()}))};g(x.prototype,{onContainerPointerDown:function(a){e(a,\"onContainerTouchStart\",\"touchstart\",\nfunction(a){f[a.pointerId]={pageX:a.pageX,pageY:a.pageY,target:a.currentTarget}})},onContainerPointerMove:function(a){e(a,\"onContainerTouchMove\",\"touchmove\",function(a){f[a.pointerId]={pageX:a.pageX,pageY:a.pageY};f[a.pointerId].target||(f[a.pointerId].target=a.currentTarget)})},onDocumentPointerUp:function(a){e(a,\"onDocumentTouchEnd\",\"touchend\",function(a){delete f[a.pointerId]})},batchMSEvents:function(a){a(this.chart.container,h?\"pointerdown\":\"MSPointerDown\",this.onContainerPointerDown);a(this.chart.container,\nh?\"pointermove\":\"MSPointerMove\",this.onContainerPointerMove);a(m,h?\"pointerup\":\"MSPointerUp\",this.onDocumentPointerUp)}});n(x.prototype,\"init\",function(a,e,c){a.call(this,e,c);this.hasZoom&&E(e.container,{\"-ms-touch-action\":\"none\",\"touch-action\":\"none\"})});n(x.prototype,\"setDOMEvents\",function(a){a.apply(this);(this.hasZoom||this.followTouchMove)&&this.batchMSEvents(C)});n(x.prototype,\"destroy\",function(a){this.batchMSEvents(y);a.call(this)})}});I(H,\"parts/Legend.js\",[H[\"parts/Globals.js\"]],function(a){var C=\na.addEvent,A=a.css,E=a.discardElement,m=a.defined,g=a.fireEvent,v=a.isFirefox,x=a.marginNames,y=a.merge,z=a.pick,n=a.setAnimation,f=a.stableSort,h=a.win,r=a.wrap;a.Legend=function(a,b){this.init(a,b)};a.Legend.prototype={init:function(a,b){this.chart=a;this.setOptions(b);b.enabled&&(this.render(),C(this.chart,\"endResize\",function(){this.legend.positionCheckboxes()}),this.proximate?this.unchartrender=C(this.chart,\"render\",function(){this.legend.proximatePositions();this.legend.positionItems()}):this.unchartrender&&\nthis.unchartrender())},setOptions:function(a){var b=z(a.padding,8);this.options=a;this.chart.styledMode||(this.itemStyle=a.itemStyle,this.itemHiddenStyle=y(this.itemStyle,a.itemHiddenStyle));this.itemMarginTop=a.itemMarginTop||0;this.padding=b;this.initialItemY=b-5;this.symbolWidth=z(a.symbolWidth,16);this.pages=[];this.proximate=\"proximate\"===a.layout&&!this.chart.inverted},update:function(a,b){var e=this.chart;this.setOptions(y(!0,this.options,a));this.destroy();e.isDirtyLegend=e.isDirtyBox=!0;\nz(b,!0)&&e.redraw();g(this,\"afterUpdate\")},colorizeItem:function(a,b){a.legendGroup[b?\"removeClass\":\"addClass\"](\"highcharts-legend-item-hidden\");if(!this.chart.styledMode){var e=this.options,c=a.legendItem,f=a.legendLine,h=a.legendSymbol,r=this.itemHiddenStyle.color,e=b?e.itemStyle.color:r,n=b?a.color||r:r,p=a.options&&a.options.marker,d={fill:n};c&&c.css({fill:e,color:e});f&&f.attr({stroke:n});h&&(p&&h.isMarker&&(d=a.pointAttribs(),b||(d.stroke=d.fill=r)),h.attr(d))}g(this,\"afterColorizeItem\",{item:a,\nvisible:b})},positionItems:function(){this.allItems.forEach(this.positionItem,this);this.chart.isResizing||this.positionCheckboxes()},positionItem:function(a){var b=this.options,e=b.symbolPadding,b=!b.rtl,c=a._legendItemPos,f=c[0],c=c[1],h=a.checkbox;if((a=a.legendGroup)&&a.element)a[m(a.translateY)?\"animate\":\"attr\"]({translateX:b?f:this.legendWidth-f-2*e-4,translateY:c});h&&(h.x=f,h.y=c)},destroyItem:function(a){var b=a.checkbox;[\"legendItem\",\"legendLine\",\"legendSymbol\",\"legendGroup\"].forEach(function(b){a[b]&&\n(a[b]=a[b].destroy())});b&&E(a.checkbox)},destroy:function(){function a(a){this[a]&&(this[a]=this[a].destroy())}this.getAllItems().forEach(function(b){[\"legendItem\",\"legendGroup\"].forEach(a,b)});\"clipRect up down pager nav box title group\".split(\" \").forEach(a,this);this.display=null},positionCheckboxes:function(){var a=this.group&&this.group.alignAttr,b,f=this.clipHeight||this.legendHeight,c=this.titleHeight;a&&(b=a.translateY,this.allItems.forEach(function(e){var h=e.checkbox,l;h&&(l=b+c+h.y+(this.scrollOffset||\n0)+3,A(h,{left:a.translateX+e.checkboxOffset+h.x-20+\"px\",top:l+\"px\",display:this.proximate||l>b-6&&l<b+f-6?\"\":\"none\"}))},this))},renderTitle:function(){var a=this.options,b=this.padding,f=a.title,c=0;f.text&&(this.title||(this.title=this.chart.renderer.label(f.text,b-3,b-4,null,null,null,a.useHTML,null,\"legend-title\").attr({zIndex:1}),this.chart.styledMode||this.title.css(f.style),this.title.add(this.group)),f.width||this.title.css({width:this.maxLegendWidth+\"px\"}),a=this.title.getBBox(),c=a.height,\nthis.offsetWidth=a.width,this.contentGroup.attr({translateY:c}));this.titleHeight=c},setText:function(e){var b=this.options;e.legendItem.attr({text:b.labelFormat?a.format(b.labelFormat,e,this.chart.time):b.labelFormatter.call(e)})},renderItem:function(a){var b=this.chart,e=b.renderer,c=this.options,f=this.symbolWidth,h=c.symbolPadding,r=this.itemStyle,g=this.itemHiddenStyle,p=\"horizontal\"===c.layout?z(c.itemDistance,20):0,d=!c.rtl,k=a.legendItem,u=!a.series,D=!u&&a.series.drawLegendSymbol?a.series:\na,G=D.options,G=this.createCheckboxForItem&&G&&G.showCheckbox,p=f+h+p+(G?20:0),q=c.useHTML,n=a.options.className;k||(a.legendGroup=e.g(\"legend-item\").addClass(\"highcharts-\"+D.type+\"-series highcharts-color-\"+a.colorIndex+(n?\" \"+n:\"\")+(u?\" highcharts-series-\"+a.index:\"\")).attr({zIndex:1}).add(this.scrollGroup),a.legendItem=k=e.text(\"\",d?f+h:-h,this.baseline||0,q),b.styledMode||k.css(y(a.visible?r:g)),k.attr({align:d?\"left\":\"right\",zIndex:2}).add(a.legendGroup),this.baseline||(this.fontMetrics=e.fontMetrics(b.styledMode?\n12:r.fontSize,k),this.baseline=this.fontMetrics.f+3+this.itemMarginTop,k.attr(\"y\",this.baseline)),this.symbolHeight=c.symbolHeight||this.fontMetrics.f,D.drawLegendSymbol(this,a),this.setItemEvents&&this.setItemEvents(a,k,q));G&&!a.checkbox&&this.createCheckboxForItem(a);this.colorizeItem(a,a.visible);!b.styledMode&&r.width||k.css({width:(c.itemWidth||this.widthOption||b.spacingBox.width)-p});this.setText(a);b=k.getBBox();a.itemWidth=a.checkboxOffset=c.itemWidth||a.legendItemWidth||b.width+p;this.maxItemWidth=\nMath.max(this.maxItemWidth,a.itemWidth);this.totalItemWidth+=a.itemWidth;this.itemHeight=a.itemHeight=Math.round(a.legendItemHeight||b.height||this.symbolHeight)},layoutItem:function(a){var b=this.options,e=this.padding,c=\"horizontal\"===b.layout,f=a.itemHeight,h=b.itemMarginBottom||0,r=this.itemMarginTop,g=c?z(b.itemDistance,20):0,p=this.maxLegendWidth,b=b.alignColumns&&this.totalItemWidth>p?this.maxItemWidth:a.itemWidth;c&&this.itemX-e+b>p&&(this.itemX=e,this.lastLineHeight&&(this.itemY+=r+this.lastLineHeight+\nh),this.lastLineHeight=0);this.lastItemY=r+this.itemY+h;this.lastLineHeight=Math.max(f,this.lastLineHeight);a._legendItemPos=[this.itemX,this.itemY];c?this.itemX+=b:(this.itemY+=r+f+h,this.lastLineHeight=f);this.offsetWidth=this.widthOption||Math.max((c?this.itemX-e-(a.checkbox?0:g):b)+e,this.offsetWidth)},getAllItems:function(){var a=[];this.chart.series.forEach(function(b){var e=b&&b.options;b&&z(e.showInLegend,m(e.linkedTo)?!1:void 0,!0)&&(a=a.concat(b.legendItems||(\"point\"===e.legendType?b.data:\nb)))});g(this,\"afterGetAllItems\",{allItems:a});return a},getAlignment:function(){var a=this.options;return this.proximate?a.align.charAt(0)+\"tv\":a.floating?\"\":a.align.charAt(0)+a.verticalAlign.charAt(0)+a.layout.charAt(0)},adjustMargins:function(a,b){var e=this.chart,c=this.options,f=this.getAlignment(),h=void 0!==e.options.title.margin?e.titleOffset+e.options.title.margin:0;f&&[/(lth|ct|rth)/,/(rtv|rm|rbv)/,/(rbh|cb|lbh)/,/(lbv|lm|ltv)/].forEach(function(l,t){l.test(f)&&!m(a[t])&&(e[x[t]]=Math.max(e[x[t]],\ne.legend[(t+1)%2?\"legendHeight\":\"legendWidth\"]+[1,-1,-1,1][t]*c[t%2?\"x\":\"y\"]+z(c.margin,12)+b[t]+(0===t&&(0===e.titleOffset?0:h))))})},proximatePositions:function(){var e=this.chart,b=[],f=\"left\"===this.options.align;this.allItems.forEach(function(c){var h,l;l=f;var r;c.yAxis&&c.points&&(c.xAxis.options.reversed&&(l=!l),h=a.find(l?c.points:c.points.slice(0).reverse(),function(b){return a.isNumber(b.plotY)}),l=c.legendGroup.getBBox().height,r=c.yAxis.top-e.plotTop,c.visible?(h=h?h.plotY:c.yAxis.height,\nh+=r-.3*l):h=r+c.yAxis.height,b.push({target:h,size:l,item:c}))},this);a.distribute(b,e.plotHeight);b.forEach(function(a){a.item._legendItemPos[1]=e.plotTop-e.spacing[0]+a.pos})},render:function(){var e=this.chart,b=e.renderer,h=this.group,c,t,r,w=this.box,n=this.options,p=this.padding;this.itemX=p;this.itemY=this.initialItemY;this.lastItemY=this.offsetWidth=0;this.widthOption=a.relativeLength(n.width,e.spacingBox.width-p);c=e.spacingBox.width-2*p-n.x;-1<[\"rm\",\"lm\"].indexOf(this.getAlignment().substring(0,\n2))&&(c/=2);this.maxLegendWidth=this.widthOption||c;h||(this.group=h=b.g(\"legend\").attr({zIndex:7}).add(),this.contentGroup=b.g().attr({zIndex:1}).add(h),this.scrollGroup=b.g().add(this.contentGroup));this.renderTitle();c=this.getAllItems();f(c,function(a,b){return(a.options&&a.options.legendIndex||0)-(b.options&&b.options.legendIndex||0)});n.reversed&&c.reverse();this.allItems=c;this.display=t=!!c.length;this.itemHeight=this.totalItemWidth=this.maxItemWidth=this.lastLineHeight=0;c.forEach(this.renderItem,\nthis);c.forEach(this.layoutItem,this);c=(this.widthOption||this.offsetWidth)+p;r=this.lastItemY+this.lastLineHeight+this.titleHeight;r=this.handleOverflow(r);r+=p;w||(this.box=w=b.rect().addClass(\"highcharts-legend-box\").attr({r:n.borderRadius}).add(h),w.isNew=!0);e.styledMode||w.attr({stroke:n.borderColor,\"stroke-width\":n.borderWidth||0,fill:n.backgroundColor||\"none\"}).shadow(n.shadow);0<c&&0<r&&(w[w.isNew?\"attr\":\"animate\"](w.crisp.call({},{x:0,y:0,width:c,height:r},w.strokeWidth())),w.isNew=!1);\nw[t?\"show\":\"hide\"]();e.styledMode&&\"none\"===h.getStyle(\"display\")&&(c=r=0);this.legendWidth=c;this.legendHeight=r;t&&(b=e.spacingBox,/(lth|ct|rth)/.test(this.getAlignment())&&(w=b.y+e.titleOffset,b=y(b,{y:0<e.titleOffset?w+=e.options.title.margin:w})),h.align(y(n,{width:c,height:r,verticalAlign:this.proximate?\"top\":n.verticalAlign}),!0,b));this.proximate||this.positionItems();g(this,\"afterRender\")},handleOverflow:function(a){var b=this,e=this.chart,c=e.renderer,h=this.options,f=h.y,r=this.padding,\nf=e.spacingBox.height+(\"top\"===h.verticalAlign?-f:f)-r,g=h.maxHeight,p,d=this.clipRect,k=h.navigation,u=z(k.animation,!0),D=k.arrowSize||12,G=this.nav,q=this.pages,n,m=this.allItems,v=function(a){\"number\"===typeof a?d.attr({height:a}):d&&(b.clipRect=d.destroy(),b.contentGroup.clip());b.contentGroup.div&&(b.contentGroup.div.style.clip=a?\"rect(\"+r+\"px,9999px,\"+(r+a)+\"px,0)\":\"auto\")},L=function(a){b[a]=c.circle(0,0,1.3*D).translate(D/2,D/2).add(G);e.styledMode||b[a].attr(\"fill\",\"rgba(0,0,0,0.0001)\");\nreturn b[a]};\"horizontal\"!==h.layout||\"middle\"===h.verticalAlign||h.floating||(f/=2);g&&(f=Math.min(f,g));q.length=0;a>f&&!1!==k.enabled?(this.clipHeight=p=Math.max(f-20-this.titleHeight-r,0),this.currentPage=z(this.currentPage,1),this.fullHeight=a,m.forEach(function(a,d){var b=a._legendItemPos[1],c=Math.round(a.legendItem.getBBox().height),k=q.length;if(!k||b-q[k-1]>p&&(n||b)!==q[k-1])q.push(n||b),k++;a.pageIx=k-1;n&&(m[d-1].pageIx=k-1);d===m.length-1&&b+c-q[k-1]>p&&b!==n&&(q.push(b),a.pageIx=k);\nb!==n&&(n=b)}),d||(d=b.clipRect=c.clipRect(0,r,9999,0),b.contentGroup.clip(d)),v(p),G||(this.nav=G=c.g().attr({zIndex:1}).add(this.group),this.up=c.symbol(\"triangle\",0,0,D,D).add(G),L(\"upTracker\").on(\"click\",function(){b.scroll(-1,u)}),this.pager=c.text(\"\",15,10).addClass(\"highcharts-legend-navigation\"),e.styledMode||this.pager.css(k.style),this.pager.add(G),this.down=c.symbol(\"triangle-down\",0,0,D,D).add(G),L(\"downTracker\").on(\"click\",function(){b.scroll(1,u)})),b.scroll(0),a=f):G&&(v(),this.nav=\nG.destroy(),this.scrollGroup.attr({translateY:1}),this.clipHeight=0);return a},scroll:function(a,b){var e=this.pages,c=e.length,h=this.currentPage+a;a=this.clipHeight;var f=this.options.navigation,r=this.pager,g=this.padding;h>c&&(h=c);0<h&&(void 0!==b&&n(b,this.chart),this.nav.attr({translateX:g,translateY:a+this.padding+7+this.titleHeight,visibility:\"visible\"}),[this.up,this.upTracker].forEach(function(a){a.attr({\"class\":1===h?\"highcharts-legend-nav-inactive\":\"highcharts-legend-nav-active\"})}),\nr.attr({text:h+\"/\"+c}),[this.down,this.downTracker].forEach(function(a){a.attr({x:18+this.pager.getBBox().width,\"class\":h===c?\"highcharts-legend-nav-inactive\":\"highcharts-legend-nav-active\"})},this),this.chart.styledMode||(this.up.attr({fill:1===h?f.inactiveColor:f.activeColor}),this.upTracker.css({cursor:1===h?\"default\":\"pointer\"}),this.down.attr({fill:h===c?f.inactiveColor:f.activeColor}),this.downTracker.css({cursor:h===c?\"default\":\"pointer\"})),this.scrollOffset=-e[h-1]+this.initialItemY,this.scrollGroup.animate({translateY:this.scrollOffset}),\nthis.currentPage=h,this.positionCheckboxes())}};a.LegendSymbolMixin={drawRectangle:function(a,b){var e=a.symbolHeight,c=a.options.squareSymbol;b.legendSymbol=this.chart.renderer.rect(c?(a.symbolWidth-e)/2:0,a.baseline-e+1,c?e:a.symbolWidth,e,z(a.options.symbolRadius,e/2)).addClass(\"highcharts-point\").attr({zIndex:3}).add(b.legendGroup)},drawLineMarker:function(a){var b=this.options,e=b.marker,c=a.symbolWidth,h=a.symbolHeight,f=h/2,r=this.chart.renderer,g=this.legendGroup;a=a.baseline-Math.round(.3*\na.fontMetrics.b);var p={};this.chart.styledMode||(p={\"stroke-width\":b.lineWidth||0},b.dashStyle&&(p.dashstyle=b.dashStyle));this.legendLine=r.path([\"M\",0,a,\"L\",c,a]).addClass(\"highcharts-graph\").attr(p).add(g);e&&!1!==e.enabled&&c&&(b=Math.min(z(e.radius,f),f),0===this.symbol.indexOf(\"url\")&&(e=y(e,{width:h,height:h}),b=0),this.legendSymbol=e=r.symbol(this.symbol,c/2-b,a-b,2*b,2*b,e).addClass(\"highcharts-point\").add(g),e.isMarker=!0)}};(/Trident\\/7\\.0/.test(h.navigator&&h.navigator.userAgent)||v)&&\nr(a.Legend.prototype,\"positionItem\",function(a,b){var e=this,c=function(){b._legendItemPos&&a.call(e,b)};c();e.bubbleLegend||setTimeout(c)})});I(H,\"parts/Chart.js\",[H[\"parts/Globals.js\"]],function(a){var C=a.addEvent,A=a.animate,E=a.animObject,m=a.attr,g=a.doc,v=a.Axis,x=a.createElement,y=a.defaultOptions,z=a.discardElement,n=a.charts,f=a.css,h=a.defined,r=a.extend,e=a.find,b=a.fireEvent,l=a.isNumber,c=a.isObject,t=a.isString,F=a.Legend,w=a.marginNames,B=a.merge,p=a.objectEach,d=a.Pointer,k=a.pick,\nu=a.pInt,D=a.removeEvent,G=a.seriesTypes,q=a.splat,K=a.syncTimeout,N=a.win,O=a.Chart=function(){this.getArgs.apply(this,arguments)};a.chart=function(a,d,b){return new O(a,d,b)};r(O.prototype,{callbacks:[],getArgs:function(){var a=[].slice.call(arguments);if(t(a[0])||a[0].nodeName)this.renderTo=a.shift();this.init(a[0],a[1])},init:function(d,k){var e,u=d.series,q=d.plotOptions||{};b(this,\"init\",{args:arguments},function(){d.series=null;e=B(y,d);p(e.plotOptions,function(a,d){c(a)&&(a.tooltip=q[d]&&\nB(q[d].tooltip)||void 0)});e.tooltip.userOptions=d.chart&&d.chart.forExport&&d.tooltip.userOptions||d.tooltip;e.series=d.series=u;this.userOptions=d;var h=e.chart,f=h.events;this.margin=[];this.spacing=[];this.bounds={h:{},v:{}};this.labelCollectors=[];this.callback=k;this.isResizing=0;this.options=e;this.axes=[];this.series=[];this.time=d.time&&Object.keys(d.time).length?new a.Time(d.time):a.time;this.styledMode=h.styledMode;this.hasCartesianSeries=h.showAxes;var l=this;l.index=n.length;n.push(l);\na.chartCount++;f&&p(f,function(d,b){a.isFunction(d)&&C(l,b,d)});l.xAxis=[];l.yAxis=[];l.pointCount=l.colorCounter=l.symbolCounter=0;b(l,\"afterInit\");l.firstRender()})},initSeries:function(d){var b=this.options.chart;(b=G[d.type||b.type||b.defaultSeriesType])||a.error(17,!0,this);b=new b;b.init(this,d);return b},orderSeries:function(a){var d=this.series;for(a=a||0;a<d.length;a++)d[a]&&(d[a].index=a,d[a].name=d[a].getName())},isInsidePlot:function(a,d,b){var c=b?d:a;a=b?a:d;return 0<=c&&c<=this.plotWidth&&\n0<=a&&a<=this.plotHeight},redraw:function(d){b(this,\"beforeRedraw\");var c=this.axes,k=this.series,e=this.pointer,u=this.legend,q=this.userOptions.legend,h=this.isDirtyLegend,f,p,l=this.hasCartesianSeries,t=this.isDirtyBox,g,D=this.renderer,G=D.isHidden(),w=[];this.setResponsive&&this.setResponsive(!1);a.setAnimation(d,this);G&&this.temporaryDisplay();this.layOutTitles();for(d=k.length;d--;)if(g=k[d],g.options.stacking&&(f=!0,g.isDirty)){p=!0;break}if(p)for(d=k.length;d--;)g=k[d],g.options.stacking&&\n(g.isDirty=!0);k.forEach(function(a){a.isDirty&&(\"point\"===a.options.legendType?(a.updateTotals&&a.updateTotals(),h=!0):q&&(q.labelFormatter||q.labelFormat)&&(h=!0));a.isDirtyData&&b(a,\"updatedData\")});h&&u&&u.options.enabled&&(u.render(),this.isDirtyLegend=!1);f&&this.getStacks();l&&c.forEach(function(a){a.updateNames();a.setScale()});this.getMargins();l&&(c.forEach(function(a){a.isDirty&&(t=!0)}),c.forEach(function(a){var d=a.min+\",\"+a.max;a.extKey!==d&&(a.extKey=d,w.push(function(){b(a,\"afterSetExtremes\",\nr(a.eventArgs,a.getExtremes()));delete a.eventArgs}));(t||f)&&a.redraw()}));t&&this.drawChartBox();b(this,\"predraw\");k.forEach(function(a){(t||a.isDirty)&&a.visible&&a.redraw();a.isDirtyData=!1});e&&e.reset(!0);D.draw();b(this,\"redraw\");b(this,\"render\");G&&this.temporaryDisplay(!0);w.forEach(function(a){a.call()})},get:function(a){function d(d){return d.id===a||d.options&&d.options.id===a}var b,c=this.series,k;b=e(this.axes,d)||e(this.series,d);for(k=0;!b&&k<c.length;k++)b=e(c[k].points||[],d);return b},\ngetAxes:function(){var a=this,d=this.options,c=d.xAxis=q(d.xAxis||{}),d=d.yAxis=q(d.yAxis||{});b(this,\"getAxes\");c.forEach(function(a,d){a.index=d;a.isX=!0});d.forEach(function(a,d){a.index=d});c.concat(d).forEach(function(d){new v(a,d)});b(this,\"afterGetAxes\")},getSelectedPoints:function(){var a=[];this.series.forEach(function(d){a=a.concat((d[d.hasGroupedData?\"points\":\"data\"]||[]).filter(function(a){return a.selected}))});return a},getSelectedSeries:function(){return this.series.filter(function(a){return a.selected})},\nsetTitle:function(a,d,b){var c=this,k=c.options,e=c.styledMode,u;u=k.title=B(!e&&{style:{color:\"#333333\",fontSize:k.isStock?\"16px\":\"18px\"}},k.title,a);k=k.subtitle=B(!e&&{style:{color:\"#666666\"}},k.subtitle,d);[[\"title\",a,u],[\"subtitle\",d,k]].forEach(function(a,d){var b=a[0],k=c[b],u=a[1];a=a[2];k&&u&&(c[b]=k=k.destroy());a&&!k&&(c[b]=c.renderer.text(a.text,0,0,a.useHTML).attr({align:a.align,\"class\":\"highcharts-\"+b,zIndex:a.zIndex||4}).add(),c[b].update=function(a){c.setTitle(!d&&a,d&&a)},e||c[b].css(a.style))});\nc.layOutTitles(b)},layOutTitles:function(a){var d=0,b,c=this.renderer,e=this.spacingBox;[\"title\",\"subtitle\"].forEach(function(a){var b=this[a],k=this.options[a];a=\"title\"===a?-3:k.verticalAlign?0:d+2;var u;b&&(this.styledMode||(u=k.style.fontSize),u=c.fontMetrics(u,b).b,b.css({width:(k.width||e.width+k.widthAdjust)+\"px\"}).align(r({y:a+u},k),!1,\"spacingBox\"),k.floating||k.verticalAlign||(d=Math.ceil(d+b.getBBox(k.useHTML).height)))},this);b=this.titleOffset!==d;this.titleOffset=d;!this.isDirtyBox&&\nb&&(this.isDirtyBox=this.isDirtyLegend=b,this.hasRendered&&k(a,!0)&&this.isDirtyBox&&this.redraw())},getChartSize:function(){var d=this.options.chart,b=d.width,d=d.height,c=this.renderTo;h(b)||(this.containerWidth=a.getStyle(c,\"width\"));h(d)||(this.containerHeight=a.getStyle(c,\"height\"));this.chartWidth=Math.max(0,b||this.containerWidth||600);this.chartHeight=Math.max(0,a.relativeLength(d,this.chartWidth)||(1<this.containerHeight?this.containerHeight:400))},temporaryDisplay:function(d){var b=this.renderTo;\nif(d)for(;b&&b.style;)b.hcOrigStyle&&(a.css(b,b.hcOrigStyle),delete b.hcOrigStyle),b.hcOrigDetached&&(g.body.removeChild(b),b.hcOrigDetached=!1),b=b.parentNode;else for(;b&&b.style;){g.body.contains(b)||b.parentNode||(b.hcOrigDetached=!0,g.body.appendChild(b));if(\"none\"===a.getStyle(b,\"display\",!1)||b.hcOricDetached)b.hcOrigStyle={display:b.style.display,height:b.style.height,overflow:b.style.overflow},d={display:\"block\",overflow:\"hidden\"},b!==this.renderTo&&(d.height=0),a.css(b,d),b.offsetWidth||\nb.style.setProperty(\"display\",\"block\",\"important\");b=b.parentNode;if(b===g.body)break}},setClassName:function(a){this.container.className=\"highcharts-container \"+(a||\"\")},getContainer:function(){var d,c=this.options,k=c.chart,e,q;d=this.renderTo;var h=a.uniqueKey(),p,D;d||(this.renderTo=d=k.renderTo);t(d)&&(this.renderTo=d=g.getElementById(d));d||a.error(13,!0,this);e=u(m(d,\"data-highcharts-chart\"));l(e)&&n[e]&&n[e].hasRendered&&n[e].destroy();m(d,\"data-highcharts-chart\",this.index);d.innerHTML=\"\";\nk.skipClone||d.offsetWidth||this.temporaryDisplay();this.getChartSize();e=this.chartWidth;q=this.chartHeight;f(d,{overflow:\"hidden\"});this.styledMode||(p=r({position:\"relative\",overflow:\"hidden\",width:e+\"px\",height:q+\"px\",textAlign:\"left\",lineHeight:\"normal\",zIndex:0,\"-webkit-tap-highlight-color\":\"rgba(0,0,0,0)\"},k.style));this.container=d=x(\"div\",{id:h},p,d);this._cursor=d.style.cursor;this.renderer=new (a[k.renderer]||a.Renderer)(d,e,q,null,k.forExport,c.exporting&&c.exporting.allowHTML,this.styledMode);\nthis.setClassName(k.className);if(this.styledMode)for(D in c.defs)this.renderer.definition(c.defs[D]);else this.renderer.setStyle(k.style);this.renderer.chartIndex=this.index;b(this,\"afterGetContainer\")},getMargins:function(a){var d=this.spacing,c=this.margin,k=this.titleOffset;this.resetMargins();k&&!h(c[0])&&(this.plotTop=Math.max(this.plotTop,k+this.options.title.margin+d[0]));this.legend&&this.legend.display&&this.legend.adjustMargins(c,d);b(this,\"getMargins\");a||this.getAxisMargins()},getAxisMargins:function(){var a=\nthis,d=a.axisOffset=[0,0,0,0],b=a.margin;a.hasCartesianSeries&&a.axes.forEach(function(a){a.visible&&a.getOffset()});w.forEach(function(c,k){h(b[k])||(a[c]+=d[k])});a.setChartSize()},reflow:function(d){var b=this,c=b.options.chart,k=b.renderTo,e=h(c.width)&&h(c.height),u=c.width||a.getStyle(k,\"width\"),c=c.height||a.getStyle(k,\"height\"),k=d?d.target:N;if(!e&&!b.isPrinting&&u&&c&&(k===N||k===g)){if(u!==b.containerWidth||c!==b.containerHeight)a.clearTimeout(b.reflowTimeout),b.reflowTimeout=K(function(){b.container&&\nb.setSize(void 0,void 0,!1)},d?100:0);b.containerWidth=u;b.containerHeight=c}},setReflow:function(a){var d=this;!1===a||this.unbindReflow?!1===a&&this.unbindReflow&&(this.unbindReflow=this.unbindReflow()):(this.unbindReflow=C(N,\"resize\",function(a){d.reflow(a)}),C(this,\"destroy\",this.unbindReflow))},setSize:function(d,c,k){var e=this,u=e.renderer,q;e.isResizing+=1;a.setAnimation(k,e);e.oldChartHeight=e.chartHeight;e.oldChartWidth=e.chartWidth;void 0!==d&&(e.options.chart.width=d);void 0!==c&&(e.options.chart.height=\nc);e.getChartSize();e.styledMode||(q=u.globalAnimation,(q?A:f)(e.container,{width:e.chartWidth+\"px\",height:e.chartHeight+\"px\"},q));e.setChartSize(!0);u.setSize(e.chartWidth,e.chartHeight,k);e.axes.forEach(function(a){a.isDirty=!0;a.setScale()});e.isDirtyLegend=!0;e.isDirtyBox=!0;e.layOutTitles();e.getMargins();e.redraw(k);e.oldChartHeight=null;b(e,\"resize\");K(function(){e&&b(e,\"endResize\",null,function(){--e.isResizing})},E(q).duration)},setChartSize:function(a){var d=this.inverted,c=this.renderer,\nk=this.chartWidth,e=this.chartHeight,u=this.options.chart,q=this.spacing,h=this.clipOffset,f,p,l,t;this.plotLeft=f=Math.round(this.plotLeft);this.plotTop=p=Math.round(this.plotTop);this.plotWidth=l=Math.max(0,Math.round(k-f-this.marginRight));this.plotHeight=t=Math.max(0,Math.round(e-p-this.marginBottom));this.plotSizeX=d?t:l;this.plotSizeY=d?l:t;this.plotBorderWidth=u.plotBorderWidth||0;this.spacingBox=c.spacingBox={x:q[3],y:q[0],width:k-q[3]-q[1],height:e-q[0]-q[2]};this.plotBox=c.plotBox={x:f,\ny:p,width:l,height:t};k=2*Math.floor(this.plotBorderWidth/2);d=Math.ceil(Math.max(k,h[3])/2);c=Math.ceil(Math.max(k,h[0])/2);this.clipBox={x:d,y:c,width:Math.floor(this.plotSizeX-Math.max(k,h[1])/2-d),height:Math.max(0,Math.floor(this.plotSizeY-Math.max(k,h[2])/2-c))};a||this.axes.forEach(function(a){a.setAxisSize();a.setAxisTranslation()});b(this,\"afterSetChartSize\",{skipAxes:a})},resetMargins:function(){b(this,\"resetMargins\");var a=this,d=a.options.chart;[\"margin\",\"spacing\"].forEach(function(b){var e=\nd[b],u=c(e)?e:[e,e,e,e];[\"Top\",\"Right\",\"Bottom\",\"Left\"].forEach(function(c,e){a[b][e]=k(d[b+c],u[e])})});w.forEach(function(d,b){a[d]=k(a.margin[b],a.spacing[b])});a.axisOffset=[0,0,0,0];a.clipOffset=[0,0,0,0]},drawChartBox:function(){var a=this.options.chart,d=this.renderer,c=this.chartWidth,k=this.chartHeight,e=this.chartBackground,u=this.plotBackground,q=this.plotBorder,h,f=this.styledMode,p=this.plotBGImage,l=a.backgroundColor,t=a.plotBackgroundColor,r=a.plotBackgroundImage,g,D=this.plotLeft,\nG=this.plotTop,w=this.plotWidth,n=this.plotHeight,m=this.plotBox,K=this.clipRect,B=this.clipBox,F=\"animate\";e||(this.chartBackground=e=d.rect().addClass(\"highcharts-background\").add(),F=\"attr\");if(f)h=g=e.strokeWidth();else{h=a.borderWidth||0;g=h+(a.shadow?8:0);l={fill:l||\"none\"};if(h||e[\"stroke-width\"])l.stroke=a.borderColor,l[\"stroke-width\"]=h;e.attr(l).shadow(a.shadow)}e[F]({x:g/2,y:g/2,width:c-g-h%2,height:k-g-h%2,r:a.borderRadius});F=\"animate\";u||(F=\"attr\",this.plotBackground=u=d.rect().addClass(\"highcharts-plot-background\").add());\nu[F](m);f||(u.attr({fill:t||\"none\"}).shadow(a.plotShadow),r&&(p?p.animate(m):this.plotBGImage=d.image(r,D,G,w,n).add()));K?K.animate({width:B.width,height:B.height}):this.clipRect=d.clipRect(B);F=\"animate\";q||(F=\"attr\",this.plotBorder=q=d.rect().addClass(\"highcharts-plot-border\").attr({zIndex:1}).add());f||q.attr({stroke:a.plotBorderColor,\"stroke-width\":a.plotBorderWidth||0,fill:\"none\"});q[F](q.crisp({x:D,y:G,width:w,height:n},-q.strokeWidth()));this.isDirtyBox=!1;b(this,\"afterDrawChartBox\")},propFromSeries:function(){var a=\nthis,d=a.options.chart,b,c=a.options.series,k,e;[\"inverted\",\"angular\",\"polar\"].forEach(function(u){b=G[d.type||d.defaultSeriesType];e=d[u]||b&&b.prototype[u];for(k=c&&c.length;!e&&k--;)(b=G[c[k].type])&&b.prototype[u]&&(e=!0);a[u]=e})},linkSeries:function(){var a=this,d=a.series;d.forEach(function(a){a.linkedSeries.length=0});d.forEach(function(d){var b=d.options.linkedTo;t(b)&&(b=\":previous\"===b?a.series[d.index-1]:a.get(b))&&b.linkedParent!==d&&(b.linkedSeries.push(d),d.linkedParent=b,d.visible=\nk(d.options.visible,b.options.visible,d.visible))});b(this,\"afterLinkSeries\")},renderSeries:function(){this.series.forEach(function(a){a.translate();a.render()})},renderLabels:function(){var a=this,d=a.options.labels;d.items&&d.items.forEach(function(b){var c=r(d.style,b.style),k=u(c.left)+a.plotLeft,e=u(c.top)+a.plotTop+12;delete c.left;delete c.top;a.renderer.text(b.html,k,e).attr({zIndex:2}).css(c).add()})},render:function(){var a=this.axes,d=this.renderer,b=this.options,c=0,k,e,u;this.setTitle();\nthis.legend=new F(this,b.legend);this.getStacks&&this.getStacks();this.getMargins(!0);this.setChartSize();b=this.plotWidth;a.some(function(a){if(a.horiz&&a.visible&&a.options.labels.enabled&&a.series.length)return c=21,!0});k=this.plotHeight=Math.max(this.plotHeight-c,0);a.forEach(function(a){a.setScale()});this.getAxisMargins();e=1.1<b/this.plotWidth;u=1.05<k/this.plotHeight;if(e||u)a.forEach(function(a){(a.horiz&&e||!a.horiz&&u)&&a.setTickInterval(!0)}),this.getMargins();this.drawChartBox();this.hasCartesianSeries&&\na.forEach(function(a){a.visible&&a.render()});this.seriesGroup||(this.seriesGroup=d.g(\"series-group\").attr({zIndex:3}).add());this.renderSeries();this.renderLabels();this.addCredits();this.setResponsive&&this.setResponsive();this.hasRendered=!0},addCredits:function(a){var d=this;a=B(!0,this.options.credits,a);a.enabled&&!this.credits&&(this.credits=this.renderer.text(a.text+(this.mapCredits||\"\"),0,0).addClass(\"highcharts-credits\").on(\"click\",function(){a.href&&(N.location.href=a.href)}).attr({align:a.position.align,\nzIndex:8}),d.styledMode||this.credits.css(a.style),this.credits.add().align(a.position),this.credits.update=function(a){d.credits=d.credits.destroy();d.addCredits(a)})},destroy:function(){var d=this,c=d.axes,k=d.series,e=d.container,u,q=e&&e.parentNode;b(d,\"destroy\");d.renderer.forExport?a.erase(n,d):n[d.index]=void 0;a.chartCount--;d.renderTo.removeAttribute(\"data-highcharts-chart\");D(d);for(u=c.length;u--;)c[u]=c[u].destroy();this.scroller&&this.scroller.destroy&&this.scroller.destroy();for(u=k.length;u--;)k[u]=\nk[u].destroy();\"title subtitle chartBackground plotBackground plotBGImage plotBorder seriesGroup clipRect credits pointer rangeSelector legend resetZoomButton tooltip renderer\".split(\" \").forEach(function(a){var b=d[a];b&&b.destroy&&(d[a]=b.destroy())});e&&(e.innerHTML=\"\",D(e),q&&z(e));p(d,function(a,b){delete d[b]})},firstRender:function(){var c=this,k=c.options;if(!c.isReadyToRender||c.isReadyToRender()){c.getContainer();c.resetMargins();c.setChartSize();c.propFromSeries();c.getAxes();(a.isArray(k.series)?\nk.series:[]).forEach(function(a){c.initSeries(a)});c.linkSeries();b(c,\"beforeRender\");d&&(c.pointer=new d(c,k));c.render();if(!c.renderer.imgCount&&c.onload)c.onload();c.temporaryDisplay(!0)}},onload:function(){this.callbacks.concat([this.callback]).forEach(function(a){a&&void 0!==this.index&&a.apply(this,[this])},this);b(this,\"load\");b(this,\"render\");h(this.index)&&this.setReflow(this.options.chart.reflow);this.onload=null}})});I(H,\"parts/ScrollablePlotArea.js\",[H[\"parts/Globals.js\"]],function(a){var C=\na.addEvent,A=a.Chart;C(A,\"afterSetChartSize\",function(A){var m=this.options.chart.scrollablePlotArea,g=m&&m.minWidth,m=m&&m.minHeight,v;if(!this.renderer.forExport){if(g){if(this.scrollablePixelsX=g=Math.max(0,g-this.chartWidth))this.plotWidth+=g,this.inverted?this.clipBox.height+=g:this.clipBox.width+=g,v={1:{name:\"right\",value:g}}}else m&&(this.scrollablePixelsY=g=Math.max(0,m-this.chartHeight))&&(this.plotHeight+=g,this.inverted?this.clipBox.width+=g:this.clipBox.height+=g,v={2:{name:\"bottom\",\nvalue:g}});v&&!A.skipAxes&&this.axes.forEach(function(g){v[g.side]?g.getPlotLinePath=function(){var m=v[g.side].name,x=this[m],n;this[m]=x-v[g.side].value;n=a.Axis.prototype.getPlotLinePath.apply(this,arguments);this[m]=x;return n}:(g.setAxisSize(),g.setAxisTranslation())})}});C(A,\"render\",function(){this.scrollablePixelsX||this.scrollablePixelsY?(this.setUpScrolling&&this.setUpScrolling(),this.applyFixed()):this.fixedDiv&&this.applyFixed()});A.prototype.setUpScrolling=function(){var A={WebkitOverflowScrolling:\"touch\",\noverflowX:\"hidden\",overflowY:\"hidden\"};this.scrollablePixelsX&&(A.overflowX=\"auto\");this.scrollablePixelsY&&(A.overflowY=\"auto\");this.scrollingContainer=a.createElement(\"div\",{className:\"highcharts-scrolling\"},A,this.renderTo);this.innerContainer=a.createElement(\"div\",{className:\"highcharts-inner-container\"},null,this.scrollingContainer);this.innerContainer.appendChild(this.container);this.setUpScrolling=null};A.prototype.moveFixedElements=function(){var a=this.container,m=this.fixedRenderer,g=\".highcharts-contextbutton .highcharts-credits .highcharts-legend .highcharts-reset-zoom .highcharts-subtitle .highcharts-title .highcharts-legend-checkbox\".split(\" \"),\nv;this.scrollablePixelsX&&!this.inverted?v=\".highcharts-yaxis\":this.scrollablePixelsX&&this.inverted?v=\".highcharts-xaxis\":this.scrollablePixelsY&&!this.inverted?v=\".highcharts-xaxis\":this.scrollablePixelsY&&this.inverted&&(v=\".highcharts-yaxis\");g.push(v,v+\"-labels\");g.forEach(function(g){[].forEach.call(a.querySelectorAll(g),function(a){(a.namespaceURI===m.SVG_NS?m.box:m.box.parentNode).appendChild(a);a.style.pointerEvents=\"auto\"})})};A.prototype.applyFixed=function(){var A,m,g=!this.fixedDiv,v=\nthis.options.chart.scrollablePlotArea;g?(this.fixedDiv=a.createElement(\"div\",{className:\"highcharts-fixed\"},{position:\"absolute\",overflow:\"hidden\",pointerEvents:\"none\",zIndex:2},null,!0),this.renderTo.insertBefore(this.fixedDiv,this.renderTo.firstChild),this.renderTo.style.overflow=\"visible\",this.fixedRenderer=A=new a.Renderer(this.fixedDiv,this.chartWidth,this.chartHeight),this.scrollableMask=A.path().attr({fill:a.color(this.options.chart.backgroundColor||\"#fff\").setOpacity(a.pick(v.opacity,.85)).get(),\nzIndex:-1}).addClass(\"highcharts-scrollable-mask\").add(),this.moveFixedElements(),C(this,\"afterShowResetZoom\",this.moveFixedElements)):this.fixedRenderer.setSize(this.chartWidth,this.chartHeight);A=this.chartWidth+(this.scrollablePixelsX||0);m=this.chartHeight+(this.scrollablePixelsY||0);a.stop(this.container);this.container.style.width=A+\"px\";this.container.style.height=m+\"px\";this.renderer.boxWrapper.attr({width:A,height:m,viewBox:[0,0,A,m].join(\" \")});this.chartBackground.attr({width:A,height:m});\nthis.scrollablePixelsY&&(this.scrollingContainer.style.height=this.chartHeight+\"px\");g&&(v.scrollPositionX&&(this.scrollingContainer.scrollLeft=this.scrollablePixelsX*v.scrollPositionX),v.scrollPositionY&&(this.scrollingContainer.scrollTop=this.scrollablePixelsY*v.scrollPositionY));m=this.axisOffset;g=this.plotTop-m[0]-1;v=this.plotLeft-m[3]-1;A=this.plotTop+this.plotHeight+m[2]+1;m=this.plotLeft+this.plotWidth+m[1]+1;var x=this.plotLeft+this.plotWidth-(this.scrollablePixelsX||0),y=this.plotTop+this.plotHeight-\n(this.scrollablePixelsY||0),g=this.scrollablePixelsX?[\"M\",0,g,\"L\",this.plotLeft-1,g,\"L\",this.plotLeft-1,A,\"L\",0,A,\"Z\",\"M\",x,g,\"L\",this.chartWidth,g,\"L\",this.chartWidth,A,\"L\",x,A,\"Z\"]:this.scrollablePixelsY?[\"M\",v,0,\"L\",v,this.plotTop-1,\"L\",m,this.plotTop-1,\"L\",m,0,\"Z\",\"M\",v,y,\"L\",v,this.chartHeight,\"L\",m,this.chartHeight,\"L\",m,y,\"Z\"]:[\"M\",0,0];\"adjustHeight\"!==this.redrawTrigger&&this.scrollableMask.attr({d:g})}});I(H,\"parts/Point.js\",[H[\"parts/Globals.js\"]],function(a){var C,A=a.extend,E=a.erase,\nm=a.fireEvent,g=a.format,v=a.isArray,x=a.isNumber,y=a.pick,z=a.uniqueKey,n=a.defined,f=a.removeEvent;a.Point=C=function(){};a.Point.prototype={init:function(a,f,e){this.series=a;this.applyOptions(f,e);this.id=n(this.id)?this.id:z();this.resolveColor();a.chart.pointCount++;m(this,\"afterInit\");return this},resolveColor:function(){var a=this.series,f;f=a.chart.options.chart.colorCount;var e=a.chart.styledMode;e||this.options.color||(this.color=a.color);a.options.colorByPoint?(e||(f=a.options.colors||\na.chart.options.colors,this.color=this.color||f[a.colorCounter],f=f.length),e=a.colorCounter,a.colorCounter++,a.colorCounter===f&&(a.colorCounter=0)):e=a.colorIndex;this.colorIndex=y(this.colorIndex,e)},applyOptions:function(a,f){var e=this.series,b=e.options.pointValKey||e.pointValKey;a=C.prototype.optionsToObject.call(this,a);A(this,a);this.options=this.options?A(this.options,a):a;a.group&&delete this.group;a.dataLabels&&delete this.dataLabels;b&&(this.y=this[b]);if(this.isNull=y(this.isValid&&\n!this.isValid(),null===this.x||!x(this.y,!0)))this.formatPrefix=\"null\";this.selected&&(this.state=\"select\");\"name\"in this&&void 0===f&&e.xAxis&&e.xAxis.hasNames&&(this.x=e.xAxis.nameToX(this));void 0===this.x&&e&&(this.x=void 0===f?e.autoIncrement(this):f);return this},setNestedProperty:function(f,g,e){e.split(\".\").reduce(function(b,e,c,f){b[e]=f.length-1===c?g:a.isObject(b[e],!0)?b[e]:{};return b[e]},f);return f},optionsToObject:function(f){var h={},e=this.series,b=e.options.keys,l=b||e.pointArrayMap||\n[\"y\"],c=l.length,t=0,g=0;if(x(f)||null===f)h[l[0]]=f;else if(v(f))for(!b&&f.length>c&&(e=typeof f[0],\"string\"===e?h.name=f[0]:\"number\"===e&&(h.x=f[0]),t++);g<c;)b&&void 0===f[t]||(0<l[g].indexOf(\".\")?a.Point.prototype.setNestedProperty(h,f[t],l[g]):h[l[g]]=f[t]),t++,g++;else\"object\"===typeof f&&(h=f,f.dataLabels&&(e._hasPointLabels=!0),f.marker&&(e._hasPointMarkers=!0));return h},getClassName:function(){return\"highcharts-point\"+(this.selected?\" highcharts-point-select\":\"\")+(this.negative?\" highcharts-negative\":\n\"\")+(this.isNull?\" highcharts-null-point\":\"\")+(void 0!==this.colorIndex?\" highcharts-color-\"+this.colorIndex:\"\")+(this.options.className?\" \"+this.options.className:\"\")+(this.zone&&this.zone.className?\" \"+this.zone.className.replace(\"highcharts-negative\",\"\"):\"\")},getZone:function(){var a=this.series,f=a.zones,a=a.zoneAxis||\"y\",e=0,b;for(b=f[e];this[a]>=b.value;)b=f[++e];this.nonZonedColor||(this.nonZonedColor=this.color);this.color=b&&b.color&&!this.options.color?b.color:this.nonZonedColor;return b},\ndestroy:function(){var a=this.series.chart,g=a.hoverPoints,e;a.pointCount--;g&&(this.setState(),E(g,this),g.length||(a.hoverPoints=null));if(this===a.hoverPoint)this.onMouseOut();if(this.graphic||this.dataLabel||this.dataLabels)f(this),this.destroyElements();this.legendItem&&a.legend.destroyItem(this);for(e in this)this[e]=null},destroyElements:function(a){var f=this,e=[],b,h;a=a||{graphic:1,dataLabel:1};a.graphic&&e.push(\"graphic\",\"shadowGroup\");a.dataLabel&&e.push(\"dataLabel\",\"dataLabelUpper\",\"connector\");\nfor(h=e.length;h--;)b=e[h],f[b]&&(f[b]=f[b].destroy());[\"dataLabel\",\"connector\"].forEach(function(b){var c=b+\"s\";a[b]&&f[c]&&(f[c].forEach(function(a){a.element&&a.destroy()}),delete f[c])})},getLabelConfig:function(){return{x:this.category,y:this.y,color:this.color,colorIndex:this.colorIndex,key:this.name||this.category,series:this.series,point:this,percentage:this.percentage,total:this.total||this.stackTotal}},tooltipFormatter:function(a){var f=this.series,e=f.tooltipOptions,b=y(e.valueDecimals,\n\"\"),h=e.valuePrefix||\"\",c=e.valueSuffix||\"\";f.chart.styledMode&&(a=f.chart.tooltip.styledModeFormat(a));(f.pointArrayMap||[\"y\"]).forEach(function(e){e=\"{point.\"+e;if(h||c)a=a.replace(RegExp(e+\"}\",\"g\"),h+e+\"}\"+c);a=a.replace(RegExp(e+\"}\",\"g\"),e+\":,.\"+b+\"f}\")});return g(a,{point:this,series:this.series},f.chart.time)},firePointEvent:function(a,f,e){var b=this,h=this.series.options;(h.point.events[a]||b.options&&b.options.events&&b.options.events[a])&&this.importEvents();\"click\"===a&&h.allowPointSelect&&\n(e=function(a){b.select&&b.select(null,a.ctrlKey||a.metaKey||a.shiftKey)});m(this,a,f,e)},visible:!0}});I(H,\"parts/Series.js\",[H[\"parts/Globals.js\"]],function(a){var C=a.addEvent,A=a.animObject,E=a.arrayMax,m=a.arrayMin,g=a.correctFloat,v=a.defaultOptions,x=a.defaultPlotOptions,y=a.defined,z=a.erase,n=a.extend,f=a.fireEvent,h=a.isArray,r=a.isNumber,e=a.isString,b=a.merge,l=a.objectEach,c=a.pick,t=a.removeEvent,F=a.splat,w=a.SVGElement,B=a.syncTimeout,p=a.win;a.Series=a.seriesType(\"line\",null,{lineWidth:2,\nallowPointSelect:!1,showCheckbox:!1,animation:{duration:1E3},events:{},marker:{lineWidth:0,lineColor:\"#ffffff\",enabledThreshold:2,radius:4,states:{normal:{animation:!0},hover:{animation:{duration:50},enabled:!0,radiusPlus:2,lineWidthPlus:1},select:{fillColor:\"#cccccc\",lineColor:\"#000000\",lineWidth:2}}},point:{events:{}},dataLabels:{align:\"center\",formatter:function(){return null===this.y?\"\":a.numberFormat(this.y,-1)},padding:5,style:{fontSize:\"11px\",fontWeight:\"bold\",color:\"contrast\",textOutline:\"1px contrast\"},\nverticalAlign:\"bottom\",x:0,y:0},cropThreshold:300,opacity:1,pointRange:0,softThreshold:!0,states:{normal:{animation:!0},hover:{animation:{duration:50},lineWidthPlus:1,marker:{},halo:{size:10,opacity:.25}},select:{animation:{duration:0}},inactive:{animation:{duration:50},opacity:.2}},stickyTracking:!0,turboThreshold:1E3,findNearestPointBy:\"x\"},{isCartesian:!0,pointClass:a.Point,sorted:!0,requireSorting:!0,directTouch:!1,axisTypes:[\"xAxis\",\"yAxis\"],colorCounter:0,parallelArrays:[\"x\",\"y\"],coll:\"series\",\ncropShoulder:1,init:function(d,b){f(this,\"init\",{options:b});var k=this,e,p=d.series,q;k.chart=d;k.options=b=k.setOptions(b);k.linkedSeries=[];k.bindAxes();n(k,{name:b.name,state:\"\",visible:!1!==b.visible,selected:!0===b.selected});e=b.events;l(e,function(d,b){!a.isFunction(d)||k.hcEvents&&k.hcEvents[b]&&k.hcEvents[b].some(function(a){return a.fn===d})||C(k,b,d)});if(e&&e.click||b.point&&b.point.events&&b.point.events.click||b.allowPointSelect)d.runTrackerClick=!0;k.getColor();k.getSymbol();k.parallelArrays.forEach(function(a){k[a+\n\"Data\"]||(k[a+\"Data\"]=[])});k.points||k.setData(b.data,!1);k.isCartesian&&(d.hasCartesianSeries=!0);p.length&&(q=p[p.length-1]);k._i=c(q&&q._i,-1)+1;d.orderSeries(this.insert(p));f(this,\"afterInit\")},insert:function(a){var d=this.options.index,b;if(r(d)){for(b=a.length;b--;)if(d>=c(a[b].options.index,a[b]._i)){a.splice(b+1,0,this);break}-1===b&&a.unshift(this);b+=1}else a.push(this);return c(b,a.length-1)},bindAxes:function(){var d=this,b=d.options,c=d.chart,e;f(this,\"bindAxes\",null,function(){(d.axisTypes||\n[]).forEach(function(k){c[k].forEach(function(a){e=a.options;if(b[k]===e.index||void 0!==b[k]&&b[k]===e.id||void 0===b[k]&&0===e.index)d.insert(a.series),d[k]=a,a.isDirty=!0});d[k]||d.optionalAxis===k||a.error(18,!0,c)})})},updateParallelArrays:function(a,b){var d=a.series,c=arguments,k=r(b)?function(c){var k=\"y\"===c&&d.toYData?d.toYData(a):a[c];d[c+\"Data\"][b]=k}:function(a){Array.prototype[b].apply(d[a+\"Data\"],Array.prototype.slice.call(c,2))};d.parallelArrays.forEach(k)},hasData:function(){return this.visible&&\nvoid 0!==this.dataMax&&void 0!==this.dataMin||this.visible&&this.yData&&0<this.yData.length},autoIncrement:function(){var a=this.options,b=this.xIncrement,e,f=a.pointIntervalUnit,p=this.chart.time,b=c(b,a.pointStart,0);this.pointInterval=e=c(this.pointInterval,a.pointInterval,1);f&&(a=new p.Date(b),\"day\"===f?p.set(\"Date\",a,p.get(\"Date\",a)+e):\"month\"===f?p.set(\"Month\",a,p.get(\"Month\",a)+e):\"year\"===f&&p.set(\"FullYear\",a,p.get(\"FullYear\",a)+e),e=a.getTime()-b);this.xIncrement=b+e;return b},setOptions:function(a){var d=\nthis.chart,e=d.options,p=e.plotOptions,h=d.userOptions||{};a=b(a);var d=d.styledMode,q={plotOptions:p,userOptions:a};f(this,\"setOptions\",q);var l=h.plotOptions||{},g=q.plotOptions[this.type];this.userOptions=q.userOptions;h=b(g,p.series,h.plotOptions&&h.plotOptions[this.type],a);this.tooltipOptions=b(v.tooltip,v.plotOptions.series&&v.plotOptions.series.tooltip,v.plotOptions[this.type].tooltip,e.tooltip.userOptions,p.series&&p.series.tooltip,p[this.type].tooltip,a.tooltip);this.stickyTracking=c(a.stickyTracking,\nl[this.type]&&l[this.type].stickyTracking,l.series&&l.series.stickyTracking,this.tooltipOptions.shared&&!this.noSharedTooltip?!0:h.stickyTracking);null===g.marker&&delete h.marker;this.zoneAxis=h.zoneAxis;e=this.zones=(h.zones||[]).slice();!h.negativeColor&&!h.negativeFillColor||h.zones||(p={value:h[this.zoneAxis+\"Threshold\"]||h.threshold||0,className:\"highcharts-negative\"},d||(p.color=h.negativeColor,p.fillColor=h.negativeFillColor),e.push(p));e.length&&y(e[e.length-1].value)&&e.push(d?{}:{color:this.color,\nfillColor:this.fillColor});f(this,\"afterSetOptions\",{options:h});return h},getName:function(){return c(this.options.name,\"Series \"+(this.index+1))},getCyclic:function(a,b,e){var d,k=this.chart,u=this.userOptions,f=a+\"Index\",p=a+\"Counter\",h=e?e.length:c(k.options.chart[a+\"Count\"],k[a+\"Count\"]);b||(d=c(u[f],u[\"_\"+f]),y(d)||(k.series.length||(k[p]=0),u[\"_\"+f]=d=k[p]%h,k[p]+=1),e&&(b=e[d]));void 0!==d&&(this[f]=d);this[a]=b},getColor:function(){this.chart.styledMode?this.getCyclic(\"color\"):this.options.colorByPoint?\nthis.options.color=null:this.getCyclic(\"color\",this.options.color||x[this.type].color,this.chart.options.colors)},getSymbol:function(){this.getCyclic(\"symbol\",this.options.marker.symbol,this.chart.options.symbols)},findPointIndex:function(a,b){var d=a.id;a=a.x;var c=this.points,e,k;d&&(k=(d=this.chart.get(d))&&d.index,void 0!==k&&(e=!0));void 0===k&&r(a)&&(k=this.xData.indexOf(a,b));-1!==k&&void 0!==k&&this.cropped&&(k=k>=this.cropStart?k-this.cropStart:k);!e&&c[k]&&c[k].touched&&(k=void 0);return k},\ndrawLegendSymbol:a.LegendSymbolMixin.drawLineMarker,updateData:function(d){var b=this.options,c=this.points,e=[],f,q,p,h=this.requireSorting,l=d.length===c.length,g=!0;this.xIncrement=null;d.forEach(function(d,k){var u,q=a.defined(d)&&this.pointClass.prototype.optionsToObject.call({series:this},d)||{};u=q.x;if(q.id||r(u))if(u=this.findPointIndex(q,p),-1===u||void 0===u?e.push(d):c[u]&&d!==b.data[u]?(c[u].update(d,!1,null,!1),c[u].touched=!0,h&&(p=u+1)):c[u]&&(c[u].touched=!0),!l||k!==u||this.hasDerivedData)f=\n!0},this);if(f)for(d=c.length;d--;)(q=c[d])&&!q.touched&&q.remove(!1);else l?d.forEach(function(a,d){c[d].update&&a!==c[d].y&&c[d].update(a,!1,null,!1)}):g=!1;c.forEach(function(a){a&&(a.touched=!1)});if(!g)return!1;e.forEach(function(a){this.addPoint(a,!1,null,null,!1)},this);return!0},setData:function(d,b,u,f){var k=this,q=k.points,p=q&&q.length||0,l,g=k.options,t=k.chart,w=null,D=k.xAxis,n=g.turboThreshold,m=this.xData,B=this.yData,F=(l=k.pointArrayMap)&&l.length,v=g.keys,x=0,y=1,z;d=d||[];l=d.length;\nb=c(b,!0);!1!==f&&l&&p&&!k.cropped&&!k.hasGroupedData&&k.visible&&!k.isSeriesBoosting&&(z=this.updateData(d));if(!z){k.xIncrement=null;k.colorCounter=0;this.parallelArrays.forEach(function(a){k[a+\"Data\"].length=0});if(n&&l>n){for(u=0;null===w&&u<l;)w=d[u],u++;if(r(w))for(u=0;u<l;u++)m[u]=this.autoIncrement(),B[u]=d[u];else if(h(w))if(F)for(u=0;u<l;u++)w=d[u],m[u]=w[0],B[u]=w.slice(1,F+1);else for(v&&(x=v.indexOf(\"x\"),y=v.indexOf(\"y\"),x=0<=x?x:0,y=0<=y?y:1),u=0;u<l;u++)w=d[u],m[u]=w[x],B[u]=w[y];else a.error(12,\n!1,t)}else for(u=0;u<l;u++)void 0!==d[u]&&(w={series:k},k.pointClass.prototype.applyOptions.apply(w,[d[u]]),k.updateParallelArrays(w,u));B&&e(B[0])&&a.error(14,!0,t);k.data=[];k.options.data=k.userOptions.data=d;for(u=p;u--;)q[u]&&q[u].destroy&&q[u].destroy();D&&(D.minRange=D.userMinRange);k.isDirty=t.isDirtyBox=!0;k.isDirtyData=!!q;u=!1}\"point\"===g.legendType&&(this.processData(),this.generatePoints());b&&t.redraw(u)},processData:function(d){var b=this.xData,c=this.yData,e=b.length,f;f=0;var q,p,\nh=this.xAxis,l,g=this.options;l=g.cropThreshold;var t=this.getExtremesFromAll||g.getExtremesFromAll,r=this.isCartesian,g=h&&h.val2lin,w=h&&h.isLog,n=this.requireSorting,m,B;if(r&&!this.isDirty&&!h.isDirty&&!this.yAxis.isDirty&&!d)return!1;h&&(d=h.getExtremes(),m=d.min,B=d.max);r&&this.sorted&&!t&&(!l||e>l||this.forceCrop)&&(b[e-1]<m||b[0]>B?(b=[],c=[]):this.yData&&(b[0]<m||b[e-1]>B)&&(f=this.cropData(this.xData,this.yData,m,B),b=f.xData,c=f.yData,f=f.start,q=!0));for(l=b.length||1;--l;)e=w?g(b[l])-\ng(b[l-1]):b[l]-b[l-1],0<e&&(void 0===p||e<p)?p=e:0>e&&n&&(a.error(15,!1,this.chart),n=!1);this.cropped=q;this.cropStart=f;this.processedXData=b;this.processedYData=c;this.closestPointRange=p},cropData:function(a,b,e,f,p){var d=a.length,k=0,u=d,h;p=c(p,this.cropShoulder);for(h=0;h<d;h++)if(a[h]>=e){k=Math.max(0,h-p);break}for(e=h;e<d;e++)if(a[e]>f){u=e+p;break}return{xData:a.slice(k,u),yData:b.slice(k,u),start:k,end:u}},generatePoints:function(){var a=this.options,b=a.data,c=this.data,e,p=this.processedXData,\nq=this.processedYData,h=this.pointClass,l=p.length,g=this.cropStart||0,t,r=this.hasGroupedData,a=a.keys,w,m=[],B;c||r||(c=[],c.length=b.length,c=this.data=c);a&&r&&(this.options.keys=!1);for(B=0;B<l;B++)t=g+B,r?(w=(new h).init(this,[p[B]].concat(F(q[B]))),w.dataGroup=this.groupMap[B],w.dataGroup.options&&(w.options=w.dataGroup.options,n(w,w.dataGroup.options),delete w.dataLabels)):(w=c[t])||void 0===b[t]||(c[t]=w=(new h).init(this,b[t],p[B])),w&&(w.index=t,m[B]=w);this.options.keys=a;if(c&&(l!==(e=\nc.length)||r))for(B=0;B<e;B++)B!==g||r||(B+=l),c[B]&&(c[B].destroyElements(),c[B].plotX=void 0);this.data=c;this.points=m;f(this,\"afterGeneratePoints\")},getXExtremes:function(a){return{min:m(a),max:E(a)}},getExtremes:function(a){var d=this.yAxis,b=this.processedXData,c,e=[],q=0;c=this.xAxis.getExtremes();var p=c.min,l=c.max,g,t,w=this.requireSorting?this.cropShoulder:0,n,B;a=a||this.stackedYData||this.processedYData||[];c=a.length;for(B=0;B<c;B++)if(t=b[B],n=a[B],g=(r(n,!0)||h(n))&&(!d.positiveValuesOnly||\nn.length||0<n),t=this.getExtremesFromAll||this.options.getExtremesFromAll||this.cropped||(b[B+w]||t)>=p&&(b[B-w]||t)<=l,g&&t)if(g=n.length)for(;g--;)\"number\"===typeof n[g]&&(e[q++]=n[g]);else e[q++]=n;this.dataMin=m(e);this.dataMax=E(e);f(this,\"afterGetExtremes\")},translate:function(){this.processedXData||this.processData();this.generatePoints();var a=this.options,b=a.stacking,e=this.xAxis,p=e.categories,l=this.yAxis,q=this.points,t=q.length,w=!!this.modifyValue,n,m=this.pointPlacementToXValue(),\nB=r(m),F=a.threshold,v=a.startFromThreshold?F:0,x,z,A,C,E=this.zoneAxis||\"y\",H=Number.MAX_VALUE;for(n=0;n<t;n++){var I=q[n],U=I.x;z=I.y;var T=I.low,X=b&&l.stacks[(this.negStacks&&z<(v?0:F)?\"-\":\"\")+this.stackKey],Y,V;l.positiveValuesOnly&&null!==z&&0>=z&&(I.isNull=!0);I.plotX=x=g(Math.min(Math.max(-1E5,e.translate(U,0,0,0,1,m,\"flags\"===this.type)),1E5));b&&this.visible&&!I.isNull&&X&&X[U]&&(C=this.getStackIndicator(C,U,this.index),Y=X[U],V=Y.points[C.key]);h(V)&&(T=V[0],z=V[1],T===v&&C.key===X[U].base&&\n(T=c(r(F)&&F,l.min)),l.positiveValuesOnly&&0>=T&&(T=null),I.total=I.stackTotal=Y.total,I.percentage=Y.total&&I.y/Y.total*100,I.stackY=z,Y.setOffset(this.pointXOffset||0,this.barW||0));I.yBottom=y(T)?Math.min(Math.max(-1E5,l.translate(T,0,1,0,1)),1E5):null;w&&(z=this.modifyValue(z,I));I.plotY=z=\"number\"===typeof z&&Infinity!==z?Math.min(Math.max(-1E5,l.translate(z,0,1,0,1)),1E5):void 0;I.isInside=void 0!==z&&0<=z&&z<=l.len&&0<=x&&x<=e.len;I.clientX=B?g(e.translate(U,0,0,0,1,m)):x;I.negative=I[E]<(a[E+\n\"Threshold\"]||F||0);I.category=p&&void 0!==p[I.x]?p[I.x]:I.x;I.isNull||(void 0!==A&&(H=Math.min(H,Math.abs(x-A))),A=x);I.zone=this.zones.length&&I.getZone()}this.closestPointRangePx=H;f(this,\"afterTranslate\")},getValidPoints:function(a,b,c){var d=this.chart;return(a||this.points||[]).filter(function(a){return b&&!d.isInsidePlot(a.plotX,a.plotY,d.inverted)?!1:c||!a.isNull})},getClipBox:function(a,b){var d=this.options,c=this.chart,e=c.inverted,k=this.xAxis,f=k&&this.yAxis;a&&!1===d.clip&&f?a=e?{y:-c.chartWidth+\nf.len+f.pos,height:c.chartWidth,width:c.chartHeight,x:-c.chartHeight+k.len+k.pos}:{y:-f.pos,height:c.chartHeight,width:c.chartWidth,x:-k.pos}:(a=this.clipBox||c.clipBox,b&&(a.width=c.plotSizeX,a.x=0));return b?{width:a.width,x:a.x}:a},setClip:function(a){var d=this.chart,b=this.options,c=d.renderer,e=d.inverted,f=this.clipBox,p=this.getClipBox(a),h=this.sharedClipKey||[\"_sharedClip\",a&&a.duration,a&&a.easing,p.height,b.xAxis,b.yAxis].join(),l=d[h],g=d[h+\"m\"];l||(a&&(p.width=0,e&&(p.x=d.plotSizeX+\n(!1!==b.clip?0:d.plotTop)),d[h+\"m\"]=g=c.clipRect(e?d.plotSizeX+99:-99,e?-d.plotLeft:-d.plotTop,99,e?d.chartWidth:d.chartHeight)),d[h]=l=c.clipRect(p),l.count={length:0});a&&!l.count[this.index]&&(l.count[this.index]=!0,l.count.length+=1);if(!1!==b.clip||a)this.group.clip(a||f?l:d.clipRect),this.markerGroup.clip(g),this.sharedClipKey=h;a||(l.count[this.index]&&(delete l.count[this.index],--l.count.length),0===l.count.length&&h&&d[h]&&(f||(d[h]=d[h].destroy()),d[h+\"m\"]&&(d[h+\"m\"]=d[h+\"m\"].destroy())))},\nanimate:function(a){var d=this.chart,b=A(this.options.animation),c,e;a?this.setClip(b):(c=this.sharedClipKey,a=d[c],e=this.getClipBox(b,!0),a&&a.animate(e,b),d[c+\"m\"]&&d[c+\"m\"].animate({width:e.width+99,x:e.x-(d.inverted?0:99)},b),this.animate=null)},afterAnimate:function(){this.setClip();f(this,\"afterAnimate\");this.finishedAnimating=!0},drawPoints:function(){var a=this.points,b=this.chart,e,f,p,q,h,l=this.options.marker,g,t,r,w=this[this.specialGroup]||this.markerGroup;e=this.xAxis;var n,m=c(l.enabled,\n!e||e.isRadial?!0:null,this.closestPointRangePx>=l.enabledThreshold*l.radius);if(!1!==l.enabled||this._hasPointMarkers)for(e=0;e<a.length;e++)if(f=a[e],h=(q=f.graphic)?\"animate\":\"attr\",g=f.marker||{},t=!!f.marker,p=m&&void 0===g.enabled||g.enabled,r=!1!==f.isInside,p&&!f.isNull){p=c(g.symbol,this.symbol);n=this.markerAttribs(f,f.selected&&\"select\");q?q[r?\"show\":\"hide\"](!0).animate(n):r&&(0<n.width||f.hasImage)&&(f.graphic=q=b.renderer.symbol(p,n.x,n.y,n.width,n.height,t?g:l).add(w));if(q&&!b.styledMode)q[h](this.pointAttribs(f,\nf.selected&&\"select\"));q&&q.addClass(f.getClassName(),!0)}else q&&(f.graphic=q.destroy())},markerAttribs:function(a,b){var d=this.options.marker,e=a.marker||{},k=e.symbol||d.symbol,f=c(e.radius,d.radius);b&&(d=d.states[b],b=e.states&&e.states[b],f=c(b&&b.radius,d&&d.radius,f+(d&&d.radiusPlus||0)));a.hasImage=k&&0===k.indexOf(\"url\");a.hasImage&&(f=0);a={x:Math.floor(a.plotX)-f,y:a.plotY-f};f&&(a.width=a.height=2*f);return a},pointAttribs:function(a,b){var d=this.options.marker,e=a&&a.options,k=e&&\ne.marker||{},f=this.color,p=e&&e.color,h=a&&a.color,e=c(k.lineWidth,d.lineWidth),l=a&&a.zone&&a.zone.color;a=1;f=p||l||h||f;p=k.fillColor||d.fillColor||f;f=k.lineColor||d.lineColor||f;b=b||\"normal\";d=d.states[b];b=k.states&&k.states[b]||{};e=c(b.lineWidth,d.lineWidth,e+c(b.lineWidthPlus,d.lineWidthPlus,0));p=b.fillColor||d.fillColor||p;f=b.lineColor||d.lineColor||f;a=c(b.opacity,d.opacity,a);return{stroke:f,\"stroke-width\":e,fill:p,opacity:a}},destroy:function(d){var b=this,c=b.chart,e=/AppleWebKit\\/533/.test(p.navigator.userAgent),\nh,q,g=b.data||[],r,n;f(b,\"destroy\");d||t(b);(b.axisTypes||[]).forEach(function(a){(n=b[a])&&n.series&&(z(n.series,b),n.isDirty=n.forceRedraw=!0)});b.legendItem&&b.chart.legend.destroyItem(b);for(q=g.length;q--;)(r=g[q])&&r.destroy&&r.destroy();b.points=null;a.clearTimeout(b.animationTimeout);l(b,function(a,d){a instanceof w&&!a.survive&&(h=e&&\"group\"===d?\"hide\":\"destroy\",a[h]())});c.hoverSeries===b&&(c.hoverSeries=null);z(c.series,b);c.orderSeries();l(b,function(a,c){d&&\"hcEvents\"===c||delete b[c]})},\ngetGraphPath:function(a,b,c){var d=this,e=d.options,k=e.step,f,p=[],h=[],u;a=a||d.points;(f=a.reversed)&&a.reverse();(k={right:1,center:2}[k]||k&&3)&&f&&(k=4-k);!e.connectNulls||b||c||(a=this.getValidPoints(a));a.forEach(function(f,q){var l=f.plotX,g=f.plotY,t=a[q-1];(f.leftCliff||t&&t.rightCliff)&&!c&&(u=!0);f.isNull&&!y(b)&&0<q?u=!e.connectNulls:f.isNull&&!b?u=!0:(0===q||u?q=[\"M\",f.plotX,f.plotY]:d.getPointSpline?q=d.getPointSpline(a,f,q):k?(q=1===k?[\"L\",t.plotX,g]:2===k?[\"L\",(t.plotX+l)/2,t.plotY,\n\"L\",(t.plotX+l)/2,g]:[\"L\",l,t.plotY],q.push(\"L\",l,g)):q=[\"L\",l,g],h.push(f.x),k&&(h.push(f.x),2===k&&h.push(f.x)),p.push.apply(p,q),u=!1)});p.xMap=h;return d.graphPath=p},drawGraph:function(){var a=this,b=this.options,c=(this.gappedPath||this.getGraphPath).call(this),e=this.chart.styledMode,f=[[\"graph\",\"highcharts-graph\"]];e||f[0].push(b.lineColor||this.color||\"#cccccc\",b.dashStyle);f=a.getZonesGraphs(f);f.forEach(function(d,k){var f=d[0],p=a[f],h=p?\"animate\":\"attr\";p?(p.endX=a.preventGraphAnimation?\nnull:c.xMap,p.animate({d:c})):c.length&&(a[f]=p=a.chart.renderer.path(c).addClass(d[1]).attr({zIndex:1}).add(a.group));p&&!e&&(f={stroke:d[2],\"stroke-width\":b.lineWidth,fill:a.fillGraph&&a.color||\"none\"},d[3]?f.dashstyle=d[3]:\"square\"!==b.linecap&&(f[\"stroke-linecap\"]=f[\"stroke-linejoin\"]=\"round\"),p[h](f).shadow(2>k&&b.shadow));p&&(p.startX=c.xMap,p.isArea=c.isArea)})},getZonesGraphs:function(a){this.zones.forEach(function(d,b){b=[\"zone-graph-\"+b,\"highcharts-graph highcharts-zone-graph-\"+b+\" \"+(d.className||\n\"\")];this.chart.styledMode||b.push(d.color||this.color,d.dashStyle||this.options.dashStyle);a.push(b)},this);return a},applyZones:function(){var a=this,b=this.chart,e=b.renderer,f=this.zones,p,h,l=this.clips||[],g,t=this.graph,r=this.area,w=Math.max(b.chartWidth,b.chartHeight),n=this[(this.zoneAxis||\"y\")+\"Axis\"],m,B,F=b.inverted,v,x,y,z,A=!1;f.length&&(t||r)&&n&&void 0!==n.min?(B=n.reversed,v=n.horiz,t&&!this.showLine&&t.hide(),r&&r.hide(),m=n.getExtremes(),f.forEach(function(d,k){p=B?v?b.plotWidth:\n0:v?0:n.toPixels(m.min)||0;p=Math.min(Math.max(c(h,p),0),w);h=Math.min(Math.max(Math.round(n.toPixels(c(d.value,m.max),!0)||0),0),w);A&&(p=h=n.toPixels(m.max));x=Math.abs(p-h);y=Math.min(p,h);z=Math.max(p,h);n.isXAxis?(g={x:F?z:y,y:0,width:x,height:w},v||(g.x=b.plotHeight-g.x)):(g={x:0,y:F?z:y,width:w,height:x},v&&(g.y=b.plotWidth-g.y));F&&e.isVML&&(g=n.isXAxis?{x:0,y:B?y:z,height:g.width,width:b.chartWidth}:{x:g.y-b.plotLeft-b.spacingBox.x,y:0,width:g.height,height:b.chartHeight});l[k]?l[k].animate(g):\nl[k]=e.clipRect(g);t&&a[\"zone-graph-\"+k].clip(l[k]);r&&a[\"zone-area-\"+k].clip(l[k]);A=d.value>m.max;a.resetZones&&0===h&&(h=void 0)}),this.clips=l):a.visible&&(t&&t.show(!0),r&&r.show(!0))},invertGroups:function(a){function d(){[\"group\",\"markerGroup\"].forEach(function(d){b[d]&&(c.renderer.isVML&&b[d].attr({width:b.yAxis.len,height:b.xAxis.len}),b[d].width=b.yAxis.len,b[d].height=b.xAxis.len,b[d].invert(a))})}var b=this,c=b.chart,e;b.xAxis&&(e=C(c,\"resize\",d),C(b,\"destroy\",e),d(a),b.invertGroups=d)},\nplotGroup:function(a,b,c,e,f){var d=this[a],k=!d;k&&(this[a]=d=this.chart.renderer.g().attr({zIndex:e||.1}).add(f));d.addClass(\"highcharts-\"+b+\" highcharts-series-\"+this.index+\" highcharts-\"+this.type+\"-series \"+(y(this.colorIndex)?\"highcharts-color-\"+this.colorIndex+\" \":\"\")+(this.options.className||\"\")+(d.hasClass(\"highcharts-tracker\")?\" highcharts-tracker\":\"\"),!0);d.attr({visibility:c})[k?\"attr\":\"animate\"](this.getPlotBox());return d},getPlotBox:function(){var a=this.chart,b=this.xAxis,c=this.yAxis;\na.inverted&&(b=c,c=this.xAxis);return{translateX:b?b.left:a.plotLeft,translateY:c?c.top:a.plotTop,scaleX:1,scaleY:1}},render:function(){var a=this,b=a.chart,c,e=a.options,p=!!a.animate&&b.renderer.isSVG&&A(e.animation).duration,h=a.visible?\"inherit\":\"hidden\",l=e.zIndex,g=a.hasRendered,t=b.seriesGroup,r=b.inverted;f(this,\"render\");c=a.plotGroup(\"group\",\"series\",h,l,t);a.markerGroup=a.plotGroup(\"markerGroup\",\"markers\",h,l,t);p&&a.animate(!0);c.inverted=a.isCartesian||a.invertable?r:!1;a.drawGraph&&\n(a.drawGraph(),a.applyZones());a.visible&&a.drawPoints();a.drawDataLabels&&a.drawDataLabels();a.redrawPoints&&a.redrawPoints();a.drawTracker&&!1!==a.options.enableMouseTracking&&a.drawTracker();a.invertGroups(r);!1===e.clip||a.sharedClipKey||g||c.clip(b.clipRect);p&&a.animate();g||(a.animationTimeout=B(function(){a.afterAnimate()},p));a.isDirty=!1;a.hasRendered=!0;f(a,\"afterRender\")},redraw:function(){var a=this.chart,b=this.isDirty||this.isDirtyData,e=this.group,f=this.xAxis,p=this.yAxis;e&&(a.inverted&&\ne.attr({width:a.plotWidth,height:a.plotHeight}),e.animate({translateX:c(f&&f.left,a.plotLeft),translateY:c(p&&p.top,a.plotTop)}));this.translate();this.render();b&&delete this.kdTree},kdAxisArray:[\"clientX\",\"plotY\"],searchPoint:function(a,b){var d=this.xAxis,c=this.yAxis,e=this.chart.inverted;return this.searchKDTree({clientX:e?d.len-a.chartY+d.pos:a.chartX-d.pos,plotY:e?c.len-a.chartX+c.pos:a.chartY-c.pos},b,a)},buildKDTree:function(a){function b(a,c,e){var k,f;if(f=a&&a.length)return k=d.kdAxisArray[c%\ne],a.sort(function(a,b){return a[k]-b[k]}),f=Math.floor(f/2),{point:a[f],left:b(a.slice(0,f),c+1,e),right:b(a.slice(f+1),c+1,e)}}this.buildingKdTree=!0;var d=this,c=-1<d.options.findNearestPointBy.indexOf(\"y\")?2:1;delete d.kdTree;B(function(){d.kdTree=b(d.getValidPoints(null,!d.directTouch),c,c);d.buildingKdTree=!1},d.options.kdNow||a&&\"touchstart\"===a.type?0:1)},searchKDTree:function(a,b,c){function d(a,b,c,h){var l=b.point,q=e.kdAxisArray[c%h],u,g,t=l;g=y(a[k])&&y(l[k])?Math.pow(a[k]-l[k],2):null;\nu=y(a[f])&&y(l[f])?Math.pow(a[f]-l[f],2):null;u=(g||0)+(u||0);l.dist=y(u)?Math.sqrt(u):Number.MAX_VALUE;l.distX=y(g)?Math.sqrt(g):Number.MAX_VALUE;q=a[q]-l[q];u=0>q?\"left\":\"right\";g=0>q?\"right\":\"left\";b[u]&&(u=d(a,b[u],c+1,h),t=u[p]<t[p]?u:l);b[g]&&Math.sqrt(q*q)<t[p]&&(a=d(a,b[g],c+1,h),t=a[p]<t[p]?a:t);return t}var e=this,k=this.kdAxisArray[0],f=this.kdAxisArray[1],p=b?\"distX\":\"dist\";b=-1<e.options.findNearestPointBy.indexOf(\"y\")?2:1;this.kdTree||this.buildingKdTree||this.buildKDTree(c);if(this.kdTree)return d(a,\nthis.kdTree,b,b)},pointPlacementToXValue:function(){var a=this.options.pointPlacement;\"between\"===a&&(a=.5);r(a)&&(a*=c(this.options.pointRange||this.xAxis.pointRange));return a}})});I(H,\"parts/Stacking.js\",[H[\"parts/Globals.js\"]],function(a){var C=a.Axis,A=a.Chart,E=a.correctFloat,m=a.defined,g=a.destroyObjectProperties,v=a.format,x=a.objectEach,y=a.pick,z=a.Series;a.StackItem=function(a,f,h,g,e){var b=a.chart.inverted;this.axis=a;this.isNegative=h;this.options=f;this.x=g;this.total=null;this.points=\n{};this.stack=e;this.rightCliff=this.leftCliff=0;this.alignOptions={align:f.align||(b?h?\"left\":\"right\":\"center\"),verticalAlign:f.verticalAlign||(b?\"middle\":h?\"bottom\":\"top\"),y:y(f.y,b?4:h?14:-6),x:y(f.x,b?h?-6:6:0)};this.textAlign=f.textAlign||(b?h?\"right\":\"left\":\"center\")};a.StackItem.prototype={destroy:function(){g(this,this.axis)},render:function(a){var f=this.axis.chart,h=this.options,g=h.format,g=g?v(g,this,f.time):h.formatter.call(this);this.label?this.label.attr({text:g,visibility:\"hidden\"}):\nthis.label=f.renderer.text(g,null,null,h.useHTML).css(h.style).attr({align:this.textAlign,rotation:h.rotation,visibility:\"hidden\"}).add(a);this.label.labelrank=f.plotHeight},setOffset:function(a,f,h,g){var e=this.axis,b=e.chart;g=e.translate(e.usePercentage?100:g?g:this.total,0,0,0,1);h=e.translate(h?h:0);h=m(g)&&Math.abs(g-h);a=b.xAxis[0].translate(this.x)+a;e=m(g)&&this.getStackBox(b,this,a,g,f,h,e);(f=this.label)&&e&&(f.align(this.alignOptions,null,e),e=f.alignAttr,f[!1===this.options.crop||b.isInsidePlot(e.x,\ne.y)?\"show\":\"hide\"](!0))},getStackBox:function(a,f,h,g,e,b,l){var c=f.axis.reversed,t=a.inverted;a=l.height+l.pos-(t?a.plotLeft:a.plotTop);f=f.isNegative&&!c||!f.isNegative&&c;return{x:t?f?g:g-b:h,y:t?a-h-e:f?a-g-b:a-g,width:t?b:e,height:t?e:b}}};A.prototype.getStacks=function(){var a=this;a.yAxis.forEach(function(a){a.stacks&&a.hasVisibleSeries&&(a.oldStacks=a.stacks)});a.series.forEach(function(f){!f.options.stacking||!0!==f.visible&&!1!==a.options.chart.ignoreHiddenSeries||(f.stackKey=f.type+y(f.options.stack,\n\"\"))})};C.prototype.buildStacks=function(){var a=this.series,f=y(this.options.reversedStacks,!0),h=a.length,g;if(!this.isXAxis){this.usePercentage=!1;for(g=h;g--;)a[f?g:h-g-1].setStackedPoints();for(g=0;g<h;g++)a[g].modifyStacks()}};C.prototype.renderStackTotals=function(){var a=this.chart,f=a.renderer,h=this.stacks,g=this.stackTotalGroup;g||(this.stackTotalGroup=g=f.g(\"stack-labels\").attr({visibility:\"visible\",zIndex:6}).add());g.translate(a.plotLeft,a.plotTop);x(h,function(a){x(a,function(a){a.render(g)})})};\nC.prototype.resetStacks=function(){var a=this,f=a.stacks;a.isXAxis||x(f,function(f){x(f,function(h,e){h.touched<a.stacksTouched?(h.destroy(),delete f[e]):(h.total=null,h.cumulative=null)})})};C.prototype.cleanStacks=function(){var a;this.isXAxis||(this.oldStacks&&(a=this.stacks=this.oldStacks),x(a,function(a){x(a,function(a){a.cumulative=a.total})}))};z.prototype.setStackedPoints=function(){if(this.options.stacking&&(!0===this.visible||!1===this.chart.options.chart.ignoreHiddenSeries)){var g=this.processedXData,\nf=this.processedYData,h=[],r=f.length,e=this.options,b=e.threshold,l=y(e.startFromThreshold&&b,0),c=e.stack,e=e.stacking,t=this.stackKey,F=\"-\"+t,w=this.negStacks,B=this.yAxis,p=B.stacks,d=B.oldStacks,k,u,D,G,q,v,x;B.stacksTouched+=1;for(q=0;q<r;q++)v=g[q],x=f[q],k=this.getStackIndicator(k,v,this.index),G=k.key,D=(u=w&&x<(l?0:b))?F:t,p[D]||(p[D]={}),p[D][v]||(d[D]&&d[D][v]?(p[D][v]=d[D][v],p[D][v].total=null):p[D][v]=new a.StackItem(B,B.options.stackLabels,u,v,c)),D=p[D][v],null!==x?(D.points[G]=D.points[this.index]=\n[y(D.cumulative,l)],m(D.cumulative)||(D.base=G),D.touched=B.stacksTouched,0<k.index&&!1===this.singleStacks&&(D.points[G][0]=D.points[this.index+\",\"+v+\",0\"][0])):D.points[G]=D.points[this.index]=null,\"percent\"===e?(u=u?t:F,w&&p[u]&&p[u][v]?(u=p[u][v],D.total=u.total=Math.max(u.total,D.total)+Math.abs(x)||0):D.total=E(D.total+(Math.abs(x)||0))):D.total=E(D.total+(x||0)),D.cumulative=y(D.cumulative,l)+(x||0),null!==x&&(D.points[G].push(D.cumulative),h[q]=D.cumulative);\"percent\"===e&&(B.usePercentage=\n!0);this.stackedYData=h;B.oldStacks={}}};z.prototype.modifyStacks=function(){var a=this,f=a.stackKey,h=a.yAxis.stacks,g=a.processedXData,e,b=a.options.stacking;a[b+\"Stacker\"]&&[f,\"-\"+f].forEach(function(f){for(var c=g.length,l,r;c--;)if(l=g[c],e=a.getStackIndicator(e,l,a.index,f),r=(l=h[f]&&h[f][l])&&l.points[e.key])a[b+\"Stacker\"](r,l,c)})};z.prototype.percentStacker=function(a,f,h){f=f.total?100/f.total:0;a[0]=E(a[0]*f);a[1]=E(a[1]*f);this.stackedYData[h]=a[1]};z.prototype.getStackIndicator=function(a,\nf,h,g){!m(a)||a.x!==f||g&&a.key!==g?a={x:f,index:0,key:g}:a.index++;a.key=[h,f,a.index].join();return a}});I(H,\"parts/Dynamics.js\",[H[\"parts/Globals.js\"]],function(a){var C=a.addEvent,A=a.animate,E=a.Axis,m=a.Chart,g=a.createElement,v=a.css,x=a.defined,y=a.erase,z=a.extend,n=a.fireEvent,f=a.isNumber,h=a.isObject,r=a.isArray,e=a.merge,b=a.objectEach,l=a.pick,c=a.Point,t=a.Series,F=a.seriesTypes,w=a.setAnimation,B=a.splat;a.cleanRecursively=function(c,d){var e={};b(c,function(b,k){if(h(c[k],!0)&&!c.nodeType&&\nd[k])b=a.cleanRecursively(c[k],d[k]),Object.keys(b).length&&(e[k]=b);else if(h(c[k])||c[k]!==d[k])e[k]=c[k]});return e};z(m.prototype,{addSeries:function(a,b,c){var d,e=this;a&&(b=l(b,!0),n(e,\"addSeries\",{options:a},function(){d=e.initSeries(a);e.isDirtyLegend=!0;e.linkSeries();n(e,\"afterAddSeries\",{series:d});b&&e.redraw(c)}));return d},addAxis:function(a,b,c,f){var d=b?\"xAxis\":\"yAxis\",k=this.options;a=e(a,{index:this[d].length,isX:b});b=new E(this,a);k[d]=B(k[d]||{});k[d].push(a);l(c,!0)&&this.redraw(f);\nreturn b},showLoading:function(a){var b=this,c=b.options,e=b.loadingDiv,f=c.loading,p=function(){e&&v(e,{left:b.plotLeft+\"px\",top:b.plotTop+\"px\",width:b.plotWidth+\"px\",height:b.plotHeight+\"px\"})};e||(b.loadingDiv=e=g(\"div\",{className:\"highcharts-loading highcharts-loading-hidden\"},null,b.container),b.loadingSpan=g(\"span\",{className:\"highcharts-loading-inner\"},null,e),C(b,\"redraw\",p));e.className=\"highcharts-loading\";b.loadingSpan.innerHTML=a||c.lang.loading;b.styledMode||(v(e,z(f.style,{zIndex:10})),\nv(b.loadingSpan,f.labelStyle),b.loadingShown||(v(e,{opacity:0,display:\"\"}),A(e,{opacity:f.style.opacity||.5},{duration:f.showDuration||0})));b.loadingShown=!0;p()},hideLoading:function(){var a=this.options,b=this.loadingDiv;b&&(b.className=\"highcharts-loading highcharts-loading-hidden\",this.styledMode||A(b,{opacity:0},{duration:a.loading.hideDuration||100,complete:function(){v(b,{display:\"none\"})}}));this.loadingShown=!1},propsRequireDirtyBox:\"backgroundColor borderColor borderWidth borderRadius plotBackgroundColor plotBackgroundImage plotBorderColor plotBorderWidth plotShadow shadow\".split(\" \"),\npropsRequireReflow:\"margin marginTop marginRight marginBottom marginLeft spacing spacingTop spacingRight spacingBottom spacingLeft\".split(\" \"),propsRequireUpdateSeries:\"chart.inverted chart.polar chart.ignoreHiddenSeries chart.type colors plotOptions time tooltip\".split(\" \"),collectionsWithUpdate:\"xAxis yAxis zAxis series colorAxis pane\".split(\" \"),update:function(c,d,k,h){var p=this,g={credits:\"addCredits\",title:\"setTitle\",subtitle:\"setSubtitle\"},q,u,t,r,w=[];n(p,\"update\",{options:c});c.isResponsiveOptions||\np.setResponsive(!1,!0);c=a.cleanRecursively(c,p.options);e(!0,p.userOptions,c);if(q=c.chart){e(!0,p.options.chart,q);\"className\"in q&&p.setClassName(q.className);\"reflow\"in q&&p.setReflow(q.reflow);if(\"inverted\"in q||\"polar\"in q||\"type\"in q)p.propFromSeries(),u=!0;\"alignTicks\"in q&&(u=!0);b(q,function(a,b){-1!==p.propsRequireUpdateSeries.indexOf(\"chart.\"+b)&&(t=!0);-1!==p.propsRequireDirtyBox.indexOf(b)&&(p.isDirtyBox=!0);-1!==p.propsRequireReflow.indexOf(b)&&(r=!0)});!p.styledMode&&\"style\"in q&&\np.renderer.setStyle(q.style)}!p.styledMode&&c.colors&&(this.options.colors=c.colors);c.plotOptions&&e(!0,this.options.plotOptions,c.plotOptions);c.time&&this.time===a.time&&(this.time=new a.Time(c.time));b(c,function(a,b){if(p[b]&&\"function\"===typeof p[b].update)p[b].update(a,!1);else if(\"function\"===typeof p[g[b]])p[g[b]](a);\"chart\"!==b&&-1!==p.propsRequireUpdateSeries.indexOf(b)&&(t=!0)});this.collectionsWithUpdate.forEach(function(a){var b;c[a]&&(\"series\"===a&&(b=[],p[a].forEach(function(a,d){a.options.isInternal||\nb.push(l(a.options.index,d))})),B(c[a]).forEach(function(d,c){(c=x(d.id)&&p.get(d.id)||p[a][b?b[c]:c])&&c.coll===a&&(c.update(d,!1),k&&(c.touched=!0));!c&&k&&p.collectionsWithInit[a]&&(p.collectionsWithInit[a][0].apply(p,[d].concat(p.collectionsWithInit[a][1]||[]).concat([!1])).touched=!0)}),k&&p[a].forEach(function(a){a.touched||a.options.isInternal?delete a.touched:w.push(a)}))});w.forEach(function(a){a.remove&&a.remove(!1)});u&&p.axes.forEach(function(a){a.update({},!1)});t&&p.series.forEach(function(a){a.update({},\n!1)});c.loading&&e(!0,p.options.loading,c.loading);u=q&&q.width;q=q&&q.height;a.isString(q)&&(q=a.relativeLength(q,u||p.chartWidth));r||f(u)&&u!==p.chartWidth||f(q)&&q!==p.chartHeight?p.setSize(u,q,h):l(d,!0)&&p.redraw(h);n(p,\"afterUpdate\",{options:c,redraw:d,animation:h})},setSubtitle:function(a){this.setTitle(void 0,a)}});m.prototype.collectionsWithInit={xAxis:[m.prototype.addAxis,[!0]],yAxis:[m.prototype.addAxis,[!1]],series:[m.prototype.addSeries]};z(c.prototype,{update:function(a,b,c,e){function d(){k.applyOptions(a);\nnull===k.y&&p&&(k.graphic=p.destroy());h(a,!0)&&(p&&p.element&&a&&a.marker&&void 0!==a.marker.symbol&&(k.graphic=p.destroy()),a&&a.dataLabels&&k.dataLabel&&(k.dataLabel=k.dataLabel.destroy()),k.connector&&(k.connector=k.connector.destroy()));g=k.index;f.updateParallelArrays(k,g);t.data[g]=h(t.data[g],!0)||h(a,!0)?k.options:l(a,t.data[g]);f.isDirty=f.isDirtyData=!0;!f.fixedBox&&f.hasCartesianSeries&&(u.isDirtyBox=!0);\"point\"===t.legendType&&(u.isDirtyLegend=!0);b&&u.redraw(c)}var k=this,f=k.series,\np=k.graphic,g,u=f.chart,t=f.options;b=l(b,!0);!1===e?d():k.firePointEvent(\"update\",{options:a},d)},remove:function(a,b){this.series.removePoint(this.series.data.indexOf(this),a,b)}});z(t.prototype,{addPoint:function(a,b,c,e,f){var d=this.options,k=this.data,p=this.chart,h=this.xAxis,h=h&&h.hasNames&&h.names,g=d.data,u,t=this.xData,r,w,m;b=l(b,!0);u={series:this};this.pointClass.prototype.applyOptions.apply(u,[a]);m=u.x;w=t.length;if(this.requireSorting&&m<t[w-1])for(r=!0;w&&t[w-1]>m;)w--;this.updateParallelArrays(u,\n\"splice\",w,0,0);this.updateParallelArrays(u,w);h&&u.name&&(h[m]=u.name);g.splice(w,0,a);r&&(this.data.splice(w,0,null),this.processData());\"point\"===d.legendType&&this.generatePoints();c&&(k[0]&&k[0].remove?k[0].remove(!1):(k.shift(),this.updateParallelArrays(u,\"shift\"),g.shift()));!1!==f&&n(this,\"addPoint\",{point:u});this.isDirtyData=this.isDirty=!0;b&&p.redraw(e)},removePoint:function(a,b,c){var d=this,e=d.data,k=e[a],f=d.points,p=d.chart,h=function(){f&&f.length===e.length&&f.splice(a,1);e.splice(a,\n1);d.options.data.splice(a,1);d.updateParallelArrays(k||{series:d},\"splice\",a,1);k&&k.destroy();d.isDirty=!0;d.isDirtyData=!0;b&&p.redraw()};w(c,p);b=l(b,!0);k?k.firePointEvent(\"remove\",null,h):h()},remove:function(a,b,c,e){function d(){k.destroy(e);k.remove=null;f.isDirtyLegend=f.isDirtyBox=!0;f.linkSeries();l(a,!0)&&f.redraw(b)}var k=this,f=k.chart;!1!==c?n(k,\"remove\",null,d):d()},update:function(b,d){b=a.cleanRecursively(b,this.userOptions);n(this,\"update\",{options:b});var c=this,f=c.chart,h=c.userOptions,\np,g=c.initialType||c.type,t=b.type||h.type||f.options.chart.type,r=!(this.hasDerivedData||b.dataGrouping||t&&t!==this.type||void 0!==b.pointStart||b.pointInterval||b.pointIntervalUnit||b.keys),w=F[g].prototype,m,B=[\"group\",\"markerGroup\",\"dataLabelsGroup\",\"transformGroup\"],v=[\"navigatorSeries\",\"baseSeries\"],x=c.finishedAnimating&&{animation:!1},y={};r&&(v.push(\"data\",\"isDirtyData\",\"points\",\"processedXData\",\"processedYData\",\"xIncrement\",\"_hasPointMarkers\",\"_hasPointLabels\",\"mapMap\",\"mapData\",\"minY\",\n\"maxY\",\"minX\",\"maxX\"),!1!==b.visible&&v.push(\"area\",\"graph\"),c.parallelArrays.forEach(function(a){v.push(a+\"Data\")}),b.data&&this.setData(b.data,!1));b=e(h,x,{index:void 0===h.index?c.index:h.index,pointStart:l(h.pointStart,c.xData[0])},!r&&{data:c.options.data},b);v=B.concat(v);v.forEach(function(a){v[a]=c[a];delete c[a]});c.remove(!1,null,!1,!0);for(m in w)c[m]=void 0;F[t||g]?z(c,F[t||g].prototype):a.error(17,!0,f);v.forEach(function(a){c[a]=v[a]});c.init(f,b);r&&this.points&&(p=c.options,!1===\np.visible?(y.graphic=1,y.dataLabel=1):(p.marker&&!1===p.marker.enabled&&!c._hasPointMarkers&&(y.graphic=1),p.dataLabels&&!1===p.dataLabels.enabled&&!c._hasPointLabels&&(y.dataLabel=1)),this.points.forEach(function(a){a&&a.series&&(a.resolveColor(),Object.keys(y).length&&a.destroyElements(y),!1===p.showInLegend&&a.legendItem&&f.legend.destroyItem(a))},this));b.zIndex!==h.zIndex&&B.forEach(function(a){c[a]&&c[a].attr({zIndex:b.zIndex})});c.initialType=g;f.linkSeries();n(this,\"afterUpdate\");l(d,!0)&&\nf.redraw(r?void 0:!1)},setName:function(a){this.name=this.options.name=this.userOptions.name=a;this.chart.isDirtyLegend=!0}});z(E.prototype,{update:function(a,d){var c=this.chart,f=a&&a.events||{};a=e(this.userOptions,a);c.options[this.coll].indexOf&&(c.options[this.coll][c.options[this.coll].indexOf(this.userOptions)]=a);b(c.options[this.coll].events,function(a,b){\"undefined\"===typeof f[b]&&(f[b]=void 0)});this.destroy(!0);this.init(c,z(a,{events:f}));c.isDirtyBox=!0;l(d,!0)&&c.redraw()},remove:function(a){for(var b=\nthis.chart,c=this.coll,e=this.series,f=e.length;f--;)e[f]&&e[f].remove(!1);y(b.axes,this);y(b[c],this);r(b.options[c])?b.options[c].splice(this.options.index,1):delete b.options[c];b[c].forEach(function(a,b){a.options.index=a.userOptions.index=b});this.destroy();b.isDirtyBox=!0;l(a,!0)&&b.redraw()},setTitle:function(a,b){this.update({title:a},b)},setCategories:function(a,b){this.update({categories:a},b)}})});I(H,\"parts/AreaSeries.js\",[H[\"parts/Globals.js\"]],function(a){var C=a.color,A=a.pick,E=a.Series,\nm=a.seriesType;m(\"area\",\"line\",{softThreshold:!1,threshold:0},{singleStacks:!1,getStackPoints:function(g){var m=[],x=[],y=this.xAxis,z=this.yAxis,n=z.stacks[this.stackKey],f={},h=this.index,r=z.series,e=r.length,b,l=A(z.options.reversedStacks,!0)?1:-1,c;g=g||this.points;if(this.options.stacking){for(c=0;c<g.length;c++)g[c].leftNull=g[c].rightNull=null,f[g[c].x]=g[c];a.objectEach(n,function(a,b){null!==a.total&&x.push(b)});x.sort(function(a,b){return a-b});b=r.map(function(a){return a.visible});x.forEach(function(a,\ng){var t=0,r,p;if(f[a]&&!f[a].isNull)m.push(f[a]),[-1,1].forEach(function(d){var k=1===d?\"rightNull\":\"leftNull\",t=0,w=n[x[g+d]];if(w)for(c=h;0<=c&&c<e;)r=w.points[c],r||(c===h?f[a][k]=!0:b[c]&&(p=n[a].points[c])&&(t-=p[1]-p[0])),c+=l;f[a][1===d?\"rightCliff\":\"leftCliff\"]=t});else{for(c=h;0<=c&&c<e;){if(r=n[a].points[c]){t=r[1];break}c+=l}t=z.translate(t,0,1,0,1);m.push({isNull:!0,plotX:y.translate(a,0,0,0,1),x:a,plotY:t,yBottom:t})}})}return m},getGraphPath:function(g){var m=E.prototype.getGraphPath,\nx=this.options,y=x.stacking,z=this.yAxis,n,f,h=[],r=[],e=this.index,b,l=z.stacks[this.stackKey],c=x.threshold,t=z.getThreshold(x.threshold),F,x=a.pick(x.connectNulls,\"percent\"===y),w=function(a,f,d){var k=g[a];a=y&&l[k.x].points[e];var p=k[d+\"Null\"]||0;d=k[d+\"Cliff\"]||0;var w,n,k=!0;d||p?(w=(p?a[0]:a[1])+d,n=a[0]+d,k=!!p):!y&&g[f]&&g[f].isNull&&(w=n=c);void 0!==w&&(r.push({plotX:b,plotY:null===w?t:z.getThreshold(w),isNull:k,isCliff:!0}),h.push({plotX:b,plotY:null===n?t:z.getThreshold(n),doCurve:!1}))};\ng=g||this.points;y&&(g=this.getStackPoints(g));for(n=0;n<g.length;n++)if(f=g[n].isNull,b=A(g[n].rectPlotX,g[n].plotX),F=A(g[n].yBottom,t),!f||x)x||w(n,n-1,\"left\"),f&&!y&&x||(r.push(g[n]),h.push({x:n,plotX:b,plotY:F})),x||w(n,n+1,\"right\");n=m.call(this,r,!0,!0);h.reversed=!0;f=m.call(this,h,!0,!0);f.length&&(f[0]=\"L\");f=n.concat(f);m=m.call(this,r,!1,x);f.xMap=n.xMap;this.areaPath=f;return m},drawGraph:function(){this.areaPath=[];E.prototype.drawGraph.apply(this);var a=this,m=this.areaPath,x=this.options,\ny=[[\"area\",\"highcharts-area\",this.color,x.fillColor]];this.zones.forEach(function(g,n){y.push([\"zone-area-\"+n,\"highcharts-area highcharts-zone-area-\"+n+\" \"+g.className,g.color||a.color,g.fillColor||x.fillColor])});y.forEach(function(g){var n=g[0],f=a[n],h=f?\"animate\":\"attr\",r={};f?(f.endX=a.preventGraphAnimation?null:m.xMap,f.animate({d:m})):(r.zIndex=0,f=a[n]=a.chart.renderer.path(m).addClass(g[1]).add(a.group),f.isArea=!0);a.chart.styledMode||(r.fill=A(g[3],C(g[2]).setOpacity(A(x.fillOpacity,.75)).get()));\nf[h](r);f.startX=m.xMap;f.shiftUnit=x.step?2:1})},drawLegendSymbol:a.LegendSymbolMixin.drawRectangle})});I(H,\"parts/SplineSeries.js\",[H[\"parts/Globals.js\"]],function(a){var C=a.pick;a=a.seriesType;a(\"spline\",\"line\",{},{getPointSpline:function(a,E,m){var g=E.plotX,v=E.plotY,x=a[m-1];m=a[m+1];var y,z,n,f;if(x&&!x.isNull&&!1!==x.doCurve&&!E.isCliff&&m&&!m.isNull&&!1!==m.doCurve&&!E.isCliff){a=x.plotY;n=m.plotX;m=m.plotY;var h=0;y=(1.5*g+x.plotX)/2.5;z=(1.5*v+a)/2.5;n=(1.5*g+n)/2.5;f=(1.5*v+m)/2.5;n!==\ny&&(h=(f-z)*(n-g)/(n-y)+v-f);z+=h;f+=h;z>a&&z>v?(z=Math.max(a,v),f=2*v-z):z<a&&z<v&&(z=Math.min(a,v),f=2*v-z);f>m&&f>v?(f=Math.max(m,v),z=2*v-f):f<m&&f<v&&(f=Math.min(m,v),z=2*v-f);E.rightContX=n;E.rightContY=f}E=[\"C\",C(x.rightContX,x.plotX),C(x.rightContY,x.plotY),C(y,g),C(z,v),g,v];x.rightContX=x.rightContY=null;return E}})});I(H,\"parts/AreaSplineSeries.js\",[H[\"parts/Globals.js\"]],function(a){var C=a.seriesTypes.area.prototype,A=a.seriesType;A(\"areaspline\",\"spline\",a.defaultPlotOptions.area,{getStackPoints:C.getStackPoints,\ngetGraphPath:C.getGraphPath,drawGraph:C.drawGraph,drawLegendSymbol:a.LegendSymbolMixin.drawRectangle})});I(H,\"parts/ColumnSeries.js\",[H[\"parts/Globals.js\"]],function(a){var C=a.animObject,A=a.color,E=a.extend,m=a.defined,g=a.isNumber,v=a.merge,x=a.pick,y=a.Series,z=a.seriesType,n=a.svg;z(\"column\",\"line\",{borderRadius:0,crisp:!0,groupPadding:.2,marker:null,pointPadding:.1,minPointLength:0,cropThreshold:50,pointRange:null,states:{hover:{halo:!1,brightness:.1},select:{color:\"#cccccc\",borderColor:\"#000000\"}},\ndataLabels:{align:null,verticalAlign:null,y:null},softThreshold:!1,startFromThreshold:!0,stickyTracking:!1,tooltip:{distance:6},threshold:0,borderColor:\"#ffffff\"},{cropShoulder:0,directTouch:!0,trackerGroups:[\"group\",\"dataLabelsGroup\"],negStacks:!0,init:function(){y.prototype.init.apply(this,arguments);var a=this,h=a.chart;h.hasRendered&&h.series.forEach(function(f){f.type===a.type&&(f.isDirty=!0)})},getColumnMetrics:function(){var a=this,h=a.options,g=a.xAxis,e=a.yAxis,b=g.options.reversedStacks,\nb=g.reversed&&!b||!g.reversed&&b,l,c={},t=0;!1===h.grouping?t=1:a.chart.series.forEach(function(b){var d=b.options,k=b.yAxis,f;b.type!==a.type||!b.visible&&a.chart.options.chart.ignoreHiddenSeries||e.len!==k.len||e.pos!==k.pos||(d.stacking?(l=b.stackKey,void 0===c[l]&&(c[l]=t++),f=c[l]):!1!==d.grouping&&(f=t++),b.columnIndex=f)});var n=Math.min(Math.abs(g.transA)*(g.ordinalSlope||h.pointRange||g.closestPointRange||g.tickInterval||1),g.len),w=n*h.groupPadding,m=(n-2*w)/(t||1),h=Math.min(h.maxPointWidth||\ng.len,x(h.pointWidth,m*(1-2*h.pointPadding)));a.columnMetrics={width:h,offset:(m-h)/2+(w+((a.columnIndex||0)+(b?1:0))*m-n/2)*(b?-1:1)};return a.columnMetrics},crispCol:function(a,h,g,e){var b=this.chart,f=this.borderWidth,c=-(f%2?.5:0),f=f%2?.5:1;b.inverted&&b.renderer.isVML&&(f+=1);this.options.crisp&&(g=Math.round(a+g)+c,a=Math.round(a)+c,g-=a);e=Math.round(h+e)+f;c=.5>=Math.abs(h)&&.5<e;h=Math.round(h)+f;e-=h;c&&e&&(--h,e+=1);return{x:a,y:h,width:g,height:e}},translate:function(){var a=this,h=\na.chart,g=a.options,e=a.dense=2>a.closestPointRange*a.xAxis.transA,e=a.borderWidth=x(g.borderWidth,e?0:1),b=a.yAxis,l=g.threshold,c=a.translatedThreshold=b.getThreshold(l),t=x(g.minPointLength,5),n=a.getColumnMetrics(),w=n.width,B=a.barW=Math.max(w,1+2*e),p=a.pointXOffset=n.offset,d=a.dataMin,k=a.dataMax;h.inverted&&(c-=.5);g.pointPadding&&(B=Math.ceil(B));y.prototype.translate.apply(a);a.points.forEach(function(e){var f=x(e.yBottom,c),g=999+Math.abs(f),q=w,g=Math.min(Math.max(-g,e.plotY),b.len+g),\nu=e.plotX+p,r=B,n=Math.min(g,f),v,F=Math.max(g,f)-n;t&&Math.abs(F)<t&&(F=t,v=!b.reversed&&!e.negative||b.reversed&&e.negative,e.y===l&&a.dataMax<=l&&b.min<l&&d!==k&&(v=!v),n=Math.abs(n-c)>t?f-t:c-(v?t:0));m(e.options.pointWidth)&&(q=r=Math.ceil(e.options.pointWidth),u-=Math.round((q-w)/2));e.barX=u;e.pointWidth=q;e.tooltipPos=h.inverted?[b.len+b.pos-h.plotLeft-g,a.xAxis.len-u-r/2,F]:[u+r/2,g+b.pos-h.plotTop,F];e.shapeType=a.pointClass.prototype.shapeType||\"rect\";e.shapeArgs=a.crispCol.apply(a,e.isNull?\n[u,c,r,0]:[u,n,r,F])})},getSymbol:a.noop,drawLegendSymbol:a.LegendSymbolMixin.drawRectangle,drawGraph:function(){this.group[this.dense?\"addClass\":\"removeClass\"](\"highcharts-dense-data\")},pointAttribs:function(a,h){var f=this.options,e,b=this.pointAttrToOptions||{};e=b.stroke||\"borderColor\";var g=b[\"stroke-width\"]||\"borderWidth\",c=a&&a.color||this.color,t=a&&a[e]||f[e]||this.color||c,n=a&&a[g]||f[g]||this[g]||0,b=a&&a.dashStyle||f.dashStyle,w=x(f.opacity,1),m;a&&this.zones.length&&(m=a.getZone(),c=\na.options.color||m&&m.color||this.color,m&&(t=m.borderColor||t,b=m.dashStyle||b,n=m.borderWidth||n));h&&(a=v(f.states[h],a.options.states&&a.options.states[h]||{}),h=a.brightness,c=a.color||void 0!==h&&A(c).brighten(a.brightness).get()||c,t=a[e]||t,n=a[g]||n,b=a.dashStyle||b,w=x(a.opacity,w));e={fill:c,stroke:t,\"stroke-width\":n,opacity:w};b&&(e.dashstyle=b);return e},drawPoints:function(){var a=this,h=this.chart,r=a.options,e=h.renderer,b=r.animationLimit||250,l;a.points.forEach(function(c){var f=\nc.graphic,n=f&&h.pointCount<b?\"animate\":\"attr\";if(g(c.plotY)&&null!==c.y){l=c.shapeArgs;f&&f.element.nodeName!==c.shapeType&&(f=f.destroy());if(f)f[n](v(l));else c.graphic=f=e[c.shapeType](l).add(c.group||a.group);if(r.borderRadius)f[n]({r:r.borderRadius});h.styledMode||f[n](a.pointAttribs(c,c.selected&&\"select\")).shadow(!1!==c.allowShadow&&r.shadow,null,r.stacking&&!r.borderRadius);f.addClass(c.getClassName(),!0)}else f&&(c.graphic=f.destroy())})},animate:function(a){var f=this,g=this.yAxis,e=f.options,\nb=this.chart.inverted,l={},c=b?\"translateX\":\"translateY\",t;n&&(a?(l.scaleY=.001,a=Math.min(g.pos+g.len,Math.max(g.pos,g.toPixels(e.threshold))),b?l.translateX=a-g.len:l.translateY=a,f.clipBox&&f.setClip(),f.group.attr(l)):(t=f.group.attr(c),f.group.animate({scaleY:1},E(C(f.options.animation),{step:function(a,b){l[c]=t+b.pos*(g.pos-t);f.group.attr(l)}})),f.animate=null))},remove:function(){var a=this,h=a.chart;h.hasRendered&&h.series.forEach(function(f){f.type===a.type&&(f.isDirty=!0)});y.prototype.remove.apply(a,\narguments)}})});I(H,\"parts/BarSeries.js\",[H[\"parts/Globals.js\"]],function(a){a=a.seriesType;a(\"bar\",\"column\",null,{inverted:!0})});I(H,\"parts/ScatterSeries.js\",[H[\"parts/Globals.js\"]],function(a){var C=a.Series,A=a.seriesType;A(\"scatter\",\"line\",{lineWidth:0,findNearestPointBy:\"xy\",jitter:{x:0,y:0},marker:{enabled:!0},tooltip:{headerFormat:'\\x3cspan style\\x3d\"color:{point.color}\"\\x3e\\u25cf\\x3c/span\\x3e \\x3cspan style\\x3d\"font-size: 10px\"\\x3e {series.name}\\x3c/span\\x3e\\x3cbr/\\x3e',pointFormat:\"x: \\x3cb\\x3e{point.x}\\x3c/b\\x3e\\x3cbr/\\x3ey: \\x3cb\\x3e{point.y}\\x3c/b\\x3e\\x3cbr/\\x3e\"}},\n{sorted:!1,requireSorting:!1,noSharedTooltip:!0,trackerGroups:[\"group\",\"markerGroup\",\"dataLabelsGroup\"],takeOrdinalPosition:!1,drawGraph:function(){this.options.lineWidth&&C.prototype.drawGraph.call(this)},applyJitter:function(){var a=this,m=this.options.jitter,g=this.points.length;m&&this.points.forEach(function(v,x){[\"x\",\"y\"].forEach(function(y,z){var n,f=\"plot\"+y.toUpperCase(),h,r;m[y]&&!v.isNull&&(n=a[y+\"Axis\"],r=m[y]*n.transA,n&&!n.isLog&&(h=Math.max(0,v[f]-r),n=Math.min(n.len,v[f]+r),z=1E4*\nMath.sin(x+z*g),v[f]=h+(n-h)*(z-Math.floor(z)),\"x\"===y&&(v.clientX=v.plotX)))})})}});a.addEvent(C,\"afterTranslate\",function(){this.applyJitter&&this.applyJitter()})});I(H,\"mixins/centered-series.js\",[H[\"parts/Globals.js\"]],function(a){var C=a.deg2rad,A=a.isNumber,E=a.pick,m=a.relativeLength;a.CenteredSeriesMixin={getCenter:function(){var a=this.options,v=this.chart,x=2*(a.slicedOffset||0),y=v.plotWidth-2*x,v=v.plotHeight-2*x,z=a.center,z=[E(z[0],\"50%\"),E(z[1],\"50%\"),a.size||\"100%\",a.innerSize||0],\nn=Math.min(y,v),f,h;for(f=0;4>f;++f)h=z[f],a=2>f||2===f&&/%$/.test(h),z[f]=m(h,[y,v,n,z[2]][f])+(a?x:0);z[3]>z[2]&&(z[3]=z[2]);return z},getStartAndEndRadians:function(a,m){a=A(a)?a:0;m=A(m)&&m>a&&360>m-a?m:a+360;return{start:C*(a+-90),end:C*(m+-90)}}}});I(H,\"parts/PieSeries.js\",[H[\"parts/Globals.js\"]],function(a){var C=a.addEvent,A=a.CenteredSeriesMixin,E=a.defined,m=A.getStartAndEndRadians,g=a.merge,v=a.noop,x=a.pick,y=a.Point,z=a.Series,n=a.seriesType,f=a.setAnimation;n(\"pie\",\"line\",{center:[null,\nnull],clip:!1,colorByPoint:!0,dataLabels:{allowOverlap:!0,connectorPadding:5,distance:30,enabled:!0,formatter:function(){return this.point.isNull?void 0:this.point.name},softConnector:!0,x:0,connectorShape:\"fixedOffset\",crookDistance:\"70%\"},ignoreHiddenPoint:!0,inactiveOtherPoints:!0,legendType:\"point\",marker:null,size:null,showInLegend:!1,slicedOffset:10,stickyTracking:!1,tooltip:{followPointer:!0},borderColor:\"#ffffff\",borderWidth:1,states:{hover:{brightness:.1}}},{isCartesian:!1,requireSorting:!1,\ndirectTouch:!0,noSharedTooltip:!0,trackerGroups:[\"group\",\"dataLabelsGroup\"],axisTypes:[],pointAttribs:a.seriesTypes.column.prototype.pointAttribs,animate:function(a){var f=this,e=f.points,b=f.startAngleRad;a||(e.forEach(function(a){var c=a.graphic,e=a.shapeArgs;c&&(c.attr({r:a.startR||f.center[3]/2,start:b,end:b}),c.animate({r:e.r,start:e.start,end:e.end},f.options.animation))}),f.animate=null)},hasData:function(){return!!this.processedXData.length},updateTotals:function(){var a,f=0,e=this.points,\nb=e.length,g,c=this.options.ignoreHiddenPoint;for(a=0;a<b;a++)g=e[a],f+=c&&!g.visible?0:g.isNull?0:g.y;this.total=f;for(a=0;a<b;a++)g=e[a],g.percentage=0<f&&(g.visible||!c)?g.y/f*100:0,g.total=f},generatePoints:function(){z.prototype.generatePoints.call(this);this.updateTotals()},getX:function(a,f,e){var b=this.center,h=this.radii?this.radii[e.index]:b[2]/2;return b[0]+(f?-1:1)*Math.cos(Math.asin(Math.max(Math.min((a-b[1])/(h+e.labelDistance),1),-1)))*(h+e.labelDistance)+(0<e.labelDistance?(f?-1:\n1)*this.options.dataLabels.padding:0)},translate:function(f){this.generatePoints();var g=0,e=this.options,b=e.slicedOffset,h=b+(e.borderWidth||0),c,t,n=m(e.startAngle,e.endAngle),w=this.startAngleRad=n.start,n=(this.endAngleRad=n.end)-w,B=this.points,p,d,k=e.dataLabels.distance,e=e.ignoreHiddenPoint,u,D=B.length,v;f||(this.center=f=this.getCenter());for(u=0;u<D;u++){v=B[u];c=w+g*n;if(!e||v.visible)g+=v.percentage/100;t=w+g*n;v.shapeType=\"arc\";v.shapeArgs={x:f[0],y:f[1],r:f[2]/2,innerR:f[3]/2,start:Math.round(1E3*\nc)/1E3,end:Math.round(1E3*t)/1E3};v.labelDistance=x(v.options.dataLabels&&v.options.dataLabels.distance,k);v.labelDistance=a.relativeLength(v.labelDistance,v.shapeArgs.r);this.maxLabelDistance=Math.max(this.maxLabelDistance||0,v.labelDistance);t=(t+c)/2;t>1.5*Math.PI?t-=2*Math.PI:t<-Math.PI/2&&(t+=2*Math.PI);v.slicedTranslation={translateX:Math.round(Math.cos(t)*b),translateY:Math.round(Math.sin(t)*b)};p=Math.cos(t)*f[2]/2;d=Math.sin(t)*f[2]/2;v.tooltipPos=[f[0]+.7*p,f[1]+.7*d];v.half=t<-Math.PI/\n2||t>Math.PI/2?1:0;v.angle=t;c=Math.min(h,v.labelDistance/5);v.labelPosition={natural:{x:f[0]+p+Math.cos(t)*v.labelDistance,y:f[1]+d+Math.sin(t)*v.labelDistance},\"final\":{},alignment:0>v.labelDistance?\"center\":v.half?\"right\":\"left\",connectorPosition:{breakAt:{x:f[0]+p+Math.cos(t)*c,y:f[1]+d+Math.sin(t)*c},touchingSliceAt:{x:f[0]+p,y:f[1]+d}}}}},drawGraph:null,redrawPoints:function(){var a=this,f=a.chart,e=f.renderer,b,l,c,t,n=a.options.shadow;!n||a.shadowGroup||f.styledMode||(a.shadowGroup=e.g(\"shadow\").attr({zIndex:-1}).add(a.group));\na.points.forEach(function(h){var w={};l=h.graphic;if(!h.isNull&&l){t=h.shapeArgs;b=h.getTranslate();if(!f.styledMode){var p=h.shadowGroup;n&&!p&&(p=h.shadowGroup=e.g(\"shadow\").add(a.shadowGroup));p&&p.attr(b);c=a.pointAttribs(h,h.selected&&\"select\")}h.delayedRendering?(l.setRadialReference(a.center).attr(t).attr(b),f.styledMode||l.attr(c).attr({\"stroke-linejoin\":\"round\"}).shadow(n,p),h.delayedRendering=!1):(l.setRadialReference(a.center),f.styledMode||g(!0,w,c),g(!0,w,t,b),l.animate(w));l.attr({visibility:h.visible?\n\"inherit\":\"hidden\"});l.addClass(h.getClassName())}else l&&(h.graphic=l.destroy())})},drawPoints:function(){var a=this.chart.renderer;this.points.forEach(function(f){f.graphic||(f.graphic=a[f.shapeType](f.shapeArgs).add(f.series.group),f.delayedRendering=!0)})},searchPoint:v,sortByAngle:function(a,f){a.sort(function(a,b){return void 0!==a.angle&&(b.angle-a.angle)*f})},drawLegendSymbol:a.LegendSymbolMixin.drawRectangle,getCenter:A.getCenter,getSymbol:v},{init:function(){y.prototype.init.apply(this,\narguments);var a=this,f;a.name=x(a.name,\"Slice\");f=function(e){a.slice(\"select\"===e.type)};C(a,\"select\",f);C(a,\"unselect\",f);return a},isValid:function(){return a.isNumber(this.y,!0)&&0<=this.y},setVisible:function(a,f){var e=this,b=e.series,g=b.chart,c=b.options.ignoreHiddenPoint;f=x(f,c);a!==e.visible&&(e.visible=e.options.visible=a=void 0===a?!e.visible:a,b.options.data[b.data.indexOf(e)]=e.options,[\"graphic\",\"dataLabel\",\"connector\",\"shadowGroup\"].forEach(function(b){if(e[b])e[b][a?\"show\":\"hide\"](!0)}),\ne.legendItem&&g.legend.colorizeItem(e,a),a||\"hover\"!==e.state||e.setState(\"\"),c&&(b.isDirty=!0),f&&g.redraw())},slice:function(a,g,e){var b=this.series;f(e,b.chart);x(g,!0);this.sliced=this.options.sliced=E(a)?a:!this.sliced;b.options.data[b.data.indexOf(this)]=this.options;this.graphic.animate(this.getTranslate());this.shadowGroup&&this.shadowGroup.animate(this.getTranslate())},getTranslate:function(){return this.sliced?this.slicedTranslation:{translateX:0,translateY:0}},haloPath:function(a){var f=\nthis.shapeArgs;return this.sliced||!this.visible?[]:this.series.chart.renderer.symbols.arc(f.x,f.y,f.r+a,f.r+a,{innerR:this.shapeArgs.r-1,start:f.start,end:f.end})},connectorShapes:{fixedOffset:function(a,f,e){var b=f.breakAt;f=f.touchingSliceAt;return[\"M\",a.x,a.y].concat(e.softConnector?[\"C\",a.x+(\"left\"===a.alignment?-5:5),a.y,2*b.x-f.x,2*b.y-f.y,b.x,b.y]:[\"L\",b.x,b.y]).concat([\"L\",f.x,f.y])},straight:function(a,f){f=f.touchingSliceAt;return[\"M\",a.x,a.y,\"L\",f.x,f.y]},crookedLine:function(f,g,e){g=\ng.touchingSliceAt;var b=this.series,h=b.center[0],c=b.chart.plotWidth,t=b.chart.plotLeft,b=f.alignment,r=this.shapeArgs.r;e=a.relativeLength(e.crookDistance,1);e=\"left\"===b?h+r+(c+t-h-r)*(1-e):t+(h-r)*e;h=[\"L\",e,f.y];if(\"left\"===b?e>f.x||e<g.x:e<f.x||e>g.x)h=[];return[\"M\",f.x,f.y].concat(h).concat([\"L\",g.x,g.y])}},getConnectorPath:function(){var a=this.labelPosition,f=this.series.options.dataLabels,e=f.connectorShape,b=this.connectorShapes;b[e]&&(e=b[e]);return e.call(this,{x:a.final.x,y:a.final.y,\nalignment:a.alignment},a.connectorPosition,f)}})});I(H,\"parts/DataLabels.js\",[H[\"parts/Globals.js\"]],function(a){var C=a.arrayMax,A=a.defined,E=a.extend,m=a.format,g=a.merge,v=a.noop,x=a.pick,y=a.relativeLength,z=a.Series,n=a.seriesTypes,f=a.stableSort,h=a.isArray,r=a.splat;a.distribute=function(e,b,g){function c(a,b){return a.target-b.target}var h,l=!0,w=e,r=[],p;p=0;var d=w.reducedLen||b;for(h=e.length;h--;)p+=e[h].size;if(p>d){f(e,function(a,b){return(b.rank||0)-(a.rank||0)});for(p=h=0;p<=d;)p+=\ne[h].size,h++;r=e.splice(h-1,e.length)}f(e,c);for(e=e.map(function(a){return{size:a.size,targets:[a.target],align:x(a.align,.5)}});l;){for(h=e.length;h--;)l=e[h],p=(Math.min.apply(0,l.targets)+Math.max.apply(0,l.targets))/2,l.pos=Math.min(Math.max(0,p-l.size*l.align),b-l.size);h=e.length;for(l=!1;h--;)0<h&&e[h-1].pos+e[h-1].size>e[h].pos&&(e[h-1].size+=e[h].size,e[h-1].targets=e[h-1].targets.concat(e[h].targets),e[h-1].align=.5,e[h-1].pos+e[h-1].size>b&&(e[h-1].pos=b-e[h-1].size),e.splice(h,1),l=\n!0)}w.push.apply(w,r);h=0;e.some(function(d){var c=0;if(d.targets.some(function(){w[h].pos=d.pos+c;if(Math.abs(w[h].pos-w[h].target)>g)return w.slice(0,h+1).forEach(function(a){delete a.pos}),w.reducedLen=(w.reducedLen||b)-.1*b,w.reducedLen>.1*b&&a.distribute(w,b,g),!0;c+=w[h].size;h++}))return!0});f(w,c)};z.prototype.drawDataLabels=function(){function e(a,b){var d=b.filter;return d?(b=d.operator,a=a[d.property],d=d.value,\"\\x3e\"===b&&a>d||\"\\x3c\"===b&&a<d||\"\\x3e\\x3d\"===b&&a>=d||\"\\x3c\\x3d\"===b&&a<=\nd||\"\\x3d\\x3d\"===b&&a==d||\"\\x3d\\x3d\\x3d\"===b&&a===d?!0:!1):!0}function b(a,b){var d=[],c;if(h(a)&&!h(b))d=a.map(function(a){return g(a,b)});else if(h(b)&&!h(a))d=b.map(function(b){return g(a,b)});else if(h(a)||h(b))for(c=Math.max(a.length,b.length);c--;)d[c]=g(a[c],b[c]);else d=g(a,b);return d}var f=this,c=f.chart,t=f.options,n=t.dataLabels,w=f.points,v,p=f.hasRendered||0,d,k=a.animObject(t.animation).duration,u=Math.min(k,200),D=!c.renderer.forExport&&x(n.defer,0<u),G=c.renderer,n=b(b(c.options.plotOptions&&\nc.options.plotOptions.series&&c.options.plotOptions.series.dataLabels,c.options.plotOptions&&c.options.plotOptions[f.type]&&c.options.plotOptions[f.type].dataLabels),n);a.fireEvent(this,\"drawDataLabels\");if(h(n)||n.enabled||f._hasPointLabels)d=f.plotGroup(\"dataLabelsGroup\",\"data-labels\",D&&!p?\"hidden\":\"inherit\",n.zIndex||6),D&&(d.attr({opacity:+p}),p||setTimeout(function(){var a=f.dataLabelsGroup;a&&(f.visible&&d.show(!0),a[t.animation?\"animate\":\"attr\"]({opacity:1},{duration:u}))},k-u)),w.forEach(function(k){v=\nr(b(n,k.dlOptions||k.options&&k.options.dataLabels));v.forEach(function(b,g){var p=b.enabled&&(!k.isNull||k.dataLabelOnNull)&&e(k,b),h,l,u,q,w=k.dataLabels?k.dataLabels[g]:k.dataLabel,r=k.connectors?k.connectors[g]:k.connector,n=!w;p&&(h=k.getLabelConfig(),l=x(b[k.formatPrefix+\"Format\"],b.format),h=A(l)?m(l,h,c.time):(b[k.formatPrefix+\"Formatter\"]||b.formatter).call(h,b),l=b.style,u=b.rotation,c.styledMode||(l.color=x(b.color,l.color,f.color,\"#000000\"),\"contrast\"===l.color&&(k.contrastColor=G.getContrast(k.color||\nf.color),l.color=b.inside||0>x(b.distance,k.labelDistance)||t.stacking?k.contrastColor:\"#000000\"),t.cursor&&(l.cursor=t.cursor)),q={r:b.borderRadius||0,rotation:u,padding:b.padding,zIndex:1},c.styledMode||(q.fill=b.backgroundColor,q.stroke=b.borderColor,q[\"stroke-width\"]=b.borderWidth),a.objectEach(q,function(a,b){void 0===a&&delete q[b]}));!w||p&&A(h)?p&&A(h)&&(w?q.text=h:(k.dataLabels=k.dataLabels||[],w=k.dataLabels[g]=u?G.text(h,0,-9999).addClass(\"highcharts-data-label\"):G.label(h,0,-9999,b.shape,\nnull,null,b.useHTML,null,\"data-label\"),g||(k.dataLabel=w),w.addClass(\" highcharts-data-label-color-\"+k.colorIndex+\" \"+(b.className||\"\")+(b.useHTML?\" highcharts-tracker\":\"\"))),w.options=b,w.attr(q),c.styledMode||w.css(l).shadow(b.shadow),w.added||w.add(d),b.textPath&&!b.useHTML&&w.setTextPath(k.getDataLabelPath&&k.getDataLabelPath(w)||k.graphic,b.textPath),f.alignDataLabel(k,w,b,null,n)):(k.dataLabel=k.dataLabel&&k.dataLabel.destroy(),k.dataLabels&&(1===k.dataLabels.length?delete k.dataLabels:delete k.dataLabels[g]),\ng||delete k.dataLabel,r&&(k.connector=k.connector.destroy(),k.connectors&&(1===k.connectors.length?delete k.connectors:delete k.connectors[g])))})});a.fireEvent(this,\"afterDrawDataLabels\")};z.prototype.alignDataLabel=function(a,b,f,c,g){var e=this.chart,h=this.isCartesian&&e.inverted,l=x(a.dlBox&&a.dlBox.centerX,a.plotX,-9999),p=x(a.plotY,-9999),d=b.getBBox(),k,u=f.rotation,t=f.align,r=this.visible&&(a.series.forceDL||e.isInsidePlot(l,Math.round(p),h)||c&&e.isInsidePlot(l,h?c.x+1:c.y+c.height-1,h)),\nq=\"justify\"===x(f.overflow,\"justify\");if(r&&(k=e.renderer.fontMetrics(e.styledMode?void 0:f.style.fontSize,b).b,c=E({x:h?this.yAxis.len-p:l,y:Math.round(h?this.xAxis.len-l:p),width:0,height:0},c),E(f,{width:d.width,height:d.height}),u?(q=!1,l=e.renderer.rotCorr(k,u),l={x:c.x+f.x+c.width/2+l.x,y:c.y+f.y+{top:0,middle:.5,bottom:1}[f.verticalAlign]*c.height},b[g?\"attr\":\"animate\"](l).attr({align:t}),p=(u+720)%360,p=180<p&&360>p,\"left\"===t?l.y-=p?d.height:0:\"center\"===t?(l.x-=d.width/2,l.y-=d.height/2):\n\"right\"===t&&(l.x-=d.width,l.y-=p?0:d.height),b.placed=!0,b.alignAttr=l):(b.align(f,null,c),l=b.alignAttr),q&&0<=c.height?a.isLabelJustified=this.justifyDataLabel(b,f,l,d,c,g):x(f.crop,!0)&&(r=e.isInsidePlot(l.x,l.y)&&e.isInsidePlot(l.x+d.width,l.y+d.height)),f.shape&&!u))b[g?\"attr\":\"animate\"]({anchorX:h?e.plotWidth-a.plotY:a.plotX,anchorY:h?e.plotHeight-a.plotX:a.plotY});r||(b.attr({y:-9999}),b.placed=!1)};z.prototype.justifyDataLabel=function(a,b,f,c,g,h){var e=this.chart,l=b.align,p=b.verticalAlign,\nd,k,u=a.box?0:a.padding||0;d=f.x+u;0>d&&(\"right\"===l?b.align=\"left\":b.x=-d,k=!0);d=f.x+c.width-u;d>e.plotWidth&&(\"left\"===l?b.align=\"right\":b.x=e.plotWidth-d,k=!0);d=f.y+u;0>d&&(\"bottom\"===p?b.verticalAlign=\"top\":b.y=-d,k=!0);d=f.y+c.height-u;d>e.plotHeight&&(\"top\"===p?b.verticalAlign=\"bottom\":b.y=e.plotHeight-d,k=!0);k&&(a.placed=!h,a.align(b,null,g));return k};n.pie&&(n.pie.prototype.dataLabelPositioners={radialDistributionY:function(a){return a.top+a.distributeBox.pos},radialDistributionX:function(a,\nb,f,c){return a.getX(f<b.top+2||f>b.bottom-2?c:f,b.half,b)},justify:function(a,b,f){return f[0]+(a.half?-1:1)*(b+a.labelDistance)},alignToPlotEdges:function(a,b,f,c){a=a.getBBox().width;return b?a+c:f-a-c},alignToConnectors:function(a,b,f,c){var e=0,g;a.forEach(function(a){g=a.dataLabel.getBBox().width;g>e&&(e=g)});return b?e+c:f-e-c}},n.pie.prototype.drawDataLabels=function(){var e=this,b=e.data,f,c=e.chart,h=e.options.dataLabels,r=h.connectorPadding,w,n=c.plotWidth,p=c.plotHeight,d=c.plotLeft,k=\nMath.round(c.chartWidth/3),u,m=e.center,v=m[2]/2,q=m[1],y,N,O,L,E=[[],[]],M,J,H,I,P=[0,0,0,0],S=e.dataLabelPositioners,W;e.visible&&(h.enabled||e._hasPointLabels)&&(b.forEach(function(a){a.dataLabel&&a.visible&&a.dataLabel.shortened&&(a.dataLabel.attr({width:\"auto\"}).css({width:\"auto\",textOverflow:\"clip\"}),a.dataLabel.shortened=!1)}),z.prototype.drawDataLabels.apply(e),b.forEach(function(a){a.dataLabel&&(a.visible?(E[a.half].push(a),a.dataLabel._pos=null,!A(h.style.width)&&!A(a.options.dataLabels&&\na.options.dataLabels.style&&a.options.dataLabels.style.width)&&a.dataLabel.getBBox().width>k&&(a.dataLabel.css({width:.7*k}),a.dataLabel.shortened=!0)):(a.dataLabel=a.dataLabel.destroy(),a.dataLabels&&1===a.dataLabels.length&&delete a.dataLabels))}),E.forEach(function(b,k){var g,l,u=b.length,t=[],w;if(u)for(e.sortByAngle(b,k-.5),0<e.maxLabelDistance&&(g=Math.max(0,q-v-e.maxLabelDistance),l=Math.min(q+v+e.maxLabelDistance,c.plotHeight),b.forEach(function(a){0<a.labelDistance&&a.dataLabel&&(a.top=Math.max(0,\nq-v-a.labelDistance),a.bottom=Math.min(q+v+a.labelDistance,c.plotHeight),w=a.dataLabel.getBBox().height||21,a.distributeBox={target:a.labelPosition.natural.y-a.top+w/2,size:w,rank:a.y},t.push(a.distributeBox))}),g=l+w-g,a.distribute(t,g,g/5)),I=0;I<u;I++){f=b[I];O=f.labelPosition;y=f.dataLabel;H=!1===f.visible?\"hidden\":\"inherit\";J=g=O.natural.y;t&&A(f.distributeBox)&&(void 0===f.distributeBox.pos?H=\"hidden\":(L=f.distributeBox.size,J=S.radialDistributionY(f)));delete f.positionIndex;if(h.justify)M=\nS.justify(f,v,m);else switch(h.alignTo){case \"connectors\":M=S.alignToConnectors(b,k,n,d);break;case \"plotEdges\":M=S.alignToPlotEdges(y,k,n,d);break;default:M=S.radialDistributionX(e,f,J,g)}y._attr={visibility:H,align:O.alignment};y._pos={x:M+h.x+({left:r,right:-r}[O.alignment]||0),y:J+h.y-10};O.final.x=M;O.final.y=J;x(h.crop,!0)&&(N=y.getBBox().width,g=null,M-N<r&&1===k?(g=Math.round(N-M+r),P[3]=Math.max(g,P[3])):M+N>n-r&&0===k&&(g=Math.round(M+N-n+r),P[1]=Math.max(g,P[1])),0>J-L/2?P[0]=Math.max(Math.round(-J+\nL/2),P[0]):J+L/2>p&&(P[2]=Math.max(Math.round(J+L/2-p),P[2])),y.sideOverflow=g)}}),0===C(P)||this.verifyDataLabelOverflow(P))&&(this.placeDataLabels(),this.points.forEach(function(a){W=g(h,a.options.dataLabels);if(w=x(W.connectorWidth,1)){var b;u=a.connector;if((y=a.dataLabel)&&y._pos&&a.visible&&0<a.labelDistance){H=y._attr.visibility;if(b=!u)a.connector=u=c.renderer.path().addClass(\"highcharts-data-label-connector highcharts-color-\"+a.colorIndex+(a.className?\" \"+a.className:\"\")).add(e.dataLabelsGroup),\nc.styledMode||u.attr({\"stroke-width\":w,stroke:W.connectorColor||a.color||\"#666666\"});u[b?\"attr\":\"animate\"]({d:a.getConnectorPath()});u.attr(\"visibility\",H)}else u&&(a.connector=u.destroy())}}))},n.pie.prototype.placeDataLabels=function(){this.points.forEach(function(a){var b=a.dataLabel,e;b&&a.visible&&((e=b._pos)?(b.sideOverflow&&(b._attr.width=Math.max(b.getBBox().width-b.sideOverflow,0),b.css({width:b._attr.width+\"px\",textOverflow:(this.options.dataLabels.style||{}).textOverflow||\"ellipsis\"}),\nb.shortened=!0),b.attr(b._attr),b[b.moved?\"animate\":\"attr\"](e),b.moved=!0):b&&b.attr({y:-9999}));delete a.distributeBox},this)},n.pie.prototype.alignDataLabel=v,n.pie.prototype.verifyDataLabelOverflow=function(a){var b=this.center,e=this.options,c=e.center,f=e.minSize||80,g,h=null!==e.size;h||(null!==c[0]?g=Math.max(b[2]-Math.max(a[1],a[3]),f):(g=Math.max(b[2]-a[1]-a[3],f),b[0]+=(a[3]-a[1])/2),null!==c[1]?g=Math.max(Math.min(g,b[2]-Math.max(a[0],a[2])),f):(g=Math.max(Math.min(g,b[2]-a[0]-a[2]),f),\nb[1]+=(a[0]-a[2])/2),g<b[2]?(b[2]=g,b[3]=Math.min(y(e.innerSize||0,g),g),this.translate(b),this.drawDataLabels&&this.drawDataLabels()):h=!0);return h});n.column&&(n.column.prototype.alignDataLabel=function(a,b,f,c,h){var e=this.chart.inverted,l=a.series,t=a.dlBox||a.shapeArgs,p=x(a.below,a.plotY>x(this.translatedThreshold,l.yAxis.len)),d=x(f.inside,!!this.options.stacking);t&&(c=g(t),0>c.y&&(c.height+=c.y,c.y=0),t=c.y+c.height-l.yAxis.len,0<t&&(c.height-=t),e&&(c={x:l.yAxis.len-c.y-c.height,y:l.xAxis.len-\nc.x-c.width,width:c.height,height:c.width}),d||(e?(c.x+=p?0:c.width,c.width=0):(c.y+=p?c.height:0,c.height=0)));f.align=x(f.align,!e||d?\"center\":p?\"right\":\"left\");f.verticalAlign=x(f.verticalAlign,e||d?\"middle\":p?\"top\":\"bottom\");z.prototype.alignDataLabel.call(this,a,b,f,c,h);a.isLabelJustified&&a.contrastColor&&b.css({color:a.contrastColor})})});I(H,\"modules/overlapping-datalabels.src.js\",[H[\"parts/Globals.js\"]],function(a){var C=a.Chart,A=a.isArray,E=a.objectEach,m=a.pick,g=a.addEvent,v=a.fireEvent;\ng(C,\"render\",function(){var a=[];(this.labelCollectors||[]).forEach(function(g){a=a.concat(g())});(this.yAxis||[]).forEach(function(g){g.options.stackLabels&&!g.options.stackLabels.allowOverlap&&E(g.stacks,function(g){E(g,function(g){a.push(g.label)})})});(this.series||[]).forEach(function(g){var v=g.options.dataLabels;g.visible&&(!1!==v.enabled||g._hasPointLabels)&&g.points.forEach(function(g){g.visible&&(A(g.dataLabels)?g.dataLabels:g.dataLabel?[g.dataLabel]:[]).forEach(function(f){var h=f.options;\nf.labelrank=m(h.labelrank,g.labelrank,g.shapeArgs&&g.shapeArgs.height);h.allowOverlap||a.push(f)})})});this.hideOverlappingLabels(a)});C.prototype.hideOverlappingLabels=function(a){var g=this,m=a.length,n=g.renderer,f,h,r,e,b,l,c=function(a,b,c,e,f,d,k,g){return!(f>a+c||f+k<a||d>b+e||d+g<b)};r=function(a){var b,c,e,f=a.box?0:a.padding||0;e=0;if(a&&(!a.alignAttr||a.placed))return b=a.alignAttr||{x:a.attr(\"x\"),y:a.attr(\"y\")},c=a.parentGroup,a.width||(e=a.getBBox(),a.width=e.width,a.height=e.height,\ne=n.fontMetrics(null,a.element).h),{x:b.x+(c.translateX||0)+f,y:b.y+(c.translateY||0)+f-e,width:a.width-2*f,height:a.height-2*f}};for(h=0;h<m;h++)if(f=a[h])f.oldOpacity=f.opacity,f.newOpacity=1,f.absoluteBox=r(f);a.sort(function(a,b){return(b.labelrank||0)-(a.labelrank||0)});for(h=0;h<m;h++)for(l=(r=a[h])&&r.absoluteBox,f=h+1;f<m;++f)if(b=(e=a[f])&&e.absoluteBox,l&&b&&r!==e&&0!==r.newOpacity&&0!==e.newOpacity&&(b=c(l.x,l.y,l.width,l.height,b.x,b.y,b.width,b.height)))(r.labelrank<e.labelrank?r:e).newOpacity=\n0;a.forEach(function(a){var b,c;a&&(c=a.newOpacity,a.oldOpacity!==c&&(a.alignAttr&&a.placed?(c?a.show(!0):b=function(){a.hide()},a.alignAttr.opacity=c,a[a.isOld?\"animate\":\"attr\"](a.alignAttr,null,b),v(g,\"afterHideOverlappingLabels\")):a.attr({opacity:c})),a.isOld=!0)})}});I(H,\"parts/Interaction.js\",[H[\"parts/Globals.js\"]],function(a){var C=a.addEvent,A=a.Chart,E=a.createElement,m=a.css,g=a.defaultOptions,v=a.defaultPlotOptions,x=a.extend,y=a.fireEvent,z=a.hasTouch,n=a.isObject,f=a.isArray,h=a.Legend,\nr=a.merge,e=a.pick,b=a.Point,l=a.Series,c=a.seriesTypes,t=a.svg,F;F=a.TrackerMixin={drawTrackerPoint:function(){var a=this,b=a.chart,c=b.pointer,d=function(a){var b=c.getPointFromEvent(a);void 0!==b&&(c.isDirectTouch=!0,b.onMouseOver(a))},e;a.points.forEach(function(a){e=f(a.dataLabels)?a.dataLabels:a.dataLabel?[a.dataLabel]:[];a.graphic&&(a.graphic.element.point=a);e.forEach(function(b){b.div?b.div.point=a:b.element.point=a})});a._hasTracking||(a.trackerGroups.forEach(function(e){if(a[e]){a[e].addClass(\"highcharts-tracker\").on(\"mouseover\",\nd).on(\"mouseout\",function(a){c.onTrackerMouseOut(a)});if(z)a[e].on(\"touchstart\",d);!b.styledMode&&a.options.cursor&&a[e].css(m).css({cursor:a.options.cursor})}}),a._hasTracking=!0);y(this,\"afterDrawTracker\")},drawTrackerGraph:function(){var a=this,b=a.options,c=b.trackByArea,d=[].concat(c?a.areaPath:a.graphPath),e=d.length,f=a.chart,g=f.pointer,h=f.renderer,l=f.options.tooltip.snap,r=a.tracker,n,m=function(){if(f.hoverSeries!==a)a.onMouseOver()},v=\"rgba(192,192,192,\"+(t?.0001:.002)+\")\";if(e&&!c)for(n=\ne+1;n--;)\"M\"===d[n]&&d.splice(n+1,0,d[n+1]-l,d[n+2],\"L\"),(n&&\"M\"===d[n]||n===e)&&d.splice(n,0,\"L\",d[n-2]+l,d[n-1]);r?r.attr({d:d}):a.graph&&(a.tracker=h.path(d).attr({visibility:a.visible?\"visible\":\"hidden\",zIndex:2}).addClass(c?\"highcharts-tracker-area\":\"highcharts-tracker-line\").add(a.group),f.styledMode||a.tracker.attr({\"stroke-linejoin\":\"round\",stroke:v,fill:c?v:\"none\",\"stroke-width\":a.graph.strokeWidth()+(c?0:2*l)}),[a.tracker,a.markerGroup].forEach(function(a){a.addClass(\"highcharts-tracker\").on(\"mouseover\",\nm).on(\"mouseout\",function(a){g.onTrackerMouseOut(a)});b.cursor&&!f.styledMode&&a.css({cursor:b.cursor});if(z)a.on(\"touchstart\",m)}));y(this,\"afterDrawTracker\")}};c.column&&(c.column.prototype.drawTracker=F.drawTrackerPoint);c.pie&&(c.pie.prototype.drawTracker=F.drawTrackerPoint);c.scatter&&(c.scatter.prototype.drawTracker=F.drawTrackerPoint);x(h.prototype,{setItemEvents:function(a,c,e){var d=this,f=d.chart.renderer.boxWrapper,g=a instanceof b,h=\"highcharts-legend-\"+(g?\"point\":\"series\")+\"-active\",\np=d.chart.styledMode;(e?c:a.legendGroup).on(\"mouseover\",function(){d.allItems.forEach(function(b){a!==b&&b.setState(\"inactive\",!g)});a.setState(\"hover\");a.visible&&f.addClass(h);p||c.css(d.options.itemHoverStyle)}).on(\"mouseout\",function(){d.styledMode||c.css(r(a.visible?d.itemStyle:d.itemHiddenStyle));d.allItems.forEach(function(b){a!==b&&b.setState(\"\",!g)});f.removeClass(h);a.setState()}).on(\"click\",function(b){var d=function(){a.setVisible&&a.setVisible()};f.removeClass(h);b={browserEvent:b};a.firePointEvent?\na.firePointEvent(\"legendItemClick\",b,d):y(a,\"legendItemClick\",b,d)})},createCheckboxForItem:function(a){a.checkbox=E(\"input\",{type:\"checkbox\",className:\"highcharts-legend-checkbox\",checked:a.selected,defaultChecked:a.selected},this.options.itemCheckboxStyle,this.chart.container);C(a.checkbox,\"click\",function(b){y(a.series||a,\"checkboxClick\",{checked:b.target.checked,item:a},function(){a.select()})})}});x(A.prototype,{showResetZoom:function(){function a(){b.zoomOut()}var b=this,c=g.lang,d=b.options.chart.resetZoomButton,\ne=d.theme,f=e.states,h=\"chart\"===d.relativeTo||\"spaceBox\"===d.relativeTo?null:\"plotBox\";y(this,\"beforeShowResetZoom\",null,function(){b.resetZoomButton=b.renderer.button(c.resetZoom,null,null,a,e,f&&f.hover).attr({align:d.position.align,title:c.resetZoomTitle}).addClass(\"highcharts-reset-zoom\").add().align(d.position,!1,h)});y(this,\"afterShowResetZoom\")},zoomOut:function(){y(this,\"selection\",{resetSelection:!0},this.zoom)},zoom:function(b){var c=this,f,d=c.pointer,k=!1,g=c.inverted?d.mouseDownX:d.mouseDownY,\nh;!b||b.resetSelection?(c.axes.forEach(function(a){f=a.zoom()}),d.initiated=!1):b.xAxis.concat(b.yAxis).forEach(function(b){var e=b.axis,h=c.inverted?e.left:e.top,p=c.inverted?h+e.width:h+e.height,l=e.isXAxis,u=!1;if(!l&&g>=h&&g<=p||l||!a.defined(g))u=!0;d[l?\"zoomX\":\"zoomY\"]&&u&&(f=e.zoom(b.min,b.max),e.displayBtn&&(k=!0))});h=c.resetZoomButton;k&&!h?c.showResetZoom():!k&&n(h)&&(c.resetZoomButton=h.destroy());f&&c.redraw(e(c.options.chart.animation,b&&b.animation,100>c.pointCount))},pan:function(a,\nb){var c=this,d=c.hoverPoints,e;y(this,\"pan\",{originalEvent:a},function(){d&&d.forEach(function(a){a.setState()});(\"xy\"===b?[1,0]:[1]).forEach(function(b){b=c[b?\"xAxis\":\"yAxis\"][0];var d=b.horiz,f=a[d?\"chartX\":\"chartY\"],d=d?\"mouseDownX\":\"mouseDownY\",k=c[d],g=(b.pointRange||0)/2,h=b.reversed&&!c.inverted||!b.reversed&&c.inverted?-1:1,p=b.getExtremes(),l=b.toValue(k-f,!0)+g*h,h=b.toValue(k+b.len-f,!0)-g*h,u=h<l,k=u?h:l,l=u?l:h,h=Math.min(p.dataMin,g?p.min:b.toValue(b.toPixels(p.min)-b.minPixelPadding)),\ng=Math.max(p.dataMax,g?p.max:b.toValue(b.toPixels(p.max)+b.minPixelPadding)),u=h-k;0<u&&(l+=u,k=h);u=l-g;0<u&&(l=g,k-=u);b.series.length&&k!==p.min&&l!==p.max&&(b.setExtremes(k,l,!1,!1,{trigger:\"pan\"}),e=!0);c[d]=f});e&&c.redraw(!1);m(c.container,{cursor:\"move\"})})}});x(b.prototype,{select:function(a,b){var c=this,d=c.series,f=d.chart;a=e(a,!c.selected);c.firePointEvent(a?\"select\":\"unselect\",{accumulate:b},function(){c.selected=c.options.selected=a;d.options.data[d.data.indexOf(c)]=c.options;c.setState(a&&\n\"select\");b||f.getSelectedPoints().forEach(function(a){var b=a.series;a.selected&&a!==c&&(a.selected=a.options.selected=!1,b.options.data[b.data.indexOf(a)]=a.options,a.setState(f.hoverPoints&&b.options.inactiveOtherPoints?\"inactive\":\"\"),a.firePointEvent(\"unselect\"))})})},onMouseOver:function(a){var b=this.series.chart,c=b.pointer;a=a?c.normalize(a):c.getChartCoordinatesFromPoint(this,b.inverted);c.runPointActions(a,this)},onMouseOut:function(){var a=this.series.chart;this.firePointEvent(\"mouseOut\");\nthis.series.options.inactiveOtherPoints||(a.hoverPoints||[]).forEach(function(a){a.setState()});a.hoverPoints=a.hoverPoint=null},importEvents:function(){if(!this.hasImportedEvents){var b=this,c=r(b.series.options.point,b.options).events;b.events=c;a.objectEach(c,function(c,d){a.isFunction(c)&&C(b,d,c)});this.hasImportedEvents=!0}},setState:function(a,b){var c=Math.floor(this.plotX),d=this.plotY,f=this.series,g=this.state,h=f.options.states[a||\"normal\"]||{},l=v[f.type].marker&&f.options.marker,q=l&&\n!1===l.enabled,t=l&&l.states&&l.states[a||\"normal\"]||{},r=!1===t.enabled,n=f.stateMarkerGraphic,m=this.marker||{},w=f.chart,B=f.halo,F,z,A,C=l&&f.markerAttribs;a=a||\"\";if(!(a===this.state&&!b||this.selected&&\"select\"!==a||!1===h.enabled||a&&(r||q&&!1===t.enabled)||a&&m.states&&m.states[a]&&!1===m.states[a].enabled)){this.state=a;C&&(F=f.markerAttribs(this,a));if(this.graphic)g&&this.graphic.removeClass(\"highcharts-point-\"+g),a&&this.graphic.addClass(\"highcharts-point-\"+a),w.styledMode||(z=f.pointAttribs(this,\na),A=e(w.options.chart.animation,h.animation),f.options.inactiveOtherPoints&&((this.dataLabels||[]).forEach(function(a){a&&a.animate({opacity:z.opacity},A)}),this.connector&&this.connector.animate({opacity:z.opacity},A)),this.graphic.animate(z,A)),F&&this.graphic.animate(F,e(w.options.chart.animation,t.animation,l.animation)),n&&n.hide();else{if(a&&t){g=m.symbol||f.symbol;n&&n.currentSymbol!==g&&(n=n.destroy());if(n)n[b?\"animate\":\"attr\"]({x:F.x,y:F.y});else g&&(f.stateMarkerGraphic=n=w.renderer.symbol(g,\nF.x,F.y,F.width,F.height).add(f.markerGroup),n.currentSymbol=g);!w.styledMode&&n&&n.attr(f.pointAttribs(this,a))}n&&(n[a&&w.isInsidePlot(c,d,w.inverted)?\"show\":\"hide\"](),n.element.point=this)}(a=h.halo)&&a.size?(B||(f.halo=B=w.renderer.path().add((this.graphic||n).parentGroup)),B.show()[b?\"animate\":\"attr\"]({d:this.haloPath(a.size)}),B.attr({\"class\":\"highcharts-halo highcharts-color-\"+e(this.colorIndex,f.colorIndex)+(this.className?\" \"+this.className:\"\"),zIndex:-1}),B.point=this,w.styledMode||B.attr(x({fill:this.color||\nf.color,\"fill-opacity\":a.opacity},a.attributes))):B&&B.point&&B.point.haloPath&&B.animate({d:B.point.haloPath(0)},null,B.hide);y(this,\"afterSetState\")}},haloPath:function(a){return this.series.chart.renderer.symbols.circle(Math.floor(this.plotX)-a,this.plotY-a,2*a,2*a)}});x(l.prototype,{onMouseOver:function(){var a=this.chart,b=a.hoverSeries;if(b&&b!==this)b.onMouseOut();this.options.events.mouseOver&&y(this,\"mouseOver\");this.setState(\"hover\");a.hoverSeries=this},onMouseOut:function(){var a=this.options,\nb=this.chart,c=b.tooltip,d=b.hoverPoint;b.hoverSeries=null;if(d)d.onMouseOut();this&&a.events.mouseOut&&y(this,\"mouseOut\");!c||this.stickyTracking||c.shared&&!this.noSharedTooltip||c.hide();b.series.forEach(function(a){a.setState(\"\",!0)})},setState:function(a,b){var c=this,d=c.options,f=c.graph,g=d.inactiveOtherPoints,h=d.states,l=d.lineWidth,q=d.opacity,t=e(h[a||\"normal\"]&&h[a||\"normal\"].animation,c.chart.options.chart.animation),d=0;a=a||\"\";if(c.state!==a&&([c.group,c.markerGroup,c.dataLabelsGroup].forEach(function(b){b&&\n(c.state&&b.removeClass(\"highcharts-series-\"+c.state),a&&b.addClass(\"highcharts-series-\"+a))}),c.state=a,!c.chart.styledMode)){if(h[a]&&!1===h[a].enabled)return;a&&(l=h[a].lineWidth||l+(h[a].lineWidthPlus||0),q=e(h[a].opacity,q));if(f&&!f.dashstyle)for(h={\"stroke-width\":l},f.animate(h,t);c[\"zone-graph-\"+d];)c[\"zone-graph-\"+d].attr(h),d+=1;g||[c.group,c.markerGroup,c.dataLabelsGroup,c.labelBySeries].forEach(function(a){a&&a.animate({opacity:q},t)})}b&&g&&c.points&&c.points.forEach(function(b){b.setState&&\nb.setState(a)})},setVisible:function(a,b){var c=this,d=c.chart,e=c.legendItem,f,g=d.options.chart.ignoreHiddenSeries,h=c.visible;f=(c.visible=a=c.options.visible=c.userOptions.visible=void 0===a?!h:a)?\"show\":\"hide\";[\"group\",\"dataLabelsGroup\",\"markerGroup\",\"tracker\",\"tt\"].forEach(function(a){if(c[a])c[a][f]()});if(d.hoverSeries===c||(d.hoverPoint&&d.hoverPoint.series)===c)c.onMouseOut();e&&d.legend.colorizeItem(c,a);c.isDirty=!0;c.options.stacking&&d.series.forEach(function(a){a.options.stacking&&\na.visible&&(a.isDirty=!0)});c.linkedSeries.forEach(function(b){b.setVisible(a,!1)});g&&(d.isDirtyBox=!0);y(c,f);!1!==b&&d.redraw()},show:function(){this.setVisible(!0)},hide:function(){this.setVisible(!1)},select:function(a){this.selected=a=this.options.selected=void 0===a?!this.selected:a;this.checkbox&&(this.checkbox.checked=a);y(this,a?\"select\":\"unselect\")},drawTracker:F.drawTrackerGraph})});I(H,\"parts/Responsive.js\",[H[\"parts/Globals.js\"]],function(a){var C=a.Chart,A=a.isArray,E=a.isObject,m=\na.pick,g=a.splat;C.prototype.setResponsive=function(g,m){var v=this.options.responsive,x=[],n=this.currentResponsive;!m&&v&&v.rules&&v.rules.forEach(function(f){void 0===f._id&&(f._id=a.uniqueKey());this.matchResponsiveRule(f,x,g)},this);m=a.merge.apply(0,x.map(function(f){return a.find(v.rules,function(a){return a._id===f}).chartOptions}));m.isResponsiveOptions=!0;x=x.toString()||void 0;x!==(n&&n.ruleIds)&&(n&&this.update(n.undoOptions,g,!0),x?(n=this.currentOptions(m),n.isResponsiveOptions=!0,this.currentResponsive=\n{ruleIds:x,mergedOptions:m,undoOptions:n},this.update(m,g,!0)):this.currentResponsive=void 0)};C.prototype.matchResponsiveRule=function(a,g){var v=a.condition;(v.callback||function(){return this.chartWidth<=m(v.maxWidth,Number.MAX_VALUE)&&this.chartHeight<=m(v.maxHeight,Number.MAX_VALUE)&&this.chartWidth>=m(v.minWidth,0)&&this.chartHeight>=m(v.minHeight,0)}).call(this)&&g.push(a._id)};C.prototype.currentOptions=function(v){function x(n,f,h,r){var e;a.objectEach(n,function(a,l){if(!r&&-1<y.collectionsWithUpdate.indexOf(l))for(a=\ng(a),h[l]=[],e=0;e<a.length;e++)f[l][e]&&(h[l][e]={},x(a[e],f[l][e],h[l][e],r+1));else E(a)?(h[l]=A(a)?[]:{},x(a,f[l]||{},h[l],r+1)):h[l]=m(f[l],null)})}var y=this,z={};x(v,this.options,z,0);return z}});I(H,\"masters/highcharts.src.js\",[H[\"parts/Globals.js\"]],function(a){return a});I(H,\"parts/Scrollbar.js\",[H[\"parts/Globals.js\"]],function(a){function C(a,e,c){this.init(a,e,c)}var A=a.addEvent,E=a.Axis,m=a.correctFloat,g=a.defaultOptions,v=a.defined,x=a.destroyObjectProperties,y=a.fireEvent,z=a.hasTouch,\nn=a.merge,f=a.pick,h=a.removeEvent,r,e={height:a.isTouchDevice?20:14,barBorderRadius:0,buttonBorderRadius:0,liveRedraw:void 0,margin:10,minWidth:6,step:.2,zIndex:3,barBackgroundColor:\"#cccccc\",barBorderWidth:1,barBorderColor:\"#cccccc\",buttonArrowColor:\"#333333\",buttonBackgroundColor:\"#e6e6e6\",buttonBorderColor:\"#cccccc\",buttonBorderWidth:1,rifleColor:\"#333333\",trackBackgroundColor:\"#f2f2f2\",trackBorderColor:\"#f2f2f2\",trackBorderWidth:1};g.scrollbar=n(!0,e,g.scrollbar);a.swapXY=r=function(a,e){var b=\na.length,f;if(e)for(e=0;e<b;e+=3)f=a[e+1],a[e+1]=a[e+2],a[e+2]=f;return a};C.prototype={init:function(a,g,c){this.scrollbarButtons=[];this.renderer=a;this.userOptions=g;this.options=n(e,g);this.chart=c;this.size=f(this.options.size,this.options.height);g.enabled&&(this.render(),this.initEvents(),this.addEvents())},render:function(){var a=this.renderer,e=this.options,c=this.size,f=this.chart.styledMode,g;this.group=g=a.g(\"scrollbar\").attr({zIndex:e.zIndex,translateY:-99999}).add();this.track=a.rect().addClass(\"highcharts-scrollbar-track\").attr({x:0,\nr:e.trackBorderRadius||0,height:c,width:c}).add(g);f||this.track.attr({fill:e.trackBackgroundColor,stroke:e.trackBorderColor,\"stroke-width\":e.trackBorderWidth});this.trackBorderWidth=this.track.strokeWidth();this.track.attr({y:-this.trackBorderWidth%2/2});this.scrollbarGroup=a.g().add(g);this.scrollbar=a.rect().addClass(\"highcharts-scrollbar-thumb\").attr({height:c,width:c,r:e.barBorderRadius||0}).add(this.scrollbarGroup);this.scrollbarRifles=a.path(r([\"M\",-3,c/4,\"L\",-3,2*c/3,\"M\",0,c/4,\"L\",0,2*c/3,\n\"M\",3,c/4,\"L\",3,2*c/3],e.vertical)).addClass(\"highcharts-scrollbar-rifles\").add(this.scrollbarGroup);f||(this.scrollbar.attr({fill:e.barBackgroundColor,stroke:e.barBorderColor,\"stroke-width\":e.barBorderWidth}),this.scrollbarRifles.attr({stroke:e.rifleColor,\"stroke-width\":1}));this.scrollbarStrokeWidth=this.scrollbar.strokeWidth();this.scrollbarGroup.translate(-this.scrollbarStrokeWidth%2/2,-this.scrollbarStrokeWidth%2/2);this.drawScrollbarButton(0);this.drawScrollbarButton(1)},position:function(a,\ne,c,f){var b=this.options.vertical,g=0,h=this.rendered?\"animate\":\"attr\";this.x=a;this.y=e+this.trackBorderWidth;this.width=c;this.xOffset=this.height=f;this.yOffset=g;b?(this.width=this.yOffset=c=g=this.size,this.xOffset=e=0,this.barWidth=f-2*c,this.x=a+=this.options.margin):(this.height=this.xOffset=f=e=this.size,this.barWidth=c-2*f,this.y+=this.options.margin);this.group[h]({translateX:a,translateY:this.y});this.track[h]({width:c,height:f});this.scrollbarButtons[1][h]({translateX:b?0:c-e,translateY:b?\nf-g:0})},drawScrollbarButton:function(a){var b=this.renderer,c=this.scrollbarButtons,e=this.options,f=this.size,g;g=b.g().add(this.group);c.push(g);g=b.rect().addClass(\"highcharts-scrollbar-button\").add(g);this.chart.styledMode||g.attr({stroke:e.buttonBorderColor,\"stroke-width\":e.buttonBorderWidth,fill:e.buttonBackgroundColor});g.attr(g.crisp({x:-.5,y:-.5,width:f+1,height:f+1,r:e.buttonBorderRadius},g.strokeWidth()));g=b.path(r([\"M\",f/2+(a?-1:1),f/2-3,\"L\",f/2+(a?-1:1),f/2+3,\"L\",f/2+(a?2:-2),f/2],\ne.vertical)).addClass(\"highcharts-scrollbar-arrow\").add(c[a]);this.chart.styledMode||g.attr({fill:e.buttonArrowColor})},setRange:function(a,e){var b=this.options,f=b.vertical,g=b.minWidth,h=this.barWidth,l,p,d=!this.rendered||this.hasDragged||this.chart.navigator&&this.chart.navigator.hasDragged?\"attr\":\"animate\";v(h)&&(a=Math.max(a,0),l=Math.ceil(h*a),this.calculatedWidth=p=m(h*Math.min(e,1)-l),p<g&&(l=(h-g+p)*a,p=g),g=Math.floor(l+this.xOffset+this.yOffset),h=p/2-.5,this.from=a,this.to=e,f?(this.scrollbarGroup[d]({translateY:g}),\nthis.scrollbar[d]({height:p}),this.scrollbarRifles[d]({translateY:h}),this.scrollbarTop=g,this.scrollbarLeft=0):(this.scrollbarGroup[d]({translateX:g}),this.scrollbar[d]({width:p}),this.scrollbarRifles[d]({translateX:h}),this.scrollbarLeft=g,this.scrollbarTop=0),12>=p?this.scrollbarRifles.hide():this.scrollbarRifles.show(!0),!1===b.showFull&&(0>=a&&1<=e?this.group.hide():this.group.show()),this.rendered=!0)},initEvents:function(){var a=this;a.mouseMoveHandler=function(b){var c=a.chart.pointer.normalize(b),\ne=a.options.vertical?\"chartY\":\"chartX\",f=a.initPositions;!a.grabbedCenter||b.touches&&0===b.touches[0][e]||(c=a.cursorToScrollbarPosition(c)[e],e=a[e],e=c-e,a.hasDragged=!0,a.updatePosition(f[0]+e,f[1]+e),a.hasDragged&&y(a,\"changed\",{from:a.from,to:a.to,trigger:\"scrollbar\",DOMType:b.type,DOMEvent:b}))};a.mouseUpHandler=function(b){a.hasDragged&&y(a,\"changed\",{from:a.from,to:a.to,trigger:\"scrollbar\",DOMType:b.type,DOMEvent:b});a.grabbedCenter=a.hasDragged=a.chartX=a.chartY=null};a.mouseDownHandler=\nfunction(b){b=a.chart.pointer.normalize(b);b=a.cursorToScrollbarPosition(b);a.chartX=b.chartX;a.chartY=b.chartY;a.initPositions=[a.from,a.to];a.grabbedCenter=!0};a.buttonToMinClick=function(b){var c=m(a.to-a.from)*a.options.step;a.updatePosition(m(a.from-c),m(a.to-c));y(a,\"changed\",{from:a.from,to:a.to,trigger:\"scrollbar\",DOMEvent:b})};a.buttonToMaxClick=function(b){var c=(a.to-a.from)*a.options.step;a.updatePosition(a.from+c,a.to+c);y(a,\"changed\",{from:a.from,to:a.to,trigger:\"scrollbar\",DOMEvent:b})};\na.trackClick=function(b){var c=a.chart.pointer.normalize(b),e=a.to-a.from,f=a.y+a.scrollbarTop,g=a.x+a.scrollbarLeft;a.options.vertical&&c.chartY>f||!a.options.vertical&&c.chartX>g?a.updatePosition(a.from+e,a.to+e):a.updatePosition(a.from-e,a.to-e);y(a,\"changed\",{from:a.from,to:a.to,trigger:\"scrollbar\",DOMEvent:b})}},cursorToScrollbarPosition:function(a){var b=this.options,b=b.minWidth>this.calculatedWidth?b.minWidth:0;return{chartX:(a.chartX-this.x-this.xOffset)/(this.barWidth-b),chartY:(a.chartY-\nthis.y-this.yOffset)/(this.barWidth-b)}},updatePosition:function(a,e){1<e&&(a=m(1-m(e-a)),e=1);0>a&&(e=m(e-a),a=0);this.from=a;this.to=e},update:function(a){this.destroy();this.init(this.chart.renderer,n(!0,this.options,a),this.chart)},addEvents:function(){var a=this.options.inverted?[1,0]:[0,1],e=this.scrollbarButtons,c=this.scrollbarGroup.element,f=this.mouseDownHandler,g=this.mouseMoveHandler,h=this.mouseUpHandler,a=[[e[a[0]].element,\"click\",this.buttonToMinClick],[e[a[1]].element,\"click\",this.buttonToMaxClick],\n[this.track.element,\"click\",this.trackClick],[c,\"mousedown\",f],[c.ownerDocument,\"mousemove\",g],[c.ownerDocument,\"mouseup\",h]];z&&a.push([c,\"touchstart\",f],[c.ownerDocument,\"touchmove\",g],[c.ownerDocument,\"touchend\",h]);a.forEach(function(a){A.apply(null,a)});this._events=a},removeEvents:function(){this._events.forEach(function(a){h.apply(null,a)});this._events.length=0},destroy:function(){var a=this.chart.scroller;this.removeEvents();[\"track\",\"scrollbarRifles\",\"scrollbar\",\"scrollbarGroup\",\"group\"].forEach(function(a){this[a]&&\nthis[a].destroy&&(this[a]=this[a].destroy())},this);a&&this===a.scrollbar&&(a.scrollbar=null,x(a.scrollbarButtons))}};a.Scrollbar||(A(E,\"afterInit\",function(){var b=this;b.options&&b.options.scrollbar&&b.options.scrollbar.enabled&&(b.options.scrollbar.vertical=!b.horiz,b.options.startOnTick=b.options.endOnTick=!1,b.scrollbar=new C(b.chart.renderer,b.options.scrollbar,b.chart),A(b.scrollbar,\"changed\",function(e){var c=Math.min(f(b.options.min,b.min),b.min,b.dataMin),g=Math.max(f(b.options.max,b.max),\nb.max,b.dataMax)-c,h;b.horiz&&!b.reversed||!b.horiz&&b.reversed?(h=c+g*this.to,c+=g*this.from):(h=c+g*(1-this.from),c+=g*(1-this.to));f(this.options.liveRedraw,a.svg&&!a.isTouchDevice&&!this.chart.isBoosting)||\"mouseup\"===e.DOMType||!v(e.DOMType)?b.setExtremes(c,h,!0,\"mousemove\"!==e.DOMType,e):this.setRange(this.from,this.to)}))}),A(E,\"afterRender\",function(){var a=Math.min(f(this.options.min,this.min),this.min,f(this.dataMin,this.min)),e=Math.max(f(this.options.max,this.max),this.max,f(this.dataMax,\nthis.max)),c=this.scrollbar,g=this.axisTitleMargin+(this.titleOffset||0),h=this.chart.scrollbarsOffsets,n=this.options.margin||0;c&&(this.horiz?(this.opposite||(h[1]+=g),c.position(this.left,this.top+this.height+2+h[1]-(this.opposite?n:0),this.width,this.height),this.opposite||(h[1]+=n),g=1):(this.opposite&&(h[0]+=g),c.position(this.left+this.width+2+h[0]-(this.opposite?0:n),this.top,this.width,this.height),this.opposite&&(h[0]+=n),g=0),h[g]+=c.size+c.options.margin,isNaN(a)||isNaN(e)||!v(this.min)||\n!v(this.max)||this.min===this.max?c.setRange(0,1):(h=(this.min-a)/(e-a),a=(this.max-a)/(e-a),this.horiz&&!this.reversed||!this.horiz&&this.reversed?c.setRange(h,a):c.setRange(1-a,1-h)))}),A(E,\"afterGetOffset\",function(){var a=this.horiz?2:1,e=this.scrollbar;e&&(this.chart.scrollbarsOffsets=[0,0],this.chart.axisOffset[a]+=e.size+e.options.margin)}),a.Scrollbar=C)});I(H,\"parts/Navigator.js\",[H[\"parts/Globals.js\"]],function(a){function C(a){this.init(a)}var A=a.addEvent,E=a.Axis,m=a.Chart,g=a.color,\nv=a.defaultOptions,x=a.defined,y=a.destroyObjectProperties,z=a.erase,n=a.extend,f=a.hasTouch,h=a.isArray,r=a.isNumber,e=a.isTouchDevice,b=a.merge,l=a.pick,c=a.removeEvent,t=a.Scrollbar,F=a.Series,w,B=function(a){var b=[].filter.call(arguments,r);if(b.length)return Math[a].apply(0,b)};w=void 0===a.seriesTypes.areaspline?\"line\":\"areaspline\";n(v,{navigator:{height:40,margin:25,maskInside:!0,handles:{width:7,height:15,symbols:[\"navigator-handle\",\"navigator-handle\"],enabled:!0,lineWidth:1,backgroundColor:\"#f2f2f2\",\nborderColor:\"#999999\"},maskFill:g(\"#6685c2\").setOpacity(.3).get(),outlineColor:\"#cccccc\",outlineWidth:1,series:{type:w,fillOpacity:.05,lineWidth:1,compare:null,dataGrouping:{approximation:\"average\",enabled:!0,groupPixelWidth:2,smoothed:!0,units:[[\"millisecond\",[1,2,5,10,20,25,50,100,200,500]],[\"second\",[1,2,5,10,15,30]],[\"minute\",[1,2,5,10,15,30]],[\"hour\",[1,2,3,4,6,8,12]],[\"day\",[1,2,3,4]],[\"week\",[1,2,3]],[\"month\",[1,3,6]],[\"year\",null]]},dataLabels:{enabled:!1,zIndex:2},id:\"highcharts-navigator-series\",\nclassName:\"highcharts-navigator-series\",lineColor:null,marker:{enabled:!1},pointRange:0,threshold:null},xAxis:{overscroll:0,className:\"highcharts-navigator-xaxis\",tickLength:0,lineWidth:0,gridLineColor:\"#e6e6e6\",gridLineWidth:1,tickPixelInterval:200,labels:{align:\"left\",style:{color:\"#999999\"},x:3,y:-4},crosshair:!1},yAxis:{className:\"highcharts-navigator-yaxis\",gridLineWidth:0,startOnTick:!1,endOnTick:!1,minPadding:.1,maxPadding:.1,labels:{enabled:!1},crosshair:!1,title:{text:null},tickLength:0,\ntickWidth:0}}});a.Renderer.prototype.symbols[\"navigator-handle\"]=function(a,b,c,e,f){a=f.width/2;b=Math.round(a/3)+.5;f=f.height;return[\"M\",-a-1,.5,\"L\",a,.5,\"L\",a,f+.5,\"L\",-a-1,f+.5,\"L\",-a-1,.5,\"M\",-b,4,\"L\",-b,f-3,\"M\",b-1,4,\"L\",b-1,f-3]};E.prototype.toFixedRange=function(a,b,c,e){var d=this.chart&&this.chart.fixedRange;a=l(c,this.translate(a,!0,!this.horiz));b=l(e,this.translate(b,!0,!this.horiz));c=d&&(b-a)/d;.7<c&&1.3>c&&(e?a=b-d:b=a+d);r(a)&&r(b)||(a=b=void 0);return{min:a,max:b}};C.prototype=\n{drawHandle:function(a,b,c,e){var d=this.navigatorOptions.handles.height;this.handles[b][e](c?{translateX:Math.round(this.left+this.height/2),translateY:Math.round(this.top+parseInt(a,10)+.5-d)}:{translateX:Math.round(this.left+parseInt(a,10)),translateY:Math.round(this.top+this.height/2-d/2-1)})},drawOutline:function(a,b,c,e){var d=this.navigatorOptions.maskInside,f=this.outline.strokeWidth(),g=f/2,f=f%2/2,k=this.outlineHeight,h=this.scrollbarHeight,p=this.size,l=this.left-h,u=this.top;c?(l-=g,c=\nu+b+f,b=u+a+f,a=[\"M\",l+k,u-h-f,\"L\",l+k,c,\"L\",l,c,\"L\",l,b,\"L\",l+k,b,\"L\",l+k,u+p+h].concat(d?[\"M\",l+k,c-g,\"L\",l+k,b+g]:[])):(a+=l+h-f,b+=l+h-f,u+=g,a=[\"M\",l,u,\"L\",a,u,\"L\",a,u+k,\"L\",b,u+k,\"L\",b,u,\"L\",l+p+2*h,u].concat(d?[\"M\",a-g,u,\"L\",b+g,u]:[]));this.outline[e]({d:a})},drawMasks:function(a,b,c,e){var d=this.left,f=this.top,g=this.height,k,h,p,l;c?(p=[d,d,d],l=[f,f+a,f+b],h=[g,g,g],k=[a,b-a,this.size-b]):(p=[d,d+a,d+b],l=[f,f,f],h=[a,b-a,this.size-b],k=[g,g,g]);this.shades.forEach(function(a,b){a[e]({x:p[b],\ny:l[b],width:h[b],height:k[b]})})},renderElements:function(){var a=this,b=a.navigatorOptions,c=b.maskInside,e=a.chart,f=e.renderer,g,h={cursor:e.inverted?\"ns-resize\":\"ew-resize\"};a.navigatorGroup=g=f.g(\"navigator\").attr({zIndex:8,visibility:\"hidden\"}).add();[!c,c,!c].forEach(function(d,c){a.shades[c]=f.rect().addClass(\"highcharts-navigator-mask\"+(1===c?\"-inside\":\"-outside\")).add(g);e.styledMode||a.shades[c].attr({fill:d?b.maskFill:\"rgba(0,0,0,0)\"}).css(1===c&&h)});a.outline=f.path().addClass(\"highcharts-navigator-outline\").add(g);\ne.styledMode||a.outline.attr({\"stroke-width\":b.outlineWidth,stroke:b.outlineColor});b.handles.enabled&&[0,1].forEach(function(d){b.handles.inverted=e.inverted;a.handles[d]=f.symbol(b.handles.symbols[d],-b.handles.width/2-1,0,b.handles.width,b.handles.height,b.handles);a.handles[d].attr({zIndex:7-d}).addClass(\"highcharts-navigator-handle highcharts-navigator-handle-\"+[\"left\",\"right\"][d]).add(g);if(!e.styledMode){var c=b.handles;a.handles[d].attr({fill:c.backgroundColor,stroke:c.borderColor,\"stroke-width\":c.lineWidth}).css(h)}})},\nupdate:function(a){(this.series||[]).forEach(function(a){a.baseSeries&&delete a.baseSeries.navigatorSeries});this.destroy();b(!0,this.chart.options.navigator,this.options,a);this.init(this.chart)},render:function(b,d,c,e){var f=this.chart,g,k,h=this.scrollbarHeight,p,u=this.xAxis;g=u.fake?f.xAxis[0]:u;var t=this.navigatorEnabled,n,m=this.rendered;k=f.inverted;var w,v=f.xAxis[0].minRange,y=f.xAxis[0].options.maxRange;if(!this.hasDragged||x(c)){if(!r(b)||!r(d))if(m)c=0,e=l(u.width,g.width);else return;\nthis.left=l(u.left,f.plotLeft+h+(k?f.plotWidth:0));this.size=n=p=l(u.len,(k?f.plotHeight:f.plotWidth)-2*h);f=k?h:p+2*h;c=l(c,u.toPixels(b,!0));e=l(e,u.toPixels(d,!0));r(c)&&Infinity!==Math.abs(c)||(c=0,e=f);b=u.toValue(c,!0);d=u.toValue(e,!0);w=Math.abs(a.correctFloat(d-b));w<v?this.grabbedLeft?c=u.toPixels(d-v,!0):this.grabbedRight&&(e=u.toPixels(b+v,!0)):x(y)&&w>y&&(this.grabbedLeft?c=u.toPixels(d-y,!0):this.grabbedRight&&(e=u.toPixels(b+y,!0)));this.zoomedMax=Math.min(Math.max(c,e,0),n);this.zoomedMin=\nMath.min(Math.max(this.fixedWidth?this.zoomedMax-this.fixedWidth:Math.min(c,e),0),n);this.range=this.zoomedMax-this.zoomedMin;n=Math.round(this.zoomedMax);c=Math.round(this.zoomedMin);t&&(this.navigatorGroup.attr({visibility:\"visible\"}),m=m&&!this.hasDragged?\"animate\":\"attr\",this.drawMasks(c,n,k,m),this.drawOutline(c,n,k,m),this.navigatorOptions.handles.enabled&&(this.drawHandle(c,0,k,m),this.drawHandle(n,1,k,m)));this.scrollbar&&(k?(k=this.top-h,g=this.left-h+(t||!g.opposite?0:(g.titleOffset||0)+\ng.axisTitleMargin),h=p+2*h):(k=this.top+(t?this.height:-h),g=this.left-h),this.scrollbar.position(g,k,f,h),this.scrollbar.setRange(this.zoomedMin/(p||1),this.zoomedMax/(p||1)));this.rendered=!0}},addMouseEvents:function(){var a=this,b=a.chart,c=b.container,e=[],g,h;a.mouseMoveHandler=g=function(b){a.onMouseMove(b)};a.mouseUpHandler=h=function(b){a.onMouseUp(b)};e=a.getPartsEvents(\"mousedown\");e.push(A(c,\"mousemove\",g),A(c.ownerDocument,\"mouseup\",h));f&&(e.push(A(c,\"touchmove\",g),A(c.ownerDocument,\n\"touchend\",h)),e.concat(a.getPartsEvents(\"touchstart\")));a.eventsToUnbind=e;a.series&&a.series[0]&&e.push(A(a.series[0].xAxis,\"foundExtremes\",function(){b.navigator.modifyNavigatorAxisExtremes()}))},getPartsEvents:function(a){var b=this,c=[];[\"shades\",\"handles\"].forEach(function(d){b[d].forEach(function(e,f){c.push(A(e.element,a,function(a){b[d+\"Mousedown\"](a,f)}))})});return c},shadesMousedown:function(a,b){a=this.chart.pointer.normalize(a);var d=this.chart,c=this.xAxis,e=this.zoomedMin,f=this.left,\ng=this.size,h=this.range,l=a.chartX,p,t;d.inverted&&(l=a.chartY,f=this.top);1===b?(this.grabbedCenter=l,this.fixedWidth=h,this.dragOffset=l-e):(a=l-f-h/2,0===b?a=Math.max(0,a):2===b&&a+h>=g&&(a=g-h,this.reversedExtremes?(a-=h,t=this.getUnionExtremes().dataMin):p=this.getUnionExtremes().dataMax),a!==e&&(this.fixedWidth=h,b=c.toFixedRange(a,a+h,t,p),x(b.min)&&d.xAxis[0].setExtremes(Math.min(b.min,b.max),Math.max(b.min,b.max),!0,null,{trigger:\"navigator\"})))},handlesMousedown:function(a,b){this.chart.pointer.normalize(a);\na=this.chart;var d=a.xAxis[0],c=this.reversedExtremes;0===b?(this.grabbedLeft=!0,this.otherHandlePos=this.zoomedMax,this.fixedExtreme=c?d.min:d.max):(this.grabbedRight=!0,this.otherHandlePos=this.zoomedMin,this.fixedExtreme=c?d.max:d.min);a.fixedRange=null},onMouseMove:function(b){var d=this,c=d.chart,f=d.left,g=d.navigatorSize,h=d.range,p=d.dragOffset,t=c.inverted;b.touches&&0===b.touches[0].pageX||(b=c.pointer.normalize(b),c=b.chartX,t&&(f=d.top,c=b.chartY),d.grabbedLeft?(d.hasDragged=!0,d.render(0,\n0,c-f,d.otherHandlePos)):d.grabbedRight?(d.hasDragged=!0,d.render(0,0,d.otherHandlePos,c-f)):d.grabbedCenter&&(d.hasDragged=!0,c<p?c=p:c>g+p-h&&(c=g+p-h),d.render(0,0,c-p,c-p+h)),d.hasDragged&&d.scrollbar&&l(d.scrollbar.options.liveRedraw,a.svg&&!e&&!this.chart.isBoosting)&&(b.DOMType=b.type,setTimeout(function(){d.onMouseUp(b)},0)))},onMouseUp:function(a){var b=this.chart,c=this.xAxis,e=this.scrollbar,f,g,h=a.DOMEvent||a;(!this.hasDragged||e&&e.hasDragged)&&\"scrollbar\"!==a.trigger||(e=this.getUnionExtremes(),\nthis.zoomedMin===this.otherHandlePos?f=this.fixedExtreme:this.zoomedMax===this.otherHandlePos&&(g=this.fixedExtreme),this.zoomedMax===this.size&&(g=this.reversedExtremes?e.dataMin:e.dataMax),0===this.zoomedMin&&(f=this.reversedExtremes?e.dataMax:e.dataMin),c=c.toFixedRange(this.zoomedMin,this.zoomedMax,f,g),x(c.min)&&b.xAxis[0].setExtremes(Math.min(c.min,c.max),Math.max(c.min,c.max),!0,this.hasDragged?!1:null,{trigger:\"navigator\",triggerOp:\"navigator-drag\",DOMEvent:h}));\"mousemove\"!==a.DOMType&&(this.grabbedLeft=\nthis.grabbedRight=this.grabbedCenter=this.fixedWidth=this.fixedExtreme=this.otherHandlePos=this.hasDragged=this.dragOffset=null)},removeEvents:function(){this.eventsToUnbind&&(this.eventsToUnbind.forEach(function(a){a()}),this.eventsToUnbind=void 0);this.removeBaseSeriesEvents()},removeBaseSeriesEvents:function(){var a=this.baseSeries||[];this.navigatorEnabled&&a[0]&&(!1!==this.navigatorOptions.adaptToUpdatedData&&a.forEach(function(a){c(a,\"updatedData\",this.updatedDataHandler)},this),a[0].xAxis&&\nc(a[0].xAxis,\"foundExtremes\",this.modifyBaseAxisExtremes))},init:function(a){var d=a.options,c=d.navigator,e=c.enabled,f=d.scrollbar,g=f.enabled,d=e?c.height:0,h=g?f.height:0;this.handles=[];this.shades=[];this.chart=a;this.setBaseSeries();this.height=d;this.scrollbarHeight=h;this.scrollbarEnabled=g;this.navigatorEnabled=e;this.navigatorOptions=c;this.scrollbarOptions=f;this.outlineHeight=d+h;this.opposite=l(c.opposite,!e&&a.inverted);var p=this,e=p.baseSeries,f=a.xAxis.length,g=a.yAxis.length,n=\ne&&e[0]&&e[0].xAxis||a.xAxis[0]||{options:{}};a.isDirtyBox=!0;p.navigatorEnabled?(p.xAxis=new E(a,b({breaks:n.options.breaks,ordinal:n.options.ordinal},c.xAxis,{id:\"navigator-x-axis\",yAxis:\"navigator-y-axis\",isX:!0,type:\"datetime\",index:f,isInternal:!0,offset:0,keepOrdinalPadding:!0,startOnTick:!1,endOnTick:!1,minPadding:0,maxPadding:0,zoomEnabled:!1},a.inverted?{offsets:[h,0,-h,0],width:d}:{offsets:[0,-h,0,h],height:d})),p.yAxis=new E(a,b(c.yAxis,{id:\"navigator-y-axis\",alignTicks:!1,offset:0,index:g,\nisInternal:!0,zoomEnabled:!1},a.inverted?{width:d}:{height:d})),e||c.series.data?p.updateNavigatorSeries(!1):0===a.series.length&&(p.unbindRedraw=A(a,\"beforeRedraw\",function(){0<a.series.length&&!p.series&&(p.setBaseSeries(),p.unbindRedraw())})),p.reversedExtremes=a.inverted&&!p.xAxis.reversed||!a.inverted&&p.xAxis.reversed,p.renderElements(),p.addMouseEvents()):p.xAxis={translate:function(b,d){var c=a.xAxis[0],e=c.getExtremes(),f=c.len-2*h,g=B(\"min\",c.options.min,e.dataMin),c=B(\"max\",c.options.max,\ne.dataMax)-g;return d?b*c/f+g:f*(b-g)/c},toPixels:function(a){return this.translate(a)},toValue:function(a){return this.translate(a,!0)},toFixedRange:E.prototype.toFixedRange,fake:!0};a.options.scrollbar.enabled&&(a.scrollbar=p.scrollbar=new t(a.renderer,b(a.options.scrollbar,{margin:p.navigatorEnabled?0:10,vertical:a.inverted}),a),A(p.scrollbar,\"changed\",function(b){var d=p.size,c=d*this.to,d=d*this.from;p.hasDragged=p.scrollbar.hasDragged;p.render(0,0,d,c);(a.options.scrollbar.liveRedraw||\"mousemove\"!==\nb.DOMType&&\"touchmove\"!==b.DOMType)&&setTimeout(function(){p.onMouseUp(b)})}));p.addBaseSeriesEvents();p.addChartEvents()},getUnionExtremes:function(a){var b=this.chart.xAxis[0],c=this.xAxis,e=c.options,f=b.options,g;a&&null===b.dataMin||(g={dataMin:l(e&&e.min,B(\"min\",f.min,b.dataMin,c.dataMin,c.min)),dataMax:l(e&&e.max,B(\"max\",f.max,b.dataMax,c.dataMax,c.max))});return g},setBaseSeries:function(b,d){var c=this.chart,e=this.baseSeries=[];b=b||c.options&&c.options.navigator.baseSeries||(c.series.length?\na.find(c.series,function(a){return!a.options.isInternal}).index:0);(c.series||[]).forEach(function(a,d){a.options.isInternal||!a.options.showInNavigator&&(d!==b&&a.options.id!==b||!1===a.options.showInNavigator)||e.push(a)});this.xAxis&&!this.xAxis.fake&&this.updateNavigatorSeries(!0,d)},updateNavigatorSeries:function(e,d){var f=this,g=f.chart,l=f.baseSeries,p,q,t=f.navigatorOptions.series,r,m={enableMouseTracking:!1,index:null,linkedTo:null,group:\"nav\",padXAxis:!1,xAxis:\"navigator-x-axis\",yAxis:\"navigator-y-axis\",\nshowInLegend:!1,stacking:!1,isInternal:!0,states:{inactive:{opacity:1}}},w=f.series=(f.series||[]).filter(function(a){var b=a.baseSeries;return 0>l.indexOf(b)?(b&&(c(b,\"updatedData\",f.updatedDataHandler),delete b.navigatorSeries),a.chart&&a.destroy(),!1):!0});l&&l.length&&l.forEach(function(a){var c=a.navigatorSeries,e=n({color:a.color,visible:a.visible},h(t)?v.navigator.series:t);c&&!1===f.navigatorOptions.adaptToUpdatedData||(m.name=\"Navigator \"+l.length,p=a.options||{},r=p.navigatorOptions||{},\nq=b(p,m,e,r),e=r.data||e.data,f.hasNavigatorData=f.hasNavigatorData||!!e,q.data=e||p.data&&p.data.slice(0),c&&c.options?c.update(q,d):(a.navigatorSeries=g.initSeries(q),a.navigatorSeries.baseSeries=a,w.push(a.navigatorSeries)))});if(t.data&&(!l||!l.length)||h(t))f.hasNavigatorData=!1,t=a.splat(t),t.forEach(function(a,d){m.name=\"Navigator \"+(w.length+1);q=b(v.navigator.series,{color:g.series[d]&&!g.series[d].options.isInternal&&g.series[d].color||g.options.colors[d]||g.options.colors[0]},m,a);q.data=\na.data;q.data&&(f.hasNavigatorData=!0,w.push(g.initSeries(q)))});e&&this.addBaseSeriesEvents()},addBaseSeriesEvents:function(){var a=this,b=a.baseSeries||[];b[0]&&b[0].xAxis&&A(b[0].xAxis,\"foundExtremes\",this.modifyBaseAxisExtremes);b.forEach(function(b){A(b,\"show\",function(){this.navigatorSeries&&this.navigatorSeries.setVisible(!0,!1)});A(b,\"hide\",function(){this.navigatorSeries&&this.navigatorSeries.setVisible(!1,!1)});!1!==this.navigatorOptions.adaptToUpdatedData&&b.xAxis&&A(b,\"updatedData\",this.updatedDataHandler);\nA(b,\"remove\",function(){this.navigatorSeries&&(z(a.series,this.navigatorSeries),x(this.navigatorSeries.options)&&this.navigatorSeries.remove(!1),delete this.navigatorSeries)})},this)},getBaseSeriesMin:function(a){return this.baseSeries.reduce(function(a,b){return Math.min(a,b.xData?b.xData[0]:a)},a)},modifyNavigatorAxisExtremes:function(){var a=this.xAxis,b;a.getExtremes&&(!(b=this.getUnionExtremes(!0))||b.dataMin===a.min&&b.dataMax===a.max||(a.min=b.dataMin,a.max=b.dataMax))},modifyBaseAxisExtremes:function(){var a=\nthis.chart.navigator,b=this.getExtremes(),c=b.dataMin,e=b.dataMax,b=b.max-b.min,f=a.stickToMin,g=a.stickToMax,h=l(this.options.overscroll,0),t,n,m=a.series&&a.series[0],w=!!this.setExtremes;this.eventArgs&&\"rangeSelectorButton\"===this.eventArgs.trigger||(f&&(n=c,t=n+b),g&&(t=e+h,f||(n=Math.max(t-b,a.getBaseSeriesMin(m&&m.xData?m.xData[0]:-Number.MAX_VALUE)))),w&&(f||g)&&r(n)&&(this.min=this.userMin=n,this.max=this.userMax=t));a.stickToMin=a.stickToMax=null},updatedDataHandler:function(){var a=this.chart.navigator,\nb=this.navigatorSeries,c=a.getBaseSeriesMin(this.xData[0]);a.stickToMax=a.reversedExtremes?0===Math.round(a.zoomedMin):Math.round(a.zoomedMax)>=Math.round(a.size);a.stickToMin=r(this.xAxis.min)&&this.xAxis.min<=c&&(!this.chart.fixedRange||!a.stickToMax);b&&!a.hasNavigatorData&&(b.options.pointStart=this.xData[0],b.setData(this.options.data,!1,null,!1))},addChartEvents:function(){this.eventsToUnbind||(this.eventsToUnbind=[]);this.eventsToUnbind.push(A(this.chart,\"redraw\",function(){var a=this.navigator,\nb=a&&(a.baseSeries&&a.baseSeries[0]&&a.baseSeries[0].xAxis||a.scrollbar&&this.xAxis[0]);b&&a.render(b.min,b.max)}),A(this.chart,\"getMargins\",function(){var a=this.navigator,b=a.opposite?\"plotTop\":\"marginBottom\";this.inverted&&(b=a.opposite?\"marginRight\":\"plotLeft\");this[b]=(this[b]||0)+(a.navigatorEnabled||!this.inverted?a.outlineHeight:0)+a.navigatorOptions.margin}))},destroy:function(){this.removeEvents();this.xAxis&&(z(this.chart.xAxis,this.xAxis),z(this.chart.axes,this.xAxis));this.yAxis&&(z(this.chart.yAxis,\nthis.yAxis),z(this.chart.axes,this.yAxis));(this.series||[]).forEach(function(a){a.destroy&&a.destroy()});\"series xAxis yAxis shades outline scrollbarTrack scrollbarRifles scrollbarGroup scrollbar navigatorGroup rendered\".split(\" \").forEach(function(a){this[a]&&this[a].destroy&&this[a].destroy();this[a]=null},this);[this.handles].forEach(function(a){y(a)},this)}};a.Navigator||(a.Navigator=C,A(E,\"zoom\",function(a){var b=this.chart.options,c=b.chart.zoomType,f=b.chart.pinchType,g=b.navigator,b=b.rangeSelector;\nthis.isXAxis&&(g&&g.enabled||b&&b.enabled)&&(\"y\"===c?a.zoomed=!1:(!e&&\"xy\"===c||e&&\"xy\"===f)&&this.options.range&&(c=this.previousZoom,x(a.newMin)?this.previousZoom=[this.min,this.max]:c&&(a.newMin=c[0],a.newMax=c[1],delete this.previousZoom)));void 0!==a.zoomed&&a.preventDefault()}),A(m,\"beforeShowResetZoom\",function(){var a=this.options,b=a.navigator,c=a.rangeSelector;if((b&&b.enabled||c&&c.enabled)&&(!e&&\"x\"===a.chart.zoomType||e&&\"x\"===a.chart.pinchType))return!1}),A(m,\"beforeRender\",function(){var a=\nthis.options;if(a.navigator.enabled||a.scrollbar.enabled)this.scroller=this.navigator=new C(this)}),A(m,\"afterSetChartSize\",function(){var a=this.legend,b=this.navigator,c,e,f,g;b&&(e=a&&a.options,f=b.xAxis,g=b.yAxis,c=b.scrollbarHeight,this.inverted?(b.left=b.opposite?this.chartWidth-c-b.height:this.spacing[3]+c,b.top=this.plotTop+c):(b.left=this.plotLeft+c,b.top=b.navigatorOptions.top||this.chartHeight-b.height-c-this.spacing[2]-(this.rangeSelector&&this.extraBottomMargin?this.rangeSelector.getHeight():\n0)-(e&&\"bottom\"===e.verticalAlign&&e.enabled&&!e.floating?a.legendHeight+l(e.margin,10):0)),f&&g&&(this.inverted?f.options.left=g.options.left=b.left:f.options.top=g.options.top=b.top,f.setAxisSize(),g.setAxisSize()))}),A(m,\"update\",function(a){var d=a.options.navigator||{},c=a.options.scrollbar||{};this.navigator||this.scroller||!d.enabled&&!c.enabled||(b(!0,this.options.navigator,d),b(!0,this.options.scrollbar,c),delete a.options.navigator,delete a.options.scrollbar)}),A(m,\"afterUpdate\",function(a){this.navigator||\nthis.scroller||!this.options.navigator.enabled&&!this.options.scrollbar.enabled||(this.scroller=this.navigator=new C(this),l(a.redraw,!0)&&this.redraw(a.animation))}),A(m,\"afterAddSeries\",function(){this.navigator&&this.navigator.setBaseSeries(null,!1)}),A(F,\"afterUpdate\",function(){this.chart.navigator&&!this.options.isInternal&&this.chart.navigator.setBaseSeries(null,!1)}),m.prototype.callbacks.push(function(a){var b=a.navigator;b&&a.xAxis[0]&&(a=a.xAxis[0].getExtremes(),b.render(a.min,a.max))}))});\nI(H,\"parts/OrdinalAxis.js\",[H[\"parts/Globals.js\"]],function(a){var C=a.addEvent,A=a.Axis,E=a.Chart,m=a.css,g=a.defined,v=a.extend,x=a.noop,y=a.pick,z=a.timeUnits;C(a.Series,\"updatedData\",function(){var a=this.xAxis;a&&a.options.ordinal&&delete a.ordinalIndex});A.prototype.getTimeTicks=function(a,f,h,r,e,b,l){var c=0,t,n,m={},v,p,d,k=[],u=-Number.MAX_VALUE,x=this.options.tickPixelInterval,y=this.chart.time,q=[];if(!this.options.ordinal&&!this.options.breaks||!e||3>e.length||void 0===f)return y.getTimeTicks.apply(y,\narguments);p=e.length;for(t=0;t<p;t++){d=t&&e[t-1]>h;e[t]<f&&(c=t);if(t===p-1||e[t+1]-e[t]>5*b||d){if(e[t]>u){for(n=y.getTimeTicks(a,e[c],e[t],r);n.length&&n[0]<=u;)n.shift();n.length&&(u=n[n.length-1]);q.push(k.length);k=k.concat(n)}c=t+1}if(d)break}n=n.info;if(l&&n.unitRange<=z.hour){t=k.length-1;for(c=1;c<t;c++)y.dateFormat(\"%d\",k[c])!==y.dateFormat(\"%d\",k[c-1])&&(m[k[c]]=\"day\",v=!0);v&&(m[k[0]]=\"day\");n.higherRanks=m}n.segmentStarts=q;k.info=n;if(l&&g(x)){c=q=k.length;v=[];for(var A,y=[];c--;)t=\nthis.translate(k[c]),A&&(y[c]=A-t),v[c]=A=t;y.sort();y=y[Math.floor(y.length/2)];y<.6*x&&(y=null);c=k[q-1]>h?q-1:q;for(A=void 0;c--;)t=v[c],q=Math.abs(A-t),A&&q<.8*x&&(null===y||q<.8*y)?(m[k[c]]&&!m[k[c+1]]?(q=c+1,A=t):q=c,k.splice(q,1)):A=t}return k};v(A.prototype,{beforeSetTickPositions:function(){var a,f=[],g,r=!1,e,b=this.getExtremes(),l=b.min,c=b.max,t,m=this.isXAxis&&!!this.options.breaks,b=this.options.ordinal,w=Number.MAX_VALUE,v=this.chart.options.chart.ignoreHiddenSeries,p;if(b||m){this.series.forEach(function(b,\nc){g=[];if(!(v&&!1===b.visible||!1===b.takeOrdinalPosition&&!m)&&(f=f.concat(b.processedXData),a=f.length,f.sort(function(a,b){return a-b}),w=Math.min(w,y(b.closestPointRange,w)),a)){for(c=0;c<a-1;)f[c]!==f[c+1]&&g.push(f[c+1]),c++;g[0]!==f[0]&&g.unshift(f[0]);f=g}b.isSeriesBoosting&&(p=!0)});p&&(f.length=0);a=f.length;if(2<a){e=f[1]-f[0];for(t=a-1;t--&&!r;)f[t+1]-f[t]!==e&&(r=!0);!this.options.keepOrdinalPadding&&(f[0]-l>e||c-f[f.length-1]>e)&&(r=!0)}else this.options.overscroll&&(2===a?w=f[1]-f[0]:\n1===a?(w=this.options.overscroll,f=[f[0],f[0]+w]):w=this.overscrollPointsRange);r?(this.options.overscroll&&(this.overscrollPointsRange=w,f=f.concat(this.getOverscrollPositions())),this.ordinalPositions=f,e=this.ordinal2lin(Math.max(l,f[0]),!0),t=Math.max(this.ordinal2lin(Math.min(c,f[f.length-1]),!0),1),this.ordinalSlope=c=(c-l)/(t-e),this.ordinalOffset=l-e*c):(this.overscrollPointsRange=y(this.closestPointRange,this.overscrollPointsRange),this.ordinalPositions=this.ordinalSlope=this.ordinalOffset=\nvoid 0)}this.isOrdinal=b&&r;this.groupIntervalFactor=null},val2lin:function(a,f){var g=this.ordinalPositions;if(g){var n=g.length,e,b;for(e=n;e--;)if(g[e]===a){b=e;break}for(e=n-1;e--;)if(a>g[e]||0===e){a=(a-g[e])/(g[e+1]-g[e]);b=e+a;break}f=f?b:this.ordinalSlope*(b||0)+this.ordinalOffset}else f=a;return f},lin2val:function(a,f){var g=this.ordinalPositions;if(g){var n=this.ordinalSlope,e=this.ordinalOffset,b=g.length-1,l;if(f)0>a?a=g[0]:a>b?a=g[b]:(b=Math.floor(a),l=a-b);else for(;b--;)if(f=n*b+e,\na>=f){n=n*(b+1)+e;l=(a-f)/(n-f);break}return void 0!==l&&void 0!==g[b]?g[b]+(l?l*(g[b+1]-g[b]):0):a}return a},getExtendedPositions:function(){var a=this,f=a.chart,g=a.series[0].currentDataGrouping,r=a.ordinalIndex,e=g?g.count+g.unitName:\"raw\",b=a.options.overscroll,l=a.getExtremes(),c,t;r||(r=a.ordinalIndex={});r[e]||(c={series:[],chart:f,getExtremes:function(){return{min:l.dataMin,max:l.dataMax+b}},options:{ordinal:!0},val2lin:A.prototype.val2lin,ordinal2lin:A.prototype.ordinal2lin},a.series.forEach(function(b){t=\n{xAxis:c,xData:b.xData.slice(),chart:f,destroyGroupedData:x};t.xData=t.xData.concat(a.getOverscrollPositions());t.options={dataGrouping:g?{enabled:!0,forced:!0,approximation:\"open\",units:[[g.unitName,[g.count]]]}:{enabled:!1}};b.processData.apply(t);c.series.push(t)}),a.beforeSetTickPositions.apply(c),r[e]=c.ordinalPositions);return r[e]},getOverscrollPositions:function(){var g=this.options.overscroll,f=this.overscrollPointsRange,h=[],r=this.dataMax;if(a.defined(f))for(h.push(r);r<=this.dataMax+g;)r+=\nf,h.push(r);return h},getGroupIntervalFactor:function(a,f,g){var h;g=g.processedXData;var e=g.length,b=[];h=this.groupIntervalFactor;if(!h){for(h=0;h<e-1;h++)b[h]=g[h+1]-g[h];b.sort(function(a,b){return a-b});b=b[Math.floor(e/2)];a=Math.max(a,g[0]);f=Math.min(f,g[e-1]);this.groupIntervalFactor=h=e*b/(f-a)}return h},postProcessTickInterval:function(a){var f=this.ordinalSlope;return f?this.options.breaks?this.closestPointRange||a:a/(f/this.closestPointRange):a}});A.prototype.ordinal2lin=A.prototype.val2lin;\nC(E,\"pan\",function(a){var f=this.xAxis[0],g=f.options.overscroll,n=a.originalEvent.chartX,e=!1;if(f.options.ordinal&&f.series.length){var b=this.mouseDownX,l=f.getExtremes(),c=l.dataMax,t=l.min,v=l.max,w=this.hoverPoints,x=f.closestPointRange||f.overscrollPointsRange,b=(b-n)/(f.translationSlope*(f.ordinalSlope||x)),p={ordinalPositions:f.getExtendedPositions()},x=f.lin2val,d=f.val2lin,k;p.ordinalPositions?1<Math.abs(b)&&(w&&w.forEach(function(a){a.setState()}),0>b?(w=p,k=f.ordinalPositions?f:p):(w=\nf.ordinalPositions?f:p,k=p),p=k.ordinalPositions,c>p[p.length-1]&&p.push(c),this.fixedRange=v-t,b=f.toFixedRange(null,null,x.apply(w,[d.apply(w,[t,!0])+b,!0]),x.apply(k,[d.apply(k,[v,!0])+b,!0])),b.min>=Math.min(l.dataMin,t)&&b.max<=Math.max(c,v)+g&&f.setExtremes(b.min,b.max,!0,!1,{trigger:\"pan\"}),this.mouseDownX=n,m(this.container,{cursor:\"move\"})):e=!0}else e=!0;e?g&&(f.max=f.dataMax+g):a.preventDefault()});C(A,\"foundExtremes\",function(){this.isXAxis&&g(this.options.overscroll)&&this.max===this.dataMax&&\n(!this.chart.mouseIsDown||this.isInternal)&&(!this.eventArgs||this.eventArgs&&\"navigator\"!==this.eventArgs.trigger)&&(this.max+=this.options.overscroll,!this.isInternal&&g(this.userMin)&&(this.min+=this.options.overscroll))});C(A,\"afterSetScale\",function(){this.horiz&&!this.isDirty&&(this.isDirty=this.isOrdinal&&this.chart.navigator&&!this.chart.navigator.adaptToUpdatedData)})});I(H,\"modules/broken-axis.src.js\",[H[\"parts/Globals.js\"]],function(a){var C=a.addEvent,A=a.pick,E=a.extend,m=a.isArray,g=\na.find,v=a.fireEvent,x=a.Axis,y=a.Series,z=function(a,f){return g(f,function(f){return f.from<a&&a<f.to})};E(x.prototype,{isInBreak:function(a,f){var g=a.repeat||Infinity,m=a.from,e=a.to-a.from;f=f>=m?(f-m)%g:g-(m-f)%g;return a.inclusive?f<=e:f<e&&0!==f},isInAnyBreak:function(a,f){var g=this.options.breaks,m=g&&g.length,e,b,l;if(m){for(;m--;)this.isInBreak(g[m],a)&&(e=!0,b||(b=A(g[m].showPoints,!this.isXAxis)));l=e&&f?e&&!b:e}return l}});C(x,\"afterInit\",function(){\"function\"===typeof this.setBreaks&&\nthis.setBreaks(this.options.breaks,!1)});C(x,\"afterSetTickPositions\",function(){if(this.isBroken){var a=this.tickPositions,f=this.tickPositions.info,g=[],m;for(m=0;m<a.length;m++)this.isInAnyBreak(a[m])||g.push(a[m]);this.tickPositions=g;this.tickPositions.info=f}});C(x,\"afterSetOptions\",function(){this.isBroken&&(this.options.ordinal=!1)});x.prototype.setBreaks=function(a,f){function g(a){var b=a,f,g;for(g=0;g<e.breakArray.length;g++)if(f=e.breakArray[g],f.to<=a)b-=f.len;else if(f.from>=a)break;\nelse if(e.isInBreak(f,a)){b-=a-f.from;break}return b}function n(a){var b,f;for(f=0;f<e.breakArray.length&&!(b=e.breakArray[f],b.from>=a);f++)b.to<a?a+=b.len:e.isInBreak(b,a)&&(a+=b.len);return a}var e=this,b=m(a)&&!!a.length;e.isDirty=e.isBroken!==b;e.isBroken=b;e.options.breaks=e.userOptions.breaks=a;e.forceRedraw=!0;b||e.val2lin!==g||(delete e.val2lin,delete e.lin2val);b&&(e.userOptions.ordinal=!1,e.val2lin=g,e.lin2val=n,e.setExtremes=function(a,b,e,f,g){if(this.isBroken){for(var c,h=this.options.breaks;c=\nz(a,h);)a=c.to;for(;c=z(b,h);)b=c.from;b<a&&(b=a)}x.prototype.setExtremes.call(this,a,b,e,f,g)},e.setAxisTranslation=function(a){x.prototype.setAxisTranslation.call(this,a);this.unitLength=null;if(this.isBroken){a=e.options.breaks;var b=[],f=[],g=0,h,l,p=e.userMin||e.min,d=e.userMax||e.max,k=A(e.pointRangePadding,0),u,m;a.forEach(function(a){l=a.repeat||Infinity;e.isInBreak(a,p)&&(p+=a.to%l-p%l);e.isInBreak(a,d)&&(d-=d%l-a.from%l)});a.forEach(function(a){u=a.from;for(l=a.repeat||Infinity;u-l>p;)u-=\nl;for(;u<p;)u+=l;for(m=u;m<d;m+=l)b.push({value:m,move:\"in\"}),b.push({value:m+(a.to-a.from),move:\"out\",size:a.breakSize})});b.sort(function(a,b){return a.value===b.value?(\"in\"===a.move?0:1)-(\"in\"===b.move?0:1):a.value-b.value});h=0;u=p;b.forEach(function(a){h+=\"in\"===a.move?1:-1;1===h&&\"in\"===a.move&&(u=a.value);0===h&&(f.push({from:u,to:a.value,len:a.value-u-(a.size||0)}),g+=a.value-u-(a.size||0))});e.breakArray=f;e.unitLength=d-p-g+k;v(e,\"afterBreaks\");e.staticScale?e.transA=e.staticScale:e.unitLength&&\n(e.transA*=(d-e.min+k)/e.unitLength);k&&(e.minPixelPadding=e.transA*e.minPointOffset);e.min=p;e.max=d}});A(f,!0)&&this.chart.redraw()};C(y,\"afterGeneratePoints\",function(){var a=this.xAxis,f=this.yAxis,g=this.points,m,e=g.length,b=this.options.connectNulls,l;if(a&&f&&(a.options.breaks||f.options.breaks))for(;e--;)m=g[e],l=null===m.y&&!1===b,l||!a.isInAnyBreak(m.x,!0)&&!f.isInAnyBreak(m.y,!0)||(g.splice(e,1),this.data[e]&&this.data[e].destroyElements())});C(y,\"afterRender\",function(){this.drawBreaks(this.xAxis,\n[\"x\"]);this.drawBreaks(this.yAxis,A(this.pointArrayMap,[\"y\"]))});a.Series.prototype.drawBreaks=function(a,f){var g=this,m=g.points,e,b,l,c;a&&f.forEach(function(f){e=a.breakArray||[];b=a.isXAxis?a.min:A(g.options.threshold,a.min);m.forEach(function(g){c=A(g[\"stack\"+f.toUpperCase()],g[f]);e.forEach(function(e){l=!1;if(b<e.from&&c>e.to||b>e.from&&c<e.from)l=\"pointBreak\";else if(b<e.from&&c>e.from&&c<e.to||b>e.from&&c>e.to&&c<e.from)l=\"pointInBreak\";l&&v(a,l,{point:g,brk:e})})})})};a.Series.prototype.gappedPath=\nfunction(){var g=this.currentDataGrouping,f=g&&g.gapSize,g=this.options.gapSize,h=this.points.slice(),m=h.length-1,e=this.yAxis;if(g&&0<m)for(\"value\"!==this.options.gapUnit&&(g*=this.closestPointRange),f&&f>g&&(g=f);m--;)h[m+1].x-h[m].x>g&&(f=(h[m].x+h[m+1].x)/2,h.splice(m+1,0,{isNull:!0,x:f}),this.options.stacking&&(f=e.stacks[this.stackKey][f]=new a.StackItem(e,e.options.stackLabels,!1,f,this.stack),f.total=0));return this.getGraphPath(h)}});I(H,\"masters/modules/broken-axis.src.js\",[],function(){});\nI(H,\"parts/DataGrouping.js\",[H[\"parts/Globals.js\"]],function(a){var C=a.addEvent,A=a.arrayMax,E=a.arrayMin,m=a.Axis,g=a.defaultPlotOptions,v=a.defined,x=a.extend,y=a.format,z=a.isNumber,n=a.merge,f=a.pick,h=a.Point,r=a.Series,e=a.Tooltip,b=a.approximations={sum:function(a){var b=a.length,d;if(!b&&a.hasNulls)d=null;else if(b)for(d=0;b--;)d+=a[b];return d},average:function(a){var d=a.length;a=b.sum(a);z(a)&&d&&(a/=d);return a},averages:function(){var a=[];[].forEach.call(arguments,function(d){a.push(b.average(d))});\nreturn void 0===a[0]?void 0:a},open:function(a){return a.length?a[0]:a.hasNulls?null:void 0},high:function(a){return a.length?A(a):a.hasNulls?null:void 0},low:function(a){return a.length?E(a):a.hasNulls?null:void 0},close:function(a){return a.length?a[a.length-1]:a.hasNulls?null:void 0},ohlc:function(a,d,c,e){a=b.open(a);d=b.high(d);c=b.low(c);e=b.close(e);if(z(a)||z(d)||z(c)||z(e))return[a,d,c,e]},range:function(a,d){a=b.low(a);d=b.high(d);if(z(a)||z(d))return[a,d];if(null===a&&null===d)return null}},\nl=function(a,d,c,e){var f=this,g=f.data,h=f.options&&f.options.data,k=[],l=[],p=[],t=a.length,m,u,r=!!d,w=[],x=f.pointArrayMap,y=x&&x.length,B=[\"x\"].concat(x||[\"y\"]),D=0,F=0,G,A;e=\"function\"===typeof e?e:b[e]?b[e]:b[f.getDGApproximation&&f.getDGApproximation()||\"average\"];y?x.forEach(function(){w.push([])}):w.push([]);G=y||1;for(A=0;A<=t&&!(a[A]>=c[0]);A++);for(A;A<=t;A++){for(;void 0!==c[D+1]&&a[A]>=c[D+1]||A===t;){m=c[D];f.dataGroupInfo={start:f.cropStart+F,length:w[0].length};u=e.apply(f,w);f.pointClass&&\n!v(f.dataGroupInfo.options)&&(f.dataGroupInfo.options=n(f.pointClass.prototype.optionsToObject.call({series:f},f.options.data[f.cropStart+F])),B.forEach(function(a){delete f.dataGroupInfo.options[a]}));void 0!==u&&(k.push(m),l.push(u),p.push(f.dataGroupInfo));F=A;for(m=0;m<G;m++)w[m].length=0,w[m].hasNulls=!1;D+=1;if(A===t)break}if(A===t)break;if(x){m=f.cropStart+A;u=g&&g[m]||f.pointClass.prototype.applyOptions.apply({series:f},[h[m]]);var C;for(m=0;m<y;m++)C=u[x[m]],z(C)?w[m].push(C):null===C&&(w[m].hasNulls=\n!0)}else m=r?d[A]:null,z(m)?w[0].push(m):null===m&&(w[0].hasNulls=!0)}return{groupedXData:k,groupedYData:l,groupMap:p}},c={approximations:b,groupData:l},t=r.prototype,F=t.processData,w=t.generatePoints,B={groupPixelWidth:2,dateTimeLabelFormats:{millisecond:[\"%A, %b %e, %H:%M:%S.%L\",\"%A, %b %e, %H:%M:%S.%L\",\"-%H:%M:%S.%L\"],second:[\"%A, %b %e, %H:%M:%S\",\"%A, %b %e, %H:%M:%S\",\"-%H:%M:%S\"],minute:[\"%A, %b %e, %H:%M\",\"%A, %b %e, %H:%M\",\"-%H:%M\"],hour:[\"%A, %b %e, %H:%M\",\"%A, %b %e, %H:%M\",\"-%H:%M\"],day:[\"%A, %b %e, %Y\",\n\"%A, %b %e\",\"-%A, %b %e, %Y\"],week:[\"Week from %A, %b %e, %Y\",\"%A, %b %e\",\"-%A, %b %e, %Y\"],month:[\"%B %Y\",\"%B\",\"-%B %Y\"],year:[\"%Y\",\"%Y\",\"-%Y\"]}},p={line:{},spline:{},area:{},areaspline:{},column:{groupPixelWidth:10},columnrange:{groupPixelWidth:10},candlestick:{groupPixelWidth:10},ohlc:{groupPixelWidth:5}},d=a.defaultDataGroupingUnits=[[\"millisecond\",[1,2,5,10,20,25,50,100,200,500]],[\"second\",[1,2,5,10,15,30]],[\"minute\",[1,2,5,10,15,30]],[\"hour\",[1,2,3,4,6,8,12]],[\"day\",[1]],[\"week\",[1]],[\"month\",\n[1,3,6]],[\"year\",null]];t.getDGApproximation=function(){return a.seriesTypes.arearange&&this instanceof a.seriesTypes.arearange?\"range\":a.seriesTypes.ohlc&&this instanceof a.seriesTypes.ohlc?\"ohlc\":a.seriesTypes.column&&this instanceof a.seriesTypes.column?\"sum\":\"average\"};t.groupData=l;t.processData=function(){var a=this.chart,b=this.options.dataGrouping,c=!1!==this.allowDG&&b&&f(b.enabled,a.options.isStock),e=this.visible||!a.options.chart.ignoreHiddenSeries,g,h=this.currentDataGrouping,l,m=!1;\nthis.forceCrop=c;this.groupPixelWidth=null;this.hasProcessed=!0;c&&!this.requireSorting&&(this.requireSorting=m=!0);c=!1===F.apply(this,arguments)||!c;m&&(this.requireSorting=!1);if(!c){this.destroyGroupedData();var p,c=b.groupAll?this.xData:this.processedXData,n=b.groupAll?this.yData:this.processedYData,r=a.plotSizeX,a=this.xAxis,w=a.options.ordinal,x=this.groupPixelWidth=a.getGroupPixelWidth&&a.getGroupPixelWidth();if(x){this.isDirty=g=!0;this.points=null;m=a.getExtremes();l=m.min;var m=m.max,w=\nw&&a.getGroupIntervalFactor(l,m,this)||1,x=x*(m-l)/r*w,r=a.getTimeTicks(a.normalizeTimeTickInterval(x,b.units||d),Math.min(l,c[0]),Math.max(m,c[c.length-1]),a.options.startOfWeek,c,this.closestPointRange),n=t.groupData.apply(this,[c,n,r,b.approximation]),c=n.groupedXData,w=n.groupedYData,y=0;if(b.smoothed&&c.length){p=c.length-1;for(c[p]=Math.min(c[p],m);p--&&0<p;)c[p]+=x/2;c[0]=Math.max(c[0],l)}for(p=1;p<r.length;p++)r.info.segmentStarts&&-1!==r.info.segmentStarts.indexOf(p)||(y=Math.max(r[p]-r[p-\n1],y));l=r.info;l.gapSize=y;this.closestPointRange=r.info.totalRange;this.groupMap=n.groupMap;if(v(c[0])&&c[0]<a.dataMin&&e){if(!v(a.options.min)&&a.min<=a.dataMin||a.min===a.dataMin)a.min=c[0];a.dataMin=c[0]}b.groupAll&&(b=this.cropData(c,w,a.min,a.max,1),c=b.xData,w=b.yData);this.processedXData=c;this.processedYData=w}else this.groupMap=null;this.hasGroupedData=g;this.currentDataGrouping=l;this.preventGraphAnimation=(h&&h.totalRange)!==(l&&l.totalRange)}};t.destroyGroupedData=function(){var a=this.groupedData;\n(a||[]).forEach(function(b,d){b&&(a[d]=b.destroy?b.destroy():null)});this.groupedData=null};t.generatePoints=function(){w.apply(this);this.destroyGroupedData();this.groupedData=this.hasGroupedData?this.points:null};C(h,\"update\",function(){if(this.dataGroup)return a.error(24,!1,this.series.chart),!1});C(e,\"headerFormatter\",function(a){var b=this.chart.time,d=a.labelConfig,c=d.series,e=c.tooltipOptions,f=c.options.dataGrouping,g=e.xDateFormat,h,k=c.xAxis,l,m=e[(a.isFooter?\"footer\":\"header\")+\"Format\"];\nk&&\"datetime\"===k.options.type&&f&&z(d.key)&&(l=c.currentDataGrouping,f=f.dateTimeLabelFormats||B.dateTimeLabelFormats,l?(e=f[l.unitName],1===l.count?g=e[0]:(g=e[1],h=e[2])):!g&&f&&(g=this.getXDateFormat(d,e,k)),g=b.dateFormat(g,d.key),h&&(g+=b.dateFormat(h,d.key+l.totalRange-1)),c.chart.styledMode&&(m=this.styledModeFormat(m)),a.text=y(m,{point:x(d.point,{key:g}),series:c},b),a.preventDefault())});C(r,\"destroy\",t.destroyGroupedData);C(r,\"afterSetOptions\",function(a){a=a.options;var b=this.type,d=\nthis.chart.options.plotOptions,c=g[b].dataGrouping,e=this.useCommonDataGrouping&&B;if(p[b]||e)c||(c=n(B,p[b])),a.dataGrouping=n(e,c,d.series&&d.series.dataGrouping,d[b].dataGrouping,this.userOptions.dataGrouping)});C(m,\"afterSetScale\",function(){this.series.forEach(function(a){a.hasProcessed=!1})});m.prototype.getGroupPixelWidth=function(){var a=this.series,b=a.length,d,c=0,e=!1,g;for(d=b;d--;)(g=a[d].options.dataGrouping)&&(c=Math.max(c,f(g.groupPixelWidth,B.groupPixelWidth)));for(d=b;d--;)(g=a[d].options.dataGrouping)&&\na[d].hasProcessed&&(b=(a[d].processedXData||a[d].data).length,a[d].groupPixelWidth||b>this.chart.plotSizeX/c||b&&g.forced)&&(e=!0);return e?c:0};m.prototype.setDataGrouping=function(a,b){var d;b=f(b,!0);a||(a={forced:!1,units:null});if(this instanceof m)for(d=this.series.length;d--;)this.series[d].update({dataGrouping:a},!1);else this.chart.options.series.forEach(function(b){b.dataGrouping=a},!1);this.ordinalSlope=null;b&&this.chart.redraw()};return a.dataGrouping=c});I(H,\"parts/OHLCSeries.js\",[H[\"parts/Globals.js\"]],\nfunction(a){var C=a.Point,A=a.seriesType,E=a.seriesTypes;A(\"ohlc\",\"column\",{lineWidth:1,tooltip:{pointFormat:'\\x3cspan style\\x3d\"color:{point.color}\"\\x3e\\u25cf\\x3c/span\\x3e \\x3cb\\x3e {series.name}\\x3c/b\\x3e\\x3cbr/\\x3eOpen: {point.open}\\x3cbr/\\x3eHigh: {point.high}\\x3cbr/\\x3eLow: {point.low}\\x3cbr/\\x3eClose: {point.close}\\x3cbr/\\x3e'},threshold:null,states:{hover:{lineWidth:3}},stickyTracking:!0},{directTouch:!1,pointArrayMap:[\"open\",\"high\",\"low\",\"close\"],toYData:function(a){return[a.open,a.high,a.low,\na.close]},pointValKey:\"close\",pointAttrToOptions:{stroke:\"color\",\"stroke-width\":\"lineWidth\"},init:function(){E.column.prototype.init.apply(this,arguments);this.options.stacking=!1},pointAttribs:function(a,g){g=E.column.prototype.pointAttribs.call(this,a,g);var m=this.options;delete g.fill;!a.options.color&&m.upColor&&a.open<a.close&&(g.stroke=m.upColor);return g},translate:function(){var a=this,g=a.yAxis,v=!!a.modifyValue,x=[\"plotOpen\",\"plotHigh\",\"plotLow\",\"plotClose\",\"yBottom\"];E.column.prototype.translate.apply(a);\na.points.forEach(function(m){[m.open,m.high,m.low,m.close,m.low].forEach(function(y,n){null!==y&&(v&&(y=a.modifyValue(y)),m[x[n]]=g.toPixels(y,!0))});m.tooltipPos[1]=m.plotHigh+g.pos-a.chart.plotTop})},drawPoints:function(){var a=this,g=a.chart;a.points.forEach(function(m){var v,y,z,n,f=m.graphic,h,r=!f;void 0!==m.plotY&&(f||(m.graphic=f=g.renderer.path().add(a.group)),g.styledMode||f.attr(a.pointAttribs(m,m.selected&&\"select\")),y=f.strokeWidth()%2/2,h=Math.round(m.plotX)-y,z=Math.round(m.shapeArgs.width/\n2),n=[\"M\",h,Math.round(m.yBottom),\"L\",h,Math.round(m.plotHigh)],null!==m.open&&(v=Math.round(m.plotOpen)+y,n.push(\"M\",h,v,\"L\",h-z,v)),null!==m.close&&(v=Math.round(m.plotClose)+y,n.push(\"M\",h,v,\"L\",h+z,v)),f[r?\"attr\":\"animate\"]({d:n}).addClass(m.getClassName(),!0))})},animate:null},{getClassName:function(){return C.prototype.getClassName.call(this)+(this.open<this.close?\" highcharts-point-up\":\" highcharts-point-down\")}})});I(H,\"parts/CandlestickSeries.js\",[H[\"parts/Globals.js\"]],function(a){var C=\na.defaultPlotOptions,A=a.merge,E=a.seriesType,m=a.seriesTypes;E(\"candlestick\",\"ohlc\",A(C.column,{states:{hover:{lineWidth:2}},tooltip:C.ohlc.tooltip,threshold:null,lineColor:\"#000000\",lineWidth:1,upColor:\"#ffffff\",stickyTracking:!0}),{pointAttribs:function(a,v){var g=m.column.prototype.pointAttribs.call(this,a,v),y=this.options,z=a.open<a.close,n=y.lineColor||this.color;g[\"stroke-width\"]=y.lineWidth;g.fill=a.options.color||(z?y.upColor||this.color:this.color);g.stroke=a.lineColor||(z?y.upLineColor||\nn:n);v&&(a=y.states[v],g.fill=a.color||g.fill,g.stroke=a.lineColor||g.stroke,g[\"stroke-width\"]=a.lineWidth||g[\"stroke-width\"]);return g},drawPoints:function(){var a=this,m=a.chart,x=a.yAxis.reversed;a.points.forEach(function(g){var v=g.graphic,n,f,h,r,e,b,l,c=!v;void 0!==g.plotY&&(v||(g.graphic=v=m.renderer.path().add(a.group)),a.chart.styledMode||v.attr(a.pointAttribs(g,g.selected&&\"select\")).shadow(a.options.shadow),e=v.strokeWidth()%2/2,b=Math.round(g.plotX)-e,n=g.plotOpen,f=g.plotClose,h=Math.min(n,\nf),n=Math.max(n,f),l=Math.round(g.shapeArgs.width/2),f=x?n!==g.yBottom:Math.round(h)!==Math.round(g.plotHigh),r=x?Math.round(h)!==Math.round(g.plotHigh):n!==g.yBottom,h=Math.round(h)+e,n=Math.round(n)+e,e=[],e.push(\"M\",b-l,n,\"L\",b-l,h,\"L\",b+l,h,\"L\",b+l,n,\"Z\",\"M\",b,h,\"L\",b,f?Math.round(x?g.yBottom:g.plotHigh):h,\"M\",b,n,\"L\",b,r?Math.round(x?g.plotHigh:g.yBottom):n),v[c?\"attr\":\"animate\"]({d:e}).addClass(g.getClassName(),!0))})}})});I(H,\"mixins/on-series.js\",[H[\"parts/Globals.js\"]],function(a){var C=\na.defined,A=a.seriesTypes,E=a.stableSort;return{getPlotBox:function(){return a.Series.prototype.getPlotBox.call(this.options.onSeries&&this.chart.get(this.options.onSeries)||this)},translate:function(){A.column.prototype.translate.apply(this);var a=this,g=a.options,v=a.chart,x=a.points,y=x.length-1,z,n=g.onSeries,n=n&&v.get(n),g=g.onKey||\"y\",f=n&&n.options.step,h=n&&n.points,r=h&&h.length,e=v.inverted,b=a.xAxis,l=a.yAxis,c=0,t,F,w,B;if(n&&n.visible&&r)for(c=(n.pointXOffset||0)+(n.barW||0)/2,v=n.currentDataGrouping,\nF=h[r-1].x+(v?v.totalRange:0),E(x,function(a,b){return a.x-b.x}),g=\"plot\"+g[0].toUpperCase()+g.substr(1);r--&&x[y]&&!(t=h[r],v=x[y],v.y=t.y,t.x<=v.x&&void 0!==t[g]&&(v.x<=F&&(v.plotY=t[g],t.x<v.x&&!f&&(w=h[r+1])&&void 0!==w[g]&&(B=(v.x-t.x)/(w.x-t.x),v.plotY+=B*(w[g]-t[g]),v.y+=B*(w.y-t.y))),y--,r++,0>y)););x.forEach(function(f,d){var g;f.plotX+=c;if(void 0===f.plotY||e)0<=f.plotX&&f.plotX<=b.len?e?(f.plotY=b.translate(f.x,0,1,0,1),f.plotX=C(f.y)?l.translate(f.y,0,0,0,1):0):f.plotY=(b.opposite?0:\na.yAxis.len)+b.offset:f.shapeArgs={};(z=x[d-1])&&z.plotX===f.plotX&&(void 0===z.stackIndex&&(z.stackIndex=0),g=z.stackIndex+1);f.stackIndex=g});this.onSeries=n}}});I(H,\"parts/FlagsSeries.js\",[H[\"parts/Globals.js\"],H[\"mixins/on-series.js\"]],function(a,C){function A(a){h[a+\"pin\"]=function(e,b,f,c,g){var l=g&&g.anchorX;g=g&&g.anchorY;var m;\"circle\"===a&&c>f&&(e-=Math.round((c-f)/2),f=c);m=h[a](e,b,f,c);l&&g&&(m.push(\"M\",\"circle\"===a?e+f/2:m[1]+m[4]/2,b>g?b:b+c,\"L\",l,g),m=m.concat(h.circle(l-1,g-1,2,\n2)));return m}}var E=a.addEvent,m=a.merge,g=a.noop,v=a.defined,x=a.Renderer,y=a.Series,z=a.seriesType,n=a.TrackerMixin,f=a.VMLRenderer,h=a.SVGRenderer.prototype.symbols;z(\"flags\",\"column\",{pointRange:0,allowOverlapX:!1,shape:\"flag\",stackDistance:12,textAlign:\"center\",tooltip:{pointFormat:\"{point.text}\\x3cbr/\\x3e\"},threshold:null,y:-30,fillColor:\"#ffffff\",lineWidth:1,states:{hover:{lineColor:\"#000000\",fillColor:\"#ccd6eb\"}},style:{fontSize:\"11px\",fontWeight:\"bold\"}},{sorted:!1,noSharedTooltip:!0,allowDG:!1,\ntakeOrdinalPosition:!1,trackerGroups:[\"markerGroup\"],forceCrop:!0,init:y.prototype.init,pointAttribs:function(a,e){var b=this.options,f=a&&a.color||this.color,c=b.lineColor,g=a&&a.lineWidth;a=a&&a.fillColor||b.fillColor;e&&(a=b.states[e].fillColor,c=b.states[e].lineColor,g=b.states[e].lineWidth);return{fill:a||f,stroke:c||f,\"stroke-width\":g||b.lineWidth||0}},translate:C.translate,getPlotBox:C.getPlotBox,drawPoints:function(){var f=this.points,e=this.chart,b=e.renderer,g,c,h=e.inverted,n=this.options,\nw=n.y,x,p,d,k,u,y,z=this.yAxis,q={},A=[],C;for(p=f.length;p--;)d=f[p],y=(h?d.plotY:d.plotX)>this.xAxis.len,g=d.plotX,k=d.stackIndex,x=d.options.shape||n.shape,c=d.plotY,void 0!==c&&(c=d.plotY+w-(void 0!==k&&k*n.stackDistance)),d.anchorX=k?void 0:d.plotX,u=k?void 0:d.plotY,C=\"flag\"!==x,k=d.graphic,void 0!==c&&0<=g&&!y?(k||(k=d.graphic=b.label(\"\",null,null,x,null,null,n.useHTML),e.styledMode||k.attr(this.pointAttribs(d)).css(m(n.style,d.style)),k.attr({align:C?\"center\":\"left\",width:n.width,height:n.height,\n\"text-align\":n.textAlign}).addClass(\"highcharts-point\").add(this.markerGroup),d.graphic.div&&(d.graphic.div.point=d),e.styledMode||k.shadow(n.shadow),k.isNew=!0),0<g&&(g-=k.strokeWidth()%2),x={y:c,anchorY:u},n.allowOverlapX&&(x.x=g,x.anchorX=d.anchorX),k.attr({text:d.options.title||n.title||\"A\"})[k.isNew?\"attr\":\"animate\"](x),n.allowOverlapX||(q[d.plotX]?q[d.plotX].size=Math.max(q[d.plotX].size,k.width):q[d.plotX]={align:C?.5:0,size:k.width,target:g,anchorX:g}),d.tooltipPos=[g,c+z.pos-e.plotTop]):\nk&&(d.graphic=k.destroy());n.allowOverlapX||(a.objectEach(q,function(a){a.plotX=a.anchorX;A.push(a)}),a.distribute(A,h?z.len:this.xAxis.len,100),f.forEach(function(a){var b=a.graphic&&q[a.plotX];b&&(a.graphic[a.graphic.isNew?\"attr\":\"animate\"]({x:b.pos+b.align*b.size,anchorX:a.anchorX}),v(b.pos)?a.graphic.isNew=!1:(a.graphic.attr({x:-9999,anchorX:-9999}),a.graphic.isNew=!0))}));n.useHTML&&a.wrap(this.markerGroup,\"on\",function(b){return a.SVGElement.prototype.on.apply(b.apply(this,[].slice.call(arguments,\n1)),[].slice.call(arguments,1))})},drawTracker:function(){var a=this.points;n.drawTrackerPoint.apply(this);a.forEach(function(e){var b=e.graphic;b&&E(b.element,\"mouseover\",function(){0<e.stackIndex&&!e.raised&&(e._y=b.y,b.attr({y:e._y-8}),e.raised=!0);a.forEach(function(a){a!==e&&a.raised&&a.graphic&&(a.graphic.attr({y:a._y}),a.raised=!1)})})})},animate:function(a){a?this.setClip():this.animate=null},setClip:function(){y.prototype.setClip.apply(this,arguments);!1!==this.options.clip&&this.sharedClipKey&&\nthis.markerGroup.clip(this.chart[this.sharedClipKey])},buildKDTree:g,invertGroups:g},{isValid:function(){return a.isNumber(this.y)||void 0===this.y}});h.flag=function(a,e,b,f,c){var g=c&&c.anchorX||a;c=c&&c.anchorY||e;return h.circle(g-1,c-1,2,2).concat([\"M\",g,c,\"L\",a,e+f,a,e,a+b,e,a+b,e+f,a,e+f,\"Z\"])};A(\"circle\");A(\"square\");x===f&&[\"flag\",\"circlepin\",\"squarepin\"].forEach(function(a){f.prototype.symbols[a]=h[a]})});I(H,\"parts/RangeSelector.js\",[H[\"parts/Globals.js\"]],function(a){function C(a){this.init(a)}\nvar A=a.addEvent,E=a.Axis,m=a.Chart,g=a.css,v=a.createElement,x=a.defaultOptions,y=a.defined,z=a.destroyObjectProperties,n=a.discardElement,f=a.extend,h=a.fireEvent,r=a.isNumber,e=a.merge,b=a.pick,l=a.pInt,c=a.splat;f(x,{rangeSelector:{verticalAlign:\"top\",buttonTheme:{width:28,height:18,padding:2,zIndex:7},floating:!1,x:0,y:0,height:void 0,inputPosition:{align:\"right\",x:0,y:0},buttonPosition:{align:\"left\",x:0,y:0},labelStyle:{color:\"#666666\"}}});x.lang=e(x.lang,{rangeSelectorZoom:\"Zoom\",rangeSelectorFrom:\"From\",\nrangeSelectorTo:\"To\"});C.prototype={clickButton:function(a,e){var f=this.chart,g=this.buttonOptions[a],h=f.xAxis[0],d=f.scroller&&f.scroller.getUnionExtremes()||h||{},k=d.dataMin,l=d.dataMax,m,t=h&&Math.round(Math.min(h.max,b(l,h.max))),q=g.type,n,d=g._range,v,x,y,z=g.dataGrouping;if(null!==k&&null!==l){f.fixedRange=d;z&&(this.forcedDataGrouping=!0,E.prototype.setDataGrouping.call(h||{chart:this.chart},z,!1),this.frozenStates=g.preserveDataGrouping);if(\"month\"===q||\"year\"===q)h?(q={range:g,max:t,\nchart:f,dataMin:k,dataMax:l},m=h.minFromRange.call(q),r(q.newMax)&&(t=q.newMax)):d=g;else if(d)m=Math.max(t-d,k),t=Math.min(m+d,l);else if(\"ytd\"===q)if(h)void 0===l&&(k=Number.MAX_VALUE,l=Number.MIN_VALUE,f.series.forEach(function(a){a=a.xData;k=Math.min(a[0],k);l=Math.max(a[a.length-1],l)}),e=!1),t=this.getYTDExtremes(l,k,f.time.useUTC),m=v=t.min,t=t.max;else{this.deferredYTDClick=a;return}else\"all\"===q&&h&&(m=k,t=l);m+=g._offsetMin;t+=g._offsetMax;this.setSelected(a);h?h.setExtremes(m,t,b(e,1),\nnull,{trigger:\"rangeSelectorButton\",rangeSelectorButton:g}):(n=c(f.options.xAxis)[0],y=n.range,n.range=d,x=n.min,n.min=v,A(f,\"load\",function(){n.range=y;n.min=x}))}},setSelected:function(a){this.selected=this.options.selected=a},defaultButtons:[{type:\"month\",count:1,text:\"1m\"},{type:\"month\",count:3,text:\"3m\"},{type:\"month\",count:6,text:\"6m\"},{type:\"ytd\",text:\"YTD\"},{type:\"year\",count:1,text:\"1y\"},{type:\"all\",text:\"All\"}],init:function(a){var b=this,c=a.options.rangeSelector,e=c.buttons||[].concat(b.defaultButtons),\nf=c.selected,d=function(){var a=b.minInput,d=b.maxInput;a&&a.blur&&h(a,\"blur\");d&&d.blur&&h(d,\"blur\")};b.chart=a;b.options=c;b.buttons=[];b.buttonOptions=e;this.unMouseDown=A(a.container,\"mousedown\",d);this.unResize=A(a,\"resize\",d);e.forEach(b.computeButtonRange);void 0!==f&&e[f]&&this.clickButton(f,!1);A(a,\"load\",function(){a.xAxis&&a.xAxis[0]&&A(a.xAxis[0],\"setExtremes\",function(d){this.max-this.min!==a.fixedRange&&\"rangeSelectorButton\"!==d.trigger&&\"updatedData\"!==d.trigger&&b.forcedDataGrouping&&\n!b.frozenStates&&this.setDataGrouping(!1,!1)})})},updateButtonStates:function(){var a=this,b=this.chart,c=b.xAxis[0],e=Math.round(c.max-c.min),f=!c.hasVisibleSeries,d=b.scroller&&b.scroller.getUnionExtremes()||c,g=d.dataMin,h=d.dataMax,b=a.getYTDExtremes(h,g,b.time.useUTC),l=b.min,m=b.max,q=a.selected,n=r(q),v=a.options.allButtonsEnabled,x=a.buttons;a.buttonOptions.forEach(function(b,d){var k=b._range,p=b.type,t=b.count||1,u=x[d],r=0,w=b._offsetMax-b._offsetMin;b=d===q;var y=k>h-g,z=k<c.minRange,\nB=!1,A=!1,k=k===e;(\"month\"===p||\"year\"===p)&&e+36E5>=864E5*{month:28,year:365}[p]*t-w&&e-36E5<=864E5*{month:31,year:366}[p]*t+w?k=!0:\"ytd\"===p?(k=m-l+w===e,B=!b):\"all\"===p&&(k=c.max-c.min>=h-g,A=!b&&n&&k);p=!v&&(y||z||A||f);t=b&&k||k&&!n&&!B||b&&a.frozenStates;p?r=3:t&&(n=!0,r=2);u.state!==r&&(u.setState(r),0===r&&q===d&&a.setSelected(null))})},computeButtonRange:function(a){var c=a.type,e=a.count||1,f={millisecond:1,second:1E3,minute:6E4,hour:36E5,day:864E5,week:6048E5};if(f[c])a._range=f[c]*e;else if(\"month\"===\nc||\"year\"===c)a._range=864E5*{month:30,year:365}[c]*e;a._offsetMin=b(a.offsetMin,0);a._offsetMax=b(a.offsetMax,0);a._range+=a._offsetMax-a._offsetMin},setInputValue:function(a,b){var c=this.chart.options.rangeSelector,e=this.chart.time,f=this[a+\"Input\"];y(b)&&(f.previousValue=f.HCTime,f.HCTime=b);f.value=e.dateFormat(c.inputEditDateFormat||\"%Y-%m-%d\",f.HCTime);this[a+\"DateBox\"].attr({text:e.dateFormat(c.inputDateFormat||\"%b %e, %Y\",f.HCTime)})},showInput:function(a){var b=this.inputGroup,c=this[a+\n\"DateBox\"];g(this[a+\"Input\"],{left:b.translateX+c.x+\"px\",top:b.translateY+\"px\",width:c.width-2+\"px\",height:c.height-2+\"px\",border:\"2px solid silver\"})},hideInput:function(a){g(this[a+\"Input\"],{border:0,width:\"1px\",height:\"1px\"});this.setInputValue(a)},drawInput:function(b){function c(){var a=y.value,b=(k.inputDateParser||Date.parse)(a),d=m.xAxis[0],c=m.scroller&&m.scroller.xAxis?m.scroller.xAxis:d,e=c.dataMin,c=c.dataMax;b!==y.previousValue&&(y.previousValue=b,r(b)||(b=a.split(\"-\"),b=Date.UTC(l(b[0]),\nl(b[1])-1,l(b[2]))),r(b)&&(m.time.useUTC||(b+=6E4*(new Date).getTimezoneOffset()),t?b>h.maxInput.HCTime?b=void 0:b<e&&(b=e):b<h.minInput.HCTime?b=void 0:b>c&&(b=c),void 0!==b&&d.setExtremes(t?b:d.min,t?d.max:b,void 0,void 0,{trigger:\"rangeSelectorInput\"})))}var h=this,m=h.chart,p=m.renderer.style||{},d=m.renderer,k=m.options.rangeSelector,n=h.div,t=\"min\"===b,y,q,z=this.inputGroup;this[b+\"Label\"]=q=d.label(x.lang[t?\"rangeSelectorFrom\":\"rangeSelectorTo\"],this.inputGroup.offset).addClass(\"highcharts-range-label\").attr({padding:2}).add(z);\nz.offset+=q.width+5;this[b+\"DateBox\"]=d=d.label(\"\",z.offset).addClass(\"highcharts-range-input\").attr({padding:2,width:k.inputBoxWidth||90,height:k.inputBoxHeight||17,\"text-align\":\"center\"}).on(\"click\",function(){h.showInput(b);h[b+\"Input\"].focus()});m.styledMode||d.attr({stroke:k.inputBoxBorderColor||\"#cccccc\",\"stroke-width\":1});d.add(z);z.offset+=d.width+(t?10:0);this[b+\"Input\"]=y=v(\"input\",{name:b,className:\"highcharts-range-selector\",type:\"text\"},{top:m.plotTop+\"px\"},n);m.styledMode||(q.css(e(p,\nk.labelStyle)),d.css(e({color:\"#333333\"},p,k.inputStyle)),g(y,f({position:\"absolute\",border:0,width:\"1px\",height:\"1px\",padding:0,textAlign:\"center\",fontSize:p.fontSize,fontFamily:p.fontFamily,top:\"-9999em\"},k.inputStyle)));y.onfocus=function(){h.showInput(b)};y.onblur=function(){y===a.doc.activeElement&&c();h.hideInput(b);y.blur()};y.onchange=c;y.onkeypress=function(a){13===a.keyCode&&c()}},getPosition:function(){var a=this.chart,b=a.options.rangeSelector,a=\"top\"===b.verticalAlign?a.plotTop-a.axisOffset[0]:\n0;return{buttonTop:a+b.buttonPosition.y,inputTop:a+b.inputPosition.y-10}},getYTDExtremes:function(a,b,c){var e=this.chart.time,f=new e.Date(a),d=e.get(\"FullYear\",f);c=c?e.Date.UTC(d,0,1):+new e.Date(d,0,1);b=Math.max(b||0,c);f=f.getTime();return{max:Math.min(a||f,f),min:b}},render:function(a,c){var e=this,f=e.chart,g=f.renderer,d=f.container,h=f.options,l=h.exporting&&!1!==h.exporting.enabled&&h.navigation&&h.navigation.buttonOptions,m=x.lang,n=e.div,q=h.rangeSelector,t=b(h.chart.style&&h.chart.style.zIndex,\n0)+1,h=q.floating,r=e.buttons,n=e.inputGroup,y=q.buttonTheme,z=q.buttonPosition,A=q.inputPosition,C=q.inputEnabled,F=y&&y.states,E=f.plotLeft,H,I=e.buttonGroup,S;S=e.rendered;var W=e.options.verticalAlign,Q=f.legend,ca=Q&&Q.options,U=z.y,T=A.y,X=S||!1,Y=X?\"animate\":\"attr\",V=0,aa=0,Z;if(!1!==q.enabled){S||(e.group=S=g.g(\"range-selector-group\").attr({zIndex:7}).add(),e.buttonGroup=I=g.g(\"range-selector-buttons\").add(S),e.zoomText=g.text(m.rangeSelectorZoom,0,15).add(I),f.styledMode||(e.zoomText.css(q.labelStyle),\ny[\"stroke-width\"]=b(y[\"stroke-width\"],0)),e.buttonOptions.forEach(function(a,b){r[b]=g.button(a.text,0,0,function(d){var c=a.events&&a.events.click,f;c&&(f=c.call(a,d));!1!==f&&e.clickButton(b);e.isActive=!0},y,F&&F.hover,F&&F.select,F&&F.disabled).attr({\"text-align\":\"center\"}).add(I)}),!1!==C&&(e.div=n=v(\"div\",null,{position:\"relative\",height:0,zIndex:t}),d.parentNode.insertBefore(n,d),e.inputGroup=n=g.g(\"input-group\").add(S),n.offset=0,e.drawInput(\"min\"),e.drawInput(\"max\")));e.zoomText[Y]({x:b(E+\nz.x,E)});H=b(E+z.x,E)+e.zoomText.getBBox().width+5;e.buttonOptions.forEach(function(a,d){r[d][Y]({x:H});H+=r[d].width+b(q.buttonSpacing,5)});E=f.plotLeft-f.spacing[3];e.updateButtonStates();l&&this.titleCollision(f)&&\"top\"===W&&\"right\"===z.align&&z.y+I.getBBox().height-12<(l.y||0)+l.height&&(V=-40);\"left\"===z.align?Z=z.x-f.spacing[3]:\"right\"===z.align&&(Z=z.x+V-f.spacing[1]);I.align({y:z.y,width:I.getBBox().width,align:z.align,x:Z},!0,f.spacingBox);e.group.placed=X;e.buttonGroup.placed=X;!1!==C&&\n(V=l&&this.titleCollision(f)&&\"top\"===W&&\"right\"===A.align&&A.y-n.getBBox().height-12<(l.y||0)+l.height+f.spacing[0]?-40:0,\"left\"===A.align?Z=E:\"right\"===A.align&&(Z=-Math.max(f.axisOffset[1],-V)),n.align({y:A.y,width:n.getBBox().width,align:A.align,x:A.x+Z-2},!0,f.spacingBox),d=n.alignAttr.translateX+n.alignOptions.x-V+n.getBBox().x+2,l=n.alignOptions.width,m=I.alignAttr.translateX+I.getBBox().x,Z=I.getBBox().width+20,(A.align===z.align||m+Z>d&&d+l>m&&U<T+n.getBBox().height)&&n.attr({translateX:n.alignAttr.translateX+\n(f.axisOffset[1]>=-V?0:-V),translateY:n.alignAttr.translateY+I.getBBox().height+10}),e.setInputValue(\"min\",a),e.setInputValue(\"max\",c),e.inputGroup.placed=X);e.group.align({verticalAlign:W},!0,f.spacingBox);a=e.group.getBBox().height+20;c=e.group.alignAttr.translateY;\"bottom\"===W&&(Q=ca&&\"bottom\"===ca.verticalAlign&&ca.enabled&&!ca.floating?Q.legendHeight+b(ca.margin,10):0,a=a+Q-20,aa=c-a-(h?0:q.y)-10);if(\"top\"===W)h&&(aa=0),f.titleOffset&&(aa=f.titleOffset+f.options.title.margin),aa+=f.margin[0]-\nf.spacing[0]||0;else if(\"middle\"===W)if(T===U)aa=0>T?c+void 0:c;else if(T||U)aa=0>T||0>U?aa-Math.min(T,U):c-a+NaN;e.group.translate(q.x,q.y+Math.floor(aa));!1!==C&&(e.minInput.style.marginTop=e.group.translateY+\"px\",e.maxInput.style.marginTop=e.group.translateY+\"px\");e.rendered=!0}},getHeight:function(){var a=this.options,b=this.group,c=a.y,e=a.buttonPosition.y,f=a.inputPosition.y;if(a.height)return a.height;a=b?b.getBBox(!0).height+13+c:0;b=Math.min(f,e);if(0>f&&0>e||0<f&&0<e)a+=Math.abs(b);return a},\ntitleCollision:function(a){return!(a.options.title.text||a.options.subtitle.text)},update:function(a){var b=this.chart;e(!0,b.options.rangeSelector,a);this.destroy();this.init(b);b.rangeSelector.render()},destroy:function(){var b=this,c=b.minInput,e=b.maxInput;b.unMouseDown();b.unResize();z(b.buttons);c&&(c.onfocus=c.onblur=c.onchange=null);e&&(e.onfocus=e.onblur=e.onchange=null);a.objectEach(b,function(a,c){a&&\"chart\"!==c&&(a.destroy?a.destroy():a.nodeType&&n(this[c]));a!==C.prototype[c]&&(b[c]=\nnull)},this)}};E.prototype.minFromRange=function(){var a=this.range,c={month:\"Month\",year:\"FullYear\"}[a.type],e,f=this.max,g,d,h=this.chart.time,l=function(a,b){var d=new h.Date(a),e=h.get(c,d);h.set(c,d,e+b);e===h.get(c,d)&&h.set(\"Date\",d,0);return d.getTime()-a};r(a)?(e=f-a,d=a):(e=f+l(f,-a.count),this.chart&&(this.chart.fixedRange=f-e));g=b(this.dataMin,Number.MIN_VALUE);r(e)||(e=g);e<=g&&(e=g,void 0===d&&(d=l(e,a.count)),this.newMax=Math.min(e+d,this.dataMax));r(f)||(e=void 0);return e};a.RangeSelector||\n(A(m,\"afterGetContainer\",function(){this.options.rangeSelector.enabled&&(this.rangeSelector=new C(this))}),A(m,\"beforeRender\",function(){var a=this.axes,b=this.rangeSelector;b&&(r(b.deferredYTDClick)&&(b.clickButton(b.deferredYTDClick),delete b.deferredYTDClick),a.forEach(function(a){a.updateNames();a.setScale()}),this.getAxisMargins(),b.render(),a=b.options.verticalAlign,b.options.floating||(\"bottom\"===a?this.extraBottomMargin=!0:\"middle\"!==a&&(this.extraTopMargin=!0)))}),A(m,\"update\",function(a){var b=\na.options.rangeSelector;a=this.rangeSelector;var c=this.extraBottomMargin,e=this.extraTopMargin;b&&b.enabled&&!y(a)&&(this.options.rangeSelector.enabled=!0,this.rangeSelector=new C(this));this.extraTopMargin=this.extraBottomMargin=!1;a&&(a.render(),b=b&&b.verticalAlign||a.options&&a.options.verticalAlign,a.options.floating||(\"bottom\"===b?this.extraBottomMargin=!0:\"middle\"!==b&&(this.extraTopMargin=!0)),this.extraBottomMargin!==c||this.extraTopMargin!==e)&&(this.isDirtyBox=!0)}),A(m,\"render\",function(){var a=\nthis.rangeSelector;a&&!a.options.floating&&(a.render(),a=a.options.verticalAlign,\"bottom\"===a?this.extraBottomMargin=!0:\"middle\"!==a&&(this.extraTopMargin=!0))}),A(m,\"getMargins\",function(){var a=this.rangeSelector;a&&(a=a.getHeight(),this.extraTopMargin&&(this.plotTop+=a),this.extraBottomMargin&&(this.marginBottom+=a))}),m.prototype.callbacks.push(function(a){function b(){c=a.xAxis[0].getExtremes();r(c.min)&&e.render(c.min,c.max)}var c,e=a.rangeSelector,f,d;e&&(d=A(a.xAxis[0],\"afterSetExtremes\",\nfunction(a){e.render(a.min,a.max)}),f=A(a,\"redraw\",b),b());A(a,\"destroy\",function(){e&&(f(),d())})}),a.RangeSelector=C)});I(H,\"parts/StockChart.js\",[H[\"parts/Globals.js\"]],function(a){var C=a.addEvent,A=a.arrayMax,E=a.arrayMin,m=a.Axis,g=a.Chart,v=a.defined,x=a.extend,y=a.format,z=a.isNumber,n=a.isString,f=a.merge,h=a.pick,r=a.Point,e=a.Renderer,b=a.Series,l=a.splat,c=a.SVGRenderer,t=a.VMLRenderer,F=b.prototype,w=F.init,B=F.processData,p=r.prototype.tooltipFormatter;a.StockChart=a.stockChart=function(b,\nc,e){var d=n(b)||b.nodeName,k=arguments[d?1:0],m=k,p=k.series,r=a.getOptions(),u,t=h(k.navigator&&k.navigator.enabled,r.navigator.enabled,!0),v=t?{startOnTick:!1,endOnTick:!1}:null;k.xAxis=l(k.xAxis||{}).map(function(a,b){return f({minPadding:0,maxPadding:0,overscroll:0,ordinal:!0,title:{text:null},labels:{overflow:\"justify\"},showLastLabel:!0},r.xAxis,r.xAxis&&r.xAxis[b],a,{type:\"datetime\",categories:null},v)});k.yAxis=l(k.yAxis||{}).map(function(a,b){u=h(a.opposite,!0);return f({labels:{y:-2},opposite:u,\nshowLastLabel:!(!a.categories&&\"category\"!==a.type),title:{text:null}},r.yAxis,r.yAxis&&r.yAxis[b],a)});k.series=null;k=f({chart:{panning:!0,pinchType:\"x\"},navigator:{enabled:t},scrollbar:{enabled:h(r.scrollbar.enabled,!0)},rangeSelector:{enabled:h(r.rangeSelector.enabled,!0)},title:{text:null},tooltip:{split:h(r.tooltip.split,!0),crosshairs:!0},legend:{enabled:!1}},k,{isStock:!0});k.series=m.series=p;return d?new g(b,k,e):new g(k,c)};C(b,\"setOptions\",function(b){function c(b){return a.seriesTypes[b]&&\nd instanceof a.seriesTypes[b]}var d=this,e;this.chart.options.isStock&&(c(\"column\")||c(\"columnrange\")?e={borderWidth:0,shadow:!1}:!c(\"line\")||c(\"scatter\")||c(\"sma\")||(e={marker:{enabled:!1,radius:2}}),e&&(b.plotOptions[this.type]=f(b.plotOptions[this.type],e)))});C(m,\"autoLabelAlign\",function(a){var b=this.chart,c=this.options,b=b._labelPanes=b._labelPanes||{},d=this.options.labels;this.chart.options.isStock&&\"yAxis\"===this.coll&&(c=c.top+\",\"+c.height,!b[c]&&d.enabled&&(15===d.x&&(d.x=0),void 0===\nd.align&&(d.align=\"right\"),b[c]=this,a.align=\"right\",a.preventDefault()))});C(m,\"destroy\",function(){var a=this.chart,b=this.options&&this.options.top+\",\"+this.options.height;b&&a._labelPanes&&a._labelPanes[b]===this&&delete a._labelPanes[b]});C(m,\"getPlotLinePath\",function(b){function c(a){var b=\"xAxis\"===a?\"yAxis\":\"xAxis\";a=d.options[b];return z(a)?[f[b][a]]:n(a)?[f.get(a)]:e.map(function(a){return a[b]})}var d=this,e=this.isLinked&&!this.series?this.linkedParent.series:this.series,f=d.chart,g=\nf.renderer,l=d.left,m=d.top,p,r,t,w,x=[],y=[],A,B,C=b.translatedValue,E=b.value,F=b.force,H;if(f.options.isStock&&!1!==b.acrossPanes&&\"xAxis\"===d.coll||\"yAxis\"===d.coll)b.preventDefault(),y=c(d.coll),A=d.isXAxis?f.yAxis:f.xAxis,A.forEach(function(a){if(v(a.options.id)?-1===a.options.id.indexOf(\"navigator\"):1){var b=a.isXAxis?\"yAxis\":\"xAxis\",b=v(a.options[b])?f[b][a.options[b]]:f[b][0];d===b&&y.push(a)}}),B=y.length?[]:[d.isXAxis?f.yAxis[0]:f.xAxis[0]],y.forEach(function(b){-1!==B.indexOf(b)||a.find(B,\nfunction(a){return a.pos===b.pos&&a.len===b.len})||B.push(b)}),H=h(C,d.translate(E,null,null,b.old)),z(H)&&(d.horiz?B.forEach(function(a){var b;r=a.pos;w=r+a.len;p=t=Math.round(H+d.transB);\"pass\"!==F&&(p<l||p>l+d.width)&&(F?p=t=Math.min(Math.max(l,p),l+d.width):b=!0);b||x.push(\"M\",p,r,\"L\",t,w)}):B.forEach(function(a){var b;p=a.pos;t=p+a.len;r=w=Math.round(m+d.height-H);\"pass\"!==F&&(r<m||r>m+d.height)&&(F?r=w=Math.min(Math.max(m,r),d.top+d.height):b=!0);b||x.push(\"M\",p,r,\"L\",t,w)})),b.path=0<x.length?\ng.crispPolyLine(x,b.lineWidth||1):null});c.prototype.crispPolyLine=function(a,b){var c;for(c=0;c<a.length;c+=6)a[c+1]===a[c+4]&&(a[c+1]=a[c+4]=Math.round(a[c+1])-b%2/2),a[c+2]===a[c+5]&&(a[c+2]=a[c+5]=Math.round(a[c+2])+b%2/2);return a};e===t&&(t.prototype.crispPolyLine=c.prototype.crispPolyLine);C(m,\"afterHideCrosshair\",function(){this.crossLabel&&(this.crossLabel=this.crossLabel.hide())});C(m,\"afterDrawCrosshair\",function(a){var b,c;if(v(this.crosshair.label)&&this.crosshair.label.enabled&&this.cross){var d=\nthis.chart,e=this.options.crosshair.label,f=this.horiz;b=this.opposite;c=this.left;var g=this.top,l=this.crossLabel,m=e.format,n=\"\",p=\"inside\"===this.options.tickPosition,r=!1!==this.crosshair.snap,t=0,w=a.e||this.cross&&this.cross.e,z=a.point;a=this.lin2log;var A,B;this.isLog?(A=a(this.min),B=a(this.max)):(A=this.min,B=this.max);a=f?\"center\":b?\"right\"===this.labelAlign?\"right\":\"left\":\"left\"===this.labelAlign?\"left\":\"center\";l||(l=this.crossLabel=d.renderer.label(null,null,null,e.shape||\"callout\").addClass(\"highcharts-crosshair-label\"+\n(this.series[0]&&\" highcharts-color-\"+this.series[0].colorIndex)).attr({align:e.align||a,padding:h(e.padding,8),r:h(e.borderRadius,3),zIndex:2}).add(this.labelGroup),d.styledMode||l.attr({fill:e.backgroundColor||this.series[0]&&this.series[0].color||\"#666666\",stroke:e.borderColor||\"\",\"stroke-width\":e.borderWidth||0}).css(x({color:\"#ffffff\",fontWeight:\"normal\",fontSize:\"11px\",textAlign:\"center\"},e.style)));f?(a=r?z.plotX+c:w.chartX,g+=b?0:this.height):(a=b?this.width+c:0,g=r?z.plotY+g:w.chartY);m||\ne.formatter||(this.isDatetimeAxis&&(n=\"%b %d, %Y\"),m=\"{value\"+(n?\":\"+n:\"\")+\"}\");n=r?z[this.isXAxis?\"x\":\"y\"]:this.toValue(f?w.chartX:w.chartY);l.attr({text:m?y(m,{value:n},d.time):e.formatter.call(this,n),x:a,y:g,visibility:n<A||n>B?\"hidden\":\"visible\"});e=l.getBBox();if(f){if(p&&!b||!p&&b)g=l.y-e.height}else g=l.y-e.height/2;f?(b=c-e.x,c=c+this.width-e.x):(b=\"left\"===this.labelAlign?c:0,c=\"right\"===this.labelAlign?c+this.width:d.chartWidth);l.translateX<b&&(t=b-l.translateX);l.translateX+e.width>=\nc&&(t=-(l.translateX+e.width-c));l.attr({x:a+t,y:g,anchorX:f?a:this.opposite?0:d.chartWidth,anchorY:f?this.opposite?d.chartHeight:0:g+e.height/2})}});F.init=function(){w.apply(this,arguments);this.setCompare(this.options.compare)};F.setCompare=function(a){this.modifyValue=\"value\"===a||\"percent\"===a?function(b,c){var d=this.compareValue;if(void 0!==b&&void 0!==d)return b=\"value\"===a?b-d:b/d*100-(100===this.options.compareBase?0:100),c&&(c.change=b),b}:null;this.userOptions.compare=a;this.chart.hasRendered&&\n(this.isDirty=!0)};F.processData=function(){var a,b=-1,c,e,f=!0===this.options.compareStart?0:1,g,h;B.apply(this,arguments);if(this.xAxis&&this.processedYData)for(c=this.processedXData,e=this.processedYData,g=e.length,this.pointArrayMap&&(b=this.pointArrayMap.indexOf(this.options.pointValKey||this.pointValKey||\"y\")),a=0;a<g-f;a++)if(h=e[a]&&-1<b?e[a][b]:e[a],z(h)&&c[a+f]>=this.xAxis.min&&0!==h){this.compareValue=h;break}};C(b,\"afterGetExtremes\",function(){if(this.modifyValue){var a=[this.modifyValue(this.dataMin),\nthis.modifyValue(this.dataMax)];this.dataMin=E(a);this.dataMax=A(a)}});m.prototype.setCompare=function(a,b){this.isXAxis||(this.series.forEach(function(b){b.setCompare(a)}),h(b,!0)&&this.chart.redraw())};r.prototype.tooltipFormatter=function(b){b=b.replace(\"{point.change}\",(0<this.change?\"+\":\"\")+a.numberFormat(this.change,h(this.series.tooltipOptions.changeDecimals,2)));return p.apply(this,[b])};C(b,\"render\",function(){var a;this.chart.is3d&&this.chart.is3d()||this.chart.polar||!this.xAxis||this.xAxis.isRadial||\n(a=this.yAxis.len-(this.xAxis.axisLine?Math.floor(this.xAxis.axisLine.strokeWidth()/2):0),!this.clipBox&&this.animate?(this.clipBox=f(this.chart.clipBox),this.clipBox.width=this.xAxis.len,this.clipBox.height=a):this.chart[this.sharedClipKey]&&(this.chart[this.sharedClipKey].animate({width:this.xAxis.len,height:a}),this.chart[this.sharedClipKey+\"m\"]&&this.chart[this.sharedClipKey+\"m\"].animate({width:this.xAxis.len})))});C(g,\"update\",function(a){a=a.options;\"scrollbar\"in a&&this.navigator&&(f(!0,this.options.scrollbar,\na.scrollbar),this.navigator.update({},!1),delete a.scrollbar)})});I(H,\"masters/modules/stock.src.js\",[],function(){});I(H,\"masters/highstock.src.js\",[H[\"masters/highcharts.src.js\"]],function(a){return a});H[\"masters/highstock.src.js\"]._modules=H;return H[\"masters/highstock.src.js\"]});\n//# sourceMappingURL=highstock.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvaGlnaGNoYXJ0cy9oaWdoc3RvY2suanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvaGlnaGNoYXJ0cy9oaWdoc3RvY2suanM/ZTU5MSJdLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuIEhpZ2hjaGFydHMgSlMgdjcuMS4yICgyMDE5LTA2LTAzKVxuXG4gKGMpIDIwMDktMjAxOCBUb3JzdGVpbiBIb25zaVxuXG4gTGljZW5zZTogd3d3LmhpZ2hjaGFydHMuY29tL2xpY2Vuc2VcbiovXG4oZnVuY3Rpb24oUSxJKXtcIm9iamVjdFwiPT09dHlwZW9mIG1vZHVsZSYmbW9kdWxlLmV4cG9ydHM/KElbXCJkZWZhdWx0XCJdPUksbW9kdWxlLmV4cG9ydHM9US5kb2N1bWVudD9JKFEpOkkpOlwiZnVuY3Rpb25cIj09PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQ/ZGVmaW5lKFwiaGlnaGNoYXJ0cy9oaWdoc3RvY2tcIixmdW5jdGlvbigpe3JldHVybiBJKFEpfSk6KFEuSGlnaGNoYXJ0cyYmUS5IaWdoY2hhcnRzLmVycm9yKDE2LCEwKSxRLkhpZ2hjaGFydHM9SShRKSl9KShcInVuZGVmaW5lZFwiIT09dHlwZW9mIHdpbmRvdz93aW5kb3c6dGhpcyxmdW5jdGlvbihRKXtmdW5jdGlvbiBJKGEsQyxBLEUpe2EuaGFzT3duUHJvcGVydHkoQyl8fChhW0NdPUUuYXBwbHkobnVsbCxBKSl9dmFyIEg9e307SShILFwicGFydHMvR2xvYmFscy5qc1wiLFtdLGZ1bmN0aW9uKCl7dmFyIGE9XCJ1bmRlZmluZWRcIj09PXR5cGVvZiBRP1widW5kZWZpbmVkXCIhPT10eXBlb2Ygd2luZG93P3dpbmRvdzp7fTpRLEM9YS5kb2N1bWVudCxcbkE9YS5uYXZpZ2F0b3ImJmEubmF2aWdhdG9yLnVzZXJBZ2VudHx8XCJcIixFPUMmJkMuY3JlYXRlRWxlbWVudE5TJiYhIUMuY3JlYXRlRWxlbWVudE5TKFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIixcInN2Z1wiKS5jcmVhdGVTVkdSZWN0LG09LyhlZGdlfG1zaWV8dHJpZGVudCkvaS50ZXN0KEEpJiYhYS5vcGVyYSxnPS0xIT09QS5pbmRleE9mKFwiRmlyZWZveFwiKSx2PS0xIT09QS5pbmRleE9mKFwiQ2hyb21lXCIpLHg9ZyYmND5wYXJzZUludChBLnNwbGl0KFwiRmlyZWZveC9cIilbMV0sMTApO3JldHVybntwcm9kdWN0OlwiSGlnaGNoYXJ0c1wiLHZlcnNpb246XCI3LjEuMlwiLGRlZzJyYWQ6MipNYXRoLlBJLzM2MCxkb2M6QyxoYXNCaWRpQnVnOngsaGFzVG91Y2g6QyYmXCJ1bmRlZmluZWRcIiE9PXR5cGVvZiBDLmRvY3VtZW50RWxlbWVudC5vbnRvdWNoc3RhcnQsaXNNUzptLGlzV2ViS2l0Oi0xIT09QS5pbmRleE9mKFwiQXBwbGVXZWJLaXRcIiksaXNGaXJlZm94OmcsaXNDaHJvbWU6dixpc1NhZmFyaTohdiYmXG4tMSE9PUEuaW5kZXhPZihcIlNhZmFyaVwiKSxpc1RvdWNoRGV2aWNlOi8oTW9iaWxlfEFuZHJvaWR8V2luZG93cyBQaG9uZSkvLnRlc3QoQSksU1ZHX05TOlwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIixjaGFydENvdW50OjAsc2VyaWVzVHlwZXM6e30sc3ltYm9sU2l6ZXM6e30sc3ZnOkUsd2luOmEsbWFyZ2luTmFtZXM6W1wicGxvdFRvcFwiLFwibWFyZ2luUmlnaHRcIixcIm1hcmdpbkJvdHRvbVwiLFwicGxvdExlZnRcIl0sbm9vcDpmdW5jdGlvbigpe30sY2hhcnRzOltdLGRhdGVGb3JtYXRzOnt9fX0pO0koSCxcInBhcnRzL1V0aWxpdGllcy5qc1wiLFtIW1wicGFydHMvR2xvYmFscy5qc1wiXV0sZnVuY3Rpb24oYSl7YS50aW1lcnM9W107dmFyIEM9YS5jaGFydHMsQT1hLmRvYyxFPWEud2luO2EuZXJyb3I9ZnVuY3Rpb24obSxnLHYpe3ZhciB4PWEuaXNOdW1iZXIobSk/XCJIaWdoY2hhcnRzIGVycm9yICNcIittK1wiOiB3d3cuaGlnaGNoYXJ0cy5jb20vZXJyb3JzL1wiK206bSx5PWZ1bmN0aW9uKCl7aWYoZyl0aHJvdyBFcnJvcih4KTtcbkUuY29uc29sZSYmY29uc29sZS5sb2coeCl9O3Y/YS5maXJlRXZlbnQodixcImRpc3BsYXlFcnJvclwiLHtjb2RlOm0sbWVzc2FnZTp4fSx5KTp5KCl9O2EuRng9ZnVuY3Rpb24oYSxnLHYpe3RoaXMub3B0aW9ucz1nO3RoaXMuZWxlbT1hO3RoaXMucHJvcD12fTthLkZ4LnByb3RvdHlwZT17ZFNldHRlcjpmdW5jdGlvbigpe3ZhciBhPXRoaXMucGF0aHNbMF0sZz10aGlzLnBhdGhzWzFdLHY9W10seD10aGlzLm5vdyx5PWEubGVuZ3RoLHo7aWYoMT09PXgpdj10aGlzLnRvRDtlbHNlIGlmKHk9PT1nLmxlbmd0aCYmMT54KWZvcig7eS0tOyl6PXBhcnNlRmxvYXQoYVt5XSksdlt5XT1pc05hTih6KT9nW3ldOngqcGFyc2VGbG9hdChnW3ldLXopK3o7ZWxzZSB2PWc7dGhpcy5lbGVtLmF0dHIoXCJkXCIsdixudWxsLCEwKX0sdXBkYXRlOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5lbGVtLGc9dGhpcy5wcm9wLHY9dGhpcy5ub3cseD10aGlzLm9wdGlvbnMuc3RlcDtpZih0aGlzW2crXCJTZXR0ZXJcIl0pdGhpc1tnK1xuXCJTZXR0ZXJcIl0oKTtlbHNlIGEuYXR0cj9hLmVsZW1lbnQmJmEuYXR0cihnLHYsbnVsbCwhMCk6YS5zdHlsZVtnXT12K3RoaXMudW5pdDt4JiZ4LmNhbGwoYSx2LHRoaXMpfSxydW46ZnVuY3Rpb24obSxnLHYpe3ZhciB4PXRoaXMseT14Lm9wdGlvbnMsej1mdW5jdGlvbihhKXtyZXR1cm4gei5zdG9wcGVkPyExOnguc3RlcChhKX0sbj1FLnJlcXVlc3RBbmltYXRpb25GcmFtZXx8ZnVuY3Rpb24oYSl7c2V0VGltZW91dChhLDEzKX0sZj1mdW5jdGlvbigpe2Zvcih2YXIgaD0wO2g8YS50aW1lcnMubGVuZ3RoO2grKylhLnRpbWVyc1toXSgpfHxhLnRpbWVycy5zcGxpY2UoaC0tLDEpO2EudGltZXJzLmxlbmd0aCYmbihmKX07bSE9PWd8fHRoaXMuZWxlbVtcImZvcmNlQW5pbWF0ZTpcIit0aGlzLnByb3BdPyh0aGlzLnN0YXJ0VGltZT0rbmV3IERhdGUsdGhpcy5zdGFydD1tLHRoaXMuZW5kPWcsdGhpcy51bml0PXYsdGhpcy5ub3c9dGhpcy5zdGFydCx0aGlzLnBvcz0wLHouZWxlbT10aGlzLmVsZW0sXG56LnByb3A9dGhpcy5wcm9wLHooKSYmMT09PWEudGltZXJzLnB1c2goeikmJm4oZikpOihkZWxldGUgeS5jdXJBbmltW3RoaXMucHJvcF0seS5jb21wbGV0ZSYmMD09PU9iamVjdC5rZXlzKHkuY3VyQW5pbSkubGVuZ3RoJiZ5LmNvbXBsZXRlLmNhbGwodGhpcy5lbGVtKSl9LHN0ZXA6ZnVuY3Rpb24obSl7dmFyIGc9K25ldyBEYXRlLHYseD10aGlzLm9wdGlvbnMseT10aGlzLmVsZW0sej14LmNvbXBsZXRlLG49eC5kdXJhdGlvbixmPXguY3VyQW5pbTt5LmF0dHImJiF5LmVsZW1lbnQ/bT0hMTptfHxnPj1uK3RoaXMuc3RhcnRUaW1lPyh0aGlzLm5vdz10aGlzLmVuZCx0aGlzLnBvcz0xLHRoaXMudXBkYXRlKCksdj1mW3RoaXMucHJvcF09ITAsYS5vYmplY3RFYWNoKGYsZnVuY3Rpb24oYSl7ITAhPT1hJiYodj0hMSl9KSx2JiZ6JiZ6LmNhbGwoeSksbT0hMSk6KHRoaXMucG9zPXguZWFzaW5nKChnLXRoaXMuc3RhcnRUaW1lKS9uKSx0aGlzLm5vdz10aGlzLnN0YXJ0Kyh0aGlzLmVuZC1cbnRoaXMuc3RhcnQpKnRoaXMucG9zLHRoaXMudXBkYXRlKCksbT0hMCk7cmV0dXJuIG19LGluaXRQYXRoOmZ1bmN0aW9uKG0sZyx2KXtmdW5jdGlvbiB4KGEpe3ZhciBiLGQ7Zm9yKGM9YS5sZW5ndGg7Yy0tOyliPVwiTVwiPT09YVtjXXx8XCJMXCI9PT1hW2NdLGQ9L1thLXpBLVpdLy50ZXN0KGFbYyszXSksYiYmZCYmYS5zcGxpY2UoYysxLDAsYVtjKzFdLGFbYysyXSxhW2MrMV0sYVtjKzJdKX1mdW5jdGlvbiB5KGEsbCl7Zm9yKDthLmxlbmd0aDxiOyl7YVswXT1sW2ItYS5sZW5ndGhdO3ZhciBkPWEuc2xpY2UoMCxlKTtbXS5zcGxpY2UuYXBwbHkoYSxbMCwwXS5jb25jYXQoZCkpO3QmJihkPWEuc2xpY2UoYS5sZW5ndGgtZSksW10uc3BsaWNlLmFwcGx5KGEsW2EubGVuZ3RoLDBdLmNvbmNhdChkKSksYy0tKX1hWzBdPVwiTVwifWZ1bmN0aW9uIHooYSxjKXtmb3IodmFyIGQ9KGItYS5sZW5ndGgpL2U7MDxkJiZkLS07KWw9YS5zbGljZSgpLnNwbGljZShhLmxlbmd0aC9GLWUsZSpGKSxsWzBdPVxuY1tiLWUtZCplXSxyJiYobFtlLTZdPWxbZS0yXSxsW2UtNV09bFtlLTFdKSxbXS5zcGxpY2UuYXBwbHkoYSxbYS5sZW5ndGgvRiwwXS5jb25jYXQobCkpLHQmJmQtLX1nPWd8fFwiXCI7dmFyIG4sZj1tLnN0YXJ0WCxoPW0uZW5kWCxyPS0xPGcuaW5kZXhPZihcIkNcIiksZT1yPzc6MyxiLGwsYztnPWcuc3BsaXQoXCIgXCIpO3Y9di5zbGljZSgpO3ZhciB0PW0uaXNBcmVhLEY9dD8yOjEsdztyJiYoeChnKSx4KHYpKTtpZihmJiZoKXtmb3IoYz0wO2M8Zi5sZW5ndGg7YysrKWlmKGZbY109PT1oWzBdKXtuPWM7YnJlYWt9ZWxzZSBpZihmWzBdPT09aFtoLmxlbmd0aC1mLmxlbmd0aCtjXSl7bj1jO3c9ITA7YnJlYWt9ZWxzZSBpZihmW2YubGVuZ3RoLTFdPT09aFtoLmxlbmd0aC1mLmxlbmd0aCtjXSl7bj1mLmxlbmd0aC1jO2JyZWFrfVwidW5kZWZpbmVkXCI9PT10eXBlb2YgbiYmKGc9W10pfWcubGVuZ3RoJiZhLmlzTnVtYmVyKG4pJiYoYj12Lmxlbmd0aCtuKkYqZSx3Pyh5KGcsdikseih2LGcpKTpcbih5KHYsZykseihnLHYpKSk7cmV0dXJuW2csdl19LGZpbGxTZXR0ZXI6ZnVuY3Rpb24oKXthLkZ4LnByb3RvdHlwZS5zdHJva2VTZXR0ZXIuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxzdHJva2VTZXR0ZXI6ZnVuY3Rpb24oKXt0aGlzLmVsZW0uYXR0cih0aGlzLnByb3AsYS5jb2xvcih0aGlzLnN0YXJ0KS50d2VlblRvKGEuY29sb3IodGhpcy5lbmQpLHRoaXMucG9zKSxudWxsLCEwKX19O2EubWVyZ2U9ZnVuY3Rpb24oKXt2YXIgbSxnPWFyZ3VtZW50cyx2LHg9e30seT1mdW5jdGlvbihnLG4pe1wib2JqZWN0XCIhPT10eXBlb2YgZyYmKGc9e30pO2Eub2JqZWN0RWFjaChuLGZ1bmN0aW9uKGYsaCl7IWEuaXNPYmplY3QoZiwhMCl8fGEuaXNDbGFzcyhmKXx8YS5pc0RPTUVsZW1lbnQoZik/Z1toXT1uW2hdOmdbaF09eShnW2hdfHx7fSxmKX0pO3JldHVybiBnfTshMD09PWdbMF0mJih4PWdbMV0sZz1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChnLDIpKTt2PWcubGVuZ3RoO2ZvcihtPTA7bTxcbnY7bSsrKXg9eSh4LGdbbV0pO3JldHVybiB4fTthLnBJbnQ9ZnVuY3Rpb24oYSxnKXtyZXR1cm4gcGFyc2VJbnQoYSxnfHwxMCl9O2EuaXNTdHJpbmc9ZnVuY3Rpb24oYSl7cmV0dXJuXCJzdHJpbmdcIj09PXR5cGVvZiBhfTthLmlzQXJyYXk9ZnVuY3Rpb24oYSl7YT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoYSk7cmV0dXJuXCJbb2JqZWN0IEFycmF5XVwiPT09YXx8XCJbb2JqZWN0IEFycmF5IEl0ZXJhdG9yXVwiPT09YX07YS5pc09iamVjdD1mdW5jdGlvbihtLGcpe3JldHVybiEhbSYmXCJvYmplY3RcIj09PXR5cGVvZiBtJiYoIWd8fCFhLmlzQXJyYXkobSkpfTthLmlzRE9NRWxlbWVudD1mdW5jdGlvbihtKXtyZXR1cm4gYS5pc09iamVjdChtKSYmXCJudW1iZXJcIj09PXR5cGVvZiBtLm5vZGVUeXBlfTthLmlzQ2xhc3M9ZnVuY3Rpb24obSl7dmFyIGc9bSYmbS5jb25zdHJ1Y3RvcjtyZXR1cm4hKCFhLmlzT2JqZWN0KG0sITApfHxhLmlzRE9NRWxlbWVudChtKXx8IWd8fCFnLm5hbWV8fFxuXCJPYmplY3RcIj09PWcubmFtZSl9O2EuaXNOdW1iZXI9ZnVuY3Rpb24oYSl7cmV0dXJuXCJudW1iZXJcIj09PXR5cGVvZiBhJiYhaXNOYU4oYSkmJkluZmluaXR5PmEmJi1JbmZpbml0eTxhfTthLmVyYXNlPWZ1bmN0aW9uKGEsZyl7Zm9yKHZhciBtPWEubGVuZ3RoO20tLTspaWYoYVttXT09PWcpe2Euc3BsaWNlKG0sMSk7YnJlYWt9fTthLmRlZmluZWQ9ZnVuY3Rpb24oYSl7cmV0dXJuXCJ1bmRlZmluZWRcIiE9PXR5cGVvZiBhJiZudWxsIT09YX07YS5hdHRyPWZ1bmN0aW9uKG0sZyx2KXt2YXIgeDthLmlzU3RyaW5nKGcpP2EuZGVmaW5lZCh2KT9tLnNldEF0dHJpYnV0ZShnLHYpOm0mJm0uZ2V0QXR0cmlidXRlJiYoKHg9bS5nZXRBdHRyaWJ1dGUoZykpfHxcImNsYXNzXCIhPT1nfHwoeD1tLmdldEF0dHJpYnV0ZShnK1wiTmFtZVwiKSkpOmEuZGVmaW5lZChnKSYmYS5pc09iamVjdChnKSYmYS5vYmplY3RFYWNoKGcsZnVuY3Rpb24oYSxnKXttLnNldEF0dHJpYnV0ZShnLGEpfSk7cmV0dXJuIHh9O1xuYS5zcGxhdD1mdW5jdGlvbihtKXtyZXR1cm4gYS5pc0FycmF5KG0pP206W21dfTthLnN5bmNUaW1lb3V0PWZ1bmN0aW9uKGEsZyx2KXtpZihnKXJldHVybiBzZXRUaW1lb3V0KGEsZyx2KTthLmNhbGwoMCx2KX07YS5jbGVhclRpbWVvdXQ9ZnVuY3Rpb24obSl7YS5kZWZpbmVkKG0pJiZjbGVhclRpbWVvdXQobSl9O2EuZXh0ZW5kPWZ1bmN0aW9uKGEsZyl7dmFyIG07YXx8KGE9e30pO2ZvcihtIGluIGcpYVttXT1nW21dO3JldHVybiBhfTthLnBpY2s9ZnVuY3Rpb24oKXt2YXIgYT1hcmd1bWVudHMsZyx2LHg9YS5sZW5ndGg7Zm9yKGc9MDtnPHg7ZysrKWlmKHY9YVtnXSxcInVuZGVmaW5lZFwiIT09dHlwZW9mIHYmJm51bGwhPT12KXJldHVybiB2fTthLmNzcz1mdW5jdGlvbihtLGcpe2EuaXNNUyYmIWEuc3ZnJiZnJiZcInVuZGVmaW5lZFwiIT09dHlwZW9mIGcub3BhY2l0eSYmKGcuZmlsdGVyPVwiYWxwaGEob3BhY2l0eVxceDNkXCIrMTAwKmcub3BhY2l0eStcIilcIik7YS5leHRlbmQobS5zdHlsZSxcbmcpfTthLmNyZWF0ZUVsZW1lbnQ9ZnVuY3Rpb24obSxnLHYseCx5KXttPUEuY3JlYXRlRWxlbWVudChtKTt2YXIgej1hLmNzcztnJiZhLmV4dGVuZChtLGcpO3kmJnoobSx7cGFkZGluZzpcIjBcIixib3JkZXI6XCJub25lXCIsbWFyZ2luOlwiMFwifSk7diYmeihtLHYpO3gmJnguYXBwZW5kQ2hpbGQobSk7cmV0dXJuIG19O2EuZXh0ZW5kQ2xhc3M9ZnVuY3Rpb24obSxnKXt2YXIgdj1mdW5jdGlvbigpe307di5wcm90b3R5cGU9bmV3IG07YS5leHRlbmQodi5wcm90b3R5cGUsZyk7cmV0dXJuIHZ9O2EucGFkPWZ1bmN0aW9uKGEsZyx2KXtyZXR1cm4gQXJyYXkoKGd8fDIpKzEtU3RyaW5nKGEpLnJlcGxhY2UoXCItXCIsXCJcIikubGVuZ3RoKS5qb2luKHZ8fFwiMFwiKSthfTthLnJlbGF0aXZlTGVuZ3RoPWZ1bmN0aW9uKGEsZyx2KXtyZXR1cm4vJSQvLnRlc3QoYSk/ZypwYXJzZUZsb2F0KGEpLzEwMCsodnx8MCk6cGFyc2VGbG9hdChhKX07YS53cmFwPWZ1bmN0aW9uKGEsZyx2KXt2YXIgbT1hW2ddO2FbZ109XG5mdW5jdGlvbigpe3ZhciBhPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyksZz1hcmd1bWVudHMsbj10aGlzO24ucHJvY2VlZD1mdW5jdGlvbigpe20uYXBwbHkobixhcmd1bWVudHMubGVuZ3RoP2FyZ3VtZW50czpnKX07YS51bnNoaWZ0KG0pO2E9di5hcHBseSh0aGlzLGEpO24ucHJvY2VlZD1udWxsO3JldHVybiBhfX07YS5kYXRlUHJvcHNUb1RpbWVzdGFtcHM9ZnVuY3Rpb24obSl7YS5vYmplY3RFYWNoKG0sZnVuY3Rpb24oZyx2KXthLmlzT2JqZWN0KGcpJiZcImZ1bmN0aW9uXCI9PT10eXBlb2YgZy5nZXRUaW1lP21bdl09Zy5nZXRUaW1lKCk6KGEuaXNPYmplY3QoZyl8fGEuaXNBcnJheShnKSkmJmEuZGF0ZVByb3BzVG9UaW1lc3RhbXBzKGcpfSl9O2EuZm9ybWF0U2luZ2xlPWZ1bmN0aW9uKG0sZyx2KXt2YXIgeD0vXFwuKFswLTldKS8seT1hLmRlZmF1bHRPcHRpb25zLmxhbmc7L2YkLy50ZXN0KG0pPyh2PSh2PW0ubWF0Y2goeCkpP3ZbMV06LTEsbnVsbCE9PWcmJlxuKGc9YS5udW1iZXJGb3JtYXQoZyx2LHkuZGVjaW1hbFBvaW50LC0xPG0uaW5kZXhPZihcIixcIik/eS50aG91c2FuZHNTZXA6XCJcIikpKTpnPSh2fHxhLnRpbWUpLmRhdGVGb3JtYXQobSxnKTtyZXR1cm4gZ307YS5mb3JtYXQ9ZnVuY3Rpb24obSxnLHYpe2Zvcih2YXIgeD1cIntcIix5PSExLHosbixmLGgscj1bXSxlO207KXt4PW0uaW5kZXhPZih4KTtpZigtMT09PXgpYnJlYWs7ej1tLnNsaWNlKDAseCk7aWYoeSl7ej16LnNwbGl0KFwiOlwiKTtuPXouc2hpZnQoKS5zcGxpdChcIi5cIik7aD1uLmxlbmd0aDtlPWc7Zm9yKGY9MDtmPGg7ZisrKWUmJihlPWVbbltmXV0pO3oubGVuZ3RoJiYoZT1hLmZvcm1hdFNpbmdsZSh6LmpvaW4oXCI6XCIpLGUsdikpO3IucHVzaChlKX1lbHNlIHIucHVzaCh6KTttPW0uc2xpY2UoeCsxKTt4PSh5PSF5KT9cIn1cIjpcIntcIn1yLnB1c2gobSk7cmV0dXJuIHIuam9pbihcIlwiKX07YS5nZXRNYWduaXR1ZGU9ZnVuY3Rpb24oYSl7cmV0dXJuIE1hdGgucG93KDEwLE1hdGguZmxvb3IoTWF0aC5sb2coYSkvXG5NYXRoLkxOMTApKX07YS5ub3JtYWxpemVUaWNrSW50ZXJ2YWw9ZnVuY3Rpb24obSxnLHYseCx5KXt2YXIgeixuPW07dj1hLnBpY2sodiwxKTt6PW0vdjtnfHwoZz15P1sxLDEuMiwxLjUsMiwyLjUsMyw0LDUsNiw4LDEwXTpbMSwyLDIuNSw1LDEwXSwhMT09PXgmJigxPT09dj9nPWcuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiAwPT09YSUxfSk6LjE+PXYmJihnPVsxL3ZdKSkpO2Zvcih4PTA7eDxnLmxlbmd0aCYmIShuPWdbeF0seSYmbip2Pj1tfHwheSYmejw9KGdbeF0rKGdbeCsxXXx8Z1t4XSkpLzIpO3grKyk7cmV0dXJuIG49YS5jb3JyZWN0RmxvYXQobip2LC1NYXRoLnJvdW5kKE1hdGgubG9nKC4wMDEpL01hdGguTE4xMCkpfTthLnN0YWJsZVNvcnQ9ZnVuY3Rpb24oYSxnKXt2YXIgbT1hLmxlbmd0aCx4LHk7Zm9yKHk9MDt5PG07eSsrKWFbeV0uc2FmZUk9eTthLnNvcnQoZnVuY3Rpb24oYSxuKXt4PWcoYSxuKTtyZXR1cm4gMD09PXg/YS5zYWZlSS1uLnNhZmVJOnh9KTtmb3IoeT1cbjA7eTxtO3krKylkZWxldGUgYVt5XS5zYWZlSX07YS5hcnJheU1pbj1mdW5jdGlvbihhKXtmb3IodmFyIGc9YS5sZW5ndGgsbT1hWzBdO2ctLTspYVtnXTxtJiYobT1hW2ddKTtyZXR1cm4gbX07YS5hcnJheU1heD1mdW5jdGlvbihhKXtmb3IodmFyIGc9YS5sZW5ndGgsbT1hWzBdO2ctLTspYVtnXT5tJiYobT1hW2ddKTtyZXR1cm4gbX07YS5kZXN0cm95T2JqZWN0UHJvcGVydGllcz1mdW5jdGlvbihtLGcpe2Eub2JqZWN0RWFjaChtLGZ1bmN0aW9uKGEseCl7YSYmYSE9PWcmJmEuZGVzdHJveSYmYS5kZXN0cm95KCk7ZGVsZXRlIG1beF19KX07YS5kaXNjYXJkRWxlbWVudD1mdW5jdGlvbihtKXt2YXIgZz1hLmdhcmJhZ2VCaW47Z3x8KGc9YS5jcmVhdGVFbGVtZW50KFwiZGl2XCIpKTttJiZnLmFwcGVuZENoaWxkKG0pO2cuaW5uZXJIVE1MPVwiXCJ9O2EuY29ycmVjdEZsb2F0PWZ1bmN0aW9uKGEsZyl7cmV0dXJuIHBhcnNlRmxvYXQoYS50b1ByZWNpc2lvbihnfHwxNCkpfTthLnNldEFuaW1hdGlvbj1cbmZ1bmN0aW9uKG0sZyl7Zy5yZW5kZXJlci5nbG9iYWxBbmltYXRpb249YS5waWNrKG0sZy5vcHRpb25zLmNoYXJ0LmFuaW1hdGlvbiwhMCl9O2EuYW5pbU9iamVjdD1mdW5jdGlvbihtKXtyZXR1cm4gYS5pc09iamVjdChtKT9hLm1lcmdlKG0pOntkdXJhdGlvbjptPzUwMDowfX07YS50aW1lVW5pdHM9e21pbGxpc2Vjb25kOjEsc2Vjb25kOjFFMyxtaW51dGU6NkU0LGhvdXI6MzZFNSxkYXk6ODY0RTUsd2Vlazo2MDQ4RTUsbW9udGg6MjQxOTJFNSx5ZWFyOjMxNDQ5NkU1fTthLm51bWJlckZvcm1hdD1mdW5jdGlvbihtLGcsdix4KXttPSttfHwwO2c9K2c7dmFyIHk9YS5kZWZhdWx0T3B0aW9ucy5sYW5nLHo9KG0udG9TdHJpbmcoKS5zcGxpdChcIi5cIilbMV18fFwiXCIpLnNwbGl0KFwiZVwiKVswXS5sZW5ndGgsbixmLGg9bS50b1N0cmluZygpLnNwbGl0KFwiZVwiKTstMT09PWc/Zz1NYXRoLm1pbih6LDIwKTphLmlzTnVtYmVyKGcpP2cmJmhbMV0mJjA+aFsxXSYmKG49ZysgK2hbMV0sMDw9bj8oaFswXT1cbigraFswXSkudG9FeHBvbmVudGlhbChuKS5zcGxpdChcImVcIilbMF0sZz1uKTooaFswXT1oWzBdLnNwbGl0KFwiLlwiKVswXXx8MCxtPTIwPmc/KGhbMF0qTWF0aC5wb3coMTAsaFsxXSkpLnRvRml4ZWQoZyk6MCxoWzFdPTApKTpnPTI7Zj0oTWF0aC5hYnMoaFsxXT9oWzBdOm0pK01hdGgucG93KDEwLC1NYXRoLm1heChnLHopLTEpKS50b0ZpeGVkKGcpO3o9U3RyaW5nKGEucEludChmKSk7bj0zPHoubGVuZ3RoP3oubGVuZ3RoJTM6MDt2PWEucGljayh2LHkuZGVjaW1hbFBvaW50KTt4PWEucGljayh4LHkudGhvdXNhbmRzU2VwKTttPSgwPm0/XCItXCI6XCJcIikrKG4/ei5zdWJzdHIoMCxuKSt4OlwiXCIpO20rPXouc3Vic3RyKG4pLnJlcGxhY2UoLyhcXGR7M30pKD89XFxkKS9nLFwiJDFcIit4KTtnJiYobSs9ditmLnNsaWNlKC1nKSk7aFsxXSYmMCE9PSttJiYobSs9XCJlXCIraFsxXSk7cmV0dXJuIG19O01hdGguZWFzZUluT3V0U2luZT1mdW5jdGlvbihhKXtyZXR1cm4tLjUqKE1hdGguY29zKE1hdGguUEkqXG5hKS0xKX07YS5nZXRTdHlsZT1mdW5jdGlvbihtLGcsdil7aWYoXCJ3aWR0aFwiPT09ZylyZXR1cm4gTWF0aC5tYXgoMCxNYXRoLm1pbihtLm9mZnNldFdpZHRoLG0uc2Nyb2xsV2lkdGgsbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJlwibm9uZVwiPT09YS5nZXRTdHlsZShtLFwidHJhbnNmb3JtXCIsITEpP01hdGguZmxvb3IobS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aCk6SW5maW5pdHkpLWEuZ2V0U3R5bGUobSxcInBhZGRpbmctbGVmdFwiKS1hLmdldFN0eWxlKG0sXCJwYWRkaW5nLXJpZ2h0XCIpKTtpZihcImhlaWdodFwiPT09ZylyZXR1cm4gTWF0aC5tYXgoMCxNYXRoLm1pbihtLm9mZnNldEhlaWdodCxtLnNjcm9sbEhlaWdodCktYS5nZXRTdHlsZShtLFwicGFkZGluZy10b3BcIiktYS5nZXRTdHlsZShtLFwicGFkZGluZy1ib3R0b21cIikpO0UuZ2V0Q29tcHV0ZWRTdHlsZXx8YS5lcnJvcigyNywhMCk7aWYobT1FLmdldENvbXB1dGVkU3R5bGUobSx2b2lkIDApKW09bS5nZXRQcm9wZXJ0eVZhbHVlKGcpLFxuYS5waWNrKHYsXCJvcGFjaXR5XCIhPT1nKSYmKG09YS5wSW50KG0pKTtyZXR1cm4gbX07YS5pbkFycmF5PWZ1bmN0aW9uKGEsZyx2KXtyZXR1cm4gZy5pbmRleE9mKGEsdil9O2EuZmluZD1BcnJheS5wcm90b3R5cGUuZmluZD9mdW5jdGlvbihhLGcpe3JldHVybiBhLmZpbmQoZyl9OmZ1bmN0aW9uKGEsZyl7dmFyIG0seD1hLmxlbmd0aDtmb3IobT0wO208eDttKyspaWYoZyhhW21dLG0pKXJldHVybiBhW21dfTthLmtleXM9T2JqZWN0LmtleXM7YS5vZmZzZXQ9ZnVuY3Rpb24oYSl7dmFyIGc9QS5kb2N1bWVudEVsZW1lbnQ7YT1hLnBhcmVudEVsZW1lbnR8fGEucGFyZW50Tm9kZT9hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOnt0b3A6MCxsZWZ0OjB9O3JldHVybnt0b3A6YS50b3ArKEUucGFnZVlPZmZzZXR8fGcuc2Nyb2xsVG9wKS0oZy5jbGllbnRUb3B8fDApLGxlZnQ6YS5sZWZ0KyhFLnBhZ2VYT2Zmc2V0fHxnLnNjcm9sbExlZnQpLShnLmNsaWVudExlZnR8fDApfX07YS5zdG9wPWZ1bmN0aW9uKG0sXG5nKXtmb3IodmFyIHY9YS50aW1lcnMubGVuZ3RoO3YtLTspYS50aW1lcnNbdl0uZWxlbSE9PW18fGcmJmchPT1hLnRpbWVyc1t2XS5wcm9wfHwoYS50aW1lcnNbdl0uc3RvcHBlZD0hMCl9O2Eub2JqZWN0RWFjaD1mdW5jdGlvbihhLGcsdil7Zm9yKHZhciBtIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShtKSYmZy5jYWxsKHZ8fGFbbV0sYVttXSxtLGEpfTthLm9iamVjdEVhY2goe21hcDpcIm1hcFwiLGVhY2g6XCJmb3JFYWNoXCIsZ3JlcDpcImZpbHRlclwiLHJlZHVjZTpcInJlZHVjZVwiLHNvbWU6XCJzb21lXCJ9LGZ1bmN0aW9uKG0sZyl7YVtnXT1mdW5jdGlvbihhKXtyZXR1cm4gQXJyYXkucHJvdG90eXBlW21dLmFwcGx5KGEsW10uc2xpY2UuY2FsbChhcmd1bWVudHMsMSkpfX0pO2EuYWRkRXZlbnQ9ZnVuY3Rpb24obSxnLHYseCl7dm9pZCAwPT09eCYmKHg9e30pO3ZhciB5LHo9bS5hZGRFdmVudExpc3RlbmVyfHxhLmFkZEV2ZW50TGlzdGVuZXJQb2x5ZmlsbDt5PVwiZnVuY3Rpb25cIj09PXR5cGVvZiBtJiZcbm0ucHJvdG90eXBlP20ucHJvdG90eXBlLnByb3RvRXZlbnRzPW0ucHJvdG90eXBlLnByb3RvRXZlbnRzfHx7fTptLmhjRXZlbnRzPW0uaGNFdmVudHN8fHt9O2EuUG9pbnQmJm0gaW5zdGFuY2VvZiBhLlBvaW50JiZtLnNlcmllcyYmbS5zZXJpZXMuY2hhcnQmJihtLnNlcmllcy5jaGFydC5ydW5UcmFja2VyQ2xpY2s9ITApO3omJnouY2FsbChtLGcsdiwhMSk7eVtnXXx8KHlbZ109W10pO3lbZ10ucHVzaCh7Zm46dixvcmRlcjpcIm51bWJlclwiPT09dHlwZW9mIHgub3JkZXI/eC5vcmRlcjpJbmZpbml0eX0pO3lbZ10uc29ydChmdW5jdGlvbihhLGYpe3JldHVybiBhLm9yZGVyLWYub3JkZXJ9KTtyZXR1cm4gZnVuY3Rpb24oKXthLnJlbW92ZUV2ZW50KG0sZyx2KX19O2EucmVtb3ZlRXZlbnQ9ZnVuY3Rpb24obSxnLHYpe2Z1bmN0aW9uIHgobixmKXt2YXIgaD1tLnJlbW92ZUV2ZW50TGlzdGVuZXJ8fGEucmVtb3ZlRXZlbnRMaXN0ZW5lclBvbHlmaWxsO2gmJmguY2FsbChtLG4sZiwhMSl9XG5mdW5jdGlvbiB5KG4pe3ZhciBmLGg7bS5ub2RlTmFtZSYmKGc/KGY9e30sZltnXT0hMCk6Zj1uLGEub2JqZWN0RWFjaChmLGZ1bmN0aW9uKGEsZSl7aWYobltlXSlmb3IoaD1uW2VdLmxlbmd0aDtoLS07KXgoZSxuW2VdW2hdLmZuKX0pKX12YXIgejtbXCJwcm90b0V2ZW50c1wiLFwiaGNFdmVudHNcIl0uZm9yRWFjaChmdW5jdGlvbihhKXt2YXIgZj1tW2FdO2YmJihnPyh6PWZbZ118fFtdLHY/KGZbZ109ei5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIHYhPT1hLmZufSkseChnLHYpKTooeShmKSxmW2ddPVtdKSk6KHkoZiksbVthXT17fSkpfSl9O2EuZmlyZUV2ZW50PWZ1bmN0aW9uKG0sZyx2LHgpe3ZhciB5LHo7dj12fHx7fTtBLmNyZWF0ZUV2ZW50JiYobS5kaXNwYXRjaEV2ZW50fHxtLmZpcmVFdmVudCk/KHk9QS5jcmVhdGVFdmVudChcIkV2ZW50c1wiKSx5LmluaXRFdmVudChnLCEwLCEwKSxhLmV4dGVuZCh5LHYpLG0uZGlzcGF0Y2hFdmVudD9tLmRpc3BhdGNoRXZlbnQoeSk6bS5maXJlRXZlbnQoZyxcbnkpKToodi50YXJnZXR8fGEuZXh0ZW5kKHYse3ByZXZlbnREZWZhdWx0OmZ1bmN0aW9uKCl7di5kZWZhdWx0UHJldmVudGVkPSEwfSx0YXJnZXQ6bSx0eXBlOmd9KSxmdW5jdGlvbihhLGYpe3ZvaWQgMD09PWEmJihhPVtdKTt2b2lkIDA9PT1mJiYoZj1bXSk7dmFyIGg9MCxyPTAsZT1hLmxlbmd0aCtmLmxlbmd0aDtmb3Ioej0wO3o8ZTt6KyspITE9PT0oYVtoXT9mW3JdP2FbaF0ub3JkZXI8PWZbcl0ub3JkZXI/YVtoKytdOmZbcisrXTphW2grK106ZltyKytdKS5mbi5jYWxsKG0sdikmJnYucHJldmVudERlZmF1bHQoKX0obS5wcm90b0V2ZW50cyYmbS5wcm90b0V2ZW50c1tnXSxtLmhjRXZlbnRzJiZtLmhjRXZlbnRzW2ddKSk7eCYmIXYuZGVmYXVsdFByZXZlbnRlZCYmeC5jYWxsKG0sdil9O2EuYW5pbWF0ZT1mdW5jdGlvbihtLGcsdil7dmFyIHgseT1cIlwiLHosbixmO2EuaXNPYmplY3Qodil8fChmPWFyZ3VtZW50cyx2PXtkdXJhdGlvbjpmWzJdLGVhc2luZzpmWzNdLGNvbXBsZXRlOmZbNF19KTtcbmEuaXNOdW1iZXIodi5kdXJhdGlvbil8fCh2LmR1cmF0aW9uPTQwMCk7di5lYXNpbmc9XCJmdW5jdGlvblwiPT09dHlwZW9mIHYuZWFzaW5nP3YuZWFzaW5nOk1hdGhbdi5lYXNpbmddfHxNYXRoLmVhc2VJbk91dFNpbmU7di5jdXJBbmltPWEubWVyZ2UoZyk7YS5vYmplY3RFYWNoKGcsZnVuY3Rpb24oaCxmKXthLnN0b3AobSxmKTtuPW5ldyBhLkZ4KG0sdixmKTt6PW51bGw7XCJkXCI9PT1mPyhuLnBhdGhzPW4uaW5pdFBhdGgobSxtLmQsZy5kKSxuLnRvRD1nLmQseD0wLHo9MSk6bS5hdHRyP3g9bS5hdHRyKGYpOih4PXBhcnNlRmxvYXQoYS5nZXRTdHlsZShtLGYpKXx8MCxcIm9wYWNpdHlcIiE9PWYmJih5PVwicHhcIikpO3p8fCh6PWgpO3omJnoubWF0Y2gmJnoubWF0Y2goXCJweFwiKSYmKHo9ei5yZXBsYWNlKC9weC9nLFwiXCIpKTtuLnJ1bih4LHoseSl9KX07YS5zZXJpZXNUeXBlPWZ1bmN0aW9uKG0sZyx2LHgseSl7dmFyIHo9YS5nZXRPcHRpb25zKCksbj1hLnNlcmllc1R5cGVzO3oucGxvdE9wdGlvbnNbbV09XG5hLm1lcmdlKHoucGxvdE9wdGlvbnNbZ10sdik7blttXT1hLmV4dGVuZENsYXNzKG5bZ118fGZ1bmN0aW9uKCl7fSx4KTtuW21dLnByb3RvdHlwZS50eXBlPW07eSYmKG5bbV0ucHJvdG90eXBlLnBvaW50Q2xhc3M9YS5leHRlbmRDbGFzcyhhLlBvaW50LHkpKTtyZXR1cm4gblttXX07YS51bmlxdWVLZXk9ZnVuY3Rpb24oKXt2YXIgYT1NYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zdWJzdHJpbmcoMiw5KSxnPTA7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuXCJoaWdoY2hhcnRzLVwiK2ErXCItXCIrZysrfX0oKTthLmlzRnVuY3Rpb249ZnVuY3Rpb24oYSl7cmV0dXJuXCJmdW5jdGlvblwiPT09dHlwZW9mIGF9O0UualF1ZXJ5JiYoRS5qUXVlcnkuZm4uaGlnaGNoYXJ0cz1mdW5jdGlvbigpe3ZhciBtPVtdLnNsaWNlLmNhbGwoYXJndW1lbnRzKTtpZih0aGlzWzBdKXJldHVybiBtWzBdPyhuZXcgKGFbYS5pc1N0cmluZyhtWzBdKT9tLnNoaWZ0KCk6XCJDaGFydFwiXSkodGhpc1swXSxtWzBdLG1bMV0pLFxudGhpcyk6Q1thLmF0dHIodGhpc1swXSxcImRhdGEtaGlnaGNoYXJ0cy1jaGFydFwiKV19KX0pO0koSCxcInBhcnRzL0NvbG9yLmpzXCIsW0hbXCJwYXJ0cy9HbG9iYWxzLmpzXCJdXSxmdW5jdGlvbihhKXt2YXIgQz1hLmlzTnVtYmVyLEE9YS5tZXJnZSxFPWEucEludDthLkNvbG9yPWZ1bmN0aW9uKG0pe2lmKCEodGhpcyBpbnN0YW5jZW9mIGEuQ29sb3IpKXJldHVybiBuZXcgYS5Db2xvcihtKTt0aGlzLmluaXQobSl9O2EuQ29sb3IucHJvdG90eXBlPXtwYXJzZXJzOlt7cmVnZXg6L3JnYmFcXChcXHMqKFswLTldezEsM30pXFxzKixcXHMqKFswLTldezEsM30pXFxzKixcXHMqKFswLTldezEsM30pXFxzKixcXHMqKFswLTldPyg/OlxcLlswLTldKyk/KVxccypcXCkvLHBhcnNlOmZ1bmN0aW9uKGEpe3JldHVybltFKGFbMV0pLEUoYVsyXSksRShhWzNdKSxwYXJzZUZsb2F0KGFbNF0sMTApXX19LHtyZWdleDovcmdiXFwoXFxzKihbMC05XXsxLDN9KVxccyosXFxzKihbMC05XXsxLDN9KVxccyosXFxzKihbMC05XXsxLDN9KVxccypcXCkvLFxucGFyc2U6ZnVuY3Rpb24oYSl7cmV0dXJuW0UoYVsxXSksRShhWzJdKSxFKGFbM10pLDFdfX1dLG5hbWVzOnt3aGl0ZTpcIiNmZmZmZmZcIixibGFjazpcIiMwMDAwMDBcIn0saW5pdDpmdW5jdGlvbihtKXt2YXIgZyx2LHgseTtpZigodGhpcy5pbnB1dD1tPXRoaXMubmFtZXNbbSYmbS50b0xvd2VyQ2FzZT9tLnRvTG93ZXJDYXNlKCk6XCJcIl18fG0pJiZtLnN0b3BzKXRoaXMuc3RvcHM9bS5zdG9wcy5tYXAoZnVuY3Rpb24oZyl7cmV0dXJuIG5ldyBhLkNvbG9yKGdbMV0pfSk7ZWxzZSBpZihtJiZtLmNoYXJBdCYmXCIjXCI9PT1tLmNoYXJBdCgpJiYoZz1tLmxlbmd0aCxtPXBhcnNlSW50KG0uc3Vic3RyKDEpLDE2KSw3PT09Zz92PVsobSYxNjcxMTY4MCk+PjE2LChtJjY1MjgwKT4+OCxtJjI1NSwxXTo0PT09ZyYmKHY9WyhtJjM4NDApPj40fChtJjM4NDApPj44LChtJjI0MCk+PjR8bSYyNDAsKG0mMTUpPDw0fG0mMTUsMV0pKSwhdilmb3IoeD10aGlzLnBhcnNlcnMubGVuZ3RoO3gtLSYmIXY7KXk9XG50aGlzLnBhcnNlcnNbeF0sKGc9eS5yZWdleC5leGVjKG0pKSYmKHY9eS5wYXJzZShnKSk7dGhpcy5yZ2JhPXZ8fFtdfSxnZXQ6ZnVuY3Rpb24oYSl7dmFyIGc9dGhpcy5pbnB1dCxtPXRoaXMucmdiYSx4O3RoaXMuc3RvcHM/KHg9QShnKSx4LnN0b3BzPVtdLmNvbmNhdCh4LnN0b3BzKSx0aGlzLnN0b3BzLmZvckVhY2goZnVuY3Rpb24oZyxtKXt4LnN0b3BzW21dPVt4LnN0b3BzW21dWzBdLGcuZ2V0KGEpXX0pKTp4PW0mJkMobVswXSk/XCJyZ2JcIj09PWF8fCFhJiYxPT09bVszXT9cInJnYihcIittWzBdK1wiLFwiK21bMV0rXCIsXCIrbVsyXStcIilcIjpcImFcIj09PWE/bVszXTpcInJnYmEoXCIrbS5qb2luKFwiLFwiKStcIilcIjpnO3JldHVybiB4fSxicmlnaHRlbjpmdW5jdGlvbihhKXt2YXIgZyxtPXRoaXMucmdiYTtpZih0aGlzLnN0b3BzKXRoaXMuc3RvcHMuZm9yRWFjaChmdW5jdGlvbihnKXtnLmJyaWdodGVuKGEpfSk7ZWxzZSBpZihDKGEpJiYwIT09YSlmb3IoZz0wOzM+ZztnKyspbVtnXSs9RSgyNTUqXG5hKSwwPm1bZ10mJihtW2ddPTApLDI1NTxtW2ddJiYobVtnXT0yNTUpO3JldHVybiB0aGlzfSxzZXRPcGFjaXR5OmZ1bmN0aW9uKGEpe3RoaXMucmdiYVszXT1hO3JldHVybiB0aGlzfSx0d2VlblRvOmZ1bmN0aW9uKGEsZyl7dmFyIG09dGhpcy5yZ2JhLHg9YS5yZ2JhO3gubGVuZ3RoJiZtJiZtLmxlbmd0aD8oYT0xIT09eFszXXx8MSE9PW1bM10sZz0oYT9cInJnYmEoXCI6XCJyZ2IoXCIpK01hdGgucm91bmQoeFswXSsobVswXS14WzBdKSooMS1nKSkrXCIsXCIrTWF0aC5yb3VuZCh4WzFdKyhtWzFdLXhbMV0pKigxLWcpKStcIixcIitNYXRoLnJvdW5kKHhbMl0rKG1bMl0teFsyXSkqKDEtZykpKyhhP1wiLFwiKyh4WzNdKyhtWzNdLXhbM10pKigxLWcpKTpcIlwiKStcIilcIik6Zz1hLmlucHV0fHxcIm5vbmVcIjtyZXR1cm4gZ319O2EuY29sb3I9ZnVuY3Rpb24obSl7cmV0dXJuIG5ldyBhLkNvbG9yKG0pfX0pO0koSCxcInBhcnRzL1N2Z1JlbmRlcmVyLmpzXCIsW0hbXCJwYXJ0cy9HbG9iYWxzLmpzXCJdXSxmdW5jdGlvbihhKXt2YXIgQyxcbkEsRT1hLmFkZEV2ZW50LG09YS5hbmltYXRlLGc9YS5hdHRyLHY9YS5jaGFydHMseD1hLmNvbG9yLHk9YS5jc3Msej1hLmNyZWF0ZUVsZW1lbnQsbj1hLmRlZmluZWQsZj1hLmRlZzJyYWQsaD1hLmRlc3Ryb3lPYmplY3RQcm9wZXJ0aWVzLHI9YS5kb2MsZT1hLmV4dGVuZCxiPWEuZXJhc2UsbD1hLmhhc1RvdWNoLGM9YS5pc0FycmF5LHQ9YS5pc0ZpcmVmb3gsRj1hLmlzTVMsdz1hLmlzT2JqZWN0LEI9YS5pc1N0cmluZyxwPWEuaXNXZWJLaXQsZD1hLm1lcmdlLGs9YS5ub29wLHU9YS5vYmplY3RFYWNoLEQ9YS5waWNrLEc9YS5wSW50LHE9YS5yZW1vdmVFdmVudCxLPWEuc3BsYXQsTj1hLnN0b3AsTz1hLnN2ZyxMPWEuU1ZHX05TLFI9YS5zeW1ib2xTaXplcyxNPWEud2luO0M9YS5TVkdFbGVtZW50PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9O2UoQy5wcm90b3R5cGUse29wYWNpdHk6MSxTVkdfTlM6TCx0ZXh0UHJvcHM6XCJkaXJlY3Rpb24gZm9udFNpemUgZm9udFdlaWdodCBmb250RmFtaWx5IGZvbnRTdHlsZSBjb2xvciBsaW5lSGVpZ2h0IHdpZHRoIHRleHRBbGlnbiB0ZXh0RGVjb3JhdGlvbiB0ZXh0T3ZlcmZsb3cgdGV4dE91dGxpbmUgY3Vyc29yXCIuc3BsaXQoXCIgXCIpLFxuaW5pdDpmdW5jdGlvbihkLHEpe3RoaXMuZWxlbWVudD1cInNwYW5cIj09PXE/eihxKTpyLmNyZWF0ZUVsZW1lbnROUyh0aGlzLlNWR19OUyxxKTt0aGlzLnJlbmRlcmVyPWQ7YS5maXJlRXZlbnQodGhpcyxcImFmdGVySW5pdFwiKX0sYW5pbWF0ZTpmdW5jdGlvbihkLHEsYil7dmFyIEo9YS5hbmltT2JqZWN0KEQocSx0aGlzLnJlbmRlcmVyLmdsb2JhbEFuaW1hdGlvbiwhMCkpO0Qoci5oaWRkZW4sci5tc0hpZGRlbixyLndlYmtpdEhpZGRlbiwhMSkmJihKLmR1cmF0aW9uPTApOzAhPT1KLmR1cmF0aW9uPyhiJiYoSi5jb21wbGV0ZT1iKSxtKHRoaXMsZCxKKSk6KHRoaXMuYXR0cihkLHZvaWQgMCxiKSxhLm9iamVjdEVhY2goZCxmdW5jdGlvbihhLGQpe0ouc3RlcCYmSi5zdGVwLmNhbGwodGhpcyxhLHtwcm9wOmQscG9zOjF9KX0sdGhpcykpO3JldHVybiB0aGlzfSxjb21wbGV4Q29sb3I6ZnVuY3Rpb24ocSxiLGspe3ZhciBKPXRoaXMucmVuZGVyZXIsZSxsLHQscCxLLGgsZixELHIsdyxHLFxuTD1bXSxPO2EuZmlyZUV2ZW50KHRoaXMucmVuZGVyZXIsXCJjb21wbGV4Q29sb3JcIix7YXJnczphcmd1bWVudHN9LGZ1bmN0aW9uKCl7cS5yYWRpYWxHcmFkaWVudD9sPVwicmFkaWFsR3JhZGllbnRcIjpxLmxpbmVhckdyYWRpZW50JiYobD1cImxpbmVhckdyYWRpZW50XCIpO2wmJih0PXFbbF0sSz1KLmdyYWRpZW50cyxmPXEuc3RvcHMsdz1rLnJhZGlhbFJlZmVyZW5jZSxjKHQpJiYocVtsXT10PXt4MTp0WzBdLHkxOnRbMV0seDI6dFsyXSx5Mjp0WzNdLGdyYWRpZW50VW5pdHM6XCJ1c2VyU3BhY2VPblVzZVwifSksXCJyYWRpYWxHcmFkaWVudFwiPT09bCYmdyYmIW4odC5ncmFkaWVudFVuaXRzKSYmKHA9dCx0PWQodCxKLmdldFJhZGlhbEF0dHIodyxwKSx7Z3JhZGllbnRVbml0czpcInVzZXJTcGFjZU9uVXNlXCJ9KSksdSh0LGZ1bmN0aW9uKGEsZCl7XCJpZFwiIT09ZCYmTC5wdXNoKGQsYSl9KSx1KGYsZnVuY3Rpb24oYSl7TC5wdXNoKGEpfSksTD1MLmpvaW4oXCIsXCIpLEtbTF0/Rz1LW0xdLmF0dHIoXCJpZFwiKTpcbih0LmlkPUc9YS51bmlxdWVLZXkoKSxLW0xdPWg9Si5jcmVhdGVFbGVtZW50KGwpLmF0dHIodCkuYWRkKEouZGVmcyksaC5yYWRBdHRyPXAsaC5zdG9wcz1bXSxmLmZvckVhY2goZnVuY3Rpb24oZCl7MD09PWRbMV0uaW5kZXhPZihcInJnYmFcIik/KGU9YS5jb2xvcihkWzFdKSxEPWUuZ2V0KFwicmdiXCIpLHI9ZS5nZXQoXCJhXCIpKTooRD1kWzFdLHI9MSk7ZD1KLmNyZWF0ZUVsZW1lbnQoXCJzdG9wXCIpLmF0dHIoe29mZnNldDpkWzBdLFwic3RvcC1jb2xvclwiOkQsXCJzdG9wLW9wYWNpdHlcIjpyfSkuYWRkKGgpO2guc3RvcHMucHVzaChkKX0pKSxPPVwidXJsKFwiK0oudXJsK1wiI1wiK0crXCIpXCIsay5zZXRBdHRyaWJ1dGUoYixPKSxrLmdyYWRpZW50PUwscS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiBPfSl9KX0sYXBwbHlUZXh0T3V0bGluZTpmdW5jdGlvbihkKXt2YXIgcT10aGlzLmVsZW1lbnQsYixKLGs7LTEhPT1kLmluZGV4T2YoXCJjb250cmFzdFwiKSYmKGQ9ZC5yZXBsYWNlKC9jb250cmFzdC9nLFxudGhpcy5yZW5kZXJlci5nZXRDb250cmFzdChxLnN0eWxlLmZpbGwpKSk7ZD1kLnNwbGl0KFwiIFwiKTtiPWRbZC5sZW5ndGgtMV07KEo9ZFswXSkmJlwibm9uZVwiIT09SiYmYS5zdmcmJih0aGlzLmZha2VUUz0hMCxkPVtdLnNsaWNlLmNhbGwocS5nZXRFbGVtZW50c0J5VGFnTmFtZShcInRzcGFuXCIpKSx0aGlzLnlTZXR0ZXI9dGhpcy54U2V0dGVyLEo9Si5yZXBsYWNlKC8oXltcXGRcXC5dKykoLio/KSQvZyxmdW5jdGlvbihhLGQscSl7cmV0dXJuIDIqZCtxfSksdGhpcy5yZW1vdmVUZXh0T3V0bGluZShkKSxrPXEuZmlyc3RDaGlsZCxkLmZvckVhY2goZnVuY3Rpb24oYSxkKXswPT09ZCYmKGEuc2V0QXR0cmlidXRlKFwieFwiLHEuZ2V0QXR0cmlidXRlKFwieFwiKSksZD1xLmdldEF0dHJpYnV0ZShcInlcIiksYS5zZXRBdHRyaWJ1dGUoXCJ5XCIsZHx8MCksbnVsbD09PWQmJnEuc2V0QXR0cmlidXRlKFwieVwiLDApKTthPWEuY2xvbmVOb2RlKDEpO2coYSx7XCJjbGFzc1wiOlwiaGlnaGNoYXJ0cy10ZXh0LW91dGxpbmVcIixcbmZpbGw6YixzdHJva2U6YixcInN0cm9rZS13aWR0aFwiOkosXCJzdHJva2UtbGluZWpvaW5cIjpcInJvdW5kXCJ9KTtxLmluc2VydEJlZm9yZShhLGspfSkpfSxyZW1vdmVUZXh0T3V0bGluZTpmdW5jdGlvbihhKXtmb3IodmFyIGQ9YS5sZW5ndGgscTtkLS07KXE9YVtkXSxcImhpZ2hjaGFydHMtdGV4dC1vdXRsaW5lXCI9PT1xLmdldEF0dHJpYnV0ZShcImNsYXNzXCIpJiZiKGEsdGhpcy5lbGVtZW50LnJlbW92ZUNoaWxkKHEpKX0sc3ltYm9sQ3VzdG9tQXR0cmliczpcInggeSB3aWR0aCBoZWlnaHQgciBzdGFydCBlbmQgaW5uZXJSIGFuY2hvclggYW5jaG9yWSByb3VuZGVkXCIuc3BsaXQoXCIgXCIpLGF0dHI6ZnVuY3Rpb24oZCxxLGIsayl7dmFyIEosZT10aGlzLmVsZW1lbnQsYyxsPXRoaXMsdCxwLEs9dGhpcy5zeW1ib2xDdXN0b21BdHRyaWJzO1wic3RyaW5nXCI9PT10eXBlb2YgZCYmdm9pZCAwIT09cSYmKEo9ZCxkPXt9LGRbSl09cSk7XCJzdHJpbmdcIj09PXR5cGVvZiBkP2w9KHRoaXNbZCtcIkdldHRlclwiXXx8XG50aGlzLl9kZWZhdWx0R2V0dGVyKS5jYWxsKHRoaXMsZCxlKToodShkLGZ1bmN0aW9uKHEsYil7dD0hMTtrfHxOKHRoaXMsYik7dGhpcy5zeW1ib2xOYW1lJiYtMSE9PWEuaW5BcnJheShiLEspJiYoY3x8KHRoaXMuc3ltYm9sQXR0cihkKSxjPSEwKSx0PSEwKTshdGhpcy5yb3RhdGlvbnx8XCJ4XCIhPT1iJiZcInlcIiE9PWJ8fCh0aGlzLmRvVHJhbnNmb3JtPSEwKTt0fHwocD10aGlzW2IrXCJTZXR0ZXJcIl18fHRoaXMuX2RlZmF1bHRTZXR0ZXIscC5jYWxsKHRoaXMscSxiLGUpLCF0aGlzLnN0eWxlZE1vZGUmJnRoaXMuc2hhZG93cyYmL14od2lkdGh8aGVpZ2h0fHZpc2liaWxpdHl8eHx5fGR8dHJhbnNmb3JtfGN4fGN5fHIpJC8udGVzdChiKSYmdGhpcy51cGRhdGVTaGFkb3dzKGIscSxwKSl9LHRoaXMpLHRoaXMuYWZ0ZXJTZXR0ZXJzKCkpO2ImJmIuY2FsbCh0aGlzKTtyZXR1cm4gbH0sYWZ0ZXJTZXR0ZXJzOmZ1bmN0aW9uKCl7dGhpcy5kb1RyYW5zZm9ybSYmKHRoaXMudXBkYXRlVHJhbnNmb3JtKCksXG50aGlzLmRvVHJhbnNmb3JtPSExKX0sdXBkYXRlU2hhZG93czpmdW5jdGlvbihhLGQscSl7Zm9yKHZhciBiPXRoaXMuc2hhZG93cyxKPWIubGVuZ3RoO0otLTspcS5jYWxsKGJbSl0sXCJoZWlnaHRcIj09PWE/TWF0aC5tYXgoZC0oYltKXS5jdXRIZWlnaHR8fDApLDApOlwiZFwiPT09YT90aGlzLmQ6ZCxhLGJbSl0pfSxhZGRDbGFzczpmdW5jdGlvbihhLGQpe3ZhciBxPXRoaXMuYXR0cihcImNsYXNzXCIpfHxcIlwiO2R8fChhPShhfHxcIlwiKS5zcGxpdCgvIC9nKS5yZWR1Y2UoZnVuY3Rpb24oYSxkKXstMT09PXEuaW5kZXhPZihkKSYmYS5wdXNoKGQpO3JldHVybiBhfSxxP1txXTpbXSkuam9pbihcIiBcIikpO2EhPT1xJiZ0aGlzLmF0dHIoXCJjbGFzc1wiLGEpO3JldHVybiB0aGlzfSxoYXNDbGFzczpmdW5jdGlvbihhKXtyZXR1cm4tMSE9PSh0aGlzLmF0dHIoXCJjbGFzc1wiKXx8XCJcIikuc3BsaXQoXCIgXCIpLmluZGV4T2YoYSl9LHJlbW92ZUNsYXNzOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmF0dHIoXCJjbGFzc1wiLFxuKHRoaXMuYXR0cihcImNsYXNzXCIpfHxcIlwiKS5yZXBsYWNlKGEsXCJcIikpfSxzeW1ib2xBdHRyOmZ1bmN0aW9uKGEpe3ZhciBkPXRoaXM7XCJ4IHkgciBzdGFydCBlbmQgd2lkdGggaGVpZ2h0IGlubmVyUiBhbmNob3JYIGFuY2hvclkgY2xvY2t3aXNlXCIuc3BsaXQoXCIgXCIpLmZvckVhY2goZnVuY3Rpb24ocSl7ZFtxXT1EKGFbcV0sZFtxXSl9KTtkLmF0dHIoe2Q6ZC5yZW5kZXJlci5zeW1ib2xzW2Quc3ltYm9sTmFtZV0oZC54LGQueSxkLndpZHRoLGQuaGVpZ2h0LGQpfSl9LGNsaXA6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuYXR0cihcImNsaXAtcGF0aFwiLGE/XCJ1cmwoXCIrdGhpcy5yZW5kZXJlci51cmwrXCIjXCIrYS5pZCtcIilcIjpcIm5vbmVcIil9LGNyaXNwOmZ1bmN0aW9uKGEsZCl7dmFyIHE7ZD1kfHxhLnN0cm9rZVdpZHRofHwwO3E9TWF0aC5yb3VuZChkKSUyLzI7YS54PU1hdGguZmxvb3IoYS54fHx0aGlzLnh8fDApK3E7YS55PU1hdGguZmxvb3IoYS55fHx0aGlzLnl8fDApK3E7YS53aWR0aD1cbk1hdGguZmxvb3IoKGEud2lkdGh8fHRoaXMud2lkdGh8fDApLTIqcSk7YS5oZWlnaHQ9TWF0aC5mbG9vcigoYS5oZWlnaHR8fHRoaXMuaGVpZ2h0fHwwKS0yKnEpO24oYS5zdHJva2VXaWR0aCkmJihhLnN0cm9rZVdpZHRoPWQpO3JldHVybiBhfSxjc3M6ZnVuY3Rpb24oYSl7dmFyIGQ9dGhpcy5zdHlsZXMscT17fSxiPXRoaXMuZWxlbWVudCxrLEo9XCJcIixjLGw9IWQsdD1bXCJ0ZXh0T3V0bGluZVwiLFwidGV4dE92ZXJmbG93XCIsXCJ3aWR0aFwiXTthJiZhLmNvbG9yJiYoYS5maWxsPWEuY29sb3IpO2QmJnUoYSxmdW5jdGlvbihhLGIpe2EhPT1kW2JdJiYocVtiXT1hLGw9ITApfSk7bCYmKGQmJihhPWUoZCxxKSksYSYmKG51bGw9PT1hLndpZHRofHxcImF1dG9cIj09PWEud2lkdGg/ZGVsZXRlIHRoaXMudGV4dFdpZHRoOlwidGV4dFwiPT09Yi5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpJiZhLndpZHRoJiYoaz10aGlzLnRleHRXaWR0aD1HKGEud2lkdGgpKSksdGhpcy5zdHlsZXM9YSxrJiYhTyYmdGhpcy5yZW5kZXJlci5mb3JFeHBvcnQmJlxuZGVsZXRlIGEud2lkdGgsYi5uYW1lc3BhY2VVUkk9PT10aGlzLlNWR19OUz8oYz1mdW5jdGlvbihhLGQpe3JldHVyblwiLVwiK2QudG9Mb3dlckNhc2UoKX0sdShhLGZ1bmN0aW9uKGEsZCl7LTE9PT10LmluZGV4T2YoZCkmJihKKz1kLnJlcGxhY2UoLyhbQS1aXSkvZyxjKStcIjpcIithK1wiO1wiKX0pLEomJmcoYixcInN0eWxlXCIsSikpOnkoYixhKSx0aGlzLmFkZGVkJiYoXCJ0ZXh0XCI9PT10aGlzLmVsZW1lbnQubm9kZU5hbWUmJnRoaXMucmVuZGVyZXIuYnVpbGRUZXh0KHRoaXMpLGEmJmEudGV4dE91dGxpbmUmJnRoaXMuYXBwbHlUZXh0T3V0bGluZShhLnRleHRPdXRsaW5lKSkpO3JldHVybiB0aGlzfSxnZXRTdHlsZTpmdW5jdGlvbihhKXtyZXR1cm4gTS5nZXRDb21wdXRlZFN0eWxlKHRoaXMuZWxlbWVudHx8dGhpcyxcIlwiKS5nZXRQcm9wZXJ0eVZhbHVlKGEpfSxzdHJva2VXaWR0aDpmdW5jdGlvbigpe2lmKCF0aGlzLnJlbmRlcmVyLnN0eWxlZE1vZGUpcmV0dXJuIHRoaXNbXCJzdHJva2Utd2lkdGhcIl18fFxuMDt2YXIgYT10aGlzLmdldFN0eWxlKFwic3Ryb2tlLXdpZHRoXCIpLGQ7YS5pbmRleE9mKFwicHhcIik9PT1hLmxlbmd0aC0yP2E9RyhhKTooZD1yLmNyZWF0ZUVsZW1lbnROUyhMLFwicmVjdFwiKSxnKGQse3dpZHRoOmEsXCJzdHJva2Utd2lkdGhcIjowfSksdGhpcy5lbGVtZW50LnBhcmVudE5vZGUuYXBwZW5kQ2hpbGQoZCksYT1kLmdldEJCb3goKS53aWR0aCxkLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZCkpO3JldHVybiBhfSxvbjpmdW5jdGlvbihhLGQpe3ZhciBxPXRoaXMsYj1xLmVsZW1lbnQ7bCYmXCJjbGlja1wiPT09YT8oYi5vbnRvdWNoc3RhcnQ9ZnVuY3Rpb24oYSl7cS50b3VjaEV2ZW50RmlyZWQ9RGF0ZS5ub3coKTthLnByZXZlbnREZWZhdWx0KCk7ZC5jYWxsKGIsYSl9LGIub25jbGljaz1mdW5jdGlvbihhKXsoLTE9PT1NLm5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZihcIkFuZHJvaWRcIil8fDExMDA8RGF0ZS5ub3coKS0ocS50b3VjaEV2ZW50RmlyZWR8fDApKSYmZC5jYWxsKGIsXG5hKX0pOmJbXCJvblwiK2FdPWQ7cmV0dXJuIHRoaXN9LHNldFJhZGlhbFJlZmVyZW5jZTpmdW5jdGlvbihhKXt2YXIgZD10aGlzLnJlbmRlcmVyLmdyYWRpZW50c1t0aGlzLmVsZW1lbnQuZ3JhZGllbnRdO3RoaXMuZWxlbWVudC5yYWRpYWxSZWZlcmVuY2U9YTtkJiZkLnJhZEF0dHImJmQuYW5pbWF0ZSh0aGlzLnJlbmRlcmVyLmdldFJhZGlhbEF0dHIoYSxkLnJhZEF0dHIpKTtyZXR1cm4gdGhpc30sdHJhbnNsYXRlOmZ1bmN0aW9uKGEsZCl7cmV0dXJuIHRoaXMuYXR0cih7dHJhbnNsYXRlWDphLHRyYW5zbGF0ZVk6ZH0pfSxpbnZlcnQ6ZnVuY3Rpb24oYSl7dGhpcy5pbnZlcnRlZD1hO3RoaXMudXBkYXRlVHJhbnNmb3JtKCk7cmV0dXJuIHRoaXN9LHVwZGF0ZVRyYW5zZm9ybTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudHJhbnNsYXRlWHx8MCxkPXRoaXMudHJhbnNsYXRlWXx8MCxxPXRoaXMuc2NhbGVYLGI9dGhpcy5zY2FsZVksaz10aGlzLmludmVydGVkLGU9dGhpcy5yb3RhdGlvbixjPVxudGhpcy5tYXRyaXgsbD10aGlzLmVsZW1lbnQ7ayYmKGErPXRoaXMud2lkdGgsZCs9dGhpcy5oZWlnaHQpO2E9W1widHJhbnNsYXRlKFwiK2ErXCIsXCIrZCtcIilcIl07bihjKSYmYS5wdXNoKFwibWF0cml4KFwiK2Muam9pbihcIixcIikrXCIpXCIpO2s/YS5wdXNoKFwicm90YXRlKDkwKSBzY2FsZSgtMSwxKVwiKTplJiZhLnB1c2goXCJyb3RhdGUoXCIrZStcIiBcIitEKHRoaXMucm90YXRpb25PcmlnaW5YLGwuZ2V0QXR0cmlidXRlKFwieFwiKSwwKStcIiBcIitEKHRoaXMucm90YXRpb25PcmlnaW5ZLGwuZ2V0QXR0cmlidXRlKFwieVwiKXx8MCkrXCIpXCIpOyhuKHEpfHxuKGIpKSYmYS5wdXNoKFwic2NhbGUoXCIrRChxLDEpK1wiIFwiK0QoYiwxKStcIilcIik7YS5sZW5ndGgmJmwuc2V0QXR0cmlidXRlKFwidHJhbnNmb3JtXCIsYS5qb2luKFwiIFwiKSl9LHRvRnJvbnQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmVsZW1lbnQ7YS5wYXJlbnROb2RlLmFwcGVuZENoaWxkKGEpO3JldHVybiB0aGlzfSxhbGlnbjpmdW5jdGlvbihhLGQscSl7dmFyIGssXG5lLGwsYyx0PXt9O2U9dGhpcy5yZW5kZXJlcjtsPWUuYWxpZ25lZE9iamVjdHM7dmFyIHUsSjtpZihhKXtpZih0aGlzLmFsaWduT3B0aW9ucz1hLHRoaXMuYWxpZ25CeVRyYW5zbGF0ZT1kLCFxfHxCKHEpKXRoaXMuYWxpZ25Ubz1rPXF8fFwicmVuZGVyZXJcIixiKGwsdGhpcyksbC5wdXNoKHRoaXMpLHE9bnVsbH1lbHNlIGE9dGhpcy5hbGlnbk9wdGlvbnMsZD10aGlzLmFsaWduQnlUcmFuc2xhdGUsaz10aGlzLmFsaWduVG87cT1EKHEsZVtrXSxlKTtrPWEuYWxpZ247ZT1hLnZlcnRpY2FsQWxpZ247bD0ocS54fHwwKSsoYS54fHwwKTtjPShxLnl8fDApKyhhLnl8fDApO1wicmlnaHRcIj09PWs/dT0xOlwiY2VudGVyXCI9PT1rJiYodT0yKTt1JiYobCs9KHEud2lkdGgtKGEud2lkdGh8fDApKS91KTt0W2Q/XCJ0cmFuc2xhdGVYXCI6XCJ4XCJdPU1hdGgucm91bmQobCk7XCJib3R0b21cIj09PWU/Sj0xOlwibWlkZGxlXCI9PT1lJiYoSj0yKTtKJiYoYys9KHEuaGVpZ2h0LShhLmhlaWdodHx8MCkpL0opO3RbZD9cblwidHJhbnNsYXRlWVwiOlwieVwiXT1NYXRoLnJvdW5kKGMpO3RoaXNbdGhpcy5wbGFjZWQ/XCJhbmltYXRlXCI6XCJhdHRyXCJdKHQpO3RoaXMucGxhY2VkPSEwO3RoaXMuYWxpZ25BdHRyPXQ7cmV0dXJuIHRoaXN9LGdldEJCb3g6ZnVuY3Rpb24oYSxkKXt2YXIgcSxiPXRoaXMucmVuZGVyZXIsayxsPXRoaXMuZWxlbWVudCxjPXRoaXMuc3R5bGVzLHQsdT10aGlzLnRleHRTdHIsSixwPWIuY2FjaGUsSz1iLmNhY2hlS2V5cyxoPWwubmFtZXNwYWNlVVJJPT09dGhpcy5TVkdfTlMscjtkPUQoZCx0aGlzLnJvdGF0aW9uKTtrPWQqZjt0PWIuc3R5bGVkTW9kZT9sJiZDLnByb3RvdHlwZS5nZXRTdHlsZS5jYWxsKGwsXCJmb250LXNpemVcIik6YyYmYy5mb250U2l6ZTtuKHUpJiYocj11LnRvU3RyaW5nKCksLTE9PT1yLmluZGV4T2YoXCJcXHgzY1wiKSYmKHI9ci5yZXBsYWNlKC9bMC05XS9nLFwiMFwiKSkscis9W1wiXCIsZHx8MCx0LHRoaXMudGV4dFdpZHRoLGMmJmMudGV4dE92ZXJmbG93XS5qb2luKCkpO3ImJiFhJiZcbihxPXBbcl0pO2lmKCFxKXtpZihofHxiLmZvckV4cG9ydCl7dHJ5eyhKPXRoaXMuZmFrZVRTJiZmdW5jdGlvbihhKXtbXS5mb3JFYWNoLmNhbGwobC5xdWVyeVNlbGVjdG9yQWxsKFwiLmhpZ2hjaGFydHMtdGV4dC1vdXRsaW5lXCIpLGZ1bmN0aW9uKGQpe2Quc3R5bGUuZGlzcGxheT1hfSl9KSYmSihcIm5vbmVcIikscT1sLmdldEJCb3g/ZSh7fSxsLmdldEJCb3goKSk6e3dpZHRoOmwub2Zmc2V0V2lkdGgsaGVpZ2h0Omwub2Zmc2V0SGVpZ2h0fSxKJiZKKFwiXCIpfWNhdGNoKFope1wiXCJ9aWYoIXF8fDA+cS53aWR0aClxPXt3aWR0aDowLGhlaWdodDowfX1lbHNlIHE9dGhpcy5odG1sR2V0QkJveCgpO2IuaXNTVkcmJihhPXEud2lkdGgsYj1xLmhlaWdodCxoJiYocS5oZWlnaHQ9Yj17XCIxMXB4LDE3XCI6MTQsXCIxM3B4LDIwXCI6MTZ9W2MmJmMuZm9udFNpemUrXCIsXCIrTWF0aC5yb3VuZChiKV18fGIpLGQmJihxLndpZHRoPU1hdGguYWJzKGIqTWF0aC5zaW4oaykpK01hdGguYWJzKGEqTWF0aC5jb3MoaykpLFxucS5oZWlnaHQ9TWF0aC5hYnMoYipNYXRoLmNvcyhrKSkrTWF0aC5hYnMoYSpNYXRoLnNpbihrKSkpKTtpZihyJiYwPHEuaGVpZ2h0KXtmb3IoOzI1MDxLLmxlbmd0aDspZGVsZXRlIHBbSy5zaGlmdCgpXTtwW3JdfHxLLnB1c2gocik7cFtyXT1xfX1yZXR1cm4gcX0sc2hvdzpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5hdHRyKHt2aXNpYmlsaXR5OmE/XCJpbmhlcml0XCI6XCJ2aXNpYmxlXCJ9KX0saGlkZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmF0dHIoe3Zpc2liaWxpdHk6XCJoaWRkZW5cIn0pfSxmYWRlT3V0OmZ1bmN0aW9uKGEpe3ZhciBkPXRoaXM7ZC5hbmltYXRlKHtvcGFjaXR5OjB9LHtkdXJhdGlvbjphfHwxNTAsY29tcGxldGU6ZnVuY3Rpb24oKXtkLmF0dHIoe3k6LTk5OTl9KX19KX0sYWRkOmZ1bmN0aW9uKGEpe3ZhciBkPXRoaXMucmVuZGVyZXIscT10aGlzLmVsZW1lbnQsYjthJiYodGhpcy5wYXJlbnRHcm91cD1hKTt0aGlzLnBhcmVudEludmVydGVkPWEmJmEuaW52ZXJ0ZWQ7XG52b2lkIDAhPT10aGlzLnRleHRTdHImJmQuYnVpbGRUZXh0KHRoaXMpO3RoaXMuYWRkZWQ9ITA7aWYoIWF8fGEuaGFuZGxlWnx8dGhpcy56SW5kZXgpYj10aGlzLnpJbmRleFNldHRlcigpO2J8fChhP2EuZWxlbWVudDpkLmJveCkuYXBwZW5kQ2hpbGQocSk7aWYodGhpcy5vbkFkZCl0aGlzLm9uQWRkKCk7cmV0dXJuIHRoaXN9LHNhZmVSZW1vdmVDaGlsZDpmdW5jdGlvbihhKXt2YXIgZD1hLnBhcmVudE5vZGU7ZCYmZC5yZW1vdmVDaGlsZChhKX0sZGVzdHJveTpmdW5jdGlvbigpe3ZhciBhPXRoaXMsZD1hLmVsZW1lbnR8fHt9LHE9YS5yZW5kZXJlcixrPXEuaXNTVkcmJlwiU1BBTlwiPT09ZC5ub2RlTmFtZSYmYS5wYXJlbnRHcm91cCxlPWQub3duZXJTVkdFbGVtZW50LGw9YS5jbGlwUGF0aDtkLm9uY2xpY2s9ZC5vbm1vdXNlb3V0PWQub25tb3VzZW92ZXI9ZC5vbm1vdXNlbW92ZT1kLnBvaW50PW51bGw7TihhKTtsJiZlJiYoW10uZm9yRWFjaC5jYWxsKGUucXVlcnlTZWxlY3RvckFsbChcIltjbGlwLXBhdGhdLFtDTElQLVBBVEhdXCIpLFxuZnVuY3Rpb24oYSl7LTE8YS5nZXRBdHRyaWJ1dGUoXCJjbGlwLXBhdGhcIikuaW5kZXhPZihsLmVsZW1lbnQuaWQpJiZhLnJlbW92ZUF0dHJpYnV0ZShcImNsaXAtcGF0aFwiKX0pLGEuY2xpcFBhdGg9bC5kZXN0cm95KCkpO2lmKGEuc3RvcHMpe2ZvcihlPTA7ZTxhLnN0b3BzLmxlbmd0aDtlKyspYS5zdG9wc1tlXT1hLnN0b3BzW2VdLmRlc3Ryb3koKTthLnN0b3BzPW51bGx9YS5zYWZlUmVtb3ZlQ2hpbGQoZCk7Zm9yKHEuc3R5bGVkTW9kZXx8YS5kZXN0cm95U2hhZG93cygpO2smJmsuZGl2JiYwPT09ay5kaXYuY2hpbGROb2Rlcy5sZW5ndGg7KWQ9ay5wYXJlbnRHcm91cCxhLnNhZmVSZW1vdmVDaGlsZChrLmRpdiksZGVsZXRlIGsuZGl2LGs9ZDthLmFsaWduVG8mJmIocS5hbGlnbmVkT2JqZWN0cyxhKTt1KGEsZnVuY3Rpb24oZCxxKXtkZWxldGUgYVtxXX0pfSxzaGFkb3c6ZnVuY3Rpb24oYSxkLHEpe3ZhciBiPVtdLGssZSxsPXRoaXMuZWxlbWVudCxjLHQsdSxwO2lmKCFhKXRoaXMuZGVzdHJveVNoYWRvd3MoKTtcbmVsc2UgaWYoIXRoaXMuc2hhZG93cyl7dD1EKGEud2lkdGgsMyk7dT0oYS5vcGFjaXR5fHwuMTUpL3Q7cD10aGlzLnBhcmVudEludmVydGVkP1wiKC0xLC0xKVwiOlwiKFwiK0QoYS5vZmZzZXRYLDEpK1wiLCBcIitEKGEub2Zmc2V0WSwxKStcIilcIjtmb3Ioaz0xO2s8PXQ7aysrKWU9bC5jbG9uZU5vZGUoMCksYz0yKnQrMS0yKmssZyhlLHtzdHJva2U6YS5jb2xvcnx8XCIjMDAwMDAwXCIsXCJzdHJva2Utb3BhY2l0eVwiOnUqayxcInN0cm9rZS13aWR0aFwiOmMsdHJhbnNmb3JtOlwidHJhbnNsYXRlXCIrcCxmaWxsOlwibm9uZVwifSksZS5zZXRBdHRyaWJ1dGUoXCJjbGFzc1wiLChlLmdldEF0dHJpYnV0ZShcImNsYXNzXCIpfHxcIlwiKStcIiBoaWdoY2hhcnRzLXNoYWRvd1wiKSxxJiYoZyhlLFwiaGVpZ2h0XCIsTWF0aC5tYXgoZyhlLFwiaGVpZ2h0XCIpLWMsMCkpLGUuY3V0SGVpZ2h0PWMpLGQ/ZC5lbGVtZW50LmFwcGVuZENoaWxkKGUpOmwucGFyZW50Tm9kZSYmbC5wYXJlbnROb2RlLmluc2VydEJlZm9yZShlLGwpLGIucHVzaChlKTtcbnRoaXMuc2hhZG93cz1ifXJldHVybiB0aGlzfSxkZXN0cm95U2hhZG93czpmdW5jdGlvbigpeyh0aGlzLnNoYWRvd3N8fFtdKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe3RoaXMuc2FmZVJlbW92ZUNoaWxkKGEpfSx0aGlzKTt0aGlzLnNoYWRvd3M9dm9pZCAwfSx4R2V0dGVyOmZ1bmN0aW9uKGEpe1wiY2lyY2xlXCI9PT10aGlzLmVsZW1lbnQubm9kZU5hbWUmJihcInhcIj09PWE/YT1cImN4XCI6XCJ5XCI9PT1hJiYoYT1cImN5XCIpKTtyZXR1cm4gdGhpcy5fZGVmYXVsdEdldHRlcihhKX0sX2RlZmF1bHRHZXR0ZXI6ZnVuY3Rpb24oYSl7YT1EKHRoaXNbYStcIlZhbHVlXCJdLHRoaXNbYV0sdGhpcy5lbGVtZW50P3RoaXMuZWxlbWVudC5nZXRBdHRyaWJ1dGUoYSk6bnVsbCwwKTsvXltcXC0wLTlcXC5dKyQvLnRlc3QoYSkmJihhPXBhcnNlRmxvYXQoYSkpO3JldHVybiBhfSxkU2V0dGVyOmZ1bmN0aW9uKGEsZCxxKXthJiZhLmpvaW4mJihhPWEuam9pbihcIiBcIikpOy8oTmFOfCB7Mn18XiQpLy50ZXN0KGEpJiYoYT1cblwiTSAwIDBcIik7dGhpc1tkXSE9PWEmJihxLnNldEF0dHJpYnV0ZShkLGEpLHRoaXNbZF09YSl9LGRhc2hzdHlsZVNldHRlcjpmdW5jdGlvbihhKXt2YXIgZCxxPXRoaXNbXCJzdHJva2Utd2lkdGhcIl07XCJpbmhlcml0XCI9PT1xJiYocT0xKTtpZihhPWEmJmEudG9Mb3dlckNhc2UoKSl7YT1hLnJlcGxhY2UoXCJzaG9ydGRhc2hkb3Rkb3RcIixcIjMsMSwxLDEsMSwxLFwiKS5yZXBsYWNlKFwic2hvcnRkYXNoZG90XCIsXCIzLDEsMSwxXCIpLnJlcGxhY2UoXCJzaG9ydGRvdFwiLFwiMSwxLFwiKS5yZXBsYWNlKFwic2hvcnRkYXNoXCIsXCIzLDEsXCIpLnJlcGxhY2UoXCJsb25nZGFzaFwiLFwiOCwzLFwiKS5yZXBsYWNlKC9kb3QvZyxcIjEsMyxcIikucmVwbGFjZShcImRhc2hcIixcIjQsMyxcIikucmVwbGFjZSgvLCQvLFwiXCIpLnNwbGl0KFwiLFwiKTtmb3IoZD1hLmxlbmd0aDtkLS07KWFbZF09RyhhW2RdKSpxO2E9YS5qb2luKFwiLFwiKS5yZXBsYWNlKC9OYU4vZyxcIm5vbmVcIik7dGhpcy5lbGVtZW50LnNldEF0dHJpYnV0ZShcInN0cm9rZS1kYXNoYXJyYXlcIixcbmEpfX0sYWxpZ25TZXR0ZXI6ZnVuY3Rpb24oYSl7dmFyIGQ9e2xlZnQ6XCJzdGFydFwiLGNlbnRlcjpcIm1pZGRsZVwiLHJpZ2h0OlwiZW5kXCJ9O2RbYV0mJih0aGlzLmFsaWduVmFsdWU9YSx0aGlzLmVsZW1lbnQuc2V0QXR0cmlidXRlKFwidGV4dC1hbmNob3JcIixkW2FdKSl9LG9wYWNpdHlTZXR0ZXI6ZnVuY3Rpb24oYSxkLHEpe3RoaXNbZF09YTtxLnNldEF0dHJpYnV0ZShkLGEpfSx0aXRsZVNldHRlcjpmdW5jdGlvbihhKXt2YXIgZD10aGlzLmVsZW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJ0aXRsZVwiKVswXTtkfHwoZD1yLmNyZWF0ZUVsZW1lbnROUyh0aGlzLlNWR19OUyxcInRpdGxlXCIpLHRoaXMuZWxlbWVudC5hcHBlbmRDaGlsZChkKSk7ZC5maXJzdENoaWxkJiZkLnJlbW92ZUNoaWxkKGQuZmlyc3RDaGlsZCk7ZC5hcHBlbmRDaGlsZChyLmNyZWF0ZVRleHROb2RlKFN0cmluZyhEKGEsXCJcIikpLnJlcGxhY2UoLzxbXj5dKj4vZyxcIlwiKS5yZXBsYWNlKC8mbHQ7L2csXCJcXHgzY1wiKS5yZXBsYWNlKC8mZ3Q7L2csXG5cIlxceDNlXCIpKSl9LHRleHRTZXR0ZXI6ZnVuY3Rpb24oYSl7YSE9PXRoaXMudGV4dFN0ciYmKGRlbGV0ZSB0aGlzLmJCb3gsZGVsZXRlIHRoaXMudGV4dFB4TGVuZ3RoLHRoaXMudGV4dFN0cj1hLHRoaXMuYWRkZWQmJnRoaXMucmVuZGVyZXIuYnVpbGRUZXh0KHRoaXMpKX0sc2V0VGV4dFBhdGg6ZnVuY3Rpb24ocSxiKXt2YXIgZT10aGlzLmVsZW1lbnQsbD17dGV4dEFuY2hvcjpcInRleHQtYW5jaG9yXCJ9LGMsdD0hMSx1LHA9dGhpcy50ZXh0UGF0aFdyYXBwZXIsSz0hcDtiPWQoITAse2VuYWJsZWQ6ITAsYXR0cmlidXRlczp7ZHk6LTUsc3RhcnRPZmZzZXQ6XCI1MCVcIix0ZXh0QW5jaG9yOlwibWlkZGxlXCJ9fSxiKTtjPWIuYXR0cmlidXRlcztpZihxJiZiJiZiLmVuYWJsZWQpe3RoaXMub3B0aW9ucyYmdGhpcy5vcHRpb25zLnBhZGRpbmcmJihjLmR4PS10aGlzLm9wdGlvbnMucGFkZGluZyk7cHx8KHRoaXMudGV4dFBhdGhXcmFwcGVyPXA9dGhpcy5yZW5kZXJlci5jcmVhdGVFbGVtZW50KFwidGV4dFBhdGhcIiksXG50PSEwKTt1PXAuZWxlbWVudDsoYj1xLmVsZW1lbnQuZ2V0QXR0cmlidXRlKFwiaWRcIikpfHxxLmVsZW1lbnQuc2V0QXR0cmlidXRlKFwiaWRcIixiPWEudW5pcXVlS2V5KCkpO2lmKEspZm9yKHE9ZS5nZXRFbGVtZW50c0J5VGFnTmFtZShcInRzcGFuXCIpO3EubGVuZ3RoOylxWzBdLnNldEF0dHJpYnV0ZShcInlcIiwwKSx1LmFwcGVuZENoaWxkKHFbMF0pO3QmJnAuYWRkKHtlbGVtZW50OnRoaXMudGV4dD90aGlzLnRleHQuZWxlbWVudDplfSk7dS5zZXRBdHRyaWJ1dGVOUyhcImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIixcImhyZWZcIix0aGlzLnJlbmRlcmVyLnVybCtcIiNcIitiKTtuKGMuZHkpJiYodS5wYXJlbnROb2RlLnNldEF0dHJpYnV0ZShcImR5XCIsYy5keSksZGVsZXRlIGMuZHkpO24oYy5keCkmJih1LnBhcmVudE5vZGUuc2V0QXR0cmlidXRlKFwiZHhcIixjLmR4KSxkZWxldGUgYy5keCk7YS5vYmplY3RFYWNoKGMsZnVuY3Rpb24oYSxkKXt1LnNldEF0dHJpYnV0ZShsW2RdfHxkLGEpfSk7XG5lLnJlbW92ZUF0dHJpYnV0ZShcInRyYW5zZm9ybVwiKTt0aGlzLnJlbW92ZVRleHRPdXRsaW5lLmNhbGwocCxbXS5zbGljZS5jYWxsKGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJ0c3BhblwiKSkpO3RoaXMudGV4dCYmIXRoaXMucmVuZGVyZXIuc3R5bGVkTW9kZSYmdGhpcy5hdHRyKHtmaWxsOlwibm9uZVwiLFwic3Ryb2tlLXdpZHRoXCI6MH0pO3RoaXMuYXBwbHlUZXh0T3V0bGluZT10aGlzLnVwZGF0ZVRyYW5zZm9ybT1rfWVsc2UgcCYmKGRlbGV0ZSB0aGlzLnVwZGF0ZVRyYW5zZm9ybSxkZWxldGUgdGhpcy5hcHBseVRleHRPdXRsaW5lLHRoaXMuZGVzdHJveVRleHRQYXRoKGUscSkpO3JldHVybiB0aGlzfSxkZXN0cm95VGV4dFBhdGg6ZnVuY3Rpb24oYSxkKXt2YXIgcTtkLmVsZW1lbnQuc2V0QXR0cmlidXRlKFwiaWRcIixcIlwiKTtmb3IocT10aGlzLnRleHRQYXRoV3JhcHBlci5lbGVtZW50LmNoaWxkTm9kZXM7cS5sZW5ndGg7KWEuZmlyc3RDaGlsZC5hcHBlbmRDaGlsZChxWzBdKTthLmZpcnN0Q2hpbGQucmVtb3ZlQ2hpbGQodGhpcy50ZXh0UGF0aFdyYXBwZXIuZWxlbWVudCk7XG5kZWxldGUgZC50ZXh0UGF0aFdyYXBwZXJ9LGZpbGxTZXR0ZXI6ZnVuY3Rpb24oYSxkLHEpe1wic3RyaW5nXCI9PT10eXBlb2YgYT9xLnNldEF0dHJpYnV0ZShkLGEpOmEmJnRoaXMuY29tcGxleENvbG9yKGEsZCxxKX0sdmlzaWJpbGl0eVNldHRlcjpmdW5jdGlvbihhLGQscSl7XCJpbmhlcml0XCI9PT1hP3EucmVtb3ZlQXR0cmlidXRlKGQpOnRoaXNbZF0hPT1hJiZxLnNldEF0dHJpYnV0ZShkLGEpO3RoaXNbZF09YX0sekluZGV4U2V0dGVyOmZ1bmN0aW9uKGEsZCl7dmFyIHE9dGhpcy5yZW5kZXJlcixiPXRoaXMucGFyZW50R3JvdXAsaz0oYnx8cSkuZWxlbWVudHx8cS5ib3gsZSxsPXRoaXMuZWxlbWVudCxjPSExLHQscT1rPT09cS5ib3g7ZT10aGlzLmFkZGVkO3ZhciB1O24oYSk/KGwuc2V0QXR0cmlidXRlKFwiZGF0YS16LWluZGV4XCIsYSksYT0rYSx0aGlzW2RdPT09YSYmKGU9ITEpKTpuKHRoaXNbZF0pJiZsLnJlbW92ZUF0dHJpYnV0ZShcImRhdGEtei1pbmRleFwiKTt0aGlzW2RdPWE7aWYoZSl7KGE9XG50aGlzLnpJbmRleCkmJmImJihiLmhhbmRsZVo9ITApO2Q9ay5jaGlsZE5vZGVzO2Zvcih1PWQubGVuZ3RoLTE7MDw9dSYmIWM7dS0tKWlmKGI9ZFt1XSxlPWIuZ2V0QXR0cmlidXRlKFwiZGF0YS16LWluZGV4XCIpLHQ9IW4oZSksYiE9PWwpaWYoMD5hJiZ0JiYhcSYmIXUpay5pbnNlcnRCZWZvcmUobCxkW3VdKSxjPSEwO2Vsc2UgaWYoRyhlKTw9YXx8dCYmKCFuKGEpfHwwPD1hKSlrLmluc2VydEJlZm9yZShsLGRbdSsxXXx8bnVsbCksYz0hMDtjfHwoay5pbnNlcnRCZWZvcmUobCxkW3E/MzowXXx8bnVsbCksYz0hMCl9cmV0dXJuIGN9LF9kZWZhdWx0U2V0dGVyOmZ1bmN0aW9uKGEsZCxxKXtxLnNldEF0dHJpYnV0ZShkLGEpfX0pO0MucHJvdG90eXBlLnlHZXR0ZXI9Qy5wcm90b3R5cGUueEdldHRlcjtDLnByb3RvdHlwZS50cmFuc2xhdGVYU2V0dGVyPUMucHJvdG90eXBlLnRyYW5zbGF0ZVlTZXR0ZXI9Qy5wcm90b3R5cGUucm90YXRpb25TZXR0ZXI9Qy5wcm90b3R5cGUudmVydGljYWxBbGlnblNldHRlcj1cbkMucHJvdG90eXBlLnJvdGF0aW9uT3JpZ2luWFNldHRlcj1DLnByb3RvdHlwZS5yb3RhdGlvbk9yaWdpbllTZXR0ZXI9Qy5wcm90b3R5cGUuc2NhbGVYU2V0dGVyPUMucHJvdG90eXBlLnNjYWxlWVNldHRlcj1DLnByb3RvdHlwZS5tYXRyaXhTZXR0ZXI9ZnVuY3Rpb24oYSxkKXt0aGlzW2RdPWE7dGhpcy5kb1RyYW5zZm9ybT0hMH07Qy5wcm90b3R5cGVbXCJzdHJva2Utd2lkdGhTZXR0ZXJcIl09Qy5wcm90b3R5cGUuc3Ryb2tlU2V0dGVyPWZ1bmN0aW9uKGEsZCxxKXt0aGlzW2RdPWE7dGhpcy5zdHJva2UmJnRoaXNbXCJzdHJva2Utd2lkdGhcIl0/KEMucHJvdG90eXBlLmZpbGxTZXR0ZXIuY2FsbCh0aGlzLHRoaXMuc3Ryb2tlLFwic3Ryb2tlXCIscSkscS5zZXRBdHRyaWJ1dGUoXCJzdHJva2Utd2lkdGhcIix0aGlzW1wic3Ryb2tlLXdpZHRoXCJdKSx0aGlzLmhhc1N0cm9rZT0hMCk6XCJzdHJva2Utd2lkdGhcIj09PWQmJjA9PT1hJiZ0aGlzLmhhc1N0cm9rZSYmKHEucmVtb3ZlQXR0cmlidXRlKFwic3Ryb2tlXCIpLFxudGhpcy5oYXNTdHJva2U9ITEpfTtBPWEuU1ZHUmVuZGVyZXI9ZnVuY3Rpb24oKXt0aGlzLmluaXQuYXBwbHkodGhpcyxhcmd1bWVudHMpfTtlKEEucHJvdG90eXBlLHtFbGVtZW50OkMsU1ZHX05TOkwsaW5pdDpmdW5jdGlvbihhLGQscSxiLGssZSxsKXt2YXIgYztjPXRoaXMuY3JlYXRlRWxlbWVudChcInN2Z1wiKS5hdHRyKHt2ZXJzaW9uOlwiMS4xXCIsXCJjbGFzc1wiOlwiaGlnaGNoYXJ0cy1yb290XCJ9KTtsfHxjLmNzcyh0aGlzLmdldFN0eWxlKGIpKTtiPWMuZWxlbWVudDthLmFwcGVuZENoaWxkKGIpO2coYSxcImRpclwiLFwibHRyXCIpOy0xPT09YS5pbm5lckhUTUwuaW5kZXhPZihcInhtbG5zXCIpJiZnKGIsXCJ4bWxuc1wiLHRoaXMuU1ZHX05TKTt0aGlzLmlzU1ZHPSEwO3RoaXMuYm94PWI7dGhpcy5ib3hXcmFwcGVyPWM7dGhpcy5hbGlnbmVkT2JqZWN0cz1bXTt0aGlzLnVybD0odHx8cCkmJnIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJiYXNlXCIpLmxlbmd0aD9NLmxvY2F0aW9uLmhyZWYuc3BsaXQoXCIjXCIpWzBdLnJlcGxhY2UoLzxbXj5dKj4vZyxcblwiXCIpLnJlcGxhY2UoLyhbXFwoJ1xcKV0pL2csXCJcXFxcJDFcIikucmVwbGFjZSgvIC9nLFwiJTIwXCIpOlwiXCI7dGhpcy5jcmVhdGVFbGVtZW50KFwiZGVzY1wiKS5hZGQoKS5lbGVtZW50LmFwcGVuZENoaWxkKHIuY3JlYXRlVGV4dE5vZGUoXCJDcmVhdGVkIHdpdGggSGlnaGNoYXJ0cyA3LjEuMlwiKSk7dGhpcy5kZWZzPXRoaXMuY3JlYXRlRWxlbWVudChcImRlZnNcIikuYWRkKCk7dGhpcy5hbGxvd0hUTUw9ZTt0aGlzLmZvckV4cG9ydD1rO3RoaXMuc3R5bGVkTW9kZT1sO3RoaXMuZ3JhZGllbnRzPXt9O3RoaXMuY2FjaGU9e307dGhpcy5jYWNoZUtleXM9W107dGhpcy5pbWdDb3VudD0wO3RoaXMuc2V0U2l6ZShkLHEsITEpO3ZhciB1O3QmJmEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoZD1mdW5jdGlvbigpe3koYSx7bGVmdDowLHRvcDowfSk7dT1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO3koYSx7bGVmdDpNYXRoLmNlaWwodS5sZWZ0KS11LmxlZnQrXCJweFwiLHRvcDpNYXRoLmNlaWwodS50b3ApLXUudG9wK1xuXCJweFwifSl9LGQoKSx0aGlzLnVuU3ViUGl4ZWxGaXg9RShNLFwicmVzaXplXCIsZCkpfSxkZWZpbml0aW9uOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGQoYSxiKXt2YXIgaztLKGEpLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGU9cS5jcmVhdGVFbGVtZW50KGEudGFnTmFtZSksYz17fTt1KGEsZnVuY3Rpb24oYSxkKXtcInRhZ05hbWVcIiE9PWQmJlwiY2hpbGRyZW5cIiE9PWQmJlwidGV4dENvbnRlbnRcIiE9PWQmJihjW2RdPWEpfSk7ZS5hdHRyKGMpO2UuYWRkKGJ8fHEuZGVmcyk7YS50ZXh0Q29udGVudCYmZS5lbGVtZW50LmFwcGVuZENoaWxkKHIuY3JlYXRlVGV4dE5vZGUoYS50ZXh0Q29udGVudCkpO2QoYS5jaGlsZHJlbnx8W10sZSk7az1lfSk7cmV0dXJuIGt9dmFyIHE9dGhpcztyZXR1cm4gZChhKX0sZ2V0U3R5bGU6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuc3R5bGU9ZSh7Zm9udEZhbWlseTonXCJMdWNpZGEgR3JhbmRlXCIsIFwiTHVjaWRhIFNhbnMgVW5pY29kZVwiLCBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmJyxcbmZvbnRTaXplOlwiMTJweFwifSxhKX0sc2V0U3R5bGU6ZnVuY3Rpb24oYSl7dGhpcy5ib3hXcmFwcGVyLmNzcyh0aGlzLmdldFN0eWxlKGEpKX0saXNIaWRkZW46ZnVuY3Rpb24oKXtyZXR1cm4hdGhpcy5ib3hXcmFwcGVyLmdldEJCb3goKS53aWR0aH0sZGVzdHJveTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZGVmczt0aGlzLmJveD1udWxsO3RoaXMuYm94V3JhcHBlcj10aGlzLmJveFdyYXBwZXIuZGVzdHJveSgpO2godGhpcy5ncmFkaWVudHN8fHt9KTt0aGlzLmdyYWRpZW50cz1udWxsO2EmJih0aGlzLmRlZnM9YS5kZXN0cm95KCkpO3RoaXMudW5TdWJQaXhlbEZpeCYmdGhpcy51blN1YlBpeGVsRml4KCk7cmV0dXJuIHRoaXMuYWxpZ25lZE9iamVjdHM9bnVsbH0sY3JlYXRlRWxlbWVudDpmdW5jdGlvbihhKXt2YXIgZD1uZXcgdGhpcy5FbGVtZW50O2QuaW5pdCh0aGlzLGEpO3JldHVybiBkfSxkcmF3OmssZ2V0UmFkaWFsQXR0cjpmdW5jdGlvbihhLGQpe3JldHVybntjeDphWzBdLWFbMl0vXG4yK2QuY3gqYVsyXSxjeTphWzFdLWFbMl0vMitkLmN5KmFbMl0scjpkLnIqYVsyXX19LHRydW5jYXRlOmZ1bmN0aW9uKGEsZCxxLGIsayxlLGMpe3ZhciBsPXRoaXMsdT1hLnJvdGF0aW9uLHQscD1iPzE6MCxLPShxfHxiKS5sZW5ndGgsaD1LLGY9W10sRD1mdW5jdGlvbihhKXtkLmZpcnN0Q2hpbGQmJmQucmVtb3ZlQ2hpbGQoZC5maXJzdENoaWxkKTthJiZkLmFwcGVuZENoaWxkKHIuY3JlYXRlVGV4dE5vZGUoYSkpfSx3PWZ1bmN0aW9uKGUsdSl7dT11fHxlO2lmKHZvaWQgMD09PWZbdV0paWYoZC5nZXRTdWJTdHJpbmdMZW5ndGgpdHJ5e2ZbdV09aytkLmdldFN1YlN0cmluZ0xlbmd0aCgwLGI/dSsxOnUpfWNhdGNoKGVhKXtcIlwifWVsc2UgbC5nZXRTcGFuV2lkdGgmJihEKGMocXx8YixlKSksZlt1XT1rK2wuZ2V0U3BhbldpZHRoKGEsZCkpO3JldHVybiBmW3VdfSxuLEw7YS5yb3RhdGlvbj0wO249dyhkLnRleHRDb250ZW50Lmxlbmd0aCk7aWYoTD1rK24+ZSl7Zm9yKDtwPD1LOyloPVxuTWF0aC5jZWlsKChwK0spLzIpLGImJih0PWMoYixoKSksbj13KGgsdCYmdC5sZW5ndGgtMSkscD09PUs/cD1LKzE6bj5lP0s9aC0xOnA9aDswPT09Sz9EKFwiXCIpOnEmJks9PT1xLmxlbmd0aC0xfHxEKHR8fGMocXx8YixoKSl9YiYmYi5zcGxpY2UoMCxoKTthLmFjdHVhbFdpZHRoPW47YS5yb3RhdGlvbj11O3JldHVybiBMfSxlc2NhcGVzOntcIlxceDI2XCI6XCJcXHgyNmFtcDtcIixcIlxceDNjXCI6XCJcXHgyNmx0O1wiLFwiXFx4M2VcIjpcIlxceDI2Z3Q7XCIsXCInXCI6XCJcXHgyNiMzOTtcIiwnXCInOlwiXFx4MjZxdW90O1wifSxidWlsZFRleHQ6ZnVuY3Rpb24oYSl7dmFyIGQ9YS5lbGVtZW50LHE9dGhpcyxiPXEuZm9yRXhwb3J0LGs9RChhLnRleHRTdHIsXCJcIikudG9TdHJpbmcoKSxlPS0xIT09ay5pbmRleE9mKFwiXFx4M2NcIiksYz1kLmNoaWxkTm9kZXMsbCx0PWcoZCxcInhcIikscD1hLnN0eWxlcyxLPWEudGV4dFdpZHRoLGg9cCYmcC5saW5lSGVpZ2h0LGY9cCYmcC50ZXh0T3V0bGluZSx3PXAmJlwiZWxsaXBzaXNcIj09PXAudGV4dE92ZXJmbG93LFxubj1wJiZcIm5vd3JhcFwiPT09cC53aGl0ZVNwYWNlLEo9cCYmcC5mb250U2l6ZSxGLE4sUj1jLmxlbmd0aCxwPUsmJiFhLmFkZGVkJiZ0aGlzLmJveCxCPWZ1bmN0aW9uKGEpe3ZhciBiO3Euc3R5bGVkTW9kZXx8KGI9LyhweHxlbSkkLy50ZXN0KGEmJmEuc3R5bGUuZm9udFNpemUpP2Euc3R5bGUuZm9udFNpemU6Snx8cS5zdHlsZS5mb250U2l6ZXx8MTIpO3JldHVybiBoP0coaCk6cS5mb250TWV0cmljcyhiLGEuZ2V0QXR0cmlidXRlKFwic3R5bGVcIik/YTpkKS5ofSxtPWZ1bmN0aW9uKGEsZCl7dShxLmVzY2FwZXMsZnVuY3Rpb24ocSxiKXtkJiYtMSE9PWQuaW5kZXhPZihxKXx8KGE9YS50b1N0cmluZygpLnJlcGxhY2UobmV3IFJlZ0V4cChxLFwiZ1wiKSxiKSl9KTtyZXR1cm4gYX0sTT1mdW5jdGlvbihhLGQpe3ZhciBxO3E9YS5pbmRleE9mKFwiXFx4M2NcIik7YT1hLnN1YnN0cmluZyhxLGEuaW5kZXhPZihcIlxceDNlXCIpLXEpO3E9YS5pbmRleE9mKGQrXCJcXHgzZFwiKTtpZigtMSE9PXEmJihxPXErXG5kLmxlbmd0aCsxLGQ9YS5jaGFyQXQocSksJ1wiJz09PWR8fFwiJ1wiPT09ZCkpcmV0dXJuIGE9YS5zdWJzdHJpbmcocSsxKSxhLnN1YnN0cmluZygwLGEuaW5kZXhPZihkKSl9O0Y9W2ssdyxuLGgsZixKLEtdLmpvaW4oKTtpZihGIT09YS50ZXh0Q2FjaGUpe2ZvcihhLnRleHRDYWNoZT1GO1ItLTspZC5yZW1vdmVDaGlsZChjW1JdKTtlfHxmfHx3fHxLfHwtMSE9PWsuaW5kZXhPZihcIiBcIik/KHAmJnAuYXBwZW5kQ2hpbGQoZCksZT8oaz1xLnN0eWxlZE1vZGU/ay5yZXBsYWNlKC88KGJ8c3Ryb25nKT4vZywnXFx4M2NzcGFuIGNsYXNzXFx4M2RcImhpZ2hjaGFydHMtc3Ryb25nXCJcXHgzZScpLnJlcGxhY2UoLzwoaXxlbSk+L2csJ1xceDNjc3BhbiBjbGFzc1xceDNkXCJoaWdoY2hhcnRzLWVtcGhhc2l6ZWRcIlxceDNlJyk6ay5yZXBsYWNlKC88KGJ8c3Ryb25nKT4vZywnXFx4M2NzcGFuIHN0eWxlXFx4M2RcImZvbnQtd2VpZ2h0OmJvbGRcIlxceDNlJykucmVwbGFjZSgvPChpfGVtKT4vZywnXFx4M2NzcGFuIHN0eWxlXFx4M2RcImZvbnQtc3R5bGU6aXRhbGljXCJcXHgzZScpLFxuaz1rLnJlcGxhY2UoLzxhL2csXCJcXHgzY3NwYW5cIikucmVwbGFjZSgvPFxcLyhifHN0cm9uZ3xpfGVtfGEpPi9nLFwiXFx4M2Mvc3BhblxceDNlXCIpLnNwbGl0KC88YnIuKj8+L2cpKTprPVtrXSxrPWsuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVyblwiXCIhPT1hfSksay5mb3JFYWNoKGZ1bmN0aW9uKGssZSl7dmFyIGMsdT0wLHA9MDtrPWsucmVwbGFjZSgvXlxccyt8XFxzKyQvZyxcIlwiKS5yZXBsYWNlKC88c3Bhbi9nLFwifHx8XFx4M2NzcGFuXCIpLnJlcGxhY2UoLzxcXC9zcGFuPi9nLFwiXFx4M2Mvc3BhblxceDNlfHx8XCIpO2M9ay5zcGxpdChcInx8fFwiKTtjLmZvckVhY2goZnVuY3Rpb24oayl7aWYoXCJcIiE9PWt8fDE9PT1jLmxlbmd0aCl7dmFyIGg9e30sZj1yLmNyZWF0ZUVsZW1lbnROUyhxLlNWR19OUyxcInRzcGFuXCIpLEQsRzsoRD1NKGssXCJjbGFzc1wiKSkmJmcoZixcImNsYXNzXCIsRCk7aWYoRD1NKGssXCJzdHlsZVwiKSlEPUQucmVwbGFjZSgvKDt8IHxeKWNvbG9yKFsgOl0pLyxcIiQxZmlsbCQyXCIpLGcoZixcInN0eWxlXCIsXG5EKTsoRz1NKGssXCJocmVmXCIpKSYmIWImJihnKGYsXCJvbmNsaWNrXCIsJ2xvY2F0aW9uLmhyZWZcXHgzZFwiJytHKydcIicpLGcoZixcImNsYXNzXCIsXCJoaWdoY2hhcnRzLWFuY2hvclwiKSxxLnN0eWxlZE1vZGV8fHkoZix7Y3Vyc29yOlwicG9pbnRlclwifSkpO2s9bShrLnJlcGxhY2UoLzxbYS16QS1aXFwvXSgufFxcbikqPz4vZyxcIlwiKXx8XCIgXCIpO2lmKFwiIFwiIT09ayl7Zi5hcHBlbmRDaGlsZChyLmNyZWF0ZVRleHROb2RlKGspKTt1P2guZHg9MDplJiZudWxsIT09dCYmKGgueD10KTtnKGYsaCk7ZC5hcHBlbmRDaGlsZChmKTshdSYmTiYmKCFPJiZiJiZ5KGYse2Rpc3BsYXk6XCJibG9ja1wifSksZyhmLFwiZHlcIixCKGYpKSk7aWYoSyl7dmFyIEY9ay5yZXBsYWNlKC8oW15cXF5dKS0vZyxcIiQxLSBcIikuc3BsaXQoXCIgXCIpLGg9IW4mJigxPGMubGVuZ3RofHxlfHwxPEYubGVuZ3RoKTtHPTA7dmFyIFI9QihmKTtpZih3KWw9cS50cnVuY2F0ZShhLGYsayx2b2lkIDAsMCxNYXRoLm1heCgwLEstcGFyc2VJbnQoSnx8XG4xMiwxMCkpLGZ1bmN0aW9uKGEsZCl7cmV0dXJuIGEuc3Vic3RyaW5nKDAsZCkrXCJcXHUyMDI2XCJ9KTtlbHNlIGlmKGgpZm9yKDtGLmxlbmd0aDspRi5sZW5ndGgmJiFuJiYwPEcmJihmPXIuY3JlYXRlRWxlbWVudE5TKEwsXCJ0c3BhblwiKSxnKGYse2R5OlIseDp0fSksRCYmZyhmLFwic3R5bGVcIixEKSxmLmFwcGVuZENoaWxkKHIuY3JlYXRlVGV4dE5vZGUoRi5qb2luKFwiIFwiKS5yZXBsYWNlKC8tIC9nLFwiLVwiKSkpLGQuYXBwZW5kQ2hpbGQoZikpLHEudHJ1bmNhdGUoYSxmLG51bGwsRiwwPT09Rz9wOjAsSyxmdW5jdGlvbihhLGQpe3JldHVybiBGLnNsaWNlKDAsZCkuam9pbihcIiBcIikucmVwbGFjZSgvLSAvZyxcIi1cIil9KSxwPWEuYWN0dWFsV2lkdGgsRysrfXUrK319fSk7Tj1OfHxkLmNoaWxkTm9kZXMubGVuZ3RofSksdyYmbCYmYS5hdHRyKFwidGl0bGVcIixtKGEudGV4dFN0cixbXCJcXHgyNmx0O1wiLFwiXFx4MjZndDtcIl0pKSxwJiZwLnJlbW92ZUNoaWxkKGQpLGYmJmEuYXBwbHlUZXh0T3V0bGluZSYmXG5hLmFwcGx5VGV4dE91dGxpbmUoZikpOmQuYXBwZW5kQ2hpbGQoci5jcmVhdGVUZXh0Tm9kZShtKGspKSl9fSxnZXRDb250cmFzdDpmdW5jdGlvbihhKXthPXgoYSkucmdiYTthWzBdKj0xO2FbMV0qPTEuMjthWzJdKj0uNTtyZXR1cm4gNDU5PGFbMF0rYVsxXSthWzJdP1wiIzAwMDAwMFwiOlwiI0ZGRkZGRlwifSxidXR0b246ZnVuY3Rpb24oYSxxLGIsayxjLGwsdSx0LHAsSyl7dmFyIGg9dGhpcy5sYWJlbChhLHEsYixwLG51bGwsbnVsbCxLLG51bGwsXCJidXR0b25cIiksZj0wLEQ9dGhpcy5zdHlsZWRNb2RlO2guYXR0cihkKHtwYWRkaW5nOjgscjoyfSxjKSk7aWYoIUQpe3ZhciByLHcsbixHO2M9ZCh7ZmlsbDpcIiNmN2Y3ZjdcIixzdHJva2U6XCIjY2NjY2NjXCIsXCJzdHJva2Utd2lkdGhcIjoxLHN0eWxlOntjb2xvcjpcIiMzMzMzMzNcIixjdXJzb3I6XCJwb2ludGVyXCIsZm9udFdlaWdodDpcIm5vcm1hbFwifX0sYyk7cj1jLnN0eWxlO2RlbGV0ZSBjLnN0eWxlO2w9ZChjLHtmaWxsOlwiI2U2ZTZlNlwifSxsKTtcbnc9bC5zdHlsZTtkZWxldGUgbC5zdHlsZTt1PWQoYyx7ZmlsbDpcIiNlNmViZjVcIixzdHlsZTp7Y29sb3I6XCIjMDAwMDAwXCIsZm9udFdlaWdodDpcImJvbGRcIn19LHUpO249dS5zdHlsZTtkZWxldGUgdS5zdHlsZTt0PWQoYyx7c3R5bGU6e2NvbG9yOlwiI2NjY2NjY1wifX0sdCk7Rz10LnN0eWxlO2RlbGV0ZSB0LnN0eWxlfUUoaC5lbGVtZW50LEY/XCJtb3VzZW92ZXJcIjpcIm1vdXNlZW50ZXJcIixmdW5jdGlvbigpezMhPT1mJiZoLnNldFN0YXRlKDEpfSk7RShoLmVsZW1lbnQsRj9cIm1vdXNlb3V0XCI6XCJtb3VzZWxlYXZlXCIsZnVuY3Rpb24oKXszIT09ZiYmaC5zZXRTdGF0ZShmKX0pO2guc2V0U3RhdGU9ZnVuY3Rpb24oYSl7MSE9PWEmJihoLnN0YXRlPWY9YSk7aC5yZW1vdmVDbGFzcygvaGlnaGNoYXJ0cy1idXR0b24tKG5vcm1hbHxob3ZlcnxwcmVzc2VkfGRpc2FibGVkKS8pLmFkZENsYXNzKFwiaGlnaGNoYXJ0cy1idXR0b24tXCIrW1wibm9ybWFsXCIsXCJob3ZlclwiLFwicHJlc3NlZFwiLFwiZGlzYWJsZWRcIl1bYXx8XG4wXSk7RHx8aC5hdHRyKFtjLGwsdSx0XVthfHwwXSkuY3NzKFtyLHcsbixHXVthfHwwXSl9O0R8fGguYXR0cihjKS5jc3MoZSh7Y3Vyc29yOlwiZGVmYXVsdFwifSxyKSk7cmV0dXJuIGgub24oXCJjbGlja1wiLGZ1bmN0aW9uKGEpezMhPT1mJiZrLmNhbGwoaCxhKX0pfSxjcmlzcExpbmU6ZnVuY3Rpb24oYSxkKXthWzFdPT09YVs0XSYmKGFbMV09YVs0XT1NYXRoLnJvdW5kKGFbMV0pLWQlMi8yKTthWzJdPT09YVs1XSYmKGFbMl09YVs1XT1NYXRoLnJvdW5kKGFbMl0pK2QlMi8yKTtyZXR1cm4gYX0scGF0aDpmdW5jdGlvbihhKXt2YXIgZD10aGlzLnN0eWxlZE1vZGU/e306e2ZpbGw6XCJub25lXCJ9O2MoYSk/ZC5kPWE6dyhhKSYmZShkLGEpO3JldHVybiB0aGlzLmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIpLmF0dHIoZCl9LGNpcmNsZTpmdW5jdGlvbihhLGQscSl7YT13KGEpP2E6dm9pZCAwPT09YT97fTp7eDphLHk6ZCxyOnF9O2Q9dGhpcy5jcmVhdGVFbGVtZW50KFwiY2lyY2xlXCIpO2QueFNldHRlcj1cbmQueVNldHRlcj1mdW5jdGlvbihhLGQscSl7cS5zZXRBdHRyaWJ1dGUoXCJjXCIrZCxhKX07cmV0dXJuIGQuYXR0cihhKX0sYXJjOmZ1bmN0aW9uKGEsZCxxLGIsayxlKXt3KGEpPyhiPWEsZD1iLnkscT1iLnIsYT1iLngpOmI9e2lubmVyUjpiLHN0YXJ0OmssZW5kOmV9O2E9dGhpcy5zeW1ib2woXCJhcmNcIixhLGQscSxxLGIpO2Eucj1xO3JldHVybiBhfSxyZWN0OmZ1bmN0aW9uKGEsZCxxLGIsayxlKXtrPXcoYSk/YS5yOms7dmFyIGM9dGhpcy5jcmVhdGVFbGVtZW50KFwicmVjdFwiKTthPXcoYSk/YTp2b2lkIDA9PT1hP3t9Ont4OmEseTpkLHdpZHRoOk1hdGgubWF4KHEsMCksaGVpZ2h0Ok1hdGgubWF4KGIsMCl9O3RoaXMuc3R5bGVkTW9kZXx8KHZvaWQgMCE9PWUmJihhLnN0cm9rZVdpZHRoPWUsYT1jLmNyaXNwKGEpKSxhLmZpbGw9XCJub25lXCIpO2smJihhLnI9ayk7Yy5yU2V0dGVyPWZ1bmN0aW9uKGEsZCxxKXtjLnI9YTtnKHEse3J4OmEscnk6YX0pfTtjLnJHZXR0ZXI9ZnVuY3Rpb24oKXtyZXR1cm4gYy5yfTtcbnJldHVybiBjLmF0dHIoYSl9LHNldFNpemU6ZnVuY3Rpb24oYSxkLHEpe3ZhciBiPXRoaXMuYWxpZ25lZE9iamVjdHMsaz1iLmxlbmd0aDt0aGlzLndpZHRoPWE7dGhpcy5oZWlnaHQ9ZDtmb3IodGhpcy5ib3hXcmFwcGVyLmFuaW1hdGUoe3dpZHRoOmEsaGVpZ2h0OmR9LHtzdGVwOmZ1bmN0aW9uKCl7dGhpcy5hdHRyKHt2aWV3Qm94OlwiMCAwIFwiK3RoaXMuYXR0cihcIndpZHRoXCIpK1wiIFwiK3RoaXMuYXR0cihcImhlaWdodFwiKX0pfSxkdXJhdGlvbjpEKHEsITApP3ZvaWQgMDowfSk7ay0tOyliW2tdLmFsaWduKCl9LGc6ZnVuY3Rpb24oYSl7dmFyIGQ9dGhpcy5jcmVhdGVFbGVtZW50KFwiZ1wiKTtyZXR1cm4gYT9kLmF0dHIoe1wiY2xhc3NcIjpcImhpZ2hjaGFydHMtXCIrYX0pOmR9LGltYWdlOmZ1bmN0aW9uKGEsZCxxLGIsayxjKXt2YXIgbD17cHJlc2VydmVBc3BlY3RSYXRpbzpcIm5vbmVcIn0sdSx0PWZ1bmN0aW9uKGEsZCl7YS5zZXRBdHRyaWJ1dGVOUz9hLnNldEF0dHJpYnV0ZU5TKFwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiLFxuXCJocmVmXCIsZCk6YS5zZXRBdHRyaWJ1dGUoXCJoYy1zdmctaHJlZlwiLGQpfSxwPWZ1bmN0aW9uKGQpe3QodS5lbGVtZW50LGEpO2MuY2FsbCh1LGQpfTsxPGFyZ3VtZW50cy5sZW5ndGgmJmUobCx7eDpkLHk6cSx3aWR0aDpiLGhlaWdodDprfSk7dT10aGlzLmNyZWF0ZUVsZW1lbnQoXCJpbWFnZVwiKS5hdHRyKGwpO2M/KHQodS5lbGVtZW50LFwiZGF0YTppbWFnZS9naWY7YmFzZTY0LFIwbEdPRGxoQVFBQkFBQUFBQ0g1QkFFS0FBRUFMQUFBQUFBQkFBRUFBQUlDVEFFQU93XFx4M2RcXHgzZFwiKSxsPW5ldyBNLkltYWdlLEUobCxcImxvYWRcIixwKSxsLnNyYz1hLGwuY29tcGxldGUmJnAoe30pKTp0KHUuZWxlbWVudCxhKTtyZXR1cm4gdX0sc3ltYm9sOmZ1bmN0aW9uKGEsZCxxLGIsayxjKXt2YXIgbD10aGlzLHUsdD0vXnVybFxcKCguKj8pXFwpJC8scD10LnRlc3QoYSksSz0hcCYmKHRoaXMuc3ltYm9sc1thXT9hOlwiY2lyY2xlXCIpLGg9SyYmdGhpcy5zeW1ib2xzW0tdLGY9bihkKSYmaCYmaC5jYWxsKHRoaXMuc3ltYm9scyxcbk1hdGgucm91bmQoZCksTWF0aC5yb3VuZChxKSxiLGssYyksdyxHO2g/KHU9dGhpcy5wYXRoKGYpLGwuc3R5bGVkTW9kZXx8dS5hdHRyKFwiZmlsbFwiLFwibm9uZVwiKSxlKHUse3N5bWJvbE5hbWU6Syx4OmQseTpxLHdpZHRoOmIsaGVpZ2h0Omt9KSxjJiZlKHUsYykpOnAmJih3PWEubWF0Y2godClbMV0sdT10aGlzLmltYWdlKHcpLHUuaW1nd2lkdGg9RChSW3ddJiZSW3ddLndpZHRoLGMmJmMud2lkdGgpLHUuaW1naGVpZ2h0PUQoUlt3XSYmUlt3XS5oZWlnaHQsYyYmYy5oZWlnaHQpLEc9ZnVuY3Rpb24oKXt1LmF0dHIoe3dpZHRoOnUud2lkdGgsaGVpZ2h0OnUuaGVpZ2h0fSl9LFtcIndpZHRoXCIsXCJoZWlnaHRcIl0uZm9yRWFjaChmdW5jdGlvbihhKXt1W2ErXCJTZXR0ZXJcIl09ZnVuY3Rpb24oYSxkKXt2YXIgcT17fSxiPXRoaXNbXCJpbWdcIitkXSxrPVwid2lkdGhcIj09PWQ/XCJ0cmFuc2xhdGVYXCI6XCJ0cmFuc2xhdGVZXCI7dGhpc1tkXT1hO24oYikmJihjJiZcIndpdGhpblwiPT09Yy5iYWNrZ3JvdW5kU2l6ZSYmXG50aGlzLndpZHRoJiZ0aGlzLmhlaWdodCYmKGI9TWF0aC5yb3VuZChiKk1hdGgubWluKHRoaXMud2lkdGgvdGhpcy5pbWd3aWR0aCx0aGlzLmhlaWdodC90aGlzLmltZ2hlaWdodCkpKSx0aGlzLmVsZW1lbnQmJnRoaXMuZWxlbWVudC5zZXRBdHRyaWJ1dGUoZCxiKSx0aGlzLmFsaWduQnlUcmFuc2xhdGV8fChxW2tdPSgodGhpc1tkXXx8MCktYikvMix0aGlzLmF0dHIocSkpKX19KSxuKGQpJiZ1LmF0dHIoe3g6ZCx5OnF9KSx1LmlzSW1nPSEwLG4odS5pbWd3aWR0aCkmJm4odS5pbWdoZWlnaHQpP0coKToodS5hdHRyKHt3aWR0aDowLGhlaWdodDowfSkseihcImltZ1wiLHtvbmxvYWQ6ZnVuY3Rpb24oKXt2YXIgYT12W2wuY2hhcnRJbmRleF07MD09PXRoaXMud2lkdGgmJih5KHRoaXMse3Bvc2l0aW9uOlwiYWJzb2x1dGVcIix0b3A6XCItOTk5ZW1cIn0pLHIuYm9keS5hcHBlbmRDaGlsZCh0aGlzKSk7Ult3XT17d2lkdGg6dGhpcy53aWR0aCxoZWlnaHQ6dGhpcy5oZWlnaHR9O3UuaW1nd2lkdGg9XG50aGlzLndpZHRoO3UuaW1naGVpZ2h0PXRoaXMuaGVpZ2h0O3UuZWxlbWVudCYmRygpO3RoaXMucGFyZW50Tm9kZSYmdGhpcy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMpO2wuaW1nQ291bnQtLTtpZighbC5pbWdDb3VudCYmYSYmYS5vbmxvYWQpYS5vbmxvYWQoKX0sc3JjOnd9KSx0aGlzLmltZ0NvdW50KyspKTtyZXR1cm4gdX0sc3ltYm9sczp7Y2lyY2xlOmZ1bmN0aW9uKGEsZCxxLGIpe3JldHVybiB0aGlzLmFyYyhhK3EvMixkK2IvMixxLzIsYi8yLHtzdGFydDouNSpNYXRoLlBJLGVuZDoyLjUqTWF0aC5QSSxvcGVuOiExfSl9LHNxdWFyZTpmdW5jdGlvbihhLGQscSxiKXtyZXR1cm5bXCJNXCIsYSxkLFwiTFwiLGErcSxkLGErcSxkK2IsYSxkK2IsXCJaXCJdfSx0cmlhbmdsZTpmdW5jdGlvbihhLGQscSxiKXtyZXR1cm5bXCJNXCIsYStxLzIsZCxcIkxcIixhK3EsZCtiLGEsZCtiLFwiWlwiXX0sXCJ0cmlhbmdsZS1kb3duXCI6ZnVuY3Rpb24oYSxkLHEsYil7cmV0dXJuW1wiTVwiLGEsZCxcIkxcIixhK3EsXG5kLGErcS8yLGQrYixcIlpcIl19LGRpYW1vbmQ6ZnVuY3Rpb24oYSxkLHEsYil7cmV0dXJuW1wiTVwiLGErcS8yLGQsXCJMXCIsYStxLGQrYi8yLGErcS8yLGQrYixhLGQrYi8yLFwiWlwiXX0sYXJjOmZ1bmN0aW9uKGEsZCxxLGIsayl7dmFyIGU9ay5zdGFydCxjPWsucnx8cSx1PWsucnx8Ynx8cSxsPWsuZW5kLS4wMDE7cT1rLmlubmVyUjtiPUQoay5vcGVuLC4wMDE+TWF0aC5hYnMoay5lbmQtay5zdGFydC0yKk1hdGguUEkpKTt2YXIgdD1NYXRoLmNvcyhlKSxwPU1hdGguc2luKGUpLEs9TWF0aC5jb3MobCksbD1NYXRoLnNpbihsKSxlPS4wMDE+ay5lbmQtZS1NYXRoLlBJPzA6MTtrPVtcIk1cIixhK2MqdCxkK3UqcCxcIkFcIixjLHUsMCxlLEQoay5jbG9ja3dpc2UsMSksYStjKkssZCt1KmxdO24ocSkmJmsucHVzaChiP1wiTVwiOlwiTFwiLGErcSpLLGQrcSpsLFwiQVwiLHEscSwwLGUsMCxhK3EqdCxkK3EqcCk7ay5wdXNoKGI/XCJcIjpcIlpcIik7cmV0dXJuIGt9LGNhbGxvdXQ6ZnVuY3Rpb24oYSxkLHEsYixrKXt2YXIgZT1cbk1hdGgubWluKGsmJmsucnx8MCxxLGIpLGM9ZSs2LHU9ayYmay5hbmNob3JYO2s9ayYmay5hbmNob3JZO3ZhciBsO2w9W1wiTVwiLGErZSxkLFwiTFwiLGErcS1lLGQsXCJDXCIsYStxLGQsYStxLGQsYStxLGQrZSxcIkxcIixhK3EsZCtiLWUsXCJDXCIsYStxLGQrYixhK3EsZCtiLGErcS1lLGQrYixcIkxcIixhK2UsZCtiLFwiQ1wiLGEsZCtiLGEsZCtiLGEsZCtiLWUsXCJMXCIsYSxkK2UsXCJDXCIsYSxkLGEsZCxhK2UsZF07dSYmdT5xP2s+ZCtjJiZrPGQrYi1jP2wuc3BsaWNlKDEzLDMsXCJMXCIsYStxLGstNixhK3ErNixrLGErcSxrKzYsYStxLGQrYi1lKTpsLnNwbGljZSgxMywzLFwiTFwiLGErcSxiLzIsdSxrLGErcSxiLzIsYStxLGQrYi1lKTp1JiYwPnU/az5kK2MmJms8ZCtiLWM/bC5zcGxpY2UoMzMsMyxcIkxcIixhLGsrNixhLTYsayxhLGstNixhLGQrZSk6bC5zcGxpY2UoMzMsMyxcIkxcIixhLGIvMix1LGssYSxiLzIsYSxkK2UpOmsmJms+YiYmdT5hK2MmJnU8YStxLWM/bC5zcGxpY2UoMjMsMyxcIkxcIix1KzYsZCtcbmIsdSxkK2IrNix1LTYsZCtiLGErZSxkK2IpOmsmJjA+ayYmdT5hK2MmJnU8YStxLWMmJmwuc3BsaWNlKDMsMyxcIkxcIix1LTYsZCx1LGQtNix1KzYsZCxxLWUsZCk7cmV0dXJuIGx9fSxjbGlwUmVjdDpmdW5jdGlvbihkLHEsYixrKXt2YXIgZT1hLnVuaXF1ZUtleSgpK1wiLVwiLGM9dGhpcy5jcmVhdGVFbGVtZW50KFwiY2xpcFBhdGhcIikuYXR0cih7aWQ6ZX0pLmFkZCh0aGlzLmRlZnMpO2Q9dGhpcy5yZWN0KGQscSxiLGssMCkuYWRkKGMpO2QuaWQ9ZTtkLmNsaXBQYXRoPWM7ZC5jb3VudD0wO3JldHVybiBkfSx0ZXh0OmZ1bmN0aW9uKGEsZCxxLGIpe3ZhciBrPXt9O2lmKGImJih0aGlzLmFsbG93SFRNTHx8IXRoaXMuZm9yRXhwb3J0KSlyZXR1cm4gdGhpcy5odG1sKGEsZCxxKTtrLng9TWF0aC5yb3VuZChkfHwwKTtxJiYoay55PU1hdGgucm91bmQocSkpO24oYSkmJihrLnRleHQ9YSk7YT10aGlzLmNyZWF0ZUVsZW1lbnQoXCJ0ZXh0XCIpLmF0dHIoayk7Ynx8KGEueFNldHRlcj1mdW5jdGlvbihhLFxuZCxxKXt2YXIgYj1xLmdldEVsZW1lbnRzQnlUYWdOYW1lKFwidHNwYW5cIiksayxlPXEuZ2V0QXR0cmlidXRlKGQpLGM7Zm9yKGM9MDtjPGIubGVuZ3RoO2MrKylrPWJbY10say5nZXRBdHRyaWJ1dGUoZCk9PT1lJiZrLnNldEF0dHJpYnV0ZShkLGEpO3Euc2V0QXR0cmlidXRlKGQsYSl9KTtyZXR1cm4gYX0sZm9udE1ldHJpY3M6ZnVuY3Rpb24oYSxkKXthPSF0aGlzLnN0eWxlZE1vZGUmJi9weC8udGVzdChhKXx8IU0uZ2V0Q29tcHV0ZWRTdHlsZT9hfHxkJiZkLnN0eWxlJiZkLnN0eWxlLmZvbnRTaXplfHx0aGlzLnN0eWxlJiZ0aGlzLnN0eWxlLmZvbnRTaXplOmQmJkMucHJvdG90eXBlLmdldFN0eWxlLmNhbGwoZCxcImZvbnQtc2l6ZVwiKTthPS9weC8udGVzdChhKT9HKGEpOjEyO2Q9MjQ+YT9hKzM6TWF0aC5yb3VuZCgxLjIqYSk7cmV0dXJue2g6ZCxiOk1hdGgucm91bmQoLjgqZCksZjphfX0scm90Q29ycjpmdW5jdGlvbihhLGQscSl7dmFyIGI9YTtkJiZxJiYoYj1NYXRoLm1heChiKlxuTWF0aC5jb3MoZCpmKSw0KSk7cmV0dXJue3g6LWEvMypNYXRoLnNpbihkKmYpLHk6Yn19LGxhYmVsOmZ1bmN0aW9uKGIsayxjLHUsbCx0LHAsSyxoKXt2YXIgZj10aGlzLEQ9Zi5zdHlsZWRNb2RlLHc9Zi5nKFwiYnV0dG9uXCIhPT1oJiZcImxhYmVsXCIpLHI9dy50ZXh0PWYudGV4dChcIlwiLDAsMCxwKS5hdHRyKHt6SW5kZXg6MX0pLEcsTCxPPTAsRj0zLGc9MCxOLFIsQixtLEosTT17fSx6LHYseD0vXnVybFxcKCguKj8pXFwpJC8udGVzdCh1KSx5PUR8fHgsZGE9ZnVuY3Rpb24oKXtyZXR1cm4gRD9HLnN0cm9rZVdpZHRoKCklMi8yOih6P3BhcnNlSW50KHosMTApOjApJTIvMn0sYmEsUCxBO2gmJncuYWRkQ2xhc3MoXCJoaWdoY2hhcnRzLVwiK2gpO2JhPWZ1bmN0aW9uKCl7dmFyIGE9ci5lbGVtZW50LnN0eWxlLGQ9e307TD0odm9pZCAwPT09Tnx8dm9pZCAwPT09Unx8SikmJm4oci50ZXh0U3RyKSYmci5nZXRCQm94KCk7dy53aWR0aD0oTnx8TC53aWR0aHx8MCkrMipGK2c7dy5oZWlnaHQ9KFJ8fFxuTC5oZWlnaHR8fDApKzIqRjt2PUYrTWF0aC5taW4oZi5mb250TWV0cmljcyhhJiZhLmZvbnRTaXplLHIpLmIsTD9MLmhlaWdodDpJbmZpbml0eSk7eSYmKEd8fCh3LmJveD1HPWYuc3ltYm9sc1t1XXx8eD9mLnN5bWJvbCh1KTpmLnJlY3QoKSxHLmFkZENsYXNzKChcImJ1dHRvblwiPT09aD9cIlwiOlwiaGlnaGNoYXJ0cy1sYWJlbC1ib3hcIikrKGg/XCIgaGlnaGNoYXJ0cy1cIitoK1wiLWJveFwiOlwiXCIpKSxHLmFkZCh3KSxhPWRhKCksZC54PWEsZC55PShLPy12OjApK2EpLGQud2lkdGg9TWF0aC5yb3VuZCh3LndpZHRoKSxkLmhlaWdodD1NYXRoLnJvdW5kKHcuaGVpZ2h0KSxHLmF0dHIoZShkLE0pKSxNPXt9KX07UD1mdW5jdGlvbigpe3ZhciBhPWcrRixkO2Q9Sz8wOnY7bihOKSYmTCYmKFwiY2VudGVyXCI9PT1KfHxcInJpZ2h0XCI9PT1KKSYmKGErPXtjZW50ZXI6LjUscmlnaHQ6MX1bSl0qKE4tTC53aWR0aCkpO2lmKGEhPT1yLnh8fGQhPT1yLnkpci5hdHRyKFwieFwiLGEpLHIuaGFzQm94V2lkdGhDaGFuZ2VkJiZcbihMPXIuZ2V0QkJveCghMCksYmEoKSksdm9pZCAwIT09ZCYmci5hdHRyKFwieVwiLGQpO3IueD1hO3IueT1kfTtBPWZ1bmN0aW9uKGEsZCl7Rz9HLmF0dHIoYSxkKTpNW2FdPWR9O3cub25BZGQ9ZnVuY3Rpb24oKXtyLmFkZCh3KTt3LmF0dHIoe3RleHQ6Ynx8MD09PWI/YjpcIlwiLHg6ayx5OmN9KTtHJiZuKGwpJiZ3LmF0dHIoe2FuY2hvclg6bCxhbmNob3JZOnR9KX07dy53aWR0aFNldHRlcj1mdW5jdGlvbihkKXtOPWEuaXNOdW1iZXIoZCk/ZDpudWxsfTt3LmhlaWdodFNldHRlcj1mdW5jdGlvbihhKXtSPWF9O3dbXCJ0ZXh0LWFsaWduU2V0dGVyXCJdPWZ1bmN0aW9uKGEpe0o9YX07dy5wYWRkaW5nU2V0dGVyPWZ1bmN0aW9uKGEpe24oYSkmJmEhPT1GJiYoRj13LnBhZGRpbmc9YSxQKCkpfTt3LnBhZGRpbmdMZWZ0U2V0dGVyPWZ1bmN0aW9uKGEpe24oYSkmJmEhPT1nJiYoZz1hLFAoKSl9O3cuYWxpZ25TZXR0ZXI9ZnVuY3Rpb24oYSl7YT17bGVmdDowLGNlbnRlcjouNSxyaWdodDoxfVthXTtcbmEhPT1PJiYoTz1hLEwmJncuYXR0cih7eDpCfSkpfTt3LnRleHRTZXR0ZXI9ZnVuY3Rpb24oYSl7dm9pZCAwIT09YSYmci5hdHRyKHt0ZXh0OmF9KTtiYSgpO1AoKX07d1tcInN0cm9rZS13aWR0aFNldHRlclwiXT1mdW5jdGlvbihhLGQpe2EmJih5PSEwKTt6PXRoaXNbXCJzdHJva2Utd2lkdGhcIl09YTtBKGQsYSl9O0Q/dy5yU2V0dGVyPWZ1bmN0aW9uKGEsZCl7QShkLGEpfTp3LnN0cm9rZVNldHRlcj13LmZpbGxTZXR0ZXI9dy5yU2V0dGVyPWZ1bmN0aW9uKGEsZCl7XCJyXCIhPT1kJiYoXCJmaWxsXCI9PT1kJiZhJiYoeT0hMCksd1tkXT1hKTtBKGQsYSl9O3cuYW5jaG9yWFNldHRlcj1mdW5jdGlvbihhLGQpe2w9dy5hbmNob3JYPWE7QShkLE1hdGgucm91bmQoYSktZGEoKS1CKX07dy5hbmNob3JZU2V0dGVyPWZ1bmN0aW9uKGEsZCl7dD13LmFuY2hvclk9YTtBKGQsYS1tKX07dy54U2V0dGVyPWZ1bmN0aW9uKGEpe3cueD1hO08mJihhLT1PKigoTnx8TC53aWR0aCkrMipGKSx3W1wiZm9yY2VBbmltYXRlOnhcIl09XG4hMCk7Qj1NYXRoLnJvdW5kKGEpO3cuYXR0cihcInRyYW5zbGF0ZVhcIixCKX07dy55U2V0dGVyPWZ1bmN0aW9uKGEpe209dy55PU1hdGgucm91bmQoYSk7dy5hdHRyKFwidHJhbnNsYXRlWVwiLG0pfTt2YXIgUz13LmNzcztwPXtjc3M6ZnVuY3Rpb24oYSl7aWYoYSl7dmFyIHE9e307YT1kKGEpO3cudGV4dFByb3BzLmZvckVhY2goZnVuY3Rpb24oZCl7dm9pZCAwIT09YVtkXSYmKHFbZF09YVtkXSxkZWxldGUgYVtkXSl9KTtyLmNzcyhxKTtcIndpZHRoXCJpbiBxJiZiYSgpO1wiZm9udFNpemVcImluIHEmJihiYSgpLFAoKSl9cmV0dXJuIFMuY2FsbCh3LGEpfSxnZXRCQm94OmZ1bmN0aW9uKCl7cmV0dXJue3dpZHRoOkwud2lkdGgrMipGLGhlaWdodDpMLmhlaWdodCsyKkYseDpMLngtRix5OkwueS1GfX0sZGVzdHJveTpmdW5jdGlvbigpe3Eody5lbGVtZW50LFwibW91c2VlbnRlclwiKTtxKHcuZWxlbWVudCxcIm1vdXNlbGVhdmVcIik7ciYmKHI9ci5kZXN0cm95KCkpO0cmJihHPUcuZGVzdHJveSgpKTtcbkMucHJvdG90eXBlLmRlc3Ryb3kuY2FsbCh3KTt3PWY9YmE9UD1BPW51bGx9fTtEfHwocC5zaGFkb3c9ZnVuY3Rpb24oYSl7YSYmKGJhKCksRyYmRy5zaGFkb3coYSkpO3JldHVybiB3fSk7cmV0dXJuIGUodyxwKX19KTthLlJlbmRlcmVyPUF9KTtJKEgsXCJwYXJ0cy9IdG1sLmpzXCIsW0hbXCJwYXJ0cy9HbG9iYWxzLmpzXCJdXSxmdW5jdGlvbihhKXt2YXIgQz1hLmF0dHIsQT1hLmNyZWF0ZUVsZW1lbnQsRT1hLmNzcyxtPWEuZGVmaW5lZCxnPWEuZXh0ZW5kLHY9YS5pc0ZpcmVmb3gseD1hLmlzTVMseT1hLmlzV2ViS2l0LHo9YS5waWNrLG49YS5wSW50LGY9YS5TVkdFbGVtZW50LGg9YS5TVkdSZW5kZXJlcixyPWEud2luO2coZi5wcm90b3R5cGUse2h0bWxDc3M6ZnVuY3Rpb24oYSl7dmFyIGI9XCJTUEFOXCI9PT10aGlzLmVsZW1lbnQudGFnTmFtZSYmYSYmXCJ3aWR0aFwiaW4gYSxlPXooYiYmYS53aWR0aCx2b2lkIDApLGM7YiYmKGRlbGV0ZSBhLndpZHRoLHRoaXMudGV4dFdpZHRoPWUsYz0hMCk7XG5hJiZcImVsbGlwc2lzXCI9PT1hLnRleHRPdmVyZmxvdyYmKGEud2hpdGVTcGFjZT1cIm5vd3JhcFwiLGEub3ZlcmZsb3c9XCJoaWRkZW5cIik7dGhpcy5zdHlsZXM9Zyh0aGlzLnN0eWxlcyxhKTtFKHRoaXMuZWxlbWVudCxhKTtjJiZ0aGlzLmh0bWxVcGRhdGVUcmFuc2Zvcm0oKTtyZXR1cm4gdGhpc30saHRtbEdldEJCb3g6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmVsZW1lbnQ7cmV0dXJue3g6YS5vZmZzZXRMZWZ0LHk6YS5vZmZzZXRUb3Asd2lkdGg6YS5vZmZzZXRXaWR0aCxoZWlnaHQ6YS5vZmZzZXRIZWlnaHR9fSxodG1sVXBkYXRlVHJhbnNmb3JtOmZ1bmN0aW9uKCl7aWYodGhpcy5hZGRlZCl7dmFyIGE9dGhpcy5yZW5kZXJlcixiPXRoaXMuZWxlbWVudCxsPXRoaXMudHJhbnNsYXRlWHx8MCxjPXRoaXMudHJhbnNsYXRlWXx8MCx0PXRoaXMueHx8MCxoPXRoaXMueXx8MCxmPXRoaXMudGV4dEFsaWdufHxcImxlZnRcIixyPXtsZWZ0OjAsY2VudGVyOi41LHJpZ2h0OjF9W2ZdLHA9dGhpcy5zdHlsZXMsXG5kPXAmJnAud2hpdGVTcGFjZTtFKGIse21hcmdpbkxlZnQ6bCxtYXJnaW5Ub3A6Y30pOyFhLnN0eWxlZE1vZGUmJnRoaXMuc2hhZG93cyYmdGhpcy5zaGFkb3dzLmZvckVhY2goZnVuY3Rpb24oYSl7RShhLHttYXJnaW5MZWZ0OmwrMSxtYXJnaW5Ub3A6YysxfSl9KTt0aGlzLmludmVydGVkJiZbXS5mb3JFYWNoLmNhbGwoYi5jaGlsZE5vZGVzLGZ1bmN0aW9uKGQpe2EuaW52ZXJ0Q2hpbGQoZCxiKX0pO2lmKFwiU1BBTlwiPT09Yi50YWdOYW1lKXt2YXIgcD10aGlzLnJvdGF0aW9uLGs9dGhpcy50ZXh0V2lkdGgmJm4odGhpcy50ZXh0V2lkdGgpLHU9W3AsZixiLmlubmVySFRNTCx0aGlzLnRleHRXaWR0aCx0aGlzLnRleHRBbGlnbl0uam9pbigpLEQ7KEQ9ayE9PXRoaXMub2xkVGV4dFdpZHRoKSYmIShEPWs+dGhpcy5vbGRUZXh0V2lkdGgpJiYoKEQ9dGhpcy50ZXh0UHhMZW5ndGgpfHwoRShiLHt3aWR0aDpcIlwiLHdoaXRlU3BhY2U6ZHx8XCJub3dyYXBcIn0pLEQ9Yi5vZmZzZXRXaWR0aCksRD1cbkQ+ayk7RCYmKC9bIFxcLV0vLnRlc3QoYi50ZXh0Q29udGVudHx8Yi5pbm5lclRleHQpfHxcImVsbGlwc2lzXCI9PT1iLnN0eWxlLnRleHRPdmVyZmxvdyk/KEUoYix7d2lkdGg6aytcInB4XCIsZGlzcGxheTpcImJsb2NrXCIsd2hpdGVTcGFjZTpkfHxcIm5vcm1hbFwifSksdGhpcy5vbGRUZXh0V2lkdGg9ayx0aGlzLmhhc0JveFdpZHRoQ2hhbmdlZD0hMCk6dGhpcy5oYXNCb3hXaWR0aENoYW5nZWQ9ITE7dSE9PXRoaXMuY1RUJiYoZD1hLmZvbnRNZXRyaWNzKGIuc3R5bGUuZm9udFNpemUsYikuYiwhbShwKXx8cD09PSh0aGlzLm9sZFJvdGF0aW9ufHwwKSYmZj09PXRoaXMub2xkQWxpZ258fHRoaXMuc2V0U3BhblJvdGF0aW9uKHAscixkKSx0aGlzLmdldFNwYW5Db3JyZWN0aW9uKCFtKHApJiZ0aGlzLnRleHRQeExlbmd0aHx8Yi5vZmZzZXRXaWR0aCxkLHIscCxmKSk7RShiLHtsZWZ0OnQrKHRoaXMueENvcnJ8fDApK1wicHhcIix0b3A6aCsodGhpcy55Q29ycnx8MCkrXCJweFwifSk7dGhpcy5jVFQ9dTtcbnRoaXMub2xkUm90YXRpb249cDt0aGlzLm9sZEFsaWduPWZ9fWVsc2UgdGhpcy5hbGlnbk9uQWRkPSEwfSxzZXRTcGFuUm90YXRpb246ZnVuY3Rpb24oYSxiLGwpe3ZhciBjPXt9LGU9dGhpcy5yZW5kZXJlci5nZXRUcmFuc2Zvcm1LZXkoKTtjW2VdPWMudHJhbnNmb3JtPVwicm90YXRlKFwiK2ErXCJkZWcpXCI7Y1tlKyh2P1wiT3JpZ2luXCI6XCItb3JpZ2luXCIpXT1jLnRyYW5zZm9ybU9yaWdpbj0xMDAqYitcIiUgXCIrbCtcInB4XCI7RSh0aGlzLmVsZW1lbnQsYyl9LGdldFNwYW5Db3JyZWN0aW9uOmZ1bmN0aW9uKGEsYixsKXt0aGlzLnhDb3JyPS1hKmw7dGhpcy55Q29ycj0tYn19KTtnKGgucHJvdG90eXBlLHtnZXRUcmFuc2Zvcm1LZXk6ZnVuY3Rpb24oKXtyZXR1cm4geCYmIS9FZGdlLy50ZXN0KHIubmF2aWdhdG9yLnVzZXJBZ2VudCk/XCItbXMtdHJhbnNmb3JtXCI6eT9cIi13ZWJraXQtdHJhbnNmb3JtXCI6dj9cIk1velRyYW5zZm9ybVwiOnIub3BlcmE/XCItby10cmFuc2Zvcm1cIjpcIlwifSxodG1sOmZ1bmN0aW9uKGUsXG5iLGwpe3ZhciBjPXRoaXMuY3JlYXRlRWxlbWVudChcInNwYW5cIiksdD1jLmVsZW1lbnQsaD1jLnJlbmRlcmVyLHc9aC5pc1NWRyxyPWZ1bmN0aW9uKGEsYil7W1wib3BhY2l0eVwiLFwidmlzaWJpbGl0eVwiXS5mb3JFYWNoKGZ1bmN0aW9uKGQpe2FbZCtcIlNldHRlclwiXT1mdW5jdGlvbihrLGMscSl7dmFyIGU9YS5kaXY/YS5kaXYuc3R5bGU6YjtmLnByb3RvdHlwZVtkK1wiU2V0dGVyXCJdLmNhbGwodGhpcyxrLGMscSk7ZSYmKGVbY109ayl9fSk7YS5hZGRlZFNldHRlcnM9ITB9LHA9YS5jaGFydHNbaC5jaGFydEluZGV4XSxwPXAmJnAuc3R5bGVkTW9kZTtjLnRleHRTZXR0ZXI9ZnVuY3Rpb24oYSl7YSE9PXQuaW5uZXJIVE1MJiYoZGVsZXRlIHRoaXMuYkJveCxkZWxldGUgdGhpcy5vbGRUZXh0V2lkdGgpO3RoaXMudGV4dFN0cj1hO3QuaW5uZXJIVE1MPXooYSxcIlwiKTtjLmRvVHJhbnNmb3JtPSEwfTt3JiZyKGMsYy5lbGVtZW50LnN0eWxlKTtjLnhTZXR0ZXI9Yy55U2V0dGVyPWMuYWxpZ25TZXR0ZXI9XG5jLnJvdGF0aW9uU2V0dGVyPWZ1bmN0aW9uKGEsYil7XCJhbGlnblwiPT09YiYmKGI9XCJ0ZXh0QWxpZ25cIik7Y1tiXT1hO2MuZG9UcmFuc2Zvcm09ITB9O2MuYWZ0ZXJTZXR0ZXJzPWZ1bmN0aW9uKCl7dGhpcy5kb1RyYW5zZm9ybSYmKHRoaXMuaHRtbFVwZGF0ZVRyYW5zZm9ybSgpLHRoaXMuZG9UcmFuc2Zvcm09ITEpfTtjLmF0dHIoe3RleHQ6ZSx4Ok1hdGgucm91bmQoYikseTpNYXRoLnJvdW5kKGwpfSkuY3NzKHtwb3NpdGlvbjpcImFic29sdXRlXCJ9KTtwfHxjLmNzcyh7Zm9udEZhbWlseTp0aGlzLnN0eWxlLmZvbnRGYW1pbHksZm9udFNpemU6dGhpcy5zdHlsZS5mb250U2l6ZX0pO3Quc3R5bGUud2hpdGVTcGFjZT1cIm5vd3JhcFwiO2MuY3NzPWMuaHRtbENzczt3JiYoYy5hZGQ9ZnVuY3Rpb24oYSl7dmFyIGQsYj1oLmJveC5wYXJlbnROb2RlLGU9W107aWYodGhpcy5wYXJlbnRHcm91cD1hKXtpZihkPWEuZGl2LCFkKXtmb3IoO2E7KWUucHVzaChhKSxhPWEucGFyZW50R3JvdXA7ZS5yZXZlcnNlKCkuZm9yRWFjaChmdW5jdGlvbihhKXtmdW5jdGlvbiBxKGQsXG5xKXthW3FdPWQ7XCJ0cmFuc2xhdGVYXCI9PT1xP2subGVmdD1kK1wicHhcIjprLnRvcD1kK1wicHhcIjthLmRvVHJhbnNmb3JtPSEwfXZhciBrLHU9QyhhLmVsZW1lbnQsXCJjbGFzc1wiKTt1JiYodT17Y2xhc3NOYW1lOnV9KTtkPWEuZGl2PWEuZGl2fHxBKFwiZGl2XCIsdSx7cG9zaXRpb246XCJhYnNvbHV0ZVwiLGxlZnQ6KGEudHJhbnNsYXRlWHx8MCkrXCJweFwiLHRvcDooYS50cmFuc2xhdGVZfHwwKStcInB4XCIsZGlzcGxheTphLmRpc3BsYXksb3BhY2l0eTphLm9wYWNpdHkscG9pbnRlckV2ZW50czphLnN0eWxlcyYmYS5zdHlsZXMucG9pbnRlckV2ZW50c30sZHx8Yik7az1kLnN0eWxlO2coYSx7Y2xhc3NTZXR0ZXI6ZnVuY3Rpb24oYSl7cmV0dXJuIGZ1bmN0aW9uKGQpe3RoaXMuZWxlbWVudC5zZXRBdHRyaWJ1dGUoXCJjbGFzc1wiLGQpO2EuY2xhc3NOYW1lPWR9fShkKSxvbjpmdW5jdGlvbigpe2VbMF0uZGl2JiZjLm9uLmFwcGx5KHtlbGVtZW50OmVbMF0uZGl2fSxhcmd1bWVudHMpO3JldHVybiBhfSxcbnRyYW5zbGF0ZVhTZXR0ZXI6cSx0cmFuc2xhdGVZU2V0dGVyOnF9KTthLmFkZGVkU2V0dGVyc3x8cihhKX0pfX1lbHNlIGQ9YjtkLmFwcGVuZENoaWxkKHQpO2MuYWRkZWQ9ITA7Yy5hbGlnbk9uQWRkJiZjLmh0bWxVcGRhdGVUcmFuc2Zvcm0oKTtyZXR1cm4gY30pO3JldHVybiBjfX0pfSk7SShILFwicGFydHMvVGltZS5qc1wiLFtIW1wicGFydHMvR2xvYmFscy5qc1wiXV0sZnVuY3Rpb24oYSl7dmFyIEM9YS5kZWZpbmVkLEE9YS5leHRlbmQsRT1hLm1lcmdlLG09YS5waWNrLGc9YS50aW1lVW5pdHMsdj1hLndpbjthLlRpbWU9ZnVuY3Rpb24oYSl7dGhpcy51cGRhdGUoYSwhMSl9O2EuVGltZS5wcm90b3R5cGU9e2RlZmF1bHRPcHRpb25zOnt9LHVwZGF0ZTpmdW5jdGlvbihhKXt2YXIgZz1tKGEmJmEudXNlVVRDLCEwKSx6PXRoaXM7dGhpcy5vcHRpb25zPWE9RSghMCx0aGlzLm9wdGlvbnN8fHt9LGEpO3RoaXMuRGF0ZT1hLkRhdGV8fHYuRGF0ZXx8RGF0ZTt0aGlzLnRpbWV6b25lT2Zmc2V0PVxuKHRoaXMudXNlVVRDPWcpJiZhLnRpbWV6b25lT2Zmc2V0O3RoaXMuZ2V0VGltZXpvbmVPZmZzZXQ9dGhpcy50aW1lem9uZU9mZnNldEZ1bmN0aW9uKCk7KHRoaXMudmFyaWFibGVUaW1lem9uZT0hKGcmJiFhLmdldFRpbWV6b25lT2Zmc2V0JiYhYS50aW1lem9uZSkpfHx0aGlzLnRpbWV6b25lT2Zmc2V0Pyh0aGlzLmdldD1mdW5jdGlvbihhLGYpe3ZhciBoPWYuZ2V0VGltZSgpLHI9aC16LmdldFRpbWV6b25lT2Zmc2V0KGYpO2Yuc2V0VGltZShyKTthPWZbXCJnZXRVVENcIithXSgpO2Yuc2V0VGltZShoKTtyZXR1cm4gYX0sdGhpcy5zZXQ9ZnVuY3Rpb24oYSxmLGgpe3ZhciByO2lmKFwiTWlsbGlzZWNvbmRzXCI9PT1hfHxcIlNlY29uZHNcIj09PWF8fFwiTWludXRlc1wiPT09YSYmMD09PWYuZ2V0VGltZXpvbmVPZmZzZXQoKSU2MClmW1wic2V0XCIrYV0oaCk7ZWxzZSByPXouZ2V0VGltZXpvbmVPZmZzZXQoZikscj1mLmdldFRpbWUoKS1yLGYuc2V0VGltZShyKSxmW1wic2V0VVRDXCIrYV0oaCksYT16LmdldFRpbWV6b25lT2Zmc2V0KGYpLFxucj1mLmdldFRpbWUoKSthLGYuc2V0VGltZShyKX0pOmc/KHRoaXMuZ2V0PWZ1bmN0aW9uKGEsZil7cmV0dXJuIGZbXCJnZXRVVENcIithXSgpfSx0aGlzLnNldD1mdW5jdGlvbihhLGYsaCl7cmV0dXJuIGZbXCJzZXRVVENcIithXShoKX0pOih0aGlzLmdldD1mdW5jdGlvbihhLGYpe3JldHVybiBmW1wiZ2V0XCIrYV0oKX0sdGhpcy5zZXQ9ZnVuY3Rpb24oYSxmLGgpe3JldHVybiBmW1wic2V0XCIrYV0oaCl9KX0sbWFrZVRpbWU6ZnVuY3Rpb24oZyx2LHosbixmLGgpe3ZhciByLGUsYjt0aGlzLnVzZVVUQz8ocj10aGlzLkRhdGUuVVRDLmFwcGx5KDAsYXJndW1lbnRzKSxlPXRoaXMuZ2V0VGltZXpvbmVPZmZzZXQocikscis9ZSxiPXRoaXMuZ2V0VGltZXpvbmVPZmZzZXQociksZSE9PWI/cis9Yi1lOmUtMzZFNSE9PXRoaXMuZ2V0VGltZXpvbmVPZmZzZXQoci0zNkU1KXx8YS5pc1NhZmFyaXx8KHItPTM2RTUpKTpyPShuZXcgdGhpcy5EYXRlKGcsdixtKHosMSksbShuLDApLG0oZiwwKSxtKGgsMCkpKS5nZXRUaW1lKCk7XG5yZXR1cm4gcn0sdGltZXpvbmVPZmZzZXRGdW5jdGlvbjpmdW5jdGlvbigpe3ZhciBnPXRoaXMsbT10aGlzLm9wdGlvbnMsej12Lm1vbWVudDtpZighdGhpcy51c2VVVEMpcmV0dXJuIGZ1bmN0aW9uKGEpe3JldHVybiA2RTQqKG5ldyBEYXRlKGEpKS5nZXRUaW1lem9uZU9mZnNldCgpfTtpZihtLnRpbWV6b25lKXtpZih6KXJldHVybiBmdW5jdGlvbihhKXtyZXR1cm4gNkU0Ki16LnR6KGEsbS50aW1lem9uZSkudXRjT2Zmc2V0KCl9O2EuZXJyb3IoMjUpfXJldHVybiB0aGlzLnVzZVVUQyYmbS5nZXRUaW1lem9uZU9mZnNldD9mdW5jdGlvbihhKXtyZXR1cm4gNkU0Km0uZ2V0VGltZXpvbmVPZmZzZXQoYSl9OmZ1bmN0aW9uKCl7cmV0dXJuIDZFNCooZy50aW1lem9uZU9mZnNldHx8MCl9fSxkYXRlRm9ybWF0OmZ1bmN0aW9uKGcsbSx2KXtpZighYS5kZWZpbmVkKG0pfHxpc05hTihtKSlyZXR1cm4gYS5kZWZhdWx0T3B0aW9ucy5sYW5nLmludmFsaWREYXRlfHxcIlwiO2c9YS5waWNrKGcsXCIlWS0lbS0lZCAlSDolTTolU1wiKTtcbnZhciBuPXRoaXMsZj1uZXcgdGhpcy5EYXRlKG0pLGg9dGhpcy5nZXQoXCJIb3Vyc1wiLGYpLHI9dGhpcy5nZXQoXCJEYXlcIixmKSxlPXRoaXMuZ2V0KFwiRGF0ZVwiLGYpLGI9dGhpcy5nZXQoXCJNb250aFwiLGYpLGw9dGhpcy5nZXQoXCJGdWxsWWVhclwiLGYpLGM9YS5kZWZhdWx0T3B0aW9ucy5sYW5nLHQ9Yy53ZWVrZGF5cyxGPWMuc2hvcnRXZWVrZGF5cyx3PWEucGFkLGY9YS5leHRlbmQoe2E6Rj9GW3JdOnRbcl0uc3Vic3RyKDAsMyksQTp0W3JdLGQ6dyhlKSxlOncoZSwyLFwiIFwiKSx3OnIsYjpjLnNob3J0TW9udGhzW2JdLEI6Yy5tb250aHNbYl0sbTp3KGIrMSksbzpiKzEseTpsLnRvU3RyaW5nKCkuc3Vic3RyKDIsMiksWTpsLEg6dyhoKSxrOmgsSTp3KGglMTJ8fDEyKSxsOmglMTJ8fDEyLE06dyhuLmdldChcIk1pbnV0ZXNcIixmKSkscDoxMj5oP1wiQU1cIjpcIlBNXCIsUDoxMj5oP1wiYW1cIjpcInBtXCIsUzp3KGYuZ2V0U2Vjb25kcygpKSxMOncoTWF0aC5mbG9vcihtJTFFMyksMyl9LGEuZGF0ZUZvcm1hdHMpO1xuYS5vYmplY3RFYWNoKGYsZnVuY3Rpb24oYSxiKXtmb3IoOy0xIT09Zy5pbmRleE9mKFwiJVwiK2IpOylnPWcucmVwbGFjZShcIiVcIitiLFwiZnVuY3Rpb25cIj09PXR5cGVvZiBhP2EuY2FsbChuLG0pOmEpfSk7cmV0dXJuIHY/Zy5zdWJzdHIoMCwxKS50b1VwcGVyQ2FzZSgpK2cuc3Vic3RyKDEpOmd9LHJlc29sdmVEVExGb3JtYXQ6ZnVuY3Rpb24oZyl7cmV0dXJuIGEuaXNPYmplY3QoZywhMCk/ZzooZz1hLnNwbGF0KGcpLHttYWluOmdbMF0sZnJvbTpnWzFdLHRvOmdbMl19KX0sZ2V0VGltZVRpY2tzOmZ1bmN0aW9uKGEsdix6LG4pe3ZhciBmPXRoaXMsaD1bXSxyLGU9e30sYjtyPW5ldyBmLkRhdGUodik7dmFyIGw9YS51bml0UmFuZ2UsYz1hLmNvdW50fHwxLHQ7bj1tKG4sMSk7aWYoQyh2KSl7Zi5zZXQoXCJNaWxsaXNlY29uZHNcIixyLGw+PWcuc2Vjb25kPzA6YypNYXRoLmZsb29yKGYuZ2V0KFwiTWlsbGlzZWNvbmRzXCIscikvYykpO2w+PWcuc2Vjb25kJiZmLnNldChcIlNlY29uZHNcIixyLGw+PVxuZy5taW51dGU/MDpjKk1hdGguZmxvb3IoZi5nZXQoXCJTZWNvbmRzXCIscikvYykpO2w+PWcubWludXRlJiZmLnNldChcIk1pbnV0ZXNcIixyLGw+PWcuaG91cj8wOmMqTWF0aC5mbG9vcihmLmdldChcIk1pbnV0ZXNcIixyKS9jKSk7bD49Zy5ob3VyJiZmLnNldChcIkhvdXJzXCIscixsPj1nLmRheT8wOmMqTWF0aC5mbG9vcihmLmdldChcIkhvdXJzXCIscikvYykpO2w+PWcuZGF5JiZmLnNldChcIkRhdGVcIixyLGw+PWcubW9udGg/MTpNYXRoLm1heCgxLGMqTWF0aC5mbG9vcihmLmdldChcIkRhdGVcIixyKS9jKSkpO2w+PWcubW9udGgmJihmLnNldChcIk1vbnRoXCIscixsPj1nLnllYXI/MDpjKk1hdGguZmxvb3IoZi5nZXQoXCJNb250aFwiLHIpL2MpKSxiPWYuZ2V0KFwiRnVsbFllYXJcIixyKSk7bD49Zy55ZWFyJiZmLnNldChcIkZ1bGxZZWFyXCIscixiLWIlYyk7bD09PWcud2VlayYmKGI9Zi5nZXQoXCJEYXlcIixyKSxmLnNldChcIkRhdGVcIixyLGYuZ2V0KFwiRGF0ZVwiLHIpLWIrbisoYjxuPy03OjApKSk7Yj1mLmdldChcIkZ1bGxZZWFyXCIsXG5yKTtuPWYuZ2V0KFwiTW9udGhcIixyKTt2YXIgRj1mLmdldChcIkRhdGVcIixyKSx3PWYuZ2V0KFwiSG91cnNcIixyKTt2PXIuZ2V0VGltZSgpO2YudmFyaWFibGVUaW1lem9uZSYmKHQ9ei12PjQqZy5tb250aHx8Zi5nZXRUaW1lem9uZU9mZnNldCh2KSE9PWYuZ2V0VGltZXpvbmVPZmZzZXQoeikpO3Y9ci5nZXRUaW1lKCk7Zm9yKHI9MTt2PHo7KWgucHVzaCh2KSx2PWw9PT1nLnllYXI/Zi5tYWtlVGltZShiK3IqYywwKTpsPT09Zy5tb250aD9mLm1ha2VUaW1lKGIsbityKmMpOiF0fHxsIT09Zy5kYXkmJmwhPT1nLndlZWs/dCYmbD09PWcuaG91ciYmMTxjP2YubWFrZVRpbWUoYixuLEYsdytyKmMpOnYrbCpjOmYubWFrZVRpbWUoYixuLEYrcipjKihsPT09Zy5kYXk/MTo3KSkscisrO2gucHVzaCh2KTtsPD1nLmhvdXImJjFFND5oLmxlbmd0aCYmaC5mb3JFYWNoKGZ1bmN0aW9uKGEpezA9PT1hJTE4RTUmJlwiMDAwMDAwMDAwXCI9PT1mLmRhdGVGb3JtYXQoXCIlSCVNJVMlTFwiLGEpJiYoZVthXT1cImRheVwiKX0pfWguaW5mbz1cbkEoYSx7aGlnaGVyUmFua3M6ZSx0b3RhbFJhbmdlOmwqY30pO3JldHVybiBofX19KTtJKEgsXCJwYXJ0cy9PcHRpb25zLmpzXCIsW0hbXCJwYXJ0cy9HbG9iYWxzLmpzXCJdXSxmdW5jdGlvbihhKXt2YXIgQz1hLmNvbG9yLEE9YS5tZXJnZTthLmRlZmF1bHRPcHRpb25zPXtjb2xvcnM6XCIjN2NiNWVjICM0MzQzNDggIzkwZWQ3ZCAjZjdhMzVjICM4MDg1ZTkgI2YxNWM4MCAjZTRkMzU0ICMyYjkwOGYgI2Y0NWI1YiAjOTFlOGUxXCIuc3BsaXQoXCIgXCIpLHN5bWJvbHM6W1wiY2lyY2xlXCIsXCJkaWFtb25kXCIsXCJzcXVhcmVcIixcInRyaWFuZ2xlXCIsXCJ0cmlhbmdsZS1kb3duXCJdLGxhbmc6e2xvYWRpbmc6XCJMb2FkaW5nLi4uXCIsbW9udGhzOlwiSmFudWFyeSBGZWJydWFyeSBNYXJjaCBBcHJpbCBNYXkgSnVuZSBKdWx5IEF1Z3VzdCBTZXB0ZW1iZXIgT2N0b2JlciBOb3ZlbWJlciBEZWNlbWJlclwiLnNwbGl0KFwiIFwiKSxzaG9ydE1vbnRoczpcIkphbiBGZWIgTWFyIEFwciBNYXkgSnVuIEp1bCBBdWcgU2VwIE9jdCBOb3YgRGVjXCIuc3BsaXQoXCIgXCIpLFxud2Vla2RheXM6XCJTdW5kYXkgTW9uZGF5IFR1ZXNkYXkgV2VkbmVzZGF5IFRodXJzZGF5IEZyaWRheSBTYXR1cmRheVwiLnNwbGl0KFwiIFwiKSxkZWNpbWFsUG9pbnQ6XCIuXCIsbnVtZXJpY1N5bWJvbHM6XCJrTUdUUEVcIi5zcGxpdChcIlwiKSxyZXNldFpvb206XCJSZXNldCB6b29tXCIscmVzZXRab29tVGl0bGU6XCJSZXNldCB6b29tIGxldmVsIDE6MVwiLHRob3VzYW5kc1NlcDpcIiBcIn0sZ2xvYmFsOnt9LHRpbWU6YS5UaW1lLnByb3RvdHlwZS5kZWZhdWx0T3B0aW9ucyxjaGFydDp7c3R5bGVkTW9kZTohMSxib3JkZXJSYWRpdXM6MCxjb2xvckNvdW50OjEwLGRlZmF1bHRTZXJpZXNUeXBlOlwibGluZVwiLGlnbm9yZUhpZGRlblNlcmllczohMCxzcGFjaW5nOlsxMCwxMCwxNSwxMF0scmVzZXRab29tQnV0dG9uOnt0aGVtZTp7ekluZGV4OjZ9LHBvc2l0aW9uOnthbGlnbjpcInJpZ2h0XCIseDotMTAseToxMH19LHdpZHRoOm51bGwsaGVpZ2h0Om51bGwsYm9yZGVyQ29sb3I6XCIjMzM1Y2FkXCIsYmFja2dyb3VuZENvbG9yOlwiI2ZmZmZmZlwiLFxucGxvdEJvcmRlckNvbG9yOlwiI2NjY2NjY1wifSx0aXRsZTp7dGV4dDpcIkNoYXJ0IHRpdGxlXCIsYWxpZ246XCJjZW50ZXJcIixtYXJnaW46MTUsd2lkdGhBZGp1c3Q6LTQ0fSxzdWJ0aXRsZTp7dGV4dDpcIlwiLGFsaWduOlwiY2VudGVyXCIsd2lkdGhBZGp1c3Q6LTQ0fSxwbG90T3B0aW9uczp7fSxsYWJlbHM6e3N0eWxlOntwb3NpdGlvbjpcImFic29sdXRlXCIsY29sb3I6XCIjMzMzMzMzXCJ9fSxsZWdlbmQ6e2VuYWJsZWQ6ITAsYWxpZ246XCJjZW50ZXJcIixhbGlnbkNvbHVtbnM6ITAsbGF5b3V0OlwiaG9yaXpvbnRhbFwiLGxhYmVsRm9ybWF0dGVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubmFtZX0sYm9yZGVyQ29sb3I6XCIjOTk5OTk5XCIsYm9yZGVyUmFkaXVzOjAsbmF2aWdhdGlvbjp7YWN0aXZlQ29sb3I6XCIjMDAzMzk5XCIsaW5hY3RpdmVDb2xvcjpcIiNjY2NjY2NcIn0saXRlbVN0eWxlOntjb2xvcjpcIiMzMzMzMzNcIixjdXJzb3I6XCJwb2ludGVyXCIsZm9udFNpemU6XCIxMnB4XCIsZm9udFdlaWdodDpcImJvbGRcIixcbnRleHRPdmVyZmxvdzpcImVsbGlwc2lzXCJ9LGl0ZW1Ib3ZlclN0eWxlOntjb2xvcjpcIiMwMDAwMDBcIn0saXRlbUhpZGRlblN0eWxlOntjb2xvcjpcIiNjY2NjY2NcIn0sc2hhZG93OiExLGl0ZW1DaGVja2JveFN0eWxlOntwb3NpdGlvbjpcImFic29sdXRlXCIsd2lkdGg6XCIxM3B4XCIsaGVpZ2h0OlwiMTNweFwifSxzcXVhcmVTeW1ib2w6ITAsc3ltYm9sUGFkZGluZzo1LHZlcnRpY2FsQWxpZ246XCJib3R0b21cIix4OjAseTowLHRpdGxlOntzdHlsZTp7Zm9udFdlaWdodDpcImJvbGRcIn19fSxsb2FkaW5nOntsYWJlbFN0eWxlOntmb250V2VpZ2h0OlwiYm9sZFwiLHBvc2l0aW9uOlwicmVsYXRpdmVcIix0b3A6XCI0NSVcIn0sc3R5bGU6e3Bvc2l0aW9uOlwiYWJzb2x1dGVcIixiYWNrZ3JvdW5kQ29sb3I6XCIjZmZmZmZmXCIsb3BhY2l0eTouNSx0ZXh0QWxpZ246XCJjZW50ZXJcIn19LHRvb2x0aXA6e2VuYWJsZWQ6ITAsYW5pbWF0aW9uOmEuc3ZnLGJvcmRlclJhZGl1czozLGRhdGVUaW1lTGFiZWxGb3JtYXRzOnttaWxsaXNlY29uZDpcIiVBLCAlYiAlZSwgJUg6JU06JVMuJUxcIixcbnNlY29uZDpcIiVBLCAlYiAlZSwgJUg6JU06JVNcIixtaW51dGU6XCIlQSwgJWIgJWUsICVIOiVNXCIsaG91cjpcIiVBLCAlYiAlZSwgJUg6JU1cIixkYXk6XCIlQSwgJWIgJWUsICVZXCIsd2VlazpcIldlZWsgZnJvbSAlQSwgJWIgJWUsICVZXCIsbW9udGg6XCIlQiAlWVwiLHllYXI6XCIlWVwifSxmb290ZXJGb3JtYXQ6XCJcIixwYWRkaW5nOjgsc25hcDphLmlzVG91Y2hEZXZpY2U/MjU6MTAsaGVhZGVyRm9ybWF0OidcXHgzY3NwYW4gc3R5bGVcXHgzZFwiZm9udC1zaXplOiAxMHB4XCJcXHgzZXtwb2ludC5rZXl9XFx4M2Mvc3BhblxceDNlXFx4M2Nici9cXHgzZScscG9pbnRGb3JtYXQ6J1xceDNjc3BhbiBzdHlsZVxceDNkXCJjb2xvcjp7cG9pbnQuY29sb3J9XCJcXHgzZVxcdTI1Y2ZcXHgzYy9zcGFuXFx4M2Uge3Nlcmllcy5uYW1lfTogXFx4M2NiXFx4M2V7cG9pbnQueX1cXHgzYy9iXFx4M2VcXHgzY2JyL1xceDNlJyxiYWNrZ3JvdW5kQ29sb3I6QyhcIiNmN2Y3ZjdcIikuc2V0T3BhY2l0eSguODUpLmdldCgpLGJvcmRlcldpZHRoOjEsc2hhZG93OiEwLFxuc3R5bGU6e2NvbG9yOlwiIzMzMzMzM1wiLGN1cnNvcjpcImRlZmF1bHRcIixmb250U2l6ZTpcIjEycHhcIixwb2ludGVyRXZlbnRzOlwibm9uZVwiLHdoaXRlU3BhY2U6XCJub3dyYXBcIn19LGNyZWRpdHM6e2VuYWJsZWQ6ITAsaHJlZjpcImh0dHBzOi8vd3d3LmhpZ2hjaGFydHMuY29tP2NyZWRpdHNcIixwb3NpdGlvbjp7YWxpZ246XCJyaWdodFwiLHg6LTEwLHZlcnRpY2FsQWxpZ246XCJib3R0b21cIix5Oi01fSxzdHlsZTp7Y3Vyc29yOlwicG9pbnRlclwiLGNvbG9yOlwiIzk5OTk5OVwiLGZvbnRTaXplOlwiOXB4XCJ9LHRleHQ6XCJIaWdoY2hhcnRzLmNvbVwifX07YS5zZXRPcHRpb25zPWZ1bmN0aW9uKEMpe2EuZGVmYXVsdE9wdGlvbnM9QSghMCxhLmRlZmF1bHRPcHRpb25zLEMpO2EudGltZS51cGRhdGUoQShhLmRlZmF1bHRPcHRpb25zLmdsb2JhbCxhLmRlZmF1bHRPcHRpb25zLnRpbWUpLCExKTtyZXR1cm4gYS5kZWZhdWx0T3B0aW9uc307YS5nZXRPcHRpb25zPWZ1bmN0aW9uKCl7cmV0dXJuIGEuZGVmYXVsdE9wdGlvbnN9O1xuYS5kZWZhdWx0UGxvdE9wdGlvbnM9YS5kZWZhdWx0T3B0aW9ucy5wbG90T3B0aW9uczthLnRpbWU9bmV3IGEuVGltZShBKGEuZGVmYXVsdE9wdGlvbnMuZ2xvYmFsLGEuZGVmYXVsdE9wdGlvbnMudGltZSkpO2EuZGF0ZUZvcm1hdD1mdW5jdGlvbihBLG0sZyl7cmV0dXJuIGEudGltZS5kYXRlRm9ybWF0KEEsbSxnKX07XCJcIn0pO0koSCxcInBhcnRzL1RpY2suanNcIixbSFtcInBhcnRzL0dsb2JhbHMuanNcIl1dLGZ1bmN0aW9uKGEpe3ZhciBDPWEuY29ycmVjdEZsb2F0LEE9YS5kZWZpbmVkLEU9YS5kZXN0cm95T2JqZWN0UHJvcGVydGllcyxtPWEuZmlyZUV2ZW50LGc9YS5pc051bWJlcix2PWEubWVyZ2UseD1hLnBpY2sseT1hLmRlZzJyYWQ7YS5UaWNrPWZ1bmN0aW9uKGEsbixmLGgscil7dGhpcy5heGlzPWE7dGhpcy5wb3M9bjt0aGlzLnR5cGU9Znx8XCJcIjt0aGlzLmlzTmV3TGFiZWw9dGhpcy5pc05ldz0hMDt0aGlzLnBhcmFtZXRlcnM9cnx8e307dGhpcy50aWNrbWFya09mZnNldD10aGlzLnBhcmFtZXRlcnMudGlja21hcmtPZmZzZXQ7XG50aGlzLm9wdGlvbnM9dGhpcy5wYXJhbWV0ZXJzLm9wdGlvbnM7Znx8aHx8dGhpcy5hZGRMYWJlbCgpfTthLlRpY2sucHJvdG90eXBlPXthZGRMYWJlbDpmdW5jdGlvbigpe3ZhciBnPXRoaXMsbj1nLmF4aXMsZj1uLm9wdGlvbnMsaD1uLmNoYXJ0LHI9bi5jYXRlZ29yaWVzLGU9bi5uYW1lcyxiPWcucG9zLGw9eChnLm9wdGlvbnMmJmcub3B0aW9ucy5sYWJlbHMsZi5sYWJlbHMpLGM9bi50aWNrUG9zaXRpb25zLHQ9Yj09PWNbMF0sRj1iPT09Y1tjLmxlbmd0aC0xXSxyPXRoaXMucGFyYW1ldGVycy5jYXRlZ29yeXx8KHI/eChyW2JdLGVbYl0sYik6Yiksdz1nLmxhYmVsLGM9Yy5pbmZvLEIscCxkLGs7bi5pc0RhdGV0aW1lQXhpcyYmYyYmKHA9aC50aW1lLnJlc29sdmVEVExGb3JtYXQoZi5kYXRlVGltZUxhYmVsRm9ybWF0c1shZi5ncmlkJiZjLmhpZ2hlclJhbmtzW2JdfHxjLnVuaXROYW1lXSksQj1wLm1haW4pO2cuaXNGaXJzdD10O2cuaXNMYXN0PUY7Zy5mb3JtYXRDdHg9e2F4aXM6bixcbmNoYXJ0OmgsaXNGaXJzdDp0LGlzTGFzdDpGLGRhdGVUaW1lTGFiZWxGb3JtYXQ6Qix0aWNrUG9zaXRpb25JbmZvOmMsdmFsdWU6bi5pc0xvZz9DKG4ubGluMmxvZyhyKSk6cixwb3M6Yn07Zj1uLmxhYmVsRm9ybWF0dGVyLmNhbGwoZy5mb3JtYXRDdHgsdGhpcy5mb3JtYXRDdHgpO2lmKGs9cCYmcC5saXN0KWcuc2hvcnRlbkxhYmVsPWZ1bmN0aW9uKCl7Zm9yKGQ9MDtkPGsubGVuZ3RoO2QrKylpZih3LmF0dHIoe3RleHQ6bi5sYWJlbEZvcm1hdHRlci5jYWxsKGEuZXh0ZW5kKGcuZm9ybWF0Q3R4LHtkYXRlVGltZUxhYmVsRm9ybWF0OmtbZF19KSl9KSx3LmdldEJCb3goKS53aWR0aDxuLmdldFNsb3RXaWR0aChnKS0yKngobC5wYWRkaW5nLDUpKXJldHVybjt3LmF0dHIoe3RleHQ6XCJcIn0pfTtpZihBKHcpKXcmJncudGV4dFN0ciE9PWYmJighdy50ZXh0V2lkdGh8fGwuc3R5bGUmJmwuc3R5bGUud2lkdGh8fHcuc3R5bGVzLndpZHRofHx3LmNzcyh7d2lkdGg6bnVsbH0pLHcuYXR0cih7dGV4dDpmfSksXG53LnRleHRQeExlbmd0aD13LmdldEJCb3goKS53aWR0aCk7ZWxzZXtpZihnLmxhYmVsPXc9QShmKSYmbC5lbmFibGVkP2gucmVuZGVyZXIudGV4dChmLDAsMCxsLnVzZUhUTUwpLmFkZChuLmxhYmVsR3JvdXApOm51bGwpaC5zdHlsZWRNb2RlfHx3LmNzcyh2KGwuc3R5bGUpKSx3LnRleHRQeExlbmd0aD13LmdldEJCb3goKS53aWR0aDtnLnJvdGF0aW9uPTB9fSxnZXRMYWJlbFNpemU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sYWJlbD90aGlzLmxhYmVsLmdldEJCb3goKVt0aGlzLmF4aXMuaG9yaXo/XCJoZWlnaHRcIjpcIndpZHRoXCJdOjB9LGhhbmRsZU92ZXJmbG93OmZ1bmN0aW9uKGEpe3ZhciBuPXRoaXMuYXhpcyxmPW4ub3B0aW9ucy5sYWJlbHMsaD1hLngscj1uLmNoYXJ0LmNoYXJ0V2lkdGgsZT1uLmNoYXJ0LnNwYWNpbmcsYj14KG4ubGFiZWxMZWZ0LE1hdGgubWluKG4ucG9zLGVbM10pKSxlPXgobi5sYWJlbFJpZ2h0LE1hdGgubWF4KG4uaXNSYWRpYWw/MDpuLnBvcytuLmxlbixyLVxuZVsxXSkpLGw9dGhpcy5sYWJlbCxjPXRoaXMucm90YXRpb24sdD17bGVmdDowLGNlbnRlcjouNSxyaWdodDoxfVtuLmxhYmVsQWxpZ258fGwuYXR0cihcImFsaWduXCIpXSxnPWwuZ2V0QkJveCgpLndpZHRoLHc9bi5nZXRTbG90V2lkdGgodGhpcyksQj13LHA9MSxkLGs9e307aWYoY3x8XCJqdXN0aWZ5XCIhPT14KGYub3ZlcmZsb3csXCJqdXN0aWZ5XCIpKTA+YyYmaC10Kmc8Yj9kPU1hdGgucm91bmQoaC9NYXRoLmNvcyhjKnkpLWIpOjA8YyYmaCt0Kmc+ZSYmKGQ9TWF0aC5yb3VuZCgoci1oKS9NYXRoLmNvcyhjKnkpKSk7ZWxzZSBpZihyPWgrKDEtdCkqZyxoLXQqZzxiP0I9YS54K0IqKDEtdCktYjpyPmUmJihCPWUtYS54K0IqdCxwPS0xKSxCPU1hdGgubWluKHcsQiksQjx3JiZcImNlbnRlclwiPT09bi5sYWJlbEFsaWduJiYoYS54Kz1wKih3LUItdCoody1NYXRoLm1pbihnLEIpKSkpLGc+Qnx8bi5hdXRvUm90YXRpb24mJihsLnN0eWxlc3x8e30pLndpZHRoKWQ9QjtkJiYodGhpcy5zaG9ydGVuTGFiZWw/XG50aGlzLnNob3J0ZW5MYWJlbCgpOihrLndpZHRoPU1hdGguZmxvb3IoZCksKGYuc3R5bGV8fHt9KS50ZXh0T3ZlcmZsb3d8fChrLnRleHRPdmVyZmxvdz1cImVsbGlwc2lzXCIpLGwuY3NzKGspKSl9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGcsbixmLGgpe3ZhciByPXRoaXMuYXhpcyxlPXIuY2hhcnQsYj1oJiZlLm9sZENoYXJ0SGVpZ2h0fHxlLmNoYXJ0SGVpZ2h0O2c9e3g6Zz9hLmNvcnJlY3RGbG9hdChyLnRyYW5zbGF0ZShuK2YsbnVsbCxudWxsLGgpK3IudHJhbnNCKTpyLmxlZnQrci5vZmZzZXQrKHIub3Bwb3NpdGU/KGgmJmUub2xkQ2hhcnRXaWR0aHx8ZS5jaGFydFdpZHRoKS1yLnJpZ2h0LXIubGVmdDowKSx5Omc/Yi1yLmJvdHRvbStyLm9mZnNldC0oci5vcHBvc2l0ZT9yLmhlaWdodDowKTphLmNvcnJlY3RGbG9hdChiLXIudHJhbnNsYXRlKG4rZixudWxsLG51bGwsaCktci50cmFuc0IpfTtnLnk9TWF0aC5tYXgoTWF0aC5taW4oZy55LDFFNSksLTFFNSk7bSh0aGlzLFwiYWZ0ZXJHZXRQb3NpdGlvblwiLFxue3BvczpnfSk7cmV0dXJuIGd9LGdldExhYmVsUG9zaXRpb246ZnVuY3Rpb24oYSxuLGYsaCxyLGUsYixsKXt2YXIgYz10aGlzLmF4aXMsdD1jLnRyYW5zQSxnPWMucmV2ZXJzZWQsdz1jLnN0YWdnZXJMaW5lcyxCPWMudGlja1JvdENvcnJ8fHt4OjAseTowfSxwPXIueSxkPWh8fGMucmVzZXJ2ZVNwYWNlRGVmYXVsdD8wOi1jLmxhYmVsT2Zmc2V0KihcImNlbnRlclwiPT09Yy5sYWJlbEFsaWduPy41OjEpLGs9e307QShwKXx8KHA9MD09PWMuc2lkZT9mLnJvdGF0aW9uPy04Oi1mLmdldEJCb3goKS5oZWlnaHQ6Mj09PWMuc2lkZT9CLnkrODpNYXRoLmNvcyhmLnJvdGF0aW9uKnkpKihCLnktZi5nZXRCQm94KCExLDApLmhlaWdodC8yKSk7YT1hK3IueCtkK0IueC0oZSYmaD9lKnQqKGc/LTE6MSk6MCk7bj1uK3AtKGUmJiFoP2UqdCooZz8xOi0xKTowKTt3JiYoZj1iLyhsfHwxKSV3LGMub3Bwb3NpdGUmJihmPXctZi0xKSxuKz1jLmxhYmVsT2Zmc2V0L3cqZik7ay54PWE7ay55PU1hdGgucm91bmQobik7XG5tKHRoaXMsXCJhZnRlckdldExhYmVsUG9zaXRpb25cIix7cG9zOmssdGlja21hcmtPZmZzZXQ6ZSxpbmRleDpifSk7cmV0dXJuIGt9LGdldE1hcmtQYXRoOmZ1bmN0aW9uKGEsbixmLGgscixlKXtyZXR1cm4gZS5jcmlzcExpbmUoW1wiTVwiLGEsbixcIkxcIixhKyhyPzA6LWYpLG4rKHI/ZjowKV0saCl9LHJlbmRlckdyaWRMaW5lOmZ1bmN0aW9uKGEsbixmKXt2YXIgaD10aGlzLmF4aXMscj1oLm9wdGlvbnMsZT10aGlzLmdyaWRMaW5lLGI9e30sbD10aGlzLnBvcyxjPXRoaXMudHlwZSx0PXgodGhpcy50aWNrbWFya09mZnNldCxoLnRpY2ttYXJrT2Zmc2V0KSxnPWguY2hhcnQucmVuZGVyZXIsdz1jP2MrXCJHcmlkXCI6XCJncmlkXCIsQj1yW3crXCJMaW5lV2lkdGhcIl0scD1yW3crXCJMaW5lQ29sb3JcIl0scj1yW3crXCJMaW5lRGFzaFN0eWxlXCJdO2V8fChoLmNoYXJ0LnN0eWxlZE1vZGV8fChiLnN0cm9rZT1wLGJbXCJzdHJva2Utd2lkdGhcIl09QixyJiYoYi5kYXNoc3R5bGU9cikpLGN8fChiLnpJbmRleD1cbjEpLGEmJihuPTApLHRoaXMuZ3JpZExpbmU9ZT1nLnBhdGgoKS5hdHRyKGIpLmFkZENsYXNzKFwiaGlnaGNoYXJ0cy1cIisoYz9jK1wiLVwiOlwiXCIpK1wiZ3JpZC1saW5lXCIpLmFkZChoLmdyaWRHcm91cCkpO2lmKGUmJihmPWguZ2V0UGxvdExpbmVQYXRoKHt2YWx1ZTpsK3QsbGluZVdpZHRoOmUuc3Ryb2tlV2lkdGgoKSpmLGZvcmNlOlwicGFzc1wiLG9sZDphfSkpKWVbYXx8dGhpcy5pc05ldz9cImF0dHJcIjpcImFuaW1hdGVcIl0oe2Q6ZixvcGFjaXR5Om59KX0scmVuZGVyTWFyazpmdW5jdGlvbihhLG4sZil7dmFyIGg9dGhpcy5heGlzLHI9aC5vcHRpb25zLGU9aC5jaGFydC5yZW5kZXJlcixiPXRoaXMudHlwZSxsPWI/YitcIlRpY2tcIjpcInRpY2tcIixjPWgudGlja1NpemUobCksdD10aGlzLm1hcmssZz0hdCx3PWEueDthPWEueTt2YXIgQj14KHJbbCtcIldpZHRoXCJdLCFiJiZoLmlzWEF4aXM/MTowKSxyPXJbbCtcIkNvbG9yXCJdO2MmJihoLm9wcG9zaXRlJiYoY1swXT0tY1swXSksZyYmKHRoaXMubWFyaz1cbnQ9ZS5wYXRoKCkuYWRkQ2xhc3MoXCJoaWdoY2hhcnRzLVwiKyhiP2IrXCItXCI6XCJcIikrXCJ0aWNrXCIpLmFkZChoLmF4aXNHcm91cCksaC5jaGFydC5zdHlsZWRNb2RlfHx0LmF0dHIoe3N0cm9rZTpyLFwic3Ryb2tlLXdpZHRoXCI6Qn0pKSx0W2c/XCJhdHRyXCI6XCJhbmltYXRlXCJdKHtkOnRoaXMuZ2V0TWFya1BhdGgodyxhLGNbMF0sdC5zdHJva2VXaWR0aCgpKmYsaC5ob3JpeixlKSxvcGFjaXR5Om59KSl9LHJlbmRlckxhYmVsOmZ1bmN0aW9uKGEsbixmLGgpe3ZhciByPXRoaXMuYXhpcyxlPXIuaG9yaXosYj1yLm9wdGlvbnMsbD10aGlzLmxhYmVsLGM9Yi5sYWJlbHMsdD1jLnN0ZXAscj14KHRoaXMudGlja21hcmtPZmZzZXQsci50aWNrbWFya09mZnNldCksRj0hMCx3PWEueDthPWEueTtsJiZnKHcpJiYobC54eT1hPXRoaXMuZ2V0TGFiZWxQb3NpdGlvbih3LGEsbCxlLGMscixoLHQpLHRoaXMuaXNGaXJzdCYmIXRoaXMuaXNMYXN0JiYheChiLnNob3dGaXJzdExhYmVsLDEpfHx0aGlzLmlzTGFzdCYmXG4hdGhpcy5pc0ZpcnN0JiYheChiLnNob3dMYXN0TGFiZWwsMSk/Rj0hMTohZXx8Yy5zdGVwfHxjLnJvdGF0aW9ufHxufHwwPT09Znx8dGhpcy5oYW5kbGVPdmVyZmxvdyhhKSx0JiZoJXQmJihGPSExKSxGJiZnKGEueSk/KGEub3BhY2l0eT1mLGxbdGhpcy5pc05ld0xhYmVsP1wiYXR0clwiOlwiYW5pbWF0ZVwiXShhKSx0aGlzLmlzTmV3TGFiZWw9ITEpOihsLmF0dHIoXCJ5XCIsLTk5OTkpLHRoaXMuaXNOZXdMYWJlbD0hMCkpfSxyZW5kZXI6ZnVuY3Rpb24oZyxuLGYpe3ZhciBoPXRoaXMuYXhpcyxyPWguaG9yaXosZT10aGlzLnBvcyxiPXgodGhpcy50aWNrbWFya09mZnNldCxoLnRpY2ttYXJrT2Zmc2V0KSxlPXRoaXMuZ2V0UG9zaXRpb24ocixlLGIsbiksYj1lLngsbD1lLnksaD1yJiZiPT09aC5wb3MraC5sZW58fCFyJiZsPT09aC5wb3M/LTE6MTtmPXgoZiwxKTt0aGlzLmlzQWN0aXZlPSEwO3RoaXMucmVuZGVyR3JpZExpbmUobixmLGgpO3RoaXMucmVuZGVyTWFyayhlLGYsaCk7dGhpcy5yZW5kZXJMYWJlbChlLFxubixmLGcpO3RoaXMuaXNOZXc9ITE7YS5maXJlRXZlbnQodGhpcyxcImFmdGVyUmVuZGVyXCIpfSxkZXN0cm95OmZ1bmN0aW9uKCl7RSh0aGlzLHRoaXMuYXhpcyl9fX0pO0koSCxcInBhcnRzL0F4aXMuanNcIixbSFtcInBhcnRzL0dsb2JhbHMuanNcIl1dLGZ1bmN0aW9uKGEpe3ZhciBDPWEuYWRkRXZlbnQsQT1hLmFuaW1PYmplY3QsRT1hLmFycmF5TWF4LG09YS5hcnJheU1pbixnPWEuY29sb3Isdj1hLmNvcnJlY3RGbG9hdCx4PWEuZGVmYXVsdE9wdGlvbnMseT1hLmRlZmluZWQsej1hLmRlZzJyYWQsbj1hLmRlc3Ryb3lPYmplY3RQcm9wZXJ0aWVzLGY9YS5leHRlbmQsaD1hLmZpcmVFdmVudCxyPWEuZm9ybWF0LGU9YS5nZXRNYWduaXR1ZGUsYj1hLmlzQXJyYXksbD1hLmlzTnVtYmVyLGM9YS5pc1N0cmluZyx0PWEubWVyZ2UsRj1hLm5vcm1hbGl6ZVRpY2tJbnRlcnZhbCx3PWEub2JqZWN0RWFjaCxCPWEucGljayxwPWEucmVtb3ZlRXZlbnQsZD1hLnNlcmllc1R5cGVzLGs9YS5zcGxhdCx1PVxuYS5zeW5jVGltZW91dCxEPWEuVGljayxHPWZ1bmN0aW9uKCl7dGhpcy5pbml0LmFwcGx5KHRoaXMsYXJndW1lbnRzKX07YS5leHRlbmQoRy5wcm90b3R5cGUse2RlZmF1bHRPcHRpb25zOntkYXRlVGltZUxhYmVsRm9ybWF0czp7bWlsbGlzZWNvbmQ6e21haW46XCIlSDolTTolUy4lTFwiLHJhbmdlOiExfSxzZWNvbmQ6e21haW46XCIlSDolTTolU1wiLHJhbmdlOiExfSxtaW51dGU6e21haW46XCIlSDolTVwiLHJhbmdlOiExfSxob3VyOnttYWluOlwiJUg6JU1cIixyYW5nZTohMX0sZGF5OnttYWluOlwiJWUuICViXCJ9LHdlZWs6e21haW46XCIlZS4gJWJcIn0sbW9udGg6e21haW46XCIlYiAnJXlcIn0seWVhcjp7bWFpbjpcIiVZXCJ9fSxlbmRPblRpY2s6ITEsbGFiZWxzOntlbmFibGVkOiEwLGluZGVudGF0aW9uOjEwLHg6MCxzdHlsZTp7Y29sb3I6XCIjNjY2NjY2XCIsY3Vyc29yOlwiZGVmYXVsdFwiLGZvbnRTaXplOlwiMTFweFwifX0sbWF4UGFkZGluZzouMDEsbWlub3JUaWNrTGVuZ3RoOjIsbWlub3JUaWNrUG9zaXRpb246XCJvdXRzaWRlXCIsXG5taW5QYWRkaW5nOi4wMSxzaG93RW1wdHk6ITAsc3RhcnRPZldlZWs6MSxzdGFydE9uVGljazohMSx0aWNrTGVuZ3RoOjEwLHRpY2tQaXhlbEludGVydmFsOjEwMCx0aWNrbWFya1BsYWNlbWVudDpcImJldHdlZW5cIix0aWNrUG9zaXRpb246XCJvdXRzaWRlXCIsdGl0bGU6e2FsaWduOlwibWlkZGxlXCIsc3R5bGU6e2NvbG9yOlwiIzY2NjY2NlwifX0sdHlwZTpcImxpbmVhclwiLG1pbm9yR3JpZExpbmVDb2xvcjpcIiNmMmYyZjJcIixtaW5vckdyaWRMaW5lV2lkdGg6MSxtaW5vclRpY2tDb2xvcjpcIiM5OTk5OTlcIixsaW5lQ29sb3I6XCIjY2NkNmViXCIsbGluZVdpZHRoOjEsZ3JpZExpbmVDb2xvcjpcIiNlNmU2ZTZcIix0aWNrQ29sb3I6XCIjY2NkNmViXCJ9LGRlZmF1bHRZQXhpc09wdGlvbnM6e2VuZE9uVGljazohMCxtYXhQYWRkaW5nOi4wNSxtaW5QYWRkaW5nOi4wNSx0aWNrUGl4ZWxJbnRlcnZhbDo3MixzaG93TGFzdExhYmVsOiEwLGxhYmVsczp7eDotOH0sc3RhcnRPblRpY2s6ITAsdGl0bGU6e3JvdGF0aW9uOjI3MCxcbnRleHQ6XCJWYWx1ZXNcIn0sc3RhY2tMYWJlbHM6e2FsbG93T3ZlcmxhcDohMSxlbmFibGVkOiExLGZvcm1hdHRlcjpmdW5jdGlvbigpe3JldHVybiBhLm51bWJlckZvcm1hdCh0aGlzLnRvdGFsLC0xKX0sc3R5bGU6e2NvbG9yOlwiIzAwMDAwMFwiLGZvbnRTaXplOlwiMTFweFwiLGZvbnRXZWlnaHQ6XCJib2xkXCIsdGV4dE91dGxpbmU6XCIxcHggY29udHJhc3RcIn19LGdyaWRMaW5lV2lkdGg6MSxsaW5lV2lkdGg6MH0sZGVmYXVsdExlZnRBeGlzT3B0aW9uczp7bGFiZWxzOnt4Oi0xNX0sdGl0bGU6e3JvdGF0aW9uOjI3MH19LGRlZmF1bHRSaWdodEF4aXNPcHRpb25zOntsYWJlbHM6e3g6MTV9LHRpdGxlOntyb3RhdGlvbjo5MH19LGRlZmF1bHRCb3R0b21BeGlzT3B0aW9uczp7bGFiZWxzOnthdXRvUm90YXRpb246Wy00NV0seDowfSxtYXJnaW46MTUsdGl0bGU6e3JvdGF0aW9uOjB9fSxkZWZhdWx0VG9wQXhpc09wdGlvbnM6e2xhYmVsczp7YXV0b1JvdGF0aW9uOlstNDVdLHg6MH0sbWFyZ2luOjE1LFxudGl0bGU6e3JvdGF0aW9uOjB9fSxpbml0OmZ1bmN0aW9uKGQsYil7dmFyIHE9Yi5pc1gsYz10aGlzO2MuY2hhcnQ9ZDtjLmhvcml6PWQuaW52ZXJ0ZWQmJiFjLmlzWkF4aXM/IXE6cTtjLmlzWEF4aXM9cTtjLmNvbGw9Yy5jb2xsfHwocT9cInhBeGlzXCI6XCJ5QXhpc1wiKTtoKHRoaXMsXCJpbml0XCIse3VzZXJPcHRpb25zOmJ9KTtjLm9wcG9zaXRlPWIub3Bwb3NpdGU7Yy5zaWRlPWIuc2lkZXx8KGMuaG9yaXo/Yy5vcHBvc2l0ZT8wOjI6Yy5vcHBvc2l0ZT8xOjMpO2Muc2V0T3B0aW9ucyhiKTt2YXIgZT10aGlzLm9wdGlvbnMsdT1lLnR5cGU7Yy5sYWJlbEZvcm1hdHRlcj1lLmxhYmVscy5mb3JtYXR0ZXJ8fGMuZGVmYXVsdExhYmVsRm9ybWF0dGVyO2MudXNlck9wdGlvbnM9YjtjLm1pblBpeGVsUGFkZGluZz0wO2MucmV2ZXJzZWQ9ZS5yZXZlcnNlZDtjLnZpc2libGU9ITEhPT1lLnZpc2libGU7Yy56b29tRW5hYmxlZD0hMSE9PWUuem9vbUVuYWJsZWQ7Yy5oYXNOYW1lcz1cImNhdGVnb3J5XCI9PT1cbnV8fCEwPT09ZS5jYXRlZ29yaWVzO2MuY2F0ZWdvcmllcz1lLmNhdGVnb3JpZXN8fGMuaGFzTmFtZXM7Yy5uYW1lc3x8KGMubmFtZXM9W10sYy5uYW1lcy5rZXlzPXt9KTtjLnBsb3RMaW5lc0FuZEJhbmRzR3JvdXBzPXt9O2MuaXNMb2c9XCJsb2dhcml0aG1pY1wiPT09dTtjLmlzRGF0ZXRpbWVBeGlzPVwiZGF0ZXRpbWVcIj09PXU7Yy5wb3NpdGl2ZVZhbHVlc09ubHk9Yy5pc0xvZyYmIWMuYWxsb3dOZWdhdGl2ZUxvZztjLmlzTGlua2VkPXkoZS5saW5rZWRUbyk7Yy50aWNrcz17fTtjLmxhYmVsRWRnZT1bXTtjLm1pbm9yVGlja3M9e307Yy5wbG90TGluZXNBbmRCYW5kcz1bXTtjLmFsdGVybmF0ZUJhbmRzPXt9O2MubGVuPTA7Yy5taW5SYW5nZT1jLnVzZXJNaW5SYW5nZT1lLm1pblJhbmdlfHxlLm1heFpvb207Yy5yYW5nZT1lLnJhbmdlO2Mub2Zmc2V0PWUub2Zmc2V0fHwwO2Muc3RhY2tzPXt9O2Mub2xkU3RhY2tzPXt9O2Muc3RhY2tzVG91Y2hlZD0wO2MubWF4PW51bGw7Yy5taW49bnVsbDtcbmMuY3Jvc3NoYWlyPUIoZS5jcm9zc2hhaXIsayhkLm9wdGlvbnMudG9vbHRpcC5jcm9zc2hhaXJzKVtxPzA6MV0sITEpO2I9Yy5vcHRpb25zLmV2ZW50czstMT09PWQuYXhlcy5pbmRleE9mKGMpJiYocT9kLmF4ZXMuc3BsaWNlKGQueEF4aXMubGVuZ3RoLDAsYyk6ZC5heGVzLnB1c2goYyksZFtjLmNvbGxdLnB1c2goYykpO2Muc2VyaWVzPWMuc2VyaWVzfHxbXTtkLmludmVydGVkJiYhYy5pc1pBeGlzJiZxJiZ2b2lkIDA9PT1jLnJldmVyc2VkJiYoYy5yZXZlcnNlZD0hMCk7dyhiLGZ1bmN0aW9uKGQscSl7YS5pc0Z1bmN0aW9uKGQpJiZDKGMscSxkKX0pO2MubGluMmxvZz1lLmxpbmVhclRvTG9nQ29udmVydGVyfHxjLmxpbjJsb2c7Yy5pc0xvZyYmKGMudmFsMmxpbj1jLmxvZzJsaW4sYy5saW4ydmFsPWMubGluMmxvZyk7aCh0aGlzLFwiYWZ0ZXJJbml0XCIpfSxzZXRPcHRpb25zOmZ1bmN0aW9uKGEpe3RoaXMub3B0aW9ucz10KHRoaXMuZGVmYXVsdE9wdGlvbnMsXCJ5QXhpc1wiPT09dGhpcy5jb2xsJiZcbnRoaXMuZGVmYXVsdFlBeGlzT3B0aW9ucyxbdGhpcy5kZWZhdWx0VG9wQXhpc09wdGlvbnMsdGhpcy5kZWZhdWx0UmlnaHRBeGlzT3B0aW9ucyx0aGlzLmRlZmF1bHRCb3R0b21BeGlzT3B0aW9ucyx0aGlzLmRlZmF1bHRMZWZ0QXhpc09wdGlvbnNdW3RoaXMuc2lkZV0sdCh4W3RoaXMuY29sbF0sYSkpO2godGhpcyxcImFmdGVyU2V0T3B0aW9uc1wiLHt1c2VyT3B0aW9uczphfSl9LGRlZmF1bHRMYWJlbEZvcm1hdHRlcjpmdW5jdGlvbigpe3ZhciBkPXRoaXMuYXhpcyxiPXRoaXMudmFsdWUsYz1kLmNoYXJ0LnRpbWUsaz1kLmNhdGVnb3JpZXMsZT10aGlzLmRhdGVUaW1lTGFiZWxGb3JtYXQsdT14LmxhbmcsbD11Lm51bWVyaWNTeW1ib2xzLHU9dS5udW1lcmljU3ltYm9sTWFnbml0dWRlfHwxRTMsdD1sJiZsLmxlbmd0aCxwLGg9ZC5vcHRpb25zLmxhYmVscy5mb3JtYXQsZD1kLmlzTG9nP01hdGguYWJzKGIpOmQudGlja0ludGVydmFsO2lmKGgpcD1yKGgsdGhpcyxjKTtlbHNlIGlmKGspcD1cbmI7ZWxzZSBpZihlKXA9Yy5kYXRlRm9ybWF0KGUsYik7ZWxzZSBpZih0JiYxRTM8PWQpZm9yKDt0LS0mJnZvaWQgMD09PXA7KWM9TWF0aC5wb3codSx0KzEpLGQ+PWMmJjA9PT0xMCpiJWMmJm51bGwhPT1sW3RdJiYwIT09YiYmKHA9YS5udW1iZXJGb3JtYXQoYi9jLC0xKStsW3RdKTt2b2lkIDA9PT1wJiYocD0xRTQ8PU1hdGguYWJzKGIpP2EubnVtYmVyRm9ybWF0KGIsLTEpOmEubnVtYmVyRm9ybWF0KGIsLTEsdm9pZCAwLFwiXCIpKTtyZXR1cm4gcH0sZ2V0U2VyaWVzRXh0cmVtZXM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLGQ9YS5jaGFydCxiO2godGhpcyxcImdldFNlcmllc0V4dHJlbWVzXCIsbnVsbCxmdW5jdGlvbigpe2EuaGFzVmlzaWJsZVNlcmllcz0hMTthLmRhdGFNaW49YS5kYXRhTWF4PWEudGhyZXNob2xkPW51bGw7YS5zb2Z0VGhyZXNob2xkPSFhLmlzWEF4aXM7YS5idWlsZFN0YWNrcyYmYS5idWlsZFN0YWNrcygpO2Euc2VyaWVzLmZvckVhY2goZnVuY3Rpb24ocSl7aWYocS52aXNpYmxlfHxcbiFkLm9wdGlvbnMuY2hhcnQuaWdub3JlSGlkZGVuU2VyaWVzKXt2YXIgYz1xLm9wdGlvbnMsaz1jLnRocmVzaG9sZCxlLHU7YS5oYXNWaXNpYmxlU2VyaWVzPSEwO2EucG9zaXRpdmVWYWx1ZXNPbmx5JiYwPj1rJiYoaz1udWxsKTtpZihhLmlzWEF4aXMpYz1xLnhEYXRhLGMubGVuZ3RoJiYoYj1xLmdldFhFeHRyZW1lcyhjKSxlPWIubWluLHU9Yi5tYXgsbChlKXx8ZSBpbnN0YW5jZW9mIERhdGV8fChjPWMuZmlsdGVyKGwpLGI9cS5nZXRYRXh0cmVtZXMoYyksZT1iLm1pbix1PWIubWF4KSxjLmxlbmd0aCYmKGEuZGF0YU1pbj1NYXRoLm1pbihCKGEuZGF0YU1pbixlKSxlKSxhLmRhdGFNYXg9TWF0aC5tYXgoQihhLmRhdGFNYXgsdSksdSkpKTtlbHNlIGlmKHEuZ2V0RXh0cmVtZXMoKSx1PXEuZGF0YU1heCxlPXEuZGF0YU1pbix5KGUpJiZ5KHUpJiYoYS5kYXRhTWluPU1hdGgubWluKEIoYS5kYXRhTWluLGUpLGUpLGEuZGF0YU1heD1NYXRoLm1heChCKGEuZGF0YU1heCx1KSx1KSkseShrKSYmXG4oYS50aHJlc2hvbGQ9ayksIWMuc29mdFRocmVzaG9sZHx8YS5wb3NpdGl2ZVZhbHVlc09ubHkpYS5zb2Z0VGhyZXNob2xkPSExfX0pfSk7aCh0aGlzLFwiYWZ0ZXJHZXRTZXJpZXNFeHRyZW1lc1wiKX0sdHJhbnNsYXRlOmZ1bmN0aW9uKGEsZCxiLGMsayxlKXt2YXIgcT10aGlzLmxpbmtlZFBhcmVudHx8dGhpcyx1PTEsdD0wLHA9Yz9xLm9sZFRyYW5zQTpxLnRyYW5zQTtjPWM/cS5vbGRNaW46cS5taW47dmFyIEs9cS5taW5QaXhlbFBhZGRpbmc7az0ocS5pc09yZGluYWx8fHEuaXNCcm9rZW58fHEuaXNMb2cmJmspJiZxLmxpbjJ2YWw7cHx8KHA9cS50cmFuc0EpO2ImJih1Kj0tMSx0PXEubGVuKTtxLnJldmVyc2VkJiYodSo9LTEsdC09dSoocS5zZWN0b3J8fHEubGVuKSk7ZD8oYT0oYSp1K3QtSykvcCtjLGsmJihhPXEubGluMnZhbChhKSkpOihrJiYoYT1xLnZhbDJsaW4oYSkpLGE9bChjKT91KihhLWMpKnArdCt1KksrKGwoZSk/cCplOjApOnZvaWQgMCk7cmV0dXJuIGF9LHRvUGl4ZWxzOmZ1bmN0aW9uKGEsXG5kKXtyZXR1cm4gdGhpcy50cmFuc2xhdGUoYSwhMSwhdGhpcy5ob3JpeixudWxsLCEwKSsoZD8wOnRoaXMucG9zKX0sdG9WYWx1ZTpmdW5jdGlvbihhLGQpe3JldHVybiB0aGlzLnRyYW5zbGF0ZShhLShkPzA6dGhpcy5wb3MpLCEwLCF0aGlzLmhvcml6LG51bGwsITApfSxnZXRQbG90TGluZVBhdGg6ZnVuY3Rpb24oYSl7dmFyIGQ9dGhpcyxxPWQuY2hhcnQsYj1kLmxlZnQsYz1kLnRvcCxrPWEub2xkLGU9YS52YWx1ZSx1PWEudHJhbnNsYXRlZFZhbHVlLHQ9YS5saW5lV2lkdGgscD1hLmZvcmNlLGYsdyxyLEQsRz1rJiZxLm9sZENoYXJ0SGVpZ2h0fHxxLmNoYXJ0SGVpZ2h0LG49ayYmcS5vbGRDaGFydFdpZHRofHxxLmNoYXJ0V2lkdGgsZyxGPWQudHJhbnNCLG09ZnVuY3Rpb24oYSxkLHEpe2lmKFwicGFzc1wiIT09cCYmYTxkfHxhPnEpcD9hPU1hdGgubWluKE1hdGgubWF4KGQsYSkscSk6Zz0hMDtyZXR1cm4gYX07YT17dmFsdWU6ZSxsaW5lV2lkdGg6dCxvbGQ6ayxmb3JjZTpwLGFjcm9zc1BhbmVzOmEuYWNyb3NzUGFuZXMsXG50cmFuc2xhdGVkVmFsdWU6dX07aCh0aGlzLFwiZ2V0UGxvdExpbmVQYXRoXCIsYSxmdW5jdGlvbihhKXt1PUIodSxkLnRyYW5zbGF0ZShlLG51bGwsbnVsbCxrKSk7dT1NYXRoLm1pbihNYXRoLm1heCgtMUU1LHUpLDFFNSk7Zj1yPU1hdGgucm91bmQodStGKTt3PUQ9TWF0aC5yb3VuZChHLXUtRik7bCh1KT9kLmhvcml6Pyh3PWMsRD1HLWQuYm90dG9tLGY9cj1tKGYsYixiK2Qud2lkdGgpKTooZj1iLHI9bi1kLnJpZ2h0LHc9RD1tKHcsYyxjK2QuaGVpZ2h0KSk6KGc9ITAscD0hMSk7YS5wYXRoPWcmJiFwP251bGw6cS5yZW5kZXJlci5jcmlzcExpbmUoW1wiTVwiLGYsdyxcIkxcIixyLERdLHR8fDEpfSk7cmV0dXJuIGEucGF0aH0sZ2V0TGluZWFyVGlja1Bvc2l0aW9uczpmdW5jdGlvbihhLGQsYil7dmFyIHEsYz12KE1hdGguZmxvb3IoZC9hKSphKTtiPXYoTWF0aC5jZWlsKGIvYSkqYSk7dmFyIGs9W10sZTt2KGMrYSk9PT1jJiYoZT0yMCk7aWYodGhpcy5zaW5nbGUpcmV0dXJuW2RdO2ZvcihkPVxuYztkPD1iOyl7ay5wdXNoKGQpO2Q9dihkK2EsZSk7aWYoZD09PXEpYnJlYWs7cT1kfXJldHVybiBrfSxnZXRNaW5vclRpY2tJbnRlcnZhbDpmdW5jdGlvbigpe3ZhciBhPXRoaXMub3B0aW9ucztyZXR1cm4hMD09PWEubWlub3JUaWNrcz9CKGEubWlub3JUaWNrSW50ZXJ2YWwsXCJhdXRvXCIpOiExPT09YS5taW5vclRpY2tzP251bGw6YS5taW5vclRpY2tJbnRlcnZhbH0sZ2V0TWlub3JUaWNrUG9zaXRpb25zOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcyxkPWEub3B0aW9ucyxiPWEudGlja1Bvc2l0aW9ucyxjPWEubWlub3JUaWNrSW50ZXJ2YWwsaz1bXSxlPWEucG9pbnRSYW5nZVBhZGRpbmd8fDAsdT1hLm1pbi1lLGU9YS5tYXgrZSxsPWUtdTtpZihsJiZsL2M8YS5sZW4vMylpZihhLmlzTG9nKXRoaXMucGFkZGVkVGlja3MuZm9yRWFjaChmdW5jdGlvbihkLHEsYil7cSYmay5wdXNoLmFwcGx5KGssYS5nZXRMb2dUaWNrUG9zaXRpb25zKGMsYltxLTFdLGJbcV0sITApKX0pO2Vsc2UgaWYoYS5pc0RhdGV0aW1lQXhpcyYmXG5cImF1dG9cIj09PXRoaXMuZ2V0TWlub3JUaWNrSW50ZXJ2YWwoKSlrPWsuY29uY2F0KGEuZ2V0VGltZVRpY2tzKGEubm9ybWFsaXplVGltZVRpY2tJbnRlcnZhbChjKSx1LGUsZC5zdGFydE9mV2VlaykpO2Vsc2UgZm9yKGQ9dSsoYlswXS11KSVjO2Q8PWUmJmQhPT1rWzBdO2QrPWMpay5wdXNoKGQpOzAhPT1rLmxlbmd0aCYmYS50cmltVGlja3Moayk7cmV0dXJuIGt9LGFkanVzdEZvck1pblJhbmdlOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5vcHRpb25zLGQ9dGhpcy5taW4sYj10aGlzLm1heCxjLGssZSx1LGwsdCxwLGg7dGhpcy5pc1hBeGlzJiZ2b2lkIDA9PT10aGlzLm1pblJhbmdlJiYhdGhpcy5pc0xvZyYmKHkoYS5taW4pfHx5KGEubWF4KT90aGlzLm1pblJhbmdlPW51bGw6KHRoaXMuc2VyaWVzLmZvckVhY2goZnVuY3Rpb24oYSl7dD1hLnhEYXRhO2Zvcih1PXA9YS54SW5jcmVtZW50PzE6dC5sZW5ndGgtMTswPHU7dS0tKWlmKGw9dFt1XS10W3UtMV0sdm9pZCAwPT09ZXx8bDxlKWU9XG5sfSksdGhpcy5taW5SYW5nZT1NYXRoLm1pbig1KmUsdGhpcy5kYXRhTWF4LXRoaXMuZGF0YU1pbikpKTtiLWQ8dGhpcy5taW5SYW5nZSYmKGs9dGhpcy5kYXRhTWF4LXRoaXMuZGF0YU1pbj49dGhpcy5taW5SYW5nZSxoPXRoaXMubWluUmFuZ2UsYz0oaC1iK2QpLzIsYz1bZC1jLEIoYS5taW4sZC1jKV0sayYmKGNbMl09dGhpcy5pc0xvZz90aGlzLmxvZzJsaW4odGhpcy5kYXRhTWluKTp0aGlzLmRhdGFNaW4pLGQ9RShjKSxiPVtkK2gsQihhLm1heCxkK2gpXSxrJiYoYlsyXT10aGlzLmlzTG9nP3RoaXMubG9nMmxpbih0aGlzLmRhdGFNYXgpOnRoaXMuZGF0YU1heCksYj1tKGIpLGItZDxoJiYoY1swXT1iLWgsY1sxXT1CKGEubWluLGItaCksZD1FKGMpKSk7dGhpcy5taW49ZDt0aGlzLm1heD1ifSxnZXRDbG9zZXN0OmZ1bmN0aW9uKCl7dmFyIGE7dGhpcy5jYXRlZ29yaWVzP2E9MTp0aGlzLnNlcmllcy5mb3JFYWNoKGZ1bmN0aW9uKGQpe3ZhciBiPWQuY2xvc2VzdFBvaW50UmFuZ2UsXG5xPWQudmlzaWJsZXx8IWQuY2hhcnQub3B0aW9ucy5jaGFydC5pZ25vcmVIaWRkZW5TZXJpZXM7IWQubm9TaGFyZWRUb29sdGlwJiZ5KGIpJiZxJiYoYT15KGEpP01hdGgubWluKGEsYik6Yil9KTtyZXR1cm4gYX0sbmFtZVRvWDpmdW5jdGlvbihhKXt2YXIgZD1iKHRoaXMuY2F0ZWdvcmllcykscT1kP3RoaXMuY2F0ZWdvcmllczp0aGlzLm5hbWVzLGM9YS5vcHRpb25zLngsazthLnNlcmllcy5yZXF1aXJlU29ydGluZz0hMTt5KGMpfHwoYz0hMT09PXRoaXMub3B0aW9ucy51bmlxdWVOYW1lcz9hLnNlcmllcy5hdXRvSW5jcmVtZW50KCk6ZD9xLmluZGV4T2YoYS5uYW1lKTpCKHEua2V5c1thLm5hbWVdLC0xKSk7LTE9PT1jP2R8fChrPXEubGVuZ3RoKTprPWM7dm9pZCAwIT09ayYmKHRoaXMubmFtZXNba109YS5uYW1lLHRoaXMubmFtZXMua2V5c1thLm5hbWVdPWspO3JldHVybiBrfSx1cGRhdGVOYW1lczpmdW5jdGlvbigpe3ZhciBhPXRoaXMsZD10aGlzLm5hbWVzOzA8ZC5sZW5ndGgmJlxuKE9iamVjdC5rZXlzKGQua2V5cykuZm9yRWFjaChmdW5jdGlvbihhKXtkZWxldGUgZC5rZXlzW2FdfSksZC5sZW5ndGg9MCx0aGlzLm1pblJhbmdlPXRoaXMudXNlck1pblJhbmdlLCh0aGlzLnNlcmllc3x8W10pLmZvckVhY2goZnVuY3Rpb24oZCl7ZC54SW5jcmVtZW50PW51bGw7aWYoIWQucG9pbnRzfHxkLmlzRGlydHlEYXRhKWEubWF4PU1hdGgubWF4KGEubWF4LGQueERhdGEubGVuZ3RoLTEpLGQucHJvY2Vzc0RhdGEoKSxkLmdlbmVyYXRlUG9pbnRzKCk7ZC5kYXRhLmZvckVhY2goZnVuY3Rpb24oYixxKXt2YXIgYztiJiZiLm9wdGlvbnMmJnZvaWQgMCE9PWIubmFtZSYmKGM9YS5uYW1lVG9YKGIpLHZvaWQgMCE9PWMmJmMhPT1iLngmJihiLng9YyxkLnhEYXRhW3FdPWMpKX0pfSkpfSxzZXRBeGlzVHJhbnNsYXRpb246ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcyxxPWIubWF4LWIubWluLGs9Yi5heGlzUG9pbnRSYW5nZXx8MCxlLHU9MCxsPTAsdD1iLmxpbmtlZFBhcmVudCxwPSEhYi5jYXRlZ29yaWVzLFxuZj1iLnRyYW5zQSx3PWIuaXNYQXhpcztpZih3fHxwfHxrKWU9Yi5nZXRDbG9zZXN0KCksdD8odT10Lm1pblBvaW50T2Zmc2V0LGw9dC5wb2ludFJhbmdlUGFkZGluZyk6Yi5zZXJpZXMuZm9yRWFjaChmdW5jdGlvbihhKXt2YXIgcT1wPzE6dz9CKGEub3B0aW9ucy5wb2ludFJhbmdlLGUsMCk6Yi5heGlzUG9pbnRSYW5nZXx8MCx0PWEub3B0aW9ucy5wb2ludFBsYWNlbWVudDtrPU1hdGgubWF4KGsscSk7aWYoIWIuc2luZ2xlfHxwKWE9ZC54cmFuZ2UmJmEgaW5zdGFuY2VvZiBkLnhyYW5nZT8hdzp3LHU9TWF0aC5tYXgodSxhJiZjKHQpPzA6cS8yKSxsPU1hdGgubWF4KGwsYSYmXCJvblwiPT09dD8wOnEpfSksdD1iLm9yZGluYWxTbG9wZSYmZT9iLm9yZGluYWxTbG9wZS9lOjEsYi5taW5Qb2ludE9mZnNldD11Kj10LGIucG9pbnRSYW5nZVBhZGRpbmc9bCo9dCxiLnBvaW50UmFuZ2U9TWF0aC5taW4oayxxKSx3JiYoYi5jbG9zZXN0UG9pbnRSYW5nZT1lKTthJiYoYi5vbGRUcmFuc0E9Zik7XG5iLnRyYW5zbGF0aW9uU2xvcGU9Yi50cmFuc0E9Zj1iLnN0YXRpY1NjYWxlfHxiLmxlbi8ocStsfHwxKTtiLnRyYW5zQj1iLmhvcml6P2IubGVmdDpiLmJvdHRvbTtiLm1pblBpeGVsUGFkZGluZz1mKnU7aCh0aGlzLFwiYWZ0ZXJTZXRBeGlzVHJhbnNsYXRpb25cIil9LG1pbkZyb21SYW5nZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1heC10aGlzLnJhbmdlfSxzZXRUaWNrSW50ZXJ2YWw6ZnVuY3Rpb24oZCl7dmFyIGI9dGhpcyxxPWIuY2hhcnQsYz1iLm9wdGlvbnMsaz1iLmlzTG9nLHU9Yi5pc0RhdGV0aW1lQXhpcyx0PWIuaXNYQXhpcyxwPWIuaXNMaW5rZWQsZj1jLm1heFBhZGRpbmcsdz1jLm1pblBhZGRpbmcscixEPWMudGlja0ludGVydmFsLEc9Yy50aWNrUGl4ZWxJbnRlcnZhbCxuPWIuY2F0ZWdvcmllcyxnPWwoYi50aHJlc2hvbGQpP2IudGhyZXNob2xkOm51bGwsbT1iLnNvZnRUaHJlc2hvbGQseCx6LEE7dXx8bnx8cHx8dGhpcy5nZXRUaWNrQW1vdW50KCk7ej1CKGIudXNlck1pbixcbmMubWluKTtBPUIoYi51c2VyTWF4LGMubWF4KTtwPyhiLmxpbmtlZFBhcmVudD1xW2IuY29sbF1bYy5saW5rZWRUb10scj1iLmxpbmtlZFBhcmVudC5nZXRFeHRyZW1lcygpLGIubWluPUIoci5taW4sci5kYXRhTWluKSxiLm1heD1CKHIubWF4LHIuZGF0YU1heCksYy50eXBlIT09Yi5saW5rZWRQYXJlbnQub3B0aW9ucy50eXBlJiZhLmVycm9yKDExLDEscSkpOighbSYmeShnKSYmKGIuZGF0YU1pbj49Zz8ocj1nLHc9MCk6Yi5kYXRhTWF4PD1nJiYoeD1nLGY9MCkpLGIubWluPUIoeixyLGIuZGF0YU1pbiksYi5tYXg9QihBLHgsYi5kYXRhTWF4KSk7ayYmKGIucG9zaXRpdmVWYWx1ZXNPbmx5JiYhZCYmMD49TWF0aC5taW4oYi5taW4sQihiLmRhdGFNaW4sYi5taW4pKSYmYS5lcnJvcigxMCwxLHEpLGIubWluPXYoYi5sb2cybGluKGIubWluKSwxNSksYi5tYXg9dihiLmxvZzJsaW4oYi5tYXgpLDE1KSk7Yi5yYW5nZSYmeShiLm1heCkmJihiLnVzZXJNaW49Yi5taW49ej1NYXRoLm1heChiLmRhdGFNaW4sXG5iLm1pbkZyb21SYW5nZSgpKSxiLnVzZXJNYXg9QT1iLm1heCxiLnJhbmdlPW51bGwpO2goYixcImZvdW5kRXh0cmVtZXNcIik7Yi5iZWZvcmVQYWRkaW5nJiZiLmJlZm9yZVBhZGRpbmcoKTtiLmFkanVzdEZvck1pblJhbmdlKCk7IShufHxiLmF4aXNQb2ludFJhbmdlfHxiLnVzZVBlcmNlbnRhZ2V8fHApJiZ5KGIubWluKSYmeShiLm1heCkmJihxPWIubWF4LWIubWluKSYmKCF5KHopJiZ3JiYoYi5taW4tPXEqdyksIXkoQSkmJmYmJihiLm1heCs9cSpmKSk7bChjLnNvZnRNaW4pJiYhbChiLnVzZXJNaW4pJiZjLnNvZnRNaW48Yi5taW4mJihiLm1pbj16PWMuc29mdE1pbik7bChjLnNvZnRNYXgpJiYhbChiLnVzZXJNYXgpJiZjLnNvZnRNYXg+Yi5tYXgmJihiLm1heD1BPWMuc29mdE1heCk7bChjLmZsb29yKSYmKGIubWluPU1hdGgubWluKE1hdGgubWF4KGIubWluLGMuZmxvb3IpLE51bWJlci5NQVhfVkFMVUUpKTtsKGMuY2VpbGluZykmJihiLm1heD1NYXRoLm1heChNYXRoLm1pbihiLm1heCxcbmMuY2VpbGluZyksQihiLnVzZXJNYXgsLU51bWJlci5NQVhfVkFMVUUpKSk7bSYmeShiLmRhdGFNaW4pJiYoZz1nfHwwLCF5KHopJiZiLm1pbjxnJiZiLmRhdGFNaW4+PWc/Yi5taW49Yi5vcHRpb25zLm1pblJhbmdlP01hdGgubWluKGcsYi5tYXgtYi5taW5SYW5nZSk6ZzoheShBKSYmYi5tYXg+ZyYmYi5kYXRhTWF4PD1nJiYoYi5tYXg9Yi5vcHRpb25zLm1pblJhbmdlP01hdGgubWF4KGcsYi5taW4rYi5taW5SYW5nZSk6ZykpO2IudGlja0ludGVydmFsPWIubWluPT09Yi5tYXh8fHZvaWQgMD09PWIubWlufHx2b2lkIDA9PT1iLm1heD8xOnAmJiFEJiZHPT09Yi5saW5rZWRQYXJlbnQub3B0aW9ucy50aWNrUGl4ZWxJbnRlcnZhbD9EPWIubGlua2VkUGFyZW50LnRpY2tJbnRlcnZhbDpCKEQsdGhpcy50aWNrQW1vdW50PyhiLm1heC1iLm1pbikvTWF0aC5tYXgodGhpcy50aWNrQW1vdW50LTEsMSk6dm9pZCAwLG4/MTooYi5tYXgtYi5taW4pKkcvTWF0aC5tYXgoYi5sZW4sRykpO3QmJlxuIWQmJmIuc2VyaWVzLmZvckVhY2goZnVuY3Rpb24oYSl7YS5wcm9jZXNzRGF0YShiLm1pbiE9PWIub2xkTWlufHxiLm1heCE9PWIub2xkTWF4KX0pO2Iuc2V0QXhpc1RyYW5zbGF0aW9uKCEwKTtiLmJlZm9yZVNldFRpY2tQb3NpdGlvbnMmJmIuYmVmb3JlU2V0VGlja1Bvc2l0aW9ucygpO2IucG9zdFByb2Nlc3NUaWNrSW50ZXJ2YWwmJihiLnRpY2tJbnRlcnZhbD1iLnBvc3RQcm9jZXNzVGlja0ludGVydmFsKGIudGlja0ludGVydmFsKSk7Yi5wb2ludFJhbmdlJiYhRCYmKGIudGlja0ludGVydmFsPU1hdGgubWF4KGIucG9pbnRSYW5nZSxiLnRpY2tJbnRlcnZhbCkpO2Q9QihjLm1pblRpY2tJbnRlcnZhbCxiLmlzRGF0ZXRpbWVBeGlzJiZiLmNsb3Nlc3RQb2ludFJhbmdlKTshRCYmYi50aWNrSW50ZXJ2YWw8ZCYmKGIudGlja0ludGVydmFsPWQpO3V8fGt8fER8fChiLnRpY2tJbnRlcnZhbD1GKGIudGlja0ludGVydmFsLG51bGwsZShiLnRpY2tJbnRlcnZhbCksQihjLmFsbG93RGVjaW1hbHMsXG4hKC41PGIudGlja0ludGVydmFsJiY1PmIudGlja0ludGVydmFsJiYxRTM8Yi5tYXgmJjk5OTk+Yi5tYXgpKSwhIXRoaXMudGlja0Ftb3VudCkpO3RoaXMudGlja0Ftb3VudHx8KGIudGlja0ludGVydmFsPWIudW5zcXVpc2goKSk7dGhpcy5zZXRUaWNrUG9zaXRpb25zKCl9LHNldFRpY2tQb3NpdGlvbnM6ZnVuY3Rpb24oKXt2YXIgZD10aGlzLm9wdGlvbnMsYixjPWQudGlja1Bvc2l0aW9ucztiPXRoaXMuZ2V0TWlub3JUaWNrSW50ZXJ2YWwoKTt2YXIgaz1kLnRpY2tQb3NpdGlvbmVyLGU9ZC5zdGFydE9uVGljayx1PWQuZW5kT25UaWNrO3RoaXMudGlja21hcmtPZmZzZXQ9dGhpcy5jYXRlZ29yaWVzJiZcImJldHdlZW5cIj09PWQudGlja21hcmtQbGFjZW1lbnQmJjE9PT10aGlzLnRpY2tJbnRlcnZhbD8uNTowO3RoaXMubWlub3JUaWNrSW50ZXJ2YWw9XCJhdXRvXCI9PT1iJiZ0aGlzLnRpY2tJbnRlcnZhbD90aGlzLnRpY2tJbnRlcnZhbC81OmI7dGhpcy5zaW5nbGU9dGhpcy5taW49PT10aGlzLm1heCYmXG55KHRoaXMubWluKSYmIXRoaXMudGlja0Ftb3VudCYmKHBhcnNlSW50KHRoaXMubWluLDEwKT09PXRoaXMubWlufHwhMSE9PWQuYWxsb3dEZWNpbWFscyk7dGhpcy50aWNrUG9zaXRpb25zPWI9YyYmYy5zbGljZSgpOyFiJiYoIXRoaXMub3JkaW5hbFBvc2l0aW9ucyYmKHRoaXMubWF4LXRoaXMubWluKS90aGlzLnRpY2tJbnRlcnZhbD5NYXRoLm1heCgyKnRoaXMubGVuLDIwMCk/KGI9W3RoaXMubWluLHRoaXMubWF4XSxhLmVycm9yKDE5LCExLHRoaXMuY2hhcnQpKTpiPXRoaXMuaXNEYXRldGltZUF4aXM/dGhpcy5nZXRUaW1lVGlja3ModGhpcy5ub3JtYWxpemVUaW1lVGlja0ludGVydmFsKHRoaXMudGlja0ludGVydmFsLGQudW5pdHMpLHRoaXMubWluLHRoaXMubWF4LGQuc3RhcnRPZldlZWssdGhpcy5vcmRpbmFsUG9zaXRpb25zLHRoaXMuY2xvc2VzdFBvaW50UmFuZ2UsITApOnRoaXMuaXNMb2c/dGhpcy5nZXRMb2dUaWNrUG9zaXRpb25zKHRoaXMudGlja0ludGVydmFsLHRoaXMubWluLFxudGhpcy5tYXgpOnRoaXMuZ2V0TGluZWFyVGlja1Bvc2l0aW9ucyh0aGlzLnRpY2tJbnRlcnZhbCx0aGlzLm1pbix0aGlzLm1heCksYi5sZW5ndGg+dGhpcy5sZW4mJihiPVtiWzBdLGIucG9wKCldLGJbMF09PT1iWzFdJiYoYi5sZW5ndGg9MSkpLHRoaXMudGlja1Bvc2l0aW9ucz1iLGsmJihrPWsuYXBwbHkodGhpcyxbdGhpcy5taW4sdGhpcy5tYXhdKSkpJiYodGhpcy50aWNrUG9zaXRpb25zPWI9ayk7dGhpcy5wYWRkZWRUaWNrcz1iLnNsaWNlKDApO3RoaXMudHJpbVRpY2tzKGIsZSx1KTt0aGlzLmlzTGlua2VkfHwodGhpcy5zaW5nbGUmJjI+Yi5sZW5ndGgmJiF0aGlzLmNhdGVnb3JpZXMmJih0aGlzLm1pbi09LjUsdGhpcy5tYXgrPS41KSxjfHxrfHx0aGlzLmFkanVzdFRpY2tBbW91bnQoKSk7aCh0aGlzLFwiYWZ0ZXJTZXRUaWNrUG9zaXRpb25zXCIpfSx0cmltVGlja3M6ZnVuY3Rpb24oYSxkLGIpe3ZhciBxPWFbMF0sYz1hW2EubGVuZ3RoLTFdLGs9dGhpcy5taW5Qb2ludE9mZnNldHx8XG4wO2godGhpcyxcInRyaW1UaWNrc1wiKTtpZighdGhpcy5pc0xpbmtlZCl7aWYoZCYmLUluZmluaXR5IT09cSl0aGlzLm1pbj1xO2Vsc2UgZm9yKDt0aGlzLm1pbi1rPmFbMF07KWEuc2hpZnQoKTtpZihiKXRoaXMubWF4PWM7ZWxzZSBmb3IoO3RoaXMubWF4K2s8YVthLmxlbmd0aC0xXTspYS5wb3AoKTswPT09YS5sZW5ndGgmJnkocSkmJiF0aGlzLm9wdGlvbnMudGlja1Bvc2l0aW9ucyYmYS5wdXNoKChjK3EpLzIpfX0sYWxpZ25Ub090aGVyczpmdW5jdGlvbigpe3ZhciBhPXt9LGQsYj10aGlzLm9wdGlvbnM7ITE9PT10aGlzLmNoYXJ0Lm9wdGlvbnMuY2hhcnQuYWxpZ25UaWNrc3x8ITE9PT1iLmFsaWduVGlja3N8fCExPT09Yi5zdGFydE9uVGlja3x8ITE9PT1iLmVuZE9uVGlja3x8dGhpcy5pc0xvZ3x8dGhpcy5jaGFydFt0aGlzLmNvbGxdLmZvckVhY2goZnVuY3Rpb24oYil7dmFyIHE9Yi5vcHRpb25zLHE9W2IuaG9yaXo/cS5sZWZ0OnEudG9wLHEud2lkdGgscS5oZWlnaHQscS5wYW5lXS5qb2luKCk7XG5iLnNlcmllcy5sZW5ndGgmJihhW3FdP2Q9ITA6YVtxXT0xKX0pO3JldHVybiBkfSxnZXRUaWNrQW1vdW50OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5vcHRpb25zLGQ9YS50aWNrQW1vdW50LGI9YS50aWNrUGl4ZWxJbnRlcnZhbDsheShhLnRpY2tJbnRlcnZhbCkmJnRoaXMubGVuPGImJiF0aGlzLmlzUmFkaWFsJiYhdGhpcy5pc0xvZyYmYS5zdGFydE9uVGljayYmYS5lbmRPblRpY2smJihkPTIpOyFkJiZ0aGlzLmFsaWduVG9PdGhlcnMoKSYmKGQ9TWF0aC5jZWlsKHRoaXMubGVuL2IpKzEpOzQ+ZCYmKHRoaXMuZmluYWxUaWNrQW10PWQsZD01KTt0aGlzLnRpY2tBbW91bnQ9ZH0sYWRqdXN0VGlja0Ftb3VudDpmdW5jdGlvbigpe3ZhciBhPXRoaXMub3B0aW9ucyxkPXRoaXMudGlja0ludGVydmFsLGI9dGhpcy50aWNrUG9zaXRpb25zLGM9dGhpcy50aWNrQW1vdW50LGs9dGhpcy5maW5hbFRpY2tBbXQsZT1iJiZiLmxlbmd0aCx1PUIodGhpcy50aHJlc2hvbGQsdGhpcy5zb2Z0VGhyZXNob2xkP1xuMDpudWxsKSxsO2lmKHRoaXMuaGFzRGF0YSgpKXtpZihlPGMpe2ZvcihsPXRoaXMubWluO2IubGVuZ3RoPGM7KWIubGVuZ3RoJTJ8fGw9PT11P2IucHVzaCh2KGJbYi5sZW5ndGgtMV0rZCkpOmIudW5zaGlmdCh2KGJbMF0tZCkpO3RoaXMudHJhbnNBKj0oZS0xKS8oYy0xKTt0aGlzLm1pbj1hLnN0YXJ0T25UaWNrP2JbMF06TWF0aC5taW4odGhpcy5taW4sYlswXSk7dGhpcy5tYXg9YS5lbmRPblRpY2s/YltiLmxlbmd0aC0xXTpNYXRoLm1heCh0aGlzLm1heCxiW2IubGVuZ3RoLTFdKX1lbHNlIGU+YyYmKHRoaXMudGlja0ludGVydmFsKj0yLHRoaXMuc2V0VGlja1Bvc2l0aW9ucygpKTtpZih5KGspKXtmb3IoZD1hPWIubGVuZ3RoO2QtLTspKDM9PT1rJiYxPT09ZCUyfHwyPj1rJiYwPGQmJmQ8YS0xKSYmYi5zcGxpY2UoZCwxKTt0aGlzLmZpbmFsVGlja0FtdD12b2lkIDB9fX0sc2V0U2NhbGU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnNlcmllcy5zb21lKGZ1bmN0aW9uKGEpe3JldHVybiBhLmlzRGlydHlEYXRhfHxcbmEuaXNEaXJ0eXx8YS54QXhpcy5pc0RpcnR5fSksZDt0aGlzLm9sZE1pbj10aGlzLm1pbjt0aGlzLm9sZE1heD10aGlzLm1heDt0aGlzLm9sZEF4aXNMZW5ndGg9dGhpcy5sZW47dGhpcy5zZXRBeGlzU2l6ZSgpOyhkPXRoaXMubGVuIT09dGhpcy5vbGRBeGlzTGVuZ3RoKXx8YXx8dGhpcy5pc0xpbmtlZHx8dGhpcy5mb3JjZVJlZHJhd3x8dGhpcy51c2VyTWluIT09dGhpcy5vbGRVc2VyTWlufHx0aGlzLnVzZXJNYXghPT10aGlzLm9sZFVzZXJNYXh8fHRoaXMuYWxpZ25Ub090aGVycygpPyh0aGlzLnJlc2V0U3RhY2tzJiZ0aGlzLnJlc2V0U3RhY2tzKCksdGhpcy5mb3JjZVJlZHJhdz0hMSx0aGlzLmdldFNlcmllc0V4dHJlbWVzKCksdGhpcy5zZXRUaWNrSW50ZXJ2YWwoKSx0aGlzLm9sZFVzZXJNaW49dGhpcy51c2VyTWluLHRoaXMub2xkVXNlck1heD10aGlzLnVzZXJNYXgsdGhpcy5pc0RpcnR5fHwodGhpcy5pc0RpcnR5PWR8fHRoaXMubWluIT09dGhpcy5vbGRNaW58fHRoaXMubWF4IT09XG50aGlzLm9sZE1heCkpOnRoaXMuY2xlYW5TdGFja3MmJnRoaXMuY2xlYW5TdGFja3MoKTtoKHRoaXMsXCJhZnRlclNldFNjYWxlXCIpfSxzZXRFeHRyZW1lczpmdW5jdGlvbihhLGQsYixjLGspe3ZhciBxPXRoaXMsZT1xLmNoYXJ0O2I9QihiLCEwKTtxLnNlcmllcy5mb3JFYWNoKGZ1bmN0aW9uKGEpe2RlbGV0ZSBhLmtkVHJlZX0pO2s9ZihrLHttaW46YSxtYXg6ZH0pO2gocSxcInNldEV4dHJlbWVzXCIsayxmdW5jdGlvbigpe3EudXNlck1pbj1hO3EudXNlck1heD1kO3EuZXZlbnRBcmdzPWs7YiYmZS5yZWRyYXcoYyl9KX0sem9vbTpmdW5jdGlvbihhLGQpe3ZhciBiPXRoaXMuZGF0YU1pbixxPXRoaXMuZGF0YU1heCxjPXRoaXMub3B0aW9ucyxrPU1hdGgubWluKGIsQihjLm1pbixiKSksZT1NYXRoLm1heChxLEIoYy5tYXgscSkpO2E9e25ld01pbjphLG5ld01heDpkfTtoKHRoaXMsXCJ6b29tXCIsYSxmdW5jdGlvbihhKXt2YXIgZD1hLm5ld01pbixjPWEubmV3TWF4O2lmKGQhPT10aGlzLm1pbnx8XG5jIT09dGhpcy5tYXgpdGhpcy5hbGxvd1pvb21PdXRzaWRlfHwoeShiKSYmKGQ8ayYmKGQ9ayksZD5lJiYoZD1lKSkseShxKSYmKGM8ayYmKGM9ayksYz5lJiYoYz1lKSkpLHRoaXMuZGlzcGxheUJ0bj12b2lkIDAhPT1kfHx2b2lkIDAhPT1jLHRoaXMuc2V0RXh0cmVtZXMoZCxjLCExLHZvaWQgMCx7dHJpZ2dlcjpcInpvb21cIn0pO2Euem9vbWVkPSEwfSk7cmV0dXJuIGEuem9vbWVkfSxzZXRBeGlzU2l6ZTpmdW5jdGlvbigpe3ZhciBkPXRoaXMuY2hhcnQsYj10aGlzLm9wdGlvbnMsYz1iLm9mZnNldHN8fFswLDAsMCwwXSxrPXRoaXMuaG9yaXosZT10aGlzLndpZHRoPU1hdGgucm91bmQoYS5yZWxhdGl2ZUxlbmd0aChCKGIud2lkdGgsZC5wbG90V2lkdGgtY1szXStjWzFdKSxkLnBsb3RXaWR0aCkpLHU9dGhpcy5oZWlnaHQ9TWF0aC5yb3VuZChhLnJlbGF0aXZlTGVuZ3RoKEIoYi5oZWlnaHQsZC5wbG90SGVpZ2h0LWNbMF0rY1syXSksZC5wbG90SGVpZ2h0KSksbD10aGlzLnRvcD1NYXRoLnJvdW5kKGEucmVsYXRpdmVMZW5ndGgoQihiLnRvcCxcbmQucGxvdFRvcCtjWzBdKSxkLnBsb3RIZWlnaHQsZC5wbG90VG9wKSksYj10aGlzLmxlZnQ9TWF0aC5yb3VuZChhLnJlbGF0aXZlTGVuZ3RoKEIoYi5sZWZ0LGQucGxvdExlZnQrY1szXSksZC5wbG90V2lkdGgsZC5wbG90TGVmdCkpO3RoaXMuYm90dG9tPWQuY2hhcnRIZWlnaHQtdS1sO3RoaXMucmlnaHQ9ZC5jaGFydFdpZHRoLWUtYjt0aGlzLmxlbj1NYXRoLm1heChrP2U6dSwwKTt0aGlzLnBvcz1rP2I6bH0sZ2V0RXh0cmVtZXM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmlzTG9nO3JldHVybnttaW46YT92KHRoaXMubGluMmxvZyh0aGlzLm1pbikpOnRoaXMubWluLG1heDphP3YodGhpcy5saW4ybG9nKHRoaXMubWF4KSk6dGhpcy5tYXgsZGF0YU1pbjp0aGlzLmRhdGFNaW4sZGF0YU1heDp0aGlzLmRhdGFNYXgsdXNlck1pbjp0aGlzLnVzZXJNaW4sdXNlck1heDp0aGlzLnVzZXJNYXh9fSxnZXRUaHJlc2hvbGQ6ZnVuY3Rpb24oYSl7dmFyIGQ9dGhpcy5pc0xvZyxiPWQ/dGhpcy5saW4ybG9nKHRoaXMubWluKTpcbnRoaXMubWluLGQ9ZD90aGlzLmxpbjJsb2codGhpcy5tYXgpOnRoaXMubWF4O251bGw9PT1hfHwtSW5maW5pdHk9PT1hP2E9YjpJbmZpbml0eT09PWE/YT1kOmI+YT9hPWI6ZDxhJiYoYT1kKTtyZXR1cm4gdGhpcy50cmFuc2xhdGUoYSwwLDEsMCwxKX0sYXV0b0xhYmVsQWxpZ246ZnVuY3Rpb24oYSl7dmFyIGQ9KEIoYSwwKS05MCp0aGlzLnNpZGUrNzIwKSUzNjA7YT17YWxpZ246XCJjZW50ZXJcIn07aCh0aGlzLFwiYXV0b0xhYmVsQWxpZ25cIixhLGZ1bmN0aW9uKGEpezE1PGQmJjE2NT5kP2EuYWxpZ249XCJyaWdodFwiOjE5NTxkJiYzNDU+ZCYmKGEuYWxpZ249XCJsZWZ0XCIpfSk7cmV0dXJuIGEuYWxpZ259LHRpY2tTaXplOmZ1bmN0aW9uKGEpe3ZhciBkPXRoaXMub3B0aW9ucyxiPWRbYStcIkxlbmd0aFwiXSxjPUIoZFthK1wiV2lkdGhcIl0sXCJ0aWNrXCI9PT1hJiZ0aGlzLmlzWEF4aXMmJiF0aGlzLmNhdGVnb3JpZXM/MTowKSxxO2MmJmImJihcImluc2lkZVwiPT09ZFthK1wiUG9zaXRpb25cIl0mJihiPVxuLWIpLHE9W2IsY10pO2E9e3RpY2tTaXplOnF9O2godGhpcyxcImFmdGVyVGlja1NpemVcIixhKTtyZXR1cm4gYS50aWNrU2l6ZX0sbGFiZWxNZXRyaWNzOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy50aWNrUG9zaXRpb25zJiZ0aGlzLnRpY2tQb3NpdGlvbnNbMF18fDA7cmV0dXJuIHRoaXMuY2hhcnQucmVuZGVyZXIuZm9udE1ldHJpY3ModGhpcy5vcHRpb25zLmxhYmVscy5zdHlsZSYmdGhpcy5vcHRpb25zLmxhYmVscy5zdHlsZS5mb250U2l6ZSx0aGlzLnRpY2tzW2FdJiZ0aGlzLnRpY2tzW2FdLmxhYmVsKX0sdW5zcXVpc2g6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLm9wdGlvbnMubGFiZWxzLGQ9dGhpcy5ob3JpeixiPXRoaXMudGlja0ludGVydmFsLGM9YixrPXRoaXMubGVuLygoKHRoaXMuY2F0ZWdvcmllcz8xOjApK3RoaXMubWF4LXRoaXMubWluKS9iKSxlLHU9YS5yb3RhdGlvbixsPXRoaXMubGFiZWxNZXRyaWNzKCksdCxwPU51bWJlci5NQVhfVkFMVUUsaCxmPXRoaXMubWF4LXRoaXMubWluLFxudz1mdW5jdGlvbihhKXt2YXIgZD1hLyhrfHwxKSxkPTE8ZD9NYXRoLmNlaWwoZCk6MTtkKmI+ZiYmSW5maW5pdHkhPT1hJiZJbmZpbml0eSE9PWsmJihkPU1hdGguY2VpbChmL2IpKTtyZXR1cm4gdihkKmIpfTtkPyhoPSFhLnN0YWdnZXJMaW5lcyYmIWEuc3RlcCYmKHkodSk/W3VdOms8QihhLmF1dG9Sb3RhdGlvbkxpbWl0LDgwKSYmYS5hdXRvUm90YXRpb24pKSYmaC5mb3JFYWNoKGZ1bmN0aW9uKGEpe3ZhciBkO2lmKGE9PT11fHxhJiYtOTA8PWEmJjkwPj1hKXQ9dyhNYXRoLmFicyhsLmgvTWF0aC5zaW4oeiphKSkpLGQ9dCtNYXRoLmFicyhhLzM2MCksZDxwJiYocD1kLGU9YSxjPXQpfSk6YS5zdGVwfHwoYz13KGwuaCkpO3RoaXMuYXV0b1JvdGF0aW9uPWg7dGhpcy5sYWJlbFJvdGF0aW9uPUIoZSx1KTtyZXR1cm4gY30sZ2V0U2xvdFdpZHRoOmZ1bmN0aW9uKGEpe3ZhciBkPXRoaXMuY2hhcnQsYj10aGlzLmhvcml6LGM9dGhpcy5vcHRpb25zLmxhYmVscyxrPU1hdGgubWF4KHRoaXMudGlja1Bvc2l0aW9ucy5sZW5ndGgtXG4odGhpcy5jYXRlZ29yaWVzPzA6MSksMSkscT1kLm1hcmdpblszXTtyZXR1cm4gYSYmYS5zbG90V2lkdGh8fGImJjI+KGMuc3RlcHx8MCkmJiFjLnJvdGF0aW9uJiYodGhpcy5zdGFnZ2VyTGluZXN8fDEpKnRoaXMubGVuL2t8fCFiJiYoYy5zdHlsZSYmcGFyc2VJbnQoYy5zdHlsZS53aWR0aCwxMCl8fHEmJnEtZC5zcGFjaW5nWzNdfHwuMzMqZC5jaGFydFdpZHRoKX0scmVuZGVyVW5zcXVpc2g6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmNoYXJ0LGQ9YS5yZW5kZXJlcixiPXRoaXMudGlja1Bvc2l0aW9ucyxrPXRoaXMudGlja3MsZT10aGlzLm9wdGlvbnMubGFiZWxzLHU9ZSYmZS5zdHlsZXx8e30sbD10aGlzLmhvcml6LHQ9dGhpcy5nZXRTbG90V2lkdGgoKSxwPU1hdGgubWF4KDEsTWF0aC5yb3VuZCh0LTIqKGUucGFkZGluZ3x8NSkpKSxoPXt9LGY9dGhpcy5sYWJlbE1ldHJpY3MoKSx3PWUuc3R5bGUmJmUuc3R5bGUudGV4dE92ZXJmbG93LHIsRCxHPTAsZztjKGUucm90YXRpb24pfHxcbihoLnJvdGF0aW9uPWUucm90YXRpb258fDApO2IuZm9yRWFjaChmdW5jdGlvbihhKXsoYT1rW2FdKSYmYS5sYWJlbCYmYS5sYWJlbC50ZXh0UHhMZW5ndGg+RyYmKEc9YS5sYWJlbC50ZXh0UHhMZW5ndGgpfSk7dGhpcy5tYXhMYWJlbExlbmd0aD1HO2lmKHRoaXMuYXV0b1JvdGF0aW9uKUc+cCYmRz5mLmg/aC5yb3RhdGlvbj10aGlzLmxhYmVsUm90YXRpb246dGhpcy5sYWJlbFJvdGF0aW9uPTA7ZWxzZSBpZih0JiYocj1wLCF3KSlmb3IoRD1cImNsaXBcIixwPWIubGVuZ3RoOyFsJiZwLS07KWlmKGc9YltwXSxnPWtbZ10ubGFiZWwpZy5zdHlsZXMmJlwiZWxsaXBzaXNcIj09PWcuc3R5bGVzLnRleHRPdmVyZmxvdz9nLmNzcyh7dGV4dE92ZXJmbG93OlwiY2xpcFwifSk6Zy50ZXh0UHhMZW5ndGg+dCYmZy5jc3Moe3dpZHRoOnQrXCJweFwifSksZy5nZXRCQm94KCkuaGVpZ2h0PnRoaXMubGVuL2IubGVuZ3RoLShmLmgtZi5mKSYmKGcuc3BlY2lmaWNUZXh0T3ZlcmZsb3c9XCJlbGxpcHNpc1wiKTtoLnJvdGF0aW9uJiZcbihyPUc+LjUqYS5jaGFydEhlaWdodD8uMzMqYS5jaGFydEhlaWdodDpHLHd8fChEPVwiZWxsaXBzaXNcIikpO2lmKHRoaXMubGFiZWxBbGlnbj1lLmFsaWdufHx0aGlzLmF1dG9MYWJlbEFsaWduKHRoaXMubGFiZWxSb3RhdGlvbikpaC5hbGlnbj10aGlzLmxhYmVsQWxpZ247Yi5mb3JFYWNoKGZ1bmN0aW9uKGEpe3ZhciBkPShhPWtbYV0pJiZhLmxhYmVsLGI9dS53aWR0aCxjPXt9O2QmJihkLmF0dHIoaCksYS5zaG9ydGVuTGFiZWw/YS5zaG9ydGVuTGFiZWwoKTpyJiYhYiYmXCJub3dyYXBcIiE9PXUud2hpdGVTcGFjZSYmKHI8ZC50ZXh0UHhMZW5ndGh8fFwiU1BBTlwiPT09ZC5lbGVtZW50LnRhZ05hbWUpPyhjLndpZHRoPXIsd3x8KGMudGV4dE92ZXJmbG93PWQuc3BlY2lmaWNUZXh0T3ZlcmZsb3d8fEQpLGQuY3NzKGMpKTpkLnN0eWxlcyYmZC5zdHlsZXMud2lkdGgmJiFjLndpZHRoJiYhYiYmZC5jc3Moe3dpZHRoOm51bGx9KSxkZWxldGUgZC5zcGVjaWZpY1RleHRPdmVyZmxvdyxhLnJvdGF0aW9uPVxuaC5yb3RhdGlvbil9LHRoaXMpO3RoaXMudGlja1JvdENvcnI9ZC5yb3RDb3JyKGYuYix0aGlzLmxhYmVsUm90YXRpb258fDAsMCE9PXRoaXMuc2lkZSl9LGhhc0RhdGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zZXJpZXMuc29tZShmdW5jdGlvbihhKXtyZXR1cm4gYS5oYXNEYXRhKCl9KXx8dGhpcy5vcHRpb25zLnNob3dFbXB0eSYmeSh0aGlzLm1pbikmJnkodGhpcy5tYXgpfSxhZGRUaXRsZTpmdW5jdGlvbihhKXt2YXIgZD10aGlzLmNoYXJ0LnJlbmRlcmVyLGI9dGhpcy5ob3JpeixjPXRoaXMub3Bwb3NpdGUsaz10aGlzLm9wdGlvbnMudGl0bGUscSxlPXRoaXMuY2hhcnQuc3R5bGVkTW9kZTt0aGlzLmF4aXNUaXRsZXx8KChxPWsudGV4dEFsaWduKXx8KHE9KGI/e2xvdzpcImxlZnRcIixtaWRkbGU6XCJjZW50ZXJcIixoaWdoOlwicmlnaHRcIn06e2xvdzpjP1wicmlnaHRcIjpcImxlZnRcIixtaWRkbGU6XCJjZW50ZXJcIixoaWdoOmM/XCJsZWZ0XCI6XCJyaWdodFwifSlbay5hbGlnbl0pLHRoaXMuYXhpc1RpdGxlPVxuZC50ZXh0KGsudGV4dCwwLDAsay51c2VIVE1MKS5hdHRyKHt6SW5kZXg6Nyxyb3RhdGlvbjprLnJvdGF0aW9ufHwwLGFsaWduOnF9KS5hZGRDbGFzcyhcImhpZ2hjaGFydHMtYXhpcy10aXRsZVwiKSxlfHx0aGlzLmF4aXNUaXRsZS5jc3ModChrLnN0eWxlKSksdGhpcy5heGlzVGl0bGUuYWRkKHRoaXMuYXhpc0dyb3VwKSx0aGlzLmF4aXNUaXRsZS5pc05ldz0hMCk7ZXx8ay5zdHlsZS53aWR0aHx8dGhpcy5pc1JhZGlhbHx8dGhpcy5heGlzVGl0bGUuY3NzKHt3aWR0aDp0aGlzLmxlbn0pO3RoaXMuYXhpc1RpdGxlW2E/XCJzaG93XCI6XCJoaWRlXCJdKCEwKX0sZ2VuZXJhdGVUaWNrOmZ1bmN0aW9uKGEpe3ZhciBkPXRoaXMudGlja3M7ZFthXT9kW2FdLmFkZExhYmVsKCk6ZFthXT1uZXcgRCh0aGlzLGEpfSxnZXRPZmZzZXQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLGQ9YS5jaGFydCxiPWQucmVuZGVyZXIsYz1hLm9wdGlvbnMsaz1hLnRpY2tQb3NpdGlvbnMsZT1hLnRpY2tzLHU9YS5ob3JpeixsPVxuYS5zaWRlLHQ9ZC5pbnZlcnRlZCYmIWEuaXNaQXhpcz9bMSwwLDMsMl1bbF06bCxwLGYscj0wLEQsRz0wLGc9Yy50aXRsZSxuPWMubGFiZWxzLEY9MCxtPWQuYXhpc09mZnNldCxkPWQuY2xpcE9mZnNldCx2PVstMSwxLDEsLTFdW2xdLHg9Yy5jbGFzc05hbWUsej1hLmF4aXNQYXJlbnQ7cD1hLmhhc0RhdGEoKTthLnNob3dBeGlzPWY9cHx8QihjLnNob3dFbXB0eSwhMCk7YS5zdGFnZ2VyTGluZXM9YS5ob3JpeiYmbi5zdGFnZ2VyTGluZXM7YS5heGlzR3JvdXB8fChhLmdyaWRHcm91cD1iLmcoXCJncmlkXCIpLmF0dHIoe3pJbmRleDpjLmdyaWRaSW5kZXh8fDF9KS5hZGRDbGFzcyhcImhpZ2hjaGFydHMtXCIrdGhpcy5jb2xsLnRvTG93ZXJDYXNlKCkrXCItZ3JpZCBcIisoeHx8XCJcIikpLmFkZCh6KSxhLmF4aXNHcm91cD1iLmcoXCJheGlzXCIpLmF0dHIoe3pJbmRleDpjLnpJbmRleHx8Mn0pLmFkZENsYXNzKFwiaGlnaGNoYXJ0cy1cIit0aGlzLmNvbGwudG9Mb3dlckNhc2UoKStcIiBcIisoeHx8XCJcIikpLmFkZCh6KSxcbmEubGFiZWxHcm91cD1iLmcoXCJheGlzLWxhYmVsc1wiKS5hdHRyKHt6SW5kZXg6bi56SW5kZXh8fDd9KS5hZGRDbGFzcyhcImhpZ2hjaGFydHMtXCIrYS5jb2xsLnRvTG93ZXJDYXNlKCkrXCItbGFiZWxzIFwiKyh4fHxcIlwiKSkuYWRkKHopKTtwfHxhLmlzTGlua2VkPyhrLmZvckVhY2goZnVuY3Rpb24oZCxiKXthLmdlbmVyYXRlVGljayhkLGIpfSksYS5yZW5kZXJVbnNxdWlzaCgpLGEucmVzZXJ2ZVNwYWNlRGVmYXVsdD0wPT09bHx8Mj09PWx8fHsxOlwibGVmdFwiLDM6XCJyaWdodFwifVtsXT09PWEubGFiZWxBbGlnbixCKG4ucmVzZXJ2ZVNwYWNlLFwiY2VudGVyXCI9PT1hLmxhYmVsQWxpZ24/ITA6bnVsbCxhLnJlc2VydmVTcGFjZURlZmF1bHQpJiZrLmZvckVhY2goZnVuY3Rpb24oYSl7Rj1NYXRoLm1heChlW2FdLmdldExhYmVsU2l6ZSgpLEYpfSksYS5zdGFnZ2VyTGluZXMmJihGKj1hLnN0YWdnZXJMaW5lcyksYS5sYWJlbE9mZnNldD1GKihhLm9wcG9zaXRlPy0xOjEpKTp3KGUsZnVuY3Rpb24oYSxcbmQpe2EuZGVzdHJveSgpO2RlbGV0ZSBlW2RdfSk7ZyYmZy50ZXh0JiYhMSE9PWcuZW5hYmxlZCYmKGEuYWRkVGl0bGUoZiksZiYmITEhPT1nLnJlc2VydmVTcGFjZSYmKGEudGl0bGVPZmZzZXQ9cj1hLmF4aXNUaXRsZS5nZXRCQm94KClbdT9cImhlaWdodFwiOlwid2lkdGhcIl0sRD1nLm9mZnNldCxHPXkoRCk/MDpCKGcubWFyZ2luLHU/NToxMCkpKTthLnJlbmRlckxpbmUoKTthLm9mZnNldD12KkIoYy5vZmZzZXQsbVtsXT9tW2xdKyhjLm1hcmdpbnx8MCk6MCk7YS50aWNrUm90Q29ycj1hLnRpY2tSb3RDb3JyfHx7eDowLHk6MH07Yj0wPT09bD8tYS5sYWJlbE1ldHJpY3MoKS5oOjI9PT1sP2EudGlja1JvdENvcnIueTowO0c9TWF0aC5hYnMoRikrRztGJiYoRz1HLWIrdioodT9CKG4ueSxhLnRpY2tSb3RDb3JyLnkrOCp2KTpuLngpKTthLmF4aXNUaXRsZU1hcmdpbj1CKEQsRyk7YS5nZXRNYXhMYWJlbERpbWVuc2lvbnMmJihhLm1heExhYmVsRGltZW5zaW9ucz1hLmdldE1heExhYmVsRGltZW5zaW9ucyhlLFxuaykpO3U9dGhpcy50aWNrU2l6ZShcInRpY2tcIik7bVtsXT1NYXRoLm1heChtW2xdLGEuYXhpc1RpdGxlTWFyZ2luK3IrdiphLm9mZnNldCxHLGsmJmsubGVuZ3RoJiZ1P3VbMF0rdiphLm9mZnNldDowKTtjPWMub2Zmc2V0PzA6MipNYXRoLmZsb29yKGEuYXhpc0xpbmUuc3Ryb2tlV2lkdGgoKS8yKTtkW3RdPU1hdGgubWF4KGRbdF0sYyk7aCh0aGlzLFwiYWZ0ZXJHZXRPZmZzZXRcIil9LGdldExpbmVQYXRoOmZ1bmN0aW9uKGEpe3ZhciBkPXRoaXMuY2hhcnQsYj10aGlzLm9wcG9zaXRlLGM9dGhpcy5vZmZzZXQsaz10aGlzLmhvcml6LGU9dGhpcy5sZWZ0KyhiP3RoaXMud2lkdGg6MCkrYyxjPWQuY2hhcnRIZWlnaHQtdGhpcy5ib3R0b20tKGI/dGhpcy5oZWlnaHQ6MCkrYztiJiYoYSo9LTEpO3JldHVybiBkLnJlbmRlcmVyLmNyaXNwTGluZShbXCJNXCIsaz90aGlzLmxlZnQ6ZSxrP2M6dGhpcy50b3AsXCJMXCIsaz9kLmNoYXJ0V2lkdGgtdGhpcy5yaWdodDplLGs/YzpkLmNoYXJ0SGVpZ2h0LXRoaXMuYm90dG9tXSxcbmEpfSxyZW5kZXJMaW5lOmZ1bmN0aW9uKCl7dGhpcy5heGlzTGluZXx8KHRoaXMuYXhpc0xpbmU9dGhpcy5jaGFydC5yZW5kZXJlci5wYXRoKCkuYWRkQ2xhc3MoXCJoaWdoY2hhcnRzLWF4aXMtbGluZVwiKS5hZGQodGhpcy5heGlzR3JvdXApLHRoaXMuY2hhcnQuc3R5bGVkTW9kZXx8dGhpcy5heGlzTGluZS5hdHRyKHtzdHJva2U6dGhpcy5vcHRpb25zLmxpbmVDb2xvcixcInN0cm9rZS13aWR0aFwiOnRoaXMub3B0aW9ucy5saW5lV2lkdGgsekluZGV4Ojd9KSl9LGdldFRpdGxlUG9zaXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmhvcml6LGQ9dGhpcy5sZWZ0LGI9dGhpcy50b3AsYz10aGlzLmxlbixrPXRoaXMub3B0aW9ucy50aXRsZSxlPWE/ZDpiLHU9dGhpcy5vcHBvc2l0ZSxsPXRoaXMub2Zmc2V0LHQ9ay54fHwwLHA9ay55fHwwLGY9dGhpcy5heGlzVGl0bGUsdz10aGlzLmNoYXJ0LnJlbmRlcmVyLmZvbnRNZXRyaWNzKGsuc3R5bGUmJmsuc3R5bGUuZm9udFNpemUsZiksZj1NYXRoLm1heChmLmdldEJCb3gobnVsbCxcbjApLmhlaWdodC13LmgtMSwwKSxjPXtsb3c6ZSsoYT8wOmMpLG1pZGRsZTplK2MvMixoaWdoOmUrKGE/YzowKX1bay5hbGlnbl0sZD0oYT9iK3RoaXMuaGVpZ2h0OmQpKyhhPzE6LTEpKih1Py0xOjEpKnRoaXMuYXhpc1RpdGxlTWFyZ2luK1stZixmLHcuZiwtZl1bdGhpcy5zaWRlXSxhPXt4OmE/Yyt0OmQrKHU/dGhpcy53aWR0aDowKStsK3QseTphP2QrcC0odT90aGlzLmhlaWdodDowKStsOmMrcH07aCh0aGlzLFwiYWZ0ZXJHZXRUaXRsZVBvc2l0aW9uXCIse3RpdGxlUG9zaXRpb246YX0pO3JldHVybiBhfSxyZW5kZXJNaW5vclRpY2s6ZnVuY3Rpb24oYSl7dmFyIGQ9dGhpcy5jaGFydC5oYXNSZW5kZXJlZCYmbCh0aGlzLm9sZE1pbiksYj10aGlzLm1pbm9yVGlja3M7YlthXXx8KGJbYV09bmV3IEQodGhpcyxhLFwibWlub3JcIikpO2QmJmJbYV0uaXNOZXcmJmJbYV0ucmVuZGVyKG51bGwsITApO2JbYV0ucmVuZGVyKG51bGwsITEsMSl9LHJlbmRlclRpY2s6ZnVuY3Rpb24oYSxkKXt2YXIgYj1cbnRoaXMuaXNMaW5rZWQsYz10aGlzLnRpY2tzLGs9dGhpcy5jaGFydC5oYXNSZW5kZXJlZCYmbCh0aGlzLm9sZE1pbik7aWYoIWJ8fGE+PXRoaXMubWluJiZhPD10aGlzLm1heCljW2FdfHwoY1thXT1uZXcgRCh0aGlzLGEpKSxrJiZjW2FdLmlzTmV3JiZjW2FdLnJlbmRlcihkLCEwLC0xKSxjW2FdLnJlbmRlcihkKX0scmVuZGVyOmZ1bmN0aW9uKCl7dmFyIGQ9dGhpcyxiPWQuY2hhcnQsYz1kLm9wdGlvbnMsaz1kLmlzTG9nLGU9ZC5pc0xpbmtlZCx0PWQudGlja1Bvc2l0aW9ucyxwPWQuYXhpc1RpdGxlLGY9ZC50aWNrcyxyPWQubWlub3JUaWNrcyxHPWQuYWx0ZXJuYXRlQmFuZHMsZz1jLnN0YWNrTGFiZWxzLG49Yy5hbHRlcm5hdGVHcmlkQ29sb3IsRj1kLnRpY2ttYXJrT2Zmc2V0LEI9ZC5heGlzTGluZSxtPWQuc2hvd0F4aXMsdj1BKGIucmVuZGVyZXIuZ2xvYmFsQW5pbWF0aW9uKSx4LHo7ZC5sYWJlbEVkZ2UubGVuZ3RoPTA7ZC5vdmVybGFwPSExO1tmLHIsR10uZm9yRWFjaChmdW5jdGlvbihhKXt3KGEsXG5mdW5jdGlvbihhKXthLmlzQWN0aXZlPSExfSl9KTtpZihkLmhhc0RhdGEoKXx8ZSlkLm1pbm9yVGlja0ludGVydmFsJiYhZC5jYXRlZ29yaWVzJiZkLmdldE1pbm9yVGlja1Bvc2l0aW9ucygpLmZvckVhY2goZnVuY3Rpb24oYSl7ZC5yZW5kZXJNaW5vclRpY2soYSl9KSx0Lmxlbmd0aCYmKHQuZm9yRWFjaChmdW5jdGlvbihhLGIpe2QucmVuZGVyVGljayhhLGIpfSksRiYmKDA9PT1kLm1pbnx8ZC5zaW5nbGUpJiYoZlstMV18fChmWy0xXT1uZXcgRChkLC0xLG51bGwsITApKSxmWy0xXS5yZW5kZXIoLTEpKSksbiYmdC5mb3JFYWNoKGZ1bmN0aW9uKGMsZSl7ej12b2lkIDAhPT10W2UrMV0/dFtlKzFdK0Y6ZC5tYXgtRjswPT09ZSUyJiZjPGQubWF4JiZ6PD1kLm1heCsoYi5wb2xhcj8tRjpGKSYmKEdbY118fChHW2NdPW5ldyBhLlBsb3RMaW5lT3JCYW5kKGQpKSx4PWMrRixHW2NdLm9wdGlvbnM9e2Zyb206az9kLmxpbjJsb2coeCk6eCx0bzprP2QubGluMmxvZyh6KTp6LGNvbG9yOm59LFxuR1tjXS5yZW5kZXIoKSxHW2NdLmlzQWN0aXZlPSEwKX0pLGQuX2FkZGVkUGxvdExCfHwoKGMucGxvdExpbmVzfHxbXSkuY29uY2F0KGMucGxvdEJhbmRzfHxbXSkuZm9yRWFjaChmdW5jdGlvbihhKXtkLmFkZFBsb3RCYW5kT3JMaW5lKGEpfSksZC5fYWRkZWRQbG90TEI9ITApO1tmLHIsR10uZm9yRWFjaChmdW5jdGlvbihhKXt2YXIgZCxjPVtdLGs9di5kdXJhdGlvbjt3KGEsZnVuY3Rpb24oYSxkKXthLmlzQWN0aXZlfHwoYS5yZW5kZXIoZCwhMSwwKSxhLmlzQWN0aXZlPSExLGMucHVzaChkKSl9KTt1KGZ1bmN0aW9uKCl7Zm9yKGQ9Yy5sZW5ndGg7ZC0tOylhW2NbZF1dJiYhYVtjW2RdXS5pc0FjdGl2ZSYmKGFbY1tkXV0uZGVzdHJveSgpLGRlbGV0ZSBhW2NbZF1dKX0sYSE9PUcmJmIuaGFzUmVuZGVyZWQmJms/azowKX0pO0ImJihCW0IuaXNQbGFjZWQ/XCJhbmltYXRlXCI6XCJhdHRyXCJdKHtkOnRoaXMuZ2V0TGluZVBhdGgoQi5zdHJva2VXaWR0aCgpKX0pLEIuaXNQbGFjZWQ9ITAsQlttP1xuXCJzaG93XCI6XCJoaWRlXCJdKCEwKSk7cCYmbSYmKGM9ZC5nZXRUaXRsZVBvc2l0aW9uKCksbChjLnkpPyhwW3AuaXNOZXc/XCJhdHRyXCI6XCJhbmltYXRlXCJdKGMpLHAuaXNOZXc9ITEpOihwLmF0dHIoXCJ5XCIsLTk5OTkpLHAuaXNOZXc9ITApKTtnJiZnLmVuYWJsZWQmJmQucmVuZGVyU3RhY2tUb3RhbHMoKTtkLmlzRGlydHk9ITE7aCh0aGlzLFwiYWZ0ZXJSZW5kZXJcIil9LHJlZHJhdzpmdW5jdGlvbigpe3RoaXMudmlzaWJsZSYmKHRoaXMucmVuZGVyKCksdGhpcy5wbG90TGluZXNBbmRCYW5kcy5mb3JFYWNoKGZ1bmN0aW9uKGEpe2EucmVuZGVyKCl9KSk7dGhpcy5zZXJpZXMuZm9yRWFjaChmdW5jdGlvbihhKXthLmlzRGlydHk9ITB9KX0sa2VlcFByb3BzOlwiZXh0S2V5IGhjRXZlbnRzIG5hbWVzIHNlcmllcyB1c2VyTWF4IHVzZXJNaW5cIi5zcGxpdChcIiBcIiksZGVzdHJveTpmdW5jdGlvbihhKXt2YXIgZD10aGlzLGI9ZC5zdGFja3MsYz1kLnBsb3RMaW5lc0FuZEJhbmRzLGs7aCh0aGlzLFwiZGVzdHJveVwiLFxue2tlZXBFdmVudHM6YX0pO2F8fHAoZCk7dyhiLGZ1bmN0aW9uKGEsZCl7bihhKTtiW2RdPW51bGx9KTtbZC50aWNrcyxkLm1pbm9yVGlja3MsZC5hbHRlcm5hdGVCYW5kc10uZm9yRWFjaChmdW5jdGlvbihhKXtuKGEpfSk7aWYoYylmb3IoYT1jLmxlbmd0aDthLS07KWNbYV0uZGVzdHJveSgpO1wic3RhY2tUb3RhbEdyb3VwIGF4aXNMaW5lIGF4aXNUaXRsZSBheGlzR3JvdXAgZ3JpZEdyb3VwIGxhYmVsR3JvdXAgY3Jvc3Mgc2Nyb2xsYmFyXCIuc3BsaXQoXCIgXCIpLmZvckVhY2goZnVuY3Rpb24oYSl7ZFthXSYmKGRbYV09ZFthXS5kZXN0cm95KCkpfSk7Zm9yKGsgaW4gZC5wbG90TGluZXNBbmRCYW5kc0dyb3VwcylkLnBsb3RMaW5lc0FuZEJhbmRzR3JvdXBzW2tdPWQucGxvdExpbmVzQW5kQmFuZHNHcm91cHNba10uZGVzdHJveSgpO3coZCxmdW5jdGlvbihhLGIpey0xPT09ZC5rZWVwUHJvcHMuaW5kZXhPZihiKSYmZGVsZXRlIGRbYl19KX0sZHJhd0Nyb3NzaGFpcjpmdW5jdGlvbihhLFxuZCl7dmFyIGIsYz10aGlzLmNyb3NzaGFpcixrPUIoYy5zbmFwLCEwKSxlLHU9dGhpcy5jcm9zcztoKHRoaXMsXCJkcmF3Q3Jvc3NoYWlyXCIse2U6YSxwb2ludDpkfSk7YXx8KGE9dGhpcy5jcm9zcyYmdGhpcy5jcm9zcy5lKTtpZih0aGlzLmNyb3NzaGFpciYmITEhPT0oeShkKXx8IWspKXtrP3koZCkmJihlPUIoZC5jcm9zc2hhaXJQb3MsdGhpcy5pc1hBeGlzP2QucGxvdFg6dGhpcy5sZW4tZC5wbG90WSkpOmU9YSYmKHRoaXMuaG9yaXo/YS5jaGFydFgtdGhpcy5wb3M6dGhpcy5sZW4tYS5jaGFydFkrdGhpcy5wb3MpO3koZSkmJihiPXRoaXMuZ2V0UGxvdExpbmVQYXRoKHt2YWx1ZTpkJiYodGhpcy5pc1hBeGlzP2QueDpCKGQuc3RhY2tZLGQueSkpLHRyYW5zbGF0ZWRWYWx1ZTplfSl8fG51bGwpO2lmKCF5KGIpKXt0aGlzLmhpZGVDcm9zc2hhaXIoKTtyZXR1cm59az10aGlzLmNhdGVnb3JpZXMmJiF0aGlzLmlzUmFkaWFsO3V8fCh0aGlzLmNyb3NzPXU9dGhpcy5jaGFydC5yZW5kZXJlci5wYXRoKCkuYWRkQ2xhc3MoXCJoaWdoY2hhcnRzLWNyb3NzaGFpciBoaWdoY2hhcnRzLWNyb3NzaGFpci1cIitcbihrP1wiY2F0ZWdvcnkgXCI6XCJ0aGluIFwiKStjLmNsYXNzTmFtZSkuYXR0cih7ekluZGV4OkIoYy56SW5kZXgsMil9KS5hZGQoKSx0aGlzLmNoYXJ0LnN0eWxlZE1vZGV8fCh1LmF0dHIoe3N0cm9rZTpjLmNvbG9yfHwoaz9nKFwiI2NjZDZlYlwiKS5zZXRPcGFjaXR5KC4yNSkuZ2V0KCk6XCIjY2NjY2NjXCIpLFwic3Ryb2tlLXdpZHRoXCI6QihjLndpZHRoLDEpfSkuY3NzKHtcInBvaW50ZXItZXZlbnRzXCI6XCJub25lXCJ9KSxjLmRhc2hTdHlsZSYmdS5hdHRyKHtkYXNoc3R5bGU6Yy5kYXNoU3R5bGV9KSkpO3Uuc2hvdygpLmF0dHIoe2Q6Yn0pO2smJiFjLndpZHRoJiZ1LmF0dHIoe1wic3Ryb2tlLXdpZHRoXCI6dGhpcy50cmFuc0F9KTt0aGlzLmNyb3NzLmU9YX1lbHNlIHRoaXMuaGlkZUNyb3NzaGFpcigpO2godGhpcyxcImFmdGVyRHJhd0Nyb3NzaGFpclwiLHtlOmEscG9pbnQ6ZH0pfSxoaWRlQ3Jvc3NoYWlyOmZ1bmN0aW9uKCl7dGhpcy5jcm9zcyYmdGhpcy5jcm9zcy5oaWRlKCk7aCh0aGlzLFwiYWZ0ZXJIaWRlQ3Jvc3NoYWlyXCIpfX0pO1xucmV0dXJuIGEuQXhpcz1HfSk7SShILFwicGFydHMvRGF0ZVRpbWVBeGlzLmpzXCIsW0hbXCJwYXJ0cy9HbG9iYWxzLmpzXCJdXSxmdW5jdGlvbihhKXt2YXIgQz1hLkF4aXMsQT1hLmdldE1hZ25pdHVkZSxFPWEubm9ybWFsaXplVGlja0ludGVydmFsLG09YS50aW1lVW5pdHM7Qy5wcm90b3R5cGUuZ2V0VGltZVRpY2tzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2hhcnQudGltZS5nZXRUaW1lVGlja3MuYXBwbHkodGhpcy5jaGFydC50aW1lLGFyZ3VtZW50cyl9O0MucHJvdG90eXBlLm5vcm1hbGl6ZVRpbWVUaWNrSW50ZXJ2YWw9ZnVuY3Rpb24oYSx2KXt2YXIgZz12fHxbW1wibWlsbGlzZWNvbmRcIixbMSwyLDUsMTAsMjAsMjUsNTAsMTAwLDIwMCw1MDBdXSxbXCJzZWNvbmRcIixbMSwyLDUsMTAsMTUsMzBdXSxbXCJtaW51dGVcIixbMSwyLDUsMTAsMTUsMzBdXSxbXCJob3VyXCIsWzEsMiwzLDQsNiw4LDEyXV0sW1wiZGF5XCIsWzEsMl1dLFtcIndlZWtcIixbMSwyXV0sW1wibW9udGhcIixbMSwyLDMsNCw2XV0sXG5bXCJ5ZWFyXCIsbnVsbF1dO3Y9Z1tnLmxlbmd0aC0xXTt2YXIgeT1tW3ZbMF1dLHo9dlsxXSxuO2ZvcihuPTA7bjxnLmxlbmd0aCYmISh2PWdbbl0seT1tW3ZbMF1dLHo9dlsxXSxnW24rMV0mJmE8PSh5Knpbei5sZW5ndGgtMV0rbVtnW24rMV1bMF1dKS8yKTtuKyspO3k9PT1tLnllYXImJmE8NSp5JiYoej1bMSwyLDVdKTthPUUoYS95LHosXCJ5ZWFyXCI9PT12WzBdP01hdGgubWF4KEEoYS95KSwxKToxKTtyZXR1cm57dW5pdFJhbmdlOnksY291bnQ6YSx1bml0TmFtZTp2WzBdfX19KTtJKEgsXCJwYXJ0cy9Mb2dhcml0aG1pY0F4aXMuanNcIixbSFtcInBhcnRzL0dsb2JhbHMuanNcIl1dLGZ1bmN0aW9uKGEpe3ZhciBDPWEuQXhpcyxBPWEuZ2V0TWFnbml0dWRlLEU9YS5ub3JtYWxpemVUaWNrSW50ZXJ2YWwsbT1hLnBpY2s7Qy5wcm90b3R5cGUuZ2V0TG9nVGlja1Bvc2l0aW9ucz1mdW5jdGlvbihhLHYseCx5KXt2YXIgZz10aGlzLm9wdGlvbnMsbj10aGlzLmxlbixmPVtdO3l8fCh0aGlzLl9taW5vckF1dG9JbnRlcnZhbD1cbm51bGwpO2lmKC41PD1hKWE9TWF0aC5yb3VuZChhKSxmPXRoaXMuZ2V0TGluZWFyVGlja1Bvc2l0aW9ucyhhLHYseCk7ZWxzZSBpZiguMDg8PWEpZm9yKHZhciBuPU1hdGguZmxvb3IodiksaCxyLGUsYixsLGc9LjM8YT9bMSwyLDRdOi4xNTxhP1sxLDIsNCw2LDhdOlsxLDIsMyw0LDUsNiw3LDgsOV07bjx4KzEmJiFsO24rKylmb3Iocj1nLmxlbmd0aCxoPTA7aDxyJiYhbDtoKyspZT10aGlzLmxvZzJsaW4odGhpcy5saW4ybG9nKG4pKmdbaF0pLGU+diYmKCF5fHxiPD14KSYmdm9pZCAwIT09YiYmZi5wdXNoKGIpLGI+eCYmKGw9ITApLGI9ZTtlbHNlIHY9dGhpcy5saW4ybG9nKHYpLHg9dGhpcy5saW4ybG9nKHgpLGE9eT90aGlzLmdldE1pbm9yVGlja0ludGVydmFsKCk6Zy50aWNrSW50ZXJ2YWwsYT1tKFwiYXV0b1wiPT09YT9udWxsOmEsdGhpcy5fbWlub3JBdXRvSW50ZXJ2YWwsZy50aWNrUGl4ZWxJbnRlcnZhbC8oeT81OjEpKih4LXYpLygoeT9uL3RoaXMudGlja1Bvc2l0aW9ucy5sZW5ndGg6XG5uKXx8MSkpLGE9RShhLG51bGwsQShhKSksZj10aGlzLmdldExpbmVhclRpY2tQb3NpdGlvbnMoYSx2LHgpLm1hcCh0aGlzLmxvZzJsaW4pLHl8fCh0aGlzLl9taW5vckF1dG9JbnRlcnZhbD1hLzUpO3l8fCh0aGlzLnRpY2tJbnRlcnZhbD1hKTtyZXR1cm4gZn07Qy5wcm90b3R5cGUubG9nMmxpbj1mdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5sb2coYSkvTWF0aC5MTjEwfTtDLnByb3RvdHlwZS5saW4ybG9nPWZ1bmN0aW9uKGEpe3JldHVybiBNYXRoLnBvdygxMCxhKX19KTtJKEgsXCJwYXJ0cy9QbG90TGluZU9yQmFuZC5qc1wiLFtIW1wicGFydHMvR2xvYmFscy5qc1wiXSxIW1wicGFydHMvQXhpcy5qc1wiXV0sZnVuY3Rpb24oYSxDKXt2YXIgQT1hLmFycmF5TWF4LEU9YS5hcnJheU1pbixtPWEuZGVmaW5lZCxnPWEuZGVzdHJveU9iamVjdFByb3BlcnRpZXMsdj1hLmVyYXNlLHg9YS5tZXJnZSx5PWEucGljazthLlBsb3RMaW5lT3JCYW5kPWZ1bmN0aW9uKGEsbil7dGhpcy5heGlzPWE7biYmKHRoaXMub3B0aW9ucz1cbm4sdGhpcy5pZD1uLmlkKX07YS5QbG90TGluZU9yQmFuZC5wcm90b3R5cGU9e3JlbmRlcjpmdW5jdGlvbigpe2EuZmlyZUV2ZW50KHRoaXMsXCJyZW5kZXJcIik7dmFyIGc9dGhpcyxuPWcuYXhpcyxmPW4uaG9yaXosaD1nLm9wdGlvbnMscj1oLmxhYmVsLGU9Zy5sYWJlbCxiPWgudG8sbD1oLmZyb20sYz1oLnZhbHVlLHQ9bShsKSYmbShiKSxGPW0oYyksdz1nLnN2Z0VsZW0sQj0hdyxwPVtdLGQ9aC5jb2xvcixrPXkoaC56SW5kZXgsMCksdT1oLmV2ZW50cyxwPXtcImNsYXNzXCI6XCJoaWdoY2hhcnRzLXBsb3QtXCIrKHQ/XCJiYW5kIFwiOlwibGluZSBcIikrKGguY2xhc3NOYW1lfHxcIlwiKX0sRD17fSxHPW4uY2hhcnQucmVuZGVyZXIscT10P1wiYmFuZHNcIjpcImxpbmVzXCI7bi5pc0xvZyYmKGw9bi5sb2cybGluKGwpLGI9bi5sb2cybGluKGIpLGM9bi5sb2cybGluKGMpKTtuLmNoYXJ0LnN0eWxlZE1vZGV8fChGPyhwLnN0cm9rZT1kLHBbXCJzdHJva2Utd2lkdGhcIl09aC53aWR0aCxoLmRhc2hTdHlsZSYmKHAuZGFzaHN0eWxlPVxuaC5kYXNoU3R5bGUpKTp0JiYoZCYmKHAuZmlsbD1kKSxoLmJvcmRlcldpZHRoJiYocC5zdHJva2U9aC5ib3JkZXJDb2xvcixwW1wic3Ryb2tlLXdpZHRoXCJdPWguYm9yZGVyV2lkdGgpKSk7RC56SW5kZXg9aztxKz1cIi1cIitrOyhkPW4ucGxvdExpbmVzQW5kQmFuZHNHcm91cHNbcV0pfHwobi5wbG90TGluZXNBbmRCYW5kc0dyb3Vwc1txXT1kPUcuZyhcInBsb3QtXCIrcSkuYXR0cihEKS5hZGQoKSk7QiYmKGcuc3ZnRWxlbT13PUcucGF0aCgpLmF0dHIocCkuYWRkKGQpKTtpZihGKXA9bi5nZXRQbG90TGluZVBhdGgoe3ZhbHVlOmMsbGluZVdpZHRoOncuc3Ryb2tlV2lkdGgoKSxhY3Jvc3NQYW5lczpoLmFjcm9zc1BhbmVzfSk7ZWxzZSBpZih0KXA9bi5nZXRQbG90QmFuZFBhdGgobCxiLGgpO2Vsc2UgcmV0dXJuOyhCfHwhdy5kKSYmcCYmcC5sZW5ndGg/KHcuYXR0cih7ZDpwfSksdSYmYS5vYmplY3RFYWNoKHUsZnVuY3Rpb24oYSxkKXt3Lm9uKGQsZnVuY3Rpb24oYSl7dVtkXS5hcHBseShnLFxuW2FdKX0pfSkpOncmJihwPyh3LnNob3coITApLHcuYW5pbWF0ZSh7ZDpwfSkpOncuZCYmKHcuaGlkZSgpLGUmJihnLmxhYmVsPWU9ZS5kZXN0cm95KCkpKSk7ciYmbShyLnRleHQpJiZwJiZwLmxlbmd0aCYmMDxuLndpZHRoJiYwPG4uaGVpZ2h0JiYhcC5pc0ZsYXQ/KHI9eCh7YWxpZ246ZiYmdCYmXCJjZW50ZXJcIix4OmY/IXQmJjQ6MTAsdmVydGljYWxBbGlnbjohZiYmdCYmXCJtaWRkbGVcIix5OmY/dD8xNjoxMDp0PzY6LTQscm90YXRpb246ZiYmIXQmJjkwfSxyKSx0aGlzLnJlbmRlckxhYmVsKHIscCx0LGspKTplJiZlLmhpZGUoKTtyZXR1cm4gZ30scmVuZGVyTGFiZWw6ZnVuY3Rpb24oYSxnLGYsaCl7dmFyIHI9dGhpcy5sYWJlbCxlPXRoaXMuYXhpcy5jaGFydC5yZW5kZXJlcjtyfHwocj17YWxpZ246YS50ZXh0QWxpZ258fGEuYWxpZ24scm90YXRpb246YS5yb3RhdGlvbixcImNsYXNzXCI6XCJoaWdoY2hhcnRzLXBsb3QtXCIrKGY/XCJiYW5kXCI6XCJsaW5lXCIpK1wiLWxhYmVsIFwiKyhhLmNsYXNzTmFtZXx8XG5cIlwiKX0sci56SW5kZXg9aCx0aGlzLmxhYmVsPXI9ZS50ZXh0KGEudGV4dCwwLDAsYS51c2VIVE1MKS5hdHRyKHIpLmFkZCgpLHRoaXMuYXhpcy5jaGFydC5zdHlsZWRNb2RlfHxyLmNzcyhhLnN0eWxlKSk7aD1nLnhCb3VuZHN8fFtnWzFdLGdbNF0sZj9nWzZdOmdbMV1dO2c9Zy55Qm91bmRzfHxbZ1syXSxnWzVdLGY/Z1s3XTpnWzJdXTtmPUUoaCk7ZT1FKGcpO3IuYWxpZ24oYSwhMSx7eDpmLHk6ZSx3aWR0aDpBKGgpLWYsaGVpZ2h0OkEoZyktZX0pO3Iuc2hvdyghMCl9LGRlc3Ryb3k6ZnVuY3Rpb24oKXt2KHRoaXMuYXhpcy5wbG90TGluZXNBbmRCYW5kcyx0aGlzKTtkZWxldGUgdGhpcy5heGlzO2codGhpcyl9fTthLmV4dGVuZChDLnByb3RvdHlwZSx7Z2V0UGxvdEJhbmRQYXRoOmZ1bmN0aW9uKGEsZyl7dmFyIGY9dGhpcy5nZXRQbG90TGluZVBhdGgoe3ZhbHVlOmcsZm9yY2U6ITAsYWNyb3NzUGFuZXM6dGhpcy5vcHRpb25zLmFjcm9zc1BhbmVzfSksaD10aGlzLmdldFBsb3RMaW5lUGF0aCh7dmFsdWU6YSxcbmZvcmNlOiEwLGFjcm9zc1BhbmVzOnRoaXMub3B0aW9ucy5hY3Jvc3NQYW5lc30pLHI9W10sZT10aGlzLmhvcml6LGI9MSxsO2E9YTx0aGlzLm1pbiYmZzx0aGlzLm1pbnx8YT50aGlzLm1heCYmZz50aGlzLm1heDtpZihoJiZmKWZvcihhJiYobD1oLnRvU3RyaW5nKCk9PT1mLnRvU3RyaW5nKCksYj0wKSxhPTA7YTxoLmxlbmd0aDthKz02KWUmJmZbYSsxXT09PWhbYSsxXT8oZlthKzFdKz1iLGZbYSs0XSs9Yik6ZXx8ZlthKzJdIT09aFthKzJdfHwoZlthKzJdKz1iLGZbYSs1XSs9Yiksci5wdXNoKFwiTVwiLGhbYSsxXSxoW2ErMl0sXCJMXCIsaFthKzRdLGhbYSs1XSxmW2ErNF0sZlthKzVdLGZbYSsxXSxmW2ErMl0sXCJ6XCIpLHIuaXNGbGF0PWw7cmV0dXJuIHJ9LGFkZFBsb3RCYW5kOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmFkZFBsb3RCYW5kT3JMaW5lKGEsXCJwbG90QmFuZHNcIil9LGFkZFBsb3RMaW5lOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmFkZFBsb3RCYW5kT3JMaW5lKGEsXCJwbG90TGluZXNcIil9LFxuYWRkUGxvdEJhbmRPckxpbmU6ZnVuY3Rpb24oZyxuKXt2YXIgZj0obmV3IGEuUGxvdExpbmVPckJhbmQodGhpcyxnKSkucmVuZGVyKCksaD10aGlzLnVzZXJPcHRpb25zO2YmJihuJiYoaFtuXT1oW25dfHxbXSxoW25dLnB1c2goZykpLHRoaXMucGxvdExpbmVzQW5kQmFuZHMucHVzaChmKSk7cmV0dXJuIGZ9LHJlbW92ZVBsb3RCYW5kT3JMaW5lOmZ1bmN0aW9uKGEpe2Zvcih2YXIgZz10aGlzLnBsb3RMaW5lc0FuZEJhbmRzLGY9dGhpcy5vcHRpb25zLGg9dGhpcy51c2VyT3B0aW9ucyxyPWcubGVuZ3RoO3ItLTspZ1tyXS5pZD09PWEmJmdbcl0uZGVzdHJveSgpO1tmLnBsb3RMaW5lc3x8W10saC5wbG90TGluZXN8fFtdLGYucGxvdEJhbmRzfHxbXSxoLnBsb3RCYW5kc3x8W11dLmZvckVhY2goZnVuY3Rpb24oZSl7Zm9yKHI9ZS5sZW5ndGg7ci0tOyllW3JdLmlkPT09YSYmdihlLGVbcl0pfSl9LHJlbW92ZVBsb3RCYW5kOmZ1bmN0aW9uKGEpe3RoaXMucmVtb3ZlUGxvdEJhbmRPckxpbmUoYSl9LFxucmVtb3ZlUGxvdExpbmU6ZnVuY3Rpb24oYSl7dGhpcy5yZW1vdmVQbG90QmFuZE9yTGluZShhKX19KX0pO0koSCxcInBhcnRzL1Rvb2x0aXAuanNcIixbSFtcInBhcnRzL0dsb2JhbHMuanNcIl1dLGZ1bmN0aW9uKGEpe3ZhciBDPWEuZG9jLEE9YS5leHRlbmQsRT1hLmZvcm1hdCxtPWEuaXNOdW1iZXIsZz1hLm1lcmdlLHY9YS5waWNrLHg9YS5zcGxhdCx5PWEuc3luY1RpbWVvdXQsej1hLnRpbWVVbml0czthLlRvb2x0aXA9ZnVuY3Rpb24oKXt0aGlzLmluaXQuYXBwbHkodGhpcyxhcmd1bWVudHMpfTthLlRvb2x0aXAucHJvdG90eXBlPXtpbml0OmZ1bmN0aW9uKGEsZil7dGhpcy5jaGFydD1hO3RoaXMub3B0aW9ucz1mO3RoaXMuY3Jvc3NoYWlycz1bXTt0aGlzLm5vdz17eDowLHk6MH07dGhpcy5pc0hpZGRlbj0hMDt0aGlzLnNwbGl0PWYuc3BsaXQmJiFhLmludmVydGVkO3RoaXMuc2hhcmVkPWYuc2hhcmVkfHx0aGlzLnNwbGl0O3RoaXMub3V0c2lkZT12KGYub3V0c2lkZSwhKCFhLnNjcm9sbGFibGVQaXhlbHNYJiZcbiFhLnNjcm9sbGFibGVQaXhlbHNZKSkmJiF0aGlzLnNwbGl0fSxjbGVhblNwbGl0OmZ1bmN0aW9uKGEpe3RoaXMuY2hhcnQuc2VyaWVzLmZvckVhY2goZnVuY3Rpb24oZil7dmFyIGg9ZiYmZi50dDtoJiYoIWguaXNBY3RpdmV8fGE/Zi50dD1oLmRlc3Ryb3koKTpoLmlzQWN0aXZlPSExKX0pfSxhcHBseUZpbHRlcjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuY2hhcnQ7YS5yZW5kZXJlci5kZWZpbml0aW9uKHt0YWdOYW1lOlwiZmlsdGVyXCIsaWQ6XCJkcm9wLXNoYWRvdy1cIithLmluZGV4LG9wYWNpdHk6LjUsY2hpbGRyZW46W3t0YWdOYW1lOlwiZmVHYXVzc2lhbkJsdXJcIixcImluXCI6XCJTb3VyY2VBbHBoYVwiLHN0ZERldmlhdGlvbjoxfSx7dGFnTmFtZTpcImZlT2Zmc2V0XCIsZHg6MSxkeToxfSx7dGFnTmFtZTpcImZlQ29tcG9uZW50VHJhbnNmZXJcIixjaGlsZHJlbjpbe3RhZ05hbWU6XCJmZUZ1bmNBXCIsdHlwZTpcImxpbmVhclwiLHNsb3BlOi4zfV19LHt0YWdOYW1lOlwiZmVNZXJnZVwiLGNoaWxkcmVuOlt7dGFnTmFtZTpcImZlTWVyZ2VOb2RlXCJ9LFxue3RhZ05hbWU6XCJmZU1lcmdlTm9kZVwiLFwiaW5cIjpcIlNvdXJjZUdyYXBoaWNcIn1dfV19KTthLnJlbmRlcmVyLmRlZmluaXRpb24oe3RhZ05hbWU6XCJzdHlsZVwiLHRleHRDb250ZW50OlwiLmhpZ2hjaGFydHMtdG9vbHRpcC1cIithLmluZGV4K1wie2ZpbHRlcjp1cmwoI2Ryb3Atc2hhZG93LVwiK2EuaW5kZXgrXCIpfVwifSl9LGdldExhYmVsOmZ1bmN0aW9uKCl7dmFyIGc9dGhpcyxmPXRoaXMuY2hhcnQucmVuZGVyZXIsaD10aGlzLmNoYXJ0LnN0eWxlZE1vZGUscj10aGlzLm9wdGlvbnMsZSxiO3RoaXMubGFiZWx8fCh0aGlzLm91dHNpZGUmJih0aGlzLmNvbnRhaW5lcj1lPWEuZG9jLmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiksZS5jbGFzc05hbWU9XCJoaWdoY2hhcnRzLXRvb2x0aXAtY29udGFpbmVyXCIsYS5jc3MoZSx7cG9zaXRpb246XCJhYnNvbHV0ZVwiLHRvcDpcIjFweFwiLHBvaW50ZXJFdmVudHM6ci5zdHlsZSYmci5zdHlsZS5wb2ludGVyRXZlbnRzLHpJbmRleDozfSksYS5kb2MuYm9keS5hcHBlbmRDaGlsZChlKSxcbnRoaXMucmVuZGVyZXI9Zj1uZXcgYS5SZW5kZXJlcihlLDAsMCkpLHRoaXMuc3BsaXQ/dGhpcy5sYWJlbD1mLmcoXCJ0b29sdGlwXCIpOih0aGlzLmxhYmVsPWYubGFiZWwoXCJcIiwwLDAsci5zaGFwZXx8XCJjYWxsb3V0XCIsbnVsbCxudWxsLHIudXNlSFRNTCxudWxsLFwidG9vbHRpcFwiKS5hdHRyKHtwYWRkaW5nOnIucGFkZGluZyxyOnIuYm9yZGVyUmFkaXVzfSksaHx8dGhpcy5sYWJlbC5hdHRyKHtmaWxsOnIuYmFja2dyb3VuZENvbG9yLFwic3Ryb2tlLXdpZHRoXCI6ci5ib3JkZXJXaWR0aH0pLmNzcyhyLnN0eWxlKS5zaGFkb3coci5zaGFkb3cpKSxoJiYodGhpcy5hcHBseUZpbHRlcigpLHRoaXMubGFiZWwuYWRkQ2xhc3MoXCJoaWdoY2hhcnRzLXRvb2x0aXAtXCIrdGhpcy5jaGFydC5pbmRleCkpLHRoaXMub3V0c2lkZSYmKGI9e3g6dGhpcy5sYWJlbC54U2V0dGVyLHk6dGhpcy5sYWJlbC55U2V0dGVyfSx0aGlzLmxhYmVsLnhTZXR0ZXI9ZnVuY3Rpb24oYSxjKXtiW2NdLmNhbGwodGhpcy5sYWJlbCxcbmcuZGlzdGFuY2UpO2Uuc3R5bGUubGVmdD1hK1wicHhcIn0sdGhpcy5sYWJlbC55U2V0dGVyPWZ1bmN0aW9uKGEsYyl7YltjXS5jYWxsKHRoaXMubGFiZWwsZy5kaXN0YW5jZSk7ZS5zdHlsZS50b3A9YStcInB4XCJ9KSx0aGlzLmxhYmVsLmF0dHIoe3pJbmRleDo4fSkuYWRkKCkpO3JldHVybiB0aGlzLmxhYmVsfSx1cGRhdGU6ZnVuY3Rpb24oYSl7dGhpcy5kZXN0cm95KCk7ZyghMCx0aGlzLmNoYXJ0Lm9wdGlvbnMudG9vbHRpcC51c2VyT3B0aW9ucyxhKTt0aGlzLmluaXQodGhpcy5jaGFydCxnKCEwLHRoaXMub3B0aW9ucyxhKSl9LGRlc3Ryb3k6ZnVuY3Rpb24oKXt0aGlzLmxhYmVsJiYodGhpcy5sYWJlbD10aGlzLmxhYmVsLmRlc3Ryb3koKSk7dGhpcy5zcGxpdCYmdGhpcy50dCYmKHRoaXMuY2xlYW5TcGxpdCh0aGlzLmNoYXJ0LCEwKSx0aGlzLnR0PXRoaXMudHQuZGVzdHJveSgpKTt0aGlzLnJlbmRlcmVyJiYodGhpcy5yZW5kZXJlcj10aGlzLnJlbmRlcmVyLmRlc3Ryb3koKSxhLmRpc2NhcmRFbGVtZW50KHRoaXMuY29udGFpbmVyKSk7XG5hLmNsZWFyVGltZW91dCh0aGlzLmhpZGVUaW1lcik7YS5jbGVhclRpbWVvdXQodGhpcy50b29sdGlwVGltZW91dCl9LG1vdmU6ZnVuY3Rpb24oZyxmLGgscil7dmFyIGU9dGhpcyxiPWUubm93LGw9ITEhPT1lLm9wdGlvbnMuYW5pbWF0aW9uJiYhZS5pc0hpZGRlbiYmKDE8TWF0aC5hYnMoZy1iLngpfHwxPE1hdGguYWJzKGYtYi55KSksYz1lLmZvbGxvd1BvaW50ZXJ8fDE8ZS5sZW47QShiLHt4Omw/KDIqYi54K2cpLzM6Zyx5Omw/KGIueStmKS8yOmYsYW5jaG9yWDpjP3ZvaWQgMDpsPygyKmIuYW5jaG9yWCtoKS8zOmgsYW5jaG9yWTpjP3ZvaWQgMDpsPyhiLmFuY2hvclkrcikvMjpyfSk7ZS5nZXRMYWJlbCgpLmF0dHIoYik7bCYmKGEuY2xlYXJUaW1lb3V0KHRoaXMudG9vbHRpcFRpbWVvdXQpLHRoaXMudG9vbHRpcFRpbWVvdXQ9c2V0VGltZW91dChmdW5jdGlvbigpe2UmJmUubW92ZShnLGYsaCxyKX0sMzIpKX0saGlkZTpmdW5jdGlvbihnKXt2YXIgZj10aGlzO2EuY2xlYXJUaW1lb3V0KHRoaXMuaGlkZVRpbWVyKTtcbmc9dihnLHRoaXMub3B0aW9ucy5oaWRlRGVsYXksNTAwKTt0aGlzLmlzSGlkZGVufHwodGhpcy5oaWRlVGltZXI9eShmdW5jdGlvbigpe2YuZ2V0TGFiZWwoKVtnP1wiZmFkZU91dFwiOlwiaGlkZVwiXSgpO2YuaXNIaWRkZW49ITB9LGcpKX0sZ2V0QW5jaG9yOmZ1bmN0aW9uKGEsZil7dmFyIGg9dGhpcy5jaGFydCxyPWgucG9pbnRlcixlPWguaW52ZXJ0ZWQsYj1oLnBsb3RUb3AsbD1oLnBsb3RMZWZ0LGM9MCx0PTAsZyx3O2E9eChhKTt0aGlzLmZvbGxvd1BvaW50ZXImJmY/KHZvaWQgMD09PWYuY2hhcnRYJiYoZj1yLm5vcm1hbGl6ZShmKSksYT1bZi5jaGFydFgtaC5wbG90TGVmdCxmLmNoYXJ0WS1iXSk6YVswXS50b29sdGlwUG9zP2E9YVswXS50b29sdGlwUG9zOihhLmZvckVhY2goZnVuY3Rpb24oYSl7Zz1hLnNlcmllcy55QXhpczt3PWEuc2VyaWVzLnhBeGlzO2MrPWEucGxvdFgrKCFlJiZ3P3cubGVmdC1sOjApO3QrPShhLnBsb3RMb3c/KGEucGxvdExvdythLnBsb3RIaWdoKS8yOmEucGxvdFkpK1xuKCFlJiZnP2cudG9wLWI6MCl9KSxjLz1hLmxlbmd0aCx0Lz1hLmxlbmd0aCxhPVtlP2gucGxvdFdpZHRoLXQ6Yyx0aGlzLnNoYXJlZCYmIWUmJjE8YS5sZW5ndGgmJmY/Zi5jaGFydFktYjplP2gucGxvdEhlaWdodC1jOnRdKTtyZXR1cm4gYS5tYXAoTWF0aC5yb3VuZCl9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEsZixoKXt2YXIgcj10aGlzLmNoYXJ0LGU9dGhpcy5kaXN0YW5jZSxiPXt9LGw9ci5pbnZlcnRlZCYmaC5ofHwwLGMsdD10aGlzLm91dHNpZGUsZz10P0MuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoLTIqZTpyLmNoYXJ0V2lkdGgsdz10P01hdGgubWF4KEMuYm9keS5zY3JvbGxIZWlnaHQsQy5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsSGVpZ2h0LEMuYm9keS5vZmZzZXRIZWlnaHQsQy5kb2N1bWVudEVsZW1lbnQub2Zmc2V0SGVpZ2h0LEMuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCk6ci5jaGFydEhlaWdodCxuPXIucG9pbnRlci5jaGFydFBvc2l0aW9uLHA9W1wieVwiLFxudyxmLCh0P24udG9wLWU6MCkraC5wbG90WStyLnBsb3RUb3AsdD8wOnIucGxvdFRvcCx0P3c6ci5wbG90VG9wK3IucGxvdEhlaWdodF0sZD1bXCJ4XCIsZyxhLCh0P24ubGVmdC1lOjApK2gucGxvdFgrci5wbG90TGVmdCx0PzA6ci5wbG90TGVmdCx0P2c6ci5wbG90TGVmdCtyLnBsb3RXaWR0aF0saz0hdGhpcy5mb2xsb3dQb2ludGVyJiZ2KGgudHRCZWxvdywhci5pbnZlcnRlZD09PSEhaC5uZWdhdGl2ZSksdT1mdW5jdGlvbihhLGQsYyx1LHEsdCl7dmFyIHA9Yzx1LWUsaD11K2UrYzxkLGY9dS1lLWM7dSs9ZTtpZihrJiZoKWJbYV09dTtlbHNlIGlmKCFrJiZwKWJbYV09ZjtlbHNlIGlmKHApYlthXT1NYXRoLm1pbih0LWMsMD5mLWw/ZjpmLWwpO2Vsc2UgaWYoaCliW2FdPU1hdGgubWF4KHEsdStsK2M+ZD91OnUrbCk7ZWxzZSByZXR1cm4hMX0sRD1mdW5jdGlvbihhLGQsYyxrKXt2YXIgdTtrPGV8fGs+ZC1lP3U9ITE6YlthXT1rPGMvMj8xOms+ZC1jLzI/ZC1jLTI6ay1jLzI7cmV0dXJuIHV9LFxuRz1mdW5jdGlvbihhKXt2YXIgYj1wO3A9ZDtkPWI7Yz1hfSxxPWZ1bmN0aW9uKCl7ITEhPT11LmFwcGx5KDAscCk/ITEhPT1ELmFwcGx5KDAsZCl8fGN8fChHKCEwKSxxKCkpOmM/Yi54PWIueT0wOihHKCEwKSxxKCkpfTsoci5pbnZlcnRlZHx8MTx0aGlzLmxlbikmJkcoKTtxKCk7cmV0dXJuIGJ9LGRlZmF1bHRGb3JtYXR0ZXI6ZnVuY3Rpb24oYSl7dmFyIGY9dGhpcy5wb2ludHN8fHgodGhpcyksaDtoPVthLnRvb2x0aXBGb290ZXJIZWFkZXJGb3JtYXR0ZXIoZlswXSldO2g9aC5jb25jYXQoYS5ib2R5Rm9ybWF0dGVyKGYpKTtoLnB1c2goYS50b29sdGlwRm9vdGVySGVhZGVyRm9ybWF0dGVyKGZbMF0sITApKTtyZXR1cm4gaH0scmVmcmVzaDpmdW5jdGlvbihnLGYpe3ZhciBoPXRoaXMuY2hhcnQscj10aGlzLm9wdGlvbnMsZSxiPWcsbCxjPXt9LHQsbj1bXTt0PXIuZm9ybWF0dGVyfHx0aGlzLmRlZmF1bHRGb3JtYXR0ZXI7dmFyIGM9dGhpcy5zaGFyZWQsdz1oLnN0eWxlZE1vZGUsXG5CPVtdO3IuZW5hYmxlZCYmKGEuY2xlYXJUaW1lb3V0KHRoaXMuaGlkZVRpbWVyKSx0aGlzLmZvbGxvd1BvaW50ZXI9eChiKVswXS5zZXJpZXMudG9vbHRpcE9wdGlvbnMuZm9sbG93UG9pbnRlcixsPXRoaXMuZ2V0QW5jaG9yKGIsZiksZj1sWzBdLGU9bFsxXSwhY3x8Yi5zZXJpZXMmJmIuc2VyaWVzLm5vU2hhcmVkVG9vbHRpcD9jPWIuZ2V0TGFiZWxDb25maWcoKTooQj1oLnBvaW50ZXIuZ2V0QWN0aXZlU2VyaWVzKGIpLGguc2VyaWVzLmZvckVhY2goZnVuY3Rpb24oYSl7KGEub3B0aW9ucy5pbmFjdGl2ZU90aGVyUG9pbnRzfHwtMT09PUIuaW5kZXhPZihhKSkmJmEuc2V0U3RhdGUoXCJpbmFjdGl2ZVwiLCEwKX0pLGIuZm9yRWFjaChmdW5jdGlvbihhKXthLnNldFN0YXRlKFwiaG92ZXJcIik7bi5wdXNoKGEuZ2V0TGFiZWxDb25maWcoKSl9KSxjPXt4OmJbMF0uY2F0ZWdvcnkseTpiWzBdLnl9LGMucG9pbnRzPW4sYj1iWzBdKSx0aGlzLmxlbj1uLmxlbmd0aCx0PXQuY2FsbChjLHRoaXMpLFxuYz1iLnNlcmllcyx0aGlzLmRpc3RhbmNlPXYoYy50b29sdGlwT3B0aW9ucy5kaXN0YW5jZSwxNiksITE9PT10P3RoaXMuaGlkZSgpOihoPXRoaXMuZ2V0TGFiZWwoKSx0aGlzLmlzSGlkZGVuJiZoLmF0dHIoe29wYWNpdHk6MX0pLnNob3coKSx0aGlzLnNwbGl0P3RoaXMucmVuZGVyU3BsaXQodCx4KGcpKTooci5zdHlsZS53aWR0aCYmIXd8fGguY3NzKHt3aWR0aDp0aGlzLmNoYXJ0LnNwYWNpbmdCb3gud2lkdGh9KSxoLmF0dHIoe3RleHQ6dCYmdC5qb2luP3Quam9pbihcIlwiKTp0fSksaC5yZW1vdmVDbGFzcygvaGlnaGNoYXJ0cy1jb2xvci1bXFxkXSsvZykuYWRkQ2xhc3MoXCJoaWdoY2hhcnRzLWNvbG9yLVwiK3YoYi5jb2xvckluZGV4LGMuY29sb3JJbmRleCkpLHd8fGguYXR0cih7c3Ryb2tlOnIuYm9yZGVyQ29sb3J8fGIuY29sb3J8fGMuY29sb3J8fFwiIzY2NjY2NlwifSksdGhpcy51cGRhdGVQb3NpdGlvbih7cGxvdFg6ZixwbG90WTplLG5lZ2F0aXZlOmIubmVnYXRpdmUsdHRCZWxvdzpiLnR0QmVsb3csXG5oOmxbMl18fDB9KSksdGhpcy5pc0hpZGRlbj0hMSksYS5maXJlRXZlbnQodGhpcyxcInJlZnJlc2hcIikpfSxyZW5kZXJTcGxpdDpmdW5jdGlvbihnLGYpe3ZhciBoPXRoaXMscj1bXSxlPXRoaXMuY2hhcnQsYj1lLnJlbmRlcmVyLGw9ITAsYz10aGlzLm9wdGlvbnMsdD0wLG4sdz10aGlzLmdldExhYmVsKCksQj1lLnBsb3RUb3A7YS5pc1N0cmluZyhnKSYmKGc9WyExLGddKTtnLnNsaWNlKDAsZi5sZW5ndGgrMSkuZm9yRWFjaChmdW5jdGlvbihhLGQpe2lmKCExIT09YSYmXCJcIiE9PWEpe2Q9ZltkLTFdfHx7aXNIZWFkZXI6ITAscGxvdFg6ZlswXS5wbG90WCxwbG90WTplLnBsb3RIZWlnaHR9O3ZhciBrPWQuc2VyaWVzfHxoLHU9ay50dCxwPWQuc2VyaWVzfHx7fSxnPVwiaGlnaGNoYXJ0cy1jb2xvci1cIit2KGQuY29sb3JJbmRleCxwLmNvbG9ySW5kZXgsXCJub25lXCIpO3V8fCh1PXtwYWRkaW5nOmMucGFkZGluZyxyOmMuYm9yZGVyUmFkaXVzfSxlLnN0eWxlZE1vZGV8fCh1LmZpbGw9Yy5iYWNrZ3JvdW5kQ29sb3IsXG51W1wic3Ryb2tlLXdpZHRoXCJdPWMuYm9yZGVyV2lkdGgpLGsudHQ9dT1iLmxhYmVsKG51bGwsbnVsbCxudWxsLChkLmlzSGVhZGVyP2MuaGVhZGVyU2hhcGU6Yy5zaGFwZSl8fFwiY2FsbG91dFwiLG51bGwsbnVsbCxjLnVzZUhUTUwpLmFkZENsYXNzKFwiaGlnaGNoYXJ0cy10b29sdGlwLWJveCBcIitnKS5hdHRyKHUpLmFkZCh3KSk7dS5pc0FjdGl2ZT0hMDt1LmF0dHIoe3RleHQ6YX0pO2Uuc3R5bGVkTW9kZXx8dS5jc3MoYy5zdHlsZSkuc2hhZG93KGMuc2hhZG93KS5hdHRyKHtzdHJva2U6Yy5ib3JkZXJDb2xvcnx8ZC5jb2xvcnx8cC5jb2xvcnx8XCIjMzMzMzMzXCJ9KTthPXUuZ2V0QkJveCgpO3A9YS53aWR0aCt1LnN0cm9rZVdpZHRoKCk7ZC5pc0hlYWRlcj8odD1hLmhlaWdodCxlLnhBeGlzWzBdLm9wcG9zaXRlJiYobj0hMCxCLT10KSxwPU1hdGgubWF4KDAsTWF0aC5taW4oZC5wbG90WCtlLnBsb3RMZWZ0LXAvMixlLmNoYXJ0V2lkdGgrKGUuc2Nyb2xsYWJsZVBpeGVsc1g/ZS5zY3JvbGxhYmxlUGl4ZWxzWC1cbmUubWFyZ2luUmlnaHQ6MCktcCkpKTpwPWQucGxvdFgrZS5wbG90TGVmdC12KGMuZGlzdGFuY2UsMTYpLXA7MD5wJiYobD0hMSk7YT0oZC5zZXJpZXMmJmQuc2VyaWVzLnlBeGlzJiZkLnNlcmllcy55QXhpcy5wb3MpKyhkLnBsb3RZfHwwKTthLT1CO2QuaXNIZWFkZXImJihhPW4/LXQ6ZS5wbG90SGVpZ2h0K3QpO3IucHVzaCh7dGFyZ2V0OmEscmFuazpkLmlzSGVhZGVyPzE6MCxzaXplOmsudHQuZ2V0QkJveCgpLmhlaWdodCsxLHBvaW50OmQseDpwLHR0OnV9KX19KTt0aGlzLmNsZWFuU3BsaXQoKTtjLnBvc2l0aW9uZXImJnIuZm9yRWFjaChmdW5jdGlvbihhKXt2YXIgZD1jLnBvc2l0aW9uZXIuY2FsbChoLGEudHQuZ2V0QkJveCgpLndpZHRoLGEuc2l6ZSxhLnBvaW50KTthLng9ZC54O2EuYWxpZ249MDthLnRhcmdldD1kLnk7YS5yYW5rPXYoZC5yYW5rLGEucmFuayl9KTthLmRpc3RyaWJ1dGUocixlLnBsb3RIZWlnaHQrdCk7ci5mb3JFYWNoKGZ1bmN0aW9uKGEpe3ZhciBkPWEucG9pbnQsXG5iPWQuc2VyaWVzO2EudHQuYXR0cih7dmlzaWJpbGl0eTp2b2lkIDA9PT1hLnBvcz9cImhpZGRlblwiOlwiaW5oZXJpdFwiLHg6bHx8ZC5pc0hlYWRlcnx8Yy5wb3NpdGlvbmVyP2EueDpkLnBsb3RYK2UucGxvdExlZnQraC5kaXN0YW5jZSx5OmEucG9zK0IsYW5jaG9yWDpkLmlzSGVhZGVyP2QucGxvdFgrZS5wbG90TGVmdDpkLnBsb3RYK2IueEF4aXMucG9zLGFuY2hvclk6ZC5pc0hlYWRlcj9lLnBsb3RUb3ArZS5wbG90SGVpZ2h0LzI6ZC5wbG90WStiLnlBeGlzLnBvc30pfSl9LHVwZGF0ZVBvc2l0aW9uOmZ1bmN0aW9uKGEpe3ZhciBmPXRoaXMuY2hhcnQsaD10aGlzLmdldExhYmVsKCkscj0odGhpcy5vcHRpb25zLnBvc2l0aW9uZXJ8fHRoaXMuZ2V0UG9zaXRpb24pLmNhbGwodGhpcyxoLndpZHRoLGguaGVpZ2h0LGEpLGU9YS5wbG90WCtmLnBsb3RMZWZ0O2E9YS5wbG90WStmLnBsb3RUb3A7dmFyIGI7dGhpcy5vdXRzaWRlJiYoYj0odGhpcy5vcHRpb25zLmJvcmRlcldpZHRofHwwKSsyKlxudGhpcy5kaXN0YW5jZSx0aGlzLnJlbmRlcmVyLnNldFNpemUoaC53aWR0aCtiLGguaGVpZ2h0K2IsITEpLGUrPWYucG9pbnRlci5jaGFydFBvc2l0aW9uLmxlZnQtci54LGErPWYucG9pbnRlci5jaGFydFBvc2l0aW9uLnRvcC1yLnkpO3RoaXMubW92ZShNYXRoLnJvdW5kKHIueCksTWF0aC5yb3VuZChyLnl8fDApLGUsYSl9LGdldERhdGVGb3JtYXQ6ZnVuY3Rpb24oYSxmLGgscil7dmFyIGU9dGhpcy5jaGFydC50aW1lLGI9ZS5kYXRlRm9ybWF0KFwiJW0tJWQgJUg6JU06JVMuJUxcIixmKSxsLGMsdD17bWlsbGlzZWNvbmQ6MTUsc2Vjb25kOjEyLG1pbnV0ZTo5LGhvdXI6NixkYXk6M30sZz1cIm1pbGxpc2Vjb25kXCI7Zm9yKGMgaW4geil7aWYoYT09PXoud2VlayYmK2UuZGF0ZUZvcm1hdChcIiV3XCIsZik9PT1oJiZcIjAwOjAwOjAwLjAwMFwiPT09Yi5zdWJzdHIoNikpe2M9XCJ3ZWVrXCI7YnJlYWt9aWYoeltjXT5hKXtjPWc7YnJlYWt9aWYodFtjXSYmYi5zdWJzdHIodFtjXSkhPT1cIjAxLTAxIDAwOjAwOjAwLjAwMFwiLnN1YnN0cih0W2NdKSlicmVhaztcblwid2Vla1wiIT09YyYmKGc9Yyl9YyYmKGw9ZS5yZXNvbHZlRFRMRm9ybWF0KHJbY10pLm1haW4pO3JldHVybiBsfSxnZXRYRGF0ZUZvcm1hdDpmdW5jdGlvbihhLGYsaCl7Zj1mLmRhdGVUaW1lTGFiZWxGb3JtYXRzO3ZhciByPWgmJmguY2xvc2VzdFBvaW50UmFuZ2U7cmV0dXJuKHI/dGhpcy5nZXREYXRlRm9ybWF0KHIsYS54LGgub3B0aW9ucy5zdGFydE9mV2VlayxmKTpmLmRheSl8fGYueWVhcn0sdG9vbHRpcEZvb3RlckhlYWRlckZvcm1hdHRlcjpmdW5jdGlvbihnLGYpe3ZhciBoPWY/XCJmb290ZXJcIjpcImhlYWRlclwiLHI9Zy5zZXJpZXMsZT1yLnRvb2x0aXBPcHRpb25zLGI9ZS54RGF0ZUZvcm1hdCxsPXIueEF4aXMsYz1sJiZcImRhdGV0aW1lXCI9PT1sLm9wdGlvbnMudHlwZSYmbShnLmtleSksdD1lW2grXCJGb3JtYXRcIl07Zj17aXNGb290ZXI6ZixsYWJlbENvbmZpZzpnfTthLmZpcmVFdmVudCh0aGlzLFwiaGVhZGVyRm9ybWF0dGVyXCIsZixmdW5jdGlvbihhKXtjJiYhYiYmKGI9dGhpcy5nZXRYRGF0ZUZvcm1hdChnLFxuZSxsKSk7YyYmYiYmKGcucG9pbnQmJmcucG9pbnQudG9vbHRpcERhdGVLZXlzfHxbXCJrZXlcIl0pLmZvckVhY2goZnVuY3Rpb24oYSl7dD10LnJlcGxhY2UoXCJ7cG9pbnQuXCIrYStcIn1cIixcIntwb2ludC5cIithK1wiOlwiK2IrXCJ9XCIpfSk7ci5jaGFydC5zdHlsZWRNb2RlJiYodD10aGlzLnN0eWxlZE1vZGVGb3JtYXQodCkpO2EudGV4dD1FKHQse3BvaW50Omcsc2VyaWVzOnJ9LHRoaXMuY2hhcnQudGltZSl9KTtyZXR1cm4gZi50ZXh0fSxib2R5Rm9ybWF0dGVyOmZ1bmN0aW9uKGEpe3JldHVybiBhLm1hcChmdW5jdGlvbihhKXt2YXIgaD1hLnNlcmllcy50b29sdGlwT3B0aW9ucztyZXR1cm4oaFsoYS5wb2ludC5mb3JtYXRQcmVmaXh8fFwicG9pbnRcIikrXCJGb3JtYXR0ZXJcIl18fGEucG9pbnQudG9vbHRpcEZvcm1hdHRlcikuY2FsbChhLnBvaW50LGhbKGEucG9pbnQuZm9ybWF0UHJlZml4fHxcInBvaW50XCIpK1wiRm9ybWF0XCJdfHxcIlwiKX0pfSxzdHlsZWRNb2RlRm9ybWF0OmZ1bmN0aW9uKGEpe3JldHVybiBhLnJlcGxhY2UoJ3N0eWxlXFx4M2RcImZvbnQtc2l6ZTogMTBweFwiJyxcbidjbGFzc1xceDNkXCJoaWdoY2hhcnRzLWhlYWRlclwiJykucmVwbGFjZSgvc3R5bGU9XCJjb2xvcjp7KHBvaW50fHNlcmllcylcXC5jb2xvcn1cIi9nLCdjbGFzc1xceDNkXCJoaWdoY2hhcnRzLWNvbG9yLXskMS5jb2xvckluZGV4fVwiJyl9fX0pO0koSCxcInBhcnRzL1BvaW50ZXIuanNcIixbSFtcInBhcnRzL0dsb2JhbHMuanNcIl1dLGZ1bmN0aW9uKGEpe3ZhciBDPWEuYWRkRXZlbnQsQT1hLmF0dHIsRT1hLmNoYXJ0cyxtPWEuY29sb3IsZz1hLmNzcyx2PWEuZGVmaW5lZCx4PWEuZXh0ZW5kLHk9YS5maW5kLHo9YS5maXJlRXZlbnQsbj1hLmlzTnVtYmVyLGY9YS5pc09iamVjdCxoPWEub2Zmc2V0LHI9YS5waWNrLGU9YS5zcGxhdCxiPWEuVG9vbHRpcDthLlBvaW50ZXI9ZnVuY3Rpb24oYSxiKXt0aGlzLmluaXQoYSxiKX07YS5Qb2ludGVyLnByb3RvdHlwZT17aW5pdDpmdW5jdGlvbihhLGMpe3RoaXMub3B0aW9ucz1jO3RoaXMuY2hhcnQ9YTt0aGlzLnJ1bkNoYXJ0Q2xpY2s9Yy5jaGFydC5ldmVudHMmJlxuISFjLmNoYXJ0LmV2ZW50cy5jbGljazt0aGlzLnBpbmNoRG93bj1bXTt0aGlzLmxhc3RWYWxpZFRvdWNoPXt9O2ImJihhLnRvb2x0aXA9bmV3IGIoYSxjLnRvb2x0aXApLHRoaXMuZm9sbG93VG91Y2hNb3ZlPXIoYy50b29sdGlwLmZvbGxvd1RvdWNoTW92ZSwhMCkpO3RoaXMuc2V0RE9NRXZlbnRzKCl9LHpvb21PcHRpb246ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jaGFydCxlPWIub3B0aW9ucy5jaGFydCxsPWUuem9vbVR5cGV8fFwiXCIsYj1iLmludmVydGVkOy90b3VjaC8udGVzdChhLnR5cGUpJiYobD1yKGUucGluY2hUeXBlLGwpKTt0aGlzLnpvb21YPWE9L3gvLnRlc3QobCk7dGhpcy56b29tWT1sPS95Ly50ZXN0KGwpO3RoaXMuem9vbUhvcj1hJiYhYnx8bCYmYjt0aGlzLnpvb21WZXJ0PWwmJiFifHxhJiZiO3RoaXMuaGFzWm9vbT1hfHxsfSxub3JtYWxpemU6ZnVuY3Rpb24oYSxiKXt2YXIgYztjPWEudG91Y2hlcz9hLnRvdWNoZXMubGVuZ3RoP2EudG91Y2hlcy5pdGVtKDApOmEuY2hhbmdlZFRvdWNoZXNbMF06XG5hO2J8fCh0aGlzLmNoYXJ0UG9zaXRpb249Yj1oKHRoaXMuY2hhcnQuY29udGFpbmVyKSk7cmV0dXJuIHgoYSx7Y2hhcnRYOk1hdGgucm91bmQoYy5wYWdlWC1iLmxlZnQpLGNoYXJ0WTpNYXRoLnJvdW5kKGMucGFnZVktYi50b3ApfSl9LGdldENvb3JkaW5hdGVzOmZ1bmN0aW9uKGEpe3ZhciBiPXt4QXhpczpbXSx5QXhpczpbXX07dGhpcy5jaGFydC5heGVzLmZvckVhY2goZnVuY3Rpb24oYyl7YltjLmlzWEF4aXM/XCJ4QXhpc1wiOlwieUF4aXNcIl0ucHVzaCh7YXhpczpjLHZhbHVlOmMudG9WYWx1ZShhW2MuaG9yaXo/XCJjaGFydFhcIjpcImNoYXJ0WVwiXSl9KX0pO3JldHVybiBifSxmaW5kTmVhcmVzdEtEUG9pbnQ6ZnVuY3Rpb24oYSxiLGUpe3ZhciBjO2EuZm9yRWFjaChmdW5jdGlvbihhKXt2YXIgbD0hKGEubm9TaGFyZWRUb29sdGlwJiZiKSYmMD5hLm9wdGlvbnMuZmluZE5lYXJlc3RQb2ludEJ5LmluZGV4T2YoXCJ5XCIpO2E9YS5zZWFyY2hQb2ludChlLGwpO2lmKChsPWYoYSwhMCkpJiYhKGw9XG4hZihjLCEwKSkpdmFyIGw9Yy5kaXN0WC1hLmRpc3RYLHQ9Yy5kaXN0LWEuZGlzdCxkPShhLnNlcmllcy5ncm91cCYmYS5zZXJpZXMuZ3JvdXAuekluZGV4KS0oYy5zZXJpZXMuZ3JvdXAmJmMuc2VyaWVzLmdyb3VwLnpJbmRleCksbD0wPCgwIT09bCYmYj9sOjAhPT10P3Q6MCE9PWQ/ZDpjLnNlcmllcy5pbmRleD5hLnNlcmllcy5pbmRleD8tMToxKTtsJiYoYz1hKX0pO3JldHVybiBjfSxnZXRQb2ludEZyb21FdmVudDpmdW5jdGlvbihhKXthPWEudGFyZ2V0O2Zvcih2YXIgYjthJiYhYjspYj1hLnBvaW50LGE9YS5wYXJlbnROb2RlO3JldHVybiBifSxnZXRDaGFydENvb3JkaW5hdGVzRnJvbVBvaW50OmZ1bmN0aW9uKGEsYil7dmFyIGM9YS5zZXJpZXMsZT1jLnhBeGlzLGM9Yy55QXhpcyxsPXIoYS5jbGllbnRYLGEucGxvdFgpLGg9YS5zaGFwZUFyZ3M7aWYoZSYmYylyZXR1cm4gYj97Y2hhcnRYOmUubGVuK2UucG9zLWwsY2hhcnRZOmMubGVuK2MucG9zLWEucGxvdFl9OntjaGFydFg6bCtcbmUucG9zLGNoYXJ0WTphLnBsb3RZK2MucG9zfTtpZihoJiZoLngmJmgueSlyZXR1cm57Y2hhcnRYOmgueCxjaGFydFk6aC55fX0sZ2V0SG92ZXJEYXRhOmZ1bmN0aW9uKGEsYixlLGgsdyxnKXt2YXIgYyxkPVtdO2g9ISghaHx8IWEpO3ZhciBrPWImJiFiLnN0aWNreVRyYWNraW5nP1tiXTplLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS52aXNpYmxlJiYhKCF3JiZhLmRpcmVjdFRvdWNoKSYmcihhLm9wdGlvbnMuZW5hYmxlTW91c2VUcmFja2luZywhMCkmJmEuc3RpY2t5VHJhY2tpbmd9KTtiPShjPWg/YTp0aGlzLmZpbmROZWFyZXN0S0RQb2ludChrLHcsZykpJiZjLnNlcmllcztjJiYodyYmIWIubm9TaGFyZWRUb29sdGlwPyhrPWUuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnZpc2libGUmJiEoIXcmJmEuZGlyZWN0VG91Y2gpJiZyKGEub3B0aW9ucy5lbmFibGVNb3VzZVRyYWNraW5nLCEwKSYmIWEubm9TaGFyZWRUb29sdGlwfSksay5mb3JFYWNoKGZ1bmN0aW9uKGEpe3ZhciBiPVxueShhLnBvaW50cyxmdW5jdGlvbihhKXtyZXR1cm4gYS54PT09Yy54JiYhYS5pc051bGx9KTtmKGIpJiYoYS5jaGFydC5pc0Jvb3N0aW5nJiYoYj1hLmdldFBvaW50KGIpKSxkLnB1c2goYikpfSkpOmQucHVzaChjKSk7cmV0dXJue2hvdmVyUG9pbnQ6Yyxob3ZlclNlcmllczpiLGhvdmVyUG9pbnRzOmR9fSxydW5Qb2ludEFjdGlvbnM6ZnVuY3Rpb24oYixjKXt2YXIgZT10aGlzLmNoYXJ0LGw9ZS50b29sdGlwJiZlLnRvb2x0aXAub3B0aW9ucy5lbmFibGVkP2UudG9vbHRpcDp2b2lkIDAsaD1sP2wuc2hhcmVkOiExLGY9Y3x8ZS5ob3ZlclBvaW50LHA9ZiYmZi5zZXJpZXN8fGUuaG92ZXJTZXJpZXMscD10aGlzLmdldEhvdmVyRGF0YShmLHAsZS5zZXJpZXMsXCJ0b3VjaG1vdmVcIiE9PWIudHlwZSYmKCEhY3x8cCYmcC5kaXJlY3RUb3VjaCYmdGhpcy5pc0RpcmVjdFRvdWNoKSxoLGIpLGQ9W10sayxmPXAuaG92ZXJQb2ludDtrPXAuaG92ZXJQb2ludHM7Yz0ocD1wLmhvdmVyU2VyaWVzKSYmXG5wLnRvb2x0aXBPcHRpb25zLmZvbGxvd1BvaW50ZXI7aD1oJiZwJiYhcC5ub1NoYXJlZFRvb2x0aXA7aWYoZiYmKGYhPT1lLmhvdmVyUG9pbnR8fGwmJmwuaXNIaWRkZW4pKXsoZS5ob3ZlclBvaW50c3x8W10pLmZvckVhY2goZnVuY3Rpb24oYSl7LTE9PT1rLmluZGV4T2YoYSkmJmEuc2V0U3RhdGUoKX0pO2lmKGUuaG92ZXJTZXJpZXMhPT1wKXAub25Nb3VzZU92ZXIoKTtkPXRoaXMuZ2V0QWN0aXZlU2VyaWVzKGspO2Uuc2VyaWVzLmZvckVhY2goZnVuY3Rpb24oYSl7KGEub3B0aW9ucy5pbmFjdGl2ZU90aGVyUG9pbnRzfHwtMT09PWQuaW5kZXhPZihhKSkmJmEuc2V0U3RhdGUoXCJpbmFjdGl2ZVwiLCEwKX0pOyhrfHxbXSkuZm9yRWFjaChmdW5jdGlvbihhKXthLnNldFN0YXRlKFwiaG92ZXJcIil9KTtlLmhvdmVyUG9pbnQmJmUuaG92ZXJQb2ludC5maXJlUG9pbnRFdmVudChcIm1vdXNlT3V0XCIpO2lmKCFmLnNlcmllcylyZXR1cm47Zi5maXJlUG9pbnRFdmVudChcIm1vdXNlT3ZlclwiKTtlLmhvdmVyUG9pbnRzPVxuaztlLmhvdmVyUG9pbnQ9ZjtsJiZsLnJlZnJlc2goaD9rOmYsYil9ZWxzZSBjJiZsJiYhbC5pc0hpZGRlbiYmKGY9bC5nZXRBbmNob3IoW3t9XSxiKSxsLnVwZGF0ZVBvc2l0aW9uKHtwbG90WDpmWzBdLHBsb3RZOmZbMV19KSk7dGhpcy51bkRvY01vdXNlTW92ZXx8KHRoaXMudW5Eb2NNb3VzZU1vdmU9QyhlLmNvbnRhaW5lci5vd25lckRvY3VtZW50LFwibW91c2Vtb3ZlXCIsZnVuY3Rpb24oZCl7dmFyIGI9RVthLmhvdmVyQ2hhcnRJbmRleF07aWYoYiliLnBvaW50ZXIub25Eb2N1bWVudE1vdXNlTW92ZShkKX0pKTtlLmF4ZXMuZm9yRWFjaChmdW5jdGlvbihkKXt2YXIgYz1yKGQuY3Jvc3NoYWlyLnNuYXAsITApLGU9Yz9hLmZpbmQoayxmdW5jdGlvbihhKXtyZXR1cm4gYS5zZXJpZXNbZC5jb2xsXT09PWR9KTp2b2lkIDA7ZXx8IWM/ZC5kcmF3Q3Jvc3NoYWlyKGIsZSk6ZC5oaWRlQ3Jvc3NoYWlyKCl9KX0sZ2V0QWN0aXZlU2VyaWVzOmZ1bmN0aW9uKGEpe3ZhciBiPVtdLGU7KGF8fFtdKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe2U9XG5hLnNlcmllcztiLnB1c2goZSk7ZS5saW5rZWRQYXJlbnQmJmIucHVzaChlLmxpbmtlZFBhcmVudCk7ZS5saW5rZWRTZXJpZXMmJihiPWIuY29uY2F0KGUubGlua2VkU2VyaWVzKSk7ZS5uYXZpZ2F0b3JTZXJpZXMmJmIucHVzaChlLm5hdmlnYXRvclNlcmllcyl9KTtyZXR1cm4gYn0scmVzZXQ6ZnVuY3Rpb24oYSxiKXt2YXIgYz10aGlzLmNoYXJ0LGw9Yy5ob3ZlclNlcmllcyxoPWMuaG92ZXJQb2ludCxmPWMuaG92ZXJQb2ludHMscD1jLnRvb2x0aXAsZD1wJiZwLnNoYXJlZD9mOmg7YSYmZCYmZShkKS5mb3JFYWNoKGZ1bmN0aW9uKGQpe2Quc2VyaWVzLmlzQ2FydGVzaWFuJiZ2b2lkIDA9PT1kLnBsb3RYJiYoYT0hMSl9KTtpZihhKXAmJmQmJmUoZCkubGVuZ3RoJiYocC5yZWZyZXNoKGQpLHAuc2hhcmVkJiZmP2YuZm9yRWFjaChmdW5jdGlvbihhKXthLnNldFN0YXRlKGEuc3RhdGUsITApO2Euc2VyaWVzLmlzQ2FydGVzaWFuJiYoYS5zZXJpZXMueEF4aXMuY3Jvc3NoYWlyJiZhLnNlcmllcy54QXhpcy5kcmF3Q3Jvc3NoYWlyKG51bGwsXG5hKSxhLnNlcmllcy55QXhpcy5jcm9zc2hhaXImJmEuc2VyaWVzLnlBeGlzLmRyYXdDcm9zc2hhaXIobnVsbCxhKSl9KTpoJiYoaC5zZXRTdGF0ZShoLnN0YXRlLCEwKSxjLmF4ZXMuZm9yRWFjaChmdW5jdGlvbihhKXthLmNyb3NzaGFpciYmYS5kcmF3Q3Jvc3NoYWlyKG51bGwsaCl9KSkpO2Vsc2V7aWYoaCloLm9uTW91c2VPdXQoKTtmJiZmLmZvckVhY2goZnVuY3Rpb24oYSl7YS5zZXRTdGF0ZSgpfSk7aWYobClsLm9uTW91c2VPdXQoKTtwJiZwLmhpZGUoYik7dGhpcy51bkRvY01vdXNlTW92ZSYmKHRoaXMudW5Eb2NNb3VzZU1vdmU9dGhpcy51bkRvY01vdXNlTW92ZSgpKTtjLmF4ZXMuZm9yRWFjaChmdW5jdGlvbihhKXthLmhpZGVDcm9zc2hhaXIoKX0pO3RoaXMuaG92ZXJYPWMuaG92ZXJQb2ludHM9Yy5ob3ZlclBvaW50PW51bGx9fSxzY2FsZUdyb3VwczpmdW5jdGlvbihhLGIpe3ZhciBjPXRoaXMuY2hhcnQsZTtjLnNlcmllcy5mb3JFYWNoKGZ1bmN0aW9uKGwpe2U9YXx8bC5nZXRQbG90Qm94KCk7XG5sLnhBeGlzJiZsLnhBeGlzLnpvb21FbmFibGVkJiZsLmdyb3VwJiYobC5ncm91cC5hdHRyKGUpLGwubWFya2VyR3JvdXAmJihsLm1hcmtlckdyb3VwLmF0dHIoZSksbC5tYXJrZXJHcm91cC5jbGlwKGI/Yy5jbGlwUmVjdDpudWxsKSksbC5kYXRhTGFiZWxzR3JvdXAmJmwuZGF0YUxhYmVsc0dyb3VwLmF0dHIoZSkpfSk7Yy5jbGlwUmVjdC5hdHRyKGJ8fGMuY2xpcEJveCl9LGRyYWdTdGFydDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmNoYXJ0O2IubW91c2VJc0Rvd249YS50eXBlO2IuY2FuY2VsQ2xpY2s9ITE7Yi5tb3VzZURvd25YPXRoaXMubW91c2VEb3duWD1hLmNoYXJ0WDtiLm1vdXNlRG93blk9dGhpcy5tb3VzZURvd25ZPWEuY2hhcnRZfSxkcmFnOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuY2hhcnQsZT1iLm9wdGlvbnMuY2hhcnQsbD1hLmNoYXJ0WCxoPWEuY2hhcnRZLGY9dGhpcy56b29tSG9yLHA9dGhpcy56b29tVmVydCxkPWIucGxvdExlZnQsaz1iLnBsb3RUb3AsdT1iLnBsb3RXaWR0aCxcbmc9Yi5wbG90SGVpZ2h0LHIscT10aGlzLnNlbGVjdGlvbk1hcmtlcixuPXRoaXMubW91c2VEb3duWCx2PXRoaXMubW91c2VEb3duWSx4PWUucGFuS2V5JiZhW2UucGFuS2V5K1wiS2V5XCJdO3EmJnEudG91Y2h8fChsPGQ/bD1kOmw+ZCt1JiYobD1kK3UpLGg8az9oPWs6aD5rK2cmJihoPWsrZyksdGhpcy5oYXNEcmFnZ2VkPU1hdGguc3FydChNYXRoLnBvdyhuLWwsMikrTWF0aC5wb3codi1oLDIpKSwxMDx0aGlzLmhhc0RyYWdnZWQmJihyPWIuaXNJbnNpZGVQbG90KG4tZCx2LWspLGIuaGFzQ2FydGVzaWFuU2VyaWVzJiYodGhpcy56b29tWHx8dGhpcy56b29tWSkmJnImJiF4JiYhcSYmKHRoaXMuc2VsZWN0aW9uTWFya2VyPXE9Yi5yZW5kZXJlci5yZWN0KGQsayxmPzE6dSxwPzE6ZywwKS5hdHRyKHtcImNsYXNzXCI6XCJoaWdoY2hhcnRzLXNlbGVjdGlvbi1tYXJrZXJcIix6SW5kZXg6N30pLmFkZCgpLGIuc3R5bGVkTW9kZXx8cS5hdHRyKHtmaWxsOmUuc2VsZWN0aW9uTWFya2VyRmlsbHx8bShcIiMzMzVjYWRcIikuc2V0T3BhY2l0eSguMjUpLmdldCgpfSkpLFxucSYmZiYmKGwtPW4scS5hdHRyKHt3aWR0aDpNYXRoLmFicyhsKSx4OigwPGw/MDpsKStufSkpLHEmJnAmJihsPWgtdixxLmF0dHIoe2hlaWdodDpNYXRoLmFicyhsKSx5OigwPGw/MDpsKSt2fSkpLHImJiFxJiZlLnBhbm5pbmcmJmIucGFuKGEsZS5wYW5uaW5nKSkpfSxkcm9wOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMsZT10aGlzLmNoYXJ0LGw9dGhpcy5oYXNQaW5jaGVkO2lmKHRoaXMuc2VsZWN0aW9uTWFya2VyKXt2YXIgaD17b3JpZ2luYWxFdmVudDphLHhBeGlzOltdLHlBeGlzOltdfSxmPXRoaXMuc2VsZWN0aW9uTWFya2VyLHA9Zi5hdHRyP2YuYXR0cihcInhcIik6Zi54LGQ9Zi5hdHRyP2YuYXR0cihcInlcIik6Zi55LGs9Zi5hdHRyP2YuYXR0cihcIndpZHRoXCIpOmYud2lkdGgsdT1mLmF0dHI/Zi5hdHRyKFwiaGVpZ2h0XCIpOmYuaGVpZ2h0LHI7aWYodGhpcy5oYXNEcmFnZ2VkfHxsKWUuYXhlcy5mb3JFYWNoKGZ1bmN0aW9uKGMpe2lmKGMuem9vbUVuYWJsZWQmJnYoYy5taW4pJiYobHx8XG5iW3t4QXhpczpcInpvb21YXCIseUF4aXM6XCJ6b29tWVwifVtjLmNvbGxdXSkpe3ZhciBlPWMuaG9yaXosdD1cInRvdWNoZW5kXCI9PT1hLnR5cGU/Yy5taW5QaXhlbFBhZGRpbmc6MCxmPWMudG9WYWx1ZSgoZT9wOmQpK3QpLGU9Yy50b1ZhbHVlKChlP3ArazpkK3UpLXQpO2hbYy5jb2xsXS5wdXNoKHtheGlzOmMsbWluOk1hdGgubWluKGYsZSksbWF4Ok1hdGgubWF4KGYsZSl9KTtyPSEwfX0pLHImJnooZSxcInNlbGVjdGlvblwiLGgsZnVuY3Rpb24oYSl7ZS56b29tKHgoYSxsP3thbmltYXRpb246ITF9Om51bGwpKX0pO24oZS5pbmRleCkmJih0aGlzLnNlbGVjdGlvbk1hcmtlcj10aGlzLnNlbGVjdGlvbk1hcmtlci5kZXN0cm95KCkpO2wmJnRoaXMuc2NhbGVHcm91cHMoKX1lJiZuKGUuaW5kZXgpJiYoZyhlLmNvbnRhaW5lcix7Y3Vyc29yOmUuX2N1cnNvcn0pLGUuY2FuY2VsQ2xpY2s9MTA8dGhpcy5oYXNEcmFnZ2VkLGUubW91c2VJc0Rvd249dGhpcy5oYXNEcmFnZ2VkPXRoaXMuaGFzUGluY2hlZD1cbiExLHRoaXMucGluY2hEb3duPVtdKX0sb25Db250YWluZXJNb3VzZURvd246ZnVuY3Rpb24oYSl7YT10aGlzLm5vcm1hbGl6ZShhKTsyIT09YS5idXR0b24mJih0aGlzLnpvb21PcHRpb24oYSksYS5wcmV2ZW50RGVmYXVsdCYmYS5wcmV2ZW50RGVmYXVsdCgpLHRoaXMuZHJhZ1N0YXJ0KGEpKX0sb25Eb2N1bWVudE1vdXNlVXA6ZnVuY3Rpb24oYil7RVthLmhvdmVyQ2hhcnRJbmRleF0mJkVbYS5ob3ZlckNoYXJ0SW5kZXhdLnBvaW50ZXIuZHJvcChiKX0sb25Eb2N1bWVudE1vdXNlTW92ZTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmNoYXJ0LGU9dGhpcy5jaGFydFBvc2l0aW9uO2E9dGhpcy5ub3JtYWxpemUoYSxlKTshZXx8dGhpcy5pbkNsYXNzKGEudGFyZ2V0LFwiaGlnaGNoYXJ0cy10cmFja2VyXCIpfHxiLmlzSW5zaWRlUGxvdChhLmNoYXJ0WC1iLnBsb3RMZWZ0LGEuY2hhcnRZLWIucGxvdFRvcCl8fHRoaXMucmVzZXQoKX0sb25Db250YWluZXJNb3VzZUxlYXZlOmZ1bmN0aW9uKGIpe3ZhciBjPVxuRVthLmhvdmVyQ2hhcnRJbmRleF07YyYmKGIucmVsYXRlZFRhcmdldHx8Yi50b0VsZW1lbnQpJiYoYy5wb2ludGVyLnJlc2V0KCksYy5wb2ludGVyLmNoYXJ0UG9zaXRpb249bnVsbCl9LG9uQ29udGFpbmVyTW91c2VNb3ZlOmZ1bmN0aW9uKGIpe3ZhciBjPXRoaXMuY2hhcnQ7dihhLmhvdmVyQ2hhcnRJbmRleCkmJkVbYS5ob3ZlckNoYXJ0SW5kZXhdJiZFW2EuaG92ZXJDaGFydEluZGV4XS5tb3VzZUlzRG93bnx8KGEuaG92ZXJDaGFydEluZGV4PWMuaW5kZXgpO2I9dGhpcy5ub3JtYWxpemUoYik7Yi5wcmV2ZW50RGVmYXVsdHx8KGIucmV0dXJuVmFsdWU9ITEpO1wibW91c2Vkb3duXCI9PT1jLm1vdXNlSXNEb3duJiZ0aGlzLmRyYWcoYik7IXRoaXMuaW5DbGFzcyhiLnRhcmdldCxcImhpZ2hjaGFydHMtdHJhY2tlclwiKSYmIWMuaXNJbnNpZGVQbG90KGIuY2hhcnRYLWMucGxvdExlZnQsYi5jaGFydFktYy5wbG90VG9wKXx8Yy5vcGVuTWVudXx8dGhpcy5ydW5Qb2ludEFjdGlvbnMoYil9LFxuaW5DbGFzczpmdW5jdGlvbihhLGIpe2Zvcih2YXIgYzthOyl7aWYoYz1BKGEsXCJjbGFzc1wiKSl7aWYoLTEhPT1jLmluZGV4T2YoYikpcmV0dXJuITA7aWYoLTEhPT1jLmluZGV4T2YoXCJoaWdoY2hhcnRzLWNvbnRhaW5lclwiKSlyZXR1cm4hMX1hPWEucGFyZW50Tm9kZX19LG9uVHJhY2tlck1vdXNlT3V0OmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuY2hhcnQuaG92ZXJTZXJpZXM7YT1hLnJlbGF0ZWRUYXJnZXR8fGEudG9FbGVtZW50O3RoaXMuaXNEaXJlY3RUb3VjaD0hMTtpZighKCFifHwhYXx8Yi5zdGlja3lUcmFja2luZ3x8dGhpcy5pbkNsYXNzKGEsXCJoaWdoY2hhcnRzLXRvb2x0aXBcIil8fHRoaXMuaW5DbGFzcyhhLFwiaGlnaGNoYXJ0cy1zZXJpZXMtXCIrYi5pbmRleCkmJnRoaXMuaW5DbGFzcyhhLFwiaGlnaGNoYXJ0cy10cmFja2VyXCIpKSliLm9uTW91c2VPdXQoKX0sb25Db250YWluZXJDbGljazpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmNoYXJ0LGU9Yi5ob3ZlclBvaW50LGw9Yi5wbG90TGVmdCxcbmY9Yi5wbG90VG9wO2E9dGhpcy5ub3JtYWxpemUoYSk7Yi5jYW5jZWxDbGlja3x8KGUmJnRoaXMuaW5DbGFzcyhhLnRhcmdldCxcImhpZ2hjaGFydHMtdHJhY2tlclwiKT8oeihlLnNlcmllcyxcImNsaWNrXCIseChhLHtwb2ludDplfSkpLGIuaG92ZXJQb2ludCYmZS5maXJlUG9pbnRFdmVudChcImNsaWNrXCIsYSkpOih4KGEsdGhpcy5nZXRDb29yZGluYXRlcyhhKSksYi5pc0luc2lkZVBsb3QoYS5jaGFydFgtbCxhLmNoYXJ0WS1mKSYmeihiLFwiY2xpY2tcIixhKSkpfSxzZXRET01FdmVudHM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLGM9Yi5jaGFydC5jb250YWluZXIsZT1jLm93bmVyRG9jdW1lbnQ7Yy5vbm1vdXNlZG93bj1mdW5jdGlvbihhKXtiLm9uQ29udGFpbmVyTW91c2VEb3duKGEpfTtjLm9ubW91c2Vtb3ZlPWZ1bmN0aW9uKGEpe2Iub25Db250YWluZXJNb3VzZU1vdmUoYSl9O2Mub25jbGljaz1mdW5jdGlvbihhKXtiLm9uQ29udGFpbmVyQ2xpY2soYSl9O3RoaXMudW5iaW5kQ29udGFpbmVyTW91c2VMZWF2ZT1cbkMoYyxcIm1vdXNlbGVhdmVcIixiLm9uQ29udGFpbmVyTW91c2VMZWF2ZSk7YS51bmJpbmREb2N1bWVudE1vdXNlVXB8fChhLnVuYmluZERvY3VtZW50TW91c2VVcD1DKGUsXCJtb3VzZXVwXCIsYi5vbkRvY3VtZW50TW91c2VVcCkpO2EuaGFzVG91Y2gmJihjLm9udG91Y2hzdGFydD1mdW5jdGlvbihhKXtiLm9uQ29udGFpbmVyVG91Y2hTdGFydChhKX0sYy5vbnRvdWNobW92ZT1mdW5jdGlvbihhKXtiLm9uQ29udGFpbmVyVG91Y2hNb3ZlKGEpfSxhLnVuYmluZERvY3VtZW50VG91Y2hFbmR8fChhLnVuYmluZERvY3VtZW50VG91Y2hFbmQ9QyhlLFwidG91Y2hlbmRcIixiLm9uRG9jdW1lbnRUb3VjaEVuZCkpKX0sZGVzdHJveTpmdW5jdGlvbigpe3ZhciBiPXRoaXM7Yi51bkRvY01vdXNlTW92ZSYmYi51bkRvY01vdXNlTW92ZSgpO3RoaXMudW5iaW5kQ29udGFpbmVyTW91c2VMZWF2ZSgpO2EuY2hhcnRDb3VudHx8KGEudW5iaW5kRG9jdW1lbnRNb3VzZVVwJiYoYS51bmJpbmREb2N1bWVudE1vdXNlVXA9XG5hLnVuYmluZERvY3VtZW50TW91c2VVcCgpKSxhLnVuYmluZERvY3VtZW50VG91Y2hFbmQmJihhLnVuYmluZERvY3VtZW50VG91Y2hFbmQ9YS51bmJpbmREb2N1bWVudFRvdWNoRW5kKCkpKTtjbGVhckludGVydmFsKGIudG9vbHRpcFRpbWVvdXQpO2Eub2JqZWN0RWFjaChiLGZ1bmN0aW9uKGEsZSl7YltlXT1udWxsfSl9fX0pO0koSCxcInBhcnRzL1RvdWNoUG9pbnRlci5qc1wiLFtIW1wicGFydHMvR2xvYmFscy5qc1wiXV0sZnVuY3Rpb24oYSl7dmFyIEM9YS5jaGFydHMsQT1hLmV4dGVuZCxFPWEubm9vcCxtPWEucGljaztBKGEuUG9pbnRlci5wcm90b3R5cGUse3BpbmNoVHJhbnNsYXRlOmZ1bmN0aW9uKGEsbSx4LHkseixuKXt0aGlzLnpvb21Ib3ImJnRoaXMucGluY2hUcmFuc2xhdGVEaXJlY3Rpb24oITAsYSxtLHgseSx6LG4pO3RoaXMuem9vbVZlcnQmJnRoaXMucGluY2hUcmFuc2xhdGVEaXJlY3Rpb24oITEsYSxtLHgseSx6LG4pfSxwaW5jaFRyYW5zbGF0ZURpcmVjdGlvbjpmdW5jdGlvbihhLFxubSx4LHkseixuLGYsaCl7dmFyIHI9dGhpcy5jaGFydCxlPWE/XCJ4XCI6XCJ5XCIsYj1hP1wiWFwiOlwiWVwiLGw9XCJjaGFydFwiK2IsYz1hP1wid2lkdGhcIjpcImhlaWdodFwiLHQ9cltcInBsb3RcIisoYT9cIkxlZnRcIjpcIlRvcFwiKV0sZyx3LEI9aHx8MSxwPXIuaW52ZXJ0ZWQsZD1yLmJvdW5kc1thP1wiaFwiOlwidlwiXSxrPTE9PT1tLmxlbmd0aCx1PW1bMF1bbF0sRD14WzBdW2xdLEc9IWsmJm1bMV1bbF0scT0hayYmeFsxXVtsXSxLO3g9ZnVuY3Rpb24oKXshayYmMjA8TWF0aC5hYnModS1HKSYmKEI9aHx8TWF0aC5hYnMoRC1xKS9NYXRoLmFicyh1LUcpKTt3PSh0LUQpL0IrdTtnPXJbXCJwbG90XCIrKGE/XCJXaWR0aFwiOlwiSGVpZ2h0XCIpXS9CfTt4KCk7bT13O208ZC5taW4/KG09ZC5taW4sSz0hMCk6bStnPmQubWF4JiYobT1kLm1heC1nLEs9ITApO0s/KEQtPS44KihELWZbZV1bMF0pLGt8fChxLT0uOCoocS1mW2VdWzFdKSkseCgpKTpmW2VdPVtELHFdO3B8fChuW2VdPXctdCxuW2NdPWcpO249cD8xL0I6Qjt6W2NdPVxuZzt6W2VdPW07eVtwP2E/XCJzY2FsZVlcIjpcInNjYWxlWFwiOlwic2NhbGVcIitiXT1CO3lbXCJ0cmFuc2xhdGVcIitiXT1uKnQrKEQtbip1KX0scGluY2g6ZnVuY3Rpb24oYSl7dmFyIGc9dGhpcyx4PWcuY2hhcnQseT1nLnBpbmNoRG93bix6PWEudG91Y2hlcyxuPXoubGVuZ3RoLGY9Zy5sYXN0VmFsaWRUb3VjaCxoPWcuaGFzWm9vbSxyPWcuc2VsZWN0aW9uTWFya2VyLGU9e30sYj0xPT09biYmKGcuaW5DbGFzcyhhLnRhcmdldCxcImhpZ2hjaGFydHMtdHJhY2tlclwiKSYmeC5ydW5UcmFja2VyQ2xpY2t8fGcucnVuQ2hhcnRDbGljayksbD17fTsxPG4mJihnLmluaXRpYXRlZD0hMCk7aCYmZy5pbml0aWF0ZWQmJiFiJiZhLnByZXZlbnREZWZhdWx0KCk7W10ubWFwLmNhbGwoeixmdW5jdGlvbihhKXtyZXR1cm4gZy5ub3JtYWxpemUoYSl9KTtcInRvdWNoc3RhcnRcIj09PWEudHlwZT8oW10uZm9yRWFjaC5jYWxsKHosZnVuY3Rpb24oYSxiKXt5W2JdPXtjaGFydFg6YS5jaGFydFgsY2hhcnRZOmEuY2hhcnRZfX0pLFxuZi54PVt5WzBdLmNoYXJ0WCx5WzFdJiZ5WzFdLmNoYXJ0WF0sZi55PVt5WzBdLmNoYXJ0WSx5WzFdJiZ5WzFdLmNoYXJ0WV0seC5heGVzLmZvckVhY2goZnVuY3Rpb24oYSl7aWYoYS56b29tRW5hYmxlZCl7dmFyIGI9eC5ib3VuZHNbYS5ob3Jpej9cImhcIjpcInZcIl0sYz1hLm1pblBpeGVsUGFkZGluZyxlPWEudG9QaXhlbHMoTWF0aC5taW4obShhLm9wdGlvbnMubWluLGEuZGF0YU1pbiksYS5kYXRhTWluKSksbD1hLnRvUGl4ZWxzKE1hdGgubWF4KG0oYS5vcHRpb25zLm1heCxhLmRhdGFNYXgpLGEuZGF0YU1heCkpLHA9TWF0aC5tYXgoZSxsKTtiLm1pbj1NYXRoLm1pbihhLnBvcyxNYXRoLm1pbihlLGwpLWMpO2IubWF4PU1hdGgubWF4KGEucG9zK2EubGVuLHArYyl9fSksZy5yZXM9ITApOmcuZm9sbG93VG91Y2hNb3ZlJiYxPT09bj90aGlzLnJ1blBvaW50QWN0aW9ucyhnLm5vcm1hbGl6ZShhKSk6eS5sZW5ndGgmJihyfHwoZy5zZWxlY3Rpb25NYXJrZXI9cj1BKHtkZXN0cm95OkUsdG91Y2g6ITB9LFxueC5wbG90Qm94KSksZy5waW5jaFRyYW5zbGF0ZSh5LHosZSxyLGwsZiksZy5oYXNQaW5jaGVkPWgsZy5zY2FsZUdyb3VwcyhlLGwpLGcucmVzJiYoZy5yZXM9ITEsdGhpcy5yZXNldCghMSwwKSkpfSx0b3VjaDpmdW5jdGlvbihnLHYpe3ZhciB4PXRoaXMuY2hhcnQseSx6O2lmKHguaW5kZXghPT1hLmhvdmVyQ2hhcnRJbmRleCl0aGlzLm9uQ29udGFpbmVyTW91c2VMZWF2ZSh7cmVsYXRlZFRhcmdldDohMH0pO2EuaG92ZXJDaGFydEluZGV4PXguaW5kZXg7MT09PWcudG91Y2hlcy5sZW5ndGg/KGc9dGhpcy5ub3JtYWxpemUoZyksKHo9eC5pc0luc2lkZVBsb3QoZy5jaGFydFgteC5wbG90TGVmdCxnLmNoYXJ0WS14LnBsb3RUb3ApKSYmIXgub3Blbk1lbnU/KHYmJnRoaXMucnVuUG9pbnRBY3Rpb25zKGcpLFwidG91Y2htb3ZlXCI9PT1nLnR5cGUmJih2PXRoaXMucGluY2hEb3duLHk9dlswXT80PD1NYXRoLnNxcnQoTWF0aC5wb3codlswXS5jaGFydFgtZy5jaGFydFgsMikrTWF0aC5wb3codlswXS5jaGFydFktXG5nLmNoYXJ0WSwyKSk6ITEpLG0oeSwhMCkmJnRoaXMucGluY2goZykpOnYmJnRoaXMucmVzZXQoKSk6Mj09PWcudG91Y2hlcy5sZW5ndGgmJnRoaXMucGluY2goZyl9LG9uQ29udGFpbmVyVG91Y2hTdGFydDpmdW5jdGlvbihhKXt0aGlzLnpvb21PcHRpb24oYSk7dGhpcy50b3VjaChhLCEwKX0sb25Db250YWluZXJUb3VjaE1vdmU6ZnVuY3Rpb24oYSl7dGhpcy50b3VjaChhKX0sb25Eb2N1bWVudFRvdWNoRW5kOmZ1bmN0aW9uKGcpe0NbYS5ob3ZlckNoYXJ0SW5kZXhdJiZDW2EuaG92ZXJDaGFydEluZGV4XS5wb2ludGVyLmRyb3AoZyl9fSl9KTtJKEgsXCJwYXJ0cy9NU1BvaW50ZXIuanNcIixbSFtcInBhcnRzL0dsb2JhbHMuanNcIl1dLGZ1bmN0aW9uKGEpe3ZhciBDPWEuYWRkRXZlbnQsQT1hLmNoYXJ0cyxFPWEuY3NzLG09YS5kb2MsZz1hLmV4dGVuZCx2PWEubm9vcCx4PWEuUG9pbnRlcix5PWEucmVtb3ZlRXZlbnQsej1hLndpbixuPWEud3JhcDtpZighYS5oYXNUb3VjaCYmKHouUG9pbnRlckV2ZW50fHxcbnouTVNQb2ludGVyRXZlbnQpKXt2YXIgZj17fSxoPSEhei5Qb2ludGVyRXZlbnQscj1mdW5jdGlvbigpe3ZhciBiPVtdO2IuaXRlbT1mdW5jdGlvbihhKXtyZXR1cm4gdGhpc1thXX07YS5vYmplY3RFYWNoKGYsZnVuY3Rpb24oYSl7Yi5wdXNoKHtwYWdlWDphLnBhZ2VYLHBhZ2VZOmEucGFnZVksdGFyZ2V0OmEudGFyZ2V0fSl9KTtyZXR1cm4gYn0sZT1mdW5jdGlvbihiLGUsYyxmKXtcInRvdWNoXCIhPT1iLnBvaW50ZXJUeXBlJiZiLnBvaW50ZXJUeXBlIT09Yi5NU1BPSU5URVJfVFlQRV9UT1VDSHx8IUFbYS5ob3ZlckNoYXJ0SW5kZXhdfHwoZihiKSxmPUFbYS5ob3ZlckNoYXJ0SW5kZXhdLnBvaW50ZXIsZltlXSh7dHlwZTpjLHRhcmdldDpiLmN1cnJlbnRUYXJnZXQscHJldmVudERlZmF1bHQ6dix0b3VjaGVzOnIoKX0pKX07Zyh4LnByb3RvdHlwZSx7b25Db250YWluZXJQb2ludGVyRG93bjpmdW5jdGlvbihhKXtlKGEsXCJvbkNvbnRhaW5lclRvdWNoU3RhcnRcIixcInRvdWNoc3RhcnRcIixcbmZ1bmN0aW9uKGEpe2ZbYS5wb2ludGVySWRdPXtwYWdlWDphLnBhZ2VYLHBhZ2VZOmEucGFnZVksdGFyZ2V0OmEuY3VycmVudFRhcmdldH19KX0sb25Db250YWluZXJQb2ludGVyTW92ZTpmdW5jdGlvbihhKXtlKGEsXCJvbkNvbnRhaW5lclRvdWNoTW92ZVwiLFwidG91Y2htb3ZlXCIsZnVuY3Rpb24oYSl7ZlthLnBvaW50ZXJJZF09e3BhZ2VYOmEucGFnZVgscGFnZVk6YS5wYWdlWX07ZlthLnBvaW50ZXJJZF0udGFyZ2V0fHwoZlthLnBvaW50ZXJJZF0udGFyZ2V0PWEuY3VycmVudFRhcmdldCl9KX0sb25Eb2N1bWVudFBvaW50ZXJVcDpmdW5jdGlvbihhKXtlKGEsXCJvbkRvY3VtZW50VG91Y2hFbmRcIixcInRvdWNoZW5kXCIsZnVuY3Rpb24oYSl7ZGVsZXRlIGZbYS5wb2ludGVySWRdfSl9LGJhdGNoTVNFdmVudHM6ZnVuY3Rpb24oYSl7YSh0aGlzLmNoYXJ0LmNvbnRhaW5lcixoP1wicG9pbnRlcmRvd25cIjpcIk1TUG9pbnRlckRvd25cIix0aGlzLm9uQ29udGFpbmVyUG9pbnRlckRvd24pO2EodGhpcy5jaGFydC5jb250YWluZXIsXG5oP1wicG9pbnRlcm1vdmVcIjpcIk1TUG9pbnRlck1vdmVcIix0aGlzLm9uQ29udGFpbmVyUG9pbnRlck1vdmUpO2EobSxoP1wicG9pbnRlcnVwXCI6XCJNU1BvaW50ZXJVcFwiLHRoaXMub25Eb2N1bWVudFBvaW50ZXJVcCl9fSk7bih4LnByb3RvdHlwZSxcImluaXRcIixmdW5jdGlvbihhLGUsYyl7YS5jYWxsKHRoaXMsZSxjKTt0aGlzLmhhc1pvb20mJkUoZS5jb250YWluZXIse1wiLW1zLXRvdWNoLWFjdGlvblwiOlwibm9uZVwiLFwidG91Y2gtYWN0aW9uXCI6XCJub25lXCJ9KX0pO24oeC5wcm90b3R5cGUsXCJzZXRET01FdmVudHNcIixmdW5jdGlvbihhKXthLmFwcGx5KHRoaXMpOyh0aGlzLmhhc1pvb218fHRoaXMuZm9sbG93VG91Y2hNb3ZlKSYmdGhpcy5iYXRjaE1TRXZlbnRzKEMpfSk7bih4LnByb3RvdHlwZSxcImRlc3Ryb3lcIixmdW5jdGlvbihhKXt0aGlzLmJhdGNoTVNFdmVudHMoeSk7YS5jYWxsKHRoaXMpfSl9fSk7SShILFwicGFydHMvTGVnZW5kLmpzXCIsW0hbXCJwYXJ0cy9HbG9iYWxzLmpzXCJdXSxmdW5jdGlvbihhKXt2YXIgQz1cbmEuYWRkRXZlbnQsQT1hLmNzcyxFPWEuZGlzY2FyZEVsZW1lbnQsbT1hLmRlZmluZWQsZz1hLmZpcmVFdmVudCx2PWEuaXNGaXJlZm94LHg9YS5tYXJnaW5OYW1lcyx5PWEubWVyZ2Usej1hLnBpY2ssbj1hLnNldEFuaW1hdGlvbixmPWEuc3RhYmxlU29ydCxoPWEud2luLHI9YS53cmFwO2EuTGVnZW5kPWZ1bmN0aW9uKGEsYil7dGhpcy5pbml0KGEsYil9O2EuTGVnZW5kLnByb3RvdHlwZT17aW5pdDpmdW5jdGlvbihhLGIpe3RoaXMuY2hhcnQ9YTt0aGlzLnNldE9wdGlvbnMoYik7Yi5lbmFibGVkJiYodGhpcy5yZW5kZXIoKSxDKHRoaXMuY2hhcnQsXCJlbmRSZXNpemVcIixmdW5jdGlvbigpe3RoaXMubGVnZW5kLnBvc2l0aW9uQ2hlY2tib3hlcygpfSksdGhpcy5wcm94aW1hdGU/dGhpcy51bmNoYXJ0cmVuZGVyPUModGhpcy5jaGFydCxcInJlbmRlclwiLGZ1bmN0aW9uKCl7dGhpcy5sZWdlbmQucHJveGltYXRlUG9zaXRpb25zKCk7dGhpcy5sZWdlbmQucG9zaXRpb25JdGVtcygpfSk6dGhpcy51bmNoYXJ0cmVuZGVyJiZcbnRoaXMudW5jaGFydHJlbmRlcigpKX0sc2V0T3B0aW9uczpmdW5jdGlvbihhKXt2YXIgYj16KGEucGFkZGluZyw4KTt0aGlzLm9wdGlvbnM9YTt0aGlzLmNoYXJ0LnN0eWxlZE1vZGV8fCh0aGlzLml0ZW1TdHlsZT1hLml0ZW1TdHlsZSx0aGlzLml0ZW1IaWRkZW5TdHlsZT15KHRoaXMuaXRlbVN0eWxlLGEuaXRlbUhpZGRlblN0eWxlKSk7dGhpcy5pdGVtTWFyZ2luVG9wPWEuaXRlbU1hcmdpblRvcHx8MDt0aGlzLnBhZGRpbmc9Yjt0aGlzLmluaXRpYWxJdGVtWT1iLTU7dGhpcy5zeW1ib2xXaWR0aD16KGEuc3ltYm9sV2lkdGgsMTYpO3RoaXMucGFnZXM9W107dGhpcy5wcm94aW1hdGU9XCJwcm94aW1hdGVcIj09PWEubGF5b3V0JiYhdGhpcy5jaGFydC5pbnZlcnRlZH0sdXBkYXRlOmZ1bmN0aW9uKGEsYil7dmFyIGU9dGhpcy5jaGFydDt0aGlzLnNldE9wdGlvbnMoeSghMCx0aGlzLm9wdGlvbnMsYSkpO3RoaXMuZGVzdHJveSgpO2UuaXNEaXJ0eUxlZ2VuZD1lLmlzRGlydHlCb3g9ITA7XG56KGIsITApJiZlLnJlZHJhdygpO2codGhpcyxcImFmdGVyVXBkYXRlXCIpfSxjb2xvcml6ZUl0ZW06ZnVuY3Rpb24oYSxiKXthLmxlZ2VuZEdyb3VwW2I/XCJyZW1vdmVDbGFzc1wiOlwiYWRkQ2xhc3NcIl0oXCJoaWdoY2hhcnRzLWxlZ2VuZC1pdGVtLWhpZGRlblwiKTtpZighdGhpcy5jaGFydC5zdHlsZWRNb2RlKXt2YXIgZT10aGlzLm9wdGlvbnMsYz1hLmxlZ2VuZEl0ZW0sZj1hLmxlZ2VuZExpbmUsaD1hLmxlZ2VuZFN5bWJvbCxyPXRoaXMuaXRlbUhpZGRlblN0eWxlLmNvbG9yLGU9Yj9lLml0ZW1TdHlsZS5jb2xvcjpyLG49Yj9hLmNvbG9yfHxyOnIscD1hLm9wdGlvbnMmJmEub3B0aW9ucy5tYXJrZXIsZD17ZmlsbDpufTtjJiZjLmNzcyh7ZmlsbDplLGNvbG9yOmV9KTtmJiZmLmF0dHIoe3N0cm9rZTpufSk7aCYmKHAmJmguaXNNYXJrZXImJihkPWEucG9pbnRBdHRyaWJzKCksYnx8KGQuc3Ryb2tlPWQuZmlsbD1yKSksaC5hdHRyKGQpKX1nKHRoaXMsXCJhZnRlckNvbG9yaXplSXRlbVwiLHtpdGVtOmEsXG52aXNpYmxlOmJ9KX0scG9zaXRpb25JdGVtczpmdW5jdGlvbigpe3RoaXMuYWxsSXRlbXMuZm9yRWFjaCh0aGlzLnBvc2l0aW9uSXRlbSx0aGlzKTt0aGlzLmNoYXJ0LmlzUmVzaXppbmd8fHRoaXMucG9zaXRpb25DaGVja2JveGVzKCl9LHBvc2l0aW9uSXRlbTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLm9wdGlvbnMsZT1iLnN5bWJvbFBhZGRpbmcsYj0hYi5ydGwsYz1hLl9sZWdlbmRJdGVtUG9zLGY9Y1swXSxjPWNbMV0saD1hLmNoZWNrYm94O2lmKChhPWEubGVnZW5kR3JvdXApJiZhLmVsZW1lbnQpYVttKGEudHJhbnNsYXRlWSk/XCJhbmltYXRlXCI6XCJhdHRyXCJdKHt0cmFuc2xhdGVYOmI/Zjp0aGlzLmxlZ2VuZFdpZHRoLWYtMiplLTQsdHJhbnNsYXRlWTpjfSk7aCYmKGgueD1mLGgueT1jKX0sZGVzdHJveUl0ZW06ZnVuY3Rpb24oYSl7dmFyIGI9YS5jaGVja2JveDtbXCJsZWdlbmRJdGVtXCIsXCJsZWdlbmRMaW5lXCIsXCJsZWdlbmRTeW1ib2xcIixcImxlZ2VuZEdyb3VwXCJdLmZvckVhY2goZnVuY3Rpb24oYil7YVtiXSYmXG4oYVtiXT1hW2JdLmRlc3Ryb3koKSl9KTtiJiZFKGEuY2hlY2tib3gpfSxkZXN0cm95OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhKXt0aGlzW2FdJiYodGhpc1thXT10aGlzW2FdLmRlc3Ryb3koKSl9dGhpcy5nZXRBbGxJdGVtcygpLmZvckVhY2goZnVuY3Rpb24oYil7W1wibGVnZW5kSXRlbVwiLFwibGVnZW5kR3JvdXBcIl0uZm9yRWFjaChhLGIpfSk7XCJjbGlwUmVjdCB1cCBkb3duIHBhZ2VyIG5hdiBib3ggdGl0bGUgZ3JvdXBcIi5zcGxpdChcIiBcIikuZm9yRWFjaChhLHRoaXMpO3RoaXMuZGlzcGxheT1udWxsfSxwb3NpdGlvbkNoZWNrYm94ZXM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdyb3VwJiZ0aGlzLmdyb3VwLmFsaWduQXR0cixiLGY9dGhpcy5jbGlwSGVpZ2h0fHx0aGlzLmxlZ2VuZEhlaWdodCxjPXRoaXMudGl0bGVIZWlnaHQ7YSYmKGI9YS50cmFuc2xhdGVZLHRoaXMuYWxsSXRlbXMuZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgaD1lLmNoZWNrYm94LGw7aCYmKGw9YitjK2gueSsodGhpcy5zY3JvbGxPZmZzZXR8fFxuMCkrMyxBKGgse2xlZnQ6YS50cmFuc2xhdGVYK2UuY2hlY2tib3hPZmZzZXQraC54LTIwK1wicHhcIix0b3A6bCtcInB4XCIsZGlzcGxheTp0aGlzLnByb3hpbWF0ZXx8bD5iLTYmJmw8YitmLTY/XCJcIjpcIm5vbmVcIn0pKX0sdGhpcykpfSxyZW5kZXJUaXRsZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMub3B0aW9ucyxiPXRoaXMucGFkZGluZyxmPWEudGl0bGUsYz0wO2YudGV4dCYmKHRoaXMudGl0bGV8fCh0aGlzLnRpdGxlPXRoaXMuY2hhcnQucmVuZGVyZXIubGFiZWwoZi50ZXh0LGItMyxiLTQsbnVsbCxudWxsLG51bGwsYS51c2VIVE1MLG51bGwsXCJsZWdlbmQtdGl0bGVcIikuYXR0cih7ekluZGV4OjF9KSx0aGlzLmNoYXJ0LnN0eWxlZE1vZGV8fHRoaXMudGl0bGUuY3NzKGYuc3R5bGUpLHRoaXMudGl0bGUuYWRkKHRoaXMuZ3JvdXApKSxmLndpZHRofHx0aGlzLnRpdGxlLmNzcyh7d2lkdGg6dGhpcy5tYXhMZWdlbmRXaWR0aCtcInB4XCJ9KSxhPXRoaXMudGl0bGUuZ2V0QkJveCgpLGM9YS5oZWlnaHQsXG50aGlzLm9mZnNldFdpZHRoPWEud2lkdGgsdGhpcy5jb250ZW50R3JvdXAuYXR0cih7dHJhbnNsYXRlWTpjfSkpO3RoaXMudGl0bGVIZWlnaHQ9Y30sc2V0VGV4dDpmdW5jdGlvbihlKXt2YXIgYj10aGlzLm9wdGlvbnM7ZS5sZWdlbmRJdGVtLmF0dHIoe3RleHQ6Yi5sYWJlbEZvcm1hdD9hLmZvcm1hdChiLmxhYmVsRm9ybWF0LGUsdGhpcy5jaGFydC50aW1lKTpiLmxhYmVsRm9ybWF0dGVyLmNhbGwoZSl9KX0scmVuZGVySXRlbTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmNoYXJ0LGU9Yi5yZW5kZXJlcixjPXRoaXMub3B0aW9ucyxmPXRoaXMuc3ltYm9sV2lkdGgsaD1jLnN5bWJvbFBhZGRpbmcscj10aGlzLml0ZW1TdHlsZSxnPXRoaXMuaXRlbUhpZGRlblN0eWxlLHA9XCJob3Jpem9udGFsXCI9PT1jLmxheW91dD96KGMuaXRlbURpc3RhbmNlLDIwKTowLGQ9IWMucnRsLGs9YS5sZWdlbmRJdGVtLHU9IWEuc2VyaWVzLEQ9IXUmJmEuc2VyaWVzLmRyYXdMZWdlbmRTeW1ib2w/YS5zZXJpZXM6XG5hLEc9RC5vcHRpb25zLEc9dGhpcy5jcmVhdGVDaGVja2JveEZvckl0ZW0mJkcmJkcuc2hvd0NoZWNrYm94LHA9ZitoK3ArKEc/MjA6MCkscT1jLnVzZUhUTUwsbj1hLm9wdGlvbnMuY2xhc3NOYW1lO2t8fChhLmxlZ2VuZEdyb3VwPWUuZyhcImxlZ2VuZC1pdGVtXCIpLmFkZENsYXNzKFwiaGlnaGNoYXJ0cy1cIitELnR5cGUrXCItc2VyaWVzIGhpZ2hjaGFydHMtY29sb3ItXCIrYS5jb2xvckluZGV4KyhuP1wiIFwiK246XCJcIikrKHU/XCIgaGlnaGNoYXJ0cy1zZXJpZXMtXCIrYS5pbmRleDpcIlwiKSkuYXR0cih7ekluZGV4OjF9KS5hZGQodGhpcy5zY3JvbGxHcm91cCksYS5sZWdlbmRJdGVtPWs9ZS50ZXh0KFwiXCIsZD9mK2g6LWgsdGhpcy5iYXNlbGluZXx8MCxxKSxiLnN0eWxlZE1vZGV8fGsuY3NzKHkoYS52aXNpYmxlP3I6ZykpLGsuYXR0cih7YWxpZ246ZD9cImxlZnRcIjpcInJpZ2h0XCIsekluZGV4OjJ9KS5hZGQoYS5sZWdlbmRHcm91cCksdGhpcy5iYXNlbGluZXx8KHRoaXMuZm9udE1ldHJpY3M9ZS5mb250TWV0cmljcyhiLnN0eWxlZE1vZGU/XG4xMjpyLmZvbnRTaXplLGspLHRoaXMuYmFzZWxpbmU9dGhpcy5mb250TWV0cmljcy5mKzMrdGhpcy5pdGVtTWFyZ2luVG9wLGsuYXR0cihcInlcIix0aGlzLmJhc2VsaW5lKSksdGhpcy5zeW1ib2xIZWlnaHQ9Yy5zeW1ib2xIZWlnaHR8fHRoaXMuZm9udE1ldHJpY3MuZixELmRyYXdMZWdlbmRTeW1ib2wodGhpcyxhKSx0aGlzLnNldEl0ZW1FdmVudHMmJnRoaXMuc2V0SXRlbUV2ZW50cyhhLGsscSkpO0cmJiFhLmNoZWNrYm94JiZ0aGlzLmNyZWF0ZUNoZWNrYm94Rm9ySXRlbShhKTt0aGlzLmNvbG9yaXplSXRlbShhLGEudmlzaWJsZSk7IWIuc3R5bGVkTW9kZSYmci53aWR0aHx8ay5jc3Moe3dpZHRoOihjLml0ZW1XaWR0aHx8dGhpcy53aWR0aE9wdGlvbnx8Yi5zcGFjaW5nQm94LndpZHRoKS1wfSk7dGhpcy5zZXRUZXh0KGEpO2I9ay5nZXRCQm94KCk7YS5pdGVtV2lkdGg9YS5jaGVja2JveE9mZnNldD1jLml0ZW1XaWR0aHx8YS5sZWdlbmRJdGVtV2lkdGh8fGIud2lkdGgrcDt0aGlzLm1heEl0ZW1XaWR0aD1cbk1hdGgubWF4KHRoaXMubWF4SXRlbVdpZHRoLGEuaXRlbVdpZHRoKTt0aGlzLnRvdGFsSXRlbVdpZHRoKz1hLml0ZW1XaWR0aDt0aGlzLml0ZW1IZWlnaHQ9YS5pdGVtSGVpZ2h0PU1hdGgucm91bmQoYS5sZWdlbmRJdGVtSGVpZ2h0fHxiLmhlaWdodHx8dGhpcy5zeW1ib2xIZWlnaHQpfSxsYXlvdXRJdGVtOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMub3B0aW9ucyxlPXRoaXMucGFkZGluZyxjPVwiaG9yaXpvbnRhbFwiPT09Yi5sYXlvdXQsZj1hLml0ZW1IZWlnaHQsaD1iLml0ZW1NYXJnaW5Cb3R0b218fDAscj10aGlzLml0ZW1NYXJnaW5Ub3AsZz1jP3ooYi5pdGVtRGlzdGFuY2UsMjApOjAscD10aGlzLm1heExlZ2VuZFdpZHRoLGI9Yi5hbGlnbkNvbHVtbnMmJnRoaXMudG90YWxJdGVtV2lkdGg+cD90aGlzLm1heEl0ZW1XaWR0aDphLml0ZW1XaWR0aDtjJiZ0aGlzLml0ZW1YLWUrYj5wJiYodGhpcy5pdGVtWD1lLHRoaXMubGFzdExpbmVIZWlnaHQmJih0aGlzLml0ZW1ZKz1yK3RoaXMubGFzdExpbmVIZWlnaHQrXG5oKSx0aGlzLmxhc3RMaW5lSGVpZ2h0PTApO3RoaXMubGFzdEl0ZW1ZPXIrdGhpcy5pdGVtWStoO3RoaXMubGFzdExpbmVIZWlnaHQ9TWF0aC5tYXgoZix0aGlzLmxhc3RMaW5lSGVpZ2h0KTthLl9sZWdlbmRJdGVtUG9zPVt0aGlzLml0ZW1YLHRoaXMuaXRlbVldO2M/dGhpcy5pdGVtWCs9YjoodGhpcy5pdGVtWSs9citmK2gsdGhpcy5sYXN0TGluZUhlaWdodD1mKTt0aGlzLm9mZnNldFdpZHRoPXRoaXMud2lkdGhPcHRpb258fE1hdGgubWF4KChjP3RoaXMuaXRlbVgtZS0oYS5jaGVja2JveD8wOmcpOmIpK2UsdGhpcy5vZmZzZXRXaWR0aCl9LGdldEFsbEl0ZW1zOmZ1bmN0aW9uKCl7dmFyIGE9W107dGhpcy5jaGFydC5zZXJpZXMuZm9yRWFjaChmdW5jdGlvbihiKXt2YXIgZT1iJiZiLm9wdGlvbnM7YiYmeihlLnNob3dJbkxlZ2VuZCxtKGUubGlua2VkVG8pPyExOnZvaWQgMCwhMCkmJihhPWEuY29uY2F0KGIubGVnZW5kSXRlbXN8fChcInBvaW50XCI9PT1lLmxlZ2VuZFR5cGU/Yi5kYXRhOlxuYikpKX0pO2codGhpcyxcImFmdGVyR2V0QWxsSXRlbXNcIix7YWxsSXRlbXM6YX0pO3JldHVybiBhfSxnZXRBbGlnbm1lbnQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLm9wdGlvbnM7cmV0dXJuIHRoaXMucHJveGltYXRlP2EuYWxpZ24uY2hhckF0KDApK1widHZcIjphLmZsb2F0aW5nP1wiXCI6YS5hbGlnbi5jaGFyQXQoMCkrYS52ZXJ0aWNhbEFsaWduLmNoYXJBdCgwKSthLmxheW91dC5jaGFyQXQoMCl9LGFkanVzdE1hcmdpbnM6ZnVuY3Rpb24oYSxiKXt2YXIgZT10aGlzLmNoYXJ0LGM9dGhpcy5vcHRpb25zLGY9dGhpcy5nZXRBbGlnbm1lbnQoKSxoPXZvaWQgMCE9PWUub3B0aW9ucy50aXRsZS5tYXJnaW4/ZS50aXRsZU9mZnNldCtlLm9wdGlvbnMudGl0bGUubWFyZ2luOjA7ZiYmWy8obHRofGN0fHJ0aCkvLC8ocnR2fHJtfHJidikvLC8ocmJofGNifGxiaCkvLC8obGJ2fGxtfGx0dikvXS5mb3JFYWNoKGZ1bmN0aW9uKGwsdCl7bC50ZXN0KGYpJiYhbShhW3RdKSYmKGVbeFt0XV09TWF0aC5tYXgoZVt4W3RdXSxcbmUubGVnZW5kWyh0KzEpJTI/XCJsZWdlbmRIZWlnaHRcIjpcImxlZ2VuZFdpZHRoXCJdK1sxLC0xLC0xLDFdW3RdKmNbdCUyP1wieFwiOlwieVwiXSt6KGMubWFyZ2luLDEyKStiW3RdKygwPT09dCYmKDA9PT1lLnRpdGxlT2Zmc2V0PzA6aCkpKSl9KX0scHJveGltYXRlUG9zaXRpb25zOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5jaGFydCxiPVtdLGY9XCJsZWZ0XCI9PT10aGlzLm9wdGlvbnMuYWxpZ247dGhpcy5hbGxJdGVtcy5mb3JFYWNoKGZ1bmN0aW9uKGMpe3ZhciBoLGw7bD1mO3ZhciByO2MueUF4aXMmJmMucG9pbnRzJiYoYy54QXhpcy5vcHRpb25zLnJldmVyc2VkJiYobD0hbCksaD1hLmZpbmQobD9jLnBvaW50czpjLnBvaW50cy5zbGljZSgwKS5yZXZlcnNlKCksZnVuY3Rpb24oYil7cmV0dXJuIGEuaXNOdW1iZXIoYi5wbG90WSl9KSxsPWMubGVnZW5kR3JvdXAuZ2V0QkJveCgpLmhlaWdodCxyPWMueUF4aXMudG9wLWUucGxvdFRvcCxjLnZpc2libGU/KGg9aD9oLnBsb3RZOmMueUF4aXMuaGVpZ2h0LFxuaCs9ci0uMypsKTpoPXIrYy55QXhpcy5oZWlnaHQsYi5wdXNoKHt0YXJnZXQ6aCxzaXplOmwsaXRlbTpjfSkpfSx0aGlzKTthLmRpc3RyaWJ1dGUoYixlLnBsb3RIZWlnaHQpO2IuZm9yRWFjaChmdW5jdGlvbihhKXthLml0ZW0uX2xlZ2VuZEl0ZW1Qb3NbMV09ZS5wbG90VG9wLWUuc3BhY2luZ1swXSthLnBvc30pfSxyZW5kZXI6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmNoYXJ0LGI9ZS5yZW5kZXJlcixoPXRoaXMuZ3JvdXAsYyx0LHIsdz10aGlzLmJveCxuPXRoaXMub3B0aW9ucyxwPXRoaXMucGFkZGluZzt0aGlzLml0ZW1YPXA7dGhpcy5pdGVtWT10aGlzLmluaXRpYWxJdGVtWTt0aGlzLmxhc3RJdGVtWT10aGlzLm9mZnNldFdpZHRoPTA7dGhpcy53aWR0aE9wdGlvbj1hLnJlbGF0aXZlTGVuZ3RoKG4ud2lkdGgsZS5zcGFjaW5nQm94LndpZHRoLXApO2M9ZS5zcGFjaW5nQm94LndpZHRoLTIqcC1uLng7LTE8W1wicm1cIixcImxtXCJdLmluZGV4T2YodGhpcy5nZXRBbGlnbm1lbnQoKS5zdWJzdHJpbmcoMCxcbjIpKSYmKGMvPTIpO3RoaXMubWF4TGVnZW5kV2lkdGg9dGhpcy53aWR0aE9wdGlvbnx8YztofHwodGhpcy5ncm91cD1oPWIuZyhcImxlZ2VuZFwiKS5hdHRyKHt6SW5kZXg6N30pLmFkZCgpLHRoaXMuY29udGVudEdyb3VwPWIuZygpLmF0dHIoe3pJbmRleDoxfSkuYWRkKGgpLHRoaXMuc2Nyb2xsR3JvdXA9Yi5nKCkuYWRkKHRoaXMuY29udGVudEdyb3VwKSk7dGhpcy5yZW5kZXJUaXRsZSgpO2M9dGhpcy5nZXRBbGxJdGVtcygpO2YoYyxmdW5jdGlvbihhLGIpe3JldHVybihhLm9wdGlvbnMmJmEub3B0aW9ucy5sZWdlbmRJbmRleHx8MCktKGIub3B0aW9ucyYmYi5vcHRpb25zLmxlZ2VuZEluZGV4fHwwKX0pO24ucmV2ZXJzZWQmJmMucmV2ZXJzZSgpO3RoaXMuYWxsSXRlbXM9Yzt0aGlzLmRpc3BsYXk9dD0hIWMubGVuZ3RoO3RoaXMuaXRlbUhlaWdodD10aGlzLnRvdGFsSXRlbVdpZHRoPXRoaXMubWF4SXRlbVdpZHRoPXRoaXMubGFzdExpbmVIZWlnaHQ9MDtjLmZvckVhY2godGhpcy5yZW5kZXJJdGVtLFxudGhpcyk7Yy5mb3JFYWNoKHRoaXMubGF5b3V0SXRlbSx0aGlzKTtjPSh0aGlzLndpZHRoT3B0aW9ufHx0aGlzLm9mZnNldFdpZHRoKStwO3I9dGhpcy5sYXN0SXRlbVkrdGhpcy5sYXN0TGluZUhlaWdodCt0aGlzLnRpdGxlSGVpZ2h0O3I9dGhpcy5oYW5kbGVPdmVyZmxvdyhyKTtyKz1wO3d8fCh0aGlzLmJveD13PWIucmVjdCgpLmFkZENsYXNzKFwiaGlnaGNoYXJ0cy1sZWdlbmQtYm94XCIpLmF0dHIoe3I6bi5ib3JkZXJSYWRpdXN9KS5hZGQoaCksdy5pc05ldz0hMCk7ZS5zdHlsZWRNb2RlfHx3LmF0dHIoe3N0cm9rZTpuLmJvcmRlckNvbG9yLFwic3Ryb2tlLXdpZHRoXCI6bi5ib3JkZXJXaWR0aHx8MCxmaWxsOm4uYmFja2dyb3VuZENvbG9yfHxcIm5vbmVcIn0pLnNoYWRvdyhuLnNoYWRvdyk7MDxjJiYwPHImJih3W3cuaXNOZXc/XCJhdHRyXCI6XCJhbmltYXRlXCJdKHcuY3Jpc3AuY2FsbCh7fSx7eDowLHk6MCx3aWR0aDpjLGhlaWdodDpyfSx3LnN0cm9rZVdpZHRoKCkpKSx3LmlzTmV3PSExKTtcbndbdD9cInNob3dcIjpcImhpZGVcIl0oKTtlLnN0eWxlZE1vZGUmJlwibm9uZVwiPT09aC5nZXRTdHlsZShcImRpc3BsYXlcIikmJihjPXI9MCk7dGhpcy5sZWdlbmRXaWR0aD1jO3RoaXMubGVnZW5kSGVpZ2h0PXI7dCYmKGI9ZS5zcGFjaW5nQm94LC8obHRofGN0fHJ0aCkvLnRlc3QodGhpcy5nZXRBbGlnbm1lbnQoKSkmJih3PWIueStlLnRpdGxlT2Zmc2V0LGI9eShiLHt5OjA8ZS50aXRsZU9mZnNldD93Kz1lLm9wdGlvbnMudGl0bGUubWFyZ2luOnd9KSksaC5hbGlnbih5KG4se3dpZHRoOmMsaGVpZ2h0OnIsdmVydGljYWxBbGlnbjp0aGlzLnByb3hpbWF0ZT9cInRvcFwiOm4udmVydGljYWxBbGlnbn0pLCEwLGIpKTt0aGlzLnByb3hpbWF0ZXx8dGhpcy5wb3NpdGlvbkl0ZW1zKCk7Zyh0aGlzLFwiYWZ0ZXJSZW5kZXJcIil9LGhhbmRsZU92ZXJmbG93OmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMsZT10aGlzLmNoYXJ0LGM9ZS5yZW5kZXJlcixoPXRoaXMub3B0aW9ucyxmPWgueSxyPXRoaXMucGFkZGluZyxcbmY9ZS5zcGFjaW5nQm94LmhlaWdodCsoXCJ0b3BcIj09PWgudmVydGljYWxBbGlnbj8tZjpmKS1yLGc9aC5tYXhIZWlnaHQscCxkPXRoaXMuY2xpcFJlY3Qsaz1oLm5hdmlnYXRpb24sdT16KGsuYW5pbWF0aW9uLCEwKSxEPWsuYXJyb3dTaXplfHwxMixHPXRoaXMubmF2LHE9dGhpcy5wYWdlcyxuLG09dGhpcy5hbGxJdGVtcyx2PWZ1bmN0aW9uKGEpe1wibnVtYmVyXCI9PT10eXBlb2YgYT9kLmF0dHIoe2hlaWdodDphfSk6ZCYmKGIuY2xpcFJlY3Q9ZC5kZXN0cm95KCksYi5jb250ZW50R3JvdXAuY2xpcCgpKTtiLmNvbnRlbnRHcm91cC5kaXYmJihiLmNvbnRlbnRHcm91cC5kaXYuc3R5bGUuY2xpcD1hP1wicmVjdChcIityK1wicHgsOTk5OXB4LFwiKyhyK2EpK1wicHgsMClcIjpcImF1dG9cIil9LEw9ZnVuY3Rpb24oYSl7YlthXT1jLmNpcmNsZSgwLDAsMS4zKkQpLnRyYW5zbGF0ZShELzIsRC8yKS5hZGQoRyk7ZS5zdHlsZWRNb2RlfHxiW2FdLmF0dHIoXCJmaWxsXCIsXCJyZ2JhKDAsMCwwLDAuMDAwMSlcIik7XG5yZXR1cm4gYlthXX07XCJob3Jpem9udGFsXCIhPT1oLmxheW91dHx8XCJtaWRkbGVcIj09PWgudmVydGljYWxBbGlnbnx8aC5mbG9hdGluZ3x8KGYvPTIpO2cmJihmPU1hdGgubWluKGYsZykpO3EubGVuZ3RoPTA7YT5mJiYhMSE9PWsuZW5hYmxlZD8odGhpcy5jbGlwSGVpZ2h0PXA9TWF0aC5tYXgoZi0yMC10aGlzLnRpdGxlSGVpZ2h0LXIsMCksdGhpcy5jdXJyZW50UGFnZT16KHRoaXMuY3VycmVudFBhZ2UsMSksdGhpcy5mdWxsSGVpZ2h0PWEsbS5mb3JFYWNoKGZ1bmN0aW9uKGEsZCl7dmFyIGI9YS5fbGVnZW5kSXRlbVBvc1sxXSxjPU1hdGgucm91bmQoYS5sZWdlbmRJdGVtLmdldEJCb3goKS5oZWlnaHQpLGs9cS5sZW5ndGg7aWYoIWt8fGItcVtrLTFdPnAmJihufHxiKSE9PXFbay0xXSlxLnB1c2gobnx8YiksaysrO2EucGFnZUl4PWstMTtuJiYobVtkLTFdLnBhZ2VJeD1rLTEpO2Q9PT1tLmxlbmd0aC0xJiZiK2MtcVtrLTFdPnAmJmIhPT1uJiYocS5wdXNoKGIpLGEucGFnZUl4PWspO1xuYiE9PW4mJihuPWIpfSksZHx8KGQ9Yi5jbGlwUmVjdD1jLmNsaXBSZWN0KDAsciw5OTk5LDApLGIuY29udGVudEdyb3VwLmNsaXAoZCkpLHYocCksR3x8KHRoaXMubmF2PUc9Yy5nKCkuYXR0cih7ekluZGV4OjF9KS5hZGQodGhpcy5ncm91cCksdGhpcy51cD1jLnN5bWJvbChcInRyaWFuZ2xlXCIsMCwwLEQsRCkuYWRkKEcpLEwoXCJ1cFRyYWNrZXJcIikub24oXCJjbGlja1wiLGZ1bmN0aW9uKCl7Yi5zY3JvbGwoLTEsdSl9KSx0aGlzLnBhZ2VyPWMudGV4dChcIlwiLDE1LDEwKS5hZGRDbGFzcyhcImhpZ2hjaGFydHMtbGVnZW5kLW5hdmlnYXRpb25cIiksZS5zdHlsZWRNb2RlfHx0aGlzLnBhZ2VyLmNzcyhrLnN0eWxlKSx0aGlzLnBhZ2VyLmFkZChHKSx0aGlzLmRvd249Yy5zeW1ib2woXCJ0cmlhbmdsZS1kb3duXCIsMCwwLEQsRCkuYWRkKEcpLEwoXCJkb3duVHJhY2tlclwiKS5vbihcImNsaWNrXCIsZnVuY3Rpb24oKXtiLnNjcm9sbCgxLHUpfSkpLGIuc2Nyb2xsKDApLGE9Zik6RyYmKHYoKSx0aGlzLm5hdj1cbkcuZGVzdHJveSgpLHRoaXMuc2Nyb2xsR3JvdXAuYXR0cih7dHJhbnNsYXRlWToxfSksdGhpcy5jbGlwSGVpZ2h0PTApO3JldHVybiBhfSxzY3JvbGw6ZnVuY3Rpb24oYSxiKXt2YXIgZT10aGlzLnBhZ2VzLGM9ZS5sZW5ndGgsaD10aGlzLmN1cnJlbnRQYWdlK2E7YT10aGlzLmNsaXBIZWlnaHQ7dmFyIGY9dGhpcy5vcHRpb25zLm5hdmlnYXRpb24scj10aGlzLnBhZ2VyLGc9dGhpcy5wYWRkaW5nO2g+YyYmKGg9Yyk7MDxoJiYodm9pZCAwIT09YiYmbihiLHRoaXMuY2hhcnQpLHRoaXMubmF2LmF0dHIoe3RyYW5zbGF0ZVg6Zyx0cmFuc2xhdGVZOmErdGhpcy5wYWRkaW5nKzcrdGhpcy50aXRsZUhlaWdodCx2aXNpYmlsaXR5OlwidmlzaWJsZVwifSksW3RoaXMudXAsdGhpcy51cFRyYWNrZXJdLmZvckVhY2goZnVuY3Rpb24oYSl7YS5hdHRyKHtcImNsYXNzXCI6MT09PWg/XCJoaWdoY2hhcnRzLWxlZ2VuZC1uYXYtaW5hY3RpdmVcIjpcImhpZ2hjaGFydHMtbGVnZW5kLW5hdi1hY3RpdmVcIn0pfSksXG5yLmF0dHIoe3RleHQ6aCtcIi9cIitjfSksW3RoaXMuZG93bix0aGlzLmRvd25UcmFja2VyXS5mb3JFYWNoKGZ1bmN0aW9uKGEpe2EuYXR0cih7eDoxOCt0aGlzLnBhZ2VyLmdldEJCb3goKS53aWR0aCxcImNsYXNzXCI6aD09PWM/XCJoaWdoY2hhcnRzLWxlZ2VuZC1uYXYtaW5hY3RpdmVcIjpcImhpZ2hjaGFydHMtbGVnZW5kLW5hdi1hY3RpdmVcIn0pfSx0aGlzKSx0aGlzLmNoYXJ0LnN0eWxlZE1vZGV8fCh0aGlzLnVwLmF0dHIoe2ZpbGw6MT09PWg/Zi5pbmFjdGl2ZUNvbG9yOmYuYWN0aXZlQ29sb3J9KSx0aGlzLnVwVHJhY2tlci5jc3Moe2N1cnNvcjoxPT09aD9cImRlZmF1bHRcIjpcInBvaW50ZXJcIn0pLHRoaXMuZG93bi5hdHRyKHtmaWxsOmg9PT1jP2YuaW5hY3RpdmVDb2xvcjpmLmFjdGl2ZUNvbG9yfSksdGhpcy5kb3duVHJhY2tlci5jc3Moe2N1cnNvcjpoPT09Yz9cImRlZmF1bHRcIjpcInBvaW50ZXJcIn0pKSx0aGlzLnNjcm9sbE9mZnNldD0tZVtoLTFdK3RoaXMuaW5pdGlhbEl0ZW1ZLHRoaXMuc2Nyb2xsR3JvdXAuYW5pbWF0ZSh7dHJhbnNsYXRlWTp0aGlzLnNjcm9sbE9mZnNldH0pLFxudGhpcy5jdXJyZW50UGFnZT1oLHRoaXMucG9zaXRpb25DaGVja2JveGVzKCkpfX07YS5MZWdlbmRTeW1ib2xNaXhpbj17ZHJhd1JlY3RhbmdsZTpmdW5jdGlvbihhLGIpe3ZhciBlPWEuc3ltYm9sSGVpZ2h0LGM9YS5vcHRpb25zLnNxdWFyZVN5bWJvbDtiLmxlZ2VuZFN5bWJvbD10aGlzLmNoYXJ0LnJlbmRlcmVyLnJlY3QoYz8oYS5zeW1ib2xXaWR0aC1lKS8yOjAsYS5iYXNlbGluZS1lKzEsYz9lOmEuc3ltYm9sV2lkdGgsZSx6KGEub3B0aW9ucy5zeW1ib2xSYWRpdXMsZS8yKSkuYWRkQ2xhc3MoXCJoaWdoY2hhcnRzLXBvaW50XCIpLmF0dHIoe3pJbmRleDozfSkuYWRkKGIubGVnZW5kR3JvdXApfSxkcmF3TGluZU1hcmtlcjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLm9wdGlvbnMsZT1iLm1hcmtlcixjPWEuc3ltYm9sV2lkdGgsaD1hLnN5bWJvbEhlaWdodCxmPWgvMixyPXRoaXMuY2hhcnQucmVuZGVyZXIsZz10aGlzLmxlZ2VuZEdyb3VwO2E9YS5iYXNlbGluZS1NYXRoLnJvdW5kKC4zKlxuYS5mb250TWV0cmljcy5iKTt2YXIgcD17fTt0aGlzLmNoYXJ0LnN0eWxlZE1vZGV8fChwPXtcInN0cm9rZS13aWR0aFwiOmIubGluZVdpZHRofHwwfSxiLmRhc2hTdHlsZSYmKHAuZGFzaHN0eWxlPWIuZGFzaFN0eWxlKSk7dGhpcy5sZWdlbmRMaW5lPXIucGF0aChbXCJNXCIsMCxhLFwiTFwiLGMsYV0pLmFkZENsYXNzKFwiaGlnaGNoYXJ0cy1ncmFwaFwiKS5hdHRyKHApLmFkZChnKTtlJiYhMSE9PWUuZW5hYmxlZCYmYyYmKGI9TWF0aC5taW4oeihlLnJhZGl1cyxmKSxmKSwwPT09dGhpcy5zeW1ib2wuaW5kZXhPZihcInVybFwiKSYmKGU9eShlLHt3aWR0aDpoLGhlaWdodDpofSksYj0wKSx0aGlzLmxlZ2VuZFN5bWJvbD1lPXIuc3ltYm9sKHRoaXMuc3ltYm9sLGMvMi1iLGEtYiwyKmIsMipiLGUpLmFkZENsYXNzKFwiaGlnaGNoYXJ0cy1wb2ludFwiKS5hZGQoZyksZS5pc01hcmtlcj0hMCl9fTsoL1RyaWRlbnRcXC83XFwuMC8udGVzdChoLm5hdmlnYXRvciYmaC5uYXZpZ2F0b3IudXNlckFnZW50KXx8dikmJlxucihhLkxlZ2VuZC5wcm90b3R5cGUsXCJwb3NpdGlvbkl0ZW1cIixmdW5jdGlvbihhLGIpe3ZhciBlPXRoaXMsYz1mdW5jdGlvbigpe2IuX2xlZ2VuZEl0ZW1Qb3MmJmEuY2FsbChlLGIpfTtjKCk7ZS5idWJibGVMZWdlbmR8fHNldFRpbWVvdXQoYyl9KX0pO0koSCxcInBhcnRzL0NoYXJ0LmpzXCIsW0hbXCJwYXJ0cy9HbG9iYWxzLmpzXCJdXSxmdW5jdGlvbihhKXt2YXIgQz1hLmFkZEV2ZW50LEE9YS5hbmltYXRlLEU9YS5hbmltT2JqZWN0LG09YS5hdHRyLGc9YS5kb2Msdj1hLkF4aXMseD1hLmNyZWF0ZUVsZW1lbnQseT1hLmRlZmF1bHRPcHRpb25zLHo9YS5kaXNjYXJkRWxlbWVudCxuPWEuY2hhcnRzLGY9YS5jc3MsaD1hLmRlZmluZWQscj1hLmV4dGVuZCxlPWEuZmluZCxiPWEuZmlyZUV2ZW50LGw9YS5pc051bWJlcixjPWEuaXNPYmplY3QsdD1hLmlzU3RyaW5nLEY9YS5MZWdlbmQsdz1hLm1hcmdpbk5hbWVzLEI9YS5tZXJnZSxwPWEub2JqZWN0RWFjaCxkPWEuUG9pbnRlcixrPWEucGljayxcbnU9YS5wSW50LEQ9YS5yZW1vdmVFdmVudCxHPWEuc2VyaWVzVHlwZXMscT1hLnNwbGF0LEs9YS5zeW5jVGltZW91dCxOPWEud2luLE89YS5DaGFydD1mdW5jdGlvbigpe3RoaXMuZ2V0QXJncy5hcHBseSh0aGlzLGFyZ3VtZW50cyl9O2EuY2hhcnQ9ZnVuY3Rpb24oYSxkLGIpe3JldHVybiBuZXcgTyhhLGQsYil9O3IoTy5wcm90b3R5cGUse2NhbGxiYWNrczpbXSxnZXRBcmdzOmZ1bmN0aW9uKCl7dmFyIGE9W10uc2xpY2UuY2FsbChhcmd1bWVudHMpO2lmKHQoYVswXSl8fGFbMF0ubm9kZU5hbWUpdGhpcy5yZW5kZXJUbz1hLnNoaWZ0KCk7dGhpcy5pbml0KGFbMF0sYVsxXSl9LGluaXQ6ZnVuY3Rpb24oZCxrKXt2YXIgZSx1PWQuc2VyaWVzLHE9ZC5wbG90T3B0aW9uc3x8e307Yih0aGlzLFwiaW5pdFwiLHthcmdzOmFyZ3VtZW50c30sZnVuY3Rpb24oKXtkLnNlcmllcz1udWxsO2U9Qih5LGQpO3AoZS5wbG90T3B0aW9ucyxmdW5jdGlvbihhLGQpe2MoYSkmJihhLnRvb2x0aXA9cVtkXSYmXG5CKHFbZF0udG9vbHRpcCl8fHZvaWQgMCl9KTtlLnRvb2x0aXAudXNlck9wdGlvbnM9ZC5jaGFydCYmZC5jaGFydC5mb3JFeHBvcnQmJmQudG9vbHRpcC51c2VyT3B0aW9uc3x8ZC50b29sdGlwO2Uuc2VyaWVzPWQuc2VyaWVzPXU7dGhpcy51c2VyT3B0aW9ucz1kO3ZhciBoPWUuY2hhcnQsZj1oLmV2ZW50czt0aGlzLm1hcmdpbj1bXTt0aGlzLnNwYWNpbmc9W107dGhpcy5ib3VuZHM9e2g6e30sdjp7fX07dGhpcy5sYWJlbENvbGxlY3RvcnM9W107dGhpcy5jYWxsYmFjaz1rO3RoaXMuaXNSZXNpemluZz0wO3RoaXMub3B0aW9ucz1lO3RoaXMuYXhlcz1bXTt0aGlzLnNlcmllcz1bXTt0aGlzLnRpbWU9ZC50aW1lJiZPYmplY3Qua2V5cyhkLnRpbWUpLmxlbmd0aD9uZXcgYS5UaW1lKGQudGltZSk6YS50aW1lO3RoaXMuc3R5bGVkTW9kZT1oLnN0eWxlZE1vZGU7dGhpcy5oYXNDYXJ0ZXNpYW5TZXJpZXM9aC5zaG93QXhlczt2YXIgbD10aGlzO2wuaW5kZXg9bi5sZW5ndGg7bi5wdXNoKGwpO1xuYS5jaGFydENvdW50Kys7ZiYmcChmLGZ1bmN0aW9uKGQsYil7YS5pc0Z1bmN0aW9uKGQpJiZDKGwsYixkKX0pO2wueEF4aXM9W107bC55QXhpcz1bXTtsLnBvaW50Q291bnQ9bC5jb2xvckNvdW50ZXI9bC5zeW1ib2xDb3VudGVyPTA7YihsLFwiYWZ0ZXJJbml0XCIpO2wuZmlyc3RSZW5kZXIoKX0pfSxpbml0U2VyaWVzOmZ1bmN0aW9uKGQpe3ZhciBiPXRoaXMub3B0aW9ucy5jaGFydDsoYj1HW2QudHlwZXx8Yi50eXBlfHxiLmRlZmF1bHRTZXJpZXNUeXBlXSl8fGEuZXJyb3IoMTcsITAsdGhpcyk7Yj1uZXcgYjtiLmluaXQodGhpcyxkKTtyZXR1cm4gYn0sb3JkZXJTZXJpZXM6ZnVuY3Rpb24oYSl7dmFyIGQ9dGhpcy5zZXJpZXM7Zm9yKGE9YXx8MDthPGQubGVuZ3RoO2ErKylkW2FdJiYoZFthXS5pbmRleD1hLGRbYV0ubmFtZT1kW2FdLmdldE5hbWUoKSl9LGlzSW5zaWRlUGxvdDpmdW5jdGlvbihhLGQsYil7dmFyIGM9Yj9kOmE7YT1iP2E6ZDtyZXR1cm4gMDw9YyYmYzw9dGhpcy5wbG90V2lkdGgmJlxuMDw9YSYmYTw9dGhpcy5wbG90SGVpZ2h0fSxyZWRyYXc6ZnVuY3Rpb24oZCl7Yih0aGlzLFwiYmVmb3JlUmVkcmF3XCIpO3ZhciBjPXRoaXMuYXhlcyxrPXRoaXMuc2VyaWVzLGU9dGhpcy5wb2ludGVyLHU9dGhpcy5sZWdlbmQscT10aGlzLnVzZXJPcHRpb25zLmxlZ2VuZCxoPXRoaXMuaXNEaXJ0eUxlZ2VuZCxmLHAsbD10aGlzLmhhc0NhcnRlc2lhblNlcmllcyx0PXRoaXMuaXNEaXJ0eUJveCxnLEQ9dGhpcy5yZW5kZXJlcixHPUQuaXNIaWRkZW4oKSx3PVtdO3RoaXMuc2V0UmVzcG9uc2l2ZSYmdGhpcy5zZXRSZXNwb25zaXZlKCExKTthLnNldEFuaW1hdGlvbihkLHRoaXMpO0cmJnRoaXMudGVtcG9yYXJ5RGlzcGxheSgpO3RoaXMubGF5T3V0VGl0bGVzKCk7Zm9yKGQ9ay5sZW5ndGg7ZC0tOylpZihnPWtbZF0sZy5vcHRpb25zLnN0YWNraW5nJiYoZj0hMCxnLmlzRGlydHkpKXtwPSEwO2JyZWFrfWlmKHApZm9yKGQ9ay5sZW5ndGg7ZC0tOylnPWtbZF0sZy5vcHRpb25zLnN0YWNraW5nJiZcbihnLmlzRGlydHk9ITApO2suZm9yRWFjaChmdW5jdGlvbihhKXthLmlzRGlydHkmJihcInBvaW50XCI9PT1hLm9wdGlvbnMubGVnZW5kVHlwZT8oYS51cGRhdGVUb3RhbHMmJmEudXBkYXRlVG90YWxzKCksaD0hMCk6cSYmKHEubGFiZWxGb3JtYXR0ZXJ8fHEubGFiZWxGb3JtYXQpJiYoaD0hMCkpO2EuaXNEaXJ0eURhdGEmJmIoYSxcInVwZGF0ZWREYXRhXCIpfSk7aCYmdSYmdS5vcHRpb25zLmVuYWJsZWQmJih1LnJlbmRlcigpLHRoaXMuaXNEaXJ0eUxlZ2VuZD0hMSk7ZiYmdGhpcy5nZXRTdGFja3MoKTtsJiZjLmZvckVhY2goZnVuY3Rpb24oYSl7YS51cGRhdGVOYW1lcygpO2Euc2V0U2NhbGUoKX0pO3RoaXMuZ2V0TWFyZ2lucygpO2wmJihjLmZvckVhY2goZnVuY3Rpb24oYSl7YS5pc0RpcnR5JiYodD0hMCl9KSxjLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGQ9YS5taW4rXCIsXCIrYS5tYXg7YS5leHRLZXkhPT1kJiYoYS5leHRLZXk9ZCx3LnB1c2goZnVuY3Rpb24oKXtiKGEsXCJhZnRlclNldEV4dHJlbWVzXCIsXG5yKGEuZXZlbnRBcmdzLGEuZ2V0RXh0cmVtZXMoKSkpO2RlbGV0ZSBhLmV2ZW50QXJnc30pKTsodHx8ZikmJmEucmVkcmF3KCl9KSk7dCYmdGhpcy5kcmF3Q2hhcnRCb3goKTtiKHRoaXMsXCJwcmVkcmF3XCIpO2suZm9yRWFjaChmdW5jdGlvbihhKXsodHx8YS5pc0RpcnR5KSYmYS52aXNpYmxlJiZhLnJlZHJhdygpO2EuaXNEaXJ0eURhdGE9ITF9KTtlJiZlLnJlc2V0KCEwKTtELmRyYXcoKTtiKHRoaXMsXCJyZWRyYXdcIik7Yih0aGlzLFwicmVuZGVyXCIpO0cmJnRoaXMudGVtcG9yYXJ5RGlzcGxheSghMCk7dy5mb3JFYWNoKGZ1bmN0aW9uKGEpe2EuY2FsbCgpfSl9LGdldDpmdW5jdGlvbihhKXtmdW5jdGlvbiBkKGQpe3JldHVybiBkLmlkPT09YXx8ZC5vcHRpb25zJiZkLm9wdGlvbnMuaWQ9PT1hfXZhciBiLGM9dGhpcy5zZXJpZXMsaztiPWUodGhpcy5heGVzLGQpfHxlKHRoaXMuc2VyaWVzLGQpO2ZvcihrPTA7IWImJms8Yy5sZW5ndGg7aysrKWI9ZShjW2tdLnBvaW50c3x8W10sZCk7cmV0dXJuIGJ9LFxuZ2V0QXhlczpmdW5jdGlvbigpe3ZhciBhPXRoaXMsZD10aGlzLm9wdGlvbnMsYz1kLnhBeGlzPXEoZC54QXhpc3x8e30pLGQ9ZC55QXhpcz1xKGQueUF4aXN8fHt9KTtiKHRoaXMsXCJnZXRBeGVzXCIpO2MuZm9yRWFjaChmdW5jdGlvbihhLGQpe2EuaW5kZXg9ZDthLmlzWD0hMH0pO2QuZm9yRWFjaChmdW5jdGlvbihhLGQpe2EuaW5kZXg9ZH0pO2MuY29uY2F0KGQpLmZvckVhY2goZnVuY3Rpb24oZCl7bmV3IHYoYSxkKX0pO2IodGhpcyxcImFmdGVyR2V0QXhlc1wiKX0sZ2V0U2VsZWN0ZWRQb2ludHM6ZnVuY3Rpb24oKXt2YXIgYT1bXTt0aGlzLnNlcmllcy5mb3JFYWNoKGZ1bmN0aW9uKGQpe2E9YS5jb25jYXQoKGRbZC5oYXNHcm91cGVkRGF0YT9cInBvaW50c1wiOlwiZGF0YVwiXXx8W10pLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS5zZWxlY3RlZH0pKX0pO3JldHVybiBhfSxnZXRTZWxlY3RlZFNlcmllczpmdW5jdGlvbigpe3JldHVybiB0aGlzLnNlcmllcy5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEuc2VsZWN0ZWR9KX0sXG5zZXRUaXRsZTpmdW5jdGlvbihhLGQsYil7dmFyIGM9dGhpcyxrPWMub3B0aW9ucyxlPWMuc3R5bGVkTW9kZSx1O3U9ay50aXRsZT1CKCFlJiZ7c3R5bGU6e2NvbG9yOlwiIzMzMzMzM1wiLGZvbnRTaXplOmsuaXNTdG9jaz9cIjE2cHhcIjpcIjE4cHhcIn19LGsudGl0bGUsYSk7az1rLnN1YnRpdGxlPUIoIWUmJntzdHlsZTp7Y29sb3I6XCIjNjY2NjY2XCJ9fSxrLnN1YnRpdGxlLGQpO1tbXCJ0aXRsZVwiLGEsdV0sW1wic3VidGl0bGVcIixkLGtdXS5mb3JFYWNoKGZ1bmN0aW9uKGEsZCl7dmFyIGI9YVswXSxrPWNbYl0sdT1hWzFdO2E9YVsyXTtrJiZ1JiYoY1tiXT1rPWsuZGVzdHJveSgpKTthJiYhayYmKGNbYl09Yy5yZW5kZXJlci50ZXh0KGEudGV4dCwwLDAsYS51c2VIVE1MKS5hdHRyKHthbGlnbjphLmFsaWduLFwiY2xhc3NcIjpcImhpZ2hjaGFydHMtXCIrYix6SW5kZXg6YS56SW5kZXh8fDR9KS5hZGQoKSxjW2JdLnVwZGF0ZT1mdW5jdGlvbihhKXtjLnNldFRpdGxlKCFkJiZhLGQmJmEpfSxlfHxjW2JdLmNzcyhhLnN0eWxlKSl9KTtcbmMubGF5T3V0VGl0bGVzKGIpfSxsYXlPdXRUaXRsZXM6ZnVuY3Rpb24oYSl7dmFyIGQ9MCxiLGM9dGhpcy5yZW5kZXJlcixlPXRoaXMuc3BhY2luZ0JveDtbXCJ0aXRsZVwiLFwic3VidGl0bGVcIl0uZm9yRWFjaChmdW5jdGlvbihhKXt2YXIgYj10aGlzW2FdLGs9dGhpcy5vcHRpb25zW2FdO2E9XCJ0aXRsZVwiPT09YT8tMzprLnZlcnRpY2FsQWxpZ24/MDpkKzI7dmFyIHU7YiYmKHRoaXMuc3R5bGVkTW9kZXx8KHU9ay5zdHlsZS5mb250U2l6ZSksdT1jLmZvbnRNZXRyaWNzKHUsYikuYixiLmNzcyh7d2lkdGg6KGsud2lkdGh8fGUud2lkdGgray53aWR0aEFkanVzdCkrXCJweFwifSkuYWxpZ24ocih7eTphK3V9LGspLCExLFwic3BhY2luZ0JveFwiKSxrLmZsb2F0aW5nfHxrLnZlcnRpY2FsQWxpZ258fChkPU1hdGguY2VpbChkK2IuZ2V0QkJveChrLnVzZUhUTUwpLmhlaWdodCkpKX0sdGhpcyk7Yj10aGlzLnRpdGxlT2Zmc2V0IT09ZDt0aGlzLnRpdGxlT2Zmc2V0PWQ7IXRoaXMuaXNEaXJ0eUJveCYmXG5iJiYodGhpcy5pc0RpcnR5Qm94PXRoaXMuaXNEaXJ0eUxlZ2VuZD1iLHRoaXMuaGFzUmVuZGVyZWQmJmsoYSwhMCkmJnRoaXMuaXNEaXJ0eUJveCYmdGhpcy5yZWRyYXcoKSl9LGdldENoYXJ0U2l6ZTpmdW5jdGlvbigpe3ZhciBkPXRoaXMub3B0aW9ucy5jaGFydCxiPWQud2lkdGgsZD1kLmhlaWdodCxjPXRoaXMucmVuZGVyVG87aChiKXx8KHRoaXMuY29udGFpbmVyV2lkdGg9YS5nZXRTdHlsZShjLFwid2lkdGhcIikpO2goZCl8fCh0aGlzLmNvbnRhaW5lckhlaWdodD1hLmdldFN0eWxlKGMsXCJoZWlnaHRcIikpO3RoaXMuY2hhcnRXaWR0aD1NYXRoLm1heCgwLGJ8fHRoaXMuY29udGFpbmVyV2lkdGh8fDYwMCk7dGhpcy5jaGFydEhlaWdodD1NYXRoLm1heCgwLGEucmVsYXRpdmVMZW5ndGgoZCx0aGlzLmNoYXJ0V2lkdGgpfHwoMTx0aGlzLmNvbnRhaW5lckhlaWdodD90aGlzLmNvbnRhaW5lckhlaWdodDo0MDApKX0sdGVtcG9yYXJ5RGlzcGxheTpmdW5jdGlvbihkKXt2YXIgYj10aGlzLnJlbmRlclRvO1xuaWYoZClmb3IoO2ImJmIuc3R5bGU7KWIuaGNPcmlnU3R5bGUmJihhLmNzcyhiLGIuaGNPcmlnU3R5bGUpLGRlbGV0ZSBiLmhjT3JpZ1N0eWxlKSxiLmhjT3JpZ0RldGFjaGVkJiYoZy5ib2R5LnJlbW92ZUNoaWxkKGIpLGIuaGNPcmlnRGV0YWNoZWQ9ITEpLGI9Yi5wYXJlbnROb2RlO2Vsc2UgZm9yKDtiJiZiLnN0eWxlOyl7Zy5ib2R5LmNvbnRhaW5zKGIpfHxiLnBhcmVudE5vZGV8fChiLmhjT3JpZ0RldGFjaGVkPSEwLGcuYm9keS5hcHBlbmRDaGlsZChiKSk7aWYoXCJub25lXCI9PT1hLmdldFN0eWxlKGIsXCJkaXNwbGF5XCIsITEpfHxiLmhjT3JpY0RldGFjaGVkKWIuaGNPcmlnU3R5bGU9e2Rpc3BsYXk6Yi5zdHlsZS5kaXNwbGF5LGhlaWdodDpiLnN0eWxlLmhlaWdodCxvdmVyZmxvdzpiLnN0eWxlLm92ZXJmbG93fSxkPXtkaXNwbGF5OlwiYmxvY2tcIixvdmVyZmxvdzpcImhpZGRlblwifSxiIT09dGhpcy5yZW5kZXJUbyYmKGQuaGVpZ2h0PTApLGEuY3NzKGIsZCksYi5vZmZzZXRXaWR0aHx8XG5iLnN0eWxlLnNldFByb3BlcnR5KFwiZGlzcGxheVwiLFwiYmxvY2tcIixcImltcG9ydGFudFwiKTtiPWIucGFyZW50Tm9kZTtpZihiPT09Zy5ib2R5KWJyZWFrfX0sc2V0Q2xhc3NOYW1lOmZ1bmN0aW9uKGEpe3RoaXMuY29udGFpbmVyLmNsYXNzTmFtZT1cImhpZ2hjaGFydHMtY29udGFpbmVyIFwiKyhhfHxcIlwiKX0sZ2V0Q29udGFpbmVyOmZ1bmN0aW9uKCl7dmFyIGQsYz10aGlzLm9wdGlvbnMsaz1jLmNoYXJ0LGUscTtkPXRoaXMucmVuZGVyVG87dmFyIGg9YS51bmlxdWVLZXkoKSxwLEQ7ZHx8KHRoaXMucmVuZGVyVG89ZD1rLnJlbmRlclRvKTt0KGQpJiYodGhpcy5yZW5kZXJUbz1kPWcuZ2V0RWxlbWVudEJ5SWQoZCkpO2R8fGEuZXJyb3IoMTMsITAsdGhpcyk7ZT11KG0oZCxcImRhdGEtaGlnaGNoYXJ0cy1jaGFydFwiKSk7bChlKSYmbltlXSYmbltlXS5oYXNSZW5kZXJlZCYmbltlXS5kZXN0cm95KCk7bShkLFwiZGF0YS1oaWdoY2hhcnRzLWNoYXJ0XCIsdGhpcy5pbmRleCk7ZC5pbm5lckhUTUw9XCJcIjtcbmsuc2tpcENsb25lfHxkLm9mZnNldFdpZHRofHx0aGlzLnRlbXBvcmFyeURpc3BsYXkoKTt0aGlzLmdldENoYXJ0U2l6ZSgpO2U9dGhpcy5jaGFydFdpZHRoO3E9dGhpcy5jaGFydEhlaWdodDtmKGQse292ZXJmbG93OlwiaGlkZGVuXCJ9KTt0aGlzLnN0eWxlZE1vZGV8fChwPXIoe3Bvc2l0aW9uOlwicmVsYXRpdmVcIixvdmVyZmxvdzpcImhpZGRlblwiLHdpZHRoOmUrXCJweFwiLGhlaWdodDpxK1wicHhcIix0ZXh0QWxpZ246XCJsZWZ0XCIsbGluZUhlaWdodDpcIm5vcm1hbFwiLHpJbmRleDowLFwiLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yXCI6XCJyZ2JhKDAsMCwwLDApXCJ9LGsuc3R5bGUpKTt0aGlzLmNvbnRhaW5lcj1kPXgoXCJkaXZcIix7aWQ6aH0scCxkKTt0aGlzLl9jdXJzb3I9ZC5zdHlsZS5jdXJzb3I7dGhpcy5yZW5kZXJlcj1uZXcgKGFbay5yZW5kZXJlcl18fGEuUmVuZGVyZXIpKGQsZSxxLG51bGwsay5mb3JFeHBvcnQsYy5leHBvcnRpbmcmJmMuZXhwb3J0aW5nLmFsbG93SFRNTCx0aGlzLnN0eWxlZE1vZGUpO1xudGhpcy5zZXRDbGFzc05hbWUoay5jbGFzc05hbWUpO2lmKHRoaXMuc3R5bGVkTW9kZSlmb3IoRCBpbiBjLmRlZnMpdGhpcy5yZW5kZXJlci5kZWZpbml0aW9uKGMuZGVmc1tEXSk7ZWxzZSB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKGsuc3R5bGUpO3RoaXMucmVuZGVyZXIuY2hhcnRJbmRleD10aGlzLmluZGV4O2IodGhpcyxcImFmdGVyR2V0Q29udGFpbmVyXCIpfSxnZXRNYXJnaW5zOmZ1bmN0aW9uKGEpe3ZhciBkPXRoaXMuc3BhY2luZyxjPXRoaXMubWFyZ2luLGs9dGhpcy50aXRsZU9mZnNldDt0aGlzLnJlc2V0TWFyZ2lucygpO2smJiFoKGNbMF0pJiYodGhpcy5wbG90VG9wPU1hdGgubWF4KHRoaXMucGxvdFRvcCxrK3RoaXMub3B0aW9ucy50aXRsZS5tYXJnaW4rZFswXSkpO3RoaXMubGVnZW5kJiZ0aGlzLmxlZ2VuZC5kaXNwbGF5JiZ0aGlzLmxlZ2VuZC5hZGp1c3RNYXJnaW5zKGMsZCk7Yih0aGlzLFwiZ2V0TWFyZ2luc1wiKTthfHx0aGlzLmdldEF4aXNNYXJnaW5zKCl9LGdldEF4aXNNYXJnaW5zOmZ1bmN0aW9uKCl7dmFyIGE9XG50aGlzLGQ9YS5heGlzT2Zmc2V0PVswLDAsMCwwXSxiPWEubWFyZ2luO2EuaGFzQ2FydGVzaWFuU2VyaWVzJiZhLmF4ZXMuZm9yRWFjaChmdW5jdGlvbihhKXthLnZpc2libGUmJmEuZ2V0T2Zmc2V0KCl9KTt3LmZvckVhY2goZnVuY3Rpb24oYyxrKXtoKGJba10pfHwoYVtjXSs9ZFtrXSl9KTthLnNldENoYXJ0U2l6ZSgpfSxyZWZsb3c6ZnVuY3Rpb24oZCl7dmFyIGI9dGhpcyxjPWIub3B0aW9ucy5jaGFydCxrPWIucmVuZGVyVG8sZT1oKGMud2lkdGgpJiZoKGMuaGVpZ2h0KSx1PWMud2lkdGh8fGEuZ2V0U3R5bGUoayxcIndpZHRoXCIpLGM9Yy5oZWlnaHR8fGEuZ2V0U3R5bGUoayxcImhlaWdodFwiKSxrPWQ/ZC50YXJnZXQ6TjtpZighZSYmIWIuaXNQcmludGluZyYmdSYmYyYmKGs9PT1OfHxrPT09Zykpe2lmKHUhPT1iLmNvbnRhaW5lcldpZHRofHxjIT09Yi5jb250YWluZXJIZWlnaHQpYS5jbGVhclRpbWVvdXQoYi5yZWZsb3dUaW1lb3V0KSxiLnJlZmxvd1RpbWVvdXQ9SyhmdW5jdGlvbigpe2IuY29udGFpbmVyJiZcbmIuc2V0U2l6ZSh2b2lkIDAsdm9pZCAwLCExKX0sZD8xMDA6MCk7Yi5jb250YWluZXJXaWR0aD11O2IuY29udGFpbmVySGVpZ2h0PWN9fSxzZXRSZWZsb3c6ZnVuY3Rpb24oYSl7dmFyIGQ9dGhpczshMT09PWF8fHRoaXMudW5iaW5kUmVmbG93PyExPT09YSYmdGhpcy51bmJpbmRSZWZsb3cmJih0aGlzLnVuYmluZFJlZmxvdz10aGlzLnVuYmluZFJlZmxvdygpKToodGhpcy51bmJpbmRSZWZsb3c9QyhOLFwicmVzaXplXCIsZnVuY3Rpb24oYSl7ZC5yZWZsb3coYSl9KSxDKHRoaXMsXCJkZXN0cm95XCIsdGhpcy51bmJpbmRSZWZsb3cpKX0sc2V0U2l6ZTpmdW5jdGlvbihkLGMsayl7dmFyIGU9dGhpcyx1PWUucmVuZGVyZXIscTtlLmlzUmVzaXppbmcrPTE7YS5zZXRBbmltYXRpb24oayxlKTtlLm9sZENoYXJ0SGVpZ2h0PWUuY2hhcnRIZWlnaHQ7ZS5vbGRDaGFydFdpZHRoPWUuY2hhcnRXaWR0aDt2b2lkIDAhPT1kJiYoZS5vcHRpb25zLmNoYXJ0LndpZHRoPWQpO3ZvaWQgMCE9PWMmJihlLm9wdGlvbnMuY2hhcnQuaGVpZ2h0PVxuYyk7ZS5nZXRDaGFydFNpemUoKTtlLnN0eWxlZE1vZGV8fChxPXUuZ2xvYmFsQW5pbWF0aW9uLChxP0E6ZikoZS5jb250YWluZXIse3dpZHRoOmUuY2hhcnRXaWR0aCtcInB4XCIsaGVpZ2h0OmUuY2hhcnRIZWlnaHQrXCJweFwifSxxKSk7ZS5zZXRDaGFydFNpemUoITApO3Uuc2V0U2l6ZShlLmNoYXJ0V2lkdGgsZS5jaGFydEhlaWdodCxrKTtlLmF4ZXMuZm9yRWFjaChmdW5jdGlvbihhKXthLmlzRGlydHk9ITA7YS5zZXRTY2FsZSgpfSk7ZS5pc0RpcnR5TGVnZW5kPSEwO2UuaXNEaXJ0eUJveD0hMDtlLmxheU91dFRpdGxlcygpO2UuZ2V0TWFyZ2lucygpO2UucmVkcmF3KGspO2Uub2xkQ2hhcnRIZWlnaHQ9bnVsbDtiKGUsXCJyZXNpemVcIik7SyhmdW5jdGlvbigpe2UmJmIoZSxcImVuZFJlc2l6ZVwiLG51bGwsZnVuY3Rpb24oKXstLWUuaXNSZXNpemluZ30pfSxFKHEpLmR1cmF0aW9uKX0sc2V0Q2hhcnRTaXplOmZ1bmN0aW9uKGEpe3ZhciBkPXRoaXMuaW52ZXJ0ZWQsYz10aGlzLnJlbmRlcmVyLFxuaz10aGlzLmNoYXJ0V2lkdGgsZT10aGlzLmNoYXJ0SGVpZ2h0LHU9dGhpcy5vcHRpb25zLmNoYXJ0LHE9dGhpcy5zcGFjaW5nLGg9dGhpcy5jbGlwT2Zmc2V0LGYscCxsLHQ7dGhpcy5wbG90TGVmdD1mPU1hdGgucm91bmQodGhpcy5wbG90TGVmdCk7dGhpcy5wbG90VG9wPXA9TWF0aC5yb3VuZCh0aGlzLnBsb3RUb3ApO3RoaXMucGxvdFdpZHRoPWw9TWF0aC5tYXgoMCxNYXRoLnJvdW5kKGstZi10aGlzLm1hcmdpblJpZ2h0KSk7dGhpcy5wbG90SGVpZ2h0PXQ9TWF0aC5tYXgoMCxNYXRoLnJvdW5kKGUtcC10aGlzLm1hcmdpbkJvdHRvbSkpO3RoaXMucGxvdFNpemVYPWQ/dDpsO3RoaXMucGxvdFNpemVZPWQ/bDp0O3RoaXMucGxvdEJvcmRlcldpZHRoPXUucGxvdEJvcmRlcldpZHRofHwwO3RoaXMuc3BhY2luZ0JveD1jLnNwYWNpbmdCb3g9e3g6cVszXSx5OnFbMF0sd2lkdGg6ay1xWzNdLXFbMV0saGVpZ2h0OmUtcVswXS1xWzJdfTt0aGlzLnBsb3RCb3g9Yy5wbG90Qm94PXt4OmYsXG55OnAsd2lkdGg6bCxoZWlnaHQ6dH07az0yKk1hdGguZmxvb3IodGhpcy5wbG90Qm9yZGVyV2lkdGgvMik7ZD1NYXRoLmNlaWwoTWF0aC5tYXgoayxoWzNdKS8yKTtjPU1hdGguY2VpbChNYXRoLm1heChrLGhbMF0pLzIpO3RoaXMuY2xpcEJveD17eDpkLHk6Yyx3aWR0aDpNYXRoLmZsb29yKHRoaXMucGxvdFNpemVYLU1hdGgubWF4KGssaFsxXSkvMi1kKSxoZWlnaHQ6TWF0aC5tYXgoMCxNYXRoLmZsb29yKHRoaXMucGxvdFNpemVZLU1hdGgubWF4KGssaFsyXSkvMi1jKSl9O2F8fHRoaXMuYXhlcy5mb3JFYWNoKGZ1bmN0aW9uKGEpe2Euc2V0QXhpc1NpemUoKTthLnNldEF4aXNUcmFuc2xhdGlvbigpfSk7Yih0aGlzLFwiYWZ0ZXJTZXRDaGFydFNpemVcIix7c2tpcEF4ZXM6YX0pfSxyZXNldE1hcmdpbnM6ZnVuY3Rpb24oKXtiKHRoaXMsXCJyZXNldE1hcmdpbnNcIik7dmFyIGE9dGhpcyxkPWEub3B0aW9ucy5jaGFydDtbXCJtYXJnaW5cIixcInNwYWNpbmdcIl0uZm9yRWFjaChmdW5jdGlvbihiKXt2YXIgZT1cbmRbYl0sdT1jKGUpP2U6W2UsZSxlLGVdO1tcIlRvcFwiLFwiUmlnaHRcIixcIkJvdHRvbVwiLFwiTGVmdFwiXS5mb3JFYWNoKGZ1bmN0aW9uKGMsZSl7YVtiXVtlXT1rKGRbYitjXSx1W2VdKX0pfSk7dy5mb3JFYWNoKGZ1bmN0aW9uKGQsYil7YVtkXT1rKGEubWFyZ2luW2JdLGEuc3BhY2luZ1tiXSl9KTthLmF4aXNPZmZzZXQ9WzAsMCwwLDBdO2EuY2xpcE9mZnNldD1bMCwwLDAsMF19LGRyYXdDaGFydEJveDpmdW5jdGlvbigpe3ZhciBhPXRoaXMub3B0aW9ucy5jaGFydCxkPXRoaXMucmVuZGVyZXIsYz10aGlzLmNoYXJ0V2lkdGgsaz10aGlzLmNoYXJ0SGVpZ2h0LGU9dGhpcy5jaGFydEJhY2tncm91bmQsdT10aGlzLnBsb3RCYWNrZ3JvdW5kLHE9dGhpcy5wbG90Qm9yZGVyLGgsZj10aGlzLnN0eWxlZE1vZGUscD10aGlzLnBsb3RCR0ltYWdlLGw9YS5iYWNrZ3JvdW5kQ29sb3IsdD1hLnBsb3RCYWNrZ3JvdW5kQ29sb3Iscj1hLnBsb3RCYWNrZ3JvdW5kSW1hZ2UsZyxEPXRoaXMucGxvdExlZnQsXG5HPXRoaXMucGxvdFRvcCx3PXRoaXMucGxvdFdpZHRoLG49dGhpcy5wbG90SGVpZ2h0LG09dGhpcy5wbG90Qm94LEs9dGhpcy5jbGlwUmVjdCxCPXRoaXMuY2xpcEJveCxGPVwiYW5pbWF0ZVwiO2V8fCh0aGlzLmNoYXJ0QmFja2dyb3VuZD1lPWQucmVjdCgpLmFkZENsYXNzKFwiaGlnaGNoYXJ0cy1iYWNrZ3JvdW5kXCIpLmFkZCgpLEY9XCJhdHRyXCIpO2lmKGYpaD1nPWUuc3Ryb2tlV2lkdGgoKTtlbHNle2g9YS5ib3JkZXJXaWR0aHx8MDtnPWgrKGEuc2hhZG93Pzg6MCk7bD17ZmlsbDpsfHxcIm5vbmVcIn07aWYoaHx8ZVtcInN0cm9rZS13aWR0aFwiXSlsLnN0cm9rZT1hLmJvcmRlckNvbG9yLGxbXCJzdHJva2Utd2lkdGhcIl09aDtlLmF0dHIobCkuc2hhZG93KGEuc2hhZG93KX1lW0ZdKHt4OmcvMix5OmcvMix3aWR0aDpjLWctaCUyLGhlaWdodDprLWctaCUyLHI6YS5ib3JkZXJSYWRpdXN9KTtGPVwiYW5pbWF0ZVwiO3V8fChGPVwiYXR0clwiLHRoaXMucGxvdEJhY2tncm91bmQ9dT1kLnJlY3QoKS5hZGRDbGFzcyhcImhpZ2hjaGFydHMtcGxvdC1iYWNrZ3JvdW5kXCIpLmFkZCgpKTtcbnVbRl0obSk7Znx8KHUuYXR0cih7ZmlsbDp0fHxcIm5vbmVcIn0pLnNoYWRvdyhhLnBsb3RTaGFkb3cpLHImJihwP3AuYW5pbWF0ZShtKTp0aGlzLnBsb3RCR0ltYWdlPWQuaW1hZ2UocixELEcsdyxuKS5hZGQoKSkpO0s/Sy5hbmltYXRlKHt3aWR0aDpCLndpZHRoLGhlaWdodDpCLmhlaWdodH0pOnRoaXMuY2xpcFJlY3Q9ZC5jbGlwUmVjdChCKTtGPVwiYW5pbWF0ZVwiO3F8fChGPVwiYXR0clwiLHRoaXMucGxvdEJvcmRlcj1xPWQucmVjdCgpLmFkZENsYXNzKFwiaGlnaGNoYXJ0cy1wbG90LWJvcmRlclwiKS5hdHRyKHt6SW5kZXg6MX0pLmFkZCgpKTtmfHxxLmF0dHIoe3N0cm9rZTphLnBsb3RCb3JkZXJDb2xvcixcInN0cm9rZS13aWR0aFwiOmEucGxvdEJvcmRlcldpZHRofHwwLGZpbGw6XCJub25lXCJ9KTtxW0ZdKHEuY3Jpc3Aoe3g6RCx5Okcsd2lkdGg6dyxoZWlnaHQ6bn0sLXEuc3Ryb2tlV2lkdGgoKSkpO3RoaXMuaXNEaXJ0eUJveD0hMTtiKHRoaXMsXCJhZnRlckRyYXdDaGFydEJveFwiKX0scHJvcEZyb21TZXJpZXM6ZnVuY3Rpb24oKXt2YXIgYT1cbnRoaXMsZD1hLm9wdGlvbnMuY2hhcnQsYixjPWEub3B0aW9ucy5zZXJpZXMsayxlO1tcImludmVydGVkXCIsXCJhbmd1bGFyXCIsXCJwb2xhclwiXS5mb3JFYWNoKGZ1bmN0aW9uKHUpe2I9R1tkLnR5cGV8fGQuZGVmYXVsdFNlcmllc1R5cGVdO2U9ZFt1XXx8YiYmYi5wcm90b3R5cGVbdV07Zm9yKGs9YyYmYy5sZW5ndGg7IWUmJmstLTspKGI9R1tjW2tdLnR5cGVdKSYmYi5wcm90b3R5cGVbdV0mJihlPSEwKTthW3VdPWV9KX0sbGlua1NlcmllczpmdW5jdGlvbigpe3ZhciBhPXRoaXMsZD1hLnNlcmllcztkLmZvckVhY2goZnVuY3Rpb24oYSl7YS5saW5rZWRTZXJpZXMubGVuZ3RoPTB9KTtkLmZvckVhY2goZnVuY3Rpb24oZCl7dmFyIGI9ZC5vcHRpb25zLmxpbmtlZFRvO3QoYikmJihiPVwiOnByZXZpb3VzXCI9PT1iP2Euc2VyaWVzW2QuaW5kZXgtMV06YS5nZXQoYikpJiZiLmxpbmtlZFBhcmVudCE9PWQmJihiLmxpbmtlZFNlcmllcy5wdXNoKGQpLGQubGlua2VkUGFyZW50PWIsZC52aXNpYmxlPVxuayhkLm9wdGlvbnMudmlzaWJsZSxiLm9wdGlvbnMudmlzaWJsZSxkLnZpc2libGUpKX0pO2IodGhpcyxcImFmdGVyTGlua1Nlcmllc1wiKX0scmVuZGVyU2VyaWVzOmZ1bmN0aW9uKCl7dGhpcy5zZXJpZXMuZm9yRWFjaChmdW5jdGlvbihhKXthLnRyYW5zbGF0ZSgpO2EucmVuZGVyKCl9KX0scmVuZGVyTGFiZWxzOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcyxkPWEub3B0aW9ucy5sYWJlbHM7ZC5pdGVtcyYmZC5pdGVtcy5mb3JFYWNoKGZ1bmN0aW9uKGIpe3ZhciBjPXIoZC5zdHlsZSxiLnN0eWxlKSxrPXUoYy5sZWZ0KSthLnBsb3RMZWZ0LGU9dShjLnRvcCkrYS5wbG90VG9wKzEyO2RlbGV0ZSBjLmxlZnQ7ZGVsZXRlIGMudG9wO2EucmVuZGVyZXIudGV4dChiLmh0bWwsayxlKS5hdHRyKHt6SW5kZXg6Mn0pLmNzcyhjKS5hZGQoKX0pfSxyZW5kZXI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmF4ZXMsZD10aGlzLnJlbmRlcmVyLGI9dGhpcy5vcHRpb25zLGM9MCxrLGUsdTt0aGlzLnNldFRpdGxlKCk7XG50aGlzLmxlZ2VuZD1uZXcgRih0aGlzLGIubGVnZW5kKTt0aGlzLmdldFN0YWNrcyYmdGhpcy5nZXRTdGFja3MoKTt0aGlzLmdldE1hcmdpbnMoITApO3RoaXMuc2V0Q2hhcnRTaXplKCk7Yj10aGlzLnBsb3RXaWR0aDthLnNvbWUoZnVuY3Rpb24oYSl7aWYoYS5ob3JpeiYmYS52aXNpYmxlJiZhLm9wdGlvbnMubGFiZWxzLmVuYWJsZWQmJmEuc2VyaWVzLmxlbmd0aClyZXR1cm4gYz0yMSwhMH0pO2s9dGhpcy5wbG90SGVpZ2h0PU1hdGgubWF4KHRoaXMucGxvdEhlaWdodC1jLDApO2EuZm9yRWFjaChmdW5jdGlvbihhKXthLnNldFNjYWxlKCl9KTt0aGlzLmdldEF4aXNNYXJnaW5zKCk7ZT0xLjE8Yi90aGlzLnBsb3RXaWR0aDt1PTEuMDU8ay90aGlzLnBsb3RIZWlnaHQ7aWYoZXx8dSlhLmZvckVhY2goZnVuY3Rpb24oYSl7KGEuaG9yaXomJmV8fCFhLmhvcml6JiZ1KSYmYS5zZXRUaWNrSW50ZXJ2YWwoITApfSksdGhpcy5nZXRNYXJnaW5zKCk7dGhpcy5kcmF3Q2hhcnRCb3goKTt0aGlzLmhhc0NhcnRlc2lhblNlcmllcyYmXG5hLmZvckVhY2goZnVuY3Rpb24oYSl7YS52aXNpYmxlJiZhLnJlbmRlcigpfSk7dGhpcy5zZXJpZXNHcm91cHx8KHRoaXMuc2VyaWVzR3JvdXA9ZC5nKFwic2VyaWVzLWdyb3VwXCIpLmF0dHIoe3pJbmRleDozfSkuYWRkKCkpO3RoaXMucmVuZGVyU2VyaWVzKCk7dGhpcy5yZW5kZXJMYWJlbHMoKTt0aGlzLmFkZENyZWRpdHMoKTt0aGlzLnNldFJlc3BvbnNpdmUmJnRoaXMuc2V0UmVzcG9uc2l2ZSgpO3RoaXMuaGFzUmVuZGVyZWQ9ITB9LGFkZENyZWRpdHM6ZnVuY3Rpb24oYSl7dmFyIGQ9dGhpczthPUIoITAsdGhpcy5vcHRpb25zLmNyZWRpdHMsYSk7YS5lbmFibGVkJiYhdGhpcy5jcmVkaXRzJiYodGhpcy5jcmVkaXRzPXRoaXMucmVuZGVyZXIudGV4dChhLnRleHQrKHRoaXMubWFwQ3JlZGl0c3x8XCJcIiksMCwwKS5hZGRDbGFzcyhcImhpZ2hjaGFydHMtY3JlZGl0c1wiKS5vbihcImNsaWNrXCIsZnVuY3Rpb24oKXthLmhyZWYmJihOLmxvY2F0aW9uLmhyZWY9YS5ocmVmKX0pLmF0dHIoe2FsaWduOmEucG9zaXRpb24uYWxpZ24sXG56SW5kZXg6OH0pLGQuc3R5bGVkTW9kZXx8dGhpcy5jcmVkaXRzLmNzcyhhLnN0eWxlKSx0aGlzLmNyZWRpdHMuYWRkKCkuYWxpZ24oYS5wb3NpdGlvbiksdGhpcy5jcmVkaXRzLnVwZGF0ZT1mdW5jdGlvbihhKXtkLmNyZWRpdHM9ZC5jcmVkaXRzLmRlc3Ryb3koKTtkLmFkZENyZWRpdHMoYSl9KX0sZGVzdHJveTpmdW5jdGlvbigpe3ZhciBkPXRoaXMsYz1kLmF4ZXMsaz1kLnNlcmllcyxlPWQuY29udGFpbmVyLHUscT1lJiZlLnBhcmVudE5vZGU7YihkLFwiZGVzdHJveVwiKTtkLnJlbmRlcmVyLmZvckV4cG9ydD9hLmVyYXNlKG4sZCk6bltkLmluZGV4XT12b2lkIDA7YS5jaGFydENvdW50LS07ZC5yZW5kZXJUby5yZW1vdmVBdHRyaWJ1dGUoXCJkYXRhLWhpZ2hjaGFydHMtY2hhcnRcIik7RChkKTtmb3IodT1jLmxlbmd0aDt1LS07KWNbdV09Y1t1XS5kZXN0cm95KCk7dGhpcy5zY3JvbGxlciYmdGhpcy5zY3JvbGxlci5kZXN0cm95JiZ0aGlzLnNjcm9sbGVyLmRlc3Ryb3koKTtmb3IodT1rLmxlbmd0aDt1LS07KWtbdV09XG5rW3VdLmRlc3Ryb3koKTtcInRpdGxlIHN1YnRpdGxlIGNoYXJ0QmFja2dyb3VuZCBwbG90QmFja2dyb3VuZCBwbG90QkdJbWFnZSBwbG90Qm9yZGVyIHNlcmllc0dyb3VwIGNsaXBSZWN0IGNyZWRpdHMgcG9pbnRlciByYW5nZVNlbGVjdG9yIGxlZ2VuZCByZXNldFpvb21CdXR0b24gdG9vbHRpcCByZW5kZXJlclwiLnNwbGl0KFwiIFwiKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe3ZhciBiPWRbYV07YiYmYi5kZXN0cm95JiYoZFthXT1iLmRlc3Ryb3koKSl9KTtlJiYoZS5pbm5lckhUTUw9XCJcIixEKGUpLHEmJnooZSkpO3AoZCxmdW5jdGlvbihhLGIpe2RlbGV0ZSBkW2JdfSl9LGZpcnN0UmVuZGVyOmZ1bmN0aW9uKCl7dmFyIGM9dGhpcyxrPWMub3B0aW9ucztpZighYy5pc1JlYWR5VG9SZW5kZXJ8fGMuaXNSZWFkeVRvUmVuZGVyKCkpe2MuZ2V0Q29udGFpbmVyKCk7Yy5yZXNldE1hcmdpbnMoKTtjLnNldENoYXJ0U2l6ZSgpO2MucHJvcEZyb21TZXJpZXMoKTtjLmdldEF4ZXMoKTsoYS5pc0FycmF5KGsuc2VyaWVzKT9cbmsuc2VyaWVzOltdKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe2MuaW5pdFNlcmllcyhhKX0pO2MubGlua1NlcmllcygpO2IoYyxcImJlZm9yZVJlbmRlclwiKTtkJiYoYy5wb2ludGVyPW5ldyBkKGMsaykpO2MucmVuZGVyKCk7aWYoIWMucmVuZGVyZXIuaW1nQ291bnQmJmMub25sb2FkKWMub25sb2FkKCk7Yy50ZW1wb3JhcnlEaXNwbGF5KCEwKX19LG9ubG9hZDpmdW5jdGlvbigpe3RoaXMuY2FsbGJhY2tzLmNvbmNhdChbdGhpcy5jYWxsYmFja10pLmZvckVhY2goZnVuY3Rpb24oYSl7YSYmdm9pZCAwIT09dGhpcy5pbmRleCYmYS5hcHBseSh0aGlzLFt0aGlzXSl9LHRoaXMpO2IodGhpcyxcImxvYWRcIik7Yih0aGlzLFwicmVuZGVyXCIpO2godGhpcy5pbmRleCkmJnRoaXMuc2V0UmVmbG93KHRoaXMub3B0aW9ucy5jaGFydC5yZWZsb3cpO3RoaXMub25sb2FkPW51bGx9fSl9KTtJKEgsXCJwYXJ0cy9TY3JvbGxhYmxlUGxvdEFyZWEuanNcIixbSFtcInBhcnRzL0dsb2JhbHMuanNcIl1dLGZ1bmN0aW9uKGEpe3ZhciBDPVxuYS5hZGRFdmVudCxBPWEuQ2hhcnQ7QyhBLFwiYWZ0ZXJTZXRDaGFydFNpemVcIixmdW5jdGlvbihBKXt2YXIgbT10aGlzLm9wdGlvbnMuY2hhcnQuc2Nyb2xsYWJsZVBsb3RBcmVhLGc9bSYmbS5taW5XaWR0aCxtPW0mJm0ubWluSGVpZ2h0LHY7aWYoIXRoaXMucmVuZGVyZXIuZm9yRXhwb3J0KXtpZihnKXtpZih0aGlzLnNjcm9sbGFibGVQaXhlbHNYPWc9TWF0aC5tYXgoMCxnLXRoaXMuY2hhcnRXaWR0aCkpdGhpcy5wbG90V2lkdGgrPWcsdGhpcy5pbnZlcnRlZD90aGlzLmNsaXBCb3guaGVpZ2h0Kz1nOnRoaXMuY2xpcEJveC53aWR0aCs9Zyx2PXsxOntuYW1lOlwicmlnaHRcIix2YWx1ZTpnfX19ZWxzZSBtJiYodGhpcy5zY3JvbGxhYmxlUGl4ZWxzWT1nPU1hdGgubWF4KDAsbS10aGlzLmNoYXJ0SGVpZ2h0KSkmJih0aGlzLnBsb3RIZWlnaHQrPWcsdGhpcy5pbnZlcnRlZD90aGlzLmNsaXBCb3gud2lkdGgrPWc6dGhpcy5jbGlwQm94LmhlaWdodCs9Zyx2PXsyOntuYW1lOlwiYm90dG9tXCIsXG52YWx1ZTpnfX0pO3YmJiFBLnNraXBBeGVzJiZ0aGlzLmF4ZXMuZm9yRWFjaChmdW5jdGlvbihnKXt2W2cuc2lkZV0/Zy5nZXRQbG90TGluZVBhdGg9ZnVuY3Rpb24oKXt2YXIgbT12W2cuc2lkZV0ubmFtZSx4PXRoaXNbbV0sbjt0aGlzW21dPXgtdltnLnNpZGVdLnZhbHVlO249YS5BeGlzLnByb3RvdHlwZS5nZXRQbG90TGluZVBhdGguYXBwbHkodGhpcyxhcmd1bWVudHMpO3RoaXNbbV09eDtyZXR1cm4gbn06KGcuc2V0QXhpc1NpemUoKSxnLnNldEF4aXNUcmFuc2xhdGlvbigpKX0pfX0pO0MoQSxcInJlbmRlclwiLGZ1bmN0aW9uKCl7dGhpcy5zY3JvbGxhYmxlUGl4ZWxzWHx8dGhpcy5zY3JvbGxhYmxlUGl4ZWxzWT8odGhpcy5zZXRVcFNjcm9sbGluZyYmdGhpcy5zZXRVcFNjcm9sbGluZygpLHRoaXMuYXBwbHlGaXhlZCgpKTp0aGlzLmZpeGVkRGl2JiZ0aGlzLmFwcGx5Rml4ZWQoKX0pO0EucHJvdG90eXBlLnNldFVwU2Nyb2xsaW5nPWZ1bmN0aW9uKCl7dmFyIEE9e1dlYmtpdE92ZXJmbG93U2Nyb2xsaW5nOlwidG91Y2hcIixcbm92ZXJmbG93WDpcImhpZGRlblwiLG92ZXJmbG93WTpcImhpZGRlblwifTt0aGlzLnNjcm9sbGFibGVQaXhlbHNYJiYoQS5vdmVyZmxvd1g9XCJhdXRvXCIpO3RoaXMuc2Nyb2xsYWJsZVBpeGVsc1kmJihBLm92ZXJmbG93WT1cImF1dG9cIik7dGhpcy5zY3JvbGxpbmdDb250YWluZXI9YS5jcmVhdGVFbGVtZW50KFwiZGl2XCIse2NsYXNzTmFtZTpcImhpZ2hjaGFydHMtc2Nyb2xsaW5nXCJ9LEEsdGhpcy5yZW5kZXJUbyk7dGhpcy5pbm5lckNvbnRhaW5lcj1hLmNyZWF0ZUVsZW1lbnQoXCJkaXZcIix7Y2xhc3NOYW1lOlwiaGlnaGNoYXJ0cy1pbm5lci1jb250YWluZXJcIn0sbnVsbCx0aGlzLnNjcm9sbGluZ0NvbnRhaW5lcik7dGhpcy5pbm5lckNvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLmNvbnRhaW5lcik7dGhpcy5zZXRVcFNjcm9sbGluZz1udWxsfTtBLnByb3RvdHlwZS5tb3ZlRml4ZWRFbGVtZW50cz1mdW5jdGlvbigpe3ZhciBhPXRoaXMuY29udGFpbmVyLG09dGhpcy5maXhlZFJlbmRlcmVyLGc9XCIuaGlnaGNoYXJ0cy1jb250ZXh0YnV0dG9uIC5oaWdoY2hhcnRzLWNyZWRpdHMgLmhpZ2hjaGFydHMtbGVnZW5kIC5oaWdoY2hhcnRzLXJlc2V0LXpvb20gLmhpZ2hjaGFydHMtc3VidGl0bGUgLmhpZ2hjaGFydHMtdGl0bGUgLmhpZ2hjaGFydHMtbGVnZW5kLWNoZWNrYm94XCIuc3BsaXQoXCIgXCIpLFxudjt0aGlzLnNjcm9sbGFibGVQaXhlbHNYJiYhdGhpcy5pbnZlcnRlZD92PVwiLmhpZ2hjaGFydHMteWF4aXNcIjp0aGlzLnNjcm9sbGFibGVQaXhlbHNYJiZ0aGlzLmludmVydGVkP3Y9XCIuaGlnaGNoYXJ0cy14YXhpc1wiOnRoaXMuc2Nyb2xsYWJsZVBpeGVsc1kmJiF0aGlzLmludmVydGVkP3Y9XCIuaGlnaGNoYXJ0cy14YXhpc1wiOnRoaXMuc2Nyb2xsYWJsZVBpeGVsc1kmJnRoaXMuaW52ZXJ0ZWQmJih2PVwiLmhpZ2hjaGFydHMteWF4aXNcIik7Zy5wdXNoKHYsditcIi1sYWJlbHNcIik7Zy5mb3JFYWNoKGZ1bmN0aW9uKGcpe1tdLmZvckVhY2guY2FsbChhLnF1ZXJ5U2VsZWN0b3JBbGwoZyksZnVuY3Rpb24oYSl7KGEubmFtZXNwYWNlVVJJPT09bS5TVkdfTlM/bS5ib3g6bS5ib3gucGFyZW50Tm9kZSkuYXBwZW5kQ2hpbGQoYSk7YS5zdHlsZS5wb2ludGVyRXZlbnRzPVwiYXV0b1wifSl9KX07QS5wcm90b3R5cGUuYXBwbHlGaXhlZD1mdW5jdGlvbigpe3ZhciBBLG0sZz0hdGhpcy5maXhlZERpdix2PVxudGhpcy5vcHRpb25zLmNoYXJ0LnNjcm9sbGFibGVQbG90QXJlYTtnPyh0aGlzLmZpeGVkRGl2PWEuY3JlYXRlRWxlbWVudChcImRpdlwiLHtjbGFzc05hbWU6XCJoaWdoY2hhcnRzLWZpeGVkXCJ9LHtwb3NpdGlvbjpcImFic29sdXRlXCIsb3ZlcmZsb3c6XCJoaWRkZW5cIixwb2ludGVyRXZlbnRzOlwibm9uZVwiLHpJbmRleDoyfSxudWxsLCEwKSx0aGlzLnJlbmRlclRvLmluc2VydEJlZm9yZSh0aGlzLmZpeGVkRGl2LHRoaXMucmVuZGVyVG8uZmlyc3RDaGlsZCksdGhpcy5yZW5kZXJUby5zdHlsZS5vdmVyZmxvdz1cInZpc2libGVcIix0aGlzLmZpeGVkUmVuZGVyZXI9QT1uZXcgYS5SZW5kZXJlcih0aGlzLmZpeGVkRGl2LHRoaXMuY2hhcnRXaWR0aCx0aGlzLmNoYXJ0SGVpZ2h0KSx0aGlzLnNjcm9sbGFibGVNYXNrPUEucGF0aCgpLmF0dHIoe2ZpbGw6YS5jb2xvcih0aGlzLm9wdGlvbnMuY2hhcnQuYmFja2dyb3VuZENvbG9yfHxcIiNmZmZcIikuc2V0T3BhY2l0eShhLnBpY2sodi5vcGFjaXR5LC44NSkpLmdldCgpLFxuekluZGV4Oi0xfSkuYWRkQ2xhc3MoXCJoaWdoY2hhcnRzLXNjcm9sbGFibGUtbWFza1wiKS5hZGQoKSx0aGlzLm1vdmVGaXhlZEVsZW1lbnRzKCksQyh0aGlzLFwiYWZ0ZXJTaG93UmVzZXRab29tXCIsdGhpcy5tb3ZlRml4ZWRFbGVtZW50cykpOnRoaXMuZml4ZWRSZW5kZXJlci5zZXRTaXplKHRoaXMuY2hhcnRXaWR0aCx0aGlzLmNoYXJ0SGVpZ2h0KTtBPXRoaXMuY2hhcnRXaWR0aCsodGhpcy5zY3JvbGxhYmxlUGl4ZWxzWHx8MCk7bT10aGlzLmNoYXJ0SGVpZ2h0Kyh0aGlzLnNjcm9sbGFibGVQaXhlbHNZfHwwKTthLnN0b3AodGhpcy5jb250YWluZXIpO3RoaXMuY29udGFpbmVyLnN0eWxlLndpZHRoPUErXCJweFwiO3RoaXMuY29udGFpbmVyLnN0eWxlLmhlaWdodD1tK1wicHhcIjt0aGlzLnJlbmRlcmVyLmJveFdyYXBwZXIuYXR0cih7d2lkdGg6QSxoZWlnaHQ6bSx2aWV3Qm94OlswLDAsQSxtXS5qb2luKFwiIFwiKX0pO3RoaXMuY2hhcnRCYWNrZ3JvdW5kLmF0dHIoe3dpZHRoOkEsaGVpZ2h0Om19KTtcbnRoaXMuc2Nyb2xsYWJsZVBpeGVsc1kmJih0aGlzLnNjcm9sbGluZ0NvbnRhaW5lci5zdHlsZS5oZWlnaHQ9dGhpcy5jaGFydEhlaWdodCtcInB4XCIpO2cmJih2LnNjcm9sbFBvc2l0aW9uWCYmKHRoaXMuc2Nyb2xsaW5nQ29udGFpbmVyLnNjcm9sbExlZnQ9dGhpcy5zY3JvbGxhYmxlUGl4ZWxzWCp2LnNjcm9sbFBvc2l0aW9uWCksdi5zY3JvbGxQb3NpdGlvblkmJih0aGlzLnNjcm9sbGluZ0NvbnRhaW5lci5zY3JvbGxUb3A9dGhpcy5zY3JvbGxhYmxlUGl4ZWxzWSp2LnNjcm9sbFBvc2l0aW9uWSkpO209dGhpcy5heGlzT2Zmc2V0O2c9dGhpcy5wbG90VG9wLW1bMF0tMTt2PXRoaXMucGxvdExlZnQtbVszXS0xO0E9dGhpcy5wbG90VG9wK3RoaXMucGxvdEhlaWdodCttWzJdKzE7bT10aGlzLnBsb3RMZWZ0K3RoaXMucGxvdFdpZHRoK21bMV0rMTt2YXIgeD10aGlzLnBsb3RMZWZ0K3RoaXMucGxvdFdpZHRoLSh0aGlzLnNjcm9sbGFibGVQaXhlbHNYfHwwKSx5PXRoaXMucGxvdFRvcCt0aGlzLnBsb3RIZWlnaHQtXG4odGhpcy5zY3JvbGxhYmxlUGl4ZWxzWXx8MCksZz10aGlzLnNjcm9sbGFibGVQaXhlbHNYP1tcIk1cIiwwLGcsXCJMXCIsdGhpcy5wbG90TGVmdC0xLGcsXCJMXCIsdGhpcy5wbG90TGVmdC0xLEEsXCJMXCIsMCxBLFwiWlwiLFwiTVwiLHgsZyxcIkxcIix0aGlzLmNoYXJ0V2lkdGgsZyxcIkxcIix0aGlzLmNoYXJ0V2lkdGgsQSxcIkxcIix4LEEsXCJaXCJdOnRoaXMuc2Nyb2xsYWJsZVBpeGVsc1k/W1wiTVwiLHYsMCxcIkxcIix2LHRoaXMucGxvdFRvcC0xLFwiTFwiLG0sdGhpcy5wbG90VG9wLTEsXCJMXCIsbSwwLFwiWlwiLFwiTVwiLHYseSxcIkxcIix2LHRoaXMuY2hhcnRIZWlnaHQsXCJMXCIsbSx0aGlzLmNoYXJ0SGVpZ2h0LFwiTFwiLG0seSxcIlpcIl06W1wiTVwiLDAsMF07XCJhZGp1c3RIZWlnaHRcIiE9PXRoaXMucmVkcmF3VHJpZ2dlciYmdGhpcy5zY3JvbGxhYmxlTWFzay5hdHRyKHtkOmd9KX19KTtJKEgsXCJwYXJ0cy9Qb2ludC5qc1wiLFtIW1wicGFydHMvR2xvYmFscy5qc1wiXV0sZnVuY3Rpb24oYSl7dmFyIEMsQT1hLmV4dGVuZCxFPWEuZXJhc2UsXG5tPWEuZmlyZUV2ZW50LGc9YS5mb3JtYXQsdj1hLmlzQXJyYXkseD1hLmlzTnVtYmVyLHk9YS5waWNrLHo9YS51bmlxdWVLZXksbj1hLmRlZmluZWQsZj1hLnJlbW92ZUV2ZW50O2EuUG9pbnQ9Qz1mdW5jdGlvbigpe307YS5Qb2ludC5wcm90b3R5cGU9e2luaXQ6ZnVuY3Rpb24oYSxmLGUpe3RoaXMuc2VyaWVzPWE7dGhpcy5hcHBseU9wdGlvbnMoZixlKTt0aGlzLmlkPW4odGhpcy5pZCk/dGhpcy5pZDp6KCk7dGhpcy5yZXNvbHZlQ29sb3IoKTthLmNoYXJ0LnBvaW50Q291bnQrKzttKHRoaXMsXCJhZnRlckluaXRcIik7cmV0dXJuIHRoaXN9LHJlc29sdmVDb2xvcjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuc2VyaWVzLGY7Zj1hLmNoYXJ0Lm9wdGlvbnMuY2hhcnQuY29sb3JDb3VudDt2YXIgZT1hLmNoYXJ0LnN0eWxlZE1vZGU7ZXx8dGhpcy5vcHRpb25zLmNvbG9yfHwodGhpcy5jb2xvcj1hLmNvbG9yKTthLm9wdGlvbnMuY29sb3JCeVBvaW50PyhlfHwoZj1hLm9wdGlvbnMuY29sb3JzfHxcbmEuY2hhcnQub3B0aW9ucy5jb2xvcnMsdGhpcy5jb2xvcj10aGlzLmNvbG9yfHxmW2EuY29sb3JDb3VudGVyXSxmPWYubGVuZ3RoKSxlPWEuY29sb3JDb3VudGVyLGEuY29sb3JDb3VudGVyKyssYS5jb2xvckNvdW50ZXI9PT1mJiYoYS5jb2xvckNvdW50ZXI9MCkpOmU9YS5jb2xvckluZGV4O3RoaXMuY29sb3JJbmRleD15KHRoaXMuY29sb3JJbmRleCxlKX0sYXBwbHlPcHRpb25zOmZ1bmN0aW9uKGEsZil7dmFyIGU9dGhpcy5zZXJpZXMsYj1lLm9wdGlvbnMucG9pbnRWYWxLZXl8fGUucG9pbnRWYWxLZXk7YT1DLnByb3RvdHlwZS5vcHRpb25zVG9PYmplY3QuY2FsbCh0aGlzLGEpO0EodGhpcyxhKTt0aGlzLm9wdGlvbnM9dGhpcy5vcHRpb25zP0EodGhpcy5vcHRpb25zLGEpOmE7YS5ncm91cCYmZGVsZXRlIHRoaXMuZ3JvdXA7YS5kYXRhTGFiZWxzJiZkZWxldGUgdGhpcy5kYXRhTGFiZWxzO2ImJih0aGlzLnk9dGhpc1tiXSk7aWYodGhpcy5pc051bGw9eSh0aGlzLmlzVmFsaWQmJlxuIXRoaXMuaXNWYWxpZCgpLG51bGw9PT10aGlzLnh8fCF4KHRoaXMueSwhMCkpKXRoaXMuZm9ybWF0UHJlZml4PVwibnVsbFwiO3RoaXMuc2VsZWN0ZWQmJih0aGlzLnN0YXRlPVwic2VsZWN0XCIpO1wibmFtZVwiaW4gdGhpcyYmdm9pZCAwPT09ZiYmZS54QXhpcyYmZS54QXhpcy5oYXNOYW1lcyYmKHRoaXMueD1lLnhBeGlzLm5hbWVUb1godGhpcykpO3ZvaWQgMD09PXRoaXMueCYmZSYmKHRoaXMueD12b2lkIDA9PT1mP2UuYXV0b0luY3JlbWVudCh0aGlzKTpmKTtyZXR1cm4gdGhpc30sc2V0TmVzdGVkUHJvcGVydHk6ZnVuY3Rpb24oZixnLGUpe2Uuc3BsaXQoXCIuXCIpLnJlZHVjZShmdW5jdGlvbihiLGUsYyxmKXtiW2VdPWYubGVuZ3RoLTE9PT1jP2c6YS5pc09iamVjdChiW2VdLCEwKT9iW2VdOnt9O3JldHVybiBiW2VdfSxmKTtyZXR1cm4gZn0sb3B0aW9uc1RvT2JqZWN0OmZ1bmN0aW9uKGYpe3ZhciBoPXt9LGU9dGhpcy5zZXJpZXMsYj1lLm9wdGlvbnMua2V5cyxsPWJ8fGUucG9pbnRBcnJheU1hcHx8XG5bXCJ5XCJdLGM9bC5sZW5ndGgsdD0wLGc9MDtpZih4KGYpfHxudWxsPT09ZiloW2xbMF1dPWY7ZWxzZSBpZih2KGYpKWZvcighYiYmZi5sZW5ndGg+YyYmKGU9dHlwZW9mIGZbMF0sXCJzdHJpbmdcIj09PWU/aC5uYW1lPWZbMF06XCJudW1iZXJcIj09PWUmJihoLng9ZlswXSksdCsrKTtnPGM7KWImJnZvaWQgMD09PWZbdF18fCgwPGxbZ10uaW5kZXhPZihcIi5cIik/YS5Qb2ludC5wcm90b3R5cGUuc2V0TmVzdGVkUHJvcGVydHkoaCxmW3RdLGxbZ10pOmhbbFtnXV09Zlt0XSksdCsrLGcrKztlbHNlXCJvYmplY3RcIj09PXR5cGVvZiBmJiYoaD1mLGYuZGF0YUxhYmVscyYmKGUuX2hhc1BvaW50TGFiZWxzPSEwKSxmLm1hcmtlciYmKGUuX2hhc1BvaW50TWFya2Vycz0hMCkpO3JldHVybiBofSxnZXRDbGFzc05hbWU6ZnVuY3Rpb24oKXtyZXR1cm5cImhpZ2hjaGFydHMtcG9pbnRcIisodGhpcy5zZWxlY3RlZD9cIiBoaWdoY2hhcnRzLXBvaW50LXNlbGVjdFwiOlwiXCIpKyh0aGlzLm5lZ2F0aXZlP1wiIGhpZ2hjaGFydHMtbmVnYXRpdmVcIjpcblwiXCIpKyh0aGlzLmlzTnVsbD9cIiBoaWdoY2hhcnRzLW51bGwtcG9pbnRcIjpcIlwiKSsodm9pZCAwIT09dGhpcy5jb2xvckluZGV4P1wiIGhpZ2hjaGFydHMtY29sb3ItXCIrdGhpcy5jb2xvckluZGV4OlwiXCIpKyh0aGlzLm9wdGlvbnMuY2xhc3NOYW1lP1wiIFwiK3RoaXMub3B0aW9ucy5jbGFzc05hbWU6XCJcIikrKHRoaXMuem9uZSYmdGhpcy56b25lLmNsYXNzTmFtZT9cIiBcIit0aGlzLnpvbmUuY2xhc3NOYW1lLnJlcGxhY2UoXCJoaWdoY2hhcnRzLW5lZ2F0aXZlXCIsXCJcIik6XCJcIil9LGdldFpvbmU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnNlcmllcyxmPWEuem9uZXMsYT1hLnpvbmVBeGlzfHxcInlcIixlPTAsYjtmb3IoYj1mW2VdO3RoaXNbYV0+PWIudmFsdWU7KWI9ZlsrK2VdO3RoaXMubm9uWm9uZWRDb2xvcnx8KHRoaXMubm9uWm9uZWRDb2xvcj10aGlzLmNvbG9yKTt0aGlzLmNvbG9yPWImJmIuY29sb3ImJiF0aGlzLm9wdGlvbnMuY29sb3I/Yi5jb2xvcjp0aGlzLm5vblpvbmVkQ29sb3I7cmV0dXJuIGJ9LFxuZGVzdHJveTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuc2VyaWVzLmNoYXJ0LGc9YS5ob3ZlclBvaW50cyxlO2EucG9pbnRDb3VudC0tO2cmJih0aGlzLnNldFN0YXRlKCksRShnLHRoaXMpLGcubGVuZ3RofHwoYS5ob3ZlclBvaW50cz1udWxsKSk7aWYodGhpcz09PWEuaG92ZXJQb2ludCl0aGlzLm9uTW91c2VPdXQoKTtpZih0aGlzLmdyYXBoaWN8fHRoaXMuZGF0YUxhYmVsfHx0aGlzLmRhdGFMYWJlbHMpZih0aGlzKSx0aGlzLmRlc3Ryb3lFbGVtZW50cygpO3RoaXMubGVnZW5kSXRlbSYmYS5sZWdlbmQuZGVzdHJveUl0ZW0odGhpcyk7Zm9yKGUgaW4gdGhpcyl0aGlzW2VdPW51bGx9LGRlc3Ryb3lFbGVtZW50czpmdW5jdGlvbihhKXt2YXIgZj10aGlzLGU9W10sYixoO2E9YXx8e2dyYXBoaWM6MSxkYXRhTGFiZWw6MX07YS5ncmFwaGljJiZlLnB1c2goXCJncmFwaGljXCIsXCJzaGFkb3dHcm91cFwiKTthLmRhdGFMYWJlbCYmZS5wdXNoKFwiZGF0YUxhYmVsXCIsXCJkYXRhTGFiZWxVcHBlclwiLFwiY29ubmVjdG9yXCIpO1xuZm9yKGg9ZS5sZW5ndGg7aC0tOyliPWVbaF0sZltiXSYmKGZbYl09ZltiXS5kZXN0cm95KCkpO1tcImRhdGFMYWJlbFwiLFwiY29ubmVjdG9yXCJdLmZvckVhY2goZnVuY3Rpb24oYil7dmFyIGM9YitcInNcIjthW2JdJiZmW2NdJiYoZltjXS5mb3JFYWNoKGZ1bmN0aW9uKGEpe2EuZWxlbWVudCYmYS5kZXN0cm95KCl9KSxkZWxldGUgZltjXSl9KX0sZ2V0TGFiZWxDb25maWc6ZnVuY3Rpb24oKXtyZXR1cm57eDp0aGlzLmNhdGVnb3J5LHk6dGhpcy55LGNvbG9yOnRoaXMuY29sb3IsY29sb3JJbmRleDp0aGlzLmNvbG9ySW5kZXgsa2V5OnRoaXMubmFtZXx8dGhpcy5jYXRlZ29yeSxzZXJpZXM6dGhpcy5zZXJpZXMscG9pbnQ6dGhpcyxwZXJjZW50YWdlOnRoaXMucGVyY2VudGFnZSx0b3RhbDp0aGlzLnRvdGFsfHx0aGlzLnN0YWNrVG90YWx9fSx0b29sdGlwRm9ybWF0dGVyOmZ1bmN0aW9uKGEpe3ZhciBmPXRoaXMuc2VyaWVzLGU9Zi50b29sdGlwT3B0aW9ucyxiPXkoZS52YWx1ZURlY2ltYWxzLFxuXCJcIiksaD1lLnZhbHVlUHJlZml4fHxcIlwiLGM9ZS52YWx1ZVN1ZmZpeHx8XCJcIjtmLmNoYXJ0LnN0eWxlZE1vZGUmJihhPWYuY2hhcnQudG9vbHRpcC5zdHlsZWRNb2RlRm9ybWF0KGEpKTsoZi5wb2ludEFycmF5TWFwfHxbXCJ5XCJdKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2U9XCJ7cG9pbnQuXCIrZTtpZihofHxjKWE9YS5yZXBsYWNlKFJlZ0V4cChlK1wifVwiLFwiZ1wiKSxoK2UrXCJ9XCIrYyk7YT1hLnJlcGxhY2UoUmVnRXhwKGUrXCJ9XCIsXCJnXCIpLGUrXCI6LC5cIitiK1wiZn1cIil9KTtyZXR1cm4gZyhhLHtwb2ludDp0aGlzLHNlcmllczp0aGlzLnNlcmllc30sZi5jaGFydC50aW1lKX0sZmlyZVBvaW50RXZlbnQ6ZnVuY3Rpb24oYSxmLGUpe3ZhciBiPXRoaXMsaD10aGlzLnNlcmllcy5vcHRpb25zOyhoLnBvaW50LmV2ZW50c1thXXx8Yi5vcHRpb25zJiZiLm9wdGlvbnMuZXZlbnRzJiZiLm9wdGlvbnMuZXZlbnRzW2FdKSYmdGhpcy5pbXBvcnRFdmVudHMoKTtcImNsaWNrXCI9PT1hJiZoLmFsbG93UG9pbnRTZWxlY3QmJlxuKGU9ZnVuY3Rpb24oYSl7Yi5zZWxlY3QmJmIuc2VsZWN0KG51bGwsYS5jdHJsS2V5fHxhLm1ldGFLZXl8fGEuc2hpZnRLZXkpfSk7bSh0aGlzLGEsZixlKX0sdmlzaWJsZTohMH19KTtJKEgsXCJwYXJ0cy9TZXJpZXMuanNcIixbSFtcInBhcnRzL0dsb2JhbHMuanNcIl1dLGZ1bmN0aW9uKGEpe3ZhciBDPWEuYWRkRXZlbnQsQT1hLmFuaW1PYmplY3QsRT1hLmFycmF5TWF4LG09YS5hcnJheU1pbixnPWEuY29ycmVjdEZsb2F0LHY9YS5kZWZhdWx0T3B0aW9ucyx4PWEuZGVmYXVsdFBsb3RPcHRpb25zLHk9YS5kZWZpbmVkLHo9YS5lcmFzZSxuPWEuZXh0ZW5kLGY9YS5maXJlRXZlbnQsaD1hLmlzQXJyYXkscj1hLmlzTnVtYmVyLGU9YS5pc1N0cmluZyxiPWEubWVyZ2UsbD1hLm9iamVjdEVhY2gsYz1hLnBpY2ssdD1hLnJlbW92ZUV2ZW50LEY9YS5zcGxhdCx3PWEuU1ZHRWxlbWVudCxCPWEuc3luY1RpbWVvdXQscD1hLndpbjthLlNlcmllcz1hLnNlcmllc1R5cGUoXCJsaW5lXCIsbnVsbCx7bGluZVdpZHRoOjIsXG5hbGxvd1BvaW50U2VsZWN0OiExLHNob3dDaGVja2JveDohMSxhbmltYXRpb246e2R1cmF0aW9uOjFFM30sZXZlbnRzOnt9LG1hcmtlcjp7bGluZVdpZHRoOjAsbGluZUNvbG9yOlwiI2ZmZmZmZlwiLGVuYWJsZWRUaHJlc2hvbGQ6MixyYWRpdXM6NCxzdGF0ZXM6e25vcm1hbDp7YW5pbWF0aW9uOiEwfSxob3Zlcjp7YW5pbWF0aW9uOntkdXJhdGlvbjo1MH0sZW5hYmxlZDohMCxyYWRpdXNQbHVzOjIsbGluZVdpZHRoUGx1czoxfSxzZWxlY3Q6e2ZpbGxDb2xvcjpcIiNjY2NjY2NcIixsaW5lQ29sb3I6XCIjMDAwMDAwXCIsbGluZVdpZHRoOjJ9fX0scG9pbnQ6e2V2ZW50czp7fX0sZGF0YUxhYmVsczp7YWxpZ246XCJjZW50ZXJcIixmb3JtYXR0ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbD09PXRoaXMueT9cIlwiOmEubnVtYmVyRm9ybWF0KHRoaXMueSwtMSl9LHBhZGRpbmc6NSxzdHlsZTp7Zm9udFNpemU6XCIxMXB4XCIsZm9udFdlaWdodDpcImJvbGRcIixjb2xvcjpcImNvbnRyYXN0XCIsdGV4dE91dGxpbmU6XCIxcHggY29udHJhc3RcIn0sXG52ZXJ0aWNhbEFsaWduOlwiYm90dG9tXCIseDowLHk6MH0sY3JvcFRocmVzaG9sZDozMDAsb3BhY2l0eToxLHBvaW50UmFuZ2U6MCxzb2Z0VGhyZXNob2xkOiEwLHN0YXRlczp7bm9ybWFsOnthbmltYXRpb246ITB9LGhvdmVyOnthbmltYXRpb246e2R1cmF0aW9uOjUwfSxsaW5lV2lkdGhQbHVzOjEsbWFya2VyOnt9LGhhbG86e3NpemU6MTAsb3BhY2l0eTouMjV9fSxzZWxlY3Q6e2FuaW1hdGlvbjp7ZHVyYXRpb246MH19LGluYWN0aXZlOnthbmltYXRpb246e2R1cmF0aW9uOjUwfSxvcGFjaXR5Oi4yfX0sc3RpY2t5VHJhY2tpbmc6ITAsdHVyYm9UaHJlc2hvbGQ6MUUzLGZpbmROZWFyZXN0UG9pbnRCeTpcInhcIn0se2lzQ2FydGVzaWFuOiEwLHBvaW50Q2xhc3M6YS5Qb2ludCxzb3J0ZWQ6ITAscmVxdWlyZVNvcnRpbmc6ITAsZGlyZWN0VG91Y2g6ITEsYXhpc1R5cGVzOltcInhBeGlzXCIsXCJ5QXhpc1wiXSxjb2xvckNvdW50ZXI6MCxwYXJhbGxlbEFycmF5czpbXCJ4XCIsXCJ5XCJdLGNvbGw6XCJzZXJpZXNcIixcbmNyb3BTaG91bGRlcjoxLGluaXQ6ZnVuY3Rpb24oZCxiKXtmKHRoaXMsXCJpbml0XCIse29wdGlvbnM6Yn0pO3ZhciBrPXRoaXMsZSxwPWQuc2VyaWVzLHE7ay5jaGFydD1kO2sub3B0aW9ucz1iPWsuc2V0T3B0aW9ucyhiKTtrLmxpbmtlZFNlcmllcz1bXTtrLmJpbmRBeGVzKCk7bihrLHtuYW1lOmIubmFtZSxzdGF0ZTpcIlwiLHZpc2libGU6ITEhPT1iLnZpc2libGUsc2VsZWN0ZWQ6ITA9PT1iLnNlbGVjdGVkfSk7ZT1iLmV2ZW50cztsKGUsZnVuY3Rpb24oZCxiKXshYS5pc0Z1bmN0aW9uKGQpfHxrLmhjRXZlbnRzJiZrLmhjRXZlbnRzW2JdJiZrLmhjRXZlbnRzW2JdLnNvbWUoZnVuY3Rpb24oYSl7cmV0dXJuIGEuZm49PT1kfSl8fEMoayxiLGQpfSk7aWYoZSYmZS5jbGlja3x8Yi5wb2ludCYmYi5wb2ludC5ldmVudHMmJmIucG9pbnQuZXZlbnRzLmNsaWNrfHxiLmFsbG93UG9pbnRTZWxlY3QpZC5ydW5UcmFja2VyQ2xpY2s9ITA7ay5nZXRDb2xvcigpO2suZ2V0U3ltYm9sKCk7ay5wYXJhbGxlbEFycmF5cy5mb3JFYWNoKGZ1bmN0aW9uKGEpe2tbYStcblwiRGF0YVwiXXx8KGtbYStcIkRhdGFcIl09W10pfSk7ay5wb2ludHN8fGsuc2V0RGF0YShiLmRhdGEsITEpO2suaXNDYXJ0ZXNpYW4mJihkLmhhc0NhcnRlc2lhblNlcmllcz0hMCk7cC5sZW5ndGgmJihxPXBbcC5sZW5ndGgtMV0pO2suX2k9YyhxJiZxLl9pLC0xKSsxO2Qub3JkZXJTZXJpZXModGhpcy5pbnNlcnQocCkpO2YodGhpcyxcImFmdGVySW5pdFwiKX0saW5zZXJ0OmZ1bmN0aW9uKGEpe3ZhciBkPXRoaXMub3B0aW9ucy5pbmRleCxiO2lmKHIoZCkpe2ZvcihiPWEubGVuZ3RoO2ItLTspaWYoZD49YyhhW2JdLm9wdGlvbnMuaW5kZXgsYVtiXS5faSkpe2Euc3BsaWNlKGIrMSwwLHRoaXMpO2JyZWFrfS0xPT09YiYmYS51bnNoaWZ0KHRoaXMpO2IrPTF9ZWxzZSBhLnB1c2godGhpcyk7cmV0dXJuIGMoYixhLmxlbmd0aC0xKX0sYmluZEF4ZXM6ZnVuY3Rpb24oKXt2YXIgZD10aGlzLGI9ZC5vcHRpb25zLGM9ZC5jaGFydCxlO2YodGhpcyxcImJpbmRBeGVzXCIsbnVsbCxmdW5jdGlvbigpeyhkLmF4aXNUeXBlc3x8XG5bXSkuZm9yRWFjaChmdW5jdGlvbihrKXtjW2tdLmZvckVhY2goZnVuY3Rpb24oYSl7ZT1hLm9wdGlvbnM7aWYoYltrXT09PWUuaW5kZXh8fHZvaWQgMCE9PWJba10mJmJba109PT1lLmlkfHx2b2lkIDA9PT1iW2tdJiYwPT09ZS5pbmRleClkLmluc2VydChhLnNlcmllcyksZFtrXT1hLGEuaXNEaXJ0eT0hMH0pO2Rba118fGQub3B0aW9uYWxBeGlzPT09a3x8YS5lcnJvcigxOCwhMCxjKX0pfSl9LHVwZGF0ZVBhcmFsbGVsQXJyYXlzOmZ1bmN0aW9uKGEsYil7dmFyIGQ9YS5zZXJpZXMsYz1hcmd1bWVudHMsaz1yKGIpP2Z1bmN0aW9uKGMpe3ZhciBrPVwieVwiPT09YyYmZC50b1lEYXRhP2QudG9ZRGF0YShhKTphW2NdO2RbYytcIkRhdGFcIl1bYl09a306ZnVuY3Rpb24oYSl7QXJyYXkucHJvdG90eXBlW2JdLmFwcGx5KGRbYStcIkRhdGFcIl0sQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYywyKSl9O2QucGFyYWxsZWxBcnJheXMuZm9yRWFjaChrKX0saGFzRGF0YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpc2libGUmJlxudm9pZCAwIT09dGhpcy5kYXRhTWF4JiZ2b2lkIDAhPT10aGlzLmRhdGFNaW58fHRoaXMudmlzaWJsZSYmdGhpcy55RGF0YSYmMDx0aGlzLnlEYXRhLmxlbmd0aH0sYXV0b0luY3JlbWVudDpmdW5jdGlvbigpe3ZhciBhPXRoaXMub3B0aW9ucyxiPXRoaXMueEluY3JlbWVudCxlLGY9YS5wb2ludEludGVydmFsVW5pdCxwPXRoaXMuY2hhcnQudGltZSxiPWMoYixhLnBvaW50U3RhcnQsMCk7dGhpcy5wb2ludEludGVydmFsPWU9Yyh0aGlzLnBvaW50SW50ZXJ2YWwsYS5wb2ludEludGVydmFsLDEpO2YmJihhPW5ldyBwLkRhdGUoYiksXCJkYXlcIj09PWY/cC5zZXQoXCJEYXRlXCIsYSxwLmdldChcIkRhdGVcIixhKStlKTpcIm1vbnRoXCI9PT1mP3Auc2V0KFwiTW9udGhcIixhLHAuZ2V0KFwiTW9udGhcIixhKStlKTpcInllYXJcIj09PWYmJnAuc2V0KFwiRnVsbFllYXJcIixhLHAuZ2V0KFwiRnVsbFllYXJcIixhKStlKSxlPWEuZ2V0VGltZSgpLWIpO3RoaXMueEluY3JlbWVudD1iK2U7cmV0dXJuIGJ9LHNldE9wdGlvbnM6ZnVuY3Rpb24oYSl7dmFyIGQ9XG50aGlzLmNoYXJ0LGU9ZC5vcHRpb25zLHA9ZS5wbG90T3B0aW9ucyxoPWQudXNlck9wdGlvbnN8fHt9O2E9YihhKTt2YXIgZD1kLnN0eWxlZE1vZGUscT17cGxvdE9wdGlvbnM6cCx1c2VyT3B0aW9uczphfTtmKHRoaXMsXCJzZXRPcHRpb25zXCIscSk7dmFyIGw9aC5wbG90T3B0aW9uc3x8e30sZz1xLnBsb3RPcHRpb25zW3RoaXMudHlwZV07dGhpcy51c2VyT3B0aW9ucz1xLnVzZXJPcHRpb25zO2g9YihnLHAuc2VyaWVzLGgucGxvdE9wdGlvbnMmJmgucGxvdE9wdGlvbnNbdGhpcy50eXBlXSxhKTt0aGlzLnRvb2x0aXBPcHRpb25zPWIodi50b29sdGlwLHYucGxvdE9wdGlvbnMuc2VyaWVzJiZ2LnBsb3RPcHRpb25zLnNlcmllcy50b29sdGlwLHYucGxvdE9wdGlvbnNbdGhpcy50eXBlXS50b29sdGlwLGUudG9vbHRpcC51c2VyT3B0aW9ucyxwLnNlcmllcyYmcC5zZXJpZXMudG9vbHRpcCxwW3RoaXMudHlwZV0udG9vbHRpcCxhLnRvb2x0aXApO3RoaXMuc3RpY2t5VHJhY2tpbmc9YyhhLnN0aWNreVRyYWNraW5nLFxubFt0aGlzLnR5cGVdJiZsW3RoaXMudHlwZV0uc3RpY2t5VHJhY2tpbmcsbC5zZXJpZXMmJmwuc2VyaWVzLnN0aWNreVRyYWNraW5nLHRoaXMudG9vbHRpcE9wdGlvbnMuc2hhcmVkJiYhdGhpcy5ub1NoYXJlZFRvb2x0aXA/ITA6aC5zdGlja3lUcmFja2luZyk7bnVsbD09PWcubWFya2VyJiZkZWxldGUgaC5tYXJrZXI7dGhpcy56b25lQXhpcz1oLnpvbmVBeGlzO2U9dGhpcy56b25lcz0oaC56b25lc3x8W10pLnNsaWNlKCk7IWgubmVnYXRpdmVDb2xvciYmIWgubmVnYXRpdmVGaWxsQ29sb3J8fGguem9uZXN8fChwPXt2YWx1ZTpoW3RoaXMuem9uZUF4aXMrXCJUaHJlc2hvbGRcIl18fGgudGhyZXNob2xkfHwwLGNsYXNzTmFtZTpcImhpZ2hjaGFydHMtbmVnYXRpdmVcIn0sZHx8KHAuY29sb3I9aC5uZWdhdGl2ZUNvbG9yLHAuZmlsbENvbG9yPWgubmVnYXRpdmVGaWxsQ29sb3IpLGUucHVzaChwKSk7ZS5sZW5ndGgmJnkoZVtlLmxlbmd0aC0xXS52YWx1ZSkmJmUucHVzaChkP3t9Ontjb2xvcjp0aGlzLmNvbG9yLFxuZmlsbENvbG9yOnRoaXMuZmlsbENvbG9yfSk7Zih0aGlzLFwiYWZ0ZXJTZXRPcHRpb25zXCIse29wdGlvbnM6aH0pO3JldHVybiBofSxnZXROYW1lOmZ1bmN0aW9uKCl7cmV0dXJuIGModGhpcy5vcHRpb25zLm5hbWUsXCJTZXJpZXMgXCIrKHRoaXMuaW5kZXgrMSkpfSxnZXRDeWNsaWM6ZnVuY3Rpb24oYSxiLGUpe3ZhciBkLGs9dGhpcy5jaGFydCx1PXRoaXMudXNlck9wdGlvbnMsZj1hK1wiSW5kZXhcIixwPWErXCJDb3VudGVyXCIsaD1lP2UubGVuZ3RoOmMoay5vcHRpb25zLmNoYXJ0W2ErXCJDb3VudFwiXSxrW2ErXCJDb3VudFwiXSk7Ynx8KGQ9Yyh1W2ZdLHVbXCJfXCIrZl0pLHkoZCl8fChrLnNlcmllcy5sZW5ndGh8fChrW3BdPTApLHVbXCJfXCIrZl09ZD1rW3BdJWgsa1twXSs9MSksZSYmKGI9ZVtkXSkpO3ZvaWQgMCE9PWQmJih0aGlzW2ZdPWQpO3RoaXNbYV09Yn0sZ2V0Q29sb3I6ZnVuY3Rpb24oKXt0aGlzLmNoYXJ0LnN0eWxlZE1vZGU/dGhpcy5nZXRDeWNsaWMoXCJjb2xvclwiKTp0aGlzLm9wdGlvbnMuY29sb3JCeVBvaW50P1xudGhpcy5vcHRpb25zLmNvbG9yPW51bGw6dGhpcy5nZXRDeWNsaWMoXCJjb2xvclwiLHRoaXMub3B0aW9ucy5jb2xvcnx8eFt0aGlzLnR5cGVdLmNvbG9yLHRoaXMuY2hhcnQub3B0aW9ucy5jb2xvcnMpfSxnZXRTeW1ib2w6ZnVuY3Rpb24oKXt0aGlzLmdldEN5Y2xpYyhcInN5bWJvbFwiLHRoaXMub3B0aW9ucy5tYXJrZXIuc3ltYm9sLHRoaXMuY2hhcnQub3B0aW9ucy5zeW1ib2xzKX0sZmluZFBvaW50SW5kZXg6ZnVuY3Rpb24oYSxiKXt2YXIgZD1hLmlkO2E9YS54O3ZhciBjPXRoaXMucG9pbnRzLGUsaztkJiYoaz0oZD10aGlzLmNoYXJ0LmdldChkKSkmJmQuaW5kZXgsdm9pZCAwIT09ayYmKGU9ITApKTt2b2lkIDA9PT1rJiZyKGEpJiYoaz10aGlzLnhEYXRhLmluZGV4T2YoYSxiKSk7LTEhPT1rJiZ2b2lkIDAhPT1rJiZ0aGlzLmNyb3BwZWQmJihrPWs+PXRoaXMuY3JvcFN0YXJ0P2stdGhpcy5jcm9wU3RhcnQ6ayk7IWUmJmNba10mJmNba10udG91Y2hlZCYmKGs9dm9pZCAwKTtyZXR1cm4ga30sXG5kcmF3TGVnZW5kU3ltYm9sOmEuTGVnZW5kU3ltYm9sTWl4aW4uZHJhd0xpbmVNYXJrZXIsdXBkYXRlRGF0YTpmdW5jdGlvbihkKXt2YXIgYj10aGlzLm9wdGlvbnMsYz10aGlzLnBvaW50cyxlPVtdLGYscSxwLGg9dGhpcy5yZXF1aXJlU29ydGluZyxsPWQubGVuZ3RoPT09Yy5sZW5ndGgsZz0hMDt0aGlzLnhJbmNyZW1lbnQ9bnVsbDtkLmZvckVhY2goZnVuY3Rpb24oZCxrKXt2YXIgdSxxPWEuZGVmaW5lZChkKSYmdGhpcy5wb2ludENsYXNzLnByb3RvdHlwZS5vcHRpb25zVG9PYmplY3QuY2FsbCh7c2VyaWVzOnRoaXN9LGQpfHx7fTt1PXEueDtpZihxLmlkfHxyKHUpKWlmKHU9dGhpcy5maW5kUG9pbnRJbmRleChxLHApLC0xPT09dXx8dm9pZCAwPT09dT9lLnB1c2goZCk6Y1t1XSYmZCE9PWIuZGF0YVt1XT8oY1t1XS51cGRhdGUoZCwhMSxudWxsLCExKSxjW3VdLnRvdWNoZWQ9ITAsaCYmKHA9dSsxKSk6Y1t1XSYmKGNbdV0udG91Y2hlZD0hMCksIWx8fGshPT11fHx0aGlzLmhhc0Rlcml2ZWREYXRhKWY9XG4hMH0sdGhpcyk7aWYoZilmb3IoZD1jLmxlbmd0aDtkLS07KShxPWNbZF0pJiYhcS50b3VjaGVkJiZxLnJlbW92ZSghMSk7ZWxzZSBsP2QuZm9yRWFjaChmdW5jdGlvbihhLGQpe2NbZF0udXBkYXRlJiZhIT09Y1tkXS55JiZjW2RdLnVwZGF0ZShhLCExLG51bGwsITEpfSk6Zz0hMTtjLmZvckVhY2goZnVuY3Rpb24oYSl7YSYmKGEudG91Y2hlZD0hMSl9KTtpZighZylyZXR1cm4hMTtlLmZvckVhY2goZnVuY3Rpb24oYSl7dGhpcy5hZGRQb2ludChhLCExLG51bGwsbnVsbCwhMSl9LHRoaXMpO3JldHVybiEwfSxzZXREYXRhOmZ1bmN0aW9uKGQsYix1LGYpe3ZhciBrPXRoaXMscT1rLnBvaW50cyxwPXEmJnEubGVuZ3RofHwwLGwsZz1rLm9wdGlvbnMsdD1rLmNoYXJ0LHc9bnVsbCxEPWsueEF4aXMsbj1nLnR1cmJvVGhyZXNob2xkLG09dGhpcy54RGF0YSxCPXRoaXMueURhdGEsRj0obD1rLnBvaW50QXJyYXlNYXApJiZsLmxlbmd0aCx2PWcua2V5cyx4PTAseT0xLHo7ZD1kfHxbXTtsPWQubGVuZ3RoO1xuYj1jKGIsITApOyExIT09ZiYmbCYmcCYmIWsuY3JvcHBlZCYmIWsuaGFzR3JvdXBlZERhdGEmJmsudmlzaWJsZSYmIWsuaXNTZXJpZXNCb29zdGluZyYmKHo9dGhpcy51cGRhdGVEYXRhKGQpKTtpZigheil7ay54SW5jcmVtZW50PW51bGw7ay5jb2xvckNvdW50ZXI9MDt0aGlzLnBhcmFsbGVsQXJyYXlzLmZvckVhY2goZnVuY3Rpb24oYSl7a1thK1wiRGF0YVwiXS5sZW5ndGg9MH0pO2lmKG4mJmw+bil7Zm9yKHU9MDtudWxsPT09dyYmdTxsOyl3PWRbdV0sdSsrO2lmKHIodykpZm9yKHU9MDt1PGw7dSsrKW1bdV09dGhpcy5hdXRvSW5jcmVtZW50KCksQlt1XT1kW3VdO2Vsc2UgaWYoaCh3KSlpZihGKWZvcih1PTA7dTxsO3UrKyl3PWRbdV0sbVt1XT13WzBdLEJbdV09dy5zbGljZSgxLEYrMSk7ZWxzZSBmb3IodiYmKHg9di5pbmRleE9mKFwieFwiKSx5PXYuaW5kZXhPZihcInlcIikseD0wPD14P3g6MCx5PTA8PXk/eToxKSx1PTA7dTxsO3UrKyl3PWRbdV0sbVt1XT13W3hdLEJbdV09d1t5XTtlbHNlIGEuZXJyb3IoMTIsXG4hMSx0KX1lbHNlIGZvcih1PTA7dTxsO3UrKyl2b2lkIDAhPT1kW3VdJiYodz17c2VyaWVzOmt9LGsucG9pbnRDbGFzcy5wcm90b3R5cGUuYXBwbHlPcHRpb25zLmFwcGx5KHcsW2RbdV1dKSxrLnVwZGF0ZVBhcmFsbGVsQXJyYXlzKHcsdSkpO0ImJmUoQlswXSkmJmEuZXJyb3IoMTQsITAsdCk7ay5kYXRhPVtdO2sub3B0aW9ucy5kYXRhPWsudXNlck9wdGlvbnMuZGF0YT1kO2Zvcih1PXA7dS0tOylxW3VdJiZxW3VdLmRlc3Ryb3kmJnFbdV0uZGVzdHJveSgpO0QmJihELm1pblJhbmdlPUQudXNlck1pblJhbmdlKTtrLmlzRGlydHk9dC5pc0RpcnR5Qm94PSEwO2suaXNEaXJ0eURhdGE9ISFxO3U9ITF9XCJwb2ludFwiPT09Zy5sZWdlbmRUeXBlJiYodGhpcy5wcm9jZXNzRGF0YSgpLHRoaXMuZ2VuZXJhdGVQb2ludHMoKSk7YiYmdC5yZWRyYXcodSl9LHByb2Nlc3NEYXRhOmZ1bmN0aW9uKGQpe3ZhciBiPXRoaXMueERhdGEsYz10aGlzLnlEYXRhLGU9Yi5sZW5ndGgsZjtmPTA7dmFyIHEscCxcbmg9dGhpcy54QXhpcyxsLGc9dGhpcy5vcHRpb25zO2w9Zy5jcm9wVGhyZXNob2xkO3ZhciB0PXRoaXMuZ2V0RXh0cmVtZXNGcm9tQWxsfHxnLmdldEV4dHJlbWVzRnJvbUFsbCxyPXRoaXMuaXNDYXJ0ZXNpYW4sZz1oJiZoLnZhbDJsaW4sdz1oJiZoLmlzTG9nLG49dGhpcy5yZXF1aXJlU29ydGluZyxtLEI7aWYociYmIXRoaXMuaXNEaXJ0eSYmIWguaXNEaXJ0eSYmIXRoaXMueUF4aXMuaXNEaXJ0eSYmIWQpcmV0dXJuITE7aCYmKGQ9aC5nZXRFeHRyZW1lcygpLG09ZC5taW4sQj1kLm1heCk7ciYmdGhpcy5zb3J0ZWQmJiF0JiYoIWx8fGU+bHx8dGhpcy5mb3JjZUNyb3ApJiYoYltlLTFdPG18fGJbMF0+Qj8oYj1bXSxjPVtdKTp0aGlzLnlEYXRhJiYoYlswXTxtfHxiW2UtMV0+QikmJihmPXRoaXMuY3JvcERhdGEodGhpcy54RGF0YSx0aGlzLnlEYXRhLG0sQiksYj1mLnhEYXRhLGM9Zi55RGF0YSxmPWYuc3RhcnQscT0hMCkpO2ZvcihsPWIubGVuZ3RofHwxOy0tbDspZT13P2coYltsXSktXG5nKGJbbC0xXSk6YltsXS1iW2wtMV0sMDxlJiYodm9pZCAwPT09cHx8ZTxwKT9wPWU6MD5lJiZuJiYoYS5lcnJvcigxNSwhMSx0aGlzLmNoYXJ0KSxuPSExKTt0aGlzLmNyb3BwZWQ9cTt0aGlzLmNyb3BTdGFydD1mO3RoaXMucHJvY2Vzc2VkWERhdGE9Yjt0aGlzLnByb2Nlc3NlZFlEYXRhPWM7dGhpcy5jbG9zZXN0UG9pbnRSYW5nZT1wfSxjcm9wRGF0YTpmdW5jdGlvbihhLGIsZSxmLHApe3ZhciBkPWEubGVuZ3RoLGs9MCx1PWQsaDtwPWMocCx0aGlzLmNyb3BTaG91bGRlcik7Zm9yKGg9MDtoPGQ7aCsrKWlmKGFbaF0+PWUpe2s9TWF0aC5tYXgoMCxoLXApO2JyZWFrfWZvcihlPWg7ZTxkO2UrKylpZihhW2VdPmYpe3U9ZStwO2JyZWFrfXJldHVybnt4RGF0YTphLnNsaWNlKGssdSkseURhdGE6Yi5zbGljZShrLHUpLHN0YXJ0OmssZW5kOnV9fSxnZW5lcmF0ZVBvaW50czpmdW5jdGlvbigpe3ZhciBhPXRoaXMub3B0aW9ucyxiPWEuZGF0YSxjPXRoaXMuZGF0YSxlLHA9dGhpcy5wcm9jZXNzZWRYRGF0YSxcbnE9dGhpcy5wcm9jZXNzZWRZRGF0YSxoPXRoaXMucG9pbnRDbGFzcyxsPXAubGVuZ3RoLGc9dGhpcy5jcm9wU3RhcnR8fDAsdCxyPXRoaXMuaGFzR3JvdXBlZERhdGEsYT1hLmtleXMsdyxtPVtdLEI7Y3x8cnx8KGM9W10sYy5sZW5ndGg9Yi5sZW5ndGgsYz10aGlzLmRhdGE9Yyk7YSYmciYmKHRoaXMub3B0aW9ucy5rZXlzPSExKTtmb3IoQj0wO0I8bDtCKyspdD1nK0Iscj8odz0obmV3IGgpLmluaXQodGhpcyxbcFtCXV0uY29uY2F0KEYocVtCXSkpKSx3LmRhdGFHcm91cD10aGlzLmdyb3VwTWFwW0JdLHcuZGF0YUdyb3VwLm9wdGlvbnMmJih3Lm9wdGlvbnM9dy5kYXRhR3JvdXAub3B0aW9ucyxuKHcsdy5kYXRhR3JvdXAub3B0aW9ucyksZGVsZXRlIHcuZGF0YUxhYmVscykpOih3PWNbdF0pfHx2b2lkIDA9PT1iW3RdfHwoY1t0XT13PShuZXcgaCkuaW5pdCh0aGlzLGJbdF0scFtCXSkpLHcmJih3LmluZGV4PXQsbVtCXT13KTt0aGlzLm9wdGlvbnMua2V5cz1hO2lmKGMmJihsIT09KGU9XG5jLmxlbmd0aCl8fHIpKWZvcihCPTA7QjxlO0IrKylCIT09Z3x8cnx8KEIrPWwpLGNbQl0mJihjW0JdLmRlc3Ryb3lFbGVtZW50cygpLGNbQl0ucGxvdFg9dm9pZCAwKTt0aGlzLmRhdGE9Yzt0aGlzLnBvaW50cz1tO2YodGhpcyxcImFmdGVyR2VuZXJhdGVQb2ludHNcIil9LGdldFhFeHRyZW1lczpmdW5jdGlvbihhKXtyZXR1cm57bWluOm0oYSksbWF4OkUoYSl9fSxnZXRFeHRyZW1lczpmdW5jdGlvbihhKXt2YXIgZD10aGlzLnlBeGlzLGI9dGhpcy5wcm9jZXNzZWRYRGF0YSxjLGU9W10scT0wO2M9dGhpcy54QXhpcy5nZXRFeHRyZW1lcygpO3ZhciBwPWMubWluLGw9Yy5tYXgsZyx0LHc9dGhpcy5yZXF1aXJlU29ydGluZz90aGlzLmNyb3BTaG91bGRlcjowLG4sQjthPWF8fHRoaXMuc3RhY2tlZFlEYXRhfHx0aGlzLnByb2Nlc3NlZFlEYXRhfHxbXTtjPWEubGVuZ3RoO2ZvcihCPTA7QjxjO0IrKylpZih0PWJbQl0sbj1hW0JdLGc9KHIobiwhMCl8fGgobikpJiYoIWQucG9zaXRpdmVWYWx1ZXNPbmx5fHxcbm4ubGVuZ3RofHwwPG4pLHQ9dGhpcy5nZXRFeHRyZW1lc0Zyb21BbGx8fHRoaXMub3B0aW9ucy5nZXRFeHRyZW1lc0Zyb21BbGx8fHRoaXMuY3JvcHBlZHx8KGJbQit3XXx8dCk+PXAmJihiW0Itd118fHQpPD1sLGcmJnQpaWYoZz1uLmxlbmd0aClmb3IoO2ctLTspXCJudW1iZXJcIj09PXR5cGVvZiBuW2ddJiYoZVtxKytdPW5bZ10pO2Vsc2UgZVtxKytdPW47dGhpcy5kYXRhTWluPW0oZSk7dGhpcy5kYXRhTWF4PUUoZSk7Zih0aGlzLFwiYWZ0ZXJHZXRFeHRyZW1lc1wiKX0sdHJhbnNsYXRlOmZ1bmN0aW9uKCl7dGhpcy5wcm9jZXNzZWRYRGF0YXx8dGhpcy5wcm9jZXNzRGF0YSgpO3RoaXMuZ2VuZXJhdGVQb2ludHMoKTt2YXIgYT10aGlzLm9wdGlvbnMsYj1hLnN0YWNraW5nLGU9dGhpcy54QXhpcyxwPWUuY2F0ZWdvcmllcyxsPXRoaXMueUF4aXMscT10aGlzLnBvaW50cyx0PXEubGVuZ3RoLHc9ISF0aGlzLm1vZGlmeVZhbHVlLG4sbT10aGlzLnBvaW50UGxhY2VtZW50VG9YVmFsdWUoKSxcbkI9cihtKSxGPWEudGhyZXNob2xkLHY9YS5zdGFydEZyb21UaHJlc2hvbGQ/RjowLHgseixBLEMsRT10aGlzLnpvbmVBeGlzfHxcInlcIixIPU51bWJlci5NQVhfVkFMVUU7Zm9yKG49MDtuPHQ7bisrKXt2YXIgST1xW25dLFU9SS54O3o9SS55O3ZhciBUPUkubG93LFg9YiYmbC5zdGFja3NbKHRoaXMubmVnU3RhY2tzJiZ6PCh2PzA6Rik/XCItXCI6XCJcIikrdGhpcy5zdGFja0tleV0sWSxWO2wucG9zaXRpdmVWYWx1ZXNPbmx5JiZudWxsIT09eiYmMD49eiYmKEkuaXNOdWxsPSEwKTtJLnBsb3RYPXg9ZyhNYXRoLm1pbihNYXRoLm1heCgtMUU1LGUudHJhbnNsYXRlKFUsMCwwLDAsMSxtLFwiZmxhZ3NcIj09PXRoaXMudHlwZSkpLDFFNSkpO2ImJnRoaXMudmlzaWJsZSYmIUkuaXNOdWxsJiZYJiZYW1VdJiYoQz10aGlzLmdldFN0YWNrSW5kaWNhdG9yKEMsVSx0aGlzLmluZGV4KSxZPVhbVV0sVj1ZLnBvaW50c1tDLmtleV0pO2goVikmJihUPVZbMF0sej1WWzFdLFQ9PT12JiZDLmtleT09PVhbVV0uYmFzZSYmXG4oVD1jKHIoRikmJkYsbC5taW4pKSxsLnBvc2l0aXZlVmFsdWVzT25seSYmMD49VCYmKFQ9bnVsbCksSS50b3RhbD1JLnN0YWNrVG90YWw9WS50b3RhbCxJLnBlcmNlbnRhZ2U9WS50b3RhbCYmSS55L1kudG90YWwqMTAwLEkuc3RhY2tZPXosWS5zZXRPZmZzZXQodGhpcy5wb2ludFhPZmZzZXR8fDAsdGhpcy5iYXJXfHwwKSk7SS55Qm90dG9tPXkoVCk/TWF0aC5taW4oTWF0aC5tYXgoLTFFNSxsLnRyYW5zbGF0ZShULDAsMSwwLDEpKSwxRTUpOm51bGw7dyYmKHo9dGhpcy5tb2RpZnlWYWx1ZSh6LEkpKTtJLnBsb3RZPXo9XCJudW1iZXJcIj09PXR5cGVvZiB6JiZJbmZpbml0eSE9PXo/TWF0aC5taW4oTWF0aC5tYXgoLTFFNSxsLnRyYW5zbGF0ZSh6LDAsMSwwLDEpKSwxRTUpOnZvaWQgMDtJLmlzSW5zaWRlPXZvaWQgMCE9PXomJjA8PXomJno8PWwubGVuJiYwPD14JiZ4PD1lLmxlbjtJLmNsaWVudFg9Qj9nKGUudHJhbnNsYXRlKFUsMCwwLDAsMSxtKSk6eDtJLm5lZ2F0aXZlPUlbRV08KGFbRStcblwiVGhyZXNob2xkXCJdfHxGfHwwKTtJLmNhdGVnb3J5PXAmJnZvaWQgMCE9PXBbSS54XT9wW0kueF06SS54O0kuaXNOdWxsfHwodm9pZCAwIT09QSYmKEg9TWF0aC5taW4oSCxNYXRoLmFicyh4LUEpKSksQT14KTtJLnpvbmU9dGhpcy56b25lcy5sZW5ndGgmJkkuZ2V0Wm9uZSgpfXRoaXMuY2xvc2VzdFBvaW50UmFuZ2VQeD1IO2YodGhpcyxcImFmdGVyVHJhbnNsYXRlXCIpfSxnZXRWYWxpZFBvaW50czpmdW5jdGlvbihhLGIsYyl7dmFyIGQ9dGhpcy5jaGFydDtyZXR1cm4oYXx8dGhpcy5wb2ludHN8fFtdKS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGImJiFkLmlzSW5zaWRlUGxvdChhLnBsb3RYLGEucGxvdFksZC5pbnZlcnRlZCk/ITE6Y3x8IWEuaXNOdWxsfSl9LGdldENsaXBCb3g6ZnVuY3Rpb24oYSxiKXt2YXIgZD10aGlzLm9wdGlvbnMsYz10aGlzLmNoYXJ0LGU9Yy5pbnZlcnRlZCxrPXRoaXMueEF4aXMsZj1rJiZ0aGlzLnlBeGlzO2EmJiExPT09ZC5jbGlwJiZmP2E9ZT97eTotYy5jaGFydFdpZHRoK1xuZi5sZW4rZi5wb3MsaGVpZ2h0OmMuY2hhcnRXaWR0aCx3aWR0aDpjLmNoYXJ0SGVpZ2h0LHg6LWMuY2hhcnRIZWlnaHQray5sZW4ray5wb3N9Ont5Oi1mLnBvcyxoZWlnaHQ6Yy5jaGFydEhlaWdodCx3aWR0aDpjLmNoYXJ0V2lkdGgseDotay5wb3N9OihhPXRoaXMuY2xpcEJveHx8Yy5jbGlwQm94LGImJihhLndpZHRoPWMucGxvdFNpemVYLGEueD0wKSk7cmV0dXJuIGI/e3dpZHRoOmEud2lkdGgseDphLnh9OmF9LHNldENsaXA6ZnVuY3Rpb24oYSl7dmFyIGQ9dGhpcy5jaGFydCxiPXRoaXMub3B0aW9ucyxjPWQucmVuZGVyZXIsZT1kLmludmVydGVkLGY9dGhpcy5jbGlwQm94LHA9dGhpcy5nZXRDbGlwQm94KGEpLGg9dGhpcy5zaGFyZWRDbGlwS2V5fHxbXCJfc2hhcmVkQ2xpcFwiLGEmJmEuZHVyYXRpb24sYSYmYS5lYXNpbmcscC5oZWlnaHQsYi54QXhpcyxiLnlBeGlzXS5qb2luKCksbD1kW2hdLGc9ZFtoK1wibVwiXTtsfHwoYSYmKHAud2lkdGg9MCxlJiYocC54PWQucGxvdFNpemVYK1xuKCExIT09Yi5jbGlwPzA6ZC5wbG90VG9wKSksZFtoK1wibVwiXT1nPWMuY2xpcFJlY3QoZT9kLnBsb3RTaXplWCs5OTotOTksZT8tZC5wbG90TGVmdDotZC5wbG90VG9wLDk5LGU/ZC5jaGFydFdpZHRoOmQuY2hhcnRIZWlnaHQpKSxkW2hdPWw9Yy5jbGlwUmVjdChwKSxsLmNvdW50PXtsZW5ndGg6MH0pO2EmJiFsLmNvdW50W3RoaXMuaW5kZXhdJiYobC5jb3VudFt0aGlzLmluZGV4XT0hMCxsLmNvdW50Lmxlbmd0aCs9MSk7aWYoITEhPT1iLmNsaXB8fGEpdGhpcy5ncm91cC5jbGlwKGF8fGY/bDpkLmNsaXBSZWN0KSx0aGlzLm1hcmtlckdyb3VwLmNsaXAoZyksdGhpcy5zaGFyZWRDbGlwS2V5PWg7YXx8KGwuY291bnRbdGhpcy5pbmRleF0mJihkZWxldGUgbC5jb3VudFt0aGlzLmluZGV4XSwtLWwuY291bnQubGVuZ3RoKSwwPT09bC5jb3VudC5sZW5ndGgmJmgmJmRbaF0mJihmfHwoZFtoXT1kW2hdLmRlc3Ryb3koKSksZFtoK1wibVwiXSYmKGRbaCtcIm1cIl09ZFtoK1wibVwiXS5kZXN0cm95KCkpKSl9LFxuYW5pbWF0ZTpmdW5jdGlvbihhKXt2YXIgZD10aGlzLmNoYXJ0LGI9QSh0aGlzLm9wdGlvbnMuYW5pbWF0aW9uKSxjLGU7YT90aGlzLnNldENsaXAoYik6KGM9dGhpcy5zaGFyZWRDbGlwS2V5LGE9ZFtjXSxlPXRoaXMuZ2V0Q2xpcEJveChiLCEwKSxhJiZhLmFuaW1hdGUoZSxiKSxkW2MrXCJtXCJdJiZkW2MrXCJtXCJdLmFuaW1hdGUoe3dpZHRoOmUud2lkdGgrOTkseDplLngtKGQuaW52ZXJ0ZWQ/MDo5OSl9LGIpLHRoaXMuYW5pbWF0ZT1udWxsKX0sYWZ0ZXJBbmltYXRlOmZ1bmN0aW9uKCl7dGhpcy5zZXRDbGlwKCk7Zih0aGlzLFwiYWZ0ZXJBbmltYXRlXCIpO3RoaXMuZmluaXNoZWRBbmltYXRpbmc9ITB9LGRyYXdQb2ludHM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBvaW50cyxiPXRoaXMuY2hhcnQsZSxmLHAscSxoLGw9dGhpcy5vcHRpb25zLm1hcmtlcixnLHQscix3PXRoaXNbdGhpcy5zcGVjaWFsR3JvdXBdfHx0aGlzLm1hcmtlckdyb3VwO2U9dGhpcy54QXhpczt2YXIgbixtPWMobC5lbmFibGVkLFxuIWV8fGUuaXNSYWRpYWw/ITA6bnVsbCx0aGlzLmNsb3Nlc3RQb2ludFJhbmdlUHg+PWwuZW5hYmxlZFRocmVzaG9sZCpsLnJhZGl1cyk7aWYoITEhPT1sLmVuYWJsZWR8fHRoaXMuX2hhc1BvaW50TWFya2Vycylmb3IoZT0wO2U8YS5sZW5ndGg7ZSsrKWlmKGY9YVtlXSxoPShxPWYuZ3JhcGhpYyk/XCJhbmltYXRlXCI6XCJhdHRyXCIsZz1mLm1hcmtlcnx8e30sdD0hIWYubWFya2VyLHA9bSYmdm9pZCAwPT09Zy5lbmFibGVkfHxnLmVuYWJsZWQscj0hMSE9PWYuaXNJbnNpZGUscCYmIWYuaXNOdWxsKXtwPWMoZy5zeW1ib2wsdGhpcy5zeW1ib2wpO249dGhpcy5tYXJrZXJBdHRyaWJzKGYsZi5zZWxlY3RlZCYmXCJzZWxlY3RcIik7cT9xW3I/XCJzaG93XCI6XCJoaWRlXCJdKCEwKS5hbmltYXRlKG4pOnImJigwPG4ud2lkdGh8fGYuaGFzSW1hZ2UpJiYoZi5ncmFwaGljPXE9Yi5yZW5kZXJlci5zeW1ib2wocCxuLngsbi55LG4ud2lkdGgsbi5oZWlnaHQsdD9nOmwpLmFkZCh3KSk7aWYocSYmIWIuc3R5bGVkTW9kZSlxW2hdKHRoaXMucG9pbnRBdHRyaWJzKGYsXG5mLnNlbGVjdGVkJiZcInNlbGVjdFwiKSk7cSYmcS5hZGRDbGFzcyhmLmdldENsYXNzTmFtZSgpLCEwKX1lbHNlIHEmJihmLmdyYXBoaWM9cS5kZXN0cm95KCkpfSxtYXJrZXJBdHRyaWJzOmZ1bmN0aW9uKGEsYil7dmFyIGQ9dGhpcy5vcHRpb25zLm1hcmtlcixlPWEubWFya2VyfHx7fSxrPWUuc3ltYm9sfHxkLnN5bWJvbCxmPWMoZS5yYWRpdXMsZC5yYWRpdXMpO2ImJihkPWQuc3RhdGVzW2JdLGI9ZS5zdGF0ZXMmJmUuc3RhdGVzW2JdLGY9YyhiJiZiLnJhZGl1cyxkJiZkLnJhZGl1cyxmKyhkJiZkLnJhZGl1c1BsdXN8fDApKSk7YS5oYXNJbWFnZT1rJiYwPT09ay5pbmRleE9mKFwidXJsXCIpO2EuaGFzSW1hZ2UmJihmPTApO2E9e3g6TWF0aC5mbG9vcihhLnBsb3RYKS1mLHk6YS5wbG90WS1mfTtmJiYoYS53aWR0aD1hLmhlaWdodD0yKmYpO3JldHVybiBhfSxwb2ludEF0dHJpYnM6ZnVuY3Rpb24oYSxiKXt2YXIgZD10aGlzLm9wdGlvbnMubWFya2VyLGU9YSYmYS5vcHRpb25zLGs9ZSYmXG5lLm1hcmtlcnx8e30sZj10aGlzLmNvbG9yLHA9ZSYmZS5jb2xvcixoPWEmJmEuY29sb3IsZT1jKGsubGluZVdpZHRoLGQubGluZVdpZHRoKSxsPWEmJmEuem9uZSYmYS56b25lLmNvbG9yO2E9MTtmPXB8fGx8fGh8fGY7cD1rLmZpbGxDb2xvcnx8ZC5maWxsQ29sb3J8fGY7Zj1rLmxpbmVDb2xvcnx8ZC5saW5lQ29sb3J8fGY7Yj1ifHxcIm5vcm1hbFwiO2Q9ZC5zdGF0ZXNbYl07Yj1rLnN0YXRlcyYmay5zdGF0ZXNbYl18fHt9O2U9YyhiLmxpbmVXaWR0aCxkLmxpbmVXaWR0aCxlK2MoYi5saW5lV2lkdGhQbHVzLGQubGluZVdpZHRoUGx1cywwKSk7cD1iLmZpbGxDb2xvcnx8ZC5maWxsQ29sb3J8fHA7Zj1iLmxpbmVDb2xvcnx8ZC5saW5lQ29sb3J8fGY7YT1jKGIub3BhY2l0eSxkLm9wYWNpdHksYSk7cmV0dXJue3N0cm9rZTpmLFwic3Ryb2tlLXdpZHRoXCI6ZSxmaWxsOnAsb3BhY2l0eTphfX0sZGVzdHJveTpmdW5jdGlvbihkKXt2YXIgYj10aGlzLGM9Yi5jaGFydCxlPS9BcHBsZVdlYktpdFxcLzUzMy8udGVzdChwLm5hdmlnYXRvci51c2VyQWdlbnQpLFxuaCxxLGc9Yi5kYXRhfHxbXSxyLG47ZihiLFwiZGVzdHJveVwiKTtkfHx0KGIpOyhiLmF4aXNUeXBlc3x8W10pLmZvckVhY2goZnVuY3Rpb24oYSl7KG49YlthXSkmJm4uc2VyaWVzJiYoeihuLnNlcmllcyxiKSxuLmlzRGlydHk9bi5mb3JjZVJlZHJhdz0hMCl9KTtiLmxlZ2VuZEl0ZW0mJmIuY2hhcnQubGVnZW5kLmRlc3Ryb3lJdGVtKGIpO2ZvcihxPWcubGVuZ3RoO3EtLTspKHI9Z1txXSkmJnIuZGVzdHJveSYmci5kZXN0cm95KCk7Yi5wb2ludHM9bnVsbDthLmNsZWFyVGltZW91dChiLmFuaW1hdGlvblRpbWVvdXQpO2woYixmdW5jdGlvbihhLGQpe2EgaW5zdGFuY2VvZiB3JiYhYS5zdXJ2aXZlJiYoaD1lJiZcImdyb3VwXCI9PT1kP1wiaGlkZVwiOlwiZGVzdHJveVwiLGFbaF0oKSl9KTtjLmhvdmVyU2VyaWVzPT09YiYmKGMuaG92ZXJTZXJpZXM9bnVsbCk7eihjLnNlcmllcyxiKTtjLm9yZGVyU2VyaWVzKCk7bChiLGZ1bmN0aW9uKGEsYyl7ZCYmXCJoY0V2ZW50c1wiPT09Y3x8ZGVsZXRlIGJbY119KX0sXG5nZXRHcmFwaFBhdGg6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXRoaXMsZT1kLm9wdGlvbnMsaz1lLnN0ZXAsZixwPVtdLGg9W10sdTthPWF8fGQucG9pbnRzOyhmPWEucmV2ZXJzZWQpJiZhLnJldmVyc2UoKTsoaz17cmlnaHQ6MSxjZW50ZXI6Mn1ba118fGsmJjMpJiZmJiYoaz00LWspOyFlLmNvbm5lY3ROdWxsc3x8Ynx8Y3x8KGE9dGhpcy5nZXRWYWxpZFBvaW50cyhhKSk7YS5mb3JFYWNoKGZ1bmN0aW9uKGYscSl7dmFyIGw9Zi5wbG90WCxnPWYucGxvdFksdD1hW3EtMV07KGYubGVmdENsaWZmfHx0JiZ0LnJpZ2h0Q2xpZmYpJiYhYyYmKHU9ITApO2YuaXNOdWxsJiYheShiKSYmMDxxP3U9IWUuY29ubmVjdE51bGxzOmYuaXNOdWxsJiYhYj91PSEwOigwPT09cXx8dT9xPVtcIk1cIixmLnBsb3RYLGYucGxvdFldOmQuZ2V0UG9pbnRTcGxpbmU/cT1kLmdldFBvaW50U3BsaW5lKGEsZixxKTprPyhxPTE9PT1rP1tcIkxcIix0LnBsb3RYLGddOjI9PT1rP1tcIkxcIiwodC5wbG90WCtsKS8yLHQucGxvdFksXG5cIkxcIiwodC5wbG90WCtsKS8yLGddOltcIkxcIixsLHQucGxvdFldLHEucHVzaChcIkxcIixsLGcpKTpxPVtcIkxcIixsLGddLGgucHVzaChmLngpLGsmJihoLnB1c2goZi54KSwyPT09ayYmaC5wdXNoKGYueCkpLHAucHVzaC5hcHBseShwLHEpLHU9ITEpfSk7cC54TWFwPWg7cmV0dXJuIGQuZ3JhcGhQYXRoPXB9LGRyYXdHcmFwaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMsYj10aGlzLm9wdGlvbnMsYz0odGhpcy5nYXBwZWRQYXRofHx0aGlzLmdldEdyYXBoUGF0aCkuY2FsbCh0aGlzKSxlPXRoaXMuY2hhcnQuc3R5bGVkTW9kZSxmPVtbXCJncmFwaFwiLFwiaGlnaGNoYXJ0cy1ncmFwaFwiXV07ZXx8ZlswXS5wdXNoKGIubGluZUNvbG9yfHx0aGlzLmNvbG9yfHxcIiNjY2NjY2NcIixiLmRhc2hTdHlsZSk7Zj1hLmdldFpvbmVzR3JhcGhzKGYpO2YuZm9yRWFjaChmdW5jdGlvbihkLGspe3ZhciBmPWRbMF0scD1hW2ZdLGg9cD9cImFuaW1hdGVcIjpcImF0dHJcIjtwPyhwLmVuZFg9YS5wcmV2ZW50R3JhcGhBbmltYXRpb24/XG5udWxsOmMueE1hcCxwLmFuaW1hdGUoe2Q6Y30pKTpjLmxlbmd0aCYmKGFbZl09cD1hLmNoYXJ0LnJlbmRlcmVyLnBhdGgoYykuYWRkQ2xhc3MoZFsxXSkuYXR0cih7ekluZGV4OjF9KS5hZGQoYS5ncm91cCkpO3AmJiFlJiYoZj17c3Ryb2tlOmRbMl0sXCJzdHJva2Utd2lkdGhcIjpiLmxpbmVXaWR0aCxmaWxsOmEuZmlsbEdyYXBoJiZhLmNvbG9yfHxcIm5vbmVcIn0sZFszXT9mLmRhc2hzdHlsZT1kWzNdOlwic3F1YXJlXCIhPT1iLmxpbmVjYXAmJihmW1wic3Ryb2tlLWxpbmVjYXBcIl09ZltcInN0cm9rZS1saW5lam9pblwiXT1cInJvdW5kXCIpLHBbaF0oZikuc2hhZG93KDI+ayYmYi5zaGFkb3cpKTtwJiYocC5zdGFydFg9Yy54TWFwLHAuaXNBcmVhPWMuaXNBcmVhKX0pfSxnZXRab25lc0dyYXBoczpmdW5jdGlvbihhKXt0aGlzLnpvbmVzLmZvckVhY2goZnVuY3Rpb24oZCxiKXtiPVtcInpvbmUtZ3JhcGgtXCIrYixcImhpZ2hjaGFydHMtZ3JhcGggaGlnaGNoYXJ0cy16b25lLWdyYXBoLVwiK2IrXCIgXCIrKGQuY2xhc3NOYW1lfHxcblwiXCIpXTt0aGlzLmNoYXJ0LnN0eWxlZE1vZGV8fGIucHVzaChkLmNvbG9yfHx0aGlzLmNvbG9yLGQuZGFzaFN0eWxlfHx0aGlzLm9wdGlvbnMuZGFzaFN0eWxlKTthLnB1c2goYil9LHRoaXMpO3JldHVybiBhfSxhcHBseVpvbmVzOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcyxiPXRoaXMuY2hhcnQsZT1iLnJlbmRlcmVyLGY9dGhpcy56b25lcyxwLGgsbD10aGlzLmNsaXBzfHxbXSxnLHQ9dGhpcy5ncmFwaCxyPXRoaXMuYXJlYSx3PU1hdGgubWF4KGIuY2hhcnRXaWR0aCxiLmNoYXJ0SGVpZ2h0KSxuPXRoaXNbKHRoaXMuem9uZUF4aXN8fFwieVwiKStcIkF4aXNcIl0sbSxCLEY9Yi5pbnZlcnRlZCx2LHgseSx6LEE9ITE7Zi5sZW5ndGgmJih0fHxyKSYmbiYmdm9pZCAwIT09bi5taW4/KEI9bi5yZXZlcnNlZCx2PW4uaG9yaXosdCYmIXRoaXMuc2hvd0xpbmUmJnQuaGlkZSgpLHImJnIuaGlkZSgpLG09bi5nZXRFeHRyZW1lcygpLGYuZm9yRWFjaChmdW5jdGlvbihkLGspe3A9Qj92P2IucGxvdFdpZHRoOlxuMDp2PzA6bi50b1BpeGVscyhtLm1pbil8fDA7cD1NYXRoLm1pbihNYXRoLm1heChjKGgscCksMCksdyk7aD1NYXRoLm1pbihNYXRoLm1heChNYXRoLnJvdW5kKG4udG9QaXhlbHMoYyhkLnZhbHVlLG0ubWF4KSwhMCl8fDApLDApLHcpO0EmJihwPWg9bi50b1BpeGVscyhtLm1heCkpO3g9TWF0aC5hYnMocC1oKTt5PU1hdGgubWluKHAsaCk7ej1NYXRoLm1heChwLGgpO24uaXNYQXhpcz8oZz17eDpGP3o6eSx5OjAsd2lkdGg6eCxoZWlnaHQ6d30sdnx8KGcueD1iLnBsb3RIZWlnaHQtZy54KSk6KGc9e3g6MCx5OkY/ejp5LHdpZHRoOncsaGVpZ2h0Onh9LHYmJihnLnk9Yi5wbG90V2lkdGgtZy55KSk7RiYmZS5pc1ZNTCYmKGc9bi5pc1hBeGlzP3t4OjAseTpCP3k6eixoZWlnaHQ6Zy53aWR0aCx3aWR0aDpiLmNoYXJ0V2lkdGh9Ont4OmcueS1iLnBsb3RMZWZ0LWIuc3BhY2luZ0JveC54LHk6MCx3aWR0aDpnLmhlaWdodCxoZWlnaHQ6Yi5jaGFydEhlaWdodH0pO2xba10/bFtrXS5hbmltYXRlKGcpOlxubFtrXT1lLmNsaXBSZWN0KGcpO3QmJmFbXCJ6b25lLWdyYXBoLVwiK2tdLmNsaXAobFtrXSk7ciYmYVtcInpvbmUtYXJlYS1cIitrXS5jbGlwKGxba10pO0E9ZC52YWx1ZT5tLm1heDthLnJlc2V0Wm9uZXMmJjA9PT1oJiYoaD12b2lkIDApfSksdGhpcy5jbGlwcz1sKTphLnZpc2libGUmJih0JiZ0LnNob3coITApLHImJnIuc2hvdyghMCkpfSxpbnZlcnRHcm91cHM6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gZCgpe1tcImdyb3VwXCIsXCJtYXJrZXJHcm91cFwiXS5mb3JFYWNoKGZ1bmN0aW9uKGQpe2JbZF0mJihjLnJlbmRlcmVyLmlzVk1MJiZiW2RdLmF0dHIoe3dpZHRoOmIueUF4aXMubGVuLGhlaWdodDpiLnhBeGlzLmxlbn0pLGJbZF0ud2lkdGg9Yi55QXhpcy5sZW4sYltkXS5oZWlnaHQ9Yi54QXhpcy5sZW4sYltkXS5pbnZlcnQoYSkpfSl9dmFyIGI9dGhpcyxjPWIuY2hhcnQsZTtiLnhBeGlzJiYoZT1DKGMsXCJyZXNpemVcIixkKSxDKGIsXCJkZXN0cm95XCIsZSksZChhKSxiLmludmVydEdyb3Vwcz1kKX0sXG5wbG90R3JvdXA6ZnVuY3Rpb24oYSxiLGMsZSxmKXt2YXIgZD10aGlzW2FdLGs9IWQ7ayYmKHRoaXNbYV09ZD10aGlzLmNoYXJ0LnJlbmRlcmVyLmcoKS5hdHRyKHt6SW5kZXg6ZXx8LjF9KS5hZGQoZikpO2QuYWRkQ2xhc3MoXCJoaWdoY2hhcnRzLVwiK2IrXCIgaGlnaGNoYXJ0cy1zZXJpZXMtXCIrdGhpcy5pbmRleCtcIiBoaWdoY2hhcnRzLVwiK3RoaXMudHlwZStcIi1zZXJpZXMgXCIrKHkodGhpcy5jb2xvckluZGV4KT9cImhpZ2hjaGFydHMtY29sb3ItXCIrdGhpcy5jb2xvckluZGV4K1wiIFwiOlwiXCIpKyh0aGlzLm9wdGlvbnMuY2xhc3NOYW1lfHxcIlwiKSsoZC5oYXNDbGFzcyhcImhpZ2hjaGFydHMtdHJhY2tlclwiKT9cIiBoaWdoY2hhcnRzLXRyYWNrZXJcIjpcIlwiKSwhMCk7ZC5hdHRyKHt2aXNpYmlsaXR5OmN9KVtrP1wiYXR0clwiOlwiYW5pbWF0ZVwiXSh0aGlzLmdldFBsb3RCb3goKSk7cmV0dXJuIGR9LGdldFBsb3RCb3g6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmNoYXJ0LGI9dGhpcy54QXhpcyxjPXRoaXMueUF4aXM7XG5hLmludmVydGVkJiYoYj1jLGM9dGhpcy54QXhpcyk7cmV0dXJue3RyYW5zbGF0ZVg6Yj9iLmxlZnQ6YS5wbG90TGVmdCx0cmFuc2xhdGVZOmM/Yy50b3A6YS5wbG90VG9wLHNjYWxlWDoxLHNjYWxlWToxfX0scmVuZGVyOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcyxiPWEuY2hhcnQsYyxlPWEub3B0aW9ucyxwPSEhYS5hbmltYXRlJiZiLnJlbmRlcmVyLmlzU1ZHJiZBKGUuYW5pbWF0aW9uKS5kdXJhdGlvbixoPWEudmlzaWJsZT9cImluaGVyaXRcIjpcImhpZGRlblwiLGw9ZS56SW5kZXgsZz1hLmhhc1JlbmRlcmVkLHQ9Yi5zZXJpZXNHcm91cCxyPWIuaW52ZXJ0ZWQ7Zih0aGlzLFwicmVuZGVyXCIpO2M9YS5wbG90R3JvdXAoXCJncm91cFwiLFwic2VyaWVzXCIsaCxsLHQpO2EubWFya2VyR3JvdXA9YS5wbG90R3JvdXAoXCJtYXJrZXJHcm91cFwiLFwibWFya2Vyc1wiLGgsbCx0KTtwJiZhLmFuaW1hdGUoITApO2MuaW52ZXJ0ZWQ9YS5pc0NhcnRlc2lhbnx8YS5pbnZlcnRhYmxlP3I6ITE7YS5kcmF3R3JhcGgmJlxuKGEuZHJhd0dyYXBoKCksYS5hcHBseVpvbmVzKCkpO2EudmlzaWJsZSYmYS5kcmF3UG9pbnRzKCk7YS5kcmF3RGF0YUxhYmVscyYmYS5kcmF3RGF0YUxhYmVscygpO2EucmVkcmF3UG9pbnRzJiZhLnJlZHJhd1BvaW50cygpO2EuZHJhd1RyYWNrZXImJiExIT09YS5vcHRpb25zLmVuYWJsZU1vdXNlVHJhY2tpbmcmJmEuZHJhd1RyYWNrZXIoKTthLmludmVydEdyb3VwcyhyKTshMT09PWUuY2xpcHx8YS5zaGFyZWRDbGlwS2V5fHxnfHxjLmNsaXAoYi5jbGlwUmVjdCk7cCYmYS5hbmltYXRlKCk7Z3x8KGEuYW5pbWF0aW9uVGltZW91dD1CKGZ1bmN0aW9uKCl7YS5hZnRlckFuaW1hdGUoKX0scCkpO2EuaXNEaXJ0eT0hMTthLmhhc1JlbmRlcmVkPSEwO2YoYSxcImFmdGVyUmVuZGVyXCIpfSxyZWRyYXc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmNoYXJ0LGI9dGhpcy5pc0RpcnR5fHx0aGlzLmlzRGlydHlEYXRhLGU9dGhpcy5ncm91cCxmPXRoaXMueEF4aXMscD10aGlzLnlBeGlzO2UmJihhLmludmVydGVkJiZcbmUuYXR0cih7d2lkdGg6YS5wbG90V2lkdGgsaGVpZ2h0OmEucGxvdEhlaWdodH0pLGUuYW5pbWF0ZSh7dHJhbnNsYXRlWDpjKGYmJmYubGVmdCxhLnBsb3RMZWZ0KSx0cmFuc2xhdGVZOmMocCYmcC50b3AsYS5wbG90VG9wKX0pKTt0aGlzLnRyYW5zbGF0ZSgpO3RoaXMucmVuZGVyKCk7YiYmZGVsZXRlIHRoaXMua2RUcmVlfSxrZEF4aXNBcnJheTpbXCJjbGllbnRYXCIsXCJwbG90WVwiXSxzZWFyY2hQb2ludDpmdW5jdGlvbihhLGIpe3ZhciBkPXRoaXMueEF4aXMsYz10aGlzLnlBeGlzLGU9dGhpcy5jaGFydC5pbnZlcnRlZDtyZXR1cm4gdGhpcy5zZWFyY2hLRFRyZWUoe2NsaWVudFg6ZT9kLmxlbi1hLmNoYXJ0WStkLnBvczphLmNoYXJ0WC1kLnBvcyxwbG90WTplP2MubGVuLWEuY2hhcnRYK2MucG9zOmEuY2hhcnRZLWMucG9zfSxiLGEpfSxidWlsZEtEVHJlZTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYyxlKXt2YXIgayxmO2lmKGY9YSYmYS5sZW5ndGgpcmV0dXJuIGs9ZC5rZEF4aXNBcnJheVtjJVxuZV0sYS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGFba10tYltrXX0pLGY9TWF0aC5mbG9vcihmLzIpLHtwb2ludDphW2ZdLGxlZnQ6YihhLnNsaWNlKDAsZiksYysxLGUpLHJpZ2h0OmIoYS5zbGljZShmKzEpLGMrMSxlKX19dGhpcy5idWlsZGluZ0tkVHJlZT0hMDt2YXIgZD10aGlzLGM9LTE8ZC5vcHRpb25zLmZpbmROZWFyZXN0UG9pbnRCeS5pbmRleE9mKFwieVwiKT8yOjE7ZGVsZXRlIGQua2RUcmVlO0IoZnVuY3Rpb24oKXtkLmtkVHJlZT1iKGQuZ2V0VmFsaWRQb2ludHMobnVsbCwhZC5kaXJlY3RUb3VjaCksYyxjKTtkLmJ1aWxkaW5nS2RUcmVlPSExfSxkLm9wdGlvbnMua2ROb3d8fGEmJlwidG91Y2hzdGFydFwiPT09YS50eXBlPzA6MSl9LHNlYXJjaEtEVHJlZTpmdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZChhLGIsYyxoKXt2YXIgbD1iLnBvaW50LHE9ZS5rZEF4aXNBcnJheVtjJWhdLHUsZyx0PWw7Zz15KGFba10pJiZ5KGxba10pP01hdGgucG93KGFba10tbFtrXSwyKTpudWxsO1xudT15KGFbZl0pJiZ5KGxbZl0pP01hdGgucG93KGFbZl0tbFtmXSwyKTpudWxsO3U9KGd8fDApKyh1fHwwKTtsLmRpc3Q9eSh1KT9NYXRoLnNxcnQodSk6TnVtYmVyLk1BWF9WQUxVRTtsLmRpc3RYPXkoZyk/TWF0aC5zcXJ0KGcpOk51bWJlci5NQVhfVkFMVUU7cT1hW3FdLWxbcV07dT0wPnE/XCJsZWZ0XCI6XCJyaWdodFwiO2c9MD5xP1wicmlnaHRcIjpcImxlZnRcIjtiW3VdJiYodT1kKGEsYlt1XSxjKzEsaCksdD11W3BdPHRbcF0/dTpsKTtiW2ddJiZNYXRoLnNxcnQocSpxKTx0W3BdJiYoYT1kKGEsYltnXSxjKzEsaCksdD1hW3BdPHRbcF0/YTp0KTtyZXR1cm4gdH12YXIgZT10aGlzLGs9dGhpcy5rZEF4aXNBcnJheVswXSxmPXRoaXMua2RBeGlzQXJyYXlbMV0scD1iP1wiZGlzdFhcIjpcImRpc3RcIjtiPS0xPGUub3B0aW9ucy5maW5kTmVhcmVzdFBvaW50QnkuaW5kZXhPZihcInlcIik/MjoxO3RoaXMua2RUcmVlfHx0aGlzLmJ1aWxkaW5nS2RUcmVlfHx0aGlzLmJ1aWxkS0RUcmVlKGMpO2lmKHRoaXMua2RUcmVlKXJldHVybiBkKGEsXG50aGlzLmtkVHJlZSxiLGIpfSxwb2ludFBsYWNlbWVudFRvWFZhbHVlOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5vcHRpb25zLnBvaW50UGxhY2VtZW50O1wiYmV0d2VlblwiPT09YSYmKGE9LjUpO3IoYSkmJihhKj1jKHRoaXMub3B0aW9ucy5wb2ludFJhbmdlfHx0aGlzLnhBeGlzLnBvaW50UmFuZ2UpKTtyZXR1cm4gYX19KX0pO0koSCxcInBhcnRzL1N0YWNraW5nLmpzXCIsW0hbXCJwYXJ0cy9HbG9iYWxzLmpzXCJdXSxmdW5jdGlvbihhKXt2YXIgQz1hLkF4aXMsQT1hLkNoYXJ0LEU9YS5jb3JyZWN0RmxvYXQsbT1hLmRlZmluZWQsZz1hLmRlc3Ryb3lPYmplY3RQcm9wZXJ0aWVzLHY9YS5mb3JtYXQseD1hLm9iamVjdEVhY2gseT1hLnBpY2ssej1hLlNlcmllczthLlN0YWNrSXRlbT1mdW5jdGlvbihhLGYsaCxnLGUpe3ZhciBiPWEuY2hhcnQuaW52ZXJ0ZWQ7dGhpcy5heGlzPWE7dGhpcy5pc05lZ2F0aXZlPWg7dGhpcy5vcHRpb25zPWY7dGhpcy54PWc7dGhpcy50b3RhbD1udWxsO3RoaXMucG9pbnRzPVxue307dGhpcy5zdGFjaz1lO3RoaXMucmlnaHRDbGlmZj10aGlzLmxlZnRDbGlmZj0wO3RoaXMuYWxpZ25PcHRpb25zPXthbGlnbjpmLmFsaWdufHwoYj9oP1wibGVmdFwiOlwicmlnaHRcIjpcImNlbnRlclwiKSx2ZXJ0aWNhbEFsaWduOmYudmVydGljYWxBbGlnbnx8KGI/XCJtaWRkbGVcIjpoP1wiYm90dG9tXCI6XCJ0b3BcIikseTp5KGYueSxiPzQ6aD8xNDotNikseDp5KGYueCxiP2g/LTY6NjowKX07dGhpcy50ZXh0QWxpZ249Zi50ZXh0QWxpZ258fChiP2g/XCJyaWdodFwiOlwibGVmdFwiOlwiY2VudGVyXCIpfTthLlN0YWNrSXRlbS5wcm90b3R5cGU9e2Rlc3Ryb3k6ZnVuY3Rpb24oKXtnKHRoaXMsdGhpcy5heGlzKX0scmVuZGVyOmZ1bmN0aW9uKGEpe3ZhciBmPXRoaXMuYXhpcy5jaGFydCxoPXRoaXMub3B0aW9ucyxnPWguZm9ybWF0LGc9Zz92KGcsdGhpcyxmLnRpbWUpOmguZm9ybWF0dGVyLmNhbGwodGhpcyk7dGhpcy5sYWJlbD90aGlzLmxhYmVsLmF0dHIoe3RleHQ6Zyx2aXNpYmlsaXR5OlwiaGlkZGVuXCJ9KTpcbnRoaXMubGFiZWw9Zi5yZW5kZXJlci50ZXh0KGcsbnVsbCxudWxsLGgudXNlSFRNTCkuY3NzKGguc3R5bGUpLmF0dHIoe2FsaWduOnRoaXMudGV4dEFsaWduLHJvdGF0aW9uOmgucm90YXRpb24sdmlzaWJpbGl0eTpcImhpZGRlblwifSkuYWRkKGEpO3RoaXMubGFiZWwubGFiZWxyYW5rPWYucGxvdEhlaWdodH0sc2V0T2Zmc2V0OmZ1bmN0aW9uKGEsZixoLGcpe3ZhciBlPXRoaXMuYXhpcyxiPWUuY2hhcnQ7Zz1lLnRyYW5zbGF0ZShlLnVzZVBlcmNlbnRhZ2U/MTAwOmc/Zzp0aGlzLnRvdGFsLDAsMCwwLDEpO2g9ZS50cmFuc2xhdGUoaD9oOjApO2g9bShnKSYmTWF0aC5hYnMoZy1oKTthPWIueEF4aXNbMF0udHJhbnNsYXRlKHRoaXMueCkrYTtlPW0oZykmJnRoaXMuZ2V0U3RhY2tCb3goYix0aGlzLGEsZyxmLGgsZSk7KGY9dGhpcy5sYWJlbCkmJmUmJihmLmFsaWduKHRoaXMuYWxpZ25PcHRpb25zLG51bGwsZSksZT1mLmFsaWduQXR0cixmWyExPT09dGhpcy5vcHRpb25zLmNyb3B8fGIuaXNJbnNpZGVQbG90KGUueCxcbmUueSk/XCJzaG93XCI6XCJoaWRlXCJdKCEwKSl9LGdldFN0YWNrQm94OmZ1bmN0aW9uKGEsZixoLGcsZSxiLGwpe3ZhciBjPWYuYXhpcy5yZXZlcnNlZCx0PWEuaW52ZXJ0ZWQ7YT1sLmhlaWdodCtsLnBvcy0odD9hLnBsb3RMZWZ0OmEucGxvdFRvcCk7Zj1mLmlzTmVnYXRpdmUmJiFjfHwhZi5pc05lZ2F0aXZlJiZjO3JldHVybnt4OnQ/Zj9nOmctYjpoLHk6dD9hLWgtZTpmP2EtZy1iOmEtZyx3aWR0aDp0P2I6ZSxoZWlnaHQ6dD9lOmJ9fX07QS5wcm90b3R5cGUuZ2V0U3RhY2tzPWZ1bmN0aW9uKCl7dmFyIGE9dGhpczthLnlBeGlzLmZvckVhY2goZnVuY3Rpb24oYSl7YS5zdGFja3MmJmEuaGFzVmlzaWJsZVNlcmllcyYmKGEub2xkU3RhY2tzPWEuc3RhY2tzKX0pO2Euc2VyaWVzLmZvckVhY2goZnVuY3Rpb24oZil7IWYub3B0aW9ucy5zdGFja2luZ3x8ITAhPT1mLnZpc2libGUmJiExIT09YS5vcHRpb25zLmNoYXJ0Lmlnbm9yZUhpZGRlblNlcmllc3x8KGYuc3RhY2tLZXk9Zi50eXBlK3koZi5vcHRpb25zLnN0YWNrLFxuXCJcIikpfSl9O0MucHJvdG90eXBlLmJ1aWxkU3RhY2tzPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5zZXJpZXMsZj15KHRoaXMub3B0aW9ucy5yZXZlcnNlZFN0YWNrcywhMCksaD1hLmxlbmd0aCxnO2lmKCF0aGlzLmlzWEF4aXMpe3RoaXMudXNlUGVyY2VudGFnZT0hMTtmb3IoZz1oO2ctLTspYVtmP2c6aC1nLTFdLnNldFN0YWNrZWRQb2ludHMoKTtmb3IoZz0wO2c8aDtnKyspYVtnXS5tb2RpZnlTdGFja3MoKX19O0MucHJvdG90eXBlLnJlbmRlclN0YWNrVG90YWxzPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5jaGFydCxmPWEucmVuZGVyZXIsaD10aGlzLnN0YWNrcyxnPXRoaXMuc3RhY2tUb3RhbEdyb3VwO2d8fCh0aGlzLnN0YWNrVG90YWxHcm91cD1nPWYuZyhcInN0YWNrLWxhYmVsc1wiKS5hdHRyKHt2aXNpYmlsaXR5OlwidmlzaWJsZVwiLHpJbmRleDo2fSkuYWRkKCkpO2cudHJhbnNsYXRlKGEucGxvdExlZnQsYS5wbG90VG9wKTt4KGgsZnVuY3Rpb24oYSl7eChhLGZ1bmN0aW9uKGEpe2EucmVuZGVyKGcpfSl9KX07XG5DLnByb3RvdHlwZS5yZXNldFN0YWNrcz1mdW5jdGlvbigpe3ZhciBhPXRoaXMsZj1hLnN0YWNrczthLmlzWEF4aXN8fHgoZixmdW5jdGlvbihmKXt4KGYsZnVuY3Rpb24oaCxlKXtoLnRvdWNoZWQ8YS5zdGFja3NUb3VjaGVkPyhoLmRlc3Ryb3koKSxkZWxldGUgZltlXSk6KGgudG90YWw9bnVsbCxoLmN1bXVsYXRpdmU9bnVsbCl9KX0pfTtDLnByb3RvdHlwZS5jbGVhblN0YWNrcz1mdW5jdGlvbigpe3ZhciBhO3RoaXMuaXNYQXhpc3x8KHRoaXMub2xkU3RhY2tzJiYoYT10aGlzLnN0YWNrcz10aGlzLm9sZFN0YWNrcykseChhLGZ1bmN0aW9uKGEpe3goYSxmdW5jdGlvbihhKXthLmN1bXVsYXRpdmU9YS50b3RhbH0pfSkpfTt6LnByb3RvdHlwZS5zZXRTdGFja2VkUG9pbnRzPWZ1bmN0aW9uKCl7aWYodGhpcy5vcHRpb25zLnN0YWNraW5nJiYoITA9PT10aGlzLnZpc2libGV8fCExPT09dGhpcy5jaGFydC5vcHRpb25zLmNoYXJ0Lmlnbm9yZUhpZGRlblNlcmllcykpe3ZhciBnPXRoaXMucHJvY2Vzc2VkWERhdGEsXG5mPXRoaXMucHJvY2Vzc2VkWURhdGEsaD1bXSxyPWYubGVuZ3RoLGU9dGhpcy5vcHRpb25zLGI9ZS50aHJlc2hvbGQsbD15KGUuc3RhcnRGcm9tVGhyZXNob2xkJiZiLDApLGM9ZS5zdGFjayxlPWUuc3RhY2tpbmcsdD10aGlzLnN0YWNrS2V5LEY9XCItXCIrdCx3PXRoaXMubmVnU3RhY2tzLEI9dGhpcy55QXhpcyxwPUIuc3RhY2tzLGQ9Qi5vbGRTdGFja3Msayx1LEQsRyxxLHYseDtCLnN0YWNrc1RvdWNoZWQrPTE7Zm9yKHE9MDtxPHI7cSsrKXY9Z1txXSx4PWZbcV0saz10aGlzLmdldFN0YWNrSW5kaWNhdG9yKGssdix0aGlzLmluZGV4KSxHPWsua2V5LEQ9KHU9dyYmeDwobD8wOmIpKT9GOnQscFtEXXx8KHBbRF09e30pLHBbRF1bdl18fChkW0RdJiZkW0RdW3ZdPyhwW0RdW3ZdPWRbRF1bdl0scFtEXVt2XS50b3RhbD1udWxsKTpwW0RdW3ZdPW5ldyBhLlN0YWNrSXRlbShCLEIub3B0aW9ucy5zdGFja0xhYmVscyx1LHYsYykpLEQ9cFtEXVt2XSxudWxsIT09eD8oRC5wb2ludHNbR109RC5wb2ludHNbdGhpcy5pbmRleF09XG5beShELmN1bXVsYXRpdmUsbCldLG0oRC5jdW11bGF0aXZlKXx8KEQuYmFzZT1HKSxELnRvdWNoZWQ9Qi5zdGFja3NUb3VjaGVkLDA8ay5pbmRleCYmITE9PT10aGlzLnNpbmdsZVN0YWNrcyYmKEQucG9pbnRzW0ddWzBdPUQucG9pbnRzW3RoaXMuaW5kZXgrXCIsXCIrditcIiwwXCJdWzBdKSk6RC5wb2ludHNbR109RC5wb2ludHNbdGhpcy5pbmRleF09bnVsbCxcInBlcmNlbnRcIj09PWU/KHU9dT90OkYsdyYmcFt1XSYmcFt1XVt2XT8odT1wW3VdW3ZdLEQudG90YWw9dS50b3RhbD1NYXRoLm1heCh1LnRvdGFsLEQudG90YWwpK01hdGguYWJzKHgpfHwwKTpELnRvdGFsPUUoRC50b3RhbCsoTWF0aC5hYnMoeCl8fDApKSk6RC50b3RhbD1FKEQudG90YWwrKHh8fDApKSxELmN1bXVsYXRpdmU9eShELmN1bXVsYXRpdmUsbCkrKHh8fDApLG51bGwhPT14JiYoRC5wb2ludHNbR10ucHVzaChELmN1bXVsYXRpdmUpLGhbcV09RC5jdW11bGF0aXZlKTtcInBlcmNlbnRcIj09PWUmJihCLnVzZVBlcmNlbnRhZ2U9XG4hMCk7dGhpcy5zdGFja2VkWURhdGE9aDtCLm9sZFN0YWNrcz17fX19O3oucHJvdG90eXBlLm1vZGlmeVN0YWNrcz1mdW5jdGlvbigpe3ZhciBhPXRoaXMsZj1hLnN0YWNrS2V5LGg9YS55QXhpcy5zdGFja3MsZz1hLnByb2Nlc3NlZFhEYXRhLGUsYj1hLm9wdGlvbnMuc3RhY2tpbmc7YVtiK1wiU3RhY2tlclwiXSYmW2YsXCItXCIrZl0uZm9yRWFjaChmdW5jdGlvbihmKXtmb3IodmFyIGM9Zy5sZW5ndGgsbCxyO2MtLTspaWYobD1nW2NdLGU9YS5nZXRTdGFja0luZGljYXRvcihlLGwsYS5pbmRleCxmKSxyPShsPWhbZl0mJmhbZl1bbF0pJiZsLnBvaW50c1tlLmtleV0pYVtiK1wiU3RhY2tlclwiXShyLGwsYyl9KX07ei5wcm90b3R5cGUucGVyY2VudFN0YWNrZXI9ZnVuY3Rpb24oYSxmLGgpe2Y9Zi50b3RhbD8xMDAvZi50b3RhbDowO2FbMF09RShhWzBdKmYpO2FbMV09RShhWzFdKmYpO3RoaXMuc3RhY2tlZFlEYXRhW2hdPWFbMV19O3oucHJvdG90eXBlLmdldFN0YWNrSW5kaWNhdG9yPWZ1bmN0aW9uKGEsXG5mLGgsZyl7IW0oYSl8fGEueCE9PWZ8fGcmJmEua2V5IT09Zz9hPXt4OmYsaW5kZXg6MCxrZXk6Z306YS5pbmRleCsrO2Eua2V5PVtoLGYsYS5pbmRleF0uam9pbigpO3JldHVybiBhfX0pO0koSCxcInBhcnRzL0R5bmFtaWNzLmpzXCIsW0hbXCJwYXJ0cy9HbG9iYWxzLmpzXCJdXSxmdW5jdGlvbihhKXt2YXIgQz1hLmFkZEV2ZW50LEE9YS5hbmltYXRlLEU9YS5BeGlzLG09YS5DaGFydCxnPWEuY3JlYXRlRWxlbWVudCx2PWEuY3NzLHg9YS5kZWZpbmVkLHk9YS5lcmFzZSx6PWEuZXh0ZW5kLG49YS5maXJlRXZlbnQsZj1hLmlzTnVtYmVyLGg9YS5pc09iamVjdCxyPWEuaXNBcnJheSxlPWEubWVyZ2UsYj1hLm9iamVjdEVhY2gsbD1hLnBpY2ssYz1hLlBvaW50LHQ9YS5TZXJpZXMsRj1hLnNlcmllc1R5cGVzLHc9YS5zZXRBbmltYXRpb24sQj1hLnNwbGF0O2EuY2xlYW5SZWN1cnNpdmVseT1mdW5jdGlvbihjLGQpe3ZhciBlPXt9O2IoYyxmdW5jdGlvbihiLGspe2lmKGgoY1trXSwhMCkmJiFjLm5vZGVUeXBlJiZcbmRba10pYj1hLmNsZWFuUmVjdXJzaXZlbHkoY1trXSxkW2tdKSxPYmplY3Qua2V5cyhiKS5sZW5ndGgmJihlW2tdPWIpO2Vsc2UgaWYoaChjW2tdKXx8Y1trXSE9PWRba10pZVtrXT1jW2tdfSk7cmV0dXJuIGV9O3oobS5wcm90b3R5cGUse2FkZFNlcmllczpmdW5jdGlvbihhLGIsYyl7dmFyIGQsZT10aGlzO2EmJihiPWwoYiwhMCksbihlLFwiYWRkU2VyaWVzXCIse29wdGlvbnM6YX0sZnVuY3Rpb24oKXtkPWUuaW5pdFNlcmllcyhhKTtlLmlzRGlydHlMZWdlbmQ9ITA7ZS5saW5rU2VyaWVzKCk7bihlLFwiYWZ0ZXJBZGRTZXJpZXNcIix7c2VyaWVzOmR9KTtiJiZlLnJlZHJhdyhjKX0pKTtyZXR1cm4gZH0sYWRkQXhpczpmdW5jdGlvbihhLGIsYyxmKXt2YXIgZD1iP1wieEF4aXNcIjpcInlBeGlzXCIsaz10aGlzLm9wdGlvbnM7YT1lKGEse2luZGV4OnRoaXNbZF0ubGVuZ3RoLGlzWDpifSk7Yj1uZXcgRSh0aGlzLGEpO2tbZF09QihrW2RdfHx7fSk7a1tkXS5wdXNoKGEpO2woYywhMCkmJnRoaXMucmVkcmF3KGYpO1xucmV0dXJuIGJ9LHNob3dMb2FkaW5nOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMsYz1iLm9wdGlvbnMsZT1iLmxvYWRpbmdEaXYsZj1jLmxvYWRpbmcscD1mdW5jdGlvbigpe2UmJnYoZSx7bGVmdDpiLnBsb3RMZWZ0K1wicHhcIix0b3A6Yi5wbG90VG9wK1wicHhcIix3aWR0aDpiLnBsb3RXaWR0aCtcInB4XCIsaGVpZ2h0OmIucGxvdEhlaWdodCtcInB4XCJ9KX07ZXx8KGIubG9hZGluZ0Rpdj1lPWcoXCJkaXZcIix7Y2xhc3NOYW1lOlwiaGlnaGNoYXJ0cy1sb2FkaW5nIGhpZ2hjaGFydHMtbG9hZGluZy1oaWRkZW5cIn0sbnVsbCxiLmNvbnRhaW5lciksYi5sb2FkaW5nU3Bhbj1nKFwic3BhblwiLHtjbGFzc05hbWU6XCJoaWdoY2hhcnRzLWxvYWRpbmctaW5uZXJcIn0sbnVsbCxlKSxDKGIsXCJyZWRyYXdcIixwKSk7ZS5jbGFzc05hbWU9XCJoaWdoY2hhcnRzLWxvYWRpbmdcIjtiLmxvYWRpbmdTcGFuLmlubmVySFRNTD1hfHxjLmxhbmcubG9hZGluZztiLnN0eWxlZE1vZGV8fCh2KGUseihmLnN0eWxlLHt6SW5kZXg6MTB9KSksXG52KGIubG9hZGluZ1NwYW4sZi5sYWJlbFN0eWxlKSxiLmxvYWRpbmdTaG93bnx8KHYoZSx7b3BhY2l0eTowLGRpc3BsYXk6XCJcIn0pLEEoZSx7b3BhY2l0eTpmLnN0eWxlLm9wYWNpdHl8fC41fSx7ZHVyYXRpb246Zi5zaG93RHVyYXRpb258fDB9KSkpO2IubG9hZGluZ1Nob3duPSEwO3AoKX0saGlkZUxvYWRpbmc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLm9wdGlvbnMsYj10aGlzLmxvYWRpbmdEaXY7YiYmKGIuY2xhc3NOYW1lPVwiaGlnaGNoYXJ0cy1sb2FkaW5nIGhpZ2hjaGFydHMtbG9hZGluZy1oaWRkZW5cIix0aGlzLnN0eWxlZE1vZGV8fEEoYix7b3BhY2l0eTowfSx7ZHVyYXRpb246YS5sb2FkaW5nLmhpZGVEdXJhdGlvbnx8MTAwLGNvbXBsZXRlOmZ1bmN0aW9uKCl7dihiLHtkaXNwbGF5Olwibm9uZVwifSl9fSkpO3RoaXMubG9hZGluZ1Nob3duPSExfSxwcm9wc1JlcXVpcmVEaXJ0eUJveDpcImJhY2tncm91bmRDb2xvciBib3JkZXJDb2xvciBib3JkZXJXaWR0aCBib3JkZXJSYWRpdXMgcGxvdEJhY2tncm91bmRDb2xvciBwbG90QmFja2dyb3VuZEltYWdlIHBsb3RCb3JkZXJDb2xvciBwbG90Qm9yZGVyV2lkdGggcGxvdFNoYWRvdyBzaGFkb3dcIi5zcGxpdChcIiBcIiksXG5wcm9wc1JlcXVpcmVSZWZsb3c6XCJtYXJnaW4gbWFyZ2luVG9wIG1hcmdpblJpZ2h0IG1hcmdpbkJvdHRvbSBtYXJnaW5MZWZ0IHNwYWNpbmcgc3BhY2luZ1RvcCBzcGFjaW5nUmlnaHQgc3BhY2luZ0JvdHRvbSBzcGFjaW5nTGVmdFwiLnNwbGl0KFwiIFwiKSxwcm9wc1JlcXVpcmVVcGRhdGVTZXJpZXM6XCJjaGFydC5pbnZlcnRlZCBjaGFydC5wb2xhciBjaGFydC5pZ25vcmVIaWRkZW5TZXJpZXMgY2hhcnQudHlwZSBjb2xvcnMgcGxvdE9wdGlvbnMgdGltZSB0b29sdGlwXCIuc3BsaXQoXCIgXCIpLGNvbGxlY3Rpb25zV2l0aFVwZGF0ZTpcInhBeGlzIHlBeGlzIHpBeGlzIHNlcmllcyBjb2xvckF4aXMgcGFuZVwiLnNwbGl0KFwiIFwiKSx1cGRhdGU6ZnVuY3Rpb24oYyxkLGssaCl7dmFyIHA9dGhpcyxnPXtjcmVkaXRzOlwiYWRkQ3JlZGl0c1wiLHRpdGxlOlwic2V0VGl0bGVcIixzdWJ0aXRsZTpcInNldFN1YnRpdGxlXCJ9LHEsdSx0LHIsdz1bXTtuKHAsXCJ1cGRhdGVcIix7b3B0aW9uczpjfSk7Yy5pc1Jlc3BvbnNpdmVPcHRpb25zfHxcbnAuc2V0UmVzcG9uc2l2ZSghMSwhMCk7Yz1hLmNsZWFuUmVjdXJzaXZlbHkoYyxwLm9wdGlvbnMpO2UoITAscC51c2VyT3B0aW9ucyxjKTtpZihxPWMuY2hhcnQpe2UoITAscC5vcHRpb25zLmNoYXJ0LHEpO1wiY2xhc3NOYW1lXCJpbiBxJiZwLnNldENsYXNzTmFtZShxLmNsYXNzTmFtZSk7XCJyZWZsb3dcImluIHEmJnAuc2V0UmVmbG93KHEucmVmbG93KTtpZihcImludmVydGVkXCJpbiBxfHxcInBvbGFyXCJpbiBxfHxcInR5cGVcImluIHEpcC5wcm9wRnJvbVNlcmllcygpLHU9ITA7XCJhbGlnblRpY2tzXCJpbiBxJiYodT0hMCk7YihxLGZ1bmN0aW9uKGEsYil7LTEhPT1wLnByb3BzUmVxdWlyZVVwZGF0ZVNlcmllcy5pbmRleE9mKFwiY2hhcnQuXCIrYikmJih0PSEwKTstMSE9PXAucHJvcHNSZXF1aXJlRGlydHlCb3guaW5kZXhPZihiKSYmKHAuaXNEaXJ0eUJveD0hMCk7LTEhPT1wLnByb3BzUmVxdWlyZVJlZmxvdy5pbmRleE9mKGIpJiYocj0hMCl9KTshcC5zdHlsZWRNb2RlJiZcInN0eWxlXCJpbiBxJiZcbnAucmVuZGVyZXIuc2V0U3R5bGUocS5zdHlsZSl9IXAuc3R5bGVkTW9kZSYmYy5jb2xvcnMmJih0aGlzLm9wdGlvbnMuY29sb3JzPWMuY29sb3JzKTtjLnBsb3RPcHRpb25zJiZlKCEwLHRoaXMub3B0aW9ucy5wbG90T3B0aW9ucyxjLnBsb3RPcHRpb25zKTtjLnRpbWUmJnRoaXMudGltZT09PWEudGltZSYmKHRoaXMudGltZT1uZXcgYS5UaW1lKGMudGltZSkpO2IoYyxmdW5jdGlvbihhLGIpe2lmKHBbYl0mJlwiZnVuY3Rpb25cIj09PXR5cGVvZiBwW2JdLnVwZGF0ZSlwW2JdLnVwZGF0ZShhLCExKTtlbHNlIGlmKFwiZnVuY3Rpb25cIj09PXR5cGVvZiBwW2dbYl1dKXBbZ1tiXV0oYSk7XCJjaGFydFwiIT09YiYmLTEhPT1wLnByb3BzUmVxdWlyZVVwZGF0ZVNlcmllcy5pbmRleE9mKGIpJiYodD0hMCl9KTt0aGlzLmNvbGxlY3Rpb25zV2l0aFVwZGF0ZS5mb3JFYWNoKGZ1bmN0aW9uKGEpe3ZhciBiO2NbYV0mJihcInNlcmllc1wiPT09YSYmKGI9W10scFthXS5mb3JFYWNoKGZ1bmN0aW9uKGEsZCl7YS5vcHRpb25zLmlzSW50ZXJuYWx8fFxuYi5wdXNoKGwoYS5vcHRpb25zLmluZGV4LGQpKX0pKSxCKGNbYV0pLmZvckVhY2goZnVuY3Rpb24oZCxjKXsoYz14KGQuaWQpJiZwLmdldChkLmlkKXx8cFthXVtiP2JbY106Y10pJiZjLmNvbGw9PT1hJiYoYy51cGRhdGUoZCwhMSksayYmKGMudG91Y2hlZD0hMCkpOyFjJiZrJiZwLmNvbGxlY3Rpb25zV2l0aEluaXRbYV0mJihwLmNvbGxlY3Rpb25zV2l0aEluaXRbYV1bMF0uYXBwbHkocCxbZF0uY29uY2F0KHAuY29sbGVjdGlvbnNXaXRoSW5pdFthXVsxXXx8W10pLmNvbmNhdChbITFdKSkudG91Y2hlZD0hMCl9KSxrJiZwW2FdLmZvckVhY2goZnVuY3Rpb24oYSl7YS50b3VjaGVkfHxhLm9wdGlvbnMuaXNJbnRlcm5hbD9kZWxldGUgYS50b3VjaGVkOncucHVzaChhKX0pKX0pO3cuZm9yRWFjaChmdW5jdGlvbihhKXthLnJlbW92ZSYmYS5yZW1vdmUoITEpfSk7dSYmcC5heGVzLmZvckVhY2goZnVuY3Rpb24oYSl7YS51cGRhdGUoe30sITEpfSk7dCYmcC5zZXJpZXMuZm9yRWFjaChmdW5jdGlvbihhKXthLnVwZGF0ZSh7fSxcbiExKX0pO2MubG9hZGluZyYmZSghMCxwLm9wdGlvbnMubG9hZGluZyxjLmxvYWRpbmcpO3U9cSYmcS53aWR0aDtxPXEmJnEuaGVpZ2h0O2EuaXNTdHJpbmcocSkmJihxPWEucmVsYXRpdmVMZW5ndGgocSx1fHxwLmNoYXJ0V2lkdGgpKTtyfHxmKHUpJiZ1IT09cC5jaGFydFdpZHRofHxmKHEpJiZxIT09cC5jaGFydEhlaWdodD9wLnNldFNpemUodSxxLGgpOmwoZCwhMCkmJnAucmVkcmF3KGgpO24ocCxcImFmdGVyVXBkYXRlXCIse29wdGlvbnM6YyxyZWRyYXc6ZCxhbmltYXRpb246aH0pfSxzZXRTdWJ0aXRsZTpmdW5jdGlvbihhKXt0aGlzLnNldFRpdGxlKHZvaWQgMCxhKX19KTttLnByb3RvdHlwZS5jb2xsZWN0aW9uc1dpdGhJbml0PXt4QXhpczpbbS5wcm90b3R5cGUuYWRkQXhpcyxbITBdXSx5QXhpczpbbS5wcm90b3R5cGUuYWRkQXhpcyxbITFdXSxzZXJpZXM6W20ucHJvdG90eXBlLmFkZFNlcmllc119O3ooYy5wcm90b3R5cGUse3VwZGF0ZTpmdW5jdGlvbihhLGIsYyxlKXtmdW5jdGlvbiBkKCl7ay5hcHBseU9wdGlvbnMoYSk7XG5udWxsPT09ay55JiZwJiYoay5ncmFwaGljPXAuZGVzdHJveSgpKTtoKGEsITApJiYocCYmcC5lbGVtZW50JiZhJiZhLm1hcmtlciYmdm9pZCAwIT09YS5tYXJrZXIuc3ltYm9sJiYoay5ncmFwaGljPXAuZGVzdHJveSgpKSxhJiZhLmRhdGFMYWJlbHMmJmsuZGF0YUxhYmVsJiYoay5kYXRhTGFiZWw9ay5kYXRhTGFiZWwuZGVzdHJveSgpKSxrLmNvbm5lY3RvciYmKGsuY29ubmVjdG9yPWsuY29ubmVjdG9yLmRlc3Ryb3koKSkpO2c9ay5pbmRleDtmLnVwZGF0ZVBhcmFsbGVsQXJyYXlzKGssZyk7dC5kYXRhW2ddPWgodC5kYXRhW2ddLCEwKXx8aChhLCEwKT9rLm9wdGlvbnM6bChhLHQuZGF0YVtnXSk7Zi5pc0RpcnR5PWYuaXNEaXJ0eURhdGE9ITA7IWYuZml4ZWRCb3gmJmYuaGFzQ2FydGVzaWFuU2VyaWVzJiYodS5pc0RpcnR5Qm94PSEwKTtcInBvaW50XCI9PT10LmxlZ2VuZFR5cGUmJih1LmlzRGlydHlMZWdlbmQ9ITApO2ImJnUucmVkcmF3KGMpfXZhciBrPXRoaXMsZj1rLnNlcmllcyxcbnA9ay5ncmFwaGljLGcsdT1mLmNoYXJ0LHQ9Zi5vcHRpb25zO2I9bChiLCEwKTshMT09PWU/ZCgpOmsuZmlyZVBvaW50RXZlbnQoXCJ1cGRhdGVcIix7b3B0aW9uczphfSxkKX0scmVtb3ZlOmZ1bmN0aW9uKGEsYil7dGhpcy5zZXJpZXMucmVtb3ZlUG9pbnQodGhpcy5zZXJpZXMuZGF0YS5pbmRleE9mKHRoaXMpLGEsYil9fSk7eih0LnByb3RvdHlwZSx7YWRkUG9pbnQ6ZnVuY3Rpb24oYSxiLGMsZSxmKXt2YXIgZD10aGlzLm9wdGlvbnMsaz10aGlzLmRhdGEscD10aGlzLmNoYXJ0LGg9dGhpcy54QXhpcyxoPWgmJmguaGFzTmFtZXMmJmgubmFtZXMsZz1kLmRhdGEsdSx0PXRoaXMueERhdGEscix3LG07Yj1sKGIsITApO3U9e3Nlcmllczp0aGlzfTt0aGlzLnBvaW50Q2xhc3MucHJvdG90eXBlLmFwcGx5T3B0aW9ucy5hcHBseSh1LFthXSk7bT11Lng7dz10Lmxlbmd0aDtpZih0aGlzLnJlcXVpcmVTb3J0aW5nJiZtPHRbdy0xXSlmb3Iocj0hMDt3JiZ0W3ctMV0+bTspdy0tO3RoaXMudXBkYXRlUGFyYWxsZWxBcnJheXModSxcblwic3BsaWNlXCIsdywwLDApO3RoaXMudXBkYXRlUGFyYWxsZWxBcnJheXModSx3KTtoJiZ1Lm5hbWUmJihoW21dPXUubmFtZSk7Zy5zcGxpY2UodywwLGEpO3ImJih0aGlzLmRhdGEuc3BsaWNlKHcsMCxudWxsKSx0aGlzLnByb2Nlc3NEYXRhKCkpO1wicG9pbnRcIj09PWQubGVnZW5kVHlwZSYmdGhpcy5nZW5lcmF0ZVBvaW50cygpO2MmJihrWzBdJiZrWzBdLnJlbW92ZT9rWzBdLnJlbW92ZSghMSk6KGsuc2hpZnQoKSx0aGlzLnVwZGF0ZVBhcmFsbGVsQXJyYXlzKHUsXCJzaGlmdFwiKSxnLnNoaWZ0KCkpKTshMSE9PWYmJm4odGhpcyxcImFkZFBvaW50XCIse3BvaW50OnV9KTt0aGlzLmlzRGlydHlEYXRhPXRoaXMuaXNEaXJ0eT0hMDtiJiZwLnJlZHJhdyhlKX0scmVtb3ZlUG9pbnQ6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXRoaXMsZT1kLmRhdGEsaz1lW2FdLGY9ZC5wb2ludHMscD1kLmNoYXJ0LGg9ZnVuY3Rpb24oKXtmJiZmLmxlbmd0aD09PWUubGVuZ3RoJiZmLnNwbGljZShhLDEpO2Uuc3BsaWNlKGEsXG4xKTtkLm9wdGlvbnMuZGF0YS5zcGxpY2UoYSwxKTtkLnVwZGF0ZVBhcmFsbGVsQXJyYXlzKGt8fHtzZXJpZXM6ZH0sXCJzcGxpY2VcIixhLDEpO2smJmsuZGVzdHJveSgpO2QuaXNEaXJ0eT0hMDtkLmlzRGlydHlEYXRhPSEwO2ImJnAucmVkcmF3KCl9O3coYyxwKTtiPWwoYiwhMCk7az9rLmZpcmVQb2ludEV2ZW50KFwicmVtb3ZlXCIsbnVsbCxoKTpoKCl9LHJlbW92ZTpmdW5jdGlvbihhLGIsYyxlKXtmdW5jdGlvbiBkKCl7ay5kZXN0cm95KGUpO2sucmVtb3ZlPW51bGw7Zi5pc0RpcnR5TGVnZW5kPWYuaXNEaXJ0eUJveD0hMDtmLmxpbmtTZXJpZXMoKTtsKGEsITApJiZmLnJlZHJhdyhiKX12YXIgaz10aGlzLGY9ay5jaGFydDshMSE9PWM/bihrLFwicmVtb3ZlXCIsbnVsbCxkKTpkKCl9LHVwZGF0ZTpmdW5jdGlvbihiLGQpe2I9YS5jbGVhblJlY3Vyc2l2ZWx5KGIsdGhpcy51c2VyT3B0aW9ucyk7bih0aGlzLFwidXBkYXRlXCIse29wdGlvbnM6Yn0pO3ZhciBjPXRoaXMsZj1jLmNoYXJ0LGg9Yy51c2VyT3B0aW9ucyxcbnAsZz1jLmluaXRpYWxUeXBlfHxjLnR5cGUsdD1iLnR5cGV8fGgudHlwZXx8Zi5vcHRpb25zLmNoYXJ0LnR5cGUscj0hKHRoaXMuaGFzRGVyaXZlZERhdGF8fGIuZGF0YUdyb3VwaW5nfHx0JiZ0IT09dGhpcy50eXBlfHx2b2lkIDAhPT1iLnBvaW50U3RhcnR8fGIucG9pbnRJbnRlcnZhbHx8Yi5wb2ludEludGVydmFsVW5pdHx8Yi5rZXlzKSx3PUZbZ10ucHJvdG90eXBlLG0sQj1bXCJncm91cFwiLFwibWFya2VyR3JvdXBcIixcImRhdGFMYWJlbHNHcm91cFwiLFwidHJhbnNmb3JtR3JvdXBcIl0sdj1bXCJuYXZpZ2F0b3JTZXJpZXNcIixcImJhc2VTZXJpZXNcIl0seD1jLmZpbmlzaGVkQW5pbWF0aW5nJiZ7YW5pbWF0aW9uOiExfSx5PXt9O3ImJih2LnB1c2goXCJkYXRhXCIsXCJpc0RpcnR5RGF0YVwiLFwicG9pbnRzXCIsXCJwcm9jZXNzZWRYRGF0YVwiLFwicHJvY2Vzc2VkWURhdGFcIixcInhJbmNyZW1lbnRcIixcIl9oYXNQb2ludE1hcmtlcnNcIixcIl9oYXNQb2ludExhYmVsc1wiLFwibWFwTWFwXCIsXCJtYXBEYXRhXCIsXCJtaW5ZXCIsXG5cIm1heFlcIixcIm1pblhcIixcIm1heFhcIiksITEhPT1iLnZpc2libGUmJnYucHVzaChcImFyZWFcIixcImdyYXBoXCIpLGMucGFyYWxsZWxBcnJheXMuZm9yRWFjaChmdW5jdGlvbihhKXt2LnB1c2goYStcIkRhdGFcIil9KSxiLmRhdGEmJnRoaXMuc2V0RGF0YShiLmRhdGEsITEpKTtiPWUoaCx4LHtpbmRleDp2b2lkIDA9PT1oLmluZGV4P2MuaW5kZXg6aC5pbmRleCxwb2ludFN0YXJ0OmwoaC5wb2ludFN0YXJ0LGMueERhdGFbMF0pfSwhciYme2RhdGE6Yy5vcHRpb25zLmRhdGF9LGIpO3Y9Qi5jb25jYXQodik7di5mb3JFYWNoKGZ1bmN0aW9uKGEpe3ZbYV09Y1thXTtkZWxldGUgY1thXX0pO2MucmVtb3ZlKCExLG51bGwsITEsITApO2ZvcihtIGluIHcpY1ttXT12b2lkIDA7Rlt0fHxnXT96KGMsRlt0fHxnXS5wcm90b3R5cGUpOmEuZXJyb3IoMTcsITAsZik7di5mb3JFYWNoKGZ1bmN0aW9uKGEpe2NbYV09dlthXX0pO2MuaW5pdChmLGIpO3ImJnRoaXMucG9pbnRzJiYocD1jLm9wdGlvbnMsITE9PT1cbnAudmlzaWJsZT8oeS5ncmFwaGljPTEseS5kYXRhTGFiZWw9MSk6KHAubWFya2VyJiYhMT09PXAubWFya2VyLmVuYWJsZWQmJiFjLl9oYXNQb2ludE1hcmtlcnMmJih5LmdyYXBoaWM9MSkscC5kYXRhTGFiZWxzJiYhMT09PXAuZGF0YUxhYmVscy5lbmFibGVkJiYhYy5faGFzUG9pbnRMYWJlbHMmJih5LmRhdGFMYWJlbD0xKSksdGhpcy5wb2ludHMuZm9yRWFjaChmdW5jdGlvbihhKXthJiZhLnNlcmllcyYmKGEucmVzb2x2ZUNvbG9yKCksT2JqZWN0LmtleXMoeSkubGVuZ3RoJiZhLmRlc3Ryb3lFbGVtZW50cyh5KSwhMT09PXAuc2hvd0luTGVnZW5kJiZhLmxlZ2VuZEl0ZW0mJmYubGVnZW5kLmRlc3Ryb3lJdGVtKGEpKX0sdGhpcykpO2IuekluZGV4IT09aC56SW5kZXgmJkIuZm9yRWFjaChmdW5jdGlvbihhKXtjW2FdJiZjW2FdLmF0dHIoe3pJbmRleDpiLnpJbmRleH0pfSk7Yy5pbml0aWFsVHlwZT1nO2YubGlua1NlcmllcygpO24odGhpcyxcImFmdGVyVXBkYXRlXCIpO2woZCwhMCkmJlxuZi5yZWRyYXcocj92b2lkIDA6ITEpfSxzZXROYW1lOmZ1bmN0aW9uKGEpe3RoaXMubmFtZT10aGlzLm9wdGlvbnMubmFtZT10aGlzLnVzZXJPcHRpb25zLm5hbWU9YTt0aGlzLmNoYXJ0LmlzRGlydHlMZWdlbmQ9ITB9fSk7eihFLnByb3RvdHlwZSx7dXBkYXRlOmZ1bmN0aW9uKGEsZCl7dmFyIGM9dGhpcy5jaGFydCxmPWEmJmEuZXZlbnRzfHx7fTthPWUodGhpcy51c2VyT3B0aW9ucyxhKTtjLm9wdGlvbnNbdGhpcy5jb2xsXS5pbmRleE9mJiYoYy5vcHRpb25zW3RoaXMuY29sbF1bYy5vcHRpb25zW3RoaXMuY29sbF0uaW5kZXhPZih0aGlzLnVzZXJPcHRpb25zKV09YSk7YihjLm9wdGlvbnNbdGhpcy5jb2xsXS5ldmVudHMsZnVuY3Rpb24oYSxiKXtcInVuZGVmaW5lZFwiPT09dHlwZW9mIGZbYl0mJihmW2JdPXZvaWQgMCl9KTt0aGlzLmRlc3Ryb3koITApO3RoaXMuaW5pdChjLHooYSx7ZXZlbnRzOmZ9KSk7Yy5pc0RpcnR5Qm94PSEwO2woZCwhMCkmJmMucmVkcmF3KCl9LHJlbW92ZTpmdW5jdGlvbihhKXtmb3IodmFyIGI9XG50aGlzLmNoYXJ0LGM9dGhpcy5jb2xsLGU9dGhpcy5zZXJpZXMsZj1lLmxlbmd0aDtmLS07KWVbZl0mJmVbZl0ucmVtb3ZlKCExKTt5KGIuYXhlcyx0aGlzKTt5KGJbY10sdGhpcyk7cihiLm9wdGlvbnNbY10pP2Iub3B0aW9uc1tjXS5zcGxpY2UodGhpcy5vcHRpb25zLmluZGV4LDEpOmRlbGV0ZSBiLm9wdGlvbnNbY107YltjXS5mb3JFYWNoKGZ1bmN0aW9uKGEsYil7YS5vcHRpb25zLmluZGV4PWEudXNlck9wdGlvbnMuaW5kZXg9Yn0pO3RoaXMuZGVzdHJveSgpO2IuaXNEaXJ0eUJveD0hMDtsKGEsITApJiZiLnJlZHJhdygpfSxzZXRUaXRsZTpmdW5jdGlvbihhLGIpe3RoaXMudXBkYXRlKHt0aXRsZTphfSxiKX0sc2V0Q2F0ZWdvcmllczpmdW5jdGlvbihhLGIpe3RoaXMudXBkYXRlKHtjYXRlZ29yaWVzOmF9LGIpfX0pfSk7SShILFwicGFydHMvQXJlYVNlcmllcy5qc1wiLFtIW1wicGFydHMvR2xvYmFscy5qc1wiXV0sZnVuY3Rpb24oYSl7dmFyIEM9YS5jb2xvcixBPWEucGljayxFPWEuU2VyaWVzLFxubT1hLnNlcmllc1R5cGU7bShcImFyZWFcIixcImxpbmVcIix7c29mdFRocmVzaG9sZDohMSx0aHJlc2hvbGQ6MH0se3NpbmdsZVN0YWNrczohMSxnZXRTdGFja1BvaW50czpmdW5jdGlvbihnKXt2YXIgbT1bXSx4PVtdLHk9dGhpcy54QXhpcyx6PXRoaXMueUF4aXMsbj16LnN0YWNrc1t0aGlzLnN0YWNrS2V5XSxmPXt9LGg9dGhpcy5pbmRleCxyPXouc2VyaWVzLGU9ci5sZW5ndGgsYixsPUEoei5vcHRpb25zLnJldmVyc2VkU3RhY2tzLCEwKT8xOi0xLGM7Zz1nfHx0aGlzLnBvaW50cztpZih0aGlzLm9wdGlvbnMuc3RhY2tpbmcpe2ZvcihjPTA7YzxnLmxlbmd0aDtjKyspZ1tjXS5sZWZ0TnVsbD1nW2NdLnJpZ2h0TnVsbD1udWxsLGZbZ1tjXS54XT1nW2NdO2Eub2JqZWN0RWFjaChuLGZ1bmN0aW9uKGEsYil7bnVsbCE9PWEudG90YWwmJngucHVzaChiKX0pO3guc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBhLWJ9KTtiPXIubWFwKGZ1bmN0aW9uKGEpe3JldHVybiBhLnZpc2libGV9KTt4LmZvckVhY2goZnVuY3Rpb24oYSxcbmcpe3ZhciB0PTAscixwO2lmKGZbYV0mJiFmW2FdLmlzTnVsbCltLnB1c2goZlthXSksWy0xLDFdLmZvckVhY2goZnVuY3Rpb24oZCl7dmFyIGs9MT09PWQ/XCJyaWdodE51bGxcIjpcImxlZnROdWxsXCIsdD0wLHc9blt4W2crZF1dO2lmKHcpZm9yKGM9aDswPD1jJiZjPGU7KXI9dy5wb2ludHNbY10scnx8KGM9PT1oP2ZbYV1ba109ITA6YltjXSYmKHA9blthXS5wb2ludHNbY10pJiYodC09cFsxXS1wWzBdKSksYys9bDtmW2FdWzE9PT1kP1wicmlnaHRDbGlmZlwiOlwibGVmdENsaWZmXCJdPXR9KTtlbHNle2ZvcihjPWg7MDw9YyYmYzxlOyl7aWYocj1uW2FdLnBvaW50c1tjXSl7dD1yWzFdO2JyZWFrfWMrPWx9dD16LnRyYW5zbGF0ZSh0LDAsMSwwLDEpO20ucHVzaCh7aXNOdWxsOiEwLHBsb3RYOnkudHJhbnNsYXRlKGEsMCwwLDAsMSkseDphLHBsb3RZOnQseUJvdHRvbTp0fSl9fSl9cmV0dXJuIG19LGdldEdyYXBoUGF0aDpmdW5jdGlvbihnKXt2YXIgbT1FLnByb3RvdHlwZS5nZXRHcmFwaFBhdGgsXG54PXRoaXMub3B0aW9ucyx5PXguc3RhY2tpbmcsej10aGlzLnlBeGlzLG4sZixoPVtdLHI9W10sZT10aGlzLmluZGV4LGIsbD16LnN0YWNrc1t0aGlzLnN0YWNrS2V5XSxjPXgudGhyZXNob2xkLHQ9ei5nZXRUaHJlc2hvbGQoeC50aHJlc2hvbGQpLEYseD1hLnBpY2soeC5jb25uZWN0TnVsbHMsXCJwZXJjZW50XCI9PT15KSx3PWZ1bmN0aW9uKGEsZixkKXt2YXIgaz1nW2FdO2E9eSYmbFtrLnhdLnBvaW50c1tlXTt2YXIgcD1rW2QrXCJOdWxsXCJdfHwwO2Q9a1tkK1wiQ2xpZmZcIl18fDA7dmFyIHcsbixrPSEwO2R8fHA/KHc9KHA/YVswXTphWzFdKStkLG49YVswXStkLGs9ISFwKToheSYmZ1tmXSYmZ1tmXS5pc051bGwmJih3PW49Yyk7dm9pZCAwIT09dyYmKHIucHVzaCh7cGxvdFg6YixwbG90WTpudWxsPT09dz90OnouZ2V0VGhyZXNob2xkKHcpLGlzTnVsbDprLGlzQ2xpZmY6ITB9KSxoLnB1c2goe3Bsb3RYOmIscGxvdFk6bnVsbD09PW4/dDp6LmdldFRocmVzaG9sZChuKSxkb0N1cnZlOiExfSkpfTtcbmc9Z3x8dGhpcy5wb2ludHM7eSYmKGc9dGhpcy5nZXRTdGFja1BvaW50cyhnKSk7Zm9yKG49MDtuPGcubGVuZ3RoO24rKylpZihmPWdbbl0uaXNOdWxsLGI9QShnW25dLnJlY3RQbG90WCxnW25dLnBsb3RYKSxGPUEoZ1tuXS55Qm90dG9tLHQpLCFmfHx4KXh8fHcobixuLTEsXCJsZWZ0XCIpLGYmJiF5JiZ4fHwoci5wdXNoKGdbbl0pLGgucHVzaCh7eDpuLHBsb3RYOmIscGxvdFk6Rn0pKSx4fHx3KG4sbisxLFwicmlnaHRcIik7bj1tLmNhbGwodGhpcyxyLCEwLCEwKTtoLnJldmVyc2VkPSEwO2Y9bS5jYWxsKHRoaXMsaCwhMCwhMCk7Zi5sZW5ndGgmJihmWzBdPVwiTFwiKTtmPW4uY29uY2F0KGYpO209bS5jYWxsKHRoaXMsciwhMSx4KTtmLnhNYXA9bi54TWFwO3RoaXMuYXJlYVBhdGg9ZjtyZXR1cm4gbX0sZHJhd0dyYXBoOmZ1bmN0aW9uKCl7dGhpcy5hcmVhUGF0aD1bXTtFLnByb3RvdHlwZS5kcmF3R3JhcGguYXBwbHkodGhpcyk7dmFyIGE9dGhpcyxtPXRoaXMuYXJlYVBhdGgseD10aGlzLm9wdGlvbnMsXG55PVtbXCJhcmVhXCIsXCJoaWdoY2hhcnRzLWFyZWFcIix0aGlzLmNvbG9yLHguZmlsbENvbG9yXV07dGhpcy56b25lcy5mb3JFYWNoKGZ1bmN0aW9uKGcsbil7eS5wdXNoKFtcInpvbmUtYXJlYS1cIituLFwiaGlnaGNoYXJ0cy1hcmVhIGhpZ2hjaGFydHMtem9uZS1hcmVhLVwiK24rXCIgXCIrZy5jbGFzc05hbWUsZy5jb2xvcnx8YS5jb2xvcixnLmZpbGxDb2xvcnx8eC5maWxsQ29sb3JdKX0pO3kuZm9yRWFjaChmdW5jdGlvbihnKXt2YXIgbj1nWzBdLGY9YVtuXSxoPWY/XCJhbmltYXRlXCI6XCJhdHRyXCIscj17fTtmPyhmLmVuZFg9YS5wcmV2ZW50R3JhcGhBbmltYXRpb24/bnVsbDptLnhNYXAsZi5hbmltYXRlKHtkOm19KSk6KHIuekluZGV4PTAsZj1hW25dPWEuY2hhcnQucmVuZGVyZXIucGF0aChtKS5hZGRDbGFzcyhnWzFdKS5hZGQoYS5ncm91cCksZi5pc0FyZWE9ITApO2EuY2hhcnQuc3R5bGVkTW9kZXx8KHIuZmlsbD1BKGdbM10sQyhnWzJdKS5zZXRPcGFjaXR5KEEoeC5maWxsT3BhY2l0eSwuNzUpKS5nZXQoKSkpO1xuZltoXShyKTtmLnN0YXJ0WD1tLnhNYXA7Zi5zaGlmdFVuaXQ9eC5zdGVwPzI6MX0pfSxkcmF3TGVnZW5kU3ltYm9sOmEuTGVnZW5kU3ltYm9sTWl4aW4uZHJhd1JlY3RhbmdsZX0pfSk7SShILFwicGFydHMvU3BsaW5lU2VyaWVzLmpzXCIsW0hbXCJwYXJ0cy9HbG9iYWxzLmpzXCJdXSxmdW5jdGlvbihhKXt2YXIgQz1hLnBpY2s7YT1hLnNlcmllc1R5cGU7YShcInNwbGluZVwiLFwibGluZVwiLHt9LHtnZXRQb2ludFNwbGluZTpmdW5jdGlvbihhLEUsbSl7dmFyIGc9RS5wbG90WCx2PUUucGxvdFkseD1hW20tMV07bT1hW20rMV07dmFyIHkseixuLGY7aWYoeCYmIXguaXNOdWxsJiYhMSE9PXguZG9DdXJ2ZSYmIUUuaXNDbGlmZiYmbSYmIW0uaXNOdWxsJiYhMSE9PW0uZG9DdXJ2ZSYmIUUuaXNDbGlmZil7YT14LnBsb3RZO249bS5wbG90WDttPW0ucGxvdFk7dmFyIGg9MDt5PSgxLjUqZyt4LnBsb3RYKS8yLjU7ej0oMS41KnYrYSkvMi41O249KDEuNSpnK24pLzIuNTtmPSgxLjUqdittKS8yLjU7biE9PVxueSYmKGg9KGYteikqKG4tZykvKG4teSkrdi1mKTt6Kz1oO2YrPWg7ej5hJiZ6PnY/KHo9TWF0aC5tYXgoYSx2KSxmPTIqdi16KTp6PGEmJno8diYmKHo9TWF0aC5taW4oYSx2KSxmPTIqdi16KTtmPm0mJmY+dj8oZj1NYXRoLm1heChtLHYpLHo9Mip2LWYpOmY8bSYmZjx2JiYoZj1NYXRoLm1pbihtLHYpLHo9Mip2LWYpO0UucmlnaHRDb250WD1uO0UucmlnaHRDb250WT1mfUU9W1wiQ1wiLEMoeC5yaWdodENvbnRYLHgucGxvdFgpLEMoeC5yaWdodENvbnRZLHgucGxvdFkpLEMoeSxnKSxDKHosdiksZyx2XTt4LnJpZ2h0Q29udFg9eC5yaWdodENvbnRZPW51bGw7cmV0dXJuIEV9fSl9KTtJKEgsXCJwYXJ0cy9BcmVhU3BsaW5lU2VyaWVzLmpzXCIsW0hbXCJwYXJ0cy9HbG9iYWxzLmpzXCJdXSxmdW5jdGlvbihhKXt2YXIgQz1hLnNlcmllc1R5cGVzLmFyZWEucHJvdG90eXBlLEE9YS5zZXJpZXNUeXBlO0EoXCJhcmVhc3BsaW5lXCIsXCJzcGxpbmVcIixhLmRlZmF1bHRQbG90T3B0aW9ucy5hcmVhLHtnZXRTdGFja1BvaW50czpDLmdldFN0YWNrUG9pbnRzLFxuZ2V0R3JhcGhQYXRoOkMuZ2V0R3JhcGhQYXRoLGRyYXdHcmFwaDpDLmRyYXdHcmFwaCxkcmF3TGVnZW5kU3ltYm9sOmEuTGVnZW5kU3ltYm9sTWl4aW4uZHJhd1JlY3RhbmdsZX0pfSk7SShILFwicGFydHMvQ29sdW1uU2VyaWVzLmpzXCIsW0hbXCJwYXJ0cy9HbG9iYWxzLmpzXCJdXSxmdW5jdGlvbihhKXt2YXIgQz1hLmFuaW1PYmplY3QsQT1hLmNvbG9yLEU9YS5leHRlbmQsbT1hLmRlZmluZWQsZz1hLmlzTnVtYmVyLHY9YS5tZXJnZSx4PWEucGljayx5PWEuU2VyaWVzLHo9YS5zZXJpZXNUeXBlLG49YS5zdmc7eihcImNvbHVtblwiLFwibGluZVwiLHtib3JkZXJSYWRpdXM6MCxjcmlzcDohMCxncm91cFBhZGRpbmc6LjIsbWFya2VyOm51bGwscG9pbnRQYWRkaW5nOi4xLG1pblBvaW50TGVuZ3RoOjAsY3JvcFRocmVzaG9sZDo1MCxwb2ludFJhbmdlOm51bGwsc3RhdGVzOntob3Zlcjp7aGFsbzohMSxicmlnaHRuZXNzOi4xfSxzZWxlY3Q6e2NvbG9yOlwiI2NjY2NjY1wiLGJvcmRlckNvbG9yOlwiIzAwMDAwMFwifX0sXG5kYXRhTGFiZWxzOnthbGlnbjpudWxsLHZlcnRpY2FsQWxpZ246bnVsbCx5Om51bGx9LHNvZnRUaHJlc2hvbGQ6ITEsc3RhcnRGcm9tVGhyZXNob2xkOiEwLHN0aWNreVRyYWNraW5nOiExLHRvb2x0aXA6e2Rpc3RhbmNlOjZ9LHRocmVzaG9sZDowLGJvcmRlckNvbG9yOlwiI2ZmZmZmZlwifSx7Y3JvcFNob3VsZGVyOjAsZGlyZWN0VG91Y2g6ITAsdHJhY2tlckdyb3VwczpbXCJncm91cFwiLFwiZGF0YUxhYmVsc0dyb3VwXCJdLG5lZ1N0YWNrczohMCxpbml0OmZ1bmN0aW9uKCl7eS5wcm90b3R5cGUuaW5pdC5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dmFyIGE9dGhpcyxoPWEuY2hhcnQ7aC5oYXNSZW5kZXJlZCYmaC5zZXJpZXMuZm9yRWFjaChmdW5jdGlvbihmKXtmLnR5cGU9PT1hLnR5cGUmJihmLmlzRGlydHk9ITApfSl9LGdldENvbHVtbk1ldHJpY3M6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLGg9YS5vcHRpb25zLGc9YS54QXhpcyxlPWEueUF4aXMsYj1nLm9wdGlvbnMucmV2ZXJzZWRTdGFja3MsXG5iPWcucmV2ZXJzZWQmJiFifHwhZy5yZXZlcnNlZCYmYixsLGM9e30sdD0wOyExPT09aC5ncm91cGluZz90PTE6YS5jaGFydC5zZXJpZXMuZm9yRWFjaChmdW5jdGlvbihiKXt2YXIgZD1iLm9wdGlvbnMsaz1iLnlBeGlzLGY7Yi50eXBlIT09YS50eXBlfHwhYi52aXNpYmxlJiZhLmNoYXJ0Lm9wdGlvbnMuY2hhcnQuaWdub3JlSGlkZGVuU2VyaWVzfHxlLmxlbiE9PWsubGVufHxlLnBvcyE9PWsucG9zfHwoZC5zdGFja2luZz8obD1iLnN0YWNrS2V5LHZvaWQgMD09PWNbbF0mJihjW2xdPXQrKyksZj1jW2xdKTohMSE9PWQuZ3JvdXBpbmcmJihmPXQrKyksYi5jb2x1bW5JbmRleD1mKX0pO3ZhciBuPU1hdGgubWluKE1hdGguYWJzKGcudHJhbnNBKSooZy5vcmRpbmFsU2xvcGV8fGgucG9pbnRSYW5nZXx8Zy5jbG9zZXN0UG9pbnRSYW5nZXx8Zy50aWNrSW50ZXJ2YWx8fDEpLGcubGVuKSx3PW4qaC5ncm91cFBhZGRpbmcsbT0obi0yKncpLyh0fHwxKSxoPU1hdGgubWluKGgubWF4UG9pbnRXaWR0aHx8XG5nLmxlbix4KGgucG9pbnRXaWR0aCxtKigxLTIqaC5wb2ludFBhZGRpbmcpKSk7YS5jb2x1bW5NZXRyaWNzPXt3aWR0aDpoLG9mZnNldDoobS1oKS8yKyh3KygoYS5jb2x1bW5JbmRleHx8MCkrKGI/MTowKSkqbS1uLzIpKihiPy0xOjEpfTtyZXR1cm4gYS5jb2x1bW5NZXRyaWNzfSxjcmlzcENvbDpmdW5jdGlvbihhLGgsZyxlKXt2YXIgYj10aGlzLmNoYXJ0LGY9dGhpcy5ib3JkZXJXaWR0aCxjPS0oZiUyPy41OjApLGY9ZiUyPy41OjE7Yi5pbnZlcnRlZCYmYi5yZW5kZXJlci5pc1ZNTCYmKGYrPTEpO3RoaXMub3B0aW9ucy5jcmlzcCYmKGc9TWF0aC5yb3VuZChhK2cpK2MsYT1NYXRoLnJvdW5kKGEpK2MsZy09YSk7ZT1NYXRoLnJvdW5kKGgrZSkrZjtjPS41Pj1NYXRoLmFicyhoKSYmLjU8ZTtoPU1hdGgucm91bmQoaCkrZjtlLT1oO2MmJmUmJigtLWgsZSs9MSk7cmV0dXJue3g6YSx5Omgsd2lkdGg6ZyxoZWlnaHQ6ZX19LHRyYW5zbGF0ZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMsaD1cbmEuY2hhcnQsZz1hLm9wdGlvbnMsZT1hLmRlbnNlPTI+YS5jbG9zZXN0UG9pbnRSYW5nZSphLnhBeGlzLnRyYW5zQSxlPWEuYm9yZGVyV2lkdGg9eChnLmJvcmRlcldpZHRoLGU/MDoxKSxiPWEueUF4aXMsbD1nLnRocmVzaG9sZCxjPWEudHJhbnNsYXRlZFRocmVzaG9sZD1iLmdldFRocmVzaG9sZChsKSx0PXgoZy5taW5Qb2ludExlbmd0aCw1KSxuPWEuZ2V0Q29sdW1uTWV0cmljcygpLHc9bi53aWR0aCxCPWEuYmFyVz1NYXRoLm1heCh3LDErMiplKSxwPWEucG9pbnRYT2Zmc2V0PW4ub2Zmc2V0LGQ9YS5kYXRhTWluLGs9YS5kYXRhTWF4O2guaW52ZXJ0ZWQmJihjLT0uNSk7Zy5wb2ludFBhZGRpbmcmJihCPU1hdGguY2VpbChCKSk7eS5wcm90b3R5cGUudHJhbnNsYXRlLmFwcGx5KGEpO2EucG9pbnRzLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIGY9eChlLnlCb3R0b20sYyksZz05OTkrTWF0aC5hYnMoZikscT13LGc9TWF0aC5taW4oTWF0aC5tYXgoLWcsZS5wbG90WSksYi5sZW4rZyksXG51PWUucGxvdFgrcCxyPUIsbj1NYXRoLm1pbihnLGYpLHYsRj1NYXRoLm1heChnLGYpLW47dCYmTWF0aC5hYnMoRik8dCYmKEY9dCx2PSFiLnJldmVyc2VkJiYhZS5uZWdhdGl2ZXx8Yi5yZXZlcnNlZCYmZS5uZWdhdGl2ZSxlLnk9PT1sJiZhLmRhdGFNYXg8PWwmJmIubWluPGwmJmQhPT1rJiYodj0hdiksbj1NYXRoLmFicyhuLWMpPnQ/Zi10OmMtKHY/dDowKSk7bShlLm9wdGlvbnMucG9pbnRXaWR0aCkmJihxPXI9TWF0aC5jZWlsKGUub3B0aW9ucy5wb2ludFdpZHRoKSx1LT1NYXRoLnJvdW5kKChxLXcpLzIpKTtlLmJhclg9dTtlLnBvaW50V2lkdGg9cTtlLnRvb2x0aXBQb3M9aC5pbnZlcnRlZD9bYi5sZW4rYi5wb3MtaC5wbG90TGVmdC1nLGEueEF4aXMubGVuLXUtci8yLEZdOlt1K3IvMixnK2IucG9zLWgucGxvdFRvcCxGXTtlLnNoYXBlVHlwZT1hLnBvaW50Q2xhc3MucHJvdG90eXBlLnNoYXBlVHlwZXx8XCJyZWN0XCI7ZS5zaGFwZUFyZ3M9YS5jcmlzcENvbC5hcHBseShhLGUuaXNOdWxsP1xuW3UsYyxyLDBdOlt1LG4scixGXSl9KX0sZ2V0U3ltYm9sOmEubm9vcCxkcmF3TGVnZW5kU3ltYm9sOmEuTGVnZW5kU3ltYm9sTWl4aW4uZHJhd1JlY3RhbmdsZSxkcmF3R3JhcGg6ZnVuY3Rpb24oKXt0aGlzLmdyb3VwW3RoaXMuZGVuc2U/XCJhZGRDbGFzc1wiOlwicmVtb3ZlQ2xhc3NcIl0oXCJoaWdoY2hhcnRzLWRlbnNlLWRhdGFcIil9LHBvaW50QXR0cmliczpmdW5jdGlvbihhLGgpe3ZhciBmPXRoaXMub3B0aW9ucyxlLGI9dGhpcy5wb2ludEF0dHJUb09wdGlvbnN8fHt9O2U9Yi5zdHJva2V8fFwiYm9yZGVyQ29sb3JcIjt2YXIgZz1iW1wic3Ryb2tlLXdpZHRoXCJdfHxcImJvcmRlcldpZHRoXCIsYz1hJiZhLmNvbG9yfHx0aGlzLmNvbG9yLHQ9YSYmYVtlXXx8ZltlXXx8dGhpcy5jb2xvcnx8YyxuPWEmJmFbZ118fGZbZ118fHRoaXNbZ118fDAsYj1hJiZhLmRhc2hTdHlsZXx8Zi5kYXNoU3R5bGUsdz14KGYub3BhY2l0eSwxKSxtO2EmJnRoaXMuem9uZXMubGVuZ3RoJiYobT1hLmdldFpvbmUoKSxjPVxuYS5vcHRpb25zLmNvbG9yfHxtJiZtLmNvbG9yfHx0aGlzLmNvbG9yLG0mJih0PW0uYm9yZGVyQ29sb3J8fHQsYj1tLmRhc2hTdHlsZXx8YixuPW0uYm9yZGVyV2lkdGh8fG4pKTtoJiYoYT12KGYuc3RhdGVzW2hdLGEub3B0aW9ucy5zdGF0ZXMmJmEub3B0aW9ucy5zdGF0ZXNbaF18fHt9KSxoPWEuYnJpZ2h0bmVzcyxjPWEuY29sb3J8fHZvaWQgMCE9PWgmJkEoYykuYnJpZ2h0ZW4oYS5icmlnaHRuZXNzKS5nZXQoKXx8Yyx0PWFbZV18fHQsbj1hW2ddfHxuLGI9YS5kYXNoU3R5bGV8fGIsdz14KGEub3BhY2l0eSx3KSk7ZT17ZmlsbDpjLHN0cm9rZTp0LFwic3Ryb2tlLXdpZHRoXCI6bixvcGFjaXR5Ond9O2ImJihlLmRhc2hzdHlsZT1iKTtyZXR1cm4gZX0sZHJhd1BvaW50czpmdW5jdGlvbigpe3ZhciBhPXRoaXMsaD10aGlzLmNoYXJ0LHI9YS5vcHRpb25zLGU9aC5yZW5kZXJlcixiPXIuYW5pbWF0aW9uTGltaXR8fDI1MCxsO2EucG9pbnRzLmZvckVhY2goZnVuY3Rpb24oYyl7dmFyIGY9XG5jLmdyYXBoaWMsbj1mJiZoLnBvaW50Q291bnQ8Yj9cImFuaW1hdGVcIjpcImF0dHJcIjtpZihnKGMucGxvdFkpJiZudWxsIT09Yy55KXtsPWMuc2hhcGVBcmdzO2YmJmYuZWxlbWVudC5ub2RlTmFtZSE9PWMuc2hhcGVUeXBlJiYoZj1mLmRlc3Ryb3koKSk7aWYoZilmW25dKHYobCkpO2Vsc2UgYy5ncmFwaGljPWY9ZVtjLnNoYXBlVHlwZV0obCkuYWRkKGMuZ3JvdXB8fGEuZ3JvdXApO2lmKHIuYm9yZGVyUmFkaXVzKWZbbl0oe3I6ci5ib3JkZXJSYWRpdXN9KTtoLnN0eWxlZE1vZGV8fGZbbl0oYS5wb2ludEF0dHJpYnMoYyxjLnNlbGVjdGVkJiZcInNlbGVjdFwiKSkuc2hhZG93KCExIT09Yy5hbGxvd1NoYWRvdyYmci5zaGFkb3csbnVsbCxyLnN0YWNraW5nJiYhci5ib3JkZXJSYWRpdXMpO2YuYWRkQ2xhc3MoYy5nZXRDbGFzc05hbWUoKSwhMCl9ZWxzZSBmJiYoYy5ncmFwaGljPWYuZGVzdHJveSgpKX0pfSxhbmltYXRlOmZ1bmN0aW9uKGEpe3ZhciBmPXRoaXMsZz10aGlzLnlBeGlzLGU9Zi5vcHRpb25zLFxuYj10aGlzLmNoYXJ0LmludmVydGVkLGw9e30sYz1iP1widHJhbnNsYXRlWFwiOlwidHJhbnNsYXRlWVwiLHQ7biYmKGE/KGwuc2NhbGVZPS4wMDEsYT1NYXRoLm1pbihnLnBvcytnLmxlbixNYXRoLm1heChnLnBvcyxnLnRvUGl4ZWxzKGUudGhyZXNob2xkKSkpLGI/bC50cmFuc2xhdGVYPWEtZy5sZW46bC50cmFuc2xhdGVZPWEsZi5jbGlwQm94JiZmLnNldENsaXAoKSxmLmdyb3VwLmF0dHIobCkpOih0PWYuZ3JvdXAuYXR0cihjKSxmLmdyb3VwLmFuaW1hdGUoe3NjYWxlWToxfSxFKEMoZi5vcHRpb25zLmFuaW1hdGlvbikse3N0ZXA6ZnVuY3Rpb24oYSxiKXtsW2NdPXQrYi5wb3MqKGcucG9zLXQpO2YuZ3JvdXAuYXR0cihsKX19KSksZi5hbmltYXRlPW51bGwpKX0scmVtb3ZlOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcyxoPWEuY2hhcnQ7aC5oYXNSZW5kZXJlZCYmaC5zZXJpZXMuZm9yRWFjaChmdW5jdGlvbihmKXtmLnR5cGU9PT1hLnR5cGUmJihmLmlzRGlydHk9ITApfSk7eS5wcm90b3R5cGUucmVtb3ZlLmFwcGx5KGEsXG5hcmd1bWVudHMpfX0pfSk7SShILFwicGFydHMvQmFyU2VyaWVzLmpzXCIsW0hbXCJwYXJ0cy9HbG9iYWxzLmpzXCJdXSxmdW5jdGlvbihhKXthPWEuc2VyaWVzVHlwZTthKFwiYmFyXCIsXCJjb2x1bW5cIixudWxsLHtpbnZlcnRlZDohMH0pfSk7SShILFwicGFydHMvU2NhdHRlclNlcmllcy5qc1wiLFtIW1wicGFydHMvR2xvYmFscy5qc1wiXV0sZnVuY3Rpb24oYSl7dmFyIEM9YS5TZXJpZXMsQT1hLnNlcmllc1R5cGU7QShcInNjYXR0ZXJcIixcImxpbmVcIix7bGluZVdpZHRoOjAsZmluZE5lYXJlc3RQb2ludEJ5OlwieHlcIixqaXR0ZXI6e3g6MCx5OjB9LG1hcmtlcjp7ZW5hYmxlZDohMH0sdG9vbHRpcDp7aGVhZGVyRm9ybWF0OidcXHgzY3NwYW4gc3R5bGVcXHgzZFwiY29sb3I6e3BvaW50LmNvbG9yfVwiXFx4M2VcXHUyNWNmXFx4M2Mvc3BhblxceDNlIFxceDNjc3BhbiBzdHlsZVxceDNkXCJmb250LXNpemU6IDEwcHhcIlxceDNlIHtzZXJpZXMubmFtZX1cXHgzYy9zcGFuXFx4M2VcXHgzY2JyL1xceDNlJyxwb2ludEZvcm1hdDpcIng6IFxceDNjYlxceDNle3BvaW50Lnh9XFx4M2MvYlxceDNlXFx4M2Nici9cXHgzZXk6IFxceDNjYlxceDNle3BvaW50Lnl9XFx4M2MvYlxceDNlXFx4M2Nici9cXHgzZVwifX0sXG57c29ydGVkOiExLHJlcXVpcmVTb3J0aW5nOiExLG5vU2hhcmVkVG9vbHRpcDohMCx0cmFja2VyR3JvdXBzOltcImdyb3VwXCIsXCJtYXJrZXJHcm91cFwiLFwiZGF0YUxhYmVsc0dyb3VwXCJdLHRha2VPcmRpbmFsUG9zaXRpb246ITEsZHJhd0dyYXBoOmZ1bmN0aW9uKCl7dGhpcy5vcHRpb25zLmxpbmVXaWR0aCYmQy5wcm90b3R5cGUuZHJhd0dyYXBoLmNhbGwodGhpcyl9LGFwcGx5Sml0dGVyOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcyxtPXRoaXMub3B0aW9ucy5qaXR0ZXIsZz10aGlzLnBvaW50cy5sZW5ndGg7bSYmdGhpcy5wb2ludHMuZm9yRWFjaChmdW5jdGlvbih2LHgpe1tcInhcIixcInlcIl0uZm9yRWFjaChmdW5jdGlvbih5LHope3ZhciBuLGY9XCJwbG90XCIreS50b1VwcGVyQ2FzZSgpLGgscjttW3ldJiYhdi5pc051bGwmJihuPWFbeStcIkF4aXNcIl0scj1tW3ldKm4udHJhbnNBLG4mJiFuLmlzTG9nJiYoaD1NYXRoLm1heCgwLHZbZl0tciksbj1NYXRoLm1pbihuLmxlbix2W2ZdK3IpLHo9MUU0KlxuTWF0aC5zaW4oeCt6KmcpLHZbZl09aCsobi1oKSooei1NYXRoLmZsb29yKHopKSxcInhcIj09PXkmJih2LmNsaWVudFg9di5wbG90WCkpKX0pfSl9fSk7YS5hZGRFdmVudChDLFwiYWZ0ZXJUcmFuc2xhdGVcIixmdW5jdGlvbigpe3RoaXMuYXBwbHlKaXR0ZXImJnRoaXMuYXBwbHlKaXR0ZXIoKX0pfSk7SShILFwibWl4aW5zL2NlbnRlcmVkLXNlcmllcy5qc1wiLFtIW1wicGFydHMvR2xvYmFscy5qc1wiXV0sZnVuY3Rpb24oYSl7dmFyIEM9YS5kZWcycmFkLEE9YS5pc051bWJlcixFPWEucGljayxtPWEucmVsYXRpdmVMZW5ndGg7YS5DZW50ZXJlZFNlcmllc01peGluPXtnZXRDZW50ZXI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLm9wdGlvbnMsdj10aGlzLmNoYXJ0LHg9MiooYS5zbGljZWRPZmZzZXR8fDApLHk9di5wbG90V2lkdGgtMip4LHY9di5wbG90SGVpZ2h0LTIqeCx6PWEuY2VudGVyLHo9W0UoelswXSxcIjUwJVwiKSxFKHpbMV0sXCI1MCVcIiksYS5zaXplfHxcIjEwMCVcIixhLmlubmVyU2l6ZXx8MF0sXG5uPU1hdGgubWluKHksdiksZixoO2ZvcihmPTA7ND5mOysrZiloPXpbZl0sYT0yPmZ8fDI9PT1mJiYvJSQvLnRlc3QoaCkseltmXT1tKGgsW3ksdixuLHpbMl1dW2ZdKSsoYT94OjApO3pbM10+elsyXSYmKHpbM109elsyXSk7cmV0dXJuIHp9LGdldFN0YXJ0QW5kRW5kUmFkaWFuczpmdW5jdGlvbihhLG0pe2E9QShhKT9hOjA7bT1BKG0pJiZtPmEmJjM2MD5tLWE/bTphKzM2MDtyZXR1cm57c3RhcnQ6QyooYSstOTApLGVuZDpDKihtKy05MCl9fX19KTtJKEgsXCJwYXJ0cy9QaWVTZXJpZXMuanNcIixbSFtcInBhcnRzL0dsb2JhbHMuanNcIl1dLGZ1bmN0aW9uKGEpe3ZhciBDPWEuYWRkRXZlbnQsQT1hLkNlbnRlcmVkU2VyaWVzTWl4aW4sRT1hLmRlZmluZWQsbT1BLmdldFN0YXJ0QW5kRW5kUmFkaWFucyxnPWEubWVyZ2Usdj1hLm5vb3AseD1hLnBpY2sseT1hLlBvaW50LHo9YS5TZXJpZXMsbj1hLnNlcmllc1R5cGUsZj1hLnNldEFuaW1hdGlvbjtuKFwicGllXCIsXCJsaW5lXCIse2NlbnRlcjpbbnVsbCxcbm51bGxdLGNsaXA6ITEsY29sb3JCeVBvaW50OiEwLGRhdGFMYWJlbHM6e2FsbG93T3ZlcmxhcDohMCxjb25uZWN0b3JQYWRkaW5nOjUsZGlzdGFuY2U6MzAsZW5hYmxlZDohMCxmb3JtYXR0ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wb2ludC5pc051bGw/dm9pZCAwOnRoaXMucG9pbnQubmFtZX0sc29mdENvbm5lY3RvcjohMCx4OjAsY29ubmVjdG9yU2hhcGU6XCJmaXhlZE9mZnNldFwiLGNyb29rRGlzdGFuY2U6XCI3MCVcIn0saWdub3JlSGlkZGVuUG9pbnQ6ITAsaW5hY3RpdmVPdGhlclBvaW50czohMCxsZWdlbmRUeXBlOlwicG9pbnRcIixtYXJrZXI6bnVsbCxzaXplOm51bGwsc2hvd0luTGVnZW5kOiExLHNsaWNlZE9mZnNldDoxMCxzdGlja3lUcmFja2luZzohMSx0b29sdGlwOntmb2xsb3dQb2ludGVyOiEwfSxib3JkZXJDb2xvcjpcIiNmZmZmZmZcIixib3JkZXJXaWR0aDoxLHN0YXRlczp7aG92ZXI6e2JyaWdodG5lc3M6LjF9fX0se2lzQ2FydGVzaWFuOiExLHJlcXVpcmVTb3J0aW5nOiExLFxuZGlyZWN0VG91Y2g6ITAsbm9TaGFyZWRUb29sdGlwOiEwLHRyYWNrZXJHcm91cHM6W1wiZ3JvdXBcIixcImRhdGFMYWJlbHNHcm91cFwiXSxheGlzVHlwZXM6W10scG9pbnRBdHRyaWJzOmEuc2VyaWVzVHlwZXMuY29sdW1uLnByb3RvdHlwZS5wb2ludEF0dHJpYnMsYW5pbWF0ZTpmdW5jdGlvbihhKXt2YXIgZj10aGlzLGU9Zi5wb2ludHMsYj1mLnN0YXJ0QW5nbGVSYWQ7YXx8KGUuZm9yRWFjaChmdW5jdGlvbihhKXt2YXIgYz1hLmdyYXBoaWMsZT1hLnNoYXBlQXJncztjJiYoYy5hdHRyKHtyOmEuc3RhcnRSfHxmLmNlbnRlclszXS8yLHN0YXJ0OmIsZW5kOmJ9KSxjLmFuaW1hdGUoe3I6ZS5yLHN0YXJ0OmUuc3RhcnQsZW5kOmUuZW5kfSxmLm9wdGlvbnMuYW5pbWF0aW9uKSl9KSxmLmFuaW1hdGU9bnVsbCl9LGhhc0RhdGE6ZnVuY3Rpb24oKXtyZXR1cm4hIXRoaXMucHJvY2Vzc2VkWERhdGEubGVuZ3RofSx1cGRhdGVUb3RhbHM6ZnVuY3Rpb24oKXt2YXIgYSxmPTAsZT10aGlzLnBvaW50cyxcbmI9ZS5sZW5ndGgsZyxjPXRoaXMub3B0aW9ucy5pZ25vcmVIaWRkZW5Qb2ludDtmb3IoYT0wO2E8YjthKyspZz1lW2FdLGYrPWMmJiFnLnZpc2libGU/MDpnLmlzTnVsbD8wOmcueTt0aGlzLnRvdGFsPWY7Zm9yKGE9MDthPGI7YSsrKWc9ZVthXSxnLnBlcmNlbnRhZ2U9MDxmJiYoZy52aXNpYmxlfHwhYyk/Zy55L2YqMTAwOjAsZy50b3RhbD1mfSxnZW5lcmF0ZVBvaW50czpmdW5jdGlvbigpe3oucHJvdG90eXBlLmdlbmVyYXRlUG9pbnRzLmNhbGwodGhpcyk7dGhpcy51cGRhdGVUb3RhbHMoKX0sZ2V0WDpmdW5jdGlvbihhLGYsZSl7dmFyIGI9dGhpcy5jZW50ZXIsaD10aGlzLnJhZGlpP3RoaXMucmFkaWlbZS5pbmRleF06YlsyXS8yO3JldHVybiBiWzBdKyhmPy0xOjEpKk1hdGguY29zKE1hdGguYXNpbihNYXRoLm1heChNYXRoLm1pbigoYS1iWzFdKS8oaCtlLmxhYmVsRGlzdGFuY2UpLDEpLC0xKSkpKihoK2UubGFiZWxEaXN0YW5jZSkrKDA8ZS5sYWJlbERpc3RhbmNlPyhmPy0xOlxuMSkqdGhpcy5vcHRpb25zLmRhdGFMYWJlbHMucGFkZGluZzowKX0sdHJhbnNsYXRlOmZ1bmN0aW9uKGYpe3RoaXMuZ2VuZXJhdGVQb2ludHMoKTt2YXIgZz0wLGU9dGhpcy5vcHRpb25zLGI9ZS5zbGljZWRPZmZzZXQsaD1iKyhlLmJvcmRlcldpZHRofHwwKSxjLHQsbj1tKGUuc3RhcnRBbmdsZSxlLmVuZEFuZ2xlKSx3PXRoaXMuc3RhcnRBbmdsZVJhZD1uLnN0YXJ0LG49KHRoaXMuZW5kQW5nbGVSYWQ9bi5lbmQpLXcsQj10aGlzLnBvaW50cyxwLGQsaz1lLmRhdGFMYWJlbHMuZGlzdGFuY2UsZT1lLmlnbm9yZUhpZGRlblBvaW50LHUsRD1CLmxlbmd0aCx2O2Z8fCh0aGlzLmNlbnRlcj1mPXRoaXMuZ2V0Q2VudGVyKCkpO2Zvcih1PTA7dTxEO3UrKyl7dj1CW3VdO2M9dytnKm47aWYoIWV8fHYudmlzaWJsZSlnKz12LnBlcmNlbnRhZ2UvMTAwO3Q9dytnKm47di5zaGFwZVR5cGU9XCJhcmNcIjt2LnNoYXBlQXJncz17eDpmWzBdLHk6ZlsxXSxyOmZbMl0vMixpbm5lclI6ZlszXS8yLHN0YXJ0Ok1hdGgucm91bmQoMUUzKlxuYykvMUUzLGVuZDpNYXRoLnJvdW5kKDFFMyp0KS8xRTN9O3YubGFiZWxEaXN0YW5jZT14KHYub3B0aW9ucy5kYXRhTGFiZWxzJiZ2Lm9wdGlvbnMuZGF0YUxhYmVscy5kaXN0YW5jZSxrKTt2LmxhYmVsRGlzdGFuY2U9YS5yZWxhdGl2ZUxlbmd0aCh2LmxhYmVsRGlzdGFuY2Usdi5zaGFwZUFyZ3Mucik7dGhpcy5tYXhMYWJlbERpc3RhbmNlPU1hdGgubWF4KHRoaXMubWF4TGFiZWxEaXN0YW5jZXx8MCx2LmxhYmVsRGlzdGFuY2UpO3Q9KHQrYykvMjt0PjEuNSpNYXRoLlBJP3QtPTIqTWF0aC5QSTp0PC1NYXRoLlBJLzImJih0Kz0yKk1hdGguUEkpO3Yuc2xpY2VkVHJhbnNsYXRpb249e3RyYW5zbGF0ZVg6TWF0aC5yb3VuZChNYXRoLmNvcyh0KSpiKSx0cmFuc2xhdGVZOk1hdGgucm91bmQoTWF0aC5zaW4odCkqYil9O3A9TWF0aC5jb3ModCkqZlsyXS8yO2Q9TWF0aC5zaW4odCkqZlsyXS8yO3YudG9vbHRpcFBvcz1bZlswXSsuNypwLGZbMV0rLjcqZF07di5oYWxmPXQ8LU1hdGguUEkvXG4yfHx0Pk1hdGguUEkvMj8xOjA7di5hbmdsZT10O2M9TWF0aC5taW4oaCx2LmxhYmVsRGlzdGFuY2UvNSk7di5sYWJlbFBvc2l0aW9uPXtuYXR1cmFsOnt4OmZbMF0rcCtNYXRoLmNvcyh0KSp2LmxhYmVsRGlzdGFuY2UseTpmWzFdK2QrTWF0aC5zaW4odCkqdi5sYWJlbERpc3RhbmNlfSxcImZpbmFsXCI6e30sYWxpZ25tZW50OjA+di5sYWJlbERpc3RhbmNlP1wiY2VudGVyXCI6di5oYWxmP1wicmlnaHRcIjpcImxlZnRcIixjb25uZWN0b3JQb3NpdGlvbjp7YnJlYWtBdDp7eDpmWzBdK3ArTWF0aC5jb3ModCkqYyx5OmZbMV0rZCtNYXRoLnNpbih0KSpjfSx0b3VjaGluZ1NsaWNlQXQ6e3g6ZlswXStwLHk6ZlsxXStkfX19fX0sZHJhd0dyYXBoOm51bGwscmVkcmF3UG9pbnRzOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcyxmPWEuY2hhcnQsZT1mLnJlbmRlcmVyLGIsbCxjLHQsbj1hLm9wdGlvbnMuc2hhZG93OyFufHxhLnNoYWRvd0dyb3VwfHxmLnN0eWxlZE1vZGV8fChhLnNoYWRvd0dyb3VwPWUuZyhcInNoYWRvd1wiKS5hdHRyKHt6SW5kZXg6LTF9KS5hZGQoYS5ncm91cCkpO1xuYS5wb2ludHMuZm9yRWFjaChmdW5jdGlvbihoKXt2YXIgdz17fTtsPWguZ3JhcGhpYztpZighaC5pc051bGwmJmwpe3Q9aC5zaGFwZUFyZ3M7Yj1oLmdldFRyYW5zbGF0ZSgpO2lmKCFmLnN0eWxlZE1vZGUpe3ZhciBwPWguc2hhZG93R3JvdXA7biYmIXAmJihwPWguc2hhZG93R3JvdXA9ZS5nKFwic2hhZG93XCIpLmFkZChhLnNoYWRvd0dyb3VwKSk7cCYmcC5hdHRyKGIpO2M9YS5wb2ludEF0dHJpYnMoaCxoLnNlbGVjdGVkJiZcInNlbGVjdFwiKX1oLmRlbGF5ZWRSZW5kZXJpbmc/KGwuc2V0UmFkaWFsUmVmZXJlbmNlKGEuY2VudGVyKS5hdHRyKHQpLmF0dHIoYiksZi5zdHlsZWRNb2RlfHxsLmF0dHIoYykuYXR0cih7XCJzdHJva2UtbGluZWpvaW5cIjpcInJvdW5kXCJ9KS5zaGFkb3cobixwKSxoLmRlbGF5ZWRSZW5kZXJpbmc9ITEpOihsLnNldFJhZGlhbFJlZmVyZW5jZShhLmNlbnRlciksZi5zdHlsZWRNb2RlfHxnKCEwLHcsYyksZyghMCx3LHQsYiksbC5hbmltYXRlKHcpKTtsLmF0dHIoe3Zpc2liaWxpdHk6aC52aXNpYmxlP1xuXCJpbmhlcml0XCI6XCJoaWRkZW5cIn0pO2wuYWRkQ2xhc3MoaC5nZXRDbGFzc05hbWUoKSl9ZWxzZSBsJiYoaC5ncmFwaGljPWwuZGVzdHJveSgpKX0pfSxkcmF3UG9pbnRzOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5jaGFydC5yZW5kZXJlcjt0aGlzLnBvaW50cy5mb3JFYWNoKGZ1bmN0aW9uKGYpe2YuZ3JhcGhpY3x8KGYuZ3JhcGhpYz1hW2Yuc2hhcGVUeXBlXShmLnNoYXBlQXJncykuYWRkKGYuc2VyaWVzLmdyb3VwKSxmLmRlbGF5ZWRSZW5kZXJpbmc9ITApfSl9LHNlYXJjaFBvaW50OnYsc29ydEJ5QW5nbGU6ZnVuY3Rpb24oYSxmKXthLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gdm9pZCAwIT09YS5hbmdsZSYmKGIuYW5nbGUtYS5hbmdsZSkqZn0pfSxkcmF3TGVnZW5kU3ltYm9sOmEuTGVnZW5kU3ltYm9sTWl4aW4uZHJhd1JlY3RhbmdsZSxnZXRDZW50ZXI6QS5nZXRDZW50ZXIsZ2V0U3ltYm9sOnZ9LHtpbml0OmZ1bmN0aW9uKCl7eS5wcm90b3R5cGUuaW5pdC5hcHBseSh0aGlzLFxuYXJndW1lbnRzKTt2YXIgYT10aGlzLGY7YS5uYW1lPXgoYS5uYW1lLFwiU2xpY2VcIik7Zj1mdW5jdGlvbihlKXthLnNsaWNlKFwic2VsZWN0XCI9PT1lLnR5cGUpfTtDKGEsXCJzZWxlY3RcIixmKTtDKGEsXCJ1bnNlbGVjdFwiLGYpO3JldHVybiBhfSxpc1ZhbGlkOmZ1bmN0aW9uKCl7cmV0dXJuIGEuaXNOdW1iZXIodGhpcy55LCEwKSYmMDw9dGhpcy55fSxzZXRWaXNpYmxlOmZ1bmN0aW9uKGEsZil7dmFyIGU9dGhpcyxiPWUuc2VyaWVzLGc9Yi5jaGFydCxjPWIub3B0aW9ucy5pZ25vcmVIaWRkZW5Qb2ludDtmPXgoZixjKTthIT09ZS52aXNpYmxlJiYoZS52aXNpYmxlPWUub3B0aW9ucy52aXNpYmxlPWE9dm9pZCAwPT09YT8hZS52aXNpYmxlOmEsYi5vcHRpb25zLmRhdGFbYi5kYXRhLmluZGV4T2YoZSldPWUub3B0aW9ucyxbXCJncmFwaGljXCIsXCJkYXRhTGFiZWxcIixcImNvbm5lY3RvclwiLFwic2hhZG93R3JvdXBcIl0uZm9yRWFjaChmdW5jdGlvbihiKXtpZihlW2JdKWVbYl1bYT9cInNob3dcIjpcImhpZGVcIl0oITApfSksXG5lLmxlZ2VuZEl0ZW0mJmcubGVnZW5kLmNvbG9yaXplSXRlbShlLGEpLGF8fFwiaG92ZXJcIiE9PWUuc3RhdGV8fGUuc2V0U3RhdGUoXCJcIiksYyYmKGIuaXNEaXJ0eT0hMCksZiYmZy5yZWRyYXcoKSl9LHNsaWNlOmZ1bmN0aW9uKGEsZyxlKXt2YXIgYj10aGlzLnNlcmllcztmKGUsYi5jaGFydCk7eChnLCEwKTt0aGlzLnNsaWNlZD10aGlzLm9wdGlvbnMuc2xpY2VkPUUoYSk/YTohdGhpcy5zbGljZWQ7Yi5vcHRpb25zLmRhdGFbYi5kYXRhLmluZGV4T2YodGhpcyldPXRoaXMub3B0aW9uczt0aGlzLmdyYXBoaWMuYW5pbWF0ZSh0aGlzLmdldFRyYW5zbGF0ZSgpKTt0aGlzLnNoYWRvd0dyb3VwJiZ0aGlzLnNoYWRvd0dyb3VwLmFuaW1hdGUodGhpcy5nZXRUcmFuc2xhdGUoKSl9LGdldFRyYW5zbGF0ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnNsaWNlZD90aGlzLnNsaWNlZFRyYW5zbGF0aW9uOnt0cmFuc2xhdGVYOjAsdHJhbnNsYXRlWTowfX0saGFsb1BhdGg6ZnVuY3Rpb24oYSl7dmFyIGY9XG50aGlzLnNoYXBlQXJncztyZXR1cm4gdGhpcy5zbGljZWR8fCF0aGlzLnZpc2libGU/W106dGhpcy5zZXJpZXMuY2hhcnQucmVuZGVyZXIuc3ltYm9scy5hcmMoZi54LGYueSxmLnIrYSxmLnIrYSx7aW5uZXJSOnRoaXMuc2hhcGVBcmdzLnItMSxzdGFydDpmLnN0YXJ0LGVuZDpmLmVuZH0pfSxjb25uZWN0b3JTaGFwZXM6e2ZpeGVkT2Zmc2V0OmZ1bmN0aW9uKGEsZixlKXt2YXIgYj1mLmJyZWFrQXQ7Zj1mLnRvdWNoaW5nU2xpY2VBdDtyZXR1cm5bXCJNXCIsYS54LGEueV0uY29uY2F0KGUuc29mdENvbm5lY3Rvcj9bXCJDXCIsYS54KyhcImxlZnRcIj09PWEuYWxpZ25tZW50Py01OjUpLGEueSwyKmIueC1mLngsMipiLnktZi55LGIueCxiLnldOltcIkxcIixiLngsYi55XSkuY29uY2F0KFtcIkxcIixmLngsZi55XSl9LHN0cmFpZ2h0OmZ1bmN0aW9uKGEsZil7Zj1mLnRvdWNoaW5nU2xpY2VBdDtyZXR1cm5bXCJNXCIsYS54LGEueSxcIkxcIixmLngsZi55XX0sY3Jvb2tlZExpbmU6ZnVuY3Rpb24oZixnLGUpe2c9XG5nLnRvdWNoaW5nU2xpY2VBdDt2YXIgYj10aGlzLnNlcmllcyxoPWIuY2VudGVyWzBdLGM9Yi5jaGFydC5wbG90V2lkdGgsdD1iLmNoYXJ0LnBsb3RMZWZ0LGI9Zi5hbGlnbm1lbnQscj10aGlzLnNoYXBlQXJncy5yO2U9YS5yZWxhdGl2ZUxlbmd0aChlLmNyb29rRGlzdGFuY2UsMSk7ZT1cImxlZnRcIj09PWI/aCtyKyhjK3QtaC1yKSooMS1lKTp0KyhoLXIpKmU7aD1bXCJMXCIsZSxmLnldO2lmKFwibGVmdFwiPT09Yj9lPmYueHx8ZTxnLng6ZTxmLnh8fGU+Zy54KWg9W107cmV0dXJuW1wiTVwiLGYueCxmLnldLmNvbmNhdChoKS5jb25jYXQoW1wiTFwiLGcueCxnLnldKX19LGdldENvbm5lY3RvclBhdGg6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmxhYmVsUG9zaXRpb24sZj10aGlzLnNlcmllcy5vcHRpb25zLmRhdGFMYWJlbHMsZT1mLmNvbm5lY3RvclNoYXBlLGI9dGhpcy5jb25uZWN0b3JTaGFwZXM7YltlXSYmKGU9YltlXSk7cmV0dXJuIGUuY2FsbCh0aGlzLHt4OmEuZmluYWwueCx5OmEuZmluYWwueSxcbmFsaWdubWVudDphLmFsaWdubWVudH0sYS5jb25uZWN0b3JQb3NpdGlvbixmKX19KX0pO0koSCxcInBhcnRzL0RhdGFMYWJlbHMuanNcIixbSFtcInBhcnRzL0dsb2JhbHMuanNcIl1dLGZ1bmN0aW9uKGEpe3ZhciBDPWEuYXJyYXlNYXgsQT1hLmRlZmluZWQsRT1hLmV4dGVuZCxtPWEuZm9ybWF0LGc9YS5tZXJnZSx2PWEubm9vcCx4PWEucGljayx5PWEucmVsYXRpdmVMZW5ndGgsej1hLlNlcmllcyxuPWEuc2VyaWVzVHlwZXMsZj1hLnN0YWJsZVNvcnQsaD1hLmlzQXJyYXkscj1hLnNwbGF0O2EuZGlzdHJpYnV0ZT1mdW5jdGlvbihlLGIsZyl7ZnVuY3Rpb24gYyhhLGIpe3JldHVybiBhLnRhcmdldC1iLnRhcmdldH12YXIgaCxsPSEwLHc9ZSxyPVtdLHA7cD0wO3ZhciBkPXcucmVkdWNlZExlbnx8Yjtmb3IoaD1lLmxlbmd0aDtoLS07KXArPWVbaF0uc2l6ZTtpZihwPmQpe2YoZSxmdW5jdGlvbihhLGIpe3JldHVybihiLnJhbmt8fDApLShhLnJhbmt8fDApfSk7Zm9yKHA9aD0wO3A8PWQ7KXArPVxuZVtoXS5zaXplLGgrKztyPWUuc3BsaWNlKGgtMSxlLmxlbmd0aCl9ZihlLGMpO2ZvcihlPWUubWFwKGZ1bmN0aW9uKGEpe3JldHVybntzaXplOmEuc2l6ZSx0YXJnZXRzOlthLnRhcmdldF0sYWxpZ246eChhLmFsaWduLC41KX19KTtsOyl7Zm9yKGg9ZS5sZW5ndGg7aC0tOylsPWVbaF0scD0oTWF0aC5taW4uYXBwbHkoMCxsLnRhcmdldHMpK01hdGgubWF4LmFwcGx5KDAsbC50YXJnZXRzKSkvMixsLnBvcz1NYXRoLm1pbihNYXRoLm1heCgwLHAtbC5zaXplKmwuYWxpZ24pLGItbC5zaXplKTtoPWUubGVuZ3RoO2ZvcihsPSExO2gtLTspMDxoJiZlW2gtMV0ucG9zK2VbaC0xXS5zaXplPmVbaF0ucG9zJiYoZVtoLTFdLnNpemUrPWVbaF0uc2l6ZSxlW2gtMV0udGFyZ2V0cz1lW2gtMV0udGFyZ2V0cy5jb25jYXQoZVtoXS50YXJnZXRzKSxlW2gtMV0uYWxpZ249LjUsZVtoLTFdLnBvcytlW2gtMV0uc2l6ZT5iJiYoZVtoLTFdLnBvcz1iLWVbaC0xXS5zaXplKSxlLnNwbGljZShoLDEpLGw9XG4hMCl9dy5wdXNoLmFwcGx5KHcscik7aD0wO2Uuc29tZShmdW5jdGlvbihkKXt2YXIgYz0wO2lmKGQudGFyZ2V0cy5zb21lKGZ1bmN0aW9uKCl7d1toXS5wb3M9ZC5wb3MrYztpZihNYXRoLmFicyh3W2hdLnBvcy13W2hdLnRhcmdldCk+ZylyZXR1cm4gdy5zbGljZSgwLGgrMSkuZm9yRWFjaChmdW5jdGlvbihhKXtkZWxldGUgYS5wb3N9KSx3LnJlZHVjZWRMZW49KHcucmVkdWNlZExlbnx8YiktLjEqYix3LnJlZHVjZWRMZW4+LjEqYiYmYS5kaXN0cmlidXRlKHcsYixnKSwhMDtjKz13W2hdLnNpemU7aCsrfSkpcmV0dXJuITB9KTtmKHcsYyl9O3oucHJvdG90eXBlLmRyYXdEYXRhTGFiZWxzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShhLGIpe3ZhciBkPWIuZmlsdGVyO3JldHVybiBkPyhiPWQub3BlcmF0b3IsYT1hW2QucHJvcGVydHldLGQ9ZC52YWx1ZSxcIlxceDNlXCI9PT1iJiZhPmR8fFwiXFx4M2NcIj09PWImJmE8ZHx8XCJcXHgzZVxceDNkXCI9PT1iJiZhPj1kfHxcIlxceDNjXFx4M2RcIj09PWImJmE8PVxuZHx8XCJcXHgzZFxceDNkXCI9PT1iJiZhPT1kfHxcIlxceDNkXFx4M2RcXHgzZFwiPT09YiYmYT09PWQ/ITA6ITEpOiEwfWZ1bmN0aW9uIGIoYSxiKXt2YXIgZD1bXSxjO2lmKGgoYSkmJiFoKGIpKWQ9YS5tYXAoZnVuY3Rpb24oYSl7cmV0dXJuIGcoYSxiKX0pO2Vsc2UgaWYoaChiKSYmIWgoYSkpZD1iLm1hcChmdW5jdGlvbihiKXtyZXR1cm4gZyhhLGIpfSk7ZWxzZSBpZihoKGEpfHxoKGIpKWZvcihjPU1hdGgubWF4KGEubGVuZ3RoLGIubGVuZ3RoKTtjLS07KWRbY109ZyhhW2NdLGJbY10pO2Vsc2UgZD1nKGEsYik7cmV0dXJuIGR9dmFyIGY9dGhpcyxjPWYuY2hhcnQsdD1mLm9wdGlvbnMsbj10LmRhdGFMYWJlbHMsdz1mLnBvaW50cyx2LHA9Zi5oYXNSZW5kZXJlZHx8MCxkLGs9YS5hbmltT2JqZWN0KHQuYW5pbWF0aW9uKS5kdXJhdGlvbix1PU1hdGgubWluKGssMjAwKSxEPSFjLnJlbmRlcmVyLmZvckV4cG9ydCYmeChuLmRlZmVyLDA8dSksRz1jLnJlbmRlcmVyLG49YihiKGMub3B0aW9ucy5wbG90T3B0aW9ucyYmXG5jLm9wdGlvbnMucGxvdE9wdGlvbnMuc2VyaWVzJiZjLm9wdGlvbnMucGxvdE9wdGlvbnMuc2VyaWVzLmRhdGFMYWJlbHMsYy5vcHRpb25zLnBsb3RPcHRpb25zJiZjLm9wdGlvbnMucGxvdE9wdGlvbnNbZi50eXBlXSYmYy5vcHRpb25zLnBsb3RPcHRpb25zW2YudHlwZV0uZGF0YUxhYmVscyksbik7YS5maXJlRXZlbnQodGhpcyxcImRyYXdEYXRhTGFiZWxzXCIpO2lmKGgobil8fG4uZW5hYmxlZHx8Zi5faGFzUG9pbnRMYWJlbHMpZD1mLnBsb3RHcm91cChcImRhdGFMYWJlbHNHcm91cFwiLFwiZGF0YS1sYWJlbHNcIixEJiYhcD9cImhpZGRlblwiOlwiaW5oZXJpdFwiLG4uekluZGV4fHw2KSxEJiYoZC5hdHRyKHtvcGFjaXR5OitwfSkscHx8c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPWYuZGF0YUxhYmVsc0dyb3VwO2EmJihmLnZpc2libGUmJmQuc2hvdyghMCksYVt0LmFuaW1hdGlvbj9cImFuaW1hdGVcIjpcImF0dHJcIl0oe29wYWNpdHk6MX0se2R1cmF0aW9uOnV9KSl9LGstdSkpLHcuZm9yRWFjaChmdW5jdGlvbihrKXt2PVxucihiKG4say5kbE9wdGlvbnN8fGsub3B0aW9ucyYmay5vcHRpb25zLmRhdGFMYWJlbHMpKTt2LmZvckVhY2goZnVuY3Rpb24oYixnKXt2YXIgcD1iLmVuYWJsZWQmJighay5pc051bGx8fGsuZGF0YUxhYmVsT25OdWxsKSYmZShrLGIpLGgsbCx1LHEsdz1rLmRhdGFMYWJlbHM/ay5kYXRhTGFiZWxzW2ddOmsuZGF0YUxhYmVsLHI9ay5jb25uZWN0b3JzP2suY29ubmVjdG9yc1tnXTprLmNvbm5lY3RvcixuPSF3O3AmJihoPWsuZ2V0TGFiZWxDb25maWcoKSxsPXgoYltrLmZvcm1hdFByZWZpeCtcIkZvcm1hdFwiXSxiLmZvcm1hdCksaD1BKGwpP20obCxoLGMudGltZSk6KGJbay5mb3JtYXRQcmVmaXgrXCJGb3JtYXR0ZXJcIl18fGIuZm9ybWF0dGVyKS5jYWxsKGgsYiksbD1iLnN0eWxlLHU9Yi5yb3RhdGlvbixjLnN0eWxlZE1vZGV8fChsLmNvbG9yPXgoYi5jb2xvcixsLmNvbG9yLGYuY29sb3IsXCIjMDAwMDAwXCIpLFwiY29udHJhc3RcIj09PWwuY29sb3ImJihrLmNvbnRyYXN0Q29sb3I9Ry5nZXRDb250cmFzdChrLmNvbG9yfHxcbmYuY29sb3IpLGwuY29sb3I9Yi5pbnNpZGV8fDA+eChiLmRpc3RhbmNlLGsubGFiZWxEaXN0YW5jZSl8fHQuc3RhY2tpbmc/ay5jb250cmFzdENvbG9yOlwiIzAwMDAwMFwiKSx0LmN1cnNvciYmKGwuY3Vyc29yPXQuY3Vyc29yKSkscT17cjpiLmJvcmRlclJhZGl1c3x8MCxyb3RhdGlvbjp1LHBhZGRpbmc6Yi5wYWRkaW5nLHpJbmRleDoxfSxjLnN0eWxlZE1vZGV8fChxLmZpbGw9Yi5iYWNrZ3JvdW5kQ29sb3IscS5zdHJva2U9Yi5ib3JkZXJDb2xvcixxW1wic3Ryb2tlLXdpZHRoXCJdPWIuYm9yZGVyV2lkdGgpLGEub2JqZWN0RWFjaChxLGZ1bmN0aW9uKGEsYil7dm9pZCAwPT09YSYmZGVsZXRlIHFbYl19KSk7IXd8fHAmJkEoaCk/cCYmQShoKSYmKHc/cS50ZXh0PWg6KGsuZGF0YUxhYmVscz1rLmRhdGFMYWJlbHN8fFtdLHc9ay5kYXRhTGFiZWxzW2ddPXU/Ry50ZXh0KGgsMCwtOTk5OSkuYWRkQ2xhc3MoXCJoaWdoY2hhcnRzLWRhdGEtbGFiZWxcIik6Ry5sYWJlbChoLDAsLTk5OTksYi5zaGFwZSxcbm51bGwsbnVsbCxiLnVzZUhUTUwsbnVsbCxcImRhdGEtbGFiZWxcIiksZ3x8KGsuZGF0YUxhYmVsPXcpLHcuYWRkQ2xhc3MoXCIgaGlnaGNoYXJ0cy1kYXRhLWxhYmVsLWNvbG9yLVwiK2suY29sb3JJbmRleCtcIiBcIisoYi5jbGFzc05hbWV8fFwiXCIpKyhiLnVzZUhUTUw/XCIgaGlnaGNoYXJ0cy10cmFja2VyXCI6XCJcIikpKSx3Lm9wdGlvbnM9Yix3LmF0dHIocSksYy5zdHlsZWRNb2RlfHx3LmNzcyhsKS5zaGFkb3coYi5zaGFkb3cpLHcuYWRkZWR8fHcuYWRkKGQpLGIudGV4dFBhdGgmJiFiLnVzZUhUTUwmJncuc2V0VGV4dFBhdGgoay5nZXREYXRhTGFiZWxQYXRoJiZrLmdldERhdGFMYWJlbFBhdGgodyl8fGsuZ3JhcGhpYyxiLnRleHRQYXRoKSxmLmFsaWduRGF0YUxhYmVsKGssdyxiLG51bGwsbikpOihrLmRhdGFMYWJlbD1rLmRhdGFMYWJlbCYmay5kYXRhTGFiZWwuZGVzdHJveSgpLGsuZGF0YUxhYmVscyYmKDE9PT1rLmRhdGFMYWJlbHMubGVuZ3RoP2RlbGV0ZSBrLmRhdGFMYWJlbHM6ZGVsZXRlIGsuZGF0YUxhYmVsc1tnXSksXG5nfHxkZWxldGUgay5kYXRhTGFiZWwsciYmKGsuY29ubmVjdG9yPWsuY29ubmVjdG9yLmRlc3Ryb3koKSxrLmNvbm5lY3RvcnMmJigxPT09ay5jb25uZWN0b3JzLmxlbmd0aD9kZWxldGUgay5jb25uZWN0b3JzOmRlbGV0ZSBrLmNvbm5lY3RvcnNbZ10pKSl9KX0pO2EuZmlyZUV2ZW50KHRoaXMsXCJhZnRlckRyYXdEYXRhTGFiZWxzXCIpfTt6LnByb3RvdHlwZS5hbGlnbkRhdGFMYWJlbD1mdW5jdGlvbihhLGIsZixjLGcpe3ZhciBlPXRoaXMuY2hhcnQsaD10aGlzLmlzQ2FydGVzaWFuJiZlLmludmVydGVkLGw9eChhLmRsQm94JiZhLmRsQm94LmNlbnRlclgsYS5wbG90WCwtOTk5OSkscD14KGEucGxvdFksLTk5OTkpLGQ9Yi5nZXRCQm94KCksayx1PWYucm90YXRpb24sdD1mLmFsaWduLHI9dGhpcy52aXNpYmxlJiYoYS5zZXJpZXMuZm9yY2VETHx8ZS5pc0luc2lkZVBsb3QobCxNYXRoLnJvdW5kKHApLGgpfHxjJiZlLmlzSW5zaWRlUGxvdChsLGg/Yy54KzE6Yy55K2MuaGVpZ2h0LTEsaCkpLFxucT1cImp1c3RpZnlcIj09PXgoZi5vdmVyZmxvdyxcImp1c3RpZnlcIik7aWYociYmKGs9ZS5yZW5kZXJlci5mb250TWV0cmljcyhlLnN0eWxlZE1vZGU/dm9pZCAwOmYuc3R5bGUuZm9udFNpemUsYikuYixjPUUoe3g6aD90aGlzLnlBeGlzLmxlbi1wOmwseTpNYXRoLnJvdW5kKGg/dGhpcy54QXhpcy5sZW4tbDpwKSx3aWR0aDowLGhlaWdodDowfSxjKSxFKGYse3dpZHRoOmQud2lkdGgsaGVpZ2h0OmQuaGVpZ2h0fSksdT8ocT0hMSxsPWUucmVuZGVyZXIucm90Q29ycihrLHUpLGw9e3g6Yy54K2YueCtjLndpZHRoLzIrbC54LHk6Yy55K2YueSt7dG9wOjAsbWlkZGxlOi41LGJvdHRvbToxfVtmLnZlcnRpY2FsQWxpZ25dKmMuaGVpZ2h0fSxiW2c/XCJhdHRyXCI6XCJhbmltYXRlXCJdKGwpLmF0dHIoe2FsaWduOnR9KSxwPSh1KzcyMCklMzYwLHA9MTgwPHAmJjM2MD5wLFwibGVmdFwiPT09dD9sLnktPXA/ZC5oZWlnaHQ6MDpcImNlbnRlclwiPT09dD8obC54LT1kLndpZHRoLzIsbC55LT1kLmhlaWdodC8yKTpcblwicmlnaHRcIj09PXQmJihsLngtPWQud2lkdGgsbC55LT1wPzA6ZC5oZWlnaHQpLGIucGxhY2VkPSEwLGIuYWxpZ25BdHRyPWwpOihiLmFsaWduKGYsbnVsbCxjKSxsPWIuYWxpZ25BdHRyKSxxJiYwPD1jLmhlaWdodD9hLmlzTGFiZWxKdXN0aWZpZWQ9dGhpcy5qdXN0aWZ5RGF0YUxhYmVsKGIsZixsLGQsYyxnKTp4KGYuY3JvcCwhMCkmJihyPWUuaXNJbnNpZGVQbG90KGwueCxsLnkpJiZlLmlzSW5zaWRlUGxvdChsLngrZC53aWR0aCxsLnkrZC5oZWlnaHQpKSxmLnNoYXBlJiYhdSkpYltnP1wiYXR0clwiOlwiYW5pbWF0ZVwiXSh7YW5jaG9yWDpoP2UucGxvdFdpZHRoLWEucGxvdFk6YS5wbG90WCxhbmNob3JZOmg/ZS5wbG90SGVpZ2h0LWEucGxvdFg6YS5wbG90WX0pO3J8fChiLmF0dHIoe3k6LTk5OTl9KSxiLnBsYWNlZD0hMSl9O3oucHJvdG90eXBlLmp1c3RpZnlEYXRhTGFiZWw9ZnVuY3Rpb24oYSxiLGYsYyxnLGgpe3ZhciBlPXRoaXMuY2hhcnQsbD1iLmFsaWduLHA9Yi52ZXJ0aWNhbEFsaWduLFxuZCxrLHU9YS5ib3g/MDphLnBhZGRpbmd8fDA7ZD1mLngrdTswPmQmJihcInJpZ2h0XCI9PT1sP2IuYWxpZ249XCJsZWZ0XCI6Yi54PS1kLGs9ITApO2Q9Zi54K2Mud2lkdGgtdTtkPmUucGxvdFdpZHRoJiYoXCJsZWZ0XCI9PT1sP2IuYWxpZ249XCJyaWdodFwiOmIueD1lLnBsb3RXaWR0aC1kLGs9ITApO2Q9Zi55K3U7MD5kJiYoXCJib3R0b21cIj09PXA/Yi52ZXJ0aWNhbEFsaWduPVwidG9wXCI6Yi55PS1kLGs9ITApO2Q9Zi55K2MuaGVpZ2h0LXU7ZD5lLnBsb3RIZWlnaHQmJihcInRvcFwiPT09cD9iLnZlcnRpY2FsQWxpZ249XCJib3R0b21cIjpiLnk9ZS5wbG90SGVpZ2h0LWQsaz0hMCk7ayYmKGEucGxhY2VkPSFoLGEuYWxpZ24oYixudWxsLGcpKTtyZXR1cm4ga307bi5waWUmJihuLnBpZS5wcm90b3R5cGUuZGF0YUxhYmVsUG9zaXRpb25lcnM9e3JhZGlhbERpc3RyaWJ1dGlvblk6ZnVuY3Rpb24oYSl7cmV0dXJuIGEudG9wK2EuZGlzdHJpYnV0ZUJveC5wb3N9LHJhZGlhbERpc3RyaWJ1dGlvblg6ZnVuY3Rpb24oYSxcbmIsZixjKXtyZXR1cm4gYS5nZXRYKGY8Yi50b3ArMnx8Zj5iLmJvdHRvbS0yP2M6ZixiLmhhbGYsYil9LGp1c3RpZnk6ZnVuY3Rpb24oYSxiLGYpe3JldHVybiBmWzBdKyhhLmhhbGY/LTE6MSkqKGIrYS5sYWJlbERpc3RhbmNlKX0sYWxpZ25Ub1Bsb3RFZGdlczpmdW5jdGlvbihhLGIsZixjKXthPWEuZ2V0QkJveCgpLndpZHRoO3JldHVybiBiP2ErYzpmLWEtY30sYWxpZ25Ub0Nvbm5lY3RvcnM6ZnVuY3Rpb24oYSxiLGYsYyl7dmFyIGU9MCxnO2EuZm9yRWFjaChmdW5jdGlvbihhKXtnPWEuZGF0YUxhYmVsLmdldEJCb3goKS53aWR0aDtnPmUmJihlPWcpfSk7cmV0dXJuIGI/ZStjOmYtZS1jfX0sbi5waWUucHJvdG90eXBlLmRyYXdEYXRhTGFiZWxzPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcyxiPWUuZGF0YSxmLGM9ZS5jaGFydCxoPWUub3B0aW9ucy5kYXRhTGFiZWxzLHI9aC5jb25uZWN0b3JQYWRkaW5nLHcsbj1jLnBsb3RXaWR0aCxwPWMucGxvdEhlaWdodCxkPWMucGxvdExlZnQsaz1cbk1hdGgucm91bmQoYy5jaGFydFdpZHRoLzMpLHUsbT1lLmNlbnRlcix2PW1bMl0vMixxPW1bMV0seSxOLE8sTCxFPVtbXSxbXV0sTSxKLEgsSSxQPVswLDAsMCwwXSxTPWUuZGF0YUxhYmVsUG9zaXRpb25lcnMsVztlLnZpc2libGUmJihoLmVuYWJsZWR8fGUuX2hhc1BvaW50TGFiZWxzKSYmKGIuZm9yRWFjaChmdW5jdGlvbihhKXthLmRhdGFMYWJlbCYmYS52aXNpYmxlJiZhLmRhdGFMYWJlbC5zaG9ydGVuZWQmJihhLmRhdGFMYWJlbC5hdHRyKHt3aWR0aDpcImF1dG9cIn0pLmNzcyh7d2lkdGg6XCJhdXRvXCIsdGV4dE92ZXJmbG93OlwiY2xpcFwifSksYS5kYXRhTGFiZWwuc2hvcnRlbmVkPSExKX0pLHoucHJvdG90eXBlLmRyYXdEYXRhTGFiZWxzLmFwcGx5KGUpLGIuZm9yRWFjaChmdW5jdGlvbihhKXthLmRhdGFMYWJlbCYmKGEudmlzaWJsZT8oRVthLmhhbGZdLnB1c2goYSksYS5kYXRhTGFiZWwuX3Bvcz1udWxsLCFBKGguc3R5bGUud2lkdGgpJiYhQShhLm9wdGlvbnMuZGF0YUxhYmVscyYmXG5hLm9wdGlvbnMuZGF0YUxhYmVscy5zdHlsZSYmYS5vcHRpb25zLmRhdGFMYWJlbHMuc3R5bGUud2lkdGgpJiZhLmRhdGFMYWJlbC5nZXRCQm94KCkud2lkdGg+ayYmKGEuZGF0YUxhYmVsLmNzcyh7d2lkdGg6Ljcqa30pLGEuZGF0YUxhYmVsLnNob3J0ZW5lZD0hMCkpOihhLmRhdGFMYWJlbD1hLmRhdGFMYWJlbC5kZXN0cm95KCksYS5kYXRhTGFiZWxzJiYxPT09YS5kYXRhTGFiZWxzLmxlbmd0aCYmZGVsZXRlIGEuZGF0YUxhYmVscykpfSksRS5mb3JFYWNoKGZ1bmN0aW9uKGIsayl7dmFyIGcsbCx1PWIubGVuZ3RoLHQ9W10sdztpZih1KWZvcihlLnNvcnRCeUFuZ2xlKGIsay0uNSksMDxlLm1heExhYmVsRGlzdGFuY2UmJihnPU1hdGgubWF4KDAscS12LWUubWF4TGFiZWxEaXN0YW5jZSksbD1NYXRoLm1pbihxK3YrZS5tYXhMYWJlbERpc3RhbmNlLGMucGxvdEhlaWdodCksYi5mb3JFYWNoKGZ1bmN0aW9uKGEpezA8YS5sYWJlbERpc3RhbmNlJiZhLmRhdGFMYWJlbCYmKGEudG9wPU1hdGgubWF4KDAsXG5xLXYtYS5sYWJlbERpc3RhbmNlKSxhLmJvdHRvbT1NYXRoLm1pbihxK3YrYS5sYWJlbERpc3RhbmNlLGMucGxvdEhlaWdodCksdz1hLmRhdGFMYWJlbC5nZXRCQm94KCkuaGVpZ2h0fHwyMSxhLmRpc3RyaWJ1dGVCb3g9e3RhcmdldDphLmxhYmVsUG9zaXRpb24ubmF0dXJhbC55LWEudG9wK3cvMixzaXplOncscmFuazphLnl9LHQucHVzaChhLmRpc3RyaWJ1dGVCb3gpKX0pLGc9bCt3LWcsYS5kaXN0cmlidXRlKHQsZyxnLzUpKSxJPTA7STx1O0krKyl7Zj1iW0ldO089Zi5sYWJlbFBvc2l0aW9uO3k9Zi5kYXRhTGFiZWw7SD0hMT09PWYudmlzaWJsZT9cImhpZGRlblwiOlwiaW5oZXJpdFwiO0o9Zz1PLm5hdHVyYWwueTt0JiZBKGYuZGlzdHJpYnV0ZUJveCkmJih2b2lkIDA9PT1mLmRpc3RyaWJ1dGVCb3gucG9zP0g9XCJoaWRkZW5cIjooTD1mLmRpc3RyaWJ1dGVCb3guc2l6ZSxKPVMucmFkaWFsRGlzdHJpYnV0aW9uWShmKSkpO2RlbGV0ZSBmLnBvc2l0aW9uSW5kZXg7aWYoaC5qdXN0aWZ5KU09XG5TLmp1c3RpZnkoZix2LG0pO2Vsc2Ugc3dpdGNoKGguYWxpZ25Ubyl7Y2FzZSBcImNvbm5lY3RvcnNcIjpNPVMuYWxpZ25Ub0Nvbm5lY3RvcnMoYixrLG4sZCk7YnJlYWs7Y2FzZSBcInBsb3RFZGdlc1wiOk09Uy5hbGlnblRvUGxvdEVkZ2VzKHksayxuLGQpO2JyZWFrO2RlZmF1bHQ6TT1TLnJhZGlhbERpc3RyaWJ1dGlvblgoZSxmLEosZyl9eS5fYXR0cj17dmlzaWJpbGl0eTpILGFsaWduOk8uYWxpZ25tZW50fTt5Ll9wb3M9e3g6TStoLngrKHtsZWZ0OnIscmlnaHQ6LXJ9W08uYWxpZ25tZW50XXx8MCkseTpKK2gueS0xMH07Ty5maW5hbC54PU07Ty5maW5hbC55PUo7eChoLmNyb3AsITApJiYoTj15LmdldEJCb3goKS53aWR0aCxnPW51bGwsTS1OPHImJjE9PT1rPyhnPU1hdGgucm91bmQoTi1NK3IpLFBbM109TWF0aC5tYXgoZyxQWzNdKSk6TStOPm4tciYmMD09PWsmJihnPU1hdGgucm91bmQoTStOLW4rciksUFsxXT1NYXRoLm1heChnLFBbMV0pKSwwPkotTC8yP1BbMF09TWF0aC5tYXgoTWF0aC5yb3VuZCgtSitcbkwvMiksUFswXSk6SitMLzI+cCYmKFBbMl09TWF0aC5tYXgoTWF0aC5yb3VuZChKK0wvMi1wKSxQWzJdKSkseS5zaWRlT3ZlcmZsb3c9Zyl9fSksMD09PUMoUCl8fHRoaXMudmVyaWZ5RGF0YUxhYmVsT3ZlcmZsb3coUCkpJiYodGhpcy5wbGFjZURhdGFMYWJlbHMoKSx0aGlzLnBvaW50cy5mb3JFYWNoKGZ1bmN0aW9uKGEpe1c9ZyhoLGEub3B0aW9ucy5kYXRhTGFiZWxzKTtpZih3PXgoVy5jb25uZWN0b3JXaWR0aCwxKSl7dmFyIGI7dT1hLmNvbm5lY3RvcjtpZigoeT1hLmRhdGFMYWJlbCkmJnkuX3BvcyYmYS52aXNpYmxlJiYwPGEubGFiZWxEaXN0YW5jZSl7SD15Ll9hdHRyLnZpc2liaWxpdHk7aWYoYj0hdSlhLmNvbm5lY3Rvcj11PWMucmVuZGVyZXIucGF0aCgpLmFkZENsYXNzKFwiaGlnaGNoYXJ0cy1kYXRhLWxhYmVsLWNvbm5lY3RvciAgaGlnaGNoYXJ0cy1jb2xvci1cIithLmNvbG9ySW5kZXgrKGEuY2xhc3NOYW1lP1wiIFwiK2EuY2xhc3NOYW1lOlwiXCIpKS5hZGQoZS5kYXRhTGFiZWxzR3JvdXApLFxuYy5zdHlsZWRNb2RlfHx1LmF0dHIoe1wic3Ryb2tlLXdpZHRoXCI6dyxzdHJva2U6Vy5jb25uZWN0b3JDb2xvcnx8YS5jb2xvcnx8XCIjNjY2NjY2XCJ9KTt1W2I/XCJhdHRyXCI6XCJhbmltYXRlXCJdKHtkOmEuZ2V0Q29ubmVjdG9yUGF0aCgpfSk7dS5hdHRyKFwidmlzaWJpbGl0eVwiLEgpfWVsc2UgdSYmKGEuY29ubmVjdG9yPXUuZGVzdHJveSgpKX19KSl9LG4ucGllLnByb3RvdHlwZS5wbGFjZURhdGFMYWJlbHM9ZnVuY3Rpb24oKXt0aGlzLnBvaW50cy5mb3JFYWNoKGZ1bmN0aW9uKGEpe3ZhciBiPWEuZGF0YUxhYmVsLGU7YiYmYS52aXNpYmxlJiYoKGU9Yi5fcG9zKT8oYi5zaWRlT3ZlcmZsb3cmJihiLl9hdHRyLndpZHRoPU1hdGgubWF4KGIuZ2V0QkJveCgpLndpZHRoLWIuc2lkZU92ZXJmbG93LDApLGIuY3NzKHt3aWR0aDpiLl9hdHRyLndpZHRoK1wicHhcIix0ZXh0T3ZlcmZsb3c6KHRoaXMub3B0aW9ucy5kYXRhTGFiZWxzLnN0eWxlfHx7fSkudGV4dE92ZXJmbG93fHxcImVsbGlwc2lzXCJ9KSxcbmIuc2hvcnRlbmVkPSEwKSxiLmF0dHIoYi5fYXR0ciksYltiLm1vdmVkP1wiYW5pbWF0ZVwiOlwiYXR0clwiXShlKSxiLm1vdmVkPSEwKTpiJiZiLmF0dHIoe3k6LTk5OTl9KSk7ZGVsZXRlIGEuZGlzdHJpYnV0ZUJveH0sdGhpcyl9LG4ucGllLnByb3RvdHlwZS5hbGlnbkRhdGFMYWJlbD12LG4ucGllLnByb3RvdHlwZS52ZXJpZnlEYXRhTGFiZWxPdmVyZmxvdz1mdW5jdGlvbihhKXt2YXIgYj10aGlzLmNlbnRlcixlPXRoaXMub3B0aW9ucyxjPWUuY2VudGVyLGY9ZS5taW5TaXplfHw4MCxnLGg9bnVsbCE9PWUuc2l6ZTtofHwobnVsbCE9PWNbMF0/Zz1NYXRoLm1heChiWzJdLU1hdGgubWF4KGFbMV0sYVszXSksZik6KGc9TWF0aC5tYXgoYlsyXS1hWzFdLWFbM10sZiksYlswXSs9KGFbM10tYVsxXSkvMiksbnVsbCE9PWNbMV0/Zz1NYXRoLm1heChNYXRoLm1pbihnLGJbMl0tTWF0aC5tYXgoYVswXSxhWzJdKSksZik6KGc9TWF0aC5tYXgoTWF0aC5taW4oZyxiWzJdLWFbMF0tYVsyXSksZiksXG5iWzFdKz0oYVswXS1hWzJdKS8yKSxnPGJbMl0/KGJbMl09ZyxiWzNdPU1hdGgubWluKHkoZS5pbm5lclNpemV8fDAsZyksZyksdGhpcy50cmFuc2xhdGUoYiksdGhpcy5kcmF3RGF0YUxhYmVscyYmdGhpcy5kcmF3RGF0YUxhYmVscygpKTpoPSEwKTtyZXR1cm4gaH0pO24uY29sdW1uJiYobi5jb2x1bW4ucHJvdG90eXBlLmFsaWduRGF0YUxhYmVsPWZ1bmN0aW9uKGEsYixmLGMsaCl7dmFyIGU9dGhpcy5jaGFydC5pbnZlcnRlZCxsPWEuc2VyaWVzLHQ9YS5kbEJveHx8YS5zaGFwZUFyZ3MscD14KGEuYmVsb3csYS5wbG90WT54KHRoaXMudHJhbnNsYXRlZFRocmVzaG9sZCxsLnlBeGlzLmxlbikpLGQ9eChmLmluc2lkZSwhIXRoaXMub3B0aW9ucy5zdGFja2luZyk7dCYmKGM9Zyh0KSwwPmMueSYmKGMuaGVpZ2h0Kz1jLnksYy55PTApLHQ9Yy55K2MuaGVpZ2h0LWwueUF4aXMubGVuLDA8dCYmKGMuaGVpZ2h0LT10KSxlJiYoYz17eDpsLnlBeGlzLmxlbi1jLnktYy5oZWlnaHQseTpsLnhBeGlzLmxlbi1cbmMueC1jLndpZHRoLHdpZHRoOmMuaGVpZ2h0LGhlaWdodDpjLndpZHRofSksZHx8KGU/KGMueCs9cD8wOmMud2lkdGgsYy53aWR0aD0wKTooYy55Kz1wP2MuaGVpZ2h0OjAsYy5oZWlnaHQ9MCkpKTtmLmFsaWduPXgoZi5hbGlnbiwhZXx8ZD9cImNlbnRlclwiOnA/XCJyaWdodFwiOlwibGVmdFwiKTtmLnZlcnRpY2FsQWxpZ249eChmLnZlcnRpY2FsQWxpZ24sZXx8ZD9cIm1pZGRsZVwiOnA/XCJ0b3BcIjpcImJvdHRvbVwiKTt6LnByb3RvdHlwZS5hbGlnbkRhdGFMYWJlbC5jYWxsKHRoaXMsYSxiLGYsYyxoKTthLmlzTGFiZWxKdXN0aWZpZWQmJmEuY29udHJhc3RDb2xvciYmYi5jc3Moe2NvbG9yOmEuY29udHJhc3RDb2xvcn0pfSl9KTtJKEgsXCJtb2R1bGVzL292ZXJsYXBwaW5nLWRhdGFsYWJlbHMuc3JjLmpzXCIsW0hbXCJwYXJ0cy9HbG9iYWxzLmpzXCJdXSxmdW5jdGlvbihhKXt2YXIgQz1hLkNoYXJ0LEE9YS5pc0FycmF5LEU9YS5vYmplY3RFYWNoLG09YS5waWNrLGc9YS5hZGRFdmVudCx2PWEuZmlyZUV2ZW50O1xuZyhDLFwicmVuZGVyXCIsZnVuY3Rpb24oKXt2YXIgYT1bXTsodGhpcy5sYWJlbENvbGxlY3RvcnN8fFtdKS5mb3JFYWNoKGZ1bmN0aW9uKGcpe2E9YS5jb25jYXQoZygpKX0pOyh0aGlzLnlBeGlzfHxbXSkuZm9yRWFjaChmdW5jdGlvbihnKXtnLm9wdGlvbnMuc3RhY2tMYWJlbHMmJiFnLm9wdGlvbnMuc3RhY2tMYWJlbHMuYWxsb3dPdmVybGFwJiZFKGcuc3RhY2tzLGZ1bmN0aW9uKGcpe0UoZyxmdW5jdGlvbihnKXthLnB1c2goZy5sYWJlbCl9KX0pfSk7KHRoaXMuc2VyaWVzfHxbXSkuZm9yRWFjaChmdW5jdGlvbihnKXt2YXIgdj1nLm9wdGlvbnMuZGF0YUxhYmVscztnLnZpc2libGUmJighMSE9PXYuZW5hYmxlZHx8Zy5faGFzUG9pbnRMYWJlbHMpJiZnLnBvaW50cy5mb3JFYWNoKGZ1bmN0aW9uKGcpe2cudmlzaWJsZSYmKEEoZy5kYXRhTGFiZWxzKT9nLmRhdGFMYWJlbHM6Zy5kYXRhTGFiZWw/W2cuZGF0YUxhYmVsXTpbXSkuZm9yRWFjaChmdW5jdGlvbihmKXt2YXIgaD1mLm9wdGlvbnM7XG5mLmxhYmVscmFuaz1tKGgubGFiZWxyYW5rLGcubGFiZWxyYW5rLGcuc2hhcGVBcmdzJiZnLnNoYXBlQXJncy5oZWlnaHQpO2guYWxsb3dPdmVybGFwfHxhLnB1c2goZil9KX0pfSk7dGhpcy5oaWRlT3ZlcmxhcHBpbmdMYWJlbHMoYSl9KTtDLnByb3RvdHlwZS5oaWRlT3ZlcmxhcHBpbmdMYWJlbHM9ZnVuY3Rpb24oYSl7dmFyIGc9dGhpcyxtPWEubGVuZ3RoLG49Zy5yZW5kZXJlcixmLGgscixlLGIsbCxjPWZ1bmN0aW9uKGEsYixjLGUsZixkLGssZyl7cmV0dXJuIShmPmErY3x8ZitrPGF8fGQ+YitlfHxkK2c8Yil9O3I9ZnVuY3Rpb24oYSl7dmFyIGIsYyxlLGY9YS5ib3g/MDphLnBhZGRpbmd8fDA7ZT0wO2lmKGEmJighYS5hbGlnbkF0dHJ8fGEucGxhY2VkKSlyZXR1cm4gYj1hLmFsaWduQXR0cnx8e3g6YS5hdHRyKFwieFwiKSx5OmEuYXR0cihcInlcIil9LGM9YS5wYXJlbnRHcm91cCxhLndpZHRofHwoZT1hLmdldEJCb3goKSxhLndpZHRoPWUud2lkdGgsYS5oZWlnaHQ9ZS5oZWlnaHQsXG5lPW4uZm9udE1ldHJpY3MobnVsbCxhLmVsZW1lbnQpLmgpLHt4OmIueCsoYy50cmFuc2xhdGVYfHwwKStmLHk6Yi55KyhjLnRyYW5zbGF0ZVl8fDApK2YtZSx3aWR0aDphLndpZHRoLTIqZixoZWlnaHQ6YS5oZWlnaHQtMipmfX07Zm9yKGg9MDtoPG07aCsrKWlmKGY9YVtoXSlmLm9sZE9wYWNpdHk9Zi5vcGFjaXR5LGYubmV3T3BhY2l0eT0xLGYuYWJzb2x1dGVCb3g9cihmKTthLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4oYi5sYWJlbHJhbmt8fDApLShhLmxhYmVscmFua3x8MCl9KTtmb3IoaD0wO2g8bTtoKyspZm9yKGw9KHI9YVtoXSkmJnIuYWJzb2x1dGVCb3gsZj1oKzE7ZjxtOysrZilpZihiPShlPWFbZl0pJiZlLmFic29sdXRlQm94LGwmJmImJnIhPT1lJiYwIT09ci5uZXdPcGFjaXR5JiYwIT09ZS5uZXdPcGFjaXR5JiYoYj1jKGwueCxsLnksbC53aWR0aCxsLmhlaWdodCxiLngsYi55LGIud2lkdGgsYi5oZWlnaHQpKSkoci5sYWJlbHJhbms8ZS5sYWJlbHJhbms/cjplKS5uZXdPcGFjaXR5PVxuMDthLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGIsYzthJiYoYz1hLm5ld09wYWNpdHksYS5vbGRPcGFjaXR5IT09YyYmKGEuYWxpZ25BdHRyJiZhLnBsYWNlZD8oYz9hLnNob3coITApOmI9ZnVuY3Rpb24oKXthLmhpZGUoKX0sYS5hbGlnbkF0dHIub3BhY2l0eT1jLGFbYS5pc09sZD9cImFuaW1hdGVcIjpcImF0dHJcIl0oYS5hbGlnbkF0dHIsbnVsbCxiKSx2KGcsXCJhZnRlckhpZGVPdmVybGFwcGluZ0xhYmVsc1wiKSk6YS5hdHRyKHtvcGFjaXR5OmN9KSksYS5pc09sZD0hMCl9KX19KTtJKEgsXCJwYXJ0cy9JbnRlcmFjdGlvbi5qc1wiLFtIW1wicGFydHMvR2xvYmFscy5qc1wiXV0sZnVuY3Rpb24oYSl7dmFyIEM9YS5hZGRFdmVudCxBPWEuQ2hhcnQsRT1hLmNyZWF0ZUVsZW1lbnQsbT1hLmNzcyxnPWEuZGVmYXVsdE9wdGlvbnMsdj1hLmRlZmF1bHRQbG90T3B0aW9ucyx4PWEuZXh0ZW5kLHk9YS5maXJlRXZlbnQsej1hLmhhc1RvdWNoLG49YS5pc09iamVjdCxmPWEuaXNBcnJheSxoPWEuTGVnZW5kLFxucj1hLm1lcmdlLGU9YS5waWNrLGI9YS5Qb2ludCxsPWEuU2VyaWVzLGM9YS5zZXJpZXNUeXBlcyx0PWEuc3ZnLEY7Rj1hLlRyYWNrZXJNaXhpbj17ZHJhd1RyYWNrZXJQb2ludDpmdW5jdGlvbigpe3ZhciBhPXRoaXMsYj1hLmNoYXJ0LGM9Yi5wb2ludGVyLGQ9ZnVuY3Rpb24oYSl7dmFyIGI9Yy5nZXRQb2ludEZyb21FdmVudChhKTt2b2lkIDAhPT1iJiYoYy5pc0RpcmVjdFRvdWNoPSEwLGIub25Nb3VzZU92ZXIoYSkpfSxlO2EucG9pbnRzLmZvckVhY2goZnVuY3Rpb24oYSl7ZT1mKGEuZGF0YUxhYmVscyk/YS5kYXRhTGFiZWxzOmEuZGF0YUxhYmVsP1thLmRhdGFMYWJlbF06W107YS5ncmFwaGljJiYoYS5ncmFwaGljLmVsZW1lbnQucG9pbnQ9YSk7ZS5mb3JFYWNoKGZ1bmN0aW9uKGIpe2IuZGl2P2IuZGl2LnBvaW50PWE6Yi5lbGVtZW50LnBvaW50PWF9KX0pO2EuX2hhc1RyYWNraW5nfHwoYS50cmFja2VyR3JvdXBzLmZvckVhY2goZnVuY3Rpb24oZSl7aWYoYVtlXSl7YVtlXS5hZGRDbGFzcyhcImhpZ2hjaGFydHMtdHJhY2tlclwiKS5vbihcIm1vdXNlb3ZlclwiLFxuZCkub24oXCJtb3VzZW91dFwiLGZ1bmN0aW9uKGEpe2Mub25UcmFja2VyTW91c2VPdXQoYSl9KTtpZih6KWFbZV0ub24oXCJ0b3VjaHN0YXJ0XCIsZCk7IWIuc3R5bGVkTW9kZSYmYS5vcHRpb25zLmN1cnNvciYmYVtlXS5jc3MobSkuY3NzKHtjdXJzb3I6YS5vcHRpb25zLmN1cnNvcn0pfX0pLGEuX2hhc1RyYWNraW5nPSEwKTt5KHRoaXMsXCJhZnRlckRyYXdUcmFja2VyXCIpfSxkcmF3VHJhY2tlckdyYXBoOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcyxiPWEub3B0aW9ucyxjPWIudHJhY2tCeUFyZWEsZD1bXS5jb25jYXQoYz9hLmFyZWFQYXRoOmEuZ3JhcGhQYXRoKSxlPWQubGVuZ3RoLGY9YS5jaGFydCxnPWYucG9pbnRlcixoPWYucmVuZGVyZXIsbD1mLm9wdGlvbnMudG9vbHRpcC5zbmFwLHI9YS50cmFja2VyLG4sbT1mdW5jdGlvbigpe2lmKGYuaG92ZXJTZXJpZXMhPT1hKWEub25Nb3VzZU92ZXIoKX0sdj1cInJnYmEoMTkyLDE5MiwxOTIsXCIrKHQ/LjAwMDE6LjAwMikrXCIpXCI7aWYoZSYmIWMpZm9yKG49XG5lKzE7bi0tOylcIk1cIj09PWRbbl0mJmQuc3BsaWNlKG4rMSwwLGRbbisxXS1sLGRbbisyXSxcIkxcIiksKG4mJlwiTVwiPT09ZFtuXXx8bj09PWUpJiZkLnNwbGljZShuLDAsXCJMXCIsZFtuLTJdK2wsZFtuLTFdKTtyP3IuYXR0cih7ZDpkfSk6YS5ncmFwaCYmKGEudHJhY2tlcj1oLnBhdGgoZCkuYXR0cih7dmlzaWJpbGl0eTphLnZpc2libGU/XCJ2aXNpYmxlXCI6XCJoaWRkZW5cIix6SW5kZXg6Mn0pLmFkZENsYXNzKGM/XCJoaWdoY2hhcnRzLXRyYWNrZXItYXJlYVwiOlwiaGlnaGNoYXJ0cy10cmFja2VyLWxpbmVcIikuYWRkKGEuZ3JvdXApLGYuc3R5bGVkTW9kZXx8YS50cmFja2VyLmF0dHIoe1wic3Ryb2tlLWxpbmVqb2luXCI6XCJyb3VuZFwiLHN0cm9rZTp2LGZpbGw6Yz92Olwibm9uZVwiLFwic3Ryb2tlLXdpZHRoXCI6YS5ncmFwaC5zdHJva2VXaWR0aCgpKyhjPzA6MipsKX0pLFthLnRyYWNrZXIsYS5tYXJrZXJHcm91cF0uZm9yRWFjaChmdW5jdGlvbihhKXthLmFkZENsYXNzKFwiaGlnaGNoYXJ0cy10cmFja2VyXCIpLm9uKFwibW91c2VvdmVyXCIsXG5tKS5vbihcIm1vdXNlb3V0XCIsZnVuY3Rpb24oYSl7Zy5vblRyYWNrZXJNb3VzZU91dChhKX0pO2IuY3Vyc29yJiYhZi5zdHlsZWRNb2RlJiZhLmNzcyh7Y3Vyc29yOmIuY3Vyc29yfSk7aWYoeilhLm9uKFwidG91Y2hzdGFydFwiLG0pfSkpO3kodGhpcyxcImFmdGVyRHJhd1RyYWNrZXJcIil9fTtjLmNvbHVtbiYmKGMuY29sdW1uLnByb3RvdHlwZS5kcmF3VHJhY2tlcj1GLmRyYXdUcmFja2VyUG9pbnQpO2MucGllJiYoYy5waWUucHJvdG90eXBlLmRyYXdUcmFja2VyPUYuZHJhd1RyYWNrZXJQb2ludCk7Yy5zY2F0dGVyJiYoYy5zY2F0dGVyLnByb3RvdHlwZS5kcmF3VHJhY2tlcj1GLmRyYXdUcmFja2VyUG9pbnQpO3goaC5wcm90b3R5cGUse3NldEl0ZW1FdmVudHM6ZnVuY3Rpb24oYSxjLGUpe3ZhciBkPXRoaXMsZj1kLmNoYXJ0LnJlbmRlcmVyLmJveFdyYXBwZXIsZz1hIGluc3RhbmNlb2YgYixoPVwiaGlnaGNoYXJ0cy1sZWdlbmQtXCIrKGc/XCJwb2ludFwiOlwic2VyaWVzXCIpK1wiLWFjdGl2ZVwiLFxucD1kLmNoYXJ0LnN0eWxlZE1vZGU7KGU/YzphLmxlZ2VuZEdyb3VwKS5vbihcIm1vdXNlb3ZlclwiLGZ1bmN0aW9uKCl7ZC5hbGxJdGVtcy5mb3JFYWNoKGZ1bmN0aW9uKGIpe2EhPT1iJiZiLnNldFN0YXRlKFwiaW5hY3RpdmVcIiwhZyl9KTthLnNldFN0YXRlKFwiaG92ZXJcIik7YS52aXNpYmxlJiZmLmFkZENsYXNzKGgpO3B8fGMuY3NzKGQub3B0aW9ucy5pdGVtSG92ZXJTdHlsZSl9KS5vbihcIm1vdXNlb3V0XCIsZnVuY3Rpb24oKXtkLnN0eWxlZE1vZGV8fGMuY3NzKHIoYS52aXNpYmxlP2QuaXRlbVN0eWxlOmQuaXRlbUhpZGRlblN0eWxlKSk7ZC5hbGxJdGVtcy5mb3JFYWNoKGZ1bmN0aW9uKGIpe2EhPT1iJiZiLnNldFN0YXRlKFwiXCIsIWcpfSk7Zi5yZW1vdmVDbGFzcyhoKTthLnNldFN0YXRlKCl9KS5vbihcImNsaWNrXCIsZnVuY3Rpb24oYil7dmFyIGQ9ZnVuY3Rpb24oKXthLnNldFZpc2libGUmJmEuc2V0VmlzaWJsZSgpfTtmLnJlbW92ZUNsYXNzKGgpO2I9e2Jyb3dzZXJFdmVudDpifTthLmZpcmVQb2ludEV2ZW50P1xuYS5maXJlUG9pbnRFdmVudChcImxlZ2VuZEl0ZW1DbGlja1wiLGIsZCk6eShhLFwibGVnZW5kSXRlbUNsaWNrXCIsYixkKX0pfSxjcmVhdGVDaGVja2JveEZvckl0ZW06ZnVuY3Rpb24oYSl7YS5jaGVja2JveD1FKFwiaW5wdXRcIix7dHlwZTpcImNoZWNrYm94XCIsY2xhc3NOYW1lOlwiaGlnaGNoYXJ0cy1sZWdlbmQtY2hlY2tib3hcIixjaGVja2VkOmEuc2VsZWN0ZWQsZGVmYXVsdENoZWNrZWQ6YS5zZWxlY3RlZH0sdGhpcy5vcHRpb25zLml0ZW1DaGVja2JveFN0eWxlLHRoaXMuY2hhcnQuY29udGFpbmVyKTtDKGEuY2hlY2tib3gsXCJjbGlja1wiLGZ1bmN0aW9uKGIpe3koYS5zZXJpZXN8fGEsXCJjaGVja2JveENsaWNrXCIse2NoZWNrZWQ6Yi50YXJnZXQuY2hlY2tlZCxpdGVtOmF9LGZ1bmN0aW9uKCl7YS5zZWxlY3QoKX0pfSl9fSk7eChBLnByb3RvdHlwZSx7c2hvd1Jlc2V0Wm9vbTpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoKXtiLnpvb21PdXQoKX12YXIgYj10aGlzLGM9Zy5sYW5nLGQ9Yi5vcHRpb25zLmNoYXJ0LnJlc2V0Wm9vbUJ1dHRvbixcbmU9ZC50aGVtZSxmPWUuc3RhdGVzLGg9XCJjaGFydFwiPT09ZC5yZWxhdGl2ZVRvfHxcInNwYWNlQm94XCI9PT1kLnJlbGF0aXZlVG8/bnVsbDpcInBsb3RCb3hcIjt5KHRoaXMsXCJiZWZvcmVTaG93UmVzZXRab29tXCIsbnVsbCxmdW5jdGlvbigpe2IucmVzZXRab29tQnV0dG9uPWIucmVuZGVyZXIuYnV0dG9uKGMucmVzZXRab29tLG51bGwsbnVsbCxhLGUsZiYmZi5ob3ZlcikuYXR0cih7YWxpZ246ZC5wb3NpdGlvbi5hbGlnbix0aXRsZTpjLnJlc2V0Wm9vbVRpdGxlfSkuYWRkQ2xhc3MoXCJoaWdoY2hhcnRzLXJlc2V0LXpvb21cIikuYWRkKCkuYWxpZ24oZC5wb3NpdGlvbiwhMSxoKX0pO3kodGhpcyxcImFmdGVyU2hvd1Jlc2V0Wm9vbVwiKX0sem9vbU91dDpmdW5jdGlvbigpe3kodGhpcyxcInNlbGVjdGlvblwiLHtyZXNldFNlbGVjdGlvbjohMH0sdGhpcy56b29tKX0sem9vbTpmdW5jdGlvbihiKXt2YXIgYz10aGlzLGYsZD1jLnBvaW50ZXIsaz0hMSxnPWMuaW52ZXJ0ZWQ/ZC5tb3VzZURvd25YOmQubW91c2VEb3duWSxcbmg7IWJ8fGIucmVzZXRTZWxlY3Rpb24/KGMuYXhlcy5mb3JFYWNoKGZ1bmN0aW9uKGEpe2Y9YS56b29tKCl9KSxkLmluaXRpYXRlZD0hMSk6Yi54QXhpcy5jb25jYXQoYi55QXhpcykuZm9yRWFjaChmdW5jdGlvbihiKXt2YXIgZT1iLmF4aXMsaD1jLmludmVydGVkP2UubGVmdDplLnRvcCxwPWMuaW52ZXJ0ZWQ/aCtlLndpZHRoOmgrZS5oZWlnaHQsbD1lLmlzWEF4aXMsdT0hMTtpZighbCYmZz49aCYmZzw9cHx8bHx8IWEuZGVmaW5lZChnKSl1PSEwO2RbbD9cInpvb21YXCI6XCJ6b29tWVwiXSYmdSYmKGY9ZS56b29tKGIubWluLGIubWF4KSxlLmRpc3BsYXlCdG4mJihrPSEwKSl9KTtoPWMucmVzZXRab29tQnV0dG9uO2smJiFoP2Muc2hvd1Jlc2V0Wm9vbSgpOiFrJiZuKGgpJiYoYy5yZXNldFpvb21CdXR0b249aC5kZXN0cm95KCkpO2YmJmMucmVkcmF3KGUoYy5vcHRpb25zLmNoYXJ0LmFuaW1hdGlvbixiJiZiLmFuaW1hdGlvbiwxMDA+Yy5wb2ludENvdW50KSl9LHBhbjpmdW5jdGlvbihhLFxuYil7dmFyIGM9dGhpcyxkPWMuaG92ZXJQb2ludHMsZTt5KHRoaXMsXCJwYW5cIix7b3JpZ2luYWxFdmVudDphfSxmdW5jdGlvbigpe2QmJmQuZm9yRWFjaChmdW5jdGlvbihhKXthLnNldFN0YXRlKCl9KTsoXCJ4eVwiPT09Yj9bMSwwXTpbMV0pLmZvckVhY2goZnVuY3Rpb24oYil7Yj1jW2I/XCJ4QXhpc1wiOlwieUF4aXNcIl1bMF07dmFyIGQ9Yi5ob3JpeixmPWFbZD9cImNoYXJ0WFwiOlwiY2hhcnRZXCJdLGQ9ZD9cIm1vdXNlRG93blhcIjpcIm1vdXNlRG93bllcIixrPWNbZF0sZz0oYi5wb2ludFJhbmdlfHwwKS8yLGg9Yi5yZXZlcnNlZCYmIWMuaW52ZXJ0ZWR8fCFiLnJldmVyc2VkJiZjLmludmVydGVkPy0xOjEscD1iLmdldEV4dHJlbWVzKCksbD1iLnRvVmFsdWUoay1mLCEwKStnKmgsaD1iLnRvVmFsdWUoaytiLmxlbi1mLCEwKS1nKmgsdT1oPGwsaz11P2g6bCxsPXU/bDpoLGg9TWF0aC5taW4ocC5kYXRhTWluLGc/cC5taW46Yi50b1ZhbHVlKGIudG9QaXhlbHMocC5taW4pLWIubWluUGl4ZWxQYWRkaW5nKSksXG5nPU1hdGgubWF4KHAuZGF0YU1heCxnP3AubWF4OmIudG9WYWx1ZShiLnRvUGl4ZWxzKHAubWF4KStiLm1pblBpeGVsUGFkZGluZykpLHU9aC1rOzA8dSYmKGwrPXUsaz1oKTt1PWwtZzswPHUmJihsPWcsay09dSk7Yi5zZXJpZXMubGVuZ3RoJiZrIT09cC5taW4mJmwhPT1wLm1heCYmKGIuc2V0RXh0cmVtZXMoayxsLCExLCExLHt0cmlnZ2VyOlwicGFuXCJ9KSxlPSEwKTtjW2RdPWZ9KTtlJiZjLnJlZHJhdyghMSk7bShjLmNvbnRhaW5lcix7Y3Vyc29yOlwibW92ZVwifSl9KX19KTt4KGIucHJvdG90eXBlLHtzZWxlY3Q6ZnVuY3Rpb24oYSxiKXt2YXIgYz10aGlzLGQ9Yy5zZXJpZXMsZj1kLmNoYXJ0O2E9ZShhLCFjLnNlbGVjdGVkKTtjLmZpcmVQb2ludEV2ZW50KGE/XCJzZWxlY3RcIjpcInVuc2VsZWN0XCIse2FjY3VtdWxhdGU6Yn0sZnVuY3Rpb24oKXtjLnNlbGVjdGVkPWMub3B0aW9ucy5zZWxlY3RlZD1hO2Qub3B0aW9ucy5kYXRhW2QuZGF0YS5pbmRleE9mKGMpXT1jLm9wdGlvbnM7Yy5zZXRTdGF0ZShhJiZcblwic2VsZWN0XCIpO2J8fGYuZ2V0U2VsZWN0ZWRQb2ludHMoKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe3ZhciBiPWEuc2VyaWVzO2Euc2VsZWN0ZWQmJmEhPT1jJiYoYS5zZWxlY3RlZD1hLm9wdGlvbnMuc2VsZWN0ZWQ9ITEsYi5vcHRpb25zLmRhdGFbYi5kYXRhLmluZGV4T2YoYSldPWEub3B0aW9ucyxhLnNldFN0YXRlKGYuaG92ZXJQb2ludHMmJmIub3B0aW9ucy5pbmFjdGl2ZU90aGVyUG9pbnRzP1wiaW5hY3RpdmVcIjpcIlwiKSxhLmZpcmVQb2ludEV2ZW50KFwidW5zZWxlY3RcIikpfSl9KX0sb25Nb3VzZU92ZXI6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5zZXJpZXMuY2hhcnQsYz1iLnBvaW50ZXI7YT1hP2Mubm9ybWFsaXplKGEpOmMuZ2V0Q2hhcnRDb29yZGluYXRlc0Zyb21Qb2ludCh0aGlzLGIuaW52ZXJ0ZWQpO2MucnVuUG9pbnRBY3Rpb25zKGEsdGhpcyl9LG9uTW91c2VPdXQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnNlcmllcy5jaGFydDt0aGlzLmZpcmVQb2ludEV2ZW50KFwibW91c2VPdXRcIik7XG50aGlzLnNlcmllcy5vcHRpb25zLmluYWN0aXZlT3RoZXJQb2ludHN8fChhLmhvdmVyUG9pbnRzfHxbXSkuZm9yRWFjaChmdW5jdGlvbihhKXthLnNldFN0YXRlKCl9KTthLmhvdmVyUG9pbnRzPWEuaG92ZXJQb2ludD1udWxsfSxpbXBvcnRFdmVudHM6ZnVuY3Rpb24oKXtpZighdGhpcy5oYXNJbXBvcnRlZEV2ZW50cyl7dmFyIGI9dGhpcyxjPXIoYi5zZXJpZXMub3B0aW9ucy5wb2ludCxiLm9wdGlvbnMpLmV2ZW50cztiLmV2ZW50cz1jO2Eub2JqZWN0RWFjaChjLGZ1bmN0aW9uKGMsZCl7YS5pc0Z1bmN0aW9uKGMpJiZDKGIsZCxjKX0pO3RoaXMuaGFzSW1wb3J0ZWRFdmVudHM9ITB9fSxzZXRTdGF0ZTpmdW5jdGlvbihhLGIpe3ZhciBjPU1hdGguZmxvb3IodGhpcy5wbG90WCksZD10aGlzLnBsb3RZLGY9dGhpcy5zZXJpZXMsZz10aGlzLnN0YXRlLGg9Zi5vcHRpb25zLnN0YXRlc1thfHxcIm5vcm1hbFwiXXx8e30sbD12W2YudHlwZV0ubWFya2VyJiZmLm9wdGlvbnMubWFya2VyLHE9bCYmXG4hMT09PWwuZW5hYmxlZCx0PWwmJmwuc3RhdGVzJiZsLnN0YXRlc1thfHxcIm5vcm1hbFwiXXx8e30scj0hMT09PXQuZW5hYmxlZCxuPWYuc3RhdGVNYXJrZXJHcmFwaGljLG09dGhpcy5tYXJrZXJ8fHt9LHc9Zi5jaGFydCxCPWYuaGFsbyxGLHosQSxDPWwmJmYubWFya2VyQXR0cmliczthPWF8fFwiXCI7aWYoIShhPT09dGhpcy5zdGF0ZSYmIWJ8fHRoaXMuc2VsZWN0ZWQmJlwic2VsZWN0XCIhPT1hfHwhMT09PWguZW5hYmxlZHx8YSYmKHJ8fHEmJiExPT09dC5lbmFibGVkKXx8YSYmbS5zdGF0ZXMmJm0uc3RhdGVzW2FdJiYhMT09PW0uc3RhdGVzW2FdLmVuYWJsZWQpKXt0aGlzLnN0YXRlPWE7QyYmKEY9Zi5tYXJrZXJBdHRyaWJzKHRoaXMsYSkpO2lmKHRoaXMuZ3JhcGhpYylnJiZ0aGlzLmdyYXBoaWMucmVtb3ZlQ2xhc3MoXCJoaWdoY2hhcnRzLXBvaW50LVwiK2cpLGEmJnRoaXMuZ3JhcGhpYy5hZGRDbGFzcyhcImhpZ2hjaGFydHMtcG9pbnQtXCIrYSksdy5zdHlsZWRNb2RlfHwoej1mLnBvaW50QXR0cmlicyh0aGlzLFxuYSksQT1lKHcub3B0aW9ucy5jaGFydC5hbmltYXRpb24saC5hbmltYXRpb24pLGYub3B0aW9ucy5pbmFjdGl2ZU90aGVyUG9pbnRzJiYoKHRoaXMuZGF0YUxhYmVsc3x8W10pLmZvckVhY2goZnVuY3Rpb24oYSl7YSYmYS5hbmltYXRlKHtvcGFjaXR5Onoub3BhY2l0eX0sQSl9KSx0aGlzLmNvbm5lY3RvciYmdGhpcy5jb25uZWN0b3IuYW5pbWF0ZSh7b3BhY2l0eTp6Lm9wYWNpdHl9LEEpKSx0aGlzLmdyYXBoaWMuYW5pbWF0ZSh6LEEpKSxGJiZ0aGlzLmdyYXBoaWMuYW5pbWF0ZShGLGUody5vcHRpb25zLmNoYXJ0LmFuaW1hdGlvbix0LmFuaW1hdGlvbixsLmFuaW1hdGlvbikpLG4mJm4uaGlkZSgpO2Vsc2V7aWYoYSYmdCl7Zz1tLnN5bWJvbHx8Zi5zeW1ib2w7biYmbi5jdXJyZW50U3ltYm9sIT09ZyYmKG49bi5kZXN0cm95KCkpO2lmKG4pbltiP1wiYW5pbWF0ZVwiOlwiYXR0clwiXSh7eDpGLngseTpGLnl9KTtlbHNlIGcmJihmLnN0YXRlTWFya2VyR3JhcGhpYz1uPXcucmVuZGVyZXIuc3ltYm9sKGcsXG5GLngsRi55LEYud2lkdGgsRi5oZWlnaHQpLmFkZChmLm1hcmtlckdyb3VwKSxuLmN1cnJlbnRTeW1ib2w9Zyk7IXcuc3R5bGVkTW9kZSYmbiYmbi5hdHRyKGYucG9pbnRBdHRyaWJzKHRoaXMsYSkpfW4mJihuW2EmJncuaXNJbnNpZGVQbG90KGMsZCx3LmludmVydGVkKT9cInNob3dcIjpcImhpZGVcIl0oKSxuLmVsZW1lbnQucG9pbnQ9dGhpcyl9KGE9aC5oYWxvKSYmYS5zaXplPyhCfHwoZi5oYWxvPUI9dy5yZW5kZXJlci5wYXRoKCkuYWRkKCh0aGlzLmdyYXBoaWN8fG4pLnBhcmVudEdyb3VwKSksQi5zaG93KClbYj9cImFuaW1hdGVcIjpcImF0dHJcIl0oe2Q6dGhpcy5oYWxvUGF0aChhLnNpemUpfSksQi5hdHRyKHtcImNsYXNzXCI6XCJoaWdoY2hhcnRzLWhhbG8gaGlnaGNoYXJ0cy1jb2xvci1cIitlKHRoaXMuY29sb3JJbmRleCxmLmNvbG9ySW5kZXgpKyh0aGlzLmNsYXNzTmFtZT9cIiBcIit0aGlzLmNsYXNzTmFtZTpcIlwiKSx6SW5kZXg6LTF9KSxCLnBvaW50PXRoaXMsdy5zdHlsZWRNb2RlfHxCLmF0dHIoeCh7ZmlsbDp0aGlzLmNvbG9yfHxcbmYuY29sb3IsXCJmaWxsLW9wYWNpdHlcIjphLm9wYWNpdHl9LGEuYXR0cmlidXRlcykpKTpCJiZCLnBvaW50JiZCLnBvaW50LmhhbG9QYXRoJiZCLmFuaW1hdGUoe2Q6Qi5wb2ludC5oYWxvUGF0aCgwKX0sbnVsbCxCLmhpZGUpO3kodGhpcyxcImFmdGVyU2V0U3RhdGVcIil9fSxoYWxvUGF0aDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5zZXJpZXMuY2hhcnQucmVuZGVyZXIuc3ltYm9scy5jaXJjbGUoTWF0aC5mbG9vcih0aGlzLnBsb3RYKS1hLHRoaXMucGxvdFktYSwyKmEsMiphKX19KTt4KGwucHJvdG90eXBlLHtvbk1vdXNlT3ZlcjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuY2hhcnQsYj1hLmhvdmVyU2VyaWVzO2lmKGImJmIhPT10aGlzKWIub25Nb3VzZU91dCgpO3RoaXMub3B0aW9ucy5ldmVudHMubW91c2VPdmVyJiZ5KHRoaXMsXCJtb3VzZU92ZXJcIik7dGhpcy5zZXRTdGF0ZShcImhvdmVyXCIpO2EuaG92ZXJTZXJpZXM9dGhpc30sb25Nb3VzZU91dDpmdW5jdGlvbigpe3ZhciBhPXRoaXMub3B0aW9ucyxcbmI9dGhpcy5jaGFydCxjPWIudG9vbHRpcCxkPWIuaG92ZXJQb2ludDtiLmhvdmVyU2VyaWVzPW51bGw7aWYoZClkLm9uTW91c2VPdXQoKTt0aGlzJiZhLmV2ZW50cy5tb3VzZU91dCYmeSh0aGlzLFwibW91c2VPdXRcIik7IWN8fHRoaXMuc3RpY2t5VHJhY2tpbmd8fGMuc2hhcmVkJiYhdGhpcy5ub1NoYXJlZFRvb2x0aXB8fGMuaGlkZSgpO2Iuc2VyaWVzLmZvckVhY2goZnVuY3Rpb24oYSl7YS5zZXRTdGF0ZShcIlwiLCEwKX0pfSxzZXRTdGF0ZTpmdW5jdGlvbihhLGIpe3ZhciBjPXRoaXMsZD1jLm9wdGlvbnMsZj1jLmdyYXBoLGc9ZC5pbmFjdGl2ZU90aGVyUG9pbnRzLGg9ZC5zdGF0ZXMsbD1kLmxpbmVXaWR0aCxxPWQub3BhY2l0eSx0PWUoaFthfHxcIm5vcm1hbFwiXSYmaFthfHxcIm5vcm1hbFwiXS5hbmltYXRpb24sYy5jaGFydC5vcHRpb25zLmNoYXJ0LmFuaW1hdGlvbiksZD0wO2E9YXx8XCJcIjtpZihjLnN0YXRlIT09YSYmKFtjLmdyb3VwLGMubWFya2VyR3JvdXAsYy5kYXRhTGFiZWxzR3JvdXBdLmZvckVhY2goZnVuY3Rpb24oYil7YiYmXG4oYy5zdGF0ZSYmYi5yZW1vdmVDbGFzcyhcImhpZ2hjaGFydHMtc2VyaWVzLVwiK2Muc3RhdGUpLGEmJmIuYWRkQ2xhc3MoXCJoaWdoY2hhcnRzLXNlcmllcy1cIithKSl9KSxjLnN0YXRlPWEsIWMuY2hhcnQuc3R5bGVkTW9kZSkpe2lmKGhbYV0mJiExPT09aFthXS5lbmFibGVkKXJldHVybjthJiYobD1oW2FdLmxpbmVXaWR0aHx8bCsoaFthXS5saW5lV2lkdGhQbHVzfHwwKSxxPWUoaFthXS5vcGFjaXR5LHEpKTtpZihmJiYhZi5kYXNoc3R5bGUpZm9yKGg9e1wic3Ryb2tlLXdpZHRoXCI6bH0sZi5hbmltYXRlKGgsdCk7Y1tcInpvbmUtZ3JhcGgtXCIrZF07KWNbXCJ6b25lLWdyYXBoLVwiK2RdLmF0dHIoaCksZCs9MTtnfHxbYy5ncm91cCxjLm1hcmtlckdyb3VwLGMuZGF0YUxhYmVsc0dyb3VwLGMubGFiZWxCeVNlcmllc10uZm9yRWFjaChmdW5jdGlvbihhKXthJiZhLmFuaW1hdGUoe29wYWNpdHk6cX0sdCl9KX1iJiZnJiZjLnBvaW50cyYmYy5wb2ludHMuZm9yRWFjaChmdW5jdGlvbihiKXtiLnNldFN0YXRlJiZcbmIuc2V0U3RhdGUoYSl9KX0sc2V0VmlzaWJsZTpmdW5jdGlvbihhLGIpe3ZhciBjPXRoaXMsZD1jLmNoYXJ0LGU9Yy5sZWdlbmRJdGVtLGYsZz1kLm9wdGlvbnMuY2hhcnQuaWdub3JlSGlkZGVuU2VyaWVzLGg9Yy52aXNpYmxlO2Y9KGMudmlzaWJsZT1hPWMub3B0aW9ucy52aXNpYmxlPWMudXNlck9wdGlvbnMudmlzaWJsZT12b2lkIDA9PT1hPyFoOmEpP1wic2hvd1wiOlwiaGlkZVwiO1tcImdyb3VwXCIsXCJkYXRhTGFiZWxzR3JvdXBcIixcIm1hcmtlckdyb3VwXCIsXCJ0cmFja2VyXCIsXCJ0dFwiXS5mb3JFYWNoKGZ1bmN0aW9uKGEpe2lmKGNbYV0pY1thXVtmXSgpfSk7aWYoZC5ob3ZlclNlcmllcz09PWN8fChkLmhvdmVyUG9pbnQmJmQuaG92ZXJQb2ludC5zZXJpZXMpPT09YyljLm9uTW91c2VPdXQoKTtlJiZkLmxlZ2VuZC5jb2xvcml6ZUl0ZW0oYyxhKTtjLmlzRGlydHk9ITA7Yy5vcHRpb25zLnN0YWNraW5nJiZkLnNlcmllcy5mb3JFYWNoKGZ1bmN0aW9uKGEpe2Eub3B0aW9ucy5zdGFja2luZyYmXG5hLnZpc2libGUmJihhLmlzRGlydHk9ITApfSk7Yy5saW5rZWRTZXJpZXMuZm9yRWFjaChmdW5jdGlvbihiKXtiLnNldFZpc2libGUoYSwhMSl9KTtnJiYoZC5pc0RpcnR5Qm94PSEwKTt5KGMsZik7ITEhPT1iJiZkLnJlZHJhdygpfSxzaG93OmZ1bmN0aW9uKCl7dGhpcy5zZXRWaXNpYmxlKCEwKX0saGlkZTpmdW5jdGlvbigpe3RoaXMuc2V0VmlzaWJsZSghMSl9LHNlbGVjdDpmdW5jdGlvbihhKXt0aGlzLnNlbGVjdGVkPWE9dGhpcy5vcHRpb25zLnNlbGVjdGVkPXZvaWQgMD09PWE/IXRoaXMuc2VsZWN0ZWQ6YTt0aGlzLmNoZWNrYm94JiYodGhpcy5jaGVja2JveC5jaGVja2VkPWEpO3kodGhpcyxhP1wic2VsZWN0XCI6XCJ1bnNlbGVjdFwiKX0sZHJhd1RyYWNrZXI6Ri5kcmF3VHJhY2tlckdyYXBofSl9KTtJKEgsXCJwYXJ0cy9SZXNwb25zaXZlLmpzXCIsW0hbXCJwYXJ0cy9HbG9iYWxzLmpzXCJdXSxmdW5jdGlvbihhKXt2YXIgQz1hLkNoYXJ0LEE9YS5pc0FycmF5LEU9YS5pc09iamVjdCxtPVxuYS5waWNrLGc9YS5zcGxhdDtDLnByb3RvdHlwZS5zZXRSZXNwb25zaXZlPWZ1bmN0aW9uKGcsbSl7dmFyIHY9dGhpcy5vcHRpb25zLnJlc3BvbnNpdmUseD1bXSxuPXRoaXMuY3VycmVudFJlc3BvbnNpdmU7IW0mJnYmJnYucnVsZXMmJnYucnVsZXMuZm9yRWFjaChmdW5jdGlvbihmKXt2b2lkIDA9PT1mLl9pZCYmKGYuX2lkPWEudW5pcXVlS2V5KCkpO3RoaXMubWF0Y2hSZXNwb25zaXZlUnVsZShmLHgsZyl9LHRoaXMpO209YS5tZXJnZS5hcHBseSgwLHgubWFwKGZ1bmN0aW9uKGYpe3JldHVybiBhLmZpbmQodi5ydWxlcyxmdW5jdGlvbihhKXtyZXR1cm4gYS5faWQ9PT1mfSkuY2hhcnRPcHRpb25zfSkpO20uaXNSZXNwb25zaXZlT3B0aW9ucz0hMDt4PXgudG9TdHJpbmcoKXx8dm9pZCAwO3ghPT0obiYmbi5ydWxlSWRzKSYmKG4mJnRoaXMudXBkYXRlKG4udW5kb09wdGlvbnMsZywhMCkseD8obj10aGlzLmN1cnJlbnRPcHRpb25zKG0pLG4uaXNSZXNwb25zaXZlT3B0aW9ucz0hMCx0aGlzLmN1cnJlbnRSZXNwb25zaXZlPVxue3J1bGVJZHM6eCxtZXJnZWRPcHRpb25zOm0sdW5kb09wdGlvbnM6bn0sdGhpcy51cGRhdGUobSxnLCEwKSk6dGhpcy5jdXJyZW50UmVzcG9uc2l2ZT12b2lkIDApfTtDLnByb3RvdHlwZS5tYXRjaFJlc3BvbnNpdmVSdWxlPWZ1bmN0aW9uKGEsZyl7dmFyIHY9YS5jb25kaXRpb247KHYuY2FsbGJhY2t8fGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2hhcnRXaWR0aDw9bSh2Lm1heFdpZHRoLE51bWJlci5NQVhfVkFMVUUpJiZ0aGlzLmNoYXJ0SGVpZ2h0PD1tKHYubWF4SGVpZ2h0LE51bWJlci5NQVhfVkFMVUUpJiZ0aGlzLmNoYXJ0V2lkdGg+PW0odi5taW5XaWR0aCwwKSYmdGhpcy5jaGFydEhlaWdodD49bSh2Lm1pbkhlaWdodCwwKX0pLmNhbGwodGhpcykmJmcucHVzaChhLl9pZCl9O0MucHJvdG90eXBlLmN1cnJlbnRPcHRpb25zPWZ1bmN0aW9uKHYpe2Z1bmN0aW9uIHgobixmLGgscil7dmFyIGU7YS5vYmplY3RFYWNoKG4sZnVuY3Rpb24oYSxsKXtpZighciYmLTE8eS5jb2xsZWN0aW9uc1dpdGhVcGRhdGUuaW5kZXhPZihsKSlmb3IoYT1cbmcoYSksaFtsXT1bXSxlPTA7ZTxhLmxlbmd0aDtlKyspZltsXVtlXSYmKGhbbF1bZV09e30seChhW2VdLGZbbF1bZV0saFtsXVtlXSxyKzEpKTtlbHNlIEUoYSk/KGhbbF09QShhKT9bXTp7fSx4KGEsZltsXXx8e30saFtsXSxyKzEpKTpoW2xdPW0oZltsXSxudWxsKX0pfXZhciB5PXRoaXMsej17fTt4KHYsdGhpcy5vcHRpb25zLHosMCk7cmV0dXJuIHp9fSk7SShILFwibWFzdGVycy9oaWdoY2hhcnRzLnNyYy5qc1wiLFtIW1wicGFydHMvR2xvYmFscy5qc1wiXV0sZnVuY3Rpb24oYSl7cmV0dXJuIGF9KTtJKEgsXCJwYXJ0cy9TY3JvbGxiYXIuanNcIixbSFtcInBhcnRzL0dsb2JhbHMuanNcIl1dLGZ1bmN0aW9uKGEpe2Z1bmN0aW9uIEMoYSxlLGMpe3RoaXMuaW5pdChhLGUsYyl9dmFyIEE9YS5hZGRFdmVudCxFPWEuQXhpcyxtPWEuY29ycmVjdEZsb2F0LGc9YS5kZWZhdWx0T3B0aW9ucyx2PWEuZGVmaW5lZCx4PWEuZGVzdHJveU9iamVjdFByb3BlcnRpZXMseT1hLmZpcmVFdmVudCx6PWEuaGFzVG91Y2gsXG5uPWEubWVyZ2UsZj1hLnBpY2ssaD1hLnJlbW92ZUV2ZW50LHIsZT17aGVpZ2h0OmEuaXNUb3VjaERldmljZT8yMDoxNCxiYXJCb3JkZXJSYWRpdXM6MCxidXR0b25Cb3JkZXJSYWRpdXM6MCxsaXZlUmVkcmF3OnZvaWQgMCxtYXJnaW46MTAsbWluV2lkdGg6NixzdGVwOi4yLHpJbmRleDozLGJhckJhY2tncm91bmRDb2xvcjpcIiNjY2NjY2NcIixiYXJCb3JkZXJXaWR0aDoxLGJhckJvcmRlckNvbG9yOlwiI2NjY2NjY1wiLGJ1dHRvbkFycm93Q29sb3I6XCIjMzMzMzMzXCIsYnV0dG9uQmFja2dyb3VuZENvbG9yOlwiI2U2ZTZlNlwiLGJ1dHRvbkJvcmRlckNvbG9yOlwiI2NjY2NjY1wiLGJ1dHRvbkJvcmRlcldpZHRoOjEscmlmbGVDb2xvcjpcIiMzMzMzMzNcIix0cmFja0JhY2tncm91bmRDb2xvcjpcIiNmMmYyZjJcIix0cmFja0JvcmRlckNvbG9yOlwiI2YyZjJmMlwiLHRyYWNrQm9yZGVyV2lkdGg6MX07Zy5zY3JvbGxiYXI9bighMCxlLGcuc2Nyb2xsYmFyKTthLnN3YXBYWT1yPWZ1bmN0aW9uKGEsZSl7dmFyIGI9XG5hLmxlbmd0aCxmO2lmKGUpZm9yKGU9MDtlPGI7ZSs9MylmPWFbZSsxXSxhW2UrMV09YVtlKzJdLGFbZSsyXT1mO3JldHVybiBhfTtDLnByb3RvdHlwZT17aW5pdDpmdW5jdGlvbihhLGcsYyl7dGhpcy5zY3JvbGxiYXJCdXR0b25zPVtdO3RoaXMucmVuZGVyZXI9YTt0aGlzLnVzZXJPcHRpb25zPWc7dGhpcy5vcHRpb25zPW4oZSxnKTt0aGlzLmNoYXJ0PWM7dGhpcy5zaXplPWYodGhpcy5vcHRpb25zLnNpemUsdGhpcy5vcHRpb25zLmhlaWdodCk7Zy5lbmFibGVkJiYodGhpcy5yZW5kZXIoKSx0aGlzLmluaXRFdmVudHMoKSx0aGlzLmFkZEV2ZW50cygpKX0scmVuZGVyOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5yZW5kZXJlcixlPXRoaXMub3B0aW9ucyxjPXRoaXMuc2l6ZSxmPXRoaXMuY2hhcnQuc3R5bGVkTW9kZSxnO3RoaXMuZ3JvdXA9Zz1hLmcoXCJzY3JvbGxiYXJcIikuYXR0cih7ekluZGV4OmUuekluZGV4LHRyYW5zbGF0ZVk6LTk5OTk5fSkuYWRkKCk7dGhpcy50cmFjaz1hLnJlY3QoKS5hZGRDbGFzcyhcImhpZ2hjaGFydHMtc2Nyb2xsYmFyLXRyYWNrXCIpLmF0dHIoe3g6MCxcbnI6ZS50cmFja0JvcmRlclJhZGl1c3x8MCxoZWlnaHQ6Yyx3aWR0aDpjfSkuYWRkKGcpO2Z8fHRoaXMudHJhY2suYXR0cih7ZmlsbDplLnRyYWNrQmFja2dyb3VuZENvbG9yLHN0cm9rZTplLnRyYWNrQm9yZGVyQ29sb3IsXCJzdHJva2Utd2lkdGhcIjplLnRyYWNrQm9yZGVyV2lkdGh9KTt0aGlzLnRyYWNrQm9yZGVyV2lkdGg9dGhpcy50cmFjay5zdHJva2VXaWR0aCgpO3RoaXMudHJhY2suYXR0cih7eTotdGhpcy50cmFja0JvcmRlcldpZHRoJTIvMn0pO3RoaXMuc2Nyb2xsYmFyR3JvdXA9YS5nKCkuYWRkKGcpO3RoaXMuc2Nyb2xsYmFyPWEucmVjdCgpLmFkZENsYXNzKFwiaGlnaGNoYXJ0cy1zY3JvbGxiYXItdGh1bWJcIikuYXR0cih7aGVpZ2h0OmMsd2lkdGg6YyxyOmUuYmFyQm9yZGVyUmFkaXVzfHwwfSkuYWRkKHRoaXMuc2Nyb2xsYmFyR3JvdXApO3RoaXMuc2Nyb2xsYmFyUmlmbGVzPWEucGF0aChyKFtcIk1cIiwtMyxjLzQsXCJMXCIsLTMsMipjLzMsXCJNXCIsMCxjLzQsXCJMXCIsMCwyKmMvMyxcblwiTVwiLDMsYy80LFwiTFwiLDMsMipjLzNdLGUudmVydGljYWwpKS5hZGRDbGFzcyhcImhpZ2hjaGFydHMtc2Nyb2xsYmFyLXJpZmxlc1wiKS5hZGQodGhpcy5zY3JvbGxiYXJHcm91cCk7Znx8KHRoaXMuc2Nyb2xsYmFyLmF0dHIoe2ZpbGw6ZS5iYXJCYWNrZ3JvdW5kQ29sb3Isc3Ryb2tlOmUuYmFyQm9yZGVyQ29sb3IsXCJzdHJva2Utd2lkdGhcIjplLmJhckJvcmRlcldpZHRofSksdGhpcy5zY3JvbGxiYXJSaWZsZXMuYXR0cih7c3Ryb2tlOmUucmlmbGVDb2xvcixcInN0cm9rZS13aWR0aFwiOjF9KSk7dGhpcy5zY3JvbGxiYXJTdHJva2VXaWR0aD10aGlzLnNjcm9sbGJhci5zdHJva2VXaWR0aCgpO3RoaXMuc2Nyb2xsYmFyR3JvdXAudHJhbnNsYXRlKC10aGlzLnNjcm9sbGJhclN0cm9rZVdpZHRoJTIvMiwtdGhpcy5zY3JvbGxiYXJTdHJva2VXaWR0aCUyLzIpO3RoaXMuZHJhd1Njcm9sbGJhckJ1dHRvbigwKTt0aGlzLmRyYXdTY3JvbGxiYXJCdXR0b24oMSl9LHBvc2l0aW9uOmZ1bmN0aW9uKGEsXG5lLGMsZil7dmFyIGI9dGhpcy5vcHRpb25zLnZlcnRpY2FsLGc9MCxoPXRoaXMucmVuZGVyZWQ/XCJhbmltYXRlXCI6XCJhdHRyXCI7dGhpcy54PWE7dGhpcy55PWUrdGhpcy50cmFja0JvcmRlcldpZHRoO3RoaXMud2lkdGg9Yzt0aGlzLnhPZmZzZXQ9dGhpcy5oZWlnaHQ9Zjt0aGlzLnlPZmZzZXQ9ZztiPyh0aGlzLndpZHRoPXRoaXMueU9mZnNldD1jPWc9dGhpcy5zaXplLHRoaXMueE9mZnNldD1lPTAsdGhpcy5iYXJXaWR0aD1mLTIqYyx0aGlzLng9YSs9dGhpcy5vcHRpb25zLm1hcmdpbik6KHRoaXMuaGVpZ2h0PXRoaXMueE9mZnNldD1mPWU9dGhpcy5zaXplLHRoaXMuYmFyV2lkdGg9Yy0yKmYsdGhpcy55Kz10aGlzLm9wdGlvbnMubWFyZ2luKTt0aGlzLmdyb3VwW2hdKHt0cmFuc2xhdGVYOmEsdHJhbnNsYXRlWTp0aGlzLnl9KTt0aGlzLnRyYWNrW2hdKHt3aWR0aDpjLGhlaWdodDpmfSk7dGhpcy5zY3JvbGxiYXJCdXR0b25zWzFdW2hdKHt0cmFuc2xhdGVYOmI/MDpjLWUsdHJhbnNsYXRlWTpiP1xuZi1nOjB9KX0sZHJhd1Njcm9sbGJhckJ1dHRvbjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnJlbmRlcmVyLGM9dGhpcy5zY3JvbGxiYXJCdXR0b25zLGU9dGhpcy5vcHRpb25zLGY9dGhpcy5zaXplLGc7Zz1iLmcoKS5hZGQodGhpcy5ncm91cCk7Yy5wdXNoKGcpO2c9Yi5yZWN0KCkuYWRkQ2xhc3MoXCJoaWdoY2hhcnRzLXNjcm9sbGJhci1idXR0b25cIikuYWRkKGcpO3RoaXMuY2hhcnQuc3R5bGVkTW9kZXx8Zy5hdHRyKHtzdHJva2U6ZS5idXR0b25Cb3JkZXJDb2xvcixcInN0cm9rZS13aWR0aFwiOmUuYnV0dG9uQm9yZGVyV2lkdGgsZmlsbDplLmJ1dHRvbkJhY2tncm91bmRDb2xvcn0pO2cuYXR0cihnLmNyaXNwKHt4Oi0uNSx5Oi0uNSx3aWR0aDpmKzEsaGVpZ2h0OmYrMSxyOmUuYnV0dG9uQm9yZGVyUmFkaXVzfSxnLnN0cm9rZVdpZHRoKCkpKTtnPWIucGF0aChyKFtcIk1cIixmLzIrKGE/LTE6MSksZi8yLTMsXCJMXCIsZi8yKyhhPy0xOjEpLGYvMiszLFwiTFwiLGYvMisoYT8yOi0yKSxmLzJdLFxuZS52ZXJ0aWNhbCkpLmFkZENsYXNzKFwiaGlnaGNoYXJ0cy1zY3JvbGxiYXItYXJyb3dcIikuYWRkKGNbYV0pO3RoaXMuY2hhcnQuc3R5bGVkTW9kZXx8Zy5hdHRyKHtmaWxsOmUuYnV0dG9uQXJyb3dDb2xvcn0pfSxzZXRSYW5nZTpmdW5jdGlvbihhLGUpe3ZhciBiPXRoaXMub3B0aW9ucyxmPWIudmVydGljYWwsZz1iLm1pbldpZHRoLGg9dGhpcy5iYXJXaWR0aCxsLHAsZD0hdGhpcy5yZW5kZXJlZHx8dGhpcy5oYXNEcmFnZ2VkfHx0aGlzLmNoYXJ0Lm5hdmlnYXRvciYmdGhpcy5jaGFydC5uYXZpZ2F0b3IuaGFzRHJhZ2dlZD9cImF0dHJcIjpcImFuaW1hdGVcIjt2KGgpJiYoYT1NYXRoLm1heChhLDApLGw9TWF0aC5jZWlsKGgqYSksdGhpcy5jYWxjdWxhdGVkV2lkdGg9cD1tKGgqTWF0aC5taW4oZSwxKS1sKSxwPGcmJihsPShoLWcrcCkqYSxwPWcpLGc9TWF0aC5mbG9vcihsK3RoaXMueE9mZnNldCt0aGlzLnlPZmZzZXQpLGg9cC8yLS41LHRoaXMuZnJvbT1hLHRoaXMudG89ZSxmPyh0aGlzLnNjcm9sbGJhckdyb3VwW2RdKHt0cmFuc2xhdGVZOmd9KSxcbnRoaXMuc2Nyb2xsYmFyW2RdKHtoZWlnaHQ6cH0pLHRoaXMuc2Nyb2xsYmFyUmlmbGVzW2RdKHt0cmFuc2xhdGVZOmh9KSx0aGlzLnNjcm9sbGJhclRvcD1nLHRoaXMuc2Nyb2xsYmFyTGVmdD0wKToodGhpcy5zY3JvbGxiYXJHcm91cFtkXSh7dHJhbnNsYXRlWDpnfSksdGhpcy5zY3JvbGxiYXJbZF0oe3dpZHRoOnB9KSx0aGlzLnNjcm9sbGJhclJpZmxlc1tkXSh7dHJhbnNsYXRlWDpofSksdGhpcy5zY3JvbGxiYXJMZWZ0PWcsdGhpcy5zY3JvbGxiYXJUb3A9MCksMTI+PXA/dGhpcy5zY3JvbGxiYXJSaWZsZXMuaGlkZSgpOnRoaXMuc2Nyb2xsYmFyUmlmbGVzLnNob3coITApLCExPT09Yi5zaG93RnVsbCYmKDA+PWEmJjE8PWU/dGhpcy5ncm91cC5oaWRlKCk6dGhpcy5ncm91cC5zaG93KCkpLHRoaXMucmVuZGVyZWQ9ITApfSxpbml0RXZlbnRzOmZ1bmN0aW9uKCl7dmFyIGE9dGhpczthLm1vdXNlTW92ZUhhbmRsZXI9ZnVuY3Rpb24oYil7dmFyIGM9YS5jaGFydC5wb2ludGVyLm5vcm1hbGl6ZShiKSxcbmU9YS5vcHRpb25zLnZlcnRpY2FsP1wiY2hhcnRZXCI6XCJjaGFydFhcIixmPWEuaW5pdFBvc2l0aW9uczshYS5ncmFiYmVkQ2VudGVyfHxiLnRvdWNoZXMmJjA9PT1iLnRvdWNoZXNbMF1bZV18fChjPWEuY3Vyc29yVG9TY3JvbGxiYXJQb3NpdGlvbihjKVtlXSxlPWFbZV0sZT1jLWUsYS5oYXNEcmFnZ2VkPSEwLGEudXBkYXRlUG9zaXRpb24oZlswXStlLGZbMV0rZSksYS5oYXNEcmFnZ2VkJiZ5KGEsXCJjaGFuZ2VkXCIse2Zyb206YS5mcm9tLHRvOmEudG8sdHJpZ2dlcjpcInNjcm9sbGJhclwiLERPTVR5cGU6Yi50eXBlLERPTUV2ZW50OmJ9KSl9O2EubW91c2VVcEhhbmRsZXI9ZnVuY3Rpb24oYil7YS5oYXNEcmFnZ2VkJiZ5KGEsXCJjaGFuZ2VkXCIse2Zyb206YS5mcm9tLHRvOmEudG8sdHJpZ2dlcjpcInNjcm9sbGJhclwiLERPTVR5cGU6Yi50eXBlLERPTUV2ZW50OmJ9KTthLmdyYWJiZWRDZW50ZXI9YS5oYXNEcmFnZ2VkPWEuY2hhcnRYPWEuY2hhcnRZPW51bGx9O2EubW91c2VEb3duSGFuZGxlcj1cbmZ1bmN0aW9uKGIpe2I9YS5jaGFydC5wb2ludGVyLm5vcm1hbGl6ZShiKTtiPWEuY3Vyc29yVG9TY3JvbGxiYXJQb3NpdGlvbihiKTthLmNoYXJ0WD1iLmNoYXJ0WDthLmNoYXJ0WT1iLmNoYXJ0WTthLmluaXRQb3NpdGlvbnM9W2EuZnJvbSxhLnRvXTthLmdyYWJiZWRDZW50ZXI9ITB9O2EuYnV0dG9uVG9NaW5DbGljaz1mdW5jdGlvbihiKXt2YXIgYz1tKGEudG8tYS5mcm9tKSphLm9wdGlvbnMuc3RlcDthLnVwZGF0ZVBvc2l0aW9uKG0oYS5mcm9tLWMpLG0oYS50by1jKSk7eShhLFwiY2hhbmdlZFwiLHtmcm9tOmEuZnJvbSx0bzphLnRvLHRyaWdnZXI6XCJzY3JvbGxiYXJcIixET01FdmVudDpifSl9O2EuYnV0dG9uVG9NYXhDbGljaz1mdW5jdGlvbihiKXt2YXIgYz0oYS50by1hLmZyb20pKmEub3B0aW9ucy5zdGVwO2EudXBkYXRlUG9zaXRpb24oYS5mcm9tK2MsYS50bytjKTt5KGEsXCJjaGFuZ2VkXCIse2Zyb206YS5mcm9tLHRvOmEudG8sdHJpZ2dlcjpcInNjcm9sbGJhclwiLERPTUV2ZW50OmJ9KX07XG5hLnRyYWNrQ2xpY2s9ZnVuY3Rpb24oYil7dmFyIGM9YS5jaGFydC5wb2ludGVyLm5vcm1hbGl6ZShiKSxlPWEudG8tYS5mcm9tLGY9YS55K2Euc2Nyb2xsYmFyVG9wLGc9YS54K2Euc2Nyb2xsYmFyTGVmdDthLm9wdGlvbnMudmVydGljYWwmJmMuY2hhcnRZPmZ8fCFhLm9wdGlvbnMudmVydGljYWwmJmMuY2hhcnRYPmc/YS51cGRhdGVQb3NpdGlvbihhLmZyb20rZSxhLnRvK2UpOmEudXBkYXRlUG9zaXRpb24oYS5mcm9tLWUsYS50by1lKTt5KGEsXCJjaGFuZ2VkXCIse2Zyb206YS5mcm9tLHRvOmEudG8sdHJpZ2dlcjpcInNjcm9sbGJhclwiLERPTUV2ZW50OmJ9KX19LGN1cnNvclRvU2Nyb2xsYmFyUG9zaXRpb246ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5vcHRpb25zLGI9Yi5taW5XaWR0aD50aGlzLmNhbGN1bGF0ZWRXaWR0aD9iLm1pbldpZHRoOjA7cmV0dXJue2NoYXJ0WDooYS5jaGFydFgtdGhpcy54LXRoaXMueE9mZnNldCkvKHRoaXMuYmFyV2lkdGgtYiksY2hhcnRZOihhLmNoYXJ0WS1cbnRoaXMueS10aGlzLnlPZmZzZXQpLyh0aGlzLmJhcldpZHRoLWIpfX0sdXBkYXRlUG9zaXRpb246ZnVuY3Rpb24oYSxlKXsxPGUmJihhPW0oMS1tKGUtYSkpLGU9MSk7MD5hJiYoZT1tKGUtYSksYT0wKTt0aGlzLmZyb209YTt0aGlzLnRvPWV9LHVwZGF0ZTpmdW5jdGlvbihhKXt0aGlzLmRlc3Ryb3koKTt0aGlzLmluaXQodGhpcy5jaGFydC5yZW5kZXJlcixuKCEwLHRoaXMub3B0aW9ucyxhKSx0aGlzLmNoYXJ0KX0sYWRkRXZlbnRzOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5vcHRpb25zLmludmVydGVkP1sxLDBdOlswLDFdLGU9dGhpcy5zY3JvbGxiYXJCdXR0b25zLGM9dGhpcy5zY3JvbGxiYXJHcm91cC5lbGVtZW50LGY9dGhpcy5tb3VzZURvd25IYW5kbGVyLGc9dGhpcy5tb3VzZU1vdmVIYW5kbGVyLGg9dGhpcy5tb3VzZVVwSGFuZGxlcixhPVtbZVthWzBdXS5lbGVtZW50LFwiY2xpY2tcIix0aGlzLmJ1dHRvblRvTWluQ2xpY2tdLFtlW2FbMV1dLmVsZW1lbnQsXCJjbGlja1wiLHRoaXMuYnV0dG9uVG9NYXhDbGlja10sXG5bdGhpcy50cmFjay5lbGVtZW50LFwiY2xpY2tcIix0aGlzLnRyYWNrQ2xpY2tdLFtjLFwibW91c2Vkb3duXCIsZl0sW2Mub3duZXJEb2N1bWVudCxcIm1vdXNlbW92ZVwiLGddLFtjLm93bmVyRG9jdW1lbnQsXCJtb3VzZXVwXCIsaF1dO3omJmEucHVzaChbYyxcInRvdWNoc3RhcnRcIixmXSxbYy5vd25lckRvY3VtZW50LFwidG91Y2htb3ZlXCIsZ10sW2Mub3duZXJEb2N1bWVudCxcInRvdWNoZW5kXCIsaF0pO2EuZm9yRWFjaChmdW5jdGlvbihhKXtBLmFwcGx5KG51bGwsYSl9KTt0aGlzLl9ldmVudHM9YX0scmVtb3ZlRXZlbnRzOmZ1bmN0aW9uKCl7dGhpcy5fZXZlbnRzLmZvckVhY2goZnVuY3Rpb24oYSl7aC5hcHBseShudWxsLGEpfSk7dGhpcy5fZXZlbnRzLmxlbmd0aD0wfSxkZXN0cm95OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5jaGFydC5zY3JvbGxlcjt0aGlzLnJlbW92ZUV2ZW50cygpO1tcInRyYWNrXCIsXCJzY3JvbGxiYXJSaWZsZXNcIixcInNjcm9sbGJhclwiLFwic2Nyb2xsYmFyR3JvdXBcIixcImdyb3VwXCJdLmZvckVhY2goZnVuY3Rpb24oYSl7dGhpc1thXSYmXG50aGlzW2FdLmRlc3Ryb3kmJih0aGlzW2FdPXRoaXNbYV0uZGVzdHJveSgpKX0sdGhpcyk7YSYmdGhpcz09PWEuc2Nyb2xsYmFyJiYoYS5zY3JvbGxiYXI9bnVsbCx4KGEuc2Nyb2xsYmFyQnV0dG9ucykpfX07YS5TY3JvbGxiYXJ8fChBKEUsXCJhZnRlckluaXRcIixmdW5jdGlvbigpe3ZhciBiPXRoaXM7Yi5vcHRpb25zJiZiLm9wdGlvbnMuc2Nyb2xsYmFyJiZiLm9wdGlvbnMuc2Nyb2xsYmFyLmVuYWJsZWQmJihiLm9wdGlvbnMuc2Nyb2xsYmFyLnZlcnRpY2FsPSFiLmhvcml6LGIub3B0aW9ucy5zdGFydE9uVGljaz1iLm9wdGlvbnMuZW5kT25UaWNrPSExLGIuc2Nyb2xsYmFyPW5ldyBDKGIuY2hhcnQucmVuZGVyZXIsYi5vcHRpb25zLnNjcm9sbGJhcixiLmNoYXJ0KSxBKGIuc2Nyb2xsYmFyLFwiY2hhbmdlZFwiLGZ1bmN0aW9uKGUpe3ZhciBjPU1hdGgubWluKGYoYi5vcHRpb25zLm1pbixiLm1pbiksYi5taW4sYi5kYXRhTWluKSxnPU1hdGgubWF4KGYoYi5vcHRpb25zLm1heCxiLm1heCksXG5iLm1heCxiLmRhdGFNYXgpLWMsaDtiLmhvcml6JiYhYi5yZXZlcnNlZHx8IWIuaG9yaXomJmIucmV2ZXJzZWQ/KGg9YytnKnRoaXMudG8sYys9Zyp0aGlzLmZyb20pOihoPWMrZyooMS10aGlzLmZyb20pLGMrPWcqKDEtdGhpcy50bykpO2YodGhpcy5vcHRpb25zLmxpdmVSZWRyYXcsYS5zdmcmJiFhLmlzVG91Y2hEZXZpY2UmJiF0aGlzLmNoYXJ0LmlzQm9vc3RpbmcpfHxcIm1vdXNldXBcIj09PWUuRE9NVHlwZXx8IXYoZS5ET01UeXBlKT9iLnNldEV4dHJlbWVzKGMsaCwhMCxcIm1vdXNlbW92ZVwiIT09ZS5ET01UeXBlLGUpOnRoaXMuc2V0UmFuZ2UodGhpcy5mcm9tLHRoaXMudG8pfSkpfSksQShFLFwiYWZ0ZXJSZW5kZXJcIixmdW5jdGlvbigpe3ZhciBhPU1hdGgubWluKGYodGhpcy5vcHRpb25zLm1pbix0aGlzLm1pbiksdGhpcy5taW4sZih0aGlzLmRhdGFNaW4sdGhpcy5taW4pKSxlPU1hdGgubWF4KGYodGhpcy5vcHRpb25zLm1heCx0aGlzLm1heCksdGhpcy5tYXgsZih0aGlzLmRhdGFNYXgsXG50aGlzLm1heCkpLGM9dGhpcy5zY3JvbGxiYXIsZz10aGlzLmF4aXNUaXRsZU1hcmdpbisodGhpcy50aXRsZU9mZnNldHx8MCksaD10aGlzLmNoYXJ0LnNjcm9sbGJhcnNPZmZzZXRzLG49dGhpcy5vcHRpb25zLm1hcmdpbnx8MDtjJiYodGhpcy5ob3Jpej8odGhpcy5vcHBvc2l0ZXx8KGhbMV0rPWcpLGMucG9zaXRpb24odGhpcy5sZWZ0LHRoaXMudG9wK3RoaXMuaGVpZ2h0KzIraFsxXS0odGhpcy5vcHBvc2l0ZT9uOjApLHRoaXMud2lkdGgsdGhpcy5oZWlnaHQpLHRoaXMub3Bwb3NpdGV8fChoWzFdKz1uKSxnPTEpOih0aGlzLm9wcG9zaXRlJiYoaFswXSs9ZyksYy5wb3NpdGlvbih0aGlzLmxlZnQrdGhpcy53aWR0aCsyK2hbMF0tKHRoaXMub3Bwb3NpdGU/MDpuKSx0aGlzLnRvcCx0aGlzLndpZHRoLHRoaXMuaGVpZ2h0KSx0aGlzLm9wcG9zaXRlJiYoaFswXSs9biksZz0wKSxoW2ddKz1jLnNpemUrYy5vcHRpb25zLm1hcmdpbixpc05hTihhKXx8aXNOYU4oZSl8fCF2KHRoaXMubWluKXx8XG4hdih0aGlzLm1heCl8fHRoaXMubWluPT09dGhpcy5tYXg/Yy5zZXRSYW5nZSgwLDEpOihoPSh0aGlzLm1pbi1hKS8oZS1hKSxhPSh0aGlzLm1heC1hKS8oZS1hKSx0aGlzLmhvcml6JiYhdGhpcy5yZXZlcnNlZHx8IXRoaXMuaG9yaXomJnRoaXMucmV2ZXJzZWQ/Yy5zZXRSYW5nZShoLGEpOmMuc2V0UmFuZ2UoMS1hLDEtaCkpKX0pLEEoRSxcImFmdGVyR2V0T2Zmc2V0XCIsZnVuY3Rpb24oKXt2YXIgYT10aGlzLmhvcml6PzI6MSxlPXRoaXMuc2Nyb2xsYmFyO2UmJih0aGlzLmNoYXJ0LnNjcm9sbGJhcnNPZmZzZXRzPVswLDBdLHRoaXMuY2hhcnQuYXhpc09mZnNldFthXSs9ZS5zaXplK2Uub3B0aW9ucy5tYXJnaW4pfSksYS5TY3JvbGxiYXI9Qyl9KTtJKEgsXCJwYXJ0cy9OYXZpZ2F0b3IuanNcIixbSFtcInBhcnRzL0dsb2JhbHMuanNcIl1dLGZ1bmN0aW9uKGEpe2Z1bmN0aW9uIEMoYSl7dGhpcy5pbml0KGEpfXZhciBBPWEuYWRkRXZlbnQsRT1hLkF4aXMsbT1hLkNoYXJ0LGc9YS5jb2xvcixcbnY9YS5kZWZhdWx0T3B0aW9ucyx4PWEuZGVmaW5lZCx5PWEuZGVzdHJveU9iamVjdFByb3BlcnRpZXMsej1hLmVyYXNlLG49YS5leHRlbmQsZj1hLmhhc1RvdWNoLGg9YS5pc0FycmF5LHI9YS5pc051bWJlcixlPWEuaXNUb3VjaERldmljZSxiPWEubWVyZ2UsbD1hLnBpY2ssYz1hLnJlbW92ZUV2ZW50LHQ9YS5TY3JvbGxiYXIsRj1hLlNlcmllcyx3LEI9ZnVuY3Rpb24oYSl7dmFyIGI9W10uZmlsdGVyLmNhbGwoYXJndW1lbnRzLHIpO2lmKGIubGVuZ3RoKXJldHVybiBNYXRoW2FdLmFwcGx5KDAsYil9O3c9dm9pZCAwPT09YS5zZXJpZXNUeXBlcy5hcmVhc3BsaW5lP1wibGluZVwiOlwiYXJlYXNwbGluZVwiO24odix7bmF2aWdhdG9yOntoZWlnaHQ6NDAsbWFyZ2luOjI1LG1hc2tJbnNpZGU6ITAsaGFuZGxlczp7d2lkdGg6NyxoZWlnaHQ6MTUsc3ltYm9sczpbXCJuYXZpZ2F0b3ItaGFuZGxlXCIsXCJuYXZpZ2F0b3ItaGFuZGxlXCJdLGVuYWJsZWQ6ITAsbGluZVdpZHRoOjEsYmFja2dyb3VuZENvbG9yOlwiI2YyZjJmMlwiLFxuYm9yZGVyQ29sb3I6XCIjOTk5OTk5XCJ9LG1hc2tGaWxsOmcoXCIjNjY4NWMyXCIpLnNldE9wYWNpdHkoLjMpLmdldCgpLG91dGxpbmVDb2xvcjpcIiNjY2NjY2NcIixvdXRsaW5lV2lkdGg6MSxzZXJpZXM6e3R5cGU6dyxmaWxsT3BhY2l0eTouMDUsbGluZVdpZHRoOjEsY29tcGFyZTpudWxsLGRhdGFHcm91cGluZzp7YXBwcm94aW1hdGlvbjpcImF2ZXJhZ2VcIixlbmFibGVkOiEwLGdyb3VwUGl4ZWxXaWR0aDoyLHNtb290aGVkOiEwLHVuaXRzOltbXCJtaWxsaXNlY29uZFwiLFsxLDIsNSwxMCwyMCwyNSw1MCwxMDAsMjAwLDUwMF1dLFtcInNlY29uZFwiLFsxLDIsNSwxMCwxNSwzMF1dLFtcIm1pbnV0ZVwiLFsxLDIsNSwxMCwxNSwzMF1dLFtcImhvdXJcIixbMSwyLDMsNCw2LDgsMTJdXSxbXCJkYXlcIixbMSwyLDMsNF1dLFtcIndlZWtcIixbMSwyLDNdXSxbXCJtb250aFwiLFsxLDMsNl1dLFtcInllYXJcIixudWxsXV19LGRhdGFMYWJlbHM6e2VuYWJsZWQ6ITEsekluZGV4OjJ9LGlkOlwiaGlnaGNoYXJ0cy1uYXZpZ2F0b3Itc2VyaWVzXCIsXG5jbGFzc05hbWU6XCJoaWdoY2hhcnRzLW5hdmlnYXRvci1zZXJpZXNcIixsaW5lQ29sb3I6bnVsbCxtYXJrZXI6e2VuYWJsZWQ6ITF9LHBvaW50UmFuZ2U6MCx0aHJlc2hvbGQ6bnVsbH0seEF4aXM6e292ZXJzY3JvbGw6MCxjbGFzc05hbWU6XCJoaWdoY2hhcnRzLW5hdmlnYXRvci14YXhpc1wiLHRpY2tMZW5ndGg6MCxsaW5lV2lkdGg6MCxncmlkTGluZUNvbG9yOlwiI2U2ZTZlNlwiLGdyaWRMaW5lV2lkdGg6MSx0aWNrUGl4ZWxJbnRlcnZhbDoyMDAsbGFiZWxzOnthbGlnbjpcImxlZnRcIixzdHlsZTp7Y29sb3I6XCIjOTk5OTk5XCJ9LHg6Myx5Oi00fSxjcm9zc2hhaXI6ITF9LHlBeGlzOntjbGFzc05hbWU6XCJoaWdoY2hhcnRzLW5hdmlnYXRvci15YXhpc1wiLGdyaWRMaW5lV2lkdGg6MCxzdGFydE9uVGljazohMSxlbmRPblRpY2s6ITEsbWluUGFkZGluZzouMSxtYXhQYWRkaW5nOi4xLGxhYmVsczp7ZW5hYmxlZDohMX0sY3Jvc3NoYWlyOiExLHRpdGxlOnt0ZXh0Om51bGx9LHRpY2tMZW5ndGg6MCxcbnRpY2tXaWR0aDowfX19KTthLlJlbmRlcmVyLnByb3RvdHlwZS5zeW1ib2xzW1wibmF2aWdhdG9yLWhhbmRsZVwiXT1mdW5jdGlvbihhLGIsYyxlLGYpe2E9Zi53aWR0aC8yO2I9TWF0aC5yb3VuZChhLzMpKy41O2Y9Zi5oZWlnaHQ7cmV0dXJuW1wiTVwiLC1hLTEsLjUsXCJMXCIsYSwuNSxcIkxcIixhLGYrLjUsXCJMXCIsLWEtMSxmKy41LFwiTFwiLC1hLTEsLjUsXCJNXCIsLWIsNCxcIkxcIiwtYixmLTMsXCJNXCIsYi0xLDQsXCJMXCIsYi0xLGYtM119O0UucHJvdG90eXBlLnRvRml4ZWRSYW5nZT1mdW5jdGlvbihhLGIsYyxlKXt2YXIgZD10aGlzLmNoYXJ0JiZ0aGlzLmNoYXJ0LmZpeGVkUmFuZ2U7YT1sKGMsdGhpcy50cmFuc2xhdGUoYSwhMCwhdGhpcy5ob3JpeikpO2I9bChlLHRoaXMudHJhbnNsYXRlKGIsITAsIXRoaXMuaG9yaXopKTtjPWQmJihiLWEpL2Q7Ljc8YyYmMS4zPmMmJihlP2E9Yi1kOmI9YStkKTtyKGEpJiZyKGIpfHwoYT1iPXZvaWQgMCk7cmV0dXJue21pbjphLG1heDpifX07Qy5wcm90b3R5cGU9XG57ZHJhd0hhbmRsZTpmdW5jdGlvbihhLGIsYyxlKXt2YXIgZD10aGlzLm5hdmlnYXRvck9wdGlvbnMuaGFuZGxlcy5oZWlnaHQ7dGhpcy5oYW5kbGVzW2JdW2VdKGM/e3RyYW5zbGF0ZVg6TWF0aC5yb3VuZCh0aGlzLmxlZnQrdGhpcy5oZWlnaHQvMiksdHJhbnNsYXRlWTpNYXRoLnJvdW5kKHRoaXMudG9wK3BhcnNlSW50KGEsMTApKy41LWQpfTp7dHJhbnNsYXRlWDpNYXRoLnJvdW5kKHRoaXMubGVmdCtwYXJzZUludChhLDEwKSksdHJhbnNsYXRlWTpNYXRoLnJvdW5kKHRoaXMudG9wK3RoaXMuaGVpZ2h0LzItZC8yLTEpfSl9LGRyYXdPdXRsaW5lOmZ1bmN0aW9uKGEsYixjLGUpe3ZhciBkPXRoaXMubmF2aWdhdG9yT3B0aW9ucy5tYXNrSW5zaWRlLGY9dGhpcy5vdXRsaW5lLnN0cm9rZVdpZHRoKCksZz1mLzIsZj1mJTIvMixrPXRoaXMub3V0bGluZUhlaWdodCxoPXRoaXMuc2Nyb2xsYmFySGVpZ2h0LHA9dGhpcy5zaXplLGw9dGhpcy5sZWZ0LWgsdT10aGlzLnRvcDtjPyhsLT1nLGM9XG51K2IrZixiPXUrYStmLGE9W1wiTVwiLGwrayx1LWgtZixcIkxcIixsK2ssYyxcIkxcIixsLGMsXCJMXCIsbCxiLFwiTFwiLGwrayxiLFwiTFwiLGwrayx1K3AraF0uY29uY2F0KGQ/W1wiTVwiLGwrayxjLWcsXCJMXCIsbCtrLGIrZ106W10pKTooYSs9bCtoLWYsYis9bCtoLWYsdSs9ZyxhPVtcIk1cIixsLHUsXCJMXCIsYSx1LFwiTFwiLGEsdStrLFwiTFwiLGIsdStrLFwiTFwiLGIsdSxcIkxcIixsK3ArMipoLHVdLmNvbmNhdChkP1tcIk1cIixhLWcsdSxcIkxcIixiK2csdV06W10pKTt0aGlzLm91dGxpbmVbZV0oe2Q6YX0pfSxkcmF3TWFza3M6ZnVuY3Rpb24oYSxiLGMsZSl7dmFyIGQ9dGhpcy5sZWZ0LGY9dGhpcy50b3AsZz10aGlzLmhlaWdodCxrLGgscCxsO2M/KHA9W2QsZCxkXSxsPVtmLGYrYSxmK2JdLGg9W2csZyxnXSxrPVthLGItYSx0aGlzLnNpemUtYl0pOihwPVtkLGQrYSxkK2JdLGw9W2YsZixmXSxoPVthLGItYSx0aGlzLnNpemUtYl0saz1bZyxnLGddKTt0aGlzLnNoYWRlcy5mb3JFYWNoKGZ1bmN0aW9uKGEsYil7YVtlXSh7eDpwW2JdLFxueTpsW2JdLHdpZHRoOmhbYl0saGVpZ2h0OmtbYl19KX0pfSxyZW5kZXJFbGVtZW50czpmdW5jdGlvbigpe3ZhciBhPXRoaXMsYj1hLm5hdmlnYXRvck9wdGlvbnMsYz1iLm1hc2tJbnNpZGUsZT1hLmNoYXJ0LGY9ZS5yZW5kZXJlcixnLGg9e2N1cnNvcjplLmludmVydGVkP1wibnMtcmVzaXplXCI6XCJldy1yZXNpemVcIn07YS5uYXZpZ2F0b3JHcm91cD1nPWYuZyhcIm5hdmlnYXRvclwiKS5hdHRyKHt6SW5kZXg6OCx2aXNpYmlsaXR5OlwiaGlkZGVuXCJ9KS5hZGQoKTtbIWMsYywhY10uZm9yRWFjaChmdW5jdGlvbihkLGMpe2Euc2hhZGVzW2NdPWYucmVjdCgpLmFkZENsYXNzKFwiaGlnaGNoYXJ0cy1uYXZpZ2F0b3ItbWFza1wiKygxPT09Yz9cIi1pbnNpZGVcIjpcIi1vdXRzaWRlXCIpKS5hZGQoZyk7ZS5zdHlsZWRNb2RlfHxhLnNoYWRlc1tjXS5hdHRyKHtmaWxsOmQ/Yi5tYXNrRmlsbDpcInJnYmEoMCwwLDAsMClcIn0pLmNzcygxPT09YyYmaCl9KTthLm91dGxpbmU9Zi5wYXRoKCkuYWRkQ2xhc3MoXCJoaWdoY2hhcnRzLW5hdmlnYXRvci1vdXRsaW5lXCIpLmFkZChnKTtcbmUuc3R5bGVkTW9kZXx8YS5vdXRsaW5lLmF0dHIoe1wic3Ryb2tlLXdpZHRoXCI6Yi5vdXRsaW5lV2lkdGgsc3Ryb2tlOmIub3V0bGluZUNvbG9yfSk7Yi5oYW5kbGVzLmVuYWJsZWQmJlswLDFdLmZvckVhY2goZnVuY3Rpb24oZCl7Yi5oYW5kbGVzLmludmVydGVkPWUuaW52ZXJ0ZWQ7YS5oYW5kbGVzW2RdPWYuc3ltYm9sKGIuaGFuZGxlcy5zeW1ib2xzW2RdLC1iLmhhbmRsZXMud2lkdGgvMi0xLDAsYi5oYW5kbGVzLndpZHRoLGIuaGFuZGxlcy5oZWlnaHQsYi5oYW5kbGVzKTthLmhhbmRsZXNbZF0uYXR0cih7ekluZGV4OjctZH0pLmFkZENsYXNzKFwiaGlnaGNoYXJ0cy1uYXZpZ2F0b3ItaGFuZGxlIGhpZ2hjaGFydHMtbmF2aWdhdG9yLWhhbmRsZS1cIitbXCJsZWZ0XCIsXCJyaWdodFwiXVtkXSkuYWRkKGcpO2lmKCFlLnN0eWxlZE1vZGUpe3ZhciBjPWIuaGFuZGxlczthLmhhbmRsZXNbZF0uYXR0cih7ZmlsbDpjLmJhY2tncm91bmRDb2xvcixzdHJva2U6Yy5ib3JkZXJDb2xvcixcInN0cm9rZS13aWR0aFwiOmMubGluZVdpZHRofSkuY3NzKGgpfX0pfSxcbnVwZGF0ZTpmdW5jdGlvbihhKXsodGhpcy5zZXJpZXN8fFtdKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe2EuYmFzZVNlcmllcyYmZGVsZXRlIGEuYmFzZVNlcmllcy5uYXZpZ2F0b3JTZXJpZXN9KTt0aGlzLmRlc3Ryb3koKTtiKCEwLHRoaXMuY2hhcnQub3B0aW9ucy5uYXZpZ2F0b3IsdGhpcy5vcHRpb25zLGEpO3RoaXMuaW5pdCh0aGlzLmNoYXJ0KX0scmVuZGVyOmZ1bmN0aW9uKGIsZCxjLGUpe3ZhciBmPXRoaXMuY2hhcnQsZyxrLGg9dGhpcy5zY3JvbGxiYXJIZWlnaHQscCx1PXRoaXMueEF4aXM7Zz11LmZha2U/Zi54QXhpc1swXTp1O3ZhciB0PXRoaXMubmF2aWdhdG9yRW5hYmxlZCxuLG09dGhpcy5yZW5kZXJlZDtrPWYuaW52ZXJ0ZWQ7dmFyIHcsdj1mLnhBeGlzWzBdLm1pblJhbmdlLHk9Zi54QXhpc1swXS5vcHRpb25zLm1heFJhbmdlO2lmKCF0aGlzLmhhc0RyYWdnZWR8fHgoYykpe2lmKCFyKGIpfHwhcihkKSlpZihtKWM9MCxlPWwodS53aWR0aCxnLndpZHRoKTtlbHNlIHJldHVybjtcbnRoaXMubGVmdD1sKHUubGVmdCxmLnBsb3RMZWZ0K2grKGs/Zi5wbG90V2lkdGg6MCkpO3RoaXMuc2l6ZT1uPXA9bCh1Lmxlbiwoaz9mLnBsb3RIZWlnaHQ6Zi5wbG90V2lkdGgpLTIqaCk7Zj1rP2g6cCsyKmg7Yz1sKGMsdS50b1BpeGVscyhiLCEwKSk7ZT1sKGUsdS50b1BpeGVscyhkLCEwKSk7cihjKSYmSW5maW5pdHkhPT1NYXRoLmFicyhjKXx8KGM9MCxlPWYpO2I9dS50b1ZhbHVlKGMsITApO2Q9dS50b1ZhbHVlKGUsITApO3c9TWF0aC5hYnMoYS5jb3JyZWN0RmxvYXQoZC1iKSk7dzx2P3RoaXMuZ3JhYmJlZExlZnQ/Yz11LnRvUGl4ZWxzKGQtdiwhMCk6dGhpcy5ncmFiYmVkUmlnaHQmJihlPXUudG9QaXhlbHMoYit2LCEwKSk6eCh5KSYmdz55JiYodGhpcy5ncmFiYmVkTGVmdD9jPXUudG9QaXhlbHMoZC15LCEwKTp0aGlzLmdyYWJiZWRSaWdodCYmKGU9dS50b1BpeGVscyhiK3ksITApKSk7dGhpcy56b29tZWRNYXg9TWF0aC5taW4oTWF0aC5tYXgoYyxlLDApLG4pO3RoaXMuem9vbWVkTWluPVxuTWF0aC5taW4oTWF0aC5tYXgodGhpcy5maXhlZFdpZHRoP3RoaXMuem9vbWVkTWF4LXRoaXMuZml4ZWRXaWR0aDpNYXRoLm1pbihjLGUpLDApLG4pO3RoaXMucmFuZ2U9dGhpcy56b29tZWRNYXgtdGhpcy56b29tZWRNaW47bj1NYXRoLnJvdW5kKHRoaXMuem9vbWVkTWF4KTtjPU1hdGgucm91bmQodGhpcy56b29tZWRNaW4pO3QmJih0aGlzLm5hdmlnYXRvckdyb3VwLmF0dHIoe3Zpc2liaWxpdHk6XCJ2aXNpYmxlXCJ9KSxtPW0mJiF0aGlzLmhhc0RyYWdnZWQ/XCJhbmltYXRlXCI6XCJhdHRyXCIsdGhpcy5kcmF3TWFza3MoYyxuLGssbSksdGhpcy5kcmF3T3V0bGluZShjLG4sayxtKSx0aGlzLm5hdmlnYXRvck9wdGlvbnMuaGFuZGxlcy5lbmFibGVkJiYodGhpcy5kcmF3SGFuZGxlKGMsMCxrLG0pLHRoaXMuZHJhd0hhbmRsZShuLDEsayxtKSkpO3RoaXMuc2Nyb2xsYmFyJiYoaz8oaz10aGlzLnRvcC1oLGc9dGhpcy5sZWZ0LWgrKHR8fCFnLm9wcG9zaXRlPzA6KGcudGl0bGVPZmZzZXR8fDApK1xuZy5heGlzVGl0bGVNYXJnaW4pLGg9cCsyKmgpOihrPXRoaXMudG9wKyh0P3RoaXMuaGVpZ2h0Oi1oKSxnPXRoaXMubGVmdC1oKSx0aGlzLnNjcm9sbGJhci5wb3NpdGlvbihnLGssZixoKSx0aGlzLnNjcm9sbGJhci5zZXRSYW5nZSh0aGlzLnpvb21lZE1pbi8ocHx8MSksdGhpcy56b29tZWRNYXgvKHB8fDEpKSk7dGhpcy5yZW5kZXJlZD0hMH19LGFkZE1vdXNlRXZlbnRzOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcyxiPWEuY2hhcnQsYz1iLmNvbnRhaW5lcixlPVtdLGcsaDthLm1vdXNlTW92ZUhhbmRsZXI9Zz1mdW5jdGlvbihiKXthLm9uTW91c2VNb3ZlKGIpfTthLm1vdXNlVXBIYW5kbGVyPWg9ZnVuY3Rpb24oYil7YS5vbk1vdXNlVXAoYil9O2U9YS5nZXRQYXJ0c0V2ZW50cyhcIm1vdXNlZG93blwiKTtlLnB1c2goQShjLFwibW91c2Vtb3ZlXCIsZyksQShjLm93bmVyRG9jdW1lbnQsXCJtb3VzZXVwXCIsaCkpO2YmJihlLnB1c2goQShjLFwidG91Y2htb3ZlXCIsZyksQShjLm93bmVyRG9jdW1lbnQsXG5cInRvdWNoZW5kXCIsaCkpLGUuY29uY2F0KGEuZ2V0UGFydHNFdmVudHMoXCJ0b3VjaHN0YXJ0XCIpKSk7YS5ldmVudHNUb1VuYmluZD1lO2Euc2VyaWVzJiZhLnNlcmllc1swXSYmZS5wdXNoKEEoYS5zZXJpZXNbMF0ueEF4aXMsXCJmb3VuZEV4dHJlbWVzXCIsZnVuY3Rpb24oKXtiLm5hdmlnYXRvci5tb2RpZnlOYXZpZ2F0b3JBeGlzRXh0cmVtZXMoKX0pKX0sZ2V0UGFydHNFdmVudHM6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcyxjPVtdO1tcInNoYWRlc1wiLFwiaGFuZGxlc1wiXS5mb3JFYWNoKGZ1bmN0aW9uKGQpe2JbZF0uZm9yRWFjaChmdW5jdGlvbihlLGYpe2MucHVzaChBKGUuZWxlbWVudCxhLGZ1bmN0aW9uKGEpe2JbZCtcIk1vdXNlZG93blwiXShhLGYpfSkpfSl9KTtyZXR1cm4gY30sc2hhZGVzTW91c2Vkb3duOmZ1bmN0aW9uKGEsYil7YT10aGlzLmNoYXJ0LnBvaW50ZXIubm9ybWFsaXplKGEpO3ZhciBkPXRoaXMuY2hhcnQsYz10aGlzLnhBeGlzLGU9dGhpcy56b29tZWRNaW4sZj10aGlzLmxlZnQsXG5nPXRoaXMuc2l6ZSxoPXRoaXMucmFuZ2UsbD1hLmNoYXJ0WCxwLHQ7ZC5pbnZlcnRlZCYmKGw9YS5jaGFydFksZj10aGlzLnRvcCk7MT09PWI/KHRoaXMuZ3JhYmJlZENlbnRlcj1sLHRoaXMuZml4ZWRXaWR0aD1oLHRoaXMuZHJhZ09mZnNldD1sLWUpOihhPWwtZi1oLzIsMD09PWI/YT1NYXRoLm1heCgwLGEpOjI9PT1iJiZhK2g+PWcmJihhPWctaCx0aGlzLnJldmVyc2VkRXh0cmVtZXM/KGEtPWgsdD10aGlzLmdldFVuaW9uRXh0cmVtZXMoKS5kYXRhTWluKTpwPXRoaXMuZ2V0VW5pb25FeHRyZW1lcygpLmRhdGFNYXgpLGEhPT1lJiYodGhpcy5maXhlZFdpZHRoPWgsYj1jLnRvRml4ZWRSYW5nZShhLGEraCx0LHApLHgoYi5taW4pJiZkLnhBeGlzWzBdLnNldEV4dHJlbWVzKE1hdGgubWluKGIubWluLGIubWF4KSxNYXRoLm1heChiLm1pbixiLm1heCksITAsbnVsbCx7dHJpZ2dlcjpcIm5hdmlnYXRvclwifSkpKX0saGFuZGxlc01vdXNlZG93bjpmdW5jdGlvbihhLGIpe3RoaXMuY2hhcnQucG9pbnRlci5ub3JtYWxpemUoYSk7XG5hPXRoaXMuY2hhcnQ7dmFyIGQ9YS54QXhpc1swXSxjPXRoaXMucmV2ZXJzZWRFeHRyZW1lczswPT09Yj8odGhpcy5ncmFiYmVkTGVmdD0hMCx0aGlzLm90aGVySGFuZGxlUG9zPXRoaXMuem9vbWVkTWF4LHRoaXMuZml4ZWRFeHRyZW1lPWM/ZC5taW46ZC5tYXgpOih0aGlzLmdyYWJiZWRSaWdodD0hMCx0aGlzLm90aGVySGFuZGxlUG9zPXRoaXMuem9vbWVkTWluLHRoaXMuZml4ZWRFeHRyZW1lPWM/ZC5tYXg6ZC5taW4pO2EuZml4ZWRSYW5nZT1udWxsfSxvbk1vdXNlTW92ZTpmdW5jdGlvbihiKXt2YXIgZD10aGlzLGM9ZC5jaGFydCxmPWQubGVmdCxnPWQubmF2aWdhdG9yU2l6ZSxoPWQucmFuZ2UscD1kLmRyYWdPZmZzZXQsdD1jLmludmVydGVkO2IudG91Y2hlcyYmMD09PWIudG91Y2hlc1swXS5wYWdlWHx8KGI9Yy5wb2ludGVyLm5vcm1hbGl6ZShiKSxjPWIuY2hhcnRYLHQmJihmPWQudG9wLGM9Yi5jaGFydFkpLGQuZ3JhYmJlZExlZnQ/KGQuaGFzRHJhZ2dlZD0hMCxkLnJlbmRlcigwLFxuMCxjLWYsZC5vdGhlckhhbmRsZVBvcykpOmQuZ3JhYmJlZFJpZ2h0PyhkLmhhc0RyYWdnZWQ9ITAsZC5yZW5kZXIoMCwwLGQub3RoZXJIYW5kbGVQb3MsYy1mKSk6ZC5ncmFiYmVkQ2VudGVyJiYoZC5oYXNEcmFnZ2VkPSEwLGM8cD9jPXA6Yz5nK3AtaCYmKGM9ZytwLWgpLGQucmVuZGVyKDAsMCxjLXAsYy1wK2gpKSxkLmhhc0RyYWdnZWQmJmQuc2Nyb2xsYmFyJiZsKGQuc2Nyb2xsYmFyLm9wdGlvbnMubGl2ZVJlZHJhdyxhLnN2ZyYmIWUmJiF0aGlzLmNoYXJ0LmlzQm9vc3RpbmcpJiYoYi5ET01UeXBlPWIudHlwZSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZC5vbk1vdXNlVXAoYil9LDApKSl9LG9uTW91c2VVcDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmNoYXJ0LGM9dGhpcy54QXhpcyxlPXRoaXMuc2Nyb2xsYmFyLGYsZyxoPWEuRE9NRXZlbnR8fGE7KCF0aGlzLmhhc0RyYWdnZWR8fGUmJmUuaGFzRHJhZ2dlZCkmJlwic2Nyb2xsYmFyXCIhPT1hLnRyaWdnZXJ8fChlPXRoaXMuZ2V0VW5pb25FeHRyZW1lcygpLFxudGhpcy56b29tZWRNaW49PT10aGlzLm90aGVySGFuZGxlUG9zP2Y9dGhpcy5maXhlZEV4dHJlbWU6dGhpcy56b29tZWRNYXg9PT10aGlzLm90aGVySGFuZGxlUG9zJiYoZz10aGlzLmZpeGVkRXh0cmVtZSksdGhpcy56b29tZWRNYXg9PT10aGlzLnNpemUmJihnPXRoaXMucmV2ZXJzZWRFeHRyZW1lcz9lLmRhdGFNaW46ZS5kYXRhTWF4KSwwPT09dGhpcy56b29tZWRNaW4mJihmPXRoaXMucmV2ZXJzZWRFeHRyZW1lcz9lLmRhdGFNYXg6ZS5kYXRhTWluKSxjPWMudG9GaXhlZFJhbmdlKHRoaXMuem9vbWVkTWluLHRoaXMuem9vbWVkTWF4LGYsZykseChjLm1pbikmJmIueEF4aXNbMF0uc2V0RXh0cmVtZXMoTWF0aC5taW4oYy5taW4sYy5tYXgpLE1hdGgubWF4KGMubWluLGMubWF4KSwhMCx0aGlzLmhhc0RyYWdnZWQ/ITE6bnVsbCx7dHJpZ2dlcjpcIm5hdmlnYXRvclwiLHRyaWdnZXJPcDpcIm5hdmlnYXRvci1kcmFnXCIsRE9NRXZlbnQ6aH0pKTtcIm1vdXNlbW92ZVwiIT09YS5ET01UeXBlJiYodGhpcy5ncmFiYmVkTGVmdD1cbnRoaXMuZ3JhYmJlZFJpZ2h0PXRoaXMuZ3JhYmJlZENlbnRlcj10aGlzLmZpeGVkV2lkdGg9dGhpcy5maXhlZEV4dHJlbWU9dGhpcy5vdGhlckhhbmRsZVBvcz10aGlzLmhhc0RyYWdnZWQ9dGhpcy5kcmFnT2Zmc2V0PW51bGwpfSxyZW1vdmVFdmVudHM6ZnVuY3Rpb24oKXt0aGlzLmV2ZW50c1RvVW5iaW5kJiYodGhpcy5ldmVudHNUb1VuYmluZC5mb3JFYWNoKGZ1bmN0aW9uKGEpe2EoKX0pLHRoaXMuZXZlbnRzVG9VbmJpbmQ9dm9pZCAwKTt0aGlzLnJlbW92ZUJhc2VTZXJpZXNFdmVudHMoKX0scmVtb3ZlQmFzZVNlcmllc0V2ZW50czpmdW5jdGlvbigpe3ZhciBhPXRoaXMuYmFzZVNlcmllc3x8W107dGhpcy5uYXZpZ2F0b3JFbmFibGVkJiZhWzBdJiYoITEhPT10aGlzLm5hdmlnYXRvck9wdGlvbnMuYWRhcHRUb1VwZGF0ZWREYXRhJiZhLmZvckVhY2goZnVuY3Rpb24oYSl7YyhhLFwidXBkYXRlZERhdGFcIix0aGlzLnVwZGF0ZWREYXRhSGFuZGxlcil9LHRoaXMpLGFbMF0ueEF4aXMmJlxuYyhhWzBdLnhBeGlzLFwiZm91bmRFeHRyZW1lc1wiLHRoaXMubW9kaWZ5QmFzZUF4aXNFeHRyZW1lcykpfSxpbml0OmZ1bmN0aW9uKGEpe3ZhciBkPWEub3B0aW9ucyxjPWQubmF2aWdhdG9yLGU9Yy5lbmFibGVkLGY9ZC5zY3JvbGxiYXIsZz1mLmVuYWJsZWQsZD1lP2MuaGVpZ2h0OjAsaD1nP2YuaGVpZ2h0OjA7dGhpcy5oYW5kbGVzPVtdO3RoaXMuc2hhZGVzPVtdO3RoaXMuY2hhcnQ9YTt0aGlzLnNldEJhc2VTZXJpZXMoKTt0aGlzLmhlaWdodD1kO3RoaXMuc2Nyb2xsYmFySGVpZ2h0PWg7dGhpcy5zY3JvbGxiYXJFbmFibGVkPWc7dGhpcy5uYXZpZ2F0b3JFbmFibGVkPWU7dGhpcy5uYXZpZ2F0b3JPcHRpb25zPWM7dGhpcy5zY3JvbGxiYXJPcHRpb25zPWY7dGhpcy5vdXRsaW5lSGVpZ2h0PWQraDt0aGlzLm9wcG9zaXRlPWwoYy5vcHBvc2l0ZSwhZSYmYS5pbnZlcnRlZCk7dmFyIHA9dGhpcyxlPXAuYmFzZVNlcmllcyxmPWEueEF4aXMubGVuZ3RoLGc9YS55QXhpcy5sZW5ndGgsbj1cbmUmJmVbMF0mJmVbMF0ueEF4aXN8fGEueEF4aXNbMF18fHtvcHRpb25zOnt9fTthLmlzRGlydHlCb3g9ITA7cC5uYXZpZ2F0b3JFbmFibGVkPyhwLnhBeGlzPW5ldyBFKGEsYih7YnJlYWtzOm4ub3B0aW9ucy5icmVha3Msb3JkaW5hbDpuLm9wdGlvbnMub3JkaW5hbH0sYy54QXhpcyx7aWQ6XCJuYXZpZ2F0b3IteC1heGlzXCIseUF4aXM6XCJuYXZpZ2F0b3IteS1heGlzXCIsaXNYOiEwLHR5cGU6XCJkYXRldGltZVwiLGluZGV4OmYsaXNJbnRlcm5hbDohMCxvZmZzZXQ6MCxrZWVwT3JkaW5hbFBhZGRpbmc6ITAsc3RhcnRPblRpY2s6ITEsZW5kT25UaWNrOiExLG1pblBhZGRpbmc6MCxtYXhQYWRkaW5nOjAsem9vbUVuYWJsZWQ6ITF9LGEuaW52ZXJ0ZWQ/e29mZnNldHM6W2gsMCwtaCwwXSx3aWR0aDpkfTp7b2Zmc2V0czpbMCwtaCwwLGhdLGhlaWdodDpkfSkpLHAueUF4aXM9bmV3IEUoYSxiKGMueUF4aXMse2lkOlwibmF2aWdhdG9yLXktYXhpc1wiLGFsaWduVGlja3M6ITEsb2Zmc2V0OjAsaW5kZXg6ZyxcbmlzSW50ZXJuYWw6ITAsem9vbUVuYWJsZWQ6ITF9LGEuaW52ZXJ0ZWQ/e3dpZHRoOmR9OntoZWlnaHQ6ZH0pKSxlfHxjLnNlcmllcy5kYXRhP3AudXBkYXRlTmF2aWdhdG9yU2VyaWVzKCExKTowPT09YS5zZXJpZXMubGVuZ3RoJiYocC51bmJpbmRSZWRyYXc9QShhLFwiYmVmb3JlUmVkcmF3XCIsZnVuY3Rpb24oKXswPGEuc2VyaWVzLmxlbmd0aCYmIXAuc2VyaWVzJiYocC5zZXRCYXNlU2VyaWVzKCkscC51bmJpbmRSZWRyYXcoKSl9KSkscC5yZXZlcnNlZEV4dHJlbWVzPWEuaW52ZXJ0ZWQmJiFwLnhBeGlzLnJldmVyc2VkfHwhYS5pbnZlcnRlZCYmcC54QXhpcy5yZXZlcnNlZCxwLnJlbmRlckVsZW1lbnRzKCkscC5hZGRNb3VzZUV2ZW50cygpKTpwLnhBeGlzPXt0cmFuc2xhdGU6ZnVuY3Rpb24oYixkKXt2YXIgYz1hLnhBeGlzWzBdLGU9Yy5nZXRFeHRyZW1lcygpLGY9Yy5sZW4tMipoLGc9QihcIm1pblwiLGMub3B0aW9ucy5taW4sZS5kYXRhTWluKSxjPUIoXCJtYXhcIixjLm9wdGlvbnMubWF4LFxuZS5kYXRhTWF4KS1nO3JldHVybiBkP2IqYy9mK2c6ZiooYi1nKS9jfSx0b1BpeGVsczpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy50cmFuc2xhdGUoYSl9LHRvVmFsdWU6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMudHJhbnNsYXRlKGEsITApfSx0b0ZpeGVkUmFuZ2U6RS5wcm90b3R5cGUudG9GaXhlZFJhbmdlLGZha2U6ITB9O2Eub3B0aW9ucy5zY3JvbGxiYXIuZW5hYmxlZCYmKGEuc2Nyb2xsYmFyPXAuc2Nyb2xsYmFyPW5ldyB0KGEucmVuZGVyZXIsYihhLm9wdGlvbnMuc2Nyb2xsYmFyLHttYXJnaW46cC5uYXZpZ2F0b3JFbmFibGVkPzA6MTAsdmVydGljYWw6YS5pbnZlcnRlZH0pLGEpLEEocC5zY3JvbGxiYXIsXCJjaGFuZ2VkXCIsZnVuY3Rpb24oYil7dmFyIGQ9cC5zaXplLGM9ZCp0aGlzLnRvLGQ9ZCp0aGlzLmZyb207cC5oYXNEcmFnZ2VkPXAuc2Nyb2xsYmFyLmhhc0RyYWdnZWQ7cC5yZW5kZXIoMCwwLGQsYyk7KGEub3B0aW9ucy5zY3JvbGxiYXIubGl2ZVJlZHJhd3x8XCJtb3VzZW1vdmVcIiE9PVxuYi5ET01UeXBlJiZcInRvdWNobW92ZVwiIT09Yi5ET01UeXBlKSYmc2V0VGltZW91dChmdW5jdGlvbigpe3Aub25Nb3VzZVVwKGIpfSl9KSk7cC5hZGRCYXNlU2VyaWVzRXZlbnRzKCk7cC5hZGRDaGFydEV2ZW50cygpfSxnZXRVbmlvbkV4dHJlbWVzOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuY2hhcnQueEF4aXNbMF0sYz10aGlzLnhBeGlzLGU9Yy5vcHRpb25zLGY9Yi5vcHRpb25zLGc7YSYmbnVsbD09PWIuZGF0YU1pbnx8KGc9e2RhdGFNaW46bChlJiZlLm1pbixCKFwibWluXCIsZi5taW4sYi5kYXRhTWluLGMuZGF0YU1pbixjLm1pbikpLGRhdGFNYXg6bChlJiZlLm1heCxCKFwibWF4XCIsZi5tYXgsYi5kYXRhTWF4LGMuZGF0YU1heCxjLm1heCkpfSk7cmV0dXJuIGd9LHNldEJhc2VTZXJpZXM6ZnVuY3Rpb24oYixkKXt2YXIgYz10aGlzLmNoYXJ0LGU9dGhpcy5iYXNlU2VyaWVzPVtdO2I9Ynx8Yy5vcHRpb25zJiZjLm9wdGlvbnMubmF2aWdhdG9yLmJhc2VTZXJpZXN8fChjLnNlcmllcy5sZW5ndGg/XG5hLmZpbmQoYy5zZXJpZXMsZnVuY3Rpb24oYSl7cmV0dXJuIWEub3B0aW9ucy5pc0ludGVybmFsfSkuaW5kZXg6MCk7KGMuc2VyaWVzfHxbXSkuZm9yRWFjaChmdW5jdGlvbihhLGQpe2Eub3B0aW9ucy5pc0ludGVybmFsfHwhYS5vcHRpb25zLnNob3dJbk5hdmlnYXRvciYmKGQhPT1iJiZhLm9wdGlvbnMuaWQhPT1ifHwhMT09PWEub3B0aW9ucy5zaG93SW5OYXZpZ2F0b3IpfHxlLnB1c2goYSl9KTt0aGlzLnhBeGlzJiYhdGhpcy54QXhpcy5mYWtlJiZ0aGlzLnVwZGF0ZU5hdmlnYXRvclNlcmllcyghMCxkKX0sdXBkYXRlTmF2aWdhdG9yU2VyaWVzOmZ1bmN0aW9uKGUsZCl7dmFyIGY9dGhpcyxnPWYuY2hhcnQsbD1mLmJhc2VTZXJpZXMscCxxLHQ9Zi5uYXZpZ2F0b3JPcHRpb25zLnNlcmllcyxyLG09e2VuYWJsZU1vdXNlVHJhY2tpbmc6ITEsaW5kZXg6bnVsbCxsaW5rZWRUbzpudWxsLGdyb3VwOlwibmF2XCIscGFkWEF4aXM6ITEseEF4aXM6XCJuYXZpZ2F0b3IteC1heGlzXCIseUF4aXM6XCJuYXZpZ2F0b3IteS1heGlzXCIsXG5zaG93SW5MZWdlbmQ6ITEsc3RhY2tpbmc6ITEsaXNJbnRlcm5hbDohMCxzdGF0ZXM6e2luYWN0aXZlOntvcGFjaXR5OjF9fX0sdz1mLnNlcmllcz0oZi5zZXJpZXN8fFtdKS5maWx0ZXIoZnVuY3Rpb24oYSl7dmFyIGI9YS5iYXNlU2VyaWVzO3JldHVybiAwPmwuaW5kZXhPZihiKT8oYiYmKGMoYixcInVwZGF0ZWREYXRhXCIsZi51cGRhdGVkRGF0YUhhbmRsZXIpLGRlbGV0ZSBiLm5hdmlnYXRvclNlcmllcyksYS5jaGFydCYmYS5kZXN0cm95KCksITEpOiEwfSk7bCYmbC5sZW5ndGgmJmwuZm9yRWFjaChmdW5jdGlvbihhKXt2YXIgYz1hLm5hdmlnYXRvclNlcmllcyxlPW4oe2NvbG9yOmEuY29sb3IsdmlzaWJsZTphLnZpc2libGV9LGgodCk/di5uYXZpZ2F0b3Iuc2VyaWVzOnQpO2MmJiExPT09Zi5uYXZpZ2F0b3JPcHRpb25zLmFkYXB0VG9VcGRhdGVkRGF0YXx8KG0ubmFtZT1cIk5hdmlnYXRvciBcIitsLmxlbmd0aCxwPWEub3B0aW9uc3x8e30scj1wLm5hdmlnYXRvck9wdGlvbnN8fHt9LFxucT1iKHAsbSxlLHIpLGU9ci5kYXRhfHxlLmRhdGEsZi5oYXNOYXZpZ2F0b3JEYXRhPWYuaGFzTmF2aWdhdG9yRGF0YXx8ISFlLHEuZGF0YT1lfHxwLmRhdGEmJnAuZGF0YS5zbGljZSgwKSxjJiZjLm9wdGlvbnM/Yy51cGRhdGUocSxkKTooYS5uYXZpZ2F0b3JTZXJpZXM9Zy5pbml0U2VyaWVzKHEpLGEubmF2aWdhdG9yU2VyaWVzLmJhc2VTZXJpZXM9YSx3LnB1c2goYS5uYXZpZ2F0b3JTZXJpZXMpKSl9KTtpZih0LmRhdGEmJighbHx8IWwubGVuZ3RoKXx8aCh0KSlmLmhhc05hdmlnYXRvckRhdGE9ITEsdD1hLnNwbGF0KHQpLHQuZm9yRWFjaChmdW5jdGlvbihhLGQpe20ubmFtZT1cIk5hdmlnYXRvciBcIisody5sZW5ndGgrMSk7cT1iKHYubmF2aWdhdG9yLnNlcmllcyx7Y29sb3I6Zy5zZXJpZXNbZF0mJiFnLnNlcmllc1tkXS5vcHRpb25zLmlzSW50ZXJuYWwmJmcuc2VyaWVzW2RdLmNvbG9yfHxnLm9wdGlvbnMuY29sb3JzW2RdfHxnLm9wdGlvbnMuY29sb3JzWzBdfSxtLGEpO3EuZGF0YT1cbmEuZGF0YTtxLmRhdGEmJihmLmhhc05hdmlnYXRvckRhdGE9ITAsdy5wdXNoKGcuaW5pdFNlcmllcyhxKSkpfSk7ZSYmdGhpcy5hZGRCYXNlU2VyaWVzRXZlbnRzKCl9LGFkZEJhc2VTZXJpZXNFdmVudHM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLGI9YS5iYXNlU2VyaWVzfHxbXTtiWzBdJiZiWzBdLnhBeGlzJiZBKGJbMF0ueEF4aXMsXCJmb3VuZEV4dHJlbWVzXCIsdGhpcy5tb2RpZnlCYXNlQXhpc0V4dHJlbWVzKTtiLmZvckVhY2goZnVuY3Rpb24oYil7QShiLFwic2hvd1wiLGZ1bmN0aW9uKCl7dGhpcy5uYXZpZ2F0b3JTZXJpZXMmJnRoaXMubmF2aWdhdG9yU2VyaWVzLnNldFZpc2libGUoITAsITEpfSk7QShiLFwiaGlkZVwiLGZ1bmN0aW9uKCl7dGhpcy5uYXZpZ2F0b3JTZXJpZXMmJnRoaXMubmF2aWdhdG9yU2VyaWVzLnNldFZpc2libGUoITEsITEpfSk7ITEhPT10aGlzLm5hdmlnYXRvck9wdGlvbnMuYWRhcHRUb1VwZGF0ZWREYXRhJiZiLnhBeGlzJiZBKGIsXCJ1cGRhdGVkRGF0YVwiLHRoaXMudXBkYXRlZERhdGFIYW5kbGVyKTtcbkEoYixcInJlbW92ZVwiLGZ1bmN0aW9uKCl7dGhpcy5uYXZpZ2F0b3JTZXJpZXMmJih6KGEuc2VyaWVzLHRoaXMubmF2aWdhdG9yU2VyaWVzKSx4KHRoaXMubmF2aWdhdG9yU2VyaWVzLm9wdGlvbnMpJiZ0aGlzLm5hdmlnYXRvclNlcmllcy5yZW1vdmUoITEpLGRlbGV0ZSB0aGlzLm5hdmlnYXRvclNlcmllcyl9KX0sdGhpcyl9LGdldEJhc2VTZXJpZXNNaW46ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuYmFzZVNlcmllcy5yZWR1Y2UoZnVuY3Rpb24oYSxiKXtyZXR1cm4gTWF0aC5taW4oYSxiLnhEYXRhP2IueERhdGFbMF06YSl9LGEpfSxtb2RpZnlOYXZpZ2F0b3JBeGlzRXh0cmVtZXM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnhBeGlzLGI7YS5nZXRFeHRyZW1lcyYmKCEoYj10aGlzLmdldFVuaW9uRXh0cmVtZXMoITApKXx8Yi5kYXRhTWluPT09YS5taW4mJmIuZGF0YU1heD09PWEubWF4fHwoYS5taW49Yi5kYXRhTWluLGEubWF4PWIuZGF0YU1heCkpfSxtb2RpZnlCYXNlQXhpc0V4dHJlbWVzOmZ1bmN0aW9uKCl7dmFyIGE9XG50aGlzLmNoYXJ0Lm5hdmlnYXRvcixiPXRoaXMuZ2V0RXh0cmVtZXMoKSxjPWIuZGF0YU1pbixlPWIuZGF0YU1heCxiPWIubWF4LWIubWluLGY9YS5zdGlja1RvTWluLGc9YS5zdGlja1RvTWF4LGg9bCh0aGlzLm9wdGlvbnMub3ZlcnNjcm9sbCwwKSx0LG4sbT1hLnNlcmllcyYmYS5zZXJpZXNbMF0sdz0hIXRoaXMuc2V0RXh0cmVtZXM7dGhpcy5ldmVudEFyZ3MmJlwicmFuZ2VTZWxlY3RvckJ1dHRvblwiPT09dGhpcy5ldmVudEFyZ3MudHJpZ2dlcnx8KGYmJihuPWMsdD1uK2IpLGcmJih0PWUraCxmfHwobj1NYXRoLm1heCh0LWIsYS5nZXRCYXNlU2VyaWVzTWluKG0mJm0ueERhdGE/bS54RGF0YVswXTotTnVtYmVyLk1BWF9WQUxVRSkpKSksdyYmKGZ8fGcpJiZyKG4pJiYodGhpcy5taW49dGhpcy51c2VyTWluPW4sdGhpcy5tYXg9dGhpcy51c2VyTWF4PXQpKTthLnN0aWNrVG9NaW49YS5zdGlja1RvTWF4PW51bGx9LHVwZGF0ZWREYXRhSGFuZGxlcjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuY2hhcnQubmF2aWdhdG9yLFxuYj10aGlzLm5hdmlnYXRvclNlcmllcyxjPWEuZ2V0QmFzZVNlcmllc01pbih0aGlzLnhEYXRhWzBdKTthLnN0aWNrVG9NYXg9YS5yZXZlcnNlZEV4dHJlbWVzPzA9PT1NYXRoLnJvdW5kKGEuem9vbWVkTWluKTpNYXRoLnJvdW5kKGEuem9vbWVkTWF4KT49TWF0aC5yb3VuZChhLnNpemUpO2Euc3RpY2tUb01pbj1yKHRoaXMueEF4aXMubWluKSYmdGhpcy54QXhpcy5taW48PWMmJighdGhpcy5jaGFydC5maXhlZFJhbmdlfHwhYS5zdGlja1RvTWF4KTtiJiYhYS5oYXNOYXZpZ2F0b3JEYXRhJiYoYi5vcHRpb25zLnBvaW50U3RhcnQ9dGhpcy54RGF0YVswXSxiLnNldERhdGEodGhpcy5vcHRpb25zLmRhdGEsITEsbnVsbCwhMSkpfSxhZGRDaGFydEV2ZW50czpmdW5jdGlvbigpe3RoaXMuZXZlbnRzVG9VbmJpbmR8fCh0aGlzLmV2ZW50c1RvVW5iaW5kPVtdKTt0aGlzLmV2ZW50c1RvVW5iaW5kLnB1c2goQSh0aGlzLmNoYXJ0LFwicmVkcmF3XCIsZnVuY3Rpb24oKXt2YXIgYT10aGlzLm5hdmlnYXRvcixcbmI9YSYmKGEuYmFzZVNlcmllcyYmYS5iYXNlU2VyaWVzWzBdJiZhLmJhc2VTZXJpZXNbMF0ueEF4aXN8fGEuc2Nyb2xsYmFyJiZ0aGlzLnhBeGlzWzBdKTtiJiZhLnJlbmRlcihiLm1pbixiLm1heCl9KSxBKHRoaXMuY2hhcnQsXCJnZXRNYXJnaW5zXCIsZnVuY3Rpb24oKXt2YXIgYT10aGlzLm5hdmlnYXRvcixiPWEub3Bwb3NpdGU/XCJwbG90VG9wXCI6XCJtYXJnaW5Cb3R0b21cIjt0aGlzLmludmVydGVkJiYoYj1hLm9wcG9zaXRlP1wibWFyZ2luUmlnaHRcIjpcInBsb3RMZWZ0XCIpO3RoaXNbYl09KHRoaXNbYl18fDApKyhhLm5hdmlnYXRvckVuYWJsZWR8fCF0aGlzLmludmVydGVkP2Eub3V0bGluZUhlaWdodDowKSthLm5hdmlnYXRvck9wdGlvbnMubWFyZ2lufSkpfSxkZXN0cm95OmZ1bmN0aW9uKCl7dGhpcy5yZW1vdmVFdmVudHMoKTt0aGlzLnhBeGlzJiYoeih0aGlzLmNoYXJ0LnhBeGlzLHRoaXMueEF4aXMpLHoodGhpcy5jaGFydC5heGVzLHRoaXMueEF4aXMpKTt0aGlzLnlBeGlzJiYoeih0aGlzLmNoYXJ0LnlBeGlzLFxudGhpcy55QXhpcykseih0aGlzLmNoYXJ0LmF4ZXMsdGhpcy55QXhpcykpOyh0aGlzLnNlcmllc3x8W10pLmZvckVhY2goZnVuY3Rpb24oYSl7YS5kZXN0cm95JiZhLmRlc3Ryb3koKX0pO1wic2VyaWVzIHhBeGlzIHlBeGlzIHNoYWRlcyBvdXRsaW5lIHNjcm9sbGJhclRyYWNrIHNjcm9sbGJhclJpZmxlcyBzY3JvbGxiYXJHcm91cCBzY3JvbGxiYXIgbmF2aWdhdG9yR3JvdXAgcmVuZGVyZWRcIi5zcGxpdChcIiBcIikuZm9yRWFjaChmdW5jdGlvbihhKXt0aGlzW2FdJiZ0aGlzW2FdLmRlc3Ryb3kmJnRoaXNbYV0uZGVzdHJveSgpO3RoaXNbYV09bnVsbH0sdGhpcyk7W3RoaXMuaGFuZGxlc10uZm9yRWFjaChmdW5jdGlvbihhKXt5KGEpfSx0aGlzKX19O2EuTmF2aWdhdG9yfHwoYS5OYXZpZ2F0b3I9QyxBKEUsXCJ6b29tXCIsZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jaGFydC5vcHRpb25zLGM9Yi5jaGFydC56b29tVHlwZSxmPWIuY2hhcnQucGluY2hUeXBlLGc9Yi5uYXZpZ2F0b3IsYj1iLnJhbmdlU2VsZWN0b3I7XG50aGlzLmlzWEF4aXMmJihnJiZnLmVuYWJsZWR8fGImJmIuZW5hYmxlZCkmJihcInlcIj09PWM/YS56b29tZWQ9ITE6KCFlJiZcInh5XCI9PT1jfHxlJiZcInh5XCI9PT1mKSYmdGhpcy5vcHRpb25zLnJhbmdlJiYoYz10aGlzLnByZXZpb3VzWm9vbSx4KGEubmV3TWluKT90aGlzLnByZXZpb3VzWm9vbT1bdGhpcy5taW4sdGhpcy5tYXhdOmMmJihhLm5ld01pbj1jWzBdLGEubmV3TWF4PWNbMV0sZGVsZXRlIHRoaXMucHJldmlvdXNab29tKSkpO3ZvaWQgMCE9PWEuem9vbWVkJiZhLnByZXZlbnREZWZhdWx0KCl9KSxBKG0sXCJiZWZvcmVTaG93UmVzZXRab29tXCIsZnVuY3Rpb24oKXt2YXIgYT10aGlzLm9wdGlvbnMsYj1hLm5hdmlnYXRvcixjPWEucmFuZ2VTZWxlY3RvcjtpZigoYiYmYi5lbmFibGVkfHxjJiZjLmVuYWJsZWQpJiYoIWUmJlwieFwiPT09YS5jaGFydC56b29tVHlwZXx8ZSYmXCJ4XCI9PT1hLmNoYXJ0LnBpbmNoVHlwZSkpcmV0dXJuITF9KSxBKG0sXCJiZWZvcmVSZW5kZXJcIixmdW5jdGlvbigpe3ZhciBhPVxudGhpcy5vcHRpb25zO2lmKGEubmF2aWdhdG9yLmVuYWJsZWR8fGEuc2Nyb2xsYmFyLmVuYWJsZWQpdGhpcy5zY3JvbGxlcj10aGlzLm5hdmlnYXRvcj1uZXcgQyh0aGlzKX0pLEEobSxcImFmdGVyU2V0Q2hhcnRTaXplXCIsZnVuY3Rpb24oKXt2YXIgYT10aGlzLmxlZ2VuZCxiPXRoaXMubmF2aWdhdG9yLGMsZSxmLGc7YiYmKGU9YSYmYS5vcHRpb25zLGY9Yi54QXhpcyxnPWIueUF4aXMsYz1iLnNjcm9sbGJhckhlaWdodCx0aGlzLmludmVydGVkPyhiLmxlZnQ9Yi5vcHBvc2l0ZT90aGlzLmNoYXJ0V2lkdGgtYy1iLmhlaWdodDp0aGlzLnNwYWNpbmdbM10rYyxiLnRvcD10aGlzLnBsb3RUb3ArYyk6KGIubGVmdD10aGlzLnBsb3RMZWZ0K2MsYi50b3A9Yi5uYXZpZ2F0b3JPcHRpb25zLnRvcHx8dGhpcy5jaGFydEhlaWdodC1iLmhlaWdodC1jLXRoaXMuc3BhY2luZ1syXS0odGhpcy5yYW5nZVNlbGVjdG9yJiZ0aGlzLmV4dHJhQm90dG9tTWFyZ2luP3RoaXMucmFuZ2VTZWxlY3Rvci5nZXRIZWlnaHQoKTpcbjApLShlJiZcImJvdHRvbVwiPT09ZS52ZXJ0aWNhbEFsaWduJiZlLmVuYWJsZWQmJiFlLmZsb2F0aW5nP2EubGVnZW5kSGVpZ2h0K2woZS5tYXJnaW4sMTApOjApKSxmJiZnJiYodGhpcy5pbnZlcnRlZD9mLm9wdGlvbnMubGVmdD1nLm9wdGlvbnMubGVmdD1iLmxlZnQ6Zi5vcHRpb25zLnRvcD1nLm9wdGlvbnMudG9wPWIudG9wLGYuc2V0QXhpc1NpemUoKSxnLnNldEF4aXNTaXplKCkpKX0pLEEobSxcInVwZGF0ZVwiLGZ1bmN0aW9uKGEpe3ZhciBkPWEub3B0aW9ucy5uYXZpZ2F0b3J8fHt9LGM9YS5vcHRpb25zLnNjcm9sbGJhcnx8e307dGhpcy5uYXZpZ2F0b3J8fHRoaXMuc2Nyb2xsZXJ8fCFkLmVuYWJsZWQmJiFjLmVuYWJsZWR8fChiKCEwLHRoaXMub3B0aW9ucy5uYXZpZ2F0b3IsZCksYighMCx0aGlzLm9wdGlvbnMuc2Nyb2xsYmFyLGMpLGRlbGV0ZSBhLm9wdGlvbnMubmF2aWdhdG9yLGRlbGV0ZSBhLm9wdGlvbnMuc2Nyb2xsYmFyKX0pLEEobSxcImFmdGVyVXBkYXRlXCIsZnVuY3Rpb24oYSl7dGhpcy5uYXZpZ2F0b3J8fFxudGhpcy5zY3JvbGxlcnx8IXRoaXMub3B0aW9ucy5uYXZpZ2F0b3IuZW5hYmxlZCYmIXRoaXMub3B0aW9ucy5zY3JvbGxiYXIuZW5hYmxlZHx8KHRoaXMuc2Nyb2xsZXI9dGhpcy5uYXZpZ2F0b3I9bmV3IEModGhpcyksbChhLnJlZHJhdywhMCkmJnRoaXMucmVkcmF3KGEuYW5pbWF0aW9uKSl9KSxBKG0sXCJhZnRlckFkZFNlcmllc1wiLGZ1bmN0aW9uKCl7dGhpcy5uYXZpZ2F0b3ImJnRoaXMubmF2aWdhdG9yLnNldEJhc2VTZXJpZXMobnVsbCwhMSl9KSxBKEYsXCJhZnRlclVwZGF0ZVwiLGZ1bmN0aW9uKCl7dGhpcy5jaGFydC5uYXZpZ2F0b3ImJiF0aGlzLm9wdGlvbnMuaXNJbnRlcm5hbCYmdGhpcy5jaGFydC5uYXZpZ2F0b3Iuc2V0QmFzZVNlcmllcyhudWxsLCExKX0pLG0ucHJvdG90eXBlLmNhbGxiYWNrcy5wdXNoKGZ1bmN0aW9uKGEpe3ZhciBiPWEubmF2aWdhdG9yO2ImJmEueEF4aXNbMF0mJihhPWEueEF4aXNbMF0uZ2V0RXh0cmVtZXMoKSxiLnJlbmRlcihhLm1pbixhLm1heCkpfSkpfSk7XG5JKEgsXCJwYXJ0cy9PcmRpbmFsQXhpcy5qc1wiLFtIW1wicGFydHMvR2xvYmFscy5qc1wiXV0sZnVuY3Rpb24oYSl7dmFyIEM9YS5hZGRFdmVudCxBPWEuQXhpcyxFPWEuQ2hhcnQsbT1hLmNzcyxnPWEuZGVmaW5lZCx2PWEuZXh0ZW5kLHg9YS5ub29wLHk9YS5waWNrLHo9YS50aW1lVW5pdHM7QyhhLlNlcmllcyxcInVwZGF0ZWREYXRhXCIsZnVuY3Rpb24oKXt2YXIgYT10aGlzLnhBeGlzO2EmJmEub3B0aW9ucy5vcmRpbmFsJiZkZWxldGUgYS5vcmRpbmFsSW5kZXh9KTtBLnByb3RvdHlwZS5nZXRUaW1lVGlja3M9ZnVuY3Rpb24oYSxmLGgscixlLGIsbCl7dmFyIGM9MCx0LG4sbT17fSx2LHAsZCxrPVtdLHU9LU51bWJlci5NQVhfVkFMVUUseD10aGlzLm9wdGlvbnMudGlja1BpeGVsSW50ZXJ2YWwseT10aGlzLmNoYXJ0LnRpbWUscT1bXTtpZighdGhpcy5vcHRpb25zLm9yZGluYWwmJiF0aGlzLm9wdGlvbnMuYnJlYWtzfHwhZXx8Mz5lLmxlbmd0aHx8dm9pZCAwPT09ZilyZXR1cm4geS5nZXRUaW1lVGlja3MuYXBwbHkoeSxcbmFyZ3VtZW50cyk7cD1lLmxlbmd0aDtmb3IodD0wO3Q8cDt0Kyspe2Q9dCYmZVt0LTFdPmg7ZVt0XTxmJiYoYz10KTtpZih0PT09cC0xfHxlW3QrMV0tZVt0XT41KmJ8fGQpe2lmKGVbdF0+dSl7Zm9yKG49eS5nZXRUaW1lVGlja3MoYSxlW2NdLGVbdF0scik7bi5sZW5ndGgmJm5bMF08PXU7KW4uc2hpZnQoKTtuLmxlbmd0aCYmKHU9bltuLmxlbmd0aC0xXSk7cS5wdXNoKGsubGVuZ3RoKTtrPWsuY29uY2F0KG4pfWM9dCsxfWlmKGQpYnJlYWt9bj1uLmluZm87aWYobCYmbi51bml0UmFuZ2U8PXouaG91cil7dD1rLmxlbmd0aC0xO2ZvcihjPTE7Yzx0O2MrKyl5LmRhdGVGb3JtYXQoXCIlZFwiLGtbY10pIT09eS5kYXRlRm9ybWF0KFwiJWRcIixrW2MtMV0pJiYobVtrW2NdXT1cImRheVwiLHY9ITApO3YmJihtW2tbMF1dPVwiZGF5XCIpO24uaGlnaGVyUmFua3M9bX1uLnNlZ21lbnRTdGFydHM9cTtrLmluZm89bjtpZihsJiZnKHgpKXtjPXE9ay5sZW5ndGg7dj1bXTtmb3IodmFyIEEseT1bXTtjLS07KXQ9XG50aGlzLnRyYW5zbGF0ZShrW2NdKSxBJiYoeVtjXT1BLXQpLHZbY109QT10O3kuc29ydCgpO3k9eVtNYXRoLmZsb29yKHkubGVuZ3RoLzIpXTt5PC42KngmJih5PW51bGwpO2M9a1txLTFdPmg/cS0xOnE7Zm9yKEE9dm9pZCAwO2MtLTspdD12W2NdLHE9TWF0aC5hYnMoQS10KSxBJiZxPC44KngmJihudWxsPT09eXx8cTwuOCp5KT8obVtrW2NdXSYmIW1ba1tjKzFdXT8ocT1jKzEsQT10KTpxPWMsay5zcGxpY2UocSwxKSk6QT10fXJldHVybiBrfTt2KEEucHJvdG90eXBlLHtiZWZvcmVTZXRUaWNrUG9zaXRpb25zOmZ1bmN0aW9uKCl7dmFyIGEsZj1bXSxnLHI9ITEsZSxiPXRoaXMuZ2V0RXh0cmVtZXMoKSxsPWIubWluLGM9Yi5tYXgsdCxtPXRoaXMuaXNYQXhpcyYmISF0aGlzLm9wdGlvbnMuYnJlYWtzLGI9dGhpcy5vcHRpb25zLm9yZGluYWwsdz1OdW1iZXIuTUFYX1ZBTFVFLHY9dGhpcy5jaGFydC5vcHRpb25zLmNoYXJ0Lmlnbm9yZUhpZGRlblNlcmllcyxwO2lmKGJ8fG0pe3RoaXMuc2VyaWVzLmZvckVhY2goZnVuY3Rpb24oYixcbmMpe2c9W107aWYoISh2JiYhMT09PWIudmlzaWJsZXx8ITE9PT1iLnRha2VPcmRpbmFsUG9zaXRpb24mJiFtKSYmKGY9Zi5jb25jYXQoYi5wcm9jZXNzZWRYRGF0YSksYT1mLmxlbmd0aCxmLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS1ifSksdz1NYXRoLm1pbih3LHkoYi5jbG9zZXN0UG9pbnRSYW5nZSx3KSksYSkpe2ZvcihjPTA7YzxhLTE7KWZbY10hPT1mW2MrMV0mJmcucHVzaChmW2MrMV0pLGMrKztnWzBdIT09ZlswXSYmZy51bnNoaWZ0KGZbMF0pO2Y9Z31iLmlzU2VyaWVzQm9vc3RpbmcmJihwPSEwKX0pO3AmJihmLmxlbmd0aD0wKTthPWYubGVuZ3RoO2lmKDI8YSl7ZT1mWzFdLWZbMF07Zm9yKHQ9YS0xO3QtLSYmIXI7KWZbdCsxXS1mW3RdIT09ZSYmKHI9ITApOyF0aGlzLm9wdGlvbnMua2VlcE9yZGluYWxQYWRkaW5nJiYoZlswXS1sPmV8fGMtZltmLmxlbmd0aC0xXT5lKSYmKHI9ITApfWVsc2UgdGhpcy5vcHRpb25zLm92ZXJzY3JvbGwmJigyPT09YT93PWZbMV0tZlswXTpcbjE9PT1hPyh3PXRoaXMub3B0aW9ucy5vdmVyc2Nyb2xsLGY9W2ZbMF0sZlswXSt3XSk6dz10aGlzLm92ZXJzY3JvbGxQb2ludHNSYW5nZSk7cj8odGhpcy5vcHRpb25zLm92ZXJzY3JvbGwmJih0aGlzLm92ZXJzY3JvbGxQb2ludHNSYW5nZT13LGY9Zi5jb25jYXQodGhpcy5nZXRPdmVyc2Nyb2xsUG9zaXRpb25zKCkpKSx0aGlzLm9yZGluYWxQb3NpdGlvbnM9ZixlPXRoaXMub3JkaW5hbDJsaW4oTWF0aC5tYXgobCxmWzBdKSwhMCksdD1NYXRoLm1heCh0aGlzLm9yZGluYWwybGluKE1hdGgubWluKGMsZltmLmxlbmd0aC0xXSksITApLDEpLHRoaXMub3JkaW5hbFNsb3BlPWM9KGMtbCkvKHQtZSksdGhpcy5vcmRpbmFsT2Zmc2V0PWwtZSpjKToodGhpcy5vdmVyc2Nyb2xsUG9pbnRzUmFuZ2U9eSh0aGlzLmNsb3Nlc3RQb2ludFJhbmdlLHRoaXMub3ZlcnNjcm9sbFBvaW50c1JhbmdlKSx0aGlzLm9yZGluYWxQb3NpdGlvbnM9dGhpcy5vcmRpbmFsU2xvcGU9dGhpcy5vcmRpbmFsT2Zmc2V0PVxudm9pZCAwKX10aGlzLmlzT3JkaW5hbD1iJiZyO3RoaXMuZ3JvdXBJbnRlcnZhbEZhY3Rvcj1udWxsfSx2YWwybGluOmZ1bmN0aW9uKGEsZil7dmFyIGc9dGhpcy5vcmRpbmFsUG9zaXRpb25zO2lmKGcpe3ZhciBuPWcubGVuZ3RoLGUsYjtmb3IoZT1uO2UtLTspaWYoZ1tlXT09PWEpe2I9ZTticmVha31mb3IoZT1uLTE7ZS0tOylpZihhPmdbZV18fDA9PT1lKXthPShhLWdbZV0pLyhnW2UrMV0tZ1tlXSk7Yj1lK2E7YnJlYWt9Zj1mP2I6dGhpcy5vcmRpbmFsU2xvcGUqKGJ8fDApK3RoaXMub3JkaW5hbE9mZnNldH1lbHNlIGY9YTtyZXR1cm4gZn0sbGluMnZhbDpmdW5jdGlvbihhLGYpe3ZhciBnPXRoaXMub3JkaW5hbFBvc2l0aW9ucztpZihnKXt2YXIgbj10aGlzLm9yZGluYWxTbG9wZSxlPXRoaXMub3JkaW5hbE9mZnNldCxiPWcubGVuZ3RoLTEsbDtpZihmKTA+YT9hPWdbMF06YT5iP2E9Z1tiXTooYj1NYXRoLmZsb29yKGEpLGw9YS1iKTtlbHNlIGZvcig7Yi0tOylpZihmPW4qYitlLFxuYT49Zil7bj1uKihiKzEpK2U7bD0oYS1mKS8obi1mKTticmVha31yZXR1cm4gdm9pZCAwIT09bCYmdm9pZCAwIT09Z1tiXT9nW2JdKyhsP2wqKGdbYisxXS1nW2JdKTowKTphfXJldHVybiBhfSxnZXRFeHRlbmRlZFBvc2l0aW9uczpmdW5jdGlvbigpe3ZhciBhPXRoaXMsZj1hLmNoYXJ0LGc9YS5zZXJpZXNbMF0uY3VycmVudERhdGFHcm91cGluZyxyPWEub3JkaW5hbEluZGV4LGU9Zz9nLmNvdW50K2cudW5pdE5hbWU6XCJyYXdcIixiPWEub3B0aW9ucy5vdmVyc2Nyb2xsLGw9YS5nZXRFeHRyZW1lcygpLGMsdDtyfHwocj1hLm9yZGluYWxJbmRleD17fSk7cltlXXx8KGM9e3NlcmllczpbXSxjaGFydDpmLGdldEV4dHJlbWVzOmZ1bmN0aW9uKCl7cmV0dXJue21pbjpsLmRhdGFNaW4sbWF4OmwuZGF0YU1heCtifX0sb3B0aW9uczp7b3JkaW5hbDohMH0sdmFsMmxpbjpBLnByb3RvdHlwZS52YWwybGluLG9yZGluYWwybGluOkEucHJvdG90eXBlLm9yZGluYWwybGlufSxhLnNlcmllcy5mb3JFYWNoKGZ1bmN0aW9uKGIpe3Q9XG57eEF4aXM6Yyx4RGF0YTpiLnhEYXRhLnNsaWNlKCksY2hhcnQ6ZixkZXN0cm95R3JvdXBlZERhdGE6eH07dC54RGF0YT10LnhEYXRhLmNvbmNhdChhLmdldE92ZXJzY3JvbGxQb3NpdGlvbnMoKSk7dC5vcHRpb25zPXtkYXRhR3JvdXBpbmc6Zz97ZW5hYmxlZDohMCxmb3JjZWQ6ITAsYXBwcm94aW1hdGlvbjpcIm9wZW5cIix1bml0czpbW2cudW5pdE5hbWUsW2cuY291bnRdXV19OntlbmFibGVkOiExfX07Yi5wcm9jZXNzRGF0YS5hcHBseSh0KTtjLnNlcmllcy5wdXNoKHQpfSksYS5iZWZvcmVTZXRUaWNrUG9zaXRpb25zLmFwcGx5KGMpLHJbZV09Yy5vcmRpbmFsUG9zaXRpb25zKTtyZXR1cm4gcltlXX0sZ2V0T3ZlcnNjcm9sbFBvc2l0aW9uczpmdW5jdGlvbigpe3ZhciBnPXRoaXMub3B0aW9ucy5vdmVyc2Nyb2xsLGY9dGhpcy5vdmVyc2Nyb2xsUG9pbnRzUmFuZ2UsaD1bXSxyPXRoaXMuZGF0YU1heDtpZihhLmRlZmluZWQoZikpZm9yKGgucHVzaChyKTtyPD10aGlzLmRhdGFNYXgrZzspcis9XG5mLGgucHVzaChyKTtyZXR1cm4gaH0sZ2V0R3JvdXBJbnRlcnZhbEZhY3RvcjpmdW5jdGlvbihhLGYsZyl7dmFyIGg7Zz1nLnByb2Nlc3NlZFhEYXRhO3ZhciBlPWcubGVuZ3RoLGI9W107aD10aGlzLmdyb3VwSW50ZXJ2YWxGYWN0b3I7aWYoIWgpe2ZvcihoPTA7aDxlLTE7aCsrKWJbaF09Z1toKzFdLWdbaF07Yi5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEtYn0pO2I9YltNYXRoLmZsb29yKGUvMildO2E9TWF0aC5tYXgoYSxnWzBdKTtmPU1hdGgubWluKGYsZ1tlLTFdKTt0aGlzLmdyb3VwSW50ZXJ2YWxGYWN0b3I9aD1lKmIvKGYtYSl9cmV0dXJuIGh9LHBvc3RQcm9jZXNzVGlja0ludGVydmFsOmZ1bmN0aW9uKGEpe3ZhciBmPXRoaXMub3JkaW5hbFNsb3BlO3JldHVybiBmP3RoaXMub3B0aW9ucy5icmVha3M/dGhpcy5jbG9zZXN0UG9pbnRSYW5nZXx8YTphLyhmL3RoaXMuY2xvc2VzdFBvaW50UmFuZ2UpOmF9fSk7QS5wcm90b3R5cGUub3JkaW5hbDJsaW49QS5wcm90b3R5cGUudmFsMmxpbjtcbkMoRSxcInBhblwiLGZ1bmN0aW9uKGEpe3ZhciBmPXRoaXMueEF4aXNbMF0sZz1mLm9wdGlvbnMub3ZlcnNjcm9sbCxuPWEub3JpZ2luYWxFdmVudC5jaGFydFgsZT0hMTtpZihmLm9wdGlvbnMub3JkaW5hbCYmZi5zZXJpZXMubGVuZ3RoKXt2YXIgYj10aGlzLm1vdXNlRG93blgsbD1mLmdldEV4dHJlbWVzKCksYz1sLmRhdGFNYXgsdD1sLm1pbix2PWwubWF4LHc9dGhpcy5ob3ZlclBvaW50cyx4PWYuY2xvc2VzdFBvaW50UmFuZ2V8fGYub3ZlcnNjcm9sbFBvaW50c1JhbmdlLGI9KGItbikvKGYudHJhbnNsYXRpb25TbG9wZSooZi5vcmRpbmFsU2xvcGV8fHgpKSxwPXtvcmRpbmFsUG9zaXRpb25zOmYuZ2V0RXh0ZW5kZWRQb3NpdGlvbnMoKX0seD1mLmxpbjJ2YWwsZD1mLnZhbDJsaW4saztwLm9yZGluYWxQb3NpdGlvbnM/MTxNYXRoLmFicyhiKSYmKHcmJncuZm9yRWFjaChmdW5jdGlvbihhKXthLnNldFN0YXRlKCl9KSwwPmI/KHc9cCxrPWYub3JkaW5hbFBvc2l0aW9ucz9mOnApOih3PVxuZi5vcmRpbmFsUG9zaXRpb25zP2Y6cCxrPXApLHA9ay5vcmRpbmFsUG9zaXRpb25zLGM+cFtwLmxlbmd0aC0xXSYmcC5wdXNoKGMpLHRoaXMuZml4ZWRSYW5nZT12LXQsYj1mLnRvRml4ZWRSYW5nZShudWxsLG51bGwseC5hcHBseSh3LFtkLmFwcGx5KHcsW3QsITBdKStiLCEwXSkseC5hcHBseShrLFtkLmFwcGx5KGssW3YsITBdKStiLCEwXSkpLGIubWluPj1NYXRoLm1pbihsLmRhdGFNaW4sdCkmJmIubWF4PD1NYXRoLm1heChjLHYpK2cmJmYuc2V0RXh0cmVtZXMoYi5taW4sYi5tYXgsITAsITEse3RyaWdnZXI6XCJwYW5cIn0pLHRoaXMubW91c2VEb3duWD1uLG0odGhpcy5jb250YWluZXIse2N1cnNvcjpcIm1vdmVcIn0pKTplPSEwfWVsc2UgZT0hMDtlP2cmJihmLm1heD1mLmRhdGFNYXgrZyk6YS5wcmV2ZW50RGVmYXVsdCgpfSk7QyhBLFwiZm91bmRFeHRyZW1lc1wiLGZ1bmN0aW9uKCl7dGhpcy5pc1hBeGlzJiZnKHRoaXMub3B0aW9ucy5vdmVyc2Nyb2xsKSYmdGhpcy5tYXg9PT10aGlzLmRhdGFNYXgmJlxuKCF0aGlzLmNoYXJ0Lm1vdXNlSXNEb3dufHx0aGlzLmlzSW50ZXJuYWwpJiYoIXRoaXMuZXZlbnRBcmdzfHx0aGlzLmV2ZW50QXJncyYmXCJuYXZpZ2F0b3JcIiE9PXRoaXMuZXZlbnRBcmdzLnRyaWdnZXIpJiYodGhpcy5tYXgrPXRoaXMub3B0aW9ucy5vdmVyc2Nyb2xsLCF0aGlzLmlzSW50ZXJuYWwmJmcodGhpcy51c2VyTWluKSYmKHRoaXMubWluKz10aGlzLm9wdGlvbnMub3ZlcnNjcm9sbCkpfSk7QyhBLFwiYWZ0ZXJTZXRTY2FsZVwiLGZ1bmN0aW9uKCl7dGhpcy5ob3JpeiYmIXRoaXMuaXNEaXJ0eSYmKHRoaXMuaXNEaXJ0eT10aGlzLmlzT3JkaW5hbCYmdGhpcy5jaGFydC5uYXZpZ2F0b3ImJiF0aGlzLmNoYXJ0Lm5hdmlnYXRvci5hZGFwdFRvVXBkYXRlZERhdGEpfSl9KTtJKEgsXCJtb2R1bGVzL2Jyb2tlbi1heGlzLnNyYy5qc1wiLFtIW1wicGFydHMvR2xvYmFscy5qc1wiXV0sZnVuY3Rpb24oYSl7dmFyIEM9YS5hZGRFdmVudCxBPWEucGljayxFPWEuZXh0ZW5kLG09YS5pc0FycmF5LGc9XG5hLmZpbmQsdj1hLmZpcmVFdmVudCx4PWEuQXhpcyx5PWEuU2VyaWVzLHo9ZnVuY3Rpb24oYSxmKXtyZXR1cm4gZyhmLGZ1bmN0aW9uKGYpe3JldHVybiBmLmZyb208YSYmYTxmLnRvfSl9O0UoeC5wcm90b3R5cGUse2lzSW5CcmVhazpmdW5jdGlvbihhLGYpe3ZhciBnPWEucmVwZWF0fHxJbmZpbml0eSxtPWEuZnJvbSxlPWEudG8tYS5mcm9tO2Y9Zj49bT8oZi1tKSVnOmctKG0tZiklZztyZXR1cm4gYS5pbmNsdXNpdmU/Zjw9ZTpmPGUmJjAhPT1mfSxpc0luQW55QnJlYWs6ZnVuY3Rpb24oYSxmKXt2YXIgZz10aGlzLm9wdGlvbnMuYnJlYWtzLG09ZyYmZy5sZW5ndGgsZSxiLGw7aWYobSl7Zm9yKDttLS07KXRoaXMuaXNJbkJyZWFrKGdbbV0sYSkmJihlPSEwLGJ8fChiPUEoZ1ttXS5zaG93UG9pbnRzLCF0aGlzLmlzWEF4aXMpKSk7bD1lJiZmP2UmJiFiOmV9cmV0dXJuIGx9fSk7Qyh4LFwiYWZ0ZXJJbml0XCIsZnVuY3Rpb24oKXtcImZ1bmN0aW9uXCI9PT10eXBlb2YgdGhpcy5zZXRCcmVha3MmJlxudGhpcy5zZXRCcmVha3ModGhpcy5vcHRpb25zLmJyZWFrcywhMSl9KTtDKHgsXCJhZnRlclNldFRpY2tQb3NpdGlvbnNcIixmdW5jdGlvbigpe2lmKHRoaXMuaXNCcm9rZW4pe3ZhciBhPXRoaXMudGlja1Bvc2l0aW9ucyxmPXRoaXMudGlja1Bvc2l0aW9ucy5pbmZvLGc9W10sbTtmb3IobT0wO208YS5sZW5ndGg7bSsrKXRoaXMuaXNJbkFueUJyZWFrKGFbbV0pfHxnLnB1c2goYVttXSk7dGhpcy50aWNrUG9zaXRpb25zPWc7dGhpcy50aWNrUG9zaXRpb25zLmluZm89Zn19KTtDKHgsXCJhZnRlclNldE9wdGlvbnNcIixmdW5jdGlvbigpe3RoaXMuaXNCcm9rZW4mJih0aGlzLm9wdGlvbnMub3JkaW5hbD0hMSl9KTt4LnByb3RvdHlwZS5zZXRCcmVha3M9ZnVuY3Rpb24oYSxmKXtmdW5jdGlvbiBnKGEpe3ZhciBiPWEsZixnO2ZvcihnPTA7ZzxlLmJyZWFrQXJyYXkubGVuZ3RoO2crKylpZihmPWUuYnJlYWtBcnJheVtnXSxmLnRvPD1hKWItPWYubGVuO2Vsc2UgaWYoZi5mcm9tPj1hKWJyZWFrO1xuZWxzZSBpZihlLmlzSW5CcmVhayhmLGEpKXtiLT1hLWYuZnJvbTticmVha31yZXR1cm4gYn1mdW5jdGlvbiBuKGEpe3ZhciBiLGY7Zm9yKGY9MDtmPGUuYnJlYWtBcnJheS5sZW5ndGgmJiEoYj1lLmJyZWFrQXJyYXlbZl0sYi5mcm9tPj1hKTtmKyspYi50bzxhP2ErPWIubGVuOmUuaXNJbkJyZWFrKGIsYSkmJihhKz1iLmxlbik7cmV0dXJuIGF9dmFyIGU9dGhpcyxiPW0oYSkmJiEhYS5sZW5ndGg7ZS5pc0RpcnR5PWUuaXNCcm9rZW4hPT1iO2UuaXNCcm9rZW49YjtlLm9wdGlvbnMuYnJlYWtzPWUudXNlck9wdGlvbnMuYnJlYWtzPWE7ZS5mb3JjZVJlZHJhdz0hMDtifHxlLnZhbDJsaW4hPT1nfHwoZGVsZXRlIGUudmFsMmxpbixkZWxldGUgZS5saW4ydmFsKTtiJiYoZS51c2VyT3B0aW9ucy5vcmRpbmFsPSExLGUudmFsMmxpbj1nLGUubGluMnZhbD1uLGUuc2V0RXh0cmVtZXM9ZnVuY3Rpb24oYSxiLGUsZixnKXtpZih0aGlzLmlzQnJva2VuKXtmb3IodmFyIGMsaD10aGlzLm9wdGlvbnMuYnJlYWtzO2M9XG56KGEsaCk7KWE9Yy50bztmb3IoO2M9eihiLGgpOyliPWMuZnJvbTtiPGEmJihiPWEpfXgucHJvdG90eXBlLnNldEV4dHJlbWVzLmNhbGwodGhpcyxhLGIsZSxmLGcpfSxlLnNldEF4aXNUcmFuc2xhdGlvbj1mdW5jdGlvbihhKXt4LnByb3RvdHlwZS5zZXRBeGlzVHJhbnNsYXRpb24uY2FsbCh0aGlzLGEpO3RoaXMudW5pdExlbmd0aD1udWxsO2lmKHRoaXMuaXNCcm9rZW4pe2E9ZS5vcHRpb25zLmJyZWFrczt2YXIgYj1bXSxmPVtdLGc9MCxoLGwscD1lLnVzZXJNaW58fGUubWluLGQ9ZS51c2VyTWF4fHxlLm1heCxrPUEoZS5wb2ludFJhbmdlUGFkZGluZywwKSx1LG07YS5mb3JFYWNoKGZ1bmN0aW9uKGEpe2w9YS5yZXBlYXR8fEluZmluaXR5O2UuaXNJbkJyZWFrKGEscCkmJihwKz1hLnRvJWwtcCVsKTtlLmlzSW5CcmVhayhhLGQpJiYoZC09ZCVsLWEuZnJvbSVsKX0pO2EuZm9yRWFjaChmdW5jdGlvbihhKXt1PWEuZnJvbTtmb3IobD1hLnJlcGVhdHx8SW5maW5pdHk7dS1sPnA7KXUtPVxubDtmb3IoO3U8cDspdSs9bDtmb3IobT11O208ZDttKz1sKWIucHVzaCh7dmFsdWU6bSxtb3ZlOlwiaW5cIn0pLGIucHVzaCh7dmFsdWU6bSsoYS50by1hLmZyb20pLG1vdmU6XCJvdXRcIixzaXplOmEuYnJlYWtTaXplfSl9KTtiLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS52YWx1ZT09PWIudmFsdWU/KFwiaW5cIj09PWEubW92ZT8wOjEpLShcImluXCI9PT1iLm1vdmU/MDoxKTphLnZhbHVlLWIudmFsdWV9KTtoPTA7dT1wO2IuZm9yRWFjaChmdW5jdGlvbihhKXtoKz1cImluXCI9PT1hLm1vdmU/MTotMTsxPT09aCYmXCJpblwiPT09YS5tb3ZlJiYodT1hLnZhbHVlKTswPT09aCYmKGYucHVzaCh7ZnJvbTp1LHRvOmEudmFsdWUsbGVuOmEudmFsdWUtdS0oYS5zaXplfHwwKX0pLGcrPWEudmFsdWUtdS0oYS5zaXplfHwwKSl9KTtlLmJyZWFrQXJyYXk9ZjtlLnVuaXRMZW5ndGg9ZC1wLWcrazt2KGUsXCJhZnRlckJyZWFrc1wiKTtlLnN0YXRpY1NjYWxlP2UudHJhbnNBPWUuc3RhdGljU2NhbGU6ZS51bml0TGVuZ3RoJiZcbihlLnRyYW5zQSo9KGQtZS5taW4raykvZS51bml0TGVuZ3RoKTtrJiYoZS5taW5QaXhlbFBhZGRpbmc9ZS50cmFuc0EqZS5taW5Qb2ludE9mZnNldCk7ZS5taW49cDtlLm1heD1kfX0pO0EoZiwhMCkmJnRoaXMuY2hhcnQucmVkcmF3KCl9O0MoeSxcImFmdGVyR2VuZXJhdGVQb2ludHNcIixmdW5jdGlvbigpe3ZhciBhPXRoaXMueEF4aXMsZj10aGlzLnlBeGlzLGc9dGhpcy5wb2ludHMsbSxlPWcubGVuZ3RoLGI9dGhpcy5vcHRpb25zLmNvbm5lY3ROdWxscyxsO2lmKGEmJmYmJihhLm9wdGlvbnMuYnJlYWtzfHxmLm9wdGlvbnMuYnJlYWtzKSlmb3IoO2UtLTspbT1nW2VdLGw9bnVsbD09PW0ueSYmITE9PT1iLGx8fCFhLmlzSW5BbnlCcmVhayhtLngsITApJiYhZi5pc0luQW55QnJlYWsobS55LCEwKXx8KGcuc3BsaWNlKGUsMSksdGhpcy5kYXRhW2VdJiZ0aGlzLmRhdGFbZV0uZGVzdHJveUVsZW1lbnRzKCkpfSk7Qyh5LFwiYWZ0ZXJSZW5kZXJcIixmdW5jdGlvbigpe3RoaXMuZHJhd0JyZWFrcyh0aGlzLnhBeGlzLFxuW1wieFwiXSk7dGhpcy5kcmF3QnJlYWtzKHRoaXMueUF4aXMsQSh0aGlzLnBvaW50QXJyYXlNYXAsW1wieVwiXSkpfSk7YS5TZXJpZXMucHJvdG90eXBlLmRyYXdCcmVha3M9ZnVuY3Rpb24oYSxmKXt2YXIgZz10aGlzLG09Zy5wb2ludHMsZSxiLGwsYzthJiZmLmZvckVhY2goZnVuY3Rpb24oZil7ZT1hLmJyZWFrQXJyYXl8fFtdO2I9YS5pc1hBeGlzP2EubWluOkEoZy5vcHRpb25zLnRocmVzaG9sZCxhLm1pbik7bS5mb3JFYWNoKGZ1bmN0aW9uKGcpe2M9QShnW1wic3RhY2tcIitmLnRvVXBwZXJDYXNlKCldLGdbZl0pO2UuZm9yRWFjaChmdW5jdGlvbihlKXtsPSExO2lmKGI8ZS5mcm9tJiZjPmUudG98fGI+ZS5mcm9tJiZjPGUuZnJvbSlsPVwicG9pbnRCcmVha1wiO2Vsc2UgaWYoYjxlLmZyb20mJmM+ZS5mcm9tJiZjPGUudG98fGI+ZS5mcm9tJiZjPmUudG8mJmM8ZS5mcm9tKWw9XCJwb2ludEluQnJlYWtcIjtsJiZ2KGEsbCx7cG9pbnQ6Zyxicms6ZX0pfSl9KX0pfTthLlNlcmllcy5wcm90b3R5cGUuZ2FwcGVkUGF0aD1cbmZ1bmN0aW9uKCl7dmFyIGc9dGhpcy5jdXJyZW50RGF0YUdyb3VwaW5nLGY9ZyYmZy5nYXBTaXplLGc9dGhpcy5vcHRpb25zLmdhcFNpemUsaD10aGlzLnBvaW50cy5zbGljZSgpLG09aC5sZW5ndGgtMSxlPXRoaXMueUF4aXM7aWYoZyYmMDxtKWZvcihcInZhbHVlXCIhPT10aGlzLm9wdGlvbnMuZ2FwVW5pdCYmKGcqPXRoaXMuY2xvc2VzdFBvaW50UmFuZ2UpLGYmJmY+ZyYmKGc9Zik7bS0tOyloW20rMV0ueC1oW21dLng+ZyYmKGY9KGhbbV0ueCtoW20rMV0ueCkvMixoLnNwbGljZShtKzEsMCx7aXNOdWxsOiEwLHg6Zn0pLHRoaXMub3B0aW9ucy5zdGFja2luZyYmKGY9ZS5zdGFja3NbdGhpcy5zdGFja0tleV1bZl09bmV3IGEuU3RhY2tJdGVtKGUsZS5vcHRpb25zLnN0YWNrTGFiZWxzLCExLGYsdGhpcy5zdGFjayksZi50b3RhbD0wKSk7cmV0dXJuIHRoaXMuZ2V0R3JhcGhQYXRoKGgpfX0pO0koSCxcIm1hc3RlcnMvbW9kdWxlcy9icm9rZW4tYXhpcy5zcmMuanNcIixbXSxmdW5jdGlvbigpe30pO1xuSShILFwicGFydHMvRGF0YUdyb3VwaW5nLmpzXCIsW0hbXCJwYXJ0cy9HbG9iYWxzLmpzXCJdXSxmdW5jdGlvbihhKXt2YXIgQz1hLmFkZEV2ZW50LEE9YS5hcnJheU1heCxFPWEuYXJyYXlNaW4sbT1hLkF4aXMsZz1hLmRlZmF1bHRQbG90T3B0aW9ucyx2PWEuZGVmaW5lZCx4PWEuZXh0ZW5kLHk9YS5mb3JtYXQsej1hLmlzTnVtYmVyLG49YS5tZXJnZSxmPWEucGljayxoPWEuUG9pbnQscj1hLlNlcmllcyxlPWEuVG9vbHRpcCxiPWEuYXBwcm94aW1hdGlvbnM9e3N1bTpmdW5jdGlvbihhKXt2YXIgYj1hLmxlbmd0aCxkO2lmKCFiJiZhLmhhc051bGxzKWQ9bnVsbDtlbHNlIGlmKGIpZm9yKGQ9MDtiLS07KWQrPWFbYl07cmV0dXJuIGR9LGF2ZXJhZ2U6ZnVuY3Rpb24oYSl7dmFyIGQ9YS5sZW5ndGg7YT1iLnN1bShhKTt6KGEpJiZkJiYoYS89ZCk7cmV0dXJuIGF9LGF2ZXJhZ2VzOmZ1bmN0aW9uKCl7dmFyIGE9W107W10uZm9yRWFjaC5jYWxsKGFyZ3VtZW50cyxmdW5jdGlvbihkKXthLnB1c2goYi5hdmVyYWdlKGQpKX0pO1xucmV0dXJuIHZvaWQgMD09PWFbMF0/dm9pZCAwOmF9LG9wZW46ZnVuY3Rpb24oYSl7cmV0dXJuIGEubGVuZ3RoP2FbMF06YS5oYXNOdWxscz9udWxsOnZvaWQgMH0saGlnaDpmdW5jdGlvbihhKXtyZXR1cm4gYS5sZW5ndGg/QShhKTphLmhhc051bGxzP251bGw6dm9pZCAwfSxsb3c6ZnVuY3Rpb24oYSl7cmV0dXJuIGEubGVuZ3RoP0UoYSk6YS5oYXNOdWxscz9udWxsOnZvaWQgMH0sY2xvc2U6ZnVuY3Rpb24oYSl7cmV0dXJuIGEubGVuZ3RoP2FbYS5sZW5ndGgtMV06YS5oYXNOdWxscz9udWxsOnZvaWQgMH0sb2hsYzpmdW5jdGlvbihhLGQsYyxlKXthPWIub3BlbihhKTtkPWIuaGlnaChkKTtjPWIubG93KGMpO2U9Yi5jbG9zZShlKTtpZih6KGEpfHx6KGQpfHx6KGMpfHx6KGUpKXJldHVyblthLGQsYyxlXX0scmFuZ2U6ZnVuY3Rpb24oYSxkKXthPWIubG93KGEpO2Q9Yi5oaWdoKGQpO2lmKHooYSl8fHooZCkpcmV0dXJuW2EsZF07aWYobnVsbD09PWEmJm51bGw9PT1kKXJldHVybiBudWxsfX0sXG5sPWZ1bmN0aW9uKGEsZCxjLGUpe3ZhciBmPXRoaXMsZz1mLmRhdGEsaD1mLm9wdGlvbnMmJmYub3B0aW9ucy5kYXRhLGs9W10sbD1bXSxwPVtdLHQ9YS5sZW5ndGgsbSx1LHI9ISFkLHc9W10seD1mLnBvaW50QXJyYXlNYXAseT14JiZ4Lmxlbmd0aCxCPVtcInhcIl0uY29uY2F0KHh8fFtcInlcIl0pLEQ9MCxGPTAsRyxBO2U9XCJmdW5jdGlvblwiPT09dHlwZW9mIGU/ZTpiW2VdP2JbZV06YltmLmdldERHQXBwcm94aW1hdGlvbiYmZi5nZXRER0FwcHJveGltYXRpb24oKXx8XCJhdmVyYWdlXCJdO3k/eC5mb3JFYWNoKGZ1bmN0aW9uKCl7dy5wdXNoKFtdKX0pOncucHVzaChbXSk7Rz15fHwxO2ZvcihBPTA7QTw9dCYmIShhW0FdPj1jWzBdKTtBKyspO2ZvcihBO0E8PXQ7QSsrKXtmb3IoO3ZvaWQgMCE9PWNbRCsxXSYmYVtBXT49Y1tEKzFdfHxBPT09dDspe209Y1tEXTtmLmRhdGFHcm91cEluZm89e3N0YXJ0OmYuY3JvcFN0YXJ0K0YsbGVuZ3RoOndbMF0ubGVuZ3RofTt1PWUuYXBwbHkoZix3KTtmLnBvaW50Q2xhc3MmJlxuIXYoZi5kYXRhR3JvdXBJbmZvLm9wdGlvbnMpJiYoZi5kYXRhR3JvdXBJbmZvLm9wdGlvbnM9bihmLnBvaW50Q2xhc3MucHJvdG90eXBlLm9wdGlvbnNUb09iamVjdC5jYWxsKHtzZXJpZXM6Zn0sZi5vcHRpb25zLmRhdGFbZi5jcm9wU3RhcnQrRl0pKSxCLmZvckVhY2goZnVuY3Rpb24oYSl7ZGVsZXRlIGYuZGF0YUdyb3VwSW5mby5vcHRpb25zW2FdfSkpO3ZvaWQgMCE9PXUmJihrLnB1c2gobSksbC5wdXNoKHUpLHAucHVzaChmLmRhdGFHcm91cEluZm8pKTtGPUE7Zm9yKG09MDttPEc7bSsrKXdbbV0ubGVuZ3RoPTAsd1ttXS5oYXNOdWxscz0hMTtEKz0xO2lmKEE9PT10KWJyZWFrfWlmKEE9PT10KWJyZWFrO2lmKHgpe209Zi5jcm9wU3RhcnQrQTt1PWcmJmdbbV18fGYucG9pbnRDbGFzcy5wcm90b3R5cGUuYXBwbHlPcHRpb25zLmFwcGx5KHtzZXJpZXM6Zn0sW2hbbV1dKTt2YXIgQztmb3IobT0wO208eTttKyspQz11W3hbbV1dLHooQyk/d1ttXS5wdXNoKEMpOm51bGw9PT1DJiYod1ttXS5oYXNOdWxscz1cbiEwKX1lbHNlIG09cj9kW0FdOm51bGwseihtKT93WzBdLnB1c2gobSk6bnVsbD09PW0mJih3WzBdLmhhc051bGxzPSEwKX1yZXR1cm57Z3JvdXBlZFhEYXRhOmssZ3JvdXBlZFlEYXRhOmwsZ3JvdXBNYXA6cH19LGM9e2FwcHJveGltYXRpb25zOmIsZ3JvdXBEYXRhOmx9LHQ9ci5wcm90b3R5cGUsRj10LnByb2Nlc3NEYXRhLHc9dC5nZW5lcmF0ZVBvaW50cyxCPXtncm91cFBpeGVsV2lkdGg6MixkYXRlVGltZUxhYmVsRm9ybWF0czp7bWlsbGlzZWNvbmQ6W1wiJUEsICViICVlLCAlSDolTTolUy4lTFwiLFwiJUEsICViICVlLCAlSDolTTolUy4lTFwiLFwiLSVIOiVNOiVTLiVMXCJdLHNlY29uZDpbXCIlQSwgJWIgJWUsICVIOiVNOiVTXCIsXCIlQSwgJWIgJWUsICVIOiVNOiVTXCIsXCItJUg6JU06JVNcIl0sbWludXRlOltcIiVBLCAlYiAlZSwgJUg6JU1cIixcIiVBLCAlYiAlZSwgJUg6JU1cIixcIi0lSDolTVwiXSxob3VyOltcIiVBLCAlYiAlZSwgJUg6JU1cIixcIiVBLCAlYiAlZSwgJUg6JU1cIixcIi0lSDolTVwiXSxkYXk6W1wiJUEsICViICVlLCAlWVwiLFxuXCIlQSwgJWIgJWVcIixcIi0lQSwgJWIgJWUsICVZXCJdLHdlZWs6W1wiV2VlayBmcm9tICVBLCAlYiAlZSwgJVlcIixcIiVBLCAlYiAlZVwiLFwiLSVBLCAlYiAlZSwgJVlcIl0sbW9udGg6W1wiJUIgJVlcIixcIiVCXCIsXCItJUIgJVlcIl0seWVhcjpbXCIlWVwiLFwiJVlcIixcIi0lWVwiXX19LHA9e2xpbmU6e30sc3BsaW5lOnt9LGFyZWE6e30sYXJlYXNwbGluZTp7fSxjb2x1bW46e2dyb3VwUGl4ZWxXaWR0aDoxMH0sY29sdW1ucmFuZ2U6e2dyb3VwUGl4ZWxXaWR0aDoxMH0sY2FuZGxlc3RpY2s6e2dyb3VwUGl4ZWxXaWR0aDoxMH0sb2hsYzp7Z3JvdXBQaXhlbFdpZHRoOjV9fSxkPWEuZGVmYXVsdERhdGFHcm91cGluZ1VuaXRzPVtbXCJtaWxsaXNlY29uZFwiLFsxLDIsNSwxMCwyMCwyNSw1MCwxMDAsMjAwLDUwMF1dLFtcInNlY29uZFwiLFsxLDIsNSwxMCwxNSwzMF1dLFtcIm1pbnV0ZVwiLFsxLDIsNSwxMCwxNSwzMF1dLFtcImhvdXJcIixbMSwyLDMsNCw2LDgsMTJdXSxbXCJkYXlcIixbMV1dLFtcIndlZWtcIixbMV1dLFtcIm1vbnRoXCIsXG5bMSwzLDZdXSxbXCJ5ZWFyXCIsbnVsbF1dO3QuZ2V0REdBcHByb3hpbWF0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIGEuc2VyaWVzVHlwZXMuYXJlYXJhbmdlJiZ0aGlzIGluc3RhbmNlb2YgYS5zZXJpZXNUeXBlcy5hcmVhcmFuZ2U/XCJyYW5nZVwiOmEuc2VyaWVzVHlwZXMub2hsYyYmdGhpcyBpbnN0YW5jZW9mIGEuc2VyaWVzVHlwZXMub2hsYz9cIm9obGNcIjphLnNlcmllc1R5cGVzLmNvbHVtbiYmdGhpcyBpbnN0YW5jZW9mIGEuc2VyaWVzVHlwZXMuY29sdW1uP1wic3VtXCI6XCJhdmVyYWdlXCJ9O3QuZ3JvdXBEYXRhPWw7dC5wcm9jZXNzRGF0YT1mdW5jdGlvbigpe3ZhciBhPXRoaXMuY2hhcnQsYj10aGlzLm9wdGlvbnMuZGF0YUdyb3VwaW5nLGM9ITEhPT10aGlzLmFsbG93REcmJmImJmYoYi5lbmFibGVkLGEub3B0aW9ucy5pc1N0b2NrKSxlPXRoaXMudmlzaWJsZXx8IWEub3B0aW9ucy5jaGFydC5pZ25vcmVIaWRkZW5TZXJpZXMsZyxoPXRoaXMuY3VycmVudERhdGFHcm91cGluZyxsLG09ITE7XG50aGlzLmZvcmNlQ3JvcD1jO3RoaXMuZ3JvdXBQaXhlbFdpZHRoPW51bGw7dGhpcy5oYXNQcm9jZXNzZWQ9ITA7YyYmIXRoaXMucmVxdWlyZVNvcnRpbmcmJih0aGlzLnJlcXVpcmVTb3J0aW5nPW09ITApO2M9ITE9PT1GLmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8IWM7bSYmKHRoaXMucmVxdWlyZVNvcnRpbmc9ITEpO2lmKCFjKXt0aGlzLmRlc3Ryb3lHcm91cGVkRGF0YSgpO3ZhciBwLGM9Yi5ncm91cEFsbD90aGlzLnhEYXRhOnRoaXMucHJvY2Vzc2VkWERhdGEsbj1iLmdyb3VwQWxsP3RoaXMueURhdGE6dGhpcy5wcm9jZXNzZWRZRGF0YSxyPWEucGxvdFNpemVYLGE9dGhpcy54QXhpcyx3PWEub3B0aW9ucy5vcmRpbmFsLHg9dGhpcy5ncm91cFBpeGVsV2lkdGg9YS5nZXRHcm91cFBpeGVsV2lkdGgmJmEuZ2V0R3JvdXBQaXhlbFdpZHRoKCk7aWYoeCl7dGhpcy5pc0RpcnR5PWc9ITA7dGhpcy5wb2ludHM9bnVsbDttPWEuZ2V0RXh0cmVtZXMoKTtsPW0ubWluO3ZhciBtPW0ubWF4LHc9XG53JiZhLmdldEdyb3VwSW50ZXJ2YWxGYWN0b3IobCxtLHRoaXMpfHwxLHg9eCoobS1sKS9yKncscj1hLmdldFRpbWVUaWNrcyhhLm5vcm1hbGl6ZVRpbWVUaWNrSW50ZXJ2YWwoeCxiLnVuaXRzfHxkKSxNYXRoLm1pbihsLGNbMF0pLE1hdGgubWF4KG0sY1tjLmxlbmd0aC0xXSksYS5vcHRpb25zLnN0YXJ0T2ZXZWVrLGMsdGhpcy5jbG9zZXN0UG9pbnRSYW5nZSksbj10Lmdyb3VwRGF0YS5hcHBseSh0aGlzLFtjLG4scixiLmFwcHJveGltYXRpb25dKSxjPW4uZ3JvdXBlZFhEYXRhLHc9bi5ncm91cGVkWURhdGEseT0wO2lmKGIuc21vb3RoZWQmJmMubGVuZ3RoKXtwPWMubGVuZ3RoLTE7Zm9yKGNbcF09TWF0aC5taW4oY1twXSxtKTtwLS0mJjA8cDspY1twXSs9eC8yO2NbMF09TWF0aC5tYXgoY1swXSxsKX1mb3IocD0xO3A8ci5sZW5ndGg7cCsrKXIuaW5mby5zZWdtZW50U3RhcnRzJiYtMSE9PXIuaW5mby5zZWdtZW50U3RhcnRzLmluZGV4T2YocCl8fCh5PU1hdGgubWF4KHJbcF0tcltwLVxuMV0seSkpO2w9ci5pbmZvO2wuZ2FwU2l6ZT15O3RoaXMuY2xvc2VzdFBvaW50UmFuZ2U9ci5pbmZvLnRvdGFsUmFuZ2U7dGhpcy5ncm91cE1hcD1uLmdyb3VwTWFwO2lmKHYoY1swXSkmJmNbMF08YS5kYXRhTWluJiZlKXtpZighdihhLm9wdGlvbnMubWluKSYmYS5taW48PWEuZGF0YU1pbnx8YS5taW49PT1hLmRhdGFNaW4pYS5taW49Y1swXTthLmRhdGFNaW49Y1swXX1iLmdyb3VwQWxsJiYoYj10aGlzLmNyb3BEYXRhKGMsdyxhLm1pbixhLm1heCwxKSxjPWIueERhdGEsdz1iLnlEYXRhKTt0aGlzLnByb2Nlc3NlZFhEYXRhPWM7dGhpcy5wcm9jZXNzZWRZRGF0YT13fWVsc2UgdGhpcy5ncm91cE1hcD1udWxsO3RoaXMuaGFzR3JvdXBlZERhdGE9Zzt0aGlzLmN1cnJlbnREYXRhR3JvdXBpbmc9bDt0aGlzLnByZXZlbnRHcmFwaEFuaW1hdGlvbj0oaCYmaC50b3RhbFJhbmdlKSE9PShsJiZsLnRvdGFsUmFuZ2UpfX07dC5kZXN0cm95R3JvdXBlZERhdGE9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdyb3VwZWREYXRhO1xuKGF8fFtdKS5mb3JFYWNoKGZ1bmN0aW9uKGIsZCl7YiYmKGFbZF09Yi5kZXN0cm95P2IuZGVzdHJveSgpOm51bGwpfSk7dGhpcy5ncm91cGVkRGF0YT1udWxsfTt0LmdlbmVyYXRlUG9pbnRzPWZ1bmN0aW9uKCl7dy5hcHBseSh0aGlzKTt0aGlzLmRlc3Ryb3lHcm91cGVkRGF0YSgpO3RoaXMuZ3JvdXBlZERhdGE9dGhpcy5oYXNHcm91cGVkRGF0YT90aGlzLnBvaW50czpudWxsfTtDKGgsXCJ1cGRhdGVcIixmdW5jdGlvbigpe2lmKHRoaXMuZGF0YUdyb3VwKXJldHVybiBhLmVycm9yKDI0LCExLHRoaXMuc2VyaWVzLmNoYXJ0KSwhMX0pO0MoZSxcImhlYWRlckZvcm1hdHRlclwiLGZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuY2hhcnQudGltZSxkPWEubGFiZWxDb25maWcsYz1kLnNlcmllcyxlPWMudG9vbHRpcE9wdGlvbnMsZj1jLm9wdGlvbnMuZGF0YUdyb3VwaW5nLGc9ZS54RGF0ZUZvcm1hdCxoLGs9Yy54QXhpcyxsLG09ZVsoYS5pc0Zvb3Rlcj9cImZvb3RlclwiOlwiaGVhZGVyXCIpK1wiRm9ybWF0XCJdO1xuayYmXCJkYXRldGltZVwiPT09ay5vcHRpb25zLnR5cGUmJmYmJnooZC5rZXkpJiYobD1jLmN1cnJlbnREYXRhR3JvdXBpbmcsZj1mLmRhdGVUaW1lTGFiZWxGb3JtYXRzfHxCLmRhdGVUaW1lTGFiZWxGb3JtYXRzLGw/KGU9ZltsLnVuaXROYW1lXSwxPT09bC5jb3VudD9nPWVbMF06KGc9ZVsxXSxoPWVbMl0pKTohZyYmZiYmKGc9dGhpcy5nZXRYRGF0ZUZvcm1hdChkLGUsaykpLGc9Yi5kYXRlRm9ybWF0KGcsZC5rZXkpLGgmJihnKz1iLmRhdGVGb3JtYXQoaCxkLmtleStsLnRvdGFsUmFuZ2UtMSkpLGMuY2hhcnQuc3R5bGVkTW9kZSYmKG09dGhpcy5zdHlsZWRNb2RlRm9ybWF0KG0pKSxhLnRleHQ9eShtLHtwb2ludDp4KGQucG9pbnQse2tleTpnfSksc2VyaWVzOmN9LGIpLGEucHJldmVudERlZmF1bHQoKSl9KTtDKHIsXCJkZXN0cm95XCIsdC5kZXN0cm95R3JvdXBlZERhdGEpO0MocixcImFmdGVyU2V0T3B0aW9uc1wiLGZ1bmN0aW9uKGEpe2E9YS5vcHRpb25zO3ZhciBiPXRoaXMudHlwZSxkPVxudGhpcy5jaGFydC5vcHRpb25zLnBsb3RPcHRpb25zLGM9Z1tiXS5kYXRhR3JvdXBpbmcsZT10aGlzLnVzZUNvbW1vbkRhdGFHcm91cGluZyYmQjtpZihwW2JdfHxlKWN8fChjPW4oQixwW2JdKSksYS5kYXRhR3JvdXBpbmc9bihlLGMsZC5zZXJpZXMmJmQuc2VyaWVzLmRhdGFHcm91cGluZyxkW2JdLmRhdGFHcm91cGluZyx0aGlzLnVzZXJPcHRpb25zLmRhdGFHcm91cGluZyl9KTtDKG0sXCJhZnRlclNldFNjYWxlXCIsZnVuY3Rpb24oKXt0aGlzLnNlcmllcy5mb3JFYWNoKGZ1bmN0aW9uKGEpe2EuaGFzUHJvY2Vzc2VkPSExfSl9KTttLnByb3RvdHlwZS5nZXRHcm91cFBpeGVsV2lkdGg9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnNlcmllcyxiPWEubGVuZ3RoLGQsYz0wLGU9ITEsZztmb3IoZD1iO2QtLTspKGc9YVtkXS5vcHRpb25zLmRhdGFHcm91cGluZykmJihjPU1hdGgubWF4KGMsZihnLmdyb3VwUGl4ZWxXaWR0aCxCLmdyb3VwUGl4ZWxXaWR0aCkpKTtmb3IoZD1iO2QtLTspKGc9YVtkXS5vcHRpb25zLmRhdGFHcm91cGluZykmJlxuYVtkXS5oYXNQcm9jZXNzZWQmJihiPShhW2RdLnByb2Nlc3NlZFhEYXRhfHxhW2RdLmRhdGEpLmxlbmd0aCxhW2RdLmdyb3VwUGl4ZWxXaWR0aHx8Yj50aGlzLmNoYXJ0LnBsb3RTaXplWC9jfHxiJiZnLmZvcmNlZCkmJihlPSEwKTtyZXR1cm4gZT9jOjB9O20ucHJvdG90eXBlLnNldERhdGFHcm91cGluZz1mdW5jdGlvbihhLGIpe3ZhciBkO2I9ZihiLCEwKTthfHwoYT17Zm9yY2VkOiExLHVuaXRzOm51bGx9KTtpZih0aGlzIGluc3RhbmNlb2YgbSlmb3IoZD10aGlzLnNlcmllcy5sZW5ndGg7ZC0tOyl0aGlzLnNlcmllc1tkXS51cGRhdGUoe2RhdGFHcm91cGluZzphfSwhMSk7ZWxzZSB0aGlzLmNoYXJ0Lm9wdGlvbnMuc2VyaWVzLmZvckVhY2goZnVuY3Rpb24oYil7Yi5kYXRhR3JvdXBpbmc9YX0sITEpO3RoaXMub3JkaW5hbFNsb3BlPW51bGw7YiYmdGhpcy5jaGFydC5yZWRyYXcoKX07cmV0dXJuIGEuZGF0YUdyb3VwaW5nPWN9KTtJKEgsXCJwYXJ0cy9PSExDU2VyaWVzLmpzXCIsW0hbXCJwYXJ0cy9HbG9iYWxzLmpzXCJdXSxcbmZ1bmN0aW9uKGEpe3ZhciBDPWEuUG9pbnQsQT1hLnNlcmllc1R5cGUsRT1hLnNlcmllc1R5cGVzO0EoXCJvaGxjXCIsXCJjb2x1bW5cIix7bGluZVdpZHRoOjEsdG9vbHRpcDp7cG9pbnRGb3JtYXQ6J1xceDNjc3BhbiBzdHlsZVxceDNkXCJjb2xvcjp7cG9pbnQuY29sb3J9XCJcXHgzZVxcdTI1Y2ZcXHgzYy9zcGFuXFx4M2UgXFx4M2NiXFx4M2Uge3Nlcmllcy5uYW1lfVxceDNjL2JcXHgzZVxceDNjYnIvXFx4M2VPcGVuOiB7cG9pbnQub3Blbn1cXHgzY2JyL1xceDNlSGlnaDoge3BvaW50LmhpZ2h9XFx4M2Nici9cXHgzZUxvdzoge3BvaW50Lmxvd31cXHgzY2JyL1xceDNlQ2xvc2U6IHtwb2ludC5jbG9zZX1cXHgzY2JyL1xceDNlJ30sdGhyZXNob2xkOm51bGwsc3RhdGVzOntob3Zlcjp7bGluZVdpZHRoOjN9fSxzdGlja3lUcmFja2luZzohMH0se2RpcmVjdFRvdWNoOiExLHBvaW50QXJyYXlNYXA6W1wib3BlblwiLFwiaGlnaFwiLFwibG93XCIsXCJjbG9zZVwiXSx0b1lEYXRhOmZ1bmN0aW9uKGEpe3JldHVyblthLm9wZW4sYS5oaWdoLGEubG93LFxuYS5jbG9zZV19LHBvaW50VmFsS2V5OlwiY2xvc2VcIixwb2ludEF0dHJUb09wdGlvbnM6e3N0cm9rZTpcImNvbG9yXCIsXCJzdHJva2Utd2lkdGhcIjpcImxpbmVXaWR0aFwifSxpbml0OmZ1bmN0aW9uKCl7RS5jb2x1bW4ucHJvdG90eXBlLmluaXQuYXBwbHkodGhpcyxhcmd1bWVudHMpO3RoaXMub3B0aW9ucy5zdGFja2luZz0hMX0scG9pbnRBdHRyaWJzOmZ1bmN0aW9uKGEsZyl7Zz1FLmNvbHVtbi5wcm90b3R5cGUucG9pbnRBdHRyaWJzLmNhbGwodGhpcyxhLGcpO3ZhciBtPXRoaXMub3B0aW9ucztkZWxldGUgZy5maWxsOyFhLm9wdGlvbnMuY29sb3ImJm0udXBDb2xvciYmYS5vcGVuPGEuY2xvc2UmJihnLnN0cm9rZT1tLnVwQ29sb3IpO3JldHVybiBnfSx0cmFuc2xhdGU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLGc9YS55QXhpcyx2PSEhYS5tb2RpZnlWYWx1ZSx4PVtcInBsb3RPcGVuXCIsXCJwbG90SGlnaFwiLFwicGxvdExvd1wiLFwicGxvdENsb3NlXCIsXCJ5Qm90dG9tXCJdO0UuY29sdW1uLnByb3RvdHlwZS50cmFuc2xhdGUuYXBwbHkoYSk7XG5hLnBvaW50cy5mb3JFYWNoKGZ1bmN0aW9uKG0pe1ttLm9wZW4sbS5oaWdoLG0ubG93LG0uY2xvc2UsbS5sb3ddLmZvckVhY2goZnVuY3Rpb24oeSxuKXtudWxsIT09eSYmKHYmJih5PWEubW9kaWZ5VmFsdWUoeSkpLG1beFtuXV09Zy50b1BpeGVscyh5LCEwKSl9KTttLnRvb2x0aXBQb3NbMV09bS5wbG90SGlnaCtnLnBvcy1hLmNoYXJ0LnBsb3RUb3B9KX0sZHJhd1BvaW50czpmdW5jdGlvbigpe3ZhciBhPXRoaXMsZz1hLmNoYXJ0O2EucG9pbnRzLmZvckVhY2goZnVuY3Rpb24obSl7dmFyIHYseSx6LG4sZj1tLmdyYXBoaWMsaCxyPSFmO3ZvaWQgMCE9PW0ucGxvdFkmJihmfHwobS5ncmFwaGljPWY9Zy5yZW5kZXJlci5wYXRoKCkuYWRkKGEuZ3JvdXApKSxnLnN0eWxlZE1vZGV8fGYuYXR0cihhLnBvaW50QXR0cmlicyhtLG0uc2VsZWN0ZWQmJlwic2VsZWN0XCIpKSx5PWYuc3Ryb2tlV2lkdGgoKSUyLzIsaD1NYXRoLnJvdW5kKG0ucGxvdFgpLXksej1NYXRoLnJvdW5kKG0uc2hhcGVBcmdzLndpZHRoL1xuMiksbj1bXCJNXCIsaCxNYXRoLnJvdW5kKG0ueUJvdHRvbSksXCJMXCIsaCxNYXRoLnJvdW5kKG0ucGxvdEhpZ2gpXSxudWxsIT09bS5vcGVuJiYodj1NYXRoLnJvdW5kKG0ucGxvdE9wZW4pK3ksbi5wdXNoKFwiTVwiLGgsdixcIkxcIixoLXosdikpLG51bGwhPT1tLmNsb3NlJiYodj1NYXRoLnJvdW5kKG0ucGxvdENsb3NlKSt5LG4ucHVzaChcIk1cIixoLHYsXCJMXCIsaCt6LHYpKSxmW3I/XCJhdHRyXCI6XCJhbmltYXRlXCJdKHtkOm59KS5hZGRDbGFzcyhtLmdldENsYXNzTmFtZSgpLCEwKSl9KX0sYW5pbWF0ZTpudWxsfSx7Z2V0Q2xhc3NOYW1lOmZ1bmN0aW9uKCl7cmV0dXJuIEMucHJvdG90eXBlLmdldENsYXNzTmFtZS5jYWxsKHRoaXMpKyh0aGlzLm9wZW48dGhpcy5jbG9zZT9cIiBoaWdoY2hhcnRzLXBvaW50LXVwXCI6XCIgaGlnaGNoYXJ0cy1wb2ludC1kb3duXCIpfX0pfSk7SShILFwicGFydHMvQ2FuZGxlc3RpY2tTZXJpZXMuanNcIixbSFtcInBhcnRzL0dsb2JhbHMuanNcIl1dLGZ1bmN0aW9uKGEpe3ZhciBDPVxuYS5kZWZhdWx0UGxvdE9wdGlvbnMsQT1hLm1lcmdlLEU9YS5zZXJpZXNUeXBlLG09YS5zZXJpZXNUeXBlcztFKFwiY2FuZGxlc3RpY2tcIixcIm9obGNcIixBKEMuY29sdW1uLHtzdGF0ZXM6e2hvdmVyOntsaW5lV2lkdGg6Mn19LHRvb2x0aXA6Qy5vaGxjLnRvb2x0aXAsdGhyZXNob2xkOm51bGwsbGluZUNvbG9yOlwiIzAwMDAwMFwiLGxpbmVXaWR0aDoxLHVwQ29sb3I6XCIjZmZmZmZmXCIsc3RpY2t5VHJhY2tpbmc6ITB9KSx7cG9pbnRBdHRyaWJzOmZ1bmN0aW9uKGEsdil7dmFyIGc9bS5jb2x1bW4ucHJvdG90eXBlLnBvaW50QXR0cmlicy5jYWxsKHRoaXMsYSx2KSx5PXRoaXMub3B0aW9ucyx6PWEub3BlbjxhLmNsb3NlLG49eS5saW5lQ29sb3J8fHRoaXMuY29sb3I7Z1tcInN0cm9rZS13aWR0aFwiXT15LmxpbmVXaWR0aDtnLmZpbGw9YS5vcHRpb25zLmNvbG9yfHwoej95LnVwQ29sb3J8fHRoaXMuY29sb3I6dGhpcy5jb2xvcik7Zy5zdHJva2U9YS5saW5lQ29sb3J8fCh6P3kudXBMaW5lQ29sb3J8fFxubjpuKTt2JiYoYT15LnN0YXRlc1t2XSxnLmZpbGw9YS5jb2xvcnx8Zy5maWxsLGcuc3Ryb2tlPWEubGluZUNvbG9yfHxnLnN0cm9rZSxnW1wic3Ryb2tlLXdpZHRoXCJdPWEubGluZVdpZHRofHxnW1wic3Ryb2tlLXdpZHRoXCJdKTtyZXR1cm4gZ30sZHJhd1BvaW50czpmdW5jdGlvbigpe3ZhciBhPXRoaXMsbT1hLmNoYXJ0LHg9YS55QXhpcy5yZXZlcnNlZDthLnBvaW50cy5mb3JFYWNoKGZ1bmN0aW9uKGcpe3ZhciB2PWcuZ3JhcGhpYyxuLGYsaCxyLGUsYixsLGM9IXY7dm9pZCAwIT09Zy5wbG90WSYmKHZ8fChnLmdyYXBoaWM9dj1tLnJlbmRlcmVyLnBhdGgoKS5hZGQoYS5ncm91cCkpLGEuY2hhcnQuc3R5bGVkTW9kZXx8di5hdHRyKGEucG9pbnRBdHRyaWJzKGcsZy5zZWxlY3RlZCYmXCJzZWxlY3RcIikpLnNoYWRvdyhhLm9wdGlvbnMuc2hhZG93KSxlPXYuc3Ryb2tlV2lkdGgoKSUyLzIsYj1NYXRoLnJvdW5kKGcucGxvdFgpLWUsbj1nLnBsb3RPcGVuLGY9Zy5wbG90Q2xvc2UsaD1NYXRoLm1pbihuLFxuZiksbj1NYXRoLm1heChuLGYpLGw9TWF0aC5yb3VuZChnLnNoYXBlQXJncy53aWR0aC8yKSxmPXg/biE9PWcueUJvdHRvbTpNYXRoLnJvdW5kKGgpIT09TWF0aC5yb3VuZChnLnBsb3RIaWdoKSxyPXg/TWF0aC5yb3VuZChoKSE9PU1hdGgucm91bmQoZy5wbG90SGlnaCk6biE9PWcueUJvdHRvbSxoPU1hdGgucm91bmQoaCkrZSxuPU1hdGgucm91bmQobikrZSxlPVtdLGUucHVzaChcIk1cIixiLWwsbixcIkxcIixiLWwsaCxcIkxcIixiK2wsaCxcIkxcIixiK2wsbixcIlpcIixcIk1cIixiLGgsXCJMXCIsYixmP01hdGgucm91bmQoeD9nLnlCb3R0b206Zy5wbG90SGlnaCk6aCxcIk1cIixiLG4sXCJMXCIsYixyP01hdGgucm91bmQoeD9nLnBsb3RIaWdoOmcueUJvdHRvbSk6biksdltjP1wiYXR0clwiOlwiYW5pbWF0ZVwiXSh7ZDplfSkuYWRkQ2xhc3MoZy5nZXRDbGFzc05hbWUoKSwhMCkpfSl9fSl9KTtJKEgsXCJtaXhpbnMvb24tc2VyaWVzLmpzXCIsW0hbXCJwYXJ0cy9HbG9iYWxzLmpzXCJdXSxmdW5jdGlvbihhKXt2YXIgQz1cbmEuZGVmaW5lZCxBPWEuc2VyaWVzVHlwZXMsRT1hLnN0YWJsZVNvcnQ7cmV0dXJue2dldFBsb3RCb3g6ZnVuY3Rpb24oKXtyZXR1cm4gYS5TZXJpZXMucHJvdG90eXBlLmdldFBsb3RCb3guY2FsbCh0aGlzLm9wdGlvbnMub25TZXJpZXMmJnRoaXMuY2hhcnQuZ2V0KHRoaXMub3B0aW9ucy5vblNlcmllcyl8fHRoaXMpfSx0cmFuc2xhdGU6ZnVuY3Rpb24oKXtBLmNvbHVtbi5wcm90b3R5cGUudHJhbnNsYXRlLmFwcGx5KHRoaXMpO3ZhciBhPXRoaXMsZz1hLm9wdGlvbnMsdj1hLmNoYXJ0LHg9YS5wb2ludHMseT14Lmxlbmd0aC0xLHosbj1nLm9uU2VyaWVzLG49biYmdi5nZXQobiksZz1nLm9uS2V5fHxcInlcIixmPW4mJm4ub3B0aW9ucy5zdGVwLGg9biYmbi5wb2ludHMscj1oJiZoLmxlbmd0aCxlPXYuaW52ZXJ0ZWQsYj1hLnhBeGlzLGw9YS55QXhpcyxjPTAsdCxGLHcsQjtpZihuJiZuLnZpc2libGUmJnIpZm9yKGM9KG4ucG9pbnRYT2Zmc2V0fHwwKSsobi5iYXJXfHwwKS8yLHY9bi5jdXJyZW50RGF0YUdyb3VwaW5nLFxuRj1oW3ItMV0ueCsodj92LnRvdGFsUmFuZ2U6MCksRSh4LGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEueC1iLnh9KSxnPVwicGxvdFwiK2dbMF0udG9VcHBlckNhc2UoKStnLnN1YnN0cigxKTtyLS0mJnhbeV0mJiEodD1oW3JdLHY9eFt5XSx2Lnk9dC55LHQueDw9di54JiZ2b2lkIDAhPT10W2ddJiYodi54PD1GJiYodi5wbG90WT10W2ddLHQueDx2LngmJiFmJiYodz1oW3IrMV0pJiZ2b2lkIDAhPT13W2ddJiYoQj0odi54LXQueCkvKHcueC10LngpLHYucGxvdFkrPUIqKHdbZ10tdFtnXSksdi55Kz1CKih3LnktdC55KSkpLHktLSxyKyssMD55KSk7KTt4LmZvckVhY2goZnVuY3Rpb24oZixkKXt2YXIgZztmLnBsb3RYKz1jO2lmKHZvaWQgMD09PWYucGxvdFl8fGUpMDw9Zi5wbG90WCYmZi5wbG90WDw9Yi5sZW4/ZT8oZi5wbG90WT1iLnRyYW5zbGF0ZShmLngsMCwxLDAsMSksZi5wbG90WD1DKGYueSk/bC50cmFuc2xhdGUoZi55LDAsMCwwLDEpOjApOmYucGxvdFk9KGIub3Bwb3NpdGU/MDpcbmEueUF4aXMubGVuKStiLm9mZnNldDpmLnNoYXBlQXJncz17fTsoej14W2QtMV0pJiZ6LnBsb3RYPT09Zi5wbG90WCYmKHZvaWQgMD09PXouc3RhY2tJbmRleCYmKHouc3RhY2tJbmRleD0wKSxnPXouc3RhY2tJbmRleCsxKTtmLnN0YWNrSW5kZXg9Z30pO3RoaXMub25TZXJpZXM9bn19fSk7SShILFwicGFydHMvRmxhZ3NTZXJpZXMuanNcIixbSFtcInBhcnRzL0dsb2JhbHMuanNcIl0sSFtcIm1peGlucy9vbi1zZXJpZXMuanNcIl1dLGZ1bmN0aW9uKGEsQyl7ZnVuY3Rpb24gQShhKXtoW2ErXCJwaW5cIl09ZnVuY3Rpb24oZSxiLGYsYyxnKXt2YXIgbD1nJiZnLmFuY2hvclg7Zz1nJiZnLmFuY2hvclk7dmFyIG07XCJjaXJjbGVcIj09PWEmJmM+ZiYmKGUtPU1hdGgucm91bmQoKGMtZikvMiksZj1jKTttPWhbYV0oZSxiLGYsYyk7bCYmZyYmKG0ucHVzaChcIk1cIixcImNpcmNsZVwiPT09YT9lK2YvMjptWzFdK21bNF0vMixiPmc/YjpiK2MsXCJMXCIsbCxnKSxtPW0uY29uY2F0KGguY2lyY2xlKGwtMSxnLTEsMixcbjIpKSk7cmV0dXJuIG19fXZhciBFPWEuYWRkRXZlbnQsbT1hLm1lcmdlLGc9YS5ub29wLHY9YS5kZWZpbmVkLHg9YS5SZW5kZXJlcix5PWEuU2VyaWVzLHo9YS5zZXJpZXNUeXBlLG49YS5UcmFja2VyTWl4aW4sZj1hLlZNTFJlbmRlcmVyLGg9YS5TVkdSZW5kZXJlci5wcm90b3R5cGUuc3ltYm9sczt6KFwiZmxhZ3NcIixcImNvbHVtblwiLHtwb2ludFJhbmdlOjAsYWxsb3dPdmVybGFwWDohMSxzaGFwZTpcImZsYWdcIixzdGFja0Rpc3RhbmNlOjEyLHRleHRBbGlnbjpcImNlbnRlclwiLHRvb2x0aXA6e3BvaW50Rm9ybWF0Olwie3BvaW50LnRleHR9XFx4M2Nici9cXHgzZVwifSx0aHJlc2hvbGQ6bnVsbCx5Oi0zMCxmaWxsQ29sb3I6XCIjZmZmZmZmXCIsbGluZVdpZHRoOjEsc3RhdGVzOntob3Zlcjp7bGluZUNvbG9yOlwiIzAwMDAwMFwiLGZpbGxDb2xvcjpcIiNjY2Q2ZWJcIn19LHN0eWxlOntmb250U2l6ZTpcIjExcHhcIixmb250V2VpZ2h0OlwiYm9sZFwifX0se3NvcnRlZDohMSxub1NoYXJlZFRvb2x0aXA6ITAsYWxsb3dERzohMSxcbnRha2VPcmRpbmFsUG9zaXRpb246ITEsdHJhY2tlckdyb3VwczpbXCJtYXJrZXJHcm91cFwiXSxmb3JjZUNyb3A6ITAsaW5pdDp5LnByb3RvdHlwZS5pbml0LHBvaW50QXR0cmliczpmdW5jdGlvbihhLGUpe3ZhciBiPXRoaXMub3B0aW9ucyxmPWEmJmEuY29sb3J8fHRoaXMuY29sb3IsYz1iLmxpbmVDb2xvcixnPWEmJmEubGluZVdpZHRoO2E9YSYmYS5maWxsQ29sb3J8fGIuZmlsbENvbG9yO2UmJihhPWIuc3RhdGVzW2VdLmZpbGxDb2xvcixjPWIuc3RhdGVzW2VdLmxpbmVDb2xvcixnPWIuc3RhdGVzW2VdLmxpbmVXaWR0aCk7cmV0dXJue2ZpbGw6YXx8ZixzdHJva2U6Y3x8ZixcInN0cm9rZS13aWR0aFwiOmd8fGIubGluZVdpZHRofHwwfX0sdHJhbnNsYXRlOkMudHJhbnNsYXRlLGdldFBsb3RCb3g6Qy5nZXRQbG90Qm94LGRyYXdQb2ludHM6ZnVuY3Rpb24oKXt2YXIgZj10aGlzLnBvaW50cyxlPXRoaXMuY2hhcnQsYj1lLnJlbmRlcmVyLGcsYyxoPWUuaW52ZXJ0ZWQsbj10aGlzLm9wdGlvbnMsXG53PW4ueSx4LHAsZCxrLHUseSx6PXRoaXMueUF4aXMscT17fSxBPVtdLEM7Zm9yKHA9Zi5sZW5ndGg7cC0tOylkPWZbcF0seT0oaD9kLnBsb3RZOmQucGxvdFgpPnRoaXMueEF4aXMubGVuLGc9ZC5wbG90WCxrPWQuc3RhY2tJbmRleCx4PWQub3B0aW9ucy5zaGFwZXx8bi5zaGFwZSxjPWQucGxvdFksdm9pZCAwIT09YyYmKGM9ZC5wbG90WSt3LSh2b2lkIDAhPT1rJiZrKm4uc3RhY2tEaXN0YW5jZSkpLGQuYW5jaG9yWD1rP3ZvaWQgMDpkLnBsb3RYLHU9az92b2lkIDA6ZC5wbG90WSxDPVwiZmxhZ1wiIT09eCxrPWQuZ3JhcGhpYyx2b2lkIDAhPT1jJiYwPD1nJiYheT8oa3x8KGs9ZC5ncmFwaGljPWIubGFiZWwoXCJcIixudWxsLG51bGwseCxudWxsLG51bGwsbi51c2VIVE1MKSxlLnN0eWxlZE1vZGV8fGsuYXR0cih0aGlzLnBvaW50QXR0cmlicyhkKSkuY3NzKG0obi5zdHlsZSxkLnN0eWxlKSksay5hdHRyKHthbGlnbjpDP1wiY2VudGVyXCI6XCJsZWZ0XCIsd2lkdGg6bi53aWR0aCxoZWlnaHQ6bi5oZWlnaHQsXG5cInRleHQtYWxpZ25cIjpuLnRleHRBbGlnbn0pLmFkZENsYXNzKFwiaGlnaGNoYXJ0cy1wb2ludFwiKS5hZGQodGhpcy5tYXJrZXJHcm91cCksZC5ncmFwaGljLmRpdiYmKGQuZ3JhcGhpYy5kaXYucG9pbnQ9ZCksZS5zdHlsZWRNb2RlfHxrLnNoYWRvdyhuLnNoYWRvdyksay5pc05ldz0hMCksMDxnJiYoZy09ay5zdHJva2VXaWR0aCgpJTIpLHg9e3k6YyxhbmNob3JZOnV9LG4uYWxsb3dPdmVybGFwWCYmKHgueD1nLHguYW5jaG9yWD1kLmFuY2hvclgpLGsuYXR0cih7dGV4dDpkLm9wdGlvbnMudGl0bGV8fG4udGl0bGV8fFwiQVwifSlbay5pc05ldz9cImF0dHJcIjpcImFuaW1hdGVcIl0oeCksbi5hbGxvd092ZXJsYXBYfHwocVtkLnBsb3RYXT9xW2QucGxvdFhdLnNpemU9TWF0aC5tYXgocVtkLnBsb3RYXS5zaXplLGsud2lkdGgpOnFbZC5wbG90WF09e2FsaWduOkM/LjU6MCxzaXplOmsud2lkdGgsdGFyZ2V0OmcsYW5jaG9yWDpnfSksZC50b29sdGlwUG9zPVtnLGMrei5wb3MtZS5wbG90VG9wXSk6XG5rJiYoZC5ncmFwaGljPWsuZGVzdHJveSgpKTtuLmFsbG93T3ZlcmxhcFh8fChhLm9iamVjdEVhY2gocSxmdW5jdGlvbihhKXthLnBsb3RYPWEuYW5jaG9yWDtBLnB1c2goYSl9KSxhLmRpc3RyaWJ1dGUoQSxoP3oubGVuOnRoaXMueEF4aXMubGVuLDEwMCksZi5mb3JFYWNoKGZ1bmN0aW9uKGEpe3ZhciBiPWEuZ3JhcGhpYyYmcVthLnBsb3RYXTtiJiYoYS5ncmFwaGljW2EuZ3JhcGhpYy5pc05ldz9cImF0dHJcIjpcImFuaW1hdGVcIl0oe3g6Yi5wb3MrYi5hbGlnbipiLnNpemUsYW5jaG9yWDphLmFuY2hvclh9KSx2KGIucG9zKT9hLmdyYXBoaWMuaXNOZXc9ITE6KGEuZ3JhcGhpYy5hdHRyKHt4Oi05OTk5LGFuY2hvclg6LTk5OTl9KSxhLmdyYXBoaWMuaXNOZXc9ITApKX0pKTtuLnVzZUhUTUwmJmEud3JhcCh0aGlzLm1hcmtlckdyb3VwLFwib25cIixmdW5jdGlvbihiKXtyZXR1cm4gYS5TVkdFbGVtZW50LnByb3RvdHlwZS5vbi5hcHBseShiLmFwcGx5KHRoaXMsW10uc2xpY2UuY2FsbChhcmd1bWVudHMsXG4xKSksW10uc2xpY2UuY2FsbChhcmd1bWVudHMsMSkpfSl9LGRyYXdUcmFja2VyOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wb2ludHM7bi5kcmF3VHJhY2tlclBvaW50LmFwcGx5KHRoaXMpO2EuZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgYj1lLmdyYXBoaWM7YiYmRShiLmVsZW1lbnQsXCJtb3VzZW92ZXJcIixmdW5jdGlvbigpezA8ZS5zdGFja0luZGV4JiYhZS5yYWlzZWQmJihlLl95PWIueSxiLmF0dHIoe3k6ZS5feS04fSksZS5yYWlzZWQ9ITApO2EuZm9yRWFjaChmdW5jdGlvbihhKXthIT09ZSYmYS5yYWlzZWQmJmEuZ3JhcGhpYyYmKGEuZ3JhcGhpYy5hdHRyKHt5OmEuX3l9KSxhLnJhaXNlZD0hMSl9KX0pfSl9LGFuaW1hdGU6ZnVuY3Rpb24oYSl7YT90aGlzLnNldENsaXAoKTp0aGlzLmFuaW1hdGU9bnVsbH0sc2V0Q2xpcDpmdW5jdGlvbigpe3kucHJvdG90eXBlLnNldENsaXAuYXBwbHkodGhpcyxhcmd1bWVudHMpOyExIT09dGhpcy5vcHRpb25zLmNsaXAmJnRoaXMuc2hhcmVkQ2xpcEtleSYmXG50aGlzLm1hcmtlckdyb3VwLmNsaXAodGhpcy5jaGFydFt0aGlzLnNoYXJlZENsaXBLZXldKX0sYnVpbGRLRFRyZWU6ZyxpbnZlcnRHcm91cHM6Z30se2lzVmFsaWQ6ZnVuY3Rpb24oKXtyZXR1cm4gYS5pc051bWJlcih0aGlzLnkpfHx2b2lkIDA9PT10aGlzLnl9fSk7aC5mbGFnPWZ1bmN0aW9uKGEsZSxiLGYsYyl7dmFyIGc9YyYmYy5hbmNob3JYfHxhO2M9YyYmYy5hbmNob3JZfHxlO3JldHVybiBoLmNpcmNsZShnLTEsYy0xLDIsMikuY29uY2F0KFtcIk1cIixnLGMsXCJMXCIsYSxlK2YsYSxlLGErYixlLGErYixlK2YsYSxlK2YsXCJaXCJdKX07QShcImNpcmNsZVwiKTtBKFwic3F1YXJlXCIpO3g9PT1mJiZbXCJmbGFnXCIsXCJjaXJjbGVwaW5cIixcInNxdWFyZXBpblwiXS5mb3JFYWNoKGZ1bmN0aW9uKGEpe2YucHJvdG90eXBlLnN5bWJvbHNbYV09aFthXX0pfSk7SShILFwicGFydHMvUmFuZ2VTZWxlY3Rvci5qc1wiLFtIW1wicGFydHMvR2xvYmFscy5qc1wiXV0sZnVuY3Rpb24oYSl7ZnVuY3Rpb24gQyhhKXt0aGlzLmluaXQoYSl9XG52YXIgQT1hLmFkZEV2ZW50LEU9YS5BeGlzLG09YS5DaGFydCxnPWEuY3NzLHY9YS5jcmVhdGVFbGVtZW50LHg9YS5kZWZhdWx0T3B0aW9ucyx5PWEuZGVmaW5lZCx6PWEuZGVzdHJveU9iamVjdFByb3BlcnRpZXMsbj1hLmRpc2NhcmRFbGVtZW50LGY9YS5leHRlbmQsaD1hLmZpcmVFdmVudCxyPWEuaXNOdW1iZXIsZT1hLm1lcmdlLGI9YS5waWNrLGw9YS5wSW50LGM9YS5zcGxhdDtmKHgse3JhbmdlU2VsZWN0b3I6e3ZlcnRpY2FsQWxpZ246XCJ0b3BcIixidXR0b25UaGVtZTp7d2lkdGg6MjgsaGVpZ2h0OjE4LHBhZGRpbmc6Mix6SW5kZXg6N30sZmxvYXRpbmc6ITEseDowLHk6MCxoZWlnaHQ6dm9pZCAwLGlucHV0UG9zaXRpb246e2FsaWduOlwicmlnaHRcIix4OjAseTowfSxidXR0b25Qb3NpdGlvbjp7YWxpZ246XCJsZWZ0XCIseDowLHk6MH0sbGFiZWxTdHlsZTp7Y29sb3I6XCIjNjY2NjY2XCJ9fX0pO3gubGFuZz1lKHgubGFuZyx7cmFuZ2VTZWxlY3Rvclpvb206XCJab29tXCIscmFuZ2VTZWxlY3RvckZyb206XCJGcm9tXCIsXG5yYW5nZVNlbGVjdG9yVG86XCJUb1wifSk7Qy5wcm90b3R5cGU9e2NsaWNrQnV0dG9uOmZ1bmN0aW9uKGEsZSl7dmFyIGY9dGhpcy5jaGFydCxnPXRoaXMuYnV0dG9uT3B0aW9uc1thXSxoPWYueEF4aXNbMF0sZD1mLnNjcm9sbGVyJiZmLnNjcm9sbGVyLmdldFVuaW9uRXh0cmVtZXMoKXx8aHx8e30saz1kLmRhdGFNaW4sbD1kLmRhdGFNYXgsbSx0PWgmJk1hdGgucm91bmQoTWF0aC5taW4oaC5tYXgsYihsLGgubWF4KSkpLHE9Zy50eXBlLG4sZD1nLl9yYW5nZSx2LHgseSx6PWcuZGF0YUdyb3VwaW5nO2lmKG51bGwhPT1rJiZudWxsIT09bCl7Zi5maXhlZFJhbmdlPWQ7eiYmKHRoaXMuZm9yY2VkRGF0YUdyb3VwaW5nPSEwLEUucHJvdG90eXBlLnNldERhdGFHcm91cGluZy5jYWxsKGh8fHtjaGFydDp0aGlzLmNoYXJ0fSx6LCExKSx0aGlzLmZyb3plblN0YXRlcz1nLnByZXNlcnZlRGF0YUdyb3VwaW5nKTtpZihcIm1vbnRoXCI9PT1xfHxcInllYXJcIj09PXEpaD8ocT17cmFuZ2U6ZyxtYXg6dCxcbmNoYXJ0OmYsZGF0YU1pbjprLGRhdGFNYXg6bH0sbT1oLm1pbkZyb21SYW5nZS5jYWxsKHEpLHIocS5uZXdNYXgpJiYodD1xLm5ld01heCkpOmQ9ZztlbHNlIGlmKGQpbT1NYXRoLm1heCh0LWQsayksdD1NYXRoLm1pbihtK2QsbCk7ZWxzZSBpZihcInl0ZFwiPT09cSlpZihoKXZvaWQgMD09PWwmJihrPU51bWJlci5NQVhfVkFMVUUsbD1OdW1iZXIuTUlOX1ZBTFVFLGYuc2VyaWVzLmZvckVhY2goZnVuY3Rpb24oYSl7YT1hLnhEYXRhO2s9TWF0aC5taW4oYVswXSxrKTtsPU1hdGgubWF4KGFbYS5sZW5ndGgtMV0sbCl9KSxlPSExKSx0PXRoaXMuZ2V0WVRERXh0cmVtZXMobCxrLGYudGltZS51c2VVVEMpLG09dj10Lm1pbix0PXQubWF4O2Vsc2V7dGhpcy5kZWZlcnJlZFlURENsaWNrPWE7cmV0dXJufWVsc2VcImFsbFwiPT09cSYmaCYmKG09ayx0PWwpO20rPWcuX29mZnNldE1pbjt0Kz1nLl9vZmZzZXRNYXg7dGhpcy5zZXRTZWxlY3RlZChhKTtoP2guc2V0RXh0cmVtZXMobSx0LGIoZSwxKSxcbm51bGwse3RyaWdnZXI6XCJyYW5nZVNlbGVjdG9yQnV0dG9uXCIscmFuZ2VTZWxlY3RvckJ1dHRvbjpnfSk6KG49YyhmLm9wdGlvbnMueEF4aXMpWzBdLHk9bi5yYW5nZSxuLnJhbmdlPWQseD1uLm1pbixuLm1pbj12LEEoZixcImxvYWRcIixmdW5jdGlvbigpe24ucmFuZ2U9eTtuLm1pbj14fSkpfX0sc2V0U2VsZWN0ZWQ6ZnVuY3Rpb24oYSl7dGhpcy5zZWxlY3RlZD10aGlzLm9wdGlvbnMuc2VsZWN0ZWQ9YX0sZGVmYXVsdEJ1dHRvbnM6W3t0eXBlOlwibW9udGhcIixjb3VudDoxLHRleHQ6XCIxbVwifSx7dHlwZTpcIm1vbnRoXCIsY291bnQ6Myx0ZXh0OlwiM21cIn0se3R5cGU6XCJtb250aFwiLGNvdW50OjYsdGV4dDpcIjZtXCJ9LHt0eXBlOlwieXRkXCIsdGV4dDpcIllURFwifSx7dHlwZTpcInllYXJcIixjb3VudDoxLHRleHQ6XCIxeVwifSx7dHlwZTpcImFsbFwiLHRleHQ6XCJBbGxcIn1dLGluaXQ6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcyxjPWEub3B0aW9ucy5yYW5nZVNlbGVjdG9yLGU9Yy5idXR0b25zfHxbXS5jb25jYXQoYi5kZWZhdWx0QnV0dG9ucyksXG5mPWMuc2VsZWN0ZWQsZD1mdW5jdGlvbigpe3ZhciBhPWIubWluSW5wdXQsZD1iLm1heElucHV0O2EmJmEuYmx1ciYmaChhLFwiYmx1clwiKTtkJiZkLmJsdXImJmgoZCxcImJsdXJcIil9O2IuY2hhcnQ9YTtiLm9wdGlvbnM9YztiLmJ1dHRvbnM9W107Yi5idXR0b25PcHRpb25zPWU7dGhpcy51bk1vdXNlRG93bj1BKGEuY29udGFpbmVyLFwibW91c2Vkb3duXCIsZCk7dGhpcy51blJlc2l6ZT1BKGEsXCJyZXNpemVcIixkKTtlLmZvckVhY2goYi5jb21wdXRlQnV0dG9uUmFuZ2UpO3ZvaWQgMCE9PWYmJmVbZl0mJnRoaXMuY2xpY2tCdXR0b24oZiwhMSk7QShhLFwibG9hZFwiLGZ1bmN0aW9uKCl7YS54QXhpcyYmYS54QXhpc1swXSYmQShhLnhBeGlzWzBdLFwic2V0RXh0cmVtZXNcIixmdW5jdGlvbihkKXt0aGlzLm1heC10aGlzLm1pbiE9PWEuZml4ZWRSYW5nZSYmXCJyYW5nZVNlbGVjdG9yQnV0dG9uXCIhPT1kLnRyaWdnZXImJlwidXBkYXRlZERhdGFcIiE9PWQudHJpZ2dlciYmYi5mb3JjZWREYXRhR3JvdXBpbmcmJlxuIWIuZnJvemVuU3RhdGVzJiZ0aGlzLnNldERhdGFHcm91cGluZyghMSwhMSl9KX0pfSx1cGRhdGVCdXR0b25TdGF0ZXM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLGI9dGhpcy5jaGFydCxjPWIueEF4aXNbMF0sZT1NYXRoLnJvdW5kKGMubWF4LWMubWluKSxmPSFjLmhhc1Zpc2libGVTZXJpZXMsZD1iLnNjcm9sbGVyJiZiLnNjcm9sbGVyLmdldFVuaW9uRXh0cmVtZXMoKXx8YyxnPWQuZGF0YU1pbixoPWQuZGF0YU1heCxiPWEuZ2V0WVRERXh0cmVtZXMoaCxnLGIudGltZS51c2VVVEMpLGw9Yi5taW4sbT1iLm1heCxxPWEuc2VsZWN0ZWQsbj1yKHEpLHY9YS5vcHRpb25zLmFsbEJ1dHRvbnNFbmFibGVkLHg9YS5idXR0b25zO2EuYnV0dG9uT3B0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uKGIsZCl7dmFyIGs9Yi5fcmFuZ2UscD1iLnR5cGUsdD1iLmNvdW50fHwxLHU9eFtkXSxyPTAsdz1iLl9vZmZzZXRNYXgtYi5fb2Zmc2V0TWluO2I9ZD09PXE7dmFyIHk9az5oLWcsej1rPGMubWluUmFuZ2UsXG5CPSExLEE9ITEsaz1rPT09ZTsoXCJtb250aFwiPT09cHx8XCJ5ZWFyXCI9PT1wKSYmZSszNkU1Pj04NjRFNSp7bW9udGg6MjgseWVhcjozNjV9W3BdKnQtdyYmZS0zNkU1PD04NjRFNSp7bW9udGg6MzEseWVhcjozNjZ9W3BdKnQrdz9rPSEwOlwieXRkXCI9PT1wPyhrPW0tbCt3PT09ZSxCPSFiKTpcImFsbFwiPT09cCYmKGs9Yy5tYXgtYy5taW4+PWgtZyxBPSFiJiZuJiZrKTtwPSF2JiYoeXx8enx8QXx8Zik7dD1iJiZrfHxrJiYhbiYmIUJ8fGImJmEuZnJvemVuU3RhdGVzO3A/cj0zOnQmJihuPSEwLHI9Mik7dS5zdGF0ZSE9PXImJih1LnNldFN0YXRlKHIpLDA9PT1yJiZxPT09ZCYmYS5zZXRTZWxlY3RlZChudWxsKSl9KX0sY29tcHV0ZUJ1dHRvblJhbmdlOmZ1bmN0aW9uKGEpe3ZhciBjPWEudHlwZSxlPWEuY291bnR8fDEsZj17bWlsbGlzZWNvbmQ6MSxzZWNvbmQ6MUUzLG1pbnV0ZTo2RTQsaG91cjozNkU1LGRheTo4NjRFNSx3ZWVrOjYwNDhFNX07aWYoZltjXSlhLl9yYW5nZT1mW2NdKmU7ZWxzZSBpZihcIm1vbnRoXCI9PT1cbmN8fFwieWVhclwiPT09YylhLl9yYW5nZT04NjRFNSp7bW9udGg6MzAseWVhcjozNjV9W2NdKmU7YS5fb2Zmc2V0TWluPWIoYS5vZmZzZXRNaW4sMCk7YS5fb2Zmc2V0TWF4PWIoYS5vZmZzZXRNYXgsMCk7YS5fcmFuZ2UrPWEuX29mZnNldE1heC1hLl9vZmZzZXRNaW59LHNldElucHV0VmFsdWU6ZnVuY3Rpb24oYSxiKXt2YXIgYz10aGlzLmNoYXJ0Lm9wdGlvbnMucmFuZ2VTZWxlY3RvcixlPXRoaXMuY2hhcnQudGltZSxmPXRoaXNbYStcIklucHV0XCJdO3koYikmJihmLnByZXZpb3VzVmFsdWU9Zi5IQ1RpbWUsZi5IQ1RpbWU9Yik7Zi52YWx1ZT1lLmRhdGVGb3JtYXQoYy5pbnB1dEVkaXREYXRlRm9ybWF0fHxcIiVZLSVtLSVkXCIsZi5IQ1RpbWUpO3RoaXNbYStcIkRhdGVCb3hcIl0uYXR0cih7dGV4dDplLmRhdGVGb3JtYXQoYy5pbnB1dERhdGVGb3JtYXR8fFwiJWIgJWUsICVZXCIsZi5IQ1RpbWUpfSl9LHNob3dJbnB1dDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmlucHV0R3JvdXAsYz10aGlzW2ErXG5cIkRhdGVCb3hcIl07Zyh0aGlzW2ErXCJJbnB1dFwiXSx7bGVmdDpiLnRyYW5zbGF0ZVgrYy54K1wicHhcIix0b3A6Yi50cmFuc2xhdGVZK1wicHhcIix3aWR0aDpjLndpZHRoLTIrXCJweFwiLGhlaWdodDpjLmhlaWdodC0yK1wicHhcIixib3JkZXI6XCIycHggc29saWQgc2lsdmVyXCJ9KX0saGlkZUlucHV0OmZ1bmN0aW9uKGEpe2codGhpc1thK1wiSW5wdXRcIl0se2JvcmRlcjowLHdpZHRoOlwiMXB4XCIsaGVpZ2h0OlwiMXB4XCJ9KTt0aGlzLnNldElucHV0VmFsdWUoYSl9LGRyYXdJbnB1dDpmdW5jdGlvbihiKXtmdW5jdGlvbiBjKCl7dmFyIGE9eS52YWx1ZSxiPShrLmlucHV0RGF0ZVBhcnNlcnx8RGF0ZS5wYXJzZSkoYSksZD1tLnhBeGlzWzBdLGM9bS5zY3JvbGxlciYmbS5zY3JvbGxlci54QXhpcz9tLnNjcm9sbGVyLnhBeGlzOmQsZT1jLmRhdGFNaW4sYz1jLmRhdGFNYXg7YiE9PXkucHJldmlvdXNWYWx1ZSYmKHkucHJldmlvdXNWYWx1ZT1iLHIoYil8fChiPWEuc3BsaXQoXCItXCIpLGI9RGF0ZS5VVEMobChiWzBdKSxcbmwoYlsxXSktMSxsKGJbMl0pKSkscihiKSYmKG0udGltZS51c2VVVEN8fChiKz02RTQqKG5ldyBEYXRlKS5nZXRUaW1lem9uZU9mZnNldCgpKSx0P2I+aC5tYXhJbnB1dC5IQ1RpbWU/Yj12b2lkIDA6YjxlJiYoYj1lKTpiPGgubWluSW5wdXQuSENUaW1lP2I9dm9pZCAwOmI+YyYmKGI9Yyksdm9pZCAwIT09YiYmZC5zZXRFeHRyZW1lcyh0P2I6ZC5taW4sdD9kLm1heDpiLHZvaWQgMCx2b2lkIDAse3RyaWdnZXI6XCJyYW5nZVNlbGVjdG9ySW5wdXRcIn0pKSl9dmFyIGg9dGhpcyxtPWguY2hhcnQscD1tLnJlbmRlcmVyLnN0eWxlfHx7fSxkPW0ucmVuZGVyZXIsaz1tLm9wdGlvbnMucmFuZ2VTZWxlY3RvcixuPWguZGl2LHQ9XCJtaW5cIj09PWIseSxxLHo9dGhpcy5pbnB1dEdyb3VwO3RoaXNbYitcIkxhYmVsXCJdPXE9ZC5sYWJlbCh4LmxhbmdbdD9cInJhbmdlU2VsZWN0b3JGcm9tXCI6XCJyYW5nZVNlbGVjdG9yVG9cIl0sdGhpcy5pbnB1dEdyb3VwLm9mZnNldCkuYWRkQ2xhc3MoXCJoaWdoY2hhcnRzLXJhbmdlLWxhYmVsXCIpLmF0dHIoe3BhZGRpbmc6Mn0pLmFkZCh6KTtcbnoub2Zmc2V0Kz1xLndpZHRoKzU7dGhpc1tiK1wiRGF0ZUJveFwiXT1kPWQubGFiZWwoXCJcIix6Lm9mZnNldCkuYWRkQ2xhc3MoXCJoaWdoY2hhcnRzLXJhbmdlLWlucHV0XCIpLmF0dHIoe3BhZGRpbmc6Mix3aWR0aDprLmlucHV0Qm94V2lkdGh8fDkwLGhlaWdodDprLmlucHV0Qm94SGVpZ2h0fHwxNyxcInRleHQtYWxpZ25cIjpcImNlbnRlclwifSkub24oXCJjbGlja1wiLGZ1bmN0aW9uKCl7aC5zaG93SW5wdXQoYik7aFtiK1wiSW5wdXRcIl0uZm9jdXMoKX0pO20uc3R5bGVkTW9kZXx8ZC5hdHRyKHtzdHJva2U6ay5pbnB1dEJveEJvcmRlckNvbG9yfHxcIiNjY2NjY2NcIixcInN0cm9rZS13aWR0aFwiOjF9KTtkLmFkZCh6KTt6Lm9mZnNldCs9ZC53aWR0aCsodD8xMDowKTt0aGlzW2IrXCJJbnB1dFwiXT15PXYoXCJpbnB1dFwiLHtuYW1lOmIsY2xhc3NOYW1lOlwiaGlnaGNoYXJ0cy1yYW5nZS1zZWxlY3RvclwiLHR5cGU6XCJ0ZXh0XCJ9LHt0b3A6bS5wbG90VG9wK1wicHhcIn0sbik7bS5zdHlsZWRNb2RlfHwocS5jc3MoZShwLFxuay5sYWJlbFN0eWxlKSksZC5jc3MoZSh7Y29sb3I6XCIjMzMzMzMzXCJ9LHAsay5pbnB1dFN0eWxlKSksZyh5LGYoe3Bvc2l0aW9uOlwiYWJzb2x1dGVcIixib3JkZXI6MCx3aWR0aDpcIjFweFwiLGhlaWdodDpcIjFweFwiLHBhZGRpbmc6MCx0ZXh0QWxpZ246XCJjZW50ZXJcIixmb250U2l6ZTpwLmZvbnRTaXplLGZvbnRGYW1pbHk6cC5mb250RmFtaWx5LHRvcDpcIi05OTk5ZW1cIn0say5pbnB1dFN0eWxlKSkpO3kub25mb2N1cz1mdW5jdGlvbigpe2guc2hvd0lucHV0KGIpfTt5Lm9uYmx1cj1mdW5jdGlvbigpe3k9PT1hLmRvYy5hY3RpdmVFbGVtZW50JiZjKCk7aC5oaWRlSW5wdXQoYik7eS5ibHVyKCl9O3kub25jaGFuZ2U9Yzt5Lm9ua2V5cHJlc3M9ZnVuY3Rpb24oYSl7MTM9PT1hLmtleUNvZGUmJmMoKX19LGdldFBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5jaGFydCxiPWEub3B0aW9ucy5yYW5nZVNlbGVjdG9yLGE9XCJ0b3BcIj09PWIudmVydGljYWxBbGlnbj9hLnBsb3RUb3AtYS5heGlzT2Zmc2V0WzBdOlxuMDtyZXR1cm57YnV0dG9uVG9wOmErYi5idXR0b25Qb3NpdGlvbi55LGlucHV0VG9wOmErYi5pbnB1dFBvc2l0aW9uLnktMTB9fSxnZXRZVERFeHRyZW1lczpmdW5jdGlvbihhLGIsYyl7dmFyIGU9dGhpcy5jaGFydC50aW1lLGY9bmV3IGUuRGF0ZShhKSxkPWUuZ2V0KFwiRnVsbFllYXJcIixmKTtjPWM/ZS5EYXRlLlVUQyhkLDAsMSk6K25ldyBlLkRhdGUoZCwwLDEpO2I9TWF0aC5tYXgoYnx8MCxjKTtmPWYuZ2V0VGltZSgpO3JldHVybnttYXg6TWF0aC5taW4oYXx8ZixmKSxtaW46Yn19LHJlbmRlcjpmdW5jdGlvbihhLGMpe3ZhciBlPXRoaXMsZj1lLmNoYXJ0LGc9Zi5yZW5kZXJlcixkPWYuY29udGFpbmVyLGg9Zi5vcHRpb25zLGw9aC5leHBvcnRpbmcmJiExIT09aC5leHBvcnRpbmcuZW5hYmxlZCYmaC5uYXZpZ2F0aW9uJiZoLm5hdmlnYXRpb24uYnV0dG9uT3B0aW9ucyxtPXgubGFuZyxuPWUuZGl2LHE9aC5yYW5nZVNlbGVjdG9yLHQ9YihoLmNoYXJ0LnN0eWxlJiZoLmNoYXJ0LnN0eWxlLnpJbmRleCxcbjApKzEsaD1xLmZsb2F0aW5nLHI9ZS5idXR0b25zLG49ZS5pbnB1dEdyb3VwLHk9cS5idXR0b25UaGVtZSx6PXEuYnV0dG9uUG9zaXRpb24sQT1xLmlucHV0UG9zaXRpb24sQz1xLmlucHV0RW5hYmxlZCxGPXkmJnkuc3RhdGVzLEU9Zi5wbG90TGVmdCxILEk9ZS5idXR0b25Hcm91cCxTO1M9ZS5yZW5kZXJlZDt2YXIgVz1lLm9wdGlvbnMudmVydGljYWxBbGlnbixRPWYubGVnZW5kLGNhPVEmJlEub3B0aW9ucyxVPXoueSxUPUEueSxYPVN8fCExLFk9WD9cImFuaW1hdGVcIjpcImF0dHJcIixWPTAsYWE9MCxaO2lmKCExIT09cS5lbmFibGVkKXtTfHwoZS5ncm91cD1TPWcuZyhcInJhbmdlLXNlbGVjdG9yLWdyb3VwXCIpLmF0dHIoe3pJbmRleDo3fSkuYWRkKCksZS5idXR0b25Hcm91cD1JPWcuZyhcInJhbmdlLXNlbGVjdG9yLWJ1dHRvbnNcIikuYWRkKFMpLGUuem9vbVRleHQ9Zy50ZXh0KG0ucmFuZ2VTZWxlY3Rvclpvb20sMCwxNSkuYWRkKEkpLGYuc3R5bGVkTW9kZXx8KGUuem9vbVRleHQuY3NzKHEubGFiZWxTdHlsZSksXG55W1wic3Ryb2tlLXdpZHRoXCJdPWIoeVtcInN0cm9rZS13aWR0aFwiXSwwKSksZS5idXR0b25PcHRpb25zLmZvckVhY2goZnVuY3Rpb24oYSxiKXtyW2JdPWcuYnV0dG9uKGEudGV4dCwwLDAsZnVuY3Rpb24oZCl7dmFyIGM9YS5ldmVudHMmJmEuZXZlbnRzLmNsaWNrLGY7YyYmKGY9Yy5jYWxsKGEsZCkpOyExIT09ZiYmZS5jbGlja0J1dHRvbihiKTtlLmlzQWN0aXZlPSEwfSx5LEYmJkYuaG92ZXIsRiYmRi5zZWxlY3QsRiYmRi5kaXNhYmxlZCkuYXR0cih7XCJ0ZXh0LWFsaWduXCI6XCJjZW50ZXJcIn0pLmFkZChJKX0pLCExIT09QyYmKGUuZGl2PW49dihcImRpdlwiLG51bGwse3Bvc2l0aW9uOlwicmVsYXRpdmVcIixoZWlnaHQ6MCx6SW5kZXg6dH0pLGQucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUobixkKSxlLmlucHV0R3JvdXA9bj1nLmcoXCJpbnB1dC1ncm91cFwiKS5hZGQoUyksbi5vZmZzZXQ9MCxlLmRyYXdJbnB1dChcIm1pblwiKSxlLmRyYXdJbnB1dChcIm1heFwiKSkpO2Uuem9vbVRleHRbWV0oe3g6YihFK1xuei54LEUpfSk7SD1iKEUrei54LEUpK2Uuem9vbVRleHQuZ2V0QkJveCgpLndpZHRoKzU7ZS5idXR0b25PcHRpb25zLmZvckVhY2goZnVuY3Rpb24oYSxkKXtyW2RdW1ldKHt4Okh9KTtIKz1yW2RdLndpZHRoK2IocS5idXR0b25TcGFjaW5nLDUpfSk7RT1mLnBsb3RMZWZ0LWYuc3BhY2luZ1szXTtlLnVwZGF0ZUJ1dHRvblN0YXRlcygpO2wmJnRoaXMudGl0bGVDb2xsaXNpb24oZikmJlwidG9wXCI9PT1XJiZcInJpZ2h0XCI9PT16LmFsaWduJiZ6LnkrSS5nZXRCQm94KCkuaGVpZ2h0LTEyPChsLnl8fDApK2wuaGVpZ2h0JiYoVj0tNDApO1wibGVmdFwiPT09ei5hbGlnbj9aPXoueC1mLnNwYWNpbmdbM106XCJyaWdodFwiPT09ei5hbGlnbiYmKFo9ei54K1YtZi5zcGFjaW5nWzFdKTtJLmFsaWduKHt5OnoueSx3aWR0aDpJLmdldEJCb3goKS53aWR0aCxhbGlnbjp6LmFsaWduLHg6Wn0sITAsZi5zcGFjaW5nQm94KTtlLmdyb3VwLnBsYWNlZD1YO2UuYnV0dG9uR3JvdXAucGxhY2VkPVg7ITEhPT1DJiZcbihWPWwmJnRoaXMudGl0bGVDb2xsaXNpb24oZikmJlwidG9wXCI9PT1XJiZcInJpZ2h0XCI9PT1BLmFsaWduJiZBLnktbi5nZXRCQm94KCkuaGVpZ2h0LTEyPChsLnl8fDApK2wuaGVpZ2h0K2Yuc3BhY2luZ1swXT8tNDA6MCxcImxlZnRcIj09PUEuYWxpZ24/Wj1FOlwicmlnaHRcIj09PUEuYWxpZ24mJihaPS1NYXRoLm1heChmLmF4aXNPZmZzZXRbMV0sLVYpKSxuLmFsaWduKHt5OkEueSx3aWR0aDpuLmdldEJCb3goKS53aWR0aCxhbGlnbjpBLmFsaWduLHg6QS54K1otMn0sITAsZi5zcGFjaW5nQm94KSxkPW4uYWxpZ25BdHRyLnRyYW5zbGF0ZVgrbi5hbGlnbk9wdGlvbnMueC1WK24uZ2V0QkJveCgpLngrMixsPW4uYWxpZ25PcHRpb25zLndpZHRoLG09SS5hbGlnbkF0dHIudHJhbnNsYXRlWCtJLmdldEJCb3goKS54LFo9SS5nZXRCQm94KCkud2lkdGgrMjAsKEEuYWxpZ249PT16LmFsaWdufHxtK1o+ZCYmZCtsPm0mJlU8VCtuLmdldEJCb3goKS5oZWlnaHQpJiZuLmF0dHIoe3RyYW5zbGF0ZVg6bi5hbGlnbkF0dHIudHJhbnNsYXRlWCtcbihmLmF4aXNPZmZzZXRbMV0+PS1WPzA6LVYpLHRyYW5zbGF0ZVk6bi5hbGlnbkF0dHIudHJhbnNsYXRlWStJLmdldEJCb3goKS5oZWlnaHQrMTB9KSxlLnNldElucHV0VmFsdWUoXCJtaW5cIixhKSxlLnNldElucHV0VmFsdWUoXCJtYXhcIixjKSxlLmlucHV0R3JvdXAucGxhY2VkPVgpO2UuZ3JvdXAuYWxpZ24oe3ZlcnRpY2FsQWxpZ246V30sITAsZi5zcGFjaW5nQm94KTthPWUuZ3JvdXAuZ2V0QkJveCgpLmhlaWdodCsyMDtjPWUuZ3JvdXAuYWxpZ25BdHRyLnRyYW5zbGF0ZVk7XCJib3R0b21cIj09PVcmJihRPWNhJiZcImJvdHRvbVwiPT09Y2EudmVydGljYWxBbGlnbiYmY2EuZW5hYmxlZCYmIWNhLmZsb2F0aW5nP1EubGVnZW5kSGVpZ2h0K2IoY2EubWFyZ2luLDEwKTowLGE9YStRLTIwLGFhPWMtYS0oaD8wOnEueSktMTApO2lmKFwidG9wXCI9PT1XKWgmJihhYT0wKSxmLnRpdGxlT2Zmc2V0JiYoYWE9Zi50aXRsZU9mZnNldCtmLm9wdGlvbnMudGl0bGUubWFyZ2luKSxhYSs9Zi5tYXJnaW5bMF0tXG5mLnNwYWNpbmdbMF18fDA7ZWxzZSBpZihcIm1pZGRsZVwiPT09VylpZihUPT09VSlhYT0wPlQ/Yyt2b2lkIDA6YztlbHNlIGlmKFR8fFUpYWE9MD5UfHwwPlU/YWEtTWF0aC5taW4oVCxVKTpjLWErTmFOO2UuZ3JvdXAudHJhbnNsYXRlKHEueCxxLnkrTWF0aC5mbG9vcihhYSkpOyExIT09QyYmKGUubWluSW5wdXQuc3R5bGUubWFyZ2luVG9wPWUuZ3JvdXAudHJhbnNsYXRlWStcInB4XCIsZS5tYXhJbnB1dC5zdHlsZS5tYXJnaW5Ub3A9ZS5ncm91cC50cmFuc2xhdGVZK1wicHhcIik7ZS5yZW5kZXJlZD0hMH19LGdldEhlaWdodDpmdW5jdGlvbigpe3ZhciBhPXRoaXMub3B0aW9ucyxiPXRoaXMuZ3JvdXAsYz1hLnksZT1hLmJ1dHRvblBvc2l0aW9uLnksZj1hLmlucHV0UG9zaXRpb24ueTtpZihhLmhlaWdodClyZXR1cm4gYS5oZWlnaHQ7YT1iP2IuZ2V0QkJveCghMCkuaGVpZ2h0KzEzK2M6MDtiPU1hdGgubWluKGYsZSk7aWYoMD5mJiYwPmV8fDA8ZiYmMDxlKWErPU1hdGguYWJzKGIpO3JldHVybiBhfSxcbnRpdGxlQ29sbGlzaW9uOmZ1bmN0aW9uKGEpe3JldHVybiEoYS5vcHRpb25zLnRpdGxlLnRleHR8fGEub3B0aW9ucy5zdWJ0aXRsZS50ZXh0KX0sdXBkYXRlOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuY2hhcnQ7ZSghMCxiLm9wdGlvbnMucmFuZ2VTZWxlY3RvcixhKTt0aGlzLmRlc3Ryb3koKTt0aGlzLmluaXQoYik7Yi5yYW5nZVNlbGVjdG9yLnJlbmRlcigpfSxkZXN0cm95OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcyxjPWIubWluSW5wdXQsZT1iLm1heElucHV0O2IudW5Nb3VzZURvd24oKTtiLnVuUmVzaXplKCk7eihiLmJ1dHRvbnMpO2MmJihjLm9uZm9jdXM9Yy5vbmJsdXI9Yy5vbmNoYW5nZT1udWxsKTtlJiYoZS5vbmZvY3VzPWUub25ibHVyPWUub25jaGFuZ2U9bnVsbCk7YS5vYmplY3RFYWNoKGIsZnVuY3Rpb24oYSxjKXthJiZcImNoYXJ0XCIhPT1jJiYoYS5kZXN0cm95P2EuZGVzdHJveSgpOmEubm9kZVR5cGUmJm4odGhpc1tjXSkpO2EhPT1DLnByb3RvdHlwZVtjXSYmKGJbY109XG5udWxsKX0sdGhpcyl9fTtFLnByb3RvdHlwZS5taW5Gcm9tUmFuZ2U9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnJhbmdlLGM9e21vbnRoOlwiTW9udGhcIix5ZWFyOlwiRnVsbFllYXJcIn1bYS50eXBlXSxlLGY9dGhpcy5tYXgsZyxkLGg9dGhpcy5jaGFydC50aW1lLGw9ZnVuY3Rpb24oYSxiKXt2YXIgZD1uZXcgaC5EYXRlKGEpLGU9aC5nZXQoYyxkKTtoLnNldChjLGQsZStiKTtlPT09aC5nZXQoYyxkKSYmaC5zZXQoXCJEYXRlXCIsZCwwKTtyZXR1cm4gZC5nZXRUaW1lKCktYX07cihhKT8oZT1mLWEsZD1hKTooZT1mK2woZiwtYS5jb3VudCksdGhpcy5jaGFydCYmKHRoaXMuY2hhcnQuZml4ZWRSYW5nZT1mLWUpKTtnPWIodGhpcy5kYXRhTWluLE51bWJlci5NSU5fVkFMVUUpO3IoZSl8fChlPWcpO2U8PWcmJihlPWcsdm9pZCAwPT09ZCYmKGQ9bChlLGEuY291bnQpKSx0aGlzLm5ld01heD1NYXRoLm1pbihlK2QsdGhpcy5kYXRhTWF4KSk7cihmKXx8KGU9dm9pZCAwKTtyZXR1cm4gZX07YS5SYW5nZVNlbGVjdG9yfHxcbihBKG0sXCJhZnRlckdldENvbnRhaW5lclwiLGZ1bmN0aW9uKCl7dGhpcy5vcHRpb25zLnJhbmdlU2VsZWN0b3IuZW5hYmxlZCYmKHRoaXMucmFuZ2VTZWxlY3Rvcj1uZXcgQyh0aGlzKSl9KSxBKG0sXCJiZWZvcmVSZW5kZXJcIixmdW5jdGlvbigpe3ZhciBhPXRoaXMuYXhlcyxiPXRoaXMucmFuZ2VTZWxlY3RvcjtiJiYocihiLmRlZmVycmVkWVREQ2xpY2spJiYoYi5jbGlja0J1dHRvbihiLmRlZmVycmVkWVREQ2xpY2spLGRlbGV0ZSBiLmRlZmVycmVkWVREQ2xpY2spLGEuZm9yRWFjaChmdW5jdGlvbihhKXthLnVwZGF0ZU5hbWVzKCk7YS5zZXRTY2FsZSgpfSksdGhpcy5nZXRBeGlzTWFyZ2lucygpLGIucmVuZGVyKCksYT1iLm9wdGlvbnMudmVydGljYWxBbGlnbixiLm9wdGlvbnMuZmxvYXRpbmd8fChcImJvdHRvbVwiPT09YT90aGlzLmV4dHJhQm90dG9tTWFyZ2luPSEwOlwibWlkZGxlXCIhPT1hJiYodGhpcy5leHRyYVRvcE1hcmdpbj0hMCkpKX0pLEEobSxcInVwZGF0ZVwiLGZ1bmN0aW9uKGEpe3ZhciBiPVxuYS5vcHRpb25zLnJhbmdlU2VsZWN0b3I7YT10aGlzLnJhbmdlU2VsZWN0b3I7dmFyIGM9dGhpcy5leHRyYUJvdHRvbU1hcmdpbixlPXRoaXMuZXh0cmFUb3BNYXJnaW47YiYmYi5lbmFibGVkJiYheShhKSYmKHRoaXMub3B0aW9ucy5yYW5nZVNlbGVjdG9yLmVuYWJsZWQ9ITAsdGhpcy5yYW5nZVNlbGVjdG9yPW5ldyBDKHRoaXMpKTt0aGlzLmV4dHJhVG9wTWFyZ2luPXRoaXMuZXh0cmFCb3R0b21NYXJnaW49ITE7YSYmKGEucmVuZGVyKCksYj1iJiZiLnZlcnRpY2FsQWxpZ258fGEub3B0aW9ucyYmYS5vcHRpb25zLnZlcnRpY2FsQWxpZ24sYS5vcHRpb25zLmZsb2F0aW5nfHwoXCJib3R0b21cIj09PWI/dGhpcy5leHRyYUJvdHRvbU1hcmdpbj0hMDpcIm1pZGRsZVwiIT09YiYmKHRoaXMuZXh0cmFUb3BNYXJnaW49ITApKSx0aGlzLmV4dHJhQm90dG9tTWFyZ2luIT09Y3x8dGhpcy5leHRyYVRvcE1hcmdpbiE9PWUpJiYodGhpcy5pc0RpcnR5Qm94PSEwKX0pLEEobSxcInJlbmRlclwiLGZ1bmN0aW9uKCl7dmFyIGE9XG50aGlzLnJhbmdlU2VsZWN0b3I7YSYmIWEub3B0aW9ucy5mbG9hdGluZyYmKGEucmVuZGVyKCksYT1hLm9wdGlvbnMudmVydGljYWxBbGlnbixcImJvdHRvbVwiPT09YT90aGlzLmV4dHJhQm90dG9tTWFyZ2luPSEwOlwibWlkZGxlXCIhPT1hJiYodGhpcy5leHRyYVRvcE1hcmdpbj0hMCkpfSksQShtLFwiZ2V0TWFyZ2luc1wiLGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5yYW5nZVNlbGVjdG9yO2EmJihhPWEuZ2V0SGVpZ2h0KCksdGhpcy5leHRyYVRvcE1hcmdpbiYmKHRoaXMucGxvdFRvcCs9YSksdGhpcy5leHRyYUJvdHRvbU1hcmdpbiYmKHRoaXMubWFyZ2luQm90dG9tKz1hKSl9KSxtLnByb3RvdHlwZS5jYWxsYmFja3MucHVzaChmdW5jdGlvbihhKXtmdW5jdGlvbiBiKCl7Yz1hLnhBeGlzWzBdLmdldEV4dHJlbWVzKCk7cihjLm1pbikmJmUucmVuZGVyKGMubWluLGMubWF4KX12YXIgYyxlPWEucmFuZ2VTZWxlY3RvcixmLGQ7ZSYmKGQ9QShhLnhBeGlzWzBdLFwiYWZ0ZXJTZXRFeHRyZW1lc1wiLFxuZnVuY3Rpb24oYSl7ZS5yZW5kZXIoYS5taW4sYS5tYXgpfSksZj1BKGEsXCJyZWRyYXdcIixiKSxiKCkpO0EoYSxcImRlc3Ryb3lcIixmdW5jdGlvbigpe2UmJihmKCksZCgpKX0pfSksYS5SYW5nZVNlbGVjdG9yPUMpfSk7SShILFwicGFydHMvU3RvY2tDaGFydC5qc1wiLFtIW1wicGFydHMvR2xvYmFscy5qc1wiXV0sZnVuY3Rpb24oYSl7dmFyIEM9YS5hZGRFdmVudCxBPWEuYXJyYXlNYXgsRT1hLmFycmF5TWluLG09YS5BeGlzLGc9YS5DaGFydCx2PWEuZGVmaW5lZCx4PWEuZXh0ZW5kLHk9YS5mb3JtYXQsej1hLmlzTnVtYmVyLG49YS5pc1N0cmluZyxmPWEubWVyZ2UsaD1hLnBpY2sscj1hLlBvaW50LGU9YS5SZW5kZXJlcixiPWEuU2VyaWVzLGw9YS5zcGxhdCxjPWEuU1ZHUmVuZGVyZXIsdD1hLlZNTFJlbmRlcmVyLEY9Yi5wcm90b3R5cGUsdz1GLmluaXQsQj1GLnByb2Nlc3NEYXRhLHA9ci5wcm90b3R5cGUudG9vbHRpcEZvcm1hdHRlcjthLlN0b2NrQ2hhcnQ9YS5zdG9ja0NoYXJ0PWZ1bmN0aW9uKGIsXG5jLGUpe3ZhciBkPW4oYil8fGIubm9kZU5hbWUsaz1hcmd1bWVudHNbZD8xOjBdLG09ayxwPWsuc2VyaWVzLHI9YS5nZXRPcHRpb25zKCksdSx0PWgoay5uYXZpZ2F0b3ImJmsubmF2aWdhdG9yLmVuYWJsZWQsci5uYXZpZ2F0b3IuZW5hYmxlZCwhMCksdj10P3tzdGFydE9uVGljazohMSxlbmRPblRpY2s6ITF9Om51bGw7ay54QXhpcz1sKGsueEF4aXN8fHt9KS5tYXAoZnVuY3Rpb24oYSxiKXtyZXR1cm4gZih7bWluUGFkZGluZzowLG1heFBhZGRpbmc6MCxvdmVyc2Nyb2xsOjAsb3JkaW5hbDohMCx0aXRsZTp7dGV4dDpudWxsfSxsYWJlbHM6e292ZXJmbG93OlwianVzdGlmeVwifSxzaG93TGFzdExhYmVsOiEwfSxyLnhBeGlzLHIueEF4aXMmJnIueEF4aXNbYl0sYSx7dHlwZTpcImRhdGV0aW1lXCIsY2F0ZWdvcmllczpudWxsfSx2KX0pO2sueUF4aXM9bChrLnlBeGlzfHx7fSkubWFwKGZ1bmN0aW9uKGEsYil7dT1oKGEub3Bwb3NpdGUsITApO3JldHVybiBmKHtsYWJlbHM6e3k6LTJ9LG9wcG9zaXRlOnUsXG5zaG93TGFzdExhYmVsOiEoIWEuY2F0ZWdvcmllcyYmXCJjYXRlZ29yeVwiIT09YS50eXBlKSx0aXRsZTp7dGV4dDpudWxsfX0sci55QXhpcyxyLnlBeGlzJiZyLnlBeGlzW2JdLGEpfSk7ay5zZXJpZXM9bnVsbDtrPWYoe2NoYXJ0OntwYW5uaW5nOiEwLHBpbmNoVHlwZTpcInhcIn0sbmF2aWdhdG9yOntlbmFibGVkOnR9LHNjcm9sbGJhcjp7ZW5hYmxlZDpoKHIuc2Nyb2xsYmFyLmVuYWJsZWQsITApfSxyYW5nZVNlbGVjdG9yOntlbmFibGVkOmgoci5yYW5nZVNlbGVjdG9yLmVuYWJsZWQsITApfSx0aXRsZTp7dGV4dDpudWxsfSx0b29sdGlwOntzcGxpdDpoKHIudG9vbHRpcC5zcGxpdCwhMCksY3Jvc3NoYWlyczohMH0sbGVnZW5kOntlbmFibGVkOiExfX0sayx7aXNTdG9jazohMH0pO2suc2VyaWVzPW0uc2VyaWVzPXA7cmV0dXJuIGQ/bmV3IGcoYixrLGUpOm5ldyBnKGssYyl9O0MoYixcInNldE9wdGlvbnNcIixmdW5jdGlvbihiKXtmdW5jdGlvbiBjKGIpe3JldHVybiBhLnNlcmllc1R5cGVzW2JdJiZcbmQgaW5zdGFuY2VvZiBhLnNlcmllc1R5cGVzW2JdfXZhciBkPXRoaXMsZTt0aGlzLmNoYXJ0Lm9wdGlvbnMuaXNTdG9jayYmKGMoXCJjb2x1bW5cIil8fGMoXCJjb2x1bW5yYW5nZVwiKT9lPXtib3JkZXJXaWR0aDowLHNoYWRvdzohMX06IWMoXCJsaW5lXCIpfHxjKFwic2NhdHRlclwiKXx8YyhcInNtYVwiKXx8KGU9e21hcmtlcjp7ZW5hYmxlZDohMSxyYWRpdXM6Mn19KSxlJiYoYi5wbG90T3B0aW9uc1t0aGlzLnR5cGVdPWYoYi5wbG90T3B0aW9uc1t0aGlzLnR5cGVdLGUpKSl9KTtDKG0sXCJhdXRvTGFiZWxBbGlnblwiLGZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuY2hhcnQsYz10aGlzLm9wdGlvbnMsYj1iLl9sYWJlbFBhbmVzPWIuX2xhYmVsUGFuZXN8fHt9LGQ9dGhpcy5vcHRpb25zLmxhYmVsczt0aGlzLmNoYXJ0Lm9wdGlvbnMuaXNTdG9jayYmXCJ5QXhpc1wiPT09dGhpcy5jb2xsJiYoYz1jLnRvcCtcIixcIitjLmhlaWdodCwhYltjXSYmZC5lbmFibGVkJiYoMTU9PT1kLngmJihkLng9MCksdm9pZCAwPT09XG5kLmFsaWduJiYoZC5hbGlnbj1cInJpZ2h0XCIpLGJbY109dGhpcyxhLmFsaWduPVwicmlnaHRcIixhLnByZXZlbnREZWZhdWx0KCkpKX0pO0MobSxcImRlc3Ryb3lcIixmdW5jdGlvbigpe3ZhciBhPXRoaXMuY2hhcnQsYj10aGlzLm9wdGlvbnMmJnRoaXMub3B0aW9ucy50b3ArXCIsXCIrdGhpcy5vcHRpb25zLmhlaWdodDtiJiZhLl9sYWJlbFBhbmVzJiZhLl9sYWJlbFBhbmVzW2JdPT09dGhpcyYmZGVsZXRlIGEuX2xhYmVsUGFuZXNbYl19KTtDKG0sXCJnZXRQbG90TGluZVBhdGhcIixmdW5jdGlvbihiKXtmdW5jdGlvbiBjKGEpe3ZhciBiPVwieEF4aXNcIj09PWE/XCJ5QXhpc1wiOlwieEF4aXNcIjthPWQub3B0aW9uc1tiXTtyZXR1cm4geihhKT9bZltiXVthXV06bihhKT9bZi5nZXQoYSldOmUubWFwKGZ1bmN0aW9uKGEpe3JldHVybiBhW2JdfSl9dmFyIGQ9dGhpcyxlPXRoaXMuaXNMaW5rZWQmJiF0aGlzLnNlcmllcz90aGlzLmxpbmtlZFBhcmVudC5zZXJpZXM6dGhpcy5zZXJpZXMsZj1kLmNoYXJ0LGc9XG5mLnJlbmRlcmVyLGw9ZC5sZWZ0LG09ZC50b3AscCxyLHQsdyx4PVtdLHk9W10sQSxCLEM9Yi50cmFuc2xhdGVkVmFsdWUsRT1iLnZhbHVlLEY9Yi5mb3JjZSxIO2lmKGYub3B0aW9ucy5pc1N0b2NrJiYhMSE9PWIuYWNyb3NzUGFuZXMmJlwieEF4aXNcIj09PWQuY29sbHx8XCJ5QXhpc1wiPT09ZC5jb2xsKWIucHJldmVudERlZmF1bHQoKSx5PWMoZC5jb2xsKSxBPWQuaXNYQXhpcz9mLnlBeGlzOmYueEF4aXMsQS5mb3JFYWNoKGZ1bmN0aW9uKGEpe2lmKHYoYS5vcHRpb25zLmlkKT8tMT09PWEub3B0aW9ucy5pZC5pbmRleE9mKFwibmF2aWdhdG9yXCIpOjEpe3ZhciBiPWEuaXNYQXhpcz9cInlBeGlzXCI6XCJ4QXhpc1wiLGI9dihhLm9wdGlvbnNbYl0pP2ZbYl1bYS5vcHRpb25zW2JdXTpmW2JdWzBdO2Q9PT1iJiZ5LnB1c2goYSl9fSksQj15Lmxlbmd0aD9bXTpbZC5pc1hBeGlzP2YueUF4aXNbMF06Zi54QXhpc1swXV0seS5mb3JFYWNoKGZ1bmN0aW9uKGIpey0xIT09Qi5pbmRleE9mKGIpfHxhLmZpbmQoQixcbmZ1bmN0aW9uKGEpe3JldHVybiBhLnBvcz09PWIucG9zJiZhLmxlbj09PWIubGVufSl8fEIucHVzaChiKX0pLEg9aChDLGQudHJhbnNsYXRlKEUsbnVsbCxudWxsLGIub2xkKSkseihIKSYmKGQuaG9yaXo/Qi5mb3JFYWNoKGZ1bmN0aW9uKGEpe3ZhciBiO3I9YS5wb3M7dz1yK2EubGVuO3A9dD1NYXRoLnJvdW5kKEgrZC50cmFuc0IpO1wicGFzc1wiIT09RiYmKHA8bHx8cD5sK2Qud2lkdGgpJiYoRj9wPXQ9TWF0aC5taW4oTWF0aC5tYXgobCxwKSxsK2Qud2lkdGgpOmI9ITApO2J8fHgucHVzaChcIk1cIixwLHIsXCJMXCIsdCx3KX0pOkIuZm9yRWFjaChmdW5jdGlvbihhKXt2YXIgYjtwPWEucG9zO3Q9cCthLmxlbjtyPXc9TWF0aC5yb3VuZChtK2QuaGVpZ2h0LUgpO1wicGFzc1wiIT09RiYmKHI8bXx8cj5tK2QuaGVpZ2h0KSYmKEY/cj13PU1hdGgubWluKE1hdGgubWF4KG0sciksZC50b3ArZC5oZWlnaHQpOmI9ITApO2J8fHgucHVzaChcIk1cIixwLHIsXCJMXCIsdCx3KX0pKSxiLnBhdGg9MDx4Lmxlbmd0aD9cbmcuY3Jpc3BQb2x5TGluZSh4LGIubGluZVdpZHRofHwxKTpudWxsfSk7Yy5wcm90b3R5cGUuY3Jpc3BQb2x5TGluZT1mdW5jdGlvbihhLGIpe3ZhciBjO2ZvcihjPTA7YzxhLmxlbmd0aDtjKz02KWFbYysxXT09PWFbYys0XSYmKGFbYysxXT1hW2MrNF09TWF0aC5yb3VuZChhW2MrMV0pLWIlMi8yKSxhW2MrMl09PT1hW2MrNV0mJihhW2MrMl09YVtjKzVdPU1hdGgucm91bmQoYVtjKzJdKStiJTIvMik7cmV0dXJuIGF9O2U9PT10JiYodC5wcm90b3R5cGUuY3Jpc3BQb2x5TGluZT1jLnByb3RvdHlwZS5jcmlzcFBvbHlMaW5lKTtDKG0sXCJhZnRlckhpZGVDcm9zc2hhaXJcIixmdW5jdGlvbigpe3RoaXMuY3Jvc3NMYWJlbCYmKHRoaXMuY3Jvc3NMYWJlbD10aGlzLmNyb3NzTGFiZWwuaGlkZSgpKX0pO0MobSxcImFmdGVyRHJhd0Nyb3NzaGFpclwiLGZ1bmN0aW9uKGEpe3ZhciBiLGM7aWYodih0aGlzLmNyb3NzaGFpci5sYWJlbCkmJnRoaXMuY3Jvc3NoYWlyLmxhYmVsLmVuYWJsZWQmJnRoaXMuY3Jvc3Mpe3ZhciBkPVxudGhpcy5jaGFydCxlPXRoaXMub3B0aW9ucy5jcm9zc2hhaXIubGFiZWwsZj10aGlzLmhvcml6O2I9dGhpcy5vcHBvc2l0ZTtjPXRoaXMubGVmdDt2YXIgZz10aGlzLnRvcCxsPXRoaXMuY3Jvc3NMYWJlbCxtPWUuZm9ybWF0LG49XCJcIixwPVwiaW5zaWRlXCI9PT10aGlzLm9wdGlvbnMudGlja1Bvc2l0aW9uLHI9ITEhPT10aGlzLmNyb3NzaGFpci5zbmFwLHQ9MCx3PWEuZXx8dGhpcy5jcm9zcyYmdGhpcy5jcm9zcy5lLHo9YS5wb2ludDthPXRoaXMubGluMmxvZzt2YXIgQSxCO3RoaXMuaXNMb2c/KEE9YSh0aGlzLm1pbiksQj1hKHRoaXMubWF4KSk6KEE9dGhpcy5taW4sQj10aGlzLm1heCk7YT1mP1wiY2VudGVyXCI6Yj9cInJpZ2h0XCI9PT10aGlzLmxhYmVsQWxpZ24/XCJyaWdodFwiOlwibGVmdFwiOlwibGVmdFwiPT09dGhpcy5sYWJlbEFsaWduP1wibGVmdFwiOlwiY2VudGVyXCI7bHx8KGw9dGhpcy5jcm9zc0xhYmVsPWQucmVuZGVyZXIubGFiZWwobnVsbCxudWxsLG51bGwsZS5zaGFwZXx8XCJjYWxsb3V0XCIpLmFkZENsYXNzKFwiaGlnaGNoYXJ0cy1jcm9zc2hhaXItbGFiZWxcIitcbih0aGlzLnNlcmllc1swXSYmXCIgaGlnaGNoYXJ0cy1jb2xvci1cIit0aGlzLnNlcmllc1swXS5jb2xvckluZGV4KSkuYXR0cih7YWxpZ246ZS5hbGlnbnx8YSxwYWRkaW5nOmgoZS5wYWRkaW5nLDgpLHI6aChlLmJvcmRlclJhZGl1cywzKSx6SW5kZXg6Mn0pLmFkZCh0aGlzLmxhYmVsR3JvdXApLGQuc3R5bGVkTW9kZXx8bC5hdHRyKHtmaWxsOmUuYmFja2dyb3VuZENvbG9yfHx0aGlzLnNlcmllc1swXSYmdGhpcy5zZXJpZXNbMF0uY29sb3J8fFwiIzY2NjY2NlwiLHN0cm9rZTplLmJvcmRlckNvbG9yfHxcIlwiLFwic3Ryb2tlLXdpZHRoXCI6ZS5ib3JkZXJXaWR0aHx8MH0pLmNzcyh4KHtjb2xvcjpcIiNmZmZmZmZcIixmb250V2VpZ2h0Olwibm9ybWFsXCIsZm9udFNpemU6XCIxMXB4XCIsdGV4dEFsaWduOlwiY2VudGVyXCJ9LGUuc3R5bGUpKSk7Zj8oYT1yP3oucGxvdFgrYzp3LmNoYXJ0WCxnKz1iPzA6dGhpcy5oZWlnaHQpOihhPWI/dGhpcy53aWR0aCtjOjAsZz1yP3oucGxvdFkrZzp3LmNoYXJ0WSk7bXx8XG5lLmZvcm1hdHRlcnx8KHRoaXMuaXNEYXRldGltZUF4aXMmJihuPVwiJWIgJWQsICVZXCIpLG09XCJ7dmFsdWVcIisobj9cIjpcIituOlwiXCIpK1wifVwiKTtuPXI/elt0aGlzLmlzWEF4aXM/XCJ4XCI6XCJ5XCJdOnRoaXMudG9WYWx1ZShmP3cuY2hhcnRYOncuY2hhcnRZKTtsLmF0dHIoe3RleHQ6bT95KG0se3ZhbHVlOm59LGQudGltZSk6ZS5mb3JtYXR0ZXIuY2FsbCh0aGlzLG4pLHg6YSx5OmcsdmlzaWJpbGl0eTpuPEF8fG4+Qj9cImhpZGRlblwiOlwidmlzaWJsZVwifSk7ZT1sLmdldEJCb3goKTtpZihmKXtpZihwJiYhYnx8IXAmJmIpZz1sLnktZS5oZWlnaHR9ZWxzZSBnPWwueS1lLmhlaWdodC8yO2Y/KGI9Yy1lLngsYz1jK3RoaXMud2lkdGgtZS54KTooYj1cImxlZnRcIj09PXRoaXMubGFiZWxBbGlnbj9jOjAsYz1cInJpZ2h0XCI9PT10aGlzLmxhYmVsQWxpZ24/Yyt0aGlzLndpZHRoOmQuY2hhcnRXaWR0aCk7bC50cmFuc2xhdGVYPGImJih0PWItbC50cmFuc2xhdGVYKTtsLnRyYW5zbGF0ZVgrZS53aWR0aD49XG5jJiYodD0tKGwudHJhbnNsYXRlWCtlLndpZHRoLWMpKTtsLmF0dHIoe3g6YSt0LHk6ZyxhbmNob3JYOmY/YTp0aGlzLm9wcG9zaXRlPzA6ZC5jaGFydFdpZHRoLGFuY2hvclk6Zj90aGlzLm9wcG9zaXRlP2QuY2hhcnRIZWlnaHQ6MDpnK2UuaGVpZ2h0LzJ9KX19KTtGLmluaXQ9ZnVuY3Rpb24oKXt3LmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLnNldENvbXBhcmUodGhpcy5vcHRpb25zLmNvbXBhcmUpfTtGLnNldENvbXBhcmU9ZnVuY3Rpb24oYSl7dGhpcy5tb2RpZnlWYWx1ZT1cInZhbHVlXCI9PT1hfHxcInBlcmNlbnRcIj09PWE/ZnVuY3Rpb24oYixjKXt2YXIgZD10aGlzLmNvbXBhcmVWYWx1ZTtpZih2b2lkIDAhPT1iJiZ2b2lkIDAhPT1kKXJldHVybiBiPVwidmFsdWVcIj09PWE/Yi1kOmIvZCoxMDAtKDEwMD09PXRoaXMub3B0aW9ucy5jb21wYXJlQmFzZT8wOjEwMCksYyYmKGMuY2hhbmdlPWIpLGJ9Om51bGw7dGhpcy51c2VyT3B0aW9ucy5jb21wYXJlPWE7dGhpcy5jaGFydC5oYXNSZW5kZXJlZCYmXG4odGhpcy5pc0RpcnR5PSEwKX07Ri5wcm9jZXNzRGF0YT1mdW5jdGlvbigpe3ZhciBhLGI9LTEsYyxlLGY9ITA9PT10aGlzLm9wdGlvbnMuY29tcGFyZVN0YXJ0PzA6MSxnLGg7Qi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7aWYodGhpcy54QXhpcyYmdGhpcy5wcm9jZXNzZWRZRGF0YSlmb3IoYz10aGlzLnByb2Nlc3NlZFhEYXRhLGU9dGhpcy5wcm9jZXNzZWRZRGF0YSxnPWUubGVuZ3RoLHRoaXMucG9pbnRBcnJheU1hcCYmKGI9dGhpcy5wb2ludEFycmF5TWFwLmluZGV4T2YodGhpcy5vcHRpb25zLnBvaW50VmFsS2V5fHx0aGlzLnBvaW50VmFsS2V5fHxcInlcIikpLGE9MDthPGctZjthKyspaWYoaD1lW2FdJiYtMTxiP2VbYV1bYl06ZVthXSx6KGgpJiZjW2ErZl0+PXRoaXMueEF4aXMubWluJiYwIT09aCl7dGhpcy5jb21wYXJlVmFsdWU9aDticmVha319O0MoYixcImFmdGVyR2V0RXh0cmVtZXNcIixmdW5jdGlvbigpe2lmKHRoaXMubW9kaWZ5VmFsdWUpe3ZhciBhPVt0aGlzLm1vZGlmeVZhbHVlKHRoaXMuZGF0YU1pbiksXG50aGlzLm1vZGlmeVZhbHVlKHRoaXMuZGF0YU1heCldO3RoaXMuZGF0YU1pbj1FKGEpO3RoaXMuZGF0YU1heD1BKGEpfX0pO20ucHJvdG90eXBlLnNldENvbXBhcmU9ZnVuY3Rpb24oYSxiKXt0aGlzLmlzWEF4aXN8fCh0aGlzLnNlcmllcy5mb3JFYWNoKGZ1bmN0aW9uKGIpe2Iuc2V0Q29tcGFyZShhKX0pLGgoYiwhMCkmJnRoaXMuY2hhcnQucmVkcmF3KCkpfTtyLnByb3RvdHlwZS50b29sdGlwRm9ybWF0dGVyPWZ1bmN0aW9uKGIpe2I9Yi5yZXBsYWNlKFwie3BvaW50LmNoYW5nZX1cIiwoMDx0aGlzLmNoYW5nZT9cIitcIjpcIlwiKSthLm51bWJlckZvcm1hdCh0aGlzLmNoYW5nZSxoKHRoaXMuc2VyaWVzLnRvb2x0aXBPcHRpb25zLmNoYW5nZURlY2ltYWxzLDIpKSk7cmV0dXJuIHAuYXBwbHkodGhpcyxbYl0pfTtDKGIsXCJyZW5kZXJcIixmdW5jdGlvbigpe3ZhciBhO3RoaXMuY2hhcnQuaXMzZCYmdGhpcy5jaGFydC5pczNkKCl8fHRoaXMuY2hhcnQucG9sYXJ8fCF0aGlzLnhBeGlzfHx0aGlzLnhBeGlzLmlzUmFkaWFsfHxcbihhPXRoaXMueUF4aXMubGVuLSh0aGlzLnhBeGlzLmF4aXNMaW5lP01hdGguZmxvb3IodGhpcy54QXhpcy5heGlzTGluZS5zdHJva2VXaWR0aCgpLzIpOjApLCF0aGlzLmNsaXBCb3gmJnRoaXMuYW5pbWF0ZT8odGhpcy5jbGlwQm94PWYodGhpcy5jaGFydC5jbGlwQm94KSx0aGlzLmNsaXBCb3gud2lkdGg9dGhpcy54QXhpcy5sZW4sdGhpcy5jbGlwQm94LmhlaWdodD1hKTp0aGlzLmNoYXJ0W3RoaXMuc2hhcmVkQ2xpcEtleV0mJih0aGlzLmNoYXJ0W3RoaXMuc2hhcmVkQ2xpcEtleV0uYW5pbWF0ZSh7d2lkdGg6dGhpcy54QXhpcy5sZW4saGVpZ2h0OmF9KSx0aGlzLmNoYXJ0W3RoaXMuc2hhcmVkQ2xpcEtleStcIm1cIl0mJnRoaXMuY2hhcnRbdGhpcy5zaGFyZWRDbGlwS2V5K1wibVwiXS5hbmltYXRlKHt3aWR0aDp0aGlzLnhBeGlzLmxlbn0pKSl9KTtDKGcsXCJ1cGRhdGVcIixmdW5jdGlvbihhKXthPWEub3B0aW9ucztcInNjcm9sbGJhclwiaW4gYSYmdGhpcy5uYXZpZ2F0b3ImJihmKCEwLHRoaXMub3B0aW9ucy5zY3JvbGxiYXIsXG5hLnNjcm9sbGJhciksdGhpcy5uYXZpZ2F0b3IudXBkYXRlKHt9LCExKSxkZWxldGUgYS5zY3JvbGxiYXIpfSl9KTtJKEgsXCJtYXN0ZXJzL21vZHVsZXMvc3RvY2suc3JjLmpzXCIsW10sZnVuY3Rpb24oKXt9KTtJKEgsXCJtYXN0ZXJzL2hpZ2hzdG9jay5zcmMuanNcIixbSFtcIm1hc3RlcnMvaGlnaGNoYXJ0cy5zcmMuanNcIl1dLGZ1bmN0aW9uKGEpe3JldHVybiBhfSk7SFtcIm1hc3RlcnMvaGlnaHN0b2NrLnNyYy5qc1wiXS5fbW9kdWxlcz1IO3JldHVybiBIW1wibWFzdGVycy9oaWdoc3RvY2suc3JjLmpzXCJdfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1oaWdoc3RvY2suanMubWFwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/highcharts/highstock.js\n");
/***/ })
}]);