<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array"/>
  <modified type="array">
    <modified>
      <diff>@@ -1,7 +1,7 @@
 /*
- * Raphael 1.0 - JavaScript Vector Library
+ * Raphael 1.1 - JavaScript Vector Library
  *
  * Copyright (c) 2008 - 2009 Dmitry Baranovskiy (http://raphaeljs.com)
  * Licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) license.
  */
-window.Raphael=(function(){var ac=/[, ]+/,g=document,P=window,U={was:&quot;Raphael&quot; in window,is:window.Raphael},f=function(){if(f.is(arguments[0],&quot;array&quot;)){var e=arguments[0],R=m[h](f,e.splice(0,3+f.is(e[0],&quot;number&quot;))),af=R.set();for(var ae=0,ag=e[C];ae&lt;ag;ae++){var ad=e[ae]||{};ad.type in {circle:1,rect:1,path:1,ellipse:1,text:1,image:1}&amp;&amp;af.push(R[ad.type]().attr(ad));}return af;}return m[h](f,arguments);},b={},t={&quot;clip-rect&quot;:&quot;0 0 10e9 10e9&quot;,cx:0,cy:0,fill:&quot;#fff&quot;,&quot;fill-opacity&quot;:1,font:'10px &quot;Arial&quot;',&quot;font-family&quot;:'&quot;Arial&quot;',&quot;font-size&quot;:&quot;10&quot;,&quot;font-style&quot;:&quot;normal&quot;,&quot;font-weight&quot;:400,gradient:0,height:0,href:&quot;http://raphaeljs.com/&quot;,opacity:1,path:&quot;M0,0&quot;,r:0,rotation:0,rx:0,ry:0,scale:&quot;1 1&quot;,src:&quot;&quot;,stroke:&quot;#000&quot;,&quot;stroke-dasharray&quot;:&quot;&quot;,&quot;stroke-linecap&quot;:&quot;butt&quot;,&quot;stroke-linejoin&quot;:&quot;butt&quot;,&quot;stroke-miterlimit&quot;:0,&quot;stroke-opacity&quot;:1,&quot;stroke-width&quot;:1,target:&quot;_blank&quot;,&quot;text-anchor&quot;:&quot;middle&quot;,title:&quot;Raphael&quot;,translation:&quot;0 0&quot;,width:0,x:0,y:0},x={&quot;clip-rect&quot;:&quot;csv&quot;,cx:&quot;number&quot;,cy:&quot;number&quot;,fill:&quot;colour&quot;,&quot;fill-opacity&quot;:&quot;number&quot;,&quot;font-size&quot;:&quot;number&quot;,height:&quot;number&quot;,opacity:&quot;number&quot;,path:&quot;path&quot;,r:&quot;number&quot;,rotation:&quot;csv&quot;,rx:&quot;number&quot;,ry:&quot;number&quot;,scale:&quot;csv&quot;,stroke:&quot;colour&quot;,&quot;stroke-opacity&quot;:&quot;number&quot;,&quot;stroke-width&quot;:&quot;number&quot;,translation:&quot;csv&quot;,width:&quot;number&quot;,x:&quot;number&quot;,y:&quot;number&quot;},y=[&quot;click&quot;,&quot;dblclick&quot;,&quot;mousedown&quot;,&quot;mousemove&quot;,&quot;mouseout&quot;,&quot;mouseover&quot;,&quot;mouseup&quot;],o=&quot;prototype&quot;,h=&quot;apply&quot;,C=&quot;length&quot;,s=&quot;parseFloat&quot;,r=&quot;parseInt&quot;;f.version=&quot;1.0&quot;;f.type=(window.SVGAngle||document.implementation.hasFeature(&quot;http://www.w3.org/TR/SVG11/feature#BasicStructure&quot;,&quot;1.1&quot;)?&quot;SVG&quot;:&quot;VML&quot;);f.svg=!(f.vml=f.type==&quot;VML&quot;);f.idGenerator=0;f.fn={};f.is=function(i,e){e=(e+&quot;&quot;).toLowerCase();if((e==&quot;object&quot;||e==&quot;undefined&quot;)&amp;&amp;typeof i==e){return true;}if(i==null&amp;&amp;e==&quot;null&quot;){return true;}return Object[o].toString.call(i).replace(/^\[object\s+|\]$/gi,&quot;&quot;).toLowerCase()==e;};f.setWindow=function(e){P=e;g=P.document;};f.hsb2rgb=ab(function(aj,ah,an){if(f.is(aj,&quot;object&quot;)&amp;&amp;&quot;h&quot; in aj&amp;&amp;&quot;s&quot; in aj&amp;&amp;&quot;b&quot; in aj){an=aj.b;ah=aj.s;aj=aj.h;}var ae,af,ao;if(an==0){return{r:0,g:0,b:0,hex:&quot;#000&quot;};}if(aj&gt;1||ah&gt;1||an&gt;1){aj/=255;ah/=255;an/=255;}var ag=Math.floor(aj*6),ak=(aj*6)-ag,ad=an*(1-ah),R=an*(1-(ah*ak)),ap=an*(1-(ah*(1-ak)));ae=[an,R,ad,ad,ap,an,an][ag];af=[ap,an,an,R,ad,ad,ap][ag];ao=[ad,ad,ap,an,an,R,ad][ag];ae*=255;af*=255;ao*=255;var al={r:ae,g:af,b:ao},e=(~~ae).toString(16),ai=(~~af).toString(16),am=(~~ao).toString(16);if(e[C]==1){e=&quot;0&quot;+e;}if(ai[C]==1){ai=&quot;0&quot;+ai;}if(am[C]==1){am=&quot;0&quot;+am;}al.hex=&quot;#&quot;+e+ai+am;return al;},f);f.rgb2hsb=ab(function(e,i,ah){if(f.is(e,&quot;object&quot;)&amp;&amp;&quot;r&quot; in e&amp;&amp;&quot;g&quot; in e&amp;&amp;&quot;b&quot; in e){ah=e.b;i=e.g;e=e.r;}if(f.is(e,&quot;string&quot;)){var aj=f.getRGB(e);e=aj.r;i=aj.g;ah=aj.b;}if(e&gt;1||i&gt;1||ah&gt;1){e/=255;i/=255;ah/=255;}var ag=Math.max(e,i,ah),R=Math.min(e,i,ah),ae,ad,af=ag;if(R==ag){return{h:0,s:0,b:ag};}else{var ai=(ag-R);ad=ai/ag;if(e==ag){ae=(i-ah)/ai;}else{if(i==ag){ae=2+((ah-e)/ai);}else{ae=4+((e-i)/ai);}}ae/=6;if(ae&lt;0){ae+=1;}if(ae&gt;1){ae-=1;}}return{h:ae,s:ad,b:af};},f);f._path2string=function(){var ad=&quot;&quot;,ag;for(var R=0,ae=this[C];R&lt;ae;R++){for(var e=0,af=this[R][C];e&lt;af;e++){ad+=this[R][e];e&amp;&amp;e!=af-1&amp;&amp;(ad+=&quot;,&quot;);}R!=ae-1&amp;&amp;(ad+=&quot;\n&quot;);}return ad.replace(/,(?=-)/g,&quot;&quot;);};function ab(ad,i,e){function R(){var ae=Array[o].splice.call(arguments,0,arguments[C]),af=ae.join(&quot;\u25ba&quot;);R.cache=R.cache||{};R.count=R.count||[];if(af in R.cache){return e?e(R.cache[af]):R.cache[af];}if(R.count[C]&gt;1000){delete R.cache[R.count.unshift()];}R.count.push(af);R.cache[af]=ad[h](i,ae);return e?e(R.cache[af]):R.cache[af];}return R;}f.getRGB=ab(function(e){var al={none:&quot;none&quot;,aliceblue:&quot;#f0f8ff&quot;,amethyst:&quot;#96c&quot;,antiquewhite:&quot;#faebd7&quot;,aqua:&quot;#0ff&quot;,aquamarine:&quot;#7fffd4&quot;,azure:&quot;#f0ffff&quot;,beige:&quot;#f5f5dc&quot;,bisque:&quot;#ffe4c4&quot;,black:&quot;#000&quot;,blanchedalmond:&quot;#ffebcd&quot;,blue:&quot;#00f&quot;,blueviolet:&quot;#8a2be2&quot;,brown:&quot;#a52a2a&quot;,burlywood:&quot;#deb887&quot;,cadetblue:&quot;#5f9ea0&quot;,chartreuse:&quot;#7fff00&quot;,chocolate:&quot;#d2691e&quot;,coral:&quot;#ff7f50&quot;,cornflowerblue:&quot;#6495ed&quot;,cornsilk:&quot;#fff8dc&quot;,crimson:&quot;#dc143c&quot;,cyan:&quot;#0ff&quot;,darkblue:&quot;#00008b&quot;,darkcyan:&quot;#008b8b&quot;,darkgoldenrod:&quot;#b8860b&quot;,darkgray:&quot;#a9a9a9&quot;,darkgreen:&quot;#006400&quot;,darkkhaki:&quot;#bdb76b&quot;,darkmagenta:&quot;#8b008b&quot;,darkolivegreen:&quot;#556b2f&quot;,darkorange:&quot;#ff8c00&quot;,darkorchid:&quot;#9932cc&quot;,darkred:&quot;#8b0000&quot;,darksalmon:&quot;#e9967a&quot;,darkseagreen:&quot;#8fbc8f&quot;,darkslateblue:&quot;#483d8b&quot;,darkslategray:&quot;#2f4f4f&quot;,darkturquoise:&quot;#00ced1&quot;,darkviolet:&quot;#9400d3&quot;,deeppink:&quot;#ff1493&quot;,deepskyblue:&quot;#00bfff&quot;,dimgray:&quot;#696969&quot;,dodgerblue:&quot;#1e90ff&quot;,firebrick:&quot;#b22222&quot;,floralwhite:&quot;#fffaf0&quot;,forestgreen:&quot;#228b22&quot;,fuchsia:&quot;#f0f&quot;,gainsboro:&quot;#dcdcdc&quot;,ghostwhite:&quot;#f8f8ff&quot;,gold:&quot;#ffd700&quot;,goldenrod:&quot;#daa520&quot;,gray:&quot;#808080&quot;,green:&quot;#008000&quot;,greenyellow:&quot;#adff2f&quot;,honeydew:&quot;#f0fff0&quot;,hotpink:&quot;#ff69b4&quot;,indianred:&quot;#cd5c5c&quot;,indigo:&quot;#4b0082&quot;,ivory:&quot;#fffff0&quot;,khaki:&quot;#f0e68c&quot;,lavender:&quot;#e6e6fa&quot;,lavenderblush:&quot;#fff0f5&quot;,lawngreen:&quot;#7cfc00&quot;,lemonchiffon:&quot;#fffacd&quot;,lightblue:&quot;#add8e6&quot;,lightcoral:&quot;#f08080&quot;,lightcyan:&quot;#e0ffff&quot;,lightgoldenrodyellow:&quot;#fafad2&quot;,lightgreen:&quot;#90ee90&quot;,lightgrey:&quot;#d3d3d3&quot;,lightpink:&quot;#ffb6c1&quot;,lightsalmon:&quot;#ffa07a&quot;,lightsalmon:&quot;#ffa07a&quot;,lightseagreen:&quot;#20b2aa&quot;,lightskyblue:&quot;#87cefa&quot;,lightslategray:&quot;#789&quot;,lightsteelblue:&quot;#b0c4de&quot;,lightyellow:&quot;#ffffe0&quot;,lime:&quot;#0f0&quot;,limegreen:&quot;#32cd32&quot;,linen:&quot;#faf0e6&quot;,magenta:&quot;#f0f&quot;,maroon:&quot;#800000&quot;,mediumaquamarine:&quot;#66cdaa&quot;,mediumblue:&quot;#0000cd&quot;,mediumorchid:&quot;#ba55d3&quot;,mediumpurple:&quot;#9370db&quot;,mediumseagreen:&quot;#3cb371&quot;,mediumslateblue:&quot;#7b68ee&quot;,mediumslateblue:&quot;#7b68ee&quot;,mediumspringgreen:&quot;#00fa9a&quot;,mediumturquoise:&quot;#48d1cc&quot;,mediumvioletred:&quot;#c71585&quot;,midnightblue:&quot;#191970&quot;,mintcream:&quot;#f5fffa&quot;,mistyrose:&quot;#ffe4e1&quot;,moccasin:&quot;#ffe4b5&quot;,navajowhite:&quot;#ffdead&quot;,navy:&quot;#000080&quot;,oldlace:&quot;#fdf5e6&quot;,olive:&quot;#808000&quot;,olivedrab:&quot;#6b8e23&quot;,orange:&quot;#ffa500&quot;,orangered:&quot;#ff4500&quot;,orchid:&quot;#da70d6&quot;,palegoldenrod:&quot;#eee8aa&quot;,palegreen:&quot;#98fb98&quot;,paleturquoise:&quot;#afeeee&quot;,palevioletred:&quot;#db7093&quot;,papayawhip:&quot;#ffefd5&quot;,peachpuff:&quot;#ffdab9&quot;,peru:&quot;#cd853f&quot;,pink:&quot;#ffc0cb&quot;,plum:&quot;#dda0dd&quot;,powderblue:&quot;#b0e0e6&quot;,purple:&quot;#800080&quot;,red:&quot;#f00&quot;,rosybrown:&quot;#bc8f8f&quot;,royalblue:&quot;#4169e1&quot;,saddlebrown:&quot;#8b4513&quot;,salmon:&quot;#fa8072&quot;,sandybrown:&quot;#f4a460&quot;,seagreen:&quot;#2e8b57&quot;,seashell:&quot;#fff5ee&quot;,sienna:&quot;#a0522d&quot;,silver:&quot;#c0c0c0&quot;,skyblue:&quot;#87ceeb&quot;,slateblue:&quot;#6a5acd&quot;,slategray:&quot;#708090&quot;,snow:&quot;#fffafa&quot;,springgreen:&quot;#00ff7f&quot;,steelblue:&quot;#4682b4&quot;,tan:&quot;#d2b48c&quot;,teal:&quot;#008080&quot;,thistle:&quot;#d8bfd8&quot;,tomato:&quot;#ff6347&quot;,turquoise:&quot;#40e0d0&quot;,violet:&quot;#ee82ee&quot;,wheat:&quot;#f5deb3&quot;,white:&quot;#fff&quot;,whitesmoke:&quot;#f5f5f5&quot;,yellow:&quot;#ff0&quot;,yellowgreen:&quot;#9acd32&quot;},ag;e=al[(e+&quot;&quot;).toLowerCase()]||e;if(!e){return{r:-1,g:-1,b:-1,hex:&quot;none&quot;,error:1};}if(e==&quot;none&quot;){return{r:-1,g:-1,b:-1,hex:&quot;none&quot;};}var R,ad,aj,ah=(e+&quot;&quot;).match(/^\s*((#[a-f\d]{6})|(#[a-f\d]{3})|rgb\(\s*([\d\.]+\s*,\s*[\d\.]+\s*,\s*[\d\.]+)\s*\)|rgb\(\s*([\d\.]+%\s*,\s*[\d\.]+%\s*,\s*[\d\.]+%)\s*\)|hs[bl]\(\s*([\d\.]+\s*,\s*[\d\.]+\s*,\s*[\d\.]+)\s*\)|hs[bl]\(\s*([\d\.]+%\s*,\s*[\d\.]+%\s*,\s*[\d\.]+%)\s*\))\s*$/i);if(ah){if(ah[2]){aj=P[r](ah[2].substring(5),16);ad=P[r](ah[2].substring(3,5),16);R=P[r](ah[2].substring(1,3),16);}if(ah[3]){aj=P[r](ah[3].substring(3)+ah[3].substring(3),16);ad=P[r](ah[3].substring(2,3)+ah[3].substring(2,3),16);R=P[r](ah[3].substring(1,2)+ah[3].substring(1,2),16);}if(ah[4]){ah=ah[4].split(/\s*,\s*/);R=P[s](ah[0]);ad=P[s](ah[1]);aj=P[s](ah[2]);}if(ah[5]){ah=ah[5].split(/\s*,\s*/);R=P[s](ah[0])*2.55;ad=P[s](ah[1])*2.55;aj=P[s](ah[2])*2.55;}if(ah[6]){ah=ah[6].split(/\s*,\s*/);R=P[s](ah[0]);ad=P[s](ah[1]);aj=P[s](ah[2]);return f.hsb2rgb(R,ad,aj);}if(ah[7]){ah=ah[7].split(/\s*,\s*/);R=P[s](ah[0])*2.55;ad=P[s](ah[1])*2.55;aj=P[s](ah[2])*2.55;return f.hsb2rgb(R,ad,aj);}ah={r:R,g:ad,b:aj};var i=(~~R).toString(16),af=(~~ad).toString(16),ai=(~~aj).toString(16),ak=/^(?=\d$)/,ae=&quot;replace&quot;;i=i[ae](ak,&quot;0&quot;);af=af[ae](ak,&quot;0&quot;);ai=ai[ae](ak,&quot;0&quot;);ah.hex=&quot;#&quot;+i+af+ai;ag=ah;}else{ag={r:-1,g:-1,b:-1,hex:&quot;none&quot;,error:1};}return ag;},f);f.getColor=function(i){var R=this.getColor.start=this.getColor.start||{h:0,s:1,b:i||0.75},e=this.hsb2rgb(R.h,R.s,R.b);R.h+=0.075;if(R.h&gt;1){R.h=0;R.s-=0.2;if(R.s&lt;=0){this.getColor.start={h:0,s:1,b:R.b};}}return e.hex;};f.getColor.reset=function(){delete this.start;};f.parsePathString=ab(function(e){if(!e){return null;}var R={a:7,c:6,h:1,l:2,m:2,q:4,s:4,t:2,v:1,z:0},i=[];if(f.is(e,&quot;array&quot;)&amp;&amp;f.is(e[0],&quot;array&quot;)){i=w(e);}if(!i[C]){(e+&quot;&quot;).replace(/([achlmqstvz])[\s,]*((-?\d*\.?\d*(?:e[-+]?\d+)?\s*,?\s*)+)/ig,function(ae,ad,ah){var ag=[],af=ad.toLowerCase();ah.replace(/(-?\d*\.?\d*(?:e[-+]?\d+)?)\s*,?\s*/ig,function(aj,ai){ai&amp;&amp;ag.push(+ai);});while(ag[C]&gt;=R[af]){i.push([ad].concat(ag.splice(0,R[af])));if(!R[af]){break;}}});}i.toString=f._path2string;return i;});var H=ab(function(ak){if(!ak){return{x:0,y:0,width:0,height:0};}ak=T(ak);var ah=0,ag=0,ad=[],R=[];for(var ae=0,aj=ak[C];ae&lt;aj;ae++){if(ak[ae][0]==&quot;M&quot;){ah=ak[ae][1];ag=ak[ae][2];ad.push(ah);R.push(ag);}else{var af=N(ah,ag,ak[ae][1],ak[ae][2],ak[ae][3],ak[ae][4],ak[ae][5],ak[ae][6]);ad=ad.concat(af.min.x,af.max.x);R=R.concat(af.min.y,af.max.y);}}var e=Math.min[h](0,ad),ai=Math.min[h](0,R);return{x:e,y:ai,width:Math.max[h](0,ad)-e,height:Math.max[h](0,R)-ai};}),w=function(ag){var ad=[];if(!f.is(ag,&quot;array&quot;)||!f.is(ag&amp;&amp;ag[0],&quot;array&quot;)){ag=f.parsePathString(ag);}for(var R=0,ae=ag[C];R&lt;ae;R++){ad[R]=[];for(var e=0,af=ag[R][C];e&lt;af;e++){ad[R][e]=ag[R][e];}}ad.toString=f._path2string;return ad;},c=ab(function(ae){if(!f.is(ae,&quot;array&quot;)||!f.is(ae&amp;&amp;ae[0],&quot;array&quot;)){ae=f.parsePathString(ae);}var ak=[],am=0,al=0,ap=0,ao=0,ad=0;if(ae[0][0]==&quot;M&quot;){am=ae[0][1];al=ae[0][2];ap=am;ao=al;ad++;ak.push([&quot;M&quot;,am,al]);}for(var ah=ad,aq=ae[C];ah&lt;aq;ah++){var e=ak[ah]=[],an=ae[ah];if(an[0]!=an[0].toLowerCase()){e[0]=an[0].toLowerCase();switch(e[0]){case&quot;a&quot;:e[1]=an[1];e[2]=an[2];e[3]=an[3];e[4]=an[4];e[5]=an[5];e[6]=+(an[6]-am).toFixed(3);e[7]=+(an[7]-al).toFixed(3);break;case&quot;v&quot;:e[1]=+(an[1]-al).toFixed(3);break;case&quot;m&quot;:ap=an[1];ao=an[2];default:for(var ag=1,ai=an[C];ag&lt;ai;ag++){e[ag]=+(an[ag]-((ag%2)?am:al)).toFixed(3);}}}else{e=ak[ah]=[];if(an[0]==&quot;m&quot;){ap=an[1]+am;ao=an[2]+al;}for(var af=0,R=an[C];af&lt;R;af++){ak[ah][af]=an[af];}}var aj=ak[ah][C];switch(ak[ah][0]){case&quot;z&quot;:am=ap;al=ao;break;case&quot;h&quot;:am+=+ak[ah][aj-1];break;case&quot;v&quot;:al+=+ak[ah][aj-1];break;default:am+=+ak[ah][aj-2];al+=+ak[ah][aj-1];}}ak.toString=f._path2string;return ak;},0,w),z=ab(function(ae){if(!f.is(ae,&quot;array&quot;)||!f.is(ae&amp;&amp;ae[0],&quot;array&quot;)){ae=f.parsePathString(ae);}var aj=[],al=0,ak=0,ao=0,an=0,ad=0;if(ae[0][0]==&quot;M&quot;){al=+ae[0][1];ak=+ae[0][2];ao=al;an=ak;ad++;aj[0]=[&quot;M&quot;,al,ak];}for(var ah=ad,ap=ae[C];ah&lt;ap;ah++){var e=aj[ah]=[],am=ae[ah];if(am[0]!=(am[0]+&quot;&quot;).toUpperCase()){e[0]=(am[0]+&quot;&quot;).toUpperCase();switch(e[0]){case&quot;A&quot;:e[1]=am[1];e[2]=am[2];e[3]=am[3];e[4]=am[4];e[5]=am[5];e[6]=+(am[6]+al);e[7]=+(am[7]+ak);break;case&quot;V&quot;:e[1]=+am[1]+ak;break;case&quot;H&quot;:e[1]=+am[1]+al;break;case&quot;M&quot;:ao=+am[1]+al;an=+am[2]+ak;default:for(var ag=1,ai=am[C];ag&lt;ai;ag++){e[ag]=+am[ag]+((ag%2)?al:ak);}}}else{for(var af=0,R=am[C];af&lt;R;af++){aj[ah][af]=am[af];}}switch(e[0]){case&quot;Z&quot;:al=ao;ak=an;break;case&quot;H&quot;:al=e[1];break;case&quot;V&quot;:ak=e[1];break;default:al=aj[ah][aj[ah][C]-2];ak=aj[ah][aj[ah][C]-1];}}aj.toString=f._path2string;return aj;},null,w),d=function(i,ad,e,R){return[i,ad,e,R,e,R];},A=function(i,ad,ag,ae,e,R){var af=1/3,ah=2/3;return[af*i+ah*ag,af*ad+ah*ae,af*e+ah*ag,af*R+ah*ae,e,R];},u=function(ap,aU,az,ax,aq,ak,af,ao,aT,ar){var ae=Math.PI,aw=ae*120/180,e=ae/180*(+aq||0),aD=[],aA,aQ=ab(function(aV,aY,i){var aX=aV*Math.cos(i)-aY*Math.sin(i),aW=aV*Math.sin(i)+aY*Math.cos(i);return{x:aX,y:aW};});if(!ar){aA=aQ(ap,aU,-e);ap=aA.x;aU=aA.y;aA=aQ(ao,aT,-e);ao=aA.x;aT=aA.y;var R=Math.cos(ae/180*aq),am=Math.sin(ae/180*aq),aF=(ap-ao)/2,aE=(aU-aT)/2;az=Math.max(az,Math.abs(aF));ax=Math.max(ax,Math.abs(aE));var ad=az*az,aI=ax*ax,aK=(ak==af?-1:1)*Math.sqrt(Math.abs((ad*aI-ad*aE*aE-aI*aF*aF)/(ad*aE*aE+aI*aF*aF))),au=aK*az*aE/ax+(ap+ao)/2,at=aK*-ax*aF/az+(aU+aT)/2,aj=Math.asin((aU-at)/ax),ai=Math.asin((aT-at)/ax);aj=ap&lt;au?ae-aj:aj;ai=ao&lt;au?ae-ai:ai;aj&lt;0&amp;&amp;(aj=ae*2+aj);ai&lt;0&amp;&amp;(ai=ae*2+ai);if(af&amp;&amp;aj&gt;ai){aj=aj-ae*2;}if(!af&amp;&amp;ai&gt;aj){ai=ai-ae*2;}}else{aj=ar[0];ai=ar[1];au=ar[2];at=ar[3];}var an=ai-aj;if(Math.abs(an)&gt;aw){var av=ai,ay=ao,al=aT;ai=aj+aw*(af&amp;&amp;ai&gt;aj?1:-1);ao=au+az*Math.cos(ai);aT=at+ax*Math.sin(ai);aD=u(ao,aT,az,ax,aq,0,af,ay,al,[ai,av,au,at]);}an=ai-aj;var ah=Math.cos(aj),aS=Math.sin(aj),ag=Math.cos(ai),aR=Math.sin(ai),aG=Math.tan(an/4),aJ=4/3*az*aG,aH=4/3*ax*aG,aP=[ap,aU],aO=[ap+aJ*aS,aU-aH*ah],aN=[ao+aJ*aR,aT-aH*ag],aL=[ao,aT];aO[0]=2*aP[0]-aO[0];aO[1]=2*aP[1]-aO[1];if(ar){return[aO,aN,aL].concat(aD);}else{aD=[aO,aN,aL].concat(aD).join(&quot;,&quot;).split(&quot;,&quot;);var aB=[];for(var aM=0,aC=aD[C];aM&lt;aC;aM++){aB[aM]=aM%2?aQ(aD[aM-1],aD[aM],e).y:aQ(aD[aM],aD[aM+1],e).x;}return aB;}},E=ab(function(i,e,at,aq,af,ae,ah,ag,am){var ak=Math.pow(1-am,3)*i+Math.pow(1-am,2)*3*am*at+(1-am)*3*am*am*af+Math.pow(am,3)*ah,ai=Math.pow(1-am,3)*e+Math.pow(1-am,2)*3*am*aq+(1-am)*3*am*am*ae+Math.pow(am,3)*ag,ao=i+2*am*(at-i)+am*am*(af-2*at+i),an=e+2*am*(aq-e)+am*am*(ae-2*aq+e),ar=at+2*am*(af-at)+am*am*(ah-2*af+at),ap=aq+2*am*(ae-aq)+am*am*(ag-2*ae+aq),al=(1-am)*i+am*at,aj=(1-am)*e+am*aq,ad=(1-am)*af+am*ah,R=(1-am)*ae+am*ag;return{x:ak,y:ai,m:{x:ao,y:an},n:{x:ar,y:ap},start:{x:al,y:aj},end:{x:ad,y:R}};}),N=ab(function(i,e,ad,R,aq,ap,am,aj){var ao=(aq-2*ad+i)-(am-2*aq+ad),al=2*(ad-i)-2*(aq-ad),ai=i-ad,ag=(-al+Math.sqrt(al*al-4*ao*ai))/2/ao,ae=(-al-Math.sqrt(al*al-4*ao*ai))/2/ao,ak=[e,aj],an=[i,am],ah=E(i,e,ad,R,aq,ap,am,aj,ag&gt;0&amp;&amp;ag&lt;1?ag:0),af=E(i,e,ad,R,aq,ap,am,aj,ae&gt;0&amp;&amp;ae&lt;1?ae:0);an=an.concat(ah.x,af.x);ak=ak.concat(ah.y,af.y);ao=(ap-2*R+e)-(aj-2*ap+R);al=2*(R-e)-2*(ap-R);ai=e-R;ag=(-al+Math.sqrt(al*al-4*ao*ai))/2/ao;ae=(-al-Math.sqrt(al*al-4*ao*ai))/2/ao;ah=E(i,e,ad,R,aq,ap,am,aj,ag&gt;0&amp;&amp;ag&lt;1?ag:0);af=E(i,e,ad,R,aq,ap,am,aj,ae&gt;0&amp;&amp;ae&lt;1?ae:0);an=an.concat(ah.x,af.x);ak=ak.concat(ah.y,af.y);return{min:{x:Math.min[h](Math,an),y:Math.min[h](Math,ak)},max:{x:Math.max[h](Math,an),y:Math.max[h](Math,ak)}};}),T=ab(function(ap,ak){var ae=z(ap),al=ak&amp;&amp;z(ak),am={x:0,y:0,bx:0,by:0,X:0,Y:0,qx:null,qy:null},e={x:0,y:0,bx:0,by:0,X:0,Y:0,qx:null,qy:null},ag=function(aq,ar){var i,at;if(!aq){return[&quot;C&quot;,ar.x,ar.y,ar.x,ar.y,ar.x,ar.y];}!(aq[0] in {T:1,Q:1})&amp;&amp;(ar.qx=ar.qy=null);switch(aq[0]){case&quot;M&quot;:ar.X=aq[1];ar.Y=aq[2];break;case&quot;A&quot;:aq=[&quot;C&quot;].concat(u[h](0,[ar.x,ar.y].concat(aq.slice(1))));break;case&quot;S&quot;:i=ar.x+(ar.x-(ar.bx||ar.x));at=ar.y+(ar.y-(ar.by||ar.y));aq=[&quot;C&quot;,i,at].concat(aq.slice(1));break;case&quot;T&quot;:ar.qx=ar.x+(ar.x-(ar.qx||ar.x));ar.qy=ar.y+(ar.y-(ar.qy||ar.y));aq=[&quot;C&quot;].concat(A(ar.x,ar.y,ar.qx,ar.qy,aq[1],aq[2]));break;case&quot;Q&quot;:ar.qx=aq[1];ar.qy=aq[2];aq=[&quot;C&quot;].concat(A(ar.x,ar.y,aq[1],aq[2],aq[3],aq[4]));break;case&quot;L&quot;:aq=[&quot;C&quot;].concat(d(ar.x,ar.y,aq[1],aq[2]));break;case&quot;H&quot;:aq=[&quot;C&quot;].concat(d(ar.x,ar.y,aq[1],ar.y));break;case&quot;V&quot;:aq=[&quot;C&quot;].concat(d(ar.x,ar.y,ar.x,aq[1]));break;case&quot;Z&quot;:aq=[&quot;C&quot;].concat(d(ar.x,ar.y,ar.X,ar.Y));break;}return aq;},R=function(aq,ar){if(aq[ar][C]&gt;7){aq[ar].shift();var at=aq[ar];while(at[C]){aq.splice(ar++,0,[&quot;C&quot;].concat(at.splice(0,6)));}aq.splice(ar,1);an=Math.max(ae[C],al&amp;&amp;al[C]||0);}},ad=function(av,au,ar,aq,at){if(av&amp;&amp;au&amp;&amp;av[at][0]==&quot;M&quot;&amp;&amp;au[at][0]!=&quot;M&quot;){au.splice(at,0,[&quot;M&quot;,aq.x,aq.y]);ar.bx=0;ar.by=0;ar.x=av[at][1];ar.y=av[at][2];an=Math.max(ae[C],al&amp;&amp;al[C]||0);}};for(var ai=0,an=Math.max(ae[C],al&amp;&amp;al[C]||0);ai&lt;an;ai++){ae[ai]=ag(ae[ai],am);R(ae,ai);al&amp;&amp;(al[ai]=ag(al[ai],e));al&amp;&amp;R(al,ai);ad(ae,al,am,e,ai);ad(al,ae,e,am,ai);var ah=ae[ai],ao=al&amp;&amp;al[ai],af=ah[C],aj=al&amp;&amp;ao[C];am.x=ah[af-2];am.y=ah[af-1];am.bx=P[s](ah[af-4])||am.x;am.by=P[s](ah[af-3])||am.y;e.bx=al&amp;&amp;(P[s](ao[aj-4])||e.x);e.by=al&amp;&amp;(P[s](ao[aj-3])||e.y);e.x=al&amp;&amp;ao[aj-2];e.y=al&amp;&amp;ao[aj-1];}return al?[ae,al]:ae;},null,w),p=ab(function(aj){var ai=[];for(var af=0,ak=aj[C];af&lt;ak;af++){var e={},ah=aj[af].match(/^([^:]*):?([\d\.]*)/);e.color=f.getRGB(ah[1]);if(e.color.error){return null;}e.color=e.color.hex;ah[2]&amp;&amp;(e.offset=ah[2]+&quot;%&quot;);ai.push(e);}for(var af=1,ak=ai[C]-1;af&lt;ak;af++){if(!ai[af].offset){var R=P[s](ai[af-1].offset||0),ad=0;for(var ae=af+1;ae&lt;ak;ae++){if(ai[ae].offset){ad=ai[ae].offset;break;}}if(!ad){ad=100;ae=ak;}ad=P[s](ad);var ag=(ad-R)/(ae-af+1);for(;af&lt;ae;af++){R+=ag;ai[af].offset=R+&quot;%&quot;;}}}return ai;}),K=function(){var R,i,ae,ad,e;if(f.is(arguments[0],&quot;string&quot;)||f.is(arguments[0],&quot;object&quot;)){if(f.is(arguments[0],&quot;string&quot;)){R=g.getElementById(arguments[0]);}else{R=arguments[0];}if(R.tagName){if(arguments[1]==null){return{container:R,width:R.style.pixelWidth||R.offsetWidth,height:R.style.pixelHeight||R.offsetHeight};}else{return{container:R,width:arguments[1],height:arguments[2]};}}}else{if(f.is(arguments[0],&quot;number&quot;)&amp;&amp;arguments[C]&gt;3){return{container:1,x:arguments[0],y:arguments[1],width:arguments[2],height:arguments[3]};}}},a=function(e,R){var i=this;for(var ad in R){if(R.hasOwnProperty(ad)&amp;&amp;!(ad in e)){switch(typeof R[ad]){case&quot;function&quot;:(function(ae){e[ad]=e===i?ae:function(){return ae[h](i,arguments);};})(R[ad]);break;case&quot;object&quot;:e[ad]=e[ad]||{};a.call(this,e[ad],R[ad]);break;default:e[ad]=R[ad];break;}}}};if(f.svg){b.svgns=&quot;http://www.w3.org/2000/svg&quot;;b.xlink=&quot;http://www.w3.org/1999/xlink&quot;;var S=function(e){return +e+(Math.floor(e)==e)*0.5;};var D=function(af){for(var R=0,ad=af[C];R&lt;ad;R++){if(af[R][0].toLowerCase()!=&quot;a&quot;){for(var e=1,ae=af[R][C];e&lt;ae;e++){af[R][e]=S(af[R][e]);}}else{af[R][6]=S(af[R][6]);af[R][7]=S(af[R][7]);}}return af;};var F=function(R,e){if(e){for(var i in e){if(e.hasOwnProperty(i)){R.setAttribute(i,e[i]);}}}else{return g.createElementNS(b.svgns,R);}};f.toString=function(){return&quot;Your browser supports SVG.\nYou are running Rapha\u00ebl &quot;+this.version;};var aa=function(e,ad){var i=F(&quot;path&quot;);ad.canvas&amp;&amp;ad.canvas.appendChild(i);var R=new n(i,ad);R.type=&quot;path&quot;;J(R,{fill:&quot;none&quot;,stroke:&quot;#000&quot;,path:e});return R;};var Q=function(ad,an,e){var ak=&quot;linear&quot;,ah=0.5,af=0.5,ap=ad.style;an=(an+&quot;&quot;).replace(/^r(?:\(([^,]+?)\s*,\s*([^\)]+?)\))?/,function(aq,i,ar){ak=&quot;radial&quot;;if(i&amp;&amp;ar){ah=P[s](i);af=P[s](ar);if(Math.pow(ah-0.5,2)+Math.pow(af-0.5,2)&gt;0.25){af=Math.sqrt(0.25-Math.pow(ah-0.5,2))+0.5;}}return&quot;&quot;;});an=an.split(/\s*\-\s*/);if(ak==&quot;linear&quot;){var ag=an.shift();ag=-P[s](ag);if(isNaN(ag)){return null;}var ae=[0,0,Math.cos(ag*Math.PI/180),Math.sin(ag*Math.PI/180)],am=1/(Math.max(Math.abs(ae[2]),Math.abs(ae[3]))||1);ae[2]*=am;ae[3]*=am;if(ae[2]&lt;0){ae[0]=-ae[2];ae[2]=0;}if(ae[3]&lt;0){ae[1]=-ae[3];ae[3]=0;}}var aj=p(an);if(!aj){return null;}var R=F(ak+&quot;Gradient&quot;);R.id=&quot;r&quot;+(f.idGenerator++).toString(36);ak==&quot;radial&quot;?F(R,{fx:ah,fy:af}):F(R,{x1:ae[0],y1:ae[1],x2:ae[2],y2:ae[3]});e.defs.appendChild(R);for(var ai=0,ao=aj[C];ai&lt;ao;ai++){var al=F(&quot;stop&quot;);F(al,{offset:aj[ai].offset?aj[ai].offset:!ai?&quot;0%&quot;:&quot;100%&quot;,&quot;stop-color&quot;:aj[ai].color||&quot;#fff&quot;});R.appendChild(al);}F(ad,{fill:&quot;url(#&quot;+R.id+&quot;)&quot;,opacity:1,&quot;fill-opacity&quot;:1});ap.fill=&quot;&quot;;ap.opacity=1;ap.fillOpacity=1;return 1;};var v=function(i){var e=i.getBBox();F(i.pattern,{patternTransform:f.format(&quot;translate({0},{1})&quot;,e.x,e.y)});};var J=function(al,av){var ao={&quot;&quot;:[0],none:[0],&quot;-&quot;:[3,1],&quot;.&quot;:[1,1],&quot;-.&quot;:[3,1,1,1],&quot;-..&quot;:[3,1,1,1,1,1],&quot;. &quot;:[1,3],&quot;- &quot;:[4,3],&quot;--&quot;:[8,3],&quot;- .&quot;:[4,3,1,3],&quot;--.&quot;:[8,3,1,3],&quot;--..&quot;:[8,3,1,3,1,3]},aq=al.node,am=al.attrs,ai=al.attr(&quot;rotation&quot;),af=function(aC,aB){aB=ao[(aB+&quot;&quot;).toLowerCase()];if(aB){var az=aC.attrs[&quot;stroke-width&quot;]||&quot;1&quot;,ax={round:az,square:az,butt:0}[aC.attrs[&quot;stroke-linecap&quot;]||av[&quot;stroke-linecap&quot;]]||0,aA=[];var ay=aB[C];while(ay--){aA[ay]=aB[ay]*az+((ay%2)?1:-1)*ax;}F(aq,{&quot;stroke-dasharray&quot;:aA.join(&quot;,&quot;)});}};P[s](ai)&amp;&amp;al.rotate(0,true);for(var ap in av){if(av.hasOwnProperty(ap)){if(!(ap in t)){continue;}var an=av[ap];am[ap]=an;switch(ap){case&quot;href&quot;:case&quot;title&quot;:case&quot;target&quot;:var at=aq.parentNode;if(at.tagName.toLowerCase()!=&quot;a&quot;){var ad=F(&quot;a&quot;);at.insertBefore(ad,aq);ad.appendChild(aq);at=ad;}at.setAttributeNS(al.paper.xlink,ap,an);break;case&quot;clip-rect&quot;:var i=(an+&quot;&quot;).split(ac);if(i[C]==4){al.clip&amp;&amp;al.clip.parentNode.parentNode.removeChild(al.clip.parentNode);var R=F(&quot;clipPath&quot;),ar=F(&quot;rect&quot;);R.id=&quot;r&quot;+(f.idGenerator++).toString(36);F(ar,{x:i[0],y:i[1],width:i[2],height:i[3]});R.appendChild(ar);al.paper.defs.appendChild(R);F(aq,{&quot;clip-path&quot;:&quot;url(#&quot;+R.id+&quot;)&quot;});al.clip=ar;}if(!an){var au=g.getElementById(aq.getAttribute(&quot;clip-path&quot;).replace(/(^url\(#|\)$)/g,&quot;&quot;));au&amp;&amp;au.parentNode.removeChild(au);F(aq,{&quot;clip-path&quot;:&quot;&quot;});delete al.clip;}break;case&quot;path&quot;:if(an&amp;&amp;al.type==&quot;path&quot;){am.path=D(z(an));F(aq,{d:am.path});}break;case&quot;width&quot;:aq.setAttribute(ap,an);if(am.fx){ap=&quot;x&quot;;an=am.x;}else{break;}case&quot;x&quot;:if(am.fx){an=-am.x-(am.width||0);}case&quot;rx&quot;:if(ap==&quot;rx&quot;&amp;&amp;al.type==&quot;rect&quot;){break;}case&quot;cx&quot;:aq.setAttribute(ap,an);al.pattern&amp;&amp;v(al);break;case&quot;height&quot;:aq.setAttribute(ap,an);if(am.fy){ap=&quot;y&quot;;an=am.y;}else{break;}case&quot;y&quot;:if(am.fy){an=-am.y-(am.height||0);}case&quot;ry&quot;:if(ap==&quot;ry&quot;&amp;&amp;al.type==&quot;rect&quot;){break;}case&quot;cy&quot;:aq.setAttribute(ap,an);al.pattern&amp;&amp;v(al);break;case&quot;r&quot;:if(al.type==&quot;rect&quot;){F(aq,{rx:an,ry:an});}else{aq.setAttribute(ap,an);}break;case&quot;src&quot;:if(al.type==&quot;image&quot;){aq.setAttributeNS(al.paper.xlink,&quot;href&quot;,an);}break;case&quot;stroke-width&quot;:aq.style.strokeWidth=an;aq.setAttribute(ap,an);if(am[&quot;stroke-dasharray&quot;]){af(al,am[&quot;stroke-dasharray&quot;]);}break;case&quot;stroke-dasharray&quot;:af(al,an);break;case&quot;rotation&quot;:ai=an;al.rotate(an,true);break;case&quot;translation&quot;:var ag=(an+&quot;&quot;).split(ac);al.translate((+ag[0]+1||2)-1,(+ag[1]+1||2)-1);break;case&quot;scale&quot;:var ag=(an+&quot;&quot;).split(ac);al.scale(+ag[0]||1,+ag[1]||+ag[0]||1,+ag[2]||null,+ag[3]||null);break;case&quot;fill&quot;:var ae=(an+&quot;&quot;).match(/^url\(['&quot;]?([^\)]+)['&quot;]?\)$/i);if(ae){var R=F(&quot;pattern&quot;),ak=F(&quot;image&quot;);R.id=&quot;r&quot;+(f.idGenerator++).toString(36);F(R,{x:0,y:0,patternUnits:&quot;userSpaceOnUse&quot;});F(ak,{x:0,y:0});ak.setAttributeNS(al.paper.xlink,&quot;href&quot;,ae[1]);R.appendChild(ak);var aw=g.createElement(&quot;img&quot;);aw.style.cssText=&quot;position:absolute;left:-9999em;top-9999em&quot;;aw.onload=function(){F(R,{width:this.offsetWidth,height:this.offsetHeight});F(ak,{width:this.offsetWidth,height:this.offsetHeight});g.body.removeChild(this);b.safari();};g.body.appendChild(aw);aw.src=ae[1];al.paper.defs.appendChild(R);aq.style.fill=&quot;url(#&quot;+R.id+&quot;)&quot;;F(aq,{fill:&quot;url(#&quot;+R.id+&quot;)&quot;});al.pattern=R;al.pattern&amp;&amp;v(al);break;}if(!f.getRGB(an).error){delete av.gradient;delete am.gradient;if(!f.is(am.opacity,&quot;undefined&quot;)&amp;&amp;f.is(av.opacity,&quot;undefined&quot;)){aq.style.opacity=am.opacity;F(aq,{opacity:am.opacity});}if(!f.is(am[&quot;fill-opacity&quot;],&quot;undefined&quot;)&amp;&amp;f.is(av[&quot;fill-opacity&quot;],&quot;undefined&quot;)){aq.style.fillOpacity=am[&quot;fill-opacity&quot;];F(aq,{&quot;fill-opacity&quot;:am[&quot;fill-opacity&quot;]});}}else{if((al.type in {circle:1,ellipse:1}||(an+&quot;&quot;).charAt(0)!=&quot;r&quot;)&amp;&amp;Q(aq,an,al.paper)){am.gradient=an;am.fill=&quot;none&quot;;break;}}case&quot;stroke&quot;:aq.style[ap]=f.getRGB(an).hex;aq.setAttribute(ap,f.getRGB(an).hex);break;case&quot;gradient&quot;:(al.type in {circle:1,ellipse:1}||(an+&quot;&quot;).charAt(0)!=&quot;r&quot;)&amp;&amp;Q(aq,an,al.paper);break;case&quot;opacity&quot;:case&quot;fill-opacity&quot;:if(am.gradient){var e=g.getElementById(aq.getAttribute(&quot;fill&quot;).replace(/^url\(#|\)$/g,&quot;&quot;));if(e){var ah=e.getElementsByTagName(&quot;stop&quot;);ah[ah[C]-1].setAttribute(&quot;stop-opacity&quot;,an);}break;}default:ap==&quot;font-size&quot;&amp;&amp;(an=P[r](an,10)+&quot;px&quot;);var aj=ap.replace(/(\-.)/g,function(ax){return ax.substring(1).toUpperCase();});aq.style[aj]=an;aq.setAttribute(ap,an);break;}}}X(al,av);P[r](ai,10)&amp;&amp;al.rotate(ai,true);};var O=1.2;var X=function(e,ae){if(e.type!=&quot;text&quot;||!(&quot;text&quot; in ae||&quot;font&quot; in ae||&quot;font-size&quot; in ae||&quot;x&quot; in ae||&quot;y&quot; in ae)){return;}var aj=e.attrs,R=e.node,al=R.firstChild?P[r](g.defaultView.getComputedStyle(R.firstChild,&quot;&quot;).getPropertyValue(&quot;font-size&quot;),10):10;if(&quot;text&quot; in ae){while(R.firstChild){R.removeChild(R.firstChild);}var ad=(ae.text+&quot;&quot;).split(&quot;\n&quot;);for(var af=0,ak=ad[C];af&lt;ak;af++){var ah=F(&quot;tspan&quot;);af&amp;&amp;F(ah,{dy:al*O,x:aj.x});ah.appendChild(g.createTextNode(ad[af]));R.appendChild(ah);}}else{var ad=R.getElementsByTagName(&quot;tspan&quot;);for(var af=0,ak=ad[C];af&lt;ak;af++){af&amp;&amp;F(ad[af],{dy:al*O,x:aj.x});}}F(R,{y:aj.y});var ag=e.getBBox(),ai=aj.y-(ag.y+ag.height/2);ai&amp;&amp;F(R,{y:aj.y+ai});};var n=function(i,e){var ad=0,R=0;this[0]=i;this.node=i;i.raphael=this;this.paper=e;this.attrs=this.attrs||{};this.transformations=[];this._={tx:0,ty:0,rt:{deg:0,cx:0,cy:0},sx:1,sy:1};};n[o].rotate=function(i,e,ad){if(i==null){if(this._.rt.cx){return[this._.rt.deg,this._.rt.cx,this._.rt.cy].join(&quot; &quot;);}return this._.rt.deg;}var R=this.getBBox();i=(i+&quot;&quot;).split(ac);if(i[C]-1){e=P[s](i[1]);ad=P[s](i[2]);}i=P[s](i[0]);if(e!=null){this._.rt.deg=i;}else{this._.rt.deg+=i;}(ad==null)&amp;&amp;(e=null);this._.rt.cx=e;this._.rt.cy=ad;e=e==null?R.x+R.width/2:e;ad=ad==null?R.y+R.height/2:ad;if(this._.rt.deg){this.transformations[0]=f.format(&quot;rotate({0} {1} {2})&quot;,this._.rt.deg,e,ad);this.clip&amp;&amp;F(this.clip,{transform:f.format(&quot;rotate({0} {1} {2})&quot;,-this._.rt.deg,e,ad)});}else{this.transformations[0]=&quot;&quot;;this.clip&amp;&amp;F(this.clip,{transform:&quot;&quot;});}F(this.node,{transform:this.transformations.join(&quot; &quot;)});return this;};n[o].hide=function(){this.node.style.display=&quot;none&quot;;return this;};n[o].show=function(){this.node.style.display=&quot;block&quot;;return this;};n[o].remove=function(){this.node.parentNode.removeChild(this.node);};n[o].getBBox=function(){if(this.type==&quot;path&quot;){return H(this.attrs.path);}if(this.node.style.display==&quot;none&quot;){this.show();var ad=true;}var ah={};try{ah=this.node.getBBox();}catch(af){}finally{ah=ah||{};}if(this.type==&quot;text&quot;){ah={x:ah.x,y:Infinity,width:ah.width,height:0};for(var R=0,ae=this.node.getNumberOfChars();R&lt;ae;R++){var ag=this.node.getExtentOfChar(R);(ag.y&lt;ah.y)&amp;&amp;(ah.y=ag.y);(ag.y+ag.height-ah.y&gt;ah.height)&amp;&amp;(ah.height=ag.y+ag.height-ah.y);}}ad&amp;&amp;this.hide();return ah;};n[o].attr=function(){if(arguments[C]==1&amp;&amp;f.is(arguments[0],&quot;string&quot;)){if(arguments[0]==&quot;translation&quot;){return this.translate();}if(arguments[0]==&quot;rotation&quot;){return this.rotate();}if(arguments[0]==&quot;scale&quot;){return this.scale();}return this.attrs[arguments[0]];}if(arguments[C]==1&amp;&amp;f.is(arguments[0],&quot;array&quot;)){var e={};for(var i in arguments[0]){if(arguments[0].hasOwnProperty(i)){e[arguments[0][i]]=this.attrs[arguments[0][i]];}}return e;}if(arguments[C]==2){var R={};R[arguments[0]]=arguments[1];J(this,R);}else{if(arguments[C]==1&amp;&amp;f.is(arguments[0],&quot;object&quot;)){J(this,arguments[0]);}}return this;};n[o].toFront=function(){this.node.parentNode.appendChild(this.node);return this;};n[o].toBack=function(){if(this.node.parentNode.firstChild!=this.node){this.node.parentNode.insertBefore(this.node,this.node.parentNode.firstChild);}return this;};n[o].insertAfter=function(e){if(e.node.nextSibling){e.node.parentNode.insertBefore(this.node,e.node.nextSibling);}else{e.node.parentNode.appendChild(this.node);}return this;};n[o].insertBefore=function(e){var i=e.node;i.parentNode.insertBefore(this.node,i);return this;};var G=function(i,e,af,ae){e=S(e);af=S(af);var ad=F(&quot;circle&quot;);i.canvas&amp;&amp;i.canvas.appendChild(ad);var R=new n(ad,i);R.attrs={cx:e,cy:af,r:ae,fill:&quot;none&quot;,stroke:&quot;#000&quot;};R.type=&quot;circle&quot;;F(ad,R.attrs);return R;};var M=function(R,e,ah,i,af,ag){e=S(e);ah=S(ah);var ae=F(&quot;rect&quot;);R.canvas&amp;&amp;R.canvas.appendChild(ae);var ad=new n(ae,R);ad.attrs={x:e,y:ah,width:i,height:af,r:ag||0,rx:ag||0,ry:ag||0,fill:&quot;none&quot;,stroke:&quot;#000&quot;};ad.type=&quot;rect&quot;;F(ae,ad.attrs);return ad;};var j=function(i,e,ag,af,ae){e=S(e);ag=S(ag);var ad=F(&quot;ellipse&quot;);i.canvas&amp;&amp;i.canvas.appendChild(ad);var R=new n(ad,i);R.attrs={cx:e,cy:ag,rx:af,ry:ae,fill:&quot;none&quot;,stroke:&quot;#000&quot;};R.type=&quot;ellipse&quot;;F(ad,R.attrs);return R;};var q=function(R,ag,e,ah,i,af){var ae=F(&quot;image&quot;);F(ae,{x:e,y:ah,width:i,height:af,preserveAspectRatio:&quot;none&quot;});ae.setAttributeNS(R.xlink,&quot;href&quot;,ag);R.canvas&amp;&amp;R.canvas.appendChild(ae);var ad=new n(ae,R);ad.attrs={x:e,y:ah,width:i,height:af,src:ag};ad.type=&quot;image&quot;;return ad;};var L=function(i,e,af,ae){var ad=F(&quot;text&quot;);F(ad,{x:e,y:af,&quot;text-anchor&quot;:&quot;middle&quot;});i.canvas&amp;&amp;i.canvas.appendChild(ad);var R=new n(ad,i);R.attrs={x:e,y:af,&quot;text-anchor&quot;:&quot;middle&quot;,text:ae,font:t.font,stroke:&quot;none&quot;,fill:&quot;#000&quot;};R.type=&quot;text&quot;;J(R,R.attrs);return R;};var I=function(i,e){this.width=i||this.width;this.height=e||this.height;this.canvas.setAttribute(&quot;width&quot;,this.width);this.canvas.setAttribute(&quot;height&quot;,this.height);return this;};var m=function(){var ae=K[h](null,arguments),R=ae&amp;&amp;ae.container,ag=ae.x,af=ae.y,ad=ae.width,ah=ae.height;if(!R){throw new Error(&quot;SVG container not found.&quot;);}b.canvas=F(&quot;svg&quot;);var e=b.canvas,ai=e.style;e.setAttribute(&quot;width&quot;,ad||512);b.width=ad||512;e.setAttribute(&quot;height&quot;,ah||342);b.height=ah||342;if(R==1){g.body.appendChild(e);ai.position=&quot;absolute&quot;;ai.left=ag+&quot;px&quot;;ai.top=af+&quot;px&quot;;}else{if(R.firstChild){R.insertBefore(e,R.firstChild);}else{R.appendChild(e);}}R={canvas:e,clear:function(){while(this.canvas.firstChild){this.canvas.removeChild(this.canvas.firstChild);}this.desc=F(&quot;desc&quot;);this.defs=F(&quot;defs&quot;);this.desc.appendChild(g.createTextNode(&quot;Created with Rapha\u00ebl&quot;));this.canvas.appendChild(this.desc);this.canvas.appendChild(this.defs);}};for(var i in b){if(b.hasOwnProperty(i)){if(i!=&quot;create&quot;){R[i]=b[i];}}}a.call(R,R,f.fn);R.clear();R.raphael=f;return R;};b.remove=function(){this.canvas.parentNode&amp;&amp;this.canvas.parentNode.removeChild(this.canvas);};}if(f.vml){var B=function(ag){var ae=T(ag);for(var R=0,ad=ae[C];R&lt;ad;R++){ae[R][0]=(ae[R][0]+&quot;&quot;).toLowerCase();ae[R][0]==&quot;z&quot;&amp;&amp;(ae[R][0]=&quot;x&quot;);for(var e=1,af=ae[R][C];e&lt;af;e++){ae[R][e]=~~(ae[R][e]+0.5);}}return(ae+&quot;&quot;);};f.toString=function(){return&quot;Your browser doesn\u2019t support SVG. Assuming it is Internet Explorer and falling down to VML.\nYou are running Rapha\u00ebl &quot;+this.version;};var aa=function(e,af){var ad=Z(&quot;group&quot;),ag=ad.style;ag.position=&quot;absolute&quot;;ag.left=0;ag.top=0;ag.width=af.width+&quot;px&quot;;ag.height=af.height+&quot;px&quot;;ad.coordsize=af.coordsize;ad.coordorigin=af.coordorigin;var R=Z(&quot;shape&quot;),i=R.style;i.width=af.width+&quot;px&quot;;i.height=af.height+&quot;px&quot;;R.path=&quot;&quot;;R.coordsize=this.coordsize;R.coordorigin=this.coordorigin;ad.appendChild(R);var ae=new n(R,ad,af);ae.isAbsolute=true;ae.type=&quot;path&quot;;ae.path=[];ae.Path=&quot;&quot;;if(e){ae.attrs.path=f.parsePathString(e);ae.node.path=B(ae.attrs.path);}J(ae,{fill:&quot;none&quot;,stroke:&quot;#000&quot;});ae.setBox();af.canvas.appendChild(ad);return ae;};var J=function(aj,an){aj.attrs=aj.attrs||{};var al=aj.node,ao=aj.attrs,ag=al.style,ad,at=aj;for(var ah in an){if(an.hasOwnProperty(ah)){ao[ah]=an[ah];}}an.href&amp;&amp;(al.href=an.href);an.title&amp;&amp;(al.title=an.title);an.target&amp;&amp;(al.target=an.target);if(an.path&amp;&amp;aj.type==&quot;path&quot;){ao.path=f.parsePathString(an.path);al.path=B(ao.path);}if(an.rotation!=null){aj.rotate(an.rotation,true);}if(an.translation){ad=(an.translation+&quot;&quot;).split(ac);aj.translate(ad[0],ad[1]);}if(an.scale){ad=(an.scale+&quot;&quot;).split(ac);aj.scale(+ad[0]||1,+ad[1]||+ad[0]||1,+ad[2]||null,+ad[3]||null);}if(&quot;clip-rect&quot; in an){var e=(an[&quot;clip-rect&quot;]+&quot;&quot;).split(ac);if(e[C]==4){e[2]=+e[2]+(+e[0]);e[3]=+e[3]+(+e[1]);var ai=al.clipRect||g.createElement(&quot;div&quot;),ar=ai.style,af=al.parentNode;ar.clip=f.format(&quot;rect({1}px {2}px {3}px {0}px)&quot;,e);if(!al.clipRect){ar.position=&quot;absolute&quot;;ar.top=0;ar.left=0;ar.width=aj.paper.width+&quot;px&quot;;ar.height=aj.paper.height+&quot;px&quot;;af.parentNode.insertBefore(ai,af);ai.appendChild(af);al.clipRect=ai;}}if(!an[&quot;clip-rect&quot;]){al.clipRect&amp;&amp;(al.clipRect.style.clip=&quot;&quot;);}}if(aj.type==&quot;image&quot;&amp;&amp;an.src){al.src=an.src;}if(aj.type==&quot;image&quot;&amp;&amp;an.opacity){al.filterOpacity=&quot; progid:DXImageTransform.Microsoft.Alpha(opacity=&quot;+(an.opacity*100)+&quot;)&quot;;ag.filter=(al.filterMatrix||&quot;&quot;)+(al.filterOpacity||&quot;&quot;);}an.font&amp;&amp;(ag.font=an.font);an[&quot;font-family&quot;]&amp;&amp;(ag.fontFamily='&quot;'+an[&quot;font-family&quot;].split(&quot;,&quot;)[0].replace(/^['&quot;]+|['&quot;]+$/g,&quot;&quot;)+'&quot;');an[&quot;font-size&quot;]&amp;&amp;(ag.fontSize=an[&quot;font-size&quot;]);an[&quot;font-weight&quot;]&amp;&amp;(ag.fontWeight=an[&quot;font-weight&quot;]);an[&quot;font-style&quot;]&amp;&amp;(ag.fontStyle=an[&quot;font-style&quot;]);if(an.opacity!=null||an[&quot;stroke-width&quot;]!=null||an.fill!=null||an.stroke!=null||an[&quot;stroke-width&quot;]!=null||an[&quot;stroke-opacity&quot;]!=null||an[&quot;fill-opacity&quot;]!=null||an[&quot;stroke-dasharray&quot;]!=null||an[&quot;stroke-miterlimit&quot;]!=null||an[&quot;stroke-linejoin&quot;]!=null||an[&quot;stroke-linecap&quot;]!=null){al=aj.shape||al;var am=(al.getElementsByTagName(&quot;fill&quot;)&amp;&amp;al.getElementsByTagName(&quot;fill&quot;)[0]),ap=false;!am&amp;&amp;(ap=am=Z(&quot;fill&quot;));if(&quot;fill-opacity&quot; in an||&quot;opacity&quot; in an){var i=((+ao[&quot;fill-opacity&quot;]+1||2)-1)*((+ao.opacity+1||2)-1);i&lt;0&amp;&amp;(i=0);i&gt;1&amp;&amp;(i=1);am.opacity=i;}an.fill&amp;&amp;(am.on=true);if(am.on==null||an.fill==&quot;none&quot;){am.on=false;}if(am.on&amp;&amp;an.fill){var R=an.fill.match(/^url\(([^\)]+)\)$/i);if(R){am.src=R[1];am.type=&quot;tile&quot;;}else{am.color=f.getRGB(an.fill).hex;am.src=&quot;&quot;;am.type=&quot;solid&quot;;if(f.getRGB(an.fill).error&amp;&amp;(at.type in {circle:1,ellipse:1}||(an.fill+&quot;&quot;).charAt(0)!=&quot;r&quot;)&amp;&amp;Q(at,an.fill)){ao.fill=&quot;none&quot;;ao.gradient=an.fill;}}}ap&amp;&amp;al.appendChild(am);var ae=(al.getElementsByTagName(&quot;stroke&quot;)&amp;&amp;al.getElementsByTagName(&quot;stroke&quot;)[0]),aq=false;!ae&amp;&amp;(aq=ae=Z(&quot;stroke&quot;));if((an.stroke&amp;&amp;an.stroke!=&quot;none&quot;)||an[&quot;stroke-width&quot;]||an[&quot;stroke-opacity&quot;]!=null||an[&quot;stroke-dasharray&quot;]||an[&quot;stroke-miterlimit&quot;]||an[&quot;stroke-linejoin&quot;]||an[&quot;stroke-linecap&quot;]){ae.on=true;}(an.stroke==&quot;none&quot;||ae.on==null||an.stroke==0||an[&quot;stroke-width&quot;]==0)&amp;&amp;(ae.on=false);ae.on&amp;&amp;an.stroke&amp;&amp;(ae.color=f.getRGB(an.stroke).hex);var i=((+ao[&quot;stroke-opacity&quot;]+1||2)-1)*((+ao.opacity+1||2)-1);i&lt;0&amp;&amp;(i=0);i&gt;1&amp;&amp;(i=1);ae.opacity=i;an[&quot;stroke-linejoin&quot;]&amp;&amp;(ae.joinstyle=an[&quot;stroke-linejoin&quot;]||&quot;miter&quot;);ae.miterlimit=an[&quot;stroke-miterlimit&quot;]||8;an[&quot;stroke-linecap&quot;]&amp;&amp;(ae.endcap={butt:&quot;flat&quot;,square:&quot;square&quot;,round:&quot;round&quot;}[an[&quot;stroke-linecap&quot;]]||&quot;miter&quot;);an[&quot;stroke-width&quot;]&amp;&amp;(ae.weight=(P[s](an[&quot;stroke-width&quot;])||1)*12/16);if(an[&quot;stroke-dasharray&quot;]){var ak={&quot;-&quot;:&quot;shortdash&quot;,&quot;.&quot;:&quot;shortdot&quot;,&quot;-.&quot;:&quot;shortdashdot&quot;,&quot;-..&quot;:&quot;shortdashdotdot&quot;,&quot;. &quot;:&quot;dot&quot;,&quot;- &quot;:&quot;dash&quot;,&quot;--&quot;:&quot;longdash&quot;,&quot;- .&quot;:&quot;dashdot&quot;,&quot;--.&quot;:&quot;longdashdot&quot;,&quot;--..&quot;:&quot;longdashdotdot&quot;};ae.dashstyle=ak[an[&quot;stroke-dasharray&quot;]]||&quot;&quot;;}aq&amp;&amp;al.appendChild(ae);}if(at.type==&quot;text&quot;){var ag=at.paper.span.style;ao.font&amp;&amp;(ag.font=ao.font);ao[&quot;font-family&quot;]&amp;&amp;(ag.fontFamily=ao[&quot;font-family&quot;]);ao[&quot;font-size&quot;]&amp;&amp;(ag.fontSize=ao[&quot;font-size&quot;]);ao[&quot;font-weight&quot;]&amp;&amp;(ag.fontWeight=ao[&quot;font-weight&quot;]);ao[&quot;font-style&quot;]&amp;&amp;(ag.fontStyle=ao[&quot;font-style&quot;]);at.node.string&amp;&amp;(at.paper.span.innerHTML=at.node.string.replace(/&lt;/g,&quot;&amp;#60;&quot;).replace(/&amp;/g,&quot;&amp;#38;&quot;).replace(/\n/g,&quot;&lt;br&gt;&quot;));at.W=ao.w=at.paper.span.offsetWidth;at.H=ao.h=at.paper.span.offsetHeight;at.X=ao.x;at.Y=ao.y+~~(at.H/2+0.5);switch(ao[&quot;text-anchor&quot;]){case&quot;start&quot;:at.node.style[&quot;v-text-align&quot;]=&quot;left&quot;;at.bbx=~~(at.W/2+0.5);break;case&quot;end&quot;:at.node.style[&quot;v-text-align&quot;]=&quot;right&quot;;at.bbx=-~~(at.W/2+0.5);break;default:at.node.style[&quot;v-text-align&quot;]=&quot;center&quot;;break;}}};var Q=function(e,ah){e.attrs=e.attrs||{};var ai=e.attrs,ak=e.node.getElementsByTagName(&quot;fill&quot;),af=&quot;linear&quot;,ag=&quot;.5 .5&quot;;e.attrs.gradient=ah;ah=(ah+&quot;&quot;).replace(/^r(?:\(([^,]+?)\s*,\s*([^\)]+?)\))?/,function(am,an,i){af=&quot;radial&quot;;if(an&amp;&amp;i){an=P[s](an);i=P[s](i);if(Math.pow(an-0.5,2)+Math.pow(i-0.5,2)&gt;0.25){i=Math.sqrt(0.25-Math.pow(an-0.5,2))+0.5;}ag=an+&quot; &quot;+i;}return&quot;&quot;;});ah=ah.split(/\s*\-\s*/);if(af==&quot;linear&quot;){var R=ah.shift();R=-P[s](R);if(isNaN(R)){return null;}}var ae=p(ah);if(!ae){return null;}e=e.shape||e.node;ak=ak[0]||Z(&quot;fill&quot;);if(ae[C]){ak.on=true;ak.method=&quot;none&quot;;ak.type=(af==&quot;radial&quot;)?&quot;gradientradial&quot;:&quot;gradient&quot;;ak.color=ae[0].color;ak.color2=ae[ae[C]-1].color;var al=[];for(var ad=0,aj=ae[C];ad&lt;aj;ad++){ae[ad].offset&amp;&amp;al.push(ae[ad].offset+&quot; &quot;+ae[ad].color);}if(al[C]&amp;&amp;ak.colors){ak.colors.value=al.join(&quot;,&quot;);}else{ak.colors.value=&quot;0% &quot;+ak.color;}if(af==&quot;radial&quot;){ak.focus=&quot;100%&quot;;ak.focussize=ag;ak.focusposition=ag;}else{ak.angle=(270-R)%360;}}return 1;};var n=function(ae,ag,e){var af=0,R=0,i=0,ad=1;this[0]=ae;this.node=ae;ae.raphael=this;this.X=0;this.Y=0;this.attrs={};this.Group=ag;this.paper=e;this._={tx:0,ty:0,rt:{deg:0},sx:1,sy:1};};n[o].rotate=function(i,e,R){if(i==null){if(this._.rt.cx){return[this._.rt.deg,this._.rt.cx,this._.rt.cy].join(&quot; &quot;);}return this._.rt.deg;}i=(i+&quot;&quot;).split(ac);if(i[C]-1){e=P[s](i[1]);R=P[s](i[2]);}i=P[s](i[0]);if(e!=null){this._.rt.deg=i;}else{this._.rt.deg+=i;}R==null&amp;&amp;(e=null);this._.rt.cx=e;this._.rt.cy=R;this.setBox(this.attrs,e,R);this.Group.style.rotation=this._.rt.deg;return this;};n[o].setBox=function(af,ag,ae){var R=this.Group.style,ah=(this.shape&amp;&amp;this.shape.style)||this.node.style;af=af||{};for(var ai in af){if(af.hasOwnProperty(ai)){this.attrs[ai]=af[ai];}}ag=ag||this._.rt.cx;ae=ae||this._.rt.cy;var al=this.attrs,ao,an,ap,ak;switch(this.type){case&quot;circle&quot;:ao=al.cx-al.r;an=al.cy-al.r;ap=ak=al.r*2;break;case&quot;ellipse&quot;:ao=al.cx-al.rx;an=al.cy-al.ry;ap=al.rx*2;ak=al.ry*2;break;case&quot;rect&quot;:case&quot;image&quot;:ao=al.x;an=al.y;ap=al.width||0;ak=al.height||0;break;case&quot;text&quot;:this.textpath.v=[&quot;m&quot;,~~(al.x+0.5),&quot;, &quot;,~~(al.y-2+0.5),&quot;l&quot;,~~(al.x+0.5)+1,&quot;, &quot;,~~(al.y-2+0.5)].join(&quot;&quot;);ao=al.x-~~(this.W/2+0.5);an=al.y-this.H/2;ap=this.W;ak=this.H;break;case&quot;path&quot;:if(!this.attrs.path){ao=0;an=0;ap=this.paper.width;ak=this.paper.height;}else{var aj=H(this.attrs.path);ao=aj.x;an=aj.y;ap=aj.width;ak=aj.height;}break;default:ao=0;an=0;ap=this.paper.width;ak=this.paper.height;break;}ag=(ag==null)?ao+ap/2:ag;ae=(ae==null)?an+ak/2:ae;var ad=ag-this.paper.width/2,am=ae-this.paper.height/2;if(this.type==&quot;path&quot;||this.type==&quot;text&quot;){(R.left!=ad+&quot;px&quot;)&amp;&amp;(R.left=ad+&quot;px&quot;);(R.top!=am+&quot;px&quot;)&amp;&amp;(R.top=am+&quot;px&quot;);this.X=this.type==&quot;text&quot;?ao:-ad;this.Y=this.type==&quot;text&quot;?an:-am;this.W=ap;this.H=ak;(ah.left!=-ad+&quot;px&quot;)&amp;&amp;(ah.left=-ad+&quot;px&quot;);(ah.top!=-am+&quot;px&quot;)&amp;&amp;(ah.top=-am+&quot;px&quot;);}else{(R.left!=ad+&quot;px&quot;)&amp;&amp;(R.left=ad+&quot;px&quot;);(R.top!=am+&quot;px&quot;)&amp;&amp;(R.top=am+&quot;px&quot;);this.X=ao;this.Y=an;this.W=ap;this.H=ak;(R.width!=this.paper.width+&quot;px&quot;)&amp;&amp;(R.width=this.paper.width+&quot;px&quot;);(R.height!=this.paper.height+&quot;px&quot;)&amp;&amp;(R.height=this.paper.height+&quot;px&quot;);(ah.left!=ao-ad+&quot;px&quot;)&amp;&amp;(ah.left=ao-ad+&quot;px&quot;);(ah.top!=an-am+&quot;px&quot;)&amp;&amp;(ah.top=an-am+&quot;px&quot;);(ah.width!=ap+&quot;px&quot;)&amp;&amp;(ah.width=ap+&quot;px&quot;);(ah.height!=ak+&quot;px&quot;)&amp;&amp;(ah.height=ak+&quot;px&quot;);var aq=(+af.r||0)/(Math.min(ap,ak));if(this.type==&quot;rect&quot;&amp;&amp;this.arcsize!=aq&amp;&amp;(aq||this.arcsize)){var e=Z(aq?&quot;roundrect&quot;:&quot;rect&quot;);e.arcsize=aq;this.Group.appendChild(e);this.node.parentNode.removeChild(this.node);this.node=e;this.arcsize=aq;J(this,this.attrs);this.setBox(this.attrs);}}};n[o].hide=function(){this.Group.style.display=&quot;none&quot;;return this;};n[o].show=function(){this.Group.style.display=&quot;block&quot;;return this;};n[o].getBBox=function(){if(this.type==&quot;path&quot;){return H(this.attrs.path);}return{x:this.X+(this.bbx||0),y:this.Y,width:this.W,height:this.H};};n[o].remove=function(){this[0].parentNode.removeChild(this[0]);this.Group.parentNode.removeChild(this.Group);this.shape&amp;&amp;this.shape.parentNode.removeChild(this.shape);};n[o].attr=function(){if(arguments[C]==1&amp;&amp;f.is(arguments[0],&quot;string&quot;)){if(arguments[0]==&quot;translation&quot;){return this.translate();}if(arguments[0]==&quot;rotation&quot;){return this.rotate();}if(arguments[0]==&quot;scale&quot;){return this.scale();}return this.attrs[arguments[0]];}if(this.attrs&amp;&amp;arguments[C]==1&amp;&amp;f.is(arguments[0],&quot;array&quot;)){var e={};for(var R=0,ad=arguments[0][C];R&lt;ad;R++){e[arguments[0][R]]=this.attrs[arguments[0][R]];}return e;}var ae;if(arguments[C]==2){ae={};ae[arguments[0]]=arguments[1];}if(arguments[C]==1&amp;&amp;f.is(arguments[0],&quot;object&quot;)){ae=arguments[0];}if(ae){if(ae.gradient&amp;&amp;(this.type in {circle:1,ellipse:1}||(ae.gradient+&quot;&quot;).charAt(0)!=&quot;r&quot;)){Q(this,ae.gradient);}if(ae.text&amp;&amp;this.type==&quot;text&quot;){this.node.string=ae.text;}J(this,ae);this.setBox(this.attrs);}return this;};n[o].toFront=function(){this.Group.parentNode.appendChild(this.Group);return this;};n[o].toBack=function(){if(this.Group.parentNode.firstChild!=this.Group){this.Group.parentNode.insertBefore(this.Group,this.Group.parentNode.firstChild);}return this;};n[o].insertAfter=function(e){if(e.Group.nextSibling){e.Group.parentNode.insertBefore(this.Group,e.Group.nextSibling);}else{e.Group.parentNode.appendChild(this.Group);}return this;};n[o].insertBefore=function(e){e.Group.parentNode.insertBefore(this.Group,e.Group);return this;};var G=function(i,e,ah,af){var ae=Z(&quot;group&quot;),ag=Z(&quot;oval&quot;),R=ag.style;ae.style.cssText=&quot;position:absolute;left:0;top:0;width:&quot;+i.width+&quot;px;height:&quot;+i.height+&quot;px&quot;;ae.coordsize=i.coordsize;ae.coordorigin=i.coordorigin;ae.appendChild(ag);var ad=new n(ag,ae,i);ad.type=&quot;circle&quot;;J(ad,{stroke:&quot;#000&quot;,fill:&quot;none&quot;});ad.attrs.cx=e;ad.attrs.cy=ah;ad.attrs.r=af;ad.setBox({x:e-af,y:ah-af,width:af*2,height:af*2});i.canvas.appendChild(ae);return ad;};var M=function(i,ah,ag,ai,ad,e){var ae=Z(&quot;group&quot;),R=Z(e?&quot;roundrect&quot;:&quot;rect&quot;),aj=(+e||0)/(Math.min(ai,ad));R.arcsize=aj;ae.style.cssText=&quot;position:absolute;left:0;top:0;width:&quot;+i.width+&quot;px;height:&quot;+i.height+&quot;px&quot;;ae.coordsize=i.coordsize;ae.coordorigin=i.coordorigin;ae.appendChild(R);var af=new n(R,ae,i);af.type=&quot;rect&quot;;J(af,{stroke:&quot;#000&quot;});af.arcsize=aj;af.setBox({x:ah,y:ag,width:ai,height:ad,r:+e});i.canvas.appendChild(ae);return af;};var j=function(e,ai,ah,R,i){var ae=Z(&quot;group&quot;),ad=Z(&quot;oval&quot;),ag=ad.style;ae.style.cssText=&quot;position:absolute;left:0;top:0;width:&quot;+e.width+&quot;px;height:&quot;+e.height+&quot;px&quot;;ae.coordsize=e.coordsize;ae.coordorigin=e.coordorigin;ae.appendChild(ad);var af=new n(ad,ae,e);af.type=&quot;ellipse&quot;;J(af,{stroke:&quot;#000&quot;});af.attrs.cx=ai;af.attrs.cy=ah;af.attrs.rx=R;af.attrs.ry=i;af.setBox({x:ai-R,y:ah-i,width:R*2,height:i*2});e.canvas.appendChild(ae);return af;};var q=function(i,e,ai,ah,aj,ad){var ae=Z(&quot;group&quot;),R=Z(&quot;image&quot;),ag=R.style;ae.style.cssText=&quot;position:absolute;left:0;top:0;width:&quot;+i.width+&quot;px;height:&quot;+i.height+&quot;px&quot;;ae.coordsize=i.coordsize;ae.coordorigin=i.coordorigin;R.src=e;ae.appendChild(R);var af=new n(R,ae,i);af.type=&quot;image&quot;;af.attrs.src=e;af.attrs.x=ai;af.attrs.y=ah;af.attrs.w=aj;af.attrs.h=ad;af.setBox({x:ai,y:ah,width:aj,height:ad});i.canvas.appendChild(ae);return af;};var L=function(i,ai,ah,aj){var ae=Z(&quot;group&quot;),ad=Z(&quot;shape&quot;),ag=ad.style,ak=Z(&quot;path&quot;),e=ak.style,R=Z(&quot;textpath&quot;);ae.style.cssText=&quot;position:absolute;left:0;top:0;width:&quot;+i.width+&quot;px;height:&quot;+i.height+&quot;px&quot;;ae.coordsize=i.coordsize;ae.coordorigin=i.coordorigin;ak.v=f.format(&quot;m{0},{1}l{2},{1}&quot;,~~(ai+0.5),~~(ah+0.5),~~(ai+0.5)+1);ak.textpathok=true;ag.width=i.width;ag.height=i.height;R.string=aj;R.on=true;ad.appendChild(R);ad.appendChild(ak);ae.appendChild(ad);var af=new n(R,ae,i);af.shape=ad;af.textpath=ak;af.type=&quot;text&quot;;af.attrs.text=aj;af.attrs.x=ai;af.attrs.y=ah;af.attrs.w=1;af.attrs.h=1;J(af,{font:t.font,stroke:&quot;none&quot;,fill:&quot;#000&quot;});af.setBox();i.canvas.appendChild(ae);return af;};var I=function(R,e){var i=this.canvas.style;this.width=P[s](R||this.width);this.height=P[s](e||this.height);i.width=this.width+&quot;px&quot;;i.height=this.height+&quot;px&quot;;i.clip=&quot;rect(0 &quot;+this.width+&quot;px &quot;+this.height+&quot;px 0)&quot;;this.coordsize=this.width+&quot; &quot;+this.height;return this;};g.createStyleSheet().addRule(&quot;.rvml&quot;,&quot;behavior:url(#default#VML)&quot;);try{!g.namespaces.rvml&amp;&amp;g.namespaces.add(&quot;rvml&quot;,&quot;urn:schemas-microsoft-com:vml&quot;);var Z=function(e){return g.createElement(&quot;&lt;rvml:&quot;+e+' class=&quot;rvml&quot;&gt;');};}catch(Y){var Z=function(e){return g.createElement(&quot;&lt;&quot;+e+' xmlns=&quot;urn:schemas-microsoft.com:vml&quot; class=&quot;rvml&quot;&gt;');};}var m=function(){var ad=K[h](null,arguments),i=ad.container,aj=ad.height,ak,R=ad.width,ai=ad.x,ah=ad.y;if(!i){throw new Error(&quot;VML container not found.&quot;);}var af={},ag=af.canvas=g.createElement(&quot;div&quot;),ae=ag.style;R=P[s](R)||512;aj=P[s](aj)||342;af.width=R;af.height=aj;af.coordsize=R+&quot; &quot;+aj;af.coordorigin=&quot;0 0&quot;;af.span=g.createElement(&quot;span&quot;);af.span.style.cssText=&quot;position:absolute;left:-9999px;top:-9999px;padding:0;margin:0;line-height:1;display:inline;&quot;;ag.appendChild(af.span);ae.cssText=f.format(&quot;width:{0}px;height:{1}px;position:absolute;clip:rect(0 {0}px {1}px 0)&quot;,R,aj);if(i==1){g.body.appendChild(ag);ae.left=ai+&quot;px&quot;;ae.top=ah+&quot;px&quot;;i={style:{width:R,height:aj}};}else{i.style.width=R;i.style.height=aj;if(i.firstChild){i.insertBefore(ag,i.firstChild);}else{i.appendChild(ag);}}for(var e in b){if(b.hasOwnProperty(e)){af[e]=b[e];}}a.call(af,af,f.fn);af.clear=function(){while(ag.firstChild){ag.removeChild(ag.firstChild);}};af.raphael=f;return af;};b.remove=function(){this.canvas.parentNode.removeChild(this.canvas);};}if({&quot;Apple Computer, Inc.&quot;:1,&quot;Google Inc.&quot;:1}[navigator.vendor]){b.safari=function(){var e=this.rect(-99,-99,this.width+99,this.height+99);setTimeout(function(){e.remove();});};}else{b.safari=function(){};}var k=(function(){if(g.addEventListener){return function(ae,R,i,e){var ad=function(af){return i.call(e,af);};ae.addEventListener(R,ad,false);return function(){ae.removeEventListener(R,ad,false);return true;};};}else{if(g.attachEvent){return function(af,ad,R,i){var ae=function(ag){return R.call(i,ag||P.event);};af.attachEvent(&quot;on&quot;+ad,ae);var e=function(){af.detachEvent(&quot;on&quot;+ad,ae);return true;};if(ad==&quot;mouseover&quot;){af.attachEvent(&quot;onmouseenter&quot;,ae);return function(){af.detachEvent(&quot;onmouseenter&quot;,ae);return e();};}else{if(ad==&quot;mouseout&quot;){af.attachEvent(&quot;onmouseleave&quot;,ae);return function(){af.detachEvent(&quot;onmouseleave&quot;,ae);return e();};}}return e;};}}})();for(var V=y[C];V--;){(function(e){n[o][e]=function(i){if(f.is(i,&quot;function&quot;)){this.events=this.events||{};this.events[e]=this.events[e]||{};this.events[e][i]=this.events[e][i]||[];this.events[e][i].push(k(this.shape||this.node,e,i,this));}return this;};n[o][&quot;un&quot;+e]=function(i){this.events&amp;&amp;this.events[e]&amp;&amp;this.events[e][i]&amp;&amp;this.events[e][i][C]&amp;&amp;this.events[e][i].shift()()&amp;&amp;!this.events[e][i][C]&amp;&amp;delete this.events[e][i];};})(y[V]);}b.circle=function(e,R,i){return G(this,e||0,R||0,i||0);};b.rect=function(e,ae,i,R,ad){return M(this,e||0,ae||0,i||0,R||0,ad||0);};b.ellipse=function(e,ad,R,i){return j(this,e||0,ad||0,R||0,i||0);};b.path=function(e){e&amp;&amp;!f.is(e,&quot;string&quot;)&amp;&amp;!f.is(e[0],&quot;array&quot;)&amp;&amp;(e+=&quot;&quot;);return aa(f.format[h](f,arguments),this);};b.image=function(ad,e,ae,i,R){return q(this,ad||&quot;about:blank&quot;,e||0,ae||0,i||0,R||0);};b.text=function(e,R,i){return L(this,e||0,R||0,i||&quot;&quot;);};b.set=function(e){arguments[C]&gt;1&amp;&amp;(e=Array[o].splice.call(arguments,0,arguments[C]));return new l(e);};b.setSize=I;n[o].stop=function(){clearTimeout(this.animation_in_progress);return this;};n[o].scale=function(ao,an,ad,R){if(ao==null&amp;&amp;an==null){return{x:this._.sx,y:this._.sy,toString:function(){return this.x+&quot; &quot;+this.y;}};}an=an||ao;!+an&amp;&amp;(an=ao);var at,aq,ar,ap,aF=this.attrs;if(ao!=0){var al=this.getBBox(),ai=al.x+al.width/2,af=al.y+al.height/2,aE=ao/this._.sx,aD=an/this._.sy;ad=(+ad||ad==0)?ad:ai;R=(+R||R==0)?R:af;var ak=~~(ao/Math.abs(ao)),ah=~~(an/Math.abs(an)),aw=this.node.style,aH=ad+(ai-ad)*ak*aE,aG=R+(af-R)*ah*aD;switch(this.type){case&quot;rect&quot;:case&quot;image&quot;:var aj=aF.width*ak*aE,av=aF.height*ah*aD,am=aF.r*Math.min(aE,aD),ag=aH-aj/2,ae=aG-av/2;this.attr({width:aj,height:av,x:ag,y:ae,r:am});break;case&quot;circle&quot;:case&quot;ellipse&quot;:this.attr({rx:aF.rx*aE,ry:aF.ry*aD,r:aF.r*Math.min(aE,aD),cx:aH,cy:aG});break;case&quot;path&quot;:var ay=c(aF.path),az=true;for(var aB=0,au=ay[C];aB&lt;au;aB++){var ax=ay[aB];if(ax[0].toUpperCase()==&quot;M&quot;&amp;&amp;az){continue;}else{az=false;}if(f.svg&amp;&amp;ax[0].toUpperCase()==&quot;A&quot;){ax[ay[aB][C]-2]*=aE;ax[ay[aB][C]-1]*=aD;ax[1]*=aE;ax[2]*=aD;ax[5]=+(ak+ah?!!+ax[5]:!+ax[5]);}else{for(var aA=1,aC=ax[C];aA&lt;aC;aA++){ax[aA]*=(aA%2)?aE:aD;}}}var e=H(ay),at=aH-e.x-e.width/2,aq=aG-e.y-e.height/2;ay[0][1]+=at;ay[0][2]+=aq;this.attr({path:ay});break;}if(this.type in {text:1,image:1}&amp;&amp;(ak!=1||ah!=1)){if(this.transformations){this.transformations[2]=&quot;scale(&quot;.concat(ak,&quot;,&quot;,ah,&quot;)&quot;);this.node.setAttribute(&quot;transform&quot;,this.transformations.join(&quot; &quot;));at=(ak==-1)?-aF.x-(aj||0):aF.x;aq=(ah==-1)?-aF.y-(av||0):aF.y;this.attr({x:at,y:aq});aF.fx=ak-1;aF.fy=ah-1;}else{this.node.filterMatrix=&quot; progid:DXImageTransform.Microsoft.Matrix(M11=&quot;.concat(ak,&quot;, M12=0, M21=0, M22=&quot;,ah,&quot;, Dx=0, Dy=0, sizingmethod='auto expand', filtertype='bilinear')&quot;);aw.filter=(this.node.filterMatrix||&quot;&quot;)+(this.node.filterOpacity||&quot;&quot;);}}else{if(this.transformations){this.transformations[2]=&quot;&quot;;this.node.setAttribute(&quot;transform&quot;,this.transformations.join(&quot; &quot;));aF.fx=0;aF.fy=0;}else{this.node.filterMatrix=&quot;&quot;;aw.filter=(this.node.filterMatrix||&quot;&quot;)+(this.node.filterOpacity||&quot;&quot;);}}aF.scale=[ao,an,ad,R].join(&quot; &quot;);this._.sx=ao;this._.sy=an;}return this;};f.easing_formulas={linear:function(e){return e;},&quot;&lt;&quot;:function(e){return Math.pow(e,3);},&quot;&gt;&quot;:function(e){return Math.pow(e-1,3)+1;},&quot;&lt;&gt;&quot;:function(e){e=e*2;if(e&lt;1){return Math.pow(e,3)/2;}e-=2;return(Math.pow(e,3)+2)/2;},backIn:function(i){var e=1.70158;return i*i*((e+1)*i-e);},backOut:function(i){i=i-1;var e=1.70158;return i*i*((e+1)*i+e)+1;},elastic:function(R){if(R==0||R==1){return R;}var i=0.3,e=i/4;return Math.pow(2,-10*R)*Math.sin((R-e)*(2*Math.PI)/i)+1;},bounce:function(ad){var i=7.5625,R=2.75,e;if(ad&lt;(1/R)){e=i*ad*ad;}else{if(ad&lt;(2/R)){ad-=(1.5/R);e=i*ad*ad+0.75;}else{if(ad&lt;(2.5/R)){ad-=(2.25/R);e=i*ad*ad+0.9375;}else{ad-=(2.625/R);e=i*ad*ad+0.984375;}}}return e;}};n[o].animate=function(ax,an,am,ae){clearTimeout(this.animation_in_progress);if(f.is(am,&quot;function&quot;)||!am){ae=am||null;}var aq={},R={},ak={},aj={x:0,y:0};for(var ao in ax){if(ax.hasOwnProperty(ao)){if(ao in x){aq[ao]=this.attr(ao);(aq[ao]==null)&amp;&amp;(aq[ao]=t[ao]);R[ao]=ax[ao];switch(x[ao]){case&quot;number&quot;:ak[ao]=(R[ao]-aq[ao])/an;break;case&quot;colour&quot;:aq[ao]=f.getRGB(aq[ao]);var ap=f.getRGB(R[ao]);ak[ao]={r:(ap.r-aq[ao].r)/an,g:(ap.g-aq[ao].g)/an,b:(ap.b-aq[ao].b)/an};break;case&quot;path&quot;:var af=T(aq[ao],R[ao]);aq[ao]=af[0];R[ao]=af[1];ak[ao]=[];for(var at=0,ai=aq[ao][C];at&lt;ai;at++){ak[ao][at]=[0];for(var ar=1,av=aq[ao][at][C];ar&lt;av;ar++){ak[ao][at][ar]=(R[ao][at][ar]-aq[ao][at][ar])/an;}}break;case&quot;csv&quot;:var e=(ax[ao]+&quot;&quot;).split(ac),ah=(aq[ao]+&quot;&quot;).split(ac);switch(ao){case&quot;translation&quot;:aq[ao]=[0,0];ak[ao]=[e[0]/an,e[1]/an];break;case&quot;rotation&quot;:aq[ao]=(ah[1]==e[1]&amp;&amp;ah[2]==e[2])?ah:[0,e[1],e[2]];ak[ao]=[(e[0]-aq[ao][0])/an,0,0];break;case&quot;scale&quot;:ax[ao]=e;aq[ao]=(aq[ao]+&quot;&quot;).split(ac);ak[ao]=[(e[0]-aq[ao][0])/an,(e[1]-aq[ao][1])/an,0,0];break;case&quot;clip-rect&quot;:aq[ao]=(aq[ao]+&quot;&quot;).split(ac);ak[ao]=[];var at=4;while(at--){ak[ao][at]=(e[at]-aq[ao][at])/an;}break;}R[ao]=e;}}}}var ad=+new Date,al=0,aw=function(i){return i&gt;255?255:i;},ag=this;(function au(){var az=new Date-ad,aH={},ay;if(az&lt;an){var aF=f.easing_formulas[am]?f.easing_formulas[am](az/an):az/an;for(var aD in aq){if(aq.hasOwnProperty(aD)){switch(x[aD]){case&quot;number&quot;:ay=+aq[aD]+aF*an*ak[aD];break;case&quot;colour&quot;:ay=&quot;rgb(&quot;+[aw(~~(aq[aD].r+aF*an*ak[aD].r+0.5)),aw(~~(aq[aD].g+aF*an*ak[aD].g+0.5)),aw(~~(aq[aD].b+aF*an*ak[aD].b+0.5))].join(&quot;,&quot;)+&quot;)&quot;;break;case&quot;path&quot;:ay=[];for(var aB=0,aI=aq[aD][C];aB&lt;aI;aB++){ay[aB]=[aq[aD][aB][0]];for(var aA=1,aC=aq[aD][aB][C];aA&lt;aC;aA++){ay[aB][aA]=+aq[aD][aB][aA]+aF*an*ak[aD][aB][aA];}ay[aB]=ay[aB].join(&quot; &quot;);}ay=ay.join(&quot; &quot;);break;case&quot;csv&quot;:switch(aD){case&quot;translation&quot;:var aG=ak[aD][0]*(az-al),aE=ak[aD][1]*(az-al);aj.x+=aG;aj.y+=aE;ay=[aG,aE].join(&quot; &quot;);break;case&quot;rotation&quot;:ay=+aq[aD][0]+aF*an*ak[aD][0];aq[aD][1]&amp;&amp;(ay+=&quot;,&quot;+aq[aD][1]+&quot;,&quot;+aq[aD][2]);break;case&quot;scale&quot;:ay=[+aq[aD][0]+aF*an*ak[aD][0],+aq[aD][1]+aF*an*ak[aD][1],(2 in ax[aD]?ax[aD][2]:&quot;&quot;),(3 in ax[aD]?ax[aD][3]:&quot;&quot;)].join(&quot; &quot;);break;case&quot;clip-rect&quot;:ay=[];var aB=4;while(aB--){ay[aB]=+aq[aD][aB]+aF*an*ak[aD][aB];}break;}break;}aH[aD]=ay;}}ag.attr(aH);ag.animation_in_progress=setTimeout(au);f.svg&amp;&amp;b.safari();}else{(aj.x||aj.y)&amp;&amp;ag.translate(-aj.x,-aj.y);ag.attr(ax);clearTimeout(ag.animation_in_progress);f.svg&amp;&amp;b.safari();(f.is(ae,&quot;function&quot;))&amp;&amp;ae.call(ag);}al=az;})();return this;};n[o].translate=function(e,R){if(e==null){return{x:this._.tx,y:this._.ty};}this._.tx+=+e;this._.ty+=+R;switch(this.type){case&quot;circle&quot;:case&quot;ellipse&quot;:this.attr({cx:+e+this.attrs.cx,cy:+R+this.attrs.cy});break;case&quot;rect&quot;:case&quot;image&quot;:case&quot;text&quot;:this.attr({x:+e+this.attrs.x,y:+R+this.attrs.y});break;case&quot;path&quot;:var i=c(this.attrs.path);i[0][1]+=+e;i[0][2]+=+R;this.attr({path:i});break;}return this;};n[o].toString=function(){return&quot;Rapha\u00ebl\u2019s object&quot;;};var l=function(e){this.items=[];this[C]=0;if(e){for(var R=0,ad=e[C];R&lt;ad;R++){if(e[R]&amp;&amp;(e[R].constructor==n||e[R].constructor==l)){this[this.items[C]]=this.items[this.items[C]]=e[R];this[C]++;}}}};l[o].push=function(){var ae,e;for(var R=0,ad=arguments[C];R&lt;ad;R++){ae=arguments[R];if(ae&amp;&amp;(ae.constructor==n||ae.constructor==l)){e=this.items[C];this[e]=this.items[e]=ae;this[C]++;}}return this;};l[o].pop=function(){delete this[this[C]--];return this.items.pop();};for(var W in n[o]){if(n[o].hasOwnProperty(W)){l[o][W]=(function(e){return function(){for(var R=0,ad=this.items[C];R&lt;ad;R++){this.items[R][e][h](this.items[R],arguments);}return this;};})(W);}}l[o].attr=function(R,ag){if(R&amp;&amp;f.is(R,&quot;array&quot;)&amp;&amp;f.is(R[0],&quot;object&quot;)){for(var e=0,af=R[C];e&lt;af;e++){this.items[e].attr(R[e]);}}else{for(var ad=0,ae=this.items[C];ad&lt;ae;ad++){this.items[ad].attr[h](this.items[ad],arguments);}}return this;};l[o].animate=function(af,R,ai,ah){if(f.is(ai,&quot;function&quot;)||!ai){ah=ai||null;}var e=this.items[C],ad=e,ag=this;if(ah){var ae=function(){!--e&amp;&amp;ah.call(ag);};while(ad--){this.items[ad].animate(af,R,ai||ae,ae);}}else{while(ad--){this.items[ad].animate(af,R,ai);}}return this;};l[o].getBBox=function(){var e=[],ag=[],R=[],ae=[];for(var ad=this.items[C];ad--;){var af=this.items[ad].getBBox();e.push(af.x);ag.push(af.y);R.push(af.x+af.width);ae.push(af.y+af.height);}e=Math.min[h](Math,e);ag=Math.min[h](Math,ag);return{x:e,y:ag,width:Math.max[h](Math,R)-e,height:Math.max[h](Math,ae)-ag};};f.registerFont=function(i){if(!i.face){return i;}this.fonts=this.fonts||{};var ad={w:i.w,face:{},glyphs:{}},R=i.face[&quot;font-family&quot;];for(var ag in i.face){if(i.face.hasOwnProperty(ag)){ad.face[ag]=i.face[ag];}}if(this.fonts[R]){this.fonts[R].push(ad);}else{this.fonts[R]=[ad];}if(!i.svg){ad.face[&quot;units-per-em&quot;]=P[r](i.face[&quot;units-per-em&quot;],10);for(var ae in i.glyphs){if(i.glyphs.hasOwnProperty(ae)){var af=i.glyphs[ae];ad.glyphs[ae]={w:af.w,k:{},d:af.d&amp;&amp;&quot;M&quot;+af.d.replace(/[mlcxtrv]/g,function(ah){return{l:&quot;L&quot;,c:&quot;C&quot;,x:&quot;z&quot;,t:&quot;m&quot;,r:&quot;l&quot;,v:&quot;c&quot;}[ah]||&quot;M&quot;;})+&quot;z&quot;};if(af.k){for(var e in af.k){if(af.hasOwnProperty(e)){ad.glyphs[ae].k[e]=af.k[e];}}}}}}return i;};b.getFont=function(ai,aj,R,ae){ae=ae||&quot;normal&quot;;R=R||&quot;normal&quot;;aj=+aj||{normal:400,bold:700,lighter:300,bolder:800}[aj]||400;var af=f.fonts[ai];if(!af){var ad=new RegExp(&quot;(^|\\s)&quot;+ai.replace(/[^\w\d\s+!~.:_-]/g,&quot;&quot;)+&quot;(\\s|$)&quot;,&quot;i&quot;);for(var e in f.fonts){if(f.fonts.hasOwnProperty(e)){if(ad.test(e)){af=f.fonts[e];break;}}}}var ag;if(af){for(var ah=0,ak=af[C];ah&lt;ak;ah++){ag=af[ah];if(ag.face[&quot;font-weight&quot;]==aj&amp;&amp;(ag.face[&quot;font-style&quot;]==R||!ag.face[&quot;font-style&quot;])&amp;&amp;ag.face[&quot;font-stretch&quot;]==ae){break;}}}return ag;};b.print=function(ak,aj,ah,R,ao){var af=this.set(),ai=(ah+&quot;&quot;).split(&quot;&quot;),e=0,an=&quot;&quot;,ae;f.is(R,&quot;string&quot;)&amp;&amp;(R=this.getFont(R));if(R){ae=(ao||16)/R.face[&quot;units-per-em&quot;];for(var ag=0,al=ai[C];ag&lt;al;ag++){var ad=ag&amp;&amp;R.glyphs[ai[ag-1]]||{},am=R.glyphs[ai[ag]];e+=ag?(ad.w||R.w)+(ad.k&amp;&amp;ad.k[ai[ag]]||0):0;am&amp;&amp;am.d&amp;&amp;af.push(this.path(am.d).attr({fill:&quot;#000&quot;,stroke:&quot;none&quot;,translation:[e,0]}));}af.scale(ae,ae,0,aj).translate(ak,(ao||16)/2);}return af;};f.format=function(i){var e=f.is(arguments[1],&quot;array&quot;)?[0].concat(arguments[1]):arguments;i&amp;&amp;f.is(i,&quot;string&quot;)&amp;&amp;e[C]-1&amp;&amp;(i=i.replace(/\{(\d+)\}/g,function(ad,R){return e[++R]==null?&quot;&quot;:e[R];}));return i||&quot;&quot;;};f.ninja=function(){var R=window.Raphael,i;if(U.was){window.Raphael=U.is;}else{try{delete window.Raphael;}catch(ad){window.Raphael=i;}}return R;};f.el=n[o];return f;})();
\ No newline at end of file
+window.Raphael=(function(){var at=/[, ]+/,m=document,ad=window,aj={was:&quot;Raphael&quot; in ad,is:ad.Raphael},l=function(){if(l.is(arguments[0],&quot;array&quot;)){var e=arguments[0],E=q[ao](l,e.splice(0,3+l.is(e[0],ah))),av=E.set();for(var au=0,aw=e[z];au&lt;aw;au++){var R=e[au]||{};({circle:1,rect:1,path:1,ellipse:1,text:1,image:1}[h](R.type))&amp;&amp;av[ae](E[R.type]().attr(R));}return av;}return q[ao](l,arguments);},d={},G=[&quot;click&quot;,&quot;dblclick&quot;,&quot;mousedown&quot;,&quot;mousemove&quot;,&quot;mouseout&quot;,&quot;mouseover&quot;,&quot;mouseup&quot;],w=&quot;&quot;,h=&quot;hasOwnProperty&quot;,v=&quot;prototype&quot;,f=&quot;setAttribute&quot;,c=&quot;appendChild&quot;,ao=&quot;apply&quot;,z=&quot;length&quot;,t=&quot;join&quot;,H=&quot;split&quot;,J=&quot;concat&quot;,ae=&quot;push&quot;,b=parseFloat,u=parseInt,L=Math.pow,V=Math.min,r=Math.max,ai=Math.round,Y=/^(?=[\da-f]$)/,ah=&quot;number&quot;,j=&quot;toString&quot;,A={&quot;clip-rect&quot;:&quot;0 0 10e9 10e9&quot;,cx:0,cy:0,fill:&quot;#fff&quot;,&quot;fill-opacity&quot;:1,font:'10px &quot;Arial&quot;',&quot;font-family&quot;:'&quot;Arial&quot;',&quot;font-size&quot;:&quot;10&quot;,&quot;font-style&quot;:&quot;normal&quot;,&quot;font-weight&quot;:400,gradient:0,height:0,href:&quot;http://raphaeljs.com/&quot;,opacity:1,path:&quot;M0,0&quot;,r:0,rotation:0,rx:0,ry:0,scale:&quot;1 1&quot;,src:&quot;&quot;,stroke:&quot;#000&quot;,&quot;stroke-dasharray&quot;:&quot;&quot;,&quot;stroke-linecap&quot;:&quot;butt&quot;,&quot;stroke-linejoin&quot;:&quot;butt&quot;,&quot;stroke-miterlimit&quot;:0,&quot;stroke-opacity&quot;:1,&quot;stroke-width&quot;:1,target:&quot;_blank&quot;,&quot;text-anchor&quot;:&quot;middle&quot;,title:&quot;Raphael&quot;,translation:&quot;0 0&quot;,width:0,x:0,y:0},F={&quot;clip-rect&quot;:&quot;csv&quot;,cx:ah,cy:ah,fill:&quot;colour&quot;,&quot;fill-opacity&quot;:ah,&quot;font-size&quot;:ah,height:ah,opacity:ah,path:&quot;path&quot;,r:ah,rotation:&quot;csv&quot;,rx:ah,ry:ah,scale:&quot;csv&quot;,stroke:&quot;colour&quot;,&quot;stroke-opacity&quot;:ah,&quot;stroke-width&quot;:ah,translation:&quot;csv&quot;,width:ah,x:ah,y:ah},Q=&quot;replace&quot;;l.version=&quot;1.1&quot;;l.type=(ad.SVGAngle||m.implementation.hasFeature(&quot;http://www.w3.org/TR/SVG11/feature#BasicStructure&quot;,&quot;1.1&quot;)?&quot;SVG&quot;:&quot;VML&quot;);l.svg=!(l.vml=l.type==&quot;VML&quot;);l.idGenerator=0;l.fn={};l.is=function(i,e){e=(e+w).toLowerCase();if((e==&quot;object&quot;||e==&quot;undefined&quot;)&amp;&amp;typeof i==e){return true;}if(i==null&amp;&amp;e==&quot;null&quot;){return true;}return Object[v][j].call(i)[Q](/^\[object\s+|\]$/gi,w).toLowerCase()==e;};l.setWindow=function(e){ad=e;m=ad.document;};l.hsb2rgb=ar(function(az,ax,aD){if(l.is(az,&quot;object&quot;)&amp;&amp;&quot;h&quot; in az&amp;&amp;&quot;s&quot; in az&amp;&amp;&quot;b&quot; in az){aD=az.b;ax=az.s;az=az.h;}var au,av,aE;if(aD==0){return{r:0,g:0,b:0,hex:&quot;#000&quot;};}if(az&gt;1||ax&gt;1||aD&gt;1){az/=255;ax/=255;aD/=255;}var aw=~~(az*6),aA=(az*6)-aw,R=aD*(1-ax),E=aD*(1-(ax*aA)),aF=aD*(1-(ax*(1-aA)));au=[aD,E,R,R,aF,aD,aD][aw];av=[aF,aD,aD,E,R,R,aF][aw];aE=[R,R,aF,aD,aD,E,R][aw];au*=255;av*=255;aE*=255;var aB={r:au,g:av,b:aE},e=(~~au)[j](16),ay=(~~av)[j](16),aC=(~~aE)[j](16);e=e[Q](Y,&quot;0&quot;);ay=ay[Q](Y,&quot;0&quot;);aC=aC[Q](Y,&quot;0&quot;);aB.hex=&quot;#&quot;+e+ay+aC;return aB;},l);l.rgb2hsb=ar(function(e,i,ax){if(l.is(e,&quot;object&quot;)&amp;&amp;&quot;r&quot; in e&amp;&amp;&quot;g&quot; in e&amp;&amp;&quot;b&quot; in e){ax=e.b;i=e.g;e=e.r;}if(l.is(e,&quot;string&quot;)){var az=l.getRGB(e);e=az.r;i=az.g;ax=az.b;}if(e&gt;1||i&gt;1||ax&gt;1){e/=255;i/=255;ax/=255;}var aw=r(e,i,ax),E=V(e,i,ax),au,R,av=aw;if(E==aw){return{h:0,s:0,b:aw};}else{var ay=(aw-E);R=ay/aw;if(e==aw){au=(i-ax)/ay;}else{if(i==aw){au=2+((ax-e)/ay);}else{au=4+((e-i)/ay);}}au/=6;if(au&lt;0){au+=1;}if(au&gt;1){au-=1;}}return{h:au,s:R,b:av};},l);l._path2string=function(){var R=w,aw;for(var E=0,au=this[z];E&lt;au;E++){for(var e=0,av=this[E][z];e&lt;av;e++){R+=this[E][e];e&amp;&amp;e!=av-1&amp;&amp;(R+=&quot;,&quot;);}E!=au-1&amp;&amp;(R+=&quot; &quot;);}return R[Q](/,(?=-)/g,w);};function ar(R,i,e){function E(){var au=Array[v].splice.call(arguments,0,arguments[z]),av=au[t](&quot;\u25ba&quot;);E.cache=E.cache||{};E.count=E.count||[];if(av in E.cache){return e?e(E.cache[av]):E.cache[av];}if(E.count[z]&gt;=1000){delete E.cache[E.count.shift()];}E.count[ae](av);E.cache[av]=R[ao](i,au);return e?e(E.cache[av]):E.cache[av];}return E;}l.getRGB=ar(function(e){var az={none:&quot;none&quot;,aliceblue:&quot;#f0f8ff&quot;,amethyst:&quot;#96c&quot;,antiquewhite:&quot;#faebd7&quot;,aqua:&quot;#0ff&quot;,aquamarine:&quot;#7fffd4&quot;,azure:&quot;#f0ffff&quot;,beige:&quot;#f5f5dc&quot;,bisque:&quot;#ffe4c4&quot;,black:&quot;#000&quot;,blanchedalmond:&quot;#ffebcd&quot;,blue:&quot;#00f&quot;,blueviolet:&quot;#8a2be2&quot;,brown:&quot;#a52a2a&quot;,burlywood:&quot;#deb887&quot;,cadetblue:&quot;#5f9ea0&quot;,chartreuse:&quot;#7fff00&quot;,chocolate:&quot;#d2691e&quot;,coral:&quot;#ff7f50&quot;,cornflowerblue:&quot;#6495ed&quot;,cornsilk:&quot;#fff8dc&quot;,crimson:&quot;#dc143c&quot;,cyan:&quot;#0ff&quot;,darkblue:&quot;#00008b&quot;,darkcyan:&quot;#008b8b&quot;,darkgoldenrod:&quot;#b8860b&quot;,darkgray:&quot;#a9a9a9&quot;,darkgreen:&quot;#006400&quot;,darkkhaki:&quot;#bdb76b&quot;,darkmagenta:&quot;#8b008b&quot;,darkolivegreen:&quot;#556b2f&quot;,darkorange:&quot;#ff8c00&quot;,darkorchid:&quot;#9932cc&quot;,darkred:&quot;#8b0000&quot;,darksalmon:&quot;#e9967a&quot;,darkseagreen:&quot;#8fbc8f&quot;,darkslateblue:&quot;#483d8b&quot;,darkslategray:&quot;#2f4f4f&quot;,darkturquoise:&quot;#00ced1&quot;,darkviolet:&quot;#9400d3&quot;,deeppink:&quot;#ff1493&quot;,deepskyblue:&quot;#00bfff&quot;,dimgray:&quot;#696969&quot;,dodgerblue:&quot;#1e90ff&quot;,firebrick:&quot;#b22222&quot;,floralwhite:&quot;#fffaf0&quot;,forestgreen:&quot;#228b22&quot;,fuchsia:&quot;#f0f&quot;,gainsboro:&quot;#dcdcdc&quot;,ghostwhite:&quot;#f8f8ff&quot;,gold:&quot;#ffd700&quot;,goldenrod:&quot;#daa520&quot;,gray:&quot;#808080&quot;,green:&quot;#008000&quot;,greenyellow:&quot;#adff2f&quot;,honeydew:&quot;#f0fff0&quot;,hotpink:&quot;#ff69b4&quot;,indianred:&quot;#cd5c5c&quot;,indigo:&quot;#4b0082&quot;,ivory:&quot;#fffff0&quot;,khaki:&quot;#f0e68c&quot;,lavender:&quot;#e6e6fa&quot;,lavenderblush:&quot;#fff0f5&quot;,lawngreen:&quot;#7cfc00&quot;,lemonchiffon:&quot;#fffacd&quot;,lightblue:&quot;#add8e6&quot;,lightcoral:&quot;#f08080&quot;,lightcyan:&quot;#e0ffff&quot;,lightgoldenrodyellow:&quot;#fafad2&quot;,lightgreen:&quot;#90ee90&quot;,lightgrey:&quot;#d3d3d3&quot;,lightpink:&quot;#ffb6c1&quot;,lightsalmon:&quot;#ffa07a&quot;,lightsalmon:&quot;#ffa07a&quot;,lightseagreen:&quot;#20b2aa&quot;,lightskyblue:&quot;#87cefa&quot;,lightslategray:&quot;#789&quot;,lightsteelblue:&quot;#b0c4de&quot;,lightyellow:&quot;#ffffe0&quot;,lime:&quot;#0f0&quot;,limegreen:&quot;#32cd32&quot;,linen:&quot;#faf0e6&quot;,magenta:&quot;#f0f&quot;,maroon:&quot;#800000&quot;,mediumaquamarine:&quot;#66cdaa&quot;,mediumblue:&quot;#0000cd&quot;,mediumorchid:&quot;#ba55d3&quot;,mediumpurple:&quot;#9370db&quot;,mediumseagreen:&quot;#3cb371&quot;,mediumslateblue:&quot;#7b68ee&quot;,mediumslateblue:&quot;#7b68ee&quot;,mediumspringgreen:&quot;#00fa9a&quot;,mediumturquoise:&quot;#48d1cc&quot;,mediumvioletred:&quot;#c71585&quot;,midnightblue:&quot;#191970&quot;,mintcream:&quot;#f5fffa&quot;,mistyrose:&quot;#ffe4e1&quot;,moccasin:&quot;#ffe4b5&quot;,navajowhite:&quot;#ffdead&quot;,navy:&quot;#000080&quot;,oldlace:&quot;#fdf5e6&quot;,olive:&quot;#808000&quot;,olivedrab:&quot;#6b8e23&quot;,orange:&quot;#ffa500&quot;,orangered:&quot;#ff4500&quot;,orchid:&quot;#da70d6&quot;,palegoldenrod:&quot;#eee8aa&quot;,palegreen:&quot;#98fb98&quot;,paleturquoise:&quot;#afeeee&quot;,palevioletred:&quot;#db7093&quot;,papayawhip:&quot;#ffefd5&quot;,peachpuff:&quot;#ffdab9&quot;,peru:&quot;#cd853f&quot;,pink:&quot;#ffc0cb&quot;,plum:&quot;#dda0dd&quot;,powderblue:&quot;#b0e0e6&quot;,purple:&quot;#800080&quot;,red:&quot;#f00&quot;,rosybrown:&quot;#bc8f8f&quot;,royalblue:&quot;#4169e1&quot;,saddlebrown:&quot;#8b4513&quot;,salmon:&quot;#fa8072&quot;,sandybrown:&quot;#f4a460&quot;,seagreen:&quot;#2e8b57&quot;,seashell:&quot;#fff5ee&quot;,sienna:&quot;#a0522d&quot;,silver:&quot;#c0c0c0&quot;,skyblue:&quot;#87ceeb&quot;,slateblue:&quot;#6a5acd&quot;,slategray:&quot;#708090&quot;,snow:&quot;#fffafa&quot;,springgreen:&quot;#00ff7f&quot;,steelblue:&quot;#4682b4&quot;,tan:&quot;#d2b48c&quot;,teal:&quot;#008080&quot;,thistle:&quot;#d8bfd8&quot;,tomato:&quot;#ff6347&quot;,turquoise:&quot;#40e0d0&quot;,violet:&quot;#ee82ee&quot;,wheat:&quot;#f5deb3&quot;,white:&quot;#fff&quot;,whitesmoke:&quot;#f5f5f5&quot;,yellow:&quot;#ff0&quot;,yellowgreen:&quot;#9acd32&quot;},av;e=az[(e+w).toLowerCase()]||e;if(!e){return{r:-1,g:-1,b:-1,hex:&quot;none&quot;,error:1};}if(e==&quot;none&quot;){return{r:-1,g:-1,b:-1,hex:&quot;none&quot;};}var E,R,ay,aw=(e+w).match(/^\s*((#[a-f\d]{6})|(#[a-f\d]{3})|rgb\(\s*([\d\.]+\s*,\s*[\d\.]+\s*,\s*[\d\.]+)\s*\)|rgb\(\s*([\d\.]+%\s*,\s*[\d\.]+%\s*,\s*[\d\.]+%)\s*\)|hs[bl]\(\s*([\d\.]+\s*,\s*[\d\.]+\s*,\s*[\d\.]+)\s*\)|hs[bl]\(\s*([\d\.]+%\s*,\s*[\d\.]+%\s*,\s*[\d\.]+%)\s*\))\s*$/i);if(aw){if(aw[2]){ay=u(aw[2].substring(5),16);R=u(aw[2].substring(3,5),16);E=u(aw[2].substring(1,3),16);}if(aw[3]){ay=u(aw[3].substring(3)+aw[3].substring(3),16);R=u(aw[3].substring(2,3)+aw[3].substring(2,3),16);E=u(aw[3].substring(1,2)+aw[3].substring(1,2),16);}if(aw[4]){aw=aw[4][H](/\s*,\s*/);E=b(aw[0]);R=b(aw[1]);ay=b(aw[2]);}if(aw[5]){aw=aw[5][H](/\s*,\s*/);E=b(aw[0])*2.55;R=b(aw[1])*2.55;ay=b(aw[2])*2.55;}if(aw[6]){aw=aw[6][H](/\s*,\s*/);E=b(aw[0]);R=b(aw[1]);ay=b(aw[2]);return l.hsb2rgb(E,R,ay);}if(aw[7]){aw=aw[7][H](/\s*,\s*/);E=b(aw[0])*2.55;R=b(aw[1])*2.55;ay=b(aw[2])*2.55;return l.hsb2rgb(E,R,ay);}aw={r:E,g:R,b:ay};var i=(~~E)[j](16),au=(~~R)[j](16),ax=(~~ay)[j](16);i=i[Q](Y,&quot;0&quot;);au=au[Q](Y,&quot;0&quot;);ax=ax[Q](Y,&quot;0&quot;);aw.hex=&quot;#&quot;+i+au+ax;av=aw;}else{av={r:-1,g:-1,b:-1,hex:&quot;none&quot;,error:1};}return av;},l);l.getColor=function(i){var E=this.getColor.start=this.getColor.start||{h:0,s:1,b:i||0.75},e=this.hsb2rgb(E.h,E.s,E.b);E.h+=0.075;if(E.h&gt;1){E.h=0;E.s-=0.2;if(E.s&lt;=0){this.getColor.start={h:0,s:1,b:E.b};}}return e.hex;};l.getColor.reset=function(){delete this.start;};l.parsePathString=ar(function(e){if(!e){return null;}var E={a:7,c:6,h:1,l:2,m:2,q:4,s:4,t:2,v:1,z:0},i=[];if(l.is(e,&quot;array&quot;)&amp;&amp;l.is(e[0],&quot;array&quot;)){i=D(e);}if(!i[z]){(e+w)[Q](/([achlmqstvz])[\s,]*((-?\d*\.?\d*(?:e[-+]?\d+)?\s*,?\s*)+)/ig,function(au,R,ax){var aw=[],av=R.toLowerCase();ax[Q](/(-?\d*\.?\d*(?:e[-+]?\d+)?)\s*,?\s*/ig,function(az,ay){ay&amp;&amp;aw[ae](+ay);});while(aw[z]&gt;=E[av]){i[ae]([R][J](aw.splice(0,E[av])));if(!E[av]){break;}}});}i[j]=l._path2string;return i;});var T=ar(function(aA){if(!aA){return{x:0,y:0,width:0,height:0};}aA=ag(aA);var ax=0,aw=0,R=[],E=[];for(var au=0,az=aA[z];au&lt;az;au++){if(aA[au][0]==&quot;M&quot;){ax=aA[au][1];aw=aA[au][2];R[ae](ax);E[ae](aw);}else{var av=ab(ax,aw,aA[au][1],aA[au][2],aA[au][3],aA[au][4],aA[au][5],aA[au][6]);R=R[J](av.min.x,av.max.x);E=E[J](av.min.y,av.max.y);}}var e=V[ao](0,R),ay=V[ao](0,E);return{x:e,y:ay,width:r[ao](0,R)-e,height:r[ao](0,E)-ay};}),D=function(aw){var R=[];if(!l.is(aw,&quot;array&quot;)||!l.is(aw&amp;&amp;aw[0],&quot;array&quot;)){aw=l.parsePathString(aw);}for(var E=0,au=aw[z];E&lt;au;E++){R[E]=[];for(var e=0,av=aw[E][z];e&lt;av;e++){R[E][e]=aw[E][e];}}R[j]=l._path2string;return R;},g=ar(function(au){if(!l.is(au,&quot;array&quot;)||!l.is(au&amp;&amp;au[0],&quot;array&quot;)){au=l.parsePathString(au);}var aA=[],aC=0,aB=0,aF=0,aE=0,R=0;if(au[0][0]==&quot;M&quot;){aC=au[0][1];aB=au[0][2];aF=aC;aE=aB;R++;aA[ae]([&quot;M&quot;,aC,aB]);}for(var ax=R,aG=au[z];ax&lt;aG;ax++){var e=aA[ax]=[],aD=au[ax];if(aD[0]!=aD[0].toLowerCase()){e[0]=aD[0].toLowerCase();switch(e[0]){case&quot;a&quot;:e[1]=aD[1];e[2]=aD[2];e[3]=aD[3];e[4]=aD[4];e[5]=aD[5];e[6]=+(aD[6]-aC).toFixed(3);e[7]=+(aD[7]-aB).toFixed(3);break;case&quot;v&quot;:e[1]=+(aD[1]-aB).toFixed(3);break;case&quot;m&quot;:aF=aD[1];aE=aD[2];default:for(var aw=1,ay=aD[z];aw&lt;ay;aw++){e[aw]=+(aD[aw]-((aw%2)?aC:aB)).toFixed(3);}}}else{e=aA[ax]=[];if(aD[0]==&quot;m&quot;){aF=aD[1]+aC;aE=aD[2]+aB;}for(var av=0,E=aD[z];av&lt;E;av++){aA[ax][av]=aD[av];}}var az=aA[ax][z];switch(aA[ax][0]){case&quot;z&quot;:aC=aF;aB=aE;break;case&quot;h&quot;:aC+=+aA[ax][az-1];break;case&quot;v&quot;:aB+=+aA[ax][az-1];break;default:aC+=+aA[ax][az-2];aB+=+aA[ax][az-1];}}aA[j]=l._path2string;return aA;},0,D),I=ar(function(au){if(!l.is(au,&quot;array&quot;)||!l.is(au&amp;&amp;au[0],&quot;array&quot;)){au=l.parsePathString(au);}var az=[],aB=0,aA=0,aE=0,aD=0,R=0;if(au[0][0]==&quot;M&quot;){aB=+au[0][1];aA=+au[0][2];aE=aB;aD=aA;R++;az[0]=[&quot;M&quot;,aB,aA];}for(var ax=R,aF=au[z];ax&lt;aF;ax++){var e=az[ax]=[],aC=au[ax];if(aC[0]!=(aC[0]+w).toUpperCase()){e[0]=(aC[0]+w).toUpperCase();switch(e[0]){case&quot;A&quot;:e[1]=aC[1];e[2]=aC[2];e[3]=aC[3];e[4]=aC[4];e[5]=aC[5];e[6]=+(aC[6]+aB);e[7]=+(aC[7]+aA);break;case&quot;V&quot;:e[1]=+aC[1]+aA;break;case&quot;H&quot;:e[1]=+aC[1]+aB;break;case&quot;M&quot;:aE=+aC[1]+aB;aD=+aC[2]+aA;default:for(var aw=1,ay=aC[z];aw&lt;ay;aw++){e[aw]=+aC[aw]+((aw%2)?aB:aA);}}}else{for(var av=0,E=aC[z];av&lt;E;av++){az[ax][av]=aC[av];}}switch(e[0]){case&quot;Z&quot;:aB=aE;aA=aD;break;case&quot;H&quot;:aB=e[1];break;case&quot;V&quot;:aA=e[1];break;default:aB=az[ax][az[ax][z]-2];aA=az[ax][az[ax][z]-1];}}az[j]=l._path2string;return az;},null,D),k=function(i,R,e,E){return[i,R,e,E,e,E];},K=function(i,R,aw,au,e,E){var av=1/3,az=2/3;return[av*i+az*aw,av*R+az*au,av*e+az*aw,av*E+az*au,e,E];},B=function(aF,a9,aO,aM,aG,aA,av,aE,a8,aH){var au=Math.PI,aL=au*120/180,e=au/180*(+aG||0),aS=[],aP,a5=ar(function(ba,bd,i){var bc=ba*Math.cos(i)-bd*Math.sin(i),bb=ba*Math.sin(i)+bd*Math.cos(i);return{x:bc,y:bb};});if(!aH){aP=a5(aF,a9,-e);aF=aP.x;a9=aP.y;aP=a5(aE,a8,-e);aE=aP.x;a8=aP.y;var E=Math.cos(au/180*aG),aC=Math.sin(au/180*aG),aU=(aF-aE)/2,aT=(a9-a8)/2;aO=r(aO,Math.abs(aU));aM=r(aM,Math.abs(aT));var R=aO*aO,aX=aM*aM,aZ=(aA==av?-1:1)*Math.sqrt(Math.abs((R*aX-R*aT*aT-aX*aU*aU)/(R*aT*aT+aX*aU*aU))),aJ=aZ*aO*aT/aM+(aF+aE)/2,aI=aZ*-aM*aU/aO+(a9+a8)/2,az=Math.asin((a9-aI)/aM),ay=Math.asin((a8-aI)/aM);az=aF&lt;aJ?au-az:az;ay=aE&lt;aJ?au-ay:ay;az&lt;0&amp;&amp;(az=au*2+az);ay&lt;0&amp;&amp;(ay=au*2+ay);if(av&amp;&amp;az&gt;ay){az=az-au*2;}if(!av&amp;&amp;ay&gt;az){ay=ay-au*2;}}else{az=aH[0];ay=aH[1];aJ=aH[2];aI=aH[3];}var aD=ay-az;if(Math.abs(aD)&gt;aL){var aK=ay,aN=aE,aB=a8;ay=az+aL*(av&amp;&amp;ay&gt;az?1:-1);aE=aJ+aO*Math.cos(ay);a8=aI+aM*Math.sin(ay);aS=B(aE,a8,aO,aM,aG,0,av,aN,aB,[ay,aK,aJ,aI]);}aD=ay-az;var ax=Math.cos(az),a7=Math.sin(az),aw=Math.cos(ay),a6=Math.sin(ay),aV=Math.tan(aD/4),aY=4/3*aO*aV,aW=4/3*aM*aV,a4=[aF,a9],a3=[aF+aY*a7,a9-aW*ax],a2=[aE+aY*a6,a8-aW*aw],a0=[aE,a8];a3[0]=2*a4[0]-a3[0];a3[1]=2*a4[1]-a3[1];if(aH){return[a3,a2,a0][J](aS);}else{aS=[a3,a2,a0][J](aS)[t](&quot;,&quot;)[H](&quot;,&quot;);var aQ=[];for(var a1=0,aR=aS[z];a1&lt;aR;a1++){aQ[a1]=a1%2?a5(aS[a1-1],aS[a1],e).y:a5(aS[a1],aS[a1+1],e).x;}return aQ;}},O=ar(function(i,e,aK,aI,av,au,az,aw,aE){var aC=L(1-aE,3)*i+L(1-aE,2)*3*aE*aK+(1-aE)*3*aE*aE*av+L(aE,3)*az,aA=L(1-aE,3)*e+L(1-aE,2)*3*aE*aI+(1-aE)*3*aE*aE*au+L(aE,3)*aw,aG=i+2*aE*(aK-i)+aE*aE*(av-2*aK+i),aF=e+2*aE*(aI-e)+aE*aE*(au-2*aI+e),aJ=aK+2*aE*(av-aK)+aE*aE*(az-2*av+aK),aH=aI+2*aE*(au-aI)+aE*aE*(aw-2*au+aI),aD=(1-aE)*i+aE*aK,aB=(1-aE)*e+aE*aI,R=(1-aE)*av+aE*az,E=(1-aE)*au+aE*aw;return{x:aC,y:aA,m:{x:aG,y:aF},n:{x:aJ,y:aH},start:{x:aD,y:aB},end:{x:R,y:E}};}),ab=ar(function(i,e,R,E,aG,aF,aC,az){var aE=(aG-2*R+i)-(aC-2*aG+R),aB=2*(R-i)-2*(aG-R),ay=i-R,aw=(-aB+Math.sqrt(aB*aB-4*aE*ay))/2/aE,au=(-aB-Math.sqrt(aB*aB-4*aE*ay))/2/aE,aA=[e,az],aD=[i,aC],ax=O(i,e,R,E,aG,aF,aC,az,aw&gt;0&amp;&amp;aw&lt;1?aw:0),av=O(i,e,R,E,aG,aF,aC,az,au&gt;0&amp;&amp;au&lt;1?au:0);aD=aD[J](ax.x,av.x);aA=aA[J](ax.y,av.y);aE=(aF-2*E+e)-(az-2*aF+E);aB=2*(E-e)-2*(aF-E);ay=e-E;aw=(-aB+Math.sqrt(aB*aB-4*aE*ay))/2/aE;au=(-aB-Math.sqrt(aB*aB-4*aE*ay))/2/aE;ax=O(i,e,R,E,aG,aF,aC,az,aw&gt;0&amp;&amp;aw&lt;1?aw:0);av=O(i,e,R,E,aG,aF,aC,az,au&gt;0&amp;&amp;au&lt;1?au:0);aD=aD[J](ax.x,av.x);aA=aA[J](ax.y,av.y);return{min:{x:V[ao](0,aD),y:V[ao](0,aA)},max:{x:r[ao](0,aD),y:r[ao](0,aA)}};}),ag=ar(function(aF,aA){var au=I(aF),aB=aA&amp;&amp;I(aA),aC={x:0,y:0,bx:0,by:0,X:0,Y:0,qx:null,qy:null},e={x:0,y:0,bx:0,by:0,X:0,Y:0,qx:null,qy:null},aw=function(aG,aH){var i,aI;if(!aG){return[&quot;C&quot;,aH.x,aH.y,aH.x,aH.y,aH.x,aH.y];}!(aG[0] in {T:1,Q:1})&amp;&amp;(aH.qx=aH.qy=null);switch(aG[0]){case&quot;M&quot;:aH.X=aG[1];aH.Y=aG[2];break;case&quot;A&quot;:aG=[&quot;C&quot;][J](B[ao](0,[aH.x,aH.y][J](aG.slice(1))));break;case&quot;S&quot;:i=aH.x+(aH.x-(aH.bx||aH.x));aI=aH.y+(aH.y-(aH.by||aH.y));aG=[&quot;C&quot;,i,aI][J](aG.slice(1));break;case&quot;T&quot;:aH.qx=aH.x+(aH.x-(aH.qx||aH.x));aH.qy=aH.y+(aH.y-(aH.qy||aH.y));aG=[&quot;C&quot;][J](K(aH.x,aH.y,aH.qx,aH.qy,aG[1],aG[2]));break;case&quot;Q&quot;:aH.qx=aG[1];aH.qy=aG[2];aG=[&quot;C&quot;][J](K(aH.x,aH.y,aG[1],aG[2],aG[3],aG[4]));break;case&quot;L&quot;:aG=[&quot;C&quot;][J](k(aH.x,aH.y,aG[1],aG[2]));break;case&quot;H&quot;:aG=[&quot;C&quot;][J](k(aH.x,aH.y,aG[1],aH.y));break;case&quot;V&quot;:aG=[&quot;C&quot;][J](k(aH.x,aH.y,aH.x,aG[1]));break;case&quot;Z&quot;:aG=[&quot;C&quot;][J](k(aH.x,aH.y,aH.X,aH.Y));break;}return aG;},E=function(aG,aH){if(aG[aH][z]&gt;7){aG[aH].shift();var aI=aG[aH];while(aI[z]){aG.splice(aH++,0,[&quot;C&quot;][J](aI.splice(0,6)));}aG.splice(aH,1);aD=r(au[z],aB&amp;&amp;aB[z]||0);}},R=function(aK,aJ,aH,aG,aI){if(aK&amp;&amp;aJ&amp;&amp;aK[aI][0]==&quot;M&quot;&amp;&amp;aJ[aI][0]!=&quot;M&quot;){aJ.splice(aI,0,[&quot;M&quot;,aG.x,aG.y]);aH.bx=0;aH.by=0;aH.x=aK[aI][1];aH.y=aK[aI][2];aD=r(au[z],aB&amp;&amp;aB[z]||0);}};for(var ay=0,aD=r(au[z],aB&amp;&amp;aB[z]||0);ay&lt;aD;ay++){au[ay]=aw(au[ay],aC);E(au,ay);aB&amp;&amp;(aB[ay]=aw(aB[ay],e));aB&amp;&amp;E(aB,ay);R(au,aB,aC,e,ay);R(aB,au,e,aC,ay);var ax=au[ay],aE=aB&amp;&amp;aB[ay],av=ax[z],az=aB&amp;&amp;aE[z];aC.x=ax[av-2];aC.y=ax[av-1];aC.bx=b(ax[av-4])||aC.x;aC.by=b(ax[av-3])||aC.y;e.bx=aB&amp;&amp;(b(aE[az-4])||e.x);e.by=aB&amp;&amp;(b(aE[az-3])||e.y);e.x=aB&amp;&amp;aE[az-2];e.y=aB&amp;&amp;aE[az-1];}return aB?[au,aB]:au;},null,D),x=ar(function(az){var ay=[];for(var av=0,aA=az[z];av&lt;aA;av++){var e={},ax=az[av].match(/^([^:]*):?([\d\.]*)/);e.color=l.getRGB(ax[1]);if(e.color.error){return null;}e.color=e.color.hex;ax[2]&amp;&amp;(e.offset=ax[2]+&quot;%&quot;);ay[ae](e);}for(var av=1,aA=ay[z]-1;av&lt;aA;av++){if(!ay[av].offset){var E=b(ay[av-1].offset||0),R=0;for(var au=av+1;au&lt;aA;au++){if(ay[au].offset){R=ay[au].offset;break;}}if(!R){R=100;au=aA;}R=b(R);var aw=(R-E)/(au-av+1);for(;av&lt;au;av++){E+=aw;ay[av].offset=E+&quot;%&quot;;}}}return ay;}),X=function(){var E,i,au,R,e;if(l.is(arguments[0],&quot;string&quot;)||l.is(arguments[0],&quot;object&quot;)){if(l.is(arguments[0],&quot;string&quot;)){E=m.getElementById(arguments[0]);}else{E=arguments[0];}if(E.tagName){if(arguments[1]==null){return{container:E,width:E.style.pixelWidth||E.offsetWidth,height:E.style.pixelHeight||E.offsetHeight};}else{return{container:E,width:arguments[1],height:arguments[2]};}}}else{if(l.is(arguments[0],ah)&amp;&amp;arguments[z]&gt;3){return{container:1,x:arguments[0],y:arguments[1],width:arguments[2],height:arguments[3]};}}},a=function(e,E){var i=this;for(var R in E){if(E[h](R)&amp;&amp;!(R in e)){switch(typeof E[R]){case&quot;function&quot;:(function(au){e[R]=e===i?au:function(){return au[ao](i,arguments);};})(E[R]);break;case&quot;object&quot;:e[R]=e[R]||{};a.call(this,e[R],E[R]);break;default:e[R]=E[R];break;}}}};if(l.svg){d.svgns=&quot;http://www.w3.org/2000/svg&quot;;d.xlink=&quot;http://www.w3.org/1999/xlink&quot;;var ai=function(e){return +e+(~~e===e)*0.5;};var N=function(av){for(var E=0,R=av[z];E&lt;R;E++){if(av[E][0].toLowerCase()!=&quot;a&quot;){for(var e=1,au=av[E][z];e&lt;au;e++){av[E][e]=ai(av[E][e]);}}else{av[E][6]=ai(av[E][6]);av[E][7]=ai(av[E][7]);}}return av;};var P=function(E,e){if(e){for(var i in e){if(e[h](i)){E[f](i,e[i]);}}}else{return m.createElementNS(d.svgns,E);}};l[j]=function(){return&quot;Your browser supports SVG.\nYou are running Rapha\u00ebl &quot;+this.version;};var aq=function(e,R){var i=P(&quot;path&quot;);R.canvas&amp;&amp;R.canvas[c](i);var E=new s(i,R);E.type=&quot;path&quot;;W(E,{fill:&quot;none&quot;,stroke:&quot;#000&quot;,path:e});return E;};var af=function(R,aD,e){var aA=&quot;linear&quot;,ax=0.5,av=0.5,aF=R.style;aD=(aD+w)[Q](/^r(?:\(([^,]+?)\s*,\s*([^\)]+?)\))?/,function(aG,i,aH){aA=&quot;radial&quot;;if(i&amp;&amp;aH){ax=b(i);av=b(aH);if(L(ax-0.5,2)+L(av-0.5,2)&gt;0.25){av=Math.sqrt(0.25-L(ax-0.5,2))+0.5;}}return w;});aD=aD[H](/\s*\-\s*/);if(aA==&quot;linear&quot;){var aw=aD.shift();aw=-b(aw);if(isNaN(aw)){return null;}var au=[0,0,Math.cos(aw*Math.PI/180),Math.sin(aw*Math.PI/180)],aC=1/(r(Math.abs(au[2]),Math.abs(au[3]))||1);au[2]*=aC;au[3]*=aC;if(au[2]&lt;0){au[0]=-au[2];au[2]=0;}if(au[3]&lt;0){au[1]=-au[3];au[3]=0;}}var az=x(aD);if(!az){return null;}var E=P(aA+&quot;Gradient&quot;);E.id=&quot;r&quot;+(l.idGenerator++)[j](36);aA==&quot;radial&quot;?P(E,{fx:ax,fy:av}):P(E,{x1:au[0],y1:au[1],x2:au[2],y2:au[3]});e.defs[c](E);for(var ay=0,aE=az[z];ay&lt;aE;ay++){var aB=P(&quot;stop&quot;);P(aB,{offset:az[ay].offset?az[ay].offset:!ay?&quot;0%&quot;:&quot;100%&quot;,&quot;stop-color&quot;:az[ay].color||&quot;#fff&quot;});E[c](aB);}P(R,{fill:&quot;url(#&quot;+E.id+&quot;)&quot;,opacity:1,&quot;fill-opacity&quot;:1});aF.fill=w;aF.opacity=1;aF.fillOpacity=1;return 1;};var C=function(i){var e=i.getBBox();P(i.pattern,{patternTransform:l.format(&quot;translate({0},{1})&quot;,e.x,e.y)});};var W=function(aB,aK){var aE={&quot;&quot;:[0],none:[0],&quot;-&quot;:[3,1],&quot;.&quot;:[1,1],&quot;-.&quot;:[3,1,1,1],&quot;-..&quot;:[3,1,1,1,1,1],&quot;. &quot;:[1,3],&quot;- &quot;:[4,3],&quot;--&quot;:[8,3],&quot;- .&quot;:[4,3,1,3],&quot;--.&quot;:[8,3,1,3],&quot;--..&quot;:[8,3,1,3,1,3]},aG=aB.node,aC=aB.attrs,ay=aB.attr(&quot;rotation&quot;),av=function(aR,aQ){aQ=aE[(aQ+w).toLowerCase()];if(aQ){var aO=aR.attrs[&quot;stroke-width&quot;]||&quot;1&quot;,aM={round:aO,square:aO,butt:0}[aR.attrs[&quot;stroke-linecap&quot;]||aK[&quot;stroke-linecap&quot;]]||0,aP=[];var aN=aQ[z];while(aN--){aP[aN]=aQ[aN]*aO+((aN%2)?1:-1)*aM;}P(aG,{&quot;stroke-dasharray&quot;:aP[t](&quot;,&quot;)});}};b(ay)&amp;&amp;aB.rotate(0,true);for(var aF in aK){if(aK[h](aF)){if(!(aF in A)){continue;}var aD=aK[aF];aC[aF]=aD;switch(aF){case&quot;href&quot;:case&quot;title&quot;:case&quot;target&quot;:var aI=aG.parentNode;if(aI.tagName.toLowerCase()!=&quot;a&quot;){var R=P(&quot;a&quot;);aI.insertBefore(R,aG);R[c](aG);aI=R;}aI.setAttributeNS(aB.paper.xlink,aF,aD);break;case&quot;clip-rect&quot;:var i=(aD+w)[H](at);if(i[z]==4){aB.clip&amp;&amp;aB.clip.parentNode.parentNode.removeChild(aB.clip.parentNode);var E=P(&quot;clipPath&quot;),aH=P(&quot;rect&quot;);E.id=&quot;r&quot;+(l.idGenerator++)[j](36);P(aH,{x:i[0],y:i[1],width:i[2],height:i[3]});E[c](aH);aB.paper.defs[c](E);P(aG,{&quot;clip-path&quot;:&quot;url(#&quot;+E.id+&quot;)&quot;});aB.clip=aH;}if(!aD){var aJ=m.getElementById(aG.getAttribute(&quot;clip-path&quot;)[Q](/(^url\(#|\)$)/g,w));aJ&amp;&amp;aJ.parentNode.removeChild(aJ);P(aG,{&quot;clip-path&quot;:w});delete aB.clip;}break;case&quot;path&quot;:if(aD&amp;&amp;aB.type==&quot;path&quot;){aC.path=N(I(aD));P(aG,{d:aC.path});}break;case&quot;width&quot;:aG[f](aF,aD);if(aC.fx){aF=&quot;x&quot;;aD=aC.x;}else{break;}case&quot;x&quot;:if(aC.fx){aD=-aC.x-(aC.width||0);}case&quot;rx&quot;:if(aF==&quot;rx&quot;&amp;&amp;aB.type==&quot;rect&quot;){break;}case&quot;cx&quot;:aG[f](aF,aD);aB.pattern&amp;&amp;C(aB);break;case&quot;height&quot;:aG[f](aF,aD);if(aC.fy){aF=&quot;y&quot;;aD=aC.y;}else{break;}case&quot;y&quot;:if(aC.fy){aD=-aC.y-(aC.height||0);}case&quot;ry&quot;:if(aF==&quot;ry&quot;&amp;&amp;aB.type==&quot;rect&quot;){break;}case&quot;cy&quot;:aG[f](aF,aD);aB.pattern&amp;&amp;C(aB);break;case&quot;r&quot;:if(aB.type==&quot;rect&quot;){P(aG,{rx:aD,ry:aD});}else{aG[f](aF,aD);}break;case&quot;src&quot;:if(aB.type==&quot;image&quot;){aG.setAttributeNS(aB.paper.xlink,&quot;href&quot;,aD);}break;case&quot;stroke-width&quot;:aG.style.strokeWidth=aD;aG[f](aF,aD);if(aC[&quot;stroke-dasharray&quot;]){av(aB,aC[&quot;stroke-dasharray&quot;]);}break;case&quot;stroke-dasharray&quot;:av(aB,aD);break;case&quot;rotation&quot;:ay=aD;aB.rotate(aD,true);break;case&quot;translation&quot;:var aw=(aD+w)[H](at);aB.translate((+aw[0]+1||2)-1,(+aw[1]+1||2)-1);break;case&quot;scale&quot;:var aw=(aD+w)[H](at);aB.scale(+aw[0]||1,+aw[1]||+aw[0]||1,+aw[2]||null,+aw[3]||null);break;case&quot;fill&quot;:var au=(aD+w).match(/^url\(['&quot;]?([^\)]+)['&quot;]?\)$/i);if(au){var E=P(&quot;pattern&quot;),aA=P(&quot;image&quot;);E.id=&quot;r&quot;+(l.idGenerator++)[j](36);P(E,{x:0,y:0,patternUnits:&quot;userSpaceOnUse&quot;});P(aA,{x:0,y:0});aA.setAttributeNS(aB.paper.xlink,&quot;href&quot;,au[1]);E[c](aA);var aL=m.createElement(&quot;img&quot;);aL.style.cssText=&quot;position:absolute;left:-9999em;top-9999em&quot;;aL.onload=function(){P(E,{width:this.offsetWidth,height:this.offsetHeight});P(aA,{width:this.offsetWidth,height:this.offsetHeight});m.body.removeChild(this);d.safari();};m.body[c](aL);aL.src=au[1];aB.paper.defs[c](E);aG.style.fill=&quot;url(#&quot;+E.id+&quot;)&quot;;P(aG,{fill:&quot;url(#&quot;+E.id+&quot;)&quot;});aB.pattern=E;aB.pattern&amp;&amp;C(aB);break;}if(!l.getRGB(aD).error){delete aK.gradient;delete aC.gradient;if(!l.is(aC.opacity,&quot;undefined&quot;)&amp;&amp;l.is(aK.opacity,&quot;undefined&quot;)){aG.style.opacity=aC.opacity;P(aG,{opacity:aC.opacity});}if(!l.is(aC[&quot;fill-opacity&quot;],&quot;undefined&quot;)&amp;&amp;l.is(aK[&quot;fill-opacity&quot;],&quot;undefined&quot;)){aG.style.fillOpacity=aC[&quot;fill-opacity&quot;];P(aG,{&quot;fill-opacity&quot;:aC[&quot;fill-opacity&quot;]});}}else{if((aB.type in {circle:1,ellipse:1}||(aD+w).charAt(0)!=&quot;r&quot;)&amp;&amp;af(aG,aD,aB.paper)){aC.gradient=aD;aC.fill=&quot;none&quot;;break;}}case&quot;stroke&quot;:aG.style[aF]=l.getRGB(aD).hex;aG[f](aF,l.getRGB(aD).hex);break;case&quot;gradient&quot;:(aB.type in {circle:1,ellipse:1}||(aD+w).charAt(0)!=&quot;r&quot;)&amp;&amp;af(aG,aD,aB.paper);break;case&quot;opacity&quot;:case&quot;fill-opacity&quot;:if(aC.gradient){var e=m.getElementById(aG.getAttribute(&quot;fill&quot;)[Q](/^url\(#|\)$/g,w));if(e){var ax=e.getElementsByTagName(&quot;stop&quot;);ax[ax[z]-1][f](&quot;stop-opacity&quot;,aD);}break;}default:aF==&quot;font-size&quot;&amp;&amp;(aD=u(aD,10)+&quot;px&quot;);var az=aF[Q](/(\-.)/g,function(aM){return aM.substring(1).toUpperCase();});aG.style[az]=aD;aG[f](aF,aD);break;}}}am(aB,aK);u(ay,10)&amp;&amp;aB.rotate(ay,true);};var ac=1.2;var am=function(e,au){if(e.type!=&quot;text&quot;||!(&quot;text&quot; in au||&quot;font&quot; in au||&quot;font-size&quot; in au||&quot;x&quot; in au||&quot;y&quot; in au)){return;}var az=e.attrs,E=e.node,aB=E.firstChild?u(m.defaultView.getComputedStyle(E.firstChild,w).getPropertyValue(&quot;font-size&quot;),10):10;if(&quot;text&quot; in au){while(E.firstChild){E.removeChild(E.firstChild);}var R=(au.text+w)[H](&quot;\n&quot;);for(var av=0,aA=R[z];av&lt;aA;av++){var ax=P(&quot;tspan&quot;);av&amp;&amp;P(ax,{dy:aB*ac,x:az.x});ax[c](m.createTextNode(R[av]));E[c](ax);}}else{var R=E.getElementsByTagName(&quot;tspan&quot;);for(var av=0,aA=R[z];av&lt;aA;av++){av&amp;&amp;P(R[av],{dy:aB*ac,x:az.x});}}P(E,{y:az.y});var aw=e.getBBox(),ay=az.y-(aw.y+aw.height/2);ay&amp;&amp;P(E,{y:az.y+ay});};var s=function(i,e){var R=0,E=0;this[0]=i;this.node=i;i.raphael=this;this.paper=e;this.attrs=this.attrs||{};this.transformations=[];this._={tx:0,ty:0,rt:{deg:0,cx:0,cy:0},sx:1,sy:1};};s[v].rotate=function(i,e,R){if(i==null){if(this._.rt.cx){return[this._.rt.deg,this._.rt.cx,this._.rt.cy][t](&quot; &quot;);}return this._.rt.deg;}var E=this.getBBox();i=(i+w)[H](at);if(i[z]-1){e=b(i[1]);R=b(i[2]);}i=b(i[0]);if(e!=null){this._.rt.deg=i;}else{this._.rt.deg+=i;}(R==null)&amp;&amp;(e=null);this._.rt.cx=e;this._.rt.cy=R;e=e==null?E.x+E.width/2:e;R=R==null?E.y+E.height/2:R;if(this._.rt.deg){this.transformations[0]=l.format(&quot;rotate({0} {1} {2})&quot;,this._.rt.deg,e,R);this.clip&amp;&amp;P(this.clip,{transform:l.format(&quot;rotate({0} {1} {2})&quot;,-this._.rt.deg,e,R)});}else{this.transformations[0]=w;this.clip&amp;&amp;P(this.clip,{transform:w});}P(this.node,{transform:this.transformations[t](&quot; &quot;)});return this;};s[v].hide=function(){this.node.style.display=&quot;none&quot;;return this;};s[v].show=function(){this.node.style.display=&quot;block&quot;;return this;};s[v].remove=function(){this.node.parentNode.removeChild(this.node);for(var e in this){delete this[e];}};s[v].getBBox=function(){if(this.type==&quot;path&quot;){return T(this.attrs.path);}if(this.node.style.display==&quot;none&quot;){this.show();var R=true;}var ax={};try{ax=this.node.getBBox();}catch(av){}finally{ax=ax||{};}if(this.type==&quot;text&quot;){ax={x:ax.x,y:Infinity,width:0,height:0};for(var E=0,au=this.node.getNumberOfChars();E&lt;au;E++){var aw=this.node.getExtentOfChar(E);(aw.y&lt;ax.y)&amp;&amp;(ax.y=aw.y);(aw.y+aw.height-ax.y&gt;ax.height)&amp;&amp;(ax.height=aw.y+aw.height-ax.y);(aw.x+aw.width-ax.x&gt;ax.width)&amp;&amp;(ax.width=aw.x+aw.width-ax.x);}}R&amp;&amp;this.hide();return ax;};s[v].attr=function(){if(arguments[z]==1&amp;&amp;l.is(arguments[0],&quot;string&quot;)){if(arguments[0]==&quot;translation&quot;){return this.translate();}if(arguments[0]==&quot;rotation&quot;){return this.rotate();}if(arguments[0]==&quot;scale&quot;){return this.scale();}return this.attrs[arguments[0]];}if(arguments[z]==1&amp;&amp;l.is(arguments[0],&quot;array&quot;)){var e={};for(var i in arguments[0]){if(arguments[0][h](i)){e[arguments[0][i]]=this.attrs[arguments[0][i]];}}return e;}if(arguments[z]==2){var E={};E[arguments[0]]=arguments[1];W(this,E);}else{if(arguments[z]==1&amp;&amp;l.is(arguments[0],&quot;object&quot;)){W(this,arguments[0]);}}return this;};s[v].toFront=function(){this.node.parentNode[c](this.node);return this;};s[v].toBack=function(){if(this.node.parentNode.firstChild!=this.node){this.node.parentNode.insertBefore(this.node,this.node.parentNode.firstChild);}return this;};s[v].insertAfter=function(e){if(e.node.nextSibling){e.node.parentNode.insertBefore(this.node,e.node.nextSibling);}else{e.node.parentNode[c](this.node);}return this;};s[v].insertBefore=function(e){var i=e.node;i.parentNode.insertBefore(this.node,i);return this;};var S=function(i,e,av,au){e=ai(e);av=ai(av);var R=P(&quot;circle&quot;);i.canvas&amp;&amp;i.canvas[c](R);var E=new s(R,i);E.attrs={cx:e,cy:av,r:au,fill:&quot;none&quot;,stroke:&quot;#000&quot;};E.type=&quot;circle&quot;;P(R,E.attrs);return E;};var aa=function(E,e,ax,i,av,aw){e=ai(e);ax=ai(ax);var au=P(&quot;rect&quot;);E.canvas&amp;&amp;E.canvas[c](au);var R=new s(au,E);R.attrs={x:e,y:ax,width:i,height:av,r:aw||0,rx:aw||0,ry:aw||0,fill:&quot;none&quot;,stroke:&quot;#000&quot;};R.type=&quot;rect&quot;;P(au,R.attrs);return R;};var n=function(i,e,aw,av,au){e=ai(e);aw=ai(aw);var R=P(&quot;ellipse&quot;);i.canvas&amp;&amp;i.canvas[c](R);var E=new s(R,i);E.attrs={cx:e,cy:aw,rx:av,ry:au,fill:&quot;none&quot;,stroke:&quot;#000&quot;};E.type=&quot;ellipse&quot;;P(R,E.attrs);return E;};var y=function(E,aw,e,ax,i,av){var au=P(&quot;image&quot;);P(au,{x:e,y:ax,width:i,height:av,preserveAspectRatio:&quot;none&quot;});au.setAttributeNS(E.xlink,&quot;href&quot;,aw);E.canvas&amp;&amp;E.canvas[c](au);var R=new s(au,E);R.attrs={x:e,y:ax,width:i,height:av,src:aw};R.type=&quot;image&quot;;return R;};var Z=function(i,e,av,au){var R=P(&quot;text&quot;);P(R,{x:e,y:av,&quot;text-anchor&quot;:&quot;middle&quot;});i.canvas&amp;&amp;i.canvas[c](R);var E=new s(R,i);E.attrs={x:e,y:av,&quot;text-anchor&quot;:&quot;middle&quot;,text:au,font:A.font,stroke:&quot;none&quot;,fill:&quot;#000&quot;};E.type=&quot;text&quot;;W(E,E.attrs);return E;};var U=function(i,e){this.width=i||this.width;this.height=e||this.height;this.canvas[f](&quot;width&quot;,this.width);this.canvas[f](&quot;height&quot;,this.height);return this;};var q=function(){var R=X[ao](null,arguments),E=R&amp;&amp;R.container,i=R.x,ax=R.y,au=R.width,e=R.height;if(!E){throw new Error(&quot;SVG container not found.&quot;);}d.canvas=P(&quot;svg&quot;);var aw=d.canvas;d.width=au||512;d.height=e||342;aw[f](&quot;width&quot;,d.width);aw[f](&quot;height&quot;,d.height);if(E==1){aw.style.cssText=&quot;position:absolute;left:&quot;+i+&quot;px;top:&quot;+ax+&quot;px&quot;;m.body[c](aw);}else{if(E.firstChild){E.insertBefore(aw,E.firstChild);}else{E[c](aw);}}E={canvas:aw};for(var av in d){if(d[h](av)){E[av]=d[av];}}a.call(E,E,l.fn);E.clear();E.raphael=l;return E;};d.clear=function(){var e=this.canvas;while(e.firstChild){e.removeChild(e.firstChild);}(this.desc=P(&quot;desc&quot;))[c](m.createTextNode(&quot;Created with Rapha\u00ebl&quot;));e[c](this.desc);e[c](this.defs=P(&quot;defs&quot;));};d.remove=function(){this.canvas.parentNode&amp;&amp;this.canvas.parentNode.removeChild(this.canvas);for(var e in this){delete this[e];}};}if(l.vml){var M=function(aE){var aB=/[ahqtv]/ig,aw=I;(aE+w).match(aB)&amp;&amp;(aw=ag);aB=/[clmz]/g;if(aw==I&amp;&amp;!(aE+w).match(aB)){var E={M:&quot;m&quot;,L:&quot;l&quot;,C:&quot;c&quot;,Z:&quot;x&quot;,m:&quot;t&quot;,l:&quot;r&quot;,c:&quot;v&quot;,z:&quot;x&quot;},au=/([clmz]),?([^clmz]*)/gi,av=/-?[^,\s-]+/g;var aA=(aE+w)[Q](au,function(aF,aH,i){var aG=[];i[Q](av,function(aI){aG[ae](ai(aI));});return E[aH]+aG;});return aA;}var aC=aw(aE),R,aA=[],e;for(var ay=0,aD=aC[z];ay&lt;aD;ay++){R=aC[ay];e=(aC[ay][0]+w).toLowerCase();e==&quot;z&quot;&amp;&amp;(e=&quot;x&quot;);for(var ax=1,az=R[z];ax&lt;az;ax++){e+=ai(R[ax])+(ax!=az-1?&quot;,&quot;:w);}aA[ae](e);}return aA[t](&quot; &quot;);};l[j]=function(){return&quot;Your browser doesn\u2019t support SVG. Falling down to VML.\nYou are running Rapha\u00ebl &quot;+this.version;};var aq=function(e,av){var R=ap(&quot;group&quot;);R.style.cssText=&quot;position:absolute;left:0;top:0;width:&quot;+av.width+&quot;px;height:&quot;+av.height+&quot;px&quot;;R.coordsize=av.coordsize;R.coordorigin=av.coordorigin;var E=ap(&quot;shape&quot;),i=E.style;i.width=av.width+&quot;px&quot;;i.height=av.height+&quot;px&quot;;E.coordsize=this.coordsize;E.coordorigin=this.coordorigin;R[c](E);var au=new s(E,R,av);au.isAbsolute=true;au.type=&quot;path&quot;;au.path=[];au.Path=w;e&amp;&amp;W(au,{fill:&quot;none&quot;,stroke:&quot;#000&quot;,path:e});av.canvas[c](R);return au;};var W=function(az,aD){az.attrs=az.attrs||{};var aB=az.node,aE=az.attrs,aw=aB.style,R,aI=az;for(var ax in aD){if(aD[h](ax)){aE[ax]=aD[ax];}}aD.href&amp;&amp;(aB.href=aD.href);aD.title&amp;&amp;(aB.title=aD.title);aD.target&amp;&amp;(aB.target=aD.target);if(aD.path&amp;&amp;az.type==&quot;path&quot;){aE.path=aD.path;aB.path=M(aE.path);}if(aD.rotation!=null){az.rotate(aD.rotation,true);}if(aD.translation){R=(aD.translation+w)[H](at);az.translate(R[0],R[1]);}if(aD.scale){R=(aD.scale+w)[H](at);az.scale(+R[0]||1,+R[1]||+R[0]||1,+R[2]||null,+R[3]||null);}if(&quot;clip-rect&quot; in aD){var e=(aD[&quot;clip-rect&quot;]+w)[H](at);if(e[z]==4){e[2]=+e[2]+(+e[0]);e[3]=+e[3]+(+e[1]);var ay=aB.clipRect||m.createElement(&quot;div&quot;),aH=ay.style,av=aB.parentNode;aH.clip=l.format(&quot;rect({1}px {2}px {3}px {0}px)&quot;,e);if(!aB.clipRect){aH.position=&quot;absolute&quot;;aH.top=0;aH.left=0;aH.width=az.paper.width+&quot;px&quot;;aH.height=az.paper.height+&quot;px&quot;;av.parentNode.insertBefore(ay,av);ay[c](av);aB.clipRect=ay;}}if(!aD[&quot;clip-rect&quot;]){aB.clipRect&amp;&amp;(aB.clipRect.style.clip=w);}}if(az.type==&quot;image&quot;&amp;&amp;aD.src){aB.src=aD.src;}if(az.type==&quot;image&quot;&amp;&amp;aD.opacity){aB.filterOpacity=&quot; progid:DXImageTransform.Microsoft.Alpha(opacity=&quot;+(aD.opacity*100)+&quot;)&quot;;aw.filter=(aB.filterMatrix||w)+(aB.filterOpacity||w);}aD.font&amp;&amp;(aw.font=aD.font);aD[&quot;font-family&quot;]&amp;&amp;(aw.fontFamily='&quot;'+aD[&quot;font-family&quot;][H](&quot;,&quot;)[0][Q](/^['&quot;]+|['&quot;]+$/g,w)+'&quot;');aD[&quot;font-size&quot;]&amp;&amp;(aw.fontSize=aD[&quot;font-size&quot;]);aD[&quot;font-weight&quot;]&amp;&amp;(aw.fontWeight=aD[&quot;font-weight&quot;]);aD[&quot;font-style&quot;]&amp;&amp;(aw.fontStyle=aD[&quot;font-style&quot;]);if(aD.opacity!=null||aD[&quot;stroke-width&quot;]!=null||aD.fill!=null||aD.stroke!=null||aD[&quot;stroke-width&quot;]!=null||aD[&quot;stroke-opacity&quot;]!=null||aD[&quot;fill-opacity&quot;]!=null||aD[&quot;stroke-dasharray&quot;]!=null||aD[&quot;stroke-miterlimit&quot;]!=null||aD[&quot;stroke-linejoin&quot;]!=null||aD[&quot;stroke-linecap&quot;]!=null){aB=az.shape||aB;var aC=(aB.getElementsByTagName(&quot;fill&quot;)&amp;&amp;aB.getElementsByTagName(&quot;fill&quot;)[0]),aF=false;!aC&amp;&amp;(aF=aC=ap(&quot;fill&quot;));if(&quot;fill-opacity&quot; in aD||&quot;opacity&quot; in aD){var i=((+aE[&quot;fill-opacity&quot;]+1||2)-1)*((+aE.opacity+1||2)-1);i&lt;0&amp;&amp;(i=0);i&gt;1&amp;&amp;(i=1);aC.opacity=i;}aD.fill&amp;&amp;(aC.on=true);if(aC.on==null||aD.fill==&quot;none&quot;){aC.on=false;}if(aC.on&amp;&amp;aD.fill){var E=aD.fill.match(/^url\(([^\)]+)\)$/i);if(E){aC.src=E[1];aC.type=&quot;tile&quot;;}else{aC.color=l.getRGB(aD.fill).hex;aC.src=w;aC.type=&quot;solid&quot;;if(l.getRGB(aD.fill).error&amp;&amp;(aI.type in {circle:1,ellipse:1}||(aD.fill+w).charAt(0)!=&quot;r&quot;)&amp;&amp;af(aI,aD.fill)){aE.fill=&quot;none&quot;;aE.gradient=aD.fill;}}}aF&amp;&amp;aB[c](aC);var au=(aB.getElementsByTagName(&quot;stroke&quot;)&amp;&amp;aB.getElementsByTagName(&quot;stroke&quot;)[0]),aG=false;!au&amp;&amp;(aG=au=ap(&quot;stroke&quot;));if((aD.stroke&amp;&amp;aD.stroke!=&quot;none&quot;)||aD[&quot;stroke-width&quot;]||aD[&quot;stroke-opacity&quot;]!=null||aD[&quot;stroke-dasharray&quot;]||aD[&quot;stroke-miterlimit&quot;]||aD[&quot;stroke-linejoin&quot;]||aD[&quot;stroke-linecap&quot;]){au.on=true;}(aD.stroke==&quot;none&quot;||au.on==null||aD.stroke==0||aD[&quot;stroke-width&quot;]==0)&amp;&amp;(au.on=false);au.on&amp;&amp;aD.stroke&amp;&amp;(au.color=l.getRGB(aD.stroke).hex);var i=((+aE[&quot;stroke-opacity&quot;]+1||2)-1)*((+aE.opacity+1||2)-1);i&lt;0&amp;&amp;(i=0);i&gt;1&amp;&amp;(i=1);au.opacity=i;aD[&quot;stroke-linejoin&quot;]&amp;&amp;(au.joinstyle=aD[&quot;stroke-linejoin&quot;]||&quot;miter&quot;);au.miterlimit=aD[&quot;stroke-miterlimit&quot;]||8;aD[&quot;stroke-linecap&quot;]&amp;&amp;(au.endcap={butt:&quot;flat&quot;,square:&quot;square&quot;,round:&quot;round&quot;}[aD[&quot;stroke-linecap&quot;]]||&quot;miter&quot;);aD[&quot;stroke-width&quot;]&amp;&amp;(au.weight=(b(aD[&quot;stroke-width&quot;])||1)*12/16);if(aD[&quot;stroke-dasharray&quot;]){var aA={&quot;-&quot;:&quot;shortdash&quot;,&quot;.&quot;:&quot;shortdot&quot;,&quot;-.&quot;:&quot;shortdashdot&quot;,&quot;-..&quot;:&quot;shortdashdotdot&quot;,&quot;. &quot;:&quot;dot&quot;,&quot;- &quot;:&quot;dash&quot;,&quot;--&quot;:&quot;longdash&quot;,&quot;- .&quot;:&quot;dashdot&quot;,&quot;--.&quot;:&quot;longdashdot&quot;,&quot;--..&quot;:&quot;longdashdotdot&quot;};au.dashstyle=aA[aD[&quot;stroke-dasharray&quot;]]||w;}aG&amp;&amp;aB[c](au);}if(aI.type==&quot;text&quot;){var aw=aI.paper.span.style;aE.font&amp;&amp;(aw.font=aE.font);aE[&quot;font-family&quot;]&amp;&amp;(aw.fontFamily=aE[&quot;font-family&quot;]);aE[&quot;font-size&quot;]&amp;&amp;(aw.fontSize=aE[&quot;font-size&quot;]);aE[&quot;font-weight&quot;]&amp;&amp;(aw.fontWeight=aE[&quot;font-weight&quot;]);aE[&quot;font-style&quot;]&amp;&amp;(aw.fontStyle=aE[&quot;font-style&quot;]);aI.node.string&amp;&amp;(aI.paper.span.innerHTML=(aI.node.string+w)[Q](/&lt;/g,&quot;&amp;#60;&quot;)[Q](/&amp;/g,&quot;&amp;#38;&quot;)[Q](/\n/g,&quot;&lt;br&gt;&quot;));aI.W=aE.w=aI.paper.span.offsetWidth;aI.H=aE.h=aI.paper.span.offsetHeight;aI.X=aE.x;aI.Y=aE.y+ai(aI.H/2);switch(aE[&quot;text-anchor&quot;]){case&quot;start&quot;:aI.node.style[&quot;v-text-align&quot;]=&quot;left&quot;;aI.bbx=ai(aI.W/2);break;case&quot;end&quot;:aI.node.style[&quot;v-text-align&quot;]=&quot;right&quot;;aI.bbx=-ai(aI.W/2);break;default:aI.node.style[&quot;v-text-align&quot;]=&quot;center&quot;;break;}}};var af=function(e,ax){e.attrs=e.attrs||{};var ay=e.attrs,aA=e.node.getElementsByTagName(&quot;fill&quot;),av=&quot;linear&quot;,aw=&quot;.5 .5&quot;;e.attrs.gradient=ax;ax=(ax+w)[Q](/^r(?:\(([^,]+?)\s*,\s*([^\)]+?)\))?/,function(aC,aD,i){av=&quot;radial&quot;;if(aD&amp;&amp;i){aD=b(aD);i=b(i);if(L(aD-0.5,2)+L(i-0.5,2)&gt;0.25){i=Math.sqrt(0.25-L(aD-0.5,2))+0.5;}aw=aD+&quot; &quot;+i;}return w;});ax=ax[H](/\s*\-\s*/);if(av==&quot;linear&quot;){var E=ax.shift();E=-b(E);if(isNaN(E)){return null;}}var au=x(ax);if(!au){return null;}e=e.shape||e.node;aA=aA[0]||ap(&quot;fill&quot;);if(au[z]){aA.on=true;aA.method=&quot;none&quot;;aA.type=(av==&quot;radial&quot;)?&quot;gradientradial&quot;:&quot;gradient&quot;;aA.color=au[0].color;aA.color2=au[au[z]-1].color;var aB=[];for(var R=0,az=au[z];R&lt;az;R++){au[R].offset&amp;&amp;aB[ae](au[R].offset+&quot; &quot;+au[R].color);}if(aB[z]&amp;&amp;aA.colors){aA.colors.value=aB[t](&quot;,&quot;);}else{aA.colors.value=&quot;0% &quot;+aA.color;}if(av==&quot;radial&quot;){aA.focus=&quot;100%&quot;;aA.focussize=aw;aA.focusposition=aw;}else{aA.angle=(270-E)%360;}}return 1;};var s=function(au,aw,e){var av=0,E=0,i=0,R=1;this[0]=au;this.node=au;au.raphael=this;this.X=0;this.Y=0;this.attrs={};this.Group=aw;this.paper=e;this._={tx:0,ty:0,rt:{deg:0},sx:1,sy:1};};s[v].rotate=function(i,e,E){if(i==null){if(this._.rt.cx){return[this._.rt.deg,this._.rt.cx,this._.rt.cy][t](&quot; &quot;);}return this._.rt.deg;}i=(i+w)[H](at);if(i[z]-1){e=b(i[1]);E=b(i[2]);}i=b(i[0]);if(e!=null){this._.rt.deg=i;}else{this._.rt.deg+=i;}E==null&amp;&amp;(e=null);this._.rt.cx=e;this._.rt.cy=E;this.setBox(this.attrs,e,E);this.Group.style.rotation=this._.rt.deg;return this;};s[v].setBox=function(av,aw,au){var E=this.Group.style,ax=(this.shape&amp;&amp;this.shape.style)||this.node.style;av=av||{};for(var ay in av){if(av[h](ay)){this.attrs[ay]=av[ay];}}aw=aw||this._.rt.cx;au=au||this._.rt.cy;var aB=this.attrs,aE,aD,aF,aA;switch(this.type){case&quot;circle&quot;:aE=aB.cx-aB.r;aD=aB.cy-aB.r;aF=aA=aB.r*2;break;case&quot;ellipse&quot;:aE=aB.cx-aB.rx;aD=aB.cy-aB.ry;aF=aB.rx*2;aA=aB.ry*2;break;case&quot;rect&quot;:case&quot;image&quot;:aE=+aB.x;aD=+aB.y;aF=aB.width||0;aA=aB.height||0;break;case&quot;text&quot;:this.textpath.v=[&quot;m&quot;,ai(aB.x),&quot;, &quot;,ai(aB.y-2),&quot;l&quot;,ai(aB.x)+1,&quot;, &quot;,ai(aB.y-2)][t](w);aE=aB.x-ai(this.W/2);aD=aB.y-this.H/2;aF=this.W;aA=this.H;break;case&quot;path&quot;:if(!this.attrs.path){aE=0;aD=0;aF=this.paper.width;aA=this.paper.height;}else{var az=T(this.attrs.path);aE=az.x;aD=az.y;aF=az.width;aA=az.height;}break;default:aE=0;aD=0;aF=this.paper.width;aA=this.paper.height;break;}aw=(aw==null)?aE+aF/2:aw;au=(au==null)?aD+aA/2:au;var R=aw-this.paper.width/2,aC=au-this.paper.height/2;if(this.type==&quot;path&quot;||this.type==&quot;text&quot;){(E.left!=R+&quot;px&quot;)&amp;&amp;(E.left=R+&quot;px&quot;);(E.top!=aC+&quot;px&quot;)&amp;&amp;(E.top=aC+&quot;px&quot;);this.X=this.type==&quot;text&quot;?aE:-R;this.Y=this.type==&quot;text&quot;?aD:-aC;this.W=aF;this.H=aA;(ax.left!=-R+&quot;px&quot;)&amp;&amp;(ax.left=-R+&quot;px&quot;);(ax.top!=-aC+&quot;px&quot;)&amp;&amp;(ax.top=-aC+&quot;px&quot;);}else{(E.left!=R+&quot;px&quot;)&amp;&amp;(E.left=R+&quot;px&quot;);(E.top!=aC+&quot;px&quot;)&amp;&amp;(E.top=aC+&quot;px&quot;);this.X=aE;this.Y=aD;this.W=aF;this.H=aA;(E.width!=this.paper.width+&quot;px&quot;)&amp;&amp;(E.width=this.paper.width+&quot;px&quot;);(E.height!=this.paper.height+&quot;px&quot;)&amp;&amp;(E.height=this.paper.height+&quot;px&quot;);(ax.left!=aE-R+&quot;px&quot;)&amp;&amp;(ax.left=aE-R+&quot;px&quot;);(ax.top!=aD-aC+&quot;px&quot;)&amp;&amp;(ax.top=aD-aC+&quot;px&quot;);(ax.width!=aF+&quot;px&quot;)&amp;&amp;(ax.width=aF+&quot;px&quot;);(ax.height!=aA+&quot;px&quot;)&amp;&amp;(ax.height=aA+&quot;px&quot;);var aG=(+av.r||0)/(V(aF,aA));if(this.type==&quot;rect&quot;&amp;&amp;this.arcsize!=aG&amp;&amp;(aG||this.arcsize)){var e=ap(aG?&quot;roundrect&quot;:&quot;rect&quot;);e.arcsize=aG;this.Group[c](e);this.node.parentNode.removeChild(this.node);this.node=e;this.arcsize=aG;W(this,this.attrs);this.setBox(this.attrs);}}};s[v].hide=function(){this.Group.style.display=&quot;none&quot;;return this;};s[v].show=function(){this.Group.style.display=&quot;block&quot;;return this;};s[v].getBBox=function(){if(this.type==&quot;path&quot;){return T(this.attrs.path);}return{x:this.X+(this.bbx||0),y:this.Y,width:this.W,height:this.H};};s[v].remove=function(){this.node.parentNode.removeChild(this[0]);this.Group.parentNode.removeChild(this.Group);this.shape&amp;&amp;this.shape.parentNode.removeChild(this.shape);for(var e in this){delete this[e];}};s[v].attr=function(){if(arguments[z]==1&amp;&amp;l.is(arguments[0],&quot;string&quot;)){if(arguments[0]==&quot;translation&quot;){return this.translate();}if(arguments[0]==&quot;rotation&quot;){return this.rotate();}if(arguments[0]==&quot;scale&quot;){return this.scale();}return this.attrs[arguments[0]];}if(this.attrs&amp;&amp;arguments[z]==1&amp;&amp;l.is(arguments[0],&quot;array&quot;)){var e={};for(var E=0,R=arguments[0][z];E&lt;R;E++){e[arguments[0][E]]=this.attrs[arguments[0][E]];}return e;}var au;if(arguments[z]==2){au={};au[arguments[0]]=arguments[1];}if(arguments[z]==1&amp;&amp;l.is(arguments[0],&quot;object&quot;)){au=arguments[0];}if(au){if(au.gradient&amp;&amp;(this.type in {circle:1,ellipse:1}||(au.gradient+w).charAt(0)!=&quot;r&quot;)){af(this,au.gradient);}if(au.text&amp;&amp;this.type==&quot;text&quot;){this.node.string=au.text;}W(this,au);this.setBox(this.attrs);}return this;};s[v].toFront=function(){this.Group.parentNode[c](this.Group);return this;};s[v].toBack=function(){if(this.Group.parentNode.firstChild!=this.Group){this.Group.parentNode.insertBefore(this.Group,this.Group.parentNode.firstChild);}return this;};s[v].insertAfter=function(e){if(e.Group.nextSibling){e.Group.parentNode.insertBefore(this.Group,e.Group.nextSibling);}else{e.Group.parentNode[c](this.Group);}return this;};s[v].insertBefore=function(e){e.Group.parentNode.insertBefore(this.Group,e.Group);return this;};var S=function(i,e,ax,av){var au=ap(&quot;group&quot;),aw=ap(&quot;oval&quot;),E=aw.style;au.style.cssText=&quot;position:absolute;left:0;top:0;width:&quot;+i.width+&quot;px;height:&quot;+i.height+&quot;px&quot;;au.coordsize=i.coordsize;au.coordorigin=i.coordorigin;au[c](aw);var R=new s(aw,au,i);R.type=&quot;circle&quot;;W(R,{stroke:&quot;#000&quot;,fill:&quot;none&quot;});R.attrs.cx=e;R.attrs.cy=ax;R.attrs.r=av;R.setBox({x:e-av,y:ax-av,width:av*2,height:av*2});i.canvas[c](au);return R;};var aa=function(i,ax,aw,ay,R,e){var au=ap(&quot;group&quot;),E=ap(e?&quot;roundrect&quot;:&quot;rect&quot;),az=(+e||0)/(V(ay,R));E.arcsize=az;au.style.cssText=&quot;position:absolute;left:0;top:0;width:&quot;+i.width+&quot;px;height:&quot;+i.height+&quot;px&quot;;au.coordsize=i.coordsize;au.coordorigin=i.coordorigin;au[c](E);var av=new s(E,au,i);av.type=&quot;rect&quot;;W(av,{stroke:&quot;#000&quot;});av.arcsize=az;av.setBox({x:ax,y:aw,width:ay,height:R,r:+e});i.canvas[c](au);return av;};var n=function(e,ay,ax,E,i){var au=ap(&quot;group&quot;),R=ap(&quot;oval&quot;),aw=R.style;au.style.cssText=&quot;position:absolute;left:0;top:0;width:&quot;+e.width+&quot;px;height:&quot;+e.height+&quot;px&quot;;au.coordsize=e.coordsize;au.coordorigin=e.coordorigin;au[c](R);var av=new s(R,au,e);av.type=&quot;ellipse&quot;;W(av,{stroke:&quot;#000&quot;});av.attrs.cx=ay;av.attrs.cy=ax;av.attrs.rx=E;av.attrs.ry=i;av.setBox({x:ay-E,y:ax-i,width:E*2,height:i*2});e.canvas[c](au);return av;};var y=function(i,e,ay,ax,az,R){var au=ap(&quot;group&quot;),E=ap(&quot;image&quot;),aw=E.style;au.style.cssText=&quot;position:absolute;left:0;top:0;width:&quot;+i.width+&quot;px;height:&quot;+i.height+&quot;px&quot;;au.coordsize=i.coordsize;au.coordorigin=i.coordorigin;E.src=e;au[c](E);var av=new s(E,au,i);av.type=&quot;image&quot;;av.attrs.src=e;av.attrs.x=ay;av.attrs.y=ax;av.attrs.w=az;av.attrs.h=R;av.setBox({x:ay,y:ax,width:az,height:R});i.canvas[c](au);return av;};var Z=function(i,ay,ax,az){var au=ap(&quot;group&quot;),R=ap(&quot;shape&quot;),aw=R.style,aA=ap(&quot;path&quot;),e=aA.style,E=ap(&quot;textpath&quot;);au.style.cssText=&quot;position:absolute;left:0;top:0;width:&quot;+i.width+&quot;px;height:&quot;+i.height+&quot;px&quot;;au.coordsize=i.coordsize;au.coordorigin=i.coordorigin;aA.v=l.format(&quot;m{0},{1}l{2},{1}&quot;,ai(ay),ai(ax),ai(ay)+1);aA.textpathok=true;aw.width=i.width;aw.height=i.height;E.string=az;E.on=true;R[c](E);R[c](aA);au[c](R);var av=new s(E,au,i);av.shape=R;av.textpath=aA;av.type=&quot;text&quot;;av.attrs.text=az;av.attrs.x=ay;av.attrs.y=ax;av.attrs.w=1;av.attrs.h=1;W(av,{font:A.font,stroke:&quot;none&quot;,fill:&quot;#000&quot;});av.setBox();i.canvas[c](au);return av;};var U=function(E,e){var i=this.canvas.style;this.width=b(E||this.width);this.height=b(e||this.height);i.width=this.width+&quot;px&quot;;i.height=this.height+&quot;px&quot;;i.clip=&quot;rect(0 &quot;+this.width+&quot;px &quot;+this.height+&quot;px 0)&quot;;this.coordsize=this.width+&quot; &quot;+this.height;return this;};m.createStyleSheet().addRule(&quot;.rvml&quot;,&quot;behavior:url(#default#VML)&quot;);try{!m.namespaces.rvml&amp;&amp;m.namespaces.add(&quot;rvml&quot;,&quot;urn:schemas-microsoft-com:vml&quot;);var ap=function(e){return m.createElement(&quot;&lt;rvml:&quot;+e+' class=&quot;rvml&quot;&gt;');};}catch(an){var ap=function(e){return m.createElement(&quot;&lt;&quot;+e+' xmlns=&quot;urn:schemas-microsoft.com:vml&quot; class=&quot;rvml&quot;&gt;');};}var q=function(){var R=X[ao](null,arguments),i=R.container,az=R.height,aA,E=R.width,ay=R.x,ax=R.y;if(!i){throw new Error(&quot;VML container not found.&quot;);}var av={},aw=av.canvas=m.createElement(&quot;div&quot;),au=aw.style;E=b(E)||512;az=b(az)||342;av.width=E;av.height=az;av.coordsize=E+&quot; &quot;+az;av.coordorigin=&quot;0 0&quot;;av.span=m.createElement(&quot;span&quot;);av.span.style.cssText=&quot;position:absolute;left:-9999px;top:-9999px;padding:0;margin:0;line-height:1;display:inline;&quot;;aw[c](av.span);au.cssText=l.format(&quot;width:{0}px;height:{1}px;position:absolute;clip:rect(0 {0}px {1}px 0)&quot;,E,az);if(i==1){m.body[c](aw);au.left=ay+&quot;px&quot;;au.top=ax+&quot;px&quot;;i={style:{width:E,height:az}};}else{i.style.width=E;i.style.height=az;if(i.firstChild){i.insertBefore(aw,i.firstChild);}else{i[c](aw);}}for(var e in d){if(d[h](e)){av[e]=d[e];}}a.call(av,av,l.fn);av.clear=function(){while(aw.firstChild){aw.removeChild(aw.firstChild);}};av.raphael=l;return av;};d.remove=function(){this.canvas.parentNode.removeChild(this.canvas);for(var e in this){delete this[e];}};}if({&quot;Apple Computer, Inc.&quot;:1,&quot;Google Inc.&quot;:1}[navigator.vendor]){d.safari=function(){var e=this.rect(-99,-99,this.width+99,this.height+99);setTimeout(function(){e.remove();});};}else{d.safari=function(){};}var o=(function(){if(m.addEventListener){return function(au,E,i,e){var R=function(av){return i.call(e,av);};au.addEventListener(E,R,false);return function(){au.removeEventListener(E,R,false);return true;};};}else{if(m.attachEvent){return function(av,R,E,i){var au=function(aw){return E.call(i,aw||ad.event);};av.attachEvent(&quot;on&quot;+R,au);var e=function(){av.detachEvent(&quot;on&quot;+R,au);return true;};if(R==&quot;mouseover&quot;){av.attachEvent(&quot;onmouseenter&quot;,au);return function(){av.detachEvent(&quot;onmouseenter&quot;,au);return e();};}else{if(R==&quot;mouseout&quot;){av.attachEvent(&quot;onmouseleave&quot;,au);return function(){av.detachEvent(&quot;onmouseleave&quot;,au);return e();};}}return e;};}}})();for(var ak=G[z];ak--;){(function(e){s[v][e]=function(i){if(l.is(i,&quot;function&quot;)){this.events=this.events||{};this.events[e]=this.events[e]||{};this.events[e][i]=this.events[e][i]||[];this.events[e][i][ae](o(this.shape||this.node,e,i,this));}return this;};s[v][&quot;un&quot;+e]=function(i){this.events&amp;&amp;this.events[e]&amp;&amp;this.events[e][i]&amp;&amp;this.events[e][i][z]&amp;&amp;this.events[e][i].shift()()&amp;&amp;!this.events[e][i][z]&amp;&amp;delete this.events[e][i];};})(G[ak]);}d.circle=function(e,E,i){return S(this,e||0,E||0,i||0);};d.rect=function(e,au,i,E,R){return aa(this,e||0,au||0,i||0,E||0,R||0);};d.ellipse=function(e,R,E,i){return n(this,e||0,R||0,E||0,i||0);};d.path=function(e){e&amp;&amp;!l.is(e,&quot;string&quot;)&amp;&amp;!l.is(e[0],&quot;array&quot;)&amp;&amp;(e+=w);return aq(l.format[ao](l,arguments),this);};d.image=function(R,e,au,i,E){return y(this,R||&quot;about:blank&quot;,e||0,au||0,i||0,E||0);};d.text=function(e,E,i){return Z(this,e||0,E||0,i||w);};d.set=function(e){arguments[z]&gt;1&amp;&amp;(e=Array[v].splice.call(arguments,0,arguments[z]));return new p(e);};d.setSize=U;s[v].stop=function(){clearTimeout(this.animation_in_progress);return this;};s[v].scale=function(aE,aD,R,E){if(aE==null&amp;&amp;aD==null){return{x:this._.sx,y:this._.sy,toString:function(){return this.x+&quot; &quot;+this.y;}};}aD=aD||aE;!+aD&amp;&amp;(aD=aE);var aI,aG,aH,aF,aU=this.attrs;if(aE!=0){var aB=this.getBBox(),ay=aB.x+aB.width/2,av=aB.y+aB.height/2,aT=aE/this._.sx,aS=aD/this._.sy;R=(+R||R==0)?R:ay;E=(+E||E==0)?E:av;var aA=~~(aE/Math.abs(aE)),ax=~~(aD/Math.abs(aD)),aL=this.node.style,aW=R+(ay-R)*aA*aT,aV=E+(av-E)*ax*aS;switch(this.type){case&quot;rect&quot;:case&quot;image&quot;:var az=aU.width*aA*aT,aK=aU.height*ax*aS,aC=aU.r*V(aT,aS),aw=aW-az/2,au=aV-aK/2;this.attr({width:az,height:aK,x:aw,y:au,r:aC});break;case&quot;circle&quot;:case&quot;ellipse&quot;:this.attr({rx:aU.rx*aT,ry:aU.ry*aS,r:aU.r*V(aT,aS),cx:aW,cy:aV});break;case&quot;path&quot;:var aN=g(aU.path),aO=true;for(var aQ=0,aJ=aN[z];aQ&lt;aJ;aQ++){var aM=aN[aQ];if(aM[0].toUpperCase()==&quot;M&quot;&amp;&amp;aO){continue;}else{aO=false;}if(l.svg&amp;&amp;aM[0].toUpperCase()==&quot;A&quot;){aM[aN[aQ][z]-2]*=aT;aM[aN[aQ][z]-1]*=aS;aM[1]*=aT;aM[2]*=aS;aM[5]=+(aA+ax?!!+aM[5]:!+aM[5]);}else{for(var aP=1,aR=aM[z];aP&lt;aR;aP++){aM[aP]*=(aP%2)?aT:aS;}}}var e=T(aN),aI=aW-e.x-e.width/2,aG=aV-e.y-e.height/2;aN[0][1]+=aI;aN[0][2]+=aG;this.attr({path:aN});break;}if(this.type in {text:1,image:1}&amp;&amp;(aA!=1||ax!=1)){if(this.transformations){this.transformations[2]=&quot;scale(&quot;[J](aA,&quot;,&quot;,ax,&quot;)&quot;);this.node[f](&quot;transform&quot;,this.transformations[t](&quot; &quot;));aI=(aA==-1)?-aU.x-(az||0):aU.x;aG=(ax==-1)?-aU.y-(aK||0):aU.y;this.attr({x:aI,y:aG});aU.fx=aA-1;aU.fy=ax-1;}else{this.node.filterMatrix=&quot; progid:DXImageTransform.Microsoft.Matrix(M11=&quot;[J](aA,&quot;, M12=0, M21=0, M22=&quot;,ax,&quot;, Dx=0, Dy=0, sizingmethod='auto expand', filtertype='bilinear')&quot;);aL.filter=(this.node.filterMatrix||w)+(this.node.filterOpacity||w);}}else{if(this.transformations){this.transformations[2]=w;this.node[f](&quot;transform&quot;,this.transformations[t](&quot; &quot;));aU.fx=0;aU.fy=0;}else{this.node.filterMatrix=w;aL.filter=(this.node.filterMatrix||w)+(this.node.filterOpacity||w);}}aU.scale=[aE,aD,R,E][t](&quot; &quot;);this._.sx=aE;this._.sy=aD;}return this;};l.easing_formulas={linear:function(e){return e;},&quot;&lt;&quot;:function(e){return L(e,3);},&quot;&gt;&quot;:function(e){return L(e-1,3)+1;},&quot;&lt;&gt;&quot;:function(e){e=e*2;if(e&lt;1){return L(e,3)/2;}e-=2;return(L(e,3)+2)/2;},backIn:function(i){var e=1.70158;return i*i*((e+1)*i-e);},backOut:function(i){i=i-1;var e=1.70158;return i*i*((e+1)*i+e)+1;},elastic:function(E){if(E==0||E==1){return E;}var i=0.3,e=i/4;return L(2,-10*E)*Math.sin((E-e)*(2*Math.PI)/i)+1;},bounce:function(R){var i=7.5625,E=2.75,e;if(R&lt;(1/E)){e=i*R*R;}else{if(R&lt;(2/E)){R-=(1.5/E);e=i*R*R+0.75;}else{if(R&lt;(2.5/E)){R-=(2.25/E);e=i*R*R+0.9375;}else{R-=(2.625/E);e=i*R*R+0.984375;}}}return e;}};s[v].animate=function(aM,aD,aC,au){clearTimeout(this.animation_in_progress);if(l.is(aC,&quot;function&quot;)||!aC){au=aC||null;}var aG={},E={},aA={},az={x:0,y:0};for(var aE in aM){if(aM[h](aE)){if(aE in F){aG[aE]=this.attr(aE);(aG[aE]==null)&amp;&amp;(aG[aE]=A[aE]);E[aE]=aM[aE];switch(F[aE]){case&quot;number&quot;:aA[aE]=(E[aE]-aG[aE])/aD;break;case&quot;colour&quot;:aG[aE]=l.getRGB(aG[aE]);var aF=l.getRGB(E[aE]);aA[aE]={r:(aF.r-aG[aE].r)/aD,g:(aF.g-aG[aE].g)/aD,b:(aF.b-aG[aE].b)/aD};break;case&quot;path&quot;:var av=ag(aG[aE],E[aE]);aG[aE]=av[0];E[aE]=av[1];aA[aE]=[];for(var aI=0,ay=aG[aE][z];aI&lt;ay;aI++){aA[aE][aI]=[0];for(var aH=1,aK=aG[aE][aI][z];aH&lt;aK;aH++){aA[aE][aI][aH]=(E[aE][aI][aH]-aG[aE][aI][aH])/aD;}}break;case&quot;csv&quot;:var e=(aM[aE]+w)[H](at),ax=(aG[aE]+w)[H](at);switch(aE){case&quot;translation&quot;:aG[aE]=[0,0];aA[aE]=[e[0]/aD,e[1]/aD];break;case&quot;rotation&quot;:aG[aE]=(ax[1]==e[1]&amp;&amp;ax[2]==e[2])?ax:[0,e[1],e[2]];aA[aE]=[(e[0]-aG[aE][0])/aD,0,0];break;case&quot;scale&quot;:aM[aE]=e;aG[aE]=(aG[aE]+w)[H](at);aA[aE]=[(e[0]-aG[aE][0])/aD,(e[1]-aG[aE][1])/aD,0,0];break;case&quot;clip-rect&quot;:aG[aE]=(aG[aE]+w)[H](at);aA[aE]=[];var aI=4;while(aI--){aA[aE][aI]=(e[aI]-aG[aE][aI])/aD;}break;}E[aE]=e;}}}}var R=+new Date,aB=0,aL=function(i){return i&gt;255?255:i;},aw=this;(function aJ(){var aO=new Date-R,aW={},aN;if(aO&lt;aD){var aU=l.easing_formulas[aC]?l.easing_formulas[aC](aO/aD):aO/aD;for(var aS in aG){if(aG[h](aS)){switch(F[aS]){case&quot;number&quot;:aN=+aG[aS]+aU*aD*aA[aS];break;case&quot;colour&quot;:aN=&quot;rgb(&quot;+[aL(ai(aG[aS].r+aU*aD*aA[aS].r)),aL(ai(aG[aS].g+aU*aD*aA[aS].g)),aL(ai(aG[aS].b+aU*aD*aA[aS].b))][t](&quot;,&quot;)+&quot;)&quot;;break;case&quot;path&quot;:aN=[];for(var aQ=0,aX=aG[aS][z];aQ&lt;aX;aQ++){aN[aQ]=[aG[aS][aQ][0]];for(var aP=1,aR=aG[aS][aQ][z];aP&lt;aR;aP++){aN[aQ][aP]=+aG[aS][aQ][aP]+aU*aD*aA[aS][aQ][aP];}aN[aQ]=aN[aQ][t](&quot; &quot;);}aN=aN[t](&quot; &quot;);break;case&quot;csv&quot;:switch(aS){case&quot;translation&quot;:var aV=aA[aS][0]*(aO-aB),aT=aA[aS][1]*(aO-aB);az.x+=aV;az.y+=aT;aN=aV+&quot; &quot;+aT;break;case&quot;rotation&quot;:aN=+aG[aS][0]+aU*aD*aA[aS][0];aG[aS][1]&amp;&amp;(aN+=&quot;,&quot;+aG[aS][1]+&quot;,&quot;+aG[aS][2]);break;case&quot;scale&quot;:aN=[+aG[aS][0]+aU*aD*aA[aS][0],+aG[aS][1]+aU*aD*aA[aS][1],(2 in aM[aS]?aM[aS][2]:w),(3 in aM[aS]?aM[aS][3]:w)][t](&quot; &quot;);break;case&quot;clip-rect&quot;:aN=[];var aQ=4;while(aQ--){aN[aQ]=+aG[aS][aQ]+aU*aD*aA[aS][aQ];}break;}break;}aW[aS]=aN+w;}}aw.attr(aW);aw.animation_in_progress=setTimeout(aJ);l.svg&amp;&amp;d.safari();}else{(az.x||az.y)&amp;&amp;aw.translate(-az.x,-az.y);aM.scale&amp;&amp;(aM.scale=aM.scale+w);aw.attr(aM);clearTimeout(aw.animation_in_progress);l.svg&amp;&amp;d.safari();(l.is(au,&quot;function&quot;))&amp;&amp;au.call(aw);}aB=aO;})();return this;};s[v].translate=function(e,E){if(e==null){return{x:this._.tx,y:this._.ty};}this._.tx+=+e;this._.ty+=+E;switch(this.type){case&quot;circle&quot;:case&quot;ellipse&quot;:this.attr({cx:+e+this.attrs.cx,cy:+E+this.attrs.cy});break;case&quot;rect&quot;:case&quot;image&quot;:case&quot;text&quot;:this.attr({x:+e+this.attrs.x,y:+E+this.attrs.y});break;case&quot;path&quot;:var i=g(this.attrs.path);i[0][1]+=+e;i[0][2]+=+E;this.attr({path:i});break;}return this;};s[v][j]=function(){return&quot;Rapha\u00ebl\u2019s object&quot;;};var p=function(e){this.items=[];this[z]=0;if(e){for(var E=0,R=e[z];E&lt;R;E++){if(e[E]&amp;&amp;(e[E].constructor==s||e[E].constructor==p)){this[this.items[z]]=this.items[this.items[z]]=e[E];this[z]++;}}}};p[v][ae]=function(){var au,e;for(var E=0,R=arguments[z];E&lt;R;E++){au=arguments[E];if(au&amp;&amp;(au.constructor==s||au.constructor==p)){e=this.items[z];this[e]=this.items[e]=au;this[z]++;}}return this;};p[v].pop=function(){delete this[this[z]--];return this.items.pop();};for(var al in s[v]){if(s[v][h](al)){p[v][al]=(function(e){return function(){for(var E=0,R=this.items[z];E&lt;R;E++){this.items[E][e][ao](this.items[E],arguments);}return this;};})(al);}}p[v].attr=function(E,aw){if(E&amp;&amp;l.is(E,&quot;array&quot;)&amp;&amp;l.is(E[0],&quot;object&quot;)){for(var e=0,av=E[z];e&lt;av;e++){this.items[e].attr(E[e]);}}else{for(var R=0,au=this.items[z];R&lt;au;R++){this.items[R].attr[ao](this.items[R],arguments);}}return this;};p[v].animate=function(av,E,ay,ax){if(l.is(ay,&quot;function&quot;)||!ay){ax=ay||null;}var e=this.items[z],R=e,aw=this;if(ax){var au=function(){!--e&amp;&amp;ax.call(aw);};while(R--){this.items[R].animate(av,E,ay||au,au);}}else{while(R--){this.items[R].animate(av,E,ay);}}return this;};p[v].getBBox=function(){var e=[],aw=[],E=[],au=[];for(var R=this.items[z];R--;){var av=this.items[R].getBBox();e[ae](av.x);aw[ae](av.y);E[ae](av.x+av.width);au[ae](av.y+av.height);}e=V[ao](0,e);aw=V[ao](0,aw);return{x:e,y:aw,width:r[ao](0,E)-e,height:r[ao](0,au)-aw};};l.registerFont=function(i){if(!i.face){return i;}this.fonts=this.fonts||{};var R={w:i.w,face:{},glyphs:{}},E=i.face[&quot;font-family&quot;];for(var aw in i.face){if(i.face[h](aw)){R.face[aw]=i.face[aw];}}if(this.fonts[E]){this.fonts[E][ae](R);}else{this.fonts[E]=[R];}if(!i.svg){R.face[&quot;units-per-em&quot;]=u(i.face[&quot;units-per-em&quot;],10);for(var au in i.glyphs){if(i.glyphs[h](au)){var av=i.glyphs[au];R.glyphs[au]={w:av.w,k:{},d:av.d&amp;&amp;&quot;M&quot;+av.d[Q](/[mlcxtrv]/g,function(ax){return{l:&quot;L&quot;,c:&quot;C&quot;,x:&quot;z&quot;,t:&quot;m&quot;,r:&quot;l&quot;,v:&quot;c&quot;}[ax]||&quot;M&quot;;})+&quot;z&quot;};if(av.k){for(var e in av.k){if(av[h](e)){R.glyphs[au].k[e]=av.k[e];}}}}}}return i;};d.getFont=function(ay,az,E,au){au=au||&quot;normal&quot;;E=E||&quot;normal&quot;;az=+az||{normal:400,bold:700,lighter:300,bolder:800}[az]||400;var av=l.fonts[ay];if(!av){var R=new RegExp(&quot;(^|\\s)&quot;+ay[Q](/[^\w\d\s+!~.:_-]/g,w)+&quot;(\\s|$)&quot;,&quot;i&quot;);for(var e in l.fonts){if(l.fonts[h](e)){if(R.test(e)){av=l.fonts[e];break;}}}}var aw;if(av){for(var ax=0,aA=av[z];ax&lt;aA;ax++){aw=av[ax];if(aw.face[&quot;font-weight&quot;]==az&amp;&amp;(aw.face[&quot;font-style&quot;]==E||!aw.face[&quot;font-style&quot;])&amp;&amp;aw.face[&quot;font-stretch&quot;]==au){break;}}}return aw;};d.print=function(aA,az,ax,E,aE){var av=this.set(),ay=(ax+w)[H](w),e=0,aD=w,au;l.is(E,&quot;string&quot;)&amp;&amp;(E=this.getFont(E));if(E){au=(aE||16)/E.face[&quot;units-per-em&quot;];for(var aw=0,aB=ay[z];aw&lt;aB;aw++){var R=aw&amp;&amp;E.glyphs[ay[aw-1]]||{},aC=E.glyphs[ay[aw]];e+=aw?(R.w||E.w)+(R.k&amp;&amp;R.k[ay[aw]]||0):0;aC&amp;&amp;aC.d&amp;&amp;av[ae](this.path(aC.d).attr({fill:&quot;#000&quot;,stroke:&quot;none&quot;,translation:[e,0]}));}av.scale(au,au,0,az).translate(aA,(aE||16)/2);}return av;};l.format=function(i){var e=l.is(arguments[1],&quot;array&quot;)?[0][J](arguments[1]):arguments;i&amp;&amp;l.is(i,&quot;string&quot;)&amp;&amp;e[z]-1&amp;&amp;(i=i[Q](/\{(\d+)\}/g,function(R,E){return e[++E]==null?w:e[E];}));return i||w;};l.ninja=function(){var E=ad.Raphael,i;if(aj.was){ad.Raphael=aj.is;}else{try{delete ad.Raphael;}catch(R){ad.Raphael=i;}}return E;};l.el=s[v];return l;})();
\ No newline at end of file</diff>
      <filename>raphael-min.js</filename>
    </modified>
    <modified>
      <diff>@@ -1,5 +1,5 @@
 /*
- * Raphael 1.0 - JavaScript Vector Library
+ * Raphael 1.1 - JavaScript Vector Library
  *
  * Copyright (c) 2008 - 2009 Dmitry Baranovskiy (http://raphaeljs.com)
  * Licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) license.
@@ -11,45 +11,61 @@ window.Raphael = (function () {
         doc = document,
         win = window,
         oldRaphael = {
-            was: &quot;Raphael&quot; in window,
-            is: window.Raphael
+            was: &quot;Raphael&quot; in win,
+            is: win.Raphael
         },
         R = function () {
             if (R.is(arguments[0], &quot;array&quot;)) {
                 var a = arguments[0],
-                    cnv = create[ap](R, a.splice(0, 3 + R.is(a[0], &quot;number&quot;))),
+                    cnv = create[apply](R, a.splice(0, 3 + R.is(a[0], nu))),
                     res = cnv.set();
-                for (var i = 0, ii = a[ln]; i &lt; ii; i++) {
+                for (var i = 0, ii = a[length]; i &lt; ii; i++) {
                     var j = a[i] || {};
-                    j.type in {circle:1, rect:1, path:1, ellipse:1, text:1, image:1} &amp;&amp; res.push(cnv[j.type]().attr(j));
+                    ({circle:1, rect:1, path:1, ellipse:1, text:1, image:1}[has](j.type)) &amp;&amp; res[push](cnv[j.type]().attr(j));
                 }
                 return res;
             }
-            return create[ap](R, arguments);
+            return create[apply](R, arguments);
         },
         paper = {},
-        availableAttrs = {&quot;clip-rect&quot;: &quot;0 0 10e9 10e9&quot;, cx: 0, cy: 0, fill: &quot;#fff&quot;, &quot;fill-opacity&quot;: 1, font: '10px &quot;Arial&quot;', &quot;font-family&quot;: '&quot;Arial&quot;', &quot;font-size&quot;: &quot;10&quot;, &quot;font-style&quot;: &quot;normal&quot;, &quot;font-weight&quot;: 400, gradient: 0, height: 0, href: &quot;http://raphaeljs.com/&quot;, opacity: 1, path: &quot;M0,0&quot;, r: 0, rotation: 0, rx: 0, ry: 0, scale: &quot;1 1&quot;, src: &quot;&quot;, stroke: &quot;#000&quot;, &quot;stroke-dasharray&quot;: &quot;&quot;, &quot;stroke-linecap&quot;: &quot;butt&quot;, &quot;stroke-linejoin&quot;: &quot;butt&quot;, &quot;stroke-miterlimit&quot;: 0, &quot;stroke-opacity&quot;: 1, &quot;stroke-width&quot;: 1, target: &quot;_blank&quot;, &quot;text-anchor&quot;: &quot;middle&quot;, title: &quot;Raphael&quot;, translation: &quot;0 0&quot;, width: 0, x: 0, y: 0},
-        availableAnimAttrs = {&quot;clip-rect&quot;: &quot;csv&quot;, cx: &quot;number&quot;, cy: &quot;number&quot;, fill: &quot;colour&quot;, &quot;fill-opacity&quot;: &quot;number&quot;, &quot;font-size&quot;: &quot;number&quot;, height: &quot;number&quot;, opacity: &quot;number&quot;, path: &quot;path&quot;, r: &quot;number&quot;, rotation: &quot;csv&quot;, rx: &quot;number&quot;, ry: &quot;number&quot;, scale: &quot;csv&quot;, stroke: &quot;colour&quot;, &quot;stroke-opacity&quot;: &quot;number&quot;, &quot;stroke-width&quot;: &quot;number&quot;, translation: &quot;csv&quot;, width: &quot;number&quot;, x: &quot;number&quot;, y: &quot;number&quot;},
         events = [&quot;click&quot;, &quot;dblclick&quot;, &quot;mousedown&quot;, &quot;mousemove&quot;, &quot;mouseout&quot;, &quot;mouseover&quot;, &quot;mouseup&quot;],
+        E = &quot;&quot;,
+        has = &quot;hasOwnProperty&quot;,
         proto = &quot;prototype&quot;,
-        ap = &quot;apply&quot;,
-        ln = &quot;length&quot;,
-        pf = &quot;parseFloat&quot;,
-        pi = &quot;parseInt&quot;;
-    R.version = &quot;1.0&quot;;
-    R.type = (window.SVGAngle || document.implementation.hasFeature(&quot;http://www.w3.org/TR/SVG11/feature#BasicStructure&quot;, &quot;1.1&quot;) ? &quot;SVG&quot; : &quot;VML&quot;);
+        setAttribute = &quot;setAttribute&quot;,
+        appendChild = &quot;appendChild&quot;,
+        apply = &quot;apply&quot;,
+        length = &quot;length&quot;,
+        join = &quot;join&quot;,
+        split = &quot;split&quot;,
+        concat = &quot;concat&quot;,
+        push = &quot;push&quot;,
+        toFloat = parseFloat,
+        toInt = parseInt,
+        pow = Math.pow,
+        mmin = Math.min,
+        mmax = Math.max,
+        round = Math.round,
+        rg = /^(?=[\da-f]$)/,
+        nu = &quot;number&quot;,
+        toString = &quot;toString&quot;,
+        availableAttrs = {&quot;clip-rect&quot;: &quot;0 0 10e9 10e9&quot;, cx: 0, cy: 0, fill: &quot;#fff&quot;, &quot;fill-opacity&quot;: 1, font: '10px &quot;Arial&quot;', &quot;font-family&quot;: '&quot;Arial&quot;', &quot;font-size&quot;: &quot;10&quot;, &quot;font-style&quot;: &quot;normal&quot;, &quot;font-weight&quot;: 400, gradient: 0, height: 0, href: &quot;http://raphaeljs.com/&quot;, opacity: 1, path: &quot;M0,0&quot;, r: 0, rotation: 0, rx: 0, ry: 0, scale: &quot;1 1&quot;, src: &quot;&quot;, stroke: &quot;#000&quot;, &quot;stroke-dasharray&quot;: &quot;&quot;, &quot;stroke-linecap&quot;: &quot;butt&quot;, &quot;stroke-linejoin&quot;: &quot;butt&quot;, &quot;stroke-miterlimit&quot;: 0, &quot;stroke-opacity&quot;: 1, &quot;stroke-width&quot;: 1, target: &quot;_blank&quot;, &quot;text-anchor&quot;: &quot;middle&quot;, title: &quot;Raphael&quot;, translation: &quot;0 0&quot;, width: 0, x: 0, y: 0},
+        availableAnimAttrs = {&quot;clip-rect&quot;: &quot;csv&quot;, cx: nu, cy: nu, fill: &quot;colour&quot;, &quot;fill-opacity&quot;: nu, &quot;font-size&quot;: nu, height: nu, opacity: nu, path: &quot;path&quot;, r: nu, rotation: &quot;csv&quot;, rx: nu, ry: nu, scale: &quot;csv&quot;, stroke: &quot;colour&quot;, &quot;stroke-opacity&quot;: nu, &quot;stroke-width&quot;: nu, translation: &quot;csv&quot;, width: nu, x: nu, y: nu},
+        rp = &quot;replace&quot;;
+    R.version = &quot;1.1&quot;;
+    R.type = (win.SVGAngle || doc.implementation.hasFeature(&quot;http://www.w3.org/TR/SVG11/feature#BasicStructure&quot;, &quot;1.1&quot;) ? &quot;SVG&quot; : &quot;VML&quot;);
     R.svg = !(R.vml = R.type == &quot;VML&quot;);
     R.idGenerator = 0;
     R.fn = {};
     R.is = function (o, type) {
-        type = (type + &quot;&quot;).toLowerCase();
+        type = (type + E).toLowerCase();
         if ((type == &quot;object&quot; || type == &quot;undefined&quot;) &amp;&amp; typeof o == type) {
             return true;
         }
         if (o == null &amp;&amp; type == &quot;null&quot;) {
             return true;
         }
-        return Object[proto].toString.call(o).replace(/^\[object\s+|\]$/gi, &quot;&quot;).toLowerCase() == type;
+        return Object[proto][toString].call(o)[rp](/^\[object\s+|\]$/gi, E).toLowerCase() == type;
     };
     R.setWindow = function (newwin) {
         win = newwin;
@@ -73,7 +89,7 @@ window.Raphael = (function () {
             saturation /= 255;
             brightness /= 255;
         }
-        var i = Math.floor(hue * 6),
+        var i = ~~(hue * 6),
             f = (hue * 6) - i,
             p = brightness * (1 - saturation),
             q = brightness * (1 - (saturation * f)),
@@ -85,18 +101,12 @@ window.Raphael = (function () {
         green *= 255;
         blue *= 255;
         var rgb = {r: red, g: green, b: blue},
-            r = (~~red).toString(16),
-            g = (~~green).toString(16),
-            b = (~~blue).toString(16);
-        if (r[ln] == 1) {
-            r = &quot;0&quot; + r;
-        }
-        if (g[ln] == 1) {
-            g = &quot;0&quot; + g;
-        }
-        if (b[ln] == 1) {
-            b = &quot;0&quot; + b;
-        }
+            r = (~~red)[toString](16),
+            g = (~~green)[toString](16),
+            b = (~~blue)[toString](16);
+        r = r[rp](rg, &quot;0&quot;);
+        g = g[rp](rg, &quot;0&quot;);
+        b = b[rp](rg, &quot;0&quot;);
         rgb.hex = &quot;#&quot; + r + g + b;
         return rgb;
     }, R);
@@ -117,8 +127,8 @@ window.Raphael = (function () {
             green /= 255;
             blue /= 255;
         }
-        var max = Math.max(red, green, blue),
-            min = Math.min(red, green, blue),
+        var max = mmax(red, green, blue),
+            min = mmin(red, green, blue),
             hue,
             saturation,
             brightness = max;
@@ -145,31 +155,31 @@ window.Raphael = (function () {
         return {h: hue, s: saturation, b: brightness};
     }, R);
     R._path2string = function () {
-        var res = &quot;&quot;,
+        var res = E,
             item;
-        for (var i = 0, ii = this[ln]; i &lt; ii; i++) {
-            for (var j = 0, jj = this[i][ln]; j &lt; jj; j++) {
+        for (var i = 0, ii = this[length]; i &lt; ii; i++) {
+            for (var j = 0, jj = this[i][length]; j &lt; jj; j++) {
                 res += this[i][j];
                 j &amp;&amp; j != jj - 1 &amp;&amp; (res += &quot;,&quot;);
             }
-            i != ii - 1 &amp;&amp; (res += &quot;\n&quot;);
+            i != ii - 1 &amp;&amp; (res += &quot; &quot;);
         }
-        return res.replace(/,(?=-)/g, &quot;&quot;);
+        return res[rp](/,(?=-)/g, E);
     };
     function cacher(f, scope, postprocessor) {
         function newf() {
-            var arg = Array[proto].splice.call(arguments, 0, arguments[ln]),
-                args = arg.join(&quot;\u25ba&quot;);
+            var arg = Array[proto].splice.call(arguments, 0, arguments[length]),
+                args = arg[join](&quot;\u25ba&quot;);
             newf.cache = newf.cache || {};
             newf.count = newf.count || [];
             if (args in newf.cache) {
                 return postprocessor ? postprocessor(newf.cache[args]) : newf.cache[args];
             }
-            if (newf.count[ln] &gt; 1000) {
-                delete newf.cache[newf.count.unshift()];
+            if (newf.count[length] &gt;= 1e3) {
+                delete newf.cache[newf.count.shift()];
             }
-            newf.count.push(args);
-            newf.cache[args] = f[ap](scope, arg);
+            newf.count[push](args);
+            newf.cache[args] = f[apply](scope, arg);
             return postprocessor ? postprocessor(newf.cache[args]) : newf.cache[args];
         }
         return newf;
@@ -178,7 +188,7 @@ window.Raphael = (function () {
     R.getRGB = cacher(function (colour) {
         var htmlcolors = {none: &quot;none&quot;, aliceblue: &quot;#f0f8ff&quot;, amethyst: &quot;#96c&quot;, antiquewhite: &quot;#faebd7&quot;, aqua: &quot;#0ff&quot;, aquamarine: &quot;#7fffd4&quot;, azure: &quot;#f0ffff&quot;, beige: &quot;#f5f5dc&quot;, bisque: &quot;#ffe4c4&quot;, black: &quot;#000&quot;, blanchedalmond: &quot;#ffebcd&quot;, blue: &quot;#00f&quot;, blueviolet: &quot;#8a2be2&quot;, brown: &quot;#a52a2a&quot;, burlywood: &quot;#deb887&quot;, cadetblue: &quot;#5f9ea0&quot;, chartreuse: &quot;#7fff00&quot;, chocolate: &quot;#d2691e&quot;, coral: &quot;#ff7f50&quot;, cornflowerblue: &quot;#6495ed&quot;, cornsilk: &quot;#fff8dc&quot;, crimson: &quot;#dc143c&quot;, cyan: &quot;#0ff&quot;, darkblue: &quot;#00008b&quot;, darkcyan: &quot;#008b8b&quot;, darkgoldenrod: &quot;#b8860b&quot;, darkgray: &quot;#a9a9a9&quot;, darkgreen: &quot;#006400&quot;, darkkhaki: &quot;#bdb76b&quot;, darkmagenta: &quot;#8b008b&quot;, darkolivegreen: &quot;#556b2f&quot;, darkorange: &quot;#ff8c00&quot;, darkorchid: &quot;#9932cc&quot;, darkred: &quot;#8b0000&quot;, darksalmon: &quot;#e9967a&quot;, darkseagreen: &quot;#8fbc8f&quot;, darkslateblue: &quot;#483d8b&quot;, darkslategray: &quot;#2f4f4f&quot;, darkturquoise: &quot;#00ced1&quot;, darkviolet: &quot;#9400d3&quot;, deeppink: &quot;#ff1493&quot;, deepskyblue: &quot;#00bfff&quot;, dimgray: &quot;#696969&quot;, dodgerblue: &quot;#1e90ff&quot;, firebrick: &quot;#b22222&quot;, floralwhite: &quot;#fffaf0&quot;, forestgreen: &quot;#228b22&quot;, fuchsia: &quot;#f0f&quot;, gainsboro: &quot;#dcdcdc&quot;, ghostwhite: &quot;#f8f8ff&quot;, gold: &quot;#ffd700&quot;, goldenrod: &quot;#daa520&quot;, gray: &quot;#808080&quot;, green: &quot;#008000&quot;, greenyellow: &quot;#adff2f&quot;, honeydew: &quot;#f0fff0&quot;, hotpink: &quot;#ff69b4&quot;, indianred: &quot;#cd5c5c&quot;, indigo: &quot;#4b0082&quot;, ivory: &quot;#fffff0&quot;, khaki: &quot;#f0e68c&quot;, lavender: &quot;#e6e6fa&quot;, lavenderblush: &quot;#fff0f5&quot;, lawngreen: &quot;#7cfc00&quot;, lemonchiffon: &quot;#fffacd&quot;, lightblue: &quot;#add8e6&quot;, lightcoral: &quot;#f08080&quot;, lightcyan: &quot;#e0ffff&quot;, lightgoldenrodyellow: &quot;#fafad2&quot;, lightgreen: &quot;#90ee90&quot;, lightgrey: &quot;#d3d3d3&quot;, lightpink: &quot;#ffb6c1&quot;, lightsalmon: &quot;#ffa07a&quot;, lightsalmon: &quot;#ffa07a&quot;, lightseagreen: &quot;#20b2aa&quot;, lightskyblue: &quot;#87cefa&quot;, lightslategray: &quot;#789&quot;, lightsteelblue: &quot;#b0c4de&quot;, lightyellow: &quot;#ffffe0&quot;, lime: &quot;#0f0&quot;, limegreen: &quot;#32cd32&quot;, linen: &quot;#faf0e6&quot;, magenta: &quot;#f0f&quot;, maroon: &quot;#800000&quot;, mediumaquamarine: &quot;#66cdaa&quot;, mediumblue: &quot;#0000cd&quot;, mediumorchid: &quot;#ba55d3&quot;, mediumpurple: &quot;#9370db&quot;, mediumseagreen: &quot;#3cb371&quot;, mediumslateblue: &quot;#7b68ee&quot;, mediumslateblue: &quot;#7b68ee&quot;, mediumspringgreen: &quot;#00fa9a&quot;, mediumturquoise: &quot;#48d1cc&quot;, mediumvioletred: &quot;#c71585&quot;, midnightblue: &quot;#191970&quot;, mintcream: &quot;#f5fffa&quot;, mistyrose: &quot;#ffe4e1&quot;, moccasin: &quot;#ffe4b5&quot;, navajowhite: &quot;#ffdead&quot;, navy: &quot;#000080&quot;, oldlace: &quot;#fdf5e6&quot;, olive: &quot;#808000&quot;, olivedrab: &quot;#6b8e23&quot;, orange: &quot;#ffa500&quot;, orangered: &quot;#ff4500&quot;, orchid: &quot;#da70d6&quot;, palegoldenrod: &quot;#eee8aa&quot;, palegreen: &quot;#98fb98&quot;, paleturquoise: &quot;#afeeee&quot;, palevioletred: &quot;#db7093&quot;, papayawhip: &quot;#ffefd5&quot;, peachpuff: &quot;#ffdab9&quot;, peru: &quot;#cd853f&quot;, pink: &quot;#ffc0cb&quot;, plum: &quot;#dda0dd&quot;, powderblue: &quot;#b0e0e6&quot;, purple: &quot;#800080&quot;, red: &quot;#f00&quot;, rosybrown: &quot;#bc8f8f&quot;, royalblue: &quot;#4169e1&quot;, saddlebrown: &quot;#8b4513&quot;, salmon: &quot;#fa8072&quot;, sandybrown: &quot;#f4a460&quot;, seagreen: &quot;#2e8b57&quot;, seashell: &quot;#fff5ee&quot;, sienna: &quot;#a0522d&quot;, silver: &quot;#c0c0c0&quot;, skyblue: &quot;#87ceeb&quot;, slateblue: &quot;#6a5acd&quot;, slategray: &quot;#708090&quot;, snow: &quot;#fffafa&quot;, springgreen: &quot;#00ff7f&quot;, steelblue: &quot;#4682b4&quot;, tan: &quot;#d2b48c&quot;, teal: &quot;#008080&quot;, thistle: &quot;#d8bfd8&quot;, tomato: &quot;#ff6347&quot;, turquoise: &quot;#40e0d0&quot;, violet: &quot;#ee82ee&quot;, wheat: &quot;#f5deb3&quot;, white: &quot;#fff&quot;, whitesmoke: &quot;#f5f5f5&quot;, yellow: &quot;#ff0&quot;, yellowgreen: &quot;#9acd32&quot;},
             res;
-        colour = htmlcolors[(colour + &quot;&quot;).toLowerCase()] || colour;
+        colour = htmlcolors[(colour + E).toLowerCase()] || colour;
         if (!colour) {
             return {r: -1, g: -1, b: -1, hex: &quot;none&quot;, error: 1};
         }
@@ -188,50 +198,48 @@ window.Raphael = (function () {
         var red,
             green,
             blue,
-            rgb = (colour + &quot;&quot;).match(/^\s*((#[a-f\d]{6})|(#[a-f\d]{3})|rgb\(\s*([\d\.]+\s*,\s*[\d\.]+\s*,\s*[\d\.]+)\s*\)|rgb\(\s*([\d\.]+%\s*,\s*[\d\.]+%\s*,\s*[\d\.]+%)\s*\)|hs[bl]\(\s*([\d\.]+\s*,\s*[\d\.]+\s*,\s*[\d\.]+)\s*\)|hs[bl]\(\s*([\d\.]+%\s*,\s*[\d\.]+%\s*,\s*[\d\.]+%)\s*\))\s*$/i);
+            rgb = (colour + E).match(/^\s*((#[a-f\d]{6})|(#[a-f\d]{3})|rgb\(\s*([\d\.]+\s*,\s*[\d\.]+\s*,\s*[\d\.]+)\s*\)|rgb\(\s*([\d\.]+%\s*,\s*[\d\.]+%\s*,\s*[\d\.]+%)\s*\)|hs[bl]\(\s*([\d\.]+\s*,\s*[\d\.]+\s*,\s*[\d\.]+)\s*\)|hs[bl]\(\s*([\d\.]+%\s*,\s*[\d\.]+%\s*,\s*[\d\.]+%)\s*\))\s*$/i);
         if (rgb) {
             if (rgb[2]) {
-                blue = win[pi](rgb[2].substring(5), 16);
-                green = win[pi](rgb[2].substring(3, 5), 16);
-                red = win[pi](rgb[2].substring(1, 3), 16);
+                blue = toInt(rgb[2].substring(5), 16);
+                green = toInt(rgb[2].substring(3, 5), 16);
+                red = toInt(rgb[2].substring(1, 3), 16);
             }
             if (rgb[3]) {
-                blue = win[pi](rgb[3].substring(3) + rgb[3].substring(3), 16);
-                green = win[pi](rgb[3].substring(2, 3) + rgb[3].substring(2, 3), 16);
-                red = win[pi](rgb[3].substring(1, 2) + rgb[3].substring(1, 2), 16);
+                blue = toInt(rgb[3].substring(3) + rgb[3].substring(3), 16);
+                green = toInt(rgb[3].substring(2, 3) + rgb[3].substring(2, 3), 16);
+                red = toInt(rgb[3].substring(1, 2) + rgb[3].substring(1, 2), 16);
             }
             if (rgb[4]) {
-                rgb = rgb[4].split(/\s*,\s*/);
-                red = win[pf](rgb[0]);
-                green = win[pf](rgb[1]);
-                blue = win[pf](rgb[2]);
+                rgb = rgb[4][split](/\s*,\s*/);
+                red = toFloat(rgb[0]);
+                green = toFloat(rgb[1]);
+                blue = toFloat(rgb[2]);
             }
             if (rgb[5]) {
-                rgb = rgb[5].split(/\s*,\s*/);
-                red = win[pf](rgb[0]) * 2.55;
-                green = win[pf](rgb[1]) * 2.55;
-                blue = win[pf](rgb[2]) * 2.55;
+                rgb = rgb[5][split](/\s*,\s*/);
+                red = toFloat(rgb[0]) * 2.55;
+                green = toFloat(rgb[1]) * 2.55;
+                blue = toFloat(rgb[2]) * 2.55;
             }
             if (rgb[6]) {
-                rgb = rgb[6].split(/\s*,\s*/);
-                red = win[pf](rgb[0]);
-                green = win[pf](rgb[1]);
-                blue = win[pf](rgb[2]);
+                rgb = rgb[6][split](/\s*,\s*/);
+                red = toFloat(rgb[0]);
+                green = toFloat(rgb[1]);
+                blue = toFloat(rgb[2]);
                 return R.hsb2rgb(red, green, blue);
             }
             if (rgb[7]) {
-                rgb = rgb[7].split(/\s*,\s*/);
-                red = win[pf](rgb[0]) * 2.55;
-                green = win[pf](rgb[1]) * 2.55;
-                blue = win[pf](rgb[2]) * 2.55;
+                rgb = rgb[7][split](/\s*,\s*/);
+                red = toFloat(rgb[0]) * 2.55;
+                green = toFloat(rgb[1]) * 2.55;
+                blue = toFloat(rgb[2]) * 2.55;
                 return R.hsb2rgb(red, green, blue);
             }
             rgb = {r: red, g: green, b: blue};
-            var r = (~~red).toString(16),
-                g = (~~green).toString(16),
-                b = (~~blue).toString(16),
-                rg = /^(?=[\da-f]$)/,
-                rp = &quot;replace&quot;;
+            var r = (~~red)[toString](16),
+                g = (~~green)[toString](16),
+                b = (~~blue)[toString](16);
             r = r[rp](rg, &quot;0&quot;);
             g = g[rp](rg, &quot;0&quot;);
             b = b[rp](rg, &quot;0&quot;);
@@ -268,22 +276,22 @@ window.Raphael = (function () {
         if (R.is(pathString, &quot;array&quot;) &amp;&amp; R.is(pathString[0], &quot;array&quot;)) { // rough assumption
             data = pathClone(pathString);
         }
-        if (!data[ln]) {
-            (pathString + &quot;&quot;).replace(/([achlmqstvz])[\s,]*((-?\d*\.?\d*(?:e[-+]?\d+)?\s*,?\s*)+)/ig, function (a, b, c) {
+        if (!data[length]) {
+            (pathString + E)[rp](/([achlmqstvz])[\s,]*((-?\d*\.?\d*(?:e[-+]?\d+)?\s*,?\s*)+)/ig, function (a, b, c) {
                 var params = [],
                     name = b.toLowerCase();
-                c.replace(/(-?\d*\.?\d*(?:e[-+]?\d+)?)\s*,?\s*/ig, function (a, b) {
-                    b &amp;&amp; params.push(+b);
+                c[rp](/(-?\d*\.?\d*(?:e[-+]?\d+)?)\s*,?\s*/ig, function (a, b) {
+                    b &amp;&amp; params[push](+b);
                 });
-                while (params[ln] &gt;= paramCounts[name]) {
-                    data.push([b].concat(params.splice(0, paramCounts[name])));
+                while (params[length] &gt;= paramCounts[name]) {
+                    data[push]([b][concat](params.splice(0, paramCounts[name])));
                     if (!paramCounts[name]) {
                         break;
                     };
                 }
             });
         }
-        data.toString = R._path2string;
+        data[toString] = R._path2string;
         return data;
     });
     var pathDimensions = cacher(function (path) {
@@ -295,25 +303,25 @@ window.Raphael = (function () {
             y = 0,
             X = [],
             Y = [];
-        for (var i = 0, ii = path[ln]; i &lt; ii; i++) {
+        for (var i = 0, ii = path[length]; i &lt; ii; i++) {
             if (path[i][0] == &quot;M&quot;) {
                 x = path[i][1];
                 y = path[i][2];
-                X.push(x);
-                Y.push(y);
+                X[push](x);
+                Y[push](y);
             } else {
                 var dim = curveDim(x, y, path[i][1], path[i][2], path[i][3], path[i][4], path[i][5], path[i][6]);
-                X = X.concat(dim.min.x, dim.max.x);
-                Y = Y.concat(dim.min.y, dim.max.y);
+                X = X[concat](dim.min.x, dim.max.x);
+                Y = Y[concat](dim.min.y, dim.max.y);
             }
         }
-        var xmin = Math.min[ap](0, X),
-            ymin = Math.min[ap](0, Y);
+        var xmin = mmin[apply](0, X),
+            ymin = mmin[apply](0, Y);
         return {
             x: xmin,
             y: ymin,
-            width: Math.max[ap](0, X) - xmin,
-            height: Math.max[ap](0, Y) - ymin
+            width: mmax[apply](0, X) - xmin,
+            height: mmax[apply](0, Y) - ymin
         };
     }),
         pathClone = function (pathArray) {
@@ -321,13 +329,13 @@ window.Raphael = (function () {
             if (!R.is(pathArray, &quot;array&quot;) || !R.is(pathArray &amp;&amp; pathArray[0], &quot;array&quot;)) { // rough assumption
                 pathArray = R.parsePathString(pathArray);
             }
-            for (var i = 0, ii = pathArray[ln]; i &lt; ii; i++) {
+            for (var i = 0, ii = pathArray[length]; i &lt; ii; i++) {
                 res[i] = [];
-                for (var j = 0, jj = pathArray[i][ln]; j &lt; jj; j++) {
+                for (var j = 0, jj = pathArray[i][length]; j &lt; jj; j++) {
                     res[i][j] = pathArray[i][j];
                 }
             }
-            res.toString = R._path2string;
+            res[toString] = R._path2string;
             return res;
         },
         pathToRelative = cacher(function (pathArray) {
@@ -346,9 +354,9 @@ window.Raphael = (function () {
                 mx = x;
                 my = y;
                 start++;
-                res.push([&quot;M&quot;, x, y]);
+                res[push]([&quot;M&quot;, x, y]);
             }
-            for (var i = start, ii = pathArray[ln]; i &lt; ii; i++) {
+            for (var i = start, ii = pathArray[length]; i &lt; ii; i++) {
                 var r = res[i] = [],
                     pa = pathArray[i];
                 if (pa[0] != pa[0].toLowerCase()) {
@@ -370,7 +378,7 @@ window.Raphael = (function () {
                             mx = pa[1];
                             my = pa[2];
                         default:
-                            for (var j = 1, jj = pa[ln]; j &lt; jj; j++) {
+                            for (var j = 1, jj = pa[length]; j &lt; jj; j++) {
                                 r[j] = +(pa[j] - ((j % 2) ? x : y)).toFixed(3);
                             }
                     }
@@ -380,11 +388,11 @@ window.Raphael = (function () {
                         mx = pa[1] + x;
                         my = pa[2] + y;
                     }
-                    for (var k = 0, kk = pa[ln]; k &lt; kk; k++) {
+                    for (var k = 0, kk = pa[length]; k &lt; kk; k++) {
                         res[i][k] = pa[k];
                     }
                 }
-                var len = res[i][ln];
+                var len = res[i][length];
                 switch (res[i][0]) {
                     case &quot;z&quot;:
                         x = mx;
@@ -401,7 +409,7 @@ window.Raphael = (function () {
                         y += +res[i][len - 1];
                 }
             }
-            res.toString = R._path2string;
+            res[toString] = R._path2string;
             return res;
         }, 0, pathClone),
         pathToAbsolute = cacher(function (pathArray) {
@@ -422,11 +430,11 @@ window.Raphael = (function () {
                 start++;
                 res[0] = [&quot;M&quot;, x, y];
             }
-            for (var i = start, ii = pathArray[ln]; i &lt; ii; i++) {
+            for (var i = start, ii = pathArray[length]; i &lt; ii; i++) {
                 var r = res[i] = [],
                     pa = pathArray[i];
-                if (pa[0] != (pa[0] + &quot;&quot;).toUpperCase()) {
-                    r[0] = (pa[0] + &quot;&quot;).toUpperCase();
+                if (pa[0] != (pa[0] + E).toUpperCase()) {
+                    r[0] = (pa[0] + E).toUpperCase();
                     switch (r[0]) {
                         case &quot;A&quot;:
                             r[1] = pa[1];
@@ -447,12 +455,12 @@ window.Raphael = (function () {
                             mx = +pa[1] + x;
                             my = +pa[2] + y;
                         default:
-                            for (var j = 1, jj = pa[ln]; j &lt; jj; j++) {
+                            for (var j = 1, jj = pa[length]; j &lt; jj; j++) {
                                 r[j] = +pa[j] + ((j % 2) ? x : y);
                             }
                     }
                 } else {
-                    for (var k = 0, kk = pa[ln]; k &lt; kk; k++) {
+                    for (var k = 0, kk = pa[length]; k &lt; kk; k++) {
                         res[i][k] = pa[k];
                     }
                 }
@@ -468,11 +476,11 @@ window.Raphael = (function () {
                         y = r[1];
                         break;
                     default:
-                        x = res[i][res[i][ln] - 2];
-                        y = res[i][res[i][ln] - 1];
+                        x = res[i][res[i][length] - 2];
+                        y = res[i][res[i][length] - 1];
                 }
             }
-            res.toString = R._path2string;
+            res[toString] = R._path2string;
             return res;
         }, null, pathClone),
         l2c = function (x1, y1, x2, y2) {
@@ -514,8 +522,8 @@ window.Raphael = (function () {
                     sin = Math.sin(PI / 180 * angle),
                     x = (x1 - x2) / 2,
                     y = (y1 - y2) / 2;
-                rx = Math.max(rx, Math.abs(x));
-                ry = Math.max(ry, Math.abs(y));
+                rx = mmax(rx, Math.abs(x));
+                ry = mmax(ry, Math.abs(y));
                 var rx2 = rx * rx,
                     ry2 = ry * ry,
                     k = (large_arc_flag == sweep_flag ? -1 : 1) *
@@ -566,19 +574,19 @@ window.Raphael = (function () {
             m2[0] = 2 * m1[0] - m2[0];
             m2[1] = 2 * m1[1] - m2[1];
             if (recursive) {
-                return [m2, m3, m4].concat(res);
+                return [m2, m3, m4][concat](res);
             } else {
-                res = [m2, m3, m4].concat(res).join(&quot;,&quot;).split(&quot;,&quot;);
+                res = [m2, m3, m4][concat](res)[join](&quot;,&quot;)[split](&quot;,&quot;);
                 var newres = [];
-                for (var i = 0, ii = res[ln]; i &lt; ii; i++) {
+                for (var i = 0, ii = res[length]; i &lt; ii; i++) {
                     newres[i] = i % 2 ? rotate(res[i - 1], res[i], rad).y : rotate(res[i], res[i + 1], rad).x;
                 }
                 return newres;
             }
         },
         findDotAtSegment = cacher(function (p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, t) {
-            var x = Math.pow(1 - t, 3) * p1x + Math.pow(1 - t, 2) * 3 * t * c1x + (1 - t) * 3 * t * t * c2x + Math.pow(t, 3) * p2x,
-                y = Math.pow(1 - t, 3) * p1y + Math.pow(1 - t, 2) * 3 * t * c1y + (1 - t) * 3 * t * t * c2y + Math.pow(t, 3) * p2y,
+            var x = pow(1 - t, 3) * p1x + pow(1 - t, 2) * 3 * t * c1x + (1 - t) * 3 * t * t * c2x + pow(t, 3) * p2x,
+                y = pow(1 - t, 3) * p1y + pow(1 - t, 2) * 3 * t * c1y + (1 - t) * 3 * t * t * c2y + pow(t, 3) * p2y,
                 mx = p1x + 2 * t * (c1x - p1x) + t * t * (c2x - 2 * c1x + p1x),
                 my = p1y + 2 * t * (c1y - p1y) + t * t * (c2y - 2 * c1y + p1y),
                 nx = c1x + 2 * t * (c2x - c1x) + t * t * (p2x - 2 * c2x + c1x),
@@ -599,8 +607,8 @@ window.Raphael = (function () {
                 x = [p1x, p2x],
                 dot1 = findDotAtSegment(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, t1 &gt; 0 &amp;&amp; t1 &lt; 1 ? t1 : 0),
                 dot2 = findDotAtSegment(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, t2 &gt; 0 &amp;&amp; t2 &lt; 1 ? t2 : 0);
-            x = x.concat(dot1.x, dot2.x);
-            y = y.concat(dot1.y, dot2.y);
+            x = x[concat](dot1.x, dot2.x);
+            y = y[concat](dot1.y, dot2.y);
             a = (c2y - 2 * c1y + p1y) - (p2y - 2 * c2y + c1y);
             b = 2 * (c1y - p1y) - 2 * (c2y - c1y);
             c = p1y - c1y;
@@ -608,11 +616,11 @@ window.Raphael = (function () {
             t2 = (-b - Math.sqrt(b * b - 4 * a * c)) / 2 / a;
             dot1 = findDotAtSegment(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, t1 &gt; 0 &amp;&amp; t1 &lt; 1 ? t1 : 0);
             dot2 = findDotAtSegment(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, t2 &gt; 0 &amp;&amp; t2 &lt; 1 ? t2 : 0);
-            x = x.concat(dot1.x, dot2.x);
-            y = y.concat(dot1.y, dot2.y);
+            x = x[concat](dot1.x, dot2.x);
+            y = y[concat](dot1.y, dot2.y);
             return {
-                min: {x: Math.min[ap](Math, x), y: Math.min[ap](Math, y)},
-                max: {x: Math.max[ap](Math, x), y: Math.max[ap](Math, y)}
+                min: {x: mmin[apply](0, x), y: mmin[apply](0, y)},
+                max: {x: mmax[apply](0, x), y: mmax[apply](0, y)}
             };
         }),
         path2curve = cacher(function (path, path2) {
@@ -632,47 +640,47 @@ window.Raphael = (function () {
                             d.Y = path[2];
                             break;
                         case &quot;A&quot;:
-                            path = [&quot;C&quot;].concat(a2c[ap](0, [d.x, d.y].concat(path.slice(1))));
+                            path = [&quot;C&quot;][concat](a2c[apply](0, [d.x, d.y][concat](path.slice(1))));
                             break;
                         case &quot;S&quot;:
                             nx = d.x + (d.x - (d.bx || d.x));
                             ny = d.y + (d.y - (d.by || d.y));
-                            path = [&quot;C&quot;, nx, ny].concat(path.slice(1));
+                            path = [&quot;C&quot;, nx, ny][concat](path.slice(1));
                             break;
                         case &quot;T&quot;:
                             d.qx = d.x + (d.x - (d.qx || d.x));
                             d.qy = d.y + (d.y - (d.qy || d.y));
-                            path = [&quot;C&quot;].concat(q2c(d.x, d.y, d.qx, d.qy, path[1], path[2]));
+                            path = [&quot;C&quot;][concat](q2c(d.x, d.y, d.qx, d.qy, path[1], path[2]));
                             break;
                         case &quot;Q&quot;:
                             d.qx = path[1];
                             d.qy = path[2];
-                            path = [&quot;C&quot;].concat(q2c(d.x, d.y, path[1], path[2], path[3], path[4]));
+                            path = [&quot;C&quot;][concat](q2c(d.x, d.y, path[1], path[2], path[3], path[4]));
                             break;
                         case &quot;L&quot;:
-                            path = [&quot;C&quot;].concat(l2c(d.x, d.y, path[1], path[2]));
+                            path = [&quot;C&quot;][concat](l2c(d.x, d.y, path[1], path[2]));
                             break;
                         case &quot;H&quot;:
-                            path = [&quot;C&quot;].concat(l2c(d.x, d.y, path[1], d.y));
+                            path = [&quot;C&quot;][concat](l2c(d.x, d.y, path[1], d.y));
                             break;
                         case &quot;V&quot;:
-                            path = [&quot;C&quot;].concat(l2c(d.x, d.y, d.x, path[1]));
+                            path = [&quot;C&quot;][concat](l2c(d.x, d.y, d.x, path[1]));
                             break;
                         case &quot;Z&quot;:
-                            path = [&quot;C&quot;].concat(l2c(d.x, d.y, d.X, d.Y));
+                            path = [&quot;C&quot;][concat](l2c(d.x, d.y, d.X, d.Y));
                             break;
                     }
                     return path;
                 },
                 fixArc = function (pp, i) {
-                    if (pp[i][ln] &gt; 7) {
+                    if (pp[i][length] &gt; 7) {
                         pp[i].shift();
                         var pi = pp[i];
-                        while (pi[ln]) {
-                            pp.splice(i++, 0, [&quot;C&quot;].concat(pi.splice(0, 6)));
+                        while (pi[length]) {
+                            pp.splice(i++, 0, [&quot;C&quot;][concat](pi.splice(0, 6)));
                         }
                         pp.splice(i, 1);
-                        ii = Math.max(p[ln], p2 &amp;&amp; p2[ln] || 0);
+                        ii = mmax(p[length], p2 &amp;&amp; p2[length] || 0);
                     }
                 },
                 fixM = function (path1, path2, a1, a2, i) {
@@ -682,10 +690,10 @@ window.Raphael = (function () {
                         a1.by = 0;
                         a1.x = path1[i][1];
                         a1.y = path1[i][2];
-                        ii = Math.max(p[ln], p2 &amp;&amp; p2[ln] || 0);
+                        ii = mmax(p[length], p2 &amp;&amp; p2[length] || 0);
                     }
                 };
-            for (var i = 0, ii = Math.max(p[ln], p2 &amp;&amp; p2[ln] || 0); i &lt; ii; i++) {
+            for (var i = 0, ii = mmax(p[length], p2 &amp;&amp; p2[length] || 0); i &lt; ii; i++) {
                 p[i] = processPath(p[i], attrs);
                 fixArc(p, i);
                 p2 &amp;&amp; (p2[i] = processPath(p2[i], attrs2));
@@ -694,14 +702,14 @@ window.Raphael = (function () {
                 fixM(p2, p, attrs2, attrs, i);
                 var seg = p[i],
                     seg2 = p2 &amp;&amp; p2[i],
-                    seglen = seg[ln],
-                    seg2len = p2 &amp;&amp; seg2[ln];
+                    seglen = seg[length],
+                    seg2len = p2 &amp;&amp; seg2[length];
                 attrs.x = seg[seglen - 2];
                 attrs.y = seg[seglen - 1];
-                attrs.bx = win[pf](seg[seglen - 4]) || attrs.x;
-                attrs.by = win[pf](seg[seglen - 3]) || attrs.y;
-                attrs2.bx = p2 &amp;&amp; (win[pf](seg2[seg2len - 4]) || attrs2.x);
-                attrs2.by = p2 &amp;&amp; (win[pf](seg2[seg2len - 3]) || attrs2.y);
+                attrs.bx = toFloat(seg[seglen - 4]) || attrs.x;
+                attrs.by = toFloat(seg[seglen - 3]) || attrs.y;
+                attrs2.bx = p2 &amp;&amp; (toFloat(seg2[seg2len - 4]) || attrs2.x);
+                attrs2.by = p2 &amp;&amp; (toFloat(seg2[seg2len - 3]) || attrs2.y);
                 attrs2.x = p2 &amp;&amp; seg2[seg2len - 2];
                 attrs2.y = p2 &amp;&amp; seg2[seg2len - 1];
             }
@@ -709,7 +717,7 @@ window.Raphael = (function () {
         }, null, pathClone),
         parseDots = cacher(function (gradient) {
             var dots = [];
-            for (var i = 0, ii = gradient[ln]; i &lt; ii; i++) {
+            for (var i = 0, ii = gradient[length]; i &lt; ii; i++) {
                 var dot = {},
                     par = gradient[i].match(/^([^:]*):?([\d\.]*)/);
                 dot.color = R.getRGB(par[1]);
@@ -718,11 +726,11 @@ window.Raphael = (function () {
                 }
                 dot.color = dot.color.hex;
                 par[2] &amp;&amp; (dot.offset = par[2] + &quot;%&quot;);
-                dots.push(dot);
+                dots[push](dot);
             }
-            for (var i = 1, ii = dots[ln] - 1; i &lt; ii; i++) {
+            for (var i = 1, ii = dots[length] - 1; i &lt; ii; i++) {
                 if (!dots[i].offset) {
-                    var start = win[pf](dots[i - 1].offset || 0),
+                    var start = toFloat(dots[i - 1].offset || 0),
                         end = 0;
                     for (var j = i + 1; j &lt; ii; j++) {
                         if (dots[j].offset) {
@@ -734,7 +742,7 @@ window.Raphael = (function () {
                         end = 100;
                         j = ii;
                     }
-                    end = win[pf](end);
+                    end = toFloat(end);
                     var d = (end - start) / (j - i + 1);
                     for (; i &lt; j; i++) {
                         start += d;
@@ -767,17 +775,17 @@ window.Raphael = (function () {
                         return {container: container, width: arguments[1], height: arguments[2]};
                     }
                 }
-            } else if (R.is(arguments[0], &quot;number&quot;) &amp;&amp; arguments[ln] &gt; 3) {
+            } else if (R.is(arguments[0], nu) &amp;&amp; arguments[length] &gt; 3) {
                 return {container: 1, x: arguments[0], y: arguments[1], width: arguments[2], height: arguments[3]};
             }
         },
         plugins = function (con, add) {
             var that = this;
-            for (var prop in add) if (add.hasOwnProperty(prop) &amp;&amp; !(prop in con)) {
+            for (var prop in add) if (add[has](prop) &amp;&amp; !(prop in con)) {
                 switch (typeof add[prop]) {
                     case &quot;function&quot;:
                         (function (f) {
-                            con[prop] = con === that ? f : function () { return f[ap](that, arguments); };
+                            con[prop] = con === that ? f : function () { return f[apply](that, arguments); };
                         })(add[prop]);
                     break;
                     case &quot;object&quot;:
@@ -796,12 +804,12 @@ window.Raphael = (function () {
         paper.svgns = &quot;http://www.w3.org/2000/svg&quot;;
         paper.xlink = &quot;http://www.w3.org/1999/xlink&quot;;
         var round = function (num) {
-            return +num + (Math.floor(num) == num) * .5;
+            return +num + (~~num === num) * .5;
         };
         var roundPath = function (path) {
-            for (var i = 0, ii = path[ln]; i &lt; ii; i++) {
+            for (var i = 0, ii = path[length]; i &lt; ii; i++) {
                 if (path[i][0].toLowerCase() != &quot;a&quot;) {
-                    for (var j = 1, jj = path[i][ln]; j &lt; jj; j++) {
+                    for (var j = 1, jj = path[i][length]; j &lt; jj; j++) {
                         path[i][j] = round(path[i][j]);
                     }
                 } else {
@@ -813,19 +821,19 @@ window.Raphael = (function () {
         };
         var $ = function (el, attr) {
             if (attr) {
-                for (var key in attr) if (attr.hasOwnProperty(key)) {
-                    el.setAttribute(key, attr[key]);
+                for (var key in attr) if (attr[has](key)) {
+                    el[setAttribute](key, attr[key]);
                 }
             } else {
                 return doc.createElementNS(paper.svgns, el);
             }
         };
-        R.toString = function () {
+        R[toString] = function () {
             return  &quot;Your browser supports SVG.\nYou are running Rapha\u00ebl &quot; + this.version;
         };
         var thePath = function (pathString, SVG) {
             var el = $(&quot;path&quot;);
-            SVG.canvas &amp;&amp; SVG.canvas.appendChild(el);
+            SVG.canvas &amp;&amp; SVG.canvas[appendChild](el);
             var p = new Element(el, SVG);
             p.type = &quot;path&quot;;
             setFillAndStroke(p, {fill: &quot;none&quot;, stroke: &quot;#000&quot;, path: pathString});
@@ -835,26 +843,26 @@ window.Raphael = (function () {
             var type = &quot;linear&quot;,
                 fx = .5, fy = .5,
                 s = o.style;
-            gradient = (gradient + &quot;&quot;).replace(/^r(?:\(([^,]+?)\s*,\s*([^\)]+?)\))?/, function (all, _fx, _fy) {
+            gradient = (gradient + E)[rp](/^r(?:\(([^,]+?)\s*,\s*([^\)]+?)\))?/, function (all, _fx, _fy) {
                 type = &quot;radial&quot;;
                 if (_fx &amp;&amp; _fy) {
-                    fx = win[pf](_fx);
-                    fy = win[pf](_fy);
-                    if (Math.pow(fx - .5, 2) + Math.pow(fy - .5, 2) &gt; .25) {
-                        fy = Math.sqrt(.25 - Math.pow(fx - .5, 2)) + .5;
+                    fx = toFloat(_fx);
+                    fy = toFloat(_fy);
+                    if (pow(fx - .5, 2) + pow(fy - .5, 2) &gt; .25) {
+                        fy = Math.sqrt(.25 - pow(fx - .5, 2)) + .5;
                     }
                 }
-                return &quot;&quot;;
+                return E;
             });
-            gradient = gradient.split(/\s*\-\s*/);
+            gradient = gradient[split](/\s*\-\s*/);
             if (type == &quot;linear&quot;) {
                 var angle = gradient.shift();
-                angle = -win[pf](angle);
+                angle = -toFloat(angle);
                 if (isNaN(angle)) {
                     return null;
                 }
                 var vector = [0, 0, Math.cos(angle * Math.PI / 180), Math.sin(angle * Math.PI / 180)],
-                    max = 1 / (Math.max(Math.abs(vector[2]), Math.abs(vector[3])) || 1);
+                    max = 1 / (mmax(Math.abs(vector[2]), Math.abs(vector[3])) || 1);
                 vector[2] *= max;
                 vector[3] *= max;
                 if (vector[2] &lt; 0) {
@@ -871,23 +879,23 @@ window.Raphael = (function () {
                 return null;
             }
             var el = $(type + &quot;Gradient&quot;);
-            el.id = &quot;r&quot; + (R.idGenerator++).toString(36);
+            el.id = &quot;r&quot; + (R.idGenerator++)[toString](36);
             type == &quot;radial&quot; ? $(el, {fx: fx, fy: fy}) : $(el, {x1: vector[0], y1: vector[1], x2: vector[2], y2: vector[3]});
-            SVG.defs.appendChild(el);
-            for (var i = 0, ii = dots[ln]; i &lt; ii; i++) {
+            SVG.defs[appendChild](el);
+            for (var i = 0, ii = dots[length]; i &lt; ii; i++) {
                 var stop = $(&quot;stop&quot;);
                 $(stop, {
                     offset: dots[i].offset ? dots[i].offset : !i ? &quot;0%&quot; : &quot;100%&quot;,
                     &quot;stop-color&quot;: dots[i].color || &quot;#fff&quot;
                 });
-                el.appendChild(stop);
+                el[appendChild](stop);
             };
             $(o, {
                 fill: &quot;url(#&quot; + el.id + &quot;)&quot;,
                 opacity: 1,
                 &quot;fill-opacity&quot;: 1
             });
-            s.fill = &quot;&quot;;
+            s.fill = E;
             s.opacity = 1;
             s.fillOpacity = 1;
             return 1;
@@ -915,20 +923,20 @@ window.Raphael = (function () {
                 attrs = o.attrs,
                 rot = o.attr(&quot;rotation&quot;),
                 addDashes = function (o, value) {
-                    value = dasharray[(value + &quot;&quot;).toLowerCase()];
+                    value = dasharray[(value + E).toLowerCase()];
                     if (value) {
                         var width = o.attrs[&quot;stroke-width&quot;] || &quot;1&quot;,
                             butt = {round: width, square: width, butt: 0}[o.attrs[&quot;stroke-linecap&quot;] || params[&quot;stroke-linecap&quot;]] || 0,
                             dashes = [];
-                        var i = value[ln];
+                        var i = value[length];
                         while (i--) {
                             dashes[i] = value[i] * width + ((i % 2) ? 1 : -1) * butt;
                         }
-                        $(node, {&quot;stroke-dasharray&quot;: dashes.join(&quot;,&quot;)});
+                        $(node, {&quot;stroke-dasharray&quot;: dashes[join](&quot;,&quot;)});
                     }
                 };
-            win[pf](rot) &amp;&amp; o.rotate(0, true);
-            for (var att in params) if (params.hasOwnProperty(att)) {
+            toFloat(rot) &amp;&amp; o.rotate(0, true);
+            for (var att in params) if (params[has](att)) {
                 if (!(att in availableAttrs)) {
                     continue;
                 }
@@ -943,33 +951,33 @@ window.Raphael = (function () {
                         if (pn.tagName.toLowerCase() != &quot;a&quot;) {
                             var hl = $(&quot;a&quot;);
                             pn.insertBefore(hl, node);
-                            hl.appendChild(node);
+                            hl[appendChild](node);
                             pn = hl;
                         }
                         pn.setAttributeNS(o.paper.xlink, att, value);
                       break;
                     case &quot;clip-rect&quot;:
-                        var rect = (value + &quot;&quot;).split(separator);
-                        if (rect[ln] == 4) {
+                        var rect = (value + E)[split](separator);
+                        if (rect[length] == 4) {
                             o.clip &amp;&amp; o.clip.parentNode.parentNode.removeChild(o.clip.parentNode);
                             var el = $(&quot;clipPath&quot;),
                                 rc = $(&quot;rect&quot;);
-                            el.id = &quot;r&quot; + (R.idGenerator++).toString(36);
+                            el.id = &quot;r&quot; + (R.idGenerator++)[toString](36);
                             $(rc, {
                                 x: rect[0],
                                 y: rect[1],
                                 width: rect[2],
                                 height: rect[3]
                             });
-                            el.appendChild(rc);
-                            o.paper.defs.appendChild(el);
+                            el[appendChild](rc);
+                            o.paper.defs[appendChild](el);
                             $(node, {&quot;clip-path&quot;: &quot;url(#&quot; + el.id + &quot;)&quot;});
                             o.clip = rc;
                         }
                         if (!value) {
-                            var clip = doc.getElementById(node.getAttribute(&quot;clip-path&quot;).replace(/(^url\(#|\)$)/g, &quot;&quot;));
+                            var clip = doc.getElementById(node.getAttribute(&quot;clip-path&quot;)[rp](/(^url\(#|\)$)/g, E));
                             clip &amp;&amp; clip.parentNode.removeChild(clip);
-                            $(node, {&quot;clip-path&quot;: &quot;&quot;});
+                            $(node, {&quot;clip-path&quot;: E});
                             delete o.clip;
                         }
                     break;
@@ -980,7 +988,7 @@ window.Raphael = (function () {
                         }
                         break;
                     case &quot;width&quot;:
-                        node.setAttribute(att, value);
+                        node[setAttribute](att, value);
                         if (attrs.fx) {
                             att = &quot;x&quot;;
                             value = attrs.x;
@@ -996,11 +1004,11 @@ window.Raphael = (function () {
                             break;
                         }
                     case &quot;cx&quot;:
-                        node.setAttribute(att, value);
+                        node[setAttribute](att, value);
                         o.pattern &amp;&amp; updatePosition(o);
                         break;
                     case &quot;height&quot;:
-                        node.setAttribute(att, value);
+                        node[setAttribute](att, value);
                         if (attrs.fy) {
                             att = &quot;y&quot;;
                             value = attrs.y;
@@ -1016,14 +1024,14 @@ window.Raphael = (function () {
                             break;
                         }
                     case &quot;cy&quot;:
-                        node.setAttribute(att, value);
+                        node[setAttribute](att, value);
                         o.pattern &amp;&amp; updatePosition(o);
                         break;
                     case &quot;r&quot;:
                         if (o.type == &quot;rect&quot;) {
                             $(node, {rx: value, ry: value});
                         } else {
-                            node.setAttribute(att, value);
+                            node[setAttribute](att, value);
                         }
                         break;
                     case &quot;src&quot;:
@@ -1034,7 +1042,7 @@ window.Raphael = (function () {
                     case &quot;stroke-width&quot;:
                         node.style.strokeWidth = value;
                         // Need following line for Firefox
-                        node.setAttribute(att, value);
+                        node[setAttribute](att, value);
                         if (attrs[&quot;stroke-dasharray&quot;]) {
                             addDashes(o, attrs[&quot;stroke-dasharray&quot;]);
                         }
@@ -1047,23 +1055,23 @@ window.Raphael = (function () {
                         o.rotate(value, true);
                         break;
                     case &quot;translation&quot;:
-                        var xy = (value + &quot;&quot;).split(separator);
+                        var xy = (value + E)[split](separator);
                         o.translate((+xy[0] + 1 || 2) - 1, (+xy[1] + 1 || 2) - 1);
                         break;
                     case &quot;scale&quot;:
-                        var xy = (value + &quot;&quot;).split(separator);
+                        var xy = (value + E)[split](separator);
                         o.scale(+xy[0] || 1, +xy[1] || +xy[0] || 1, +xy[2] || null, +xy[3] || null);
                         break;
                     case &quot;fill&quot;:
-                        var isURL = (value + &quot;&quot;).match(/^url\(['&quot;]?([^\)]+)['&quot;]?\)$/i);
+                        var isURL = (value + E).match(/^url\(['&quot;]?([^\)]+)['&quot;]?\)$/i);
                         if (isURL) {
                             var el = $(&quot;pattern&quot;),
                                 ig = $(&quot;image&quot;);
-                            el.id = &quot;r&quot; + (R.idGenerator++).toString(36);
+                            el.id = &quot;r&quot; + (R.idGenerator++)[toString](36);
                             $(el, {x: 0, y: 0, patternUnits: &quot;userSpaceOnUse&quot;});
                             $(ig, {x: 0, y:0});
                             ig.setAttributeNS(o.paper.xlink, &quot;href&quot;, isURL[1]);
-                            el.appendChild(ig);
+                            el[appendChild](ig);
 
                             var img = doc.createElement(&quot;img&quot;);
                             img.style.cssText = &quot;position:absolute;left:-9999em;top-9999em&quot;;
@@ -1073,9 +1081,9 @@ window.Raphael = (function () {
                                 doc.body.removeChild(this);
                                 paper.safari();
                             };
-                            doc.body.appendChild(img);
+                            doc.body[appendChild](img);
                             img.src = isURL[1];
-                            o.paper.defs.appendChild(el);
+                            o.paper.defs[appendChild](el);
                             node.style.fill = &quot;url(#&quot; + el.id + &quot;)&quot;;
                             $(node, {fill: &quot;url(#&quot; + el.id + &quot;)&quot;});
                             o.pattern = el;
@@ -1095,7 +1103,7 @@ window.Raphael = (function () {
                                 // Need following line for Firefox
                                 $(node, {&quot;fill-opacity&quot;: attrs[&quot;fill-opacity&quot;]});
                             }
-                        } else if ((o.type in {circle: 1, ellipse: 1} || (value + &quot;&quot;).charAt(0) != &quot;r&quot;) &amp;&amp; addGradientFill(node, value, o.paper)) {
+                        } else if ((o.type in {circle: 1, ellipse: 1} || (value + E).charAt(0) != &quot;r&quot;) &amp;&amp; addGradientFill(node, value, o.paper)) {
                             attrs.gradient = value;
                             attrs.fill = &quot;none&quot;;
                             break;
@@ -1103,35 +1111,35 @@ window.Raphael = (function () {
                     case &quot;stroke&quot;:
                         node.style[att] = R.getRGB(value).hex;
                         // Need following line for Firefox
-                        node.setAttribute(att, R.getRGB(value).hex);
+                        node[setAttribute](att, R.getRGB(value).hex);
                         break;
                     case &quot;gradient&quot;:
-                        (o.type in {circle: 1, ellipse: 1} || (value + &quot;&quot;).charAt(0) != &quot;r&quot;) &amp;&amp; addGradientFill(node, value, o.paper);
+                        (o.type in {circle: 1, ellipse: 1} || (value + E).charAt(0) != &quot;r&quot;) &amp;&amp; addGradientFill(node, value, o.paper);
                         break;
                     case &quot;opacity&quot;:
                     case &quot;fill-opacity&quot;:
                         if (attrs.gradient) {
-                            var gradient = doc.getElementById(node.getAttribute(&quot;fill&quot;).replace(/^url\(#|\)$/g, &quot;&quot;));
+                            var gradient = doc.getElementById(node.getAttribute(&quot;fill&quot;)[rp](/^url\(#|\)$/g, E));
                             if (gradient) {
                                 var stops = gradient.getElementsByTagName(&quot;stop&quot;);
-                                stops[stops[ln] - 1].setAttribute(&quot;stop-opacity&quot;, value);
+                                stops[stops[length] - 1][setAttribute](&quot;stop-opacity&quot;, value);
                             }
                             break;
                         }
                     default:
-                        att == &quot;font-size&quot; &amp;&amp; (value = win[pi](value, 10) + &quot;px&quot;);
-                        var cssrule = att.replace(/(\-.)/g, function (w) {
+                        att == &quot;font-size&quot; &amp;&amp; (value = toInt(value, 10) + &quot;px&quot;);
+                        var cssrule = att[rp](/(\-.)/g, function (w) {
                             return w.substring(1).toUpperCase();
                         });
                         node.style[cssrule] = value;
                         // Need following line for Firefox
-                        node.setAttribute(att, value);
+                        node[setAttribute](att, value);
                         break;
                 }
             }
             
             tuneText(o, params);
-            win[pi](rot, 10) &amp;&amp; o.rotate(rot, true);
+            toInt(rot, 10) &amp;&amp; o.rotate(rot, true);
         };
         var leading = 1.2;
         var tuneText = function (el, params) {
@@ -1140,22 +1148,22 @@ window.Raphael = (function () {
             }
             var a = el.attrs,
                 node = el.node,
-                fontSize = node.firstChild ? win[pi](doc.defaultView.getComputedStyle(node.firstChild, &quot;&quot;).getPropertyValue(&quot;font-size&quot;), 10) : 10;
+                fontSize = node.firstChild ? toInt(doc.defaultView.getComputedStyle(node.firstChild, E).getPropertyValue(&quot;font-size&quot;), 10) : 10;
 
             if (&quot;text&quot; in params) {
                 while (node.firstChild) {
                     node.removeChild(node.firstChild);
                 }
-                var texts = (params.text + &quot;&quot;).split(&quot;\n&quot;);
-                for (var i = 0, ii = texts[ln]; i &lt; ii; i++) {
+                var texts = (params.text + E)[split](&quot;\n&quot;);
+                for (var i = 0, ii = texts[length]; i &lt; ii; i++) {
                     var tspan = $(&quot;tspan&quot;);
                     i &amp;&amp; $(tspan, {dy: fontSize * leading, x: a.x});
-                    tspan.appendChild(doc.createTextNode(texts[i]));
-                    node.appendChild(tspan);
+                    tspan[appendChild](doc.createTextNode(texts[i]));
+                    node[appendChild](tspan);
                 }
             } else {
                 var texts = node.getElementsByTagName(&quot;tspan&quot;);
-                for (var i = 0, ii = texts[ln]; i &lt; ii; i++) {
+                for (var i = 0, ii = texts[length]; i &lt; ii; i++) {
                     i &amp;&amp; $(texts[i], {dy: fontSize * leading, x: a.x});
                 }
             }
@@ -1184,17 +1192,17 @@ window.Raphael = (function () {
         Element[proto].rotate = function (deg, cx, cy) {
             if (deg == null) {
                 if (this._.rt.cx) {
-                    return [this._.rt.deg, this._.rt.cx, this._.rt.cy].join(&quot; &quot;);
+                    return [this._.rt.deg, this._.rt.cx, this._.rt.cy][join](&quot; &quot;);
                 }
                 return this._.rt.deg;
             }
             var bbox = this.getBBox();
-            deg = (deg + &quot;&quot;).split(separator);
-            if (deg[ln] - 1) {
-                cx = win[pf](deg[1]);
-                cy = win[pf](deg[2]);
+            deg = (deg + E)[split](separator);
+            if (deg[length] - 1) {
+                cx = toFloat(deg[1]);
+                cy = toFloat(deg[2]);
             }
-            deg = win[pf](deg[0]);
+            deg = toFloat(deg[0]);
             if (cx != null) {
                 this._.rt.deg = deg;
             } else {
@@ -1209,10 +1217,10 @@ window.Raphael = (function () {
                 this.transformations[0] = R.format(&quot;rotate({0} {1} {2})&quot;, this._.rt.deg, cx, cy);
                 this.clip &amp;&amp; $(this.clip, {transform: R.format(&quot;rotate({0} {1} {2})&quot;, -this._.rt.deg, cx, cy)});
             } else {
-                this.transformations[0] = &quot;&quot;;
-                this.clip &amp;&amp; $(this.clip, {transform: &quot;&quot;});
+                this.transformations[0] = E;
+                this.clip &amp;&amp; $(this.clip, {transform: E});
             }
-            $(this.node, {transform: this.transformations.join(&quot; &quot;)});
+            $(this.node, {transform: this.transformations[join](&quot; &quot;)});
             return this;
         };
         Element[proto].hide = function () {
@@ -1225,6 +1233,9 @@ window.Raphael = (function () {
         };
         Element[proto].remove = function () {
             this.node.parentNode.removeChild(this.node);
+            for (var i in this) {
+                delete this[i];
+            }
         };
         Element[proto].getBBox = function () {
             if (this.type == &quot;path&quot;) {
@@ -1243,18 +1254,19 @@ window.Raphael = (function () {
                 bbox = bbox || {};
             }
             if (this.type == &quot;text&quot;) {
-                bbox = {x: bbox.x, y: Infinity, width: bbox.width, height: 0};
+                bbox = {x: bbox.x, y: Infinity, width: 0, height: 0};
                 for (var i = 0, ii = this.node.getNumberOfChars(); i &lt; ii; i++) {
                     var bb = this.node.getExtentOfChar(i);
                     (bb.y &lt; bbox.y) &amp;&amp; (bbox.y = bb.y);
                     (bb.y + bb.height - bbox.y &gt; bbox.height) &amp;&amp; (bbox.height = bb.y + bb.height - bbox.y);
+                    (bb.x + bb.width - bbox.x &gt; bbox.width) &amp;&amp; (bbox.width = bb.x + bb.width - bbox.x);
                 }
             }
             hide &amp;&amp; this.hide();
             return bbox;
         };
         Element[proto].attr = function () {
-            if (arguments[ln] == 1 &amp;&amp; R.is(arguments[0], &quot;string&quot;)) {
+            if (arguments[length] == 1 &amp;&amp; R.is(arguments[0], &quot;string&quot;)) {
                 if (arguments[0] == &quot;translation&quot;) {
                     return this.translate();
                 }
@@ -1266,24 +1278,24 @@ window.Raphael = (function () {
                 }
                 return this.attrs[arguments[0]];
             }
-            if (arguments[ln] == 1 &amp;&amp; R.is(arguments[0], &quot;array&quot;)) {
+            if (arguments[length] == 1 &amp;&amp; R.is(arguments[0], &quot;array&quot;)) {
                 var values = {};
-                for (var j in arguments[0]) if (arguments[0].hasOwnProperty(j)) {
+                for (var j in arguments[0]) if (arguments[0][has](j)) {
                     values[arguments[0][j]] = this.attrs[arguments[0][j]];
                 }
                 return values;
             }
-            if (arguments[ln] == 2) {
+            if (arguments[length] == 2) {
                 var params = {};
                 params[arguments[0]] = arguments[1];
                 setFillAndStroke(this, params);
-            } else if (arguments[ln] == 1 &amp;&amp; R.is(arguments[0], &quot;object&quot;)) {
+            } else if (arguments[length] == 1 &amp;&amp; R.is(arguments[0], &quot;object&quot;)) {
                 setFillAndStroke(this, arguments[0]);
             }
             return this;
         };
         Element[proto].toFront = function () {
-            this.node.parentNode.appendChild(this.node);
+            this.node.parentNode[appendChild](this.node);
             return this;
         };
         Element[proto].toBack = function () {
@@ -1296,7 +1308,7 @@ window.Raphael = (function () {
             if (element.node.nextSibling) {
                 element.node.parentNode.insertBefore(this.node, element.node.nextSibling);
             } else {
-                element.node.parentNode.appendChild(this.node);
+                element.node.parentNode[appendChild](this.node);
             }
             return this;
         };
@@ -1310,7 +1322,7 @@ window.Raphael = (function () {
             x = round(x);
             y = round(y);
             var el = $(&quot;circle&quot;);
-            svg.canvas &amp;&amp; svg.canvas.appendChild(el);
+            svg.canvas &amp;&amp; svg.canvas[appendChild](el);
             var res = new Element(el, svg);
             res.attrs = {cx: x, cy: y, r: r, fill: &quot;none&quot;, stroke: &quot;#000&quot;};
             res.type = &quot;circle&quot;;
@@ -1321,7 +1333,7 @@ window.Raphael = (function () {
             x = round(x);
             y = round(y);
             var el = $(&quot;rect&quot;);
-            svg.canvas &amp;&amp; svg.canvas.appendChild(el);
+            svg.canvas &amp;&amp; svg.canvas[appendChild](el);
             var res = new Element(el, svg);
             res.attrs = {x: x, y: y, width: w, height: h, r: r || 0, rx: r || 0, ry: r || 0, fill: &quot;none&quot;, stroke: &quot;#000&quot;};
             res.type = &quot;rect&quot;;
@@ -1332,7 +1344,7 @@ window.Raphael = (function () {
             x = round(x);
             y = round(y);
             var el = $(&quot;ellipse&quot;);
-            svg.canvas &amp;&amp; svg.canvas.appendChild(el);
+            svg.canvas &amp;&amp; svg.canvas[appendChild](el);
             var res = new Element(el, svg);
             res.attrs = {cx: x, cy: y, rx: rx, ry: ry, fill: &quot;none&quot;, stroke: &quot;#000&quot;};
             res.type = &quot;ellipse&quot;;
@@ -1343,7 +1355,7 @@ window.Raphael = (function () {
             var el = $(&quot;image&quot;);
             $(el, {x: x, y: y, width: w, height: h, preserveAspectRatio: &quot;none&quot;});
             el.setAttributeNS(svg.xlink, &quot;href&quot;, src);
-            svg.canvas &amp;&amp; svg.canvas.appendChild(el);
+            svg.canvas &amp;&amp; svg.canvas[appendChild](el);
             var res = new Element(el, svg);
             res.attrs = {x: x, y: y, width: w, height: h, src: src};
             res.type = &quot;image&quot;;
@@ -1352,7 +1364,7 @@ window.Raphael = (function () {
         var theText = function (svg, x, y, text) {
             var el = $(&quot;text&quot;);
             $(el, {x: x, y: y, &quot;text-anchor&quot;: &quot;middle&quot;});
-            svg.canvas &amp;&amp; svg.canvas.appendChild(el);
+            svg.canvas &amp;&amp; svg.canvas[appendChild](el);
             var res = new Element(el, svg);
             res.attrs = {x: x, y: y, &quot;text-anchor&quot;: &quot;middle&quot;, text: text, font: availableAttrs.font, stroke: &quot;none&quot;, fill: &quot;#000&quot;};
             res.type = &quot;text&quot;;
@@ -1362,12 +1374,12 @@ window.Raphael = (function () {
         var setSize = function (width, height) {
             this.width = width || this.width;
             this.height = height || this.height;
-            this.canvas.setAttribute(&quot;width&quot;, this.width);
-            this.canvas.setAttribute(&quot;height&quot;, this.height);
+            this.canvas[setAttribute](&quot;width&quot;, this.width);
+            this.canvas[setAttribute](&quot;height&quot;, this.height);
             return this;
         };
         var create = function () {
-            var con = getContainer[ap](null, arguments),
+            var con = getContainer[apply](null, arguments),
                 container = con &amp;&amp; con.container,
                 x = con.x,
                 y = con.y,
@@ -1377,96 +1389,101 @@ window.Raphael = (function () {
                 throw new Error(&quot;SVG container not found.&quot;);
             }
             paper.canvas = $(&quot;svg&quot;);
-            var cnvs = paper.canvas,
-                stl = cnvs.style;
-            cnvs.setAttribute(&quot;width&quot;, width || 512);
+            var cnvs = paper.canvas;
             paper.width = width || 512;
-            cnvs.setAttribute(&quot;height&quot;, height || 342);
             paper.height = height || 342;
+            cnvs[setAttribute](&quot;width&quot;, paper.width);
+            cnvs[setAttribute](&quot;height&quot;, paper.height);
             if (container == 1) {
-                doc.body.appendChild(cnvs);
-                stl.position = &quot;absolute&quot;;
-                stl.left = x + &quot;px&quot;;
-                stl.top = y + &quot;px&quot;;
+                cnvs.style.cssText = &quot;position:absolute;left:&quot; + x + &quot;px;top:&quot; + y + &quot;px&quot;;
+                doc.body[appendChild](cnvs);
             } else {
                 if (container.firstChild) {
                     container.insertBefore(cnvs, container.firstChild);
                 } else {
-                    container.appendChild(cnvs);
+                    container[appendChild](cnvs);
                 }
             }
-            container = {
-                canvas: cnvs,
-                clear: function () {
-                    while (this.canvas.firstChild) {
-                        this.canvas.removeChild(this.canvas.firstChild);
-                    }
-                    this.desc = $(&quot;desc&quot;);
-                    this.defs = $(&quot;defs&quot;);
-                    this.desc.appendChild(doc.createTextNode(&quot;Created with Rapha\u00ebl&quot;));
-                    this.canvas.appendChild(this.desc);
-                    this.canvas.appendChild(this.defs);
-                }
-            };
-            for (var prop in paper) if (paper.hasOwnProperty(prop)) {
-                if (prop != &quot;create&quot;) {
-                    container[prop] = paper[prop];
-                }
+            container = { canvas: cnvs };
+            for (var prop in paper) if (paper[has](prop)) {
+                container[prop] = paper[prop];
             }
             plugins.call(container, container, R.fn);
             container.clear();
             container.raphael = R;
             return container;
         };
+        paper.clear = function () {
+            var c = this.canvas;
+            while (c.firstChild) {
+                c.removeChild(c.firstChild);
+            }
+            (this.desc = $(&quot;desc&quot;))[appendChild](doc.createTextNode(&quot;Created with Rapha\u00ebl&quot;));
+            c[appendChild](this.desc);
+            c[appendChild](this.defs = $(&quot;defs&quot;));
+        };
         paper.remove = function () {
             this.canvas.parentNode &amp;&amp; this.canvas.parentNode.removeChild(this.canvas);
+            for (var i in this) {
+                delete this[i];
+            }
         };
     }
 
     // VML
     if (R.vml) {
         var path2vml = function (path) {
-            var pa = path2curve(path);
-            for (var i = 0, ii = pa[ln]; i &lt; ii; i++) {
-                pa[i][0] = (pa[i][0] + &quot;&quot;).toLowerCase();
-                pa[i][0] == &quot;z&quot; &amp;&amp; (pa[i][0] = &quot;x&quot;);
-                for (var j = 1, jj = pa[i][ln]; j &lt; jj; j++) {
-                    pa[i][j] = ~~(pa[i][j] + .5);
+            var total =  /[ahqtv]/ig,
+                command = pathToAbsolute;
+            (path + E).match(total) &amp;&amp; (command = path2curve);
+            total =  /[clmz]/g;
+            if (command == pathToAbsolute &amp;&amp; !(path + E).match(total)) {
+                var map = {M: &quot;m&quot;, L: &quot;l&quot;, C: &quot;c&quot;, Z: &quot;x&quot;, m: &quot;t&quot;, l: &quot;r&quot;, c: &quot;v&quot;, z: &quot;x&quot;},
+                    bites = /([clmz]),?([^clmz]*)/gi,
+                    val = /-?[^,\s-]+/g;
+                var res = (path + E)[rp](bites, function (all, command, args) {
+                    var vals = [];
+                    args[rp](val, function (value) {
+                        vals[push](round(value));
+                    });
+                    return map[command] + vals;
+                });
+                return res;
+            }
+            var pa = command(path), p, res = [], r;
+            for (var i = 0, ii = pa[length]; i &lt; ii; i++) {
+                p = pa[i];
+                r = (pa[i][0] + E).toLowerCase();
+                r == &quot;z&quot; &amp;&amp; (r = &quot;x&quot;);
+                for (var j = 1, jj = p[length]; j &lt; jj; j++) {
+                    r += round(p[j]) + (j != jj - 1 ? &quot;,&quot; : E);
                 }
+                res[push](r);
             }
-            return (pa + &quot;&quot;);
+            return res[join](&quot; &quot;);
         };
-        R.toString = function () {
-            return  &quot;Your browser doesn\u2019t support SVG. Assuming it is Internet Explorer and falling down to VML.\nYou are running Rapha\u00ebl &quot; + this.version;
+        
+        R[toString] = function () {
+            return  &quot;Your browser doesn\u2019t support SVG. Falling down to VML.\nYou are running Rapha\u00ebl &quot; + this.version;
         };
         var thePath = function (pathString, VML) {
-            var g = createNode(&quot;group&quot;), gl = g.style;
-            gl.position = &quot;absolute&quot;;
-            gl.left = 0;
-            gl.top = 0;
-            gl.width = VML.width + &quot;px&quot;;
-            gl.height = VML.height + &quot;px&quot;;
+            var g = createNode(&quot;group&quot;);
+            g.style.cssText = &quot;position:absolute;left:0;top:0;width:&quot; + VML.width + &quot;px;height:&quot; + VML.height + &quot;px&quot;;
             g.coordsize = VML.coordsize;
             g.coordorigin = VML.coordorigin;
             var el = createNode(&quot;shape&quot;), ol = el.style;
             ol.width = VML.width + &quot;px&quot;;
             ol.height = VML.height + &quot;px&quot;;
-            el.path = &quot;&quot;;
             el.coordsize = this.coordsize;
             el.coordorigin = this.coordorigin;
-            g.appendChild(el);
+            g[appendChild](el);
             var p = new Element(el, g, VML);
             p.isAbsolute = true;
             p.type = &quot;path&quot;;
             p.path = [];
-            p.Path = &quot;&quot;;
-            if (pathString) {
-                p.attrs.path = R.parsePathString(pathString);
-                p.node.path = path2vml(p.attrs.path);
-            }
-            setFillAndStroke(p, {fill: &quot;none&quot;, stroke: &quot;#000&quot;});
-            p.setBox();
-            VML.canvas.appendChild(g);
+            p.Path = E;
+            pathString &amp;&amp; setFillAndStroke(p, {fill: &quot;none&quot;, stroke: &quot;#000&quot;, path: pathString});
+            VML.canvas[appendChild](g);
             return p;
         };
         var setFillAndStroke = function (o, params) {
@@ -1476,30 +1493,31 @@ window.Raphael = (function () {
                 s = node.style,
                 xy,
                 res = o;
-            for (var par in params) if (params.hasOwnProperty(par)) {
+            for (var par in params) if (params[has](par)) {
                 a[par] = params[par];
             }
             params.href &amp;&amp; (node.href = params.href);
             params.title &amp;&amp; (node.title = params.title);
             params.target &amp;&amp; (node.target = params.target);
             if (params.path &amp;&amp; o.type == &quot;path&quot;) {
-                a.path = R.parsePathString(params.path);
+                // a.path = R.parsePathString(params.path);
+                a.path = params.path;
                 node.path = path2vml(a.path);
             }
             if (params.rotation != null) {
                 o.rotate(params.rotation, true);
             }
             if (params.translation) {
-                xy = (params.translation + &quot;&quot;).split(separator);
+                xy = (params.translation + E)[split](separator);
                 o.translate(xy[0], xy[1]);
             }
             if (params.scale) {
-                xy = (params.scale + &quot;&quot;).split(separator);
+                xy = (params.scale + E)[split](separator);
                 o.scale(+xy[0] || 1, +xy[1] || +xy[0] || 1, +xy[2] || null, +xy[3] || null);
             }
             if (&quot;clip-rect&quot; in params) {
-                var rect = (params[&quot;clip-rect&quot;] + &quot;&quot;).split(separator);
-                if (rect[ln] == 4) {
+                var rect = (params[&quot;clip-rect&quot;] + E)[split](separator);
+                if (rect[length] == 4) {
                     rect[2] = +rect[2] + (+rect[0]);
                     rect[3] = +rect[3] + (+rect[1]);
                     var div = node.clipRect || doc.createElement(&quot;div&quot;),
@@ -1513,12 +1531,12 @@ window.Raphael = (function () {
                         dstyle.width = o.paper.width + &quot;px&quot;;
                         dstyle.height = o.paper.height + &quot;px&quot;;
                         group.parentNode.insertBefore(div, group);
-                        div.appendChild(group);
+                        div[appendChild](group);
                         node.clipRect = div;
                     }
                 }
                 if (!params[&quot;clip-rect&quot;]) {
-                    node.clipRect &amp;&amp; (node.clipRect.style.clip = &quot;&quot;);
+                    node.clipRect &amp;&amp; (node.clipRect.style.clip = E);
                 }
             }
             if (o.type == &quot;image&quot; &amp;&amp; params.src) {
@@ -1526,10 +1544,10 @@ window.Raphael = (function () {
             }
             if (o.type == &quot;image&quot; &amp;&amp; params.opacity) {
                 node.filterOpacity = &quot; progid:DXImageTransform.Microsoft.Alpha(opacity=&quot; + (params.opacity * 100) + &quot;)&quot;;
-                s.filter = (node.filterMatrix || &quot;&quot;) + (node.filterOpacity || &quot;&quot;);
+                s.filter = (node.filterMatrix || E) + (node.filterOpacity || E);
             }
             params.font &amp;&amp; (s.font = params.font);
-            params[&quot;font-family&quot;] &amp;&amp; (s.fontFamily = '&quot;' + params[&quot;font-family&quot;].split(&quot;,&quot;)[0].replace(/^['&quot;]+|['&quot;]+$/g, &quot;&quot;) + '&quot;');
+            params[&quot;font-family&quot;] &amp;&amp; (s.fontFamily = '&quot;' + params[&quot;font-family&quot;][split](&quot;,&quot;)[0][rp](/^['&quot;]+|['&quot;]+$/g, E) + '&quot;');
             params[&quot;font-size&quot;] &amp;&amp; (s.fontSize = params[&quot;font-size&quot;]);
             params[&quot;font-weight&quot;] &amp;&amp; (s.fontWeight = params[&quot;font-weight&quot;]);
             params[&quot;font-style&quot;] &amp;&amp; (s.fontStyle = params[&quot;font-style&quot;]);
@@ -1565,15 +1583,15 @@ window.Raphael = (function () {
                         fill.type = &quot;tile&quot;;
                     } else {
                         fill.color = R.getRGB(params.fill).hex;
-                        fill.src = &quot;&quot;;
+                        fill.src = E;
                         fill.type = &quot;solid&quot;;
-                        if (R.getRGB(params.fill).error &amp;&amp; (res.type in {circle: 1, ellipse: 1} || (params.fill + &quot;&quot;).charAt(0) != &quot;r&quot;) &amp;&amp; addGradientFill(res, params.fill)) {
+                        if (R.getRGB(params.fill).error &amp;&amp; (res.type in {circle: 1, ellipse: 1} || (params.fill + E).charAt(0) != &quot;r&quot;) &amp;&amp; addGradientFill(res, params.fill)) {
                             a.fill = &quot;none&quot;;
                             a.gradient = params.fill;
                         }
                     }
                 }
-                newfill &amp;&amp; node.appendChild(fill);
+                newfill &amp;&amp; node[appendChild](fill);
                 var stroke = (node.getElementsByTagName(&quot;stroke&quot;) &amp;&amp; node.getElementsByTagName(&quot;stroke&quot;)[0]),
                 newstroke = false;
                 !stroke &amp;&amp; (newstroke = stroke = createNode(&quot;stroke&quot;));
@@ -1595,7 +1613,7 @@ window.Raphael = (function () {
                 params[&quot;stroke-linejoin&quot;] &amp;&amp; (stroke.joinstyle = params[&quot;stroke-linejoin&quot;] || &quot;miter&quot;);
                 stroke.miterlimit = params[&quot;stroke-miterlimit&quot;] || 8;
                 params[&quot;stroke-linecap&quot;] &amp;&amp; (stroke.endcap = {butt: &quot;flat&quot;, square: &quot;square&quot;, round: &quot;round&quot;}[params[&quot;stroke-linecap&quot;]] || &quot;miter&quot;);
-                params[&quot;stroke-width&quot;] &amp;&amp; (stroke.weight = (win[pf](params[&quot;stroke-width&quot;]) || 1) * 12 / 16);
+                params[&quot;stroke-width&quot;] &amp;&amp; (stroke.weight = (toFloat(params[&quot;stroke-width&quot;]) || 1) * 12 / 16);
                 if (params[&quot;stroke-dasharray&quot;]) {
                     var dasharray = {
                         &quot;-&quot;: &quot;shortdash&quot;,
@@ -1609,9 +1627,9 @@ window.Raphael = (function () {
                         &quot;--.&quot;: &quot;longdashdot&quot;,
                         &quot;--..&quot;: &quot;longdashdotdot&quot;
                     };
-                    stroke.dashstyle = dasharray[params[&quot;stroke-dasharray&quot;]] || &quot;&quot;;
+                    stroke.dashstyle = dasharray[params[&quot;stroke-dasharray&quot;]] || E;
                 }
-                newstroke &amp;&amp; node.appendChild(stroke);
+                newstroke &amp;&amp; node[appendChild](stroke);
             }
             if (res.type == &quot;text&quot;) {
                 var s = res.paper.span.style;
@@ -1620,21 +1638,21 @@ window.Raphael = (function () {
                 a[&quot;font-size&quot;] &amp;&amp; (s.fontSize = a[&quot;font-size&quot;]);
                 a[&quot;font-weight&quot;] &amp;&amp; (s.fontWeight = a[&quot;font-weight&quot;]);
                 a[&quot;font-style&quot;] &amp;&amp; (s.fontStyle = a[&quot;font-style&quot;]);
-                res.node.string &amp;&amp; (res.paper.span.innerHTML = res.node.string.replace(/&lt;/g, &quot;&amp;#60;&quot;).replace(/&amp;/g, &quot;&amp;#38;&quot;).replace(/\n/g, &quot;&lt;br&gt;&quot;));
+                res.node.string &amp;&amp; (res.paper.span.innerHTML = (res.node.string + E)[rp](/&lt;/g, &quot;&amp;#60;&quot;)[rp](/&amp;/g, &quot;&amp;#38;&quot;)[rp](/\n/g, &quot;&lt;br&gt;&quot;));
                 res.W = a.w = res.paper.span.offsetWidth;
                 res.H = a.h = res.paper.span.offsetHeight;
                 res.X = a.x;
-                res.Y = a.y + ~~(res.H / 2 + .5);
+                res.Y = a.y + round(res.H / 2);
 
-                // text-anchor emulation
+                // text-anchor emulationm
                 switch (a[&quot;text-anchor&quot;]) {
                     case &quot;start&quot;:
                         res.node.style[&quot;v-text-align&quot;] = &quot;left&quot;;
-                        res.bbx = ~~(res.W / 2 + .5);
+                        res.bbx = round(res.W / 2);
                     break;
                     case &quot;end&quot;:
                         res.node.style[&quot;v-text-align&quot;] = &quot;right&quot;;
-                        res.bbx = -~~(res.W / 2 + .5);
+                        res.bbx = -round(res.W / 2);
                     break;
                     default:
                         res.node.style[&quot;v-text-align&quot;] = &quot;center&quot;;
@@ -1649,22 +1667,22 @@ window.Raphael = (function () {
                 type = &quot;linear&quot;,
                 fxfy = &quot;.5 .5&quot;;
             o.attrs.gradient = gradient;
-            gradient = (gradient + &quot;&quot;).replace(/^r(?:\(([^,]+?)\s*,\s*([^\)]+?)\))?/, function (all, fx, fy) {
+            gradient = (gradient + E)[rp](/^r(?:\(([^,]+?)\s*,\s*([^\)]+?)\))?/, function (all, fx, fy) {
                 type = &quot;radial&quot;;
                 if (fx &amp;&amp; fy) {
-                    fx = win[pf](fx);
-                    fy = win[pf](fy);
-                    if (Math.pow(fx - .5, 2) + Math.pow(fy - .5, 2) &gt; .25) {
-                        fy = Math.sqrt(.25 - Math.pow(fx - .5, 2)) + .5;
+                    fx = toFloat(fx);
+                    fy = toFloat(fy);
+                    if (pow(fx - .5, 2) + pow(fy - .5, 2) &gt; .25) {
+                        fy = Math.sqrt(.25 - pow(fx - .5, 2)) + .5;
                     }
                     fxfy = fx + &quot; &quot; + fy;
                 }
-                return &quot;&quot;;
+                return E;
             });
-            gradient = gradient.split(/\s*\-\s*/);
+            gradient = gradient[split](/\s*\-\s*/);
             if (type == &quot;linear&quot;) {
                 var angle = gradient.shift();
-                angle = -win[pf](angle);
+                angle = -toFloat(angle);
                 if (isNaN(angle)) {
                     return null;
                 }
@@ -1675,18 +1693,18 @@ window.Raphael = (function () {
             }
             o = o.shape || o.node;
             fill = fill[0] || createNode(&quot;fill&quot;);
-            if (dots[ln]) {
+            if (dots[length]) {
                 fill.on = true;
                 fill.method = &quot;none&quot;;
                 fill.type = (type == &quot;radial&quot;) ? &quot;gradientradial&quot; : &quot;gradient&quot;;
                 fill.color = dots[0].color;
-                fill.color2 = dots[dots[ln] - 1].color;
+                fill.color2 = dots[dots[length] - 1].color;
                 var clrs = [];
-                for (var i = 0, ii = dots[ln]; i &lt; ii; i++) {
-                    dots[i].offset &amp;&amp; clrs.push(dots[i].offset + &quot; &quot; + dots[i].color);
+                for (var i = 0, ii = dots[length]; i &lt; ii; i++) {
+                    dots[i].offset &amp;&amp; clrs[push](dots[i].offset + &quot; &quot; + dots[i].color);
                 }
-                if (clrs[ln] &amp;&amp; fill.colors) {
-                    fill.colors.value = clrs.join(&quot;,&quot;);
+                if (clrs[length] &amp;&amp; fill.colors) {
+                    fill.colors.value = clrs[join](&quot;,&quot;);
                 } else {
                     fill.colors.value = &quot;0% &quot; + fill.color;
                 }
@@ -1724,16 +1742,16 @@ window.Raphael = (function () {
         Element[proto].rotate = function (deg, cx, cy) {
             if (deg == null) {
                 if (this._.rt.cx) {
-                    return [this._.rt.deg, this._.rt.cx, this._.rt.cy].join(&quot; &quot;);
+                    return [this._.rt.deg, this._.rt.cx, this._.rt.cy][join](&quot; &quot;);
                 }
                 return this._.rt.deg;
             }
-            deg = (deg + &quot;&quot;).split(separator);
-            if (deg[ln] - 1) {
-                cx = win[pf](deg[1]);
-                cy = win[pf](deg[2]);
+            deg = (deg + E)[split](separator);
+            if (deg[length] - 1) {
+                cx = toFloat(deg[1]);
+                cy = toFloat(deg[2]);
             }
-            deg = win[pf](deg[0]);
+            deg = toFloat(deg[0]);
             if (cx != null) {
                 this._.rt.deg = deg;
             } else {
@@ -1755,7 +1773,7 @@ window.Raphael = (function () {
             var gs = this.Group.style,
                 os = (this.shape &amp;&amp; this.shape.style) || this.node.style;
             params = params || {};
-            for (var i in params) if (params.hasOwnProperty(i)) {
+            for (var i in params) if (params[has](i)) {
                 this.attrs[i] = params[i];
             }
             cx = cx || this._.rt.cx;
@@ -1779,14 +1797,14 @@ window.Raphael = (function () {
                     break;
                 case &quot;rect&quot;:
                 case &quot;image&quot;:
-                    x = attr.x;
-                    y = attr.y;
+                    x = +attr.x;
+                    y = +attr.y;
                     w = attr.width || 0;
                     h = attr.height || 0;
                     break;
                 case &quot;text&quot;:
-                    this.textpath.v = [&quot;m&quot;, ~~(attr.x + .5), &quot;, &quot;, ~~(attr.y - 2 + .5), &quot;l&quot;, ~~(attr.x + .5) + 1, &quot;, &quot;, ~~(attr.y - 2 + .5)].join(&quot;&quot;);
-                    x = attr.x - ~~(this.W / 2 + .5);
+                    this.textpath.v = [&quot;m&quot;, round(attr.x), &quot;, &quot;, round(attr.y - 2), &quot;l&quot;, round(attr.x) + 1, &quot;, &quot;, round(attr.y - 2)][join](E);
+                    x = attr.x - round(this.W / 2);
                     y = attr.y - this.H / 2;
                     w = this.W;
                     h = this.H;
@@ -1838,12 +1856,12 @@ window.Raphael = (function () {
                 (os.top != y - top + &quot;px&quot;) &amp;&amp; (os.top = y - top + &quot;px&quot;);
                 (os.width != w + &quot;px&quot;) &amp;&amp; (os.width = w + &quot;px&quot;);
                 (os.height != h + &quot;px&quot;) &amp;&amp; (os.height = h + &quot;px&quot;);
-                var arcsize = (+params.r || 0) / (Math.min(w, h));
+                var arcsize = (+params.r || 0) / (mmin(w, h));
                 if (this.type == &quot;rect&quot; &amp;&amp; this.arcsize != arcsize &amp;&amp; (arcsize || this.arcsize)) {
                     // We should replace element with the new one
                     var o = createNode(arcsize ? &quot;roundrect&quot; : &quot;rect&quot;);
                     o.arcsize = arcsize;
-                    this.Group.appendChild(o);
+                    this.Group[appendChild](o);
                     this.node.parentNode.removeChild(this.node);
                     this.node = o;
                     this.arcsize = arcsize;
@@ -1872,12 +1890,15 @@ window.Raphael = (function () {
             };
         };
         Element[proto].remove = function () {
-            this[0].parentNode.removeChild(this[0]);
+            this.node.parentNode.removeChild(this[0]);
             this.Group.parentNode.removeChild(this.Group);
             this.shape &amp;&amp; this.shape.parentNode.removeChild(this.shape);
+            for (var i in this) {
+                delete this[i];
+            }
         };
         Element[proto].attr = function () {
-            if (arguments[ln] == 1 &amp;&amp; R.is(arguments[0], &quot;string&quot;)) {
+            if (arguments[length] == 1 &amp;&amp; R.is(arguments[0], &quot;string&quot;)) {
                 if (arguments[0] == &quot;translation&quot;) {
                     return this.translate();
                 }
@@ -1889,23 +1910,23 @@ window.Raphael = (function () {
                 }
                 return this.attrs[arguments[0]];
             }
-            if (this.attrs &amp;&amp; arguments[ln] == 1 &amp;&amp; R.is(arguments[0], &quot;array&quot;)) {
+            if (this.attrs &amp;&amp; arguments[length] == 1 &amp;&amp; R.is(arguments[0], &quot;array&quot;)) {
                 var values = {};
-                for (var i = 0, ii = arguments[0][ln]; i &lt; ii; i++) {
+                for (var i = 0, ii = arguments[0][length]; i &lt; ii; i++) {
                     values[arguments[0][i]] = this.attrs[arguments[0][i]];
                 };
                 return values;
             }
             var params;
-            if (arguments[ln] == 2) {
+            if (arguments[length] == 2) {
                 params = {};
                 params[arguments[0]] = arguments[1];
             }
-            if (arguments[ln] == 1 &amp;&amp; R.is(arguments[0], &quot;object&quot;)) {
+            if (arguments[length] == 1 &amp;&amp; R.is(arguments[0], &quot;object&quot;)) {
                 params = arguments[0];
             }
             if (params) {
-                if (params.gradient &amp;&amp; (this.type in {circle: 1, ellipse: 1} || (params.gradient + &quot;&quot;).charAt(0) != &quot;r&quot;)) {
+                if (params.gradient &amp;&amp; (this.type in {circle: 1, ellipse: 1} || (params.gradient + E).charAt(0) != &quot;r&quot;)) {
                     addGradientFill(this, params.gradient);
                 }
                 if (params.text &amp;&amp; this.type == &quot;text&quot;) {
@@ -1917,7 +1938,7 @@ window.Raphael = (function () {
             return this;
         };
         Element[proto].toFront = function () {
-            this.Group.parentNode.appendChild(this.Group);
+            this.Group.parentNode[appendChild](this.Group);
             return this;
         };
         Element[proto].toBack = function () {
@@ -1930,7 +1951,7 @@ window.Raphael = (function () {
             if (element.Group.nextSibling) {
                 element.Group.parentNode.insertBefore(this.Group, element.Group.nextSibling);
             } else {
-                element.Group.parentNode.appendChild(this.Group);
+                element.Group.parentNode[appendChild](this.Group);
             }
             return this;
         };
@@ -1946,7 +1967,7 @@ window.Raphael = (function () {
             g.style.cssText = &quot;position:absolute;left:0;top:0;width:&quot; + vml.width + &quot;px;height:&quot; + vml.height + &quot;px&quot;;
             g.coordsize = vml.coordsize;
             g.coordorigin = vml.coordorigin;
-            g.appendChild(o);
+            g[appendChild](o);
             var res = new Element(o, g, vml);
             res.type = &quot;circle&quot;;
             setFillAndStroke(res, {stroke: &quot;#000&quot;, fill: &quot;none&quot;});
@@ -1954,24 +1975,24 @@ window.Raphael = (function () {
             res.attrs.cy = y;
             res.attrs.r = r;
             res.setBox({x: x - r, y: y - r, width: r * 2, height: r * 2});
-            vml.canvas.appendChild(g);
+            vml.canvas[appendChild](g);
             return res;
         };
         var theRect = function (vml, x, y, w, h, r) {
             var g = createNode(&quot;group&quot;),
                 o = createNode(r ? &quot;roundrect&quot; : &quot;rect&quot;),
-                arcsize = (+r || 0) / (Math.min(w, h));
+                arcsize = (+r || 0) / (mmin(w, h));
             o.arcsize = arcsize;
             g.style.cssText = &quot;position:absolute;left:0;top:0;width:&quot; + vml.width + &quot;px;height:&quot; + vml.height + &quot;px&quot;;
             g.coordsize = vml.coordsize;
             g.coordorigin = vml.coordorigin;
-            g.appendChild(o);
+            g[appendChild](o);
             var res = new Element(o, g, vml);
             res.type = &quot;rect&quot;;
             setFillAndStroke(res, {stroke: &quot;#000&quot;});
             res.arcsize = arcsize;
             res.setBox({x: x, y: y, width: w, height: h, r: +r});
-            vml.canvas.appendChild(g);
+            vml.canvas[appendChild](g);
             return res;
         };
         var theEllipse = function (vml, x, y, rx, ry) {
@@ -1981,7 +2002,7 @@ window.Raphael = (function () {
             g.style.cssText = &quot;position:absolute;left:0;top:0;width:&quot; + vml.width + &quot;px;height:&quot; + vml.height + &quot;px&quot;;
             g.coordsize = vml.coordsize;
             g.coordorigin = vml.coordorigin;
-            g.appendChild(o);
+            g[appendChild](o);
             var res = new Element(o, g, vml);
             res.type = &quot;ellipse&quot;;
             setFillAndStroke(res, {stroke: &quot;#000&quot;});
@@ -1990,7 +2011,7 @@ window.Raphael = (function () {
             res.attrs.rx = rx;
             res.attrs.ry = ry;
             res.setBox({x: x - rx, y: y - ry, width: rx * 2, height: ry * 2});
-            vml.canvas.appendChild(g);
+            vml.canvas[appendChild](g);
             return res;
         };
         var theImage = function (vml, src, x, y, w, h) {
@@ -2001,7 +2022,7 @@ window.Raphael = (function () {
             g.coordsize = vml.coordsize;
             g.coordorigin = vml.coordorigin;
             o.src = src;
-            g.appendChild(o);
+            g[appendChild](o);
             var res = new Element(o, g, vml);
             res.type = &quot;image&quot;;
             res.attrs.src = src;
@@ -2010,7 +2031,7 @@ window.Raphael = (function () {
             res.attrs.w = w;
             res.attrs.h = h;
             res.setBox({x: x, y: y, width: w, height: h});
-            vml.canvas.appendChild(g);
+            vml.canvas[appendChild](g);
             return res;
         };
         var theText = function (vml, x, y, text) {
@@ -2023,15 +2044,15 @@ window.Raphael = (function () {
             g.style.cssText = &quot;position:absolute;left:0;top:0;width:&quot; + vml.width + &quot;px;height:&quot; + vml.height + &quot;px&quot;;
             g.coordsize = vml.coordsize;
             g.coordorigin = vml.coordorigin;
-            path.v = R.format(&quot;m{0},{1}l{2},{1}&quot;, ~~(x + .5), ~~(y + .5), ~~(x + .5) + 1);
+            path.v = R.format(&quot;m{0},{1}l{2},{1}&quot;, round(x), round(y), round(x) + 1);
             path.textpathok = true;
             ol.width = vml.width;
             ol.height = vml.height;
             o.string = text;
             o.on = true;
-            el.appendChild(o);
-            el.appendChild(path);
-            g.appendChild(el);
+            el[appendChild](o);
+            el[appendChild](path);
+            g[appendChild](el);
             var res = new Element(o, g, vml);
             res.shape = el;
             res.textpath = path;
@@ -2043,13 +2064,13 @@ window.Raphael = (function () {
             res.attrs.h = 1;
             setFillAndStroke(res, {font: availableAttrs.font, stroke: &quot;none&quot;, fill: &quot;#000&quot;});
             res.setBox();
-            vml.canvas.appendChild(g);
+            vml.canvas[appendChild](g);
             return res;
         };
         var setSize = function (width, height) {
             var cs = this.canvas.style;
-            this.width = win[pf](width || this.width);
-            this.height = win[pf](height || this.height);
+            this.width = toFloat(width || this.width);
+            this.height = toFloat(height || this.height);
             cs.width = this.width + &quot;px&quot;;
             cs.height = this.height + &quot;px&quot;;
             cs.clip = &quot;rect(0 &quot; + this.width + &quot;px &quot; + this.height + &quot;px 0)&quot;;
@@ -2068,7 +2089,7 @@ window.Raphael = (function () {
             };
         }
         var create = function () {
-            var con = getContainer[ap](null, arguments),
+            var con = getContainer[apply](null, arguments),
                 container = con.container,
                 height = con.height,
                 s,
@@ -2081,18 +2102,18 @@ window.Raphael = (function () {
             var res = {},
                 c = res.canvas = doc.createElement(&quot;div&quot;),
                 cs = c.style;
-            width = win[pf](width) || 512;
-            height = win[pf](height) || 342;
+            width = toFloat(width) || 512;
+            height = toFloat(height) || 342;
             res.width = width;
             res.height = height;
             res.coordsize = width + &quot; &quot; + height;
             res.coordorigin = &quot;0 0&quot;;
             res.span = doc.createElement(&quot;span&quot;);
             res.span.style.cssText = &quot;position:absolute;left:-9999px;top:-9999px;padding:0;margin:0;line-height:1;display:inline;&quot;;
-            c.appendChild(res.span);
+            c[appendChild](res.span);
             cs.cssText = R.format(&quot;width:{0}px;height:{1}px;position:absolute;clip:rect(0 {0}px {1}px 0)&quot;, width, height);
             if (container == 1) {
-                doc.body.appendChild(c);
+                doc.body[appendChild](c);
                 cs.left = x + &quot;px&quot;;
                 cs.top = y + &quot;px&quot;;
                 container = {
@@ -2107,10 +2128,10 @@ window.Raphael = (function () {
                 if (container.firstChild) {
                     container.insertBefore(c, container.firstChild);
                 } else {
-                    container.appendChild(c);
+                    container[appendChild](c);
                 }
             }
-            for (var prop in paper) if (paper.hasOwnProperty(prop)) {
+            for (var prop in paper) if (paper[has](prop)) {
                 res[prop] = paper[prop];
             }
             plugins.call(res, res, R.fn);
@@ -2124,6 +2145,9 @@ window.Raphael = (function () {
         };
         paper.remove = function () {
             this.canvas.parentNode.removeChild(this.canvas);
+            for (var i in this) {
+                delete this[i];
+            }
         };
     }
 
@@ -2178,14 +2202,14 @@ window.Raphael = (function () {
             };
         }
     })();
-    for (var i = events[ln]; i--;) {
+    for (var i = events[length]; i--;) {
         (function (eventName) {
             Element[proto][eventName] = function (fn) {
                 if (R.is(fn, &quot;function&quot;)) {
                     this.events = this.events || {};
                     this.events[eventName] = this.events[eventName] || {};
                     this.events[eventName][fn] = this.events[eventName][fn] || [];
-                    this.events[eventName][fn].push(addEvent(this.shape || this.node, eventName, fn, this));
+                    this.events[eventName][fn][push](addEvent(this.shape || this.node, eventName, fn, this));
                 }
                 return this;
             };
@@ -2193,9 +2217,9 @@ window.Raphael = (function () {
                 this.events &amp;&amp;
                 this.events[eventName] &amp;&amp;
                 this.events[eventName][fn] &amp;&amp;
-                this.events[eventName][fn][ln] &amp;&amp;
+                this.events[eventName][fn][length] &amp;&amp;
                 this.events[eventName][fn].shift()() &amp;&amp;
-                !this.events[eventName][fn][ln] &amp;&amp;
+                !this.events[eventName][fn][length] &amp;&amp;
                 delete this.events[eventName][fn];
             };
 
@@ -2211,17 +2235,17 @@ window.Raphael = (function () {
         return theEllipse(this, x || 0, y || 0, rx || 0, ry || 0);
     };
     paper.path = function (pathString) {
-        pathString &amp;&amp; !R.is(pathString, &quot;string&quot;) &amp;&amp; !R.is(pathString[0], &quot;array&quot;) &amp;&amp; (pathString += &quot;&quot;);
-        return thePath(R.format[ap](R, arguments), this);
+        pathString &amp;&amp; !R.is(pathString, &quot;string&quot;) &amp;&amp; !R.is(pathString[0], &quot;array&quot;) &amp;&amp; (pathString += E);
+        return thePath(R.format[apply](R, arguments), this);
     };
     paper.image = function (src, x, y, w, h) {
         return theImage(this, src || &quot;about:blank&quot;, x || 0, y || 0, w || 0, h || 0);
     };
     paper.text = function (x, y, text) {
-        return theText(this, x || 0, y || 0, text || &quot;&quot;);
+        return theText(this, x || 0, y || 0, text || E);
     };
     paper.set = function (itemsArray) {
-        arguments[ln] &gt; 1 &amp;&amp; (itemsArray = Array[proto].splice.call(arguments, 0, arguments[ln]));
+        arguments[length] &gt; 1 &amp;&amp; (itemsArray = Array[proto].splice.call(arguments, 0, arguments[length]));
         return new Set(itemsArray);
     };
     paper.setSize = setSize;
@@ -2258,7 +2282,7 @@ window.Raphael = (function () {
                 case &quot;image&quot;:
                     var neww = a.width * dirx * kx,
                         newh = a.height * diry * ky,
-                        newr = a.r * Math.min(kx, ky),
+                        newr = a.r * mmin(kx, ky),
                         newx = ncx - neww / 2,
                         newy = ncy - newh / 2;
                     this.attr({
@@ -2274,7 +2298,7 @@ window.Raphael = (function () {
                     this.attr({
                         rx: a.rx * kx,
                         ry: a.ry * ky,
-                        r: a.r * Math.min(kx, ky),
+                        r: a.r * mmin(kx, ky),
                         cx: ncx,
                         cy: ncy
                     });
@@ -2282,7 +2306,7 @@ window.Raphael = (function () {
                 case &quot;path&quot;:
                     var path = pathToRelative(a.path),
                         skip = true;
-                    for (var i = 0, ii = path[ln]; i &lt; ii; i++) {
+                    for (var i = 0, ii = path[length]; i &lt; ii; i++) {
                         var p = path[i];
                         if (p[0].toUpperCase() == &quot;M&quot; &amp;&amp; skip) {
                             continue;
@@ -2290,13 +2314,13 @@ window.Raphael = (function () {
                             skip = false;
                         }
                         if (R.svg &amp;&amp; p[0].toUpperCase() == &quot;A&quot;) {
-                            p[path[i][ln] - 2] *= kx;
-                            p[path[i][ln] - 1] *= ky;
+                            p[path[i][length] - 2] *= kx;
+                            p[path[i][length] - 1] *= ky;
                             p[1] *= kx;
                             p[2] *= ky;
                             p[5] = +(dirx + diry ? !!+p[5] : !+p[5]);
                         } else {
-                            for (var j = 1, jj = p[ln]; j &lt; jj; j++) {
+                            for (var j = 1, jj = p[length]; j &lt; jj; j++) {
                                 p[j] *= (j % 2) ? kx : ky;
                             }
                         }
@@ -2312,31 +2336,31 @@ window.Raphael = (function () {
             }
             if (this.type in {text: 1, image:1} &amp;&amp; (dirx != 1 || diry != 1)) {
                 if (this.transformations) {
-                    this.transformations[2] = &quot;scale(&quot;.concat(dirx, &quot;,&quot;, diry, &quot;)&quot;);
-                    this.node.setAttribute(&quot;transform&quot;, this.transformations.join(&quot; &quot;));
+                    this.transformations[2] = &quot;scale(&quot;[concat](dirx, &quot;,&quot;, diry, &quot;)&quot;);
+                    this.node[setAttribute](&quot;transform&quot;, this.transformations[join](&quot; &quot;));
                     dx = (dirx == -1) ? -a.x - (neww || 0) : a.x;
                     dy = (diry == -1) ? -a.y - (newh || 0) : a.y;
                     this.attr({x: dx, y: dy});
                     a.fx = dirx - 1;
                     a.fy = diry - 1;
                 } else {
-                    this.node.filterMatrix = &quot; progid:DXImageTransform.Microsoft.Matrix(M11=&quot;.concat(dirx,
+                    this.node.filterMatrix = &quot; progid:DXImageTransform.Microsoft.Matrix(M11=&quot;[concat](dirx,
                         &quot;, M12=0, M21=0, M22=&quot;, diry,
                         &quot;, Dx=0, Dy=0, sizingmethod='auto expand', filtertype='bilinear')&quot;);
-                    s.filter = (this.node.filterMatrix || &quot;&quot;) + (this.node.filterOpacity || &quot;&quot;);
+                    s.filter = (this.node.filterMatrix || E) + (this.node.filterOpacity || E);
                 }
             } else {
                 if (this.transformations) {
-                    this.transformations[2] = &quot;&quot;;
-                    this.node.setAttribute(&quot;transform&quot;, this.transformations.join(&quot; &quot;));
+                    this.transformations[2] = E;
+                    this.node[setAttribute](&quot;transform&quot;, this.transformations[join](&quot; &quot;));
                     a.fx = 0;
                     a.fy = 0;
                 } else {
-                    this.node.filterMatrix = &quot;&quot;;
-                    s.filter = (this.node.filterMatrix || &quot;&quot;) + (this.node.filterOpacity || &quot;&quot;);
+                    this.node.filterMatrix = E;
+                    s.filter = (this.node.filterMatrix || E) + (this.node.filterOpacity || E);
                 }
             }
-            a.scale = [x, y, cx, cy].join(&quot; &quot;);
+            a.scale = [x, y, cx, cy][join](&quot; &quot;);
             this._.sx = x;
             this._.sy = y;
         }
@@ -2349,18 +2373,18 @@ window.Raphael = (function () {
             return n;
         },
         &quot;&lt;&quot;: function (n) {
-            return Math.pow(n, 3);
+            return pow(n, 3);
         },
         &quot;&gt;&quot;: function (n) {
-            return Math.pow(n - 1, 3) + 1;
+            return pow(n - 1, 3) + 1;
         },
         &quot;&lt;&gt;&quot;: function (n) {
             n = n * 2;
             if (n &lt; 1) {
-                return Math.pow(n, 3) / 2;
+                return pow(n, 3) / 2;
             }
             n -= 2;
-            return (Math.pow(n, 3) + 2) / 2;
+            return (pow(n, 3) + 2) / 2;
         },
         backIn: function (n) {
             var s = 1.70158;
@@ -2377,7 +2401,7 @@ window.Raphael = (function () {
             }
             var p = .3,
                 s = p / 4;
-            return Math.pow(2, -10 * n) * Math.sin((n - s) * (2 * Math.PI) / p) + 1;
+            return pow(2, -10 * n) * Math.sin((n - s) * (2 * Math.PI) / p) + 1;
         },
         bounce: function (n) {
             var s = 7.5625,
@@ -2412,7 +2436,7 @@ window.Raphael = (function () {
             to = {},
             diff = {},
             t = {x: 0, y: 0};
-        for (var attr in params) if (params.hasOwnProperty(attr)) {
+        for (var attr in params) if (params[has](attr)) {
             if (attr in availableAnimAttrs) {
                 from[attr] = this.attr(attr);
                 (from[attr] == null) &amp;&amp; (from[attr] = availableAttrs[attr]);
@@ -2435,16 +2459,16 @@ window.Raphael = (function () {
                         from[attr] = pathes[0];
                         to[attr] = pathes[1];
                         diff[attr] = [];
-                        for (var i = 0, ii = from[attr][ln]; i &lt; ii; i++) {
+                        for (var i = 0, ii = from[attr][length]; i &lt; ii; i++) {
                             diff[attr][i] = [0];
-                            for (var j = 1, jj = from[attr][i][ln]; j &lt; jj; j++) {
+                            for (var j = 1, jj = from[attr][i][length]; j &lt; jj; j++) {
                                 diff[attr][i][j] = (to[attr][i][j] - from[attr][i][j]) / ms;
                             }
                         }
                         break;
                     case &quot;csv&quot;:
-                        var values = (params[attr] + &quot;&quot;).split(separator),
-                            from2 = (from[attr] + &quot;&quot;).split(separator);
+                        var values = (params[attr] + E)[split](separator),
+                            from2 = (from[attr] + E)[split](separator);
                         switch (attr) {
                             case &quot;translation&quot;:
                                 from[attr] = [0, 0];
@@ -2456,11 +2480,11 @@ window.Raphael = (function () {
                             break;
                             case &quot;scale&quot;:
                                 params[attr] = values;
-                                from[attr] = (from[attr] + &quot;&quot;).split(separator);
+                                from[attr] = (from[attr] + E)[split](separator);
                                 diff[attr] = [(values[0] - from[attr][0]) / ms, (values[1] - from[attr][1]) / ms, 0, 0];
                             break;
                             case &quot;clip-rect&quot;:
-                                from[attr] = (from[attr] + &quot;&quot;).split(separator);
+                                from[attr] = (from[attr] + E)[split](separator);
                                 diff[attr] = [];
                                 var i = 4;
                                 while (i--) {
@@ -2484,28 +2508,28 @@ window.Raphael = (function () {
                 now;
             if (time &lt; ms) {
                 var pos = R.easing_formulas[easing] ? R.easing_formulas[easing](time / ms) : time / ms;
-                for (var attr in from) if (from.hasOwnProperty(attr)) {
+                for (var attr in from) if (from[has](attr)) {
                     switch (availableAnimAttrs[attr]) {
                         case &quot;number&quot;:
                             now = +from[attr] + pos * ms * diff[attr];
                             break;
                         case &quot;colour&quot;:
                             now = &quot;rgb(&quot; + [
-                                upto255(~~(from[attr].r + pos * ms * diff[attr].r + .5)),
-                                upto255(~~(from[attr].g + pos * ms * diff[attr].g + .5)),
-                                upto255(~~(from[attr].b + pos * ms * diff[attr].b + .5))
-                            ].join(&quot;,&quot;) + &quot;)&quot;;
+                                upto255(round(from[attr].r + pos * ms * diff[attr].r)),
+                                upto255(round(from[attr].g + pos * ms * diff[attr].g)),
+                                upto255(round(from[attr].b + pos * ms * diff[attr].b))
+                            ][join](&quot;,&quot;) + &quot;)&quot;;
                             break;
                         case &quot;path&quot;:
                             now = [];
-                            for (var i = 0, ii = from[attr][ln]; i &lt; ii; i++) {
+                            for (var i = 0, ii = from[attr][length]; i &lt; ii; i++) {
                                 now[i] = [from[attr][i][0]];
-                                for (var j = 1, jj = from[attr][i][ln]; j &lt; jj; j++) {
+                                for (var j = 1, jj = from[attr][i][length]; j &lt; jj; j++) {
                                     now[i][j] = +from[attr][i][j] + pos * ms * diff[attr][i][j];
                                 }
-                                now[i] = now[i].join(&quot; &quot;);
+                                now[i] = now[i][join](&quot; &quot;);
                             }
-                            now = now.join(&quot; &quot;);
+                            now = now[join](&quot; &quot;);
                             break;
                         case &quot;csv&quot;:
                             switch (attr) {
@@ -2514,14 +2538,14 @@ window.Raphael = (function () {
                                         y = diff[attr][1] * (time - prev);
                                     t.x += x;
                                     t.y += y;
-                                    now = [x, y].join(&quot; &quot;);
+                                    now = x + &quot; &quot; + y;
                                 break;
                                 case &quot;rotation&quot;:
                                     now = +from[attr][0] + pos * ms * diff[attr][0];
                                     from[attr][1] &amp;&amp; (now += &quot;,&quot; + from[attr][1] + &quot;,&quot; + from[attr][2]);
                                 break;
                                 case &quot;scale&quot;:
-                                    now = [+from[attr][0] + pos * ms * diff[attr][0], +from[attr][1] + pos * ms * diff[attr][1], (2 in params[attr] ? params[attr][2] : &quot;&quot;), (3 in params[attr] ? params[attr][3] : &quot;&quot;)].join(&quot; &quot;);
+                                    now = [+from[attr][0] + pos * ms * diff[attr][0], +from[attr][1] + pos * ms * diff[attr][1], (2 in params[attr] ? params[attr][2] : E), (3 in params[attr] ? params[attr][3] : E)][join](&quot; &quot;);
                                 break;
                                 case &quot;clip-rect&quot;:
                                     now = [];
@@ -2533,13 +2557,14 @@ window.Raphael = (function () {
                             }
                             break;
                     }
-                    set[attr] = now;
+                    set[attr] = now + E;
                 }
                 that.attr(set);
                 that.animation_in_progress = setTimeout(tick);
                 R.svg &amp;&amp; paper.safari();
             } else {
                 (t.x || t.y) &amp;&amp; that.translate(-t.x, -t.y);
+                params.scale &amp;&amp; (params.scale = params.scale + E);
                 that.attr(params);
                 clearTimeout(that.animation_in_progress);
                 R.svg &amp;&amp; paper.safari();
@@ -2574,7 +2599,7 @@ window.Raphael = (function () {
         }
         return this;
     };
-    Element[proto].toString = function () {
+    Element[proto][toString] = function () {
         return &quot;Rapha\u00ebl\u2019s object&quot;;
     };
     
@@ -2582,38 +2607,38 @@ window.Raphael = (function () {
     // Set
     var Set = function (items) {
         this.items = [];
-        this[ln] = 0;
+        this[length] = 0;
         if (items) {
-            for (var i = 0, ii = items[ln]; i &lt; ii; i++) {
+            for (var i = 0, ii = items[length]; i &lt; ii; i++) {
                 if (items[i] &amp;&amp; (items[i].constructor == Element || items[i].constructor == Set)) {
-                    this[this.items[ln]] = this.items[this.items[ln]] = items[i];
-                    this[ln]++;
+                    this[this.items[length]] = this.items[this.items[length]] = items[i];
+                    this[length]++;
                 }
             }
         }
     };
-    Set[proto].push = function () {
+    Set[proto][push] = function () {
         var item,
             len;
-        for (var i = 0, ii = arguments[ln]; i &lt; ii; i++) {
+        for (var i = 0, ii = arguments[length]; i &lt; ii; i++) {
             item = arguments[i];
             if (item &amp;&amp; (item.constructor == Element || item.constructor == Set)) {
-                len = this.items[ln];
+                len = this.items[length];
                 this[len] = this.items[len] = item;
-                this[ln]++;
+                this[length]++;
             }
         }
         return this;
     };
     Set[proto].pop = function () {
-        delete this[this[ln]--];
+        delete this[this[length]--];
         return this.items.pop();
     };
-    for (var method in Element[proto]) if (Element[proto].hasOwnProperty(method)) {
+    for (var method in Element[proto]) if (Element[proto][has](method)) {
         Set[proto][method] = (function (methodname) {
             return function () {
-                for (var i = 0, ii = this.items[ln]; i &lt; ii; i++) {
-                    this.items[i][methodname][ap](this.items[i], arguments);
+                for (var i = 0, ii = this.items[length]; i &lt; ii; i++) {
+                    this.items[i][methodname][apply](this.items[i], arguments);
                 }
                 return this;
             };
@@ -2621,12 +2646,12 @@ window.Raphael = (function () {
     }
     Set[proto].attr = function (name, value) {
         if (name &amp;&amp; R.is(name, &quot;array&quot;) &amp;&amp; R.is(name[0], &quot;object&quot;)) {
-            for (var j = 0, jj = name[ln]; j &lt; jj; j++) {
+            for (var j = 0, jj = name[length]; j &lt; jj; j++) {
                 this.items[j].attr(name[j]);
             }
         } else {
-            for (var i = 0, ii = this.items[ln]; i &lt; ii; i++) {
-                this.items[i].attr[ap](this.items[i], arguments);
+            for (var i = 0, ii = this.items[length]; i &lt; ii; i++) {
+                this.items[i].attr[apply](this.items[i], arguments);
             }
         }
         return this;
@@ -2635,7 +2660,7 @@ window.Raphael = (function () {
         if (R.is(easing, &quot;function&quot;) || !easing) {
             callback = easing || null;
         }
-        var len = this.items[ln],
+        var len = this.items[length],
             i = len,
             set = this;
         if (callback) {
@@ -2658,20 +2683,20 @@ window.Raphael = (function () {
             y = [],
             w = [],
             h = [];
-        for (var i = this.items[ln]; i--;) {
+        for (var i = this.items[length]; i--;) {
             var box = this.items[i].getBBox();
-            x.push(box.x);
-            y.push(box.y);
-            w.push(box.x + box.width);
-            h.push(box.y + box.height);
+            x[push](box.x);
+            y[push](box.y);
+            w[push](box.x + box.width);
+            h[push](box.y + box.height);
         }
-        x = Math.min[ap](Math, x);
-        y = Math.min[ap](Math, y);
+        x = mmin[apply](0, x);
+        y = mmin[apply](0, y);
         return {
             x: x,
             y: y,
-            width: Math.max[ap](Math, w) - x,
-            height: Math.max[ap](Math, h) - y
+            width: mmax[apply](0, w) - x,
+            height: mmax[apply](0, h) - y
         };
     };
 
@@ -2686,27 +2711,27 @@ window.Raphael = (function () {
                 glyphs: {}
             },
             family = font.face[&quot;font-family&quot;];
-        for (var prop in font.face) if (font.face.hasOwnProperty(prop)) {
+        for (var prop in font.face) if (font.face[has](prop)) {
             fontcopy.face[prop] = font.face[prop];
         }
         if (this.fonts[family]) {
-            this.fonts[family].push(fontcopy);
+            this.fonts[family][push](fontcopy);
         } else {
             this.fonts[family] = [fontcopy];
         }
         if (!font.svg) {
-            fontcopy.face[&quot;units-per-em&quot;] = win[pi](font.face[&quot;units-per-em&quot;], 10);
-            for (var glyph in font.glyphs) if (font.glyphs.hasOwnProperty(glyph)) {
+            fontcopy.face[&quot;units-per-em&quot;] = toInt(font.face[&quot;units-per-em&quot;], 10);
+            for (var glyph in font.glyphs) if (font.glyphs[has](glyph)) {
                 var path = font.glyphs[glyph];
                 fontcopy.glyphs[glyph] = {
                     w: path.w,
                     k: {},
-                    d: path.d &amp;&amp; &quot;M&quot; + path.d.replace(/[mlcxtrv]/g, function (command) {
+                    d: path.d &amp;&amp; &quot;M&quot; + path.d[rp](/[mlcxtrv]/g, function (command) {
                             return {l: &quot;L&quot;, c: &quot;C&quot;, x: &quot;z&quot;, t: &quot;m&quot;, r: &quot;l&quot;, v: &quot;c&quot;}[command] || &quot;M&quot;;
                         }) + &quot;z&quot;
                 };
                 if (path.k) {
-                    for (var k in path.k) if (path.hasOwnProperty(k)) {
+                    for (var k in path.k) if (path[has](k)) {
                         fontcopy.glyphs[glyph].k[k] = path.k[k];
                     }
                 }
@@ -2720,8 +2745,8 @@ window.Raphael = (function () {
         weight = +weight || {normal: 400, bold: 700, lighter: 300, bolder: 800}[weight] || 400;
         var font = R.fonts[family];
         if (!font) {
-            var name = new RegExp(&quot;(^|\\s)&quot; + family.replace(/[^\w\d\s+!~.:_-]/g, &quot;&quot;) + &quot;(\\s|$)&quot;, &quot;i&quot;);
-            for (var fontName in R.fonts) if (R.fonts.hasOwnProperty(fontName)) {
+            var name = new RegExp(&quot;(^|\\s)&quot; + family[rp](/[^\w\d\s+!~.:_-]/g, E) + &quot;(\\s|$)&quot;, &quot;i&quot;);
+            for (var fontName in R.fonts) if (R.fonts[has](fontName)) {
                 if (name.test(fontName)) {
                     font = R.fonts[fontName];
                     break;
@@ -2730,7 +2755,7 @@ window.Raphael = (function () {
         }
         var thefont;
         if (font) {
-            for (var i = 0, ii = font[ln]; i &lt; ii; i++) {
+            for (var i = 0, ii = font[length]; i &lt; ii; i++) {
                 thefont = font[i];
                 if (thefont.face[&quot;font-weight&quot;] == weight &amp;&amp; (thefont.face[&quot;font-style&quot;] == style || !thefont.face[&quot;font-style&quot;]) &amp;&amp; thefont.face[&quot;font-stretch&quot;] == stretch) {
                     break;
@@ -2741,18 +2766,18 @@ window.Raphael = (function () {
     };
     paper.print = function (x, y, string, font, size) {
         var out = this.set(),
-            letters = (string + &quot;&quot;).split(&quot;&quot;),
+            letters = (string + E)[split](E),
             shift = 0,
-            path = &quot;&quot;,
+            path = E,
             scale;
         R.is(font, &quot;string&quot;) &amp;&amp; (font = this.getFont(font));
         if (font) {
             scale = (size || 16) / font.face[&quot;units-per-em&quot;];
-            for (var i = 0, ii = letters[ln]; i &lt; ii; i++) {
+            for (var i = 0, ii = letters[length]; i &lt; ii; i++) {
                 var prev = i &amp;&amp; font.glyphs[letters[i - 1]] || {},
                     curr = font.glyphs[letters[i]];
                 shift += i ? (prev.w || font.w) + (prev.k &amp;&amp; prev.k[letters[i]] || 0) : 0;
-                curr &amp;&amp; curr.d &amp;&amp; out.push(this.path(curr.d).attr({fill: &quot;#000&quot;, stroke: &quot;none&quot;, translation: [shift, 0]}));
+                curr &amp;&amp; curr.d &amp;&amp; out[push](this.path(curr.d).attr({fill: &quot;#000&quot;, stroke: &quot;none&quot;, translation: [shift, 0]}));
             }
             out.scale(scale, scale, 0, y).translate(x, (size || 16) / 2);
         }
@@ -2760,21 +2785,21 @@ window.Raphael = (function () {
     };
 
     R.format = function (token) {
-        var args = R.is(arguments[1], &quot;array&quot;) ? [0].concat(arguments[1]) : arguments;
-        token &amp;&amp; R.is(token, &quot;string&quot;) &amp;&amp; args[ln] - 1 &amp;&amp; (token = token.replace(/\{(\d+)\}/g, function (str, i) {
-            return args[++i] == null ? &quot;&quot; : args[i];
+        var args = R.is(arguments[1], &quot;array&quot;) ? [0][concat](arguments[1]) : arguments;
+        token &amp;&amp; R.is(token, &quot;string&quot;) &amp;&amp; args[length] - 1 &amp;&amp; (token = token[rp](/\{(\d+)\}/g, function (str, i) {
+            return args[++i] == null ? E : args[i];
         }));
-        return token || &quot;&quot;;
+        return token || E;
     };
     R.ninja = function () {
-        var r = window.Raphael, u;
+        var r = win.Raphael, u;
         if (oldRaphael.was) {
-            window.Raphael = oldRaphael.is;
+            win.Raphael = oldRaphael.is;
         } else {
             try {
-                delete window.Raphael;
+                delete win.Raphael;
             } catch (e) {
-                window.Raphael = u;
+                win.Raphael = u;
             }
         }
         return r;</diff>
      <filename>raphael.js</filename>
    </modified>
    <modified>
      <diff>@@ -2,18 +2,26 @@
    &quot;http://www.w3.org/TR/html4/strict.dtd&quot;&gt;
 &lt;html lang=&quot;en&quot;&gt;
     &lt;head&gt;
-        &lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=utf-8&quot;&gt;
         &lt;title&gt;Rapha&#235;l Reference&lt;/title&gt;
+        &lt;meta http-equiv=&quot;content-language&quot; content=&quot;en&quot;&gt;
+        &lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=utf-8&quot;&gt;
         &lt;meta name=&quot;author&quot; content=&quot;Dmitry Baranovskiy&quot;&gt;
-        &lt;meta name=&quot;description&quot; content=&quot;Vector Graphics JavaScript&#8482; Library&quot;&gt;
+        &lt;meta name=&quot;description&quot; content=&quot;Vector Graphics JavaScript Library&quot;&gt;
+        &lt;meta name=&quot;keywords&quot; content=&quot;JavaScript Library, Raphael, SVG, VML&quot;&gt;
+        &lt;meta name=&quot;viewport&quot; content=&quot;width=450; user-scalable=no&quot;&gt;
+        &lt;link rel=&quot;shortcut icon&quot; href=&quot;/favicon16.png&quot; type=&quot;image/x-icon&quot;&gt;
         &lt;link rel=&quot;stylesheet&quot; href=&quot;raphael.css&quot; type=&quot;text/css&quot; charset=&quot;utf-8&quot; media=&quot;screen,projection&quot;&gt;
-        &lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; media=&quot;print&quot; href=&quot;/dmitry-print.css&quot;&gt;
+        &lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; media=&quot;print&quot; href=&quot;print.css&quot;&gt;
         &lt;link rel=&quot;shortcut icon&quot; href=&quot;/favicon16.png&quot; type=&quot;image/x-icon&quot;&gt;
-        &lt;link rel=&quot;apple-touch-icon&quot; href=&quot;/favicon.png&quot;&gt;
-        &lt;script src=&quot;../jquery.js&quot; type=&quot;text/javascript&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;
-        &lt;script src=&quot;../dmitry.js&quot; type=&quot;text/javascript&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;
+        &lt;link media=&quot;only screen and (max-device-width: 480px)&quot; href=&quot;iphone.css&quot; type=&quot;text/css&quot; rel=&quot;stylesheet&quot;&gt;
+        &lt;script src=&quot;jquery.js&quot; type=&quot;text/javascript&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;
+        &lt;script src=&quot;dmitry.js&quot; type=&quot;text/javascript&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;
+        &lt;script src=&quot;raphael.js&quot; type=&quot;text/javascript&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;
+        &lt;script src=&quot;museo.js&quot; type=&quot;text/javascript&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;
+
+
     &lt;/head&gt;
-    &lt;body class=&quot;raphael&quot; id=&quot;raphael.dmitry.baranovskiy.com&quot;&gt;
+    &lt;body class=&quot;raphael&quot; id=&quot;reference&quot;&gt;
         &lt;div id=&quot;header&quot;&gt;
             &lt;a href=&quot;http://twitter.com/statuses/user_timeline/17180567.atom&quot; id=&quot;rss&quot; name=&quot;rss&quot;&gt;rss&lt;/a&gt;
             &lt;h1&gt;
@@ -67,6 +75,17 @@ var paper = Raphael(&quot;notepad&quot;, 320, 200);&lt;/code&gt;&lt;/pre&gt;
                         &lt;h4&gt;Usage&lt;/h4&gt;
                         &lt;pre class=&quot;javascript code&quot;&gt;&lt;code&gt;var c = paper.circle(10, 10, 10); // draw a circle at coordinate 10,10 with radius of 10
 c.node.onclick = function () { c.attr(&quot;fill&quot;, &quot;red&quot;); };&lt;/code&gt;&lt;/pre&gt;
+                        &lt;h3 id=&quot;paper&quot;&gt;
+                            paper
+                        &lt;/h3&gt;
+                        &lt;p&gt;
+                            Internal reference to &#8220;paper&#8221; where object drawn. Mainly for use in plugins and element extensions.
+                        &lt;/p&gt;
+                        &lt;h4&gt;Usage&lt;/h4&gt;
+                        &lt;pre class=&quot;javascript code&quot;&gt;&lt;code&gt;Raphael.el.cross = function () {
+    this.attr({fill: &quot;red&quot;});
+    this.paper.path(&quot;M10,10L50,50M50,10L10,50&quot;).attr({stroke: &quot;red&quot;});
+}&lt;/code&gt;&lt;/pre&gt;
                         &lt;h3 id=&quot;remove&quot;&gt;
                             remove
                         &lt;/h3&gt;
@@ -139,6 +158,8 @@ c.translate(10, 10); // moves the circle down the canvas, in a diagonal line&lt;/co
                         &lt;ol&gt;
                             &lt;li&gt;Xtimes &lt;em&gt;number&lt;/em&gt; Amount to scale horizontally&lt;/li&gt;
                             &lt;li&gt;Ytimes &lt;em&gt;number&lt;/em&gt; Amount to scale vertically&lt;/li&gt;
+                            &lt;li&gt;centerX &lt;em&gt;number&lt;/em&gt; [optional] X of the center of scaling, default is the center of the element&lt;/li&gt;
+                            &lt;li&gt;centerY &lt;em&gt;number&lt;/em&gt; [optional] Y of the center of scaling, default is the center of the element&lt;/li&gt;
                         &lt;/ol&gt;
                         &lt;h4&gt;Usage&lt;/h4&gt;
                         &lt;pre class=&quot;javascript code&quot;&gt;&lt;code&gt;var c = paper.circle(10, 10, 10);
@@ -170,6 +191,7 @@ c.scale(.5, .75);  // makes the circle half as wide, and 75% as high&lt;/code&gt;&lt;/pre
                         &lt;h4&gt;Possible parameters&lt;/h4&gt;
                         &lt;p&gt;Please refer to the &lt;a href=&quot;http://www.w3.org/TR/SVG/&quot; title=&quot;The W3C Recommendation for the SVG language describes these properties in detail.&quot;&gt;SVG specification&lt;/a&gt; for an explanation of these parameters.&lt;/p&gt;
                         &lt;ul&gt;
+                            &lt;li&gt;clip-rect &lt;em&gt;string&lt;/em&gt; comma or space separated values: x, y, width and height&lt;/li&gt;
                             &lt;li&gt;cx &lt;em&gt;number&lt;/em&gt;&lt;/li&gt;
                             &lt;li&gt;cy &lt;em&gt;number&lt;/em&gt;&lt;/li&gt;
                             &lt;li&gt;fill &lt;em&gt;colour&lt;/em&gt;&lt;/li&gt;
@@ -178,24 +200,24 @@ c.scale(.5, .75);  // makes the circle half as wide, and 75% as high&lt;/code&gt;&lt;/pre
                             &lt;li&gt;font-family &lt;em&gt;string&lt;/em&gt;&lt;/li&gt;
                             &lt;li&gt;font-size &lt;em&gt;number&lt;/em&gt;&lt;/li&gt;
                             &lt;li&gt;font-weight &lt;em&gt;string&lt;/em&gt;&lt;/li&gt;
-                            &lt;li&gt;gradient &lt;em&gt;object|string&lt;/em&gt; &quot;&#8249;angle&#8250;-&#8249;colour&#8250;[-&#8249;colour&#8250;[:&#8249;offset&#8250;]]*-&#8249;colour&#8250;&quot;&lt;/li&gt;
+                            &lt;li&gt;gradient &lt;em&gt;string&lt;/em&gt; &#8220;&#8249;angle&#8250;-&#8249;colour&#8250;[-&#8249;colour&#8250;[:&#8249;offset&#8250;]]*-&#8249;colour&#8250;&#8221;, example: &lt;samp&gt;&quot;90-#fff-#000&quot;&lt;/samp&gt; or &lt;samp&gt;&quot;0-#fff-#f00:20-#000&quot;&lt;/samp&gt;&lt;/li&gt;
                             &lt;li&gt;height &lt;em&gt;number&lt;/em&gt;&lt;/li&gt;
                             &lt;li&gt;opacity &lt;em&gt;number&lt;/em&gt;&lt;/li&gt;
-                            &lt;li&gt;path &lt;em&gt;pathString&lt;/em&gt;&lt;/li&gt;
+                            &lt;li&gt;path &lt;em&gt;pathString&lt;/em&gt; &lt;a href=&quot;http://www.w3.org/TR/SVG/paths.html#PathData&quot; title=&quot;Details of a path&#8217;s data attribute&#8217;s format are described in the SVG specification.&quot;&gt;SVG path string format&lt;/a&gt;&lt;/li&gt;
                             &lt;li&gt;r &lt;em&gt;number&lt;/em&gt;&lt;/li&gt;
                             &lt;li&gt;rotation &lt;em&gt;number&lt;/em&gt;&lt;/li&gt;
                             &lt;li&gt;rx &lt;em&gt;number&lt;/em&gt;&lt;/li&gt;
                             &lt;li&gt;ry &lt;em&gt;number&lt;/em&gt;&lt;/li&gt;
-                            &lt;li&gt;scale &lt;em&gt;CSV&lt;/em&gt;&lt;/li&gt;
+                            &lt;li&gt;scale &lt;em&gt;string&lt;/em&gt; comma or space separated values: xtimes, ytimes, cx, cy. See: &lt;a href=&quot;#scale&quot;&gt;scale&lt;/a&gt;&lt;/li&gt;
                             &lt;li&gt;src &lt;em&gt;string&lt;/em&gt; (URL)&lt;/li&gt;
                             &lt;li&gt;stroke &lt;em&gt;colour&lt;/em&gt;&lt;/li&gt;
-                            &lt;li&gt;stroke-dasharray &lt;em&gt;string&lt;/em&gt; [&#8220;-&#8221;, &#8220;.&#8221;, &#8220;-.&#8221;, &#8220;-..&#8221;, &#8220;. &#8221;, &#8220;- &#8221;, &#8220;--&#8221;, &#8220;- .&#8221;, &#8220;--.&#8221;, &#8220;--..&#8221;]&lt;/li&gt;
+                            &lt;li&gt;stroke-dasharray &lt;em&gt;string&lt;/em&gt; [&#8220;&#8221;, &#8220;-&#8221;, &#8220;.&#8221;, &#8220;-.&#8221;, &#8220;-..&#8221;, &#8220;. &#8221;, &#8220;- &#8221;, &#8220;--&#8221;, &#8220;- .&#8221;, &#8220;--.&#8221;, &#8220;--..&#8221;]&lt;/li&gt;
                             &lt;li&gt;stroke-linecap &lt;em&gt;string&lt;/em&gt; [&#8220;butt&#8221;, &#8220;square&#8221;, &#8220;round&#8221;, &#8220;miter&#8221;]&lt;/li&gt;
                             &lt;li&gt;stroke-linejoin &lt;em&gt;string&lt;/em&gt; [&#8220;butt&#8221;, &#8220;square&#8221;, &#8220;round&#8221;, &#8220;miter&#8221;]&lt;/li&gt;
                             &lt;li&gt;stroke-miterlimit &lt;em&gt;number&lt;/em&gt;&lt;/li&gt;
                             &lt;li&gt;stroke-opacity &lt;em&gt;number&lt;/em&gt;&lt;/li&gt;
                             &lt;li&gt;stroke-width &lt;em&gt;number&lt;/em&gt;&lt;/li&gt;
-                            &lt;li&gt;translation &lt;em&gt;CSV&lt;/em&gt;&lt;/li&gt;
+                            &lt;li&gt;translation &lt;em&gt;string&lt;/em&gt; comma or space separated values: x and y&lt;/li&gt;
                             &lt;li&gt;width &lt;em&gt;number&lt;/em&gt;&lt;/li&gt;
                             &lt;li&gt;x &lt;em&gt;number&lt;/em&gt;&lt;/li&gt;
                             &lt;li&gt;y &lt;em&gt;number&lt;/em&gt;&lt;/li&gt;
@@ -203,12 +225,13 @@ c.scale(.5, .75);  // makes the circle half as wide, and 75% as high&lt;/code&gt;&lt;/pre
                         &lt;h4&gt;Usage&lt;/h4&gt;
                         &lt;pre class=&quot;javascript code&quot;&gt;&lt;code&gt;var c = paper.circle(10, 10, 10);
 c.attr(&quot;fill&quot;, &quot;black&quot;);                              // using strings
-c.attr({fill: &quot;#000&quot;, stroke: &quot;#f00&quot;, opacity: 0.5}); // using params object&lt;/code&gt;&lt;/pre&gt;
+c.attr({fill: &quot;#000&quot;, stroke: &quot;#f00&quot;, opacity: 0.5}); // using params object
+c.attr({gradient: &quot;90-#fff-#000&quot;, &quot;stroke-dasharray&quot;: &quot;-..&quot;, &quot;clip-rect&quot;: &quot;10, 10, 100, 100&quot;});&lt;/code&gt;&lt;/pre&gt;
                         &lt;h3 id=&quot;animate&quot;&gt;
                             animate
                         &lt;/h3&gt;
                         &lt;p&gt;
-                            Linearly changes an attribute from its current value to its specified value in the given amount of milliseconds.
+                            Changes an attribute from its current value to its specified value in the given amount of milliseconds.
                         &lt;/p&gt;
                         &lt;h4&gt;Parameters&lt;/h4&gt;
                         &lt;ol&gt;
@@ -216,9 +239,17 @@ c.attr({fill: &quot;#000&quot;, stroke: &quot;#f00&quot;, opacity: 0.5}); // using params object&lt;/co
                             &lt;li&gt;ms &lt;em&gt;number&lt;/em&gt; The duration of the animation, given in milliseconds.&lt;/li&gt;
                             &lt;li&gt;callback &lt;em&gt;function&lt;/em&gt; [optional]&lt;/li&gt;
                         &lt;/ol&gt;
+                        &lt;p&gt;or&lt;/p&gt;
+                        &lt;ol&gt;
+                            &lt;li&gt;newAttrs &lt;em&gt;object&lt;/em&gt; A parameters object of the animation results. (Not all attributes can be animated.)&lt;/li&gt;
+                            &lt;li&gt;ms &lt;em&gt;number&lt;/em&gt; The duration of the animation, given in milliseconds.&lt;/li&gt;
+                            &lt;li&gt;easing &lt;em&gt;string&lt;/em&gt; [&#8220;&gt;&#8221;, &#8220;&amp;lt;&#8221;, &#8220;&amp;lt;&amp;gt;&#8221;, &#8220;backIn&#8221;, &#8220;backOut&#8221;, &#8220;bounce&#8221;, &#8220;elastic&#8221;] [optional]&lt;/li&gt;
+                            &lt;li&gt;callback &lt;em&gt;function&lt;/em&gt; [optional]&lt;/li&gt;
+                        &lt;/ol&gt;
                         &lt;h4&gt;Attributes that can be animated&lt;/h4&gt;
                         &lt;p&gt;The &lt;code&gt;newAttrs&lt;/code&gt; parameter accepts an object whose properties are the attributes to animate. However, not all attributes listed in the &lt;code&gt;attr&lt;/code&gt; method reference can be animated. The following is a list of those properties that can be animated:&lt;/p&gt;
                         &lt;ul&gt;
+                            &lt;li&gt;clip-rect &lt;em&gt;string&lt;/em&gt;&lt;/li&gt;
                             &lt;li&gt;cx &lt;em&gt;number&lt;/em&gt;&lt;/li&gt;
                             &lt;li&gt;cy &lt;em&gt;number&lt;/em&gt;&lt;/li&gt;
                             &lt;li&gt;fill &lt;em&gt;colour&lt;/em&gt;&lt;/li&gt;
@@ -228,21 +259,26 @@ c.attr({fill: &quot;#000&quot;, stroke: &quot;#f00&quot;, opacity: 0.5}); // using params object&lt;/co
                             &lt;li&gt;opacity &lt;em&gt;number&lt;/em&gt;&lt;/li&gt;
                             &lt;li&gt;path &lt;em&gt;pathString&lt;/em&gt;&lt;/li&gt;
                             &lt;li&gt;r &lt;em&gt;number&lt;/em&gt;&lt;/li&gt;
-                            &lt;li&gt;rotation &lt;em&gt;number&lt;/em&gt;&lt;/li&gt;
+                            &lt;li&gt;rotation &lt;em&gt;string&lt;/em&gt;&lt;/li&gt;
                             &lt;li&gt;rx &lt;em&gt;number&lt;/em&gt;&lt;/li&gt;
                             &lt;li&gt;ry &lt;em&gt;number&lt;/em&gt;&lt;/li&gt;
-                            &lt;li&gt;scale &lt;em&gt;CSV&lt;/em&gt;&lt;/li&gt;
+                            &lt;li&gt;scale &lt;em&gt;string&lt;/em&gt;&lt;/li&gt;
                             &lt;li&gt;stroke &lt;em&gt;colour&lt;/em&gt;&lt;/li&gt;
                             &lt;li&gt;stroke-opacity &lt;em&gt;number&lt;/em&gt;&lt;/li&gt;
                             &lt;li&gt;stroke-width &lt;em&gt;number&lt;/em&gt;&lt;/li&gt;
-                            &lt;li&gt;translation &lt;em&gt;CSV&lt;/em&gt;&lt;/li&gt;
+                            &lt;li&gt;translation &lt;em&gt;string&lt;/em&gt;&lt;/li&gt;
                             &lt;li&gt;width &lt;em&gt;number&lt;/em&gt;&lt;/li&gt;
                             &lt;li&gt;x &lt;em&gt;number&lt;/em&gt;&lt;/li&gt;
                             &lt;li&gt;y &lt;em&gt;number&lt;/em&gt;&lt;/li&gt;
                         &lt;/ul&gt;
+                        &lt;h4&gt;Easing&lt;/h4&gt;
+                        &lt;p&gt;
+                            For easing use built in functions or add your own by adding new functions to &lt;code&gt;Raphael.easing_formulas&lt;/code&gt; object. Look at the &lt;a href=&quot;easing.html&quot;&gt;example of easing usage&lt;/a&gt;.
+                        &lt;/p&gt;
                         &lt;h4&gt;Usage&lt;/h4&gt;
                         &lt;pre class=&quot;javascript code&quot;&gt;&lt;code&gt;var c = paper.circle(10, 10, 10);&lt;/code&gt;
-&lt;code&gt;c.animate({cx: 20, r: 20}, 2000);&lt;/code&gt;&lt;/pre&gt;
+&lt;code&gt;c.animate({cx: 20, r: 20}, 2000);&lt;/code&gt;
+&lt;code&gt;c.animate({cx: 20, r: 20}, 2000, &quot;bounce&quot;);&lt;/code&gt;&lt;/pre&gt;
                         &lt;h3 id=&quot;getBBox&quot;&gt;
                             getBBox
                         &lt;/h3&gt;
@@ -284,16 +320,129 @@ c.attr({fill: &quot;#000&quot;, stroke: &quot;#f00&quot;, opacity: 0.5}); // using params object&lt;/co
                             insertAfter
                         &lt;/h3&gt;
                         &lt;p&gt;
-                            Inserts current object after the given one
+                            Inserts current object after the given one.
                         &lt;/p&gt;
                         &lt;h4&gt;Usage&lt;/h4&gt;
                         &lt;pre class=&quot;javascript code&quot;&gt;&lt;code&gt;var r = paper.rect(10, 10, 10, 10);&lt;/code&gt;
 &lt;code&gt;var c = paper.circle(10, 10, 10);&lt;/code&gt;
 &lt;code&gt;r.insertAfter(c);&lt;/code&gt;&lt;/pre&gt;
                         &lt;h2&gt;Graphic Primitives&lt;/h2&gt;
+                        &lt;p&gt;
+                            Methods of &#8220;paper&#8221; object, created with &lt;code&gt;Raphael&lt;/code&gt; function call.
+                        &lt;/p&gt;
+                        &lt;h3 id=&quot;raphael&quot;&gt;
+                            raphael
+                        &lt;/h3&gt;
+                        &lt;p&gt;
+                            Internal reference to &lt;code&gt;Raphael&lt;/code&gt; object. In case it is not available.
+                        &lt;/p&gt;
+                        &lt;h4&gt;Usage&lt;/h4&gt;
+                        &lt;pre class=&quot;javascript code&quot;&gt;&lt;code&gt;Raphael.el.red = function () {
+    var hsb = this.paper.raphael.rgb2hsb(this.attr(&quot;fill&quot;));
+    hsb.h = 1;
+    this.attr({fill: this.paper.raphael.hsb2rgb(hsb).hex});
+}&lt;/code&gt;&lt;/pre&gt;
+                        &lt;h3 id=&quot;setSize&quot;&gt;
+                            setSize
+                        &lt;/h3&gt;
+                        &lt;p&gt;
+                            If you need to change dimensions of the canvas call this method
+                        &lt;/p&gt;
+                        &lt;h4&gt;Parameters&lt;/h4&gt;
+                        &lt;ol&gt;
+                            &lt;li&gt;width &lt;em&gt;number&lt;/em&gt; new width of the canvas&lt;/li&gt;
+                            &lt;li&gt;height &lt;em&gt;number&lt;/em&gt; new height of the canvas&lt;/li&gt;
+                        &lt;/ol&gt;
+                        &lt;h3 id=&quot;setWindow&quot;&gt;
+                            setWindow
+                        &lt;/h3&gt;
+                        &lt;p&gt;
+                            Should be called before main Raphael method. Sets which window should be used for drawing. Default is the current one. You need to use it if you want to draw inside &lt;code&gt;iframe&lt;/code&gt;
+                        &lt;/p&gt;
+                        &lt;h4&gt;Parameters&lt;/h4&gt;
+                        &lt;ol&gt;
+                            &lt;li&gt;window &lt;em&gt;object&lt;/em&gt;&lt;/li&gt;
+                        &lt;/ol&gt;
+                        &lt;h3 id=&quot;getRGB&quot;&gt;
+                            getRGB
+                        &lt;/h3&gt;
+                        &lt;p&gt;
+                            Parses passes string and returns an color object. Especially usefull for plug-in developers.
+                        &lt;/p&gt;
+                        &lt;h4&gt;Parameters&lt;/h4&gt;
+                        &lt;ol&gt;
+                            &lt;li&gt;color &lt;em&gt;string&lt;/em&gt; Color in form acceptable by library&lt;/li&gt;
+                        &lt;/ol&gt;
+                        &lt;h4&gt;Usage&lt;/h4&gt;
+                        &lt;pre class=&quot;javascript code&quot;&gt;&lt;code&gt;var stroke = Raphael.getRGB(circle.attr(&quot;stroke&quot;)).hex&lt;/code&gt;&lt;/pre&gt;
+                        &lt;h3 id=&quot;getColor&quot;&gt;
+                            getColor
+                        &lt;/h3&gt;
+                        &lt;p&gt;
+                            Returns a colour object for the next colour in spectrum
+                        &lt;/p&gt;
+                        &lt;h4&gt;Parameters&lt;/h4&gt;
+                        &lt;ol&gt;
+                            &lt;li&gt;value &lt;em&gt;number&lt;/em&gt; brightness [optional]&lt;/li&gt;
+                        &lt;/ol&gt;
+                        &lt;h4&gt;Usage&lt;/h4&gt;
+                        &lt;pre class=&quot;javascript code&quot;&gt;&lt;code&gt;var c = paper.path(&quot;M10,10L100,100&quot;).attr({stroke: Raphael.getColor()});&lt;/code&gt;&lt;/pre&gt;
+                        &lt;h3 id=&quot;getColor-reset&quot;&gt;
+                            getColor.reset
+                        &lt;/h3&gt;
+                        &lt;p&gt;
+                            Resets getColor function, so it will start from the beginning
+                        &lt;/p&gt;
+                        &lt;h3 id=&quot;registerFont&quot;&gt;
+                            registerFont
+                        &lt;/h3&gt;
+                        &lt;p&gt;
+                            Adds given font to the registered set of fonts for Rapha&#235;l. Should be used as an internal call from within Cuf&#243;n&#8217;s font file. &lt;a href=&quot;http://wiki.github.com/sorccu/cufon/about&quot;&gt;More about Cuf&#243;n and how to convert your font form TTF, OTF, etc to JavaScript file&lt;/a&gt;. Returns original parameter, so it could be used with chaining.
+                        &lt;/p&gt;
+                        &lt;h4&gt;Parameters&lt;/h4&gt;
+                        &lt;ol&gt;
+                            &lt;li&gt;font &lt;em&gt;object&lt;/em&gt; the font to register&lt;/li&gt;
+                        &lt;/ol&gt;
+                        &lt;h4&gt;Usage&lt;/h4&gt;
+                        &lt;pre class=&quot;javascript code&quot;&gt;&lt;code&gt;Cufon.registerFont(Raphael.registerFont({&#8230;}))&lt;/code&gt;&lt;/pre&gt;
+                        &lt;h3 id=&quot;getFont&quot;&gt;
+                            getFont
+                        &lt;/h3&gt;
+                        &lt;p&gt;
+                            Finds font object in the registered fonts by given parameters. You could specify only one word from the font name, like &#8220;Myriad&#8221; for &#8220;Myriad Pro&#8221;.
+                        &lt;/p&gt;
+                        &lt;h4&gt;Parameters&lt;/h4&gt;
+                        &lt;ol&gt;
+                            &lt;li&gt;family &lt;em&gt;string&lt;/em&gt; font family name or any word from it&lt;/li&gt;
+                            &lt;li&gt;weight &lt;em&gt;string&lt;/em&gt; weight of the font [optional]&lt;/li&gt;
+                            &lt;li&gt;style &lt;em&gt;string&lt;/em&gt; style of the font [optional]&lt;/li&gt;
+                            &lt;li&gt;stretch &lt;em&gt;string&lt;/em&gt; stretch of the font [optional]&lt;/li&gt;
+                        &lt;/ol&gt;
+                        &lt;h4&gt;Usage&lt;/h4&gt;
+                        &lt;pre class=&quot;javascript code&quot;&gt;&lt;code&gt;paper.print(100, 100, &quot;Test string&quot;, paper.getFont(&quot;Times&quot;, 800), 30);&lt;/code&gt;&lt;/pre&gt;
+                        &lt;h3 id=&quot;print&quot;&gt;
+                            print
+                        &lt;/h3&gt;
+                        &lt;div class=&quot;sample&quot; id=&quot;print-sample&quot;&gt;&lt;/div&gt;
+                        &lt;p&gt;
+                            Creates set of shapes to represent given font at given position with given size. Result of the method is set object (see &lt;a href=&quot;#set&quot;&gt;set&lt;/a&gt;) which contains each letter as separate path object.
+                        &lt;/p&gt;
+                        &lt;h4&gt;Parameters&lt;/h4&gt;
+                        &lt;ol&gt;
+                            &lt;li&gt;x &lt;em&gt;number&lt;/em&gt; x position of the text&lt;/li&gt;
+                            &lt;li&gt;y &lt;em&gt;number&lt;/em&gt; y position of the text&lt;/li&gt;
+                            &lt;li&gt;text &lt;em&gt;string&lt;/em&gt; text to print&lt;/li&gt;
+                            &lt;li&gt;font &lt;em&gt;object&lt;/em&gt; font object (see &lt;a href=&quot;#getFont&quot;&gt;getFont&lt;/a&gt;)&lt;/li&gt;
+                            &lt;li&gt;font_size &lt;em&gt;number&lt;/em&gt; size of the font&lt;/li&gt;
+                        &lt;/ol&gt;
+                        &lt;h4&gt;Usage&lt;/h4&gt;
+                        &lt;pre class=&quot;javascript code&quot;&gt;&lt;code&gt;var txt = r.print(10, 50, &quot;print&quot;, r.getFont(&quot;Museo&quot;), 30).attr({fill: &quot;#fff&quot;});
+// following line will paint first letter in red
+txt[0].attr({fill: &quot;#f00&quot;});&lt;/code&gt;&lt;/pre&gt;
                         &lt;h3 id=&quot;circle&quot;&gt;
                             circle
                         &lt;/h3&gt;
+                        &lt;div class=&quot;sample&quot; id=&quot;circle-sample&quot;&gt;&lt;/div&gt;
                         &lt;p&gt;
                             Draws a circle.
                         &lt;/p&gt;
@@ -304,10 +453,11 @@ c.attr({fill: &quot;#000&quot;, stroke: &quot;#f00&quot;, opacity: 0.5}); // using params object&lt;/co
                             &lt;li&gt;r &lt;em&gt;number&lt;/em&gt; radius&lt;/li&gt;
                         &lt;/ol&gt;
                         &lt;h4&gt;Usage&lt;/h4&gt;
-                        &lt;pre class=&quot;javascript code&quot;&gt;&lt;code&gt;var c = paper.circle(10, 10, 10);&lt;/code&gt;&lt;/pre&gt;
+                        &lt;pre class=&quot;javascript code&quot;&gt;&lt;code&gt;var c = paper.circle(50, 50, 40);&lt;/code&gt;&lt;/pre&gt;
                         &lt;h3 id=&quot;rect&quot;&gt;
                             rect
                         &lt;/h3&gt;
+                        &lt;div class=&quot;sample&quot; id=&quot;rect-sample&quot;&gt;&lt;/div&gt;
                         &lt;p&gt;
                             Draws a rectangle.
                         &lt;/p&gt;
@@ -321,12 +471,13 @@ c.attr({fill: &quot;#000&quot;, stroke: &quot;#f00&quot;, opacity: 0.5}); // using params object&lt;/co
                         &lt;/ol&gt;
                         &lt;h4&gt;Usage&lt;/h4&gt;
                         &lt;pre class=&quot;javascript code&quot;&gt;&lt;code&gt;// regular rectangle&lt;/code&gt;
-&lt;code&gt;var c = paper.rect(10, 10, 10, 10);&lt;/code&gt;
+&lt;code&gt;var c = paper.rect(10, 10, 50, 50);&lt;/code&gt;
 &lt;code&gt;// rectangle with rounded corners&lt;/code&gt;
-&lt;code&gt;var c = paper.rect(10, 10, 100, 50, 10);&lt;/code&gt;&lt;/pre&gt;
+&lt;code&gt;var c = paper.rect(40, 40, 50, 50, 10);&lt;/code&gt;&lt;/pre&gt;
                         &lt;h3 id=&quot;ellipse&quot;&gt;
                             ellipse
                         &lt;/h3&gt;
+                        &lt;div class=&quot;sample&quot; id=&quot;ellipse-sample&quot;&gt;&lt;/div&gt;
                         &lt;p&gt;
                             Draws an ellipse.
                         &lt;/p&gt;
@@ -338,10 +489,11 @@ c.attr({fill: &quot;#000&quot;, stroke: &quot;#f00&quot;, opacity: 0.5}); // using params object&lt;/co
                             &lt;li&gt;ry &lt;em&gt;number&lt;/em&gt; Vertical radius&lt;/li&gt;
                         &lt;/ol&gt;
                         &lt;h4&gt;Usage&lt;/h4&gt;
-                        &lt;pre class=&quot;javascript code&quot;&gt;&lt;code&gt;var c = paper.ellipse(100, 100, 30, 40);&lt;/code&gt;&lt;/pre&gt;
+                        &lt;pre class=&quot;javascript code&quot;&gt;&lt;code&gt;var c = paper.ellipse(50, 50, 40, 20);&lt;/code&gt;&lt;/pre&gt;
                         &lt;h3 id=&quot;image&quot;&gt;
                             image
                         &lt;/h3&gt;
+                        &lt;div class=&quot;sample&quot; id=&quot;image-sample&quot;&gt;&lt;/div&gt;
                         &lt;p&gt;
                             Embeds an image into the SVG/VML canvas.
                         &lt;/p&gt;
@@ -354,21 +506,22 @@ c.attr({fill: &quot;#000&quot;, stroke: &quot;#f00&quot;, opacity: 0.5}); // using params object&lt;/co
                             &lt;li&gt;height &lt;em&gt;number&lt;/em&gt; Height of the image&lt;/li&gt;
                         &lt;/ol&gt;
                         &lt;h4&gt;Usage&lt;/h4&gt;
-                        &lt;pre class=&quot;javascript code&quot;&gt;&lt;code&gt;var c = paper.image(&quot;apple.png&quot;, 10, 10, 100, 100);&lt;/code&gt;&lt;/pre&gt;
+                        &lt;pre class=&quot;javascript code&quot;&gt;&lt;code&gt;var c = paper.image(&quot;apple.png&quot;, 10, 10, 80, 80);&lt;/code&gt;&lt;/pre&gt;
                         &lt;h3 id=&quot;set&quot;&gt;
                             set
                         &lt;/h3&gt;
+                        &lt;div class=&quot;sample&quot; id=&quot;set-sample&quot;&gt;&lt;/div&gt;
                         &lt;p&gt;
                             Creates array-like object to keep and operate couple of elements at once. Warning: it doesn&#8217;t create any elements for itself in the page.
                         &lt;/p&gt;
                         &lt;h4&gt;Usage&lt;/h4&gt;
                         &lt;pre class=&quot;javascript code&quot;&gt;&lt;code&gt;var st = paper.set();&lt;/code&gt;
-&lt;code&gt;st.push(paper.circle(10, 10, 5));&lt;/code&gt;
-&lt;code&gt;st.push(paper.circle(30, 10, 5));&lt;/code&gt;
+&lt;code&gt;st.push(paper.circle(10, 10, 5), paper.circle(30, 10, 5));&lt;/code&gt;
 &lt;code&gt;st.attr({fill: &quot;red&quot;});&lt;/code&gt;&lt;/pre&gt;
                         &lt;h3 id=&quot;text&quot;&gt;
                             text
                         &lt;/h3&gt;
+                        &lt;div class=&quot;sample&quot; id=&quot;text-sample&quot;&gt;&lt;/div&gt;
                         &lt;p&gt;
                             Draws a text string. If you need line breaks, put &#8220;\n&#8221; in the string.
                         &lt;/p&gt;
@@ -379,193 +532,95 @@ c.attr({fill: &quot;#000&quot;, stroke: &quot;#f00&quot;, opacity: 0.5}); // using params object&lt;/co
                             &lt;li&gt;text &lt;em&gt;string&lt;/em&gt; The text string to draw.&lt;/li&gt;
                         &lt;/ol&gt;
                         &lt;h4&gt;Usage&lt;/h4&gt;
-                        &lt;pre class=&quot;javascript code&quot;&gt;&lt;code&gt;var t = paper.text(10, 10, &quot;Look mom, I'm scalable!&quot;);&lt;/code&gt;&lt;/pre&gt;
+                        &lt;pre class=&quot;javascript code&quot;&gt;&lt;code&gt;var t = paper.text(50, 50, &quot;Rapha&#235;l\nkicks\nbutt!&quot;);&lt;/code&gt;&lt;/pre&gt;
                         &lt;h3 id=&quot;path&quot;&gt;
                             path
                         &lt;/h3&gt;
+                        &lt;div class=&quot;sample&quot; id=&quot;path-sample&quot;&gt;&lt;/div&gt;
                         &lt;p&gt;
-                            Initialises path drawing. Typically, this function returns an empty &lt;code&gt;path&lt;/code&gt; object and to draw paths you use its built-in methods like &lt;code&gt;lineTo&lt;/code&gt; and &lt;code&gt;curveTo&lt;/code&gt;. However, you can also specify a path literally by supplying the path data as a second argument.
+                            Initialises path drawing. You can specify a path by supplying the path data as a second argument.
                         &lt;/p&gt;
                         &lt;h4&gt;Parameters&lt;/h4&gt;
                         &lt;ol&gt;
-                            &lt;li&gt;params &lt;em&gt;object&lt;/em&gt; Attributes for the resulting path as described in the &lt;code&gt;&lt;a href=&quot;#attr&quot;&gt;attr&lt;/a&gt;&lt;/code&gt; reference.&lt;/li&gt;
                             &lt;li&gt;pathString &lt;em&gt;string&lt;/em&gt; [optional] Path data in &lt;a href=&quot;http://www.w3.org/TR/SVG/paths.html#PathData&quot; title=&quot;Details of a path's data attribute's format are described in the SVG specification.&quot;&gt;SVG path string format&lt;/a&gt;.&lt;/li&gt;
                         &lt;/ol&gt;
                         &lt;h4&gt;Usage&lt;/h4&gt;
-                        &lt;pre class=&quot;javascript code&quot;&gt;&lt;code&gt;var c = paper.path({stroke: &quot;#036&quot;}).moveTo(10, 10).lineTo(50, 50); // draw a diagonal line
-var c = paper.path({stroke: &quot;#036&quot;}, &quot;M 10 10 L 50 50&quot;);            // same&lt;/code&gt;&lt;/pre&gt;
-                        &lt;h2&gt;Path Methods&lt;/h2&gt;
-                        &lt;h3 id=&quot;absolutely&quot;&gt;
-                            absolutely
-                        &lt;/h3&gt;
-                        &lt;p&gt;
-                            Sets a trigger to count all following units as absolute ones, unless said otherwise. (This is on by default.)
-                        &lt;/p&gt;
-                        &lt;h4&gt;Usage&lt;/h4&gt;
-                        &lt;pre class=&quot;javascript code&quot;&gt;&lt;code&gt;var c = paper.path({stroke: &quot;#036&quot;}).absolutely()
-    .moveTo(10, 10).lineTo(50, 50);&lt;/code&gt;&lt;/pre&gt;
-                        &lt;h3 id=&quot;relatively&quot;&gt;
-                            relatively
-                        &lt;/h3&gt;
-                        &lt;p&gt;
-                            Sets a trigger to count all following units as relative ones, unless said otherwise.
-                        &lt;/p&gt;
-                        &lt;h4&gt;Usage&lt;/h4&gt;
-                        &lt;pre class=&quot;javascript code&quot;&gt;&lt;code&gt;var c = paper.path({stroke: &quot;#036&quot;}).relatively()
-    .moveTo(10, 10).lineTo(50, 50);&lt;/code&gt;&lt;/pre&gt;
-                        &lt;h3 id=&quot;moveTo&quot;&gt;
-                            moveTo
-                        &lt;/h3&gt;
-                        &lt;p&gt;
-                            Moves the drawing point to the given coordinates.
-                        &lt;/p&gt;
-                        &lt;h4&gt;Parameters&lt;/h4&gt;
-                        &lt;ol&gt;
-                            &lt;li&gt;x &lt;em&gt;number&lt;/em&gt; X coordinate&lt;/li&gt;
-                            &lt;li&gt;y &lt;em&gt;number&lt;/em&gt; Y coordinate&lt;/li&gt;
-                        &lt;/ol&gt;
-                        &lt;h4&gt;Usage&lt;/h4&gt;
-                        &lt;pre class=&quot;javascript code&quot;&gt;&lt;code&gt;// Begins drawing the path at coordinate 10,10
-var c = paper.path({stroke: &quot;#036&quot;}).moveTo(10, 10).lineTo(50, 50);&lt;/code&gt;&lt;/pre&gt;
-                        &lt;h3 id=&quot;lineTo&quot;&gt;
-                            lineTo
+                        &lt;pre class=&quot;javascript code&quot;&gt;&lt;code&gt;var c = paper.path(&quot;M10 10L90 90&quot;);
+// draw a diagonal line: move to 10,10, line to 90,90&lt;/code&gt;&lt;/pre&gt;
+                        &lt;h3 id=&quot;plugins-canvas&quot;&gt;
+                            Adding your own methods to canvas
                         &lt;/h3&gt;
                         &lt;p&gt;
-                            Draws a straight line to the given coordinates.
+                            You can add your own method to the canvas. For example if you want to draw pie chart, you can create your own pie chart function and ship it as a Rapha&#235;l plugin. To do this you need to extend Raphael.fn object. Please note that you can create your own namespaces inside fn object. Methods will be run in context of canvas anyway. You should alter fn object before Rapha&#235;l instance was created, otherwise it will take no effect.
                         &lt;/p&gt;
-                        &lt;h4&gt;Parameters&lt;/h4&gt;
-                        &lt;ol&gt;
-                            &lt;li&gt;x &lt;em&gt;number&lt;/em&gt; X coordinate&lt;/li&gt;
-                            &lt;li&gt;y &lt;em&gt;number&lt;/em&gt; Y coordinate&lt;/li&gt;
-                        &lt;/ol&gt;
                         &lt;h4&gt;Usage&lt;/h4&gt;
-                        &lt;pre class=&quot;javascript code&quot;&gt;&lt;code&gt;// Draws a line starting from 10,10 to 50,50
-var c = paper.path({stroke: &quot;#036&quot;}).moveTo(10, 10).lineTo(50, 50);&lt;/code&gt;&lt;/pre&gt;
-                        &lt;h3 id=&quot;cplineTo&quot;&gt;
-                            cplineTo
+                        &lt;pre class=&quot;javascript code&quot;&gt;&lt;code&gt;Raphael.fn.arrow = function (x1, y1, x2, y2, size) {
+    return this.path(// some code here);
+};
+// or create namespace
+Raphael.fn.mystuff = {
+    arrow: function () {&#8230;},
+    star: function () {&#8230;},
+    // etc&#8230;
+};
+var paper = Raphael(10, 10, 630, 480);
+// then use it
+paper.arrow(10, 10, 30, 30, 5).attr({fill: &quot;#f00&quot;});
+paper.mystuff.arrow();
+paper.mystuff.star();
+&lt;/code&gt;&lt;/pre&gt;
+                        &lt;h3 id=&quot;plugins-elements&quot;&gt;
+                            Adding your own methods to elements
                         &lt;/h3&gt;
                         &lt;p&gt;
-                            Draws a curved line to the given coordinates. The line will have horizontal anchors on start and on finish.
+                            You can add your own method to elements. This is usefull when you want to hack default functionality or want to wrap some common transformation or attributes in one method. In difference to canvas mathods, you can redefine element method at any time.
                         &lt;/p&gt;
-                        &lt;h4&gt;Parameters&lt;/h4&gt;
-                        &lt;ol&gt;
-                            &lt;li&gt;x &lt;em&gt;number&lt;/em&gt;&lt;/li&gt;
-                            &lt;li&gt;y &lt;em&gt;number&lt;/em&gt;&lt;/li&gt;
-                            &lt;li&gt;width &lt;em&gt;number&lt;/em&gt;&lt;/li&gt;
-                        &lt;/ol&gt;
                         &lt;h4&gt;Usage&lt;/h4&gt;
-                        &lt;pre class=&quot;javascript code&quot;&gt;&lt;code&gt;var c = paper.path({stroke: &quot;#036&quot;}).moveTo(10, 10).cplineTo(50, 50);&lt;/code&gt;&lt;/pre&gt;
-                        &lt;h3 id=&quot;curveTo&quot;&gt;
-                            curveTo
+                        &lt;pre class=&quot;javascript code&quot;&gt;&lt;code&gt;Raphael.el.red = function () {
+    this.attr({fill: &quot;#f00&quot;});
+};
+// then use it
+paper.circle(100, 100, 20).red();
+&lt;/code&gt;&lt;/pre&gt;
+                        &lt;h3 id=&quot;colour&quot;&gt;
+                            Supported colour formats
                         &lt;/h3&gt;
                         &lt;p&gt;
-                            Draws a bicubic curve to the given coordinates.
+                            You could specify colour in this formats:
                         &lt;/p&gt;
-                        &lt;h4&gt;Parameters&lt;/h4&gt;
-                        &lt;ol&gt;
-                            &lt;li&gt;x1 &lt;em&gt;number&lt;/em&gt;&lt;/li&gt;
-                            &lt;li&gt;y1 &lt;em&gt;number&lt;/em&gt;&lt;/li&gt;
-                            &lt;li&gt;x2 &lt;em&gt;number&lt;/em&gt;&lt;/li&gt;
-                            &lt;li&gt;y2 &lt;em&gt;number&lt;/em&gt;&lt;/li&gt;
-                            &lt;li&gt;x3 &lt;em&gt;number&lt;/em&gt;&lt;/li&gt;
-                            &lt;li&gt;y3 &lt;em&gt;number&lt;/em&gt;&lt;/li&gt;
-                        &lt;/ol&gt;
+                        &lt;ul&gt;
+                            &lt;li&gt;Colour name (&#8220;red&#8221;, &#8220;green&#8221;, &#8220;cornflowerblue&#8221;, etc)&lt;/li&gt;
+                            &lt;li&gt;#&#8226;&#8226;&#8226; &#8212; shortened HTML colour: (&#8220;#000&#8221;, &#8220;#fc0&#8221;, etc)&lt;/li&gt;
+                            &lt;li&gt;#&#8226;&#8226;&#8226;&#8226;&#8226;&#8226; &#8212; full length HTML colour: (&#8220;#000000&#8221;, &#8220;#bd2300&#8221;)&lt;/li&gt;
+                            &lt;li&gt;rgb(&#8226;&#8226;&#8226;, &#8226;&#8226;&#8226;, &#8226;&#8226;&#8226;) &#8212; red, green and blue channels&#8217; values: (&#8220;rgb(200, 100, 0)&#8221;)&lt;/li&gt;
+                            &lt;li&gt;rgb(&#8226;&#8226;&#8226;%, &#8226;&#8226;&#8226;%, &#8226;&#8226;&#8226;%) &#8212; same as above, but in %: (&#8220;rgb(100%, 175%, 0%)&#8221;)&lt;/li&gt;
+                            &lt;li&gt;hsb(&#8226;&#8226;&#8226;, &#8226;&#8226;&#8226;, &#8226;&#8226;&#8226;) &#8212; hue, saturation and brightness values: (&#8220;hsb(0.5, 0.25, 1)&#8221;)&lt;/li&gt;
+                            &lt;li&gt;hsb(&#8226;&#8226;&#8226;%, &#8226;&#8226;&#8226;%, &#8226;&#8226;&#8226;%) &#8212; same as above, but in %&lt;/li&gt;
+                            &lt;li&gt;hsl(&#8226;&#8226;&#8226;, &#8226;&#8226;&#8226;, &#8226;&#8226;&#8226;) &#8212; same as hsb&lt;/li&gt;
+                            &lt;li&gt;hsl(&#8226;&#8226;&#8226;%, &#8226;&#8226;&#8226;%, &#8226;&#8226;&#8226;%) &#8212; same as hsb&lt;/li&gt;
+                        &lt;/ul&gt;
                         &lt;h4&gt;Usage&lt;/h4&gt;
-                        &lt;pre class=&quot;javascript code&quot;&gt;&lt;code&gt;var c = paper.path({stroke: &quot;#036&quot;}).moveTo(10, 10).curveTo(10, 15, 45, 45, 50, 50);&lt;/code&gt;&lt;/pre&gt;
-                        &lt;h3 id=&quot;qcurveTo&quot;&gt;
-                            qcurveTo
+                        &lt;pre class=&quot;javascript code&quot;&gt;&lt;code&gt;paper.circle(100, 100, 20).attr({fill: &quot;hsb(1, 255, 200)&quot;, stroke: &quot;red&quot;});&lt;/code&gt;&lt;/pre&gt;
+                        &lt;h3 id=&quot;safari&quot;&gt;
+                            safari
                         &lt;/h3&gt;
                         &lt;p&gt;
-                            Draws a quadratic curve to the given coordinates.
+                            There is an inconvenient rendering bug is Safari (WebKit): sometimes the rendering should be forced. This method should help with dealing with this bug.
                         &lt;/p&gt;
-                        &lt;h4&gt;Parameters&lt;/h4&gt;
-                        &lt;ol&gt;
-                            &lt;li&gt;x1 &lt;em&gt;number&lt;/em&gt;&lt;/li&gt;
-                            &lt;li&gt;y1 &lt;em&gt;number&lt;/em&gt;&lt;/li&gt;
-                            &lt;li&gt;x2 &lt;em&gt;number&lt;/em&gt;&lt;/li&gt;
-                            &lt;li&gt;y2 &lt;em&gt;number&lt;/em&gt;&lt;/li&gt;
-                        &lt;/ol&gt;
                         &lt;h4&gt;Usage&lt;/h4&gt;
-                        &lt;pre class=&quot;javascript code&quot;&gt;&lt;code&gt;var c = paper.path({stroke: &quot;#036&quot;}).moveTo(10, 10).curveTo(10, 15, 45, 45, 50, 50);&lt;/code&gt;&lt;/pre&gt;
-                        &lt;h3 id=&quot;addRoundedCorner&quot;&gt;
-                            addRoundedCorner
-                        &lt;/h3&gt;
-                        &lt;p&gt;
-                            Draws a quarter of a circle from the current drawing point.
-                        &lt;/p&gt;
-                        &lt;h4&gt;Parameters&lt;/h4&gt;
-                        &lt;ol&gt;
-                            &lt;li&gt;r &lt;em&gt;number&lt;/em&gt;&lt;/li&gt;
-                            &lt;li&gt;dir &lt;em&gt;string&lt;/em&gt; Two-letter directional instruction, as described below.&lt;/li&gt;
-                        &lt;/ol&gt;
-                        &lt;h4&gt;Possible &lt;code&gt;dir&lt;/code&gt; values&lt;/h4&gt;
-                        &lt;dl&gt;
-                            &lt;dt&gt;lu&lt;/dt&gt;
-                            &lt;dd&gt;left up&lt;/dd&gt;
-                            &lt;dt&gt;ld&lt;/dt&gt;
-                            &lt;dd&gt;left down&lt;/dd&gt;
-                            &lt;dt&gt;ru&lt;/dt&gt;
-                            &lt;dd&gt;right up&lt;/dd&gt;
-                            &lt;dt&gt;rd&lt;/dt&gt;
-                            &lt;dd&gt;right down&lt;/dd&gt;
-                            &lt;dt&gt;ur&lt;/dt&gt;
-                            &lt;dd&gt;up right&lt;/dd&gt;
-                            &lt;dt&gt;ul&lt;/dt&gt;
-                            &lt;dd&gt;up left&lt;/dd&gt;
-                            &lt;dt&gt;dr&lt;/dt&gt;
-                            &lt;dd&gt;down right&lt;/dd&gt;
-                            &lt;dt&gt;dl&lt;/dt&gt;
-                            &lt;dd&gt;down left&lt;/dd&gt;
-                        &lt;/dl&gt;
-                        &lt;h4&gt;Usage&lt;/h4&gt;
-                        &lt;pre class=&quot;javascript code&quot;&gt;&lt;code&gt;var c = paper.path({stroke: &quot;#036&quot;}).moveTo(10, 10).addRoundedCorner(10, &quot;rd&quot;);&lt;/code&gt;&lt;/pre&gt;
-                        &lt;h3 id=&quot;andClose&quot;&gt;
-                            andClose
-                        &lt;/h3&gt;
-                        &lt;p&gt;
-                            Closes the path being drawn.
-                        &lt;/p&gt;
-                        &lt;h4&gt;Usage&lt;/h4&gt;
-                        &lt;pre class=&quot;javascript code&quot;&gt;&lt;code&gt;var c = paper.path({stroke: &quot;#036&quot;}).moveTo(10, 10).andClose();&lt;/code&gt;&lt;/pre&gt;
-                        &lt;h3 id=&quot;setSize&quot;&gt;
-                            setSize
-                        &lt;/h3&gt;
-                        &lt;p&gt;
-                            If you need to change dimensions of the canvas call this method
-                        &lt;/p&gt;
-                        &lt;h4&gt;Parameters&lt;/h4&gt;
-                        &lt;ol&gt;
-                            &lt;li&gt;width &lt;em&gt;number&lt;/em&gt; new width of the canvas&lt;/li&gt;
-                            &lt;li&gt;height &lt;em&gt;number&lt;/em&gt; new height of the canvas&lt;/li&gt;
-                        &lt;/ol&gt;
-                        &lt;h3 id=&quot;setWindow&quot;&gt;
-                            setWindow
-                        &lt;/h3&gt;
-                        &lt;p&gt;
-                            Should be called before main Raphael method. Sets which window should be used for drawing. Default is the current one. You need to use it if you want to draw inside &lt;code&gt;iframe&lt;/code&gt;
-                        &lt;/p&gt;
-                        &lt;h4&gt;Parameters&lt;/h4&gt;
-                        &lt;ol&gt;
-                            &lt;li&gt;window &lt;em&gt;object&lt;/em&gt;&lt;/li&gt;
-                        &lt;/ol&gt;
-                        &lt;h3 id=&quot;getColor&quot;&gt;
-                            getColor
+                        &lt;pre class=&quot;javascript code&quot;&gt;&lt;code&gt;paper.safari();&lt;/code&gt;&lt;/pre&gt;
+                        &lt;h3 id=&quot;ninja-mode&quot;&gt;
+                            &#8220;Ninja Mode&#8221;
                         &lt;/h3&gt;
                         &lt;p&gt;
-                            Returns a colour object for the next colour in spectrum
+                            If you want to leave no trace of Rapha&#235;l (Well, Rapha&#235;l creates only one global variable &lt;code&gt;Raphael&lt;/code&gt;, but anyway.) You can use &lt;code&gt;ninja&lt;/code&gt; method.
                         &lt;/p&gt;
-                        &lt;h4&gt;Parameters&lt;/h4&gt;
-                        &lt;ol&gt;
-                            &lt;li&gt;value &lt;em&gt;number&lt;/em&gt; brightness [optional]&lt;/li&gt;
-                        &lt;/ol&gt;
                         &lt;h4&gt;Usage&lt;/h4&gt;
-                        &lt;pre class=&quot;javascript code&quot;&gt;&lt;code&gt;var c = paper.path({stroke: Raphael.getColor()}, &quot;M10,10L100,100&quot;)&lt;/code&gt;&lt;/pre&gt;
-                        &lt;h3 id=&quot;getColor-reset&quot;&gt;
-                            getColor.reset
-                        &lt;/h3&gt;
-                        &lt;p&gt;
-                            Resets getColor function, so it will start from the beginning
-                        &lt;/p&gt;
+                        &lt;pre class=&quot;javascript code&quot;&gt;&lt;code&gt;(function (local_raphael) {
+    var paper = local_raphael(10, 10, 320, 200);
+    &#8230;
+})(Raphael.ninja());
+&lt;/code&gt;&lt;/pre&gt;
                     &lt;/div&gt;
                     &lt;div id=&quot;column-2&quot;&gt;
                         &lt;h2&gt;
@@ -582,6 +637,9 @@ var c = paper.path({stroke: &quot;#036&quot;}).moveTo(10, 10).lineTo(50, 50);&lt;/code&gt;&lt;/pre&gt;
                                 &lt;a href=&quot;#node&quot;&gt;&lt;code&gt;node&lt;/code&gt;&lt;/a&gt;
                             &lt;/li&gt;
                             &lt;li&gt;
+                                &lt;a href=&quot;#paper&quot;&gt;&lt;code&gt;paper&lt;/code&gt;&lt;/a&gt;
+                            &lt;/li&gt;
+                            &lt;li&gt;
                                 &lt;a href=&quot;#remove&quot;&gt;&lt;code&gt;remove&lt;/code&gt;&lt;/a&gt;
                             &lt;/li&gt;
                             &lt;li&gt;
@@ -615,6 +673,39 @@ var c = paper.path({stroke: &quot;#036&quot;}).moveTo(10, 10).lineTo(50, 50);&lt;/code&gt;&lt;/pre&gt;
                                 &lt;a href=&quot;#toBack&quot;&gt;&lt;code&gt;toBack&lt;/code&gt;&lt;/a&gt;
                             &lt;/li&gt;
                             &lt;li&gt;
+                                &lt;a href=&quot;#insertBefore&quot;&gt;&lt;code&gt;insertBefore&lt;/code&gt;&lt;/a&gt;
+                            &lt;/li&gt;
+                            &lt;li&gt;
+                                &lt;a href=&quot;#insertAfter&quot;&gt;&lt;code&gt;insertAfter&lt;/code&gt;&lt;/a&gt;
+                            &lt;/li&gt;
+                            &lt;li&gt;
+                                &lt;a href=&quot;#raphael&quot;&gt;&lt;code&gt;raphael&lt;/code&gt;&lt;/a&gt;
+                            &lt;/li&gt;
+                            &lt;li&gt;
+                                &lt;a href=&quot;#setSize&quot;&gt;&lt;code&gt;setSize&lt;/code&gt;&lt;/a&gt;
+                            &lt;/li&gt;
+                            &lt;li&gt;
+                                &lt;a href=&quot;#setWindow&quot;&gt;&lt;code&gt;setWindow&lt;/code&gt;&lt;/a&gt;
+                            &lt;/li&gt;
+                            &lt;li&gt;
+                                &lt;a href=&quot;#getRGB&quot;&gt;&lt;code&gt;getRGB&lt;/code&gt;&lt;/a&gt;
+                            &lt;/li&gt;
+                            &lt;li&gt;
+                                &lt;a href=&quot;#getColor&quot;&gt;&lt;code&gt;getColor&lt;/code&gt;&lt;/a&gt;
+                            &lt;/li&gt;
+                            &lt;li&gt;
+                                &lt;a href=&quot;#getColor-reset&quot;&gt;&lt;code&gt;getColor.reset&lt;/code&gt;&lt;/a&gt;
+                            &lt;/li&gt;
+                            &lt;li&gt;
+                                &lt;a href=&quot;#registerFont&quot;&gt;&lt;code&gt;registerFont&lt;/code&gt;&lt;/a&gt;
+                            &lt;/li&gt;
+                            &lt;li&gt;
+                                &lt;a href=&quot;#getFont&quot;&gt;&lt;code&gt;getFont&lt;/code&gt;&lt;/a&gt;
+                            &lt;/li&gt;
+                            &lt;li&gt;
+                                &lt;a href=&quot;#print&quot;&gt;&lt;code&gt;print&lt;/code&gt;&lt;/a&gt;
+                            &lt;/li&gt;
+                            &lt;li&gt;
                                 &lt;a href=&quot;#circle&quot;&gt;&lt;code&gt;circle&lt;/code&gt;&lt;/a&gt;
                             &lt;/li&gt;
                             &lt;li&gt;
@@ -634,53 +725,27 @@ var c = paper.path({stroke: &quot;#036&quot;}).moveTo(10, 10).lineTo(50, 50);&lt;/code&gt;&lt;/pre&gt;
                             &lt;/li&gt;
                             &lt;li&gt;
                                 &lt;a href=&quot;#path&quot;&gt;&lt;code&gt;path&lt;/code&gt;&lt;/a&gt;
-                                &lt;ul&gt;
-                                    &lt;li&gt;
-                                        &lt;a href=&quot;#absolutely&quot;&gt;&lt;code&gt;absolutely&lt;/code&gt;&lt;/a&gt;
-                                    &lt;/li&gt;
-                                    &lt;li&gt;
-                                        &lt;a href=&quot;#relatively&quot;&gt;&lt;code&gt;relatively&lt;/code&gt;&lt;/a&gt;
-                                    &lt;/li&gt;
-                                    &lt;li&gt;
-                                        &lt;a href=&quot;#moveTo&quot;&gt;&lt;code&gt;moveTo&lt;/code&gt;&lt;/a&gt;
-                                    &lt;/li&gt;
-                                    &lt;li&gt;
-                                        &lt;a href=&quot;#lineTo&quot;&gt;&lt;code&gt;lineTo&lt;/code&gt;&lt;/a&gt;
-                                    &lt;/li&gt;
-                                    &lt;li&gt;
-                                        &lt;a href=&quot;#cplineTo&quot;&gt;&lt;code&gt;cplineTo&lt;/code&gt;&lt;/a&gt;
-                                    &lt;/li&gt;
-                                    &lt;li&gt;
-                                        &lt;a href=&quot;#curveTo&quot;&gt;&lt;code&gt;curveTo&lt;/code&gt;&lt;/a&gt;
-                                    &lt;/li&gt;
-                                    &lt;li&gt;
-                                        &lt;a href=&quot;#qcurveTo&quot;&gt;&lt;code&gt;qcurveTo&lt;/code&gt;&lt;/a&gt;
-                                    &lt;/li&gt;
-                                    &lt;li&gt;
-                                        &lt;a href=&quot;#addRoundedCorner&quot;&gt;&lt;code&gt;addRoundedCorner&lt;/code&gt;&lt;/a&gt;
-                                    &lt;/li&gt;
-                                    &lt;li&gt;
-                                        &lt;a href=&quot;#andClose&quot;&gt;&lt;code&gt;andClose&lt;/code&gt;&lt;/a&gt;
-                                    &lt;/li&gt;
-                                &lt;/ul&gt;
                             &lt;/li&gt;
                             &lt;li&gt;
-                                &lt;a href=&quot;#setSize&quot;&gt;&lt;code&gt;setSize&lt;/code&gt;&lt;/a&gt;
+                                &lt;a href=&quot;#plugins-canvas&quot;&gt;Adding your own methods to canvas&lt;/a&gt;
                             &lt;/li&gt;
                             &lt;li&gt;
-                                &lt;a href=&quot;#setWindow&quot;&gt;&lt;code&gt;setWindow&lt;/code&gt;&lt;/a&gt;
+                                &lt;a href=&quot;#plugins-elements&quot;&gt;Adding your own methods to elements&lt;/a&gt;
                             &lt;/li&gt;
                             &lt;li&gt;
-                                &lt;a href=&quot;#getColor&quot;&gt;&lt;code&gt;getColor&lt;/code&gt;&lt;/a&gt;
+                                &lt;a href=&quot;#colour&quot;&gt;Supported colour formats&lt;/a&gt;
                             &lt;/li&gt;
                             &lt;li&gt;
-                                &lt;a href=&quot;#getColor-reset&quot;&gt;&lt;code&gt;getColor.reset&lt;/code&gt;&lt;/a&gt;
+                                &lt;a href=&quot;#safari&quot;&gt;safari&lt;/a&gt;
+                            &lt;/li&gt;
+                            &lt;li&gt;
+                                &lt;a href=&quot;#ninja-mode&quot;&gt;&#8220;Ninja Mode&#8221;&lt;/a&gt;
                             &lt;/li&gt;
                         &lt;/ul&gt;
                     &lt;/div&gt;
                     &lt;div  id=&quot;footer&quot;&gt;
                         &lt;h3 id=&quot;copyright&quot;&gt;
-                            &lt;a href=&quot;http://creativecommons.org/licenses/by-sa/3.0/&quot; title=&quot;Creative Commons Attribution-ShareAlike 3.0 Unported&quot; rel=&quot;license&quot;&gt;Some Rights Reserved&lt;/a&gt; by &lt;a href=&quot;http://dmitry.baranovskiy.com/&quot;&gt;Dmitry Baranovskiy&lt;/a&gt;
+                            &lt;a href=&quot;http://www.opensource.org/licenses/mit-license.php&quot; title=&quot;MIT License&quot; rel=&quot;license&quot;&gt;Some Rights Reserved&lt;/a&gt; by &lt;a href=&quot;http://dmitry.baranovskiy.com/&quot;&gt;Dmitry Baranovskiy&lt;/a&gt;
                         &lt;/h3&gt;
                         &lt;h3 id=&quot;font&quot;&gt;
                             Font by &lt;a href=&quot;http://www.exljbris.nl&quot;&gt;Jos Buivenga&lt;/a&gt; &#183; Logo by &lt;a href=&quot;http://wasabicube.com/&quot;&gt;Wasabicube&lt;/a&gt; &#183;
@@ -698,5 +763,6 @@ var c = paper.path({stroke: &quot;#036&quot;}).moveTo(10, 10).lineTo(50, 50);&lt;/code&gt;&lt;/pre&gt;
         var pageTracker = _gat._getTracker(&quot;UA-616618-3&quot;);
         pageTracker._trackPageview();
         &lt;/script&gt;
+        &lt;script src=&quot;http://static.woopra.com/js/woopra.js&quot; type=&quot;text/javascript&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;
     &lt;/body&gt;
 &lt;/html&gt;</diff>
      <filename>reference.html</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>869d6ce260514846c5c61ffdc2b14b47635c515c</id>
    </parent>
  </parents>
  <author>
    <name>Dmitry Baranovskiy</name>
    <email>dbaranovskiy@Fresh-Air.sydney.atlassian.com</email>
  </author>
  <url>http://github.com/DmitryBaranovskiy/raphael/commit/9ce74b94c98e4d582dbfb6912064a90db5f7ba98</url>
  <id>9ce74b94c98e4d582dbfb6912064a90db5f7ba98</id>
  <committed-date>2009-10-15T19:37:15-07:00</committed-date>
  <authored-date>2009-10-15T19:37:15-07:00</authored-date>
  <message>1.1
Fix IE rendering speed (still in progress), memory leak in caching, make it 1Kb smaller when minified.</message>
  <tree>46232c51d09aaa16c9a1372d273bd52e2b31842d</tree>
  <committer>
    <name>Dmitry Baranovskiy</name>
    <email>dbaranovskiy@Fresh-Air.sydney.atlassian.com</email>
  </committer>
</commit>
