
!function(){function t(t){this.converter=t.converter,this.data=t.path||t.data,this.imageData=[],this.multiplier=t.multiplier||1,this.padding=t.padding||0,this.fps=t.fps||25,this.stepsPerFrame=~~t.stepsPerFrame||1,this.trailLength=t.trailLength||1,this.pointDistance=t.pointDistance||.05,this.domClass=t.domClass||"sonic",this.backgroundColor=t.backgroundColor||"rgba(0,0,0,0)",this.fillColor=t.fillColor,this.strokeColor=t.strokeColor,this.stepMethod="string"==typeof t.step?a[t.step]:t.step||a.square,this._setup=t.setup||i,this._teardown=t.teardown||i,this._preStep=t.preStep||i,this.pixelRatio=t.pixelRatio||null,this.width=t.width,this.height=t.height,this.fullWidth=this.width+2*this.padding,this.fullHeight=this.height+2*this.padding,this.domClass=t.domClass||"sonic",this.setup()}var i=function(){},s=t.argTypes={DIM:1,DEGREE:2,RADIUS:3,OTHER:0},e=t.argSignatures={arc:[1,1,3,2,2,0],bezier:[1,1,1,1,1,1,1,1],line:[1,1,1,1]},h=t.pathMethods={bezier:function(t,i,s,e,h,a,l,r,o){var n=1-(t=1-t),p=t*t,c=n*n,u=p*t,d=3*p*n,f=3*t*c,g=c*n;return[u*i+d*a+f*r+g*e,u*s+d*l+f*o+g*h]},arc:function(t,i,s,e,h,a){var l=(a-h)*t+h,r=[Math.cos(l)*e+i,Math.sin(l)*e+s];return r.angle=l,r.t=t,r},line:function(t,i,s,e,h){return[(e-i)*t+i,(h-s)*t+s]}},a=t.stepMethods={square:function(t,i,s,e,h){this._.fillRect(t.x-3,t.y-3,6,6)},fader:function(t,i,s,e,h){this._.beginPath(),this._last&&this._.moveTo(this._last.x,this._last.y),this._.lineTo(t.x,t.y),this._.closePath(),this._.stroke(),this._last=t}};t.prototype={calculatePixelRatio:function(){return(window.devicePixelRatio||1)/(this._.webkitBackingStorePixelRatio||this._.mozBackingStorePixelRatio||this._.msBackingStorePixelRatio||this._.oBackingStorePixelRatio||this._.backingStorePixelRatio||1)},setup:function(){var t,i,a,l,r=this.data;this.canvas=document.createElement("canvas"),this._=this.canvas.getContext("2d"),null==this.pixelRatio&&(this.pixelRatio=this.calculatePixelRatio()),this.canvas.className=this.domClass,1!=this.pixelRatio?(this.canvas.style.height=this.fullHeight+"px",this.canvas.style.width=this.fullWidth+"px",this.fullHeight*=this.pixelRatio,this.fullWidth*=this.pixelRatio,this.canvas.height=this.fullHeight,this.canvas.width=this.fullWidth,this._.scale(this.pixelRatio,this.pixelRatio)):(this.canvas.height=this.fullHeight,this.canvas.width=this.fullWidth),this.points=[];for(var o=-1,n=r.length;++o<n;){if(t=r[o].slice(1),(a=r[o][0])in e)for(var p=-1,c=t.length;++p<c;){switch(i=e[a][p],l=t[p],i){case s.RADIUS:l*=this.multiplier;break;case s.DIM:l*=this.multiplier,l+=this.padding;break;case s.DEGREE:l*=Math.PI/180}t[p]=l}t.unshift(0);for(var u,d=this.pointDistance,f=d;f<=1;f+=d)f=Math.round(1*f/d)/(1/d),t[0]=f,u=h[a].apply(null,t),this.points.push({x:u[0],y:u[1],progress:f})}this.frame=0,this.converter&&this.converter.setup&&this.converter.setup(this)},prep:function(t){if(!(t in this.imageData)){this._.clearRect(0,0,this.fullWidth,this.fullHeight),this._.fillStyle=this.backgroundColor,this._.fillRect(0,0,this.fullWidth,this.fullHeight);var i,s,e,h=this.points,a=h.length;this.pointDistance;this._setup();for(var l=-1,r=a*this.trailLength;++l<r&&!this.stopped;)(i=h[s=t+l]||h[s-a])&&(this.alpha=Math.round(l/(r-1)*1e3)/1e3,this._.globalAlpha=this.alpha,this.fillColor&&(this._.fillStyle=this.fillColor),this.strokeColor&&(this._.strokeStyle=this.strokeColor),e=t/(this.points.length-1),indexD=l/(r-1),this._preStep(i,indexD,e),this.stepMethod(i,indexD,e));return this._teardown(),this.imageData[t]=this._.getImageData(0,0,this.fullWidth,this.fullWidth),!0}},draw:function(){this.prep(this.frame)||(this._.clearRect(0,0,this.fullWidth,this.fullWidth),this._.putImageData(this.imageData[this.frame],0,0)),this.converter&&this.converter.step&&this.converter.step(this),this.iterateFrame()||this.converter&&this.converter.teardown&&(this.converter.teardown(this),this.converter=null)},iterateFrame:function(){return this.frame+=this.stepsPerFrame,!(this.frame>=this.points.length)||(this.frame=0,!1)},play:function(){this.stopped=!1;var t=this;this.timer=setInterval(function(){t.draw()},1e3/this.fps)},stop:function(){this.stopped=!0,this.timer&&clearInterval(this.timer)}},window.Sonic=t}();