[
  {
    "path": ".eslintignore",
    "content": "rollup.config.js\n"
  },
  {
    "path": ".eslintrc.js",
    "content": "module.exports = {\n  env: {\n    browser: true,\n    es6: true,\n    node: true,\n  },\n  extends: ['eslint:recommended', 'prettier'],\n  parserOptions: {\n    ecmaVersion: 2020,\n    sourceType: 'module',\n    ecmaFeatures: {\n      jsx: false,\n    },\n  },\n  globals: {},\n  rules: {\n    'no-unused-vars': 'warn',\n    'no-empty': 'warn',\n  },\n};\n"
  },
  {
    "path": ".gitignore",
    "content": ".DS_Store\nbuild/\nexample/d3-scale-interactive.js\nexample/d3-scale-interactive.css\nnode_modules\nnpm-debug.log\n"
  },
  {
    "path": ".npmignore",
    "content": "build/*.zip\ntest/\n"
  },
  {
    "path": "LICENSE",
    "content": "Copyright 2016, Peter Beshai\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without modification,\nare permitted provided that the following conditions are met:\n\n* Redistributions of source code must retain the above copyright notice, this\n  list of conditions and the following disclaimer.\n\n* Redistributions in binary form must reproduce the above copyright notice,\n  this list of conditions and the following disclaimer in the documentation\n  and/or other materials provided with the distribution.\n\n* Neither the name of the author nor the names of contributors may be used to\n  endorse or promote products derived from this software without specific prior\n  written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\nANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR\nANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\nANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"
  },
  {
    "path": "README.md",
    "content": "# d3-interpolate-path\n\n[![npm version](https://badge.fury.io/js/d3-interpolate-path.svg)](https://badge.fury.io/js/d3-interpolate-path)\n\nd3-interpolate-path is a zero-dependency that adds an [interpolator](https://github.com/d3/d3-interpolate)\noptimized for SVG &lt;path&gt; elements. It can also work directly with object representations of path commands that can be later interpreted for use with canvas or WebGL. \n\n**Note this package no longer has a dependency on d3 or d3-interpolate**, but in web usage adds itself to the d3 namespace like other d3 plugins do.\n\nBlog: [Improving D3 Path Animation](https://bocoup.com/weblog/improving-d3-path-animation)\n\nDemo: https://pbeshai.github.io/d3-interpolate-path/\n\n![d3-interpolate-path demo](https://pbeshai.github.io/d3-interpolate-path/d3-interpolate-path-demo.gif)\n\n\n\n## Example Usage\n\n```js\nvar line = d3.line()\n  .curve(d3.curveLinear)\n  .x(function (d) { return x(d.x); })\n  .y(function (d) { return y(d.y); });\n\nd3.select('path.my-path')\n  .transition()\n  .duration(2000)\n  .attrTween('d', function (d) {\n    var previous = d3.select(this).attr('d');\n    var current = line(d);\n    return d3.interpolatePath(previous, current);\n  });\n```\n\nIf you're using it in a module environment, you can import it as follows:\n\n```js\nimport { interpolatePath } from 'd3-interpolate-path';\n```\n\nOtherwise, you can use it via a `<script>` tag as follows:\n\n```js\n<script src=\"https://unpkg.com/d3-interpolate-path/build/d3-interpolate-path.min.js\"></script>\n```\n\n\n## Development\n\nGet rollup watching for changes and rebuilding\n\n```bash\nnpm run watch\n```\n\nRun a web server in the docs directory\n\n```bash\ncd docs\nphp -S localhost:8000\n```\n\nGo to http://localhost:8000\n\n\n## Installing\n\nIf you use NPM, `npm install d3-interpolate-path`. Otherwise, download the [latest release](https://github.com/pbeshai/d3-interpolate-path/releases/latest).\n\n## API Reference\n\n\n<a href=\"#interpolatePath\" name=\"interpolatePath\">#</a> <b>interpolatePath</b>(*a*, *b*, *excludeSegment*)\n\nReturns an interpolator between two path attribute `d` strings *a* and *b*. The interpolator extends *a* and *b* to have the same number of points before applying linear interpolation on the values. It uses De Castlejau's algorithm for handling bezier curves.\n\n```js\nvar pathInterpolator = interpolatePath('M0,0 L10,10', 'M10,10 L20,20 L30,30')\npathInterpolator(0)   // 'M0,0 L10,10 L10,10'\npathInterpolator(0.5) // 'M5,5 L15,15 L20,20'\npathInterpolator(1)   // 'M10,10 L20,20 L30,30'\n```\n\nYou can optionally provide a function *excludeSegment* that takes two adjacent path commands and returns true if that segment should be excluded when splitting the line. A command object has form `{ type, x, y }` (with possibly more attributes depending on type). An example object:\n\n```js\n// equivalent to M0,150 in a path `d` string\n{\n  type: 'M',\n  x: 0,\n  y: 150\n}\n```\n\nThis is most useful when working with d3-area. Excluding the final segment (i.e. the vertical line at the end) from being split ensures a nice transition. If you know that highest `x` value in the path, you can exclude the final segment by passing an excludeSegment function similar to:\n\n```js\nfunction excludeSegment(a, b) {\n  return a.x === b.x && a.x === 300; // here 300 is the max X\n}\n```\n\n\n\n<a href=\"#interpolatePathCommands\" name=\"interpolatePathCommands\">#</a> <b>interpolatePathCommands</b>(*aCommands*, *bCommands*, *excludeSegment*)\n\nReturns an interpolator between two paths defined as arrays of command objects *a* and *b*. The interpolator extends *a* and *b* to have the same number of points if they differ. This can be useful if you want to work with paths in other formats besides SVG (e.g. canvas or WebGL).\n\nCommand objects take the following form:\n\n```ts\n| { type: 'M', x: number, y: number },\n| { type: 'L', x, y }\n| { type: 'H', x }\n| { type: 'V', y }\n| { type: 'C', x1, y1, x2, y2, x, y }\n| { type: 'S', x2, y2, x, y }\n| { type: 'Q', x1, y1, x, y }\n| { type: 'T', x, y }\n| { type: 'A', rx, ry, xAxisRotation, largeArcFlag, sweepFlag, x, y }\n| { type: 'Z' }\n```\n\nExample usage:\n\n```js\nconst a = [\n  { type: 'M', x: 0, y: 0 },\n  { type: 'L', x: 10, y: 10 },\n];\nconst b = [\n  { type: 'M', x: 10, y: 10 },\n  { type: 'L', x: 20, y: 20 },\n  { type: 'L', x: 200, y: 200 },\n];\n\nconst interpolator = interpolatePathCommands(a, b);\n\n> interpolator(0);\n[\n  { type: 'M', x: 0, y: 0 },\n  { type: 'L', x: 5, y: 5 },\n  { type: 'L', x: 10, y: 10 },\n]\n\n> interpolator(0.5);\n[\n  { type: 'M', x: 5, y: 5 },\n  { type: 'L', x: 12.5, y: 12.5 },\n  { type: 'L', x: 105, y: 105 },\n]\n```\n\n\n\n<a href=\"#pathCommandsFromString\" name=\"pathCommandsFromString\">#</a> <b>pathCommandsFromString</b>(*pathDString*)\n\nConverts a path `d` string into an array of path command objects to work with [**interpolatePathCommands**](#interpolatePathCommands).\n\nExample usage:\n\n```js\nconst a = 'M0,0L10,10';\n\n> pathCommandsFromString(a)\n[\n  { type: 'M', x: 0, y: 0 },\n  { type: 'L', x: 10, y: 10 },\n]\n```\n"
  },
  {
    "path": "docs/d3-interpolate-path.js",
    "content": "(function (global, factory) {\ntypeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :\ntypeof define === 'function' && define.amd ? define(['exports'], factory) :\n(global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.d3 = global.d3 || {}));\n}(this, (function (exports) { 'use strict';\n\nfunction ownKeys(object, enumerableOnly) {\n  var keys = Object.keys(object);\n\n  if (Object.getOwnPropertySymbols) {\n    var symbols = Object.getOwnPropertySymbols(object);\n\n    if (enumerableOnly) {\n      symbols = symbols.filter(function (sym) {\n        return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n      });\n    }\n\n    keys.push.apply(keys, symbols);\n  }\n\n  return keys;\n}\n\nfunction _objectSpread2(target) {\n  for (var i = 1; i < arguments.length; i++) {\n    var source = arguments[i] != null ? arguments[i] : {};\n\n    if (i % 2) {\n      ownKeys(Object(source), true).forEach(function (key) {\n        _defineProperty(target, key, source[key]);\n      });\n    } else if (Object.getOwnPropertyDescriptors) {\n      Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n    } else {\n      ownKeys(Object(source)).forEach(function (key) {\n        Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n      });\n    }\n  }\n\n  return target;\n}\n\nfunction _typeof(obj) {\n  \"@babel/helpers - typeof\";\n\n  if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n    _typeof = function (obj) {\n      return typeof obj;\n    };\n  } else {\n    _typeof = function (obj) {\n      return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n    };\n  }\n\n  return _typeof(obj);\n}\n\nfunction _defineProperty(obj, key, value) {\n  if (key in obj) {\n    Object.defineProperty(obj, key, {\n      value: value,\n      enumerable: true,\n      configurable: true,\n      writable: true\n    });\n  } else {\n    obj[key] = value;\n  }\n\n  return obj;\n}\n\nfunction _extends() {\n  _extends = Object.assign || function (target) {\n    for (var i = 1; i < arguments.length; i++) {\n      var source = arguments[i];\n\n      for (var key in source) {\n        if (Object.prototype.hasOwnProperty.call(source, key)) {\n          target[key] = source[key];\n        }\n      }\n    }\n\n    return target;\n  };\n\n  return _extends.apply(this, arguments);\n}\n\nfunction _unsupportedIterableToArray(o, minLen) {\n  if (!o) return;\n  if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n  var n = Object.prototype.toString.call(o).slice(8, -1);\n  if (n === \"Object\" && o.constructor) n = o.constructor.name;\n  if (n === \"Map\" || n === \"Set\") return Array.from(o);\n  if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n}\n\nfunction _arrayLikeToArray(arr, len) {\n  if (len == null || len > arr.length) len = arr.length;\n\n  for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];\n\n  return arr2;\n}\n\nfunction _createForOfIteratorHelper(o, allowArrayLike) {\n  var it = typeof Symbol !== \"undefined\" && o[Symbol.iterator] || o[\"@@iterator\"];\n\n  if (!it) {\n    if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") {\n      if (it) o = it;\n      var i = 0;\n\n      var F = function () {};\n\n      return {\n        s: F,\n        n: function () {\n          if (i >= o.length) return {\n            done: true\n          };\n          return {\n            done: false,\n            value: o[i++]\n          };\n        },\n        e: function (e) {\n          throw e;\n        },\n        f: F\n      };\n    }\n\n    throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n  }\n\n  var normalCompletion = true,\n      didErr = false,\n      err;\n  return {\n    s: function () {\n      it = it.call(o);\n    },\n    n: function () {\n      var step = it.next();\n      normalCompletion = step.done;\n      return step;\n    },\n    e: function (e) {\n      didErr = true;\n      err = e;\n    },\n    f: function () {\n      try {\n        if (!normalCompletion && it.return != null) it.return();\n      } finally {\n        if (didErr) throw err;\n      }\n    }\n  };\n}\n\n/**\n * de Casteljau's algorithm for drawing and splitting bezier curves.\n * Inspired by https://pomax.github.io/bezierinfo/\n *\n * @param {Number[][]} points Array of [x,y] points: [start, control1, control2, ..., end]\n *   The original segment to split.\n * @param {Number} t Where to split the curve (value between [0, 1])\n * @return {Object} An object { left, right } where left is the segment from 0..t and\n *   right is the segment from t..1.\n */\nfunction decasteljau(points, t) {\n  var left = [];\n  var right = [];\n\n  function decasteljauRecurse(points, t) {\n    if (points.length === 1) {\n      left.push(points[0]);\n      right.push(points[0]);\n    } else {\n      var newPoints = Array(points.length - 1);\n\n      for (var i = 0; i < newPoints.length; i++) {\n        if (i === 0) {\n          left.push(points[0]);\n        }\n\n        if (i === newPoints.length - 1) {\n          right.push(points[i + 1]);\n        }\n\n        newPoints[i] = [(1 - t) * points[i][0] + t * points[i + 1][0], (1 - t) * points[i][1] + t * points[i + 1][1]];\n      }\n\n      decasteljauRecurse(newPoints, t);\n    }\n  }\n\n  if (points.length) {\n    decasteljauRecurse(points, t);\n  }\n\n  return {\n    left: left,\n    right: right.reverse()\n  };\n}\n/**\n * Convert segments represented as points back into a command object\n *\n * @param {Number[][]} points Array of [x,y] points: [start, control1, control2, ..., end]\n *   Represents a segment\n * @return {Object} A command object representing the segment.\n */\n\n\nfunction pointsToCommand(points) {\n  var command = {};\n\n  if (points.length === 4) {\n    command.x2 = points[2][0];\n    command.y2 = points[2][1];\n  }\n\n  if (points.length >= 3) {\n    command.x1 = points[1][0];\n    command.y1 = points[1][1];\n  }\n\n  command.x = points[points.length - 1][0];\n  command.y = points[points.length - 1][1];\n\n  if (points.length === 4) {\n    // start, control1, control2, end\n    command.type = 'C';\n  } else if (points.length === 3) {\n    // start, control, end\n    command.type = 'Q';\n  } else {\n    // start, end\n    command.type = 'L';\n  }\n\n  return command;\n}\n/**\n * Runs de Casteljau's algorithm enough times to produce the desired number of segments.\n *\n * @param {Number[][]} points Array of [x,y] points for de Casteljau (the initial segment to split)\n * @param {Number} segmentCount Number of segments to split the original into\n * @return {Number[][][]} Array of segments\n */\n\n\nfunction splitCurveAsPoints(points, segmentCount) {\n  segmentCount = segmentCount || 2;\n  var segments = [];\n  var remainingCurve = points;\n  var tIncrement = 1 / segmentCount; // x-----x-----x-----x\n  // t=  0.33   0.66   1\n  // x-----o-----------x\n  // r=  0.33\n  //       x-----o-----x\n  // r=         0.5  (0.33 / (1 - 0.33))  === tIncrement / (1 - (tIncrement * (i - 1))\n  // x-----x-----x-----x----x\n  // t=  0.25   0.5   0.75  1\n  // x-----o----------------x\n  // r=  0.25\n  //       x-----o----------x\n  // r=         0.33  (0.25 / (1 - 0.25))\n  //             x-----o----x\n  // r=         0.5  (0.25 / (1 - 0.5))\n\n  for (var i = 0; i < segmentCount - 1; i++) {\n    var tRelative = tIncrement / (1 - tIncrement * i);\n    var split = decasteljau(remainingCurve, tRelative);\n    segments.push(split.left);\n    remainingCurve = split.right;\n  } // last segment is just to the end from the last point\n\n\n  segments.push(remainingCurve);\n  return segments;\n}\n/**\n * Convert command objects to arrays of points, run de Casteljau's algorithm on it\n * to split into to the desired number of segments.\n *\n * @param {Object} commandStart The start command object\n * @param {Object} commandEnd The end command object\n * @param {Number} segmentCount The number of segments to create\n * @return {Object[]} An array of commands representing the segments in sequence\n */\n\n\nfunction splitCurve(commandStart, commandEnd, segmentCount) {\n  var points = [[commandStart.x, commandStart.y]];\n\n  if (commandEnd.x1 != null) {\n    points.push([commandEnd.x1, commandEnd.y1]);\n  }\n\n  if (commandEnd.x2 != null) {\n    points.push([commandEnd.x2, commandEnd.y2]);\n  }\n\n  points.push([commandEnd.x, commandEnd.y]);\n  return splitCurveAsPoints(points, segmentCount).map(pointsToCommand);\n}\n\nvar commandTokenRegex = /[MLCSTQAHVZmlcstqahv]|-?[\\d.e+-]+/g;\n/**\n * List of params for each command type in a path `d` attribute\n */\n\nvar typeMap = {\n  M: ['x', 'y'],\n  L: ['x', 'y'],\n  H: ['x'],\n  V: ['y'],\n  C: ['x1', 'y1', 'x2', 'y2', 'x', 'y'],\n  S: ['x2', 'y2', 'x', 'y'],\n  Q: ['x1', 'y1', 'x', 'y'],\n  T: ['x', 'y'],\n  A: ['rx', 'ry', 'xAxisRotation', 'largeArcFlag', 'sweepFlag', 'x', 'y'],\n  Z: []\n}; // Add lower case entries too matching uppercase (e.g. 'm' == 'M')\n\nObject.keys(typeMap).forEach(function (key) {\n  typeMap[key.toLowerCase()] = typeMap[key];\n});\n\nfunction arrayOfLength(length, value) {\n  var array = Array(length);\n\n  for (var i = 0; i < length; i++) {\n    array[i] = value;\n  }\n\n  return array;\n}\n/**\n * Converts a command object to a string to be used in a `d` attribute\n * @param {Object} command A command object\n * @return {String} The string for the `d` attribute\n */\n\n\nfunction commandToString(command) {\n  return \"\".concat(command.type).concat(typeMap[command.type].map(function (p) {\n    return command[p];\n  }).join(','));\n}\n/**\n * Converts command A to have the same type as command B.\n *\n * e.g., L0,5 -> C0,5,0,5,0,5\n *\n * Uses these rules:\n * x1 <- x\n * x2 <- x\n * y1 <- y\n * y2 <- y\n * rx <- 0\n * ry <- 0\n * xAxisRotation <- read from B\n * largeArcFlag <- read from B\n * sweepflag <- read from B\n *\n * @param {Object} aCommand Command object from path `d` attribute\n * @param {Object} bCommand Command object from path `d` attribute to match against\n * @return {Object} aCommand converted to type of bCommand\n */\n\n\nfunction convertToSameType(aCommand, bCommand) {\n  var conversionMap = {\n    x1: 'x',\n    y1: 'y',\n    x2: 'x',\n    y2: 'y'\n  };\n  var readFromBKeys = ['xAxisRotation', 'largeArcFlag', 'sweepFlag']; // convert (but ignore M types)\n\n  if (aCommand.type !== bCommand.type && bCommand.type.toUpperCase() !== 'M') {\n    var aConverted = {};\n    Object.keys(bCommand).forEach(function (bKey) {\n      var bValue = bCommand[bKey]; // first read from the A command\n\n      var aValue = aCommand[bKey]; // if it is one of these values, read from B no matter what\n\n      if (aValue === undefined) {\n        if (readFromBKeys.includes(bKey)) {\n          aValue = bValue;\n        } else {\n          // if it wasn't in the A command, see if an equivalent was\n          if (aValue === undefined && conversionMap[bKey]) {\n            aValue = aCommand[conversionMap[bKey]];\n          } // if it doesn't have a converted value, use 0\n\n\n          if (aValue === undefined) {\n            aValue = 0;\n          }\n        }\n      }\n\n      aConverted[bKey] = aValue;\n    }); // update the type to match B\n\n    aConverted.type = bCommand.type;\n    aCommand = aConverted;\n  }\n\n  return aCommand;\n}\n/**\n * Interpolate between command objects commandStart and commandEnd segmentCount times.\n * If the types are L, Q, or C then the curves are split as per de Casteljau's algorithm.\n * Otherwise we just copy commandStart segmentCount - 1 times, finally ending with commandEnd.\n *\n * @param {Object} commandStart Command object at the beginning of the segment\n * @param {Object} commandEnd Command object at the end of the segment\n * @param {Number} segmentCount The number of segments to split this into. If only 1\n *   Then [commandEnd] is returned.\n * @return {Object[]} Array of ~segmentCount command objects between commandStart and\n *   commandEnd. (Can be segmentCount+1 objects if commandStart is type M).\n */\n\n\nfunction splitSegment(commandStart, commandEnd, segmentCount) {\n  var segments = []; // line, quadratic bezier, or cubic bezier\n\n  if (commandEnd.type === 'L' || commandEnd.type === 'Q' || commandEnd.type === 'C') {\n    segments = segments.concat(splitCurve(commandStart, commandEnd, segmentCount)); // general case - just copy the same point\n  } else {\n    var copyCommand = _extends({}, commandStart); // convert M to L\n\n\n    if (copyCommand.type === 'M') {\n      copyCommand.type = 'L';\n    }\n\n    segments = segments.concat(arrayOfLength(segmentCount - 1).map(function () {\n      return copyCommand;\n    }));\n    segments.push(commandEnd);\n  }\n\n  return segments;\n}\n/**\n * Extends an array of commandsToExtend to the length of the referenceCommands by\n * splitting segments until the number of commands match. Ensures all the actual\n * points of commandsToExtend are in the extended array.\n *\n * @param {Object[]} commandsToExtend The command object array to extend\n * @param {Object[]} referenceCommands The command object array to match in length\n * @param {Function} excludeSegment a function that takes a start command object and\n *   end command object and returns true if the segment should be excluded from splitting.\n * @return {Object[]} The extended commandsToExtend array\n */\n\n\nfunction extend(commandsToExtend, referenceCommands, excludeSegment) {\n  // compute insertion points:\n  // number of segments in the path to extend\n  var numSegmentsToExtend = commandsToExtend.length - 1; // number of segments in the reference path.\n\n  var numReferenceSegments = referenceCommands.length - 1; // this value is always between [0, 1].\n\n  var segmentRatio = numSegmentsToExtend / numReferenceSegments; // create a map, mapping segments in referenceCommands to how many points\n  // should be added in that segment (should always be >= 1 since we need each\n  // point itself).\n  // 0 = segment 0-1, 1 = segment 1-2, n-1 = last vertex\n\n  var countPointsPerSegment = arrayOfLength(numReferenceSegments).reduce(function (accum, d, i) {\n    var insertIndex = Math.floor(segmentRatio * i); // handle excluding segments\n\n    if (excludeSegment && insertIndex < commandsToExtend.length - 1 && excludeSegment(commandsToExtend[insertIndex], commandsToExtend[insertIndex + 1])) {\n      // set the insertIndex to the segment that this point should be added to:\n      // round the insertIndex essentially so we split half and half on\n      // neighbouring segments. hence the segmentRatio * i < 0.5\n      var addToPriorSegment = segmentRatio * i % 1 < 0.5; // only skip segment if we already have 1 point in it (can't entirely remove a segment)\n\n      if (accum[insertIndex]) {\n        // TODO - Note this is a naive algorithm that should work for most d3-area use cases\n        // but if two adjacent segments are supposed to be skipped, this will not perform as\n        // expected. Could be updated to search for nearest segment to place the point in, but\n        // will only do that if necessary.\n        // add to the prior segment\n        if (addToPriorSegment) {\n          if (insertIndex > 0) {\n            insertIndex -= 1; // not possible to add to previous so adding to next\n          } else if (insertIndex < commandsToExtend.length - 1) {\n            insertIndex += 1;\n          } // add to next segment\n\n        } else if (insertIndex < commandsToExtend.length - 1) {\n          insertIndex += 1; // not possible to add to next so adding to previous\n        } else if (insertIndex > 0) {\n          insertIndex -= 1;\n        }\n      }\n    }\n\n    accum[insertIndex] = (accum[insertIndex] || 0) + 1;\n    return accum;\n  }, []); // extend each segment to have the correct number of points for a smooth interpolation\n\n  var extended = countPointsPerSegment.reduce(function (extended, segmentCount, i) {\n    // if last command, just add `segmentCount` number of times\n    if (i === commandsToExtend.length - 1) {\n      var lastCommandCopies = arrayOfLength(segmentCount, _extends({}, commandsToExtend[commandsToExtend.length - 1])); // convert M to L\n\n      if (lastCommandCopies[0].type === 'M') {\n        lastCommandCopies.forEach(function (d) {\n          d.type = 'L';\n        });\n      }\n\n      return extended.concat(lastCommandCopies);\n    } // otherwise, split the segment segmentCount times.\n\n\n    return extended.concat(splitSegment(commandsToExtend[i], commandsToExtend[i + 1], segmentCount));\n  }, []); // add in the very first point since splitSegment only adds in the ones after it\n\n  extended.unshift(commandsToExtend[0]);\n  return extended;\n}\n/**\n * Takes a path `d` string and converts it into an array of command\n * objects. Drops the `Z` character.\n *\n * @param {String|null} d A path `d` string\n */\n\n\nfunction pathCommandsFromString(d) {\n  // split into valid tokens\n  var tokens = (d || '').match(commandTokenRegex) || [];\n  var commands = [];\n  var commandArgs;\n  var command; // iterate over each token, checking if we are at a new command\n  // by presence in the typeMap\n\n  for (var i = 0; i < tokens.length; ++i) {\n    commandArgs = typeMap[tokens[i]]; // new command found:\n\n    if (commandArgs) {\n      command = {\n        type: tokens[i]\n      }; // add each of the expected args for this command:\n\n      for (var a = 0; a < commandArgs.length; ++a) {\n        command[commandArgs[a]] = +tokens[i + a + 1];\n      } // need to increment our token index appropriately since\n      // we consumed token args\n\n\n      i += commandArgs.length;\n      commands.push(command);\n    }\n  }\n\n  return commands;\n}\n/**\n * Interpolate from A to B by extending A and B during interpolation to have\n * the same number of points. This allows for a smooth transition when they\n * have a different number of points.\n *\n * Ignores the `Z` command in paths unless both A and B end with it.\n *\n * This function works directly with arrays of command objects instead of with\n * path `d` strings (see interpolatePath for working with `d` strings).\n *\n * @param {Object[]} aCommandsInput Array of path commands\n * @param {Object[]} bCommandsInput Array of path commands\n * @param {(Function|Object)} interpolateOptions\n * @param {Function} interpolateOptions.excludeSegment a function that takes a start command object and\n *   end command object and returns true if the segment should be excluded from splitting.\n * @param {Boolean} interpolateOptions.snapEndsToInput a boolean indicating whether end of input should\n *   be sourced from input argument or computed.\n * @returns {Function} Interpolation function that maps t ([0, 1]) to an array of path commands.\n */\n\nfunction interpolatePathCommands(aCommandsInput, bCommandsInput, interpolateOptions) {\n  // make a copy so we don't mess with the input arrays\n  var aCommands = aCommandsInput == null ? [] : aCommandsInput.slice();\n  var bCommands = bCommandsInput == null ? [] : bCommandsInput.slice();\n\n  var _ref = _typeof(interpolateOptions) === 'object' ? interpolateOptions : {\n    excludeSegment: interpolateOptions,\n    snapEndsToInput: true\n  },\n      excludeSegment = _ref.excludeSegment,\n      snapEndsToInput = _ref.snapEndsToInput; // both input sets are empty, so we don't interpolate\n\n\n  if (!aCommands.length && !bCommands.length) {\n    return function nullInterpolator() {\n      return [];\n    };\n  } // do we add Z during interpolation? yes if both have it. (we'd expect both to have it or not)\n\n\n  var addZ = (aCommands.length === 0 || aCommands[aCommands.length - 1].type === 'Z') && (bCommands.length === 0 || bCommands[bCommands.length - 1].type === 'Z'); // we temporarily remove Z\n\n  if (aCommands.length > 0 && aCommands[aCommands.length - 1].type === 'Z') {\n    aCommands.pop();\n  }\n\n  if (bCommands.length > 0 && bCommands[bCommands.length - 1].type === 'Z') {\n    bCommands.pop();\n  } // if A is empty, treat it as if it used to contain just the first point\n  // of B. This makes it so the line extends out of from that first point.\n\n\n  if (!aCommands.length) {\n    aCommands.push(bCommands[0]); // otherwise if B is empty, treat it as if it contains the first point\n    // of A. This makes it so the line retracts into the first point.\n  } else if (!bCommands.length) {\n    bCommands.push(aCommands[0]);\n  } // extend to match equal size\n\n\n  var numPointsToExtend = Math.abs(bCommands.length - aCommands.length);\n\n  if (numPointsToExtend !== 0) {\n    // B has more points than A, so add points to A before interpolating\n    if (bCommands.length > aCommands.length) {\n      aCommands = extend(aCommands, bCommands, excludeSegment); // else if A has more points than B, add more points to B\n    } else if (bCommands.length < aCommands.length) {\n      bCommands = extend(bCommands, aCommands, excludeSegment);\n    }\n  } // commands have same length now.\n  // convert commands in A to the same type as those in B\n\n\n  aCommands = aCommands.map(function (aCommand, i) {\n    return convertToSameType(aCommand, bCommands[i]);\n  }); // create mutable interpolated command objects\n\n  var interpolatedCommands = aCommands.map(function (aCommand) {\n    return _objectSpread2({}, aCommand);\n  });\n\n  if (addZ) {\n    interpolatedCommands.push({\n      type: 'Z'\n    });\n    aCommands.push({\n      type: 'Z'\n    }); // required for when returning at t == 0\n  }\n\n  return function pathCommandInterpolator(t) {\n    // at 1 return the final value without the extensions used during interpolation\n    if (t === 1 && snapEndsToInput) {\n      return bCommandsInput == null ? [] : bCommandsInput;\n    } // work with aCommands directly since interpolatedCommands are mutated\n\n\n    if (t === 0) {\n      return aCommands;\n    } // interpolate the commands using the mutable interpolated command objs\n\n\n    for (var i = 0; i < interpolatedCommands.length; ++i) {\n      // if (interpolatedCommands[i].type === 'Z') continue;\n      var aCommand = aCommands[i];\n      var bCommand = bCommands[i];\n      var interpolatedCommand = interpolatedCommands[i];\n\n      var _iterator = _createForOfIteratorHelper(typeMap[interpolatedCommand.type]),\n          _step;\n\n      try {\n        for (_iterator.s(); !(_step = _iterator.n()).done;) {\n          var arg = _step.value;\n          interpolatedCommand[arg] = (1 - t) * aCommand[arg] + t * bCommand[arg]; // do not use floats for flags (#27), round to integer\n\n          if (arg === 'largeArcFlag' || arg === 'sweepFlag') {\n            interpolatedCommand[arg] = Math.round(interpolatedCommand[arg]);\n          }\n        }\n      } catch (err) {\n        _iterator.e(err);\n      } finally {\n        _iterator.f();\n      }\n    }\n\n    return interpolatedCommands;\n  };\n}\n/** @typedef InterpolateOptions  */\n\n/**\n * Interpolate from A to B by extending A and B during interpolation to have\n * the same number of points. This allows for a smooth transition when they\n * have a different number of points.\n *\n * Ignores the `Z` character in paths unless both A and B end with it.\n *\n * @param {String} a The `d` attribute for a path\n * @param {String} b The `d` attribute for a path\n * @param {((command1, command2) => boolean|{\n *   excludeSegment?: (command1, command2) => boolean;\n *   snapEndsToInput?: boolean\n * })} interpolateOptions The excludeSegment function or an options object\n *    - interpolateOptions.excludeSegment a function that takes a start command object and\n *      end command object and returns true if the segment should be excluded from splitting.\n *    - interpolateOptions.snapEndsToInput a boolean indicating whether end of input should\n *      be sourced from input argument or computed.\n * @returns {Function} Interpolation function that maps t ([0, 1]) to a path `d` string.\n */\n\nfunction interpolatePath(a, b, interpolateOptions) {\n  var aCommands = pathCommandsFromString(a);\n  var bCommands = pathCommandsFromString(b);\n\n  var _ref2 = _typeof(interpolateOptions) === 'object' ? interpolateOptions : {\n    excludeSegment: interpolateOptions,\n    snapEndsToInput: true\n  },\n      excludeSegment = _ref2.excludeSegment,\n      snapEndsToInput = _ref2.snapEndsToInput;\n\n  if (!aCommands.length && !bCommands.length) {\n    return function nullInterpolator() {\n      return '';\n    };\n  }\n\n  var commandInterpolator = interpolatePathCommands(aCommands, bCommands, {\n    excludeSegment: excludeSegment,\n    snapEndsToInput: snapEndsToInput\n  });\n  return function pathStringInterpolator(t) {\n    // at 1 return the final value without the extensions used during interpolation\n    if (t === 1 && snapEndsToInput) {\n      return b == null ? '' : b;\n    }\n\n    var interpolatedCommands = commandInterpolator(t); // convert to a string (fastest concat: https://jsperf.com/join-concat/150)\n\n    var interpolatedString = '';\n\n    var _iterator2 = _createForOfIteratorHelper(interpolatedCommands),\n        _step2;\n\n    try {\n      for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {\n        var interpolatedCommand = _step2.value;\n        interpolatedString += commandToString(interpolatedCommand);\n      }\n    } catch (err) {\n      _iterator2.e(err);\n    } finally {\n      _iterator2.f();\n    }\n\n    return interpolatedString;\n  };\n}\n\nexports.interpolatePath = interpolatePath;\nexports.interpolatePathCommands = interpolatePathCommands;\nexports.pathCommandsFromString = pathCommandsFromString;\n\nObject.defineProperty(exports, '__esModule', { value: true });\n\n})));\n"
  },
  {
    "path": "docs/example.css",
    "content": ".main-header {\n  margin: 0 0 4px;\n}\n\n.main-link a {\n  color: #888;\n}\n.main-link {\n  margin-top: 0;\n}\n\nbody {\n  font: 14px sans-serif;\n  padding: 15px;\n}\n\n.description {\n  max-width: 800px;\n}\n\npath {\n  stroke: #0bb;\n  stroke-width: 1.5px;\n  fill: none;\n}\n\npath.filled {\n  fill: #0bb;\n  fill-opacity: 0.2;\n}\n\n.example {\n  display: inline-block;\n  margin-right: 10px;\n  margin-bottom: 10px;\n  border: 1px solid #ccc;\n  vertical-align: top;\n}\n\n.example h4 {\n  margin: 0;\n}\n\n.path-d-string {\n  width: 80px;\n  display: inline-block;\n  overflow: hidden;\n  margin-right: 15px;\n  margin-top: 8px;\n  font-size: 12px;\n  font-family: sans-serif;\n  vertical-align: top;\n}\n\n.status, .status button {\n  font-size: 20px;\n  margin-bottom: 10px;\n}\n\n.example-container {\n  display: inline-block;\n  padding: 8px;\n}\n\n.using-d3-default {\n  background: #eee;\n  color: #666;\n}\n\n.using-d3-default h4 {\n  font-weight: 400;\n}\n\n.using-d3-default path {\n  stroke: #b1a776;\n}\n\n.using-d3-default path.filled {\n  fill: #bcb38b;\n}\n\n.interpolator-used {\n  color: #666;\n  font-size: 0.8em;\n}"
  },
  {
    "path": "docs/examples.js",
    "content": "/**\n * Apologies for this code. It's kind of hacked together to quickly demonstrate things.\n */\nvar exampleWidth = 250;\nvar exampleHeight = 200;\nvar showMainExample = !window.location.search.includes('showMainExample=0');\nvar showPathValues = window.location.search.includes('showPathValues=1');\nvar optionShowPathPoints = window.location.search.includes('showPathPoints=1');\nvar maxNumLoops = 10; // comment out for infinite looping\n// var activeExamples = [13]; // comment out for all examples\n// var activeExamples = [2]; // comment out for all examples\nvar delayTime = 0; // 1000\nvar duration = 3000; // 2000\n\nconsole.log('Show Main Example', showMainExample);\nconsole.log('Show Path Values', showPathValues);\n\n// helper to loop a path between two points\nfunction loopPathBasic(path, dPath1, dPath2, loopForever) {\n  var loopCount = 0;\n  var looper = function () {\n    if (!loopForever && typeof maxNumLoops !== 'undefined' && loopCount >= maxNumLoops) {\n      return;\n    } else {\n      loopCount += 1;\n    }\n\n    path.attr('d', dPath1)\n      .transition()\n      .delay(delayTime)\n      .duration(duration)\n      .attr('d', dPath2)\n      .transition()\n      .delay(delayTime)\n      .duration(duration)\n      .attr('d', dPath1)\n      .on('end', looper);\n  };\n  looper();\n}\n\n// helper to loop a path between two points using d3-interpolate-path\nfunction loopPath(path, dPath1, dPath2, pathTextRoot, svg, excludeSegment, loopForever) {\n  var loopCount = 0;\n  var looper = function () {\n    if (!loopForever && typeof maxNumLoops !== 'undefined' && loopCount >= maxNumLoops) {\n      return;\n    } else {\n      loopCount += 1;\n    }\n\n    path.attr('d', dPath1)\n      .transition()\n      .delay(delayTime)\n      .duration(duration)\n      .attrTween('d', function () {\n        return d3.interpolatePath(d3.select(this).attr('d'), dPath2, excludeSegment);\n      })\n      .on('start', function (a) {\n        if (pathTextRoot) {\n          // set timeout in case num points immediately after first tick changes\n          setTimeout(function () { showPathPoints(svg, d3.transition().duration(duration)); }, 0);\n          showDValues(pathTextRoot, dPath1, dPath2, this, d3.transition().duration(duration));\n        }\n      })\n      .transition()\n      .delay(delayTime)\n      .duration(duration)\n      .attrTween('d', function () {\n        return d3.interpolatePath(d3.select(this).attr('d'), dPath1, excludeSegment);\n      })\n      .on('start', function (a) {\n        if (pathTextRoot) {\n          // set timeout in case num points immediately after first tick changes\n          setTimeout(function () { showPathPoints(svg, d3.transition().duration(duration)); }, 0);\n          showDValues(pathTextRoot, dPath1, dPath2, this, d3.transition().duration(duration), true);\n        }\n      })\n      .on('end', looper);\n  };\n  looper();\n}\n\nfunction mainExample() {\n  var dataLine1 = [[0, 0], [200, 100], [400, 50], [500, 80]];\n  var dataLine2 = [[0, 100], [100, 50], [220, 80], [250, 0],\n    [300, 20], [350, 30], [400, 100], [420, 10], [430, 90],\n    [500, 40]];\n  var data = dataLine1.concat(dataLine2);\n\n  var width = 600;\n  var height = 480;\n  var lineHeight = 120;\n\n  var x = d3.scaleLinear()\n      .domain(d3.extent(data, function (d) { return d[0]; }))\n      .range([0, width]);\n\n  var y = d3\n      .scaleLinear()\n      .domain(d3.extent(data, function (d) { return d[1]; }))\n      .range([lineHeight * 0.8, lineHeight * 0.5]);\n\n\n  var svg = d3.select('.chart-container').append('svg')\n      .attr('width', width)\n      .attr('height', height)\n\n  var line = d3.line()\n      .curve(d3.curveLinear)\n      .x(function (d) { return x(d[0]); })\n      .y(function (d) { return y(d[1]); });\n\n\n  var g = svg.append('g');\n\n  g.append('path')\n    .datum(dataLine1)\n    .attr('d', line);\n\n  g.append('text')\n    .attr('y', 25)\n    .text('Line A');\n\n  g = svg.append('g')\n    .attr('transform', 'translate(0 ' + lineHeight + ')')\n    .attr('class', 'using-d3-default');\n\n  loopPathBasic(g.append('path'), line(dataLine1), line(dataLine2), true);\n\n  g.append('text')\n    .attr('y', 25)\n    .text('d3 default interpolation');\n\n  g = svg.append('g')\n    .attr('transform', 'translate(0 ' + lineHeight * 2 + ')')\n\n  loopPath(g.append('path'), line(dataLine1), line(dataLine2), null, null, null, true);\n\n  g.append('text')\n    .attr('y', 25)\n    .text('d3-interpolate-path');\n\n  g = svg.append('g')\n    .attr('transform', 'translate(0 ' + lineHeight * 3 + ')')\n\n  g.append('path')\n    .datum(dataLine2)\n    .attr('d', line);\n\n  g.append('text')\n    .attr('y', 25)\n    .text('Line B');\n\n}\n\n\nvar examples = [\n  {\n    name: 'cubic simple',\n    a: 'M20,20 C160,90 90,120 100,160',\n    b: 'M20,20 C60,90 90,120 150,130 C150,0 180,100 250,100',\n    scale: false,\n  },\n  {\n    name: 'quadratic simple',\n    a: 'M0,70 Q160,20 200,100',\n    b: 'M0,70 Q50,0 100,30 Q120,130 200,100',\n  },\n  {\n    name: 'simple d3-area example',\n    a: 'M0,42L300,129L300,200L0,200Z',\n    b: 'M0,77L150,95L300,81L300,200L150,200L0,200Z',\n    scale: false,\n    className: 'filled',\n    excludeSegment: function (a, b) { return a.x === b.x && a.x === 300; },\n  },\n  {\n    name: 'bigger d3-area example',\n    a: 'M0,100L33,118L67,66L100,154L133,105L167,115L200,62L233,115L267,88L300,103L300,200L267,200L233,200L200,200L167,200L133,200L100,200L67,200L33,200L0,200Z',\n    b: 'M0,94L75,71L150,138L225,59L300,141L300,200L225,200L150,200L75,200L0,200Z',\n    scale: false,\n    className: 'filled',\n    excludeSegment: function (a, b) { return a.x === b.x && a.x === 300; },\n  },\n  {\n    name: 'shape example',\n    a: 'M150,0 L280,100 L150,200 L20,100Z',\n    b: 'M150,10 L230,30 L270,100 L230,170 L150,190 L70,170 L30,100 L70,30Z',\n    scale: false,\n    className: 'filled',\n  },\n  {\n    name: 'simple vertical line test',\n    a: 'M0,0 L300,200',\n    b: 'M100,20 L150,80 L200,140 L300,200',\n    scale: false,\n  },\n  {\n    name: 'vertical line test',\n    a: 'M150,0 L200,40 L100,60 L120,80 L50,100 L250,150 L120,200',\n    b: 'M120,0 L100,30 L20,45 L220,60 L270,90 L180,95 L50,130 L85,140 L140,150 L190,175 L60,195',\n    scale: false,\n  },\n  {\n    name: 'curve test',\n    a: 'M0,32.432432432432506L5.533333333333334,47.39382239382246C11.066666666666668,62.355212355212416,22.133333333333336,92.27799227799233,33.2,108.39768339768345C44.26666666666667,124.51737451737455,55.333333333333336,126.83397683397686,66.39999999999999,136.38996138996143C77.46666666666667,145.94594594594597,88.53333333333335,162.74131274131278,99.59999999999998,156.3706563706564C110.66666666666667,150.00000000000003,121.73333333333335,120.4633204633205,132.8,96.42857142857149C143.86666666666667,72.39382239382245,154.93333333333334,53.861003861003915,166,40.83011583011588C177.0666666666667,27.79922779922784,188.13333333333333,20.2702702702703,199.20000000000002,19.78764478764482C210.26666666666665,19.30501930501934,221.33333333333334,25.86872586872592,232.4,35.328185328185384C243.4666666666667,44.787644787644844,254.5333333333334,57.14285714285719,265.6,71.91119691119695C276.6666666666667,86.67953667953672,287.73333333333335,103.86100386100391,298.8,119.11196911196915C309.8666666666667,134.3629343629344,320.93333333333334,147.68339768339771,332,133.30115830115832C343.06666666666666,118.9189189189189,354.1333333333334,76.8339768339768,365.2,49.99999999999997C376.26666666666665,23.166023166023137,387.3333333333333,11.583011583011569,398.40000000000003,7.046332046332036C409.4666666666667,2.509652509652502,420.5333333333333,5.019305019305004,431.6000000000001,13.6100386100386C442.6666666666667,22.200772200772196,453.7333333333334,36.872586872586886,464.8,55.59845559845562C475.86666666666673,74.32432432432437,486.9333333333334,97.10424710424714,498,109.94208494208497C509.06666666666666,122.7799227799228,520.1333333333333,125.67567567567568,531.2,121.23552123552123C542.2666666666668,116.79536679536677,553.3333333333334,105.01930501930501,564.4,96.71814671814673C575.4666666666667,88.41698841698843,586.5333333333334,83.59073359073363,597.6,93.72586872586878C608.6666666666666,103.86100386100391,619.7333333333332,128.95752895752898,630.8,149.32432432432435C641.8666666666667,169.69111969111972,652.9333333333333,185.32818532818533,664,189.86486486486487C675.0666666666666,194.40154440154438,686.1333333333332,187.83783783783784,697.1999999999999,183.01158301158299C708.2666666666665,178.1853281853282,719.3333333333334,175.09652509652508,730.4,173.45559845559845C741.4666666666667,171.8146718146718,752.5333333333333,171.62162162162164,763.6,159.45945945945948C774.6666666666666,147.29729729729732,785.7333333333332,123.16602316602318,796.7999999999998,109.16988416988418C807.8666666666667,95.17374517374519,818.9333333333334,91.31274131274132,824.4666666666667,89.38223938223939L830,87.45173745173747',\n    b: 'M0,55.22478736330493L2.194315928618639,59.325637910085C4.388631857237278,63.42648845686508,8.777263714474556,71.62818955042523,13.165895571711836,74.17982989064394C17.55452742894911,76.73147023086267,21.943159286186386,73.63304981773996,26.331791143423658,73.35965978128796C30.720423000660944,73.08626974483597,35.10905485789822,75.63791008505468,39.497686715135494,72.90400972053463C43.88631857237277,70.17010935601458,48.274950429610044,62.15066828675575,52.663582286847316,53.94896719319561C57.052214144084616,45.74726609963545,61.44084600132189,37.36330498177398,65.82947785855914,28.341433778857823C70.21810971579642,19.31956257594167,74.60674157303372,9.659781287970835,78.99537343027099,79.82989064398542C83.38400528750826,150,87.77263714474554,300,92.16126900198282,375C96.54990085922009,450,100.93853271645739,450,105.32716457369463,450C109.71579643093196,450,114.10442828816923,450,118.4930601454065,450C122.88169200264377,450,127.27032385988105,450,131.6589557171183,450C136.04758757435556,450,140.43621943159283,450,144.82485128883013,450C149.21348314606743,450,153.6021150033047,450,157.99074686054198,450C162.37937871777925,450,166.76801057501652,450,171.15664243225382,450C175.5452742894911,450,179.93390614672836,450,184.32253800396563,450C188.7111698612029,450,193.09980171844018,450,197.4884335756775,385.2065613608749C201.87706543291478,320.4131227217497,206.26569729015205,190.8262454434994,210.65432914738926,127.03523693803159C215.0429610046266,63.244228432563794,219.4315928618638,65.24908869987847,223.82022471910113,73.90643985419194C228.20885657633835,82.56379100850542,232.59748843357568,97.87363304981771,236.986120290813,109.35601458080191C241.37475214805022,120.83839611178614,245.76338400528755,128.4933171324423,250.15201586252476,126.03280680437426C254.5406477197621,123.57229647630619,258.9292795769993,110.99635479951398,263.3179114342366,97.32685297691371C267.7065432914739,83.65735115431347,272.0951751487112,68.89428918590521,276.48380700594845,61.512758201701075C280.8724388631857,54.13122721749693,285.261070720423,54.13122721749693,289.64970257766026,54.04009720534626C294.03833443489754,53.948967193195585,298.42696629213486,53.76670716889424,302.81559814937214,53.49331713244223C307.2042300066094,53.21992709599024,311.5928618638467,52.85540704738757,315.98149372108395,52.03523693803155C320.3701255783212,51.21506682867554,324.7587574355585,49.939246658566184,329.14738929279576,51.76184690157955C333.53602115003304,53.58444714459292,337.9246530072703,58.505467800729015,342.3132848645076,73.63304981773996C346.7019167217448,88.7606318347509,351.0905485789821,114.09477521263669,355.4791804362194,132.04738760631835C359.86781229345667,150,364.256444150694,160.57108140947753,368.64507600793127,162.30255164034023C373.03370786516854,164.03402187120292,377.42233972240575,156.9258809234508,381.8109715796431,149.81773997569866C386.19960343688035,142.70959902794652,390.5882352941176,135.6014580801944,394.97686715135495,128.58444714459293C399.3654990085922,121.56743620899147,403.7541308658295,114.64155528554068,408.1427627230668,103.52369380315913C412.5313945803041,92.40583232077762,416.9200264375413,77.09599027946535,421.3086582947787,80.92345078979342C425.6972901520159,84.7509113001215,430.0859220092531,107.7156743620899,434.4745538664904,131.318347509113C438.86318572372767,154.92102065613608,443.2518175809649,179.16160388821382,447.6404494382022,184.81166464155527C452.0290812954395,190.46172539489672,456.41771315267675,177.5212636695018,460.8063450099141,152.09599027946535C465.19497686715135,126.6707168894289,469.5836087243886,88.76063183475092,474.063670411985,67.61846901579587C478.5437320995814,46.476306196840824,483.1152236175369,42.102065613608715,487.5952853051333,42.92223572296473C492.0753469927297,43.74240583232074,496.46397884996696,49.75698663426488,500.8526107072042,66.88942891859053C505.24124256444156,84.02187120291619,509.6298744216788,112.27217496962335,514.0185062789161,127.49088699878496C518.4071381361533,142.70959902794655,522.7957699933908,144.8967193195626,527.184401850628,153.91859052247875C531.5730337078652,162.9404617253949,535.9616655651025,178.7970838396112,540.3502974223397,172.78250303766706C544.738929279577,166.76792223572292,549.1275611368143,138.88213851761842,553.5161929940515,116.19076549210202C557.9048248512887,93.49939246658563,562.2934567085262,76.00243013365734,566.6820885657634,63.69987849331713C571.0707204230007,51.397326852976924,575.4593522802379,44.289185905224805,579.8479841374752,43.83353584447147C584.2366159947125,43.377885783718135,588.6252478519497,49.57472660996357,593.013879709187,58.50546780072906C597.4025115664243,67.43620899149454,601.7911434236615,79.10085054678007,606.1797752808989,93.0437424058323C610.5684071381362,106.98663426488456,614.9570389953734,123.20777642770351,619.3456708526107,137.6063183475091C623.7343027098481,152.0048602673147,628.1229345670853,164.58080194410695,632.5115664243225,151.00243013365738C636.9001982815598,137.4240583232078,641.288830138797,97.6913730255164,645.6774619960344,72.3572296476306C650.0660938532716,47.023086269744816,654.454725710509,36.087484811664616,658.8433575677462,31.8043742405832C663.2319894249835,27.52126366950178,667.6206212822208,29.890643985419143,672.009253139458,38.00121506682863C676.3978849966953,46.11178614823812,680.7865168539325,59.96354799513974,685.17514871117,77.6427703523694C689.5637805684072,95.32199270959906,693.9524124256444,116.82867557715677,698.3410442828817,128.94896719319564C702.7296761401191,141.0692588092345,707.1183079973563,143.80315917375452,711.5069398545935,139.61117861482379C715.8955717118309,135.41919805589302,720.2842035690682,124.3013365735115,724.6728354263054,116.46415552855404C729.0614672835427,108.62697448359658,733.4500991407799,104.07047387606316,737.8387309980171,113.63912515188333C742.2273628552545,123.2077764277035,746.6159947124917,146.90157958687723,751.0046265697289,166.13001215066825C755.3932584269663,185.35844471445924,759.7818902842035,200.12150668286753,764.1705221414408,204.40461725394894C768.5591539986781,208.68772782503038,772.9477858559153,202.49088699878493,777.3364177131526,197.93438639125148C781.7250495703898,193.37788578371809,786.1136814276273,190.46172539489672,790.5023132848645,188.91251518833533C794.8909451421018,187.36330498177395,799.279576999339,187.18104495747264,803.6682088565764,175.69866342648842C808.0568407138136,164.21628189550424,812.4454725710508,141.43377885783715,816.8341044282882,128.21992709599024C821.2227362855255,115.00607533414336,825.6113681427627,111.36087484811662,827.8056840713813,109.53827460510325L830,107.71567436208989',\n  },\n  {\n    name: 'line extends example',\n    a: 'M0,81L13,128L27,84L40,83L53,114L67,114L80,137L93,116L107,95L120,57L133,87L147,93L160,163L173,95L187,123L200,113',\n    b: 'M0,81L13,128L27,84L40,83L53,114L67,114L80,137L93,116L107,95L120,57L133,87L147,93L160,163L173,95L187,123L200,113L210,96L228,145L246,92L264,106L282,56L300,90',\n    scale: false,\n  },\n  {\n    name: 'graticule test',\n    a: 'M325.1483457087596,531.4452502639945L340.7606028278758,399.7423780391654L359.3445610837574,268.6082938654016L380.395962152234,138.02316901947256L403.36162136396405,7.912231358580129',\n    b: 'M354.49306197556837,528.5099972371023L344.61144068364655,289.8103838246071L333.8706761621328,30.357378766024',\n  },\n  {\n    name: 'line to line: len(A) = len(b)',\n    a: 'M0,0L10,10L100,100',\n    b: 'M10,10L20,20L200,200',\n  },\n  {\n    name: 'line to line: len(A) > len(b)',\n    a: 'M0,0L10,10L100,100',\n    b: 'M10,10L20,20',\n  },\n  {\n    name: 'line to line: len(A) < len(b)',\n    a: 'M0,0L10,10',\n    b: 'M10,10L20,20L200,200',\n  },\n  {\n    name: 'line to line: len(A)=1',\n    a: 'M0,0Z',\n    b: 'M10,10L20,20L200,200',\n  },\n  {\n    name: 'line to line: len(B)=1',\n    a: 'M0,0L10,10L100,100',\n    b: 'M10,10Z',\n  },\n  {\n    name: 'line to line: A is null',\n    a: null,\n    b: 'M10,10L20,20L200,200',\n  },\n  {\n    name: 'line to line: B is null',\n    a: 'M0,0L10,10L100,100',\n    b: null,\n  },\n  {\n    name: 'line to line: A is null and B is null',\n    a: null,\n    b: null,\n  },\n  {\n    name: 'where both A and B end in Z',\n    a: 'M0,0Z',\n    b: 'M10,10L20,20Z',\n  },\n  {\n    name: 'where A=null, B ends in Z',\n    a: null,\n    b: 'M10,10L20,20Z',\n  },\n  {\n    name: 'with other valid `d` characters',\n    a: 'M0,0m0,0L0,0l0,0H0V0Q0,0,0,0q0,0,0,0C0,0,0,0,0,0c0,0,0,0,0,0T0,0t0,0' +\n      'S0,0,0,0s0,0,0,0A0,0,0,0,0,0,0',\n    b: 'M4,4m4,4L4,4l4,4H4V4Q4,4,4,4q4,4,4,4C4,4,4,4,4,4c4,4,4,4,4,4T4,4t4,4' +\n      'S4,4,4,4s4,4,4,4A4,4,0,0,0,4,4',\n  },\n  {\n    name: 'converts points in A to match types in B',\n    a: 'M2,2 L3,3          C4,4,4,4,4,4 C5,5,5,5,5,5  L6,6  L7,7',\n    b: 'M4,4 C5,5,5,5,5,5  L6,6         S7,7,7,7      H8    V9',\n  },\n  {\n    name: 'curves of different length',\n    a: 'M0,0L3,3C1,1,2,2,4,4C3,3,4,4,6,6L8,0',\n    b: 'M2,2L3,3C5,5,6,6,4,4C6,6,7,7,5,5C8,8,9,9,6,6C10,10,11,11,7,7L8,8',\n  },\n  {\n    name: 'adds to the closest point',\n    a: 'M0,0L4,0L20,0',\n    b: 'M0,4L1,4L3,0L4,0L10,0L14,0L18,0',\n  },\n  {\n    name: 'handles the case where path commands are followed by a space',\n    a: 'M 0 0 L 10 10 L 100 100',\n    b: 'M10,10L20,20',\n  },\n  {\n    name: 'includes M when extending if it is the only item',\n    a: 'M0,0',\n    b: 'M10,10L20,20L30,30',\n  },\n  {\n    name: 'handles negative numbers properly',\n    a: 'M0,0L0,0',\n    b: 'M-10,-10L20,20',\n  },\n];\n\nfunction formatDString(str) {\n  return (str || '').split(/(?=[MLCSTQAHV])/gi).join('<br>');\n}\n\nfunction showPathPoints(svg, transition) {\n  if (!optionShowPathPoints) {\n    return;\n  }\n\n  var path = svg.select('path');\n\n  var points = path.attr('d').split(/[MLCSTQAHVZ\\s]/gi)\n    .filter(function (d) { return d; })\n    .map(function (d) { return d.split(',').map(function (x) { return +x; }); });\n\n  var binding = svg.selectAll('circle').data(points);\n\n  var entering = binding.enter().append('circle')\n    .attr('r', 5)\n    .style('fill', '#b0b')\n    .style('fill-opacity', 0.2)\n    .style('stroke', '#b0b');\n\n  binding = binding.merge(entering)\n    .attr('cx', function (d) { return d[0]; })\n    .attr('cy', function (d) { return d[1]; });\n\n  if (transition) {\n    binding.transition(transition)\n      .tween('cx cy', function (d) {\n        var node = d3.select(this), i = points.indexOf(d);\n        return function (t) {\n          var currPoints = path.attr('d').split(/[MLCSTQAHVZ\\s]/gi)\n            .filter(function (d) { return d; })\n            .map(function (d) { return d.split(',').map(function (x) { return +x; }); });\n\n          if (!currPoints[i]) {\n            node.remove();\n          } else {\n            node.attr('cx', currPoints[i][0]);\n            node.attr('cy', currPoints[i][1]);\n          }\n        };\n      });\n  }\n}\n\nfunction showDValues(root, dLine1, dLine2, pathNode, transition) {\n  if (!showPathValues) {\n    return;\n  }\n\n  root.select('.path-d-original').html(formatDString(dLine1));\n  root.select('.path-d-end').html(formatDString(dLine2));\n  // var current = root.select('.path-d').html(formatDString(dLine1));\n  var currentD = d3.select(pathNode).attr('d');\n  var current = root.select('.path-d').html(formatDString(currentD));\n\n  if (transition) {\n    var first = true;\n    current.transition(transition)\n      .tween('text', function () {\n        var node = this, i = d3.interpolateString(dLine1, dLine2);\n        return function (t) {\n\n          if (first || (t > 0.05 && Math.floor(t * 100) % 10 === 0)) {\n            first = false;\n            // console.log(d3.select(pathNode).attr('d'), t);\n          }\n          node.innerHTML = formatDString(d3.select(pathNode).attr('d'));\n        };\n      });\n  }\n}\n\nfunction pathStringToExtent(str) {\n  var asNumbers = str.replace(/([A-Z])/gi, ' ')\n    .replace(/\\s+/g, ',')\n    .replace(/,,/g, ',')\n    .replace(/^,/, '')\n    .split(',')\n    .map(function (d) { return +d; })\n    .filter(function (d) { return !isNaN(d); });\n  return d3.extent(asNumbers);\n}\n\nfunction makeExample(d, useInterpolatePath) {\n  var width = exampleWidth;\n  var height = exampleHeight;\n  var container = d3.select(this).append('div')\n    .classed('example-container', true)\n    .classed('using-d3-interpolate-path', useInterpolatePath)\n    .classed('using-d3-default', !useInterpolatePath);\n\n  // set the title\n  container.append('h4').text(d.name);\n  container.append('div').attr('class', 'interpolator-used')\n    .text(useInterpolatePath ? 'd3-interpolate-path' : 'd3 default interpolation');\n\n  // scale the paths to fit nicely in the box\n  var extent = pathStringToExtent(d.a + ' ' + d.b);\n  var scaleFactorWidth = Math.min(1, width / extent[1]);\n  var scaleFactorHeight = Math.min(1, height / extent[1]);\n\n  // add the SVG\n  var svg = container.append('svg')\n    .attr('width', width)\n    .attr('height', height)\n    .append('g');\n\n  if (d.scale !== false) {\n    svg.attr('transform', 'scale(' + scaleFactorWidth + ' ' + scaleFactorHeight + ')');\n  } else {\n    svg.attr('transform', 'scale(' + scaleFactorWidth + ')');\n  }\n\n  // adjust the stroke for the scale factor\n  var strokeWidth = 1.5 / Math.min(scaleFactorWidth, scaleFactorHeight);\n\n  var path = svg.append('path')\n    .style('stroke-width', strokeWidth)\n    .attr('class', d.className);\n\n\n  // add in the Path text\n  if (showPathValues) {\n    var pathTextRoot = container.append('div');\n    pathTextRoot.html(\n        '<div class=\"path-d-string\">' +\n          '<b>Path A</b>' +\n          '<div class=\"path-d-original\"></div>' +\n        '</div>' +\n        '<div class=\"path-d-string\">' +\n          '<b>Current <code>d</code></b>' +\n          '<div class=\"path-d\"></div>' +\n        '</div>' +\n        '<div class=\"path-d-string\">' +\n          '<b>Path B</b>' +\n          '<div class=\"path-d-end\"></div>' +\n        '</div>');\n  }\n  if (useInterpolatePath) {\n    loopPath(path, d.a, d.b, pathTextRoot, svg, d.excludeSegment);\n  } else {\n    loopPathBasic(path, d.a, d.b);\n  }\n  showDValues(pathTextRoot, d.a, d.b, path.node());\n  showPathPoints(svg);\n}\n\nvar showExamples = examples.filter(function (d, i) {\n  return typeof activeExamples === 'undefined' || activeExamples.includes(i);\n});\n\n// Initialize main example area\nif (showMainExample) {\n  mainExample();\n}\n\n// Initialize example grid\nvar root = d3.select('.examples');\nvar selection = root.selectAll('.example')\n  .data(showExamples)\n  .enter();\n\nselection.append('div')\n  .attr('class', 'example')\n  // .style('width', exampleWidth + 'px')\n  .each(function (d) {\n    makeExample.call(this, d, true);\n    makeExample.call(this, d, false);\n  });\n\n"
  },
  {
    "path": "docs/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>d3-interpolate-path</title>\n    <meta charset=\"utf-8\">\n    <link rel=\"stylesheet\" href=\"example.css\" />\n  </head>\n  <body>\n    <h1 class=\"main-header\">d3-interpolate-path</h1>\n    <p class=\"main-link\"><a href=\"https://github.com/pbeshai/d3-interpolate-path\">https://github.com/pbeshai/d3-interpolate-path</a></p>\n    <p>\n      d3-interpolate-path is a <a href=\"https://d3js.org/\">D3</a> plugin that adds an\n      <a href=\"https://github.com/d3/d3-interpolate\">interpolator</a>\n      optimized for SVG &lt;path&gt; elements. See the <a href=\"https://github.com/pbeshai/d3-interpolate-path\">GitHub page</a>\n      for details on usage.\n    </p>\n    <p>\n      A previous version of the library is currently <a href=\"https://github.com/pbeshai/d3-interpolate-path/issues/15\">better at extending lines</a>.\n      See <a href=\"v1/\">how the older v1.1.1 performs</a>.\n    </p>\n    <div class='chart-container'></div>\n    <p>\n      <a href=\"https://github.com/pbeshai/d3-interpolate-path\">Code on GitHub</a>\n    </p>\n\n    <h3>Visual Test Examples</h3>\n\n    <div class='examples'>\n    </div>\n    <script src=\"//d3js.org/d3.v4.min.js\"></script>\n    <script src=\"d3-interpolate-path.js\"></script>\n    <script src=\"examples.js\"></script>\n</body>\n</html>"
  },
  {
    "path": "docs/v1/d3-interpolate-path-v1.1.1.js",
    "content": "(function (global, factory) {\n  typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('d3-interpolate')) :\n  typeof define === 'function' && define.amd ? define(['exports', 'd3-interpolate'], factory) :\n  (factory((global.d3 = global.d3 || {}),global.d3));\n}(this, (function (exports,d3Interpolate) { 'use strict';\n\n/**\n * List of params for each command type in a path `d` attribute\n */\nvar typeMap = {\n  M: ['x', 'y'],\n  L: ['x', 'y'],\n  H: ['x'],\n  V: ['y'],\n  C: ['x1', 'y1', 'x2', 'y2', 'x', 'y'],\n  S: ['x2', 'y2', 'x', 'y'],\n  Q: ['x1', 'y1', 'x', 'y'],\n  T: ['x', 'y'],\n  A: ['rx', 'ry', 'xAxisRotation', 'largeArcFlag', 'sweepFlag', 'x', 'y']\n};\n\n/**\n * Convert to object representation of the command from a string\n *\n * @param {String} commandString Token string from the `d` attribute (e.g., L0,0)\n * @return {Object} An object representing this command.\n */\nfunction commandObject(commandString) {\n  // convert all spaces to commas\n  commandString = commandString.trim().replace(/ /g, ',');\n\n  var type = commandString[0];\n  var args = commandString.substring(1).split(',');\n  return typeMap[type.toUpperCase()].reduce(function (obj, param, i) {\n    // parse X as float since we need it to do distance checks for extending points\n    obj[param] = param === 'x' ? parseFloat(args[i]) : args[i];\n    return obj;\n  }, { type: type });\n}\n\n/**\n * Converts a command object to a string to be used in a `d` attribute\n * @param {Object} command A command object\n * @return {String} The string for the `d` attribute\n */\nfunction commandToString(command) {\n  var type = command.type;\n\n  var params = typeMap[type.toUpperCase()];\n  return '' + type + params.map(function (p) {\n    return command[p];\n  }).join(',');\n}\n\n/**\n * Converts command A to have the same type as command B.\n *\n * e.g., L0,5 -> C0,5,0,5,0,5\n *\n * Uses these rules:\n * x1 <- x\n * x2 <- x\n * y1 <- y\n * y2 <- y\n * rx <- 0\n * ry <- 0\n * xAxisRotation <- read from B\n * largeArcFlag <- read from B\n * sweepflag <- read from B\n *\n * @param {Object} aCommand Command object from path `d` attribute\n * @param {Object} bCommand Command object from path `d` attribute to match against\n * @return {Object} aCommand converted to type of bCommand\n */\nfunction convertToSameType(aCommand, bCommand) {\n  var conversionMap = {\n    x1: 'x',\n    y1: 'y',\n    x2: 'x',\n    y2: 'y'\n  };\n\n  var readFromBKeys = ['xAxisRotation', 'largeArcFlag', 'sweepFlag'];\n\n  // convert (but ignore M types)\n  if (aCommand.type !== bCommand.type && bCommand.type.toUpperCase() !== 'M') {\n    (function () {\n      var aConverted = {};\n      Object.keys(bCommand).forEach(function (bKey) {\n        var bValue = bCommand[bKey];\n        // first read from the A command\n        var aValue = aCommand[bKey];\n\n        // if it is one of these values, read from B no matter what\n        if (aValue === undefined) {\n          if (readFromBKeys.includes(bKey)) {\n            aValue = bValue;\n          } else {\n            // if it wasn't in the A command, see if an equivalent was\n            if (aValue === undefined && conversionMap[bKey]) {\n              aValue = aCommand[conversionMap[bKey]];\n            }\n\n            // if it doesn't have a converted value, use 0\n            if (aValue === undefined) {\n              aValue = 0;\n            }\n          }\n        }\n\n        aConverted[bKey] = aValue;\n      });\n\n      // update the type to match B\n      aConverted.type = bCommand.type;\n      aCommand = aConverted;\n    })();\n  }\n\n  return aCommand;\n}\n\n/**\n * Extends an array of commands to the length of the second array\n * inserting points at the spot that is closest by X value. Ensures\n * all the points of commandsToExtend are in the extended array and that\n * only numPointsToExtend points are added.\n *\n * @param {Object[]} commandsToExtend The commands array to extend\n * @param {Object[]} referenceCommands The commands array to match\n * @return {Object[]} The extended commands1 array\n */\nfunction extend(commandsToExtend, referenceCommands, numPointsToExtend) {\n  // map each command in B to a command in A by counting how many times ideally\n  // a command in A was in the initial path (see https://github.com/pbeshai/d3-interpolate-path/issues/8)\n  var initialCommandIndex = void 0;\n  if (commandsToExtend.length > 1 && commandsToExtend[0].type === 'M') {\n    initialCommandIndex = 1;\n  } else {\n    initialCommandIndex = 0;\n  }\n\n  var counts = referenceCommands.reduce(function (counts, refCommand, i) {\n    // skip first M\n    if (i === 0 && refCommand.type === 'M') {\n      counts[0] = 1;\n      return counts;\n    }\n\n    var minDistance = Math.abs(commandsToExtend[initialCommandIndex].x - refCommand.x);\n    var minCommand = initialCommandIndex;\n\n    // find the closest point by X position in A\n    for (var j = initialCommandIndex + 1; j < commandsToExtend.length; j++) {\n      var distance = Math.abs(commandsToExtend[j].x - refCommand.x);\n      if (distance < minDistance) {\n        minDistance = distance;\n        minCommand = j;\n        // since we assume sorted by X, once we find a value farther, we can return the min.\n      } else {\n        break;\n      }\n    }\n\n    counts[minCommand] = (counts[minCommand] || 0) + 1;\n    return counts;\n  }, {});\n\n  // now extend the array adding in at the appropriate place as needed\n  var extended = [];\n  var numExtended = 0;\n  for (var i = 0; i < commandsToExtend.length; i++) {\n    // add in the initial point for this A command\n    extended.push(commandsToExtend[i]);\n\n    for (var j = 1; j < counts[i] && numExtended < numPointsToExtend; j++) {\n      var commandToAdd = Object.assign({}, commandsToExtend[i]);\n      // don't allow multiple Ms\n      if (commandToAdd.type === 'M') {\n        commandToAdd.type = 'L';\n      } else {\n        // try to set control points to x and y\n        if (commandToAdd.x1 !== undefined) {\n          commandToAdd.x1 = commandToAdd.x;\n          commandToAdd.y1 = commandToAdd.y;\n        }\n\n        if (commandToAdd.x2 !== undefined) {\n          commandToAdd.x2 = commandToAdd.x;\n          commandToAdd.y2 = commandToAdd.y;\n        }\n      }\n      extended.push(commandToAdd);\n      numExtended += 1;\n    }\n  }\n\n  return extended;\n}\n\n/**\n * Interpolate from A to B by extending A and B during interpolation to have\n * the same number of points. This allows for a smooth transition when they\n * have a different number of points.\n *\n * Ignores the `Z` character in paths unless both A and B end with it.\n *\n * @param {String} a The `d` attribute for a path\n * @param {String} b The `d` attribute for a path\n */\nfunction interpolatePath(a, b) {\n  // remove Z, remove spaces after letters as seen in IE\n  var aNormalized = a == null ? '' : a.replace(/[Z]/gi, '').replace(/([MLCSTQAHV])\\s*/gi, '$1');\n  var bNormalized = b == null ? '' : b.replace(/[Z]/gi, '').replace(/([MLCSTQAHV])\\s*/gi, '$1');\n  var aPoints = aNormalized === '' ? [] : aNormalized.split(/(?=[MLCSTQAHV])/gi);\n  var bPoints = bNormalized === '' ? [] : bNormalized.split(/(?=[MLCSTQAHV])/gi);\n\n  // if both are empty, interpolation is always the empty string.\n  if (!aPoints.length && !bPoints.length) {\n    return function nullInterpolator() {\n      return '';\n    };\n  }\n\n  // if A is empty, treat it as if it used to contain just the first point\n  // of B. This makes it so the line extends out of from that first point.\n  if (!aPoints.length) {\n    aPoints.push(bPoints[0]);\n\n    // otherwise if B is empty, treat it as if it contains the first point\n    // of A. This makes it so the line retracts into the first point.\n  } else if (!bPoints.length) {\n    bPoints.push(aPoints[0]);\n  }\n\n  // convert to command objects so we can match types\n  var aCommands = aPoints.map(commandObject);\n  var bCommands = bPoints.map(commandObject);\n\n  // extend to match equal size\n  var numPointsToExtend = Math.abs(bPoints.length - aPoints.length);\n\n  if (numPointsToExtend !== 0) {\n    // B has more points than A, so add points to A before interpolating\n    if (bCommands.length > aCommands.length) {\n      aCommands = extend(aCommands, bCommands, numPointsToExtend);\n\n      // else if A has more points than B, add more points to B\n    } else if (bCommands.length < aCommands.length) {\n      bCommands = extend(bCommands, aCommands, numPointsToExtend);\n    }\n  }\n\n  // commands have same length now.\n  // convert A to the same type of B\n  aCommands = aCommands.map(function (aCommand, i) {\n    return convertToSameType(aCommand, bCommands[i]);\n  });\n\n  var aProcessed = aCommands.map(commandToString).join('');\n  var bProcessed = bCommands.map(commandToString).join('');\n\n  // if both A and B end with Z add it back in\n  if ((a == null || a[a.length - 1] === 'Z') && (b == null || b[b.length - 1] === 'Z')) {\n    aProcessed += 'Z';\n    bProcessed += 'Z';\n  }\n\n  var stringInterpolator = d3Interpolate.interpolateString(aProcessed, bProcessed);\n\n  return function pathInterpolator(t) {\n    // at 1 return the final value without the extensions used during interpolation\n    if (t === 1) {\n      return b == null ? '' : b;\n    }\n\n    return stringInterpolator(t);\n  };\n}\n\nexports.interpolatePath = interpolatePath;\n\nObject.defineProperty(exports, '__esModule', { value: true });\n\n})));"
  },
  {
    "path": "docs/v1/example.css",
    "content": ".main-header {\n  margin: 0 0 4px;\n}\n\n.main-link a {\n  color: #888;\n}\n.main-link {\n  margin-top: 0;\n}\n\nbody {\n  font: 14px sans-serif;\n  padding: 15px;\n}\n\n.description {\n  max-width: 800px;\n}\n\npath {\n  stroke: #0bb;\n  stroke-width: 1.5px;\n  fill: none;\n}\n\npath.filled {\n  fill: #0bb;\n  fill-opacity: 0.2;\n}\n\n.example {\n  display: inline-block;\n  margin-right: 10px;\n  margin-bottom: 10px;\n  border: 1px solid #ccc;\n  vertical-align: top;\n}\n\n.example h4 {\n  margin: 0;\n}\n\n.path-d-string {\n  width: 80px;\n  display: inline-block;\n  overflow: hidden;\n  margin-right: 15px;\n  margin-top: 8px;\n  font-size: 12px;\n  font-family: sans-serif;\n  vertical-align: top;\n}\n\n.status, .status button {\n  font-size: 20px;\n  margin-bottom: 10px;\n}\n\n.example-container {\n  display: inline-block;\n  padding: 8px;\n}\n\n.using-d3-default {\n  background: #eee;\n  color: #666;\n}\n\n.using-d3-default h4 {\n  font-weight: 400;\n}\n\n.using-d3-default path {\n  stroke: #b1a776;\n}\n\n.using-d3-default path.filled {\n  fill: #bcb38b;\n}\n\n.interpolator-used {\n  color: #666;\n  font-size: 0.8em;\n}"
  },
  {
    "path": "docs/v1/examples.js",
    "content": "/**\n * Apologies for this code. It's kind of hacked together to quickly demonstrate things.\n */\nvar version = 'v1.1.1';\nvar exampleWidth = 250;\nvar exampleHeight = 200;\nvar showMainExample = !window.location.search.includes('showMainExample=0');\nvar showPathValues = window.location.search.includes('showPathValues=1');\nvar optionShowPathPoints = window.location.search.includes('showPathPoints=1');\nvar maxNumLoops = 10; // comment out for infinite looping\n// var activeExamples = [13]; // comment out for all examples\n// var activeExamples = [2]; // comment out for all examples\nvar delayTime = 0; // 1000\nvar duration = 3000; // 2000\n\nconsole.log('Show Main Example', showMainExample);\nconsole.log('Show Path Values', showPathValues);\n\n// helper to loop a path between two points\nfunction loopPathBasic(path, dPath1, dPath2, loopForever) {\n  var loopCount = 0;\n  var looper = function () {\n    if (!loopForever && typeof maxNumLoops !== 'undefined' && loopCount >= maxNumLoops) {\n      return;\n    } else {\n      loopCount += 1;\n    }\n\n    path.attr('d', dPath1)\n      .transition()\n      .delay(delayTime)\n      .duration(duration)\n      .attr('d', dPath2)\n      .transition()\n      .delay(delayTime)\n      .duration(duration)\n      .attr('d', dPath1)\n      .on('end', looper);\n  };\n  looper();\n}\n\n// helper to loop a path between two points using d3-interpolate-path\nfunction loopPath(path, dPath1, dPath2, pathTextRoot, svg, excludeSegment, loopForever) {\n  var loopCount = 0;\n  var looper = function () {\n    if (!loopForever && typeof maxNumLoops !== 'undefined' && loopCount >= maxNumLoops) {\n      return;\n    } else {\n      loopCount += 1;\n    }\n\n    path.attr('d', dPath1)\n      .transition()\n      .delay(delayTime)\n      .duration(duration)\n      .attrTween('d', function () {\n        return d3.interpolatePath(d3.select(this).attr('d'), dPath2, excludeSegment);\n      })\n      .on('start', function (a) {\n        if (pathTextRoot) {\n          // set timeout in case num points immediately after first tick changes\n          setTimeout(function () { showPathPoints(svg, d3.transition().duration(duration)); }, 0);\n          showDValues(pathTextRoot, dPath1, dPath2, this, d3.transition().duration(duration));\n        }\n      })\n      .transition()\n      .delay(delayTime)\n      .duration(duration)\n      .attrTween('d', function () {\n        return d3.interpolatePath(d3.select(this).attr('d'), dPath1, excludeSegment);\n      })\n      .on('start', function (a) {\n        if (pathTextRoot) {\n          // set timeout in case num points immediately after first tick changes\n          setTimeout(function () { showPathPoints(svg, d3.transition().duration(duration)); }, 0);\n          showDValues(pathTextRoot, dPath1, dPath2, this, d3.transition().duration(duration), true);\n        }\n      })\n      .on('end', looper);\n  };\n  looper();\n}\n\nfunction mainExample() {\n  var dataLine1 = [[0, 0], [200, 100], [400, 50], [500, 80]];\n  var dataLine2 = [[0, 100], [100, 50], [220, 80], [250, 0],\n    [300, 20], [350, 30], [400, 100], [420, 10], [430, 90],\n    [500, 40]];\n  var data = dataLine1.concat(dataLine2);\n\n  var width = 600;\n  var height = 480;\n  var lineHeight = 120;\n\n  var x = d3.scaleLinear()\n      .domain(d3.extent(data, function (d) { return d[0]; }))\n      .range([0, width]);\n\n  var y = d3\n      .scaleLinear()\n      .domain(d3.extent(data, function (d) { return d[1]; }))\n      .range([lineHeight * 0.8, lineHeight * 0.5]);\n\n\n  var svg = d3.select('.chart-container').append('svg')\n      .attr('width', width)\n      .attr('height', height)\n\n  var line = d3.line()\n      .curve(d3.curveLinear)\n      .x(function (d) { return x(d[0]); })\n      .y(function (d) { return y(d[1]); });\n\n\n  var g = svg.append('g');\n\n  g.append('path')\n    .datum(dataLine1)\n    .attr('d', line);\n\n  g.append('text')\n    .attr('y', 25)\n    .text('Line A');\n\n  g = svg.append('g')\n    .attr('transform', 'translate(0 ' + lineHeight + ')')\n    .attr('class', 'using-d3-default');\n\n  loopPathBasic(g.append('path'), line(dataLine1), line(dataLine2), true);\n\n  g.append('text')\n    .attr('y', 25)\n    .text('d3 default interpolation');\n\n  g = svg.append('g')\n    .attr('transform', 'translate(0 ' + lineHeight * 2 + ')')\n\n  loopPath(g.append('path'), line(dataLine1), line(dataLine2), null, null, null, true);\n\n  g.append('text')\n    .attr('y', 25)\n    .text('d3-interpolate-path ' + version);\n\n  g = svg.append('g')\n    .attr('transform', 'translate(0 ' + lineHeight * 3 + ')')\n\n  g.append('path')\n    .datum(dataLine2)\n    .attr('d', line);\n\n  g.append('text')\n    .attr('y', 25)\n    .text('Line B');\n\n}\n\n\nvar examples = [\n  {\n    name: 'cubic simple',\n    a: 'M20,20 C160,90 90,120 100,160',\n    b: 'M20,20 C60,90 90,120 150,130 C150,0 180,100 250,100',\n    scale: false,\n  },\n  {\n    name: 'quadratic simple',\n    a: 'M0,70 Q160,20 200,100',\n    b: 'M0,70 Q50,0 100,30 Q120,130 200,100',\n  },\n  {\n    name: 'simple d3-area example',\n    a: 'M0,42L300,129L300,200L0,200Z',\n    b: 'M0,77L150,95L300,81L300,200L150,200L0,200Z',\n    scale: false,\n    className: 'filled',\n    excludeSegment: function (a, b) { return a.x === b.x && a.x === 300; },\n  },\n  {\n    name: 'bigger d3-area example',\n    a: 'M0,100L33,118L67,66L100,154L133,105L167,115L200,62L233,115L267,88L300,103L300,200L267,200L233,200L200,200L167,200L133,200L100,200L67,200L33,200L0,200Z',\n    b: 'M0,94L75,71L150,138L225,59L300,141L300,200L225,200L150,200L75,200L0,200Z',\n    scale: false,\n    className: 'filled',\n    excludeSegment: function (a, b) { return a.x === b.x && a.x === 300; },\n  },\n  {\n    name: 'shape example',\n    a: 'M150,0 L280,100 L150,200 L20,100Z',\n    b: 'M150,10 L230,30 L270,100 L230,170 L150,190 L70,170 L30,100 L70,30Z',\n    scale: false,\n    className: 'filled',\n  },\n  {\n    name: 'simple vertical line test',\n    a: 'M0,0 L300,200',\n    b: 'M100,20 L150,80 L200,140 L300,200',\n    scale: false,\n  },\n  {\n    name: 'vertical line test',\n    a: 'M150,0 L200,40 L100,60 L120,80 L50,100 L250,150 L120,200',\n    b: 'M120,0 L100,30 L20,45 L220,60 L270,90 L180,95 L50,130 L85,140 L140,150 L190,175 L60,195',\n    scale: false,\n  },\n  {\n    name: 'curve test',\n    a: 'M0,32.432432432432506L5.533333333333334,47.39382239382246C11.066666666666668,62.355212355212416,22.133333333333336,92.27799227799233,33.2,108.39768339768345C44.26666666666667,124.51737451737455,55.333333333333336,126.83397683397686,66.39999999999999,136.38996138996143C77.46666666666667,145.94594594594597,88.53333333333335,162.74131274131278,99.59999999999998,156.3706563706564C110.66666666666667,150.00000000000003,121.73333333333335,120.4633204633205,132.8,96.42857142857149C143.86666666666667,72.39382239382245,154.93333333333334,53.861003861003915,166,40.83011583011588C177.0666666666667,27.79922779922784,188.13333333333333,20.2702702702703,199.20000000000002,19.78764478764482C210.26666666666665,19.30501930501934,221.33333333333334,25.86872586872592,232.4,35.328185328185384C243.4666666666667,44.787644787644844,254.5333333333334,57.14285714285719,265.6,71.91119691119695C276.6666666666667,86.67953667953672,287.73333333333335,103.86100386100391,298.8,119.11196911196915C309.8666666666667,134.3629343629344,320.93333333333334,147.68339768339771,332,133.30115830115832C343.06666666666666,118.9189189189189,354.1333333333334,76.8339768339768,365.2,49.99999999999997C376.26666666666665,23.166023166023137,387.3333333333333,11.583011583011569,398.40000000000003,7.046332046332036C409.4666666666667,2.509652509652502,420.5333333333333,5.019305019305004,431.6000000000001,13.6100386100386C442.6666666666667,22.200772200772196,453.7333333333334,36.872586872586886,464.8,55.59845559845562C475.86666666666673,74.32432432432437,486.9333333333334,97.10424710424714,498,109.94208494208497C509.06666666666666,122.7799227799228,520.1333333333333,125.67567567567568,531.2,121.23552123552123C542.2666666666668,116.79536679536677,553.3333333333334,105.01930501930501,564.4,96.71814671814673C575.4666666666667,88.41698841698843,586.5333333333334,83.59073359073363,597.6,93.72586872586878C608.6666666666666,103.86100386100391,619.7333333333332,128.95752895752898,630.8,149.32432432432435C641.8666666666667,169.69111969111972,652.9333333333333,185.32818532818533,664,189.86486486486487C675.0666666666666,194.40154440154438,686.1333333333332,187.83783783783784,697.1999999999999,183.01158301158299C708.2666666666665,178.1853281853282,719.3333333333334,175.09652509652508,730.4,173.45559845559845C741.4666666666667,171.8146718146718,752.5333333333333,171.62162162162164,763.6,159.45945945945948C774.6666666666666,147.29729729729732,785.7333333333332,123.16602316602318,796.7999999999998,109.16988416988418C807.8666666666667,95.17374517374519,818.9333333333334,91.31274131274132,824.4666666666667,89.38223938223939L830,87.45173745173747',\n    b: 'M0,55.22478736330493L2.194315928618639,59.325637910085C4.388631857237278,63.42648845686508,8.777263714474556,71.62818955042523,13.165895571711836,74.17982989064394C17.55452742894911,76.73147023086267,21.943159286186386,73.63304981773996,26.331791143423658,73.35965978128796C30.720423000660944,73.08626974483597,35.10905485789822,75.63791008505468,39.497686715135494,72.90400972053463C43.88631857237277,70.17010935601458,48.274950429610044,62.15066828675575,52.663582286847316,53.94896719319561C57.052214144084616,45.74726609963545,61.44084600132189,37.36330498177398,65.82947785855914,28.341433778857823C70.21810971579642,19.31956257594167,74.60674157303372,9.659781287970835,78.99537343027099,79.82989064398542C83.38400528750826,150,87.77263714474554,300,92.16126900198282,375C96.54990085922009,450,100.93853271645739,450,105.32716457369463,450C109.71579643093196,450,114.10442828816923,450,118.4930601454065,450C122.88169200264377,450,127.27032385988105,450,131.6589557171183,450C136.04758757435556,450,140.43621943159283,450,144.82485128883013,450C149.21348314606743,450,153.6021150033047,450,157.99074686054198,450C162.37937871777925,450,166.76801057501652,450,171.15664243225382,450C175.5452742894911,450,179.93390614672836,450,184.32253800396563,450C188.7111698612029,450,193.09980171844018,450,197.4884335756775,385.2065613608749C201.87706543291478,320.4131227217497,206.26569729015205,190.8262454434994,210.65432914738926,127.03523693803159C215.0429610046266,63.244228432563794,219.4315928618638,65.24908869987847,223.82022471910113,73.90643985419194C228.20885657633835,82.56379100850542,232.59748843357568,97.87363304981771,236.986120290813,109.35601458080191C241.37475214805022,120.83839611178614,245.76338400528755,128.4933171324423,250.15201586252476,126.03280680437426C254.5406477197621,123.57229647630619,258.9292795769993,110.99635479951398,263.3179114342366,97.32685297691371C267.7065432914739,83.65735115431347,272.0951751487112,68.89428918590521,276.48380700594845,61.512758201701075C280.8724388631857,54.13122721749693,285.261070720423,54.13122721749693,289.64970257766026,54.04009720534626C294.03833443489754,53.948967193195585,298.42696629213486,53.76670716889424,302.81559814937214,53.49331713244223C307.2042300066094,53.21992709599024,311.5928618638467,52.85540704738757,315.98149372108395,52.03523693803155C320.3701255783212,51.21506682867554,324.7587574355585,49.939246658566184,329.14738929279576,51.76184690157955C333.53602115003304,53.58444714459292,337.9246530072703,58.505467800729015,342.3132848645076,73.63304981773996C346.7019167217448,88.7606318347509,351.0905485789821,114.09477521263669,355.4791804362194,132.04738760631835C359.86781229345667,150,364.256444150694,160.57108140947753,368.64507600793127,162.30255164034023C373.03370786516854,164.03402187120292,377.42233972240575,156.9258809234508,381.8109715796431,149.81773997569866C386.19960343688035,142.70959902794652,390.5882352941176,135.6014580801944,394.97686715135495,128.58444714459293C399.3654990085922,121.56743620899147,403.7541308658295,114.64155528554068,408.1427627230668,103.52369380315913C412.5313945803041,92.40583232077762,416.9200264375413,77.09599027946535,421.3086582947787,80.92345078979342C425.6972901520159,84.7509113001215,430.0859220092531,107.7156743620899,434.4745538664904,131.318347509113C438.86318572372767,154.92102065613608,443.2518175809649,179.16160388821382,447.6404494382022,184.81166464155527C452.0290812954395,190.46172539489672,456.41771315267675,177.5212636695018,460.8063450099141,152.09599027946535C465.19497686715135,126.6707168894289,469.5836087243886,88.76063183475092,474.063670411985,67.61846901579587C478.5437320995814,46.476306196840824,483.1152236175369,42.102065613608715,487.5952853051333,42.92223572296473C492.0753469927297,43.74240583232074,496.46397884996696,49.75698663426488,500.8526107072042,66.88942891859053C505.24124256444156,84.02187120291619,509.6298744216788,112.27217496962335,514.0185062789161,127.49088699878496C518.4071381361533,142.70959902794655,522.7957699933908,144.8967193195626,527.184401850628,153.91859052247875C531.5730337078652,162.9404617253949,535.9616655651025,178.7970838396112,540.3502974223397,172.78250303766706C544.738929279577,166.76792223572292,549.1275611368143,138.88213851761842,553.5161929940515,116.19076549210202C557.9048248512887,93.49939246658563,562.2934567085262,76.00243013365734,566.6820885657634,63.69987849331713C571.0707204230007,51.397326852976924,575.4593522802379,44.289185905224805,579.8479841374752,43.83353584447147C584.2366159947125,43.377885783718135,588.6252478519497,49.57472660996357,593.013879709187,58.50546780072906C597.4025115664243,67.43620899149454,601.7911434236615,79.10085054678007,606.1797752808989,93.0437424058323C610.5684071381362,106.98663426488456,614.9570389953734,123.20777642770351,619.3456708526107,137.6063183475091C623.7343027098481,152.0048602673147,628.1229345670853,164.58080194410695,632.5115664243225,151.00243013365738C636.9001982815598,137.4240583232078,641.288830138797,97.6913730255164,645.6774619960344,72.3572296476306C650.0660938532716,47.023086269744816,654.454725710509,36.087484811664616,658.8433575677462,31.8043742405832C663.2319894249835,27.52126366950178,667.6206212822208,29.890643985419143,672.009253139458,38.00121506682863C676.3978849966953,46.11178614823812,680.7865168539325,59.96354799513974,685.17514871117,77.6427703523694C689.5637805684072,95.32199270959906,693.9524124256444,116.82867557715677,698.3410442828817,128.94896719319564C702.7296761401191,141.0692588092345,707.1183079973563,143.80315917375452,711.5069398545935,139.61117861482379C715.8955717118309,135.41919805589302,720.2842035690682,124.3013365735115,724.6728354263054,116.46415552855404C729.0614672835427,108.62697448359658,733.4500991407799,104.07047387606316,737.8387309980171,113.63912515188333C742.2273628552545,123.2077764277035,746.6159947124917,146.90157958687723,751.0046265697289,166.13001215066825C755.3932584269663,185.35844471445924,759.7818902842035,200.12150668286753,764.1705221414408,204.40461725394894C768.5591539986781,208.68772782503038,772.9477858559153,202.49088699878493,777.3364177131526,197.93438639125148C781.7250495703898,193.37788578371809,786.1136814276273,190.46172539489672,790.5023132848645,188.91251518833533C794.8909451421018,187.36330498177395,799.279576999339,187.18104495747264,803.6682088565764,175.69866342648842C808.0568407138136,164.21628189550424,812.4454725710508,141.43377885783715,816.8341044282882,128.21992709599024C821.2227362855255,115.00607533414336,825.6113681427627,111.36087484811662,827.8056840713813,109.53827460510325L830,107.71567436208989',\n  },\n  {\n    name: 'line extends example',\n    a: 'M0,81L13,128L27,84L40,83L53,114L67,114L80,137L93,116L107,95L120,57L133,87L147,93L160,163L173,95L187,123L200,113',\n    b: 'M0,81L13,128L27,84L40,83L53,114L67,114L80,137L93,116L107,95L120,57L133,87L147,93L160,163L173,95L187,123L200,113L210,96L228,145L246,92L264,106L282,56L300,90',\n    scale: false,\n  },\n  {\n    name: 'graticule test',\n    a: 'M325.1483457087596,531.4452502639945L340.7606028278758,399.7423780391654L359.3445610837574,268.6082938654016L380.395962152234,138.02316901947256L403.36162136396405,7.912231358580129',\n    b: 'M354.49306197556837,528.5099972371023L344.61144068364655,289.8103838246071L333.8706761621328,30.357378766024',\n  },\n  {\n    name: 'line to line: len(A) = len(b)',\n    a: 'M0,0L10,10L100,100',\n    b: 'M10,10L20,20L200,200',\n  },\n  {\n    name: 'line to line: len(A) > len(b)',\n    a: 'M0,0L10,10L100,100',\n    b: 'M10,10L20,20',\n  },\n  {\n    name: 'line to line: len(A) < len(b)',\n    a: 'M0,0L10,10',\n    b: 'M10,10L20,20L200,200',\n  },\n  {\n    name: 'line to line: len(A)=1',\n    a: 'M0,0Z',\n    b: 'M10,10L20,20L200,200',\n  },\n  {\n    name: 'line to line: len(B)=1',\n    a: 'M0,0L10,10L100,100',\n    b: 'M10,10Z',\n  },\n  {\n    name: 'line to line: A is null',\n    a: null,\n    b: 'M10,10L20,20L200,200',\n  },\n  {\n    name: 'line to line: B is null',\n    a: 'M0,0L10,10L100,100',\n    b: null,\n  },\n  {\n    name: 'line to line: A is null and B is null',\n    a: null,\n    b: null,\n  },\n  {\n    name: 'where both A and B end in Z',\n    a: 'M0,0Z',\n    b: 'M10,10L20,20Z',\n  },\n  {\n    name: 'where A=null, B ends in Z',\n    a: null,\n    b: 'M10,10L20,20Z',\n  },\n  {\n    name: 'with other valid `d` characters',\n    a: 'M0,0m0,0L0,0l0,0H0V0Q0,0,0,0q0,0,0,0C0,0,0,0,0,0c0,0,0,0,0,0T0,0t0,0' +\n      'S0,0,0,0s0,0,0,0A0,0,0,0,0,0,0',\n    b: 'M4,4m4,4L4,4l4,4H4V4Q4,4,4,4q4,4,4,4C4,4,4,4,4,4c4,4,4,4,4,4T4,4t4,4' +\n      'S4,4,4,4s4,4,4,4A4,4,0,0,0,4,4',\n  },\n  {\n    name: 'converts points in A to match types in B',\n    a: 'M2,2 L3,3          C4,4,4,4,4,4 C5,5,5,5,5,5  L6,6  L7,7',\n    b: 'M4,4 C5,5,5,5,5,5  L6,6         S7,7,7,7      H8    V9',\n  },\n  {\n    name: 'curves of different length',\n    a: 'M0,0L3,3C1,1,2,2,4,4C3,3,4,4,6,6L8,0',\n    b: 'M2,2L3,3C5,5,6,6,4,4C6,6,7,7,5,5C8,8,9,9,6,6C10,10,11,11,7,7L8,8',\n  },\n  {\n    name: 'adds to the closest point',\n    a: 'M0,0L4,0L20,0',\n    b: 'M0,4L1,4L3,0L4,0L10,0L14,0L18,0',\n  },\n  {\n    name: 'handles the case where path commands are followed by a space',\n    a: 'M 0 0 L 10 10 L 100 100',\n    b: 'M10,10L20,20',\n  },\n  {\n    name: 'includes M when extending if it is the only item',\n    a: 'M0,0',\n    b: 'M10,10L20,20L30,30',\n  },\n  {\n    name: 'handles negative numbers properly',\n    a: 'M0,0L0,0',\n    b: 'M-10,-10L20,20',\n  },\n];\n\nfunction formatDString(str) {\n  return (str || '').split(/(?=[MLCSTQAHV])/gi).join('<br>');\n}\n\nfunction showPathPoints(svg, transition) {\n  if (!optionShowPathPoints) {\n    return;\n  }\n\n  var path = svg.select('path');\n\n  var points = path.attr('d').split(/[MLCSTQAHVZ\\s]/gi)\n    .filter(function (d) { return d; })\n    .map(function (d) { return d.split(',').map(function (x) { return +x; }); });\n\n  var binding = svg.selectAll('circle').data(points);\n\n  var entering = binding.enter().append('circle')\n    .attr('r', 5)\n    .style('fill', '#b0b')\n    .style('fill-opacity', 0.2)\n    .style('stroke', '#b0b');\n\n  binding = binding.merge(entering)\n    .attr('cx', function (d) { return d[0]; })\n    .attr('cy', function (d) { return d[1]; });\n\n  if (transition) {\n    binding.transition(transition)\n      .tween('cx cy', function (d) {\n        var node = d3.select(this), i = points.indexOf(d);\n        return function (t) {\n          var currPoints = path.attr('d').split(/[MLCSTQAHVZ\\s]/gi)\n            .filter(function (d) { return d; })\n            .map(function (d) { return d.split(',').map(function (x) { return +x; }); });\n\n          if (!currPoints[i]) {\n            node.remove();\n          } else {\n            node.attr('cx', currPoints[i][0]);\n            node.attr('cy', currPoints[i][1]);\n          }\n        };\n      });\n  }\n}\n\nfunction showDValues(root, dLine1, dLine2, pathNode, transition) {\n  if (!showPathValues) {\n    return;\n  }\n\n  root.select('.path-d-original').html(formatDString(dLine1));\n  root.select('.path-d-end').html(formatDString(dLine2));\n  // var current = root.select('.path-d').html(formatDString(dLine1));\n  var currentD = d3.select(pathNode).attr('d');\n  var current = root.select('.path-d').html(formatDString(currentD));\n\n  if (transition) {\n    var first = true;\n    current.transition(transition)\n      .tween('text', function () {\n        var node = this, i = d3.interpolateString(dLine1, dLine2);\n        return function (t) {\n\n          if (first || (t > 0.05 && Math.floor(t * 100) % 10 === 0)) {\n            first = false;\n            // console.log(d3.select(pathNode).attr('d'), t);\n          }\n          node.innerHTML = formatDString(d3.select(pathNode).attr('d'));\n        };\n      });\n  }\n}\n\nfunction pathStringToExtent(str) {\n  var asNumbers = str.replace(/([A-Z])/gi, ' ')\n    .replace(/\\s+/g, ',')\n    .replace(/,,/g, ',')\n    .replace(/^,/, '')\n    .split(',')\n    .map(function (d) { return +d; })\n    .filter(function (d) { return !isNaN(d); });\n  return d3.extent(asNumbers);\n}\n\nfunction makeExample(d, useInterpolatePath) {\n  var width = exampleWidth;\n  var height = exampleHeight;\n  var container = d3.select(this).append('div')\n    .classed('example-container', true)\n    .classed('using-d3-interpolate-path', useInterpolatePath)\n    .classed('using-d3-default', !useInterpolatePath);\n\n  // set the title\n  container.append('h4').text(d.name);\n  container.append('div').attr('class', 'interpolator-used')\n    .text(useInterpolatePath ? ('d3-interpolate-path ' + version) : 'd3 default interpolation');\n\n  // scale the paths to fit nicely in the box\n  var extent = pathStringToExtent(d.a + ' ' + d.b);\n  var scaleFactorWidth = Math.min(1, width / extent[1]);\n  var scaleFactorHeight = Math.min(1, height / extent[1]);\n\n  // add the SVG\n  var svg = container.append('svg')\n    .attr('width', width)\n    .attr('height', height)\n    .append('g');\n\n  if (d.scale !== false) {\n    svg.attr('transform', 'scale(' + scaleFactorWidth + ' ' + scaleFactorHeight + ')');\n  } else {\n    svg.attr('transform', 'scale(' + scaleFactorWidth + ')');\n  }\n\n  // adjust the stroke for the scale factor\n  var strokeWidth = 1.5 / Math.min(scaleFactorWidth, scaleFactorHeight);\n\n  var path = svg.append('path')\n    .style('stroke-width', strokeWidth)\n    .attr('class', d.className);\n\n\n  // add in the Path text\n  if (showPathValues) {\n    var pathTextRoot = container.append('div');\n    pathTextRoot.html(\n        '<div class=\"path-d-string\">' +\n          '<b>Path A</b>' +\n          '<div class=\"path-d-original\"></div>' +\n        '</div>' +\n        '<div class=\"path-d-string\">' +\n          '<b>Current <code>d</code></b>' +\n          '<div class=\"path-d\"></div>' +\n        '</div>' +\n        '<div class=\"path-d-string\">' +\n          '<b>Path B</b>' +\n          '<div class=\"path-d-end\"></div>' +\n        '</div>');\n  }\n  if (useInterpolatePath) {\n    loopPath(path, d.a, d.b, pathTextRoot, svg, d.excludeSegment);\n  } else {\n    loopPathBasic(path, d.a, d.b);\n  }\n  showDValues(pathTextRoot, d.a, d.b, path.node());\n  showPathPoints(svg);\n}\n\nvar showExamples = examples.filter(function (d, i) {\n  return typeof activeExamples === 'undefined' || activeExamples.includes(i);\n});\n\n// Initialize main example area\nif (showMainExample) {\n  mainExample();\n}\n\n// Initialize example grid\nvar root = d3.select('.examples');\nvar selection = root.selectAll('.example')\n  .data(showExamples)\n  .enter();\n\nselection.append('div')\n  .attr('class', 'example')\n  // .style('width', exampleWidth + 'px')\n  .each(function (d) {\n    makeExample.call(this, d, true);\n    makeExample.call(this, d, false);\n  });\n\n"
  },
  {
    "path": "docs/v1/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>d3-interpolate-path v1.1.1</title>\n    <meta charset=\"utf-8\">\n    <link rel=\"stylesheet\" href=\"example.css\" />\n  </head>\n  <body>\n    <h1 class=\"main-header\">d3-interpolate-path v1.1.1</h1>\n    <p class=\"main-link\"><a href=\"https://github.com/pbeshai/d3-interpolate-path\">https://github.com/pbeshai/d3-interpolate-path</a></p>\n    <p>This example page shows an older version, <b>v1.1.1</b>. See <a href=\"//peterbeshai.com/d3-interpolate-path\">the latest version</a>.</p>\n    <p>\n      d3-interpolate-path is a <a href=\"https://d3js.org/\">D3</a> plugin that adds an\n      <a href=\"https://github.com/d3/d3-interpolate\">interpolator</a>\n      optimized for SVG &lt;path&gt; elements. See the <a href=\"https://github.com/pbeshai/d3-interpolate-path\">GitHub page</a>\n      for details on usage.\n    </p>\n    <div class='chart-container'></div>\n    <p>\n      <a href=\"https://github.com/pbeshai/d3-interpolate-path\">Code on GitHub</a>\n    </p>\n\n    <h3>Visual Test Examples</h3>\n\n    <div class='examples'>\n    </div>\n    <script src=\"//d3js.org/d3.v4.min.js\"></script>\n    <script src=\"d3-interpolate-path-v1.1.1.js\"></script>\n    <script src=\"examples.js\"></script>\n</body>\n</html>"
  },
  {
    "path": "index.js",
    "content": "export {\n  default as interpolatePath,\n  interpolatePathCommands,\n  pathCommandsFromString,\n} from './src/interpolatePath';\n"
  },
  {
    "path": "package.json",
    "content": "{\n  \"name\": \"d3-interpolate-path\",\n  \"version\": \"2.3.0\",\n  \"description\": \"Interpolates path `d` attribute smoothly when A and B have different number of points.\",\n  \"author\": \"Peter Beshai <peter.beshai@gmail.com> (http://github.com/pbeshai)\",\n  \"keywords\": [\n    \"d3\",\n    \"d3-module\",\n    \"d3-interpolate\",\n    \"d3-interpolate-path\",\n    \"svg path\",\n    \"path animation\",\n    \"interpolation\",\n    \"canvas path\"\n  ],\n  \"license\": \"BSD-3-Clause\",\n  \"main\": \"build/d3-interpolate-path.js\",\n  \"module\": \"build/d3-interpolate-path.mjs\",\n  \"homepage\": \"https://pbeshai.github.io/d3-interpolate-path\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/pbeshai/d3-interpolate-path.git\"\n  },\n  \"files\": [\n    \"build/\"\n  ],\n  \"scripts\": {\n    \"build\": \"rm -rf build && mkdir build && rollup --config rollup.config.js\",\n    \"watch\": \"rollup --config rollup.config.js --watch\",\n    \"lint\": \"eslint --ext .js src --fix\",\n    \"pretest\": \"npm run build\",\n    \"test\": \"tape 'test/**/*-test.js'\",\n    \"prepublish\": \"npm run lint && npm run test && uglifyjs build/d3-interpolate-path.js -c -m -o build/d3-interpolate-path.min.js\",\n    \"postpublish\": \"zip -j build/d3-interpolate-path.zip -- LICENSE README.md build/d3-interpolate-path.js build/d3-interpolate-path.min.js\"\n  },\n  \"devDependencies\": {\n    \"@babel/core\": \"^7.14.0\",\n    \"@babel/preset-env\": \"^7.14.1\",\n    \"babel-plugin-transform-object-assign\": \"^6.22.0\",\n    \"babel-runtime\": \"^6.26.0\",\n    \"braces\": \">=3.0.2\",\n    \"eslint\": \"^7.26.0\",\n    \"eslint-config-prettier\": \"^8.3.0\",\n    \"minimist\": \">=1.2.5\",\n    \"rollup\": \"^2.47.0\",\n    \"rollup-plugin-babel\": \"^4.4.0\",\n    \"rollup-plugin-node-resolve\": \"^5.0.1\",\n    \"tape\": \"^5.2.2\",\n    \"uglify-js\": \"^3.13.6\"\n  },\n  \"dependencies\": {}\n}\n"
  },
  {
    "path": "rollup.config.js",
    "content": "// rollup.config.js\nimport resolve from 'rollup-plugin-node-resolve';\nimport babel from 'rollup-plugin-babel';\n\nvar globals = {\n  'd3-interpolate': 'd3',\n};\n\nconst config = {\n  input: 'index.js',\n  plugins: [\n    resolve(),\n    babel({\n      plugins: ['transform-object-assign'],\n      exclude: 'node_modules/**', // only transpile our source code\n    }),\n  ],\n  external: Object.keys(globals),\n  output: [\n    // main UMD output\n    {\n      file: `build/d3-interpolate-path.js`,\n      name: 'd3',\n      format: 'umd',\n      indent: false,\n      extend: true,\n      globals: globals,\n    },\n    // copy main UMD output for use on docs site\n    {\n      file: `docs/d3-interpolate-path.js`,\n      name: 'd3',\n      format: 'umd',\n      indent: false,\n      extend: true,\n      globals: globals,\n    },\n    // main ES Modules output\n    {\n      file: `build/d3-interpolate-path.mjs`,\n      name: 'd3',\n      format: 'es',\n      indent: false,\n      extend: true,\n      globals: globals,\n    },\n  ],\n};\n\nexport default config;\n"
  },
  {
    "path": "src/.babelrc",
    "content": "{\n    \"presets\": [\n      [\"@babel/env\", {\"modules\": false}]\n    ]\n  }"
  },
  {
    "path": "src/interpolatePath.js",
    "content": "import splitCurve from './split';\n\nconst commandTokenRegex = /[MLCSTQAHVZmlcstqahv]|-?[\\d.e+-]+/g;\n/**\n * List of params for each command type in a path `d` attribute\n */\nconst typeMap = {\n  M: ['x', 'y'],\n  L: ['x', 'y'],\n  H: ['x'],\n  V: ['y'],\n  C: ['x1', 'y1', 'x2', 'y2', 'x', 'y'],\n  S: ['x2', 'y2', 'x', 'y'],\n  Q: ['x1', 'y1', 'x', 'y'],\n  T: ['x', 'y'],\n  A: ['rx', 'ry', 'xAxisRotation', 'largeArcFlag', 'sweepFlag', 'x', 'y'],\n  Z: [],\n};\n\n// Add lower case entries too matching uppercase (e.g. 'm' == 'M')\nObject.keys(typeMap).forEach((key) => {\n  typeMap[key.toLowerCase()] = typeMap[key];\n});\n\nfunction arrayOfLength(length, value) {\n  const array = Array(length);\n  for (let i = 0; i < length; i++) {\n    array[i] = value;\n  }\n\n  return array;\n}\n\n/**\n * Converts a command object to a string to be used in a `d` attribute\n * @param {Object} command A command object\n * @return {String} The string for the `d` attribute\n */\nfunction commandToString(command) {\n  return `${command.type}${typeMap[command.type]\n    .map((p) => command[p])\n    .join(',')}`;\n}\n\n/**\n * Converts command A to have the same type as command B.\n *\n * e.g., L0,5 -> C0,5,0,5,0,5\n *\n * Uses these rules:\n * x1 <- x\n * x2 <- x\n * y1 <- y\n * y2 <- y\n * rx <- 0\n * ry <- 0\n * xAxisRotation <- read from B\n * largeArcFlag <- read from B\n * sweepflag <- read from B\n *\n * @param {Object} aCommand Command object from path `d` attribute\n * @param {Object} bCommand Command object from path `d` attribute to match against\n * @return {Object} aCommand converted to type of bCommand\n */\nfunction convertToSameType(aCommand, bCommand) {\n  const conversionMap = {\n    x1: 'x',\n    y1: 'y',\n    x2: 'x',\n    y2: 'y',\n  };\n\n  const readFromBKeys = ['xAxisRotation', 'largeArcFlag', 'sweepFlag'];\n\n  // convert (but ignore M types)\n  if (aCommand.type !== bCommand.type && bCommand.type.toUpperCase() !== 'M') {\n    const aConverted = {};\n    Object.keys(bCommand).forEach((bKey) => {\n      const bValue = bCommand[bKey];\n      // first read from the A command\n      let aValue = aCommand[bKey];\n\n      // if it is one of these values, read from B no matter what\n      if (aValue === undefined) {\n        if (readFromBKeys.includes(bKey)) {\n          aValue = bValue;\n        } else {\n          // if it wasn't in the A command, see if an equivalent was\n          if (aValue === undefined && conversionMap[bKey]) {\n            aValue = aCommand[conversionMap[bKey]];\n          }\n\n          // if it doesn't have a converted value, use 0\n          if (aValue === undefined) {\n            aValue = 0;\n          }\n        }\n      }\n\n      aConverted[bKey] = aValue;\n    });\n\n    // update the type to match B\n    aConverted.type = bCommand.type;\n    aCommand = aConverted;\n  }\n\n  return aCommand;\n}\n\n/**\n * Interpolate between command objects commandStart and commandEnd segmentCount times.\n * If the types are L, Q, or C then the curves are split as per de Casteljau's algorithm.\n * Otherwise we just copy commandStart segmentCount - 1 times, finally ending with commandEnd.\n *\n * @param {Object} commandStart Command object at the beginning of the segment\n * @param {Object} commandEnd Command object at the end of the segment\n * @param {Number} segmentCount The number of segments to split this into. If only 1\n *   Then [commandEnd] is returned.\n * @return {Object[]} Array of ~segmentCount command objects between commandStart and\n *   commandEnd. (Can be segmentCount+1 objects if commandStart is type M).\n */\nfunction splitSegment(commandStart, commandEnd, segmentCount) {\n  let segments = [];\n\n  // line, quadratic bezier, or cubic bezier\n  if (\n    commandEnd.type === 'L' ||\n    commandEnd.type === 'Q' ||\n    commandEnd.type === 'C'\n  ) {\n    segments = segments.concat(\n      splitCurve(commandStart, commandEnd, segmentCount)\n    );\n\n    // general case - just copy the same point\n  } else {\n    const copyCommand = Object.assign({}, commandStart);\n\n    // convert M to L\n    if (copyCommand.type === 'M') {\n      copyCommand.type = 'L';\n    }\n\n    segments = segments.concat(\n      arrayOfLength(segmentCount - 1).map(() => copyCommand)\n    );\n    segments.push(commandEnd);\n  }\n\n  return segments;\n}\n/**\n * Extends an array of commandsToExtend to the length of the referenceCommands by\n * splitting segments until the number of commands match. Ensures all the actual\n * points of commandsToExtend are in the extended array.\n *\n * @param {Object[]} commandsToExtend The command object array to extend\n * @param {Object[]} referenceCommands The command object array to match in length\n * @param {Function} excludeSegment a function that takes a start command object and\n *   end command object and returns true if the segment should be excluded from splitting.\n * @return {Object[]} The extended commandsToExtend array\n */\nfunction extend(commandsToExtend, referenceCommands, excludeSegment) {\n  // compute insertion points:\n  // number of segments in the path to extend\n  const numSegmentsToExtend = commandsToExtend.length - 1;\n\n  // number of segments in the reference path.\n  const numReferenceSegments = referenceCommands.length - 1;\n\n  // this value is always between [0, 1].\n  const segmentRatio = numSegmentsToExtend / numReferenceSegments;\n\n  // create a map, mapping segments in referenceCommands to how many points\n  // should be added in that segment (should always be >= 1 since we need each\n  // point itself).\n  // 0 = segment 0-1, 1 = segment 1-2, n-1 = last vertex\n  const countPointsPerSegment = arrayOfLength(numReferenceSegments).reduce(\n    (accum, d, i) => {\n      let insertIndex = Math.floor(segmentRatio * i);\n\n      // handle excluding segments\n      if (\n        excludeSegment &&\n        insertIndex < commandsToExtend.length - 1 &&\n        excludeSegment(\n          commandsToExtend[insertIndex],\n          commandsToExtend[insertIndex + 1]\n        )\n      ) {\n        // set the insertIndex to the segment that this point should be added to:\n\n        // round the insertIndex essentially so we split half and half on\n        // neighbouring segments. hence the segmentRatio * i < 0.5\n        const addToPriorSegment = (segmentRatio * i) % 1 < 0.5;\n\n        // only skip segment if we already have 1 point in it (can't entirely remove a segment)\n        if (accum[insertIndex]) {\n          // TODO - Note this is a naive algorithm that should work for most d3-area use cases\n          // but if two adjacent segments are supposed to be skipped, this will not perform as\n          // expected. Could be updated to search for nearest segment to place the point in, but\n          // will only do that if necessary.\n\n          // add to the prior segment\n          if (addToPriorSegment) {\n            if (insertIndex > 0) {\n              insertIndex -= 1;\n\n              // not possible to add to previous so adding to next\n            } else if (insertIndex < commandsToExtend.length - 1) {\n              insertIndex += 1;\n            }\n            // add to next segment\n          } else if (insertIndex < commandsToExtend.length - 1) {\n            insertIndex += 1;\n\n            // not possible to add to next so adding to previous\n          } else if (insertIndex > 0) {\n            insertIndex -= 1;\n          }\n        }\n      }\n\n      accum[insertIndex] = (accum[insertIndex] || 0) + 1;\n\n      return accum;\n    },\n    []\n  );\n\n  // extend each segment to have the correct number of points for a smooth interpolation\n  const extended = countPointsPerSegment.reduce((extended, segmentCount, i) => {\n    // if last command, just add `segmentCount` number of times\n    if (i === commandsToExtend.length - 1) {\n      const lastCommandCopies = arrayOfLength(\n        segmentCount,\n        Object.assign({}, commandsToExtend[commandsToExtend.length - 1])\n      );\n\n      // convert M to L\n      if (lastCommandCopies[0].type === 'M') {\n        lastCommandCopies.forEach((d) => {\n          d.type = 'L';\n        });\n      }\n      return extended.concat(lastCommandCopies);\n    }\n\n    // otherwise, split the segment segmentCount times.\n    return extended.concat(\n      splitSegment(commandsToExtend[i], commandsToExtend[i + 1], segmentCount)\n    );\n  }, []);\n\n  // add in the very first point since splitSegment only adds in the ones after it\n  extended.unshift(commandsToExtend[0]);\n\n  return extended;\n}\n\n/**\n * Takes a path `d` string and converts it into an array of command\n * objects. Drops the `Z` character.\n *\n * @param {String|null} d A path `d` string\n */\nexport function pathCommandsFromString(d) {\n  // split into valid tokens\n  const tokens = (d || '').match(commandTokenRegex) || [];\n  const commands = [];\n  let commandArgs;\n  let command;\n\n  // iterate over each token, checking if we are at a new command\n  // by presence in the typeMap\n  for (let i = 0; i < tokens.length; ++i) {\n    commandArgs = typeMap[tokens[i]];\n\n    // new command found:\n    if (commandArgs) {\n      command = {\n        type: tokens[i],\n      };\n\n      // add each of the expected args for this command:\n      for (let a = 0; a < commandArgs.length; ++a) {\n        command[commandArgs[a]] = +tokens[i + a + 1];\n      }\n\n      // need to increment our token index appropriately since\n      // we consumed token args\n      i += commandArgs.length;\n\n      commands.push(command);\n    }\n  }\n  return commands;\n}\n\n/**\n * Interpolate from A to B by extending A and B during interpolation to have\n * the same number of points. This allows for a smooth transition when they\n * have a different number of points.\n *\n * Ignores the `Z` command in paths unless both A and B end with it.\n *\n * This function works directly with arrays of command objects instead of with\n * path `d` strings (see interpolatePath for working with `d` strings).\n *\n * @param {Object[]} aCommandsInput Array of path commands\n * @param {Object[]} bCommandsInput Array of path commands\n * @param {(Function|Object)} interpolateOptions\n * @param {Function} interpolateOptions.excludeSegment a function that takes a start command object and\n *   end command object and returns true if the segment should be excluded from splitting.\n * @param {Boolean} interpolateOptions.snapEndsToInput a boolean indicating whether end of input should\n *   be sourced from input argument or computed.\n * @returns {Function} Interpolation function that maps t ([0, 1]) to an array of path commands.\n */\nexport function interpolatePathCommands(\n  aCommandsInput,\n  bCommandsInput,\n  interpolateOptions\n) {\n  // make a copy so we don't mess with the input arrays\n  let aCommands = aCommandsInput == null ? [] : aCommandsInput.slice();\n  let bCommands = bCommandsInput == null ? [] : bCommandsInput.slice();\n\n  const { excludeSegment, snapEndsToInput } =\n    typeof interpolateOptions === 'object'\n      ? interpolateOptions\n      : {\n          excludeSegment: interpolateOptions,\n          snapEndsToInput: true,\n        };\n\n  // both input sets are empty, so we don't interpolate\n  if (!aCommands.length && !bCommands.length) {\n    return function nullInterpolator() {\n      return [];\n    };\n  }\n\n  // do we add Z during interpolation? yes if both have it. (we'd expect both to have it or not)\n  const addZ =\n    (aCommands.length === 0 || aCommands[aCommands.length - 1].type === 'Z') &&\n    (bCommands.length === 0 || bCommands[bCommands.length - 1].type === 'Z');\n\n  // we temporarily remove Z\n  if (aCommands.length > 0 && aCommands[aCommands.length - 1].type === 'Z') {\n    aCommands.pop();\n  }\n  if (bCommands.length > 0 && bCommands[bCommands.length - 1].type === 'Z') {\n    bCommands.pop();\n  }\n\n  // if A is empty, treat it as if it used to contain just the first point\n  // of B. This makes it so the line extends out of from that first point.\n  if (!aCommands.length) {\n    aCommands.push(bCommands[0]);\n\n    // otherwise if B is empty, treat it as if it contains the first point\n    // of A. This makes it so the line retracts into the first point.\n  } else if (!bCommands.length) {\n    bCommands.push(aCommands[0]);\n  }\n\n  // extend to match equal size\n  const numPointsToExtend = Math.abs(bCommands.length - aCommands.length);\n\n  if (numPointsToExtend !== 0) {\n    // B has more points than A, so add points to A before interpolating\n    if (bCommands.length > aCommands.length) {\n      aCommands = extend(aCommands, bCommands, excludeSegment);\n\n      // else if A has more points than B, add more points to B\n    } else if (bCommands.length < aCommands.length) {\n      bCommands = extend(bCommands, aCommands, excludeSegment);\n    }\n  }\n\n  // commands have same length now.\n  // convert commands in A to the same type as those in B\n  aCommands = aCommands.map((aCommand, i) =>\n    convertToSameType(aCommand, bCommands[i])\n  );\n\n  // create mutable interpolated command objects\n  const interpolatedCommands = aCommands.map((aCommand) => ({ ...aCommand }));\n\n  if (addZ) {\n    interpolatedCommands.push({ type: 'Z' });\n    aCommands.push({ type: 'Z' }); // required for when returning at t == 0\n  }\n\n  return function pathCommandInterpolator(t) {\n    // at 1 return the final value without the extensions used during interpolation\n    if (t === 1 && snapEndsToInput) {\n      return bCommandsInput == null ? [] : bCommandsInput;\n    }\n\n    // work with aCommands directly since interpolatedCommands are mutated\n    if (t === 0) {\n      return aCommands;\n    }\n\n    // interpolate the commands using the mutable interpolated command objs\n    for (let i = 0; i < interpolatedCommands.length; ++i) {\n      // if (interpolatedCommands[i].type === 'Z') continue;\n\n      const aCommand = aCommands[i];\n      const bCommand = bCommands[i];\n      const interpolatedCommand = interpolatedCommands[i];\n      for (const arg of typeMap[interpolatedCommand.type]) {\n        interpolatedCommand[arg] = (1 - t) * aCommand[arg] + t * bCommand[arg];\n\n        // do not use floats for flags (#27), round to integer\n        if (arg === 'largeArcFlag' || arg === 'sweepFlag') {\n          interpolatedCommand[arg] = Math.round(interpolatedCommand[arg]);\n        }\n      }\n    }\n\n    return interpolatedCommands;\n  };\n}\n\n/** @typedef InterpolateOptions  */\n\n/**\n * Interpolate from A to B by extending A and B during interpolation to have\n * the same number of points. This allows for a smooth transition when they\n * have a different number of points.\n *\n * Ignores the `Z` character in paths unless both A and B end with it.\n *\n * @param {String} a The `d` attribute for a path\n * @param {String} b The `d` attribute for a path\n * @param {((command1, command2) => boolean|{\n *   excludeSegment?: (command1, command2) => boolean;\n *   snapEndsToInput?: boolean\n * })} interpolateOptions The excludeSegment function or an options object\n *    - interpolateOptions.excludeSegment a function that takes a start command object and\n *      end command object and returns true if the segment should be excluded from splitting.\n *    - interpolateOptions.snapEndsToInput a boolean indicating whether end of input should\n *      be sourced from input argument or computed.\n * @returns {Function} Interpolation function that maps t ([0, 1]) to a path `d` string.\n */\nexport default function interpolatePath(a, b, interpolateOptions) {\n  let aCommands = pathCommandsFromString(a);\n  let bCommands = pathCommandsFromString(b);\n\n  const { excludeSegment, snapEndsToInput } =\n    typeof interpolateOptions === 'object'\n      ? interpolateOptions\n      : {\n          excludeSegment: interpolateOptions,\n          snapEndsToInput: true,\n        };\n\n  if (!aCommands.length && !bCommands.length) {\n    return function nullInterpolator() {\n      return '';\n    };\n  }\n\n  const commandInterpolator = interpolatePathCommands(aCommands, bCommands, {\n    excludeSegment,\n    snapEndsToInput,\n  });\n\n  return function pathStringInterpolator(t) {\n    // at 1 return the final value without the extensions used during interpolation\n    if (t === 1 && snapEndsToInput) {\n      return b == null ? '' : b;\n    }\n\n    const interpolatedCommands = commandInterpolator(t);\n\n    // convert to a string (fastest concat: https://jsperf.com/join-concat/150)\n    let interpolatedString = '';\n    for (const interpolatedCommand of interpolatedCommands) {\n      interpolatedString += commandToString(interpolatedCommand);\n    }\n\n    return interpolatedString;\n  };\n}\n"
  },
  {
    "path": "src/split.js",
    "content": "/**\n * de Casteljau's algorithm for drawing and splitting bezier curves.\n * Inspired by https://pomax.github.io/bezierinfo/\n *\n * @param {Number[][]} points Array of [x,y] points: [start, control1, control2, ..., end]\n *   The original segment to split.\n * @param {Number} t Where to split the curve (value between [0, 1])\n * @return {Object} An object { left, right } where left is the segment from 0..t and\n *   right is the segment from t..1.\n */\nfunction decasteljau(points, t) {\n  const left = [];\n  const right = [];\n\n  function decasteljauRecurse(points, t) {\n    if (points.length === 1) {\n      left.push(points[0]);\n      right.push(points[0]);\n    } else {\n      const newPoints = Array(points.length - 1);\n\n      for (let i = 0; i < newPoints.length; i++) {\n        if (i === 0) {\n          left.push(points[0]);\n        }\n        if (i === newPoints.length - 1) {\n          right.push(points[i + 1]);\n        }\n\n        newPoints[i] = [\n          ((1 - t) * points[i][0]) + (t * points[i + 1][0]),\n          ((1 - t) * points[i][1]) + (t * points[i + 1][1]),\n        ];\n      }\n\n      decasteljauRecurse(newPoints, t);\n    }\n  }\n\n  if (points.length) {\n    decasteljauRecurse(points, t);\n  }\n\n  return { left, right: right.reverse() };\n}\n\n/**\n * Convert segments represented as points back into a command object\n *\n * @param {Number[][]} points Array of [x,y] points: [start, control1, control2, ..., end]\n *   Represents a segment\n * @return {Object} A command object representing the segment.\n */\nfunction pointsToCommand(points) {\n  const command = {};\n\n  if (points.length === 4) {\n    command.x2 = points[2][0];\n    command.y2 = points[2][1];\n  }\n  if (points.length >= 3) {\n    command.x1 = points[1][0];\n    command.y1 = points[1][1];\n  }\n\n  command.x = points[points.length - 1][0];\n  command.y = points[points.length - 1][1];\n\n  if (points.length === 4) { // start, control1, control2, end\n    command.type = 'C';\n  } else if (points.length === 3) { // start, control, end\n    command.type = 'Q';\n  } else { // start, end\n    command.type = 'L';\n  }\n\n  return command;\n}\n\n\n/**\n * Runs de Casteljau's algorithm enough times to produce the desired number of segments.\n *\n * @param {Number[][]} points Array of [x,y] points for de Casteljau (the initial segment to split)\n * @param {Number} segmentCount Number of segments to split the original into\n * @return {Number[][][]} Array of segments\n */\nfunction splitCurveAsPoints(points, segmentCount) {\n  segmentCount = segmentCount || 2;\n\n  const segments = [];\n  let remainingCurve = points;\n  const tIncrement = 1 / segmentCount;\n\n  // x-----x-----x-----x\n  // t=  0.33   0.66   1\n  // x-----o-----------x\n  // r=  0.33\n  //       x-----o-----x\n  // r=         0.5  (0.33 / (1 - 0.33))  === tIncrement / (1 - (tIncrement * (i - 1))\n\n  // x-----x-----x-----x----x\n  // t=  0.25   0.5   0.75  1\n  // x-----o----------------x\n  // r=  0.25\n  //       x-----o----------x\n  // r=         0.33  (0.25 / (1 - 0.25))\n  //             x-----o----x\n  // r=         0.5  (0.25 / (1 - 0.5))\n\n  for (let i = 0; i < segmentCount - 1; i++) {\n    const tRelative = tIncrement / (1 - (tIncrement * (i)));\n    const split = decasteljau(remainingCurve, tRelative);\n    segments.push(split.left);\n    remainingCurve = split.right;\n  }\n\n  // last segment is just to the end from the last point\n  segments.push(remainingCurve);\n\n  return segments;\n}\n\n/**\n * Convert command objects to arrays of points, run de Casteljau's algorithm on it\n * to split into to the desired number of segments.\n *\n * @param {Object} commandStart The start command object\n * @param {Object} commandEnd The end command object\n * @param {Number} segmentCount The number of segments to create\n * @return {Object[]} An array of commands representing the segments in sequence\n */\nexport default function splitCurve(commandStart, commandEnd, segmentCount) {\n  const points = [[commandStart.x, commandStart.y]];\n  if (commandEnd.x1 != null) {\n    points.push([commandEnd.x1, commandEnd.y1]);\n  }\n  if (commandEnd.x2 != null) {\n    points.push([commandEnd.x2, commandEnd.y2]);\n  }\n  points.push([commandEnd.x, commandEnd.y]);\n\n  return splitCurveAsPoints(points, segmentCount).map(pointsToCommand);\n}\n"
  },
  {
    "path": "test/interpolatePath-test.js",
    "content": "/* eslint-disable */\nconst tape = require('tape');\nconst interpolatePath = require('../').interpolatePath;\nconst APPROX_MAX_T = 0.999999999999;\nconst MIN_T = 0;\n\n// helper to convert a path string to an array (e.g. 'M5,5 L10,10' => ['M', 5, 5, 'L', 10, 10]\nfunction pathToItems(path) {\n  return path\n    .replace(/\\s/g, '')\n    .split(/([A-Z,])/)\n    .filter((d) => d !== '' && d !== ',')\n    .map((d) => (isNaN(+d) ? d : +d));\n}\n\n// helper to ensure path1 and path2 are roughly equal\nfunction approximatelyEqual(path1, path2) {\n  // convert to numbers and letters\n  const path1Items = pathToItems(path1);\n  const path2Items = pathToItems(path2);\n  const epsilon = 0.001;\n\n  if (path1Items.length !== path2Items.length) {\n    return false;\n  }\n\n  for (let i = 0; i < path1Items.length; i++) {\n    if (typeof path1Items[i] === 'string' && path1Items[i] !== path2Items[i]) {\n      return false;\n    }\n\n    // otherwise it's a number, check if approximately equal\n    if (Math.abs(path1Items[i] - path2Items[i]) > epsilon) {\n      return false;\n    }\n  }\n\n  return true;\n}\n\ntape(\n  'interpolatePath() interpolates line to line: len(A) = len(b)',\n  function (t) {\n    const a = 'M0,0L10,10L100,100';\n    const b = 'M10,10L20,20L200,200';\n\n    const interpolator = interpolatePath(a, b);\n\n    t.equal(interpolator(0), a);\n    t.equal(interpolator(1), b);\n    t.equal(interpolator(0.5), 'M5,5L15,15L150,150');\n\n    t.end();\n  }\n);\n\ntape(\n  'interpolatePath() interpolates line to line: len(A) > len(b)',\n  function (t) {\n    const a = 'M0,0L10,10L100,100';\n    const b = 'M10,10L20,20';\n\n    const interpolator = interpolatePath(a, b);\n\n    t.equal(interpolator(0), a);\n\n    // should not be extended anymore and should match exactly\n    t.equal(interpolator(1), b);\n    t.equal(\n      approximatelyEqual(interpolator(APPROX_MAX_T), 'M10,10L15,15L20,20'),\n      true\n    );\n\n    // should be half way between the last point of B and the last point of A\n    // here we get 12.5 since we split the 10,10-20,20 segment and end at L15,15\n    t.equal(interpolator(0.5), 'M5,5L12.5,12.5L60,60');\n\n    t.end();\n  }\n);\n\ntape(\n  'interpolatePath() interpolates line to line w/ snapEndsToInput: len(A) > len(b)',\n  function (t) {\n    const a = 'M0,0L10,10L100,100';\n    const b = 'M10,10L20,20';\n\n    const interpolator = interpolatePath(a, b, { snapEndsToInput: false });\n\n    t.equal(interpolator(0), a);\n\n    // should be extended\n    t.notEqual(interpolator(1), b);\n    t.equal(\n      approximatelyEqual(interpolator(APPROX_MAX_T), 'M10,10L15,15L20,20'),\n      true\n    );\n\n    // should be half way between the last point of B and the last point of A\n    // here we get 12.5 since we split the 10,10-20,20 segment and end at L15,15\n    t.equal(interpolator(0.5), 'M5,5L12.5,12.5L60,60');\n\n    t.end();\n  }\n);\n\ntape(\n  'interpolatePath() interpolates line to line: len(A) < len(b)',\n  function (t) {\n    const a = 'M0,0L10,10';\n    const b = 'M10,10L20,20L200,200';\n\n    const interpolator = interpolatePath(a, b);\n\n    // should be extended to match the length of b\n    t.equal(interpolator(0), 'M0,0L5,5L10,10');\n    t.equal(\n      approximatelyEqual(interpolator(APPROX_MAX_T), 'M10,10L20,20L200,200'),\n      true\n    );\n\n    // should be half way between the last point of B and the last point of A\n    t.equal(interpolator(0.5), 'M5,5L12.5,12.5L105,105');\n\n    t.end();\n  }\n);\n\ntape('interpolatePath() interpolates line to line: len(A)=1', function (t) {\n  const a = 'M0,0Z';\n  const b = 'M10,10L20,20L200,200';\n\n  const interpolator = interpolatePath(a, b);\n\n  // should be extended to match the length of b\n  t.equal(interpolator(0), 'M0,0L0,0L0,0');\n  t.equal(interpolator(1), b);\n\n  // should be half way between the last point of B and the last point of A\n  t.equal(interpolator(0.5), 'M5,5L10,10L100,100');\n\n  t.end();\n});\n\ntape('interpolatePath() interpolates line to line: len(B)=1', function (t) {\n  const a = 'M0,0L10,10L100,100';\n  const b = 'M10,10Z';\n\n  const interpolator = interpolatePath(a, b);\n\n  t.equal(interpolator(0), a);\n\n  // should not be extended anymore and should match exactly\n  t.equal(interpolator(1), b);\n\n  // should be half way between the last point of B and the last point of A\n  t.equal(interpolator(0.5), 'M5,5L10,10L55,55');\n\n  t.end();\n});\n\ntape('interpolatePath() interpolates line to line: A is null', function (t) {\n  const a = null;\n  const b = 'M10,10L20,20L200,200';\n\n  const interpolator = interpolatePath(a, b);\n\n  // should be extended to match the length of b\n  t.equal(interpolator(0), 'M10,10L10,10L10,10');\n  t.equal(interpolator(1), b);\n\n  // should be half way between the last point of B and the last point of A\n  t.equal(interpolator(0.5), 'M10,10L15,15L105,105');\n\n  t.end();\n});\n\ntape('interpolatePath() interpolates line to line: B is null', function (t) {\n  const a = 'M0,0L10,10L100,100';\n  const b = null;\n\n  const interpolator = interpolatePath(a, b);\n\n  t.equal(interpolator(0), a);\n  t.equal(interpolator(1), '');\n\n  // should be halfway towards the first point of a\n  t.equal(interpolator(0.5), 'M0,0L5,5L50,50');\n\n  t.end();\n});\n\ntape(\n  'interpolatePath() interpolates line to line: A is null and B is null',\n  function (t) {\n    const a = null;\n    const b = null;\n\n    const interpolator = interpolatePath(a, b);\n\n    t.equal(interpolator(0), '');\n    t.equal(interpolator(1), '');\n\n    // should be halfway towards the first point of a\n    t.equal(interpolator(0.5), '');\n\n    t.end();\n  }\n);\n\ntape(\n  'interpolatePath() interpolates where both A and B end in Z',\n  function (t) {\n    const a = 'M0,0Z';\n    const b = 'M10,10L20,20Z';\n\n    const interpolator = interpolatePath(a, b);\n\n    t.equal(interpolator(0), 'M0,0L0,0Z');\n    t.equal(interpolator(1), b);\n\n    // should be halfway towards the first point of a\n    t.equal(interpolator(0.5), 'M5,5L10,10Z');\n\n    t.end();\n  }\n);\n\ntape('interpolatePath() interpolates where A=null, B ends in Z', function (t) {\n  const a = null;\n  const b = 'M10,10L20,20Z';\n\n  const interpolator = interpolatePath(a, b);\n\n  t.equal(interpolator(0), 'M10,10L10,10Z');\n  t.equal(interpolator(1), b);\n\n  // should be halfway towards the first point of a\n  t.equal(interpolator(0.5), 'M10,10L15,15Z');\n\n  t.end();\n});\n\ntape(\n  'interpolatePath() interpolates A command using integer value',\n  function (t) {\n    const a = 'A10,10,0,0,1,20,20';\n    const b = 'A20,20,40,1,0,10,10';\n\n    const interpolator = interpolatePath(a, b);\n\n    // should be extended to match the length of b\n    t.equal(interpolator(0), a);\n    t.equal(interpolator(1), b);\n\n    // should be half way between the last point of B and the last point of A\n    t.equal(interpolator(0.5), 'A15,15,20,1,1,15,15');\n    t.equal(interpolator(0.75), 'A17.5,17.5,30,1,0,12.5,12.5');\n    t.equal(interpolator(0.25), 'A12.5,12.5,10,0,1,17.5,17.5');\n\n    t.end();\n  }\n);\n\ntape(\n  'interpolatePath() interpolates with other valid `d` characters',\n  function (t) {\n    const a =\n      'M0,0m0,0L0,0l0,0H0V0Q0,0,0,0q0,0,0,0C0,0,0,0,0,0c0,0,0,0,0,0T0,0t0,0' +\n      'S0,0,0,0s0,0,0,0A0,0,0,0,0,0,0';\n    const b =\n      'M4,4m4,4L4,4l4,4H4V4Q4,4,4,4q4,4,4,4C4,4,4,4,4,4c4,4,4,4,4,4T4,4t4,4' +\n      'S4,4,4,4s4,4,4,4A4,4,1,1,1,4,4';\n\n    const interpolator = interpolatePath(a, b);\n\n    t.equal(interpolator(0), a);\n    t.equal(interpolator(1), b);\n\n    // should be halfway towards the first point of a\n    t.equal(\n      interpolator(0.5),\n      'M2,2m2,2L2,2l2,2H2V2Q2,2,2,2q2,2,2,2C2,2,2,2,2,2c2,2,2,2,2,2' +\n        'T2,2t2,2S2,2,2,2s2,2,2,2A2,2,0.5,1,1,2,2'\n    );\n\n    t.end();\n  }\n);\n\ntape(\n  'interpolatePath() converts points in A to match types in B',\n  function (t) {\n    const a = 'M2,2 L3,3          C4,4,4,4,4,4 C5,5,5,5,5,5  L6,6  L7,7';\n    const b = 'M4,4 C5,5,5,5,5,5  L6,6         S7,7,7,7      H8    V9';\n\n    const interpolator = interpolatePath(a, b);\n\n    t.equal(interpolator(0), 'M2,2C3,3,3,3,3,3L4,4S5,5,5,5H6V7');\n    t.equal(interpolator(1), b);\n\n    // should be halfway towards the first point of a\n    t.equal(interpolator(0.5), 'M3,3C4,4,4,4,4,4L5,5S6,6,6,6H7V8');\n\n    t.end();\n  }\n);\n\ntape('interpolatePath() interpolates curves of different length', function (t) {\n  const a = 'M0,0C1,1,2,2,4,4C3,3,4,4,6,6';\n  const b = 'M2,2C5,5,6,6,4,4C6,6,7,7,5,5C8,8,9,9,6,6C10,10,11,11,7,7';\n\n  const interpolator = interpolatePath(a, b);\n\n  t.equal(\n    interpolator(0),\n    'M0,0C0.5,0.5,1,1,1.625,1.625C2.25,2.25,3,3,4,4C3.5,3.5,3.5,3.5,3.875,3.875C4.25,4.25,5,5,6,6'\n  );\n\n  t.equal(interpolator(1), b);\n\n  // should be halfway towards the first point of a\n  t.equal(\n    interpolator(0.5),\n    'M1,1C2.75,2.75,3.5,3.5,2.8125,2.8125C4.125,4.125,5,5,' +\n      '4.5,4.5C5.75,5.75,6.25,6.25,4.9375,4.9375C7.125,7.125,8,8,6.5,6.5'\n  );\n\n  t.end();\n});\n\ntape(\n  'interpolatePath() handles the case where path commands are followed by a space',\n  function (t) {\n    // IE bug fix.\n    const a = 'M 0 0 L 10 10 L 100 100';\n    const b = 'M10,10L20,20';\n\n    const interpolator = interpolatePath(a, b);\n\n    t.equal(interpolator(0), 'M0,0L10,10L100,100');\n\n    // should not be extended anymore and should match exactly\n    t.equal(interpolator(1), b);\n    t.equal(\n      approximatelyEqual(interpolator(APPROX_MAX_T), 'M10,10L15,15L20,20'),\n      true\n    );\n\n    // should be half way between the last point of B and the last point of A\n    // here we get 12.5 since we split the 10,10-20,20 segment and end at L15,15\n    t.equal(interpolator(0.5), 'M5,5L12.5,12.5L60,60');\n\n    t.end();\n  }\n);\n\ntape(\n  'interpolatePath() includes M when extending if it is the only item',\n  function (t) {\n    const a = 'M0,0';\n    const b = 'M10,10L20,20L30,30';\n\n    const interpolator = interpolatePath(a, b);\n\n    t.equal(interpolator(0), 'M0,0L0,0L0,0');\n\n    // should not be extended anymore and should match exactly\n    t.equal(interpolator(1), b);\n\n    // should be half way between the last point of B and the last point of A\n    t.equal(interpolator(0.5), 'M5,5L10,10L15,15');\n\n    t.end();\n  }\n);\n\ntape('interpolatePath() handles negative numbers properly', function (t) {\n  const a = 'M0,0L0,0';\n  const b = 'M-10,-10L20,20';\n\n  const interpolator = interpolatePath(a, b);\n\n  t.equal(interpolator(0), 'M0,0L0,0');\n  t.equal(interpolator(1), b);\n\n  // should be half way between the last point of B and the last point of A\n  t.equal(interpolator(0.5), 'M-5,-5L10,10');\n\n  t.end();\n});\n\ntape(\n  'interpolatePath() handles numbers in scientific notation properly',\n  function (t) {\n    const a = 'M0.000000e+0,0L0,0';\n    const b = 'M-1.000000e+1,-10L20,2.000000e+1';\n\n    const interpolator = interpolatePath(a, b);\n\n    t.equal(interpolator(0), 'M0,0L0,0');\n    t.equal(interpolator(1), b);\n\n    // should be half way between the last point of B and the last point of A\n    t.equal(interpolator(0.5), 'M-5,-5L10,10');\n\n    t.end();\n  }\n);\n\ntape('interpolatePath() handles leading spaces', function (t) {\n  const a = '       M0,0L10,10L100,100';\n  const b = `\n\n        \\tM10,10L20,20L200,200`;\n\n  const interpolator = interpolatePath(a, b);\n\n  t.equal(interpolator(0), 'M0,0L10,10L100,100');\n  t.equal(interpolator(1), b);\n  t.equal(interpolator(0.5), 'M5,5L15,15L150,150');\n\n  t.end();\n});\n\ntape('interpolatePath() speed check', function (t) {\n  const a =\n    'M-0.04470287711750471,0C-0.04470287711750471,0,0.0549156720075664,183.81543114379014,0.4023258940575424,183.81833500000002C0.526136890736335,183.81936988414768,0.6370732629693643,166.28385175799752,0.8493546652325895,160.47603C0.9758852381605138,157.01427118991134,1.159198737306147,152.19239531779905,1.2963834364076363,152.19358100000002C1.462792685448858,152.1950192688883,1.570804424917851,160.8290137029863,1.7434122075826834,164.390285C1.8780614267538214,167.1683891619115,2.0332188018527293,171.80289993588647,2.1904409787577306,171.803948C2.332724496768761,171.80489648101016,2.238234072817103,165.9019150280637,2.6374697499327775,165.737611C2.7620960100887855,165.68632150429636,2.9586685404548496,166.1799550006193,3.0844985211078244,166.126846C3.5479378120008116,165.93124239695328,3.3104342111345733,160.0258386390105,3.5315272922828718,158.098832C3.6572342833339717,157.00319298195663,3.8332512551491544,155.5370455129371,3.9785560634579187,155.538306C4.131679880260214,155.53963431523158,4.2821873821017515,158.39169317429364,4.425584834632966,158.39C4.5812039682111845,158.38816251745112,4.746590024452187,155.014470835385,4.872613605808013,155.01999999999998C5.090049217183896,155.02953978037698,5.1522628706299,165.12815540046833,5.31964237698306,165.13C5.456390430448821,165.13150702676137,5.6299230946923435,160.86445592906185,5.766671148158107,158.39C5.9340506545112675,155.3612679529824,6.046320412979994,151.30873204701757,6.213699919333155,148.27999999999997C6.350447972798918,145.80554407093814,6.511719100116519,141.54000000000002,6.6607286905082015,141.54000000000002C6.809738280899883,141.54000000000002,6.971009408217484,148.28150702676132,7.1077574616832475,148.27999999999997C7.275136968036411,148.27815540046836,7.337350621482413,138.17953978037704,7.554786232858295,138.17000000000002C7.68080981421412,138.164470835385,7.870774944195174,140.22140955710998,8.001815004033343,141.54000000000002C8.186529853242384,143.3986929457122,7.95764144262283,147.8202973291211,8.448843775208388,148.27999999999997C8.575207274844532,148.39826010267208,8.769509046747293,148.16173989732786,8.895872546383437,148.27999999999997C9.387074878969003,148.73970267087893,9.1938917271668,155.01999999999998,9.342901317558484,155.01999999999998C9.491910907950167,155.01999999999998,9.605215239524492,148.28606561227687,9.78993008873353,148.27999999999997C9.920970148571701,148.27569694478208,10.087949269516896,150.52666666666664,10.236958859908578,151.64999999999998C10.385968450300261,152.7733333333333,10.534978040691943,155.01999999999998,10.683987631083626,155.01999999999998C10.832997221475308,155.02,10.98200681186699,152.7733333333333,11.131016402258672,151.64999999999998C11.280025992650353,150.52666666666664,11.453836251401587,148.2738634816297,11.578045173433718,148.27999999999997C11.8254500696269,148.29222299224205,11.777669048415582,161.74777700775797,12.025073944608765,161.76C12.149282866640899,161.7661365183703,12.32309312539213,159.51333333333335,12.472102715783812,158.39C12.621112306175496,157.26666666666662,12.57791324533422,155.31894474475482,12.919131486958861,155.01999999999998C13.042866096536695,154.9115948599305,13.237590505198265,155.14301047090632,13.366160258133908,155.01999999999998C13.97788875782087,154.4347222881343,13.645809522955792,147.9387320470176,13.813189029308955,144.91000000000003C13.949937082774717,142.43554407093816,14.13240491590533,138.167462320762,14.260217800484,138.17000000000002C14.462121588496245,138.17400872770077,14.432092534979779,155.00549202791083,14.707246571659047,155.01999999999998C14.830815229907705,155.02651537105035,15.023235282995927,151.6456969447821,15.154275342834095,151.64999999999998C15.33899019204314,151.65606561227688,15.46455606054338,158.39150702676136,15.601304114009142,158.39C15.768683620362305,158.38815540046832,15.908576657164227,151.892368483562,16.04833288518419,148.27999999999997C16.209675024633082,144.10968667748853,16.247956760166055,137.79149787222804,16.495361656359236,134.8C16.619570578391365,133.29812703108053,16.793380837142603,132.55333333333334,16.942390427534285,131.43C17.091400017925967,130.30666666666667,17.24040960831765,129.18333333333337,17.38941919870933,128.06C17.53842878910101,126.93666666666664,17.687438379492693,125.81333333333333,17.836447969884375,124.69C17.985457560276057,123.56666666666666,18.134467150667742,121.31999999999998,18.283476741059424,121.32C18.432486331451106,121.31999999999998,18.599465452396306,124.6943030552179,18.730505512234473,124.69C18.915220361443517,124.68393438772318,19.028524693017836,117.94999999999997,19.177534283409518,117.94999999999999C19.3265438738012,117.94999999999997,19.439848205375533,124.68393438772318,19.624563054584566,124.69C19.75560311442274,124.6943030552179,19.940551765921448,121.3156969447821,20.071591825759615,121.32C20.256306674968656,121.32606561227685,20.333905747725627,126.20130705428781,20.51862059693466,128.06C20.64966065677283,129.37859044289004,20.84144044607757,129.92812703108058,20.965649368109705,131.43C21.213054264302883,134.421497872228,21.16527324309157,144.89777700775795,21.412678139284754,144.91000000000003C21.536887061316886,144.91613651837034,21.51848866883516,141.83894474475485,21.8597069104598,141.54000000000002C21.98344152003763,141.43159485993053,22.178165928699205,141.4169895290937,22.306735681634848,141.54000000000002C22.918464181321802,142.12527771186566,22.142035953122942,151.0647222881343,22.753764452809897,151.64999999999998C22.882334205745536,151.77301047090629,23.070555340952627,151.77599048035455,23.20079322398494,151.64999999999998C23.9161684136525,150.95795509200977,22.93244680549243,138.8620449079902,23.64782199515999,138.17000000000002C23.778059878192316,138.0440095196455,23.966281013399392,138.04698952909368,24.09485076633504,138.17000000000002C24.706579266021986,138.75527771186572,24.392869947118406,144.91,24.541879537510084,148.27999999999997C24.690889127901762,151.64999999999995,24.771472697309246,155.92646887031472,24.988908308685133,158.39C25.11493189004096,159.81783886126087,25.286927489468493,161.76,25.435937079860178,161.76C25.58494667025186,161.76,25.7569422696794,158.38447083538503,25.882965851035223,158.39C26.100401462411106,158.39953978037698,26.112559010834385,166.03646887031465,26.32999462221027,168.5C26.456018203566096,169.92783886126094,26.62801380299364,171.87,26.777023393385317,171.87C26.926032983777,171.86999999999998,27.093012104722195,168.4956969447821,27.224052164560366,168.5C27.408767013769406,168.50606561227687,27.54326805115674,172.48594534810564,27.67108093573541,175.24C27.872984723747663,179.59053217399182,27.8429556702312,192.07549202791083,28.11810970691046,192.09C28.24167836515911,192.09651537105034,28.434098418247338,190.03859044289004,28.565138478085508,188.72C28.749853327294552,186.86130705428783,28.88120833356565,184.61340296492668,29.012167249260553,181.98C29.197218847796908,178.25886787498004,29.211791124242424,168.51222299224204,29.459196020435602,168.5C29.583404942467737,168.49386348162972,29.75721520121897,171.87,29.906224791610647,171.87C30.055234382002325,171.86999999999998,30.222213502947525,168.4956969447821,30.353253562785696,168.5C30.537968411994743,168.50606561227687,30.615567484751708,175.2339343877232,30.800282333960745,175.24C30.93132239379891,175.24430305521793,30.90609286351115,172.16894474475487,31.24731110513579,171.87C31.37104571471362,171.7615948599305,31.570605266733008,171.97840514006953,31.69433987631084,171.87C32.03555811793548,171.57105525524514,32.01534506613006,169.92783886126094,32.14136864748588,168.5C32.35880425886176,166.0364688703147,32.42101791230777,158.39184459953165,32.588397418660925,158.39C32.72514547212669,158.3884929732386,32.886416599444296,165.13,33.035426189835974,165.13C33.18443578022765,165.13,33.34570690754526,158.3884929732386,33.48245496101102,158.39C33.64983446736419,158.39184459953162,33.71204812081018,166.03646887031465,33.92948373218607,168.5C34.0555073135419,169.92783886126094,34.227502912969435,170.74666666666667,34.37651250336112,171.87C34.525522093752805,172.99333333333334,34.700095795964636,175.24678242135772,34.82354127453617,175.24C35.12464077310837,175.22345679652634,34.969470547139004,155.0365432034736,35.27057004571121,155.01999999999998C35.39401552428274,155.0132175786423,35.56858922649458,158.39,35.71759881688626,158.39C35.86660840727794,158.39,36.03358752822314,156.33859044289002,36.16462758806131,155.01999999999998C36.34934243727036,153.1613070542878,36.426941510027326,148.28606561227687,36.611656359236356,148.27999999999997C36.74269641907453,148.27569694478208,36.927645070573234,151.65430305521787,37.058685130411405,151.64999999999998C37.24339997962044,151.64393438772316,37.36896584812068,144.90849297323865,37.50571390158645,144.91000000000003C37.67309340793961,144.91184459953172,37.803733082369824,151.65,37.952742672761495,155.01999999999998C38.10175226315317,158.39,38.23239193758339,165.12815540046833,38.399771443936544,165.13C38.5365194974023,165.13150702676137,38.35559788252603,158.84970267087888,38.846800215111585,158.39C38.97316371474772,158.2717398973279,39.16525923335099,158.26698952909368,39.293828986286634,158.39C39.90555748597361,158.9752777118657,39.129129257774736,167.91472228813439,39.74085775746168,168.5C39.86942751039733,168.62301047090634,40.05931677570109,168.37698952909366,40.18788652863673,168.5C40.79961502832371,169.08527771186576,40.41747968843589,176.1464688703147,40.63491529981177,178.61C40.7609388811676,180.0378388612609,40.950904011148644,180.66140955710995,41.08194407098682,181.98C41.26665892019586,183.8386929457122,41.37996325177019,186.47333333333336,41.52897284216187,188.72C41.67798243255355,190.9666666666667,41.79128676412788,195.4539343877232,41.97600161333691,195.46C42.107041673175075,195.46430305521787,42.299461726263296,193.64691470941213,42.42303038451196,192.09C42.69818442119122,188.6231713305648,42.59490511900774,175.25450797208913,42.87005915568701,175.24C42.99362781393566,175.23348462894964,43.16807833647037,177.48666666666668,43.31708792686206,178.61C43.46609751725374,179.73333333333335,43.63809311668128,181.985529164615,43.76411669803711,181.98C43.981552309413004,181.97046021962302,44.043765962858984,174.8987320470176,44.21114546921215,171.87C44.34789352267792,169.39554407093817,44.50916464999551,167.37666666666667,44.6581742403872,165.13C44.80718383077888,162.88333333333335,44.92048816235322,158.39606561227686,45.105203011562246,158.39C45.236243071400416,158.3856969447821,45.42620820138147,161.765529164615,45.552231782737294,161.76C45.76966739411318,161.750460219623,45.781824942536474,154.1135311296853,45.99926055391234,151.64999999999998C46.125284135268174,150.2221611387391,46.2972797346957,149.40333333333328,46.446289325087385,148.27999999999997C46.59529891547908,147.1566666666667,46.744308505870755,144.91000000000003,46.89331809626243,144.91000000000003C47.04232768665411,144.91000000000003,47.20930680759931,146.96140955710993,47.34034686743748,148.27999999999997C47.52506171664652,150.1386929457122,47.65062758514677,155.02150702676133,47.78737563861253,155.01999999999998C47.95475514496568,155.0181554004683,48.08539481939589,144.91,48.23440440978758,144.91000000000003C48.38341400017925,144.91,48.51405367460946,151.99126795298238,48.68143318096262,155.01999999999998C48.81818123442838,157.49445592906184,48.979452361745984,159.51333333333332,49.12846195213767,161.76C49.277471542529355,164.0066666666667,49.084288390727174,168.04029732912116,49.57549072331272,168.5C49.70185422294885,168.61826010267208,49.89394974155212,168.37698952909366,50.02251949448777,168.5C50.63424799417474,169.08527771186576,50.252112654286925,178.60046021962302,50.469548265662816,178.61C50.595571847018654,178.61552916461503,50.767567446446186,176.36333333333334,50.916577036837865,175.24C51.06558662722956,174.1166666666667,51.232565748174736,171.86569694478212,51.363605808012906,171.87C51.54832065722195,171.87606561227685,51.67388652572219,178.6115070267614,51.810634579187955,178.61C51.978014085541126,178.60815540046838,51.64593485067605,169.08527771186573,52.257663350363,168.5C52.38623310329865,168.3769895290937,52.555682531146374,168.5,52.70469212153805,168.5C52.85370171192974,168.5,53.00271130232142,168.50000000000003,53.1517208927131,168.5C53.30073048310478,168.5,53.47017991095251,168.62301047090634,53.59874966388814,168.5C54.2104781635751,167.91472228813433,53.87839892871004,161.41873204701758,54.04577843506319,158.39C54.18252648852896,155.91554407093813,54.36184829054334,154.2834029649267,54.49280720623824,151.64999999999998C54.67785880477459,147.92886787498006,54.692431081220114,141.16149787222804,54.93983597741329,138.17000000000002C55.06404489944543,136.6681270310806,55.04564650696367,135.09894474475487,55.38686474858832,134.8C55.510599358166154,134.69159485993052,55.705323766827725,134.92301047090635,55.83389351976337,134.8C56.44562201945034,134.21472228813437,56.06348667956252,127.15353112968529,56.28092229093842,124.69C56.40694587229425,123.26216113873913,56.603742140081344,121.3138634816297,56.72795106211347,121.32C56.97535595830665,121.33222299224202,56.92757493709535,134.78777700775794,57.17497983328852,134.8C57.29918875532064,134.80613651837032,57.49096854462539,132.74859044289002,57.62200860446356,131.43C57.8067234536726,129.5713070542878,57.88432252642958,126.54869294571226,58.06903737563861,124.69C58.20007743547678,123.37140955710998,58.38502608697548,121.3156969447821,58.51606614681366,121.32C58.700780996022715,121.32606561227685,58.471892585403154,127.60029732912115,58.963094917988705,128.06C59.08945841762485,128.17826010267208,59.281553936228114,127.93698952909368,59.410123689163754,128.06C60.02185218885072,128.64527771186573,59.70814286994711,134.8,59.8571524603388,138.17000000000002C60.00616205073049,141.54000000000002,60.15517164112215,148.27999999999994,60.304181231513844,148.27999999999997C60.453190821905515,148.27999999999994,60.533774391312996,138.17953978037704,60.75121000268889,138.17000000000002C60.87723358404471,138.164470835385,61.074670115615305,141.54651537105036,61.19823877386394,141.54000000000002C61.47339281054321,141.5254920279109,61.471860877574294,124.69153157078384,61.64526754503899,124.69C61.779629740338954,124.68881327969805,61.943286725822375,131.43,62.09229631621404,134.8C62.24130590660573,138.17000000000004,62.3218894760132,142.4464688703147,62.53932508738908,144.91000000000003C62.665348668744905,146.3378388612609,62.837344268172465,147.15666666666667,62.98635385856413,148.27999999999997C63.135363448955815,149.4033333333333,63.2843730393475,150.52666666666664,63.43338262973918,151.64999999999998C63.58239222013086,152.7733333333333,63.73140181052255,153.89666666666665,63.88041140091423,155.01999999999998C64.02942099130591,156.14333333333337,64.20323125005716,158.3961365183703,64.32744017208927,158.39C64.57484506828246,158.37777700775794,64.63288085855255,144.9095308782152,64.77446894326432,144.91000000000003C64.93275358119851,144.91052444223686,64.41376759838283,160.97341467650082,65.22149771443937,161.76C65.35303766366552,161.88809649096692,65.53995673267877,161.63698952909365,65.66852648561442,161.76C66.28025498530138,162.34527771186572,65.94817575043629,171.86815540046834,66.11555525678946,171.87C66.25230331025523,171.87150702676138,66.37786917875546,166.98869294571224,66.5625840279645,165.13C66.69362408780268,163.81140955710993,66.86060320874789,161.76,67.00961279913956,161.76C67.15862238953125,161.76000000000002,67.30763197992293,165.13000000000002,67.4566415703146,165.13C67.60565116070629,165.13,67.7726302816515,163.07859044289003,67.90367034148966,161.76C68.0883851906987,159.90130705428774,68.21395105919892,157.49445592906184,68.35069911266469,155.01999999999998C68.51807861901784,151.9912679529824,68.58029227246386,144.91953978037702,68.79772788383974,144.91000000000003C68.92375146519556,144.90447083538504,69.09574706462311,148.27999999999997,69.24475665501478,148.27999999999997C69.39376624540648,148.28000000000003,69.565761844834,144.904470835385,69.69178542618984,144.91000000000003C69.90922103756573,144.919539780377,69.921378585989,155.010460219623,70.13881419736488,155.01999999999998C70.2648377787207,155.02552916461497,70.43683337814824,151.64999999999998,70.58584296853992,151.64999999999998C70.7348525589316,151.64999999999998,70.88386214932329,155.01999999999998,71.03287173971498,155.01999999999998C71.18188133010666,155.01999999999998,71.3538769295342,153.07783886126086,71.47990051089002,151.64999999999998C71.69733612226592,149.1864688703147,71.70949367068921,144.00353112968534,71.92692928206507,141.54000000000002C72.0529528634209,140.1121611387391,72.22494846284845,139.29333333333338,72.37395805324012,138.17000000000002C72.52296764363182,137.0466666666667,72.69496324305933,134.79447083538506,72.82098682441516,134.8C73.03842243579106,134.80953978037704,72.65628709590325,144.32472228813435,73.26801559559021,144.91000000000003C73.39658534852587,145.03301047090636,73.59130975718743,145.01840514006955,73.71504436676526,144.91000000000003C74.05626260838993,144.61105525524522,74.03604955658449,142.96783886126093,74.16207313794031,141.54000000000002C74.3795087493162,139.07646887031476,74.39166629773949,131.43953978037703,74.60910190911535,131.43C74.73512549047119,131.42447083538505,74.92509062045222,134.8043030552179,75.0561306802904,134.8C75.24084552949944,134.7939343877232,75.3184446022564,129.91869294571222,75.50315945146545,128.06C75.63419951130362,126.74140955710996,75.82416464128467,124.68447083538503,75.95018822264049,124.69C76.1676238340164,124.699539780377,76.22983748746239,131.77126795298244,76.39721699381555,134.8C76.53396504728131,137.27445592906187,76.70749771152482,139.06554407093816,76.84424576499059,141.54000000000002C77.01162527134375,144.56873204701756,77.07383892478978,151.640460219623,77.29127453616564,151.64999999999998C77.41729811752147,151.65552916461496,77.39708506571606,148.57894474475484,77.73830330734069,148.27999999999997C77.86203791691852,148.17159485993048,78.0567623255801,148.1569895290937,78.18533207851573,148.27999999999997C78.7970605782027,148.86527771186564,78.48335125929913,155.02,78.63236084969078,158.39C78.78137044008248,161.76,78.46766112117886,167.91472228813436,79.07938962086583,168.5C79.20795937380147,168.62301047090637,79.40268378246307,168.60840514006952,79.52641839204088,168.5C79.86763663366553,168.20105525524508,79.84240710337775,165.1256969447821,79.97344716321592,165.13C80.15816201242497,165.13606561227684,80.23576108518192,171.86393438772316,80.42047593439096,171.87C80.55151599422913,171.8743030552179,80.5262864639414,168.79894474475492,80.86750470556602,168.5C80.99123931514386,168.3915948599305,81.1655238863494,168.5,81.31453347674106,168.5C81.46354306713275,168.50000000000003,81.63782763833828,168.60840514006952,81.7615622479161,168.5C82.10278048954073,168.20105525524517,82.07755095925297,165.1256969447821,82.20859101909114,165.13C82.39330586830017,165.13606561227684,82.50661019987453,171.87,82.6556197902662,171.87C82.80462938065789,171.87,82.6114462288557,165.58970267087886,83.10264856144124,165.13C83.22901206107738,165.01173989732789,83.40066774222461,165.13,83.5496773326163,165.13C83.69868692300798,165.13,83.87297149421352,165.02159485993053,83.99670610379134,165.13C84.337924345416,165.42894474475486,84.29472528457472,167.37666666666667,84.4437348749664,168.5C84.5927444653581,169.62333333333336,84.75972358630327,171.8743030552179,84.89076364614144,171.87C85.07547849535048,171.86393438772316,85.15307756810748,166.9886929457122,85.33779241731649,165.13C85.46883247715465,163.81140955710995,85.6606122664594,161.75386348162968,85.78482118849153,161.76C86.03222608468471,161.77222299224204,86.04679836113023,175.23693919668935,86.23184995966659,175.24C86.36280887536147,175.24216609575862,86.52986914044993,170.74666666666667,86.67887873084162,168.5C86.82788832123332,166.25333333333336,86.94119265280763,161.76606561227683,87.12590750201667,161.76C87.25694756185484,161.75569694478207,87.42392668280006,165.13000000000002,87.57293627319171,165.13C87.72194586358341,165.13000000000002,87.88892498452859,163.07859044289,88.01996504436676,161.76C88.2046798935758,159.90130705428777,88.2822789663328,156.8786929457122,88.46699381554181,155.01999999999998C88.59803387537997,153.70140955710994,88.57280434509221,151.9489447447548,88.91402258671685,151.64999999999998C89.0377571962947,151.5415948599305,89.21204176750022,151.64999999999998,89.36105135789191,151.64999999999998C89.5100609482836,151.64999999999998,89.6795103761313,151.77301047090629,89.80808012906695,151.64999999999998C90.4198086287539,151.06472228813428,90.08772939388888,144.56873204701762,90.255108900242,141.54000000000002C90.39185695370776,139.06554407093816,90.51742282220799,134.80606561227685,90.70213767141703,134.8C90.83317773125522,134.79569694478212,90.80794820096749,137.8710552552452,91.14916644259209,138.17000000000002C91.27290105216991,138.2784051400695,91.47246060418932,138.2784051400695,91.59619521376713,138.17000000000002C91.9374134553918,137.87105525524518,91.91218392510402,136.11859044289002,92.04322398494219,134.8C92.22793883415122,132.94130705428776,92.34124316572556,128.06,92.49025275611723,128.06C92.63926234650891,128.06,92.44607919470673,134.34029732912114,92.93728152729228,134.8C93.06364502692843,134.9182601026721,93.2557405455317,134.92301047090638,93.38431029846733,134.8C93.99603879815427,134.21472228813434,93.21961056995545,125.27527771186564,93.83133906964238,124.69C93.95990882257804,124.56698952909369,94.14979808788179,124.56698952909369,94.27836784081742,124.69C94.89009634050436,125.27527771186566,94.58564038397252,134.80077128684863,94.72539661199248,134.8C94.88673875144138,134.799109584796,95.01108324371863,121.320890415204,95.17242538316751,121.32C95.3121816111875,121.31922871315139,95.40201854296669,128.9664688703147,95.61945415434258,131.43C95.74547773569843,132.85783886126092,95.91747333512593,133.67666666666668,96.0664829255176,134.8C96.21549251590928,135.92333333333335,96.38247163685449,136.85140955710997,96.51351169669266,138.17000000000002C96.69822654590172,140.02869294571227,96.77582561865863,143.05130705428778,96.9605404678677,144.91000000000003C97.09158052770584,146.22859044288998,97.25855964865106,147.15666666666667,97.40756923904276,148.27999999999997C97.55657882943446,149.4033333333333,97.72857442886198,150.2221611387391,97.8545980102178,151.64999999999998C98.07203362159369,154.1135311296853,98.1342472750397,158.73126795298242,98.30162678139286,161.76C98.4383748348586,164.23445592906185,98.61769663687299,168.50216609575867,98.7486555525679,168.5C98.93370715110424,168.4969391966893,99.03434218429403,155.02089041520395,99.19568432374295,155.01999999999998C99.3354405517629,155.01922871315136,99.50835089961801,165.1311867203019,99.642713094918,165.13C99.81611976238271,165.1284684292162,99.91633519862836,148.2815315707838,100.08974186609305,148.27999999999997C100.22410406139302,148.27881327969806,100.3693911309149,158.38815540046832,100.53677063726808,158.39C100.67351869073384,158.39150702676133,100.49259707585756,152.10970267087885,100.98379940844312,151.64999999999998C101.11016290807926,151.53173989732787,101.30059029658585,151.77599048035452,101.43082817961817,151.64999999999998C102.14620336928574,150.9579550920098,101.16248176112563,138.86204490799025,101.87785695079322,138.17000000000002C102.00809483382555,138.04400951964547,102.19852222233212,138.28826010267207,102.32488572196827,138.17000000000002C102.81608805455383,137.71029732912112,102.58719964393428,131.43606561227688,102.77191449314331,131.43C102.90295455298148,131.42569694478212,103.09473434228622,133.29812703108053,103.21894326431837,134.8C103.46634816051156,137.79149787222806,102.95059684582583,147.58795509200976,103.66597203549341,148.27999999999997C103.79620991852575,148.40599048035455,103.98663730703234,148.1617398973279,104.11300080666847,148.27999999999997C104.60420313925401,148.73970267087884,104.42328152437773,155.02150702676133,104.5600295778435,155.01999999999998C104.72740908419667,155.01815540046832,104.78962273764269,147.37353112968535,105.00705834901855,144.91000000000003C105.13308193037437,143.48216113873914,105.32806353883777,142.96783886126093,105.45408712019359,141.54000000000002C105.6715227315695,139.07646887031476,105.73373638501548,131.43184459953167,105.90111589136865,131.43C106.03786394483441,131.42849297323863,105.85694232995813,137.7102973291211,106.34814466254369,138.17000000000002C106.47450816217983,138.28826010267207,106.67143882414095,138.27840514006954,106.79517343371874,138.17000000000002C107.13639167534339,137.87105525524515,107.09319261450212,134.8,107.24220220489379,134.8C107.39121179528549,134.80000000000004,107.54022138567717,137.04666666666668,107.68923097606884,138.17000000000002C107.83824056646053,139.29333333333335,107.9872501568522,140.41666666666669,108.13625974724388,141.54000000000002C108.28526933763558,142.66333333333338,108.24207027679432,144.61105525524522,108.58328851841894,144.91000000000003C108.70702312799678,145.01840514006952,108.90658268001613,144.8015948599305,109.03031728959397,144.91000000000003C109.37153553121856,145.20894474475486,109.35132247941323,146.85216113873912,109.47734606076904,148.27999999999997C109.69478167214494,150.7435311296853,109.7753652415524,155.01999999999998,109.92437483194406,158.39C110.07338442233575,161.75999999999996,109.75967510343216,167.91472228813433,110.37140360311912,168.5C110.49997335605477,168.62301047090634,110.69469776471632,168.6084051400695,110.81843237429416,168.5C111.15965061591882,168.20105525524522,110.92424290384461,165.4289447447549,111.26546114546922,165.13C111.38919575504707,165.0215948599305,111.58392016370863,165.25301047090633,111.71248991664426,165.13C112.3242184163312,164.54472228813427,112.01050909742762,158.39,112.15951868781931,155.01999999999998C112.308528278211,151.65,112.45753786860267,148.28000000000003,112.60654745899436,144.91000000000003C112.75555704938603,141.54000000000002,112.44184773048246,135.38527771186568,113.05357623016941,134.8C113.18214598310506,134.67698952909373,113.37424150170834,134.68173989732796,113.50060500134445,134.8C113.99180733393001,135.2597026708789,113.76291892331044,141.5339343877232,113.94763377251948,141.54000000000002C114.07867383235765,141.5443030552179,114.26863896233873,139.5978388612609,114.39466254369454,138.17000000000002C114.61209815507044,135.70646887031475,114.6743118085164,128.06184459953164,114.84169131486958,128.06C114.97843936833534,128.05849297323866,115.13971049565295,134.8,115.28872008604463,134.8C115.4377296764363,134.8,115.59900080375392,128.05849297323866,115.73574885721968,128.06C115.90312836357282,128.06184459953164,116.01539812204156,135.1412679529824,116.18277762839473,138.17000000000002C116.3195256818605,140.64445592906188,116.48079680917809,142.6633333333334,116.62980639956977,144.91000000000003C116.77881598996147,147.1566666666667,116.89212032153578,151.64393438772316,117.07683517074483,151.64999999999998C117.20787523058301,151.65430305521792,117.18264570029521,148.5789447447548,117.52386394191987,148.27999999999997C117.64759855149774,148.1715948599305,117.84715810351707,148.38840514006947,117.97089271309493,148.27999999999997C118.31211095471956,147.98105525524514,118.29371256223781,146.4118729689194,118.41792148426995,144.91000000000003C118.66532638046311,141.91850212777206,118.71594066505332,131.43,118.86495025544501,131.43C119.0139598458367,131.43,118.5966038369525,144.21795509200982,119.31197902662005,144.91000000000003C119.44221690965237,145.03599048035457,119.63043804485945,144.78698952909372,119.7590077977951,144.91000000000003C120.37073629748207,145.49527771186575,120.03865706261696,155.0181554004683,120.20603656897015,155.01999999999998C120.34278462243591,155.02150702676133,120.51631728667945,150.75445592906186,120.6530653401452,148.27999999999997C120.82044484649833,145.25126795298237,120.88265849994438,140.6335311296853,121.10009411132025,138.17000000000002C121.22611769267604,136.7421611387391,121.42109930113948,134.79447083538503,121.5471228824953,134.8C121.7645584938712,134.80953978037704,121.84514206327864,141.54000000000002,121.99415165367034,144.91000000000003C122.14316124406203,148.28000000000003,121.82945192515845,154.4347222881343,122.4411804248454,155.01999999999998C122.56975017778105,155.1430104709063,122.75561838073719,154.89030813576704,122.88820919602043,155.01999999999998C123.7800540976,155.89234570241834,123.11725689853282,175.23519021952075,123.3352379671955,175.24C123.46121218192263,175.24277963734468,123.5975518891615,170.35869294571225,123.78226673837052,168.5C123.91330679820871,167.18140955711,124.09825544970742,165.12569694478208,124.22929550954558,165.13C124.41401035875462,165.1360656122768,124.18512194813503,171.41029732912114,124.67632428072062,171.87C124.80268778035675,171.9882601026721,124.99698955225954,171.7517398973279,125.12335305189568,171.87C125.61455538448125,172.32970267087893,125.38566697386169,176.75130705428776,125.57038182307072,178.61C125.70142188290887,179.92859044289003,125.86840100385409,180.85666666666668,126.01741059424577,181.98C126.16642018463747,183.10333333333335,126.33841578406499,185.35552916461495,126.46443936542082,185.35C126.6818749767967,185.34046021962303,126.69403252521997,175.24953978037698,126.91146813659587,175.24C127.03749171795171,175.23447083538503,127.20948731737921,178.60999999999999,127.35849690777091,178.61C127.50750649816258,178.61,127.67448561910776,176.55859044289005,127.80552567894594,175.24C127.99024052815497,173.3813070542878,128.06783960091198,168.50606561227687,128.252554450121,168.5C128.38359450995918,168.4956969447821,128.5505736309044,170.7466666666667,128.69958322129605,171.87C128.84859281168775,172.99333333333337,128.8053937508465,174.94105525524517,129.1466119924711,175.24C129.27034660204893,175.34840514006953,129.46990615406833,175.34840514006953,129.59364076364614,175.24C129.9348590052708,174.94105525524517,129.69945129319655,172.16894474475487,130.04066953482118,171.87C130.16440414439901,171.76159485993054,130.36133480636008,171.75173989732795,130.48769830599622,171.87C130.97890063858176,172.32970267087887,130.7500122279623,178.6039343877232,130.9347270771713,178.61C131.0657671370095,178.6143030552179,131.25573226699052,176.66783886126095,131.38175584834633,175.24C131.59919145972222,172.77646887031474,131.6113490081455,167.59353112968535,131.82878461952137,165.13C131.9548082008772,163.70216113873911,132.12680380030474,161.76000000000002,132.2758133906964,161.76C132.4248229810881,161.76000000000002,132.59180210203328,163.81140955710995,132.72284216187148,165.13C132.90755701108054,166.98869294571224,132.9851560838375,171.86393438772316,133.16987093304652,171.87C133.3009109928847,171.8743030552179,133.27568146259694,168.79894474475486,133.61689970422157,168.5C133.7406343137994,168.39159485993054,133.935358722461,168.37698952909372,134.0639284753966,168.5C134.6756569750836,169.0852777118657,134.29352163519582,178.60046021962307,134.51095724657168,178.61C134.63698082792752,178.615529164615,134.82694595790852,176.55859044289008,134.9579860177467,175.24C135.1427008669557,173.38130705428776,135.25600519853006,170.74666666666667,135.40501478892176,168.5C135.55402437931346,166.25333333333336,135.7030339697051,161.76,135.8520435600968,161.76C136.00105315048847,161.76,135.80786999868633,168.04029732912116,136.29907233127184,168.5C136.425435830908,168.61826010267208,136.59709151205521,168.5,136.7461011024469,168.5C136.89511069283856,168.5,137.06456012068634,168.6230104709063,137.19312987362196,168.5C137.80485837330892,167.91472228813427,137.42272303342114,160.85353112968534,137.640158644797,158.39C137.7661822261528,156.96216113873913,137.95614735613384,155.0156969447821,138.08718741597204,155.01999999999998C138.2719022651811,155.02606561227682,138.34950133793805,161.75393438772318,138.53421618714708,161.76C138.66525624698525,161.76430305521788,138.64002671669758,158.6889447447549,138.98124495832215,158.39C139.10497956789996,158.2815948599305,139.30453911991933,158.49840514006948,139.42827372949716,158.39C139.76949197112185,158.09105525524518,139.7510935786401,155.0138634816297,139.87530250067223,155.01999999999998C140.12270739686542,155.03222299224205,140.1372796733109,168.4969391966893,140.32233127184728,168.5C140.45329018754217,168.50216609575864,140.27815771043677,162.2197026708789,140.76936004302232,161.76C140.89572354265843,161.6417398973279,141.0878190612617,161.63698952909368,141.21638881419736,161.76C141.82811731388432,162.34527771186566,141.44598197399648,171.86046021962298,141.6634175853724,171.87C141.78944116672824,171.875529164615,141.9794062967093,169.81859044289,142.11044635654747,168.5C142.29516120575653,166.6413070542878,142.066272795137,162.2197026708789,142.5574751277225,161.76C142.68383862735863,161.6417398973279,142.88076928931974,161.65159485993053,143.00450389889755,161.76C143.3457221405222,162.05894474475485,143.11031442844796,164.8310552552452,143.4515326700726,165.13C143.57526727965043,165.2384051400695,143.7721979416115,165.24826010267205,143.89856144124764,165.13C144.38976377383324,164.67029732912113,144.16087536321365,160.24869294571226,144.34559021242268,158.39C144.47663027226082,157.07140955710997,144.64360939320608,155.02,144.79261898359775,155.01999999999998C144.94162857398945,155.02,145.10860769493462,158.39430305521788,145.2396477547728,158.39C145.42436260398185,158.38393438772317,145.53766693555616,153.89666666666668,145.68667652594783,151.64999999999998C145.83568611633953,149.4033333333333,145.9489904479138,144.91606561227684,146.13370529712287,144.91000000000003C146.26474535696104,144.90569694478214,146.4565251462658,146.77812703108052,146.58073406829794,148.27999999999997C146.82813896449113,151.27149787222797,146.7803579432798,161.74777700775797,147.02776283947298,161.76C147.1519717615051,161.7661365183703,147.34375155080983,159.70859044289,147.47479161064803,158.39C147.65950645985708,156.5313070542878,147.737105532614,153.5086929457122,147.92182038182307,151.64999999999998C148.05286044166124,150.33140955710994,148.24282557164233,148.27447083538502,148.36884915299814,148.27999999999997C148.58628476437406,148.28953978037697,148.66686833378148,155.01999999999998,148.81587792417315,158.39C148.96488751456482,161.75999999999996,148.65117819566123,167.91472228813433,149.26290669534822,168.5C149.3914764482839,168.62301047090634,149.58620085694542,168.39159485993054,149.70993546652326,168.5C150.0511537081479,168.79894474475486,149.81574599607367,171.57105525524517,150.1569642376983,171.87C150.2806988472761,171.97840514006953,150.4802583992955,171.7615948599305,150.60399300887335,171.87C150.94521125049795,172.16894474475484,150.90201218965674,175.24000000000004,151.05102178004842,175.24C151.20003137044014,175.24000000000004,151.36701049138532,171.86569694478212,151.49805055122346,171.87C151.68276540043252,171.87606561227685,151.453876989813,178.15029732912114,151.9450793223985,178.61C152.0714428220346,178.7282601026721,152.26837348399573,178.50159485993055,152.39210809357354,178.61C152.7333263351982,178.90894474475493,152.7080968049104,181.98430305521788,152.8391368647486,181.98C153.02385171395764,181.97393438772315,153.13715604553192,177.48666666666665,153.28616563592362,175.24C153.43517522631532,172.99333333333337,153.5964463536329,170.97445592906186,153.73319440709867,168.5C153.90057391345184,165.47126795298243,153.5684946785868,158.97527771186566,154.18022317827374,158.39C154.30879293120938,158.26698952909368,154.50088844981263,158.50826010267207,154.62725194944878,158.39C155.11845428203438,157.93029732912112,154.58307838803827,152.10970267087893,155.07428072062382,151.64999999999998C155.20064422025993,151.53173989732787,155.3927397388632,151.77301047090629,155.52130949179886,151.64999999999998C156.13303799148582,151.06472228813428,155.82858203495397,145.15236848356204,155.96833826297393,141.54000000000002C156.12968040242285,137.36968667748857,155.69999184448145,128.75204490799018,156.41536703414897,128.06C156.54560491718127,127.93400951964543,156.73603230568787,127.94173989732789,156.862395805324,128.06C157.35359813790961,128.51970267087893,156.81822224391357,134.34029732912117,157.30942457649905,134.8C157.43578807613517,134.9182601026721,157.60744375728245,134.80000000000007,157.7564533476741,134.8C157.9054629380658,134.8,158.07324423581684,134.67400951964547,158.20348211884914,134.8C158.91885730851672,135.49204490799022,158.46545929148783,148.27693919668928,158.6505108900242,148.27999999999997C158.78146980571913,148.28216609575867,158.96079160773346,141.53849297323862,159.09753966119925,141.54000000000002C159.26491916755245,141.54184459953171,159.37718892602115,151.64815540046834,159.5445684323743,151.64999999999998C159.68131648584003,151.65150702676132,159.84258761315763,144.91000000000003,159.99159720354933,144.91000000000003C160.14060679394103,144.91000000000005,159.9474236421388,151.19029732912108,160.4386259747244,151.64999999999998C160.56498947436054,151.76826010267206,160.76192013632163,151.75840514006947,160.88565474589944,151.64999999999998C161.22687298752408,151.35105525524511,161.18367392668281,149.4033333333333,161.33268351707449,148.27999999999997C161.48169310746616,147.15666666666667,161.4384940466249,145.20894474475486,161.77971228824953,144.91000000000003C161.90344689782737,144.80159485993053,162.1003775597884,145.0282601026721,162.22674105942457,144.91000000000003C162.71794339201017,144.45029732912118,162.53702177713384,140.6444559290619,162.6737698305996,138.17000000000002C162.84114933695278,135.14126795298242,162.90336299039882,128.06953978037703,163.12079860177468,128.06C163.24682218313052,128.05447083538502,163.43678731311155,131.43430305521787,163.56782737294972,131.43C163.75254222215878,131.42393438772316,163.83014129491576,124.69606561227684,164.01485614412476,124.69C164.1458962039629,124.68569694478208,164.33084485546166,128.06430305521792,164.4618849152998,128.06C164.64659976450886,128.0539343877232,164.72419883726587,123.17869294571224,164.90891368647488,121.32C165.03995374631307,120.00140955710997,165.22991887629408,117.94447083538502,165.35594245764992,117.94999999999999C165.5733780690258,117.959539780377,165.65396163843332,128.06,165.80297122882496,128.06C165.95198081921666,128.06,166.10099040960836,117.95,166.25,117.94999999999999C166.39900959039167,117.95,166.5296492648219,125.0312679529824,166.69702877117504,128.06C166.83377682464078,130.5344559290619,167.00730948888432,132.32554407093815,167.14405754235008,134.8C167.31143704870323,137.82873204701758,167.37365070214932,142.44646887031476,167.59108631352515,144.91000000000003C167.717109894881,146.3378388612609,167.90707502486202,148.28430305521786,168.0381150847002,148.27999999999997C168.22282993390925,148.2739343877232,168.34839580240947,144.0144559290619,168.48514385587524,141.54000000000002C168.6525233622284,138.51126795298245,168.7647931206971,131.43184459953167,168.93217262705028,131.43C169.06892068051602,131.42849297323863,169.19448654901637,136.3113070542878,169.37920139822535,138.17000000000002C169.51024145806352,139.48859044289006,169.70020658804458,141.54552916461503,169.8262301694004,141.54000000000002C170.04366578077628,141.53046021962308,170.05582332919965,131.43953978037703,170.27325894057543,131.43C170.39928252193127,131.42447083538505,170.59426413039458,134.80552916461497,170.72028771175044,134.8C170.9377233231263,134.79046021962304,170.94988087154962,127.15353112968529,171.16731648292554,124.69C171.29334006428132,123.26216113873909,171.27312701247595,121.61894474475483,171.61434525410056,121.32C171.7380798636784,121.21159485993051,171.93501052563946,121.43826010267207,172.0613740252756,121.32C172.55257635786117,120.86029732912114,172.32368794724164,116.43869294571223,172.50840279645064,114.57999999999998C172.6394428562888,113.26140955710993,172.82439150778754,111.20569694478206,172.9554315676257,111.20999999999998C173.14014641683477,111.21606561227682,173.25345074840908,117.94999999999997,173.40246033880075,117.94999999999999C173.55146992919242,117.94999999999997,173.66477426076673,113.06869294571221,173.8494891099758,111.20999999999998C173.98052916981396,109.89140955710995,174.17049429979502,107.834470835385,174.29651788115083,107.83999999999997C174.51395349252675,107.84953978037697,174.52611104095004,115.4864688703147,174.7435466523259,117.94999999999999C174.86957023368174,119.3778388612609,175.0415658331093,121.32000000000002,175.19057542350095,121.32C175.33958501389264,121.32000000000002,175.29638595305138,118.24894474475485,175.637604194676,117.94999999999999C175.76133880425382,117.84159485993051,175.9582694662149,118.0682601026721,176.08463296585103,117.94999999999999C176.57583529843657,117.49029732912109,176.39491368356033,111.20849297323862,176.5316617370261,111.20999999999998C176.69904124337927,111.21184459953163,176.84432831290115,117.52128506903641,176.97869050820114,121.32C177.15209717566586,126.22258807811349,177.25231261191144,133.26741192188652,177.42571927937618,138.17000000000002C177.56008147467614,141.96871493096353,177.70536854419802,145.2512679529824,177.87274805055122,148.27999999999997C178.009496104017,150.7544559290618,178.1707672313346,152.7733333333333,178.3197768217263,155.01999999999998C178.468786412118,157.26666666666665,178.63005753943557,161.76150702676136,178.76680559290133,161.76C178.93418509925448,161.75815540046835,178.9963987527006,154.11353112968536,179.21383436407638,151.64999999999998C179.3398579454322,150.2221611387391,179.53665421321926,148.27386348162966,179.6608631352514,148.27999999999997C179.90826803144452,148.29222299224202,179.86048701023324,161.74777700775795,180.10789190642643,161.76C180.2321008284586,161.76613651837027,180.43071175556938,158.38386348162967,180.55492067760153,158.39C180.80232557379472,158.40222299224203,180.75454455258338,171.85777700775796,181.00194944877654,171.87C181.12615837080867,171.87613651837032,181.31793816011339,169.81859044289,181.44897821995158,168.5C181.63369306916064,166.64130705428778,181.7112921419176,163.61869294571224,181.89600699112663,161.76C182.0270470509648,160.44140955710995,182.19402617191005,159.51333333333335,182.3430357623017,158.39C182.49204535269342,157.26666666666668,182.65902447363857,155.0156969447821,182.79006453347674,155.01999999999998C182.9747793826858,155.02606561227682,183.1061343889569,159.12659703507333,183.23709330465178,161.76C183.4221449031881,165.4811321250199,183.4367171796336,172.24850212777193,183.68412207582682,175.24C183.80833099785897,176.74187296891947,183.98214125661025,178.61000000000004,184.1311508470019,178.61C184.2801604373936,178.61000000000004,184.4291700277853,175.24,184.57817961817693,175.24C184.72718920856866,175.24000000000004,184.89918480799616,178.61552916461497,185.02520838935197,178.61C185.24264400072786,178.60046021962305,185.30485765417387,168.50184459953167,185.47223716052702,168.5C185.60898521399278,168.49849297323863,185.73455108249308,173.3813070542878,185.91926593170209,175.24C186.05030599154028,176.55859044289005,186.21728511248548,178.61000000000004,186.36629470287713,178.61C186.51530429326883,178.61000000000004,186.682283414214,175.23569694478212,186.81332347405217,175.24C186.9980383232612,175.24606561227682,186.76914991264164,181.52029732912112,187.2603522452272,181.98C187.38671574486335,182.09826010267207,187.57584106717616,182.10809649096691,187.70738101640228,181.98C188.51511113245886,181.1934146765008,187.95250599956506,165.1340087277007,188.15440978757732,165.13C188.28222267215602,165.127462320762,188.11023622616673,171.41029732912108,188.60143855875236,171.87C188.72780205838845,171.98826010267203,188.92473272034957,171.76159485993048,189.04846732992738,171.87C189.38968557155204,172.16894474475487,189.3644560412643,175.2443030552179,189.49549610110247,175.24C189.68021095031153,175.2339343877232,189.79351528188576,170.74666666666664,189.9425248722775,168.5C190.09153446266916,166.25333333333333,190.20483879424353,163.6186929457122,190.38955364345253,161.76C190.52059370329067,160.44140955710995,190.6875728242359,159.51333333333335,190.83658241462757,158.39C190.9855920050193,157.26666666666668,191.15257112596447,156.33859044289002,191.28361118580264,155.01999999999998C191.4683260350117,153.16130705428776,191.54592510776862,150.1386929457122,191.73063995697768,148.27999999999997C191.8616800168158,146.96140955710993,192.02865913776105,144.91000000000003,192.17766872815272,144.91000000000003C192.3266783185444,144.91000000000003,192.49365743948962,148.28430305521786,192.62469749932777,148.27999999999997C192.80941234853682,148.2739343877232,192.92271668011114,143.78666666666672,193.0717262705028,141.54000000000002C193.22073586089454,139.29333333333338,193.02755270909233,135.25970267087888,193.51875504167788,134.8C193.64511854131405,134.68173989732793,193.83942031321678,134.9182601026721,193.96578381285292,134.8C194.45698614543855,134.34029732912117,194.22809773481893,128.06606561227684,194.41281258402796,128.06C194.5438526438661,128.05569694478208,194.71083176481133,130.3066666666667,194.859841355203,131.43C195.00885094559473,132.55333333333337,195.15786053598643,133.6766666666667,195.30687012637807,134.8C195.4558797167698,135.92333333333337,195.62787531619733,138.175529164615,195.7538988975531,138.17000000000002C195.971334508929,138.16046021962308,195.5891991690412,128.64527771186567,196.20092766872816,128.06C196.32949742166383,127.9369895290937,196.49894684951153,128.06,196.6479564399032,128.06C196.79696603029487,128.06,196.9686217114421,127.94173989732789,197.09498521107827,128.06C197.58618754366387,128.51970267087893,197.0508116496677,134.34029732912109,197.5420139822533,134.8C197.66837748188942,134.91826010267206,197.86267925379215,134.6817398973279,197.98904275342832,134.8C198.4802450860138,135.25970267087885,198.2513566753943,139.6813070542878,198.43607152460336,141.54000000000002C198.56711158444156,142.85859044289006,198.7520602359403,143.59140955711,198.88310029577846,144.91000000000003C199.0678151449875,146.76869294571222,199.14541421774445,151.64393438772314,199.33012906695348,151.64999999999998C199.4611691267917,151.6543030552179,199.62814824773682,149.4033333333333,199.77715783812852,148.27999999999997C199.9261674285202,147.15666666666667,200.10074113073208,144.90321757864237,200.22418660930356,144.91000000000003C200.5252861078758,144.92654320347367,200.45323431181592,165.12519021952068,200.67121538047863,165.13C200.7971895952058,165.13277963734467,200.62704181906815,158.84970267087888,201.11824415165367,158.39C201.2446076512898,158.27173989732788,201.41626333243704,158.39000000000001,201.5652729228287,158.39C201.71428251322044,158.39000000000001,201.8885670844259,158.28159485993046,202.01230169400375,158.39C202.35351993562836,158.68894474475485,202.31032087478715,161.76000000000002,202.45933046517882,161.76C202.60834005557058,161.76000000000002,202.7821503143217,158.38386348162967,202.90635923635386,158.39C203.15376413254705,158.40222299224203,203.19204586808002,171.869109584796,203.3533880075289,171.87C203.4931442355489,171.87077128684865,203.58298116732806,164.22353112968528,203.80041677870395,161.76C203.92644036005976,160.33216113873908,204.0984359594874,159.51333333333335,204.24744554987902,158.39C204.39645514027075,157.26666666666668,204.54546473066245,156.14333333333335,204.69447432105406,155.01999999999998C204.8434839114458,153.89666666666668,205.01046303239093,151.6456969447821,205.1415030922291,151.64999999999998C205.32621794143816,151.65606561227685,205.09732953081854,157.93029732912106,205.58853186340414,158.39C205.71489536304023,158.50826010267207,205.909197134943,158.50826010267207,206.03556063457916,158.39C206.52676296716473,157.93029732912112,206.29787455654528,151.65606561227685,206.48258940575425,151.64999999999998C206.61362946559242,151.64569694478212,206.8035945955735,155.02552916461497,206.9296181769293,155.01999999999998C207.14705378830513,155.01046021962298,207.2092674417511,147.93873204701757,207.3766469481043,144.91000000000003C207.51339500157005,142.43554407093814,207.63896087007032,138.17606561227686,207.82367571927935,138.17000000000002C207.9547157791175,138.1656969447821,207.92948624882973,141.24105525524516,208.27070449045442,141.54000000000002C208.39443910003226,141.6484051400695,208.58916350869382,141.41698952909368,208.71773326162946,141.54000000000002C209.32946176131642,142.12527771186572,208.94732642142864,151.640460219623,209.1647620328045,151.64999999999998C209.29078561416034,151.65552916461496,209.46278121358787,148.28,209.61179080397955,148.27999999999997C209.7608003943713,148.28000000000003,209.92777951531642,150.33140955710994,210.05881957515462,151.64999999999998C210.24353442436367,153.5086929457122,210.35683875593799,158.39,210.50584834632966,158.39C210.65485793672136,158.39,210.76816226829567,153.50869294571223,210.9528771175047,151.64999999999998C211.08391717734284,150.33140955710996,211.05868764705514,148.5789447447549,211.39990588867974,148.27999999999997C211.52364049825763,148.1715948599305,211.723200050277,148.1715948599305,211.8469346598548,148.27999999999997C212.18815290147953,148.57894474475486,212.14495384063818,151.65,212.29396343102985,151.64999999999998C212.44297302142155,151.65,212.59198261181322,149.4033333333333,212.7409922022049,148.27999999999997C212.89000179259656,147.15666666666667,213.03901138298826,144.91000000000005,213.18802097337993,144.91000000000003C213.33703056377163,144.91000000000003,213.29383150293037,147.98105525524514,213.635049744555,148.27999999999997C213.75878435413287,148.3884051400695,213.95350876279437,148.40301047090628,214.08207851573005,148.27999999999997C214.69380701541695,147.69472228813424,213.91737878721815,138.7552777118657,214.5291072869051,138.17000000000002C214.6576770398407,138.04698952909368,214.84977255844402,138.05173989732796,214.97613605808013,138.17000000000002C215.4673383906657,138.6297026708789,215.28641677578943,144.9115070267614,215.4231648292552,144.91000000000003C215.5905443356084,144.9081554004684,215.65275798905438,134.80953978037704,215.87019360043024,134.8C215.99621718178608,134.79447083538506,215.97600412998062,137.87105525524515,216.31722237160528,138.17000000000002C216.4409569811831,138.2784051400695,216.6378876431442,138.28826010267213,216.7642511427803,138.17000000000002C217.25545347536584,137.71029732912112,217.0265650647464,131.43606561227688,217.2112799139554,131.43C217.3423199737936,131.42569694478212,217.5322851037746,134.805529164615,217.6583086851304,134.8C217.87574429650635,134.79046021962307,217.93795794995228,124.69184459953166,218.10533745630545,124.69C218.2420855097712,124.68849297323862,218.3676513782715,129.5713070542878,218.5523662274805,131.43C218.68340628731863,132.74859044289002,218.87337141729972,133.37216113873916,218.99939499865553,134.8C219.21683061003145,137.26353112968536,219.2289881584548,142.44646887031476,219.4464237698306,144.91000000000003C219.57244735118644,146.3378388612609,219.76742895964983,146.85216113873915,219.89345254100564,148.27999999999997C220.11088815238156,150.74353112968527,220.12304570080485,158.38046021962302,220.34048131218069,158.39C220.46650489353652,158.395529164615,220.63850049296406,156.14333333333332,220.78751008335573,155.01999999999998C220.93651967374745,153.89666666666665,221.11032993249867,151.6438634816297,221.2345388545308,151.64999999999998C221.48194375072396,151.662222992242,221.4965160271695,161.40886787498007,221.68156762570584,165.13C221.81252654140073,167.76340296492668,221.63739406429536,171.41029732912116,222.12859639688088,171.87C222.254959896517,171.98826010267206,222.42661557766425,171.87,222.57562516805592,171.87C222.7246347584476,171.87,222.8736443488393,171.87,223.022653939231,171.87C223.1716635296227,171.87,223.34111295747041,171.99301047090634,223.46968271040603,171.87C224.08141121009302,171.28472228813433,223.69927587020527,161.769539780377,223.91671148158107,161.76C224.0427350629369,161.75447083538504,224.21473066236447,165.13000000000002,224.36374025275612,165.13C224.51274984314784,165.13000000000002,224.68474544257532,161.754470835385,224.8107690239312,161.76C225.0282046353071,161.769539780377,225.10878820471453,171.87000000000003,225.25779779510623,171.87C225.40680738549793,171.87000000000003,225.48739095490538,164.22353112968528,225.70482656628124,161.76C225.8308501476371,160.3321611387391,225.81063709583162,158.68894474475485,226.15185533745628,158.39C226.27558994703415,158.2815948599305,226.47252060899524,158.50826010267207,226.59888410863138,158.39C227.09008644121695,157.93029732912103,226.86119803059734,153.5086929457122,227.0459128798064,151.64999999999998C227.1769529396445,150.3314095571099,227.34393206058974,149.4033333333333,227.49294165098144,148.27999999999997C227.6419512413731,147.15666666666667,227.59875218053182,145.20894474475492,227.93997042215648,144.91000000000003C228.0637050317343,144.80159485993053,228.23798960293985,144.91000000000003,228.38699919333155,144.91000000000003C228.53600878372322,144.91000000000003,228.68501837411492,144.91000000000003,228.8340279645066,144.91000000000003C228.98303755489832,144.91000000000005,229.15469323604546,145.0282601026721,229.28105673568163,144.91000000000003C229.7722590682672,144.45029732912118,229.60027262227803,138.167462320762,229.72808550685667,138.17000000000002C229.92998929486893,138.17400872770074,229.3673841619752,154.23341467650084,230.17511427803174,155.01999999999998C230.3066542272579,155.14809649096688,230.49840843962897,155.1284051400695,230.62214304920678,155.01999999999998C230.96336129083147,154.72105525524515,230.94560316213318,151.64348462894964,231.06917182038183,151.64999999999998C231.34432585706108,151.6645079720891,231.24104655487756,168.48549202791088,231.51620059155687,168.5C231.63976924980557,168.50651537105034,231.81421977234027,165.13000000000002,231.9632293627319,165.13C232.11223895312364,165.13000000000002,232.06903989228232,168.2010552552451,232.41025813390698,168.5C232.53399274348482,168.6084051400695,232.7082773146904,168.5,232.85728690508202,168.5C233.00629649547372,168.50000000000003,233.17795217662098,168.6182601026721,233.30431567625706,168.5C233.79551800884263,168.04029732912113,233.61459639396625,164.23445592906182,233.75134444743207,161.76C233.91872395378525,158.7312679529824,233.58664471892027,152.23527771186568,234.19837321860717,151.64999999999998C234.32694297154282,151.52698952909367,234.52166738020438,151.54159485993048,234.64540198978221,151.64999999999998C234.98662023140685,151.9489447447548,234.75121251933257,154.72105525524512,235.09243076095723,155.01999999999998C235.2161653705351,155.12840514006948,235.40922164909998,155.14599048035456,235.53945953213227,155.01999999999998C236.2548347217999,154.3279550920098,235.73908340711418,144.53149787222807,235.98648830330734,141.54000000000002C236.1106972253395,140.0381270310806,236.09229883285775,138.46894474475485,236.43351707448238,138.17000000000002C236.55725168406022,138.06159485993052,236.75681123607959,138.06159485993052,236.88054584565742,138.17000000000002C237.22176408728203,138.46894474475488,237.1785650264408,141.54000000000005,237.32757461683246,141.54000000000002C237.47658420722422,141.54000000000005,237.6485798066517,138.16447083538503,237.77460338800753,138.17000000000002C237.99203899938337,138.17953978037698,238.0872699638826,144.48128506903643,238.22163215918258,148.27999999999997C238.39503882664724,153.18258807811347,238.39350689367828,165.11549202791082,238.66866093035762,165.13C238.7922295886063,165.13651537105034,238.966680111141,162.88333333333335,239.11568970153266,161.76C239.2646992919244,160.63666666666668,239.2215002310831,158.68894474475485,239.56271847270773,158.39C239.68645308228557,158.28159485993046,239.88117749094715,158.26698952909368,240.00974724388277,158.39C240.62147574356976,158.9752777118657,240.23934040368198,168.490460219623,240.4567760150578,168.5C240.58279959641368,168.505529164615,240.7727647263947,165.1256969447821,240.90380478623285,165.13C241.08851963544194,165.13606561227687,241.16611870819892,171.8639343877232,241.35083355740792,171.87C241.48187361724612,171.8743030552179,241.6668222687448,169.81859044289,241.79786232858297,168.5C241.98257717779202,166.64130705428778,242.060176250549,161.76606561227683,242.244891099758,161.76C242.37593115959618,161.75569694478207,242.5608798110949,165.1343030552179,242.69191987093305,165.13C242.87663472014214,165.12393438772318,242.95423379289912,160.24869294571224,243.13894864210812,158.39C243.26998870194632,157.07140955710994,243.2447591716585,155.31894474475482,243.58597741328316,155.01999999999998C243.709712022861,154.9115948599305,243.906642684822,155.13826010267204,244.03300618445817,155.01999999999998C244.5242085170437,154.56029732912108,244.3490760399383,150.9134029649267,244.48003495563322,148.27999999999997C244.66508655416956,144.55886787498002,244.77805413641659,134.8,244.92706372680826,134.8C245.07607331719993,134.8,244.65871730831574,147.5879550920098,245.37409249798333,148.27999999999997C245.50433038101568,148.40599048035457,245.69475776952223,148.39826010267205,245.82112126915837,148.27999999999997C246.31232360174397,147.8202973291211,246.08343519112435,143.39869294571224,246.2681500403334,141.54000000000002C246.39919010017155,140.22140955710998,246.58413875167028,139.48859044289006,246.71517881150845,138.17000000000002C246.8998936607175,136.3113070542878,246.97749273347455,131.43606561227688,247.16220758268352,131.43C247.29324764252175,131.42569694478212,247.46022676346695,133.67666666666668,247.60923635385856,134.8C247.75824594425023,135.9233333333334,247.92522506519543,136.85140955710997,248.0562651250336,138.17000000000002C248.24097997424263,140.02869294571227,248.01209156362307,144.4502973291211,248.50329389620865,144.91000000000003C248.62965739584482,145.02826010267208,248.82658805780588,144.8015948599305,248.95032266738372,144.91000000000003C249.29154090900838,145.2089447447549,249.2713278572029,148.28552916461496,249.39735143855876,148.27999999999997C249.6147870499347,148.270460219623,249.626944598358,140.63353112968534,249.8443802097338,138.17000000000002C249.9704037910896,136.74216113873914,250.1603689210707,134.79569694478212,250.29140898090884,134.8C250.47612383011796,134.80606561227685,250.60747883638905,138.90659703507336,250.7384377520839,141.54000000000002C250.92348935062026,145.26113212501994,250.9380616270658,152.02850212777196,251.18546652325895,155.01999999999998C251.30967544529113,156.52187296891947,251.29127705280942,158.09105525524515,251.632495294434,158.39C251.75622990401178,158.49840514006945,251.9531605659729,158.50826010267207,252.079524065609,158.39C252.57072639819458,157.93029732912112,252.3418379875751,153.50869294571223,252.5265528367841,151.64999999999998C252.6575928966223,150.33140955710996,252.84755802660337,148.27447083538502,252.97358160795915,148.27999999999997C253.19101721933498,148.28953978037694,253.20317476775833,158.38046021962296,253.42061037913416,158.39C253.54663396049,158.395529164615,253.74161556895342,155.01447083538503,253.8676391503092,155.01999999999998C254.08507476168515,155.029539780377,254.14728841513113,165.12815540046833,254.31466792148427,165.13C254.45141597495007,165.13150702676137,254.57698184345028,160.24869294571224,254.7616966926593,158.39C254.89273675249748,157.07140955710994,254.86750722220972,155.31894474475487,255.20872546383436,155.01999999999998C255.3324600734122,154.9115948599305,255.50674464461775,155.02,255.6557542350094,155.01999999999998C255.80476382540112,155.02,255.9764195065483,155.13826010267204,256.1027830061845,155.01999999999998C256.5939853387701,154.56029732912106,256.40080218696784,148.27999999999997,256.54981177735954,148.27999999999997C256.69882136775124,148.27999999999997,256.86009249506884,155.0215070267613,256.9968405485346,155.01999999999998C257.16422005488766,155.0181554004683,256.83214082002263,145.49527771186578,257.44386931970956,144.91000000000003C257.57243907264524,144.78698952909372,257.76716348130674,144.8015948599305,257.8908980908846,144.91000000000003C258.23211633250924,145.2089447447549,258.2068868022215,148.28430305521783,258.3379268620597,148.27999999999997C258.5226417112687,148.27393438772313,258.64820757976895,141.53849297323862,258.78495563323474,141.54000000000002C258.95233513958794,141.54184459953171,258.62025590472285,151.0647222881343,259.2319844044098,151.64999999999998C259.3605541573454,151.77301047090629,259.55264967594866,151.76826010267206,259.6790131755848,151.64999999999998C260.1702155081704,151.1902973291211,259.94132709755087,144.9160656122769,260.12604194675987,144.91000000000003C260.257082006598,144.90569694478214,260.4420306580967,146.96140955710993,260.5730707179349,148.27999999999997C260.75778556714397,150.1386929457122,260.83538463990095,155.01393438772314,261.02009948910995,155.01999999999998C261.1511395489481,155.0243030552179,261.3411046789292,151.644470835385,261.467128260285,151.64999999999998C261.6845638716609,151.65953978037697,261.30242853177316,161.1747222881343,261.9141570314601,161.76C262.04272678439577,161.8830104709063,262.23482230299896,161.64173989732785,262.36118580263513,161.76C262.85238813522085,162.21970267087892,262.6234997246012,168.49393438772316,262.8082145738102,168.5C262.9392546336483,168.5043030552179,263.12921976362946,166.5578388612609,263.2552433449852,165.13C263.47267895636116,162.6664688703147,263.0905436164733,155.60527771186568,263.70227211616026,155.01999999999998C263.83084186909593,154.89698952909367,264.0002912969437,155.02,264.1493008873353,155.01999999999998C264.298310477727,155.02,264.4725950489326,155.1284051400695,264.59632965851034,155.01999999999998C264.9375479001351,154.72105525524515,264.91231836984724,152.96859044289002,265.0433584296854,151.64999999999998C265.22807327889444,149.79130705428778,265.3413776104688,144.91000000000003,265.4903872008605,144.91000000000003C265.6393967912522,144.91000000000003,265.80645705634066,151.65216609575862,265.9374159720355,151.64999999999998C266.12246757057187,151.6469391966893,266.13703984701743,141.16149787222804,266.38444474321057,138.17000000000002C266.50865366524266,136.66812703108056,266.70043345454735,136.11859044289005,266.83147351438555,134.8C267.01618836359455,132.94130705428782,266.7872999529751,128.51970267087893,267.27850228556065,128.06C267.40486578519676,127.94173989732792,267.5991675570995,127.94173989732789,267.7255310567357,128.06C268.2167333893213,128.51970267087893,267.9878449787018,132.9413070542878,268.17255982791073,134.8C268.3035998877489,136.11859044289002,268.27837035746114,137.87105525524518,268.6195885990858,138.17000000000002C268.7433232086636,138.2784051400695,268.94288276068306,138.2784051400695,269.0666173702608,138.17000000000002C269.4078356118855,137.87105525524518,269.36463655104427,134.80000000000004,269.51364614143586,134.8C269.66265573182756,134.80000000000004,269.81166532221926,138.17000000000004,269.9606749126109,138.17000000000002C270.10968450300265,138.17000000000004,270.2766636239478,134.79569694478212,270.40770368378594,134.8C270.59241853299505,134.80606561227688,270.7057228645692,141.54,270.85473245496104,141.54000000000002C271.00374204535274,141.54000000000002,271.1527516357444,134.8,271.3017612261361,134.8C271.4507708165277,134.8,271.5640751481021,139.68130705428783,271.7487899973111,141.54000000000002C271.87983005714926,142.85859044289003,272.0468091780945,144.91000000000005,272.19581876848616,144.91000000000003C272.3448283588779,144.91000000000005,272.51180747982295,142.85859044289006,272.6428475396612,141.54000000000002C272.82756238887026,139.6813070542878,272.5986739782507,135.25970267087894,273.08987631083625,134.8C273.21623981047236,134.6817398973279,273.38789549161964,134.80000000000007,273.5369050820113,134.8C273.68591467240304,134.8,273.8601992436085,134.69159485993052,273.98393385318633,134.8C274.32515209481096,135.09894474475487,274.28195303396967,138.17000000000002,274.43096262436137,138.17000000000002C274.57997221475307,138.17000000000002,274.72898180514477,135.92333333333335,274.87799139553647,134.8C275.02700098592817,133.67666666666668,275.19398010687337,131.4256969447821,275.3250201667115,131.43C275.5097350159206,131.43606561227688,275.5873340886775,136.3113070542878,275.7720489378865,138.17000000000002C275.9030889977247,139.48859044289006,276.0700681186699,141.54,276.21907770906154,141.54000000000002C276.3680872994532,141.54000000000002,276.5170968898449,138.17000000000002,276.66610648023664,138.17000000000002C276.8151160706283,138.17000000000002,276.9820951915735,140.22140955710998,277.1131352514117,141.54000000000002C277.29785010062074,143.39869294571224,277.411154432195,148.27999999999997,277.5601640225867,148.27999999999997C277.70917361297836,148.27999999999997,277.5159904611763,141.99970267087895,278.00719279376176,141.54000000000002C278.1335562933979,141.4217398973279,278.3256518120012,141.66301047090636,278.4542215649368,141.54000000000002C279.06595006462373,140.95472228813432,278.2895218364249,132.0152777118657,278.90125033611184,131.43C279.0298200890475,131.3069895290937,279.19926951689524,131.43000000000004,279.3482791072869,131.43C279.49728869767864,131.43000000000004,279.67157326888406,131.5384051400695,279.7953078784619,131.43C280.1365261200866,131.13105525524523,280.1163130682812,129.4878388612609,280.242336649637,128.06C280.45977226101286,125.59646887031468,280.4719298094363,117.95953978037697,280.68936542081207,117.94999999999999C280.81538900216793,117.94447083538502,281.01037061063136,121.32552916461499,281.1363941919871,121.32C281.35382980336306,121.31046021962302,281.3659873517863,111.21953978037698,281.58342296316215,111.20999999999998C281.709446544518,111.20447083538501,281.899411674499,113.26140955710994,282.0304517343372,114.57999999999998C282.2151665835462,116.43869294571222,282.32847091512053,119.07333333333334,282.47748050551223,121.32C282.62649009590393,123.56666666666665,282.79355036099236,125.42659703507331,282.9245092766873,128.06C283.10956087522356,131.78113212501992,282.65616285819476,140.8479550920098,283.3715380478623,141.54000000000002C283.50177593089467,141.66599048035462,283.6695572286458,141.54000000000005,283.8185668190374,141.54000000000002C283.9675764094291,141.54000000000005,284.14186098063465,141.43159485993053,284.26559559021246,141.54000000000002C284.60681383183714,141.83894474475488,284.5815843015493,144.9143030552179,284.7126243613875,144.91000000000003C284.89733921059656,144.9039343877232,285.02290507909674,140.6444559290619,285.1596531325625,138.17000000000002C285.3270326389157,135.14126795298242,285.38924629236163,128.06953978037697,285.6066819037375,128.06C285.7327054850934,128.05447083538502,285.9276870935568,131.43552916461502,286.0537106749126,131.43C286.27114628628857,131.420460219623,286.28330383471183,123.78353112968531,286.50073944608766,121.32C286.6267630274435,119.89216113873913,286.8235592952306,119.45187296891946,286.9477682172627,117.94999999999999C287.1951731134559,114.95850212777198,287.2097453899014,108.19113212501995,287.39479698843775,104.47000000000003C287.52575590413267,101.83659703507335,287.3506234270273,98.18970267087896,287.8418257596128,97.73000000000002C287.9681892592489,97.61173989732792,288.16249103115166,97.8482601026721,288.28885453078783,97.73000000000002C288.7800568633735,97.27029732912116,288.5511684527538,92.84869294571224,288.7358833019629,90.99000000000001C288.86692336180107,89.67140955710997,289.0518720132997,87.61569694478212,289.1829120731379,87.62C289.36762692234703,87.62606561227686,289.44522599510407,92.50130705428782,289.629940844313,94.36000000000001C289.7609809041512,95.67859044289006,289.9279600250964,96.60666666666668,290.07696961548805,97.73000000000002C290.2259792058798,98.85333333333337,290.3929583268249,99.78140955710998,290.5239983866631,101.10000000000002C290.7087132358721,102.95869294571224,290.8432142732595,105.08594534810562,290.97102715783814,107.83999999999997C291.1729309458504,112.19053217399171,291.2446492615485,119.78741192188653,291.4180559290132,124.69C291.5524181243131,128.48871493096354,291.64764908881244,134.79046021962307,291.8650847001882,134.8C291.9911082815441,134.805529164615,292.1631038809716,132.55333333333337,292.31211347136326,131.43C292.461123061755,130.3066666666667,292.6281021827001,128.0556969447821,292.7591422425383,128.06C292.9438570917474,128.06606561227687,293.0571614233216,132.5533333333333,293.2061710137134,134.8C293.35518060410516,137.0466666666667,293.5041901944968,139.29333333333335,293.65319978488844,141.54000000000002C293.80220937528003,143.78666666666663,293.95121896567167,146.03333333333327,294.1002285560634,148.27999999999997C294.2492381464551,150.52666666666664,294.05605499465287,154.56029732912106,294.54725732723847,155.01999999999998C294.6736208268745,155.13826010267204,294.86792259877734,154.90173989732784,294.99428609841357,155.01999999999998C295.48548843099917,155.4797026708789,295.31350198501,161.76253767923805,295.4413148695886,161.76C295.64321865760087,161.75599127229924,295.61318960408437,144.9245079720892,295.88834364076365,144.91000000000003C296.01191229901235,144.9034846289497,295.994154170314,147.9810552552451,296.3353724119387,148.27999999999997C296.4591070215165,148.38840514006947,296.658666573536,148.17159485993048,296.78240118311373,148.27999999999997C297.1236194247384,148.5789447447548,297.09838989445063,150.33140955710996,297.2294299542888,151.64999999999998C297.41414480349783,153.50869294571223,297.1852563928783,157.9302973291211,297.6764587254638,158.39C297.80282222509993,158.50826010267207,297.99975288706105,158.2815948599305,298.12348749663886,158.39C298.4647057382635,158.68894474475485,298.44449268645803,161.76552916461497,298.5705162678139,161.76C298.7879518791898,161.75046021962297,298.8685354485973,155.01999999999998,299.017545038989,151.64999999999998C299.16655462938076,148.27999999999997,299.29719430381084,144.56873204701756,299.46457381016404,141.54000000000002C299.60132186362983,139.06554407093816,299.4204002487536,135.25970267087894,299.9116025813391,134.8C300.0379660809752,134.6817398973279,300.2300615995785,134.92301047090638,300.3586313525141,134.8C300.970359852201,134.21472228813434,300.5882245123133,124.69953978037701,300.80566012368917,124.69C300.93168370504503,124.68447083538503,301.12164883502606,128.06430305521792,301.2526888948642,128.06C301.43740374407326,128.0539343877232,301.55070807564755,123.56666666666665,301.69971766603925,121.32C301.84872725643095,119.07333333333334,301.9977368468226,116.82666666666665,302.1467464372143,114.57999999999998C302.2957560276059,112.33333333333327,302.4628162926945,110.47340296492665,302.5937752083894,107.83999999999997C302.7788268069258,104.11886787498007,302.79339908337136,94.37222299224209,303.04080397956443,94.36000000000001C303.1650129015965,94.35386348162972,303.3567926909012,96.41140955710998,303.4878327507394,97.73000000000002C303.6725475999485,99.58869294571222,303.7501466727054,104.46393438772319,303.93486152191446,104.47000000000003C304.06590158175266,104.47430305521792,304.23288070269786,101.10000000000001,304.38189029308955,101.10000000000002C304.53089988348125,101.10000000000002,304.4877008226399,104.17105525524521,304.8289190642646,104.47000000000003C304.95265367384246,104.57840514006952,305.14958433580347,104.58826010267211,305.27594783543964,104.47000000000003C305.7671501680253,104.01029732912116,305.58622855314894,97.72849297323866,305.7229766066147,97.73000000000002C305.8903561129678,97.73184459953164,305.95256976641394,107.83046021962299,306.1700053777897,107.83999999999997C306.29602895914553,107.84552916461493,306.4928252269326,104.46386348162973,306.61703414896476,104.47000000000003C306.86443904515795,104.48222299224206,306.91505332974816,113.45666666666668,307.0640629201398,117.94999999999999C307.21307251053145,122.44333333333333,307.3497495518659,127.2596866774885,307.51109169131485,131.43C307.65084791933486,135.04236848356203,307.7907409561367,138.51126795298242,307.95812046248994,141.54000000000002C308.0948685159556,144.01445592906185,308.22043438445587,146.42130705428772,308.405149233665,148.27999999999997C308.5361892935031,149.59859044288999,308.7211379450019,150.33140955710996,308.85217800484,151.64999999999998C309.03689285404914,153.50869294571223,309.114491926806,158.38393438772317,309.29920677601507,158.39C309.4302468358532,158.39430305521788,309.59722595679847,155.02,309.7462355471901,155.01999999999998C309.89524513758187,155.01999999999998,309.8520460767405,158.09105525524515,310.19326431836515,158.39C310.316998927943,158.4984051400695,310.51005520650784,158.2640095196454,310.6402930895402,158.39C311.3556682792077,159.08204490799017,310.90227026217883,171.8669391966893,311.08732186071524,171.87C311.21828077641015,171.87216609575864,311.3496357826812,166.98869294571224,311.5343506318903,165.13C311.6653906917285,163.81140955710995,311.8323698126737,161.76,311.9813794030654,161.76C312.1303889934571,161.75999999999996,312.2973681144023,165.1343030552179,312.4284081742404,165.13C312.6131230234495,165.12393438772315,312.6907220962064,158.39606561227686,312.8754369454154,158.39C313.00647700525354,158.3856969447821,313.17345612619874,161.75999999999996,313.32246571659044,161.76C313.47147530698214,161.76,313.64528556573333,158.38386348162967,313.76949448776554,158.39C314.0168993839588,158.40222299224203,314.0314716604042,168.14886787498006,314.2165232589406,171.87C314.3474821746355,174.5034029649267,314.47883718090645,176.75130705428774,314.6635520301156,178.61C314.79459208995377,179.92859044289003,314.9845572199348,181.98552916461495,315.11058080129067,181.98C315.3280164126665,181.970460219623,315.34017396108976,171.87953978037697,315.5576095724657,171.87C315.6836331538215,171.86447083538505,315.6634201020162,174.94105525524517,316.00463834364075,175.24C316.12837295321856,175.34840514006953,316.32793250523804,175.34840514006953,316.4516671148158,175.24C316.79288535644054,174.94105525524517,316.77267230463497,171.86447083538502,316.89869588599083,171.87C317.1161314973668,171.879539780377,317.12828904579004,181.97046021962296,317.34572465716593,181.98C317.47174823852174,181.98552916461495,317.6617133685028,178.6056969447821,317.792753428341,178.61C317.97746827755,178.61606561227686,318.09077260912443,185.35000000000002,318.239782199516,185.35C318.3887917899077,185.35000000000002,318.50209612148205,180.46869294571223,318.68681097069106,178.61C318.81785103052925,177.29140955710997,318.7926215002415,175.5389447447549,319.1338397418661,175.24C319.2575743514439,175.13159485993052,319.45713390346333,175.13159485993052,319.58086851304114,175.24C319.9220867546657,175.5389447447549,319.9018737028604,178.61552916461497,320.0278972842162,178.61C320.2453328955921,178.60046021962305,320.3259164649995,171.87000000000003,320.4749260553912,168.5C320.6239356457829,165.13,320.7545753202132,161.41873204701758,320.9219548265663,158.39C321.0587028800321,155.91554407093815,321.21997400734966,153.89666666666665,321.36898359774136,151.64999999999998C321.51799318813295,149.4033333333333,321.63129751970735,146.76869294571225,321.81601236891635,144.91000000000003C321.9470524287546,143.59140955711004,322.1388322180593,143.04187296891948,322.2630411400914,141.54000000000002C322.5104460362846,138.54850212777194,321.99469472159893,128.75204490799018,322.7100699112665,128.06C322.84030779429884,127.93400951964546,323.0307351828053,128.17826010267208,323.15709868244153,128.06C323.6483010150272,127.60029732912113,323.46737940015083,123.79445592906187,323.60412745361657,121.32C323.7715069599697,118.29126795298241,323.8337206134158,113.6735311296853,324.0511562247916,111.20999999999998C324.1771798061475,109.7821611387391,324.349175405575,107.83999999999999,324.49818499596665,107.83999999999997C324.6471945863584,107.83999999999999,324.8191901857859,109.7821611387391,324.9452137671417,111.20999999999998C325.16264937851764,113.67353112968532,325.1748069269409,118.85646887031473,325.39224253831674,121.32C325.5182661196726,122.74783886126089,325.713247728136,124.695529164615,325.8392713094918,124.69C326.0567069208677,124.68046021962301,325.67457158097983,115.1652777118657,326.2863000806668,114.57999999999998C326.4148698336025,114.45698952909365,326.60696535220563,114.46173989732785,326.7333288518419,114.57999999999998C327.22453118442746,115.03970267087888,326.6891552904314,120.86029732912114,327.18035762301696,121.32C327.3067211226531,121.43826010267207,327.50365178461425,121.2115948599305,327.627386394192,121.32C327.96860463581663,121.61894474475487,327.9254055749754,123.56666666666669,328.07441516536704,124.69C328.2234247557588,125.81333333333336,328.37243434615044,126.93666666666668,328.5214439365421,128.06C328.67045352693384,129.18333333333337,328.81946311732554,130.3066666666667,328.9684727077171,131.43C329.1174822981088,132.55333333333337,329.29129255686,134.80613651837032,329.41550147889217,134.8C329.66290637508547,134.78777700775797,329.615125353874,124.31149787222805,329.8625302500672,121.32C329.98673917209936,119.81812703108055,330.1859903629936,117.94348462894965,330.3095590212423,117.94999999999999C330.58471305792165,117.96450797208914,330.5831811249527,134.7984684292162,330.75658779241735,134.8C330.89094998771736,134.80118672030196,331.03623705723913,127.71873204701758,331.20361656359233,124.69C331.34036461705807,122.21554407093812,331.51389728130164,120.42445592906186,331.6506453347674,117.94999999999999C331.8180248411205,114.92126795298238,331.4859456062556,108.42527771186566,332.0976741059425,107.83999999999997C332.22624385887815,107.71698952909365,332.4209682675397,107.94840514006947,332.5447028771175,107.83999999999997C332.8859211187422,107.54105525524513,332.86069158845436,104.46569694478215,332.99173164829256,104.47000000000003C333.1764464975017,104.47606561227686,333.310947534889,111.21253767923804,333.4387604194676,111.20999999999998C333.6406642074798,111.20599127229923,333.712382523178,94.36153157078387,333.88578919064264,94.36000000000001C334.0201513859426,94.35881327969808,334.1153823504417,102.00646887031473,334.3328179618177,104.47000000000003C334.4588415431735,105.8978388612609,334.6488066731545,107.84430305521786,334.7798467329928,107.83999999999997C334.9645615822019,107.83393438772315,335.09591658847296,101.09783390424138,335.2268755041678,101.10000000000002C335.41192710270417,101.10306080331071,335.4264993791497,111.58850212777197,335.67390427534286,114.57999999999998C335.7981131973751,116.08187296891944,335.9719234561263,116.82666666666667,336.1209330465179,117.94999999999999C336.26994263690966,119.07333333333334,336.4189522273013,120.19666666666669,336.56796181769295,121.32C336.7169714080847,122.44333333333336,336.88395052902985,123.37140955710998,337.014990588868,124.69C337.19970543807705,126.54869294571222,337.3310604443481,131.43216609575867,337.46201936004303,131.43C337.6470709585794,131.42693919668932,337.7239965326816,117.95306080331066,337.909048131218,117.94999999999999C338.04000704691293,117.94783390424134,337.8648745698073,124.23029732912102,338.35607690239306,124.69C338.4824404020292,124.8082601026721,338.676742173932,124.8082601026721,338.8031056735682,124.69C339.29430800615376,124.23029732912103,339.10112485435155,117.94999999999997,339.25013444474325,117.94999999999999C339.39914403513495,117.94999999999997,339.54815362552665,124.69000000000001,339.6971632159183,124.69C339.8461728063099,124.68999999999997,340.0074439336276,117.94849297323866,340.1441919870933,117.94999999999999C340.3115714934464,117.95184459953164,339.9794922585814,127.47472228813434,340.5912207582683,128.06C340.71979051120405,128.18301047090634,340.91188602980714,127.94173989732789,341.03824952944336,128.06C341.5294518620291,128.51970267087893,341.3485302471526,134.80150702676139,341.4852783006184,134.8C341.65265780697155,134.79815540046835,341.71487146041756,124.69953978037698,341.93230707179345,124.69C342.0583306531493,124.68447083538503,342.24829578313035,126.74140955710996,342.37933584296854,128.06C342.5640506921776,129.91869294571222,342.64164976493464,132.9413070542878,342.8263646141436,134.8C342.9574046739817,136.11859044289002,343.124383794927,138.17000000000004,343.2733933853186,138.17000000000002C343.4224029757104,138.17000000000004,343.5943985751379,136.22783886126092,343.72042215649367,134.8C343.9378577678696,132.33646887031475,343.9500153162929,124.69953978037701,344.1674509276687,124.69C344.29347450902463,124.68447083538503,344.4909110405951,128.06651537105034,344.61447969884375,128.06C344.889633735523,128.04549202791088,344.8881018025541,111.21153157078382,345.0615084700188,111.20999999999998C345.19587066531875,111.20881327969802,345.2911016298179,121.31046021962298,345.50853724119384,121.32C345.6345608225497,121.32552916461499,345.8295424310132,117.94447083538502,345.95556601236893,117.94999999999999C346.1730016237448,117.95953978037699,346.2352152771908,125.0312679529824,346.402594783544,128.06C346.5393428370097,130.5344559290619,346.66490870550996,134.79393438772317,346.849623554719,134.8C346.98066361455716,134.8043030552179,347.1476427355025,132.55333333333337,347.29665232589406,131.43C347.4456619162858,130.3066666666667,347.61765751571335,128.05447083538502,347.7436810970691,128.06C347.961116708445,128.06953978037703,347.97327425686836,138.16046021962308,348.19070986824414,138.17000000000002C348.3167334496,138.175529164615,348.51352971738703,136.30187296891944,348.6377386394192,134.8C348.8851435356124,131.80850212777202,348.8373625144011,121.33222299224202,349.0847674105942,121.32C349.2089763326263,121.31386348162971,349.4007561219311,124.6943030552179,349.53179618176927,124.69C349.7165110309783,124.68393438772318,349.82981536255255,120.19666666666664,349.97882495294436,117.94999999999999C350.1278345433361,115.70333333333333,350.2768441337278,113.45666666666666,350.4258537241194,111.20999999999998C350.5748633145111,108.96333333333331,350.3816801627089,104.92970267087894,350.87288249529445,104.47000000000003C350.99924599493056,104.35173989732792,351.19617665689174,104.57840514006953,351.3199112664695,104.47000000000003C351.6611295080941,104.17105525524521,351.61793044725295,102.22333333333337,351.76694003764453,101.10000000000002C351.91594962803623,99.9766666666667,352.0879452274637,97.72447083538505,352.2139688088196,97.73000000000002C352.4314044201955,97.73953978037703,352.51198798960297,104.47000000000001,352.6609975799946,107.83999999999997C352.81000717038626,111.20999999999995,352.9770825470234,114.0009523243672,353.10802635116966,117.94999999999999C353.2931410657686,123.53275237364903,353.36994040774573,132.58724762635094,353.55505512234475,138.17000000000002C353.68599892649104,142.1190476756328,353.784648282144,145.81646887031474,354.0020838935198,148.27999999999997C354.1281074748756,149.70783886126085,354.30010307430325,150.52666666666667,354.44911266469484,151.64999999999998C354.59812225508654,152.77333333333334,354.74713184547824,153.89666666666668,354.8961414358699,155.01999999999998C355.04515102626164,156.14333333333335,355.2121301472068,158.39430305521788,355.3431702070449,158.39C355.5278850562539,158.38393438772317,355.6534509247543,151.64849297323863,355.79019897821996,151.64999999999998C355.9575784845731,151.65184459953164,356.01979213801917,159.29646887031467,356.237227749395,161.76C356.36325133075087,163.1878388612609,356.5600475985379,165.13613651837034,356.68425652057,165.13C356.9316614167633,165.11777700775792,356.88388039555196,154.64149787222803,357.13128529174514,151.64999999999998C357.25549421377724,150.1481270310805,357.2370958212956,148.57894474475484,357.5783140629202,148.27999999999997C357.70204867249805,148.17159485993048,357.898979334459,148.39826010267205,358.0253428340952,148.27999999999997C358.5165451666808,147.8202973291211,358.28765675606127,143.39869294571224,358.47237160527027,141.54000000000002C358.6034116651084,140.22140955711,358.7703907860536,139.29333333333335,358.91940037644525,138.17000000000002C359.06840996683695,137.04666666666668,359.2174195572287,135.9233333333334,359.3664291476203,134.8C359.51543873801205,133.67666666666668,359.4722396771707,131.72894474475487,359.81345791879534,131.43C359.9371925283732,131.3215948599305,360.11147709957874,131.43000000000004,360.2604866899704,131.43C360.40949628036213,131.43000000000004,360.58378085156767,131.53840514006953,360.7075154611455,131.43C361.04873370277016,131.13105525524514,361.0055346419289,128.06000000000003,361.1545442323205,128.06C361.3035538227123,128.06,361.47053294365736,130.11140955710994,361.60157300349556,131.43C361.7862878527047,133.28869294571226,361.91764285897574,138.17216609575868,362.0486017746706,138.17000000000002C362.23365337320695,138.16693919668933,361.78025535617803,125.38204490799016,362.49563054584564,124.69C362.62586842887794,124.56400951964542,362.79364972662904,124.69000000000001,362.9426593170207,124.69C363.09166890741244,124.69000000000001,363.2406784978041,124.69000000000001,363.3896880881957,124.69C363.5386976785875,124.69000000000001,363.7103533597346,124.57173989732789,363.83671685937077,124.69C364.32791919195637,125.14970267087892,364.0990307813367,129.57130705428776,364.2837456305458,131.43C364.41478569038395,132.74859044289005,364.5817648113292,134.8,364.7307744017209,134.8C364.8797839921126,134.8,365.0517795915402,131.42447083538505,365.17780317289595,131.43C365.3952387842719,131.43953978037703,365.47582235367935,141.54000000000002,365.624831944071,141.54000000000002C365.77384153446275,141.54000000000002,365.8544251038702,133.89353112968533,366.07186071524603,131.43C366.19788429660196,130.00216113873913,366.3698798960295,128.06000000000003,366.5188894864211,128.06C366.6678990768128,128.06,366.6247000159716,131.13105525524514,366.9659182575961,131.43C367.089652867174,131.5384051400695,367.26393743837957,131.43000000000004,367.41294702877116,131.43C367.56195661916286,131.43000000000004,367.7362411903684,131.3215948599305,367.8599757999462,131.43C368.2011940415709,131.7289447447549,368.17596451128315,134.80430305521793,368.3070045711213,134.8C368.49171942033036,134.79393438772317,368.26283100971074,128.51970267087893,368.75403334229634,128.06C368.8803968419325,127.94173989732789,369.07732750389357,127.95159485993052,369.2010621134714,128.06C369.54228035509607,128.35894474475484,369.52452222639783,131.43651537105035,369.6480908846464,131.43C369.92324492132565,131.4154920279109,369.9368350178873,114.58052444223684,370.09511965582146,114.57999999999998C370.2367077405331,114.57953087821517,370.3808062875476,128.059109584796,370.5421484269965,128.06C370.6819046550165,128.06077128684862,370.7717415867957,117.95953978037697,370.98917719817155,117.94999999999999C371.1152007795274,117.94447083538502,371.09498772772184,121.02105525524513,371.4362059693466,121.32C371.55994057892445,121.4284051400695,371.7595001309438,121.42840514006953,371.8832347405217,121.32C372.2244529821464,121.02105525524513,371.9890452700721,118.24894474475485,372.3302635116967,117.94999999999999C372.4539981212746,117.84159485993051,372.64872252993615,117.82698952909371,372.77729228287177,117.94999999999999C373.3890207825587,118.53527771186567,373.006885442671,125.59646887031471,373.2243210540468,128.06C373.3503446354027,129.4878388612609,373.5223402348302,131.43000000000004,373.67134982522185,131.43C373.8203594156136,131.43000000000004,373.9948099381483,128.05348462894966,374.1183785963969,128.06C374.3935326330761,128.07450797208912,374.36350357955973,144.90599127229927,374.56540736757194,144.91000000000003C374.6932202521506,144.91253767923808,374.86342654835516,138.17000000000002,375.0124361387469,138.17000000000002C375.1614457291386,138.17000000000002,375.274750060713,144.90393438772318,375.4594649099221,144.91000000000003C375.5905049697603,144.9143030552179,375.75748409070553,142.66333333333338,375.9064936810971,141.54000000000002C376.0555032714889,140.4166666666667,376.2274988709163,138.16447083538506,376.35352245227216,138.17000000000002C376.5709580636481,138.17953978037704,376.58311561207137,145.8164688703147,376.8005512234472,148.27999999999997C376.926574804803,149.70783886126088,376.90636175299755,151.35105525524514,377.2475799946222,151.64999999999998C377.3713146042,151.75840514006947,377.5708741562194,151.75840514006947,377.6946087657972,151.64999999999998C378.0358270074219,151.35105525524511,378.01059747713407,148.27569694478208,378.14163753697227,148.27999999999997C378.3263523861813,148.28606561227681,378.40395145893837,153.16130705428776,378.5886663081473,155.01999999999998C378.71970636798545,156.33859044289002,378.9114861572903,156.88812703108053,379.03569507932235,158.39C379.2830999755155,161.381497872228,379.2353189543042,171.85777700775796,379.48272385049745,171.87C379.6069327725296,171.87613651837032,379.78074303128085,168.50000000000003,379.9297526216725,168.5C380.07876221206425,168.50000000000003,380.24574133300933,170.55140955710996,380.37678139284753,171.87C380.5614962420566,173.72869294571223,380.6748005736309,178.61000000000004,380.8238101640226,178.61C380.9728197544143,178.61,381.1218293448059,174.11666666666665,381.2708389351976,171.87C381.4198485255893,169.62333333333333,381.53315285716366,166.98869294571224,381.71786770637266,165.13C381.84890776621086,163.81140955710995,381.8236782359231,162.05894474475483,382.1648964775477,161.76C382.28863108712557,161.65159485993053,382.4881906391448,161.6515948599305,382.61192524872274,161.76C382.95314349034743,162.05894474475488,382.92791396005964,165.13430305521788,383.05895401989784,165.13C383.2436688691069,165.12393438772315,383.3212679418639,160.24869294571224,383.5059827910729,158.39C383.637022850911,157.07140955710994,383.80400197185634,155.02,383.9530115622479,155.01999999999998C384.1020211526397,155.01999999999998,384.05882209179833,158.09105525524515,384.40004033342296,158.39C384.5237749430009,158.4984051400695,384.7233344950202,158.49840514006948,384.847069104598,158.39C385.1882873462227,158.09105525524515,385.1680742944173,155.01447083538503,385.29409787577305,155.01999999999998C385.51153348714905,155.029539780377,385.573747140595,162.1012679529824,385.7411266469481,165.13C385.8778747004138,167.60445592906186,386.0391458277315,171.87000000000003,386.18815541812313,171.87C386.3371650085148,171.86999999999995,386.1439818567126,165.58970267087886,386.63518418929823,165.13C386.76154768893446,165.0117398973279,386.95847835089546,165.2384051400695,387.08221296047327,165.13C387.4234312020979,164.8310552552452,387.1880234900236,162.05894474475483,387.5292417316483,161.76C387.6529763412262,161.65159485993053,387.8477007498878,161.88301047090633,387.97627050282335,161.76C388.58799900251034,161.17472228813432,388.20586366262256,154.1135311296853,388.4232992739984,151.64999999999998C388.5493228553543,150.2221611387391,388.5291098035488,148.57894474475484,388.87032804517344,148.27999999999997C388.9940626547513,148.17159485993048,389.1683472259569,148.28,389.3173568163485,148.27999999999997C389.46636640674024,148.28,389.63802208788735,148.39826010267205,389.7643855875235,148.27999999999997C390.2555879201091,147.8202973291211,390.0266995094895,143.3986929457122,390.21141435869856,141.54000000000002C390.3424544185368,140.22140955711,390.31722488824903,138.46894474475488,390.65844312987366,138.17000000000002C390.78217773945147,138.06159485993052,390.976902148113,138.04698952909365,391.1054719010487,138.17000000000002C391.7172004007357,138.7552777118657,390.94077217253675,147.69472228813424,391.55250067222374,148.27999999999997C391.68107042515936,148.40301047090628,391.8731659437626,148.39826010267205,391.9995294433988,148.27999999999997C392.4907317759844,147.8202973291211,392.2975486241821,141.54000000000002,392.4465582145738,141.54000000000002C392.5955678049655,141.54000000000005,392.70887213653987,148.2739343877231,392.89358698574887,148.27999999999997C393.02462704558695,148.2843030552179,393.19160616653227,146.0333333333334,393.34061575692385,144.91000000000003C393.48962534731555,143.7866666666667,393.6566044682607,141.53569694478216,393.7876445280989,141.54000000000002C393.97235937730795,141.5460656122769,394.08566370888235,146.03333333333333,394.23467329927405,148.27999999999997C394.3836828896658,150.52666666666664,394.5326924800575,155.01999999999998,394.6817020704491,155.01999999999998C394.8307116608408,155.01999999999998,394.94401599241513,148.28606561227681,395.12873084162413,148.27999999999997C395.2597709014623,148.27569694478208,395.4267500224074,151.64999999999998,395.5757596127991,151.64999999999998C395.72476920319076,151.64999999999998,395.89174832413596,149.59859044288999,396.02278838397416,148.27999999999997C396.20750323318316,146.42130705428772,396.28510230594014,141.54606561227683,396.4698171551492,141.54000000000002C396.60085721498734,141.5356969447821,396.7908223449685,144.915529164615,396.91684592632424,144.91000000000003C397.13428153770025,144.90046021962306,397.21486510710764,134.8,397.3638746974993,134.8C397.51288428789104,134.8,397.59346785729844,142.44646887031476,397.8109034686744,144.91000000000003C397.9369270500302,146.33783886126088,397.91671399822474,147.9810552552451,398.2579322398494,148.27999999999997C398.38166684942723,148.38840514006947,398.5812264014466,148.38840514006947,398.70496101102447,148.27999999999997C399.0461792526491,147.9810552552451,399.02094972236137,144.90569694478214,399.1519897821995,144.91000000000003C399.33670463140857,144.91606561227687,399.41430370416543,149.79130705428776,399.59901855337455,151.64999999999998C399.73005861321263,152.96859044289,399.9150072647114,155.02430305521787,400.0460473245496,155.01999999999998C400.2307621737586,155.01393438772317,400.00187376313914,148.73970267087893,400.49307609572463,148.27999999999997C400.6194395953608,148.16173989732786,400.791095276508,148.28,400.9401048668997,148.27999999999997C401.08911445729143,148.28,401.25689575504254,148.15400951964543,401.3871336380748,148.27999999999997C402.1025088277425,148.97204490799024,401.5867575130567,161.74777700775797,401.8341624092498,161.76C401.95837133128197,161.7661365183703,401.9399729388002,158.68894474475485,402.28119118042486,158.39C402.4049257900027,158.2815948599305,402.59965019866434,158.5130104709063,402.7282199515999,158.39C403.33994845128683,157.80472228813431,402.95781311139916,150.74353112968527,403.17524872277494,148.27999999999997C403.3012723041308,146.85216113873915,403.47326790355834,144.91000000000003,403.62227749395,144.91000000000003C403.77128708434174,144.91000000000003,403.9202966747333,148.27999999999997,404.069306265125,148.27999999999997C404.2183158555167,148.27999999999997,404.17511679467543,145.20894474475486,404.51633503630006,144.91000000000003C404.6400696458779,144.80159485993053,404.81435421708346,144.91000000000005,404.9633638074751,144.91000000000003C405.1123733978669,144.91000000000008,405.28665796907245,144.80159485993053,405.4103925786502,144.91000000000003C405.75161082027483,145.2089447447549,405.7084117594335,148.27999999999997,405.85742134982524,148.27999999999997C406.0064309402169,148.27999999999997,406.173410061162,146.22859044289,406.3044501210003,144.91000000000003C406.48916497020934,143.05130705428778,406.26027655958984,138.62970267087894,406.7514788921753,138.17000000000002C406.87784239181144,138.05173989732793,407.0721441637142,138.05173989732793,407.19850766335037,138.17000000000002C407.689709995936,138.62970267087894,407.4608215853164,143.05130705428778,407.6455364345254,144.91000000000003C407.77657649436344,146.22859044289,407.9435556153088,148.27999999999997,408.09256520570045,148.27999999999997C408.2415747960921,148.27999999999997,408.39058438648374,144.91,408.5395939768755,144.91000000000003C408.68860356726725,144.91000000000003,408.837613157659,147.15666666666667,408.9866227480506,148.27999999999997C409.13563233844235,149.4033333333333,409.3026114593874,150.33140955710996,409.43365151922563,151.64999999999998C409.6183663684347,153.50869294571223,409.6959654411917,158.38393438772317,409.8806802904007,158.39C410.0117203502388,158.39430305521788,410.1786994711841,156.14333333333335,410.3277090615757,155.01999999999998C410.4767186519675,153.89666666666668,410.648714251395,151.644470835385,410.77473783275076,151.64999999999998C410.99217344412676,151.65953978037697,411.00433099254997,161.750460219623,411.2217666039258,161.76C411.34779018528167,161.76552916461497,411.5197857847091,159.51333333333332,411.6687953751008,158.39C411.8178049654925,157.26666666666665,411.98478408643757,155.01569694478206,412.1158241462758,155.01999999999998C412.3005389954848,155.0260656122768,412.3781380682419,159.90130705428774,412.562852917451,161.76C412.6938929772892,163.07859044289,412.66866344700145,164.8310552552452,413.009881688626,165.13C413.1336162982039,165.2384051400695,413.33317585022314,165.23840514006952,413.45691045980107,165.13C413.79812870142575,164.83105525524513,413.77791564962035,163.1878388612609,413.90393923097605,161.76C414.1213748423519,159.2964688703147,414.1835884957979,151.65184459953164,414.3509680021511,151.64999999999998C414.4877160556169,151.64849297323863,414.61328192411713,158.38393438772317,414.79799677332613,158.39C414.9290368331643,158.39430305521788,414.90380730287654,155.31894474475487,415.2450255445012,155.01999999999998C415.36876015407904,154.9115948599305,415.56051436645015,154.8919035090331,415.6920543156762,155.01999999999998C416.4997844317329,155.80658532349918,415.33135297079446,171.08341467650075,416.13908308685126,171.87C416.2706230360775,171.99809649096693,416.4597483583901,171.98826010267206,416.58611185802636,171.87C417.077314190612,171.4102973291211,416.8841310388097,167.37666666666667,417.0331406292014,165.13C417.18215021959304,162.88333333333335,416.988967067791,158.84970267087888,417.48016940037644,158.39C417.60653290001255,158.27173989732788,417.8008346719153,158.2717398973279,417.9271981715515,158.39C418.4184005041372,158.84970267087888,418.23747888926073,162.65554407093813,418.3742269427265,165.13C418.54160644907967,168.1587320470176,418.6038201025257,175.2304602196231,418.82125571390156,175.24C418.9472792952575,175.245529164615,419.1422609037207,171.86447083538505,419.2682844850766,171.87C419.48572009645244,171.87953978037697,419.54793374989856,181.97815540046832,419.71531325625165,181.98C419.85206130971744,181.98150702676136,420.025593973961,177.7144559290619,420.16234202742675,175.24C420.32972153377995,172.21126795298247,420.4419912922487,168.1587320470176,420.6093707986018,165.13C420.7461188520675,162.65554407093813,420.90738997938513,158.39,421.05639956977683,158.39C421.2054091601685,158.39,421.31871349174287,163.27130705428775,421.50342834095187,165.13C421.63446840079007,166.44859044289004,421.8014475217353,168.5,421.9504571121269,168.5C422.09946670251867,168.50000000000006,422.2484762929103,166.25333333333336,422.39748588330195,165.13C422.5464954736937,164.0066666666667,422.7134745946388,163.07859044289,422.844514654477,161.76C423.02922950368605,159.90130705428777,423.14253383526034,155.02,423.29154342565204,155.01999999999998C423.4405530160437,155.01999999999992,423.55385734761825,159.90130705428777,423.73857219682714,161.76C423.86961225666533,163.07859044289003,424.054560908164,163.81140955710995,424.1856009680022,165.13C424.37031581721124,166.98869294571224,424.14142740659184,171.41029732912116,424.6326297391772,171.87C424.7589932388133,171.98826010267206,424.94811856112614,171.74190350903316,425.07965851035226,171.87C425.887388626409,172.65658532349914,425.3684026435931,188.71947555776316,425.5266872815273,188.72C425.6682753662391,188.72046912178482,425.72631115650927,178.2314978722281,425.97371605270234,175.24C426.09792497473455,173.7381270310806,426.2897047640392,171.86569694478212,426.4207448238774,171.87C426.6054596730865,171.87606561227685,426.7187640046607,176.36333333333332,426.8677735950524,178.61C427.01678318544396,180.85666666666665,426.82360003364204,184.89029732912107,427.3148023662275,185.35C427.4411658658637,185.4682601026721,427.63546763776645,185.4682601026721,427.76183113740257,185.35C428.25303346998817,184.8902973291211,428.05985031818597,180.85666666666665,428.2088599085776,178.61C428.3578694989694,176.36333333333337,428.16468634716716,172.329702670879,428.65588867975265,171.87C428.7822521793887,171.75173989732787,428.974347697992,171.74698952909367,429.1029174509277,171.87C429.7146459506147,172.45527771186573,429.40093663171103,181.97999999999996,429.54994622210273,181.98C429.6989558124944,181.98,429.82959548692446,171.87184459953164,429.9969749932777,171.87C430.1337230467434,171.86849297323863,430.307255710987,176.13554407093818,430.44400376445276,178.61C430.61138327080596,181.6387320470176,430.72365302927466,188.71815540046836,430.8910325356278,188.72C431.02778058909365,188.72150702676134,431.1890517164113,184.22666666666672,431.33806130680296,181.98C431.4870708971947,179.73333333333332,431.2938877453923,175.6997026708788,431.785090077978,175.24C431.91145357761417,175.12173989732796,432.0831092587613,175.24,432.232118849153,175.24C432.38112843954474,175.23999999999998,432.55278412069185,175.35826010267206,432.679147620328,175.24C433.1703499529138,174.78029732912117,432.9894283380373,168.49849297323863,433.12617639150307,168.5C433.2935558978562,168.50184459953164,433.3557695513022,176.1464688703147,433.5732051626781,178.61C433.6992287440339,180.0378388612609,433.8942103524973,180.55216113873914,434.02023393385315,181.98C434.23766954522904,184.4435311296853,434.2498270936523,192.080460219623,434.4672627050282,192.09C434.59328628638406,192.09552916461502,434.7652818858117,188.71999999999997,434.9142914762033,188.72C435.0633010665949,188.72,435.2302801875401,190.77140955710996,435.36132024737833,192.09C435.54603509658745,193.94869294571222,435.62363416934426,196.97130705428773,435.8083490185534,198.83C435.9393890783915,200.14859044289003,436.1063681993367,201.07666666666665,436.2553777897284,202.2C436.4043873801201,203.3233333333333,436.55339697051187,204.4466666666667,436.70240656090346,205.57C436.85141615129527,206.69333333333336,437.0183952722403,207.62140955710996,437.1494353320785,208.94C437.33415018128755,210.79869294571225,437.45971604978786,215.68150702676138,437.59646410325354,215.68C437.7638436096067,215.67815540046834,437.9091306791286,209.36871493096353,438.0434928744286,205.57C438.2168995418933,200.66741192188655,438.3322370076695,194.02341296681337,438.4905216456037,188.72C438.63210973031545,183.97601413878868,438.7524988182424,175.24306080331067,438.9375504167787,175.24C439.06850933247364,175.23783390424137,439.25676630337506,181.98253767923805,439.38457918795376,181.98C439.58648297596596,181.9759912722993,439.62970417111654,169.4805321739917,439.8316079591288,165.13C439.95942084370756,162.37594534810566,440.12962713991215,160.63666666666666,440.27863673030384,158.39C440.4276463206955,156.14333333333335,440.2344631688933,152.10970267087893,440.7256655014789,151.64999999999998C440.852029001115,151.53173989732787,441.0489596630761,151.75840514006947,441.1726942726539,151.64999999999998C441.5139125142786,151.35105525524511,441.48868298399077,149.59859044288999,441.61972304382897,148.27999999999997C441.804437893038,146.42130705428772,441.88203696579495,141.54606561227683,442.066751815004,141.54000000000002C442.19779187484227,141.53569694478216,442.1725623445546,144.6110552552452,442.5137805861791,144.91000000000003C442.6375151957569,145.01840514006952,442.8322396044185,144.78698952909372,442.96080935735415,144.91000000000003C443.5725378570411,145.4952777118657,443.19040251715336,155.010460219623,443.4078381285292,155.01999999999998C443.533861709885,155.02552916461497,443.51364865807966,151.9489447447548,443.85486689970423,151.64999999999998C443.97860150928216,151.5415948599305,444.1781610613015,151.54159485993048,444.3018956708793,151.64999999999998C444.643113912504,151.9489447447548,444.5999148516627,153.89666666666668,444.7489244420543,155.01999999999998C444.8979340324461,156.14333333333335,445.06491315339116,158.39430305521788,445.19595321322936,158.39C445.38066806243836,158.38393438772317,445.15177965181874,152.10970267087887,445.6429819844044,151.64999999999998C445.7693454840405,151.53173989732784,445.94100116518786,151.64999999999998,446.0900107555795,151.64999999999998C446.23902034597126,151.65,446.38802993636295,151.65000000000003,446.53703952675454,151.64999999999998C446.68604911714635,151.64999999999998,446.8577047982934,151.76826010267206,446.9840682979296,151.64999999999998C447.47527063051524,151.1902973291211,447.24638221989557,146.76869294571225,447.4310970691046,144.91000000000003C447.56213712894277,143.59140955710996,447.729116249888,141.54000000000005,447.87812584027967,141.54000000000002C448.0271354306714,141.54000000000005,448.20094568942267,143.4081270310806,448.3251546114547,144.91000000000003C448.57255950764795,147.90149787222808,448.5247784864365,155.398502127772,448.7721833826297,158.39C448.89639230466184,159.89187296891944,449.0881720939665,161.76430305521788,449.21921215380473,161.76C449.40392700301373,161.75393438772312,449.4815260757708,155.0260656122768,449.6662409249799,155.01999999999998C449.79728098481803,155.0156969447821,449.96426010576334,157.26666666666668,450.11326969615493,158.39C450.2622792865467,159.51333333333335,450.43427488597416,160.3321611387391,450.56029846732997,161.76C450.7777340787058,164.2235311296853,450.85831764811326,171.86999999999998,451.00732723850496,171.87C451.15633682889654,171.86999999999998,451.3145997816601,161.7592287131514,451.45435600968,161.76C451.61569814912895,161.760890415204,451.7400426414062,175.239109584796,451.90138478085504,175.24C452.04114100887506,175.24077128684866,452.1994039616385,168.50000000000003,452.3484135520301,165.13C452.4974231424218,161.76000000000002,452.6280628168519,158.04873204701755,452.7954423232051,155.01999999999998C452.9321903766709,152.54554407093812,453.0934615039885,150.52666666666667,453.2424710943802,148.27999999999997C453.391480684772,146.03333333333333,453.5527518120894,141.53849297323862,453.68949986555526,141.54000000000002C453.85687937190846,141.54184459953171,453.9190930253546,149.18646887031468,454.1365286367303,151.64999999999998C454.26255221808606,153.07783886126086,454.4525173480672,155.02430305521787,454.58355740790535,155.01999999999998C454.7682722571145,155.01393438772317,454.8996272633855,150.9134029649267,455.0305861790804,148.27999999999997C455.21563777761673,144.55886787498002,455.292563351719,134.8030608033107,455.47761495025543,134.8C455.60857386595035,134.79783390424137,455.73992887222147,141.53393438772324,455.92464372143047,141.54000000000002C456.0556837812686,141.5443030552179,456.2474635705735,138.16386348162973,456.3716724926055,138.17000000000002C456.6190773887987,138.1822229922421,456.63364966524415,147.92886787498003,456.81870126378055,151.64999999999998C456.9496601794755,154.2834029649267,457.12898198148986,155.91554407093813,457.26573003495565,158.39C457.43310954130885,161.41873204701758,457.10103030644376,167.91472228813433,457.7127588061307,168.5C457.84132855906637,168.62301047090634,458.0334240776695,168.61826010267208,458.15978757730574,168.5C458.6509899098914,168.04029732912116,458.4578067580891,164.0066666666667,458.6068163484808,161.76C458.7558259388724,159.51333333333332,458.8691302704468,155.02606561227682,459.0538451196558,155.01999999999998C459.184885179494,155.0156969447821,459.1596556492063,158.09105525524515,459.50087389083086,158.39C459.6246085004088,158.4984051400695,459.8241680524282,158.49840514006948,459.9479026620059,158.39C460.28912090363053,158.09105525524515,460.2459218427893,156.1433333333333,460.39493143318094,155.01999999999998C460.5439410235726,153.89666666666665,460.71775128232395,153.15187296891946,460.84196020435604,151.64999999999998C461.0893651005493,148.65850212777192,461.0415840793379,141.16149787222804,461.2889889755311,138.17000000000002C461.4131978975633,136.66812703108056,461.5870081563146,135.9233333333334,461.7360177467061,134.8C461.88502733709794,133.67666666666668,462.0340369274895,132.55333333333337,462.18304651788117,131.43C462.3320561082729,130.3066666666667,462.4810656986646,128.06000000000003,462.6300752890562,128.06C462.779084879448,128.06,462.94606400039305,130.11140955710994,463.07710406023125,131.43C463.2618189094403,133.28869294571226,463.37512324101465,138.17000000000002,463.5241328314063,138.17000000000002C463.673142421798,138.17000000000002,463.83441354911565,131.42849297323863,463.97116160258133,131.43C464.1385411089344,131.43184459953167,464.20075476238054,141.53046021962302,464.41819037375643,141.54000000000002C464.5442139551122,141.545529164615,464.73417908509333,138.1656969447821,464.8652191449315,138.17000000000002C465.0499339941406,138.17606561227686,465.1754998626408,142.43554407093816,465.3122479161065,144.91000000000003C465.47962742245966,147.9387320470176,465.5918971809283,155.0181554004683,465.75927668728156,155.01999999999998C465.89602474074735,155.02150702676133,466.0753465427617,150.9134029649267,466.2063054584566,148.27999999999997C466.3913570569929,144.55886787498002,465.93795903996426,135.49204490799016,466.65333422963164,134.8C466.78357211266393,134.67400951964547,466.9739995011705,134.68173989732793,467.1003630008066,134.8C467.59156533339217,135.25970267087888,467.4106437185159,141.5415070267614,467.54739177198167,141.54000000000002C467.7147712783348,141.53815540046838,467.3826920434699,132.01527771186576,467.9944205431567,131.43C468.12299029609244,131.30698952909367,468.29243972394016,131.43,468.44144931433186,131.43C468.59045890472373,131.43000000000004,468.76211458587073,131.31173989732793,468.8884780855069,131.43C469.37968041809245,131.8897026708789,469.15079200747283,138.1639343877232,469.3355068566819,138.17000000000002C469.4665469165201,138.1743030552179,469.44131738623236,135.09894474475487,469.78253562785693,134.8C469.9062702374348,134.69159485993052,470.10582978945416,134.69159485993052,470.229564399032,134.8C470.5707826406566,135.09894474475487,470.5455531103688,136.85140955710997,470.676593170207,138.17000000000002C470.8613080194161,140.02869294571227,470.9868738879164,142.43554407093816,471.12362194138205,144.91000000000003C471.2910014477351,147.9387320470176,471.4308944845372,155.02077128684863,471.5706507125571,155.01999999999998C471.731992852006,155.01910958479598,471.85633734428325,141.54089041520405,472.0176794837322,141.54000000000002C472.1574357117522,141.53922871315143,472.2472726435314,149.18646887031468,472.46470825490724,151.64999999999998C472.590731836263,153.07783886126086,472.78069696624414,155.02430305521787,472.9117370260823,155.01999999999998C473.0964518752914,155.01393438772317,472.8675634646719,148.73970267087893,473.3587657972573,148.27999999999997C473.48512929689343,148.16173989732786,473.6567849780407,148.28,473.80579456843236,148.27999999999997C473.9548041588241,148.28,474.12908873002965,148.17159485993048,474.2528233396074,148.27999999999997C474.59404158123215,148.5789447447548,474.55084252039086,150.52666666666667,474.69985211078244,151.64999999999998C474.84886170117426,152.77333333333334,474.99787129156584,153.89666666666665,475.1468808819575,155.01999999999998C475.2958904723492,156.14333333333332,475.4678860717768,158.39552916461497,475.5939096531326,158.39C475.81134526450836,158.38046021962302,475.8735589179545,148.2818445995316,476.0409384243076,148.27999999999997C476.17768647777336,148.2784929732386,475.9967648628973,154.5602973291211,476.48796719548267,155.01999999999998C476.6143306951188,155.13826010267204,476.78598637626607,155.02,476.9349959666577,155.01999999999998C477.08400555704947,155.02,477.23301514744117,155.02,477.38202473783275,155.01999999999998C477.53103432822456,155.02,477.70531889943,155.1284051400695,477.8290535090078,155.01999999999998C478.17027175063237,154.72105525524515,478.12707268979125,152.77333333333334,478.27608228018283,151.64999999999998C478.42509187057465,150.52666666666667,478.5741014609662,149.4033333333333,478.7231110513579,148.27999999999997C478.87212064174963,147.15666666666667,479.02113023214133,144.91000000000005,479.170139822533,144.91000000000003C479.3191494129246,144.91,479.4681590033163,148.27999999999997,479.617168593708,148.27999999999997C479.7661781840997,148.27999999999997,479.91518777449136,144.91000000000003,480.06419736488306,144.91000000000003C480.21320695527476,144.91000000000003,480.3622165456664,147.15666666666664,480.5112261360581,148.27999999999997C480.6602357264498,149.40333333333328,480.82721484739494,151.6543030552179,480.95825490723314,151.64999999999998C481.1429697564421,151.64393438772314,481.2205688291991,146.76869294571225,481.4052836784082,144.91000000000003C481.5363237382464,143.59140955710996,481.7033028591916,142.66333333333338,481.8523124495832,141.54000000000002C482.001322039975,140.4166666666667,481.95812297913363,138.46894474475485,482.29934122075827,138.17000000000002C482.42307583033613,138.06159485993052,482.5973604015417,138.17000000000004,482.7463699919333,138.17000000000002C482.89537958232506,138.17000000000004,483.0696641535306,138.06159485993052,483.1933987631084,138.17000000000002C483.5346170047329,138.4689447447549,483.51685887603486,141.54651537105036,483.64042753428345,141.54000000000002C483.91558157096273,141.52549202791087,483.88555251744634,124.69400872770073,484.0874563054585,124.69C484.2152691900372,124.68746232076195,484.0432827440481,130.97029732912114,484.53448507663353,131.43C484.6608485762696,131.5482601026721,484.85515034817246,131.5482601026721,484.98151384780857,131.43C485.4727161803941,130.9702973291211,485.2438277697746,124.69606561227683,485.42854261898356,124.69C485.5595826788217,124.68569694478211,485.72656179976707,126.93666666666668,485.8755713901586,128.06C486.0245809805503,129.18333333333337,485.98138191970895,131.13105525524514,486.32260016133364,131.43C486.4463347709115,131.53840514006953,486.6432654328726,131.31173989732787,486.7696289325088,131.43C487.26083126509434,131.8897026708789,487.0676481132923,138.17000000000002,487.21665770368384,138.17000000000002C487.36566729407537,138.17,487.5269384213932,133.90445592906192,487.6636864748588,131.43C487.83106598121196,128.40126795298244,487.9433357396807,121.32184459953166,488.11071524603386,121.32C488.2474632994996,121.31849297323863,488.4299311326303,128.06253767923806,488.5577440172089,128.06C488.75964780522116,128.05599127229928,488.19704267232754,111.99658532349918,489.00477278838395,111.20999999999998C489.1363127376101,111.08190350903313,489.3027919691674,111.21000000000001,489.451801559559,111.20999999999998C489.6008111499508,111.21000000000001,489.7498207403425,111.21,489.89883033073403,111.20999999999998C490.0478399211257,111.21000000000001,490.2221244923313,111.10159485993047,490.3458591019091,111.20999999999998C490.6870773435338,111.50894474475484,490.66686429172836,113.15216113873912,490.79288787308417,114.57999999999998C491.0103234844602,117.0435311296853,491.09090705386757,124.69000000000003,491.2399166442592,124.69C491.38892623465097,124.69000000000003,491.5471891874143,114.57922871315138,491.68694541543425,114.57999999999998C491.8482875548832,114.58089041520401,491.4185989969417,127.36795509200977,492.1339741866093,128.06C492.2642120696416,128.18599048035455,492.4507650747519,127.93400951964544,492.58100295778434,128.06C493.2963781474518,128.75204490799018,492.8429801304229,137.8188678749801,493.0280317289594,141.54000000000002C493.15899064465424,144.17340296492668,493.33831244666874,145.80554407093814,493.4750605001344,148.27999999999997C493.6424400064877,151.30873204701757,493.7823330432896,158.39077128684863,493.92208927130946,158.39C494.08343141075835,158.38910958479596,494.1217131462914,147.90149787222805,494.36911804248456,144.91000000000003C494.4933269645167,143.4081270310806,494.68510675382134,142.85859044289006,494.8161468136596,141.54000000000002C495.00086166286866,139.6813070542878,495.12642753136896,137.27445592906187,495.26317558483464,134.8C495.43055509118767,131.77126795298244,495.09847585632275,125.27527771186564,495.7102043560097,124.69C495.83877410894536,124.56698952909369,496.0308696275485,124.80826010267207,496.1572331271847,124.69C496.6484354597704,124.23029732912113,496.4195470491508,117.95606561227683,496.60426189835977,117.94999999999999C496.73530195819797,117.9456969447821,496.9252670881791,121.32552916461499,497.0512906695348,121.32C497.2687262809108,121.31046021962302,497.3493098503182,111.20999999999998,497.49831944070985,111.20999999999998C497.6473290311016,111.21,497.727912600509,118.85646887031471,497.94534821188495,121.32C498.0713717932408,122.74783886126087,498.26133692322173,123.37140955710998,498.39237698306,124.69C498.57709183226916,126.54869294571222,498.70844683854017,128.79659703507332,498.83940575423503,131.43C499.0244573527714,135.15113212501993,498.5710593357426,144.2179550920098,499.2864345254101,144.91000000000003C499.4166724084423,145.03599048035457,499.6097286870073,144.80159485993053,499.7334632965851,144.91000000000003C500.07468153820975,145.20894474475486,500.04945200792184,146.96140955710993,500.18049206776016,148.27999999999997C500.3652069169692,150.1386929457122,500.1363185063497,154.5602973291211,500.6275208389352,155.01999999999998C500.75388433857125,155.13826010267204,500.9255400197186,155.02,501.07454961011024,155.01999999999998C501.22355920050205,155.02,501.3978437717075,154.9115948599305,501.52157838128534,155.01999999999998C501.8627966229101,155.31894474475482,501.8375670926222,158.39430305521788,501.9686071524604,158.39C502.15332200166944,158.38393438772317,502.2846770079406,154.2834029649267,502.4156359236354,151.64999999999998C502.60068752217177,147.92886787498006,502.7210766100987,138.1695308782152,502.86266469481046,138.17000000000002C503.0209493327447,138.17052444223688,503.16068387559386,155.02000000000004,503.3096934659855,155.01999999999998C503.45870305637726,155.02,503.5548184491483,138.17400872770074,503.7567222371605,138.17000000000002C503.88453512173925,138.16746232076198,504.0190361591265,143.05130705428778,504.20375100833553,144.91000000000003C504.33479106817356,146.22859044289,504.5017701891189,148.27999999999997,504.6507797795106,148.27999999999997C504.79978936990227,148.27999999999997,504.75659030906127,145.20894474475492,505.0978085506857,144.91000000000003C505.22154316026354,144.80159485993053,505.42110271228296,144.80159485993053,505.54483732186077,144.91000000000003C505.88605556348557,145.20894474475486,505.6506478514113,147.98105525524514,505.99186609303575,148.27999999999997C506.1156007026137,148.38840514006947,506.31032511127523,148.1569895290937,506.4388948642108,148.27999999999997C507.0506233638976,148.86527771186564,506.2741951356991,157.80472228813431,506.88592363538584,158.39C507.01449338832157,158.5130104709063,507.20658890692465,158.50826010267207,507.3329524065609,158.39C507.82415473914654,157.93029732912112,507.6521682931574,151.64746232076197,507.7799811777359,151.64999999999998C507.9818849657482,151.65400872770073,507.4192798328545,167.71341467650083,508.22700994891096,168.5C508.3585498981372,168.6280964909669,508.54767522044983,168.6182601026721,508.674038720086,168.5C509.1652410526716,168.04029732912116,508.9720579008693,164.00666666666663,509.1210674912611,161.76C509.2700770816528,159.51333333333335,509.4190866720445,155.01999999999998,509.56809626243614,155.01999999999998C509.71710585282784,155.01999999999998,509.52392270102575,161.30029732912118,510.0151250336112,161.76C510.14148853324724,161.87826010267207,510.31314421439464,161.76000000000002,510.4621538047862,161.76C510.611163395178,161.76000000000002,510.7828190763251,161.87826010267207,510.90918257596127,161.76C511.4003849085469,161.30029732912112,511.17149649792736,155.02606561227682,511.3562113471363,155.01999999999998C511.4872514069744,155.0156969447821,511.46202187668655,158.09105525524515,511.80324011831135,158.39C511.9269747278892,158.4984051400695,512.1216991365508,158.51301047090632,512.2502688894864,158.39C512.8619973891733,157.8047222881343,512.4798620492857,150.74353112968524,512.6972976606615,148.27999999999997C512.8233212420175,146.85216113873915,512.8031081902119,145.20894474475486,513.1443264318366,144.91000000000003C513.2680610414144,144.80159485993053,513.4611173199793,144.78400951964545,513.5913552030116,144.91000000000003C514.3067303926791,145.6020449079902,513.8893743837948,158.38999999999996,514.0383839741866,158.39C514.1873935645782,158.39,513.7700375556941,145.60204490799023,514.4854127453616,144.91000000000003C514.615650628394,144.78400951964545,514.808706906959,145.01840514006955,514.9324415165366,144.91000000000003C515.2736597581612,144.6110552552452,515.2534467063559,142.96783886126093,515.3794702877117,141.54000000000002C515.5969058990877,139.07646887031476,515.6591195525335,134.4587320470176,515.8264990588867,131.43C515.9632471123525,128.95554407093815,516.0888129808528,126.5486929457122,516.2735278300619,124.69C516.4045678899,123.37140955710996,516.5715470108453,122.44333333333336,516.7205566012369,121.32C516.8695661916287,120.19666666666669,517.0433764503798,117.94386348162969,517.167585372412,117.94999999999999C517.4149902686052,117.96222299224206,517.3672092473939,128.43850212777198,517.614614143587,131.43C517.7388230656192,132.93187296891946,517.7204246731374,134.50105525524518,518.061642914762,134.8C518.18537752434,134.9084051400695,518.3801019330016,134.67698952909373,518.5086716859371,134.8C519.1204001856241,135.3852777118657,518.7382648457362,144.90046021962303,518.9557004571121,144.91000000000003C519.0817240384681,144.915529164615,519.2716891684489,141.5356969447821,519.4027292282872,141.54000000000002C519.5874440774961,141.54606561227683,519.6650431502532,146.42130705428772,519.8497579994622,148.27999999999997C519.9807980593002,149.59859044288999,520.1707631892814,150.2221611387391,520.2967867706373,151.64999999999998C520.5142223820133,154.1135311296853,520.5263799304365,159.2964688703147,520.7438155418123,161.76C520.8698391231682,163.18783886126087,521.0598042531492,163.81140955710995,521.1908443129873,165.13C521.3755591621965,166.98869294571224,521.5069141684675,171.87216609575864,521.6378730841624,171.87C521.8229246826987,171.8669391966893,521.3695266656699,159.08204490799017,522.0849018553374,158.39C522.2151397383697,158.2640095196454,522.4016927434801,158.51599048035456,522.5319306265125,158.39C523.24730581618,157.69795509200975,522.7939077991512,148.63113212501995,522.9789593976875,144.91000000000003C523.1099183133824,142.27659703507334,523.2412733196533,140.0286929457122,523.4259881688625,138.17000000000002C523.5570282287007,136.85140955710997,523.724007349646,134.8,523.8730169400377,134.8C524.0220265304293,134.79999999999998,524.1710361208212,137.0466666666667,524.3200457112127,138.17000000000002C524.4690553016045,139.29333333333338,524.6180648919961,141.54000000000005,524.7670744823878,141.54000000000002C524.9160840727795,141.54000000000005,525.0650936631713,138.17000000000004,525.2141032535628,138.17000000000002C525.3631128439546,138.17000000000004,525.5300919648997,141.5443030552179,525.6611320247379,141.54000000000002C525.8458468739469,141.5339343877232,525.6169584633275,135.25970267087894,526.1081607959129,134.8C526.234524295549,134.6817398973279,526.4314549575103,134.9084051400695,526.555189567088,134.8C526.8964078087126,134.50105525524518,526.8532087478713,131.43000000000004,527.002218338263,131.43C527.1512279286547,131.43000000000004,527.3002375190465,134.80000000000004,527.449247109438,134.8C527.5982566998299,134.80000000000004,527.7652358207748,131.4256969447821,527.8962758806131,131.43C528.0809907298221,131.43606561227688,528.2154917672095,138.17253767923808,528.3433046517881,138.17000000000002C528.5452084398004,138.1659912722993,527.9826033069066,122.10658532349919,528.7903334229632,121.32C528.9218733721895,121.19190350903312,529.1136275845604,121.42840514006947,529.2373621941382,121.32C529.5785804357629,121.02105525524516,529.5353813749217,119.07333333333334,529.6843909653132,117.94999999999999C529.8334005557049,116.82666666666667,530.00037967665,115.89859044289,530.1314197364883,114.57999999999998C530.3161345856973,112.72130705428776,530.4294389172717,110.08666666666669,530.5784485076633,107.83999999999997C530.7274580980551,105.5933333333333,530.8407624296295,101.10606561227688,531.0254772788385,101.10000000000002C531.1565173386766,101.09569694478212,531.3464824686577,103.04216113873916,531.4725060500135,104.47000000000003C531.6899416613895,106.93353112968535,531.7020992098127,112.11646887031469,531.9195348211886,114.57999999999998C532.0455584025442,116.00783886126084,532.0253453507389,117.65105525524511,532.3665635923635,117.94999999999999C532.4902982019413,118.0584051400695,532.685022610603,117.82698952909371,532.8135923635385,117.94999999999999C533.4253208632255,118.53527771186567,533.0431855233377,125.59646887031471,533.2606211347136,128.06C533.3866447160694,129.4878388612609,533.5586403154971,131.43000000000004,533.7076499058886,131.43C533.8566594962805,131.43000000000004,534.0286550957079,129.4878388612609,534.1546786770637,128.06C534.3721142884397,125.59646887031471,534.3842718368628,117.95953978037699,534.6017074482387,117.94999999999999C534.7277310295946,117.94447083538502,534.9176961595756,120.00140955710995,535.0487362194139,121.32C535.2334510686228,123.17869294571219,535.3467554001973,125.81333333333332,535.4957649905889,128.06C535.6447745809805,130.30666666666667,535.7937841713723,134.8,535.9427937617639,134.8C536.0918033521556,134.8,536.2408129425473,128.06,536.389822532939,128.06C536.5388321233306,128.06,536.652136454905,132.9413070542878,536.836851304114,134.8C536.9678913639522,136.11859044289002,536.9426618336645,137.87105525524518,537.2838800752891,138.17000000000002C537.4076146848669,138.2784051400695,537.6045453468279,138.2882601026721,537.7309088464641,138.17000000000002C538.2221111790499,137.71029732912115,537.9932227684301,133.28869294571226,538.1779376176391,131.43C538.3089776774773,130.11140955710994,538.4759567984225,129.18333333333337,538.6249663888142,128.06C538.7739759792059,126.93666666666667,538.940955100151,124.68569694478211,539.0719951599892,124.69C539.2567100091983,124.69606561227684,539.3343090819552,131.4239343877232,539.5190239311643,131.43C539.6500639910023,131.4343030552179,539.8350126425012,129.37859044289004,539.9660527023393,128.06C540.1507675515484,126.2013070542878,540.2640718831227,123.56666666666665,540.4130814735144,121.32C540.5620910639061,119.07333333333334,540.7233621912236,117.05445592906185,540.8601102446894,114.57999999999998C541.0274897510425,111.55126795298239,541.1397595095111,107.49873204701758,541.3071390158644,104.47000000000003C541.4438870693302,101.99554407093817,541.5694529378303,99.58869294571222,541.7541677870395,97.73000000000002C541.8852078468777,96.41140955710998,541.8599783165901,94.65894474475486,542.2011965582146,94.36000000000001C542.3249311677923,94.25159485993049,542.519655576454,94.2369895290937,542.6482253293897,94.36000000000001C543.2599538290766,94.9452777118657,542.946244510173,101.10000000000004,543.0952541005647,104.47000000000003C543.2442636909565,107.84000000000002,542.9305543720528,113.99472228813431,543.5422828717398,114.57999999999998C543.6708526246754,114.70301047090629,543.865577033337,114.68840514006948,543.9893116429148,114.57999999999998C544.3305298845395,114.28105525524515,544.2873308236982,112.33333333333334,544.4363404140898,111.20999999999998C544.5853500044816,110.08666666666667,544.5421509436402,108.13894474475481,544.8833691852649,107.83999999999997C545.0071037948428,107.73159485993047,545.2040344568037,107.72173989732788,545.3303979564399,107.83999999999997C545.8216002890256,108.2997026708789,545.2862243950295,114.12029732912109,545.777426727615,114.57999999999998C545.9037902272511,114.69826010267205,546.1007208892122,114.68840514006948,546.22445549879,114.57999999999998C546.5656737404147,114.28105525524515,546.5454606886092,112.63783886126085,546.671484269965,111.20999999999998C546.8889198813409,108.74646887031471,546.9010774297642,103.56353112968534,547.1185130411401,101.10000000000002C547.2445366224958,99.67216113873914,547.2243235706904,98.02894474475488,547.5655418123151,97.73000000000002C547.689276421893,97.62159485993052,547.8635609930986,97.73000000000005,548.0125705834902,97.73000000000002C548.161580173882,97.73000000000005,548.3293614716329,97.60400951964546,548.4595993546652,97.73000000000002C549.1749745443327,98.42204490799023,548.6592232296472,111.19777700775795,548.9066281258403,111.20999999999998C549.0308370478724,111.21613651837029,549.2294479749831,107.83386348162968,549.3536568970153,107.83999999999997C549.6010617932086,107.85222299224202,549.0853104785232,120.62795509200983,549.8006856681905,121.32C549.9309235512227,121.44599048035452,550.1213509397293,121.2017398973279,550.2477144393655,121.32C550.7389167719513,121.77970267087893,550.203540877955,127.60029732912113,550.6947432105405,128.06C550.8211067101764,128.17826010267203,551.0102320324893,127.93190350903316,551.1417719817155,128.06C551.9495020977719,128.84658532349906,550.7810706368339,144.1234146765009,551.5888007528905,144.91000000000003C551.7203407021167,145.03809649096692,551.9120949144877,145.01840514006955,552.0358295240655,144.91000000000003C552.3770477656901,144.6110552552452,552.1416400536159,141.83894474475488,552.4828582952406,141.54000000000002C552.6065929048184,141.43159485993053,552.8013173134801,141.66301047090636,552.9298870664156,141.54000000000002C553.5416155661026,140.9547222881343,553.159480226215,131.439539780377,553.3769158375908,131.43C553.5029394189467,131.42447083538505,553.6929045489278,134.8043030552179,553.8239446087658,134.8C554.0086594579749,134.7939343877232,553.7797710473554,128.51970267087893,554.2709733799409,128.06C554.397336879577,127.94173989732789,554.5916386514797,128.17826010267208,554.7180021511159,128.06C555.2092044837017,127.60029732912113,555.0160213318993,121.32,555.165030922291,121.32C555.3140405126826,121.32,555.4753116400003,128.06150702676138,555.612059693466,128.06C555.7794391998192,128.05815540046834,555.8416528532653,120.4135311296853,556.059088464641,117.94999999999999C556.1851120459969,116.5221611387391,556.3571076454244,114.58000000000001,556.5061172358161,114.57999999999998C556.6551268262078,114.58000000000001,556.8041364165995,116.82666666666667,556.9531460069911,117.94999999999999C557.1021555973829,119.07333333333334,557.0589565365415,121.02105525524516,557.4001747781662,121.32C557.5239093877441,121.42840514006951,557.720840049705,121.43826010267207,557.8472035493412,121.32C558.338405881927,120.86029732912114,558.1452227301245,114.57999999999997,558.2942323205162,114.57999999999998C558.4432419109079,114.57999999999997,558.5565462424823,121.31393438772317,558.7412610916913,121.32C558.8723011515294,121.32430305521787,559.0392802724747,117.95,559.1882898628663,117.94999999999999C559.3372994532581,117.95,559.2941003924168,121.02105525524516,559.6353186340414,121.32C559.7590532436192,121.42840514006951,559.9586127956386,121.2115948599305,560.0823474052164,121.32C560.4235656468411,121.61894474475487,560.3803665859996,124.68999999999998,560.5293761763915,124.69C560.6783857667832,124.69,560.8273953571749,122.44333333333331,560.9764049475666,121.32C561.1254145379581,120.19666666666666,561.2974101373859,119.3778388612609,561.4234337187416,117.94999999999999C561.6408693301177,115.48646887031471,561.7030829835635,107.84184459953161,561.8704624899167,107.83999999999997C562.0072105433825,107.83849297323862,562.1684816707001,112.3333333333333,562.3174912610917,114.57999999999998C562.4665008514834,116.82666666666665,562.5798051830577,121.31393438772317,562.7645200322668,121.32C562.8955600921049,121.32430305521787,562.8703305618174,118.24894474475485,563.2115488034418,117.94999999999999C563.3352834130196,117.84159485993051,563.5348429650392,118.05840514006948,563.6585775746169,117.94999999999999C563.9997958162415,117.65105525524513,563.9565967554003,114.58000000000001,564.1056063457919,114.57999999999998C564.2546159361837,114.58000000000001,564.4036255265754,117.95,564.5526351169669,117.94999999999999C564.7016447073587,117.95,564.8506542977503,115.70333333333333,564.999663888142,114.57999999999998C565.1486734785337,113.45666666666668,565.2976830689255,111.21000000000001,565.446692659317,111.20999999999998C565.5957022497088,111.21000000000001,565.7447118401004,113.45666666666668,565.8937214304921,114.57999999999998C566.0427310208838,115.70333333333333,565.9995319600424,117.65105525524513,566.3407502016671,117.94999999999999C566.464484811245,118.05840514006948,566.6614154732059,118.06826010267208,566.7877789728421,117.94999999999999C567.2789813054279,117.49029732912113,566.7436054114318,111.66970267087888,567.2348077440172,111.20999999999998C567.3611712436532,111.09173989732787,567.5581019056143,111.10159485993047,567.6818365151922,111.20999999999998C568.0230547568168,111.50894474475483,567.9798556959756,114.57999999999998,568.1288652863674,114.57999999999998C568.277874876759,114.57999999999997,568.4268844671509,112.33333333333334,568.5758940575424,111.20999999999998C568.7249036479342,110.08666666666667,568.8987139066852,107.83386348162968,569.0229228287175,107.83999999999997C569.2703277249107,107.85222299224206,569.3209420095008,116.82666666666665,569.4699515998924,121.32C569.6189611902842,125.81333333333335,569.2016051813998,134.10795509200972,569.9169803710674,134.8C570.0472182540998,134.92599048035453,570.2376456426063,134.6817398973279,570.3640091422425,134.8C570.8552114748283,135.25970267087894,570.6742898599517,141.5415070267614,570.8110379134175,141.54000000000002C570.9784174197707,141.53815540046838,571.1183104565725,131.42922871315136,571.2580666845926,131.43C571.4194088240414,131.430890415204,571.4576905595745,144.89777700775798,571.7050954557677,144.91000000000003C571.8293043777998,144.9161365183703,571.8109059853182,141.83894474475488,572.1521242269428,141.54000000000002C572.2758588365206,141.43159485993053,572.4754183885401,141.43159485993053,572.5991529981178,141.54000000000002C572.9403712397424,141.83894474475488,572.8971721789013,144.91000000000005,573.0461817692928,144.91000000000003C573.1951913596847,144.91000000000005,573.3621704806296,142.85859044289006,573.4932105404679,141.54000000000002C573.677925389677,139.6813070542878,573.8034912581772,137.27445592906187,573.9402393116429,134.8C574.1076188179961,131.77126795298244,574.1698324714423,127.15353112968532,574.387268082818,124.69C574.5132916641738,123.26216113873913,574.7082732726373,122.74783886126089,574.834296853993,121.32C575.0517324653689,118.85646887031471,575.1323160347765,111.21,575.281325625168,111.20999999999998C575.4303352155598,111.21,575.5793448059515,121.32,575.7283543963431,121.32C575.8773639867347,121.32000000000002,575.9579475561424,111.21953978037698,576.1753831675181,111.20999999999998C576.301406748874,111.20447083538501,576.4734023483016,113.45666666666668,576.6224119386932,114.57999999999998C576.7714215290849,115.70333333333333,576.9204311194766,116.82666666666667,577.0694407098682,117.94999999999999C577.21845030026,119.07333333333334,577.3674598906517,121.32000000000002,577.5164694810433,121.32C577.665479071435,121.32000000000002,577.6222800105938,118.24894474475485,577.9634982522183,117.94999999999999C578.0872328617961,117.84159485993051,578.2615174330017,117.95,578.4105270233933,117.94999999999999C578.5595366137851,117.95,578.7289860416329,117.82698952909368,578.8575557945684,117.94999999999999C579.4692842942553,118.53527771186569,579.1648283377237,124.44763151643798,579.3045845657435,128.06C579.4659267051924,132.23031332251145,579.5665617383822,141.53693919668933,579.7516133369186,141.54000000000002C579.8825722526135,141.5421660957587,580.049632517702,134.8,580.1986421080936,134.8C580.3476516984853,134.8,580.1544685466833,141.08029732912118,580.6456708792687,141.54000000000002C580.7720343789047,141.6582601026721,580.9689650408659,141.6484051400695,581.0926996504437,141.54000000000002C581.4339178920684,141.24105525524516,581.4086883617806,138.1656969447821,581.5397284216187,138.17000000000002C581.7244432708278,138.17606561227686,581.8377476024021,142.6633333333334,581.9867571927938,144.91000000000003C582.1357667831854,147.1566666666667,582.2847763735772,151.64999999999998,582.4337859639688,151.64999999999998C582.5827955543606,151.64999999999998,582.7318051447522,144.91000000000003,582.8808147351439,144.91000000000003C583.0298243255356,144.91000000000003,583.2000306217403,151.65253767923804,583.3278435063189,151.64999999999998C583.5297472943311,151.6459912722992,582.9671421614374,135.58658532349924,583.774872277494,134.8C583.9064122267201,134.67190350903317,584.0955375490328,134.6817398973279,584.221901048669,134.8C584.7131033812548,135.25970267087894,584.1777274872586,141.08029732912118,584.668929819844,141.54000000000002C584.7952933194802,141.6582601026721,584.9669490006276,141.54000000000005,585.1159585910191,141.54000000000002C585.264968181411,141.54000000000005,585.4139777718025,141.54000000000005,585.5629873621941,141.54000000000002C585.711996952586,141.54000000000005,585.8814463804335,141.66301047090636,586.0100161333692,141.54000000000002C586.6217446330561,140.95472228813432,586.2896653981909,134.4587320470176,586.4570449045442,131.43C586.59379295801,128.95554407093815,586.7673256222536,124.68849297323862,586.9040736757194,124.69C587.0714531820726,124.69184459953166,587.1336668355185,132.3364688703147,587.3511024468944,134.8C587.4771260282502,136.22783886126086,587.6670911582311,136.85140955710997,587.7981312180693,138.17000000000002C587.9828460672783,140.02869294571224,588.0604451400354,144.9039343877232,588.2451599892444,144.91000000000003C588.3762000490825,144.9143030552179,588.3509705187948,141.83894474475488,588.6921887604194,141.54000000000002C588.8159233699973,141.43159485993053,589.0128540319582,141.6582601026721,589.1392175315945,141.54000000000002C589.6304198641801,141.08029732912115,589.4015314535604,136.65869294571226,589.5862463027695,134.8C589.7172863626076,133.48140955710997,589.8842654835528,132.55333333333334,590.0332750739445,131.43C590.1822846643362,130.30666666666667,590.331294254728,128.06,590.4803038451197,128.06C590.6293134355113,128.06,590.8031236942626,129.92812703108058,590.9273326162947,131.43C591.1747375124879,134.42149787222806,591.1269564912765,141.918502127772,591.3743613874698,144.91000000000003C591.498570309502,146.41187296891945,591.6723805682532,148.27999999999997,591.8213901586448,148.27999999999997C591.9703997490366,148.27999999999997,592.1194093394281,144.91000000000003,592.2684189298199,144.91000000000003C592.4174285202115,144.91000000000003,592.589424119639,148.28552916461496,592.7154477009949,148.27999999999997C592.9328833123709,148.270460219623,592.9950969658166,138.17184459953165,593.1624764721699,138.17000000000002C593.2992245256357,138.16849297323867,593.4604956529533,142.6633333333334,593.609505243345,144.91000000000003C593.7585148337366,147.1566666666667,593.871819165311,149.79130705428776,594.05653401452,151.64999999999998C594.1875740743582,152.96859044289,594.3545531953035,155.01999999999998,594.5035627856951,155.01999999999998C594.6525723760869,155.02,594.819551497032,152.96859044289,594.9505915568701,151.64999999999998C595.135306406079,149.79130705428778,595.2608722745795,147.38445592906191,595.3976203280452,144.91000000000003C595.5649998343983,141.88126795298245,595.6272134878444,137.26353112968533,595.8446490992202,134.8C595.9706726805761,133.37216113873916,595.9504596287705,131.72894474475487,596.2916778703952,131.43C596.4154124799732,131.3215948599305,596.5896970511786,131.43000000000004,596.7387066415703,131.43C596.887716231962,131.43000000000004,597.0593719131092,131.31173989732793,597.1857354127453,131.43C597.676937745331,131.88970267087893,597.4480493347114,138.16393438772317,597.6327641839205,138.17000000000002C597.7638042437586,138.17430305521793,597.738574713471,135.09894474475487,598.0797929550955,134.8C598.2035275646734,134.69159485993052,598.3778121358789,134.80000000000007,598.5268217262706,134.8C598.6758313166623,134.8,598.8452807445101,134.67698952909373,598.9738504974456,134.8C599.5855789971325,135.3852777118657,599.2534997622677,141.88126795298245,599.4208792686206,144.91000000000003C599.5576273220865,147.38445592906191,599.6831931905866,149.79130705428776,599.8679080397957,151.64999999999998C599.9989480996338,152.96859044289,599.973718569346,154.72105525524518,600.3149368109707,155.01999999999998C600.4386714205486,155.1284051400695,600.638230972568,155.1284051400695,600.7619655821458,155.01999999999998C601.1031838237706,154.72105525524515,601.0599847629293,152.77333333333334,601.2089943533208,151.64999999999998C601.3580039437127,150.52666666666667,601.5249830646576,148.27569694478208,601.6560231244958,148.27999999999997C601.840737973705,148.28606561227681,601.9540423052791,155.01999999999998,602.1030518956709,155.01999999999998C602.2520614860625,155.01999999999998,602.365365817637,150.1386929457122,602.5500806668459,148.27999999999997C602.6811207266838,146.96140955710993,602.8660693781827,146.22859044289,602.997109438021,144.91000000000003C603.18182428723,143.05130705428778,603.2951286188044,140.41666666666669,603.444138209196,138.17000000000002C603.5931477995878,135.92333333333337,603.706452131162,133.28869294571226,603.891166980371,131.43C604.0222070402092,130.11140955710994,603.9969775099215,128.35894474475484,604.3381957515461,128.06C604.461930361124,127.95159485993052,604.6614899131431,128.16840514006947,604.7852245227211,128.06C605.1264427643457,127.76105525524515,605.101213234058,124.68569694478208,605.2322532938963,124.69C605.4169681431052,124.69606561227684,605.4945672158623,131.42393438772316,605.6792820650713,131.43C605.8103221249095,131.4343030552179,606.0027421779977,129.61691470941216,606.1263108362463,128.06C606.4014648729255,124.59317133056483,606.371435819409,115.56053217399172,606.5733396074213,111.20999999999998C606.701152492,108.45594534810563,606.8356535293873,104.47606561227687,607.0203683785963,104.47000000000003C607.1514084384345,104.46569694478214,607.336357089933,106.52140955710992,607.4673971497714,107.83999999999997C607.6521119989804,109.69869294571221,607.4232235883609,114.12029732912109,607.9144259209464,114.57999999999998C608.0407894205824,114.69826010267205,608.2377200825434,114.68840514006945,608.3614546921215,114.57999999999998C608.702672933746,114.2810552552451,608.6594738729049,111.20999999999998,608.8084834632966,111.20999999999998C608.9574930536882,111.20999999999998,609.1244721746334,113.26140955710994,609.2555122344717,114.57999999999998C609.4402270836808,116.43869294571222,609.5657929521809,118.84554407093813,609.7025410056467,121.32C609.8699205119998,124.34873204701758,610.0098135488018,127.81763151643803,610.1495697768217,131.43C610.3109119162708,135.60031332251148,610.4352564085481,140.73968667748858,610.5965985479968,144.91000000000003C610.7363547760168,148.52236848356205,610.8762478128187,151.99126795298238,611.0436273191718,155.01999999999998C611.1803753726376,157.49445592906184,610.9994537577614,161.30029732912118,611.4906560903469,161.76C611.617019589983,161.87826010267207,611.8091151085864,161.88301047090633,611.9376848615219,161.76C612.5494133612088,161.17472228813432,612.2173341263439,151.65184459953164,612.384713632697,151.64999999999998C612.5214616861628,151.64849297323863,612.6827328134804,156.14333333333332,612.831742403872,158.39C612.9807519942636,160.63666666666666,613.1297615846553,165.13,613.278771175047,165.13C613.4277807654388,165.13,613.5890518927563,160.86445592906185,613.7257999462221,158.39C613.8931794525752,155.3612679529824,614.0384665220971,152.07871493096354,614.1728287173971,148.27999999999997C614.3462353848619,143.37741192188653,614.3447034518929,131.44450797208913,614.6198574885722,131.43C614.7434261468209,131.4234846289497,614.935846199909,134.8043030552179,615.0668862597472,134.8C615.2516011089563,134.7939343877232,615.0227126983368,128.51970267087893,615.5139150309222,128.06C615.6402785305584,127.94173989732789,615.8345803024613,128.1782601026721,615.9609438020973,128.06C616.452146134683,127.60029732912112,616.2712245198067,121.31849297323863,616.4079725732724,121.32C616.5753520796256,121.32184459953164,616.2432728447604,130.8447222881343,616.8550013444475,131.43C616.9835710973832,131.55301047090634,617.1734603626869,131.55301047090632,617.3020301156225,131.43C617.9137586153096,130.84472228813434,617.600049296406,121.32000000000002,617.7490588867976,121.32C617.8980684771893,121.32000000000001,617.5843591582857,130.8447222881343,618.1960876579726,131.43C618.3246574109083,131.55301047090634,618.5128785461153,131.30400951964543,618.6431164291477,131.43C619.358491618815,132.1220449079902,618.9288030608739,144.90910958479603,619.0901452003227,144.91000000000003C619.2299014283427,144.91077128684864,618.9254454718106,135.38527771186568,619.5371739714977,134.8C619.6657437244336,134.67698952909373,619.8351931522811,134.80000000000007,619.9842027426728,134.8C620.1332123330645,134.8,620.3048680142117,134.6817398973279,620.4312315138478,134.8C620.9224338464336,135.25970267087894,620.6935454358138,141.53393438772324,620.8782602850229,141.54000000000002C621.0093003448609,141.5443030552179,621.1992654748422,139.5978388612609,621.3252890561979,138.17000000000002C621.5427246675739,135.70646887031475,621.6049383210199,128.06184459953164,621.772317827373,128.06C621.9090658808386,128.05849297323866,622.0703370081563,134.8,622.219346598548,134.8C622.3683561889397,134.8,622.5296273162572,128.05849297323866,622.666375369723,128.06C622.8337548760761,128.06184459953164,622.9736479128779,138.1707712868486,623.1134041408981,138.17000000000002C623.274746280347,138.169109584796,623.3130280158801,127.68149787222805,623.5604329120732,124.69C623.6846418341053,123.18812703108053,623.8584520928565,121.31999999999998,624.0074616832483,121.32C624.15647127364,121.32000000000002,624.3054808640316,123.56666666666669,624.4544904544232,124.69C624.6035000448148,125.81333333333332,624.7525096352066,128.06000000000003,624.9015192255982,128.06C625.05052881599,128.06000000000003,625.1995384063817,124.69000000000003,625.3485479967733,124.69C625.4975575871651,124.69000000000003,625.6695531865926,126.63216113873912,625.7955767679483,128.06C626.0130123793242,130.52353112968532,626.0251699277476,135.70646887031475,626.2426055391234,138.17000000000002C626.3686291204792,139.5978388612609,626.5406247199068,140.4166666666667,626.6896343102984,141.54000000000002C626.8386439006902,142.66333333333338,627.0106395001176,144.91552916461504,627.1366630814734,144.91000000000003C627.3540986928493,144.90046021962308,627.4163123462953,134.80184459953165,627.5836918526486,134.8C627.7204399061144,134.79849297323867,627.5395182912382,141.08029732912118,628.0307206238236,141.54000000000002C628.1570841234596,141.6582601026721,628.3491796420631,141.41698952909368,628.4777493949987,141.54000000000002C629.0894778946855,142.12527771186572,628.707342554798,151.640460219623,628.9247781661737,151.64999999999998C629.0508017475296,151.65552916461496,629.245783355993,148.27447083538502,629.3718069373488,148.27999999999997C629.5892425487248,148.28953978037697,629.601400097148,158.38046021962302,629.8188357085238,158.39C629.9448592898798,158.395529164615,630.1348244198606,156.33859044289002,630.2658644796988,155.01999999999998C630.450579328908,153.16130705428776,630.5638836604822,150.52666666666664,630.7128932508739,148.27999999999997C630.8619028412655,146.03333333333333,631.0109124316573,143.7866666666667,631.1599220220489,141.54000000000002C631.3089316124407,139.29333333333338,631.4791379086454,134.797462320762,631.606950793224,134.8C631.8088545812362,134.80400872770073,631.8805728969343,151.64846842921614,632.053979564399,151.64999999999998C632.188341759699,151.65118672030192,632.333628829221,141.54184459953171,632.501008335574,141.54000000000002C632.6377563890399,141.53849297323865,632.8170781910543,148.28216609575864,632.9480371067491,148.27999999999997C633.1330887052854,148.2769391966893,633.1476609817311,137.79149787222804,633.3950658779241,134.8C633.5192747999564,133.29812703108058,633.7110545892609,132.74859044289002,633.8420946490992,131.43C634.0268094983082,129.5713070542878,634.1044085710652,124.69606561227681,634.2891234202742,124.69C634.4201634801124,124.68569694478208,634.5871426010576,126.93666666666664,634.7361521914494,128.06C634.8851617818409,129.18333333333334,635.0341713722328,130.3066666666667,635.1831809626244,131.43C635.3321905530162,132.55333333333337,635.5041861524437,133.37216113873916,635.6302097337995,134.8C635.8476453451754,137.26353112968536,635.9282289145829,144.91000000000005,636.0772385049745,144.91000000000003C636.2262480953664,144.91000000000005,636.3568877697962,134.80184459953165,636.5242672761495,134.8C636.6610153296153,134.79849297323864,636.480093714739,141.08029732912118,636.9712960473246,141.54000000000002C637.0976595469607,141.6582601026721,637.2897550655639,141.41698952909368,637.4183248184996,141.54000000000002C638.0300533181867,142.12527771186572,637.2536250899878,151.0647222881343,637.8653535896747,151.64999999999998C637.9939233426103,151.77301047090629,638.188647751272,151.54159485993048,638.3123823608497,151.64999999999998C638.6536006024744,151.9489447447548,638.6283710721865,155.02430305521787,638.7594111320248,155.01999999999998C638.9441259812338,155.01393438772317,639.057430312808,148.27999999999997,639.2064399031998,148.27999999999997C639.3554494935914,148.27999999999997,639.4687538251659,155.01393438772314,639.6534686743748,155.01999999999998C639.784508734213,155.0243030552179,639.7592792039253,151.9489447447548,640.1004974455499,151.64999999999998C640.2242320551278,151.5415948599305,640.4237916071471,151.75840514006947,640.5475262167249,151.64999999999998C640.8887444583497,151.35105525524511,640.6533367462754,148.57894474475484,640.9945549879,148.27999999999997C641.1182895974779,148.17159485993048,641.3178491494973,148.38840514006947,641.441583759075,148.27999999999997C641.7828020006998,147.9810552552451,641.7625889488944,146.33783886126093,641.88861253025,144.91000000000003C642.1060481416258,142.44646887031473,642.1682617950719,134.80184459953165,642.3356413014252,134.8C642.472389354891,134.79849297323867,642.5979552233911,141.5339343877232,642.7826700726002,141.54000000000002C642.9137101324384,141.5443030552179,643.1036752624193,138.164470835385,643.2296988437752,138.17000000000002C643.4471344551508,138.17953978037698,643.5277180245585,148.27999999999994,643.6767276149502,148.27999999999997C643.8257372053417,148.27999999999994,643.5120278864383,138.7552777118657,644.1237563861253,138.17000000000002C644.2523261390609,138.04698952909368,644.4444216576641,138.2882601026721,644.5707851573003,138.17000000000002C645.061987489886,137.71029732912115,644.8330990792664,133.28869294571226,645.0178139284753,131.43C645.1488539883135,130.11140955710994,645.3158331092586,128.05999999999997,645.4648426996504,128.06C645.6138522900421,128.05999999999997,645.5706532292008,131.13105525524514,645.9118714708255,131.43C646.0356060804032,131.53840514006947,646.2325367423643,131.3117398973279,646.3589002420006,131.43C646.8501025745863,131.88970267087893,646.6212141639666,138.1639343877232,646.8059290131756,138.17000000000002C646.9369690730139,138.1743030552179,647.103948193959,134.80000000000004,647.2529577843507,134.8C647.4019673747424,134.80000000000004,647.57396297417,138.175529164615,647.6999865555257,138.17000000000002C647.9174221669017,138.16046021962308,647.9295797153248,128.06953978037703,648.1470153267007,128.06C648.2730389080567,128.05447083538502,648.46802051652,130.00216113873913,648.5940440978758,131.43C648.8114797092518,133.89353112968533,648.8736933626977,138.51126795298245,649.0410728690508,141.54000000000002C649.1778209225166,144.0144559290619,649.3033867910169,148.27393438772316,649.4881016402259,148.27999999999997C649.6191417000639,148.28430305521786,649.7861208210093,146.03333333333333,649.9351304114009,144.91000000000003C650.0841400017927,143.78666666666672,650.2331495921844,141.54000000000005,650.382159182576,141.54000000000002C650.5311687729678,141.54000000000005,650.4879697121264,144.61105525524516,650.829187953751,144.91000000000003C650.9529225633289,145.01840514006952,651.1272071345345,144.91000000000003,651.276216724926,144.91000000000003C651.4252263153178,144.91000000000005,651.5742359057094,144.91000000000003,651.7232454961011,144.91000000000003C651.8722550864928,144.91000000000005,652.0212646768846,144.91000000000003,652.1702742672761,144.91000000000003C652.3192838576679,144.91000000000005,652.4935684288732,144.80159485993053,652.6173030384512,144.91000000000003C652.9585212800757,145.20894474475486,652.9332917497882,148.2843030552179,653.0643318096262,148.27999999999997C653.2490466588351,148.27393438772316,653.3266457315924,143.39869294571224,653.5113605808014,141.54000000000002C653.6424006406394,140.22140955710998,653.8323657706206,138.16447083538506,653.9583893519764,138.17000000000002C654.1758249633523,138.17953978037704,654.2380386167983,148.27815540046836,654.4054181231514,148.27999999999997C654.5421661766171,148.28150702676132,654.7034373039348,143.7866666666667,654.8524468943265,141.54000000000002C655.0014564847183,139.29333333333338,655.1627276120358,134.79849297323864,655.2994756655015,134.8C655.4668551718546,134.80184459953165,655.5290688253008,142.44646887031476,655.7465044366766,144.91000000000003C655.8725280180324,146.3378388612609,656.04452361746,148.27999999999997,656.1935332078516,148.27999999999997C656.3425427982432,148.27999999999997,656.4915523886349,144.91000000000003,656.6405619790266,144.91000000000003C656.7895715694183,144.91000000000003,656.93858115981,148.27999999999997,657.0875907502017,148.27999999999997C657.2366003405934,148.27999999999997,657.4035794615386,144.90569694478214,657.5346195213767,144.91000000000003C657.7193343705859,144.91606561227687,657.83263870216,151.64999999999998,657.9816482925518,151.64999999999998C658.1306578829434,151.64999999999998,658.2919290102611,147.38445592906191,658.4286770637268,144.91000000000003C658.5960565700801,141.88126795298245,658.7083263285487,134.80184459953165,658.8757058349019,134.8C659.0124538883676,134.79849297323864,659.1380197568678,141.53393438772324,659.3227346060769,141.54000000000002C659.453774665915,141.5443030552179,659.6455544552198,139.67187296891944,659.7697633772519,138.17000000000002C660.0171682734451,135.17850212777202,660.0317405498906,128.41113212501992,660.216792148427,124.69C660.3477510641219,122.05659703507332,660.479106070393,117.9560656122768,660.6638209196021,117.94999999999999C660.7948609794403,117.94569694478209,660.9798096309389,121.3243030552179,661.1108496907772,121.32C661.2955645399862,121.31393438772317,661.3731636127432,114.58606561227684,661.5578784619521,114.57999999999998C661.6889185217902,114.57569694478208,661.8558976427355,116.82666666666667,662.0049072331271,117.94999999999999C662.1539168235189,119.07333333333334,662.3259124229464,119.89216113873913,662.4519360043022,121.32C662.6693716156781,123.78353112968531,662.7315852691241,128.40126795298244,662.8989647754772,131.43C663.035712828943,133.9044559290619,663.2092454931866,135.69554407093813,663.3459935466523,138.17000000000002C663.5133730530054,141.19873204701756,663.5755867064515,145.81646887031474,663.7930223178273,148.27999999999997C663.9190458991831,149.70783886126085,663.8988328473777,151.3510552552451,664.2400510890023,151.64999999999998C664.36378569858,151.7584051400695,664.567684976036,151.541177879239,664.6870798601775,151.64999999999998C665.0156022992794,151.9494308240065,665,155.01999999999998,665,155.01999999999998';\n  const b =\n    'M-0.12381307019177062,337C-0.12381307019177062,337,-0.35084312166917037,183.91549525923068,1.1143176317259356,183.81833500000002C1.4662911699980166,183.79499432550978,2.0058359996478985,192.58867140838532,2.352448333643642,192.571573C2.9859717215330512,192.5403212511574,2.8854895360422836,169.45895335928694,3.590579035561348,163.06452700000003C3.933949323186812,159.95051662303962,4.474655964895483,159.00314831482038,4.828709737479055,156.17085500000002C5.38755939153974,151.70027380089095,5.422467766091922,138.82221470739648,6.06684043939676,138.76480500000002C6.412780432725562,138.73398383917723,6.932569914476771,141.79165756682187,7.304971141314467,143.63951C7.7845238652083255,146.01904745536575,7.897748178562713,150.09744286665614,8.543101843232172,151.887248C8.888984823138593,152.84650982318942,9.423942530188308,153.05963723024496,9.78123254514988,153.93823C10.319924457390826,155.26289847491196,10.616441112052689,157.42528576833783,11.019363247067586,159.241599C11.442888170243855,161.15078654531897,11.776187915944737,163.45411404167675,12.257493948985292,165.13C12.629275283070493,166.42452588288575,13.130775199851357,168.5311634953432,13.495624650902998,168.5C13.99968776386928,168.45694561570988,14.370542986478814,161.74362966575288,14.733755352820705,161.76C15.244241966590272,161.78300812766992,15.461399440968842,171.52708930456524,15.97188605473841,175.24C16.335098421080303,177.88174425602807,16.83073745427234,179.50011585356836,17.210016756656117,181.98C17.672416595013313,185.00336041341453,17.98574762021663,192.07616681513178,18.44814745857382,192.09C18.827426760957607,192.10134654528696,19.30699885810775,187.82988414643168,19.68627816049153,185.35C20.148677998848722,182.3266395865854,20.462009024052037,178.2633604134145,20.924408862409233,175.24C21.303688164793012,172.7601158535683,21.658476451360652,170.34366042217792,22.16253956432694,168.5C22.52738901537858,167.1655272412241,23.058756601806675,166.76115514792812,23.400670266244646,165.13C24.21284832320138,161.25537152963204,23.82662291120561,145.02898495842777,24.638800968162354,144.91000000000003C24.98071463260033,144.859909280606,25.281466444922522,147.86439080922227,25.876931670080058,148.27999999999997C26.226617099024622,148.52406543322817,26.771846635947043,148.58374767706525,27.115062371997766,148.27999999999997C28.0994719024294,147.40879254433327,27.89079323555828,141.19336041341458,28.353193073915474,138.17000000000002C28.732472376299256,135.69011585356833,28.78688515970819,132.1001245073952,29.591323775833178,131.43C29.933258197434387,131.14515709061712,30.487520056149677,131.14515709061712,30.829454477750886,131.43C31.633893093875873,132.1001245073952,31.563522066702316,136.32633957782207,32.06758517966859,138.17000000000002C32.43243463072022,139.50447275877585,32.94086643053465,140.20552724122416,33.305715881586295,141.54000000000002C33.80977899455258,143.38366042217797,34.03978347053772,148.2369456157099,34.543846583504006,148.27999999999997C34.908696034555646,148.31116349534315,35.36926705144914,144.91000000000003,35.78197728542171,144.91000000000003C36.194687519394286,144.91000000000003,36.655258536287775,146.94552724122414,37.020107987339415,148.27999999999997C37.5241711003057,150.1236604221779,37.84552845528456,155.01999999999995,38.25823868925713,155.01999999999998C38.67094892322969,155.01999999999998,39.08365915720228,148.28,39.49636939117483,148.27999999999997C39.909079625147406,148.28,40.23043698012624,154.9769456157099,40.734500093092535,155.01999999999998C41.09934954414417,155.05116349534316,41.55992056103767,151.64999999999995,41.97263079501024,151.64999999999998C42.38534102898281,151.65,42.79805126295539,155.01999999999998,43.21076149692795,155.01999999999998C43.62347173090051,155.01999999999995,44.03618196487307,151.64999999999995,44.44889219884565,151.64999999999998C44.86160243281822,151.65,45.32217344971172,155.0511634953432,45.68702290076336,155.01999999999998C46.19108601372964,154.97694561570992,46.42109048971478,148.3230543842901,46.925153602681064,148.27999999999997C47.2900030537327,148.2488365046568,47.56781907944123,151.23439080922225,48.163284304598776,151.64999999999998C48.51296973354334,151.89406543322818,49.05555516320532,151.96554863262344,49.40141500651647,151.64999999999998C50.54501451513123,150.60662573093924,50.12905909466461,138.19300812766997,50.639545708434184,138.17000000000002C51.002758074776075,138.15362966575287,51.49839710796812,144.92134654528698,51.87767641035189,144.91000000000003C52.34007624870909,144.89616681513175,52.525878251029106,134.8682112287433,53.1158071122696,134.8C53.46605045862932,134.7595026950129,53.98908836313565,136.83552724122413,54.353937814187304,138.17000000000002C54.85800092715359,140.01366042217796,55.08800540313871,143.06633957782208,55.59206851610501,144.91000000000003C55.95691796715665,146.24447275877586,56.417488984050145,147.1566666666667,56.83019921802271,148.27999999999997C57.24290945199529,149.4033333333333,57.65561968596787,150.52666666666664,58.068329919940425,151.64999999999998C58.481040153912986,152.77333333333328,58.941611170806475,155.05116349534316,59.30646062185813,155.01999999999998C59.810523734824415,154.97694561570992,60.13188108980328,148.27999999999997,60.54459132377584,148.27999999999997C60.95730155774841,148.27999999999997,61.27865891272726,154.9769456157099,61.78272202569354,155.01999999999998C62.147571476745185,155.0511634953432,62.6560032765596,151.61883650465677,63.02085272761125,151.64999999999998C63.52491584057753,151.69305438429004,63.84627319555641,156.14333333333335,64.25898342952895,158.39C64.67169366350151,160.63666666666666,64.69267551532167,164.45987549260485,65.49711413144665,165.13C65.83904855304787,165.41484290938286,66.38665570490447,165.45391474280575,66.73524483336436,165.13C68.02294627987222,163.93344666886472,67.23034621879769,151.72017270336366,67.97337553528206,148.27999999999997C68.31589359270141,146.69416584056404,68.84665678614812,146.24447275877586,69.21150623719977,144.91000000000003C69.71556935016606,143.0663395778221,69.94557382615119,138.21305438429007,70.44963693911748,138.17000000000002C70.81448639016911,138.13883650465678,71.27505740706263,140.4166666666667,71.6877676410352,141.54000000000002C72.10047787500774,142.66333333333336,72.56104889190124,143.57552724122417,72.92589834295289,144.91000000000003C73.42996145591917,146.75366042217794,73.35959042874562,150.97987549260478,74.1640290448706,151.64999999999998C74.50596346647181,151.93484290938284,75.05247431784373,151.89406543322818,75.4021597467883,151.64999999999998C75.99762497194584,151.23439080922225,76.22758021473346,149.40333333333334,76.64029044870601,148.27999999999997C77.05300068267859,147.15666666666667,77.46571091665113,144.91,77.87842115062372,144.91000000000003C78.29113138459628,144.91,78.70384161856886,147.1566666666666,79.11655185254143,148.27999999999997C79.529262086514,149.4033333333333,79.94197232048654,150.52666666666664,80.35468255445913,151.64999999999998C80.7673927884317,152.77333333333334,80.9973480312193,154.60439080922225,81.59281325637684,155.01999999999998C81.94249868532143,155.26406543322815,82.48125852934996,155.26406543322815,82.83094395829454,155.01999999999998C83.4264091834521,154.60439080922225,83.65636442623969,151.64999999999998,84.06907466021225,151.64999999999998C84.4817848941848,151.64999999999998,84.8944951281574,153.89666666666668,85.30720536212996,155.01999999999998C85.71991559610252,156.14333333333326,86.180486612996,158.42116349534314,86.54533606404766,158.39C87.04939917701395,158.34694561570993,87.27940365299906,153.4936604221779,87.78346676596537,151.64999999999998C88.148316217017,150.31552724122412,88.60888723391051,148.27999999999997,89.02159746788308,148.27999999999997C89.43430770185566,148.27999999999997,89.84701793582825,151.64999999999998,90.2597281698008,151.64999999999998C90.67243840377336,151.64999999999995,91.0851486377459,149.40333333333328,91.49785887171848,148.27999999999997C91.91056910569102,147.15666666666664,92.32327933966363,146.03333333333336,92.73598957363619,144.91000000000003C93.14869980760878,143.78666666666672,93.56141004158134,142.66333333333336,93.9741202755539,141.54000000000002C94.38683050952645,140.41666666666669,94.61678575231407,138.58560919077772,95.21225097747161,138.17000000000002C95.56193640641618,137.9259345667718,96.10069625044474,138.41406543322822,96.45038167938931,138.17000000000002C97.04584690454685,137.7543908092223,97.32366293025535,136.13447275877581,97.68851238130702,134.8C98.1925754942733,132.95633957782204,98.56343071688285,128.04362966575286,98.92664308322473,128.06C99.43712969699428,128.08300812766993,99.02117427652767,140.49662573093926,100.16477378514244,141.54000000000002C100.51063362845359,141.85554863262348,101.05968875100942,141.8437476770653,101.40290448706013,141.54000000000002C102.38731401749175,140.6687925443333,101.65662565854619,132.3012074556667,102.64103518897784,131.43C102.98425092502859,131.12625232293473,103.52948046195098,131.18593456677178,103.87916589089555,131.43C104.4746311160531,131.84560919077774,104.75244714176159,133.46552724122412,105.11729659281325,134.8C105.62135970577954,136.64366042217796,105.94271706075838,139.29333333333338,106.35542729473096,141.54000000000002C106.76813752870356,143.78666666666672,106.78911938052369,147.6098754926048,107.59355799664867,148.27999999999997C107.93549241824986,148.5648429093828,108.48975427696519,147.99515709061714,108.83168869856638,148.27999999999997C109.63612731469138,148.95012450739517,109.70660703414217,155.03637033424712,110.06981940048408,155.01999999999998C110.58030601425368,154.99699187233006,110.86146381989532,145.70759335551566,111.30795010240179,141.54000000000002C111.69524601972026,137.92490149669663,111.95615194307902,133.87264809615635,112.5460808043195,131.43C112.89632415067922,129.9797891366461,113.37150127226464,128.06,113.7842115062372,128.06C114.19692174020977,128.06,114.42687698299734,131.0143908092223,115.0223422081549,131.43C115.37202763709948,131.6740654332282,115.91078748112803,131.18593456677178,116.26047291007261,131.43C116.85593813523012,131.84560919077774,117.14836026563061,134.84049730498717,117.49860361199032,134.8C118.08853247323083,134.73178877125667,118.14680545266755,124.7582112287433,118.73673431390803,124.69C119.08697766026775,124.64950269501288,119.56215478185314,126.93666666666665,119.97486501582573,128.06C120.38757524979832,129.18333333333334,120.86275237138373,131.47049730498716,121.21299571774344,131.43C121.80292457898393,131.3617887712567,122.07874342789613,121.31096581757329,122.45112641966115,121.32C122.93073016254266,121.33163540709843,122.94622780509448,134.7298272966363,123.68925712157886,138.17000000000002C124.03177517899819,139.75583415943595,124.5625383724449,141.5711634953432,124.92738782349655,141.54000000000002C125.43145093646284,141.49694561570993,125.80230615907237,134.78362966575287,126.16551852541426,134.8C126.6760051391838,134.8230081276699,126.73438879622711,145.31280300565658,127.40364922733197,148.27999999999997C127.74831661861978,149.80809877881015,128.04631470409214,151.23439080922225,128.64177992924968,151.64999999999998C128.99146535819423,151.89406543322818,129.53132150270747,151.32608525719417,129.87991063116738,151.64999999999998C131.16761207767522,152.8465533311353,130.6384375902036,168.4883645929016,131.11804133308507,168.5C131.49042432485004,168.50903418242666,131.76624317376232,160.8326480961563,132.3561720350028,158.39C132.70641538136252,156.93978913664608,133.18159250294792,155.01999999999998,133.5943027369205,155.01999999999998C134.00701297089304,155.01999999999998,134.4821900924785,158.43049730498714,134.8324334388382,158.39C135.42236230007867,158.32178877125668,135.48063527951544,150.7226480961563,136.07056414075592,148.27999999999997C136.42080748711564,146.82978913664607,136.94384539162198,144.87883650465685,137.30869484267362,144.91000000000003C137.8127579556399,144.95305438429006,138.16754624220755,151.6613465452869,138.54682554459134,151.64999999999998C139.00922538294856,151.6361668151317,139.19502738526853,143.98264809615637,139.784956246509,141.54000000000002C140.13519959286876,140.08978913664612,140.4276217232692,138.58560919077775,141.02308694842674,138.17000000000002C141.37277237737132,137.92593456677182,141.91262852188453,138.49391474280577,142.26121765034443,138.17000000000002C143.54891909685227,136.97344666886474,142.75631903577772,121.42423227072878,143.49934835226213,121.32C143.8418664096815,121.2719515124122,144.14201382902235,124.27439080922231,144.73747905417986,124.69C145.0871644831244,124.93406543322821,145.562899522125,124.68999999999998,145.97560975609755,124.69C146.38831999007013,124.69000000000001,146.8718060364141,124.40515709061715,147.21374045801528,124.69C148.01817907414028,125.3601245073952,147.94780804696674,129.5863395778221,148.45187115993298,131.43C148.81672061098467,132.76447275877587,149.34748380443136,133.21416584056408,149.69000186185067,134.8C150.43303117833503,138.24017270336373,150.37165876732234,151.6198302858252,150.9281325637684,151.64999999999998C151.28253235861615,151.66921409522325,151.75355303171355,144.91000000000003,152.1662632656861,144.91000000000003C152.57897349965867,144.91000000000003,152.90033085463753,149.80633957782206,153.4043939676038,151.64999999999998C153.76924341865546,152.98447275877584,154.0470594443639,154.6043908092222,154.6425246695215,155.01999999999998C154.99221009846605,155.2640654332282,155.4679451374667,155.02,155.88065537143922,155.01999999999998C156.29336560541174,155.01999999999995,156.77557033730616,155.32374767706523,157.11878607335692,155.01999999999998C158.10319560378852,154.14879254433325,157.372507244843,145.78120745566676,158.3569167752746,144.91000000000003C158.70013251132534,144.60625232293472,159.25311305559117,144.62515709061717,159.59504747719234,144.91000000000003C160.39948609331736,145.58012450739523,160.32911506614374,151.6069456157099,160.83317817911004,151.64999999999998C161.19802763016165,151.68116349534313,161.72106553466807,149.73021086335393,162.07130888102776,148.27999999999997C162.66123774226827,145.83735190384365,162.89672934897285,138.17000000000004,163.30943958294543,138.17000000000002C163.722149816918,138.17,164.13486005089058,148.27999999999994,164.54757028486316,148.27999999999997C164.96028051883576,148.27999999999997,165.1957721255404,140.61264809615636,165.78570098678085,138.17000000000002C166.13594433314057,136.7197891366461,166.428366463541,135.21560919077768,167.02383168869855,134.8C167.3735171176431,134.55593456677178,167.84925215664373,134.80000000000004,168.26196239061628,134.8C168.67467262458882,134.79999999999998,169.15423324922284,134.48445136737655,169.50009309253397,134.8C170.64369260114879,135.84337426906083,170.06896336334685,145.31280300565663,170.7382237944517,148.27999999999997C171.0828911857395,149.80809877881012,171.63168710508162,151.69514795265164,171.9763544963694,151.64999999999998C172.6456149274743,151.56233363231067,172.70399858451762,138.19300812767,173.21448519828712,138.17000000000002C173.57769756462898,138.1536296657529,173.94855278723855,143.06633957782208,174.45261590020482,144.91000000000003C174.81746535125643,146.24447275877586,175.09528137696495,147.86439080922224,175.6907466021225,148.27999999999997C176.04043203106704,148.52406543322817,176.58694288243905,147.99515709061714,176.9288773040402,148.27999999999997C177.7333159201652,148.95012450739515,177.66294489299162,153.176339577822,178.1670080059579,155.01999999999998C178.53185745700955,156.35447275877584,178.9924284739031,157.26666666666668,179.40513870787564,158.39C179.81784894184818,159.5133333333333,180.23055917582073,161.75999999999996,180.64326940979333,161.76C181.05597964376597,161.76000000000002,181.46868987773854,158.39000000000001,181.88140011171106,158.39C182.29411034568363,158.39,182.70682057965618,160.63666666666663,183.11953081362876,161.76C183.5322410476013,162.88333333333333,184.00741816918674,163.6797891366461,184.35766151554643,165.13C184.94759037678688,167.57264809615634,185.133392379107,175.2261668151318,185.59579221746415,175.24C185.97507151984794,175.25134654528694,186.02948430325682,169.1701245073952,186.83392291938185,168.5C187.17585734098307,168.21515709061717,187.72236819235496,168.74406543322817,188.07205362129957,168.5C188.66751884645709,168.08439080922224,188.96551693192944,166.6580987788101,189.31018432321727,165.13C189.97944475432212,162.1628030056566,189.4047155165203,152.69337426906077,190.548315025135,151.64999999999998C190.89417486844613,151.33445136737652,191.4367602981081,151.40593456677178,191.7864457270527,151.64999999999998C192.38191095221026,152.0656091907777,192.65972697791878,153.68552724122415,193.02457642897042,155.01999999999998C193.52863954193668,156.86366042217793,193.7586440179218,161.71694561570988,194.2627071308881,161.76C194.62755658193973,161.7911634953432,195.13598838175412,159.72447275877585,195.5008378328058,158.39C196.0049009457721,156.54633957782204,196.23490542175722,153.4936604221779,196.7389685347235,151.64999999999998C197.10381798577515,150.3155272412241,197.5643890026686,148.27999999999997,197.9770992366412,148.27999999999997C198.3898094706138,148.28,198.61976471340145,151.2343908092223,199.21522993855893,151.64999999999998C199.5649153675035,151.89406543322818,200.1101449044259,151.34625232293473,200.45336064047663,151.64999999999998C201.43777017090824,152.52120745566668,201.3041954250759,158.1449014966966,201.69149134239436,161.76C202.13797762490086,165.9275933555156,202.26036161320724,175.15233363231073,202.92962204431205,175.24C203.27428943559985,175.28514795265164,203.57228752107213,172.28560919077768,204.16775274622972,171.87C204.5174381751743,171.6259345667718,204.9931732141749,171.87000000000003,205.40588344814745,171.87C205.81859368212,171.86999999999998,206.29432872112056,171.6259345667718,206.64401415006515,171.87C207.23947937522271,172.2856091907778,207.2866796268254,174.8243908092223,207.88214485198287,175.24C208.23183028092745,175.48406543322824,208.770590124956,174.9959345667718,209.12027555390057,175.24C209.71574077905817,175.65560919077774,210.00816290945858,177.15978913664608,210.3584062558183,178.61C210.94833511705878,181.0526480961563,210.61212742730436,187.84879254433335,211.596536957736,188.72C211.93975269378666,189.02374767706524,212.48880781634256,189.0355486326235,212.83466765965372,188.72C213.9782671682685,187.6766257309392,213.40353793046646,175.32766636768935,214.0727983615714,175.24C214.41746575285916,175.19485204734835,214.8982188295166,178.61000000000004,215.3109290634891,178.61C215.72363929746166,178.61,215.9535945402492,175.6556091907777,216.5490597654068,175.24C216.89874519435142,174.99593456677187,217.43750503837995,175.48406543322824,217.7871904673245,175.24C218.3826556924821,174.82439080922234,218.4298559440847,172.28560919077776,219.02532116924223,171.87C219.37500659818681,171.6259345667718,219.9202361351092,171.56625232293473,220.26345187115993,171.87C221.24786140159162,172.74120745566674,221.0391827347205,178.95663958658545,221.50158257307766,181.98C221.88086187546145,184.45988414643176,222.23565016202903,188.6769456157099,222.73971327499532,188.72C223.10456272604696,188.75116349534318,223.56513374294047,186.47333333333341,223.97784397691305,185.35C224.3905542108856,184.22666666666663,224.8511252277791,181.9488365046568,225.21597467883075,181.98C225.72003779179704,182.02305438429005,226.07482607836468,188.73134654528693,226.45410538074847,188.72C226.91650521910563,188.7061668151317,227.22983624430893,178.6238331848683,227.69223608266617,178.61C228.07151538504996,178.5986534547131,228.56715441824198,185.3663703342471,228.9303667845839,185.35C229.44085339835345,185.32699187233007,229.49923705539675,174.83719699434337,230.1684974865016,171.87C230.51316487778936,170.3419012211899,231.0417787373677,169.8344727587759,231.4066281884193,168.5C231.9106913013856,166.6563395778221,232.23204865636444,164.00666666666666,232.644758890337,161.76C233.05746912430956,159.51333333333335,233.5196772259128,157.66174425602807,233.88288959225468,155.01999999999998C234.3933762060243,151.3070893045652,234.61053368040288,145.25291069543485,235.1210202941724,141.54000000000002C235.48423266051432,138.8982557439719,235.85508788312376,136.64366042217796,236.3591509960901,134.8C236.72400044714172,133.46552724122415,237.00181647285032,131.84560919077774,237.59728169800783,131.43C237.9469671269524,131.1859345667718,238.48682327146562,131.10608525719422,238.83541239992553,131.43C240.1231138464333,132.6265533311353,239.33051378535893,148.17576772927112,240.07354310184326,148.27999999999997C240.4160611592627,148.3280484875878,240.94682435270926,144.87883650465682,241.31167380376095,144.91000000000003C241.81573691672722,144.9530543842901,242.13709427170608,149.40333333333334,242.54980450567862,151.64999999999998C242.96251473965123,153.89666666666665,242.9834965914713,157.71987549260479,243.78793520759635,158.39C244.12986962919754,158.67484290938285,244.6763804805695,158.14593456677176,245.02606590951405,158.39C245.62153113467164,158.8056091907777,245.66873138627426,161.3443908092223,246.26419661143177,161.76C246.61388204037638,162.0040654332282,247.1526418844049,162.0040654332282,247.50232731334947,161.76C248.09779253850704,161.3443908092223,248.32774778129468,158.39000000000001,248.7404580152672,158.39C249.15316824923977,158.39,249.6283453708252,161.80049730498715,249.9785887171849,161.76C250.56851757842537,161.69178877125665,250.80400918513004,155.01999999999998,251.21671941910262,151.64999999999998C251.6294296530752,148.28,251.99245028266316,144.56336041341456,252.45485012102029,141.54000000000002C252.83412942340408,139.0601158535683,253.1889177099717,134.84305438429007,253.69298082293798,134.8C254.05783027398962,134.7688365046568,254.56626207380404,138.20116349534322,254.9311115248557,138.17000000000002C255.43517463782197,138.12694561570993,255.36480361064838,132.10012450739518,256.1692422267734,131.43C256.5111766483747,131.14515709061718,257.0576874997465,131.18593456677175,257.40737292869113,131.43C258.00283815384864,131.8456091907777,258.2327933966363,134.8,258.64550363060886,134.8C259.0582138645813,134.79999999999998,259.5389669412388,131.38485204734835,259.8836343325265,131.43C260.55289476363146,131.51766636768934,260.45250460333926,144.8223336323107,261.1217650344442,144.91000000000003C261.46643242573197,144.95514795265169,261.9950462853102,141.5088365046568,262.3598957363619,141.54000000000002C262.8639588493282,141.58305438429008,263.18531620430707,148.27999999999997,263.59802643827965,148.27999999999997C264.0107366722522,148.27999999999997,264.33209402723116,141.58305438429008,264.8361571401974,141.54000000000002C265.20100659124904,141.50883650465684,265.4788226169575,144.4943908092223,266.07428784211504,144.91000000000003C266.4239732710596,145.15406543322825,266.9638294155729,144.5860852571943,267.31241854403277,144.91000000000003C268.6001199905406,146.10655333113533,268.1123174143471,156.45822615736026,268.5505492459505,161.76C268.94281138715763,166.5056277927165,269.11941951676346,175.15233363231067,269.7886799478682,175.24C270.13334733915593,175.28514795265164,270.61410041581337,171.87000000000003,271.0268106497859,171.87C271.4395208837585,171.87000000000006,271.91469800534384,175.28049730498714,272.26494135170356,175.24C272.85487021294404,175.1717887712567,272.5186625231897,166.0012074556667,273.5030720536213,165.13C273.84628778967203,164.82625232293472,274.3915173265944,164.88593456677174,274.741202755539,165.13C275.3366679806965,165.54560919077767,275.629090111097,167.04978913664607,275.97933345745673,168.5C276.5692623186972,170.94264809615632,276.627535298134,176.16735190384372,277.2174641593744,178.61C277.5677075057342,180.06021086335397,278.04288462731955,181.97999999999996,278.4555948612921,181.98C278.8683050952647,181.98,279.3288761121583,179.94447275877587,279.69372556320985,178.61C280.1977886761762,176.7663395778221,280.5774564702798,174.63429561103058,280.9318562651275,171.87C281.48833006157355,167.52954017035972,281.6903832241638,159.9181854904016,282.16998696704525,155.01999999999998C282.54236995881024,151.21685835607337,282.42370813853125,145.78120745566676,283.4081176689629,144.91000000000003C283.75133340501367,144.60625232293478,284.296562941936,144.6659345667718,284.64624837088064,144.91000000000003C285.2417135960381,145.32560919077773,285.4716688388258,147.15666666666664,285.88437907279837,148.27999999999997C286.2970893067709,149.4033333333333,286.7576603236644,150.31552724122412,287.1225097747161,151.64999999999998C287.62657288768236,153.4936604221779,287.8565773636675,156.54633957782204,288.36064047663376,158.39C288.7254899276854,159.72447275877585,289.1860609445789,161.76,289.5987711785515,161.76C290.011481412524,161.75999999999993,290.47205242941754,158.3588365046568,290.83690188046916,158.39C291.3409649934355,158.43305438429005,291.57096946942073,165.08694561570994,292.0750325823869,165.13C292.4398820334385,165.1611634953432,292.71769805914704,162.17560919077766,293.3131632843046,161.76C293.66284871324916,161.51593456677182,294.2093595646211,161.47515709061716,294.5512939862223,161.76C295.35573260234725,162.43012450739513,295.2853615751738,166.6563395778221,295.78942468814,168.5C296.1542741391916,169.83447275877586,296.4320901649001,171.4543908092223,297.0275553900577,171.87C297.3772408190022,172.11406543322818,297.92247035592476,171.56625232293473,298.26568609197545,171.87C299.2500956224071,172.7412074556667,298.9138879326527,181.91178877125665,299.5038167938931,181.98C299.85406014025284,182.02049730498712,300.3292372618383,179.73333333333335,300.74194749581085,178.61C301.1546577297833,177.48666666666665,301.5673679637559,175.23999999999998,301.9800781977285,175.24C302.3927884317011,175.24,302.85335944859463,178.6411634953432,303.21820889964624,178.61C303.7222720126126,178.56694561570998,304.04362936759145,174.11666666666667,304.45633960156397,171.87C304.86904983553654,169.62333333333336,305.2817600695092,165.13000000000002,305.6944703034817,165.13C306.1071805374544,165.13000000000005,306.1281623892744,171.19987549260483,306.93260100539936,171.87C307.2745354270006,172.1548429093829,307.8287972857159,172.1548429093829,308.1707317073171,171.87C308.9751703234421,171.19987549260483,308.90479929626844,165.17305438429008,309.40886240923476,165.13C309.7737118602864,165.0988365046568,310.3023257198647,168.54514795265166,310.6469931111525,168.5C311.31625354225736,168.41233363231072,310.7415243044554,156.0633742690608,311.8851238130702,155.01999999999998C312.23098365638134,154.7044513673765,312.7735690860434,155.26406543322815,313.1232545149879,155.01999999999998C313.7187197401454,154.60439080922228,313.99653576585393,152.98447275877584,314.3613852169056,151.64999999999998C314.8654483298719,149.80633957782203,315.1868056848507,144.91000000000003,315.59951591882333,144.91000000000003C316.01222615279596,144.91000000000003,316.03320800461603,150.9798754926048,316.83764662074105,151.64999999999998C317.1795810423423,151.93484290938287,317.7338429010576,151.93484290938284,318.0757773226587,151.64999999999998C318.88021593878364,150.97987549260478,318.9346287221926,144.89865345471307,319.3139080245764,144.91000000000003C319.7763078629336,144.92383318486833,320.13932849252154,151.65,320.5520387264941,155.01999999999998C320.96474896046675,158.38999999999996,321.20024056717136,162.68735190384373,321.79016942841184,165.13C322.14041277477156,166.58021086335393,322.61558989635694,167.37666666666664,323.02830013032957,168.5C323.44101036430203,169.62333333333328,323.8537205982746,170.74666666666664,324.26643083224724,171.87C324.67914106621976,172.99333333333334,325.0918513001924,175.23999999999998,325.50456153416496,175.24C325.91727176813754,175.24000000000004,326.3778427850311,171.83883650465685,326.7426922360827,171.87C327.246755349049,171.91305438429012,327.17638432187545,177.93987549260487,327.9808229380004,178.61C328.32275735960167,178.8948429093829,328.86926821097353,178.36593456677178,329.2189536399181,178.61C329.8144188650756,179.0256091907777,329.8616191166781,181.56439080922223,330.45708434183575,181.98C330.8067697707803,182.22406543322822,331.35199930770267,182.2837476770652,331.6952150437535,181.98C332.67962457418514,181.10879254433323,332.3434168844307,174.31264809615632,332.9333457456712,171.87C333.28358909203087,170.41978913664607,333.75876621361624,169.62333333333328,334.1714764475889,168.5C334.5841866815614,167.37666666666667,335.0593638031469,166.58021086335393,335.4096071495066,165.13C335.99953601074714,162.6873519038437,336.2604419341058,158.6350985033033,336.64773785142427,155.01999999999998C337.0942241339308,150.85240664448446,337.47315831936953,141.54000000000002,337.88586855334205,141.54000000000002C338.2985787873146,141.54000000000002,337.980399746645,153.9766257309392,339.1239992552597,155.01999999999998C339.4698590985708,155.33554863262344,340.01891422112675,155.32374767706528,340.36212995717744,155.01999999999998C341.3465394876092,154.1487925443333,341.0103317978546,144.9782112287433,341.6002606590951,144.91000000000003C341.9505040054549,144.86950269501293,342.42568112704026,148.27999999999997,342.83839136101284,148.27999999999997C343.2511015949854,148.27999999999997,343.663811828958,144.91,344.07652206293056,144.91000000000003C344.489232296903,144.91,344.71918753969067,147.86439080922224,345.31465276484823,148.27999999999997C345.6643381937928,148.52406543322817,346.1400732327933,148.27999999999994,346.55278346676596,148.27999999999997C346.9654937007385,148.27999999999992,347.44897974708243,147.9951570906171,347.7909141686836,148.27999999999997C348.59535278480865,148.95012450739512,348.61633463662884,152.77333333333328,349.0290448706014,155.01999999999998C349.4417551045741,157.2666666666667,349.90396320617725,161.77637033424713,350.2671755725191,161.76C350.77766218628875,161.73699187233012,350.836045843332,151.24719699434334,351.5053062744368,148.27999999999997C351.8499736657246,146.7519012211898,352.3987695850667,144.8648520473484,352.7434369763545,144.91000000000003C353.41269740745935,144.99766636768933,353.47108106450264,158.36699187233,353.9815676782722,158.39C354.3447800446141,158.4063703342471,354.71563526722366,151.69305438429006,355.2196983801899,151.64999999999998C355.58454783124154,151.6188365046568,355.86236385694997,154.60439080922225,356.4578290821076,155.01999999999998C356.8075145110522,155.26406543322818,357.3540253624242,154.73515709061715,357.6959597840253,155.01999999999998C358.5003984001504,155.69012450739518,358.55481118355925,161.77134654528692,358.934090485943,161.76C359.3964903243003,161.74616681513174,359.1878116574291,152.52120745566668,360.17222118786077,151.64999999999998C360.51543692391147,151.3462523229347,361.0606664608339,151.89406543322818,361.41035188977844,151.64999999999998C362.00581711493595,151.23439080922228,362.28363314064444,149.61447275877583,362.6484825916961,148.27999999999997C363.1525457046625,146.43633957782205,363.3825501806475,141.58305438429008,363.88661329361383,141.54000000000002C364.25146274466545,141.5088365046568,364.712033761559,144.91000000000003,365.12474399553156,144.91000000000003C365.53745422950414,144.91000000000003,366.0182073061614,141.4948520473483,366.3628746974493,141.54000000000002C367.0321351285541,141.6276663676893,366.93174496826197,152.05280300565656,367.60100539936695,155.01999999999998C367.9456727906546,156.5480987788101,368.474286650233,158.4211634953432,368.8391361012847,158.39C369.343199214251,158.34694561570996,369.66455656922983,153.89666666666665,370.0772668032024,151.64999999999998C370.489977037175,149.40333333333334,370.9026872711476,144.91000000000003,371.31539750512013,144.91000000000003C371.7281077390927,144.91000000000003,372.1408179730652,149.4033333333333,372.5535282070378,151.64999999999998C372.9662384410105,153.89666666666668,373.28759579598915,158.34694561570993,373.79165890895547,158.39C374.15650836000714,158.4211634953432,374.67954626451353,154.97950269501288,375.0297896108732,155.01999999999998C375.61971847211373,155.08821122874332,375.67799145155044,165.0617887712567,376.2679203127909,165.13C376.61816365915064,165.17049730498715,377.093340780736,161.76,377.50605101470865,161.76C377.9187612486811,161.75999999999996,378.3939383702666,165.17049730498715,378.7441817166263,165.13C379.3341105778668,165.0617887712567,379.51991258018694,155.0338331848683,379.98231241854404,155.01999999999998C380.3615917209278,155.00865345471303,380.7163800074955,161.71694561570993,381.22044312046177,161.76C381.58529257151343,161.7911634953432,381.8631085972218,158.8056091907777,382.45857382237944,158.39C382.80825925132405,158.14593456677179,383.3470190953526,158.6340654332282,383.69670452429716,158.39C384.2921697494547,157.97439080922226,384.52212499224225,155.01999999999998,384.93483522621483,155.01999999999998C385.3475454601874,155.01999999999998,385.808116477081,157.05552724122413,386.1729659281326,158.39C386.6770290410988,160.23366042217793,386.99838639607776,165.13000000000005,387.4110966300503,165.13C387.8238068640229,165.13000000000002,387.844788715843,159.06012450739513,388.649227331968,158.39C388.99116175356926,158.10515709061718,389.5454236122845,158.67484290938285,389.8873580338857,158.39C390.69179665001064,157.71987549260479,390.7127785018309,151.65000000000003,391.12548873580334,151.64999999999998C391.5381989697759,151.65,391.95090920374855,158.39,392.3636194377211,158.39C392.7763296716938,158.39000000000004,393.22247083725495,151.63865345471302,393.6017501396388,151.64999999999998C394.06414997799595,151.66383318486825,394.24995198031604,161.69178877125668,394.8398808415565,161.76C395.1901241879162,161.80049730498712,395.7277681971146,158.3495026950129,396.0780115434742,158.39C396.66794040471467,158.45821122874332,396.3317327149603,167.62879254433327,397.316142245392,168.5C397.65935798144267,168.80374767706527,398.21233852570845,168.21515709061714,398.55427294730964,168.5C399.3587115634346,169.17012450739514,399.44319075641926,172.37795552181734,399.79240364922737,175.24C400.3928218427176,180.16084802900716,400.5187495307441,195.44446190972374,401.03053435114504,195.46C401.3934304975389,195.471017741947,401.8559548190902,185.35000000000002,402.2686650530627,185.35C402.6813752870354,185.35000000000005,402.5223862245489,194.5887925443333,403.5067957549805,195.46C403.85001149103124,195.76374767706525,404.3322162229255,195.45999999999998,404.74492645689816,195.46C405.1576366908706,195.45999999999995,405.57034692484325,195.45999999999995,405.9830571588159,195.46C406.39576739278834,195.45999999999998,406.87150243178894,195.21593456677178,407.22118786073355,195.46C407.81665308589106,195.87560919077768,408.11680050523194,198.8780484875878,408.45931856265133,198.83C409.20234787913574,198.72576772927115,409.21784552168754,186.87818549040165,409.697449264569,181.98C410.069832256334,178.17685835607335,410.34565110524613,174.31264809615632,410.93557996648667,171.87C411.28582331284645,170.4197891366461,411.82346732204473,169.95021086335393,412.1737106684044,168.5C412.76363952964493,166.05735190384365,413.0489452239281,158.37898225805296,413.41184137032207,158.39C413.92362619072304,158.40553809027622,414.04955387874975,178.57377589544473,414.64997207223985,178.61C414.99918496504796,178.6310685227035,415.3840396611912,171.91305438429004,415.8881027741575,171.87C416.2529522252092,171.83883650465683,416.7135232421027,175.24,417.12623347607524,175.24C417.53894371004776,175.23999999999998,418.0196967867052,173.39809877881018,418.3643641779929,171.87C419.0336246090977,168.9028030056566,418.9332344488057,158.47766636768932,419.6024948799106,158.39C419.94716227119835,158.34485204734833,420.4757761307767,160.42552724122416,420.84062558182836,161.76C421.3446886947947,163.60366042217794,421.57469317077977,166.65633957782202,422.07875628374603,168.5C422.44360573479764,169.83447275877586,422.96664363930404,171.9104973049872,423.31688698566376,171.87C423.90681584690424,171.8017887712567,424.0926178492242,164.78336041341456,424.5550176875814,161.76C424.9342969899652,159.28011585356828,425.38043815552663,157.26666666666665,425.7931483894992,155.01999999999998C426.2058586234719,152.77333333333337,426.22684047529185,148.95012450739517,427.0312790914169,148.27999999999997C427.3732135130182,147.9951570906171,427.9274753717334,148.56484290938286,428.2694097933346,148.27999999999997C429.0738484094596,147.6098754926048,429.1443281289104,141.52362966575285,429.5075404952523,141.54000000000002C430.01802710902183,141.56300812766995,430.2351845834003,151.30708930456518,430.74567119716994,155.01999999999998C431.1088835635118,157.66174425602804,431.1793632829627,161.08987549260482,431.9838018990877,161.76C432.3257363206889,162.04484290938285,432.87999817940425,161.47515709061716,433.2219326010054,161.76C434.0263712171303,162.43012450739513,433.95600018995685,168.4569456157099,434.4600633029231,168.5C434.8249127539748,168.5311634953432,435.3479506584811,165.0895026950129,435.6981940048408,165.13C436.28812286608127,165.19821122874333,436.3463958455181,175.17178877125667,436.93632470675857,175.24C437.28656805311834,175.2804973049872,437.8242120623166,173.32021086335394,438.17445540867624,171.87C438.7643842699167,169.42735190384371,438.95018627223675,164.78336041341456,439.4125861105939,161.76C439.7918654129777,159.28011585356825,440.23800657853917,157.26666666666665,440.65071681251163,155.01999999999998C441.06342704648426,152.77333333333334,441.5256351480875,150.9217442560281,441.8888475144293,148.27999999999997C442.39933412819886,144.5670893045652,442.45771778524227,134.88766636768935,443.1269782163471,134.8C443.47164560763485,134.75485204734832,444.00025946721314,138.2011634953432,444.36510891826475,138.17000000000002C444.869172031231,138.12694561570993,445.1905293862099,133.67666666666668,445.6032396201825,131.43C446.01594985415517,129.18333333333337,446.4286600881277,124.69000000000004,446.84137032210015,124.69C447.2540805560727,124.68999999999998,447.27506240789296,130.75987549260483,448.07950102401793,131.43C448.4214354456191,131.71484290938287,448.9744159898849,131.12625232293473,449.3176317259356,131.43C450.30204125636715,132.30120745566668,450.0933625894961,138.5166395865855,450.55576242785327,141.54000000000002C450.9350417302371,144.01988414643174,451.38118289579836,146.0333333333333,451.793893129771,148.27999999999997C452.20660336374357,150.52666666666667,452.52796071872234,153.176339577822,453.03202383168866,155.01999999999998C453.39687328274033,156.35447275877587,453.67468930844893,157.9743908092223,454.27015453360644,158.39C454.61983996255094,158.63406543322816,455.0955750015514,158.38999999999993,455.5082852355241,158.39C455.9209954694966,158.38999999999993,456.3967305084973,158.14593456677176,456.74641593744184,158.39C457.34188116259935,158.80560919077766,457.38908141420194,161.34439080922223,457.9845466393595,161.76C458.3342320683041,162.0040654332282,458.8768174979662,162.0755486326235,459.2226773412772,161.76C460.366276849892,160.71662573093923,459.31720853458023,149.32337426906076,460.46080804319496,148.27999999999997C460.8066678865062,147.96445136737657,461.349253316168,148.52406543322817,461.6989387451126,148.27999999999997C462.2944039702701,147.86439080922224,462.3416042218728,145.32560919077773,462.93706944703035,144.91000000000003C463.2867548759749,144.6659345667718,463.7624899149754,144.91000000000003,464.175200148948,144.91000000000003C464.5879103829206,144.91000000000003,465.0006206168932,144.91,465.4133308508658,144.91000000000003C465.8260410848383,144.91000000000003,466.301776123839,144.66593456677182,466.6514615527835,144.91000000000003C467.2469267779409,145.32560919077773,467.29412702954346,147.86439080922224,467.88959225470114,148.27999999999997C468.2392776836457,148.52406543322817,468.779133828159,148.60391474280578,469.12772295661887,148.27999999999997C470.41542440312685,147.0834466688647,469.88624991565507,131.4416354070984,470.36585365853654,131.43C470.7382366503015,131.42096581757332,471.2410882140603,137.5853390093124,471.6039843604543,141.54000000000002C472.11576918085524,147.1171754122426,472.2416968688819,161.7237758954447,472.842115062372,161.76C473.19132795518,161.78106852270346,473.5761826513235,156.86366042217793,474.0802457642897,155.01999999999998C474.4450952153414,153.68552724122415,474.72291124104976,152.06560919077765,475.3183764662074,151.64999999999998C475.66806189515194,151.40593456677175,476.20682173918067,151.40593456677175,476.55650716812517,151.64999999999998C477.15197239328256,152.06560919077765,477.3819276360703,155.02,477.79463787004283,155.01999999999998C478.20734810401547,155.02,478.6881011806727,151.60485204734832,479.0327685719605,151.64999999999998C479.7020290030654,151.7376663676893,479.60163884277347,165.04233363231072,480.27089927387823,165.13C480.61556666516594,165.17514795265163,481.16711631135786,161.70990928060596,481.5090299757959,161.76C482.3212080327527,161.8789849584277,482.2353758573128,181.96446190972372,482.7471606777137,181.98C483.1100568241075,181.99101774194696,483.61290838786647,175.67314164392664,483.98529137963135,171.87C484.4648951225129,166.97181450959837,484.48039276506483,158.4601727033637,485.2234220815491,155.01999999999998C485.5659401389685,153.43416584056408,486.0488425494942,151.65,486.46155278346674,151.64999999999998C486.8742630174394,151.65,487.3494401390248,155.0604973049871,487.6996834853844,155.01999999999998C488.28961234662495,154.95178877125673,487.95340465687053,145.78120745566673,488.9378141873022,144.91000000000003C489.2810299233529,144.60625232293472,489.8340104676187,144.6251570906172,490.17594488921986,144.91000000000003C490.98038350534483,145.58012450739517,491.0596757962898,151.66921409522323,491.4140755911376,151.64999999999998C491.97054938758373,151.61983028582517,492.1726025501738,134.8116354070984,492.65220629305526,134.8C493.02458928482014,134.79096581757332,492.90592746454143,144.0387925443333,493.89033699497304,144.91000000000003C494.23355273102374,145.21374767706527,494.78653327528957,144.62515709061717,495.1284676968907,144.91000000000003C495.93290631301556,145.5801245073952,495.8625352858422,149.8063395778221,496.3665983988084,151.64999999999998C496.73144784986,152.98447275877584,497.19201886675353,153.89666666666665,497.6047291007261,155.01999999999998C498.0174393346987,156.1433333333333,498.43014956867125,157.26666666666665,498.84285980264383,158.39C499.25557003661635,159.51333333333332,499.668280270589,160.63666666666666,500.08099050456156,161.76C500.49370073853396,162.88333333333327,500.96887786011945,165.17049730498715,501.3191212064792,165.13C501.90905006771965,165.0617887712567,502.0948520700398,158.04336041341452,502.55725190839695,155.01999999999998C502.9365312107807,152.54011585356824,503.3826723763422,148.28000000000003,503.7953826103146,148.27999999999997C504.20809284428725,148.28,504.2290746961074,154.34987549260484,505.0335133122324,155.01999999999998C505.37544773383365,155.3048429093828,505.9219585852056,155.26406543322818,506.27164401415007,155.01999999999998C506.86710923930764,154.60439080922228,507.15953136970796,153.10021086335388,507.50977471606774,151.64999999999998C508.0997035773083,149.2073519038437,508.28550557962825,141.5538331848683,508.74790541798546,141.54000000000002C509.12718472036914,141.52865345471307,509.4819730069369,146.43633957782203,509.9860361199032,148.27999999999997C510.3508855709548,149.6144727587758,510.8593173707693,151.68116349534318,511.2241668218209,151.64999999999998C511.7282299347873,151.60694561570995,512.0830182213547,144.89865345471307,512.4622975237386,144.91000000000003C512.9246973620958,144.92383318486833,513.1104993644159,152.5773519038437,513.7004282256563,155.01999999999998C514.050671572016,156.47021086335388,514.5883155812141,156.939789136646,514.938558927574,158.39C515.5284877888143,160.83264809615625,515.5867607682511,166.05735190384362,516.1766896294916,168.5C516.5269329758512,169.95021086335387,517.0701529401216,171.91514795265164,517.4148203314094,171.87C518.0840807625143,171.78233363231072,517.9836906022223,161.3571969943434,518.6529510333271,158.39C518.9976184246149,156.86190122118984,519.5262322841932,154.9888365046568,519.8910817352448,155.01999999999998C520.3951448482112,155.0630543842901,520.6251493241964,161.71694561570993,521.1292124371626,161.76C521.4940618882143,161.7911634953432,521.7718779139226,158.8056091907777,522.3673431390803,158.39C522.7170285680246,158.1459345667717,523.1927636070253,158.38999999999996,523.605473840998,158.39C524.0181840749706,158.38999999999996,524.4939191139713,158.14593456677179,524.8436045429157,158.39C525.4390697680733,158.80560919077772,525.6690250108608,160.63666666666666,526.0817352448333,161.76C526.4944454788059,162.88333333333333,526.9550164956995,165.1611634953432,527.3198659467511,165.13C527.8239290597173,165.08694561570994,528.1452864146962,160.63666666666668,528.5579966486688,158.39C528.9707068826415,156.14333333333335,529.4469144577783,151.6289314772965,529.7961273505865,151.64999999999998C530.3965455440767,151.68622410455527,529.6139610277833,170.5340117895949,531.0342580525042,171.87C531.3853860948142,172.20028508593896,531.8596785204493,171.87,532.2723887544219,171.87C532.6850989883944,171.87,533.1685850347385,172.15484290938292,533.5105194563396,171.87C534.3149580724647,171.19987549260483,534.3359399242847,167.3766666666667,534.7486501582573,165.13C535.16136039223,162.88333333333335,535.1823422440499,159.06012450739522,535.986780860175,158.39C536.3287152817763,158.10515709061715,536.8752261331482,158.63406543322822,537.2249115620928,158.39C537.8203767872502,157.97439080922229,538.0503320300378,155.01999999999998,538.4630422640104,155.01999999999998C538.875752497983,155.01999999999998,539.2884627319556,157.26666666666665,539.7011729659282,158.39C540.1138831999007,159.5133333333333,540.5265934338731,160.63666666666666,540.9393036678458,161.76C541.3520139018185,162.88333333333333,541.8327669784758,165.17514795265166,542.1774343697635,165.13C542.8466948008685,165.0423336323107,542.9690787891747,151.65675734546187,543.4155650716813,151.64999999999998C543.8028609889996,151.64413847096344,544.1912959352416,161.74616681513166,544.6536957735989,161.76C545.0329750759827,161.77134654528692,545.3877633625505,155.06305438429004,545.8918264755167,155.01999999999998C546.2566759265683,154.98883650465677,546.7797138310746,156.93978913664606,547.1299571774343,158.39C547.7198860386748,160.8326480961563,547.905688040995,165.4766395865855,548.3680878793521,168.5C548.7473671817359,170.9798841464317,549.1935083472973,175.24000000000004,549.6062185812698,175.24C550.0189288152425,175.24000000000004,550.4650699808036,170.9798841464317,550.8443492831875,168.5C551.3067491215448,165.4766395865855,551.0980704546736,159.2612074556667,552.0824799851052,158.39C552.425695721156,158.08625232293468,552.9709252580784,158.14593456677179,553.320610687023,158.39C553.9160759121804,158.80560919077772,554.146031154968,161.76,554.5587413889406,161.76C554.971451622913,161.76,555.4522046995704,159.91809877881013,555.7968720908583,158.39C556.4661325219631,155.42280300565662,556.5885165102694,144.91675734546192,557.035002792776,144.91000000000003C557.4222987100945,144.90413847096352,557.8107336563365,155.00616681513168,558.2731334946938,155.01999999999998C558.6524127970775,155.0313465452869,559.1319848942277,150.7598841464317,559.5112641966115,148.27999999999997C559.9736640349687,145.25663958658546,560.1594660372887,140.6126480961563,560.7493948985291,138.17000000000002C561.0996382448888,136.71978913664609,561.6428582091592,134.75485204734832,561.9875256004469,134.8C562.6567860315519,134.88766636768938,562.7791700198579,144.11240664448437,563.2256563023645,148.27999999999997C563.612952219683,151.89509850330333,563.4793774738508,157.51879254433328,564.4637870042823,158.39C564.807002740333,158.69374767706526,565.3522322772556,158.14593456677179,565.7019177062,158.39C566.2973829313574,158.80560919077772,566.34458318296,161.34439080922226,566.9400484081176,161.76C567.2897338370622,162.00406543322822,567.8362446884341,162.04484290938285,568.1781791100354,161.76C568.9826177261604,161.0898754926048,568.9122466989868,156.86366042217793,569.416309811953,155.01999999999998C569.7811592630047,153.68552724122412,570.2895910628191,151.6188365046568,570.6544405138708,151.64999999999998C571.1585036268372,151.6930543842901,571.0881325996634,157.7198754926048,571.8925712157885,158.39C572.2345056373897,158.67484290938282,572.788767496105,158.67484290938285,573.1307019177061,158.39C573.9351405338311,157.71987549260484,573.9561223856515,153.89666666666668,574.368832619624,151.64999999999998C574.7815428535965,149.4033333333333,575.1029002085753,144.9530543842901,575.6069633215416,144.91000000000003C575.9718127725934,144.87883650465682,576.4323837894867,147.15666666666664,576.8450940234593,148.27999999999997C577.2578042574319,149.4033333333333,577.6705144914044,151.64999999999998,578.083224725377,151.64999999999998C578.4959349593496,151.64999999999998,578.9711120809349,149.73021086335388,579.3213554272947,148.27999999999997C579.9112842885353,145.83735190384368,579.9695572679722,138.23821122874335,580.5594861292125,138.17000000000002C580.909729475572,138.12950269501286,581.4327673800785,141.5711634953432,581.7976168311302,141.54000000000002C582.3016799440965,141.49694561570993,582.5316844200814,134.8430543842901,583.0357475330478,134.8C583.4005969840994,134.7688365046568,583.861168000993,137.04666666666668,584.2738782349655,138.17000000000002C584.6865884689381,139.29333333333332,585.0992987029107,140.41666666666669,585.5120089368833,141.54000000000002C585.9247191708558,142.66333333333336,586.3374294048284,144.91000000000003,586.750139638801,144.91000000000003C587.1628498727736,144.91000000000003,587.6234208896669,142.87447275877585,587.9882703407187,141.54000000000002C588.4923334536849,139.69633957782207,588.7223379296701,136.64366042217796,589.2264010426363,134.8C589.5912504936878,133.46552724122412,590.1142883981944,132.88021086335394,590.4645317445542,131.43C591.0544606057947,128.98735190384372,591.3153665291532,121.31413847096347,591.7026624464718,121.32C592.1491487289782,121.32675734546187,592.43030653462,131.08708930456524,592.9407931483895,134.8C593.3040055147313,137.4417442560281,593.7996445479233,139.06011585356828,594.1789238503072,141.54000000000002C594.6413236886644,144.56336041341456,594.4326450217931,150.7787925443332,595.4170545522248,151.64999999999998C595.7602702882757,151.95374767706528,596.305499825198,151.40593456677178,596.6551852541427,151.64999999999998C597.2506504793002,152.0656091907777,597.5507978986409,153.43416584056405,597.8933159560603,155.01999999999998C598.6363452725446,158.46017270336367,598.6518429150966,166.97181450959837,599.131446657978,171.87C599.5038296497429,175.6731416439266,599.9071775215385,181.96616681513171,600.3695773598957,181.98C600.7488566622795,181.99134654528692,601.1036449488471,175.2830543842901,601.6077080618135,175.24C601.9725575128651,175.2088365046568,602.4809893126794,177.27552724122415,602.8458387637312,178.61C603.3499018766976,180.45366042217796,603.6712592316762,185.35,604.0839694656488,185.35C604.4966796996214,185.35,604.8180370546003,180.45366042217793,605.3221001675665,178.61C605.6869496186181,177.27552724122415,606.1953814184327,176.5744727587759,606.5602308694843,175.24C607.0642939824506,173.39633957782206,606.9939229552771,169.17012450739523,607.798361571402,168.5C608.1402959930033,168.21515709061717,608.6868068443749,168.74406543322814,609.0364922733197,168.5C609.6319574984772,168.08439080922227,609.9312047811436,166.85562575556673,610.2746229752374,165.13C611.2731921857235,160.11233705154066,610.9769383320406,142.88256255683714,611.512753677155,134.8C611.8705659461064,129.40254344379346,612.2403977653032,121.34300812766993,612.7508843790728,121.32C613.1140967454147,121.30362966575287,613.6097357786067,125.58011585356824,613.9890150809905,128.06C614.4514149193477,131.08336041341457,614.6372169216678,138.1017887712567,615.2271457829082,138.17000000000002C615.5773891292679,138.21049730498714,616.1150331384661,134.75950269501286,616.465276484826,134.8C617.0552053460663,134.8682112287433,617.1134783255029,142.4673519038437,617.7034071867436,144.91000000000003C618.0536505331031,146.3602108633539,618.5912945423015,146.829789136646,618.9415378886614,148.27999999999997C619.5314667499019,150.7226480961563,619.7669583566064,158.39000000000004,620.179668590579,158.39C620.5923788245517,158.39000000000001,620.8278704312563,148.34821122874328,621.4177992924967,148.27999999999997C621.7680426388565,148.23950269501287,622.3140163299765,150.0188448520719,622.6559299944145,151.64999999999998C623.4681080513711,155.524628470368,623.0818826393754,167.99537152963205,623.8940606963321,171.87C624.2359743607702,173.50115514792813,624.5367261730922,174.82439080922228,625.1321913982499,175.24C625.4818768271944,175.48406543322818,626.0168940033755,175.57536474255977,626.3703221001675,175.24C627.9140845552245,173.77513768992105,626.730999752067,151.7824578384467,627.6084528020853,151.64999999999998C627.9505293914002,151.59836108256394,628.2511182788452,154.60439080922225,628.846583504003,155.01999999999998C629.1962689329474,155.26406543322815,629.7350287769759,154.77593456677172,630.0847142059207,155.01999999999998C630.6801794310782,155.43560919077765,630.9809312434003,158.440090719394,631.3228449078384,158.39C632.1350229647952,158.27101504157224,631.9605574162657,138.20622410455533,632.560975609756,138.17000000000002C632.9101885025641,138.1489314772965,633.2950431987075,143.0663395778221,633.7991063116738,144.91000000000003C634.1639557627257,146.2444727587759,634.4417717884339,147.86439080922224,635.0372370135915,148.27999999999997C635.3869224425359,148.52406543322812,635.9256822865644,148.52406543322815,636.2753677155092,148.27999999999997C636.8708329406668,147.86439080922227,637.1007881834544,146.03333333333336,637.513498417427,144.91000000000003C637.9262086513995,143.7866666666667,638.1561638941872,141.95560919077772,638.7516291193447,141.54000000000002C639.1013145482891,141.29593456677185,639.6465440852115,141.84374767706527,639.9897598212623,141.54000000000002C640.9741693516941,140.66879254433337,640.765490684823,134.45336041341457,641.22789052318,131.43C641.6071698255636,128.95011585356826,641.9619581121317,126.53366042217796,642.4660212250977,124.69C642.8308706761495,123.35552724122417,643.3539085806557,121.27950269501288,643.7041519270155,121.32C644.2940807882561,121.38821122874332,644.3523537676928,128.9873519038437,644.9422826289332,131.43C645.2925259752928,132.8802108633539,645.830169984491,134.84049730498714,646.1804133308508,134.8C646.7703421920912,134.73178877125667,647.0312481154504,128.30509850330338,647.4185440327686,124.69C647.8650303152752,120.52240664448442,648.2101884521798,111.21675734546189,648.6566747346862,111.20999999999998C649.0439706520046,111.20413847096347,649.3048765753636,118.87735190384366,649.894805436604,121.32C650.2450487829637,122.77021086335394,650.7910224740839,123.05884485207193,651.1329361385217,124.69C651.9451141954783,128.56462847036798,651.7706486469494,139.9891519709929,652.3710668404394,144.91000000000003C652.7202797332475,147.7720444781827,652.8047589262321,150.97987549260478,653.6091975423572,151.64999999999998C653.9511319639583,151.9348429093828,654.5053938226736,151.36515709061712,654.8473282442748,151.64999999999998C655.6517668603996,152.32012450739512,655.2810203300676,157.7198754926048,656.0854589461925,158.39C656.4273933677938,158.67484290938287,656.9739042191653,158.1459345667717,657.3235896481102,158.39C657.9190548732677,158.8056091907777,658.2114770036683,160.3097891366461,658.5617203500279,161.76C659.1516492112685,164.20264809615634,659.3871408179732,168.5,659.7998510519457,171.87C660.2125612859182,175.24,660.4480528926229,181.91178877125674,661.0379817538633,181.98C661.3882251002232,182.02049730498715,661.9112630047292,178.57883650465678,662.276112455781,178.61C662.7801755687473,178.6530543842901,663.159843362851,185.36921409522327,663.5142431576987,185.35C664.0707169541447,185.3198302858252,664.5125187473049,168.49560722426656,664.7523738596165,168.5C664.9039185732673,168.50277543361173,665,175.24,665,175.24';\n\n  console.time('build interpolator   ');\n  const interpolator = interpolatePath(a, b);\n  console.timeEnd('build interpolator   ');\n\n  console.time('interpolate all      ');\n  console.time('interpolate t=0      ');\n  t.ok(interpolator(0));\n  console.timeEnd('interpolate t=0      ');\n  console.time('interpolate t=0.5    ');\n  t.ok(interpolator(0.5));\n  console.timeEnd('interpolate t=0.5    ');\n  console.time('interpolate t=1      ');\n  t.ok(interpolator(1));\n  console.timeEnd('interpolate t=1      ');\n  console.timeEnd('interpolate all      ');\n\n  t.end();\n});\n\ntape(\n  'interpolatePath() interpolates line to line multiple times',\n  function (t) {\n    const a = 'M0,0L10,10L100,100';\n    const b = 'M10,10L20,20L200,200';\n\n    const interpolator = interpolatePath(a, b);\n\n    t.equal(interpolator(0), a);\n    t.equal(interpolator(1), b);\n    t.equal(interpolator(0.5), 'M5,5L15,15L150,150');\n    t.equal(interpolator(0), a);\n    t.equal(interpolator(0.25), 'M2.5,2.5L12.5,12.5L125,125');\n    t.equal(interpolator(1), b);\n    t.equal(interpolator(0.5), 'M5,5L15,15L150,150');\n    t.equal(interpolator(0.25), 'M2.5,2.5L12.5,12.5L125,125');\n    t.equal(interpolator(0), a);\n    t.equal(interpolator(1), b);\n    t.equal(interpolator(0.5), 'M5,5L15,15L150,150');\n    t.equal(interpolator(0.25), 'M2.5,2.5L12.5,12.5L125,125');\n\n    t.end();\n  }\n);\n"
  },
  {
    "path": "test/interpolatePathCommands-test.js",
    "content": "/* eslint-disable */\nconst tape = require('tape');\nconst interpolatePathCommands = require('../').interpolatePathCommands;\nconst APPROX_MAX_T = 0.999999999999;\n\n// helper to ensure path1 and path2 are roughly equal\nfunction approximatelyEqual(path1Commands, path2Commands) {\n  const epsilon = 0.001;\n\n  if (path1Commands.length !== path2Commands.length) {\n    return false;\n  }\n\n  for (let i = 0; i < path1Commands.length; i++) {\n    const path1Command = path1Commands[i];\n    const path2Command = path2Commands[i];\n    if (Object.keys(path1Command).length !== Object.keys(path2Command).length) {\n      return false;\n    }\n\n    for (let key in path1Commands[i]) {\n      if (\n        typeof path1Command[key] === 'string' &&\n        path1Command[key] !== path2Command[key]\n      ) {\n        return false;\n      }\n\n      // otherwise it's a number, check if approximately equal\n      if (Math.abs(path1Command[key] - path2Command[key]) > epsilon) {\n        return false;\n      }\n    }\n  }\n\n  return true;\n}\n\ntape(\n  'interpolatePathCommands() interpolates line to line: len(A) = len(b)',\n  function (t) {\n    const a = [\n      { type: 'M', x: 0, y: 0 },\n      { type: 'L', x: 10, y: 10 },\n      { type: 'L', x: 100, y: 100 },\n    ];\n\n    const b = [\n      { type: 'M', x: 10, y: 10 },\n      { type: 'L', x: 20, y: 20 },\n      { type: 'L', x: 200, y: 200 },\n    ];\n\n    const interpolator = interpolatePathCommands(a, b);\n\n    t.same(interpolator(0), a);\n    t.same(interpolator(1), b);\n    t.same(interpolator(0.5), [\n      { type: 'M', x: 5, y: 5 },\n      { type: 'L', x: 15, y: 15 },\n      { type: 'L', x: 150, y: 150 },\n    ]);\n\n    t.end();\n  }\n);\n\ntape(\n  'interpolatePathCommands() interpolates line to line: len(A) > len(b)',\n  function (t) {\n    const aCommands = [\n      { type: 'M', x: 0, y: 0 },\n      { type: 'L', x: 10, y: 10 },\n      { type: 'L', x: 100, y: 100 },\n    ];\n    const bCommands = [\n      { type: 'M', x: 10, y: 10 },\n      { type: 'L', x: 20, y: 20 },\n    ];\n\n    const interpolator = interpolatePathCommands(aCommands, bCommands);\n\n    t.same(interpolator(0), aCommands);\n\n    // should not be extended anymore and should match exactly\n    t.same(interpolator(1), bCommands);\n\n    t.equal(\n      approximatelyEqual(interpolator(APPROX_MAX_T), [\n        { type: 'M', x: 10, y: 10 },\n        { type: 'L', x: 15, y: 15 },\n        { type: 'L', x: 20, y: 20 },\n      ]),\n      true\n    );\n\n    // should be half way between the last point of B and the last point of A\n    // here we get 12.5 since we split the 10,10-20,20 segment and end at L15,15\n    t.same(interpolator(0.5), [\n      { type: 'M', x: 5, y: 5 },\n      { type: 'L', x: 12.5, y: 12.5 },\n      { type: 'L', x: 60, y: 60 },\n    ]);\n\n    t.end();\n  }\n);\n\ntape(\n  'interpolatePathCommands() interpolates line to line: len(A) < len(b)',\n  function (t) {\n    const a = [\n      { type: 'M', x: 0, y: 0 },\n      { type: 'L', x: 10, y: 10 },\n    ];\n    const b = [\n      { type: 'M', x: 10, y: 10 },\n      { type: 'L', x: 20, y: 20 },\n      { type: 'L', x: 200, y: 200 },\n    ];\n\n    const interpolator = interpolatePathCommands(a, b);\n\n    // should be extended to match the length of b\n    t.same(interpolator(0), [\n      { type: 'M', x: 0, y: 0 },\n      { type: 'L', x: 5, y: 5 },\n      { type: 'L', x: 10, y: 10 },\n    ]);\n\n    t.equal(\n      approximatelyEqual(interpolator(APPROX_MAX_T), [\n        { type: 'M', x: 10, y: 10 },\n        { type: 'L', x: 20, y: 20 },\n        { type: 'L', x: 200, y: 200 },\n      ]),\n      true\n    );\n\n    // should be half way between the last point of B and the last point of A\n    t.same(interpolator(0.5), [\n      { type: 'M', x: 5, y: 5 },\n      { type: 'L', x: 12.5, y: 12.5 },\n      { type: 'L', x: 105, y: 105 },\n    ]);\n\n    t.end();\n  }\n);\n\ntape('interpolatePathCommands() interpolates line to line: len(A)=1', function (\n  t\n) {\n  const a = [{ type: 'M', x: 0, y: 0 }, { type: 'Z' }];\n  const b = [\n    { type: 'M', x: 10, y: 10 },\n    { type: 'L', x: 20, y: 20 },\n    { type: 'L', x: 200, y: 200 },\n  ];\n\n  const interpolator = interpolatePathCommands(a, b);\n\n  // should be extended to match the length of b\n  t.same(interpolator(0), [\n    { type: 'M', x: 0, y: 0 },\n    { type: 'L', x: 0, y: 0 },\n    { type: 'L', x: 0, y: 0 },\n  ]);\n  t.equal(interpolator(1), b);\n\n  // should be half way between the last point of B and the last point of A\n  t.same(interpolator(0.5), [\n    { type: 'M', x: 5, y: 5 },\n    { type: 'L', x: 10, y: 10 },\n    { type: 'L', x: 100, y: 100 },\n  ]);\n\n  t.end();\n});\n\ntape('interpolatePathCommands() interpolates line to line: len(B)=1', function (\n  t\n) {\n  const a = [\n    { type: 'M', x: 0, y: 0 },\n    { type: 'L', x: 10, y: 10 },\n    { type: 'L', x: 100, y: 100 },\n  ];\n  const b = [{ type: 'M', x: 10, y: 10 }, { type: 'Z' }];\n\n  const interpolator = interpolatePathCommands(a, b);\n\n  t.same(interpolator(0), a);\n\n  // should not be extended anymore and should match exactly\n  t.equal(interpolator(1), b);\n\n  // should be half way between the last point of B and the last point of A\n  t.same(interpolator(0.5), [\n    { type: 'M', x: 5, y: 5 },\n    { type: 'L', x: 10, y: 10 },\n    { type: 'L', x: 55, y: 55 },\n  ]);\n\n  t.end();\n});\n\ntape(\n  'interpolatePathCommands() interpolates line to line: A is null',\n  function (t) {\n    const a = null;\n    const b = [\n      { type: 'M', x: 10, y: 10 },\n      { type: 'L', x: 20, y: 20 },\n      { type: 'L', x: 200, y: 200 },\n    ];\n\n    //'M10,10L20,20L200,200';\n\n    const interpolator = interpolatePathCommands(a, b);\n\n    // should be extended to match the length of b\n    t.same(interpolator(0), [\n      { type: 'M', x: 10, y: 10 },\n      { type: 'L', x: 10, y: 10 },\n      { type: 'L', x: 10, y: 10 },\n    ]);\n    t.equal(interpolator(1), b);\n\n    // should be half way between the last point of B and the last point of A\n    t.same(interpolator(0.5), [\n      { type: 'M', x: 10, y: 10 },\n      { type: 'L', x: 15, y: 15 },\n      { type: 'L', x: 105, y: 105 },\n    ]);\n\n    t.end();\n  }\n);\n\ntape(\n  'interpolatePathCommands() interpolates line to line: B is null',\n  function (t) {\n    const a = [\n      { type: 'M', x: 0, y: 0 },\n      { type: 'L', x: 10, y: 10 },\n      { type: 'L', x: 100, y: 100 },\n    ];\n\n    const b = null;\n\n    const interpolator = interpolatePathCommands(a, b);\n\n    t.same(interpolator(0), a);\n    t.same(interpolator(1), []);\n\n    // should be halfway towards the first point of a\n    t.same(interpolator(0.5), [\n      { type: 'M', x: 0, y: 0 },\n      { type: 'L', x: 5, y: 5 },\n      { type: 'L', x: 50, y: 50 },\n    ]);\n\n    t.end();\n  }\n);\n\ntape(\n  'interpolatePathCommands() interpolates line to line: A is null and B is null',\n  function (t) {\n    const a = null;\n    const b = null;\n\n    const interpolator = interpolatePathCommands(a, b);\n\n    t.same(interpolator(0), []);\n    t.same(interpolator(1), []);\n\n    // should be halfway towards the first point of a\n    t.same(interpolator(0.5), []);\n\n    t.end();\n  }\n);\n\ntape(\n  'interpolatePathCommands() interpolates where both A and B end in Z',\n  function (t) {\n    const a = [{ type: 'M', x: 0, y: 0 }, { type: 'Z' }];\n    const b = [\n      { type: 'M', x: 10, y: 10 },\n      { type: 'L', x: 20, y: 20 },\n      { type: 'Z' },\n    ];\n\n    const interpolator = interpolatePathCommands(a, b);\n\n    t.same(interpolator(0), [\n      { type: 'M', x: 0, y: 0 },\n      { type: 'L', x: 0, y: 0 },\n      { type: 'Z' },\n    ]);\n\n    t.equal(interpolator(1), b);\n\n    // should be halfway towards the first point of a\n\n    t.same(interpolator(0.5), [\n      { type: 'M', x: 5, y: 5 },\n      { type: 'L', x: 10, y: 10 },\n      { type: 'Z' },\n    ]);\n\n    t.end();\n  }\n);\n\ntape(\n  'interpolatePathCommands() interpolates where A=null, B ends in Z',\n  function (t) {\n    const a = null;\n    const b = [\n      { type: 'M', x: 10, y: 10 },\n      { type: 'L', x: 20, y: 20 },\n      { type: 'Z' },\n    ];\n\n    const interpolator = interpolatePathCommands(a, b);\n\n    t.same(interpolator(0), [\n      { type: 'M', x: 10, y: 10 },\n      { type: 'L', x: 10, y: 10 },\n      { type: 'Z' },\n    ]);\n    t.equal(interpolator(1), b);\n\n    // should be halfway towards the first point of a\n    t.same(interpolator(0.5), [\n      { type: 'M', x: 10, y: 10 },\n      { type: 'L', x: 15, y: 15 },\n      { type: 'Z' },\n    ]);\n\n    t.end();\n  }\n);\n"
  }
]