1.1
authorDmitry Baranovskiy <dbaranovskiy@Fresh-Air.sydney.atlassian.com>
Fri, 16 Oct 2009 02:37:15 +0000 (13:37 +1100)
committerDmitry Baranovskiy <dbaranovskiy@Fresh-Air.sydney.atlassian.com>
Fri, 16 Oct 2009 02:37:15 +0000 (13:37 +1100)
Fix IE rendering speed (still in progress), memory leak in caching, make it 1Kb smaller when minified.

raphael-min.js
raphael.js
reference.html

index b4895df..66fde4a 100644 (file)
@@ -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:"Raphael" in window,is:window.Raphael},f=function(){if(f.is(arguments[0],"array")){var e=arguments[0],R=m[h](f,e.splice(0,3+f.is(e[0],"number"))),af=R.set();for(var ae=0,ag=e[C];ae<ag;ae++){var ad=e[ae]||{};ad.type in {circle:1,rect:1,path:1,ellipse:1,text:1,image:1}&&af.push(R[ad.type]().attr(ad));}return af;}return m[h](f,arguments);},b={},t={"clip-rect":"0 0 10e9 10e9",cx:0,cy:0,fill:"#fff","fill-opacity":1,font:'10px "Arial"',"font-family":'"Arial"',"font-size":"10","font-style":"normal","font-weight":400,gradient:0,height:0,href:"http://raphaeljs.com/",opacity:1,path:"M0,0",r:0,rotation:0,rx:0,ry:0,scale:"1 1",src:"",stroke:"#000","stroke-dasharray":"","stroke-linecap":"butt","stroke-linejoin":"butt","stroke-miterlimit":0,"stroke-opacity":1,"stroke-width":1,target:"_blank","text-anchor":"middle",title:"Raphael",translation:"0 0",width:0,x:0,y:0},x={"clip-rect":"csv",cx:"number",cy:"number",fill:"colour","fill-opacity":"number","font-size":"number",height:"number",opacity:"number",path:"path",r:"number",rotation:"csv",rx:"number",ry:"number",scale:"csv",stroke:"colour","stroke-opacity":"number","stroke-width":"number",translation:"csv",width:"number",x:"number",y:"number"},y=["click","dblclick","mousedown","mousemove","mouseout","mouseover","mouseup"],o="prototype",h="apply",C="length",s="parseFloat",r="parseInt";f.version="1.0";f.type=(window.SVGAngle||document.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#BasicStructure","1.1")?"SVG":"VML");f.svg=!(f.vml=f.type=="VML");f.idGenerator=0;f.fn={};f.is=function(i,e){e=(e+"").toLowerCase();if((e=="object"||e=="undefined")&&typeof i==e){return true;}if(i==null&&e=="null"){return true;}return Object[o].toString.call(i).replace(/^\[object\s+|\]$/gi,"").toLowerCase()==e;};f.setWindow=function(e){P=e;g=P.document;};f.hsb2rgb=ab(function(aj,ah,an){if(f.is(aj,"object")&&"h" in aj&&"s" in aj&&"b" 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:"#000"};}if(aj>1||ah>1||an>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="0"+e;}if(ai[C]==1){ai="0"+ai;}if(am[C]==1){am="0"+am;}al.hex="#"+e+ai+am;return al;},f);f.rgb2hsb=ab(function(e,i,ah){if(f.is(e,"object")&&"r" in e&&"g" in e&&"b" in e){ah=e.b;i=e.g;e=e.r;}if(f.is(e,"string")){var aj=f.getRGB(e);e=aj.r;i=aj.g;ah=aj.b;}if(e>1||i>1||ah>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<0){ae+=1;}if(ae>1){ae-=1;}}return{h:ae,s:ad,b:af};},f);f._path2string=function(){var ad="",ag;for(var R=0,ae=this[C];R<ae;R++){for(var e=0,af=this[R][C];e<af;e++){ad+=this[R][e];e&&e!=af-1&&(ad+=",");}R!=ae-1&&(ad+="\n");}return ad.replace(/,(?=-)/g,"");};function ab(ad,i,e){function R(){var ae=Array[o].splice.call(arguments,0,arguments[C]),af=ae.join("\u25ba");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]>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:"none",aliceblue:"#f0f8ff",amethyst:"#96c",antiquewhite:"#faebd7",aqua:"#0ff",aquamarine:"#7fffd4",azure:"#f0ffff",beige:"#f5f5dc",bisque:"#ffe4c4",black:"#000",blanchedalmond:"#ffebcd",blue:"#00f",blueviolet:"#8a2be2",brown:"#a52a2a",burlywood:"#deb887",cadetblue:"#5f9ea0",chartreuse:"#7fff00",chocolate:"#d2691e",coral:"#ff7f50",cornflowerblue:"#6495ed",cornsilk:"#fff8dc",crimson:"#dc143c",cyan:"#0ff",darkblue:"#00008b",darkcyan:"#008b8b",darkgoldenrod:"#b8860b",darkgray:"#a9a9a9",darkgreen:"#006400",darkkhaki:"#bdb76b",darkmagenta:"#8b008b",darkolivegreen:"#556b2f",darkorange:"#ff8c00",darkorchid:"#9932cc",darkred:"#8b0000",darksalmon:"#e9967a",darkseagreen:"#8fbc8f",darkslateblue:"#483d8b",darkslategray:"#2f4f4f",darkturquoise:"#00ced1",darkviolet:"#9400d3",deeppink:"#ff1493",deepskyblue:"#00bfff",dimgray:"#696969",dodgerblue:"#1e90ff",firebrick:"#b22222",floralwhite:"#fffaf0",forestgreen:"#228b22",fuchsia:"#f0f",gainsboro:"#dcdcdc",ghostwhite:"#f8f8ff",gold:"#ffd700",goldenrod:"#daa520",gray:"#808080",green:"#008000",greenyellow:"#adff2f",honeydew:"#f0fff0",hotpink:"#ff69b4",indianred:"#cd5c5c",indigo:"#4b0082",ivory:"#fffff0",khaki:"#f0e68c",lavender:"#e6e6fa",lavenderblush:"#fff0f5",lawngreen:"#7cfc00",lemonchiffon:"#fffacd",lightblue:"#add8e6",lightcoral:"#f08080",lightcyan:"#e0ffff",lightgoldenrodyellow:"#fafad2",lightgreen:"#90ee90",lightgrey:"#d3d3d3",lightpink:"#ffb6c1",lightsalmon:"#ffa07a",lightsalmon:"#ffa07a",lightseagreen:"#20b2aa",lightskyblue:"#87cefa",lightslategray:"#789",lightsteelblue:"#b0c4de",lightyellow:"#ffffe0",lime:"#0f0",limegreen:"#32cd32",linen:"#faf0e6",magenta:"#f0f",maroon:"#800000",mediumaquamarine:"#66cdaa",mediumblue:"#0000cd",mediumorchid:"#ba55d3",mediumpurple:"#9370db",mediumseagreen:"#3cb371",mediumslateblue:"#7b68ee",mediumslateblue:"#7b68ee",mediumspringgreen:"#00fa9a",mediumturquoise:"#48d1cc",mediumvioletred:"#c71585",midnightblue:"#191970",mintcream:"#f5fffa",mistyrose:"#ffe4e1",moccasin:"#ffe4b5",navajowhite:"#ffdead",navy:"#000080",oldlace:"#fdf5e6",olive:"#808000",olivedrab:"#6b8e23",orange:"#ffa500",orangered:"#ff4500",orchid:"#da70d6",palegoldenrod:"#eee8aa",palegreen:"#98fb98",paleturquoise:"#afeeee",palevioletred:"#db7093",papayawhip:"#ffefd5",peachpuff:"#ffdab9",peru:"#cd853f",pink:"#ffc0cb",plum:"#dda0dd",powderblue:"#b0e0e6",purple:"#800080",red:"#f00",rosybrown:"#bc8f8f",royalblue:"#4169e1",saddlebrown:"#8b4513",salmon:"#fa8072",sandybrown:"#f4a460",seagreen:"#2e8b57",seashell:"#fff5ee",sienna:"#a0522d",silver:"#c0c0c0",skyblue:"#87ceeb",slateblue:"#6a5acd",slategray:"#708090",snow:"#fffafa",springgreen:"#00ff7f",steelblue:"#4682b4",tan:"#d2b48c",teal:"#008080",thistle:"#d8bfd8",tomato:"#ff6347",turquoise:"#40e0d0",violet:"#ee82ee",wheat:"#f5deb3",white:"#fff",whitesmoke:"#f5f5f5",yellow:"#ff0",yellowgreen:"#9acd32"},ag;e=al[(e+"").toLowerCase()]||e;if(!e){return{r:-1,g:-1,b:-1,hex:"none",error:1};}if(e=="none"){return{r:-1,g:-1,b:-1,hex:"none"};}var R,ad,aj,ah=(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(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="replace";i=i[ae](ak,"0");af=af[ae](ak,"0");ai=ai[ae](ak,"0");ah.hex="#"+i+af+ai;ag=ah;}else{ag={r:-1,g:-1,b:-1,hex:"none",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>1){R.h=0;R.s-=0.2;if(R.s<=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,"array")&&f.is(e[0],"array")){i=w(e);}if(!i[C]){(e+"").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&&ag.push(+ai);});while(ag[C]>=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<aj;ae++){if(ak[ae][0]=="M"){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,"array")||!f.is(ag&&ag[0],"array")){ag=f.parsePathString(ag);}for(var R=0,ae=ag[C];R<ae;R++){ad[R]=[];for(var e=0,af=ag[R][C];e<af;e++){ad[R][e]=ag[R][e];}}ad.toString=f._path2string;return ad;},c=ab(function(ae){if(!f.is(ae,"array")||!f.is(ae&&ae[0],"array")){ae=f.parsePathString(ae);}var ak=[],am=0,al=0,ap=0,ao=0,ad=0;if(ae[0][0]=="M"){am=ae[0][1];al=ae[0][2];ap=am;ao=al;ad++;ak.push(["M",am,al]);}for(var ah=ad,aq=ae[C];ah<aq;ah++){var e=ak[ah]=[],an=ae[ah];if(an[0]!=an[0].toLowerCase()){e[0]=an[0].toLowerCase();switch(e[0]){case"a":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"v":e[1]=+(an[1]-al).toFixed(3);break;case"m":ap=an[1];ao=an[2];default:for(var ag=1,ai=an[C];ag<ai;ag++){e[ag]=+(an[ag]-((ag%2)?am:al)).toFixed(3);}}}else{e=ak[ah]=[];if(an[0]=="m"){ap=an[1]+am;ao=an[2]+al;}for(var af=0,R=an[C];af<R;af++){ak[ah][af]=an[af];}}var aj=ak[ah][C];switch(ak[ah][0]){case"z":am=ap;al=ao;break;case"h":am+=+ak[ah][aj-1];break;case"v":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,"array")||!f.is(ae&&ae[0],"array")){ae=f.parsePathString(ae);}var aj=[],al=0,ak=0,ao=0,an=0,ad=0;if(ae[0][0]=="M"){al=+ae[0][1];ak=+ae[0][2];ao=al;an=ak;ad++;aj[0]=["M",al,ak];}for(var ah=ad,ap=ae[C];ah<ap;ah++){var e=aj[ah]=[],am=ae[ah];if(am[0]!=(am[0]+"").toUpperCase()){e[0]=(am[0]+"").toUpperCase();switch(e[0]){case"A":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"V":e[1]=+am[1]+ak;break;case"H":e[1]=+am[1]+al;break;case"M":ao=+am[1]+al;an=+am[2]+ak;default:for(var ag=1,ai=am[C];ag<ai;ag++){e[ag]=+am[ag]+((ag%2)?al:ak);}}}else{for(var af=0,R=am[C];af<R;af++){aj[ah][af]=am[af];}}switch(e[0]){case"Z":al=ao;ak=an;break;case"H":al=e[1];break;case"V":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<au?ae-aj:aj;ai=ao<au?ae-ai:ai;aj<0&&(aj=ae*2+aj);ai<0&&(ai=ae*2+ai);if(af&&aj>ai){aj=aj-ae*2;}if(!af&&ai>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)>aw){var av=ai,ay=ao,al=aT;ai=aj+aw*(af&&ai>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(",").split(",");var aB=[];for(var aM=0,aC=aD[C];aM<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>0&&ag<1?ag:0),af=E(i,e,ad,R,aq,ap,am,aj,ae>0&&ae<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>0&&ag<1?ag:0);af=E(i,e,ad,R,aq,ap,am,aj,ae>0&&ae<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&&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["C",ar.x,ar.y,ar.x,ar.y,ar.x,ar.y];}!(aq[0] in {T:1,Q:1})&&(ar.qx=ar.qy=null);switch(aq[0]){case"M":ar.X=aq[1];ar.Y=aq[2];break;case"A":aq=["C"].concat(u[h](0,[ar.x,ar.y].concat(aq.slice(1))));break;case"S":i=ar.x+(ar.x-(ar.bx||ar.x));at=ar.y+(ar.y-(ar.by||ar.y));aq=["C",i,at].concat(aq.slice(1));break;case"T":ar.qx=ar.x+(ar.x-(ar.qx||ar.x));ar.qy=ar.y+(ar.y-(ar.qy||ar.y));aq=["C"].concat(A(ar.x,ar.y,ar.qx,ar.qy,aq[1],aq[2]));break;case"Q":ar.qx=aq[1];ar.qy=aq[2];aq=["C"].concat(A(ar.x,ar.y,aq[1],aq[2],aq[3],aq[4]));break;case"L":aq=["C"].concat(d(ar.x,ar.y,aq[1],aq[2]));break;case"H":aq=["C"].concat(d(ar.x,ar.y,aq[1],ar.y));break;case"V":aq=["C"].concat(d(ar.x,ar.y,ar.x,aq[1]));break;case"Z":aq=["C"].concat(d(ar.x,ar.y,ar.X,ar.Y));break;}return aq;},R=function(aq,ar){if(aq[ar][C]>7){aq[ar].shift();var at=aq[ar];while(at[C]){aq.splice(ar++,0,["C"].concat(at.splice(0,6)));}aq.splice(ar,1);an=Math.max(ae[C],al&&al[C]||0);}},ad=function(av,au,ar,aq,at){if(av&&au&&av[at][0]=="M"&&au[at][0]!="M"){au.splice(at,0,["M",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&&al[C]||0);}};for(var ai=0,an=Math.max(ae[C],al&&al[C]||0);ai<an;ai++){ae[ai]=ag(ae[ai],am);R(ae,ai);al&&(al[ai]=ag(al[ai],e));al&&R(al,ai);ad(ae,al,am,e,ai);ad(al,ae,e,am,ai);var ah=ae[ai],ao=al&&al[ai],af=ah[C],aj=al&&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&&(P[s](ao[aj-4])||e.x);e.by=al&&(P[s](ao[aj-3])||e.y);e.x=al&&ao[aj-2];e.y=al&&ao[aj-1];}return al?[ae,al]:ae;},null,w),p=ab(function(aj){var ai=[];for(var af=0,ak=aj[C];af<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]&&(e.offset=ah[2]+"%");ai.push(e);}for(var af=1,ak=ai[C]-1;af<ak;af++){if(!ai[af].offset){var R=P[s](ai[af-1].offset||0),ad=0;for(var ae=af+1;ae<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<ae;af++){R+=ag;ai[af].offset=R+"%";}}}return ai;}),K=function(){var R,i,ae,ad,e;if(f.is(arguments[0],"string")||f.is(arguments[0],"object")){if(f.is(arguments[0],"string")){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],"number")&&arguments[C]>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)&&!(ad in e)){switch(typeof R[ad]){case"function":(function(ae){e[ad]=e===i?ae:function(){return ae[h](i,arguments);};})(R[ad]);break;case"object":e[ad]=e[ad]||{};a.call(this,e[ad],R[ad]);break;default:e[ad]=R[ad];break;}}}};if(f.svg){b.svgns="http://www.w3.org/2000/svg";b.xlink="http://www.w3.org/1999/xlink";var S=function(e){return +e+(Math.floor(e)==e)*0.5;};var D=function(af){for(var R=0,ad=af[C];R<ad;R++){if(af[R][0].toLowerCase()!="a"){for(var e=1,ae=af[R][C];e<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"Your browser supports SVG.\nYou are running Rapha\u00ebl "+this.version;};var aa=function(e,ad){var i=F("path");ad.canvas&&ad.canvas.appendChild(i);var R=new n(i,ad);R.type="path";J(R,{fill:"none",stroke:"#000",path:e});return R;};var Q=function(ad,an,e){var ak="linear",ah=0.5,af=0.5,ap=ad.style;an=(an+"").replace(/^r(?:\(([^,]+?)\s*,\s*([^\)]+?)\))?/,function(aq,i,ar){ak="radial";if(i&&ar){ah=P[s](i);af=P[s](ar);if(Math.pow(ah-0.5,2)+Math.pow(af-0.5,2)>0.25){af=Math.sqrt(0.25-Math.pow(ah-0.5,2))+0.5;}}return"";});an=an.split(/\s*\-\s*/);if(ak=="linear"){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]<0){ae[0]=-ae[2];ae[2]=0;}if(ae[3]<0){ae[1]=-ae[3];ae[3]=0;}}var aj=p(an);if(!aj){return null;}var R=F(ak+"Gradient");R.id="r"+(f.idGenerator++).toString(36);ak=="radial"?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<ao;ai++){var al=F("stop");F(al,{offset:aj[ai].offset?aj[ai].offset:!ai?"0%":"100%","stop-color":aj[ai].color||"#fff"});R.appendChild(al);}F(ad,{fill:"url(#"+R.id+")",opacity:1,"fill-opacity":1});ap.fill="";ap.opacity=1;ap.fillOpacity=1;return 1;};var v=function(i){var e=i.getBBox();F(i.pattern,{patternTransform:f.format("translate({0},{1})",e.x,e.y)});};var J=function(al,av){var ao={"":[0],none:[0],"-":[3,1],".":[1,1],"-.":[3,1,1,1],"-..":[3,1,1,1,1,1],". ":[1,3],"- ":[4,3],"--":[8,3],"- .":[4,3,1,3],"--.":[8,3,1,3],"--..":[8,3,1,3,1,3]},aq=al.node,am=al.attrs,ai=al.attr("rotation"),af=function(aC,aB){aB=ao[(aB+"").toLowerCase()];if(aB){var az=aC.attrs["stroke-width"]||"1",ax={round:az,square:az,butt:0}[aC.attrs["stroke-linecap"]||av["stroke-linecap"]]||0,aA=[];var ay=aB[C];while(ay--){aA[ay]=aB[ay]*az+((ay%2)?1:-1)*ax;}F(aq,{"stroke-dasharray":aA.join(",")});}};P[s](ai)&&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"href":case"title":case"target":var at=aq.parentNode;if(at.tagName.toLowerCase()!="a"){var ad=F("a");at.insertBefore(ad,aq);ad.appendChild(aq);at=ad;}at.setAttributeNS(al.paper.xlink,ap,an);break;case"clip-rect":var i=(an+"").split(ac);if(i[C]==4){al.clip&&al.clip.parentNode.parentNode.removeChild(al.clip.parentNode);var R=F("clipPath"),ar=F("rect");R.id="r"+(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,{"clip-path":"url(#"+R.id+")"});al.clip=ar;}if(!an){var au=g.getElementById(aq.getAttribute("clip-path").replace(/(^url\(#|\)$)/g,""));au&&au.parentNode.removeChild(au);F(aq,{"clip-path":""});delete al.clip;}break;case"path":if(an&&al.type=="path"){am.path=D(z(an));F(aq,{d:am.path});}break;case"width":aq.setAttribute(ap,an);if(am.fx){ap="x";an=am.x;}else{break;}case"x":if(am.fx){an=-am.x-(am.width||0);}case"rx":if(ap=="rx"&&al.type=="rect"){break;}case"cx":aq.setAttribute(ap,an);al.pattern&&v(al);break;case"height":aq.setAttribute(ap,an);if(am.fy){ap="y";an=am.y;}else{break;}case"y":if(am.fy){an=-am.y-(am.height||0);}case"ry":if(ap=="ry"&&al.type=="rect"){break;}case"cy":aq.setAttribute(ap,an);al.pattern&&v(al);break;case"r":if(al.type=="rect"){F(aq,{rx:an,ry:an});}else{aq.setAttribute(ap,an);}break;case"src":if(al.type=="image"){aq.setAttributeNS(al.paper.xlink,"href",an);}break;case"stroke-width":aq.style.strokeWidth=an;aq.setAttribute(ap,an);if(am["stroke-dasharray"]){af(al,am["stroke-dasharray"]);}break;case"stroke-dasharray":af(al,an);break;case"rotation":ai=an;al.rotate(an,true);break;case"translation":var ag=(an+"").split(ac);al.translate((+ag[0]+1||2)-1,(+ag[1]+1||2)-1);break;case"scale":var ag=(an+"").split(ac);al.scale(+ag[0]||1,+ag[1]||+ag[0]||1,+ag[2]||null,+ag[3]||null);break;case"fill":var ae=(an+"").match(/^url\(['"]?([^\)]+)['"]?\)$/i);if(ae){var R=F("pattern"),ak=F("image");R.id="r"+(f.idGenerator++).toString(36);F(R,{x:0,y:0,patternUnits:"userSpaceOnUse"});F(ak,{x:0,y:0});ak.setAttributeNS(al.paper.xlink,"href",ae[1]);R.appendChild(ak);var aw=g.createElement("img");aw.style.cssText="position:absolute;left:-9999em;top-9999em";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="url(#"+R.id+")";F(aq,{fill:"url(#"+R.id+")"});al.pattern=R;al.pattern&&v(al);break;}if(!f.getRGB(an).error){delete av.gradient;delete am.gradient;if(!f.is(am.opacity,"undefined")&&f.is(av.opacity,"undefined")){aq.style.opacity=am.opacity;F(aq,{opacity:am.opacity});}if(!f.is(am["fill-opacity"],"undefined")&&f.is(av["fill-opacity"],"undefined")){aq.style.fillOpacity=am["fill-opacity"];F(aq,{"fill-opacity":am["fill-opacity"]});}}else{if((al.type in {circle:1,ellipse:1}||(an+"").charAt(0)!="r")&&Q(aq,an,al.paper)){am.gradient=an;am.fill="none";break;}}case"stroke":aq.style[ap]=f.getRGB(an).hex;aq.setAttribute(ap,f.getRGB(an).hex);break;case"gradient":(al.type in {circle:1,ellipse:1}||(an+"").charAt(0)!="r")&&Q(aq,an,al.paper);break;case"opacity":case"fill-opacity":if(am.gradient){var e=g.getElementById(aq.getAttribute("fill").replace(/^url\(#|\)$/g,""));if(e){var ah=e.getElementsByTagName("stop");ah[ah[C]-1].setAttribute("stop-opacity",an);}break;}default:ap=="font-size"&&(an=P[r](an,10)+"px");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)&&al.rotate(ai,true);};var O=1.2;var X=function(e,ae){if(e.type!="text"||!("text" in ae||"font" in ae||"font-size" in ae||"x" in ae||"y" in ae)){return;}var aj=e.attrs,R=e.node,al=R.firstChild?P[r](g.defaultView.getComputedStyle(R.firstChild,"").getPropertyValue("font-size"),10):10;if("text" in ae){while(R.firstChild){R.removeChild(R.firstChild);}var ad=(ae.text+"").split("\n");for(var af=0,ak=ad[C];af<ak;af++){var ah=F("tspan");af&&F(ah,{dy:al*O,x:aj.x});ah.appendChild(g.createTextNode(ad[af]));R.appendChild(ah);}}else{var ad=R.getElementsByTagName("tspan");for(var af=0,ak=ad[C];af<ak;af++){af&&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&&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(" ");}return this._.rt.deg;}var R=this.getBBox();i=(i+"").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)&&(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("rotate({0} {1} {2})",this._.rt.deg,e,ad);this.clip&&F(this.clip,{transform:f.format("rotate({0} {1} {2})",-this._.rt.deg,e,ad)});}else{this.transformations[0]="";this.clip&&F(this.clip,{transform:""});}F(this.node,{transform:this.transformations.join(" ")});return this;};n[o].hide=function(){this.node.style.display="none";return this;};n[o].show=function(){this.node.style.display="block";return this;};n[o].remove=function(){this.node.parentNode.removeChild(this.node);};n[o].getBBox=function(){if(this.type=="path"){return H(this.attrs.path);}if(this.node.style.display=="none"){this.show();var ad=true;}var ah={};try{ah=this.node.getBBox();}catch(af){}finally{ah=ah||{};}if(this.type=="text"){ah={x:ah.x,y:Infinity,width:ah.width,height:0};for(var R=0,ae=this.node.getNumberOfChars();R<ae;R++){var ag=this.node.getExtentOfChar(R);(ag.y<ah.y)&&(ah.y=ag.y);(ag.y+ag.height-ah.y>ah.height)&&(ah.height=ag.y+ag.height-ah.y);}}ad&&this.hide();return ah;};n[o].attr=function(){if(arguments[C]==1&&f.is(arguments[0],"string")){if(arguments[0]=="translation"){return this.translate();}if(arguments[0]=="rotation"){return this.rotate();}if(arguments[0]=="scale"){return this.scale();}return this.attrs[arguments[0]];}if(arguments[C]==1&&f.is(arguments[0],"array")){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&&f.is(arguments[0],"object")){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("circle");i.canvas&&i.canvas.appendChild(ad);var R=new n(ad,i);R.attrs={cx:e,cy:af,r:ae,fill:"none",stroke:"#000"};R.type="circle";F(ad,R.attrs);return R;};var M=function(R,e,ah,i,af,ag){e=S(e);ah=S(ah);var ae=F("rect");R.canvas&&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:"none",stroke:"#000"};ad.type="rect";F(ae,ad.attrs);return ad;};var j=function(i,e,ag,af,ae){e=S(e);ag=S(ag);var ad=F("ellipse");i.canvas&&i.canvas.appendChild(ad);var R=new n(ad,i);R.attrs={cx:e,cy:ag,rx:af,ry:ae,fill:"none",stroke:"#000"};R.type="ellipse";F(ad,R.attrs);return R;};var q=function(R,ag,e,ah,i,af){var ae=F("image");F(ae,{x:e,y:ah,width:i,height:af,preserveAspectRatio:"none"});ae.setAttributeNS(R.xlink,"href",ag);R.canvas&&R.canvas.appendChild(ae);var ad=new n(ae,R);ad.attrs={x:e,y:ah,width:i,height:af,src:ag};ad.type="image";return ad;};var L=function(i,e,af,ae){var ad=F("text");F(ad,{x:e,y:af,"text-anchor":"middle"});i.canvas&&i.canvas.appendChild(ad);var R=new n(ad,i);R.attrs={x:e,y:af,"text-anchor":"middle",text:ae,font:t.font,stroke:"none",fill:"#000"};R.type="text";J(R,R.attrs);return R;};var I=function(i,e){this.width=i||this.width;this.height=e||this.height;this.canvas.setAttribute("width",this.width);this.canvas.setAttribute("height",this.height);return this;};var m=function(){var ae=K[h](null,arguments),R=ae&&ae.container,ag=ae.x,af=ae.y,ad=ae.width,ah=ae.height;if(!R){throw new Error("SVG container not found.");}b.canvas=F("svg");var e=b.canvas,ai=e.style;e.setAttribute("width",ad||512);b.width=ad||512;e.setAttribute("height",ah||342);b.height=ah||342;if(R==1){g.body.appendChild(e);ai.position="absolute";ai.left=ag+"px";ai.top=af+"px";}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("desc");this.defs=F("defs");this.desc.appendChild(g.createTextNode("Created with Rapha\u00ebl"));this.canvas.appendChild(this.desc);this.canvas.appendChild(this.defs);}};for(var i in b){if(b.hasOwnProperty(i)){if(i!="create"){R[i]=b[i];}}}a.call(R,R,f.fn);R.clear();R.raphael=f;return R;};b.remove=function(){this.canvas.parentNode&&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<ad;R++){ae[R][0]=(ae[R][0]+"").toLowerCase();ae[R][0]=="z"&&(ae[R][0]="x");for(var e=1,af=ae[R][C];e<af;e++){ae[R][e]=~~(ae[R][e]+0.5);}}return(ae+"");};f.toString=function(){return"Your browser doesn\u2019t support SVG. Assuming it is Internet Explorer and falling down to VML.\nYou are running Rapha\u00ebl "+this.version;};var aa=function(e,af){var ad=Z("group"),ag=ad.style;ag.position="absolute";ag.left=0;ag.top=0;ag.width=af.width+"px";ag.height=af.height+"px";ad.coordsize=af.coordsize;ad.coordorigin=af.coordorigin;var R=Z("shape"),i=R.style;i.width=af.width+"px";i.height=af.height+"px";R.path="";R.coordsize=this.coordsize;R.coordorigin=this.coordorigin;ad.appendChild(R);var ae=new n(R,ad,af);ae.isAbsolute=true;ae.type="path";ae.path=[];ae.Path="";if(e){ae.attrs.path=f.parsePathString(e);ae.node.path=B(ae.attrs.path);}J(ae,{fill:"none",stroke:"#000"});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&&(al.href=an.href);an.title&&(al.title=an.title);an.target&&(al.target=an.target);if(an.path&&aj.type=="path"){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+"").split(ac);aj.translate(ad[0],ad[1]);}if(an.scale){ad=(an.scale+"").split(ac);aj.scale(+ad[0]||1,+ad[1]||+ad[0]||1,+ad[2]||null,+ad[3]||null);}if("clip-rect" in an){var e=(an["clip-rect"]+"").split(ac);if(e[C]==4){e[2]=+e[2]+(+e[0]);e[3]=+e[3]+(+e[1]);var ai=al.clipRect||g.createElement("div"),ar=ai.style,af=al.parentNode;ar.clip=f.format("rect({1}px {2}px {3}px {0}px)",e);if(!al.clipRect){ar.position="absolute";ar.top=0;ar.left=0;ar.width=aj.paper.width+"px";ar.height=aj.paper.height+"px";af.parentNode.insertBefore(ai,af);ai.appendChild(af);al.clipRect=ai;}}if(!an["clip-rect"]){al.clipRect&&(al.clipRect.style.clip="");}}if(aj.type=="image"&&an.src){al.src=an.src;}if(aj.type=="image"&&an.opacity){al.filterOpacity=" progid:DXImageTransform.Microsoft.Alpha(opacity="+(an.opacity*100)+")";ag.filter=(al.filterMatrix||"")+(al.filterOpacity||"");}an.font&&(ag.font=an.font);an["font-family"]&&(ag.fontFamily='"'+an["font-family"].split(",")[0].replace(/^['"]+|['"]+$/g,"")+'"');an["font-size"]&&(ag.fontSize=an["font-size"]);an["font-weight"]&&(ag.fontWeight=an["font-weight"]);an["font-style"]&&(ag.fontStyle=an["font-style"]);if(an.opacity!=null||an["stroke-width"]!=null||an.fill!=null||an.stroke!=null||an["stroke-width"]!=null||an["stroke-opacity"]!=null||an["fill-opacity"]!=null||an["stroke-dasharray"]!=null||an["stroke-miterlimit"]!=null||an["stroke-linejoin"]!=null||an["stroke-linecap"]!=null){al=aj.shape||al;var am=(al.getElementsByTagName("fill")&&al.getElementsByTagName("fill")[0]),ap=false;!am&&(ap=am=Z("fill"));if("fill-opacity" in an||"opacity" in an){var i=((+ao["fill-opacity"]+1||2)-1)*((+ao.opacity+1||2)-1);i<0&&(i=0);i>1&&(i=1);am.opacity=i;}an.fill&&(am.on=true);if(am.on==null||an.fill=="none"){am.on=false;}if(am.on&&an.fill){var R=an.fill.match(/^url\(([^\)]+)\)$/i);if(R){am.src=R[1];am.type="tile";}else{am.color=f.getRGB(an.fill).hex;am.src="";am.type="solid";if(f.getRGB(an.fill).error&&(at.type in {circle:1,ellipse:1}||(an.fill+"").charAt(0)!="r")&&Q(at,an.fill)){ao.fill="none";ao.gradient=an.fill;}}}ap&&al.appendChild(am);var ae=(al.getElementsByTagName("stroke")&&al.getElementsByTagName("stroke")[0]),aq=false;!ae&&(aq=ae=Z("stroke"));if((an.stroke&&an.stroke!="none")||an["stroke-width"]||an["stroke-opacity"]!=null||an["stroke-dasharray"]||an["stroke-miterlimit"]||an["stroke-linejoin"]||an["stroke-linecap"]){ae.on=true;}(an.stroke=="none"||ae.on==null||an.stroke==0||an["stroke-width"]==0)&&(ae.on=false);ae.on&&an.stroke&&(ae.color=f.getRGB(an.stroke).hex);var i=((+ao["stroke-opacity"]+1||2)-1)*((+ao.opacity+1||2)-1);i<0&&(i=0);i>1&&(i=1);ae.opacity=i;an["stroke-linejoin"]&&(ae.joinstyle=an["stroke-linejoin"]||"miter");ae.miterlimit=an["stroke-miterlimit"]||8;an["stroke-linecap"]&&(ae.endcap={butt:"flat",square:"square",round:"round"}[an["stroke-linecap"]]||"miter");an["stroke-width"]&&(ae.weight=(P[s](an["stroke-width"])||1)*12/16);if(an["stroke-dasharray"]){var ak={"-":"shortdash",".":"shortdot","-.":"shortdashdot","-..":"shortdashdotdot",". ":"dot","- ":"dash","--":"longdash","- .":"dashdot","--.":"longdashdot","--..":"longdashdotdot"};ae.dashstyle=ak[an["stroke-dasharray"]]||"";}aq&&al.appendChild(ae);}if(at.type=="text"){var ag=at.paper.span.style;ao.font&&(ag.font=ao.font);ao["font-family"]&&(ag.fontFamily=ao["font-family"]);ao["font-size"]&&(ag.fontSize=ao["font-size"]);ao["font-weight"]&&(ag.fontWeight=ao["font-weight"]);ao["font-style"]&&(ag.fontStyle=ao["font-style"]);at.node.string&&(at.paper.span.innerHTML=at.node.string.replace(/</g,"&#60;").replace(/&/g,"&#38;").replace(/\n/g,"<br>"));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["text-anchor"]){case"start":at.node.style["v-text-align"]="left";at.bbx=~~(at.W/2+0.5);break;case"end":at.node.style["v-text-align"]="right";at.bbx=-~~(at.W/2+0.5);break;default:at.node.style["v-text-align"]="center";break;}}};var Q=function(e,ah){e.attrs=e.attrs||{};var ai=e.attrs,ak=e.node.getElementsByTagName("fill"),af="linear",ag=".5 .5";e.attrs.gradient=ah;ah=(ah+"").replace(/^r(?:\(([^,]+?)\s*,\s*([^\)]+?)\))?/,function(am,an,i){af="radial";if(an&&i){an=P[s](an);i=P[s](i);if(Math.pow(an-0.5,2)+Math.pow(i-0.5,2)>0.25){i=Math.sqrt(0.25-Math.pow(an-0.5,2))+0.5;}ag=an+" "+i;}return"";});ah=ah.split(/\s*\-\s*/);if(af=="linear"){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("fill");if(ae[C]){ak.on=true;ak.method="none";ak.type=(af=="radial")?"gradientradial":"gradient";ak.color=ae[0].color;ak.color2=ae[ae[C]-1].color;var al=[];for(var ad=0,aj=ae[C];ad<aj;ad++){ae[ad].offset&&al.push(ae[ad].offset+" "+ae[ad].color);}if(al[C]&&ak.colors){ak.colors.value=al.join(",");}else{ak.colors.value="0% "+ak.color;}if(af=="radial"){ak.focus="100%";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(" ");}return this._.rt.deg;}i=(i+"").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&&(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&&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"circle":ao=al.cx-al.r;an=al.cy-al.r;ap=ak=al.r*2;break;case"ellipse":ao=al.cx-al.rx;an=al.cy-al.ry;ap=al.rx*2;ak=al.ry*2;break;case"rect":case"image":ao=al.x;an=al.y;ap=al.width||0;ak=al.height||0;break;case"text":this.textpath.v=["m",~~(al.x+0.5),", ",~~(al.y-2+0.5),"l",~~(al.x+0.5)+1,", ",~~(al.y-2+0.5)].join("");ao=al.x-~~(this.W/2+0.5);an=al.y-this.H/2;ap=this.W;ak=this.H;break;case"path":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=="path"||this.type=="text"){(R.left!=ad+"px")&&(R.left=ad+"px");(R.top!=am+"px")&&(R.top=am+"px");this.X=this.type=="text"?ao:-ad;this.Y=this.type=="text"?an:-am;this.W=ap;this.H=ak;(ah.left!=-ad+"px")&&(ah.left=-ad+"px");(ah.top!=-am+"px")&&(ah.top=-am+"px");}else{(R.left!=ad+"px")&&(R.left=ad+"px");(R.top!=am+"px")&&(R.top=am+"px");this.X=ao;this.Y=an;this.W=ap;this.H=ak;(R.width!=this.paper.width+"px")&&(R.width=this.paper.width+"px");(R.height!=this.paper.height+"px")&&(R.height=this.paper.height+"px");(ah.left!=ao-ad+"px")&&(ah.left=ao-ad+"px");(ah.top!=an-am+"px")&&(ah.top=an-am+"px");(ah.width!=ap+"px")&&(ah.width=ap+"px");(ah.height!=ak+"px")&&(ah.height=ak+"px");var aq=(+af.r||0)/(Math.min(ap,ak));if(this.type=="rect"&&this.arcsize!=aq&&(aq||this.arcsize)){var e=Z(aq?"roundrect":"rect");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="none";return this;};n[o].show=function(){this.Group.style.display="block";return this;};n[o].getBBox=function(){if(this.type=="path"){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&&this.shape.parentNode.removeChild(this.shape);};n[o].attr=function(){if(arguments[C]==1&&f.is(arguments[0],"string")){if(arguments[0]=="translation"){return this.translate();}if(arguments[0]=="rotation"){return this.rotate();}if(arguments[0]=="scale"){return this.scale();}return this.attrs[arguments[0]];}if(this.attrs&&arguments[C]==1&&f.is(arguments[0],"array")){var e={};for(var R=0,ad=arguments[0][C];R<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&&f.is(arguments[0],"object")){ae=arguments[0];}if(ae){if(ae.gradient&&(this.type in {circle:1,ellipse:1}||(ae.gradient+"").charAt(0)!="r")){Q(this,ae.gradient);}if(ae.text&&this.type=="text"){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("group"),ag=Z("oval"),R=ag.style;ae.style.cssText="position:absolute;left:0;top:0;width:"+i.width+"px;height:"+i.height+"px";ae.coordsize=i.coordsize;ae.coordorigin=i.coordorigin;ae.appendChild(ag);var ad=new n(ag,ae,i);ad.type="circle";J(ad,{stroke:"#000",fill:"none"});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("group"),R=Z(e?"roundrect":"rect"),aj=(+e||0)/(Math.min(ai,ad));R.arcsize=aj;ae.style.cssText="position:absolute;left:0;top:0;width:"+i.width+"px;height:"+i.height+"px";ae.coordsize=i.coordsize;ae.coordorigin=i.coordorigin;ae.appendChild(R);var af=new n(R,ae,i);af.type="rect";J(af,{stroke:"#000"});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("group"),ad=Z("oval"),ag=ad.style;ae.style.cssText="position:absolute;left:0;top:0;width:"+e.width+"px;height:"+e.height+"px";ae.coordsize=e.coordsize;ae.coordorigin=e.coordorigin;ae.appendChild(ad);var af=new n(ad,ae,e);af.type="ellipse";J(af,{stroke:"#000"});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("group"),R=Z("image"),ag=R.style;ae.style.cssText="position:absolute;left:0;top:0;width:"+i.width+"px;height:"+i.height+"px";ae.coordsize=i.coordsize;ae.coordorigin=i.coordorigin;R.src=e;ae.appendChild(R);var af=new n(R,ae,i);af.type="image";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("group"),ad=Z("shape"),ag=ad.style,ak=Z("path"),e=ak.style,R=Z("textpath");ae.style.cssText="position:absolute;left:0;top:0;width:"+i.width+"px;height:"+i.height+"px";ae.coordsize=i.coordsize;ae.coordorigin=i.coordorigin;ak.v=f.format("m{0},{1}l{2},{1}",~~(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="text";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:"none",fill:"#000"});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+"px";i.height=this.height+"px";i.clip="rect(0 "+this.width+"px "+this.height+"px 0)";this.coordsize=this.width+" "+this.height;return this;};g.createStyleSheet().addRule(".rvml","behavior:url(#default#VML)");try{!g.namespaces.rvml&&g.namespaces.add("rvml","urn:schemas-microsoft-com:vml");var Z=function(e){return g.createElement("<rvml:"+e+' class="rvml">');};}catch(Y){var Z=function(e){return g.createElement("<"+e+' xmlns="urn:schemas-microsoft.com:vml" class="rvml">');};}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("VML container not found.");}var af={},ag=af.canvas=g.createElement("div"),ae=ag.style;R=P[s](R)||512;aj=P[s](aj)||342;af.width=R;af.height=aj;af.coordsize=R+" "+aj;af.coordorigin="0 0";af.span=g.createElement("span");af.span.style.cssText="position:absolute;left:-9999px;top:-9999px;padding:0;margin:0;line-height:1;display:inline;";ag.appendChild(af.span);ae.cssText=f.format("width:{0}px;height:{1}px;position:absolute;clip:rect(0 {0}px {1}px 0)",R,aj);if(i==1){g.body.appendChild(ag);ae.left=ai+"px";ae.top=ah+"px";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({"Apple Computer, Inc.":1,"Google Inc.":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("on"+ad,ae);var e=function(){af.detachEvent("on"+ad,ae);return true;};if(ad=="mouseover"){af.attachEvent("onmouseenter",ae);return function(){af.detachEvent("onmouseenter",ae);return e();};}else{if(ad=="mouseout"){af.attachEvent("onmouseleave",ae);return function(){af.detachEvent("onmouseleave",ae);return e();};}}return e;};}}})();for(var V=y[C];V--;){(function(e){n[o][e]=function(i){if(f.is(i,"function")){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]["un"+e]=function(i){this.events&&this.events[e]&&this.events[e][i]&&this.events[e][i][C]&&this.events[e][i].shift()()&&!this.events[e][i][C]&&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&&!f.is(e,"string")&&!f.is(e[0],"array")&&(e+="");return aa(f.format[h](f,arguments),this);};b.image=function(ad,e,ae,i,R){return q(this,ad||"about:blank",e||0,ae||0,i||0,R||0);};b.text=function(e,R,i){return L(this,e||0,R||0,i||"");};b.set=function(e){arguments[C]>1&&(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&&an==null){return{x:this._.sx,y:this._.sy,toString:function(){return this.x+" "+this.y;}};}an=an||ao;!+an&&(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"rect":case"image":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"circle":case"ellipse":this.attr({rx:aF.rx*aE,ry:aF.ry*aD,r:aF.r*Math.min(aE,aD),cx:aH,cy:aG});break;case"path":var ay=c(aF.path),az=true;for(var aB=0,au=ay[C];aB<au;aB++){var ax=ay[aB];if(ax[0].toUpperCase()=="M"&&az){continue;}else{az=false;}if(f.svg&&ax[0].toUpperCase()=="A"){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<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}&&(ak!=1||ah!=1)){if(this.transformations){this.transformations[2]="scale(".concat(ak,",",ah,")");this.node.setAttribute("transform",this.transformations.join(" "));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=" progid:DXImageTransform.Microsoft.Matrix(M11=".concat(ak,", M12=0, M21=0, M22=",ah,", Dx=0, Dy=0, sizingmethod='auto expand', filtertype='bilinear')");aw.filter=(this.node.filterMatrix||"")+(this.node.filterOpacity||"");}}else{if(this.transformations){this.transformations[2]="";this.node.setAttribute("transform",this.transformations.join(" "));aF.fx=0;aF.fy=0;}else{this.node.filterMatrix="";aw.filter=(this.node.filterMatrix||"")+(this.node.filterOpacity||"");}}aF.scale=[ao,an,ad,R].join(" ");this._.sx=ao;this._.sy=an;}return this;};f.easing_formulas={linear:function(e){return e;},"<":function(e){return Math.pow(e,3);},">":function(e){return Math.pow(e-1,3)+1;},"<>":function(e){e=e*2;if(e<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<(1/R)){e=i*ad*ad;}else{if(ad<(2/R)){ad-=(1.5/R);e=i*ad*ad+0.75;}else{if(ad<(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,"function")||!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)&&(aq[ao]=t[ao]);R[ao]=ax[ao];switch(x[ao]){case"number":ak[ao]=(R[ao]-aq[ao])/an;break;case"colour":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"path":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<ai;at++){ak[ao][at]=[0];for(var ar=1,av=aq[ao][at][C];ar<av;ar++){ak[ao][at][ar]=(R[ao][at][ar]-aq[ao][at][ar])/an;}}break;case"csv":var e=(ax[ao]+"").split(ac),ah=(aq[ao]+"").split(ac);switch(ao){case"translation":aq[ao]=[0,0];ak[ao]=[e[0]/an,e[1]/an];break;case"rotation":aq[ao]=(ah[1]==e[1]&&ah[2]==e[2])?ah:[0,e[1],e[2]];ak[ao]=[(e[0]-aq[ao][0])/an,0,0];break;case"scale":ax[ao]=e;aq[ao]=(aq[ao]+"").split(ac);ak[ao]=[(e[0]-aq[ao][0])/an,(e[1]-aq[ao][1])/an,0,0];break;case"clip-rect":aq[ao]=(aq[ao]+"").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>255?255:i;},ag=this;(function au(){var az=new Date-ad,aH={},ay;if(az<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"number":ay=+aq[aD]+aF*an*ak[aD];break;case"colour":ay="rgb("+[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(",")+")";break;case"path":ay=[];for(var aB=0,aI=aq[aD][C];aB<aI;aB++){ay[aB]=[aq[aD][aB][0]];for(var aA=1,aC=aq[aD][aB][C];aA<aC;aA++){ay[aB][aA]=+aq[aD][aB][aA]+aF*an*ak[aD][aB][aA];}ay[aB]=ay[aB].join(" ");}ay=ay.join(" ");break;case"csv":switch(aD){case"translation":var aG=ak[aD][0]*(az-al),aE=ak[aD][1]*(az-al);aj.x+=aG;aj.y+=aE;ay=[aG,aE].join(" ");break;case"rotation":ay=+aq[aD][0]+aF*an*ak[aD][0];aq[aD][1]&&(ay+=","+aq[aD][1]+","+aq[aD][2]);break;case"scale":ay=[+aq[aD][0]+aF*an*ak[aD][0],+aq[aD][1]+aF*an*ak[aD][1],(2 in ax[aD]?ax[aD][2]:""),(3 in ax[aD]?ax[aD][3]:"")].join(" ");break;case"clip-rect":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&&b.safari();}else{(aj.x||aj.y)&&ag.translate(-aj.x,-aj.y);ag.attr(ax);clearTimeout(ag.animation_in_progress);f.svg&&b.safari();(f.is(ae,"function"))&&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"circle":case"ellipse":this.attr({cx:+e+this.attrs.cx,cy:+R+this.attrs.cy});break;case"rect":case"image":case"text":this.attr({x:+e+this.attrs.x,y:+R+this.attrs.y});break;case"path":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"Rapha\u00ebl\u2019s object";};var l=function(e){this.items=[];this[C]=0;if(e){for(var R=0,ad=e[C];R<ad;R++){if(e[R]&&(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<ad;R++){ae=arguments[R];if(ae&&(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<ad;R++){this.items[R][e][h](this.items[R],arguments);}return this;};})(W);}}l[o].attr=function(R,ag){if(R&&f.is(R,"array")&&f.is(R[0],"object")){for(var e=0,af=R[C];e<af;e++){this.items[e].attr(R[e]);}}else{for(var ad=0,ae=this.items[C];ad<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,"function")||!ai){ah=ai||null;}var e=this.items[C],ad=e,ag=this;if(ah){var ae=function(){!--e&&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["font-family"];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["units-per-em"]=P[r](i.face["units-per-em"],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&&"M"+af.d.replace(/[mlcxtrv]/g,function(ah){return{l:"L",c:"C",x:"z",t:"m",r:"l",v:"c"}[ah]||"M";})+"z"};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||"normal";R=R||"normal";aj=+aj||{normal:400,bold:700,lighter:300,bolder:800}[aj]||400;var af=f.fonts[ai];if(!af){var ad=new RegExp("(^|\\s)"+ai.replace(/[^\w\d\s+!~.:_-]/g,"")+"(\\s|$)","i");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<ak;ah++){ag=af[ah];if(ag.face["font-weight"]==aj&&(ag.face["font-style"]==R||!ag.face["font-style"])&&ag.face["font-stretch"]==ae){break;}}}return ag;};b.print=function(ak,aj,ah,R,ao){var af=this.set(),ai=(ah+"").split(""),e=0,an="",ae;f.is(R,"string")&&(R=this.getFont(R));if(R){ae=(ao||16)/R.face["units-per-em"];for(var ag=0,al=ai[C];ag<al;ag++){var ad=ag&&R.glyphs[ai[ag-1]]||{},am=R.glyphs[ai[ag]];e+=ag?(ad.w||R.w)+(ad.k&&ad.k[ai[ag]]||0):0;am&&am.d&&af.push(this.path(am.d).attr({fill:"#000",stroke:"none",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],"array")?[0].concat(arguments[1]):arguments;i&&f.is(i,"string")&&e[C]-1&&(i=i.replace(/\{(\d+)\}/g,function(ad,R){return e[++R]==null?"":e[R];}));return i||"";};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:"Raphael" in ad,is:ad.Raphael},l=function(){if(l.is(arguments[0],"array")){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<aw;au++){var R=e[au]||{};({circle:1,rect:1,path:1,ellipse:1,text:1,image:1}[h](R.type))&&av[ae](E[R.type]().attr(R));}return av;}return q[ao](l,arguments);},d={},G=["click","dblclick","mousedown","mousemove","mouseout","mouseover","mouseup"],w="",h="hasOwnProperty",v="prototype",f="setAttribute",c="appendChild",ao="apply",z="length",t="join",H="split",J="concat",ae="push",b=parseFloat,u=parseInt,L=Math.pow,V=Math.min,r=Math.max,ai=Math.round,Y=/^(?=[\da-f]$)/,ah="number",j="toString",A={"clip-rect":"0 0 10e9 10e9",cx:0,cy:0,fill:"#fff","fill-opacity":1,font:'10px "Arial"',"font-family":'"Arial"',"font-size":"10","font-style":"normal","font-weight":400,gradient:0,height:0,href:"http://raphaeljs.com/",opacity:1,path:"M0,0",r:0,rotation:0,rx:0,ry:0,scale:"1 1",src:"",stroke:"#000","stroke-dasharray":"","stroke-linecap":"butt","stroke-linejoin":"butt","stroke-miterlimit":0,"stroke-opacity":1,"stroke-width":1,target:"_blank","text-anchor":"middle",title:"Raphael",translation:"0 0",width:0,x:0,y:0},F={"clip-rect":"csv",cx:ah,cy:ah,fill:"colour","fill-opacity":ah,"font-size":ah,height:ah,opacity:ah,path:"path",r:ah,rotation:"csv",rx:ah,ry:ah,scale:"csv",stroke:"colour","stroke-opacity":ah,"stroke-width":ah,translation:"csv",width:ah,x:ah,y:ah},Q="replace";l.version="1.1";l.type=(ad.SVGAngle||m.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#BasicStructure","1.1")?"SVG":"VML");l.svg=!(l.vml=l.type=="VML");l.idGenerator=0;l.fn={};l.is=function(i,e){e=(e+w).toLowerCase();if((e=="object"||e=="undefined")&&typeof i==e){return true;}if(i==null&&e=="null"){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,"object")&&"h" in az&&"s" in az&&"b" 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:"#000"};}if(az>1||ax>1||aD>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,"0");ay=ay[Q](Y,"0");aC=aC[Q](Y,"0");aB.hex="#"+e+ay+aC;return aB;},l);l.rgb2hsb=ar(function(e,i,ax){if(l.is(e,"object")&&"r" in e&&"g" in e&&"b" in e){ax=e.b;i=e.g;e=e.r;}if(l.is(e,"string")){var az=l.getRGB(e);e=az.r;i=az.g;ax=az.b;}if(e>1||i>1||ax>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<0){au+=1;}if(au>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<au;E++){for(var e=0,av=this[E][z];e<av;e++){R+=this[E][e];e&&e!=av-1&&(R+=",");}E!=au-1&&(R+=" ");}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]("\u25ba");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]>=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:"none",aliceblue:"#f0f8ff",amethyst:"#96c",antiquewhite:"#faebd7",aqua:"#0ff",aquamarine:"#7fffd4",azure:"#f0ffff",beige:"#f5f5dc",bisque:"#ffe4c4",black:"#000",blanchedalmond:"#ffebcd",blue:"#00f",blueviolet:"#8a2be2",brown:"#a52a2a",burlywood:"#deb887",cadetblue:"#5f9ea0",chartreuse:"#7fff00",chocolate:"#d2691e",coral:"#ff7f50",cornflowerblue:"#6495ed",cornsilk:"#fff8dc",crimson:"#dc143c",cyan:"#0ff",darkblue:"#00008b",darkcyan:"#008b8b",darkgoldenrod:"#b8860b",darkgray:"#a9a9a9",darkgreen:"#006400",darkkhaki:"#bdb76b",darkmagenta:"#8b008b",darkolivegreen:"#556b2f",darkorange:"#ff8c00",darkorchid:"#9932cc",darkred:"#8b0000",darksalmon:"#e9967a",darkseagreen:"#8fbc8f",darkslateblue:"#483d8b",darkslategray:"#2f4f4f",darkturquoise:"#00ced1",darkviolet:"#9400d3",deeppink:"#ff1493",deepskyblue:"#00bfff",dimgray:"#696969",dodgerblue:"#1e90ff",firebrick:"#b22222",floralwhite:"#fffaf0",forestgreen:"#228b22",fuchsia:"#f0f",gainsboro:"#dcdcdc",ghostwhite:"#f8f8ff",gold:"#ffd700",goldenrod:"#daa520",gray:"#808080",green:"#008000",greenyellow:"#adff2f",honeydew:"#f0fff0",hotpink:"#ff69b4",indianred:"#cd5c5c",indigo:"#4b0082",ivory:"#fffff0",khaki:"#f0e68c",lavender:"#e6e6fa",lavenderblush:"#fff0f5",lawngreen:"#7cfc00",lemonchiffon:"#fffacd",lightblue:"#add8e6",lightcoral:"#f08080",lightcyan:"#e0ffff",lightgoldenrodyellow:"#fafad2",lightgreen:"#90ee90",lightgrey:"#d3d3d3",lightpink:"#ffb6c1",lightsalmon:"#ffa07a",lightsalmon:"#ffa07a",lightseagreen:"#20b2aa",lightskyblue:"#87cefa",lightslategray:"#789",lightsteelblue:"#b0c4de",lightyellow:"#ffffe0",lime:"#0f0",limegreen:"#32cd32",linen:"#faf0e6",magenta:"#f0f",maroon:"#800000",mediumaquamarine:"#66cdaa",mediumblue:"#0000cd",mediumorchid:"#ba55d3",mediumpurple:"#9370db",mediumseagreen:"#3cb371",mediumslateblue:"#7b68ee",mediumslateblue:"#7b68ee",mediumspringgreen:"#00fa9a",mediumturquoise:"#48d1cc",mediumvioletred:"#c71585",midnightblue:"#191970",mintcream:"#f5fffa",mistyrose:"#ffe4e1",moccasin:"#ffe4b5",navajowhite:"#ffdead",navy:"#000080",oldlace:"#fdf5e6",olive:"#808000",olivedrab:"#6b8e23",orange:"#ffa500",orangered:"#ff4500",orchid:"#da70d6",palegoldenrod:"#eee8aa",palegreen:"#98fb98",paleturquoise:"#afeeee",palevioletred:"#db7093",papayawhip:"#ffefd5",peachpuff:"#ffdab9",peru:"#cd853f",pink:"#ffc0cb",plum:"#dda0dd",powderblue:"#b0e0e6",purple:"#800080",red:"#f00",rosybrown:"#bc8f8f",royalblue:"#4169e1",saddlebrown:"#8b4513",salmon:"#fa8072",sandybrown:"#f4a460",seagreen:"#2e8b57",seashell:"#fff5ee",sienna:"#a0522d",silver:"#c0c0c0",skyblue:"#87ceeb",slateblue:"#6a5acd",slategray:"#708090",snow:"#fffafa",springgreen:"#00ff7f",steelblue:"#4682b4",tan:"#d2b48c",teal:"#008080",thistle:"#d8bfd8",tomato:"#ff6347",turquoise:"#40e0d0",violet:"#ee82ee",wheat:"#f5deb3",white:"#fff",whitesmoke:"#f5f5f5",yellow:"#ff0",yellowgreen:"#9acd32"},av;e=az[(e+w).toLowerCase()]||e;if(!e){return{r:-1,g:-1,b:-1,hex:"none",error:1};}if(e=="none"){return{r:-1,g:-1,b:-1,hex:"none"};}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,"0");au=au[Q](Y,"0");ax=ax[Q](Y,"0");aw.hex="#"+i+au+ax;av=aw;}else{av={r:-1,g:-1,b:-1,hex:"none",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>1){E.h=0;E.s-=0.2;if(E.s<=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,"array")&&l.is(e[0],"array")){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&&aw[ae](+ay);});while(aw[z]>=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<az;au++){if(aA[au][0]=="M"){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,"array")||!l.is(aw&&aw[0],"array")){aw=l.parsePathString(aw);}for(var E=0,au=aw[z];E<au;E++){R[E]=[];for(var e=0,av=aw[E][z];e<av;e++){R[E][e]=aw[E][e];}}R[j]=l._path2string;return R;},g=ar(function(au){if(!l.is(au,"array")||!l.is(au&&au[0],"array")){au=l.parsePathString(au);}var aA=[],aC=0,aB=0,aF=0,aE=0,R=0;if(au[0][0]=="M"){aC=au[0][1];aB=au[0][2];aF=aC;aE=aB;R++;aA[ae](["M",aC,aB]);}for(var ax=R,aG=au[z];ax<aG;ax++){var e=aA[ax]=[],aD=au[ax];if(aD[0]!=aD[0].toLowerCase()){e[0]=aD[0].toLowerCase();switch(e[0]){case"a":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"v":e[1]=+(aD[1]-aB).toFixed(3);break;case"m":aF=aD[1];aE=aD[2];default:for(var aw=1,ay=aD[z];aw<ay;aw++){e[aw]=+(aD[aw]-((aw%2)?aC:aB)).toFixed(3);}}}else{e=aA[ax]=[];if(aD[0]=="m"){aF=aD[1]+aC;aE=aD[2]+aB;}for(var av=0,E=aD[z];av<E;av++){aA[ax][av]=aD[av];}}var az=aA[ax][z];switch(aA[ax][0]){case"z":aC=aF;aB=aE;break;case"h":aC+=+aA[ax][az-1];break;case"v":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,"array")||!l.is(au&&au[0],"array")){au=l.parsePathString(au);}var az=[],aB=0,aA=0,aE=0,aD=0,R=0;if(au[0][0]=="M"){aB=+au[0][1];aA=+au[0][2];aE=aB;aD=aA;R++;az[0]=["M",aB,aA];}for(var ax=R,aF=au[z];ax<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"A":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"V":e[1]=+aC[1]+aA;break;case"H":e[1]=+aC[1]+aB;break;case"M":aE=+aC[1]+aB;aD=+aC[2]+aA;default:for(var aw=1,ay=aC[z];aw<ay;aw++){e[aw]=+aC[aw]+((aw%2)?aB:aA);}}}else{for(var av=0,E=aC[z];av<E;av++){az[ax][av]=aC[av];}}switch(e[0]){case"Z":aB=aE;aA=aD;break;case"H":aB=e[1];break;case"V":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<aJ?au-az:az;ay=aE<aJ?au-ay:ay;az<0&&(az=au*2+az);ay<0&&(ay=au*2+ay);if(av&&az>ay){az=az-au*2;}if(!av&&ay>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)>aL){var aK=ay,aN=aE,aB=a8;ay=az+aL*(av&&ay>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](",")[H](",");var aQ=[];for(var a1=0,aR=aS[z];a1<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>0&&aw<1?aw:0),av=O(i,e,R,E,aG,aF,aC,az,au>0&&au<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>0&&aw<1?aw:0);av=O(i,e,R,E,aG,aF,aC,az,au>0&&au<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&&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["C",aH.x,aH.y,aH.x,aH.y,aH.x,aH.y];}!(aG[0] in {T:1,Q:1})&&(aH.qx=aH.qy=null);switch(aG[0]){case"M":aH.X=aG[1];aH.Y=aG[2];break;case"A":aG=["C"][J](B[ao](0,[aH.x,aH.y][J](aG.slice(1))));break;case"S":i=aH.x+(aH.x-(aH.bx||aH.x));aI=aH.y+(aH.y-(aH.by||aH.y));aG=["C",i,aI][J](aG.slice(1));break;case"T":aH.qx=aH.x+(aH.x-(aH.qx||aH.x));aH.qy=aH.y+(aH.y-(aH.qy||aH.y));aG=["C"][J](K(aH.x,aH.y,aH.qx,aH.qy,aG[1],aG[2]));break;case"Q":aH.qx=aG[1];aH.qy=aG[2];aG=["C"][J](K(aH.x,aH.y,aG[1],aG[2],aG[3],aG[4]));break;case"L":aG=["C"][J](k(aH.x,aH.y,aG[1],aG[2]));break;case"H":aG=["C"][J](k(aH.x,aH.y,aG[1],aH.y));break;case"V":aG=["C"][J](k(aH.x,aH.y,aH.x,aG[1]));break;case"Z":aG=["C"][J](k(aH.x,aH.y,aH.X,aH.Y));break;}return aG;},E=function(aG,aH){if(aG[aH][z]>7){aG[aH].shift();var aI=aG[aH];while(aI[z]){aG.splice(aH++,0,["C"][J](aI.splice(0,6)));}aG.splice(aH,1);aD=r(au[z],aB&&aB[z]||0);}},R=function(aK,aJ,aH,aG,aI){if(aK&&aJ&&aK[aI][0]=="M"&&aJ[aI][0]!="M"){aJ.splice(aI,0,["M",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&&aB[z]||0);}};for(var ay=0,aD=r(au[z],aB&&aB[z]||0);ay<aD;ay++){au[ay]=aw(au[ay],aC);E(au,ay);aB&&(aB[ay]=aw(aB[ay],e));aB&&E(aB,ay);R(au,aB,aC,e,ay);R(aB,au,e,aC,ay);var ax=au[ay],aE=aB&&aB[ay],av=ax[z],az=aB&&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&&(b(aE[az-4])||e.x);e.by=aB&&(b(aE[az-3])||e.y);e.x=aB&&aE[az-2];e.y=aB&&aE[az-1];}return aB?[au,aB]:au;},null,D),x=ar(function(az){var ay=[];for(var av=0,aA=az[z];av<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]&&(e.offset=ax[2]+"%");ay[ae](e);}for(var av=1,aA=ay[z]-1;av<aA;av++){if(!ay[av].offset){var E=b(ay[av-1].offset||0),R=0;for(var au=av+1;au<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<au;av++){E+=aw;ay[av].offset=E+"%";}}}return ay;}),X=function(){var E,i,au,R,e;if(l.is(arguments[0],"string")||l.is(arguments[0],"object")){if(l.is(arguments[0],"string")){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)&&arguments[z]>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)&&!(R in e)){switch(typeof E[R]){case"function":(function(au){e[R]=e===i?au:function(){return au[ao](i,arguments);};})(E[R]);break;case"object":e[R]=e[R]||{};a.call(this,e[R],E[R]);break;default:e[R]=E[R];break;}}}};if(l.svg){d.svgns="http://www.w3.org/2000/svg";d.xlink="http://www.w3.org/1999/xlink";var ai=function(e){return +e+(~~e===e)*0.5;};var N=function(av){for(var E=0,R=av[z];E<R;E++){if(av[E][0].toLowerCase()!="a"){for(var e=1,au=av[E][z];e<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"Your browser supports SVG.\nYou are running Rapha\u00ebl "+this.version;};var aq=function(e,R){var i=P("path");R.canvas&&R.canvas[c](i);var E=new s(i,R);E.type="path";W(E,{fill:"none",stroke:"#000",path:e});return E;};var af=function(R,aD,e){var aA="linear",ax=0.5,av=0.5,aF=R.style;aD=(aD+w)[Q](/^r(?:\(([^,]+?)\s*,\s*([^\)]+?)\))?/,function(aG,i,aH){aA="radial";if(i&&aH){ax=b(i);av=b(aH);if(L(ax-0.5,2)+L(av-0.5,2)>0.25){av=Math.sqrt(0.25-L(ax-0.5,2))+0.5;}}return w;});aD=aD[H](/\s*\-\s*/);if(aA=="linear"){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]<0){au[0]=-au[2];au[2]=0;}if(au[3]<0){au[1]=-au[3];au[3]=0;}}var az=x(aD);if(!az){return null;}var E=P(aA+"Gradient");E.id="r"+(l.idGenerator++)[j](36);aA=="radial"?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<aE;ay++){var aB=P("stop");P(aB,{offset:az[ay].offset?az[ay].offset:!ay?"0%":"100%","stop-color":az[ay].color||"#fff"});E[c](aB);}P(R,{fill:"url(#"+E.id+")",opacity:1,"fill-opacity":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("translate({0},{1})",e.x,e.y)});};var W=function(aB,aK){var aE={"":[0],none:[0],"-":[3,1],".":[1,1],"-.":[3,1,1,1],"-..":[3,1,1,1,1,1],". ":[1,3],"- ":[4,3],"--":[8,3],"- .":[4,3,1,3],"--.":[8,3,1,3],"--..":[8,3,1,3,1,3]},aG=aB.node,aC=aB.attrs,ay=aB.attr("rotation"),av=function(aR,aQ){aQ=aE[(aQ+w).toLowerCase()];if(aQ){var aO=aR.attrs["stroke-width"]||"1",aM={round:aO,square:aO,butt:0}[aR.attrs["stroke-linecap"]||aK["stroke-linecap"]]||0,aP=[];var aN=aQ[z];while(aN--){aP[aN]=aQ[aN]*aO+((aN%2)?1:-1)*aM;}P(aG,{"stroke-dasharray":aP[t](",")});}};b(ay)&&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"href":case"title":case"target":var aI=aG.parentNode;if(aI.tagName.toLowerCase()!="a"){var R=P("a");aI.insertBefore(R,aG);R[c](aG);aI=R;}aI.setAttributeNS(aB.paper.xlink,aF,aD);break;case"clip-rect":var i=(aD+w)[H](at);if(i[z]==4){aB.clip&&aB.clip.parentNode.parentNode.removeChild(aB.clip.parentNode);var E=P("clipPath"),aH=P("rect");E.id="r"+(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,{"clip-path":"url(#"+E.id+")"});aB.clip=aH;}if(!aD){var aJ=m.getElementById(aG.getAttribute("clip-path")[Q](/(^url\(#|\)$)/g,w));aJ&&aJ.parentNode.removeChild(aJ);P(aG,{"clip-path":w});delete aB.clip;}break;case"path":if(aD&&aB.type=="path"){aC.path=N(I(aD));P(aG,{d:aC.path});}break;case"width":aG[f](aF,aD);if(aC.fx){aF="x";aD=aC.x;}else{break;}case"x":if(aC.fx){aD=-aC.x-(aC.width||0);}case"rx":if(aF=="rx"&&aB.type=="rect"){break;}case"cx":aG[f](aF,aD);aB.pattern&&C(aB);break;case"height":aG[f](aF,aD);if(aC.fy){aF="y";aD=aC.y;}else{break;}case"y":if(aC.fy){aD=-aC.y-(aC.height||0);}case"ry":if(aF=="ry"&&aB.type=="rect"){break;}case"cy":aG[f](aF,aD);aB.pattern&&C(aB);break;case"r":if(aB.type=="rect"){P(aG,{rx:aD,ry:aD});}else{aG[f](aF,aD);}break;case"src":if(aB.type=="image"){aG.setAttributeNS(aB.paper.xlink,"href",aD);}break;case"stroke-width":aG.style.strokeWidth=aD;aG[f](aF,aD);if(aC["stroke-dasharray"]){av(aB,aC["stroke-dasharray"]);}break;case"stroke-dasharray":av(aB,aD);break;case"rotation":ay=aD;aB.rotate(aD,true);break;case"translation":var aw=(aD+w)[H](at);aB.translate((+aw[0]+1||2)-1,(+aw[1]+1||2)-1);break;case"scale":var aw=(aD+w)[H](at);aB.scale(+aw[0]||1,+aw[1]||+aw[0]||1,+aw[2]||null,+aw[3]||null);break;case"fill":var au=(aD+w).match(/^url\(['"]?([^\)]+)['"]?\)$/i);if(au){var E=P("pattern"),aA=P("image");E.id="r"+(l.idGenerator++)[j](36);P(E,{x:0,y:0,patternUnits:"userSpaceOnUse"});P(aA,{x:0,y:0});aA.setAttributeNS(aB.paper.xlink,"href",au[1]);E[c](aA);var aL=m.createElement("img");aL.style.cssText="position:absolute;left:-9999em;top-9999em";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="url(#"+E.id+")";P(aG,{fill:"url(#"+E.id+")"});aB.pattern=E;aB.pattern&&C(aB);break;}if(!l.getRGB(aD).error){delete aK.gradient;delete aC.gradient;if(!l.is(aC.opacity,"undefined")&&l.is(aK.opacity,"undefined")){aG.style.opacity=aC.opacity;P(aG,{opacity:aC.opacity});}if(!l.is(aC["fill-opacity"],"undefined")&&l.is(aK["fill-opacity"],"undefined")){aG.style.fillOpacity=aC["fill-opacity"];P(aG,{"fill-opacity":aC["fill-opacity"]});}}else{if((aB.type in {circle:1,ellipse:1}||(aD+w).charAt(0)!="r")&&af(aG,aD,aB.paper)){aC.gradient=aD;aC.fill="none";break;}}case"stroke":aG.style[aF]=l.getRGB(aD).hex;aG[f](aF,l.getRGB(aD).hex);break;case"gradient":(aB.type in {circle:1,ellipse:1}||(aD+w).charAt(0)!="r")&&af(aG,aD,aB.paper);break;case"opacity":case"fill-opacity":if(aC.gradient){var e=m.getElementById(aG.getAttribute("fill")[Q](/^url\(#|\)$/g,w));if(e){var ax=e.getElementsByTagName("stop");ax[ax[z]-1][f]("stop-opacity",aD);}break;}default:aF=="font-size"&&(aD=u(aD,10)+"px");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)&&aB.rotate(ay,true);};var ac=1.2;var am=function(e,au){if(e.type!="text"||!("text" in au||"font" in au||"font-size" in au||"x" in au||"y" in au)){return;}var az=e.attrs,E=e.node,aB=E.firstChild?u(m.defaultView.getComputedStyle(E.firstChild,w).getPropertyValue("font-size"),10):10;if("text" in au){while(E.firstChild){E.removeChild(E.firstChild);}var R=(au.text+w)[H]("\n");for(var av=0,aA=R[z];av<aA;av++){var ax=P("tspan");av&&P(ax,{dy:aB*ac,x:az.x});ax[c](m.createTextNode(R[av]));E[c](ax);}}else{var R=E.getElementsByTagName("tspan");for(var av=0,aA=R[z];av<aA;av++){av&&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&&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](" ");}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)&&(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("rotate({0} {1} {2})",this._.rt.deg,e,R);this.clip&&P(this.clip,{transform:l.format("rotate({0} {1} {2})",-this._.rt.deg,e,R)});}else{this.transformations[0]=w;this.clip&&P(this.clip,{transform:w});}P(this.node,{transform:this.transformations[t](" ")});return this;};s[v].hide=function(){this.node.style.display="none";return this;};s[v].show=function(){this.node.style.display="block";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=="path"){return T(this.attrs.path);}if(this.node.style.display=="none"){this.show();var R=true;}var ax={};try{ax=this.node.getBBox();}catch(av){}finally{ax=ax||{};}if(this.type=="text"){ax={x:ax.x,y:Infinity,width:0,height:0};for(var E=0,au=this.node.getNumberOfChars();E<au;E++){var aw=this.node.getExtentOfChar(E);(aw.y<ax.y)&&(ax.y=aw.y);(aw.y+aw.height-ax.y>ax.height)&&(ax.height=aw.y+aw.height-ax.y);(aw.x+aw.width-ax.x>ax.width)&&(ax.width=aw.x+aw.width-ax.x);}}R&&this.hide();return ax;};s[v].attr=function(){if(arguments[z]==1&&l.is(arguments[0],"string")){if(arguments[0]=="translation"){return this.translate();}if(arguments[0]=="rotation"){return this.rotate();}if(arguments[0]=="scale"){return this.scale();}return this.attrs[arguments[0]];}if(arguments[z]==1&&l.is(arguments[0],"array")){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&&l.is(arguments[0],"object")){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("circle");i.canvas&&i.canvas[c](R);var E=new s(R,i);E.attrs={cx:e,cy:av,r:au,fill:"none",stroke:"#000"};E.type="circle";P(R,E.attrs);return E;};var aa=function(E,e,ax,i,av,aw){e=ai(e);ax=ai(ax);var au=P("rect");E.canvas&&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:"none",stroke:"#000"};R.type="rect";P(au,R.attrs);return R;};var n=function(i,e,aw,av,au){e=ai(e);aw=ai(aw);var R=P("ellipse");i.canvas&&i.canvas[c](R);var E=new s(R,i);E.attrs={cx:e,cy:aw,rx:av,ry:au,fill:"none",stroke:"#000"};E.type="ellipse";P(R,E.attrs);return E;};var y=function(E,aw,e,ax,i,av){var au=P("image");P(au,{x:e,y:ax,width:i,height:av,preserveAspectRatio:"none"});au.setAttributeNS(E.xlink,"href",aw);E.canvas&&E.canvas[c](au);var R=new s(au,E);R.attrs={x:e,y:ax,width:i,height:av,src:aw};R.type="image";return R;};var Z=function(i,e,av,au){var R=P("text");P(R,{x:e,y:av,"text-anchor":"middle"});i.canvas&&i.canvas[c](R);var E=new s(R,i);E.attrs={x:e,y:av,"text-anchor":"middle",text:au,font:A.font,stroke:"none",fill:"#000"};E.type="text";W(E,E.attrs);return E;};var U=function(i,e){this.width=i||this.width;this.height=e||this.height;this.canvas[f]("width",this.width);this.canvas[f]("height",this.height);return this;};var q=function(){var R=X[ao](null,arguments),E=R&&R.container,i=R.x,ax=R.y,au=R.width,e=R.height;if(!E){throw new Error("SVG container not found.");}d.canvas=P("svg");var aw=d.canvas;d.width=au||512;d.height=e||342;aw[f]("width",d.width);aw[f]("height",d.height);if(E==1){aw.style.cssText="position:absolute;left:"+i+"px;top:"+ax+"px";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("desc"))[c](m.createTextNode("Created with Rapha\u00ebl"));e[c](this.desc);e[c](this.defs=P("defs"));};d.remove=function(){this.canvas.parentNode&&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)&&(aw=ag);aB=/[clmz]/g;if(aw==I&&!(aE+w).match(aB)){var E={M:"m",L:"l",C:"c",Z:"x",m:"t",l:"r",c:"v",z:"x"},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<aD;ay++){R=aC[ay];e=(aC[ay][0]+w).toLowerCase();e=="z"&&(e="x");for(var ax=1,az=R[z];ax<az;ax++){e+=ai(R[ax])+(ax!=az-1?",":w);}aA[ae](e);}return aA[t](" ");};l[j]=function(){return"Your browser doesn\u2019t support SVG. Falling down to VML.\nYou are running Rapha\u00ebl "+this.version;};var aq=function(e,av){var R=ap("group");R.style.cssText="position:absolute;left:0;top:0;width:"+av.width+"px;height:"+av.height+"px";R.coordsize=av.coordsize;R.coordorigin=av.coordorigin;var E=ap("shape"),i=E.style;i.width=av.width+"px";i.height=av.height+"px";E.coordsize=this.coordsize;E.coordorigin=this.coordorigin;R[c](E);var au=new s(E,R,av);au.isAbsolute=true;au.type="path";au.path=[];au.Path=w;e&&W(au,{fill:"none",stroke:"#000",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&&(aB.href=aD.href);aD.title&&(aB.title=aD.title);aD.target&&(aB.target=aD.target);if(aD.path&&az.type=="path"){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("clip-rect" in aD){var e=(aD["clip-rect"]+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("div"),aH=ay.style,av=aB.parentNode;aH.clip=l.format("rect({1}px {2}px {3}px {0}px)",e);if(!aB.clipRect){aH.position="absolute";aH.top=0;aH.left=0;aH.width=az.paper.width+"px";aH.height=az.paper.height+"px";av.parentNode.insertBefore(ay,av);ay[c](av);aB.clipRect=ay;}}if(!aD["clip-rect"]){aB.clipRect&&(aB.clipRect.style.clip=w);}}if(az.type=="image"&&aD.src){aB.src=aD.src;}if(az.type=="image"&&aD.opacity){aB.filterOpacity=" progid:DXImageTransform.Microsoft.Alpha(opacity="+(aD.opacity*100)+")";aw.filter=(aB.filterMatrix||w)+(aB.filterOpacity||w);}aD.font&&(aw.font=aD.font);aD["font-family"]&&(aw.fontFamily='"'+aD["font-family"][H](",")[0][Q](/^['"]+|['"]+$/g,w)+'"');aD["font-size"]&&(aw.fontSize=aD["font-size"]);aD["font-weight"]&&(aw.fontWeight=aD["font-weight"]);aD["font-style"]&&(aw.fontStyle=aD["font-style"]);if(aD.opacity!=null||aD["stroke-width"]!=null||aD.fill!=null||aD.stroke!=null||aD["stroke-width"]!=null||aD["stroke-opacity"]!=null||aD["fill-opacity"]!=null||aD["stroke-dasharray"]!=null||aD["stroke-miterlimit"]!=null||aD["stroke-linejoin"]!=null||aD["stroke-linecap"]!=null){aB=az.shape||aB;var aC=(aB.getElementsByTagName("fill")&&aB.getElementsByTagName("fill")[0]),aF=false;!aC&&(aF=aC=ap("fill"));if("fill-opacity" in aD||"opacity" in aD){var i=((+aE["fill-opacity"]+1||2)-1)*((+aE.opacity+1||2)-1);i<0&&(i=0);i>1&&(i=1);aC.opacity=i;}aD.fill&&(aC.on=true);if(aC.on==null||aD.fill=="none"){aC.on=false;}if(aC.on&&aD.fill){var E=aD.fill.match(/^url\(([^\)]+)\)$/i);if(E){aC.src=E[1];aC.type="tile";}else{aC.color=l.getRGB(aD.fill).hex;aC.src=w;aC.type="solid";if(l.getRGB(aD.fill).error&&(aI.type in {circle:1,ellipse:1}||(aD.fill+w).charAt(0)!="r")&&af(aI,aD.fill)){aE.fill="none";aE.gradient=aD.fill;}}}aF&&aB[c](aC);var au=(aB.getElementsByTagName("stroke")&&aB.getElementsByTagName("stroke")[0]),aG=false;!au&&(aG=au=ap("stroke"));if((aD.stroke&&aD.stroke!="none")||aD["stroke-width"]||aD["stroke-opacity"]!=null||aD["stroke-dasharray"]||aD["stroke-miterlimit"]||aD["stroke-linejoin"]||aD["stroke-linecap"]){au.on=true;}(aD.stroke=="none"||au.on==null||aD.stroke==0||aD["stroke-width"]==0)&&(au.on=false);au.on&&aD.stroke&&(au.color=l.getRGB(aD.stroke).hex);var i=((+aE["stroke-opacity"]+1||2)-1)*((+aE.opacity+1||2)-1);i<0&&(i=0);i>1&&(i=1);au.opacity=i;aD["stroke-linejoin"]&&(au.joinstyle=aD["stroke-linejoin"]||"miter");au.miterlimit=aD["stroke-miterlimit"]||8;aD["stroke-linecap"]&&(au.endcap={butt:"flat",square:"square",round:"round"}[aD["stroke-linecap"]]||"miter");aD["stroke-width"]&&(au.weight=(b(aD["stroke-width"])||1)*12/16);if(aD["stroke-dasharray"]){var aA={"-":"shortdash",".":"shortdot","-.":"shortdashdot","-..":"shortdashdotdot",". ":"dot","- ":"dash","--":"longdash","- .":"dashdot","--.":"longdashdot","--..":"longdashdotdot"};au.dashstyle=aA[aD["stroke-dasharray"]]||w;}aG&&aB[c](au);}if(aI.type=="text"){var aw=aI.paper.span.style;aE.font&&(aw.font=aE.font);aE["font-family"]&&(aw.fontFamily=aE["font-family"]);aE["font-size"]&&(aw.fontSize=aE["font-size"]);aE["font-weight"]&&(aw.fontWeight=aE["font-weight"]);aE["font-style"]&&(aw.fontStyle=aE["font-style"]);aI.node.string&&(aI.paper.span.innerHTML=(aI.node.string+w)[Q](/</g,"&#60;")[Q](/&/g,"&#38;")[Q](/\n/g,"<br>"));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["text-anchor"]){case"start":aI.node.style["v-text-align"]="left";aI.bbx=ai(aI.W/2);break;case"end":aI.node.style["v-text-align"]="right";aI.bbx=-ai(aI.W/2);break;default:aI.node.style["v-text-align"]="center";break;}}};var af=function(e,ax){e.attrs=e.attrs||{};var ay=e.attrs,aA=e.node.getElementsByTagName("fill"),av="linear",aw=".5 .5";e.attrs.gradient=ax;ax=(ax+w)[Q](/^r(?:\(([^,]+?)\s*,\s*([^\)]+?)\))?/,function(aC,aD,i){av="radial";if(aD&&i){aD=b(aD);i=b(i);if(L(aD-0.5,2)+L(i-0.5,2)>0.25){i=Math.sqrt(0.25-L(aD-0.5,2))+0.5;}aw=aD+" "+i;}return w;});ax=ax[H](/\s*\-\s*/);if(av=="linear"){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("fill");if(au[z]){aA.on=true;aA.method="none";aA.type=(av=="radial")?"gradientradial":"gradient";aA.color=au[0].color;aA.color2=au[au[z]-1].color;var aB=[];for(var R=0,az=au[z];R<az;R++){au[R].offset&&aB[ae](au[R].offset+" "+au[R].color);}if(aB[z]&&aA.colors){aA.colors.value=aB[t](",");}else{aA.colors.value="0% "+aA.color;}if(av=="radial"){aA.focus="100%";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](" ");}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&&(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&&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"circle":aE=aB.cx-aB.r;aD=aB.cy-aB.r;aF=aA=aB.r*2;break;case"ellipse":aE=aB.cx-aB.rx;aD=aB.cy-aB.ry;aF=aB.rx*2;aA=aB.ry*2;break;case"rect":case"image":aE=+aB.x;aD=+aB.y;aF=aB.width||0;aA=aB.height||0;break;case"text":this.textpath.v=["m",ai(aB.x),", ",ai(aB.y-2),"l",ai(aB.x)+1,", ",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"path":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=="path"||this.type=="text"){(E.left!=R+"px")&&(E.left=R+"px");(E.top!=aC+"px")&&(E.top=aC+"px");this.X=this.type=="text"?aE:-R;this.Y=this.type=="text"?aD:-aC;this.W=aF;this.H=aA;(ax.left!=-R+"px")&&(ax.left=-R+"px");(ax.top!=-aC+"px")&&(ax.top=-aC+"px");}else{(E.left!=R+"px")&&(E.left=R+"px");(E.top!=aC+"px")&&(E.top=aC+"px");this.X=aE;this.Y=aD;this.W=aF;this.H=aA;(E.width!=this.paper.width+"px")&&(E.width=this.paper.width+"px");(E.height!=this.paper.height+"px")&&(E.height=this.paper.height+"px");(ax.left!=aE-R+"px")&&(ax.left=aE-R+"px");(ax.top!=aD-aC+"px")&&(ax.top=aD-aC+"px");(ax.width!=aF+"px")&&(ax.width=aF+"px");(ax.height!=aA+"px")&&(ax.height=aA+"px");var aG=(+av.r||0)/(V(aF,aA));if(this.type=="rect"&&this.arcsize!=aG&&(aG||this.arcsize)){var e=ap(aG?"roundrect":"rect");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="none";return this;};s[v].show=function(){this.Group.style.display="block";return this;};s[v].getBBox=function(){if(this.type=="path"){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&&this.shape.parentNode.removeChild(this.shape);for(var e in this){delete this[e];}};s[v].attr=function(){if(arguments[z]==1&&l.is(arguments[0],"string")){if(arguments[0]=="translation"){return this.translate();}if(arguments[0]=="rotation"){return this.rotate();}if(arguments[0]=="scale"){return this.scale();}return this.attrs[arguments[0]];}if(this.attrs&&arguments[z]==1&&l.is(arguments[0],"array")){var e={};for(var E=0,R=arguments[0][z];E<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&&l.is(arguments[0],"object")){au=arguments[0];}if(au){if(au.gradient&&(this.type in {circle:1,ellipse:1}||(au.gradient+w).charAt(0)!="r")){af(this,au.gradient);}if(au.text&&this.type=="text"){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("group"),aw=ap("oval"),E=aw.style;au.style.cssText="position:absolute;left:0;top:0;width:"+i.width+"px;height:"+i.height+"px";au.coordsize=i.coordsize;au.coordorigin=i.coordorigin;au[c](aw);var R=new s(aw,au,i);R.type="circle";W(R,{stroke:"#000",fill:"none"});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("group"),E=ap(e?"roundrect":"rect"),az=(+e||0)/(V(ay,R));E.arcsize=az;au.style.cssText="position:absolute;left:0;top:0;width:"+i.width+"px;height:"+i.height+"px";au.coordsize=i.coordsize;au.coordorigin=i.coordorigin;au[c](E);var av=new s(E,au,i);av.type="rect";W(av,{stroke:"#000"});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("group"),R=ap("oval"),aw=R.style;au.style.cssText="position:absolute;left:0;top:0;width:"+e.width+"px;height:"+e.height+"px";au.coordsize=e.coordsize;au.coordorigin=e.coordorigin;au[c](R);var av=new s(R,au,e);av.type="ellipse";W(av,{stroke:"#000"});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("group"),E=ap("image"),aw=E.style;au.style.cssText="position:absolute;left:0;top:0;width:"+i.width+"px;height:"+i.height+"px";au.coordsize=i.coordsize;au.coordorigin=i.coordorigin;E.src=e;au[c](E);var av=new s(E,au,i);av.type="image";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("group"),R=ap("shape"),aw=R.style,aA=ap("path"),e=aA.style,E=ap("textpath");au.style.cssText="position:absolute;left:0;top:0;width:"+i.width+"px;height:"+i.height+"px";au.coordsize=i.coordsize;au.coordorigin=i.coordorigin;aA.v=l.format("m{0},{1}l{2},{1}",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="text";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:"none",fill:"#000"});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+"px";i.height=this.height+"px";i.clip="rect(0 "+this.width+"px "+this.height+"px 0)";this.coordsize=this.width+" "+this.height;return this;};m.createStyleSheet().addRule(".rvml","behavior:url(#default#VML)");try{!m.namespaces.rvml&&m.namespaces.add("rvml","urn:schemas-microsoft-com:vml");var ap=function(e){return m.createElement("<rvml:"+e+' class="rvml">');};}catch(an){var ap=function(e){return m.createElement("<"+e+' xmlns="urn:schemas-microsoft.com:vml" class="rvml">');};}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("VML container not found.");}var av={},aw=av.canvas=m.createElement("div"),au=aw.style;E=b(E)||512;az=b(az)||342;av.width=E;av.height=az;av.coordsize=E+" "+az;av.coordorigin="0 0";av.span=m.createElement("span");av.span.style.cssText="position:absolute;left:-9999px;top:-9999px;padding:0;margin:0;line-height:1;display:inline;";aw[c](av.span);au.cssText=l.format("width:{0}px;height:{1}px;position:absolute;clip:rect(0 {0}px {1}px 0)",E,az);if(i==1){m.body[c](aw);au.left=ay+"px";au.top=ax+"px";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({"Apple Computer, Inc.":1,"Google Inc.":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("on"+R,au);var e=function(){av.detachEvent("on"+R,au);return true;};if(R=="mouseover"){av.attachEvent("onmouseenter",au);return function(){av.detachEvent("onmouseenter",au);return e();};}else{if(R=="mouseout"){av.attachEvent("onmouseleave",au);return function(){av.detachEvent("onmouseleave",au);return e();};}}return e;};}}})();for(var ak=G[z];ak--;){(function(e){s[v][e]=function(i){if(l.is(i,"function")){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]["un"+e]=function(i){this.events&&this.events[e]&&this.events[e][i]&&this.events[e][i][z]&&this.events[e][i].shift()()&&!this.events[e][i][z]&&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&&!l.is(e,"string")&&!l.is(e[0],"array")&&(e+=w);return aq(l.format[ao](l,arguments),this);};d.image=function(R,e,au,i,E){return y(this,R||"about:blank",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]>1&&(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&&aD==null){return{x:this._.sx,y:this._.sy,toString:function(){return this.x+" "+this.y;}};}aD=aD||aE;!+aD&&(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"rect":case"image":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"circle":case"ellipse":this.attr({rx:aU.rx*aT,ry:aU.ry*aS,r:aU.r*V(aT,aS),cx:aW,cy:aV});break;case"path":var aN=g(aU.path),aO=true;for(var aQ=0,aJ=aN[z];aQ<aJ;aQ++){var aM=aN[aQ];if(aM[0].toUpperCase()=="M"&&aO){continue;}else{aO=false;}if(l.svg&&aM[0].toUpperCase()=="A"){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<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}&&(aA!=1||ax!=1)){if(this.transformations){this.transformations[2]="scale("[J](aA,",",ax,")");this.node[f]("transform",this.transformations[t](" "));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=" progid:DXImageTransform.Microsoft.Matrix(M11="[J](aA,", M12=0, M21=0, M22=",ax,", Dx=0, Dy=0, sizingmethod='auto expand', filtertype='bilinear')");aL.filter=(this.node.filterMatrix||w)+(this.node.filterOpacity||w);}}else{if(this.transformations){this.transformations[2]=w;this.node[f]("transform",this.transformations[t](" "));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](" ");this._.sx=aE;this._.sy=aD;}return this;};l.easing_formulas={linear:function(e){return e;},"<":function(e){return L(e,3);},">":function(e){return L(e-1,3)+1;},"<>":function(e){e=e*2;if(e<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<(1/E)){e=i*R*R;}else{if(R<(2/E)){R-=(1.5/E);e=i*R*R+0.75;}else{if(R<(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,"function")||!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)&&(aG[aE]=A[aE]);E[aE]=aM[aE];switch(F[aE]){case"number":aA[aE]=(E[aE]-aG[aE])/aD;break;case"colour":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"path":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<ay;aI++){aA[aE][aI]=[0];for(var aH=1,aK=aG[aE][aI][z];aH<aK;aH++){aA[aE][aI][aH]=(E[aE][aI][aH]-aG[aE][aI][aH])/aD;}}break;case"csv":var e=(aM[aE]+w)[H](at),ax=(aG[aE]+w)[H](at);switch(aE){case"translation":aG[aE]=[0,0];aA[aE]=[e[0]/aD,e[1]/aD];break;case"rotation":aG[aE]=(ax[1]==e[1]&&ax[2]==e[2])?ax:[0,e[1],e[2]];aA[aE]=[(e[0]-aG[aE][0])/aD,0,0];break;case"scale":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"clip-rect":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>255?255:i;},aw=this;(function aJ(){var aO=new Date-R,aW={},aN;if(aO<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"number":aN=+aG[aS]+aU*aD*aA[aS];break;case"colour":aN="rgb("+[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](",")+")";break;case"path":aN=[];for(var aQ=0,aX=aG[aS][z];aQ<aX;aQ++){aN[aQ]=[aG[aS][aQ][0]];for(var aP=1,aR=aG[aS][aQ][z];aP<aR;aP++){aN[aQ][aP]=+aG[aS][aQ][aP]+aU*aD*aA[aS][aQ][aP];}aN[aQ]=aN[aQ][t](" ");}aN=aN[t](" ");break;case"csv":switch(aS){case"translation":var aV=aA[aS][0]*(aO-aB),aT=aA[aS][1]*(aO-aB);az.x+=aV;az.y+=aT;aN=aV+" "+aT;break;case"rotation":aN=+aG[aS][0]+aU*aD*aA[aS][0];aG[aS][1]&&(aN+=","+aG[aS][1]+","+aG[aS][2]);break;case"scale":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](" ");break;case"clip-rect":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&&d.safari();}else{(az.x||az.y)&&aw.translate(-az.x,-az.y);aM.scale&&(aM.scale=aM.scale+w);aw.attr(aM);clearTimeout(aw.animation_in_progress);l.svg&&d.safari();(l.is(au,"function"))&&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"circle":case"ellipse":this.attr({cx:+e+this.attrs.cx,cy:+E+this.attrs.cy});break;case"rect":case"image":case"text":this.attr({x:+e+this.attrs.x,y:+E+this.attrs.y});break;case"path":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"Rapha\u00ebl\u2019s object";};var p=function(e){this.items=[];this[z]=0;if(e){for(var E=0,R=e[z];E<R;E++){if(e[E]&&(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<R;E++){au=arguments[E];if(au&&(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<R;E++){this.items[E][e][ao](this.items[E],arguments);}return this;};})(al);}}p[v].attr=function(E,aw){if(E&&l.is(E,"array")&&l.is(E[0],"object")){for(var e=0,av=E[z];e<av;e++){this.items[e].attr(E[e]);}}else{for(var R=0,au=this.items[z];R<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,"function")||!ay){ax=ay||null;}var e=this.items[z],R=e,aw=this;if(ax){var au=function(){!--e&&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["font-family"];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["units-per-em"]=u(i.face["units-per-em"],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&&"M"+av.d[Q](/[mlcxtrv]/g,function(ax){return{l:"L",c:"C",x:"z",t:"m",r:"l",v:"c"}[ax]||"M";})+"z"};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||"normal";E=E||"normal";az=+az||{normal:400,bold:700,lighter:300,bolder:800}[az]||400;var av=l.fonts[ay];if(!av){var R=new RegExp("(^|\\s)"+ay[Q](/[^\w\d\s+!~.:_-]/g,w)+"(\\s|$)","i");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<aA;ax++){aw=av[ax];if(aw.face["font-weight"]==az&&(aw.face["font-style"]==E||!aw.face["font-style"])&&aw.face["font-stretch"]==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,"string")&&(E=this.getFont(E));if(E){au=(aE||16)/E.face["units-per-em"];for(var aw=0,aB=ay[z];aw<aB;aw++){var R=aw&&E.glyphs[ay[aw-1]]||{},aC=E.glyphs[ay[aw]];e+=aw?(R.w||E.w)+(R.k&&R.k[ay[aw]]||0):0;aC&&aC.d&&av[ae](this.path(aC.d).attr({fill:"#000",stroke:"none",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],"array")?[0][J](arguments[1]):arguments;i&&l.is(i,"string")&&e[z]-1&&(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
index 62c77ae..65a4206 100644 (file)
@@ -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: "Raphael" in window,
-            is: window.Raphael
+            was: "Raphael" in win,
+            is: win.Raphael
         },
         R = function () {
             if (R.is(arguments[0], "array")) {
                 var a = arguments[0],
-                    cnv = create[ap](R, a.splice(0, 3 + R.is(a[0], "number"))),
+                    cnv = create[apply](R, a.splice(0, 3 + R.is(a[0], nu))),
                     res = cnv.set();
-                for (var i = 0, ii = a[ln]; i < ii; i++) {
+                for (var i = 0, ii = a[length]; i < ii; i++) {
                     var j = a[i] || {};
-                    j.type in {circle:1, rect:1, path:1, ellipse:1, text:1, image:1} && res.push(cnv[j.type]().attr(j));
+                    ({circle:1, rect:1, path:1, ellipse:1, text:1, image:1}[has](j.type)) && res[push](cnv[j.type]().attr(j));
                 }
                 return res;
             }
-            return create[ap](R, arguments);
+            return create[apply](R, arguments);
         },
         paper = {},
-        availableAttrs = {"clip-rect": "0 0 10e9 10e9", cx: 0, cy: 0, fill: "#fff", "fill-opacity": 1, font: '10px "Arial"', "font-family": '"Arial"', "font-size": "10", "font-style": "normal", "font-weight": 400, gradient: 0, height: 0, href: "http://raphaeljs.com/", opacity: 1, path: "M0,0", r: 0, rotation: 0, rx: 0, ry: 0, scale: "1 1", src: "", stroke: "#000", "stroke-dasharray": "", "stroke-linecap": "butt", "stroke-linejoin": "butt", "stroke-miterlimit": 0, "stroke-opacity": 1, "stroke-width": 1, target: "_blank", "text-anchor": "middle", title: "Raphael", translation: "0 0", width: 0, x: 0, y: 0},
-        availableAnimAttrs = {"clip-rect": "csv", cx: "number", cy: "number", fill: "colour", "fill-opacity": "number", "font-size": "number", height: "number", opacity: "number", path: "path", r: "number", rotation: "csv", rx: "number", ry: "number", scale: "csv", stroke: "colour", "stroke-opacity": "number", "stroke-width": "number", translation: "csv", width: "number", x: "number", y: "number"},
         events = ["click", "dblclick", "mousedown", "mousemove", "mouseout", "mouseover", "mouseup"],
+        E = "",
+        has = "hasOwnProperty",
         proto = "prototype",
-        ap = "apply",
-        ln = "length",
-        pf = "parseFloat",
-        pi = "parseInt";
-    R.version = "1.0";
-    R.type = (window.SVGAngle || document.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#BasicStructure", "1.1") ? "SVG" : "VML");
+        setAttribute = "setAttribute",
+        appendChild = "appendChild",
+        apply = "apply",
+        length = "length",
+        join = "join",
+        split = "split",
+        concat = "concat",
+        push = "push",
+        toFloat = parseFloat,
+        toInt = parseInt,
+        pow = Math.pow,
+        mmin = Math.min,
+        mmax = Math.max,
+        round = Math.round,
+        rg = /^(?=[\da-f]$)/,
+        nu = "number",
+        toString = "toString",
+        availableAttrs = {"clip-rect": "0 0 10e9 10e9", cx: 0, cy: 0, fill: "#fff", "fill-opacity": 1, font: '10px "Arial"', "font-family": '"Arial"', "font-size": "10", "font-style": "normal", "font-weight": 400, gradient: 0, height: 0, href: "http://raphaeljs.com/", opacity: 1, path: "M0,0", r: 0, rotation: 0, rx: 0, ry: 0, scale: "1 1", src: "", stroke: "#000", "stroke-dasharray": "", "stroke-linecap": "butt", "stroke-linejoin": "butt", "stroke-miterlimit": 0, "stroke-opacity": 1, "stroke-width": 1, target: "_blank", "text-anchor": "middle", title: "Raphael", translation: "0 0", width: 0, x: 0, y: 0},
+        availableAnimAttrs = {"clip-rect": "csv", cx: nu, cy: nu, fill: "colour", "fill-opacity": nu, "font-size": nu, height: nu, opacity: nu, path: "path", r: nu, rotation: "csv", rx: nu, ry: nu, scale: "csv", stroke: "colour", "stroke-opacity": nu, "stroke-width": nu, translation: "csv", width: nu, x: nu, y: nu},
+        rp = "replace";
+    R.version = "1.1";
+    R.type = (win.SVGAngle || doc.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#BasicStructure", "1.1") ? "SVG" : "VML");
     R.svg = !(R.vml = R.type == "VML");
     R.idGenerator = 0;
     R.fn = {};
     R.is = function (o, type) {
-        type = (type + "").toLowerCase();
+        type = (type + E).toLowerCase();
         if ((type == "object" || type == "undefined") && typeof o == type) {
             return true;
         }
         if (o == null && type == "null") {
             return true;
         }
-        return Object[proto].toString.call(o).replace(/^\[object\s+|\]$/gi, "").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 = "0" + r;
-        }
-        if (g[ln] == 1) {
-            g = "0" + g;
-        }
-        if (b[ln] == 1) {
-            b = "0" + b;
-        }
+            r = (~~red)[toString](16),
+            g = (~~green)[toString](16),
+            b = (~~blue)[toString](16);
+        r = r[rp](rg, "0");
+        g = g[rp](rg, "0");
+        b = b[rp](rg, "0");
         rgb.hex = "#" + 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 = "",
+        var res = E,
             item;
-        for (var i = 0, ii = this[ln]; i < ii; i++) {
-            for (var j = 0, jj = this[i][ln]; j < jj; j++) {
+        for (var i = 0, ii = this[length]; i < ii; i++) {
+            for (var j = 0, jj = this[i][length]; j < jj; j++) {
                 res += this[i][j];
                 j && j != jj - 1 && (res += ",");
             }
-            i != ii - 1 && (res += "\n");
+            i != ii - 1 && (res += " ");
         }
-        return res.replace(/,(?=-)/g, "");
+        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("\u25ba");
+            var arg = Array[proto].splice.call(arguments, 0, arguments[length]),
+                args = arg[join]("\u25ba");
             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] > 1000) {
-                delete newf.cache[newf.count.unshift()];
+            if (newf.count[length] >= 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: "none", aliceblue: "#f0f8ff", amethyst: "#96c", antiquewhite: "#faebd7", aqua: "#0ff", aquamarine: "#7fffd4", azure: "#f0ffff", beige: "#f5f5dc", bisque: "#ffe4c4", black: "#000", blanchedalmond: "#ffebcd", blue: "#00f", blueviolet: "#8a2be2", brown: "#a52a2a", burlywood: "#deb887", cadetblue: "#5f9ea0", chartreuse: "#7fff00", chocolate: "#d2691e", coral: "#ff7f50", cornflowerblue: "#6495ed", cornsilk: "#fff8dc", crimson: "#dc143c", cyan: "#0ff", darkblue: "#00008b", darkcyan: "#008b8b", darkgoldenrod: "#b8860b", darkgray: "#a9a9a9", darkgreen: "#006400", darkkhaki: "#bdb76b", darkmagenta: "#8b008b", darkolivegreen: "#556b2f", darkorange: "#ff8c00", darkorchid: "#9932cc", darkred: "#8b0000", darksalmon: "#e9967a", darkseagreen: "#8fbc8f", darkslateblue: "#483d8b", darkslategray: "#2f4f4f", darkturquoise: "#00ced1", darkviolet: "#9400d3", deeppink: "#ff1493", deepskyblue: "#00bfff", dimgray: "#696969", dodgerblue: "#1e90ff", firebrick: "#b22222", floralwhite: "#fffaf0", forestgreen: "#228b22", fuchsia: "#f0f", gainsboro: "#dcdcdc", ghostwhite: "#f8f8ff", gold: "#ffd700", goldenrod: "#daa520", gray: "#808080", green: "#008000", greenyellow: "#adff2f", honeydew: "#f0fff0", hotpink: "#ff69b4", indianred: "#cd5c5c", indigo: "#4b0082", ivory: "#fffff0", khaki: "#f0e68c", lavender: "#e6e6fa", lavenderblush: "#fff0f5", lawngreen: "#7cfc00", lemonchiffon: "#fffacd", lightblue: "#add8e6", lightcoral: "#f08080", lightcyan: "#e0ffff", lightgoldenrodyellow: "#fafad2", lightgreen: "#90ee90", lightgrey: "#d3d3d3", lightpink: "#ffb6c1", lightsalmon: "#ffa07a", lightsalmon: "#ffa07a", lightseagreen: "#20b2aa", lightskyblue: "#87cefa", lightslategray: "#789", lightsteelblue: "#b0c4de", lightyellow: "#ffffe0", lime: "#0f0", limegreen: "#32cd32", linen: "#faf0e6", magenta: "#f0f", maroon: "#800000", mediumaquamarine: "#66cdaa", mediumblue: "#0000cd", mediumorchid: "#ba55d3", mediumpurple: "#9370db", mediumseagreen: "#3cb371", mediumslateblue: "#7b68ee", mediumslateblue: "#7b68ee", mediumspringgreen: "#00fa9a", mediumturquoise: "#48d1cc", mediumvioletred: "#c71585", midnightblue: "#191970", mintcream: "#f5fffa", mistyrose: "#ffe4e1", moccasin: "#ffe4b5", navajowhite: "#ffdead", navy: "#000080", oldlace: "#fdf5e6", olive: "#808000", olivedrab: "#6b8e23", orange: "#ffa500", orangered: "#ff4500", orchid: "#da70d6", palegoldenrod: "#eee8aa", palegreen: "#98fb98", paleturquoise: "#afeeee", palevioletred: "#db7093", papayawhip: "#ffefd5", peachpuff: "#ffdab9", peru: "#cd853f", pink: "#ffc0cb", plum: "#dda0dd", powderblue: "#b0e0e6", purple: "#800080", red: "#f00", rosybrown: "#bc8f8f", royalblue: "#4169e1", saddlebrown: "#8b4513", salmon: "#fa8072", sandybrown: "#f4a460", seagreen: "#2e8b57", seashell: "#fff5ee", sienna: "#a0522d", silver: "#c0c0c0", skyblue: "#87ceeb", slateblue: "#6a5acd", slategray: "#708090", snow: "#fffafa", springgreen: "#00ff7f", steelblue: "#4682b4", tan: "#d2b48c", teal: "#008080", thistle: "#d8bfd8", tomato: "#ff6347", turquoise: "#40e0d0", violet: "#ee82ee", wheat: "#f5deb3", white: "#fff", whitesmoke: "#f5f5f5", yellow: "#ff0", yellowgreen: "#9acd32"},
             res;
-        colour = htmlcolors[(colour + "").toLowerCase()] || colour;
+        colour = htmlcolors[(colour + E).toLowerCase()] || colour;
         if (!colour) {
             return {r: -1, g: -1, b: -1, hex: "none", error: 1};
         }
@@ -188,50 +198,48 @@ window.Raphael = (function () {
         var red,
             green,
             blue,
-            rgb = (colour + "").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 = "replace";
+            var r = (~~red)[toString](16),
+                g = (~~green)[toString](16),
+                b = (~~blue)[toString](16);
             r = r[rp](rg, "0");
             g = g[rp](rg, "0");
             b = b[rp](rg, "0");
@@ -268,22 +276,22 @@ window.Raphael = (function () {
         if (R.is(pathString, "array") && R.is(pathString[0], "array")) { // rough assumption
             data = pathClone(pathString);
         }
-        if (!data[ln]) {
-            (pathString + "").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 && params.push(+b);
+                c[rp](/(-?\d*\.?\d*(?:e[-+]?\d+)?)\s*,?\s*/ig, function (a, b) {
+                    b && params[push](+b);
                 });
-                while (params[ln] >= paramCounts[name]) {
-                    data.push([b].concat(params.splice(0, paramCounts[name])));
+                while (params[length] >= 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 < ii; i++) {
+        for (var i = 0, ii = path[length]; i < ii; i++) {
             if (path[i][0] == "M") {
                 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, "array") || !R.is(pathArray && pathArray[0], "array")) { // rough assumption
                 pathArray = R.parsePathString(pathArray);
             }
-            for (var i = 0, ii = pathArray[ln]; i < ii; i++) {
+            for (var i = 0, ii = pathArray[length]; i < ii; i++) {
                 res[i] = [];
-                for (var j = 0, jj = pathArray[i][ln]; j < jj; j++) {
+                for (var j = 0, jj = pathArray[i][length]; j < 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(["M", x, y]);
+                res[push](["M", x, y]);
             }
-            for (var i = start, ii = pathArray[ln]; i < ii; i++) {
+            for (var i = start, ii = pathArray[length]; i < 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 < jj; j++) {
+                            for (var j = 1, jj = pa[length]; j < 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 < kk; k++) {
+                    for (var k = 0, kk = pa[length]; k < kk; k++) {
                         res[i][k] = pa[k];
                     }
                 }
-                var len = res[i][ln];
+                var len = res[i][length];
                 switch (res[i][0]) {
                     case "z":
                         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] = ["M", x, y];
             }
-            for (var i = start, ii = pathArray[ln]; i < ii; i++) {
+            for (var i = start, ii = pathArray[length]; i < ii; i++) {
                 var r = res[i] = [],
                     pa = pathArray[i];
-                if (pa[0] != (pa[0] + "").toUpperCase()) {
-                    r[0] = (pa[0] + "").toUpperCase();
+                if (pa[0] != (pa[0] + E).toUpperCase()) {
+                    r[0] = (pa[0] + E).toUpperCase();
                     switch (r[0]) {
                         case "A":
                             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 < jj; j++) {
+                            for (var j = 1, jj = pa[length]; j < jj; j++) {
                                 r[j] = +pa[j] + ((j % 2) ? x : y);
                             }
                     }
                 } else {
-                    for (var k = 0, kk = pa[ln]; k < kk; k++) {
+                    for (var k = 0, kk = pa[length]; k < 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(",").split(",");
+                res = [m2, m3, m4][concat](res)[join](",")[split](",");
                 var newres = [];
-                for (var i = 0, ii = res[ln]; i < ii; i++) {
+                for (var i = 0, ii = res[length]; i < 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 > 0 && t1 < 1 ? t1 : 0),
                 dot2 = findDotAtSegment(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, t2 > 0 && t2 < 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 > 0 && t1 < 1 ? t1 : 0);
             dot2 = findDotAtSegment(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, t2 > 0 && t2 < 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 "A":
-                            path = ["C"].concat(a2c[ap](0, [d.x, d.y].concat(path.slice(1))));
+                            path = ["C"][concat](a2c[apply](0, [d.x, d.y][concat](path.slice(1))));
                             break;
                         case "S":
                             nx = d.x + (d.x - (d.bx || d.x));
                             ny = d.y + (d.y - (d.by || d.y));
-                            path = ["C", nx, ny].concat(path.slice(1));
+                            path = ["C", nx, ny][concat](path.slice(1));
                             break;
                         case "T":
                             d.qx = d.x + (d.x - (d.qx || d.x));
                             d.qy = d.y + (d.y - (d.qy || d.y));
-                            path = ["C"].concat(q2c(d.x, d.y, d.qx, d.qy, path[1], path[2]));
+                            path = ["C"][concat](q2c(d.x, d.y, d.qx, d.qy, path[1], path[2]));
                             break;
                         case "Q":
                             d.qx = path[1];
                             d.qy = path[2];
-                            path = ["C"].concat(q2c(d.x, d.y, path[1], path[2], path[3], path[4]));
+                            path = ["C"][concat](q2c(d.x, d.y, path[1], path[2], path[3], path[4]));
                             break;
                         case "L":
-                            path = ["C"].concat(l2c(d.x, d.y, path[1], path[2]));
+                            path = ["C"][concat](l2c(d.x, d.y, path[1], path[2]));
                             break;
                         case "H":
-                            path = ["C"].concat(l2c(d.x, d.y, path[1], d.y));
+                            path = ["C"][concat](l2c(d.x, d.y, path[1], d.y));
                             break;
                         case "V":
-                            path = ["C"].concat(l2c(d.x, d.y, d.x, path[1]));
+                            path = ["C"][concat](l2c(d.x, d.y, d.x, path[1]));
                             break;
                         case "Z":
-                            path = ["C"].concat(l2c(d.x, d.y, d.X, d.Y));
+                            path = ["C"][concat](l2c(d.x, d.y, d.X, d.Y));
                             break;
                     }
                     return path;
                 },
                 fixArc = function (pp, i) {
-                    if (pp[i][ln] > 7) {
+                    if (pp[i][length] > 7) {
                         pp[i].shift();
                         var pi = pp[i];
-                        while (pi[ln]) {
-                            pp.splice(i++, 0, ["C"].concat(pi.splice(0, 6)));
+                        while (pi[length]) {
+                            pp.splice(i++, 0, ["C"][concat](pi.splice(0, 6)));
                         }
                         pp.splice(i, 1);
-                        ii = Math.max(p[ln], p2 && p2[ln] || 0);
+                        ii = mmax(p[length], p2 && 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 && p2[ln] || 0);
+                        ii = mmax(p[length], p2 && p2[length] || 0);
                     }
                 };
-            for (var i = 0, ii = Math.max(p[ln], p2 && p2[ln] || 0); i < ii; i++) {
+            for (var i = 0, ii = mmax(p[length], p2 && p2[length] || 0); i < ii; i++) {
                 p[i] = processPath(p[i], attrs);
                 fixArc(p, i);
                 p2 && (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 && p2[i],
-                    seglen = seg[ln],
-                    seg2len = p2 && seg2[ln];
+                    seglen = seg[length],
+                    seg2len = p2 && 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 && (win[pf](seg2[seg2len - 4]) || attrs2.x);
-                attrs2.by = p2 && (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 && (toFloat(seg2[seg2len - 4]) || attrs2.x);
+                attrs2.by = p2 && (toFloat(seg2[seg2len - 3]) || attrs2.y);
                 attrs2.x = p2 && seg2[seg2len - 2];
                 attrs2.y = p2 && 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 < ii; i++) {
+            for (var i = 0, ii = gradient[length]; i < 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] && (dot.offset = par[2] + "%");
-                dots.push(dot);
+                dots[push](dot);
             }
-            for (var i = 1, ii = dots[ln] - 1; i < ii; i++) {
+            for (var i = 1, ii = dots[length] - 1; i < 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 < 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 < 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], "number") && arguments[ln] > 3) {
+            } else if (R.is(arguments[0], nu) && arguments[length] > 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) && !(prop in con)) {
+            for (var prop in add) if (add[has](prop) && !(prop in con)) {
                 switch (typeof add[prop]) {
                     case "function":
                         (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 "object":
@@ -796,12 +804,12 @@ window.Raphael = (function () {
         paper.svgns = "http://www.w3.org/2000/svg";
         paper.xlink = "http://www.w3.org/1999/xlink";
         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 < ii; i++) {
+            for (var i = 0, ii = path[length]; i < ii; i++) {
                 if (path[i][0].toLowerCase() != "a") {
-                    for (var j = 1, jj = path[i][ln]; j < jj; j++) {
+                    for (var j = 1, jj = path[i][length]; j < 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  "Your browser supports SVG.\nYou are running Rapha\u00ebl " + this.version;
         };
         var thePath = function (pathString, SVG) {
             var el = $("path");
-            SVG.canvas && SVG.canvas.appendChild(el);
+            SVG.canvas && SVG.canvas[appendChild](el);
             var p = new Element(el, SVG);
             p.type = "path";
             setFillAndStroke(p, {fill: "none", stroke: "#000", path: pathString});
@@ -835,26 +843,26 @@ window.Raphael = (function () {
             var type = "linear",
                 fx = .5, fy = .5,
                 s = o.style;
-            gradient = (gradient + "").replace(/^r(?:\(([^,]+?)\s*,\s*([^\)]+?)\))?/, function (all, _fx, _fy) {
+            gradient = (gradient + E)[rp](/^r(?:\(([^,]+?)\s*,\s*([^\)]+?)\))?/, function (all, _fx, _fy) {
                 type = "radial";
                 if (_fx && _fy) {
-                    fx = win[pf](_fx);
-                    fy = win[pf](_fy);
-                    if (Math.pow(fx - .5, 2) + Math.pow(fy - .5, 2) > .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) > .25) {
+                        fy = Math.sqrt(.25 - pow(fx - .5, 2)) + .5;
                     }
                 }
-                return "";
+                return E;
             });
-            gradient = gradient.split(/\s*\-\s*/);
+            gradient = gradient[split](/\s*\-\s*/);
             if (type == "linear") {
                 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] < 0) {
@@ -871,23 +879,23 @@ window.Raphael = (function () {
                 return null;
             }
             var el = $(type + "Gradient");
-            el.id = "r" + (R.idGenerator++).toString(36);
+            el.id = "r" + (R.idGenerator++)[toString](36);
             type == "radial" ? $(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 < ii; i++) {
+            SVG.defs[appendChild](el);
+            for (var i = 0, ii = dots[length]; i < ii; i++) {
                 var stop = $("stop");
                 $(stop, {
                     offset: dots[i].offset ? dots[i].offset : !i ? "0%" : "100%",
                     "stop-color": dots[i].color || "#fff"
                 });
-                el.appendChild(stop);
+                el[appendChild](stop);
             };
             $(o, {
                 fill: "url(#" + el.id + ")",
                 opacity: 1,
                 "fill-opacity": 1
             });
-            s.fill = "";
+            s.fill = E;
             s.opacity = 1;
             s.fillOpacity = 1;
             return 1;
@@ -915,20 +923,20 @@ window.Raphael = (function () {
                 attrs = o.attrs,
                 rot = o.attr("rotation"),
                 addDashes = function (o, value) {
-                    value = dasharray[(value + "").toLowerCase()];
+                    value = dasharray[(value + E).toLowerCase()];
                     if (value) {
                         var width = o.attrs["stroke-width"] || "1",
                             butt = {round: width, square: width, butt: 0}[o.attrs["stroke-linecap"] || params["stroke-linecap"]] || 0,
                             dashes = [];
-                        var i = value[ln];
+                        var i = value[length];
                         while (i--) {
                             dashes[i] = value[i] * width + ((i % 2) ? 1 : -1) * butt;
                         }
-                        $(node, {"stroke-dasharray": dashes.join(",")});
+                        $(node, {"stroke-dasharray": dashes[join](",")});
                     }
                 };
-            win[pf](rot) && o.rotate(0, true);
-            for (var att in params) if (params.hasOwnProperty(att)) {
+            toFloat(rot) && 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() != "a") {
                             var hl = $("a");
                             pn.insertBefore(hl, node);
-                            hl.appendChild(node);
+                            hl[appendChild](node);
                             pn = hl;
                         }
                         pn.setAttributeNS(o.paper.xlink, att, value);
                       break;
                     case "clip-rect":
-                        var rect = (value + "").split(separator);
-                        if (rect[ln] == 4) {
+                        var rect = (value + E)[split](separator);
+                        if (rect[length] == 4) {
                             o.clip && o.clip.parentNode.parentNode.removeChild(o.clip.parentNode);
                             var el = $("clipPath"),
                                 rc = $("rect");
-                            el.id = "r" + (R.idGenerator++).toString(36);
+                            el.id = "r" + (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, {"clip-path": "url(#" + el.id + ")"});
                             o.clip = rc;
                         }
                         if (!value) {
-                            var clip = doc.getElementById(node.getAttribute("clip-path").replace(/(^url\(#|\)$)/g, ""));
+                            var clip = doc.getElementById(node.getAttribute("clip-path")[rp](/(^url\(#|\)$)/g, E));
                             clip && clip.parentNode.removeChild(clip);
-                            $(node, {"clip-path": ""});
+                            $(node, {"clip-path": E});
                             delete o.clip;
                         }
                     break;
@@ -980,7 +988,7 @@ window.Raphael = (function () {
                         }
                         break;
                     case "width":
-                        node.setAttribute(att, value);
+                        node[setAttribute](att, value);
                         if (attrs.fx) {
                             att = "x";
                             value = attrs.x;
@@ -996,11 +1004,11 @@ window.Raphael = (function () {
                             break;
                         }
                     case "cx":
-                        node.setAttribute(att, value);
+                        node[setAttribute](att, value);
                         o.pattern && updatePosition(o);
                         break;
                     case "height":
-                        node.setAttribute(att, value);
+                        node[setAttribute](att, value);
                         if (attrs.fy) {
                             att = "y";
                             value = attrs.y;
@@ -1016,14 +1024,14 @@ window.Raphael = (function () {
                             break;
                         }
                     case "cy":
-                        node.setAttribute(att, value);
+                        node[setAttribute](att, value);
                         o.pattern && updatePosition(o);
                         break;
                     case "r":
                         if (o.type == "rect") {
                             $(node, {rx: value, ry: value});
                         } else {
-                            node.setAttribute(att, value);
+                            node[setAttribute](att, value);
                         }
                         break;
                     case "src":
@@ -1034,7 +1042,7 @@ window.Raphael = (function () {
                     case "stroke-width":
                         node.style.strokeWidth = value;
                         // Need following line for Firefox
-                        node.setAttribute(att, value);
+                        node[setAttribute](att, value);
                         if (attrs["stroke-dasharray"]) {
                             addDashes(o, attrs["stroke-dasharray"]);
                         }
@@ -1047,23 +1055,23 @@ window.Raphael = (function () {
                         o.rotate(value, true);
                         break;
                     case "translation":
-                        var xy = (value + "").split(separator);
+                        var xy = (value + E)[split](separator);
                         o.translate((+xy[0] + 1 || 2) - 1, (+xy[1] + 1 || 2) - 1);
                         break;
                     case "scale":
-                        var xy = (value + "").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 "fill":
-                        var isURL = (value + "").match(/^url\(['"]?([^\)]+)['"]?\)$/i);
+                        var isURL = (value + E).match(/^url\(['"]?([^\)]+)['"]?\)$/i);
                         if (isURL) {
                             var el = $("pattern"),
                                 ig = $("image");
-                            el.id = "r" + (R.idGenerator++).toString(36);
+                            el.id = "r" + (R.idGenerator++)[toString](36);
                             $(el, {x: 0, y: 0, patternUnits: "userSpaceOnUse"});
                             $(ig, {x: 0, y:0});
                             ig.setAttributeNS(o.paper.xlink, "href", isURL[1]);
-                            el.appendChild(ig);
+                            el[appendChild](ig);
 
                             var img = doc.createElement("img");
                             img.style.cssText = "position:absolute;left:-9999em;top-9999em";
@@ -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 = "url(#" + el.id + ")";
                             $(node, {fill: "url(#" + el.id + ")"});
                             o.pattern = el;
@@ -1095,7 +1103,7 @@ window.Raphael = (function () {
                                 // Need following line for Firefox
                                 $(node, {"fill-opacity": attrs["fill-opacity"]});
                             }
-                        } else if ((o.type in {circle: 1, ellipse: 1} || (value + "").charAt(0) != "r") && addGradientFill(node, value, o.paper)) {
+                        } else if ((o.type in {circle: 1, ellipse: 1} || (value + E).charAt(0) != "r") && addGradientFill(node, value, o.paper)) {
                             attrs.gradient = value;
                             attrs.fill = "none";
                             break;
@@ -1103,35 +1111,35 @@ window.Raphael = (function () {
                     case "stroke":
                         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 "gradient":
-                        (o.type in {circle: 1, ellipse: 1} || (value + "").charAt(0) != "r") && addGradientFill(node, value, o.paper);
+                        (o.type in {circle: 1, ellipse: 1} || (value + E).charAt(0) != "r") && addGradientFill(node, value, o.paper);
                         break;
                     case "opacity":
                     case "fill-opacity":
                         if (attrs.gradient) {
-                            var gradient = doc.getElementById(node.getAttribute("fill").replace(/^url\(#|\)$/g, ""));
+                            var gradient = doc.getElementById(node.getAttribute("fill")[rp](/^url\(#|\)$/g, E));
                             if (gradient) {
                                 var stops = gradient.getElementsByTagName("stop");
-                                stops[stops[ln] - 1].setAttribute("stop-opacity", value);
+                                stops[stops[length] - 1][setAttribute]("stop-opacity", value);
                             }
                             break;
                         }
                     default:
-                        att == "font-size" && (value = win[pi](value, 10) + "px");
-                        var cssrule = att.replace(/(\-.)/g, function (w) {
+                        att == "font-size" && (value = toInt(value, 10) + "px");
+                        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) && o.rotate(rot, true);
+            toInt(rot, 10) && 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, "").getPropertyValue("font-size"), 10) : 10;
+                fontSize = node.firstChild ? toInt(doc.defaultView.getComputedStyle(node.firstChild, E).getPropertyValue("font-size"), 10) : 10;
 
             if ("text" in params) {
                 while (node.firstChild) {
                     node.removeChild(node.firstChild);
                 }
-                var texts = (params.text + "").split("\n");
-                for (var i = 0, ii = texts[ln]; i < ii; i++) {
+                var texts = (params.text + E)[split]("\n");
+                for (var i = 0, ii = texts[length]; i < ii; i++) {
                     var tspan = $("tspan");
                     i && $(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("tspan");
-                for (var i = 0, ii = texts[ln]; i < ii; i++) {
+                for (var i = 0, ii = texts[length]; i < ii; i++) {
                     i && $(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(" ");
+                    return [this._.rt.deg, this._.rt.cx, this._.rt.cy][join](" ");
                 }
                 return this._.rt.deg;
             }
             var bbox = this.getBBox();
-            deg = (deg + "").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("rotate({0} {1} {2})", this._.rt.deg, cx, cy);
                 this.clip && $(this.clip, {transform: R.format("rotate({0} {1} {2})", -this._.rt.deg, cx, cy)});
             } else {
-                this.transformations[0] = "";
-                this.clip && $(this.clip, {transform: ""});
+                this.transformations[0] = E;
+                this.clip && $(this.clip, {transform: E});
             }
-            $(this.node, {transform: this.transformations.join(" ")});
+            $(this.node, {transform: this.transformations[join](" ")});
             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 == "path") {
@@ -1243,18 +1254,19 @@ window.Raphael = (function () {
                 bbox = bbox || {};
             }
             if (this.type == "text") {
-                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 < ii; i++) {
                     var bb = this.node.getExtentOfChar(i);
                     (bb.y < bbox.y) && (bbox.y = bb.y);
                     (bb.y + bb.height - bbox.y > bbox.height) && (bbox.height = bb.y + bb.height - bbox.y);
+                    (bb.x + bb.width - bbox.x > bbox.width) && (bbox.width = bb.x + bb.width - bbox.x);
                 }
             }
             hide && this.hide();
             return bbox;
         };
         Element[proto].attr = function () {
-            if (arguments[ln] == 1 && R.is(arguments[0], "string")) {
+            if (arguments[length] == 1 && R.is(arguments[0], "string")) {
                 if (arguments[0] == "translation") {
                     return this.translate();
                 }
@@ -1266,24 +1278,24 @@ window.Raphael = (function () {
                 }
                 return this.attrs[arguments[0]];
             }
-            if (arguments[ln] == 1 && R.is(arguments[0], "array")) {
+            if (arguments[length] == 1 && R.is(arguments[0], "array")) {
                 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 && R.is(arguments[0], "object")) {
+            } else if (arguments[length] == 1 && R.is(arguments[0], "object")) {
                 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 = $("circle");
-            svg.canvas && svg.canvas.appendChild(el);
+            svg.canvas && svg.canvas[appendChild](el);
             var res = new Element(el, svg);
             res.attrs = {cx: x, cy: y, r: r, fill: "none", stroke: "#000"};
             res.type = "circle";
@@ -1321,7 +1333,7 @@ window.Raphael = (function () {
             x = round(x);
             y = round(y);
             var el = $("rect");
-            svg.canvas && svg.canvas.appendChild(el);
+            svg.canvas && 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: "none", stroke: "#000"};
             res.type = "rect";
@@ -1332,7 +1344,7 @@ window.Raphael = (function () {
             x = round(x);
             y = round(y);
             var el = $("ellipse");
-            svg.canvas && svg.canvas.appendChild(el);
+            svg.canvas && svg.canvas[appendChild](el);
             var res = new Element(el, svg);
             res.attrs = {cx: x, cy: y, rx: rx, ry: ry, fill: "none", stroke: "#000"};
             res.type = "ellipse";
@@ -1343,7 +1355,7 @@ window.Raphael = (function () {
             var el = $("image");
             $(el, {x: x, y: y, width: w, height: h, preserveAspectRatio: "none"});
             el.setAttributeNS(svg.xlink, "href", src);
-            svg.canvas && svg.canvas.appendChild(el);
+            svg.canvas && svg.canvas[appendChild](el);
             var res = new Element(el, svg);
             res.attrs = {x: x, y: y, width: w, height: h, src: src};
             res.type = "image";
@@ -1352,7 +1364,7 @@ window.Raphael = (function () {
         var theText = function (svg, x, y, text) {
             var el = $("text");
             $(el, {x: x, y: y, "text-anchor": "middle"});
-            svg.canvas && svg.canvas.appendChild(el);
+            svg.canvas && svg.canvas[appendChild](el);
             var res = new Element(el, svg);
             res.attrs = {x: x, y: y, "text-anchor": "middle", text: text, font: availableAttrs.font, stroke: "none", fill: "#000"};
             res.type = "text";
@@ -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("width", this.width);
-            this.canvas.setAttribute("height", this.height);
+            this.canvas[setAttribute]("width", this.width);
+            this.canvas[setAttribute]("height", this.height);
             return this;
         };
         var create = function () {
-            var con = getContainer[ap](null, arguments),
+            var con = getContainer[apply](null, arguments),
                 container = con && con.container,
                 x = con.x,
                 y = con.y,
@@ -1377,96 +1389,101 @@ window.Raphael = (function () {
                 throw new Error("SVG container not found.");
             }
             paper.canvas = $("svg");
-            var cnvs = paper.canvas,
-                stl = cnvs.style;
-            cnvs.setAttribute("width", width || 512);
+            var cnvs = paper.canvas;
             paper.width = width || 512;
-            cnvs.setAttribute("height", height || 342);
             paper.height = height || 342;
+            cnvs[setAttribute]("width", paper.width);
+            cnvs[setAttribute]("height", paper.height);
             if (container == 1) {
-                doc.body.appendChild(cnvs);
-                stl.position = "absolute";
-                stl.left = x + "px";
-                stl.top = y + "px";
+                cnvs.style.cssText = "position:absolute;left:" + x + "px;top:" + y + "px";
+                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 = $("desc");
-                    this.defs = $("defs");
-                    this.desc.appendChild(doc.createTextNode("Created with Rapha\u00ebl"));
-                    this.canvas.appendChild(this.desc);
-                    this.canvas.appendChild(this.defs);
-                }
-            };
-            for (var prop in paper) if (paper.hasOwnProperty(prop)) {
-                if (prop != "create") {
-                    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 = $("desc"))[appendChild](doc.createTextNode("Created with Rapha\u00ebl"));
+            c[appendChild](this.desc);
+            c[appendChild](this.defs = $("defs"));
+        };
         paper.remove = function () {
             this.canvas.parentNode && 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 < ii; i++) {
-                pa[i][0] = (pa[i][0] + "").toLowerCase();
-                pa[i][0] == "z" && (pa[i][0] = "x");
-                for (var j = 1, jj = pa[i][ln]; j < jj; j++) {
-                    pa[i][j] = ~~(pa[i][j] + .5);
+            var total =  /[ahqtv]/ig,
+                command = pathToAbsolute;
+            (path + E).match(total) && (command = path2curve);
+            total =  /[clmz]/g;
+            if (command == pathToAbsolute && !(path + E).match(total)) {
+                var map = {M: "m", L: "l", C: "c", Z: "x", m: "t", l: "r", c: "v", z: "x"},
+                    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 < ii; i++) {
+                p = pa[i];
+                r = (pa[i][0] + E).toLowerCase();
+                r == "z" && (r = "x");
+                for (var j = 1, jj = p[length]; j < jj; j++) {
+                    r += round(p[j]) + (j != jj - 1 ? "," : E);
                 }
+                res[push](r);
             }
-            return (pa + "");
+            return res[join](" ");
         };
-        R.toString = function () {
-            return  "Your browser doesn\u2019t support SVG. Assuming it is Internet Explorer and falling down to VML.\nYou are running Rapha\u00ebl " + this.version;
+        
+        R[toString] = function () {
+            return  "Your browser doesn\u2019t support SVG. Falling down to VML.\nYou are running Rapha\u00ebl " + this.version;
         };
         var thePath = function (pathString, VML) {
-            var g = createNode("group"), gl = g.style;
-            gl.position = "absolute";
-            gl.left = 0;
-            gl.top = 0;
-            gl.width = VML.width + "px";
-            gl.height = VML.height + "px";
+            var g = createNode("group");
+            g.style.cssText = "position:absolute;left:0;top:0;width:" + VML.width + "px;height:" + VML.height + "px";
             g.coordsize = VML.coordsize;
             g.coordorigin = VML.coordorigin;
             var el = createNode("shape"), ol = el.style;
             ol.width = VML.width + "px";
             ol.height = VML.height + "px";
-            el.path = "";
             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 = "path";
             p.path = [];
-            p.Path = "";
-            if (pathString) {
-                p.attrs.path = R.parsePathString(pathString);
-                p.node.path = path2vml(p.attrs.path);
-            }
-            setFillAndStroke(p, {fill: "none", stroke: "#000"});
-            p.setBox();
-            VML.canvas.appendChild(g);
+            p.Path = E;
+            pathString && setFillAndStroke(p, {fill: "none", stroke: "#000", 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 && (node.href = params.href);
             params.title && (node.title = params.title);
             params.target && (node.target = params.target);
             if (params.path && o.type == "path") {
-                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 + "").split(separator);
+                xy = (params.translation + E)[split](separator);
                 o.translate(xy[0], xy[1]);
             }
             if (params.scale) {
-                xy = (params.scale + "").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 ("clip-rect" in params) {
-                var rect = (params["clip-rect"] + "").split(separator);
-                if (rect[ln] == 4) {
+                var rect = (params["clip-rect"] + 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("div"),
@@ -1513,12 +1531,12 @@ window.Raphael = (function () {
                         dstyle.width = o.paper.width + "px";
                         dstyle.height = o.paper.height + "px";
                         group.parentNode.insertBefore(div, group);
-                        div.appendChild(group);
+                        div[appendChild](group);
                         node.clipRect = div;
                     }
                 }
                 if (!params["clip-rect"]) {
-                    node.clipRect && (node.clipRect.style.clip = "");
+                    node.clipRect && (node.clipRect.style.clip = E);
                 }
             }
             if (o.type == "image" && params.src) {
@@ -1526,10 +1544,10 @@ window.Raphael = (function () {
             }
             if (o.type == "image" && params.opacity) {
                 node.filterOpacity = " progid:DXImageTransform.Microsoft.Alpha(opacity=" + (params.opacity * 100) + ")";
-                s.filter = (node.filterMatrix || "") + (node.filterOpacity || "");
+                s.filter = (node.filterMatrix || E) + (node.filterOpacity || E);
             }
             params.font && (s.font = params.font);
-            params["font-family"] && (s.fontFamily = '"' + params["font-family"].split(",")[0].replace(/^['"]+|['"]+$/g, "") + '"');
+            params["font-family"] && (s.fontFamily = '"' + params["font-family"][split](",")[0][rp](/^['"]+|['"]+$/g, E) + '"');
             params["font-size"] && (s.fontSize = params["font-size"]);
             params["font-weight"] && (s.fontWeight = params["font-weight"]);
             params["font-style"] && (s.fontStyle = params["font-style"]);
@@ -1565,15 +1583,15 @@ window.Raphael = (function () {
                         fill.type = "tile";
                     } else {
                         fill.color = R.getRGB(params.fill).hex;
-                        fill.src = "";
+                        fill.src = E;
                         fill.type = "solid";
-                        if (R.getRGB(params.fill).error && (res.type in {circle: 1, ellipse: 1} || (params.fill + "").charAt(0) != "r") && addGradientFill(res, params.fill)) {
+                        if (R.getRGB(params.fill).error && (res.type in {circle: 1, ellipse: 1} || (params.fill + E).charAt(0) != "r") && addGradientFill(res, params.fill)) {
                             a.fill = "none";
                             a.gradient = params.fill;
                         }
                     }
                 }
-                newfill && node.appendChild(fill);
+                newfill && node[appendChild](fill);
                 var stroke = (node.getElementsByTagName("stroke") && node.getElementsByTagName("stroke")[0]),
                 newstroke = false;
                 !stroke && (newstroke = stroke = createNode("stroke"));
@@ -1595,7 +1613,7 @@ window.Raphael = (function () {
                 params["stroke-linejoin"] && (stroke.joinstyle = params["stroke-linejoin"] || "miter");
                 stroke.miterlimit = params["stroke-miterlimit"] || 8;
                 params["stroke-linecap"] && (stroke.endcap = {butt: "flat", square: "square", round: "round"}[params["stroke-linecap"]] || "miter");
-                params["stroke-width"] && (stroke.weight = (win[pf](params["stroke-width"]) || 1) * 12 / 16);
+                params["stroke-width"] && (stroke.weight = (toFloat(params["stroke-width"]) || 1) * 12 / 16);
                 if (params["stroke-dasharray"]) {
                     var dasharray = {
                         "-": "shortdash",
@@ -1609,9 +1627,9 @@ window.Raphael = (function () {
                         "--.": "longdashdot",
                         "--..": "longdashdotdot"
                     };
-                    stroke.dashstyle = dasharray[params["stroke-dasharray"]] || "";
+                    stroke.dashstyle = dasharray[params["stroke-dasharray"]] || E;
                 }
-                newstroke && node.appendChild(stroke);
+                newstroke && node[appendChild](stroke);
             }
             if (res.type == "text") {
                 var s = res.paper.span.style;
@@ -1620,21 +1638,21 @@ window.Raphael = (function () {
                 a["font-size"] && (s.fontSize = a["font-size"]);
                 a["font-weight"] && (s.fontWeight = a["font-weight"]);
                 a["font-style"] && (s.fontStyle = a["font-style"]);
-                res.node.string && (res.paper.span.innerHTML = res.node.string.replace(/</g, "&#60;").replace(/&/g, "&#38;").replace(/\n/g, "<br>"));
+                res.node.string && (res.paper.span.innerHTML = (res.node.string + E)[rp](/</g, "&#60;")[rp](/&/g, "&#38;")[rp](/\n/g, "<br>"));
                 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["text-anchor"]) {
                     case "start":
                         res.node.style["v-text-align"] = "left";
-                        res.bbx = ~~(res.W / 2 + .5);
+                        res.bbx = round(res.W / 2);
                     break;
                     case "end":
                         res.node.style["v-text-align"] = "right";
-                        res.bbx = -~~(res.W / 2 + .5);
+                        res.bbx = -round(res.W / 2);
                     break;
                     default:
                         res.node.style["v-text-align"] = "center";
@@ -1649,22 +1667,22 @@ window.Raphael = (function () {
                 type = "linear",
                 fxfy = ".5 .5";
             o.attrs.gradient = gradient;
-            gradient = (gradient + "").replace(/^r(?:\(([^,]+?)\s*,\s*([^\)]+?)\))?/, function (all, fx, fy) {
+            gradient = (gradient + E)[rp](/^r(?:\(([^,]+?)\s*,\s*([^\)]+?)\))?/, function (all, fx, fy) {
                 type = "radial";
                 if (fx && fy) {
-                    fx = win[pf](fx);
-                    fy = win[pf](fy);
-                    if (Math.pow(fx - .5, 2) + Math.pow(fy - .5, 2) > .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) > .25) {
+                        fy = Math.sqrt(.25 - pow(fx - .5, 2)) + .5;
                     }
                     fxfy = fx + " " + fy;
                 }
-                return "";
+                return E;
             });
-            gradient = gradient.split(/\s*\-\s*/);
+            gradient = gradient[split](/\s*\-\s*/);
             if (type == "linear") {
                 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("fill");
-            if (dots[ln]) {
+            if (dots[length]) {
                 fill.on = true;
                 fill.method = "none";
                 fill.type = (type == "radial") ? "gradientradial" : "gradient";
                 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 < ii; i++) {
-                    dots[i].offset && clrs.push(dots[i].offset + " " + dots[i].color);
+                for (var i = 0, ii = dots[length]; i < ii; i++) {
+                    dots[i].offset && clrs[push](dots[i].offset + " " + dots[i].color);
                 }
-                if (clrs[ln] && fill.colors) {
-                    fill.colors.value = clrs.join(",");
+                if (clrs[length] && fill.colors) {
+                    fill.colors.value = clrs[join](",");
                 } else {
                     fill.colors.value = "0% " + 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(" ");
+                    return [this._.rt.deg, this._.rt.cx, this._.rt.cy][join](" ");
                 }
                 return this._.rt.deg;
             }
-            deg = (deg + "").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 && 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 "rect":
                 case "image":
-                    x = attr.x;
-                    y = attr.y;
+                    x = +attr.x;
+                    y = +attr.y;
                     w = attr.width || 0;
                     h = attr.height || 0;
                     break;
                 case "text":
-                    this.textpath.v = ["m", ~~(attr.x + .5), ", ", ~~(attr.y - 2 + .5), "l", ~~(attr.x + .5) + 1, ", ", ~~(attr.y - 2 + .5)].join("");
-                    x = attr.x - ~~(this.W / 2 + .5);
+                    this.textpath.v = ["m", round(attr.x), ", ", round(attr.y - 2), "l", round(attr.x) + 1, ", ", 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 + "px") && (os.top = y - top + "px");
                 (os.width != w + "px") && (os.width = w + "px");
                 (os.height != h + "px") && (os.height = h + "px");
-                var arcsize = (+params.r || 0) / (Math.min(w, h));
+                var arcsize = (+params.r || 0) / (mmin(w, h));
                 if (this.type == "rect" && this.arcsize != arcsize && (arcsize || this.arcsize)) {
                     // We should replace element with the new one
                     var o = createNode(arcsize ? "roundrect" : "rect");
                     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 && this.shape.parentNode.removeChild(this.shape);
+            for (var i in this) {
+                delete this[i];
+            }
         };
         Element[proto].attr = function () {
-            if (arguments[ln] == 1 && R.is(arguments[0], "string")) {
+            if (arguments[length] == 1 && R.is(arguments[0], "string")) {
                 if (arguments[0] == "translation") {
                     return this.translate();
                 }
@@ -1889,23 +1910,23 @@ window.Raphael = (function () {
                 }
                 return this.attrs[arguments[0]];
             }
-            if (this.attrs && arguments[ln] == 1 && R.is(arguments[0], "array")) {
+            if (this.attrs && arguments[length] == 1 && R.is(arguments[0], "array")) {
                 var values = {};
-                for (var i = 0, ii = arguments[0][ln]; i < ii; i++) {
+                for (var i = 0, ii = arguments[0][length]; i < 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 && R.is(arguments[0], "object")) {
+            if (arguments[length] == 1 && R.is(arguments[0], "object")) {
                 params = arguments[0];
             }
             if (params) {
-                if (params.gradient && (this.type in {circle: 1, ellipse: 1} || (params.gradient + "").charAt(0) != "r")) {
+                if (params.gradient && (this.type in {circle: 1, ellipse: 1} || (params.gradient + E).charAt(0) != "r")) {
                     addGradientFill(this, params.gradient);
                 }
                 if (params.text && this.type == "text") {
@@ -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 = "position:absolute;left:0;top:0;width:" + vml.width + "px;height:" + vml.height + "px";
             g.coordsize = vml.coordsize;
             g.coordorigin = vml.coordorigin;
-            g.appendChild(o);
+            g[appendChild](o);
             var res = new Element(o, g, vml);
             res.type = "circle";
             setFillAndStroke(res, {stroke: "#000", fill: "none"});
@@ -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("group"),
                 o = createNode(r ? "roundrect" : "rect"),
-                arcsize = (+r || 0) / (Math.min(w, h));
+                arcsize = (+r || 0) / (mmin(w, h));
             o.arcsize = arcsize;
             g.style.cssText = "position:absolute;left:0;top:0;width:" + vml.width + "px;height:" + vml.height + "px";
             g.coordsize = vml.coordsize;
             g.coordorigin = vml.coordorigin;
-            g.appendChild(o);
+            g[appendChild](o);
             var res = new Element(o, g, vml);
             res.type = "rect";
             setFillAndStroke(res, {stroke: "#000"});
             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 = "position:absolute;left:0;top:0;width:" + vml.width + "px;height:" + vml.height + "px";
             g.coordsize = vml.coordsize;
             g.coordorigin = vml.coordorigin;
-            g.appendChild(o);
+            g[appendChild](o);
             var res = new Element(o, g, vml);
             res.type = "ellipse";
             setFillAndStroke(res, {stroke: "#000"});
@@ -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 = "image";
             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 = "position:absolute;left:0;top:0;width:" + vml.width + "px;height:" + vml.height + "px";
             g.coordsize = vml.coordsize;
             g.coordorigin = vml.coordorigin;
-            path.v = R.format("m{0},{1}l{2},{1}", ~~(x + .5), ~~(y + .5), ~~(x + .5) + 1);
+            path.v = R.format("m{0},{1}l{2},{1}", 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: "none", fill: "#000"});
             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 + "px";
             cs.height = this.height + "px";
             cs.clip = "rect(0 " + this.width + "px " + this.height + "px 0)";
@@ -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("div"),
                 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 + " " + height;
             res.coordorigin = "0 0";
             res.span = doc.createElement("span");
             res.span.style.cssText = "position:absolute;left:-9999px;top:-9999px;padding:0;margin:0;line-height:1;display:inline;";
-            c.appendChild(res.span);
+            c[appendChild](res.span);
             cs.cssText = R.format("width:{0}px;height:{1}px;position:absolute;clip:rect(0 {0}px {1}px 0)", width, height);
             if (container == 1) {
-                doc.body.appendChild(c);
+                doc.body[appendChild](c);
                 cs.left = x + "px";
                 cs.top = y + "px";
                 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, "function")) {
                     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 &&
                 this.events[eventName] &&
                 this.events[eventName][fn] &&
-                this.events[eventName][fn][ln] &&
+                this.events[eventName][fn][length] &&
                 this.events[eventName][fn].shift()() &&
-                !this.events[eventName][fn][ln] &&
+                !this.events[eventName][fn][length] &&
                 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 && !R.is(pathString, "string") && !R.is(pathString[0], "array") && (pathString += "");
-        return thePath(R.format[ap](R, arguments), this);
+        pathString && !R.is(pathString, "string") && !R.is(pathString[0], "array") && (pathString += E);
+        return thePath(R.format[apply](R, arguments), this);
     };
     paper.image = function (src, x, y, w, h) {
         return theImage(this, src || "about:blank", x || 0, y || 0, w || 0, h || 0);
     };
     paper.text = function (x, y, text) {
-        return theText(this, x || 0, y || 0, text || "");
+        return theText(this, x || 0, y || 0, text || E);
     };
     paper.set = function (itemsArray) {
-        arguments[ln] > 1 && (itemsArray = Array[proto].splice.call(arguments, 0, arguments[ln]));
+        arguments[length] > 1 && (itemsArray = Array[proto].splice.call(arguments, 0, arguments[length]));
         return new Set(itemsArray);
     };
     paper.setSize = setSize;
@@ -2258,7 +2282,7 @@ window.Raphael = (function () {
                 case "image":
                     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 "path":
                     var path = pathToRelative(a.path),
                         skip = true;
-                    for (var i = 0, ii = path[ln]; i < ii; i++) {
+                    for (var i = 0, ii = path[length]; i < ii; i++) {
                         var p = path[i];
                         if (p[0].toUpperCase() == "M" && skip) {
                             continue;
@@ -2290,13 +2314,13 @@ window.Raphael = (function () {
                             skip = false;
                         }
                         if (R.svg && p[0].toUpperCase() == "A") {
-                            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 < jj; j++) {
+                            for (var j = 1, jj = p[length]; j < jj; j++) {
                                 p[j] *= (j % 2) ? kx : ky;
                             }
                         }
@@ -2312,31 +2336,31 @@ window.Raphael = (function () {
             }
             if (this.type in {text: 1, image:1} && (dirx != 1 || diry != 1)) {
                 if (this.transformations) {
-                    this.transformations[2] = "scale(".concat(dirx, ",", diry, ")");
-                    this.node.setAttribute("transform", this.transformations.join(" "));
+                    this.transformations[2] = "scale("[concat](dirx, ",", diry, ")");
+                    this.node[setAttribute]("transform", this.transformations[join](" "));
                     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 = " progid:DXImageTransform.Microsoft.Matrix(M11=".concat(dirx,
+                    this.node.filterMatrix = " progid:DXImageTransform.Microsoft.Matrix(M11="[concat](dirx,
                         ", M12=0, M21=0, M22=", diry,
                         ", Dx=0, Dy=0, sizingmethod='auto expand', filtertype='bilinear')");
-                    s.filter = (this.node.filterMatrix || "") + (this.node.filterOpacity || "");
+                    s.filter = (this.node.filterMatrix || E) + (this.node.filterOpacity || E);
                 }
             } else {
                 if (this.transformations) {
-                    this.transformations[2] = "";
-                    this.node.setAttribute("transform", this.transformations.join(" "));
+                    this.transformations[2] = E;
+                    this.node[setAttribute]("transform", this.transformations[join](" "));
                     a.fx = 0;
                     a.fy = 0;
                 } else {
-                    this.node.filterMatrix = "";
-                    s.filter = (this.node.filterMatrix || "") + (this.node.filterOpacity || "");
+                    this.node.filterMatrix = E;
+                    s.filter = (this.node.filterMatrix || E) + (this.node.filterOpacity || E);
                 }
             }
-            a.scale = [x, y, cx, cy].join(" ");
+            a.scale = [x, y, cx, cy][join](" ");
             this._.sx = x;
             this._.sy = y;
         }
@@ -2349,18 +2373,18 @@ window.Raphael = (function () {
             return n;
         },
         "<": function (n) {
-            return Math.pow(n, 3);
+            return pow(n, 3);
         },
         ">": function (n) {
-            return Math.pow(n - 1, 3) + 1;
+            return pow(n - 1, 3) + 1;
         },
         "<>": function (n) {
             n = n * 2;
             if (n < 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) && (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 < ii; i++) {
+                        for (var i = 0, ii = from[attr][length]; i < ii; i++) {
                             diff[attr][i] = [0];
-                            for (var j = 1, jj = from[attr][i][ln]; j < jj; j++) {
+                            for (var j = 1, jj = from[attr][i][length]; j < jj; j++) {
                                 diff[attr][i][j] = (to[attr][i][j] - from[attr][i][j]) / ms;
                             }
                         }
                         break;
                     case "csv":
-                        var values = (params[attr] + "").split(separator),
-                            from2 = (from[attr] + "").split(separator);
+                        var values = (params[attr] + E)[split](separator),
+                            from2 = (from[attr] + E)[split](separator);
                         switch (attr) {
                             case "translation":
                                 from[attr] = [0, 0];
@@ -2456,11 +2480,11 @@ window.Raphael = (function () {
                             break;
                             case "scale":
                                 params[attr] = values;
-                                from[attr] = (from[attr] + "").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 "clip-rect":
-                                from[attr] = (from[attr] + "").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 < 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 "number":
                             now = +from[attr] + pos * ms * diff[attr];
                             break;
                         case "colour":
                             now = "rgb(" + [
-                                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(",") + ")";
+                                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](",") + ")";
                             break;
                         case "path":
                             now = [];
-                            for (var i = 0, ii = from[attr][ln]; i < ii; i++) {
+                            for (var i = 0, ii = from[attr][length]; i < ii; i++) {
                                 now[i] = [from[attr][i][0]];
-                                for (var j = 1, jj = from[attr][i][ln]; j < jj; j++) {
+                                for (var j = 1, jj = from[attr][i][length]; j < jj; j++) {
                                     now[i][j] = +from[attr][i][j] + pos * ms * diff[attr][i][j];
                                 }
-                                now[i] = now[i].join(" ");
+                                now[i] = now[i][join](" ");
                             }
-                            now = now.join(" ");
+                            now = now[join](" ");
                             break;
                         case "csv":
                             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(" ");
+                                    now = x + " " + y;
                                 break;
                                 case "rotation":
                                     now = +from[attr][0] + pos * ms * diff[attr][0];
                                     from[attr][1] && (now += "," + from[attr][1] + "," + from[attr][2]);
                                 break;
                                 case "scale":
-                                    now = [+from[attr][0] + pos * ms * diff[attr][0], +from[attr][1] + pos * ms * diff[attr][1], (2 in params[attr] ? params[attr][2] : ""), (3 in params[attr] ? params[attr][3] : "")].join(" ");
+                                    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](" ");
                                 break;
                                 case "clip-rect":
                                     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 && paper.safari();
             } else {
                 (t.x || t.y) && that.translate(-t.x, -t.y);
+                params.scale && (params.scale = params.scale + E);
                 that.attr(params);
                 clearTimeout(that.animation_in_progress);
                 R.svg && paper.safari();
@@ -2574,7 +2599,7 @@ window.Raphael = (function () {
         }
         return this;
     };
-    Element[proto].toString = function () {
+    Element[proto][toString] = function () {
         return "Rapha\u00ebl\u2019s object";
     };
     
@@ -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 < ii; i++) {
+            for (var i = 0, ii = items[length]; i < ii; i++) {
                 if (items[i] && (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 < ii; i++) {
+        for (var i = 0, ii = arguments[length]; i < ii; i++) {
             item = arguments[i];
             if (item && (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 < ii; i++) {
-                    this.items[i][methodname][ap](this.items[i], arguments);
+                for (var i = 0, ii = this.items[length]; i < 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 && R.is(name, "array") && R.is(name[0], "object")) {
-            for (var j = 0, jj = name[ln]; j < jj; j++) {
+            for (var j = 0, jj = name[length]; j < jj; j++) {
                 this.items[j].attr(name[j]);
             }
         } else {
-            for (var i = 0, ii = this.items[ln]; i < ii; i++) {
-                this.items[i].attr[ap](this.items[i], arguments);
+            for (var i = 0, ii = this.items[length]; i < ii; i++) {
+                this.items[i].attr[apply](this.items[i], arguments);
             }
         }
         return this;
@@ -2635,7 +2660,7 @@ window.Raphael = (function () {
         if (R.is(easing, "function") || !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["font-family"];
-        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["units-per-em"] = win[pi](font.face["units-per-em"], 10);
-            for (var glyph in font.glyphs) if (font.glyphs.hasOwnProperty(glyph)) {
+            fontcopy.face["units-per-em"] = toInt(font.face["units-per-em"], 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 && "M" + path.d.replace(/[mlcxtrv]/g, function (command) {
+                    d: path.d && "M" + path.d[rp](/[mlcxtrv]/g, function (command) {
                             return {l: "L", c: "C", x: "z", t: "m", r: "l", v: "c"}[command] || "M";
                         }) + "z"
                 };
                 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("(^|\\s)" + family.replace(/[^\w\d\s+!~.:_-]/g, "") + "(\\s|$)", "i");
-            for (var fontName in R.fonts) if (R.fonts.hasOwnProperty(fontName)) {
+            var name = new RegExp("(^|\\s)" + family[rp](/[^\w\d\s+!~.:_-]/g, E) + "(\\s|$)", "i");
+            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 < ii; i++) {
+            for (var i = 0, ii = font[length]; i < ii; i++) {
                 thefont = font[i];
                 if (thefont.face["font-weight"] == weight && (thefont.face["font-style"] == style || !thefont.face["font-style"]) && thefont.face["font-stretch"] == stretch) {
                     break;
@@ -2741,18 +2766,18 @@ window.Raphael = (function () {
     };
     paper.print = function (x, y, string, font, size) {
         var out = this.set(),
-            letters = (string + "").split(""),
+            letters = (string + E)[split](E),
             shift = 0,
-            path = "",
+            path = E,
             scale;
         R.is(font, "string") && (font = this.getFont(font));
         if (font) {
             scale = (size || 16) / font.face["units-per-em"];
-            for (var i = 0, ii = letters[ln]; i < ii; i++) {
+            for (var i = 0, ii = letters[length]; i < ii; i++) {
                 var prev = i && font.glyphs[letters[i - 1]] || {},
                     curr = font.glyphs[letters[i]];
                 shift += i ? (prev.w || font.w) + (prev.k && prev.k[letters[i]] || 0) : 0;
-                curr && curr.d && out.push(this.path(curr.d).attr({fill: "#000", stroke: "none", translation: [shift, 0]}));
+                curr && curr.d && out[push](this.path(curr.d).attr({fill: "#000", stroke: "none", 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], "array") ? [0].concat(arguments[1]) : arguments;
-        token && R.is(token, "string") && args[ln] - 1 && (token = token.replace(/\{(\d+)\}/g, function (str, i) {
-            return args[++i] == null ? "" : args[i];
+        var args = R.is(arguments[1], "array") ? [0][concat](arguments[1]) : arguments;
+        token && R.is(token, "string") && args[length] - 1 && (token = token[rp](/\{(\d+)\}/g, function (str, i) {
+            return args[++i] == null ? E : args[i];
         }));
-        return token || "";
+        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;
index a5a83ed..7c86d4f 100644 (file)
@@ -2,18 +2,26 @@
    "http://www.w3.org/TR/html4/strict.dtd">
 <html lang="en">
     <head>
-        <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
         <title>Raphaël Reference</title>
+        <meta http-equiv="content-language" content="en">
+        <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
         <meta name="author" content="Dmitry Baranovskiy">
-        <meta name="description" content="Vector Graphics JavaScript™ Library">
+        <meta name="description" content="Vector Graphics JavaScript Library">
+        <meta name="keywords" content="JavaScript Library, Raphael, SVG, VML">
+        <meta name="viewport" content="width=450; user-scalable=no">
+        <link rel="shortcut icon" href="/favicon16.png" type="image/x-icon">
         <link rel="stylesheet" href="raphael.css" type="text/css" charset="utf-8" media="screen,projection">
-        <link rel="stylesheet" type="text/css" media="print" href="/dmitry-print.css">
+        <link rel="stylesheet" type="text/css" media="print" href="print.css">
         <link rel="shortcut icon" href="/favicon16.png" type="image/x-icon">
-        <link rel="apple-touch-icon" href="/favicon.png">
-        <script src="../jquery.js" type="text/javascript" charset="utf-8"></script>
-        <script src="../dmitry.js" type="text/javascript" charset="utf-8"></script>
+        <link media="only screen and (max-device-width: 480px)" href="iphone.css" type="text/css" rel="stylesheet">
+        <script src="jquery.js" type="text/javascript" charset="utf-8"></script>
+        <script src="dmitry.js" type="text/javascript" charset="utf-8"></script>
+        <script src="raphael.js" type="text/javascript" charset="utf-8"></script>
+        <script src="museo.js" type="text/javascript" charset="utf-8"></script>
+
+
     </head>
-    <body class="raphael" id="raphael.dmitry.baranovskiy.com">
+    <body class="raphael" id="reference">
         <div id="header">
             <a href="http://twitter.com/statuses/user_timeline/17180567.atom" id="rss" name="rss">rss</a>
             <h1>
@@ -67,6 +75,17 @@ var paper = Raphael("notepad", 320, 200);</code></pre>
                         <h4>Usage</h4>
                         <pre class="javascript code"><code>var c = paper.circle(10, 10, 10); // draw a circle at coordinate 10,10 with radius of 10
 c.node.onclick = function () { c.attr("fill", "red"); };</code></pre>
+                        <h3 id="paper">
+                            paper
+                        </h3>
+                        <p>
+                            Internal reference to “paper” where object drawn. Mainly for use in plugins and element extensions.
+                        </p>
+                        <h4>Usage</h4>
+                        <pre class="javascript code"><code>Raphael.el.cross = function () {
+    this.attr({fill: "red"});
+    this.paper.path("M10,10L50,50M50,10L10,50").attr({stroke: "red"});
+}</code></pre>
                         <h3 id="remove">
                             remove
                         </h3>
@@ -139,6 +158,8 @@ c.translate(10, 10); // moves the circle down the canvas, in a diagonal line</co
                         <ol>
                             <li>Xtimes <em>number</em> Amount to scale horizontally</li>
                             <li>Ytimes <em>number</em> Amount to scale vertically</li>
+                            <li>centerX <em>number</em> [optional] X of the center of scaling, default is the center of the element</li>
+                            <li>centerY <em>number</em> [optional] Y of the center of scaling, default is the center of the element</li>
                         </ol>
                         <h4>Usage</h4>
                         <pre class="javascript code"><code>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</code></pre
                         <h4>Possible parameters</h4>
                         <p>Please refer to the <a href="http://www.w3.org/TR/SVG/" title="The W3C Recommendation for the SVG language describes these properties in detail.">SVG specification</a> for an explanation of these parameters.</p>
                         <ul>
+                            <li>clip-rect <em>string</em> comma or space separated values: x, y, width and height</li>
                             <li>cx <em>number</em></li>
                             <li>cy <em>number</em></li>
                             <li>fill <em>colour</em></li>
@@ -178,24 +200,24 @@ c.scale(.5, .75);  // makes the circle half as wide, and 75% as high</code></pre
                             <li>font-family <em>string</em></li>
                             <li>font-size <em>number</em></li>
                             <li>font-weight <em>string</em></li>
-                            <li>gradient <em>object|string</em> "‹angle›-‹colour›[-‹colour›[:‹offset›]]*-‹colour›"</li>
+                            <li>gradient <em>string</em> “‹angle›-‹colour›[-‹colour›[:‹offset›]]*-‹colour›”, example: <samp>"90-#fff-#000"</samp> or <samp>"0-#fff-#f00:20-#000"</samp></li>
                             <li>height <em>number</em></li>
                             <li>opacity <em>number</em></li>
-                            <li>path <em>pathString</em></li>
+                            <li>path <em>pathString</em> <a href="http://www.w3.org/TR/SVG/paths.html#PathData" title="Details of a path’s data attribute’s format are described in the SVG specification.">SVG path string format</a></li>
                             <li>r <em>number</em></li>
                             <li>rotation <em>number</em></li>
                             <li>rx <em>number</em></li>
                             <li>ry <em>number</em></li>
-                            <li>scale <em>CSV</em></li>
+                            <li>scale <em>string</em> comma or space separated values: xtimes, ytimes, cx, cy. See: <a href="#scale">scale</a></li>
                             <li>src <em>string</em> (URL)</li>
                             <li>stroke <em>colour</em></li>
-                            <li>stroke-dasharray <em>string</em> [“-”, “.”, “-.”, “-..”, “. ”, “- ”, “--”, “- .”, “--.”, “--..”]</li>
+                            <li>stroke-dasharray <em>string</em> [“”, “-”, “.”, “-.”, “-..”, “. ”, “- ”, “--”, “- .”, “--.”, “--..”]</li>
                             <li>stroke-linecap <em>string</em> [“butt”, “square”, “round”, “miter”]</li>
                             <li>stroke-linejoin <em>string</em> [“butt”, “square”, “round”, “miter”]</li>
                             <li>stroke-miterlimit <em>number</em></li>
                             <li>stroke-opacity <em>number</em></li>
                             <li>stroke-width <em>number</em></li>
-                            <li>translation <em>CSV</em></li>
+                            <li>translation <em>string</em> comma or space separated values: x and y</li>
                             <li>width <em>number</em></li>
                             <li>x <em>number</em></li>
                             <li>y <em>number</em></li>
@@ -203,12 +225,13 @@ c.scale(.5, .75);  // makes the circle half as wide, and 75% as high</code></pre
                         <h4>Usage</h4>
                         <pre class="javascript code"><code>var c = paper.circle(10, 10, 10);
 c.attr("fill", "black");                              // using strings
-c.attr({fill: "#000", stroke: "#f00", opacity: 0.5}); // using params object</code></pre>
+c.attr({fill: "#000", stroke: "#f00", opacity: 0.5}); // using params object
+c.attr({gradient: "90-#fff-#000", "stroke-dasharray": "-..", "clip-rect": "10, 10, 100, 100"});</code></pre>
                         <h3 id="animate">
                             animate
                         </h3>
                         <p>
-                            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.
                         </p>
                         <h4>Parameters</h4>
                         <ol>
@@ -216,9 +239,17 @@ c.attr({fill: "#000", stroke: "#f00", opacity: 0.5}); // using params object</co
                             <li>ms <em>number</em> The duration of the animation, given in milliseconds.</li>
                             <li>callback <em>function</em> [optional]</li>
                         </ol>
+                        <p>or</p>
+                        <ol>
+                            <li>newAttrs <em>object</em> A parameters object of the animation results. (Not all attributes can be animated.)</li>
+                            <li>ms <em>number</em> The duration of the animation, given in milliseconds.</li>
+                            <li>easing <em>string</em> [“>”, “&lt;”, “&lt;&gt;”, “backIn”, “backOut”, “bounce”, “elastic”] [optional]</li>
+                            <li>callback <em>function</em> [optional]</li>
+                        </ol>
                         <h4>Attributes that can be animated</h4>
                         <p>The <code>newAttrs</code> parameter accepts an object whose properties are the attributes to animate. However, not all attributes listed in the <code>attr</code> method reference can be animated. The following is a list of those properties that can be animated:</p>
                         <ul>
+                            <li>clip-rect <em>string</em></li>
                             <li>cx <em>number</em></li>
                             <li>cy <em>number</em></li>
                             <li>fill <em>colour</em></li>
@@ -228,21 +259,26 @@ c.attr({fill: "#000", stroke: "#f00", opacity: 0.5}); // using params object</co
                             <li>opacity <em>number</em></li>
                             <li>path <em>pathString</em></li>
                             <li>r <em>number</em></li>
-                            <li>rotation <em>number</em></li>
+                            <li>rotation <em>string</em></li>
                             <li>rx <em>number</em></li>
                             <li>ry <em>number</em></li>
-                            <li>scale <em>CSV</em></li>
+                            <li>scale <em>string</em></li>
                             <li>stroke <em>colour</em></li>
                             <li>stroke-opacity <em>number</em></li>
                             <li>stroke-width <em>number</em></li>
-                            <li>translation <em>CSV</em></li>
+                            <li>translation <em>string</em></li>
                             <li>width <em>number</em></li>
                             <li>x <em>number</em></li>
                             <li>y <em>number</em></li>
                         </ul>
+                        <h4>Easing</h4>
+                        <p>
+                            For easing use built in functions or add your own by adding new functions to <code>Raphael.easing_formulas</code> object. Look at the <a href="easing.html">example of easing usage</a>.
+                        </p>
                         <h4>Usage</h4>
                         <pre class="javascript code"><code>var c = paper.circle(10, 10, 10);</code>
-<code>c.animate({cx: 20, r: 20}, 2000);</code></pre>
+<code>c.animate({cx: 20, r: 20}, 2000);</code>
+<code>c.animate({cx: 20, r: 20}, 2000, "bounce");</code></pre>
                         <h3 id="getBBox">
                             getBBox
                         </h3>
@@ -284,16 +320,129 @@ c.attr({fill: "#000", stroke: "#f00", opacity: 0.5}); // using params object</co
                             insertAfter
                         </h3>
                         <p>
-                            Inserts current object after the given one
+                            Inserts current object after the given one.
                         </p>
                         <h4>Usage</h4>
                         <pre class="javascript code"><code>var r = paper.rect(10, 10, 10, 10);</code>
 <code>var c = paper.circle(10, 10, 10);</code>
 <code>r.insertAfter(c);</code></pre>
                         <h2>Graphic Primitives</h2>
+                        <p>
+                            Methods of “paper” object, created with <code>Raphael</code> function call.
+                        </p>
+                        <h3 id="raphael">
+                            raphael
+                        </h3>
+                        <p>
+                            Internal reference to <code>Raphael</code> object. In case it is not available.
+                        </p>
+                        <h4>Usage</h4>
+                        <pre class="javascript code"><code>Raphael.el.red = function () {
+    var hsb = this.paper.raphael.rgb2hsb(this.attr("fill"));
+    hsb.h = 1;
+    this.attr({fill: this.paper.raphael.hsb2rgb(hsb).hex});
+}</code></pre>
+                        <h3 id="setSize">
+                            setSize
+                        </h3>
+                        <p>
+                            If you need to change dimensions of the canvas call this method
+                        </p>
+                        <h4>Parameters</h4>
+                        <ol>
+                            <li>width <em>number</em> new width of the canvas</li>
+                            <li>height <em>number</em> new height of the canvas</li>
+                        </ol>
+                        <h3 id="setWindow">
+                            setWindow
+                        </h3>
+                        <p>
+                            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 <code>iframe</code>
+                        </p>
+                        <h4>Parameters</h4>
+                        <ol>
+                            <li>window <em>object</em></li>
+                        </ol>
+                        <h3 id="getRGB">
+                            getRGB
+                        </h3>
+                        <p>
+                            Parses passes string and returns an color object. Especially usefull for plug-in developers.
+                        </p>
+                        <h4>Parameters</h4>
+                        <ol>
+                            <li>color <em>string</em> Color in form acceptable by library</li>
+                        </ol>
+                        <h4>Usage</h4>
+                        <pre class="javascript code"><code>var stroke = Raphael.getRGB(circle.attr("stroke")).hex</code></pre>
+                        <h3 id="getColor">
+                            getColor
+                        </h3>
+                        <p>
+                            Returns a colour object for the next colour in spectrum
+                        </p>
+                        <h4>Parameters</h4>
+                        <ol>
+                            <li>value <em>number</em> brightness [optional]</li>
+                        </ol>
+                        <h4>Usage</h4>
+                        <pre class="javascript code"><code>var c = paper.path("M10,10L100,100").attr({stroke: Raphael.getColor()});</code></pre>
+                        <h3 id="getColor-reset">
+                            getColor.reset
+                        </h3>
+                        <p>
+                            Resets getColor function, so it will start from the beginning
+                        </p>
+                        <h3 id="registerFont">
+                            registerFont
+                        </h3>
+                        <p>
+                            Adds given font to the registered set of fonts for Raphaël. Should be used as an internal call from within Cufón’s font file. <a href="http://wiki.github.com/sorccu/cufon/about">More about Cufón and how to convert your font form TTF, OTF, etc to JavaScript file</a>. Returns original parameter, so it could be used with chaining.
+                        </p>
+                        <h4>Parameters</h4>
+                        <ol>
+                            <li>font <em>object</em> the font to register</li>
+                        </ol>
+                        <h4>Usage</h4>
+                        <pre class="javascript code"><code>Cufon.registerFont(Raphael.registerFont({…}))</code></pre>
+                        <h3 id="getFont">
+                            getFont
+                        </h3>
+                        <p>
+                            Finds font object in the registered fonts by given parameters. You could specify only one word from the font name, like “Myriad” for “Myriad Pro”.
+                        </p>
+                        <h4>Parameters</h4>
+                        <ol>
+                            <li>family <em>string</em> font family name or any word from it</li>
+                            <li>weight <em>string</em> weight of the font [optional]</li>
+                            <li>style <em>string</em> style of the font [optional]</li>
+                            <li>stretch <em>string</em> stretch of the font [optional]</li>
+                        </ol>
+                        <h4>Usage</h4>
+                        <pre class="javascript code"><code>paper.print(100, 100, "Test string", paper.getFont("Times", 800), 30);</code></pre>
+                        <h3 id="print">
+                            print
+                        </h3>
+                        <div class="sample" id="print-sample"></div>
+                        <p>
+                            Creates set of shapes to represent given font at given position with given size. Result of the method is set object (see <a href="#set">set</a>) which contains each letter as separate path object.
+                        </p>
+                        <h4>Parameters</h4>
+                        <ol>
+                            <li>x <em>number</em> x position of the text</li>
+                            <li>y <em>number</em> y position of the text</li>
+                            <li>text <em>string</em> text to print</li>
+                            <li>font <em>object</em> font object (see <a href="#getFont">getFont</a>)</li>
+                            <li>font_size <em>number</em> size of the font</li>
+                        </ol>
+                        <h4>Usage</h4>
+                        <pre class="javascript code"><code>var txt = r.print(10, 50, "print", r.getFont("Museo"), 30).attr({fill: "#fff"});
+// following line will paint first letter in red
+txt[0].attr({fill: "#f00"});</code></pre>
                         <h3 id="circle">
                             circle
                         </h3>
+                        <div class="sample" id="circle-sample"></div>
                         <p>
                             Draws a circle.
                         </p>
@@ -304,10 +453,11 @@ c.attr({fill: "#000", stroke: "#f00", opacity: 0.5}); // using params object</co
                             <li>r <em>number</em> radius</li>
                         </ol>
                         <h4>Usage</h4>
-                        <pre class="javascript code"><code>var c = paper.circle(10, 10, 10);</code></pre>
+                        <pre class="javascript code"><code>var c = paper.circle(50, 50, 40);</code></pre>
                         <h3 id="rect">
                             rect
                         </h3>
+                        <div class="sample" id="rect-sample"></div>
                         <p>
                             Draws a rectangle.
                         </p>
@@ -321,12 +471,13 @@ c.attr({fill: "#000", stroke: "#f00", opacity: 0.5}); // using params object</co
                         </ol>
                         <h4>Usage</h4>
                         <pre class="javascript code"><code>// regular rectangle</code>
-<code>var c = paper.rect(10, 10, 10, 10);</code>
+<code>var c = paper.rect(10, 10, 50, 50);</code>
 <code>// rectangle with rounded corners</code>
-<code>var c = paper.rect(10, 10, 100, 50, 10);</code></pre>
+<code>var c = paper.rect(40, 40, 50, 50, 10);</code></pre>
                         <h3 id="ellipse">
                             ellipse
                         </h3>
+                        <div class="sample" id="ellipse-sample"></div>
                         <p>
                             Draws an ellipse.
                         </p>
@@ -338,10 +489,11 @@ c.attr({fill: "#000", stroke: "#f00", opacity: 0.5}); // using params object</co
                             <li>ry <em>number</em> Vertical radius</li>
                         </ol>
                         <h4>Usage</h4>
-                        <pre class="javascript code"><code>var c = paper.ellipse(100, 100, 30, 40);</code></pre>
+                        <pre class="javascript code"><code>var c = paper.ellipse(50, 50, 40, 20);</code></pre>
                         <h3 id="image">
                             image
                         </h3>
+                        <div class="sample" id="image-sample"></div>
                         <p>
                             Embeds an image into the SVG/VML canvas.
                         </p>
@@ -354,21 +506,22 @@ c.attr({fill: "#000", stroke: "#f00", opacity: 0.5}); // using params object</co
                             <li>height <em>number</em> Height of the image</li>
                         </ol>
                         <h4>Usage</h4>
-                        <pre class="javascript code"><code>var c = paper.image("apple.png", 10, 10, 100, 100);</code></pre>
+                        <pre class="javascript code"><code>var c = paper.image("apple.png", 10, 10, 80, 80);</code></pre>
                         <h3 id="set">
                             set
                         </h3>
+                        <div class="sample" id="set-sample"></div>
                         <p>
                             Creates array-like object to keep and operate couple of elements at once. Warning: it doesn’t create any elements for itself in the page.
                         </p>
                         <h4>Usage</h4>
                         <pre class="javascript code"><code>var st = paper.set();</code>
-<code>st.push(paper.circle(10, 10, 5));</code>
-<code>st.push(paper.circle(30, 10, 5));</code>
+<code>st.push(paper.circle(10, 10, 5), paper.circle(30, 10, 5));</code>
 <code>st.attr({fill: "red"});</code></pre>
                         <h3 id="text">
                             text
                         </h3>
+                        <div class="sample" id="text-sample"></div>
                         <p>
                             Draws a text string. If you need line breaks, put “\n” in the string.
                         </p>
@@ -379,193 +532,95 @@ c.attr({fill: "#000", stroke: "#f00", opacity: 0.5}); // using params object</co
                             <li>text <em>string</em> The text string to draw.</li>
                         </ol>
                         <h4>Usage</h4>
-                        <pre class="javascript code"><code>var t = paper.text(10, 10, "Look mom, I'm scalable!");</code></pre>
+                        <pre class="javascript code"><code>var t = paper.text(50, 50, "Raphaël\nkicks\nbutt!");</code></pre>
                         <h3 id="path">
                             path
                         </h3>
+                        <div class="sample" id="path-sample"></div>
                         <p>
-                            Initialises path drawing. Typically, this function returns an empty <code>path</code> object and to draw paths you use its built-in methods like <code>lineTo</code> and <code>curveTo</code>. 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.
                         </p>
                         <h4>Parameters</h4>
                         <ol>
-                            <li>params <em>object</em> Attributes for the resulting path as described in the <code><a href="#attr">attr</a></code> reference.</li>
                             <li>pathString <em>string</em> [optional] Path data in <a href="http://www.w3.org/TR/SVG/paths.html#PathData" title="Details of a path's data attribute's format are described in the SVG specification.">SVG path string format</a>.</li>
                         </ol>
                         <h4>Usage</h4>
-                        <pre class="javascript code"><code>var c = paper.path({stroke: "#036"}).moveTo(10, 10).lineTo(50, 50); // draw a diagonal line
-var c = paper.path({stroke: "#036"}, "M 10 10 L 50 50");            // same</code></pre>
-                        <h2>Path Methods</h2>
-                        <h3 id="absolutely">
-                            absolutely
-                        </h3>
-                        <p>
-                            Sets a trigger to count all following units as absolute ones, unless said otherwise. (This is on by default.)
-                        </p>
-                        <h4>Usage</h4>
-                        <pre class="javascript code"><code>var c = paper.path({stroke: "#036"}).absolutely()
-    .moveTo(10, 10).lineTo(50, 50);</code></pre>
-                        <h3 id="relatively">
-                            relatively
-                        </h3>
-                        <p>
-                            Sets a trigger to count all following units as relative ones, unless said otherwise.
-                        </p>
-                        <h4>Usage</h4>
-                        <pre class="javascript code"><code>var c = paper.path({stroke: "#036"}).relatively()
-    .moveTo(10, 10).lineTo(50, 50);</code></pre>
-                        <h3 id="moveTo">
-                            moveTo
-                        </h3>
-                        <p>
-                            Moves the drawing point to the given coordinates.
-                        </p>
-                        <h4>Parameters</h4>
-                        <ol>
-                            <li>x <em>number</em> X coordinate</li>
-                            <li>y <em>number</em> Y coordinate</li>
-                        </ol>
-                        <h4>Usage</h4>
-                        <pre class="javascript code"><code>// Begins drawing the path at coordinate 10,10
-var c = paper.path({stroke: "#036"}).moveTo(10, 10).lineTo(50, 50);</code></pre>
-                        <h3 id="lineTo">
-                            lineTo
+                        <pre class="javascript code"><code>var c = paper.path("M10 10L90 90");
+// draw a diagonal line: move to 10,10, line to 90,90</code></pre>
+                        <h3 id="plugins-canvas">
+                            Adding your own methods to canvas
                         </h3>
                         <p>
-                            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ë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ël instance was created, otherwise it will take no effect.
                         </p>
-                        <h4>Parameters</h4>
-                        <ol>
-                            <li>x <em>number</em> X coordinate</li>
-                            <li>y <em>number</em> Y coordinate</li>
-                        </ol>
                         <h4>Usage</h4>
-                        <pre class="javascript code"><code>// Draws a line starting from 10,10 to 50,50
-var c = paper.path({stroke: "#036"}).moveTo(10, 10).lineTo(50, 50);</code></pre>
-                        <h3 id="cplineTo">
-                            cplineTo
+                        <pre class="javascript code"><code>Raphael.fn.arrow = function (x1, y1, x2, y2, size) {
+    return this.path(// some code here);
+};
+// or create namespace
+Raphael.fn.mystuff = {
+    arrow: function () {…},
+    star: function () {…},
+    // etc…
+};
+var paper = Raphael(10, 10, 630, 480);
+// then use it
+paper.arrow(10, 10, 30, 30, 5).attr({fill: "#f00"});
+paper.mystuff.arrow();
+paper.mystuff.star();
+</code></pre>
+                        <h3 id="plugins-elements">
+                            Adding your own methods to elements
                         </h3>
                         <p>
-                            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.
                         </p>
-                        <h4>Parameters</h4>
-                        <ol>
-                            <li>x <em>number</em></li>
-                            <li>y <em>number</em></li>
-                            <li>width <em>number</em></li>
-                        </ol>
                         <h4>Usage</h4>
-                        <pre class="javascript code"><code>var c = paper.path({stroke: "#036"}).moveTo(10, 10).cplineTo(50, 50);</code></pre>
-                        <h3 id="curveTo">
-                            curveTo
+                        <pre class="javascript code"><code>Raphael.el.red = function () {
+    this.attr({fill: "#f00"});
+};
+// then use it
+paper.circle(100, 100, 20).red();
+</code></pre>
+                        <h3 id="colour">
+                            Supported colour formats
                         </h3>
                         <p>
-                            Draws a bicubic curve to the given coordinates.
+                            You could specify colour in this formats:
                         </p>
-                        <h4>Parameters</h4>
-                        <ol>
-                            <li>x1 <em>number</em></li>
-                            <li>y1 <em>number</em></li>
-                            <li>x2 <em>number</em></li>
-                            <li>y2 <em>number</em></li>
-                            <li>x3 <em>number</em></li>
-                            <li>y3 <em>number</em></li>
-                        </ol>
+                        <ul>
+                            <li>Colour name (“red”, “green”, “cornflowerblue”, etc)</li>
+                            <li>#••• — shortened HTML colour: (“#000”, “#fc0”, etc)</li>
+                            <li>#•••••• — full length HTML colour: (“#000000”, “#bd2300”)</li>
+                            <li>rgb(•••, •••, •••) — red, green and blue channels’ values: (“rgb(200, 100, 0)”)</li>
+                            <li>rgb(•••%, •••%, •••%) — same as above, but in %: (“rgb(100%, 175%, 0%)”)</li>
+                            <li>hsb(•••, •••, •••) — hue, saturation and brightness values: (“hsb(0.5, 0.25, 1)”)</li>
+                            <li>hsb(•••%, •••%, •••%) — same as above, but in %</li>
+                            <li>hsl(•••, •••, •••) — same as hsb</li>
+                            <li>hsl(•••%, •••%, •••%) — same as hsb</li>
+                        </ul>
                         <h4>Usage</h4>
-                        <pre class="javascript code"><code>var c = paper.path({stroke: "#036"}).moveTo(10, 10).curveTo(10, 15, 45, 45, 50, 50);</code></pre>
-                        <h3 id="qcurveTo">
-                            qcurveTo
+                        <pre class="javascript code"><code>paper.circle(100, 100, 20).attr({fill: "hsb(1, 255, 200)", stroke: "red"});</code></pre>
+                        <h3 id="safari">
+                            safari
                         </h3>
                         <p>
-                            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.
                         </p>
-                        <h4>Parameters</h4>
-                        <ol>
-                            <li>x1 <em>number</em></li>
-                            <li>y1 <em>number</em></li>
-                            <li>x2 <em>number</em></li>
-                            <li>y2 <em>number</em></li>
-                        </ol>
                         <h4>Usage</h4>
-                        <pre class="javascript code"><code>var c = paper.path({stroke: "#036"}).moveTo(10, 10).curveTo(10, 15, 45, 45, 50, 50);</code></pre>
-                        <h3 id="addRoundedCorner">
-                            addRoundedCorner
-                        </h3>
-                        <p>
-                            Draws a quarter of a circle from the current drawing point.
-                        </p>
-                        <h4>Parameters</h4>
-                        <ol>
-                            <li>r <em>number</em></li>
-                            <li>dir <em>string</em> Two-letter directional instruction, as described below.</li>
-                        </ol>
-                        <h4>Possible <code>dir</code> values</h4>
-                        <dl>
-                            <dt>lu</dt>
-                            <dd>left up</dd>
-                            <dt>ld</dt>
-                            <dd>left down</dd>
-                            <dt>ru</dt>
-                            <dd>right up</dd>
-                            <dt>rd</dt>
-                            <dd>right down</dd>
-                            <dt>ur</dt>
-                            <dd>up right</dd>
-                            <dt>ul</dt>
-                            <dd>up left</dd>
-                            <dt>dr</dt>
-                            <dd>down right</dd>
-                            <dt>dl</dt>
-                            <dd>down left</dd>
-                        </dl>
-                        <h4>Usage</h4>
-                        <pre class="javascript code"><code>var c = paper.path({stroke: "#036"}).moveTo(10, 10).addRoundedCorner(10, "rd");</code></pre>
-                        <h3 id="andClose">
-                            andClose
-                        </h3>
-                        <p>
-                            Closes the path being drawn.
-                        </p>
-                        <h4>Usage</h4>
-                        <pre class="javascript code"><code>var c = paper.path({stroke: "#036"}).moveTo(10, 10).andClose();</code></pre>
-                        <h3 id="setSize">
-                            setSize
-                        </h3>
-                        <p>
-                            If you need to change dimensions of the canvas call this method
-                        </p>
-                        <h4>Parameters</h4>
-                        <ol>
-                            <li>width <em>number</em> new width of the canvas</li>
-                            <li>height <em>number</em> new height of the canvas</li>
-                        </ol>
-                        <h3 id="setWindow">
-                            setWindow
-                        </h3>
-                        <p>
-                            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 <code>iframe</code>
-                        </p>
-                        <h4>Parameters</h4>
-                        <ol>
-                            <li>window <em>object</em></li>
-                        </ol>
-                        <h3 id="getColor">
-                            getColor
+                        <pre class="javascript code"><code>paper.safari();</code></pre>
+                        <h3 id="ninja-mode">
+                            “Ninja Mode”
                         </h3>
                         <p>
-                            Returns a colour object for the next colour in spectrum
+                            If you want to leave no trace of Raphaël (Well, Raphaël creates only one global variable <code>Raphael</code>, but anyway.) You can use <code>ninja</code> method.
                         </p>
-                        <h4>Parameters</h4>
-                        <ol>
-                            <li>value <em>number</em> brightness [optional]</li>
-                        </ol>
                         <h4>Usage</h4>
-                        <pre class="javascript code"><code>var c = paper.path({stroke: Raphael.getColor()}, "M10,10L100,100")</code></pre>
-                        <h3 id="getColor-reset">
-                            getColor.reset
-                        </h3>
-                        <p>
-                            Resets getColor function, so it will start from the beginning
-                        </p>
+                        <pre class="javascript code"><code>(function (local_raphael) {
+    var paper = local_raphael(10, 10, 320, 200);
+    …
+})(Raphael.ninja());
+</code></pre>
                     </div>
                     <div id="column-2">
                         <h2>
@@ -581,6 +636,9 @@ var c = paper.path({stroke: "#036"}).moveTo(10, 10).lineTo(50, 50);</code></pre>
                             <li>
                                 <a href="#node"><code>node</code></a>
                             </li>
+                            <li>
+                                <a href="#paper"><code>paper</code></a>
+                            </li>
                             <li>
                                 <a href="#remove"><code>remove</code></a>
                             </li>
@@ -614,6 +672,39 @@ var c = paper.path({stroke: "#036"}).moveTo(10, 10).lineTo(50, 50);</code></pre>
                             <li>
                                 <a href="#toBack"><code>toBack</code></a>
                             </li>
+                            <li>
+                                <a href="#insertBefore"><code>insertBefore</code></a>
+                            </li>
+                            <li>
+                                <a href="#insertAfter"><code>insertAfter</code></a>
+                            </li>
+                            <li>
+                                <a href="#raphael"><code>raphael</code></a>
+                            </li>
+                            <li>
+                                <a href="#setSize"><code>setSize</code></a>
+                            </li>
+                            <li>
+                                <a href="#setWindow"><code>setWindow</code></a>
+                            </li>
+                            <li>
+                                <a href="#getRGB"><code>getRGB</code></a>
+                            </li>
+                            <li>
+                                <a href="#getColor"><code>getColor</code></a>
+                            </li>
+                            <li>
+                                <a href="#getColor-reset"><code>getColor.reset</code></a>
+                            </li>
+                            <li>
+                                <a href="#registerFont"><code>registerFont</code></a>
+                            </li>
+                            <li>
+                                <a href="#getFont"><code>getFont</code></a>
+                            </li>
+                            <li>
+                                <a href="#print"><code>print</code></a>
+                            </li>
                             <li>
                                 <a href="#circle"><code>circle</code></a>
                             </li>
@@ -634,53 +725,27 @@ var c = paper.path({stroke: "#036"}).moveTo(10, 10).lineTo(50, 50);</code></pre>
                             </li>
                             <li>
                                 <a href="#path"><code>path</code></a>
-                                <ul>
-                                    <li>
-                                        <a href="#absolutely"><code>absolutely</code></a>
-                                    </li>
-                                    <li>
-                                        <a href="#relatively"><code>relatively</code></a>
-                                    </li>
-                                    <li>
-                                        <a href="#moveTo"><code>moveTo</code></a>
-                                    </li>
-                                    <li>
-                                        <a href="#lineTo"><code>lineTo</code></a>
-                                    </li>
-                                    <li>
-                                        <a href="#cplineTo"><code>cplineTo</code></a>
-                                    </li>
-                                    <li>
-                                        <a href="#curveTo"><code>curveTo</code></a>
-                                    </li>
-                                    <li>
-                                        <a href="#qcurveTo"><code>qcurveTo</code></a>
-                                    </li>
-                                    <li>
-                                        <a href="#addRoundedCorner"><code>addRoundedCorner</code></a>
-                                    </li>
-                                    <li>
-                                        <a href="#andClose"><code>andClose</code></a>
-                                    </li>
-                                </ul>
                             </li>
                             <li>
-                                <a href="#setSize"><code>setSize</code></a>
+                                <a href="#plugins-canvas">Adding your own methods to canvas</a>
                             </li>
                             <li>
-                                <a href="#setWindow"><code>setWindow</code></a>
+                                <a href="#plugins-elements">Adding your own methods to elements</a>
                             </li>
                             <li>
-                                <a href="#getColor"><code>getColor</code></a>
+                                <a href="#colour">Supported colour formats</a>
                             </li>
                             <li>
-                                <a href="#getColor-reset"><code>getColor.reset</code></a>
+                                <a href="#safari">safari</a>
+                            </li>
+                            <li>
+                                <a href="#ninja-mode">“Ninja Mode”</a>
                             </li>
                         </ul>
                     </div>
                     <div  id="footer">
                         <h3 id="copyright">
-                            <a href="http://creativecommons.org/licenses/by-sa/3.0/" title="Creative Commons Attribution-ShareAlike 3.0 Unported" rel="license">Some Rights Reserved</a> by <a href="http://dmitry.baranovskiy.com/">Dmitry Baranovskiy</a>
+                            <a href="http://www.opensource.org/licenses/mit-license.php" title="MIT License" rel="license">Some Rights Reserved</a> by <a href="http://dmitry.baranovskiy.com/">Dmitry Baranovskiy</a>
                         </h3>
                         <h3 id="font">
                             Font by <a href="http://www.exljbris.nl">Jos Buivenga</a> · Logo by <a href="http://wasabicube.com/">Wasabicube</a> ·
@@ -698,5 +763,6 @@ var c = paper.path({stroke: "#036"}).moveTo(10, 10).lineTo(50, 50);</code></pre>
         var pageTracker = _gat._getTracker("UA-616618-3");
         pageTracker._trackPageview();
         </script>
+        <script src="http://static.woopra.com/js/woopra.js" type="text/javascript" charset="utf-8"></script>
     </body>
 </html>