]> source.dussan.org Git - svg.js.git/commitdiff
Added SVG.Circle, removed structural internal references
authorwout <wout@impinc.co.uk>
Wed, 25 Jun 2014 13:05:03 +0000 (15:05 +0200)
committerwout <wout@impinc.co.uk>
Wed, 25 Jun 2014 13:05:03 +0000 (15:05 +0200)
24 files changed:
CHANGELOG.md
README.md
dist/svg.js
dist/svg.min.js
spec/index.html
spec/spec/adopter.js
spec/spec/circle.js [new file with mode: 0644]
spec/spec/container.js
spec/spec/ellipse.js
spec/spec/path.js
spec/spec/polygon.js
spec/spec/polyline.js
src/adopter.js
src/array.js
src/doc.js
src/element.js
src/ellipse.js
src/path.js
src/patharray.js
src/pointarray.js
src/poly.js
src/rect.js
src/sugar.js
src/svg.js

index 2454b6ba33ac5249f4a2b9ca39b6e431f81a69f8..fa99b39ae5d86ac2876f48b25857baa1e7b9690c 100755 (executable)
@@ -1,6 +1,7 @@
-# 1.0.0-rc.10 (?/?/2014)
+# 1.0.0-rc.10 (?/07/2014)
 
-- remove structural references everywhere
+- remove structural internal references everywhere
+- changed `parent` reference on elements to `parent()` method
 - rework transformation to be chainable and more true to native SVG -> __TODO!__
 - implement an SVG adoption system to be able to manipulate existing SVG's not created with svg.js
 - fixed a bug in clipping and masking where empty nodes persists after removal -> __TODO!__
@@ -8,6 +9,10 @@
 - using `CustomEvent` instead of `Event` to be able to fire events with a `detail` object [thanks @Fuzzyma]
 - added polyfill for IE9 and IE10 custom events [thanks @Fuzzyma]
 - added DOM query selector with the `select()` method globally or on parent elements
+- added the intentionally neglected `SVG.Circle` element
+- fixed bug in `radius()` method when `y` value equals `0`
+- added `rx()` and `ry()` to `SVG.Rect`, `SVG.Circle`, `SVG.Ellispe` and `SVG.FX`
+- changed `array` reference to `array()` method on `SVG.Polyline`, `SVG.Polygon` and `SVG.Path`
 
 # 1.0.0-rc.9 (17/06/2014)
 
index f83ff51452616985e1b8f0b40f9aa34f5bbbf2d7..8969b20f28f2f7b6bcc3db7169925b1f0c61bc1e 100755 (executable)
--- a/README.md
+++ b/README.md
@@ -306,6 +306,15 @@ polyline.animate(3000).plot([[0,0], [100,50], [50,100], [150,50], [200,50], [250
 
 __`returns`: `itself`__
 
+### array()
+References the `SVG.PointArray` instance. This method is rather intended for internal use:
+
+```javascript
+polyline.array()
+```
+
+__`returns`: `SVG.PointArray`__
+
 ## Polygon
 The polygon element, unlike the polyline element, defines a closed shape consisting of a set of connected straight line segments:
 
@@ -335,6 +344,15 @@ polygon.animate(3000).plot([[0,0], [100,50], [50,100], [150,50], [200,50], [250,
 
 __`returns`: `itself`__
 
+### array()
+References the `SVG.PointArray` instance. This method is rather intended for internal use:
+
+```javascript
+polygon.array()
+```
+
+__`returns`: `SVG.PointArray`__
+
 ## Path
 The path string is similar to the polygon string but much more complex in order to support curves:
 
@@ -358,6 +376,15 @@ path.plot('M100,200L300,400')
 
 __`returns`: `itself`__
 
+### array()
+References the `SVG.PathArray` instance. This method is rather intended for internal use:
+
+```javascript
+path.array()
+```
+
+__`returns`: `SVG.PathArray`__
+
 ## Image
 Creating images is as you might expect:
 
@@ -2854,7 +2881,7 @@ new SVG.PointArray([
 Note that every instance of `SVG.Polyline` and `SVG.Polygon` carries a reference to the `SVG.PointArray` instance:
 
 ```javascript
-polygon.array //-> returns the SVG.PointArray instance
+polygon.array() //-> returns the SVG.PointArray instance
 ```
 
 _Javascript inheritance stack: `SVG.PointArray` < `SVG.Array`_
@@ -2889,7 +2916,7 @@ new SVG.PathArray([
 Note that every instance of `SVG.Path` carries a reference to the `SVG.PathArray` instance:
 
 ```javascript
-path.array //-> returns the SVG.PathArray instance
+path.array() //-> returns the SVG.PathArray instance
 ```
 
 #### Syntax
@@ -3168,7 +3195,7 @@ All contributions are very welcome but please make sure you:
   - single __quotes__
   - use one line __comments__ to describe any additions
   - look around and you'll know what to do
-- write at least one spec example per implementation or modification
+- __write at least one spec example per implementation or modification__
 
 Before running the specs you will need to build the library.
 Be aware that pull requests without specs will be declined.
index 70f16939cbcb9f471644a91fb895b6f8bfaf899b..4bb77c4376f14d335932c9c36d127b4c571d30ba 100755 (executable)
@@ -1,4 +1,4 @@
-/* svg.js 1.0.0-rc.10-9-g1953dbc - svg inventor adopter regex utilities default color array pointarray patharray number viewbox bbox rbox element parent container fx relative event defs group arrange mask clip gradient pattern doc spof shape symbol use rect ellipse line poly path image text textpath nested hyperlink marker sugar set data memory selector loader helpers polyfill - svgjs.com/license */
+/* svg.js 1.0.0-rc.10-11-gec21f49 - svg inventor adopter regex utilities default color array pointarray patharray number viewbox bbox rbox element parent container fx relative event defs group arrange mask clip gradient pattern doc spof shape symbol use rect ellipse line poly path image text textpath nested hyperlink marker sugar set data memory selector loader helpers polyfill - svgjs.com/license */
 ;(function() {
 
   var SVG = this.SVG = function(element) {
@@ -22,7 +22,7 @@
   
   // Get next named element id
   SVG.eid = function(name) {
-    return 'Svgjs' + name.charAt(0).toUpperCase() + name.slice(1) + (SVG.did++)
+    return 'Svgjs' + capitalize(name) + (SVG.did++)
   }
   
   // Method for element creation
       element = new SVG[capitalize(node.nodeName)]
   
     // Ensure references
-    element.type = node.nodeName
-    element.node = node
-    return node.instance = element
+    element.type  = node.nodeName
+    element.node  = node
+    node.instance = element
+  
+    // SVG.Class specific preparations
+    if (element instanceof SVG.Doc)
+      element.namespace().defs()
+  
+    return element
   }
 
   SVG.regex = {
     }
   
   })
-  
-
 
-  SVG.PointArray = function() {
-    this.constructor.apply(this, arguments)
+  SVG.PointArray = function(array, fallback) {
+    this.constructor.call(this, array, fallback || [[0,0]])
   }
   
   // Inherit from SVG.Array
   })
 
   SVG.PathArray = function(array, fallback) {
-    this.constructor.call(this, array, fallback)
+    this.constructor.call(this, array, fallback || [['M', 0, 0]])
   }
   
   // Inherit from SVG.Array
       }
       // Set svg element attribute
     , attr: function(a, v, n) {
+        // Act as full getter
         if (a == null) {
-          /* get an object of attributes */
+          // Get an object of attributes
           a = {}
           v = this.node.attributes
           for (n = v.length - 1; n >= 0; n--)
           return a
           
         } else if (typeof a == 'object') {
-          /* apply every attribute individually if an object is passed */
+          // Apply every attribute individually if an object is passed
           for (v in a) this.attr(v, a[v])
           
         } else if (v === null) {
-            /* remove value */
+            // Remove value
             this.node.removeAttribute(a)
           
         } else if (v == null) {
-          /* act as a getter if the first and only argument is not an object */
+          // Act as a getter if the first and only argument is not an object
           v = this.node.getAttribute(a)
           return v == null ? 
             SVG.defaults.attrs[a] :
             parseFloat(v) : v
         
         } else if (a == 'style') {
-          /* redirect to the style method */
+          // Redirect to the style method
           return this.style(v)
         
         } else {
-          /* BUG FIX: some browsers will render a stroke if a color is given even though stroke width is 0 */
+          // BUG FIX: some browsers will render a stroke if a color is given even though stroke width is 0
           if (a == 'stroke-width')
             this.attr('stroke', parseFloat(v) > 0 ? this._stroke : null)
           else if (a == 'stroke')
             this._stroke = v
   
-          /* convert image fill and stroke to patterns */
+          // Convert image fill and stroke to patterns
           if (a == 'fill' || a == 'stroke') {
             if (SVG.regex.isImage.test(v))
               v = this.doc().defs().image(v, 0, 0)
               })
           }
           
-          /* ensure correct numeric values (also accepts NaN and Infinity) */
+          // Ensure correct numeric values (also accepts NaN and Infinity)
           if (typeof v === 'number')
             v = new SVG.Number(v)
   
-          /* ensure full hex color */
+          // Ensure full hex color
           else if (SVG.Color.isColor(v))
             v = new SVG.Color(v)
           
-          /* parse array values */
+          // Parse array values
           else if (Array.isArray(v))
             v = new SVG.Array(v)
   
-          /* if the passed attribute is leading... */
+          // If the passed attribute is leading...
           if (a == 'leading') {
-            /* ... call the leading method instead */
+            // ... call the leading method instead
             if (this.leading)
               this.leading(v)
           } else {
-            /* set given attribute on node */
+            // Set given attribute on node
             typeof n === 'string' ?
               this.node.setAttributeNS(n, a, v.toString()) :
               this.node.setAttribute(a, v.toString())
           }
           
-          /* rebuild if required */
+          // Rebuild if required
           if (this.rebuild && (a == 'font-size' || a == 'x'))
             this.rebuild(a, v)
         }
   SVG.Doc = SVG.invent({
     // Initialize node
     create: function(element) {
-      /* ensure the presence of a dom element */
-      element = typeof element == 'string' ?
-        document.getElementById(element) :
-        element
-      
-      /* If the target is an svg element, use that element as the main wrapper.
-         This allows svg.js to work with svg documents as well. */
-      if (element.nodeName == 'svg') {
-        this.constructor.call(this, element)
-      } else {
-        this.constructor.call(this, SVG.create('svg'))
-        element.appendChild(this.node)
+      if (element) {
+        /* ensure the presence of a dom element */
+        element = typeof element == 'string' ?
+          document.getElementById(element) :
+          element
+        
+        /* If the target is an svg element, use that element as the main wrapper.
+           This allows svg.js to work with svg documents as well. */
+        if (element.nodeName == 'svg') {
+          this.constructor.call(this, element)
+        } else {
+          this.constructor.call(this, SVG.create('svg'))
+          element.appendChild(this.node)
+        }
+        
+        /* set svg element attributes and ensure defs node */
+        this.namespace().size('100%', '100%').defs()
       }
-      
-      /* set svg element attributes and ensure defs node */
-      this
-        .attr({ xmlns: SVG.ns, version: '1.1', width: '100%', height: '100%' })
-        .attr('xmlns:xlink', SVG.xlink, SVG.xmlns)
-        .defs()
     }
   
     // Inherit from
   
     // Add class methods
   , extend: {
+      // Add namespaces
+      namespace: function() {
+        return this
+          .attr({ xmlns: SVG.ns, version: '1.1' })
+          .attr('xmlns:xlink', SVG.xlink, SVG.xmlns)
+      }
       // Creates and returns defs element
-      defs: function() {
+    , defs: function() {
         if (!this._defs) {
           var defs
   
        rect: function(width, height) {
          return this.put(new SVG.Rect().size(width, height))
        }
-       
        }
-       
   })
 
+  SVG.Circle = SVG.invent({
+    // Initialize node
+    create: 'circle'
+  
+    // Inherit from
+  , inherit: SVG.Shape
+  
+    // Add parent method
+  , construct: {
+      // Create circle element, based on ellipse
+      circle: function(size) {
+        return this.put(new SVG.Circle).rx(new SVG.Number(size).divide(2)).move(0, 0)
+      }
+    }
+  })
+  
+  SVG.extend(SVG.Circle, SVG.FX, {
+    // Radius x value
+    rx: function(rx) {
+      return this.attr('r', rx)
+    }
+    // Alias radius x value
+  , ry: function(ry) {
+      return this.rx(ry)
+    }
+  })
+  
   SVG.Ellipse = SVG.invent({
     // Initialize node
     create: 'ellipse'
     // Inherit from
   , inherit: SVG.Shape
   
-    // Add class methods
-  , extend: {
+    // Add parent method
+  , construct: {
+      // Create an ellipse
+      ellipse: function(width, height) {
+        return this.put(new SVG.Ellipse).size(width, height).move(0, 0)
+      }
+    }
+  })
+  
+  SVG.extend(SVG.Ellipse, SVG.Rect, SVG.FX, {
+    // Radius x value
+    rx: function(rx) {
+      return this.attr('rx', rx)
+    }
+    // Radius y value
+  , ry: function(ry) {
+      return this.attr('ry', ry)
+    }
+  })
+  
+  // Add common method
+  SVG.extend(SVG.Circle, SVG.Ellipse, {
       // Move over x-axis
       x: function(x) {
-        return x == null ? this.cx() - this.attr('rx') : this.cx(x + this.attr('rx'))
+        return x == null ? this.cx() - this.rx() : this.cx(x + this.rx())
       }
       // Move over y-axis
     , y: function(y) {
-        return y == null ? this.cy() - this.attr('ry') : this.cy(y + this.attr('ry'))
+        return y == null ? this.cy() - this.ry() : this.cy(y + this.ry())
       }
       // Move by center over x-axis
     , cx: function(x) {
       }
       // Set width of element
     , width: function(width) {
-        return width == null ? this.attr('rx') * 2 : this.attr('rx', new SVG.Number(width).divide(2))
+        return width == null ? this.rx() * 2 : this.rx(new SVG.Number(width).divide(2))
       }
       // Set height of element
     , height: function(height) {
-        return height == null ? this.attr('ry') * 2 : this.attr('ry', new SVG.Number(height).divide(2))
+        return height == null ? this.ry() * 2 : this.ry(new SVG.Number(height).divide(2))
       }
       // Custom size function
     , size: function(width, height) {
         var p = proportionalSize(this.bbox(), width, height)
   
-        return this.attr({
-          rx: new SVG.Number(p.width).divide(2)
-        , ry: new SVG.Number(p.height).divide(2)
-        })
-      }
-      
-    }
-  
-    // Add parent method
-  , construct: {
-      // Create circle element, based on ellipse
-      circle: function(size) {
-        return this.ellipse(size, size)
-      }
-      // Create an ellipse
-    , ellipse: function(width, height) {
-        return this.put(new SVG.Ellipse).size(width, height).move(0, 0)
+        return this
+          .rx(new SVG.Number(p.width).divide(2))
+          .ry(new SVG.Number(p.height).divide(2))
       }
-      
-    }
-  
   })
 
   SVG.Line = SVG.invent({
   SVG.extend(SVG.Polyline, SVG.Polygon, {
     // Define morphable array
     morphArray:  SVG.PointArray
+    // Get array
+  , array: function() {
+      return this._array || (this._array = new SVG.PointArray(this.attr('points')))
+    }
     // Plot new path
   , plot: function(p) {
-      return this.attr('points', (this.array = new SVG.PointArray(p, [[0,0]])))
+      return this.attr('points', (this._array = new SVG.PointArray(p)))
     }
     // Move by left top corner
   , move: function(x, y) {
-      return this.attr('points', this.array.move(x, y))
+      return this.attr('points', this.array().move(x, y))
     }
     // Move by left top corner over x-axis
   , x: function(x) {
   , size: function(width, height) {
       var p = proportionalSize(this.bbox(), width, height)
   
-      return this.attr('points', this.array.size(p.width, p.height))
+      return this.attr('points', this.array().size(p.width, p.height))
     }
   
   })
   
     // Add class methods
   , extend: {
+      // Define morphable array
+      morphArray:  SVG.PathArray
+      // Get array
+    , array: function() {
+        return this._array || (this._array = new SVG.PathArray(this.attr('d')))
+      }
       // Plot new poly points
-      plot: function(p) {
-        return this.attr('d', (this.array = new SVG.PathArray(p, [['M', 0, 0]])))
+    , plot: function(p) {
+        return this.attr('d', (this._array = new SVG.PathArray(p)))
       }
       // Move by left top corner
     , move: function(x, y) {
-        return this.attr('d', this.array.move(x, y))
+        return this.attr('d', this.array().move(x, y))
       }
       // Move by left top corner over x-axis
     , x: function(x) {
     , size: function(width, height) {
         var p = proportionalSize(this.bbox(), width, height)
         
-        return this.attr('d', this.array.size(p.width, p.height))
+        return this.attr('d', this.array().size(p.width, p.height))
       }
       // Set width of element
     , width: function(width) {
   , opacity: function(value) {
       return this.attr('opacity', value)
     }
-  
   })
   
-  SVG.extend(SVG.Rect, SVG.Ellipse, SVG.FX, {
+  SVG.extend(SVG.Rect, SVG.Ellipse, SVG.Circle, SVG.FX, {
     // Add x and y radius
     radius: function(x, y) {
-      return this.attr({ rx: x, ry: y || x })
+      return this.rx(x).ry(y == null ? x : y)
     }
-  
   })
   
   SVG.extend(SVG.Path, {
   , pointAt: function(length) {
       return this.node.getPointAtLength(length)
     }
-  
   })
   
   SVG.extend(SVG.Parent, SVG.Text, SVG.FX, {
       
       return this
     }
-    
   })
   
 
index e9548d1a8a9b3546b33d4aeb2a8c92f4ebb08dd4..2b9ccc275436a225d2f9d21f518a8109d8681e0d 100755 (executable)
@@ -1,2 +1,2 @@
-(function(){function t(t){return t.toLowerCase().replace(/-(.)/g,function(t,e){return e.toUpperCase()})}function e(t){return t.charAt(0).toUpperCase()+t.slice(1)}function i(t){return 4==t.length?["#",t.substring(1,2),t.substring(1,2),t.substring(2,3),t.substring(2,3),t.substring(3,4),t.substring(3,4)].join(""):t}function n(t){var e=t.toString(16);return 1==e.length?"0"+e:e}function r(t,e,i){return(null==e||null==i)&&(null==i?i=t.height/t.width*e:null==e&&(e=t.width/t.height*i)),{width:e,height:i}}function s(t,e){return"number"==typeof t.from?t.from+(t.to-t.from)*e:t instanceof c.Color||t instanceof c.Number?t.at(e):1>e?t.from:t.to}function h(t){for(var e=0,i=t.length,n="";i>e;e++)n+=t[e][0],null!=t[e][1]&&(n+=t[e][1],null!=t[e][2]&&(n+=" ",n+=t[e][2],null!=t[e][3]&&(n+=" ",n+=t[e][3],n+=" ",n+=t[e][4],null!=t[e][5]&&(n+=" ",n+=t[e][5],n+=" ",n+=t[e][6],null!=t[e][7]&&(n+=" ",n+=t[e][7])))));return n+" "}function o(t){t.x2=t.x+t.width,t.y2=t.y+t.height,t.cx=t.x+t.width/2,t.cy=t.y+t.height/2}function a(t){if(t.matrix){var e=t.matrix.replace(/\s/g,"").split(",");6==e.length&&(t.a=parseFloat(e[0]),t.b=parseFloat(e[1]),t.c=parseFloat(e[2]),t.d=parseFloat(e[3]),t.e=parseFloat(e[4]),t.f=parseFloat(e[5]))}return t}function u(t){var e=t.toString().match(c.regex.reference);return e?e[1]:void 0}function l(t,e){e=e||{bubbles:!1,cancelable:!1,detail:void 0};var i=document.createEvent("CustomEvent");return i.initCustomEvent(t,e.bubbles,e.cancelable,e.detail),i}var c=this.SVG=function(t){return c.supported?(t=new c.Doc(t),c.parser||c.prepare(t),t):void 0};if(c.ns="http://www.w3.org/2000/svg",c.xmlns="http://www.w3.org/2000/xmlns/",c.xlink="http://www.w3.org/1999/xlink",c.did=1e3,c.eid=function(t){return"Svgjs"+t.charAt(0).toUpperCase()+t.slice(1)+c.did++},c.create=function(t){var e=document.createElementNS(this.ns,t);return e.setAttribute("id",this.eid(t)),e},c.extend=function(){var t,e,i,n;for(t=[].slice.call(arguments),e=t.pop(),n=t.length-1;n>=0;n--)if(t[n])for(i in e)t[n].prototype[i]=e[i];c.Set&&c.Set.inherit&&c.Set.inherit()},c.prepare=function(t){var e=document.getElementsByTagName("body")[0],i=(e?new c.Doc(e):t.nested()).size(2,0),n=c.create("path");i.node.appendChild(n),c.parser={body:e||t.parent(),draw:i.style("opacity:0;position:fixed;left:100%;top:100%;overflow:hidden"),poly:i.polyline().node,path:n}},c.supported=function(){return!!document.createElementNS&&!!document.createElementNS(c.ns,"svg").createSVGRect}(),!c.supported)return!1;c.invent=function(t){var e="function"==typeof t.create?t.create:function(){this.constructor.call(this,c.create(t.create))};return t.inherit&&(e.prototype=new t.inherit),t.extend&&c.extend(e,t.extend),t.construct&&c.extend(t.parent||c.Container,t.construct),e},c.adopt=function(t){if(t.instance)return t.instance;var i;return i="svg"==t.nodeName?t.parentNode instanceof SVGElement?new c.Nested:new c.Doc:"lineairGradient"==t.nodeName?new c.Gradient("lineair"):"radialGradient"==t.nodeName?new c.Gradient("radial"):new(c[e(t.nodeName)]),i.type=t.nodeName,i.node=t,t.instance=i},c.regex={unit:/^(-?[\d\.]+)([a-z%]{0,2})$/,hex:/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i,rgb:/rgb\((\d+),(\d+),(\d+)\)/,reference:/#([a-z0-9\-_]+)/i,isHex:/^#[a-f0-9]{3,6}$/i,isRgb:/^rgb\(/,isCss:/[^:]+:[^;]+;?/,isBlank:/^(\s+)?$/,isNumber:/^-?[\d\.]+$/,isPercent:/^-?[\d\.]+%$/,isImage:/\.(jpg|jpeg|png|gif)(\?[^=]+.*)?/i,isEvent:/^[\w]+:[\w]+$/},c.utils={map:function(t,e){var i,n=t.length,r=[];for(i=0;n>i;i++)r.push(e(t[i]));return r}},c.defaults={matrix:"1 0 0 1 0 0",attrs:{"fill-opacity":1,"stroke-opacity":1,"stroke-width":0,"stroke-linejoin":"miter","stroke-linecap":"butt",fill:"#000000",stroke:"#000000",opacity:1,x:0,y:0,cx:0,cy:0,width:0,height:0,r:0,rx:0,ry:0,offset:0,"stop-opacity":1,"stop-color":"#000000","font-size":16,"font-family":"Helvetica, Arial, sans-serif","text-anchor":"start"},trans:function(){return{x:0,y:0,scaleX:1,scaleY:1,rotation:0,skewX:0,skewY:0,matrix:this.matrix,a:1,b:0,c:0,d:1,e:0,f:0}}},c.Color=function(t){var e;this.r=0,this.g=0,this.b=0,"string"==typeof t?c.regex.isRgb.test(t)?(e=c.regex.rgb.exec(t.replace(/\s/g,"")),this.r=parseInt(e[1]),this.g=parseInt(e[2]),this.b=parseInt(e[3])):c.regex.isHex.test(t)&&(e=c.regex.hex.exec(i(t)),this.r=parseInt(e[1],16),this.g=parseInt(e[2],16),this.b=parseInt(e[3],16)):"object"==typeof t&&(this.r=t.r,this.g=t.g,this.b=t.b)},c.extend(c.Color,{toString:function(){return this.toHex()},toHex:function(){return"#"+n(this.r)+n(this.g)+n(this.b)},toRgb:function(){return"rgb("+[this.r,this.g,this.b].join()+")"},brightness:function(){return this.r/255*.3+this.g/255*.59+this.b/255*.11},morph:function(t){return this.destination=new c.Color(t),this},at:function(t){return this.destination?(t=0>t?0:t>1?1:t,new c.Color({r:~~(this.r+(this.destination.r-this.r)*t),g:~~(this.g+(this.destination.g-this.g)*t),b:~~(this.b+(this.destination.b-this.b)*t)})):this}}),c.Color.test=function(t){return t+="",c.regex.isHex.test(t)||c.regex.isRgb.test(t)},c.Color.isRgb=function(t){return t&&"number"==typeof t.r&&"number"==typeof t.g&&"number"==typeof t.b},c.Color.isColor=function(t){return c.Color.isRgb(t)||c.Color.test(t)},c.Array=function(t,e){t=(t||[]).valueOf(),0==t.length&&e&&(t=e.valueOf()),this.value=this.parse(t)},c.extend(c.Array,{morph:function(t){if(this.destination=this.parse(t),this.value.length!=this.destination.length){for(var e=this.value[this.value.length-1],i=this.destination[this.destination.length-1];this.value.length>this.destination.length;)this.destination.push(i);for(;this.value.length<this.destination.length;)this.value.push(e)}return this},settle:function(){for(var t=0,e=this.value.length,i=[];e>t;t++)-1==i.indexOf(this.value[t])&&i.push(this.value[t]);return this.value=i},at:function(t){if(!this.destination)return this;for(var e=0,i=this.value.length,n=[];i>e;e++)n.push(this.value[e]+(this.destination[e]-this.value[e])*t);return new c.Array(n)},toString:function(){return this.value.join(" ")},valueOf:function(){return this.value},parse:function(t){return t=t.valueOf(),Array.isArray(t)?t:this.split(t)},split:function(t){return t.replace(/\s+/g," ").replace(/^\s+|\s+$/g,"").split(" ")},reverse:function(){return this.value.reverse(),this}}),c.PointArray=function(){this.constructor.apply(this,arguments)},c.PointArray.prototype=new c.Array,c.extend(c.PointArray,{toString:function(){for(var t=0,e=this.value.length,i=[];e>t;t++)i.push(this.value[t].join(","));return i.join(" ")},at:function(t){if(!this.destination)return this;for(var e=0,i=this.value.length,n=[];i>e;e++)n.push([this.value[e][0]+(this.destination[e][0]-this.value[e][0])*t,this.value[e][1]+(this.destination[e][1]-this.value[e][1])*t]);return new c.PointArray(n)},parse:function(t){if(t=t.valueOf(),Array.isArray(t))return t;t=this.split(t);for(var e,i=0,n=t.length,r=[];n>i;i++)e=t[i].split(","),r.push([parseFloat(e[0]),parseFloat(e[1])]);return r},move:function(t,e){var i=this.bbox();if(t-=i.x,e-=i.y,!isNaN(t)&&!isNaN(e))for(var n=this.value.length-1;n>=0;n--)this.value[n]=[this.value[n][0]+t,this.value[n][1]+e];return this},size:function(t,e){var i,n=this.bbox();for(i=this.value.length-1;i>=0;i--)this.value[i][0]=(this.value[i][0]-n.x)*t/n.width+n.x,this.value[i][1]=(this.value[i][1]-n.y)*e/n.height+n.y;return this},bbox:function(){return c.parser.poly.setAttribute("points",this.toString()),c.parser.poly.getBBox()}}),c.PathArray=function(t,e){this.constructor.call(this,t,e)},c.PathArray.prototype=new c.Array,c.extend(c.PathArray,{toString:function(){return h(this.value)},move:function(t,e){var i=this.bbox();if(t-=i.x,e-=i.y,!isNaN(t)&&!isNaN(e))for(var n,r=this.value.length-1;r>=0;r--)n=this.value[r][0],"M"==n||"L"==n||"T"==n?(this.value[r][1]+=t,this.value[r][2]+=e):"H"==n?this.value[r][1]+=t:"V"==n?this.value[r][1]+=e:"C"==n||"S"==n||"Q"==n?(this.value[r][1]+=t,this.value[r][2]+=e,this.value[r][3]+=t,this.value[r][4]+=e,"C"==n&&(this.value[r][5]+=t,this.value[r][6]+=e)):"A"==n&&(this.value[r][6]+=t,this.value[r][7]+=e);return this},size:function(t,e){var i,n,r=this.bbox();for(i=this.value.length-1;i>=0;i--)n=this.value[i][0],"M"==n||"L"==n||"T"==n?(this.value[i][1]=(this.value[i][1]-r.x)*t/r.width+r.x,this.value[i][2]=(this.value[i][2]-r.y)*e/r.height+r.y):"H"==n?this.value[i][1]=(this.value[i][1]-r.x)*t/r.width+r.x:"V"==n?this.value[i][1]=(this.value[i][1]-r.y)*e/r.height+r.y:"C"==n||"S"==n||"Q"==n?(this.value[i][1]=(this.value[i][1]-r.x)*t/r.width+r.x,this.value[i][2]=(this.value[i][2]-r.y)*e/r.height+r.y,this.value[i][3]=(this.value[i][3]-r.x)*t/r.width+r.x,this.value[i][4]=(this.value[i][4]-r.y)*e/r.height+r.y,"C"==n&&(this.value[i][5]=(this.value[i][5]-r.x)*t/r.width+r.x,this.value[i][6]=(this.value[i][6]-r.y)*e/r.height+r.y)):"A"==n&&(this.value[i][1]=this.value[i][1]*t/r.width,this.value[i][2]=this.value[i][2]*e/r.height,this.value[i][6]=(this.value[i][6]-r.x)*t/r.width+r.x,this.value[i][7]=(this.value[i][7]-r.y)*e/r.height+r.y);return this},parse:function(t){if(t instanceof c.PathArray)return t.valueOf();var e,i,n,r,s,o,a,u,l,f,d,p=0,m=0;for(c.parser.path.setAttribute("d","string"==typeof t?t:h(t)),d=c.parser.path.pathSegList,e=0,i=d.numberOfItems;i>e;++e)f=d.getItem(e),l=f.pathSegTypeAsLetter,"M"==l||"L"==l||"H"==l||"V"==l||"C"==l||"S"==l||"Q"==l||"T"==l||"A"==l?("x"in f&&(p=f.x),"y"in f&&(m=f.y)):("x1"in f&&(s=p+f.x1),"x2"in f&&(a=p+f.x2),"y1"in f&&(o=m+f.y1),"y2"in f&&(u=m+f.y2),"x"in f&&(p+=f.x),"y"in f&&(m+=f.y),"m"==l?d.replaceItem(c.parser.path.createSVGPathSegMovetoAbs(p,m),e):"l"==l?d.replaceItem(c.parser.path.createSVGPathSegLinetoAbs(p,m),e):"h"==l?d.replaceItem(c.parser.path.createSVGPathSegLinetoHorizontalAbs(p),e):"v"==l?d.replaceItem(c.parser.path.createSVGPathSegLinetoVerticalAbs(m),e):"c"==l?d.replaceItem(c.parser.path.createSVGPathSegCurvetoCubicAbs(p,m,s,o,a,u),e):"s"==l?d.replaceItem(c.parser.path.createSVGPathSegCurvetoCubicSmoothAbs(p,m,a,u),e):"q"==l?d.replaceItem(c.parser.path.createSVGPathSegCurvetoQuadraticAbs(p,m,s,o),e):"t"==l?d.replaceItem(c.parser.path.createSVGPathSegCurvetoQuadraticSmoothAbs(p,m),e):"a"==l?d.replaceItem(c.parser.path.createSVGPathSegArcAbs(p,m,f.r1,f.r2,f.angle,f.largeArcFlag,f.sweepFlag),e):("z"==l||"Z"==l)&&(p=n,m=r)),("M"==l||"m"==l)&&(n=p,r=m);for(t=[],d=c.parser.path.pathSegList,e=0,i=d.numberOfItems;i>e;++e)f=d.getItem(e),l=f.pathSegTypeAsLetter,p=[l],"M"==l||"L"==l||"T"==l?p.push(f.x,f.y):"H"==l?p.push(f.x):"V"==l?p.push(f.y):"C"==l?p.push(f.x1,f.y1,f.x2,f.y2,f.x,f.y):"S"==l?p.push(f.x2,f.y2,f.x,f.y):"Q"==l?p.push(f.x1,f.y1,f.x,f.y):"A"==l&&p.push(f.r1,f.r2,f.angle,0|f.largeArcFlag,0|f.sweepFlag,f.x,f.y),t.push(p);return t},bbox:function(){return c.parser.path.setAttribute("d",this.toString()),c.parser.path.getBBox()}}),c.Number=function(t){if(this.value=0,this.unit="","number"==typeof t)this.value=isNaN(t)?0:isFinite(t)?t:0>t?-3.4e38:3.4e38;else if("string"==typeof t){var e=t.match(c.regex.unit);e&&(this.value=parseFloat(e[1]),"%"==e[2]?this.value/=100:"s"==e[2]&&(this.value*=1e3),this.unit=e[2])}else t instanceof c.Number&&(this.value=t.value,this.unit=t.unit)},c.extend(c.Number,{toString:function(){return("%"==this.unit?~~(1e8*this.value)/1e6:"s"==this.unit?this.value/1e3:this.value)+this.unit},valueOf:function(){return this.value},plus:function(t){return this.value=this+new c.Number(t),this},minus:function(t){return this.plus(-new c.Number(t))},times:function(t){return this.value=this*new c.Number(t),this},divide:function(t){return this.value=this/new c.Number(t),this},to:function(t){return"string"==typeof t&&(this.unit=t),this},morph:function(t){return this.destination=new c.Number(t),this},at:function(t){return this.destination?new c.Number(this.destination).minus(this).times(t).plus(this):this}}),c.ViewBox=function(t){var e,i,n,r,s=1,h=1,o=t.bbox(),a=(t.attr("viewBox")||"").match(/-?[\d\.]+/g),u=t,l=t;for(n=new c.Number(t.width()),r=new c.Number(t.height());"%"==n.unit;)s*=n.value,n=new c.Number(u instanceof c.Doc?u.parent().offsetWidth:u.parent().width()),u=u.parent();for(;"%"==r.unit;)h*=r.value,r=new c.Number(l instanceof c.Doc?l.parent().offsetHeight:l.parent().height()),l=l.parent();this.x=o.x,this.y=o.y,this.width=n*s,this.height=r*h,this.zoom=1,a&&(e=parseFloat(a[0]),i=parseFloat(a[1]),n=parseFloat(a[2]),r=parseFloat(a[3]),this.zoom=this.width/this.height>n/r?this.height/r:this.width/n,this.x=e,this.y=i,this.width=n,this.height=r)},c.extend(c.ViewBox,{toString:function(){return this.x+" "+this.y+" "+this.width+" "+this.height}}),c.BBox=function(t){var e;if(this.x=0,this.y=0,this.width=0,this.height=0,t){try{e=t.node.getBBox()}catch(i){e={x:t.node.clientLeft,y:t.node.clientTop,width:t.node.clientWidth,height:t.node.clientHeight}}this.x=e.x+t.trans.x,this.y=e.y+t.trans.y,this.width=e.width*t.trans.scaleX,this.height=e.height*t.trans.scaleY}o(this)},c.extend(c.BBox,{merge:function(t){var e=new c.BBox;return e.x=Math.min(this.x,t.x),e.y=Math.min(this.y,t.y),e.width=Math.max(this.x+this.width,t.x+t.width)-e.x,e.height=Math.max(this.y+this.height,t.y+t.height)-e.y,o(e),e}}),c.RBox=function(t){var e,i,n={};if(this.x=0,this.y=0,this.width=0,this.height=0,t){for(e=t.doc().parent(),i=t.doc().viewbox().zoom,n=t.node.getBoundingClientRect(),this.x=n.left,this.y=n.top,this.x-=e.offsetLeft,this.y-=e.offsetTop;e=e.offsetParent;)this.x-=e.offsetLeft,this.y-=e.offsetTop;for(e=t;e.parent&&(e=e.parent());)"svg"==e.type&&e.viewbox&&(i*=e.viewbox().zoom,this.x-=e.x()||0,this.y-=e.y()||0)}this.x/=i,this.y/=i,this.width=n.width/=i,this.height=n.height/=i,this.x+=window.scrollX,this.y+=window.scrollY,o(this)},c.extend(c.RBox,{merge:function(t){var e=new c.RBox;return e.x=Math.min(this.x,t.x),e.y=Math.min(this.y,t.y),e.width=Math.max(this.x+this.width,t.x+t.width)-e.x,e.height=Math.max(this.y+this.height,t.y+t.height)-e.y,o(e),e}}),c.Element=c.invent({create:function(t){this._stroke=c.defaults.attrs.stroke,this.trans=c.defaults.trans(),(this.node=t)&&(this.type=t.nodeName,this.node.instance=this)},extend:{x:function(t){return null!=t&&(t=new c.Number(t),t.value/=this.trans.scaleX),this.attr("x",t)},y:function(t){return null!=t&&(t=new c.Number(t),t.value/=this.trans.scaleY),this.attr("y",t)},cx:function(t){return null==t?this.x()+this.width()/2:this.x(t-this.width()/2)},cy:function(t){return null==t?this.y()+this.height()/2:this.y(t-this.height()/2)},move:function(t,e){return this.x(t).y(e)},center:function(t,e){return this.cx(t).cy(e)},width:function(t){return this.attr("width",t)},height:function(t){return this.attr("height",t)},size:function(t,e){var i=r(this.bbox(),t,e);return this.width(new c.Number(i.width)).height(new c.Number(i.height))},clone:function(){var t,e,i=this.type;return t="rect"==i||"ellipse"==i?this.parent()[i](0,0):"line"==i?this.parent()[i](0,0,0,0):"image"==i?this.parent()[i](this.src):"text"==i?this.parent()[i](this.content):"path"==i?this.parent()[i](this.attr("d")):"polyline"==i||"polygon"==i?this.parent()[i](this.attr("points")):"g"==i?this.parent().group():this.parent()[i](),e=this.attr(),delete e.id,t.attr(e),t.trans=this.trans,t.transform({})},remove:function(){return this.parent()&&this.parent().removeElement(this),this},replace:function(t){return this.after(t).remove(),t},addTo:function(t){return t.put(this)},putIn:function(t){return t.add(this)},doc:function(t){return this.parent(t||c.Doc)},attr:function(t,e,i){if(null==t){for(t={},e=this.node.attributes,i=e.length-1;i>=0;i--)t[e[i].nodeName]=c.regex.isNumber.test(e[i].nodeValue)?parseFloat(e[i].nodeValue):e[i].nodeValue;return t}if("object"==typeof t)for(e in t)this.attr(e,t[e]);else if(null===e)this.node.removeAttribute(t);else{if(null==e)return e=this.node.getAttribute(t),null==e?c.defaults.attrs[t]:c.regex.isNumber.test(e)?parseFloat(e):e;if("style"==t)return this.style(e);"stroke-width"==t?this.attr("stroke",parseFloat(e)>0?this._stroke:null):"stroke"==t&&(this._stroke=e),("fill"==t||"stroke"==t)&&(c.regex.isImage.test(e)&&(e=this.doc().defs().image(e,0,0)),e instanceof c.Image&&(e=this.doc().defs().pattern(0,0,function(){this.add(e)}))),"number"==typeof e?e=new c.Number(e):c.Color.isColor(e)?e=new c.Color(e):Array.isArray(e)&&(e=new c.Array(e)),"leading"==t?this.leading&&this.leading(e):"string"==typeof i?this.node.setAttributeNS(i,t,e.toString()):this.node.setAttribute(t,e.toString()),!this.rebuild||"font-size"!=t&&"x"!=t||this.rebuild(t,e)}return this},transform:function(t,e){if(0==arguments.length)return this.trans;if("string"==typeof t){if(arguments.length<2)return this.trans[t];var i={};return i[t]=e,this.transform(i)}var i=[];t=a(t);for(e in t)null!=t[e]&&(this.trans[e]=t[e]);return this.trans.matrix=this.trans.a+" "+this.trans.b+" "+this.trans.c+" "+this.trans.d+" "+this.trans.e+" "+this.trans.f,t=this.trans,t.matrix!=c.defaults.matrix&&i.push("matrix("+t.matrix+")"),0!=t.rotation&&i.push("rotate("+t.rotation+" "+(null==t.cx?this.bbox().cx:t.cx)+" "+(null==t.cy?this.bbox().cy:t.cy)+")"),(1!=t.scaleX||1!=t.scaleY)&&i.push("scale("+t.scaleX+" "+t.scaleY+")"),0!=t.skewX&&i.push("skewX("+t.skewX+")"),0!=t.skewY&&i.push("skewY("+t.skewY+")"),(0!=t.x||0!=t.y)&&i.push("translate("+new c.Number(t.x/t.scaleX)+" "+new c.Number(t.y/t.scaleY)+")"),0==i.length?this.node.removeAttribute("transform"):this.node.setAttribute("transform",i.join(" ")),this},style:function(e,i){if(0==arguments.length)return this.node.style.cssText||"";if(arguments.length<2)if("object"==typeof e)for(i in e)this.style(i,e[i]);else{if(!c.regex.isCss.test(e))return this.node.style[t(e)];e=e.split(";");for(var n=0;n<e.length;n++)i=e[n].split(":"),this.style(i[0].replace(/\s+/g,""),i[1])}else this.node.style[t(e)]=null===i||c.regex.isBlank.test(i)?"":i;return this},id:function(t){return this.attr("id",t)},bbox:function(){return new c.BBox(this)},rbox:function(){return new c.RBox(this)},inside:function(t,e){var i=this.bbox();return t>i.x&&e>i.y&&t<i.x+i.width&&e<i.y+i.height},show:function(){return this.style("display","")},hide:function(){return this.style("display","none")},visible:function(){return"none"!=this.style("display")},toString:function(){return this.attr("id")},classes:function(){var t=this.attr("class");return null==t?[]:t.trim().split(/\s+/)},hasClass:function(t){return-1!=this.classes().indexOf(t)},addClass:function(t){if(!this.hasClass(t)){var e=this.classes();e.push(t),this.attr("class",e.join(" "))}return this},removeClass:function(t){if(this.hasClass(t)){var e=this.classes().filter(function(e){return e!=t});this.attr("class",e.join(" "))}return this},toggleClass:function(t){return this.hasClass(t)?this.removeClass(t):this.addClass(t)},reference:function(t){return c.get(this.attr(t))},parent:function(t){var e=c.adopt(this.node.parentNode);if(t)for(;!(e instanceof t);)e=c.adopt(e.node.parentNode);return e}}}),c.Parent=c.invent({create:function(t){this.constructor.call(this,t)},inherit:c.Element,extend:{children:function(){return c.utils.map(this.node.childNodes,function(t){return c.adopt(t)})},add:function(t,e){return this.has(t)||(e=null==e?this.children().length:e,this.node.insertBefore(t.node,this.node.childNodes[e]||null)),this},put:function(t,e){return this.add(t,e),t},has:function(t){return this.index(t)>=0},index:function(t){return this.children().indexOf(t)},get:function(t){return this.children()[t]},first:function(){return this.children()[0]},last:function(){return this.children()[this.children().length-1]},each:function(t,e){var i,n,r=this.children();for(i=0,n=r.length;n>i;i++)r[i]instanceof c.Element&&t.apply(r[i],[i,r]),e&&r[i]instanceof c.Container&&r[i].each(t,e);return this},removeElement:function(t){return this.node.removeChild(t.node),this},clear:function(){for(;this.node.hasChildNodes();)this.node.removeChild(this.node.lastChild);return delete this._defs,this},defs:function(){return this.doc().defs()}}}),c.Container=c.invent({create:function(t){this.constructor.call(this,t)},inherit:c.Parent,extend:{viewbox:function(t){return 0==arguments.length?new c.ViewBox(this):(t=1==arguments.length?[t.x,t.y,t.width,t.height]:[].slice.call(arguments),this.attr("viewBox",t))}}}),c.FX=c.invent({create:function(t){this.target=t},extend:{animate:function(t,e,i){var n,r,h,o,a=this.target,u=this;return"object"==typeof t&&(i=t.delay,e=t.ease,t=t.duration),t="="==t?t:null==t?1e3:new c.Number(t).valueOf(),e=e||"<>",u.to=function(t){var i;if(t=0>t?0:t>1?1:t,null==n){n=[];for(o in u.attrs)n.push(o);if(a.morphArray&&(u._plot||n.indexOf("points")>-1)){var l,c=new a.morphArray(u._plot||u.attrs.points||a.array);u._size&&c.size(u._size.width.to,u._size.height.to),l=c.bbox(),u._x?c.move(u._x.to,l.y):u._cx&&c.move(u._cx.to-l.width/2,l.y),l=c.bbox(),u._y?c.move(l.x,u._y.to):u._cy&&c.move(l.x,u._cy.to-l.height/2),delete u._x,delete u._y,delete u._cx,delete u._cy,delete u._size,u._plot=a.array.morph(c)}}if(null==r){r=[];for(o in u.trans)r.push(o)}if(null==h){h=[];for(o in u.styles)h.push(o)}for(t="<>"==e?-Math.cos(t*Math.PI)/2+.5:">"==e?Math.sin(t*Math.PI/2):"<"==e?-Math.cos(t*Math.PI/2)+1:"-"==e?t:"function"==typeof e?e(t):t,u._plot?a.plot(u._plot.at(t)):(u._x?a.x(u._x.at(t)):u._cx&&a.cx(u._cx.at(t)),u._y?a.y(u._y.at(t)):u._cy&&a.cy(u._cy.at(t)),u._size&&a.size(u._size.width.at(t),u._size.height.at(t))),u._viewbox&&a.viewbox(u._viewbox.x.at(t),u._viewbox.y.at(t),u._viewbox.width.at(t),u._viewbox.height.at(t)),u._leading&&a.leading(u._leading.at(t)),i=n.length-1;i>=0;i--)a.attr(n[i],s(u.attrs[n[i]],t));for(i=r.length-1;i>=0;i--)a.transform(r[i],s(u.trans[r[i]],t));for(i=h.length-1;i>=0;i--)a.style(h[i],s(u.styles[h[i]],t));u._during&&u._during.call(a,t,function(e,i){return s({from:e,to:i},t)})},"number"==typeof t&&(this.timeout=setTimeout(function(){var n=(new Date).getTime();u.situation={interval:1e3/60,start:n,play:!0,finish:n+t,duration:t},u.render=function(){if(u.situation.play===!0){var n=(new Date).getTime(),r=n>u.situation.finish?1:(n-u.situation.start)/t;u.to(r),n>u.situation.finish?(u._plot&&a.plot(new c.PointArray(u._plot.destination).settle()),u._loop===!0||"number"==typeof u._loop&&u._loop>1?("number"==typeof u._loop&&--u._loop,u.animate(t,e,i)):u._after?u._after.apply(a,[u]):u.stop()):requestAnimFrame(u.render)}else requestAnimFrame(u.render)},u.render()},new c.Number(i).valueOf())),this},bbox:function(){return this.target.bbox()},attr:function(t,e){if("object"==typeof t)for(var i in t)this.attr(i,t[i]);else{var n=this.target.attr(t);this.attrs[t]=c.Color.isColor(n)?new c.Color(n).morph(e):c.regex.unit.test(n)?new c.Number(n).morph(e):{from:n,to:e}}return this},transform:function(t,e){if(1==arguments.length){t=a(t),delete t.matrix;for(e in t)this.trans[e]={from:this.target.trans[e],to:t[e]}}else{var i={};i[t]=e,this.transform(i)}return this},style:function(t,e){if("object"==typeof t)for(var i in t)this.style(i,t[i]);else this.styles[t]={from:this.target.style(t),to:e};return this},x:function(t){return this._x=new c.Number(this.target.x()).morph(t),this},y:function(t){return this._y=new c.Number(this.target.y()).morph(t),this},cx:function(t){return this._cx=new c.Number(this.target.cx()).morph(t),this},cy:function(t){return this._cy=new c.Number(this.target.cy()).morph(t),this},move:function(t,e){return this.x(t).y(e)},center:function(t,e){return this.cx(t).cy(e)},size:function(t,e){if(this.target instanceof c.Text)this.attr("font-size",t);else{var i=this.target.bbox();this._size={width:new c.Number(i.width).morph(t),height:new c.Number(i.height).morph(e)}}return this},plot:function(t){return this._plot=t,this},leading:function(t){return this.target._leading&&(this._leading=new c.Number(this.target._leading).morph(t)),this},viewbox:function(t,e,i,n){if(this.target instanceof c.Container){var r=this.target.viewbox();this._viewbox={x:new c.Number(r.x).morph(t),y:new c.Number(r.y).morph(e),width:new c.Number(r.width).morph(i),height:new c.Number(r.height).morph(n)}}return this},update:function(t){return this.target instanceof c.Stop&&(null!=t.opacity&&this.attr("stop-opacity",t.opacity),null!=t.color&&this.attr("stop-color",t.color),null!=t.offset&&this.attr("offset",new c.Number(t.offset))),this},during:function(t){return this._during=t,this},after:function(t){return this._after=t,this},loop:function(t){return this._loop=t||!0,this},stop:function(t){return t===!0?(this.animate(0),this._after&&this._after.apply(this.target,[this])):(clearTimeout(this.timeout),this.attrs={},this.trans={},this.styles={},this.situation={},delete this._x,delete this._y,delete this._cx,delete this._cy,delete this._size,delete this._plot,delete this._loop,delete this._after,delete this._during,delete this._leading,delete this._viewbox),this},pause:function(){return this.situation.play===!0&&(this.situation.play=!1,this.situation.pause=(new Date).getTime()),this},play:function(){if(this.situation.play===!1){var t=(new Date).getTime()-this.situation.pause;this.situation.finish+=t,this.situation.start+=t,this.situation.play=!0}return this}},parent:c.Element,construct:{animate:function(t,e,i){return(this.fx||(this.fx=new c.FX(this))).stop().animate(t,e,i)},stop:function(t){return this.fx&&this.fx.stop(t),this},pause:function(){return this.fx&&this.fx.pause(),this},play:function(){return this.fx&&this.fx.play(),this}}}),c.extend(c.Element,c.FX,{dx:function(t){return this.x((this.target||this).x()+t)},dy:function(t){return this.y((this.target||this).y()+t)},dmove:function(t,e){return this.dx(t).dy(e)}}),["click","dblclick","mousedown","mouseup","mouseover","mouseout","mousemove","mouseenter","mouseleave","touchstart","touchmove","touchleave","touchend","touchcancel"].forEach(function(t){c.Element.prototype[t]=function(e){var i=this;return this.node["on"+t]="function"==typeof e?function(){return e.apply(i,arguments)}:null,this}}),c.events={},c.listeners={},c.registerEvent=function(t){c.events[t]||(c.events[t]=new l(t))},c.on=function(t,e,i){var n=i.bind(t.instance||t);c.listeners[i]=n,t.addEventListener(e,n,!1)},c.off=function(t,e,i){t.removeEventListener(e,c.listeners[i],!1),delete c.listeners[i]},c.extend(c.Element,{on:function(t,e){return c.on(this.node,t,e),this},off:function(t,e){return c.off(this.node,t,e),this},fire:function(t,e){return c.events[t].detail=e,this.node.dispatchEvent(c.events[t]),delete c.events[t].detail,this}}),c.Defs=c.invent({create:"defs",inherit:c.Container}),c.G=c.invent({create:"g",inherit:c.Container,extend:{x:function(t){return null==t?this.trans.x:this.transform("x",t)},y:function(t){return null==t?this.trans.y:this.transform("y",t)},cx:function(t){return null==t?this.bbox().cx:this.x(t-this.bbox().width/2)},cy:function(t){return null==t?this.bbox().cy:this.y(t-this.bbox().height/2)}},construct:{group:function(){return this.put(new c.G)}}}),c.extend(c.Element,{siblings:function(){return this.parent().children()},position:function(){return this.parent().index(this)},next:function(){return this.siblings()[this.position()+1]},previous:function(){return this.siblings()[this.position()-1]},forward:function(){var t=this.position()+1,e=this.parent();return e.removeElement(this).add(this,t),e instanceof c.Doc&&e.node.appendChild(e.defs().node),this},backward:function(){var t=this.position();return t>0&&this.parent().removeElement(this).add(this,t-1),this},front:function(){var t=this.parent();return t.node.appendChild(this.node),t instanceof c.Doc&&t.node.appendChild(t.defs().node),this},back:function(){return this.position()>0&&this.parent().removeElement(this).add(this,0),this},before:function(t){t.remove();var e=this.position();return this.parent().add(t,e),this},after:function(t){t.remove();var e=this.position();return this.parent().add(t,e+1),this}}),c.Mask=c.invent({create:function(){this.constructor.call(this,c.create("mask")),this.targets=[]},inherit:c.Container,extend:{remove:function(){for(var t=this.targets.length-1;t>=0;t--)this.targets[t]&&this.targets[t].unmask();return delete this.targets,this.parent().removeElement(this),this}},construct:{mask:function(){return this.defs().put(new c.Mask)}}}),c.extend(c.Element,{maskWith:function(t){return this.masker=t instanceof c.Mask?t:this.parent().mask().add(t),this.masker.targets.push(this),this.attr("mask",'url("#'+this.masker.attr("id")+'")')},unmask:function(){return delete this.masker,this.attr("mask",null)}}),c.ClipPath=c.invent({create:function(){this.constructor.call(this,c.create("clipPath")),this.targets=[]},inherit:c.Container,extend:{remove:function(){for(var t=this.targets.length-1;t>=0;t--)this.targets[t]&&this.targets[t].unclip();return delete this.targets,this.parent().removeElement(this),this}},construct:{clip:function(){return this.defs().put(new c.ClipPath)}}}),c.extend(c.Element,{clipWith:function(t){return this.clipper=t instanceof c.ClipPath?t:this.parent().clip().add(t),this.clipper.targets.push(this),this.attr("clip-path",'url("#'+this.clipper.attr("id")+'")')},unclip:function(){return delete this.clipper,this.attr("clip-path",null)}}),c.Gradient=c.invent({create:function(t){this.constructor.call(this,c.create(t+"Gradient")),this.type=t},inherit:c.Container,extend:{from:function(t,e){return"radial"==this.type?this.attr({fx:new c.Number(t),fy:new c.Number(e)}):this.attr({x1:new c.Number(t),y1:new c.Number(e)})},to:function(t,e){return"radial"==this.type?this.attr({cx:new c.Number(t),cy:new c.Number(e)}):this.attr({x2:new c.Number(t),y2:new c.Number(e)})},radius:function(t){return"radial"==this.type?this.attr({r:new c.Number(t)}):this},at:function(t,e,i){return this.put(new c.Stop).update(t,e,i)},update:function(t){return this.clear(),"function"==typeof t&&t.call(this,this),this},fill:function(){return"url(#"+this.id()+")"},toString:function(){return this.fill()}},construct:{gradient:function(t,e){return this.defs().gradient(t,e)}}}),c.extend(c.Defs,{gradient:function(t,e){return this.put(new c.Gradient(t)).update(e)}}),c.Stop=c.invent({create:"stop",inherit:c.Element,extend:{update:function(t){return("number"==typeof t||t instanceof c.Number)&&(t={offset:arguments[0],color:arguments[1],opacity:arguments[2]}),null!=t.opacity&&this.attr("stop-opacity",t.opacity),null!=t.color&&this.attr("stop-color",t.color),null!=t.offset&&this.attr("offset",new c.Number(t.offset)),this}}}),c.Pattern=c.invent({create:"pattern",inherit:c.Container,extend:{fill:function(){return"url(#"+this.id()+")"},update:function(t){return this.clear(),"function"==typeof t&&t.call(this,this),this},toString:function(){return this.fill()}},construct:{pattern:function(t,e,i){return this.defs().pattern(t,e,i)}}}),c.extend(c.Defs,{pattern:function(t,e,i){return this.put(new c.Pattern).update(i).attr({x:0,y:0,width:t,height:e,patternUnits:"userSpaceOnUse"})}}),c.Doc=c.invent({create:function(t){t="string"==typeof t?document.getElementById(t):t,"svg"==t.nodeName?this.constructor.call(this,t):(this.constructor.call(this,c.create("svg")),t.appendChild(this.node)),this.attr({xmlns:c.ns,version:"1.1",width:"100%",height:"100%"}).attr("xmlns:xlink",c.xlink,c.xmlns).defs()},inherit:c.Container,extend:{defs:function(){if(!this._defs){var t;this._defs=(t=this.node.getElementsByTagName("defs")[0])?c.adopt(t):new c.Defs,this.node.appendChild(this._defs.node)}return this._defs},parent:function(){return"#document"==this.node.parentNode.nodeName?null:this.node.parentNode}}}),c.extend(c.Doc,{spof:function(){if(this.doSpof){var t=this.node.getScreenCTM();t&&this.style("left",-t.e%1+"px").style("top",-t.f%1+"px")}return this},fixSubPixelOffset:function(){var t=this;return this.doSpof=!0,c.on(window,"resize",function(){t.spof()}),this.spof()}}),c.Shape=c.invent({create:function(t){this.constructor.call(this,t)},inherit:c.Element}),c.Symbol=c.invent({create:"symbol",inherit:c.Container,construct:{symbol:function(){return this.defs().put(new c.Symbol)}}}),c.Use=c.invent({create:"use",inherit:c.Shape,extend:{element:function(t){return this.target=t,this.attr("href","#"+t,c.xlink)}},construct:{use:function(t){return this.put(new c.Use).element(t)}}}),c.Rect=c.invent({create:"rect",inherit:c.Shape,construct:{rect:function(t,e){return this.put((new c.Rect).size(t,e))}}}),c.Ellipse=c.invent({create:"ellipse",inherit:c.Shape,extend:{x:function(t){return null==t?this.cx()-this.attr("rx"):this.cx(t+this.attr("rx"))},y:function(t){return null==t?this.cy()-this.attr("ry"):this.cy(t+this.attr("ry"))},cx:function(t){return null==t?this.attr("cx"):this.attr("cx",new c.Number(t).divide(this.trans.scaleX))},cy:function(t){return null==t?this.attr("cy"):this.attr("cy",new c.Number(t).divide(this.trans.scaleY))},width:function(t){return null==t?2*this.attr("rx"):this.attr("rx",new c.Number(t).divide(2))},height:function(t){return null==t?2*this.attr("ry"):this.attr("ry",new c.Number(t).divide(2))},size:function(t,e){var i=r(this.bbox(),t,e);return this.attr({rx:new c.Number(i.width).divide(2),ry:new c.Number(i.height).divide(2)})}},construct:{circle:function(t){return this.ellipse(t,t)},ellipse:function(t,e){return this.put(new c.Ellipse).size(t,e).move(0,0)
-}}}),c.Line=c.invent({create:"line",inherit:c.Shape,extend:{x:function(t){var e=this.bbox();return null==t?e.x:this.attr({x1:this.attr("x1")-e.x+t,x2:this.attr("x2")-e.x+t})},y:function(t){var e=this.bbox();return null==t?e.y:this.attr({y1:this.attr("y1")-e.y+t,y2:this.attr("y2")-e.y+t})},cx:function(t){var e=this.bbox().width/2;return null==t?this.x()+e:this.x(t-e)},cy:function(t){var e=this.bbox().height/2;return null==t?this.y()+e:this.y(t-e)},width:function(t){var e=this.bbox();return null==t?e.width:this.attr(this.attr("x1")<this.attr("x2")?"x2":"x1",e.x+t)},height:function(t){var e=this.bbox();return null==t?e.height:this.attr(this.attr("y1")<this.attr("y2")?"y2":"y1",e.y+t)},size:function(t,e){var i=r(this.bbox(),t,e);return this.width(i.width).height(i.height)},plot:function(t,e,i,n){return this.attr({x1:t,y1:e,x2:i,y2:n})}},construct:{line:function(t,e,i,n){return this.put((new c.Line).plot(t,e,i,n))}}}),c.Polyline=c.invent({create:"polyline",inherit:c.Shape,construct:{polyline:function(t){return this.put(new c.Polyline).plot(t)}}}),c.Polygon=c.invent({create:"polygon",inherit:c.Shape,construct:{polygon:function(t){return this.put(new c.Polygon).plot(t)}}}),c.extend(c.Polyline,c.Polygon,{morphArray:c.PointArray,plot:function(t){return this.attr("points",this.array=new c.PointArray(t,[[0,0]]))},move:function(t,e){return this.attr("points",this.array.move(t,e))},x:function(t){return null==t?this.bbox().x:this.move(t,this.bbox().y)},y:function(t){return null==t?this.bbox().y:this.move(this.bbox().x,t)},width:function(t){var e=this.bbox();return null==t?e.width:this.size(t,e.height)},height:function(t){var e=this.bbox();return null==t?e.height:this.size(e.width,t)},size:function(t,e){var i=r(this.bbox(),t,e);return this.attr("points",this.array.size(i.width,i.height))}}),c.Path=c.invent({create:"path",inherit:c.Shape,extend:{plot:function(t){return this.attr("d",this.array=new c.PathArray(t,[["M",0,0]]))},move:function(t,e){return this.attr("d",this.array.move(t,e))},x:function(t){return null==t?this.bbox().x:this.move(t,this.bbox().y)},y:function(t){return null==t?this.bbox().y:this.move(this.bbox().x,t)},size:function(t,e){var i=r(this.bbox(),t,e);return this.attr("d",this.array.size(i.width,i.height))},width:function(t){return null==t?this.bbox().width:this.size(t,this.bbox().height)},height:function(t){return null==t?this.bbox().height:this.size(this.bbox().width,t)}},construct:{path:function(t){return this.put(new c.Path).plot(t)}}}),c.Image=c.invent({create:"image",inherit:c.Shape,extend:{load:function(t){if(!t)return this;var e=this,i=document.createElement("img");return i.onload=function(){var n=e.doc(c.Pattern);0==e.width()&&0==e.height()&&e.size(i.width,i.height),n&&0==n.width()&&0==n.height()&&n.size(e.width(),e.height()),"function"==typeof e._loaded&&e._loaded.call(e,{width:i.width,height:i.height,ratio:i.width/i.height,url:t})},this.attr("href",i.src=this.src=t,c.xlink)},loaded:function(t){return this._loaded=t,this}},construct:{image:function(t,e,i){return this.put(new c.Image).load(t).size(e||0,i||e||0)}}}),c.Text=c.invent({create:function(){this.constructor.call(this,c.create("text")),this._leading=new c.Number(1.3),this._rebuild=!0,this._build=!1,this.attr("font-family",c.defaults.attrs["font-family"])},inherit:c.Shape,extend:{x:function(t){return null==t?this.attr("x"):(this.textPath||this.lines.each(function(){this.newLined&&this.x(t)}),this.attr("x",t))},y:function(t){var e=this.attr("y"),i="number"==typeof e?e-this.bbox().y:0;return null==t?"number"==typeof e?e-i:e:this.attr("y","number"==typeof t?t+i:t)},cx:function(t){return null==t?this.bbox().cx:this.x(t-this.bbox().width/2)},cy:function(t){return null==t?this.bbox().cy:this.y(t-this.bbox().height/2)},text:function(t){if("undefined"==typeof t)return this.content;if(this.clear().build(!0),"function"==typeof t)t.call(this,this);else{t=(this.content=t).split("\n");for(var e=0,i=t.length;i>e;e++)this.tspan(t[e]).newLine()}return this.build(!1).rebuild()},size:function(t){return this.attr("font-size",t).rebuild()},leading:function(t){return null==t?this._leading:(this._leading=new c.Number(t),this.rebuild())},rebuild:function(t){if("boolean"==typeof t&&(this._rebuild=t),this._rebuild){var e=this;this.lines.each(function(){this.newLined&&(this.textPath||this.attr("x",e.attr("x")),this.attr("dy",e._leading*new c.Number(e.attr("font-size"))))}),this.fire("rebuild")}return this},build:function(t){return this._build=!!t,this}},construct:{text:function(t){return this.put(new c.Text).text(t)},plain:function(t){return this.put(new c.Text).plain(t)}}}),c.TSpan=c.invent({create:"tspan",inherit:c.Shape,extend:{text:function(t){return"function"==typeof t?t.call(this,this):this.plain(t),this},dx:function(t){return this.attr("dx",t)},dy:function(t){return this.attr("dy",t)},newLine:function(){var t=this.doc(c.Text);return this.newLined=!0,this.dy(t._leading*t.attr("font-size")).attr("x",t.x())}}}),c.extend(c.Text,c.TSpan,{plain:function(t){return this._build===!1&&this.clear(),this.node.appendChild(document.createTextNode(this.content=t)),this},tspan:function(t){var e=(this.textPath||this).node,i=new c.TSpan;return this._build===!1&&this.clear(),e.appendChild(i.node),this instanceof c.Text&&this.lines.add(i),i.text(t)},clear:function(){for(var t=(this.textPath||this).node;t.hasChildNodes();)t.removeChild(t.lastChild);return this instanceof c.Text&&(delete this.lines,this.lines=new c.Set,this.content=""),this},length:function(){return this.node.getComputedTextLength()}}),c.registerEvent("rebuild"),c.TextPath=c.invent({create:"textPath",inherit:c.Element,parent:c.Text,construct:{path:function(t){for(this.textPath=new c.TextPath;this.node.hasChildNodes();)this.textPath.node.appendChild(this.node.firstChild);return this.node.appendChild(this.textPath.node),this.track=this.doc().defs().path(t),this.textPath.parent=this,this.textPath.attr("href","#"+this.track,c.xlink),this},plot:function(t){return this.track&&this.track.plot(t),this}}}),c.Nested=c.invent({create:function(){this.constructor.call(this,c.create("svg")),this.style("overflow","visible")},inherit:c.Container,construct:{nested:function(){return this.put(new c.Nested)}}}),c.A=c.invent({create:"a",inherit:c.Container,extend:{to:function(t){return this.attr("href",t,c.xlink)},show:function(t){return this.attr("show",t,c.xlink)},target:function(t){return this.attr("target",t)}},construct:{link:function(t){return this.put(new c.A).to(t)}}}),c.extend(c.Element,{linkTo:function(t){var e=new c.A;return"function"==typeof t?t.call(e,e):e.to(t),this.parent().put(e).put(this)}}),c.Marker=c.invent({create:"marker",inherit:c.Container,extend:{width:function(t){return this.attr("markerWidth",t)},height:function(t){return this.attr("markerHeight",t)},ref:function(t,e){return this.attr("refX",t).attr("refY",e)},update:function(t){return this.clear(),"function"==typeof t&&t.call(this,this),this},toString:function(){return"url(#"+this.id()+")"}},construct:{marker:function(t,e,i){return this.defs().marker(t,e,i)}}}),c.extend(c.Defs,{marker:function(t,e,i){return this.put(new c.Marker).size(t,e).ref(t/2,e/2).viewbox(0,0,t,e).attr("orient","auto").update(i)}}),c.extend(c.Line,c.Polyline,c.Polygon,c.Path,{marker:function(t,e,i,n){var r=["marker"];return"all"!=t&&r.push(t),r=r.join("-"),t=arguments[1]instanceof c.Marker?arguments[1]:this.doc().marker(e,i,n),this.attr(r,t)}});var f={stroke:["color","width","opacity","linecap","linejoin","miterlimit","dasharray","dashoffset"],fill:["color","opacity","rule"],prefix:function(t,e){return"color"==e?t:t+"-"+e}};["fill","stroke"].forEach(function(t){var e,i={};i[t]=function(i){if("string"==typeof i||c.Color.isRgb(i)||i&&"function"==typeof i.fill)this.attr(t,i);else for(e=f[t].length-1;e>=0;e--)null!=i[f[t][e]]&&this.attr(f.prefix(t,f[t][e]),i[f[t][e]]);return this},c.extend(c.Element,c.FX,i)}),c.extend(c.Element,c.FX,{rotate:function(t,e,i){return this.transform({rotation:t||0,cx:e,cy:i})},skew:function(t,e){return this.transform({skewX:t||0,skewY:e||0})},scale:function(t,e){return this.transform({scaleX:t,scaleY:null==e?t:e})},translate:function(t,e){return this.transform({x:t,y:e})},matrix:function(t){return this.transform({matrix:t})},opacity:function(t){return this.attr("opacity",t)}}),c.extend(c.Rect,c.Ellipse,c.FX,{radius:function(t,e){return this.attr({rx:t,ry:e||t})}}),c.extend(c.Path,{length:function(){return this.node.getTotalLength()},pointAt:function(t){return this.node.getPointAtLength(t)}}),c.extend(c.Parent,c.Text,c.FX,{font:function(t){for(var e in t)"leading"==e?this.leading(t[e]):"anchor"==e?this.attr("text-anchor",t[e]):"size"==e||"family"==e||"weight"==e||"stretch"==e||"variant"==e||"style"==e?this.attr("font-"+e,t[e]):this.attr(e,t[e]);return this}}),c.Set=c.invent({create:function(t){Array.isArray(t)?this.members=t:this.clear()},extend:{add:function(){var t,e,i=[].slice.call(arguments);for(t=0,e=i.length;e>t;t++)this.members.push(i[t]);return this},remove:function(t){var e=this.index(t);return e>-1&&this.members.splice(e,1),this},each:function(t){for(var e=0,i=this.members.length;i>e;e++)t.apply(this.members[e],[e,this.members]);return this},clear:function(){return this.members=[],this},has:function(t){return this.index(t)>=0},index:function(t){return this.members.indexOf(t)},get:function(t){return this.members[t]},first:function(){return this.get(0)},last:function(){return this.get(this.members.length-1)},valueOf:function(){return this.members},bbox:function(){var t=new c.BBox;if(0==this.members.length)return t;var e=this.members[0].rbox();return t.x=e.x,t.y=e.y,t.width=e.width,t.height=e.height,this.each(function(){t=t.merge(this.rbox())}),t}},construct:{set:function(t){return new c.Set(t)}}}),c.SetFX=c.invent({create:function(t){this.set=t}}),c.Set.inherit=function(){var t,e=[];for(var t in c.Shape.prototype)"function"==typeof c.Shape.prototype[t]&&"function"!=typeof c.Set.prototype[t]&&e.push(t);e.forEach(function(t){c.Set.prototype[t]=function(){for(var e=0,i=this.members.length;i>e;e++)this.members[e]&&"function"==typeof this.members[e][t]&&this.members[e][t].apply(this.members[e],arguments);return"animate"==t?this.fx||(this.fx=new c.SetFX(this)):this}}),e=[];for(var t in c.FX.prototype)"function"==typeof c.FX.prototype[t]&&"function"!=typeof c.SetFX.prototype[t]&&e.push(t);e.forEach(function(t){c.SetFX.prototype[t]=function(){for(var e=0,i=this.set.members.length;i>e;e++)this.set.members[e].fx[t].apply(this.set.members[e].fx,arguments);return this}})},c.extend(c.Element,{data:function(t,e,i){if("object"==typeof t)for(e in t)this.data(e,t[e]);else if(arguments.length<2)try{return JSON.parse(this.attr("data-"+t))}catch(n){return this.attr("data-"+t)}else this.attr("data-"+t,null===e?null:i===!0||"string"==typeof e||"number"==typeof e?e:JSON.stringify(e));return this}}),c.extend(c.Element,{remember:function(t,e){if("object"==typeof arguments[0])for(var e in t)this.remember(e,t[e]);else{if(1==arguments.length)return this.memory()[t];this.memory()[t]=e}return this},forget:function(){if(0==arguments.length)this._memory={};else for(var t=arguments.length-1;t>=0;t--)delete this.memory()[arguments[t]];return this},memory:function(){return this._memory||(this._memory={})}}),c.get=function(t){var e=document.getElementById(u(t)||t);return e?c.adopt(e):void 0},c.select=function(t,e){return new c.Set(c.utils.map((e||document).querySelectorAll(t),function(t){return c.adopt(t)}))},c.extend(c.Parent,{select:function(t){return c.select(t,this.node)}}),"function"==typeof define&&define.amd?define(function(){return c}):"undefined"!=typeof exports&&(exports.SVG=c),window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.msRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}(),"function"!=typeof l&&(l.prototype=window.Event.prototype,window.CustomEvent=l)}).call(this);
\ No newline at end of file
+(function(){function t(t){return t.toLowerCase().replace(/-(.)/g,function(t,e){return e.toUpperCase()})}function e(t){return t.charAt(0).toUpperCase()+t.slice(1)}function i(t){return 4==t.length?["#",t.substring(1,2),t.substring(1,2),t.substring(2,3),t.substring(2,3),t.substring(3,4),t.substring(3,4)].join(""):t}function n(t){var e=t.toString(16);return 1==e.length?"0"+e:e}function r(t,e,i){return(null==e||null==i)&&(null==i?i=t.height/t.width*e:null==e&&(e=t.width/t.height*i)),{width:e,height:i}}function s(t,e){return"number"==typeof t.from?t.from+(t.to-t.from)*e:t instanceof c.Color||t instanceof c.Number?t.at(e):1>e?t.from:t.to}function h(t){for(var e=0,i=t.length,n="";i>e;e++)n+=t[e][0],null!=t[e][1]&&(n+=t[e][1],null!=t[e][2]&&(n+=" ",n+=t[e][2],null!=t[e][3]&&(n+=" ",n+=t[e][3],n+=" ",n+=t[e][4],null!=t[e][5]&&(n+=" ",n+=t[e][5],n+=" ",n+=t[e][6],null!=t[e][7]&&(n+=" ",n+=t[e][7])))));return n+" "}function o(t){t.x2=t.x+t.width,t.y2=t.y+t.height,t.cx=t.x+t.width/2,t.cy=t.y+t.height/2}function a(t){if(t.matrix){var e=t.matrix.replace(/\s/g,"").split(",");6==e.length&&(t.a=parseFloat(e[0]),t.b=parseFloat(e[1]),t.c=parseFloat(e[2]),t.d=parseFloat(e[3]),t.e=parseFloat(e[4]),t.f=parseFloat(e[5]))}return t}function u(t){var e=t.toString().match(c.regex.reference);return e?e[1]:void 0}function l(t,e){e=e||{bubbles:!1,cancelable:!1,detail:void 0};var i=document.createEvent("CustomEvent");return i.initCustomEvent(t,e.bubbles,e.cancelable,e.detail),i}var c=this.SVG=function(t){return c.supported?(t=new c.Doc(t),c.parser||c.prepare(t),t):void 0};if(c.ns="http://www.w3.org/2000/svg",c.xmlns="http://www.w3.org/2000/xmlns/",c.xlink="http://www.w3.org/1999/xlink",c.did=1e3,c.eid=function(t){return"Svgjs"+e(t)+c.did++},c.create=function(t){var e=document.createElementNS(this.ns,t);return e.setAttribute("id",this.eid(t)),e},c.extend=function(){var t,e,i,n;for(t=[].slice.call(arguments),e=t.pop(),n=t.length-1;n>=0;n--)if(t[n])for(i in e)t[n].prototype[i]=e[i];c.Set&&c.Set.inherit&&c.Set.inherit()},c.prepare=function(t){var e=document.getElementsByTagName("body")[0],i=(e?new c.Doc(e):t.nested()).size(2,0),n=c.create("path");i.node.appendChild(n),c.parser={body:e||t.parent(),draw:i.style("opacity:0;position:fixed;left:100%;top:100%;overflow:hidden"),poly:i.polyline().node,path:n}},c.supported=function(){return!!document.createElementNS&&!!document.createElementNS(c.ns,"svg").createSVGRect}(),!c.supported)return!1;c.invent=function(t){var e="function"==typeof t.create?t.create:function(){this.constructor.call(this,c.create(t.create))};return t.inherit&&(e.prototype=new t.inherit),t.extend&&c.extend(e,t.extend),t.construct&&c.extend(t.parent||c.Container,t.construct),e},c.adopt=function(t){if(t.instance)return t.instance;var i;return i="svg"==t.nodeName?t.parentNode instanceof SVGElement?new c.Nested:new c.Doc:"lineairGradient"==t.nodeName?new c.Gradient("lineair"):"radialGradient"==t.nodeName?new c.Gradient("radial"):new(c[e(t.nodeName)]),i.type=t.nodeName,i.node=t,t.instance=i,i instanceof c.Doc&&i.namespace().defs(),i},c.regex={unit:/^(-?[\d\.]+)([a-z%]{0,2})$/,hex:/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i,rgb:/rgb\((\d+),(\d+),(\d+)\)/,reference:/#([a-z0-9\-_]+)/i,isHex:/^#[a-f0-9]{3,6}$/i,isRgb:/^rgb\(/,isCss:/[^:]+:[^;]+;?/,isBlank:/^(\s+)?$/,isNumber:/^-?[\d\.]+$/,isPercent:/^-?[\d\.]+%$/,isImage:/\.(jpg|jpeg|png|gif)(\?[^=]+.*)?/i,isEvent:/^[\w]+:[\w]+$/},c.utils={map:function(t,e){var i,n=t.length,r=[];for(i=0;n>i;i++)r.push(e(t[i]));return r}},c.defaults={matrix:"1 0 0 1 0 0",attrs:{"fill-opacity":1,"stroke-opacity":1,"stroke-width":0,"stroke-linejoin":"miter","stroke-linecap":"butt",fill:"#000000",stroke:"#000000",opacity:1,x:0,y:0,cx:0,cy:0,width:0,height:0,r:0,rx:0,ry:0,offset:0,"stop-opacity":1,"stop-color":"#000000","font-size":16,"font-family":"Helvetica, Arial, sans-serif","text-anchor":"start"},trans:function(){return{x:0,y:0,scaleX:1,scaleY:1,rotation:0,skewX:0,skewY:0,matrix:this.matrix,a:1,b:0,c:0,d:1,e:0,f:0}}},c.Color=function(t){var e;this.r=0,this.g=0,this.b=0,"string"==typeof t?c.regex.isRgb.test(t)?(e=c.regex.rgb.exec(t.replace(/\s/g,"")),this.r=parseInt(e[1]),this.g=parseInt(e[2]),this.b=parseInt(e[3])):c.regex.isHex.test(t)&&(e=c.regex.hex.exec(i(t)),this.r=parseInt(e[1],16),this.g=parseInt(e[2],16),this.b=parseInt(e[3],16)):"object"==typeof t&&(this.r=t.r,this.g=t.g,this.b=t.b)},c.extend(c.Color,{toString:function(){return this.toHex()},toHex:function(){return"#"+n(this.r)+n(this.g)+n(this.b)},toRgb:function(){return"rgb("+[this.r,this.g,this.b].join()+")"},brightness:function(){return this.r/255*.3+this.g/255*.59+this.b/255*.11},morph:function(t){return this.destination=new c.Color(t),this},at:function(t){return this.destination?(t=0>t?0:t>1?1:t,new c.Color({r:~~(this.r+(this.destination.r-this.r)*t),g:~~(this.g+(this.destination.g-this.g)*t),b:~~(this.b+(this.destination.b-this.b)*t)})):this}}),c.Color.test=function(t){return t+="",c.regex.isHex.test(t)||c.regex.isRgb.test(t)},c.Color.isRgb=function(t){return t&&"number"==typeof t.r&&"number"==typeof t.g&&"number"==typeof t.b},c.Color.isColor=function(t){return c.Color.isRgb(t)||c.Color.test(t)},c.Array=function(t,e){t=(t||[]).valueOf(),0==t.length&&e&&(t=e.valueOf()),this.value=this.parse(t)},c.extend(c.Array,{morph:function(t){if(this.destination=this.parse(t),this.value.length!=this.destination.length){for(var e=this.value[this.value.length-1],i=this.destination[this.destination.length-1];this.value.length>this.destination.length;)this.destination.push(i);for(;this.value.length<this.destination.length;)this.value.push(e)}return this},settle:function(){for(var t=0,e=this.value.length,i=[];e>t;t++)-1==i.indexOf(this.value[t])&&i.push(this.value[t]);return this.value=i},at:function(t){if(!this.destination)return this;for(var e=0,i=this.value.length,n=[];i>e;e++)n.push(this.value[e]+(this.destination[e]-this.value[e])*t);return new c.Array(n)},toString:function(){return this.value.join(" ")},valueOf:function(){return this.value},parse:function(t){return t=t.valueOf(),Array.isArray(t)?t:this.split(t)},split:function(t){return t.replace(/\s+/g," ").replace(/^\s+|\s+$/g,"").split(" ")},reverse:function(){return this.value.reverse(),this}}),c.PointArray=function(t,e){this.constructor.call(this,t,e||[[0,0]])},c.PointArray.prototype=new c.Array,c.extend(c.PointArray,{toString:function(){for(var t=0,e=this.value.length,i=[];e>t;t++)i.push(this.value[t].join(","));return i.join(" ")},at:function(t){if(!this.destination)return this;for(var e=0,i=this.value.length,n=[];i>e;e++)n.push([this.value[e][0]+(this.destination[e][0]-this.value[e][0])*t,this.value[e][1]+(this.destination[e][1]-this.value[e][1])*t]);return new c.PointArray(n)},parse:function(t){if(t=t.valueOf(),Array.isArray(t))return t;t=this.split(t);for(var e,i=0,n=t.length,r=[];n>i;i++)e=t[i].split(","),r.push([parseFloat(e[0]),parseFloat(e[1])]);return r},move:function(t,e){var i=this.bbox();if(t-=i.x,e-=i.y,!isNaN(t)&&!isNaN(e))for(var n=this.value.length-1;n>=0;n--)this.value[n]=[this.value[n][0]+t,this.value[n][1]+e];return this},size:function(t,e){var i,n=this.bbox();for(i=this.value.length-1;i>=0;i--)this.value[i][0]=(this.value[i][0]-n.x)*t/n.width+n.x,this.value[i][1]=(this.value[i][1]-n.y)*e/n.height+n.y;return this},bbox:function(){return c.parser.poly.setAttribute("points",this.toString()),c.parser.poly.getBBox()}}),c.PathArray=function(t,e){this.constructor.call(this,t,e||[["M",0,0]])},c.PathArray.prototype=new c.Array,c.extend(c.PathArray,{toString:function(){return h(this.value)},move:function(t,e){var i=this.bbox();if(t-=i.x,e-=i.y,!isNaN(t)&&!isNaN(e))for(var n,r=this.value.length-1;r>=0;r--)n=this.value[r][0],"M"==n||"L"==n||"T"==n?(this.value[r][1]+=t,this.value[r][2]+=e):"H"==n?this.value[r][1]+=t:"V"==n?this.value[r][1]+=e:"C"==n||"S"==n||"Q"==n?(this.value[r][1]+=t,this.value[r][2]+=e,this.value[r][3]+=t,this.value[r][4]+=e,"C"==n&&(this.value[r][5]+=t,this.value[r][6]+=e)):"A"==n&&(this.value[r][6]+=t,this.value[r][7]+=e);return this},size:function(t,e){var i,n,r=this.bbox();for(i=this.value.length-1;i>=0;i--)n=this.value[i][0],"M"==n||"L"==n||"T"==n?(this.value[i][1]=(this.value[i][1]-r.x)*t/r.width+r.x,this.value[i][2]=(this.value[i][2]-r.y)*e/r.height+r.y):"H"==n?this.value[i][1]=(this.value[i][1]-r.x)*t/r.width+r.x:"V"==n?this.value[i][1]=(this.value[i][1]-r.y)*e/r.height+r.y:"C"==n||"S"==n||"Q"==n?(this.value[i][1]=(this.value[i][1]-r.x)*t/r.width+r.x,this.value[i][2]=(this.value[i][2]-r.y)*e/r.height+r.y,this.value[i][3]=(this.value[i][3]-r.x)*t/r.width+r.x,this.value[i][4]=(this.value[i][4]-r.y)*e/r.height+r.y,"C"==n&&(this.value[i][5]=(this.value[i][5]-r.x)*t/r.width+r.x,this.value[i][6]=(this.value[i][6]-r.y)*e/r.height+r.y)):"A"==n&&(this.value[i][1]=this.value[i][1]*t/r.width,this.value[i][2]=this.value[i][2]*e/r.height,this.value[i][6]=(this.value[i][6]-r.x)*t/r.width+r.x,this.value[i][7]=(this.value[i][7]-r.y)*e/r.height+r.y);return this},parse:function(t){if(t instanceof c.PathArray)return t.valueOf();var e,i,n,r,s,o,a,u,l,f,d,p=0,m=0;for(c.parser.path.setAttribute("d","string"==typeof t?t:h(t)),d=c.parser.path.pathSegList,e=0,i=d.numberOfItems;i>e;++e)f=d.getItem(e),l=f.pathSegTypeAsLetter,"M"==l||"L"==l||"H"==l||"V"==l||"C"==l||"S"==l||"Q"==l||"T"==l||"A"==l?("x"in f&&(p=f.x),"y"in f&&(m=f.y)):("x1"in f&&(s=p+f.x1),"x2"in f&&(a=p+f.x2),"y1"in f&&(o=m+f.y1),"y2"in f&&(u=m+f.y2),"x"in f&&(p+=f.x),"y"in f&&(m+=f.y),"m"==l?d.replaceItem(c.parser.path.createSVGPathSegMovetoAbs(p,m),e):"l"==l?d.replaceItem(c.parser.path.createSVGPathSegLinetoAbs(p,m),e):"h"==l?d.replaceItem(c.parser.path.createSVGPathSegLinetoHorizontalAbs(p),e):"v"==l?d.replaceItem(c.parser.path.createSVGPathSegLinetoVerticalAbs(m),e):"c"==l?d.replaceItem(c.parser.path.createSVGPathSegCurvetoCubicAbs(p,m,s,o,a,u),e):"s"==l?d.replaceItem(c.parser.path.createSVGPathSegCurvetoCubicSmoothAbs(p,m,a,u),e):"q"==l?d.replaceItem(c.parser.path.createSVGPathSegCurvetoQuadraticAbs(p,m,s,o),e):"t"==l?d.replaceItem(c.parser.path.createSVGPathSegCurvetoQuadraticSmoothAbs(p,m),e):"a"==l?d.replaceItem(c.parser.path.createSVGPathSegArcAbs(p,m,f.r1,f.r2,f.angle,f.largeArcFlag,f.sweepFlag),e):("z"==l||"Z"==l)&&(p=n,m=r)),("M"==l||"m"==l)&&(n=p,r=m);for(t=[],d=c.parser.path.pathSegList,e=0,i=d.numberOfItems;i>e;++e)f=d.getItem(e),l=f.pathSegTypeAsLetter,p=[l],"M"==l||"L"==l||"T"==l?p.push(f.x,f.y):"H"==l?p.push(f.x):"V"==l?p.push(f.y):"C"==l?p.push(f.x1,f.y1,f.x2,f.y2,f.x,f.y):"S"==l?p.push(f.x2,f.y2,f.x,f.y):"Q"==l?p.push(f.x1,f.y1,f.x,f.y):"A"==l&&p.push(f.r1,f.r2,f.angle,0|f.largeArcFlag,0|f.sweepFlag,f.x,f.y),t.push(p);return t},bbox:function(){return c.parser.path.setAttribute("d",this.toString()),c.parser.path.getBBox()}}),c.Number=function(t){if(this.value=0,this.unit="","number"==typeof t)this.value=isNaN(t)?0:isFinite(t)?t:0>t?-3.4e38:3.4e38;else if("string"==typeof t){var e=t.match(c.regex.unit);e&&(this.value=parseFloat(e[1]),"%"==e[2]?this.value/=100:"s"==e[2]&&(this.value*=1e3),this.unit=e[2])}else t instanceof c.Number&&(this.value=t.value,this.unit=t.unit)},c.extend(c.Number,{toString:function(){return("%"==this.unit?~~(1e8*this.value)/1e6:"s"==this.unit?this.value/1e3:this.value)+this.unit},valueOf:function(){return this.value},plus:function(t){return this.value=this+new c.Number(t),this},minus:function(t){return this.plus(-new c.Number(t))},times:function(t){return this.value=this*new c.Number(t),this},divide:function(t){return this.value=this/new c.Number(t),this},to:function(t){return"string"==typeof t&&(this.unit=t),this},morph:function(t){return this.destination=new c.Number(t),this},at:function(t){return this.destination?new c.Number(this.destination).minus(this).times(t).plus(this):this}}),c.ViewBox=function(t){var e,i,n,r,s=1,h=1,o=t.bbox(),a=(t.attr("viewBox")||"").match(/-?[\d\.]+/g),u=t,l=t;for(n=new c.Number(t.width()),r=new c.Number(t.height());"%"==n.unit;)s*=n.value,n=new c.Number(u instanceof c.Doc?u.parent().offsetWidth:u.parent().width()),u=u.parent();for(;"%"==r.unit;)h*=r.value,r=new c.Number(l instanceof c.Doc?l.parent().offsetHeight:l.parent().height()),l=l.parent();this.x=o.x,this.y=o.y,this.width=n*s,this.height=r*h,this.zoom=1,a&&(e=parseFloat(a[0]),i=parseFloat(a[1]),n=parseFloat(a[2]),r=parseFloat(a[3]),this.zoom=this.width/this.height>n/r?this.height/r:this.width/n,this.x=e,this.y=i,this.width=n,this.height=r)},c.extend(c.ViewBox,{toString:function(){return this.x+" "+this.y+" "+this.width+" "+this.height}}),c.BBox=function(t){var e;if(this.x=0,this.y=0,this.width=0,this.height=0,t){try{e=t.node.getBBox()}catch(i){e={x:t.node.clientLeft,y:t.node.clientTop,width:t.node.clientWidth,height:t.node.clientHeight}}this.x=e.x+t.trans.x,this.y=e.y+t.trans.y,this.width=e.width*t.trans.scaleX,this.height=e.height*t.trans.scaleY}o(this)},c.extend(c.BBox,{merge:function(t){var e=new c.BBox;return e.x=Math.min(this.x,t.x),e.y=Math.min(this.y,t.y),e.width=Math.max(this.x+this.width,t.x+t.width)-e.x,e.height=Math.max(this.y+this.height,t.y+t.height)-e.y,o(e),e}}),c.RBox=function(t){var e,i,n={};if(this.x=0,this.y=0,this.width=0,this.height=0,t){for(e=t.doc().parent(),i=t.doc().viewbox().zoom,n=t.node.getBoundingClientRect(),this.x=n.left,this.y=n.top,this.x-=e.offsetLeft,this.y-=e.offsetTop;e=e.offsetParent;)this.x-=e.offsetLeft,this.y-=e.offsetTop;for(e=t;e.parent&&(e=e.parent());)"svg"==e.type&&e.viewbox&&(i*=e.viewbox().zoom,this.x-=e.x()||0,this.y-=e.y()||0)}this.x/=i,this.y/=i,this.width=n.width/=i,this.height=n.height/=i,this.x+=window.scrollX,this.y+=window.scrollY,o(this)},c.extend(c.RBox,{merge:function(t){var e=new c.RBox;return e.x=Math.min(this.x,t.x),e.y=Math.min(this.y,t.y),e.width=Math.max(this.x+this.width,t.x+t.width)-e.x,e.height=Math.max(this.y+this.height,t.y+t.height)-e.y,o(e),e}}),c.Element=c.invent({create:function(t){this._stroke=c.defaults.attrs.stroke,this.trans=c.defaults.trans(),(this.node=t)&&(this.type=t.nodeName,this.node.instance=this)},extend:{x:function(t){return null!=t&&(t=new c.Number(t),t.value/=this.trans.scaleX),this.attr("x",t)},y:function(t){return null!=t&&(t=new c.Number(t),t.value/=this.trans.scaleY),this.attr("y",t)},cx:function(t){return null==t?this.x()+this.width()/2:this.x(t-this.width()/2)},cy:function(t){return null==t?this.y()+this.height()/2:this.y(t-this.height()/2)},move:function(t,e){return this.x(t).y(e)},center:function(t,e){return this.cx(t).cy(e)},width:function(t){return this.attr("width",t)},height:function(t){return this.attr("height",t)},size:function(t,e){var i=r(this.bbox(),t,e);return this.width(new c.Number(i.width)).height(new c.Number(i.height))},clone:function(){var t,e,i=this.type;return t="rect"==i||"ellipse"==i?this.parent()[i](0,0):"line"==i?this.parent()[i](0,0,0,0):"image"==i?this.parent()[i](this.src):"text"==i?this.parent()[i](this.content):"path"==i?this.parent()[i](this.attr("d")):"polyline"==i||"polygon"==i?this.parent()[i](this.attr("points")):"g"==i?this.parent().group():this.parent()[i](),e=this.attr(),delete e.id,t.attr(e),t.trans=this.trans,t.transform({})},remove:function(){return this.parent()&&this.parent().removeElement(this),this},replace:function(t){return this.after(t).remove(),t},addTo:function(t){return t.put(this)},putIn:function(t){return t.add(this)},doc:function(t){return this.parent(t||c.Doc)},attr:function(t,e,i){if(null==t){for(t={},e=this.node.attributes,i=e.length-1;i>=0;i--)t[e[i].nodeName]=c.regex.isNumber.test(e[i].nodeValue)?parseFloat(e[i].nodeValue):e[i].nodeValue;return t}if("object"==typeof t)for(e in t)this.attr(e,t[e]);else if(null===e)this.node.removeAttribute(t);else{if(null==e)return e=this.node.getAttribute(t),null==e?c.defaults.attrs[t]:c.regex.isNumber.test(e)?parseFloat(e):e;if("style"==t)return this.style(e);"stroke-width"==t?this.attr("stroke",parseFloat(e)>0?this._stroke:null):"stroke"==t&&(this._stroke=e),("fill"==t||"stroke"==t)&&(c.regex.isImage.test(e)&&(e=this.doc().defs().image(e,0,0)),e instanceof c.Image&&(e=this.doc().defs().pattern(0,0,function(){this.add(e)}))),"number"==typeof e?e=new c.Number(e):c.Color.isColor(e)?e=new c.Color(e):Array.isArray(e)&&(e=new c.Array(e)),"leading"==t?this.leading&&this.leading(e):"string"==typeof i?this.node.setAttributeNS(i,t,e.toString()):this.node.setAttribute(t,e.toString()),!this.rebuild||"font-size"!=t&&"x"!=t||this.rebuild(t,e)}return this},transform:function(t,e){if(0==arguments.length)return this.trans;if("string"==typeof t){if(arguments.length<2)return this.trans[t];var i={};return i[t]=e,this.transform(i)}var i=[];t=a(t);for(e in t)null!=t[e]&&(this.trans[e]=t[e]);return this.trans.matrix=this.trans.a+" "+this.trans.b+" "+this.trans.c+" "+this.trans.d+" "+this.trans.e+" "+this.trans.f,t=this.trans,t.matrix!=c.defaults.matrix&&i.push("matrix("+t.matrix+")"),0!=t.rotation&&i.push("rotate("+t.rotation+" "+(null==t.cx?this.bbox().cx:t.cx)+" "+(null==t.cy?this.bbox().cy:t.cy)+")"),(1!=t.scaleX||1!=t.scaleY)&&i.push("scale("+t.scaleX+" "+t.scaleY+")"),0!=t.skewX&&i.push("skewX("+t.skewX+")"),0!=t.skewY&&i.push("skewY("+t.skewY+")"),(0!=t.x||0!=t.y)&&i.push("translate("+new c.Number(t.x/t.scaleX)+" "+new c.Number(t.y/t.scaleY)+")"),0==i.length?this.node.removeAttribute("transform"):this.node.setAttribute("transform",i.join(" ")),this},style:function(e,i){if(0==arguments.length)return this.node.style.cssText||"";if(arguments.length<2)if("object"==typeof e)for(i in e)this.style(i,e[i]);else{if(!c.regex.isCss.test(e))return this.node.style[t(e)];e=e.split(";");for(var n=0;n<e.length;n++)i=e[n].split(":"),this.style(i[0].replace(/\s+/g,""),i[1])}else this.node.style[t(e)]=null===i||c.regex.isBlank.test(i)?"":i;return this},id:function(t){return this.attr("id",t)},bbox:function(){return new c.BBox(this)},rbox:function(){return new c.RBox(this)},inside:function(t,e){var i=this.bbox();return t>i.x&&e>i.y&&t<i.x+i.width&&e<i.y+i.height},show:function(){return this.style("display","")},hide:function(){return this.style("display","none")},visible:function(){return"none"!=this.style("display")},toString:function(){return this.attr("id")},classes:function(){var t=this.attr("class");return null==t?[]:t.trim().split(/\s+/)},hasClass:function(t){return-1!=this.classes().indexOf(t)},addClass:function(t){if(!this.hasClass(t)){var e=this.classes();e.push(t),this.attr("class",e.join(" "))}return this},removeClass:function(t){if(this.hasClass(t)){var e=this.classes().filter(function(e){return e!=t});this.attr("class",e.join(" "))}return this},toggleClass:function(t){return this.hasClass(t)?this.removeClass(t):this.addClass(t)},reference:function(t){return c.get(this.attr(t))},parent:function(t){var e=c.adopt(this.node.parentNode);if(t)for(;!(e instanceof t);)e=c.adopt(e.node.parentNode);return e}}}),c.Parent=c.invent({create:function(t){this.constructor.call(this,t)},inherit:c.Element,extend:{children:function(){return c.utils.map(this.node.childNodes,function(t){return c.adopt(t)})},add:function(t,e){return this.has(t)||(e=null==e?this.children().length:e,this.node.insertBefore(t.node,this.node.childNodes[e]||null)),this},put:function(t,e){return this.add(t,e),t},has:function(t){return this.index(t)>=0},index:function(t){return this.children().indexOf(t)},get:function(t){return this.children()[t]},first:function(){return this.children()[0]},last:function(){return this.children()[this.children().length-1]},each:function(t,e){var i,n,r=this.children();for(i=0,n=r.length;n>i;i++)r[i]instanceof c.Element&&t.apply(r[i],[i,r]),e&&r[i]instanceof c.Container&&r[i].each(t,e);return this},removeElement:function(t){return this.node.removeChild(t.node),this},clear:function(){for(;this.node.hasChildNodes();)this.node.removeChild(this.node.lastChild);return delete this._defs,this},defs:function(){return this.doc().defs()}}}),c.Container=c.invent({create:function(t){this.constructor.call(this,t)},inherit:c.Parent,extend:{viewbox:function(t){return 0==arguments.length?new c.ViewBox(this):(t=1==arguments.length?[t.x,t.y,t.width,t.height]:[].slice.call(arguments),this.attr("viewBox",t))}}}),c.FX=c.invent({create:function(t){this.target=t},extend:{animate:function(t,e,i){var n,r,h,o,a=this.target,u=this;return"object"==typeof t&&(i=t.delay,e=t.ease,t=t.duration),t="="==t?t:null==t?1e3:new c.Number(t).valueOf(),e=e||"<>",u.to=function(t){var i;if(t=0>t?0:t>1?1:t,null==n){n=[];for(o in u.attrs)n.push(o);if(a.morphArray&&(u._plot||n.indexOf("points")>-1)){var l,c=new a.morphArray(u._plot||u.attrs.points||a.array);u._size&&c.size(u._size.width.to,u._size.height.to),l=c.bbox(),u._x?c.move(u._x.to,l.y):u._cx&&c.move(u._cx.to-l.width/2,l.y),l=c.bbox(),u._y?c.move(l.x,u._y.to):u._cy&&c.move(l.x,u._cy.to-l.height/2),delete u._x,delete u._y,delete u._cx,delete u._cy,delete u._size,u._plot=a.array.morph(c)}}if(null==r){r=[];for(o in u.trans)r.push(o)}if(null==h){h=[];for(o in u.styles)h.push(o)}for(t="<>"==e?-Math.cos(t*Math.PI)/2+.5:">"==e?Math.sin(t*Math.PI/2):"<"==e?-Math.cos(t*Math.PI/2)+1:"-"==e?t:"function"==typeof e?e(t):t,u._plot?a.plot(u._plot.at(t)):(u._x?a.x(u._x.at(t)):u._cx&&a.cx(u._cx.at(t)),u._y?a.y(u._y.at(t)):u._cy&&a.cy(u._cy.at(t)),u._size&&a.size(u._size.width.at(t),u._size.height.at(t))),u._viewbox&&a.viewbox(u._viewbox.x.at(t),u._viewbox.y.at(t),u._viewbox.width.at(t),u._viewbox.height.at(t)),u._leading&&a.leading(u._leading.at(t)),i=n.length-1;i>=0;i--)a.attr(n[i],s(u.attrs[n[i]],t));for(i=r.length-1;i>=0;i--)a.transform(r[i],s(u.trans[r[i]],t));for(i=h.length-1;i>=0;i--)a.style(h[i],s(u.styles[h[i]],t));u._during&&u._during.call(a,t,function(e,i){return s({from:e,to:i},t)})},"number"==typeof t&&(this.timeout=setTimeout(function(){var n=(new Date).getTime();u.situation={interval:1e3/60,start:n,play:!0,finish:n+t,duration:t},u.render=function(){if(u.situation.play===!0){var n=(new Date).getTime(),r=n>u.situation.finish?1:(n-u.situation.start)/t;u.to(r),n>u.situation.finish?(u._plot&&a.plot(new c.PointArray(u._plot.destination).settle()),u._loop===!0||"number"==typeof u._loop&&u._loop>1?("number"==typeof u._loop&&--u._loop,u.animate(t,e,i)):u._after?u._after.apply(a,[u]):u.stop()):requestAnimFrame(u.render)}else requestAnimFrame(u.render)},u.render()},new c.Number(i).valueOf())),this},bbox:function(){return this.target.bbox()},attr:function(t,e){if("object"==typeof t)for(var i in t)this.attr(i,t[i]);else{var n=this.target.attr(t);this.attrs[t]=c.Color.isColor(n)?new c.Color(n).morph(e):c.regex.unit.test(n)?new c.Number(n).morph(e):{from:n,to:e}}return this},transform:function(t,e){if(1==arguments.length){t=a(t),delete t.matrix;for(e in t)this.trans[e]={from:this.target.trans[e],to:t[e]}}else{var i={};i[t]=e,this.transform(i)}return this},style:function(t,e){if("object"==typeof t)for(var i in t)this.style(i,t[i]);else this.styles[t]={from:this.target.style(t),to:e};return this},x:function(t){return this._x=new c.Number(this.target.x()).morph(t),this},y:function(t){return this._y=new c.Number(this.target.y()).morph(t),this},cx:function(t){return this._cx=new c.Number(this.target.cx()).morph(t),this},cy:function(t){return this._cy=new c.Number(this.target.cy()).morph(t),this},move:function(t,e){return this.x(t).y(e)},center:function(t,e){return this.cx(t).cy(e)},size:function(t,e){if(this.target instanceof c.Text)this.attr("font-size",t);else{var i=this.target.bbox();this._size={width:new c.Number(i.width).morph(t),height:new c.Number(i.height).morph(e)}}return this},plot:function(t){return this._plot=t,this},leading:function(t){return this.target._leading&&(this._leading=new c.Number(this.target._leading).morph(t)),this},viewbox:function(t,e,i,n){if(this.target instanceof c.Container){var r=this.target.viewbox();this._viewbox={x:new c.Number(r.x).morph(t),y:new c.Number(r.y).morph(e),width:new c.Number(r.width).morph(i),height:new c.Number(r.height).morph(n)}}return this},update:function(t){return this.target instanceof c.Stop&&(null!=t.opacity&&this.attr("stop-opacity",t.opacity),null!=t.color&&this.attr("stop-color",t.color),null!=t.offset&&this.attr("offset",new c.Number(t.offset))),this},during:function(t){return this._during=t,this},after:function(t){return this._after=t,this},loop:function(t){return this._loop=t||!0,this},stop:function(t){return t===!0?(this.animate(0),this._after&&this._after.apply(this.target,[this])):(clearTimeout(this.timeout),this.attrs={},this.trans={},this.styles={},this.situation={},delete this._x,delete this._y,delete this._cx,delete this._cy,delete this._size,delete this._plot,delete this._loop,delete this._after,delete this._during,delete this._leading,delete this._viewbox),this},pause:function(){return this.situation.play===!0&&(this.situation.play=!1,this.situation.pause=(new Date).getTime()),this},play:function(){if(this.situation.play===!1){var t=(new Date).getTime()-this.situation.pause;this.situation.finish+=t,this.situation.start+=t,this.situation.play=!0}return this}},parent:c.Element,construct:{animate:function(t,e,i){return(this.fx||(this.fx=new c.FX(this))).stop().animate(t,e,i)},stop:function(t){return this.fx&&this.fx.stop(t),this},pause:function(){return this.fx&&this.fx.pause(),this},play:function(){return this.fx&&this.fx.play(),this}}}),c.extend(c.Element,c.FX,{dx:function(t){return this.x((this.target||this).x()+t)},dy:function(t){return this.y((this.target||this).y()+t)},dmove:function(t,e){return this.dx(t).dy(e)}}),["click","dblclick","mousedown","mouseup","mouseover","mouseout","mousemove","mouseenter","mouseleave","touchstart","touchmove","touchleave","touchend","touchcancel"].forEach(function(t){c.Element.prototype[t]=function(e){var i=this;return this.node["on"+t]="function"==typeof e?function(){return e.apply(i,arguments)}:null,this}}),c.events={},c.listeners={},c.registerEvent=function(t){c.events[t]||(c.events[t]=new l(t))},c.on=function(t,e,i){var n=i.bind(t.instance||t);c.listeners[i]=n,t.addEventListener(e,n,!1)},c.off=function(t,e,i){t.removeEventListener(e,c.listeners[i],!1),delete c.listeners[i]},c.extend(c.Element,{on:function(t,e){return c.on(this.node,t,e),this},off:function(t,e){return c.off(this.node,t,e),this},fire:function(t,e){return c.events[t].detail=e,this.node.dispatchEvent(c.events[t]),delete c.events[t].detail,this}}),c.Defs=c.invent({create:"defs",inherit:c.Container}),c.G=c.invent({create:"g",inherit:c.Container,extend:{x:function(t){return null==t?this.trans.x:this.transform("x",t)},y:function(t){return null==t?this.trans.y:this.transform("y",t)},cx:function(t){return null==t?this.bbox().cx:this.x(t-this.bbox().width/2)},cy:function(t){return null==t?this.bbox().cy:this.y(t-this.bbox().height/2)}},construct:{group:function(){return this.put(new c.G)}}}),c.extend(c.Element,{siblings:function(){return this.parent().children()},position:function(){return this.parent().index(this)},next:function(){return this.siblings()[this.position()+1]},previous:function(){return this.siblings()[this.position()-1]},forward:function(){var t=this.position()+1,e=this.parent();return e.removeElement(this).add(this,t),e instanceof c.Doc&&e.node.appendChild(e.defs().node),this},backward:function(){var t=this.position();return t>0&&this.parent().removeElement(this).add(this,t-1),this},front:function(){var t=this.parent();return t.node.appendChild(this.node),t instanceof c.Doc&&t.node.appendChild(t.defs().node),this},back:function(){return this.position()>0&&this.parent().removeElement(this).add(this,0),this},before:function(t){t.remove();var e=this.position();return this.parent().add(t,e),this},after:function(t){t.remove();var e=this.position();return this.parent().add(t,e+1),this}}),c.Mask=c.invent({create:function(){this.constructor.call(this,c.create("mask")),this.targets=[]},inherit:c.Container,extend:{remove:function(){for(var t=this.targets.length-1;t>=0;t--)this.targets[t]&&this.targets[t].unmask();return delete this.targets,this.parent().removeElement(this),this}},construct:{mask:function(){return this.defs().put(new c.Mask)}}}),c.extend(c.Element,{maskWith:function(t){return this.masker=t instanceof c.Mask?t:this.parent().mask().add(t),this.masker.targets.push(this),this.attr("mask",'url("#'+this.masker.attr("id")+'")')},unmask:function(){return delete this.masker,this.attr("mask",null)}}),c.ClipPath=c.invent({create:function(){this.constructor.call(this,c.create("clipPath")),this.targets=[]},inherit:c.Container,extend:{remove:function(){for(var t=this.targets.length-1;t>=0;t--)this.targets[t]&&this.targets[t].unclip();return delete this.targets,this.parent().removeElement(this),this}},construct:{clip:function(){return this.defs().put(new c.ClipPath)}}}),c.extend(c.Element,{clipWith:function(t){return this.clipper=t instanceof c.ClipPath?t:this.parent().clip().add(t),this.clipper.targets.push(this),this.attr("clip-path",'url("#'+this.clipper.attr("id")+'")')},unclip:function(){return delete this.clipper,this.attr("clip-path",null)}}),c.Gradient=c.invent({create:function(t){this.constructor.call(this,c.create(t+"Gradient")),this.type=t},inherit:c.Container,extend:{from:function(t,e){return"radial"==this.type?this.attr({fx:new c.Number(t),fy:new c.Number(e)}):this.attr({x1:new c.Number(t),y1:new c.Number(e)})},to:function(t,e){return"radial"==this.type?this.attr({cx:new c.Number(t),cy:new c.Number(e)}):this.attr({x2:new c.Number(t),y2:new c.Number(e)})},radius:function(t){return"radial"==this.type?this.attr({r:new c.Number(t)}):this},at:function(t,e,i){return this.put(new c.Stop).update(t,e,i)},update:function(t){return this.clear(),"function"==typeof t&&t.call(this,this),this},fill:function(){return"url(#"+this.id()+")"},toString:function(){return this.fill()}},construct:{gradient:function(t,e){return this.defs().gradient(t,e)}}}),c.extend(c.Defs,{gradient:function(t,e){return this.put(new c.Gradient(t)).update(e)}}),c.Stop=c.invent({create:"stop",inherit:c.Element,extend:{update:function(t){return("number"==typeof t||t instanceof c.Number)&&(t={offset:arguments[0],color:arguments[1],opacity:arguments[2]}),null!=t.opacity&&this.attr("stop-opacity",t.opacity),null!=t.color&&this.attr("stop-color",t.color),null!=t.offset&&this.attr("offset",new c.Number(t.offset)),this}}}),c.Pattern=c.invent({create:"pattern",inherit:c.Container,extend:{fill:function(){return"url(#"+this.id()+")"},update:function(t){return this.clear(),"function"==typeof t&&t.call(this,this),this},toString:function(){return this.fill()}},construct:{pattern:function(t,e,i){return this.defs().pattern(t,e,i)}}}),c.extend(c.Defs,{pattern:function(t,e,i){return this.put(new c.Pattern).update(i).attr({x:0,y:0,width:t,height:e,patternUnits:"userSpaceOnUse"})}}),c.Doc=c.invent({create:function(t){t&&(t="string"==typeof t?document.getElementById(t):t,"svg"==t.nodeName?this.constructor.call(this,t):(this.constructor.call(this,c.create("svg")),t.appendChild(this.node)),this.namespace().size("100%","100%").defs())},inherit:c.Container,extend:{namespace:function(){return this.attr({xmlns:c.ns,version:"1.1"}).attr("xmlns:xlink",c.xlink,c.xmlns)},defs:function(){if(!this._defs){var t;this._defs=(t=this.node.getElementsByTagName("defs")[0])?c.adopt(t):new c.Defs,this.node.appendChild(this._defs.node)}return this._defs},parent:function(){return"#document"==this.node.parentNode.nodeName?null:this.node.parentNode}}}),c.extend(c.Doc,{spof:function(){if(this.doSpof){var t=this.node.getScreenCTM();t&&this.style("left",-t.e%1+"px").style("top",-t.f%1+"px")}return this},fixSubPixelOffset:function(){var t=this;return this.doSpof=!0,c.on(window,"resize",function(){t.spof()}),this.spof()}}),c.Shape=c.invent({create:function(t){this.constructor.call(this,t)},inherit:c.Element}),c.Symbol=c.invent({create:"symbol",inherit:c.Container,construct:{symbol:function(){return this.defs().put(new c.Symbol)}}}),c.Use=c.invent({create:"use",inherit:c.Shape,extend:{element:function(t){return this.target=t,this.attr("href","#"+t,c.xlink)}},construct:{use:function(t){return this.put(new c.Use).element(t)}}}),c.Rect=c.invent({create:"rect",inherit:c.Shape,construct:{rect:function(t,e){return this.put((new c.Rect).size(t,e))}}}),c.Circle=c.invent({create:"circle",inherit:c.Shape,construct:{circle:function(t){return this.put(new c.Circle).rx(new c.Number(t).divide(2)).move(0,0)}}}),c.extend(c.Circle,c.FX,{rx:function(t){return this.attr("r",t)},ry:function(t){return this.rx(t)}}),c.Ellipse=c.invent({create:"ellipse",inherit:c.Shape,construct:{ellipse:function(t,e){return this.put(new c.Ellipse).size(t,e).move(0,0)}}}),c.extend(c.Ellipse,c.Rect,c.FX,{rx:function(t){return this.attr("rx",t)},ry:function(t){return this.attr("ry",t)}}),c.extend(c.Circle,c.Ellipse,{x:function(t){return null==t?this.cx()-this.rx():this.cx(t+this.rx())},y:function(t){return null==t?this.cy()-this.ry():this.cy(t+this.ry())},cx:function(t){return null==t?this.attr("cx"):this.attr("cx",new c.Number(t).divide(this.trans.scaleX))
+},cy:function(t){return null==t?this.attr("cy"):this.attr("cy",new c.Number(t).divide(this.trans.scaleY))},width:function(t){return null==t?2*this.rx():this.rx(new c.Number(t).divide(2))},height:function(t){return null==t?2*this.ry():this.ry(new c.Number(t).divide(2))},size:function(t,e){var i=r(this.bbox(),t,e);return this.rx(new c.Number(i.width).divide(2)).ry(new c.Number(i.height).divide(2))}}),c.Line=c.invent({create:"line",inherit:c.Shape,extend:{x:function(t){var e=this.bbox();return null==t?e.x:this.attr({x1:this.attr("x1")-e.x+t,x2:this.attr("x2")-e.x+t})},y:function(t){var e=this.bbox();return null==t?e.y:this.attr({y1:this.attr("y1")-e.y+t,y2:this.attr("y2")-e.y+t})},cx:function(t){var e=this.bbox().width/2;return null==t?this.x()+e:this.x(t-e)},cy:function(t){var e=this.bbox().height/2;return null==t?this.y()+e:this.y(t-e)},width:function(t){var e=this.bbox();return null==t?e.width:this.attr(this.attr("x1")<this.attr("x2")?"x2":"x1",e.x+t)},height:function(t){var e=this.bbox();return null==t?e.height:this.attr(this.attr("y1")<this.attr("y2")?"y2":"y1",e.y+t)},size:function(t,e){var i=r(this.bbox(),t,e);return this.width(i.width).height(i.height)},plot:function(t,e,i,n){return this.attr({x1:t,y1:e,x2:i,y2:n})}},construct:{line:function(t,e,i,n){return this.put((new c.Line).plot(t,e,i,n))}}}),c.Polyline=c.invent({create:"polyline",inherit:c.Shape,construct:{polyline:function(t){return this.put(new c.Polyline).plot(t)}}}),c.Polygon=c.invent({create:"polygon",inherit:c.Shape,construct:{polygon:function(t){return this.put(new c.Polygon).plot(t)}}}),c.extend(c.Polyline,c.Polygon,{morphArray:c.PointArray,array:function(){return this._array||(this._array=new c.PointArray(this.attr("points")))},plot:function(t){return this.attr("points",this._array=new c.PointArray(t))},move:function(t,e){return this.attr("points",this.array().move(t,e))},x:function(t){return null==t?this.bbox().x:this.move(t,this.bbox().y)},y:function(t){return null==t?this.bbox().y:this.move(this.bbox().x,t)},width:function(t){var e=this.bbox();return null==t?e.width:this.size(t,e.height)},height:function(t){var e=this.bbox();return null==t?e.height:this.size(e.width,t)},size:function(t,e){var i=r(this.bbox(),t,e);return this.attr("points",this.array().size(i.width,i.height))}}),c.Path=c.invent({create:"path",inherit:c.Shape,extend:{morphArray:c.PathArray,array:function(){return this._array||(this._array=new c.PathArray(this.attr("d")))},plot:function(t){return this.attr("d",this._array=new c.PathArray(t))},move:function(t,e){return this.attr("d",this.array().move(t,e))},x:function(t){return null==t?this.bbox().x:this.move(t,this.bbox().y)},y:function(t){return null==t?this.bbox().y:this.move(this.bbox().x,t)},size:function(t,e){var i=r(this.bbox(),t,e);return this.attr("d",this.array().size(i.width,i.height))},width:function(t){return null==t?this.bbox().width:this.size(t,this.bbox().height)},height:function(t){return null==t?this.bbox().height:this.size(this.bbox().width,t)}},construct:{path:function(t){return this.put(new c.Path).plot(t)}}}),c.Image=c.invent({create:"image",inherit:c.Shape,extend:{load:function(t){if(!t)return this;var e=this,i=document.createElement("img");return i.onload=function(){var n=e.doc(c.Pattern);0==e.width()&&0==e.height()&&e.size(i.width,i.height),n&&0==n.width()&&0==n.height()&&n.size(e.width(),e.height()),"function"==typeof e._loaded&&e._loaded.call(e,{width:i.width,height:i.height,ratio:i.width/i.height,url:t})},this.attr("href",i.src=this.src=t,c.xlink)},loaded:function(t){return this._loaded=t,this}},construct:{image:function(t,e,i){return this.put(new c.Image).load(t).size(e||0,i||e||0)}}}),c.Text=c.invent({create:function(){this.constructor.call(this,c.create("text")),this._leading=new c.Number(1.3),this._rebuild=!0,this._build=!1,this.attr("font-family",c.defaults.attrs["font-family"])},inherit:c.Shape,extend:{x:function(t){return null==t?this.attr("x"):(this.textPath||this.lines.each(function(){this.newLined&&this.x(t)}),this.attr("x",t))},y:function(t){var e=this.attr("y"),i="number"==typeof e?e-this.bbox().y:0;return null==t?"number"==typeof e?e-i:e:this.attr("y","number"==typeof t?t+i:t)},cx:function(t){return null==t?this.bbox().cx:this.x(t-this.bbox().width/2)},cy:function(t){return null==t?this.bbox().cy:this.y(t-this.bbox().height/2)},text:function(t){if("undefined"==typeof t)return this.content;if(this.clear().build(!0),"function"==typeof t)t.call(this,this);else{t=(this.content=t).split("\n");for(var e=0,i=t.length;i>e;e++)this.tspan(t[e]).newLine()}return this.build(!1).rebuild()},size:function(t){return this.attr("font-size",t).rebuild()},leading:function(t){return null==t?this._leading:(this._leading=new c.Number(t),this.rebuild())},rebuild:function(t){if("boolean"==typeof t&&(this._rebuild=t),this._rebuild){var e=this;this.lines.each(function(){this.newLined&&(this.textPath||this.attr("x",e.attr("x")),this.attr("dy",e._leading*new c.Number(e.attr("font-size"))))}),this.fire("rebuild")}return this},build:function(t){return this._build=!!t,this}},construct:{text:function(t){return this.put(new c.Text).text(t)},plain:function(t){return this.put(new c.Text).plain(t)}}}),c.TSpan=c.invent({create:"tspan",inherit:c.Shape,extend:{text:function(t){return"function"==typeof t?t.call(this,this):this.plain(t),this},dx:function(t){return this.attr("dx",t)},dy:function(t){return this.attr("dy",t)},newLine:function(){var t=this.doc(c.Text);return this.newLined=!0,this.dy(t._leading*t.attr("font-size")).attr("x",t.x())}}}),c.extend(c.Text,c.TSpan,{plain:function(t){return this._build===!1&&this.clear(),this.node.appendChild(document.createTextNode(this.content=t)),this},tspan:function(t){var e=(this.textPath||this).node,i=new c.TSpan;return this._build===!1&&this.clear(),e.appendChild(i.node),this instanceof c.Text&&this.lines.add(i),i.text(t)},clear:function(){for(var t=(this.textPath||this).node;t.hasChildNodes();)t.removeChild(t.lastChild);return this instanceof c.Text&&(delete this.lines,this.lines=new c.Set,this.content=""),this},length:function(){return this.node.getComputedTextLength()}}),c.registerEvent("rebuild"),c.TextPath=c.invent({create:"textPath",inherit:c.Element,parent:c.Text,construct:{path:function(t){for(this.textPath=new c.TextPath;this.node.hasChildNodes();)this.textPath.node.appendChild(this.node.firstChild);return this.node.appendChild(this.textPath.node),this.track=this.doc().defs().path(t),this.textPath.parent=this,this.textPath.attr("href","#"+this.track,c.xlink),this},plot:function(t){return this.track&&this.track.plot(t),this}}}),c.Nested=c.invent({create:function(){this.constructor.call(this,c.create("svg")),this.style("overflow","visible")},inherit:c.Container,construct:{nested:function(){return this.put(new c.Nested)}}}),c.A=c.invent({create:"a",inherit:c.Container,extend:{to:function(t){return this.attr("href",t,c.xlink)},show:function(t){return this.attr("show",t,c.xlink)},target:function(t){return this.attr("target",t)}},construct:{link:function(t){return this.put(new c.A).to(t)}}}),c.extend(c.Element,{linkTo:function(t){var e=new c.A;return"function"==typeof t?t.call(e,e):e.to(t),this.parent().put(e).put(this)}}),c.Marker=c.invent({create:"marker",inherit:c.Container,extend:{width:function(t){return this.attr("markerWidth",t)},height:function(t){return this.attr("markerHeight",t)},ref:function(t,e){return this.attr("refX",t).attr("refY",e)},update:function(t){return this.clear(),"function"==typeof t&&t.call(this,this),this},toString:function(){return"url(#"+this.id()+")"}},construct:{marker:function(t,e,i){return this.defs().marker(t,e,i)}}}),c.extend(c.Defs,{marker:function(t,e,i){return this.put(new c.Marker).size(t,e).ref(t/2,e/2).viewbox(0,0,t,e).attr("orient","auto").update(i)}}),c.extend(c.Line,c.Polyline,c.Polygon,c.Path,{marker:function(t,e,i,n){var r=["marker"];return"all"!=t&&r.push(t),r=r.join("-"),t=arguments[1]instanceof c.Marker?arguments[1]:this.doc().marker(e,i,n),this.attr(r,t)}});var f={stroke:["color","width","opacity","linecap","linejoin","miterlimit","dasharray","dashoffset"],fill:["color","opacity","rule"],prefix:function(t,e){return"color"==e?t:t+"-"+e}};["fill","stroke"].forEach(function(t){var e,i={};i[t]=function(i){if("string"==typeof i||c.Color.isRgb(i)||i&&"function"==typeof i.fill)this.attr(t,i);else for(e=f[t].length-1;e>=0;e--)null!=i[f[t][e]]&&this.attr(f.prefix(t,f[t][e]),i[f[t][e]]);return this},c.extend(c.Element,c.FX,i)}),c.extend(c.Element,c.FX,{rotate:function(t,e,i){return this.transform({rotation:t||0,cx:e,cy:i})},skew:function(t,e){return this.transform({skewX:t||0,skewY:e||0})},scale:function(t,e){return this.transform({scaleX:t,scaleY:null==e?t:e})},translate:function(t,e){return this.transform({x:t,y:e})},matrix:function(t){return this.transform({matrix:t})},opacity:function(t){return this.attr("opacity",t)}}),c.extend(c.Rect,c.Ellipse,c.Circle,c.FX,{radius:function(t,e){return this.rx(t).ry(null==e?t:e)}}),c.extend(c.Path,{length:function(){return this.node.getTotalLength()},pointAt:function(t){return this.node.getPointAtLength(t)}}),c.extend(c.Parent,c.Text,c.FX,{font:function(t){for(var e in t)"leading"==e?this.leading(t[e]):"anchor"==e?this.attr("text-anchor",t[e]):"size"==e||"family"==e||"weight"==e||"stretch"==e||"variant"==e||"style"==e?this.attr("font-"+e,t[e]):this.attr(e,t[e]);return this}}),c.Set=c.invent({create:function(t){Array.isArray(t)?this.members=t:this.clear()},extend:{add:function(){var t,e,i=[].slice.call(arguments);for(t=0,e=i.length;e>t;t++)this.members.push(i[t]);return this},remove:function(t){var e=this.index(t);return e>-1&&this.members.splice(e,1),this},each:function(t){for(var e=0,i=this.members.length;i>e;e++)t.apply(this.members[e],[e,this.members]);return this},clear:function(){return this.members=[],this},has:function(t){return this.index(t)>=0},index:function(t){return this.members.indexOf(t)},get:function(t){return this.members[t]},first:function(){return this.get(0)},last:function(){return this.get(this.members.length-1)},valueOf:function(){return this.members},bbox:function(){var t=new c.BBox;if(0==this.members.length)return t;var e=this.members[0].rbox();return t.x=e.x,t.y=e.y,t.width=e.width,t.height=e.height,this.each(function(){t=t.merge(this.rbox())}),t}},construct:{set:function(t){return new c.Set(t)}}}),c.SetFX=c.invent({create:function(t){this.set=t}}),c.Set.inherit=function(){var t,e=[];for(var t in c.Shape.prototype)"function"==typeof c.Shape.prototype[t]&&"function"!=typeof c.Set.prototype[t]&&e.push(t);e.forEach(function(t){c.Set.prototype[t]=function(){for(var e=0,i=this.members.length;i>e;e++)this.members[e]&&"function"==typeof this.members[e][t]&&this.members[e][t].apply(this.members[e],arguments);return"animate"==t?this.fx||(this.fx=new c.SetFX(this)):this}}),e=[];for(var t in c.FX.prototype)"function"==typeof c.FX.prototype[t]&&"function"!=typeof c.SetFX.prototype[t]&&e.push(t);e.forEach(function(t){c.SetFX.prototype[t]=function(){for(var e=0,i=this.set.members.length;i>e;e++)this.set.members[e].fx[t].apply(this.set.members[e].fx,arguments);return this}})},c.extend(c.Element,{data:function(t,e,i){if("object"==typeof t)for(e in t)this.data(e,t[e]);else if(arguments.length<2)try{return JSON.parse(this.attr("data-"+t))}catch(n){return this.attr("data-"+t)}else this.attr("data-"+t,null===e?null:i===!0||"string"==typeof e||"number"==typeof e?e:JSON.stringify(e));return this}}),c.extend(c.Element,{remember:function(t,e){if("object"==typeof arguments[0])for(var e in t)this.remember(e,t[e]);else{if(1==arguments.length)return this.memory()[t];this.memory()[t]=e}return this},forget:function(){if(0==arguments.length)this._memory={};else for(var t=arguments.length-1;t>=0;t--)delete this.memory()[arguments[t]];return this},memory:function(){return this._memory||(this._memory={})}}),c.get=function(t){var e=document.getElementById(u(t)||t);return e?c.adopt(e):void 0},c.select=function(t,e){return new c.Set(c.utils.map((e||document).querySelectorAll(t),function(t){return c.adopt(t)}))},c.extend(c.Parent,{select:function(t){return c.select(t,this.node)}}),"function"==typeof define&&define.amd?define(function(){return c}):"undefined"!=typeof exports&&(exports.SVG=c),window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.msRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}(),"function"!=typeof l&&(l.prototype=window.Event.prototype,window.CustomEvent=l)}).call(this);
\ No newline at end of file
index 79322146b8facf3dddae146b50d6dab320af933c..060e0765f31f673ee0bfc129a35aa4f5189a0332 100755 (executable)
 </head>
 
 <body>
-  <svg height="0" width="0">
+  <svg height="0" width="0" id="inlineSVG">
     <path id="lineAB" d="M 100 350 l 150 -300" stroke="red" stroke-width="3" fill="none" />
     <path id="lineBC" d="M 250 50 l 150 300" stroke="red" stroke-width="3" fill="none" />
     <path d="M 175 200 l 150 0" stroke="green" stroke-width="3" fill="none" />
     <path d="M 100 350 q 150 -300 300 0" stroke="blue" stroke-width="5" fill="none" />
-    <g stroke="black" stroke-width="3" fill="black">
+    <g stroke="black" stroke-width="3" fill="black" id="pointGroup">
       <circle id="pointA" cx="100" cy="350" r="3" />
       <circle id="pointB" cx="250" cy="50" r="3" />
       <circle id="pointC" cx="400" cy="350" r="3" />
     </g>
-    <g font-size="30" font="sans-serif" fill="black" stroke="none" text-anchor="middle">
+    <g font-size="30" font="sans-serif" fill="black" stroke="none" text-anchor="middle" id="labelGroup">
       <text x="100" y="350" dx="-30">A</text>
       <text x="250" y="50" dy="-10">B</text>
       <text x="400" y="350" dx="30">C</text>
     </g>
+    <polygon points="200,10 250,190 160,210" />
+    <polyline points="20,20 40,25 60,40 80,120 120,140 200,180" />
   </svg>
 </body>
 
@@ -54,6 +56,7 @@
 <script type="text/javascript" src="spec/arrange.js"></script>
 <script type="text/javascript" src="spec/bbox.js"></script>
 <script type="text/javascript" src="spec/rect.js"></script>
+<script type="text/javascript" src="spec/circle.js"></script>
 <script type="text/javascript" src="spec/ellipse.js"></script>
 <script type="text/javascript" src="spec/line.js"></script>
 <script type="text/javascript" src="spec/polyline.js"></script>
index efdb806192530acce874ea1dd724d59a2ba9416f..522802fd60b467732f2adccc922b3902416f4377 100644 (file)
@@ -2,20 +2,53 @@ describe('Adopter', function() {
   var path
 
   beforeEach(function() {
-    path = SVG.get('lineAB')
+    path      = SVG.get('lineAB')
+    polyline  = SVG.get('inlineSVG').select('polyline').first()
+    polygon   = SVG.get('inlineSVG').select('polygon').first()
   })
 
-  it('adopts an exiting path element', function() {
-    expect(path instanceof SVG.Path).toBe(true)
+  describe('with SVG.Doc instance', function() {
+    it('adopts the main svg document when parent() method is called on first level children', function() {
+      expect(path.parent() instanceof SVG.Doc).toBeTruthy()
+    })
+    it('defines a xmlns attribute', function() {
+      expect(path.parent().node.getAttribute('xmlns')).toBe(SVG.ns)
+    })
+    it('defines a version attribute', function() {
+      expect(path.parent().node.getAttribute('version')).toBe('1.1')
+    })
+    it('defines a xmlns:xlink attribute', function() {
+      expect(path.parent().node.getAttribute('xmlns:xlink')).toBe(SVG.xlink)
+    })
+    it('initializes a defs node', function() {
+      expect(path.parent()._defs).toBe(path.parent().defs())
+    })
   })
 
-  it('modifies an adopted element', function() {
-    path.fill('#f06')
-    expect(path.node.getAttribute('fill')).toBe('#ff0066')
+  describe('with SVG.Path instance', function() {
+    it('adopts an exiting path element', function() {
+      expect(path instanceof SVG.Path).toBeTruthy()
+    })
+    it('modifies an adopted element', function() {
+      path.fill('#f06')
+      expect(path.node.getAttribute('fill')).toBe('#ff0066')
+    })
+    it('parses d attribute to SVG.PathArray', function() {
+      expect(path.array() instanceof SVG.PathArray).toBeTruthy()
+    })
   })
 
-  it('adopts a parent when parent() method is called', function() {
-    expect(path.parent() instanceof SVG.Doc).toBe(true)
+  describe('with SVG.Polyline instance', function() {
+    it('parses points attribute to SVG.PointArray', function() {
+      expect(polyline.array() instanceof SVG.PointArray).toBeTruthy()
+    })
   })
 
+  describe('with SVG.Polygon instance', function() {
+    it('parses points attribute to SVG.PointArray', function() {
+      expect(polygon.array() instanceof SVG.PointArray).toBeTruthy()
+    })
+  })
+  
+
 })
\ No newline at end of file
diff --git a/spec/spec/circle.js b/spec/spec/circle.js
new file mode 100644 (file)
index 0000000..8501a26
--- /dev/null
@@ -0,0 +1,185 @@
+describe('Circle', function() {
+  var circle
+  
+  beforeEach(function() {
+    circle = draw.circle(240)
+  })
+  
+  afterEach(function() {
+    draw.clear()
+  })
+  
+  describe('x()', function() {
+    it('returns the value of x without an argument', function() {
+      expect(circle.x()).toBe(0)
+    })
+    it('sets the value of x with the first argument', function() {
+      circle.x(123)
+      var box = circle.bbox()
+      expect(box.x).toBe(123)
+    })
+  })
+  
+  describe('y()', function() {
+    it('returns the value of y without an argument', function() {
+      expect(circle.y()).toBe(0)
+    })
+    it('sets the value of cy with the first argument', function() {
+      circle.y(345)
+      var box = circle.bbox()
+      expect(box.y).toBe(345)
+    })
+  })
+  
+  describe('cx()', function() {
+    it('returns the value of cx without an argument', function() {
+      expect(circle.cx()).toBe(120)
+    })
+    it('sets the value of cx with the first argument', function() {
+      circle.cx(123)
+      var box = circle.bbox()
+      expect(box.cx).toBe(123)
+    })
+  })
+  
+  describe('cy()', function() {
+    it('returns the value of cy without an argument', function() {
+      expect(circle.cy()).toBe(120)
+    })
+    it('sets the value of cy with the first argument', function() {
+      circle.cy(345)
+      var box = circle.bbox()
+      expect(box.cy).toBe(345)
+    })
+  })
+
+  describe('radius()', function() {
+    it('sets the r attribute with the first argument', function() {
+      circle.radius(10)
+      expect(circle.node.getAttribute('r')).toBe('10')
+    })
+  })
+
+  describe('rx()', function() {
+    it('sets the r attribute with the first argument', function() {
+      circle.rx(11)
+      expect(circle.node.getAttribute('r')).toBe('11')
+    })
+    it('gets the r attribute without and argument', function() {
+      circle.rx()
+      expect(circle.node.getAttribute('r')).toBe('120')
+    })
+  })
+
+  describe('ry()', function() {
+    it('sets the r attribute with the first argument', function() {
+      circle.ry(12)
+      expect(circle.node.getAttribute('r')).toBe('12')
+    })
+    it('gets the r attribute without and argument', function() {
+      circle.ry()
+      expect(circle.node.getAttribute('r')).toBe('120')
+    })
+  })
+  
+  describe('move()', function() {
+    it('sets the x and y position', function() {
+      circle.move(123, 456)
+      var box = circle.bbox()
+      expect(box.x).toBe(123)
+      expect(box.y).toBe(456)
+    })
+  })
+
+  describe('dx()', function() {
+    it('moves the x positon of the element relative to the current position', function() {
+      circle.move(50, 60)
+      circle.dx(100)
+      expect(circle.node.getAttribute('cx')).toBe('270')
+    })
+  })
+
+  describe('dy()', function() {
+    it('moves the y positon of the element relative to the current position', function() {
+      circle.move(50, 60)
+      circle.dy(120)
+      expect(circle.node.getAttribute('cy')).toBe('300')
+    })
+  })
+
+  describe('dmove()', function() {
+    it('moves the x and y positon of the element relative to the current position', function() {
+      circle.move(50,60)
+      circle.dmove(80, 25)
+      expect(circle.node.getAttribute('cx')).toBe('250')
+      expect(circle.node.getAttribute('cy')).toBe('205')
+    })
+  })
+  
+  describe('center()', function() {
+    it('sets the cx and cy position', function() {
+      circle.center(321,567)
+      var box = circle.bbox()
+      expect(box.cx).toBe(321)
+      expect(box.cy).toBe(567)
+    })
+  })
+
+  describe('width()', function() {
+    it('sets the width and height of the element', function() {
+      circle.width(82)
+      expect(circle.node.getAttribute('r')).toBe('41')
+    })
+    it('gets the width and height of the element if the argument is null', function() {
+      expect((circle.width() / 2).toString()).toBe(circle.node.getAttribute('r'))
+    })
+  })
+
+  describe('height()', function() {
+    it('sets the height and width of the element', function() {
+      circle.height(1236)
+      expect(circle.node.getAttribute('r')).toBe('618')
+    })
+    it('gets the height and width of the element if the argument is null', function() {
+      expect((circle.height() / 2).toString()).toBe(circle.node.getAttribute('r'))
+    })
+  })
+  
+  describe('size()', function() {
+    it('defines the r of the element', function() {
+      circle.size(987)
+      expect(circle.node.getAttribute('r')).toBe((987 / 2).toString())
+    })
+  })
+  
+  describe('scale()', function() {
+    it('should scale the element universally with one argument', function() {
+      var box = circle.scale(2).bbox()
+      
+      expect(box.width).toBe(circle.attr('r') * 2 * 2)
+      expect(box.height).toBe(circle.attr('r') * 2 * 2)
+    })
+    it('should scale the element over individual x and y axes with two arguments', function() {
+      var box = circle.scale(2, 3.5).bbox()
+      
+      expect(box.width).toBe(circle.attr('r') * 2 * 2)
+      expect(box.height).toBe(circle.attr('r') * 2 * 3.5)
+    })
+  })
+
+  describe('translate()', function() {
+    it('sets the translation of an element', function() {
+      circle.transform({ x: 12, y: 12 })
+      expect(circle.node.getAttribute('transform')).toBe('translate(12 12)')
+    })
+  })
+  
+})
+
+
+
+
+
+
+
+
index 3fa0867fd7c038d9d2fb5be88ce06900f9030016..63b1a01da63979c661d0f762c2fbef47ab289ac9 100755 (executable)
@@ -50,11 +50,11 @@ describe('Container', function() {
       draw.circle(100)
       expect(draw.children().length).toBe(initial + 1)
     })
-    it('should create an ellipse', function() {
-      expect(draw.circle(100).type).toBe('ellipse')
+    it('should create an circle', function() {
+      expect(draw.circle(100).type).toBe('circle')
     })
-    it('should create an instance of SVG.Ellipse', function() {
-      expect(draw.circle(100) instanceof SVG.Ellipse).toBe(true)
+    it('should create an instance of SVG.Circle', function() {
+      expect(draw.circle(100) instanceof SVG.Circle).toBe(true)
     })
     it('should be an instance of SVG.Shape', function() {
       expect(draw.circle(100) instanceof SVG.Shape).toBe(true)
index f9e63878ca27d606d36ca427ca948d5947ee6c56..a9eb03b1c1adffef84af8e94279c9cec368ce0d5 100755 (executable)
@@ -10,10 +10,10 @@ describe('Ellipse', function() {
   })
   
   describe('x()', function() {
-    it('should return the value of x without an argument', function() {
+    it('returns the value of x without an argument', function() {
       expect(ellipse.x()).toBe(0)
     })
-    it('should set the value of x with the first argument', function() {
+    it('sets the value of x with the first argument', function() {
       ellipse.x(123)
       var box = ellipse.bbox()
       expect(box.x).toBe(123)
@@ -21,10 +21,10 @@ describe('Ellipse', function() {
   })
   
   describe('y()', function() {
-    it('should return the value of y without an argument', function() {
+    it('returns the value of y without an argument', function() {
       expect(ellipse.y()).toBe(0)
     })
-    it('should set the value of cy with the first argument', function() {
+    it('sets the value of cy with the first argument', function() {
       ellipse.y(345)
       var box = ellipse.bbox()
       expect(box.y).toBe(345)
@@ -32,10 +32,10 @@ describe('Ellipse', function() {
   })
   
   describe('cx()', function() {
-    it('should return the value of cx without an argument', function() {
+    it('returns the value of cx without an argument', function() {
       expect(ellipse.cx()).toBe(120)
     })
-    it('should set the value of cx with the first argument', function() {
+    it('sets the value of cx with the first argument', function() {
       ellipse.cx(123)
       var box = ellipse.bbox()
       expect(box.cx).toBe(123)
@@ -43,10 +43,10 @@ describe('Ellipse', function() {
   })
   
   describe('cy()', function() {
-    it('should return the value of cy without an argument', function() {
+    it('returns the value of cy without an argument', function() {
       expect(ellipse.cy()).toBe(45)
     })
-    it('should set the value of cy with the first argument', function() {
+    it('sets the value of cy with the first argument', function() {
       ellipse.cy(345)
       var box = ellipse.bbox()
       expect(box.cy).toBe(345)
@@ -54,21 +54,26 @@ describe('Ellipse', function() {
   })
 
   describe('radius()', function() {
-    it('should set the rx and ry', function() {
-      ellipse.radius(10,20)
+    it('sets the rx and ry', function() {
+      ellipse.radius(10, 20)
       expect(ellipse.node.getAttribute('rx')).toBe('10')
       expect(ellipse.node.getAttribute('ry')).toBe('20')
     })
-    it('should set the rx and ry if only rx given', function() {
+    it('sets the rx and ry if only rx given', function() {
       ellipse.radius(30)
       expect(ellipse.node.getAttribute('rx')).toBe('30')
       expect(ellipse.node.getAttribute('ry')).toBe('30')
     })
+    it('sets the and ry value correctly when given 0', function() {
+      ellipse.radius(11, 0)
+      expect(ellipse.node.getAttribute('rx')).toBe('11')
+      expect(ellipse.node.getAttribute('ry')).toBe('0')
+    })
   })
   
   describe('move()', function() {
-    it('should set the x and y position', function() {
-      ellipse.move(123,456)
+    it('sets the x and y position', function() {
+      ellipse.move(123, 456)
       var box = ellipse.bbox()
       expect(box.x).toBe(123)
       expect(box.y).toBe(456)
@@ -77,7 +82,7 @@ describe('Ellipse', function() {
 
   describe('dx()', function() {
     it('moves the x positon of the element relative to the current position', function() {
-      ellipse.move(50,60)
+      ellipse.move(50, 60)
       ellipse.dx(100)
       expect(ellipse.node.getAttribute('cx')).toBe('270')
     })
@@ -85,7 +90,7 @@ describe('Ellipse', function() {
 
   describe('dy()', function() {
     it('moves the y positon of the element relative to the current position', function() {
-      ellipse.move(50,60)
+      ellipse.move(50, 60)
       ellipse.dy(120)
       expect(ellipse.node.getAttribute('cy')).toBe('225')
     })
@@ -165,7 +170,7 @@ describe('Ellipse', function() {
   })
 
   describe('translate()', function() {
-    it('should set the translation of an element', function() {
+    it('sets the translation of an element', function() {
       ellipse.transform({ x: 12, y: 12 })
       expect(ellipse.node.getAttribute('transform')).toBe('translate(12 12)')
     })
index 6ca9cfece8bf30263187f788893521f26899a452..ae0e25ef8f4330a3fa7e01ac280ef6ea590a897b 100755 (executable)
@@ -8,12 +8,21 @@ describe('Path', function() {
   afterEach(function() {
     draw.clear()
   })
+
+  describe('array()', function() {
+    it('returns an instance of SVG.PathArray', function() {
+      expect(path.array() instanceof SVG.PathArray).toBeTruthy()
+    })
+    it('returns the value stored in the private variable _array', function() {
+      expect(path.array()).toBe(path._array)
+    })
+  })
   
   describe('x()', function() {
-    it('should return the value of x without an argument', function() {
+    it('returns the value of x without an argument', function() {
       expect(path.x()).toBe(0)
     })
-    it('should set the value of x with the first argument', function() {
+    it('sets the value of x with the first argument', function() {
       path.x(123)
       var box = path.bbox()
       expect(box.x).toBe(123)
@@ -21,10 +30,10 @@ describe('Path', function() {
   })
   
   describe('y()', function() {
-    it('should return the value of y without an argument', function() {
+    it('returns the value of y without an argument', function() {
       expect(path.y()).toBe(0)
     })
-    it('should set the value of y with the first argument', function() {
+    it('sets the value of y with the first argument', function() {
       path.y(345)
       var box = path.bbox()
       expect(box.y).toBe(345)
@@ -32,10 +41,10 @@ describe('Path', function() {
   })
   
   describe('cx()', function() {
-    it('should return the value of cx without an argument', function() {
+    it('returns the value of cx without an argument', function() {
       expect(path.cx()).toBe(50)
     })
-    it('should set the value of cx with the first argument', function() {
+    it('sets the value of cx with the first argument', function() {
       path.cx(123)
       var box = path.bbox()
       expect(box.cx).toBe(123)
@@ -43,10 +52,10 @@ describe('Path', function() {
   })
   
   describe('cy()', function() {
-    it('should return the value of cy without an argument', function() {
+    it('returns the value of cy without an argument', function() {
       expect(path.cy()).toBe(50)
     })
-    it('should set the value of cy with the first argument', function() {
+    it('sets the value of cy with the first argument', function() {
       path.cy(345)
       var box = path.bbox()
       expect(box.cy).toBe(345)
@@ -54,13 +63,13 @@ describe('Path', function() {
   })
   
   describe('move()', function() {
-    it('should set the x and y position', function() {
+    it('sets the x and y position', function() {
       path.move(123,456)
       var box = path.bbox()
       expect(box.x).toBe(123)
       expect(box.y).toBe(456)
     })
-    it('should set the x and y position when scaled to half its size', function() {
+    it('sets the x and y position when scaled to half its size', function() {
       path.scale(0.5).move(123,456)
       var box = path.bbox()
       expect(box.x).toBe(123)
@@ -97,7 +106,7 @@ describe('Path', function() {
   })
   
   describe('center()', function() {
-    it('should set the cx and cy position', function() {
+    it('sets the cx and cy position', function() {
       path.center(321,567)
       var box = path.bbox()
       expect(box.x).toBe(271)
@@ -168,7 +177,7 @@ describe('Path', function() {
   })
 
   describe('translate()', function() {
-    it('should set the translation of an element', function() {
+    it('sets the translation of an element', function() {
       path.transform({ x: 12, y: 12 })
       expect(path.node.getAttribute('transform')).toBe('translate(12 12)')
     })
index 88899de2ec5a7bb2bee6505ae56111e06250c2a8..35c88369d286bcb5d61d37b39d6306b0397ee468 100755 (executable)
@@ -8,12 +8,21 @@ describe('Polygon', function() {
   afterEach(function() {
     draw.clear()
   })
+
+  describe('array()', function() {
+    it('returns an instance of SVG.PointArray', function() {
+      expect(polygon.array() instanceof SVG.PointArray).toBeTruthy()
+    })
+    it('returns the value stored in the private variable _array', function() {
+      expect(polygon.array()).toBe(polygon._array)
+    })
+  })
   
   describe('x()', function() {
-    it('should return the value of x without an argument', function() {
+    it('returns the value of x without an argument', function() {
       expect(polygon.x()).toBe(0)
     })
-    it('should set the value of x with the first argument', function() {
+    it('sets the value of x with the first argument', function() {
       polygon.x(123)
       var box = polygon.bbox()
       expect(box.x).toBe(123)
@@ -21,10 +30,10 @@ describe('Polygon', function() {
   })
   
   describe('y()', function() {
-    it('should return the value of y without an argument', function() {
+    it('returns the value of y without an argument', function() {
       expect(polygon.y()).toBe(0)
     })
-    it('should set the value of y with the first argument', function() {
+    it('sets the value of y with the first argument', function() {
       polygon.y(345)
       var box = polygon.bbox()
       expect(box.y).toBe(345)
@@ -32,10 +41,10 @@ describe('Polygon', function() {
   })
   
   describe('cx()', function() {
-    it('should return the value of cx without an argument', function() {
+    it('returns the value of cx without an argument', function() {
       expect(polygon.cx()).toBe(50)
     })
-    it('should set the value of cx with the first argument', function() {
+    it('sets the value of cx with the first argument', function() {
       polygon.cx(123)
       var box = polygon.bbox()
       expect(box.cx).toBe(123)
@@ -43,10 +52,10 @@ describe('Polygon', function() {
   })
   
   describe('cy()', function() {
-    it('should return the value of cy without an argument', function() {
+    it('returns the value of cy without an argument', function() {
       expect(polygon.cy()).toBe(50)
     })
-    it('should set the value of cy with the first argument', function() {
+    it('sets the value of cy with the first argument', function() {
       polygon.cy(345)
       var box = polygon.bbox()
       expect(box.cy).toBe(345)
@@ -54,7 +63,7 @@ describe('Polygon', function() {
   })
   
   describe('move()', function() {
-    it('should set the x and y position', function() {
+    it('sets the x and y position', function() {
       polygon.move(123,456)
       var box = polygon.bbox()
       expect(box.x).toBe(123)
@@ -91,7 +100,7 @@ describe('Polygon', function() {
   })
   
   describe('center()', function() {
-    it('should set the cx and cy position', function() {
+    it('sets the cx and cy position', function() {
       polygon.center(321,567)
       var box = polygon.bbox()
       expect(box.x).toBe(271)
@@ -162,7 +171,7 @@ describe('Polygon', function() {
   })
 
   describe('translate()', function() {
-    it('should set the translation of an element', function() {
+    it('sets the translation of an element', function() {
       polygon.transform({ x: 12, y: 12 })
       expect(polygon.node.getAttribute('transform')).toBe('translate(12 12)')
     })
index 99dce1a4637af2a00533e1c9d47806f43204c750..5b799342e00768f56a388c27ec46158ffc03bb97 100755 (executable)
@@ -8,12 +8,21 @@ describe('Polyline', function() {
   afterEach(function() {
     draw.clear()
   })
+
+  describe('array()', function() {
+    it('returns an instance of SVG.PointArray', function() {
+      expect(polyline.array() instanceof SVG.PointArray).toBeTruthy()
+    })
+    it('returns the value stored in the private variable _array', function() {
+      expect(polyline.array()).toBe(polyline._array)
+    })
+  })
   
   describe('x()', function() {
-    it('should return the value of x without an argument', function() {
+    it('returns the value of x without an argument', function() {
       expect(polyline.x()).toBe(0)
     })
-    it('should set the value of x with the first argument', function() {
+    it('sets the value of x with the first argument', function() {
       polyline.x(123)
       var box = polyline.bbox()
       expect(box.x).toBe(123)
@@ -21,10 +30,10 @@ describe('Polyline', function() {
   })
   
   describe('y()', function() {
-    it('should return the value of y without an argument', function() {
+    it('returns the value of y without an argument', function() {
       expect(polyline.y()).toBe(0)
     })
-    it('should set the value of y with the first argument', function() {
+    it('sets the value of y with the first argument', function() {
       polyline.y(345)
       var box = polyline.bbox()
       expect(box.y).toBe(345)
@@ -32,10 +41,10 @@ describe('Polyline', function() {
   })
   
   describe('cx()', function() {
-    it('should return the value of cx without an argument', function() {
+    it('returns the value of cx without an argument', function() {
       expect(polyline.cx()).toBe(50)
     })
-    it('should set the value of cx with the first argument', function() {
+    it('sets the value of cx with the first argument', function() {
       polyline.cx(123)
       var box = polyline.bbox()
       expect(box.cx).toBe(123)
@@ -43,10 +52,10 @@ describe('Polyline', function() {
   })
   
   describe('cy()', function() {
-    it('should return the value of cy without an argument', function() {
+    it('returns the value of cy without an argument', function() {
       expect(polyline.cy()).toBe(50)
     })
-    it('should set the value of cy with the first argument', function() {
+    it('sets the value of cy with the first argument', function() {
       polyline.cy(345)
       var box = polyline.bbox()
       expect(box.cy).toBe(345)
@@ -54,7 +63,7 @@ describe('Polyline', function() {
   })
   
   describe('move()', function() {
-    it('should set the x and y position', function() {
+    it('sets the x and y position', function() {
       polyline.move(123,456)
       var box = polyline.bbox()
       expect(box.x).toBe(123)
@@ -91,7 +100,7 @@ describe('Polyline', function() {
   })
   
   describe('center()', function() {
-    it('should set the cx and cy position', function() {
+    it('sets the cx and cy position', function() {
       polyline.center(321,567)
       var box = polyline.bbox()
       expect(box.x).toBe(271)
@@ -162,7 +171,7 @@ describe('Polyline', function() {
   })
 
   describe('translate()', function() {
-    it('should set the translation of an element', function() {
+    it('sets the translation of an element', function() {
       polyline.transform({ x: 12, y: 12 })
       expect(polyline.node.getAttribute('transform')).toBe('translate(12 12)')
     })
index c762a2bd920fca842ec276b928c3fe9f8a040644..57e7691226021ac8231692527a83bec63f24d167 100644 (file)
@@ -17,7 +17,13 @@ SVG.adopt = function(node) {
     element = new SVG[capitalize(node.nodeName)]
 
   // Ensure references
-  element.type = node.nodeName
-  element.node = node
-  return node.instance = element
+  element.type  = node.nodeName
+  element.node  = node
+  node.instance = element
+
+  // SVG.Class specific preparations
+  if (element instanceof SVG.Doc)
+    element.namespace().defs()
+
+  return element
 }
\ No newline at end of file
index bc79cebe52012c02134d07690280c14ffc861eb1..6c996989e69adf0b0f19de71849bf54b9d2184b3 100755 (executable)
@@ -77,5 +77,4 @@ SVG.extend(SVG.Array, {
     return this
   }
 
-})
-
+})
\ No newline at end of file
index 1a025f3993bb24a98a5d12669b7f4c742339ac8d..1e19ec753646d8b659cf34595c50c60050847813 100755 (executable)
@@ -1,25 +1,24 @@
 SVG.Doc = SVG.invent({
   // Initialize node
   create: function(element) {
-    /* ensure the presence of a dom element */
-    element = typeof element == 'string' ?
-      document.getElementById(element) :
-      element
-    
-    /* If the target is an svg element, use that element as the main wrapper.
-       This allows svg.js to work with svg documents as well. */
-    if (element.nodeName == 'svg') {
-      this.constructor.call(this, element)
-    } else {
-      this.constructor.call(this, SVG.create('svg'))
-      element.appendChild(this.node)
+    if (element) {
+      /* ensure the presence of a dom element */
+      element = typeof element == 'string' ?
+        document.getElementById(element) :
+        element
+      
+      /* If the target is an svg element, use that element as the main wrapper.
+         This allows svg.js to work with svg documents as well. */
+      if (element.nodeName == 'svg') {
+        this.constructor.call(this, element)
+      } else {
+        this.constructor.call(this, SVG.create('svg'))
+        element.appendChild(this.node)
+      }
+      
+      /* set svg element attributes and ensure defs node */
+      this.namespace().size('100%', '100%').defs()
     }
-    
-    /* set svg element attributes and ensure defs node */
-    this
-      .attr({ xmlns: SVG.ns, version: '1.1', width: '100%', height: '100%' })
-      .attr('xmlns:xlink', SVG.xlink, SVG.xmlns)
-      .defs()
   }
 
   // Inherit from
@@ -27,8 +26,14 @@ SVG.Doc = SVG.invent({
 
   // Add class methods
 , extend: {
+    // Add namespaces
+    namespace: function() {
+      return this
+        .attr({ xmlns: SVG.ns, version: '1.1' })
+        .attr('xmlns:xlink', SVG.xlink, SVG.xmlns)
+    }
     // Creates and returns defs element
-    defs: function() {
+  , defs: function() {
       if (!this._defs) {
         var defs
 
index c8eb5de2af0e749640a5d719ea91f244f74e717f..753ac33b0b18c7e6956106d576d40ab0c175d65f 100755 (executable)
@@ -125,8 +125,9 @@ SVG.Element = SVG.invent({
     }
     // Set svg element attribute
   , attr: function(a, v, n) {
+      // Act as full getter
       if (a == null) {
-        /* get an object of attributes */
+        // Get an object of attributes
         a = {}
         v = this.node.attributes
         for (n = v.length - 1; n >= 0; n--)
@@ -135,15 +136,15 @@ SVG.Element = SVG.invent({
         return a
         
       } else if (typeof a == 'object') {
-        /* apply every attribute individually if an object is passed */
+        // Apply every attribute individually if an object is passed
         for (v in a) this.attr(v, a[v])
         
       } else if (v === null) {
-          /* remove value */
+          // Remove value
           this.node.removeAttribute(a)
         
       } else if (v == null) {
-        /* act as a getter if the first and only argument is not an object */
+        // Act as a getter if the first and only argument is not an object
         v = this.node.getAttribute(a)
         return v == null ? 
           SVG.defaults.attrs[a] :
@@ -151,17 +152,17 @@ SVG.Element = SVG.invent({
           parseFloat(v) : v
       
       } else if (a == 'style') {
-        /* redirect to the style method */
+        // Redirect to the style method
         return this.style(v)
       
       } else {
-        /* BUG FIX: some browsers will render a stroke if a color is given even though stroke width is 0 */
+        // BUG FIX: some browsers will render a stroke if a color is given even though stroke width is 0
         if (a == 'stroke-width')
           this.attr('stroke', parseFloat(v) > 0 ? this._stroke : null)
         else if (a == 'stroke')
           this._stroke = v
 
-        /* convert image fill and stroke to patterns */
+        // Convert image fill and stroke to patterns
         if (a == 'fill' || a == 'stroke') {
           if (SVG.regex.isImage.test(v))
             v = this.doc().defs().image(v, 0, 0)
@@ -172,31 +173,31 @@ SVG.Element = SVG.invent({
             })
         }
         
-        /* ensure correct numeric values (also accepts NaN and Infinity) */
+        // Ensure correct numeric values (also accepts NaN and Infinity)
         if (typeof v === 'number')
           v = new SVG.Number(v)
 
-        /* ensure full hex color */
+        // Ensure full hex color
         else if (SVG.Color.isColor(v))
           v = new SVG.Color(v)
         
-        /* parse array values */
+        // Parse array values
         else if (Array.isArray(v))
           v = new SVG.Array(v)
 
-        /* if the passed attribute is leading... */
+        // If the passed attribute is leading...
         if (a == 'leading') {
-          /* ... call the leading method instead */
+          // ... call the leading method instead
           if (this.leading)
             this.leading(v)
         } else {
-          /* set given attribute on node */
+          // Set given attribute on node
           typeof n === 'string' ?
             this.node.setAttributeNS(n, a, v.toString()) :
             this.node.setAttribute(a, v.toString())
         }
         
-        /* rebuild if required */
+        // Rebuild if required
         if (this.rebuild && (a == 'font-size' || a == 'x'))
           this.rebuild(a, v)
       }
index 0d23e6e7a2a6bb63e8001681683b91e0c53c4f85..aab80871a0614ee637f8802890af2239178271a1 100755 (executable)
@@ -1,3 +1,30 @@
+SVG.Circle = SVG.invent({
+  // Initialize node
+  create: 'circle'
+
+  // Inherit from
+, inherit: SVG.Shape
+
+  // Add parent method
+, construct: {
+    // Create circle element, based on ellipse
+    circle: function(size) {
+      return this.put(new SVG.Circle).rx(new SVG.Number(size).divide(2)).move(0, 0)
+    }
+  }
+})
+
+SVG.extend(SVG.Circle, SVG.FX, {
+  // Radius x value
+  rx: function(rx) {
+    return this.attr('r', rx)
+  }
+  // Alias radius x value
+, ry: function(ry) {
+    return this.rx(ry)
+  }
+})
+
 SVG.Ellipse = SVG.invent({
   // Initialize node
   create: 'ellipse'
@@ -5,15 +32,35 @@ SVG.Ellipse = SVG.invent({
   // Inherit from
 , inherit: SVG.Shape
 
-  // Add class methods
-, extend: {
+  // Add parent method
+, construct: {
+    // Create an ellipse
+    ellipse: function(width, height) {
+      return this.put(new SVG.Ellipse).size(width, height).move(0, 0)
+    }
+  }
+})
+
+SVG.extend(SVG.Ellipse, SVG.Rect, SVG.FX, {
+  // Radius x value
+  rx: function(rx) {
+    return this.attr('rx', rx)
+  }
+  // Radius y value
+, ry: function(ry) {
+    return this.attr('ry', ry)
+  }
+})
+
+// Add common method
+SVG.extend(SVG.Circle, SVG.Ellipse, {
     // Move over x-axis
     x: function(x) {
-      return x == null ? this.cx() - this.attr('rx') : this.cx(x + this.attr('rx'))
+      return x == null ? this.cx() - this.rx() : this.cx(x + this.rx())
     }
     // Move over y-axis
   , y: function(y) {
-      return y == null ? this.cy() - this.attr('ry') : this.cy(y + this.attr('ry'))
+      return y == null ? this.cy() - this.ry() : this.cy(y + this.ry())
     }
     // Move by center over x-axis
   , cx: function(x) {
@@ -25,35 +72,18 @@ SVG.Ellipse = SVG.invent({
     }
     // Set width of element
   , width: function(width) {
-      return width == null ? this.attr('rx') * 2 : this.attr('rx', new SVG.Number(width).divide(2))
+      return width == null ? this.rx() * 2 : this.rx(new SVG.Number(width).divide(2))
     }
     // Set height of element
   , height: function(height) {
-      return height == null ? this.attr('ry') * 2 : this.attr('ry', new SVG.Number(height).divide(2))
+      return height == null ? this.ry() * 2 : this.ry(new SVG.Number(height).divide(2))
     }
     // Custom size function
   , size: function(width, height) {
       var p = proportionalSize(this.bbox(), width, height)
 
-      return this.attr({
-        rx: new SVG.Number(p.width).divide(2)
-      , ry: new SVG.Number(p.height).divide(2)
-      })
-    }
-    
-  }
-
-  // Add parent method
-, construct: {
-    // Create circle element, based on ellipse
-    circle: function(size) {
-      return this.ellipse(size, size)
+      return this
+        .rx(new SVG.Number(p.width).divide(2))
+        .ry(new SVG.Number(p.height).divide(2))
     }
-    // Create an ellipse
-  , ellipse: function(width, height) {
-      return this.put(new SVG.Ellipse).size(width, height).move(0, 0)
-    }
-    
-  }
-
 })
\ No newline at end of file
index 773b3d8efa30bbfb8a5dbf62cd7c29ec43852e2e..8282ce7d8590758a91c285348a4e0f1632d9a981 100755 (executable)
@@ -7,13 +7,19 @@ SVG.Path = SVG.invent({
 
   // Add class methods
 , extend: {
+    // Define morphable array
+    morphArray:  SVG.PathArray
+    // Get array
+  , array: function() {
+      return this._array || (this._array = new SVG.PathArray(this.attr('d')))
+    }
     // Plot new poly points
-    plot: function(p) {
-      return this.attr('d', (this.array = new SVG.PathArray(p, [['M', 0, 0]])))
+  , plot: function(p) {
+      return this.attr('d', (this._array = new SVG.PathArray(p)))
     }
     // Move by left top corner
   , move: function(x, y) {
-      return this.attr('d', this.array.move(x, y))
+      return this.attr('d', this.array().move(x, y))
     }
     // Move by left top corner over x-axis
   , x: function(x) {
@@ -27,7 +33,7 @@ SVG.Path = SVG.invent({
   , size: function(width, height) {
       var p = proportionalSize(this.bbox(), width, height)
       
-      return this.attr('d', this.array.size(p.width, p.height))
+      return this.attr('d', this.array().size(p.width, p.height))
     }
     // Set width of element
   , width: function(width) {
index 1a2fdd5d73df937536258819e5eb2626351bfb98..746cdc4a96bf57d847d262c38a968600b7e7e1bf 100755 (executable)
@@ -1,6 +1,6 @@
 // Path points array
 SVG.PathArray = function(array, fallback) {
-  this.constructor.call(this, array, fallback)
+  this.constructor.call(this, array, fallback || [['M', 0, 0]])
 }
 
 // Inherit from SVG.Array
index e246adf4f3fc8fb66c66a2d46014ef5a8de1e24c..67b6ad47a6ad3017875cef89c127d8f9cd677f94 100755 (executable)
@@ -1,6 +1,6 @@
 // Poly points array
-SVG.PointArray = function() {
-  this.constructor.apply(this, arguments)
+SVG.PointArray = function(array, fallback) {
+  this.constructor.call(this, array, fallback || [[0,0]])
 }
 
 // Inherit from SVG.Array
index 1586c77770ad322cb8454556483490d5d47b4d05..2bf0b579cfad57ece3bd71c95ea2c65b52f6f8e4 100755 (executable)
@@ -34,13 +34,17 @@ SVG.Polygon = SVG.invent({
 SVG.extend(SVG.Polyline, SVG.Polygon, {
   // Define morphable array
   morphArray:  SVG.PointArray
+  // Get array
+, array: function() {
+    return this._array || (this._array = new SVG.PointArray(this.attr('points')))
+  }
   // Plot new path
 , plot: function(p) {
-    return this.attr('points', (this.array = new SVG.PointArray(p, [[0,0]])))
+    return this.attr('points', (this._array = new SVG.PointArray(p)))
   }
   // Move by left top corner
 , move: function(x, y) {
-    return this.attr('points', this.array.move(x, y))
+    return this.attr('points', this.array().move(x, y))
   }
   // Move by left top corner over x-axis
 , x: function(x) {
@@ -66,7 +70,7 @@ SVG.extend(SVG.Polyline, SVG.Polygon, {
 , size: function(width, height) {
     var p = proportionalSize(this.bbox(), width, height)
 
-    return this.attr('points', this.array.size(p.width, p.height))
+    return this.attr('points', this.array().size(p.width, p.height))
   }
 
 })
\ No newline at end of file
index 313c96da30c7aec6248ffebd2a7bac00a6d85615..825dd326e6af76e59fe9a682d9b2288748e2434e 100755 (executable)
@@ -11,7 +11,5 @@ SVG.Rect = SVG.invent({
        rect: function(width, height) {
          return this.put(new SVG.Rect().size(width, height))
        }
-       
        }
-       
 })
\ No newline at end of file
index 4a8fff822e08c79466986ba8afd6cda3440bb25e..493c6c78616a66ee040824be817ac089b9f346a8 100755 (executable)
@@ -66,15 +66,13 @@ SVG.extend(SVG.Element, SVG.FX, {
 , opacity: function(value) {
     return this.attr('opacity', value)
   }
-
 })
 
-SVG.extend(SVG.Rect, SVG.Ellipse, SVG.FX, {
+SVG.extend(SVG.Rect, SVG.Ellipse, SVG.Circle, SVG.FX, {
   // Add x and y radius
   radius: function(x, y) {
-    return this.attr({ rx: x, ry: y || x })
+    return this.rx(x).ry(y == null ? x : y)
   }
-
 })
 
 SVG.extend(SVG.Path, {
@@ -86,7 +84,6 @@ SVG.extend(SVG.Path, {
 , pointAt: function(length) {
     return this.node.getPointAtLength(length)
   }
-
 })
 
 SVG.extend(SVG.Parent, SVG.Text, SVG.FX, {
@@ -103,6 +100,5 @@ SVG.extend(SVG.Parent, SVG.Text, SVG.FX, {
     
     return this
   }
-  
 })
 
index 3c25288411968fd69a0abbe94925de9046799ce4..a18e1ca7ac0b2cbea7fc95071360af9ffe6f1f3d 100755 (executable)
@@ -21,7 +21,7 @@ SVG.did  = 1000
 
 // Get next named element id
 SVG.eid = function(name) {
-  return 'Svgjs' + name.charAt(0).toUpperCase() + name.slice(1) + (SVG.did++)
+  return 'Svgjs' + capitalize(name) + (SVG.did++)
 }
 
 // Method for element creation