i;i++)o[i]-=a[i];this.zoomX=1,this.zoomY=1,this.setBoundingBox(o,!0)}return this},setZoom:function(e,t){var i=this.options.zoom.factorX,n=this.options.zoom.factorY;return this.options.zoom.factorX=e/this.zoomX,this.options.zoom.factorY=t/this.zoomY,this.zoomIn(),this.options.zoom.factorX=i,this.options.zoom.factorY=n,this},removeObject:function(e){var t,i;if(JXG.isArray(e))for(i=0;e.length>i;i++)this.removeObject(e[i]);if(e=JXG.getReference(this,e),!JXG.exists(e))return this;try{for(t in e.childElements)e.childElements[t].board.removeObject(e.childElements[t]);for(t in this.objects)JXG.exists(this.objects[t].childElements)&&delete this.objects[t].childElements[e.id];delete this.objects[e.id],delete this.elementsByName[e.name],e.visProp.trace&&e.clearTrace(),JXG.exists(e.remove)&&e.remove()}catch(n){JXG.debug(e.id+": Could not be removed: "+n)}return this},removeAncestors:function(e){for(var t in e.ancestors)this.removeAncestors(e.ancestors[t]);return this.removeObject(e),this},initGeonextBoard:function(){var e,t,i,n,r;return e=this.create("point",[0,0],{id:this.id+"g00e0",name:"Ursprung",withLabel:!1,visible:!1,fixed:!0}),t=this.create("point",[1,0],{id:this.id+"gX0e0",name:"Punkt_1_0",withLabel:!1,visible:!1,fixed:!0}),i=this.create("point",[0,1],{id:this.id+"gY0e0",name:"Punkt_0_1",withLabel:!1,visible:!1,fixed:!0}),n=this.create("line",[e,t],{id:this.id+"gXLe0",name:"X-Achse",withLabel:!1,visible:!1}),r=this.create("line",[e,i],{id:this.id+"gYLe0",name:"Y-Achse",withLabel:!1,visible:!1}),this},initInfobox:function(){return this.infobox=this.create("text",[0,0,"0,0"],{id:this.id+"_infobox",display:"html",fixed:!0}),this.infobox.distanceX=-20,this.infobox.distanceY=25,this.infobox.dump=!1,this.renderer.hide(this.infobox),this},resizeContainer:function(e,t){return this.canvasWidth=parseFloat(e),this.canvasHeight=parseFloat(t),this.containerObj.style.width=this.canvasWidth+"px",this.containerObj.style.height=this.canvasHeight+"px",this.renderer.resize(this.canvasWidth,this.canvasHeight),this},showDependencies:function(){var e,t,i,n,r;t="\n";for(e in this.objects){r=0;for(i in this.objects[e].childElements)r++;r>=0&&(t+=""+this.objects[e].id+": ");for(i in this.objects[e].childElements)t+=this.objects[e].childElements[i].id+"("+this.objects[e].childElements[i].name+"), ";t+="
\n"}return t+="
\n",n=window.open(),n.document.open(),n.document.write(t),n.document.close(),this},showXML:function(){var e=window.open("");return e.document.open(),e.document.write(""+JXG.escapeHTML(this.xmlString)+"
"),e.document.close(),this},prepareUpdate:function(){var e,t;for(e in this.objects)t=this.objects[e],(this.needsFullUpdate||t.needsRegularUpdate)&&(t.needsUpdate=!0);return this},updateElements:function(e){var t,i;e=JXG.getRef(this,e);for(t in this.objects)i=this.objects[t],null==e||i.id!=e.id?i.update(!0):i.update(!1);return this},updateRenderer:function(e){var t,i;if("canvas"==this.options.renderer)this.updateRendererCanvas(e);else for(t in this.objects)i=this.objects[t],i.updateRenderer();return this},updateRendererCanvas:function(){var e,t,i,n,r,o=this.options.layer,a=this.options.layer.numlayers,s=Number.NEGATIVE_INFINITY;for(i=0;a>i;i++){n=Number.POSITIVE_INFINITY;for(r in o)o[r]>s&&n>o[r]&&(n=o[r]);s=n;for(e in this.objects)t=this.objects[e],t.visProp.layer===n&&t.prepareUpdate().updateRenderer()}return this},addHook:function(e,t,i){return JXG.exists(t)||(t="update"),i=i||this,this.hooks.push({fn:e,mode:t,context:i}),"update"==t&&e.apply(i,[this]),this.hooks.length-1},removeHook:function(e){return this.hooks[e]=null,this},updateHooks:function(e){var t,i,n,r,o=arguments.length>1?Array.prototype.slice.call(arguments,1):[];for(JXG.exists(e)||(e=["update"]),JXG.isArray(e)||(e=[e]),n=e.length,r=this.hooks.length,i=0;n>i;i++)for(t=0;r>t;t++)null!=this.hooks[t]&&this.hooks[t].mode==e[i]&&this.hooks[t].fn.apply(this.hooks[t].context,o);return this},addChild:function(e){return this.dependentBoards.push(e),this.update(),this},removeChild:function(e){var t;for(t=this.dependentBoards.length-1;t>=0;t--)this.dependentBoards[t]==e&&this.dependentBoards.splice(t,1);return this},update:function(e){var t,i,n,r;if(this.inUpdate||this.isSuspendedUpdate)return this;for(this.inUpdate=!0,this.prepareUpdate(e).updateElements(e).updateConditions(),this.renderer.suspendRedraw(this),this.updateRenderer(e),this.renderer.unsuspendRedraw(),this.updateHooks(),i=this.dependentBoards.length,t=0;i>t;t++)n=this.dependentBoards[t].id,r=JXG.JSXGraph.boards[n],r!=this&&(r.updateQuality=this.updateQuality,r.prepareUpdate().updateElements().updateConditions(),r.renderer.suspendRedraw(),r.updateRenderer(),r.renderer.unsuspendRedraw(),r.updateHooks());return this.inUpdate=!1,this},fullUpdate:function(){return this.needsFullUpdate=!0,this.update(),this.needsFullUpdate=!1,this},addGrid:function(){return this.create("grid",[]),this},removeGrids:function(){var e;for(e=0;this.grids.length>e;e++)this.removeObject(this.grids[e]);return this.grids.length=0,this.update(),this},create:function(e,t,i){var n,r;for(e=e.toLowerCase(),JXG.exists(t)||(t=[]),JXG.exists(i)||(i={}),r=0;t.length>r;r++)("text"!=e||2!=r)&&(t[r]=JXG.getReference(this,t[r]));if(null==JXG.JSXGraph.elements[e])throw Error("JSXGraph: JXG.createElement: Unknown element type given: "+e);return n="function"==typeof JXG.JSXGraph.elements[e]?JXG.JSXGraph.elements[e](this,t,i):JXG.JSXGraph.elements[e].creator(this,t,i),JXG.exists(n)?(n.prepareUpdate&&n.update&&n.updateRenderer&&n.prepareUpdate().update().updateRenderer(),n):(JXG.debug("JSXGraph: JXG.createElement: failure creating "+e),n)},createElement:JXG.shortcut(JXG.Board.prototype,"create"),clearTraces:function(){var e;for(e in this.objects)this.objects[e].clearTrace();return this.numTraces=0,this},suspendUpdate:function(){return this.isSuspendedUpdate=!0,this},unsuspendUpdate:function(){return this.isSuspendedUpdate=!1,this.update(),this},setBoundingBox:function(e,t){if(!JXG.isArray(e))return this;var i,n,r=JXG.getDimensions(this.container);return this.canvasWidth=parseInt(r.width),this.canvasHeight=parseInt(r.height),n=this.canvasWidth,i=this.canvasHeight,t?(this.unitX=n/(e[2]-e[0]),this.unitY=i/(e[1]-e[3]),Math.abs(this.unitX)t;t++)e.push(arguments[t])},createRoulette:function(e,t,i,n,r,o,a){var s=this,l=function(){var l,c=0,u=0,d=0,h=i,p=JXG.Math.Numerics.root(function(i){var n=e.X(h),r=e.Y(h),o=t.X(i),a=t.Y(i);return(n-o)*(n-o)+(r-a)*(r-a)},[0,2*Math.PI]),f=0,g=0,m=s.create("transform",[function(){return c}],{type:"rotate"}),b=s.create("transform",[function(){return c},function(){return e.X(h)},function(){return e.Y(h)}],{type:"rotate"}),v=s.create("transform",[function(){return u},function(){return d}],{type:"translate"}),y=function(e,t,i){var n=JXG.Math.Numerics.D(e.X)(t),r=JXG.Math.Numerics.D(e.Y)(t),o=JXG.Math.Numerics.D(e.X)(i),a=JXG.Math.Numerics.D(e.Y)(i),s=JXG.Math.Numerics.D(e.X)(.5*(t+i)),l=JXG.Math.Numerics.D(e.Y)(.5*(t+i)),c=Math.sqrt(n*n+r*r),u=Math.sqrt(o*o+a*a),d=Math.sqrt(s*s+l*l);return(c+4*d+u)*(i-t)/6},x=function(e){return l-y(t,p,e)},C=Math.PI/18,w=9*C,k=null;return this.rolling=function(){f=h+r*n,l=y(e,h,f),g=JXG.Math.Numerics.root(x,p);var i=new JXG.Complex(e.X(f),e.Y(f)),o=new JXG.Complex(t.X(g),t.Y(g)),k=new JXG.Complex(JXG.Math.Numerics.D(e.X)(f),JXG.Math.Numerics.D(e.Y)(f)),_=new JXG.Complex(JXG.Math.Numerics.D(t.X)(g),JXG.Math.Numerics.D(t.Y)(g)),T=JXG.C.div(k,_);c=Math.atan2(T.imaginary,T.real),T.div(JXG.C.abs(T)),T.mult(o),u=i.real-T.real,d=i.imaginary-T.imaginary,-C>c&&c>-w?(c=-C,b.applyOnce(a)):c>C&&w>c?(c=C,b.applyOnce(a)):(m.applyOnce(a),v.applyOnce(a),h=f,p=g),s.update()},this.start=function(){return o>0&&(k=setInterval(this.rolling,o)),this},this.stop=function(){return clearInterval(k),this},this};return new l}}),JXG.Options={showCopyright:!0,showNavigation:!0,takeSizeFromFile:!1,renderer:"svg",takeFirst:!1,pan:!0,zoom:{factorX:1.25,factorY:1.25,wheel:!1},jc:{enabled:!0,compile:!0},navbar:{strokeColor:"#aaaaaa",fillColor:"#f5f5f5",padding:"2px",position:"absolute",fontSize:"10px",cursor:"pointer",zIndex:"100",right:"5px",bottom:"5px"},elements:{strokeColor:"#0000ff",highlightStrokeColor:"#C3D9FF",fillColor:"red",highlightFillColor:"none",strokeOpacity:1,highlightStrokeOpacity:1,fillOpacity:1,highlightFillOpacity:1,strokeWidth:2,highlightStrokeWidth:2,fixed:!1,frozen:!1,withLabel:!1,visible:!0,layer:0,dash:0,shadow:!1,trace:!1,traceAttributes:{},highlight:!0,needsRegularUpdate:!0,draft:{draft:!1,strokeColor:"#565656",fillColor:"#565656",strokeOpacity:.8,fillOpacity:.8,strokeWidth:1}},ticks:{drawLabels:!1,drawZero:!1,insertTicks:!1,minTicksDistance:50,minorHeight:4,majorHeight:10,minorTicks:4,ticksDistance:1,strokeOpacity:1,strokeWidth:1,strokeColor:"black",highlightStrokeColor:"#888888"},precision:{touch:30,mouse:4,epsilon:1e-4,hasPoint:4},layer:{numlayers:20,text:9,point:9,arc:8,line:7,circle:6,curve:5,turtle:5,polygon:3,sector:3,angle:3,integral:3,axis:2,grid:1,image:0,trace:0},angle:{withLabel:!0,radius:1,type:"auto",fillColor:"#FF7F00",highlightFillColor:"#FF7F00",strokeColor:"#FF7F00",fillOpacity:.3,highlightFillOpacity:.3,radiuspoint:{withLabel:!1,visible:!1,name:""},pointsquare:{withLabel:!1,visible:!1,name:""},dot:{visible:!1,strokeColor:"none",fillColor:"black",size:2,face:"o",withLabel:!1,name:""},label:{strokeColor:"#0000FF"}},arc:{firstArrow:!1,lastArrow:!1,fillColor:"none",highlightFillColor:"none",strokeColor:"#0000ff",highlightStrokeColor:"#C3D9FF",useDirection:!1},axis:{needsRegularUpdate:!1,strokeWidth:1,strokeColor:"#666666",highlightStrokeWidth:1,highlightStrokeColor:"#888888",withTicks:!0,straightFirst:!0,straightLast:!0,lastArrow:!0,withLabel:!1,ticks:{needsRegularUpdate:!1,strokeWidth:1,strokeColor:"#666666",highlightStrokeColor:"#888888",drawLabels:!0,drawZero:!1,insertTicks:!0,minTicksDistance:10,minorHeight:4,majorHeight:-1,minorTicks:4,ticksDistance:1,strokeOpacity:.25},point1:{needsRegularUpdate:!1},point2:{needsRegularUpdate:!1},label:{position:"lft",offsets:[10,-20]}},bisector:{strokeColor:"#000000",point:{visible:!1,fixed:!1,withLabel:!1,name:""}},bisectorlines:{line1:{strokeColor:"red"},line2:{strokeColor:"black"}},chart:{chartStyle:"line",colors:["#B02B2C","#3F4C6B","#C79810","#D15600","#FFFF88","#C3D9FF","#4096EE","#008C00"],highlightcolors:null,fillcolor:null,highlightonsector:!1,highlightbysize:!1},circle:{fillColor:"none",highlightFillColor:"none",strokeColor:"#0000ff",highlightStrokeColor:"#C3D9FF",center:{visible:!1,withLabel:!1,fixed:!1,name:""},label:{position:"ulft"}},circumcircle:{fillColor:"none",highlightFillColor:"none",strokeColor:"#0000ff",highlightStrokeColor:"#C3D9FF",center:{visible:!1,fixed:!1,withLabel:!1,name:""}},circumcirclearc:{fillColor:"none",highlightFillColor:"none",strokeColor:"#0000ff",highlightStrokeColor:"#C3D9FF",center:{visible:!1,withLabel:!1,fixed:!1,name:""}},circumcirclesector:{useDirection:!0,fillColor:"#00FF00",highlightFillColor:"#00FF00",fillOpacity:.3,highlightFillOpacity:.3,strokeColor:"#0000ff",highlightStrokeColor:"#C3D9FF",point:{visible:!1,fixed:!1,withLabel:!1,name:""}},conic:{fillColor:"none",highlightFillColor:"none",strokeColor:"#0000ff",highlightStrokeColor:"#C3D9FF",foci:{fixed:!1,visible:!1,withLabel:!1,name:""}},curve:{strokeWidth:1,strokeColor:"#0000ff",fillColor:"none",handDrawing:!1,curveType:null,RDPsmoothing:!1,numberPointsHigh:1600,numberPointsLow:400,doAdvancedPlot:!0,label:{position:"lft"}},glider:{},grid:{needsRegularUpdate:!1,hasGrid:!1,gridX:1,gridY:1,strokeColor:"#C0C0C0",strokeOpacity:"0.5",strokeWidth:1,dash:0,snapToGrid:!1,snapSizeX:10,snapSizeY:10},image:{imageString:null,fillOpacity:1},incircle:{fillColor:"none",highlightFillColor:"none",strokeColor:"#0000ff",highlightStrokeColor:"#C3D9FF",center:{visible:!1,fixed:!1,withLabel:!1,name:""}},integral:{withLabel:!0,strokeWidth:0,strokeOpacity:0,fillOpacity:.8,curveLeft:{visible:!0,layer:9},baseLeft:{visible:!1,fixed:!1,withLabel:!1,name:""},curveRight:{visible:!0,layer:9},baseRight:{visible:!1,fixed:!1,withLabel:!1,name:""},label:{fontSize:20}},label:{strokeColor:"black",fixed:!0,position:"urt",offsets:[10,10]},legend:{style:"vertical",labels:["1","2","3","4","5","6","7","8"],colors:["#B02B2C","#3F4C6B","#C79810","#D15600","#FFFF88","#C3D9FF","#4096EE","#008C00"]},line:{firstArrow:!1,lastArrow:!1,straightFirst:!0,straightLast:!0,fillColor:"none",highlightFillColor:"none",strokeColor:"#0000ff",highlightStrokeColor:"#888888",withTicks:!1,point1:{visible:!1,withLabel:!1,fixed:!1,name:""},point2:{visible:!1,withLabel:!1,fixed:!1,name:""},ticks:{drawLabels:!0,drawZero:!1,insertTicks:!1,minTicksDistance:50,maxTicksDistance:300,minorHeight:4,majorHeight:-1,minorTicks:4,defaultDistance:1,strokeOpacity:.3},label:{position:"llft"}},locus:{translateToOrigin:!1,translateTo10:!1,stretch:!1,toOrigin:null,to10:null},normal:{strokeColor:"#000000",point:{visible:!1,fixed:!1,withLabel:!1,name:""}},orthogonalprojection:{},parallel:{strokeColor:"#000000",point:{visible:!1,fixed:!1,withLabel:!1,name:""}},perpendicular:{strokeColor:"#000000",straightFirst:!0,straightLast:!0},perpendicularsegment:{strokeColor:"#000000",straightFirst:!1,straightLast:!1,point:{visible:!1,fixed:!0,withLabel:!1,name:""}},point:{withLabel:!0,style:5,face:"o",size:3,fillColor:"#ff0000",highlightFillColor:"#EEEEEE",strokeWidth:2,strokeColor:"#ff0000",highlightStrokeColor:"#C3D9FF",zoom:!1,showInfobox:!0,draft:!1,attractors:[],attractorDistance:0,snatchDistance:0,snapToGrid:!1,snapSizeX:1,snapSizeY:1,snapToPoints:!1},polygon:{hasInnerPoints:!1,fillColor:"#00FF00",highlightFillColor:"#00FF00",fillOpacity:.3,highlightFillOpacity:.3,withLines:!0,borders:{withLabel:!1,strokeWidth:1,highlightStrokeWidth:1,layer:5},vertices:{withLabel:!0,strokeColor:"#ff0000",fillColor:"#ff0000",fixed:!0},label:{offsets:[0,0]}},riemannsum:{withLabel:!1,fillOpacity:.3,fillColor:"#ffff00"},sector:{fillColor:"#00FF00",highlightFillColor:"#00FF00",fillOpacity:.3,highlightFillOpacity:.3},semicircle:{midpoint:{visible:!1,withLabel:!1,fixed:!1,name:""}},slider:{snapWidth:-1,precision:2,firstArrow:!1,lastArrow:!1,withTicks:!0,withLabel:!0,layer:9,showInfobox:!1,name:"",visible:!0,strokeColor:"#000000",highlightStrokeColor:"#888888",fillColor:"#ffffff",highlightFillColor:"none",size:6,point1:{needsRegularUpdate:!1,showInfobox:!1,withLabel:!1,visible:!1,fixed:!0,name:""},point2:{needsRegularUpdate:!1,showInfobox:!1,withLabel:!1,visible:!1,fixed:!0,name:""},baseline:{needsRegularUpdate:!1,name:"",strokeWidth:1,strokeColor:"#000000",highlightStrokeColor:"#888888"},ticks:{needsRegularUpdate:!1,drawLabels:!1,drawZero:!0,insertTicks:!0,minorHeight:4,majorHeight:10,minorTicks:0,defaultDistance:1,strokeOpacity:1,strokeWidth:1,strokeColor:"#000000"},highline:{strokeWidth:3,name:"",strokeColor:"#000000",highlightStrokeColor:"#888888"},label:{strokeColor:"#000000"}},text:{fontSize:12,digits:2,isLabel:!1,strokeColor:"#000000",useASCIIMathML:!1,useMathJax:!1,display:"html",cssClass:"JXGtext",highlightCssClass:"JXGtext",withLabel:!1},tracecurve:{strokeColor:"#000000",fillColor:"none",numberPoints:100},turtle:{strokeWidth:1,fillColor:"none",strokeColor:"#000000",arrow:{strokeWidth:2,withLabel:!1,strokeColor:"#ff0000"}},shortcuts:{color:["strokeColor","fillColor"],opacity:["strokeOpacity","fillOpacity"],highlightColor:["highlightStrokeColor","highlightFillColor"],highlightOpacity:["highlightStrokeOpacity","highlightFillOpacity"],strokeWidth:["strokeWidth","highlightStrokeWidth"]}},JXG.Validator=function(){var e,t=function(e){return/^[0-9]+px$/.test(e)},i=function(e){return e in{html:0,internal:0}},n=function(e){return JXG.isString(e)},r=function(e){return JXG.exists(JXG.Point.prototype.normalizeFace.call(this,e))},o=function(e){return Math.abs(e-Math.round(e))0},s=function(e){return e in{vml:0,svg:0,canvas:0}},l=function(e){return e>0},c=function(e){return!(0>e)},u={},d={attractorDistance:c,color:n,defaultDistance:JXG.isNumber,display:i,doAdvancedPlot:!1,draft:!1,drawLabels:!1,drawZero:!1,face:r,factor:JXG.isNumber,fillColor:n,fillOpacity:JXG.isNumber,firstArrow:!1,fontSize:o,dash:o,gridX:JXG.isNumber,gridY:JXG.isNumber,hasGrid:!1,highlightFillColor:n,highlightFillOpacity:JXG.isNumber,highlightStrokeColor:n,highlightStrokeOpacity:JXG.isNumber,insertTicks:!1,lastArrow:!1,majorHeight:o,maxTicksDistance:a,minorHeight:o,minorTicks:a,minTicksDistance:a,numberPointsHigh:a,numberPointsLow:a,opacity:JXG.isNumber,radius:JXG.isNumber,RDPsmoothing:!1,renderer:s,right:t,showCopyright:!1,showInfobox:!1,showNavigation:!1,size:o,snapSizeX:l,snapSizeY:l,snapWidth:JXG.isNumber,snapToGrid:!1,snatchDistance:c,straightFirst:!1,straightLast:!1,stretch:!1,strokeColor:n,strokeOpacity:JXG.isNumber,strokeWidth:o,takeFirst:!1,takeSizeFromFile:!1,to10:!1,toOrigin:!1,translateTo10:!1,translateToOrigin:!1,useASCIIMathML:!1,useDirection:!1,useMathJax:!1,withLabel:!1,withTicks:!1,zoom:!1};for(e in d)u[e.toLowerCase()]=d[e];return u}(),JXG.useStandardOptions=function(e){var t,i,n,r,o=JXG.Options,a=e.hasGrid;e.options.grid.hasGrid=o.grid.hasGrid,e.options.grid.gridX=o.grid.gridX,e.options.grid.gridY=o.grid.gridY,e.options.grid.gridColor=o.grid.gridColor,e.options.grid.gridOpacity=o.grid.gridOpacity,e.options.grid.gridDash=o.grid.gridDash,e.options.grid.snapToGrid=o.grid.snapToGrid,e.options.grid.snapSizeX=o.grid.SnapSizeX,e.options.grid.snapSizeY=o.grid.SnapSizeY,e.takeSizeFromFile=o.takeSizeFromFile,r=function(e,t){e.visProp.fillcolor=t.fillColor,e.visProp.highlightfillcolor=t.highlightFillColor,e.visProp.strokecolor=t.strokeColor,e.visProp.highlightstrokecolor=t.highlightStrokeColor};for(t in e.objects)if(n=e.objects[t],n.elementClass==JXG.OBJECT_CLASS_POINT)r(n,o.point);else if(n.elementClass==JXG.OBJECT_CLASS_LINE){r(n,o.line);for(i in n.ticks)i.majorTicks=o.line.ticks.majorTicks,i.minTicksDistance=o.line.ticks.minTicksDistance,i.visProp.minorheight=o.line.ticks.minorHeight,i.visProp.majorheight=o.line.ticks.majorHeight}else n.elementClass==JXG.OBJECT_CLASS_CIRCLE?r(n,o.circle):n.type==JXG.OBJECT_TYPE_ANGLE?r(n,o.angle):n.type==JXG.OBJECT_TYPE_ARC?r(n,o.arc):n.type==JXG.OBJECT_TYPE_POLYGON?r(n,o.polygon):n.type==JXG.OBJECT_TYPE_CONIC?r(n,o.conic):n.type==JXG.OBJECT_TYPE_CURVE?r(n,o.curve):n.type==JXG.OBJECT_TYPE_SECTOR&&(n.arc.visProp.fillcolor=o.sector.fillColor,n.arc.visProp.highlightfillcolor=o.sector.highlightFillColor,n.arc.visProp.fillopacity=o.sector.fillOpacity,n.arc.visProp.highlightfillopacity=o.sector.highlightFillOpacity);e.fullUpdate(),a&&!e.hasGrid?e.removeGrids(e):!a&&e.hasGrid&&e.create("grid",[])},JXG.useBlackWhiteOptions=function(e){var t=JXG.Options;t.point.fillColor=JXG.rgb2bw(t.point.fillColor),t.point.highlightFillColor=JXG.rgb2bw(t.point.highlightFillColor),t.point.strokeColor=JXG.rgb2bw(t.point.strokeColor),t.point.highlightStrokeColor=JXG.rgb2bw(t.point.highlightStrokeColor),t.line.fillColor=JXG.rgb2bw(t.line.fillColor),t.line.highlightFillColor=JXG.rgb2bw(t.line.highlightFillColor),t.line.strokeColor=JXG.rgb2bw(t.line.strokeColor),t.line.highlightStrokeColor=JXG.rgb2bw(t.line.highlightStrokeColor),t.circle.fillColor=JXG.rgb2bw(t.circle.fillColor),t.circle.highlightFillColor=JXG.rgb2bw(t.circle.highlightFillColor),t.circle.strokeColor=JXG.rgb2bw(t.circle.strokeColor),t.circle.highlightStrokeColor=JXG.rgb2bw(t.circle.highlightStrokeColor),t.arc.fillColor=JXG.rgb2bw(t.arc.fillColor),t.arc.highlightFillColor=JXG.rgb2bw(t.arc.highlightFillColor),t.arc.strokeColor=JXG.rgb2bw(t.arc.strokeColor),t.arc.highlightStrokeColor=JXG.rgb2bw(t.arc.highlightStrokeColor),t.polygon.fillColor=JXG.rgb2bw(t.polygon.fillColor),t.polygon.highlightFillColor=JXG.rgb2bw(t.polygon.highlightFillColor),t.sector.fillColor=JXG.rgb2bw(t.sector.fillColor),t.sector.highlightFillColor=JXG.rgb2bw(t.sector.highlightFillColor),t.curve.strokeColor=JXG.rgb2bw(t.curve.strokeColor),t.grid.gridColor=JXG.rgb2bw(t.grid.gridColor),JXG.useStandardOptions(e)},JXG.JSXGraph={licenseText:"JSXGraph v0.94 Copyright (C) see http://jsxgraph.org",boards:{},elements:{},rendererType:function(){function e(){document.body.scrollLeft,document.body.scrollTop}var t,i;for(JXG.supportsSVG()?JXG.Options.renderer="svg":JXG.supportsVML()?(JXG.Options.renderer="vml",document.onmousemove=e):JXG.Options.renderer="canvas",i=JXG.rendererFiles[JXG.Options.renderer].split(","),t=0;i.length>t;t++)(function(e){JXG.require(JXG.requirePath+e+".js")})(i[t]);return JXG.Options.renderer}(),initBoard:function(e,t){var i,n,r,o,a,s,l,c,u,d,h,p,f,g,m,b,v;return c=JXG.getDimensions(e),t===void 0&&(t={}),t.boundingbox!==void 0?(u=t.boundingbox,s=parseInt(c.width),l=parseInt(c.height),t.keepaspectratio?(o=s/(u[2]-u[0]),a=l/(-u[3]+u[1]),Math.abs(o)0){this.board=e,this.type=i,this.elementClass=n||JXG.OBJECT_CLASS_OTHER,this.id=t.id,r=t.name,JXG.exists(r)||(r=this.board.generateName(this)),this.board.elementsByName[r]=this,this.name=r,this.needsRegularUpdate=t.needsregularupdate,JXG.clearVisPropOld(this),t=this.resolveShortcuts(t);for(o in t)this._set(o,t[o]);this.visProp.draft=t.draft&&t.draft.draft,this.visProp.gradientangle="270",this.visProp.gradientsecondopacity=this.visProp.fillopacity,this.visProp.gradientpositionx=.5,this.visProp.gradientpositiony=.5}},JXG.extend(JXG.GeometryElement.prototype,{addChild:function(e){var t,i;this.childElements[e.id]=e,this.addDescendants(e),e.ancestors[this.id]=this;for(t in this.descendants){this.descendants[t].ancestors[this.id]=this;for(i in this.ancestors)this.descendants[t].ancestors[this.ancestors[i].id]=this.ancestors[i]}for(t in this.ancestors)for(i in this.descendants)this.ancestors[t].descendants[this.descendants[i].id]=this.descendants[i];return this},addDescendants:function(e){var t;this.descendants[e.id]=e;for(t in e.childElements)this.addDescendants(e.childElements[t]);return this},countChildren:function(){var e,t,i=0;t=this.childElements;for(e in t)t.hasOwnProperty(e)&&0>e.indexOf("Label")&&i++;return i},getName:function(){return this.name},draggable:function(){return this.isDraggable&&!this.visProp.fixed&&!this.visProp.frozen&&this.type!=JXG.OBJECT_TYPE_GLIDER},generatePolynomial:function(){return[]},animate:function(e,t,i){i=i||{};var n,r,o,a=35,s=Math.ceil(t/(1*a)),l=this;this.animationData={};var c=function(e,t,i){var n,r,a,c,u;for(n=JXG.rgb2hsv(e),r=JXG.rgb2hsv(t),a=(r[0]-n[0])/(1*s),c=(r[1]-n[1])/(1*s),u=(r[2]-n[2])/(1*s),l.animationData[i]=Array(s),o=0;s>o;o++)l.animationData[i][s-o-1]=JXG.hsv2rgb(n[0]+(o+1)*a,n[1]+(o+1)*c,n[2]+(o+1)*u)},u=function(e,t,i){if(e=parseFloat(e),t=parseFloat(t),!isNaN(e)&&!isNaN(t)){var n=(t-e)/(1*s);for(l.animationData[i]=Array(s),o=0;s>o;o++)l.animationData[i][s-o-1]=e+(o+1)*n}};for(n in e)switch(r=n.toLowerCase()){case"strokecolor":case"fillcolor":c(this.visProp[r],e[n],r);break;case"strokeopacity":case"strokewidth":case"fillopacity":u(this.visProp[r],e[n],r)}return this.animationCallback=i.callback,this.board.addAnimation(this),this},update:function(){return this.visProp.trace&&this.cloneToBackground(!0),this},updateRenderer:function(){return this},hideElement:function(){return this.visProp.visible=!1,this.board.renderer.hide(this),null!=this.label&&this.hasLabel&&(this.label.hiddenByParent=!0,this.label.content.visProp.visible&&this.board.renderer.hide(this.label.content)),this
},showElement:function(){return this.visProp.visible=!0,this.board.renderer.show(this),null!=this.label&&this.hasLabel&&this.label.hiddenByParent&&(this.label.hiddenByParent=!1,this.label.content.visProp.visible&&this.board.renderer.show(this.label.content)),this},_set:function(e,t){e=e.toLocaleLowerCase(),this.visProp.hasOwnProperty(e)&&e.indexOf("color")>=0&&JXG.isString(t)&&9==t.length&&"#"===t.charAt(0)?(t=JXG.rgba2rgbo(t),this.visProp[e]=t[0],this.visProp[e.replace("color","opacity")]=t[1]):this.visProp[e]=t},resolveShortcuts:function(e){var t,i;for(t in JXG.Options.shortcuts)if(JXG.exists(e[t]))for(i=0;JXG.Options.shortcuts[t].length>i;i++)JXG.exists(e[JXG.Options.shortcuts[t][i]])||(e[JXG.Options.shortcuts[t][i]]=e[t]);return e},setLabelText:function(e){return e=e.replace(//g,">"),null!==this.label&&this.label.content.setText(e),this},setAttribute:JXG.shortcut(JXG.GeometryElement.prototype,"setProperty"),setProperty:function(){var e,t,i,n,r,o,a={};for(e=0;arguments.length>e;e++)n=arguments[e],JXG.isString(n)?(o=n.split(":"),a[JXG.trim(o[0])]=JXG.trim(o[1])):JXG.isArray(n)?a[n[0]]=n[1]:JXG.extend(a,n);a=this.resolveShortcuts(a);for(e in a)switch(t=e.replace(/\s+/g,"").toLowerCase(),i=a[e],t){case"name":delete this.board.elementsByName[this.name],this.name=i,this.board.elementsByName[this.name]=this;break;case"needsregularupdate":this.needsRegularUpdate=!("false"==i||0==i),this.board.renderer.setBuffering(this,this.needsRegularUpdate?"auto":"static");break;case"labelcolor":i=JXG.rgba2rgbo(i),r=i[1],i=i[0],0==r&&null!=this.label&&this.hasLabel&&this.label.content.hideElement(),null!=this.label&&this.hasLabel&&(this.label.color=i,this.board.renderer.setObjectStrokeColor(this.label.content,i,r)),this.type==JXG.OBJECT_TYPE_TEXT&&(this.visProp.strokecolor=i,this.visProp.strokeopacity=r,this.board.renderer.setObjectStrokeColor(this,this.visProp.strokecolor,this.visProp.strokeopacity));break;case"infoboxtext":this.infoboxText="string"==typeof i?i:!1;break;case"visible":"false"==i||0==i?(this.visProp.visible=!1,this.hideElement()):("true"==i||1==i)&&(this.visProp.visible=!0,this.showElement());break;case"face":this.elementClass==JXG.OBJECT_CLASS_POINT&&(this.visProp.face=i,this.board.renderer.changePointStyle(this));break;case"trace":"false"==i||0==i?(this.clearTrace(),this.visProp.trace=!1):this.visProp.trace=!0;break;case"gradient":this.visProp.gradient=i,this.board.renderer.setGradient(this);break;case"gradientsecondcolor":i=JXG.rgba2rgbo(i),this.visProp.gradientsecondcolor=i[0],this.visProp.gradientsecondopacity=i[1],this.board.renderer.updateGradient(this);break;case"gradientsecondopacity":this.visProp.gradientsecondopacity=i,this.board.renderer.updateGradient(this);break;case"withlabel":this.visProp.withlabel=i,i?this.label&&this.label.content?this.visProp.visible&&this.label.content.showElement():(this.createLabel(),this.visProp.visible||this.label.content.hideElement()):this.label&&this.label.content&&this.hasLabel&&this.label.content.hideElement(),this.hasLabel=i;break;default:JXG.exists(this.visProp[t])&&(!JXG.Validator[t]||JXG.Validator[t]&&JXG.Validator[t](i)||JXG.Validator[t]&&JXG.isFunction(i)&&JXG.Validator[t](i()))&&(i=i.toLowerCase&&"false"===i.toLowerCase()?!1:i,this._set(t,i))}return this.type==JXG.OBJECT_TYPE_AXIS&&this.board.fullUpdate(),this.board.update(this),this},getAttribute:JXG.shortcut(JXG.GeometryElement.prototype,"getProperty"),getProperty:function(e){var t;switch(e=e.toLowerCase()){case"needsregularupdate":t=this.needsRegularUpdate;break;case"labelcolor":t=this.label.color;break;case"infoboxtext":t=this.infoboxText;break;case"withlabel":t=this.hasLabel;break;default:t=this.visProp[e]}return t},setDash:function(e){return this.setProperty({dash:e}),this},prepareUpdate:function(){return this.needsUpdate=!0,this},remove:function(){return this.board.renderer.remove(this.board.renderer.getElementById(this.id)),this.hasLabel&&this.board.renderer.remove(this.board.renderer.getElementById(this.label.content.id)),this},getTextAnchor:function(){return new JXG.Coords(JXG.COORDS_BY_USER,[0,0],this.board)},getLabelAnchor:function(){return new JXG.Coords(JXG.COORDS_BY_USER,[0,0],this.board)},setStraight:function(){return this},setArrow:function(e,t){return this.visProp.firstarrow=e,this.visProp.lastarrow=t,this.prepareUpdate().update(),this},createGradient:function(){("linear"===this.visProp.gradient||"radial"===this.visProp.gradient)&&this.board.renderer.setGradient(this)},createLabel:function(){var e={};return e=JXG.deepCopy(this.visProp.label,null),e.id=this.id+"Label",e.isLabel=!0,e.visible=this.visProp.visible,e.anchor=this,this.nameHTML=JXG.GeonextParser.replaceSup(JXG.GeonextParser.replaceSub(this.name)),this.label={},this.visProp.withlabel&&(this.label.relativeCoords=[0,0],this.label.content=JXG.createText(this.board,[this.label.relativeCoords[0],-this.label.relativeCoords[1],this.nameHTML],e),this.label.content.dump=!1,this.label.color=this.label.content.visProp.strokecolor,this.visProp.visible||(this.label.hiddenByParent=!0,this.label.content.visProp.visible=!1),this.hasLabel=!0),this},highlight:function(){return this.highlighted||(this.highlighted=!0,this.board.renderer.highlight(this)),this},noHighlight:function(){return this.highlighted&&(this.highlighted=!1,this.board.renderer.noHighlight(this)),this},clearTrace:function(){var e;for(e in this.traces)this.board.renderer.remove(this.traces[e]);return this.numTraces=0,this},cloneToBackground:function(){return this},bounds:function(){},normalize:function(){return this.stdform=JXG.Math.normalize(this.stdform),this},toJSON:function(){var e='{"name":'+this.name;e+=', "id":'+this.id;var t=[];for(var i in this.visProp)null!=this.visProp[i]&&t.push('"'+i+'":'+this.visProp[i]);return e+=', "visProp":{'+(""+t)+"}",e+="}"},highlightStrokeColor:function(e){return this.setProperty({highlightStrokeColor:e}),this},strokeColor:function(e){return this.setProperty({strokeColor:e}),this},strokeWidth:function(e){return this.setProperty({strokeWidth:e}),this},fillColor:function(e){return this.setProperty({fillColor:e}),this},highlightFillColor:function(e){return this.setProperty({highlightFillColor:e}),this},labelColor:function(e){return this.setProperty({labelColor:e}),this},dash:function(e){return this.setProperty({dash:e}),this},visible:function(e){return this.setProperty({visible:e}),this},shadow:function(e){return this.setProperty({shadow:e}),this},getType:function(){return this.elType},getParents:function(){return this.parents},getAttributes:function(){var e,t=JXG.deepCopy(this.visProp),i=["attractors","attractordistance","snatchdistance","traceattributes","frozen","shadow","gradientangle","gradientsecondopacity","gradientpositionx","gradientpositiony","needsregularupdate","zoom","layer","labeloffsets"];for(t.id=this.id,t.name=this.name,e=0;i.length>e;e++)delete t[i[e]];return t},hasPoint:function(){return!1},triggerEventHandlers:function(e){var t;if(JXG.isArray(this.eventHandlers[e]))for(t=0;this.eventHandlers[e].length>t;t++)this.eventHandlers[e][t].call(this)},on:function(e,t){JXG.isArray(this.eventHandlers[e])||(this.eventHandlers[e]=[]),this.eventHandlers[e].push(t)},addEvent:JXG.shortcut(JXG.GeometryElement.prototype,"on"),off:function(e,t){var i;e&&JXG.isArray(this.eventHandlers[e])&&(t?(i=JXG.indexOf(this.eventHandlers[e],t),i>-1&&this.eventHandlers[e].splice(i,1)):this.eventHandlers[e].length=0)},removeEvent:JXG.shortcut(JXG.GeometryElement.prototype,"off")}),JXG.COORDS_BY_USER=1,JXG.COORDS_BY_SCREEN=2,JXG.Coords=function(e,t,i){this.board=i,this.usrCoords=[],this.scrCoords=[],this.setCoordinates(e,t)},JXG.extend(JXG.Coords.prototype,{normalizeUsrCoords:function(){var e=JXG.Math.eps;Math.abs(this.usrCoords[0])>e&&(this.usrCoords[1]/=this.usrCoords[0],this.usrCoords[2]/=this.usrCoords[0],this.usrCoords[0]=1)},usr2screen:function(e){var t=Math.round,i=this.board,n=this.usrCoords,r=i.origin.scrCoords;null===e||e?(this.scrCoords[0]=t(n[0]),this.scrCoords[1]=t(n[0]*r[1]+n[1]*i.unitX),this.scrCoords[2]=t(n[0]*r[2]-n[2]*i.unitY)):(this.scrCoords[0]=n[0],this.scrCoords[1]=n[0]*r[1]+n[1]*i.unitX,this.scrCoords[2]=n[0]*r[2]-n[2]*i.unitY)},screen2usr:function(){var e=this.board.origin.scrCoords,t=this.scrCoords,i=this.board;this.usrCoords[0]=1,this.usrCoords[1]=(t[1]-e[1])/i.unitX,this.usrCoords[2]=(e[2]-t[2])/i.unitY},distance:function(e,t){var i,n,r=0,o=this.usrCoords,a=this.scrCoords;if(e===JXG.COORDS_BY_USER){if(i=t.usrCoords,n=o[0]-i[0],r=n*n,r>JXG.Math.eps)return Number.POSITIVE_INFINITY;n=o[1]-i[1],r+=n*n,n=o[2]-i[2],r+=n*n}else i=t.scrCoords,n=a[1]-i[1],r+=n*n,n=a[2]-i[2],r+=n*n;return Math.sqrt(r)},setCoordinates:function(e,t,i){var n=this.usrCoords,r=this.scrCoords;return e===JXG.COORDS_BY_USER?(2===t.length?(n[0]=1,n[1]=t[0],n[2]=t[1]):(n[0]=t[0],n[1]=t[1],n[2]=t[2],this.normalizeUsrCoords()),this.usr2screen(i)):(r[1]=t[0],r[2]=t[1],this.screen2usr()),this}}),JXG.Point=function(e,t,i){this.constructor(e,i,JXG.OBJECT_TYPE_POINT,JXG.OBJECT_CLASS_POINT),null==t&&(t=[0,0]),this.coords=new JXG.Coords(JXG.COORDS_BY_USER,t,this.board),this.initialCoords=new JXG.Coords(JXG.COORDS_BY_USER,t,this.board),this.position=null,this.onPolygon=!1,this.slideObject=null,this.Xjc=null,this.Yjc=null,this.methodMap=JXG.deepCopy(this.methodMap,{move:"moveTo",glide:"makeGlider",X:"X",Y:"Y",free:"free",setPosition:"setGliderPosition"}),this.group=[],this.elType="point",this.id=this.board.setId(this,"P"),this.board.renderer.drawPoint(this),this.board.finalizeAdding(this),this.createLabel()},JXG.Point.prototype=new JXG.GeometryElement,JXG.extend(JXG.Point.prototype,{hasPoint:function(e,t){var i,n=this.coords.scrCoords;return i=parseFloat(this.visProp.size),this.board.options.precision.hasPoint>i&&(i=this.board.options.precision.hasPoint),i+2>Math.abs(n[1]-e)&&i+2>Math.abs(n[2]-t)},updateConstraint:function(){return this},update:function(e){return this.needsUpdate?(e===void 0&&(e=!1),this.type==JXG.OBJECT_TYPE_GLIDER&&(e?this.updateGliderFromParent():this.updateGlider()),(this.type==JXG.OBJECT_TYPE_CAS||this.type==JXG.OBJECT_TYPE_AXISPOINT)&&this.updateConstraint(),this.updateTransform(),this.visProp.trace&&this.cloneToBackground(!0),this):this},updateGlider:function(){var e,t,i,n,r,o,a,s;if(this.slideObject.elementClass==JXG.OBJECT_CLASS_CIRCLE)this.coords=JXG.Math.Geometry.projectPointToCircle(this,this.slideObject,this.board),this.position=JXG.Math.Geometry.rad([this.slideObject.center.X()+1,this.slideObject.center.Y()],this.slideObject.center,this);else if(this.slideObject.elementClass==JXG.OBJECT_CLASS_LINE){if(this.onPolygon)if(t=this.slideObject.point1.coords.usrCoords,i=this.slideObject.point2.coords.usrCoords,e=1,n=i[e]-t[e],Math.abs(n)s){for(e=0;o.borders.length>e;e++)if(this.slideObject==o.borders[e]){this.slideObject=o.borders[(e-1+o.borders.length)%o.borders.length];break}}else if(s>1)for(e=0;o.borders.length>e;e++)if(this.slideObject==o.borders[e]){this.slideObject=o.borders[(e+1+o.borders.length)%o.borders.length];break}t=this.slideObject.point1.coords,i=this.slideObject.point2.coords,n=t.distance(JXG.COORDS_BY_USER,i),t=t.usrCoords.slice(0),i=i.usrCoords.slice(0),JXG.Math.eps>n?(this.coords.setCoordinates(JXG.COORDS_BY_USER,t),this.position=0):(n==Number.POSITIVE_INFINITY&&(n=1/JXG.Math.eps,Math.abs(i[0])0&&Math.abs(this._smax-this._smin)>=JXG.Math.eps&&(0>this.position&&(this.position=0),this.position>1&&(this.position=1),r=this.position*(this._smax-this._smin)+this._smin,r=Math.round(r/this.visProp.snapwidth)*this.visProp.snapwidth,this.position=(r-this._smin)/(this._smax-this._smin),this.update(!0)),t=this.slideObject.point1.coords.usrCoords,!this.slideObject.visProp.straightfirst&&Math.abs(t[0])>JXG.Math.eps&&0>this.position&&(this.coords.setCoordinates(JXG.COORDS_BY_USER,t),this.position=0),i=this.slideObject.point2.coords.usrCoords,!this.slideObject.visProp.straightlast&&Math.abs(i[0])>JXG.Math.eps&&this.position>1&&(this.coords.setCoordinates(JXG.COORDS_BY_USER,i),this.position=1)}else this.slideObject.type==JXG.OBJECT_TYPE_TURTLE?(this.updateConstraint(),this.coords=JXG.Math.Geometry.projectPointToTurtle(this,this.slideObject,this.board)):this.slideObject.elementClass==JXG.OBJECT_CLASS_CURVE?(this.updateConstraint(),this.coords=JXG.Math.Geometry.projectPointToCurve(this,this.slideObject,this.board)):this.slideObject.elementClass==JXG.OBJECT_CLASS_POINT&&(this.coords=JXG.Math.Geometry.projectPointToPoint(this,this.slideObject,this.board))},updateGliderFromParent:function(){var e,t,i,n;this.slideObject.elementClass==JXG.OBJECT_CLASS_CIRCLE?(i=this.slideObject.Radius(),this.coords.setCoordinates(JXG.COORDS_BY_USER,[this.slideObject.center.X()+i*Math.cos(this.position),this.slideObject.center.Y()+i*Math.sin(this.position)])):this.slideObject.elementClass==JXG.OBJECT_CLASS_LINE?(e=this.slideObject.point1.coords,t=this.slideObject.point2.coords,n=e.distance(JXG.COORDS_BY_USER,t),e=e.usrCoords.slice(0),t=t.usrCoords.slice(0),n==Number.POSITIVE_INFINITY&&(n=1/JXG.Math.eps,Math.abs(t[0])JXG.Math.eps?this.isReal:!1,this.isReal?(e!=this.isReal&&(this.board.renderer.show(this),this.hasLabel&&this.label.content.visProp.visible&&this.board.renderer.show(this.label.content)),this.board.renderer.updatePoint(this)):e!=this.isReal&&(this.board.renderer.hide(this),this.hasLabel&&this.label.content.visProp.visible&&this.board.renderer.hide(this.label.content))}return this.hasLabel&&this.visProp.visible&&this.label.content&&this.label.content.visProp.visible&&this.isReal&&(this.label.content.update(),this.board.renderer.updateText(this.label.content)),this.needsUpdate=!1,this},X:function(){return this.coords.usrCoords[1]},Y:function(){return this.coords.usrCoords[2]},Z:function(){return this.coords.usrCoords[0]},XEval:function(){return this.coords.usrCoords[1]},YEval:function(){return this.coords.usrCoords[2]},ZEval:function(){return this.coords.usrCoords[0]},bounds:function(){return this.coords.usrCoords.slice(1).concat(this.coords.usrCoords.slice(1))},Dist:function(e){var t,i,n=e.coords.usrCoords,r=this.coords.usrCoords;return i=r[0]-n[0],t=i*i,i=r[1]-n[1],t+=i*i,i=r[2]-n[2],t+=i*i,Math.sqrt(t)},handleSnapToGrid:function(){var e,t,i=this.visProp.snapsizex,n=this.visProp.snapsizey;return this.visProp.snaptogrid&&(e=this.coords.usrCoords[1],t=this.coords.usrCoords[2],0>=i&&this.board.defaultAxes&&this.board.defaultAxes.x.defaultTicks&&(i=this.board.defaultAxes.x.defaultTicks.ticksDelta*(this.board.defaultAxes.x.defaultTicks.visProp.minorticks+1)),0>=n&&this.board.defaultAxes&&this.board.defaultAxes.y.defaultTicks&&(n=this.board.defaultAxes.y.defaultTicks.ticksDelta*(this.board.defaultAxes.y.defaultTicks.visProp.minorticks+1)),i>0&&n>0&&(this.coords=new JXG.Coords(JXG.COORDS_BY_USER,[Math.round(e/i)*i,Math.round(t/n)*n],this.board))),this},handleSnapToPoints:function(){var e,t,i,n=0,r=1/0,o=null;if(this.visProp.snaptopoints){for(e in this.board.objects)t=this.board.objects[e],t.elementClass==JXG.OBJECT_CLASS_POINT&&t!==this&&t.visProp.visible&&(i=JXG.Math.Geometry.projectPointToPoint(this,t,this.board),n=i.distance(JXG.COORDS_BY_USER,this.coords),this.visProp.attractordistance>n&&r>n&&(r=n,o=i));null!=o&&this.coords.setCoordinates(JXG.COORDS_BY_USER,o.usrCoords)}return this},handleAttractors:function(){var e,t,i,n,r=this.visProp.attractors.length,o=0;if(0!=this.visProp.attractordistance){for(e=!1,t=0;r>t;t++)if(i=JXG.getRef(this.board,this.visProp.attractors[t]),JXG.exists(i)&&i!==this){if(i.elementClass==JXG.OBJECT_CLASS_POINT?n=JXG.Math.Geometry.projectPointToPoint(this,i,this.board):i.elementClass==JXG.OBJECT_CLASS_LINE?n=JXG.Math.Geometry.projectPointToLine(this,i,this.board):i.elementClass==JXG.OBJECT_CLASS_CIRCLE?n=JXG.Math.Geometry.projectPointToCircle(this,i,this.board):i.elementClass==JXG.OBJECT_CLASS_CURVE?n=JXG.Math.Geometry.projectPointToCurve(this,i,this.board):i.type==JXG.OBJECT_TYPE_TURTLE&&(n=JXG.Math.Geometry.projectPointToTurtle(this,i,this.board)),o=n.distance(JXG.COORDS_BY_USER,this.coords),this.visProp.attractordistance>o){e=!0,(this.type!=JXG.OBJECT_TYPE_GLIDER||this.slideObject!=i)&&this.makeGlider(i);break}i==this.slideObject&&o>=this.visProp.snatchdistance&&(this.type=JXG.OBJECT_TYPE_POINT)}return this}},setPositionDirectly:function(e,t,i){var n,r,o,a,s,l,c=this.coords;if(this.coords=new JXG.Coords(e,[t,i],this.board),this.handleSnapToGrid(),this.handleSnapToPoints(),this.handleAttractors(),0!=this.group.length){for(r=this.coords.usrCoords[1]-c.usrCoords[1],o=this.coords.usrCoords[2]-c.usrCoords[2],n=0;this.group.length>n;n++)for(a in this.group[n].objects)s=this.group[n].objects[a],s.initialCoords=new JXG.Coords(JXG.COORDS_BY_USER,[s.initialCoords.usrCoords[1]+r,s.initialCoords.usrCoords[2]+o],this.board);this.group[this.group.length-1].dX=this.coords.scrCoords[1]-c.scrCoords[1],this.group[this.group.length-1].dY=this.coords.scrCoords[2]-c.scrCoords[2],this.group[this.group.length-1].update(this)}else{for(n=this.transformations.length-1;n>=0;n--)l=e==JXG.COORDS_BY_SCREEN?new JXG.Coords(e,[t,i],this.board).usrCoords:[1,t,i],this.initialCoords=new JXG.Coords(JXG.COORDS_BY_USER,JXG.Math.matVecMult(JXG.Math.inverse(this.transformations[n].matrix),l),this.board);this.update()}return this},setPositionByTransform:function(e,t,i){var n=this.board.create("transform",[t,i],{type:"translate"});return this.transformations.length>0&&this.transformations[this.transformations.length-1].isNumericMatrix?this.transformations[this.transformations.length-1].melt(n):this.addTransform(this,n),0==this.group.length&&this.update(),this},setPosition:function(e,t,i){return this.setPositionDirectly(e,t,i),this},setGliderPosition:function(e){return(this.type=JXG.OBJECT_TYPE_GLIDER)&&(this.position=e,this.board.update()),this},makeGlider:function(e){return this.slideObject=JXG.getRef(this.board,e),this.type=JXG.OBJECT_TYPE_GLIDER,this.elType="glider",this.visProp.snapwidth=-1,this.slideObject.addChild(this),this.isDraggable=!0,this.generatePolynomial=function(){return this.slideObject.generatePolynomial(this)},this.updateGlider(),this},free:function(){var e;if(this.type!==JXG.OBJECT_TYPE_GLIDER){if(this.isDraggable)return;this.isDraggable=!0,this.type=JXG.OBJECT_TYPE_POINT,this.XEval=function(){return this.coords.usrCoords[1]},this.YEval=function(){return this.coords.usrCoords[2]},this.ZEval=function(){return this.coords.usrCoords[0]},this.Xjc=null,this.Yjc=null}for(e in this.ancestors)delete this.ancestors[e].descendants[this.id],delete this.ancestors[e].childElements[this.id];this.ancestors=[],this.slideObject=null,this.elType="point",this.type=JXG.OBJECT_TYPE_POINT},addConstraint:function(e){this.type=JXG.OBJECT_TYPE_CAS;var t,i,n,r=[],o=["X","Y"];for(this.isDraggable=!1,i=0;e.length>i;i++)n=e[i],"string"==typeof n?(r[i]=this.board.jc.snippet(n,!0,null,!0),2===e.length&&(this[o[i]+"jc"]=e[i])):"function"==typeof n?r[i]=n:"number"==typeof n?r[i]=function(e){return function(){return e}}(n):"object"==typeof n&&"function"==typeof n.Value&&(r[i]=function(e){return function(){return e.Value()}}(n)),r[i].origin=n;return 1==e.length?this.updateConstraint=function(){var e=r[0]();JXG.isArray(e)?this.coords.setCoordinates(JXG.COORDS_BY_USER,e):this.coords=e}:2==e.length?(this.XEval=r[0],this.YEval=r[1],t="this.coords.setCoordinates(JXG.COORDS_BY_USER,[this.XEval(),this.YEval()]);",this.updateConstraint=Function("",t)):(this.ZEval=r[0],this.XEval=r[1],this.YEval=r[2],t="this.coords.setCoordinates(JXG.COORDS_BY_USER,[this.ZEval(),this.XEval(),this.YEval()]);",this.updateConstraint=Function("",t)),this.board.isSuspendedUpdate||this.prepareUpdate().update().updateRenderer(),this},updateTransform:function(){if(0==this.transformations.length||null==this.baseElement)return this;var e,t;for(e=this===this.baseElement?this.transformations[0].apply(this.baseElement,"self"):this.transformations[0].apply(this.baseElement),this.coords.setCoordinates(JXG.COORDS_BY_USER,e),t=1;this.transformations.length>t;t++)this.coords.setCoordinates(JXG.COORDS_BY_USER,this.transformations[t].apply(this));return this},addTransform:function(e,t){var i,n=JXG.isArray(t)?t:[t],r=n.length;for(0===this.transformations.length&&(this.baseElement=e),i=0;r>i;i++)this.transformations.push(n[i]);return this},startAnimation:function(e,t){return this.type==JXG.OBJECT_TYPE_GLIDER&&this.intervalCode===void 0&&(this.intervalCode=window.setInterval("JXG.JSXGraph.boards['"+this.board.id+"'].objects['"+this.id+"']._anim("+e+", "+t+")",250),this.intervalCount===void 0&&(this.intervalCount=0)),this},stopAnimation:function(){return this.intervalCode!==void 0&&(window.clearInterval(this.intervalCode),delete this.intervalCode),this},moveAlong:function(e,t,i){i=i||{};var n,r,o=[],a=35,s=function(t,i){return function(){return e[t][i]}},l=[],c=t/a;if(JXG.isArray(e)){for(n=0;e.length>n;n++)l[n]=JXG.isPoint(e[n])?e[n]:{elementClass:JXG.OBJECT_CLASS_POINT,X:s(n,0),Y:s(n,1)};if(t=t||0,0===t)return this.setPosition(JXG.COORDS_BY_USER,l[l.length-1].X(),l[l.length-1].Y()),this.board.update(this);for(r=JXG.Math.Numerics.Neville(l),n=0;c>n;n++)o[n]=[],o[n][0]=r[0]((c-n)/c*r[3]()),o[n][1]=r[1]((c-n)/c*r[3]());this.animationPath=o}else JXG.isFunction(e)&&(this.animationPath=e,this.animationStart=(new Date).getTime());return this.animationCallback=i.callback,this.board.addAnimation(this),this},moveTo:function(e,t,i){if(t===void 0||0==t)return this.setPosition(JXG.COORDS_BY_USER,e[0],e[1]),this.board.update(this);i=i||{};var n,r=35,o=Math.ceil(t/(1*r)),a=Array(o+1),s=this.coords.usrCoords[1],l=this.coords.usrCoords[2],c=e[0]-s,u=e[1]-l,d=function(e){return i.effect&&"<>"==i.effect?Math.pow(Math.sin(e/(1*o)*Math.PI/2),2):e/o};if(Math.abs(c)=0;n--)a[o-n]=[s+c*d(n),l+u*d(n)];return this.animationPath=a,this.animationCallback=i.callback,this.board.addAnimation(this),this},visit:function(e,t,i){"number"==typeof i?i={repeat:i}:(i=i||{},i.repeat===void 0&&(i.repeat=1));var n,r,o=35,a=Math.ceil(t/(o*i.repeat)),s=Array(i.repeat*(a+1)),l=this.coords.usrCoords[1],c=this.coords.usrCoords[2],u=e[0]-l,d=e[1]-c,h=function(e){var t=a/2>e?2*e/a:2*(a-e)/a;return i.effect&&"<>"==i.effect?Math.pow(Math.sin(t*Math.PI/2),2):t};for(r=0;i.repeat>r;r++)for(n=a;n>=0;n--)s[r*(a+1)+a-n]=[l+u*h(n),c+d*h(n)];return this.animationPath=s,this.animationCallback=i.callback,this.board.addAnimation(this),this},_anim:function(e,t){var i,n,r,o,a,s,l,c,u=1;return this.intervalCount++,this.intervalCount>t&&(this.intervalCount=0),this.slideObject.elementClass==JXG.OBJECT_CLASS_LINE?(i=this.slideObject.point1.coords.distance(JXG.COORDS_BY_SCREEN,this.slideObject.point2.coords),n=this.slideObject.getSlope(),"INF"!=n?(a=Math.atan(n),r=Math.round(this.intervalCount/t*i*Math.cos(a)),o=Math.round(this.intervalCount/t*i*Math.sin(a))):(r=0,o=Math.round(this.intervalCount/t*i)),0>e?(s=this.slideObject.point2,this.slideObject.point2.coords.scrCoords[1]-this.slideObject.point1.coords.scrCoords[1]>0?u=-1:0==this.slideObject.point2.coords.scrCoords[1]-this.slideObject.point1.coords.scrCoords[1]&&this.slideObject.point2.coords.scrCoords[2]-this.slideObject.point1.coords.scrCoords[2]>0&&(u=-1)):(s=this.slideObject.point1,this.slideObject.point1.coords.scrCoords[1]-this.slideObject.point2.coords.scrCoords[1]>0?u=-1:0==this.slideObject.point1.coords.scrCoords[1]-this.slideObject.point2.coords.scrCoords[1]&&this.slideObject.point1.coords.scrCoords[2]-this.slideObject.point2.coords.scrCoords[2]>0&&(u=-1)),this.coords.setCoordinates(JXG.COORDS_BY_SCREEN,[s.coords.scrCoords[1]+u*r,s.coords.scrCoords[2]+u*o])):this.slideObject.elementClass==JXG.OBJECT_CLASS_CURVE?(l=e>0?Math.round(this.intervalCount/t*this.board.canvasWidth):Math.round((t-this.intervalCount)/t*this.board.canvasWidth),this.coords.setCoordinates(JXG.COORDS_BY_SCREEN,[l,0]),this.coords=JXG.Math.Geometry.projectPointToCurve(this,this.slideObject,this.board)):this.slideObject.elementClass==JXG.OBJECT_CLASS_CIRCLE&&(a=0>e?2*(this.intervalCount/t)*Math.PI:2*((t-this.intervalCount)/t)*Math.PI,c=this.slideObject.Radius(),this.coords.setCoordinates(JXG.COORDS_BY_USER,[this.slideObject.center.coords.usrCoords[1]+c*Math.cos(a),this.slideObject.center.coords.usrCoords[2]+c*Math.sin(a)])),this.board.update(this),this},setStyle:function(e){var t=["cross","cross","cross","circle","circle","circle","circle","square","square","square","plus","plus","plus"],i=[2,3,4,1,2,3,4,2,3,4,2,3,4];return this.visProp.face=t[e],this.visProp.size=i[e],this.board.renderer.changePointStyle(this),this},normalizeFace:function(e){var t={cross:"x",x:"x",circle:"o",o:"o",square:"[]","[]":"[]",plus:"+","+":"+",diamond:"<>","<>":"<>",triangleup:"^",a:"^","^":"^",triangledown:"v",v:"v",triangleleft:"<","<":"<",triangleright:">",">":">"};return t[e]},remove:function(){this.hasLabel&&this.board.renderer.remove(this.board.renderer.getElementById(this.label.content.id)),this.board.renderer.remove(this.board.renderer.getElementById(this.id))},getTextAnchor:function(){return this.coords},getLabelAnchor:function(){return this.coords},face:function(e){this.setProperty({face:e})},size:function(e){this.setProperty({size:e})},cloneToBackground:function(){var e={};return e.id=this.id+"T"+this.numTraces,this.numTraces++,e.coords=this.coords,e.visProp=JXG.deepCopy(this.visProp,this.visProp.traceattributes,!0),e.visProp.layer=this.board.options.layer.trace,e.elementClass=JXG.OBJECT_CLASS_POINT,e.board=this.board,JXG.clearVisPropOld(e),this.board.renderer.drawPoint(e),this.traces[e.id]=e.rendNode,this},getParents:function(){var e=[this.Z(),this.X(),this.Y()];return this.parents&&(e=this.parents),this.type==JXG.OBJECT_TYPE_GLIDER&&(e=[this.X(),this.Y(),this.slideObject.id]),e}}),JXG.createPoint=function(e,t,i){var n,r,o,a=!1;for(o=JXG.copyAttributes(i,e.options,"point"),r=0;t.length>r;r++)("function"==typeof t[r]||"string"==typeof t[r])&&(a=!0);if(a)n=new JXG.Point(e,[0/0,0/0],o),n.addConstraint(t);else if(JXG.isNumber(t[0])&&JXG.isNumber(t[1]))n=new JXG.Point(e,t,o),JXG.exists(o.slideobject)?n.makeGlider(o.slideobject):n.baseElement=n,n.isDraggable=!0;else{if("object"!=typeof t[0]||"object"!=typeof t[1])throw Error("JSXGraph: Can't create point with parent types '"+typeof t[0]+"' and '"+typeof t[1]+"'.\nPossible parent types: [x,y], [z,x,y], [point,transformation]");n=new JXG.Point(e,[0,0],o),n.addTransform(t[0],t[1]),n.isDraggable=!1,n.parents=[t[0].id,t[1].id]}return n},JXG.createGlider=function(e,t,i){var n,r=JXG.copyAttributes(i,e.options,"point");return n=1===t.length?e.create("point",[0,0],r):e.create("point",t.slice(0,2),r),n.makeGlider(t[t.length-1]),n},JXG.createIntersectionPoint=function(e,t,i){var n;return t.length>=3&&(3==t.length&&t.push(null),n=e.create("point",[e.intersection(t[0],t[1],t[2],t[3])],i)),t[0].addChild(n),t[1].addChild(n),n.elType="intersection",n.parents=[t[0].id,t[1].id,t[2]],null!=t[3]&&n.parents.push(t[3]),n.generatePolynomial=function(){var e=t[0].generatePolynomial(n),i=t[1].generatePolynomial(n);return 0==e.length||0==i.length?[]:[e[0],i[0]]},n},JXG.createOtherIntersectionPoint=function(e,t,i){var n;if(3!=t.length||!JXG.isPoint(t[2])||t[0].elementClass!=JXG.OBJECT_CLASS_LINE&&t[0].elementClass!=JXG.OBJECT_CLASS_CIRCLE||t[1].elementClass!=JXG.OBJECT_CLASS_LINE&&t[1].elementClass!=JXG.OBJECT_CLASS_CIRCLE)throw Error("JSXGraph: Can't create 'other intersection point' with parent types '"+typeof t[0]+"', '"+typeof t[1]+"'and '"+typeof t[2]+"'.\nPossible parent types: [circle|line,circle|line,point]");return n=e.create("point",[e.otherIntersection(t[0],t[1],t[2])],i),n.elType="otherintersection",n.parents=[t[0].id,t[1].id,t[2]],t[0].addChild(n),t[1].addChild(n),n.generatePolynomial=function(){var e=t[0].generatePolynomial(n),i=t[1].generatePolynomial(n);return 0==e.length||0==i.length?[]:[e[0],i[0]]},n},JXG.JSXGraph.registerElement("point",JXG.createPoint),JXG.JSXGraph.registerElement("glider",JXG.createGlider),JXG.JSXGraph.registerElement("intersection",JXG.createIntersectionPoint),JXG.JSXGraph.registerElement("otherintersection",JXG.createOtherIntersectionPoint),JXG.Line=function(e,t,i,n){this.constructor(e,n,JXG.OBJECT_TYPE_LINE,JXG.OBJECT_CLASS_LINE),this.point1=JXG.getReference(this.board,t),this.point2=JXG.getReference(this.board,i),this.ticks=[],this.defaultTicks=null,this.parentPolygon=null,this.id=this.board.setId(this,"L"),this.board.renderer.drawLine(this),this.board.finalizeAdding(this),this.elType="line",this.createLabel(),this.point1.addChild(this),this.point2.addChild(this),this.updateStdform()},JXG.Line.prototype=new JXG.GeometryElement,JXG.extend(JXG.Line.prototype,{hasPoint:function(e,t){var i,n,r,o,a,s,l,c=[],u=[1,e,t];return c[0]=this.stdform[0]-this.stdform[1]*this.board.origin.scrCoords[1]/this.board.unitX+this.stdform[2]*this.board.origin.scrCoords[2]/this.board.unitY,c[1]=this.stdform[1]/this.board.unitX,c[2]=this.stdform[2]/-this.board.unitY,n=[0,c[1],c[2]],n=JXG.Math.crossProduct(n,u),n=JXG.Math.crossProduct(n,c),n[1]/=n[0],n[2]/=n[0],n[0]=1,i=(u[1]-n[1])*(u[1]-n[1])+(u[2]-n[2])*(u[2]-n[2]),isNaN(i)||i>this.board.options.precision.hasPoint*this.board.options.precision.hasPoint?!1:this.visProp.straightfirst&&this.visProp.straightlast?!0:(r=this.point1.coords,o=this.point2.coords,n=new JXG.Coords(JXG.COORDS_BY_SCREEN,n.slice(1),this.board).usrCoords,a=r.distance(JXG.COORDS_BY_USER,o),r=r.usrCoords.slice(0),o=o.usrCoords.slice(0),JXG.Math.eps>a?s=0:(a==Number.POSITIVE_INFINITY&&(a=1/JXG.Math.eps,Math.abs(o[0])s?!1:!this.visProp.straightlast&&s>1?!1:!0)},update:function(){var e;return this.needsUpdate?(this.constrained&&(this.funps!==void 0?(e=this.funps(),e&&e.length&&2===e.length&&(this.point1=e[0],this.point2=e[1])):("function"==typeof this.funp1&&(e=this.funp1(),JXG.isPoint(e)?this.point1=e:e&&e.length&&2===e.length&&this.point1.setPositionDirectly(JXG.COORDS_BY_USER,e[0],e[1])),"function"==typeof this.funp2&&(e=this.funp2(),JXG.isPoint(e)?this.point2=e:e&&e.length&&2===e.length&&this.point2.setPositionDirectly(JXG.COORDS_BY_USER,e[0],e[1])))),this.updateSegmentFixedLength(),this.updateStdform(),this.visProp.trace&&this.cloneToBackground(!0),this):this
},updateSegmentFixedLength:function(){return this.hasFixedLength?(d=this.point1.Dist(this.point2),dnew=this.fixedLength(),d1=this.fixedLengthOldCoords[0].distance(JXG.COORDS_BY_USER,this.point1.coords),d2=this.fixedLengthOldCoords[1].distance(JXG.COORDS_BY_USER,this.point2.coords),(d1>JXG.Math.eps||d2>JXG.Math.eps||d!=dnew)&&(drag1=this.point1.isDraggable&&this.point1.type!=JXG.OBJECT_TYPE_GLIDER&&!this.point1.visProp.fixed,drag2=this.point2.isDraggable&&this.point2.type!=JXG.OBJECT_TYPE_GLIDER&&!this.point2.visProp.fixed,d>JXG.Math.eps?d1>d2&&drag2||d2>=d1&&drag2&&!drag1?(this.point2.setPositionDirectly(JXG.COORDS_BY_USER,this.point1.X()+(this.point2.X()-this.point1.X())*dnew/d,this.point1.Y()+(this.point2.Y()-this.point1.Y())*dnew/d),this.point2.prepareUpdate().updateRenderer()):(d2>=d1&&drag1||d1>d2&&drag1&&!drag2)&&(this.point1.setPositionDirectly(JXG.COORDS_BY_USER,this.point2.X()+(this.point1.X()-this.point2.X())*dnew/d,this.point2.Y()+(this.point1.Y()-this.point2.Y())*dnew/d),this.point1.prepareUpdate().updateRenderer()):(x=Math.random()-.5,y=Math.random()-.5,d=Math.sqrt(x*x+y*y),drag2?(this.point2.setPositionDirectly(JXG.COORDS_BY_USER,this.point1.X()+x*dnew/d,this.point1.Y()+y*dnew/d),this.point2.prepareUpdate().updateRenderer()):drag1&&(this.point1.setPositionDirectly(JXG.COORDS_BY_USER,this.point2.X()+x*dnew/d,this.point2.Y()+y*dnew/d),this.point1.prepareUpdate().updateRenderer())),this.fixedLengthOldCoords[0].setCoordinates(JXG.COORDS_BY_USER,this.point1.coords.usrCoords),this.fixedLengthOldCoords[1].setCoordinates(JXG.COORDS_BY_USER,this.point2.coords.usrCoords)),this):this},updateStdform:function(){var e=JXG.Math.crossProduct(this.point1.coords.usrCoords,this.point2.coords.usrCoords);this.stdform[0]=e[0],this.stdform[1]=e[1],this.stdform[2]=e[2],this.stdform[3]=0,this.normalize()},updateRenderer:function(){var e;return this.needsUpdate&&this.visProp.visible&&(e=this.isReal,this.isReal=!isNaN(this.point1.coords.usrCoords[1]+this.point1.coords.usrCoords[2]+this.point2.coords.usrCoords[1]+this.point2.coords.usrCoords[2])&&JXG.Math.innerProduct(this.stdform,this.stdform,3)>=JXG.Math.eps*JXG.Math.eps,this.isReal?(e!=this.isReal&&(this.board.renderer.show(this),this.hasLabel&&this.label.content.visProp.visible&&this.board.renderer.show(this.label.content)),this.board.renderer.updateLine(this)):e!=this.isReal&&(this.board.renderer.hide(this),this.hasLabel&&this.label.content.visProp.visible&&this.board.renderer.hide(this.label.content)),this.needsUpdate=!1),this.hasLabel&&this.label.content.visProp.visible&&this.isReal&&(this.label.content.update(),this.board.renderer.updateText(this.label.content)),this},generatePolynomial:function(e){var t=this.point1.symbolic.x,i=this.point1.symbolic.y,n=this.point2.symbolic.x,r=this.point2.symbolic.y,o=e.symbolic.x,a=e.symbolic.y;return[["(",i,")*(",o,")-(",i,")*(",n,")+(",a,")*(",n,")-(",t,")*(",a,")+(",t,")*(",r,")-(",o,")*(",r,")"].join("")]},getRise:function(){return Math.abs(this.stdform[2])>=JXG.Math.eps?-this.stdform[0]/this.stdform[2]:1/0},getSlope:function(){return Math.abs(this.stdform[2])>=JXG.Math.eps?-this.stdform[1]/this.stdform[2]:1/0},getAngle:function(){return Math.atan2(this.point2.Y()-this.point1.Y(),this.point2.X()-this.point1.X())},setStraight:function(e,t){return this.visProp.straightfirst=e,this.visProp.straightlast=t,this.board.renderer.updateLine(this),this},getTextAnchor:function(){return new JXG.Coords(JXG.COORDS_BY_USER,[.5*(this.point2.X()+this.point1.X()),.5*(this.point2.Y()+this.point1.Y())],this.board)},setLabelRelativeCoords:function(e){JXG.exists(this.label.content)&&(this.label.content.relativeCoords=new JXG.Coords(JXG.COORDS_BY_SCREEN,[e[0],-e[1]],this.board))},getLabelAnchor:function(){var e,t,i,n,r=0,o=0,e=new JXG.Coords(JXG.COORDS_BY_USER,this.point1.coords.usrCoords,this.board);switch(t=new JXG.Coords(JXG.COORDS_BY_USER,this.point2.coords.usrCoords,this.board),(this.visProp.straightfirst||this.visProp.straightlast)&&JXG.Math.Geometry.calcStraight(this,e,t),e=e.scrCoords,t=t.scrCoords,this.label.content.visProp.position){case"lft":case"llft":case"ulft":e[1]<=t[1]?(i=e[1],n=e[2]):(i=t[1],n=t[2]);break;case"rt":case"lrt":case"urt":e[1]>t[1]?(i=e[1],n=e[2]):(i=t[1],n=t[2]);break;default:i=.5*(e[1]+t[1]),n=.5*(e[2]+t[2])}return(this.visProp.straightfirst||this.visProp.straightlast)&&(JXG.exists(this.label.content)&&(r=parseFloat(this.label.content.visProp.offsets[0]),o=parseFloat(this.label.content.visProp.offsets[1])),Math.abs(i)t;t++)this.point1.transformations.push(i[t]),this.point2.transformations.push(i[t]);return this},setPosition:function(e,t,i){var n=this.board.create("transform",[t,i],{type:"translate"});return this.point1.transformations.length>0&&this.point1.transformations[this.point1.transformations.length-1].isNumericMatrix?this.point1.transformations[this.point1.transformations.length-1].melt(n):this.point1.addTransform(this.point1,n),this.point2.transformations.length>0&&this.point2.transformations[this.point2.transformations.length-1].isNumericMatrix?this.point2.transformations[this.point2.transformations.length-1].melt(n):this.point2.addTransform(this.point2,n),this},setPositionDirectly:function(e,t,i,n,r){var o=t-n,a=i-r;if(!this.point1.draggable()||!this.point2.draggable())return this;o/=this.board.unitX,a/=-this.board.unitY;var s=this.board.create("transform",[o,a,0],{type:"translate"});return s.applyOnce([this.point1,this.point2]),this},X:function(e){var t,i=this.stdform[2];return t=Math.abs(this.point1.coords.usrCoords[0])>JXG.Math.eps?this.point1.coords.usrCoords[1]:this.point2.coords.usrCoords[1],e=2*(e-.5),0>e?(e*=-1,(1-e)*t+e*i):(1-e)*t-e*i},Y:function(e){var t,i=this.stdform[1];return t=Math.abs(this.point1.coords.usrCoords[0])>JXG.Math.eps?this.point1.coords.usrCoords[2]:this.point2.coords.usrCoords[2],e=2*(e-.5),0>e?(e*=-1,(1-e)*t-e*i):(1-e)*t+e*i},Z:function(e){var t=Math.abs(this.point1.coords.usrCoords[0])>JXG.Math.eps?this.point1.coords.usrCoords[0]:this.point2.coords.usrCoords[0];return e=2*(e-.5),0>e&&(e*=-1),(1-e)*t},L:function(){return this.point1.Dist(this.point2)},minX:function(){return 0},maxX:function(){return 1},bounds:function(){var e=this.point1.coords.usrCoords,t=this.point2.coords.usrCoords;return[Math.min(e[1],t[1]),Math.max(e[2],t[2]),Math.max(e[1],t[1]),Math.min(e[2],t[2])]},addTicks:function(e){return(""==e.id||e.id===void 0)&&(e.id=this.id+"_ticks_"+(this.ticks.length+1)),this.board.renderer.drawTicks(e),this.ticks.push(e),e.id},removeAllTicks:function(){var e;for(e=this.ticks.length;e>0;e--)this.removeTicks(this.ticks[e-1]);this.ticks=[],this.board.update()},removeTicks:function(e){var t,i;for(null!=this.defaultTicks&&this.defaultTicks==e&&(this.defaultTicks=null),t=this.ticks.length;t>0;t--)if(this.ticks[t-1]==e){for(this.board.removeObject(this.ticks[t-1]),i=0;this.ticks[t-1].ticks.length>i;i++)null!=this.ticks[t-1].labels[i]&&this.board.removeObject(this.ticks[t-1].labels[i]);delete this.ticks[t-1];break}}}),JXG.createLine=function(e,t,i){var n,r,o,a,s,l,c=[],u=!1;if(2==t.length){if(JXG.isArray(t[0])&&t[0].length>1)s=JXG.copyAttributes(i,e.options,"line","point1"),r=e.create("point",t[0],s);else if(JXG.isString(t[0])||t[0].elementClass==JXG.OBJECT_CLASS_POINT)r=JXG.getReference(e,t[0]);else if("function"==typeof t[0]&&t[0]().elementClass==JXG.OBJECT_CLASS_POINT)r=t[0](),u=!0;else{if("function"!=typeof t[0]||!t[0]().length||2!==t[0]().length)throw Error("JSXGraph: Can't create line with parent types '"+typeof t[0]+"' and '"+typeof t[1]+"'.\nPossible parent types: [point,point], [[x1,y1],[x2,y2]], [a,b,c]");s=JXG.copyAttributes(i,e.options,"line","point1"),r=JXG.createPoint(e,t[0](),s),u=!0}if(JXG.isArray(t[1])&&t[1].length>1)s=JXG.copyAttributes(i,e.options,"line","point2"),o=e.create("point",t[1],s);else if(JXG.isString(t[1])||t[1].elementClass==JXG.OBJECT_CLASS_POINT)o=JXG.getReference(e,t[1]);else if("function"==typeof t[1]&&t[1]().elementClass==JXG.OBJECT_CLASS_POINT)o=t[1](),u=!0;else{if("function"!=typeof t[1]||!t[1]().length||2!==t[1]().length)throw Error("JSXGraph: Can't create line with parent types '"+typeof t[0]+"' and '"+typeof t[1]+"'.\nPossible parent types: [point,point], [[x1,y1],[x2,y2]], [a,b,c]");s=JXG.copyAttributes(i,e.options,"line","point2"),o=JXG.createPoint(e,t[1](),s),u=!0}s=JXG.copyAttributes(i,e.options,"line"),n=new JXG.Line(e,r,o,s),u?(n.constrained=!0,n.funp1=t[0],n.funp2=t[1]):n.isDraggable=!0,n.constrained||(n.parents=[r.id,o.id])}else if(3==t.length){for(l=!0,a=0;3>a;a++)if("number"==typeof t[a])c[a]=function(e){return function(){return e}}(t[a]);else{if("function"!=typeof t[a])throw Error("JSXGraph: Can't create line with parent types '"+typeof t[0]+"' and '"+typeof t[1]+"' and '"+typeof t[2]+"'.\nPossible parent types: [point,point], [[x1,y1],[x2,y2]], [a,b,c]");c[a]=t[a],l=!1}s=JXG.copyAttributes(i,e.options,"line","point1"),r=l?e.create("point",[c[2]()*c[2]()+c[1]()*c[1](),c[2]()-c[1]()*c[0]()+c[2](),-c[1]()-c[2]()*c[0]()-c[1]()],s):e.create("point",[function(){return.5*(0+c[2]()*c[2]()+c[1]()*c[1]())},function(){return.5*(c[2]()-c[1]()*c[0]()+c[2]())},function(){return.5*(-c[1]()-c[2]()*c[0]()-c[1]())}],s),s=JXG.copyAttributes(i,e.options,"line","point2"),o=l?e.create("point",[c[2]()*c[2]()+c[1]()*c[1](),-c[1]()*c[0]()+c[2](),-c[2]()*c[0]()-c[1]()],s):e.create("point",[function(){return c[2]()*c[2]()+c[1]()*c[1]()},function(){return-c[1]()*c[0]()+c[2]()},function(){return-c[2]()*c[0]()-c[1]()}],s),r.prepareUpdate().update(),o.prepareUpdate().update(),s=JXG.copyAttributes(i,e.options,"line"),n=new JXG.Line(e,r,o,s),n.isDraggable=l,l&&(n.parents=[c[0](),c[1](),c[2]()])}else if(1==t.length&&"function"==typeof t[0]&&2==t[0]().length&&t[0]()[0].elementClass==JXG.OBJECT_CLASS_POINT&&t[0]()[1].elementClass==JXG.OBJECT_CLASS_POINT){var d=t[0]();s=JXG.copyAttributes(i,e.options,"line"),n=new JXG.Line(e,d[0],d[1],s),n.constrained=!0,n.funps=t[0]}else{if(1!=t.length||"function"!=typeof t[0]||3!=t[0]().length||"number"!=typeof t[0]()[0]||"number"!=typeof t[0]()[1]||"number"!=typeof t[0]()[2])throw Error("JSXGraph: Can't create line with parent types '"+typeof t[0]+"' and '"+typeof t[1]+"'.\nPossible parent types: [point,point], [[x1,y1],[x2,y2]], [a,b,c]");d=t[0],s=JXG.copyAttributes(i,e.options,"line","point1"),r=e.create("point",[function(){var e=d();return[.5*(0+e[2]*e[2]+e[1]*e[1]),.5*(e[2]-e[1]*e[0]+e[2]),.5*(-e[1]-e[2]*e[0]-e[1])]}],s),s=JXG.copyAttributes(i,e.options,"line","point2"),o=e.create("point",[function(){var e=d();return[e[2]*e[2]+e[1]*e[1],-e[1]*e[0]+e[2],-e[2]*e[0]-e[1]]}],s),s=JXG.copyAttributes(i,e.options,"line"),n=new JXG.Line(e,r,o,s),n.constrained=!0,n.funps=t[0]}return n},JXG.JSXGraph.registerElement("line",JXG.createLine),JXG.createSegment=function(e,t,i){var n;if(i.straightFirst=!1,i.straightLast=!1,n=e.create("line",t.slice(0,2),i),3==t.length){if(n.hasFixedLength=!0,JXG.isNumber(t[2]))n.fixedLength=function(){return t[2]};else{if(!JXG.isFunction(t[2]))throw Error("JSXGraph: Can't create segment with third parent type '"+typeof t[2]+"'.\nPossible third parent types: number or function");n.fixedLength=t[2]}n.fixedLengthOldCoords=[],n.fixedLengthOldCoords[0]=new JXG.Coords(JXG.COORDS_BY_USER,n.point1.coords.usrCoords.slice(1,3),e),n.fixedLengthOldCoords[1]=new JXG.Coords(JXG.COORDS_BY_USER,n.point2.coords.usrCoords.slice(1,3),e)}return n.elType="segment",n},JXG.JSXGraph.registerElement("segment",JXG.createSegment),JXG.createArrow=function(e,t,i){var n;return n=e.create("line",t,i).setStraight(!1,!1),n.setArrow(!1,!0),n.type=JXG.OBJECT_TYPE_VECTOR,n.elType="arrow",n},JXG.JSXGraph.registerElement("arrow",JXG.createArrow),JXG.createAxis=function(e,t,i){var n,r,o;if(!JXG.isArray(t[0])&&!JXG.isPoint(t[0])||!JXG.isArray(t[1])&&!JXG.isPoint(t[1]))throw Error("JSXGraph: Can't create point with parent types '"+typeof t[0]+"' and '"+typeof t[1]+"'.\nPossible parent types: [point,point], [[x1,y1],[x2,y2]]");n=JXG.copyAttributes(i,e.options,"axis"),r=e.create("line",t,n),r.type=JXG.OBJECT_TYPE_AXIS,r.isDraggable=!1,r.point1.isDraggable=!1,r.point2.isDraggable=!1;for(var a in r.ancestors)r.ancestors[a].type=JXG.OBJECT_TYPE_AXISPOINT;return n=JXG.copyAttributes(i,e.options,"axis","ticks"),o=JXG.exists(n.ticksdistance)?n.ticksdistance:JXG.isArray(n.ticks)?n.ticks:1,r.defaultTicks=e.create("ticks",[r,o],n),r.defaultTicks.dump=!1,r.elType="axis",r.subs={ticks:r.defaultTicks},r},JXG.JSXGraph.registerElement("axis",JXG.createAxis),JXG.createTangent=function(e,t,i){var n,r,o,a,s,l,c,u;if(1==t.length)n=t[0],r=n.slideObject;else{if(2!=t.length)throw Error("JSXGraph: Can't create tangent with parent types '"+typeof t[0]+"' and '"+typeof t[1]+"'.\nPossible parent types: [glider], [point,line|curve|circle|conic]");if(JXG.isPoint(t[0]))n=t[0],r=t[1];else{if(!JXG.isPoint(t[1]))throw Error("JSXGraph: Can't create tangent with parent types '"+typeof t[0]+"' and '"+typeof t[1]+"'.\nPossible parent types: [glider], [point,line|curve|circle|conic]");r=t[0],n=t[1]}}for(r.elementClass==JXG.OBJECT_CLASS_LINE?u=e.create("line",[r.point1,r.point2],i):r.elementClass==JXG.OBJECT_CLASS_CURVE&&r.type!=JXG.OBJECT_TYPE_CONIC?"plot"!=r.visProp.curvetype?(o=r.X,a=r.Y,u=e.create("line",[function(){return-n.X()*e.D(a)(n.position)+n.Y()*e.D(o)(n.position)},function(){return e.D(a)(n.position)},function(){return-e.D(o)(n.position)}],i),n.addChild(u),u.glider=n):(u=e.create("line",[function(){return s=Math.floor(n.position),s==r.numberPoints-1&&s--,0>s?1:r.Y(s)*r.X(s+1)-r.X(s)*r.Y(s+1)},function(){return s=Math.floor(n.position),s==r.numberPoints-1&&s--,0>s?0:r.Y(s+1)-r.Y(s)},function(){return s=Math.floor(n.position),s==r.numberPoints-1&&s--,0>s?0:r.X(s)-r.X(s+1)}],i),n.addChild(u),u.glider=n):r.type==JXG.OBJECT_TYPE_TURTLE?(u=e.create("line",[function(){for(s=Math.floor(n.position),l=0;r.objects.length>l;l++)if(c=r.objects[l],c.type==JXG.OBJECT_TYPE_CURVE){if(c.numberPoints>s)break;s-=c.numberPoints}return s==c.numberPoints-1&&s--,0>s?1:c.Y(s)*c.X(s+1)-c.X(s)*c.Y(s+1)},function(){for(s=Math.floor(n.position),l=0;r.objects.length>l;l++)if(c=r.objects[l],c.type==JXG.OBJECT_TYPE_CURVE){if(c.numberPoints>s)break;s-=c.numberPoints,moveTo(funps)}return s==c.numberPoints-1&&s--,0>s?0:c.Y(s+1)-c.Y(s)},function(){for(s=Math.floor(n.position),l=0;r.objects.length>l;l++)if(c=r.objects[l],c.type==JXG.OBJECT_TYPE_CURVE){if(c.numberPoints>s)break;s-=c.numberPoints}return s==c.numberPoints-1&&s--,0>s?0:c.X(s)-c.X(s+1)}],i),n.addChild(u),u.glider=n):(r.elementClass==JXG.OBJECT_CLASS_CIRCLE||r.type==JXG.OBJECT_TYPE_CONIC)&&(u=e.create("line",[function(){return JXG.Math.matVecMult(r.quadraticform,n.coords.usrCoords)[0]},function(){return JXG.Math.matVecMult(r.quadraticform,n.coords.usrCoords)[1]},function(){return JXG.Math.matVecMult(r.quadraticform,n.coords.usrCoords)[2]}],i),n.addChild(u),u.glider=n),u.elType="tangent",u.parents=[],s=0;t.length>s;s++)u.parents.push(t[s].id);return u},JXG.JSXGraph.registerElement("tangent",JXG.createTangent),JXG.JSXGraph.registerElement("polar",JXG.createTangent),JXG.Group=function(e,t,i){var n,r,o,a,s;if(this.board=e,this.objects={},n=this.board.numObjects,this.board.numObjects++,this.id=""!=t&&JXG.exists(t)?t:this.board.id+"Group"+n,this.board.groups[this.id]=this,this.type=JXG.OBJECT_TYPE_POINT,this.elementClass=JXG.OBJECT_CLASS_POINT,this.name=""!=i&&JXG.exists(i)?i:"group_"+this.board.generateName(this),delete this.type,4==arguments.length&&JXG.isArray(arguments[3]))r=arguments[3];else for(r=[],o=3;arguments.length>o;o++)r.push(arguments[o]);for(o=0;r.length>o;o++)a=JXG.getReference(this.board,r[o]),a.visProp.fixed||a.type!=JXG.OBJECT_TYPE_POINT&&a.type!=JXG.OBJECT_TYPE_GLIDER||(0!=a.group.length?this.addGroup(a.group[a.group.length-1]):this.addPoint(a));for(s in this.objects)this.objects[s].group.push(this);this.dX=0,this.dY=0},JXG.extend(JXG.Group.prototype,{ungroup:function(){var e;for(e in this.objects)this.objects[e].group[this.objects[e].group.length-1]==this&&this.objects[e].group.pop(),delete this.objects[e]},update:function(e){var t,i=null;for(t in this.objects)i=this.objects[t],i.id!=e.id&&(i.coords=new JXG.Coords(JXG.COORDS_BY_SCREEN,[i.coords.scrCoords[1]+this.dX,i.coords.scrCoords[2]+this.dY],i.board));for(t in this.objects)JXG.exists(this.board.objects[t])?this.objects[t].update(!1):delete this.objects[t];return this},addPoint:function(e){this.objects[e.id]=e},addPoints:function(e){var t;for(t in e)this.objects[t.id]=t},addGroup:function(e){var t;for(t in e.objects)this.addPoint(e.objects[t])},setProperty:function(){var e;for(e in this.objects)this.objects[e].setProperty.apply(this.objects[e],arguments)}}),JXG.createGroup=function(e,t,i){var n,r=new JXG.Group(e,i.id,i.name,t);for(r.elType="group",r.parents=[],n=0;t.length>n;n++)r.parents.push(t[n].id);return r},JXG.JSXGraph.registerElement("group",JXG.createGroup),JXG.Circle=function(e,t,i,n,r){this.constructor(e,r,JXG.OBJECT_TYPE_CIRCLE,JXG.OBJECT_CLASS_CIRCLE),this.method=t,this.midpoint=JXG.getReference(this.board,i),this.center=JXG.getReference(this.board,i),this.point2=null,this.radius=0,this.line=null,this.circle=null,"twoPoints"==t?(this.point2=JXG.getReference(e,n),this.radius=this.Radius()):"pointRadius"==t?(this.gxtterm=n,this.generateTerm(n),this.updateRadius()):"pointLine"==t?(this.line=JXG.getReference(e,n),this.radius=this.line.point1.coords.distance(JXG.COORDS_BY_USER,this.line.point2.coords)):"pointCircle"==t&&(this.circle=JXG.getReference(e,n),this.radius=this.circle.Radius()),this.id=this.board.setId(this,"C"),this.board.renderer.drawEllipse(this),this.board.finalizeAdding(this),this.createGradient(),this.elType="circle",this.createLabel(),this.center.addChild(this),"pointRadius"==t?this.notifyParents(n):"pointLine"==t?this.line.addChild(this):"pointCircle"==t?this.circle.addChild(this):"twoPoints"==t&&this.point2.addChild(this),this.methodMap=JXG.deepCopy(this.methodMap,{setRadius:"setRadius"})},JXG.Circle.prototype=new JXG.GeometryElement,JXG.extend(JXG.Circle.prototype,{hasPoint:function(e,t){var i=this.board.options.precision.hasPoint/this.board.unitX,n=this.center.coords.usrCoords,r=new JXG.Coords(JXG.COORDS_BY_SCREEN,[e,t],this.board),o=this.Radius(),a=Math.sqrt((n[1]-r.usrCoords[1])*(n[1]-r.usrCoords[1])+(n[2]-r.usrCoords[2])*(n[2]-r.usrCoords[2]));return i>Math.abs(a-o)},generatePolynomial:function(e){var t=this.center.symbolic.x,i=this.center.symbolic.y,n=e.symbolic.x,r=e.symbolic.y,o=this.generateRadiusSquared();if(""==o)return[];var a="(("+n+")-("+t+"))^2 + (("+r+")-("+i+"))^2 - ("+o+")";return[a]},generateRadiusSquared:function(){var e="";if("twoPoints"==this.method){var t=this.center.symbolic.x,i=this.center.symbolic.y,n=this.point2.symbolic.x,r=this.point2.symbolic.y;e="(("+n+")-("+t+"))^2 + (("+r+")-("+i+"))^2"}else if("pointRadius"==this.method)"number"==typeof this.radius&&(e=""+this.radius*this.radius);else if("pointLine"==this.method){var n=this.line.point1.symbolic.x,r=this.line.point1.symbolic.y,o=this.line.point2.symbolic.x,a=this.line.point2.symbolic.y;e="(("+n+")-("+o+"))^2 + (("+r+")-("+a+"))^2"}else"pointCircle"==this.method&&(e=this.circle.Radius());return e},update:function(){return this.needsUpdate&&(this.visProp.trace&&this.cloneToBackground(!0),"pointLine"==this.method?this.radius=this.line.point1.coords.distance(JXG.COORDS_BY_USER,this.line.point2.coords):"pointCircle"==this.method?this.radius=this.circle.Radius():"pointRadius"==this.method&&(this.radius=this.updateRadius()),this.updateStdform(),this.updateQuadraticform()),this},updateQuadraticform:function(){var e=this.center,t=e.X(),i=e.Y(),n=this.Radius();this.quadraticform=[[t*t+i*i-n*n,-t,-i],[-t,1,0],[-i,0,1]]},updateStdform:function(){this.stdform[3]=.5,this.stdform[4]=this.Radius(),this.stdform[1]=-this.center.coords.usrCoords[1],this.stdform[2]=-this.center.coords.usrCoords[2],this.normalize()},updateRenderer:function(){if(this.needsUpdate&&this.visProp.visible){var e=this.isReal;this.isReal=isNaN(this.center.coords.usrCoords[1]+this.center.coords.usrCoords[2]+this.Radius())?!1:!0,this.isReal?(e!=this.isReal&&(this.board.renderer.show(this),this.hasLabel&&this.label.content.visProp.visible&&this.board.renderer.show(this.label.content)),this.board.renderer.updateEllipse(this)):e!=this.isReal&&(this.board.renderer.hide(this),this.hasLabel&&this.label.content.visProp.visible&&this.board.renderer.hide(this.label.content)),this.needsUpdate=!1}this.hasLabel&&this.label.content.visProp.visible&&this.isReal&&(this.label.content.update(),this.board.renderer.updateText(this.label.content))},generateTerm:function(e){this.updateRadius="string"==typeof e?this.board.jc.snippet(e,!0,null,!0):"number"==typeof e?function(){return e}:e},notifyParents:function(e){this.board.elementsByName,"string"==typeof e&&JXG.GeonextParser.findDependencies(this,e+"",this.board)},setRadius:function(e){return this.generateTerm(e),this.board.update(),this},Radius:function(){return"twoPoints"==this.method?0==JXG.Math.Geometry.distance(this.point2.coords.usrCoords,[0,0,0])||0==JXG.Math.Geometry.distance(this.center.coords.usrCoords,[0,0,0])?0/0:this.center.Dist(this.point2):"pointLine"==this.method||"pointCircle"==this.method?this.radius:"pointRadius"==this.method?this.updateRadius():void 0},getRadius:function(){return this.Radius()},getTextAnchor:function(){return this.center.coords},getLabelAnchor:function(){var e,t,i=this.Radius(),n=this.center.coords.usrCoords;switch(this.visProp.label.position){case"lft":e=n[1]-i,t=n[2];break;case"llft":e=n[1]-Math.sqrt(.5)*i,t=n[2]-Math.sqrt(.5)*i;break;case"rt":e=n[1]+i,t=n[2];break;case"lrt":e=n[1]+Math.sqrt(.5)*i,t=n[2]-Math.sqrt(.5)*i;break;case"urt":e=n[1]+Math.sqrt(.5)*i,t=n[2]+Math.sqrt(.5)*i;break;case"top":e=n[1],t=n[2]+i;break;case"bot":e=n[1],t=n[2]-i;break;case"ulft":default:e=n[1]-Math.sqrt(.5)*i,t=n[2]+Math.sqrt(.5)*i}return new JXG.Coords(JXG.COORDS_BY_USER,[e,t],this.board)},cloneToBackground:function(){var e,t,i={};return i.id=this.id+"T"+this.numTraces,i.elementClass=JXG.OBJECT_CLASS_CIRCLE,this.numTraces++,i.center={},i.center.coords=this.center.coords,e=this.Radius(),i.Radius=function(){return e},i.getRadius=function(){return e},i.board=this.board,i.visProp=JXG.deepCopy(this.visProp,this.visProp.traceattributes,!0),i.visProp.layer=this.board.options.layer.trace,JXG.clearVisPropOld(i),t=this.board.renderer.enhancedRendering,this.board.renderer.enhancedRendering=!0,this.board.renderer.drawEllipse(i),this.board.renderer.enhancedRendering=t,this.traces[i.id]=i.rendNode,this},addTransform:function(e){var t,i=JXG.isArray(e)?e:[e],n=i.length;for(t=0;n>t;t++)this.center.transformations.push(i[t]),"twoPoints"===this.method&&this.point2.transformations.push(i[t]);return this},setPosition:function(e,t,i){var n=this.board.create("transform",[t,i],{type:"translate"});return this.addTransform(n),this},setPositionDirectly:function(e,t,i,n,r){var o,a,s,l,c=t-n,u=i-r,d=this.parents.length;for(s=0;d>s;s++)if(!JXG.getRef(this.board,this.parents[s]).draggable())return this;for(s=0;d>s;s++)l=JXG.getRef(this.board,this.parents[s]),e==JXG.COORDS_BY_SCREEN?(o=l.coords.scrCoords[1]+c,a=l.coords.scrCoords[2]+u):(o=l.coords.usrCoords[1]+c,a=l.coords.usrCoords[2]+u),l.setPositionDirectly(e,o,a);return this.update(),this},X:function(e){return this.Radius()*Math.cos(2*e*Math.PI)+this.center.coords.usrCoords[1]},Y:function(e){return this.Radius()*Math.sin(2*e*Math.PI)+this.center.coords.usrCoords[2]},Z:function(){return 1},minX:function(){return 0},maxX:function(){return 1},Area:function(){var e=this.Radius();return e*e*Math.PI},bounds:function(){var e=this.center.coords.usrCoords,t=this.Radius();return[e[1]-t,e[2]+t,e[1]+t,e[2]-t]}}),JXG.createCircle=function(e,t,i){var n,r,o,a,s=!0;for(r=[],o=0;t.length>o;o++)JXG.isPoint(t[o])?r[o]=t[o]:t[o].length>1?(a=JXG.copyAttributes(i,e.options,"circle","center"),r[o]=e.create("point",t[o],a)):r[o]=t[o];if(a=JXG.copyAttributes(i,e.options,"circle"),2==t.length&&JXG.isPoint(r[0])&&JXG.isPoint(r[1]))n=new JXG.Circle(e,"twoPoints",r[0],r[1],a);else if((JXG.isNumber(r[0])||JXG.isFunction(r[0])||JXG.isString(r[0]))&&JXG.isPoint(r[1]))n=new JXG.Circle(e,"pointRadius",r[1],r[0],a);else if((JXG.isNumber(r[1])||JXG.isFunction(r[1])||JXG.isString(r[1]))&&JXG.isPoint(r[0]))n=new JXG.Circle(e,"pointRadius",r[0],r[1],a);else if(r[0].elementClass==JXG.OBJECT_CLASS_CIRCLE&&JXG.isPoint(r[1]))n=new JXG.Circle(e,"pointCircle",r[1],r[0],a);else if(r[1].elementClass==JXG.OBJECT_CLASS_CIRCLE&&JXG.isPoint(r[0]))n=new JXG.Circle(e,"pointCircle",r[0],r[1],a);else if(r[0].elementClass==JXG.OBJECT_CLASS_LINE&&JXG.isPoint(r[1]))n=new JXG.Circle(e,"pointLine",r[1],r[0],a);else if(r[1].elementClass==JXG.OBJECT_CLASS_LINE&&JXG.isPoint(r[0]))n=new JXG.Circle(e,"pointLine",r[0],r[1],a);else{if(!(3==t.length&&JXG.isPoint(r[0])&&JXG.isPoint(r[1])&&JXG.isPoint(r[2])))throw Error("JSXGraph: Can't create circle with parent types '"+typeof t[0]+"' and '"+typeof t[1]+"'.\nPossible parent types: [point,point], [point,number], [point,function], [point,circle], [point,point,point]");n=JXG.createCircumcircle(e,r,i)}for(n.isDraggable=s,n.parents=[],o=0;t.length>o;o++)t[o].id&&n.parents.push(t[o].id);return n.elType="circle",n},JXG.JSXGraph.registerElement("circle",JXG.createCircle),JXG.createEllipse=function(e,t,i){var n,r,o,a,s=[],l=JXG.copyAttributes(i,e.options,"conic","foci"),c=JXG.copyAttributes(i,e.options,"conic");for(o=0;2>o;o++)if(t[o].length>1)s[o]=e.create("point",t[o],l);else if(JXG.isPoint(t[o]))s[o]=JXG.getReference(e,t[o]);else if("function"==typeof t[o]&&t[o]().elementClass===JXG.OBJECT_CLASS_POINT)s[o]=t[o]();else{if(!JXG.isString(t[o]))throw Error("JSXGraph: Can't create Ellipse with parent types '"+typeof t[0]+"' and '"+typeof t[1]+"'.\nPossible parent types: [point,point,point], [point,point,number|function]");s[o]=JXG.getReference(e,t[o])}if(JXG.isNumber(t[2]))r=JXG.createFunction(t[2],e);else if("function"==typeof t[2]&&JXG.isNumber(t[2]()))r=t[2];else{if(JXG.isPoint(t[2]))n=JXG.getReference(e,t[2]);else if(t[2].length>1)n=e.create("point",t[2],l);else if("function"==typeof t[2]&&t[2]().elementClass==JXG.OBJECT_CLASS_POINT)n=t[2]();else{if(!JXG.isString(t[2]))throw Error("JSXGraph: Can't create Ellipse with parent types '"+typeof t[0]+"' and '"+typeof t[1]+"' and '"+typeof t[2]+"'.\nPossible parent types: [point,point,point], [point,point,number|function]");n=JXG.getReference(e,t[2])}r=function(){return n.Dist(s[0])+n.Dist(s[1])}}t[4]===void 0&&(t[4]=1.0001*Math.PI),t[3]===void 0&&(t[3]=-1.0001*Math.PI);var u=e.create("point",[function(){return.5*(s[0].X()+s[1].X())},function(){return.5*(s[0].Y()+s[1].Y())}],l),d=function(){var e,t,i,n=s[0].X(),r=s[0].Y(),o=s[1].X(),a=s[1].Y(),l=o-n>0?1:-1;e=Math.abs(o-n)>1e-7?Math.atan2(a-r,o-n)+(0>l?Math.PI:0):(a-r>0?.5:-.5)*Math.PI,t=Math.cos(e),i=Math.sin(e);var c=[[1,0,0],[u.X(),t,-i],[u.Y(),i,t]];return c},h=e.create("curve",[function(){return 0},function(){return 0},t[3],t[4]],c),p=function(e,t){var i,n,o=.5*r(),l=o*o,c=.5*s[1].Dist(s[0]),p=l-c*c,f=Math.sqrt(p),g=[[1,0,0],[0,1,0],[0,0,1]];return t||(a=d(),i=u.X(),n=u.Y(),g[0][0]=a[0][0],g[0][1]=0,g[0][2]=0,g[1][0]=i*(1-a[1][1])+n*a[1][2],g[1][1]=a[1][1],g[1][2]=a[2][1],g[2][0]=n*(1-a[1][1])-i*a[1][2],g[2][1]=a[1][2],g[2][2]=a[2][2],h.quadraticform=JXG.Math.matMatMult(JXG.Math.transpose(g),JXG.Math.matMatMult([[-1+i*i/(o*o)+n*n/p,-i/l,-i/p],[-i/l,1/l,0],[-n/p,0,1/p]],g))),JXG.Math.matVecMult(a,[1,o*Math.cos(e),f*Math.sin(e)])};return h.X=function(e,t){return p(e,t)[1]},h.Y=function(e,t){return p(e,t)[2]},h.midpoint=u,h.type=JXG.OBJECT_TYPE_CONIC,h},JXG.createHyperbola=function(e,t,i){var n,r,o,a,s=[],l=JXG.copyAttributes(i,e.options,"conic","foci"),c=JXG.copyAttributes(i,e.options,"conic");for(o=0;2>o;o++)if(t[o].length>1)s[o]=e.create("point",t[o],attr_focu);else if(JXG.isPoint(t[o]))s[o]=JXG.getReference(e,t[o]);else if("function"==typeof t[o]&&t[o]().elementClass==JXG.OBJECT_CLASS_POINT)s[o]=t[o]();else{if(!JXG.isString(t[o]))throw Error("JSXGraph: Can't create Hyperbola with parent types '"+typeof t[0]+"' and '"+typeof t[1]+"'.\nPossible parent types: [point,point,point], [point,point,number|function]");s[o]=JXG.getReference(e,t[o])}if(JXG.isNumber(t[2]))r=JXG.createFunction(t[2],e);else if("function"==typeof t[2]&&JXG.isNumber(t[2]()))r=t[2];else{if(JXG.isPoint(t[2]))n=JXG.getReference(e,t[2]);else if(t[2].length>1)n=e.create("point",t[2],l);else if("function"==typeof t[2]&&t[2]().elementClass==JXG.OBJECT_CLASS_POINT)n=t[2]();else{if(!JXG.isString(t[2]))throw Error("JSXGraph: Can't create Hyperbola with parent types '"+typeof t[0]+"' and '"+typeof t[1]+"' and '"+typeof t[2]+"'.\nPossible parent types: [point,point,point], [point,point,number|function]");n=JXG.getReference(e,t[2])}r=function(){return n.Dist(s[0])-n.Dist(s[1])}}t[4]===void 0&&(t[4]=1.0001*Math.PI),t[3]===void 0&&(t[3]=-1.0001*Math.PI);var u=e.create("point",[function(){return.5*(s[0].X()+s[1].X())},function(){return.5*(s[0].Y()+s[1].Y())}],l),d=function(){var e,t=s[0].X(),i=s[0].Y(),n=s[1].X(),r=s[1].Y(),o=n-t>0?1:-1;e=Math.abs(n-t)>1e-7?Math.atan2(r-i,n-t)+(0>o?Math.PI:0):(r-i>0?.5:-.5)*Math.PI;var a=[[1,0,0],[u.X(),Math.cos(e),-Math.sin(e)],[u.Y(),Math.sin(e),Math.cos(e)]];return a},h=e.create("curve",[function(){return 0},function(){return 0},t[3],t[4]],c),p=function(e,t){var i,n,o=.5*r(),l=o*o,c=.5*s[1].Dist(s[0]),p=Math.sqrt(-o*o+c*c),f=p*p,g=[[1,0,0],[0,1,0],[0,0,1]];return t||(a=d(),i=u.X(),n=u.Y(),g[0][0]=a[0][0],g[0][1]=0,g[0][2]=0,g[1][0]=i*(1-a[1][1])+n*a[1][2],g[1][1]=a[1][1],g[1][2]=a[2][1],g[2][0]=n*(1-a[1][1])-i*a[1][2],g[2][1]=a[1][2],g[2][2]=a[2][2],h.quadraticform=JXG.Math.matMatMult(JXG.Math.transpose(g),JXG.Math.matMatMult([[-1+i*i/l+n*n/f,-i/l,n/f],[-i/l,1/l,0],[n/f,0,-1/f]],g))),JXG.Math.matVecMult(a,[1,o/Math.cos(e),p*Math.tan(e)])};return h.X=function(e,t){return p(e,t)[1]},h.Y=function(e,t){return p(e,t)[2]},h.midpoint=u,h.type=JXG.OBJECT_TYPE_CONIC,h},JXG.createParabola=function(e,t,i){var n,r=t[0],o=t[1],a=JXG.copyAttributes(i,e.options,"conic","foci"),s=JXG.copyAttributes(i,e.options,"conic");if(t[0].length>1)r=e.create("point",t[0],a);else if(JXG.isPoint(t[0]))r=JXG.getReference(e,t[0]);else if("function"==typeof t[0]&&t[0]().elementClass==JXG.OBJECT_CLASS_POINT)r=t[0]();else{if(!JXG.isString(t[0]))throw Error("JSXGraph: Can't create Parabola with parent types '"+typeof t[0]+"' and '"+typeof t[1]+"'.\nPossible parent types: [point,line]");r=JXG.getReference(e,t[0])}t[3]===void 0&&(t[3]=10),t[2]===void 0&&(t[2]=-10);var l=e.create("point",[function(){var t=[0,o.stdform[1],o.stdform[2]];return t=JXG.Math.crossProduct(t,r.coords.usrCoords),JXG.Math.Geometry.meetLineLine(t,o.stdform,0,e).usrCoords
}],a),c=function(){var e=Math.atan(o.getSlope()),t=.5*(l.X()+r.X()),i=.5*(l.Y()+r.Y());e+=0>r.Y()-l.Y()||r.Y()==l.Y()&&r.X()>l.X()?Math.PI:0;var n=[[1,0,0],[t*(1-Math.cos(e))+i*Math.sin(e),Math.cos(e),-Math.sin(e)],[i*(1-Math.cos(e))-t*Math.sin(e),Math.sin(e),Math.cos(e)]];return n},u=e.create("curve",[function(){return 0},function(){return 0},t[2],t[3]],s),d=function(e,t){var i=.5*l.Dist(r),o=[[1,0,0],[0,1,0],[0,0,1]],a=.5*(l.X()+r.X()),s=.5*(l.Y()+r.Y());return t||(n=c(),o[0][0]=n[0][0],o[0][1]=0,o[0][2]=0,o[1][0]=a*(1-n[1][1])+s*n[1][2],o[1][1]=n[1][1],o[1][2]=n[2][1],o[2][0]=s*(1-n[1][1])-a*n[1][2],o[2][1]=n[1][2],o[2][2]=n[2][2],u.quadraticform=JXG.Math.matMatMult(JXG.Math.transpose(o),JXG.Math.matMatMult([[4*-s*i-a*a,a,2*i],[a,-1,0],[2*i,0,0]],o))),JXG.Math.matVecMult(n,[1,e+a,e*e/(4*i)+s])};return u.X=function(e,t){return d(e,t)[1]},u.Y=function(e,t){return d(e,t)[2]},u.type=JXG.OBJECT_TYPE_CONIC,u},JXG.createConic=function(e,t,i){var n,r,o,a,s,l,c,u,d,h=[[1,0,0],[0,1,0],[0,0,1]],p=[[1,0,0],[0,1,0],[0,0,1]],f=[],g=[],m=JXG.copyAttributes(i,e.options,"conic","foci"),b=JXG.copyAttributes(i,e.options,"conic");if(5==t.length)d=!0;else{if(6!=t.length)throw Error("JSXGraph: Can't create generic Conic with "+parent.length+" parameters.");d=!1}if(d)for(c=0;5>c;c++)if(t[c].length>1)f[c]=e.create("point",t[c],m);else if(JXG.isPoint(t[c]))f[c]=JXG.getReference(e,t[c]);else if("function"==typeof t[c]&&t[c]().elementClass==JXG.OBJECT_CLASS_POINT)f[c]=t[c]();else{if(!JXG.isString(t[c]))throw Error("JSXGraph: Can't create Conic section with parent types '"+typeof t[c]+"'.\nPossible parent types: [point,point,point,point,point], [a00,a11,a22,a01,a02,a12]");f[c]=JXG.getReference(e,t[c])}else u=[[0,0,0],[0,0,0],[0,0,0]],u[0][0]=JXG.isFunction(t[2])?function(){return t[2]()}:function(){return t[2]},u[0][1]=JXG.isFunction(t[4])?function(){return t[4]()}:function(){return t[4]},u[0][2]=JXG.isFunction(t[5])?function(){return t[5]()}:function(){return t[5]},u[1][1]=JXG.isFunction(t[0])?function(){return t[0]()}:function(){return t[0]},u[1][2]=JXG.isFunction(t[3])?function(){return t[3]()}:function(){return t[3]},u[2][2]=JXG.isFunction(t[1])?function(){return t[1]()}:function(){return t[1]};var v=function(e){var t,i;for(t=0;3>t;t++)for(i=t;3>i;i++)e[t][i]+=e[i][t];for(t=0;3>t;t++)for(i=0;t>i;i++)e[t][i]=e[i][t];return e},y=function(e,t){var i,n,r=[[0,0,0],[0,0,0],[0,0,0]];for(i=0;3>i;i++)for(n=0;3>n;n++)r[i][n]=e[i]*t[n];return v(r)},x=function(e,t,i){var n,r,o,a,s,l=[[0,0,0],[0,0,0],[0,0,0]];for(o=JXG.Math.matVecMult(t,i),n=JXG.Math.innerProduct(i,o),o=JXG.Math.matVecMult(e,i),r=JXG.Math.innerProduct(i,o),a=0;3>a;a++)for(s=0;3>s;s++)l[a][s]=n*e[a][s]-r*t[a][s];return l},C=e.create("curve",[function(){return 0},function(){return 0},0,2*Math.PI],b),w=function(e,t){var i,c,m,b;if(!t){if(d){for(i=0;5>i;i++)g[i]=f[i].coords.usrCoords;s=y(JXG.Math.crossProduct(g[0],g[1]),JXG.Math.crossProduct(g[2],g[3])),l=y(JXG.Math.crossProduct(g[0],g[2]),JXG.Math.crossProduct(g[1],g[3])),p=x(s,l,g[4])}else for(i=0;3>i;i++)for(c=i;3>c;c++)p[i][c]=u[i][c](),c>i&&(p[c][i]=p[i][c]);for(C.quadraticform=p,n=JXG.Math.Numerics.Jacobi(p),0>n[0][0][0]&&(n[0][0][0]*=-1,n[0][1][1]*=-1,n[0][2][2]*=-1),i=0;3>i;i++){for(m=0,c=0;3>c;c++)m+=n[1][c][i]*n[1][c][i];for(m=Math.sqrt(m),c=0;3>c;c++);}h=n[1],a=Math.sqrt(Math.abs(n[0][0][0])),r=Math.sqrt(Math.abs(n[0][1][1])),o=Math.sqrt(Math.abs(n[0][2][2]))}return 0>=n[0][1][1]&&0>=n[0][2][2]?b=JXG.Math.matVecMult(h,[1/a,Math.cos(e)/r,Math.sin(e)/o]):0>=n[0][1][1]&&n[0][2][2]>0?b=JXG.Math.matVecMult(h,[Math.cos(e)/a,1/r,Math.sin(e)/o]):0>n[0][2][2]&&(b=JXG.Math.matVecMult(h,[Math.sin(e)/a,Math.cos(e)/r,1/o])),b[1]/=b[0],b[2]/=b[0],b[0]=1,b};return C.X=function(e,t){return w(e,t)[1]},C.Y=function(e,t){return w(e,t)[2]},C.midpoint=e.create("point",[function(){var e=C.quadraticform;return[e[1][1]*e[2][2]-e[1][2]*e[1][2],e[1][2]*e[0][2]-e[2][2]*e[0][1],e[0][1]*e[1][2]-e[1][1]*e[0][2]]}],m),C.type=JXG.OBJECT_TYPE_CONIC,C},JXG.JSXGraph.registerElement("ellipse",JXG.createEllipse),JXG.JSXGraph.registerElement("hyperbola",JXG.createHyperbola),JXG.JSXGraph.registerElement("parabola",JXG.createParabola),JXG.JSXGraph.registerElement("conic",JXG.createConic),JXG.Polygon=function(e,t,i){this.constructor(e,i,JXG.OBJECT_TYPE_POLYGON,JXG.OBJECT_CLASS_AREA);var n,r,o,a=JXG.copyAttributes(i,e.options,"polygon","borders");for(this.withLines=i.withlines,this.attr_line=a,this.vertices=[],n=0;t.length>n;n++)r=JXG.getRef(this.board,t[n]),this.vertices[n]=r;if(this.vertices[this.vertices.length-1]!=this.vertices[0]&&this.vertices.push(this.vertices[0]),this.borders=[],this.withLines)for(n=0;this.vertices.length-1>n;n++)a.id=a.ids&&a.ids[n],a.strokecolor=JXG.isArray(a.colors)&&a.colors[n%a.colors.length]||a.strokecolor,a.strokecolor===!1&&(a.strokecolor="none"),o=JXG.createSegment(e,[this.vertices[n],this.vertices[n+1]],a),o.dump=!1,this.borders[n]=o,o.parentPolygon=this;for(n=0;this.vertices.length-1>n;n++)r=JXG.getReference(this.board,this.vertices[n]),r.addChild(this);this.createLabel(),this.id=this.board.setId(this,"Py"),this.board.renderer.drawPolygon(this),this.board.finalizeAdding(this),this.methodMap.borders="borders",this.methodMap.vertices="vertices",this.elType="polygon"},JXG.Polygon.prototype=new JXG.GeometryElement,JXG.extend(JXG.Polygon.prototype,{hasPoint:function(e,t){var i,n,r,o=!1;if(this.visProp.hasinnerpoints)for(r=this.vertices.length,i=0,n=r-2;r-1>i;n=i++)this.vertices[i].coords.scrCoords[2]>t!=this.vertices[n].coords.scrCoords[2]>t&&(this.vertices[n].coords.scrCoords[1]-this.vertices[i].coords.scrCoords[1])*(t-this.vertices[i].coords.scrCoords[2])/(this.vertices[n].coords.scrCoords[2]-this.vertices[i].coords.scrCoords[2])+this.vertices[i].coords.scrCoords[1]>e&&(o=!o);else for(r=this.borders.length,i=0;r>i;i++)if(this.borders[i].hasPoint(e,t)){o=!0;break}return o},updateRenderer:function(){this.needsUpdate&&(this.board.renderer.updatePolygon(this),this.needsUpdate=!1),this.hasLabel&&this.label.content.visProp.visible&&(this.label.content.update(),this.board.renderer.updateText(this.label.content))},getTextAnchor:function(){var e,t=this.vertices[0].X(),i=this.vertices[0].Y(),n=t,r=i;for(e=0;this.vertices.length>e;e++)t>this.vertices[e].X()&&(t=this.vertices[e].X()),this.vertices[e].X()>n&&(n=this.vertices[e].X()),this.vertices[e].Y()>i&&(i=this.vertices[e].Y()),r>this.vertices[e].Y()&&(r=this.vertices[e].Y());return new JXG.Coords(JXG.COORDS_BY_USER,[.5*(t+n),.5*(i+r)],this.board)},getLabelAnchor:JXG.shortcut(JXG.Polygon.prototype,"getTextAnchor"),cloneToBackground:function(){var e,t={};return t.id=this.id+"T"+this.numTraces,this.numTraces++,t.vertices=this.vertices,t.visProp=JXG.deepCopy(this.visProp,this.visProp.traceattributes,!0),t.visProp.layer=this.board.options.layer.trace,t.board=this.board,JXG.clearVisPropOld(t),e=this.board.renderer.enhancedRendering,this.board.renderer.enhancedRendering=!0,this.board.renderer.drawPolygon(t),this.board.renderer.enhancedRendering=e,this.traces[t.id]=t.rendNode,this},hideElement:function(){var e;for(this.visProp.visible=!1,this.board.renderer.hide(this),e=0;this.borders.length>e;e++)this.borders[e].hideElement();this.hasLabel&&JXG.exists(this.label)&&(this.label.hiddenByParent=!0,this.label.content.visProp.visible&&this.board.renderer.hide(this.label.content))},showElement:function(){var e;for(this.visProp.visible=!0,this.board.renderer.show(this),e=0;this.borders.length>e;e++)this.borders[e].showElement();this.hasLabel&&JXG.exists(this.label)&&this.label.content.visProp.visible&&this.board.renderer.show(this.label.content)},Area:function(){var e,t=0;for(e=0;this.vertices.length-1>e;e++)t+=this.vertices[e].X()*this.vertices[e+1].Y()-this.vertices[e+1].X()*this.vertices[e].Y();return t/=2,Math.abs(t)},remove:function(){var e;for(e=0;this.borders.length>e;e++)this.board.removeObject(this.borders[e]);this.board.renderer.remove(this.rendNode)},findPoint:function(e){var t;if(!JXG.isPoint(e))return-1;for(t=0;this.vertices.length>t;t++)if(this.vertices[t].id===e.id)return t;return-1},addPoints:function(){var e=Array.prototype.slice.call(arguments);return this.insertPoints.apply(this,[this.vertices.length-2].concat(e))},insertPoints:function(){var e,t,i,n=[];if(0===arguments.length)return this;if(e=arguments[0],0>e||e>this.vertices.length-2)return this;for(t=1;arguments.length>t;t++)JXG.isPoint(arguments[t])&&n.push(arguments[t]);if(i=this.vertices.slice(0,e+1).concat(n),this.vertices=i.concat(this.vertices.slice(e+1)),this.withLines){for(i=this.borders.slice(0,e),this.board.removeObject(this.borders[e]),t=0;n.length>t;t++)i.push(JXG.createSegment(this.board,[this.vertices[e+t],this.vertices[e+t+1]],this.attr_line));i.push(JXG.createSegment(this.board,[this.vertices[e+n.length],this.vertices[e+n.length+1]],this.attr_line)),this.borders=i.concat(this.borders.slice(e))}return this.board.update(),this},removePoints:function(){var e,t,i,n=[],r=[],o=[],a=[];for(this.vertices=this.vertices.slice(0,this.vertices.length-1),e=0;arguments.length>e;e++)JXG.isPoint(arguments[e])&&(i=this.findPoint(arguments[e])),JXG.isNumber(i)&&i>-1&&this.vertices.length>i&&-1===JXG.indexOf(o,i)&&o.push(i);for(o=o.sort(),n=this.vertices.slice(),r=this.borders.slice(),this.withLines&&a.push([o[o.length-1]]),e=o.length-1;e>-1;e--)n[o[e]]=-1,this.withLines&&o[e]-1>o[e-1]&&(a[a.length-1][1]=o[e],a.push([o[e-1]]));for(this.withLines&&(a[a.length-1][1]=o[0]),this.vertices=[],e=0;n.length>e;e++)JXG.isPoint(n[e])&&this.vertices.push(n[e]);if(this.vertices[this.vertices.length-1].id!==this.vertices[0].id&&this.vertices.push(this.vertices[0]),this.withLines){for(e=0;a.length>e;e++){for(t=a[e][1]-1;a[e][0]+1>t;t++)0>t?(t=0,this.board.removeObject(this.borders[r.length-1]),r[r.length-1]=-1):t>r.length-1&&(t=r.length-1),this.board.removeObject(this.borders[t]),r[t]=-1;0!==a[e][1]&&a[e][0]!==n.length-1&&(r[a[e][0]-1]=JXG.createSegment(this.board,[n[Math.max(a[e][1]-1,0)],n[Math.min(a[e][0]+1,this.vertices.length-1)]],this.attr_line))}for(this.borders=[],e=0;r.length>e;e++)-1!==r[e]&&this.borders.push(r[e]);(5===a[0][1]||0===a[a.length-1][1])&&this.borders.push(JXG.createSegment(this.board,[this.vertices[0],this.vertices[this.vertices.length-2]],this.attr_line))}return this.board.update(),this},getParents:function(){var e,t=[];for(e=0;this.vertices.length>e;e++)t.push(this.vertices[e].id);return t},getAttributes:function(){var e,t=JXG.GeometryElement.prototype.getAttributes.call(this);if(this.withLines)for(t.lines=t.lines||{},t.lines.ids=[],t.lines.colors=[],e=0;this.borders.length>e;e++)t.lines.ids.push(this.borders[e].id),t.lines.colors.push(this.borders[e].visProp.strokecolor);return t}}),JXG.createPolygon=function(e,t,i){var n,r,o=JXG.copyAttributes(i,e.options,"polygon");for(r=0;t.length>r;r++)if(t[r]=JXG.getReference(e,t[r]),!JXG.isPoint(t[r]))throw Error("JSXGraph: Can't create polygon with parent types other than 'point'.");return n=new JXG.Polygon(e,t,o)},JXG.createRegularPolygon=function(e,t,i){var n,r,o,a,s,l,c,u=[];if(JXG.isNumber(t[t.length-1])&&3!=t.length)throw Error("JSXGraph: A regular polygon needs two points and a number as input.");if(s=t.length,o=t[s-1],!JXG.isNumber(o)&&!JXG.isPoint(JXG.getReference(e,o))||3>o)throw Error("JSXGraph: The third parameter has to be number greater than 2 or a point.");for(JXG.isPoint(JXG.getReference(e,o))?(o=s,l=!0):(s--,l=!1),r=0;s>r;r++)if(t[r]=JXG.getReference(e,t[r]),!JXG.isPoint(t[r]))throw Error("JSXGraph: Can't create regular polygon if the first two parameters aren't points.");for(u[0]=t[0],u[1]=t[1],c=JXG.copyAttributes(i,e.options,"polygon","vertices"),r=2;o>r;r++)a=e.create("transform",[Math.PI*(2-(o-2)/o),u[r-1]],{type:"rotate"}),l?(u[r]=t[r],u[r].addTransform(t[r-2],a)):(JXG.isArray(c.ids)&&c.ids.length>=o-2&&(c.id=c.ids[r-2]),u[r]=e.create("point",[u[r-2],a],c),u[r].type=JXG.OBJECT_TYPE_CAS);return c=JXG.copyAttributes(i,e.options,"polygon"),n=e.create("polygon",u,c),n.elType="regularpolygon",n},JXG.JSXGraph.registerElement("polygon",JXG.createPolygon),JXG.JSXGraph.registerElement("regularpolygon",JXG.createRegularPolygon),JXG.Curve=function(e,t,i){this.constructor(e,i,JXG.OBJECT_TYPE_CURVE,JXG.OBJECT_CLASS_CURVE),this.points=[],this.numberPoints=this.visProp.numberpointshigh,this.dataX=null,this.dataY=null,this.varname=null!=t[0]?t[0]:"x",this.xterm=t[1],this.yterm=t[2],this.generateTerm(this.varname,this.xterm,this.yterm,t[3],t[4]),this.updateCurve(),this.id=this.board.setId(this,"G"),this.board.renderer.drawCurve(this),this.board.finalizeAdding(this),this.createGradient(),this.elType="curve",this.createLabel(),"string"==typeof this.xterm&&this.notifyParents(this.xterm),"string"==typeof this.yterm&&this.notifyParents(this.yterm)},JXG.Curve.prototype=new JXG.GeometryElement,JXG.extend(JXG.Curve.prototype,{minX:function(){if("polar"==this.visProp.curvetype)return 0;var e=new JXG.Coords(JXG.COORDS_BY_SCREEN,[0,0],this.board);return e.usrCoords[1]},maxX:function(){var e;return"polar"==this.visProp.curvetype?2*Math.PI:(e=new JXG.Coords(JXG.COORDS_BY_SCREEN,[this.board.canvasWidth,0],this.board),e.usrCoords[1])},Z:function(){return 1},hasPoint:function(e,t){var i,n,r,o,a,s,l,c,u,d,h,p,f,g,m,b,v,y,x,C,w=1/0,k=this.visProp.numberpointslow,_=(this.maxX()-this.minX())/k,T=this.board.options.precision.hasPoint/this.board.unitX,E=!0;if(T*=T,x=new JXG.Coords(JXG.COORDS_BY_SCREEN,[e,t],this.board),e=x.usrCoords[1],t=x.usrCoords[2],"parameter"==this.visProp.curvetype||"polar"==this.visProp.curvetype||"functiongraph"==this.visProp.curvetype)for(C=this.transformations.length,o=0,i=this.minX();k>o;o++){for(s=this.X(i,E),l=this.Y(i,E),a=0;C>a;a++)r=this.transformations[a],r.update(),n=JXG.Math.matVecMult(r.matrix,[1,s,l]),s=n[1],l=n[2];if(w=(e-s)*(e-s)+(t-l)*(t-l),T>w)return!0;i+=_}else if("plot"==this.visProp.curvetype){for(C=this.numberPoints,o=0;C-1>o;o++){for(c=this.X(o),u=this.X(o+1),d=this.Y(o),h=this.Y(o+1),a=0;this.transformations.length>a;a++)r=this.transformations[a],r.update(),n=JXG.Math.matVecMult(r.matrix,[1,c,d]),c=n[1],d=n[2],n=JXG.Math.matVecMult(r.matrix,[1,u,h]),u=n[1],h=n[2];if(m=u-c,b=h-d,f=e-c,g=t-d,y=m*m+b*b,y>=JXG.Math.eps?(v=f*m+g*b,p=v/y,w=f*f+g*g-p*v):(p=0,w=f*f+g*g),p>=0&&1>=p&&T>w)return!0}return!1}return T>w},allocatePoints:function(){var e,t;if(t=this.numberPoints,this.points.lengthe;e++)this.points[e]=new JXG.Coords(JXG.COORDS_BY_USER,[0,0],this.board)},update:function(){if(this.needsUpdate&&!this.board.needsFullUpdate&&this.Y&&this.Y.toJS){if(this.Y.toJS()==this.YtoJS)return this;this.YtoJS=this.Y.toJS()}return this.needsUpdate&&(this.visProp.trace&&this.cloneToBackground(!0),this.updateCurve()),this},updateRenderer:function(){return this.needsUpdate&&(this.board.renderer.updateCurve(this),this.needsUpdate=!1,this.hasLabel&&this.label.content.visProp.visible&&(this.label.content.update(),this.board.renderer.updateText(this.label.content))),this},updateDataArray:function(){},updateCurve:function(){var e,t,i,n,r,o,a=!1;if(this.updateDataArray(),t=this.minX(),i=this.maxX(),null!=this.dataX)for(this.numberPoints=this.dataX.length,e=this.numberPoints,this.allocatePoints(),o=0;e>o;o++)n=o,r=null!=this.dataY?o:this.X(n),this.points[o].setCoordinates(JXG.COORDS_BY_USER,[this.X(n,a),this.Y(r,a)],!1),this.updateTransform(this.points[o]),a=!0;else this.visProp.doadvancedplot?this.updateParametricCurve(t,i,e):(this.numberPoints=this.board.updateQuality==this.board.BOARD_QUALITY_HIGH?this.visProp.numberpointshigh:this.visProp.numberpointslow,this.allocatePoints(),this.updateParametricCurveNaive(t,i,this.numberPoints));return this},updateParametricCurveNaive:function(e,t,i){var n,r,o=!1,a=(t-e)/i;for(n=0;i>n;n++)r=e+n*a,this.points[n].setCoordinates(JXG.COORDS_BY_USER,[this.X(r,o),this.Y(r,o)],!1),this.updateTransform(this.points[n]),o=!0;return this},updateParametricCurve:function(e,t){var i,n,r,o,a,s,l,c,u,d,h,p,f,g=!1,m=new JXG.Coords(JXG.COORDS_BY_USER,[0,0],this.board),b=[],v=[],y=[],x=[],C=!1,w=0,k=function(e,t,i){var n,r,o=i[1]-e[1],a=i[2]-e[2],s=t[0]-e[1],l=t[1]-e[2],c=s*s+l*l;return c>=JXG.Math.eps&&(n=(o*s+a*l)/c,n>0&&(1>=n?(o-=n*s,a-=n*l):(o-=s,a-=l))),r=o*o+a*a,Math.sqrt(r)};for(this.board.updateQuality==this.board.BOARD_QUALITY_LOW?(d=15,h=10,p=10):(d=21,h=.7,p=.7),x[0]=t-e,i=1;d>i;i++)x[i]=.5*x[i-1];i=1,b[0]=1,v[0]=0,n=e,m.setCoordinates(JXG.COORDS_BY_USER,[this.X(n,g),this.Y(n,g)],!1),g=!0,s=m.scrCoords[1],l=m.scrCoords[2],r=n,n=t,m.setCoordinates(JXG.COORDS_BY_USER,[this.X(n,g),this.Y(n,g)],!1),o=m.scrCoords[1],a=m.scrCoords[2],y[0]=[o,a],c=1,u=0,this.points=[],this.points[w++]=new JXG.Coords(JXG.COORDS_BY_SCREEN,[s,l],this.board);do{for(C=this.isDistOK(o-s,a-l,h,p)||this.isSegmentOutside(s,l,o,a);d>u&&(!C||3>u)&&(this.isSegmentDefined(s,l,o,a)||7>=u);)b[c]=i,v[c]=u,y[c]=[o,a],c++,i=2*i-1,u++,n=e+i*x[u],m.setCoordinates(JXG.COORDS_BY_USER,[this.X(n,g),this.Y(n,g)],!1),o=m.scrCoords[1],a=m.scrCoords[2],C=this.isDistOK(o-s,a-l,h,p)||this.isSegmentOutside(s,l,o,a);w>1&&(f=k(this.points[w-2].scrCoords,[o,a],this.points[w-1].scrCoords),.015>f&&w--),this.points[w]=new JXG.Coords(JXG.COORDS_BY_SCREEN,[o,a],this.board),this.updateTransform(this.points[w]),w++,s=o,l=a,r=n,c--,o=y[c][0],a=y[c][1],u=v[c]+1,i=2*b[c]}while(c>0&&5e5>w);return this.numberPoints=this.points.length,this},isSegmentOutside:function(e,t,i,n){return 0>t&&0>n||t>this.board.canvasHeight&&n>this.board.canvasHeight||0>e&&0>i||e>this.board.canvasWidth&&i>this.board.canvasWidth},isDistOK:function(e,t,i,n){return i>Math.abs(e)&&n>Math.abs(t)&&!isNaN(e+t)},isSegmentDefined:function(e,t,i,n){return!(isNaN(e+t)&&isNaN(i+n))},updateTransform:function(e){var t,i,n,r=this.transformations.length;for(n=0;r>n;n++)t=this.transformations[n],t.update(),i=JXG.Math.matVecMult(t.matrix,e.usrCoords),e.setCoordinates(JXG.COORDS_BY_USER,[i[1],i[2]]);return e},addTransform:function(e){var t,i=JXG.isArray(e)?e:[e],n=i.length;for(t=0;n>t;t++)this.transformations.push(i[t]);return this},setPosition:function(e,t,i){var n=this.board.create("transform",[t,i],{type:"translate"});return this.transformations.length>0&&this.transformations[this.transformations.length-1].isNumericMatrix?this.transformations[this.transformations.length-1].melt(n):this.addTransform(n),this},generateTerm:function(e,t,i,n,r){var o,a;JXG.isArray(t)?(this.dataX=t,this.X=function(e){var t,i,n=parseInt(Math.floor(e));return 0>e?n=0:e>this.dataX.length-2&&(n=this.dataX.length-2),n==e?this.dataX[n]:(t=this.dataX[n],i=this.dataX[n+1],t+(i-t)*(e-n))},this.visProp.curvetype="plot",this.numberPoints=this.dataX.length):(this.X=JXG.createFunction(t,this.board,e),JXG.isString(t)?this.visProp.curvetype="functiongraph":(JXG.isFunction(t)||JXG.isNumber(t))&&(this.visProp.curvetype="parameter")),JXG.isArray(i)?(this.dataY=i,this.Y=function(e){var t,i,n=parseInt(Math.floor(e));return 0>e?n=0:e>this.dataY.length-2&&(n=this.dataY.length-2),n==e?JXG.isFunction(this.dataY[n])?this.dataY[n]():this.dataY[n]:(t=JXG.isFunction(this.dataY[n])?this.dataY[n]():this.dataY[n],i=JXG.isFunction(this.dataY[n+1])?this.dataY[n+1]():this.dataY[n+1],t+(i-t)*(e-n))}):this.Y=JXG.createFunction(i,this.board,e),JXG.isFunction(t)&&JXG.isArray(i)&&(o=JXG.createFunction(i[0],this.board,""),a=JXG.createFunction(i[1],this.board,""),this.X=function(e){return t(e)*Math.cos(e)+o()},this.Y=function(e){return t(e)*Math.sin(e)+a()},this.visProp.curvetype="polar"),null!=n&&(this.minX=JXG.createFunction(n,this.board,"")),null!=r&&(this.maxX=JXG.createFunction(r,this.board,""))},notifyParents:function(e){JXG.GeonextParser.findDependencies(this,e,this.board)},getLabelAnchor:function(){var e,t,i,n=.05*this.board.canvasWidth,r=.05*this.board.canvasHeight,o=.95*this.board.canvasWidth,a=.95*this.board.canvasHeight;switch(this.visProp.label.position){case"ulft":t=n,i=r;break;case"llft":t=n,i=a;break;case"rt":t=o,i=.5*a;break;case"lrt":t=o,i=a;break;case"urt":t=o,i=r;break;case"top":t=.5*o,i=r;break;case"bot":t=.5*o,i=a;break;case"lft":default:t=n,i=.5*a}return e=new JXG.Coords(JXG.COORDS_BY_SCREEN,[t,i],this.board),JXG.Math.Geometry.projectCoordsToCurve(e.usrCoords[1],e.usrCoords[2],0,this,this.board)[0]},cloneToBackground:function(){var e,t={};return t.id=this.id+"T"+this.numTraces,t.elementClass=JXG.OBJECT_CLASS_CURVE,this.numTraces++,t.points=this.points.slice(0),t.numberPoints=this.numberPoints,t.board=this.board,t.visProp=JXG.deepCopy(this.visProp,this.visProp.traceattributes,!0),t.visProp.layer=this.board.options.layer.trace,t.visProp.curvetype=this.visProp.curvetype,JXG.clearVisPropOld(t),e=this.board.renderer.enhancedRendering,this.board.renderer.enhancedRendering=!0,this.board.renderer.drawCurve(t),this.board.renderer.enhancedRendering=e,this.traces[t.id]=t.rendNode,this},bounds:function(){var e,t,i,n,r,o,a,s,l=this.visProp.numberpointslow,c=(this.maxX()-this.minX())/l,u=[this.minX(),0,this.maxX(),0];if("parameter"==this.visProp.curvetype||"polar"==this.visProp.curvetype||"functiongraph"==this.visProp.curvetype)for(o=this.transformations.length,n=this.minX(),e=0;l>e;e++){for(a=this.X(n,!0),s=this.Y(n,!0),t=0;o>t;t++)i=this.transformations[t],i.update(),r=JXG.Math.matVecMult(i.matrix,[1,a,s]),a=r[1],s=r[2];s>u[1]&&(u[1]=s),u[3]>s&&(u[3]=s),n+=c}else if("plot"==this.visProp.curvetype)for(o=this.numberPoints,e=0;o>e;e++)s=this.Y(e),s>u[1]&&(u[1]=s),u[3]>s&&(u[3]=s);return u}}),JXG.createCurve=function(e,t,i){var n=JXG.copyAttributes(i,e.options,"curve");return new JXG.Curve(e,["x"].concat(t),n)},JXG.JSXGraph.registerElement("curve",JXG.createCurve),JXG.createFunctiongraph=function(e,t,i){var n,r=["x","x"].concat(t);return n=JXG.copyAttributes(i,e.options,"curve"),n.curvetype="functiongraph",new JXG.Curve(e,r,n)},JXG.JSXGraph.registerElement("functiongraph",JXG.createFunctiongraph),JXG.JSXGraph.registerElement("plot",JXG.createFunctiongraph),JXG.createSpline=function(e,t,i){var n;return n=function(){var e,i=[],n=[],r=function(r,o){var a;if(!o){if(i=[],n=[],2==t.length&&JXG.isArray(t[0])&&JXG.isArray(t[1])&&t[0].length==t[1].length)for(a=0;t[0].length>a;a++)"function"==typeof t[0][a]?i.push(t[0][a]()):i.push(t[0][a]),"function"==typeof t[1][a]?n.push(t[1][a]()):n.push(t[1][a]);else for(a=0;t.length>a;a++)if(JXG.isPoint(t[a]))i.push(t[a].X()),n.push(t[a].Y());else if(JXG.isArray(t[a])&&2==t[a].length)for(a=0;t.length>a;a++)"function"==typeof t[a][0]?i.push(t[a][0]()):i.push(t[a][0]),"function"==typeof t[a][1]?n.push(t[a][1]()):n.push(t[a][1]);e=JXG.Math.Numerics.splineDef(i,n)}return JXG.Math.Numerics.splineEval(r,i,n,e)};return r},e.create("curve",["x",n()],i)},JXG.JSXGraph.registerElement("spline",JXG.createSpline),JXG.createRiemannsum=function(e,t,i){var n,r,o,a,s,l;if(l=JXG.copyAttributes(i,e.options,"riemannsum"),l.curvetype="plot",o=t[0],n=JXG.createFunction(t[1],e,""),null==n)throw Error("JSXGraph: JXG.createRiemannsum: argument '2' n has to be number or function.\nPossible parent types: [function,n:number|function,type,start:number|function,end:number|function]");if(r=JXG.createFunction(t[2],e,"",!1),null==r)throw Error("JSXGraph: JXG.createRiemannsum: argument 3 'type' has to be string or function.\nPossible parent types: [function,n:number|function,type,start:number|function,end:number|function]");return a=[[0],[0]].concat(t.slice(3)),s=e.create("curve",a,l),s.updateDataArray=function(){var e=JXG.Math.Numerics.riemann(o,n(),r(),this.minX(),this.maxX());this.dataX=e[0],this.dataY=e[1]},s},JXG.JSXGraph.registerElement("riemannsum",JXG.createRiemannsum),JXG.createTracecurve=function(e,t,i){var n,r,o,a;if(2!=t.length)throw Error("JSXGraph: Can't create trace curve with given parent'\nPossible parent types: [glider, point]");if(r=JXG.getRef(this.board,t[0]),o=JXG.getRef(this.board,t[1]),r.type!=JXG.OBJECT_TYPE_GLIDER||!JXG.isPoint(o))throw Error("JSXGraph: Can't create trace curve with parent types '"+typeof t[0]+"' and '"+typeof t[1]+"'.\nPossible parent types: [glider, point]");return a=JXG.copyAttributes(i,e.options,"tracecurve"),a.curvetype="plot",n=e.create("curve",[[0],[0]],a),n.updateDataArray=function(){var e,t,i,n,s,l,c,u,d,h=a.numberpoints,p=r.position,f=r.slideObject,g=f.minX(),m=f.maxX();for(t=(m-g)/h,this.dataX=[],this.dataY=[],f.elementClass!=JXG.OBJECT_CLASS_CURVE&&h++,e=0;h>e;e++){i=g+e*t,l=f.X(i)/f.Z(i),c=f.Y(i)/f.Z(i),r.setPositionDirectly(JXG.COORDS_BY_USER,l,c),u=!1;for(n in this.board.objects)if(s=this.board.objects[n],s==r&&(u=!0),u&&s.needsRegularUpdate&&(d=s.visProp.trace,s.visProp.trace=!1,s.needsUpdate=!0,s.update(!0),s.visProp.trace=d,s==o))break;this.dataX[e]=o.X(),this.dataY[e]=o.Y()}r.position=p,u=!1;for(n in this.board.objects)if(s=this.board.objects[n],s==r&&(u=!0),u&&s.needsRegularUpdate&&(d=s.visProp.trace,s.visProp.trace=!1,s.needsUpdate=!0,s.update(!0),s.visProp.trace=d,s==o))break},n},JXG.JSXGraph.registerElement("tracecurve",JXG.createTracecurve),JXG.createArc=function(e,t,i){var n,r,o;if(!(t=JXG.checkParents("arc",t,[[JXG.OBJECT_CLASS_POINT,JXG.OBJECT_CLASS_POINT,JXG.OBJECT_CLASS_POINT],[JXG.OBJECT_CLASS_POINT,JXG.OBJECT_CLASS_POINT,JXG.OBJECT_CLASS_POINT,JXG.OBJECT_CLASS_POINT]])))throw Error("JSXGraph: Can't create Arc with parent types '"+typeof t[0]+"' and '"+typeof t[1]+"' and '"+typeof t[2]+"'.\nPossible parent types: [point,point,point]");for(r=JXG.copyAttributes(i,e.options,"arc"),n=e.create("curve",[[0],[0]],r),n.elType="arc",n.parents=[],o=0;t.length>o;o++)t[o].id&&n.parents.push(t[o].id);return n.type=JXG.OBJECT_TYPE_ARC,n.center=JXG.getReference(e,t[0]),n.radiuspoint=JXG.getReference(e,t[1]),n.point2=n.radiuspoint,n.anglepoint=JXG.getReference(e,t[2]),n.point3=n.anglepoint,n.center.addChild(n),n.radiuspoint.addChild(n),n.anglepoint.addChild(n),n.useDirection=r.usedirection,n.updateDataArray=function(){var e,i,n,r,o,a,s,l,c,u,d=this.radiuspoint,h=this.center,p=this.anglepoint,f=JXG.Math.Geometry.rad(d,h,p),g=Math.ceil(90*(f/Math.PI))+1,m=f/g,b=h.X(),v=h.Y();for(this.useDirection&&(l=t[1].coords.usrCoords,c=t[3].coords.usrCoords,u=t[2].coords.usrCoords,s=(l[1]-u[1])*(l[2]-c[2])-(l[2]-u[2])*(l[1]-c[1]),0>s?(this.radiuspoint=t[1],this.anglepoint=t[2]):(this.radiuspoint=t[2],this.anglepoint=t[1])),this.dataX=[d.X()],this.dataY=[d.Y()],e=m,o=1;g>=o;o++,e+=m)i=Math.cos(e),n=Math.sin(e),r=[[1,0,0],[b*(1-i)+v*n,i,-n],[v*(1-i)-b*n,n,i]],a=JXG.Math.matVecMult(r,d.coords.usrCoords),this.dataX.push(a[1]/a[0]),this.dataY.push(a[2]/a[0]);this.updateStdform(),this.updateQuadraticform()},n.Radius=function(){return this.radiuspoint.Dist(this.center)},n.getRadius=function(){return this.Radius()},n.hasPoint=function(e,t){var i,n=this.board.options.precision.hasPoint/this.board.unitX,r=new JXG.Coords(JXG.COORDS_BY_SCREEN,[e,t],this.board),o=this.Radius(),a=this.center.coords.distance(JXG.COORDS_BY_USER,r),s=n>Math.abs(a-o);return s&&(i=JXG.Math.Geometry.rad(this.radiuspoint,this.center,r.usrCoords.slice(1)),i>JXG.Math.Geometry.rad(this.radiuspoint,this.center,this.anglepoint)&&(s=!1)),s},n.hasPointSector=function(e,t){var i,n=new JXG.Coords(JXG.COORDS_BY_SCREEN,[e,t],this.board),r=this.Radius(),o=this.center.coords.distance(JXG.COORDS_BY_USER,n),a=r>o;return a&&(i=JXG.Math.Geometry.rad(this.radiuspoint,this.center,n.usrCoords.slice(1)),i>JXG.Math.Geometry.rad(this.radiuspoint,this.center,this.anglepoint)&&(a=!1)),a},n.getTextAnchor=function(){return this.center.coords},n.getLabelAnchor=function(){var e,t,i,n,r=JXG.Math.Geometry.rad(this.radiuspoint,this.center,this.anglepoint),o=10/this.board.unitX,a=10/this.board.unitY,s=this.point2.coords.usrCoords,l=this.center.coords.usrCoords,c=s[1]-l[1],u=s[2]-l[2];return null!=this.label.content&&(this.label.content.relativeCoords=new JXG.Coords(JXG.COORDS_BY_SCREEN,[0,0],this.board)),e=new JXG.Coords(JXG.COORDS_BY_USER,[l[1]+Math.cos(.5*r)*c-Math.sin(.5*r)*u,l[2]+Math.sin(.5*r)*c+Math.cos(.5*r)*u],this.board),t=e.usrCoords[1]-l[1],i=e.usrCoords[2]-l[2],n=Math.sqrt(t*t+i*i),t=t*(n+o)/n,i=i*(n+a)/n,new JXG.Coords(JXG.COORDS_BY_USER,[l[1]+t,l[2]+i],this.board)},n.updateQuadraticform=function(){var e=this.center,t=e.X(),i=e.Y(),n=this.Radius();this.quadraticform=[[t*t+i*i-n*n,-t,-i],[-t,1,0],[-i,0,1]]},n.updateStdform=function(){this.stdform[3]=.5,this.stdform[4]=this.Radius(),this.stdform[1]=-this.center.coords.usrCoords[1],this.stdform[2]=-this.center.coords.usrCoords[2],this.normalize()},n.prepareUpdate().update(),n},JXG.JSXGraph.registerElement("arc",JXG.createArc),JXG.createSemicircle=function(e,t,i){var n,r,o;if(!JXG.isPoint(t[0])||!JXG.isPoint(t[1]))throw Error("JSXGraph: Can't create Semicircle with parent types '"+typeof t[0]+"' and '"+typeof t[1]+"'.\nPossible parent types: [point,point]");return o=JXG.copyAttributes(i,e.options,"semicircle","midpoint"),r=e.create("midpoint",[t[0],t[1]],o),r.dump=!1,o=JXG.copyAttributes(i,e.options,"semicircle"),n=e.create("arc",[r,t[1],t[0]],o),n.elType="semicircle",n.parents=[t[0].id,t[1].id],n.subs={midpoint:r},n.midpoint=r,n},JXG.JSXGraph.registerElement("semicircle",JXG.createSemicircle),JXG.createCircumcircleArc=function(e,t,i){var n,r,o;if(!(JXG.isPoint(t[0])&&JXG.isPoint(t[1])&&JXG.isPoint(t[2])))throw Error("JSXGraph: create Circumcircle Arc with parent types '"+typeof t[0]+"' and '"+typeof t[1]+"' and '"+typeof t[2]+"'.\nPossible parent types: [point,point,point]");return o=JXG.copyAttributes(i,e.options,"circumcirclearc","center"),r=e.create("circumcenter",[t[0],t[1],t[2]],o),r.dump=!1,o=JXG.copyAttributes(i,e.options,"circumcirclearc"),o.usedirection=!0,n=e.create("arc",[r,t[0],t[2],t[1]],o),n.elType="circumcirclearc",n.parents=[t[0].id,t[1].id,t[2].id],n.subs={center:r},n.center=r,n},JXG.JSXGraph.registerElement("circumcirclearc",JXG.createCircumcircleArc),JXG.createSector=function(e,t,i){var n,r;if(!(JXG.isPoint(t[0])&&JXG.isPoint(t[1])&&JXG.isPoint(t[2])))throw Error("JSXGraph: Can't create Sector with parent types '"+typeof t[0]+"' and '"+typeof t[1]+"' and '"+typeof t[2]+"'.");return r=JXG.copyAttributes(i,e.options,"sector"),n=e.create("curve",[[0],[0]],r),n.type=JXG.OBJECT_TYPE_SECTOR,n.elType="sector",n.parents=[t[0].id,t[1].id,t[2].id],n.point1=JXG.getReference(e,t[0]),n.point2=JXG.getReference(e,t[1]),n.point3=JXG.getReference(e,t[2]),n.point1.addChild(n),n.point2.addChild(n),n.point3.addChild(n),n.useDirection=i.usedirection,n.updateDataArray=function(){var e,i,n,r,o,a,s,l,c,u,d=this.point2,h=this.point1,p=this.point3,f=JXG.Math.Geometry.rad(d,h,p),g=Math.ceil(90*(f/Math.PI))+1,m=f/g,b=h.X(),v=h.Y();for(this.useDirection&&(l=t[1].coords.usrCoords,c=t[3].coords.usrCoords,u=t[2].coords.usrCoords,s=(l[1]-u[1])*(l[2]-c[2])-(l[2]-u[2])*(l[1]-c[1]),0>s?(this.point2=t[1],this.point3=t[2]):(this.point2=t[2],this.point3=t[1])),this.dataX=[h.X(),d.X()],this.dataY=[h.Y(),d.Y()],e=m,o=1;g>=o;o++,e+=m)i=Math.cos(e),n=Math.sin(e),r=[[1,0,0],[b*(1-i)+v*n,i,-n],[v*(1-i)-b*n,n,i]],a=JXG.Math.matVecMult(r,d.coords.usrCoords),this.dataX.push(a[1]/a[0]),this.dataY.push(a[2]/a[0]);this.dataX.push(h.X()),this.dataY.push(h.Y())},n.Radius=function(){return this.point2.Dist(this.point1)},n.getRadius=function(){return this.Radius()},n.hasPointSector=function(e,t){var i,n=new JXG.Coords(JXG.COORDS_BY_SCREEN,[e,t],this.board),r=this.Radius(),o=this.point1.coords.distance(JXG.COORDS_BY_USER,n),a=r>o;return a&&(i=JXG.Math.Geometry.rad(this.point2,this.point1,n.usrCoords.slice(1)),i>JXG.Math.Geometry.rad(this.point2,this.point1,this.point3)&&(a=!1)),a},n.getTextAnchor=function(){return this.point1.coords},n.getLabelAnchor=function(){var e,t,i,n,r=JXG.Math.Geometry.rad(this.point2,this.point1,this.point3),o=10/this.board.unitX,a=10/this.board.unitY,s=this.point2.coords.usrCoords,l=this.point1.coords.usrCoords,c=s[1]-l[1],u=s[2]-l[2];return null!=this.label.content&&(this.label.content.relativeCoords=new JXG.Coords(JXG.COORDS_BY_SCREEN,[0,0],this.board)),e=new JXG.Coords(JXG.COORDS_BY_USER,[l[1]+Math.cos(.5*r)*c-Math.sin(.5*r)*u,l[2]+Math.sin(.5*r)*c+Math.cos(.5*r)*u],this.board),t=e.usrCoords[1]-l[1],i=e.usrCoords[2]-l[2],n=Math.sqrt(t*t+i*i),t=t*(n+o)/n,i=i*(n+a)/n,new JXG.Coords(JXG.COORDS_BY_USER,[l[1]+t,l[2]+i],this.board)
},n.prepareUpdate().update(),n},JXG.JSXGraph.registerElement("sector",JXG.createSector),JXG.createCircumcircleSector=function(e,t,i){var n,r,o;if(!(JXG.isPoint(t[0])&&JXG.isPoint(t[1])&&JXG.isPoint(t[2])))throw Error("JSXGraph: Can't create circumcircle sector with parent types '"+typeof t[0]+"' and '"+typeof t[1]+"' and '"+typeof t[2]+"'.");return o=JXG.copyAttributes(i,e.options,"circumcirclesector","center"),r=e.create("circumcenter",[t[0],t[1],t[2]],o),r.dump=!1,o=JXG.copyAttributes(i,e.options,"circumcirclesector"),n=e.create("sector",[r,t[0],t[2],t[1]],o),n.elType="circumcirclesector",n.parents=[t[0].id,t[1].id,t[2].id],n.center=r,n.subs={center:r},n},JXG.JSXGraph.registerElement("circumcirclesector",JXG.createCircumcircleSector),JXG.createAngle=function(e,t,i){var n,r,o,a,s,l,c,u,d,h,p,f,g=["α","β","γ","δ","ε","ζ","&eta","θ","ι","κ","λ","μ","ν","ξ","ο","π","ρ","ς","σ","τ","υ","φ","χ","ψ","ω"],m=0;if(!(JXG.isPoint(t[0])&&JXG.isPoint(t[1])&&JXG.isPoint(t[2])))throw Error("JSXGraph: Can't create angle with parent types '"+typeof t[0]+"' and '"+typeof t[1]+"' and '"+typeof t[2]+"'.");if(s=JXG.copyAttributes(i,e.options,"angle"),a=s.name,a===void 0||""==a){for(;g.length>m;){c=m,u=g[m];for(n in e.objects)if(e.objects[n].type==JXG.OBJECT_TYPE_ANGLE&&e.objects[n].name==u){m++;break}m==c&&(a=u,m=g.length+1)}if(m==g.length)for(d="α_{",h="}",p=!1,c=0;!p;){for(n in e.objects)if(e.objects[n].type==JXG.OBJECT_TYPE_ANGLE&&e.objects[n].name==d+c+h){p=!0;break}p?p=!1:(p=!0,a=d+c+h)}s.name=a}for(l=JXG.copyAttributes(i,e.options,"angle","radiuspoint"),r=e.create("point",[function(){var e=t[0],i=t[1],n=JXG.evaluate(s.radius),r=i.Dist(e);return[i.X()+(e.X()-i.X())*n/r,i.Y()+(e.Y()-i.Y())*n/r]}],l),r.dump=!1,l=JXG.copyAttributes(i,e.options,"angle","pointsquare"),o=e.create("point",[function(){var e=t[2],i=t[1],n=JXG.evaluate(s.radius),r=i.Dist(e);return[i.X()+(e.X()-i.X())*n/r,i.Y()+(e.Y()-i.Y())*n/r]}],l),o.dump=!1,n=e.create("sector",[t[1],r,t[2]],s),n.elType="angle",n.parents=[t[0].id,t[1].id,t[2].id],n.subs={point:r,pointsquare:o},n.updateDataArraySquare=function(){var e,i,n,a,s=t[1];e=JXG.Math.crossProduct(o.coords.usrCoords,s.coords.usrCoords),i=[-r.X()*e[1]-r.Y()*e[2],r.Z()*e[1],r.Z()*e[2]],e=JXG.Math.crossProduct(r.coords.usrCoords,s.coords.usrCoords),n=[-o.X()*e[1]-o.Y()*e[2],o.Z()*e[1],o.Z()*e[2]],a=JXG.Math.crossProduct(i,n),a[1]/=a[0],a[2]/=a[0],this.dataX=[s.X(),r.X(),a[1],o.X(),s.X()],this.dataY=[s.Y(),r.Y(),a[2],o.Y(),s.Y()]},n.updateDataArraySector=n.updateDataArray,n.updateDataArray=function(){var e=JXG.Math.Geometry.rad(t[0],t[1],t[2]);"square"==this.visProp.type?this.updateDataArraySquare():"sector"==this.visProp.type?(this.updateDataArraySector(),.0025>Math.abs(e-.5*Math.PI)?this.dot.visProp.visible===!1&&this.dot.setProperty({visible:!0}):this.dot.visProp.visible&&this.dot.setProperty({visible:!1})):.0025>Math.abs(e-.5*Math.PI)?this.updateDataArraySquare():this.updateDataArraySector()},n.radiuspoint=r,n.point=r,n.pointsquare=o,f=JXG.copyAttributes(i,e.options,"angle","dot"),n.dot=e.create("point",[function(){if(JXG.exists(n.dot)&&n.dot.visProp.visible===!1)return[0,0];var i=r.coords.usrCoords,o=e.create("transform",[-t[1].X(),-t[1].Y()],{type:"translate"});return o.melt(e.create("transform",[.5,.5],{type:"scale"})),o.melt(e.create("transform",[JXG.Math.Geometry.rad(t[0],t[1],t[2])/2,0,0],{type:"rotate"})),o.melt(e.create("transform",[t[1].X(),t[1].Y()],{type:"translate"})),o.update(),JXG.Math.matVecMult(o.matrix,i)}],f),n.dot.dump=!1,n.subs.dot=n.dot,m=0;3>m;m++)JXG.getRef(e,t[m]).addChild(r),JXG.getRef(e,t[m]).addChild(n.dot);return n.type=JXG.OBJECT_TYPE_ANGLE,JXG.getRef(e,t[0]).addChild(n),n.getLabelAnchor=function(){var e,t,i,n,r=JXG.Math.Geometry.rad(this.point2,this.point1,this.point3),o=13/this.board.unitX,a=13/this.board.unitY,s=this.point2.coords.usrCoords,l=this.point1.coords.usrCoords,c=s[1]-l[1],u=s[2]-l[2];return null!=this.label.content&&(this.label.content.relativeCoords=new JXG.Coords(JXG.COORDS_BY_SCREEN,[0,0],this.board)),e=new JXG.Coords(JXG.COORDS_BY_USER,[l[1]+Math.cos(1.125*.5*r)*c-Math.sin(1.125*.5*r)*u,l[2]+Math.sin(1.125*.5*r)*c+Math.cos(1.125*.5*r)*u],this.board),t=e.usrCoords[1]-l[1],i=e.usrCoords[2]-l[2],n=Math.sqrt(t*t+i*i),t=t*(n+o)/n,i=i*(n+a)/n,new JXG.Coords(JXG.COORDS_BY_USER,[l[1]+t,l[2]+i],this.board)},n.Value=function(){return JXG.Math.Geometry.rad(this.point2,this.point1,this.point3)},n.methodMap=JXG.deepCopy(n.methodMap,{Value:"Value"}),n},JXG.JSXGraph.registerElement("angle",JXG.createAngle),JXG.Composition=function(e){var t,i=["setProperty","prepareUpdate","updateRenderer","update","highlight","noHighlight"],n=function(e){return function(){var t;for(t in r.elements)JXG.exists(r.elements[t][e])&&r.elements[t][e].apply(r.elements[t],arguments);return r}},r=this;for(t=0;i.length>t;t++)this[i[t]]=n(i[t]);this.elements={};for(t in e)e.hasOwnProperty(t)&&this.add(t,e[t]);this.dump=!0,this.subs={}},JXG.extend(JXG.Composition.prototype,{add:function(e,t){return!JXG.exists(this[e])&&JXG.exists(t)?(JXG.exists(t.id)?this.elements[t.id]=t:this.elements[e]=t,this[e]=t,!0):!1},remove:function(e){var t,i=!1;for(t in this.elements)if(this.elements[t].id===this[e].id){i=!0;break}return i&&(delete this.elements[this[e].id],delete this[e]),i},getParents:function(){return this.parents},getType:function(){return this.elType},getAttributes:function(){var e,t={};for(e in this.subs)t[e]=this.subs[e].visProp;return this.attr}}),JXG.createOrthogonalProjection=function(e,t,i){var n,r,o;if(JXG.isPoint(t[0])&&t[1].elementClass==JXG.OBJECT_CLASS_LINE)r=t[0],n=t[1];else{if(!JXG.isPoint(t[1])||t[0].elementClass!=JXG.OBJECT_CLASS_LINE)throw Error("JSXGraph: Can't create perpendicular point with parent types '"+typeof t[0]+"' and '"+typeof t[1]+"'.\nPossible parent types: [point,line]");r=t[1],n=t[0]}return attr=JXG.copyAttributes(i,e.options,"orthogonalprojection"),o=e.create("point",[function(){return JXG.Math.Geometry.projectPointToLine(r,n,e)}],i),r.addChild(o),n.addChild(o),o.elType="orthogonalprojection",o.parents=[r.id,o.id],o.update(),o.generatePolynomial=function(){var e=n.point1.symbolic.x,t=n.point1.symbolic.y,i=n.point2.symbolic.x,a=n.point2.symbolic.y,s=r.symbolic.x,l=r.symbolic.y,c=o.symbolic.x,u=o.symbolic.y,d="("+t+")*("+c+")-("+t+")*("+i+")+("+u+")*("+i+")-("+e+")*("+u+")+("+e+")*("+a+")-("+c+")*("+a+")",h="("+l+")*("+t+")-("+l+")*("+a+")-("+u+")*("+t+")+("+u+")*("+a+")+("+s+")*("+e+")-("+s+")*("+i+")-("+c+")*("+e+")+("+c+")*("+i+")";return[d,h]},o},JXG.createPerpendicular=function(e,t,i){var n,r,o,a;if(t[0]=JXG.getReference(e,t[0]),t[1]=JXG.getReference(e,t[1]),JXG.isPoint(t[0])&&t[1].elementClass==JXG.OBJECT_CLASS_LINE)r=t[1],n=t[0];else{if(!JXG.isPoint(t[1])||t[0].elementClass!=JXG.OBJECT_CLASS_LINE)throw Error("JSXGraph: Can't create perpendicular with parent types '"+typeof t[0]+"' and '"+typeof t[1]+"'.\nPossible parent types: [line,point]");r=t[0],n=t[1]}return a=JXG.copyAttributes(i,e.options,"perpendicular"),o=JXG.createLine(e,[function(){return r.stdform[2]*n.X()-r.stdform[1]*n.Y()},function(){return-r.stdform[2]*n.Z()},function(){return r.stdform[1]*n.Z()}],a),o.elType="perpendicular",o.parents=[r.id,n.id],o},JXG.createPerpendicularPoint=function(e,t,i){var n,r,o;if(JXG.isPoint(t[0])&&t[1].elementClass==JXG.OBJECT_CLASS_LINE)r=t[0],n=t[1];else{if(!JXG.isPoint(t[1])||t[0].elementClass!=JXG.OBJECT_CLASS_LINE)throw Error("JSXGraph: Can't create perpendicular point with parent types '"+typeof t[0]+"' and '"+typeof t[1]+"'.\nPossible parent types: [point,line]");r=t[1],n=t[0]}return o=e.create("point",[function(){return JXG.Math.Geometry.perpendicular(n,r,e)[0]}],i),r.addChild(o),n.addChild(o),o.elType="perpendicularpoint",o.parents=[r.id,n.id],o.update(),o.generatePolynomial=function(){var e=n.point1.symbolic.x,t=n.point1.symbolic.y,i=n.point2.symbolic.x,a=n.point2.symbolic.y,s=r.symbolic.x,l=r.symbolic.y,c=o.symbolic.x,u=o.symbolic.y,d="("+t+")*("+c+")-("+t+")*("+i+")+("+u+")*("+i+")-("+e+")*("+u+")+("+e+")*("+a+")-("+c+")*("+a+")",h="("+l+")*("+t+")-("+l+")*("+a+")-("+u+")*("+t+")+("+u+")*("+a+")+("+s+")*("+e+")-("+s+")*("+i+")-("+c+")*("+e+")+("+c+")*("+i+")";return[d,h]},o},JXG.createPerpendicularSegment=function(e,t,i){var n,r,o,a,s;if(t[0]=JXG.getReference(e,t[0]),t[1]=JXG.getReference(e,t[1]),JXG.isPoint(t[0])&&t[1].elementClass==JXG.OBJECT_CLASS_LINE)r=t[1],n=t[0];else{if(!JXG.isPoint(t[1])||t[0].elementClass!=JXG.OBJECT_CLASS_LINE)throw Error("JSXGraph: Can't create perpendicular with parent types '"+typeof t[0]+"' and '"+typeof t[1]+"'.\nPossible parent types: [line,point]");r=t[0],n=t[1]}return s=JXG.copyAttributes(i,e.options,"perpendicularsegment","point"),a=JXG.createPerpendicularPoint(e,[r,n],s),a.dump=!1,JXG.exists(i.layer)||(i.layer=e.options.layer.line),s=JXG.copyAttributes(i,e.options,"perpendicularsegment"),o=JXG.createLine(e,[function(){return JXG.Math.Geometry.perpendicular(r,n,e)[1]?[a,n]:[n,a]}],s),o.point=a,o.elType="perpendicularsegment",o.parents=[n.id,r.id],o.subs={point:a},o},JXG.createMidpoint=function(e,t,i){var n,r,o;if(2==t.length&&JXG.isPoint(t[0])&&JXG.isPoint(t[1]))n=t[0],r=t[1];else{if(1!=t.length||t[0].elementClass!=JXG.OBJECT_CLASS_LINE)throw Error("JSXGraph: Can't create midpoint.\nPossible parent types: [point,point], [line]");n=t[0].point1,r=t[0].point2}return o=e.create("point",[function(){var e=n.coords.usrCoords[1]+r.coords.usrCoords[1];return isNaN(e)||Math.abs(n.coords.usrCoords[0])e?1:(r.Y(e)+t*(r.Y(e+1)-r.Y(e)))*(r.Y(e)-r.Y(e+1))-(r.X(e)+t*(r.X(e+1)-r.X(e)))*(r.X(e+1)-r.X(e))},function(){var e=Math.floor(n.position);return e==r.numberPoints-1&&e--,0>e?0:r.X(e+1)-r.X(e)},function(){var e=Math.floor(n.position);return e==r.numberPoints-1&&e--,0>e?0:r.Y(e+1)-r.Y(e)}],s);else{if(r.type!=JXG.OBJECT_TYPE_TURTLE)throw Error("JSXGraph: Can't create normal with parent types '"+typeof t[0]+"' and '"+typeof t[1]+"'.\nPossible parent types: [point,line], [point,circle], [glider]");o=e.create("line",[function(){var e,t,i=Math.floor(n.position),o=n.position-i;for(t=0;r.objects.length>t;t++)if(e=r.objects[t],e.type==JXG.OBJECT_TYPE_CURVE){if(e.numberPoints>i)break;i-=e.numberPoints}return i==e.numberPoints-1&&(i--,o=1),0>i?1:(e.Y(i)+o*(e.Y(i+1)-e.Y(i)))*(e.Y(i)-e.Y(i+1))-(e.X(i)+o*(e.X(i+1)-e.X(i)))*(e.X(i+1)-e.X(i))},function(){var e,t,i=Math.floor(n.position);for(t=0;r.objects.length>t;t++)if(e=r.objects[t],e.type==JXG.OBJECT_TYPE_CURVE){if(e.numberPoints>i)break;i-=e.numberPoints}return i==e.numberPoints-1&&i--,0>i?0:e.X(i+1)-e.X(i)},function(){var e,t,i=Math.floor(n.position);for(t=0;r.objects.length>t;t++)if(e=r.objects[t],e.type==JXG.OBJECT_TYPE_CURVE){if(e.numberPoints>i)break;i-=e.numberPoints}return i==e.numberPoints-1&&i--,0>i?0:e.Y(i+1)-e.Y(i)}],s)}for(o.parents=[],a=0;t.length>a;a++)o.parents.push(t[a].id);return o.elType="normal",o},JXG.createBisector=function(e,t,i){var n,r,o,a;if(t[0].elementClass==JXG.OBJECT_CLASS_POINT&&t[1].elementClass==JXG.OBJECT_CLASS_POINT&&t[2].elementClass==JXG.OBJECT_CLASS_POINT){for(a=JXG.copyAttributes(i,e.options,"bisector","point"),n=e.create("point",[function(){return JXG.Math.Geometry.angleBisector(t[0],t[1],t[2],e)}],a),n.dump=!1,o=0;3>o;o++)t[o].addChild(n);return JXG.exists(i.layer)||(i.layer=e.options.layer.line),a=JXG.copyAttributes(i,e.options,"bisector"),r=JXG.createLine(e,[t[1],n],a),r.point=n,r.elType="bisector",r.parents=[t[0].id,t[1].id,t[2].id],r.subs={point:n},r}throw Error("JSXGraph: Can't create angle bisector with parent types '"+typeof t[0]+"' and '"+typeof t[1]+"'.\nPossible parent types: [point,point,point]")},JXG.createAngularBisectorsOfTwoLines=function(e,t,i){var n,r,o,a,s=JXG.getReference(e,t[0]),l=JXG.getReference(e,t[1]);if(s.elementClass!=JXG.OBJECT_CLASS_LINE||l.elementClass!=JXG.OBJECT_CLASS_LINE)throw Error("JSXGraph: Can't create angle bisectors of two lines with parent types '"+typeof t[0]+"' and '"+typeof t[1]+"'.\nPossible parent types: [line,line]");return JXG.exists(i.layer)||(i.layer=e.options.layer.line),o=JXG.copyAttributes(i,e.options,"bisectorlines","line1"),n=e.create("line",[function(){var e=Math.sqrt(s.stdform[1]*s.stdform[1]+s.stdform[2]*s.stdform[2]),t=Math.sqrt(l.stdform[1]*l.stdform[1]+l.stdform[2]*l.stdform[2]);return s.stdform[0]/e-l.stdform[0]/t},function(){var e=Math.sqrt(s.stdform[1]*s.stdform[1]+s.stdform[2]*s.stdform[2]),t=Math.sqrt(l.stdform[1]*l.stdform[1]+l.stdform[2]*l.stdform[2]);return s.stdform[1]/e-l.stdform[1]/t},function(){var e=Math.sqrt(s.stdform[1]*s.stdform[1]+s.stdform[2]*s.stdform[2]),t=Math.sqrt(l.stdform[1]*l.stdform[1]+l.stdform[2]*l.stdform[2]);return s.stdform[2]/e-l.stdform[2]/t}],o),JXG.exists(i.layer)||(i.layer=e.options.layer.line),o=JXG.copyAttributes(i,e.options,"bisectorlines","line2"),r=e.create("line",[function(){var e=Math.sqrt(s.stdform[1]*s.stdform[1]+s.stdform[2]*s.stdform[2]),t=Math.sqrt(l.stdform[1]*l.stdform[1]+l.stdform[2]*l.stdform[2]);return s.stdform[0]/e+l.stdform[0]/t},function(){var e=Math.sqrt(s.stdform[1]*s.stdform[1]+s.stdform[2]*s.stdform[2]),t=Math.sqrt(l.stdform[1]*l.stdform[1]+l.stdform[2]*l.stdform[2]);return s.stdform[1]/e+l.stdform[1]/t},function(){var e=Math.sqrt(s.stdform[1]*s.stdform[1]+s.stdform[2]*s.stdform[2]),t=Math.sqrt(l.stdform[1]*l.stdform[1]+l.stdform[2]*l.stdform[2]);return s.stdform[2]/e+l.stdform[2]/t}],o),a=new JXG.Composition({line1:n,line2:r}),n.dump=!1,r.dump=!1,a.elType="bisectorlines",a.parents=[s.id,l.id],a.subs={line1:n,line2:r},a},JXG.createCircumcircleMidpoint=function(e,t,i){var n,r;if(t[0].elementClass==JXG.OBJECT_CLASS_POINT&&t[1].elementClass==JXG.OBJECT_CLASS_POINT&&t[2].elementClass==JXG.OBJECT_CLASS_POINT){for(n=JXG.createPoint(e,[function(){return JXG.Math.Geometry.circumcenterMidpoint(t[0],t[1],t[2],e)}],i),r=0;3>r;r++)t[r].addChild(n);return n.elType="circumcenter",n.parents=[t[0].id,t[1].id,t[2].id],n.generatePolynomial=function(){var e=a.symbolic.x,t=a.symbolic.y,i=b.symbolic.x,r=b.symbolic.y,o=c.symbolic.x,s=c.symbolic.y,l=n.symbolic.x,u=n.symbolic.y,d=["((",l,")-(",e,"))^2+((",u,")-(",t,"))^2-((",l,")-(",i,"))^2-((",u,")-(",r,"))^2"].join(""),h=["((",l,")-(",e,"))^2+((",u,")-(",t,"))^2-((",l,")-(",o,"))^2-((",u,")-(",s,"))^2"].join("");return[d,h]},n}throw Error("JSXGraph: Can't create circumcircle midpoint with parent types '"+typeof t[0]+"', '"+typeof t[1]+"' and '"+typeof t[2]+"'.\nPossible parent types: [point,point,point]")},JXG.createIncenter=function(e,t,i){var n,r,o,a;if(!(t.length>=3&&JXG.isPoint(t[0])&&JXG.isPoint(t[1])&&JXG.isPoint(t[2])))throw Error("JSXGraph: Can't create incenter with parent types '"+typeof t[0]+"', '"+typeof t[1]+"' and '"+typeof t[2]+"'.\nPossible parent types: [point,point,point]");return r=t[0],o=t[1],a=t[2],n=e.create("point",[function(){var t,i,n;return t=Math.sqrt((o.X()-a.X())*(o.X()-a.X())+(o.Y()-a.Y())*(o.Y()-a.Y())),i=Math.sqrt((r.X()-a.X())*(r.X()-a.X())+(r.Y()-a.Y())*(r.Y()-a.Y())),n=Math.sqrt((o.X()-r.X())*(o.X()-r.X())+(o.Y()-r.Y())*(o.Y()-r.Y())),new JXG.Coords(JXG.COORDS_BY_USER,[(t*r.X()+i*o.X()+n*a.X())/(t+i+n),(t*r.Y()+i*o.Y()+n*a.Y())/(t+i+n)],e)}],i),n.elType="incenter",n.parents=[t[0].id,t[1].id,t[2].id],n},JXG.createCircumcircle=function(e,t,i){var n,r,o;try{o=JXG.copyAttributes(i,e.options,"circumcircle","center"),n=JXG.createCircumcircleMidpoint(e,t,o),n.dump=!1,JXG.exists(i.layer)||(i.layer=e.options.layer.circle),o=JXG.copyAttributes(i,e.options,"circumcircle"),r=JXG.createCircle(e,[n,t[0]],o),r.elType="circumcircle",r.parents=[t[0].id,t[1].id,t[2].id],r.subs={center:n}}catch(a){throw Error("JSXGraph: Can't create circumcircle with parent types '"+typeof t[0]+"', '"+typeof t[1]+"' and '"+typeof t[2]+"'.\nPossible parent types: [point,point,point]")}return r},JXG.createIncircle=function(e,t,i){var n,r,o;try{o=JXG.copyAttributes(i,e.options,"incircle","center"),n=JXG.createIncenter(e,t,o),n.dump=!1,JXG.exists(i.layer)||(i.layer=e.options.layer.circle),o=JXG.copyAttributes(i,e.options,"incircle"),r=JXG.createCircle(e,[n,function(){var e=Math.sqrt((t[1].X()-t[2].X())*(t[1].X()-t[2].X())+(t[1].Y()-t[2].Y())*(t[1].Y()-t[2].Y())),i=Math.sqrt((t[0].X()-t[2].X())*(t[0].X()-t[2].X())+(t[0].Y()-t[2].Y())*(t[0].Y()-t[2].Y())),n=Math.sqrt((t[1].X()-t[0].X())*(t[1].X()-t[0].X())+(t[1].Y()-t[0].Y())*(t[1].Y()-t[0].Y())),r=(e+i+n)/2;return Math.sqrt((r-e)*(r-i)*(r-n)/r)}],o),r.elType="incircle",r.parents=[t[0].id,t[1].id,t[2].id],r.center=n,r.subs={center:n}}catch(a){throw Error("JSXGraph: Can't create circumcircle with parent types '"+typeof t[0]+"', '"+typeof t[1]+"' and '"+typeof t[2]+"'.\nPossible parent types: [point,point,point]")}return r},JXG.createReflection=function(e,t,i){var n,r,o;if(t[0].elementClass==JXG.OBJECT_CLASS_POINT&&t[1].elementClass==JXG.OBJECT_CLASS_LINE)r=t[0],n=t[1];else{if(t[1].elementClass!=JXG.OBJECT_CLASS_POINT||t[0].elementClass!=JXG.OBJECT_CLASS_LINE)throw Error("JSXGraph: Can't create reflection point with parent types '"+typeof t[0]+"' and '"+typeof t[1]+"'.\nPossible parent types: [line,point]");r=t[1],n=t[0]}return o=JXG.createPoint(e,[function(){return JXG.Math.Geometry.reflection(n,r,e)}],i),r.addChild(o),n.addChild(o),o.elType="reflection",o.parents=[t[0].id,t[1].id],o.prepareUpdate().update(),o.generatePolynomial=function(){var e=n.point1.symbolic.x,t=n.point1.symbolic.y,i=n.point2.symbolic.x,a=n.point2.symbolic.y,s=r.symbolic.x,l=r.symbolic.y,c=o.symbolic.x,u=o.symbolic.y,d=["((",u,")-(",l,"))*((",t,")-(",a,"))+((",e,")-(",i,"))*((",c,")-(",s,"))"].join(""),h=["((",c,")-(",e,"))^2+((",u,")-(",t,"))^2-((",s,")-(",e,"))^2-((",l,")-(",t,"))^2"].join("");return[d,h]},o},JXG.createMirrorPoint=function(e,t,i){var n,r;if(!JXG.isPoint(t[0])||!JXG.isPoint(t[1]))throw Error("JSXGraph: Can't create mirror point with parent types '"+typeof t[0]+"' and '"+typeof t[1]+"'.\nPossible parent types: [point,point]");for(n=JXG.createPoint(e,[function(){return JXG.Math.Geometry.rotation(t[0],t[1],Math.PI,e)}],i),r=0;2>r;r++)t[r].addChild(n);return n.elType="mirrorpoint",n.parents=[t[0].id,t[1].id],n.prepareUpdate().update(),n},JXG.createIntegral=function(e,t,i){var n,r,o,a,s,l,c,u,d,h,p,f,g,m=0,b=0,v=1;if(JXG.isArray(t[0])&&t[1].elementClass==JXG.OBJECT_CLASS_CURVE)n=t[0],r=t[1];else{if(!JXG.isArray(t[1])||t[0].elementClass!=JXG.OBJECT_CLASS_CURVE)throw Error("JSXGraph: Can't create integral with parent types '"+typeof t[0]+"' and '"+typeof t[1]+"'.\nPossible parent types: [[number|function,number|function],curve]");n=t[1],r=t[0]}return m=n[0],b=n[1],JXG.isFunction(m)?(a=m,s=function(){return r.Y(a())},m=a()):(a=m,s=r.Y(m)),JXG.isFunction(m)?(l=b,c=function(){return r.Y(l())},b=l()):(l=b,c=r.Y(b)),m>b&&(v=-1),o=JXG.copyAttributes(i,e.options,"integral","curveLeft"),u=e.create("glider",[a,s,r],o),JXG.isFunction(a)&&u.hideElement(),o=JXG.copyAttributes(i,e.options,"integral","baseLeft"),d=e.create("point",[function(){return u.X()},0],o),o=JXG.copyAttributes(i,e.options,"integral","curveRight"),h=e.create("glider",[l,c,r],o),JXG.isFunction(l)&&h.hideElement(),o=JXG.copyAttributes(i,e.options,"integral","baseRight"),p=e.create("point",[function(){return h.X()},0],o),o=JXG.copyAttributes(i,e.options,"integral"),o.withLabel!==!1&&(o=JXG.copyAttributes(i,e.options,"integral","label"),f=e.create("text",[function(){return h.X()+.2},function(){return h.Y()-.8},function(){var e=JXG.Math.Numerics.I([d.X(),p.X()],r.Y);return"∫ = "+e.toFixed(4)}],o),f.dump=!1,u.addChild(f),h.addChild(f)),o=JXG.copyAttributes(i,e.options,"integral"),g=e.create("curve",[[0],[0]],o),u.dump=!1,d.dump=!1,h.dump=!1,p.dump=!1,g.elType="integral",g.parents=[r.id,n],g.subs={curveLeft:u,baseLeft:d,curveRight:h,baseRight:p},o.withLabel&&(g.subs.label=f),g.updateDataArray=function(){var e,t,i,n,o;for(d.X()i;i++)r.points[i].usrCoords[1]>=n&&o>=r.points[i].usrCoords[1]&&(e.push(r.points[i].usrCoords[1]),t.push(r.points[i].usrCoords[2]));e.push(o),t.push(r.Y(o)),e.push(o),t.push(0),e.push(n),t.push(0),this.dataX=e,this.dataY=t},u.addChild(g),h.addChild(g),g.baseLeft=d,g.baseRight=p,g.curveLeft=u,g.curveRight=h,g.label={content:f},g},JXG.createLocus=function(e,t,i){var n,r;if(!JXG.isArray(t)||1!=t.length||t[0].elementClass!=JXG.OBJECT_CLASS_POINT)throw Error("JSXGraph: Can't create locus with parent of type other than point.\nPossible parent types: [point]");return r=t[0],n=e.create("curve",[[null],[null]],i),n.dontCallServer=!1,n.elType="locus",n.parents=[r.id],n.updateDataArray=function(){if(!(n.board.mode>0)){var t=JXG.Math.Symbolic.generatePolynomials(e,r,!0).join("|");if(t!==n.spe){n.spe=t;var i=function(e,t,i,r){n.dataX=e,n.dataY=t,n.eq=i,n.ctime=r,n.generatePolynomial=function(e){return function(t){var i,n="("+t.symbolic.x+")",r="("+t.symbolic.y+")",o=[];for(i=0;e.length>i;i++)o[i]=e[i].replace(/\*\*/g,"^").replace(/x/g,n).replace(/y/g,r);return o}}(i)},o=JXG.Math.Symbolic.geometricLocusByGroebnerBase(e,r,i);i(o.datax,o.datay,o.polynomial,o.exectime)}}},n},JXG.createGrid=function(e,t,i){var n,r;return r=JXG.copyAttributes(i,e.options,"grid"),n=e.create("curve",[[null],[null]],r),n.elType="grid",n.parents=[],n.updateDataArray=function(){var t,i=this.visProp.gridx,r=this.visProp.gridy,o=new JXG.Coords(JXG.COORDS_BY_SCREEN,[0,0],e),a=new JXG.Coords(JXG.COORDS_BY_SCREEN,[e.canvasWidth,e.canvasHeight],e);for(e.options.grid.hasGrid=!0,o.setCoordinates(JXG.COORDS_BY_USER,[Math.floor(o.usrCoords[1]/i)*i,Math.ceil(o.usrCoords[2]/r)*r]),a.setCoordinates(JXG.COORDS_BY_USER,[Math.ceil(a.usrCoords[1]/i)*i,Math.floor(a.usrCoords[2]/r)*r]),n.dataX=[],n.dataY=[],t=o.usrCoords[2];t>a.usrCoords[2]-r;t-=r)n.dataX.push(o.usrCoords[1],a.usrCoords[1],0/0),n.dataY.push(t,t,0/0);for(t=o.usrCoords[1];a.usrCoords[1]+i>t;t+=i)n.dataX.push(t,t,0/0),n.dataY.push(o.usrCoords[2],a.usrCoords[2],0/0)},n.hasPoint=function(){return!1},e.grids.push(n),n},JXG.JSXGraph.registerElement("arrowparallel",JXG.createArrowParallel),JXG.JSXGraph.registerElement("bisector",JXG.createBisector),JXG.JSXGraph.registerElement("bisectorlines",JXG.createAngularBisectorsOfTwoLines),JXG.JSXGraph.registerElement("circumcircle",JXG.createCircumcircle),JXG.JSXGraph.registerElement("circumcirclemidpoint",JXG.createCircumcircleMidpoint),JXG.JSXGraph.registerElement("circumcenter",JXG.createCircumcircleMidpoint),JXG.JSXGraph.registerElement("incenter",JXG.createIncenter),JXG.JSXGraph.registerElement("incircle",JXG.createIncircle),JXG.JSXGraph.registerElement("integral",JXG.createIntegral),JXG.JSXGraph.registerElement("midpoint",JXG.createMidpoint),JXG.JSXGraph.registerElement("mirrorpoint",JXG.createMirrorPoint),JXG.JSXGraph.registerElement("normal",JXG.createNormal),JXG.JSXGraph.registerElement("orthogonalprojection",JXG.createOrthogonalProjection),JXG.JSXGraph.registerElement("parallel",JXG.createParallel),JXG.JSXGraph.registerElement("parallelpoint",JXG.createParallelPoint),JXG.JSXGraph.registerElement("perpendicular",JXG.createPerpendicular),JXG.JSXGraph.registerElement("perpendicularpoint",JXG.createPerpendicularPoint),JXG.JSXGraph.registerElement("perpendicularsegment",JXG.createPerpendicularSegment),JXG.JSXGraph.registerElement("reflection",JXG.createReflection),JXG.JSXGraph.registerElement("locus",JXG.createLocus),JXG.JSXGraph.registerElement("grid",JXG.createGrid),JXG.Text=function(e,t,i,n){if(this.constructor(e,n,JXG.OBJECT_TYPE_TEXT,JXG.OBJECT_CLASS_OTHER),this.content=t,this.plaintext="",this.isDraggable=!1,this.element=JXG.getRef(this.board,n.anchor))this.relativeCoords=this.visProp.islabel?new JXG.Coords(JXG.COORDS_BY_SCREEN,[parseFloat(i[0]),parseFloat(i[1])],this.board):new JXG.Coords(JXG.COORDS_BY_USER,[parseFloat(i[0]),parseFloat(i[1])],this.board),this.element.addChild(this),this.coords=new JXG.Coords(JXG.COORDS_BY_SCREEN,[0,0],this.board),this.isDraggable=!0;else{JXG.isNumber(i[0])&&JXG.isNumber(i[1])&&(this.isDraggable=!0),this.X=JXG.createFunction(i[0],this.board,null,!0),this.Y=JXG.createFunction(i[1],this.board,null,!0),this.coords=new JXG.Coords(JXG.COORDS_BY_USER,[this.X(),this.Y()],this.board);var r="this.coords.setCoordinates(JXG.COORDS_BY_USER,[this.X(),this.Y()]);";this.updateCoords=Function("",r)}return"function"==typeof this.content?this.updateText=function(){this.plaintext=this.content()}:(this.content=JXG.isNumber(this.content)?this.content.toFixed(this.visProp.digits):this.visProp.useasciimathml?"'`"+this.content+"`'":this.generateTerm(this.content),this.updateText=Function("this.plaintext = "+this.content+";")),this.updateText(),this.id=this.board.setId(this,"T"),this.board.renderer.drawText(this),this.visProp.visible||this.board.renderer.hide(this),"string"==typeof this.content&&this.notifyParents(this.content),this.size=[1,1],this.elType="text",this.methodMap=JXG.deepCopy(this.methodMap,{setText:"setTextJessieCode",free:"free",move:"setCoords"}),this},JXG.Text.prototype=new JXG.GeometryElement,JXG.extend(JXG.Text.prototype,{hasPoint:function(e,t){var i=e-this.coords.scrCoords[1],n=this.coords.scrCoords[2]-t,r=this.board.options.precision.hasPoint;return i>=-r&&2*r>=i&&n>=-r&&2*r>=n},setTextJessieCode:function(e){var t;return this.visProp.castext=e,t="function"==typeof e?function(){return e().replace(//g,">")}:JXG.isNumber(e)?e:e.replace(//g,">"),this.setText(t)},setText:function(e){return"function"==typeof e?this.updateText=function(){this.plaintext=e()}:(this.content=JXG.isNumber(e)?e.toFixed(this.visProp.digits):this.visProp.useasciimathml?"'`"+e+"`'":this.generateTerm(e),this.updateText=Function("this.plaintext = "+this.content+";")),this.updateText(),this.updateSize(),this.needsUpdate=!0,this.update(),this.updateRenderer(),this},updateSize:function(){return"html"==this.visProp.display&&"vml"!=this.board.renderer.type?this.size=[this.rendNode.offsetWidth,this.rendNode.offsetHeight]:"internal"==this.visProp.display&&"svg"==this.board.renderer.type?this.size=[this.rendNode.getBBox().width,this.rendNode.getBBox().height]:("vml"==this.board.renderer.type||"internal"==this.visProp.display&&"canvas"==this.board.renderer.type)&&(this.size=[.45*parseFloat(this.visProp.fontsize)*this.plaintext.length,.9*parseFloat(this.visProp.fontsize)]),this},getSize:function(){return this.size},setCoords:function(e,t){return JXG.isArray(e)&&e.length>1&&(t=e[1],e=e[0]),this.X=function(){return e},this.Y=function(){return t},this.coords=new JXG.Coords(JXG.COORDS_BY_USER,[e,t],this.board),this.board.update(),this},free:function(){this.X=JXG.createFunction(this.X(),this.board,""),this.Y=JXG.createFunction(this.Y(),this.board,""),this.isDraggable=!0},update:function(){var e,t,i;return this.needsUpdate&&(this.relativeCoords?this.visProp.islabel?(t=parseFloat(this.visProp.offsets[0]),i=-parseFloat(this.visProp.offsets[1]),e=this.element.getLabelAnchor(),this.coords.setCoordinates(JXG.COORDS_BY_SCREEN,[t+this.relativeCoords.scrCoords[1]+e.scrCoords[1],i+this.relativeCoords.scrCoords[2]+e.scrCoords[2]])):(e=this.element.getTextAnchor(),this.coords.setCoordinates(JXG.COORDS_BY_USER,[this.relativeCoords.usrCoords[1]+e.usrCoords[1],this.relativeCoords.usrCoords[2]+e.usrCoords[2]])):this.updateCoords(),this.updateText(),this.updateTransform()),this},updateRenderer:function(){return this.needsUpdate&&(this.board.renderer.updateText(this),this.needsUpdate=!1),this},updateTransform:function(){if(0!=this.transformations.length){for(var e=0;this.transformations.length>e;e++)this.transformations[e].update();return this}},generateTerm:function(e){var t,i,n='""';
e=e||"",e=e.replace(/\r/g,""),e=e.replace(/\n/g,""),e=e.replace(/\"/g,'\\"'),e=e.replace(/\'/g,"\\'"),e=e.replace(/&arc;/g,"∠"),e=e.replace(//g,"∠"),e=e.replace(//g,"√");var r;r=e.indexOf("");var o=e.indexOf("");if(r>=0)for(;r>=0;)n+=' + "'+JXG.GeonextParser.replaceSub(JXG.GeonextParser.replaceSup(e.slice(0,r)))+'"',i=e.slice(r+7,o),t=JXG.GeonextParser.geonext2JS(i,this.board),t=t.replace(/\\"/g,'"'),t=t.replace(/\\'/g,"'"),n+=0>t.indexOf("toFixed")?JXG.isNumber(JXG.bind(Function("return "+t+";"),this)())?"+("+t+").toFixed("+this.visProp.digits+")":"+("+t+")":"+("+t+")",e=e.slice(o+8),r=e.indexOf(""),o=e.indexOf("");return n+=' + "'+JXG.GeonextParser.replaceSub(JXG.GeonextParser.replaceSup(e))+'"',n=n.replace(//g,""),n=n.replace(/<\/overline>/g,""),n=n.replace(//g,""),n=n.replace(/<\/arrow>/g,""),n=n.replace(/&/g,"&")},notifyParents:function(e){var t=null;do{var i=/([\w\s\*\/\^\-\+\(\)\[\],<>=!]+)<\/value>/;t=i.exec(e),null!=t&&(JXG.GeonextParser.findDependencies(this,t[1],this.board),e=e.substr(t.index),e=e.replace(i,""))}while(null!=t);return this},bounds:function(){var e=this.coords.usrCoords;return this.visProp.islabel?[0,0,0,0]:[e[1],e[2]+this.size[1],e[1]+this.size[0],e[2]]},setPositionDirectly:function(e,t,i,n,r){var o,a,s,l;return this.relativeCoords?this.visProp.islabel?(e==JXG.COORDS_BY_USER?(l=new JXG.Coords(JXG.COORDS_BY_USER,[n,r],this.board),s=new JXG.Coords(JXG.COORDS_BY_USER,[t,i],this.board),o=s.scrCoords[1]-l.scrCoords[1],a=s.scrCoords[2]-l.scrCoords[2]):(o=t-n,a=i-r),this.relativeCoords.scrCoords[1]+=o,this.relativeCoords.scrCoords[2]+=a):(e==JXG.COORDS_BY_SCREEN?(l=new JXG.Coords(JXG.COORDS_BY_SCREEN,[n,r],this.board),s=new JXG.Coords(JXG.COORDS_BY_SCREEN,[t,i],this.board),o=s.usrCoords[1]-l.usrCoords[1],a=s.usrCoords[2]-l.usrCoords[2]):(o=t-n,a=i-r),this.relativeCoords.usrCoords[1]+=o,this.relativeCoords.usrCoords[2]+=a):(e==JXG.COORDS_BY_SCREEN&&(s=new JXG.Coords(JXG.COORDS_BY_SCREEN,[t,i],this.board),t=s.usrCoords[1],i=s.usrCoords[2]),this.X=JXG.createFunction(t,this.board,""),this.Y=JXG.createFunction(i,this.board,"")),this}}),JXG.createText=function(e,t,i){var n,r;return n=JXG.copyAttributes(i,e.options,"text"),n.anchor=n.parent||n.anchor,r=new JXG.Text(e,t[t.length-1],t,n),"function"!=typeof t[t.length-1]&&(r.parents=t),r},JXG.JSXGraph.registerElement("text",JXG.createText),JXG.Image=function(e,t,i,n,r){this.constructor(e,r,JXG.OBJECT_TYPE_IMAGE,JXG.OBJECT_CLASS_OTHER),this.initialCoords=new JXG.Coords(JXG.COORDS_BY_USER,i,this.board),JXG.isFunction(i[0])||JXG.isFunction(i[1])||(this.isDraggable=!0),this.X=JXG.createFunction(i[0],this.board,""),this.Y=JXG.createFunction(i[1],this.board,""),this.W=JXG.createFunction(n[0],this.board,""),this.H=JXG.createFunction(n[1],this.board,""),this.coords=new JXG.Coords(JXG.COORDS_BY_USER,[this.X(),this.Y()],this.board),this.updateCoords=Function("","this.coords.setCoordinates(JXG.COORDS_BY_USER,[this.X(),this.Y()]);"),this.updateSize=Function("","this.coords.setCoordinates(JXG.COORDS_BY_USER,[this.W(),this.H()]);"),this.usrSize=[this.W(),this.H()],this.size=[this.usrSize[0]*e.unitX,this.usrSize[1]*e.unitY],this.url=t,this.parent=JXG.getRef(r.anchor),this.id=this.board.setId(this,"Im"),this.board.renderer.drawImage(this),this.visProp.visible||this.board.renderer.hide(this)},JXG.Image.prototype=new JXG.GeometryElement,JXG.extend(JXG.Image.prototype,{hasPoint:function(e,t){var i=e-this.coords.scrCoords[1],n=this.coords.scrCoords[2]-t,r=this.board.options.precision.hasPoint;return i>=-r&&2*r>=i&&n>=-r&&r>=n?!0:!1},update:function(){return this.needsUpdate&&(this.updateCoords(),this.usrSize=[this.W(),this.H()],this.size=[this.usrSize[0]*this.board.unitX,this.usrSize[1]*this.board.unitY],this.updateTransform()),this},updateRenderer:function(){return this.needsUpdate&&(this.board.renderer.updateImage(this),this.needsUpdate=!1),this},updateTransform:function(){if(0!=this.transformations.length)for(var e=0;this.transformations.length>e;e++)this.transformations[e].update()},addTransform:function(e){if(JXG.isArray(e))for(var t=0;e.length>t;t++)this.transformations.push(e[t]);else this.transformations.push(e)},setPositionDirectly:function(e,t,i){var n;return e==JXG.COORDS_BY_SCREEN&&(n=new JXG.Coords(JXG.COORDS_BY_SCREEN,[t,i],this.board),t=n.usrCoords[1],i=n.usrCoords[2]),this.X=JXG.createFunction(t,this.board,""),this.Y=JXG.createFunction(i,this.board,""),this}}),JXG.createImage=function(e,t,i){var n;return n=JXG.copyAttributes(i,e.options,"image"),new JXG.Image(e,t[0],t[1],t[2],n)},JXG.JSXGraph.registerElement("image",JXG.createImage),JXG.createSlider=function(e,t,i){var n,r,o,a,s,l,c,u,d,h,p,f,g,m,b,v,y,x,C,w,k,_;return n=t[0],r=t[1],o=t[2][0],a=t[2][1],s=t[2][2],l=s-o,k=JXG.copyAttributes(i,e.options,"slider"),C=k.withticks,x=k.withlabel,w=k.snapwidth,_=k.precision,k=JXG.copyAttributes(i,e.options,"slider","point1"),c=e.create("point",n,k),k=JXG.copyAttributes(i,e.options,"slider","point2"),u=e.create("point",r,k),e.create("group",[c,u]),k=JXG.copyAttributes(i,e.options,"slider","baseline"),d=e.create("segment",[c,u],k),d.updateStdform(),C&&(k=JXG.copyAttributes(i,e.options,"slider","ticks"),h=2,p=e.create("ticks",[d,u.Dist(c)/h],k)),f=n[0]+(r[0]-n[0])*(a-o)/(s-o),g=n[1]+(r[1]-n[1])*(a-o)/(s-o),k=JXG.copyAttributes(i,e.options,"slider"),k.withLabel=!1,m=e.create("glider",[f,g,d],k),m.setProperty({snapwidth:w}),k=JXG.copyAttributes(i,e.options,"slider","highline"),b=e.create("segment",[c,m],k),m.Value=function(){return-1===m.visProp.snapwidth?this.position*l+o:Math.round((this.position*l+o)/this.visProp.snapwidth)*this.visProp.snapwidth},m.methodMap=JXG.deepCopy(m.methodMap,{Value:"Value"}),m._smax=s,m._smin=o,x&&(v=i.name&&""!=i.name?i.name+" = ":"",k=JXG.copyAttributes(i,e.options,"slider","label"),y=e.create("text",[function(){return.05*(u.X()-c.X())+u.X()},function(){return.05*(u.Y()-c.Y())+u.Y()},function(){return v+m.Value().toFixed(_)}],k),m.label.content=y),m.point1=c,m.point2=u,m.baseline=d,m.highline=b,C&&(m.ticks=p),m.remove=function(){x&&e.removeObject(y),e.removeObject(b),C&&d.removeTicks(p),e.removeObject(d),e.removeObject(u),e.removeObject(c),JXG.Point.prototype.remove.call(m)},c.dump=!1,u.dump=!1,d.dump=!1,b.dump=!1,m.elType="slider",m.parents=t,m.subs={point1:c,point2:u,baseLine:d,highLine:b},C&&(p.dump=!1,m.subs.ticks=p),m},JXG.JSXGraph.registerElement("slider",JXG.createSlider),JXG.Chart=function(e,t,i){this.constructor(e,i);var n,r,o,a,s,l;if(!JXG.isArray(t)||0===t.length)throw Error("JSXGraph: Can't create a chart without data");if(this.elements=[],JXG.isNumber(t[0]))for(r=t,n=[],o=0;r.length>o;o++)n[o]=o+1;else if(1===t.length&&JXG.isArray(t[0]))for(r=t[0],n=[],l=JXG.evaluate(r).length,o=0;l>o;o++)n[o]=o+1;else 2===t.length&&(l=Math.min(t[0].length,t[1].length),n=t[0].slice(0,l),r=t[1].slice(0,l));if(JXG.isArray(r)&&0===r.length)throw Error("JSXGraph: Can't create charts without data.");for(s=i.chartstyle.replace(/ /g,"").split(","),o=0;s.length>o;o++){switch(s[o]){case"bar":a=this.drawBar(e,n,r,i);break;case"line":a=this.drawLine(e,n,r,i);break;case"fit":a=this.drawFit(e,n,r,i);break;case"spline":a=this.drawSpline(e,n,r,i);break;case"pie":a=this.drawPie(e,r,i);break;case"point":a=this.drawPoints(e,n,r,i);break;case"radar":a=this.drawRadar(e,t,i)}this.elements.push(a)}return this.id=this.board.setId(this,"Chart"),this.elements},JXG.Chart.prototype=new JXG.GeometryElement,JXG.extend(JXG.Chart.prototype,{drawLine:function(e,t,i,n){return n.fillcolor="none",n.highlightfillcolor="none",e.create("curve",[t,i],n)},drawSpline:function(e,t,i,n){return n.fillColor="none",n.highlightfillcolor="none",e.create("spline",[t,i],n)},drawFit:function(e,t,i,n){var r=n.degree;return r=!JXG.exists(r)||0/0==parseInt(r)||1>parseInt(r)?1:parseInt(r),n.fillcolor="none",n.highlightfillcolor="none",e.create("functiongraph",[JXG.Math.Numerics.regressionPolynomial(r,t,i)],n)},drawBar:function(e,t,i,n){var r,o,a,s,l,c,u,d,h,p,f,g=[],m=[],b={fixed:!0,withLabel:!1,visible:!1,name:""};if(JXG.exists(n.fillopacity)||(n.fillopacity=.6),n&&n.width)c=n.width;else{if(1>=t.length)c=1;else for(c=t[1]-t[0],r=1;t.length-1>r;r++)c=c>t[r+1]-t[r]?t[r+1]-t[r]:c;c*=.8}for(a=n.fillcolor,s=parseFloat(e.options.text.fontSize),r=0;t.length>r;r++)isNaN(JXG.evaluate(t[r]))||isNaN(i[r]),JXG.isFunction(t[r])?(u=function(){return t[r]()-.5*c},d=function(){return t[r]()},h=function(){return t[r]()+.5*c}):(u=t[r]-.5*c,d=t[r],h=t[r]+.5*c),p=i[r],"horizontal"==n.dir?(m[0]=e.create("point",[0,u],b),m[1]=e.create("point",[p,u],b),m[2]=e.create("point",[p,h],b),m[3]=e.create("point",[0,h],b),JXG.exists(n.labels)&&JXG.exists(n.labels[r])&&(o=(""+n.labels[r]).length,o=2*o*s/e.unitX,p>=0?p+=.5*s/e.unitX:p-=s*o/e.unitX,d-=.2*s/e.unitY,l=e.create("text",[p,d,n.labels[r]],n))):(m[0]=e.create("point",[u,0],b),m[1]=e.create("point",[u,p],b),m[2]=e.create("point",[h,p],b),m[3]=e.create("point",[h,0],b),JXG.exists(n.labels)&&JXG.exists(n.labels[r])&&(o=(""+n.labels[r]).length,o=.6*o*s/e.unitX,p>=0?p+=.5*s/e.unitY:p-=1*s/e.unitY,l=e.create("text",[d-.5*o,p,n.labels[r]],n))),n.withlines=!1,JXG.exists(n.colors)&&JXG.isArray(n.colors)&&(f=n.colors,n.fillcolor=f[r%f.length]),g[r]=e.create("polygon",m,n),JXG.exists(n.labels)&&JXG.exists(n.labels[r])&&(g[r].text=l);return g},drawPoints:function(e,t,i,n){var r,o=[],a=n.infoboxarray;for(n.fixed=!0,n.name="",r=0;t.length>r;r++)n.infoboxtext=a?a[r%a.length]:!1,o[r]=e.create("point",[t[r],i[r]],n);return o},drawPie:function(e,t,i){var n,r,o=[],a=[],s=(JXG.Math.Statistics.sum(t),i.colors),l=i.highlightcolors,c=i.labels,u=i.radius||4,d=u,h=i.center||[0,0],p=h[0],f=h[1],g={fixed:!0,withLabel:!1,visible:!1,name:""};if(!JXG.isArray(c))for(c=[],n=0;t.length>n;n++)c[n]="";for(JXG.isFunction(u)||(d=function(){return u}),i.highlightonsector=i.highlightonsector||!1,i.straightfirst=!1,i.straightlast=!1,r=e.create("point",[p,f],g),o[0]=e.create("point",[function(){return d()+p},function(){return f}],g),n=0;t.length>n;n++)o[n+1]=e.create("point",[function(e){return function(){var i,n,r,o=0;for(n=0;e>=n;n++)o+=parseFloat(JXG.evaluate(t[n]));for(i=o,n=e+1;t.length>n;n++)i+=parseFloat(JXG.evaluate(t[n]));return r=0!=i?2*Math.PI*o/i:0,d()*Math.cos(r)+p}}(n),function(e){return function(){var i,n,r,o=0;for(n=0;e>=n;n++)o+=parseFloat(JXG.evaluate(t[n]));for(i=o,n=e+1;t.length>n;n++)i+=parseFloat(JXG.evaluate(t[n]));return r=0!=i?2*Math.PI*o/i:0,d()*Math.sin(r)+f}}(n)],g),i.name=c[n],i.withlabel=""!=i.name,i.fillcolor=s&&s[n%s.length],i.labelcolor=s&&s[n%s.length],i.highlightfillcolor=l&&l[n%l.length],a[n]=e.create("sector",[r,o[n],o[n+1]],i),i.highlightonsector&&(a[n].hasPoint=a[n].hasPointSector),i.highlightbysize&&(a[n].highlight=function(){if(!this.highlighted){this.highlighted=!0,this.board.renderer.highlight(this);var e=-this.point1.coords.usrCoords[1]+this.point2.coords.usrCoords[1],t=-this.point1.coords.usrCoords[2]+this.point2.coords.usrCoords[2];null!=this.label.content&&(this.label.content.rendNode.style.fontSize=2*this.label.content.visProp.fontsize+"px",this.label.content.prepareUpdate().update().updateRenderer()),this.point2.coords=new JXG.Coords(JXG.COORDS_BY_USER,[this.point1.coords.usrCoords[1]+1.1*e,this.point1.coords.usrCoords[2]+1.1*t],this.board),this.prepareUpdate().update().updateRenderer()}},a[n].noHighlight=function(){if(this.highlighted){this.highlighted=!1,this.board.renderer.noHighlight(this);var e=-this.point1.coords.usrCoords[1]+this.point2.coords.usrCoords[1],t=-this.point1.coords.usrCoords[2]+this.point2.coords.usrCoords[2];null!=this.label.content&&(this.label.content.rendNode.style.fontSize=2*this.label.content.visProp.fontsize+"px",this.label.content.prepareUpdate().update().updateRenderer()),this.point2.coords=new JXG.Coords(JXG.COORDS_BY_USER,[this.point1.coords.usrCoords[1]+e/1.1,this.point1.coords.usrCoords[2]+t/1.1],this.board),this.prepareUpdate().update().updateRenderer()}});return{sectors:a,points:o,midpoint:r}},drawRadar:function(e,t,i){var n,r,o,a,s,l,c,u,d,h,p,f,g,m,b,v,y,x,C,w,k,_,T,E,S,A,O,P,R,I,L,D,M,N,B,G,F,X,J,j,z,H=t.length;if(0>=H)return JXG.debug("No data"),void 0;if(o=i.paramarray,!JXG.exists(o))return JXG.debug("Need paramArray attribute"),void 0;if(a=o.length,1>=a)return JXG.debug("Need more than 1 param"),void 0;for(n=0;H>n;n++)if(a!=t[n].length)return JXG.debug("Use data length equal to number of params ("+t[n].length+" != "+a+")"),void 0;for(s=Array(a),l=Array(a),r=0;a>r;r++)s[r]=t[0][r],l[r]=s[r];for(n=1;H>n;n++)for(r=0;a>r;r++)t[n][r]>s[r]&&(s[r]=t[n][r]),t[n][r]n;n++)c[n]="",u[n]=[];for(d=Array(a),h=Array(a),p=i.startshiftratio||0,f=i.endshiftratio||0,n=0;a>n;n++)d[n]=(s[n]-l[n])*p,h[n]=(s[n]-l[n])*f;if(g=i.startshiftarray||d,m=i.endshiftarray||h,b=i.startarray||l,JXG.exists(i.start))for(n=0;a>n;n++)b[n]=i.start;if(v=i.endarray||s,JXG.exists(i.end))for(n=0;a>n;n++)v[n]=i.end;if(g.length!=a)return JXG.debug("Start shifts length is not equal to number of parameters"),void 0;if(m.length!=a)return JXG.debug("End shifts length is not equal to number of parameters"),void 0;if(b.length!=a)return JXG.debug("Starts length is not equal to number of parameters"),void 0;if(v.length!=a)return JXG.debug("Ends length is not equal to number of parameters"),void 0;y=i.labelarray||c,x=i.colors,C=i.highlightcolors,w=i.radius||10,k={},JXG.exists(i.highlightonsector)||(i.highlightonsector=!1),k.name=i.name,k.id=i.id,k.strokewidth=i.strokewidth||1,k.polystrokewidth=i.polystrokewidth||2*k.strokewidth,k.strokecolor=i.strokecolor||"black",k.straightfirst=!1,k.straightlast=!1,k.fillcolor=i.fillColor||"#FFFF88",k.fillopacity=i.fillOpacity||.4,k.highlightfillcolor=i.highlightFillColor||"#FF7400",k.highlightstrokecolor=i.highlightStrokeColor||"black",k.gradient=i.gradient||"none",_=i.center||[0,0],T=_[0],E=_[1],S=e.create("point",[T,E],{name:"",fixed:!0,withlabel:!1,visible:!1}),A=Math.PI/2-Math.PI/a,(i.startangle||0===i.startangle)&&(A=i.startangle),O=A,P=[],R=[];var $=function(){var e,t,i,n,r=this.visProp.label.offsets.slice(0);return e=this.point1.X(),t=this.point2.X(),i=this.point1.Y(),n=this.point2.Y(),e>t&&(r[0]=-r[0]),i>n&&(r[1]=-r[1]),this.setLabelRelativeCoords(r),new JXG.Coords(JXG.COORDS_BY_USER,[this.point2.X(),this.point2.Y()],this.board)},U=function(t,i){var n,r,o;return n=e.create("transform",[-(b[i]-g[i]),0],{type:"translate"}),r=e.create("transform",[w/(v[i]+m[i]-(b[i]-g[i])),1],{type:"scale"}),n.melt(r),o=e.create("transform",[t],{type:"rotate"}),n.melt(o),n};for(n=0;a>n;n++)for(O+=2*Math.PI/a,L=w*Math.cos(O)+T,D=w*Math.sin(O)+E,P[n]=e.create("point",[L,D],{name:"",fixed:!0,withlabel:!1,visible:!1}),R[n]=e.create("line",[S,P[n]],{name:o[n],strokeColor:k.strokecolor,strokeWidth:k.strokewidth,strokeOpacity:1,straightFirst:!1,straightLast:!1,withLabel:!0,highlightStrokeColor:k.highlightstrokecolor}),R[n].getLabelAnchor=$,I=U(O,n),r=0;t.length>r;r++){var W=t[r][n];u[r][n]=e.create("point",[W,0],{name:"",fixed:!0,withlabel:!1,visible:!1}),u[r][n].addTransform(u[r][n],I)}for(M=Array(H),n=0;H>n;n++)for(k.labelcolor=x&&x[n%x.length],k.strokecolor=x&&x[n%x.length],k.fillcolor=x&&x[n%x.length],M[n]=e.create("polygon",u[n],{withLines:!0,withLabel:!1,fillColor:k.fillcolor,fillOpacity:k.fillopacity,highlightFillColor:k.highlightfillcolor}),r=0;a>r;r++)M[n].borders[r].setProperty("strokecolor:"+x[n%x.length]),M[n].borders[r].setProperty("strokewidth:"+k.polystrokewidth);switch(N=i.legendposition||"none"){case"right":var V=i.legendleftoffset||2,K=i.legendtopoffset||1;this.legend=e.create("legend",[T+w+V,E+w-K],{labelArray:y,colorArray:x});break;case"none":break;default:JXG.debug("Unknown legend position")}if(B=[],0!=i.showcircles){for(G=[],n=0;6>n;n++)G[n]=20*n;if(G[0]="0",F=i.circlelabelarray||G,X=F.length,2>X)return alert("Too less circles"),void 0;for(J=[],j=A+Math.PI/a,I=U(j,0),k.fillcolor="none",k.highlightfillcolor="none",k.strokecolor=i.strokecolor||"black",k.strokewidth=i.circlestrokewidth||.5,k.layer=0,z=(v[0]-b[0])/(X-1),n=0;X>n;n++)J[n]=e.create("point",[b[0]+n*z,0],{name:F[n],size:0,fixed:!0,withLabel:!0,visible:!0}),J[n].addTransform(J[n],I),B[n]=e.create("circle",[S,J[n]],k)}return this.rendNode=M[0].rendNode,{circles:B,lines:R,points:u,midpoint:S,polygons:M}},updateRenderer:function(){return this},update:function(){return this.needsUpdate&&this.updateDataArray(),this},updateDataArray:function(){}}),JXG.createChart=function(e,t,i){if(1==t.length&&"string"==typeof t[0]){var n,r,o,a,s,l,c,u,d,h,p,f,g,m,b,v,y=document.getElementById(t[0]),x=[];if(JXG.exists(y)){if(v=JXG.copyAttributes(i,e.options,"chart"),y=(new JXG.DataSource).loadFromTable(t[0],v.withheaders,v.withheaders),n=y.data,s=y.columnHeaders,r=y.rowHeaders,d=v.width,h=v.name,p=v.strokecolor,f=v.fillcolor,g=v.highlightstrokecolor,m=v.highlightfillcolor,e.suspendUpdate(),b=n.length,u=[],v.rows&&JXG.isArray(v.rows)){for(o=0;b>o;o++)for(a=0;v.rows.length>a;a++)if(v.rows[a]==o||v.withheaders&&v.rows[a]==r[o]){u.push(n[o]);break}}else u=n;for(b=u.length,o=0;b>o;o++){if(c=[],v.chartstyle&&-1!=v.chartstyle.indexOf("bar")){for(l=d?d:.8,c.push(1-l/2+(o+.5)*l/(1*b)),a=1;u[o].length>a;a++)c.push(c[a-1]+1);v.width=l/(1*b)}h&&h.length==b?v.name=h[o]:v.withheaders&&(v.name=s[o]),v.strokecolor=p&&p.length==b?p[o]:JXG.hsv2rgb(360*((o+1)/(1*b)),.9,.6),v.fillcolor=f&&f.length==b?f[o]:JXG.hsv2rgb(360*((o+1)/(1*b)),.9,1),v.highlightstrokecolor=g&&g.length==b?g[o]:JXG.hsv2rgb(360*((o+1)/(1*b)),.9,1),v.highlightfillcolor=m&&m.length==b?m[o]:JXG.hsv2rgb(360*((o+1)/(1*b)),.9,.6),v.chartstyle&&-1!=v.chartstyle.indexOf("bar")?x.push(new JXG.Chart(e,[c,u[o]],v)):x.push(new JXG.Chart(e,[u[o]],v))}e.unsuspendUpdate()}return x}return v=JXG.copyAttributes(i,e.options,"chart"),new JXG.Chart(e,t,v)},JXG.JSXGraph.registerElement("chart",JXG.createChart),JXG.Legend=function(e,t,i){var n;switch(this.constructor(),n=JXG.copyAttributes(i,e.options,"legend"),this.board=e,this.coords=new JXG.Coords(JXG.COORDS_BY_USER,t,this.board),this.myAtts={},this.label_array=n.labelarray||n.labels,this.color_array=n.colorarray||n.colors,this.lines=[],this.myAtts.strokewidth=n.strokewidth||5,this.myAtts.straightfirst=!1,this.myAtts.straightlast=!1,this.myAtts.withlabel=!0,this.myAtts.fixed=!0,this.style=n.legendstyle||n.style,this.style){case"vertical":this.drawVerticalLegend(e,n);break;default:throw Error("JSXGraph: Unknown legend style: "+this.style)}},JXG.Legend.prototype=new JXG.GeometryElement,JXG.Legend.prototype.drawVerticalLegend=function(e,t){var i,n=t.linelength||1,r=(t.rowheight||20)/this.board.unitY;for(i=0;this.label_array.length>i;i++)this.myAtts.strokecolor=this.color_array[i],this.myAtts.highlightstrokecolor=this.color_array[i],this.myAtts.name=this.label_array[i],this.myAtts.label={offsets:[10,0]},this.lines[i]=e.create("line",[[this.coords.usrCoords[1],this.coords.usrCoords[2]-i*r],[this.coords.usrCoords[1]+n,this.coords.usrCoords[2]-i*r]],this.myAtts),this.lines[i].getLabelAnchor=function(){return this.setLabelRelativeCoords(this.visProp.label.offsets),new JXG.Coords(JXG.COORDS_BY_USER,[this.point2.X(),this.point2.Y()],this.board)}},JXG.createLegend=function(e,t,i){var n=[0,0];return JXG.exists(t)&&2==t.length&&(n=t),new JXG.Legend(e,n,i)},JXG.JSXGraph.registerElement("legend",JXG.createLegend),JXG.Transformation=function(e,t,i){this.elementClass=JXG.OBJECT_CLASS_OTHER,this.matrix=[[1,0,0],[0,1,0],[0,0,1]],this.board=e,this.isNumericMatrix=!1,this.setMatrix(e,t,i)},JXG.Transformation.prototype={},JXG.extend(JXG.Transformation.prototype,{update:function(){return this},setMatrix:function(e,t,i){var n;for(this.isNumericMatrix=!0,n=0;i.length>n;n++)if("number"!=typeof i[n]){this.isNumericMatrix=!1;break}"translate"==t?(this.evalParam=JXG.createEvalFunction(e,i,2),this.update=function(){this.matrix[1][0]=this.evalParam(0),this.matrix[2][0]=this.evalParam(1)}):"scale"==t?(this.evalParam=JXG.createEvalFunction(e,i,2),this.update=function(){this.matrix[1][1]=this.evalParam(0),this.matrix[2][2]=this.evalParam(1)}):"reflect"==t?(4>i.length&&(i[0]=JXG.getReference(e,i[0])),2==i.length&&(i[1]=JXG.getReference(e,i[1])),4==i.length&&(this.evalParam=JXG.createEvalFunction(e,i,4)),this.update=function(){var e,t,n,r,o;1==i.length?(e=i[0].point2.X()-i[0].point1.X(),t=i[0].point2.Y()-i[0].point1.Y(),n=i[0].point1.X(),r=i[0].point1.Y()):2==i.length?(e=i[1].X()-i[0].X(),t=i[1].Y()-i[0].Y(),n=i[0].X(),r=i[0].Y()):4==i.length&&(e=this.evalParam(2)-this.evalParam(0),t=this.evalParam(3)-this.evalParam(1),n=this.evalParam(0),r=this.evalParam(1)),o=e*e+t*t,this.matrix[1][1]=(e*e-t*t)/o,this.matrix[1][2]=2*e*t/o,this.matrix[2][1]=2*e*t/o,this.matrix[2][2]=(-e*e+t*t)/o,this.matrix[1][0]=n*(1-this.matrix[1][1])-r*this.matrix[1][2],this.matrix[2][0]=r*(1-this.matrix[2][2])-n*this.matrix[2][1]}):"rotate"==t?(3==i.length?this.evalParam=JXG.createEvalFunction(e,i,3):2>=i.length&&(this.evalParam=JXG.createEvalFunction(e,i,1),2==i.length&&(i[1]=JXG.getReference(e,i[1]))),this.update=function(){var e,t,n=this.evalParam(0),r=Math.cos(n),o=Math.sin(n);this.matrix[1][1]=r,this.matrix[1][2]=-o,this.matrix[2][1]=o,this.matrix[2][2]=r,i.length>1&&(3==i.length?(e=this.evalParam(1),t=this.evalParam(2)):(e=i[1].X(),t=i[1].Y()),this.matrix[1][0]=e*(1-r)+t*o,this.matrix[2][0]=t*(1-r)-e*o)}):"shear"==t?(this.evalParam=JXG.createEvalFunction(e,i,1),this.update=function(){var e=this.evalParam(0);this.matrix[1][1]=Math.tan(e)}):"generic"==t&&(this.evalParam=JXG.createEvalFunction(e,i,9),this.update=function(){this.matrix[0][0]=this.evalParam(0),this.matrix[0][1]=this.evalParam(1),this.matrix[0][2]=this.evalParam(2),this.matrix[1][0]=this.evalParam(3),this.matrix[1][1]=this.evalParam(4),this.matrix[1][2]=this.evalParam(5),this.matrix[2][0]=this.evalParam(6),this.matrix[2][1]=this.evalParam(7),this.matrix[2][2]=this.evalParam(8)})},apply:function(e){return this.update(),null!=arguments[1]?JXG.Math.matVecMult(this.matrix,e.initialCoords.usrCoords):JXG.Math.matVecMult(this.matrix,e.coords.usrCoords)},applyOnce:function(e){var t,i,n;if(JXG.isArray(e))for(i=e.length,n=0;i>n;n++)this.update(),t=JXG.Math.matVecMult(this.matrix,e[n].coords.usrCoords),e[n].coords.setCoordinates(JXG.COORDS_BY_USER,t);else this.update(),t=JXG.Math.matVecMult(this.matrix,e.coords.usrCoords),e.coords.setCoordinates(JXG.COORDS_BY_USER,t)},bindTo:function(e){var t,i;if(JXG.isArray(e))for(i=e.length,t=0;i>t;t++)e[t].transformations.push(this);else e.transformations.push(this)},setProperty:function(){},melt:function(e){var t,i,n,r,o,a,s=[];for(i=e.matrix.length,n=this.matrix[0].length,t=0;i>t;t++)s[t]=[];for(this.update(),e.update(),t=0;i>t;t++)for(a=0;n>a;a++){for(o=0,r=0;i>r;r++)o+=e.matrix[t][r]*this.matrix[r][a];s[t][a]=o}return this.update=function(){var e=this.matrix.length,i=this.matrix[0].length;for(t=0;e>t;t++)for(a=0;i>a;a++)this.matrix[t][a]=s[t][a]},this}}),JXG.createTransform=function(e,t,i){return new JXG.Transformation(e,i.type,t)},JXG.JSXGraph.registerElement("transform",JXG.createTransform),JXG.Turtle=function(e,t,i){this.constructor(e,i,JXG.OBJECT_TYPE_TURTLE,JXG.OBJECT_CLASS_OTHER);var n,r,o;return this.turtleIsHidden=!1,this.board=e,this.visProp.curveType="plot",this._attributes=JXG.copyAttributes(this.visProp,e.options,"turtle"),delete this._attributes.id,n=0,r=0,o=90,0!=t.length&&(3==t.length?(n=t[0],r=t[1],o=t[2]):2==t.length?JXG.isArray(t[0])?(n=t[0][0],r=t[0][1],o=t[1]):(n=t[0],r=t[1]):(n=t[0][0],r=t[0][1])),this.init(n,r,o),this},JXG.Turtle.prototype=new JXG.GeometryElement,JXG.extend(JXG.Turtle.prototype,{init:function(e,t,i){this.arrowLen=20/Math.sqrt(this.board.unitX*this.board.unitX+this.board.unitY*this.board.unitY),this.pos=[e,t],this.isPenDown=!0,this.dir=90,this.stack=[],this.objects=[],this.curve=this.board.create("curve",[[this.pos[0]],[this.pos[1]]],this._attributes),this.objects.push(this.curve),this.turtle=this.board.create("point",this.pos,{fixed:!0,name:" ",visible:!1,withLabel:!1}),this.objects.push(this.turtle),this.turtle2=this.board.create("point",[this.pos[0],this.pos[1]+this.arrowLen],{fixed:!0,name:" ",visible:!1,withLabel:!1}),this.objects.push(this.turtle2),this.visProp.arrow.lastArrow=!0,this.visProp.arrow.straightFirst=!1,this.visProp.arrow.straightLast=!1,this.arrow=this.board.create("line",[this.turtle,this.turtle2],this.visProp.arrow),this.objects.push(this.arrow),this.right(90-i),this.board.update()},forward:function(e){if(0===e)return this;var t=e*Math.cos(this.dir*Math.PI/180),i=e*Math.sin(this.dir*Math.PI/180);if(!this.turtleIsHidden){var n=this.board.create("transform",[t,i],{type:"translate"});n.applyOnce(this.turtle),n.applyOnce(this.turtle2)}return this.isPenDown&&this.curve.dataX.length>=8192&&(this.curve=this.board.create("curve",[[this.pos[0]],[this.pos[1]]],this._attributes),this.objects.push(this.curve)),this.pos[0]+=t,this.pos[1]+=i,this.isPenDown&&(this.curve.dataX.push(this.pos[0]),this.curve.dataY.push(this.pos[1])),this.board.update(),this},back:function(e){return this.forward(-e)},right:function(e){if(this.dir-=e,this.dir%=360,!this.turtleIsHidden){var t=this.board.create("transform",[-e*Math.PI/180,this.turtle],{type:"rotate"});t.applyOnce(this.turtle2)}return this.board.update(),this},left:function(e){return this.right(-e)},penUp:function(){return this.isPenDown=!1,this},penDown:function(){return this.isPenDown=!0,this.curve=this.board.create("curve",[[this.pos[0]],[this.pos[1]]],this._attributes),this.objects.push(this.curve),this},clean:function(){for(var e=0;this.objects.length>e;e++){var t=this.objects[e];t.type==JXG.OBJECT_TYPE_CURVE&&(this.board.removeObject(t.id),this.objects.splice(e,1))}return this.curve=this.board.create("curve",[[this.pos[0]],[this.pos[1]]],this._attributes),this.objects.push(this.curve),this.board.update(),this},clearScreen:function(){for(var e=0;this.objects.length>e;e++){var t=this.objects[e];this.board.removeObject(t.id)}return this.init(0,0,90),this},setPos:function(e,t){if(this.pos=JXG.isArray(e)?e:[e,t],!this.turtleIsHidden){this.turtle.setPositionDirectly(JXG.COORDS_BY_USER,e,t),this.turtle2.setPositionDirectly(JXG.COORDS_BY_USER,e,t+this.arrowLen);var i=this.board.create("transform",[-(this.dir-90)*Math.PI/180,this.turtle],{type:"rotate"});i.applyOnce(this.turtle2)}return this.curve=this.board.create("curve",[[this.pos[0]],[this.pos[1]]],this._attributes),this.objects.push(this.curve),this.board.update(),this},setPenSize:function(e){return this.curve=this.board.create("curve",[[this.pos[0]],[this.pos[1]]],this.copyAttr("strokeWidth",e)),this.objects.push(this.curve),this},setPenColor:function(e){return this.curve=this.board.create("curve",[[this.pos[0]],[this.pos[1]]],this.copyAttr("strokeColor",e)),this.objects.push(this.curve),this},setHighlightPenColor:function(e){return this.curve=this.board.create("curve",[[this.pos[0]],[this.pos[1]]],this.copyAttr("highlightStrokeColor",e)),this.objects.push(this.curve),this},setProperty:function(e){var t,i,n,r=this.objects.length;for(t=0;r>t;t++)i=this.objects[t],i.type==JXG.OBJECT_TYPE_CURVE&&i.setProperty(e);return n=this.visProp.id,this.visProp=JXG.deepCopy(this.curve.visProp),this.visProp.id=n,this._attributes=JXG.deepCopy(this.visProp),delete this._attributes.id,this},copyAttr:function(e,t){return this._attributes[e.toLowerCase()]=t,this._attributes},showTurtle:function(){return this.turtleIsHidden=!1,this.arrow.setProperty("visible:true"),this.setPos(this.pos[0],this.pos[1]),this.board.update(),this},hideTurtle:function(){return this.turtleIsHidden=!0,this.arrow.setProperty("visible:false"),this.setPos(this.pos[0],this.pos[1]),this.board.update(),this},home:function(){return this.pos=[0,0],this.setPos(this.pos[0],this.pos[1]),this},pushTurtle:function(){return this.stack.push([this.pos[0],this.pos[1],this.dir]),this},popTurtle:function(){var e=this.stack.pop();return this.pos[0]=e[0],this.pos[1]=e[1],this.dir=e[2],this.setPos(this.pos[0],this.pos[1]),this},lookTo:function(e){if(JXG.isArray(e)){var t,i=this.pos[0],n=this.pos[1],r=e[0],o=e[1];t=Math.atan2(o-n,r-i),this.right(this.dir-180*t/Math.PI)}else JXG.isNumber(e)&&this.right(this.dir-e);return this},moveTo:function(e){if(JXG.isArray(e)){var t=e[0]-this.pos[0],i=e[1]-this.pos[1];if(!this.turtleIsHidden){var n=this.board.create("transform",[t,i],{type:"translate"});n.applyOnce(this.turtle),n.applyOnce(this.turtle2)}this.isPenDown&&this.curve.dataX.length>=8192&&(this.curve=this.board.create("curve",[[this.pos[0]],[this.pos[1]]],this._attributes),this.objects.push(this.curve)),this.pos[0]=e[0],this.pos[1]=e[1],this.isPenDown&&(this.curve.dataX.push(this.pos[0]),this.curve.dataY.push(this.pos[1])),this.board.update()}return this},fd:function(e){return this.forward(e)},bk:function(e){return this.back(e)},lt:function(e){return this.left(e)},rt:function(e){return this.right(e)},pu:function(){return this.penUp()},pd:function(){return this.penDown()},ht:function(){return this.hideTurtle()},st:function(){return this.showTurtle()},cs:function(){return this.clearScreen()},push:function(){return this.pushTurtle()},pop:function(){return this.popTurtle()},evalAt:function(e,t){var i,n,r,o,a=this.objects.length;for(i=0,n=0;a>i;i++)if(r=this.objects[i],r.elementClass==JXG.OBJECT_CLASS_CURVE){if(e>=n&&n+r.numberPoints>e)return o=e-n,r[t](o);n+=r.numberPoints}return this[t]()},X:function(e){return e===void 0?this.pos[0]:this.evalAt(e,"X")},Y:function(e){return e===void 0?this.pos[1]:this.evalAt(e,"Y")},Z:function(){return 1},minX:function(){return 0},maxX:function(){var e,t,i=0,n=this.objects.length;for(e=0;n>e;e++)t=this.objects[e],t.elementClass==JXG.OBJECT_CLASS_CURVE&&(i+=this.objects[e].numberPoints);return i},hasPoint:function(e,t){var i,n;for(i=0;this.objects.length>i;i++)if(n=this.objects[i],n.type==JXG.OBJECT_TYPE_CURVE&&n.hasPoint(e,t))return!0;return!1}}),JXG.createTurtle=function(e,t,i){var n;return t=t||[],n=JXG.copyAttributes(i,e.options,"turtle"),new JXG.Turtle(e,t,n)},JXG.JSXGraph.registerElement("turtle",JXG.createTurtle),JXG.rgbParser=function(){if(0==arguments.length)return[0,0,0];arguments.length>=3&&(arguments[0]=[arguments[0],arguments[1],arguments[2]],arguments.length=1);var e=arguments[0];if(JXG.isArray(e)){var t,i=!1;for(t=0;3>t;t++)i|=/\./.test(""+arguments[0][t]);for(t=0;3>t;t++)i&=arguments[0][t]>=0&1>=arguments[0][t];return i?[Math.ceil(255*arguments[0][0]),Math.ceil(255*arguments[0][1]),Math.ceil(255*arguments[0][2])]:(arguments[0].length=3,arguments[0])}"string"==typeof arguments[0]&&(e=arguments[0]);var n,r,o;"#"==e.charAt(0)&&(e=e.substr(1,6)),e=e.replace(/ /g,""),e=e.toLowerCase();var a={aliceblue:"f0f8ff",antiquewhite:"faebd7",aqua:"00ffff",aquamarine:"7fffd4",azure:"f0ffff",beige:"f5f5dc",bisque:"ffe4c4",black:"000000",blanchedalmond:"ffebcd",blue:"0000ff",blueviolet:"8a2be2",brown:"a52a2a",burlywood:"deb887",cadetblue:"5f9ea0",chartreuse:"7fff00",chocolate:"d2691e",coral:"ff7f50",cornflowerblue:"6495ed",cornsilk:"fff8dc",crimson:"dc143c",cyan:"00ffff",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",feldspar:"d19275",firebrick:"b22222",floralwhite:"fffaf0",forestgreen:"228b22",fuchsia:"ff00ff",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",lightgrey:"d3d3d3",lightgreen:"90ee90",lightpink:"ffb6c1",lightsalmon:"ffa07a",lightseagreen:"20b2aa",lightskyblue:"87cefa",lightslateblue:"8470ff",lightslategray:"778899",lightsteelblue:"b0c4de",lightyellow:"ffffe0",lime:"00ff00",limegreen:"32cd32",linen:"faf0e6",magenta:"ff00ff",maroon:"800000",mediumaquamarine:"66cdaa",mediumblue:"0000cd",mediumorchid:"ba55d3",mediumpurple:"9370d8",mediumseagreen:"3cb371",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:"d87093",papayawhip:"ffefd5",peachpuff:"ffdab9",peru:"cd853f",pink:"ffc0cb",plum:"dda0dd",powderblue:"b0e0e6",purple:"800080",red:"ff0000",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",violetred:"d02090",wheat:"f5deb3",white:"ffffff",whitesmoke:"f5f5f5",yellow:"ffff00",yellowgreen:"9acd32"};
for(var s in a)e==s&&(e=a[s]);for(var l=[{re:/^rgb\((\d{1,3}),\s*(\d{1,3}),\s*(\d{1,3})\)$/,example:["rgb(123, 234, 45)","rgb(255,234,245)"],process:function(e){return[parseInt(e[1]),parseInt(e[2]),parseInt(e[3])]}},{re:/^(\w{2})(\w{2})(\w{2})$/,example:["#00ff00","336699"],process:function(e){return[parseInt(e[1],16),parseInt(e[2],16),parseInt(e[3],16)]}},{re:/^(\w{1})(\w{1})(\w{1})$/,example:["#fb0","f0f"],process:function(e){return[parseInt(e[1]+e[1],16),parseInt(e[2]+e[2],16),parseInt(e[3]+e[3],16)]}}],t=0;l.length>t;t++){var c,u=l[t].re,d=l[t].process,h=u.exec(e);h&&(c=d(h),n=c[0],r=c[1],o=c[2])}return n=0>n||isNaN(n)?0:n>255?255:n,r=0>r||isNaN(r)?0:r>255?255:r,o=0>o||isNaN(o)?0:o>255?255:o,[n,r,o]},JXG.rgb2css=function(){var e,t,i;return e=JXG.rgbParser.apply(JXG.rgbParser,arguments),t=e[1],i=e[2],e=e[0],"rgb("+e+", "+t+", "+i+")"},JXG.rgb2hex=function(){var e,t,i;return e=JXG.rgbParser.apply(JXG.rgbParser,arguments),t=e[1],i=e[2],e=e[0],e=e.toString(16),t=t.toString(16),i=i.toString(16),1==e.length&&(e="0"+e),1==t.length&&(t="0"+t),1==i.length&&(i="0"+i),"#"+e+t+i},JXG.hex2rgb=function(e){var t,i,n;return"#"==e.charAt(0)&&(e=e.slice(1)),t=parseInt(e.substr(0,2),16),i=parseInt(e.substr(2,2),16),n=parseInt(e.substr(4,2),16),"rgb("+t+", "+i+", "+n+")"},JXG.hsv2rgb=function(e,t,i){var n,r,o,a,s,l,c,u,d;if(e=(e%360+360)%360,0==t){if(!(isNaN(e)||JXG.Math.eps>e))return"#ffffff";n=i,r=i,o=i}else switch(l=e>=360?0:e,l/=60,s=Math.floor(l),a=l-s,c=i*(1-t),u=i*(1-t*a),d=i*(1-t*(1-a)),s){case 0:n=i,r=d,o=c;break;case 1:n=u,r=i,o=c;break;case 2:n=c,r=i,o=d;break;case 3:n=c,r=u,o=i;break;case 4:n=d,r=c,o=i;break;case 5:n=i,r=c,o=u}return n=Math.round(255*n).toString(16),n=2==n.length?n:1==n.length?"0"+n:"00",r=Math.round(255*r).toString(16),r=2==r.length?r:1==r.length?"0"+r:"00",o=Math.round(255*o).toString(16),o=2==o.length?o:1==o.length?"0"+o:"00",["#",n,r,o].join("")},JXG.rgb2hsv=function(){var e,t,i,n,r,o,a,s,l,c,u,d,h,p;return e=JXG.rgbParser.apply(JXG.rgbParser,arguments),t=e[1],i=e[2],e=e[0],p=JXG.Math.Statistics,n=e/255,r=t/255,o=i/255,d=p.max([e,t,i]),h=p.min([e,t,i]),a=d/255,s=h/255,u=a,c=0,u>0&&(c=(u-s)/(1*u)),l=1/(a-s),c>0&&(l=d==e?(r-o)*l:d==t?2+(o-n)*l:4+(n-r)*l),l*=60,0>l&&(l+=360),d==h&&(l=0),[l,c,u]},JXG.rgb2LMS=function(){var e,t,i,n,r,o,a,s=[[.05059983,.08585369,.0095242],[.01893033,.08925308,.01370054],[.00292202,.00975732,.07145979]];return e=JXG.rgbParser.apply(JXG.rgbParser,arguments),t=e[1],i=e[2],e=e[0],e=Math.pow(e,.476190476),t=Math.pow(t,.476190476),i=Math.pow(i,.476190476),n=e*s[0][0]+t*s[0][1]+i*s[0][2],r=e*s[1][0]+t*s[1][1]+i*s[1][2],o=e*s[2][0]+t*s[2][1]+i*s[2][2],a=[n,r,o],a.l=n,a.m=r,a.s=o,a},JXG.LMS2rgb=function(e,t,i){var n,r,o,a,s=[[30.830854,-29.832659,1.610474],[-6.481468,17.715578,-2.532642],[-.37569,-1.199062,14.273846]];n=e*s[0][0]+t*s[0][1]+i*s[0][2],r=e*s[1][0]+t*s[1][1]+i*s[1][2],o=e*s[2][0]+t*s[2][1]+i*s[2][2];var l=function(e){for(var t=127,i=64;i>0;){if(Math.pow(t,.476190476)>e)t-=i;else{if(Math.pow(t+1,.476190476)>e)return t;t+=i}i/=2}return 254==t&&e>13.994955247?255:t};return n=l(n),r=l(r),o=l(o),a=[n,r,o],a.r=n,a.g=r,a.b=o,a},JXG.rgba2rgbo=function(e){var t;return 9==e.length&&"#"==e.charAt(0)?(t=parseInt(e.substr(7,2).toUpperCase(),16)/255,e=e.substr(0,7)):t=1,[e,t]},JXG.rgbo2rgba=function(e,t){var i;return"none"==e?e:(i=Math.round(255*t).toString(16),1==i.length&&(i="0"+i),e+i)},JXG.rgb2bw=function(e){if("none"==e)return e;var t,i,n,r="0123456789ABCDEF";return n=JXG.rgbParser(e),t=.3*n[0]+.59*n[1]+.11*n[2],i=r.charAt(15&t>>4)+r.charAt(15&t),e="#"+i+i+i},JXG.rgb2cb=function(e,t){if("none"==e)return e;var i,n,r,o,a,s,l,c,u,d,h,p,f;switch(a=JXG.rgb2LMS(e),n=a.l,r=a.m,o=a.s,t=t.toLowerCase()){case"protanopia":l=-.06150039994295001,c=.08277001656812001,u=-.013200141220000003,d=.05858939668799999,h=-.07934519995360001,p=.013289415272000003,f=.6903216543277437,s=o/r,n=f>s?-(c*r+u*o)/l:-(h*r+p*o)/d;break;case"tritanopia":l=-.00058973116217,c=.007690316482,u=-.01011703519052,d=.025495080838999994,h=-.0422740347,p=.017005316784,f=.8349489908460004,s=r/n,o=f>s?-(l*n+c*r)/u:-(d*n+h*r)/p;break;default:l=-.06150039994295001,c=.08277001656812001,u=-.013200141220000003,d=.05858939668799999,h=-.07934519995360001,p=.013289415272000003,f=.5763833686400911,s=o/n,r=f>s?-(l*n+u*o)/c:-(d*n+p*o)/h}i=JXG.LMS2rgb(n,r,o);var g="0123456789ABCDEF";return s=g.charAt(15&i.r>>4)+g.charAt(15&i.r),e="#"+s,s=g.charAt(15&i.g>>4)+g.charAt(15&i.g),e+=s,s=g.charAt(15&i.b>>4)+g.charAt(15&i.b),e+=s},JXG.extend(JXG.Board.prototype,{angle:function(e,t,i){return JXG.Math.Geometry.angle(e,t,i)},rad:function(e,t,i){return JXG.Math.Geometry.rad(e,t,i)},distance:function(e,t){return JXG.Math.Geometry.distance(e,t)},pow:function(e,t){return JXG.Math.pow(e,t)},round:function(e,t){return e.toFixed(t)},cosh:function(e){return JXG.Math.cosh(e)},sinh:function(e){return JXG.Math.sinh(e)},sgn:function(e){return 0==e?0:e/Math.abs(e)},D:function(e,t){return JXG.Math.Numerics.D(e,t)},I:function(e,t){return JXG.Math.Numerics.I(e,t)},root:function(e,t,i){return JXG.Math.Numerics.root(e,t,i)},lagrangePolynomial:function(e){return JXG.Math.Numerics.lagrangePolynomial(e)},neville:function(e){return JXG.Math.Numerics.Neville(e)},riemannsum:function(e,t,i,n,r){return JXG.Math.Numerics.riemannsum(e,t,i,n,r)},abs:Math.abs,acos:Math.acos,asin:Math.asin,atan:Math.atan,ceil:Math.ceil,cos:Math.cos,exp:Math.exp,floor:Math.floor,log:Math.log,max:Math.max,min:Math.min,random:Math.random,sin:Math.sin,sqrt:Math.sqrt,tan:Math.tan,trunc:Math.ceil,factorial:function(e){return JXG.Math.factorial(e)},binomial:function(e,t){return JXG.Math.binomial(e,t)},getElement:function(e){return JXG.getReference(this,e)},intersectionOptions:["point",[[JXG.OBJECT_CLASS_LINE,JXG.OBJECT_CLASS_LINE],[JXG.OBJECT_CLASS_LINE,JXG.OBJECT_CLASS_CIRCLE],[JXG.OBJECT_CLASS_CIRCLE,JXG.OBJECT_CLASS_CIRCLE]]],intersection:function(e,t,i,n){return e=JXG.getReference(this,e),t=JXG.getReference(this,t),e.elementClass==JXG.OBJECT_CLASS_CURVE&&t.elementClass==JXG.OBJECT_CLASS_CURVE?function(){return JXG.Math.Geometry.meetCurveCurve(e,t,i,n,e.board)}:e.type==JXG.OBJECT_TYPE_ARC&&t.elementClass==JXG.OBJECT_CLASS_LINE||t.type==JXG.OBJECT_TYPE_ARC&&e.elementClass==JXG.OBJECT_CLASS_LINE?function(){return JXG.Math.Geometry.meet(e.stdform,t.stdform,i,e.board)}:e.elementClass==JXG.OBJECT_CLASS_CURVE&&t.elementClass==JXG.OBJECT_CLASS_LINE||t.elementClass==JXG.OBJECT_CLASS_CURVE&&e.elementClass==JXG.OBJECT_CLASS_LINE?function(){return JXG.Math.Geometry.meetCurveLine(e,t,i,e.board)}:function(){return JXG.Math.Geometry.meet(e.stdform,t.stdform,i,e.board)}},intersectionFunc:function(e,t,i,n){return this.intersection(e,t,i,n)},otherIntersection:function(e,t,i){return e=JXG.getReference(this,e),t=JXG.getReference(this,t),function(){var n=JXG.Math.Geometry.meet(e.stdform,t.stdform,0,e.board);return Math.abs(i.X()-n.usrCoords[1])>JXG.Math.eps||Math.abs(i.Y()-n.usrCoords[2])>JXG.Math.eps||Math.abs(i.Z()-n.usrCoords[0])>JXG.Math.eps?n:JXG.Math.Geometry.meet(e.stdform,t.stdform,1,e.board)}},pointFunc:function(){return[null]},pointOptions:["point",[[JXG.OBJECT_CLASS_POINT]]],lineFunc:function(){return arguments},lineOptions:["line",[[JXG.OBJECT_CLASS_POINT,JXG.OBJECT_CLASS_POINT]]],linesegmentFunc:function(){return arguments},linesegmentOptions:["line",[[JXG.OBJECT_CLASS_POINT,JXG.OBJECT_CLASS_POINT]]],linesegmentAtts:{straightFirst:!1,straightLast:!1},arrowFunc:function(){return arguments},arrowOptions:["arrow",[[JXG.OBJECT_CLASS_POINT,JXG.OBJECT_CLASS_POINT]]],circleFunc:function(){return arguments},circleOptions:["circle",[[JXG.OBJECT_CLASS_POINT,JXG.OBJECT_CLASS_POINT],[JXG.OBJECT_CLASS_POINT,JXG.OBJECT_CLASS_LINE],[JXG.OBJECT_CLASS_POINT,JXG.OBJECT_CLASS_CIRCLE]]],arrowparallelOptions:["arrowparallel",[[JXG.OBJECT_CLASS_POINT,JXG.OBJECT_CLASS_LINE]]],arrowparallelFunc:function(){return arguments},bisectorOptions:["bisector",[[JXG.OBJECT_CLASS_POINT,JXG.OBJECT_CLASS_POINT,JXG.OBJECT_CLASS_POINT]]],bisectorFunc:function(){return arguments},circumcircleOptions:["circumcircle",[[JXG.OBJECT_CLASS_POINT,JXG.OBJECT_CLASS_POINT,JXG.OBJECT_CLASS_POINT]]],circumcircleFunc:function(){return arguments},circumcirclemidpointOptions:["circumcirclemidpoint",[[JXG.OBJECT_CLASS_POINT,JXG.OBJECT_CLASS_POINT,JXG.OBJECT_CLASS_POINT]]],circumcirclemidpointFunc:function(){return arguments},integralOptions:["integral",[[]]],integralFunc:function(){return arguments},midpointOptions:["midpoint",[[JXG.OBJECT_CLASS_POINT,JXG.OBJECT_CLASS_POINT],[JXG.OBJECT_CLASS_LINE]]],midpointFunc:function(){return arguments},mirrorpointOptions:["mirrorpoint",[[JXG.OBJECT_CLASS_POINT,JXG.OBJECT_CLASS_POINT]]],mirrorpointFunc:function(){return arguments},normalOptions:["normal",[[JXG.OBJECT_CLASS_POINT,JXG.OBJECT_CLASS_LINE]]],normalFunc:function(){return arguments},parallelOptions:["parallel",[[JXG.OBJECT_CLASS_POINT,JXG.OBJECT_CLASS_LINE]]],parallelFunc:function(){return arguments},parallelpointOptions:["parallelpoint",[[JXG.OBJECT_CLASS_POINT,JXG.OBJECT_CLASS_POINT,JXG.OBJECT_CLASS_POINT]]],parallelpointFunc:function(){return arguments},perpendicularOptions:["perpendicular",[[JXG.OBJECT_CLASS_POINT,JXG.OBJECT_CLASS_LINE]]],perpendicularFunc:function(){return arguments},perpendicularpointOptions:["perpendicularpoint",[[JXG.OBJECT_CLASS_POINT,JXG.OBJECT_CLASS_LINE]]],perpendicularpointFunc:function(){return arguments},reflectionOptions:["reflection",[[JXG.OBJECT_CLASS_POINT,JXG.OBJECT_CLASS_LINE]]],reflectionFunc:function(){return arguments}}),JXG.Point.prototype.setPositionX=function(e,t){var i=e==JXG.COORDS_BY_USER?this.coords.usrCoords[2]:this.coords.scrCoords[2];this.setPosition(e,t,i)},JXG.Point.prototype.setPositionY=function(e,t){var i=e==JXG.COORDS_BY_USER?this.coords.usrCoords[1]:this.coords.scrCoords[1];this.setPosition(e,i,t)},JXG.Ticks=function(e,t,i){if(this.constructor(e.board,i,JXG.OBJECT_TYPE_TICKS,JXG.OBJECT_CLASS_OTHER),this.line=e,this.board=this.line.board,this.ticksFunction=null,this.fixedTicks=null,this.equidistant=!1,JXG.isFunction(t))throw this.ticksFunction=t,Error("Function arguments are no longer supported.");JXG.isArray(t)?this.fixedTicks=t:(Math.abs(t)this.visProp.minorheight?"infinite":"finite",this.majStyle=0>this.visProp.majorheight?"infinite":"finite",u=this.line.visProp.straightfirst?Number.NEGATIVE_INFINITY:0+A,d=this.line.visProp.straightlast?Number.POSITIVE_INFINITY:v-A,h=this.line.stdform[1],p=this.line.stdform[2],f=h,g=p,a=Math.sqrt(h*h+p*p),h*=O/a,p*=O/a,f*=P/a,g*=P/a,this.removeTickLabels(),this.ticks=[],this.labels=[],this.equidistant){this.visProp.insertticks&&this.minTicksDistance>JXG.Math.eps&&(w=this._adjustTickDistance(w,C,k,m.coords,y,x),this.ticksDelta=w),this.visProp.insertticks||(w/=this.visProp.minorticks+1),s=this.board.getBoundingBox(),_=.5*(s[0]+s[2]),T=.5*(s[1]+s[3]),l=[_*this.line.stdform[2]-T*this.line.stdform[1],-this.line.stdform[2],this.line.stdform[1]],o=JXG.Math.crossProduct(this.line.stdform,l),o[1]/=o[0],o[2]/=o[0],o[0]=1,e=new JXG.Coords(JXG.COORDS_BY_USER,o.slice(1),this.board),a=m.coords.distance(JXG.COORDS_BY_USER,e),(0>(b.X()-m.X())*(o[1]-m.X())||0>(b.Y()-m.Y())*(o[2]-m.Y()))&&(a*=-1),n=Math.round(a/w)*w,Math.abs(n)>JXG.Math.eps&&(S=Math.abs(n)/n),o[1]=m.coords.usrCoords[1]+y*n,o[2]=m.coords.usrCoords[2]+x*n,t=n,n=0,_=o[1],T=o[2],i=0;do e=new JXG.Coords(JXG.COORDS_BY_USER,[_,T],this.board),e.major=0===Math.round((S*n+t)/w)%(this.visProp.minorticks+1)?!0:!1,r=this._tickEndings(e,h,p,f,g,e.major),2==r.length?(c=S*n+t,(A>=Math.abs(c)&&this.visProp.drawzero||c>u&&d>c)&&(this.ticks.push(r),e.major?this.labels.push(this._makeLabel(c,e,this.board,this.visProp.drawlabels,this.id,i)):this.labels.push(null),i++),2==E&&(S*=-1),(1==S||1==E)&&(n+=w)):(S*=-1,E--),_=o[1]+S*y*n,T=o[2]+S*x*n;while(E>0)}else for(i=0;this.fixedTicks.length>i;i++)_=m.coords.usrCoords[1]+this.fixedTicks[i]*y,T=m.coords.usrCoords[2]+this.fixedTicks[i]*x,e=new JXG.Coords(JXG.COORDS_BY_USER,[_,T],this.board),r=this._tickEndings(e,h,p,f,g,!0),2==r.length&&this.fixedTicks[i]>=u&&d>this.fixedTicks[i]&&this.ticks.push(r),this.labels.push(this._makeLabel(this.fixedTicks[i],e,this.board,this.visProp.drawlabels,this.id,i))},_adjustTickDistance:function(e,t,i,n,r,o){for(var a,s;t>4*this.minTicksDistance;)e/=10,a=n.usrCoords[1]+r*e,s=n.usrCoords[2]+o*e,t=n.distance(JXG.COORDS_BY_SCREEN,new JXG.Coords(JXG.COORDS_BY_USER,[a,s],this.board));for(;this.minTicksDistance>t;)e*=i,i=5==i?2:5,a=n.usrCoords[1]+r*e,s=n.usrCoords[2]+o*e,t=n.distance(JXG.COORDS_BY_SCREEN,new JXG.Coords(JXG.COORDS_BY_USER,[a,s],this.board));return e},_tickEndings:function(e,t,i,n,r,o){var a,s,l,c,u,d,h,p,f=this.board.canvasWidth,g=this.board.canvasHeight,m=[-1e3*f,-1e3*g],b=[-1e3*f,-1e3*g],v=0,y=!1;return a=e.scrCoords,o?(s=t,l=i,p=this.majStyle):(s=n,l=r,p=this.minStyle),c=s*this.board.unitX,u=l*this.board.unitY,Math.abs(s)=0&&f>=h[1]&&(m[v]=h[1],b[v]=0,v++),h=JXG.Math.crossProduct([0,1,0],[-u*a[1]-c*a[2],u,c]),h[2]/=h[0],h[2]>=0&&g>=h[2]&&(m[v]=0,b[v]=h[2],v++),2>v&&(h=JXG.Math.crossProduct([g*g,0,-g],[-u*a[1]-c*a[2],u,c]),h[1]/=h[0],h[1]>=0&&f>=h[1]&&(m[v]=h[1],b[v]=g,v++)),2>v&&(h=JXG.Math.crossProduct([f*f,-f,0],[-u*a[1]-c*a[2],u,c]),h[2]/=h[0],h[2]>=0&&g>=h[2]&&(m[v]=f,b[v]=h[2]))),y=m[0]>=0&&f>=m[0]&&b[0]>=0&&g>=b[0]||m[1]>=0&&f>=m[1]&&b[1]>=0&&g>=b[1]?!0:!1,"finite"==p&&(d=Math.sqrt(this.board.unitX*this.board.unitX+this.board.unitY*this.board.unitY),m[0]=a[1]+s*this.board.unitX/d,b[0]=a[2]-l*this.board.unitY/d,m[1]=a[1]-s*this.board.unitX/d,b[1]=a[2]+l*this.board.unitY/d),y?[m,b]:[]},_makeLabel:function(e,t,i,n,r,o){var a,s;return n?(a=""+e,Math.abs(e)5||-1!=a.indexOf("e"))&&(a=""+e.toPrecision(3)),a.indexOf(".")>-1&&(a=a.replace(/0+$/,""),a=a.replace(/\.$/,"")),s=JXG.createText(i,[t.usrCoords[1],t.usrCoords[2],a],{id:r+o+"Label",isLabel:!0,layer:i.options.layer.line,highlightStrokeColor:i.options.text.strokeColor,highlightStrokeWidth:i.options.text.strokeWidth,highlightStrokeOpacity:i.options.text.strokeOpacity}),s.isDraggable=!1,s.dump=!1,s.distanceX=4,s.distanceY=-parseInt(s.visProp.fontsize)+3,s.setCoords(t.usrCoords[1]+s.distanceX/i.unitX,t.usrCoords[2]+s.distanceY/i.unitY),s.visProp.visible=n,s.prepareUpdate().update().updateRenderer(),s):null},removeTickLabels:function(){var e;if(null!=this.ticks&&(this.board.needsFullUpdate||this.needsRegularUpdate)&&("canvas"!=this.board.options.renderer||"internal"!=this.board.options.text.display))for(e=0;this.ticks.length>e;e++)null!=this.labels[e]&&this.labels[e].visProp.visible&&this.board.removeObject(this.labels[e])},update:function(){return this.needsUpdate&&this.calculateTicksCoordinates(),this},updateRenderer:function(){return this.needsUpdate&&(this.ticks&&this.board.renderer.updateTicks(this,this.dxMaj,this.dyMaj,this.dxMin,this.dyMin,this.minStyle,this.majStyle),this.needsUpdate=!1),this},hideElement:function(){var e;for(this.visProp.visible=!1,this.board.renderer.hide(this),e=0;this.labels.length>e;e++)JXG.exists(this.labels[e])&&this.labels[e].hideElement();return this},showElement:function(){var e;for(this.visProp.visible=!0,this.board.renderer.show(this),e=0;this.labels.length>e;e++)JXG.exists(this.labels[e])&&this.labels[e].showElement();return this}}),JXG.createTicks=function(e,t,i){var n,r,o=JXG.copyAttributes(i,e.options,"ticks");if(r=2>t.length?i.ticksDistance:t[1],t[0].elementClass!=JXG.OBJECT_CLASS_LINE||!(JXG.isFunction(t[1])||JXG.isArray(t[1])||JXG.isNumber(t[1])))throw Error("JSXGraph: Can't create Ticks with parent types '"+typeof t[0]+"' and '"+typeof t[1]+"'.");return n=new JXG.Ticks(t[0],r,o)},JXG.JSXGraph.registerElement("ticks",JXG.createTicks),JXG.Util={},JXG.Util.Unzip=function(e){function t(){return M+=8,I.length>L?I[L++]:-1}function i(){D=1}function n(){var e;return M++,e=1&D,D>>=1,0==D&&(D=t(),e=1&D,D=128|D>>1),e}function r(e){for(var t=0,i=e;i--;)t=t<<1|n();return e&&(t=E[t]>>8-e),t}function o(){_=0}function a(e){b++,k[_++]=e,y.push(String.fromCharCode(e)),32768==_&&(_=0)}function s(){this.b0=0,this.b1=0,this.jump=null,this.jumppos=-1}function l(){for(;;){if(H[z]>=U)return-1;if($[H[z]]==z)return H[z]++;H[z]++}}function c(){var e,t=j[J];if(x&&document.write("
len:"+z+" treepos:"+J),17==z)return-1;if(J++,z++,e=l(),x&&document.write("
IsPat "+e),e>=0)t.b0=e,x&&document.write("
b0 "+t.b0);else if(t.b0=32768,x&&document.write("
b0 "+t.b0),c())return-1;if(e=l(),e>=0)t.b1=e,x&&document.write("
b1 "+t.b1),t.jump=null;else if(t.b1=32768,x&&document.write("
b1 "+t.b1),t.jump=j[J],t.jumppos=J,c())return-1;return z--,0}function u(e,t,i,n){var r;for(x&&document.write("currentTree "+e+" numval "+t+" lengths "+i+" show "+n),j=e,J=0,$=i,U=t,r=0;17>r;r++)H[r]=0;if(z=0,c())return x&&alert("invalid huffman tree\n"),-1;if(x){document.write("
Tree: "+j.length);for(var o=0;32>o;o++)document.write("Places["+o+"].b0="+j[o].b0+"
"),document.write("Places["+o+"].b1="+j[o].b1+"
")}return 0}function d(e){for(var t,i,r,o=0,a=e[o];;)if(r=n(),x&&document.write("b="+r),r){if(!(32768&a.b1))return x&&document.write("ret1"),a.b1;for(a=a.jump,t=e.length,i=0;t>i;i++)if(e[i]===a){o=i;break}}else{if(!(32768&a.b0))return x&&document.write("ret2"),a.b0;o++,a=e[o]}return x&&document.write("ret3"),-1}function h(){var e,l,c,h,p;do{switch(e=n(),c=r(2)){case 0:x&&alert("Stored\n");break;case 1:x&&alert("Fixed Huffman codes\n");break;case 2:x&&alert("Dynamic Huffman codes\n");break;case 3:x&&alert("Reserved block type!!\n");break;default:x&&alert("Unexpected value %d!\n",c)}if(0==c){var f,g;for(i(),f=t(),f|=t()<<8,g=t(),g|=t()<<8,65535&(f^~g)&&document.write("BlockLen checksum mismatch\n");f--;)l=t(),a(l)}else if(1==c)for(var m;;)if(m=E[r(7)]>>1,m>23?(m=m<<1|n(),m>199?(m-=128,m=m<<1|n()):(m-=48,m>143&&(m+=136))):m+=256,256>m)a(m);else{if(256==m)break;var p,b;for(m-=257,p=r(A[m])+S[m],m=E[r(5)]>>3,P[m]>8?(b=r(8),b|=r(P[m]-8)<<8):b=r(P[m]),b+=O[m],m=0;p>m;m++){var l=k[32767&_-b];a(l)}}else if(2==c){var m,v,y,C,w,T=Array(320);for(y=257+r(5),C=1+r(5),w=4+r(4),m=0;19>m;m++)T[m]=0;for(m=0;w>m;m++)T[R[m]]=r(3);for(p=X.length,h=0;p>h;h++)X[h]=new s;if(u(X,19,T,0))return o(),1;if(x){document.write("
distanceTree");for(var I=0;X.length>I;I++)document.write("
"+X[I].b0+" "+X[I].b1+" "+X[I].jump+" "+X[I].jumppos)}v=y+C,h=0;var L=-1;for(x&&document.write("
n="+v+" bits: "+M+"
");v>h;)if(L++,m=d(X),x&&document.write("
"+L+" i:"+h+" decode: "+m+" bits "+M+"
"),16>m)T[h++]=m;else if(16==m){var D;if(m=3+r(2),h+m>v)return o(),1;for(D=h?T[h-1]:0;m--;)T[h++]=D}else{if(m=17==m?3+r(3):11+r(7),h+m>v)return o(),1;for(;m--;)T[h++]=0}for(p=F.length,h=0;p>h;h++)F[h]=new s;if(u(F,y,T,0))return o(),1;for(p=F.length,h=0;p>h;h++)X[h]=new s;var N=[];for(h=y;T.length>h;h++)N[h-y]=T[h];if(u(X,C,N,0))return o(),1;for(x&&document.write("
literalTree");;)if(m=d(F),m>=256){var p,b;if(m-=256,0==m)break;for(m--,p=r(A[m])+S[m],m=d(X),P[m]>8?(b=r(8),b|=r(P[m]-8)<<8):b=r(P[m]),b+=O[m];p--;){var l=k[32767&_-b];a(l)}}else a(m)}}while(!e);return o(),i(),0}function p(){x&&alert("NEXTFILE"),y=[];var e=[];if(T=!1,e[0]=t(),e[1]=t(),x&&alert("type: "+e[0]+" "+e[1]),e[0]==parseInt("78",16)&&e[1]==parseInt("da",16)&&(x&&alert("GEONExT-GZIP"),h(),x&&alert(y.join("")),w[C]=Array(2),w[C][0]=y.join(""),w[C][1]="geonext.gxt",C++),e[0]==parseInt("1f",16)&&e[1]==parseInt("8b",16)&&(x&&alert("GZIP"),f(),x&&alert(y.join("")),w[C]=Array(2),w[C][0]=y.join(""),w[C][1]="file",C++),e[0]==parseInt("50",16)&&e[1]==parseInt("4b",16)&&(T=!0,e[2]=t(),e[3]=t(),e[2]==parseInt("3",16)&&e[3]==parseInt("4",16))){e[0]=t(),e[1]=t(),x&&alert("ZIP-Version: "+e[1]+" "+e[0]/10+"."+e[0]%10),g=t(),g|=t()<<8,x&&alert("gpflags: "+g);var i=t();i|=t()<<8,x&&alert("method: "+i),t(),t(),t(),t();var n=t();n|=t()<<8,n|=t()<<16,n|=t()<<24;var r=t();r|=t()<<8,r|=t()<<16,r|=t()<<24;var o=t();o|=t()<<8,o|=t()<<16,o|=t()<<24,x&&alert("local CRC: "+n+"\nlocal Size: "+o+"\nlocal CompSize: "+r);var a=t();a|=t()<<8;var s=t();for(s|=t()<<8,x&&alert("filelen "+a),c=0,B=[];a--;){var l=t();"/"==l|":"==l?c=0:N-1>c&&(B[c++]=String.fromCharCode(l))}x&&alert("nameBuf: "+B),v||(v=B);for(var c=0;s>c;)l=t(),c++;m=4294967295,b=0,(o=0)&&x&&alert("skipdir"),8==i&&(h(),x&&alert(y.join("")),w[C]=Array(2),w[C][0]=y.join(""),w[C][1]=B.join(""),C++),f()}}function f(){var e,i,n,r,o,a,s=[];if(8&g&&(s[0]=t(),s[1]=t(),s[2]=t(),s[3]=t(),s[0]==parseInt("50",16)&&s[1]==parseInt("4b",16)&&s[2]==parseInt("07",16)&&s[3]==parseInt("08",16)?(e=t(),e|=t()<<8,e|=t()<<16,e|=t()<<24):e=s[0]|s[1]<<8|s[2]<<16|s[3]<<24,i=t(),i|=t()<<8,i|=t()<<16,i|=t()<<24,n=t(),n|=t()<<8,n|=t()<<16,n|=t()<<24,x&&alert("CRC:")),T&&p(),s[0]=t(),8!=s[0])return x&&alert("Unknown compression method!"),0;if(g=t(),x&&g&~parseInt("1f",16)&&alert("Unknown flags set!"),t(),t(),t(),t(),t(),r=t(),4&g)for(s[0]=t(),s[2]=t(),z=s[0]+256*s[1],x&&alert("Extra field size: "+z),o=0;z>o;o++)t();if(8&g){for(o=0,B=[];a=t();)("7"==a||":"==a)&&(o=0),N-1>o&&(B[o++]=a);x&&alert("original file name: "+B)}if(16&g)for(;a=t(););2&g&&(t(),t()),h(),e=t(),e|=t()<<8,e|=t()<<16,e|=t()<<24,n=t(),n|=t()<<8,n|=t()<<16,n|=t()<<24,T&&p()}var g,m,b,v,y=[],x=!1,C=0,w=[],k=Array(32768),_=0,T=!1,E=[0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240,8,136,72,200,40,168,104,232,24,152,88,216,56,184,120,248,4,132,68,196,36,164,100,228,20,148,84,212,52,180,116,244,12,140,76,204,44,172,108,236,28,156,92,220,60,188,124,252,2,130,66,194,34,162,98,226,18,146,82,210,50,178,114,242,10,138,74,202,42,170,106,234,26,154,90,218,58,186,122,250,6,134,70,198,38,166,102,230,22,150,86,214,54,182,118,246,14,142,78,206,46,174,110,238,30,158,94,222,62,190,126,254,1,129,65,193,33,161,97,225,17,145,81,209,49,177,113,241,9,137,73,201,41,169,105,233,25,153,89,217,57,185,121,249,5,133,69,197,37,165,101,229,21,149,85,213,53,181,117,245,13,141,77,205,45,173,109,237,29,157,93,221,61,189,125,253,3,131,67,195,35,163,99,227,19,147,83,211,51,179,115,243,11,139,75,203,43,171,107,235,27,155,91,219,59,187,123,251,7,135,71,199,39,167,103,231,23,151,87,215,55,183,119,247,15,143,79,207,47,175,111,239,31,159,95,223,63,191,127,255],S=[3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,43,51,59,67,83,99,115,131,163,195,227,258,0,0],A=[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,99,99],O=[1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577],P=[0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13],R=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],I=e,L=0,D=1,M=0,N=256,B=[],G=288,F=Array(G),X=Array(32),J=0,j=null;Array(64),Array(64);var z=0,H=Array(17);H[0]=0;var $,U;JXG.Util.Unzip.prototype.unzipFile=function(e){var t;for(this.unzip(),t=0;w.length>t;t++)if(w[t][1]==e)return w[t][0]},JXG.Util.Unzip.prototype.unzip=function(){return x&&alert(I),p(),w}},JXG.Util.Base64={_keyStr:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",encode:function(e){var t,i,n,r,o,a,s,l=[],c=0;for(e=JXG.Util.Base64._utf8_encode(e);e.length>c;)t=e.charCodeAt(c++),i=e.charCodeAt(c++),n=e.charCodeAt(c++),r=t>>2,o=(3&t)<<4|i>>4,a=(15&i)<<2|n>>6,s=63&n,isNaN(i)?a=s=64:isNaN(n)&&(s=64),l.push([this._keyStr.charAt(r),this._keyStr.charAt(o),this._keyStr.charAt(a),this._keyStr.charAt(s)].join(""));return l.join("")},decode:function(e,t){var i,n,r,o,a,s,l,c=[],u=0;for(e=e.replace(/[^A-Za-z0-9\+\/\=]/g,"");e.length>u;)o=this._keyStr.indexOf(e.charAt(u++)),a=this._keyStr.indexOf(e.charAt(u++)),s=this._keyStr.indexOf(e.charAt(u++)),l=this._keyStr.indexOf(e.charAt(u++)),i=o<<2|a>>4,n=(15&a)<<4|s>>2,r=(3&s)<<6|l,c.push(String.fromCharCode(i)),64!=s&&c.push(String.fromCharCode(n)),64!=l&&c.push(String.fromCharCode(r));return c=c.join(""),t&&(c=JXG.Util.Base64._utf8_decode(c)),c},_utf8_encode:function(e){e=e.replace(/\r\n/g,"\n");for(var t="",i=0;e.length>i;i++){var n=e.charCodeAt(i);128>n?t+=String.fromCharCode(n):n>127&&2048>n?(t+=String.fromCharCode(192|n>>6),t+=String.fromCharCode(128|63&n)):(t+=String.fromCharCode(224|n>>12),t+=String.fromCharCode(128|63&n>>6),t+=String.fromCharCode(128|63&n))}return t},_utf8_decode:function(e){for(var t=[],i=0,n=0,r=0,o=0;e.length>i;)n=e.charCodeAt(i),128>n?(t.push(String.fromCharCode(n)),i++):n>191&&224>n?(r=e.charCodeAt(i+1),t.push(String.fromCharCode((31&n)<<6|63&r)),i+=2):(r=e.charCodeAt(i+1),o=e.charCodeAt(i+2),t.push(String.fromCharCode((15&n)<<12|(63&r)<<6|63&o)),i+=3);return t.join("")},_destrip:function(e,t){var i,n,r=[],o=[];for(null==t&&(t=76),e.replace(/ /g,""),i=e.length/t,n=0;i>n;n++)r[n]=e.substr(n*t,t);for(i!=e.length/t&&(r[r.length]=e.substr(i*t,e.length-i*t)),n=0;r.length>n;n++)o.push(r[n]);return o.join("\n")},decodeAsArray:function(e){var t,i=this.decode(e),n=[];for(t=0;i.length>t;t++)n[t]=i.charCodeAt(t);return n},decodeGEONExT:function(e){return decodeAsArray(destrip(e),!1)}},JXG.Util.asciiCharCodeAt=function(e,t){var i=e.charCodeAt(t);if(i>255)switch(i){case 8364:i=128;break;case 8218:i=130;break;case 402:i=131;break;case 8222:i=132;break;case 8230:i=133;break;case 8224:i=134;break;case 8225:i=135;break;case 710:i=136;break;case 8240:i=137;break;case 352:i=138;break;case 8249:i=139;break;case 338:i=140;break;case 381:i=142;break;case 8216:i=145;break;case 8217:i=146;break;case 8220:i=147;break;case 8221:i=148;break;case 8226:i=149;break;case 8211:i=150;break;case 8212:i=151;break;case 732:i=152;break;case 8482:i=153;break;case 353:i=154;break;case 8250:i=155;break;case 339:i=156;break;case 382:i=158;break;case 376:i=159;break;default:}return i},JXG.Util.utf8Decode=function(e){var t,i=[],n=0,r=0,o=0;if(!JXG.exists(e))return"";for(;e.length>n;)r=e.charCodeAt(n),128>r?(i.push(String.fromCharCode(r)),n++):r>191&&224>r?(o=e.charCodeAt(n+1),i.push(String.fromCharCode((31&r)<<6|63&o)),n+=2):(o=e.charCodeAt(n+1),t=e.charCodeAt(n+2),i.push(String.fromCharCode((15&r)<<12|(63&o)<<6|63&t)),n+=3);return i.join("")},JXG.Util.genUUID=function(){for(var e,t="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".split(""),i=Array(36),n=0,r=0;36>r;r++)8==r||13==r||18==r||23==r?i[r]="-":14==r?i[r]="4":(2>=n&&(n=0|33554432+16777216*Math.random()),e=15&n,n>>=4,i[r]=t[19==r?8|3&e:e]);return i.join("")},JXG.PsTricks={convert:function(e){var t,i,n=new JXG.Coords(JXG.COORDS_BY_SCREEN,[0,0],e),r=new JXG.Coords(JXG.COORDS_BY_SCREEN,[e.canvasWidth,e.canvasHeight],e),o=[];o.push("\\begin{pspicture*}("+n.usrCoords[1]+","+r.usrCoords[2]+")("+r.usrCoords[1]+","+n.usrCoords[2]+")\n");for(t in e.objects)if(i=e.objects[t],i.visProp.visible)switch(i.elementClass){case JXG.OBJECT_CLASS_CIRCLE:o.push(this.addCircle(i));break;case JXG.OBJECT_CLASS_LINE:o.push(this.addLine(i));break;case JXG.OBJECT_CLASS_POINT:o.push(this.addPoint(i));break;default:switch(i.type){case JXG.OBJECT_TYPE_ARC:o.push(this.addArc(i));break;case JXG.OBJECT_TYPE_SECTOR:o.push(this.addArc(i)),o.push(this.addSector(i));break;case JXG.OBJECT_TYPE_POLYGON:o.push(this.addPolygon(i));break;case JXG.OBJECT_TYPE_ANGLE:o.push(this.addAngle(i))}}return o.push("\\end{pspicture*}"),o.join("\n")},setArrows:function(e){var t="";return e.visProp.firstarrow&&e.visProp.lastarrow?t="{<->}":e.visProp.firstarrow?t="{<-}":e.visProp.lastarrow&&(t="{->}"),t},drawWedge:function(e,t,i,n,r,o){var a="";return"none"!=e&&t>0&&(a+="\\pswedge[linestyle=none, fillstyle=solid, fillcolor="+this.parseColor(e)+", opacity="+t.toFixed(5)+"]",a+="("+i.join(",")+"){"+n+"}{"+r+"}{"+o+"}\n"),a},addPoint:function(e){var t="\\psdot[linecolor="+this.parseColor(e.visProp.strokecolor)+",dotstyle=",i=e.normalizeFace(e.visProp.face)||"o",n=e.visProp.size>4?4:e.visProp.size,r=[0,0,"2pt 2","5pt 2","5pt 3"];return"x"==i?t+="x, dotsize="+r[n]:"o"==i?(t+="*, dotsize=",1==n?t+="2pt 2":2==n?t+="4pt 2":3==n?t+="6pt 2":4==n&&(t+="6pt 3")):"[]"==i?t+="square*, dotsize="+r[n]:"+"==i&&(t+="+, dotsize="+r[n]),t+="]("+e.coords.usrCoords.slice(1).join(",")+")\n",t+="\\rput("+(e.coords.usrCoords[1]+15/e.board.unitY)+","+(e.coords.usrCoords[2]+15/e.board.unitY)+"){\\small $"+e.name+"$}\n"},addLine:function(e){var t=new JXG.Coords(JXG.COORDS_BY_USER,e.point1.coords.usrCoords,e.board),i=new JXG.Coords(JXG.COORDS_BY_USER,e.point2.coords.usrCoords,e.board),n="\\psline[linecolor="+this.parseColor(e.visProp.strokecolor)+", linewidth="+e.visProp.strokewidth+"px]";return(e.visProp.straightfirst||e.visProp.straightlast)&&JXG.Math.Geometry.calcStraight(e,t,i),n+=this.setArrows(e),n+="("+t.usrCoords.slice(1).join(",")+")("+i.usrCoords.slice(2).join(",")+")\n"},addCircle:function(e){var t=e.Radius(),i="\\pscircle[linecolor="+this.parseColor(e.visProp.strokecolor)+", linewidth="+e.visProp.strokewidth+"px";return"none"!=e.visProp.fillcolor&&0!=e.visProp.fillopacity&&(i+=", fillstyle=solid, fillcolor="+this.parseColor(e.visProp.fillcolor)+", opacity="+e.visProp.fillopacity.toFixed(5)),i+="]("+e.center.coords.usrCoords.slice(1).join("1")+"){"+t+"}\n"},addPolygon:function(e){var t,i="\\pspolygon[linestyle=none, fillstyle=solid, fillcolor="+this.parseColor(e.visProp.fillcolor)+", opacity="+e.visProp.fillopacity.toFixed(5)+"]";for(t=0;e.vertices.length>t;t++)i+="("+e.vertices[t].coords.usrCoords.slice(1).join(",")+")";return i+="\n"},addArc:function(e){var t=e.Radius(),i={coords:new JXG.Coords(JXG.COORDS_BY_USER,[e.board.canvasWidth/e.board.unitY,e.center.coords.usrCoords[2]],e.board)},n=JXG.Math.Geometry.trueAngle(i,e.center,e.point2).toFixed(4),r=JXG.Math.Geometry.trueAngle(i,e.center,e.point3).toFixed(4),o="\\psarc[linecolor="+this.parseColor(e.visProp.strokecolor)+", linewidth="+e.visProp.strokewidth+"px]";return o+=this.setArrows(e),o+="("+e.center.coords.usrCoords.slice(1).join(",")+"){"+t+"}{"+n+"}{"+r+"}\n"},addSector:function(e){var t=e.Radius(),i={coords:new JXG.Coords(JXG.COORDS_BY_USER,[e.board.canvasWidth/e.board.unitY,e.point1.coords.usrCoords[2]],e.board)},n=JXG.Math.Geometry.trueAngle(i,e.point1,e.point2).toFixed(4),r=JXG.Math.Geometry.trueAngle(i,e.point1,e.point3).toFixed(4);return this.drawWedge(e.visProp.fillcolor,e.visProp.fillopacity,e.point1.coords.usrCoords.slice(1),t,n,r)},addAngle:function(e){var t,i=e.radius,n={coords:new JXG.Coords(JXG.COORDS_BY_USER,[e.board.canvasWidth/e.board.unitY,e.point2.coords.usrCoords[2]],e.board)},r=JXG.Math.Geometry.trueAngle(n,e.point2,e.point1).toFixed(4),o=JXG.Math.Geometry.trueAngle(n,e.point2,e.point3).toFixed(4);return t=this.drawWedge(e.visProp.fillcolor,e.visProp.fillopacity,e.point2.coords.usrCoords.slice(1),i,r,o),t+="\\psarc[linecolor="+this.parseColor(e.visProp.strokecolor)+", linewidth="+e.visProp.strokewidth+"px]",t+="("+e.point2.coords.usrCoords.slice(1).join(",")+"){"+i+"}{"+r+"}{"+o+"}\n"},parseColor:function(e){var t=JXG.rgbParser(e);return"{[rgb]{"+t[0]/255+","+t[1]/255+","+t[2]/255+"}}"}},JXG.Server=function(){},JXG.Server.modules=function(){},JXG.Server.runningCalls={},JXG.Server.handleError=function(e){alert("error occured, server says: "+e.message)},JXG.Server.callServer=function(e,t,i,n){var r,o,a,s,l,c,u;n=n||!1,s="";for(u in i)s+="&"+escape(u)+"="+escape(i[u]);c=JXG.toJSON(i);do l=e+Math.floor(4096*Math.random());while(this.runningCalls[l]!==void 0);
return this.runningCalls[l]={action:e},i.module!==void 0&&(this.runningCalls[l].module=i.module),r=JXG.serverBase+"JXGServer.py",o="action="+escape(e)+"&id="+l+"&dataJSON="+escape(JXG.Util.Base64.encode(c)),this.cbp=function(e){var i,n,r,o,a,s,l,c;if(i=new JXG.Util.Unzip(JXG.Util.Base64.decodeAsArray(e)).unzip(),JXG.isArray(i)&&i.length>0&&(i=i[0][0]),"string"==typeof i)if(n=window.JSON&&window.JSON.parse?window.JSON.parse(i):Function("return "+i)(),"error"==n.type)this.handleError(n);else if("response"==n.type){for(s=n.id,l=0;n.fields.length>l;l++)r=n.fields[l],o=r.namespace+("object"==typeof Function("return "+r.namespace)()?".":".prototype.")+r.name+" = "+r.value,Function(o)();for(l=0;n.handler.length>l;l++){for(r=n.handler[l],a=[],c=0;r.parameters.length>c;c++)a[c]='"'+r.parameters[c]+'": '+r.parameters[c];o="if(typeof JXG.Server.modules."+this.runningCalls[s].module+' == "undefined")JXG.Server.modules.'+this.runningCalls[s].module+" = {};",o+="JXG.Server.modules."+this.runningCalls[s].module+"."+r.name+"_cb = "+r.callback+";",o+="JXG.Server.modules."+this.runningCalls[s].module+"."+r.name+" = function ("+r.parameters.join(",")+', __JXGSERVER_CB__, __JXGSERVER_SYNC) {if(typeof __JXGSERVER_CB__ == "undefined") __JXGSERVER_CB__ = JXG.Server.modules.'+this.runningCalls[s].module+"."+r.name+"_cb;var __JXGSERVER_PAR__ = {"+a.join(",")+', "module": "'+this.runningCalls[s].module+'", "handler": "'+r.name+'" };JXG.Server.callServer("exec", __JXGSERVER_CB__, __JXGSERVER_PAR__, __JXGSERVER_SYNC);};',Function(o)()}delete this.runningCalls[s],t(n.data)}},this.cb=JXG.bind(this.cbp,this),window.XMLHttpRequest?(a=new XMLHttpRequest,a.overrideMimeType("text/plain; charset=iso-8859-1")):a=new ActiveXObject("Microsoft.XMLHTTP"),a?(a.open("POST",r,!n),a.setRequestHeader("Content-type","application/x-www-form-urlencoded"),n||(a.onreadystatechange=function(e){return function(){switch(a.readyState){case 4:200!=a.status||e(a.responseText);break;default:return!1}}}(this.cb)),a.send(o),n&&this.cb(a.responseText),void 0):!1},JXG.Server.loadModule_cb=function(e){var t;for(t=0;e.length>t;t++)alert(e[t].name+": "+e[t].value)},JXG.Server.loadModule=function(e){return JXG.Server.callServer("load",JXG.Server.loadModule_cb,{module:e},!0)},JXG.Server.load=JXG.Server.loadModule,JXG.DataSource=function(){return this.data=[],this.columnHeaders=[],this.rowHeaders=[],this},JXG.extend(JXG.DataSource.prototype,{loadFromArray:function(e,t,i){var n,r,o;if(t===void 0&&(t=!1),i===void 0&&(i=!1),JXG.isArray(t)&&(this.columnHeaders=t,t=!1),JXG.isArray(i)&&(this.rowHeaders=i,i=!1),this.data=[],t&&(this.columnHeaders=[]),i&&(this.rowHeaders=[]),e!==void 0){for(this.data=Array(e.length),n=0;e.length>n;n++)for(this.data[n]=Array(e[n].length),r=0;e[n].length>r;r++)o=e[n][r],this.data[n][r]=""+parseFloat(o)==o?parseFloat(o):"-"!=o?o:0/0;if(t&&(this.columnHeaders=this.data[0].slice(1),this.data=this.data.slice(1)),i)for(this.rowHeaders=[],n=0;this.data.length>n;n++)this.rowHeaders.push(this.data[n][0]),this.data[n]=this.data[n].slice(1)}return this},loadFromTable:function(e,t,i){var n,r,o,a,s;if(t===void 0&&(t=!1),i===void 0&&(i=!1),JXG.isArray(t)&&(this.columnHeaders=t,t=!1),JXG.isArray(i)&&(this.rowHeaders=i,i=!1),this.data=[],t&&(this.columnHeaders=[]),i&&(this.rowHeaders=[]),e=document.getElementById(e),e!==void 0){for(n=e.getElementsByTagName("tr"),this.data=Array(n.length),r=0;n.length>r;r++)for(a=n[r].getElementsByTagName("td"),this.data[r]=Array(a.length),o=0;a.length>o;o++)s=a[o].innerHTML,this.data[r][o]=""+parseFloat(s)==s?parseFloat(s):"-"!=s?s:0/0;if(t&&(this.columnHeaders=this.data[0].slice(1),this.data=this.data.slice(1)),i)for(this.rowHeaders=[],r=0;this.data.length>r;r++)this.rowHeaders.push(this.data[r][0]),this.data[r]=this.data[r].slice(1)}return this},addColumn:function(){},addRow:function(){},getColumn:function(e){var t,i=Array(this.data.length);if("string"==typeof e)for(t=0;this.columnHeaders.length>t;t++)if(e==this.columnHeaders[t]){e=t;break}for(t=0;this.data.length>t;t++)this.data[t].length>e&&(i[t]=parseFloat(this.data[t][e]));return i},getRow:function(e){var t,i;if("string"==typeof e)for(i=0;this.rowHeaders.length>i;i++)if(e==this.rowHeaders[i]){e=i;break}for(t=Array(this.data[e].length),i=0;this.data[e].length>i;i++)t[i]=this.data[e][i];return t}}),JXG.JessieCode=function(e){this.sstack=[{}],this.scope=0,this.pstack=[[]],this.pscope=0,this.propstack=[{}],this.propscope=0,this.propobj=0,this.lhs=[],this.isLHS=!1,this.warnLog="jcwarn",this.builtIn=this.defineBuiltIn(),this.board=null,this.countLines=!0,this.parCurLine=1,this.parCurColumn=0,this.maxRuntime=1e4,"string"==typeof e&&this.parse(e)},JXG.extend(JXG.JessieCode.prototype,{node:function(e,t,i){return{type:e,value:t,children:i}},createNode:function(e,t){var i,n=this.node(e,t,[]);for(i=2;arguments.length>i;i++)n.children.push(arguments[i]);return n.line=this.parCurLine,n.col=this.parCurColumn,n},getElementById:function(e){return this.board.objects[e]},creator:function(){var e,t={};return e=function(e){var i;return"function"==typeof t[this.board.id+e]?t[this.board.id+e]:(i=function(t){return function(i,n){var r;return r=JXG.exists(n)?n:{name:0!==t.lhs[t.scope]?t.lhs[t.scope]:""},t.board.create(e,i,r)}}(this),i.creator=!0,t[this.board.id+e]=i,i)},e.clearCache=function(){t={}},e}(),letvar:function(e,t){this.builtIn[e]&&this._warn('"'+e+'" is a predefined value.'),this.sstack[this.scope][e]=t},isLocalVariable:function(e){var t;for(t=this.scope;t>-1;t--)if(JXG.exists(this.sstack[t][e]))return t;return-1},isCreator:function(e){return!!JXG.JSXGraph.elements[e]},isMathMethod:function(e){return"E"!==e&&!!Math[e]},isBuiltIn:function(e){return!!this.builtIn[e]},getvar:function(e,t){var i,n;return t=JXG.def(t,!1),i=this.isLocalVariable(e),i>-1?this.sstack[i][e]:this.isCreator(e)?this.creator(e):this.isMathMethod(e)?Math[e]:this.isBuiltIn(e)?this.builtIn[e]:t||(i=JXG.getRef(this.board,e),i===e)?n:i},getvarJS:function(e,t){var i;if(t=JXG.def(t,!1),JXG.indexOf(this.pstack[this.pscope],e)>-1)return e;if(i=this.isLocalVariable(e),i>-1)return"$jc$.sstack["+i+"]['"+e+"']";if(this.isCreator(e))return"(function () { var a = Array.prototype.slice.call(arguments, 0); return $jc$.board.create.apply(this, ['"+e+"'].concat(a)); })";if(this.isMathMethod(e))return"Math."+e;if(this.isBuiltIn(e))return this.builtIn[e].src;if(!t){if(JXG.isId(this.board,e))return"$jc$.board.objects['"+e+"']";if(JXG.isName(this.board,e))return"$jc$.board.elementsByName['"+e+"']";if(JXG.isGroup(this.board,e))return"$jc$.board.groups['"+e+"']"}return""},setProp:function(e,t,i){var n,r,o={};e.elementClass!==JXG.OBJECT_CLASS_POINT||"X"!==t&&"Y"!==t?e.type!==JXG.OBJECT_TYPE_TEXT||"X"!==t&&"Y"!==t?e.type&&e.elementClass&&e.visProp?(o[t]=i,e.setProperty(o)):e[t]=i:("number"==typeof i?e[t]=function(){return i}:"function"==typeof i?(e.isDraggable=!1,e[t]=i):"string"==typeof i&&(e.isDraggable=!1,e[t]=JXG.createFunction(i,this.board,null,!0),e[t+"jc"]=i),e[t].origin=i,this.board.update()):(t=t.toLowerCase(),e.isDraggable&&"number"==typeof i?(n="x"===t?i:e.X(),r="y"===t?i:e.Y(),e.setPosition(JXG.COORDS_BY_USER,n,r)):!e.isDraggable||"function"!=typeof i&&"string"!=typeof i?e.isDraggable||(n="x"===t?i:e.XEval.origin,r="y"===t?i:e.YEval.origin,e.addConstraint([n,r])):(n="x"===t?i:e.coords.usrCoords[1],r="y"===t?i:e.coords.usrCoords[2],e.addConstraint([n,r])),this.board.update())},utf8_encode:function(e){var t,i,n=[];for(t=0;e.length>t;t++)i=e.charCodeAt(t),128>i?n.push(String.fromCharCode(i)):n.push(""+i.toString(16)+";");return n.join("")},parse:function(e,t){var i,n,r,o=0,a=[],s=[],l=["Abs","ACos","ASin","ATan","Ceil","Cos","Exp","Factorial","Floor","Log","Max","Min","Random","Round","Sin","Sqrt","Tan","Trunc","If","Deg","Rad","Dist"],c=e.replace(/\r\n/g,"\n").split("\n"),u=[];for(JXG.exists(t)||(t=!1),n=0;c.length>n;n++)if("/"!==JXG.trim(c[n])[0]||"/"!==JXG.trim(c[n])[1]){if(t)for(r=0;l.length>r;r++)i=RegExp(l[r]+"\\(","g"),c[n]=c[n].replace(i,l[r].toLowerCase()+"(");u.push(c[n])}if(e=u.join("\n"),e=this.utf8_encode(e),(o=this._parse(e,a,s))>0)for(n=0;o>n;n++)this.line=a[n].line,this._error("Parse error in line "+a[n].line+" near >"+e.substr(a[n].offset,30)+'<, expecting "'+s[n].join()+'"')},snippet:function(e,t,i,n){var r,o,a,s;return r="jxg__tmp__intern_"+JXG.Util.genUUID().replace(/\-/g,""),JXG.exists(t)||(t=!0),JXG.exists(i)||(i=""),JXG.exists(n)||(n=!1),a=this.sstack[0][r],this.countLines=!1,o=r+" = "+(t?" function ("+i+") { return ":"")+e+(t?"; }":"")+";",this.parse(o,n),s=this.sstack[0][r],JXG.exists(a)?this.sstack[0][r]=a:delete this.sstack[0][r],this.countLines=!0,s},replaceIDs:function(e){var t,i;if(e.replaced&&(i=this.board.objects[e.children[1].children[0].value],JXG.exists(i)&&JXG.exists(i)&&""!==i.name&&(e.type="node_var",e.value=i.name,e.children.length=0,delete e.replaced)),e.children)for(t=e.children.length;t>0;t--)JXG.exists(e.children[t-1])&&(e.children[t-1]=this.replaceIDs(e.children[t-1]));return e},replaceNames:function(e){var t,i;if(i=e.value,"node_op"==e.type&&"op_lhs"==i&&1===e.children.length?this.isLHS=!0:"node_var"==e.type&&(this.isLHS?this.letvar(i,!0):!JXG.exists(this.getvar(i,!0))&&JXG.exists(this.board.elementsByName[i])&&(e=this.createReplacementNode(e))),e.children)for(t=e.children.length;t>0;t--)JXG.exists(e.children[t-1])&&(e.children[t-1]=this.replaceNames(e.children[t-1]));return"node_op"==e.type&&"op_lhs"==e.value&&1===e.children.length&&(this.isLHS=!1),e},createReplacementNode:function(e){var t=e.value,i=this.board.elementsByName[t];return e=this.createNode("node_op","op_execfun",this.createNode("node_var","$"),this.createNode("node_op","op_param",this.createNode("node_str",i.id))),e.replaced=!0,e},collectDependencies:function(e,t){var i,n,r;if(n=e.value,"node_var"==e.type&&(r=this.getvar(n),r&&r.visProp&&r.type&&r.elementClass&&r.id&&(t[r.id]=r)),"node_op"==e.type&&"op_execfun"==e.value&&e.children.length>1&&"$"==e.children[0].value&&e.children[1].children.length>0&&(r=e.children[1].children[0].value,t[r]=this.board.objects[r]),e.children)for(i=e.children.length;i>0;i--)JXG.exists(e.children[i-1])&&this.collectDependencies(e.children[i-1],t)},resolveProperty:function(e,t,i){return i=JXG.def(i,!1),e&&e.type&&e.elementClass&&e.methodMap&&("label"===t?(e=e.label,t="content"):JXG.exists(e.subs[t])?e=e.subs:JXG.exists(e.methodMap[t])?t=e.methodMap[t]:(e=e.visProp,t=t.toLowerCase())),JXG.exists(e)||this._error(e+" is not an object."),JXG.exists(e[t])||this._error("unknown property "+t+"."),i&&"function"==typeof e[t]?function(){return e[t].apply(e,arguments)}:e[t]},execute:function(node){var ret,v,i,e,parents=[];if(ret=0,this.cancel&&this._error("Max runtime exceeded"),!node)return ret;switch(this.line=node.line,node.type){case"node_op":switch(node.value){case"op_none":node.children[0]&&this.execute(node.children[0]),node.children[1]&&(ret=this.execute(node.children[1]));break;case"op_assign":v=this.execute(node.children[0]),this.lhs[this.scope]=v[1],v[0].type&&v[0].elementClass&&v[0].methodMap&&"label"===v[1]&&this._error("Left-hand side of assignment is read-only."),v[0]!==this.sstack[this.scope]||JXG.isArray(v[0])&&"number"==typeof v[1]?this.setProp(v[0],v[1],this.execute(node.children[1])):this.letvar(v[1],this.execute(node.children[1])),this.lhs[this.scope]=0;break;case"op_noassign":ret=this.execute(node.children[0]);break;case"op_if":this.execute(node.children[0])&&(ret=this.execute(node.children[1]));break;case"op_if_else":ret=this.execute(node.children[0])?this.execute(node.children[1]):this.execute(node.children[2]);break;case"op_while":for(;this.execute(node.children[0]);)this.execute(node.children[1]);break;case"op_do":do this.execute(node.children[0]);while(this.execute(node.children[1]));break;case"op_for":for(i=(new Date).getTime(),this.execute(node.children[0]);this.execute(node.children[1]);this.execute(node.children[2])){if((new Date).getTime()-i>this.maxRuntime||this.cancel){this._error("for: max runtime exceeded");break}this.execute(node.children[3])}break;case"op_param":node.children[1]&&this.execute(node.children[1]),ret=node.children[0],this.pstack[this.pscope].push(ret);break;case"op_paramdef":node.children[1]&&this.execute(node.children[1]),ret=node.children[0],this.pstack[this.pscope].push(ret);break;case"op_proplst":node.children[0]&&this.execute(node.children[0]),node.children[1]&&this.execute(node.children[1]);break;case"op_proplst_val":this.propstack.push({}),this.propscope++,this.execute(node.children[0]),ret=this.propstack[this.propscope],this.propstack.pop(),this.propscope--;break;case"op_prop":this.propstack[this.propscope][node.children[0]]=this.execute(node.children[1]);break;case"op_array":var l;for(this.pstack.push([]),this.pscope++,this.execute(node.children[0]),ret=[],l=this.pstack[this.pscope].length,i=0;l>i;i++)ret.push(this.execute(this.pstack[this.pscope][i]));this.pstack.pop(),this.pscope--;break;case"op_extvalue":var undef;ret=this.execute(node.children[0]),i=this.execute(node.children[1]),ret="number"==typeof i&&Math.abs(Math.round(i)-i)i;i++)this.sstack[this.scope][this.pstack[this.pscope][i]]=this.pstack[this.pscope][i];this.replaceNames(node.children[1]),ret=function($jc$){var p=$jc$.pstack[$jc$.pscope].join(", "),str="var f = function ("+p+") {\n$jc$.sstack.push([]);\n$jc$.scope++;\nvar r = (function () {\n"+$jc$.compile(node.children[1],!0)+"})();\n$jc$.sstack.pop();\n$jc$.scope--;\nreturn r;\n}; f;";return eval(str)}(this),this.sstack.pop(),this.scope--}else ret=function(e,t){return function(){var i;for(t.sstack.push({}),t.scope++,i=0;e.length>i;i++)t.sstack[t.scope][e[i]]=arguments[i];return i=t.execute(node.children[1]),t.sstack.pop(),t.scope--,i}}(this.pstack[this.pscope],this);ret.toJS=ret.toString,ret.toString=function(e){return function(){return e.compile(e.replaceIDs(JXG.deepCopy(node)))}}(this),ret.deps={},this.collectDependencies(node.children[1],ret.deps),this.pstack.pop(),this.pscope--;break;case"op_execfun":var fun,attr,sc;for(this.pstack.push([]),this.pscope++,this.execute(node.children[1]),node.children[2]!==void 0&&(attr=this.execute(node.children[2])),fun=this.execute(node.children[0]),sc=fun.sc?fun.sc:this,i=0;this.pstack[this.pscope].length>i;i++)parents[i]=this.execute(this.pstack[this.pscope][i]);"function"!=typeof fun||fun.creator?"function"==typeof fun&&fun.creator?(ret=fun(parents,attr),ret.jcLine=this.line):this._error("Function '"+fun+"' is undefined."):ret=fun.apply(sc,parents),this.pstack.pop(),this.pscope--;break;case"op_property":e=this.execute(node.children[0]),v=node.children[1],ret=this.resolveProperty(e,v,!1),ret.sc=e;break;case"op_lhs":v=node.children[0],v.children&&v.type&&v.value&&(v=this.execute(v)),1===node.children.length?e=this.sstack[this.scope]:(e=this.execute(node.children[1]),e.type&&e.elementClass&&v.toLowerCase&&"x"!==v.toLowerCase()&&"y"!==v.toLowerCase()&&(v=v.toLowerCase())),ret=[e,v];break;case"op_use":var found=!1;for(var b in JXG.JSXGraph.boards)JXG.JSXGraph.boards[b].container===""+node.children[0]&&(this.board=JXG.JSXGraph.boards[b],found=!0);found||this._error("Board '"+(""+node.children[0])+"' not found!");break;case"op_delete":v=this.getvar(node.children[0]),"object"==typeof v&&JXG.exists(v.type)&&JXG.exists(v.elementClass)&&this.board.removeObject(v);break;case"op_equ":ret=this.execute(node.children[0])==this.execute(node.children[1]);break;case"op_neq":ret=this.execute(node.children[0])!=this.execute(node.children[1]);break;case"op_approx":ret=Math.abs(this.execute(node.children[0])-this.execute(node.children[1]))this.execute(node.children[1]);break;case"op_lot":ret=this.execute(node.children[0])=this.execute(node.children[1]);break;case"op_loe":ret=this.execute(node.children[0])<=this.execute(node.children[1]);break;case"op_or":ret=this.execute(node.children[0])||this.execute(node.children[1]);break;case"op_and":ret=this.execute(node.children[0])&&this.execute(node.children[1]);break;case"op_not":ret=!this.execute(node.children[0]);break;case"op_add":ret=JXG.Math.Statistics.add(this.execute(node.children[0]),this.execute(node.children[1]));break;case"op_sub":ret=JXG.Math.Statistics.subtract(this.execute(node.children[0]),this.execute(node.children[1]));break;case"op_div":ret=JXG.Math.Statistics.div(this.execute(node.children[0]),this.execute(node.children[1]));break;case"op_mod":ret=JXG.Math.Statistics.mod(this.execute(node.children[0]),this.execute(node.children[1]),!0);break;case"op_mul":ret=this.mul(this.execute(node.children[0]),this.execute(node.children[1]));break;case"op_exp":ret=Math.pow(this.execute(node.children[0]),this.execute(node.children[1]));break;case"op_neg":ret=-1*this.execute(node.children[0])}break;case"node_var":ret=this.getvar(node.value);break;case"node_const":ret=Number(node.value);break;case"node_const_bool":ret="false"!==node.value.toLowerCase();break;case"node_str":ret=node.value}return ret},compile:function(e,t){var i,n;if(i="",JXG.exists(t)||(t=!1),!e)return i;switch(e.type){case"node_op":switch(e.value){case"op_none":e.children[0]&&(i=this.compile(e.children[0],t)),e.children[1]&&(i+=this.compile(e.children[1],t));break;case"op_assign":n=this.compile(e.children[0],t),t?JXG.isArray(n)?i="$jc$.setProp("+n[0]+", '"+n[1]+"', "+this.compile(e.children[1],t)+");\n":(this.isLocalVariable(n)!==this.scope&&(this.sstack[this.scope][n]=!0),i="$jc$.sstack["+this.scope+"]['"+n+"'] = "+this.compile(e.children[1],t)+";\n"):i=n+" = "+this.compile(e.children[1],t)+";\n";break;case"op_noassign":i=this.compile(e.children[0],t);break;case"op_if":i=" if ("+this.compile(e.children[0],t)+") "+this.compile(e.children[1],t);break;case"op_if_else":i=" if ("+this.compile(e.children[0],t)+")"+this.compile(e.children[1],t),i+=" else "+this.compile(e.children[2],t);break;case"op_while":i=" while ("+this.compile(e.children[0],t)+") {\n"+this.compile(e.children[1],t)+"}\n";break;case"op_do":i=" do {\n"+this.compile(e.children[0],t)+"} while ("+this.compile(e.children[1],t)+");\n";break;case"op_for":i=" for ("+this.compile(e.children[0],t)+"; "+this.compile(e.children[1],t)+"; "+this.compile(e.children[2],t)+") {\n"+this.compile(e.children[3],t)+"\n}\n";break;case"op_param":e.children[1]&&(i=this.compile(e.children[1],t)+", "),i+=this.compile(e.children[0],t);break;case"op_paramdef":e.children[1]&&(i=this.compile(e.children[1],t)+", "),i+=e.children[0];break;case"op_proplst":e.children[0]&&(i=this.compile(e.children[0],t)+", "),i+=this.compile(e.children[1],t);break;case"op_prop":i=e.children[0]+": "+this.compile(e.children[1],t);break;case"op_proplst_val":i=(t?"{":"<<")+this.compile(e.children[0],t)+(t?"}":">>");break;case"op_array":i="["+this.compile(e.children[0],t)+"]";break;case"op_extvalue":i=this.compile(e.children[0],t)+"["+this.compile(e.children[1],t)+"]";break;case"op_return":i=" return "+this.compile(e.children[0],t)+";\n";break;case"op_function":i=" function ("+this.compile(e.children[0],t)+") {\n"+this.compile(e.children[1],t)+"}";break;case"op_execfun":e.children[2]&&(n=(t?"{":"<<")+this.compile(e.children[2],t)+(t?"}":">>")),i=this.compile(e.children[0],t)+"("+this.compile(e.children[1],t)+(e.children[2]?", "+n:"")+")",t&&"$"===e.children[0].value&&(i="$jc$.board.objects["+this.compile(e.children[1],t)+"]");break;case"op_property":i=t&&"X"!==e.children[1]&&"Y"!==e.children[1]?"$jc$.resolveProperty("+this.compile(e.children[0],t)+", '"+e.children[1]+"', true)":this.compile(e.children[0],t)+"."+e.children[1];break;case"op_lhs":1===e.children.length?i=e.children[0]:"dot"===e.children[2]?i=t?[this.compile(e.children[1],t),e.children[0]]:this.compile(e.children[1],t)+"."+e.children[0]:"bracket"===e.children[2]&&(i=t?[this.compile(e.children[1],t),this.compile(e.children[0],t)]:this.compile(e.children[1],t)+"["+this.compile(e.children[0],t)+"]");break;case"op_use":i=t?"$jc$.board = JXG.JSXGraph.boards['"+e.children[0]+"']":"use "+e.children[0]+";";break;case"op_delete":i="delete "+e.children[0];break;case"op_equ":i="("+this.compile(e.children[0],t)+" == "+this.compile(e.children[1],t)+")";break;case"op_neq":i="("+this.compile(e.children[0],t)+" != "+this.compile(e.children[1],t)+")";break;case"op_approx":i="("+this.compile(e.children[0],t)+" ~= "+this.compile(e.children[1],t)+")";break;case"op_grt":i="("+this.compile(e.children[0],t)+" > "+this.compile(e.children[1],t)+")";break;case"op_lot":i="("+this.compile(e.children[0],t)+" < "+this.compile(e.children[1],t)+")";break;case"op_gre":i="("+this.compile(e.children[0],t)+" >= "+this.compile(e.children[1],t)+")";break;case"op_loe":i="("+this.compile(e.children[0],t)+" <= "+this.compile(e.children[1],t)+")";break;case"op_or":i="("+this.compile(e.children[0],t)+" || "+this.compile(e.children[1],t)+")";break;case"op_and":i="("+this.compile(e.children[0],t)+" && "+this.compile(e.children[1],t)+")";break;case"op_not":i="!("+this.compile(e.children[0],t)+")";break;case"op_add":i=t?"JXG.Math.Statistics.add("+this.compile(e.children[0],t)+", "+this.compile(e.children[1],t)+")":"("+this.compile(e.children[0],t)+" + "+this.compile(e.children[1],t)+")";break;case"op_sub":i=t?"JXG.Math.Statistics.subtract("+this.compile(e.children[0],t)+", "+this.compile(e.children[1],t)+")":"("+this.compile(e.children[0],t)+" - "+this.compile(e.children[1],t)+")";break;case"op_div":i=t?"JXG.Math.Statistics.div("+this.compile(e.children[0],t)+", "+this.compile(e.children[1],t)+")":"("+this.compile(e.children[0],t)+" / "+this.compile(e.children[1],t)+")";break;case"op_mod":i=t?"JXG.Math.mod("+this.compile(e.children[0],t)+", "+this.compile(e.children[1],t)+", true)":"("+this.compile(e.children[0],t)+" % "+this.compile(e.children[1],t)+")";break;case"op_mul":i=t?"$jc$.mul("+this.compile(e.children[0],t)+", "+this.compile(e.children[1],t)+")":"("+this.compile(e.children[0],t)+" * "+this.compile(e.children[1],t)+")";break;case"op_exp":i=t?"Math.pow("+this.compile(e.children[0],t)+", "+this.compile(e.children[1],t)+")":"("+this.compile(e.children[0],t)+"^"+this.compile(e.children[1],t)+")";break;case"op_neg":i="(-"+this.compile(e.children[0],t)+")"}break;case"node_var":i=t?this.getvarJS(e.value):e.value;break;case"node_const":i=e.value;break;case"node_const_bool":i=e.value;break;case"node_str":i="'"+e.value.replace(/'/g,"\\'")+"'"}return e.needsBrackets&&(i="{\n"+i+"}\n"),i},X:function(e){return e.X()},Y:function(e){return e.Y()},V:function(e){return e.Value()},L:function(e){return e.L()},dist:function(e,t){return JXG.exists(e)&&JXG.exists(e.Dist)||this._error("Error: Can't calculate distance."),e.Dist(t)},mul:function(e,t){return JXG.isArray(e)*JXG.isArray(t)?JXG.Math.innerProduct(e,t,Math.min(e.length,t.length)):JXG.Math.Statistics.multiply(e,t)},defineBuiltIn:function(){var e=this,t={PI:Math.PI,EULER:Math.E,X:e.X,Y:e.Y,V:e.V,L:e.L,dist:e.dist,rad:JXG.Math.Geometry.rad,deg:JXG.Math.Geometry.trueAngle,factorial:JXG.Math.factorial,trunc:JXG.trunc,$:e.getElementById};return t.rad.sc=JXG.Math.Geometry,t.deg.sc=JXG.Math.Geometry,t.factorial.sc=JXG.Math,t.PI.src="Math.PI",t.EULER.src="Math.E",t.X.src="$jc$.X",t.Y.src="$jc$.Y",t.V.src="$jc$.V",t.L.src="$jc$.L",t.dist.src="$jc$.dist",t.rad.src="JXG.Math.Geometry.rad",t.deg.src="JXG.Math.Geometry.trueAngle",t.factorial.src="JXG.Math.factorial",t.trunc.src="JXG.trunc",t.$.src="(function (n) { return JXG.getRef($jc$.board, n); })",t},_debug:function(e){"undefined"!=typeof console?console.log(e):null!==document.getElementById("debug")&&(document.getElementById("debug").innerHTML+=e+"
")},_error:function(e){var t=Error("Error("+this.line+"): "+e);throw t.line=this.line,t},_warn:function(e){"undefined"!=typeof console?console.log("Warning("+this.line+"): "+e):null!==document.getElementById(this.warnLog)&&(document.getElementById(this.warnLog).innerHTML+="Warning("+this.line+"): "+e+"
")}}),JXG.extend(JXG.JessieCode.prototype,{_lex:function(e){for(var t,i,n,r=-1,o=0,a=0;;){t=0,r=-1,o=0,a=0,i=e.offset+1+(o-a);do{if(i--,t=0,r=-2,a=i,a>=e.src.length)return 66;do{switch(n=e.src.charCodeAt(i),t){case 0:t=n>=9&&10>=n||13==n||32==n?1:33==n?2:35==n?3:36==n||n>=65&&67>=n||n>=71&&72>=n||n>=74&&81>=n||83==n||86==n||n>=88&&90>=n||95==n||n>=97&&99>=n||n>=103&&104>=n||n>=106&&113>=n||115==n||118==n||n>=120&&122>=n?4:37==n?5:40==n?6:41==n?7:42==n?8:43==n?9:44==n?10:45==n?11:46==n?12:47==n?13:n>=48&&57>=n?14:58==n?15:59==n?16:60==n?17:61==n?18:62==n?19:91==n?20:93==n?21:94==n?22:123==n?23:124==n?24:125==n?25:38==n?48:68==n||100==n?49:39==n?51:73==n||105==n?52:126==n?53:70==n||102==n?64:85==n||117==n?65:69==n||101==n?73:84==n||116==n?74:87==n||119==n?80:82==n||114==n?84:-1;break;case 1:t=-1,r=2,o=i;break;case 2:t=61==n?26:-1,r=31,o=i;break;case 3:t=-1,r=41,o=i;break;case 4:t=n>=48&&57>=n||n>=65&&90>=n||95==n||n>=97&&122>=n?4:-1,r=45,o=i;break;case 5:t=-1,r=35,o=i;break;case 6:t=-1,r=38,o=i;break;case 7:t=-1,r=39,o=i;break;case 8:t=-1,r=36,o=i;break;case 9:t=-1,r=32,o=i;break;case 10:t=-1,r=40,o=i;break;case 11:t=-1,r=33,o=i;break;case 12:t=n>=48&&57>=n?29:-1,r=44,o=i;break;case 13:t=-1,r=34,o=i;break;case 14:t=n>=48&&57>=n?14:46==n?29:-1,r=47,o=i;break;case 15:t=-1,r=42,o=i;break;case 16:t=-1,r=20,o=i;break;case 17:t=60==n?30:61==n?31:-1,r=28,o=i;break;case 18:t=61==n?32:-1,r=21,o=i;break;case 19:t=61==n?33:62==n?34:-1,r=27,o=i;break;case 20:t=-1,r=16,o=i;break;case 21:t=-1,r=17,o=i;break;case 22:t=-1,r=37,o=i;break;case 23:t=-1,r=18,o=i;break;case 24:t=124==n?37:-1,r=43,o=i;break;case 25:t=-1,r=19,o=i;break;case 26:t=-1,r=23,o=i;break;case 27:t=-1,r=30,o=i;break;case 28:t=-1,r=46,o=i;break;case 29:t=n>=48&&57>=n?29:-1,r=48,o=i;break;case 30:t=-1,r=14,o=i;break;case 31:t=-1,r=25,o=i;break;case 32:t=-1,r=22,o=i;break;case 33:t=-1,r=26,o=i;break;case 34:t=-1,r=15,o=i;break;case 35:t=n>=48&&57>=n||n>=65&&90>=n||95==n||n>=97&&122>=n?4:-1,r=6,o=i;break;case 36:t=n>=48&&57>=n||n>=65&&90>=n||95==n||n>=97&&122>=n?4:-1,r=3,o=i;break;case 37:t=-1,r=29,o=i;break;case 38:t=-1,r=24,o=i;break;case 39:t=n>=48&&57>=n||n>=65&&90>=n||95==n||n>=97&&122>=n?4:-1,r=7,o=i;break;case 40:t=n>=48&&57>=n||n>=65&&90>=n||95==n||n>=97&&122>=n?4:-1,r=9,o=i;break;case 41:t=n>=48&&57>=n||n>=65&&90>=n||95==n||n>=97&&122>=n?4:-1,r=4,o=i;break;case 42:t=n>=48&&57>=n||n>=65&&90>=n||95==n||n>=97&&122>=n?4:-1,r=12,o=i;break;case 43:t=n>=48&&57>=n||n>=65&&90>=n||95==n||n>=97&&122>=n?4:-1,r=13,o=i;break;case 44:t=n>=48&&57>=n||n>=65&&90>=n||95==n||n>=97&&122>=n?4:-1,r=5,o=i;break;case 45:t=n>=48&&57>=n||n>=65&&90>=n||95==n||n>=97&&122>=n?4:-1,r=11,o=i;break;case 46:t=n>=48&&57>=n||n>=65&&90>=n||95==n||n>=97&&122>=n?4:-1,r=10,o=i;break;case 47:t=n>=48&&57>=n||n>=65&&90>=n||95==n||n>=97&&122>=n?4:-1,r=8,o=i;break;case 48:t=38==n?27:-1;break;case 49:t=n>=48&&57>=n||n>=65&&68>=n||n>=70&&78>=n||n>=80&&90>=n||95==n||n>=97&&100>=n||n>=102&&110>=n||n>=112&&122>=n?4:79==n||111==n?35:69==n||101==n?81:-1,r=45,o=i;break;case 50:t=39==n?28:n>=0&&38>=n||n>=40&&91>=n||n>=93&&254>=n?51:92==n?55:-1,r=46,o=i;break;case 51:t=39==n?28:n>=0&&38>=n||n>=40&&91>=n||n>=93&&254>=n?51:92==n?55:-1;break;case 52:t=n>=48&&57>=n||n>=65&&69>=n||n>=71&&90>=n||95==n||n>=97&&101>=n||n>=103&&122>=n?4:70==n||102==n?36:-1,r=45,o=i;break;case 53:t=61==n?38:-1;break;case 54:t=n>=48&&57>=n||n>=65&&81>=n||n>=83&&90>=n||95==n||n>=97&&113>=n||n>=115&&122>=n?4:82==n||114==n?39:-1,r=45,o=i;break;case 55:t=39==n?50:n>=0&&38>=n||n>=40&&91>=n||n>=93&&254>=n?51:92==n?55:-1;break;case 56:t=n>=48&&57>=n||n>=65&&68>=n||n>=70&&90>=n||95==n||n>=97&&100>=n||n>=102&&122>=n?4:69==n||101==n?40:-1,r=45,o=i;break;case 57:t=n>=48&&57>=n||n>=65&&68>=n||n>=70&&90>=n||95==n||n>=97&&100>=n||n>=102&&122>=n?4:69==n||101==n?41:-1,r=45,o=i;break;case 58:t=n>=48&&57>=n||n>=65&&68>=n||n>=70&&90>=n||95==n||n>=97&&100>=n||n>=102&&122>=n?4:69==n||101==n?42:-1,r=45,o=i;break;case 59:t=n>=48&&57>=n||n>=65&&68>=n||n>=70&&90>=n||95==n||n>=97&&100>=n||n>=102&&122>=n?4:69==n||101==n?43:-1,r=45,o=i;break;case 60:t=n>=48&&57>=n||n>=65&&68>=n||n>=70&&90>=n||95==n||n>=97&&100>=n||n>=102&&122>=n?4:69==n||101==n?44:-1,r=45,o=i;break;case 61:t=n>=48&&57>=n||n>=65&&68>=n||n>=70&&90>=n||95==n||n>=97&&100>=n||n>=102&&122>=n?4:69==n||101==n?45:-1,r=45,o=i;break;case 62:t=n>=48&&57>=n||n>=65&&77>=n||n>=79&&90>=n||95==n||n>=97&&109>=n||n>=111&&122>=n?4:78==n||110==n?46:-1,r=45,o=i;break;case 63:t=n>=48&&57>=n||n>=65&&77>=n||n>=79&&90>=n||95==n||n>=97&&109>=n||n>=111&&122>=n?4:78==n||110==n?47:-1,r=45,o=i;break;case 64:t=n>=48&&57>=n||n>=66&&78>=n||n>=80&&84>=n||n>=86&&90>=n||95==n||n>=98&&110>=n||n>=112&&116>=n||n>=118&&122>=n?4:79==n||111==n?54:65==n||97==n?75:85==n||117==n?86:-1,r=45,o=i;break;case 65:t=n>=48&&57>=n||n>=65&&82>=n||n>=84&&90>=n||95==n||n>=97&&114>=n||n>=116&&122>=n?4:83==n||115==n?56:-1,r=45,o=i;break;case 66:t=n>=48&&57>=n||n>=65&&82>=n||n>=84&&90>=n||95==n||n>=97&&114>=n||n>=116&&122>=n?4:83==n||115==n?57:-1,r=45,o=i;break;case 67:t=n>=48&&57>=n||n>=65&&84>=n||n>=86&&90>=n||95==n||n>=97&&116>=n||n>=118&&122>=n?4:85==n||117==n?58:-1,r=45,o=i;break;case 68:t=n>=48&&57>=n||n>=65&&82>=n||n>=84&&90>=n||95==n||n>=97&&114>=n||n>=116&&122>=n?4:83==n||115==n?59:-1,r=45,o=i;break;case 69:t=n>=48&&57>=n||n>=65&&75>=n||n>=77&&90>=n||95==n||n>=97&&107>=n||n>=109&&122>=n?4:76==n||108==n?60:-1,r=45,o=i;break;case 70:t=n>=48&&57>=n||n>=65&&83>=n||n>=85&&90>=n||95==n||n>=97&&115>=n||n>=117&&122>=n?4:84==n||116==n?61:-1,r=45,o=i;break;case 71:t=n>=48&&57>=n||n>=65&&81>=n||n>=83&&90>=n||95==n||n>=97&&113>=n||n>=115&&122>=n?4:82==n||114==n?62:-1,r=45,o=i;break;case 72:t=n>=48&&57>=n||n>=65&&78>=n||n>=80&&90>=n||95==n||n>=97&&110>=n||n>=112&&122>=n?4:79==n||111==n?63:-1,r=45,o=i;break;case 73:t=n>=48&&57>=n||n>=65&&75>=n||n>=77&&90>=n||95==n||n>=97&&107>=n||n>=109&&122>=n?4:76==n||108==n?66:-1,r=45,o=i;break;case 74:t=n>=48&&57>=n||n>=65&&81>=n||n>=83&&90>=n||95==n||n>=97&&113>=n||n>=115&&122>=n?4:82==n||114==n?67:-1,r=45,o=i;break;case 75:t=n>=48&&57>=n||n>=65&&75>=n||n>=77&&90>=n||95==n||n>=97&&107>=n||n>=109&&122>=n?4:76==n||108==n?68:-1,r=45,o=i;break;case 76:t=n>=48&&57>=n||n>=65&&72>=n||n>=74&&90>=n||95==n||n>=97&&104>=n||n>=106&&122>=n?4:73==n||105==n?69:-1,r=45,o=i;break;case 77:t=n>=48&&57>=n||n>=65&&68>=n||n>=70&&90>=n||95==n||n>=97&&100>=n||n>=102&&122>=n?4:69==n||101==n?70:-1,r=45,o=i;break;case 78:t=n>=48&&57>=n||n>=65&&84>=n||n>=86&&90>=n||95==n||n>=97&&116>=n||n>=118&&122>=n?4:85==n||117==n?71:-1,r=45,o=i;break;case 79:t=n>=48&&57>=n||n>=65&&72>=n||n>=74&&90>=n||95==n||n>=97&&104>=n||n>=106&&122>=n?4:73==n||105==n?72:-1,r=45,o=i;break;case 80:t=n>=48&&57>=n||n>=65&&71>=n||n>=73&&90>=n||95==n||n>=97&&103>=n||n>=105&&122>=n?4:72==n||104==n?76:-1,r=45,o=i;break;case 81:t=n>=48&&57>=n||n>=65&&75>=n||n>=77&&90>=n||95==n||n>=97&&107>=n||n>=109&&122>=n?4:76==n||108==n?77:-1,r=45,o=i;break;case 82:t=n>=48&&57>=n||n>=65&&83>=n||n>=85&&90>=n||95==n||n>=97&&115>=n||n>=117&&122>=n?4:84==n||116==n?78:-1,r=45,o=i;break;case 83:t=n>=48&&57>=n||n>=65&&83>=n||n>=85&&90>=n||95==n||n>=97&&115>=n||n>=117&&122>=n?4:84==n||116==n?79:-1,r=45,o=i;break;case 84:t=n>=48&&57>=n||n>=65&&68>=n||n>=70&&90>=n||95==n||n>=97&&100>=n||n>=102&&122>=n?4:69==n||101==n?82:-1,r=45,o=i;break;case 85:t=n>=48&&57>=n||n>=65&&66>=n||n>=68&&90>=n||95==n||n>=97&&98>=n||n>=100&&122>=n?4:67==n||99==n?83:-1,r=45,o=i;break;case 86:t=n>=48&&57>=n||n>=65&&77>=n||n>=79&&90>=n||95==n||n>=97&&109>=n||n>=111&&122>=n?4:78==n||110==n?85:-1,r=45,o=i}t>-1&&(10==n&&(e.line++,e.column=0,this.countLines&&(this.parCurLine=e.line,this.parCurColumn=e.column)),e.column++),i++}while(t>-1)}while(2==r);r>-1?(e.att=e.src.substr(a,o-a),e.offset=o,46==r&&(e.att=e.att.substr(1,e.att.length-2),e.att=e.att.replace(/\\\'/g,"'"))):(e.att=new String,r=-1);
break}return r},_parse:function(e,t,i){var n,r,o,a=[],s=[],l=0,c={la:0,act:0,offset:0,src:e,att:"",line:1,column:1,error_step:0},u=[[0,1],[49,2],[49,0],[51,2],[51,0],[52,3],[52,1],[52,0],[54,3],[54,1],[54,0],[55,3],[56,3],[56,1],[56,0],[58,3],[50,3],[50,5],[50,3],[50,5],[50,9],[50,3],[50,2],[50,2],[50,2],[50,2],[50,3],[50,1],[57,3],[57,4],[57,1],[53,3],[53,3],[53,3],[53,3],[53,3],[53,3],[53,3],[53,1],[61,3],[61,3],[61,2],[61,1],[60,3],[60,3],[60,1],[62,3],[62,3],[62,3],[62,1],[63,3],[63,1],[64,2],[64,2],[64,1],[59,4],[59,4],[59,5],[59,3],[59,1],[65,1],[65,1],[65,1],[65,3],[65,1],[65,7],[65,3],[65,3],[65,1],[65,1]],d=[[],[3,3,5,4,6,5,7,6,9,7,11,8,10,9,18,12,20,13,45,17,31,18,47,22,48,23,38,24,46,25,8,26,14,27,16,28,12,29,13,30,33,33,32,34],[],[31,18,33,33,32,34,47,22,48,23,45,37,38,24,46,25,8,26,14,27,16,28,12,29,13,30],[31,18,33,33,32,34,47,22,48,23,45,37,38,24,46,25,8,26,14,27,16,28,12,29,13,30],[3,3,5,4,6,5,7,6,9,7,11,8,10,9,18,12,20,13,45,17,31,18,47,22,48,23,38,24,46,25,8,26,14,27,16,28,12,29,13,30,33,33,32,34],[38,40],[45,41],[45,42],[3,3,5,4,6,5,7,6,9,7,11,8,10,9,18,12,20,13,45,17,31,18,47,22,48,23,38,24,46,25,8,26,14,27,16,28,12,29,13,30,33,33,32,34],[20,44],[24,45,23,46,26,47,25,48,27,49,28,50,22,51,20,52],[],[],[21,54],[30,55,29,56],[44,57,38,58,16,59],[21,-30],[31,18,33,33,32,34,47,22,48,23,45,37,38,24,46,25,8,26,14,27,16,28,12,29,13,30],[32,61,33,62],[],[35,63,34,64,36,65],[],[],[31,18,33,33,32,34,47,22,48,23,45,37,38,24,46,25,8,26,14,27,16,28,12,29,13,30],[],[38,67],[45,70],[31,18,33,33,32,34,47,22,48,23,45,37,38,24,46,25,8,26,14,27,16,28,12,29,13,30],[],[],[],[37,73],[47,22,48,23,45,37,38,24,46,25,8,26,14,27,16,28,12,29,13,30],[47,22,48,23,45,37,38,24,46,25,8,26,14,27,16,28,12,29,13,30],[24,45,23,46,26,47,25,48,27,49,28,50,22,51,3,3,5,4,6,5,7,6,9,7,11,8,10,9,18,12,20,13,45,17,31,18,47,22,48,23,38,24,46,25,8,26,14,27,16,28,12,29,13,30,33,33,32,34],[44,77,38,58,16,78],[],[24,45,23,46,26,47,25,48,27,49,28,50,22,51,3,3,5,4,6,5,7,6,9,7,11,8,10,9,18,12,20,13,45,17,31,18,47,22,48,23,38,24,46,25,8,26,14,27,16,28,12,29,13,30,33,33,32,34],[5,80],[45,17,47,22,48,23,38,24,46,25,8,26,14,27,16,28,12,29,13,30],[20,83],[],[],[],[31,18,33,33,32,34,47,22,48,23,45,37,38,24,46,25,8,26,14,27,16,28,12,29,13,30],[31,18,33,33,32,34,47,22,48,23,45,37,38,24,46,25,8,26,14,27,16,28,12,29,13,30],[31,18,33,33,32,34,47,22,48,23,45,37,38,24,46,25,8,26,14,27,16,28,12,29,13,30],[31,18,33,33,32,34,47,22,48,23,45,37,38,24,46,25,8,26,14,27,16,28,12,29,13,30],[31,18,33,33,32,34,47,22,48,23,45,37,38,24,46,25,8,26,14,27,16,28,12,29,13,30],[31,18,33,33,32,34,47,22,48,23,45,37,38,24,46,25,8,26,14,27,16,28,12,29,13,30],[31,18,33,33,32,34,47,22,48,23,45,37,38,24,46,25,8,26,14,27,16,28,12,29,13,30],[],[19,91,3,3,5,4,6,5,7,6,9,7,11,8,10,9,18,12,20,13,45,17,31,18,47,22,48,23,38,24,46,25,8,26,14,27,16,28,12,29,13,30,33,33,32,34],[31,18,33,33,32,34,47,22,48,23,45,37,38,24,46,25,8,26,14,27,16,28,12,29,13,30],[33,33,32,34,47,22,48,23,45,37,38,24,46,25,8,26,14,27,16,28,12,29,13,30],[33,33,32,34,47,22,48,23,45,37,38,24,46,25,8,26,14,27,16,28,12,29,13,30],[45,96],[31,18,33,33,32,34,47,22,48,23,45,37,38,24,46,25,8,26,14,27,16,28,12,29,13,30],[33,33,32,34,47,22,48,23,45,37,38,24,46,25,8,26,14,27,16,28,12,29,13,30],[30,55,29,56],[33,33,32,34,47,22,48,23,45,37,38,24,46,25,8,26,14,27,16,28,12,29,13,30],[33,33,32,34,47,22,48,23,45,37,38,24,46,25,8,26,14,27,16,28,12,29,13,30],[33,33,32,34,47,22,48,23,45,37,38,24,46,25,8,26,14,27,16,28,12,29,13,30],[33,33,32,34,47,22,48,23,45,37,38,24,46,25,8,26,14,27,16,28,12,29,13,30],[33,33,32,34,47,22,48,23,45,37,38,24,46,25,8,26,14,27,16,28,12,29,13,30],[39,104,24,45,23,46,26,47,25,48,27,49,28,50,22,51],[45,106],[15,107,40,108],[],[42,109],[17,110,40,111],[24,45,23,46,26,47,25,48,27,49,28,50,22,51],[33,33,32,34,47,22,48,23,45,37,38,24,46,25,8,26,14,27,16,28,12,29,13,30],[44,77,38,58,16,78],[44,77,38,58,16,78],[4,113],[45,114],[33,33,32,34,47,22,48,23,45,37,38,24,46,25,8,26,14,27,16,28,12,29,13,30],[],[31,18,33,33,32,34,47,22,48,23,45,37,38,24,46,25,8,26,14,27,16,28,12,29,13,30],[20,117],[44,57,38,58,16,59],[],[30,55,29,56],[30,55,29,56],[30,55,29,56],[30,55,29,56],[30,55,29,56],[30,55,29,56],[30,55,29,56],[],[],[24,45,23,46,26,47,25,48,27,49,28,50,22,51],[32,61,33,62],[32,61,33,62],[21,-28],[39,118,40,111],[17,119,32,61,33,62],[35,63,34,64,36,65],[35,63,34,64,36,65],[],[],[],[],[39,120,40,121],[],[],[45,70],[31,18,33,33,32,34,47,22,48,23,45,37,38,24,46,25,8,26,14,27,16,28,12,29,13,30],[],[31,18,33,33,32,34,47,22,48,23,45,37,38,24,46,25,8,26,14,27,16,28,12,29,13,30],[],[3,3,5,4,6,5,7,6,9,7,11,8,10,9,18,12,20,13,45,17,31,18,47,22,48,23,38,24,46,25,8,26,14,27,16,28,12,29,13,30,33,33,32,34],[],[17,126,32,61,33,62],[24,45,23,46,26,47,25,48,27,49,28,50,22,51,20,127],[31,18,33,33,32,34,47,22,48,23,45,37,38,24,46,25,8,26,14,27,16,28,12,29,13,30],[47,22,48,23,45,37,38,24,46,25,8,26,14,27,16,28,12,29,13,30],[21,-29],[18,130],[45,131],[],[24,45,23,46,26,47,25,48,27,49,28,50,22,51],[24,45,23,46,26,47,25,48,27,49,28,50,22,51],[],[],[],[24,45,23,46,26,47,25,48,27,49,28,50,22,51,20,132],[44,77,38,58,16,78],[],[],[45,17,47,22,48,23,38,24,46,25,8,26,14,27,16,28,12,29,13,30],[19,135,3,3,5,4,6,5,7,6,9,7,11,8,10,9,18,12,20,13,45,17,31,18,47,22,48,23,38,24,46,25,8,26,14,27,16,28,12,29,13,30,33,33,32,34],[39,136],[],[3,3,5,4,6,5,7,6,9,7,11,8,10,9,18,12,20,13,45,17,31,18,47,22,48,23,38,24,46,25,8,26,14,27,16,28,12,29,13,30,33,33,32,34],[]],h=[[49,1],[50,2,58,10,53,11,57,14,61,15,59,16,60,19,65,20,62,21,63,31,64,32],[],[53,35,61,15,60,19,62,21,63,31,64,32,59,36,65,20],[53,38,61,15,60,19,62,21,63,31,64,32,59,36,65,20],[50,39,58,10,53,11,57,14,61,15,59,16,60,19,65,20,62,21,63,31,64,32],[],[],[],[50,43,58,10,53,11,57,14,61,15,59,16,60,19,65,20,62,21,63,31,64,32],[],[],[51,53],[],[],[],[],[],[61,60,60,19,62,21,63,31,64,32,59,36,65,20],[],[],[],[],[],[53,66,61,15,60,19,62,21,63,31,64,32,59,36,65,20],[],[],[54,68,55,69],[52,71,53,72,61,15,60,19,62,21,63,31,64,32,59,36,65,20],[],[],[],[],[59,74,65,20],[59,75,65,20],[50,76,58,10,53,11,57,14,61,15,59,16,60,19,65,20,62,21,63,31,64,32],[],[],[50,79,58,10,53,11,57,14,61,15,59,16,60,19,65,20,62,21,63,31,64,32],[],[58,81,57,14,59,82,65,20],[],[],[],[],[61,84,60,19,62,21,63,31,64,32,59,36,65,20],[61,85,60,19,62,21,63,31,64,32,59,36,65,20],[61,86,60,19,62,21,63,31,64,32,59,36,65,20],[61,87,60,19,62,21,63,31,64,32,59,36,65,20],[61,88,60,19,62,21,63,31,64,32,59,36,65,20],[61,89,60,19,62,21,63,31,64,32,59,36,65,20],[61,90,60,19,62,21,63,31,64,32,59,36,65,20],[],[50,92,58,10,53,11,57,14,61,15,59,16,60,19,65,20,62,21,63,31,64,32],[53,93,61,15,60,19,62,21,63,31,64,32,59,36,65,20],[60,94,62,21,63,31,64,32,59,36,65,20],[60,95,62,21,63,31,64,32,59,36,65,20],[],[52,97,53,72,61,15,60,19,62,21,63,31,64,32,59,36,65,20],[60,98,62,21,63,31,64,32,59,36,65,20],[],[62,99,63,31,64,32,59,36,65,20],[62,100,63,31,64,32,59,36,65,20],[63,101,64,32,59,36,65,20],[63,102,64,32,59,36,65,20],[63,103,64,32,59,36,65,20],[],[56,105],[],[],[],[],[],[63,112,64,32,59,36,65,20],[],[],[],[],[60,115,62,21,63,31,64,32,59,36,65,20],[],[53,116,61,15,60,19,62,21,63,31,64,32,59,36,65,20],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[55,122],[53,123,61,15,60,19,62,21,63,31,64,32,59,36,65,20],[],[53,124,61,15,60,19,62,21,63,31,64,32,59,36,65,20],[],[50,125,58,10,53,11,57,14,61,15,59,16,60,19,65,20,62,21,63,31,64,32],[],[],[],[53,128,61,15,60,19,62,21,63,31,64,32,59,36,65,20],[59,129,65,20],[],[],[],[],[],[],[],[],[],[],[],[51,133],[],[58,134,57,14,59,82,65,20],[50,92,58,10,53,11,57,14,61,15,59,16,60,19,65,20,62,21,63,31,64,32],[],[],[50,137,58,10,53,11,57,14,61,15,59,16,60,19,65,20,62,21,63,31,64,32],[]],p=[2,0,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,4,27,-1,38,54,62,-1,42,59,45,60,61,-1,64,-1,10,7,68,69,49,51,-1,-1,-1,54,62,-1,-1,-1,-1,22,23,24,-1,-1,-1,-1,-1,-1,-1,25,-1,-1,-1,-1,-1,7,-1,41,-1,-1,-1,-1,-1,-1,14,-1,9,-1,-1,6,-1,52,53,16,-1,-1,18,-1,-1,-1,21,37,36,35,34,33,32,31,26,3,15,40,39,58,-1,-1,44,43,48,47,46,63,-1,13,66,-1,-1,67,-1,50,-1,58,-1,-1,-1,56,55,-1,-1,8,11,5,17,55,19,-1,57,4,12,-1,-1,-1,65,-1,20],f=["Program'","ERROR_RESYNC","WHITESPACE","IF","ELSE","WHILE","DO","FOR","FUNCTION","USE","RETURN","DELETE","TRUE","FALSE","<<",">>","[","]","{","}",";","=","==","!=","~=","<=",">=",">","<","||","&&","!","+","-","/","%","*","^","(",")",",","#",":","|",".","Identifier","String","Integer","Float","Program","Stmt","Stmt_List","Param_List","Expression","Prop_List","Prop","Param_Def_List","Lhs","Assign","ExtValue","AddSubExp","LogExp","MulDivExp","ExpExp","NegExp","Value","$"];for(t||(t=[]),i||(i=[]),a.push(0),s.push(0),c.la=this._lex(c);;){for(c.act=139,o=0;d[a[a.length-1]].length>o;o+=2)if(d[a[a.length-1]][o]==c.la){c.act=d[a[a.length-1]][o+1];break}if(139==c.act&&(0>(c.act=p[a[a.length-1]])?c.act=139:c.act*=-1),139==c.act){if(0==c.error_step)for(l++,t.push({offset:c.offset-c.att.length,line:c.line}),i.push([]),o=0;d[a[a.length-1]].length>o;o+=2)i[i.length-1].push(f[d[a[a.length-1]][o]]);for(;a.length>1&&139==c.act;)for(a.pop(),s.pop(),o=0;d[a[a.length-1]].length>o;o+=2)if(1==d[a[a.length-1]][o]){c.act=d[a[a.length-1]][o+1],a.push(c.act),s.push("");break}if(a.length>1&&139!=c.act){for(;66!=c.la;){for(c.act=139,o=0;d[a[a.length-1]].length>o;o+=2)if(d[a[a.length-1]][o]==c.la){c.act=d[a[a.length-1]][o+1];break}if(139!=c.act)break;for(;0>(c.la=this._lex(c));)c.offset++}for(;66!=c.la&&139==c.act;);}if(139==c.act||66==c.la)break;c.error_step=3}if(c.act>0)a.push(c.act),s.push(c.att),c.la=this._lex(c),c.error_step>0&&c.error_step--;else{switch(n=-1*c.act,r=void 0,n){case 0:r=s[s.length-1];break;case 1:this.execute(s[s.length-1]);break;case 2:r=s[s.length-0];break;case 3:r=this.createNode("node_op","op_none",s[s.length-2],s[s.length-1]);break;case 4:r=s[s.length-0];break;case 5:r=this.createNode("node_op","op_param",s[s.length-1],s[s.length-3]);break;case 6:r=this.createNode("node_op","op_param",s[s.length-1]);break;case 7:r=s[s.length-0];break;case 8:r=this.createNode("node_op","op_proplst",s[s.length-3],s[s.length-1]);break;case 9:r=s[s.length-1];break;case 10:r=s[s.length-0];break;case 11:r=this.createNode("node_op","op_prop",s[s.length-3],s[s.length-1]);break;case 12:r=this.createNode("node_op","op_paramdef",s[s.length-1],s[s.length-3]);break;case 13:r=this.createNode("node_op","op_paramdef",s[s.length-1]);break;case 14:r=s[s.length-0];break;case 15:r=this.createNode("node_op","op_assign",s[s.length-3],s[s.length-1]);break;case 16:r=this.createNode("node_op","op_if",s[s.length-2],s[s.length-1]);break;case 17:r=this.createNode("node_op","op_if_else",s[s.length-4],s[s.length-3],s[s.length-1]);break;case 18:r=this.createNode("node_op","op_while",s[s.length-2],s[s.length-1]);break;case 19:r=this.createNode("node_op","op_do",s[s.length-4],s[s.length-2]);break;case 20:r=this.createNode("node_op","op_for",s[s.length-7],s[s.length-5],s[s.length-3],s[s.length-1]);break;case 21:r=this.createNode("node_op","op_use",s[s.length-2]);break;case 22:r=this.createNode("node_op","op_delete",s[s.length-1]);break;case 23:r=this.createNode("node_op","op_return",s[s.length-1]);break;case 24:r=s[s.length-2];break;case 25:r=this.createNode("node_op","op_noassign",s[s.length-2]);break;case 26:r=s[s.length-2],r.needsBrackets=!0;break;case 27:r=this.createNode("node_op","op_none");break;case 28:r=this.createNode("node_op","op_lhs",s[s.length-1],s[s.length-3],"dot");break;case 29:r=this.createNode("node_op","op_lhs",s[s.length-2],s[s.length-4],"bracket");break;case 30:r=this.createNode("node_op","op_lhs",s[s.length-1]);break;case 31:r=this.createNode("node_op","op_equ",s[s.length-3],s[s.length-1]);break;case 32:r=this.createNode("node_op","op_lot",s[s.length-3],s[s.length-1]);break;case 33:r=this.createNode("node_op","op_grt",s[s.length-3],s[s.length-1]);break;case 34:r=this.createNode("node_op","op_loe",s[s.length-3],s[s.length-1]);break;case 35:r=this.createNode("node_op","op_gre",s[s.length-3],s[s.length-1]);break;case 36:r=this.createNode("node_op","op_neq",s[s.length-3],s[s.length-1]);break;case 37:r=this.createNode("node_op","op_approx",s[s.length-3],s[s.length-1]);break;case 38:r=s[s.length-1];break;case 39:r=this.createNode("node_op","op_or",s[s.length-3],s[s.length-1]);break;case 40:r=this.createNode("node_op","op_and",s[s.length-3],s[s.length-1]);break;case 41:r=this.createNode("node_op","op_not",s[s.length-1]);break;case 42:r=s[s.length-1];break;case 43:r=this.createNode("node_op","op_sub",s[s.length-3],s[s.length-1]);break;case 44:r=this.createNode("node_op","op_add",s[s.length-3],s[s.length-1]);break;case 45:r=s[s.length-1];break;case 46:r=this.createNode("node_op","op_mul",s[s.length-3],s[s.length-1]);break;case 47:r=this.createNode("node_op","op_div",s[s.length-3],s[s.length-1]);break;case 48:r=this.createNode("node_op","op_mod",s[s.length-3],s[s.length-1]);break;case 49:r=s[s.length-1];break;case 50:r=this.createNode("node_op","op_exp",s[s.length-3],s[s.length-1]);break;case 51:r=s[s.length-1];break;case 52:r=this.createNode("node_op","op_neg",s[s.length-1]);break;case 53:r=s[s.length-1];break;case 54:r=s[s.length-1];break;case 55:r=this.createNode("node_op","op_extvalue",s[s.length-4],s[s.length-2]);break;case 56:r=this.createNode("node_op","op_execfun",s[s.length-4],s[s.length-2]);break;case 57:r=this.createNode("node_op","op_execfun",s[s.length-5],s[s.length-3],s[s.length-1]);break;case 58:r=this.createNode("node_op","op_property",s[s.length-3],s[s.length-1]);break;case 59:r=s[s.length-1];break;case 60:r=this.createNode("node_const",s[s.length-1]);break;case 61:r=this.createNode("node_const",s[s.length-1]);break;case 62:r=this.createNode("node_var",s[s.length-1]);break;case 63:r=s[s.length-2];break;case 64:r=this.createNode("node_str",s[s.length-1]);break;case 65:r=this.createNode("node_op","op_function",s[s.length-5],s[s.length-2]);break;case 66:r=this.createNode("node_op","op_proplst_val",s[s.length-2]);break;case 67:r=this.createNode("node_op","op_array",s[s.length-2]);break;case 68:r=this.createNode("node_const_bool",s[s.length-1]);break;case 69:r=this.createNode("node_const_bool",s[s.length-1])}for(o=0;u[n][1]>o;o++)a.pop(),s.pop();for(c.act=139,o=0;h[a[a.length-1]].length>o;o+=2)if(h[a[a.length-1]][o]==u[n][0]){c.act=h[a[a.length-1]][o+1];break}if(0==n)break;a.push(c.act),s.push(r)}}return l}}),JXG.Dump={addMarkers:function(e,t,i){var n,r,o;JXG.isArray(t)||(t=[t]),JXG.isArray(i)||(i=[i]),r=Math.min(t.length,i.length),t.length=r,i.length=r;for(n in e.objects)for(o=0;r>o;o++)e.objects[n][t[o]]=i[o]},deleteMarkers:function(e,t){var i,n,r;JXG.isArray(t)||(t=[t]),n=t.length,t.length=n;for(i in e.objects)for(r=0;n>r;r++)delete e.objects[i][t[r]]},str:function(e){return"string"==typeof e&&"function"!==e.substr(0,7)&&(e="'"+e+"'"),e},minimizeObject:function(e){var t,i,n,r=JXG.deepCopy(e),o=[];for(n=1;arguments.length>n;n++)o.push(arguments[n]);for(n=0;o.length>n;n++)for(t in o[n])i=t.toLowerCase(),"object"!=typeof o[n][t]&&o[n][t]==r[i]&&delete r[i];return r},prepareAttributes:function(e,t){var i,n;i=this.minimizeObject(t.getAttributes(),e.options[t.elType],e.options.elements);for(n in t.subs)i[n]=this.minimizeObject(t.subs[n].getAttributes(),e.options[t.elType][n],e.options[t.subs[n].elType],e.options.elements),i[n].id=t.subs[n].id,i[n].name=t.subs[n].name;return i.id=t.id,i.name=t.name,i},dump:function(e){var t,i,n,r,o=[];this.addMarkers(e,"dumped",!1);for(t in e.objects)if(i=e.objects[t],n={},!i.dumped&&i.dump){for(n.type=i.getType(),n.parents=i.getParents(),"point"===n.type&&1==n.parents[0]&&(n.parents=n.parents.slice(1)),r=0;n.parents.length>r;r++)"string"==typeof n.parents[r]&&(n.parents[r]="'"+n.parents[r]+"'");n.attributes=this.prepareAttributes(e,i),o.push(n)}return this.deleteMarkers(e,"dumped"),o},toJSAN:function(e){var t;switch(typeof e){case"object":if(e){var i=[];if(e instanceof Array){for(t=0;e.length>t;t++)i.push(this.toJSAN(e[t]));return"["+i.join(",")+"]"}for(var n in e)i.push(n+": "+this.toJSAN(e[n]));return"<<"+i.join(", ")+">> "}return"null";case"string":return"'"+e.replace(/(["'])/g,"\\$1")+"'";case"number":case"boolean":return new String(e);case"null":return"null"}},toJessie:function(e){var t,i=this.dump(e),n=[];for(t=0;i.length>t;t++)i[t].attributes.name.length>0&&n.push("// "+i[t].attributes.name),n.push("s"+t+" = "+i[t].type+"("+i[t].parents.join(", ")+") "+this.toJSAN(i[t].attributes).replace(/\n/,"\\n")+";"),n.push("");return n.join("\n")},toJavaScript:function(e){var t,i=this.dump(e),n=[];for(t=0;i.length>t;t++)n.push('board.create("'+i[t].type+'", ['+i[t].parents.join(", ")+"], "+JXG.toJSON(i[t].attributes)+");");return n.join("\n")}},JXG.SVGRenderer=function(e){var t;for(this.type="svg",this.svgRoot=null,this.svgNamespace="http://www.w3.org/2000/svg",this.xlinkNamespace="http://www.w3.org/1999/xlink",this.container=e,this.container.style.MozUserSelect="none",this.container.style.overflow="hidden",""===this.container.style.position&&(this.container.style.position="relative"),this.svgRoot=this.container.ownerDocument.createElementNS(this.svgNamespace,"svg"),this.svgRoot.style.overflow="hidden",this.svgRoot.style.width=JXG.getStyle(this.container,"width"),this.svgRoot.style.height=JXG.getStyle(this.container,"height"),this.container.appendChild(this.svgRoot),this.defs=this.container.ownerDocument.createElementNS(this.svgNamespace,"defs"),this.svgRoot.appendChild(this.defs),this.filter=this.container.ownerDocument.createElementNS(this.svgNamespace,"filter"),this.filter.setAttributeNS(null,"id",this.container.id+"_f1"),this.filter.setAttributeNS(null,"width","300%"),this.filter.setAttributeNS(null,"height","300%"),this.filter.setAttributeNS(null,"filterUnits","userSpaceOnUse"),this.feOffset=this.container.ownerDocument.createElementNS(this.svgNamespace,"feOffset"),this.feOffset.setAttributeNS(null,"result","offOut"),this.feOffset.setAttributeNS(null,"in","SourceAlpha"),this.feOffset.setAttributeNS(null,"dx","5"),this.feOffset.setAttributeNS(null,"dy","5"),this.filter.appendChild(this.feOffset),this.feGaussianBlur=this.container.ownerDocument.createElementNS(this.svgNamespace,"feGaussianBlur"),this.feGaussianBlur.setAttributeNS(null,"result","blurOut"),this.feGaussianBlur.setAttributeNS(null,"in","offOut"),this.feGaussianBlur.setAttributeNS(null,"stdDeviation","3"),this.filter.appendChild(this.feGaussianBlur),this.feBlend=this.container.ownerDocument.createElementNS(this.svgNamespace,"feBlend"),this.feBlend.setAttributeNS(null,"in","SourceGraphic"),this.feBlend.setAttributeNS(null,"in2","blurOut"),this.feBlend.setAttributeNS(null,"mode","normal"),this.filter.appendChild(this.feBlend),this.defs.appendChild(this.filter),this.layer=[],t=0;JXG.Options.layer.numlayers>t;t++)this.layer[t]=this.container.ownerDocument.createElementNS(this.svgNamespace,"g"),this.svgRoot.appendChild(this.layer[t]);this.dashArray=["2, 2","5, 5","10, 10","20, 20","20, 10, 10, 10","20, 5, 10, 5"]},JXG.SVGRenderer.prototype=new JXG.AbstractRenderer,JXG.extend(JXG.SVGRenderer.prototype,{_createArrowHead:function(e,t){var i,n,r=e.id+"Triangle";return JXG.exists(t)&&(r+=t),i=this.createPrim("marker",r),i.setAttributeNS(null,"viewBox","0 0 10 6"),i.setAttributeNS(null,"refY","3"),i.setAttributeNS(null,"markerUnits","userSpaceOnUse"),i.setAttributeNS(null,"markerHeight","12"),i.setAttributeNS(null,"markerWidth","10"),i.setAttributeNS(null,"orient","auto"),i.setAttributeNS(null,"stroke",e.visProp.strokecolor),i.setAttributeNS(null,"stroke-opacity",e.visProp.strokeopacity),i.setAttributeNS(null,"fill",e.visProp.strokecolor),i.setAttributeNS(null,"fill-opacity",e.visProp.strokeopacity),n=this.container.ownerDocument.createElementNS(this.svgNamespace,"path"),"End"===t?(i.setAttributeNS(null,"refX","0"),n.setAttributeNS(null,"d","M 0 3 L 10 6 L 10 0 z")):(i.setAttributeNS(null,"refX","10"),n.setAttributeNS(null,"d","M 0 0 L 10 3 L 0 6 z")),i.appendChild(n),i},_setArrowAtts:function(e,t,i){e&&(e.setAttributeNS(null,"stroke",t),e.setAttributeNS(null,"stroke-opacity",i),e.setAttributeNS(null,"fill",t),e.setAttributeNS(null,"fill-opacity",i))},updateTicks:function(e){var t,i,n,r,o,a="",s=e.ticks.length;for(t=0;s>t;t++)i=e.ticks[t],r=i[0],o=i[1],r[0]!==void 0&&r[1]!==void 0&&(a+="M "+r[0]+" "+o[0]+" L "+r[1]+" "+o[1]+" ");for(t=0;s>t;t++)i=e.ticks[t].scrCoords,e.ticks[t].major&&(e.board.needsFullUpdate||e.needsRegularUpdate)&&e.labels[t]&&e.labels[t].visProp.visible&&this.updateText(e.labels[t]);n=this.getElementById(e.id),JXG.exists(n)||(n=this.createPrim("path",e.id),this.appendChildPrim(n,e.visProp.layer),this.appendNodesToElement(e,"path")),n.setAttributeNS(null,"stroke",e.visProp.strokecolor),n.setAttributeNS(null,"stroke-opacity",e.visProp.strokeopacity),n.setAttributeNS(null,"stroke-width",e.visProp.strokewidth),this.updatePathPrim(n,a,e.board)},displayCopyright:function(e,t){var i,n=this.createPrim("text","licenseText");n.setAttributeNS(null,"x","20px"),n.setAttributeNS(null,"y",2+t+"px"),n.setAttributeNS(null,"style","font-family:Arial,Helvetica,sans-serif; font-size:"+t+"px; fill:#356AA0; opacity:0.3;"),i=document.createTextNode(e),n.appendChild(i),this.appendChildPrim(n,0)},drawInternalText:function(e){var t=this.createPrim("text",e.id);return t.setAttributeNS(null,"class",e.visProp.cssclass),e.rendNodeText=document.createTextNode(""),t.appendChild(e.rendNodeText),this.appendChildPrim(t,e.visProp.layer),t},updateInternalText:function(e){var t=e.plaintext;isNaN(e.coords.scrCoords[1]+e.coords.scrCoords[2])||(e.rendNode.setAttributeNS(null,"x",e.coords.scrCoords[1]+"px"),e.rendNode.setAttributeNS(null,"y",e.coords.scrCoords[2]+.5*this.vOffsetText+"px")),e.htmlStr!==t&&(e.rendNodeText.data=t,e.htmlStr=t),this.transformImage(e,e.transformations)},drawImage:function(e){var t=this.createPrim("image",e.id);t.setAttributeNS(null,"preserveAspectRatio","none"),this.appendChildPrim(t,e.visProp.layer),e.rendNode=t,this.updateImage(e)},transformImage:function(e,t){var i,n,r=e.rendNode,o="",a=t.length;a>0&&(i=this.joinTransforms(e,t),n=[i[1][1],i[2][1],i[1][2],i[2][2],i[1][0],i[2][0]].join(","),o+=" matrix("+n+") ",r.setAttributeNS(null,"transform",o))},updateImageURL:function(e){var t=JXG.evaluate(e.url);e.rendNode.setAttributeNS(this.xlinkNamespace,"xlink:href",t)},appendChildPrim:function(e,t){JXG.exists(t)?t>=JXG.Options.layer.numlayers&&(t=JXG.Options.layer.numlayers-1):t=0,this.layer[t].appendChild(e)},appendNodesToElement:function(e){e.rendNode=this.getElementById(e.id)},createPrim:function(e,t){var i=this.container.ownerDocument.createElementNS(this.svgNamespace,e);return i.setAttributeNS(null,"id",this.container.id+"_"+t),i.style.position="absolute","path"===e&&(i.setAttributeNS(null,"stroke-linecap","butt"),i.setAttributeNS(null,"stroke-linejoin","round")),i},remove:function(e){JXG.exists(e)&&JXG.exists(e.parentNode)&&e.parentNode.removeChild(e)},makeArrows:function(e){var t;(e.visPropOld.firstarrow!==e.visProp.firstarrow||e.visPropOld.lastarrow!==e.visProp.lastarrow)&&(e.visProp.firstarrow?(t=e.rendNodeTriangleStart,JXG.exists(t)||(t=this._createArrowHead(e,"End"),this.defs.appendChild(t),e.rendNodeTriangleStart=t,e.rendNode.setAttributeNS(null,"marker-start","url(#"+this.container.id+"_"+e.id+"TriangleEnd)"))):(t=e.rendNodeTriangleStart,JXG.exists(t)&&this.remove(t)),e.visProp.lastarrow?(t=e.rendNodeTriangleEnd,JXG.exists(t)||(t=this._createArrowHead(e,"Start"),this.defs.appendChild(t),e.rendNodeTriangleEnd=t,e.rendNode.setAttributeNS(null,"marker-end","url(#"+this.container.id+"_"+e.id+"TriangleStart)"))):(t=e.rendNodeTriangleEnd,JXG.exists(t)&&this.remove(t)),e.visPropOld.firstarrow=e.visProp.firstarrow,e.visPropOld.lastarrow=e.visProp.lastarrow)},updateEllipsePrim:function(e,t,i,n,r){e.setAttributeNS(null,"cx",t),e.setAttributeNS(null,"cy",i),e.setAttributeNS(null,"rx",Math.abs(n)),e.setAttributeNS(null,"ry",Math.abs(r))},updateLinePrim:function(e,t,i,n,r){isNaN(t+i+n+r)||(e.setAttributeNS(null,"x1",t),e.setAttributeNS(null,"y1",i),e.setAttributeNS(null,"x2",n),e.setAttributeNS(null,"y2",r))},updatePathPrim:function(e,t){""==t&&(t="M 0 0"),e.setAttributeNS(null,"d",t)},updatePathStringPoint:function(e,t,i){var n="",r=e.coords.scrCoords,o=.5*t*Math.sqrt(3),a=.5*t;return"x"===i?n=" M "+(r[1]-t)+" "+(r[2]-t)+" L "+(r[1]+t)+" "+(r[2]+t)+" M "+(r[1]+t)+" "+(r[2]-t)+" L "+(r[1]-t)+" "+(r[2]+t):"+"===i?n=" M "+(r[1]-t)+" "+r[2]+" L "+(r[1]+t)+" "+r[2]+" M "+r[1]+" "+(r[2]-t)+" L "+r[1]+" "+(r[2]+t):"<>"===i?n=" M "+(r[1]-t)+" "+r[2]+" L "+r[1]+" "+(r[2]+t)+" L "+(r[1]+t)+" "+r[2]+" L "+r[1]+" "+(r[2]-t)+" Z ":"^"===i?n=" M "+r[1]+" "+(r[2]-t)+" L "+(r[1]-o)+" "+(r[2]+a)+" L "+(r[1]+o)+" "+(r[2]+a)+" Z ":"v"===i?n=" M "+r[1]+" "+(r[2]+t)+" L "+(r[1]-o)+" "+(r[2]-a)+" L "+(r[1]+o)+" "+(r[2]-a)+" Z ":">"===i?n=" M "+(r[1]+t)+" "+r[2]+" L "+(r[1]-a)+" "+(r[2]-o)+" L "+(r[1]-a)+" "+(r[2]+o)+" Z ":"<"===i&&(n=" M "+(r[1]-t)+" "+r[2]+" L "+(r[1]+a)+" "+(r[2]-o)+" L "+(r[1]+a)+" "+(r[2]+o)+" Z "),n},updatePathStringPrim:function(e){var t,i,n,r=" M ",o=" L ",a=r,s=5e3,l="",c="plot"!==e.visProp.curvetype;if(0>=e.numberPoints)return"";for(c&&e.board.options.curve.RDPsmoothing&&(e.points=JXG.Math.Numerics.RamerDouglasPeuker(e.points,.5)),n=Math.min(e.points.length,e.numberPoints),t=0;n>t;t++)i=e.points[t].scrCoords,isNaN(i[1])||isNaN(i[2])?a=r:(i[1]>s?i[1]=s:-s>i[1]&&(i[1]=-s),i[2]>s?i[2]=s:-s>i[2]&&(i[2]=-s),l+=[a,i[1]," ",i[2]].join(""),a=o);return l},updatePathStringBezierPrim:function(e){var t,i,n,r,o,a,s=" M ",l=" C ",c=s,u=5e3,d="",h=e.visProp.strokewidth,p="plot"!==e.visProp.curvetype;if(0>=e.numberPoints)return"";for(p&&e.board.options.curve.RDPsmoothing&&(e.points=JXG.Math.Numerics.RamerDouglasPeuker(e.points,.5)),a=Math.min(e.points.length,e.numberPoints),i=1;3>i;i++)for(c=s,t=0;a>t;t++)n=e.points[t].scrCoords,isNaN(n[1])||isNaN(n[2])?c=s:(n[1]>u?n[1]=u:-u>n[1]&&(n[1]=-u),n[2]>u?n[2]=u:-u>n[2]&&(n[2]=-u),d+=c==s?[c,n[1]+0*h*(2*i*Math.random()-i)," ",n[2]+0*h*(2*i*Math.random()-i)].join(""):[c,r+.333*(n[1]-r)+h*(2*i*Math.random()-i)," ",o+.333*(n[2]-o)+h*(2*i*Math.random()-i)," ",r+.333*2*(n[1]-r)+h*(2*i*Math.random()-i)," ",o+.333*2*(n[2]-o)+h*(2*i*Math.random()-i)," ",n[1]," ",n[2]].join(""),c=l,r=n[1],o=n[2]);return d},updatePolygonPrim:function(e,t){var i,n,r="",o=t.vertices.length;for(e.setAttributeNS(null,"stroke","none"),n=0;o-1>n;n++){if(!t.vertices[n].isReal)return e.setAttributeNS(null,"points",""),void 0;i=t.vertices[n].coords.scrCoords,r=r+i[1]+","+i[2],o-2>n&&(r+=" ")}-1==r.indexOf("NaN")&&e.setAttributeNS(null,"points",r)},updateRectPrim:function(e,t,i,n,r){e.setAttributeNS(null,"x",t),e.setAttributeNS(null,"y",i),e.setAttributeNS(null,"width",n),e.setAttributeNS(null,"height",r)},setPropertyPrim:function(e,t,i){"stroked"!==t&&e.setAttributeNS(null,t,i)},show:function(e){var t;e&&e.rendNode&&(t=e.rendNode,t.setAttributeNS(null,"display","inline"),t.style.visibility="inherit")},hide:function(e){var t;e&&e.rendNode&&(t=e.rendNode,t.setAttributeNS(null,"display","none"),t.style.visibility="hidden")},setBuffering:function(e,t){e.rendNode.setAttribute("buffered-rendering",t)},setDashStyle:function(e){var t=e.visProp.dash,i=e.rendNode;e.visProp.dash>0?i.setAttributeNS(null,"stroke-dasharray",this.dashArray[t-1]):i.hasAttributeNS(null,"stroke-dasharray")&&i.removeAttributeNS(null,"stroke-dasharray")},setGradient:function(e){var t,i,n,r,o,a,s,l,c,u=e.rendNode;i=JXG.evaluate(e.visProp.fillopacity),i=i>0?i:0,t=JXG.evaluate(e.visProp.fillcolor),"linear"===e.visProp.gradient?(n=this.createPrim("linearGradient",e.id+"_gradient"),a="0%",s="100%",l="0%",c="0%",n.setAttributeNS(null,"x1",a),n.setAttributeNS(null,"x2",s),n.setAttributeNS(null,"y1",l),n.setAttributeNS(null,"y2",c),r=this.createPrim("stop",e.id+"_gradient1"),r.setAttributeNS(null,"offset","0%"),r.setAttributeNS(null,"style","stop-color:"+t+";stop-opacity:"+i),o=this.createPrim("stop",e.id+"_gradient2"),o.setAttributeNS(null,"offset","100%"),o.setAttributeNS(null,"style","stop-color:"+e.visProp.gradientsecondcolor+";stop-opacity:"+e.visProp.gradientsecondopacity),n.appendChild(r),n.appendChild(o),this.defs.appendChild(n),u.setAttributeNS(null,"style","fill:url(#"+this.container.id+"_"+e.id+"_gradient)"),e.gradNode1=r,e.gradNode2=o):"radial"===e.visProp.gradient?(n=this.createPrim("radialGradient",e.id+"_gradient"),n.setAttributeNS(null,"cx","50%"),n.setAttributeNS(null,"cy","50%"),n.setAttributeNS(null,"r","50%"),n.setAttributeNS(null,"fx",100*e.visProp.gradientpositionx+"%"),n.setAttributeNS(null,"fy",100*e.visProp.gradientpositiony+"%"),r=this.createPrim("stop",e.id+"_gradient1"),r.setAttributeNS(null,"offset","0%"),r.setAttributeNS(null,"style","stop-color:"+e.visProp.gradientsecondcolor+";stop-opacity:"+e.visProp.gradientsecondopacity),o=this.createPrim("stop",e.id+"_gradient2"),o.setAttributeNS(null,"offset","100%"),o.setAttributeNS(null,"style","stop-color:"+t+";stop-opacity:"+i),n.appendChild(r),n.appendChild(o),this.defs.appendChild(n),u.setAttributeNS(null,"style","fill:url(#"+this.container.id+"_"+e.id+"_gradient)"),e.gradNode1=r,e.gradNode2=o):u.removeAttributeNS(null,"style")},updateGradient:function(e){var t,i,n=e.gradNode1,r=e.gradNode2;JXG.exists(n)&&JXG.exists(r)&&(i=JXG.evaluate(e.visProp.fillopacity),i=i>0?i:0,t=JXG.evaluate(e.visProp.fillcolor),"linear"===e.visProp.gradient?(n.setAttributeNS(null,"style","stop-color:"+t+";stop-opacity:"+i),r.setAttributeNS(null,"style","stop-color:"+e.visProp.gradientsecondcolor+";stop-opacity:"+e.visProp.gradientsecondopacity)):"radial"===e.visProp.gradient&&(n.setAttributeNS(null,"style","stop-color:"+e.visProp.gradientsecondcolor+";stop-opacity:"+e.visProp.gradientsecondopacity),r.setAttributeNS(null,"style","stop-color:"+t+";stop-opacity:"+i)))},setObjectFillColor:function(e,t,i){var n,r,o,a,s=JXG.evaluate(t),l=JXG.evaluate(i);l=l>0?l:0,(e.visPropOld.fillcolor!==s||e.visPropOld.fillopacity!==l)&&(JXG.exists(s)&&s!==!1&&(9!=s.length?(r=s,a=l):(o=JXG.rgba2rgbo(s),r=o[0],a=l*o[1]),n=e.rendNode,n.setAttributeNS(null,"fill",r),e.type===JXG.OBJECT_TYPE_IMAGE?n.setAttributeNS(null,"opacity",a):n.setAttributeNS(null,"fill-opacity",a),JXG.exists(e.visProp.gradient)&&this.updateGradient(e)),e.visPropOld.fillcolor=s,e.visPropOld.fillopacity=l)},setObjectStrokeColor:function(e,t,i){var n,r,o,a,s=JXG.evaluate(t),l=JXG.evaluate(i);l=l>0?l:0,(e.visPropOld.strokecolor!==s||e.visPropOld.strokeopacity!==l)&&(JXG.exists(s)&&s!==!1&&(9!=s.length?(n=s,o=l):(r=JXG.rgba2rgbo(s),n=r[0],o=l*r[1]),a=e.rendNode,e.type===JXG.OBJECT_TYPE_TEXT?"html"===e.visProp.display?(a.style.color=n,a.style.opacity=o):(a.setAttributeNS(null,"style","fill:"+n),a.setAttributeNS(null,"style","fill-opacity:"+o)):(a.setAttributeNS(null,"stroke",n),a.setAttributeNS(null,"stroke-opacity",o)),e.type===JXG.OBJECT_TYPE_ARROW?this._setArrowAtts(e.rendNodeTriangle,n,o):(e.elementClass===JXG.OBJECT_CLASS_CURVE||e.elementClass===JXG.OBJECT_CLASS_LINE)&&(e.visProp.firstarrow&&this._setArrowAtts(e.rendNodeTriangleStart,n,o),e.visProp.lastarrow&&this._setArrowAtts(e.rendNodeTriangleEnd,n,o))),e.visPropOld.strokecolor=s,e.visPropOld.strokeopacity=l)},setObjectStrokeWidth:function(e,t){var i,n=JXG.evaluate(t);e.visPropOld.strokewidth!==n&&(i=e.rendNode,this.setPropertyPrim(i,"stroked","true"),JXG.exists(n)&&this.setPropertyPrim(i,"stroke-width",n+"px"),e.visPropOld.strokewidth=n)},setShadow:function(e){e.visPropOld.shadow!==e.visProp.shadow&&(JXG.exists(e.rendNode)&&(e.visProp.shadow?e.rendNode.setAttributeNS(null,"filter","url(#"+this.container.id+"_f1)"):e.rendNode.removeAttributeNS(null,"filter")),e.visPropOld.shadow=e.visProp.shadow)},suspendRedraw:function(){},unsuspendRedraw:function(){},resize:function(e,t){this.svgRoot.style.width=parseFloat(e)+"px",this.svgRoot.style.height=parseFloat(t)+"px"}}),JXG.VMLRenderer=function(e){this.type="vml",this.container=e,this.container.style.overflow="hidden",this.container.onselectstart=function(){return!1},this.resolution=10,JXG.exists(JXG.vmlStylesheet)||(e.ownerDocument.namespaces.add("jxgvml","urn:schemas-microsoft-com:vml"),JXG.vmlStylesheet=this.container.ownerDocument.createStyleSheet(),JXG.vmlStylesheet.addRule(".jxgvml","behavior:url(#default#VML)"));
try{!e.ownerDocument.namespaces.jxgvml&&e.ownerDocument.namespaces.add("jxgvml","urn:schemas-microsoft-com:vml"),this.createNode=function(t){return e.ownerDocument.createElement("')}}catch(t){this.createNode=function(t){return e.ownerDocument.createElement("<"+t+' xmlns="urn:schemas-microsoft.com:vml" class="jxgvml">')}}this.dashArray=["Solid","1 1","ShortDash","Dash","LongDash","ShortDashDot","LongDashDot"]},JXG.VMLRenderer.prototype=new JXG.AbstractRenderer,JXG.extend(JXG.VMLRenderer.prototype,{_setAttr:function(e,t,i,n){try{8===document.documentMode?e[t]=i:e.setAttribute(t,i,n)}catch(r){JXG.debug("_setAttr: "+t+" "+i+"
\n")}},updateTicks:function(e){var t,i,n,r,o=[],a=this.resolution;for(i=e.ticks.length,t=0;i>t;t++)n=e.ticks[t],x=n[0],y=n[1],x[0]!==void 0&&x[1]!==void 0&&o.push(" m "+Math.round(a*x[0])+", "+Math.round(a*y[0])+" l "+Math.round(a*x[1])+", "+Math.round(a*y[1])+" ");for(t=0;i>t;t++)n=e.ticks[t].scrCoords,e.ticks[t].major&&(e.board.needsFullUpdate||e.needsRegularUpdate)&&e.labels[t]&&e.labels[t].visProp.visible&&this.updateText(e.labels[t]);JXG.exists(e)||(r=this.createPrim("path",e.id),this.appendChildPrim(r,e.visProp.layer),this.appendNodesToElement(e,"path")),this._setAttr(e.rendNode,"stroked","true"),this._setAttr(e.rendNode,"strokecolor",e.visProp.strokecolor,1),this._setAttr(e.rendNode,"strokeweight",e.visProp.strokewidth),this._setAttr(e.rendNodeStroke,"opacity",100*e.visProp.strokeopacity+"%"),this.updatePathPrim(e.rendNode,o,e.board)},displayCopyright:function(e,t){var i,n;i=this.createNode("textbox"),i.style.position="absolute",this._setAttr(i,"id",this.container.id+"_licenseText"),i.style.left=20,i.style.top=2,i.style.fontSize=t,i.style.color="#356AA0",i.style.fontFamily="Arial,Helvetica,sans-serif",this._setAttr(i,"opacity","30%"),i.style.filter="alpha(opacity = 30)",n=document.createTextNode(e),i.appendChild(n),this.appendChildPrim(i,0)},drawInternalText:function(e){var t;return t=this.createNode("textbox"),t.style.position="absolute",e.rendNodeText=document.createTextNode(""),t.appendChild(e.rendNodeText),this.appendChildPrim(t,9),t},updateInternalText:function(e){var t=e.plaintext;isNaN(e.coords.scrCoords[1]+e.coords.scrCoords[2])||(e.rendNode.style.left=parseInt(e.coords.scrCoords[1])+"px",e.rendNode.style.top=parseInt(e.coords.scrCoords[2]-parseInt(e.visProp.fontsize)+this.vOffsetText)+"px"),e.htmlStr!==t&&(e.rendNodeText.data=t,e.htmlStr=t),this.transformImage(e,e.transformations)},drawImage:function(e){var t;t=this.container.ownerDocument.createElement("img"),t.style.position="absolute",this._setAttr(t,"id",this.container.id+"_"+e.id),this.container.appendChild(t),this.appendChildPrim(t,e.visProp.layer),t.style.filter="progid:DXImageTransform.Microsoft.Matrix(M11='1.0', sizingMethod='auto expand')",e.rendNode=t,this.updateImage(e)},transformImage:function(e,t){var i,n,r,o,a,s,l,c=e.rendNode,u=[],d=t.length;if(e.type===JXG.OBJECT_TYPE_TEXT&&e.updateSize(),d>0){for(l=""+e.rendNode.style.filter,l.match(/DXImageTransform/)||(c.style.filter="progid:DXImageTransform.Microsoft.Matrix(M11='1.0', sizingMethod='auto expand') "+l),i=this.joinTransforms(e,t),u[0]=JXG.Math.matVecMult(i,e.coords.scrCoords),u[0][1]/=u[0][0],u[0][2]/=u[0][0],u[1]=JXG.Math.matVecMult(i,[1,e.coords.scrCoords[1]+e.size[0],e.coords.scrCoords[2]]),u[1][1]/=u[1][0],u[1][2]/=u[1][0],u[2]=JXG.Math.matVecMult(i,[1,e.coords.scrCoords[1]+e.size[0],e.coords.scrCoords[2]-e.size[1]]),u[2][1]/=u[2][0],u[2][2]/=u[2][0],u[3]=JXG.Math.matVecMult(i,[1,e.coords.scrCoords[1],e.coords.scrCoords[2]-e.size[1]]),u[3][1]/=u[3][0],u[3][2]/=u[3][0],n=u[0][1],o=u[0][1],r=u[0][2],a=u[0][2],s=1;4>s;s++)n=Math.max(n,u[s][1]),o=Math.min(o,u[s][1]),r=Math.max(r,u[s][2]),a=Math.min(a,u[s][2]);c.style.left=parseInt(o)+"px",c.style.top=parseInt(a)+"px",c.filters.item(0).M11=i[1][1],c.filters.item(0).M12=i[1][2],c.filters.item(0).M21=i[2][1],c.filters.item(0).M22=i[2][2]}},updateImageURL:function(e){var t=JXG.evaluate(e.url);this._setAttr(e.rendNode,"src",t)},appendChildPrim:function(e,t){JXG.exists(t)||(t=0),e.style.zIndex=t,this.container.appendChild(e)},appendNodesToElement:function(e,t){("shape"===t||"path"===t||"polygon"===t)&&(e.rendNodePath=this.getElementById(e.id+"_path")),e.rendNodeFill=this.getElementById(e.id+"_fill"),e.rendNodeStroke=this.getElementById(e.id+"_stroke"),e.rendNodeShadow=this.getElementById(e.id+"_shadow"),e.rendNode=this.getElementById(e.id)},createPrim:function(e,t){var i,n,r=this.createNode("fill"),o=this.createNode("stroke"),a=this.createNode("shadow");return this._setAttr(r,"id",this.container.id+"_"+t+"_fill"),this._setAttr(o,"id",this.container.id+"_"+t+"_stroke"),this._setAttr(a,"id",this.container.id+"_"+t+"_shadow"),"circle"===e||"ellipse"===e?(i=this.createNode("oval"),i.appendChild(r),i.appendChild(o),i.appendChild(a)):"polygon"===e||"path"===e||"shape"===e||"line"===e?(i=this.createNode("shape"),i.appendChild(r),i.appendChild(o),i.appendChild(a),n=this.createNode("path"),this._setAttr(n,"id",this.container.id+"_"+t+"_path"),i.appendChild(n)):(i=this.createNode(e),i.appendChild(r),i.appendChild(o),i.appendChild(a)),i.style.position="absolute",i.style.left="0px",i.style.top="0px",this._setAttr(i,"id",this.container.id+"_"+t),i},remove:function(e){JXG.exists(e)&&e.removeNode(!0)},makeArrows:function(e){var t;(e.visPropOld.firstarrow!==e.visProp.firstarrow||e.visPropOld.lastarrow!==e.visProp.lastarrow)&&(e.visProp.firstarrow?(t=e.rendNodeStroke,this._setAttr(t,"startarrow","block"),this._setAttr(t,"startarrowlength","long")):(t=e.rendNodeStroke,JXG.exists(t)&&this._setAttr(t,"startarrow","none")),e.visProp.lastarrow?(t=e.rendNodeStroke,this._setAttr(t,"id",this.container.id+"_"+e.id+"stroke"),this._setAttr(t,"endarrow","block"),this._setAttr(t,"endarrowlength","long")):(t=e.rendNodeStroke,JXG.exists(t)&&this._setAttr(t,"endarrow","none")),e.visPropOld.firstarrow=e.visProp.firstarrow,e.visPropOld.lastarrow=e.visProp.lastarrow)},updateEllipsePrim:function(e,t,i,n,r){e.style.left=parseInt(t-n)+"px",e.style.top=parseInt(i-r)+"px",e.style.width=parseInt(2*Math.abs(n))+"px",e.style.height=parseInt(2*Math.abs(r))+"px"},updateLinePrim:function(e,t,i,n,r,o){var a,s=this.resolution;isNaN(t+i+n+r)||(a=["m ",parseInt(s*t),", ",parseInt(s*i)," l ",parseInt(s*n),", ",parseInt(s*r)],this.updatePathPrim(e,a,o))},updatePathPrim:function(e,t,i){var n=i.canvasWidth,r=i.canvasHeight;0>=t.length&&(t=["m 0,0"]),e.style.width=n,e.style.height=r,this._setAttr(e,"coordsize",[parseInt(this.resolution*n),parseInt(this.resolution*r)].join(",")),this._setAttr(e,"path",t.join(""))},updatePathStringPoint:function(e,t,i){var n=[],r=Math.round,o=e.coords.scrCoords,a=.5*t*Math.sqrt(3),s=.5*t,l=this.resolution;return"x"===i?n.push([" m ",r(l*(o[1]-t)),", ",r(l*(o[2]-t))," l ",r(l*(o[1]+t)),", ",r(l*(o[2]+t))," m ",r(l*(o[1]+t)),", ",r(l*(o[2]-t))," l ",r(l*(o[1]-t)),", ",r(l*(o[2]+t))].join("")):"+"===i?n.push([" m ",r(l*(o[1]-t)),", ",r(l*o[2])," l ",r(l*(o[1]+t)),", ",r(l*o[2])," m ",r(l*o[1]),", ",r(l*(o[2]-t))," l ",r(l*o[1]),", ",r(l*(o[2]+t))].join("")):"<>"===i?n.push([" m ",r(l*(o[1]-t)),", ",r(l*o[2])," l ",r(l*o[1]),", ",r(l*(o[2]+t))," l ",r(l*(o[1]+t)),", ",r(l*o[2])," l ",r(l*o[1]),", ",r(l*(o[2]-t))," x e "].join("")):"^"===i?n.push([" m ",r(l*o[1]),", ",r(l*(o[2]-t))," l ",r(l*(o[1]-a)),", ",r(l*(o[2]+s))," l ",r(l*(o[1]+a)),", ",r(l*(o[2]+s))," x e "].join("")):"v"===i?n.push([" m ",r(l*o[1]),", ",r(l*(o[2]+t))," l ",r(l*(o[1]-a)),", ",r(l*(o[2]-s))," l ",r(l*(o[1]+a)),", ",r(l*(o[2]-s))," x e "].join("")):">"===i?n.push([" m ",r(l*(o[1]+t)),", ",r(l*o[2])," l ",r(l*(o[1]-s)),", ",r(l*(o[2]-a))," l ",r(l*(o[1]-s)),", ",r(l*(o[2]+a))," l ",r(l*(o[1]+t)),", ",r(l*o[2])].join("")):"<"===i&&n.push([" m ",r(l*(o[1]-t)),", ",r(l*o[2])," l ",r(l*(o[1]+s)),", ",r(l*(o[2]-a))," l ",r(l*(o[1]+s)),", ",r(l*(o[2]+a))," x e "].join("")),n},updatePathStringPrim:function(e){var t,i,n=[],r=this.resolution,o=Math.round,a=" m ",s=" l ",l=a,c="plot"!==e.visProp.curvetype,u=Math.min(e.numberPoints,8192);if(0>=e.numberPoints)return"";for(c&&e.board.options.curve.RDPsmoothing&&(e.points=JXG.Math.Numerics.RamerDouglasPeuker(e.points,1)),u=Math.min(u,e.points.length),t=0;u>t;t++)i=e.points[t].scrCoords,isNaN(i[1])||isNaN(i[2])?l=a:(i[1]>2e4?i[1]=2e4:-2e4>i[1]&&(i[1]=-2e4),i[2]>2e4?i[2]=2e4:-2e4>i[2]&&(i[2]=-2e4),n.push([l,o(r*i[1]),", ",o(r*i[2])].join("")),l=s);return n.push(" e"),n},updatePathStringBezierPrim:function(e){var t,i,n,r,o,a=[],s=e.visProp.strokewidth,l=this.resolution,c=Math.round,u=" m ",d=" c ",h=u,p="plot"!==e.visProp.curvetype,f=Math.min(e.numberPoints,8192);if(0>=e.numberPoints)return"";for(p&&e.board.options.curve.RDPsmoothing&&(e.points=JXG.Math.Numerics.RamerDouglasPeuker(e.points,1)),f=Math.min(f,e.points.length),i=1;3>i;i++)for(h=u,t=0;f>t;t++)n=e.points[t].scrCoords,isNaN(n[1])||isNaN(n[2])?h=u:(n[1]>2e4?n[1]=2e4:-2e4>n[1]&&(n[1]=-2e4),n[2]>2e4?n[2]=2e4:-2e4>n[2]&&(n[2]=-2e4),h==u?a.push([h,c(l*(n[1]+0*s*(2*i*Math.random()-i)))," ",c(l*(n[2]+0*s*(2*i*Math.random()-i)))].join("")):a.push([h,c(l*(r+.333*(n[1]-r)+s*(2*i*Math.random()-i)))," ",c(l*(o+.333*(n[2]-o)+s*(2*i*Math.random()-i)))," ",c(l*(r+.333*2*(n[1]-r)+s*(2*i*Math.random()-i)))," ",c(l*(o+.333*2*(n[2]-o)+s*(2*i*Math.random()-i)))," ",c(l*n[1])," ",c(l*n[2])].join("")),h=d,r=n[1],o=n[2]);return a.push(" e"),a},updatePolygonPrim:function(e,t){var i,n,r=t.vertices.length,o=this.resolution,a=[];if(this._setAttr(e,"stroked","false"),n=t.vertices[0].coords.scrCoords,!isNaN(n[1]+n[2])){for(a.push(["m ",parseInt(o*n[1]),",",parseInt(o*n[2])," l "].join("")),i=1;r-1>i;i++){if(!t.vertices[i].isReal)return this.updatePathPrim(e,"",t.board),void 0;if(n=t.vertices[i].coords.scrCoords,isNaN(n[1]+n[2]))return;a.push(parseInt(o*n[1])+","+parseInt(o*n[2])),r-2>i&&a.push(", ")}a.push(" x e"),this.updatePathPrim(e,a,t.board)}},updateRectPrim:function(e,t,i,n,r){e.style.left=parseInt(t)+"px",e.style.top=parseInt(i)+"px",n>=0&&(e.style.width=n+"px"),r>=0&&(e.style.height=r+"px")},setPropertyPrim:function(e,t,i){var n,r="";switch(t){case"stroke":r="strokecolor";break;case"stroke-width":r="strokeweight";break;case"stroke-dasharray":r="dashstyle"}""!==r&&(n=JXG.evaluate(i),this._setAttr(e,r,n))},show:function(e){e&&e.rendNode&&(e.rendNode.style.visibility="inherit")},hide:function(e){e&&e.rendNode&&(e.rendNode.style.visibility="hidden")},setDashStyle:function(e,t){var i;t.dash>=0&&(i=e.rendNodeStroke,this._setAttr(i,"dashstyle",this.dashArray[t.dash]))},setGradient:function(e){var t=e.rendNodeFill;"linear"===e.visProp.gradient?(this._setAttr(t,"type","gradient"),this._setAttr(t,"color2",e.visProp.gradientsecondcolor),this._setAttr(t,"opacity2",e.visProp.gradientsecondopacity),this._setAttr(t,"angle",e.visProp.gradientangle)):"radial"===e.visProp.gradient?(this._setAttr(t,"type","gradientradial"),this._setAttr(t,"color2",e.visProp.gradientsecondcolor),this._setAttr(t,"opacity2",e.visProp.gradientsecondopacity),this._setAttr(t,"focusposition",100*e.visProp.gradientpositionx+"%,"+100*e.visProp.gradientpositiony+"%"),this._setAttr(t,"focussize","0,0")):this._setAttr(t,"type","solid")},setObjectFillColor:function(e,t,i){var n,r,o,a,s=JXG.evaluate(t),l=JXG.evaluate(i);e.rendNode,l=l>0?l:0,(e.visPropOld.fillcolor!==s||e.visPropOld.fillopacity!==l)&&(JXG.exists(s)&&s!==!1&&(9!=s.length?(n=s,o=l):(r=JXG.rgba2rgbo(s),n=r[0],o=l*r[1]),"none"===n||n===!1?this._setAttr(e.rendNode,"filled","false"):(this._setAttr(e.rendNode,"filled","true"),this._setAttr(e.rendNode,"fillcolor",n),JXG.exists(o)&&e.rendNodeFill&&this._setAttr(e.rendNodeFill,"opacity",100*o+"%")),e.type===JXG.OBJECT_TYPE_IMAGE&&(a=""+e.rendNode.style.filter,a.match(/alpha/)?e.rendNode.style.filter=a.replace(/alpha\(opacity *= *[0-9\.]+\)/,"alpha(opacity = "+100*o+")"):e.rendNode.style.filter+=" alpha(opacity = "+100*o+")")),e.visPropOld.fillcolor=s,e.visPropOld.fillopacity=l)},setObjectStrokeColor:function(e,t,i){var n,r,o,a,s=JXG.evaluate(t),l=JXG.evaluate(i),c=e.rendNode;l=l>0?l:0,(e.visPropOld.strokecolor!==s||e.visPropOld.strokeopacity!==l)&&(JXG.exists(s)&&s!==!1&&(9!=s.length?(n=s,o=l):(r=JXG.rgba2rgbo(s),n=r[0],o=l*r[1]),e.type===JXG.OBJECT_TYPE_TEXT?(o=Math.round(100*o),c.style.filter=" alpha(opacity = "+o+")",c.style.color=n):(n!==!1&&(this._setAttr(c,"stroked","true"),this._setAttr(c,"strokecolor",n)),a=e.rendNodeStroke,JXG.exists(o)&&e.type!==JXG.OBJECT_TYPE_IMAGE&&this._setAttr(a,"opacity",100*o+"%"))),e.visPropOld.strokecolor=s,e.visPropOld.strokeopacity=l)},setObjectStrokeWidth:function(e,t){var i,n=JXG.evaluate(t);e.visPropOld.strokewidth!==n&&(i=e.rendNode,this.setPropertyPrim(i,"stroked","true"),JXG.exists(n)&&this.setPropertyPrim(i,"stroke-width",n),e.visPropOld.strokewidth=n)},setShadow:function(e){var t=e.rendNodeShadow;t&&e.visPropOld.shadow!==e.visProp.shadow&&(e.visProp.shadow?(this._setAttr(t,"On","True"),this._setAttr(t,"Offset","3pt,3pt"),this._setAttr(t,"Opacity","60%"),this._setAttr(t,"Color","#aaaaaa")):this._setAttr(t,"On","False"),e.visPropOld.shadow=e.visProp.shadow)},suspendRedraw:function(){this.container.style.display="none"},unsuspendRedraw:function(){this.container.style.display=""}}),JXG.CanvasRenderer=function(e){this.type="canvas",this.canvasRoot=null,this.suspendHandle=null,this.canvasId=JXG.Util.genUUID(),this.canvasNamespace=null,this.container=e,this.container.style.MozUserSelect="none",this.container.style.overflow="hidden",""===this.container.style.position&&(this.container.style.position="relative"),this.container.innerHTML=['