From 27c8905db18758c36d07ed18a18c24670d89d4b0 Mon Sep 17 00:00:00 2001 From: David Emory Date: Mon, 2 Jul 2018 06:35:18 -0400 Subject: [PATCH 01/18] feat(general): Initial work on libary refactor, including SVG/Canvas rendering BREAKING: changes to API and config parameters --- lib/display/canvas-display.js | 135 ++ lib/display/display2.js | 223 +++ lib/display/svg-display.js | 43 + lib/graph/edge.js | 1 + lib/labeler/labeler.js | 191 ++- lib/labeler/pointlabel.js | 30 +- lib/labeler/segmentlabel.js | 64 +- lib/point/multipoint.js | 36 +- lib/point/place.js | 40 +- lib/point/point.js | 14 +- lib/point/stop.js | 84 +- lib/renderer/default-renderer.js | 72 +- lib/renderer/renderedsegment.js | 71 +- lib/renderer/renderer.js | 2 +- lib/renderer/wireframe-renderer.js | 150 +- lib/styler/styler.js | 21 +- lib/styler/styles.js | 81 +- lib/transitive.js | 49 +- lib/util/index.js | 31 +- package.json | 9 +- yarn.lock | 2563 +++++++++++++++++++++++++++- 21 files changed, 3459 insertions(+), 451 deletions(-) create mode 100644 lib/display/canvas-display.js create mode 100644 lib/display/display2.js create mode 100644 lib/display/svg-display.js diff --git a/lib/display/canvas-display.js b/lib/display/canvas-display.js new file mode 100644 index 00000000..a5fe548c --- /dev/null +++ b/lib/display/canvas-display.js @@ -0,0 +1,135 @@ + +import roundedRect from 'rounded-rect' + +import Display from './display2' + +export default class CanvasDisplay extends Display { + constructor (transitive) { + super(transitive) + + const { el, canvas } = transitive.options + + // Handle case of externally-provided canvas + if (canvas) { + // Set internal dimensions to match those of canvas + this.setDimensions(canvas.width, canvas.height) + this.setCanvas(canvas) + + // We have a DOM element; create canvas + } else if (el) { + this.setDimensions(el.clientWidth, el.clientHeight) + + const canvas = document.createElement('canvas') + canvas.width = el.clientWidth + canvas.height = el.clientHeight + el.appendChild(canvas) + + // Check for Hi-PPI display + if (window.devicePixelRatio > 1) makeCanvasHiPPI(canvas) + + this.setCanvas(canvas) + } + } + + setCanvas (canvas) { + this.canvas = canvas + this.ctx = this.canvas.getContext('2d') + } + + clear () { + this.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height) + } + + drawRect (upperLeft, attrs) { + this.ctx.strokeStyle = attrs['stroke'] + this.ctx.lineWidth = attrs['stroke-width'] + this.ctx.fillStyle = attrs['fill'] + + this.ctx.beginPath() + if (attrs.rx && attrs.ry && attrs.rx === attrs.ry) { + roundedRect(this.ctx, upperLeft.x, upperLeft.y, attrs.width, attrs.height, attrs.rx) + // TODO: handle case where rx != ry + } else { // ordinary rectangle + this.ctx.rect(upperLeft.x, upperLeft.y, attrs.width, attrs.height) + } + this.ctx.closePath() + + if (attrs['fill']) this.ctx.fill() + if (attrs['stroke']) this.ctx.stroke() + } + + drawCircle (center, attrs) { + this.ctx.beginPath() + this.ctx.arc(center.x, center.y, attrs.r, 0, Math.PI * 2, true) + this.ctx.closePath() + + if (attrs['fill']) { + this.ctx.fillStyle = attrs['fill'] + this.ctx.fill() + } + if (attrs['stroke']) { + this.ctx.strokeStyle = attrs['stroke'] + this.ctx.lineWidth = attrs['stroke-width'] || 1 + this.ctx.stroke() + } + } + + drawEllipse (center, attrs) { + // TODO: implement + } + + drawPath (pathStr, attrs) { + const path = new Path2D(pathStr) + + this.ctx.strokeStyle = attrs['stroke'] + this.ctx.lineWidth = attrs['stroke-width'] + + // dash array + if (attrs['stroke-dasharray']) { + const arr = attrs['stroke-dasharray'].split(',').map(str => parseFloat(str.trim())) + this.ctx.setLineDash(arr) + } + // linecap + this.ctx.lineCap = attrs['stroke-linecap'] || 'butt' + + this.ctx.stroke(path) + + if (attrs['stroke-dasharray']) this.ctx.setLineDash([]) + } + + drawText (text, anchor, attrs) { + // For equivalence w/ SVG text rendering + this.ctx.textBaseline = 'top' + + this.ctx.font = `${attrs.fontSize || '14px'} ${attrs.fontFamily || 'sans-serif'}` + if (attrs['text-anchor']) this.ctx.textAlign = attrs['text-anchor'] + + if (attrs['stroke']) { + this.ctx.strokeStyle = attrs['stroke'] + if (attrs['stroke-opacity']) this.ctx.globalAlpha = attrs['stroke-opacity'] + this.ctx.lineWidth = attrs['stroke-width'] || 1 + this.ctx.strokeText(text, anchor.x, anchor.y) + } + if (attrs['fill']) { + this.ctx.fillStyle = attrs['fill'] + if (attrs['fill-opacity']) this.ctx.globalAlpha = attrs['fill-opacity'] + this.ctx.fillText(text, anchor.x, anchor.y) + } + + this.ctx.textAlign = 'start' + this.ctx.globalAlpha = 1 + } +} + +// Utility function to support HiPPI displays (e.g. Retina) +function makeCanvasHiPPI (canvas) { + const PIXEL_RATIO = 2 + canvas.style.width = canvas.width + 'px' + canvas.style.height = canvas.height + 'px' + + canvas.width *= PIXEL_RATIO + canvas.height *= PIXEL_RATIO + + var context = canvas.getContext('2d') + context.scale(PIXEL_RATIO, PIXEL_RATIO) +} diff --git a/lib/display/display2.js b/lib/display/display2.js new file mode 100644 index 00000000..e2d3583f --- /dev/null +++ b/lib/display/display2.js @@ -0,0 +1,223 @@ +import linearScale from 'simple-linear-scale' + +export default class Display { + constructor (transitive) { + this.transitive = transitive + + this.zoomFactors = transitive.options.zoomFactors || this.getDefaultZoomFactors() + + this.updateActiveZoomFactors(1) + } + + setDimensions (width, height) { + this.width = width + this.height = height + } + + setXDomain (domain) { // [minX , maxX] + this.xDomain = domain + this.xScale = linearScale(domain, [0, this.width]) + if (!this.initialXDomain) { + this.initialXDomain = domain + this.initialXRes = (domain[1] - domain[0]) / this.width + } + } + + setYDomain (domain) { // [minY , maxY] + this.yDomain = domain + this.yScale = linearScale(domain, [this.height, 0]) + if (!this.initialYDomain) this.initialYDomain = domain + } + + fitToWorldBounds (bounds) { + const domains = this.computeDomainsFromBounds(bounds) + this.setXDomain(domains[0]) + this.setYDomain(domains[1]) + this.computeScale() + } + + reset () { + this.initialXDomain = null + this.initialYDomain = null + this.scaleSet = false + this.lastScale = undefined + } + + /** + * Apply a transformation {x, y, k} to the *initial* state of the map, where + * (x, y) is the pixel offset and k is a scale factor relative to an initial + * zoom level of 1.0. Intended primarily to support D3-style panning/zooming. + */ + + applyTransform (transform) { + const { x, y, k } = transform + + let xMin = this.initialXDomain[0] + let xMax = this.initialXDomain[1] + let yMin = this.initialYDomain[0] + let yMax = this.initialYDomain[1] + + // Apply the scale factor + xMax = xMin + (xMax - xMin) / k + yMin = yMax - (yMax - yMin) / k + + // Apply the translation + const xOffset = -x * (xMax - xMin) / this.width + xMin += xOffset + xMax += xOffset + const yOffset = y * (yMax - yMin) / this.height + yMin += yOffset + yMax += yOffset + + // Update the scale functions and recompute the internal scale factor + this.setXDomain([xMin, xMax]) + this.setYDomain([yMin, yMax]) + this.computeScale() + } + + getDefaultZoomFactors (data) { + return [{ + minScale: 0, + gridCellSize: 25, + internalVertexFactor: 1000000, + angleConstraint: 45, + mergeVertexThreshold: 200 + }, { + minScale: 1.5, + gridCellSize: 0, + internalVertexFactor: 0, + angleConstraint: 5, + mergeVertexThreshold: 0 + }] + } + + updateActiveZoomFactors (scale) { + var updated = false + for (var i = 0; i < this.zoomFactors.length; i++) { + var min = this.zoomFactors[i].minScale + var max = (i < this.zoomFactors.length - 1) + ? this.zoomFactors[i + 1].minScale + : Number.MAX_VALUE + + // check if we've crossed into a new zoomFactor partition + if ((!this.lastScale || this.lastScale < min || this.lastScale >= max) && + scale >= min && scale < max) { + this.activeZoomFactors = this.zoomFactors[i] + updated = true + } + } + return updated + } + + computeScale () { + this.lastScale = this.scale + this.scaleSet = true + const newXRes = (this.xDomain[1] - this.xDomain[0]) / this.width + this.scale = this.initialXRes / newXRes + if (this.lastScale !== this.scale) this.scaleChanged() + } + + scaleChanged () { + const zoomFactorsChanged = this.updateActiveZoomFactors(this.scale) + if (zoomFactorsChanged) { + this.transitive.network = null + this.transitive.render() + } + } + + /** + * Compute the x/y coordinate space domains to fit the graph. + */ + + computeDomainsFromBounds (bounds) { + var xmin = bounds[0][0] + var xmax = bounds[1][0] + var ymin = bounds[0][1] + var ymax = bounds[1][1] + var xRange = xmax - xmin + var yRange = ymax - ymin + + const { options } = this.transitive + + var paddingFactor = (options && options.paddingFactor) + ? options.paddingFactor + : 0.1 + + var margins = this.getMargins() + + var usableHeight = this.height - margins.top - margins.bottom + var usableWidth = this.width - margins.left - margins.right + var displayAspect = this.width / this.height + var usableDisplayAspect = usableWidth / usableHeight + var graphAspect = xRange / (yRange === 0 ? -Infinity : yRange) + + var padding + var dispX1, dispX2, dispY1, dispY2 + var dispXRange, dispYRange + + if (usableDisplayAspect > graphAspect) { // y-axis is limiting + padding = paddingFactor * yRange + dispY1 = ymin - padding + dispY2 = ymax + padding + dispYRange = yRange + 2 * padding + var addedYRange = (this.height / usableHeight * dispYRange) - dispYRange + if (margins.top > 0 || margins.bottom > 0) { + dispY1 -= margins.bottom / (margins.bottom + margins.top) * addedYRange + dispY2 += margins.top / (margins.bottom + margins.top) * addedYRange + } + dispXRange = (dispY2 - dispY1) * displayAspect + var xOffset = (margins.left - margins.right) / this.width + var xMidpoint = (xmax + xmin - dispXRange * xOffset) / 2 + dispX1 = xMidpoint - dispXRange / 2 + dispX2 = xMidpoint + dispXRange / 2 + } else { // x-axis limiting + padding = paddingFactor * xRange + dispX1 = xmin - padding + dispX2 = xmax + padding + dispXRange = xRange + 2 * padding + var addedXRange = (this.width / usableWidth * dispXRange) - dispXRange + if (margins.left > 0 || margins.right > 0) { + dispX1 -= margins.left / (margins.left + margins.right) * addedXRange + dispX2 += margins.right / (margins.left + margins.right) * addedXRange + } + + dispYRange = (dispX2 - dispX1) / displayAspect + var yOffset = (margins.bottom - margins.top) / this.height + var yMidpoint = (ymax + ymin - dispYRange * yOffset) / 2 + dispY1 = yMidpoint - dispYRange / 2 + dispY2 = yMidpoint + dispYRange / 2 + } + + return [ + [dispX1, dispX2], + [dispY1, dispY2] + ] + } + + getMargins () { + return Object.assign({ + left: 0, + right: 0, + top: 0, + bottom: 0 + }, this.transitive.options.displayMargins) + } + + isInRange (x, y) { + return x >= 0 && x <= this.width && y >= 0 && y <= this.height + } + + /** Methods to be defined by subclasses **/ + + clear () { } + + drawCircle (coord, attrs) { } + + drawEllipse (coord, attrs) { } + + drawRect (upperLeft, attrs) { } + + drawText (text, anchor, attrs) { } + + drawPath (pathStr, attrs) { } +} diff --git a/lib/display/svg-display.js b/lib/display/svg-display.js new file mode 100644 index 00000000..62ea75a0 --- /dev/null +++ b/lib/display/svg-display.js @@ -0,0 +1,43 @@ +import Display from './display2' +import SVG from 'svg.js' + +export default class SvgDisplay extends Display { + constructor (transitive) { + super(transitive) + + const { el } = transitive.options + // TODO: handle case of externally-provided SVG? + + // We have a DOM element + if (el) { + console.log('--> setting el in SvgDisplay'); + + this.setDimensions(el.clientWidth, el.clientHeight) + this.svg = SVG(el) + } + } + + clear () { + this.svg.clear() + } + + drawRect (upperLeft, attrs) { + this.svg.rect().move(upperLeft.x, upperLeft.y).attr(attrs) + } + + drawCircle (center, attrs) { + this.svg.circle().move(center.x, center.y).attr(attrs) + } + + drawEllipse (center, attrs) { + this.svg.ellipse().move(center.x, center.y).attr(attrs) + } + + drawPath (pathStr, attrs) { + this.svg.path(pathStr).attr(attrs) + } + + drawText (text, anchor, attrs) { + this.svg.text(text).move(anchor.x, anchor.y).attr(attrs) + } +} diff --git a/lib/graph/edge.js b/lib/graph/edge.js index 36ca1741..6ba3ff8a 100644 --- a/lib/graph/edge.js +++ b/lib/graph/edge.js @@ -626,6 +626,7 @@ export default class Edge { * @returns {Object} - the coordinate as an {x,y} Object */ + // TODO: not working for geographically-rendered edges? coordAlongEdge (t, coords, display) { if (!this.baseRenderCoords) { this.calculateBaseRenderCoords(display) diff --git a/lib/labeler/labeler.js b/lib/labeler/labeler.js index 961c65d2..cc5fedb5 100644 --- a/lib/labeler/labeler.js +++ b/lib/labeler/labeler.js @@ -1,8 +1,8 @@ import { forEach } from 'lodash' -import d3 from 'd3' +import measureText from 'measure-text' +import d3 from 'd3' // TODO: replace w/ other quadtree library import SegmentLabel from './segmentlabel' -import { getTextBBox } from '../util' /** * Labeler object @@ -153,21 +153,92 @@ export default class Labeler { this.updateQuadtree() - var labeledSegments = this.placeSegmentLabels() - var labeledPoints = this.placePointLabels() - return { - segments: labeledSegments, - points: labeledPoints + pointLabels: this.placePointLabels(), + segmentLabels: this.placeSegmentLabels() } } - placeSegmentLabels () { - forEach(this.segmentLabels, label => { - label.clear() + /** placePointLabels **/ + + placePointLabels () { + var styler = this.transitive.styler + + const placedLabels = [] + //var labeledPoints = [] + + forEach(this.points, point => { + var labelText = point.label.getText() + if (!labelText) return + point.label.fontFamily = styler.compute2('labels', 'font-family', point) + point.label.fontSize = styler.compute2('labels', 'font-size', point) + const textDimensions = measureText({ + text: labelText, + fontSize: point.label.fontSize, + fontFamily: point.label.fontFamily || 'sans-serif', + lineHeight: 1.2 + }) + point.label.textWidth = textDimensions.width.value + point.label.textHeight = textDimensions.height.value + + var orientations = styler.compute( + styler.labels.orientations, + this.transitive.display, { + point: point + } + ) + + var placedLabel = false + for (var i = 0; i < orientations.length; i++) { + point.label.setOrientation(orientations[i]) + if (!point.focused) continue + + if (!point.label.labelAnchor) continue + + var lx = point.label.labelAnchor.x + var ly = point.label.labelAnchor.y + + // do not place label if out of range + if (lx <= 0 || ly <= 0 || lx >= this.width || ly > this.height) continue + + var labelBBox = point.label.getBBox() + + var overlaps = this.findOverlaps(point.label, labelBBox) + + // do not place label if it overlaps with others + if (overlaps.length > 0) continue + + // if we reach this point, the label is good to place + + point.label.setVisibility(true) + //labeledPoints.push(point) + placedLabels.push(point.label) + + this.quadtree.add([labelBBox.x + labelBBox.width / 2, labelBBox.y + + labelBBox.height / 2, point.label + ]) + + this.maxBBoxWidth = Math.max(this.maxBBoxWidth, labelBBox.width) + this.maxBBoxHeight = Math.max(this.maxBBoxHeight, labelBBox.height) + + placedLabel = true + break // do not consider any other orientations after places + } // end of orientation loop + + // if label not placed at all, hide the element + if (!placedLabel) { + point.label.setVisibility(false) + } }) - this.segmentLabels = [] + + return placedLabels + } + + /** placeSegmentLabels **/ + + placeSegmentLabels () { this.placedLabelKeys = [] + const placedLabels = [] // collect the bus RenderSegments var busRSegments = [] @@ -214,7 +285,7 @@ export default class Labeler { if (conflicts.length === 0) { // if no conflicts // place the current label - this.segmentLabels.push(label) + placedLabels.push(label) this.quadtree.add([label.labelAnchor.x, label.labelAnchor.y, label ]) @@ -223,6 +294,7 @@ export default class Labeler { } } // end of anchor iteration loop }) // end of sequence iteration loop + return placedLabels } getNextLabel () { @@ -245,96 +317,23 @@ export default class Labeler { constructSegmentLabel (segment, labelText) { var label = new SegmentLabel(segment, labelText) var styler = this.transitive.styler - label.fontFamily = styler.compute(styler.labels['font-family'], this.transitive.display, { - segment: segment + label.fontFamily = styler.compute2('segment_labels', 'font-family', segment) + label.fontSize = styler.compute2('segment_labels', 'font-size', segment) + + const textDimensions = measureText({ + text: labelText, + fontSize: label.fontSize + 'px', + fontFamily: label.fontFamily || 'sans-serif', + lineHeight: 1.2 }) - label.fontSize = styler.compute(styler.labels['font-size'], this.transitive.display, { - segment: segment - }) - var textBBox = getTextBBox(labelText, { - 'font-size': label.fontSize, - 'font-family': label.fontFamily - }) - label.textWidth = textBBox.width - label.textHeight = textBBox.height + + label.textWidth = textDimensions.width.value + label.textHeight = textDimensions.height.value label.computeContainerDimensions() return label } - placePointLabels () { - var styler = this.transitive.styler - - var labeledPoints = [] - - forEach(this.points, point => { - var labelText = point.label.getText() - point.label.fontFamily = styler.compute(styler.labels['font-family'], - this.transitive - .display, { - point: point - }) - point.label.fontSize = styler.compute(styler.labels['font-size'], - this.transitive - .display, { - point: point - }) - var textBBox = getTextBBox(labelText, { - 'font-size': point.label.fontSize, - 'font-family': point.label.fontFamily - }) - point.label.textWidth = textBBox.width - point.label.textHeight = textBBox.height - - var orientations = styler.compute(styler.labels.orientations, this.transitive - .display, { - point: point - }) - - var placedLabel = false - for (var i = 0; i < orientations.length; i++) { - point.label.setOrientation(orientations[i]) - if (!point.focused) continue - - if (!point.label.labelAnchor) continue - - var lx = point.label.labelAnchor.x - var ly = point.label.labelAnchor.y - - // do not place label if out of range - if (lx <= 0 || ly <= 0 || lx >= this.width || ly > this.height) continue - - var labelBBox = point.label.getBBox() - - var overlaps = this.findOverlaps(point.label, labelBBox) - - // do not place label if it overlaps with others - if (overlaps.length > 0) continue - - // if we reach this point, the label is good to place - - point.label.setVisibility(true) - labeledPoints.push(point) - - this.quadtree.add([labelBBox.x + labelBBox.width / 2, labelBBox.y + - labelBBox.height / 2, point.label - ]) - - this.maxBBoxWidth = Math.max(this.maxBBoxWidth, labelBBox.width) - this.maxBBoxHeight = Math.max(this.maxBBoxHeight, labelBBox.height) - - placedLabel = true - break // do not consider any other orientations after places - } // end of orientation loop - - // if label not placed at all, hide the element - if (!placedLabel) { - point.label.setVisibility(false) - } - }) - return labeledPoints - } - findOverlaps (label, labelBBox) { var minX = labelBBox.x - this.maxBBoxWidth / 2 var minY = labelBBox.y - this.maxBBoxHeight / 2 diff --git a/lib/labeler/pointlabel.js b/lib/labeler/pointlabel.js index ddb3f224..8afce360 100644 --- a/lib/labeler/pointlabel.js +++ b/lib/labeler/pointlabel.js @@ -16,7 +16,7 @@ export default class PointLabel extends Label { return this.parent.getName() } - render (display) { + /*render (display) { this.svgGroup = display.svg.append('g') // this.parent.labelSvg; this.svgGroup .attr('class', 'transitive-sortable') @@ -54,6 +54,34 @@ export default class PointLabel extends Label { .attr('transform', (d, i) => { return 'rotate(' + this.labelAngle + ', 0, 0)' }) + }*/ + + render (display) { + const text = this.getText() + if (!text || !this.labelAnchor) return + + const anchor = { + x: this.labelAnchor.x, + y: this.labelAnchor.y - this.textHeight / 2 + } + + // define common style attributes for the halo and main text + const attrs = { + 'fill': '#000', + 'font-size': this.fontSize, + 'text-anchor': this.labelPosition > 0 ? 'start' : 'end' + } + + // draw the halo + display.drawText(text, anchor, Object.assign({}, attrs, { + 'stroke': '#fff', + 'stroke-width': 3, + 'stroke-opacity': 0.75, + fill: 'none' + })) + + // draw the main text + display.drawText(text, anchor, attrs) } setOrientation (orientation) { diff --git a/lib/labeler/segmentlabel.js b/lib/labeler/segmentlabel.js index f731557b..c21cdb78 100644 --- a/lib/labeler/segmentlabel.js +++ b/lib/labeler/segmentlabel.js @@ -10,45 +10,29 @@ export default class SegmentLabel extends Label { this.labelText = text } - /* this.initText = function() { - return this.parent.patterns[0].route.route_short_name; - }; */ - render (display) { - this.svgGroup = this.parent.labelSvg.append('g') - .attr('class', 'transitive-sortable') - .datum({ - owner: this, - sortableType: 'LABEL' - }) - - var padding = this.getPadding() - - this.computeContainerDimensions() - - this.containerSvg = this.svgGroup.append('rect') - .datum(this) - .attr('width', this.containerWidth) - .attr('height', this.containerHeight) - .attr('id', 'transitive-segment-label-container-' + this.parent.getId()) - .text(this.getText()) - .attr('class', 'transitive-segment-label-container') - - this.textSvg = this.svgGroup.append('text') - .datum(this) // { segment: this.parent }) - .attr('id', 'transitive-segment-label-' + this.parent.getId()) - .text(this.getText()) - .attr('class', 'transitive-segment-label') - .attr('font-size', this.fontSize) - .attr('font-family', this.fontFamily) - .attr('transform', (d, i) => { - return 'translate(' + padding + ', ' + (this.textHeight - - padding * 2) + ')' - }) + display.drawRect({ + x: this.labelAnchor.x - this.containerWidth / 2, + y: this.labelAnchor.y - this.containerHeight / 2 + }, { + fill: display.styler.compute2('segment_labels', 'background', this.parent), + width: this.containerWidth, + height: this.containerHeight, + rx: this.containerHeight / 2, + ry: this.containerHeight / 2 + }) + + display.drawText(this.getText(), { + x: this.labelAnchor.x - this.containerWidth / 2 + this.getPadding(), + y: this.labelAnchor.y - this.containerHeight / 2 + this.getPadding() + }, { + fill: display.styler.compute2('segment_labels', 'color', this.parent), + 'font-size': this.fontSize + }) } refresh (display) { - if (!this.labelAnchor) return + /*if (!this.labelAnchor) return if (!this.svgGroup) this.render(display) @@ -57,16 +41,16 @@ export default class SegmentLabel extends Label { var tx = (this.labelAnchor.x - this.containerWidth / 2) var ty = (this.labelAnchor.y - this.containerHeight / 2) return 'translate(' + tx + ',' + ty + ')' - }) + })*/ } getPadding () { - return this.textHeight * 0.1 + return this.textHeight * 0.3 } computeContainerDimensions () { this.containerWidth = this.textWidth + this.getPadding() * 2 - this.containerHeight = this.textHeight + this.containerHeight = this.textHeight + this.getPadding() * 2 } getBBox () { @@ -89,11 +73,11 @@ export default class SegmentLabel extends Label { return false } - clear () { + /*clear () { this.labelAnchor = null if (this.svgGroup) { this.svgGroup.remove() this.svgGroup = null } - } + }*/ } diff --git a/lib/point/multipoint.js b/lib/point/multipoint.js index 6258ccf8..c085ab7c 100644 --- a/lib/point/multipoint.js +++ b/lib/point/multipoint.js @@ -153,15 +153,41 @@ export default class MultiPoint extends Point { if (!this.renderData) return // set up the main svg group for this stop - this.initSvg(display) + /*this.initSvg(display) this.svgGroup .attr('class', 'transitive-sortable') .datum({ owner: this, sortableType: 'POINT_MULTI' - }) + })*/ + + //if (this.containsSegmentEndPoint()) this.initMergedMarker(display) + + const xArr = this.renderData.map(d => d.x) + const yArr = this.renderData.map(d => d.y) + const xMin = Math.min(...xArr) + const xMax = Math.max(...xArr) + const yMin = Math.min(...yArr) + const yMax = Math.max(...yArr) + + const r = 6 + const x = xMin - r + const y = yMin - r + const width = xMax - xMin + r * 2 + const height = yMax - yMin + r * 2 + + display.drawRect({ x, y }, { + width, + height, + rx: r, + ry: r, + fill: '#fff', + stroke: '#000', + 'stroke-width': 2 + }) - if (this.containsSegmentEndPoint()) this.initMergedMarker(display) + // store marker bounding box + this.markerBBox = { x, y, width, height } // set up the pattern markers /* this.marker = this.markerSvg.selectAll('circle') @@ -195,7 +221,7 @@ export default class MultiPoint extends Point { */ refresh (display) { - if (!this.renderData) return + /*if (!this.renderData) return // refresh the merged marker if (this.mergedMarker) { @@ -207,7 +233,7 @@ export default class MultiPoint extends Point { for (const key in this.mergedMarkerData) { this.mergedMarker.attr(key, this.mergedMarkerData[key]) } - } + }*/ /* var cx, cy; // refresh the pattern-level markers diff --git a/lib/point/place.js b/lib/point/place.js index 8a2abb25..e0f038c6 100644 --- a/lib/point/place.js +++ b/lib/point/place.js @@ -98,9 +98,37 @@ export default class Place extends Point { render (display) { super.render(display) + const styler = display.styler if (!this.renderData) return - this.initSvg(display) + + var displayStyle = styler.compute2('places', 'display', this) + if (displayStyle === 'none') return + + this.renderXY = { + x: display.xScale(display.activeZoomFactors.useGeographicRendering + ? this.worldX + : this.graphVertex.x), + y: display.yScale(display.activeZoomFactors.useGeographicRendering + ? this.worldY + : this.graphVertex.y) + } + + const radius = styler.compute2('places', 'r', this) || 10 + display.drawCircle(this.renderXY, { + r: radius, + fill: styler.compute2('places', 'fill', this) || '#fff', + stroke: styler.compute2('places', 'stroke', this) || '#000', + 'stroke-width': styler.compute2('places', 'stroke-width', this) || 2 + }) + + this.markerBBox = { + x: this.renderXY.x - radius, + y: this.renderXY.y - radius, + width: radius * 2, + height: radius * 2 + } + /*this.initSvg(display) this.svgGroup .attr('class', 'transitive-sortable') .datum({ @@ -125,7 +153,7 @@ export default class Place extends Point { }) .attr('class', 'transitive-place-icon') .attr('xlink:href', iconUrl) - } + }*/ } /** @@ -135,7 +163,7 @@ export default class Place extends Point { */ refresh (display) { - if (!this.renderData) return + /*if (!this.renderData) return // compute the x/y location -- use the real-world coordinates if // geographic rendering is enabled, otherwise use snapped vertex coords @@ -153,11 +181,11 @@ export default class Place extends Point { // update the marker/icon translations this.marker.attr('transform', translate) - if (this.icon) this.icon.attr('transform', translate) + if (this.icon) this.icon.attr('transform', translate)*/ } makeDraggable (transitive) { - var place = this + /*var place = this var display = transitive.display var drag = d3.behavior.drag() .on('dragstart', function () { @@ -183,6 +211,6 @@ export default class Place extends Point { .on('dragend', function () { transitive.emit('place.' + place.getId() + '.dragend', place) }) - this.markerSvg.call(drag) + this.markerSvg.call(drag)*/ } } diff --git a/lib/point/point.js b/lib/point/point.js index 82d255a9..314073e5 100644 --- a/lib/point/point.js +++ b/lib/point/point.js @@ -92,7 +92,7 @@ export default class Point { */ render (display) { - this.label.svgGroup = null + //this.label.svgGroup = null } /** @@ -115,7 +115,7 @@ export default class Point { return false } - initSvg (display) { + /*initSvg (display) { // set up the main svg group for this stop this.svgGroup = display.svg.append('g') .attr('id', `transitive-${this.getType().toLowerCase()}-${this.getId()}`) @@ -124,7 +124,7 @@ export default class Point { this.markerSvg = this.svgGroup.append('g') this.labelSvg = this.svgGroup.append('g') - } + }*/ //* * Shared geom utility functions **// @@ -237,13 +237,13 @@ export default class Point { } } - refreshLabel (display) { + /*drawLabel (display) { if (!this.renderLabel) return - this.label.refresh(display) - } + this.label.draw(display) + }*/ getMarkerBBox () { - return this.markerSvg.node().getBBox() + return this.markerBBox } setFocused (focused) { diff --git a/lib/point/stop.js b/lib/point/stop.js index 9bb03658..b47c8874 100644 --- a/lib/point/stop.js +++ b/lib/point/stop.js @@ -149,7 +149,71 @@ export default class Stop extends Point { render (display) { super.render(display) - if (Object.keys(this.patternRenderData).length === 0) return + + if (this.patternCount === 0) return + + //if (!this.mergedMarkerData) this.initMarkerData(display) + + this.initMarkerData(display) + // refresh the pattern-level markers + /*this.patternMarkers.data(this.getRenderDataArray()) + + this.patternMarkers.attr('transform', (d, i) => { + if (!isNaN(d.x) && !isNaN(d.y)) { + var x = d.x + this.placeOffsets.x + var y = d.y + this.placeOffsets.y + return `translate(${x}, ${y})` + } + }) + + // refresh the merged marker + if (this.mergedMarker) { + this.mergedMarker.datum(this.getMergedRenderData()) + if (!isNaN(this.mergedMarkerData.x) && !isNaN(this.mergedMarkerData.y)) { + for (const key in this.mergedMarkerData) this.mergedMarker.attr(key, this.mergedMarkerData[key]) + } + }*/ + + const styler = display.styler + + if (this.isSegmentEndPoint && this.mergedMarkerData) { + display.drawRect({ + x: this.mergedMarkerData.x, + y: this.mergedMarkerData.y + }, { + width: this.mergedMarkerData.width, + height: this.mergedMarkerData.height, + rx: this.mergedMarkerData.rx, + ry: this.mergedMarkerData.ry, + fill: styler.compute2('stops_merged', 'fill', this), + stroke: styler.compute2('stops_merged', 'stroke', this), + 'stroke-width': styler.compute2('stops_merged', 'stroke-width', this) + }) + + // store marker bounding box + this.markerBBox = { + x: this.mergedMarkerData.x, + y: this.mergedMarkerData.y, + width: this.mergedMarkerData.width, + height: this.mergedMarkerData.height + } + } + + // TODO: Restore inline stop + if (!this.isSegmentEndPoint) { + const renderDataArray = this.getRenderDataArray() + /*for (let renderData of renderDataArray) { + display.drawCircle({ + x: renderData.x, + y: renderData.y + }, { + fill: '#fff', + r: renderData.rEdge.lineWidth * 0.4 + }) + }*/ + } + + /*if (Object.keys(this.patternRenderData).length === 0) return var renderDataArray = this.getRenderDataArray() @@ -165,7 +229,7 @@ export default class Stop extends Point { .data(renderDataArray) .enter() .append('circle') - .attr('class', 'transitive-sortable transitive-stop-marker-pattern') + .attr('class', 'transitive-sortable transitive-stop-marker-pattern')*/ } /** @@ -175,7 +239,7 @@ export default class Stop extends Point { */ refresh (display) { - if (this.patternCount === 0) return + /*if (this.patternCount === 0) return if (!this.mergedMarkerData) this.initMarkerData(display) @@ -196,15 +260,15 @@ export default class Stop extends Point { if (!isNaN(this.mergedMarkerData.x) && !isNaN(this.mergedMarkerData.y)) { for (const key in this.mergedMarkerData) this.mergedMarker.attr(key, this.mergedMarkerData[key]) } - } + }*/ } - getMergedRenderData () { + /*getMergedRenderData () { return { owner: this, sortableType: 'POINT_STOP_MERGED' } - } + }*/ getRenderDataArray () { var dataArray = [] @@ -214,11 +278,7 @@ export default class Stop extends Point { return dataArray } - getMarkerBBox () { - if (this.mergedMarker) return this.mergedMarkerData - } - - isFocused () { + /*isFocused () { if (this.mergedMarker || !this.patternRenderData) { return (this.focused === true) } @@ -228,7 +288,7 @@ export default class Stop extends Point { focused = this && this.isPatternFocused(patternId) } return focused - } + }*/ runFocusTransition (display, callback) { if (this.mergedMarker) { diff --git a/lib/renderer/default-renderer.js b/lib/renderer/default-renderer.js index 97c09efc..ab206af3 100644 --- a/lib/renderer/default-renderer.js +++ b/lib/renderer/default-renderer.js @@ -16,43 +16,72 @@ export default class DefaultRenderer extends Renderer { var network = this.transitive.network display.styler = this.transitive.styler - var legendSegments = {} + // TODO: restore legend? + // var legendSegments = {} + + // Process vertices/points + const focusedPoints = [] + const unfocusedPoints = [] + forEach(network.graph.vertices, vertex => { + vertex.point.clearRenderData() + if (!vertex.point.isFocused()) focusedPoints.push(vertex.point) + else focusedPoints.push(vertex.point) + }) forEach(network.renderedEdges, rEdge => { rEdge.refreshRenderData(display) }) + // Create arrays of focused, unfocused RenderedSegments + const focusedSegments = [] + const unfocusedSegments = [] forEach(network.paths, path => { forEach(path.segments, pathSegment => { forEach(pathSegment.renderedSegments, renderedSegment => { - renderedSegment.render(display) + if (renderedSegment.isFocused()) focusedSegments.push(renderedSegment) + else unfocusedSegments.push(renderedSegment) + + /* var legendType = renderedSegment.getLegendType() if (!(legendType in legendSegments)) { legendSegments[legendType] = renderedSegment } + */ }) }) }) - // draw the vertex-based points + // Render elements in the following order: - forEach(network.graph.vertices, vertex => { - vertex.point.render(display) - if (this.isDraggable(vertex.point)) { - vertex.point.makeDraggable(this.transitive) - } - }) + // 1. Unfocused segments + unfocusedSegments.forEach(rs => rs.render(display)) - // draw the edge-based points - forEach(network.graph.edges, edge => { + // 2. Unfocused points + forEach(unfocusedPoints, pt => pt.render(display)) + + // 3. Focused segments + focusedSegments.forEach(rs => rs.render(display)) + + // 4. Focused points + forEach(focusedPoints, pt => pt.render(display)) + + // TODO: draw the edge-based points + /*forEach(network.graph.edges, edge => { forEach(edge.pointArray, point => { point.render(display) }) - }) + })*/ + + // 5. Labels + const labels = this.transitive.labeler.doLayout() + forEach(labels.pointLabels, label => label.render(display)) + forEach(labels.segmentLabels, label => label.render(display)) - if (display.legend) display.legend.render(legendSegments) + // Keep internal collection of rendered segments + this.renderedSegments = focusedSegments.concat(unfocusedSegments) - this.transitive.refresh() + // TODO: make legends work again + // if (display.legend) display.legend.render(legendSegments) } /** @@ -60,7 +89,7 @@ export default class DefaultRenderer extends Renderer { */ refresh (panning) { - super.refresh(panning) + /*super.refresh(panning) var display = this.transitive.display var network = this.transitive.network @@ -116,7 +145,7 @@ export default class DefaultRenderer extends Renderer { styler.styleSegmentLabel(display, label) }) - this.sortElements() + this.sortElements()*/ } refreshSegmentRenderData () { @@ -202,8 +231,10 @@ export default class DefaultRenderer extends Renderer { }) } + // Keep track of changed segments / points for transition animation (currently disabled) var focusChangeSegments = [] var focusedVertexPoints = [] + forEach(this.renderedSegments, rSegment => { if (path && pathRenderedSegments.indexOf(rSegment) === -1) { if (rSegment.isFocused()) focusChangeSegments.push(rSegment) @@ -231,8 +262,10 @@ export default class DefaultRenderer extends Renderer { // bring the focused elements to the front for the transition // if (path) this.sortElements(); + // TODO: restore transitions + /* // create a transition callback function that invokes refresh() after all transitions complete - /* var n = 0 + var n = 0 var refreshOnEnd = (transition, callback) => { transition .each(() => { ++n }) @@ -246,7 +279,8 @@ export default class DefaultRenderer extends Renderer { forEach(focusChangePoints, point => { point.runFocusTransition(this.transitive.display, refreshOnEnd) - }) */ - this.transitive.refresh() + }) + */ + this.transitive.render() } } diff --git a/lib/renderer/renderedsegment.js b/lib/renderer/renderedsegment.js index 7771b98a..8d270730 100644 --- a/lib/renderer/renderedsegment.js +++ b/lib/renderer/renderedsegment.js @@ -1,8 +1,8 @@ -import d3 from 'd3' import { forEach } from 'lodash' import interpolateLine from '../util/interpolate-line' -import { distance } from '../util' +import { distance, renderDataToSvgPath } from '../util' + /** * RenderedSegment */ @@ -31,52 +31,37 @@ export default class RenderedSegment { } render (display) { - this.line = d3.svg.line() // the line translation function - .x(function (data, i) { - return data.x - }) - .y(function (data, i) { - return data.y - }) - .interpolate(interpolateLine.bind({ - segment: this, - display: display - })) - - this.svgGroup = display.svg.append('g') - - this.lineSvg = this.svgGroup.append('g') - .attr('class', 'transitive-sortable') - .datum({ - owner: this, - sortableType: 'SEGMENT' - }) - - this.labelSvg = this.svgGroup.append('g') - - this.lineGraph = this.lineSvg.append('path') + const styler = display.styler - this.lineGraph - .attr('class', 'transitive-line') - .data([this]) - - this.lineGraphFront = this.lineSvg.append('path') - - this.lineGraphFront - .attr('class', 'transitive-line-front') - .data([this]) - - if (display.haloLayer) { - this.lineGraphHalo = display.haloLayer.append('path') + this.renderData = [] + forEach(this.renderedEdges, rEdge => { + this.renderData = this.renderData.concat(rEdge.renderData) + }) - this.lineGraphHalo - .attr('class', 'transitive-line-halo') - .data([this]) + // Check if this segment is to be drawn as an arc; if so replace render data + if (this.pathSegment.journeySegment && this.pathSegment.journeySegment.arc) { + const first = this.renderData[0] + const last = this.renderData[this.renderData.length - 1] + const arc = { + x: last.x, + y: last.y, + arc: -45, + radius: distance(first.x, first.y, last.x, last.y) + } + this.renderData = [first, arc, last] } + + display.drawPath(renderDataToSvgPath(this.renderData), { + fill: 'none', + stroke: styler.compute2('segments', 'stroke', this), + 'stroke-width': styler.compute2('segments', 'stroke-width', this), + 'stroke-dasharray': styler.compute2('segments', 'stroke-dasharray', this), + 'stroke-linecap': styler.compute2('segments', 'stroke-linecap', this) + }) } refresh (display, renderData) { - if (renderData) { + /*if (renderData) { this.renderData = renderData } else { this.renderData = [] @@ -102,7 +87,7 @@ export default class RenderedSegment { this.lineGraph.attr('d', lineData) this.lineGraphFront.attr('d', lineData) if (this.lineGraphHalo) this.lineGraphHalo.attr('d', lineData) - display.styler.styleSegment(display, this) + display.styler.styleSegment(display, this)*/ } setFocused (focused) { diff --git a/lib/renderer/renderer.js b/lib/renderer/renderer.js index 481b3168..0d1ba305 100644 --- a/lib/renderer/renderer.js +++ b/lib/renderer/renderer.js @@ -21,7 +21,7 @@ export default class Renderer { display.styler = this.transitive.styler // remove all old svg elements - display.empty() + display.clear() } /** diff --git a/lib/renderer/wireframe-renderer.js b/lib/renderer/wireframe-renderer.js index d11fbbd2..97210fa8 100644 --- a/lib/renderer/wireframe-renderer.js +++ b/lib/renderer/wireframe-renderer.js @@ -1,10 +1,7 @@ import { forEach } from 'lodash' -import d3 from 'd3' import Renderer from './renderer' -import Point from '../point/point' - -import interpolateLine from '../util/interpolate-line' +import { renderDataToSvgPath } from '../util' /** * A Renderer subclass for drawing a simplified representation of the graph @@ -17,136 +14,33 @@ export default class WireframeRenderer extends Renderer { render () { super.render() - var graph = this.transitive.network.graph + const { display } = this.transitive + const { graph } = this.transitive.network - this.wireframeEdges = [] + // Draw the edges forEach(graph.edges, edge => { - var wfEdge = new WireframeEdge(edge) - wfEdge.render(this.transitive.display) - this.wireframeEdges.push(wfEdge) + // Get a basic, non-offset edge renderData array + const renderData = edge.getRenderCoords(0, 0, display, true) + + display.drawPath(renderDataToSvgPath(renderData), { + fill: 'none', + 'stroke-width': 2, + stroke: '#000', + 'stroke-dasharray': '4,2' + }) }) - this.wireframeVertices = [] + // Draw the vertices forEach(graph.vertices, vertex => { - var wfVertex = new WireframeVertex(vertex) - wfVertex.render(this.transitive.display) - this.wireframeVertices.push(wfVertex) - }) - - this.transitive.refresh() - } - - refresh (panning) { - super.refresh(panning) - - forEach(this.wireframeEdges, wfEdge => { - wfEdge.refresh(this.transitive.display) - }) - - forEach(this.wireframeVertices, wfVertex => { - wfVertex.refresh(this.transitive.display) - }) - } -} - -/** - * Expose `WireframeRenderer` - */ - -module.exports = WireframeRenderer - -/** - * WireframeVertex helper class - */ - -class WireframeVertex extends Point { - constructor (vertex) { - super({ vertex }) - } - - getType () { - return 'WIREFRAME_VERTEX' - } - - /** - * Draw the vertex - * - * @param {Display} display - */ - - render (display) { - super.render(display) - - this.initSvg(display) - this.svgGroup - .attr('class', 'transitive-sortable') - .datum({ - owner: this, - sortableType: 'POINT_WIREFRAME_VERTEX' - }) - - // set up the marker - this.marker = this.markerSvg.append('circle') - .datum({ - owner: this + display.drawCircle({ + x: display.xScale(vertex.x), + y: display.yScale(vertex.y) + }, { + r: 4, + fill: '#000' }) - .attr('class', 'transitive-wireframe-vertex-circle') - } - - /** - * Refresh the vertex - * - * @param {Display} display - */ - - refresh (display) { - var x = display.xScale(this.vertex.x) - var y = display.yScale(this.vertex.y) - var translate = 'translate(' + x + ', ' + y + ')' - this.marker.attr('transform', translate) - display.styler.styleWireframeVertex(display, this) - } -} - -/** - * WireframeEdge helper class - */ - -class WireframeEdge { - constructor (edge) { - this.edge = edge - } - - render (display) { - this.line = d3.svg.line() // the line translation function - .x((data, i) => { - return data.x - }) - .y((data, i) => { - return data.y - }) - .interpolate(interpolateLine.bind({ - segment: this, - display: display - })) - - this.svgGroup = display.svg.append('g') - - this.lineSvg = this.svgGroup.append('g') - .attr('class', 'transitive-sortable') - .datum({ - owner: this, - sortableType: 'WIREFRAME_EDGE' - }) - - this.lineGraph = this.lineSvg.append('path') - .attr('class', 'transitive-wireframe-edge-line') + }) } - refresh (display) { - this.renderData = this.edge.getRenderCoords(0, 0, display, true) - var lineData = this.line(this.renderData) - this.lineGraph.attr('d', lineData) - display.styler.styleWireframeEdge(display, this) - } + refresh (panning) { } } diff --git a/lib/styler/styler.js b/lib/styler/styler.js index 11869b94..4177cd01 100644 --- a/lib/styler/styler.js +++ b/lib/styler/styler.js @@ -56,8 +56,9 @@ var svgAttributes = [ */ export default class Styler { - constructor (styles) { - if (!(this instanceof Styler)) return new Styler(styles) + constructor (styles, transitive) { + //if (!(this instanceof Styler)) return new Styler(styles) + this.transitive = transitive // reset styles this.reset() @@ -346,7 +347,7 @@ export default class Styler { var self = this for (var i in rules) { var rule = rules[i] - var val = isFunction(rule) + var val = (typeof rule === 'function') ? rule.call(self, display, data, index, styles.utils) : rule if (val !== undefined && val !== null) computed = val @@ -354,6 +355,20 @@ export default class Styler { return computed } + compute2 (type, attr, data, index) { + let computed + const rules = this[type][attr] + if (!rules) return null + for (const rule of rules) { + const val = (typeof rule === 'function') + ? rule.call(this, this.transitive.display, data, index, styles.utils) + : rule + if (val !== undefined && val !== null) computed = val + } + return computed + } + + /** * Return the collection of default segment styles for a mode. * diff --git a/lib/styler/styles.js b/lib/styler/styles.js index 183db3fe..16e8a173 100644 --- a/lib/styler/styles.js +++ b/lib/styler/styles.js @@ -19,10 +19,10 @@ const utils = { return zoomScale.range([min, normal, max])(zoom) }, strokeWidth: function (display) { - return strokeScale(display.zoom.scale()) + return strokeScale(display.scale) }, fontSize: function (display, data) { - return Math.floor(fontScale(display.zoom.scale())) + return Math.floor(fontScale(display.scale)) }, defineSegmentCircleMarker: function (display, segment, radius, fillColor) { var markerId = 'circleMarker-' + segment.getId() @@ -66,18 +66,17 @@ const wireframeEdges = { */ const stopsMerged = { - fill: function (display, data, index, utils) { + fill: function (display, point, index, utils) { return '#fff' }, - r: function (display, data, index, utils) { - return utils.pixels(display.zoom.scale(), 8, 12, 16) + r: function (display, point, index, utils) { + return utils.pixels(display.scale, 8, 12, 16) }, - stroke: function (display, data, index, utils) { - var point = data.owner + stroke: function (display, point, index, utils) { if (!point.isFocused()) return notFocusedColor return '#000' }, - 'stroke-width': function (display, data, index, utils) { + 'stroke-width': function (display, point, index, utils) { return 2 }, @@ -119,7 +118,7 @@ const stopsPattern = exports.stops_pattern = { r: [ 4, function (display, data, index, utils) { - return utils.pixels(display.zoom.scale(), 1, 2, 4) + return utils.pixels(display.scale, 1, 2, 4) }, function (display, data, index, utils) { var point = data.owner @@ -128,13 +127,13 @@ const stopsPattern = exports.stops_pattern = { if (pattern.route && pattern.route.route_type !== 3) busOnly = false }) if (busOnly && !point.containsSegmentEndPoint()) { - return 0.5 * utils.pixels(display.zoom.scale(), 2, 4, 6.5) + return 0.5 * utils.pixels(display.scale, 2, 4, 6.5) } } ], stroke: 'none', visibility: function (display, data) { - if (display.zoom.scale() < 1.5) return 'hidden' + if (display.scale < 1.5) return 'hidden' if (data.owner.containsSegmentEndPoint()) return 'hidden' } } @@ -147,7 +146,8 @@ const places = { cx: 0, cy: 0, r: 14, - stroke: '0px', + 'stroke-width': '2px', + stroke: '#000', fill: '#fff' } @@ -170,13 +170,12 @@ const multipointsPattern = Object.assign({}, stopsPattern) */ const labels = { - 'font-size': function (display, data, index, utils) { - return utils.fontSize(display, data) + 'px' - }, - 'font-weight': function (display, data, index, utils) { + 'font-size': 15, + 'font-family': 'sans-serif', + /*'font-weight': function (display, data, index, utils) { var point = data.owner.parent if (point.containsBoardPoint() || point.containsAlightPoint()) return 'bold' - }, + },*/ /** * 'orientations' is a transitive-specific attribute used to specify allowable @@ -203,6 +202,14 @@ const labels = { ] } + +const segmentLabels = { + 'font-size': 15, + 'font-family': 'sans-serif', + color: '#fff', + background: '#008' +} + /** * All path segments * TODO: update old route-pattern-specific code below @@ -211,8 +218,7 @@ const labels = { const segments = { stroke: [ '#008', - function (display, data) { - var segment = data + function (display, segment) { if (!segment.focused) return notFocusedColor if (segment.type === 'TRANSIT') { if (segment.patterns) { @@ -223,28 +229,38 @@ const segments = { } } else if (segment.type === 'CAR') { return '#888' + } else if (segment.type.startsWith('BICYCLE')) { + return '#f00' + } else if (segment.type === 'WALK') { + return '#86cdf9' } } ], + 'stroke-linecap': [ + 'butt', + (display, segment) => { + if (segment.type === 'WALK') return 'round' + } + ], 'stroke-dasharray': [ false, function (display, data) { var segment = data + if (segment.type === 'WALK') return '0, 8' + if (segment.type.startsWith('BICYCLE') || segment.type.startsWith('CAR')) return '8, 3' if (segment.frequency && segment.frequency.average < 12) { - if (segment.frequency.average > 6) return '12px, 12px' - return '12px, 2px' + if (segment.frequency.average > 6) return '12, 12' + return '12, 2' } } ], 'stroke-width': [ - '12px', - function (display, data, index, utils) { - var segment = data - - if (segment.mode === 3) { - return utils.pixels(display.zoom.scale(), 2, 4, 8) + 'px' - } - return utils.pixels(display.zoom.scale(), 4, 8, 12) + 'px' + 10, + function (display, segment, index, utils) { + if (segment.type === 'WALK') return 6 + if (segment.type.startsWith('BICYCLE')) return 4 + if (segment.type.startsWith('CAR')) return 4 + if (segment.mode === 3) return 6 // Buses } ], envelope: [ @@ -255,9 +271,9 @@ const segments = { return '8px' } if (segment.mode === 3) { - return utils.pixels(display.zoom.scale(), 4, 6, 10) + 'px' + return utils.pixels(display.scale, 4, 6, 10) + 'px' } - return utils.pixels(display.zoom.scale(), 6, 10, 14) + 'px' + return utils.pixels(display.scale, 6, 10, 14) + 'px' } ] } @@ -269,7 +285,7 @@ const segments = { const segmentsFront = { stroke: '#008', 'stroke-width': function (display, data, index, utils) { - return utils.pixels(display.zoom.scale(), 3, 6, 10) / 2 + 'px' + return utils.pixels(display.scale, 3, 6, 10) / 2 + 'px' }, fill: 'none', display: [ @@ -328,5 +344,6 @@ export default { segments, segments_front: segmentsFront, segments_halo: segmentsHalo, + segment_labels: segmentLabels, segment_label_containers: segmentLabelContainers } diff --git a/lib/transitive.js b/lib/transitive.js index 39879d65..858a013e 100644 --- a/lib/transitive.js +++ b/lib/transitive.js @@ -2,8 +2,11 @@ import d3 from 'd3' import Emitter from 'component-emitter' import Network from './core/network' -import Display from './display/display' +//import Display from './display/display' +import SvgDisplay from './display/svg-display' +import CanvasDisplay from './display/canvas-display' import DefaultRenderer from './renderer/default-renderer' +//import CanvasRenderer from './renderer/canvas-renderer' import WireframeRenderer from './renderer/wireframe-renderer' import Styler from './styler/styler' import Labeler from './labeler/labeler' @@ -43,17 +46,18 @@ export default class Transitive { if (this.options.autoResize === undefined) this.options.autoResize = true if (this.options.groupEdges === undefined) this.options.groupEdges = true - if (options.el) this.setElement(options.el) - else if (options.svg && options.svgContainer) { - this.setElement() - } + if (options.el) this.el = options.el + + this.display = this.options.display === 'canvas' + ? new CanvasDisplay(this) + : new SvgDisplay(this) this.data = options.data this.setRenderer(this.options.initialRenderer || 'default') this.labeler = new Labeler(this) - this.styler = new Styler(options.styles) + this.styler = new Styler(options.styles, this) } /** @@ -70,10 +74,11 @@ export default class Transitive { * Update the Network data and redraw the map */ - updateData (data) { + updateData (data, resetDisplay) { this.network = null this.data = data - if (this.display) this.display.scaleSet = false + if (resetDisplay) this.display.reset() + else if (this.data) this.display.scaleSet = false this.labeler.clear() this.emit('update data', this) } @@ -98,10 +103,13 @@ export default class Transitive { if (this.el) d3.select(this.el).selectAll('*').remove() this.el = el - this.display = new Display(this) + + /*this.display = this.options.display === 'canvas' + ? new CanvasDisplay(this) + : new SvgDisplay(this)*/ // Emit click events - var self = this + /*var self = this this.display.svg.on('click', function () { var x = d3.event.x var y = d3.event.y @@ -112,7 +120,7 @@ export default class Transitive { lng: geographic[0], lat: geographic[1] }) - }) + })*/ this.emit('set element', this, this.el) return this @@ -143,7 +151,7 @@ export default class Transitive { } if (!this.display.scaleSet) { - this.display.setScale(this.network.graph.bounds(), this.options) + this.display.fitToWorldBounds(this.network.graph.bounds()) } this.renderer.render() @@ -192,8 +200,12 @@ export default class Transitive { */ setDisplayBounds (llBounds) { - this.display.updateDomains([sm.forward(llBounds[0]), sm.forward(llBounds[1])]) - this.display.zoomChanged() + if (!this.display) return + const smWestSouth = sm.forward(llBounds[0]) + const smEastNorth = sm.forward(llBounds[1]) + this.display.setXDomain([smWestSouth[0], smEastNorth[0]]) + this.display.setYDomain([smWestSouth[1], smEastNorth[1]]) + this.display.computeScale() } /** @@ -228,8 +240,13 @@ export default class Transitive { * trigger a display resize action (for externally-managed SVG containers) */ - resized () { - this.display.resized() + resized (width, height) { + this.display.resized(width, height) + } + + setTransform (transform) { + this.display.applyTransform(transform) + this.render() } } diff --git a/lib/util/index.js b/lib/util/index.js index 8e42ec6c..61b5e358 100755 --- a/lib/util/index.js +++ b/lib/util/index.js @@ -2,7 +2,6 @@ * General Transitive utilities library */ -import d3 from 'd3' import SphericalMercator from 'sphericalmercator' var tolerance = 0.000001 @@ -121,23 +120,6 @@ function isOutwardVector (vector) { return (vector.y > 0) } -function getTextBBox (text, attrs) { - var container = d3.select('body').append('svg') - container.append('text') - .attr('x', -1000) - .attr('y', -1000) - .text(text) - for (const key in attrs) container.attr(key, attrs[key]) - - var bbox = container.node().getBBox() - container.remove() - - return { - height: bbox.height, - width: bbox.width - } -} - /** * vector utilities */ @@ -196,6 +178,17 @@ function otpModeToGtfsType (otpMode) { } } +// Rendering utilties + +function renderDataToSvgPath (renderData) { + return renderData.map((d, k) => { + if (k === 0) return `M${d.x} ${d.y}` + if (d.arc) return `A${d.radius} ${d.radius} ${d.arc} 0 ${d.arc > 0 ? 0 : 1} ${d.x} ${d.y}` + return `L${d.x} ${d.y}` + }).join(' ') +} + +// An instance of the SphericalMercator converter const sm = new SphericalMercator() export { @@ -211,11 +204,11 @@ export { lineIntersection, parsePixelStyle, isOutwardVector, - getTextBBox, normalizeVector, rotateVector, negateVector, addVectors, otpModeToGtfsType, + renderDataToSvgPath, sm } diff --git a/package.json b/package.json index 6bf9dc53..68f99264 100644 --- a/package.json +++ b/package.json @@ -20,8 +20,15 @@ "d3": "^3.5.8", "debug": "^2.5.1", "lodash.foreach": "^4.5.0", + "measure-text": "^0.0.4", "priorityqueuejs": "1.0.0", - "sphericalmercator": "^1.0.5" + "rounded-rect": "^0.0.1", + "simple-linear-scale": "^1.0.1", + "sphericalmercator": "^1.0.5", + "svg.js": "^2.6.5" + }, + "peerDependencies": { + "svg.js": "^2.6.4" }, "scripts": { "prepublish": "mastarm prepublish lib:build", diff --git a/yarn.lock b/yarn.lock index d8802872..4e312978 100644 --- a/yarn.lock +++ b/yarn.lock @@ -50,6 +50,12 @@ abbrev@1, abbrev@1.0.x: version "1.0.9" resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.0.9.tgz#91b4792588a7738c25f35dd6f63752a2f8776135" +acorn-dynamic-import@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/acorn-dynamic-import/-/acorn-dynamic-import-2.0.2.tgz#c752bd210bef679501b6c6cb7fc84f8f47158cc4" + dependencies: + acorn "^4.0.3" + acorn-globals@^1.0.4: version "1.0.9" resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-1.0.9.tgz#55bb5e98691507b74579d0513413217c380c54cf" @@ -78,6 +84,14 @@ acorn@^4.0.1: version "4.0.3" resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.3.tgz#1a3e850b428e73ba6b09d1cc527f5aaad4d03ef1" +acorn@^4.0.3: + version "4.0.13" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.13.tgz#105495ae5361d697bd195c825192e1ad7f253787" + +acorn@^5.0.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.1.tgz#f095829297706a7c9776958c0afc8930a9b9d9d8" + agent-base@2: version "2.0.1" resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-2.0.1.tgz#bd8f9e86a8eb221fffa07bd14befd55df142815e" @@ -89,6 +103,10 @@ ajv-keywords@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-1.1.1.tgz#02550bc605a3e576041565628af972e06c549d50" +ajv-keywords@^1.1.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-1.5.1.tgz#314dd0a4b3368fad3dfcdc54ede6171b886daf3c" + ajv@^4.7.0: version "4.7.7" resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.7.7.tgz#4980d5f65ce90a2579532eec66429f320dea0321" @@ -104,6 +122,10 @@ align-text@^0.1.1, align-text@^0.1.3: longest "^1.0.1" repeat-string "^1.5.2" +alphanum-sort@^1.0.1, alphanum-sort@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3" + amdefine@>=0.0.4: version "1.0.0" resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.0.tgz#fd17474700cb5cc9c2b709f0be9d23ce3c198c33" @@ -132,6 +154,12 @@ ansi-styles@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" +ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + dependencies: + color-convert "^1.9.0" + ansi@^0.3.0, ansi@~0.3.0: version "0.3.1" resolved "https://registry.yarnpkg.com/ansi/-/ansi-0.3.1.tgz#0c42d4fb17160d5a9af1e484bace1c66922c1b21" @@ -151,6 +179,13 @@ anymatch@^1.3.0: arrify "^1.0.0" micromatch "^2.1.5" +anymatch@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" + dependencies: + micromatch "^3.1.4" + normalize-path "^2.1.1" + append-transform@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/append-transform/-/append-transform-0.3.0.tgz#d6933ce4a85f09445d9ccc4cc119051b7381a813" @@ -192,10 +227,22 @@ arr-diff@^2.0.0: dependencies: arr-flatten "^1.0.1" +arr-diff@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" + arr-flatten@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.0.1.tgz#e5ffe54d45e19f32f216e91eb99c8ce892bb604b" +arr-flatten@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" + +arr-union@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" + array-differ@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/array-differ/-/array-differ-1.0.0.tgz#eff52e3758249d33be402b8bb8e564bb2b5d4031" @@ -234,6 +281,10 @@ array-unique@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" +array-unique@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" + arrify@^1.0.0, arrify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" @@ -262,12 +313,22 @@ assert-plus@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" +assert@^1.1.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/assert/-/assert-1.4.1.tgz#99912d591836b5a6f5b345c0f07eefc08fc65d91" + dependencies: + util "0.10.3" + assert@~1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/assert/-/assert-1.3.0.tgz#03939a622582a812cc202320a0b9a56c9b815849" dependencies: util "0.10.3" +assign-symbols@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" + astw@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/astw/-/astw-2.0.0.tgz#08121ac8288d35611c0ceec663f6cd545604897d" @@ -288,6 +349,12 @@ async@^2.0.1: dependencies: lodash "^4.14.0" +async@^2.1.2: + version "2.6.1" + resolved "https://registry.yarnpkg.com/async/-/async-2.6.1.tgz#b245a23ca71930044ec53fa46aa00a3e87c6a610" + dependencies: + lodash "^4.17.10" + async@~0.2.6: version "0.2.10" resolved "https://registry.yarnpkg.com/async/-/async-0.2.10.tgz#b6bbe0b0674b9d719708ca38de8c237cb526c3d1" @@ -296,6 +363,10 @@ asynckit@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" +atob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.1.tgz#ae2d5a729477f289d60dd7f96a6314a22dd6c22a" + augment@4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/augment/-/augment-4.3.0.tgz#7dd446264d195ef5efa8b3fe0f89a8f29a160a43" @@ -315,6 +386,17 @@ autoprefixer@^6.0.2: postcss "^5.2.4" postcss-value-parser "^3.2.3" +autoprefixer@^6.3.1: + version "6.7.7" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-6.7.7.tgz#1dbd1c835658e35ce3f9984099db00585c782014" + dependencies: + browserslist "^1.7.6" + caniuse-db "^1.0.30000634" + normalize-range "^0.1.2" + num2fraction "^1.2.2" + postcss "^5.2.16" + postcss-value-parser "^3.2.3" + aws-sdk@^2.4.2: version "2.6.8" resolved "https://registry.yarnpkg.com/aws-sdk/-/aws-sdk-2.6.8.tgz#b43e68c7940c92b15e98e0582f35558a68b7628b" @@ -336,6 +418,27 @@ aws4@^1.2.1: version "1.5.0" resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.5.0.tgz#0a29ffb79c31c9e712eeb087e8e7a64b4a56d755" +babel-cli@^6.4.5: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-cli/-/babel-cli-6.26.0.tgz#502ab54874d7db88ad00b887a06383ce03d002f1" + dependencies: + babel-core "^6.26.0" + babel-polyfill "^6.26.0" + babel-register "^6.26.0" + babel-runtime "^6.26.0" + commander "^2.11.0" + convert-source-map "^1.5.0" + fs-readdir-recursive "^1.0.0" + glob "^7.1.2" + lodash "^4.17.4" + output-file-sync "^1.1.2" + path-is-absolute "^1.0.1" + slash "^1.0.0" + source-map "^0.5.6" + v8flags "^2.1.1" + optionalDependencies: + chokidar "^1.6.1" + babel-code-frame@^6.16.0: version "6.16.0" resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.16.0.tgz#f90e60da0862909d3ce098733b5d3987c97cb8de" @@ -352,6 +455,14 @@ babel-code-frame@^6.20.0: esutils "^2.0.2" js-tokens "^2.0.0" +babel-code-frame@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" + dependencies: + chalk "^1.1.3" + esutils "^2.0.2" + js-tokens "^3.0.2" + babel-core@^6.0.0, babel-core@^6.0.14, babel-core@^6.10.4, babel-core@^6.16.0: version "6.17.0" resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.17.0.tgz#6c4576447df479e241e58c807e4bc7da4db7f425" @@ -378,6 +489,30 @@ babel-core@^6.0.0, babel-core@^6.0.14, babel-core@^6.10.4, babel-core@^6.16.0: slash "^1.0.0" source-map "^0.5.0" +babel-core@^6.26.0, babel-core@^6.4.5: + version "6.26.3" + resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.3.tgz#b2e2f09e342d0f0c88e2f02e067794125e75c207" + dependencies: + babel-code-frame "^6.26.0" + babel-generator "^6.26.0" + babel-helpers "^6.24.1" + babel-messages "^6.23.0" + babel-register "^6.26.0" + babel-runtime "^6.26.0" + babel-template "^6.26.0" + babel-traverse "^6.26.0" + babel-types "^6.26.0" + babylon "^6.18.0" + convert-source-map "^1.5.1" + debug "^2.6.9" + json5 "^0.5.1" + lodash "^4.17.4" + minimatch "^3.0.4" + path-is-absolute "^1.0.1" + private "^0.1.8" + slash "^1.0.0" + source-map "^0.5.7" + babel-eslint@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-7.0.0.tgz#54e51b4033f54ac81326ecea4c646a779935196d" @@ -399,6 +534,27 @@ babel-generator@^6.11.3, babel-generator@^6.17.0: lodash "^4.2.0" source-map "^0.5.0" +babel-generator@^6.26.0: + version "6.26.1" + resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.1.tgz#1844408d3b8f0d35a404ea7ac180f087a601bd90" + dependencies: + babel-messages "^6.23.0" + babel-runtime "^6.26.0" + babel-types "^6.26.0" + detect-indent "^4.0.0" + jsesc "^1.3.0" + lodash "^4.17.4" + source-map "^0.5.7" + trim-right "^1.0.1" + +babel-helper-bindify-decorators@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-bindify-decorators/-/babel-helper-bindify-decorators-6.24.1.tgz#14c19e5f142d7b47f19a52431e52b1ccbc40a330" + dependencies: + babel-runtime "^6.22.0" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + babel-helper-bindify-decorators@^6.8.0: version "6.8.0" resolved "https://registry.yarnpkg.com/babel-helper-bindify-decorators/-/babel-helper-bindify-decorators-6.8.0.tgz#b34805a30b1433cc0042f7054f88a7133c144909" @@ -407,6 +563,14 @@ babel-helper-bindify-decorators@^6.8.0: babel-traverse "^6.8.0" babel-types "^6.8.0" +babel-helper-builder-binary-assignment-operator-visitor@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz#cce4517ada356f4220bcae8a02c2b346f9a56664" + dependencies: + babel-helper-explode-assignable-expression "^6.24.1" + babel-runtime "^6.22.0" + babel-types "^6.24.1" + babel-helper-builder-binary-assignment-operator-visitor@^6.8.0: version "6.15.0" resolved "https://registry.yarnpkg.com/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.15.0.tgz#39e9ee143f797b642262e4646c681c32089ef1ab" @@ -415,6 +579,14 @@ babel-helper-builder-binary-assignment-operator-visitor@^6.8.0: babel-runtime "^6.0.0" babel-types "^6.15.0" +babel-helper-builder-react-jsx@^6.24.1: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-helper-builder-react-jsx/-/babel-helper-builder-react-jsx-6.26.0.tgz#39ff8313b75c8b65dceff1f31d383e0ff2a408a0" + dependencies: + babel-runtime "^6.26.0" + babel-types "^6.26.0" + esutils "^2.0.2" + babel-helper-builder-react-jsx@^6.8.0: version "6.9.0" resolved "https://registry.yarnpkg.com/babel-helper-builder-react-jsx/-/babel-helper-builder-react-jsx-6.9.0.tgz#a633978d669c4c9dcad716cc577ee3e0bb8ae723" @@ -433,6 +605,15 @@ babel-helper-call-delegate@^6.18.0: babel-traverse "^6.18.0" babel-types "^6.18.0" +babel-helper-call-delegate@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz#ece6aacddc76e41c3461f88bfc575bd0daa2df8d" + dependencies: + babel-helper-hoist-variables "^6.24.1" + babel-runtime "^6.22.0" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + babel-helper-define-map@^6.18.0, babel-helper-define-map@^6.8.0: version "6.18.0" resolved "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.18.0.tgz#8d6c85dc7fbb4c19be3de40474d18e97c3676ec2" @@ -442,6 +623,23 @@ babel-helper-define-map@^6.18.0, babel-helper-define-map@^6.8.0: babel-types "^6.18.0" lodash "^4.2.0" +babel-helper-define-map@^6.24.1: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz#a5f56dab41a25f97ecb498c7ebaca9819f95be5f" + dependencies: + babel-helper-function-name "^6.24.1" + babel-runtime "^6.26.0" + babel-types "^6.26.0" + lodash "^4.17.4" + +babel-helper-explode-assignable-expression@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz#f25b82cf7dc10433c55f70592d5746400ac22caa" + dependencies: + babel-runtime "^6.22.0" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + babel-helper-explode-assignable-expression@^6.8.0: version "6.8.0" resolved "https://registry.yarnpkg.com/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.8.0.tgz#9b3525e05b761c3b88919d730a28bad1967e6556" @@ -450,6 +648,15 @@ babel-helper-explode-assignable-expression@^6.8.0: babel-traverse "^6.8.0" babel-types "^6.8.0" +babel-helper-explode-class@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-explode-class/-/babel-helper-explode-class-6.24.1.tgz#7dc2a3910dee007056e1e31d640ced3d54eaa9eb" + dependencies: + babel-helper-bindify-decorators "^6.24.1" + babel-runtime "^6.22.0" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + babel-helper-explode-class@^6.8.0: version "6.8.0" resolved "https://registry.yarnpkg.com/babel-helper-explode-class/-/babel-helper-explode-class-6.8.0.tgz#196a228cc69ea57308695e4ebd1a36cf3f8eca3d" @@ -469,6 +676,16 @@ babel-helper-function-name@^6.18.0, babel-helper-function-name@^6.8.0: babel-traverse "^6.18.0" babel-types "^6.18.0" +babel-helper-function-name@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz#d3475b8c03ed98242a25b48351ab18399d3580a9" + dependencies: + babel-helper-get-function-arity "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + babel-helper-get-function-arity@^6.18.0: version "6.18.0" resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.18.0.tgz#a5b19695fd3f9cdfc328398b47dafcd7094f9f24" @@ -476,6 +693,13 @@ babel-helper-get-function-arity@^6.18.0: babel-runtime "^6.0.0" babel-types "^6.18.0" +babel-helper-get-function-arity@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz#8f7782aa93407c41d3aa50908f89b031b1b6853d" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + babel-helper-hoist-variables@^6.18.0: version "6.18.0" resolved "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.18.0.tgz#a835b5ab8b46d6de9babefae4d98ea41e866b82a" @@ -483,6 +707,13 @@ babel-helper-hoist-variables@^6.18.0: babel-runtime "^6.0.0" babel-types "^6.18.0" +babel-helper-hoist-variables@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz#1ecb27689c9d25513eadbc9914a73f5408be7a76" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + babel-helper-optimise-call-expression@^6.18.0: version "6.18.0" resolved "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.18.0.tgz#9261d0299ee1a4f08a6dd28b7b7c777348fd8f0f" @@ -490,6 +721,21 @@ babel-helper-optimise-call-expression@^6.18.0: babel-runtime "^6.0.0" babel-types "^6.18.0" +babel-helper-optimise-call-expression@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz#f7a13427ba9f73f8f4fa993c54a97882d1244257" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-helper-regex@^6.24.1: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz#325c59f902f82f24b74faceed0363954f6495e72" + dependencies: + babel-runtime "^6.26.0" + babel-types "^6.26.0" + lodash "^4.17.4" + babel-helper-regex@^6.8.0: version "6.9.0" resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.9.0.tgz#c74265fde180ff9a16735fee05e63cadb9e0b057" @@ -508,6 +754,16 @@ babel-helper-remap-async-to-generator@^6.16.0, babel-helper-remap-async-to-gener babel-traverse "^6.16.0" babel-types "^6.16.0" +babel-helper-remap-async-to-generator@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz#5ec581827ad723fecdd381f1c928390676e4551b" + dependencies: + babel-helper-function-name "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + babel-helper-replace-supers@^6.18.0, babel-helper-replace-supers@^6.8.0: version "6.18.0" resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.18.0.tgz#28ec69877be4144dbd64f4cc3a337e89f29a924e" @@ -519,6 +775,17 @@ babel-helper-replace-supers@^6.18.0, babel-helper-replace-supers@^6.8.0: babel-traverse "^6.18.0" babel-types "^6.18.0" +babel-helper-replace-supers@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz#bf6dbfe43938d17369a213ca8a8bf74b6a90ab1a" + dependencies: + babel-helper-optimise-call-expression "^6.24.1" + babel-messages "^6.23.0" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + babel-helpers@^6.16.0: version "6.16.0" resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.16.0.tgz#1095ec10d99279460553e67eb3eee9973d3867e3" @@ -526,6 +793,13 @@ babel-helpers@^6.16.0: babel-runtime "^6.0.0" babel-template "^6.16.0" +babel-helpers@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2" + dependencies: + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-jest@^17.0.2: version "17.0.2" resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-17.0.2.tgz#8d51e0d03759713c331f108eb0b2eaa4c6efff74" @@ -534,6 +808,21 @@ babel-jest@^17.0.2: babel-plugin-istanbul "^2.0.0" babel-preset-jest "^17.0.2" +babel-loader@^6.2.1: + version "6.4.1" + resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-6.4.1.tgz#0b34112d5b0748a8dcdbf51acf6f9bd42d50b8ca" + dependencies: + find-cache-dir "^0.1.1" + loader-utils "^0.2.16" + mkdirp "^0.5.1" + object-assign "^4.0.1" + +babel-messages@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e" + dependencies: + babel-runtime "^6.22.0" + babel-messages@^6.8.0: version "6.8.0" resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.8.0.tgz#bf504736ca967e6d65ef0adb5a2a5f947c8e0eb9" @@ -544,6 +833,12 @@ babel-plugin-add-module-exports@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/babel-plugin-add-module-exports/-/babel-plugin-add-module-exports-0.2.1.tgz#9ae9a1f4a8dc67f0cdec4f4aeda1e43a5ff65e25" +babel-plugin-check-es2015-constants@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz#35157b101426fd2ffd3da3f75c7d1e91835bbf8a" + dependencies: + babel-runtime "^6.22.0" + babel-plugin-check-es2015-constants@^6.3.13: version "6.8.0" resolved "https://registry.yarnpkg.com/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.8.0.tgz#dbf024c32ed37bfda8dee1e76da02386a8d26fe7" @@ -571,11 +866,11 @@ babel-plugin-syntax-async-generators@^6.5.0: version "6.13.0" resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-generators/-/babel-plugin-syntax-async-generators-6.13.0.tgz#6bc963ebb16eccbae6b92b596eb7f35c342a8b9a" -babel-plugin-syntax-class-properties@^6.8.0: +babel-plugin-syntax-class-properties@^6.3.13, babel-plugin-syntax-class-properties@^6.8.0: version "6.13.0" resolved "https://registry.yarnpkg.com/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz#d7eb23b79a317f8543962c505b827c7d6cac27de" -babel-plugin-syntax-decorators@^6.13.0: +babel-plugin-syntax-decorators@^6.1.18, babel-plugin-syntax-decorators@^6.13.0, babel-plugin-syntax-decorators@^6.3.13: version "6.13.0" resolved "https://registry.yarnpkg.com/babel-plugin-syntax-decorators/-/babel-plugin-syntax-decorators-6.13.0.tgz#312563b4dbde3cc806cee3e416cceeaddd11ac0b" @@ -603,6 +898,10 @@ babel-plugin-syntax-trailing-function-commas@^6.13.0, babel-plugin-syntax-traili version "6.13.0" resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.13.0.tgz#2b84b7d53dd744f94ff1fad7669406274b23f541" +babel-plugin-syntax-trailing-function-commas@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz#ba0360937f8d06e40180a43fe0d5616fff532cf3" + babel-plugin-transform-async-generator-functions@^6.17.0: version "6.17.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-generator-functions/-/babel-plugin-transform-async-generator-functions-6.17.0.tgz#d0b5a2b2f0940f2b245fa20a00519ed7bc6cae54" @@ -611,6 +910,14 @@ babel-plugin-transform-async-generator-functions@^6.17.0: babel-plugin-syntax-async-generators "^6.5.0" babel-runtime "^6.0.0" +babel-plugin-transform-async-generator-functions@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-generator-functions/-/babel-plugin-transform-async-generator-functions-6.24.1.tgz#f058900145fd3e9907a6ddf28da59f215258a5db" + dependencies: + babel-helper-remap-async-to-generator "^6.24.1" + babel-plugin-syntax-async-generators "^6.5.0" + babel-runtime "^6.22.0" + babel-plugin-transform-async-to-generator@^6.16.0, babel-plugin-transform-async-to-generator@^6.8.0: version "6.16.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.16.0.tgz#19ec36cb1486b59f9f468adfa42ce13908ca2999" @@ -619,6 +926,14 @@ babel-plugin-transform-async-to-generator@^6.16.0, babel-plugin-transform-async- babel-plugin-syntax-async-functions "^6.8.0" babel-runtime "^6.0.0" +babel-plugin-transform-async-to-generator@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz#6536e378aff6cb1d5517ac0e40eb3e9fc8d08761" + dependencies: + babel-helper-remap-async-to-generator "^6.24.1" + babel-plugin-syntax-async-functions "^6.8.0" + babel-runtime "^6.22.0" + babel-plugin-transform-class-properties@^6.18.0: version "6.19.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.19.0.tgz#1274b349abaadc835164e2004f4a2444a2788d5f" @@ -628,6 +943,23 @@ babel-plugin-transform-class-properties@^6.18.0: babel-runtime "^6.9.1" babel-template "^6.15.0" +babel-plugin-transform-class-properties@^6.24.1, babel-plugin-transform-class-properties@^6.4.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.24.1.tgz#6a79763ea61d33d36f37b611aa9def81a81b46ac" + dependencies: + babel-helper-function-name "^6.24.1" + babel-plugin-syntax-class-properties "^6.8.0" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-decorators-legacy@^1.3.4: + version "1.3.5" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-decorators-legacy/-/babel-plugin-transform-decorators-legacy-1.3.5.tgz#0e492dffa0edd70529072887f8aa86d4dd8b40a1" + dependencies: + babel-plugin-syntax-decorators "^6.1.18" + babel-runtime "^6.2.0" + babel-template "^6.3.0" + babel-plugin-transform-decorators@^6.13.0: version "6.13.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-decorators/-/babel-plugin-transform-decorators-6.13.0.tgz#82d65c1470ae83e2d13eebecb0a1c2476d62da9d" @@ -639,18 +971,50 @@ babel-plugin-transform-decorators@^6.13.0: babel-template "^6.8.0" babel-types "^6.13.0" +babel-plugin-transform-decorators@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-decorators/-/babel-plugin-transform-decorators-6.24.1.tgz#788013d8f8c6b5222bdf7b344390dfd77569e24d" + dependencies: + babel-helper-explode-class "^6.24.1" + babel-plugin-syntax-decorators "^6.13.0" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-arrow-functions@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz#452692cb711d5f79dc7f85e440ce41b9f244d221" + dependencies: + babel-runtime "^6.22.0" + babel-plugin-transform-es2015-arrow-functions@^6.3.13: version "6.8.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.8.0.tgz#5b63afc3181bdc9a8c4d481b5a4f3f7d7fef3d9d" dependencies: babel-runtime "^6.0.0" +babel-plugin-transform-es2015-block-scoped-functions@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz#bbc51b49f964d70cb8d8e0b94e820246ce3a6141" + dependencies: + babel-runtime "^6.22.0" + babel-plugin-transform-es2015-block-scoped-functions@^6.3.13: version "6.8.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.8.0.tgz#ed95d629c4b5a71ae29682b998f70d9833eb366d" dependencies: babel-runtime "^6.0.0" +babel-plugin-transform-es2015-block-scoping@^6.24.1: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz#d70f5299c1308d05c12f463813b0a09e73b1895f" + dependencies: + babel-runtime "^6.26.0" + babel-template "^6.26.0" + babel-traverse "^6.26.0" + babel-types "^6.26.0" + lodash "^4.17.4" + babel-plugin-transform-es2015-block-scoping@^6.6.0: version "6.21.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.21.0.tgz#e840687f922e70fb2c42bb13501838c174a115ed" @@ -661,6 +1025,20 @@ babel-plugin-transform-es2015-block-scoping@^6.6.0: babel-types "^6.21.0" lodash "^4.2.0" +babel-plugin-transform-es2015-classes@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz#5a4c58a50c9c9461e564b4b2a3bfabc97a2584db" + dependencies: + babel-helper-define-map "^6.24.1" + babel-helper-function-name "^6.24.1" + babel-helper-optimise-call-expression "^6.24.1" + babel-helper-replace-supers "^6.24.1" + babel-messages "^6.23.0" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + babel-plugin-transform-es2015-classes@^6.6.0: version "6.18.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.18.0.tgz#ffe7a17321bf83e494dcda0ae3fc72df48ffd1d9" @@ -675,6 +1053,13 @@ babel-plugin-transform-es2015-classes@^6.6.0: babel-traverse "^6.18.0" babel-types "^6.18.0" +babel-plugin-transform-es2015-computed-properties@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz#6fe2a8d16895d5634f4cd999b6d3480a308159b3" + dependencies: + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-plugin-transform-es2015-computed-properties@^6.3.13: version "6.8.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.8.0.tgz#f51010fd61b3bd7b6b60a5fdfd307bb7a5279870" @@ -683,12 +1068,25 @@ babel-plugin-transform-es2015-computed-properties@^6.3.13: babel-runtime "^6.0.0" babel-template "^6.8.0" +babel-plugin-transform-es2015-destructuring@^6.22.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz#997bb1f1ab967f682d2b0876fe358d60e765c56d" + dependencies: + babel-runtime "^6.22.0" + babel-plugin-transform-es2015-destructuring@^6.6.0: version "6.19.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.19.0.tgz#ff1d911c4b3f4cab621bd66702a869acd1900533" dependencies: babel-runtime "^6.9.0" +babel-plugin-transform-es2015-duplicate-keys@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz#73eb3d310ca969e3ef9ec91c53741a6f1576423e" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + babel-plugin-transform-es2015-duplicate-keys@^6.6.0: version "6.8.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.8.0.tgz#fd8f7f7171fc108cc1c70c3164b9f15a81c25f7d" @@ -696,12 +1094,26 @@ babel-plugin-transform-es2015-duplicate-keys@^6.6.0: babel-runtime "^6.0.0" babel-types "^6.8.0" +babel-plugin-transform-es2015-for-of@^6.22.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz#f47c95b2b613df1d3ecc2fdb7573623c75248691" + dependencies: + babel-runtime "^6.22.0" + babel-plugin-transform-es2015-for-of@^6.6.0: version "6.8.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.8.0.tgz#82eda139ba4270dda135c3ec1b1f2813fa62f23c" dependencies: babel-runtime "^6.0.0" +babel-plugin-transform-es2015-function-name@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz#834c89853bc36b1af0f3a4c5dbaa94fd8eacaa8b" + dependencies: + babel-helper-function-name "^6.24.1" + babel-runtime "^6.22.0" + babel-types "^6.24.1" + babel-plugin-transform-es2015-function-name@^6.3.13: version "6.9.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.9.0.tgz#8c135b17dbd064e5bba56ec511baaee2fca82719" @@ -710,12 +1122,26 @@ babel-plugin-transform-es2015-function-name@^6.3.13: babel-runtime "^6.9.0" babel-types "^6.9.0" +babel-plugin-transform-es2015-literals@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz#4f54a02d6cd66cf915280019a31d31925377ca2e" + dependencies: + babel-runtime "^6.22.0" + babel-plugin-transform-es2015-literals@^6.3.13: version "6.8.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.8.0.tgz#50aa2e5c7958fc2ab25d74ec117e0cc98f046468" dependencies: babel-runtime "^6.0.0" +babel-plugin-transform-es2015-modules-amd@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz#3b3e54017239842d6d19c3011c4bd2f00a00d154" + dependencies: + babel-plugin-transform-es2015-modules-commonjs "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-plugin-transform-es2015-modules-amd@^6.8.0: version "6.8.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.8.0.tgz#25d954aa0bf04031fc46d2a8e6230bb1abbde4a3" @@ -724,6 +1150,15 @@ babel-plugin-transform-es2015-modules-amd@^6.8.0: babel-runtime "^6.0.0" babel-template "^6.8.0" +babel-plugin-transform-es2015-modules-commonjs@^6.24.1: + version "6.26.2" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz#58a793863a9e7ca870bdc5a881117ffac27db6f3" + dependencies: + babel-plugin-transform-strict-mode "^6.24.1" + babel-runtime "^6.26.0" + babel-template "^6.26.0" + babel-types "^6.26.0" + babel-plugin-transform-es2015-modules-commonjs@^6.6.0, babel-plugin-transform-es2015-modules-commonjs@^6.8.0: version "6.16.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.16.0.tgz#0a34b447bc88ad1a70988b6d199cca6d0b96c892" @@ -741,6 +1176,14 @@ babel-plugin-transform-es2015-modules-systemjs@^6.12.0: babel-runtime "^6.11.6" babel-template "^6.14.0" +babel-plugin-transform-es2015-modules-systemjs@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz#ff89a142b9119a906195f5f106ecf305d9407d23" + dependencies: + babel-helper-hoist-variables "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-plugin-transform-es2015-modules-umd@^6.12.0: version "6.12.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.12.0.tgz#5d73559eb49266775ed281c40be88a421bd371a3" @@ -749,6 +1192,21 @@ babel-plugin-transform-es2015-modules-umd@^6.12.0: babel-runtime "^6.0.0" babel-template "^6.8.0" +babel-plugin-transform-es2015-modules-umd@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz#ac997e6285cd18ed6176adb607d602344ad38468" + dependencies: + babel-plugin-transform-es2015-modules-amd "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-es2015-object-super@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz#24cef69ae21cb83a7f8603dad021f572eb278f8d" + dependencies: + babel-helper-replace-supers "^6.24.1" + babel-runtime "^6.22.0" + babel-plugin-transform-es2015-object-super@^6.3.13: version "6.8.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.8.0.tgz#1b858740a5a4400887c23dcff6f4d56eea4a24c5" @@ -756,6 +1214,17 @@ babel-plugin-transform-es2015-object-super@^6.3.13: babel-helper-replace-supers "^6.8.0" babel-runtime "^6.0.0" +babel-plugin-transform-es2015-parameters@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz#57ac351ab49caf14a97cd13b09f66fdf0a625f2b" + dependencies: + babel-helper-call-delegate "^6.24.1" + babel-helper-get-function-arity "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + babel-plugin-transform-es2015-parameters@^6.6.0: version "6.21.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.21.0.tgz#46a655e6864ef984091448cdf024d87b60b2a7d8" @@ -767,6 +1236,13 @@ babel-plugin-transform-es2015-parameters@^6.6.0: babel-traverse "^6.21.0" babel-types "^6.21.0" +babel-plugin-transform-es2015-shorthand-properties@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz#24f875d6721c87661bbd99a4622e51f14de38aa0" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + babel-plugin-transform-es2015-shorthand-properties@^6.3.13: version "6.8.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.8.0.tgz#f0a4c5fd471630acf333c2d99c3d677bf0952149" @@ -774,12 +1250,26 @@ babel-plugin-transform-es2015-shorthand-properties@^6.3.13: babel-runtime "^6.0.0" babel-types "^6.8.0" +babel-plugin-transform-es2015-spread@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz#d6d68a99f89aedc4536c81a542e8dd9f1746f8d1" + dependencies: + babel-runtime "^6.22.0" + babel-plugin-transform-es2015-spread@^6.3.13: version "6.8.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.8.0.tgz#0217f737e3b821fa5a669f187c6ed59205f05e9c" dependencies: babel-runtime "^6.0.0" +babel-plugin-transform-es2015-sticky-regex@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz#00c1cdb1aca71112cdf0cf6126c2ed6b457ccdbc" + dependencies: + babel-helper-regex "^6.24.1" + babel-runtime "^6.22.0" + babel-types "^6.24.1" + babel-plugin-transform-es2015-sticky-regex@^6.3.13: version "6.8.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.8.0.tgz#e73d300a440a35d5c64f5c2a344dc236e3df47be" @@ -788,18 +1278,38 @@ babel-plugin-transform-es2015-sticky-regex@^6.3.13: babel-runtime "^6.0.0" babel-types "^6.8.0" +babel-plugin-transform-es2015-template-literals@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz#a84b3450f7e9f8f1f6839d6d687da84bb1236d8d" + dependencies: + babel-runtime "^6.22.0" + babel-plugin-transform-es2015-template-literals@^6.6.0: version "6.8.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.8.0.tgz#86eb876d0a2c635da4ec048b4f7de9dfc897e66b" dependencies: babel-runtime "^6.0.0" +babel-plugin-transform-es2015-typeof-symbol@^6.22.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz#dec09f1cddff94b52ac73d505c84df59dcceb372" + dependencies: + babel-runtime "^6.22.0" + babel-plugin-transform-es2015-typeof-symbol@^6.6.0: version "6.8.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.8.0.tgz#84c29eb1219372480955a020fef7a65c44f30533" dependencies: babel-runtime "^6.0.0" +babel-plugin-transform-es2015-unicode-regex@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz#d38b12f42ea7323f729387f18a7c5ae1faeb35e9" + dependencies: + babel-helper-regex "^6.24.1" + babel-runtime "^6.22.0" + regexpu-core "^2.0.0" + babel-plugin-transform-es2015-unicode-regex@^6.3.13: version "6.11.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.11.0.tgz#6298ceabaad88d50a3f4f392d8de997260f6ef2c" @@ -808,6 +1318,14 @@ babel-plugin-transform-es2015-unicode-regex@^6.3.13: babel-runtime "^6.0.0" regexpu-core "^2.0.0" +babel-plugin-transform-exponentiation-operator@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz#2ab0c9c7f3098fa48907772bb813fe41e8de3a0e" + dependencies: + babel-helper-builder-binary-assignment-operator-visitor "^6.24.1" + babel-plugin-syntax-exponentiation-operator "^6.8.0" + babel-runtime "^6.22.0" + babel-plugin-transform-exponentiation-operator@^6.3.13, babel-plugin-transform-exponentiation-operator@^6.8.0: version "6.8.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.8.0.tgz#db25742e9339eade676ca9acec46f955599a68a4" @@ -823,6 +1341,13 @@ babel-plugin-transform-flow-strip-types@^6.18.0, babel-plugin-transform-flow-str babel-plugin-syntax-flow "^6.18.0" babel-runtime "^6.0.0" +babel-plugin-transform-flow-strip-types@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-flow-strip-types/-/babel-plugin-transform-flow-strip-types-6.22.0.tgz#84cb672935d43714fdc32bce84568d87441cf7cf" + dependencies: + babel-plugin-syntax-flow "^6.18.0" + babel-runtime "^6.22.0" + babel-plugin-transform-object-rest-spread@^6.16.0: version "6.16.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.16.0.tgz#db441d56fffc1999052fdebe2e2f25ebd28e36a9" @@ -830,6 +1355,19 @@ babel-plugin-transform-object-rest-spread@^6.16.0: babel-plugin-syntax-object-rest-spread "^6.8.0" babel-runtime "^6.0.0" +babel-plugin-transform-object-rest-spread@^6.22.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz#0f36692d50fef6b7e2d4b3ac1478137a963b7b06" + dependencies: + babel-plugin-syntax-object-rest-spread "^6.8.0" + babel-runtime "^6.26.0" + +babel-plugin-transform-react-display-name@^6.23.0: + version "6.25.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-display-name/-/babel-plugin-transform-react-display-name-6.25.0.tgz#67e2bf1f1e9c93ab08db96792e05392bf2cc28d1" + dependencies: + babel-runtime "^6.22.0" + babel-plugin-transform-react-display-name@^6.3.13: version "6.8.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-display-name/-/babel-plugin-transform-react-display-name-6.8.0.tgz#f7a084977383d728bdbdc2835bba0159577f660e" @@ -843,6 +1381,20 @@ babel-plugin-transform-react-jsx-self@^6.11.0: babel-plugin-syntax-jsx "^6.8.0" babel-runtime "^6.9.0" +babel-plugin-transform-react-jsx-self@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-jsx-self/-/babel-plugin-transform-react-jsx-self-6.22.0.tgz#df6d80a9da2612a121e6ddd7558bcbecf06e636e" + dependencies: + babel-plugin-syntax-jsx "^6.8.0" + babel-runtime "^6.22.0" + +babel-plugin-transform-react-jsx-source@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-jsx-source/-/babel-plugin-transform-react-jsx-source-6.22.0.tgz#66ac12153f5cd2d17b3c19268f4bf0197f44ecd6" + dependencies: + babel-plugin-syntax-jsx "^6.8.0" + babel-runtime "^6.22.0" + babel-plugin-transform-react-jsx-source@^6.3.13: version "6.9.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-jsx-source/-/babel-plugin-transform-react-jsx-source-6.9.0.tgz#af684a05c2067a86e0957d4f343295ccf5dccf00" @@ -850,6 +1402,14 @@ babel-plugin-transform-react-jsx-source@^6.3.13: babel-plugin-syntax-jsx "^6.8.0" babel-runtime "^6.9.0" +babel-plugin-transform-react-jsx@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-jsx/-/babel-plugin-transform-react-jsx-6.24.1.tgz#840a028e7df460dfc3a2d29f0c0d91f6376e66a3" + dependencies: + babel-helper-builder-react-jsx "^6.24.1" + babel-plugin-syntax-jsx "^6.8.0" + babel-runtime "^6.22.0" + babel-plugin-transform-react-jsx@^6.3.13: version "6.8.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-jsx/-/babel-plugin-transform-react-jsx-6.8.0.tgz#94759942f70af18c617189aa7f3593f1644a71ab" @@ -858,18 +1418,37 @@ babel-plugin-transform-react-jsx@^6.3.13: babel-plugin-syntax-jsx "^6.8.0" babel-runtime "^6.0.0" +babel-plugin-transform-regenerator@^6.24.1: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz#e0703696fbde27f0a3efcacf8b4dca2f7b3a8f2f" + dependencies: + regenerator-transform "^0.10.0" + babel-plugin-transform-regenerator@^6.6.0: version "6.21.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.21.0.tgz#75d0c7e7f84f379358f508451c68a2c5fa5a9703" dependencies: regenerator-transform "0.9.8" +babel-plugin-transform-runtime@^6.4.3: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-runtime/-/babel-plugin-transform-runtime-6.23.0.tgz#88490d446502ea9b8e7efb0fe09ec4d99479b1ee" + dependencies: + babel-runtime "^6.22.0" + babel-plugin-transform-runtime@^6.9.0: version "6.15.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-runtime/-/babel-plugin-transform-runtime-6.15.0.tgz#3d75b4d949ad81af157570273846fb59aeb0d57c" dependencies: babel-runtime "^6.9.0" +babel-plugin-transform-strict-mode@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz#d5faf7aa578a65bbe591cf5edae04a0c67020758" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + babel-plugin-transform-strict-mode@^6.8.0: version "6.11.3" resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.11.3.tgz#183741325126bc7ec9cf4c0fc257d3e7ca5afd40" @@ -885,6 +1464,14 @@ babel-polyfill@^6.16.0: core-js "^2.4.0" regenerator-runtime "^0.10.0" +babel-polyfill@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-polyfill/-/babel-polyfill-6.26.0.tgz#379937abc67d7895970adc621f284cd966cf2153" + dependencies: + babel-runtime "^6.26.0" + core-js "^2.5.0" + regenerator-runtime "^0.10.5" + babel-preset-env@^1.1.0: version "1.1.4" resolved "https://registry.yarnpkg.com/babel-preset-env/-/babel-preset-env-1.1.4.tgz#d876f9fcff5fe0612db3dcbc0c87503b41d4873f" @@ -918,12 +1505,64 @@ babel-preset-env@^1.1.0: babel-plugin-transform-regenerator "^6.6.0" browserslist "^1.4.0" +babel-preset-es2015-webpack@^6.3.13: + version "6.4.3" + resolved "https://registry.yarnpkg.com/babel-preset-es2015-webpack/-/babel-preset-es2015-webpack-6.4.3.tgz#61e3711aea013fa50f500a151fc7989aa6eab20f" + dependencies: + babel-preset-es2015 "^6.6.0" + +babel-preset-es2015@^6.3.13, babel-preset-es2015@^6.6.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-preset-es2015/-/babel-preset-es2015-6.24.1.tgz#d44050d6bc2c9feea702aaf38d727a0210538939" + dependencies: + babel-plugin-check-es2015-constants "^6.22.0" + babel-plugin-transform-es2015-arrow-functions "^6.22.0" + babel-plugin-transform-es2015-block-scoped-functions "^6.22.0" + babel-plugin-transform-es2015-block-scoping "^6.24.1" + babel-plugin-transform-es2015-classes "^6.24.1" + babel-plugin-transform-es2015-computed-properties "^6.24.1" + babel-plugin-transform-es2015-destructuring "^6.22.0" + babel-plugin-transform-es2015-duplicate-keys "^6.24.1" + babel-plugin-transform-es2015-for-of "^6.22.0" + babel-plugin-transform-es2015-function-name "^6.24.1" + babel-plugin-transform-es2015-literals "^6.22.0" + babel-plugin-transform-es2015-modules-amd "^6.24.1" + babel-plugin-transform-es2015-modules-commonjs "^6.24.1" + babel-plugin-transform-es2015-modules-systemjs "^6.24.1" + babel-plugin-transform-es2015-modules-umd "^6.24.1" + babel-plugin-transform-es2015-object-super "^6.24.1" + babel-plugin-transform-es2015-parameters "^6.24.1" + babel-plugin-transform-es2015-shorthand-properties "^6.24.1" + babel-plugin-transform-es2015-spread "^6.22.0" + babel-plugin-transform-es2015-sticky-regex "^6.24.1" + babel-plugin-transform-es2015-template-literals "^6.22.0" + babel-plugin-transform-es2015-typeof-symbol "^6.22.0" + babel-plugin-transform-es2015-unicode-regex "^6.24.1" + babel-plugin-transform-regenerator "^6.24.1" + +babel-preset-flow@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-preset-flow/-/babel-preset-flow-6.23.0.tgz#e71218887085ae9a24b5be4169affb599816c49d" + dependencies: + babel-plugin-transform-flow-strip-types "^6.22.0" + babel-preset-jest@^17.0.2: version "17.0.2" resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-17.0.2.tgz#141e935debe164aaa0364c220d31ccb2176493b2" dependencies: babel-plugin-jest-hoist "^17.0.2" +babel-preset-react@^6.3.13: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-preset-react/-/babel-preset-react-6.24.1.tgz#ba69dfaea45fc3ec639b6a4ecea6e17702c91380" + dependencies: + babel-plugin-syntax-jsx "^6.3.13" + babel-plugin-transform-react-display-name "^6.23.0" + babel-plugin-transform-react-jsx "^6.24.1" + babel-plugin-transform-react-jsx-self "^6.22.0" + babel-plugin-transform-react-jsx-source "^6.22.0" + babel-preset-flow "^6.23.0" + babel-preset-react@^6.5.0: version "6.16.0" resolved "https://registry.yarnpkg.com/babel-preset-react/-/babel-preset-react-6.16.0.tgz#aa117d60de0928607e343c4828906e4661824316" @@ -945,6 +1584,15 @@ babel-preset-stage-2@^6.17.0: babel-plugin-transform-decorators "^6.13.0" babel-preset-stage-3 "^6.17.0" +babel-preset-stage-2@^6.3.13: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-preset-stage-2/-/babel-preset-stage-2-6.24.1.tgz#d9e2960fb3d71187f0e64eec62bc07767219bdc1" + dependencies: + babel-plugin-syntax-dynamic-import "^6.18.0" + babel-plugin-transform-class-properties "^6.24.1" + babel-plugin-transform-decorators "^6.24.1" + babel-preset-stage-3 "^6.24.1" + babel-preset-stage-3@^6.17.0: version "6.17.0" resolved "https://registry.yarnpkg.com/babel-preset-stage-3/-/babel-preset-stage-3-6.17.0.tgz#b6638e46db6e91e3f889013d8ce143917c685e39" @@ -955,6 +1603,16 @@ babel-preset-stage-3@^6.17.0: babel-plugin-transform-exponentiation-operator "^6.3.13" babel-plugin-transform-object-rest-spread "^6.16.0" +babel-preset-stage-3@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-preset-stage-3/-/babel-preset-stage-3-6.24.1.tgz#836ada0a9e7a7fa37cb138fb9326f87934a48395" + dependencies: + babel-plugin-syntax-trailing-function-commas "^6.22.0" + babel-plugin-transform-async-generator-functions "^6.24.1" + babel-plugin-transform-async-to-generator "^6.24.1" + babel-plugin-transform-exponentiation-operator "^6.24.1" + babel-plugin-transform-object-rest-spread "^6.22.0" + babel-register@^6.16.0: version "6.16.3" resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.16.3.tgz#7b0c0ca7bfdeb9188ba4c27e5fcb7599a497c624" @@ -968,6 +1626,18 @@ babel-register@^6.16.0: path-exists "^1.0.0" source-map-support "^0.4.2" +babel-register@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.26.0.tgz#6ed021173e2fcb486d7acb45c6009a856f647071" + dependencies: + babel-core "^6.26.0" + babel-runtime "^6.26.0" + core-js "^2.5.0" + home-or-tmp "^2.0.0" + lodash "^4.17.4" + mkdirp "^0.5.1" + source-map-support "^0.4.15" + babel-runtime@^6.0.0, babel-runtime@^6.11.6, babel-runtime@^6.9.0, babel-runtime@^6.9.1: version "6.11.6" resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.11.6.tgz#6db707fef2d49c49bfa3cb64efdb436b518b8222" @@ -982,6 +1652,13 @@ babel-runtime@^6.18.0, babel-runtime@^6.20.0: core-js "^2.4.0" regenerator-runtime "^0.10.0" +babel-runtime@^6.2.0, babel-runtime@^6.22.0, babel-runtime@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" + dependencies: + core-js "^2.4.0" + regenerator-runtime "^0.11.0" + babel-template@^6.14.0, babel-template@^6.15.0, babel-template@^6.16.0, babel-template@^6.8.0, babel-template@^6.9.0: version "6.16.0" resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.16.0.tgz#e149dd1a9f03a35f817ddbc4d0481988e7ebc8ca" @@ -992,6 +1669,16 @@ babel-template@^6.14.0, babel-template@^6.15.0, babel-template@^6.16.0, babel-te babylon "^6.11.0" lodash "^4.2.0" +babel-template@^6.24.1, babel-template@^6.26.0, babel-template@^6.3.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02" + dependencies: + babel-runtime "^6.26.0" + babel-traverse "^6.26.0" + babel-types "^6.26.0" + babylon "^6.18.0" + lodash "^4.17.4" + babel-traverse@^6.15.0, babel-traverse@^6.16.0: version "6.16.0" resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.16.0.tgz#fba85ae1fd4d107de9ce003149cc57f53bef0c4f" @@ -1020,6 +1707,20 @@ babel-traverse@^6.18.0, babel-traverse@^6.21.0, babel-traverse@^6.8.0, babel-tra invariant "^2.2.0" lodash "^4.2.0" +babel-traverse@^6.24.1, babel-traverse@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee" + dependencies: + babel-code-frame "^6.26.0" + babel-messages "^6.23.0" + babel-runtime "^6.26.0" + babel-types "^6.26.0" + babylon "^6.18.0" + debug "^2.6.8" + globals "^9.18.0" + invariant "^2.2.2" + lodash "^4.17.4" + babel-types@^6.10.2, babel-types@^6.13.0, babel-types@^6.18.0, babel-types@^6.19.0, babel-types@^6.21.0, babel-types@^6.8.0, babel-types@^6.9.0: version "6.21.0" resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.21.0.tgz#314b92168891ef6d3806b7f7a917fdf87c11a4b2" @@ -1038,6 +1739,15 @@ babel-types@^6.15.0, babel-types@^6.16.0: lodash "^4.2.0" to-fast-properties "^1.0.1" +babel-types@^6.24.1, babel-types@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497" + dependencies: + babel-runtime "^6.26.0" + esutils "^2.0.2" + lodash "^4.17.4" + to-fast-properties "^1.0.3" + babelify@^7.3.0: version "7.3.0" resolved "https://registry.yarnpkg.com/babelify/-/babelify-7.3.0.tgz#aa56aede7067fd7bd549666ee16dc285087e88e5" @@ -1049,6 +1759,10 @@ babylon@^6.11.0, babylon@^6.11.2, babylon@^6.8.1: version "6.11.6" resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.11.6.tgz#56dc52e624882841c7fe095257fbcb4a5bb61ae1" +babylon@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" + balanced-match@0.1.0, balanced-match@~0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-0.1.0.tgz#b504bd05869b39259dd0c5efc35d843176dccc4a" @@ -1061,16 +1775,36 @@ balanced-match@^0.4.1, balanced-match@^0.4.2: version "0.4.2" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-0.4.2.tgz#cb3f3e3c732dc0f01ee70b403f302e61d7709838" +balanced-match@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" + base64-js@^1.0.2: version "1.2.0" resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.2.0.tgz#a39992d723584811982be5e290bb6a53d86700f1" +base@^0.11.1: + version "0.11.2" + resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" + dependencies: + cache-base "^1.0.1" + class-utils "^0.3.5" + component-emitter "^1.2.1" + define-property "^1.0.0" + isobject "^3.0.1" + mixin-deep "^1.2.0" + pascalcase "^0.1.1" + bcrypt-pbkdf@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.0.tgz#3ca76b85241c7170bf7d9703e7b9aa74630040d4" dependencies: tweetnacl "^0.14.3" +big.js@^3.1.3: + version "3.2.0" + resolved "https://registry.yarnpkg.com/big.js/-/big.js-3.2.0.tgz#a5fc298b81b9e0dca2e458824784b65c52ba588e" + binary-extensions@^1.0.0: version "1.7.0" resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.7.0.tgz#6c1610db163abfb34edfe42fa423343a1e01185d" @@ -1131,6 +1865,13 @@ brace-expansion@^1.0.0: balanced-match "^0.4.1" concat-map "0.0.1" +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + braces@^1.8.2: version "1.8.5" resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7" @@ -1139,6 +1880,21 @@ braces@^1.8.2: preserve "^0.2.0" repeat-element "^1.1.2" +braces@^2.3.0, braces@^2.3.1: + version "2.3.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" + dependencies: + arr-flatten "^1.1.0" + array-unique "^0.3.2" + extend-shallow "^2.0.1" + fill-range "^4.0.0" + isobject "^3.0.1" + repeat-element "^1.1.2" + snapdragon "^0.8.1" + snapdragon-node "^2.0.1" + split-string "^3.0.2" + to-regex "^3.0.1" + brorand@^1.0.1: version "1.0.6" resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.0.6.tgz#4028706b915f91f7b349a2e0bf3c376039d216e5" @@ -1213,6 +1969,12 @@ browserify-sign@^4.0.0: inherits "^2.0.1" parse-asn1 "^5.0.0" +browserify-zlib@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f" + dependencies: + pako "~1.0.5" + browserify-zlib@~0.1.2: version "0.1.4" resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.1.4.tgz#bb35f8a519f600e0fa6b8485241c979d0141fb2d" @@ -1276,6 +2038,13 @@ browserslist@^1.0.0, browserslist@^1.0.1, browserslist@^1.4.0, browserslist@~1.4 dependencies: caniuse-db "^1.0.30000539" +browserslist@^1.3.6, browserslist@^1.5.2, browserslist@^1.7.6: + version "1.7.7" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-1.7.7.tgz#0bd76704258be829b2398bb50e4b62d1a166b0b9" + dependencies: + caniuse-db "^1.0.30000639" + electron-to-chromium "^1.2.7" + bser@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/bser/-/bser-1.0.2.tgz#381116970b2a6deea5646dd15dd7278444b56169" @@ -1322,7 +2091,7 @@ buffer-xor@^1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" -buffer@4.9.1, buffer@^4.1.0: +buffer@4.9.1, buffer@^4.1.0, buffer@^4.3.0: version "4.9.1" resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.1.tgz#6d1bb601b07a4efced97094132093027c95bc298" dependencies: @@ -1338,6 +2107,10 @@ builtin-status-codes@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-2.0.0.tgz#6f22003baacf003ccd287afe6872151fddc58579" +builtin-status-codes@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" + bytes@2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/bytes/-/bytes-2.2.0.tgz#fd35464a403f6f9117c2de3609ecff9cae000588" @@ -1346,6 +2119,20 @@ bytes@2.4.0: version "2.4.0" resolved "https://registry.yarnpkg.com/bytes/-/bytes-2.4.0.tgz#7d97196f9d5baf7f6935e25985549edd2a6c2339" +cache-base@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" + dependencies: + collection-visit "^1.0.0" + component-emitter "^1.2.1" + get-value "^2.0.6" + has-value "^1.0.0" + isobject "^3.0.1" + set-value "^2.0.0" + to-object-path "^0.3.0" + union-value "^1.0.0" + unset-value "^1.0.0" + caller-path@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-0.1.0.tgz#94085ef63581ecd3daa92444a8fe94e82577751f" @@ -1389,10 +2176,23 @@ caniuse-api@^1.3.2: lodash.uniq "^4.3.0" shelljs "^0.7.0" +caniuse-api@^1.5.2: + version "1.6.1" + resolved "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-1.6.1.tgz#b534e7c734c4f81ec5fbe8aca2ad24354b962c6c" + dependencies: + browserslist "^1.3.6" + caniuse-db "^1.0.30000529" + lodash.memoize "^4.1.2" + lodash.uniq "^4.5.0" + caniuse-db@^1.0.30000346, caniuse-db@^1.0.30000539, caniuse-db@^1.0.30000554: version "1.0.30000555" resolved "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30000555.tgz#12572c4e0111781c49b01e1fdcc455e7456b8ed4" +caniuse-db@^1.0.30000529, caniuse-db@^1.0.30000634, caniuse-db@^1.0.30000639: + version "1.0.30000859" + resolved "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30000859.tgz#6e813a1757f19a93cb3675f6b5037aca80bea062" + cardinal@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/cardinal/-/cardinal-1.0.0.tgz#50e21c1b0aa37729f9377def196b5a9cec932ee9" @@ -1431,6 +2231,14 @@ chalk@^0.5.1: strip-ansi "^0.3.0" supports-color "^0.2.0" +chalk@^2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.1.tgz#18c49ab16a037b6eb0152cc83e3471338215b66e" + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + chokidar@^1.0.0, chokidar@^1.0.1, chokidar@^1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.6.0.tgz#90c32ad4802901d7713de532dc284e96a63ad058" @@ -1446,6 +2254,44 @@ chokidar@^1.0.0, chokidar@^1.0.1, chokidar@^1.6.0: optionalDependencies: fsevents "^1.0.0" +chokidar@^1.6.1: + version "1.7.0" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.7.0.tgz#798e689778151c8076b4b360e5edd28cda2bb468" + dependencies: + anymatch "^1.3.0" + async-each "^1.0.0" + glob-parent "^2.0.0" + inherits "^2.0.1" + is-binary-path "^1.0.0" + is-glob "^2.0.0" + path-is-absolute "^1.0.0" + readdirp "^2.0.0" + optionalDependencies: + fsevents "^1.0.0" + +chokidar@^2.0.2: + version "2.0.4" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.0.4.tgz#356ff4e2b0e8e43e322d18a372460bbcf3accd26" + dependencies: + anymatch "^2.0.0" + async-each "^1.0.0" + braces "^2.3.0" + glob-parent "^3.1.0" + inherits "^2.0.1" + is-binary-path "^1.0.0" + is-glob "^4.0.0" + lodash.debounce "^4.0.8" + normalize-path "^2.1.1" + path-is-absolute "^1.0.0" + readdirp "^2.0.0" + upath "^1.0.5" + optionalDependencies: + fsevents "^1.2.2" + +chownr@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.0.1.tgz#e2a75042a9551908bebd25b8523d5f9769d79181" + cipher-base@^1.0.0, cipher-base@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.3.tgz#eeabf194419ce900da3018c207d212f2a6df0a07" @@ -1456,6 +2302,21 @@ circular-json@^0.3.0: version "0.3.1" resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.1.tgz#be8b36aefccde8b3ca7aa2d6afc07a37242c0d2d" +clap@^1.0.9: + version "1.2.3" + resolved "https://registry.yarnpkg.com/clap/-/clap-1.2.3.tgz#4f36745b32008492557f46412d66d50cb99bce51" + dependencies: + chalk "^1.1.3" + +class-utils@^0.3.5: + version "0.3.6" + resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" + dependencies: + arr-union "^3.1.0" + define-property "^0.2.5" + isobject "^3.0.0" + static-extend "^0.1.1" + cli-cursor@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-1.0.2.tgz#64da3f7d56a54412e59794bd62dc35295e8f2987" @@ -1503,12 +2364,25 @@ co@^4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" +coa@~1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/coa/-/coa-1.0.4.tgz#a9ef153660d6a86a8bdec0289a5c684d217432fd" + dependencies: + q "^1.1.2" + code-point-at@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.0.1.tgz#1104cd34f9b5b45d3eba88f1babc1924e1ce35fb" dependencies: number-is-nan "^1.0.0" +collection-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" + dependencies: + map-visit "^1.0.0" + object-visit "^1.0.0" + color-convert@0.5.x, color-convert@^0.5.3: version "0.5.3" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-0.5.3.tgz#bdb6c69ce660fadffe0b0007cc447e1b9f7282bd" @@ -1517,10 +2391,20 @@ color-convert@^1.3.0: version "1.5.0" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.5.0.tgz#7a2b4efb4488df85bca6443cb038b7100fbe7de1" +color-convert@^1.9.0: + version "1.9.2" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.2.tgz#49881b8fba67df12a96bdf3f56c0aab9e7913147" + dependencies: + color-name "1.1.1" + color-name@1.0.x, color-name@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.0.1.tgz#6b34b2b29b7716013972b0b9d5bedcfbb6718df8" +color-name@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.1.tgz#4b1415304cf50028ea81643643bd82ea05803689" + color-string@0.2.x: version "0.2.4" resolved "https://registry.yarnpkg.com/color-string/-/color-string-0.2.4.tgz#221ff64234f71aaa3e13bc8c7e8c95f3cdd8f81a" @@ -1562,10 +2446,22 @@ color@^0.9.0: color-convert "^0.5.3" color-string "^0.3.0" +colormin@^1.0.5: + version "1.1.2" + resolved "https://registry.yarnpkg.com/colormin/-/colormin-1.1.2.tgz#ea2f7420a72b96881a38aae59ec124a6f7298133" + dependencies: + color "^0.11.0" + css-color-names "0.0.4" + has "^1.0.1" + colors@1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b" +colors@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/colors/-/colors-1.1.2.tgz#168a4701756b6a7f51a12ce0c97bfa28c084ed63" + combine-source-map@~0.7.1: version "0.7.2" resolved "https://registry.yarnpkg.com/combine-source-map/-/combine-source-map-0.7.2.tgz#0870312856b307a87cc4ac486f3a9a62aeccc09e" @@ -1581,6 +2477,10 @@ combined-stream@^1.0.5, combined-stream@~1.0.5: dependencies: delayed-stream "~1.0.0" +commander@^2.11.0: + version "2.15.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.15.1.tgz#df46e867d0fc2aec66a34662b406a9ccafff5b0f" + commander@^2.9.0: version "2.9.0" resolved "https://registry.yarnpkg.com/commander/-/commander-2.9.0.tgz#9c99094176e12240cb22d6c5146098400fe0f7d4" @@ -1606,6 +2506,10 @@ commitizen@^2.8.2: shelljs "0.5.3" strip-json-comments "2.0.1" +commondir@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" + component-each: version "0.2.6" resolved "https://registry.yarnpkg.com/component-each/-/component-each-0.2.6.tgz#991faf31ef4fcafbad04237124d381b3394941d5" @@ -1613,7 +2517,7 @@ component-each: component-type "1.0.0" to-function "2.0.6" -component-emitter@1.2.1: +component-emitter@1.2.1, component-emitter@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6" @@ -1658,7 +2562,7 @@ console-control-strings@^1.0.0, console-control-strings@~1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" -constants-browserify@~1.0.0: +constants-browserify@^1.0.0, constants-browserify@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" @@ -1688,14 +2592,26 @@ convert-source-map@^1.1.0: version "1.3.0" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.3.0.tgz#e9f3e9c6e2728efc2676696a70eb382f73106a67" +convert-source-map@^1.5.0, convert-source-map@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.1.tgz#b8278097b9bc229365de5c62cf5fcaed8b5599e5" + convert-source-map@~1.1.0: version "1.1.3" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.1.3.tgz#4829c877e9fe49b3161f3bf3673888e204699860" +copy-descriptor@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" + core-js@^2.4.0: version "2.4.1" resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.4.1.tgz#4de911e667b0eae9124e34254b53aea6fc618d3e" +core-js@^2.5.0: + version "2.5.7" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.7.tgz#f972608ff0cead68b841a16a932d0b183791814e" + "core-util-is@>=1.0.1 <1.1.0-0", core-util-is@^1.0.1, core-util-is@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" @@ -1748,6 +2664,22 @@ crypto-browserify@^3.0.0: public-encrypt "^4.0.0" randombytes "^2.0.0" +crypto-browserify@^3.11.0: + version "3.12.0" + resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" + dependencies: + browserify-cipher "^1.0.0" + browserify-sign "^4.0.0" + create-ecdh "^4.0.0" + create-hash "^1.1.0" + create-hmac "^1.1.0" + diffie-hellman "^5.0.0" + inherits "^2.0.1" + pbkdf2 "^3.0.3" + public-encrypt "^4.0.0" + randombytes "^2.0.0" + randomfill "^1.0.3" + css-color-function@^1.2.0: version "1.3.0" resolved "https://registry.yarnpkg.com/css-color-function/-/css-color-function-1.3.0.tgz#72c767baf978f01b8a8a94f42f17ba5d22a776fc" @@ -1757,6 +2689,89 @@ css-color-function@^1.2.0: debug "~0.7.4" rgb "~0.1.0" +css-color-names@0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/css-color-names/-/css-color-names-0.0.4.tgz#808adc2e79cf84738069b646cb20ec27beb629e0" + +css-loader@^0.23.1: + version "0.23.1" + resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-0.23.1.tgz#9fa23f2b5c0965235910ad5ecef3b8a36390fe50" + dependencies: + css-selector-tokenizer "^0.5.1" + cssnano ">=2.6.1 <4" + loader-utils "~0.2.2" + lodash.camelcase "^3.0.1" + object-assign "^4.0.1" + postcss "^5.0.6" + postcss-modules-extract-imports "^1.0.0" + postcss-modules-local-by-default "^1.0.1" + postcss-modules-scope "^1.0.0" + postcss-modules-values "^1.1.0" + source-list-map "^0.1.4" + +css-selector-tokenizer@^0.5.1: + version "0.5.4" + resolved "https://registry.yarnpkg.com/css-selector-tokenizer/-/css-selector-tokenizer-0.5.4.tgz#139bafd34a35fd0c1428487049e0699e6f6a2c21" + dependencies: + cssesc "^0.1.0" + fastparse "^1.1.1" + +css-selector-tokenizer@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/css-selector-tokenizer/-/css-selector-tokenizer-0.7.0.tgz#e6988474ae8c953477bf5e7efecfceccd9cf4c86" + dependencies: + cssesc "^0.1.0" + fastparse "^1.1.1" + regexpu-core "^1.0.0" + +cssesc@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-0.1.0.tgz#c814903e45623371a0477b40109aaafbeeaddbb4" + +"cssnano@>=2.6.1 <4": + version "3.10.0" + resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-3.10.0.tgz#4f38f6cea2b9b17fa01490f23f1dc68ea65c1c38" + dependencies: + autoprefixer "^6.3.1" + decamelize "^1.1.2" + defined "^1.0.0" + has "^1.0.1" + object-assign "^4.0.1" + postcss "^5.0.14" + postcss-calc "^5.2.0" + postcss-colormin "^2.1.8" + postcss-convert-values "^2.3.4" + postcss-discard-comments "^2.0.4" + postcss-discard-duplicates "^2.0.1" + postcss-discard-empty "^2.0.1" + postcss-discard-overridden "^0.1.1" + postcss-discard-unused "^2.2.1" + postcss-filter-plugins "^2.0.0" + postcss-merge-idents "^2.1.5" + postcss-merge-longhand "^2.0.1" + postcss-merge-rules "^2.0.3" + postcss-minify-font-values "^1.0.2" + postcss-minify-gradients "^1.0.1" + postcss-minify-params "^1.0.4" + postcss-minify-selectors "^2.0.4" + postcss-normalize-charset "^1.1.0" + postcss-normalize-url "^3.0.7" + postcss-ordered-values "^2.1.0" + postcss-reduce-idents "^2.2.2" + postcss-reduce-initial "^1.0.0" + postcss-reduce-transforms "^1.0.3" + postcss-svgo "^2.1.1" + postcss-unique-selectors "^2.0.2" + postcss-value-parser "^3.2.3" + postcss-zindex "^2.0.1" + +csso@~2.3.1: + version "2.3.2" + resolved "https://registry.yarnpkg.com/csso/-/csso-2.3.2.tgz#ddd52c587033f49e94b71fc55569f252e8ff5f85" + dependencies: + clap "^1.0.9" + source-map "^0.5.3" + cssom@0.3.x, "cssom@>= 0.3.0 < 0.4.0": version "0.3.1" resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.1.tgz#c9e37ef2490e64f6d1baa10fda852257082c25d3" @@ -1831,6 +2846,12 @@ debug@2, debug@^2.1.1, debug@^2.2.0, debug@^2.5.1: dependencies: ms "0.7.2" +debug@^2.1.2, debug@^2.3.3, debug@^2.6.8, debug@^2.6.9: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + dependencies: + ms "2.0.0" + debug@~0.7.4: version "0.7.4" resolved "https://registry.yarnpkg.com/debug/-/debug-0.7.4.tgz#06e1ea8082c2cb14e39806e22e2f6f757f92af39" @@ -1845,10 +2866,18 @@ decamelize@^1.0.0, decamelize@^1.1.1, decamelize@^1.1.2: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" +decode-uri-component@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" + dedent@0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.6.0.tgz#0e6da8f0ce52838ef5cec5c8f9396b0c1b64a3cb" +deep-extend@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" + deep-extend@~0.4.0: version "0.4.1" resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.4.1.tgz#efe4113d08085f4e6f9687759810f807469e2253" @@ -1857,6 +2886,25 @@ deep-is@~0.1.3: version "0.1.3" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" +define-property@^0.2.5: + version "0.2.5" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" + dependencies: + is-descriptor "^0.1.0" + +define-property@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" + dependencies: + is-descriptor "^1.0.0" + +define-property@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" + dependencies: + is-descriptor "^1.0.2" + isobject "^3.0.1" + defined@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693" @@ -1916,7 +2964,7 @@ destroy@~1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" -detect-indent@4.0.0: +detect-indent@4.0.0, detect-indent@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" dependencies: @@ -1930,6 +2978,10 @@ detect-indent@^3.0.1: minimist "^1.1.0" repeating "^1.1.0" +detect-libc@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" + detective@^4.0.0: version "4.3.1" resolved "https://registry.yarnpkg.com/detective/-/detective-4.3.1.tgz#9fb06dd1ee8f0ea4dbcc607cda39d9ce1d4f726f" @@ -1963,6 +3015,10 @@ doctrine@^1.2.2: esutils "^2.0.2" isarray "^1.0.0" +domain-browser@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" + domain-browser@~1.1.0: version "1.1.7" resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.1.7.tgz#867aa4b093faa05f1de08c06f4d7b21fdf8698bc" @@ -1987,6 +3043,10 @@ ee-first@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" +electron-to-chromium@^1.2.7: + version "1.3.50" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.50.tgz#7438b76f92b41b919f3fbdd350fbd0757dacddf7" + elliptic@^6.0.0: version "6.3.2" resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.3.2.tgz#e4c81e0829cf0a65ab70e998b8232723b5c1bc48" @@ -1996,6 +3056,10 @@ elliptic@^6.0.0: hash.js "^1.0.0" inherits "^2.0.1" +emojis-list@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389" + encodeurl@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.1.tgz#79e3d58655346909fe6f0f45a5de68103b294d20" @@ -2006,6 +3070,15 @@ encoding@^0.1.11: dependencies: iconv-lite "~0.4.13" +enhanced-resolve@^3.3.0: + version "3.4.1" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-3.4.1.tgz#0421e339fd71419b3da13d129b3979040230476e" + dependencies: + graceful-fs "^4.1.2" + memory-fs "^0.4.0" + object-assign "^4.0.1" + tapable "^0.2.7" + envify@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/envify/-/envify-4.0.0.tgz#f791343e3d11cc29cce41150300a8af61c66cab0" @@ -2019,6 +3092,12 @@ envify@^4.0.0: dependencies: prr "~0.0.0" +errno@^0.1.3: + version "0.1.7" + resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz#4684d71779ad39af177e3f007996f7c67c852618" + dependencies: + prr "~1.0.1" + error-ex@^1.2.0: version "1.3.0" resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.0.tgz#e67b43f3e82c96ea3a584ffee0b9fc3325d802d9" @@ -2235,7 +3314,7 @@ eventemitter3@1.x.x: version "1.2.0" resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-1.2.0.tgz#1c86991d816ad1e504750e73874224ecf3bec508" -events@^1.0.2, events@~1.1.0: +events@^1.0.0, events@^1.0.2, events@~1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924" @@ -2269,12 +3348,37 @@ expand-brackets@^0.1.4: dependencies: is-posix-bracket "^0.1.0" +expand-brackets@^2.1.4: + version "2.1.4" + resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" + dependencies: + debug "^2.3.3" + define-property "^0.2.5" + extend-shallow "^2.0.1" + posix-character-classes "^0.1.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + expand-range@^1.8.1: version "1.8.2" resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" dependencies: fill-range "^2.1.0" +extend-shallow@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" + dependencies: + is-extendable "^0.1.0" + +extend-shallow@^3.0.0, extend-shallow@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" + dependencies: + assign-symbols "^1.0.0" + is-extendable "^1.0.1" + extend@3, extend@^3.0.0, extend@~3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.0.tgz#5a474353b9f3353ddd8176dfd37b91c83a46f1d4" @@ -2297,6 +3401,19 @@ extglob@^0.3.1: dependencies: is-extglob "^1.0.0" +extglob@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" + dependencies: + array-unique "^0.3.2" + define-property "^1.0.0" + expand-brackets "^2.1.4" + extend-shallow "^2.0.1" + fragment-cache "^0.2.1" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + extsprintf@1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.0.2.tgz#e1080e0658e300b06294990cc70e1502235fd550" @@ -2305,6 +3422,10 @@ fast-levenshtein@~2.0.4: version "2.0.5" resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.5.tgz#bd33145744519ab1c36c3ee9f31f08e9079b67f2" +fastparse@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/fastparse/-/fastparse-1.1.1.tgz#d1e2643b38a94d7583b479060e6c4affc94071f8" + faye-websocket@~0.10.0: version "0.10.0" resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.10.0.tgz#4e492f8d04dfb6f89003507f6edbf2d501e7c6f4" @@ -2331,6 +3452,12 @@ file-entry-cache@^2.0.0: flat-cache "^1.2.1" object-assign "^4.0.1" +file-loader@^0.8.5: + version "0.8.5" + resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-0.8.5.tgz#9275d031fe780f27d47f5f4af02bd43713cc151b" + dependencies: + loader-utils "~0.2.5" + filename-regex@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.0.tgz#996e3e80479b98b9897f15a8a58b3d084e926775" @@ -2352,6 +3479,23 @@ fill-range@^2.1.0: repeat-element "^1.1.2" repeat-string "^1.5.2" +fill-range@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" + dependencies: + extend-shallow "^2.0.1" + is-number "^3.0.0" + repeat-string "^1.6.1" + to-regex-range "^2.1.0" + +find-cache-dir@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-0.1.1.tgz#c8defae57c8a52a8a784f9e31c57c742e993a0b9" + dependencies: + commondir "^1.0.1" + mkdirp "^0.5.1" + pkg-dir "^1.0.0" + find-node-modules@1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/find-node-modules/-/find-node-modules-1.0.3.tgz#36117ea45c13d5d8352f82ba791c2b835d730a14" @@ -2400,6 +3544,10 @@ for-in@^0.1.5: version "0.1.6" resolved "https://registry.yarnpkg.com/for-in/-/for-in-0.1.6.tgz#c9f96e89bfad18a545af5ec3ed352a1d9e5b4dc8" +for-in@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" + for-own@^0.1.3: version "0.1.4" resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.4.tgz#0149b41a39088c7515f51ebe1c1386d45f935072" @@ -2430,6 +3578,12 @@ form-data@~2.1.1: combined-stream "^1.0.5" mime-types "^2.1.12" +fragment-cache@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" + dependencies: + map-cache "^0.2.2" + fresh@0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.3.0.tgz#651f838e22424e7566de161d8358caa199f83d4f" @@ -2451,6 +3605,16 @@ from@~0: version "0.1.3" resolved "https://registry.yarnpkg.com/from/-/from-0.1.3.tgz#ef63ac2062ac32acf7862e0d40b44b896f22f3bc" +fs-minipass@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.5.tgz#06c277218454ec288df77ada54a03b8702aacb9d" + dependencies: + minipass "^2.2.1" + +fs-readdir-recursive@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz#e32fc030a2ccee44a6b5371308da54be0b397d27" + fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" @@ -2462,6 +3626,13 @@ fsevents@^1.0.0: nan "^2.3.0" node-pre-gyp "^0.6.29" +fsevents@^1.2.2: + version "1.2.4" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.4.tgz#f41dcb1af2582af3692da36fc55cbd8e1041c426" + dependencies: + nan "^2.9.2" + node-pre-gyp "^0.10.0" + fstream-ignore@~1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/fstream-ignore/-/fstream-ignore-1.0.5.tgz#9c31dae34767018fe1d249b24dada67d092da105" @@ -2483,6 +3654,10 @@ function-bind@^1.0.2: version "1.1.0" resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.0.tgz#16176714c801798e4e8f2cf7f7529467bb4a5771" +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + garnish@^5.0.0: version "5.2.0" resolved "https://registry.yarnpkg.com/garnish/-/garnish-5.2.0.tgz#bed43659382e4b198e33c793897be7c701e65577" @@ -2522,6 +3697,19 @@ gauge@~2.6.0: strip-ansi "^3.0.1" wide-align "^1.1.0" +gauge@~2.7.3: + version "2.7.4" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" + dependencies: + aproba "^1.0.3" + console-control-strings "^1.0.0" + has-unicode "^2.0.0" + object-assign "^4.1.0" + signal-exit "^3.0.0" + string-width "^1.0.1" + strip-ansi "^3.0.1" + wide-align "^1.1.0" + generate-function@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/generate-function/-/generate-function-2.0.0.tgz#6858fe7c0969b7d4e9093337647ac79f60dfbe74" @@ -2550,6 +3738,10 @@ get-stdin@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-5.0.1.tgz#122e161591e21ff4c52530305693f20e6393a398" +get-value@^2.0.3, get-value@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" + getpass@^0.1.1: version "0.1.6" resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.6.tgz#283ffd9fc1256840875311c1b60e8c40187110e6" @@ -2604,6 +3796,13 @@ glob-parent@^2.0.0: dependencies: is-glob "^2.0.0" +glob-parent@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" + dependencies: + is-glob "^3.1.0" + path-dirname "^1.0.0" + glob@5.x, glob@^5.0.15: version "5.0.15" resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1" @@ -2625,6 +3824,17 @@ glob@7.0.5, glob@^7.0.0, glob@^7.0.3, glob@^7.0.5: once "^1.3.0" path-is-absolute "^1.0.0" +glob@^7.1.2: + version "7.1.2" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + glob@~4.3.0: version "4.3.5" resolved "https://registry.yarnpkg.com/glob/-/glob-4.3.5.tgz#80fbb08ca540f238acce5d11d1e9bc41e75173d3" @@ -2642,6 +3852,10 @@ globals@^9.0.0, globals@^9.2.0: version "9.12.0" resolved "https://registry.yarnpkg.com/globals/-/globals-9.12.0.tgz#992ce90828c3a55fa8f16fada177adb64664cf9d" +globals@^9.18.0: + version "9.18.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" + globby@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/globby/-/globby-5.0.0.tgz#ebd84667ca0dbb330b99bcfc68eac2bc54370e0d" @@ -2657,6 +3871,10 @@ graceful-fs@^4.1.2, graceful-fs@^4.1.6: version "4.1.9" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.9.tgz#baacba37d19d11f9d146d3578bc99958c3787e29" +graceful-fs@^4.1.4: + version "4.1.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" + "graceful-readlink@>= 1.0.0": version "1.0.1" resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725" @@ -2704,16 +3922,53 @@ has-flag@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + has-unicode@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" +has-value@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" + dependencies: + get-value "^2.0.3" + has-values "^0.1.4" + isobject "^2.0.0" + +has-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" + dependencies: + get-value "^2.0.6" + has-values "^1.0.0" + isobject "^3.0.0" + +has-values@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" + +has-values@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" + dependencies: + is-number "^3.0.0" + kind-of "^4.0.0" + has@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/has/-/has-1.0.1.tgz#8461733f538b0837c9361e39a9ab9e9704dc2f28" dependencies: function-bind "^1.0.2" +has@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + dependencies: + function-bind "^1.1.1" + hash.js@^1.0.0: version "1.0.3" resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.0.3.tgz#1332ff00156c0a0ffdd8236013d07b77a0451573" @@ -2755,6 +4010,10 @@ hosted-git-info@^2.1.4, hosted-git-info@^2.1.5: version "2.1.5" resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.1.5.tgz#0ba81d90da2e25ab34a332e6ec77936e1598118b" +html-comment-regex@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/html-comment-regex/-/html-comment-regex-1.1.1.tgz#668b93776eaae55ebde8f3ad464b307a4963625e" + html-encoding-sniffer@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-1.0.1.tgz#79bf7a785ea495fe66165e734153f363ff5437da" @@ -2795,6 +4054,10 @@ http-signature@~1.1.0: jsprim "^1.2.2" sshpk "^1.7.0" +https-browserify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" + https-browserify@~0.0.0: version "0.0.1" resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-0.0.1.tgz#3f91365cabe60b77ed0ebba24b454e3e09d95a82" @@ -2811,10 +4074,26 @@ iconv-lite@0.4.13, iconv-lite@^0.4.13, iconv-lite@~0.4.13: version "0.4.13" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.13.tgz#1f88aba4ab0b1508e8312acc39345f36e992e2f2" +iconv-lite@^0.4.4: + version "0.4.23" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.23.tgz#297871f63be507adcfbfca715d0cd0eed84e9a63" + dependencies: + safer-buffer ">= 2.1.2 < 3" + +icss-replace-symbols@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz#06ea6f83679a7749e386cfe1fe812ae5db223ded" + ieee754@^1.1.4: version "1.1.8" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.8.tgz#be33d40ac10ef1926701f6f08a2d86fbfd1ad3e4" +ignore-walk@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.1.tgz#a83e62e7d272ac0e3b551aaa82831a19b69f82f8" + dependencies: + minimatch "^3.0.4" + ignore@^3.0.9, ignore@^3.1.5: version "3.2.0" resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.2.0.tgz#8d88f03c3002a0ac52114db25d2c673b0bf1e435" @@ -2848,7 +4127,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@^2.0.1, inherits@~2.0.0, inherits@~2.0.1: +inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@~2.0.0, inherits@~2.0.1, inherits@~2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" @@ -2938,10 +4217,32 @@ invariant@^2.2.0: dependencies: loose-envify "^1.0.0" +invariant@^2.2.2: + version "2.2.4" + resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" + dependencies: + loose-envify "^1.0.0" + invert-kv@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" +is-absolute-url@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-2.1.0.tgz#50530dfb84fcc9aa7dbe7852e83a37b93b9f2aa6" + +is-accessor-descriptor@^0.1.6: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" + dependencies: + kind-of "^3.0.2" + +is-accessor-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" + dependencies: + kind-of "^6.0.0" + is-arrayish@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" @@ -2956,6 +4257,10 @@ is-buffer@^1.0.2, is-buffer@^1.1.0: version "1.1.4" resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.4.tgz#cfc86ccd5dc5a52fa80489111c6920c457e2d98b" +is-buffer@^1.1.5: + version "1.1.6" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" + is-builtin-module@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe" @@ -2966,6 +4271,34 @@ is-ci@^1.0.9: version "1.0.9" resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-1.0.9.tgz#de2c5ffe49ab3237fda38c47c8a3bbfd55bbcca7" +is-data-descriptor@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" + dependencies: + kind-of "^3.0.2" + +is-data-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" + dependencies: + kind-of "^6.0.0" + +is-descriptor@^0.1.0: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" + dependencies: + is-accessor-descriptor "^0.1.6" + is-data-descriptor "^0.1.4" + kind-of "^5.0.0" + +is-descriptor@^1.0.0, is-descriptor@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" + dependencies: + is-accessor-descriptor "^1.0.0" + is-data-descriptor "^1.0.0" + kind-of "^6.0.2" + is-dotfile@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.2.tgz#2c132383f39199f8edc268ca01b9b007d205cc4d" @@ -2976,14 +4309,24 @@ is-equal-shallow@^0.1.3: dependencies: is-primitive "^2.0.0" -is-extendable@^0.1.1: +is-extendable@^0.1.0, is-extendable@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" +is-extendable@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" + dependencies: + is-plain-object "^2.0.4" + is-extglob@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" +is-extglob@^2.1.0, is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + is-finite@^1.0.0, is-finite@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" @@ -3002,6 +4345,18 @@ is-glob@^2.0.0, is-glob@^2.0.1: dependencies: is-extglob "^1.0.0" +is-glob@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" + dependencies: + is-extglob "^2.1.0" + +is-glob@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.0.tgz#9521c76845cc2610a85203ddf080a958c2ffabc0" + dependencies: + is-extglob "^2.1.1" + is-my-json-valid@^2.10.0, is-my-json-valid@^2.12.4: version "2.15.0" resolved "https://registry.yarnpkg.com/is-my-json-valid/-/is-my-json-valid-2.15.0.tgz#936edda3ca3c211fd98f3b2d3e08da43f7b2915b" @@ -3017,6 +4372,22 @@ is-number@^2.0.2, is-number@^2.1.0: dependencies: kind-of "^3.0.2" +is-number@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" + dependencies: + kind-of "^3.0.2" + +is-number@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-4.0.0.tgz#0026e37f5454d73e356dfe6564699867c6a7f0ff" + +is-odd@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-odd/-/is-odd-2.0.0.tgz#7646624671fd7ea558ccd9a2795182f2958f1b24" + dependencies: + is-number "^4.0.0" + is-path-cwd@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d" @@ -3033,6 +4404,16 @@ is-path-inside@^1.0.0: dependencies: path-is-inside "^1.0.1" +is-plain-obj@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" + +is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + dependencies: + isobject "^3.0.1" + is-posix-bracket@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" @@ -3059,6 +4440,12 @@ is-stream@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" +is-svg@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-svg/-/is-svg-2.1.0.tgz#cf61090da0d9efbcab8722deba6f032208dbb0e9" + dependencies: + html-comment-regex "^1.1.0" + is-typedarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" @@ -3067,6 +4454,10 @@ is-utf8@^0.2.0: version "0.2.1" resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" +is-windows@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" + isarray@0.0.1, isarray@~0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" @@ -3079,12 +4470,20 @@ isexe@^1.1.1: version "1.1.2" resolved "https://registry.yarnpkg.com/isexe/-/isexe-1.1.2.tgz#36f3e22e60750920f5e7241a476a8c6a42275ad0" +isnumeric@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/isnumeric/-/isnumeric-0.2.0.tgz#a2347ba360de19e33d0ffd590fddf7755cbf2e64" + isobject@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" dependencies: isarray "1.0.0" +isobject@^3.0.0, isobject@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + isomorphic-fetch@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz#611ae1acf14f5e81f729507472819fe9733558a9" @@ -3382,6 +4781,10 @@ js-tokens@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-2.0.0.tgz#79903f5563ee778cc1162e6dcf1a0027c97f9cb5" +js-tokens@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" + js-yaml@3.x, js-yaml@^3.5.1: version "3.6.1" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.6.1.tgz#6e5fe67d8b205ce4d22fad05b7781e8dadcc4b30" @@ -3389,6 +4792,13 @@ js-yaml@3.x, js-yaml@^3.5.1: argparse "^1.0.7" esprima "^2.6.0" +js-yaml@~3.7.0: + version "3.7.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.7.0.tgz#5c967ddd837a9bfdca5f2de84253abe8a1c03b80" + dependencies: + argparse "^1.0.7" + esprima "^2.6.0" + jsbn@~0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.0.tgz#650987da0dd74f4ebf5a11377a2aa2d273e97dfd" @@ -3426,6 +4836,10 @@ jsesc@~0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" +json-loader@^0.5.4: + version "0.5.7" + resolved "https://registry.yarnpkg.com/json-loader/-/json-loader-0.5.7.tgz#dca14a70235ff82f0ac9a3abeb60d337a365185d" + json-schema@0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" @@ -3450,6 +4864,10 @@ json5@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/json5/-/json5-0.4.0.tgz#054352e4c4c80c86c0923877d449de176a732c8d" +json5@^0.5.0, json5@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" + jsonify@~0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" @@ -3483,6 +4901,26 @@ kind-of@^3.0.2: dependencies: is-buffer "^1.0.2" +kind-of@^3.0.3, kind-of@^3.2.0: + version "3.2.2" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" + dependencies: + is-buffer "^1.1.5" + +kind-of@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" + dependencies: + is-buffer "^1.1.5" + +kind-of@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" + +kind-of@^6.0.0, kind-of@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051" + labeled-stream-splicer@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/labeled-stream-splicer/-/labeled-stream-splicer-2.0.0.tgz#a52e1d138024c00b86b1c0c91f677918b8ae0a59" @@ -3528,6 +4966,27 @@ load-json-file@^1.0.0: pinkie-promise "^2.0.0" strip-bom "^2.0.0" +loader-runner@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.3.0.tgz#f482aea82d543e07921700d5a46ef26fdac6b8a2" + +loader-utils@^0.2.16, loader-utils@~0.2.2, loader-utils@~0.2.5: + version "0.2.17" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-0.2.17.tgz#f86e6374d43205a6e6c60e9196f17c0299bfb348" + dependencies: + big.js "^3.1.3" + emojis-list "^2.0.0" + json5 "^0.5.0" + object-assign "^4.0.1" + +loader-utils@^1.0.2: + version "1.1.0" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.1.0.tgz#c98aef488bcceda2ffb5e2de646d6a754429f5cd" + dependencies: + big.js "^3.1.3" + emojis-list "^2.0.0" + json5 "^0.5.0" + lodash._arraycopy@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/lodash._arraycopy/-/lodash._arraycopy-3.0.0.tgz#76e7b7c1f1fb92547374878a562ed06a3e50f6e1" @@ -3574,6 +5033,13 @@ lodash._createassigner@^3.0.0: lodash._isiterateecall "^3.0.0" lodash.restparam "^3.0.0" +lodash._createcompounder@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/lodash._createcompounder/-/lodash._createcompounder-3.0.0.tgz#5dd2cb55372d6e70e0e2392fb2304d6631091075" + dependencies: + lodash.deburr "^3.0.0" + lodash.words "^3.0.0" + lodash._getnative@^3.0.0: version "3.9.1" resolved "https://registry.yarnpkg.com/lodash._getnative/-/lodash._getnative-3.9.1.tgz#570bc7dede46d61cdcde687d65d3eecbaa3aaff5" @@ -3586,6 +5052,10 @@ lodash._reinterpolate@~3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" +lodash._root@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/lodash._root/-/lodash._root-3.0.1.tgz#fba1c4524c19ee9a5f8136b4609f017cf4ded692" + lodash.assign@^3.0.0: version "3.2.0" resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-3.2.0.tgz#3ce9f0234b4b2223e296b8fa0ac1fee8ebca64fa" @@ -3598,6 +5068,12 @@ lodash.assign@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-4.2.0.tgz#0d99f3ccd7a6d261d19bdaeb9245005d285808e7" +lodash.camelcase@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-3.0.1.tgz#932c8b87f8a4377897c67197533282f97aeac298" + dependencies: + lodash._createcompounder "^3.0.0" + lodash.clonedeep@^3.0.0: version "3.0.2" resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-3.0.2.tgz#a0a1e40d82a5ea89ff5b147b8444ed63d92827db" @@ -3605,6 +5081,20 @@ lodash.clonedeep@^3.0.0: lodash._baseclone "^3.0.0" lodash._bindcallback "^3.0.0" +lodash.clonedeep@^4.0.1: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" + +lodash.debounce@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" + +lodash.deburr@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/lodash.deburr/-/lodash.deburr-3.2.0.tgz#6da8f54334a366a7cf4c4c76ef8d80aa1b365ed5" + dependencies: + lodash._root "^3.0.0" + lodash.foreach@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.foreach/-/lodash.foreach-4.5.0.tgz#1a6a35eace401280c7f06dddec35165ab27e3e53" @@ -3621,6 +5111,10 @@ lodash.isarray@^3.0.0: version "3.0.4" resolved "https://registry.yarnpkg.com/lodash.isarray/-/lodash.isarray-3.0.4.tgz#79e4eb88c36a8122af86f844aa9bcd851b5fbb55" +lodash.isfinite@^3.3.0: + version "3.3.2" + resolved "https://registry.yarnpkg.com/lodash.isfinite/-/lodash.isfinite-3.3.2.tgz#fb89b65a9a80281833f0b7478b3a5104f898ebb3" + lodash.keys@^3.0.0: version "3.1.2" resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-3.1.2.tgz#4dbc0472b156be50a0b286855d1bd0b0c656098a" @@ -3633,7 +5127,7 @@ lodash.map@^4.5.1: version "4.6.0" resolved "https://registry.yarnpkg.com/lodash.map/-/lodash.map-4.6.0.tgz#771ec7839e3473d9c4cde28b19394c3562f4f6d3" -lodash.memoize@^4.1.0: +lodash.memoize@^4.1.0, lodash.memoize@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" @@ -3641,6 +5135,14 @@ lodash.memoize@~3.0.3: version "3.0.4" resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-3.0.4.tgz#2dcbd2c287cbc0a55cc42328bd0c736150d53e3f" +lodash.merge@^4.0.1: + version "4.6.1" + resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.1.tgz#adc25d9cb99b9391c59624f379fbba60d7111d54" + +lodash.omit@^4.0.1: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.omit/-/lodash.omit-4.5.0.tgz#6eb19ae5a1ee1dd9df0b969e66ce0b7fa30b5e60" + lodash.pad@^4.1.0: version "4.5.1" resolved "https://registry.yarnpkg.com/lodash.pad/-/lodash.pad-4.5.1.tgz#4330949a833a7c8da22cc20f6a26c4d59debba70" @@ -3678,6 +5180,12 @@ lodash.uniq@^4.3.0, lodash.uniq@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" +lodash.words@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/lodash.words/-/lodash.words-3.2.0.tgz#4e2a8649bc08745b17c695b1a3ce8fee596623b3" + dependencies: + lodash._root "^3.0.0" + lodash@4.15.0: version "4.15.0" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.15.0.tgz#3162391d8f0140aa22cf8f6b3c34d6b7f63d3aa9" @@ -3690,6 +5198,10 @@ lodash@^4.0.0, lodash@^4.1.0, lodash@^4.13.1, lodash@^4.14.0, lodash@^4.2.0, lod version "4.16.4" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.16.4.tgz#01ce306b9bad1319f2a5528674f88297aeb70127" +lodash@^4.17.10, lodash@^4.17.4: + version "4.17.10" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.10.tgz#1b7793cf7259ea38fb3661d4d38b3260af8ae4e7" + lodash@~1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/lodash/-/lodash-1.3.1.tgz#a4663b53686b895ff074e2ba504dfb76a8e2b770" @@ -3727,6 +5239,10 @@ makeerror@1.0.x: dependencies: tmpl "1.0.x" +map-cache@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" + map-limit@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/map-limit/-/map-limit-0.0.1.tgz#eb7961031c0f0e8d001bf2d56fab685d58822f38" @@ -3741,6 +5257,12 @@ map-stream@~0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/map-stream/-/map-stream-0.1.0.tgz#e56aa94c4c8055a16404a0674b78f215f7c8e194" +map-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" + dependencies: + object-visit "^1.0.0" + marked-terminal@^1.6.2: version "1.6.2" resolved "https://registry.yarnpkg.com/marked-terminal/-/marked-terminal-1.6.2.tgz#44c128d69b5d9776c848314cdf69d4ec96322973" @@ -3807,10 +5329,45 @@ math-expression-evaluator@^1.2.14: dependencies: lodash.indexof "^4.0.5" +measure-text@^0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/measure-text/-/measure-text-0.0.4.tgz#2bfbc3d903b2b1f247d187a29617f807104f0a52" + dependencies: + babel-cli "^6.4.5" + babel-core "^6.4.5" + babel-loader "^6.2.1" + babel-plugin-syntax-class-properties "^6.3.13" + babel-plugin-syntax-decorators "^6.3.13" + babel-plugin-transform-class-properties "^6.4.0" + babel-plugin-transform-decorators-legacy "^1.3.4" + babel-plugin-transform-runtime "^6.4.3" + babel-preset-es2015 "^6.3.13" + babel-preset-es2015-webpack "^6.3.13" + babel-preset-react "^6.3.13" + babel-preset-stage-2 "^6.3.13" + css-loader "^0.23.1" + file-loader "^0.8.5" + lodash.clonedeep "^4.0.1" + lodash.isfinite "^3.3.0" + lodash.merge "^4.0.1" + lodash.omit "^4.0.1" + rimraf "^2.5.0" + style-loader "^0.13.0" + units-css "^0.4.0" + url-loader "~0.5.7" + webpack "^2.0.7-beta" + media-typer@0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" +memory-fs@^0.4.0, memory-fs@~0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" + dependencies: + errno "^0.1.3" + readable-stream "^2.0.1" + meow@^3.3.0: version "3.7.0" resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb" @@ -3848,6 +5405,24 @@ micromatch@^2.1.5, micromatch@^2.2.0, micromatch@^2.3.11: parse-glob "^3.0.4" regex-cache "^0.4.2" +micromatch@^3.1.4: + version "3.1.10" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + braces "^2.3.1" + define-property "^2.0.2" + extend-shallow "^3.0.2" + extglob "^2.0.4" + fragment-cache "^0.2.1" + kind-of "^6.0.2" + nanomatch "^1.2.9" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.2" + miller-rabin@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.0.tgz#4a62fb1d42933c05583982f4c716f6fb9e6c6d3d" @@ -3869,6 +5444,10 @@ mime@1.3.4, mime@^1.2.11, mime@^1.3.4: version "1.3.4" resolved "https://registry.yarnpkg.com/mime/-/mime-1.3.4.tgz#115f9e3b6b3daf2959983cb38f149a2d40eb5d53" +mime@1.3.x: + version "1.3.6" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.3.6.tgz#591d84d3653a6b0b4a3b9df8de5aa8108e72e5e0" + minimalistic-assert@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz#702be2dda6b37f4836bcb3f5db56641b64a1d3d3" @@ -3885,6 +5464,12 @@ minimatch@2.x, minimatch@^2.0.1: dependencies: brace-expansion "^1.0.0" +minimatch@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + dependencies: + brace-expansion "^1.1.7" + minimist@0.0.5: version "0.0.5" resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.5.tgz#d7aa327bcecf518f9106ac6b8f003fa3bcea8566" @@ -3897,7 +5482,27 @@ minimist@1.2.0, minimist@^1.1.0, minimist@^1.1.1, minimist@^1.1.3, minimist@^1.2 version "1.2.0" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" -mkdirp@0.5.x, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0: +minipass@^2.2.1, minipass@^2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.3.3.tgz#a7dcc8b7b833f5d368759cce544dccb55f50f233" + dependencies: + safe-buffer "^5.1.2" + yallist "^3.0.0" + +minizlib@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.1.0.tgz#11e13658ce46bc3a70a267aac58359d1e0c29ceb" + dependencies: + minipass "^2.2.1" + +mixin-deep@^1.2.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.1.tgz#a49e7268dce1a0d9698e45326c5626df3543d0fe" + dependencies: + for-in "^1.0.2" + is-extendable "^1.0.1" + +mkdirp@0.5.x, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0, mkdirp@~0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" dependencies: @@ -3937,6 +5542,10 @@ ms@0.7.2: version "0.7.2" resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.2.tgz#ae25cf2512b3885a1d95d7f037868d8431124765" +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + multimatch@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/multimatch/-/multimatch-2.1.0.tgz#9c7906a22fb4c02919e2f5f75161b4cdbd4b2a2b" @@ -3958,6 +5567,27 @@ nan@^2.3.0: version "2.4.0" resolved "https://registry.yarnpkg.com/nan/-/nan-2.4.0.tgz#fb3c59d45fe4effe215f0b890f8adf6eb32d2232" +nan@^2.9.2: + version "2.10.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.10.0.tgz#96d0cd610ebd58d4b4de9cc0c6828cda99c7548f" + +nanomatch@^1.2.9: + version "1.2.9" + resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.9.tgz#879f7150cb2dab7a471259066c104eee6e0fa7c2" + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + define-property "^2.0.2" + extend-shallow "^3.0.2" + fragment-cache "^0.2.1" + is-odd "^2.0.0" + is-windows "^1.0.2" + kind-of "^6.0.2" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" @@ -3966,6 +5596,18 @@ nave@~0.5.1: version "0.5.3" resolved "https://registry.yarnpkg.com/nave/-/nave-0.5.3.tgz#5acec72375856e5c76c83bd21a68d713eb5f1ba4" +needle@^2.2.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/needle/-/needle-2.2.1.tgz#b5e325bd3aae8c2678902fa296f729455d1d3a7d" + dependencies: + debug "^2.1.2" + iconv-lite "^0.4.4" + sax "^1.2.4" + +neo-async@^2.5.0: + version "2.5.1" + resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.5.1.tgz#acb909e327b1e87ec9ef15f41b8a269512ad41ee" + nerf-dart@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/nerf-dart/-/nerf-dart-1.0.0.tgz#e6dab7febf5ad816ea81cf5c629c5a0ebde72c1a" @@ -3991,6 +5633,34 @@ node-int64@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" +node-libs-browser@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.1.0.tgz#5f94263d404f6e44767d726901fff05478d600df" + dependencies: + assert "^1.1.1" + browserify-zlib "^0.2.0" + buffer "^4.3.0" + console-browserify "^1.1.0" + constants-browserify "^1.0.0" + crypto-browserify "^3.11.0" + domain-browser "^1.1.1" + events "^1.0.0" + https-browserify "^1.0.0" + os-browserify "^0.3.0" + path-browserify "0.0.0" + process "^0.11.10" + punycode "^1.2.4" + querystring-es3 "^0.2.0" + readable-stream "^2.3.3" + stream-browserify "^2.0.1" + stream-http "^2.7.2" + string_decoder "^1.0.0" + timers-browserify "^2.0.4" + tty-browserify "0.0.0" + url "^0.11.0" + util "^0.10.3" + vm-browserify "0.0.4" + node-notifier@^4.6.1: version "4.6.1" resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-4.6.1.tgz#056d14244f3dcc1ceadfe68af9cff0c5473a33f3" @@ -4003,6 +5673,21 @@ node-notifier@^4.6.1: shellwords "^0.1.0" which "^1.0.5" +node-pre-gyp@^0.10.0: + version "0.10.2" + resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.10.2.tgz#e8945c20ef6795a20aac2b44f036eb13cf5146e3" + dependencies: + detect-libc "^1.0.2" + mkdirp "^0.5.1" + needle "^2.2.0" + nopt "^4.0.1" + npm-packlist "^1.1.6" + npmlog "^4.0.2" + rc "^1.2.7" + rimraf "^2.6.1" + semver "^5.3.0" + tar "^4" + node-pre-gyp@^0.6.29: version "0.6.30" resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.30.tgz#64d3073a6f573003717ccfe30c89023297babba1" @@ -4027,6 +5712,13 @@ nopt@3.x, nopt@^3.0.3, nopt@~3.0.1: dependencies: abbrev "1" +nopt@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" + dependencies: + abbrev "1" + osenv "^0.1.4" + normalize-package-data@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-1.0.3.tgz#8be955b8907af975f1a4584ea8bb9b41492312f5" @@ -4048,10 +5740,29 @@ normalize-path@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.0.1.tgz#47886ac1662760d4261b7d979d241709d3ce3f7a" +normalize-path@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" + dependencies: + remove-trailing-separator "^1.0.1" + normalize-range@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" +normalize-url@^1.4.0: + version "1.9.1" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-1.9.1.tgz#2cc0d66b31ea23036458436e3620d85954c66c3c" + dependencies: + object-assign "^4.0.1" + prepend-http "^1.0.0" + query-string "^4.1.0" + sort-keys "^1.0.0" + +npm-bundled@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.3.tgz#7e71703d973af3370a9591bafe3a63aca0be2308" + "npm-package-arg@^3.0.0 || ^4.0.0": version "4.2.0" resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-4.2.0.tgz#809bc61cabf54bd5ff94f6165c89ba8ee88c115c" @@ -4059,6 +5770,13 @@ normalize-range@^0.1.2: hosted-git-info "^2.1.5" semver "^5.1.0" +npm-packlist@^1.1.6: + version "1.1.10" + resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.1.10.tgz#1039db9e985727e464df066f4cf0ab6ef85c398a" + dependencies: + ignore-walk "^3.0.1" + npm-bundled "^1.0.1" + npm-registry-client@^7.0.1: version "7.2.1" resolved "https://registry.yarnpkg.com/npm-registry-client/-/npm-registry-client-7.2.1.tgz#c792266b088cc313f8525e7e35248626c723db75" @@ -4106,6 +5824,15 @@ npmlog@^1.2.1: are-we-there-yet "~1.0.0" gauge "~1.2.0" +npmlog@^4.0.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" + dependencies: + are-we-there-yet "~1.1.2" + console-control-strings "~1.1.0" + gauge "~2.7.3" + set-blocking "~2.0.0" + "npmlog@~2.0.0 || ~3.1.0": version "3.1.2" resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-3.1.2.tgz#2d46fa874337af9498a2f12bb43d8d0be4a36873" @@ -4135,6 +5862,20 @@ object-assign@^4.0.0, object-assign@^4.0.1, object-assign@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.0.tgz#7a3b3d0e98063d43f4c03f2e8ae6cd51a86883a0" +object-copy@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" + dependencies: + copy-descriptor "^0.1.0" + define-property "^0.2.5" + kind-of "^3.0.3" + +object-visit@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" + dependencies: + isobject "^3.0.0" + object.omit@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.0.tgz#868597333d54e60662940bb458605dd6ae12fe94" @@ -4142,6 +5883,12 @@ object.omit@^2.0.0: for-own "^0.1.3" is-extendable "^0.1.1" +object.pick@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" + dependencies: + isobject "^3.0.1" + on-finished@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" @@ -4192,6 +5939,10 @@ optionator@^0.8.1: type-check "~0.3.2" wordwrap "~1.0.0" +os-browserify@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" + os-browserify@~0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.1.2.tgz#49ca0293e0b19590a5f5de10c7f265a617d8fe54" @@ -4221,12 +5972,27 @@ osenv@^0.1.0: os-homedir "^1.0.0" os-tmpdir "^1.0.0" +osenv@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" + dependencies: + os-homedir "^1.0.0" + os-tmpdir "^1.0.0" + outpipe@^1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/outpipe/-/outpipe-1.1.1.tgz#50cf8616365e87e031e29a5ec9339a3da4725fa2" dependencies: shell-quote "^1.4.2" +output-file-sync@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/output-file-sync/-/output-file-sync-1.1.2.tgz#d0a33eefe61a205facb90092e826598d5245ce76" + dependencies: + graceful-fs "^4.1.4" + mkdirp "^0.5.1" + object-assign "^4.1.0" + pad-left@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/pad-left/-/pad-left-2.1.0.tgz#16e6a3b2d44a8e138cb0838cc7cb403a4fc9e994" @@ -4243,6 +6009,10 @@ pako@~0.2.0: version "0.2.9" resolved "https://registry.yarnpkg.com/pako/-/pako-0.2.9.tgz#f3f7522f4ef782348da8161bad9ecfd51bf83a75" +pako@~1.0.5: + version "1.0.6" + resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.6.tgz#0101211baa70c4bca4a0f63f2206e97b7dfaf258" + parents@^1.0.0, parents@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/parents/-/parents-1.0.1.tgz#fedd4d2bf193a77745fe71e371d73c3307d9c751" @@ -4290,10 +6060,18 @@ parseurl@~1.3.0, parseurl@~1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.1.tgz#c8ab8c9223ba34888aa64a297b28853bec18da56" -path-browserify@~0.0.0: +pascalcase@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" + +path-browserify@0.0.0, path-browserify@~0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.0.tgz#a0b870729aae214005b7d5032ec2cbbb0fb4451a" +path-dirname@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" + path-exists@2.1.0, path-exists@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" @@ -4304,7 +6082,7 @@ path-exists@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-1.0.0.tgz#d5a8998eb71ef37a74c34eb0d9eba6e878eea081" -path-is-absolute@^1.0.0: +path-is-absolute@^1.0.0, path-is-absolute@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" @@ -4384,6 +6162,12 @@ pkg-config@^1.0.1, pkg-config@^1.1.0: find-root "^1.0.0" xtend "^4.0.1" +pkg-dir@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-1.0.0.tgz#7a4b508a8d5bb2d629d447056ff4e9c9314cf3d4" + dependencies: + find-up "^1.0.0" + pleeease-filters@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/pleeease-filters/-/pleeease-filters-3.0.0.tgz#35a4d4c2086413eabc2ce17aaa2ec29054e3075c" @@ -4399,6 +6183,10 @@ pluralize@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-1.2.1.tgz#d1a21483fd22bb41e58a12fa3421823140897c45" +posix-character-classes@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" + postcss-apply@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/postcss-apply/-/postcss-apply-0.3.0.tgz#a2f37c5bdfa881e4c15f4f245ec0cd96dd2e70d5" @@ -4413,7 +6201,7 @@ postcss-attribute-case-insensitive@^1.0.1: postcss "^5.1.1" postcss-selector-parser "^2.2.0" -postcss-calc@^5.0.0: +postcss-calc@^5.0.0, postcss-calc@^5.2.0: version "5.3.1" resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-5.3.1.tgz#77bae7ca928ad85716e2fda42f261bf7c1d65b5e" dependencies: @@ -4471,6 +6259,21 @@ postcss-color-rgba-fallback@^2.0.0: postcss-value-parser "^3.0.2" rgb-hex "^1.0.0" +postcss-colormin@^2.1.8: + version "2.2.2" + resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-2.2.2.tgz#6631417d5f0e909a3d7ec26b24c8a8d1e4f96e4b" + dependencies: + colormin "^1.0.5" + postcss "^5.0.13" + postcss-value-parser "^3.2.3" + +postcss-convert-values@^2.3.4: + version "2.6.1" + resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-2.6.1.tgz#bbd8593c5c1fd2e3d1c322bb925dcae8dae4d62d" + dependencies: + postcss "^5.0.11" + postcss-value-parser "^3.1.2" + postcss-cssnext@^2.6.0: version "2.8.0" resolved "https://registry.yarnpkg.com/postcss-cssnext/-/postcss-cssnext-2.8.0.tgz#fbaef792185967457812f66355d0c24707bb8cf3" @@ -4524,6 +6327,43 @@ postcss-custom-selectors@^3.0.0: postcss "^5.0.0" postcss-selector-matches "^2.0.0" +postcss-discard-comments@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-2.0.4.tgz#befe89fafd5b3dace5ccce51b76b81514be00e3d" + dependencies: + postcss "^5.0.14" + +postcss-discard-duplicates@^2.0.1: + version "2.1.0" + resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-2.1.0.tgz#b9abf27b88ac188158a5eb12abcae20263b91932" + dependencies: + postcss "^5.0.4" + +postcss-discard-empty@^2.0.1: + version "2.1.0" + resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-2.1.0.tgz#d2b4bd9d5ced5ebd8dcade7640c7d7cd7f4f92b5" + dependencies: + postcss "^5.0.14" + +postcss-discard-overridden@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-0.1.1.tgz#8b1eaf554f686fb288cd874c55667b0aa3668d58" + dependencies: + postcss "^5.0.16" + +postcss-discard-unused@^2.2.1: + version "2.2.3" + resolved "https://registry.yarnpkg.com/postcss-discard-unused/-/postcss-discard-unused-2.2.3.tgz#bce30b2cc591ffc634322b5fb3464b6d934f4433" + dependencies: + postcss "^5.0.14" + uniqs "^2.0.0" + +postcss-filter-plugins@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/postcss-filter-plugins/-/postcss-filter-plugins-2.0.3.tgz#82245fdf82337041645e477114d8e593aa18b8ec" + dependencies: + postcss "^5.0.4" + postcss-font-variant@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/postcss-font-variant/-/postcss-font-variant-2.0.1.tgz#7ca29103f59fa02ca3ace2ca22b2f756853d4ef8" @@ -4554,16 +6394,122 @@ postcss-media-minmax@^2.1.0: dependencies: postcss "^5.0.4" +postcss-merge-idents@^2.1.5: + version "2.1.7" + resolved "https://registry.yarnpkg.com/postcss-merge-idents/-/postcss-merge-idents-2.1.7.tgz#4c5530313c08e1d5b3bbf3d2bbc747e278eea270" + dependencies: + has "^1.0.1" + postcss "^5.0.10" + postcss-value-parser "^3.1.1" + +postcss-merge-longhand@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-2.0.2.tgz#23d90cd127b0a77994915332739034a1a4f3d658" + dependencies: + postcss "^5.0.4" + +postcss-merge-rules@^2.0.3: + version "2.1.2" + resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-2.1.2.tgz#d1df5dfaa7b1acc3be553f0e9e10e87c61b5f721" + dependencies: + browserslist "^1.5.2" + caniuse-api "^1.5.2" + postcss "^5.0.4" + postcss-selector-parser "^2.2.2" + vendors "^1.0.0" + postcss-message-helpers@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/postcss-message-helpers/-/postcss-message-helpers-2.0.0.tgz#a4f2f4fab6e4fe002f0aed000478cdf52f9ba60e" +postcss-minify-font-values@^1.0.2: + version "1.0.5" + resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-1.0.5.tgz#4b58edb56641eba7c8474ab3526cafd7bbdecb69" + dependencies: + object-assign "^4.0.1" + postcss "^5.0.4" + postcss-value-parser "^3.0.2" + +postcss-minify-gradients@^1.0.1: + version "1.0.5" + resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-1.0.5.tgz#5dbda11373703f83cfb4a3ea3881d8d75ff5e6e1" + dependencies: + postcss "^5.0.12" + postcss-value-parser "^3.3.0" + +postcss-minify-params@^1.0.4: + version "1.2.2" + resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-1.2.2.tgz#ad2ce071373b943b3d930a3fa59a358c28d6f1f3" + dependencies: + alphanum-sort "^1.0.1" + postcss "^5.0.2" + postcss-value-parser "^3.0.2" + uniqs "^2.0.0" + +postcss-minify-selectors@^2.0.4: + version "2.1.1" + resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-2.1.1.tgz#b2c6a98c0072cf91b932d1a496508114311735bf" + dependencies: + alphanum-sort "^1.0.2" + has "^1.0.1" + postcss "^5.0.14" + postcss-selector-parser "^2.0.0" + +postcss-modules-extract-imports@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.1.0.tgz#b614c9720be6816eaee35fb3a5faa1dba6a05ddb" + dependencies: + postcss "^6.0.1" + +postcss-modules-local-by-default@^1.0.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz#f7d80c398c5a393fa7964466bd19500a7d61c069" + dependencies: + css-selector-tokenizer "^0.7.0" + postcss "^6.0.1" + +postcss-modules-scope@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz#d6ea64994c79f97b62a72b426fbe6056a194bb90" + dependencies: + css-selector-tokenizer "^0.7.0" + postcss "^6.0.1" + +postcss-modules-values@^1.1.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz#ecffa9d7e192518389f42ad0e83f72aec456ea20" + dependencies: + icss-replace-symbols "^1.1.0" + postcss "^6.0.1" + postcss-nesting@^2.0.5: version "2.3.1" resolved "https://registry.yarnpkg.com/postcss-nesting/-/postcss-nesting-2.3.1.tgz#94a6b6a4ef707fbec20a87fee5c957759b4e01cf" dependencies: postcss "^5.0.19" +postcss-normalize-charset@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-1.1.1.tgz#ef9ee71212d7fe759c78ed162f61ed62b5cb93f1" + dependencies: + postcss "^5.0.5" + +postcss-normalize-url@^3.0.7: + version "3.0.8" + resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-3.0.8.tgz#108f74b3f2fcdaf891a2ffa3ea4592279fc78222" + dependencies: + is-absolute-url "^2.0.0" + normalize-url "^1.4.0" + postcss "^5.0.14" + postcss-value-parser "^3.2.3" + +postcss-ordered-values@^2.1.0: + version "2.2.3" + resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-2.2.3.tgz#eec6c2a67b6c412a8db2042e77fe8da43f95c11d" + dependencies: + postcss "^5.0.4" + postcss-value-parser "^3.0.1" + postcss-pseudo-class-any-link@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-1.0.0.tgz#903239196401d335fe73ac756186fa62e693af26" @@ -4577,6 +6523,27 @@ postcss-pseudoelements@^3.0.0: dependencies: postcss "^5.0.4" +postcss-reduce-idents@^2.2.2: + version "2.4.0" + resolved "https://registry.yarnpkg.com/postcss-reduce-idents/-/postcss-reduce-idents-2.4.0.tgz#c2c6d20cc958284f6abfbe63f7609bf409059ad3" + dependencies: + postcss "^5.0.4" + postcss-value-parser "^3.0.2" + +postcss-reduce-initial@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-1.0.1.tgz#68f80695f045d08263a879ad240df8dd64f644ea" + dependencies: + postcss "^5.0.4" + +postcss-reduce-transforms@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-1.0.4.tgz#ff76f4d8212437b31c298a42d2e1444025771ae1" + dependencies: + has "^1.0.1" + postcss "^5.0.8" + postcss-value-parser "^3.0.1" + postcss-replace-overflow-wrap@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-1.0.0.tgz#f0a03b31eab9636a6936bfd210e2aef1b434a643" @@ -4620,6 +6587,14 @@ postcss-selector-parser@^1.1.4: indexes-of "^1.0.1" uniq "^1.0.1" +postcss-selector-parser@^2.0.0, postcss-selector-parser@^2.2.2: + version "2.2.3" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-2.2.3.tgz#f9437788606c3c9acee16ffe8d8b16297f27bb90" + dependencies: + flatten "^1.0.2" + indexes-of "^1.0.1" + uniq "^1.0.1" + postcss-selector-parser@^2.2.0: version "2.2.1" resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-2.2.1.tgz#fdbf696103b12b0a64060e5610507f410491f7c8" @@ -4628,10 +6603,35 @@ postcss-selector-parser@^2.2.0: indexes-of "^1.0.1" uniq "^1.0.1" -postcss-value-parser@^3.0.2, postcss-value-parser@^3.2.3, postcss-value-parser@^3.3.0: +postcss-svgo@^2.1.1: + version "2.1.6" + resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-2.1.6.tgz#b6df18aa613b666e133f08adb5219c2684ac108d" + dependencies: + is-svg "^2.0.0" + postcss "^5.0.14" + postcss-value-parser "^3.2.3" + svgo "^0.7.0" + +postcss-unique-selectors@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-2.0.2.tgz#981d57d29ddcb33e7b1dfe1fd43b8649f933ca1d" + dependencies: + alphanum-sort "^1.0.1" + postcss "^5.0.4" + uniqs "^2.0.0" + +postcss-value-parser@^3.0.1, postcss-value-parser@^3.0.2, postcss-value-parser@^3.1.1, postcss-value-parser@^3.1.2, postcss-value-parser@^3.2.3, postcss-value-parser@^3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz#87f38f9f18f774a4ab4c8a232f5c5ce8872a9d15" +postcss-zindex@^2.0.1: + version "2.2.0" + resolved "https://registry.yarnpkg.com/postcss-zindex/-/postcss-zindex-2.2.0.tgz#d2109ddc055b91af67fc4cb3b025946639d2af22" + dependencies: + has "^1.0.1" + postcss "^5.0.4" + uniqs "^2.0.0" + postcss@^5.0.0, postcss@^5.0.14, postcss@^5.0.16, postcss@^5.0.19, postcss@^5.0.2, postcss@^5.0.21, postcss@^5.0.3, postcss@^5.0.4, postcss@^5.1.1, postcss@^5.2.0, postcss@^5.2.4: version "5.2.4" resolved "https://registry.yarnpkg.com/postcss/-/postcss-5.2.4.tgz#8eb4bee3e5c4e091585b116df32d8db24a535f21" @@ -4641,10 +6641,31 @@ postcss@^5.0.0, postcss@^5.0.14, postcss@^5.0.16, postcss@^5.0.19, postcss@^5.0. source-map "^0.5.6" supports-color "^3.1.2" +postcss@^5.0.10, postcss@^5.0.11, postcss@^5.0.12, postcss@^5.0.13, postcss@^5.0.5, postcss@^5.0.6, postcss@^5.0.8, postcss@^5.2.16: + version "5.2.18" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-5.2.18.tgz#badfa1497d46244f6390f58b319830d9107853c5" + dependencies: + chalk "^1.1.3" + js-base64 "^2.1.9" + source-map "^0.5.6" + supports-color "^3.2.3" + +postcss@^6.0.1: + version "6.0.23" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-6.0.23.tgz#61c82cc328ac60e677645f979054eb98bc0e3324" + dependencies: + chalk "^2.4.1" + source-map "^0.6.1" + supports-color "^5.4.0" + prelude-ls@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" +prepend-http@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" + preserve@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" @@ -4673,10 +6694,22 @@ private@^0.1.6: version "0.1.6" resolved "https://registry.yarnpkg.com/private/-/private-0.1.6.tgz#55c6a976d0f9bafb9924851350fe47b9b5fbb7c1" +private@^0.1.8: + version "0.1.8" + resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" + process-nextick-args@~1.0.6: version "1.0.7" resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" +process-nextick-args@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa" + +process@^0.11.10: + version "0.11.10" + resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" + process@~0.11.0: version "0.11.9" resolved "https://registry.yarnpkg.com/process/-/process-0.11.9.tgz#7bd5ad21aa6253e7da8682264f1e11d11c0318c1" @@ -4699,6 +6732,10 @@ prr@~0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/prr/-/prr-0.0.0.tgz#1a84b85908325501411853d0081ee3fa86e2926a" +prr@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" + public-encrypt@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.0.tgz#39f699f3a46560dd5ebacbca693caf7c65c18cc6" @@ -4713,10 +6750,14 @@ punycode@1.3.2: version "1.3.2" resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" -punycode@^1.3.2: +punycode@^1.2.4, punycode@^1.3.2: version "1.4.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" +q@^1.1.2: + version "1.5.1" + resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" + qs@5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/qs/-/qs-5.2.0.tgz#a9f31142af468cb72b25b30136ba2456834916be" @@ -4733,7 +6774,14 @@ qs@~6.3.0: version "6.3.0" resolved "https://registry.yarnpkg.com/qs/-/qs-6.3.0.tgz#f403b264f23bc01228c74131b407f18d5ea5d442" -querystring-es3@~0.2.0: +query-string@^4.1.0: + version "4.3.4" + resolved "https://registry.yarnpkg.com/query-string/-/query-string-4.3.4.tgz#bbb693b9ca915c232515b228b1a02b609043dbeb" + dependencies: + object-assign "^4.1.0" + strict-uri-encode "^1.0.0" + +querystring-es3@^0.2.0, querystring-es3@~0.2.0: version "0.2.1" resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" @@ -4752,6 +6800,19 @@ randombytes@^2.0.0, randombytes@^2.0.1: version "2.0.3" resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.0.3.tgz#674c99760901c3c4112771a31e521dc349cc09ec" +randombytes@^2.0.5: + version "2.0.6" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.0.6.tgz#d302c522948588848a8d300c932b44c24231da80" + dependencies: + safe-buffer "^5.1.0" + +randomfill@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458" + dependencies: + randombytes "^2.0.5" + safe-buffer "^5.1.0" + range-parser@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e" @@ -4764,6 +6825,15 @@ raw-body@~2.1.5: iconv-lite "0.4.13" unpipe "1.0.0" +rc@^1.2.7: + version "1.2.8" + resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" + dependencies: + deep-extend "^0.6.0" + ini "~1.3.0" + minimist "^1.2.0" + strip-json-comments "~2.0.1" + rc@~1.1.0: version "1.1.6" resolved "https://registry.yarnpkg.com/rc/-/rc-1.1.6.tgz#43651b76b6ae53b5c802f1151fa3fc3b059969c9" @@ -4821,6 +6891,18 @@ readable-stream@^2.0.0, "readable-stream@^2.0.0 || ^1.1.13", readable-stream@^2. string_decoder "~0.10.x" util-deprecate "~1.0.1" +readable-stream@^2.3.3, readable-stream@^2.3.6: + version "2.3.6" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + readable-stream@~2.0.0, readable-stream@~2.0.5: version "2.0.6" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.0.6.tgz#8f90341e68a53ccc928788dacfcd11b36eb9b78e" @@ -4890,6 +6972,14 @@ regenerator-runtime@^0.10.0: version "0.10.1" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.1.tgz#257f41961ce44558b18f7814af48c17559f9faeb" +regenerator-runtime@^0.10.5: + version "0.10.5" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz#336c3efc1220adcedda2c9fab67b5a7955a33658" + +regenerator-runtime@^0.11.0: + version "0.11.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" + regenerator-runtime@^0.9.5: version "0.9.5" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.9.5.tgz#403d6d40a4bdff9c330dd9392dcbb2d9a8bba1fc" @@ -4902,6 +6992,14 @@ regenerator-transform@0.9.8: babel-types "^6.19.0" private "^0.1.6" +regenerator-transform@^0.10.0: + version "0.10.1" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.10.1.tgz#1e4996837231da8b7f3cf4114d71b5691a0680dd" + dependencies: + babel-runtime "^6.18.0" + babel-types "^6.19.0" + private "^0.1.6" + regex-cache@^0.4.2: version "0.4.3" resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.3.tgz#9b1a6c35d4d0dfcef5711ae651e8e9d3d7114145" @@ -4909,6 +7007,21 @@ regex-cache@^0.4.2: is-equal-shallow "^0.1.3" is-primitive "^2.0.0" +regex-not@^1.0.0, regex-not@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" + dependencies: + extend-shallow "^3.0.2" + safe-regex "^1.1.0" + +regexpu-core@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-1.0.0.tgz#86a763f58ee4d7c2f6b102e4764050de7ed90c6b" + dependencies: + regenerate "^1.2.1" + regjsgen "^0.2.0" + regjsparser "^0.1.4" + regexpu-core@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240" @@ -4934,6 +7047,10 @@ remarkable@^1.6.0: argparse "~0.1.15" autolinker "~0.15.0" +remove-trailing-separator@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" + repeat-element@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a" @@ -4942,6 +7059,10 @@ repeat-string@^1.5.2, repeat-string@^1.5.4: version "1.5.4" resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.5.4.tgz#64ec0c91e0f4b475f90d5b643651e3e6e5b6c2d5" +repeat-string@^1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + repeating@^1.1.0: version "1.1.3" resolved "https://registry.yarnpkg.com/repeating/-/repeating-1.1.3.tgz#3d4114218877537494f97f77f9785fab810fa4ac" @@ -5046,6 +7167,10 @@ resolve-from@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226" +resolve-url@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" + resolve@1.1.7, resolve@1.1.x, resolve@^1.1.3, resolve@^1.1.4, resolve@^1.1.6, resolve@^1.1.7: version "1.1.7" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" @@ -5064,6 +7189,10 @@ restore-cursor@^1.0.1: exit-hook "^1.0.0" onetime "^1.0.0" +ret@~0.1.10: + version "0.1.15" + resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" + retry@^0.10.0: version "0.10.0" resolved "https://registry.yarnpkg.com/retry/-/retry-0.10.0.tgz#649e15ca408422d98318161935e7f7d652d435dd" @@ -5096,6 +7225,12 @@ rimraf@2, rimraf@^2.2.8, rimraf@^2.4.3, rimraf@^2.4.4, rimraf@^2.5.4, rimraf@~2. dependencies: glob "^7.0.5" +rimraf@^2.5.0, rimraf@^2.6.1: + version "2.6.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" + dependencies: + glob "^7.0.5" + rimraf@~2.2.6: version "2.2.8" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.2.8.tgz#e439be2aaee327321952730f99a8929e4fc50582" @@ -5104,6 +7239,10 @@ ripemd160@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-1.0.1.tgz#93a4bbd4942bc574b69a8fa57c71de10ecca7d6e" +rounded-rect@^0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/rounded-rect/-/rounded-rect-0.0.1.tgz#47d7f0356c6d893a2f6f057e379686b25190e0ac" + run-async@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/run-async/-/run-async-0.1.0.tgz#c8ad4a5e110661e402a7d21b530e009f25f8e389" @@ -5139,6 +7278,20 @@ rx@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/rx/-/rx-4.1.0.tgz#a5f13ff79ef3b740fe30aa803fb09f98805d4782" +safe-buffer@^5.1.0, safe-buffer@^5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + +safe-regex@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" + dependencies: + ret "~0.1.10" + +"safer-buffer@>= 2.1.2 < 3": + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + sane@~1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/sane/-/sane-1.4.1.tgz#88f763d74040f5f0c256b6163db399bf110ac715" @@ -5154,6 +7307,10 @@ sax@1.1.5, sax@>=0.6.0, sax@^1.1.4: version "1.1.5" resolved "https://registry.yarnpkg.com/sax/-/sax-1.1.5.tgz#1da50a8d00cdecd59405659f5ff85349fe773743" +sax@^1.2.4, sax@~1.2.1: + version "1.2.4" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" + semantic-release@^6.3.2: version "6.3.5" resolved "https://registry.yarnpkg.com/semantic-release/-/semantic-release-6.3.5.tgz#6e3559b7490a4f79df9cdccca24f849f0a13640e" @@ -5185,6 +7342,10 @@ semantic-release@^6.3.2: version "4.3.6" resolved "https://registry.yarnpkg.com/semver/-/semver-4.3.6.tgz#300bc6e0e86374f7ba61068b5b1ecd57fc6532da" +semver@^5.3.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab" + semver@~5.0.1: version "5.0.3" resolved "https://registry.yarnpkg.com/semver/-/semver-5.0.3.tgz#77466de589cd5d3c95f138aa78bc569a3cb5d27a" @@ -5224,6 +7385,28 @@ set-immediate-shim@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61" +set-value@^0.4.3: + version "0.4.3" + resolved "https://registry.yarnpkg.com/set-value/-/set-value-0.4.3.tgz#7db08f9d3d22dc7f78e53af3c3bf4666ecdfccf1" + dependencies: + extend-shallow "^2.0.1" + is-extendable "^0.1.1" + is-plain-object "^2.0.1" + to-object-path "^0.3.0" + +set-value@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.0.tgz#71ae4a88f0feefbbf52d1ea604f3fb315ebb6274" + dependencies: + extend-shallow "^2.0.1" + is-extendable "^0.1.1" + is-plain-object "^2.0.3" + split-string "^3.0.1" + +setimmediate@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" + setprototypeof@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.0.1.tgz#52009b27888c4dc48f591949c0a8275834c1ca7e" @@ -5284,6 +7467,10 @@ simple-html-index@^1.4.0: dependencies: from2-string "^1.1.0" +simple-linear-scale@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/simple-linear-scale/-/simple-linear-scale-1.0.1.tgz#7142a28923c23d75bc13f437a7e17bea02269eab" + slash@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" @@ -5296,18 +7483,79 @@ slide@^1.1.3: version "1.1.6" resolved "https://registry.yarnpkg.com/slide/-/slide-1.1.6.tgz#56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707" +snapdragon-node@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" + dependencies: + define-property "^1.0.0" + isobject "^3.0.0" + snapdragon-util "^3.0.1" + +snapdragon-util@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" + dependencies: + kind-of "^3.2.0" + +snapdragon@^0.8.1: + version "0.8.2" + resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" + dependencies: + base "^0.11.1" + debug "^2.2.0" + define-property "^0.2.5" + extend-shallow "^2.0.1" + map-cache "^0.2.2" + source-map "^0.5.6" + source-map-resolve "^0.5.0" + use "^3.1.0" + sntp@1.x.x: version "1.0.9" resolved "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198" dependencies: hoek "2.x.x" +sort-keys@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-1.1.2.tgz#441b6d4d346798f1b4e49e8920adfba0e543f9ad" + dependencies: + is-plain-obj "^1.0.0" + +source-list-map@^0.1.4: + version "0.1.8" + resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-0.1.8.tgz#c550b2ab5427f6b3f21f5afead88c4f5587b2106" + +source-list-map@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.0.tgz#aaa47403f7b245a92fbc97ea08f250d6087ed085" + +source-map-resolve@^0.5.0: + version "0.5.2" + resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.2.tgz#72e2cc34095543e43b2c62b2c4c10d4a9054f259" + dependencies: + atob "^2.1.1" + decode-uri-component "^0.2.0" + resolve-url "^0.2.1" + source-map-url "^0.4.0" + urix "^0.1.0" + +source-map-support@^0.4.15: + version "0.4.18" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f" + dependencies: + source-map "^0.5.6" + source-map-support@^0.4.2: version "0.4.3" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.3.tgz#693c8383d4389a4569486987c219744dfc601685" dependencies: source-map "^0.5.3" +source-map-url@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" + source-map@^0.4.4: version "0.4.4" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b" @@ -5318,6 +7566,14 @@ source-map@^0.5.0, source-map@^0.5.3, source-map@^0.5.6, source-map@~0.5.1, sour version "0.5.6" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.6.tgz#75ce38f52bf0733c5a7f0c118d81334a2bb5f412" +source-map@^0.5.7: + version "0.5.7" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + +source-map@^0.6.1, source-map@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + source-map@~0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.2.0.tgz#dab73fbcfc2ba819b4de03bd6f6eaa48164b3f9d" @@ -5349,6 +7605,12 @@ sphericalmercator@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/sphericalmercator/-/sphericalmercator-1.0.5.tgz#ddc5a049e360e000d0fad9fc22c4071882584980" +split-string@^3.0.1, split-string@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" + dependencies: + extend-shallow "^3.0.0" + split2@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/split2/-/split2-0.2.1.tgz#02ddac9adc03ec0bb78c1282ec079ca6e85ae900" @@ -5407,6 +7669,13 @@ standard@^8.3.0: eslint-plugin-standard "~2.0.1" standard-engine "~5.1.0" +static-extend@^0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" + dependencies: + define-property "^0.2.5" + object-copy "^0.1.0" + statuses@1, "statuses@>= 1.3.0 < 2", statuses@~1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.3.0.tgz#8e55758cb20e7682c1f4fce8dcab30bf01d1e07a" @@ -5421,7 +7690,7 @@ stealthy-require@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.0.0.tgz#1a8ed8fc19a8b56268f76f5a1a3e3832b0c26200" -stream-browserify@^2.0.0: +stream-browserify@^2.0.0, stream-browserify@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.1.tgz#66266ee5f9bdb9940a4e4514cafb43bb71e5c9db" dependencies: @@ -5455,6 +7724,16 @@ stream-http@^2.0.0: to-arraybuffer "^1.0.0" xtend "^4.0.0" +stream-http@^2.7.2: + version "2.8.3" + resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.8.3.tgz#b2d242469288a5a27ec4fe8933acf623de6514fc" + dependencies: + builtin-status-codes "^3.0.0" + inherits "^2.0.1" + readable-stream "^2.3.6" + to-arraybuffer "^1.0.0" + xtend "^4.0.0" + stream-splicer@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/stream-splicer/-/stream-splicer-2.0.0.tgz#1b63be438a133e4b671cc1935197600175910d83" @@ -5462,6 +7741,10 @@ stream-splicer@^2.0.0: inherits "^2.0.1" readable-stream "^2.0.2" +strict-uri-encode@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" + string-to-js@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/string-to-js/-/string-to-js-0.0.1.tgz#bf153c760636faa30769b804a0195552ba7ad80f" @@ -5478,6 +7761,12 @@ string.prototype.codepointat@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/string.prototype.codepointat/-/string.prototype.codepointat-0.2.0.tgz#6b26e9bd3afcaa7be3b4269b526de1b82000ac78" +string_decoder@^1.0.0, string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + dependencies: + safe-buffer "~5.1.0" + string_decoder@~0.10.0, string_decoder@~0.10.x: version "0.10.31" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" @@ -5514,7 +7803,7 @@ strip-indent@^1.0.1: dependencies: get-stdin "^4.0.1" -strip-json-comments@2.0.1: +strip-json-comments@2.0.1, strip-json-comments@~2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" @@ -5522,6 +7811,12 @@ strip-json-comments@~1.0.1, strip-json-comments@~1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-1.0.4.tgz#1e15fbcac97d3ee99bf2d73b4c656b082bbafb91" +style-loader@^0.13.0: + version "0.13.2" + resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-0.13.2.tgz#74533384cf698c7104c7951150b49717adc2f3bb" + dependencies: + loader-utils "^1.0.2" + subarg@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/subarg/-/subarg-1.0.0.tgz#f62cf17581e996b48fc965699f54c06ae268b8d2" @@ -5546,6 +7841,34 @@ supports-color@^3.1.0, supports-color@^3.1.2: dependencies: has-flag "^1.0.0" +supports-color@^3.2.3: + version "3.2.3" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6" + dependencies: + has-flag "^1.0.0" + +supports-color@^5.3.0, supports-color@^5.4.0: + version "5.4.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.4.0.tgz#1c6b337402c2137605efe19f10fec390f6faab54" + dependencies: + has-flag "^3.0.0" + +svg.js@^2.6.5: + version "2.6.5" + resolved "https://registry.yarnpkg.com/svg.js/-/svg.js-2.6.5.tgz#5b93d0c8c11e2b70812ef9de1562aa91975cc3b6" + +svgo@^0.7.0: + version "0.7.2" + resolved "https://registry.yarnpkg.com/svgo/-/svgo-0.7.2.tgz#9f5772413952135c6fefbf40afe6a4faa88b4bb5" + dependencies: + coa "~1.0.1" + colors "~1.1.2" + csso "~2.3.1" + js-yaml "~3.7.0" + mkdirp "~0.5.1" + sax "~1.2.1" + whet.extend "~0.9.9" + "symbol-tree@>= 3.1.0 < 4.0.0": version "3.1.4" resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.1.4.tgz#02b279348d337debc39694c5c95f882d448a312a" @@ -5567,6 +7890,10 @@ table@^3.7.8: slice-ansi "0.0.4" string-width "^1.0.1" +tapable@^0.2.7, tapable@~0.2.5: + version "0.2.8" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-0.2.8.tgz#99372a5c999bf2df160afc0d74bed4f47948cd22" + tar-pack@~3.1.0: version "3.1.4" resolved "https://registry.yarnpkg.com/tar-pack/-/tar-pack-3.1.4.tgz#bc8cf9a22f5832739f12f3910dac1eb97b49708c" @@ -5580,6 +7907,18 @@ tar-pack@~3.1.0: tar "~2.2.1" uid-number "~0.0.6" +tar@^4: + version "4.4.4" + resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.4.tgz#ec8409fae9f665a4355cc3b4087d0820232bb8cd" + dependencies: + chownr "^1.0.1" + fs-minipass "^1.2.5" + minipass "^2.3.3" + minizlib "^1.1.0" + mkdirp "^0.5.0" + safe-buffer "^5.1.2" + yallist "^3.0.2" + tar@~2.2.0, tar@~2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1" @@ -5648,6 +7987,12 @@ timers-browserify@^1.0.1: dependencies: process "~0.11.0" +timers-browserify@^2.0.4: + version "2.0.10" + resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.10.tgz#1d28e3d2aadf1d5a5996c4e9f95601cd053480ae" + dependencies: + setimmediate "^1.0.4" + tiny-lr@^0.2.0: version "0.2.1" resolved "https://registry.yarnpkg.com/tiny-lr/-/tiny-lr-0.2.1.tgz#b3fdba802e5d56a33c2f6f10794b32e477ac729d" @@ -5671,12 +8016,38 @@ to-fast-properties@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.2.tgz#f3f5c0c3ba7299a7ef99427e44633257ade43320" +to-fast-properties@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" + to-function@2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/to-function/-/to-function-2.0.6.tgz#7d56cd9c3b92fa8dbd7b22e83d51924de740ebc5" dependencies: component-props "*" +to-object-path@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" + dependencies: + kind-of "^3.0.2" + +to-regex-range@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" + dependencies: + is-number "^3.0.0" + repeat-string "^1.6.1" + +to-regex@^3.0.1, to-regex@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" + dependencies: + define-property "^2.0.2" + extend-shallow "^3.0.2" + regex-not "^1.0.2" + safe-regex "^1.1.0" + tough-cookie@^2.3.1, tough-cookie@~2.3.0: version "2.3.1" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.1.tgz#99c77dfbb7d804249e8a299d4cb0fd81fef083fd" @@ -5708,11 +8079,15 @@ trim-newlines@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" +trim-right@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" + tryit@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/tryit/-/tryit-1.0.2.tgz#c196b0073e6b1c595d93c9c830855b7acc32a453" -tty-browserify@~0.0.0: +tty-browserify@0.0.0, tty-browserify@~0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" @@ -5750,6 +8125,15 @@ uglify-js@2.x.x, uglify-js@^2.6: uglify-to-browserify "~1.0.0" yargs "~3.10.0" +uglify-js@^2.8.27: + version "2.8.29" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.29.tgz#29c5733148057bb4e1f75df35b7a9cb72e6a59dd" + dependencies: + source-map "~0.5.1" + yargs "~3.10.0" + optionalDependencies: + uglify-to-browserify "~1.0.0" + uglify-to-browserify@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7" @@ -5788,14 +8172,56 @@ underscore@~1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.7.0.tgz#6bbaf0877500d36be34ecaa584e0db9fef035209" +union-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.0.tgz#5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4" + dependencies: + arr-union "^3.1.0" + get-value "^2.0.6" + is-extendable "^0.1.1" + set-value "^0.4.3" + uniq@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff" +uniqs@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/uniqs/-/uniqs-2.0.0.tgz#ffede4b36b25290696e6e165d4a59edb998e6b02" + +units-css@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/units-css/-/units-css-0.4.0.tgz#d6228653a51983d7c16ff28f8b9dc3b1ffed3a07" + dependencies: + isnumeric "^0.2.0" + viewport-dimensions "^0.2.0" + unpipe@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" +unset-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" + dependencies: + has-value "^0.3.1" + isobject "^3.0.0" + +upath@^1.0.5: + version "1.1.0" + resolved "https://registry.yarnpkg.com/upath/-/upath-1.1.0.tgz#35256597e46a581db4793d0ce47fa9aebfc9fabd" + +urix@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" + +url-loader@~0.5.7: + version "0.5.9" + resolved "https://registry.yarnpkg.com/url-loader/-/url-loader-0.5.9.tgz#cc8fea82c7b906e7777019250869e569e995c295" + dependencies: + loader-utils "^1.0.2" + mime "1.3.x" + url-trim@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/url-trim/-/url-trim-1.0.0.tgz#40057e2f164b88e5daca7269da47e6d1dd837adc" @@ -5807,13 +8233,19 @@ url@0.10.3: punycode "1.3.2" querystring "0.2.0" -url@~0.11.0: +url@^0.11.0, url@~0.11.0: version "0.11.0" resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" dependencies: punycode "1.3.2" querystring "0.2.0" +use@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/use/-/use-3.1.0.tgz#14716bf03fdfefd03040aef58d8b4b85f3a7c544" + dependencies: + kind-of "^6.0.2" + user-home@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/user-home/-/user-home-1.1.1.tgz#2b5be23a32b63a7c9deb8d0f28d485724a3df190" @@ -5834,10 +8266,22 @@ util@0.10.3, util@~0.10.1: dependencies: inherits "2.0.1" +util@^0.10.3: + version "0.10.4" + resolved "https://registry.yarnpkg.com/util/-/util-0.10.4.tgz#3aa0125bfe668a4672de58857d3ace27ecb76901" + dependencies: + inherits "2.0.3" + uuid@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.0.1.tgz#6544bba2dfda8c1cf17e629a3a305e2bb1fee6c1" +v8flags@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-2.1.1.tgz#aab1a1fa30d45f88dd321148875ac02c0b55e5b4" + dependencies: + user-home "^1.1.1" + validate-npm-package-license@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz#2804babe712ad3379459acfbe24746ab2c303fbc" @@ -5845,13 +8289,21 @@ validate-npm-package-license@^3.0.1: spdx-correct "~1.0.0" spdx-expression-parse "~1.0.0" +vendors@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/vendors/-/vendors-1.0.2.tgz#7fcb5eef9f5623b156bcea89ec37d63676f21801" + verror@1.3.6: version "1.3.6" resolved "https://registry.yarnpkg.com/verror/-/verror-1.3.6.tgz#cff5df12946d297d2baaefaa2689e25be01c005c" dependencies: extsprintf "1.0.2" -vm-browserify@~0.0.1: +viewport-dimensions@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/viewport-dimensions/-/viewport-dimensions-0.2.0.tgz#de740747db5387fd1725f5175e91bac76afdf36c" + +vm-browserify@0.0.4, vm-browserify@~0.0.1: version "0.0.4" resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-0.0.4.tgz#5d7ea45bbef9e4a6ff65f95438e0a87c357d5a73" dependencies: @@ -5896,10 +8348,51 @@ watchify@^3.3.1, watchify@^3.7.0: through2 "^2.0.0" xtend "^4.0.0" +watchpack@^1.3.1: + version "1.6.0" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.6.0.tgz#4bc12c2ebe8aa277a71f1d3f14d685c7b446cd00" + dependencies: + chokidar "^2.0.2" + graceful-fs "^4.1.2" + neo-async "^2.5.0" + webidl-conversions@^3.0.0, webidl-conversions@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" +webpack-sources@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.1.0.tgz#a101ebae59d6507354d71d8013950a3a8b7a5a54" + dependencies: + source-list-map "^2.0.0" + source-map "~0.6.1" + +webpack@^2.0.7-beta: + version "2.7.0" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-2.7.0.tgz#b2a1226804373ffd3d03ea9c6bd525067034f6b1" + dependencies: + acorn "^5.0.0" + acorn-dynamic-import "^2.0.0" + ajv "^4.7.0" + ajv-keywords "^1.1.1" + async "^2.1.2" + enhanced-resolve "^3.3.0" + interpret "^1.0.0" + json-loader "^0.5.4" + json5 "^0.5.1" + loader-runner "^2.3.0" + loader-utils "^0.2.16" + memory-fs "~0.4.1" + mkdirp "~0.5.0" + node-libs-browser "^2.0.0" + source-map "^0.5.3" + supports-color "^3.1.0" + tapable "~0.2.5" + uglify-js "^2.8.27" + watchpack "^1.3.1" + webpack-sources "^1.0.1" + yargs "^6.0.0" + websocket-driver@>=0.5.1: version "0.6.5" resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.6.5.tgz#5cb2556ceb85f4373c6d8238aa691c8454e13a36" @@ -5927,6 +8420,10 @@ whatwg-url@^4.1.0: tr46 "~0.0.3" webidl-conversions "^3.0.0" +whet.extend@~0.9.9: + version "0.9.9" + resolved "https://registry.yarnpkg.com/whet.extend/-/whet.extend-0.9.9.tgz#f877d5bf648c97e5aa542fadc16d6a259b9c11a1" + which-module@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f" @@ -6011,6 +8508,10 @@ y18n@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" +yallist@^3.0.0, yallist@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.2.tgz#8452b4bb7e83c7c188d8041c1a837c773d6d8bb9" + yamljs@^0.2.8: version "0.2.8" resolved "https://registry.yarnpkg.com/yamljs/-/yamljs-0.2.8.tgz#ef23fb006e62f6ae07b406aa2a949561f336ea5c" @@ -6024,6 +8525,24 @@ yargs-parser@^4.2.0: dependencies: camelcase "^3.0.0" +yargs@^6.0.0: + version "6.6.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-6.6.0.tgz#782ec21ef403345f830a808ca3d513af56065208" + dependencies: + camelcase "^3.0.0" + cliui "^3.2.0" + decamelize "^1.1.1" + get-caller-file "^1.0.1" + os-locale "^1.4.0" + read-pkg-up "^1.0.1" + require-directory "^2.1.1" + require-main-filename "^1.0.1" + set-blocking "^2.0.0" + string-width "^1.0.2" + which-module "^1.0.0" + y18n "^3.2.1" + yargs-parser "^4.2.0" + yargs@^6.3.0: version "6.5.0" resolved "https://registry.yarnpkg.com/yargs/-/yargs-6.5.0.tgz#a902e23a1f0fe912b2a03f6131b7ed740c9718ff" From ea80859c5f7e31ee69371f392e96a6afeec46895 Mon Sep 17 00:00:00 2001 From: David Emory Date: Tue, 17 Jul 2018 18:35:20 -0700 Subject: [PATCH 02/18] fix(renderer): Fix bug with sorting focused/unfocused points --- lib/renderer/default-renderer.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/renderer/default-renderer.js b/lib/renderer/default-renderer.js index ab206af3..b3933c02 100644 --- a/lib/renderer/default-renderer.js +++ b/lib/renderer/default-renderer.js @@ -24,7 +24,7 @@ export default class DefaultRenderer extends Renderer { const unfocusedPoints = [] forEach(network.graph.vertices, vertex => { vertex.point.clearRenderData() - if (!vertex.point.isFocused()) focusedPoints.push(vertex.point) + if (!vertex.point.isFocused()) unfocusedPoints.push(vertex.point) else focusedPoints.push(vertex.point) }) From 699c0647b67d859c0cf1a7ccf522df528dfed9ca Mon Sep 17 00:00:00 2001 From: David Emory Date: Wed, 18 Jul 2018 11:55:41 -0700 Subject: [PATCH 03/18] refactor(general): Remove various obsolete code --- lib/core/path.js | 25 -- lib/display/canvas-display.js | 3 +- lib/display/d3.geo.tile.js | 57 ---- lib/display/display.js | 460 ++++++++++------------------- lib/display/display2.js | 223 -------------- lib/display/svg-display.js | 4 +- lib/point/multipoint.js | 55 +--- lib/point/place.js | 77 ----- lib/point/point.js | 28 +- lib/point/stop.js | 101 +------ lib/renderer/default-renderer.js | 64 ---- lib/renderer/renderedsegment.js | 31 -- lib/renderer/renderer.js | 27 +- lib/renderer/wireframe-renderer.js | 2 - lib/styler/styler.js | 224 -------------- lib/transitive.js | 32 -- lib/util/interpolate-line.js | 90 ------ 17 files changed, 175 insertions(+), 1328 deletions(-) delete mode 100644 lib/display/d3.geo.tile.js delete mode 100644 lib/display/display2.js delete mode 100644 lib/util/interpolate-line.js diff --git a/lib/core/path.js b/lib/core/path.js index 2d6b1509..028fd738 100644 --- a/lib/core/path.js +++ b/lib/core/path.js @@ -1,7 +1,3 @@ -import d3 from 'd3' - -import interpolateLine from '../util/interpolate-line' - /** * A path through the network graph. Composed of PathSegments (which * are in turn composed of a sequence of graph edges) @@ -34,27 +30,6 @@ export default class NetworkPath { }, this) } - /** highlight **/ - - drawHighlight (display, capExtension) { - this.line = d3.svg.line() // the line translation function - .x(function (pointInfo, i) { - return display.xScale(pointInfo.x) + (pointInfo.offsetX || 0) - }) - .y(function (pointInfo, i) { - return display.yScale(pointInfo.y) - (pointInfo.offsetY || 0) - }) - .interpolate(interpolateLine.bind(this)) - - this.lineGraph = display.svg.append('path') - .attr('id', 'transitive-path-highlight-' + this.parent.getElementId()) - .attr('class', 'transitive-path-highlight') - .style('stroke-width', 24).style('stroke', '#ff4') - .style('fill', 'none') - .style('visibility', 'hidden') - .data([this]) - } - getRenderedSegments () { var renderedSegments = [] this.segments.forEach(function (pathSegment) { diff --git a/lib/display/canvas-display.js b/lib/display/canvas-display.js index a5fe548c..8eec21ab 100644 --- a/lib/display/canvas-display.js +++ b/lib/display/canvas-display.js @@ -1,7 +1,6 @@ - import roundedRect from 'rounded-rect' -import Display from './display2' +import Display from './display' export default class CanvasDisplay extends Display { constructor (transitive) { diff --git a/lib/display/d3.geo.tile.js b/lib/display/d3.geo.tile.js deleted file mode 100644 index 4c03d357..00000000 --- a/lib/display/d3.geo.tile.js +++ /dev/null @@ -1,57 +0,0 @@ -/* TODO: is is available as a library? */ - -var d3 = require('d3') - -module.exports = function () { - var size = [960, 500] - var scale = 256 - var translate = [size[0] / 2, size[1] / 2] - var zoomDelta = 0 - - function tile () { - var z = Math.max(Math.log(scale) / Math.LN2 - 8, 0) - var z0 = Math.round(z + zoomDelta) - var k = Math.pow(2, z - z0 + 8) - var origin = [(translate[0] - scale / 2) / k, (translate[1] - scale / 2) / k] - var tiles = [] - var cols = d3.range(Math.max(0, Math.floor(-origin[0])), Math.max(0, Math.ceil(size[0] / k - origin[0]))) - var rows = d3.range(Math.max(0, Math.floor(-origin[1])), Math.max(0, Math.ceil(size[1] / k - origin[1]))) - - rows.forEach(function (y) { - cols.forEach(function (x) { - tiles.push([x, y, z0]) - }) - }) - - tiles.translate = origin - tiles.scale = k - - return tiles - } - - tile.size = function (_) { - if (!arguments.length) return size - size = _ - return tile - } - - tile.scale = function (_) { - if (!arguments.length) return scale - scale = _ - return tile - } - - tile.translate = function (_) { - if (!arguments.length) return translate - translate = _ - return tile - } - - tile.zoomDelta = function (_) { - if (!arguments.length) return zoomDelta - zoomDelta = +_ - return tile - } - - return tile -} diff --git a/lib/display/display.js b/lib/display/display.js index 4f792804..e2d3583f 100644 --- a/lib/display/display.js +++ b/lib/display/display.js @@ -1,143 +1,80 @@ -const debug = require('debug')('transitive:display') - -import d3 from 'd3' - -import Legend from './legend' -import TileLayer from './tile-layer' -import { sm } from '../util' - -/** - * The D3-based SVG display. - */ +import linearScale from 'simple-linear-scale' export default class Display { - /** - * Display constructor - * - * @param {Object} options - */ - constructor (transitive) { this.transitive = transitive - if (transitive.el) this.el = transitive.el - else this.svgContainer = transitive.options.svgContainer - this.updateDimensions() - - // Set up the pan/zoom behavior - var zoom = this.zoom = d3.behavior.zoom().scaleExtent([0.25, 4]) - - const zoomBehavior = () => { - this.computeScale() - if (this.scale !== this.lastScale) { // zoom action - this.zoomChanged() - } else { // pan action - setTimeout(transitive.refresh.bind(transitive, true), 0) - } - - var llb = this.llBounds() - debug(`ll bounds: ${llb[0][0]}, ${llb[0][1]} to ${llb[1][0]}, ${llb[1][1]}`) - } - - this.zoom.on('zoom.transitive', zoomBehavior) this.zoomFactors = transitive.options.zoomFactors || this.getDefaultZoomFactors() - // set up the svg display - - if (transitive.options.svg && transitive.options.svgContainer) { - this.svg = transitive.options.svg - } else { - const div = d3.select(this.el).attr('class', 'Transitive') - if (transitive.options.zoomEnabled) div.call(zoom) - this.svg = div.append('svg') - } - this.svg.attr('class', 'schematic-map') - - // initialize the x/y scale objects - this.xScale = d3.scale.linear() - this.yScale = d3.scale.linear() - - // set up the resize event handler - if (transitive.options.autoResize) { - d3.select(window).on('resize.display', () => { - this.resized() - transitive.refresh() - }) - } - - // set the scale - var bounds - if (transitive.options.initialBounds) { - bounds = [sm.forward(transitive.options.initialBounds[0]), - sm.forward(transitive.options.initialBounds[1]) - ] - } else if (transitive.network && transitive.network.graph) { - bounds = transitive.network.graph.bounds() - } - - if (bounds) { - this.setScale(bounds, transitive.options) - this.updateActiveZoomFactors(this.scale) - this.lastScale = this.scale - } else { - this.updateActiveZoomFactors(1) - } + this.updateActiveZoomFactors(1) + } - // set up the map layer - if (transitive.options.mapboxId) { - this.tileLayer = new TileLayer({ - el: this.el, - display: this, - graph: transitive.graph, - mapboxId: transitive.options.mapboxId - }) - } + setDimensions (width, height) { + this.width = width + this.height = height + } - // set up the legend - if (transitive.options.legendEl) { - this.legend = new Legend(transitive.options.legendEl, this, transitive) + setXDomain (domain) { // [minX , maxX] + this.xDomain = domain + this.xScale = linearScale(domain, [0, this.width]) + if (!this.initialXDomain) { + this.initialXDomain = domain + this.initialXRes = (domain[1] - domain[0]) / this.width } - - transitive.emit('initialize display', transitive, this) - return this } - /** - * zoomChanged -- called when the zoom level changes, either by through the native - * zoom support or the setBounds() API call. Updates zoom factors as needed and - * performs appropriate update action (render or refresh) - */ - - zoomChanged () { - if (this.updateActiveZoomFactors(this.scale)) { - this.transitive.network = null - this.transitive.render() - } else this.transitive.refresh() - this.lastScale = this.scale + setYDomain (domain) { // [minY , maxY] + this.yDomain = domain + this.yScale = linearScale(domain, [this.height, 0]) + if (!this.initialYDomain) this.initialYDomain = domain } - updateActiveZoomFactors (scale) { - var updated = false - for (var i = 0; i < this.zoomFactors.length; i++) { - var min = this.zoomFactors[i].minScale - var max = (i < this.zoomFactors.length - 1) - ? this.zoomFactors[i + 1].minScale - : Number.MAX_VALUE + fitToWorldBounds (bounds) { + const domains = this.computeDomainsFromBounds(bounds) + this.setXDomain(domains[0]) + this.setYDomain(domains[1]) + this.computeScale() + } - // check if we've crossed into a new zoomFactor partition - if ((!this.lastScale || this.lastScale < min || this.lastScale >= max) && - scale >= min && scale < max) { - this.activeZoomFactors = this.zoomFactors[i] - updated = true - } - } - return updated + reset () { + this.initialXDomain = null + this.initialYDomain = null + this.scaleSet = false + this.lastScale = undefined } /** - * Return default zoom factors + * Apply a transformation {x, y, k} to the *initial* state of the map, where + * (x, y) is the pixel offset and k is a scale factor relative to an initial + * zoom level of 1.0. Intended primarily to support D3-style panning/zooming. */ + applyTransform (transform) { + const { x, y, k } = transform + + let xMin = this.initialXDomain[0] + let xMax = this.initialXDomain[1] + let yMin = this.initialYDomain[0] + let yMax = this.initialYDomain[1] + + // Apply the scale factor + xMax = xMin + (xMax - xMin) / k + yMin = yMax - (yMax - yMin) / k + + // Apply the translation + const xOffset = -x * (xMax - xMin) / this.width + xMin += xOffset + xMax += xOffset + const yOffset = y * (yMax - yMin) / this.height + yMin += yOffset + yMax += yOffset + + // Update the scale functions and recompute the internal scale factor + this.setXDomain([xMin, xMax]) + this.setYDomain([yMin, yMax]) + this.computeScale() + } + getDefaultZoomFactors (data) { return [{ minScale: 0, @@ -154,214 +91,133 @@ export default class Display { }] } - /** - * Empty the display - */ - - empty () { - debug('emptying svg') - this.svg.selectAll('*').remove() - - this.haloLayer = this.svg.insert('g', ':first-child') - } - - /** - * Set the scale - */ - - setScale (bounds, options) { - this.updateDimensions() - - var domains = getDomains(this, this.height, this.width, bounds, options) - this.xScale.domain(domains[0]) - this.yScale.domain(domains[1]) - - this.xScale.range([0, this.width]) - this.yScale.range([this.height, 0]) - - debug('x scale %j -> %j', this.xScale.domain(), this.xScale.range()) - debug('y scale %j -> %j', this.yScale.domain(), this.yScale.range()) - - this.zoom - .x(this.xScale) - .y(this.yScale) - - this.initXRes = (domains[0][1] - domains[0][0]) / this.width - this.scale = 1 + updateActiveZoomFactors (scale) { + var updated = false + for (var i = 0; i < this.zoomFactors.length; i++) { + var min = this.zoomFactors[i].minScale + var max = (i < this.zoomFactors.length - 1) + ? this.zoomFactors[i + 1].minScale + : Number.MAX_VALUE - this.scaleSet = true + // check if we've crossed into a new zoomFactor partition + if ((!this.lastScale || this.lastScale < min || this.lastScale >= max) && + scale >= min && scale < max) { + this.activeZoomFactors = this.zoomFactors[i] + updated = true + } + } + return updated } computeScale () { - var newXRes = (this.xScale.domain()[1] - this.xScale.domain()[0]) / this.width - this.scale = this.initXRes / newXRes + this.lastScale = this.scale + this.scaleSet = true + const newXRes = (this.xDomain[1] - this.xDomain[0]) / this.width + this.scale = this.initialXRes / newXRes + if (this.lastScale !== this.scale) this.scaleChanged() } - /** updateDimensions -- compute the width/height of the display */ - - updateDimensions () { - if (this.el) { - this.height = this.el.clientHeight - this.width = this.el.clientWidth - } else { - this.height = this.svgContainer.clientHeight - this.width = this.svgContainer.clientWidth + scaleChanged () { + const zoomFactorsChanged = this.updateActiveZoomFactors(this.scale) + if (zoomFactorsChanged) { + this.transitive.network = null + this.transitive.render() } } /** - * updateDomains -- set x/y domains of geographic (spherical mercator) coordinate - * system. Does *not* check/adjust aspect ratio. + * Compute the x/y coordinate space domains to fit the graph. */ - updateDomains (bounds) { - this.xScale.domain([bounds[0][0], bounds[1][0]]) - this.yScale.domain([bounds[0][1], bounds[1][1]]) - - this.zoom - .x(this.xScale) - .y(this.yScale) - - this.computeScale() - } - - resized () { - var newWidth = this.el ? this.el.clientWidth : this.svgContainer.clientWidth - var newHeight = this.el ? this.el.clientHeight : this.svgContainer.clientHeight - - var xDomain = this.xScale.domain() - var xFactor = newWidth / this.width - var xDomainAdj = (xDomain[1] - xDomain[0]) * (xFactor - 1) / 2 - this.xScale.domain([xDomain[0] - xDomainAdj, xDomain[1] + xDomainAdj]) - - var yDomain = this.yScale.domain() - var yFactor = newHeight / this.height - var yDomainAdj = (yDomain[1] - yDomain[0]) * (yFactor - 1) / 2 - this.yScale.domain([yDomain[0] - yDomainAdj, yDomain[1] + yDomainAdj]) - - this.xScale.range([0, newWidth]) - this.yScale.range([newHeight, 0]) - - this.height = newHeight - this.width = newWidth + computeDomainsFromBounds (bounds) { + var xmin = bounds[0][0] + var xmax = bounds[1][0] + var ymin = bounds[0][1] + var ymax = bounds[1][1] + var xRange = xmax - xmin + var yRange = ymax - ymin + + const { options } = this.transitive + + var paddingFactor = (options && options.paddingFactor) + ? options.paddingFactor + : 0.1 + + var margins = this.getMargins() + + var usableHeight = this.height - margins.top - margins.bottom + var usableWidth = this.width - margins.left - margins.right + var displayAspect = this.width / this.height + var usableDisplayAspect = usableWidth / usableHeight + var graphAspect = xRange / (yRange === 0 ? -Infinity : yRange) + + var padding + var dispX1, dispX2, dispY1, dispY2 + var dispXRange, dispYRange + + if (usableDisplayAspect > graphAspect) { // y-axis is limiting + padding = paddingFactor * yRange + dispY1 = ymin - padding + dispY2 = ymax + padding + dispYRange = yRange + 2 * padding + var addedYRange = (this.height / usableHeight * dispYRange) - dispYRange + if (margins.top > 0 || margins.bottom > 0) { + dispY1 -= margins.bottom / (margins.bottom + margins.top) * addedYRange + dispY2 += margins.top / (margins.bottom + margins.top) * addedYRange + } + dispXRange = (dispY2 - dispY1) * displayAspect + var xOffset = (margins.left - margins.right) / this.width + var xMidpoint = (xmax + xmin - dispXRange * xOffset) / 2 + dispX1 = xMidpoint - dispXRange / 2 + dispX2 = xMidpoint + dispXRange / 2 + } else { // x-axis limiting + padding = paddingFactor * xRange + dispX1 = xmin - padding + dispX2 = xmax + padding + dispXRange = xRange + 2 * padding + var addedXRange = (this.width / usableWidth * dispXRange) - dispXRange + if (margins.left > 0 || margins.right > 0) { + dispX1 -= margins.left / (margins.left + margins.right) * addedXRange + dispX2 += margins.right / (margins.left + margins.right) * addedXRange + } - this.zoom - .x(this.xScale) - .y(this.yScale) - } + dispYRange = (dispX2 - dispX1) / displayAspect + var yOffset = (margins.bottom - margins.top) / this.height + var yMidpoint = (ymax + ymin - dispYRange * yOffset) / 2 + dispY1 = yMidpoint - dispYRange / 2 + dispY2 = yMidpoint + dispYRange / 2 + } - xyBounds () { - var x = this.xScale.domain() - var y = this.yScale.domain() return [ - [x[0], y[0]], - [x[1], y[1]] + [dispX1, dispX2], + [dispY1, dispY2] ] } - /** - * Lat/lon bounds - */ - - llBounds () { - var x = this.xScale.domain() - var y = this.yScale.domain() - - return [ - sm.inverse([x[0], y[0]]), - sm.inverse([x[1], y[1]]) - ] + getMargins () { + return Object.assign({ + left: 0, + right: 0, + top: 0, + bottom: 0 + }, this.transitive.options.displayMargins) } isInRange (x, y) { - var xRange = this.xScale.range() - var yRange = this.yScale.range() - - return x >= xRange[0] && x <= xRange[1] && y >= yRange[1] && y <= yRange[0] + return x >= 0 && x <= this.width && y >= 0 && y <= this.height } -} -/** - * Compute the x/y coordinate space domains to fit the graph. - */ - -function getDomains (display, height, width, bounds, options) { - var xmin = bounds[0][0] - var xmax = bounds[1][0] - var ymin = bounds[0][1] - var ymax = bounds[1][1] - var xRange = xmax - xmin - var yRange = ymax - ymin - - var paddingFactor = (options && options.paddingFactor) - ? options.paddingFactor - : 0.1 - - var margins = getMargins(options) - - var usableHeight = height - margins.top - margins.bottom - var usableWidth = width - margins.left - margins.right - var displayAspect = width / height - var usableDisplayAspect = usableWidth / usableHeight - var graphAspect = xRange / (yRange === 0 ? -Infinity : yRange) - - var padding - var dispX1, dispX2, dispY1, dispY2 - var dispXRange, dispYRange - - if (usableDisplayAspect > graphAspect) { // y-axis is limiting - padding = paddingFactor * yRange - dispY1 = ymin - padding - dispY2 = ymax + padding - dispYRange = yRange + 2 * padding - var addedYRange = (height / usableHeight * dispYRange) - dispYRange - if (margins.top > 0 || margins.bottom > 0) { - dispY1 -= margins.bottom / (margins.bottom + margins.top) * addedYRange - dispY2 += margins.top / (margins.bottom + margins.top) * addedYRange - } - dispXRange = (dispY2 - dispY1) * displayAspect - var xOffset = (margins.left - margins.right) / width - var xMidpoint = (xmax + xmin - dispXRange * xOffset) / 2 - dispX1 = xMidpoint - dispXRange / 2 - dispX2 = xMidpoint + dispXRange / 2 - } else { // x-axis limiting - padding = paddingFactor * xRange - dispX1 = xmin - padding - dispX2 = xmax + padding - dispXRange = xRange + 2 * padding - var addedXRange = (width / usableWidth * dispXRange) - dispXRange - if (margins.left > 0 || margins.right > 0) { - dispX1 -= margins.left / (margins.left + margins.right) * addedXRange - dispX2 += margins.right / (margins.left + margins.right) * addedXRange - } + /** Methods to be defined by subclasses **/ - dispYRange = (dispX2 - dispX1) / displayAspect - var yOffset = (margins.bottom - margins.top) / height - var yMidpoint = (ymax + ymin - dispYRange * yOffset) / 2 - dispY1 = yMidpoint - dispYRange / 2 - dispY2 = yMidpoint + dispYRange / 2 - } + clear () { } - return [ - [dispX1, dispX2], - [dispY1, dispY2] - ] -} + drawCircle (coord, attrs) { } -function getMargins (options) { - var margins = { - left: 0, - right: 0, - top: 0, - bottom: 0 - } + drawEllipse (coord, attrs) { } - if (options && options.displayMargins) { - if (options.displayMargins.top) margins.top = options.displayMargins.top - if (options.displayMargins.bottom) margins.bottom = options.displayMargins.bottom - if (options.displayMargins.left) margins.left = options.displayMargins.left - if (options.displayMargins.right) margins.right = options.displayMargins.right - } + drawRect (upperLeft, attrs) { } + + drawText (text, anchor, attrs) { } - return margins + drawPath (pathStr, attrs) { } } diff --git a/lib/display/display2.js b/lib/display/display2.js deleted file mode 100644 index e2d3583f..00000000 --- a/lib/display/display2.js +++ /dev/null @@ -1,223 +0,0 @@ -import linearScale from 'simple-linear-scale' - -export default class Display { - constructor (transitive) { - this.transitive = transitive - - this.zoomFactors = transitive.options.zoomFactors || this.getDefaultZoomFactors() - - this.updateActiveZoomFactors(1) - } - - setDimensions (width, height) { - this.width = width - this.height = height - } - - setXDomain (domain) { // [minX , maxX] - this.xDomain = domain - this.xScale = linearScale(domain, [0, this.width]) - if (!this.initialXDomain) { - this.initialXDomain = domain - this.initialXRes = (domain[1] - domain[0]) / this.width - } - } - - setYDomain (domain) { // [minY , maxY] - this.yDomain = domain - this.yScale = linearScale(domain, [this.height, 0]) - if (!this.initialYDomain) this.initialYDomain = domain - } - - fitToWorldBounds (bounds) { - const domains = this.computeDomainsFromBounds(bounds) - this.setXDomain(domains[0]) - this.setYDomain(domains[1]) - this.computeScale() - } - - reset () { - this.initialXDomain = null - this.initialYDomain = null - this.scaleSet = false - this.lastScale = undefined - } - - /** - * Apply a transformation {x, y, k} to the *initial* state of the map, where - * (x, y) is the pixel offset and k is a scale factor relative to an initial - * zoom level of 1.0. Intended primarily to support D3-style panning/zooming. - */ - - applyTransform (transform) { - const { x, y, k } = transform - - let xMin = this.initialXDomain[0] - let xMax = this.initialXDomain[1] - let yMin = this.initialYDomain[0] - let yMax = this.initialYDomain[1] - - // Apply the scale factor - xMax = xMin + (xMax - xMin) / k - yMin = yMax - (yMax - yMin) / k - - // Apply the translation - const xOffset = -x * (xMax - xMin) / this.width - xMin += xOffset - xMax += xOffset - const yOffset = y * (yMax - yMin) / this.height - yMin += yOffset - yMax += yOffset - - // Update the scale functions and recompute the internal scale factor - this.setXDomain([xMin, xMax]) - this.setYDomain([yMin, yMax]) - this.computeScale() - } - - getDefaultZoomFactors (data) { - return [{ - minScale: 0, - gridCellSize: 25, - internalVertexFactor: 1000000, - angleConstraint: 45, - mergeVertexThreshold: 200 - }, { - minScale: 1.5, - gridCellSize: 0, - internalVertexFactor: 0, - angleConstraint: 5, - mergeVertexThreshold: 0 - }] - } - - updateActiveZoomFactors (scale) { - var updated = false - for (var i = 0; i < this.zoomFactors.length; i++) { - var min = this.zoomFactors[i].minScale - var max = (i < this.zoomFactors.length - 1) - ? this.zoomFactors[i + 1].minScale - : Number.MAX_VALUE - - // check if we've crossed into a new zoomFactor partition - if ((!this.lastScale || this.lastScale < min || this.lastScale >= max) && - scale >= min && scale < max) { - this.activeZoomFactors = this.zoomFactors[i] - updated = true - } - } - return updated - } - - computeScale () { - this.lastScale = this.scale - this.scaleSet = true - const newXRes = (this.xDomain[1] - this.xDomain[0]) / this.width - this.scale = this.initialXRes / newXRes - if (this.lastScale !== this.scale) this.scaleChanged() - } - - scaleChanged () { - const zoomFactorsChanged = this.updateActiveZoomFactors(this.scale) - if (zoomFactorsChanged) { - this.transitive.network = null - this.transitive.render() - } - } - - /** - * Compute the x/y coordinate space domains to fit the graph. - */ - - computeDomainsFromBounds (bounds) { - var xmin = bounds[0][0] - var xmax = bounds[1][0] - var ymin = bounds[0][1] - var ymax = bounds[1][1] - var xRange = xmax - xmin - var yRange = ymax - ymin - - const { options } = this.transitive - - var paddingFactor = (options && options.paddingFactor) - ? options.paddingFactor - : 0.1 - - var margins = this.getMargins() - - var usableHeight = this.height - margins.top - margins.bottom - var usableWidth = this.width - margins.left - margins.right - var displayAspect = this.width / this.height - var usableDisplayAspect = usableWidth / usableHeight - var graphAspect = xRange / (yRange === 0 ? -Infinity : yRange) - - var padding - var dispX1, dispX2, dispY1, dispY2 - var dispXRange, dispYRange - - if (usableDisplayAspect > graphAspect) { // y-axis is limiting - padding = paddingFactor * yRange - dispY1 = ymin - padding - dispY2 = ymax + padding - dispYRange = yRange + 2 * padding - var addedYRange = (this.height / usableHeight * dispYRange) - dispYRange - if (margins.top > 0 || margins.bottom > 0) { - dispY1 -= margins.bottom / (margins.bottom + margins.top) * addedYRange - dispY2 += margins.top / (margins.bottom + margins.top) * addedYRange - } - dispXRange = (dispY2 - dispY1) * displayAspect - var xOffset = (margins.left - margins.right) / this.width - var xMidpoint = (xmax + xmin - dispXRange * xOffset) / 2 - dispX1 = xMidpoint - dispXRange / 2 - dispX2 = xMidpoint + dispXRange / 2 - } else { // x-axis limiting - padding = paddingFactor * xRange - dispX1 = xmin - padding - dispX2 = xmax + padding - dispXRange = xRange + 2 * padding - var addedXRange = (this.width / usableWidth * dispXRange) - dispXRange - if (margins.left > 0 || margins.right > 0) { - dispX1 -= margins.left / (margins.left + margins.right) * addedXRange - dispX2 += margins.right / (margins.left + margins.right) * addedXRange - } - - dispYRange = (dispX2 - dispX1) / displayAspect - var yOffset = (margins.bottom - margins.top) / this.height - var yMidpoint = (ymax + ymin - dispYRange * yOffset) / 2 - dispY1 = yMidpoint - dispYRange / 2 - dispY2 = yMidpoint + dispYRange / 2 - } - - return [ - [dispX1, dispX2], - [dispY1, dispY2] - ] - } - - getMargins () { - return Object.assign({ - left: 0, - right: 0, - top: 0, - bottom: 0 - }, this.transitive.options.displayMargins) - } - - isInRange (x, y) { - return x >= 0 && x <= this.width && y >= 0 && y <= this.height - } - - /** Methods to be defined by subclasses **/ - - clear () { } - - drawCircle (coord, attrs) { } - - drawEllipse (coord, attrs) { } - - drawRect (upperLeft, attrs) { } - - drawText (text, anchor, attrs) { } - - drawPath (pathStr, attrs) { } -} diff --git a/lib/display/svg-display.js b/lib/display/svg-display.js index 62ea75a0..26d046d6 100644 --- a/lib/display/svg-display.js +++ b/lib/display/svg-display.js @@ -1,4 +1,4 @@ -import Display from './display2' +import Display from './display' import SVG from 'svg.js' export default class SvgDisplay extends Display { @@ -10,8 +10,6 @@ export default class SvgDisplay extends Display { // We have a DOM element if (el) { - console.log('--> setting el in SvgDisplay'); - this.setDimensions(el.clientWidth, el.clientHeight) this.svg = SVG(el) } diff --git a/lib/point/multipoint.js b/lib/point/multipoint.js index c085ab7c..e8a0860c 100644 --- a/lib/point/multipoint.js +++ b/lib/point/multipoint.js @@ -152,17 +152,7 @@ export default class MultiPoint extends Point { if (!this.renderData) return - // set up the main svg group for this stop - /*this.initSvg(display) - this.svgGroup - .attr('class', 'transitive-sortable') - .datum({ - owner: this, - sortableType: 'POINT_MULTI' - })*/ - - //if (this.containsSegmentEndPoint()) this.initMergedMarker(display) - + // Compute the bounds of the merged marker const xArr = this.renderData.map(d => d.x) const yArr = this.renderData.map(d => d.y) const xMin = Math.min(...xArr) @@ -176,6 +166,7 @@ export default class MultiPoint extends Point { const width = xMax - xMin + r * 2 const height = yMax - yMin + r * 2 + // Draw the merged marker display.drawRect({ x, y }, { width, height, @@ -186,15 +177,10 @@ export default class MultiPoint extends Point { 'stroke-width': 2 }) - // store marker bounding box + // Store marker bounding box this.markerBBox = { x, y, width, height } - // set up the pattern markers - /* this.marker = this.markerSvg.selectAll('circle') - .data(this.renderData) - .enter() - .append('circle') - .attr('class', 'transitive-multipoint-marker-pattern'); */ + // TODO: support pattern-specific markers } initMergedMarker (display) { @@ -214,39 +200,6 @@ export default class MultiPoint extends Point { } } - /** - * Refresh the point - * - * @param {Display} display - */ - - refresh (display) { - /*if (!this.renderData) return - - // refresh the merged marker - if (this.mergedMarker) { - if (!this.mergedMarkerData) this.initMarkerData(display) - - this.mergedMarker.datum({ - owner: this - }) - for (const key in this.mergedMarkerData) { - this.mergedMarker.attr(key, this.mergedMarkerData[key]) - } - }*/ - - /* var cx, cy; - // refresh the pattern-level markers - this.marker.data(this.renderData); - this.marker.attr('transform', function (d, i) { - cx = d.x; - cy = d.y; - var x = display.xScale(d.x) + d.offsetX; - var y = display.yScale(d.y) - d.offsetY; - return 'translate(' + x +', ' + y +')'; - }); */ - } - getRenderDataArray () { return this.renderData } diff --git a/lib/point/place.js b/lib/point/place.js index e0f038c6..a4297388 100644 --- a/lib/point/place.js +++ b/lib/point/place.js @@ -1,5 +1,3 @@ -import d3 from 'd3' - import Point from './point' import { sm } from '../util' @@ -128,32 +126,6 @@ export default class Place extends Point { width: radius * 2, height: radius * 2 } - /*this.initSvg(display) - this.svgGroup - .attr('class', 'transitive-sortable') - .datum({ - owner: this, - sortableType: 'POINT_PLACE' - }) - - // set up the markers - this.marker = this.markerSvg.append('circle') - .datum({ - owner: this - }) - .attr('class', 'transitive-place-circle') - - var iconUrl = display.styler.compute(display.styler.places_icon['xlink:href'], display, { - owner: this - }) - if (iconUrl) { - this.icon = this.markerSvg.append('image') - .datum({ - owner: this - }) - .attr('class', 'transitive-place-icon') - .attr('xlink:href', iconUrl) - }*/ } /** @@ -163,54 +135,5 @@ export default class Place extends Point { */ refresh (display) { - /*if (!this.renderData) return - - // compute the x/y location -- use the real-world coordinates if - // geographic rendering is enabled, otherwise use snapped vertex coords - var x = display.xScale( - display.activeZoomFactors.useGeographicRendering - ? this.worldX - : this.graphVertex.x - ) - var y = display.yScale( - display.activeZoomFactors.useGeographicRendering - ? this.worldY - : this.graphVertex.y - ) - const translate = 'translate(' + x + ', ' + y + ')' - - // update the marker/icon translations - this.marker.attr('transform', translate) - if (this.icon) this.icon.attr('transform', translate)*/ - } - - makeDraggable (transitive) { - /*var place = this - var display = transitive.display - var drag = d3.behavior.drag() - .on('dragstart', function () { - d3.event.sourceEvent.stopPropagation() // silence other listeners - }) - .on('drag', function () { - if (place.graphVertex) { - var boundingRect = display.el.getBoundingClientRect() - var x = display.xScale.invert(d3.event.sourceEvent.pageX - - boundingRect.left) - var y = display.yScale.invert(d3.event.sourceEvent.pageY - - boundingRect.top) - - place.worldX = x - place.worldY = y - var ll = sm.inverse([x, y]) - place.place_lon = ll[0] - place.place_lat = ll[1] - - place.refresh(display) - } - }) - .on('dragend', function () { - transitive.emit('place.' + place.getId() + '.dragend', place) - }) - this.markerSvg.call(drag)*/ } } diff --git a/lib/point/point.js b/lib/point/point.js index 314073e5..af22d8b5 100644 --- a/lib/point/point.js +++ b/lib/point/point.js @@ -91,17 +91,7 @@ export default class Point { * @param {Display} display */ - render (display) { - //this.label.svgGroup = null - } - - /** - * Refresh a previously drawn point - * - * @param {Display} display - */ - - refresh (display) {} + render (display) {} addRenderData () {} @@ -115,17 +105,6 @@ export default class Point { return false } - /*initSvg (display) { - // set up the main svg group for this stop - this.svgGroup = display.svg.append('g') - .attr('id', `transitive-${this.getType().toLowerCase()}-${this.getId()}`) - // .attr('class', 'transitive-sortable') - .datum(this) - - this.markerSvg = this.svgGroup.append('g') - this.labelSvg = this.svgGroup.append('g') - }*/ - //* * Shared geom utility functions **// constructMergedMarker (display) { @@ -237,11 +216,6 @@ export default class Point { } } - /*drawLabel (display) { - if (!this.renderLabel) return - this.label.draw(display) - }*/ - getMarkerBBox () { return this.markerBBox } diff --git a/lib/point/stop.js b/lib/point/stop.js index b47c8874..3c61c48f 100644 --- a/lib/point/stop.js +++ b/lib/point/stop.js @@ -152,30 +152,11 @@ export default class Stop extends Point { if (this.patternCount === 0) return - //if (!this.mergedMarkerData) this.initMarkerData(display) - this.initMarkerData(display) - // refresh the pattern-level markers - /*this.patternMarkers.data(this.getRenderDataArray()) - - this.patternMarkers.attr('transform', (d, i) => { - if (!isNaN(d.x) && !isNaN(d.y)) { - var x = d.x + this.placeOffsets.x - var y = d.y + this.placeOffsets.y - return `translate(${x}, ${y})` - } - }) - - // refresh the merged marker - if (this.mergedMarker) { - this.mergedMarker.datum(this.getMergedRenderData()) - if (!isNaN(this.mergedMarkerData.x) && !isNaN(this.mergedMarkerData.y)) { - for (const key in this.mergedMarkerData) this.mergedMarker.attr(key, this.mergedMarkerData[key]) - } - }*/ const styler = display.styler + // For segment endpoints, draw the "merged" marker if (this.isSegmentEndPoint && this.mergedMarkerData) { display.drawRect({ x: this.mergedMarkerData.x, @@ -212,64 +193,8 @@ export default class Stop extends Point { }) }*/ } - - /*if (Object.keys(this.patternRenderData).length === 0) return - - var renderDataArray = this.getRenderDataArray() - - this.initSvg(display) - - // set up the merged marker - this.mergedMarker = this.markerSvg.append('g').append('rect') - .attr('class', 'transitive-sortable transitive-stop-marker-merged') - .datum(this.getMergedRenderData()) - - // set up the pattern-specific markers - this.patternMarkers = this.markerSvg.append('g').selectAll('circle') - .data(renderDataArray) - .enter() - .append('circle') - .attr('class', 'transitive-sortable transitive-stop-marker-pattern')*/ - } - - /** - * Refresh the stop - * - * @param {Display} display - */ - - refresh (display) { - /*if (this.patternCount === 0) return - - if (!this.mergedMarkerData) this.initMarkerData(display) - - // refresh the pattern-level markers - this.patternMarkers.data(this.getRenderDataArray()) - - this.patternMarkers.attr('transform', (d, i) => { - if (!isNaN(d.x) && !isNaN(d.y)) { - var x = d.x + this.placeOffsets.x - var y = d.y + this.placeOffsets.y - return `translate(${x}, ${y})` - } - }) - - // refresh the merged marker - if (this.mergedMarker) { - this.mergedMarker.datum(this.getMergedRenderData()) - if (!isNaN(this.mergedMarkerData.x) && !isNaN(this.mergedMarkerData.y)) { - for (const key in this.mergedMarkerData) this.mergedMarker.attr(key, this.mergedMarkerData[key]) - } - }*/ } - /*getMergedRenderData () { - return { - owner: this, - sortableType: 'POINT_STOP_MERGED' - } - }*/ - getRenderDataArray () { var dataArray = [] for (var patternId in this.patternRenderData) { @@ -278,30 +203,6 @@ export default class Stop extends Point { return dataArray } - /*isFocused () { - if (this.mergedMarker || !this.patternRenderData) { - return (this.focused === true) - } - - var focused = true - for (var patternId in this.patternRenderData) { - focused = this && this.isPatternFocused(patternId) - } - return focused - }*/ - - runFocusTransition (display, callback) { - if (this.mergedMarker) { - var newStrokeColor = display.styler.compute(display.styler.stops_merged - .stroke, display, { - owner: this - }) - this.mergedMarker.transition().style('stroke', newStrokeColor).call( - callback) - } - if (this.label) this.label.runFocusTransition(display, callback) - } - clearRenderData () { this.patternRenderData = {} this.mergedMarkerData = null diff --git a/lib/renderer/default-renderer.js b/lib/renderer/default-renderer.js index b3933c02..9e63859a 100644 --- a/lib/renderer/default-renderer.js +++ b/lib/renderer/default-renderer.js @@ -84,70 +84,6 @@ export default class DefaultRenderer extends Renderer { // if (display.legend) display.legend.render(legendSegments) } - /** - * Refresh - */ - - refresh (panning) { - /*super.refresh(panning) - - var display = this.transitive.display - var network = this.transitive.network - var styler = this.transitive.styler - - forEach(network.graph.vertices, vertex => { - vertex.point.clearRenderData() - }) - forEach(network.graph.edges, edge => { - edge.clearRenderData() - }) - - // refresh the segment and point marker data - this.refreshSegmentRenderData() - forEach(network.graph.vertices, vertex => { - vertex.point.initMarkerData(display) - }) - - this.renderedSegments = [] - forEach(network.paths, path => { - forEach(path.segments, pathSegment => { - forEach(pathSegment.renderedSegments, rSegment => { - rSegment.refresh(display) - this.renderedSegments.push(rSegment) - }) - }) - }) - - forEach(network.graph.vertices, vertex => { - var point = vertex.point - if (!point.svgGroup) return // check if this point is not currently rendered - styler.stylePoint(display, point) - point.refresh(display) - }) - - // re-draw the edge-based points - forEach(network.graph.edges, edge => { - forEach(edge.pointArray, point => { - if (!point.svgGroup) return // check if this point is not currently rendered - styler.styleStop(display, point) - point.refresh(display) - }) - }) - - // refresh the label layout - var labeledElements = this.transitive.labeler.doLayout() - forEach(labeledElements.points, point => { - point.refreshLabel(display) - styler.stylePointLabel(display, point) - }) - forEach(this.transitive.labeler.segmentLabels, label => { - label.refresh(display) - styler.styleSegmentLabel(display, label) - }) - - this.sortElements()*/ - } - refreshSegmentRenderData () { forEach(this.transitive.network.renderedEdges, rEdge => { rEdge.refreshRenderData(this.transitive.display) diff --git a/lib/renderer/renderedsegment.js b/lib/renderer/renderedsegment.js index 8d270730..8bc97f27 100644 --- a/lib/renderer/renderedsegment.js +++ b/lib/renderer/renderedsegment.js @@ -1,6 +1,5 @@ import { forEach } from 'lodash' -import interpolateLine from '../util/interpolate-line' import { distance, renderDataToSvgPath } from '../util' /** @@ -60,36 +59,6 @@ export default class RenderedSegment { }) } - refresh (display, renderData) { - /*if (renderData) { - this.renderData = renderData - } else { - this.renderData = [] - forEach(this.renderedEdges, rEdge => { - this.renderData = this.renderData.concat(rEdge.renderData) - }) - } - - // Check if this segment is to be drawn as an arc; if so replace render data - if (this.pathSegment.journeySegment && this.pathSegment.journeySegment.arc) { - const first = this.renderData[0] - const last = this.renderData[this.renderData.length - 1] - const arc = { - x: last.x, - y: last.y, - arc: -45, - radius: distance(first.x, first.y, last.x, last.y) - } - this.renderData = [first, arc, last] - } - - var lineData = this.line(this.renderData) - this.lineGraph.attr('d', lineData) - this.lineGraphFront.attr('d', lineData) - if (this.lineGraphHalo) this.lineGraphHalo.attr('d', lineData) - display.styler.styleSegment(display, this)*/ - } - setFocused (focused) { this.focused = focused } diff --git a/lib/renderer/renderer.js b/lib/renderer/renderer.js index 0d1ba305..7716bd50 100644 --- a/lib/renderer/renderer.js +++ b/lib/renderer/renderer.js @@ -17,31 +17,22 @@ export default class Renderer { } render () { - var display = this.transitive.display - display.styler = this.transitive.styler - - // remove all old svg elements - display.clear() - } + const display = this.transitive.display + const graph = this.transitive.network.graph - /** - * Refresh - */ - - refresh (panning) { - var display = this.transitive.display - var network = this.transitive.network - - if (display.tileLayer) display.tileLayer.zoomed() + display.styler = this.transitive.styler - network.graph.vertices.forEach(function (vertex) { + graph.vertices.forEach(vertex => { vertex.point.clearRenderData() }) - network.graph.edges.forEach(function (edge) { + graph.edges.forEach(edge => { edge.clearRenderData() }) - // draw the grid, if necessary + // Clear the display + display.clear() + + // Draw the grid, if necessary if (this.transitive.options.drawGrid) drawGrid(display, this.gridCellSize) } diff --git a/lib/renderer/wireframe-renderer.js b/lib/renderer/wireframe-renderer.js index 97210fa8..c57c2668 100644 --- a/lib/renderer/wireframe-renderer.js +++ b/lib/renderer/wireframe-renderer.js @@ -41,6 +41,4 @@ export default class WireframeRenderer extends Renderer { }) }) } - - refresh (panning) { } } diff --git a/lib/styler/styler.js b/lib/styler/styler.js index 4177cd01..808ca696 100644 --- a/lib/styler/styler.js +++ b/lib/styler/styler.js @@ -108,230 +108,6 @@ export default class Styler { } } - /** - * Style a Segment using the rules defined in styles.js or the Transitive options - * - * @param {Display} Transitive Display object - * @param {RenderedSegment} Transitive RenderedSegment object - */ - - styleSegment (display, segment) { - if (segment.lineGraphHalo) { - this.applyAttrAndStyle( - display, - segment.lineGraphHalo, - this.segments_halo - ) - } - - this.applyAttrAndStyle( - display, - segment.lineGraph, - this.segments - ) - - this.applyAttrAndStyle( - display, - segment.lineGraphFront, - this.segments_front - ) - } - - /** - * Style a WireframeEdge using the rules defined in styles.js or the Transitive options - * - * @param {Display} Transitive Display object - * @param {WireframeEdge} Transitive WireframeEdge object - */ - - styleWireframeEdge (display, wfEdge) { - this.applyAttrAndStyle( - display, - wfEdge.svgGroup.selectAll('.transitive-wireframe-edge-line'), - this.wireframe_edges - ) - } - - /** - * Style a Point using the rules defined in styles.js or the Transitive options - * - * @param {Display} Transitive Display object - * @param {Point} Transitive Point object - */ - - stylePoint (display, point) { - if (point.getType() === 'STOP') this.styleStop(display, point) - if (point.getType() === 'PLACE') this.stylePlace(display, point) - if (point.getType() === 'MULTI') this.styleMultiPoint(display, point) - if (point.getType() === 'WIREFRAME_VERTEX') this.styleWireframeVertex(display, point) - } - - /** - * Style a Stop using the rules defined in styles.js or the Transitive options - * - * @param {Display} Transitive Display object - * @param {Stop} Transitive Stop object - */ - - styleStop (display, stop) { - this.applyAttrAndStyle( - display, - stop.patternMarkers, - this.stops_pattern - ) - - this.applyAttrAndStyle( - display, - stop.mergedMarker, - this.stops_merged - ) - - this.applyAttrAndStyle( - display, - stop.svgGroup.selectAll('.transitive-stop-label'), - this.labels - ) - } - - /** - * Style a Place using the rules defined in styles.js or the Transitive options - * - * @param {Display} Transitive Display object - * @param {Place} Transitive Place object - */ - - stylePlace (display, place) { - this.applyAttrAndStyle( - display, - place.svgGroup.selectAll('.transitive-place-circle'), - this.places - ) - - this.applyAttrAndStyle( - display, - place.svgGroup.selectAll('.transitive-place-icon'), - this.places_icon - ) - - this.applyAttrAndStyle( - display, - place.svgGroup.selectAll('.transitive-place-label'), - this.labels - ) - } - - /** - * Style a MultiPoint using the rules defined in styles.js or the Transitive options - * - * @param {Display} Transitive Display object - * @param {MultiPoint} Transitive MultiPoint object - */ - - styleMultiPoint (display, multipoint) { - this.applyAttrAndStyle( - display, - multipoint.svgGroup.selectAll('.transitive-multipoint-marker-pattern'), - this.multipoints_pattern - ) - - this.applyAttrAndStyle( - display, - multipoint.svgGroup.selectAll('.transitive-multipoint-marker-merged'), - this.multipoints_merged - ) - - this.applyAttrAndStyle( - display, - multipoint.svgGroup.selectAll('.transitive-multi-label'), - this.labels - ) - } - - /** - * Style a WireframeVertex using the rules defined in styles.js or the Transitive options - * - * @param {Display} Transitive Display object - * @param {WireframeVertex} Transitive WireframeVertex object - */ - - styleWireframeVertex (display, wfVertex) { - this.applyAttrAndStyle( - display, - wfVertex.svgGroup.selectAll('.transitive-wireframe-vertex-circle'), - this.wireframe_vertices - ) - } - - /** - * Style a Point label using the rules defined in styles.js or the Transitive options - * - * @param {Display} Transitive Display object - * @param {Point} Transitive Point object - */ - - stylePointLabel (display, point) { - var pointType = point.getType().toLowerCase() - - this.applyAttrAndStyle( - display, - point.svgGroup.selectAll('.transitive-' + pointType + '-label'), - this.labels - ) - } - - /** - * Style a Segment label using the rules defined in styles.js or the Transitive options - * - * @param {Display} Transitive Display object - * @param {SegmentLabel} Transitive SegmentLabel object - */ - - styleSegmentLabel (display, label) { - this.applyAttrAndStyle( - display, - label.svgGroup.selectAll('.transitive-segment-label-container'), - this.segment_label_containers - ) - this.applyAttrAndStyle( - display, - label.svgGroup.selectAll('.transitive-segment-label'), - this.segment_labels - ) - } - - /** - * Check if it's an attribute or a style and apply accordingly - * - * @param {Display} the Display object - * @param {Object} a D3 list of elements - * @param {Object} the list of attributes - */ - - applyAttrAndStyle (display, elements, attributes) { - for (var name in attributes) { - var rules = attributes[name] - var fn = svgAttributes.indexOf(name) === -1 ? 'style' : 'attr' - - this.applyRules(display, elements, name, rules, fn) - } - } - - /** - * Apply style/attribute rules to a list of elements - * - * @param {Display} display object - * @param {Object} elements - * @param {String} rule name - * @param {Array} rules - * @param {String} style/attr - */ - - applyRules (display, elements, name, rules, fn) { - var self = this - elements[fn](name, function (data, index) { - return self.compute(rules, display, data, index) - }) - } /** * Compute a style rule based on the current display and data diff --git a/lib/transitive.js b/lib/transitive.js index 858a013e..53e4c731 100644 --- a/lib/transitive.js +++ b/lib/transitive.js @@ -2,11 +2,9 @@ import d3 from 'd3' import Emitter from 'component-emitter' import Network from './core/network' -//import Display from './display/display' import SvgDisplay from './display/svg-display' import CanvasDisplay from './display/canvas-display' import DefaultRenderer from './renderer/default-renderer' -//import CanvasRenderer from './renderer/canvas-renderer' import WireframeRenderer from './renderer/wireframe-renderer' import Styler from './styler/styler' import Labeler from './labeler/labeler' @@ -104,24 +102,6 @@ export default class Transitive { this.el = el - /*this.display = this.options.display === 'canvas' - ? new CanvasDisplay(this) - : new SvgDisplay(this)*/ - - // Emit click events - /*var self = this - this.display.svg.on('click', function () { - var x = d3.event.x - var y = d3.event.y - var geographic = sm.inverse([x, y]) - self.emit('click', { - x: x, - y: y, - lng: geographic[0], - lat: geographic[1] - }) - })*/ - this.emit('set element', this, this.el) return this } @@ -173,18 +153,6 @@ export default class Transitive { return this } - /** - * Refresh - */ - - refresh (panning) { - if (!this.network) { - this.render() - } - - this.renderer.refresh() - } - /** * focusJourney */ diff --git a/lib/util/interpolate-line.js b/lib/util/interpolate-line.js deleted file mode 100644 index 0e464c2f..00000000 --- a/lib/util/interpolate-line.js +++ /dev/null @@ -1,90 +0,0 @@ -/** - * Line interpolation utility function - * - * @param {Array} points - */ - -import { pointAlongArc } from './index' - -export default function (points) { - var newPoints, i, r - - // determine if we need to resample the path (i.e. place new points at a regular - // interval for marker-based styling) based on styler settings - var resampleSpacing = this.display.styler.compute(this.display.styler.segments['marker-spacing'], this.display, this.segment) - - // handle the case of a simple straight line - if (points.length === 2) { - if (resampleSpacing) { - newPoints = [points[0]] - newPoints = newPoints.concat(resampleLine(points[0], points[1], - resampleSpacing)) - return newPoints.join(' ') - } - return points.join(' ') - } - - // otherwise, assume a curved segment - - if (resampleSpacing) { - newPoints = [points[0]] - for (i = 1; i < points.length; i++) { - if (this.segment.renderData[i].arc) { - // debug(this.renderData[i]); - // var r = this.renderData[i].radius; - // var sweep = (this.renderData[i].arc > 0) ? 0 : 1; - // str += 'A ' + r + ',' + r + ' 0 0 ' + sweep + ' ' + points[i]; - r = this.segment.renderData[i].radius - var theta = this.segment.renderData[i].arc * Math.PI / 180 - newPoints = newPoints.concat(resampleArc(points[i - 1], points[i], r, - theta, -this.segment.renderData[i].arc, resampleSpacing)) - } else { - newPoints = newPoints.concat(resampleLine(points[i - 1], points[i], - resampleSpacing)) - } - } - return newPoints.join(' ') - } else { - var str = points[0] - for (i = 1; i < points.length; i++) { - if (this.segment.renderData[i].arc) { - r = this.segment.renderData[i].radius - var sweep = (this.segment.renderData[i].arc > 0) ? 0 : 1 - str += 'A ' + r + ',' + r + ' 0 0 ' + sweep + ' ' + points[i] - } else { - str += 'L' + points[i] - } - } - return str - } -} - -function resampleLine (startPt, endPt, spacing) { - var dx = endPt[0] - startPt[0] - var dy = endPt[1] - startPt[1] - var len = Math.sqrt(dx * dx + dy * dy) - - var sampledPts = [startPt] - for (var l = spacing; l < len; l += spacing) { - var t = l / len - sampledPts.push([startPt[0] + t * dx, startPt[1] + t * dy]) - } - - sampledPts.push(endPt) - - return sampledPts -} - -function resampleArc (startPt, endPt, r, theta, ccw, spacing) { - var len = r * Math.abs(theta) - - var sampledPts = [] - for (var l = spacing; l < len; l += spacing) { - var t = l / len - var pt = pointAlongArc(startPt[0], startPt[1], endPt[0], endPt[1], r, - Math.abs(theta), ccw, t) - sampledPts.push([pt.x, pt.y]) - } - - return sampledPts -} From bf63c2e134078ce542a21692caba46824b50397c Mon Sep 17 00:00:00 2001 From: David Emory Date: Mon, 20 Aug 2018 16:24:50 -0400 Subject: [PATCH 04/18] refactor(general): Remove obsolete code --- lib/display/legend.js | 148 ------------------------------- lib/renderer/default-renderer.js | 11 --- lib/renderer/renderedsegment.js | 7 -- lib/transitive.js | 4 +- 4 files changed, 2 insertions(+), 168 deletions(-) delete mode 100644 lib/display/legend.js diff --git a/lib/display/legend.js b/lib/display/legend.js deleted file mode 100644 index a7ef6137..00000000 --- a/lib/display/legend.js +++ /dev/null @@ -1,148 +0,0 @@ -import d3 from 'd3' - -import RenderedEdge from '../renderer/renderededge' -import RenderedSegment from '../renderer/renderedsegment' -import Stop from '../point/stop' -import { parsePixelStyle } from '../util' - -/** - * Legend - */ - -export default class Legend { - constructor (el, display, transitive) { - this.el = el - this.display = display - this.transitive = transitive - - this.height = parsePixelStyle(d3.select(el).style('height')) - } - - render (legendSegments) { - d3.select(this.el).selectAll(':not(.doNotEmpty)').remove() - - this.x = this.spacing - this.y = this.height / 2 - - var segment - - // iterate through the representative map segments - for (var legendType in legendSegments) { - var mapSegment = legendSegments[legendType] - - // create a segment solely for rendering in the legend - segment = new RenderedSegment() - segment.type = mapSegment.getType() - segment.mode = mapSegment.mode - segment.patterns = mapSegment.patterns - - var canvas = this.createCanvas() - - var renderData = [] - renderData.push({ - x: 0, - y: canvas.height / 2 - }) - renderData.push({ - x: canvas.width, - y: canvas.height / 2 - }) - - segment.render(canvas) - segment.refresh(canvas, renderData) - - this.renderText(getDisplayText(legendType)) - - this.x += this.spacing * 2 - } - - // create the 'transfer' marker - - var rEdge = new RenderedEdge(null, true, 'TRANSIT') - rEdge.pattern = { - pattern_id: 'ptn', - route: { - route_type: 1 - } - } - - var transferStop = new Stop() - transferStop.isSegmentEndPoint = true - transferStop.isTransferPoint = true - - this.renderPoint(transferStop, rEdge, 'Transfer') - } - - renderPoint (point, rEdge, text) { - var canvas = this.createCanvas() - - point.addRenderData({ - owner: point, - rEdge: rEdge, - x: canvas.width / 2, - y: canvas.height / 2, - offsetX: 0, - offsetY: 0 - }) - - point.render(canvas) - - canvas.styler.stylePoint(canvas, point) - point.refresh(canvas) - - this.renderText(text) - } - - renderText (text) { - d3.select(this.el).append('div') - .attr('class', 'legendLabel') - .html(text) - } - - createCanvas () { - var container = d3.select(this.el).append('div') - .attr('class', 'legendSvg') - - var width = parsePixelStyle(container.style('width')) - if (!width || width === 0) width = 30 - - var height = parsePixelStyle(container.style('height')) - if (!height || height === 0) height = this.height - - var canvas = { - xScale: d3.scale.linear(), - yScale: d3.scale.linear(), - styler: this.transitive.styler, - zoom: this.display.zoom, - width: width, - height: height, - svg: container.append('svg') - .style('width', width) - .style('height', height) - } - - return canvas - } -} - -function getDisplayText (type) { - switch (type) { - case 'WALK': - return 'Walk' - case 'BICYCLE': - return 'Bike' - case 'CAR': - return 'Drive' - case 'TRANSIT_0': - return 'Tram' - case 'TRANSIT_1': - return 'Metro' - case 'TRANSIT_2': - return 'Rail' - case 'TRANSIT_3': - return 'Bus' - case 'TRANSIT_4': - return 'Ferry' - } - return type -} diff --git a/lib/renderer/default-renderer.js b/lib/renderer/default-renderer.js index 9e63859a..c5c98fcc 100644 --- a/lib/renderer/default-renderer.js +++ b/lib/renderer/default-renderer.js @@ -17,7 +17,6 @@ export default class DefaultRenderer extends Renderer { display.styler = this.transitive.styler // TODO: restore legend? - // var legendSegments = {} // Process vertices/points const focusedPoints = [] @@ -40,13 +39,6 @@ export default class DefaultRenderer extends Renderer { forEach(pathSegment.renderedSegments, renderedSegment => { if (renderedSegment.isFocused()) focusedSegments.push(renderedSegment) else unfocusedSegments.push(renderedSegment) - - /* - var legendType = renderedSegment.getLegendType() - if (!(legendType in legendSegments)) { - legendSegments[legendType] = renderedSegment - } - */ }) }) }) @@ -79,9 +71,6 @@ export default class DefaultRenderer extends Renderer { // Keep internal collection of rendered segments this.renderedSegments = focusedSegments.concat(unfocusedSegments) - - // TODO: make legends work again - // if (display.legend) display.legend.render(legendSegments) } refreshSegmentRenderData () { diff --git a/lib/renderer/renderedsegment.js b/lib/renderer/renderedsegment.js index 8bc97f27..8d8bc9dd 100644 --- a/lib/renderer/renderedsegment.js +++ b/lib/renderer/renderedsegment.js @@ -155,13 +155,6 @@ export default class RenderedSegment { }) } - getLegendType () { - if (this.type === 'TRANSIT') { - return this.type + '_' + this.mode - } - return this.type - } - toString () { return `RenderedSegment ${this.id} on ${this.pathSegment ? this.pathSegment.toString() : ' (null segment)'}` } diff --git a/lib/transitive.js b/lib/transitive.js index 53e4c731..35e48d7a 100644 --- a/lib/transitive.js +++ b/lib/transitive.js @@ -23,7 +23,6 @@ import { sm } from './util' * - data {Object} data to render * - styles {Object} styles to apply * - el {Element} the DOM element to render the main display to - * - legendEl {Element} the DOM element to render the legend to * - drawGrid {Boolean} whether to draw a background grid (defaults to false) * - gridCellSize {Number} resolution of the grid in SphericalMercator meters * - draggableTypes {Array} a list of network element types to enable dragging for @@ -37,6 +36,7 @@ import { sm } from './util' export default class Transitive { constructor (options) { + console.log('>>> TRN'); if (!(this instanceof Transitive)) return new Transitive(options) this.options = options @@ -97,7 +97,7 @@ export default class Transitive { * Set the DOM element that serves as the main map canvas */ - setElement (el, legendEl) { + setElement (el) { if (this.el) d3.select(this.el).selectAll('*').remove() this.el = el From 62ebbd093b43c6816db4756735953e8197b79d7d Mon Sep 17 00:00:00 2001 From: David Emory Date: Wed, 22 Aug 2018 17:07:50 -0400 Subject: [PATCH 05/18] refactor(linear-scale): Replace linear-scale with internal implementation --- lib/display/display.js | 7 ++++--- lib/display/draw-grid.js | 4 ++-- lib/graph/edge.js | 12 ++++++------ lib/graph/vertex.js | 4 ++-- lib/point/place.js | 4 ++-- lib/point/point.js | 8 ++++---- lib/renderer/wireframe-renderer.js | 4 ++-- lib/util/linear-scale.js | 16 ++++++++++++++++ package.json | 1 - yarn.lock | 4 ---- 10 files changed, 38 insertions(+), 26 deletions(-) create mode 100644 lib/util/linear-scale.js diff --git a/lib/display/display.js b/lib/display/display.js index e2d3583f..0280ca5b 100644 --- a/lib/display/display.js +++ b/lib/display/display.js @@ -1,4 +1,5 @@ -import linearScale from 'simple-linear-scale' +//import { scaleLinear } from 'd3-scale' +import LinearScale from '../util/linear-scale.js' export default class Display { constructor (transitive) { @@ -16,7 +17,7 @@ export default class Display { setXDomain (domain) { // [minX , maxX] this.xDomain = domain - this.xScale = linearScale(domain, [0, this.width]) + this.xScale = new LinearScale(domain, [0, this.width]) if (!this.initialXDomain) { this.initialXDomain = domain this.initialXRes = (domain[1] - domain[0]) / this.width @@ -25,7 +26,7 @@ export default class Display { setYDomain (domain) { // [minY , maxY] this.yDomain = domain - this.yScale = linearScale(domain, [this.height, 0]) + this.yScale = new LinearScale(domain, [this.height, 0]) if (!this.initialYDomain) this.initialYDomain = domain } diff --git a/lib/display/draw-grid.js b/lib/display/draw-grid.js index 4df79d66..5fb8e06b 100644 --- a/lib/display/draw-grid.js +++ b/lib/display/draw-grid.js @@ -32,9 +32,9 @@ export default function drawGrid (display, cellSize) { var xMin = Math.round(xDomain[0] / cellSize) * cellSize var xMax = Math.round(xDomain[1] / cellSize) * cellSize - for (var x = xMin; x <= xMax; x += cellSize) appendLine(xScale(x), xScale(x), yRange[0], yRange[1]) + for (var x = xMin; x <= xMax; x += cellSize) appendLine(xScale.compute(x), xScale.compute(x), yRange[0], yRange[1]) var yMin = Math.round(yDomain[0] / cellSize) * cellSize var yMax = Math.round(yDomain[1] / cellSize) * cellSize - for (var y = yMin; y <= yMax; y += cellSize) appendLine(xRange[0], xRange[1], yScale(y), yScale(y)) + for (var y = yMin; y <= yMax; y += cellSize) appendLine(xRange[0], xRange[1], yScale.compute(y), yScale.compute(y)) } diff --git a/lib/graph/edge.js b/lib/graph/edge.js index 6ba3ff8a..4d8b2f3a 100644 --- a/lib/graph/edge.js +++ b/lib/graph/edge.js @@ -395,14 +395,14 @@ export default class Edge { var toVector = null var rightVector var xOffset, yOffset - var x1 = display.xScale(coord[0]) - var y1 = display.yScale(coord[1]) + var x1 = display.xScale.compute(coord[0]) + var y1 = display.yScale.compute(coord[1]) // calculate the vector leading in to this coordinate if (i > 0) { var prevCoord = geomCoords[i - 1] - var x0 = display.xScale(prevCoord[0]) - var y0 = display.yScale(prevCoord[1]) + var x0 = display.xScale.compute(prevCoord[0]) + var y0 = display.yScale.compute(prevCoord[1]) if (x1 === x0 && y1 === y0) return toVector = { @@ -414,8 +414,8 @@ export default class Edge { // calculate the vector leading out from this coordinate if (i < geomCoords.length - 1) { var nextCoord = geomCoords[i + 1] - var x2 = display.xScale(nextCoord[0]) - var y2 = display.yScale(nextCoord[1]) + var x2 = display.xScale.compute(nextCoord[0]) + var y2 = display.yScale.compute(nextCoord[1]) if (x2 === x1 && y2 === y1) return fromVector = { diff --git a/lib/graph/vertex.js b/lib/graph/vertex.js index a709d9cc..6718238e 100644 --- a/lib/graph/vertex.js +++ b/lib/graph/vertex.js @@ -27,11 +27,11 @@ export default class Vertex { } getRenderX (display) { - return display.xScale(this.x) + this.point.placeOffsets.x + return display.xScale.compute(this.x) + this.point.placeOffsets.x } getRenderY (display) { - return display.yScale(this.y) + this.point.placeOffsets.y + return display.yScale.compute(this.y) + this.point.placeOffsets.y } /** diff --git a/lib/point/place.js b/lib/point/place.js index a4297388..be134965 100644 --- a/lib/point/place.js +++ b/lib/point/place.js @@ -104,10 +104,10 @@ export default class Place extends Point { if (displayStyle === 'none') return this.renderXY = { - x: display.xScale(display.activeZoomFactors.useGeographicRendering + x: display.xScale.compute(display.activeZoomFactors.useGeographicRendering ? this.worldX : this.graphVertex.x), - y: display.yScale(display.activeZoomFactors.useGeographicRendering + y: display.yScale.compute(display.activeZoomFactors.useGeographicRendering ? this.worldY : this.graphVertex.y) } diff --git a/lib/point/point.js b/lib/point/point.js index af22d8b5..22b20f16 100644 --- a/lib/point/point.js +++ b/lib/point/point.js @@ -112,8 +112,8 @@ export default class Point { var xValues = [] var yValues = [] dataArray.forEach(function (data) { - var x = data.x // display.xScale(data.x) + data.offsetX; - var y = data.y // display.yScale(data.y) - data.offsetY; + var x = data.x + var y = data.y xValues.push(x) yValues.push(y) }) @@ -186,8 +186,8 @@ export default class Point { owner: this.adjacentPlace }) - var placeX = display.xScale(this.adjacentPlace.worldX) - var placeY = display.yScale(this.adjacentPlace.worldY) + var placeX = display.xScale.compute(this.adjacentPlace.worldX) + var placeY = display.yScale.compute(this.adjacentPlace.worldY) var thisR = this.mergedMarkerData.width / 2 var thisX = this.mergedMarkerData.x + thisR diff --git a/lib/renderer/wireframe-renderer.js b/lib/renderer/wireframe-renderer.js index c57c2668..042207be 100644 --- a/lib/renderer/wireframe-renderer.js +++ b/lib/renderer/wireframe-renderer.js @@ -33,8 +33,8 @@ export default class WireframeRenderer extends Renderer { // Draw the vertices forEach(graph.vertices, vertex => { display.drawCircle({ - x: display.xScale(vertex.x), - y: display.yScale(vertex.y) + x: display.xScale.compute(vertex.x), + y: display.yScale.compute(vertex.y) }, { r: 4, fill: '#000' diff --git a/lib/util/linear-scale.js b/lib/util/linear-scale.js new file mode 100644 index 00000000..a69cb641 --- /dev/null +++ b/lib/util/linear-scale.js @@ -0,0 +1,16 @@ +export default class LinearScale { + constructor (domain, range) { + this.domain = domain + this.range = range + } + + compute (val) { + const { domain: d, range: r } = this + return (val - d[0]) / (d[1] - d[0]) * (r[1] - r[0]) + r[0] + } + + invert (val) { + const { domain: d, range: r } = this + return (val - r[0]) / (r[1] - r[0]) * (d[1] - d[0]) + d[0] + } +} diff --git a/package.json b/package.json index 68f99264..ada02691 100644 --- a/package.json +++ b/package.json @@ -23,7 +23,6 @@ "measure-text": "^0.0.4", "priorityqueuejs": "1.0.0", "rounded-rect": "^0.0.1", - "simple-linear-scale": "^1.0.1", "sphericalmercator": "^1.0.5", "svg.js": "^2.6.5" }, diff --git a/yarn.lock b/yarn.lock index 4e312978..d38cb2bf 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7467,10 +7467,6 @@ simple-html-index@^1.4.0: dependencies: from2-string "^1.1.0" -simple-linear-scale@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/simple-linear-scale/-/simple-linear-scale-1.0.1.tgz#7142a28923c23d75bc13f437a7e17bea02269eab" - slash@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" From 4c525f663aa683ddc02a87e17ed7a3da02ea6a43 Mon Sep 17 00:00:00 2001 From: David Emory Date: Wed, 22 Aug 2018 17:28:19 -0400 Subject: [PATCH 06/18] refactor(grid): Remove draw-grid code --- lib/display/draw-grid.js | 40 ---------------------------------------- lib/renderer/renderer.js | 5 ----- lib/transitive.js | 1 - 3 files changed, 46 deletions(-) delete mode 100644 lib/display/draw-grid.js diff --git a/lib/display/draw-grid.js b/lib/display/draw-grid.js deleted file mode 100644 index 5fb8e06b..00000000 --- a/lib/display/draw-grid.js +++ /dev/null @@ -1,40 +0,0 @@ -/** - * Draw the snapping grid - * - * @param {Display} display object - * @param {Number} cell size - */ - -export default function drawGrid (display, cellSize) { - var svg = display.svg - var xScale = display.xScale - var yScale = display.yScale - - const appendLine = (x1, x2, y1, y2) => { - grid.append('line') - .attr('class', 'gridline') - .attr('x1', x1) - .attr('x2', x2) - .attr('y1', y1) - .attr('y2', y2) - } - - // Remove all current gridlines - svg.selectAll('.gridline').remove() - - // Add a grid group "behind" everything else - var grid = svg.insert('g', ':first-child') - - var xRange = xScale.range() - var yRange = yScale.range() - var xDomain = xScale.domain() - var yDomain = yScale.domain() - - var xMin = Math.round(xDomain[0] / cellSize) * cellSize - var xMax = Math.round(xDomain[1] / cellSize) * cellSize - for (var x = xMin; x <= xMax; x += cellSize) appendLine(xScale.compute(x), xScale.compute(x), yRange[0], yRange[1]) - - var yMin = Math.round(yDomain[0] / cellSize) * cellSize - var yMax = Math.round(yDomain[1] / cellSize) * cellSize - for (var y = yMin; y <= yMax; y += cellSize) appendLine(xRange[0], xRange[1], yScale.compute(y), yScale.compute(y)) -} diff --git a/lib/renderer/renderer.js b/lib/renderer/renderer.js index 7716bd50..08adc098 100644 --- a/lib/renderer/renderer.js +++ b/lib/renderer/renderer.js @@ -1,7 +1,5 @@ import { forEach } from 'lodash' -import drawGrid from '../display/draw-grid' - /** * A superclass for a Transitive network rendering engine. */ @@ -31,9 +29,6 @@ export default class Renderer { // Clear the display display.clear() - - // Draw the grid, if necessary - if (this.transitive.options.drawGrid) drawGrid(display, this.gridCellSize) } /** diff --git a/lib/transitive.js b/lib/transitive.js index 35e48d7a..b14ee608 100644 --- a/lib/transitive.js +++ b/lib/transitive.js @@ -23,7 +23,6 @@ import { sm } from './util' * - data {Object} data to render * - styles {Object} styles to apply * - el {Element} the DOM element to render the main display to - * - drawGrid {Boolean} whether to draw a background grid (defaults to false) * - gridCellSize {Number} resolution of the grid in SphericalMercator meters * - draggableTypes {Array} a list of network element types to enable dragging for * - initialBounds {Array} initial lon/lat bounds for the display expressed as [[west, south], [east, north]] From b2ce86f0894bf8027723feb2c330c50f97cf1962 Mon Sep 17 00:00:00 2001 From: David Emory Date: Sat, 25 Aug 2018 16:39:22 -0400 Subject: [PATCH 07/18] refactor(tile-layer): Remove tile layer code --- lib/display/tile-layer.js | 135 -------------------------------------- lib/transitive.css | 26 -------- lib/transitive.js | 1 - 3 files changed, 162 deletions(-) delete mode 100644 lib/display/tile-layer.js diff --git a/lib/display/tile-layer.js b/lib/display/tile-layer.js deleted file mode 100644 index dea41401..00000000 --- a/lib/display/tile-layer.js +++ /dev/null @@ -1,135 +0,0 @@ -var debug = require('debug')('transitive:tile-layer') - -import d3 from 'd3' -import geoTile from './d3.geo.tile' - -const prefix = prefixMatch(['webkit', 'ms', 'Moz', 'O']) - -/** - * Tile layer takes a parent element, a zoom behavior, and a Mapbox ID - * - * @param {Object} opts - */ - -export default function TileLayer (opts) { - debug('creating the tile layer') - - var el = opts.el - var display = opts.display - var height = el.clientHeight - var id = opts.mapboxId - var width = el.clientWidth - - // Set up the projection - var projection = d3.geo.mercator() - .translate([width / 2, height / 2]) - - // Set up the map tiles - var tile = geoTile() - - // Create the tile layer - var tileLayer = d3.select(el) - .append('div') - .attr('class', 'tile-layer') - - // Initial zoom - zoomed() - - this.zoomed = zoomed - - // Reload tiles on pan and zoom - function zoomed () { - // Get the height and width - height = el.clientHeight - width = el.clientWidth - - // Set the map tile size - tile.size([width, height]) - - // Get the current display bounds - var bounds = display.llBounds() - - // Project the bounds based on the current projection - var psw = projection(bounds[0]) - var pne = projection(bounds[1]) - - // Based the new scale and translation vector off the current one - var scale = projection.scale() * 2 * Math.PI - var translate = projection.translate() - - var dx = pne[0] - psw[0] - var dy = pne[1] - psw[1] - - scale = scale * (1 / Math.max(dx / width, dy / height)) - projection - .translate([width / 2, height / 2]) - .scale(scale / 2 / Math.PI) - - // Reproject the bounds based on the new scale and translation vector - psw = projection(bounds[0]) - pne = projection(bounds[1]) - var x = (psw[0] + pne[0]) / 2 - var y = (psw[1] + pne[1]) / 2 - translate = [width - x, height - y] - - // Update the Geo tiles - tile - .scale(scale) - .translate(translate) - - // Get the new set of tiles and render - renderTiles(tile()) - } - - // Render tiles - const renderTiles = (tiles) => { - var image = tileLayer - .style(prefix + 'transform', matrix3d(tiles.scale, tiles.translate)) - .selectAll('.tile') - .data(tiles, function (d) { - return d - }) - - image.exit() - .remove() - - image.enter().append('img') - .attr('class', 'tile') - .attr('src', function (d) { - return 'http://' + ['a', 'b', 'c', 'd'][Math.random() * 4 | 0] + - '.tiles.mapbox.com/v3/' + id + '/' + d[2] + '/' + d[0] + - '/' + d[1] + '.png' - }) - .style('left', function (d) { - return (d[0] << 8) + 'px' - }) - .style('top', function (d) { - return (d[1] << 8) + 'px' - }) - } -} - -/** - * Get the 3D Transform Matrix - */ - -function matrix3d (scale, translate) { - var k = scale / 256 - var r = scale % 1 ? Number : Math.round - return 'matrix3d(' + [k, 0, 0, 0, 0, k, 0, 0, 0, 0, k, 0, r(translate[0] * - scale), r(translate[1] * scale), 0, 1] + ')' -} - -/** - * Match the transform prefix - */ - -function prefixMatch (p) { - var i = -1 - var n = p.length - var s = document.body.style - while (++i < n) { - if (p[i] + 'Transform' in s) return '-' + p[i].toLowerCase() + '-' - } - return '' -} diff --git a/lib/transitive.css b/lib/transitive.css index 4eb04b7e..c38ff48d 100644 --- a/lib/transitive.css +++ b/lib/transitive.css @@ -76,29 +76,3 @@ stroke: #333; stroke-width: 1px; } - -/** - * Tile Layer - */ - -.Transitive > .tile-layer { - position: absolute; - z-index: 50; -} - -.Transitive > .tile-layer > .tile { - pointer-events: none; - position: absolute; - width: 256px; - height: 256px; -} - -/** - * Grid - */ - -.Transitive .gridline { - fill: none; - stroke: #ccc; - stroke-width: 1px; -} diff --git a/lib/transitive.js b/lib/transitive.js index b14ee608..8b2a6f22 100644 --- a/lib/transitive.js +++ b/lib/transitive.js @@ -27,7 +27,6 @@ import { sm } from './util' * - draggableTypes {Array} a list of network element types to enable dragging for * - initialBounds {Array} initial lon/lat bounds for the display expressed as [[west, south], [east, north]] * - displayMargins {Object} padding to apply to the initial rendered network within the display. Expressed in pixels for top/bottom/left/right - * - mapboxId {String} an Mapbox tileset id for rendering background tiles (Deprecated -- use Leaflet with Leaflet.TransitiveLayer) * - zoomEnabled {Boolean} whether to enable the display's built-in zoom/pan functionality (defaults to true) * - autoResize {Boolean} whether the display should listen for window resize events and update automatically (defaults to true) * - groupEdges {Boolean} whether to consider edges with the same origin/destination equivalent for rendering, even if intermediate stop sequence is different (defaults to true) From 8e9c3a7cf9d5dc13e9a9d462b25fb524facfd06c Mon Sep 17 00:00:00 2001 From: David Emory Date: Mon, 27 Aug 2018 14:25:50 -0400 Subject: [PATCH 08/18] feat(api): Add method for creating new vertex --- lib/transitive.js | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/lib/transitive.js b/lib/transitive.js index 8b2a6f22..19f6c468 100644 --- a/lib/transitive.js +++ b/lib/transitive.js @@ -8,6 +8,7 @@ import DefaultRenderer from './renderer/default-renderer' import WireframeRenderer from './renderer/wireframe-renderer' import Styler from './styler/styler' import Labeler from './labeler/labeler' +import Point from './point/point' import { sm } from './util' /* @@ -214,6 +215,12 @@ export default class Transitive { this.display.applyTransform(transform) this.render() } + + /** editor functions **/ + + createVertex (wx, wy) { + this.network.graph.addVertex(new Point(), wx, wy) + } } /** From c2a3c6db5c40236e18ad6f010baa77cca3753daf Mon Sep 17 00:00:00 2001 From: David Emory Date: Mon, 27 Aug 2018 16:51:27 -0400 Subject: [PATCH 09/18] feat(options): Handle initialBounds option --- lib/transitive.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lib/transitive.js b/lib/transitive.js index 19f6c468..0e81d167 100644 --- a/lib/transitive.js +++ b/lib/transitive.js @@ -55,6 +55,10 @@ export default class Transitive { this.labeler = new Labeler(this) this.styler = new Styler(options.styles, this) + + if (options.initialBounds) { + this.display.fitToWorldBounds(options.initialBounds) + } } /** From 6401a423ca87dbb611b7c25f94540cb71b96696f Mon Sep 17 00:00:00 2001 From: David Emory Date: Mon, 24 Sep 2018 13:55:48 -0400 Subject: [PATCH 10/18] feat(renderer): Remove Path2D dependency in Canvas renderer --- lib/display/canvas-display.js | 21 ++++++++++++++++----- lib/display/display.js | 2 +- lib/display/svg-display.js | 6 ++++-- lib/graph/edge.js | 2 ++ lib/renderer/renderedsegment.js | 4 ++-- lib/renderer/wireframe-renderer.js | 3 +-- 6 files changed, 26 insertions(+), 12 deletions(-) diff --git a/lib/display/canvas-display.js b/lib/display/canvas-display.js index 8eec21ab..16eb95ff 100644 --- a/lib/display/canvas-display.js +++ b/lib/display/canvas-display.js @@ -77,22 +77,33 @@ export default class CanvasDisplay extends Display { // TODO: implement } - drawPath (pathStr, attrs) { - const path = new Path2D(pathStr) + drawPath (renderData, attrs) { + if (!renderData || renderData.length === 0) return + // Apply stroke/width styles this.ctx.strokeStyle = attrs['stroke'] this.ctx.lineWidth = attrs['stroke-width'] - // dash array + // Apply line-dash style, if present if (attrs['stroke-dasharray']) { const arr = attrs['stroke-dasharray'].split(',').map(str => parseFloat(str.trim())) this.ctx.setLineDash(arr) } - // linecap + + // Apply linecap style this.ctx.lineCap = attrs['stroke-linecap'] || 'butt' - this.ctx.stroke(path) + // Draw the path + this.ctx.beginPath() + this.ctx.moveTo(renderData[0].x, renderData[0].y) + for (let i = 1; i < renderData.length; i++) { + const rd = renderData[i] + if (rd.arc) this.ctx.arcTo(rd.ex, rd.ey, rd.x, rd.y, rd.radius) + else this.ctx.lineTo(rd.x, rd.y) + } + this.ctx.stroke() + // Revert line-dash style to default if (attrs['stroke-dasharray']) this.ctx.setLineDash([]) } diff --git a/lib/display/display.js b/lib/display/display.js index 0280ca5b..e27a23bf 100644 --- a/lib/display/display.js +++ b/lib/display/display.js @@ -220,5 +220,5 @@ export default class Display { drawText (text, anchor, attrs) { } - drawPath (pathStr, attrs) { } + drawPath (renderData, attrs) { } } diff --git a/lib/display/svg-display.js b/lib/display/svg-display.js index 26d046d6..58d23168 100644 --- a/lib/display/svg-display.js +++ b/lib/display/svg-display.js @@ -1,6 +1,8 @@ import Display from './display' import SVG from 'svg.js' +import { renderDataToSvgPath } from '../util' + export default class SvgDisplay extends Display { constructor (transitive) { super(transitive) @@ -31,8 +33,8 @@ export default class SvgDisplay extends Display { this.svg.ellipse().move(center.x, center.y).attr(attrs) } - drawPath (pathStr, attrs) { - this.svg.path(pathStr).attr(attrs) + drawPath (renderData, attrs) { + this.svg.path(renderDataToSvgPath(renderData)).attr(attrs) } drawText (text, anchor, attrs) { diff --git a/lib/graph/edge.js b/lib/graph/edge.js index 4d8b2f3a..bb99ffdd 100644 --- a/lib/graph/edge.js +++ b/lib/graph/edge.js @@ -543,6 +543,8 @@ export default class Edge { y: y2, len: angleR * radius, arc: arc, + ex, + ey, radius: radius }) diff --git a/lib/renderer/renderedsegment.js b/lib/renderer/renderedsegment.js index 8d8bc9dd..c22a6507 100644 --- a/lib/renderer/renderedsegment.js +++ b/lib/renderer/renderedsegment.js @@ -1,6 +1,6 @@ import { forEach } from 'lodash' -import { distance, renderDataToSvgPath } from '../util' +import { distance } from '../util' /** * RenderedSegment @@ -50,7 +50,7 @@ export default class RenderedSegment { this.renderData = [first, arc, last] } - display.drawPath(renderDataToSvgPath(this.renderData), { + display.drawPath(this.renderData, { fill: 'none', stroke: styler.compute2('segments', 'stroke', this), 'stroke-width': styler.compute2('segments', 'stroke-width', this), diff --git a/lib/renderer/wireframe-renderer.js b/lib/renderer/wireframe-renderer.js index 042207be..fb313ea8 100644 --- a/lib/renderer/wireframe-renderer.js +++ b/lib/renderer/wireframe-renderer.js @@ -1,7 +1,6 @@ import { forEach } from 'lodash' import Renderer from './renderer' -import { renderDataToSvgPath } from '../util' /** * A Renderer subclass for drawing a simplified representation of the graph @@ -22,7 +21,7 @@ export default class WireframeRenderer extends Renderer { // Get a basic, non-offset edge renderData array const renderData = edge.getRenderCoords(0, 0, display, true) - display.drawPath(renderDataToSvgPath(renderData), { + display.drawPath(renderData, { fill: 'none', 'stroke-width': 2, stroke: '#000', From 5cc3ea898ff7c214edd9c11708acc786744ca14d Mon Sep 17 00:00:00 2001 From: David Emory Date: Mon, 24 Sep 2018 13:59:24 -0400 Subject: [PATCH 11/18] build(dist): Update dist files --- dist/bundle.css | 106 + dist/bundle.js | 19276 +++++++++++++++++++++++++++++++++++++++++++ dist/bundle.js.map | 199 + 3 files changed, 19581 insertions(+) create mode 100644 dist/bundle.css create mode 100644 dist/bundle.js create mode 100644 dist/bundle.js.map diff --git a/dist/bundle.css b/dist/bundle.css new file mode 100644 index 00000000..29b1d9ad --- /dev/null +++ b/dist/bundle.css @@ -0,0 +1,106 @@ + +/** + * Transitive Base Styles + */ + +.Transitive { + overflow: hidden; +} + +/** + * Schematic Map + */ + +.Transitive > .schematic-map { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; + z-index: 100; +} + +/** + * Labels + */ + +.Transitive > .schematic-map .transitive-stop-label, +.Transitive > .schematic-map .transitive-multi-label, +.Transitive > .schematic-map .transitive-place-label { + text-shadow: + -2px -2px 0 #fff, + 2px -2px 0 #fff, + -2px 2px 0 #fff, + 2px 2px 0 #fff; +} + +.Transitive > .schematic-map .transitive-segment-label { + fill: #fff; +} + +/** + * Label Container + */ + +.Transitive > .schematic-map .transitive-segment-label-container { + fill: #008; +} + +/** + * Lines + */ + +.Transitive > .schematic-map .transitive-line { + stroke-linecap: round; + fill: none; +} + +/** + * Places + */ + +.Transitive > .schematic-map .transitive-place-circle { + fill: #fff; + stroke: #333; + stroke-width: 2px; +} + +/** + * Stops + */ + +.Transitive > .schematic-map .transitive-stop-marker-pattern, +.Transitive > .schematic-map .transitive-stop-marker-merged, +.Transitive > .schematic-map .transitive-multipoint-marker-merged { + fill: #fff; + stroke: #333; + stroke-width: 1px; +} + +/** + * Tile Layer + */ + +.Transitive > .tile-layer { + position: absolute; + z-index: 50; +} + +.Transitive > .tile-layer > .tile { + pointer-events: none; + position: absolute; + width: 256px; + height: 256px; +} + +/** + * Grid + */ + +.Transitive .gridline { + fill: none; + stroke: #ccc; + stroke-width: 1px; +} + +/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIjxpbnB1dCBjc3MgMT4iXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUNBOztHQUVHOztBQUVIO0VBQ0UsaUJBQWlCO0NBQ2xCOztBQUVEOztHQUVHOztBQUVIO0VBQ0UsbUJBQW1CO0VBQ25CLFFBQVE7RUFDUixPQUFPO0VBQ1AsWUFBWTtFQUNaLGFBQWE7RUFDYixhQUFhO0NBQ2Q7O0FBRUQ7O0dBRUc7O0FBRUg7OztFQUdFOzs7O29CQUlrQjtDQUNuQjs7QUFFRDtFQUNFLFdBQVc7Q0FDWjs7QUFFRDs7R0FFRzs7QUFFSDtFQUNFLFdBQVc7Q0FDWjs7QUFFRDs7R0FFRzs7QUFFSDtFQUNFLHNCQUFzQjtFQUN0QixXQUFXO0NBQ1o7O0FBRUQ7O0dBRUc7O0FBRUg7RUFDRSxXQUFXO0VBQ1gsYUFBYTtFQUNiLGtCQUFrQjtDQUNuQjs7QUFFRDs7R0FFRzs7QUFFSDs7O0VBR0UsV0FBVztFQUNYLGFBQWE7RUFDYixrQkFBa0I7Q0FDbkI7O0FBRUQ7O0dBRUc7O0FBRUg7RUFDRSxtQkFBbUI7RUFDbkIsWUFBWTtDQUNiOztBQUVEO0VBQ0UscUJBQXFCO0VBQ3JCLG1CQUFtQjtFQUNuQixhQUFhO0VBQ2IsY0FBYztDQUNmOztBQUVEOztHQUVHOztBQUVIO0VBQ0UsV0FBVztFQUNYLGFBQWE7RUFDYixrQkFBa0I7Q0FDbkIiLCJmaWxlIjoiYnVuZGxlLmNzcyIsInNvdXJjZXNDb250ZW50IjpbIlxuLyoqXG4gKiBUcmFuc2l0aXZlIEJhc2UgU3R5bGVzXG4gKi9cblxuLlRyYW5zaXRpdmUge1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuXG4vKipcbiAqIFNjaGVtYXRpYyBNYXBcbiAqL1xuXG4uVHJhbnNpdGl2ZSA+IC5zY2hlbWF0aWMtbWFwIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICBsZWZ0OiAwO1xuICB0b3A6IDA7XG4gIHdpZHRoOiAxMDAlO1xuICBoZWlnaHQ6IDEwMCU7XG4gIHotaW5kZXg6IDEwMDtcbn1cblxuLyoqXG4gKiBMYWJlbHNcbiAqL1xuXG4uVHJhbnNpdGl2ZSA+IC5zY2hlbWF0aWMtbWFwIC50cmFuc2l0aXZlLXN0b3AtbGFiZWwsXG4uVHJhbnNpdGl2ZSA+IC5zY2hlbWF0aWMtbWFwIC50cmFuc2l0aXZlLW11bHRpLWxhYmVsLFxuLlRyYW5zaXRpdmUgPiAuc2NoZW1hdGljLW1hcCAudHJhbnNpdGl2ZS1wbGFjZS1sYWJlbCB7XG4gIHRleHQtc2hhZG93OlxuICAgLTJweCAtMnB4IDAgI2ZmZixcbiAgICAycHggLTJweCAwICNmZmYsXG4gICAgLTJweCAycHggMCAjZmZmLFxuICAgICAycHggMnB4IDAgI2ZmZjtcbn1cblxuLlRyYW5zaXRpdmUgPiAuc2NoZW1hdGljLW1hcCAudHJhbnNpdGl2ZS1zZWdtZW50LWxhYmVsIHtcbiAgZmlsbDogI2ZmZjtcbn1cblxuLyoqXG4gKiBMYWJlbCBDb250YWluZXJcbiAqL1xuXG4uVHJhbnNpdGl2ZSA+IC5zY2hlbWF0aWMtbWFwIC50cmFuc2l0aXZlLXNlZ21lbnQtbGFiZWwtY29udGFpbmVyIHtcbiAgZmlsbDogIzAwODtcbn1cblxuLyoqXG4gKiBMaW5lc1xuICovXG5cbi5UcmFuc2l0aXZlID4gLnNjaGVtYXRpYy1tYXAgLnRyYW5zaXRpdmUtbGluZSB7XG4gIHN0cm9rZS1saW5lY2FwOiByb3VuZDtcbiAgZmlsbDogbm9uZTtcbn1cblxuLyoqXG4gKiBQbGFjZXNcbiAqL1xuXG4uVHJhbnNpdGl2ZSA+IC5zY2hlbWF0aWMtbWFwIC50cmFuc2l0aXZlLXBsYWNlLWNpcmNsZSB7XG4gIGZpbGw6ICNmZmY7XG4gIHN0cm9rZTogIzMzMztcbiAgc3Ryb2tlLXdpZHRoOiAycHg7XG59XG5cbi8qKlxuICogU3RvcHNcbiAqL1xuXG4uVHJhbnNpdGl2ZSA+IC5zY2hlbWF0aWMtbWFwIC50cmFuc2l0aXZlLXN0b3AtbWFya2VyLXBhdHRlcm4sXG4uVHJhbnNpdGl2ZSA+IC5zY2hlbWF0aWMtbWFwIC50cmFuc2l0aXZlLXN0b3AtbWFya2VyLW1lcmdlZCxcbi5UcmFuc2l0aXZlID4gLnNjaGVtYXRpYy1tYXAgLnRyYW5zaXRpdmUtbXVsdGlwb2ludC1tYXJrZXItbWVyZ2VkIHtcbiAgZmlsbDogI2ZmZjtcbiAgc3Ryb2tlOiAjMzMzO1xuICBzdHJva2Utd2lkdGg6IDFweDtcbn1cblxuLyoqXG4gKiBUaWxlIExheWVyXG4gKi9cblxuLlRyYW5zaXRpdmUgPiAudGlsZS1sYXllciB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgei1pbmRleDogNTA7XG59XG5cbi5UcmFuc2l0aXZlID4gLnRpbGUtbGF5ZXIgPiAudGlsZSB7XG4gIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHdpZHRoOiAyNTZweDtcbiAgaGVpZ2h0OiAyNTZweDtcbn1cblxuLyoqXG4gKiBHcmlkXG4gKi9cblxuLlRyYW5zaXRpdmUgLmdyaWRsaW5lIHtcbiAgZmlsbDogbm9uZTtcbiAgc3Ryb2tlOiAjY2NjO1xuICBzdHJva2Utd2lkdGg6IDFweDtcbn1cbiJdfQ== */ \ No newline at end of file diff --git a/dist/bundle.js b/dist/bundle.js new file mode 100644 index 00000000..51f7ef5b --- /dev/null +++ b/dist/bundle.js @@ -0,0 +1,19276 @@ +(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o 1) { + for (var i = 1; i < arguments.length; i++) { + args[i - 1] = arguments[i]; + } + } + queue.push(new Item(fun, args)); + if (queue.length === 1 && !draining) { + runTimeout(drainQueue); + } +}; + +// v8 likes predictible objects +function Item(fun, array) { + this.fun = fun; + this.array = array; +} +Item.prototype.run = function () { + this.fun.apply(null, this.array); +}; +process.title = 'browser'; +process.browser = true; +process.env = {}; +process.argv = []; +process.version = ''; // empty string to avoid regexp issues +process.versions = {}; + +function noop() {} + +process.on = noop; +process.addListener = noop; +process.once = noop; +process.off = noop; +process.removeListener = noop; +process.removeAllListeners = noop; +process.emit = noop; + +process.binding = function (name) { + throw new Error('process.binding is not supported'); +}; + +process.cwd = function () { return '/' }; +process.chdir = function (dir) { + throw new Error('process.chdir is not supported'); +}; +process.umask = function() { return 0; }; + +},{}],2:[function(require,module,exports){ +'use strict'; + +var PathSegment = require('./pathsegment'); +var NetworkPath = require('./path'); +var TurnPoint = require('../point/turn'); + +var each = require('component-each'); +/** + * Expose `Journey` + */ + +module.exports = Journey; + +/** + * + */ + +function Journey(data, network) { + this.network = network; + + for (var key in data) { + this[key] = data[key]; + } + + this.path = new NetworkPath(this); + + each(this.segments, function (segmentInfo) { + var pathSegment = new PathSegment(segmentInfo.type, this.path); + pathSegment.journeySegment = segmentInfo; + + if (segmentInfo.type === 'TRANSIT') { + if (segmentInfo.patterns) { + each(segmentInfo.patterns, function (patternInfo) { + pathSegment.addPattern(network.patterns[patternInfo.pattern_id], patternInfo.from_stop_index, patternInfo.to_stop_index); + }); + } else if (segmentInfo.pattern_id) { + // legacy support for single-pattern journey segments + pathSegment.addPattern(network.patterns[segmentInfo.pattern_id], segmentInfo.from_stop_index, segmentInfo.to_stop_index); + } + } else { + // non-transit segment + var streetEdges = []; + // screen out degenerate transfer segments + if (segmentInfo.from.type === 'STOP' && segmentInfo.to.type === 'STOP' && segmentInfo.from.stop_id === segmentInfo.to.stop_id) return; + + pathSegment.points.push(getEndPoint(segmentInfo.from, network)); + if (segmentInfo.streetEdges && segmentInfo.streetEdges.length > 0) { + var lastTurnPoint = null; + + for (var i = 0; i < segmentInfo.streetEdges.length; i++) { + var streetEdgeId = segmentInfo.streetEdges[i]; + var streetEdge = network.streetEdges[streetEdgeId]; + streetEdge.id = streetEdgeId; + streetEdges.push(streetEdge); + if (i >= segmentInfo.streetEdges.length - 1) continue; + + if (lastTurnPoint) streetEdge.fromTurnPoint = lastTurnPoint; + var lastIndex = streetEdge.length - 1; + + // screen out degenerate edges + if (streetEdge.latLons[0][0] === streetEdge.latLons[lastIndex][0] && streetEdge.latLons[0][1] === streetEdge.latLons[lastIndex][1]) { + continue; + } + + // create a TurnPoint for the 'from' point of this edge + var turnPoint = getTurnPoint({ + lat: streetEdge.latLons[lastIndex][0], + lon: streetEdge.latLons[lastIndex][1], + worldX: streetEdge.worldCoords[lastIndex][0], + worldY: streetEdge.worldCoords[lastIndex][1] + }, network); + + // compute the angle represented by this turn point + /* turnPoint.turnAngle = Util.angleFromThreePoints( + streetEdge.worldCoords[0][0], + streetEdge.worldCoords[0][1], + streetEdge.worldCoords[lastIndex][0], + streetEdge.worldCoords[lastIndex][1], + nextEdge.worldCoords[nextEdge.length-1][0], + nextEdge.worldCoords[nextEdge.length-1][1] + ); */ + + pathSegment.points.push(turnPoint); + lastTurnPoint = streetEdge.toTurnPoint = turnPoint; + } + pathSegment.streetEdges = streetEdges; + } + pathSegment.points.push(getEndPoint(segmentInfo.to, network)); + } + this.path.addSegment(pathSegment); + }, this); +} + +function getEndPoint(pointInfo, network) { + if (pointInfo.type === 'PLACE') { + return network.places[pointInfo.place_id]; + } else if (pointInfo.type === 'STOP') { + return network.stops[pointInfo.stop_id]; + } +} + +Journey.prototype.getElementId = function () { + return 'journey-' + this.journey_id; +}; + +/* utility function for creating non-duplicative TurnPoints */ + +function getTurnPoint(turnPointInfo, network) { + var key = turnPointInfo.lat + '_' + turnPointInfo.lon; + if (key in network.turnPoints) return network.turnPoints[key]; + var turnPoint = new TurnPoint(turnPointInfo, key); + network.turnPoints[key] = turnPoint; + // network.addVertexPoint(turnPoint); + return turnPoint; +} + +},{"../point/turn":29,"./path":4,"./pathsegment":5,"component-each":84}],3:[function(require,module,exports){ +'use strict'; + +var each = require('component-each'); +var debug = require('debug')('transitive:network'); +var Emitter = require('component-emitter'); + +var Route = require('./route'); +var RoutePattern = require('./pattern'); +var Journey = require('./journey'); + +var Stop = require('../point/stop'); +var Place = require('../point/place'); +var PointClusterMap = require('../point/pointclustermap'); +var RenderedEdge = require('../renderer/renderededge'); +var RenderedSegment = require('../renderer/renderedsegment'); + +var Graph = require('../graph'); + +var Polyline = require('../util/polyline.js'); +var SphericalMercator = require('../util/spherical-mercator'); +var sm = new SphericalMercator(); + +/** + * Expose `Network` + */ + +module.exports = Network; + +/** + * + */ + +function Network(transitive, data) { + this.transitive = transitive; + + this.routes = {}; + this.stops = {}; + this.patterns = {}; + this.places = {}; + this.journeys = {}; + this.paths = []; + this.baseVertexPoints = []; + this.graph = new Graph(this, []); + + if (data) this.load(data); +} + +/** + * Mixin `Emitter` + */ + +Emitter(Network.prototype); + +/** + * Load + * + * @param {Object} data + */ + +Network.prototype.load = function (data) { + debug('loading', data); + var self = this; + + // check data + if (!data) data = {}; + + // Store data + this.data = data; + + // A list of points (stops & places) that will always become vertices in the network + // graph (regardless of zoom scale). This includes all points that serve as a segment + // endpoint and/or a convergence/divergence point between segments + this.baseVertexPoints = []; + + // object maps stop ids to arrays of unique stop_ids reachable from that stop + this.adjacentStops = {}; + + // maps lat_lon key to unique TurnPoint object + this.turnPoints = {}; + + // Copy/decode the streetEdge objects + this.streetEdges = {}; + each(data.streetEdges, function (data) { + var latLons = Polyline.decode(data.geometry.points); + var coords = []; + each(latLons, function (latLon) { + coords.push(sm.forward([latLon[1], latLon[0]])); + }); + this.streetEdges[data.edge_id] = { + latLons: latLons, + worldCoords: coords, + length: data.geometry.length + }; + }, this); + + // Generate the route objects + this.routes = {}; + each(data.routes, function (data) { + this.routes[data.route_id] = new Route(data); + }, this); + + // Generate the stop objects + this.stops = {}; + each(data.stops, function (data) { + this.stops[data.stop_id] = new Stop(data); + }, this); + + // Generate the pattern objects + this.patterns = {}; + each(data.patterns, function (data) { + var pattern = new RoutePattern(data, this); + this.patterns[data.pattern_id] = pattern; + var route = this.routes[data.route_id]; + if (route) { + route.addPattern(pattern); + pattern.route = route; + } else { + debug('Error: pattern ' + data.pattern_id + ' refers to route that was not found: ' + data.route_id); + } + if (pattern.render) this.paths.push(pattern.createPath()); + }, this); + + // Generate the place objects + this.places = {}; + each(data.places, function (data) { + var place = this.places[data.place_id] = new Place(data, this); + this.addVertexPoint(place); + }, this); + + // Generate the internal Journey objects + this.journeys = {}; + each(data.journeys, function (journeyData) { + var journey = new Journey(journeyData, this); + this.journeys[journeyData.journey_id] = journey; + this.paths.push(journey.path); + }, this); + + // process the path segments + for (var p = 0; p < this.paths.length; p++) { + var path = this.paths[p]; + for (var s = 0; s < path.segments.length; s++) { + this.processSegment(path.segments[s]); + } + } + + // when rendering pattern paths only, determine convergence/divergence vertex + // stops by looking for stops w/ >2 adjacent stops + if (!data.journeys || data.journeys.length === 0) { + for (var stopId in this.adjacentStops) { + if (this.adjacentStops[stopId].length > 2) { + this.addVertexPoint(this.stops[stopId]); + } + } + } + + // determine which TurnPoints should be base vertices + var turnLookup = {}; + var addTurn = function addTurn(turn1, turn2) { + if (!(turn1.getId() in turnLookup)) turnLookup[turn1.getId()] = []; + if (turnLookup[turn1.getId()].indexOf(turn2) === -1) turnLookup[turn1.getId()].push(turn2); + }; + each(this.streetEdges, function (streetEdgeId) { + var streetEdge = self.streetEdges[streetEdgeId]; + if (streetEdge.fromTurnPoint && streetEdge.toTurnPoint) { + addTurn(streetEdge.toTurnPoint, streetEdge.fromTurnPoint); + addTurn(streetEdge.fromTurnPoint, streetEdge.toTurnPoint); + } + }); + each(turnLookup, function (turnPointId) { + var count = turnLookup[turnPointId].length; + if (count > 2) self.addVertexPoint(self.turnPoints[turnPointId]); + }); + + this.createGraph(); + + this.loaded = true; + this.emit('load', this); + return this; +}; + +/** Graph Creation/Processing Methods **/ + +Network.prototype.clearGraphData = function () { + each(this.paths, function (path) { + path.clearGraphData(); + }); +}; + +Network.prototype.createGraph = function () { + this.applyZoomFactors(this.transitive.display.activeZoomFactors); + + // clear previous graph-specific data + if (this.pointClusterMap) this.pointClusterMap.clearMultiPoints(); + each(this.stops, function (stopId) { + this.stops[stopId].setFocused(true); + }, this); + + // create the list of vertex points + var vertexPoints; + if (this.mergeVertexThreshold && this.mergeVertexThreshold > 0) { + this.pointClusterMap = new PointClusterMap(this, this.mergeVertexThreshold); + vertexPoints = this.pointClusterMap.getVertexPoints(this.baseVertexPoints); + } else vertexPoints = this.baseVertexPoints; + + // core graph creation steps + this.graph = new Graph(this, vertexPoints); + this.populateGraphEdges(); + this.graph.pruneVertices(); + this.createInternalVertexPoints(); + if (this.isSnapping()) this.graph.snapToGrid(this.gridCellSize); + this.graph.sortVertices(); + + // other post-processing actions + this.annotateTransitPoints(); + // this.initPlaceAdjacency(); + this.createRenderedSegments(); + this.transitive.labeler.updateLabelList(this.graph); + this.updateGeometry(true); +}; + +Network.prototype.isSnapping = function () { + return this.gridCellSize && this.gridCellSize !== 0; +}; + +/* + * identify and populate the 'internal' vertex points, which is zoom-level specfic + */ + +Network.prototype.createInternalVertexPoints = function () { + this.internalVertexPoints = []; + + for (var i in this.graph.edgeGroups) { + var edgeGroup = this.graph.edgeGroups[i]; + + var wlen = edgeGroup.getWorldLength(); + + var splitPoints = []; + + // compute the maximum number of internal points for this edge to add as graph vertices + if (edgeGroup.hasTransit()) { + var vertexFactor = this.internalVertexFactor; //! edgeGroup.hasTransit() ? 1 : this.internalVertexFactor; + var newVertexCount = Math.floor(wlen / vertexFactor); + + // get the priority queue of the edge's internal points + var pq = edgeGroup.getInternalVertexPQ(); + + // pull the 'best' points from the queue until we reach the maximum + while (splitPoints.length < newVertexCount && pq.size() > 0) { + var el = pq.deq(); + splitPoints.push(el.point); + } + } + + // perform the split operation (if needed) + if (splitPoints.length > 0) { + for (var e = 0; e < edgeGroup.edges.length; e++) { + var edge = edgeGroup.edges[e]; + this.graph.splitEdgeAtInternalPoints(edge, splitPoints); + } + } + } +}; + +Network.prototype.updateGeometry = function () { + // clear the stop render data + // for (var key in this.stops) this.stops[key].renderData = []; + + this.graph.vertices.forEach(function (vertex) { + // vertex.snapped = false; + vertex.point.clearRenderData(); + }); + + // refresh the edge-based points + this.graph.edges.forEach(function (edge) { + edge.pointArray.forEach(function (point) { + point.clearRenderData(); + }); + }); + + this.renderedEdges.forEach(function (rEdge) { + rEdge.clearOffsets(); + }); + + // if (snapGrid) + // if(this.gridCellSize && this.gridCellSize !== 0) this.graph.snapToGrid(this.gridCellSize); + + // this.fixPointOverlaps(); + + this.graph.calculateGeometry(this.gridCellSize, this.angleConstraint); + + this.graph.apply2DOffsets(this); +}; + +Network.prototype.applyZoomFactors = function (factors) { + this.gridCellSize = factors.gridCellSize; + this.internalVertexFactor = factors.internalVertexFactor; + this.angleConstraint = factors.angleConstraint; + this.mergeVertexThreshold = factors.mergeVertexThreshold; +}; + +/** + * + */ + +Network.prototype.processSegment = function (segment) { + // iterate through this pattern's stops, associating stops/patterns with + // each other and initializing the adjacentStops table + var previousStop = null; + for (var i = 0; i < segment.points.length; i++) { + var point = segment.points[i]; + point.used = true; + + // called for each pair of adjacent stops in sequence + if (previousStop && point.getType() === 'STOP') { + this.addStopAdjacency(point.getId(), previousStop.getId()); + this.addStopAdjacency(previousStop.getId(), point.getId()); + } + + previousStop = point.getType() === 'STOP' ? point : null; + + // add the start and end points to the vertexStops collection + var startPoint = segment.points[0]; + this.addVertexPoint(startPoint); + startPoint.isSegmentEndPoint = true; + + var endPoint = segment.points[segment.points.length - 1]; + this.addVertexPoint(endPoint); + endPoint.isSegmentEndPoint = true; + } +}; + +/** + * Helper function for stopAjacency table + * + * @param {Stop} adjacent stops list + * @param {Stop} stopA + * @param {Stop} stopB + */ + +Network.prototype.addStopAdjacency = function (stopIdA, stopIdB) { + if (!this.adjacentStops[stopIdA]) this.adjacentStops[stopIdA] = []; + if (this.adjacentStops[stopIdA].indexOf(stopIdB) === -1) this.adjacentStops[stopIdA].push(stopIdB); +}; + +/** + * Populate the graph edges + */ + +Network.prototype.populateGraphEdges = function () { + // vertex associated with the last vertex point we passed in this sequence + var lastVertex = null; + + // collection of 'internal' (i.e. non-vertex) points passed + // since the last vertex point + var internalPoints = []; + + each(this.paths, function (path) { + each(path.segments, function (segment) { + lastVertex = null; + + var streetEdgeIndex = 0; + + // for transit segments, see if there is a pattern with inter-stop geometry defined + var representativePattern = null; + if (segment.type === 'TRANSIT') { + for (var i = 0; i < segment.patternGroup.patterns.length; i++) { + var pattern = segment.patternGroup.patterns[i]; + if (pattern.interStopGeometry && pattern.interStopGeometry.length === pattern.stops.length - 1) { + representativePattern = pattern; + break; + } + } + } + + /** + * geomCoords: The geographic coordinates for the graph edge currently + * being constructed, used when rendering edges in "real-world" (i.e. + * non-schematic) mode. geomCoords data is only initialized here for + * street-based segments, using the segment's embedded street geometry + * data (if provided). + */ + var geomCoords = []; + + /** + * pointGeom: An array of point-specific geometry (i.e. the alignment + * connecting this point to the following point in the containing + * segment's point sequence. Currently applies to transit segments only. + * pointGeom data is converted to geomCoords for rendering in the + * splitEdgeAtInternalPoints method of NetworkGraph + */ + var pointGeom = []; + + each(segment.points, function (point, index) { + if (segment.streetEdges) { + // street-based segment with street-edge geometry + for (var i = streetEdgeIndex; i < segment.streetEdges.length; i++) { + if (index === 0) break; + + geomCoords = geomCoords.concat(geomCoords.length > 0 ? segment.streetEdges[i].worldCoords.slice(1) : segment.streetEdges[i].worldCoords); + if (segment.streetEdges[i].toTurnPoint === point) { + streetEdgeIndex = i + 1; + break; + } + } + } else if (representativePattern) { + // transit-based segment with known geometry + var fromIndex = segment.patternGroup.getFromIndex(representativePattern); + + // ignore the first stop, since the geometry at this index represents + // the alignment leading into that stop + if (index > 0) { + // add the alignment extending from this stop to the pointGeom array + var geom = representativePattern.interStopGeometry[fromIndex + index - 1]; + pointGeom.push(geom); + } + } + + if (point.multipoint) point = point.multipoint; + + if (point.graphVertex) { + // this is a vertex point + if (lastVertex !== null) { + if (lastVertex.point === point) return; + + // see if an equivalent graph edge already exists + var fromVertex = lastVertex; + var toVertex = point.graphVertex; + var edge = this.graph.getEquivalentEdge(internalPoints, fromVertex, toVertex); + + // create a new graph edge if necessary + if (!edge) { + edge = this.graph.addEdge(internalPoints, fromVertex, toVertex, segment.getType()); + if (geomCoords && geomCoords.length > 0) edge.geomCoords = geomCoords; + if (pointGeom && pointGeom.length > 0) edge.pointGeom = pointGeom; + } + + // associate the graph edge and path segment with each other + segment.addEdge(edge, fromVertex); + edge.addPathSegment(segment); + + // reset the geomCoords and pointGeom arrays for the next edge + geomCoords = []; + pointGeom = []; + } + + lastVertex = point.graphVertex; + internalPoints = []; + } else { + // this is an internal point + internalPoints.push(point); + } + }, this); + // } + }, this); + }, this); +}; + +Network.prototype.createGraphEdge = function (segment, fromVertex, toVertex, internalPoints, geomCoords) { + var edge = this.graph.getEquivalentEdge(internalPoints, fromVertex, toVertex); + + if (!edge) { + edge = this.graph.addEdge(internalPoints, fromVertex, toVertex, segment.getType()); + + // calculate the angle and apply to edge stops + /* var dx = fromVertex.x - toVertex.x; + var dy = fromVertex.y - toVertex.y; + var angle = Math.atan2(dy, dx) * 180 / Math.PI; + point.angle = lastVertex.point.angle = angle; + for (var is = 0; is < internalPoints.length; is++) { + internalPoints[is].angle = angle; + } */ + + if (geomCoords) edge.geomCoords = geomCoords; + + debug('--- created edge ' + edge.toString()); + debug(edge); + each(edge.geomCoords, function (c) { + debug(c); + }); + } + + segment.addEdge(edge, fromVertex); + edge.addPathSegment(segment); +}; + +Network.prototype.annotateTransitPoints = function () { + this.paths.forEach(function (path) { + var transitSegments = []; + path.segments.forEach(function (pathSegment) { + if (pathSegment.type === 'TRANSIT') transitSegments.push(pathSegment); + }); + + path.segments.forEach(function (pathSegment) { + if (pathSegment.type === 'TRANSIT') { + // if first transit segment in path, mark 'from' endpoint as board point + if (transitSegments.indexOf(pathSegment) === 0) { + pathSegment.points[0].isBoardPoint = true; + + // if there are additional transit segments, mark the 'to' endpoint as a transfer point + if (transitSegments.length > 1) pathSegment.points[pathSegment.points.length - 1].isTransferPoint = true; + + // if last transit segment in path, mark 'to' endpoint as alight point + } else if (transitSegments.indexOf(pathSegment) === transitSegments.length - 1) { + pathSegment.points[pathSegment.points.length - 1].isAlightPoint = true; + + // if there are additional transit segments, mark the 'from' endpoint as a transfer point + if (transitSegments.length > 1) pathSegment.points[0].isTransferPoint = true; + + // if this is an 'internal' transit segment, mark both endpoints as transfer points + } else if (transitSegments.length > 2) { + pathSegment.points[0].isTransferPoint = true; + pathSegment.points[pathSegment.points.length - 1].isTransferPoint = true; + } + } + }); + }); +}; + +Network.prototype.initPlaceAdjacency = function () { + each(this.places, function (placeId) { + var place = this.places[placeId]; + if (!place.graphVertex) return; + each(place.graphVertex.incidentEdges(), function (edge) { + var oppVertex = edge.oppositeVertex(place.graphVertex); + if (oppVertex.point) { + oppVertex.point.adjacentPlace = place; + } + }); + }, this); +}; + +Network.prototype.createRenderedSegments = function () { + this.reLookup = {}; + this.renderedEdges = []; + this.renderedSegments = []; + + for (var patternId in this.patterns) { + this.patterns[patternId].renderedEdges = []; + } + + each(this.paths, function (path) { + each(path.segments, function (pathSegment) { + pathSegment.renderedSegments = []; + + if (pathSegment.type === 'TRANSIT') { + // create a RenderedSegment for each pattern, except for buses which are collapsed to a single segment + var busPatterns = []; + each(pathSegment.getPatterns(), function (pattern) { + if (pattern.route.route_type === 3) busPatterns.push(pattern);else this.createRenderedSegment(pathSegment, [pattern]); + }, this); + if (busPatterns.length > 0) { + this.createRenderedSegment(pathSegment, busPatterns); + } + } else { + // non-transit segments + this.createRenderedSegment(pathSegment); + } + }, this); + }, this); + + this.renderedEdges.sort(function (a, b) { + // process render transit segments before walk + if (a.getType() === 'WALK') return 1; + if (b.getType() === 'WALK') return -1; + }); +}; + +Network.prototype.createRenderedSegment = function (pathSegment, patterns) { + var rSegment = new RenderedSegment(pathSegment); + + each(pathSegment.edges, function (edge) { + var rEdge = this.createRenderedEdge(pathSegment, edge.graphEdge, edge.forward, patterns); + rSegment.addRenderedEdge(rEdge); + }, this); + if (patterns) { + rSegment.patterns = patterns; + rSegment.mode = patterns[0].route.route_type; + } + + pathSegment.addRenderedSegment(rSegment); +}; + +Network.prototype.createRenderedEdge = function (pathSegment, gEdge, forward, patterns) { + var rEdge; + + // construct the edge key, disregarding mode qualifiers (e.g. "_RENT") + var type = pathSegment.getType().split('_')[0]; + var key = gEdge.id + (forward ? 'F' : 'R') + '_' + type; + + // for non-bus transit edges, append an exemplar pattern ID to the key + if (patterns && patterns[0].route.route_type !== 3) { + key += '_' + patterns[0].getId(); + } + + // see if this r-edge already exists + if (key in this.reLookup) { + rEdge = this.reLookup[key]; + } else { + // if not, create it + rEdge = new RenderedEdge(gEdge, forward, type); + if (patterns) { + each(patterns, function (pattern) { + pattern.addRenderedEdge(rEdge); + rEdge.addPattern(pattern); + }); + rEdge.mode = patterns[0].route.route_type; + } + rEdge.points.push(gEdge.fromVertex.point); + rEdge.points.push(gEdge.toVertex.point); + gEdge.addRenderedEdge(rEdge); + rEdge.addPathSegment(pathSegment); + + this.renderedEdges.push(rEdge); + this.reLookup[key] = rEdge; + } + return rEdge; +}; + +Network.prototype.addVertexPoint = function (point) { + if (this.baseVertexPoints.indexOf(point) !== -1) return; + this.baseVertexPoints.push(point); +}; + +},{"../graph":16,"../point/place":25,"../point/pointclustermap":27,"../point/stop":28,"../renderer/renderededge":32,"../renderer/renderedsegment":33,"../util/polyline.js":40,"../util/spherical-mercator":41,"./journey":2,"./pattern":6,"./route":8,"component-each":84,"component-emitter":85,"debug":90}],4:[function(require,module,exports){ +'use strict'; + +var d3 = require('d3'); + +var interpolateLine = require('../util/interpolate-line'); + +/** + * Expose `NetworkPath` + */ + +module.exports = NetworkPath; + +/** + * NetworkPath -- a path through the network graph. Composed of PathSegments (which + * are in turn composed of a sequence of graph edges) + * + * @param {Object} the parent onject (a RoutePattern or Journey) + */ + +function NetworkPath(parent) { + this.parent = parent; + this.segments = []; +} + +NetworkPath.prototype.clearGraphData = function (segment) { + this.segments.forEach(function (segment) { + segment.clearGraphData(); + }); +}; + +/** + * addSegment: add a new segment to the end of this NetworkPath + */ + +NetworkPath.prototype.addSegment = function (segment) { + this.segments.push(segment); + segment.points.forEach(function (point) { + point.paths.push(this); + }, this); +}; + +/** highlight **/ + +NetworkPath.prototype.drawHighlight = function (display, capExtension) { + this.line = d3.svg.line() // the line translation function + .x(function (pointInfo, i) { + return display.xScale(pointInfo.x) + (pointInfo.offsetX || 0); + }).y(function (pointInfo, i) { + return display.yScale(pointInfo.y) - (pointInfo.offsetY || 0); + }).interpolate(interpolateLine.bind(this)); + + this.lineGraph = display.svg.append('path').attr('id', 'transitive-path-highlight-' + this.parent.getElementId()).attr('class', 'transitive-path-highlight').style('stroke-width', 24).style('stroke', '#ff4').style('fill', 'none').style('visibility', 'hidden').data([this]); +}; + +NetworkPath.prototype.getRenderedSegments = function () { + var renderedSegments = []; + this.segments.forEach(function (pathSegment) { + renderedSegments = renderedSegments.concat(pathSegment.renderedSegments); + }); + return renderedSegments; +}; + +/** + * getPointArray + */ + +NetworkPath.prototype.getPointArray = function () { + var points = []; + for (var i = 0; i < this.segments.length; i++) { + var segment = this.segments[i]; + if (i > 0 && segment.points[0] === this.segments[i - 1].points[this.segments[i - 1].points.length - 1]) { + points.concat(segment.points.slice(1)); + } else { + points.concat(segment.points); + } + } + return points; +}; + +},{"../util/interpolate-line":39,"d3":88}],5:[function(require,module,exports){ +'use strict'; + +/** + * Dependencies + */ + +var each = require('component-each'); + +var PatternGroup = require('./patterngroup'); +var LabelEdgeGroup = require('../labeler/labeledgegroup.js'); + +var segmentId = 0; + +/** + * Expose `PathSegment` + */ + +module.exports = PathSegment; + +/** + * + */ + +function PathSegment(type, path) { + this.id = segmentId++; + this.type = type; + this.path = path; + this.points = []; + this.edges = []; + this.renderedSegments = []; + this.patternGroup = new PatternGroup(); +} + +PathSegment.prototype.clearGraphData = function () { + this.edges = []; + this.points.forEach(function (point) { + point.graphVertex = null; + }); + this.renderLength = null; +}; + +PathSegment.prototype.getId = function () { + return this.id; +}; + +PathSegment.prototype.getType = function () { + return this.type; +}; + +PathSegment.prototype.addRenderedSegment = function (rSegment) { + this.renderedSegments.push(rSegment); +}; + +PathSegment.prototype.addEdge = function (graphEdge, originVertex) { + this.edges.push({ + graphEdge: graphEdge, + forward: originVertex === graphEdge.fromVertex + }); +}; + +PathSegment.prototype.insertEdgeAt = function (index, graphEdge, originVertex) { + var edgeInfo = { + graphEdge: graphEdge, + forward: originVertex === graphEdge.fromVertex + }; + this.edges.splice(index, 0, edgeInfo); +}; + +PathSegment.prototype.removeEdge = function (graphEdge) { + var index = null; + for (var i = 0; i < this.edges.length; i++) { + if (this.edges[i].graphEdge === graphEdge) { + index = i; + break; + } + } + if (index !== null) this.edges.splice(index, 1); +}; + +PathSegment.prototype.getEdgeIndex = function (graphEdge) { + for (var i = 0; i < this.edges.length; i++) { + if (this.edges[i].graphEdge === graphEdge) return i; + } + return -1; +}; + +/** + * Get graph vertices + */ + +PathSegment.prototype.getGraphVertices = function () { + var vertices = []; + this.edges.forEach(function (edge, i) { + if (i === 0) { + vertices.push(edge.graphEdge.fromVertex); + } + vertices.push(edge.graphEdge.toVertex); + }); + return vertices; +}; + +PathSegment.prototype.vertexArray = function () { + var vertex = this.startVertex(); + var array = [vertex]; + + this.edges.forEach(function (edgeInfo) { + vertex = edgeInfo.graphEdge.oppositeVertex(vertex); + array.push(vertex); + }); + + return array; +}; + +PathSegment.prototype.startVertex = function () { + if (this.points[0].multipoint) return this.points[0].multipoint.graphVertex; + if (!this.edges || this.edges.length === 0) return null; + + var firstGraphEdge = this.edges[0].graphEdge; + return this.edges[0].forward ? firstGraphEdge.fromVertex : firstGraphEdge.toVertex; + + /* if (this.graphEdges.length === 1) return this.graphEdges[0].fromVertex; + var first = this.graphEdges[0], + next = this.graphEdges[1]; + if (first.toVertex == next.toVertex || first.toVertex == next.fromVertex) + return first.fromVertex; + if (first.fromVertex == next.toVertex || first.fromVertex == next.fromVertex) + return first.toVertex; + return null; */ +}; + +PathSegment.prototype.endVertex = function () { + if (this.points[this.points.length - 1].multipoint) return this.points[this.points.length - 1].multipoint.graphVertex; + if (!this.edges || this.edges.length === 0) return null; + + var lastGraphEdge = this.edges[this.edges.length - 1].graphEdge; + return this.edges[this.edges.length - 1].forward ? lastGraphEdge.toVertex : lastGraphEdge.fromVertex; + + /* if (this.graphEdges.length === 1) return this.graphEdges[0].toVertex; + var last = this.graphEdges[this.graphEdges.length - 1], + prev = this.graphEdges[this.graphEdges.length - 2]; + if (last.toVertex == prev.toVertex || last.toVertex == prev.fromVertex) + return last.fromVertex; + if (last.fromVertex == prev.toVertex || last.fromVertex == prev.fromVertex) + return last.toVertex; + return null; */ +}; + +PathSegment.prototype.addPattern = function (pattern, fromIndex, toIndex) { + // Initialize this segment's 'points' array to include the stops in the + // provided pattern between the specified from and to indices, inclusive. + // Only do this if the points array is empty or if the the length of the + // segment being added exceeds that of the one currently stored. + if (toIndex - fromIndex + 1 > this.points.length) { + this.points = []; + var lastStop = null; + for (var i = fromIndex; i <= toIndex; i++) { + var stop = pattern.stops[i]; + if (lastStop !== stop) { + this.points.push(stop); + } + lastStop = stop; + } + } + + // Add the pattern to this segment's PatternGroup + this.patternGroup.addPattern(pattern, fromIndex, toIndex); +}; + +PathSegment.prototype.getPattern = function () { + return this.patternGroup.patterns[0]; +}; + +PathSegment.prototype.getPatterns = function () { + return this.patternGroup.patterns; +}; + +PathSegment.prototype.getMode = function () { + return this.patternGroup.patterns[0].route.route_type; +}; + +PathSegment.prototype.toString = function () { + var startVertex = this.startVertex(); + var endVertex = this.endVertex(); + return 'PathSegment id=' + this.id + ' type=' + this.type + ' from ' + (startVertex ? startVertex.toString() : '(unknown)') + ' to ' + (endVertex ? endVertex.toString() : '(unknown)'); +}; + +PathSegment.prototype.getLabelEdgeGroups = function () { + var edgeGroups = []; + each(this.renderedSegments, function (rSegment) { + if (!rSegment.isFocused()) return; + var currentGroup = new LabelEdgeGroup(rSegment); + each(rSegment.renderedEdges, function (rEdge) { + currentGroup.addEdge(rEdge); + if (rEdge.graphEdge.toVertex.point.containsSegmentEndPoint()) { + edgeGroups.push(currentGroup); + currentGroup = new LabelEdgeGroup(rSegment); + } + }, this); + }, this); + + return edgeGroups; +}; + +},{"../labeler/labeledgegroup.js":20,"./patterngroup":7,"component-each":84}],6:[function(require,module,exports){ +'use strict'; + +var each = require('component-each'); + +var NetworkPath = require('./path'); +var PathSegment = require('./pathsegment'); + +var Polyline = require('../util/polyline.js'); +var SphericalMercator = require('../util/spherical-mercator'); +var sm = new SphericalMercator(); + +/** + * Expose `RoutePattern` + */ + +module.exports = RoutePattern; + +/** + * A RoutePattern + * + * @param {Object} RoutePattern data object from the transitive.js input + */ + +function RoutePattern(data, transitive) { + for (var key in data) { + if (key === 'stops') continue; + this[key] = data[key]; + } + + // the array of Stops that make up this pattern + this.stops = []; + + // the inter-stop geometry, an array of point sequences (themselves arrays) + // that represent the geometry beween stops i and i+1. This array should be + // exactly one item shorter than the stops array. + this.interStopGeometry = []; + + if (transitive) { + each(data.stops, function (stop) { + // look up the Stop in the master collection and add to the stops array + this.stops.push(transitive.stops[stop.stop_id]); + + // if inter-stop geometry is provided: decode polyline, convert points + // to SphericalMercator, and add to the interStopGeometry array + if (stop.geometry) { + var latLons = Polyline.decode(stop.geometry); + var coords = []; + each(latLons, function (latLon) { + coords.push(sm.forward([latLon[1], latLon[0]])); + }); + this.interStopGeometry.push(coords); + } + }, this); + } + + this.renderedEdges = []; +} + +RoutePattern.prototype.getId = function () { + return this.pattern_id; +}; + +RoutePattern.prototype.getElementId = function () { + return 'pattern-' + this.pattern_id; +}; + +RoutePattern.prototype.getName = function () { + return this.pattern_name; +}; + +RoutePattern.prototype.addRenderedEdge = function (rEdge) { + if (this.renderedEdges.indexOf(rEdge) === -1) this.renderedEdges.push(rEdge); +}; + +RoutePattern.prototype.offsetAlignment = function (alignmentId, offset) { + each(this.renderedEdges, function (rEdge) { + rEdge.offsetAlignment(alignmentId, offset); + }); +}; + +RoutePattern.prototype.createPath = function () { + var path = new NetworkPath(this); + var pathSegment = new PathSegment('TRANSIT', path); + pathSegment.addPattern(this, 0, this.stops.length - 1); + path.addSegment(pathSegment); + return path; +}; + +},{"../util/polyline.js":40,"../util/spherical-mercator":41,"./path":4,"./pathsegment":5,"component-each":84}],7:[function(require,module,exports){ +"use strict"; + +/** + * Expose `PatternGroup` + */ + +module.exports = PatternGroup; + +/** + * PatternGroup -- a collection of one or more RoutePatterns associated with + * a PathSegment + * + * @param {Object} RoutePattern data object from the transitive.js input + */ + +function PatternGroup() { + this.patterns = []; + + // lookup tables mapping pattern IDs to their from/to indices in the containing PathSegment + this.fromIndexLookup = {}; + this.toIndexLookup = {}; +} + +PatternGroup.prototype.addPattern = function (pattern, fromIndex, toIndex) { + if (this.patterns.indexOf(pattern) === -1) { + this.patterns.push(pattern); + this.fromIndexLookup[pattern.pattern_id] = fromIndex; + this.toIndexLookup[pattern.pattern_id] = toIndex; + } +}; + +PatternGroup.prototype.getFromIndex = function (pattern) { + return this.fromIndexLookup[pattern.pattern_id]; +}; + +PatternGroup.prototype.getToIndex = function (pattern) { + return this.toIndexLookup[pattern.pattern_id]; +}; + +},{}],8:[function(require,module,exports){ +'use strict'; + +/** + * Expose `Route` + */ + +module.exports = Route; + +/** + * A transit Route, as defined in the input data. + * Routes contain one or more Patterns. + * + * @param {Object} + */ + +function Route(data) { + for (var key in data) { + if (key === 'patterns') continue; + this[key] = data[key]; + } + + this.patterns = []; +} + +/** + * Add Pattern + * + * @param {Pattern} + */ + +Route.prototype.addPattern = function (pattern) { + this.patterns.push(pattern); + pattern.route = this; +}; + +Route.prototype.getColor = function () { + if (this.route_color) { + if (this.route_color.charAt(0) === '#') return this.route_color; + return '#' + this.route_color; + } + + // assign a random shade of gray + /* var c = 128 + Math.floor(64 * Math.random()); + var hex = c.toString(16); + hex = (hex.length === 1) ? '0' + hex : hex; + this.route_color = '#' + hex + hex + hex; + return this.route_color; */ +}; + +},{}],9:[function(require,module,exports){ +'use strict'; + +var d3 = require('d3'); + +module.exports = function () { + var size = [960, 500]; + var scale = 256; + var translate = [size[0] / 2, size[1] / 2]; + var zoomDelta = 0; + + function tile() { + var z = Math.max(Math.log(scale) / Math.LN2 - 8, 0); + var z0 = Math.round(z + zoomDelta); + var k = Math.pow(2, z - z0 + 8); + var origin = [(translate[0] - scale / 2) / k, (translate[1] - scale / 2) / k]; + var tiles = []; + var cols = d3.range(Math.max(0, Math.floor(-origin[0])), Math.max(0, Math.ceil(size[0] / k - origin[0]))); + var rows = d3.range(Math.max(0, Math.floor(-origin[1])), Math.max(0, Math.ceil(size[1] / k - origin[1]))); + + rows.forEach(function (y) { + cols.forEach(function (x) { + tiles.push([x, y, z0]); + }); + }); + + tiles.translate = origin; + tiles.scale = k; + + return tiles; + } + + tile.size = function (_) { + if (!arguments.length) return size; + size = _; + return tile; + }; + + tile.scale = function (_) { + if (!arguments.length) return scale; + scale = _; + return tile; + }; + + tile.translate = function (_) { + if (!arguments.length) return translate; + translate = _; + return tile; + }; + + tile.zoomDelta = function (_) { + if (!arguments.length) return zoomDelta; + zoomDelta = +_; + return tile; + }; + + return tile; +}; + +},{"d3":88}],10:[function(require,module,exports){ +'use strict'; + +/** + * Draw the snapping grid + * + * @param {Display} display object + * @param {Number} cell size + */ + +module.exports = function drawGrid(display, cellSize) { + var svg = display.svg; + var xScale = display.xScale; + var yScale = display.yScale; + + // Remove all current gridlines + svg.selectAll('.gridline').remove(); + + // Add a grid group "behind" everything else + var grid = svg.insert('g', ':first-child'); + + var xRange = xScale.range(); + var yRange = yScale.range(); + var xDomain = xScale.domain(); + var yDomain = yScale.domain(); + + var xMin = Math.round(xDomain[0] / cellSize) * cellSize; + var xMax = Math.round(xDomain[1] / cellSize) * cellSize; + for (var x = xMin; x <= xMax; x += cellSize) { + appendLine(xScale(x), xScale(x), yRange[0], yRange[1]); + }var yMin = Math.round(yDomain[0] / cellSize) * cellSize; + var yMax = Math.round(yDomain[1] / cellSize) * cellSize; + for (var y = yMin; y <= yMax; y += cellSize) { + appendLine(xRange[0], xRange[1], yScale(y), yScale(y)); + }function appendLine(x1, x2, y1, y2) { + grid.append('line').attr({ + 'class': 'gridline', + 'x1': x1, + 'x2': x2, + 'y1': y1, + 'y2': y2 + }); + } +}; + +},{}],11:[function(require,module,exports){ +'use strict'; + +var d3 = require('d3'); +var debug = require('debug')('transitive:display'); + +var Legend = require('./legend'); +var TileLayer = require('./tile-layer'); + +var SphericalMercator = require('../util/spherical-mercator'); +var sm = new SphericalMercator(); + +/** + * Expose `Display` + */ + +module.exports = Display; + +/** + * The D3-based SVG display. + * + * @param {Object} options + */ + +function Display(transitive) { + this.transitive = transitive; + var el = this.el = transitive.el; + this.width = el.clientWidth; + this.height = el.clientHeight; + + // Set up the pan/zoom behavior + var zoom = this.zoom = d3.behavior.zoom().scaleExtent([0.25, 4]); + + var self = this; + + var zoomBehavior = function zoomBehavior() { + self.computeScale(); + if (self.scale !== self.lastScale) { + // zoom action + self.zoomChanged(); + } else { + // pan action + setTimeout(transitive.refresh.bind(transitive, true), 0); + } + + var llb = self.llBounds(); + debug('ll bounds: ' + llb[0][0] + ',' + llb[0][1] + ' to ' + llb[1][0] + ',' + llb[1][1]); + }; + + this.zoom.on('zoom.transitive', zoomBehavior); + + this.zoomFactors = transitive.options.zoomFactors || this.getDefaultZoomFactors(); + + // set up the svg display + var div = d3.select(el).attr('class', 'Transitive'); + + if (transitive.options.zoomEnabled) { + div.call(zoom); + } + + this.svg = div.append('svg').attr('class', 'schematic-map'); + + // initialize the x/y scale objects + this.xScale = d3.scale.linear(); + this.yScale = d3.scale.linear(); + + // set up the resize event handler + if (transitive.options.autoResize) { + d3.select(window).on('resize.display', function () { + self.resized(); + transitive.refresh(); + }); + } + + // set the scale + var bounds; + if (transitive.options.initialBounds) { + bounds = [sm.forward(transitive.options.initialBounds[0]), sm.forward(transitive.options.initialBounds[1])]; + } else if (transitive.network && transitive.network.graph) { + bounds = transitive.network.graph.bounds(); + } + + if (bounds) { + this.setScale(bounds, transitive.options); + this.updateActiveZoomFactors(this.scale); + this.lastScale = this.scale; + } else { + this.updateActiveZoomFactors(1); + } + + // set up the map layer + if (transitive.options.mapboxId) { + this.tileLayer = new TileLayer({ + el: this.el, + display: this, + graph: transitive.graph, + mapboxId: transitive.options.mapboxId + }); + } + + // set up the legend + if (transitive.options.legendEl) { + this.legend = new Legend(transitive.options.legendEl, this, transitive); + } + + transitive.emit('initialize display', transitive, this); + return this; +} + +/** + * zoomChanged -- called when the zoom level changes, either by through the native + * zoom support or the setBounds() API call. Updates zoom factors as needed and + * performs appropriate update action (render or refresh) + */ + +Display.prototype.zoomChanged = function () { + if (this.updateActiveZoomFactors(this.scale)) { + this.transitive.network = null; + this.transitive.render(); + } else this.transitive.refresh(); + this.lastScale = this.scale; +}; + +Display.prototype.updateActiveZoomFactors = function (scale) { + var updated = false; + for (var i = 0; i < this.zoomFactors.length; i++) { + var min = this.zoomFactors[i].minScale; + var max = i < this.zoomFactors.length - 1 ? this.zoomFactors[i + 1].minScale : Number.MAX_VALUE; + + // check if we've crossed into a new zoomFactor partition + if ((!this.lastScale || this.lastScale < min || this.lastScale >= max) && scale >= min && scale < max) { + this.activeZoomFactors = this.zoomFactors[i]; + updated = true; + } + } + return updated; +}; + +/** + * Return default zoom factors + */ + +Display.prototype.getDefaultZoomFactors = function (data) { + return [{ + minScale: 0, + gridCellSize: 25, + internalVertexFactor: 1000000, + angleConstraint: 45, + mergeVertexThreshold: 200 + }, { + minScale: 1.5, + gridCellSize: 0, + internalVertexFactor: 0, + angleConstraint: 5, + mergeVertexThreshold: 0 + }]; +}; + +/** + * Empty the display + */ + +Display.prototype.empty = function () { + debug('emptying svg'); + this.svg.selectAll('*').remove(); + + this.haloLayer = this.svg.insert('g', ':first-child'); +}; + +/** + * Set the scale + */ + +Display.prototype.setScale = function (bounds, options) { + this.height = this.el.clientHeight; + this.width = this.el.clientWidth; + + var domains = getDomains(this, this.height, this.width, bounds, options); + this.xScale.domain(domains[0]); + this.yScale.domain(domains[1]); + + this.xScale.range([0, this.width]); + this.yScale.range([this.height, 0]); + + debug('x scale %j -> %j', this.xScale.domain(), this.xScale.range()); + debug('y scale %j -> %j', this.yScale.domain(), this.yScale.range()); + + this.zoom.x(this.xScale).y(this.yScale); + + this.initXRes = (domains[0][1] - domains[0][0]) / this.width; + this.scale = 1; + + this.scaleSet = true; +}; + +Display.prototype.computeScale = function () { + var newXRes = (this.xScale.domain()[1] - this.xScale.domain()[0]) / this.width; + this.scale = this.initXRes / newXRes; +}; + +/** + * updateDomains -- set x/y domains of geographic (spherical mercator) coordinate + * system. Does *not* check/adjust aspect ratio. + */ + +Display.prototype.updateDomains = function (bounds) { + this.xScale.domain([bounds[0][0], bounds[1][0]]); + this.yScale.domain([bounds[0][1], bounds[1][1]]); + + this.zoom.x(this.xScale).y(this.yScale); + + this.computeScale(); +}; + +Display.prototype.resized = function () { + var newWidth = this.el.clientWidth; + var newHeight = this.el.clientHeight; + + var xDomain = this.xScale.domain(); + var xFactor = newWidth / this.width; + var xDomainAdj = (xDomain[1] - xDomain[0]) * (xFactor - 1) / 2; + this.xScale.domain([xDomain[0] - xDomainAdj, xDomain[1] + xDomainAdj]); + + var yDomain = this.yScale.domain(); + var yFactor = newHeight / this.height; + var yDomainAdj = (yDomain[1] - yDomain[0]) * (yFactor - 1) / 2; + this.yScale.domain([yDomain[0] - yDomainAdj, yDomain[1] + yDomainAdj]); + + this.xScale.range([0, newWidth]); + this.yScale.range([newHeight, 0]); + + this.height = newHeight; + this.width = newWidth; + + this.zoom.x(this.xScale).y(this.yScale); +}; + +Display.prototype.xyBounds = function () { + var x = this.xScale.domain(); + var y = this.yScale.domain(); + return [[x[0], y[0]], [x[1], y[1]]]; +}; + +/** + * Lat/lon bounds + */ + +Display.prototype.llBounds = function () { + var x = this.xScale.domain(); + var y = this.yScale.domain(); + + return [sm.inverse([x[0], y[0]]), sm.inverse([x[1], y[1]])]; +}; + +Display.prototype.isInRange = function (x, y) { + var xRange = this.xScale.range(); + var yRange = this.yScale.range(); + + return x >= xRange[0] && x <= xRange[1] && y >= yRange[1] && y <= yRange[0]; +}; + +/** + * Compute the x/y coordinate space domains to fit the graph. + */ + +function getDomains(display, height, width, bounds, options) { + var xmin = bounds[0][0]; + var xmax = bounds[1][0]; + var ymin = bounds[0][1]; + var ymax = bounds[1][1]; + var xRange = xmax - xmin; + var yRange = ymax - ymin; + + var paddingFactor = options && options.paddingFactor ? options.paddingFactor : 0.1; + + var margins = getMargins(options); + + var usableHeight = height - margins.top - margins.bottom; + var usableWidth = width - margins.left - margins.right; + var displayAspect = width / height; + var usableDisplayAspect = usableWidth / usableHeight; + var graphAspect = xRange / (yRange === 0 ? -Infinity : yRange); + + var padding; + var dispX1, dispX2, dispY1, dispY2; + var dispXRange, dispYRange; + + if (usableDisplayAspect > graphAspect) { + // y-axis is limiting + padding = paddingFactor * yRange; + dispY1 = ymin - padding; + dispY2 = ymax + padding; + dispYRange = yRange + 2 * padding; + var addedYRange = height / usableHeight * dispYRange - dispYRange; + if (margins.top > 0 || margins.bottom > 0) { + dispY1 -= margins.bottom / (margins.bottom + margins.top) * addedYRange; + dispY2 += margins.top / (margins.bottom + margins.top) * addedYRange; + } + dispXRange = (dispY2 - dispY1) * displayAspect; + var xOffset = (margins.left - margins.right) / width; + var xMidpoint = (xmax + xmin - dispXRange * xOffset) / 2; + dispX1 = xMidpoint - dispXRange / 2; + dispX2 = xMidpoint + dispXRange / 2; + } else { + // x-axis limiting + padding = paddingFactor * xRange; + dispX1 = xmin - padding; + dispX2 = xmax + padding; + dispXRange = xRange + 2 * padding; + var addedXRange = width / usableWidth * dispXRange - dispXRange; + if (margins.left > 0 || margins.right > 0) { + dispX1 -= margins.left / (margins.left + margins.right) * addedXRange; + dispX2 += margins.right / (margins.left + margins.right) * addedXRange; + } + + dispYRange = (dispX2 - dispX1) / displayAspect; + var yOffset = (margins.bottom - margins.top) / height; + var yMidpoint = (ymax + ymin - dispYRange * yOffset) / 2; + dispY1 = yMidpoint - dispYRange / 2; + dispY2 = yMidpoint + dispYRange / 2; + } + + return [[dispX1, dispX2], [dispY1, dispY2]]; +} + +function getMargins(options) { + var margins = { + left: 0, + right: 0, + top: 0, + bottom: 0 + }; + + if (options && options.displayMargins) { + if (options.displayMargins.top) margins.top = options.displayMargins.top; + if (options.displayMargins.bottom) margins.bottom = options.displayMargins.bottom; + if (options.displayMargins.left) margins.left = options.displayMargins.left; + if (options.displayMargins.right) margins.right = options.displayMargins.right; + } + + return margins; +} + +},{"../util/spherical-mercator":41,"./legend":12,"./tile-layer":13,"d3":88,"debug":90}],12:[function(require,module,exports){ +'use strict'; + +var d3 = require('d3'); + +var RenderedEdge = require('../renderer/renderededge'); +var RenderedSegment = require('../renderer/renderedsegment'); +var Util = require('../util'); +var Stop = require('../point/stop'); + +/** + * Expose `Legend` + */ + +module.exports = Legend; + +function Legend(el, display, transitive) { + this.el = el; + this.display = display; + this.transitive = transitive; + + this.height = Util.parsePixelStyle(d3.select(el).style('height')); +} + +Legend.prototype.render = function (legendSegments) { + d3.select(this.el).selectAll(':not(.doNotEmpty)').remove(); + + this.x = this.spacing; + this.y = this.height / 2; + + var segment; + + // iterate through the representative map segments + for (var legendType in legendSegments) { + var mapSegment = legendSegments[legendType]; + + // create a segment solely for rendering in the legend + segment = new RenderedSegment(); + segment.type = mapSegment.getType(); + segment.mode = mapSegment.mode; + segment.patterns = mapSegment.patterns; + + var canvas = this.createCanvas(); + + var renderData = []; + renderData.push({ + x: 0, + y: canvas.height / 2 + }); + renderData.push({ + x: canvas.width, + y: canvas.height / 2 + }); + + segment.render(canvas); + segment.refresh(canvas, renderData); + + this.renderText(getDisplayText(legendType)); + + this.x += this.spacing * 2; + } + + // create the 'transfer' marker + + var rEdge = new RenderedEdge(null, true, 'TRANSIT'); + rEdge.pattern = { + pattern_id: 'ptn', + route: { + route_type: 1 + } + }; + + var transferStop = new Stop(); + transferStop.isSegmentEndPoint = true; + transferStop.isTransferPoint = true; + + this.renderPoint(transferStop, rEdge, 'Transfer'); +}; + +Legend.prototype.renderPoint = function (point, rEdge, text) { + var canvas = this.createCanvas(); + + point.addRenderData({ + owner: point, + rEdge: rEdge, + x: canvas.width / 2, + y: canvas.height / 2, + offsetX: 0, + offsetY: 0 + }); + + point.render(canvas); + + canvas.styler.stylePoint(canvas, point); + point.refresh(canvas); + + this.renderText(text); +}; + +Legend.prototype.renderText = function (text) { + d3.select(this.el).append('div').attr('class', 'legendLabel').html(text); +}; + +Legend.prototype.createCanvas = function () { + var container = d3.select(this.el).append('div').attr('class', 'legendSvg'); + + var width = Util.parsePixelStyle(container.style('width')); + if (!width || width === 0) width = 30; + + var height = Util.parsePixelStyle(container.style('height')); + if (!height || height === 0) height = this.height; + + var canvas = { + xScale: d3.scale.linear(), + yScale: d3.scale.linear(), + styler: this.transitive.styler, + zoom: this.display.zoom, + width: width, + height: height, + svg: container.append('svg').style('width', width).style('height', height) + }; + + return canvas; +}; + +function getDisplayText(type) { + switch (type) { + case 'WALK': + return 'Walk'; + case 'BICYCLE': + return 'Bike'; + case 'CAR': + return 'Drive'; + case 'TRANSIT_0': + return 'Tram'; + case 'TRANSIT_1': + return 'Metro'; + case 'TRANSIT_2': + return 'Rail'; + case 'TRANSIT_3': + return 'Bus'; + case 'TRANSIT_4': + return 'Ferry'; + } + return type; +} + +},{"../point/stop":28,"../renderer/renderededge":32,"../renderer/renderedsegment":33,"../util":38,"d3":88}],13:[function(require,module,exports){ +'use strict'; + +var d3 = require('d3'); +var debug = require('debug')('transitive:tile-layer'); + +var geoTile = require('./d3.geo.tile'); + +var prefix = prefixMatch(['webkit', 'ms', 'Moz', 'O']); + +/** + * Tile layer takes a parent element, a zoom behavior, and a Mapbox ID + * + * @param {Object} opts + */ + +module.exports = function TileLayer(opts) { + debug('creating the tile layer'); + + var el = opts.el; + var display = opts.display; + var height = el.clientHeight; + var id = opts.mapboxId; + var width = el.clientWidth; + + // Set up the projection + var projection = d3.geo.mercator().translate([width / 2, height / 2]); + + // Set up the map tiles + var tile = geoTile(); + + // Create the tile layer + var tileLayer = d3.select(el).append('div').attr('class', 'tile-layer'); + + // Initial zoom + zoomed(); + + this.zoomed = zoomed; + + // Reload tiles on pan and zoom + function zoomed() { + // Get the height and width + height = el.clientHeight; + width = el.clientWidth; + + // Set the map tile size + tile.size([width, height]); + + // Get the current display bounds + var bounds = display.llBounds(); + + // Project the bounds based on the current projection + var psw = projection(bounds[0]); + var pne = projection(bounds[1]); + + // Based the new scale and translation vector off the current one + var scale = projection.scale() * 2 * Math.PI; + var translate = projection.translate(); + + var dx = pne[0] - psw[0]; + var dy = pne[1] - psw[1]; + + scale = scale * (1 / Math.max(dx / width, dy / height)); + projection.translate([width / 2, height / 2]).scale(scale / 2 / Math.PI); + + // Reproject the bounds based on the new scale and translation vector + psw = projection(bounds[0]); + pne = projection(bounds[1]); + var x = (psw[0] + pne[0]) / 2; + var y = (psw[1] + pne[1]) / 2; + translate = [width - x, height - y]; + + // Update the Geo tiles + tile.scale(scale).translate(translate); + + // Get the new set of tiles and render + renderTiles(tile()); + } + + // Render tiles + function renderTiles(tiles) { + var image = tileLayer.style(prefix + 'transform', matrix3d(tiles.scale, tiles.translate)).selectAll('.tile').data(tiles, function (d) { + return d; + }); + + image.exit().remove(); + + image.enter().append('img').attr('class', 'tile').attr('src', function (d) { + return 'http://' + ['a', 'b', 'c', 'd'][Math.random() * 4 | 0] + '.tiles.mapbox.com/v3/' + id + '/' + d[2] + '/' + d[0] + '/' + d[1] + '.png'; + }).style('left', function (d) { + return (d[0] << 8) + 'px'; + }).style('top', function (d) { + return (d[1] << 8) + 'px'; + }); + } +}; + +/** + * Get the 3D Transform Matrix + */ + +function matrix3d(scale, translate) { + var k = scale / 256; + var r = scale % 1 ? Number : Math.round; + return 'matrix3d(' + [k, 0, 0, 0, 0, k, 0, 0, 0, 0, k, 0, r(translate[0] * scale), r(translate[1] * scale), 0, 1] + ')'; +} + +/** + * Match the transform prefix + */ + +function prefixMatch(p) { + var i = -1; + var n = p.length; + var s = document.body.style; + while (++i < n) { + if (p[i] + 'Transform' in s) return '-' + p[i].toLowerCase() + '-'; + } + return ''; +} + +},{"./d3.geo.tile":9,"d3":88,"debug":90}],14:[function(require,module,exports){ +'use strict'; + +var each = require('component-each'); + +var Util = require('../util'); + +/** + * Expose `Edge` + */ + +module.exports = Edge; + +/** + * Initialize a new edge + * @constructor + * @param {Point[]} pointArray - the internal Points for this Edge + * @param {Vertex} fromVertex + * @param {Vertex} toVertex + */ + +var edgeId = 0; + +function Edge(pointArray, fromVertex, toVertex) { + this.id = edgeId++; + this.pointArray = pointArray; + this.fromVertex = fromVertex; + this.toVertex = toVertex; + this.pathSegments = []; + this.renderedEdges = []; +} + +Edge.prototype.getId = function () { + return this.id; +}; + +/** + * + */ + +Edge.prototype.getLength = function () { + var dx = this.toVertex.x - this.fromVertex.x; + var dy = this.toVertex.y - this.fromVertex.y; + return Math.sqrt(dx * dx + dy * dy); +}; + +Edge.prototype.getWorldLength = function () { + if (!this.worldLength) this.calculateWorldLengthAndMidpoint(); + return this.worldLength; +}; + +Edge.prototype.getWorldMidpoint = function () { + if (!this.worldMidpoint) this.calculateWorldLengthAndMidpoint(); + return this.worldMidpoint; +}; + +Edge.prototype.calculateWorldLengthAndMidpoint = function () { + var allPoints = [this.fromVertex.point].concat(this.pointArray, [this.toVertex.point]); + this.worldLength = 0; + for (var i = 0; i < allPoints.length - 1; i++) { + this.worldLength += Util.distance(allPoints[i].worldX, allPoints[i].worldY, allPoints[i + 1].worldX, allPoints[i + 1].worldY); + } + + if (this.worldLength === 0) { + this.worldMidpoint = { + x: this.fromVertex.point.worldX, + y: this.fromVertex.point.worldY + }; + } else { + var distTraversed = 0; + for (i = 0; i < allPoints.length - 1; i++) { + var dist = Util.distance(allPoints[i].worldX, allPoints[i].worldY, allPoints[i + 1].worldX, allPoints[i + 1].worldY); + if ((distTraversed + dist) / this.worldLength >= 0.5) { + // find the position along this segment (0 <= t <= 1) where the edge midpoint lies + var t = (0.5 - distTraversed / this.worldLength) / (dist / this.worldLength); + this.worldMidpoint = { + x: allPoints[i].worldX + t * (allPoints[i + 1].worldX - allPoints[i].worldX), + y: allPoints[i].worldY + t * (allPoints[i + 1].worldY - allPoints[i].worldY) + }; + this.pointsBeforeMidpoint = i; + this.pointsAfterMidpoint = this.pointArray.length - i; + break; + } + distTraversed += dist; + } + } +}; + +/** + * + */ + +Edge.prototype.isAxial = function () { + return this.toVertex.x === this.fromVertex.x || this.toVertex.y === this.fromVertex.y; +}; + +/** + * + */ + +Edge.prototype.hasCurvature = function () { + return this.elbow !== null; +}; + +/** + * + */ + +Edge.prototype.replaceVertex = function (oldVertex, newVertex) { + if (oldVertex === this.fromVertex) this.fromVertex = newVertex; + if (oldVertex === this.toVertex) this.toVertex = newVertex; +}; + +/** + * Add a path segment that traverses this edge + */ + +Edge.prototype.addPathSegment = function (segment) { + this.pathSegments.push(segment); +}; + +Edge.prototype.copyPathSegments = function (baseEdge) { + each(baseEdge.pathSegments, function (pathSegment) { + this.addPathSegment(pathSegment); + }, this); +}; + +Edge.prototype.getPathSegmentIds = function (baseEdge) { + var pathSegIds = []; + each(this.pathSegments, function (segment) { + pathSegIds.push(segment.id); + }); + pathSegIds.sort(); + return pathSegIds.join(','); +}; + +/** + * + */ + +Edge.prototype.addRenderedEdge = function (rEdge) { + if (this.renderedEdges.indexOf(rEdge) !== -1) return; + this.renderedEdges.push(rEdge); +}; + +/** internal geometry functions **/ + +Edge.prototype.calculateGeometry = function (cellSize, angleConstraint) { + // if(!this.hasTransit()) angleConstraint = 5; + angleConstraint = angleConstraint || 45; + + this.angleConstraintR = angleConstraint * Math.PI / 180; + + this.fx = this.fromVertex.point.worldX; + this.fy = this.fromVertex.point.worldY; + this.tx = this.toVertex.point.worldX; + this.ty = this.toVertex.point.worldY; + + var midpoint = this.getWorldMidpoint(); + + var targetFromAngle = Util.getVectorAngle(midpoint.x - this.fx, midpoint.y - this.fy); + this.constrainedFromAngle = Math.round(targetFromAngle / this.angleConstraintR) * this.angleConstraintR; + + var fromAngleDelta = Math.abs(this.constrainedFromAngle - targetFromAngle); + this.fvx = Math.cos(this.constrainedFromAngle); + this.fvy = Math.sin(this.constrainedFromAngle); + + var targetToAngle = Util.getVectorAngle(midpoint.x - this.tx, midpoint.y - this.ty); + + this.constrainedToAngle = Math.round(targetToAngle / this.angleConstraintR) * this.angleConstraintR; + + var toAngleDelta = Math.abs(this.constrainedToAngle - targetToAngle); + this.tvx = Math.cos(this.constrainedToAngle); + this.tvy = Math.sin(this.constrainedToAngle); + + var tol = 0.01; + var v = Util.normalizeVector({ + x: this.toVertex.x - this.fromVertex.x, + y: this.toVertex.y - this.fromVertex.y + }); + + // check if we need to add curvature + if (!equalVectors(this.fvx, this.fvy, -this.tvx, -this.tvy, tol) || !equalVectors(this.fvx, this.fvy, v.x, v.y, tol)) { + // see if the default endpoint angles produce a valid intersection + var isect = this.computeEndpointIntersection(); + + if (isect.intersect) { + // if so, compute the elbow and we're done + this.elbow = { + x: this.fx + isect.u * this.fvx, + y: this.fy + isect.u * this.fvy + }; + } else { + // if not, adjust the two endpoint angles until they properly intersect + + // default test: compare angle adjustments (if significant difference) + if (Math.abs(fromAngleDelta - toAngleDelta) > 0.087) { + if (fromAngleDelta < toAngleDelta) { + this.adjustToAngle(); + } else { + this.adjustFromAngle(); + } + } else { + // secondary test: look at distribution of shapepoints + if (this.pointsAfterMidpoint < this.pointsBeforeMidpoint) { + this.adjustToAngle(); + } else { + this.adjustFromAngle(); + } + } + } + } + + this.fromAngle = this.constrainedFromAngle; + this.toAngle = this.constrainedToAngle; + + this.calculateVectors(); + this.calculateAlignmentIds(); +}; + +/** + * Adjust the 'to' endpoint angle by rotating it increments of angleConstraintR + * until a valid intersection between the from and to endpoint rays is achieved. + */ + +Edge.prototype.adjustToAngle = function () { + var ccw = Util.ccw(this.fx, this.fy, this.fx + this.fvx, this.fy + this.fvy, this.tx, this.ty); + var delta = ccw > 0 ? this.angleConstraintR : -this.angleConstraintR; + var i = 0; + var isect; + while (i++ < 100) { + this.constrainedToAngle += delta; + this.tvx = Math.cos(this.constrainedToAngle); + this.tvy = Math.sin(this.constrainedToAngle); + isect = this.computeEndpointIntersection(); + if (isect.intersect) break; + } + this.elbow = { + x: this.fx + isect.u * this.fvx, + y: this.fy + isect.u * this.fvy + }; +}; + +/** + * Adjust the 'from' endpoint angle by rotating it increments of angleConstraintR + * until a valid intersection between the from and to endpoint rays is achieved. + */ + +Edge.prototype.adjustFromAngle = function () { + var ccw = Util.ccw(this.tx, this.ty, this.tx + this.tvx, this.ty + this.tvy, this.fx, this.fy); + var delta = ccw > 0 ? this.angleConstraintR : -this.angleConstraintR; + var i = 0; + var isect; + while (i++ < 100) { + this.constrainedFromAngle += delta; + this.fvx = Math.cos(this.constrainedFromAngle); + this.fvy = Math.sin(this.constrainedFromAngle); + isect = this.computeEndpointIntersection(); + if (isect.intersect) break; + } + this.elbow = { + x: this.fx + isect.u * this.fvx, + y: this.fy + isect.u * this.fvy + }; +}; + +Edge.prototype.computeEndpointIntersection = function () { + return Util.rayIntersection(this.fx, this.fy, this.fvx, this.fvy, this.tx, this.ty, this.tvx, this.tvy); +}; + +function equalVectors(x1, y1, x2, y2, tol) { + tol = tol || 0; + return Math.abs(x1 - x2) < tol && Math.abs(y1 - y2) < tol; +} + +Edge.prototype.calculateVectors = function (fromAngle, toAngle) { + this.fromVector = { + x: Math.cos(this.fromAngle), + y: Math.sin(this.fromAngle) + }; + + this.fromleftVector = { + x: -this.fromVector.y, + y: this.fromVector.x + }; + + this.fromRightVector = { + x: this.fromVector.y, + y: -this.fromVector.x + }; + + this.toVector = { + x: Math.cos(this.toAngle + Math.PI), + y: Math.sin(this.toAngle + Math.PI) + }; + + this.toleftVector = { + x: -this.toVector.y, + y: this.toVector.x + }; + + this.toRightVector = { + x: this.toVector.y, + y: -this.toVector.x + }; +}; + +/** + * Compute the 'alignment id', a string that uniquely identifies a line in + * 2D space given a point and angle relative to the x-axis. + */ + +Edge.prototype.calculateAlignmentId = function (x, y, angle) { + var angleD = Math.round(angle * 180 / Math.PI); + if (angleD > 90) angleD -= 180; + if (angleD <= -90) angleD += 180; + + if (angleD === 90) { + return '90_x' + x; + } + + // calculate the y-axis crossing + var ya = Math.round(y - x * Math.tan(angle)); + return angleD + '_y' + ya; +}; + +Edge.prototype.calculateAlignmentIds = function () { + this.fromAlignmentId = this.calculateAlignmentId(this.fromVertex.x, this.fromVertex.y, this.fromAngle); + this.toAlignmentId = this.calculateAlignmentId(this.toVertex.x, this.toVertex.y, this.toAngle); +}; + +Edge.prototype.hasTransit = function (cellSize) { + // debug(this); + for (var i = 0; i < this.pathSegments.length; i++) { + if (this.pathSegments[i].getType() === 'TRANSIT') { + return true; + } + } + return false; +}; + +Edge.prototype.getFromAlignmentId = function () { + return this.fromAlignmentId; +}; + +Edge.prototype.getToAlignmentId = function () { + return this.toAlignmentId; +}; + +Edge.prototype.getAlignmentRange = function (alignmentId) { + var p1, p2; + if (alignmentId === this.fromAlignmentId) { + p1 = this.fromVertex; + p2 = this.elbow || this.toVertex; + } else if (alignmentId === this.toAlignmentId) { + p1 = this.toVertex; + p2 = this.elbow || this.fromVertex; + } else { + return null; + } + + var min, max; + if (alignmentId.substring(0, 2) === '90') { + min = Math.min(p1.y, p2.y); + max = Math.max(p1.y, p2.y); + } else { + min = Math.min(p1.x, p2.x); + max = Math.max(p1.x, p2.x); + } + + return { + min: min, + max: max + }; +}; + +Edge.prototype.align = function (vertex, vector) { + if (this.aligned || !this.hasCurvature()) return; + var currentVector = this.getVector(vertex); + if (Math.abs(currentVector.x) !== Math.abs(vector.x) || Math.abs(currentVector.y) !== Math.abs(vector.y)) { + this.curveAngle = -this.curveAngle; + this.calculateGeometry(); + } + this.aligned = true; +}; + +Edge.prototype.getGeometricCoords = function (fromOffsetPx, toOffsetPx, display, forward) { + var coords = []; + + // reverse the coords array if needed + var geomCoords = forward ? this.geomCoords : this.geomCoords.concat().reverse(); + + each(geomCoords, function (coord, i) { + var fromVector = null; + var toVector = null; + var rightVector; + var xOffset, yOffset; + var x1 = display.xScale(coord[0]); + var y1 = display.yScale(coord[1]); + + // calculate the vector leading in to this coordinate + if (i > 0) { + var prevCoord = geomCoords[i - 1]; + var x0 = display.xScale(prevCoord[0]); + var y0 = display.yScale(prevCoord[1]); + if (x1 === x0 && y1 === y0) return; + + toVector = { + x: x1 - x0, + y: y1 - y0 + }; + } + + // calculate the vector leading out from this coordinate + if (i < geomCoords.length - 1) { + var nextCoord = geomCoords[i + 1]; + var x2 = display.xScale(nextCoord[0]); + var y2 = display.yScale(nextCoord[1]); + if (x2 === x1 && y2 === y1) return; + + fromVector = { + x: x2 - x1, + y: y2 - y1 + }; + } + + if (fromVector && !toVector) { + // the first point in the geomCoords sequence + rightVector = Util.normalizeVector({ + x: fromVector.y, + y: -fromVector.x + }); + xOffset = fromOffsetPx * rightVector.x; + yOffset = fromOffsetPx * rightVector.y; + } else if (!fromVector && toVector) { + // the last point in the geomCoords sequence + rightVector = Util.normalizeVector({ + x: toVector.y, + y: -toVector.x + }); + xOffset = fromOffsetPx * rightVector.x; + yOffset = fromOffsetPx * rightVector.y; + } else { + // an internal point + rightVector = Util.normalizeVector({ + x: fromVector.y, + y: -fromVector.x + }); + xOffset = fromOffsetPx * rightVector.x; + yOffset = fromOffsetPx * rightVector.y; + + // TODO: properly compute the offsets based on both vectors + } + + coords.push({ + x: x1 + xOffset, + y: y1 + yOffset + }); + }, this); + return coords; +}; + +Edge.prototype.getRenderCoords = function (fromOffsetPx, toOffsetPx, display, forward) { + var isBase = fromOffsetPx === 0 && toOffsetPx === 0; + + if (!this.baseRenderCoords && !isBase) { + this.calculateBaseRenderCoords(display); + } + + var fromOffsetX = fromOffsetPx * this.fromRightVector.x; + var fromOffsetY = fromOffsetPx * this.fromRightVector.y; + + var toOffsetX = toOffsetPx * this.toRightVector.x; + var toOffsetY = toOffsetPx * this.toRightVector.y; + + var fx = this.fromVertex.getRenderX(display) + fromOffsetX; + var fy = this.fromVertex.getRenderY(display) - fromOffsetY; + var fvx = this.fromVector.x; + var fvy = -this.fromVector.y; + + var tx = this.toVertex.getRenderX(display) + toOffsetX; + var ty = this.toVertex.getRenderY(display) - toOffsetY; + var tvx = -this.toVector.x; + var tvy = this.toVector.y; + + var coords = []; + + // append the first ('from') coordinate + coords.push({ + x: forward ? fx : tx, + y: forward ? fy : ty + }); + + var len = null; + var x1; + var y1; + var x2; + var y2; + + // determine if this edge has an elbow, i.e. a bend in the middle + if (isBase && !this.isStraight() || !isBase && this.baseRenderCoords.length === 4) { + var isect = Util.rayIntersection(fx, fy, fvx, fvy, tx, ty, tvx, tvy); + if (isect.intersect) { + var u = isect.u; + var ex = fx + fvx * u; + var ey = fy + fvy * u; + + this.ccw = Util.ccw(fx, fy, ex, ey, tx, ty); + + // calculate the angle of the arc + var angleR = this.getElbowAngle(); + + // calculate the radius of the arc in pixels, taking offsets into consideration + var rPx = this.getBaseRadiusPx() - this.ccw * (fromOffsetPx + toOffsetPx) / 2; + + // calculate the distance from the elbow to place the arc endpoints in each direction + var d = rPx * Math.tan(angleR / 2); + + // make sure the arc endpoint placement distance is not longer than the either of the + // elbow-to-edge-endpoint distances + var l1 = Util.distance(fx, fy, ex, ey); + var l2 = Util.distance(tx, ty, ex, ey); + d = Math.min(Math.min(l1, l2), d); + + x1 = ex - this.fromVector.x * d; + y1 = ey + this.fromVector.y * d; + + x2 = ex + this.toVector.x * d; + y2 = ey - this.toVector.y * d; + + var radius = Util.getRadiusFromAngleChord(angleR, Util.distance(x1, y1, x2, y2)); + var arc = angleR * (180 / Math.PI) * (this.ccw < 0 ? 1 : -1); + + if (forward) { + coords.push({ + x: x1, + y: y1, + len: Util.distance(fx, fy, x1, y1) + }); + + coords.push({ + x: x2, + y: y2, + len: angleR * radius, + arc: arc, + radius: radius + }); + + len = Util.distance(x2, y2, tx, ty); + } else { + // backwards traversal + coords.push({ + x: x2, + y: y2, + len: Util.distance(tx, ty, x2, y2) + }); + + coords.push({ + x: x1, + y: y1, + len: angleR * radius, + arc: -arc, + radius: radius + }); + + len = Util.distance(x1, y1, fx, fy); + } + } + } + + // if the length wasn't calculated during elbow-creation, do it now + if (len === null) len = Util.distance(fx, fy, tx, ty); + + // append the final ('to') coordinate + coords.push({ + x: forward ? tx : fx, + y: forward ? ty : fy, + len: len + }); + + return coords; +}; + +Edge.prototype.calculateBaseRenderCoords = function (display) { + this.baseRenderCoords = this.getRenderCoords(0, 0, display, true); +}; + +Edge.prototype.isStraight = function () { + var tol = 0.00001; + return Math.abs(this.fromVector.x - this.toVector.x) < tol && Math.abs(this.fromVector.y - this.toVector.y) < tol; +}; + +Edge.prototype.getBaseRadiusPx = function () { + return 15; +}; + +Edge.prototype.getElbowAngle = function () { + var cx = this.fromVector.x - this.toVector.x; + var cy = this.fromVector.y - this.toVector.y; + + var c = Math.sqrt(cx * cx + cy * cy) / 2; + + var theta = Math.asin(c); + + return theta * 2; +}; + +Edge.prototype.getRenderLength = function (display) { + if (!this.baseRenderCoords) this.calculateBaseRenderCoords(display); + + if (!this.renderLength) { + this.renderLength = 0; + for (var i = 1; i < this.baseRenderCoords.length; i++) { + this.renderLength += this.baseRenderCoords[i].len; + } + } + return this.renderLength; +}; + +/** + * Retrieve the coordinate located at a defined percentage along an Edge's length. + * @param {Number} t - a value between 0 and 1 representing the location of the + * point to be computed + * @param {Object[]} coords - the offset coordinates computed for this edge. + * @param {Display} display + * @returns {Object} - the coordinate as an {x,y} Object + */ + +Edge.prototype.coordAlongEdge = function (t, coords, display) { + if (!this.baseRenderCoords) { + this.calculateBaseRenderCoords(display); + } + + if (coords.length !== this.baseRenderCoords.length) { + return this.coordAlongOffsetEdge(t, coords, display); + } + + // get the length of this edge in screen units using the "base" (i.e. un-offset) render coords + var len = this.getRenderLength(); + + var loc = t * len; // the target distance along the Edge's base geometry + var cur = 0; // our current location along the edge (in world units) + + for (var i = 1; i < this.baseRenderCoords.length; i++) { + if (loc < cur + this.baseRenderCoords[i].len) { + var t2 = (loc - cur) / this.baseRenderCoords[i].len; + + if (coords[i].arc) { + var r = coords[i].radius; + var theta = Math.PI * coords[i].arc / 180; + var ccw = Util.ccw(coords[0].x, coords[0].y, coords[1].x, coords[1].y, coords[2].x, coords[2].y); + + return Util.pointAlongArc(coords[1].x, coords[1].y, coords[2].x, coords[2].y, r, theta, ccw, t2); + } else { + var dx = coords[i].x - coords[i - 1].x; + var dy = coords[i].y - coords[i - 1].y; + + return { + x: coords[i - 1].x + dx * t2, + y: coords[i - 1].y + dy * t2 + }; + } + } + cur += this.baseRenderCoords[i].len; + } +}; + +Edge.prototype.coordAlongOffsetEdge = function (t, coords, display) { + if (!this.baseRenderCoords) this.calculateBaseRenderCoords(display); + + var len = 0; + for (var i = 1; i < coords.length; i++) { + len += coords[i].len; + } + + var loc = t * len; // the target distance along the Edge's base geometry + var cur = 0; // our current location along the edge (in world units) + + for (i = 1; i < coords.length; i++) { + if (loc < cur + coords[i].len) { + var t2 = (loc - cur) / coords[i].len; + + if (coords[i].arc) { + // arc segment + var r = coords[i].radius; + var theta = Math.PI * coords[i].arc / 180; + var ccw = Util.ccw(coords[0].x, coords[0].y, coords[1].x, coords[1].y, coords[2].x, coords[2].y); + + return Util.pointAlongArc(coords[1].x, coords[1].y, coords[2].x, coords[2].y, r, theta, ccw, t2); + } else { + // straight segment + var dx = coords[i].x - coords[i - 1].x; + var dy = coords[i].y - coords[i - 1].y; + + return { + x: coords[i - 1].x + dx * t2, + y: coords[i - 1].y + dy * t2 + }; + } + } + cur += coords[i].len; + } +}; + +Edge.prototype.clearRenderData = function () { + this.baseRenderCoords = null; + this.renderLength = null; +}; + +Edge.prototype.getVector = function (vertex) { + if (vertex === this.fromVertex) return this.fromVector; + if (vertex === this.toVertex) return this.toVector; +}; + +/** + * Gets the vertex opposite another vertex on an edge + */ + +Edge.prototype.oppositeVertex = function (vertex) { + if (vertex === this.toVertex) return this.fromVertex; + if (vertex === this.fromVertex) return this.toVertex; + return null; +}; + +Edge.prototype.commonVertex = function (edge) { + if (this.fromVertex === edge.fromVertex || this.fromVertex === edge.toVertex) return this.fromVertex; + if (this.toVertex === edge.fromVertex || this.toVertex === edge.toVertex) return this.toVertex; + return null; +}; + +/** + * + */ + +Edge.prototype.setPointLabelPosition = function (pos, skip) { + if (this.fromVertex.point !== skip) this.fromVertex.point.labelPosition = pos; + if (this.toVertex.point !== skip) this.toVertex.point.labelPosition = pos; + + this.pointArray.forEach(function (point) { + if (point !== skip) point.labelPosition = pos; + }); +}; + +/** + * Determines if this edge is part of a standalone, non-transit path + * (e.g. a walk/bike/drive-only journey) + */ + +Edge.prototype.isNonTransitPath = function () { + return this.pathSegments.length === 1 && this.pathSegments[0] !== 'TRANSIT' && this.pathSegments[0].path.segments.length === 1; +}; + +/** + * + */ + +Edge.prototype.toString = function () { + return 'Edge ' + this.getId() + ' (' + this.fromVertex.toString() + ' to ' + this.toVertex.toString() + ')'; +}; + +},{"../util":38,"component-each":84}],15:[function(require,module,exports){ +'use strict'; + +var each = require('component-each'); +var PriorityQueue = require('priorityqueuejs'); + +var Util = require('../util'); + +/** + * Expose `EdgeGroup` + */ + +module.exports = EdgeGroup; + +/** + * A group of edges that share the same endpoint vertices + */ + +function EdgeGroup(fromVertex, toVertex, type) { + this.fromVertex = fromVertex; + this.toVertex = toVertex; + this.type = type; + this.edges = []; + this.commonPoints = null; + this.worldLength = 0; +} + +EdgeGroup.prototype.addEdge = function (edge) { + this.edges.push(edge); + edge.edgeGroup = this; + + // update the groups worldLength + this.worldLength = Math.max(this.worldLength, edge.getWorldLength()); + + if (this.commonPoints === null) { + // if this is first edge added, initialize group's commonPoint array to include all of edge's points + this.commonPoints = []; + each(edge.pointArray, function (point) { + this.commonPoints.push(point); + }, this); + } else { + // otherwise, update commonPoints array to only include those in added edge + var newCommonPoints = []; + each(edge.pointArray, function (point) { + if (this.commonPoints.indexOf(point) !== -1) newCommonPoints.push(point); + }, this); + this.commonPoints = newCommonPoints; + } +}; + +EdgeGroup.prototype.getWorldLength = function () { + return this.worldLength; +}; + +EdgeGroup.prototype.getInternalVertexPQ = function () { + // create an array of all points on the edge (endpoints and internal) + var allPoints = [this.fromVertex.point].concat(this.commonPoints, [this.toVertex.point]); + + var pq = new PriorityQueue(function (a, b) { + return a.weight - b.weight; + }); + + for (var i = 1; i < allPoints.length - 1; i++) { + var weight = this.getInternalVertexWeight(allPoints, i); + pq.enq({ + weight: weight, + point: allPoints[i] + }); + } + + return pq; +}; + +EdgeGroup.prototype.getInternalVertexWeight = function (pointArray, index) { + var x1 = pointArray[index - 1].worldX; + var y1 = pointArray[index - 1].worldY; + var x2 = pointArray[index].worldX; + var y2 = pointArray[index].worldY; + var x3 = pointArray[index + 1].worldX; + var y3 = pointArray[index + 1].worldY; + + // the weighting function is a combination of: + // - the distances from this internal point to the two adjacent points, normalized for edge length (longer distances are prioritized) + // - the angle formed by this point and the two adjacent ones ('sharper' angles are prioritized) + var inDist = Util.distance(x1, y1, x2, y2); + var outDist = Util.distance(x2, y2, x3, y3); + var theta = Util.angleFromThreePoints(x1, y1, x2, y2, x3, y3); + var edgeLen = this.getWorldLength(); + var weight = inDist / edgeLen + outDist / edgeLen + Math.abs(Math.PI - theta) / Math.PI; + + return weight; +}; + +EdgeGroup.prototype.hasTransit = function () { + for (var i = 0; i < this.edges.length; i++) { + if (this.edges[i].hasTransit()) return true; + } + return false; +}; + +EdgeGroup.prototype.isNonTransitPath = function () { + return this.edges.length === 1 && this.edges[0].isNonTransitPath(); +}; + +EdgeGroup.prototype.getTurnPoints = function (maxAngle) { + var points = []; + maxAngle = maxAngle || 0.75 * Math.PI; + each(this.commonPoints, function (point) { + if (point.getType() !== 'TURN') return; + if (Math.abs(point.turnAngle) < maxAngle) { + points.push(point); + } + }); + return points; +}; + +},{"../util":38,"component-each":84,"priorityqueuejs":92}],16:[function(require,module,exports){ +'use strict'; + +var d3 = require('d3'); +var debug = require('debug')('transitive:graph'); +var each = require('component-each'); + +var Edge = require('./edge'); +var EdgeGroup = require('./edgegroup'); +var Vertex = require('./vertex'); +var MultiPoint = require('../point/multipoint'); +var Util = require('../util'); + +/** + * Expose `NetworkGraph` + */ + +module.exports = NetworkGraph; + +/** + * An graph representing the underlying 'wireframe' network + */ + +function NetworkGraph(network, vertices) { + this.network = network; + this.edges = []; + this.vertices = []; + + /** + * Object mapping groups of edges that share the same two vertices. + * - Key is string of format A_B, where A and B are vertex IDs and A < B + * - Value is array of edges + */ + this.edgeGroups = {}; + + // Add all base vertices + for (var i in vertices) { + this.addVertex(vertices[i], vertices[i].worldX, vertices[i].worldY); + } +} + +/** + * Get the bounds of the graph in the graph's internal x/y coordinate space + * + * @return [[left, top], [right, bottom]] + */ + +NetworkGraph.prototype.bounds = function () { + var xmax = null; + var xmin = null; + var ymax = null; + var ymin = null; + + for (var i in this.vertices) { + var vertex = this.vertices[i]; + xmin = xmin ? Math.min(xmin, vertex.x) : vertex.x; + xmax = xmax ? Math.max(xmax, vertex.x) : vertex.x; + ymin = ymin ? Math.min(ymin, vertex.y) : vertex.y; + ymax = ymax ? Math.max(ymax, vertex.y) : vertex.y; + } + + var maxExtent = 20037508.34; + return [[xmin || -maxExtent, ymin || -maxExtent], [xmax || maxExtent, ymax || maxExtent]]; +}; + +/** + * Add Vertex + */ + +NetworkGraph.prototype.addVertex = function (point, x, y) { + if (x === undefined || y === undefined) { + var xy = Util.latLonToSphericalMercator(point.getLat(), point.getLon()); + x = xy[0]; + y = xy[1]; + } + var vertex = new Vertex(point, x, y); + this.vertices.push(vertex); + return vertex; +}; + +/** + * Add Edge + */ + +NetworkGraph.prototype.addEdge = function (stops, from, to, segmentType) { + if (this.vertices.indexOf(from) === -1 || this.vertices.indexOf(to) === -1) { + debug('Error: Cannot add edge. Graph does not contain vertices.'); + return; + } + + var edge = new Edge(stops, from, to); + this.edges.push(edge); + from.edges.push(edge); + to.edges.push(edge); + + var groupKey = this.network.transitive.options.groupEdges ? this.getEdgeGroupKey(edge, segmentType) : edge.getId(); + + if (!(groupKey in this.edgeGroups)) { + this.edgeGroups[groupKey] = new EdgeGroup(edge.fromVertex, edge.toVertex, segmentType); + } + this.edgeGroups[groupKey].addEdge(edge); + + return edge; +}; + +NetworkGraph.prototype.removeEdge = function (edge) { + // remove from the graph's edge collection + var edgeIndex = this.edges.indexOf(edge); + if (edgeIndex !== -1) this.edges.splice(edgeIndex, 1); + + // remove from any associated path segment edge lists + edge.pathSegments.forEach(function (segment) { + segment.removeEdge(edge); + }); + + // remove from the endpoint vertex incidentEdge collections + edge.fromVertex.removeEdge(edge); + edge.toVertex.removeEdge(edge); +}; + +NetworkGraph.prototype.getEdgeGroup = function (edge) { + return this.edgeGroups[this.getEdgeGroupKey(edge)]; +}; + +NetworkGraph.prototype.getEdgeGroupKey = function (edge, segmentType) { + return edge.fromVertex.getId() < edge.toVertex.getId() ? segmentType + '_' + edge.fromVertex.getId() + '_' + edge.toVertex.getId() : segmentType + '_' + edge.toVertex.getId() + '_' + edge.fromVertex.getId(); +}; + +NetworkGraph.prototype.mergeVertices = function (vertexArray) { + var xTotal = 0; + var yTotal = 0; + + var vertexGroups = { + 'STOP': [], + 'PLACE': [], + 'TURN': [], + 'MULTI': [] + }; + vertexArray.forEach(function (vertex) { + if (vertex.point.getType() in vertexGroups) vertexGroups[vertex.point.getType()].push(vertex); + }); + + var mergePoint; + + // don't merge stops and places, or multiple places: + if (vertexGroups.STOP.length > 0 && vertexGroups.PLACE.length > 0 || vertexGroups.PLACE.length > 1 || vertexGroups.MULTI.length > 0) return; + + // if merging turns with a place, create a new merged vertex around the place + if (vertexGroups.PLACE.length === 1 && vertexGroups.TURN.length > 0) { + mergePoint = vertexGroups.PLACE[0].point; + // if merging turns with a single place, create a new merged vertex around the stop + } else if (vertexGroups.STOP.length === 1 && vertexGroups.TURN.length > 0) { + mergePoint = vertexGroups.STOP[0].point; + // if merging multiple stops, create a new MultiPoint vertex + } else if (vertexGroups.STOP.length > 1) { + mergePoint = new MultiPoint(); + each(vertexGroups.STOP, function (stopVertex) { + mergePoint.addPoint(stopVertex.point); + }); + // if merging multiple turns + } else if (vertexGroups.TURN.length > 1) { + mergePoint = vertexGroups.TURN[0].point; + } + + if (!mergePoint) return; + var mergedVertex = new Vertex(mergePoint, 0, 0); + + vertexArray.forEach(function (vertex) { + xTotal += vertex.x; + yTotal += vertex.y; + + var edges = []; + each(vertex.edges, function (edge) { + edges.push(edge); + }); + + each(edges, function (edge) { + if (vertexArray.indexOf(edge.fromVertex) !== -1 && vertexArray.indexOf(edge.toVertex) !== -1) { + this.removeEdge(edge); + return; + } + edge.replaceVertex(vertex, mergedVertex); + mergedVertex.addEdge(edge); + }, this); + var index = this.vertices.indexOf(vertex); + if (index !== -1) this.vertices.splice(index, 1); + }, this); + + mergedVertex.x = xTotal / vertexArray.length; + mergedVertex.y = yTotal / vertexArray.length; + mergedVertex.oldVertices = vertexArray; + + this.vertices.push(mergedVertex); +}; + +NetworkGraph.prototype.sortVertices = function () { + this.vertices.sort(function (a, b) { + if (a.point && a.point.getType() === 'PLACE') return -1; + if (b.point && b.point.getType() === 'PLACE') return 1; + + if (a.point && a.point.getType() === 'MULTI') return -1; + if (b.point && b.point.getType() === 'MULTI') return 1; + + if (a.point && a.point.getType() === 'STOP') return -1; + if (b.point && b.point.getType() === 'STOP') return 1; + }); +}; + +/** + * Get the equivalent edge + */ + +NetworkGraph.prototype.getEquivalentEdge = function (pointArray, from, to) { + for (var e = 0; e < this.edges.length; e++) { + var edge = this.edges[e]; + if (edge.fromVertex === from && edge.toVertex === to && pointArray.length === edge.pointArray.length && equal(pointArray, edge.pointArray)) { + return edge; + } + if (edge.fromVertex === to && edge.toVertex === from && pointArray.length === edge.pointArray.length && equal(pointArray.slice(0).reverse(), edge.pointArray)) { + return edge; + } + } +}; + +/** + * Split a specified graph edge around a set of specified split points, where + * all split points are internal points of the edge to be split. A set of N + * valid split points will result in N+1 new edges. The original edge is + * removed from the graph. + */ + +NetworkGraph.prototype.splitEdgeAtInternalPoints = function (edge, points) { + var subEdgePoints = []; + var newEdge; + var newEdgeInfoArr = []; + var fromVertex = edge.fromVertex; + var geomCoords = []; + + // iterate through the parent edge points, creating new sub-edges as needed + each(edge.pointArray, function (point, i) { + if (edge.pointGeom && i < edge.pointGeom.length) { + geomCoords = geomCoords.concat(edge.pointGeom[i]); + } + if (points.indexOf(point) !== -1) { + // we've reached a split point + var x = point.worldX; + var y = point.worldY; + var newVertex = point.graphVertex || this.addVertex(point, x, y); + newVertex.isInternal = true; + newEdge = this.addEdge(subEdgePoints, fromVertex, newVertex, edge.edgeGroup.type); + newEdge.isInternal = true; + newEdge.copyPathSegments(edge); + newEdgeInfoArr.push({ + graphEdge: newEdge, + fromVertex: fromVertex + }); + if (geomCoords.length > 0) newEdge.geomCoords = geomCoords; + + subEdgePoints = []; + fromVertex = newVertex; + geomCoords = []; + } else { + // otherwise, this point becomes an internal point of the new edge currently being created + subEdgePoints.push(point); + } + }, this); + + // create the last sub-edge + newEdge = this.addEdge(subEdgePoints, fromVertex, edge.toVertex, edge.edgeGroup.type); + newEdge.isInternal = true; + newEdge.copyPathSegments(edge); + if (edge.pointGeom && edge.pointArray.length < edge.pointGeom.length) { + geomCoords = geomCoords.concat(edge.pointGeom[edge.pointArray.length]); + } + if (geomCoords.length > 0) newEdge.geomCoords = geomCoords; + + newEdgeInfoArr.push({ + graphEdge: newEdge, + fromVertex: fromVertex + }); + + // insert the new edge sequence into the affected segments + each(edge.pathSegments, function (pathSegment) { + var indexInSegment = pathSegment.getEdgeIndex(edge); + var forward = pathSegment.edges[indexInSegment].forward; + var index = pathSegment.getEdgeIndex(edge); + each(forward ? newEdgeInfoArr : newEdgeInfoArr.reverse(), function (edgeInfo) { + pathSegment.insertEdgeAt(index, edgeInfo.graphEdge, forward ? edgeInfo.fromVertex : edgeInfo.toVertex); + index++; + }); + }); + + // remove the original edge from the graph + this.removeEdge(edge); +}; + +/* NetworkGraph.prototype.collapseTransfers = function(threshold) { + if(!threshold) return; + this.edges.forEach(function(edge) { + if (edge.getLength() > threshold || + edge.fromVertex.point.containsFromPoint() || + edge.fromVertex.point.containsToPoint() || + edge.toVertex.point.containsFromPoint() || + edge.toVertex.point.containsToPoint()) return; + //if(edge.fromVertex.point.getType() === 'PLACE' || edge.toVertex.point.getType() === 'PLACE') return; + var notTransit = true; + edge.pathSegments.forEach(function(segment) { + notTransit = notTransit && segment.type !== 'TRANSIT'; + }); + if (notTransit) { + this.mergeVertices([edge.fromVertex, edge.toVertex]); + } + }, this); +}; */ + +NetworkGraph.prototype.pruneVertices = function () { + each(this.vertices, function (vertex) { + if (vertex.point.containsSegmentEndPoint()) return; + + var opposites = []; + var pathSegmentBundles = {}; // maps pathSegment id list (string) to collection of edges (array) + + each(vertex.edges, function (edge) { + var pathSegmentIds = edge.getPathSegmentIds(); + if (!(pathSegmentIds in pathSegmentBundles)) pathSegmentBundles[pathSegmentIds] = []; + pathSegmentBundles[pathSegmentIds].push(edge); + var opp = edge.oppositeVertex(vertex); + if (opposites.indexOf(opp) === -1) opposites.push(opp); + }); + + if (opposites.length !== 2) return; + + each(pathSegmentBundles, function (ids) { + var edgeArr = pathSegmentBundles[ids]; + if (edgeArr.length === 2) this.mergeEdges(edgeArr[0], edgeArr[1]); + }, this); + }, this); +}; + +NetworkGraph.prototype.mergeEdges = function (edge1, edge2) { + // check for infinite recursion loop case + if (edge1.fromVertex === edge2.toVertex && edge2.fromVertex === edge1.toVertex) { + return; + } + + // reverse edges if necessary + if (edge1.fromVertex === edge2.toVertex) { + this.mergeEdges(edge2, edge1); + return; + } + + if (edge1.toVertex !== edge2.fromVertex) return; // edges cannot be merged + + var internalPoints = edge1.pointArray.concat(edge2.pointArray); + + var newEdge = this.addEdge(internalPoints, edge1.fromVertex, edge2.toVertex, edge1.edgeGroup.type); + newEdge.pathSegments = edge1.pathSegments; + each(newEdge.pathSegments, function (segment) { + // var i = segment.graphEdges.indexOf(edge1); + // segment.graphEdges.splice(i, 0, newEdge); + var i = segment.getEdgeIndex(edge1); + segment.insertEdgeAt(i, newEdge, newEdge.fromVertex); + }); + + // if both input edges are have coordinate geometry, merge the coords arrays in the new edge + if (edge1.geomCoords && edge2.geomCoords) { + newEdge.geomCoords = edge1.geomCoords.concat(edge2.geomCoords.length > 0 ? edge2.geomCoords.slice(1) : []); + } + + debug('merging:'); + debug(edge1); + debug(edge2); + this.removeEdge(edge1); + this.removeEdge(edge2); +}; + +NetworkGraph.prototype.snapToGrid = function (cellSize) { + var coincidenceMap = {}; + this.vertices.forEach(function (vertex) { + var nx = Math.round(vertex.x / cellSize) * cellSize; + var ny = Math.round(vertex.y / cellSize) * cellSize; + vertex.x = nx; + vertex.y = ny; + + var key = nx + '_' + ny; + if (!(key in coincidenceMap)) coincidenceMap[key] = [vertex];else coincidenceMap[key].push(vertex); + }); + + each(coincidenceMap, function (key) { + var vertexArr = coincidenceMap[key]; + if (vertexArr.length > 1) { + this.mergeVertices(vertexArr); + } + }, this); +}; + +NetworkGraph.prototype.calculateGeometry = function (cellSize, angleConstraint) { + this.edges.forEach(function (edge) { + edge.calculateGeometry(cellSize, angleConstraint); + }); +}; + +NetworkGraph.prototype.resetCoordinates = function () { + this.vertices.forEach(function (vertex) { + vertex.x = vertex.origX; + vertex.y = vertex.origY; + }); +}; + +NetworkGraph.prototype.recenter = function () { + var xCoords = []; + var yCoords = []; + this.vertices.forEach(function (v) { + xCoords.push(v.x); + yCoords.push(v.y); + }); + + var mx = d3.median(xCoords); + var my = d3.median(yCoords); + + this.vertices.forEach(function (v) { + v.x = v.x - mx; + v.y = v.y - my; + }); +}; + +/** 2D line bundling & offsetting **/ + +NetworkGraph.prototype.apply2DOffsets = function () { + this.initComparisons(); + + var alignmentBundles = {}; // maps alignment ID to array of range-bounded bundles on that alignment + + var addToBundle = function addToBundle(rEdge, alignmentId) { + var bundle; + + // compute the alignment range of the edge being bundled + var range = rEdge.graphEdge.getAlignmentRange(alignmentId); + + // check if bundles already exist for this alignment + if (!(alignmentId in alignmentBundles)) { + // if not, create new and add to collection + bundle = new AlignmentBundle(); + bundle.addEdge(rEdge, range.min, range.max); + alignmentBundles[alignmentId] = [bundle]; // new AlignmentBundle(); + } else { + // 1 or more bundles currently exist for this alignmentId + var bundleArr = alignmentBundles[alignmentId]; + + // see if the segment range overlaps with that of an existing bundle + for (var i = 0; i < bundleArr.length; i++) { + if (bundleArr[i].rangeOverlaps(range.min, range.max)) { + bundleArr[i].addEdge(rEdge, range.min, range.max); + return; + } + } + + // ..if not, create a new bundle + bundle = new AlignmentBundle(); + bundle.addEdge(rEdge, range.min, range.max); + bundleArr.push(bundle); + } + }; + + each(this.edges, function (edge) { + var fromAlignmentId = edge.getFromAlignmentId(); + var toAlignmentId = edge.getToAlignmentId(); + + each(edge.renderedEdges, function (rEdge) { + addToBundle(rEdge, fromAlignmentId); + addToBundle(rEdge, toAlignmentId); + }); + }); + + var bundleSorter = function (a, b) { + var aId = a.patternIds || a.pathSegmentIds; + var bId = b.patternIds || b.pathSegmentIds; + + var aVector = a.getAlignmentVector(this.currentAlignmentId); + var bVector = b.getAlignmentVector(this.currentAlignmentId); + var isOutward = Util.isOutwardVector(aVector) && Util.isOutwardVector(bVector) ? 1 : -1; + + var abCompId = aId + '_' + bId; + if (abCompId in this.bundleComparisons) { + return isOutward * this.bundleComparisons[abCompId]; + } + + var baCompId = bId + '_' + aId; + if (baCompId in this.bundleComparisons) { + return isOutward * this.bundleComparisons[baCompId]; + } + + if (a.route && b.route && a.route.route_type !== b.route.route_type) { + return a.route.route_type > b.route.route_type ? 1 : -1; + } + + var isForward = a.forward && b.forward ? 1 : -1; + return isForward * isOutward * (aId < bId ? -1 : 1); + }.bind(this); + + each(alignmentBundles, function (alignmentId) { + var bundleArr = alignmentBundles[alignmentId]; + each(bundleArr, function (bundle) { + if (bundle.items.length <= 1) return; + var lw = 1.2; + var bundleWidth = lw * (bundle.items.length - 1); + + this.currentAlignmentId = alignmentId; + bundle.items.sort(bundleSorter); + each(bundle.items, function (rEdge, i) { + var offset = -bundleWidth / 2 + i * lw; + if (rEdge.getType() === 'TRANSIT') { + each(rEdge.patterns, function (pattern) { + pattern.offsetAlignment(alignmentId, offset); + }); + } else rEdge.offsetAlignment(alignmentId, offset); + }); + }, this); + }, this); +}; + +/** + * Traverses the graph vertex-by-vertex, creating comparisons between all pairs of + * edges for which a topological relationship can be established. + */ + +NetworkGraph.prototype.initComparisons = function () { + this.bundleComparisons = {}; + + each(this.vertices, function (vertex) { + var incidentGraphEdges = vertex.incidentEdges(); + + var angleREdges = {}; + each(incidentGraphEdges, function (incidentGraphEdge) { + var angle = incidentGraphEdge.fromVertex === vertex ? incidentGraphEdge.fromAngle : incidentGraphEdge.toAngle; + var angleDeg = 180 * angle / Math.PI; + if (!(angleDeg in angleREdges)) angleREdges[angleDeg] = []; + angleREdges[angleDeg] = angleREdges[angleDeg].concat(incidentGraphEdge.renderedEdges); + }); + + each(angleREdges, function (angle) { + var rEdges = angleREdges[angle]; + if (rEdges.length < 2) return; + for (var i = 0; i < rEdges.length - 1; i++) { + for (var j = i + 1; j < rEdges.length; j++) { + var re1 = rEdges[i]; + var re2 = rEdges[j]; + + var opp1 = re1.graphEdge.oppositeVertex(vertex); + var opp2 = re2.graphEdge.oppositeVertex(vertex); + + var ccw = Util.ccw(opp1.x, opp1.y, vertex.x, vertex.y, opp2.x, opp2.y); + + if (ccw === 0) { + var s1Ext = re1.findExtension(opp1); + var s2Ext = re2.findExtension(opp2); + if (s1Ext) opp1 = s1Ext.graphEdge.oppositeVertex(opp1); + if (s2Ext) opp2 = s2Ext.graphEdge.oppositeVertex(opp2); + ccw = Util.ccw(opp1.x, opp1.y, vertex.x, vertex.y, opp2.x, opp2.y); + } + + ccw = getInverse(re1, re2, vertex) * ccw; + + if (ccw > 0) { + // e1 patterns are 'less' than e2 patterns + this.storeComparison(re1, re2); + } + + if (ccw < 0) { + // e2 patterns are 'less' than e2 patterns + this.storeComparison(re2, re1); + } + } + } + }, this); + }, this); +}; + +function getInverse(s1, s2, vertex) { + return s1.graphEdge.toVertex === vertex && s2.graphEdge.toVertex === vertex || s1.graphEdge.toVertex === vertex && s2.graphEdge.fromVertex === vertex ? -1 : 1; +} + +NetworkGraph.prototype.storeComparison = function (s1, s2) { + var s1Id = s1.patternIds || s1.pathSegmentIds; + var s2Id = s2.patternIds || s2.pathSegmentIds; + debug('storing comparison: ' + s1Id + ' < ' + s2Id); + this.bundleComparisons[s1Id + '_' + s2Id] = -1; + this.bundleComparisons[s2Id + '_' + s1Id] = 1; +}; + +/** + * AlignmentBundle class + */ + +function AlignmentBundle() { + this.items = []; // RenderedEdges + this.min = Number.MAX_VALUE; + this.max = -Number.MAX_VALUE; +} + +AlignmentBundle.prototype.addEdge = function (rEdge, min, max) { + if (this.items.indexOf(rEdge) === -1) { + this.items.push(rEdge); + } + + this.min = Math.min(this.min, min); + this.max = Math.max(this.max, max); +}; + +AlignmentBundle.prototype.rangeOverlaps = function (min, max) { + return this.min < max && min < this.max; +}; + +/** + * Check if arrays are equal + */ + +function equal(a, b) { + if (a.length !== b.length) { + return false; + } + + for (var i in a) { + if (a[i] !== b[i]) { + return false; + } + } + + return true; +} + +},{"../point/multipoint":24,"../util":38,"./edge":14,"./edgegroup":15,"./vertex":17,"component-each":84,"d3":88,"debug":90}],17:[function(require,module,exports){ +'use strict'; + +/** + * Expose `Vertex` + */ + +module.exports = Vertex; + +/** + * Initialize new Vertex + * + * @param {Stop/Place} + * @param {Number} + * @param {Number} + */ + +var edgeId = 0; + +function Vertex(point, x, y) { + this.id = edgeId++; + this.point = point; + this.point.graphVertex = this; + this.x = this.origX = x; + this.y = this.origY = y; + this.edges = []; +} + +Vertex.prototype.getId = function () { + return this.id; +}; + +Vertex.prototype.getRenderX = function (display) { + return display.xScale(this.x) + this.point.placeOffsets.x; +}; + +Vertex.prototype.getRenderY = function (display) { + return display.yScale(this.y) + this.point.placeOffsets.y; +}; + +/** + * Move to new coordinate + * + * @param {Number} + * @param {Number} + */ + +Vertex.prototype.moveTo = function (x, y) { + this.x = x; + this.y = y; + /* this.edges.forEach(function (edge) { + edge.calculateVectors(); + }); */ +}; + +/** + * Get array of edges incident to vertex. Allows specification of "incoming" edge that will not be included in results + * + * @param {Edge} + */ + +Vertex.prototype.incidentEdges = function (inEdge) { + var results = []; + this.edges.forEach(function (edge) { + if (edge !== inEdge) results.push(edge); + }); + return results; +}; + +/** + * Add an edge to the vertex's edge list + * + * @param {Edge} + */ + +Vertex.prototype.addEdge = function (edge) { + var index = this.edges.indexOf(edge); + if (index === -1) this.edges.push(edge); +}; + +/** + * Remove an edge from the vertex's edge list + * + * @param {Edge} + */ + +Vertex.prototype.removeEdge = function (edge) { + var index = this.edges.indexOf(edge); + if (index !== -1) this.edges.splice(index, 1); +}; + +Vertex.prototype.toString = function () { + return 'Vertex ' + this.getId() + ' (' + (this.point ? this.point.toString() : 'no point assigned') + ')'; +}; + +},{}],18:[function(require,module,exports){ +'use strict'; + +/** + * Dependencies + */ + +var augment = require('augment'); +var each = require('component-each'); +var d3 = require('d3'); + +var SegmentLabel = require('./segmentlabel'); +var Util = require('../util'); + +/** + * Labeler object + */ + +var Labeler = augment(Object, function () { + this.constructor = function (transitive) { + this.transitive = transitive; + this.clear(); + }; + + this.clear = function (transitive) { + this.points = []; + }; + + this.updateLabelList = function (graph) { + this.points = []; + graph.vertices.forEach(function (vertex) { + var point = vertex.point; + if (point.getType() === 'PLACE' || point.getType() === 'MULTI' || point.getType() === 'STOP' && point.isSegmentEndPoint) { + this.points.push(point); + } + }, this); + + this.points.sort(function compare(a, b) { + if (a.containsFromPoint() || a.containsToPoint()) return -1; + if (b.containsFromPoint() || b.containsToPoint()) return 1; + return 0; + }); + }; + + this.updateQuadtree = function () { + this.quadtree = d3.geom.quadtree().extent([[-this.width, -this.height], [this.width * 2, this.height * 2]])([]); + + this.addPointsToQuadtree(); + // this.addSegmentsToQuadtree(); + }; + + this.addPointsToQuadtree = function () { + this.points.forEach(function (point) { + var mbbox = point.getMarkerBBox(); + if (mbbox) this.addBBoxToQuadtree(point.getMarkerBBox()); + }, this); + }; + + this.addSegmentsToQuadtree = function () { + this.transitive.renderSegments.forEach(function (segment) { + if (segment.getType() !== 'TRANSIT') return; + + var lw = this.transitive.style.compute(this.transitive.style.segments['stroke-width'], this.transitive.display, segment); + lw = parseFloat(lw.substring(0, lw.length - 2), 10) - 2; + + var x, x1, x2, y, y1, y2; + // debug(segment.toString()); + if (segment.renderData.length === 2) { + // basic straight segment + if (segment.renderData[0].x === segment.renderData[1].x) { + // vertical + x = segment.renderData[0].x - lw / 2; + y1 = segment.renderData[0].y; + y2 = segment.renderData[1].y; + this.addBBoxToQuadtree({ + x: x, + y: Math.min(y1, y2), + width: lw, + height: Math.abs(y1 - y2) + }); + } else if (segment.renderData[0].y === segment.renderData[1].y) { + // horizontal + x1 = segment.renderData[0].x; + x2 = segment.renderData[1].x; + y = segment.renderData[0].y - lw / 2; + this.addBBoxToQuadtree({ + x: Math.min(x1, x2), + y: y, + width: Math.abs(x1 - x2), + height: lw + }); + } + } + + if (segment.renderData.length === 4) { + // basic curved segment + + if (segment.renderData[0].x === segment.renderData[1].x) { + // vertical first + x = segment.renderData[0].x - lw / 2; + y1 = segment.renderData[0].y; + y2 = segment.renderData[3].y; + this.addBBoxToQuadtree({ + x: x, + y: Math.min(y1, y2), + width: lw, + height: Math.abs(y1 - y2) + }); + + x1 = segment.renderData[0].x; + x2 = segment.renderData[3].x; + y = segment.renderData[3].y - lw / 2; + this.addBBoxToQuadtree({ + x: Math.min(x1, x2), + y: y, + width: Math.abs(x1 - x2), + height: lw + }); + } else if (segment.renderData[0].y === segment.renderData[1].y) { + // horiz first + x1 = segment.renderData[0].x; + x2 = segment.renderData[3].x; + y = segment.renderData[0].y - lw / 2; + this.addBBoxToQuadtree({ + x: Math.min(x1, x2), + y: y, + width: Math.abs(x1 - x2), + height: lw + }); + + x = segment.renderData[3].x - lw / 2; + y1 = segment.renderData[0].y; + y2 = segment.renderData[3].y; + this.addBBoxToQuadtree({ + x: x, + y: Math.min(y1, y2), + width: lw, + height: Math.abs(y1 - y2) + }); + } + } + }, this); + }; + + this.addBBoxToQuadtree = function (bbox) { + if (bbox.x + bbox.width / 2 < 0 || bbox.x - bbox.width / 2 > this.width || bbox.y + bbox.height / 2 < 0 || bbox.y - bbox.height / 2 > this.height) return; + + this.quadtree.add([bbox.x + bbox.width / 2, bbox.y + bbox.height / 2, bbox]); + + this.maxBBoxWidth = Math.max(this.maxBBoxWidth, bbox.width); + this.maxBBoxHeight = Math.max(this.maxBBoxHeight, bbox.height); + }; + + this.doLayout = function () { + this.width = this.transitive.el.clientWidth; + this.height = this.transitive.el.clientHeight; + + this.maxBBoxWidth = 0; + this.maxBBoxHeight = 0; + + this.updateQuadtree(); + + var labeledSegments = this.placeSegmentLabels(); + var labeledPoints = this.placePointLabels(); + + return { + segments: labeledSegments, + points: labeledPoints + }; + }; + + this.placeSegmentLabels = function () { + each(this.segmentLabels, function (label) { + label.clear(); + }); + this.segmentLabels = []; + this.placedLabelKeys = []; + + // collect the bus RenderSegments + var busRSegments = []; + each(this.transitive.network.paths, function (path) { + each(path.getRenderedSegments(), function (rSegment) { + if (rSegment.type === 'TRANSIT' && rSegment.mode === 3) busRSegments.push(rSegment); + }); + }, this); + + var edgeGroups = []; + each(this.transitive.network.paths, function (path) { + each(path.segments, function (segment) { + if (segment.type === 'TRANSIT' && segment.getMode() === 3) { + edgeGroups = edgeGroups.concat(segment.getLabelEdgeGroups()); + } + }); + }, this); + + // iterate through the sequence collection, labeling as necessary + // each(busRSegments, function(rSegment) { + each(edgeGroups, function (edgeGroup) { + this.currentGroup = edgeGroup; + // get the array of label strings to be places (typically the unique route short names) + this.labelTextArray = edgeGroup.getLabelTextArray(); + + // create the initial label for placement + this.labelTextIndex = 0; + + var label = this.getNextLabel(); // this.constructSegmentLabel(rSegment, labelTextArray[labelTextIndex]); + if (!label) return; + + // iterate through potential anchor locations, attempting placement at each one + var labelAnchors = edgeGroup.getLabelAnchors(this.transitive.display, label.textHeight * 1.5); + for (var i = 0; i < labelAnchors.length; i++) { + label.labelAnchor = labelAnchors[i]; + + // do not consider this anchor if it is out of the display range + if (!this.transitive.display.isInRange(label.labelAnchor.x, label.labelAnchor.y)) continue; + + // check for conflicts with existing placed elements + var bbox = label.getBBox(); + var conflicts = this.findOverlaps(label, bbox); + + if (conflicts.length === 0) { + // if no conflicts + + // place the current label + this.segmentLabels.push(label); + this.quadtree.add([label.labelAnchor.x, label.labelAnchor.y, label]); + // debug('placing seg label for ' + label.labelText); + + label = this.getNextLabel(); + if (!label) break; + } + } // end of anchor iteration loop + }, this); // end of sequence iteration loop + }; + + this.getNextLabel = function () { + while (this.labelTextIndex < this.labelTextArray.length) { + var labelText = this.labelTextArray[this.labelTextIndex]; + var key = this.currentGroup.edgeIds + '_' + labelText; + if (this.placedLabelKeys.indexOf(key) !== -1) { + this.labelTextIndex++; + continue; + } + var label = this.constructSegmentLabel(this.currentGroup.renderedSegment, labelText); + this.placedLabelKeys.push(key); + this.labelTextIndex++; + return label; + } + return null; + }; + + this.constructSegmentLabel = function (segment, labelText) { + var label = new SegmentLabel(segment, labelText); + var styler = this.transitive.styler; + label.fontFamily = styler.compute(styler.labels['font-family'], this.transitive.display, { + segment: segment + }); + label.fontSize = styler.compute(styler.labels['font-size'], this.transitive.display, { + segment: segment + }); + var textBBox = Util.getTextBBox(labelText, { + 'font-size': label.fontSize, + 'font-family': label.fontFamily + }); + label.textWidth = textBBox.width; + label.textHeight = textBBox.height; + label.computeContainerDimensions(); + + return label; + }; + + this.placePointLabels = function () { + var styler = this.transitive.styler; + + var labeledPoints = []; + + this.points.forEach(function (point) { + var labelText = point.label.getText(); + point.label.fontFamily = styler.compute(styler.labels['font-family'], this.transitive.display, { + point: point + }); + point.label.fontSize = styler.compute(styler.labels['font-size'], this.transitive.display, { + point: point + }); + var textBBox = Util.getTextBBox(labelText, { + 'font-size': point.label.fontSize, + 'font-family': point.label.fontFamily + }); + point.label.textWidth = textBBox.width; + point.label.textHeight = textBBox.height; + + var orientations = styler.compute(styler.labels.orientations, this.transitive.display, { + point: point + }); + + var placedLabel = false; + for (var i = 0; i < orientations.length; i++) { + point.label.setOrientation(orientations[i]); + if (!point.focused) continue; + + if (!point.label.labelAnchor) continue; + + var lx = point.label.labelAnchor.x; + var ly = point.label.labelAnchor.y; + + // do not place label if out of range + if (lx <= 0 || ly <= 0 || lx >= this.width || ly > this.height) continue; + + var labelBBox = point.label.getBBox(); + + var overlaps = this.findOverlaps(point.label, labelBBox); + + // do not place label if it overlaps with others + if (overlaps.length > 0) continue; + + // if we reach this point, the label is good to place + + point.label.setVisibility(true); + labeledPoints.push(point); + + this.quadtree.add([labelBBox.x + labelBBox.width / 2, labelBBox.y + labelBBox.height / 2, point.label]); + + this.maxBBoxWidth = Math.max(this.maxBBoxWidth, labelBBox.width); + this.maxBBoxHeight = Math.max(this.maxBBoxHeight, labelBBox.height); + + placedLabel = true; + break; // do not consider any other orientations after places + } // end of orientation loop + + // if label not placed at all, hide the element + if (!placedLabel) { + point.label.setVisibility(false); + } + }, this); + return labeledPoints; + }; + + this.findOverlaps = function (label, labelBBox) { + var minX = labelBBox.x - this.maxBBoxWidth / 2; + var minY = labelBBox.y - this.maxBBoxHeight / 2; + var maxX = labelBBox.x + labelBBox.width + this.maxBBoxWidth / 2; + var maxY = labelBBox.y + labelBBox.height + this.maxBBoxHeight / 2; + // debug('findOverlaps %s,%s %s,%s', minX,minY,maxX,maxY); + + var matchItems = []; + this.quadtree.visit(function (node, x1, y1, x2, y2) { + var p = node.point; + if (p && p[0] >= minX && p[0] < maxX && p[1] >= minY && p[1] < maxY && label.intersects(p[2])) { + matchItems.push(p[2]); + } + return x1 > maxX || y1 > maxY || x2 < minX || y2 < minY; + }); + return matchItems; + }; + + this.findNearbySegmentLabels = function (label, x, y, buffer) { + var minX = x - buffer; + var minY = y - buffer; + var maxX = x + buffer; + var maxY = y + buffer; + // debug('findNearby %s,%s %s,%s', minX,minY,maxX,maxY); + + var matchItems = []; + this.quadtree.visit(function (node, x1, y1, x2, y2) { + var p = node.point; + if (p && p[0] >= minX && p[0] < maxX && p[1] >= minY && p[1] < maxY && p[2].parent && label.parent.patternIds === p[2].parent.patternIds) { + matchItems.push(p[2]); + } + return x1 > maxX || y1 > maxY || x2 < minX || y2 < minY; + }); + return matchItems; + }; +}); + +/** + * Expose `Labeler` + */ + +module.exports = Labeler; + +},{"../util":38,"./segmentlabel":22,"augment":42,"component-each":84,"d3":88}],19:[function(require,module,exports){ +'use strict'; + +/** + * Dependencies + */ + +var augment = require('augment'); + +/** + * Label object + */ + +var Label = augment(Object, function () { + this.constructor = function (parent) { + this.parent = parent; + this.sortableType = 'LABEL'; + }; + + this.getText = function () { + if (!this.labelText) this.labelText = this.initText(); + return this.labelText; + }; + + this.initText = function () { + return this.parent.getName(); + }; + + this.render = function (display) {}; + + this.refresh = function (display) {}; + + this.setVisibility = function (visibility) { + if (this.svgGroup) this.svgGroup.attr('visibility', visibility ? 'visible' : 'hidden'); + }; + + this.getBBox = function () { + return null; + }; + + this.intersects = function (obj) { + return null; + }; + + this.intersectsBBox = function (bbox) { + var thisBBox = this.getBBox(this.orientation); + var r = thisBBox.x <= bbox.x + bbox.width && bbox.x <= thisBBox.x + thisBBox.width && thisBBox.y <= bbox.y + bbox.height && bbox.y <= thisBBox.y + thisBBox.height; + return r; + }; + + this.isFocused = function () { + return this.parent.isFocused(); + }; + + this.getZIndex = function () { + return 1000000; + }; +}); + +/** + * Expose `Label` + */ + +module.exports = Label; + +},{"augment":42}],20:[function(require,module,exports){ +'use strict'; + +/** + * Dependencies + */ + +var each = require('component-each'); + +/** + * Expose `LabelEdgeGroup` + */ + +module.exports = LabelEdgeGroup; + +/** + * + */ + +function LabelEdgeGroup(renderedSegment) { + this.renderedSegment = renderedSegment; + this.renderedEdges = []; +} + +LabelEdgeGroup.prototype.addEdge = function (rEdge) { + this.renderedEdges.push(rEdge); + this.edgeIds = !this.edgeIds ? rEdge.getId() : this.edgeIds + ',' + rEdge.getId(); +}; + +LabelEdgeGroup.prototype.getLabelTextArray = function () { + var textArray = []; + each(this.renderedSegment.pathSegment.getPatterns(), function (pattern) { + var shortName = pattern.route.route_short_name; + if (textArray.indexOf(shortName) === -1) textArray.push(shortName); + }); + return textArray; +}; + +LabelEdgeGroup.prototype.getLabelAnchors = function (display, spacing) { + var labelAnchors = []; + var renderLen = this.getRenderLength(display); + var anchorCount = Math.floor(renderLen / spacing); + var pctSpacing = spacing / renderLen; + + for (var i = 0; i < anchorCount; i++) { + var t = i % 2 === 0 ? 0.5 + i / 2 * pctSpacing : 0.5 - (i + 1) / 2 * pctSpacing; + var coord = this.coordAlongRenderedPath(t, display); + if (coord) labelAnchors.push(coord); + } + + return labelAnchors; +}; + +LabelEdgeGroup.prototype.coordAlongRenderedPath = function (t, display) { + var renderLen = this.getRenderLength(display); + var loc = t * renderLen; + + var cur = 0; + for (var i = 0; i < this.renderedEdges.length; i++) { + var rEdge = this.renderedEdges[i]; + var edgeRenderLen = rEdge.graphEdge.getRenderLength(display); + if (loc <= cur + edgeRenderLen) { + var t2 = (loc - cur) / edgeRenderLen; + return rEdge.graphEdge.coordAlongEdge(t2, rEdge.renderData, display); + } + cur += edgeRenderLen; + } +}; + +LabelEdgeGroup.prototype.getRenderLength = function (display) { + if (!this.renderLength) { + this.renderLength = 0; + each(this.renderedEdges, function (rEdge) { + this.renderLength += rEdge.graphEdge.getRenderLength(display); + }, this); + } + return this.renderLength; +}; + +},{"component-each":84}],21:[function(require,module,exports){ +'use strict'; + +/** + * Dependencies + */ + +var augment = require('augment'); + +var Label = require('./label'); + +/** + * Label object + */ + +var PointLabel = augment(Label, function (base) { + this.constructor = function (parent) { + base.constructor.call(this, parent); + + this.labelAngle = 0; + this.labelPosition = 1; + }; + + this.initText = function () { + return this.parent.getName(); + }; + + this.render = function (display) { + this.svgGroup = display.svg.append('g'); // this.parent.labelSvg; + this.svgGroup.attr('class', 'transitive-sortable').datum({ + owner: this, + sortableType: 'POINT_LABEL' + }); + + var typeStr = this.parent.getType().toLowerCase(); + + this.mainLabel = this.svgGroup.append('text').datum({ + owner: this + }).attr('id', 'transitive-' + typeStr + '-label-' + this.parent.getId()).text(this.getText()).attr('font-size', this.fontSize).attr('font-family', this.fontFamily).attr('class', 'transitive-' + typeStr + '-label'); + }; + + this.refresh = function (display) { + if (!this.labelAnchor) return; + + if (!this.svgGroup) this.render(display); + + this.svgGroup.attr('text-anchor', this.labelPosition > 0 ? 'start' : 'end').attr('transform', function (d, i) { + return 'translate(' + this.labelAnchor.x + ',' + this.labelAnchor.y + ')'; + }.bind(this)); + + this.mainLabel.attr('transform', function (d, i) { + return 'rotate(' + this.labelAngle + ', 0, 0)'; + }.bind(this)); + }; + + this.setOrientation = function (orientation) { + this.orientation = orientation; + + var markerBBox = this.parent.getMarkerBBox(); + if (!markerBBox) return; + + var x, y; + var offset = 5; + + if (orientation === 'E') { + x = markerBBox.x + markerBBox.width + offset; + y = markerBBox.y + markerBBox.height / 2; + this.labelPosition = 1; + this.labelAngle = 0; + } else if (orientation === 'W') { + x = markerBBox.x - offset; + y = markerBBox.y + markerBBox.height / 2; + this.labelPosition = -1; + this.labelAngle = 0; + } else if (orientation === 'NE') { + x = markerBBox.x + markerBBox.width + offset; + y = markerBBox.y - offset; + this.labelPosition = 1; + this.labelAngle = -45; + } else if (orientation === 'SE') { + x = markerBBox.x + markerBBox.width + offset; + y = markerBBox.y + markerBBox.height + offset; + this.labelPosition = 1; + this.labelAngle = 45; + } else if (orientation === 'NW') { + x = markerBBox.x - offset; + y = markerBBox.y - offset; + this.labelPosition = -1; + this.labelAngle = 45; + } else if (orientation === 'SW') { + x = markerBBox.x - offset; + y = markerBBox.y + markerBBox.height + offset; + this.labelPosition = -1; + this.labelAngle = -45; + } else if (orientation === 'N') { + x = markerBBox.x + markerBBox.width / 2; + y = markerBBox.y - offset; + this.labelPosition = 1; + this.labelAngle = -90; + } else if (orientation === 'S') { + x = markerBBox.x + markerBBox.width / 2; + y = markerBBox.y + markerBBox.height + offset; + this.labelPosition = -1; + this.labelAngle = -90; + } + + this.labelAnchor = { + x: x, + y: y + }; + }; + + this.getBBox = function () { + if (this.orientation === 'E') { + return { + x: this.labelAnchor.x, + y: this.labelAnchor.y - this.textHeight, + width: this.textWidth, + height: this.textHeight + }; + } + + if (this.orientation === 'W') { + return { + x: this.labelAnchor.x - this.textWidth, + y: this.labelAnchor.y - this.textHeight, + width: this.textWidth, + height: this.textHeight + }; + } + + if (this.orientation === 'N') { + return { + x: this.labelAnchor.x - this.textHeight, + y: this.labelAnchor.y - this.textWidth, + width: this.textHeight, + height: this.textWidth + }; + } + + if (this.orientation === 'S') { + return { + x: this.labelAnchor.x - this.textHeight, + y: this.labelAnchor.y, + width: this.textHeight, + height: this.textWidth + }; + } + + var bboxSide = this.textWidth * Math.sqrt(2) / 2; + + if (this.orientation === 'NE') { + return { + x: this.labelAnchor.x, + y: this.labelAnchor.y - bboxSide, + width: bboxSide, + height: bboxSide + }; + } + + if (this.orientation === 'SE') { + return { + x: this.labelAnchor.x, + y: this.labelAnchor.y, + width: bboxSide, + height: bboxSide + }; + } + + if (this.orientation === 'NW') { + return { + x: this.labelAnchor.x - bboxSide, + y: this.labelAnchor.y - bboxSide, + width: bboxSide, + height: bboxSide + }; + } + + if (this.orientation === 'SW') { + return { + x: this.labelAnchor.x - bboxSide, + y: this.labelAnchor.y, + width: bboxSide, + height: bboxSide + }; + } + }; + + this.intersects = function (obj) { + if (obj instanceof Label) { + // todo: handle label-label intersection for diagonally placed labels separately + return this.intersectsBBox(obj.getBBox()); + } else if (obj.x && obj.y && obj.width && obj.height) { + return this.intersectsBBox(obj); + } + + return false; + }; + + this.runFocusTransition = function (display, callback) { + if (this.mainLabel) { + if (this.parent.isFocused()) this.setVisibility(true); + this.mainLabel.transition().style('opacity', this.parent.isFocused() ? 1 : 0).call(callback); + } + }; +}); + +/** + * Expose `PointLabel` + */ + +module.exports = PointLabel; + +},{"./label":19,"augment":42}],22:[function(require,module,exports){ +'use strict'; + +/** + * Dependencies + */ + +var augment = require('augment'); + +var Label = require('./label'); + +/** + * SegmentLabel object + */ + +var SegmentLabel = augment(Label, function (base) { + this.constructor = function (parent, text) { + base.constructor.call(this, parent); + this.labelText = text; + }; + + /* this.initText = function() { + return this.parent.patterns[0].route.route_short_name; + }; */ + + this.render = function (display) { + this.svgGroup = this.parent.labelSvg.append('g').attr('class', 'transitive-sortable').datum({ + owner: this, + sortableType: 'LABEL' + }); + + var padding = this.getPadding(); + + this.computeContainerDimensions(); + + this.containerSvg = this.svgGroup.append('rect').datum(this) // { segment: this.parent }) + .attr({ + width: this.containerWidth, + height: this.containerHeight + }).attr('id', 'transitive-segment-label-container-' + this.parent.getId()).text(this.getText()).attr('class', 'transitive-segment-label-container'); + + this.textSvg = this.svgGroup.append('text').datum(this) // { segment: this.parent }) + .attr('id', 'transitive-segment-label-' + this.parent.getId()).text(this.getText()).attr('class', 'transitive-segment-label').attr('font-size', this.fontSize).attr('font-family', this.fontFamily).attr('transform', function (d, i) { + return 'translate(' + padding + ', ' + (this.textHeight - padding * 2) + ')'; + }.bind(this)); + }; + + this.refresh = function (display) { + if (!this.labelAnchor) return; + + if (!this.svgGroup) this.render(display); + + this.svgGroup.attr('transform', function (d, i) { + var tx = this.labelAnchor.x - this.containerWidth / 2; + var ty = this.labelAnchor.y - this.containerHeight / 2; + return 'translate(' + tx + ',' + ty + ')'; + }.bind(this)); + }; + + this.getPadding = function () { + return this.textHeight * 0.1; + }; + + this.computeContainerDimensions = function () { + this.containerWidth = this.textWidth + this.getPadding() * 2; + this.containerHeight = this.textHeight; + }; + + this.getBBox = function () { + return { + x: this.labelAnchor.x - this.containerWidth / 2, + y: this.labelAnchor.y - this.containerHeight / 2, + width: this.containerWidth, + height: this.containerHeight + }; + }; + + this.intersects = function (obj) { + if (obj instanceof Label) { + // todo: handle label-label intersection for diagonally placed labels separately + return this.intersectsBBox(obj.getBBox()); + } else if (obj.x && obj.y && obj.width && obj.height) { + return this.intersectsBBox(obj); + } + + return false; + }; + + this.clear = function () { + this.labelAnchor = null; + if (this.svgGroup) { + this.svgGroup.remove(); + this.svgGroup = null; + } + }; +}); + +/** + * Expose `SegmentLabel` + */ + +module.exports = SegmentLabel; + +},{"./label":19,"augment":42}],23:[function(require,module,exports){ +'use strict'; + +var augment = require('augment'); +var each = require('component-each'); + +var PointLabel = require('../labeler/pointlabel'); + +var Point = augment(Object, function () { + this.constructor = function (data) { + for (var key in data) { + this[key] = data[key]; + } + + this.paths = []; + this.renderData = []; + + this.label = new PointLabel(this); + this.renderLabel = true; + + this.focused = true; + this.sortableType = 'POINT'; + + this.placeOffsets = { + x: 0, + y: 0 + }; + + this.zIndex = 10000; + }; + + /** + * Get unique ID for point -- must be defined by subclass + */ + + this.getId = function () {}; + + this.getElementId = function () { + return this.getType().toLowerCase() + '-' + this.getId(); + }; + + /** + * Get Point type -- must be defined by subclass + */ + + this.getType = function () {}; + + /** + * Get Point name + */ + + this.getName = function () { + return this.getType() + ' point (ID=' + this.getId() + ')'; + }; + + /** + * Get latitude + */ + + this.getLat = function () { + return 0; + }; + + /** + * Get longitude + */ + + this.getLon = function () { + return 0; + }; + + this.containsSegmentEndPoint = function () { + return false; + }; + + this.containsBoardPoint = function () { + return false; + }; + + this.containsAlightPoint = function () { + return false; + }; + + this.containsTransferPoint = function () { + return false; + }; + + this.getPatterns = function () { + return []; + }; + + /** + * Draw the point + * + * @param {Display} display + */ + + this.render = function (display) { + this.label.svgGroup = null; + }; + + /** + * Refresh a previously drawn point + * + * @param {Display} display + */ + + this.refresh = function (display) {}; + + this.addRenderData = function () {}; + + this.clearRenderData = function () {}; + + this.containsFromPoint = function () { + return false; + }; + + this.containsToPoint = function () { + return false; + }; + + this.initSvg = function (display) { + // set up the main svg group for this stop + this.svgGroup = display.svg.append('g').attr('id', 'transitive-' + this.getType().toLowerCase() + '-' + this.getId()) + // .attr('class', 'transitive-sortable') + .datum(this); + + this.markerSvg = this.svgGroup.append('g'); + this.labelSvg = this.svgGroup.append('g'); + }; + + //* * Shared geom utility functions **// + + this.constructMergedMarker = function (display) { + var dataArray = this.getRenderDataArray(); + var xValues = []; + var yValues = []; + dataArray.forEach(function (data) { + var x = data.x; // display.xScale(data.x) + data.offsetX; + var y = data.y; // display.yScale(data.y) - data.offsetY; + xValues.push(x); + yValues.push(y); + }); + var minX = Math.min.apply(Math, xValues); + var minY = Math.min.apply(Math, yValues); + var maxX = Math.max.apply(Math, xValues); + var maxY = Math.max.apply(Math, yValues); + + // retrieve marker type and radius from the styler + var markerType = display.styler.compute(display.styler.stops_merged['marker-type'], display, { + owner: this + }); + var stylerRadius = display.styler.compute(display.styler.stops_merged.r, display, { + owner: this + }); + + var width; + var height; + var r; + + // if this is a circle marker w/ a styler-defined fixed radius, use that + if (markerType === 'circle' && stylerRadius) { + width = height = stylerRadius * 2; + r = stylerRadius; + // otherwise, this is a dynamically-sized marker + } else { + var dx = maxX - minX; + var dy = maxY - minY; + + var markerPadding = display.styler.compute(display.styler.stops_merged['marker-padding'], display, { + owner: this + }) || 0; + + var patternRadius = display.styler.compute(display.styler[this.patternStylerKey].r, display, { + owner: this + }); + r = parseFloat(patternRadius) + markerPadding; + + if (markerType === 'circle') { + width = height = Math.max(dx, dy) + 2 * r; + r = width / 2; + } else { + width = dx + 2 * r; + height = dy + 2 * r; + if (markerType === 'rectangle') r = 0; + } + } + + return { + x: (minX + maxX) / 2 - width / 2, + y: (minY + maxY) / 2 - height / 2, + width: width, + height: height, + rx: r, + ry: r + }; + }; + + this.initMarkerData = function (display) { + if (this.getType() !== 'STOP' && this.getType() !== 'MULTI') return; + + this.mergedMarkerData = this.constructMergedMarker(display); + + this.placeOffsets = { + x: 0, + y: 0 + }; + if (this.adjacentPlace) { + var placeR = display.styler.compute(display.styler.places.r, display, { + owner: this.adjacentPlace + }); + + var placeX = display.xScale(this.adjacentPlace.worldX); + var placeY = display.yScale(this.adjacentPlace.worldY); + + var thisR = this.mergedMarkerData.width / 2; + var thisX = this.mergedMarkerData.x + thisR; + var thisY = this.mergedMarkerData.y + thisR; + + var dx = thisX - placeX; + var dy = thisY - placeY; + var dist = Math.sqrt(dx * dx + dy * dy); + + if (placeR + thisR > dist) { + var f = (placeR + thisR) / dist; + this.placeOffsets = { + x: dx * f - dx, + y: dy * f - dy + }; + + this.mergedMarkerData.x += this.placeOffsets.x; + this.mergedMarkerData.y += this.placeOffsets.y; + + each(this.graphVertex.incidentEdges(), function (edge) { + each(edge.renderSegments, function (segment) { + segment.refreshRenderData(display); + }); + }); + } + } + }; + + this.refreshLabel = function (display) { + if (!this.renderLabel) return; + this.label.refresh(display); + }; + + this.getMarkerBBox = function () { + return this.markerSvg.node().getBBox(); + }; + + this.setFocused = function (focused) { + this.focused = focused; + }; + + this.isFocused = function () { + return this.focused === true; + }; + + this.runFocusTransition = function (display, callback) {}; + + this.setAllPatternsFocused = function () {}; + + this.getZIndex = function () { + return this.zIndex; + }; + + this.getAverageCoord = function () { + var dataArray = this.getRenderDataArray(); + + var xTotal = 0; + var yTotal = 0; + each(dataArray, function (data) { + xTotal += data.x; + yTotal += data.y; + }); + + return { + x: xTotal / dataArray.length, + y: yTotal / dataArray.length + }; + }; + + this.hasRenderData = function () { + var dataArray = this.getRenderDataArray(); + return dataArray && dataArray.length > 0; + }; + + this.makeDraggable = function (transitive) {}; + + this.toString = function () { + return this.getType() + ' point: ' + this.getId() + ' (' + this.getName() + ')'; + }; +}); + +/** + * Expose `Point` + */ + +module.exports = Point; + +},{"../labeler/pointlabel":21,"augment":42,"component-each":84}],24:[function(require,module,exports){ +'use strict'; + +/** + * Dependencies + */ + +var augment = require('augment'); +var each = require('component-each'); + +var Point = require('./index'); + +/** + * MultiPoint: a Point subclass representing a collection of multiple points + * that have been merged into one for display purposes. + */ + +var MultiPoint = augment(Point, function (base) { + this.constructor = function (pointArray) { + base.constructor.call(this); + this.points = []; + if (pointArray) { + pointArray.forEach(function (point) { + this.addPoint(point); + }, this); + } + this.renderData = []; + this.id = 'multi'; + this.toPoint = this.fromPoint = null; + + this.patternStylerKey = 'multipoints_pattern'; + }; + + /** + * Get id + */ + + this.getId = function () { + return this.id; + }; + + /** + * Get type + */ + + this.getType = function () { + return 'MULTI'; + }; + + this.getName = function () { + if (this.fromPoint) return this.fromPoint.getName(); + if (this.toPoint) return this.toPoint.getName(); + var shortest = null; + this.points.forEach(function (point) { + if (point.getType() === 'TURN') return; + if (!shortest || point.getName().length < shortest.length) shortest = point.getName(); + }); + + return shortest; + }; + + this.containsSegmentEndPoint = function () { + for (var i = 0; i < this.points.length; i++) { + if (this.points[i].containsSegmentEndPoint()) return true; + } + return false; + }; + + this.containsBoardPoint = function () { + for (var i = 0; i < this.points.length; i++) { + if (this.points[i].containsBoardPoint()) return true; + } + return false; + }; + + this.containsAlightPoint = function () { + for (var i = 0; i < this.points.length; i++) { + if (this.points[i].containsAlightPoint()) return true; + } + return false; + }; + + this.containsTransferPoint = function () { + for (var i = 0; i < this.points.length; i++) { + if (this.points[i].containsTransferPoint()) return true; + } + return false; + }; + + this.containsFromPoint = function () { + return this.fromPoint !== null; + }; + + this.containsToPoint = function () { + return this.toPoint !== null; + }; + + this.getPatterns = function () { + var patterns = []; + + this.points.forEach(function (point) { + if (!point.patterns) return; + point.patterns.forEach(function (pattern) { + if (patterns.indexOf(pattern) === -1) patterns.push(pattern); + }); + }); + + return patterns; + }; + + this.addPoint = function (point) { + if (this.points.indexOf(point) !== -1) return; + this.points.push(point); + this.id += '-' + point.getId(); + if (point.containsFromPoint()) { + // getType() === 'PLACE' && point.getId() === 'from') { + this.fromPoint = point; + } + if (point.containsToPoint()) { + // getType() === 'PLACE' && point.getId() === 'to') { + this.toPoint = point; + } + this.calcWorldCoords(); + }; + + this.calcWorldCoords = function () { + var tx = 0; + var ty = 0; + each(this.points, function (point) { + tx += point.worldX; + ty += point.worldY; + }); + + this.worldX = tx / this.points.length; + this.worldY = ty / this.points.length; + }; + + /** + * Add render data + * + * @param {Object} stopInfo + */ + + this.addRenderData = function (pointInfo) { + if (pointInfo.offsetX !== 0 || pointInfo.offsetY !== 0) this.hasOffsetPoints = true; + this.renderData.push(pointInfo); + }; + + this.clearRenderData = function () { + this.hasOffsetPoints = false; + this.renderData = []; + }; + + /** + * Draw a multipoint + * + * @param {Display} display + */ + + this.render = function (display) { + base.render.call(this, display); + + if (!this.renderData) return; + + // set up the main svg group for this stop + this.initSvg(display); + this.svgGroup.attr('class', 'transitive-sortable').datum({ + owner: this, + sortableType: 'POINT_MULTI' + }); + + if (this.containsSegmentEndPoint()) this.initMergedMarker(display); + + // set up the pattern markers + /* this.marker = this.markerSvg.selectAll('circle') + .data(this.renderData) + .enter() + .append('circle') + .attr('class', 'transitive-multipoint-marker-pattern'); */ + }; + + this.initMergedMarker = function (display) { + // set up the merged marker + if (this.fromPoint || this.toPoint) { + this.mergedMarker = this.markerSvg.append('g').append('circle').datum({ + owner: this + }).attr('class', 'transitive-multipoint-marker-merged'); + } else if (this.hasOffsetPoints || this.renderData.length > 1) { + this.mergedMarker = this.markerSvg.append('g').append('rect').datum({ + owner: this + }).attr('class', 'transitive-multipoint-marker-merged'); + } + }; + + /** + * Refresh the point + * + * @param {Display} display + */ + + this.refresh = function (display) { + if (!this.renderData) return; + + // refresh the merged marker + if (this.mergedMarker) { + if (!this.mergedMarkerData) this.initMarkerData(display); + + this.mergedMarker.datum({ + owner: this + }); + this.mergedMarker.attr(this.mergedMarkerData); + } + + /* var cx, cy; + // refresh the pattern-level markers + this.marker.data(this.renderData); + this.marker.attr('transform', function (d, i) { + cx = d.x; + cy = d.y; + var x = display.xScale(d.x) + d.offsetX; + var y = display.yScale(d.y) - d.offsetY; + return 'translate(' + x +', ' + y +')'; + }); */ + }; + + this.getRenderDataArray = function () { + return this.renderData; + }; + + this.setFocused = function (focused) { + this.focused = focused; + each(this.points, function (point) { + point.setFocused(focused); + }); + }; + + this.runFocusTransition = function (display, callback) { + if (this.mergedMarker) { + var newStrokeColor = display.styler.compute(display.styler.multipoints_merged.stroke, display, { + owner: this + }); + this.mergedMarker.transition().style('stroke', newStrokeColor).call(callback); + } + if (this.label) this.label.runFocusTransition(display, callback); + }; +}); + +/** + * Expose `MultiPoint` + */ + +module.exports = MultiPoint; + +},{"./index":23,"augment":42,"component-each":84}],25:[function(require,module,exports){ +'use strict'; + +/** + * Dependencies + */ + +var augment = require('augment'); +var d3 = require('d3'); + +var Point = require('./index'); +var Util = require('../util'); + +var SphericalMercator = require('../util/spherical-mercator'); +var sm = new SphericalMercator(); + +/** + * Place: a Point subclass representing a 'place' that can be rendered on the + * map. A place is a point *other* than a transit stop/station, e.g. a home/work + * location, a point of interest, etc. + */ + +var Place = augment(Point, function (base) { + /** + * the constructor + */ + + this.constructor = function (data) { + base.constructor.call(this, data); + + if (data && data.place_lat && data.place_lon) { + var xy = Util.latLonToSphericalMercator(data.place_lat, data.place_lon); + this.worldX = xy[0]; + this.worldY = xy[1]; + } + + this.zIndex = 100000; + }; + + /** + * Get Type + */ + + this.getType = function () { + return 'PLACE'; + }; + + /** + * Get ID + */ + + this.getId = function () { + return this.place_id; + }; + + /** + * Get Name + */ + + this.getName = function () { + return this.place_name; + }; + + /** + * Get lat + */ + + this.getLat = function () { + return this.place_lat; + }; + + /** + * Get lon + */ + + this.getLon = function () { + return this.place_lon; + }; + + this.containsSegmentEndPoint = function () { + return true; + }; + + this.containsFromPoint = function () { + return this.getId() === 'from'; + }; + + this.containsToPoint = function () { + return this.getId() === 'to'; + }; + + this.addRenderData = function (pointInfo) { + this.renderData.push(pointInfo); + }; + + this.getRenderDataArray = function () { + return this.renderData; + }; + + this.clearRenderData = function () { + this.renderData = []; + }; + + /** + * Draw a place + * + * @param {Display} display + */ + + this.render = function (display) { + base.render.call(this, display); + if (!this.renderData) return; + + this.initSvg(display); + this.svgGroup.attr('class', 'transitive-sortable').datum({ + owner: this, + sortableType: 'POINT_PLACE' + }); + + // set up the markers + this.marker = this.markerSvg.append('circle').datum({ + owner: this + }).attr('class', 'transitive-place-circle'); + + var iconUrl = display.styler.compute(display.styler.places_icon['xlink:href'], display, { + owner: this + }); + if (iconUrl) { + this.icon = this.markerSvg.append('image').datum({ + owner: this + }).attr('class', 'transitive-place-icon').attr('xlink:href', iconUrl); + } + }; + + /** + * Refresh the place + * + * @param {Display} display + */ + + this.refresh = function (display) { + if (!this.renderData) return; + + // refresh the marker/icon + var x = display.xScale(this.worldX); + var y = display.yScale(this.worldY); + var translate = 'translate(' + x + ', ' + y + ')'; + this.marker.attr('transform', translate); + if (this.icon) this.icon.attr('transform', translate); + }; + + this.makeDraggable = function (transitive) { + var place = this; + var display = transitive.display; + var drag = d3.behavior.drag().on('dragstart', function () { + d3.event.sourceEvent.stopPropagation(); // silence other listeners + }).on('drag', function () { + if (place.graphVertex) { + var boundingRect = display.el.getBoundingClientRect(); + var x = display.xScale.invert(d3.event.sourceEvent.pageX - boundingRect.left); + var y = display.yScale.invert(d3.event.sourceEvent.pageY - boundingRect.top); + + place.worldX = x; + place.worldY = y; + var ll = sm.inverse([x, y]); + place.place_lon = ll[0]; + place.place_lat = ll[1]; + + place.refresh(display); + } + }).on('dragend', function () { + transitive.emit('place.' + place.getId() + '.dragend', place); + }); + this.markerSvg.call(drag); + }; +}); + +/** + * Expose `Place` + */ + +module.exports = Place; + +},{"../util":38,"../util/spherical-mercator":41,"./index":23,"augment":42,"d3":88}],26:[function(require,module,exports){ +'use strict'; + +/** + * Dependencies + */ + +var each = require('component-each'); + +/** + * Expose `PointCluster` + */ + +module.exports = PointCluster; + +/** + * + */ + +function PointCluster() { + this.points = []; +} + +PointCluster.prototype.addPoint = function (point) { + if (this.points.indexOf(point) === -1) this.points.push(point); +}; + +PointCluster.prototype.mergeVertices = function (graph) { + var vertices = []; + each(this.points, function (point) { + vertices.push(point.graphVertex); + }); + graph.mergeVertices(vertices); +}; + +},{"component-each":84}],27:[function(require,module,exports){ +'use strict'; + +/** + * Dependencies + */ + +var d3 = require('d3'); +var each = require('component-each'); + +var PointCluster = require('./pointcluster'); +var MultiPoint = require('./multipoint'); +var Util = require('../util'); + +/** + * Expose `PointClusterMap` + */ + +module.exports = PointClusterMap; + +/** + * + */ + +function PointClusterMap(transitive) { + this.transitive = transitive; + + this.clusters = []; + this.clusterLookup = {}; // maps Point object to its containing cluster + + var pointArr = []; + each(transitive.stops, function (key) { + var point = transitive.stops[key]; + if (point.used) pointArr.push(point); + }, this); + each(transitive.turnPoints, function (key) { + pointArr.push(transitive.turnPoints[key]); + }, this); + + var links = d3.geom.voronoi().x(function (d) { + return d.worldX; + }).y(function (d) { + return d.worldY; + }).links(pointArr); + + each(links, function (link) { + var dist = Util.distance(link.source.worldX, link.source.worldY, link.target.worldX, link.target.worldY); + if (dist < 100 && (link.source.getType() !== 'TURN' || link.target.getType() !== 'TURN')) { + var sourceInCluster = link.source in this.clusterLookup; + var targetInCluster = link.target in this.clusterLookup; + if (sourceInCluster && !targetInCluster) { + this.addPointToCluster(link.target, this.clusterLookup[link.source]); + } else if (!sourceInCluster && targetInCluster) { + this.addPointToCluster(link.source, this.clusterLookup[link.target]); + } else if (!sourceInCluster && !targetInCluster) { + var cluster = new PointCluster(); + this.clusters.push(cluster); + this.addPointToCluster(link.source, cluster); + this.addPointToCluster(link.target, cluster); + } + } + }, this); + + this.vertexPoints = []; + each(this.clusters, function (cluster) { + var multipoint = new MultiPoint(cluster.points); + this.vertexPoints.push(multipoint); + each(cluster.points, function (point) { + point.multipoint = multipoint; + }, this); + }, this); +} + +PointClusterMap.prototype.addPointToCluster = function (point, cluster) { + cluster.addPoint(point); + this.clusterLookup[point] = cluster; +}; + +PointClusterMap.prototype.clearMultiPoints = function () { + each(this.clusters, function (cluster) { + each(cluster.points, function (point) { + point.multipoint = null; + }, this); + }, this); +}; + +PointClusterMap.prototype.getVertexPoints = function (baseVertexPoints) { + if (!baseVertexPoints) return this.vertexPoints; + var vertexPoints = this.vertexPoints.concat(); + each(baseVertexPoints, function (point) { + if (!point.multipoint) vertexPoints.push(point); + }); + return vertexPoints; +}; + +},{"../util":38,"./multipoint":24,"./pointcluster":26,"component-each":84,"d3":88}],28:[function(require,module,exports){ +'use strict'; + +var _keys = require('babel-runtime/core-js/object/keys'); + +var _keys2 = _interopRequireDefault(_keys); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * Dependencies + */ + +var augment = require('augment'); +var each = require('component-each'); + +var Point = require('./index'); +var Util = require('../util'); + +/** + * Place: a Point subclass representing a 'place' that can be rendered on the + * map. A place is a point *other* than a transit stop/station, e.g. a home/work + * location, a point of interest, etc. + */ + +var Stop = augment(Point, function (base) { + this.constructor = function (data) { + base.constructor.call(this, data); + + if (data && data.stop_lat && data.stop_lon) { + var xy = Util.latLonToSphericalMercator(data.stop_lat, data.stop_lon); + this.worldX = xy[0]; + this.worldY = xy[1]; + } + + this.patterns = []; + + this.patternRenderData = {}; + this.patternFocused = {}; + this.patternCount = 0; + + this.patternStylerKey = 'stops_pattern'; + + this.isSegmentEndPoint = false; + }; + + /** + * Get id + */ + + this.getId = function () { + return this.stop_id; + }; + + /** + * Get type + */ + + this.getType = function () { + return 'STOP'; + }; + + /** + * Get name + */ + + this.getName = function () { + if (!this.stop_name) return 'Unnamed Stop (ID=' + this.getId() + ')'; + return this.stop_name; + }; + + /** + * Get lat + */ + + this.getLat = function () { + return this.stop_lat; + }; + + /** + * Get lon + */ + + this.getLon = function () { + return this.stop_lon; + }; + + this.containsSegmentEndPoint = function () { + return this.isSegmentEndPoint; + }; + + this.containsBoardPoint = function () { + return this.isBoardPoint; + }; + + this.containsAlightPoint = function () { + return this.isAlightPoint; + }; + + this.containsTransferPoint = function () { + return this.isTransferPoint; + }; + + this.getPatterns = function () { + return this.patterns; + }; + + this.addPattern = function (pattern) { + if (this.patterns.indexOf(pattern) === -1) this.patterns.push(pattern); + }; + + /** + * Add render data + * + * @param {Object} stopInfo + */ + + this.addRenderData = function (stopInfo) { + if (stopInfo.rEdge.getType() === 'TRANSIT') { + var s = { + sortableType: 'POINT_STOP_PATTERN', + owner: this, + getZIndex: function getZIndex() { + if (this.owner.graphVertex) { + return this.owner.getZIndex(); + } + return this.rEdge.getZIndex() + 1; + } + }; + + for (var key in stopInfo) { + s[key] = stopInfo[key]; + }var patternId = stopInfo.rEdge.patternIds; + this.patternRenderData[patternId] = s; // .push(s); + + each(stopInfo.rEdge.patterns, function (pattern) { + this.addPattern(pattern); + }, this); + } + this.patternCount = (0, _keys2.default)(this.patternRenderData).length; + }; + + this.isPatternFocused = function (patternId) { + if (!(patternId in this.patternFocused)) return true; + return this.patternFocused[patternId]; + }; + + this.setPatternFocused = function (patternId, focused) { + this.patternFocused[patternId] = focused; + }; + + this.setAllPatternsFocused = function (focused) { + for (var key in this.patternRenderData) { + this.patternFocused[key] = focused; + } + }; + + /** + * Draw a stop + * + * @param {Display} display + */ + + this.render = function (display) { + base.render.call(this, display); + if ((0, _keys2.default)(this.patternRenderData).length === 0) return; + + var renderDataArray = this.getRenderDataArray(); + + this.initSvg(display); + + // set up the merged marker + this.mergedMarker = this.markerSvg.append('g').append('rect').attr('class', 'transitive-sortable transitive-stop-marker-merged').datum(this.getMergedRenderData()); + + // set up the pattern-specific markers + this.patternMarkers = this.markerSvg.append('g').selectAll('circle').data(renderDataArray).enter().append('circle').attr('class', 'transitive-sortable transitive-stop-marker-pattern'); + }; + + /** + * Refresh the stop + * + * @param {Display} display + */ + + this.refresh = function (display) { + if (this.patternCount === 0) return; + + if (!this.mergedMarkerData) this.initMarkerData(display); + + // refresh the pattern-level markers + this.patternMarkers.data(this.getRenderDataArray()); + + this.patternMarkers.attr('transform', function (d, i) { + if (!isNaN(d.x) && !isNaN(d.y)) { + var x = d.x + this.placeOffsets.x; + var y = d.y + this.placeOffsets.y; + return 'translate(' + x + ', ' + y + ')'; + } + }.bind(this)); + + // refresh the merged marker + if (this.mergedMarker) { + this.mergedMarker.datum(this.getMergedRenderData()); + if (!isNaN(this.mergedMarkerData.x) && !isNaN(this.mergedMarkerData.y)) this.mergedMarker.attr(this.mergedMarkerData); + } + }; + + this.getMergedRenderData = function () { + return { + owner: this, + sortableType: 'POINT_STOP_MERGED' + }; + }; + + this.getRenderDataArray = function () { + var dataArray = []; + for (var patternId in this.patternRenderData) { + dataArray.push(this.patternRenderData[patternId]); + } + return dataArray; + }; + + this.getMarkerBBox = function () { + if (this.mergedMarker) return this.mergedMarkerData; + }; + + this.isFocused = function () { + if (this.mergedMarker || !this.patternRenderData) { + return this.focused === true; + } + + var focused = true; + for (var patternId in this.patternRenderData) { + focused = this && this.isPatternFocused(patternId); + } + return focused; + }; + + this.runFocusTransition = function (display, callback) { + if (this.mergedMarker) { + var newStrokeColor = display.styler.compute(display.styler.stops_merged.stroke, display, { + owner: this + }); + this.mergedMarker.transition().style('stroke', newStrokeColor).call(callback); + } + if (this.label) this.label.runFocusTransition(display, callback); + }; + + this.clearRenderData = function () { + this.patternRenderData = {}; + this.mergedMarkerData = null; + this.placeOffsets = { + x: 0, + y: 0 + }; + }; +}); + +/** + * Expose `Stop` + */ + +module.exports = Stop; + +},{"../util":38,"./index":23,"augment":42,"babel-runtime/core-js/object/keys":44,"component-each":84}],29:[function(require,module,exports){ +'use strict'; + +/** + * Dependencies + */ + +var augment = require('augment'); + +var Point = require('./index'); + +var SphericalMercator = require('../util/spherical-mercator'); +var sm = new SphericalMercator(); + +/** + * + */ + +var TurnPoint = augment(Point, function (base) { + this.constructor = function (data, id) { + base.constructor.call(this, data); + this.name = 'Turn @ ' + data.lat + ', ' + data.lon; + if (!this.worldX || !this.worldY) { + var smCoords = sm.forward([data.lon, data.lat]); + this.worldX = smCoords[0]; + this.worldY = smCoords[1]; + this.isSegmentEndPoint = false; + } + this.id = id; + }; + + this.getId = function () { + return this.id; + }; + + this.getType = function () { + return 'TURN'; + }; + + this.getName = function () { + return this.name; + }; + + this.containsSegmentEndPoint = function () { + return this.isSegmentEndPoint; + }; +}); + +/** + * Expose `TurnPoint` + */ + +module.exports = TurnPoint; + +},{"../util/spherical-mercator":41,"./index":23,"augment":42}],30:[function(require,module,exports){ +'use strict'; + +var augment = require('augment'); +var each = require('component-each'); + +var Renderer = require('./index'); + +/** + * A Renderer subclass for the default network rendering engine. + * + * @param {Object} the main Transitive object + */ + +var DefaultRenderer = augment(Renderer, function (base) { + this.constructor = function (transitive) { + base.constructor.call(this, transitive); + }; + + this.render = function () { + base.render.call(this); + + var self = this; + var display = this.transitive.display; + var network = this.transitive.network; + display.styler = this.transitive.styler; + + var legendSegments = {}; + + each(network.renderedEdges, function (rEdge) { + rEdge.refreshRenderData(display); + }); + + each(network.paths, function (path) { + each(path.segments, function (pathSegment) { + each(pathSegment.renderedSegments, function (renderedSegment) { + renderedSegment.render(display); + var legendType = renderedSegment.getLegendType(); + if (!(legendType in legendSegments)) { + legendSegments[legendType] = renderedSegment; + } + }); + }); + }); + + // draw the vertex-based points + + each(network.graph.vertices, function (vertex) { + vertex.point.render(display); + if (self.isDraggable(vertex.point)) { + vertex.point.makeDraggable(self.transitive); + } + }); + + // draw the edge-based points + each(network.graph.edges, function (edge) { + edge.pointArray.forEach(function (point) { + point.render(display); + }); + }); + + if (display.legend) display.legend.render(legendSegments); + + this.transitive.refresh(); + }; + + /** + * Refresh + */ + + this.refresh = function (panning) { + base.refresh.call(this, panning); + + var display = this.transitive.display; + var network = this.transitive.network; + var styler = this.transitive.styler; + + network.graph.vertices.forEach(function (vertex) { + vertex.point.clearRenderData(); + }); + network.graph.edges.forEach(function (edge) { + edge.clearRenderData(); + }); + + // refresh the segment and point marker data + this.refreshSegmentRenderData(); + network.graph.vertices.forEach(function (vertex) { + vertex.point.initMarkerData(display); + }); + + this.renderedSegments = []; + each(network.paths, function (path) { + each(path.segments, function (pathSegment) { + each(pathSegment.renderedSegments, function (rSegment) { + rSegment.refresh(display); + this.renderedSegments.push(rSegment); + }, this); + }, this); + }, this); + + network.graph.vertices.forEach(function (vertex) { + var point = vertex.point; + if (!point.svgGroup) return; // check if this point is not currently rendered + styler.stylePoint(display, point); + point.refresh(display); + }); + + // re-draw the edge-based points + network.graph.edges.forEach(function (edge) { + edge.pointArray.forEach(function (point) { + if (!point.svgGroup) return; // check if this point is not currently rendered + styler.styleStop(display, point); + point.refresh(display); + }); + }); + + // refresh the label layout + var labeledElements = this.transitive.labeler.doLayout(); + labeledElements.points.forEach(function (point) { + point.refreshLabel(display); + styler.stylePointLabel(display, point); + }); + each(this.transitive.labeler.segmentLabels, function (label) { + label.refresh(display); + styler.styleSegmentLabel(display, label); + }); + + this.sortElements(); + }; + + this.refreshSegmentRenderData = function () { + each(this.transitive.network.renderedEdges, function (rEdge) { + rEdge.refreshRenderData(this.transitive.display); + }, this); + + // try intersecting adjacent rendered edges to create a smooth transition + + var isectKeys = []; // keep track of edge-edge intersections we've already computed + each(this.transitive.network.paths, function (path) { + each(path.segments, function (pathSegment) { + each(pathSegment.renderedSegments, function (rSegment) { + for (var s = 0; s < rSegment.renderedEdges.length - 1; s++) { + var rEdge1 = rSegment.renderedEdges[s]; + var rEdge2 = rSegment.renderedEdges[s + 1]; + var key = rEdge1.getId() + '_' + rEdge2.getId(); + if (isectKeys.indexOf(key) !== -1) continue; + if (rEdge1.graphEdge.isInternal && rEdge2.graphEdge.isInternal) { + rEdge1.intersect(rEdge2); + } + isectKeys.push(key); + } + }); + }); + }); + }; + + /** + * sortElements + */ + + this.sortElements = function () { + this.renderedSegments.sort(function (a, b) { + return a.compareTo(b); + }); + + var focusBaseZIndex = 100000; + + this.renderedSegments.forEach(function (rSegment, index) { + rSegment.zIndex = index * 10 + (rSegment.isFocused() ? focusBaseZIndex : 0); + }); + + this.transitive.network.graph.vertices.forEach(function (vertex) { + var point = vertex.point; + point.zIndex = point.zIndex + (point.isFocused() ? focusBaseZIndex : 0); + }); + + this.transitive.display.svg.selectAll('.transitive-sortable').sort(function (a, b) { + var aIndex = typeof a.getZIndex === 'function' ? a.getZIndex() : a.owner.getZIndex(); + var bIndex = typeof b.getZIndex === 'function' ? b.getZIndex() : b.owner.getZIndex(); + return aIndex - bIndex; + }); + }; + + /** + * focusPath + */ + + this.focusPath = function (path) { + var self = this; + var pathRenderedSegments = []; + var graph = this.transitive.network.graph; + + if (path) { + // if we're focusing a specific path + pathRenderedSegments = path.getRenderedSegments(); + + // un-focus all internal points + graph.edges.forEach(function (edge) { + edge.pointArray.forEach(function (point, i) { + point.setAllPatternsFocused(false); + }); + }, this); + } else { + // if we're returing to 'all-focused' mode + // re-focus all internal points + graph.edges.forEach(function (edge) { + edge.pointArray.forEach(function (point, i) { + point.setAllPatternsFocused(true); + }); + }, this); + } + + var focusChangeSegments = []; + var focusedVertexPoints = []; + each(this.renderedSegments, function (rSegment) { + if (path && pathRenderedSegments.indexOf(rSegment) === -1) { + if (rSegment.isFocused()) focusChangeSegments.push(rSegment); + rSegment.setFocused(false); + } else { + if (!rSegment.isFocused()) focusChangeSegments.push(rSegment); + rSegment.setFocused(true); + focusedVertexPoints.push(rSegment.pathSegment.startVertex().point); + focusedVertexPoints.push(rSegment.pathSegment.endVertex().point); + } + }); + + var focusChangePoints = []; + graph.vertices.forEach(function (vertex) { + var point = vertex.point; + if (focusedVertexPoints.indexOf(point) !== -1) { + if (!point.isFocused()) focusChangePoints.push(point); + point.setFocused(true); + } else { + if (point.isFocused()) focusChangePoints.push(point); + point.setFocused(false); + } + }, this); + + // bring the focused elements to the front for the transition + // if (path) this.sortElements(); + + // create a transition callback function that invokes refresh() after all transitions complete + var n = 0; + var refreshOnEnd = function refreshOnEnd(transition, callback) { + transition.each(function () { + ++n; + }).each('end', function () { + if (! --n) self.transitive.refresh(); + }); + }; + + // run the transtions on the affected elements + each(focusChangeSegments, function (segment) { + segment.runFocusTransition(this.transitive.display, refreshOnEnd); + }, this); + + each(focusChangePoints, function (point) { + point.runFocusTransition(this.transitive.display, refreshOnEnd); + }, this); + }; +}); + +/** + * Expose `DefaultRenderer` + */ + +module.exports = DefaultRenderer; + +},{"./index":31,"augment":42,"component-each":84}],31:[function(require,module,exports){ +'use strict'; + +var augment = require('augment'); +var each = require('component-each'); + +var drawGrid = require('../display/draw-grid'); + +/** + * A superclass for a Transitive network rendering engine. + * + * @param {Object} the main Transitive object + */ + +var Renderer = augment(Object, function () { + this.constructor = function (transitive) { + this.transitive = transitive; + }; + + this.render = function () { + var display = this.transitive.display; + display.styler = this.transitive.styler; + + // remove all old svg elements + display.empty(); + }; + + /** + * Refresh + */ + + this.refresh = function (panning) { + var display = this.transitive.display; + var network = this.transitive.network; + + if (display.tileLayer) display.tileLayer.zoomed(); + + network.graph.vertices.forEach(function (vertex) { + vertex.point.clearRenderData(); + }); + network.graph.edges.forEach(function (edge) { + edge.clearRenderData(); + }); + + // draw the grid, if necessary + if (this.transitive.options.drawGrid) drawGrid(display, this.gridCellSize); + }; + + /** + * sortElements + */ + + this.sortElements = function () {}; + + /** + * focusPath + */ + + this.focusPath = function (path) {}; + + this.isDraggable = function (point) { + var draggableTypes = this.transitive.options.draggableTypes; + if (!draggableTypes) return false; + + var retval = false; + each(draggableTypes, function (type) { + if (type === point.getType()) { + // Return true in ether of the following cases: + // 1. No ID array is provided for this point type (i.e. entire type is draggable) + // 2. An ID array is provided and it includes this Point's ID + retval = !draggableTypes[type] || draggableTypes[type].indexOf(point.getId()) !== -1; + } + }); + return retval; + }; +}); + +/** + * Expose `Renderer` + */ + +module.exports = Renderer; + +},{"../display/draw-grid":10,"augment":42,"component-each":84}],32:[function(require,module,exports){ +'use strict'; + +var each = require('component-each'); + +var Util = require('../util'); + +var rEdgeId = 0; + +/** + * Expose `RenderedEdge` + */ + +module.exports = RenderedEdge; + +/** + * + */ + +function RenderedEdge(graphEdge, forward, type) { + this.id = rEdgeId++; + this.graphEdge = graphEdge; + this.forward = forward; + this.type = type; + this.points = []; + this.clearOffsets(); + this.focused = true; + this.sortableType = 'SEGMENT'; +} + +RenderedEdge.prototype.clearGraphData = function () { + this.graphEdge = null; + this.edgeFromOffset = 0; + this.edgeToOffset = 0; +}; + +RenderedEdge.prototype.addPattern = function (pattern) { + if (!this.patterns) this.patterns = []; + if (this.patterns.indexOf(pattern) !== -1) return; + this.patterns.push(pattern); + + // generate the patternIds field + this.patternIds = constuctIdListString(this.patterns); +}; + +RenderedEdge.prototype.addPathSegment = function (pathSegment) { + if (!this.pathSegments) this.pathSegments = []; + if (this.pathSegments.indexOf(pathSegment) !== -1) return; + this.pathSegments.push(pathSegment); + + // generate the pathSegmentIds field + this.pathSegmentIds = constuctIdListString(this.pathSegments); +}; + +function constuctIdListString(items) { + var idArr = []; + each(items, function (item) { + idArr.push(item.getId()); + }); + idArr.sort(); + return idArr.join(','); +} + +RenderedEdge.prototype.getId = function () { + return this.id; +}; + +RenderedEdge.prototype.getType = function () { + return this.type; +}; + +RenderedEdge.prototype.setFromOffset = function (offset) { + this.fromOffset = offset; +}; + +RenderedEdge.prototype.setToOffset = function (offset) { + this.toOffset = offset; +}; + +RenderedEdge.prototype.clearOffsets = function () { + this.fromOffset = 0; + this.toOffset = 0; +}; + +RenderedEdge.prototype.getAlignmentVector = function (alignmentId) { + if (this.graphEdge.getFromAlignmentId() === alignmentId) { + return this.graphEdge.fromVector; + } + if (this.graphEdge.getToAlignmentId() === alignmentId) { + return this.graphEdge.toVector; + } + return null; +}; + +RenderedEdge.prototype.offsetAlignment = function (alignmentId, offset) { + if (this.graphEdge.getFromAlignmentId() === alignmentId) { + this.setFromOffset(Util.isOutwardVector(this.graphEdge.fromVector) ? offset : -offset); + } + if (this.graphEdge.getToAlignmentId() === alignmentId) { + this.setToOffset(Util.isOutwardVector(this.graphEdge.toVector) ? offset : -offset); + } +}; + +RenderedEdge.prototype.setFocused = function (focused) { + this.focused = focused; +}; + +RenderedEdge.prototype.refreshRenderData = function (display) { + if (this.graphEdge.fromVertex.x === this.graphEdge.toVertex.x && this.graphEdge.fromVertex.y === this.graphEdge.toVertex.y) { + this.renderData = []; + return; + } + + this.lineWidth = this.computeLineWidth(display, true); + + var fromOffsetPx = this.fromOffset * this.lineWidth; + var toOffsetPx = this.toOffset * this.lineWidth; + + if (this.graphEdge.geomCoords) { + this.renderData = this.graphEdge.getGeometricCoords(fromOffsetPx, toOffsetPx, display, this.forward); + } else { + this.renderData = this.graphEdge.getRenderCoords(fromOffsetPx, toOffsetPx, display, this.forward); + } + + var firstRenderPoint = this.renderData[0]; + var lastRenderPoint = this.renderData[this.renderData.length - 1]; + + var pt; + if (!this.graphEdge.fromVertex.isInternal) { + pt = this.forward ? firstRenderPoint : lastRenderPoint; + if (pt) { + this.graphEdge.fromVertex.point.addRenderData({ + x: pt.x, + y: pt.y, + rEdge: this + }); + } + } + + pt = this.forward ? lastRenderPoint : firstRenderPoint; + if (pt) { + this.graphEdge.toVertex.point.addRenderData({ + x: pt.x, + y: pt.y, + rEdge: this + }); + } + + each(this.graphEdge.pointArray, function (point, i) { + if (point.getType() === 'TURN') return; + var t = (i + 1) / (this.graphEdge.pointArray.length + 1); + var coord = this.graphEdge.coordAlongEdge(this.forward ? t : 1 - t, this.renderData, display); + if (coord) { + point.addRenderData({ + x: coord.x, + y: coord.y, + rEdge: this + }); + } + }, this); +}; + +RenderedEdge.prototype.computeLineWidth = function (display, includeEnvelope) { + var styler = display.styler; + if (styler && display) { + // compute the line width + var env = styler.compute(styler.segments.envelope, display, this); + if (env && includeEnvelope) { + return parseFloat(env.substring(0, env.length - 2), 10) - 2; + } else { + var lw = styler.compute(styler.segments['stroke-width'], display, this); + return parseFloat(lw.substring(0, lw.length - 2), 10) - 2; + } + } +}; + +RenderedEdge.prototype.isFocused = function () { + return this.focused === true; +}; + +RenderedEdge.prototype.getZIndex = function () { + return 10000; +}; + +/** + * Computes the point of intersection between two adjacent, offset RenderedEdges (the + * edge the function is called on and a second egde passed as a parameter) + * by "extending" the adjacent edges and finding the point of intersection. If + * such a point exists, the existing renderData arrays for the edges are + * adjusted accordingly, as are any associated stops. + */ + +RenderedEdge.prototype.intersect = function (rEdge) { + // do no intersect adjacent edges of unequal bundle size + if (this.graphEdge.renderedEdges.length !== rEdge.graphEdge.renderedEdges.length) return; + + var commonVertex = this.graphEdge.commonVertex(rEdge.graphEdge); + if (!commonVertex || commonVertex.point.isSegmentEndPoint) return; + + var thisCheck = commonVertex === this.graphEdge.fromVertex && this.forward || commonVertex === this.graphEdge.toVertex && !this.forward; + var otherCheck = commonVertex === rEdge.graphEdge.fromVertex && rEdge.forward || commonVertex === rEdge.graphEdge.toVertex && !rEdge.forward; + + var p1 = thisCheck ? this.renderData[0] : this.renderData[this.renderData.length - 1]; + var v1 = this.graphEdge.getVector(commonVertex); + + var p2 = otherCheck ? rEdge.renderData[0] : rEdge.renderData[rEdge.renderData.length - 1]; + var v2 = rEdge.graphEdge.getVector(commonVertex); + + if (!p1 || !p2 || !v1 || !v2 || p1.x === p2.x && p1.y === p2.y) return; + + var isect = Util.lineIntersection(p1.x, p1.y, p1.x + v1.x, p1.y - v1.y, p2.x, p2.y, p2.x + v2.x, p2.y - v2.y); + + if (!isect.intersect) return; + + // adjust the endpoint of the first edge + if (thisCheck) { + this.renderData[0].x = isect.x; + this.renderData[0].y = isect.y; + } else { + this.renderData[this.renderData.length - 1].x = isect.x; + this.renderData[this.renderData.length - 1].y = isect.y; + } + + // adjust the endpoint of the second edge + if (otherCheck) { + rEdge.renderData[0].x = isect.x; + rEdge.renderData[0].y = isect.y; + } else { + rEdge.renderData[rEdge.renderData.length - 1].x = isect.x; + rEdge.renderData[rEdge.renderData.length - 1].y = isect.y; + } + + // update the point renderData + commonVertex.point.addRenderData({ + x: isect.x, + y: isect.y, + rEdge: this + }); +}; + +RenderedEdge.prototype.findExtension = function (vertex) { + var incidentEdges = vertex.incidentEdges(this.graphEdge); + var bundlerId = this.patternIds || this.pathSegmentIds; + for (var e = 0; e < incidentEdges.length; e++) { + var edgeSegments = incidentEdges[e].renderedEdges; + for (var s = 0; s < edgeSegments.length; s++) { + var segment = edgeSegments[s]; + var otherId = segment.patternIds || segment.pathSegmentIds; + if (bundlerId === otherId) { + return segment; + } + } + } +}; + +RenderedEdge.prototype.toString = function () { + return 'RenderedEdge ' + this.id + ' type=' + this.type + ' on ' + this.graphEdge.toString() + ' w/ patterns ' + this.patternIds + ' fwd=' + this.forward; +}; + +},{"../util":38,"component-each":84}],33:[function(require,module,exports){ +'use strict'; + +/** + * Dependencies + */ + +var d3 = require('d3'); +var each = require('component-each'); + +var interpolateLine = require('../util/interpolate-line'); + +/** + * Expose `RenderedSegment` + */ + +module.exports = RenderedSegment; + +var rSegmentId = 0; + +/** + * + */ + +function RenderedSegment(pathSegment) { + this.id = rSegmentId++; + this.renderedEdges = []; + this.pathSegment = pathSegment; + if (pathSegment) this.type = pathSegment.type; + this.focused = true; +} + +RenderedSegment.prototype.getId = function () { + return this.id; +}; + +RenderedSegment.prototype.getType = function () { + return this.type; +}; + +RenderedSegment.prototype.addRenderedEdge = function (rEdge) { + this.renderedEdges.push(rEdge); +}; + +RenderedSegment.prototype.render = function (display) { + this.line = d3.svg.line() // the line translation function + .x(function (data, i) { + return data.x; + }).y(function (data, i) { + return data.y; + }).interpolate(interpolateLine.bind({ + segment: this, + display: display + })); + + this.svgGroup = display.svg.append('g'); + + this.lineSvg = this.svgGroup.append('g').attr('class', 'transitive-sortable').datum({ + owner: this, + sortableType: 'SEGMENT' + }); + + this.labelSvg = this.svgGroup.append('g'); + + this.lineGraph = this.lineSvg.append('path'); + + this.lineGraph.attr('class', 'transitive-line').data([this]); + + this.lineGraphFront = this.lineSvg.append('path'); + + this.lineGraphFront.attr('class', 'transitive-line-front').data([this]); + + if (display.haloLayer) { + this.lineGraphHalo = display.haloLayer.append('path'); + + this.lineGraphHalo.attr('class', 'transitive-line-halo').data([this]); + } +}; + +RenderedSegment.prototype.refresh = function (display, renderData) { + if (renderData) { + this.renderData = renderData; + } else { + this.renderData = []; + each(this.renderedEdges, function (rEdge) { + this.renderData = this.renderData.concat(rEdge.renderData); + }, this); + } + + var lineData = this.line(this.renderData); + this.lineGraph.attr('d', lineData); + this.lineGraphFront.attr('d', lineData); + if (this.lineGraphHalo) this.lineGraphHalo.attr('d', lineData); + display.styler.styleSegment(display, this); +}; + +RenderedSegment.prototype.setFocused = function (focused) { + this.focused = focused; +}; + +RenderedSegment.prototype.isFocused = function () { + return this.focused; +}; + +RenderedSegment.prototype.runFocusTransition = function (display, callback) { + var newColor = display.styler.compute(display.styler.segments.stroke, display, this); + this.lineGraph.transition().style('stroke', newColor).call(callback); +}; + +RenderedSegment.prototype.getZIndex = function () { + return this.zIndex; +}; + +RenderedSegment.prototype.computeLineWidth = function (display, includeEnvelope) { + var styler = display.styler; + if (styler && display) { + // compute the line width + var env = styler.compute(styler.segments.envelope, display, this); + if (env && includeEnvelope) { + return parseFloat(env.substring(0, env.length - 2), 10) - 2; + } else { + var lw = styler.compute(styler.segments['stroke-width'], display, this); + return parseFloat(lw.substring(0, lw.length - 2), 10) - 2; + } + } +}; + +RenderedSegment.prototype.compareTo = function (other) { + // show transit segments in front of other types + if (this.type === 'TRANSIT' && other.type !== 'TRANSIT') return -1; + if (other.type === 'TRANSIT' && this.type !== 'TRANSIT') return 1; + + if (this.type === 'TRANSIT' && other.type === 'TRANSIT') { + // for two transit segments, try sorting transit mode first + if (this.mode && other.mode && this.mode !== other.mode) { + return this.mode > other.mode; + } + + // for two transit segments of the same mode, sort by id (for display consistency) + return this.getId() < other.getId(); + } +}; + +RenderedSegment.prototype.getLabelTextArray = function () { + var textArray = []; + each(this.patterns, function (pattern) { + var shortName = pattern.route.route_short_name; + if (textArray.indexOf(shortName) === -1) textArray.push(shortName); + }); + return textArray; +}; + +RenderedSegment.prototype.getLabelAnchors = function (display, spacing) { + var labelAnchors = []; + this.computeRenderLength(display); + var anchorCount = Math.floor(this.renderLength / spacing); + var pctSpacing = spacing / this.renderLength; + + for (var i = 0; i < anchorCount; i++) { + var t = i % 2 === 0 ? 0.5 + i / 2 * pctSpacing : 0.5 - (i + 1) / 2 * pctSpacing; + var coord = this.coordAlongRenderedPath(t, display); + if (coord) labelAnchors.push(coord); + } + + return labelAnchors; +}; + +RenderedSegment.prototype.coordAlongRenderedPath = function (t, display) { + var loc = t * this.renderLength; + + var cur = 0; + for (var i = 0; i < this.renderedEdges.length; i++) { + var rEdge = this.renderedEdges[i]; + var edgeRenderLen = rEdge.graphEdge.getRenderLength(display); + if (loc <= cur + edgeRenderLen) { + var t2 = (loc - cur) / edgeRenderLen; + return rEdge.graphEdge.coordAlongEdge(t2, rEdge.renderData, display); + } + cur += edgeRenderLen; + } +}; + +RenderedSegment.prototype.computeRenderLength = function (display) { + this.renderLength = 0; + each(this.renderedEdges, function (rEdge) { + this.renderLength += rEdge.graphEdge.getRenderLength(display); + }, this); +}; + +RenderedSegment.prototype.getLegendType = function () { + if (this.type === 'TRANSIT') { + return this.type + '_' + this.mode; + } + return this.type; +}; + +RenderedSegment.prototype.toString = function () { + return 'RenderedSegment ' + this.id + ' on ' + (this.pathSegment ? this.pathSegment.toString() : ' (null segment)'); +}; + +},{"../util/interpolate-line":39,"component-each":84,"d3":88}],34:[function(require,module,exports){ +'use strict'; + +var d3 = require('d3'); +var augment = require('augment'); +var each = require('component-each'); + +var Renderer = require('./index'); +var Point = require('../point/index'); + +var interpolateLine = require('../util/interpolate-line'); + +/** + * A Renderer subclass for drawing a simplified representation of the graph + * itself, i.e. just the edges and vertices. + * + * @param {Object} the main Transitive object + */ + +var WireframeRenderer = augment(Renderer, function (base) { + this.constructor = function (transitive) { + base.constructor.call(this, transitive); + }; + + this.render = function () { + base.render.call(this); + + var graph = this.transitive.network.graph; + + var self = this; + + this.wireframeEdges = []; + each(graph.edges, function (edge) { + var wfEdge = new WireframeEdge(edge); + wfEdge.render(self.transitive.display); + self.wireframeEdges.push(wfEdge); + }); + + this.wireframeVertices = []; + each(graph.vertices, function (vertex) { + var wfVertex = new WireframeVertex(vertex); + wfVertex.render(self.transitive.display); + self.wireframeVertices.push(wfVertex); + }); + + this.transitive.refresh(); + }; + + this.refresh = function (panning) { + base.refresh.call(this, panning); + var self = this; + + each(this.wireframeEdges, function (wfEdge) { + wfEdge.refresh(self.transitive.display); + }); + + each(this.wireframeVertices, function (wfVertex) { + wfVertex.refresh(self.transitive.display); + }); + }; + + /** + * sortElements + */ + + this.sortElements = function () {}; +}); + +/** + * Expose `WireframeRenderer` + */ + +module.exports = WireframeRenderer; + +/** + * WireframeVertex helper class + */ + +var WireframeVertex = augment(Point, function (base) { + this.constructor = function (vertex) { + base.constructor.call(this, { + vertex: vertex + }); + }; + + this.getType = function () { + return 'WIREFRAME_VERTEX'; + }; + + /** + * Draw the vertex + * + * @param {Display} display + */ + + this.render = function (display) { + base.render.call(this, display); + + this.initSvg(display); + this.svgGroup.attr('class', 'transitive-sortable').datum({ + owner: this, + sortableType: 'POINT_WIREFRAME_VERTEX' + }); + + // set up the marker + this.marker = this.markerSvg.append('circle').datum({ + owner: this + }).attr('class', 'transitive-wireframe-vertex-circle'); + }; + + /** + * Refresh the vertex + * + * @param {Display} display + */ + + this.refresh = function (display) { + var x = display.xScale(this.vertex.x); + var y = display.yScale(this.vertex.y); + var translate = 'translate(' + x + ', ' + y + ')'; + this.marker.attr('transform', translate); + display.styler.styleWireframeVertex(display, this); + }; +}); + +/** + * WireframeEdge helper class + */ + +var WireframeEdge = augment(Object, function () { + this.constructor = function (edge) { + this.edge = edge; + }; + + this.render = function (display) { + this.line = d3.svg.line() // the line translation function + .x(function (data, i) { + return data.x; + }).y(function (data, i) { + return data.y; + }).interpolate(interpolateLine.bind({ + segment: this, + display: display + })); + + this.svgGroup = display.svg.append('g'); + + this.lineSvg = this.svgGroup.append('g').attr('class', 'transitive-sortable').datum({ + owner: this, + sortableType: 'WIREFRAME_EDGE' + }); + + this.lineGraph = this.lineSvg.append('path').attr('class', 'transitive-wireframe-edge-line'); + }; + + this.refresh = function (display) { + this.renderData = this.edge.getRenderCoords(0, 0, display, true); + var lineData = this.line(this.renderData); + this.lineGraph.attr('d', lineData); + display.styler.styleWireframeEdge(display, this); + }; +}); + +},{"../point/index":23,"../util/interpolate-line":39,"./index":31,"augment":42,"component-each":84,"d3":88}],35:[function(require,module,exports){ +'use strict'; + +var _assign = require('babel-runtime/core-js/object/assign'); + +var _assign2 = _interopRequireDefault(_assign); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +var Route = require('../core/route'); +var RoutePattern = require('../core/pattern'); +var Util = require('../util'); + +var styles = require('./styles'); + +/** + * Element Types + */ + +var types = ['labels', 'segments', 'segments_front', 'segments_halo', 'segment_labels', 'segment_label_containers', 'stops_merged', 'stops_pattern', 'places', 'places_icon', 'multipoints_merged', 'multipoints_pattern', 'wireframe_vertices', 'wireframe_edges']; + +/** + * SVG attributes + */ + +var svgAttributes = ['height', 'target', 'title', 'width', 'y1', 'y2', 'x1', 'x2', 'cx', 'cy', 'dx', 'dy', 'rx', 'ry', 'd', 'r', 'y', 'x', 'transform']; + +/** + * Expose `Styler` + */ + +module.exports = Styler; + +/** + * Styler object + */ + +function Styler(styles) { + if (!(this instanceof Styler)) return new Styler(styles); + + // reset styles + this.reset(); + + // load styles + if (styles) this.load(styles); +} + +/** + * Clear all current styles + */ + +Styler.prototype.clear = function () { + for (var i in types) { + this[types[i]] = {}; + } +}; + +/** + * Reset to the predefined styles + */ + +Styler.prototype.reset = function () { + for (var i in types) { + var type = types[i]; + this[type] = (0, _assign2.default)({}, styles[type] || {}); + for (var key in this[type]) { + if (!Array.isArray(this[type][key])) this[type][key] = [this[type][key]]; + } + } +}; + +/** + * Load rules + * + * @param {Object} a set of style rules + */ + +Styler.prototype.load = function (styles) { + for (var i in types) { + var type = types[i]; + if (styles[type]) { + for (var key in styles[type]) { + this[type][key] = (this[type][key] || []).concat(styles[type][key]); + } + } + } +}; + +/** + * Style a Segment using the rules defined in styles.js or the Transitive options + * + * @param {Display} Transitive Display object + * @param {RenderedSegment} Transitive RenderedSegment object + */ + +Styler.prototype.styleSegment = function (display, segment) { + if (segment.lineGraphHalo) { + this.applyAttrAndStyle(display, segment.lineGraphHalo, this.segments_halo); + } + + this.applyAttrAndStyle(display, segment.lineGraph, this.segments); + + this.applyAttrAndStyle(display, segment.lineGraphFront, this.segments_front); +}; + +/** + * Style a WireframeEdge using the rules defined in styles.js or the Transitive options + * + * @param {Display} Transitive Display object + * @param {WireframeEdge} Transitive WireframeEdge object + */ + +Styler.prototype.styleWireframeEdge = function (display, wfEdge) { + this.applyAttrAndStyle(display, wfEdge.svgGroup.selectAll('.transitive-wireframe-edge-line'), this.wireframe_edges); +}; + +/** + * Style a Point using the rules defined in styles.js or the Transitive options + * + * @param {Display} Transitive Display object + * @param {Point} Transitive Point object + */ + +Styler.prototype.stylePoint = function (display, point) { + if (point.getType() === 'STOP') this.styleStop(display, point); + if (point.getType() === 'PLACE') this.stylePlace(display, point); + if (point.getType() === 'MULTI') this.styleMultiPoint(display, point); + if (point.getType() === 'WIREFRAME_VERTEX') this.styleWireframeVertex(display, point); +}; + +/** + * Style a Stop using the rules defined in styles.js or the Transitive options + * + * @param {Display} Transitive Display object + * @param {Stop} Transitive Stop object + */ + +Styler.prototype.styleStop = function (display, stop) { + this.applyAttrAndStyle(display, stop.patternMarkers, this.stops_pattern); + + this.applyAttrAndStyle(display, stop.mergedMarker, this.stops_merged); + + this.applyAttrAndStyle(display, stop.svgGroup.selectAll('.transitive-stop-label'), this.labels); +}; + +/** + * Style a Place using the rules defined in styles.js or the Transitive options + * + * @param {Display} Transitive Display object + * @param {Place} Transitive Place object + */ + +Styler.prototype.stylePlace = function (display, place) { + this.applyAttrAndStyle(display, place.svgGroup.selectAll('.transitive-place-circle'), this.places); + + this.applyAttrAndStyle(display, place.svgGroup.selectAll('.transitive-place-icon'), this.places_icon); + + this.applyAttrAndStyle(display, place.svgGroup.selectAll('.transitive-place-label'), this.labels); +}; + +/** + * Style a MultiPoint using the rules defined in styles.js or the Transitive options + * + * @param {Display} Transitive Display object + * @param {MultiPoint} Transitive MultiPoint object + */ + +Styler.prototype.styleMultiPoint = function (display, multipoint) { + this.applyAttrAndStyle(display, multipoint.svgGroup.selectAll('.transitive-multipoint-marker-pattern'), this.multipoints_pattern); + + this.applyAttrAndStyle(display, multipoint.svgGroup.selectAll('.transitive-multipoint-marker-merged'), this.multipoints_merged); + + this.applyAttrAndStyle(display, multipoint.svgGroup.selectAll('.transitive-multi-label'), this.labels); +}; + +/** + * Style a WireframeVertex using the rules defined in styles.js or the Transitive options + * + * @param {Display} Transitive Display object + * @param {WireframeVertex} Transitive WireframeVertex object + */ + +Styler.prototype.styleWireframeVertex = function (display, wfVertex) { + this.applyAttrAndStyle(display, wfVertex.svgGroup.selectAll('.transitive-wireframe-vertex-circle'), this.wireframe_vertices); +}; + +/** + * Style a Point label using the rules defined in styles.js or the Transitive options + * + * @param {Display} Transitive Display object + * @param {Point} Transitive Point object + */ + +Styler.prototype.stylePointLabel = function (display, point) { + var pointType = point.getType().toLowerCase(); + + this.applyAttrAndStyle(display, point.svgGroup.selectAll('.transitive-' + pointType + '-label'), this.labels); +}; + +/** + * Style a Segment label using the rules defined in styles.js or the Transitive options + * + * @param {Display} Transitive Display object + * @param {SegmentLabel} Transitive SegmentLabel object + */ + +Styler.prototype.styleSegmentLabel = function (display, label) { + this.applyAttrAndStyle(display, label.svgGroup.selectAll('.transitive-segment-label-container'), this.segment_label_containers); + this.applyAttrAndStyle(display, label.svgGroup.selectAll('.transitive-segment-label'), this.segment_labels); +}; + +/** + * Check if it's an attribute or a style and apply accordingly + * + * @param {Display} the Display object + * @param {Object} a D3 list of elements + * @param {Object} the list of attributes + */ + +Styler.prototype.applyAttrAndStyle = function (display, elements, attributes) { + for (var name in attributes) { + var rules = attributes[name]; + var fn = svgAttributes.indexOf(name) === -1 ? 'style' : 'attr'; + + this.applyRules(display, elements, name, rules, fn); + } +}; + +/** + * Apply style/attribute rules to a list of elements + * + * @param {Display} display object + * @param {Object} elements + * @param {String} rule name + * @param {Array} rules + * @param {String} style/attr + */ + +Styler.prototype.applyRules = function (display, elements, name, rules, fn) { + var self = this; + elements[fn](name, function (data, index) { + return self.compute(rules, display, data, index); + }); +}; + +/** + * Compute a style rule based on the current display and data + * + * @param {Array} array of rules + * @param {Object} the Display object + * @param {Object} data associated with this object + * @param {Number} index of this object + */ + +Styler.prototype.compute = function (rules, display, data, index) { + var computed; + var self = this; + for (var i in rules) { + var rule = rules[i]; + var val = isFunction(rule) ? rule.call(self, display, data, index, styles.utils) : rule; + if (val !== undefined && val !== null) computed = val; + } + return computed; +}; + +/** + * Return the collection of default segment styles for a mode. + * + * @param {String} an OTP mode string + */ + +Styler.prototype.getModeStyles = function (mode, display) { + var modeStyles = {}; + + // simulate a segment w/ the specified style + var segment = { + focused: true, + isFocused: function isFocused() { + return true; + } + }; + + if (mode === 'WALK' || mode === 'BICYCLE' || mode === 'BICYCLE_RENT' || mode === 'CAR') { + segment.type = mode; + } else { + // assume a transit mode + segment.type = 'TRANSIT'; + segment.mode = Util.otpModeToGtfsType(mode); + var route = new Route({ + route_type: segment.mode, + agency_id: '', + route_id: '', + route_short_name: '', + route_long_name: '' + }); + var pattern = new RoutePattern({}); + route.addPattern(pattern); + segment.patterns = [pattern]; + } + + for (var attrName in this.segments) { + var rules = this.segments[attrName]; + for (var i in rules) { + var rule = rules[i]; + var val = isFunction(rule) ? rule.call(this, display, segment, 0, styles.utils) : rule; + if (val !== undefined && val !== null) { + modeStyles[attrName] = val; + } + } + } + + return modeStyles; +}; + +/** + * Is function? + */ + +function isFunction(val) { + return Object.prototype.toString.call(val) === '[object Function]'; +} + +},{"../core/pattern":6,"../core/route":8,"../util":38,"./styles":36,"babel-runtime/core-js/object/assign":43}],36:[function(require,module,exports){ +'use strict'; + +var _assign = require('babel-runtime/core-js/object/assign'); + +var _assign2 = _interopRequireDefault(_assign); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +var d3 = require('d3'); + +/** + * Scales for utility functions to use + */ + +var zoomScale = d3.scale.linear().domain([0.25, 1, 4]); +var strokeScale = d3.scale.linear().domain([0.25, 1, 4]).range([5, 12, 19]); +var fontScale = d3.scale.linear().domain([0.25, 1, 4]).range([10, 14, 18]); + +/** + * Scales for utility functions to use + */ + +var notFocusedColor = '#e0e0e0'; + +/** + * Expose `utils` for the style functions to use + */ + +exports.utils = { + pixels: function pixels(zoom, min, normal, max) { + return zoomScale.range([min, normal, max])(zoom); + }, + strokeWidth: function strokeWidth(display) { + return strokeScale(display.zoom.scale()); + }, + fontSize: function fontSize(display, data) { + return Math.floor(fontScale(display.zoom.scale())); + }, + defineSegmentCircleMarker: function defineSegmentCircleMarker(display, segment, radius, fillColor) { + var markerId = 'circleMarker-' + segment.getId(); + display.svg.append('defs').append('svg:marker').attr('id', markerId).attr('refX', radius).attr('refY', radius).attr('markerWidth', radius * 2).attr('markerHeight', radius * 2).attr('markerUnits', 'userSpaceOnUse').append('svg:circle').attr('cx', radius).attr('cy', radius).attr('r', radius).attr('fill', segment.focused ? fillColor : notFocusedColor); + + return 'url(#' + markerId + ')'; + } +}; + +/** + * Default Wireframe Edge/Vertex Rules + */ + +exports.wireframe_vertices = { + cx: 0, + cy: 0, + r: 3, + fill: '#000' +}; + +exports.wireframe_edges = { + stroke: '#444', + 'stroke-width': 2, + 'stroke-dasharray': '3px 2px', + fill: 'none' +}; + +/** + * Default Merged Stops Rules + */ + +var stopsMerged = exports.stops_merged = { + fill: function fill(display, data, index, utils) { + return '#fff'; + }, + r: function r(display, data, index, utils) { + return utils.pixels(display.zoom.scale(), 8, 12, 16); + }, + stroke: function stroke(display, data, index, utils) { + var point = data.owner; + if (!point.isFocused()) return notFocusedColor; + return '#000'; + }, + 'stroke-width': function strokeWidth(display, data, index, utils) { + return 2; + }, + + /** + * Transitive-specific attribute specifying the shape of the main stop marker. + * Can be 'roundedrect', 'rectangle' or 'circle' + */ + + 'marker-type': ['circle', function (display, data, index, utils) { + var point = data.owner; + if ((point.containsBoardPoint() || point.containsAlightPoint()) && !point.containsTransferPoint()) return 'circle'; + }], + + /** + * Transitive-specific attribute specifying any additional padding, in pixels, + * to apply to main stop marker. A value of zero (default) results in a that + * marker is flush to the edges of the pattern segment(s) the point is set against. + * A value greater than zero creates a marker that is larger than the width of + * the segments(s). + */ + + 'marker-padding': 3, + + visibility: function visibility(display, data) { + if (!data.owner.containsSegmentEndPoint()) return 'hidden'; + } +}; + +/** + * Stops Along a Pattern + */ + +var stopsPattern = exports.stops_pattern = { + cx: 0, + cy: 0, + r: [4, function (display, data, index, utils) { + return utils.pixels(display.zoom.scale(), 1, 2, 4); + }, function (display, data, index, utils) { + var point = data.owner; + var busOnly = true; + point.getPatterns().forEach(function (pattern) { + if (pattern.route && pattern.route.route_type !== 3) busOnly = false; + }); + if (busOnly && !point.containsSegmentEndPoint()) { + return 0.5 * utils.pixels(display.zoom.scale(), 2, 4, 6.5); + } + }], + stroke: 'none', + visibility: function visibility(display, data) { + if (display.zoom.scale() < 1.5) return 'hidden'; + if (data.owner.containsSegmentEndPoint()) return 'hidden'; + } +}; + +/** + * Default place rules + */ + +exports.places = { + cx: 0, + cy: 0, + r: 14, + stroke: '0px', + fill: '#fff' +}; + +/** + * Default MultiPoint rules -- based on Stop rules + */ + +var multipointsMerged = exports.multipoints_merged = (0, _assign2.default)({}, stopsMerged); + +multipointsMerged.visibility = true; + +/** + * Default Multipoint Stops along a pattern + */ + +exports.multipoints_pattern = (0, _assign2.default)({}, stopsPattern); + +/** + * Default label rules + */ + +exports.labels = { + 'font-size': function fontSize(display, data, index, utils) { + return utils.fontSize(display, data) + 'px'; + }, + 'font-weight': function fontWeight(display, data, index, utils) { + var point = data.owner.parent; + if (point.containsBoardPoint() || point.containsAlightPoint()) return 'bold'; + }, + + /** + * 'orientations' is a transitive-specific attribute used to specify allowable + * label placement orientations expressed as one of eight compass directions + * relative to the point being labeled: + * + * 'N' + * 'NW' | 'NE' + * \ | / + * 'W' -- O -- 'E' + * / | \ + * 'SW' | 'SE' + * 'S + * + * Labels oriented 'E' or 'W' are rendered horizontally, 'N' and 'S' vertically, + * and all others at a 45-degree angle. + * + * Returns an array of allowed orientation codes in the order that they will be + * tried by the labeler. + */ + + orientations: [['E', 'W']] +}; + +/** + * All path segments + * TODO: update old route-pattern-specific code below + */ + +exports.segments = { + stroke: ['#008', function (display, data) { + var segment = data; + if (!segment.focused) return notFocusedColor; + if (segment.type === 'TRANSIT') { + if (segment.patterns) { + if (segment.patterns[0].route.route_short_name.toLowerCase().substring(0, 2) === 'dc') return '#f00'; + return segment.patterns[0].route.getColor(); + } + } else if (segment.type === 'CAR') { + return '#888'; + } + }], + 'stroke-dasharray': [false, function (display, data) { + var segment = data; + if (segment.frequency && segment.frequency.average < 12) { + if (segment.frequency.average > 6) return '12px, 12px'; + return '12px, 2px'; + } + }], + 'stroke-width': ['12px', function (display, data, index, utils) { + var segment = data; + + if (segment.mode === 3) { + return utils.pixels(display.zoom.scale(), 2, 4, 8) + 'px'; + } + return utils.pixels(display.zoom.scale(), 4, 8, 12) + 'px'; + }], + envelope: [function (display, data, index, utils) { + var segment = data; + if (segment.type !== 'TRANSIT') { + return '8px'; + } + if (segment.mode === 3) { + return utils.pixels(display.zoom.scale(), 4, 6, 10) + 'px'; + } + return utils.pixels(display.zoom.scale(), 6, 10, 14) + 'px'; + }] +}; + +/** + * Segments Front + */ + +exports.segments_front = { + stroke: '#008', + 'stroke-width': function strokeWidth(display, data, index, utils) { + return utils.pixels(display.zoom.scale(), 3, 6, 10) / 2 + 'px'; + }, + fill: 'none', + display: ['none', function (display, data, index, utils) { + if (data.pattern && data.pattern.route && data.pattern.route.route_type === 3 && data.pattern.route.route_short_name.toLowerCase().substring(0, 2) === 'dc') { + return 'inline'; + } + }] +}; + +/** + * Segments Halo + */ + +exports.segments_halo = { + stroke: '#fff', + 'stroke-width': function strokeWidth(display, data, index, utils) { + return data.computeLineWidth(display) + 8; + }, + 'stroke-linecap': 'round', + fill: 'none' +}; + +/** + * Label Containers + */ + +exports.segment_label_containers = { + fill: function fill(display, data) { + if (!data.isFocused()) return notFocusedColor; + }, + 'stroke-width': function strokeWidth(display, data) { + if (data.parent.pattern && data.parent.pattern.route.route_short_name.toLowerCase().substring(0, 2) === 'dc') return 1; + return 0; + }, + rx: 3, + ry: 3 +}; + +},{"babel-runtime/core-js/object/assign":43,"d3":88}],37:[function(require,module,exports){ +'use strict'; + +var d3 = require('d3'); +var Emitter = require('component-emitter'); + +var Network = require('./core/network'); + +var Display = require('./display'); + +var DefaultRenderer = require('./renderer/default-renderer'); +var WireframeRenderer = require('./renderer/wireframe-renderer'); + +var Styler = require('./styler'); +var Labeler = require('./labeler'); + +var SphericalMercator = require('./util/spherical-mercator'); +var sm = new SphericalMercator(); + +/* + * Expose `Transitive` + */ + +module.exports = Transitive; + +/** + * Create a new instance of `Transitive` + * + * @param {Object} options object + * - data {Object} data to render + * - styles {Object} styles to apply + * - el {Element} the DOM element to render the main display to + * - legendEl {Element} the DOM element to render the legend to + * - drawGrid {Boolean} whether to draw a background grid (defaults to false) + * - gridCellSize {Number} resolution of the grid in SphericalMercator meters + * - draggableTypes {Array} a list of network element types to enable dragging for + * - initialBounds {Array} initial lon/lat bounds for the display expressed as [[west, south], [east, north]] + * - displayMargins {Object} padding to apply to the initial rendered network within the display. Expressed in pixels for top/bottom/left/right + * - mapboxId {String} an Mapbox tileset id for rendering background tiles (Deprecated -- use Leaflet with Leaflet.TransitiveLayer) + * - zoomEnabled {Boolean} whether to enable the display's built-in zoom/pan functionality (defaults to true) + * - autoResize {Boolean} whether the display should listen for window resize events and update automatically (defaults to true) + * - groupEdges {Boolean} whether to consider edges with the same origin/destination equivalent for rendering, even if intermediate stop sequence is different (defaults to true) + */ + +function Transitive(options) { + console.log('**** trn'); + if (!(this instanceof Transitive)) return new Transitive(options); + + this.options = options; + if (this.options.zoomEnabled === undefined) this.options.zoomEnabled = true; + if (this.options.autoResize === undefined) this.options.autoResize = true; + if (this.options.groupEdges === undefined) this.options.groupEdges = true; + + if (options.el) this.setElement(options.el); + + this.data = options.data; + + this.setRenderer(this.options.initialRenderer || 'default'); + + this.labeler = new Labeler(this); + this.styler = new Styler(options.styles); +} + +/** + * Mixin `Emitter` + */ + +Emitter(Transitive.prototype); + +/** + * Clear the Network data and redraw the (empty) map + */ + +Transitive.prototype.clearData = function () { + this.network = this.data = null; + this.labeler.clear(); + this.emit('clear data', this); +}; + +/** + * Update the Network data and redraw the map + */ + +Transitive.prototype.updateData = function (data) { + this.network = null; + this.data = data; + if (this.display) this.display.scaleSet = false; + this.labeler.clear(); + this.emit('update data', this); +}; + +/** + * Return the collection of default segment styles for a mode. + * + * @param {String} an OTP mode string + */ + +Transitive.prototype.getModeStyles = function (mode) { + return this.styler.getModeStyles(mode, this.display || new Display(this)); +}; + +/** Display/Render Methods **/ + +/** + * Set the DOM element that serves as the main map canvas + */ + +Transitive.prototype.setElement = function (el, legendEl) { + if (this.el) d3.select(this.el).selectAll('*').remove(); + + this.el = el; + this.display = new Display(this); + + // Emit click events + var self = this; + this.display.svg.on('click', function () { + var x = d3.event.x; + var y = d3.event.y; + var geographic = sm.inverse([x, y]); + self.emit('click', { + x: x, + y: y, + lng: geographic[0], + lat: geographic[1] + }); + }); + + this.emit('set element', this, this.el); + return this; +}; + +/** + * Set the DOM element that serves as the main map canvas + */ + +Transitive.prototype.setRenderer = function (type) { + switch (type) { + case 'wireframe': + this.renderer = new WireframeRenderer(this); + break; + case 'default': + this.renderer = new DefaultRenderer(this); + break; + } +}; + +/** + * Render + */ + +Transitive.prototype.render = function () { + if (!this.network) { + this.network = new Network(this, this.data); + } + + if (!this.display.scaleSet) { + this.display.setScale(this.network.graph.bounds(), this.options); + } + + this.renderer.render(); + + this.emit('render', this); +}; + +/** + * Render to + * + * @param {Element} el + */ + +Transitive.prototype.renderTo = function (el) { + this.setElement(el); + this.render(); + + this.emit('render to', this); + return this; +}; + +/** + * Refresh + */ + +Transitive.prototype.refresh = function (panning) { + if (!this.network) { + this.render(); + } + + this.renderer.refresh(); +}; + +/** + * focusJourney + */ + +Transitive.prototype.focusJourney = function (journeyId) { + var path = journeyId ? this.network.journeys[journeyId].path : null; + this.renderer.focusPath(path); +}; + +/** + * Sets the Display bounds + * @param {Array} lon/lat bounds expressed as [[west, south], [east, north]] + */ + +Transitive.prototype.setDisplayBounds = function (llBounds) { + this.display.updateDomains([sm.forward(llBounds[0]), sm.forward(llBounds[1])]); + this.display.zoomChanged(); +}; + +/** + * Gets the Network bounds + * @returns {Array} lon/lat bounds expressed as [[west, south], [east, north]] + */ + +Transitive.prototype.getNetworkBounds = function () { + if (!this.network || !this.network.graph) return null; + var graphBounds = this.network.graph.bounds(); + var ll1 = sm.inverse(graphBounds[0]); + var ll2 = sm.inverse(graphBounds[1]); + return [[Math.min(ll1[0], ll2[0]), Math.min(ll1[1], ll2[1])], [Math.max(ll1[0], ll2[0]), Math.max(ll1[1], ll2[1])]]; +}; + +/** + * resize + */ + +Transitive.prototype.resize = function (width, height) { + if (!this.display) return; + d3.select(this.display.el).style('width', width + 'px').style('height', height + 'px'); + this.display.resized(); +}; + +},{"./core/network":3,"./display":11,"./labeler":18,"./renderer/default-renderer":30,"./renderer/wireframe-renderer":34,"./styler":35,"./util/spherical-mercator":41,"component-emitter":85,"d3":88}],38:[function(require,module,exports){ +'use strict'; + +/** + * General Transitive utilities library + */ + +var d3 = require('d3'); + +var tolerance = 0.000001; + +module.exports.fuzzyEquals = function (a, b, tol) { + tol = tol || tolerance; + return Math.abs(a - b) < tol; +}; + +module.exports.distance = function (x1, y1, x2, y2) { + return Math.sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1)); +}; + +module.exports.getRadiusFromAngleChord = function (angleR, chordLen) { + return chordLen / 2 / Math.sin(angleR / 2); +}; + +/* + * CCW utility function. Accepts 3 coord pairs; result is positive if points + * have counterclockwise orientation, negative if clockwise, 0 if collinear. + */ + +module.exports.ccw = function (ax, ay, bx, by, cx, cy) { + var raw = module.exports.ccwRaw(ax, ay, bx, by, cx, cy); + return raw === 0 ? 0 : raw / Math.abs(raw); +}; + +module.exports.ccwRaw = function (ax, ay, bx, by, cx, cy) { + return (bx - ax) * (cy - ay) - (cx - ax) * (by - ay); +}; + +/* + * Compute angle formed by three points in cartesian plane using law of cosines + */ + +module.exports.angleFromThreePoints = function (ax, ay, bx, by, cx, cy) { + var c = module.exports.distance(ax, ay, bx, by); + var a = module.exports.distance(bx, by, cx, cy); + var b = module.exports.distance(ax, ay, cx, cy); + return Math.acos((a * a + c * c - b * b) / (2 * a * c)); +}; + +module.exports.pointAlongArc = function (x1, y1, x2, y2, r, theta, ccw, t) { + ccw = Math.abs(ccw) / ccw; // convert to 1 or -1 + + var rot = Math.PI / 2 - Math.abs(theta) / 2; + var vectToCenter = module.exports.normalizeVector(module.exports.rotateVector({ + x: x2 - x1, + y: y2 - y1 + }, ccw * rot)); + + // calculate the center of the arc circle + var cx = x1 + r * vectToCenter.x; + var cy = y1 + r * vectToCenter.y; + + var vectFromCenter = module.exports.negateVector(vectToCenter); + rot = Math.abs(theta) * t * ccw; + vectFromCenter = module.exports.normalizeVector(module.exports.rotateVector(vectFromCenter, rot)); + + return { + x: cx + r * vectFromCenter.x, + y: cy + r * vectFromCenter.y + }; +}; + +module.exports.getVectorAngle = function (x, y) { + var t = Math.atan(y / x); + + if (x < 0 && t <= 0) t += Math.PI;else if (x < 0 && t >= 0) t -= Math.PI; + + return t; +}; + +module.exports.rayIntersection = function (ax, ay, avx, avy, bx, by, bvx, bvy) { + var u = ((by - ay) * bvx - (bx - ax) * bvy) / (bvx * avy - bvy * avx); + var v = ((by - ay) * avx - (bx - ax) * avy) / (bvx * avy - bvy * avx); + + return { + u: u, + v: v, + intersect: u > -tolerance && v > -tolerance + }; +}; + +module.exports.lineIntersection = function (x1, y1, x2, y2, x3, y3, x4, y4) { + var d = (x1 - x2) * (y3 - y4) - (y1 - y2) * (x3 - x4); + + if (d === 0) { + // lines are parallel + return { + intersect: false + }; + } + + return { + x: ((x1 * y2 - y1 * x2) * (x3 - x4) - (x1 - x2) * (x3 * y4 - y3 * x4)) / d, + y: ((x1 * y2 - y1 * x2) * (y3 - y4) - (y1 - y2) * (x3 * y4 - y3 * x4)) / d, + intersect: true + }; +}; + +/** + * Parse a pixel-based style descriptor, returning an number. + * + * @param {String/Number} + */ + +module.exports.parsePixelStyle = function (descriptor) { + if (typeof descriptor === 'number') return descriptor; + return parseFloat(descriptor.substring(0, descriptor.length - 2), 10); +}; + +module.exports.isOutwardVector = function (vector) { + if (!module.exports.fuzzyEquals(vector.x, 0)) return vector.x > 0; + return vector.y > 0; +}; + +module.exports.getTextBBox = function (text, attrs) { + var container = d3.select('body').append('svg'); + container.append('text').attr({ + x: -1000, + y: -1000 + }).attr(attrs).text(text); + var bbox = container.node().getBBox(); + container.remove(); + + return { + height: bbox.height, + width: bbox.width + }; +}; + +/** + * Convert lat/lon coords to spherical mercator meter x/y coords + */ + +module.exports.latLonToSphericalMercator = function (lat, lon) { + var r = 6378137; + var x = r * lon * Math.PI / 180; + var y = r * Math.log(Math.tan(Math.PI / 4 + lat * Math.PI / 360)); + return [x, y]; +}; + +/** + * vector utilities + */ + +module.exports.normalizeVector = function (v) { + var d = Math.sqrt(v.x * v.x + v.y * v.y); + return { + x: v.x / d, + y: v.y / d + }; +}; + +module.exports.rotateVector = function (v, theta) { + return { + x: v.x * Math.cos(theta) - v.y * Math.sin(theta), + y: v.x * Math.sin(theta) + v.y * Math.cos(theta) + }; +}; + +module.exports.negateVector = function (v) { + return { + x: -v.x, + y: -v.y + }; +}; + +module.exports.addVectors = function (v1, v2) { + return { + x: v1.x + v2.x, + y: v1.y + v2.y + }; +}; + +/** + * GTFS utilities + */ + +module.exports.otpModeToGtfsType = function (otpMode) { + switch (otpMode) { + case 'TRAM': + return 0; + case 'SUBWAY': + return 1; + case 'RAIL': + return 2; + case 'BUS': + return 3; + case 'FERRY': + return 4; + case 'CABLE_CAR': + return 5; + case 'GONDOLA': + return 6; + case 'FUNICULAR': + return 7; + } +}; + +},{"d3":88}],39:[function(require,module,exports){ +'use strict'; + +/** + * Line interpolation utility function + * + * @param {Array} points + */ + +var Util = require('./index'); + +module.exports = function (points) { + var newPoints, i, r; + + // determine if we need to resample the path (i.e. place new points at a regular + // interval for marker-based styling) based on styler settings + var resampleSpacing = this.display.styler.compute(this.display.styler.segments['marker-spacing'], this.display, this.segment); + + // handle the case of a simple straight line + if (points.length === 2) { + if (resampleSpacing) { + newPoints = [points[0]]; + newPoints = newPoints.concat(resampleLine(points[0], points[1], resampleSpacing)); + return newPoints.join(' '); + } + return points.join(' '); + } + + // otherwise, assume a curved segment + + if (resampleSpacing) { + newPoints = [points[0]]; + for (i = 1; i < points.length; i++) { + if (this.segment.renderData[i].arc) { + // debug(this.renderData[i]); + // var r = this.renderData[i].radius; + // var sweep = (this.renderData[i].arc > 0) ? 0 : 1; + // str += 'A ' + r + ',' + r + ' 0 0 ' + sweep + ' ' + points[i]; + r = this.segment.renderData[i].radius; + var theta = this.segment.renderData[i].arc * Math.PI / 180; + newPoints = newPoints.concat(resampleArc(points[i - 1], points[i], r, theta, -this.segment.renderData[i].arc, resampleSpacing)); + } else { + newPoints = newPoints.concat(resampleLine(points[i - 1], points[i], resampleSpacing)); + } + } + return newPoints.join(' '); + } else { + var str = points[0]; + for (i = 1; i < points.length; i++) { + if (this.segment.renderData[i].arc) { + r = this.segment.renderData[i].radius; + var sweep = this.segment.renderData[i].arc > 0 ? 0 : 1; + str += 'A ' + r + ',' + r + ' 0 0 ' + sweep + ' ' + points[i]; + } else { + str += 'L' + points[i]; + } + } + return str; + } +}; + +function resampleLine(startPt, endPt, spacing) { + var dx = endPt[0] - startPt[0]; + var dy = endPt[1] - startPt[1]; + var len = Math.sqrt(dx * dx + dy * dy); + + var sampledPts = [startPt]; + for (var l = spacing; l < len; l += spacing) { + var t = l / len; + sampledPts.push([startPt[0] + t * dx, startPt[1] + t * dy]); + } + + sampledPts.push(endPt); + + return sampledPts; +} + +function resampleArc(startPt, endPt, r, theta, ccw, spacing) { + var len = r * Math.abs(theta); + + var sampledPts = []; + for (var l = spacing; l < len; l += spacing) { + var t = l / len; + var pt = Util.pointAlongArc(startPt[0], startPt[1], endPt[0], endPt[1], r, Math.abs(theta), ccw, t); + sampledPts.push([pt.x, pt.y]); + } + + return sampledPts; +} + +},{"./index":38}],40:[function(require,module,exports){ +"use strict"; + +module.exports.decode = function (polyline) { + var currentPosition = 0; + + var currentLat = 0; + var currentLng = 0; + + var dataLength = polyline.length; + + var polylineLatLngs = []; + + while (currentPosition < dataLength) { + var shift = 0; + var result = 0; + + var byte; + + do { + byte = polyline.charCodeAt(currentPosition++) - 63; + result |= (byte & 0x1f) << shift; + shift += 5; + } while (byte >= 0x20); + + var deltaLat = result & 1 ? ~(result >> 1) : result >> 1; + currentLat += deltaLat; + + shift = 0; + result = 0; + + do { + byte = polyline.charCodeAt(currentPosition++) - 63; + result |= (byte & 0x1f) << shift; + shift += 5; + } while (byte >= 0x20); + + var deltLng = result & 1 ? ~(result >> 1) : result >> 1; + + currentLng += deltLng; + + polylineLatLngs.push([currentLat * 0.00001, currentLng * 0.00001]); + } + return polylineLatLngs; +}; + +},{}],41:[function(require,module,exports){ +'use strict'; + +var SphericalMercator = function () { + // Closures including constants and other precalculated values. + var cache = {}; + // var EPSLN = 1.0e-10 + var D2R = Math.PI / 180; + var R2D = 180 / Math.PI; + // 900913 properties. + var A = 6378137; + var MAXEXTENT = 20037508.34; + + // SphericalMercator constructor: precaches calculations + // for fast tile lookups. + function SphericalMercator(options) { + options = options || {}; + this.size = options.size || 256; + if (!cache[this.size]) { + var size = this.size; + var c = cache[this.size] = {}; + c.Bc = []; + c.Cc = []; + c.zc = []; + c.Ac = []; + for (var d = 0; d < 30; d++) { + c.Bc.push(size / 360); + c.Cc.push(size / (2 * Math.PI)); + c.zc.push(size / 2); + c.Ac.push(size); + size *= 2; + } + } + this.Bc = cache[this.size].Bc; + this.Cc = cache[this.size].Cc; + this.zc = cache[this.size].zc; + this.Ac = cache[this.size].Ac; + } + + // Convert lon lat to screen pixel value + // + // - `ll` {Array} `[lon, lat]` array of geographic coordinates. + // - `zoom` {Number} zoom level. + SphericalMercator.prototype.px = function (ll, zoom) { + var d = this.zc[zoom]; + var f = Math.min(Math.max(Math.sin(D2R * ll[1]), -0.9999), 0.9999); + var x = Math.round(d + ll[0] * this.Bc[zoom]); + var y = Math.round(d + 0.5 * Math.log((1 + f) / (1 - f)) * -this.Cc[zoom]); + if (x > this.Ac[zoom]) x = this.Ac[zoom]; + if (y > this.Ac[zoom]) y = this.Ac[zoom]; + // (x < 0) && (x = 0); + // (y < 0) && (y = 0); + return [x, y]; + }; + + // Convert screen pixel value to lon lat + // + // - `px` {Array} `[x, y]` array of geographic coordinates. + // - `zoom` {Number} zoom level. + SphericalMercator.prototype.ll = function (px, zoom) { + var g = (px[1] - this.zc[zoom]) / -this.Cc[zoom]; + var lon = (px[0] - this.zc[zoom]) / this.Bc[zoom]; + var lat = R2D * (2 * Math.atan(Math.exp(g)) - 0.5 * Math.PI); + return [lon, lat]; + }; + + // Convert tile xyz value to bbox of the form `[w, s, e, n]` + // + // - `x` {Number} x (longitude) number. + // - `y` {Number} y (latitude) number. + // - `zoom` {Number} zoom. + // - `tms_style` {Boolean} whether to compute using tms-style. + // - `srs` {String} projection for resulting bbox (WGS84|900913). + // - `return` {Array} bbox array of values in form `[w, s, e, n]`. + SphericalMercator.prototype.bbox = function (x, y, zoom, tmsStyle, srs) { + // Convert xyz into bbox with srs WGS84 + if (tmsStyle) { + y = Math.pow(2, zoom) - 1 - y; + } + // Use +y to make sure it's a number to avoid inadvertent concatenation. + var ll = [x * this.size, (+y + 1) * this.size]; // lower left + // Use +x to make sure it's a number to avoid inadvertent concatenation. + var ur = [(+x + 1) * this.size, y * this.size]; // upper right + var bbox = this.ll(ll, zoom).concat(this.ll(ur, zoom)); + + // If web mercator requested reproject to 900913. + if (srs === '900913') { + return this.convert(bbox, '900913'); + } else { + return bbox; + } + }; + + // Convert bbox to xyx bounds + // + // - `bbox` {Number} bbox in the form `[w, s, e, n]`. + // - `zoom` {Number} zoom. + // - `tms_style` {Boolean} whether to compute using tms-style. + // - `srs` {String} projection of input bbox (WGS84|900913). + // - `@return` {Object} XYZ bounds containing minX, maxX, minY, maxY properties. + SphericalMercator.prototype.xyz = function (bbox, zoom, tmsStyle, srs) { + // If web mercator provided reproject to WGS84. + if (srs === '900913') { + bbox = this.convert(bbox, 'WGS84'); + } + + var ll = [bbox[0], bbox[1]]; // lower left + var ur = [bbox[2], bbox[3]]; // upper right + var pxll = this.px(ll, zoom); + var pxur = this.px(ur, zoom); + // Y = 0 for XYZ is the top hence minY uses px_ur[1]. + var bounds = { + minX: Math.floor(pxll[0] / this.size), + minY: Math.floor(pxur[1] / this.size), + maxX: Math.floor((pxur[0] - 1) / this.size), + maxY: Math.floor((pxll[1] - 1) / this.size) + }; + if (tmsStyle) { + var tms = { + minY: Math.pow(2, zoom) - 1 - bounds.maxY, + maxY: Math.pow(2, zoom) - 1 - bounds.minY + }; + bounds.minY = tms.minY; + bounds.maxY = tms.maxY; + } + return bounds; + }; + + // Convert projection of given bbox. + // + // - `bbox` {Number} bbox in the form `[w, s, e, n]`. + // - `to` {String} projection of output bbox (WGS84|900913). Input bbox + // assumed to be the "other" projection. + // - `@return` {Object} bbox with reprojected coordinates. + SphericalMercator.prototype.convert = function (bbox, to) { + if (to === '900913') { + return this.forward(bbox.slice(0, 2)).concat(this.forward(bbox.slice(2, 4))); + } else { + return this.inverse(bbox.slice(0, 2)).concat(this.inverse(bbox.slice(2, 4))); + } + }; + + // Convert lon/lat values to 900913 x/y. + SphericalMercator.prototype.forward = function (ll) { + var xy = [A * ll[0] * D2R, A * Math.log(Math.tan(Math.PI * 0.25 + 0.5 * ll[1] * D2R))]; + // if xy value is beyond maxextent (e.g. poles), return maxextent. + if (xy[0] > MAXEXTENT) xy[0] = MAXEXTENT; + if (xy[0] < -MAXEXTENT) xy[0] = -MAXEXTENT; + if (xy[1] > MAXEXTENT) xy[1] = MAXEXTENT; + if (xy[1] < -MAXEXTENT) xy[1] = -MAXEXTENT; + return xy; + }; + + // Convert 900913 x/y values to lon/lat. + SphericalMercator.prototype.inverse = function (xy) { + return [xy[0] * R2D / A, (Math.PI * 0.5 - 2.0 * Math.atan(Math.exp(-xy[1] / A))) * R2D]; + }; + + return SphericalMercator; +}(); + +if (typeof module !== 'undefined' && typeof exports !== 'undefined') { + module.exports = exports = SphericalMercator; +} + +},{}],42:[function(require,module,exports){ +(function (global, factory) { + if (typeof define === "function" && define.amd) define(factory); + else if (typeof module === "object") module.exports = factory(); + else global.augment = factory(); +}(this, function () { + "use strict"; + + var Factory = function () {}; + var slice = Array.prototype.slice; + + var augment = function (base, body) { + var uber = Factory.prototype = typeof base === "function" ? base.prototype : base; + var prototype = new Factory, properties = body.apply(prototype, slice.call(arguments, 2).concat(uber)); + if (typeof properties === "object") for (var key in properties) prototype[key] = properties[key]; + if (!prototype.hasOwnProperty("constructor")) return prototype; + var constructor = prototype.constructor; + constructor.prototype = prototype; + return constructor; + }; + + augment.defclass = function (prototype) { + var constructor = prototype.constructor; + constructor.prototype = prototype; + return constructor; + }; + + augment.extend = function (base, body) { + return augment(base, function (uber) { + this.uber = uber; + return body; + }); + }; + + return augment; +})); +},{}],43:[function(require,module,exports){ +module.exports = { "default": require("core-js/library/fn/object/assign"), __esModule: true }; +},{"core-js/library/fn/object/assign":45}],44:[function(require,module,exports){ +module.exports = { "default": require("core-js/library/fn/object/keys"), __esModule: true }; +},{"core-js/library/fn/object/keys":46}],45:[function(require,module,exports){ +require('../../modules/es6.object.assign'); +module.exports = require('../../modules/_core').Object.assign; +},{"../../modules/_core":51,"../../modules/es6.object.assign":82}],46:[function(require,module,exports){ +require('../../modules/es6.object.keys'); +module.exports = require('../../modules/_core').Object.keys; +},{"../../modules/_core":51,"../../modules/es6.object.keys":83}],47:[function(require,module,exports){ +module.exports = function(it){ + if(typeof it != 'function')throw TypeError(it + ' is not a function!'); + return it; +}; +},{}],48:[function(require,module,exports){ +var isObject = require('./_is-object'); +module.exports = function(it){ + if(!isObject(it))throw TypeError(it + ' is not an object!'); + return it; +}; +},{"./_is-object":64}],49:[function(require,module,exports){ +// false -> Array#indexOf +// true -> Array#includes +var toIObject = require('./_to-iobject') + , toLength = require('./_to-length') + , toIndex = require('./_to-index'); +module.exports = function(IS_INCLUDES){ + return function($this, el, fromIndex){ + var O = toIObject($this) + , length = toLength(O.length) + , index = toIndex(fromIndex, length) + , value; + // Array#includes uses SameValueZero equality algorithm + if(IS_INCLUDES && el != el)while(length > index){ + value = O[index++]; + if(value != value)return true; + // Array#toIndex ignores holes, Array#includes - not + } else for(;length > index; index++)if(IS_INCLUDES || index in O){ + if(O[index] === el)return IS_INCLUDES || index || 0; + } return !IS_INCLUDES && -1; + }; +}; +},{"./_to-index":75,"./_to-iobject":77,"./_to-length":78}],50:[function(require,module,exports){ +var toString = {}.toString; + +module.exports = function(it){ + return toString.call(it).slice(8, -1); +}; +},{}],51:[function(require,module,exports){ +var core = module.exports = {version: '2.4.0'}; +if(typeof __e == 'number')__e = core; // eslint-disable-line no-undef +},{}],52:[function(require,module,exports){ +// optional / simple context binding +var aFunction = require('./_a-function'); +module.exports = function(fn, that, length){ + aFunction(fn); + if(that === undefined)return fn; + switch(length){ + case 1: return function(a){ + return fn.call(that, a); + }; + case 2: return function(a, b){ + return fn.call(that, a, b); + }; + case 3: return function(a, b, c){ + return fn.call(that, a, b, c); + }; + } + return function(/* ...args */){ + return fn.apply(that, arguments); + }; +}; +},{"./_a-function":47}],53:[function(require,module,exports){ +// 7.2.1 RequireObjectCoercible(argument) +module.exports = function(it){ + if(it == undefined)throw TypeError("Can't call method on " + it); + return it; +}; +},{}],54:[function(require,module,exports){ +// Thank's IE8 for his funny defineProperty +module.exports = !require('./_fails')(function(){ + return Object.defineProperty({}, 'a', {get: function(){ return 7; }}).a != 7; +}); +},{"./_fails":58}],55:[function(require,module,exports){ +var isObject = require('./_is-object') + , document = require('./_global').document + // in old IE typeof document.createElement is 'object' + , is = isObject(document) && isObject(document.createElement); +module.exports = function(it){ + return is ? document.createElement(it) : {}; +}; +},{"./_global":59,"./_is-object":64}],56:[function(require,module,exports){ +// IE 8- don't enum bug keys +module.exports = ( + 'constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf' +).split(','); +},{}],57:[function(require,module,exports){ +var global = require('./_global') + , core = require('./_core') + , ctx = require('./_ctx') + , hide = require('./_hide') + , PROTOTYPE = 'prototype'; + +var $export = function(type, name, source){ + var IS_FORCED = type & $export.F + , IS_GLOBAL = type & $export.G + , IS_STATIC = type & $export.S + , IS_PROTO = type & $export.P + , IS_BIND = type & $export.B + , IS_WRAP = type & $export.W + , exports = IS_GLOBAL ? core : core[name] || (core[name] = {}) + , expProto = exports[PROTOTYPE] + , target = IS_GLOBAL ? global : IS_STATIC ? global[name] : (global[name] || {})[PROTOTYPE] + , key, own, out; + if(IS_GLOBAL)source = name; + for(key in source){ + // contains in native + own = !IS_FORCED && target && target[key] !== undefined; + if(own && key in exports)continue; + // export native or passed + out = own ? target[key] : source[key]; + // prevent global pollution for namespaces + exports[key] = IS_GLOBAL && typeof target[key] != 'function' ? source[key] + // bind timers to global for call from export context + : IS_BIND && own ? ctx(out, global) + // wrap global constructors for prevent change them in library + : IS_WRAP && target[key] == out ? (function(C){ + var F = function(a, b, c){ + if(this instanceof C){ + switch(arguments.length){ + case 0: return new C; + case 1: return new C(a); + case 2: return new C(a, b); + } return new C(a, b, c); + } return C.apply(this, arguments); + }; + F[PROTOTYPE] = C[PROTOTYPE]; + return F; + // make static versions for prototype methods + })(out) : IS_PROTO && typeof out == 'function' ? ctx(Function.call, out) : out; + // export proto methods to core.%CONSTRUCTOR%.methods.%NAME% + if(IS_PROTO){ + (exports.virtual || (exports.virtual = {}))[key] = out; + // export proto methods to core.%CONSTRUCTOR%.prototype.%NAME% + if(type & $export.R && expProto && !expProto[key])hide(expProto, key, out); + } + } +}; +// type bitmap +$export.F = 1; // forced +$export.G = 2; // global +$export.S = 4; // static +$export.P = 8; // proto +$export.B = 16; // bind +$export.W = 32; // wrap +$export.U = 64; // safe +$export.R = 128; // real proto method for `library` +module.exports = $export; +},{"./_core":51,"./_ctx":52,"./_global":59,"./_hide":61}],58:[function(require,module,exports){ +module.exports = function(exec){ + try { + return !!exec(); + } catch(e){ + return true; + } +}; +},{}],59:[function(require,module,exports){ +// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028 +var global = module.exports = typeof window != 'undefined' && window.Math == Math + ? window : typeof self != 'undefined' && self.Math == Math ? self : Function('return this')(); +if(typeof __g == 'number')__g = global; // eslint-disable-line no-undef +},{}],60:[function(require,module,exports){ +var hasOwnProperty = {}.hasOwnProperty; +module.exports = function(it, key){ + return hasOwnProperty.call(it, key); +}; +},{}],61:[function(require,module,exports){ +var dP = require('./_object-dp') + , createDesc = require('./_property-desc'); +module.exports = require('./_descriptors') ? function(object, key, value){ + return dP.f(object, key, createDesc(1, value)); +} : function(object, key, value){ + object[key] = value; + return object; +}; +},{"./_descriptors":54,"./_object-dp":66,"./_property-desc":72}],62:[function(require,module,exports){ +module.exports = !require('./_descriptors') && !require('./_fails')(function(){ + return Object.defineProperty(require('./_dom-create')('div'), 'a', {get: function(){ return 7; }}).a != 7; +}); +},{"./_descriptors":54,"./_dom-create":55,"./_fails":58}],63:[function(require,module,exports){ +// fallback for non-array-like ES3 and non-enumerable old V8 strings +var cof = require('./_cof'); +module.exports = Object('z').propertyIsEnumerable(0) ? Object : function(it){ + return cof(it) == 'String' ? it.split('') : Object(it); +}; +},{"./_cof":50}],64:[function(require,module,exports){ +module.exports = function(it){ + return typeof it === 'object' ? it !== null : typeof it === 'function'; +}; +},{}],65:[function(require,module,exports){ +'use strict'; +// 19.1.2.1 Object.assign(target, source, ...) +var getKeys = require('./_object-keys') + , gOPS = require('./_object-gops') + , pIE = require('./_object-pie') + , toObject = require('./_to-object') + , IObject = require('./_iobject') + , $assign = Object.assign; + +// should work with symbols and should have deterministic property order (V8 bug) +module.exports = !$assign || require('./_fails')(function(){ + var A = {} + , B = {} + , S = Symbol() + , K = 'abcdefghijklmnopqrst'; + A[S] = 7; + K.split('').forEach(function(k){ B[k] = k; }); + return $assign({}, A)[S] != 7 || Object.keys($assign({}, B)).join('') != K; +}) ? function assign(target, source){ // eslint-disable-line no-unused-vars + var T = toObject(target) + , aLen = arguments.length + , index = 1 + , getSymbols = gOPS.f + , isEnum = pIE.f; + while(aLen > index){ + var S = IObject(arguments[index++]) + , keys = getSymbols ? getKeys(S).concat(getSymbols(S)) : getKeys(S) + , length = keys.length + , j = 0 + , key; + while(length > j)if(isEnum.call(S, key = keys[j++]))T[key] = S[key]; + } return T; +} : $assign; +},{"./_fails":58,"./_iobject":63,"./_object-gops":67,"./_object-keys":69,"./_object-pie":70,"./_to-object":79}],66:[function(require,module,exports){ +var anObject = require('./_an-object') + , IE8_DOM_DEFINE = require('./_ie8-dom-define') + , toPrimitive = require('./_to-primitive') + , dP = Object.defineProperty; + +exports.f = require('./_descriptors') ? Object.defineProperty : function defineProperty(O, P, Attributes){ + anObject(O); + P = toPrimitive(P, true); + anObject(Attributes); + if(IE8_DOM_DEFINE)try { + return dP(O, P, Attributes); + } catch(e){ /* empty */ } + if('get' in Attributes || 'set' in Attributes)throw TypeError('Accessors not supported!'); + if('value' in Attributes)O[P] = Attributes.value; + return O; +}; +},{"./_an-object":48,"./_descriptors":54,"./_ie8-dom-define":62,"./_to-primitive":80}],67:[function(require,module,exports){ +exports.f = Object.getOwnPropertySymbols; +},{}],68:[function(require,module,exports){ +var has = require('./_has') + , toIObject = require('./_to-iobject') + , arrayIndexOf = require('./_array-includes')(false) + , IE_PROTO = require('./_shared-key')('IE_PROTO'); + +module.exports = function(object, names){ + var O = toIObject(object) + , i = 0 + , result = [] + , key; + for(key in O)if(key != IE_PROTO)has(O, key) && result.push(key); + // Don't enum bug & hidden keys + while(names.length > i)if(has(O, key = names[i++])){ + ~arrayIndexOf(result, key) || result.push(key); + } + return result; +}; +},{"./_array-includes":49,"./_has":60,"./_shared-key":73,"./_to-iobject":77}],69:[function(require,module,exports){ +// 19.1.2.14 / 15.2.3.14 Object.keys(O) +var $keys = require('./_object-keys-internal') + , enumBugKeys = require('./_enum-bug-keys'); + +module.exports = Object.keys || function keys(O){ + return $keys(O, enumBugKeys); +}; +},{"./_enum-bug-keys":56,"./_object-keys-internal":68}],70:[function(require,module,exports){ +exports.f = {}.propertyIsEnumerable; +},{}],71:[function(require,module,exports){ +// most Object methods by ES6 should accept primitives +var $export = require('./_export') + , core = require('./_core') + , fails = require('./_fails'); +module.exports = function(KEY, exec){ + var fn = (core.Object || {})[KEY] || Object[KEY] + , exp = {}; + exp[KEY] = exec(fn); + $export($export.S + $export.F * fails(function(){ fn(1); }), 'Object', exp); +}; +},{"./_core":51,"./_export":57,"./_fails":58}],72:[function(require,module,exports){ +module.exports = function(bitmap, value){ + return { + enumerable : !(bitmap & 1), + configurable: !(bitmap & 2), + writable : !(bitmap & 4), + value : value + }; +}; +},{}],73:[function(require,module,exports){ +var shared = require('./_shared')('keys') + , uid = require('./_uid'); +module.exports = function(key){ + return shared[key] || (shared[key] = uid(key)); +}; +},{"./_shared":74,"./_uid":81}],74:[function(require,module,exports){ +var global = require('./_global') + , SHARED = '__core-js_shared__' + , store = global[SHARED] || (global[SHARED] = {}); +module.exports = function(key){ + return store[key] || (store[key] = {}); +}; +},{"./_global":59}],75:[function(require,module,exports){ +var toInteger = require('./_to-integer') + , max = Math.max + , min = Math.min; +module.exports = function(index, length){ + index = toInteger(index); + return index < 0 ? max(index + length, 0) : min(index, length); +}; +},{"./_to-integer":76}],76:[function(require,module,exports){ +// 7.1.4 ToInteger +var ceil = Math.ceil + , floor = Math.floor; +module.exports = function(it){ + return isNaN(it = +it) ? 0 : (it > 0 ? floor : ceil)(it); +}; +},{}],77:[function(require,module,exports){ +// to indexed object, toObject with fallback for non-array-like ES3 strings +var IObject = require('./_iobject') + , defined = require('./_defined'); +module.exports = function(it){ + return IObject(defined(it)); +}; +},{"./_defined":53,"./_iobject":63}],78:[function(require,module,exports){ +// 7.1.15 ToLength +var toInteger = require('./_to-integer') + , min = Math.min; +module.exports = function(it){ + return it > 0 ? min(toInteger(it), 0x1fffffffffffff) : 0; // pow(2, 53) - 1 == 9007199254740991 +}; +},{"./_to-integer":76}],79:[function(require,module,exports){ +// 7.1.13 ToObject(argument) +var defined = require('./_defined'); +module.exports = function(it){ + return Object(defined(it)); +}; +},{"./_defined":53}],80:[function(require,module,exports){ +// 7.1.1 ToPrimitive(input [, PreferredType]) +var isObject = require('./_is-object'); +// instead of the ES6 spec version, we didn't implement @@toPrimitive case +// and the second argument - flag - preferred type is a string +module.exports = function(it, S){ + if(!isObject(it))return it; + var fn, val; + if(S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it)))return val; + if(typeof (fn = it.valueOf) == 'function' && !isObject(val = fn.call(it)))return val; + if(!S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it)))return val; + throw TypeError("Can't convert object to primitive value"); +}; +},{"./_is-object":64}],81:[function(require,module,exports){ +var id = 0 + , px = Math.random(); +module.exports = function(key){ + return 'Symbol('.concat(key === undefined ? '' : key, ')_', (++id + px).toString(36)); +}; +},{}],82:[function(require,module,exports){ +// 19.1.3.1 Object.assign(target, source) +var $export = require('./_export'); + +$export($export.S + $export.F, 'Object', {assign: require('./_object-assign')}); +},{"./_export":57,"./_object-assign":65}],83:[function(require,module,exports){ +// 19.1.2.14 Object.keys(O) +var toObject = require('./_to-object') + , $keys = require('./_object-keys'); + +require('./_object-sap')('keys', function(){ + return function keys(it){ + return $keys(toObject(it)); + }; +}); +},{"./_object-keys":69,"./_object-sap":71,"./_to-object":79}],84:[function(require,module,exports){ + +/** + * Module dependencies. + */ + +try { + var type = require('type'); +} catch (err) { + var type = require('component-type'); +} + +var toFunction = require('to-function'); + +/** + * HOP reference. + */ + +var has = Object.prototype.hasOwnProperty; + +/** + * Iterate the given `obj` and invoke `fn(val, i)` + * in optional context `ctx`. + * + * @param {String|Array|Object} obj + * @param {Function} fn + * @param {Object} [ctx] + * @api public + */ + +module.exports = function(obj, fn, ctx){ + fn = toFunction(fn); + ctx = ctx || this; + switch (type(obj)) { + case 'array': + return array(obj, fn, ctx); + case 'object': + if ('number' == typeof obj.length) return array(obj, fn, ctx); + return object(obj, fn, ctx); + case 'string': + return string(obj, fn, ctx); + } +}; + +/** + * Iterate string chars. + * + * @param {String} obj + * @param {Function} fn + * @param {Object} ctx + * @api private + */ + +function string(obj, fn, ctx) { + for (var i = 0; i < obj.length; ++i) { + fn.call(ctx, obj.charAt(i), i); + } +} + +/** + * Iterate object keys. + * + * @param {Object} obj + * @param {Function} fn + * @param {Object} ctx + * @api private + */ + +function object(obj, fn, ctx) { + for (var key in obj) { + if (has.call(obj, key)) { + fn.call(ctx, key, obj[key]); + } + } +} + +/** + * Iterate array-ish. + * + * @param {Array|Object} obj + * @param {Function} fn + * @param {Object} ctx + * @api private + */ + +function array(obj, fn, ctx) { + for (var i = 0; i < obj.length; ++i) { + fn.call(ctx, obj[i], i); + } +} + +},{"component-type":87,"to-function":93,"type":87}],85:[function(require,module,exports){ + +/** + * Expose `Emitter`. + */ + +if (typeof module !== 'undefined') { + module.exports = Emitter; +} + +/** + * Initialize a new `Emitter`. + * + * @api public + */ + +function Emitter(obj) { + if (obj) return mixin(obj); +}; + +/** + * Mixin the emitter properties. + * + * @param {Object} obj + * @return {Object} + * @api private + */ + +function mixin(obj) { + for (var key in Emitter.prototype) { + obj[key] = Emitter.prototype[key]; + } + return obj; +} + +/** + * Listen on the given `event` with `fn`. + * + * @param {String} event + * @param {Function} fn + * @return {Emitter} + * @api public + */ + +Emitter.prototype.on = +Emitter.prototype.addEventListener = function(event, fn){ + this._callbacks = this._callbacks || {}; + (this._callbacks['$' + event] = this._callbacks['$' + event] || []) + .push(fn); + return this; +}; + +/** + * Adds an `event` listener that will be invoked a single + * time then automatically removed. + * + * @param {String} event + * @param {Function} fn + * @return {Emitter} + * @api public + */ + +Emitter.prototype.once = function(event, fn){ + function on() { + this.off(event, on); + fn.apply(this, arguments); + } + + on.fn = fn; + this.on(event, on); + return this; +}; + +/** + * Remove the given callback for `event` or all + * registered callbacks. + * + * @param {String} event + * @param {Function} fn + * @return {Emitter} + * @api public + */ + +Emitter.prototype.off = +Emitter.prototype.removeListener = +Emitter.prototype.removeAllListeners = +Emitter.prototype.removeEventListener = function(event, fn){ + this._callbacks = this._callbacks || {}; + + // all + if (0 == arguments.length) { + this._callbacks = {}; + return this; + } + + // specific event + var callbacks = this._callbacks['$' + event]; + if (!callbacks) return this; + + // remove all handlers + if (1 == arguments.length) { + delete this._callbacks['$' + event]; + return this; + } + + // remove specific handler + var cb; + for (var i = 0; i < callbacks.length; i++) { + cb = callbacks[i]; + if (cb === fn || cb.fn === fn) { + callbacks.splice(i, 1); + break; + } + } + return this; +}; + +/** + * Emit `event` with the given args. + * + * @param {String} event + * @param {Mixed} ... + * @return {Emitter} + */ + +Emitter.prototype.emit = function(event){ + this._callbacks = this._callbacks || {}; + var args = [].slice.call(arguments, 1) + , callbacks = this._callbacks['$' + event]; + + if (callbacks) { + callbacks = callbacks.slice(0); + for (var i = 0, len = callbacks.length; i < len; ++i) { + callbacks[i].apply(this, args); + } + } + + return this; +}; + +/** + * Return array of callbacks for `event`. + * + * @param {String} event + * @return {Array} + * @api public + */ + +Emitter.prototype.listeners = function(event){ + this._callbacks = this._callbacks || {}; + return this._callbacks['$' + event] || []; +}; + +/** + * Check if this emitter has `event` handlers. + * + * @param {String} event + * @return {Boolean} + * @api public + */ + +Emitter.prototype.hasListeners = function(event){ + return !! this.listeners(event).length; +}; + +},{}],86:[function(require,module,exports){ +/** + * Global Names + */ + +var globals = /\b(Array|Date|Object|Math|JSON)\b/g; + +/** + * Return immediate identifiers parsed from `str`. + * + * @param {String} str + * @param {String|Function} map function or prefix + * @return {Array} + * @api public + */ + +module.exports = function(str, fn){ + var p = unique(props(str)); + if (fn && 'string' == typeof fn) fn = prefixed(fn); + if (fn) return map(str, p, fn); + return p; +}; + +/** + * Return immediate identifiers in `str`. + * + * @param {String} str + * @return {Array} + * @api private + */ + +function props(str) { + return str + .replace(/\.\w+|\w+ *\(|"[^"]*"|'[^']*'|\/([^/]+)\//g, '') + .replace(globals, '') + .match(/[a-zA-Z_]\w*/g) + || []; +} + +/** + * Return `str` with `props` mapped with `fn`. + * + * @param {String} str + * @param {Array} props + * @param {Function} fn + * @return {String} + * @api private + */ + +function map(str, props, fn) { + var re = /\.\w+|\w+ *\(|"[^"]*"|'[^']*'|\/([^/]+)\/|[a-zA-Z_]\w*/g; + return str.replace(re, function(_){ + if ('(' == _[_.length - 1]) return fn(_); + if (!~props.indexOf(_)) return _; + return fn(_); + }); +} + +/** + * Return unique array. + * + * @param {Array} arr + * @return {Array} + * @api private + */ + +function unique(arr) { + var ret = []; + + for (var i = 0; i < arr.length; i++) { + if (~ret.indexOf(arr[i])) continue; + ret.push(arr[i]); + } + + return ret; +} + +/** + * Map with prefix `str`. + */ + +function prefixed(str) { + return function(_){ + return str + _; + }; +} + +},{}],87:[function(require,module,exports){ + +/** + * toString ref. + */ + +var toString = Object.prototype.toString; + +/** + * Return the type of `val`. + * + * @param {Mixed} val + * @return {String} + * @api public + */ + +module.exports = function(val){ + switch (toString.call(val)) { + case '[object Function]': return 'function'; + case '[object Date]': return 'date'; + case '[object RegExp]': return 'regexp'; + case '[object Arguments]': return 'arguments'; + case '[object Array]': return 'array'; + case '[object String]': return 'string'; + } + + if (val === null) return 'null'; + if (val === undefined) return 'undefined'; + if (val && val.nodeType === 1) return 'element'; + if (val === Object(val)) return 'object'; + + return typeof val; +}; + +},{}],88:[function(require,module,exports){ +!function() { + var d3 = { + version: "3.5.17" + }; + var d3_arraySlice = [].slice, d3_array = function(list) { + return d3_arraySlice.call(list); + }; + var d3_document = this.document; + function d3_documentElement(node) { + return node && (node.ownerDocument || node.document || node).documentElement; + } + function d3_window(node) { + return node && (node.ownerDocument && node.ownerDocument.defaultView || node.document && node || node.defaultView); + } + if (d3_document) { + try { + d3_array(d3_document.documentElement.childNodes)[0].nodeType; + } catch (e) { + d3_array = function(list) { + var i = list.length, array = new Array(i); + while (i--) array[i] = list[i]; + return array; + }; + } + } + if (!Date.now) Date.now = function() { + return +new Date(); + }; + if (d3_document) { + try { + d3_document.createElement("DIV").style.setProperty("opacity", 0, ""); + } catch (error) { + var d3_element_prototype = this.Element.prototype, d3_element_setAttribute = d3_element_prototype.setAttribute, d3_element_setAttributeNS = d3_element_prototype.setAttributeNS, d3_style_prototype = this.CSSStyleDeclaration.prototype, d3_style_setProperty = d3_style_prototype.setProperty; + d3_element_prototype.setAttribute = function(name, value) { + d3_element_setAttribute.call(this, name, value + ""); + }; + d3_element_prototype.setAttributeNS = function(space, local, value) { + d3_element_setAttributeNS.call(this, space, local, value + ""); + }; + d3_style_prototype.setProperty = function(name, value, priority) { + d3_style_setProperty.call(this, name, value + "", priority); + }; + } + } + d3.ascending = d3_ascending; + function d3_ascending(a, b) { + return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN; + } + d3.descending = function(a, b) { + return b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN; + }; + d3.min = function(array, f) { + var i = -1, n = array.length, a, b; + if (arguments.length === 1) { + while (++i < n) if ((b = array[i]) != null && b >= b) { + a = b; + break; + } + while (++i < n) if ((b = array[i]) != null && a > b) a = b; + } else { + while (++i < n) if ((b = f.call(array, array[i], i)) != null && b >= b) { + a = b; + break; + } + while (++i < n) if ((b = f.call(array, array[i], i)) != null && a > b) a = b; + } + return a; + }; + d3.max = function(array, f) { + var i = -1, n = array.length, a, b; + if (arguments.length === 1) { + while (++i < n) if ((b = array[i]) != null && b >= b) { + a = b; + break; + } + while (++i < n) if ((b = array[i]) != null && b > a) a = b; + } else { + while (++i < n) if ((b = f.call(array, array[i], i)) != null && b >= b) { + a = b; + break; + } + while (++i < n) if ((b = f.call(array, array[i], i)) != null && b > a) a = b; + } + return a; + }; + d3.extent = function(array, f) { + var i = -1, n = array.length, a, b, c; + if (arguments.length === 1) { + while (++i < n) if ((b = array[i]) != null && b >= b) { + a = c = b; + break; + } + while (++i < n) if ((b = array[i]) != null) { + if (a > b) a = b; + if (c < b) c = b; + } + } else { + while (++i < n) if ((b = f.call(array, array[i], i)) != null && b >= b) { + a = c = b; + break; + } + while (++i < n) if ((b = f.call(array, array[i], i)) != null) { + if (a > b) a = b; + if (c < b) c = b; + } + } + return [ a, c ]; + }; + function d3_number(x) { + return x === null ? NaN : +x; + } + function d3_numeric(x) { + return !isNaN(x); + } + d3.sum = function(array, f) { + var s = 0, n = array.length, a, i = -1; + if (arguments.length === 1) { + while (++i < n) if (d3_numeric(a = +array[i])) s += a; + } else { + while (++i < n) if (d3_numeric(a = +f.call(array, array[i], i))) s += a; + } + return s; + }; + d3.mean = function(array, f) { + var s = 0, n = array.length, a, i = -1, j = n; + if (arguments.length === 1) { + while (++i < n) if (d3_numeric(a = d3_number(array[i]))) s += a; else --j; + } else { + while (++i < n) if (d3_numeric(a = d3_number(f.call(array, array[i], i)))) s += a; else --j; + } + if (j) return s / j; + }; + d3.quantile = function(values, p) { + var H = (values.length - 1) * p + 1, h = Math.floor(H), v = +values[h - 1], e = H - h; + return e ? v + e * (values[h] - v) : v; + }; + d3.median = function(array, f) { + var numbers = [], n = array.length, a, i = -1; + if (arguments.length === 1) { + while (++i < n) if (d3_numeric(a = d3_number(array[i]))) numbers.push(a); + } else { + while (++i < n) if (d3_numeric(a = d3_number(f.call(array, array[i], i)))) numbers.push(a); + } + if (numbers.length) return d3.quantile(numbers.sort(d3_ascending), .5); + }; + d3.variance = function(array, f) { + var n = array.length, m = 0, a, d, s = 0, i = -1, j = 0; + if (arguments.length === 1) { + while (++i < n) { + if (d3_numeric(a = d3_number(array[i]))) { + d = a - m; + m += d / ++j; + s += d * (a - m); + } + } + } else { + while (++i < n) { + if (d3_numeric(a = d3_number(f.call(array, array[i], i)))) { + d = a - m; + m += d / ++j; + s += d * (a - m); + } + } + } + if (j > 1) return s / (j - 1); + }; + d3.deviation = function() { + var v = d3.variance.apply(this, arguments); + return v ? Math.sqrt(v) : v; + }; + function d3_bisector(compare) { + return { + left: function(a, x, lo, hi) { + if (arguments.length < 3) lo = 0; + if (arguments.length < 4) hi = a.length; + while (lo < hi) { + var mid = lo + hi >>> 1; + if (compare(a[mid], x) < 0) lo = mid + 1; else hi = mid; + } + return lo; + }, + right: function(a, x, lo, hi) { + if (arguments.length < 3) lo = 0; + if (arguments.length < 4) hi = a.length; + while (lo < hi) { + var mid = lo + hi >>> 1; + if (compare(a[mid], x) > 0) hi = mid; else lo = mid + 1; + } + return lo; + } + }; + } + var d3_bisect = d3_bisector(d3_ascending); + d3.bisectLeft = d3_bisect.left; + d3.bisect = d3.bisectRight = d3_bisect.right; + d3.bisector = function(f) { + return d3_bisector(f.length === 1 ? function(d, x) { + return d3_ascending(f(d), x); + } : f); + }; + d3.shuffle = function(array, i0, i1) { + if ((m = arguments.length) < 3) { + i1 = array.length; + if (m < 2) i0 = 0; + } + var m = i1 - i0, t, i; + while (m) { + i = Math.random() * m-- | 0; + t = array[m + i0], array[m + i0] = array[i + i0], array[i + i0] = t; + } + return array; + }; + d3.permute = function(array, indexes) { + var i = indexes.length, permutes = new Array(i); + while (i--) permutes[i] = array[indexes[i]]; + return permutes; + }; + d3.pairs = function(array) { + var i = 0, n = array.length - 1, p0, p1 = array[0], pairs = new Array(n < 0 ? 0 : n); + while (i < n) pairs[i] = [ p0 = p1, p1 = array[++i] ]; + return pairs; + }; + d3.transpose = function(matrix) { + if (!(n = matrix.length)) return []; + for (var i = -1, m = d3.min(matrix, d3_transposeLength), transpose = new Array(m); ++i < m; ) { + for (var j = -1, n, row = transpose[i] = new Array(n); ++j < n; ) { + row[j] = matrix[j][i]; + } + } + return transpose; + }; + function d3_transposeLength(d) { + return d.length; + } + d3.zip = function() { + return d3.transpose(arguments); + }; + d3.keys = function(map) { + var keys = []; + for (var key in map) keys.push(key); + return keys; + }; + d3.values = function(map) { + var values = []; + for (var key in map) values.push(map[key]); + return values; + }; + d3.entries = function(map) { + var entries = []; + for (var key in map) entries.push({ + key: key, + value: map[key] + }); + return entries; + }; + d3.merge = function(arrays) { + var n = arrays.length, m, i = -1, j = 0, merged, array; + while (++i < n) j += arrays[i].length; + merged = new Array(j); + while (--n >= 0) { + array = arrays[n]; + m = array.length; + while (--m >= 0) { + merged[--j] = array[m]; + } + } + return merged; + }; + var abs = Math.abs; + d3.range = function(start, stop, step) { + if (arguments.length < 3) { + step = 1; + if (arguments.length < 2) { + stop = start; + start = 0; + } + } + if ((stop - start) / step === Infinity) throw new Error("infinite range"); + var range = [], k = d3_range_integerScale(abs(step)), i = -1, j; + start *= k, stop *= k, step *= k; + if (step < 0) while ((j = start + step * ++i) > stop) range.push(j / k); else while ((j = start + step * ++i) < stop) range.push(j / k); + return range; + }; + function d3_range_integerScale(x) { + var k = 1; + while (x * k % 1) k *= 10; + return k; + } + function d3_class(ctor, properties) { + for (var key in properties) { + Object.defineProperty(ctor.prototype, key, { + value: properties[key], + enumerable: false + }); + } + } + d3.map = function(object, f) { + var map = new d3_Map(); + if (object instanceof d3_Map) { + object.forEach(function(key, value) { + map.set(key, value); + }); + } else if (Array.isArray(object)) { + var i = -1, n = object.length, o; + if (arguments.length === 1) while (++i < n) map.set(i, object[i]); else while (++i < n) map.set(f.call(object, o = object[i], i), o); + } else { + for (var key in object) map.set(key, object[key]); + } + return map; + }; + function d3_Map() { + this._ = Object.create(null); + } + var d3_map_proto = "__proto__", d3_map_zero = "\x00"; + d3_class(d3_Map, { + has: d3_map_has, + get: function(key) { + return this._[d3_map_escape(key)]; + }, + set: function(key, value) { + return this._[d3_map_escape(key)] = value; + }, + remove: d3_map_remove, + keys: d3_map_keys, + values: function() { + var values = []; + for (var key in this._) values.push(this._[key]); + return values; + }, + entries: function() { + var entries = []; + for (var key in this._) entries.push({ + key: d3_map_unescape(key), + value: this._[key] + }); + return entries; + }, + size: d3_map_size, + empty: d3_map_empty, + forEach: function(f) { + for (var key in this._) f.call(this, d3_map_unescape(key), this._[key]); + } + }); + function d3_map_escape(key) { + return (key += "") === d3_map_proto || key[0] === d3_map_zero ? d3_map_zero + key : key; + } + function d3_map_unescape(key) { + return (key += "")[0] === d3_map_zero ? key.slice(1) : key; + } + function d3_map_has(key) { + return d3_map_escape(key) in this._; + } + function d3_map_remove(key) { + return (key = d3_map_escape(key)) in this._ && delete this._[key]; + } + function d3_map_keys() { + var keys = []; + for (var key in this._) keys.push(d3_map_unescape(key)); + return keys; + } + function d3_map_size() { + var size = 0; + for (var key in this._) ++size; + return size; + } + function d3_map_empty() { + for (var key in this._) return false; + return true; + } + d3.nest = function() { + var nest = {}, keys = [], sortKeys = [], sortValues, rollup; + function map(mapType, array, depth) { + if (depth >= keys.length) return rollup ? rollup.call(nest, array) : sortValues ? array.sort(sortValues) : array; + var i = -1, n = array.length, key = keys[depth++], keyValue, object, setter, valuesByKey = new d3_Map(), values; + while (++i < n) { + if (values = valuesByKey.get(keyValue = key(object = array[i]))) { + values.push(object); + } else { + valuesByKey.set(keyValue, [ object ]); + } + } + if (mapType) { + object = mapType(); + setter = function(keyValue, values) { + object.set(keyValue, map(mapType, values, depth)); + }; + } else { + object = {}; + setter = function(keyValue, values) { + object[keyValue] = map(mapType, values, depth); + }; + } + valuesByKey.forEach(setter); + return object; + } + function entries(map, depth) { + if (depth >= keys.length) return map; + var array = [], sortKey = sortKeys[depth++]; + map.forEach(function(key, keyMap) { + array.push({ + key: key, + values: entries(keyMap, depth) + }); + }); + return sortKey ? array.sort(function(a, b) { + return sortKey(a.key, b.key); + }) : array; + } + nest.map = function(array, mapType) { + return map(mapType, array, 0); + }; + nest.entries = function(array) { + return entries(map(d3.map, array, 0), 0); + }; + nest.key = function(d) { + keys.push(d); + return nest; + }; + nest.sortKeys = function(order) { + sortKeys[keys.length - 1] = order; + return nest; + }; + nest.sortValues = function(order) { + sortValues = order; + return nest; + }; + nest.rollup = function(f) { + rollup = f; + return nest; + }; + return nest; + }; + d3.set = function(array) { + var set = new d3_Set(); + if (array) for (var i = 0, n = array.length; i < n; ++i) set.add(array[i]); + return set; + }; + function d3_Set() { + this._ = Object.create(null); + } + d3_class(d3_Set, { + has: d3_map_has, + add: function(key) { + this._[d3_map_escape(key += "")] = true; + return key; + }, + remove: d3_map_remove, + values: d3_map_keys, + size: d3_map_size, + empty: d3_map_empty, + forEach: function(f) { + for (var key in this._) f.call(this, d3_map_unescape(key)); + } + }); + d3.behavior = {}; + function d3_identity(d) { + return d; + } + d3.rebind = function(target, source) { + var i = 1, n = arguments.length, method; + while (++i < n) target[method = arguments[i]] = d3_rebind(target, source, source[method]); + return target; + }; + function d3_rebind(target, source, method) { + return function() { + var value = method.apply(source, arguments); + return value === source ? target : value; + }; + } + function d3_vendorSymbol(object, name) { + if (name in object) return name; + name = name.charAt(0).toUpperCase() + name.slice(1); + for (var i = 0, n = d3_vendorPrefixes.length; i < n; ++i) { + var prefixName = d3_vendorPrefixes[i] + name; + if (prefixName in object) return prefixName; + } + } + var d3_vendorPrefixes = [ "webkit", "ms", "moz", "Moz", "o", "O" ]; + function d3_noop() {} + d3.dispatch = function() { + var dispatch = new d3_dispatch(), i = -1, n = arguments.length; + while (++i < n) dispatch[arguments[i]] = d3_dispatch_event(dispatch); + return dispatch; + }; + function d3_dispatch() {} + d3_dispatch.prototype.on = function(type, listener) { + var i = type.indexOf("."), name = ""; + if (i >= 0) { + name = type.slice(i + 1); + type = type.slice(0, i); + } + if (type) return arguments.length < 2 ? this[type].on(name) : this[type].on(name, listener); + if (arguments.length === 2) { + if (listener == null) for (type in this) { + if (this.hasOwnProperty(type)) this[type].on(name, null); + } + return this; + } + }; + function d3_dispatch_event(dispatch) { + var listeners = [], listenerByName = new d3_Map(); + function event() { + var z = listeners, i = -1, n = z.length, l; + while (++i < n) if (l = z[i].on) l.apply(this, arguments); + return dispatch; + } + event.on = function(name, listener) { + var l = listenerByName.get(name), i; + if (arguments.length < 2) return l && l.on; + if (l) { + l.on = null; + listeners = listeners.slice(0, i = listeners.indexOf(l)).concat(listeners.slice(i + 1)); + listenerByName.remove(name); + } + if (listener) listeners.push(listenerByName.set(name, { + on: listener + })); + return dispatch; + }; + return event; + } + d3.event = null; + function d3_eventPreventDefault() { + d3.event.preventDefault(); + } + function d3_eventSource() { + var e = d3.event, s; + while (s = e.sourceEvent) e = s; + return e; + } + function d3_eventDispatch(target) { + var dispatch = new d3_dispatch(), i = 0, n = arguments.length; + while (++i < n) dispatch[arguments[i]] = d3_dispatch_event(dispatch); + dispatch.of = function(thiz, argumentz) { + return function(e1) { + try { + var e0 = e1.sourceEvent = d3.event; + e1.target = target; + d3.event = e1; + dispatch[e1.type].apply(thiz, argumentz); + } finally { + d3.event = e0; + } + }; + }; + return dispatch; + } + d3.requote = function(s) { + return s.replace(d3_requote_re, "\\$&"); + }; + var d3_requote_re = /[\\\^\$\*\+\?\|\[\]\(\)\.\{\}]/g; + var d3_subclass = {}.__proto__ ? function(object, prototype) { + object.__proto__ = prototype; + } : function(object, prototype) { + for (var property in prototype) object[property] = prototype[property]; + }; + function d3_selection(groups) { + d3_subclass(groups, d3_selectionPrototype); + return groups; + } + var d3_select = function(s, n) { + return n.querySelector(s); + }, d3_selectAll = function(s, n) { + return n.querySelectorAll(s); + }, d3_selectMatches = function(n, s) { + var d3_selectMatcher = n.matches || n[d3_vendorSymbol(n, "matchesSelector")]; + d3_selectMatches = function(n, s) { + return d3_selectMatcher.call(n, s); + }; + return d3_selectMatches(n, s); + }; + if (typeof Sizzle === "function") { + d3_select = function(s, n) { + return Sizzle(s, n)[0] || null; + }; + d3_selectAll = Sizzle; + d3_selectMatches = Sizzle.matchesSelector; + } + d3.selection = function() { + return d3.select(d3_document.documentElement); + }; + var d3_selectionPrototype = d3.selection.prototype = []; + d3_selectionPrototype.select = function(selector) { + var subgroups = [], subgroup, subnode, group, node; + selector = d3_selection_selector(selector); + for (var j = -1, m = this.length; ++j < m; ) { + subgroups.push(subgroup = []); + subgroup.parentNode = (group = this[j]).parentNode; + for (var i = -1, n = group.length; ++i < n; ) { + if (node = group[i]) { + subgroup.push(subnode = selector.call(node, node.__data__, i, j)); + if (subnode && "__data__" in node) subnode.__data__ = node.__data__; + } else { + subgroup.push(null); + } + } + } + return d3_selection(subgroups); + }; + function d3_selection_selector(selector) { + return typeof selector === "function" ? selector : function() { + return d3_select(selector, this); + }; + } + d3_selectionPrototype.selectAll = function(selector) { + var subgroups = [], subgroup, node; + selector = d3_selection_selectorAll(selector); + for (var j = -1, m = this.length; ++j < m; ) { + for (var group = this[j], i = -1, n = group.length; ++i < n; ) { + if (node = group[i]) { + subgroups.push(subgroup = d3_array(selector.call(node, node.__data__, i, j))); + subgroup.parentNode = node; + } + } + } + return d3_selection(subgroups); + }; + function d3_selection_selectorAll(selector) { + return typeof selector === "function" ? selector : function() { + return d3_selectAll(selector, this); + }; + } + var d3_nsXhtml = "http://www.w3.org/1999/xhtml"; + var d3_nsPrefix = { + svg: "http://www.w3.org/2000/svg", + xhtml: d3_nsXhtml, + xlink: "http://www.w3.org/1999/xlink", + xml: "http://www.w3.org/XML/1998/namespace", + xmlns: "http://www.w3.org/2000/xmlns/" + }; + d3.ns = { + prefix: d3_nsPrefix, + qualify: function(name) { + var i = name.indexOf(":"), prefix = name; + if (i >= 0 && (prefix = name.slice(0, i)) !== "xmlns") name = name.slice(i + 1); + return d3_nsPrefix.hasOwnProperty(prefix) ? { + space: d3_nsPrefix[prefix], + local: name + } : name; + } + }; + d3_selectionPrototype.attr = function(name, value) { + if (arguments.length < 2) { + if (typeof name === "string") { + var node = this.node(); + name = d3.ns.qualify(name); + return name.local ? node.getAttributeNS(name.space, name.local) : node.getAttribute(name); + } + for (value in name) this.each(d3_selection_attr(value, name[value])); + return this; + } + return this.each(d3_selection_attr(name, value)); + }; + function d3_selection_attr(name, value) { + name = d3.ns.qualify(name); + function attrNull() { + this.removeAttribute(name); + } + function attrNullNS() { + this.removeAttributeNS(name.space, name.local); + } + function attrConstant() { + this.setAttribute(name, value); + } + function attrConstantNS() { + this.setAttributeNS(name.space, name.local, value); + } + function attrFunction() { + var x = value.apply(this, arguments); + if (x == null) this.removeAttribute(name); else this.setAttribute(name, x); + } + function attrFunctionNS() { + var x = value.apply(this, arguments); + if (x == null) this.removeAttributeNS(name.space, name.local); else this.setAttributeNS(name.space, name.local, x); + } + return value == null ? name.local ? attrNullNS : attrNull : typeof value === "function" ? name.local ? attrFunctionNS : attrFunction : name.local ? attrConstantNS : attrConstant; + } + function d3_collapse(s) { + return s.trim().replace(/\s+/g, " "); + } + d3_selectionPrototype.classed = function(name, value) { + if (arguments.length < 2) { + if (typeof name === "string") { + var node = this.node(), n = (name = d3_selection_classes(name)).length, i = -1; + if (value = node.classList) { + while (++i < n) if (!value.contains(name[i])) return false; + } else { + value = node.getAttribute("class"); + while (++i < n) if (!d3_selection_classedRe(name[i]).test(value)) return false; + } + return true; + } + for (value in name) this.each(d3_selection_classed(value, name[value])); + return this; + } + return this.each(d3_selection_classed(name, value)); + }; + function d3_selection_classedRe(name) { + return new RegExp("(?:^|\\s+)" + d3.requote(name) + "(?:\\s+|$)", "g"); + } + function d3_selection_classes(name) { + return (name + "").trim().split(/^|\s+/); + } + function d3_selection_classed(name, value) { + name = d3_selection_classes(name).map(d3_selection_classedName); + var n = name.length; + function classedConstant() { + var i = -1; + while (++i < n) name[i](this, value); + } + function classedFunction() { + var i = -1, x = value.apply(this, arguments); + while (++i < n) name[i](this, x); + } + return typeof value === "function" ? classedFunction : classedConstant; + } + function d3_selection_classedName(name) { + var re = d3_selection_classedRe(name); + return function(node, value) { + if (c = node.classList) return value ? c.add(name) : c.remove(name); + var c = node.getAttribute("class") || ""; + if (value) { + re.lastIndex = 0; + if (!re.test(c)) node.setAttribute("class", d3_collapse(c + " " + name)); + } else { + node.setAttribute("class", d3_collapse(c.replace(re, " "))); + } + }; + } + d3_selectionPrototype.style = function(name, value, priority) { + var n = arguments.length; + if (n < 3) { + if (typeof name !== "string") { + if (n < 2) value = ""; + for (priority in name) this.each(d3_selection_style(priority, name[priority], value)); + return this; + } + if (n < 2) { + var node = this.node(); + return d3_window(node).getComputedStyle(node, null).getPropertyValue(name); + } + priority = ""; + } + return this.each(d3_selection_style(name, value, priority)); + }; + function d3_selection_style(name, value, priority) { + function styleNull() { + this.style.removeProperty(name); + } + function styleConstant() { + this.style.setProperty(name, value, priority); + } + function styleFunction() { + var x = value.apply(this, arguments); + if (x == null) this.style.removeProperty(name); else this.style.setProperty(name, x, priority); + } + return value == null ? styleNull : typeof value === "function" ? styleFunction : styleConstant; + } + d3_selectionPrototype.property = function(name, value) { + if (arguments.length < 2) { + if (typeof name === "string") return this.node()[name]; + for (value in name) this.each(d3_selection_property(value, name[value])); + return this; + } + return this.each(d3_selection_property(name, value)); + }; + function d3_selection_property(name, value) { + function propertyNull() { + delete this[name]; + } + function propertyConstant() { + this[name] = value; + } + function propertyFunction() { + var x = value.apply(this, arguments); + if (x == null) delete this[name]; else this[name] = x; + } + return value == null ? propertyNull : typeof value === "function" ? propertyFunction : propertyConstant; + } + d3_selectionPrototype.text = function(value) { + return arguments.length ? this.each(typeof value === "function" ? function() { + var v = value.apply(this, arguments); + this.textContent = v == null ? "" : v; + } : value == null ? function() { + this.textContent = ""; + } : function() { + this.textContent = value; + }) : this.node().textContent; + }; + d3_selectionPrototype.html = function(value) { + return arguments.length ? this.each(typeof value === "function" ? function() { + var v = value.apply(this, arguments); + this.innerHTML = v == null ? "" : v; + } : value == null ? function() { + this.innerHTML = ""; + } : function() { + this.innerHTML = value; + }) : this.node().innerHTML; + }; + d3_selectionPrototype.append = function(name) { + name = d3_selection_creator(name); + return this.select(function() { + return this.appendChild(name.apply(this, arguments)); + }); + }; + function d3_selection_creator(name) { + function create() { + var document = this.ownerDocument, namespace = this.namespaceURI; + return namespace === d3_nsXhtml && document.documentElement.namespaceURI === d3_nsXhtml ? document.createElement(name) : document.createElementNS(namespace, name); + } + function createNS() { + return this.ownerDocument.createElementNS(name.space, name.local); + } + return typeof name === "function" ? name : (name = d3.ns.qualify(name)).local ? createNS : create; + } + d3_selectionPrototype.insert = function(name, before) { + name = d3_selection_creator(name); + before = d3_selection_selector(before); + return this.select(function() { + return this.insertBefore(name.apply(this, arguments), before.apply(this, arguments) || null); + }); + }; + d3_selectionPrototype.remove = function() { + return this.each(d3_selectionRemove); + }; + function d3_selectionRemove() { + var parent = this.parentNode; + if (parent) parent.removeChild(this); + } + d3_selectionPrototype.data = function(value, key) { + var i = -1, n = this.length, group, node; + if (!arguments.length) { + value = new Array(n = (group = this[0]).length); + while (++i < n) { + if (node = group[i]) { + value[i] = node.__data__; + } + } + return value; + } + function bind(group, groupData) { + var i, n = group.length, m = groupData.length, n0 = Math.min(n, m), updateNodes = new Array(m), enterNodes = new Array(m), exitNodes = new Array(n), node, nodeData; + if (key) { + var nodeByKeyValue = new d3_Map(), keyValues = new Array(n), keyValue; + for (i = -1; ++i < n; ) { + if (node = group[i]) { + if (nodeByKeyValue.has(keyValue = key.call(node, node.__data__, i))) { + exitNodes[i] = node; + } else { + nodeByKeyValue.set(keyValue, node); + } + keyValues[i] = keyValue; + } + } + for (i = -1; ++i < m; ) { + if (!(node = nodeByKeyValue.get(keyValue = key.call(groupData, nodeData = groupData[i], i)))) { + enterNodes[i] = d3_selection_dataNode(nodeData); + } else if (node !== true) { + updateNodes[i] = node; + node.__data__ = nodeData; + } + nodeByKeyValue.set(keyValue, true); + } + for (i = -1; ++i < n; ) { + if (i in keyValues && nodeByKeyValue.get(keyValues[i]) !== true) { + exitNodes[i] = group[i]; + } + } + } else { + for (i = -1; ++i < n0; ) { + node = group[i]; + nodeData = groupData[i]; + if (node) { + node.__data__ = nodeData; + updateNodes[i] = node; + } else { + enterNodes[i] = d3_selection_dataNode(nodeData); + } + } + for (;i < m; ++i) { + enterNodes[i] = d3_selection_dataNode(groupData[i]); + } + for (;i < n; ++i) { + exitNodes[i] = group[i]; + } + } + enterNodes.update = updateNodes; + enterNodes.parentNode = updateNodes.parentNode = exitNodes.parentNode = group.parentNode; + enter.push(enterNodes); + update.push(updateNodes); + exit.push(exitNodes); + } + var enter = d3_selection_enter([]), update = d3_selection([]), exit = d3_selection([]); + if (typeof value === "function") { + while (++i < n) { + bind(group = this[i], value.call(group, group.parentNode.__data__, i)); + } + } else { + while (++i < n) { + bind(group = this[i], value); + } + } + update.enter = function() { + return enter; + }; + update.exit = function() { + return exit; + }; + return update; + }; + function d3_selection_dataNode(data) { + return { + __data__: data + }; + } + d3_selectionPrototype.datum = function(value) { + return arguments.length ? this.property("__data__", value) : this.property("__data__"); + }; + d3_selectionPrototype.filter = function(filter) { + var subgroups = [], subgroup, group, node; + if (typeof filter !== "function") filter = d3_selection_filter(filter); + for (var j = 0, m = this.length; j < m; j++) { + subgroups.push(subgroup = []); + subgroup.parentNode = (group = this[j]).parentNode; + for (var i = 0, n = group.length; i < n; i++) { + if ((node = group[i]) && filter.call(node, node.__data__, i, j)) { + subgroup.push(node); + } + } + } + return d3_selection(subgroups); + }; + function d3_selection_filter(selector) { + return function() { + return d3_selectMatches(this, selector); + }; + } + d3_selectionPrototype.order = function() { + for (var j = -1, m = this.length; ++j < m; ) { + for (var group = this[j], i = group.length - 1, next = group[i], node; --i >= 0; ) { + if (node = group[i]) { + if (next && next !== node.nextSibling) next.parentNode.insertBefore(node, next); + next = node; + } + } + } + return this; + }; + d3_selectionPrototype.sort = function(comparator) { + comparator = d3_selection_sortComparator.apply(this, arguments); + for (var j = -1, m = this.length; ++j < m; ) this[j].sort(comparator); + return this.order(); + }; + function d3_selection_sortComparator(comparator) { + if (!arguments.length) comparator = d3_ascending; + return function(a, b) { + return a && b ? comparator(a.__data__, b.__data__) : !a - !b; + }; + } + d3_selectionPrototype.each = function(callback) { + return d3_selection_each(this, function(node, i, j) { + callback.call(node, node.__data__, i, j); + }); + }; + function d3_selection_each(groups, callback) { + for (var j = 0, m = groups.length; j < m; j++) { + for (var group = groups[j], i = 0, n = group.length, node; i < n; i++) { + if (node = group[i]) callback(node, i, j); + } + } + return groups; + } + d3_selectionPrototype.call = function(callback) { + var args = d3_array(arguments); + callback.apply(args[0] = this, args); + return this; + }; + d3_selectionPrototype.empty = function() { + return !this.node(); + }; + d3_selectionPrototype.node = function() { + for (var j = 0, m = this.length; j < m; j++) { + for (var group = this[j], i = 0, n = group.length; i < n; i++) { + var node = group[i]; + if (node) return node; + } + } + return null; + }; + d3_selectionPrototype.size = function() { + var n = 0; + d3_selection_each(this, function() { + ++n; + }); + return n; + }; + function d3_selection_enter(selection) { + d3_subclass(selection, d3_selection_enterPrototype); + return selection; + } + var d3_selection_enterPrototype = []; + d3.selection.enter = d3_selection_enter; + d3.selection.enter.prototype = d3_selection_enterPrototype; + d3_selection_enterPrototype.append = d3_selectionPrototype.append; + d3_selection_enterPrototype.empty = d3_selectionPrototype.empty; + d3_selection_enterPrototype.node = d3_selectionPrototype.node; + d3_selection_enterPrototype.call = d3_selectionPrototype.call; + d3_selection_enterPrototype.size = d3_selectionPrototype.size; + d3_selection_enterPrototype.select = function(selector) { + var subgroups = [], subgroup, subnode, upgroup, group, node; + for (var j = -1, m = this.length; ++j < m; ) { + upgroup = (group = this[j]).update; + subgroups.push(subgroup = []); + subgroup.parentNode = group.parentNode; + for (var i = -1, n = group.length; ++i < n; ) { + if (node = group[i]) { + subgroup.push(upgroup[i] = subnode = selector.call(group.parentNode, node.__data__, i, j)); + subnode.__data__ = node.__data__; + } else { + subgroup.push(null); + } + } + } + return d3_selection(subgroups); + }; + d3_selection_enterPrototype.insert = function(name, before) { + if (arguments.length < 2) before = d3_selection_enterInsertBefore(this); + return d3_selectionPrototype.insert.call(this, name, before); + }; + function d3_selection_enterInsertBefore(enter) { + var i0, j0; + return function(d, i, j) { + var group = enter[j].update, n = group.length, node; + if (j != j0) j0 = j, i0 = 0; + if (i >= i0) i0 = i + 1; + while (!(node = group[i0]) && ++i0 < n) ; + return node; + }; + } + d3.select = function(node) { + var group; + if (typeof node === "string") { + group = [ d3_select(node, d3_document) ]; + group.parentNode = d3_document.documentElement; + } else { + group = [ node ]; + group.parentNode = d3_documentElement(node); + } + return d3_selection([ group ]); + }; + d3.selectAll = function(nodes) { + var group; + if (typeof nodes === "string") { + group = d3_array(d3_selectAll(nodes, d3_document)); + group.parentNode = d3_document.documentElement; + } else { + group = d3_array(nodes); + group.parentNode = null; + } + return d3_selection([ group ]); + }; + d3_selectionPrototype.on = function(type, listener, capture) { + var n = arguments.length; + if (n < 3) { + if (typeof type !== "string") { + if (n < 2) listener = false; + for (capture in type) this.each(d3_selection_on(capture, type[capture], listener)); + return this; + } + if (n < 2) return (n = this.node()["__on" + type]) && n._; + capture = false; + } + return this.each(d3_selection_on(type, listener, capture)); + }; + function d3_selection_on(type, listener, capture) { + var name = "__on" + type, i = type.indexOf("."), wrap = d3_selection_onListener; + if (i > 0) type = type.slice(0, i); + var filter = d3_selection_onFilters.get(type); + if (filter) type = filter, wrap = d3_selection_onFilter; + function onRemove() { + var l = this[name]; + if (l) { + this.removeEventListener(type, l, l.$); + delete this[name]; + } + } + function onAdd() { + var l = wrap(listener, d3_array(arguments)); + onRemove.call(this); + this.addEventListener(type, this[name] = l, l.$ = capture); + l._ = listener; + } + function removeAll() { + var re = new RegExp("^__on([^.]+)" + d3.requote(type) + "$"), match; + for (var name in this) { + if (match = name.match(re)) { + var l = this[name]; + this.removeEventListener(match[1], l, l.$); + delete this[name]; + } + } + } + return i ? listener ? onAdd : onRemove : listener ? d3_noop : removeAll; + } + var d3_selection_onFilters = d3.map({ + mouseenter: "mouseover", + mouseleave: "mouseout" + }); + if (d3_document) { + d3_selection_onFilters.forEach(function(k) { + if ("on" + k in d3_document) d3_selection_onFilters.remove(k); + }); + } + function d3_selection_onListener(listener, argumentz) { + return function(e) { + var o = d3.event; + d3.event = e; + argumentz[0] = this.__data__; + try { + listener.apply(this, argumentz); + } finally { + d3.event = o; + } + }; + } + function d3_selection_onFilter(listener, argumentz) { + var l = d3_selection_onListener(listener, argumentz); + return function(e) { + var target = this, related = e.relatedTarget; + if (!related || related !== target && !(related.compareDocumentPosition(target) & 8)) { + l.call(target, e); + } + }; + } + var d3_event_dragSelect, d3_event_dragId = 0; + function d3_event_dragSuppress(node) { + var name = ".dragsuppress-" + ++d3_event_dragId, click = "click" + name, w = d3.select(d3_window(node)).on("touchmove" + name, d3_eventPreventDefault).on("dragstart" + name, d3_eventPreventDefault).on("selectstart" + name, d3_eventPreventDefault); + if (d3_event_dragSelect == null) { + d3_event_dragSelect = "onselectstart" in node ? false : d3_vendorSymbol(node.style, "userSelect"); + } + if (d3_event_dragSelect) { + var style = d3_documentElement(node).style, select = style[d3_event_dragSelect]; + style[d3_event_dragSelect] = "none"; + } + return function(suppressClick) { + w.on(name, null); + if (d3_event_dragSelect) style[d3_event_dragSelect] = select; + if (suppressClick) { + var off = function() { + w.on(click, null); + }; + w.on(click, function() { + d3_eventPreventDefault(); + off(); + }, true); + setTimeout(off, 0); + } + }; + } + d3.mouse = function(container) { + return d3_mousePoint(container, d3_eventSource()); + }; + var d3_mouse_bug44083 = this.navigator && /WebKit/.test(this.navigator.userAgent) ? -1 : 0; + function d3_mousePoint(container, e) { + if (e.changedTouches) e = e.changedTouches[0]; + var svg = container.ownerSVGElement || container; + if (svg.createSVGPoint) { + var point = svg.createSVGPoint(); + if (d3_mouse_bug44083 < 0) { + var window = d3_window(container); + if (window.scrollX || window.scrollY) { + svg = d3.select("body").append("svg").style({ + position: "absolute", + top: 0, + left: 0, + margin: 0, + padding: 0, + border: "none" + }, "important"); + var ctm = svg[0][0].getScreenCTM(); + d3_mouse_bug44083 = !(ctm.f || ctm.e); + svg.remove(); + } + } + if (d3_mouse_bug44083) point.x = e.pageX, point.y = e.pageY; else point.x = e.clientX, + point.y = e.clientY; + point = point.matrixTransform(container.getScreenCTM().inverse()); + return [ point.x, point.y ]; + } + var rect = container.getBoundingClientRect(); + return [ e.clientX - rect.left - container.clientLeft, e.clientY - rect.top - container.clientTop ]; + } + d3.touch = function(container, touches, identifier) { + if (arguments.length < 3) identifier = touches, touches = d3_eventSource().changedTouches; + if (touches) for (var i = 0, n = touches.length, touch; i < n; ++i) { + if ((touch = touches[i]).identifier === identifier) { + return d3_mousePoint(container, touch); + } + } + }; + d3.behavior.drag = function() { + var event = d3_eventDispatch(drag, "drag", "dragstart", "dragend"), origin = null, mousedown = dragstart(d3_noop, d3.mouse, d3_window, "mousemove", "mouseup"), touchstart = dragstart(d3_behavior_dragTouchId, d3.touch, d3_identity, "touchmove", "touchend"); + function drag() { + this.on("mousedown.drag", mousedown).on("touchstart.drag", touchstart); + } + function dragstart(id, position, subject, move, end) { + return function() { + var that = this, target = d3.event.target.correspondingElement || d3.event.target, parent = that.parentNode, dispatch = event.of(that, arguments), dragged = 0, dragId = id(), dragName = ".drag" + (dragId == null ? "" : "-" + dragId), dragOffset, dragSubject = d3.select(subject(target)).on(move + dragName, moved).on(end + dragName, ended), dragRestore = d3_event_dragSuppress(target), position0 = position(parent, dragId); + if (origin) { + dragOffset = origin.apply(that, arguments); + dragOffset = [ dragOffset.x - position0[0], dragOffset.y - position0[1] ]; + } else { + dragOffset = [ 0, 0 ]; + } + dispatch({ + type: "dragstart" + }); + function moved() { + var position1 = position(parent, dragId), dx, dy; + if (!position1) return; + dx = position1[0] - position0[0]; + dy = position1[1] - position0[1]; + dragged |= dx | dy; + position0 = position1; + dispatch({ + type: "drag", + x: position1[0] + dragOffset[0], + y: position1[1] + dragOffset[1], + dx: dx, + dy: dy + }); + } + function ended() { + if (!position(parent, dragId)) return; + dragSubject.on(move + dragName, null).on(end + dragName, null); + dragRestore(dragged); + dispatch({ + type: "dragend" + }); + } + }; + } + drag.origin = function(x) { + if (!arguments.length) return origin; + origin = x; + return drag; + }; + return d3.rebind(drag, event, "on"); + }; + function d3_behavior_dragTouchId() { + return d3.event.changedTouches[0].identifier; + } + d3.touches = function(container, touches) { + if (arguments.length < 2) touches = d3_eventSource().touches; + return touches ? d3_array(touches).map(function(touch) { + var point = d3_mousePoint(container, touch); + point.identifier = touch.identifier; + return point; + }) : []; + }; + var ε = 1e-6, ε2 = ε * ε, π = Math.PI, τ = 2 * π, τε = τ - ε, halfπ = π / 2, d3_radians = π / 180, d3_degrees = 180 / π; + function d3_sgn(x) { + return x > 0 ? 1 : x < 0 ? -1 : 0; + } + function d3_cross2d(a, b, c) { + return (b[0] - a[0]) * (c[1] - a[1]) - (b[1] - a[1]) * (c[0] - a[0]); + } + function d3_acos(x) { + return x > 1 ? 0 : x < -1 ? π : Math.acos(x); + } + function d3_asin(x) { + return x > 1 ? halfπ : x < -1 ? -halfπ : Math.asin(x); + } + function d3_sinh(x) { + return ((x = Math.exp(x)) - 1 / x) / 2; + } + function d3_cosh(x) { + return ((x = Math.exp(x)) + 1 / x) / 2; + } + function d3_tanh(x) { + return ((x = Math.exp(2 * x)) - 1) / (x + 1); + } + function d3_haversin(x) { + return (x = Math.sin(x / 2)) * x; + } + var ρ = Math.SQRT2, ρ2 = 2, ρ4 = 4; + d3.interpolateZoom = function(p0, p1) { + var ux0 = p0[0], uy0 = p0[1], w0 = p0[2], ux1 = p1[0], uy1 = p1[1], w1 = p1[2], dx = ux1 - ux0, dy = uy1 - uy0, d2 = dx * dx + dy * dy, i, S; + if (d2 < ε2) { + S = Math.log(w1 / w0) / ρ; + i = function(t) { + return [ ux0 + t * dx, uy0 + t * dy, w0 * Math.exp(ρ * t * S) ]; + }; + } else { + var d1 = Math.sqrt(d2), b0 = (w1 * w1 - w0 * w0 + ρ4 * d2) / (2 * w0 * ρ2 * d1), b1 = (w1 * w1 - w0 * w0 - ρ4 * d2) / (2 * w1 * ρ2 * d1), r0 = Math.log(Math.sqrt(b0 * b0 + 1) - b0), r1 = Math.log(Math.sqrt(b1 * b1 + 1) - b1); + S = (r1 - r0) / ρ; + i = function(t) { + var s = t * S, coshr0 = d3_cosh(r0), u = w0 / (ρ2 * d1) * (coshr0 * d3_tanh(ρ * s + r0) - d3_sinh(r0)); + return [ ux0 + u * dx, uy0 + u * dy, w0 * coshr0 / d3_cosh(ρ * s + r0) ]; + }; + } + i.duration = S * 1e3; + return i; + }; + d3.behavior.zoom = function() { + var view = { + x: 0, + y: 0, + k: 1 + }, translate0, center0, center, size = [ 960, 500 ], scaleExtent = d3_behavior_zoomInfinity, duration = 250, zooming = 0, mousedown = "mousedown.zoom", mousemove = "mousemove.zoom", mouseup = "mouseup.zoom", mousewheelTimer, touchstart = "touchstart.zoom", touchtime, event = d3_eventDispatch(zoom, "zoomstart", "zoom", "zoomend"), x0, x1, y0, y1; + if (!d3_behavior_zoomWheel) { + d3_behavior_zoomWheel = "onwheel" in d3_document ? (d3_behavior_zoomDelta = function() { + return -d3.event.deltaY * (d3.event.deltaMode ? 120 : 1); + }, "wheel") : "onmousewheel" in d3_document ? (d3_behavior_zoomDelta = function() { + return d3.event.wheelDelta; + }, "mousewheel") : (d3_behavior_zoomDelta = function() { + return -d3.event.detail; + }, "MozMousePixelScroll"); + } + function zoom(g) { + g.on(mousedown, mousedowned).on(d3_behavior_zoomWheel + ".zoom", mousewheeled).on("dblclick.zoom", dblclicked).on(touchstart, touchstarted); + } + zoom.event = function(g) { + g.each(function() { + var dispatch = event.of(this, arguments), view1 = view; + if (d3_transitionInheritId) { + d3.select(this).transition().each("start.zoom", function() { + view = this.__chart__ || { + x: 0, + y: 0, + k: 1 + }; + zoomstarted(dispatch); + }).tween("zoom:zoom", function() { + var dx = size[0], dy = size[1], cx = center0 ? center0[0] : dx / 2, cy = center0 ? center0[1] : dy / 2, i = d3.interpolateZoom([ (cx - view.x) / view.k, (cy - view.y) / view.k, dx / view.k ], [ (cx - view1.x) / view1.k, (cy - view1.y) / view1.k, dx / view1.k ]); + return function(t) { + var l = i(t), k = dx / l[2]; + this.__chart__ = view = { + x: cx - l[0] * k, + y: cy - l[1] * k, + k: k + }; + zoomed(dispatch); + }; + }).each("interrupt.zoom", function() { + zoomended(dispatch); + }).each("end.zoom", function() { + zoomended(dispatch); + }); + } else { + this.__chart__ = view; + zoomstarted(dispatch); + zoomed(dispatch); + zoomended(dispatch); + } + }); + }; + zoom.translate = function(_) { + if (!arguments.length) return [ view.x, view.y ]; + view = { + x: +_[0], + y: +_[1], + k: view.k + }; + rescale(); + return zoom; + }; + zoom.scale = function(_) { + if (!arguments.length) return view.k; + view = { + x: view.x, + y: view.y, + k: null + }; + scaleTo(+_); + rescale(); + return zoom; + }; + zoom.scaleExtent = function(_) { + if (!arguments.length) return scaleExtent; + scaleExtent = _ == null ? d3_behavior_zoomInfinity : [ +_[0], +_[1] ]; + return zoom; + }; + zoom.center = function(_) { + if (!arguments.length) return center; + center = _ && [ +_[0], +_[1] ]; + return zoom; + }; + zoom.size = function(_) { + if (!arguments.length) return size; + size = _ && [ +_[0], +_[1] ]; + return zoom; + }; + zoom.duration = function(_) { + if (!arguments.length) return duration; + duration = +_; + return zoom; + }; + zoom.x = function(z) { + if (!arguments.length) return x1; + x1 = z; + x0 = z.copy(); + view = { + x: 0, + y: 0, + k: 1 + }; + return zoom; + }; + zoom.y = function(z) { + if (!arguments.length) return y1; + y1 = z; + y0 = z.copy(); + view = { + x: 0, + y: 0, + k: 1 + }; + return zoom; + }; + function location(p) { + return [ (p[0] - view.x) / view.k, (p[1] - view.y) / view.k ]; + } + function point(l) { + return [ l[0] * view.k + view.x, l[1] * view.k + view.y ]; + } + function scaleTo(s) { + view.k = Math.max(scaleExtent[0], Math.min(scaleExtent[1], s)); + } + function translateTo(p, l) { + l = point(l); + view.x += p[0] - l[0]; + view.y += p[1] - l[1]; + } + function zoomTo(that, p, l, k) { + that.__chart__ = { + x: view.x, + y: view.y, + k: view.k + }; + scaleTo(Math.pow(2, k)); + translateTo(center0 = p, l); + that = d3.select(that); + if (duration > 0) that = that.transition().duration(duration); + that.call(zoom.event); + } + function rescale() { + if (x1) x1.domain(x0.range().map(function(x) { + return (x - view.x) / view.k; + }).map(x0.invert)); + if (y1) y1.domain(y0.range().map(function(y) { + return (y - view.y) / view.k; + }).map(y0.invert)); + } + function zoomstarted(dispatch) { + if (!zooming++) dispatch({ + type: "zoomstart" + }); + } + function zoomed(dispatch) { + rescale(); + dispatch({ + type: "zoom", + scale: view.k, + translate: [ view.x, view.y ] + }); + } + function zoomended(dispatch) { + if (!--zooming) dispatch({ + type: "zoomend" + }), center0 = null; + } + function mousedowned() { + var that = this, dispatch = event.of(that, arguments), dragged = 0, subject = d3.select(d3_window(that)).on(mousemove, moved).on(mouseup, ended), location0 = location(d3.mouse(that)), dragRestore = d3_event_dragSuppress(that); + d3_selection_interrupt.call(that); + zoomstarted(dispatch); + function moved() { + dragged = 1; + translateTo(d3.mouse(that), location0); + zoomed(dispatch); + } + function ended() { + subject.on(mousemove, null).on(mouseup, null); + dragRestore(dragged); + zoomended(dispatch); + } + } + function touchstarted() { + var that = this, dispatch = event.of(that, arguments), locations0 = {}, distance0 = 0, scale0, zoomName = ".zoom-" + d3.event.changedTouches[0].identifier, touchmove = "touchmove" + zoomName, touchend = "touchend" + zoomName, targets = [], subject = d3.select(that), dragRestore = d3_event_dragSuppress(that); + started(); + zoomstarted(dispatch); + subject.on(mousedown, null).on(touchstart, started); + function relocate() { + var touches = d3.touches(that); + scale0 = view.k; + touches.forEach(function(t) { + if (t.identifier in locations0) locations0[t.identifier] = location(t); + }); + return touches; + } + function started() { + var target = d3.event.target; + d3.select(target).on(touchmove, moved).on(touchend, ended); + targets.push(target); + var changed = d3.event.changedTouches; + for (var i = 0, n = changed.length; i < n; ++i) { + locations0[changed[i].identifier] = null; + } + var touches = relocate(), now = Date.now(); + if (touches.length === 1) { + if (now - touchtime < 500) { + var p = touches[0]; + zoomTo(that, p, locations0[p.identifier], Math.floor(Math.log(view.k) / Math.LN2) + 1); + d3_eventPreventDefault(); + } + touchtime = now; + } else if (touches.length > 1) { + var p = touches[0], q = touches[1], dx = p[0] - q[0], dy = p[1] - q[1]; + distance0 = dx * dx + dy * dy; + } + } + function moved() { + var touches = d3.touches(that), p0, l0, p1, l1; + d3_selection_interrupt.call(that); + for (var i = 0, n = touches.length; i < n; ++i, l1 = null) { + p1 = touches[i]; + if (l1 = locations0[p1.identifier]) { + if (l0) break; + p0 = p1, l0 = l1; + } + } + if (l1) { + var distance1 = (distance1 = p1[0] - p0[0]) * distance1 + (distance1 = p1[1] - p0[1]) * distance1, scale1 = distance0 && Math.sqrt(distance1 / distance0); + p0 = [ (p0[0] + p1[0]) / 2, (p0[1] + p1[1]) / 2 ]; + l0 = [ (l0[0] + l1[0]) / 2, (l0[1] + l1[1]) / 2 ]; + scaleTo(scale1 * scale0); + } + touchtime = null; + translateTo(p0, l0); + zoomed(dispatch); + } + function ended() { + if (d3.event.touches.length) { + var changed = d3.event.changedTouches; + for (var i = 0, n = changed.length; i < n; ++i) { + delete locations0[changed[i].identifier]; + } + for (var identifier in locations0) { + return void relocate(); + } + } + d3.selectAll(targets).on(zoomName, null); + subject.on(mousedown, mousedowned).on(touchstart, touchstarted); + dragRestore(); + zoomended(dispatch); + } + } + function mousewheeled() { + var dispatch = event.of(this, arguments); + if (mousewheelTimer) clearTimeout(mousewheelTimer); else d3_selection_interrupt.call(this), + translate0 = location(center0 = center || d3.mouse(this)), zoomstarted(dispatch); + mousewheelTimer = setTimeout(function() { + mousewheelTimer = null; + zoomended(dispatch); + }, 50); + d3_eventPreventDefault(); + scaleTo(Math.pow(2, d3_behavior_zoomDelta() * .002) * view.k); + translateTo(center0, translate0); + zoomed(dispatch); + } + function dblclicked() { + var p = d3.mouse(this), k = Math.log(view.k) / Math.LN2; + zoomTo(this, p, location(p), d3.event.shiftKey ? Math.ceil(k) - 1 : Math.floor(k) + 1); + } + return d3.rebind(zoom, event, "on"); + }; + var d3_behavior_zoomInfinity = [ 0, Infinity ], d3_behavior_zoomDelta, d3_behavior_zoomWheel; + d3.color = d3_color; + function d3_color() {} + d3_color.prototype.toString = function() { + return this.rgb() + ""; + }; + d3.hsl = d3_hsl; + function d3_hsl(h, s, l) { + return this instanceof d3_hsl ? void (this.h = +h, this.s = +s, this.l = +l) : arguments.length < 2 ? h instanceof d3_hsl ? new d3_hsl(h.h, h.s, h.l) : d3_rgb_parse("" + h, d3_rgb_hsl, d3_hsl) : new d3_hsl(h, s, l); + } + var d3_hslPrototype = d3_hsl.prototype = new d3_color(); + d3_hslPrototype.brighter = function(k) { + k = Math.pow(.7, arguments.length ? k : 1); + return new d3_hsl(this.h, this.s, this.l / k); + }; + d3_hslPrototype.darker = function(k) { + k = Math.pow(.7, arguments.length ? k : 1); + return new d3_hsl(this.h, this.s, k * this.l); + }; + d3_hslPrototype.rgb = function() { + return d3_hsl_rgb(this.h, this.s, this.l); + }; + function d3_hsl_rgb(h, s, l) { + var m1, m2; + h = isNaN(h) ? 0 : (h %= 360) < 0 ? h + 360 : h; + s = isNaN(s) ? 0 : s < 0 ? 0 : s > 1 ? 1 : s; + l = l < 0 ? 0 : l > 1 ? 1 : l; + m2 = l <= .5 ? l * (1 + s) : l + s - l * s; + m1 = 2 * l - m2; + function v(h) { + if (h > 360) h -= 360; else if (h < 0) h += 360; + if (h < 60) return m1 + (m2 - m1) * h / 60; + if (h < 180) return m2; + if (h < 240) return m1 + (m2 - m1) * (240 - h) / 60; + return m1; + } + function vv(h) { + return Math.round(v(h) * 255); + } + return new d3_rgb(vv(h + 120), vv(h), vv(h - 120)); + } + d3.hcl = d3_hcl; + function d3_hcl(h, c, l) { + return this instanceof d3_hcl ? void (this.h = +h, this.c = +c, this.l = +l) : arguments.length < 2 ? h instanceof d3_hcl ? new d3_hcl(h.h, h.c, h.l) : h instanceof d3_lab ? d3_lab_hcl(h.l, h.a, h.b) : d3_lab_hcl((h = d3_rgb_lab((h = d3.rgb(h)).r, h.g, h.b)).l, h.a, h.b) : new d3_hcl(h, c, l); + } + var d3_hclPrototype = d3_hcl.prototype = new d3_color(); + d3_hclPrototype.brighter = function(k) { + return new d3_hcl(this.h, this.c, Math.min(100, this.l + d3_lab_K * (arguments.length ? k : 1))); + }; + d3_hclPrototype.darker = function(k) { + return new d3_hcl(this.h, this.c, Math.max(0, this.l - d3_lab_K * (arguments.length ? k : 1))); + }; + d3_hclPrototype.rgb = function() { + return d3_hcl_lab(this.h, this.c, this.l).rgb(); + }; + function d3_hcl_lab(h, c, l) { + if (isNaN(h)) h = 0; + if (isNaN(c)) c = 0; + return new d3_lab(l, Math.cos(h *= d3_radians) * c, Math.sin(h) * c); + } + d3.lab = d3_lab; + function d3_lab(l, a, b) { + return this instanceof d3_lab ? void (this.l = +l, this.a = +a, this.b = +b) : arguments.length < 2 ? l instanceof d3_lab ? new d3_lab(l.l, l.a, l.b) : l instanceof d3_hcl ? d3_hcl_lab(l.h, l.c, l.l) : d3_rgb_lab((l = d3_rgb(l)).r, l.g, l.b) : new d3_lab(l, a, b); + } + var d3_lab_K = 18; + var d3_lab_X = .95047, d3_lab_Y = 1, d3_lab_Z = 1.08883; + var d3_labPrototype = d3_lab.prototype = new d3_color(); + d3_labPrototype.brighter = function(k) { + return new d3_lab(Math.min(100, this.l + d3_lab_K * (arguments.length ? k : 1)), this.a, this.b); + }; + d3_labPrototype.darker = function(k) { + return new d3_lab(Math.max(0, this.l - d3_lab_K * (arguments.length ? k : 1)), this.a, this.b); + }; + d3_labPrototype.rgb = function() { + return d3_lab_rgb(this.l, this.a, this.b); + }; + function d3_lab_rgb(l, a, b) { + var y = (l + 16) / 116, x = y + a / 500, z = y - b / 200; + x = d3_lab_xyz(x) * d3_lab_X; + y = d3_lab_xyz(y) * d3_lab_Y; + z = d3_lab_xyz(z) * d3_lab_Z; + return new d3_rgb(d3_xyz_rgb(3.2404542 * x - 1.5371385 * y - .4985314 * z), d3_xyz_rgb(-.969266 * x + 1.8760108 * y + .041556 * z), d3_xyz_rgb(.0556434 * x - .2040259 * y + 1.0572252 * z)); + } + function d3_lab_hcl(l, a, b) { + return l > 0 ? new d3_hcl(Math.atan2(b, a) * d3_degrees, Math.sqrt(a * a + b * b), l) : new d3_hcl(NaN, NaN, l); + } + function d3_lab_xyz(x) { + return x > .206893034 ? x * x * x : (x - 4 / 29) / 7.787037; + } + function d3_xyz_lab(x) { + return x > .008856 ? Math.pow(x, 1 / 3) : 7.787037 * x + 4 / 29; + } + function d3_xyz_rgb(r) { + return Math.round(255 * (r <= .00304 ? 12.92 * r : 1.055 * Math.pow(r, 1 / 2.4) - .055)); + } + d3.rgb = d3_rgb; + function d3_rgb(r, g, b) { + return this instanceof d3_rgb ? void (this.r = ~~r, this.g = ~~g, this.b = ~~b) : arguments.length < 2 ? r instanceof d3_rgb ? new d3_rgb(r.r, r.g, r.b) : d3_rgb_parse("" + r, d3_rgb, d3_hsl_rgb) : new d3_rgb(r, g, b); + } + function d3_rgbNumber(value) { + return new d3_rgb(value >> 16, value >> 8 & 255, value & 255); + } + function d3_rgbString(value) { + return d3_rgbNumber(value) + ""; + } + var d3_rgbPrototype = d3_rgb.prototype = new d3_color(); + d3_rgbPrototype.brighter = function(k) { + k = Math.pow(.7, arguments.length ? k : 1); + var r = this.r, g = this.g, b = this.b, i = 30; + if (!r && !g && !b) return new d3_rgb(i, i, i); + if (r && r < i) r = i; + if (g && g < i) g = i; + if (b && b < i) b = i; + return new d3_rgb(Math.min(255, r / k), Math.min(255, g / k), Math.min(255, b / k)); + }; + d3_rgbPrototype.darker = function(k) { + k = Math.pow(.7, arguments.length ? k : 1); + return new d3_rgb(k * this.r, k * this.g, k * this.b); + }; + d3_rgbPrototype.hsl = function() { + return d3_rgb_hsl(this.r, this.g, this.b); + }; + d3_rgbPrototype.toString = function() { + return "#" + d3_rgb_hex(this.r) + d3_rgb_hex(this.g) + d3_rgb_hex(this.b); + }; + function d3_rgb_hex(v) { + return v < 16 ? "0" + Math.max(0, v).toString(16) : Math.min(255, v).toString(16); + } + function d3_rgb_parse(format, rgb, hsl) { + var r = 0, g = 0, b = 0, m1, m2, color; + m1 = /([a-z]+)\((.*)\)/.exec(format = format.toLowerCase()); + if (m1) { + m2 = m1[2].split(","); + switch (m1[1]) { + case "hsl": + { + return hsl(parseFloat(m2[0]), parseFloat(m2[1]) / 100, parseFloat(m2[2]) / 100); + } + + case "rgb": + { + return rgb(d3_rgb_parseNumber(m2[0]), d3_rgb_parseNumber(m2[1]), d3_rgb_parseNumber(m2[2])); + } + } + } + if (color = d3_rgb_names.get(format)) { + return rgb(color.r, color.g, color.b); + } + if (format != null && format.charAt(0) === "#" && !isNaN(color = parseInt(format.slice(1), 16))) { + if (format.length === 4) { + r = (color & 3840) >> 4; + r = r >> 4 | r; + g = color & 240; + g = g >> 4 | g; + b = color & 15; + b = b << 4 | b; + } else if (format.length === 7) { + r = (color & 16711680) >> 16; + g = (color & 65280) >> 8; + b = color & 255; + } + } + return rgb(r, g, b); + } + function d3_rgb_hsl(r, g, b) { + var min = Math.min(r /= 255, g /= 255, b /= 255), max = Math.max(r, g, b), d = max - min, h, s, l = (max + min) / 2; + if (d) { + s = l < .5 ? d / (max + min) : d / (2 - max - min); + if (r == max) h = (g - b) / d + (g < b ? 6 : 0); else if (g == max) h = (b - r) / d + 2; else h = (r - g) / d + 4; + h *= 60; + } else { + h = NaN; + s = l > 0 && l < 1 ? 0 : h; + } + return new d3_hsl(h, s, l); + } + function d3_rgb_lab(r, g, b) { + r = d3_rgb_xyz(r); + g = d3_rgb_xyz(g); + b = d3_rgb_xyz(b); + var x = d3_xyz_lab((.4124564 * r + .3575761 * g + .1804375 * b) / d3_lab_X), y = d3_xyz_lab((.2126729 * r + .7151522 * g + .072175 * b) / d3_lab_Y), z = d3_xyz_lab((.0193339 * r + .119192 * g + .9503041 * b) / d3_lab_Z); + return d3_lab(116 * y - 16, 500 * (x - y), 200 * (y - z)); + } + function d3_rgb_xyz(r) { + return (r /= 255) <= .04045 ? r / 12.92 : Math.pow((r + .055) / 1.055, 2.4); + } + function d3_rgb_parseNumber(c) { + var f = parseFloat(c); + return c.charAt(c.length - 1) === "%" ? Math.round(f * 2.55) : f; + } + var d3_rgb_names = d3.map({ + aliceblue: 15792383, + antiquewhite: 16444375, + aqua: 65535, + aquamarine: 8388564, + azure: 15794175, + beige: 16119260, + bisque: 16770244, + black: 0, + blanchedalmond: 16772045, + blue: 255, + blueviolet: 9055202, + brown: 10824234, + burlywood: 14596231, + cadetblue: 6266528, + chartreuse: 8388352, + chocolate: 13789470, + coral: 16744272, + cornflowerblue: 6591981, + cornsilk: 16775388, + crimson: 14423100, + cyan: 65535, + darkblue: 139, + darkcyan: 35723, + darkgoldenrod: 12092939, + darkgray: 11119017, + darkgreen: 25600, + darkgrey: 11119017, + darkkhaki: 12433259, + darkmagenta: 9109643, + darkolivegreen: 5597999, + darkorange: 16747520, + darkorchid: 10040012, + darkred: 9109504, + darksalmon: 15308410, + darkseagreen: 9419919, + darkslateblue: 4734347, + darkslategray: 3100495, + darkslategrey: 3100495, + darkturquoise: 52945, + darkviolet: 9699539, + deeppink: 16716947, + deepskyblue: 49151, + dimgray: 6908265, + dimgrey: 6908265, + dodgerblue: 2003199, + firebrick: 11674146, + floralwhite: 16775920, + forestgreen: 2263842, + fuchsia: 16711935, + gainsboro: 14474460, + ghostwhite: 16316671, + gold: 16766720, + goldenrod: 14329120, + gray: 8421504, + green: 32768, + greenyellow: 11403055, + grey: 8421504, + honeydew: 15794160, + hotpink: 16738740, + indianred: 13458524, + indigo: 4915330, + ivory: 16777200, + khaki: 15787660, + lavender: 15132410, + lavenderblush: 16773365, + lawngreen: 8190976, + lemonchiffon: 16775885, + lightblue: 11393254, + lightcoral: 15761536, + lightcyan: 14745599, + lightgoldenrodyellow: 16448210, + lightgray: 13882323, + lightgreen: 9498256, + lightgrey: 13882323, + lightpink: 16758465, + lightsalmon: 16752762, + lightseagreen: 2142890, + lightskyblue: 8900346, + lightslategray: 7833753, + lightslategrey: 7833753, + lightsteelblue: 11584734, + lightyellow: 16777184, + lime: 65280, + limegreen: 3329330, + linen: 16445670, + magenta: 16711935, + maroon: 8388608, + mediumaquamarine: 6737322, + mediumblue: 205, + mediumorchid: 12211667, + mediumpurple: 9662683, + mediumseagreen: 3978097, + mediumslateblue: 8087790, + mediumspringgreen: 64154, + mediumturquoise: 4772300, + mediumvioletred: 13047173, + midnightblue: 1644912, + mintcream: 16121850, + mistyrose: 16770273, + moccasin: 16770229, + navajowhite: 16768685, + navy: 128, + oldlace: 16643558, + olive: 8421376, + olivedrab: 7048739, + orange: 16753920, + orangered: 16729344, + orchid: 14315734, + palegoldenrod: 15657130, + palegreen: 10025880, + paleturquoise: 11529966, + palevioletred: 14381203, + papayawhip: 16773077, + peachpuff: 16767673, + peru: 13468991, + pink: 16761035, + plum: 14524637, + powderblue: 11591910, + purple: 8388736, + rebeccapurple: 6697881, + red: 16711680, + rosybrown: 12357519, + royalblue: 4286945, + saddlebrown: 9127187, + salmon: 16416882, + sandybrown: 16032864, + seagreen: 3050327, + seashell: 16774638, + sienna: 10506797, + silver: 12632256, + skyblue: 8900331, + slateblue: 6970061, + slategray: 7372944, + slategrey: 7372944, + snow: 16775930, + springgreen: 65407, + steelblue: 4620980, + tan: 13808780, + teal: 32896, + thistle: 14204888, + tomato: 16737095, + turquoise: 4251856, + violet: 15631086, + wheat: 16113331, + white: 16777215, + whitesmoke: 16119285, + yellow: 16776960, + yellowgreen: 10145074 + }); + d3_rgb_names.forEach(function(key, value) { + d3_rgb_names.set(key, d3_rgbNumber(value)); + }); + function d3_functor(v) { + return typeof v === "function" ? v : function() { + return v; + }; + } + d3.functor = d3_functor; + d3.xhr = d3_xhrType(d3_identity); + function d3_xhrType(response) { + return function(url, mimeType, callback) { + if (arguments.length === 2 && typeof mimeType === "function") callback = mimeType, + mimeType = null; + return d3_xhr(url, mimeType, response, callback); + }; + } + function d3_xhr(url, mimeType, response, callback) { + var xhr = {}, dispatch = d3.dispatch("beforesend", "progress", "load", "error"), headers = {}, request = new XMLHttpRequest(), responseType = null; + if (this.XDomainRequest && !("withCredentials" in request) && /^(http(s)?:)?\/\//.test(url)) request = new XDomainRequest(); + "onload" in request ? request.onload = request.onerror = respond : request.onreadystatechange = function() { + request.readyState > 3 && respond(); + }; + function respond() { + var status = request.status, result; + if (!status && d3_xhrHasResponse(request) || status >= 200 && status < 300 || status === 304) { + try { + result = response.call(xhr, request); + } catch (e) { + dispatch.error.call(xhr, e); + return; + } + dispatch.load.call(xhr, result); + } else { + dispatch.error.call(xhr, request); + } + } + request.onprogress = function(event) { + var o = d3.event; + d3.event = event; + try { + dispatch.progress.call(xhr, request); + } finally { + d3.event = o; + } + }; + xhr.header = function(name, value) { + name = (name + "").toLowerCase(); + if (arguments.length < 2) return headers[name]; + if (value == null) delete headers[name]; else headers[name] = value + ""; + return xhr; + }; + xhr.mimeType = function(value) { + if (!arguments.length) return mimeType; + mimeType = value == null ? null : value + ""; + return xhr; + }; + xhr.responseType = function(value) { + if (!arguments.length) return responseType; + responseType = value; + return xhr; + }; + xhr.response = function(value) { + response = value; + return xhr; + }; + [ "get", "post" ].forEach(function(method) { + xhr[method] = function() { + return xhr.send.apply(xhr, [ method ].concat(d3_array(arguments))); + }; + }); + xhr.send = function(method, data, callback) { + if (arguments.length === 2 && typeof data === "function") callback = data, data = null; + request.open(method, url, true); + if (mimeType != null && !("accept" in headers)) headers["accept"] = mimeType + ",*/*"; + if (request.setRequestHeader) for (var name in headers) request.setRequestHeader(name, headers[name]); + if (mimeType != null && request.overrideMimeType) request.overrideMimeType(mimeType); + if (responseType != null) request.responseType = responseType; + if (callback != null) xhr.on("error", callback).on("load", function(request) { + callback(null, request); + }); + dispatch.beforesend.call(xhr, request); + request.send(data == null ? null : data); + return xhr; + }; + xhr.abort = function() { + request.abort(); + return xhr; + }; + d3.rebind(xhr, dispatch, "on"); + return callback == null ? xhr : xhr.get(d3_xhr_fixCallback(callback)); + } + function d3_xhr_fixCallback(callback) { + return callback.length === 1 ? function(error, request) { + callback(error == null ? request : null); + } : callback; + } + function d3_xhrHasResponse(request) { + var type = request.responseType; + return type && type !== "text" ? request.response : request.responseText; + } + d3.dsv = function(delimiter, mimeType) { + var reFormat = new RegExp('["' + delimiter + "\n]"), delimiterCode = delimiter.charCodeAt(0); + function dsv(url, row, callback) { + if (arguments.length < 3) callback = row, row = null; + var xhr = d3_xhr(url, mimeType, row == null ? response : typedResponse(row), callback); + xhr.row = function(_) { + return arguments.length ? xhr.response((row = _) == null ? response : typedResponse(_)) : row; + }; + return xhr; + } + function response(request) { + return dsv.parse(request.responseText); + } + function typedResponse(f) { + return function(request) { + return dsv.parse(request.responseText, f); + }; + } + dsv.parse = function(text, f) { + var o; + return dsv.parseRows(text, function(row, i) { + if (o) return o(row, i - 1); + var a = new Function("d", "return {" + row.map(function(name, i) { + return JSON.stringify(name) + ": d[" + i + "]"; + }).join(",") + "}"); + o = f ? function(row, i) { + return f(a(row), i); + } : a; + }); + }; + dsv.parseRows = function(text, f) { + var EOL = {}, EOF = {}, rows = [], N = text.length, I = 0, n = 0, t, eol; + function token() { + if (I >= N) return EOF; + if (eol) return eol = false, EOL; + var j = I; + if (text.charCodeAt(j) === 34) { + var i = j; + while (i++ < N) { + if (text.charCodeAt(i) === 34) { + if (text.charCodeAt(i + 1) !== 34) break; + ++i; + } + } + I = i + 2; + var c = text.charCodeAt(i + 1); + if (c === 13) { + eol = true; + if (text.charCodeAt(i + 2) === 10) ++I; + } else if (c === 10) { + eol = true; + } + return text.slice(j + 1, i).replace(/""/g, '"'); + } + while (I < N) { + var c = text.charCodeAt(I++), k = 1; + if (c === 10) eol = true; else if (c === 13) { + eol = true; + if (text.charCodeAt(I) === 10) ++I, ++k; + } else if (c !== delimiterCode) continue; + return text.slice(j, I - k); + } + return text.slice(j); + } + while ((t = token()) !== EOF) { + var a = []; + while (t !== EOL && t !== EOF) { + a.push(t); + t = token(); + } + if (f && (a = f(a, n++)) == null) continue; + rows.push(a); + } + return rows; + }; + dsv.format = function(rows) { + if (Array.isArray(rows[0])) return dsv.formatRows(rows); + var fieldSet = new d3_Set(), fields = []; + rows.forEach(function(row) { + for (var field in row) { + if (!fieldSet.has(field)) { + fields.push(fieldSet.add(field)); + } + } + }); + return [ fields.map(formatValue).join(delimiter) ].concat(rows.map(function(row) { + return fields.map(function(field) { + return formatValue(row[field]); + }).join(delimiter); + })).join("\n"); + }; + dsv.formatRows = function(rows) { + return rows.map(formatRow).join("\n"); + }; + function formatRow(row) { + return row.map(formatValue).join(delimiter); + } + function formatValue(text) { + return reFormat.test(text) ? '"' + text.replace(/\"/g, '""') + '"' : text; + } + return dsv; + }; + d3.csv = d3.dsv(",", "text/csv"); + d3.tsv = d3.dsv(" ", "text/tab-separated-values"); + var d3_timer_queueHead, d3_timer_queueTail, d3_timer_interval, d3_timer_timeout, d3_timer_frame = this[d3_vendorSymbol(this, "requestAnimationFrame")] || function(callback) { + setTimeout(callback, 17); + }; + d3.timer = function() { + d3_timer.apply(this, arguments); + }; + function d3_timer(callback, delay, then) { + var n = arguments.length; + if (n < 2) delay = 0; + if (n < 3) then = Date.now(); + var time = then + delay, timer = { + c: callback, + t: time, + n: null + }; + if (d3_timer_queueTail) d3_timer_queueTail.n = timer; else d3_timer_queueHead = timer; + d3_timer_queueTail = timer; + if (!d3_timer_interval) { + d3_timer_timeout = clearTimeout(d3_timer_timeout); + d3_timer_interval = 1; + d3_timer_frame(d3_timer_step); + } + return timer; + } + function d3_timer_step() { + var now = d3_timer_mark(), delay = d3_timer_sweep() - now; + if (delay > 24) { + if (isFinite(delay)) { + clearTimeout(d3_timer_timeout); + d3_timer_timeout = setTimeout(d3_timer_step, delay); + } + d3_timer_interval = 0; + } else { + d3_timer_interval = 1; + d3_timer_frame(d3_timer_step); + } + } + d3.timer.flush = function() { + d3_timer_mark(); + d3_timer_sweep(); + }; + function d3_timer_mark() { + var now = Date.now(), timer = d3_timer_queueHead; + while (timer) { + if (now >= timer.t && timer.c(now - timer.t)) timer.c = null; + timer = timer.n; + } + return now; + } + function d3_timer_sweep() { + var t0, t1 = d3_timer_queueHead, time = Infinity; + while (t1) { + if (t1.c) { + if (t1.t < time) time = t1.t; + t1 = (t0 = t1).n; + } else { + t1 = t0 ? t0.n = t1.n : d3_timer_queueHead = t1.n; + } + } + d3_timer_queueTail = t0; + return time; + } + function d3_format_precision(x, p) { + return p - (x ? Math.ceil(Math.log(x) / Math.LN10) : 1); + } + d3.round = function(x, n) { + return n ? Math.round(x * (n = Math.pow(10, n))) / n : Math.round(x); + }; + var d3_formatPrefixes = [ "y", "z", "a", "f", "p", "n", "µ", "m", "", "k", "M", "G", "T", "P", "E", "Z", "Y" ].map(d3_formatPrefix); + d3.formatPrefix = function(value, precision) { + var i = 0; + if (value = +value) { + if (value < 0) value *= -1; + if (precision) value = d3.round(value, d3_format_precision(value, precision)); + i = 1 + Math.floor(1e-12 + Math.log(value) / Math.LN10); + i = Math.max(-24, Math.min(24, Math.floor((i - 1) / 3) * 3)); + } + return d3_formatPrefixes[8 + i / 3]; + }; + function d3_formatPrefix(d, i) { + var k = Math.pow(10, abs(8 - i) * 3); + return { + scale: i > 8 ? function(d) { + return d / k; + } : function(d) { + return d * k; + }, + symbol: d + }; + } + function d3_locale_numberFormat(locale) { + var locale_decimal = locale.decimal, locale_thousands = locale.thousands, locale_grouping = locale.grouping, locale_currency = locale.currency, formatGroup = locale_grouping && locale_thousands ? function(value, width) { + var i = value.length, t = [], j = 0, g = locale_grouping[0], length = 0; + while (i > 0 && g > 0) { + if (length + g + 1 > width) g = Math.max(1, width - length); + t.push(value.substring(i -= g, i + g)); + if ((length += g + 1) > width) break; + g = locale_grouping[j = (j + 1) % locale_grouping.length]; + } + return t.reverse().join(locale_thousands); + } : d3_identity; + return function(specifier) { + var match = d3_format_re.exec(specifier), fill = match[1] || " ", align = match[2] || ">", sign = match[3] || "-", symbol = match[4] || "", zfill = match[5], width = +match[6], comma = match[7], precision = match[8], type = match[9], scale = 1, prefix = "", suffix = "", integer = false, exponent = true; + if (precision) precision = +precision.substring(1); + if (zfill || fill === "0" && align === "=") { + zfill = fill = "0"; + align = "="; + } + switch (type) { + case "n": + comma = true; + type = "g"; + break; + + case "%": + scale = 100; + suffix = "%"; + type = "f"; + break; + + case "p": + scale = 100; + suffix = "%"; + type = "r"; + break; + + case "b": + case "o": + case "x": + case "X": + if (symbol === "#") prefix = "0" + type.toLowerCase(); + + case "c": + exponent = false; + + case "d": + integer = true; + precision = 0; + break; + + case "s": + scale = -1; + type = "r"; + break; + } + if (symbol === "$") prefix = locale_currency[0], suffix = locale_currency[1]; + if (type == "r" && !precision) type = "g"; + if (precision != null) { + if (type == "g") precision = Math.max(1, Math.min(21, precision)); else if (type == "e" || type == "f") precision = Math.max(0, Math.min(20, precision)); + } + type = d3_format_types.get(type) || d3_format_typeDefault; + var zcomma = zfill && comma; + return function(value) { + var fullSuffix = suffix; + if (integer && value % 1) return ""; + var negative = value < 0 || value === 0 && 1 / value < 0 ? (value = -value, "-") : sign === "-" ? "" : sign; + if (scale < 0) { + var unit = d3.formatPrefix(value, precision); + value = unit.scale(value); + fullSuffix = unit.symbol + suffix; + } else { + value *= scale; + } + value = type(value, precision); + var i = value.lastIndexOf("."), before, after; + if (i < 0) { + var j = exponent ? value.lastIndexOf("e") : -1; + if (j < 0) before = value, after = ""; else before = value.substring(0, j), after = value.substring(j); + } else { + before = value.substring(0, i); + after = locale_decimal + value.substring(i + 1); + } + if (!zfill && comma) before = formatGroup(before, Infinity); + var length = prefix.length + before.length + after.length + (zcomma ? 0 : negative.length), padding = length < width ? new Array(length = width - length + 1).join(fill) : ""; + if (zcomma) before = formatGroup(padding + before, padding.length ? width - after.length : Infinity); + negative += prefix; + value = before + after; + return (align === "<" ? negative + value + padding : align === ">" ? padding + negative + value : align === "^" ? padding.substring(0, length >>= 1) + negative + value + padding.substring(length) : negative + (zcomma ? value : padding + value)) + fullSuffix; + }; + }; + } + var d3_format_re = /(?:([^{])?([<>=^]))?([+\- ])?([$#])?(0)?(\d+)?(,)?(\.-?\d+)?([a-z%])?/i; + var d3_format_types = d3.map({ + b: function(x) { + return x.toString(2); + }, + c: function(x) { + return String.fromCharCode(x); + }, + o: function(x) { + return x.toString(8); + }, + x: function(x) { + return x.toString(16); + }, + X: function(x) { + return x.toString(16).toUpperCase(); + }, + g: function(x, p) { + return x.toPrecision(p); + }, + e: function(x, p) { + return x.toExponential(p); + }, + f: function(x, p) { + return x.toFixed(p); + }, + r: function(x, p) { + return (x = d3.round(x, d3_format_precision(x, p))).toFixed(Math.max(0, Math.min(20, d3_format_precision(x * (1 + 1e-15), p)))); + } + }); + function d3_format_typeDefault(x) { + return x + ""; + } + var d3_time = d3.time = {}, d3_date = Date; + function d3_date_utc() { + this._ = new Date(arguments.length > 1 ? Date.UTC.apply(this, arguments) : arguments[0]); + } + d3_date_utc.prototype = { + getDate: function() { + return this._.getUTCDate(); + }, + getDay: function() { + return this._.getUTCDay(); + }, + getFullYear: function() { + return this._.getUTCFullYear(); + }, + getHours: function() { + return this._.getUTCHours(); + }, + getMilliseconds: function() { + return this._.getUTCMilliseconds(); + }, + getMinutes: function() { + return this._.getUTCMinutes(); + }, + getMonth: function() { + return this._.getUTCMonth(); + }, + getSeconds: function() { + return this._.getUTCSeconds(); + }, + getTime: function() { + return this._.getTime(); + }, + getTimezoneOffset: function() { + return 0; + }, + valueOf: function() { + return this._.valueOf(); + }, + setDate: function() { + d3_time_prototype.setUTCDate.apply(this._, arguments); + }, + setDay: function() { + d3_time_prototype.setUTCDay.apply(this._, arguments); + }, + setFullYear: function() { + d3_time_prototype.setUTCFullYear.apply(this._, arguments); + }, + setHours: function() { + d3_time_prototype.setUTCHours.apply(this._, arguments); + }, + setMilliseconds: function() { + d3_time_prototype.setUTCMilliseconds.apply(this._, arguments); + }, + setMinutes: function() { + d3_time_prototype.setUTCMinutes.apply(this._, arguments); + }, + setMonth: function() { + d3_time_prototype.setUTCMonth.apply(this._, arguments); + }, + setSeconds: function() { + d3_time_prototype.setUTCSeconds.apply(this._, arguments); + }, + setTime: function() { + d3_time_prototype.setTime.apply(this._, arguments); + } + }; + var d3_time_prototype = Date.prototype; + function d3_time_interval(local, step, number) { + function round(date) { + var d0 = local(date), d1 = offset(d0, 1); + return date - d0 < d1 - date ? d0 : d1; + } + function ceil(date) { + step(date = local(new d3_date(date - 1)), 1); + return date; + } + function offset(date, k) { + step(date = new d3_date(+date), k); + return date; + } + function range(t0, t1, dt) { + var time = ceil(t0), times = []; + if (dt > 1) { + while (time < t1) { + if (!(number(time) % dt)) times.push(new Date(+time)); + step(time, 1); + } + } else { + while (time < t1) times.push(new Date(+time)), step(time, 1); + } + return times; + } + function range_utc(t0, t1, dt) { + try { + d3_date = d3_date_utc; + var utc = new d3_date_utc(); + utc._ = t0; + return range(utc, t1, dt); + } finally { + d3_date = Date; + } + } + local.floor = local; + local.round = round; + local.ceil = ceil; + local.offset = offset; + local.range = range; + var utc = local.utc = d3_time_interval_utc(local); + utc.floor = utc; + utc.round = d3_time_interval_utc(round); + utc.ceil = d3_time_interval_utc(ceil); + utc.offset = d3_time_interval_utc(offset); + utc.range = range_utc; + return local; + } + function d3_time_interval_utc(method) { + return function(date, k) { + try { + d3_date = d3_date_utc; + var utc = new d3_date_utc(); + utc._ = date; + return method(utc, k)._; + } finally { + d3_date = Date; + } + }; + } + d3_time.year = d3_time_interval(function(date) { + date = d3_time.day(date); + date.setMonth(0, 1); + return date; + }, function(date, offset) { + date.setFullYear(date.getFullYear() + offset); + }, function(date) { + return date.getFullYear(); + }); + d3_time.years = d3_time.year.range; + d3_time.years.utc = d3_time.year.utc.range; + d3_time.day = d3_time_interval(function(date) { + var day = new d3_date(2e3, 0); + day.setFullYear(date.getFullYear(), date.getMonth(), date.getDate()); + return day; + }, function(date, offset) { + date.setDate(date.getDate() + offset); + }, function(date) { + return date.getDate() - 1; + }); + d3_time.days = d3_time.day.range; + d3_time.days.utc = d3_time.day.utc.range; + d3_time.dayOfYear = function(date) { + var year = d3_time.year(date); + return Math.floor((date - year - (date.getTimezoneOffset() - year.getTimezoneOffset()) * 6e4) / 864e5); + }; + [ "sunday", "monday", "tuesday", "wednesday", "thursday", "friday", "saturday" ].forEach(function(day, i) { + i = 7 - i; + var interval = d3_time[day] = d3_time_interval(function(date) { + (date = d3_time.day(date)).setDate(date.getDate() - (date.getDay() + i) % 7); + return date; + }, function(date, offset) { + date.setDate(date.getDate() + Math.floor(offset) * 7); + }, function(date) { + var day = d3_time.year(date).getDay(); + return Math.floor((d3_time.dayOfYear(date) + (day + i) % 7) / 7) - (day !== i); + }); + d3_time[day + "s"] = interval.range; + d3_time[day + "s"].utc = interval.utc.range; + d3_time[day + "OfYear"] = function(date) { + var day = d3_time.year(date).getDay(); + return Math.floor((d3_time.dayOfYear(date) + (day + i) % 7) / 7); + }; + }); + d3_time.week = d3_time.sunday; + d3_time.weeks = d3_time.sunday.range; + d3_time.weeks.utc = d3_time.sunday.utc.range; + d3_time.weekOfYear = d3_time.sundayOfYear; + function d3_locale_timeFormat(locale) { + var locale_dateTime = locale.dateTime, locale_date = locale.date, locale_time = locale.time, locale_periods = locale.periods, locale_days = locale.days, locale_shortDays = locale.shortDays, locale_months = locale.months, locale_shortMonths = locale.shortMonths; + function d3_time_format(template) { + var n = template.length; + function format(date) { + var string = [], i = -1, j = 0, c, p, f; + while (++i < n) { + if (template.charCodeAt(i) === 37) { + string.push(template.slice(j, i)); + if ((p = d3_time_formatPads[c = template.charAt(++i)]) != null) c = template.charAt(++i); + if (f = d3_time_formats[c]) c = f(date, p == null ? c === "e" ? " " : "0" : p); + string.push(c); + j = i + 1; + } + } + string.push(template.slice(j, i)); + return string.join(""); + } + format.parse = function(string) { + var d = { + y: 1900, + m: 0, + d: 1, + H: 0, + M: 0, + S: 0, + L: 0, + Z: null + }, i = d3_time_parse(d, template, string, 0); + if (i != string.length) return null; + if ("p" in d) d.H = d.H % 12 + d.p * 12; + var localZ = d.Z != null && d3_date !== d3_date_utc, date = new (localZ ? d3_date_utc : d3_date)(); + if ("j" in d) date.setFullYear(d.y, 0, d.j); else if ("W" in d || "U" in d) { + if (!("w" in d)) d.w = "W" in d ? 1 : 0; + date.setFullYear(d.y, 0, 1); + date.setFullYear(d.y, 0, "W" in d ? (d.w + 6) % 7 + d.W * 7 - (date.getDay() + 5) % 7 : d.w + d.U * 7 - (date.getDay() + 6) % 7); + } else date.setFullYear(d.y, d.m, d.d); + date.setHours(d.H + (d.Z / 100 | 0), d.M + d.Z % 100, d.S, d.L); + return localZ ? date._ : date; + }; + format.toString = function() { + return template; + }; + return format; + } + function d3_time_parse(date, template, string, j) { + var c, p, t, i = 0, n = template.length, m = string.length; + while (i < n) { + if (j >= m) return -1; + c = template.charCodeAt(i++); + if (c === 37) { + t = template.charAt(i++); + p = d3_time_parsers[t in d3_time_formatPads ? template.charAt(i++) : t]; + if (!p || (j = p(date, string, j)) < 0) return -1; + } else if (c != string.charCodeAt(j++)) { + return -1; + } + } + return j; + } + d3_time_format.utc = function(template) { + var local = d3_time_format(template); + function format(date) { + try { + d3_date = d3_date_utc; + var utc = new d3_date(); + utc._ = date; + return local(utc); + } finally { + d3_date = Date; + } + } + format.parse = function(string) { + try { + d3_date = d3_date_utc; + var date = local.parse(string); + return date && date._; + } finally { + d3_date = Date; + } + }; + format.toString = local.toString; + return format; + }; + d3_time_format.multi = d3_time_format.utc.multi = d3_time_formatMulti; + var d3_time_periodLookup = d3.map(), d3_time_dayRe = d3_time_formatRe(locale_days), d3_time_dayLookup = d3_time_formatLookup(locale_days), d3_time_dayAbbrevRe = d3_time_formatRe(locale_shortDays), d3_time_dayAbbrevLookup = d3_time_formatLookup(locale_shortDays), d3_time_monthRe = d3_time_formatRe(locale_months), d3_time_monthLookup = d3_time_formatLookup(locale_months), d3_time_monthAbbrevRe = d3_time_formatRe(locale_shortMonths), d3_time_monthAbbrevLookup = d3_time_formatLookup(locale_shortMonths); + locale_periods.forEach(function(p, i) { + d3_time_periodLookup.set(p.toLowerCase(), i); + }); + var d3_time_formats = { + a: function(d) { + return locale_shortDays[d.getDay()]; + }, + A: function(d) { + return locale_days[d.getDay()]; + }, + b: function(d) { + return locale_shortMonths[d.getMonth()]; + }, + B: function(d) { + return locale_months[d.getMonth()]; + }, + c: d3_time_format(locale_dateTime), + d: function(d, p) { + return d3_time_formatPad(d.getDate(), p, 2); + }, + e: function(d, p) { + return d3_time_formatPad(d.getDate(), p, 2); + }, + H: function(d, p) { + return d3_time_formatPad(d.getHours(), p, 2); + }, + I: function(d, p) { + return d3_time_formatPad(d.getHours() % 12 || 12, p, 2); + }, + j: function(d, p) { + return d3_time_formatPad(1 + d3_time.dayOfYear(d), p, 3); + }, + L: function(d, p) { + return d3_time_formatPad(d.getMilliseconds(), p, 3); + }, + m: function(d, p) { + return d3_time_formatPad(d.getMonth() + 1, p, 2); + }, + M: function(d, p) { + return d3_time_formatPad(d.getMinutes(), p, 2); + }, + p: function(d) { + return locale_periods[+(d.getHours() >= 12)]; + }, + S: function(d, p) { + return d3_time_formatPad(d.getSeconds(), p, 2); + }, + U: function(d, p) { + return d3_time_formatPad(d3_time.sundayOfYear(d), p, 2); + }, + w: function(d) { + return d.getDay(); + }, + W: function(d, p) { + return d3_time_formatPad(d3_time.mondayOfYear(d), p, 2); + }, + x: d3_time_format(locale_date), + X: d3_time_format(locale_time), + y: function(d, p) { + return d3_time_formatPad(d.getFullYear() % 100, p, 2); + }, + Y: function(d, p) { + return d3_time_formatPad(d.getFullYear() % 1e4, p, 4); + }, + Z: d3_time_zone, + "%": function() { + return "%"; + } + }; + var d3_time_parsers = { + a: d3_time_parseWeekdayAbbrev, + A: d3_time_parseWeekday, + b: d3_time_parseMonthAbbrev, + B: d3_time_parseMonth, + c: d3_time_parseLocaleFull, + d: d3_time_parseDay, + e: d3_time_parseDay, + H: d3_time_parseHour24, + I: d3_time_parseHour24, + j: d3_time_parseDayOfYear, + L: d3_time_parseMilliseconds, + m: d3_time_parseMonthNumber, + M: d3_time_parseMinutes, + p: d3_time_parseAmPm, + S: d3_time_parseSeconds, + U: d3_time_parseWeekNumberSunday, + w: d3_time_parseWeekdayNumber, + W: d3_time_parseWeekNumberMonday, + x: d3_time_parseLocaleDate, + X: d3_time_parseLocaleTime, + y: d3_time_parseYear, + Y: d3_time_parseFullYear, + Z: d3_time_parseZone, + "%": d3_time_parseLiteralPercent + }; + function d3_time_parseWeekdayAbbrev(date, string, i) { + d3_time_dayAbbrevRe.lastIndex = 0; + var n = d3_time_dayAbbrevRe.exec(string.slice(i)); + return n ? (date.w = d3_time_dayAbbrevLookup.get(n[0].toLowerCase()), i + n[0].length) : -1; + } + function d3_time_parseWeekday(date, string, i) { + d3_time_dayRe.lastIndex = 0; + var n = d3_time_dayRe.exec(string.slice(i)); + return n ? (date.w = d3_time_dayLookup.get(n[0].toLowerCase()), i + n[0].length) : -1; + } + function d3_time_parseMonthAbbrev(date, string, i) { + d3_time_monthAbbrevRe.lastIndex = 0; + var n = d3_time_monthAbbrevRe.exec(string.slice(i)); + return n ? (date.m = d3_time_monthAbbrevLookup.get(n[0].toLowerCase()), i + n[0].length) : -1; + } + function d3_time_parseMonth(date, string, i) { + d3_time_monthRe.lastIndex = 0; + var n = d3_time_monthRe.exec(string.slice(i)); + return n ? (date.m = d3_time_monthLookup.get(n[0].toLowerCase()), i + n[0].length) : -1; + } + function d3_time_parseLocaleFull(date, string, i) { + return d3_time_parse(date, d3_time_formats.c.toString(), string, i); + } + function d3_time_parseLocaleDate(date, string, i) { + return d3_time_parse(date, d3_time_formats.x.toString(), string, i); + } + function d3_time_parseLocaleTime(date, string, i) { + return d3_time_parse(date, d3_time_formats.X.toString(), string, i); + } + function d3_time_parseAmPm(date, string, i) { + var n = d3_time_periodLookup.get(string.slice(i, i += 2).toLowerCase()); + return n == null ? -1 : (date.p = n, i); + } + return d3_time_format; + } + var d3_time_formatPads = { + "-": "", + _: " ", + "0": "0" + }, d3_time_numberRe = /^\s*\d+/, d3_time_percentRe = /^%/; + function d3_time_formatPad(value, fill, width) { + var sign = value < 0 ? "-" : "", string = (sign ? -value : value) + "", length = string.length; + return sign + (length < width ? new Array(width - length + 1).join(fill) + string : string); + } + function d3_time_formatRe(names) { + return new RegExp("^(?:" + names.map(d3.requote).join("|") + ")", "i"); + } + function d3_time_formatLookup(names) { + var map = new d3_Map(), i = -1, n = names.length; + while (++i < n) map.set(names[i].toLowerCase(), i); + return map; + } + function d3_time_parseWeekdayNumber(date, string, i) { + d3_time_numberRe.lastIndex = 0; + var n = d3_time_numberRe.exec(string.slice(i, i + 1)); + return n ? (date.w = +n[0], i + n[0].length) : -1; + } + function d3_time_parseWeekNumberSunday(date, string, i) { + d3_time_numberRe.lastIndex = 0; + var n = d3_time_numberRe.exec(string.slice(i)); + return n ? (date.U = +n[0], i + n[0].length) : -1; + } + function d3_time_parseWeekNumberMonday(date, string, i) { + d3_time_numberRe.lastIndex = 0; + var n = d3_time_numberRe.exec(string.slice(i)); + return n ? (date.W = +n[0], i + n[0].length) : -1; + } + function d3_time_parseFullYear(date, string, i) { + d3_time_numberRe.lastIndex = 0; + var n = d3_time_numberRe.exec(string.slice(i, i + 4)); + return n ? (date.y = +n[0], i + n[0].length) : -1; + } + function d3_time_parseYear(date, string, i) { + d3_time_numberRe.lastIndex = 0; + var n = d3_time_numberRe.exec(string.slice(i, i + 2)); + return n ? (date.y = d3_time_expandYear(+n[0]), i + n[0].length) : -1; + } + function d3_time_parseZone(date, string, i) { + return /^[+-]\d{4}$/.test(string = string.slice(i, i + 5)) ? (date.Z = -string, + i + 5) : -1; + } + function d3_time_expandYear(d) { + return d + (d > 68 ? 1900 : 2e3); + } + function d3_time_parseMonthNumber(date, string, i) { + d3_time_numberRe.lastIndex = 0; + var n = d3_time_numberRe.exec(string.slice(i, i + 2)); + return n ? (date.m = n[0] - 1, i + n[0].length) : -1; + } + function d3_time_parseDay(date, string, i) { + d3_time_numberRe.lastIndex = 0; + var n = d3_time_numberRe.exec(string.slice(i, i + 2)); + return n ? (date.d = +n[0], i + n[0].length) : -1; + } + function d3_time_parseDayOfYear(date, string, i) { + d3_time_numberRe.lastIndex = 0; + var n = d3_time_numberRe.exec(string.slice(i, i + 3)); + return n ? (date.j = +n[0], i + n[0].length) : -1; + } + function d3_time_parseHour24(date, string, i) { + d3_time_numberRe.lastIndex = 0; + var n = d3_time_numberRe.exec(string.slice(i, i + 2)); + return n ? (date.H = +n[0], i + n[0].length) : -1; + } + function d3_time_parseMinutes(date, string, i) { + d3_time_numberRe.lastIndex = 0; + var n = d3_time_numberRe.exec(string.slice(i, i + 2)); + return n ? (date.M = +n[0], i + n[0].length) : -1; + } + function d3_time_parseSeconds(date, string, i) { + d3_time_numberRe.lastIndex = 0; + var n = d3_time_numberRe.exec(string.slice(i, i + 2)); + return n ? (date.S = +n[0], i + n[0].length) : -1; + } + function d3_time_parseMilliseconds(date, string, i) { + d3_time_numberRe.lastIndex = 0; + var n = d3_time_numberRe.exec(string.slice(i, i + 3)); + return n ? (date.L = +n[0], i + n[0].length) : -1; + } + function d3_time_zone(d) { + var z = d.getTimezoneOffset(), zs = z > 0 ? "-" : "+", zh = abs(z) / 60 | 0, zm = abs(z) % 60; + return zs + d3_time_formatPad(zh, "0", 2) + d3_time_formatPad(zm, "0", 2); + } + function d3_time_parseLiteralPercent(date, string, i) { + d3_time_percentRe.lastIndex = 0; + var n = d3_time_percentRe.exec(string.slice(i, i + 1)); + return n ? i + n[0].length : -1; + } + function d3_time_formatMulti(formats) { + var n = formats.length, i = -1; + while (++i < n) formats[i][0] = this(formats[i][0]); + return function(date) { + var i = 0, f = formats[i]; + while (!f[1](date)) f = formats[++i]; + return f[0](date); + }; + } + d3.locale = function(locale) { + return { + numberFormat: d3_locale_numberFormat(locale), + timeFormat: d3_locale_timeFormat(locale) + }; + }; + var d3_locale_enUS = d3.locale({ + decimal: ".", + thousands: ",", + grouping: [ 3 ], + currency: [ "$", "" ], + dateTime: "%a %b %e %X %Y", + date: "%m/%d/%Y", + time: "%H:%M:%S", + periods: [ "AM", "PM" ], + days: [ "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" ], + shortDays: [ "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" ], + months: [ "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" ], + shortMonths: [ "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" ] + }); + d3.format = d3_locale_enUS.numberFormat; + d3.geo = {}; + function d3_adder() {} + d3_adder.prototype = { + s: 0, + t: 0, + add: function(y) { + d3_adderSum(y, this.t, d3_adderTemp); + d3_adderSum(d3_adderTemp.s, this.s, this); + if (this.s) this.t += d3_adderTemp.t; else this.s = d3_adderTemp.t; + }, + reset: function() { + this.s = this.t = 0; + }, + valueOf: function() { + return this.s; + } + }; + var d3_adderTemp = new d3_adder(); + function d3_adderSum(a, b, o) { + var x = o.s = a + b, bv = x - a, av = x - bv; + o.t = a - av + (b - bv); + } + d3.geo.stream = function(object, listener) { + if (object && d3_geo_streamObjectType.hasOwnProperty(object.type)) { + d3_geo_streamObjectType[object.type](object, listener); + } else { + d3_geo_streamGeometry(object, listener); + } + }; + function d3_geo_streamGeometry(geometry, listener) { + if (geometry && d3_geo_streamGeometryType.hasOwnProperty(geometry.type)) { + d3_geo_streamGeometryType[geometry.type](geometry, listener); + } + } + var d3_geo_streamObjectType = { + Feature: function(feature, listener) { + d3_geo_streamGeometry(feature.geometry, listener); + }, + FeatureCollection: function(object, listener) { + var features = object.features, i = -1, n = features.length; + while (++i < n) d3_geo_streamGeometry(features[i].geometry, listener); + } + }; + var d3_geo_streamGeometryType = { + Sphere: function(object, listener) { + listener.sphere(); + }, + Point: function(object, listener) { + object = object.coordinates; + listener.point(object[0], object[1], object[2]); + }, + MultiPoint: function(object, listener) { + var coordinates = object.coordinates, i = -1, n = coordinates.length; + while (++i < n) object = coordinates[i], listener.point(object[0], object[1], object[2]); + }, + LineString: function(object, listener) { + d3_geo_streamLine(object.coordinates, listener, 0); + }, + MultiLineString: function(object, listener) { + var coordinates = object.coordinates, i = -1, n = coordinates.length; + while (++i < n) d3_geo_streamLine(coordinates[i], listener, 0); + }, + Polygon: function(object, listener) { + d3_geo_streamPolygon(object.coordinates, listener); + }, + MultiPolygon: function(object, listener) { + var coordinates = object.coordinates, i = -1, n = coordinates.length; + while (++i < n) d3_geo_streamPolygon(coordinates[i], listener); + }, + GeometryCollection: function(object, listener) { + var geometries = object.geometries, i = -1, n = geometries.length; + while (++i < n) d3_geo_streamGeometry(geometries[i], listener); + } + }; + function d3_geo_streamLine(coordinates, listener, closed) { + var i = -1, n = coordinates.length - closed, coordinate; + listener.lineStart(); + while (++i < n) coordinate = coordinates[i], listener.point(coordinate[0], coordinate[1], coordinate[2]); + listener.lineEnd(); + } + function d3_geo_streamPolygon(coordinates, listener) { + var i = -1, n = coordinates.length; + listener.polygonStart(); + while (++i < n) d3_geo_streamLine(coordinates[i], listener, 1); + listener.polygonEnd(); + } + d3.geo.area = function(object) { + d3_geo_areaSum = 0; + d3.geo.stream(object, d3_geo_area); + return d3_geo_areaSum; + }; + var d3_geo_areaSum, d3_geo_areaRingSum = new d3_adder(); + var d3_geo_area = { + sphere: function() { + d3_geo_areaSum += 4 * π; + }, + point: d3_noop, + lineStart: d3_noop, + lineEnd: d3_noop, + polygonStart: function() { + d3_geo_areaRingSum.reset(); + d3_geo_area.lineStart = d3_geo_areaRingStart; + }, + polygonEnd: function() { + var area = 2 * d3_geo_areaRingSum; + d3_geo_areaSum += area < 0 ? 4 * π + area : area; + d3_geo_area.lineStart = d3_geo_area.lineEnd = d3_geo_area.point = d3_noop; + } + }; + function d3_geo_areaRingStart() { + var λ00, φ00, λ0, cosφ0, sinφ0; + d3_geo_area.point = function(λ, φ) { + d3_geo_area.point = nextPoint; + λ0 = (λ00 = λ) * d3_radians, cosφ0 = Math.cos(φ = (φ00 = φ) * d3_radians / 2 + π / 4), + sinφ0 = Math.sin(φ); + }; + function nextPoint(λ, φ) { + λ *= d3_radians; + φ = φ * d3_radians / 2 + π / 4; + var dλ = λ - λ0, sdλ = dλ >= 0 ? 1 : -1, adλ = sdλ * dλ, cosφ = Math.cos(φ), sinφ = Math.sin(φ), k = sinφ0 * sinφ, u = cosφ0 * cosφ + k * Math.cos(adλ), v = k * sdλ * Math.sin(adλ); + d3_geo_areaRingSum.add(Math.atan2(v, u)); + λ0 = λ, cosφ0 = cosφ, sinφ0 = sinφ; + } + d3_geo_area.lineEnd = function() { + nextPoint(λ00, φ00); + }; + } + function d3_geo_cartesian(spherical) { + var λ = spherical[0], φ = spherical[1], cosφ = Math.cos(φ); + return [ cosφ * Math.cos(λ), cosφ * Math.sin(λ), Math.sin(φ) ]; + } + function d3_geo_cartesianDot(a, b) { + return a[0] * b[0] + a[1] * b[1] + a[2] * b[2]; + } + function d3_geo_cartesianCross(a, b) { + return [ a[1] * b[2] - a[2] * b[1], a[2] * b[0] - a[0] * b[2], a[0] * b[1] - a[1] * b[0] ]; + } + function d3_geo_cartesianAdd(a, b) { + a[0] += b[0]; + a[1] += b[1]; + a[2] += b[2]; + } + function d3_geo_cartesianScale(vector, k) { + return [ vector[0] * k, vector[1] * k, vector[2] * k ]; + } + function d3_geo_cartesianNormalize(d) { + var l = Math.sqrt(d[0] * d[0] + d[1] * d[1] + d[2] * d[2]); + d[0] /= l; + d[1] /= l; + d[2] /= l; + } + function d3_geo_spherical(cartesian) { + return [ Math.atan2(cartesian[1], cartesian[0]), d3_asin(cartesian[2]) ]; + } + function d3_geo_sphericalEqual(a, b) { + return abs(a[0] - b[0]) < ε && abs(a[1] - b[1]) < ε; + } + d3.geo.bounds = function() { + var λ0, φ0, λ1, φ1, λ_, λ__, φ__, p0, dλSum, ranges, range; + var bound = { + point: point, + lineStart: lineStart, + lineEnd: lineEnd, + polygonStart: function() { + bound.point = ringPoint; + bound.lineStart = ringStart; + bound.lineEnd = ringEnd; + dλSum = 0; + d3_geo_area.polygonStart(); + }, + polygonEnd: function() { + d3_geo_area.polygonEnd(); + bound.point = point; + bound.lineStart = lineStart; + bound.lineEnd = lineEnd; + if (d3_geo_areaRingSum < 0) λ0 = -(λ1 = 180), φ0 = -(φ1 = 90); else if (dλSum > ε) φ1 = 90; else if (dλSum < -ε) φ0 = -90; + range[0] = λ0, range[1] = λ1; + } + }; + function point(λ, φ) { + ranges.push(range = [ λ0 = λ, λ1 = λ ]); + if (φ < φ0) φ0 = φ; + if (φ > φ1) φ1 = φ; + } + function linePoint(λ, φ) { + var p = d3_geo_cartesian([ λ * d3_radians, φ * d3_radians ]); + if (p0) { + var normal = d3_geo_cartesianCross(p0, p), equatorial = [ normal[1], -normal[0], 0 ], inflection = d3_geo_cartesianCross(equatorial, normal); + d3_geo_cartesianNormalize(inflection); + inflection = d3_geo_spherical(inflection); + var dλ = λ - λ_, s = dλ > 0 ? 1 : -1, λi = inflection[0] * d3_degrees * s, antimeridian = abs(dλ) > 180; + if (antimeridian ^ (s * λ_ < λi && λi < s * λ)) { + var φi = inflection[1] * d3_degrees; + if (φi > φ1) φ1 = φi; + } else if (λi = (λi + 360) % 360 - 180, antimeridian ^ (s * λ_ < λi && λi < s * λ)) { + var φi = -inflection[1] * d3_degrees; + if (φi < φ0) φ0 = φi; + } else { + if (φ < φ0) φ0 = φ; + if (φ > φ1) φ1 = φ; + } + if (antimeridian) { + if (λ < λ_) { + if (angle(λ0, λ) > angle(λ0, λ1)) λ1 = λ; + } else { + if (angle(λ, λ1) > angle(λ0, λ1)) λ0 = λ; + } + } else { + if (λ1 >= λ0) { + if (λ < λ0) λ0 = λ; + if (λ > λ1) λ1 = λ; + } else { + if (λ > λ_) { + if (angle(λ0, λ) > angle(λ0, λ1)) λ1 = λ; + } else { + if (angle(λ, λ1) > angle(λ0, λ1)) λ0 = λ; + } + } + } + } else { + point(λ, φ); + } + p0 = p, λ_ = λ; + } + function lineStart() { + bound.point = linePoint; + } + function lineEnd() { + range[0] = λ0, range[1] = λ1; + bound.point = point; + p0 = null; + } + function ringPoint(λ, φ) { + if (p0) { + var dλ = λ - λ_; + dλSum += abs(dλ) > 180 ? dλ + (dλ > 0 ? 360 : -360) : dλ; + } else λ__ = λ, φ__ = φ; + d3_geo_area.point(λ, φ); + linePoint(λ, φ); + } + function ringStart() { + d3_geo_area.lineStart(); + } + function ringEnd() { + ringPoint(λ__, φ__); + d3_geo_area.lineEnd(); + if (abs(dλSum) > ε) λ0 = -(λ1 = 180); + range[0] = λ0, range[1] = λ1; + p0 = null; + } + function angle(λ0, λ1) { + return (λ1 -= λ0) < 0 ? λ1 + 360 : λ1; + } + function compareRanges(a, b) { + return a[0] - b[0]; + } + function withinRange(x, range) { + return range[0] <= range[1] ? range[0] <= x && x <= range[1] : x < range[0] || range[1] < x; + } + return function(feature) { + φ1 = λ1 = -(λ0 = φ0 = Infinity); + ranges = []; + d3.geo.stream(feature, bound); + var n = ranges.length; + if (n) { + ranges.sort(compareRanges); + for (var i = 1, a = ranges[0], b, merged = [ a ]; i < n; ++i) { + b = ranges[i]; + if (withinRange(b[0], a) || withinRange(b[1], a)) { + if (angle(a[0], b[1]) > angle(a[0], a[1])) a[1] = b[1]; + if (angle(b[0], a[1]) > angle(a[0], a[1])) a[0] = b[0]; + } else { + merged.push(a = b); + } + } + var best = -Infinity, dλ; + for (var n = merged.length - 1, i = 0, a = merged[n], b; i <= n; a = b, ++i) { + b = merged[i]; + if ((dλ = angle(a[1], b[0])) > best) best = dλ, λ0 = b[0], λ1 = a[1]; + } + } + ranges = range = null; + return λ0 === Infinity || φ0 === Infinity ? [ [ NaN, NaN ], [ NaN, NaN ] ] : [ [ λ0, φ0 ], [ λ1, φ1 ] ]; + }; + }(); + d3.geo.centroid = function(object) { + d3_geo_centroidW0 = d3_geo_centroidW1 = d3_geo_centroidX0 = d3_geo_centroidY0 = d3_geo_centroidZ0 = d3_geo_centroidX1 = d3_geo_centroidY1 = d3_geo_centroidZ1 = d3_geo_centroidX2 = d3_geo_centroidY2 = d3_geo_centroidZ2 = 0; + d3.geo.stream(object, d3_geo_centroid); + var x = d3_geo_centroidX2, y = d3_geo_centroidY2, z = d3_geo_centroidZ2, m = x * x + y * y + z * z; + if (m < ε2) { + x = d3_geo_centroidX1, y = d3_geo_centroidY1, z = d3_geo_centroidZ1; + if (d3_geo_centroidW1 < ε) x = d3_geo_centroidX0, y = d3_geo_centroidY0, z = d3_geo_centroidZ0; + m = x * x + y * y + z * z; + if (m < ε2) return [ NaN, NaN ]; + } + return [ Math.atan2(y, x) * d3_degrees, d3_asin(z / Math.sqrt(m)) * d3_degrees ]; + }; + var d3_geo_centroidW0, d3_geo_centroidW1, d3_geo_centroidX0, d3_geo_centroidY0, d3_geo_centroidZ0, d3_geo_centroidX1, d3_geo_centroidY1, d3_geo_centroidZ1, d3_geo_centroidX2, d3_geo_centroidY2, d3_geo_centroidZ2; + var d3_geo_centroid = { + sphere: d3_noop, + point: d3_geo_centroidPoint, + lineStart: d3_geo_centroidLineStart, + lineEnd: d3_geo_centroidLineEnd, + polygonStart: function() { + d3_geo_centroid.lineStart = d3_geo_centroidRingStart; + }, + polygonEnd: function() { + d3_geo_centroid.lineStart = d3_geo_centroidLineStart; + } + }; + function d3_geo_centroidPoint(λ, φ) { + λ *= d3_radians; + var cosφ = Math.cos(φ *= d3_radians); + d3_geo_centroidPointXYZ(cosφ * Math.cos(λ), cosφ * Math.sin(λ), Math.sin(φ)); + } + function d3_geo_centroidPointXYZ(x, y, z) { + ++d3_geo_centroidW0; + d3_geo_centroidX0 += (x - d3_geo_centroidX0) / d3_geo_centroidW0; + d3_geo_centroidY0 += (y - d3_geo_centroidY0) / d3_geo_centroidW0; + d3_geo_centroidZ0 += (z - d3_geo_centroidZ0) / d3_geo_centroidW0; + } + function d3_geo_centroidLineStart() { + var x0, y0, z0; + d3_geo_centroid.point = function(λ, φ) { + λ *= d3_radians; + var cosφ = Math.cos(φ *= d3_radians); + x0 = cosφ * Math.cos(λ); + y0 = cosφ * Math.sin(λ); + z0 = Math.sin(φ); + d3_geo_centroid.point = nextPoint; + d3_geo_centroidPointXYZ(x0, y0, z0); + }; + function nextPoint(λ, φ) { + λ *= d3_radians; + var cosφ = Math.cos(φ *= d3_radians), x = cosφ * Math.cos(λ), y = cosφ * Math.sin(λ), z = Math.sin(φ), w = Math.atan2(Math.sqrt((w = y0 * z - z0 * y) * w + (w = z0 * x - x0 * z) * w + (w = x0 * y - y0 * x) * w), x0 * x + y0 * y + z0 * z); + d3_geo_centroidW1 += w; + d3_geo_centroidX1 += w * (x0 + (x0 = x)); + d3_geo_centroidY1 += w * (y0 + (y0 = y)); + d3_geo_centroidZ1 += w * (z0 + (z0 = z)); + d3_geo_centroidPointXYZ(x0, y0, z0); + } + } + function d3_geo_centroidLineEnd() { + d3_geo_centroid.point = d3_geo_centroidPoint; + } + function d3_geo_centroidRingStart() { + var λ00, φ00, x0, y0, z0; + d3_geo_centroid.point = function(λ, φ) { + λ00 = λ, φ00 = φ; + d3_geo_centroid.point = nextPoint; + λ *= d3_radians; + var cosφ = Math.cos(φ *= d3_radians); + x0 = cosφ * Math.cos(λ); + y0 = cosφ * Math.sin(λ); + z0 = Math.sin(φ); + d3_geo_centroidPointXYZ(x0, y0, z0); + }; + d3_geo_centroid.lineEnd = function() { + nextPoint(λ00, φ00); + d3_geo_centroid.lineEnd = d3_geo_centroidLineEnd; + d3_geo_centroid.point = d3_geo_centroidPoint; + }; + function nextPoint(λ, φ) { + λ *= d3_radians; + var cosφ = Math.cos(φ *= d3_radians), x = cosφ * Math.cos(λ), y = cosφ * Math.sin(λ), z = Math.sin(φ), cx = y0 * z - z0 * y, cy = z0 * x - x0 * z, cz = x0 * y - y0 * x, m = Math.sqrt(cx * cx + cy * cy + cz * cz), u = x0 * x + y0 * y + z0 * z, v = m && -d3_acos(u) / m, w = Math.atan2(m, u); + d3_geo_centroidX2 += v * cx; + d3_geo_centroidY2 += v * cy; + d3_geo_centroidZ2 += v * cz; + d3_geo_centroidW1 += w; + d3_geo_centroidX1 += w * (x0 + (x0 = x)); + d3_geo_centroidY1 += w * (y0 + (y0 = y)); + d3_geo_centroidZ1 += w * (z0 + (z0 = z)); + d3_geo_centroidPointXYZ(x0, y0, z0); + } + } + function d3_geo_compose(a, b) { + function compose(x, y) { + return x = a(x, y), b(x[0], x[1]); + } + if (a.invert && b.invert) compose.invert = function(x, y) { + return x = b.invert(x, y), x && a.invert(x[0], x[1]); + }; + return compose; + } + function d3_true() { + return true; + } + function d3_geo_clipPolygon(segments, compare, clipStartInside, interpolate, listener) { + var subject = [], clip = []; + segments.forEach(function(segment) { + if ((n = segment.length - 1) <= 0) return; + var n, p0 = segment[0], p1 = segment[n]; + if (d3_geo_sphericalEqual(p0, p1)) { + listener.lineStart(); + for (var i = 0; i < n; ++i) listener.point((p0 = segment[i])[0], p0[1]); + listener.lineEnd(); + return; + } + var a = new d3_geo_clipPolygonIntersection(p0, segment, null, true), b = new d3_geo_clipPolygonIntersection(p0, null, a, false); + a.o = b; + subject.push(a); + clip.push(b); + a = new d3_geo_clipPolygonIntersection(p1, segment, null, false); + b = new d3_geo_clipPolygonIntersection(p1, null, a, true); + a.o = b; + subject.push(a); + clip.push(b); + }); + clip.sort(compare); + d3_geo_clipPolygonLinkCircular(subject); + d3_geo_clipPolygonLinkCircular(clip); + if (!subject.length) return; + for (var i = 0, entry = clipStartInside, n = clip.length; i < n; ++i) { + clip[i].e = entry = !entry; + } + var start = subject[0], points, point; + while (1) { + var current = start, isSubject = true; + while (current.v) if ((current = current.n) === start) return; + points = current.z; + listener.lineStart(); + do { + current.v = current.o.v = true; + if (current.e) { + if (isSubject) { + for (var i = 0, n = points.length; i < n; ++i) listener.point((point = points[i])[0], point[1]); + } else { + interpolate(current.x, current.n.x, 1, listener); + } + current = current.n; + } else { + if (isSubject) { + points = current.p.z; + for (var i = points.length - 1; i >= 0; --i) listener.point((point = points[i])[0], point[1]); + } else { + interpolate(current.x, current.p.x, -1, listener); + } + current = current.p; + } + current = current.o; + points = current.z; + isSubject = !isSubject; + } while (!current.v); + listener.lineEnd(); + } + } + function d3_geo_clipPolygonLinkCircular(array) { + if (!(n = array.length)) return; + var n, i = 0, a = array[0], b; + while (++i < n) { + a.n = b = array[i]; + b.p = a; + a = b; + } + a.n = b = array[0]; + b.p = a; + } + function d3_geo_clipPolygonIntersection(point, points, other, entry) { + this.x = point; + this.z = points; + this.o = other; + this.e = entry; + this.v = false; + this.n = this.p = null; + } + function d3_geo_clip(pointVisible, clipLine, interpolate, clipStart) { + return function(rotate, listener) { + var line = clipLine(listener), rotatedClipStart = rotate.invert(clipStart[0], clipStart[1]); + var clip = { + point: point, + lineStart: lineStart, + lineEnd: lineEnd, + polygonStart: function() { + clip.point = pointRing; + clip.lineStart = ringStart; + clip.lineEnd = ringEnd; + segments = []; + polygon = []; + }, + polygonEnd: function() { + clip.point = point; + clip.lineStart = lineStart; + clip.lineEnd = lineEnd; + segments = d3.merge(segments); + var clipStartInside = d3_geo_pointInPolygon(rotatedClipStart, polygon); + if (segments.length) { + if (!polygonStarted) listener.polygonStart(), polygonStarted = true; + d3_geo_clipPolygon(segments, d3_geo_clipSort, clipStartInside, interpolate, listener); + } else if (clipStartInside) { + if (!polygonStarted) listener.polygonStart(), polygonStarted = true; + listener.lineStart(); + interpolate(null, null, 1, listener); + listener.lineEnd(); + } + if (polygonStarted) listener.polygonEnd(), polygonStarted = false; + segments = polygon = null; + }, + sphere: function() { + listener.polygonStart(); + listener.lineStart(); + interpolate(null, null, 1, listener); + listener.lineEnd(); + listener.polygonEnd(); + } + }; + function point(λ, φ) { + var point = rotate(λ, φ); + if (pointVisible(λ = point[0], φ = point[1])) listener.point(λ, φ); + } + function pointLine(λ, φ) { + var point = rotate(λ, φ); + line.point(point[0], point[1]); + } + function lineStart() { + clip.point = pointLine; + line.lineStart(); + } + function lineEnd() { + clip.point = point; + line.lineEnd(); + } + var segments; + var buffer = d3_geo_clipBufferListener(), ringListener = clipLine(buffer), polygonStarted = false, polygon, ring; + function pointRing(λ, φ) { + ring.push([ λ, φ ]); + var point = rotate(λ, φ); + ringListener.point(point[0], point[1]); + } + function ringStart() { + ringListener.lineStart(); + ring = []; + } + function ringEnd() { + pointRing(ring[0][0], ring[0][1]); + ringListener.lineEnd(); + var clean = ringListener.clean(), ringSegments = buffer.buffer(), segment, n = ringSegments.length; + ring.pop(); + polygon.push(ring); + ring = null; + if (!n) return; + if (clean & 1) { + segment = ringSegments[0]; + var n = segment.length - 1, i = -1, point; + if (n > 0) { + if (!polygonStarted) listener.polygonStart(), polygonStarted = true; + listener.lineStart(); + while (++i < n) listener.point((point = segment[i])[0], point[1]); + listener.lineEnd(); + } + return; + } + if (n > 1 && clean & 2) ringSegments.push(ringSegments.pop().concat(ringSegments.shift())); + segments.push(ringSegments.filter(d3_geo_clipSegmentLength1)); + } + return clip; + }; + } + function d3_geo_clipSegmentLength1(segment) { + return segment.length > 1; + } + function d3_geo_clipBufferListener() { + var lines = [], line; + return { + lineStart: function() { + lines.push(line = []); + }, + point: function(λ, φ) { + line.push([ λ, φ ]); + }, + lineEnd: d3_noop, + buffer: function() { + var buffer = lines; + lines = []; + line = null; + return buffer; + }, + rejoin: function() { + if (lines.length > 1) lines.push(lines.pop().concat(lines.shift())); + } + }; + } + function d3_geo_clipSort(a, b) { + return ((a = a.x)[0] < 0 ? a[1] - halfπ - ε : halfπ - a[1]) - ((b = b.x)[0] < 0 ? b[1] - halfπ - ε : halfπ - b[1]); + } + var d3_geo_clipAntimeridian = d3_geo_clip(d3_true, d3_geo_clipAntimeridianLine, d3_geo_clipAntimeridianInterpolate, [ -π, -π / 2 ]); + function d3_geo_clipAntimeridianLine(listener) { + var λ0 = NaN, φ0 = NaN, sλ0 = NaN, clean; + return { + lineStart: function() { + listener.lineStart(); + clean = 1; + }, + point: function(λ1, φ1) { + var sλ1 = λ1 > 0 ? π : -π, dλ = abs(λ1 - λ0); + if (abs(dλ - π) < ε) { + listener.point(λ0, φ0 = (φ0 + φ1) / 2 > 0 ? halfπ : -halfπ); + listener.point(sλ0, φ0); + listener.lineEnd(); + listener.lineStart(); + listener.point(sλ1, φ0); + listener.point(λ1, φ0); + clean = 0; + } else if (sλ0 !== sλ1 && dλ >= π) { + if (abs(λ0 - sλ0) < ε) λ0 -= sλ0 * ε; + if (abs(λ1 - sλ1) < ε) λ1 -= sλ1 * ε; + φ0 = d3_geo_clipAntimeridianIntersect(λ0, φ0, λ1, φ1); + listener.point(sλ0, φ0); + listener.lineEnd(); + listener.lineStart(); + listener.point(sλ1, φ0); + clean = 0; + } + listener.point(λ0 = λ1, φ0 = φ1); + sλ0 = sλ1; + }, + lineEnd: function() { + listener.lineEnd(); + λ0 = φ0 = NaN; + }, + clean: function() { + return 2 - clean; + } + }; + } + function d3_geo_clipAntimeridianIntersect(λ0, φ0, λ1, φ1) { + var cosφ0, cosφ1, sinλ0_λ1 = Math.sin(λ0 - λ1); + return abs(sinλ0_λ1) > ε ? Math.atan((Math.sin(φ0) * (cosφ1 = Math.cos(φ1)) * Math.sin(λ1) - Math.sin(φ1) * (cosφ0 = Math.cos(φ0)) * Math.sin(λ0)) / (cosφ0 * cosφ1 * sinλ0_λ1)) : (φ0 + φ1) / 2; + } + function d3_geo_clipAntimeridianInterpolate(from, to, direction, listener) { + var φ; + if (from == null) { + φ = direction * halfπ; + listener.point(-π, φ); + listener.point(0, φ); + listener.point(π, φ); + listener.point(π, 0); + listener.point(π, -φ); + listener.point(0, -φ); + listener.point(-π, -φ); + listener.point(-π, 0); + listener.point(-π, φ); + } else if (abs(from[0] - to[0]) > ε) { + var s = from[0] < to[0] ? π : -π; + φ = direction * s / 2; + listener.point(-s, φ); + listener.point(0, φ); + listener.point(s, φ); + } else { + listener.point(to[0], to[1]); + } + } + function d3_geo_pointInPolygon(point, polygon) { + var meridian = point[0], parallel = point[1], meridianNormal = [ Math.sin(meridian), -Math.cos(meridian), 0 ], polarAngle = 0, winding = 0; + d3_geo_areaRingSum.reset(); + for (var i = 0, n = polygon.length; i < n; ++i) { + var ring = polygon[i], m = ring.length; + if (!m) continue; + var point0 = ring[0], λ0 = point0[0], φ0 = point0[1] / 2 + π / 4, sinφ0 = Math.sin(φ0), cosφ0 = Math.cos(φ0), j = 1; + while (true) { + if (j === m) j = 0; + point = ring[j]; + var λ = point[0], φ = point[1] / 2 + π / 4, sinφ = Math.sin(φ), cosφ = Math.cos(φ), dλ = λ - λ0, sdλ = dλ >= 0 ? 1 : -1, adλ = sdλ * dλ, antimeridian = adλ > π, k = sinφ0 * sinφ; + d3_geo_areaRingSum.add(Math.atan2(k * sdλ * Math.sin(adλ), cosφ0 * cosφ + k * Math.cos(adλ))); + polarAngle += antimeridian ? dλ + sdλ * τ : dλ; + if (antimeridian ^ λ0 >= meridian ^ λ >= meridian) { + var arc = d3_geo_cartesianCross(d3_geo_cartesian(point0), d3_geo_cartesian(point)); + d3_geo_cartesianNormalize(arc); + var intersection = d3_geo_cartesianCross(meridianNormal, arc); + d3_geo_cartesianNormalize(intersection); + var φarc = (antimeridian ^ dλ >= 0 ? -1 : 1) * d3_asin(intersection[2]); + if (parallel > φarc || parallel === φarc && (arc[0] || arc[1])) { + winding += antimeridian ^ dλ >= 0 ? 1 : -1; + } + } + if (!j++) break; + λ0 = λ, sinφ0 = sinφ, cosφ0 = cosφ, point0 = point; + } + } + return (polarAngle < -ε || polarAngle < ε && d3_geo_areaRingSum < -ε) ^ winding & 1; + } + function d3_geo_clipCircle(radius) { + var cr = Math.cos(radius), smallRadius = cr > 0, notHemisphere = abs(cr) > ε, interpolate = d3_geo_circleInterpolate(radius, 6 * d3_radians); + return d3_geo_clip(visible, clipLine, interpolate, smallRadius ? [ 0, -radius ] : [ -π, radius - π ]); + function visible(λ, φ) { + return Math.cos(λ) * Math.cos(φ) > cr; + } + function clipLine(listener) { + var point0, c0, v0, v00, clean; + return { + lineStart: function() { + v00 = v0 = false; + clean = 1; + }, + point: function(λ, φ) { + var point1 = [ λ, φ ], point2, v = visible(λ, φ), c = smallRadius ? v ? 0 : code(λ, φ) : v ? code(λ + (λ < 0 ? π : -π), φ) : 0; + if (!point0 && (v00 = v0 = v)) listener.lineStart(); + if (v !== v0) { + point2 = intersect(point0, point1); + if (d3_geo_sphericalEqual(point0, point2) || d3_geo_sphericalEqual(point1, point2)) { + point1[0] += ε; + point1[1] += ε; + v = visible(point1[0], point1[1]); + } + } + if (v !== v0) { + clean = 0; + if (v) { + listener.lineStart(); + point2 = intersect(point1, point0); + listener.point(point2[0], point2[1]); + } else { + point2 = intersect(point0, point1); + listener.point(point2[0], point2[1]); + listener.lineEnd(); + } + point0 = point2; + } else if (notHemisphere && point0 && smallRadius ^ v) { + var t; + if (!(c & c0) && (t = intersect(point1, point0, true))) { + clean = 0; + if (smallRadius) { + listener.lineStart(); + listener.point(t[0][0], t[0][1]); + listener.point(t[1][0], t[1][1]); + listener.lineEnd(); + } else { + listener.point(t[1][0], t[1][1]); + listener.lineEnd(); + listener.lineStart(); + listener.point(t[0][0], t[0][1]); + } + } + } + if (v && (!point0 || !d3_geo_sphericalEqual(point0, point1))) { + listener.point(point1[0], point1[1]); + } + point0 = point1, v0 = v, c0 = c; + }, + lineEnd: function() { + if (v0) listener.lineEnd(); + point0 = null; + }, + clean: function() { + return clean | (v00 && v0) << 1; + } + }; + } + function intersect(a, b, two) { + var pa = d3_geo_cartesian(a), pb = d3_geo_cartesian(b); + var n1 = [ 1, 0, 0 ], n2 = d3_geo_cartesianCross(pa, pb), n2n2 = d3_geo_cartesianDot(n2, n2), n1n2 = n2[0], determinant = n2n2 - n1n2 * n1n2; + if (!determinant) return !two && a; + var c1 = cr * n2n2 / determinant, c2 = -cr * n1n2 / determinant, n1xn2 = d3_geo_cartesianCross(n1, n2), A = d3_geo_cartesianScale(n1, c1), B = d3_geo_cartesianScale(n2, c2); + d3_geo_cartesianAdd(A, B); + var u = n1xn2, w = d3_geo_cartesianDot(A, u), uu = d3_geo_cartesianDot(u, u), t2 = w * w - uu * (d3_geo_cartesianDot(A, A) - 1); + if (t2 < 0) return; + var t = Math.sqrt(t2), q = d3_geo_cartesianScale(u, (-w - t) / uu); + d3_geo_cartesianAdd(q, A); + q = d3_geo_spherical(q); + if (!two) return q; + var λ0 = a[0], λ1 = b[0], φ0 = a[1], φ1 = b[1], z; + if (λ1 < λ0) z = λ0, λ0 = λ1, λ1 = z; + var δλ = λ1 - λ0, polar = abs(δλ - π) < ε, meridian = polar || δλ < ε; + if (!polar && φ1 < φ0) z = φ0, φ0 = φ1, φ1 = z; + if (meridian ? polar ? φ0 + φ1 > 0 ^ q[1] < (abs(q[0] - λ0) < ε ? φ0 : φ1) : φ0 <= q[1] && q[1] <= φ1 : δλ > π ^ (λ0 <= q[0] && q[0] <= λ1)) { + var q1 = d3_geo_cartesianScale(u, (-w + t) / uu); + d3_geo_cartesianAdd(q1, A); + return [ q, d3_geo_spherical(q1) ]; + } + } + function code(λ, φ) { + var r = smallRadius ? radius : π - radius, code = 0; + if (λ < -r) code |= 1; else if (λ > r) code |= 2; + if (φ < -r) code |= 4; else if (φ > r) code |= 8; + return code; + } + } + function d3_geom_clipLine(x0, y0, x1, y1) { + return function(line) { + var a = line.a, b = line.b, ax = a.x, ay = a.y, bx = b.x, by = b.y, t0 = 0, t1 = 1, dx = bx - ax, dy = by - ay, r; + r = x0 - ax; + if (!dx && r > 0) return; + r /= dx; + if (dx < 0) { + if (r < t0) return; + if (r < t1) t1 = r; + } else if (dx > 0) { + if (r > t1) return; + if (r > t0) t0 = r; + } + r = x1 - ax; + if (!dx && r < 0) return; + r /= dx; + if (dx < 0) { + if (r > t1) return; + if (r > t0) t0 = r; + } else if (dx > 0) { + if (r < t0) return; + if (r < t1) t1 = r; + } + r = y0 - ay; + if (!dy && r > 0) return; + r /= dy; + if (dy < 0) { + if (r < t0) return; + if (r < t1) t1 = r; + } else if (dy > 0) { + if (r > t1) return; + if (r > t0) t0 = r; + } + r = y1 - ay; + if (!dy && r < 0) return; + r /= dy; + if (dy < 0) { + if (r > t1) return; + if (r > t0) t0 = r; + } else if (dy > 0) { + if (r < t0) return; + if (r < t1) t1 = r; + } + if (t0 > 0) line.a = { + x: ax + t0 * dx, + y: ay + t0 * dy + }; + if (t1 < 1) line.b = { + x: ax + t1 * dx, + y: ay + t1 * dy + }; + return line; + }; + } + var d3_geo_clipExtentMAX = 1e9; + d3.geo.clipExtent = function() { + var x0, y0, x1, y1, stream, clip, clipExtent = { + stream: function(output) { + if (stream) stream.valid = false; + stream = clip(output); + stream.valid = true; + return stream; + }, + extent: function(_) { + if (!arguments.length) return [ [ x0, y0 ], [ x1, y1 ] ]; + clip = d3_geo_clipExtent(x0 = +_[0][0], y0 = +_[0][1], x1 = +_[1][0], y1 = +_[1][1]); + if (stream) stream.valid = false, stream = null; + return clipExtent; + } + }; + return clipExtent.extent([ [ 0, 0 ], [ 960, 500 ] ]); + }; + function d3_geo_clipExtent(x0, y0, x1, y1) { + return function(listener) { + var listener_ = listener, bufferListener = d3_geo_clipBufferListener(), clipLine = d3_geom_clipLine(x0, y0, x1, y1), segments, polygon, ring; + var clip = { + point: point, + lineStart: lineStart, + lineEnd: lineEnd, + polygonStart: function() { + listener = bufferListener; + segments = []; + polygon = []; + clean = true; + }, + polygonEnd: function() { + listener = listener_; + segments = d3.merge(segments); + var clipStartInside = insidePolygon([ x0, y1 ]), inside = clean && clipStartInside, visible = segments.length; + if (inside || visible) { + listener.polygonStart(); + if (inside) { + listener.lineStart(); + interpolate(null, null, 1, listener); + listener.lineEnd(); + } + if (visible) { + d3_geo_clipPolygon(segments, compare, clipStartInside, interpolate, listener); + } + listener.polygonEnd(); + } + segments = polygon = ring = null; + } + }; + function insidePolygon(p) { + var wn = 0, n = polygon.length, y = p[1]; + for (var i = 0; i < n; ++i) { + for (var j = 1, v = polygon[i], m = v.length, a = v[0], b; j < m; ++j) { + b = v[j]; + if (a[1] <= y) { + if (b[1] > y && d3_cross2d(a, b, p) > 0) ++wn; + } else { + if (b[1] <= y && d3_cross2d(a, b, p) < 0) --wn; + } + a = b; + } + } + return wn !== 0; + } + function interpolate(from, to, direction, listener) { + var a = 0, a1 = 0; + if (from == null || (a = corner(from, direction)) !== (a1 = corner(to, direction)) || comparePoints(from, to) < 0 ^ direction > 0) { + do { + listener.point(a === 0 || a === 3 ? x0 : x1, a > 1 ? y1 : y0); + } while ((a = (a + direction + 4) % 4) !== a1); + } else { + listener.point(to[0], to[1]); + } + } + function pointVisible(x, y) { + return x0 <= x && x <= x1 && y0 <= y && y <= y1; + } + function point(x, y) { + if (pointVisible(x, y)) listener.point(x, y); + } + var x__, y__, v__, x_, y_, v_, first, clean; + function lineStart() { + clip.point = linePoint; + if (polygon) polygon.push(ring = []); + first = true; + v_ = false; + x_ = y_ = NaN; + } + function lineEnd() { + if (segments) { + linePoint(x__, y__); + if (v__ && v_) bufferListener.rejoin(); + segments.push(bufferListener.buffer()); + } + clip.point = point; + if (v_) listener.lineEnd(); + } + function linePoint(x, y) { + x = Math.max(-d3_geo_clipExtentMAX, Math.min(d3_geo_clipExtentMAX, x)); + y = Math.max(-d3_geo_clipExtentMAX, Math.min(d3_geo_clipExtentMAX, y)); + var v = pointVisible(x, y); + if (polygon) ring.push([ x, y ]); + if (first) { + x__ = x, y__ = y, v__ = v; + first = false; + if (v) { + listener.lineStart(); + listener.point(x, y); + } + } else { + if (v && v_) listener.point(x, y); else { + var l = { + a: { + x: x_, + y: y_ + }, + b: { + x: x, + y: y + } + }; + if (clipLine(l)) { + if (!v_) { + listener.lineStart(); + listener.point(l.a.x, l.a.y); + } + listener.point(l.b.x, l.b.y); + if (!v) listener.lineEnd(); + clean = false; + } else if (v) { + listener.lineStart(); + listener.point(x, y); + clean = false; + } + } + } + x_ = x, y_ = y, v_ = v; + } + return clip; + }; + function corner(p, direction) { + return abs(p[0] - x0) < ε ? direction > 0 ? 0 : 3 : abs(p[0] - x1) < ε ? direction > 0 ? 2 : 1 : abs(p[1] - y0) < ε ? direction > 0 ? 1 : 0 : direction > 0 ? 3 : 2; + } + function compare(a, b) { + return comparePoints(a.x, b.x); + } + function comparePoints(a, b) { + var ca = corner(a, 1), cb = corner(b, 1); + return ca !== cb ? ca - cb : ca === 0 ? b[1] - a[1] : ca === 1 ? a[0] - b[0] : ca === 2 ? a[1] - b[1] : b[0] - a[0]; + } + } + function d3_geo_conic(projectAt) { + var φ0 = 0, φ1 = π / 3, m = d3_geo_projectionMutator(projectAt), p = m(φ0, φ1); + p.parallels = function(_) { + if (!arguments.length) return [ φ0 / π * 180, φ1 / π * 180 ]; + return m(φ0 = _[0] * π / 180, φ1 = _[1] * π / 180); + }; + return p; + } + function d3_geo_conicEqualArea(φ0, φ1) { + var sinφ0 = Math.sin(φ0), n = (sinφ0 + Math.sin(φ1)) / 2, C = 1 + sinφ0 * (2 * n - sinφ0), ρ0 = Math.sqrt(C) / n; + function forward(λ, φ) { + var ρ = Math.sqrt(C - 2 * n * Math.sin(φ)) / n; + return [ ρ * Math.sin(λ *= n), ρ0 - ρ * Math.cos(λ) ]; + } + forward.invert = function(x, y) { + var ρ0_y = ρ0 - y; + return [ Math.atan2(x, ρ0_y) / n, d3_asin((C - (x * x + ρ0_y * ρ0_y) * n * n) / (2 * n)) ]; + }; + return forward; + } + (d3.geo.conicEqualArea = function() { + return d3_geo_conic(d3_geo_conicEqualArea); + }).raw = d3_geo_conicEqualArea; + d3.geo.albers = function() { + return d3.geo.conicEqualArea().rotate([ 96, 0 ]).center([ -.6, 38.7 ]).parallels([ 29.5, 45.5 ]).scale(1070); + }; + d3.geo.albersUsa = function() { + var lower48 = d3.geo.albers(); + var alaska = d3.geo.conicEqualArea().rotate([ 154, 0 ]).center([ -2, 58.5 ]).parallels([ 55, 65 ]); + var hawaii = d3.geo.conicEqualArea().rotate([ 157, 0 ]).center([ -3, 19.9 ]).parallels([ 8, 18 ]); + var point, pointStream = { + point: function(x, y) { + point = [ x, y ]; + } + }, lower48Point, alaskaPoint, hawaiiPoint; + function albersUsa(coordinates) { + var x = coordinates[0], y = coordinates[1]; + point = null; + (lower48Point(x, y), point) || (alaskaPoint(x, y), point) || hawaiiPoint(x, y); + return point; + } + albersUsa.invert = function(coordinates) { + var k = lower48.scale(), t = lower48.translate(), x = (coordinates[0] - t[0]) / k, y = (coordinates[1] - t[1]) / k; + return (y >= .12 && y < .234 && x >= -.425 && x < -.214 ? alaska : y >= .166 && y < .234 && x >= -.214 && x < -.115 ? hawaii : lower48).invert(coordinates); + }; + albersUsa.stream = function(stream) { + var lower48Stream = lower48.stream(stream), alaskaStream = alaska.stream(stream), hawaiiStream = hawaii.stream(stream); + return { + point: function(x, y) { + lower48Stream.point(x, y); + alaskaStream.point(x, y); + hawaiiStream.point(x, y); + }, + sphere: function() { + lower48Stream.sphere(); + alaskaStream.sphere(); + hawaiiStream.sphere(); + }, + lineStart: function() { + lower48Stream.lineStart(); + alaskaStream.lineStart(); + hawaiiStream.lineStart(); + }, + lineEnd: function() { + lower48Stream.lineEnd(); + alaskaStream.lineEnd(); + hawaiiStream.lineEnd(); + }, + polygonStart: function() { + lower48Stream.polygonStart(); + alaskaStream.polygonStart(); + hawaiiStream.polygonStart(); + }, + polygonEnd: function() { + lower48Stream.polygonEnd(); + alaskaStream.polygonEnd(); + hawaiiStream.polygonEnd(); + } + }; + }; + albersUsa.precision = function(_) { + if (!arguments.length) return lower48.precision(); + lower48.precision(_); + alaska.precision(_); + hawaii.precision(_); + return albersUsa; + }; + albersUsa.scale = function(_) { + if (!arguments.length) return lower48.scale(); + lower48.scale(_); + alaska.scale(_ * .35); + hawaii.scale(_); + return albersUsa.translate(lower48.translate()); + }; + albersUsa.translate = function(_) { + if (!arguments.length) return lower48.translate(); + var k = lower48.scale(), x = +_[0], y = +_[1]; + lower48Point = lower48.translate(_).clipExtent([ [ x - .455 * k, y - .238 * k ], [ x + .455 * k, y + .238 * k ] ]).stream(pointStream).point; + alaskaPoint = alaska.translate([ x - .307 * k, y + .201 * k ]).clipExtent([ [ x - .425 * k + ε, y + .12 * k + ε ], [ x - .214 * k - ε, y + .234 * k - ε ] ]).stream(pointStream).point; + hawaiiPoint = hawaii.translate([ x - .205 * k, y + .212 * k ]).clipExtent([ [ x - .214 * k + ε, y + .166 * k + ε ], [ x - .115 * k - ε, y + .234 * k - ε ] ]).stream(pointStream).point; + return albersUsa; + }; + return albersUsa.scale(1070); + }; + var d3_geo_pathAreaSum, d3_geo_pathAreaPolygon, d3_geo_pathArea = { + point: d3_noop, + lineStart: d3_noop, + lineEnd: d3_noop, + polygonStart: function() { + d3_geo_pathAreaPolygon = 0; + d3_geo_pathArea.lineStart = d3_geo_pathAreaRingStart; + }, + polygonEnd: function() { + d3_geo_pathArea.lineStart = d3_geo_pathArea.lineEnd = d3_geo_pathArea.point = d3_noop; + d3_geo_pathAreaSum += abs(d3_geo_pathAreaPolygon / 2); + } + }; + function d3_geo_pathAreaRingStart() { + var x00, y00, x0, y0; + d3_geo_pathArea.point = function(x, y) { + d3_geo_pathArea.point = nextPoint; + x00 = x0 = x, y00 = y0 = y; + }; + function nextPoint(x, y) { + d3_geo_pathAreaPolygon += y0 * x - x0 * y; + x0 = x, y0 = y; + } + d3_geo_pathArea.lineEnd = function() { + nextPoint(x00, y00); + }; + } + var d3_geo_pathBoundsX0, d3_geo_pathBoundsY0, d3_geo_pathBoundsX1, d3_geo_pathBoundsY1; + var d3_geo_pathBounds = { + point: d3_geo_pathBoundsPoint, + lineStart: d3_noop, + lineEnd: d3_noop, + polygonStart: d3_noop, + polygonEnd: d3_noop + }; + function d3_geo_pathBoundsPoint(x, y) { + if (x < d3_geo_pathBoundsX0) d3_geo_pathBoundsX0 = x; + if (x > d3_geo_pathBoundsX1) d3_geo_pathBoundsX1 = x; + if (y < d3_geo_pathBoundsY0) d3_geo_pathBoundsY0 = y; + if (y > d3_geo_pathBoundsY1) d3_geo_pathBoundsY1 = y; + } + function d3_geo_pathBuffer() { + var pointCircle = d3_geo_pathBufferCircle(4.5), buffer = []; + var stream = { + point: point, + lineStart: function() { + stream.point = pointLineStart; + }, + lineEnd: lineEnd, + polygonStart: function() { + stream.lineEnd = lineEndPolygon; + }, + polygonEnd: function() { + stream.lineEnd = lineEnd; + stream.point = point; + }, + pointRadius: function(_) { + pointCircle = d3_geo_pathBufferCircle(_); + return stream; + }, + result: function() { + if (buffer.length) { + var result = buffer.join(""); + buffer = []; + return result; + } + } + }; + function point(x, y) { + buffer.push("M", x, ",", y, pointCircle); + } + function pointLineStart(x, y) { + buffer.push("M", x, ",", y); + stream.point = pointLine; + } + function pointLine(x, y) { + buffer.push("L", x, ",", y); + } + function lineEnd() { + stream.point = point; + } + function lineEndPolygon() { + buffer.push("Z"); + } + return stream; + } + function d3_geo_pathBufferCircle(radius) { + return "m0," + radius + "a" + radius + "," + radius + " 0 1,1 0," + -2 * radius + "a" + radius + "," + radius + " 0 1,1 0," + 2 * radius + "z"; + } + var d3_geo_pathCentroid = { + point: d3_geo_pathCentroidPoint, + lineStart: d3_geo_pathCentroidLineStart, + lineEnd: d3_geo_pathCentroidLineEnd, + polygonStart: function() { + d3_geo_pathCentroid.lineStart = d3_geo_pathCentroidRingStart; + }, + polygonEnd: function() { + d3_geo_pathCentroid.point = d3_geo_pathCentroidPoint; + d3_geo_pathCentroid.lineStart = d3_geo_pathCentroidLineStart; + d3_geo_pathCentroid.lineEnd = d3_geo_pathCentroidLineEnd; + } + }; + function d3_geo_pathCentroidPoint(x, y) { + d3_geo_centroidX0 += x; + d3_geo_centroidY0 += y; + ++d3_geo_centroidZ0; + } + function d3_geo_pathCentroidLineStart() { + var x0, y0; + d3_geo_pathCentroid.point = function(x, y) { + d3_geo_pathCentroid.point = nextPoint; + d3_geo_pathCentroidPoint(x0 = x, y0 = y); + }; + function nextPoint(x, y) { + var dx = x - x0, dy = y - y0, z = Math.sqrt(dx * dx + dy * dy); + d3_geo_centroidX1 += z * (x0 + x) / 2; + d3_geo_centroidY1 += z * (y0 + y) / 2; + d3_geo_centroidZ1 += z; + d3_geo_pathCentroidPoint(x0 = x, y0 = y); + } + } + function d3_geo_pathCentroidLineEnd() { + d3_geo_pathCentroid.point = d3_geo_pathCentroidPoint; + } + function d3_geo_pathCentroidRingStart() { + var x00, y00, x0, y0; + d3_geo_pathCentroid.point = function(x, y) { + d3_geo_pathCentroid.point = nextPoint; + d3_geo_pathCentroidPoint(x00 = x0 = x, y00 = y0 = y); + }; + function nextPoint(x, y) { + var dx = x - x0, dy = y - y0, z = Math.sqrt(dx * dx + dy * dy); + d3_geo_centroidX1 += z * (x0 + x) / 2; + d3_geo_centroidY1 += z * (y0 + y) / 2; + d3_geo_centroidZ1 += z; + z = y0 * x - x0 * y; + d3_geo_centroidX2 += z * (x0 + x); + d3_geo_centroidY2 += z * (y0 + y); + d3_geo_centroidZ2 += z * 3; + d3_geo_pathCentroidPoint(x0 = x, y0 = y); + } + d3_geo_pathCentroid.lineEnd = function() { + nextPoint(x00, y00); + }; + } + function d3_geo_pathContext(context) { + var pointRadius = 4.5; + var stream = { + point: point, + lineStart: function() { + stream.point = pointLineStart; + }, + lineEnd: lineEnd, + polygonStart: function() { + stream.lineEnd = lineEndPolygon; + }, + polygonEnd: function() { + stream.lineEnd = lineEnd; + stream.point = point; + }, + pointRadius: function(_) { + pointRadius = _; + return stream; + }, + result: d3_noop + }; + function point(x, y) { + context.moveTo(x + pointRadius, y); + context.arc(x, y, pointRadius, 0, τ); + } + function pointLineStart(x, y) { + context.moveTo(x, y); + stream.point = pointLine; + } + function pointLine(x, y) { + context.lineTo(x, y); + } + function lineEnd() { + stream.point = point; + } + function lineEndPolygon() { + context.closePath(); + } + return stream; + } + function d3_geo_resample(project) { + var δ2 = .5, cosMinDistance = Math.cos(30 * d3_radians), maxDepth = 16; + function resample(stream) { + return (maxDepth ? resampleRecursive : resampleNone)(stream); + } + function resampleNone(stream) { + return d3_geo_transformPoint(stream, function(x, y) { + x = project(x, y); + stream.point(x[0], x[1]); + }); + } + function resampleRecursive(stream) { + var λ00, φ00, x00, y00, a00, b00, c00, λ0, x0, y0, a0, b0, c0; + var resample = { + point: point, + lineStart: lineStart, + lineEnd: lineEnd, + polygonStart: function() { + stream.polygonStart(); + resample.lineStart = ringStart; + }, + polygonEnd: function() { + stream.polygonEnd(); + resample.lineStart = lineStart; + } + }; + function point(x, y) { + x = project(x, y); + stream.point(x[0], x[1]); + } + function lineStart() { + x0 = NaN; + resample.point = linePoint; + stream.lineStart(); + } + function linePoint(λ, φ) { + var c = d3_geo_cartesian([ λ, φ ]), p = project(λ, φ); + resampleLineTo(x0, y0, λ0, a0, b0, c0, x0 = p[0], y0 = p[1], λ0 = λ, a0 = c[0], b0 = c[1], c0 = c[2], maxDepth, stream); + stream.point(x0, y0); + } + function lineEnd() { + resample.point = point; + stream.lineEnd(); + } + function ringStart() { + lineStart(); + resample.point = ringPoint; + resample.lineEnd = ringEnd; + } + function ringPoint(λ, φ) { + linePoint(λ00 = λ, φ00 = φ), x00 = x0, y00 = y0, a00 = a0, b00 = b0, c00 = c0; + resample.point = linePoint; + } + function ringEnd() { + resampleLineTo(x0, y0, λ0, a0, b0, c0, x00, y00, λ00, a00, b00, c00, maxDepth, stream); + resample.lineEnd = lineEnd; + lineEnd(); + } + return resample; + } + function resampleLineTo(x0, y0, λ0, a0, b0, c0, x1, y1, λ1, a1, b1, c1, depth, stream) { + var dx = x1 - x0, dy = y1 - y0, d2 = dx * dx + dy * dy; + if (d2 > 4 * δ2 && depth--) { + var a = a0 + a1, b = b0 + b1, c = c0 + c1, m = Math.sqrt(a * a + b * b + c * c), φ2 = Math.asin(c /= m), λ2 = abs(abs(c) - 1) < ε || abs(λ0 - λ1) < ε ? (λ0 + λ1) / 2 : Math.atan2(b, a), p = project(λ2, φ2), x2 = p[0], y2 = p[1], dx2 = x2 - x0, dy2 = y2 - y0, dz = dy * dx2 - dx * dy2; + if (dz * dz / d2 > δ2 || abs((dx * dx2 + dy * dy2) / d2 - .5) > .3 || a0 * a1 + b0 * b1 + c0 * c1 < cosMinDistance) { + resampleLineTo(x0, y0, λ0, a0, b0, c0, x2, y2, λ2, a /= m, b /= m, c, depth, stream); + stream.point(x2, y2); + resampleLineTo(x2, y2, λ2, a, b, c, x1, y1, λ1, a1, b1, c1, depth, stream); + } + } + } + resample.precision = function(_) { + if (!arguments.length) return Math.sqrt(δ2); + maxDepth = (δ2 = _ * _) > 0 && 16; + return resample; + }; + return resample; + } + d3.geo.path = function() { + var pointRadius = 4.5, projection, context, projectStream, contextStream, cacheStream; + function path(object) { + if (object) { + if (typeof pointRadius === "function") contextStream.pointRadius(+pointRadius.apply(this, arguments)); + if (!cacheStream || !cacheStream.valid) cacheStream = projectStream(contextStream); + d3.geo.stream(object, cacheStream); + } + return contextStream.result(); + } + path.area = function(object) { + d3_geo_pathAreaSum = 0; + d3.geo.stream(object, projectStream(d3_geo_pathArea)); + return d3_geo_pathAreaSum; + }; + path.centroid = function(object) { + d3_geo_centroidX0 = d3_geo_centroidY0 = d3_geo_centroidZ0 = d3_geo_centroidX1 = d3_geo_centroidY1 = d3_geo_centroidZ1 = d3_geo_centroidX2 = d3_geo_centroidY2 = d3_geo_centroidZ2 = 0; + d3.geo.stream(object, projectStream(d3_geo_pathCentroid)); + return d3_geo_centroidZ2 ? [ d3_geo_centroidX2 / d3_geo_centroidZ2, d3_geo_centroidY2 / d3_geo_centroidZ2 ] : d3_geo_centroidZ1 ? [ d3_geo_centroidX1 / d3_geo_centroidZ1, d3_geo_centroidY1 / d3_geo_centroidZ1 ] : d3_geo_centroidZ0 ? [ d3_geo_centroidX0 / d3_geo_centroidZ0, d3_geo_centroidY0 / d3_geo_centroidZ0 ] : [ NaN, NaN ]; + }; + path.bounds = function(object) { + d3_geo_pathBoundsX1 = d3_geo_pathBoundsY1 = -(d3_geo_pathBoundsX0 = d3_geo_pathBoundsY0 = Infinity); + d3.geo.stream(object, projectStream(d3_geo_pathBounds)); + return [ [ d3_geo_pathBoundsX0, d3_geo_pathBoundsY0 ], [ d3_geo_pathBoundsX1, d3_geo_pathBoundsY1 ] ]; + }; + path.projection = function(_) { + if (!arguments.length) return projection; + projectStream = (projection = _) ? _.stream || d3_geo_pathProjectStream(_) : d3_identity; + return reset(); + }; + path.context = function(_) { + if (!arguments.length) return context; + contextStream = (context = _) == null ? new d3_geo_pathBuffer() : new d3_geo_pathContext(_); + if (typeof pointRadius !== "function") contextStream.pointRadius(pointRadius); + return reset(); + }; + path.pointRadius = function(_) { + if (!arguments.length) return pointRadius; + pointRadius = typeof _ === "function" ? _ : (contextStream.pointRadius(+_), +_); + return path; + }; + function reset() { + cacheStream = null; + return path; + } + return path.projection(d3.geo.albersUsa()).context(null); + }; + function d3_geo_pathProjectStream(project) { + var resample = d3_geo_resample(function(x, y) { + return project([ x * d3_degrees, y * d3_degrees ]); + }); + return function(stream) { + return d3_geo_projectionRadians(resample(stream)); + }; + } + d3.geo.transform = function(methods) { + return { + stream: function(stream) { + var transform = new d3_geo_transform(stream); + for (var k in methods) transform[k] = methods[k]; + return transform; + } + }; + }; + function d3_geo_transform(stream) { + this.stream = stream; + } + d3_geo_transform.prototype = { + point: function(x, y) { + this.stream.point(x, y); + }, + sphere: function() { + this.stream.sphere(); + }, + lineStart: function() { + this.stream.lineStart(); + }, + lineEnd: function() { + this.stream.lineEnd(); + }, + polygonStart: function() { + this.stream.polygonStart(); + }, + polygonEnd: function() { + this.stream.polygonEnd(); + } + }; + function d3_geo_transformPoint(stream, point) { + return { + point: point, + sphere: function() { + stream.sphere(); + }, + lineStart: function() { + stream.lineStart(); + }, + lineEnd: function() { + stream.lineEnd(); + }, + polygonStart: function() { + stream.polygonStart(); + }, + polygonEnd: function() { + stream.polygonEnd(); + } + }; + } + d3.geo.projection = d3_geo_projection; + d3.geo.projectionMutator = d3_geo_projectionMutator; + function d3_geo_projection(project) { + return d3_geo_projectionMutator(function() { + return project; + })(); + } + function d3_geo_projectionMutator(projectAt) { + var project, rotate, projectRotate, projectResample = d3_geo_resample(function(x, y) { + x = project(x, y); + return [ x[0] * k + δx, δy - x[1] * k ]; + }), k = 150, x = 480, y = 250, λ = 0, φ = 0, δλ = 0, δφ = 0, δγ = 0, δx, δy, preclip = d3_geo_clipAntimeridian, postclip = d3_identity, clipAngle = null, clipExtent = null, stream; + function projection(point) { + point = projectRotate(point[0] * d3_radians, point[1] * d3_radians); + return [ point[0] * k + δx, δy - point[1] * k ]; + } + function invert(point) { + point = projectRotate.invert((point[0] - δx) / k, (δy - point[1]) / k); + return point && [ point[0] * d3_degrees, point[1] * d3_degrees ]; + } + projection.stream = function(output) { + if (stream) stream.valid = false; + stream = d3_geo_projectionRadians(preclip(rotate, projectResample(postclip(output)))); + stream.valid = true; + return stream; + }; + projection.clipAngle = function(_) { + if (!arguments.length) return clipAngle; + preclip = _ == null ? (clipAngle = _, d3_geo_clipAntimeridian) : d3_geo_clipCircle((clipAngle = +_) * d3_radians); + return invalidate(); + }; + projection.clipExtent = function(_) { + if (!arguments.length) return clipExtent; + clipExtent = _; + postclip = _ ? d3_geo_clipExtent(_[0][0], _[0][1], _[1][0], _[1][1]) : d3_identity; + return invalidate(); + }; + projection.scale = function(_) { + if (!arguments.length) return k; + k = +_; + return reset(); + }; + projection.translate = function(_) { + if (!arguments.length) return [ x, y ]; + x = +_[0]; + y = +_[1]; + return reset(); + }; + projection.center = function(_) { + if (!arguments.length) return [ λ * d3_degrees, φ * d3_degrees ]; + λ = _[0] % 360 * d3_radians; + φ = _[1] % 360 * d3_radians; + return reset(); + }; + projection.rotate = function(_) { + if (!arguments.length) return [ δλ * d3_degrees, δφ * d3_degrees, δγ * d3_degrees ]; + δλ = _[0] % 360 * d3_radians; + δφ = _[1] % 360 * d3_radians; + δγ = _.length > 2 ? _[2] % 360 * d3_radians : 0; + return reset(); + }; + d3.rebind(projection, projectResample, "precision"); + function reset() { + projectRotate = d3_geo_compose(rotate = d3_geo_rotation(δλ, δφ, δγ), project); + var center = project(λ, φ); + δx = x - center[0] * k; + δy = y + center[1] * k; + return invalidate(); + } + function invalidate() { + if (stream) stream.valid = false, stream = null; + return projection; + } + return function() { + project = projectAt.apply(this, arguments); + projection.invert = project.invert && invert; + return reset(); + }; + } + function d3_geo_projectionRadians(stream) { + return d3_geo_transformPoint(stream, function(x, y) { + stream.point(x * d3_radians, y * d3_radians); + }); + } + function d3_geo_equirectangular(λ, φ) { + return [ λ, φ ]; + } + (d3.geo.equirectangular = function() { + return d3_geo_projection(d3_geo_equirectangular); + }).raw = d3_geo_equirectangular.invert = d3_geo_equirectangular; + d3.geo.rotation = function(rotate) { + rotate = d3_geo_rotation(rotate[0] % 360 * d3_radians, rotate[1] * d3_radians, rotate.length > 2 ? rotate[2] * d3_radians : 0); + function forward(coordinates) { + coordinates = rotate(coordinates[0] * d3_radians, coordinates[1] * d3_radians); + return coordinates[0] *= d3_degrees, coordinates[1] *= d3_degrees, coordinates; + } + forward.invert = function(coordinates) { + coordinates = rotate.invert(coordinates[0] * d3_radians, coordinates[1] * d3_radians); + return coordinates[0] *= d3_degrees, coordinates[1] *= d3_degrees, coordinates; + }; + return forward; + }; + function d3_geo_identityRotation(λ, φ) { + return [ λ > π ? λ - τ : λ < -π ? λ + τ : λ, φ ]; + } + d3_geo_identityRotation.invert = d3_geo_equirectangular; + function d3_geo_rotation(δλ, δφ, δγ) { + return δλ ? δφ || δγ ? d3_geo_compose(d3_geo_rotationλ(δλ), d3_geo_rotationφγ(δφ, δγ)) : d3_geo_rotationλ(δλ) : δφ || δγ ? d3_geo_rotationφγ(δφ, δγ) : d3_geo_identityRotation; + } + function d3_geo_forwardRotationλ(δλ) { + return function(λ, φ) { + return λ += δλ, [ λ > π ? λ - τ : λ < -π ? λ + τ : λ, φ ]; + }; + } + function d3_geo_rotationλ(δλ) { + var rotation = d3_geo_forwardRotationλ(δλ); + rotation.invert = d3_geo_forwardRotationλ(-δλ); + return rotation; + } + function d3_geo_rotationφγ(δφ, δγ) { + var cosδφ = Math.cos(δφ), sinδφ = Math.sin(δφ), cosδγ = Math.cos(δγ), sinδγ = Math.sin(δγ); + function rotation(λ, φ) { + var cosφ = Math.cos(φ), x = Math.cos(λ) * cosφ, y = Math.sin(λ) * cosφ, z = Math.sin(φ), k = z * cosδφ + x * sinδφ; + return [ Math.atan2(y * cosδγ - k * sinδγ, x * cosδφ - z * sinδφ), d3_asin(k * cosδγ + y * sinδγ) ]; + } + rotation.invert = function(λ, φ) { + var cosφ = Math.cos(φ), x = Math.cos(λ) * cosφ, y = Math.sin(λ) * cosφ, z = Math.sin(φ), k = z * cosδγ - y * sinδγ; + return [ Math.atan2(y * cosδγ + z * sinδγ, x * cosδφ + k * sinδφ), d3_asin(k * cosδφ - x * sinδφ) ]; + }; + return rotation; + } + d3.geo.circle = function() { + var origin = [ 0, 0 ], angle, precision = 6, interpolate; + function circle() { + var center = typeof origin === "function" ? origin.apply(this, arguments) : origin, rotate = d3_geo_rotation(-center[0] * d3_radians, -center[1] * d3_radians, 0).invert, ring = []; + interpolate(null, null, 1, { + point: function(x, y) { + ring.push(x = rotate(x, y)); + x[0] *= d3_degrees, x[1] *= d3_degrees; + } + }); + return { + type: "Polygon", + coordinates: [ ring ] + }; + } + circle.origin = function(x) { + if (!arguments.length) return origin; + origin = x; + return circle; + }; + circle.angle = function(x) { + if (!arguments.length) return angle; + interpolate = d3_geo_circleInterpolate((angle = +x) * d3_radians, precision * d3_radians); + return circle; + }; + circle.precision = function(_) { + if (!arguments.length) return precision; + interpolate = d3_geo_circleInterpolate(angle * d3_radians, (precision = +_) * d3_radians); + return circle; + }; + return circle.angle(90); + }; + function d3_geo_circleInterpolate(radius, precision) { + var cr = Math.cos(radius), sr = Math.sin(radius); + return function(from, to, direction, listener) { + var step = direction * precision; + if (from != null) { + from = d3_geo_circleAngle(cr, from); + to = d3_geo_circleAngle(cr, to); + if (direction > 0 ? from < to : from > to) from += direction * τ; + } else { + from = radius + direction * τ; + to = radius - .5 * step; + } + for (var point, t = from; direction > 0 ? t > to : t < to; t -= step) { + listener.point((point = d3_geo_spherical([ cr, -sr * Math.cos(t), -sr * Math.sin(t) ]))[0], point[1]); + } + }; + } + function d3_geo_circleAngle(cr, point) { + var a = d3_geo_cartesian(point); + a[0] -= cr; + d3_geo_cartesianNormalize(a); + var angle = d3_acos(-a[1]); + return ((-a[2] < 0 ? -angle : angle) + 2 * Math.PI - ε) % (2 * Math.PI); + } + d3.geo.distance = function(a, b) { + var Δλ = (b[0] - a[0]) * d3_radians, φ0 = a[1] * d3_radians, φ1 = b[1] * d3_radians, sinΔλ = Math.sin(Δλ), cosΔλ = Math.cos(Δλ), sinφ0 = Math.sin(φ0), cosφ0 = Math.cos(φ0), sinφ1 = Math.sin(φ1), cosφ1 = Math.cos(φ1), t; + return Math.atan2(Math.sqrt((t = cosφ1 * sinΔλ) * t + (t = cosφ0 * sinφ1 - sinφ0 * cosφ1 * cosΔλ) * t), sinφ0 * sinφ1 + cosφ0 * cosφ1 * cosΔλ); + }; + d3.geo.graticule = function() { + var x1, x0, X1, X0, y1, y0, Y1, Y0, dx = 10, dy = dx, DX = 90, DY = 360, x, y, X, Y, precision = 2.5; + function graticule() { + return { + type: "MultiLineString", + coordinates: lines() + }; + } + function lines() { + return d3.range(Math.ceil(X0 / DX) * DX, X1, DX).map(X).concat(d3.range(Math.ceil(Y0 / DY) * DY, Y1, DY).map(Y)).concat(d3.range(Math.ceil(x0 / dx) * dx, x1, dx).filter(function(x) { + return abs(x % DX) > ε; + }).map(x)).concat(d3.range(Math.ceil(y0 / dy) * dy, y1, dy).filter(function(y) { + return abs(y % DY) > ε; + }).map(y)); + } + graticule.lines = function() { + return lines().map(function(coordinates) { + return { + type: "LineString", + coordinates: coordinates + }; + }); + }; + graticule.outline = function() { + return { + type: "Polygon", + coordinates: [ X(X0).concat(Y(Y1).slice(1), X(X1).reverse().slice(1), Y(Y0).reverse().slice(1)) ] + }; + }; + graticule.extent = function(_) { + if (!arguments.length) return graticule.minorExtent(); + return graticule.majorExtent(_).minorExtent(_); + }; + graticule.majorExtent = function(_) { + if (!arguments.length) return [ [ X0, Y0 ], [ X1, Y1 ] ]; + X0 = +_[0][0], X1 = +_[1][0]; + Y0 = +_[0][1], Y1 = +_[1][1]; + if (X0 > X1) _ = X0, X0 = X1, X1 = _; + if (Y0 > Y1) _ = Y0, Y0 = Y1, Y1 = _; + return graticule.precision(precision); + }; + graticule.minorExtent = function(_) { + if (!arguments.length) return [ [ x0, y0 ], [ x1, y1 ] ]; + x0 = +_[0][0], x1 = +_[1][0]; + y0 = +_[0][1], y1 = +_[1][1]; + if (x0 > x1) _ = x0, x0 = x1, x1 = _; + if (y0 > y1) _ = y0, y0 = y1, y1 = _; + return graticule.precision(precision); + }; + graticule.step = function(_) { + if (!arguments.length) return graticule.minorStep(); + return graticule.majorStep(_).minorStep(_); + }; + graticule.majorStep = function(_) { + if (!arguments.length) return [ DX, DY ]; + DX = +_[0], DY = +_[1]; + return graticule; + }; + graticule.minorStep = function(_) { + if (!arguments.length) return [ dx, dy ]; + dx = +_[0], dy = +_[1]; + return graticule; + }; + graticule.precision = function(_) { + if (!arguments.length) return precision; + precision = +_; + x = d3_geo_graticuleX(y0, y1, 90); + y = d3_geo_graticuleY(x0, x1, precision); + X = d3_geo_graticuleX(Y0, Y1, 90); + Y = d3_geo_graticuleY(X0, X1, precision); + return graticule; + }; + return graticule.majorExtent([ [ -180, -90 + ε ], [ 180, 90 - ε ] ]).minorExtent([ [ -180, -80 - ε ], [ 180, 80 + ε ] ]); + }; + function d3_geo_graticuleX(y0, y1, dy) { + var y = d3.range(y0, y1 - ε, dy).concat(y1); + return function(x) { + return y.map(function(y) { + return [ x, y ]; + }); + }; + } + function d3_geo_graticuleY(x0, x1, dx) { + var x = d3.range(x0, x1 - ε, dx).concat(x1); + return function(y) { + return x.map(function(x) { + return [ x, y ]; + }); + }; + } + function d3_source(d) { + return d.source; + } + function d3_target(d) { + return d.target; + } + d3.geo.greatArc = function() { + var source = d3_source, source_, target = d3_target, target_; + function greatArc() { + return { + type: "LineString", + coordinates: [ source_ || source.apply(this, arguments), target_ || target.apply(this, arguments) ] + }; + } + greatArc.distance = function() { + return d3.geo.distance(source_ || source.apply(this, arguments), target_ || target.apply(this, arguments)); + }; + greatArc.source = function(_) { + if (!arguments.length) return source; + source = _, source_ = typeof _ === "function" ? null : _; + return greatArc; + }; + greatArc.target = function(_) { + if (!arguments.length) return target; + target = _, target_ = typeof _ === "function" ? null : _; + return greatArc; + }; + greatArc.precision = function() { + return arguments.length ? greatArc : 0; + }; + return greatArc; + }; + d3.geo.interpolate = function(source, target) { + return d3_geo_interpolate(source[0] * d3_radians, source[1] * d3_radians, target[0] * d3_radians, target[1] * d3_radians); + }; + function d3_geo_interpolate(x0, y0, x1, y1) { + var cy0 = Math.cos(y0), sy0 = Math.sin(y0), cy1 = Math.cos(y1), sy1 = Math.sin(y1), kx0 = cy0 * Math.cos(x0), ky0 = cy0 * Math.sin(x0), kx1 = cy1 * Math.cos(x1), ky1 = cy1 * Math.sin(x1), d = 2 * Math.asin(Math.sqrt(d3_haversin(y1 - y0) + cy0 * cy1 * d3_haversin(x1 - x0))), k = 1 / Math.sin(d); + var interpolate = d ? function(t) { + var B = Math.sin(t *= d) * k, A = Math.sin(d - t) * k, x = A * kx0 + B * kx1, y = A * ky0 + B * ky1, z = A * sy0 + B * sy1; + return [ Math.atan2(y, x) * d3_degrees, Math.atan2(z, Math.sqrt(x * x + y * y)) * d3_degrees ]; + } : function() { + return [ x0 * d3_degrees, y0 * d3_degrees ]; + }; + interpolate.distance = d; + return interpolate; + } + d3.geo.length = function(object) { + d3_geo_lengthSum = 0; + d3.geo.stream(object, d3_geo_length); + return d3_geo_lengthSum; + }; + var d3_geo_lengthSum; + var d3_geo_length = { + sphere: d3_noop, + point: d3_noop, + lineStart: d3_geo_lengthLineStart, + lineEnd: d3_noop, + polygonStart: d3_noop, + polygonEnd: d3_noop + }; + function d3_geo_lengthLineStart() { + var λ0, sinφ0, cosφ0; + d3_geo_length.point = function(λ, φ) { + λ0 = λ * d3_radians, sinφ0 = Math.sin(φ *= d3_radians), cosφ0 = Math.cos(φ); + d3_geo_length.point = nextPoint; + }; + d3_geo_length.lineEnd = function() { + d3_geo_length.point = d3_geo_length.lineEnd = d3_noop; + }; + function nextPoint(λ, φ) { + var sinφ = Math.sin(φ *= d3_radians), cosφ = Math.cos(φ), t = abs((λ *= d3_radians) - λ0), cosΔλ = Math.cos(t); + d3_geo_lengthSum += Math.atan2(Math.sqrt((t = cosφ * Math.sin(t)) * t + (t = cosφ0 * sinφ - sinφ0 * cosφ * cosΔλ) * t), sinφ0 * sinφ + cosφ0 * cosφ * cosΔλ); + λ0 = λ, sinφ0 = sinφ, cosφ0 = cosφ; + } + } + function d3_geo_azimuthal(scale, angle) { + function azimuthal(λ, φ) { + var cosλ = Math.cos(λ), cosφ = Math.cos(φ), k = scale(cosλ * cosφ); + return [ k * cosφ * Math.sin(λ), k * Math.sin(φ) ]; + } + azimuthal.invert = function(x, y) { + var ρ = Math.sqrt(x * x + y * y), c = angle(ρ), sinc = Math.sin(c), cosc = Math.cos(c); + return [ Math.atan2(x * sinc, ρ * cosc), Math.asin(ρ && y * sinc / ρ) ]; + }; + return azimuthal; + } + var d3_geo_azimuthalEqualArea = d3_geo_azimuthal(function(cosλcosφ) { + return Math.sqrt(2 / (1 + cosλcosφ)); + }, function(ρ) { + return 2 * Math.asin(ρ / 2); + }); + (d3.geo.azimuthalEqualArea = function() { + return d3_geo_projection(d3_geo_azimuthalEqualArea); + }).raw = d3_geo_azimuthalEqualArea; + var d3_geo_azimuthalEquidistant = d3_geo_azimuthal(function(cosλcosφ) { + var c = Math.acos(cosλcosφ); + return c && c / Math.sin(c); + }, d3_identity); + (d3.geo.azimuthalEquidistant = function() { + return d3_geo_projection(d3_geo_azimuthalEquidistant); + }).raw = d3_geo_azimuthalEquidistant; + function d3_geo_conicConformal(φ0, φ1) { + var cosφ0 = Math.cos(φ0), t = function(φ) { + return Math.tan(π / 4 + φ / 2); + }, n = φ0 === φ1 ? Math.sin(φ0) : Math.log(cosφ0 / Math.cos(φ1)) / Math.log(t(φ1) / t(φ0)), F = cosφ0 * Math.pow(t(φ0), n) / n; + if (!n) return d3_geo_mercator; + function forward(λ, φ) { + if (F > 0) { + if (φ < -halfπ + ε) φ = -halfπ + ε; + } else { + if (φ > halfπ - ε) φ = halfπ - ε; + } + var ρ = F / Math.pow(t(φ), n); + return [ ρ * Math.sin(n * λ), F - ρ * Math.cos(n * λ) ]; + } + forward.invert = function(x, y) { + var ρ0_y = F - y, ρ = d3_sgn(n) * Math.sqrt(x * x + ρ0_y * ρ0_y); + return [ Math.atan2(x, ρ0_y) / n, 2 * Math.atan(Math.pow(F / ρ, 1 / n)) - halfπ ]; + }; + return forward; + } + (d3.geo.conicConformal = function() { + return d3_geo_conic(d3_geo_conicConformal); + }).raw = d3_geo_conicConformal; + function d3_geo_conicEquidistant(φ0, φ1) { + var cosφ0 = Math.cos(φ0), n = φ0 === φ1 ? Math.sin(φ0) : (cosφ0 - Math.cos(φ1)) / (φ1 - φ0), G = cosφ0 / n + φ0; + if (abs(n) < ε) return d3_geo_equirectangular; + function forward(λ, φ) { + var ρ = G - φ; + return [ ρ * Math.sin(n * λ), G - ρ * Math.cos(n * λ) ]; + } + forward.invert = function(x, y) { + var ρ0_y = G - y; + return [ Math.atan2(x, ρ0_y) / n, G - d3_sgn(n) * Math.sqrt(x * x + ρ0_y * ρ0_y) ]; + }; + return forward; + } + (d3.geo.conicEquidistant = function() { + return d3_geo_conic(d3_geo_conicEquidistant); + }).raw = d3_geo_conicEquidistant; + var d3_geo_gnomonic = d3_geo_azimuthal(function(cosλcosφ) { + return 1 / cosλcosφ; + }, Math.atan); + (d3.geo.gnomonic = function() { + return d3_geo_projection(d3_geo_gnomonic); + }).raw = d3_geo_gnomonic; + function d3_geo_mercator(λ, φ) { + return [ λ, Math.log(Math.tan(π / 4 + φ / 2)) ]; + } + d3_geo_mercator.invert = function(x, y) { + return [ x, 2 * Math.atan(Math.exp(y)) - halfπ ]; + }; + function d3_geo_mercatorProjection(project) { + var m = d3_geo_projection(project), scale = m.scale, translate = m.translate, clipExtent = m.clipExtent, clipAuto; + m.scale = function() { + var v = scale.apply(m, arguments); + return v === m ? clipAuto ? m.clipExtent(null) : m : v; + }; + m.translate = function() { + var v = translate.apply(m, arguments); + return v === m ? clipAuto ? m.clipExtent(null) : m : v; + }; + m.clipExtent = function(_) { + var v = clipExtent.apply(m, arguments); + if (v === m) { + if (clipAuto = _ == null) { + var k = π * scale(), t = translate(); + clipExtent([ [ t[0] - k, t[1] - k ], [ t[0] + k, t[1] + k ] ]); + } + } else if (clipAuto) { + v = null; + } + return v; + }; + return m.clipExtent(null); + } + (d3.geo.mercator = function() { + return d3_geo_mercatorProjection(d3_geo_mercator); + }).raw = d3_geo_mercator; + var d3_geo_orthographic = d3_geo_azimuthal(function() { + return 1; + }, Math.asin); + (d3.geo.orthographic = function() { + return d3_geo_projection(d3_geo_orthographic); + }).raw = d3_geo_orthographic; + var d3_geo_stereographic = d3_geo_azimuthal(function(cosλcosφ) { + return 1 / (1 + cosλcosφ); + }, function(ρ) { + return 2 * Math.atan(ρ); + }); + (d3.geo.stereographic = function() { + return d3_geo_projection(d3_geo_stereographic); + }).raw = d3_geo_stereographic; + function d3_geo_transverseMercator(λ, φ) { + return [ Math.log(Math.tan(π / 4 + φ / 2)), -λ ]; + } + d3_geo_transverseMercator.invert = function(x, y) { + return [ -y, 2 * Math.atan(Math.exp(x)) - halfπ ]; + }; + (d3.geo.transverseMercator = function() { + var projection = d3_geo_mercatorProjection(d3_geo_transverseMercator), center = projection.center, rotate = projection.rotate; + projection.center = function(_) { + return _ ? center([ -_[1], _[0] ]) : (_ = center(), [ _[1], -_[0] ]); + }; + projection.rotate = function(_) { + return _ ? rotate([ _[0], _[1], _.length > 2 ? _[2] + 90 : 90 ]) : (_ = rotate(), + [ _[0], _[1], _[2] - 90 ]); + }; + return rotate([ 0, 0, 90 ]); + }).raw = d3_geo_transverseMercator; + d3.geom = {}; + function d3_geom_pointX(d) { + return d[0]; + } + function d3_geom_pointY(d) { + return d[1]; + } + d3.geom.hull = function(vertices) { + var x = d3_geom_pointX, y = d3_geom_pointY; + if (arguments.length) return hull(vertices); + function hull(data) { + if (data.length < 3) return []; + var fx = d3_functor(x), fy = d3_functor(y), i, n = data.length, points = [], flippedPoints = []; + for (i = 0; i < n; i++) { + points.push([ +fx.call(this, data[i], i), +fy.call(this, data[i], i), i ]); + } + points.sort(d3_geom_hullOrder); + for (i = 0; i < n; i++) flippedPoints.push([ points[i][0], -points[i][1] ]); + var upper = d3_geom_hullUpper(points), lower = d3_geom_hullUpper(flippedPoints); + var skipLeft = lower[0] === upper[0], skipRight = lower[lower.length - 1] === upper[upper.length - 1], polygon = []; + for (i = upper.length - 1; i >= 0; --i) polygon.push(data[points[upper[i]][2]]); + for (i = +skipLeft; i < lower.length - skipRight; ++i) polygon.push(data[points[lower[i]][2]]); + return polygon; + } + hull.x = function(_) { + return arguments.length ? (x = _, hull) : x; + }; + hull.y = function(_) { + return arguments.length ? (y = _, hull) : y; + }; + return hull; + }; + function d3_geom_hullUpper(points) { + var n = points.length, hull = [ 0, 1 ], hs = 2; + for (var i = 2; i < n; i++) { + while (hs > 1 && d3_cross2d(points[hull[hs - 2]], points[hull[hs - 1]], points[i]) <= 0) --hs; + hull[hs++] = i; + } + return hull.slice(0, hs); + } + function d3_geom_hullOrder(a, b) { + return a[0] - b[0] || a[1] - b[1]; + } + d3.geom.polygon = function(coordinates) { + d3_subclass(coordinates, d3_geom_polygonPrototype); + return coordinates; + }; + var d3_geom_polygonPrototype = d3.geom.polygon.prototype = []; + d3_geom_polygonPrototype.area = function() { + var i = -1, n = this.length, a, b = this[n - 1], area = 0; + while (++i < n) { + a = b; + b = this[i]; + area += a[1] * b[0] - a[0] * b[1]; + } + return area * .5; + }; + d3_geom_polygonPrototype.centroid = function(k) { + var i = -1, n = this.length, x = 0, y = 0, a, b = this[n - 1], c; + if (!arguments.length) k = -1 / (6 * this.area()); + while (++i < n) { + a = b; + b = this[i]; + c = a[0] * b[1] - b[0] * a[1]; + x += (a[0] + b[0]) * c; + y += (a[1] + b[1]) * c; + } + return [ x * k, y * k ]; + }; + d3_geom_polygonPrototype.clip = function(subject) { + var input, closed = d3_geom_polygonClosed(subject), i = -1, n = this.length - d3_geom_polygonClosed(this), j, m, a = this[n - 1], b, c, d; + while (++i < n) { + input = subject.slice(); + subject.length = 0; + b = this[i]; + c = input[(m = input.length - closed) - 1]; + j = -1; + while (++j < m) { + d = input[j]; + if (d3_geom_polygonInside(d, a, b)) { + if (!d3_geom_polygonInside(c, a, b)) { + subject.push(d3_geom_polygonIntersect(c, d, a, b)); + } + subject.push(d); + } else if (d3_geom_polygonInside(c, a, b)) { + subject.push(d3_geom_polygonIntersect(c, d, a, b)); + } + c = d; + } + if (closed) subject.push(subject[0]); + a = b; + } + return subject; + }; + function d3_geom_polygonInside(p, a, b) { + return (b[0] - a[0]) * (p[1] - a[1]) < (b[1] - a[1]) * (p[0] - a[0]); + } + function d3_geom_polygonIntersect(c, d, a, b) { + var x1 = c[0], x3 = a[0], x21 = d[0] - x1, x43 = b[0] - x3, y1 = c[1], y3 = a[1], y21 = d[1] - y1, y43 = b[1] - y3, ua = (x43 * (y1 - y3) - y43 * (x1 - x3)) / (y43 * x21 - x43 * y21); + return [ x1 + ua * x21, y1 + ua * y21 ]; + } + function d3_geom_polygonClosed(coordinates) { + var a = coordinates[0], b = coordinates[coordinates.length - 1]; + return !(a[0] - b[0] || a[1] - b[1]); + } + var d3_geom_voronoiEdges, d3_geom_voronoiCells, d3_geom_voronoiBeaches, d3_geom_voronoiBeachPool = [], d3_geom_voronoiFirstCircle, d3_geom_voronoiCircles, d3_geom_voronoiCirclePool = []; + function d3_geom_voronoiBeach() { + d3_geom_voronoiRedBlackNode(this); + this.edge = this.site = this.circle = null; + } + function d3_geom_voronoiCreateBeach(site) { + var beach = d3_geom_voronoiBeachPool.pop() || new d3_geom_voronoiBeach(); + beach.site = site; + return beach; + } + function d3_geom_voronoiDetachBeach(beach) { + d3_geom_voronoiDetachCircle(beach); + d3_geom_voronoiBeaches.remove(beach); + d3_geom_voronoiBeachPool.push(beach); + d3_geom_voronoiRedBlackNode(beach); + } + function d3_geom_voronoiRemoveBeach(beach) { + var circle = beach.circle, x = circle.x, y = circle.cy, vertex = { + x: x, + y: y + }, previous = beach.P, next = beach.N, disappearing = [ beach ]; + d3_geom_voronoiDetachBeach(beach); + var lArc = previous; + while (lArc.circle && abs(x - lArc.circle.x) < ε && abs(y - lArc.circle.cy) < ε) { + previous = lArc.P; + disappearing.unshift(lArc); + d3_geom_voronoiDetachBeach(lArc); + lArc = previous; + } + disappearing.unshift(lArc); + d3_geom_voronoiDetachCircle(lArc); + var rArc = next; + while (rArc.circle && abs(x - rArc.circle.x) < ε && abs(y - rArc.circle.cy) < ε) { + next = rArc.N; + disappearing.push(rArc); + d3_geom_voronoiDetachBeach(rArc); + rArc = next; + } + disappearing.push(rArc); + d3_geom_voronoiDetachCircle(rArc); + var nArcs = disappearing.length, iArc; + for (iArc = 1; iArc < nArcs; ++iArc) { + rArc = disappearing[iArc]; + lArc = disappearing[iArc - 1]; + d3_geom_voronoiSetEdgeEnd(rArc.edge, lArc.site, rArc.site, vertex); + } + lArc = disappearing[0]; + rArc = disappearing[nArcs - 1]; + rArc.edge = d3_geom_voronoiCreateEdge(lArc.site, rArc.site, null, vertex); + d3_geom_voronoiAttachCircle(lArc); + d3_geom_voronoiAttachCircle(rArc); + } + function d3_geom_voronoiAddBeach(site) { + var x = site.x, directrix = site.y, lArc, rArc, dxl, dxr, node = d3_geom_voronoiBeaches._; + while (node) { + dxl = d3_geom_voronoiLeftBreakPoint(node, directrix) - x; + if (dxl > ε) node = node.L; else { + dxr = x - d3_geom_voronoiRightBreakPoint(node, directrix); + if (dxr > ε) { + if (!node.R) { + lArc = node; + break; + } + node = node.R; + } else { + if (dxl > -ε) { + lArc = node.P; + rArc = node; + } else if (dxr > -ε) { + lArc = node; + rArc = node.N; + } else { + lArc = rArc = node; + } + break; + } + } + } + var newArc = d3_geom_voronoiCreateBeach(site); + d3_geom_voronoiBeaches.insert(lArc, newArc); + if (!lArc && !rArc) return; + if (lArc === rArc) { + d3_geom_voronoiDetachCircle(lArc); + rArc = d3_geom_voronoiCreateBeach(lArc.site); + d3_geom_voronoiBeaches.insert(newArc, rArc); + newArc.edge = rArc.edge = d3_geom_voronoiCreateEdge(lArc.site, newArc.site); + d3_geom_voronoiAttachCircle(lArc); + d3_geom_voronoiAttachCircle(rArc); + return; + } + if (!rArc) { + newArc.edge = d3_geom_voronoiCreateEdge(lArc.site, newArc.site); + return; + } + d3_geom_voronoiDetachCircle(lArc); + d3_geom_voronoiDetachCircle(rArc); + var lSite = lArc.site, ax = lSite.x, ay = lSite.y, bx = site.x - ax, by = site.y - ay, rSite = rArc.site, cx = rSite.x - ax, cy = rSite.y - ay, d = 2 * (bx * cy - by * cx), hb = bx * bx + by * by, hc = cx * cx + cy * cy, vertex = { + x: (cy * hb - by * hc) / d + ax, + y: (bx * hc - cx * hb) / d + ay + }; + d3_geom_voronoiSetEdgeEnd(rArc.edge, lSite, rSite, vertex); + newArc.edge = d3_geom_voronoiCreateEdge(lSite, site, null, vertex); + rArc.edge = d3_geom_voronoiCreateEdge(site, rSite, null, vertex); + d3_geom_voronoiAttachCircle(lArc); + d3_geom_voronoiAttachCircle(rArc); + } + function d3_geom_voronoiLeftBreakPoint(arc, directrix) { + var site = arc.site, rfocx = site.x, rfocy = site.y, pby2 = rfocy - directrix; + if (!pby2) return rfocx; + var lArc = arc.P; + if (!lArc) return -Infinity; + site = lArc.site; + var lfocx = site.x, lfocy = site.y, plby2 = lfocy - directrix; + if (!plby2) return lfocx; + var hl = lfocx - rfocx, aby2 = 1 / pby2 - 1 / plby2, b = hl / plby2; + if (aby2) return (-b + Math.sqrt(b * b - 2 * aby2 * (hl * hl / (-2 * plby2) - lfocy + plby2 / 2 + rfocy - pby2 / 2))) / aby2 + rfocx; + return (rfocx + lfocx) / 2; + } + function d3_geom_voronoiRightBreakPoint(arc, directrix) { + var rArc = arc.N; + if (rArc) return d3_geom_voronoiLeftBreakPoint(rArc, directrix); + var site = arc.site; + return site.y === directrix ? site.x : Infinity; + } + function d3_geom_voronoiCell(site) { + this.site = site; + this.edges = []; + } + d3_geom_voronoiCell.prototype.prepare = function() { + var halfEdges = this.edges, iHalfEdge = halfEdges.length, edge; + while (iHalfEdge--) { + edge = halfEdges[iHalfEdge].edge; + if (!edge.b || !edge.a) halfEdges.splice(iHalfEdge, 1); + } + halfEdges.sort(d3_geom_voronoiHalfEdgeOrder); + return halfEdges.length; + }; + function d3_geom_voronoiCloseCells(extent) { + var x0 = extent[0][0], x1 = extent[1][0], y0 = extent[0][1], y1 = extent[1][1], x2, y2, x3, y3, cells = d3_geom_voronoiCells, iCell = cells.length, cell, iHalfEdge, halfEdges, nHalfEdges, start, end; + while (iCell--) { + cell = cells[iCell]; + if (!cell || !cell.prepare()) continue; + halfEdges = cell.edges; + nHalfEdges = halfEdges.length; + iHalfEdge = 0; + while (iHalfEdge < nHalfEdges) { + end = halfEdges[iHalfEdge].end(), x3 = end.x, y3 = end.y; + start = halfEdges[++iHalfEdge % nHalfEdges].start(), x2 = start.x, y2 = start.y; + if (abs(x3 - x2) > ε || abs(y3 - y2) > ε) { + halfEdges.splice(iHalfEdge, 0, new d3_geom_voronoiHalfEdge(d3_geom_voronoiCreateBorderEdge(cell.site, end, abs(x3 - x0) < ε && y1 - y3 > ε ? { + x: x0, + y: abs(x2 - x0) < ε ? y2 : y1 + } : abs(y3 - y1) < ε && x1 - x3 > ε ? { + x: abs(y2 - y1) < ε ? x2 : x1, + y: y1 + } : abs(x3 - x1) < ε && y3 - y0 > ε ? { + x: x1, + y: abs(x2 - x1) < ε ? y2 : y0 + } : abs(y3 - y0) < ε && x3 - x0 > ε ? { + x: abs(y2 - y0) < ε ? x2 : x0, + y: y0 + } : null), cell.site, null)); + ++nHalfEdges; + } + } + } + } + function d3_geom_voronoiHalfEdgeOrder(a, b) { + return b.angle - a.angle; + } + function d3_geom_voronoiCircle() { + d3_geom_voronoiRedBlackNode(this); + this.x = this.y = this.arc = this.site = this.cy = null; + } + function d3_geom_voronoiAttachCircle(arc) { + var lArc = arc.P, rArc = arc.N; + if (!lArc || !rArc) return; + var lSite = lArc.site, cSite = arc.site, rSite = rArc.site; + if (lSite === rSite) return; + var bx = cSite.x, by = cSite.y, ax = lSite.x - bx, ay = lSite.y - by, cx = rSite.x - bx, cy = rSite.y - by; + var d = 2 * (ax * cy - ay * cx); + if (d >= -ε2) return; + var ha = ax * ax + ay * ay, hc = cx * cx + cy * cy, x = (cy * ha - ay * hc) / d, y = (ax * hc - cx * ha) / d, cy = y + by; + var circle = d3_geom_voronoiCirclePool.pop() || new d3_geom_voronoiCircle(); + circle.arc = arc; + circle.site = cSite; + circle.x = x + bx; + circle.y = cy + Math.sqrt(x * x + y * y); + circle.cy = cy; + arc.circle = circle; + var before = null, node = d3_geom_voronoiCircles._; + while (node) { + if (circle.y < node.y || circle.y === node.y && circle.x <= node.x) { + if (node.L) node = node.L; else { + before = node.P; + break; + } + } else { + if (node.R) node = node.R; else { + before = node; + break; + } + } + } + d3_geom_voronoiCircles.insert(before, circle); + if (!before) d3_geom_voronoiFirstCircle = circle; + } + function d3_geom_voronoiDetachCircle(arc) { + var circle = arc.circle; + if (circle) { + if (!circle.P) d3_geom_voronoiFirstCircle = circle.N; + d3_geom_voronoiCircles.remove(circle); + d3_geom_voronoiCirclePool.push(circle); + d3_geom_voronoiRedBlackNode(circle); + arc.circle = null; + } + } + function d3_geom_voronoiClipEdges(extent) { + var edges = d3_geom_voronoiEdges, clip = d3_geom_clipLine(extent[0][0], extent[0][1], extent[1][0], extent[1][1]), i = edges.length, e; + while (i--) { + e = edges[i]; + if (!d3_geom_voronoiConnectEdge(e, extent) || !clip(e) || abs(e.a.x - e.b.x) < ε && abs(e.a.y - e.b.y) < ε) { + e.a = e.b = null; + edges.splice(i, 1); + } + } + } + function d3_geom_voronoiConnectEdge(edge, extent) { + var vb = edge.b; + if (vb) return true; + var va = edge.a, x0 = extent[0][0], x1 = extent[1][0], y0 = extent[0][1], y1 = extent[1][1], lSite = edge.l, rSite = edge.r, lx = lSite.x, ly = lSite.y, rx = rSite.x, ry = rSite.y, fx = (lx + rx) / 2, fy = (ly + ry) / 2, fm, fb; + if (ry === ly) { + if (fx < x0 || fx >= x1) return; + if (lx > rx) { + if (!va) va = { + x: fx, + y: y0 + }; else if (va.y >= y1) return; + vb = { + x: fx, + y: y1 + }; + } else { + if (!va) va = { + x: fx, + y: y1 + }; else if (va.y < y0) return; + vb = { + x: fx, + y: y0 + }; + } + } else { + fm = (lx - rx) / (ry - ly); + fb = fy - fm * fx; + if (fm < -1 || fm > 1) { + if (lx > rx) { + if (!va) va = { + x: (y0 - fb) / fm, + y: y0 + }; else if (va.y >= y1) return; + vb = { + x: (y1 - fb) / fm, + y: y1 + }; + } else { + if (!va) va = { + x: (y1 - fb) / fm, + y: y1 + }; else if (va.y < y0) return; + vb = { + x: (y0 - fb) / fm, + y: y0 + }; + } + } else { + if (ly < ry) { + if (!va) va = { + x: x0, + y: fm * x0 + fb + }; else if (va.x >= x1) return; + vb = { + x: x1, + y: fm * x1 + fb + }; + } else { + if (!va) va = { + x: x1, + y: fm * x1 + fb + }; else if (va.x < x0) return; + vb = { + x: x0, + y: fm * x0 + fb + }; + } + } + } + edge.a = va; + edge.b = vb; + return true; + } + function d3_geom_voronoiEdge(lSite, rSite) { + this.l = lSite; + this.r = rSite; + this.a = this.b = null; + } + function d3_geom_voronoiCreateEdge(lSite, rSite, va, vb) { + var edge = new d3_geom_voronoiEdge(lSite, rSite); + d3_geom_voronoiEdges.push(edge); + if (va) d3_geom_voronoiSetEdgeEnd(edge, lSite, rSite, va); + if (vb) d3_geom_voronoiSetEdgeEnd(edge, rSite, lSite, vb); + d3_geom_voronoiCells[lSite.i].edges.push(new d3_geom_voronoiHalfEdge(edge, lSite, rSite)); + d3_geom_voronoiCells[rSite.i].edges.push(new d3_geom_voronoiHalfEdge(edge, rSite, lSite)); + return edge; + } + function d3_geom_voronoiCreateBorderEdge(lSite, va, vb) { + var edge = new d3_geom_voronoiEdge(lSite, null); + edge.a = va; + edge.b = vb; + d3_geom_voronoiEdges.push(edge); + return edge; + } + function d3_geom_voronoiSetEdgeEnd(edge, lSite, rSite, vertex) { + if (!edge.a && !edge.b) { + edge.a = vertex; + edge.l = lSite; + edge.r = rSite; + } else if (edge.l === rSite) { + edge.b = vertex; + } else { + edge.a = vertex; + } + } + function d3_geom_voronoiHalfEdge(edge, lSite, rSite) { + var va = edge.a, vb = edge.b; + this.edge = edge; + this.site = lSite; + this.angle = rSite ? Math.atan2(rSite.y - lSite.y, rSite.x - lSite.x) : edge.l === lSite ? Math.atan2(vb.x - va.x, va.y - vb.y) : Math.atan2(va.x - vb.x, vb.y - va.y); + } + d3_geom_voronoiHalfEdge.prototype = { + start: function() { + return this.edge.l === this.site ? this.edge.a : this.edge.b; + }, + end: function() { + return this.edge.l === this.site ? this.edge.b : this.edge.a; + } + }; + function d3_geom_voronoiRedBlackTree() { + this._ = null; + } + function d3_geom_voronoiRedBlackNode(node) { + node.U = node.C = node.L = node.R = node.P = node.N = null; + } + d3_geom_voronoiRedBlackTree.prototype = { + insert: function(after, node) { + var parent, grandpa, uncle; + if (after) { + node.P = after; + node.N = after.N; + if (after.N) after.N.P = node; + after.N = node; + if (after.R) { + after = after.R; + while (after.L) after = after.L; + after.L = node; + } else { + after.R = node; + } + parent = after; + } else if (this._) { + after = d3_geom_voronoiRedBlackFirst(this._); + node.P = null; + node.N = after; + after.P = after.L = node; + parent = after; + } else { + node.P = node.N = null; + this._ = node; + parent = null; + } + node.L = node.R = null; + node.U = parent; + node.C = true; + after = node; + while (parent && parent.C) { + grandpa = parent.U; + if (parent === grandpa.L) { + uncle = grandpa.R; + if (uncle && uncle.C) { + parent.C = uncle.C = false; + grandpa.C = true; + after = grandpa; + } else { + if (after === parent.R) { + d3_geom_voronoiRedBlackRotateLeft(this, parent); + after = parent; + parent = after.U; + } + parent.C = false; + grandpa.C = true; + d3_geom_voronoiRedBlackRotateRight(this, grandpa); + } + } else { + uncle = grandpa.L; + if (uncle && uncle.C) { + parent.C = uncle.C = false; + grandpa.C = true; + after = grandpa; + } else { + if (after === parent.L) { + d3_geom_voronoiRedBlackRotateRight(this, parent); + after = parent; + parent = after.U; + } + parent.C = false; + grandpa.C = true; + d3_geom_voronoiRedBlackRotateLeft(this, grandpa); + } + } + parent = after.U; + } + this._.C = false; + }, + remove: function(node) { + if (node.N) node.N.P = node.P; + if (node.P) node.P.N = node.N; + node.N = node.P = null; + var parent = node.U, sibling, left = node.L, right = node.R, next, red; + if (!left) next = right; else if (!right) next = left; else next = d3_geom_voronoiRedBlackFirst(right); + if (parent) { + if (parent.L === node) parent.L = next; else parent.R = next; + } else { + this._ = next; + } + if (left && right) { + red = next.C; + next.C = node.C; + next.L = left; + left.U = next; + if (next !== right) { + parent = next.U; + next.U = node.U; + node = next.R; + parent.L = node; + next.R = right; + right.U = next; + } else { + next.U = parent; + parent = next; + node = next.R; + } + } else { + red = node.C; + node = next; + } + if (node) node.U = parent; + if (red) return; + if (node && node.C) { + node.C = false; + return; + } + do { + if (node === this._) break; + if (node === parent.L) { + sibling = parent.R; + if (sibling.C) { + sibling.C = false; + parent.C = true; + d3_geom_voronoiRedBlackRotateLeft(this, parent); + sibling = parent.R; + } + if (sibling.L && sibling.L.C || sibling.R && sibling.R.C) { + if (!sibling.R || !sibling.R.C) { + sibling.L.C = false; + sibling.C = true; + d3_geom_voronoiRedBlackRotateRight(this, sibling); + sibling = parent.R; + } + sibling.C = parent.C; + parent.C = sibling.R.C = false; + d3_geom_voronoiRedBlackRotateLeft(this, parent); + node = this._; + break; + } + } else { + sibling = parent.L; + if (sibling.C) { + sibling.C = false; + parent.C = true; + d3_geom_voronoiRedBlackRotateRight(this, parent); + sibling = parent.L; + } + if (sibling.L && sibling.L.C || sibling.R && sibling.R.C) { + if (!sibling.L || !sibling.L.C) { + sibling.R.C = false; + sibling.C = true; + d3_geom_voronoiRedBlackRotateLeft(this, sibling); + sibling = parent.L; + } + sibling.C = parent.C; + parent.C = sibling.L.C = false; + d3_geom_voronoiRedBlackRotateRight(this, parent); + node = this._; + break; + } + } + sibling.C = true; + node = parent; + parent = parent.U; + } while (!node.C); + if (node) node.C = false; + } + }; + function d3_geom_voronoiRedBlackRotateLeft(tree, node) { + var p = node, q = node.R, parent = p.U; + if (parent) { + if (parent.L === p) parent.L = q; else parent.R = q; + } else { + tree._ = q; + } + q.U = parent; + p.U = q; + p.R = q.L; + if (p.R) p.R.U = p; + q.L = p; + } + function d3_geom_voronoiRedBlackRotateRight(tree, node) { + var p = node, q = node.L, parent = p.U; + if (parent) { + if (parent.L === p) parent.L = q; else parent.R = q; + } else { + tree._ = q; + } + q.U = parent; + p.U = q; + p.L = q.R; + if (p.L) p.L.U = p; + q.R = p; + } + function d3_geom_voronoiRedBlackFirst(node) { + while (node.L) node = node.L; + return node; + } + function d3_geom_voronoi(sites, bbox) { + var site = sites.sort(d3_geom_voronoiVertexOrder).pop(), x0, y0, circle; + d3_geom_voronoiEdges = []; + d3_geom_voronoiCells = new Array(sites.length); + d3_geom_voronoiBeaches = new d3_geom_voronoiRedBlackTree(); + d3_geom_voronoiCircles = new d3_geom_voronoiRedBlackTree(); + while (true) { + circle = d3_geom_voronoiFirstCircle; + if (site && (!circle || site.y < circle.y || site.y === circle.y && site.x < circle.x)) { + if (site.x !== x0 || site.y !== y0) { + d3_geom_voronoiCells[site.i] = new d3_geom_voronoiCell(site); + d3_geom_voronoiAddBeach(site); + x0 = site.x, y0 = site.y; + } + site = sites.pop(); + } else if (circle) { + d3_geom_voronoiRemoveBeach(circle.arc); + } else { + break; + } + } + if (bbox) d3_geom_voronoiClipEdges(bbox), d3_geom_voronoiCloseCells(bbox); + var diagram = { + cells: d3_geom_voronoiCells, + edges: d3_geom_voronoiEdges + }; + d3_geom_voronoiBeaches = d3_geom_voronoiCircles = d3_geom_voronoiEdges = d3_geom_voronoiCells = null; + return diagram; + } + function d3_geom_voronoiVertexOrder(a, b) { + return b.y - a.y || b.x - a.x; + } + d3.geom.voronoi = function(points) { + var x = d3_geom_pointX, y = d3_geom_pointY, fx = x, fy = y, clipExtent = d3_geom_voronoiClipExtent; + if (points) return voronoi(points); + function voronoi(data) { + var polygons = new Array(data.length), x0 = clipExtent[0][0], y0 = clipExtent[0][1], x1 = clipExtent[1][0], y1 = clipExtent[1][1]; + d3_geom_voronoi(sites(data), clipExtent).cells.forEach(function(cell, i) { + var edges = cell.edges, site = cell.site, polygon = polygons[i] = edges.length ? edges.map(function(e) { + var s = e.start(); + return [ s.x, s.y ]; + }) : site.x >= x0 && site.x <= x1 && site.y >= y0 && site.y <= y1 ? [ [ x0, y1 ], [ x1, y1 ], [ x1, y0 ], [ x0, y0 ] ] : []; + polygon.point = data[i]; + }); + return polygons; + } + function sites(data) { + return data.map(function(d, i) { + return { + x: Math.round(fx(d, i) / ε) * ε, + y: Math.round(fy(d, i) / ε) * ε, + i: i + }; + }); + } + voronoi.links = function(data) { + return d3_geom_voronoi(sites(data)).edges.filter(function(edge) { + return edge.l && edge.r; + }).map(function(edge) { + return { + source: data[edge.l.i], + target: data[edge.r.i] + }; + }); + }; + voronoi.triangles = function(data) { + var triangles = []; + d3_geom_voronoi(sites(data)).cells.forEach(function(cell, i) { + var site = cell.site, edges = cell.edges.sort(d3_geom_voronoiHalfEdgeOrder), j = -1, m = edges.length, e0, s0, e1 = edges[m - 1].edge, s1 = e1.l === site ? e1.r : e1.l; + while (++j < m) { + e0 = e1; + s0 = s1; + e1 = edges[j].edge; + s1 = e1.l === site ? e1.r : e1.l; + if (i < s0.i && i < s1.i && d3_geom_voronoiTriangleArea(site, s0, s1) < 0) { + triangles.push([ data[i], data[s0.i], data[s1.i] ]); + } + } + }); + return triangles; + }; + voronoi.x = function(_) { + return arguments.length ? (fx = d3_functor(x = _), voronoi) : x; + }; + voronoi.y = function(_) { + return arguments.length ? (fy = d3_functor(y = _), voronoi) : y; + }; + voronoi.clipExtent = function(_) { + if (!arguments.length) return clipExtent === d3_geom_voronoiClipExtent ? null : clipExtent; + clipExtent = _ == null ? d3_geom_voronoiClipExtent : _; + return voronoi; + }; + voronoi.size = function(_) { + if (!arguments.length) return clipExtent === d3_geom_voronoiClipExtent ? null : clipExtent && clipExtent[1]; + return voronoi.clipExtent(_ && [ [ 0, 0 ], _ ]); + }; + return voronoi; + }; + var d3_geom_voronoiClipExtent = [ [ -1e6, -1e6 ], [ 1e6, 1e6 ] ]; + function d3_geom_voronoiTriangleArea(a, b, c) { + return (a.x - c.x) * (b.y - a.y) - (a.x - b.x) * (c.y - a.y); + } + d3.geom.delaunay = function(vertices) { + return d3.geom.voronoi().triangles(vertices); + }; + d3.geom.quadtree = function(points, x1, y1, x2, y2) { + var x = d3_geom_pointX, y = d3_geom_pointY, compat; + if (compat = arguments.length) { + x = d3_geom_quadtreeCompatX; + y = d3_geom_quadtreeCompatY; + if (compat === 3) { + y2 = y1; + x2 = x1; + y1 = x1 = 0; + } + return quadtree(points); + } + function quadtree(data) { + var d, fx = d3_functor(x), fy = d3_functor(y), xs, ys, i, n, x1_, y1_, x2_, y2_; + if (x1 != null) { + x1_ = x1, y1_ = y1, x2_ = x2, y2_ = y2; + } else { + x2_ = y2_ = -(x1_ = y1_ = Infinity); + xs = [], ys = []; + n = data.length; + if (compat) for (i = 0; i < n; ++i) { + d = data[i]; + if (d.x < x1_) x1_ = d.x; + if (d.y < y1_) y1_ = d.y; + if (d.x > x2_) x2_ = d.x; + if (d.y > y2_) y2_ = d.y; + xs.push(d.x); + ys.push(d.y); + } else for (i = 0; i < n; ++i) { + var x_ = +fx(d = data[i], i), y_ = +fy(d, i); + if (x_ < x1_) x1_ = x_; + if (y_ < y1_) y1_ = y_; + if (x_ > x2_) x2_ = x_; + if (y_ > y2_) y2_ = y_; + xs.push(x_); + ys.push(y_); + } + } + var dx = x2_ - x1_, dy = y2_ - y1_; + if (dx > dy) y2_ = y1_ + dx; else x2_ = x1_ + dy; + function insert(n, d, x, y, x1, y1, x2, y2) { + if (isNaN(x) || isNaN(y)) return; + if (n.leaf) { + var nx = n.x, ny = n.y; + if (nx != null) { + if (abs(nx - x) + abs(ny - y) < .01) { + insertChild(n, d, x, y, x1, y1, x2, y2); + } else { + var nPoint = n.point; + n.x = n.y = n.point = null; + insertChild(n, nPoint, nx, ny, x1, y1, x2, y2); + insertChild(n, d, x, y, x1, y1, x2, y2); + } + } else { + n.x = x, n.y = y, n.point = d; + } + } else { + insertChild(n, d, x, y, x1, y1, x2, y2); + } + } + function insertChild(n, d, x, y, x1, y1, x2, y2) { + var xm = (x1 + x2) * .5, ym = (y1 + y2) * .5, right = x >= xm, below = y >= ym, i = below << 1 | right; + n.leaf = false; + n = n.nodes[i] || (n.nodes[i] = d3_geom_quadtreeNode()); + if (right) x1 = xm; else x2 = xm; + if (below) y1 = ym; else y2 = ym; + insert(n, d, x, y, x1, y1, x2, y2); + } + var root = d3_geom_quadtreeNode(); + root.add = function(d) { + insert(root, d, +fx(d, ++i), +fy(d, i), x1_, y1_, x2_, y2_); + }; + root.visit = function(f) { + d3_geom_quadtreeVisit(f, root, x1_, y1_, x2_, y2_); + }; + root.find = function(point) { + return d3_geom_quadtreeFind(root, point[0], point[1], x1_, y1_, x2_, y2_); + }; + i = -1; + if (x1 == null) { + while (++i < n) { + insert(root, data[i], xs[i], ys[i], x1_, y1_, x2_, y2_); + } + --i; + } else data.forEach(root.add); + xs = ys = data = d = null; + return root; + } + quadtree.x = function(_) { + return arguments.length ? (x = _, quadtree) : x; + }; + quadtree.y = function(_) { + return arguments.length ? (y = _, quadtree) : y; + }; + quadtree.extent = function(_) { + if (!arguments.length) return x1 == null ? null : [ [ x1, y1 ], [ x2, y2 ] ]; + if (_ == null) x1 = y1 = x2 = y2 = null; else x1 = +_[0][0], y1 = +_[0][1], x2 = +_[1][0], + y2 = +_[1][1]; + return quadtree; + }; + quadtree.size = function(_) { + if (!arguments.length) return x1 == null ? null : [ x2 - x1, y2 - y1 ]; + if (_ == null) x1 = y1 = x2 = y2 = null; else x1 = y1 = 0, x2 = +_[0], y2 = +_[1]; + return quadtree; + }; + return quadtree; + }; + function d3_geom_quadtreeCompatX(d) { + return d.x; + } + function d3_geom_quadtreeCompatY(d) { + return d.y; + } + function d3_geom_quadtreeNode() { + return { + leaf: true, + nodes: [], + point: null, + x: null, + y: null + }; + } + function d3_geom_quadtreeVisit(f, node, x1, y1, x2, y2) { + if (!f(node, x1, y1, x2, y2)) { + var sx = (x1 + x2) * .5, sy = (y1 + y2) * .5, children = node.nodes; + if (children[0]) d3_geom_quadtreeVisit(f, children[0], x1, y1, sx, sy); + if (children[1]) d3_geom_quadtreeVisit(f, children[1], sx, y1, x2, sy); + if (children[2]) d3_geom_quadtreeVisit(f, children[2], x1, sy, sx, y2); + if (children[3]) d3_geom_quadtreeVisit(f, children[3], sx, sy, x2, y2); + } + } + function d3_geom_quadtreeFind(root, x, y, x0, y0, x3, y3) { + var minDistance2 = Infinity, closestPoint; + (function find(node, x1, y1, x2, y2) { + if (x1 > x3 || y1 > y3 || x2 < x0 || y2 < y0) return; + if (point = node.point) { + var point, dx = x - node.x, dy = y - node.y, distance2 = dx * dx + dy * dy; + if (distance2 < minDistance2) { + var distance = Math.sqrt(minDistance2 = distance2); + x0 = x - distance, y0 = y - distance; + x3 = x + distance, y3 = y + distance; + closestPoint = point; + } + } + var children = node.nodes, xm = (x1 + x2) * .5, ym = (y1 + y2) * .5, right = x >= xm, below = y >= ym; + for (var i = below << 1 | right, j = i + 4; i < j; ++i) { + if (node = children[i & 3]) switch (i & 3) { + case 0: + find(node, x1, y1, xm, ym); + break; + + case 1: + find(node, xm, y1, x2, ym); + break; + + case 2: + find(node, x1, ym, xm, y2); + break; + + case 3: + find(node, xm, ym, x2, y2); + break; + } + } + })(root, x0, y0, x3, y3); + return closestPoint; + } + d3.interpolateRgb = d3_interpolateRgb; + function d3_interpolateRgb(a, b) { + a = d3.rgb(a); + b = d3.rgb(b); + var ar = a.r, ag = a.g, ab = a.b, br = b.r - ar, bg = b.g - ag, bb = b.b - ab; + return function(t) { + return "#" + d3_rgb_hex(Math.round(ar + br * t)) + d3_rgb_hex(Math.round(ag + bg * t)) + d3_rgb_hex(Math.round(ab + bb * t)); + }; + } + d3.interpolateObject = d3_interpolateObject; + function d3_interpolateObject(a, b) { + var i = {}, c = {}, k; + for (k in a) { + if (k in b) { + i[k] = d3_interpolate(a[k], b[k]); + } else { + c[k] = a[k]; + } + } + for (k in b) { + if (!(k in a)) { + c[k] = b[k]; + } + } + return function(t) { + for (k in i) c[k] = i[k](t); + return c; + }; + } + d3.interpolateNumber = d3_interpolateNumber; + function d3_interpolateNumber(a, b) { + a = +a, b = +b; + return function(t) { + return a * (1 - t) + b * t; + }; + } + d3.interpolateString = d3_interpolateString; + function d3_interpolateString(a, b) { + var bi = d3_interpolate_numberA.lastIndex = d3_interpolate_numberB.lastIndex = 0, am, bm, bs, i = -1, s = [], q = []; + a = a + "", b = b + ""; + while ((am = d3_interpolate_numberA.exec(a)) && (bm = d3_interpolate_numberB.exec(b))) { + if ((bs = bm.index) > bi) { + bs = b.slice(bi, bs); + if (s[i]) s[i] += bs; else s[++i] = bs; + } + if ((am = am[0]) === (bm = bm[0])) { + if (s[i]) s[i] += bm; else s[++i] = bm; + } else { + s[++i] = null; + q.push({ + i: i, + x: d3_interpolateNumber(am, bm) + }); + } + bi = d3_interpolate_numberB.lastIndex; + } + if (bi < b.length) { + bs = b.slice(bi); + if (s[i]) s[i] += bs; else s[++i] = bs; + } + return s.length < 2 ? q[0] ? (b = q[0].x, function(t) { + return b(t) + ""; + }) : function() { + return b; + } : (b = q.length, function(t) { + for (var i = 0, o; i < b; ++i) s[(o = q[i]).i] = o.x(t); + return s.join(""); + }); + } + var d3_interpolate_numberA = /[-+]?(?:\d+\.?\d*|\.?\d+)(?:[eE][-+]?\d+)?/g, d3_interpolate_numberB = new RegExp(d3_interpolate_numberA.source, "g"); + d3.interpolate = d3_interpolate; + function d3_interpolate(a, b) { + var i = d3.interpolators.length, f; + while (--i >= 0 && !(f = d3.interpolators[i](a, b))) ; + return f; + } + d3.interpolators = [ function(a, b) { + var t = typeof b; + return (t === "string" ? d3_rgb_names.has(b.toLowerCase()) || /^(#|rgb\(|hsl\()/i.test(b) ? d3_interpolateRgb : d3_interpolateString : b instanceof d3_color ? d3_interpolateRgb : Array.isArray(b) ? d3_interpolateArray : t === "object" && isNaN(b) ? d3_interpolateObject : d3_interpolateNumber)(a, b); + } ]; + d3.interpolateArray = d3_interpolateArray; + function d3_interpolateArray(a, b) { + var x = [], c = [], na = a.length, nb = b.length, n0 = Math.min(a.length, b.length), i; + for (i = 0; i < n0; ++i) x.push(d3_interpolate(a[i], b[i])); + for (;i < na; ++i) c[i] = a[i]; + for (;i < nb; ++i) c[i] = b[i]; + return function(t) { + for (i = 0; i < n0; ++i) c[i] = x[i](t); + return c; + }; + } + var d3_ease_default = function() { + return d3_identity; + }; + var d3_ease = d3.map({ + linear: d3_ease_default, + poly: d3_ease_poly, + quad: function() { + return d3_ease_quad; + }, + cubic: function() { + return d3_ease_cubic; + }, + sin: function() { + return d3_ease_sin; + }, + exp: function() { + return d3_ease_exp; + }, + circle: function() { + return d3_ease_circle; + }, + elastic: d3_ease_elastic, + back: d3_ease_back, + bounce: function() { + return d3_ease_bounce; + } + }); + var d3_ease_mode = d3.map({ + "in": d3_identity, + out: d3_ease_reverse, + "in-out": d3_ease_reflect, + "out-in": function(f) { + return d3_ease_reflect(d3_ease_reverse(f)); + } + }); + d3.ease = function(name) { + var i = name.indexOf("-"), t = i >= 0 ? name.slice(0, i) : name, m = i >= 0 ? name.slice(i + 1) : "in"; + t = d3_ease.get(t) || d3_ease_default; + m = d3_ease_mode.get(m) || d3_identity; + return d3_ease_clamp(m(t.apply(null, d3_arraySlice.call(arguments, 1)))); + }; + function d3_ease_clamp(f) { + return function(t) { + return t <= 0 ? 0 : t >= 1 ? 1 : f(t); + }; + } + function d3_ease_reverse(f) { + return function(t) { + return 1 - f(1 - t); + }; + } + function d3_ease_reflect(f) { + return function(t) { + return .5 * (t < .5 ? f(2 * t) : 2 - f(2 - 2 * t)); + }; + } + function d3_ease_quad(t) { + return t * t; + } + function d3_ease_cubic(t) { + return t * t * t; + } + function d3_ease_cubicInOut(t) { + if (t <= 0) return 0; + if (t >= 1) return 1; + var t2 = t * t, t3 = t2 * t; + return 4 * (t < .5 ? t3 : 3 * (t - t2) + t3 - .75); + } + function d3_ease_poly(e) { + return function(t) { + return Math.pow(t, e); + }; + } + function d3_ease_sin(t) { + return 1 - Math.cos(t * halfπ); + } + function d3_ease_exp(t) { + return Math.pow(2, 10 * (t - 1)); + } + function d3_ease_circle(t) { + return 1 - Math.sqrt(1 - t * t); + } + function d3_ease_elastic(a, p) { + var s; + if (arguments.length < 2) p = .45; + if (arguments.length) s = p / τ * Math.asin(1 / a); else a = 1, s = p / 4; + return function(t) { + return 1 + a * Math.pow(2, -10 * t) * Math.sin((t - s) * τ / p); + }; + } + function d3_ease_back(s) { + if (!s) s = 1.70158; + return function(t) { + return t * t * ((s + 1) * t - s); + }; + } + function d3_ease_bounce(t) { + return t < 1 / 2.75 ? 7.5625 * t * t : t < 2 / 2.75 ? 7.5625 * (t -= 1.5 / 2.75) * t + .75 : t < 2.5 / 2.75 ? 7.5625 * (t -= 2.25 / 2.75) * t + .9375 : 7.5625 * (t -= 2.625 / 2.75) * t + .984375; + } + d3.interpolateHcl = d3_interpolateHcl; + function d3_interpolateHcl(a, b) { + a = d3.hcl(a); + b = d3.hcl(b); + var ah = a.h, ac = a.c, al = a.l, bh = b.h - ah, bc = b.c - ac, bl = b.l - al; + if (isNaN(bc)) bc = 0, ac = isNaN(ac) ? b.c : ac; + if (isNaN(bh)) bh = 0, ah = isNaN(ah) ? b.h : ah; else if (bh > 180) bh -= 360; else if (bh < -180) bh += 360; + return function(t) { + return d3_hcl_lab(ah + bh * t, ac + bc * t, al + bl * t) + ""; + }; + } + d3.interpolateHsl = d3_interpolateHsl; + function d3_interpolateHsl(a, b) { + a = d3.hsl(a); + b = d3.hsl(b); + var ah = a.h, as = a.s, al = a.l, bh = b.h - ah, bs = b.s - as, bl = b.l - al; + if (isNaN(bs)) bs = 0, as = isNaN(as) ? b.s : as; + if (isNaN(bh)) bh = 0, ah = isNaN(ah) ? b.h : ah; else if (bh > 180) bh -= 360; else if (bh < -180) bh += 360; + return function(t) { + return d3_hsl_rgb(ah + bh * t, as + bs * t, al + bl * t) + ""; + }; + } + d3.interpolateLab = d3_interpolateLab; + function d3_interpolateLab(a, b) { + a = d3.lab(a); + b = d3.lab(b); + var al = a.l, aa = a.a, ab = a.b, bl = b.l - al, ba = b.a - aa, bb = b.b - ab; + return function(t) { + return d3_lab_rgb(al + bl * t, aa + ba * t, ab + bb * t) + ""; + }; + } + d3.interpolateRound = d3_interpolateRound; + function d3_interpolateRound(a, b) { + b -= a; + return function(t) { + return Math.round(a + b * t); + }; + } + d3.transform = function(string) { + var g = d3_document.createElementNS(d3.ns.prefix.svg, "g"); + return (d3.transform = function(string) { + if (string != null) { + g.setAttribute("transform", string); + var t = g.transform.baseVal.consolidate(); + } + return new d3_transform(t ? t.matrix : d3_transformIdentity); + })(string); + }; + function d3_transform(m) { + var r0 = [ m.a, m.b ], r1 = [ m.c, m.d ], kx = d3_transformNormalize(r0), kz = d3_transformDot(r0, r1), ky = d3_transformNormalize(d3_transformCombine(r1, r0, -kz)) || 0; + if (r0[0] * r1[1] < r1[0] * r0[1]) { + r0[0] *= -1; + r0[1] *= -1; + kx *= -1; + kz *= -1; + } + this.rotate = (kx ? Math.atan2(r0[1], r0[0]) : Math.atan2(-r1[0], r1[1])) * d3_degrees; + this.translate = [ m.e, m.f ]; + this.scale = [ kx, ky ]; + this.skew = ky ? Math.atan2(kz, ky) * d3_degrees : 0; + } + d3_transform.prototype.toString = function() { + return "translate(" + this.translate + ")rotate(" + this.rotate + ")skewX(" + this.skew + ")scale(" + this.scale + ")"; + }; + function d3_transformDot(a, b) { + return a[0] * b[0] + a[1] * b[1]; + } + function d3_transformNormalize(a) { + var k = Math.sqrt(d3_transformDot(a, a)); + if (k) { + a[0] /= k; + a[1] /= k; + } + return k; + } + function d3_transformCombine(a, b, k) { + a[0] += k * b[0]; + a[1] += k * b[1]; + return a; + } + var d3_transformIdentity = { + a: 1, + b: 0, + c: 0, + d: 1, + e: 0, + f: 0 + }; + d3.interpolateTransform = d3_interpolateTransform; + function d3_interpolateTransformPop(s) { + return s.length ? s.pop() + "," : ""; + } + function d3_interpolateTranslate(ta, tb, s, q) { + if (ta[0] !== tb[0] || ta[1] !== tb[1]) { + var i = s.push("translate(", null, ",", null, ")"); + q.push({ + i: i - 4, + x: d3_interpolateNumber(ta[0], tb[0]) + }, { + i: i - 2, + x: d3_interpolateNumber(ta[1], tb[1]) + }); + } else if (tb[0] || tb[1]) { + s.push("translate(" + tb + ")"); + } + } + function d3_interpolateRotate(ra, rb, s, q) { + if (ra !== rb) { + if (ra - rb > 180) rb += 360; else if (rb - ra > 180) ra += 360; + q.push({ + i: s.push(d3_interpolateTransformPop(s) + "rotate(", null, ")") - 2, + x: d3_interpolateNumber(ra, rb) + }); + } else if (rb) { + s.push(d3_interpolateTransformPop(s) + "rotate(" + rb + ")"); + } + } + function d3_interpolateSkew(wa, wb, s, q) { + if (wa !== wb) { + q.push({ + i: s.push(d3_interpolateTransformPop(s) + "skewX(", null, ")") - 2, + x: d3_interpolateNumber(wa, wb) + }); + } else if (wb) { + s.push(d3_interpolateTransformPop(s) + "skewX(" + wb + ")"); + } + } + function d3_interpolateScale(ka, kb, s, q) { + if (ka[0] !== kb[0] || ka[1] !== kb[1]) { + var i = s.push(d3_interpolateTransformPop(s) + "scale(", null, ",", null, ")"); + q.push({ + i: i - 4, + x: d3_interpolateNumber(ka[0], kb[0]) + }, { + i: i - 2, + x: d3_interpolateNumber(ka[1], kb[1]) + }); + } else if (kb[0] !== 1 || kb[1] !== 1) { + s.push(d3_interpolateTransformPop(s) + "scale(" + kb + ")"); + } + } + function d3_interpolateTransform(a, b) { + var s = [], q = []; + a = d3.transform(a), b = d3.transform(b); + d3_interpolateTranslate(a.translate, b.translate, s, q); + d3_interpolateRotate(a.rotate, b.rotate, s, q); + d3_interpolateSkew(a.skew, b.skew, s, q); + d3_interpolateScale(a.scale, b.scale, s, q); + a = b = null; + return function(t) { + var i = -1, n = q.length, o; + while (++i < n) s[(o = q[i]).i] = o.x(t); + return s.join(""); + }; + } + function d3_uninterpolateNumber(a, b) { + b = (b -= a = +a) || 1 / b; + return function(x) { + return (x - a) / b; + }; + } + function d3_uninterpolateClamp(a, b) { + b = (b -= a = +a) || 1 / b; + return function(x) { + return Math.max(0, Math.min(1, (x - a) / b)); + }; + } + d3.layout = {}; + d3.layout.bundle = function() { + return function(links) { + var paths = [], i = -1, n = links.length; + while (++i < n) paths.push(d3_layout_bundlePath(links[i])); + return paths; + }; + }; + function d3_layout_bundlePath(link) { + var start = link.source, end = link.target, lca = d3_layout_bundleLeastCommonAncestor(start, end), points = [ start ]; + while (start !== lca) { + start = start.parent; + points.push(start); + } + var k = points.length; + while (end !== lca) { + points.splice(k, 0, end); + end = end.parent; + } + return points; + } + function d3_layout_bundleAncestors(node) { + var ancestors = [], parent = node.parent; + while (parent != null) { + ancestors.push(node); + node = parent; + parent = parent.parent; + } + ancestors.push(node); + return ancestors; + } + function d3_layout_bundleLeastCommonAncestor(a, b) { + if (a === b) return a; + var aNodes = d3_layout_bundleAncestors(a), bNodes = d3_layout_bundleAncestors(b), aNode = aNodes.pop(), bNode = bNodes.pop(), sharedNode = null; + while (aNode === bNode) { + sharedNode = aNode; + aNode = aNodes.pop(); + bNode = bNodes.pop(); + } + return sharedNode; + } + d3.layout.chord = function() { + var chord = {}, chords, groups, matrix, n, padding = 0, sortGroups, sortSubgroups, sortChords; + function relayout() { + var subgroups = {}, groupSums = [], groupIndex = d3.range(n), subgroupIndex = [], k, x, x0, i, j; + chords = []; + groups = []; + k = 0, i = -1; + while (++i < n) { + x = 0, j = -1; + while (++j < n) { + x += matrix[i][j]; + } + groupSums.push(x); + subgroupIndex.push(d3.range(n)); + k += x; + } + if (sortGroups) { + groupIndex.sort(function(a, b) { + return sortGroups(groupSums[a], groupSums[b]); + }); + } + if (sortSubgroups) { + subgroupIndex.forEach(function(d, i) { + d.sort(function(a, b) { + return sortSubgroups(matrix[i][a], matrix[i][b]); + }); + }); + } + k = (τ - padding * n) / k; + x = 0, i = -1; + while (++i < n) { + x0 = x, j = -1; + while (++j < n) { + var di = groupIndex[i], dj = subgroupIndex[di][j], v = matrix[di][dj], a0 = x, a1 = x += v * k; + subgroups[di + "-" + dj] = { + index: di, + subindex: dj, + startAngle: a0, + endAngle: a1, + value: v + }; + } + groups[di] = { + index: di, + startAngle: x0, + endAngle: x, + value: groupSums[di] + }; + x += padding; + } + i = -1; + while (++i < n) { + j = i - 1; + while (++j < n) { + var source = subgroups[i + "-" + j], target = subgroups[j + "-" + i]; + if (source.value || target.value) { + chords.push(source.value < target.value ? { + source: target, + target: source + } : { + source: source, + target: target + }); + } + } + } + if (sortChords) resort(); + } + function resort() { + chords.sort(function(a, b) { + return sortChords((a.source.value + a.target.value) / 2, (b.source.value + b.target.value) / 2); + }); + } + chord.matrix = function(x) { + if (!arguments.length) return matrix; + n = (matrix = x) && matrix.length; + chords = groups = null; + return chord; + }; + chord.padding = function(x) { + if (!arguments.length) return padding; + padding = x; + chords = groups = null; + return chord; + }; + chord.sortGroups = function(x) { + if (!arguments.length) return sortGroups; + sortGroups = x; + chords = groups = null; + return chord; + }; + chord.sortSubgroups = function(x) { + if (!arguments.length) return sortSubgroups; + sortSubgroups = x; + chords = null; + return chord; + }; + chord.sortChords = function(x) { + if (!arguments.length) return sortChords; + sortChords = x; + if (chords) resort(); + return chord; + }; + chord.chords = function() { + if (!chords) relayout(); + return chords; + }; + chord.groups = function() { + if (!groups) relayout(); + return groups; + }; + return chord; + }; + d3.layout.force = function() { + var force = {}, event = d3.dispatch("start", "tick", "end"), timer, size = [ 1, 1 ], drag, alpha, friction = .9, linkDistance = d3_layout_forceLinkDistance, linkStrength = d3_layout_forceLinkStrength, charge = -30, chargeDistance2 = d3_layout_forceChargeDistance2, gravity = .1, theta2 = .64, nodes = [], links = [], distances, strengths, charges; + function repulse(node) { + return function(quad, x1, _, x2) { + if (quad.point !== node) { + var dx = quad.cx - node.x, dy = quad.cy - node.y, dw = x2 - x1, dn = dx * dx + dy * dy; + if (dw * dw / theta2 < dn) { + if (dn < chargeDistance2) { + var k = quad.charge / dn; + node.px -= dx * k; + node.py -= dy * k; + } + return true; + } + if (quad.point && dn && dn < chargeDistance2) { + var k = quad.pointCharge / dn; + node.px -= dx * k; + node.py -= dy * k; + } + } + return !quad.charge; + }; + } + force.tick = function() { + if ((alpha *= .99) < .005) { + timer = null; + event.end({ + type: "end", + alpha: alpha = 0 + }); + return true; + } + var n = nodes.length, m = links.length, q, i, o, s, t, l, k, x, y; + for (i = 0; i < m; ++i) { + o = links[i]; + s = o.source; + t = o.target; + x = t.x - s.x; + y = t.y - s.y; + if (l = x * x + y * y) { + l = alpha * strengths[i] * ((l = Math.sqrt(l)) - distances[i]) / l; + x *= l; + y *= l; + t.x -= x * (k = s.weight + t.weight ? s.weight / (s.weight + t.weight) : .5); + t.y -= y * k; + s.x += x * (k = 1 - k); + s.y += y * k; + } + } + if (k = alpha * gravity) { + x = size[0] / 2; + y = size[1] / 2; + i = -1; + if (k) while (++i < n) { + o = nodes[i]; + o.x += (x - o.x) * k; + o.y += (y - o.y) * k; + } + } + if (charge) { + d3_layout_forceAccumulate(q = d3.geom.quadtree(nodes), alpha, charges); + i = -1; + while (++i < n) { + if (!(o = nodes[i]).fixed) { + q.visit(repulse(o)); + } + } + } + i = -1; + while (++i < n) { + o = nodes[i]; + if (o.fixed) { + o.x = o.px; + o.y = o.py; + } else { + o.x -= (o.px - (o.px = o.x)) * friction; + o.y -= (o.py - (o.py = o.y)) * friction; + } + } + event.tick({ + type: "tick", + alpha: alpha + }); + }; + force.nodes = function(x) { + if (!arguments.length) return nodes; + nodes = x; + return force; + }; + force.links = function(x) { + if (!arguments.length) return links; + links = x; + return force; + }; + force.size = function(x) { + if (!arguments.length) return size; + size = x; + return force; + }; + force.linkDistance = function(x) { + if (!arguments.length) return linkDistance; + linkDistance = typeof x === "function" ? x : +x; + return force; + }; + force.distance = force.linkDistance; + force.linkStrength = function(x) { + if (!arguments.length) return linkStrength; + linkStrength = typeof x === "function" ? x : +x; + return force; + }; + force.friction = function(x) { + if (!arguments.length) return friction; + friction = +x; + return force; + }; + force.charge = function(x) { + if (!arguments.length) return charge; + charge = typeof x === "function" ? x : +x; + return force; + }; + force.chargeDistance = function(x) { + if (!arguments.length) return Math.sqrt(chargeDistance2); + chargeDistance2 = x * x; + return force; + }; + force.gravity = function(x) { + if (!arguments.length) return gravity; + gravity = +x; + return force; + }; + force.theta = function(x) { + if (!arguments.length) return Math.sqrt(theta2); + theta2 = x * x; + return force; + }; + force.alpha = function(x) { + if (!arguments.length) return alpha; + x = +x; + if (alpha) { + if (x > 0) { + alpha = x; + } else { + timer.c = null, timer.t = NaN, timer = null; + event.end({ + type: "end", + alpha: alpha = 0 + }); + } + } else if (x > 0) { + event.start({ + type: "start", + alpha: alpha = x + }); + timer = d3_timer(force.tick); + } + return force; + }; + force.start = function() { + var i, n = nodes.length, m = links.length, w = size[0], h = size[1], neighbors, o; + for (i = 0; i < n; ++i) { + (o = nodes[i]).index = i; + o.weight = 0; + } + for (i = 0; i < m; ++i) { + o = links[i]; + if (typeof o.source == "number") o.source = nodes[o.source]; + if (typeof o.target == "number") o.target = nodes[o.target]; + ++o.source.weight; + ++o.target.weight; + } + for (i = 0; i < n; ++i) { + o = nodes[i]; + if (isNaN(o.x)) o.x = position("x", w); + if (isNaN(o.y)) o.y = position("y", h); + if (isNaN(o.px)) o.px = o.x; + if (isNaN(o.py)) o.py = o.y; + } + distances = []; + if (typeof linkDistance === "function") for (i = 0; i < m; ++i) distances[i] = +linkDistance.call(this, links[i], i); else for (i = 0; i < m; ++i) distances[i] = linkDistance; + strengths = []; + if (typeof linkStrength === "function") for (i = 0; i < m; ++i) strengths[i] = +linkStrength.call(this, links[i], i); else for (i = 0; i < m; ++i) strengths[i] = linkStrength; + charges = []; + if (typeof charge === "function") for (i = 0; i < n; ++i) charges[i] = +charge.call(this, nodes[i], i); else for (i = 0; i < n; ++i) charges[i] = charge; + function position(dimension, size) { + if (!neighbors) { + neighbors = new Array(n); + for (j = 0; j < n; ++j) { + neighbors[j] = []; + } + for (j = 0; j < m; ++j) { + var o = links[j]; + neighbors[o.source.index].push(o.target); + neighbors[o.target.index].push(o.source); + } + } + var candidates = neighbors[i], j = -1, l = candidates.length, x; + while (++j < l) if (!isNaN(x = candidates[j][dimension])) return x; + return Math.random() * size; + } + return force.resume(); + }; + force.resume = function() { + return force.alpha(.1); + }; + force.stop = function() { + return force.alpha(0); + }; + force.drag = function() { + if (!drag) drag = d3.behavior.drag().origin(d3_identity).on("dragstart.force", d3_layout_forceDragstart).on("drag.force", dragmove).on("dragend.force", d3_layout_forceDragend); + if (!arguments.length) return drag; + this.on("mouseover.force", d3_layout_forceMouseover).on("mouseout.force", d3_layout_forceMouseout).call(drag); + }; + function dragmove(d) { + d.px = d3.event.x, d.py = d3.event.y; + force.resume(); + } + return d3.rebind(force, event, "on"); + }; + function d3_layout_forceDragstart(d) { + d.fixed |= 2; + } + function d3_layout_forceDragend(d) { + d.fixed &= ~6; + } + function d3_layout_forceMouseover(d) { + d.fixed |= 4; + d.px = d.x, d.py = d.y; + } + function d3_layout_forceMouseout(d) { + d.fixed &= ~4; + } + function d3_layout_forceAccumulate(quad, alpha, charges) { + var cx = 0, cy = 0; + quad.charge = 0; + if (!quad.leaf) { + var nodes = quad.nodes, n = nodes.length, i = -1, c; + while (++i < n) { + c = nodes[i]; + if (c == null) continue; + d3_layout_forceAccumulate(c, alpha, charges); + quad.charge += c.charge; + cx += c.charge * c.cx; + cy += c.charge * c.cy; + } + } + if (quad.point) { + if (!quad.leaf) { + quad.point.x += Math.random() - .5; + quad.point.y += Math.random() - .5; + } + var k = alpha * charges[quad.point.index]; + quad.charge += quad.pointCharge = k; + cx += k * quad.point.x; + cy += k * quad.point.y; + } + quad.cx = cx / quad.charge; + quad.cy = cy / quad.charge; + } + var d3_layout_forceLinkDistance = 20, d3_layout_forceLinkStrength = 1, d3_layout_forceChargeDistance2 = Infinity; + d3.layout.hierarchy = function() { + var sort = d3_layout_hierarchySort, children = d3_layout_hierarchyChildren, value = d3_layout_hierarchyValue; + function hierarchy(root) { + var stack = [ root ], nodes = [], node; + root.depth = 0; + while ((node = stack.pop()) != null) { + nodes.push(node); + if ((childs = children.call(hierarchy, node, node.depth)) && (n = childs.length)) { + var n, childs, child; + while (--n >= 0) { + stack.push(child = childs[n]); + child.parent = node; + child.depth = node.depth + 1; + } + if (value) node.value = 0; + node.children = childs; + } else { + if (value) node.value = +value.call(hierarchy, node, node.depth) || 0; + delete node.children; + } + } + d3_layout_hierarchyVisitAfter(root, function(node) { + var childs, parent; + if (sort && (childs = node.children)) childs.sort(sort); + if (value && (parent = node.parent)) parent.value += node.value; + }); + return nodes; + } + hierarchy.sort = function(x) { + if (!arguments.length) return sort; + sort = x; + return hierarchy; + }; + hierarchy.children = function(x) { + if (!arguments.length) return children; + children = x; + return hierarchy; + }; + hierarchy.value = function(x) { + if (!arguments.length) return value; + value = x; + return hierarchy; + }; + hierarchy.revalue = function(root) { + if (value) { + d3_layout_hierarchyVisitBefore(root, function(node) { + if (node.children) node.value = 0; + }); + d3_layout_hierarchyVisitAfter(root, function(node) { + var parent; + if (!node.children) node.value = +value.call(hierarchy, node, node.depth) || 0; + if (parent = node.parent) parent.value += node.value; + }); + } + return root; + }; + return hierarchy; + }; + function d3_layout_hierarchyRebind(object, hierarchy) { + d3.rebind(object, hierarchy, "sort", "children", "value"); + object.nodes = object; + object.links = d3_layout_hierarchyLinks; + return object; + } + function d3_layout_hierarchyVisitBefore(node, callback) { + var nodes = [ node ]; + while ((node = nodes.pop()) != null) { + callback(node); + if ((children = node.children) && (n = children.length)) { + var n, children; + while (--n >= 0) nodes.push(children[n]); + } + } + } + function d3_layout_hierarchyVisitAfter(node, callback) { + var nodes = [ node ], nodes2 = []; + while ((node = nodes.pop()) != null) { + nodes2.push(node); + if ((children = node.children) && (n = children.length)) { + var i = -1, n, children; + while (++i < n) nodes.push(children[i]); + } + } + while ((node = nodes2.pop()) != null) { + callback(node); + } + } + function d3_layout_hierarchyChildren(d) { + return d.children; + } + function d3_layout_hierarchyValue(d) { + return d.value; + } + function d3_layout_hierarchySort(a, b) { + return b.value - a.value; + } + function d3_layout_hierarchyLinks(nodes) { + return d3.merge(nodes.map(function(parent) { + return (parent.children || []).map(function(child) { + return { + source: parent, + target: child + }; + }); + })); + } + d3.layout.partition = function() { + var hierarchy = d3.layout.hierarchy(), size = [ 1, 1 ]; + function position(node, x, dx, dy) { + var children = node.children; + node.x = x; + node.y = node.depth * dy; + node.dx = dx; + node.dy = dy; + if (children && (n = children.length)) { + var i = -1, n, c, d; + dx = node.value ? dx / node.value : 0; + while (++i < n) { + position(c = children[i], x, d = c.value * dx, dy); + x += d; + } + } + } + function depth(node) { + var children = node.children, d = 0; + if (children && (n = children.length)) { + var i = -1, n; + while (++i < n) d = Math.max(d, depth(children[i])); + } + return 1 + d; + } + function partition(d, i) { + var nodes = hierarchy.call(this, d, i); + position(nodes[0], 0, size[0], size[1] / depth(nodes[0])); + return nodes; + } + partition.size = function(x) { + if (!arguments.length) return size; + size = x; + return partition; + }; + return d3_layout_hierarchyRebind(partition, hierarchy); + }; + d3.layout.pie = function() { + var value = Number, sort = d3_layout_pieSortByValue, startAngle = 0, endAngle = τ, padAngle = 0; + function pie(data) { + var n = data.length, values = data.map(function(d, i) { + return +value.call(pie, d, i); + }), a = +(typeof startAngle === "function" ? startAngle.apply(this, arguments) : startAngle), da = (typeof endAngle === "function" ? endAngle.apply(this, arguments) : endAngle) - a, p = Math.min(Math.abs(da) / n, +(typeof padAngle === "function" ? padAngle.apply(this, arguments) : padAngle)), pa = p * (da < 0 ? -1 : 1), sum = d3.sum(values), k = sum ? (da - n * pa) / sum : 0, index = d3.range(n), arcs = [], v; + if (sort != null) index.sort(sort === d3_layout_pieSortByValue ? function(i, j) { + return values[j] - values[i]; + } : function(i, j) { + return sort(data[i], data[j]); + }); + index.forEach(function(i) { + arcs[i] = { + data: data[i], + value: v = values[i], + startAngle: a, + endAngle: a += v * k + pa, + padAngle: p + }; + }); + return arcs; + } + pie.value = function(_) { + if (!arguments.length) return value; + value = _; + return pie; + }; + pie.sort = function(_) { + if (!arguments.length) return sort; + sort = _; + return pie; + }; + pie.startAngle = function(_) { + if (!arguments.length) return startAngle; + startAngle = _; + return pie; + }; + pie.endAngle = function(_) { + if (!arguments.length) return endAngle; + endAngle = _; + return pie; + }; + pie.padAngle = function(_) { + if (!arguments.length) return padAngle; + padAngle = _; + return pie; + }; + return pie; + }; + var d3_layout_pieSortByValue = {}; + d3.layout.stack = function() { + var values = d3_identity, order = d3_layout_stackOrderDefault, offset = d3_layout_stackOffsetZero, out = d3_layout_stackOut, x = d3_layout_stackX, y = d3_layout_stackY; + function stack(data, index) { + if (!(n = data.length)) return data; + var series = data.map(function(d, i) { + return values.call(stack, d, i); + }); + var points = series.map(function(d) { + return d.map(function(v, i) { + return [ x.call(stack, v, i), y.call(stack, v, i) ]; + }); + }); + var orders = order.call(stack, points, index); + series = d3.permute(series, orders); + points = d3.permute(points, orders); + var offsets = offset.call(stack, points, index); + var m = series[0].length, n, i, j, o; + for (j = 0; j < m; ++j) { + out.call(stack, series[0][j], o = offsets[j], points[0][j][1]); + for (i = 1; i < n; ++i) { + out.call(stack, series[i][j], o += points[i - 1][j][1], points[i][j][1]); + } + } + return data; + } + stack.values = function(x) { + if (!arguments.length) return values; + values = x; + return stack; + }; + stack.order = function(x) { + if (!arguments.length) return order; + order = typeof x === "function" ? x : d3_layout_stackOrders.get(x) || d3_layout_stackOrderDefault; + return stack; + }; + stack.offset = function(x) { + if (!arguments.length) return offset; + offset = typeof x === "function" ? x : d3_layout_stackOffsets.get(x) || d3_layout_stackOffsetZero; + return stack; + }; + stack.x = function(z) { + if (!arguments.length) return x; + x = z; + return stack; + }; + stack.y = function(z) { + if (!arguments.length) return y; + y = z; + return stack; + }; + stack.out = function(z) { + if (!arguments.length) return out; + out = z; + return stack; + }; + return stack; + }; + function d3_layout_stackX(d) { + return d.x; + } + function d3_layout_stackY(d) { + return d.y; + } + function d3_layout_stackOut(d, y0, y) { + d.y0 = y0; + d.y = y; + } + var d3_layout_stackOrders = d3.map({ + "inside-out": function(data) { + var n = data.length, i, j, max = data.map(d3_layout_stackMaxIndex), sums = data.map(d3_layout_stackReduceSum), index = d3.range(n).sort(function(a, b) { + return max[a] - max[b]; + }), top = 0, bottom = 0, tops = [], bottoms = []; + for (i = 0; i < n; ++i) { + j = index[i]; + if (top < bottom) { + top += sums[j]; + tops.push(j); + } else { + bottom += sums[j]; + bottoms.push(j); + } + } + return bottoms.reverse().concat(tops); + }, + reverse: function(data) { + return d3.range(data.length).reverse(); + }, + "default": d3_layout_stackOrderDefault + }); + var d3_layout_stackOffsets = d3.map({ + silhouette: function(data) { + var n = data.length, m = data[0].length, sums = [], max = 0, i, j, o, y0 = []; + for (j = 0; j < m; ++j) { + for (i = 0, o = 0; i < n; i++) o += data[i][j][1]; + if (o > max) max = o; + sums.push(o); + } + for (j = 0; j < m; ++j) { + y0[j] = (max - sums[j]) / 2; + } + return y0; + }, + wiggle: function(data) { + var n = data.length, x = data[0], m = x.length, i, j, k, s1, s2, s3, dx, o, o0, y0 = []; + y0[0] = o = o0 = 0; + for (j = 1; j < m; ++j) { + for (i = 0, s1 = 0; i < n; ++i) s1 += data[i][j][1]; + for (i = 0, s2 = 0, dx = x[j][0] - x[j - 1][0]; i < n; ++i) { + for (k = 0, s3 = (data[i][j][1] - data[i][j - 1][1]) / (2 * dx); k < i; ++k) { + s3 += (data[k][j][1] - data[k][j - 1][1]) / dx; + } + s2 += s3 * data[i][j][1]; + } + y0[j] = o -= s1 ? s2 / s1 * dx : 0; + if (o < o0) o0 = o; + } + for (j = 0; j < m; ++j) y0[j] -= o0; + return y0; + }, + expand: function(data) { + var n = data.length, m = data[0].length, k = 1 / n, i, j, o, y0 = []; + for (j = 0; j < m; ++j) { + for (i = 0, o = 0; i < n; i++) o += data[i][j][1]; + if (o) for (i = 0; i < n; i++) data[i][j][1] /= o; else for (i = 0; i < n; i++) data[i][j][1] = k; + } + for (j = 0; j < m; ++j) y0[j] = 0; + return y0; + }, + zero: d3_layout_stackOffsetZero + }); + function d3_layout_stackOrderDefault(data) { + return d3.range(data.length); + } + function d3_layout_stackOffsetZero(data) { + var j = -1, m = data[0].length, y0 = []; + while (++j < m) y0[j] = 0; + return y0; + } + function d3_layout_stackMaxIndex(array) { + var i = 1, j = 0, v = array[0][1], k, n = array.length; + for (;i < n; ++i) { + if ((k = array[i][1]) > v) { + j = i; + v = k; + } + } + return j; + } + function d3_layout_stackReduceSum(d) { + return d.reduce(d3_layout_stackSum, 0); + } + function d3_layout_stackSum(p, d) { + return p + d[1]; + } + d3.layout.histogram = function() { + var frequency = true, valuer = Number, ranger = d3_layout_histogramRange, binner = d3_layout_histogramBinSturges; + function histogram(data, i) { + var bins = [], values = data.map(valuer, this), range = ranger.call(this, values, i), thresholds = binner.call(this, range, values, i), bin, i = -1, n = values.length, m = thresholds.length - 1, k = frequency ? 1 : 1 / n, x; + while (++i < m) { + bin = bins[i] = []; + bin.dx = thresholds[i + 1] - (bin.x = thresholds[i]); + bin.y = 0; + } + if (m > 0) { + i = -1; + while (++i < n) { + x = values[i]; + if (x >= range[0] && x <= range[1]) { + bin = bins[d3.bisect(thresholds, x, 1, m) - 1]; + bin.y += k; + bin.push(data[i]); + } + } + } + return bins; + } + histogram.value = function(x) { + if (!arguments.length) return valuer; + valuer = x; + return histogram; + }; + histogram.range = function(x) { + if (!arguments.length) return ranger; + ranger = d3_functor(x); + return histogram; + }; + histogram.bins = function(x) { + if (!arguments.length) return binner; + binner = typeof x === "number" ? function(range) { + return d3_layout_histogramBinFixed(range, x); + } : d3_functor(x); + return histogram; + }; + histogram.frequency = function(x) { + if (!arguments.length) return frequency; + frequency = !!x; + return histogram; + }; + return histogram; + }; + function d3_layout_histogramBinSturges(range, values) { + return d3_layout_histogramBinFixed(range, Math.ceil(Math.log(values.length) / Math.LN2 + 1)); + } + function d3_layout_histogramBinFixed(range, n) { + var x = -1, b = +range[0], m = (range[1] - b) / n, f = []; + while (++x <= n) f[x] = m * x + b; + return f; + } + function d3_layout_histogramRange(values) { + return [ d3.min(values), d3.max(values) ]; + } + d3.layout.pack = function() { + var hierarchy = d3.layout.hierarchy().sort(d3_layout_packSort), padding = 0, size = [ 1, 1 ], radius; + function pack(d, i) { + var nodes = hierarchy.call(this, d, i), root = nodes[0], w = size[0], h = size[1], r = radius == null ? Math.sqrt : typeof radius === "function" ? radius : function() { + return radius; + }; + root.x = root.y = 0; + d3_layout_hierarchyVisitAfter(root, function(d) { + d.r = +r(d.value); + }); + d3_layout_hierarchyVisitAfter(root, d3_layout_packSiblings); + if (padding) { + var dr = padding * (radius ? 1 : Math.max(2 * root.r / w, 2 * root.r / h)) / 2; + d3_layout_hierarchyVisitAfter(root, function(d) { + d.r += dr; + }); + d3_layout_hierarchyVisitAfter(root, d3_layout_packSiblings); + d3_layout_hierarchyVisitAfter(root, function(d) { + d.r -= dr; + }); + } + d3_layout_packTransform(root, w / 2, h / 2, radius ? 1 : 1 / Math.max(2 * root.r / w, 2 * root.r / h)); + return nodes; + } + pack.size = function(_) { + if (!arguments.length) return size; + size = _; + return pack; + }; + pack.radius = function(_) { + if (!arguments.length) return radius; + radius = _ == null || typeof _ === "function" ? _ : +_; + return pack; + }; + pack.padding = function(_) { + if (!arguments.length) return padding; + padding = +_; + return pack; + }; + return d3_layout_hierarchyRebind(pack, hierarchy); + }; + function d3_layout_packSort(a, b) { + return a.value - b.value; + } + function d3_layout_packInsert(a, b) { + var c = a._pack_next; + a._pack_next = b; + b._pack_prev = a; + b._pack_next = c; + c._pack_prev = b; + } + function d3_layout_packSplice(a, b) { + a._pack_next = b; + b._pack_prev = a; + } + function d3_layout_packIntersects(a, b) { + var dx = b.x - a.x, dy = b.y - a.y, dr = a.r + b.r; + return .999 * dr * dr > dx * dx + dy * dy; + } + function d3_layout_packSiblings(node) { + if (!(nodes = node.children) || !(n = nodes.length)) return; + var nodes, xMin = Infinity, xMax = -Infinity, yMin = Infinity, yMax = -Infinity, a, b, c, i, j, k, n; + function bound(node) { + xMin = Math.min(node.x - node.r, xMin); + xMax = Math.max(node.x + node.r, xMax); + yMin = Math.min(node.y - node.r, yMin); + yMax = Math.max(node.y + node.r, yMax); + } + nodes.forEach(d3_layout_packLink); + a = nodes[0]; + a.x = -a.r; + a.y = 0; + bound(a); + if (n > 1) { + b = nodes[1]; + b.x = b.r; + b.y = 0; + bound(b); + if (n > 2) { + c = nodes[2]; + d3_layout_packPlace(a, b, c); + bound(c); + d3_layout_packInsert(a, c); + a._pack_prev = c; + d3_layout_packInsert(c, b); + b = a._pack_next; + for (i = 3; i < n; i++) { + d3_layout_packPlace(a, b, c = nodes[i]); + var isect = 0, s1 = 1, s2 = 1; + for (j = b._pack_next; j !== b; j = j._pack_next, s1++) { + if (d3_layout_packIntersects(j, c)) { + isect = 1; + break; + } + } + if (isect == 1) { + for (k = a._pack_prev; k !== j._pack_prev; k = k._pack_prev, s2++) { + if (d3_layout_packIntersects(k, c)) { + break; + } + } + } + if (isect) { + if (s1 < s2 || s1 == s2 && b.r < a.r) d3_layout_packSplice(a, b = j); else d3_layout_packSplice(a = k, b); + i--; + } else { + d3_layout_packInsert(a, c); + b = c; + bound(c); + } + } + } + } + var cx = (xMin + xMax) / 2, cy = (yMin + yMax) / 2, cr = 0; + for (i = 0; i < n; i++) { + c = nodes[i]; + c.x -= cx; + c.y -= cy; + cr = Math.max(cr, c.r + Math.sqrt(c.x * c.x + c.y * c.y)); + } + node.r = cr; + nodes.forEach(d3_layout_packUnlink); + } + function d3_layout_packLink(node) { + node._pack_next = node._pack_prev = node; + } + function d3_layout_packUnlink(node) { + delete node._pack_next; + delete node._pack_prev; + } + function d3_layout_packTransform(node, x, y, k) { + var children = node.children; + node.x = x += k * node.x; + node.y = y += k * node.y; + node.r *= k; + if (children) { + var i = -1, n = children.length; + while (++i < n) d3_layout_packTransform(children[i], x, y, k); + } + } + function d3_layout_packPlace(a, b, c) { + var db = a.r + c.r, dx = b.x - a.x, dy = b.y - a.y; + if (db && (dx || dy)) { + var da = b.r + c.r, dc = dx * dx + dy * dy; + da *= da; + db *= db; + var x = .5 + (db - da) / (2 * dc), y = Math.sqrt(Math.max(0, 2 * da * (db + dc) - (db -= dc) * db - da * da)) / (2 * dc); + c.x = a.x + x * dx + y * dy; + c.y = a.y + x * dy - y * dx; + } else { + c.x = a.x + db; + c.y = a.y; + } + } + d3.layout.tree = function() { + var hierarchy = d3.layout.hierarchy().sort(null).value(null), separation = d3_layout_treeSeparation, size = [ 1, 1 ], nodeSize = null; + function tree(d, i) { + var nodes = hierarchy.call(this, d, i), root0 = nodes[0], root1 = wrapTree(root0); + d3_layout_hierarchyVisitAfter(root1, firstWalk), root1.parent.m = -root1.z; + d3_layout_hierarchyVisitBefore(root1, secondWalk); + if (nodeSize) d3_layout_hierarchyVisitBefore(root0, sizeNode); else { + var left = root0, right = root0, bottom = root0; + d3_layout_hierarchyVisitBefore(root0, function(node) { + if (node.x < left.x) left = node; + if (node.x > right.x) right = node; + if (node.depth > bottom.depth) bottom = node; + }); + var tx = separation(left, right) / 2 - left.x, kx = size[0] / (right.x + separation(right, left) / 2 + tx), ky = size[1] / (bottom.depth || 1); + d3_layout_hierarchyVisitBefore(root0, function(node) { + node.x = (node.x + tx) * kx; + node.y = node.depth * ky; + }); + } + return nodes; + } + function wrapTree(root0) { + var root1 = { + A: null, + children: [ root0 ] + }, queue = [ root1 ], node1; + while ((node1 = queue.pop()) != null) { + for (var children = node1.children, child, i = 0, n = children.length; i < n; ++i) { + queue.push((children[i] = child = { + _: children[i], + parent: node1, + children: (child = children[i].children) && child.slice() || [], + A: null, + a: null, + z: 0, + m: 0, + c: 0, + s: 0, + t: null, + i: i + }).a = child); + } + } + return root1.children[0]; + } + function firstWalk(v) { + var children = v.children, siblings = v.parent.children, w = v.i ? siblings[v.i - 1] : null; + if (children.length) { + d3_layout_treeShift(v); + var midpoint = (children[0].z + children[children.length - 1].z) / 2; + if (w) { + v.z = w.z + separation(v._, w._); + v.m = v.z - midpoint; + } else { + v.z = midpoint; + } + } else if (w) { + v.z = w.z + separation(v._, w._); + } + v.parent.A = apportion(v, w, v.parent.A || siblings[0]); + } + function secondWalk(v) { + v._.x = v.z + v.parent.m; + v.m += v.parent.m; + } + function apportion(v, w, ancestor) { + if (w) { + var vip = v, vop = v, vim = w, vom = vip.parent.children[0], sip = vip.m, sop = vop.m, sim = vim.m, som = vom.m, shift; + while (vim = d3_layout_treeRight(vim), vip = d3_layout_treeLeft(vip), vim && vip) { + vom = d3_layout_treeLeft(vom); + vop = d3_layout_treeRight(vop); + vop.a = v; + shift = vim.z + sim - vip.z - sip + separation(vim._, vip._); + if (shift > 0) { + d3_layout_treeMove(d3_layout_treeAncestor(vim, v, ancestor), v, shift); + sip += shift; + sop += shift; + } + sim += vim.m; + sip += vip.m; + som += vom.m; + sop += vop.m; + } + if (vim && !d3_layout_treeRight(vop)) { + vop.t = vim; + vop.m += sim - sop; + } + if (vip && !d3_layout_treeLeft(vom)) { + vom.t = vip; + vom.m += sip - som; + ancestor = v; + } + } + return ancestor; + } + function sizeNode(node) { + node.x *= size[0]; + node.y = node.depth * size[1]; + } + tree.separation = function(x) { + if (!arguments.length) return separation; + separation = x; + return tree; + }; + tree.size = function(x) { + if (!arguments.length) return nodeSize ? null : size; + nodeSize = (size = x) == null ? sizeNode : null; + return tree; + }; + tree.nodeSize = function(x) { + if (!arguments.length) return nodeSize ? size : null; + nodeSize = (size = x) == null ? null : sizeNode; + return tree; + }; + return d3_layout_hierarchyRebind(tree, hierarchy); + }; + function d3_layout_treeSeparation(a, b) { + return a.parent == b.parent ? 1 : 2; + } + function d3_layout_treeLeft(v) { + var children = v.children; + return children.length ? children[0] : v.t; + } + function d3_layout_treeRight(v) { + var children = v.children, n; + return (n = children.length) ? children[n - 1] : v.t; + } + function d3_layout_treeMove(wm, wp, shift) { + var change = shift / (wp.i - wm.i); + wp.c -= change; + wp.s += shift; + wm.c += change; + wp.z += shift; + wp.m += shift; + } + function d3_layout_treeShift(v) { + var shift = 0, change = 0, children = v.children, i = children.length, w; + while (--i >= 0) { + w = children[i]; + w.z += shift; + w.m += shift; + shift += w.s + (change += w.c); + } + } + function d3_layout_treeAncestor(vim, v, ancestor) { + return vim.a.parent === v.parent ? vim.a : ancestor; + } + d3.layout.cluster = function() { + var hierarchy = d3.layout.hierarchy().sort(null).value(null), separation = d3_layout_treeSeparation, size = [ 1, 1 ], nodeSize = false; + function cluster(d, i) { + var nodes = hierarchy.call(this, d, i), root = nodes[0], previousNode, x = 0; + d3_layout_hierarchyVisitAfter(root, function(node) { + var children = node.children; + if (children && children.length) { + node.x = d3_layout_clusterX(children); + node.y = d3_layout_clusterY(children); + } else { + node.x = previousNode ? x += separation(node, previousNode) : 0; + node.y = 0; + previousNode = node; + } + }); + var left = d3_layout_clusterLeft(root), right = d3_layout_clusterRight(root), x0 = left.x - separation(left, right) / 2, x1 = right.x + separation(right, left) / 2; + d3_layout_hierarchyVisitAfter(root, nodeSize ? function(node) { + node.x = (node.x - root.x) * size[0]; + node.y = (root.y - node.y) * size[1]; + } : function(node) { + node.x = (node.x - x0) / (x1 - x0) * size[0]; + node.y = (1 - (root.y ? node.y / root.y : 1)) * size[1]; + }); + return nodes; + } + cluster.separation = function(x) { + if (!arguments.length) return separation; + separation = x; + return cluster; + }; + cluster.size = function(x) { + if (!arguments.length) return nodeSize ? null : size; + nodeSize = (size = x) == null; + return cluster; + }; + cluster.nodeSize = function(x) { + if (!arguments.length) return nodeSize ? size : null; + nodeSize = (size = x) != null; + return cluster; + }; + return d3_layout_hierarchyRebind(cluster, hierarchy); + }; + function d3_layout_clusterY(children) { + return 1 + d3.max(children, function(child) { + return child.y; + }); + } + function d3_layout_clusterX(children) { + return children.reduce(function(x, child) { + return x + child.x; + }, 0) / children.length; + } + function d3_layout_clusterLeft(node) { + var children = node.children; + return children && children.length ? d3_layout_clusterLeft(children[0]) : node; + } + function d3_layout_clusterRight(node) { + var children = node.children, n; + return children && (n = children.length) ? d3_layout_clusterRight(children[n - 1]) : node; + } + d3.layout.treemap = function() { + var hierarchy = d3.layout.hierarchy(), round = Math.round, size = [ 1, 1 ], padding = null, pad = d3_layout_treemapPadNull, sticky = false, stickies, mode = "squarify", ratio = .5 * (1 + Math.sqrt(5)); + function scale(children, k) { + var i = -1, n = children.length, child, area; + while (++i < n) { + area = (child = children[i]).value * (k < 0 ? 0 : k); + child.area = isNaN(area) || area <= 0 ? 0 : area; + } + } + function squarify(node) { + var children = node.children; + if (children && children.length) { + var rect = pad(node), row = [], remaining = children.slice(), child, best = Infinity, score, u = mode === "slice" ? rect.dx : mode === "dice" ? rect.dy : mode === "slice-dice" ? node.depth & 1 ? rect.dy : rect.dx : Math.min(rect.dx, rect.dy), n; + scale(remaining, rect.dx * rect.dy / node.value); + row.area = 0; + while ((n = remaining.length) > 0) { + row.push(child = remaining[n - 1]); + row.area += child.area; + if (mode !== "squarify" || (score = worst(row, u)) <= best) { + remaining.pop(); + best = score; + } else { + row.area -= row.pop().area; + position(row, u, rect, false); + u = Math.min(rect.dx, rect.dy); + row.length = row.area = 0; + best = Infinity; + } + } + if (row.length) { + position(row, u, rect, true); + row.length = row.area = 0; + } + children.forEach(squarify); + } + } + function stickify(node) { + var children = node.children; + if (children && children.length) { + var rect = pad(node), remaining = children.slice(), child, row = []; + scale(remaining, rect.dx * rect.dy / node.value); + row.area = 0; + while (child = remaining.pop()) { + row.push(child); + row.area += child.area; + if (child.z != null) { + position(row, child.z ? rect.dx : rect.dy, rect, !remaining.length); + row.length = row.area = 0; + } + } + children.forEach(stickify); + } + } + function worst(row, u) { + var s = row.area, r, rmax = 0, rmin = Infinity, i = -1, n = row.length; + while (++i < n) { + if (!(r = row[i].area)) continue; + if (r < rmin) rmin = r; + if (r > rmax) rmax = r; + } + s *= s; + u *= u; + return s ? Math.max(u * rmax * ratio / s, s / (u * rmin * ratio)) : Infinity; + } + function position(row, u, rect, flush) { + var i = -1, n = row.length, x = rect.x, y = rect.y, v = u ? round(row.area / u) : 0, o; + if (u == rect.dx) { + if (flush || v > rect.dy) v = rect.dy; + while (++i < n) { + o = row[i]; + o.x = x; + o.y = y; + o.dy = v; + x += o.dx = Math.min(rect.x + rect.dx - x, v ? round(o.area / v) : 0); + } + o.z = true; + o.dx += rect.x + rect.dx - x; + rect.y += v; + rect.dy -= v; + } else { + if (flush || v > rect.dx) v = rect.dx; + while (++i < n) { + o = row[i]; + o.x = x; + o.y = y; + o.dx = v; + y += o.dy = Math.min(rect.y + rect.dy - y, v ? round(o.area / v) : 0); + } + o.z = false; + o.dy += rect.y + rect.dy - y; + rect.x += v; + rect.dx -= v; + } + } + function treemap(d) { + var nodes = stickies || hierarchy(d), root = nodes[0]; + root.x = root.y = 0; + if (root.value) root.dx = size[0], root.dy = size[1]; else root.dx = root.dy = 0; + if (stickies) hierarchy.revalue(root); + scale([ root ], root.dx * root.dy / root.value); + (stickies ? stickify : squarify)(root); + if (sticky) stickies = nodes; + return nodes; + } + treemap.size = function(x) { + if (!arguments.length) return size; + size = x; + return treemap; + }; + treemap.padding = function(x) { + if (!arguments.length) return padding; + function padFunction(node) { + var p = x.call(treemap, node, node.depth); + return p == null ? d3_layout_treemapPadNull(node) : d3_layout_treemapPad(node, typeof p === "number" ? [ p, p, p, p ] : p); + } + function padConstant(node) { + return d3_layout_treemapPad(node, x); + } + var type; + pad = (padding = x) == null ? d3_layout_treemapPadNull : (type = typeof x) === "function" ? padFunction : type === "number" ? (x = [ x, x, x, x ], + padConstant) : padConstant; + return treemap; + }; + treemap.round = function(x) { + if (!arguments.length) return round != Number; + round = x ? Math.round : Number; + return treemap; + }; + treemap.sticky = function(x) { + if (!arguments.length) return sticky; + sticky = x; + stickies = null; + return treemap; + }; + treemap.ratio = function(x) { + if (!arguments.length) return ratio; + ratio = x; + return treemap; + }; + treemap.mode = function(x) { + if (!arguments.length) return mode; + mode = x + ""; + return treemap; + }; + return d3_layout_hierarchyRebind(treemap, hierarchy); + }; + function d3_layout_treemapPadNull(node) { + return { + x: node.x, + y: node.y, + dx: node.dx, + dy: node.dy + }; + } + function d3_layout_treemapPad(node, padding) { + var x = node.x + padding[3], y = node.y + padding[0], dx = node.dx - padding[1] - padding[3], dy = node.dy - padding[0] - padding[2]; + if (dx < 0) { + x += dx / 2; + dx = 0; + } + if (dy < 0) { + y += dy / 2; + dy = 0; + } + return { + x: x, + y: y, + dx: dx, + dy: dy + }; + } + d3.random = { + normal: function(µ, σ) { + var n = arguments.length; + if (n < 2) σ = 1; + if (n < 1) µ = 0; + return function() { + var x, y, r; + do { + x = Math.random() * 2 - 1; + y = Math.random() * 2 - 1; + r = x * x + y * y; + } while (!r || r > 1); + return µ + σ * x * Math.sqrt(-2 * Math.log(r) / r); + }; + }, + logNormal: function() { + var random = d3.random.normal.apply(d3, arguments); + return function() { + return Math.exp(random()); + }; + }, + bates: function(m) { + var random = d3.random.irwinHall(m); + return function() { + return random() / m; + }; + }, + irwinHall: function(m) { + return function() { + for (var s = 0, j = 0; j < m; j++) s += Math.random(); + return s; + }; + } + }; + d3.scale = {}; + function d3_scaleExtent(domain) { + var start = domain[0], stop = domain[domain.length - 1]; + return start < stop ? [ start, stop ] : [ stop, start ]; + } + function d3_scaleRange(scale) { + return scale.rangeExtent ? scale.rangeExtent() : d3_scaleExtent(scale.range()); + } + function d3_scale_bilinear(domain, range, uninterpolate, interpolate) { + var u = uninterpolate(domain[0], domain[1]), i = interpolate(range[0], range[1]); + return function(x) { + return i(u(x)); + }; + } + function d3_scale_nice(domain, nice) { + var i0 = 0, i1 = domain.length - 1, x0 = domain[i0], x1 = domain[i1], dx; + if (x1 < x0) { + dx = i0, i0 = i1, i1 = dx; + dx = x0, x0 = x1, x1 = dx; + } + domain[i0] = nice.floor(x0); + domain[i1] = nice.ceil(x1); + return domain; + } + function d3_scale_niceStep(step) { + return step ? { + floor: function(x) { + return Math.floor(x / step) * step; + }, + ceil: function(x) { + return Math.ceil(x / step) * step; + } + } : d3_scale_niceIdentity; + } + var d3_scale_niceIdentity = { + floor: d3_identity, + ceil: d3_identity + }; + function d3_scale_polylinear(domain, range, uninterpolate, interpolate) { + var u = [], i = [], j = 0, k = Math.min(domain.length, range.length) - 1; + if (domain[k] < domain[0]) { + domain = domain.slice().reverse(); + range = range.slice().reverse(); + } + while (++j <= k) { + u.push(uninterpolate(domain[j - 1], domain[j])); + i.push(interpolate(range[j - 1], range[j])); + } + return function(x) { + var j = d3.bisect(domain, x, 1, k) - 1; + return i[j](u[j](x)); + }; + } + d3.scale.linear = function() { + return d3_scale_linear([ 0, 1 ], [ 0, 1 ], d3_interpolate, false); + }; + function d3_scale_linear(domain, range, interpolate, clamp) { + var output, input; + function rescale() { + var linear = Math.min(domain.length, range.length) > 2 ? d3_scale_polylinear : d3_scale_bilinear, uninterpolate = clamp ? d3_uninterpolateClamp : d3_uninterpolateNumber; + output = linear(domain, range, uninterpolate, interpolate); + input = linear(range, domain, uninterpolate, d3_interpolate); + return scale; + } + function scale(x) { + return output(x); + } + scale.invert = function(y) { + return input(y); + }; + scale.domain = function(x) { + if (!arguments.length) return domain; + domain = x.map(Number); + return rescale(); + }; + scale.range = function(x) { + if (!arguments.length) return range; + range = x; + return rescale(); + }; + scale.rangeRound = function(x) { + return scale.range(x).interpolate(d3_interpolateRound); + }; + scale.clamp = function(x) { + if (!arguments.length) return clamp; + clamp = x; + return rescale(); + }; + scale.interpolate = function(x) { + if (!arguments.length) return interpolate; + interpolate = x; + return rescale(); + }; + scale.ticks = function(m) { + return d3_scale_linearTicks(domain, m); + }; + scale.tickFormat = function(m, format) { + return d3_scale_linearTickFormat(domain, m, format); + }; + scale.nice = function(m) { + d3_scale_linearNice(domain, m); + return rescale(); + }; + scale.copy = function() { + return d3_scale_linear(domain, range, interpolate, clamp); + }; + return rescale(); + } + function d3_scale_linearRebind(scale, linear) { + return d3.rebind(scale, linear, "range", "rangeRound", "interpolate", "clamp"); + } + function d3_scale_linearNice(domain, m) { + d3_scale_nice(domain, d3_scale_niceStep(d3_scale_linearTickRange(domain, m)[2])); + d3_scale_nice(domain, d3_scale_niceStep(d3_scale_linearTickRange(domain, m)[2])); + return domain; + } + function d3_scale_linearTickRange(domain, m) { + if (m == null) m = 10; + var extent = d3_scaleExtent(domain), span = extent[1] - extent[0], step = Math.pow(10, Math.floor(Math.log(span / m) / Math.LN10)), err = m / span * step; + if (err <= .15) step *= 10; else if (err <= .35) step *= 5; else if (err <= .75) step *= 2; + extent[0] = Math.ceil(extent[0] / step) * step; + extent[1] = Math.floor(extent[1] / step) * step + step * .5; + extent[2] = step; + return extent; + } + function d3_scale_linearTicks(domain, m) { + return d3.range.apply(d3, d3_scale_linearTickRange(domain, m)); + } + function d3_scale_linearTickFormat(domain, m, format) { + var range = d3_scale_linearTickRange(domain, m); + if (format) { + var match = d3_format_re.exec(format); + match.shift(); + if (match[8] === "s") { + var prefix = d3.formatPrefix(Math.max(abs(range[0]), abs(range[1]))); + if (!match[7]) match[7] = "." + d3_scale_linearPrecision(prefix.scale(range[2])); + match[8] = "f"; + format = d3.format(match.join("")); + return function(d) { + return format(prefix.scale(d)) + prefix.symbol; + }; + } + if (!match[7]) match[7] = "." + d3_scale_linearFormatPrecision(match[8], range); + format = match.join(""); + } else { + format = ",." + d3_scale_linearPrecision(range[2]) + "f"; + } + return d3.format(format); + } + var d3_scale_linearFormatSignificant = { + s: 1, + g: 1, + p: 1, + r: 1, + e: 1 + }; + function d3_scale_linearPrecision(value) { + return -Math.floor(Math.log(value) / Math.LN10 + .01); + } + function d3_scale_linearFormatPrecision(type, range) { + var p = d3_scale_linearPrecision(range[2]); + return type in d3_scale_linearFormatSignificant ? Math.abs(p - d3_scale_linearPrecision(Math.max(abs(range[0]), abs(range[1])))) + +(type !== "e") : p - (type === "%") * 2; + } + d3.scale.log = function() { + return d3_scale_log(d3.scale.linear().domain([ 0, 1 ]), 10, true, [ 1, 10 ]); + }; + function d3_scale_log(linear, base, positive, domain) { + function log(x) { + return (positive ? Math.log(x < 0 ? 0 : x) : -Math.log(x > 0 ? 0 : -x)) / Math.log(base); + } + function pow(x) { + return positive ? Math.pow(base, x) : -Math.pow(base, -x); + } + function scale(x) { + return linear(log(x)); + } + scale.invert = function(x) { + return pow(linear.invert(x)); + }; + scale.domain = function(x) { + if (!arguments.length) return domain; + positive = x[0] >= 0; + linear.domain((domain = x.map(Number)).map(log)); + return scale; + }; + scale.base = function(_) { + if (!arguments.length) return base; + base = +_; + linear.domain(domain.map(log)); + return scale; + }; + scale.nice = function() { + var niced = d3_scale_nice(domain.map(log), positive ? Math : d3_scale_logNiceNegative); + linear.domain(niced); + domain = niced.map(pow); + return scale; + }; + scale.ticks = function() { + var extent = d3_scaleExtent(domain), ticks = [], u = extent[0], v = extent[1], i = Math.floor(log(u)), j = Math.ceil(log(v)), n = base % 1 ? 2 : base; + if (isFinite(j - i)) { + if (positive) { + for (;i < j; i++) for (var k = 1; k < n; k++) ticks.push(pow(i) * k); + ticks.push(pow(i)); + } else { + ticks.push(pow(i)); + for (;i++ < j; ) for (var k = n - 1; k > 0; k--) ticks.push(pow(i) * k); + } + for (i = 0; ticks[i] < u; i++) {} + for (j = ticks.length; ticks[j - 1] > v; j--) {} + ticks = ticks.slice(i, j); + } + return ticks; + }; + scale.tickFormat = function(n, format) { + if (!arguments.length) return d3_scale_logFormat; + if (arguments.length < 2) format = d3_scale_logFormat; else if (typeof format !== "function") format = d3.format(format); + var k = Math.max(1, base * n / scale.ticks().length); + return function(d) { + var i = d / pow(Math.round(log(d))); + if (i * base < base - .5) i *= base; + return i <= k ? format(d) : ""; + }; + }; + scale.copy = function() { + return d3_scale_log(linear.copy(), base, positive, domain); + }; + return d3_scale_linearRebind(scale, linear); + } + var d3_scale_logFormat = d3.format(".0e"), d3_scale_logNiceNegative = { + floor: function(x) { + return -Math.ceil(-x); + }, + ceil: function(x) { + return -Math.floor(-x); + } + }; + d3.scale.pow = function() { + return d3_scale_pow(d3.scale.linear(), 1, [ 0, 1 ]); + }; + function d3_scale_pow(linear, exponent, domain) { + var powp = d3_scale_powPow(exponent), powb = d3_scale_powPow(1 / exponent); + function scale(x) { + return linear(powp(x)); + } + scale.invert = function(x) { + return powb(linear.invert(x)); + }; + scale.domain = function(x) { + if (!arguments.length) return domain; + linear.domain((domain = x.map(Number)).map(powp)); + return scale; + }; + scale.ticks = function(m) { + return d3_scale_linearTicks(domain, m); + }; + scale.tickFormat = function(m, format) { + return d3_scale_linearTickFormat(domain, m, format); + }; + scale.nice = function(m) { + return scale.domain(d3_scale_linearNice(domain, m)); + }; + scale.exponent = function(x) { + if (!arguments.length) return exponent; + powp = d3_scale_powPow(exponent = x); + powb = d3_scale_powPow(1 / exponent); + linear.domain(domain.map(powp)); + return scale; + }; + scale.copy = function() { + return d3_scale_pow(linear.copy(), exponent, domain); + }; + return d3_scale_linearRebind(scale, linear); + } + function d3_scale_powPow(e) { + return function(x) { + return x < 0 ? -Math.pow(-x, e) : Math.pow(x, e); + }; + } + d3.scale.sqrt = function() { + return d3.scale.pow().exponent(.5); + }; + d3.scale.ordinal = function() { + return d3_scale_ordinal([], { + t: "range", + a: [ [] ] + }); + }; + function d3_scale_ordinal(domain, ranger) { + var index, range, rangeBand; + function scale(x) { + return range[((index.get(x) || (ranger.t === "range" ? index.set(x, domain.push(x)) : NaN)) - 1) % range.length]; + } + function steps(start, step) { + return d3.range(domain.length).map(function(i) { + return start + step * i; + }); + } + scale.domain = function(x) { + if (!arguments.length) return domain; + domain = []; + index = new d3_Map(); + var i = -1, n = x.length, xi; + while (++i < n) if (!index.has(xi = x[i])) index.set(xi, domain.push(xi)); + return scale[ranger.t].apply(scale, ranger.a); + }; + scale.range = function(x) { + if (!arguments.length) return range; + range = x; + rangeBand = 0; + ranger = { + t: "range", + a: arguments + }; + return scale; + }; + scale.rangePoints = function(x, padding) { + if (arguments.length < 2) padding = 0; + var start = x[0], stop = x[1], step = domain.length < 2 ? (start = (start + stop) / 2, + 0) : (stop - start) / (domain.length - 1 + padding); + range = steps(start + step * padding / 2, step); + rangeBand = 0; + ranger = { + t: "rangePoints", + a: arguments + }; + return scale; + }; + scale.rangeRoundPoints = function(x, padding) { + if (arguments.length < 2) padding = 0; + var start = x[0], stop = x[1], step = domain.length < 2 ? (start = stop = Math.round((start + stop) / 2), + 0) : (stop - start) / (domain.length - 1 + padding) | 0; + range = steps(start + Math.round(step * padding / 2 + (stop - start - (domain.length - 1 + padding) * step) / 2), step); + rangeBand = 0; + ranger = { + t: "rangeRoundPoints", + a: arguments + }; + return scale; + }; + scale.rangeBands = function(x, padding, outerPadding) { + if (arguments.length < 2) padding = 0; + if (arguments.length < 3) outerPadding = padding; + var reverse = x[1] < x[0], start = x[reverse - 0], stop = x[1 - reverse], step = (stop - start) / (domain.length - padding + 2 * outerPadding); + range = steps(start + step * outerPadding, step); + if (reverse) range.reverse(); + rangeBand = step * (1 - padding); + ranger = { + t: "rangeBands", + a: arguments + }; + return scale; + }; + scale.rangeRoundBands = function(x, padding, outerPadding) { + if (arguments.length < 2) padding = 0; + if (arguments.length < 3) outerPadding = padding; + var reverse = x[1] < x[0], start = x[reverse - 0], stop = x[1 - reverse], step = Math.floor((stop - start) / (domain.length - padding + 2 * outerPadding)); + range = steps(start + Math.round((stop - start - (domain.length - padding) * step) / 2), step); + if (reverse) range.reverse(); + rangeBand = Math.round(step * (1 - padding)); + ranger = { + t: "rangeRoundBands", + a: arguments + }; + return scale; + }; + scale.rangeBand = function() { + return rangeBand; + }; + scale.rangeExtent = function() { + return d3_scaleExtent(ranger.a[0]); + }; + scale.copy = function() { + return d3_scale_ordinal(domain, ranger); + }; + return scale.domain(domain); + } + d3.scale.category10 = function() { + return d3.scale.ordinal().range(d3_category10); + }; + d3.scale.category20 = function() { + return d3.scale.ordinal().range(d3_category20); + }; + d3.scale.category20b = function() { + return d3.scale.ordinal().range(d3_category20b); + }; + d3.scale.category20c = function() { + return d3.scale.ordinal().range(d3_category20c); + }; + var d3_category10 = [ 2062260, 16744206, 2924588, 14034728, 9725885, 9197131, 14907330, 8355711, 12369186, 1556175 ].map(d3_rgbString); + var d3_category20 = [ 2062260, 11454440, 16744206, 16759672, 2924588, 10018698, 14034728, 16750742, 9725885, 12955861, 9197131, 12885140, 14907330, 16234194, 8355711, 13092807, 12369186, 14408589, 1556175, 10410725 ].map(d3_rgbString); + var d3_category20b = [ 3750777, 5395619, 7040719, 10264286, 6519097, 9216594, 11915115, 13556636, 9202993, 12426809, 15186514, 15190932, 8666169, 11356490, 14049643, 15177372, 8077683, 10834324, 13528509, 14589654 ].map(d3_rgbString); + var d3_category20c = [ 3244733, 7057110, 10406625, 13032431, 15095053, 16616764, 16625259, 16634018, 3253076, 7652470, 10607003, 13101504, 7695281, 10394312, 12369372, 14342891, 6513507, 9868950, 12434877, 14277081 ].map(d3_rgbString); + d3.scale.quantile = function() { + return d3_scale_quantile([], []); + }; + function d3_scale_quantile(domain, range) { + var thresholds; + function rescale() { + var k = 0, q = range.length; + thresholds = []; + while (++k < q) thresholds[k - 1] = d3.quantile(domain, k / q); + return scale; + } + function scale(x) { + if (!isNaN(x = +x)) return range[d3.bisect(thresholds, x)]; + } + scale.domain = function(x) { + if (!arguments.length) return domain; + domain = x.map(d3_number).filter(d3_numeric).sort(d3_ascending); + return rescale(); + }; + scale.range = function(x) { + if (!arguments.length) return range; + range = x; + return rescale(); + }; + scale.quantiles = function() { + return thresholds; + }; + scale.invertExtent = function(y) { + y = range.indexOf(y); + return y < 0 ? [ NaN, NaN ] : [ y > 0 ? thresholds[y - 1] : domain[0], y < thresholds.length ? thresholds[y] : domain[domain.length - 1] ]; + }; + scale.copy = function() { + return d3_scale_quantile(domain, range); + }; + return rescale(); + } + d3.scale.quantize = function() { + return d3_scale_quantize(0, 1, [ 0, 1 ]); + }; + function d3_scale_quantize(x0, x1, range) { + var kx, i; + function scale(x) { + return range[Math.max(0, Math.min(i, Math.floor(kx * (x - x0))))]; + } + function rescale() { + kx = range.length / (x1 - x0); + i = range.length - 1; + return scale; + } + scale.domain = function(x) { + if (!arguments.length) return [ x0, x1 ]; + x0 = +x[0]; + x1 = +x[x.length - 1]; + return rescale(); + }; + scale.range = function(x) { + if (!arguments.length) return range; + range = x; + return rescale(); + }; + scale.invertExtent = function(y) { + y = range.indexOf(y); + y = y < 0 ? NaN : y / kx + x0; + return [ y, y + 1 / kx ]; + }; + scale.copy = function() { + return d3_scale_quantize(x0, x1, range); + }; + return rescale(); + } + d3.scale.threshold = function() { + return d3_scale_threshold([ .5 ], [ 0, 1 ]); + }; + function d3_scale_threshold(domain, range) { + function scale(x) { + if (x <= x) return range[d3.bisect(domain, x)]; + } + scale.domain = function(_) { + if (!arguments.length) return domain; + domain = _; + return scale; + }; + scale.range = function(_) { + if (!arguments.length) return range; + range = _; + return scale; + }; + scale.invertExtent = function(y) { + y = range.indexOf(y); + return [ domain[y - 1], domain[y] ]; + }; + scale.copy = function() { + return d3_scale_threshold(domain, range); + }; + return scale; + } + d3.scale.identity = function() { + return d3_scale_identity([ 0, 1 ]); + }; + function d3_scale_identity(domain) { + function identity(x) { + return +x; + } + identity.invert = identity; + identity.domain = identity.range = function(x) { + if (!arguments.length) return domain; + domain = x.map(identity); + return identity; + }; + identity.ticks = function(m) { + return d3_scale_linearTicks(domain, m); + }; + identity.tickFormat = function(m, format) { + return d3_scale_linearTickFormat(domain, m, format); + }; + identity.copy = function() { + return d3_scale_identity(domain); + }; + return identity; + } + d3.svg = {}; + function d3_zero() { + return 0; + } + d3.svg.arc = function() { + var innerRadius = d3_svg_arcInnerRadius, outerRadius = d3_svg_arcOuterRadius, cornerRadius = d3_zero, padRadius = d3_svg_arcAuto, startAngle = d3_svg_arcStartAngle, endAngle = d3_svg_arcEndAngle, padAngle = d3_svg_arcPadAngle; + function arc() { + var r0 = Math.max(0, +innerRadius.apply(this, arguments)), r1 = Math.max(0, +outerRadius.apply(this, arguments)), a0 = startAngle.apply(this, arguments) - halfπ, a1 = endAngle.apply(this, arguments) - halfπ, da = Math.abs(a1 - a0), cw = a0 > a1 ? 0 : 1; + if (r1 < r0) rc = r1, r1 = r0, r0 = rc; + if (da >= τε) return circleSegment(r1, cw) + (r0 ? circleSegment(r0, 1 - cw) : "") + "Z"; + var rc, cr, rp, ap, p0 = 0, p1 = 0, x0, y0, x1, y1, x2, y2, x3, y3, path = []; + if (ap = (+padAngle.apply(this, arguments) || 0) / 2) { + rp = padRadius === d3_svg_arcAuto ? Math.sqrt(r0 * r0 + r1 * r1) : +padRadius.apply(this, arguments); + if (!cw) p1 *= -1; + if (r1) p1 = d3_asin(rp / r1 * Math.sin(ap)); + if (r0) p0 = d3_asin(rp / r0 * Math.sin(ap)); + } + if (r1) { + x0 = r1 * Math.cos(a0 + p1); + y0 = r1 * Math.sin(a0 + p1); + x1 = r1 * Math.cos(a1 - p1); + y1 = r1 * Math.sin(a1 - p1); + var l1 = Math.abs(a1 - a0 - 2 * p1) <= π ? 0 : 1; + if (p1 && d3_svg_arcSweep(x0, y0, x1, y1) === cw ^ l1) { + var h1 = (a0 + a1) / 2; + x0 = r1 * Math.cos(h1); + y0 = r1 * Math.sin(h1); + x1 = y1 = null; + } + } else { + x0 = y0 = 0; + } + if (r0) { + x2 = r0 * Math.cos(a1 - p0); + y2 = r0 * Math.sin(a1 - p0); + x3 = r0 * Math.cos(a0 + p0); + y3 = r0 * Math.sin(a0 + p0); + var l0 = Math.abs(a0 - a1 + 2 * p0) <= π ? 0 : 1; + if (p0 && d3_svg_arcSweep(x2, y2, x3, y3) === 1 - cw ^ l0) { + var h0 = (a0 + a1) / 2; + x2 = r0 * Math.cos(h0); + y2 = r0 * Math.sin(h0); + x3 = y3 = null; + } + } else { + x2 = y2 = 0; + } + if (da > ε && (rc = Math.min(Math.abs(r1 - r0) / 2, +cornerRadius.apply(this, arguments))) > .001) { + cr = r0 < r1 ^ cw ? 0 : 1; + var rc1 = rc, rc0 = rc; + if (da < π) { + var oc = x3 == null ? [ x2, y2 ] : x1 == null ? [ x0, y0 ] : d3_geom_polygonIntersect([ x0, y0 ], [ x3, y3 ], [ x1, y1 ], [ x2, y2 ]), ax = x0 - oc[0], ay = y0 - oc[1], bx = x1 - oc[0], by = y1 - oc[1], kc = 1 / Math.sin(Math.acos((ax * bx + ay * by) / (Math.sqrt(ax * ax + ay * ay) * Math.sqrt(bx * bx + by * by))) / 2), lc = Math.sqrt(oc[0] * oc[0] + oc[1] * oc[1]); + rc0 = Math.min(rc, (r0 - lc) / (kc - 1)); + rc1 = Math.min(rc, (r1 - lc) / (kc + 1)); + } + if (x1 != null) { + var t30 = d3_svg_arcCornerTangents(x3 == null ? [ x2, y2 ] : [ x3, y3 ], [ x0, y0 ], r1, rc1, cw), t12 = d3_svg_arcCornerTangents([ x1, y1 ], [ x2, y2 ], r1, rc1, cw); + if (rc === rc1) { + path.push("M", t30[0], "A", rc1, ",", rc1, " 0 0,", cr, " ", t30[1], "A", r1, ",", r1, " 0 ", 1 - cw ^ d3_svg_arcSweep(t30[1][0], t30[1][1], t12[1][0], t12[1][1]), ",", cw, " ", t12[1], "A", rc1, ",", rc1, " 0 0,", cr, " ", t12[0]); + } else { + path.push("M", t30[0], "A", rc1, ",", rc1, " 0 1,", cr, " ", t12[0]); + } + } else { + path.push("M", x0, ",", y0); + } + if (x3 != null) { + var t03 = d3_svg_arcCornerTangents([ x0, y0 ], [ x3, y3 ], r0, -rc0, cw), t21 = d3_svg_arcCornerTangents([ x2, y2 ], x1 == null ? [ x0, y0 ] : [ x1, y1 ], r0, -rc0, cw); + if (rc === rc0) { + path.push("L", t21[0], "A", rc0, ",", rc0, " 0 0,", cr, " ", t21[1], "A", r0, ",", r0, " 0 ", cw ^ d3_svg_arcSweep(t21[1][0], t21[1][1], t03[1][0], t03[1][1]), ",", 1 - cw, " ", t03[1], "A", rc0, ",", rc0, " 0 0,", cr, " ", t03[0]); + } else { + path.push("L", t21[0], "A", rc0, ",", rc0, " 0 0,", cr, " ", t03[0]); + } + } else { + path.push("L", x2, ",", y2); + } + } else { + path.push("M", x0, ",", y0); + if (x1 != null) path.push("A", r1, ",", r1, " 0 ", l1, ",", cw, " ", x1, ",", y1); + path.push("L", x2, ",", y2); + if (x3 != null) path.push("A", r0, ",", r0, " 0 ", l0, ",", 1 - cw, " ", x3, ",", y3); + } + path.push("Z"); + return path.join(""); + } + function circleSegment(r1, cw) { + return "M0," + r1 + "A" + r1 + "," + r1 + " 0 1," + cw + " 0," + -r1 + "A" + r1 + "," + r1 + " 0 1," + cw + " 0," + r1; + } + arc.innerRadius = function(v) { + if (!arguments.length) return innerRadius; + innerRadius = d3_functor(v); + return arc; + }; + arc.outerRadius = function(v) { + if (!arguments.length) return outerRadius; + outerRadius = d3_functor(v); + return arc; + }; + arc.cornerRadius = function(v) { + if (!arguments.length) return cornerRadius; + cornerRadius = d3_functor(v); + return arc; + }; + arc.padRadius = function(v) { + if (!arguments.length) return padRadius; + padRadius = v == d3_svg_arcAuto ? d3_svg_arcAuto : d3_functor(v); + return arc; + }; + arc.startAngle = function(v) { + if (!arguments.length) return startAngle; + startAngle = d3_functor(v); + return arc; + }; + arc.endAngle = function(v) { + if (!arguments.length) return endAngle; + endAngle = d3_functor(v); + return arc; + }; + arc.padAngle = function(v) { + if (!arguments.length) return padAngle; + padAngle = d3_functor(v); + return arc; + }; + arc.centroid = function() { + var r = (+innerRadius.apply(this, arguments) + +outerRadius.apply(this, arguments)) / 2, a = (+startAngle.apply(this, arguments) + +endAngle.apply(this, arguments)) / 2 - halfπ; + return [ Math.cos(a) * r, Math.sin(a) * r ]; + }; + return arc; + }; + var d3_svg_arcAuto = "auto"; + function d3_svg_arcInnerRadius(d) { + return d.innerRadius; + } + function d3_svg_arcOuterRadius(d) { + return d.outerRadius; + } + function d3_svg_arcStartAngle(d) { + return d.startAngle; + } + function d3_svg_arcEndAngle(d) { + return d.endAngle; + } + function d3_svg_arcPadAngle(d) { + return d && d.padAngle; + } + function d3_svg_arcSweep(x0, y0, x1, y1) { + return (x0 - x1) * y0 - (y0 - y1) * x0 > 0 ? 0 : 1; + } + function d3_svg_arcCornerTangents(p0, p1, r1, rc, cw) { + var x01 = p0[0] - p1[0], y01 = p0[1] - p1[1], lo = (cw ? rc : -rc) / Math.sqrt(x01 * x01 + y01 * y01), ox = lo * y01, oy = -lo * x01, x1 = p0[0] + ox, y1 = p0[1] + oy, x2 = p1[0] + ox, y2 = p1[1] + oy, x3 = (x1 + x2) / 2, y3 = (y1 + y2) / 2, dx = x2 - x1, dy = y2 - y1, d2 = dx * dx + dy * dy, r = r1 - rc, D = x1 * y2 - x2 * y1, d = (dy < 0 ? -1 : 1) * Math.sqrt(Math.max(0, r * r * d2 - D * D)), cx0 = (D * dy - dx * d) / d2, cy0 = (-D * dx - dy * d) / d2, cx1 = (D * dy + dx * d) / d2, cy1 = (-D * dx + dy * d) / d2, dx0 = cx0 - x3, dy0 = cy0 - y3, dx1 = cx1 - x3, dy1 = cy1 - y3; + if (dx0 * dx0 + dy0 * dy0 > dx1 * dx1 + dy1 * dy1) cx0 = cx1, cy0 = cy1; + return [ [ cx0 - ox, cy0 - oy ], [ cx0 * r1 / r, cy0 * r1 / r ] ]; + } + function d3_svg_line(projection) { + var x = d3_geom_pointX, y = d3_geom_pointY, defined = d3_true, interpolate = d3_svg_lineLinear, interpolateKey = interpolate.key, tension = .7; + function line(data) { + var segments = [], points = [], i = -1, n = data.length, d, fx = d3_functor(x), fy = d3_functor(y); + function segment() { + segments.push("M", interpolate(projection(points), tension)); + } + while (++i < n) { + if (defined.call(this, d = data[i], i)) { + points.push([ +fx.call(this, d, i), +fy.call(this, d, i) ]); + } else if (points.length) { + segment(); + points = []; + } + } + if (points.length) segment(); + return segments.length ? segments.join("") : null; + } + line.x = function(_) { + if (!arguments.length) return x; + x = _; + return line; + }; + line.y = function(_) { + if (!arguments.length) return y; + y = _; + return line; + }; + line.defined = function(_) { + if (!arguments.length) return defined; + defined = _; + return line; + }; + line.interpolate = function(_) { + if (!arguments.length) return interpolateKey; + if (typeof _ === "function") interpolateKey = interpolate = _; else interpolateKey = (interpolate = d3_svg_lineInterpolators.get(_) || d3_svg_lineLinear).key; + return line; + }; + line.tension = function(_) { + if (!arguments.length) return tension; + tension = _; + return line; + }; + return line; + } + d3.svg.line = function() { + return d3_svg_line(d3_identity); + }; + var d3_svg_lineInterpolators = d3.map({ + linear: d3_svg_lineLinear, + "linear-closed": d3_svg_lineLinearClosed, + step: d3_svg_lineStep, + "step-before": d3_svg_lineStepBefore, + "step-after": d3_svg_lineStepAfter, + basis: d3_svg_lineBasis, + "basis-open": d3_svg_lineBasisOpen, + "basis-closed": d3_svg_lineBasisClosed, + bundle: d3_svg_lineBundle, + cardinal: d3_svg_lineCardinal, + "cardinal-open": d3_svg_lineCardinalOpen, + "cardinal-closed": d3_svg_lineCardinalClosed, + monotone: d3_svg_lineMonotone + }); + d3_svg_lineInterpolators.forEach(function(key, value) { + value.key = key; + value.closed = /-closed$/.test(key); + }); + function d3_svg_lineLinear(points) { + return points.length > 1 ? points.join("L") : points + "Z"; + } + function d3_svg_lineLinearClosed(points) { + return points.join("L") + "Z"; + } + function d3_svg_lineStep(points) { + var i = 0, n = points.length, p = points[0], path = [ p[0], ",", p[1] ]; + while (++i < n) path.push("H", (p[0] + (p = points[i])[0]) / 2, "V", p[1]); + if (n > 1) path.push("H", p[0]); + return path.join(""); + } + function d3_svg_lineStepBefore(points) { + var i = 0, n = points.length, p = points[0], path = [ p[0], ",", p[1] ]; + while (++i < n) path.push("V", (p = points[i])[1], "H", p[0]); + return path.join(""); + } + function d3_svg_lineStepAfter(points) { + var i = 0, n = points.length, p = points[0], path = [ p[0], ",", p[1] ]; + while (++i < n) path.push("H", (p = points[i])[0], "V", p[1]); + return path.join(""); + } + function d3_svg_lineCardinalOpen(points, tension) { + return points.length < 4 ? d3_svg_lineLinear(points) : points[1] + d3_svg_lineHermite(points.slice(1, -1), d3_svg_lineCardinalTangents(points, tension)); + } + function d3_svg_lineCardinalClosed(points, tension) { + return points.length < 3 ? d3_svg_lineLinearClosed(points) : points[0] + d3_svg_lineHermite((points.push(points[0]), + points), d3_svg_lineCardinalTangents([ points[points.length - 2] ].concat(points, [ points[1] ]), tension)); + } + function d3_svg_lineCardinal(points, tension) { + return points.length < 3 ? d3_svg_lineLinear(points) : points[0] + d3_svg_lineHermite(points, d3_svg_lineCardinalTangents(points, tension)); + } + function d3_svg_lineHermite(points, tangents) { + if (tangents.length < 1 || points.length != tangents.length && points.length != tangents.length + 2) { + return d3_svg_lineLinear(points); + } + var quad = points.length != tangents.length, path = "", p0 = points[0], p = points[1], t0 = tangents[0], t = t0, pi = 1; + if (quad) { + path += "Q" + (p[0] - t0[0] * 2 / 3) + "," + (p[1] - t0[1] * 2 / 3) + "," + p[0] + "," + p[1]; + p0 = points[1]; + pi = 2; + } + if (tangents.length > 1) { + t = tangents[1]; + p = points[pi]; + pi++; + path += "C" + (p0[0] + t0[0]) + "," + (p0[1] + t0[1]) + "," + (p[0] - t[0]) + "," + (p[1] - t[1]) + "," + p[0] + "," + p[1]; + for (var i = 2; i < tangents.length; i++, pi++) { + p = points[pi]; + t = tangents[i]; + path += "S" + (p[0] - t[0]) + "," + (p[1] - t[1]) + "," + p[0] + "," + p[1]; + } + } + if (quad) { + var lp = points[pi]; + path += "Q" + (p[0] + t[0] * 2 / 3) + "," + (p[1] + t[1] * 2 / 3) + "," + lp[0] + "," + lp[1]; + } + return path; + } + function d3_svg_lineCardinalTangents(points, tension) { + var tangents = [], a = (1 - tension) / 2, p0, p1 = points[0], p2 = points[1], i = 1, n = points.length; + while (++i < n) { + p0 = p1; + p1 = p2; + p2 = points[i]; + tangents.push([ a * (p2[0] - p0[0]), a * (p2[1] - p0[1]) ]); + } + return tangents; + } + function d3_svg_lineBasis(points) { + if (points.length < 3) return d3_svg_lineLinear(points); + var i = 1, n = points.length, pi = points[0], x0 = pi[0], y0 = pi[1], px = [ x0, x0, x0, (pi = points[1])[0] ], py = [ y0, y0, y0, pi[1] ], path = [ x0, ",", y0, "L", d3_svg_lineDot4(d3_svg_lineBasisBezier3, px), ",", d3_svg_lineDot4(d3_svg_lineBasisBezier3, py) ]; + points.push(points[n - 1]); + while (++i <= n) { + pi = points[i]; + px.shift(); + px.push(pi[0]); + py.shift(); + py.push(pi[1]); + d3_svg_lineBasisBezier(path, px, py); + } + points.pop(); + path.push("L", pi); + return path.join(""); + } + function d3_svg_lineBasisOpen(points) { + if (points.length < 4) return d3_svg_lineLinear(points); + var path = [], i = -1, n = points.length, pi, px = [ 0 ], py = [ 0 ]; + while (++i < 3) { + pi = points[i]; + px.push(pi[0]); + py.push(pi[1]); + } + path.push(d3_svg_lineDot4(d3_svg_lineBasisBezier3, px) + "," + d3_svg_lineDot4(d3_svg_lineBasisBezier3, py)); + --i; + while (++i < n) { + pi = points[i]; + px.shift(); + px.push(pi[0]); + py.shift(); + py.push(pi[1]); + d3_svg_lineBasisBezier(path, px, py); + } + return path.join(""); + } + function d3_svg_lineBasisClosed(points) { + var path, i = -1, n = points.length, m = n + 4, pi, px = [], py = []; + while (++i < 4) { + pi = points[i % n]; + px.push(pi[0]); + py.push(pi[1]); + } + path = [ d3_svg_lineDot4(d3_svg_lineBasisBezier3, px), ",", d3_svg_lineDot4(d3_svg_lineBasisBezier3, py) ]; + --i; + while (++i < m) { + pi = points[i % n]; + px.shift(); + px.push(pi[0]); + py.shift(); + py.push(pi[1]); + d3_svg_lineBasisBezier(path, px, py); + } + return path.join(""); + } + function d3_svg_lineBundle(points, tension) { + var n = points.length - 1; + if (n) { + var x0 = points[0][0], y0 = points[0][1], dx = points[n][0] - x0, dy = points[n][1] - y0, i = -1, p, t; + while (++i <= n) { + p = points[i]; + t = i / n; + p[0] = tension * p[0] + (1 - tension) * (x0 + t * dx); + p[1] = tension * p[1] + (1 - tension) * (y0 + t * dy); + } + } + return d3_svg_lineBasis(points); + } + function d3_svg_lineDot4(a, b) { + return a[0] * b[0] + a[1] * b[1] + a[2] * b[2] + a[3] * b[3]; + } + var d3_svg_lineBasisBezier1 = [ 0, 2 / 3, 1 / 3, 0 ], d3_svg_lineBasisBezier2 = [ 0, 1 / 3, 2 / 3, 0 ], d3_svg_lineBasisBezier3 = [ 0, 1 / 6, 2 / 3, 1 / 6 ]; + function d3_svg_lineBasisBezier(path, x, y) { + path.push("C", d3_svg_lineDot4(d3_svg_lineBasisBezier1, x), ",", d3_svg_lineDot4(d3_svg_lineBasisBezier1, y), ",", d3_svg_lineDot4(d3_svg_lineBasisBezier2, x), ",", d3_svg_lineDot4(d3_svg_lineBasisBezier2, y), ",", d3_svg_lineDot4(d3_svg_lineBasisBezier3, x), ",", d3_svg_lineDot4(d3_svg_lineBasisBezier3, y)); + } + function d3_svg_lineSlope(p0, p1) { + return (p1[1] - p0[1]) / (p1[0] - p0[0]); + } + function d3_svg_lineFiniteDifferences(points) { + var i = 0, j = points.length - 1, m = [], p0 = points[0], p1 = points[1], d = m[0] = d3_svg_lineSlope(p0, p1); + while (++i < j) { + m[i] = (d + (d = d3_svg_lineSlope(p0 = p1, p1 = points[i + 1]))) / 2; + } + m[i] = d; + return m; + } + function d3_svg_lineMonotoneTangents(points) { + var tangents = [], d, a, b, s, m = d3_svg_lineFiniteDifferences(points), i = -1, j = points.length - 1; + while (++i < j) { + d = d3_svg_lineSlope(points[i], points[i + 1]); + if (abs(d) < ε) { + m[i] = m[i + 1] = 0; + } else { + a = m[i] / d; + b = m[i + 1] / d; + s = a * a + b * b; + if (s > 9) { + s = d * 3 / Math.sqrt(s); + m[i] = s * a; + m[i + 1] = s * b; + } + } + } + i = -1; + while (++i <= j) { + s = (points[Math.min(j, i + 1)][0] - points[Math.max(0, i - 1)][0]) / (6 * (1 + m[i] * m[i])); + tangents.push([ s || 0, m[i] * s || 0 ]); + } + return tangents; + } + function d3_svg_lineMonotone(points) { + return points.length < 3 ? d3_svg_lineLinear(points) : points[0] + d3_svg_lineHermite(points, d3_svg_lineMonotoneTangents(points)); + } + d3.svg.line.radial = function() { + var line = d3_svg_line(d3_svg_lineRadial); + line.radius = line.x, delete line.x; + line.angle = line.y, delete line.y; + return line; + }; + function d3_svg_lineRadial(points) { + var point, i = -1, n = points.length, r, a; + while (++i < n) { + point = points[i]; + r = point[0]; + a = point[1] - halfπ; + point[0] = r * Math.cos(a); + point[1] = r * Math.sin(a); + } + return points; + } + function d3_svg_area(projection) { + var x0 = d3_geom_pointX, x1 = d3_geom_pointX, y0 = 0, y1 = d3_geom_pointY, defined = d3_true, interpolate = d3_svg_lineLinear, interpolateKey = interpolate.key, interpolateReverse = interpolate, L = "L", tension = .7; + function area(data) { + var segments = [], points0 = [], points1 = [], i = -1, n = data.length, d, fx0 = d3_functor(x0), fy0 = d3_functor(y0), fx1 = x0 === x1 ? function() { + return x; + } : d3_functor(x1), fy1 = y0 === y1 ? function() { + return y; + } : d3_functor(y1), x, y; + function segment() { + segments.push("M", interpolate(projection(points1), tension), L, interpolateReverse(projection(points0.reverse()), tension), "Z"); + } + while (++i < n) { + if (defined.call(this, d = data[i], i)) { + points0.push([ x = +fx0.call(this, d, i), y = +fy0.call(this, d, i) ]); + points1.push([ +fx1.call(this, d, i), +fy1.call(this, d, i) ]); + } else if (points0.length) { + segment(); + points0 = []; + points1 = []; + } + } + if (points0.length) segment(); + return segments.length ? segments.join("") : null; + } + area.x = function(_) { + if (!arguments.length) return x1; + x0 = x1 = _; + return area; + }; + area.x0 = function(_) { + if (!arguments.length) return x0; + x0 = _; + return area; + }; + area.x1 = function(_) { + if (!arguments.length) return x1; + x1 = _; + return area; + }; + area.y = function(_) { + if (!arguments.length) return y1; + y0 = y1 = _; + return area; + }; + area.y0 = function(_) { + if (!arguments.length) return y0; + y0 = _; + return area; + }; + area.y1 = function(_) { + if (!arguments.length) return y1; + y1 = _; + return area; + }; + area.defined = function(_) { + if (!arguments.length) return defined; + defined = _; + return area; + }; + area.interpolate = function(_) { + if (!arguments.length) return interpolateKey; + if (typeof _ === "function") interpolateKey = interpolate = _; else interpolateKey = (interpolate = d3_svg_lineInterpolators.get(_) || d3_svg_lineLinear).key; + interpolateReverse = interpolate.reverse || interpolate; + L = interpolate.closed ? "M" : "L"; + return area; + }; + area.tension = function(_) { + if (!arguments.length) return tension; + tension = _; + return area; + }; + return area; + } + d3_svg_lineStepBefore.reverse = d3_svg_lineStepAfter; + d3_svg_lineStepAfter.reverse = d3_svg_lineStepBefore; + d3.svg.area = function() { + return d3_svg_area(d3_identity); + }; + d3.svg.area.radial = function() { + var area = d3_svg_area(d3_svg_lineRadial); + area.radius = area.x, delete area.x; + area.innerRadius = area.x0, delete area.x0; + area.outerRadius = area.x1, delete area.x1; + area.angle = area.y, delete area.y; + area.startAngle = area.y0, delete area.y0; + area.endAngle = area.y1, delete area.y1; + return area; + }; + d3.svg.chord = function() { + var source = d3_source, target = d3_target, radius = d3_svg_chordRadius, startAngle = d3_svg_arcStartAngle, endAngle = d3_svg_arcEndAngle; + function chord(d, i) { + var s = subgroup(this, source, d, i), t = subgroup(this, target, d, i); + return "M" + s.p0 + arc(s.r, s.p1, s.a1 - s.a0) + (equals(s, t) ? curve(s.r, s.p1, s.r, s.p0) : curve(s.r, s.p1, t.r, t.p0) + arc(t.r, t.p1, t.a1 - t.a0) + curve(t.r, t.p1, s.r, s.p0)) + "Z"; + } + function subgroup(self, f, d, i) { + var subgroup = f.call(self, d, i), r = radius.call(self, subgroup, i), a0 = startAngle.call(self, subgroup, i) - halfπ, a1 = endAngle.call(self, subgroup, i) - halfπ; + return { + r: r, + a0: a0, + a1: a1, + p0: [ r * Math.cos(a0), r * Math.sin(a0) ], + p1: [ r * Math.cos(a1), r * Math.sin(a1) ] + }; + } + function equals(a, b) { + return a.a0 == b.a0 && a.a1 == b.a1; + } + function arc(r, p, a) { + return "A" + r + "," + r + " 0 " + +(a > π) + ",1 " + p; + } + function curve(r0, p0, r1, p1) { + return "Q 0,0 " + p1; + } + chord.radius = function(v) { + if (!arguments.length) return radius; + radius = d3_functor(v); + return chord; + }; + chord.source = function(v) { + if (!arguments.length) return source; + source = d3_functor(v); + return chord; + }; + chord.target = function(v) { + if (!arguments.length) return target; + target = d3_functor(v); + return chord; + }; + chord.startAngle = function(v) { + if (!arguments.length) return startAngle; + startAngle = d3_functor(v); + return chord; + }; + chord.endAngle = function(v) { + if (!arguments.length) return endAngle; + endAngle = d3_functor(v); + return chord; + }; + return chord; + }; + function d3_svg_chordRadius(d) { + return d.radius; + } + d3.svg.diagonal = function() { + var source = d3_source, target = d3_target, projection = d3_svg_diagonalProjection; + function diagonal(d, i) { + var p0 = source.call(this, d, i), p3 = target.call(this, d, i), m = (p0.y + p3.y) / 2, p = [ p0, { + x: p0.x, + y: m + }, { + x: p3.x, + y: m + }, p3 ]; + p = p.map(projection); + return "M" + p[0] + "C" + p[1] + " " + p[2] + " " + p[3]; + } + diagonal.source = function(x) { + if (!arguments.length) return source; + source = d3_functor(x); + return diagonal; + }; + diagonal.target = function(x) { + if (!arguments.length) return target; + target = d3_functor(x); + return diagonal; + }; + diagonal.projection = function(x) { + if (!arguments.length) return projection; + projection = x; + return diagonal; + }; + return diagonal; + }; + function d3_svg_diagonalProjection(d) { + return [ d.x, d.y ]; + } + d3.svg.diagonal.radial = function() { + var diagonal = d3.svg.diagonal(), projection = d3_svg_diagonalProjection, projection_ = diagonal.projection; + diagonal.projection = function(x) { + return arguments.length ? projection_(d3_svg_diagonalRadialProjection(projection = x)) : projection; + }; + return diagonal; + }; + function d3_svg_diagonalRadialProjection(projection) { + return function() { + var d = projection.apply(this, arguments), r = d[0], a = d[1] - halfπ; + return [ r * Math.cos(a), r * Math.sin(a) ]; + }; + } + d3.svg.symbol = function() { + var type = d3_svg_symbolType, size = d3_svg_symbolSize; + function symbol(d, i) { + return (d3_svg_symbols.get(type.call(this, d, i)) || d3_svg_symbolCircle)(size.call(this, d, i)); + } + symbol.type = function(x) { + if (!arguments.length) return type; + type = d3_functor(x); + return symbol; + }; + symbol.size = function(x) { + if (!arguments.length) return size; + size = d3_functor(x); + return symbol; + }; + return symbol; + }; + function d3_svg_symbolSize() { + return 64; + } + function d3_svg_symbolType() { + return "circle"; + } + function d3_svg_symbolCircle(size) { + var r = Math.sqrt(size / π); + return "M0," + r + "A" + r + "," + r + " 0 1,1 0," + -r + "A" + r + "," + r + " 0 1,1 0," + r + "Z"; + } + var d3_svg_symbols = d3.map({ + circle: d3_svg_symbolCircle, + cross: function(size) { + var r = Math.sqrt(size / 5) / 2; + return "M" + -3 * r + "," + -r + "H" + -r + "V" + -3 * r + "H" + r + "V" + -r + "H" + 3 * r + "V" + r + "H" + r + "V" + 3 * r + "H" + -r + "V" + r + "H" + -3 * r + "Z"; + }, + diamond: function(size) { + var ry = Math.sqrt(size / (2 * d3_svg_symbolTan30)), rx = ry * d3_svg_symbolTan30; + return "M0," + -ry + "L" + rx + ",0" + " 0," + ry + " " + -rx + ",0" + "Z"; + }, + square: function(size) { + var r = Math.sqrt(size) / 2; + return "M" + -r + "," + -r + "L" + r + "," + -r + " " + r + "," + r + " " + -r + "," + r + "Z"; + }, + "triangle-down": function(size) { + var rx = Math.sqrt(size / d3_svg_symbolSqrt3), ry = rx * d3_svg_symbolSqrt3 / 2; + return "M0," + ry + "L" + rx + "," + -ry + " " + -rx + "," + -ry + "Z"; + }, + "triangle-up": function(size) { + var rx = Math.sqrt(size / d3_svg_symbolSqrt3), ry = rx * d3_svg_symbolSqrt3 / 2; + return "M0," + -ry + "L" + rx + "," + ry + " " + -rx + "," + ry + "Z"; + } + }); + d3.svg.symbolTypes = d3_svg_symbols.keys(); + var d3_svg_symbolSqrt3 = Math.sqrt(3), d3_svg_symbolTan30 = Math.tan(30 * d3_radians); + d3_selectionPrototype.transition = function(name) { + var id = d3_transitionInheritId || ++d3_transitionId, ns = d3_transitionNamespace(name), subgroups = [], subgroup, node, transition = d3_transitionInherit || { + time: Date.now(), + ease: d3_ease_cubicInOut, + delay: 0, + duration: 250 + }; + for (var j = -1, m = this.length; ++j < m; ) { + subgroups.push(subgroup = []); + for (var group = this[j], i = -1, n = group.length; ++i < n; ) { + if (node = group[i]) d3_transitionNode(node, i, ns, id, transition); + subgroup.push(node); + } + } + return d3_transition(subgroups, ns, id); + }; + d3_selectionPrototype.interrupt = function(name) { + return this.each(name == null ? d3_selection_interrupt : d3_selection_interruptNS(d3_transitionNamespace(name))); + }; + var d3_selection_interrupt = d3_selection_interruptNS(d3_transitionNamespace()); + function d3_selection_interruptNS(ns) { + return function() { + var lock, activeId, active; + if ((lock = this[ns]) && (active = lock[activeId = lock.active])) { + active.timer.c = null; + active.timer.t = NaN; + if (--lock.count) delete lock[activeId]; else delete this[ns]; + lock.active += .5; + active.event && active.event.interrupt.call(this, this.__data__, active.index); + } + }; + } + function d3_transition(groups, ns, id) { + d3_subclass(groups, d3_transitionPrototype); + groups.namespace = ns; + groups.id = id; + return groups; + } + var d3_transitionPrototype = [], d3_transitionId = 0, d3_transitionInheritId, d3_transitionInherit; + d3_transitionPrototype.call = d3_selectionPrototype.call; + d3_transitionPrototype.empty = d3_selectionPrototype.empty; + d3_transitionPrototype.node = d3_selectionPrototype.node; + d3_transitionPrototype.size = d3_selectionPrototype.size; + d3.transition = function(selection, name) { + return selection && selection.transition ? d3_transitionInheritId ? selection.transition(name) : selection : d3.selection().transition(selection); + }; + d3.transition.prototype = d3_transitionPrototype; + d3_transitionPrototype.select = function(selector) { + var id = this.id, ns = this.namespace, subgroups = [], subgroup, subnode, node; + selector = d3_selection_selector(selector); + for (var j = -1, m = this.length; ++j < m; ) { + subgroups.push(subgroup = []); + for (var group = this[j], i = -1, n = group.length; ++i < n; ) { + if ((node = group[i]) && (subnode = selector.call(node, node.__data__, i, j))) { + if ("__data__" in node) subnode.__data__ = node.__data__; + d3_transitionNode(subnode, i, ns, id, node[ns][id]); + subgroup.push(subnode); + } else { + subgroup.push(null); + } + } + } + return d3_transition(subgroups, ns, id); + }; + d3_transitionPrototype.selectAll = function(selector) { + var id = this.id, ns = this.namespace, subgroups = [], subgroup, subnodes, node, subnode, transition; + selector = d3_selection_selectorAll(selector); + for (var j = -1, m = this.length; ++j < m; ) { + for (var group = this[j], i = -1, n = group.length; ++i < n; ) { + if (node = group[i]) { + transition = node[ns][id]; + subnodes = selector.call(node, node.__data__, i, j); + subgroups.push(subgroup = []); + for (var k = -1, o = subnodes.length; ++k < o; ) { + if (subnode = subnodes[k]) d3_transitionNode(subnode, k, ns, id, transition); + subgroup.push(subnode); + } + } + } + } + return d3_transition(subgroups, ns, id); + }; + d3_transitionPrototype.filter = function(filter) { + var subgroups = [], subgroup, group, node; + if (typeof filter !== "function") filter = d3_selection_filter(filter); + for (var j = 0, m = this.length; j < m; j++) { + subgroups.push(subgroup = []); + for (var group = this[j], i = 0, n = group.length; i < n; i++) { + if ((node = group[i]) && filter.call(node, node.__data__, i, j)) { + subgroup.push(node); + } + } + } + return d3_transition(subgroups, this.namespace, this.id); + }; + d3_transitionPrototype.tween = function(name, tween) { + var id = this.id, ns = this.namespace; + if (arguments.length < 2) return this.node()[ns][id].tween.get(name); + return d3_selection_each(this, tween == null ? function(node) { + node[ns][id].tween.remove(name); + } : function(node) { + node[ns][id].tween.set(name, tween); + }); + }; + function d3_transition_tween(groups, name, value, tween) { + var id = groups.id, ns = groups.namespace; + return d3_selection_each(groups, typeof value === "function" ? function(node, i, j) { + node[ns][id].tween.set(name, tween(value.call(node, node.__data__, i, j))); + } : (value = tween(value), function(node) { + node[ns][id].tween.set(name, value); + })); + } + d3_transitionPrototype.attr = function(nameNS, value) { + if (arguments.length < 2) { + for (value in nameNS) this.attr(value, nameNS[value]); + return this; + } + var interpolate = nameNS == "transform" ? d3_interpolateTransform : d3_interpolate, name = d3.ns.qualify(nameNS); + function attrNull() { + this.removeAttribute(name); + } + function attrNullNS() { + this.removeAttributeNS(name.space, name.local); + } + function attrTween(b) { + return b == null ? attrNull : (b += "", function() { + var a = this.getAttribute(name), i; + return a !== b && (i = interpolate(a, b), function(t) { + this.setAttribute(name, i(t)); + }); + }); + } + function attrTweenNS(b) { + return b == null ? attrNullNS : (b += "", function() { + var a = this.getAttributeNS(name.space, name.local), i; + return a !== b && (i = interpolate(a, b), function(t) { + this.setAttributeNS(name.space, name.local, i(t)); + }); + }); + } + return d3_transition_tween(this, "attr." + nameNS, value, name.local ? attrTweenNS : attrTween); + }; + d3_transitionPrototype.attrTween = function(nameNS, tween) { + var name = d3.ns.qualify(nameNS); + function attrTween(d, i) { + var f = tween.call(this, d, i, this.getAttribute(name)); + return f && function(t) { + this.setAttribute(name, f(t)); + }; + } + function attrTweenNS(d, i) { + var f = tween.call(this, d, i, this.getAttributeNS(name.space, name.local)); + return f && function(t) { + this.setAttributeNS(name.space, name.local, f(t)); + }; + } + return this.tween("attr." + nameNS, name.local ? attrTweenNS : attrTween); + }; + d3_transitionPrototype.style = function(name, value, priority) { + var n = arguments.length; + if (n < 3) { + if (typeof name !== "string") { + if (n < 2) value = ""; + for (priority in name) this.style(priority, name[priority], value); + return this; + } + priority = ""; + } + function styleNull() { + this.style.removeProperty(name); + } + function styleString(b) { + return b == null ? styleNull : (b += "", function() { + var a = d3_window(this).getComputedStyle(this, null).getPropertyValue(name), i; + return a !== b && (i = d3_interpolate(a, b), function(t) { + this.style.setProperty(name, i(t), priority); + }); + }); + } + return d3_transition_tween(this, "style." + name, value, styleString); + }; + d3_transitionPrototype.styleTween = function(name, tween, priority) { + if (arguments.length < 3) priority = ""; + function styleTween(d, i) { + var f = tween.call(this, d, i, d3_window(this).getComputedStyle(this, null).getPropertyValue(name)); + return f && function(t) { + this.style.setProperty(name, f(t), priority); + }; + } + return this.tween("style." + name, styleTween); + }; + d3_transitionPrototype.text = function(value) { + return d3_transition_tween(this, "text", value, d3_transition_text); + }; + function d3_transition_text(b) { + if (b == null) b = ""; + return function() { + this.textContent = b; + }; + } + d3_transitionPrototype.remove = function() { + var ns = this.namespace; + return this.each("end.transition", function() { + var p; + if (this[ns].count < 2 && (p = this.parentNode)) p.removeChild(this); + }); + }; + d3_transitionPrototype.ease = function(value) { + var id = this.id, ns = this.namespace; + if (arguments.length < 1) return this.node()[ns][id].ease; + if (typeof value !== "function") value = d3.ease.apply(d3, arguments); + return d3_selection_each(this, function(node) { + node[ns][id].ease = value; + }); + }; + d3_transitionPrototype.delay = function(value) { + var id = this.id, ns = this.namespace; + if (arguments.length < 1) return this.node()[ns][id].delay; + return d3_selection_each(this, typeof value === "function" ? function(node, i, j) { + node[ns][id].delay = +value.call(node, node.__data__, i, j); + } : (value = +value, function(node) { + node[ns][id].delay = value; + })); + }; + d3_transitionPrototype.duration = function(value) { + var id = this.id, ns = this.namespace; + if (arguments.length < 1) return this.node()[ns][id].duration; + return d3_selection_each(this, typeof value === "function" ? function(node, i, j) { + node[ns][id].duration = Math.max(1, value.call(node, node.__data__, i, j)); + } : (value = Math.max(1, value), function(node) { + node[ns][id].duration = value; + })); + }; + d3_transitionPrototype.each = function(type, listener) { + var id = this.id, ns = this.namespace; + if (arguments.length < 2) { + var inherit = d3_transitionInherit, inheritId = d3_transitionInheritId; + try { + d3_transitionInheritId = id; + d3_selection_each(this, function(node, i, j) { + d3_transitionInherit = node[ns][id]; + type.call(node, node.__data__, i, j); + }); + } finally { + d3_transitionInherit = inherit; + d3_transitionInheritId = inheritId; + } + } else { + d3_selection_each(this, function(node) { + var transition = node[ns][id]; + (transition.event || (transition.event = d3.dispatch("start", "end", "interrupt"))).on(type, listener); + }); + } + return this; + }; + d3_transitionPrototype.transition = function() { + var id0 = this.id, id1 = ++d3_transitionId, ns = this.namespace, subgroups = [], subgroup, group, node, transition; + for (var j = 0, m = this.length; j < m; j++) { + subgroups.push(subgroup = []); + for (var group = this[j], i = 0, n = group.length; i < n; i++) { + if (node = group[i]) { + transition = node[ns][id0]; + d3_transitionNode(node, i, ns, id1, { + time: transition.time, + ease: transition.ease, + delay: transition.delay + transition.duration, + duration: transition.duration + }); + } + subgroup.push(node); + } + } + return d3_transition(subgroups, ns, id1); + }; + function d3_transitionNamespace(name) { + return name == null ? "__transition__" : "__transition_" + name + "__"; + } + function d3_transitionNode(node, i, ns, id, inherit) { + var lock = node[ns] || (node[ns] = { + active: 0, + count: 0 + }), transition = lock[id], time, timer, duration, ease, tweens; + function schedule(elapsed) { + var delay = transition.delay; + timer.t = delay + time; + if (delay <= elapsed) return start(elapsed - delay); + timer.c = start; + } + function start(elapsed) { + var activeId = lock.active, active = lock[activeId]; + if (active) { + active.timer.c = null; + active.timer.t = NaN; + --lock.count; + delete lock[activeId]; + active.event && active.event.interrupt.call(node, node.__data__, active.index); + } + for (var cancelId in lock) { + if (+cancelId < id) { + var cancel = lock[cancelId]; + cancel.timer.c = null; + cancel.timer.t = NaN; + --lock.count; + delete lock[cancelId]; + } + } + timer.c = tick; + d3_timer(function() { + if (timer.c && tick(elapsed || 1)) { + timer.c = null; + timer.t = NaN; + } + return 1; + }, 0, time); + lock.active = id; + transition.event && transition.event.start.call(node, node.__data__, i); + tweens = []; + transition.tween.forEach(function(key, value) { + if (value = value.call(node, node.__data__, i)) { + tweens.push(value); + } + }); + ease = transition.ease; + duration = transition.duration; + } + function tick(elapsed) { + var t = elapsed / duration, e = ease(t), n = tweens.length; + while (n > 0) { + tweens[--n].call(node, e); + } + if (t >= 1) { + transition.event && transition.event.end.call(node, node.__data__, i); + if (--lock.count) delete lock[id]; else delete node[ns]; + return 1; + } + } + if (!transition) { + time = inherit.time; + timer = d3_timer(schedule, 0, time); + transition = lock[id] = { + tween: new d3_Map(), + time: time, + timer: timer, + delay: inherit.delay, + duration: inherit.duration, + ease: inherit.ease, + index: i + }; + inherit = null; + ++lock.count; + } + } + d3.svg.axis = function() { + var scale = d3.scale.linear(), orient = d3_svg_axisDefaultOrient, innerTickSize = 6, outerTickSize = 6, tickPadding = 3, tickArguments_ = [ 10 ], tickValues = null, tickFormat_; + function axis(g) { + g.each(function() { + var g = d3.select(this); + var scale0 = this.__chart__ || scale, scale1 = this.__chart__ = scale.copy(); + var ticks = tickValues == null ? scale1.ticks ? scale1.ticks.apply(scale1, tickArguments_) : scale1.domain() : tickValues, tickFormat = tickFormat_ == null ? scale1.tickFormat ? scale1.tickFormat.apply(scale1, tickArguments_) : d3_identity : tickFormat_, tick = g.selectAll(".tick").data(ticks, scale1), tickEnter = tick.enter().insert("g", ".domain").attr("class", "tick").style("opacity", ε), tickExit = d3.transition(tick.exit()).style("opacity", ε).remove(), tickUpdate = d3.transition(tick.order()).style("opacity", 1), tickSpacing = Math.max(innerTickSize, 0) + tickPadding, tickTransform; + var range = d3_scaleRange(scale1), path = g.selectAll(".domain").data([ 0 ]), pathUpdate = (path.enter().append("path").attr("class", "domain"), + d3.transition(path)); + tickEnter.append("line"); + tickEnter.append("text"); + var lineEnter = tickEnter.select("line"), lineUpdate = tickUpdate.select("line"), text = tick.select("text").text(tickFormat), textEnter = tickEnter.select("text"), textUpdate = tickUpdate.select("text"), sign = orient === "top" || orient === "left" ? -1 : 1, x1, x2, y1, y2; + if (orient === "bottom" || orient === "top") { + tickTransform = d3_svg_axisX, x1 = "x", y1 = "y", x2 = "x2", y2 = "y2"; + text.attr("dy", sign < 0 ? "0em" : ".71em").style("text-anchor", "middle"); + pathUpdate.attr("d", "M" + range[0] + "," + sign * outerTickSize + "V0H" + range[1] + "V" + sign * outerTickSize); + } else { + tickTransform = d3_svg_axisY, x1 = "y", y1 = "x", x2 = "y2", y2 = "x2"; + text.attr("dy", ".32em").style("text-anchor", sign < 0 ? "end" : "start"); + pathUpdate.attr("d", "M" + sign * outerTickSize + "," + range[0] + "H0V" + range[1] + "H" + sign * outerTickSize); + } + lineEnter.attr(y2, sign * innerTickSize); + textEnter.attr(y1, sign * tickSpacing); + lineUpdate.attr(x2, 0).attr(y2, sign * innerTickSize); + textUpdate.attr(x1, 0).attr(y1, sign * tickSpacing); + if (scale1.rangeBand) { + var x = scale1, dx = x.rangeBand() / 2; + scale0 = scale1 = function(d) { + return x(d) + dx; + }; + } else if (scale0.rangeBand) { + scale0 = scale1; + } else { + tickExit.call(tickTransform, scale1, scale0); + } + tickEnter.call(tickTransform, scale0, scale1); + tickUpdate.call(tickTransform, scale1, scale1); + }); + } + axis.scale = function(x) { + if (!arguments.length) return scale; + scale = x; + return axis; + }; + axis.orient = function(x) { + if (!arguments.length) return orient; + orient = x in d3_svg_axisOrients ? x + "" : d3_svg_axisDefaultOrient; + return axis; + }; + axis.ticks = function() { + if (!arguments.length) return tickArguments_; + tickArguments_ = d3_array(arguments); + return axis; + }; + axis.tickValues = function(x) { + if (!arguments.length) return tickValues; + tickValues = x; + return axis; + }; + axis.tickFormat = function(x) { + if (!arguments.length) return tickFormat_; + tickFormat_ = x; + return axis; + }; + axis.tickSize = function(x) { + var n = arguments.length; + if (!n) return innerTickSize; + innerTickSize = +x; + outerTickSize = +arguments[n - 1]; + return axis; + }; + axis.innerTickSize = function(x) { + if (!arguments.length) return innerTickSize; + innerTickSize = +x; + return axis; + }; + axis.outerTickSize = function(x) { + if (!arguments.length) return outerTickSize; + outerTickSize = +x; + return axis; + }; + axis.tickPadding = function(x) { + if (!arguments.length) return tickPadding; + tickPadding = +x; + return axis; + }; + axis.tickSubdivide = function() { + return arguments.length && axis; + }; + return axis; + }; + var d3_svg_axisDefaultOrient = "bottom", d3_svg_axisOrients = { + top: 1, + right: 1, + bottom: 1, + left: 1 + }; + function d3_svg_axisX(selection, x0, x1) { + selection.attr("transform", function(d) { + var v0 = x0(d); + return "translate(" + (isFinite(v0) ? v0 : x1(d)) + ",0)"; + }); + } + function d3_svg_axisY(selection, y0, y1) { + selection.attr("transform", function(d) { + var v0 = y0(d); + return "translate(0," + (isFinite(v0) ? v0 : y1(d)) + ")"; + }); + } + d3.svg.brush = function() { + var event = d3_eventDispatch(brush, "brushstart", "brush", "brushend"), x = null, y = null, xExtent = [ 0, 0 ], yExtent = [ 0, 0 ], xExtentDomain, yExtentDomain, xClamp = true, yClamp = true, resizes = d3_svg_brushResizes[0]; + function brush(g) { + g.each(function() { + var g = d3.select(this).style("pointer-events", "all").style("-webkit-tap-highlight-color", "rgba(0,0,0,0)").on("mousedown.brush", brushstart).on("touchstart.brush", brushstart); + var background = g.selectAll(".background").data([ 0 ]); + background.enter().append("rect").attr("class", "background").style("visibility", "hidden").style("cursor", "crosshair"); + g.selectAll(".extent").data([ 0 ]).enter().append("rect").attr("class", "extent").style("cursor", "move"); + var resize = g.selectAll(".resize").data(resizes, d3_identity); + resize.exit().remove(); + resize.enter().append("g").attr("class", function(d) { + return "resize " + d; + }).style("cursor", function(d) { + return d3_svg_brushCursor[d]; + }).append("rect").attr("x", function(d) { + return /[ew]$/.test(d) ? -3 : null; + }).attr("y", function(d) { + return /^[ns]/.test(d) ? -3 : null; + }).attr("width", 6).attr("height", 6).style("visibility", "hidden"); + resize.style("display", brush.empty() ? "none" : null); + var gUpdate = d3.transition(g), backgroundUpdate = d3.transition(background), range; + if (x) { + range = d3_scaleRange(x); + backgroundUpdate.attr("x", range[0]).attr("width", range[1] - range[0]); + redrawX(gUpdate); + } + if (y) { + range = d3_scaleRange(y); + backgroundUpdate.attr("y", range[0]).attr("height", range[1] - range[0]); + redrawY(gUpdate); + } + redraw(gUpdate); + }); + } + brush.event = function(g) { + g.each(function() { + var event_ = event.of(this, arguments), extent1 = { + x: xExtent, + y: yExtent, + i: xExtentDomain, + j: yExtentDomain + }, extent0 = this.__chart__ || extent1; + this.__chart__ = extent1; + if (d3_transitionInheritId) { + d3.select(this).transition().each("start.brush", function() { + xExtentDomain = extent0.i; + yExtentDomain = extent0.j; + xExtent = extent0.x; + yExtent = extent0.y; + event_({ + type: "brushstart" + }); + }).tween("brush:brush", function() { + var xi = d3_interpolateArray(xExtent, extent1.x), yi = d3_interpolateArray(yExtent, extent1.y); + xExtentDomain = yExtentDomain = null; + return function(t) { + xExtent = extent1.x = xi(t); + yExtent = extent1.y = yi(t); + event_({ + type: "brush", + mode: "resize" + }); + }; + }).each("end.brush", function() { + xExtentDomain = extent1.i; + yExtentDomain = extent1.j; + event_({ + type: "brush", + mode: "resize" + }); + event_({ + type: "brushend" + }); + }); + } else { + event_({ + type: "brushstart" + }); + event_({ + type: "brush", + mode: "resize" + }); + event_({ + type: "brushend" + }); + } + }); + }; + function redraw(g) { + g.selectAll(".resize").attr("transform", function(d) { + return "translate(" + xExtent[+/e$/.test(d)] + "," + yExtent[+/^s/.test(d)] + ")"; + }); + } + function redrawX(g) { + g.select(".extent").attr("x", xExtent[0]); + g.selectAll(".extent,.n>rect,.s>rect").attr("width", xExtent[1] - xExtent[0]); + } + function redrawY(g) { + g.select(".extent").attr("y", yExtent[0]); + g.selectAll(".extent,.e>rect,.w>rect").attr("height", yExtent[1] - yExtent[0]); + } + function brushstart() { + var target = this, eventTarget = d3.select(d3.event.target), event_ = event.of(target, arguments), g = d3.select(target), resizing = eventTarget.datum(), resizingX = !/^(n|s)$/.test(resizing) && x, resizingY = !/^(e|w)$/.test(resizing) && y, dragging = eventTarget.classed("extent"), dragRestore = d3_event_dragSuppress(target), center, origin = d3.mouse(target), offset; + var w = d3.select(d3_window(target)).on("keydown.brush", keydown).on("keyup.brush", keyup); + if (d3.event.changedTouches) { + w.on("touchmove.brush", brushmove).on("touchend.brush", brushend); + } else { + w.on("mousemove.brush", brushmove).on("mouseup.brush", brushend); + } + g.interrupt().selectAll("*").interrupt(); + if (dragging) { + origin[0] = xExtent[0] - origin[0]; + origin[1] = yExtent[0] - origin[1]; + } else if (resizing) { + var ex = +/w$/.test(resizing), ey = +/^n/.test(resizing); + offset = [ xExtent[1 - ex] - origin[0], yExtent[1 - ey] - origin[1] ]; + origin[0] = xExtent[ex]; + origin[1] = yExtent[ey]; + } else if (d3.event.altKey) center = origin.slice(); + g.style("pointer-events", "none").selectAll(".resize").style("display", null); + d3.select("body").style("cursor", eventTarget.style("cursor")); + event_({ + type: "brushstart" + }); + brushmove(); + function keydown() { + if (d3.event.keyCode == 32) { + if (!dragging) { + center = null; + origin[0] -= xExtent[1]; + origin[1] -= yExtent[1]; + dragging = 2; + } + d3_eventPreventDefault(); + } + } + function keyup() { + if (d3.event.keyCode == 32 && dragging == 2) { + origin[0] += xExtent[1]; + origin[1] += yExtent[1]; + dragging = 0; + d3_eventPreventDefault(); + } + } + function brushmove() { + var point = d3.mouse(target), moved = false; + if (offset) { + point[0] += offset[0]; + point[1] += offset[1]; + } + if (!dragging) { + if (d3.event.altKey) { + if (!center) center = [ (xExtent[0] + xExtent[1]) / 2, (yExtent[0] + yExtent[1]) / 2 ]; + origin[0] = xExtent[+(point[0] < center[0])]; + origin[1] = yExtent[+(point[1] < center[1])]; + } else center = null; + } + if (resizingX && move1(point, x, 0)) { + redrawX(g); + moved = true; + } + if (resizingY && move1(point, y, 1)) { + redrawY(g); + moved = true; + } + if (moved) { + redraw(g); + event_({ + type: "brush", + mode: dragging ? "move" : "resize" + }); + } + } + function move1(point, scale, i) { + var range = d3_scaleRange(scale), r0 = range[0], r1 = range[1], position = origin[i], extent = i ? yExtent : xExtent, size = extent[1] - extent[0], min, max; + if (dragging) { + r0 -= position; + r1 -= size + position; + } + min = (i ? yClamp : xClamp) ? Math.max(r0, Math.min(r1, point[i])) : point[i]; + if (dragging) { + max = (min += position) + size; + } else { + if (center) position = Math.max(r0, Math.min(r1, 2 * center[i] - min)); + if (position < min) { + max = min; + min = position; + } else { + max = position; + } + } + if (extent[0] != min || extent[1] != max) { + if (i) yExtentDomain = null; else xExtentDomain = null; + extent[0] = min; + extent[1] = max; + return true; + } + } + function brushend() { + brushmove(); + g.style("pointer-events", "all").selectAll(".resize").style("display", brush.empty() ? "none" : null); + d3.select("body").style("cursor", null); + w.on("mousemove.brush", null).on("mouseup.brush", null).on("touchmove.brush", null).on("touchend.brush", null).on("keydown.brush", null).on("keyup.brush", null); + dragRestore(); + event_({ + type: "brushend" + }); + } + } + brush.x = function(z) { + if (!arguments.length) return x; + x = z; + resizes = d3_svg_brushResizes[!x << 1 | !y]; + return brush; + }; + brush.y = function(z) { + if (!arguments.length) return y; + y = z; + resizes = d3_svg_brushResizes[!x << 1 | !y]; + return brush; + }; + brush.clamp = function(z) { + if (!arguments.length) return x && y ? [ xClamp, yClamp ] : x ? xClamp : y ? yClamp : null; + if (x && y) xClamp = !!z[0], yClamp = !!z[1]; else if (x) xClamp = !!z; else if (y) yClamp = !!z; + return brush; + }; + brush.extent = function(z) { + var x0, x1, y0, y1, t; + if (!arguments.length) { + if (x) { + if (xExtentDomain) { + x0 = xExtentDomain[0], x1 = xExtentDomain[1]; + } else { + x0 = xExtent[0], x1 = xExtent[1]; + if (x.invert) x0 = x.invert(x0), x1 = x.invert(x1); + if (x1 < x0) t = x0, x0 = x1, x1 = t; + } + } + if (y) { + if (yExtentDomain) { + y0 = yExtentDomain[0], y1 = yExtentDomain[1]; + } else { + y0 = yExtent[0], y1 = yExtent[1]; + if (y.invert) y0 = y.invert(y0), y1 = y.invert(y1); + if (y1 < y0) t = y0, y0 = y1, y1 = t; + } + } + return x && y ? [ [ x0, y0 ], [ x1, y1 ] ] : x ? [ x0, x1 ] : y && [ y0, y1 ]; + } + if (x) { + x0 = z[0], x1 = z[1]; + if (y) x0 = x0[0], x1 = x1[0]; + xExtentDomain = [ x0, x1 ]; + if (x.invert) x0 = x(x0), x1 = x(x1); + if (x1 < x0) t = x0, x0 = x1, x1 = t; + if (x0 != xExtent[0] || x1 != xExtent[1]) xExtent = [ x0, x1 ]; + } + if (y) { + y0 = z[0], y1 = z[1]; + if (x) y0 = y0[1], y1 = y1[1]; + yExtentDomain = [ y0, y1 ]; + if (y.invert) y0 = y(y0), y1 = y(y1); + if (y1 < y0) t = y0, y0 = y1, y1 = t; + if (y0 != yExtent[0] || y1 != yExtent[1]) yExtent = [ y0, y1 ]; + } + return brush; + }; + brush.clear = function() { + if (!brush.empty()) { + xExtent = [ 0, 0 ], yExtent = [ 0, 0 ]; + xExtentDomain = yExtentDomain = null; + } + return brush; + }; + brush.empty = function() { + return !!x && xExtent[0] == xExtent[1] || !!y && yExtent[0] == yExtent[1]; + }; + return d3.rebind(brush, event, "on"); + }; + var d3_svg_brushCursor = { + n: "ns-resize", + e: "ew-resize", + s: "ns-resize", + w: "ew-resize", + nw: "nwse-resize", + ne: "nesw-resize", + se: "nwse-resize", + sw: "nesw-resize" + }; + var d3_svg_brushResizes = [ [ "n", "e", "s", "w", "nw", "ne", "se", "sw" ], [ "e", "w" ], [ "n", "s" ], [] ]; + var d3_time_format = d3_time.format = d3_locale_enUS.timeFormat; + var d3_time_formatUtc = d3_time_format.utc; + var d3_time_formatIso = d3_time_formatUtc("%Y-%m-%dT%H:%M:%S.%LZ"); + d3_time_format.iso = Date.prototype.toISOString && +new Date("2000-01-01T00:00:00.000Z") ? d3_time_formatIsoNative : d3_time_formatIso; + function d3_time_formatIsoNative(date) { + return date.toISOString(); + } + d3_time_formatIsoNative.parse = function(string) { + var date = new Date(string); + return isNaN(date) ? null : date; + }; + d3_time_formatIsoNative.toString = d3_time_formatIso.toString; + d3_time.second = d3_time_interval(function(date) { + return new d3_date(Math.floor(date / 1e3) * 1e3); + }, function(date, offset) { + date.setTime(date.getTime() + Math.floor(offset) * 1e3); + }, function(date) { + return date.getSeconds(); + }); + d3_time.seconds = d3_time.second.range; + d3_time.seconds.utc = d3_time.second.utc.range; + d3_time.minute = d3_time_interval(function(date) { + return new d3_date(Math.floor(date / 6e4) * 6e4); + }, function(date, offset) { + date.setTime(date.getTime() + Math.floor(offset) * 6e4); + }, function(date) { + return date.getMinutes(); + }); + d3_time.minutes = d3_time.minute.range; + d3_time.minutes.utc = d3_time.minute.utc.range; + d3_time.hour = d3_time_interval(function(date) { + var timezone = date.getTimezoneOffset() / 60; + return new d3_date((Math.floor(date / 36e5 - timezone) + timezone) * 36e5); + }, function(date, offset) { + date.setTime(date.getTime() + Math.floor(offset) * 36e5); + }, function(date) { + return date.getHours(); + }); + d3_time.hours = d3_time.hour.range; + d3_time.hours.utc = d3_time.hour.utc.range; + d3_time.month = d3_time_interval(function(date) { + date = d3_time.day(date); + date.setDate(1); + return date; + }, function(date, offset) { + date.setMonth(date.getMonth() + offset); + }, function(date) { + return date.getMonth(); + }); + d3_time.months = d3_time.month.range; + d3_time.months.utc = d3_time.month.utc.range; + function d3_time_scale(linear, methods, format) { + function scale(x) { + return linear(x); + } + scale.invert = function(x) { + return d3_time_scaleDate(linear.invert(x)); + }; + scale.domain = function(x) { + if (!arguments.length) return linear.domain().map(d3_time_scaleDate); + linear.domain(x); + return scale; + }; + function tickMethod(extent, count) { + var span = extent[1] - extent[0], target = span / count, i = d3.bisect(d3_time_scaleSteps, target); + return i == d3_time_scaleSteps.length ? [ methods.year, d3_scale_linearTickRange(extent.map(function(d) { + return d / 31536e6; + }), count)[2] ] : !i ? [ d3_time_scaleMilliseconds, d3_scale_linearTickRange(extent, count)[2] ] : methods[target / d3_time_scaleSteps[i - 1] < d3_time_scaleSteps[i] / target ? i - 1 : i]; + } + scale.nice = function(interval, skip) { + var domain = scale.domain(), extent = d3_scaleExtent(domain), method = interval == null ? tickMethod(extent, 10) : typeof interval === "number" && tickMethod(extent, interval); + if (method) interval = method[0], skip = method[1]; + function skipped(date) { + return !isNaN(date) && !interval.range(date, d3_time_scaleDate(+date + 1), skip).length; + } + return scale.domain(d3_scale_nice(domain, skip > 1 ? { + floor: function(date) { + while (skipped(date = interval.floor(date))) date = d3_time_scaleDate(date - 1); + return date; + }, + ceil: function(date) { + while (skipped(date = interval.ceil(date))) date = d3_time_scaleDate(+date + 1); + return date; + } + } : interval)); + }; + scale.ticks = function(interval, skip) { + var extent = d3_scaleExtent(scale.domain()), method = interval == null ? tickMethod(extent, 10) : typeof interval === "number" ? tickMethod(extent, interval) : !interval.range && [ { + range: interval + }, skip ]; + if (method) interval = method[0], skip = method[1]; + return interval.range(extent[0], d3_time_scaleDate(+extent[1] + 1), skip < 1 ? 1 : skip); + }; + scale.tickFormat = function() { + return format; + }; + scale.copy = function() { + return d3_time_scale(linear.copy(), methods, format); + }; + return d3_scale_linearRebind(scale, linear); + } + function d3_time_scaleDate(t) { + return new Date(t); + } + var d3_time_scaleSteps = [ 1e3, 5e3, 15e3, 3e4, 6e4, 3e5, 9e5, 18e5, 36e5, 108e5, 216e5, 432e5, 864e5, 1728e5, 6048e5, 2592e6, 7776e6, 31536e6 ]; + var d3_time_scaleLocalMethods = [ [ d3_time.second, 1 ], [ d3_time.second, 5 ], [ d3_time.second, 15 ], [ d3_time.second, 30 ], [ d3_time.minute, 1 ], [ d3_time.minute, 5 ], [ d3_time.minute, 15 ], [ d3_time.minute, 30 ], [ d3_time.hour, 1 ], [ d3_time.hour, 3 ], [ d3_time.hour, 6 ], [ d3_time.hour, 12 ], [ d3_time.day, 1 ], [ d3_time.day, 2 ], [ d3_time.week, 1 ], [ d3_time.month, 1 ], [ d3_time.month, 3 ], [ d3_time.year, 1 ] ]; + var d3_time_scaleLocalFormat = d3_time_format.multi([ [ ".%L", function(d) { + return d.getMilliseconds(); + } ], [ ":%S", function(d) { + return d.getSeconds(); + } ], [ "%I:%M", function(d) { + return d.getMinutes(); + } ], [ "%I %p", function(d) { + return d.getHours(); + } ], [ "%a %d", function(d) { + return d.getDay() && d.getDate() != 1; + } ], [ "%b %d", function(d) { + return d.getDate() != 1; + } ], [ "%B", function(d) { + return d.getMonth(); + } ], [ "%Y", d3_true ] ]); + var d3_time_scaleMilliseconds = { + range: function(start, stop, step) { + return d3.range(Math.ceil(start / step) * step, +stop, step).map(d3_time_scaleDate); + }, + floor: d3_identity, + ceil: d3_identity + }; + d3_time_scaleLocalMethods.year = d3_time.year; + d3_time.scale = function() { + return d3_time_scale(d3.scale.linear(), d3_time_scaleLocalMethods, d3_time_scaleLocalFormat); + }; + var d3_time_scaleUtcMethods = d3_time_scaleLocalMethods.map(function(m) { + return [ m[0].utc, m[1] ]; + }); + var d3_time_scaleUtcFormat = d3_time_formatUtc.multi([ [ ".%L", function(d) { + return d.getUTCMilliseconds(); + } ], [ ":%S", function(d) { + return d.getUTCSeconds(); + } ], [ "%I:%M", function(d) { + return d.getUTCMinutes(); + } ], [ "%I %p", function(d) { + return d.getUTCHours(); + } ], [ "%a %d", function(d) { + return d.getUTCDay() && d.getUTCDate() != 1; + } ], [ "%b %d", function(d) { + return d.getUTCDate() != 1; + } ], [ "%B", function(d) { + return d.getUTCMonth(); + } ], [ "%Y", d3_true ] ]); + d3_time_scaleUtcMethods.year = d3_time.year.utc; + d3_time.scale.utc = function() { + return d3_time_scale(d3.scale.linear(), d3_time_scaleUtcMethods, d3_time_scaleUtcFormat); + }; + d3.text = d3_xhrType(function(request) { + return request.responseText; + }); + d3.json = function(url, callback) { + return d3_xhr(url, "application/json", d3_json, callback); + }; + function d3_json(request) { + return JSON.parse(request.responseText); + } + d3.html = function(url, callback) { + return d3_xhr(url, "text/html", d3_html, callback); + }; + function d3_html(request) { + var range = d3_document.createRange(); + range.selectNode(d3_document.body); + return range.createContextualFragment(request.responseText); + } + d3.xml = d3_xhrType(function(request) { + return request.responseXML; + }); + if (typeof define === "function" && define.amd) this.d3 = d3, define(d3); else if (typeof module === "object" && module.exports) module.exports = d3; else this.d3 = d3; +}(); +},{}],89:[function(require,module,exports){ +/** + * Helpers. + */ + +var s = 1000 +var m = s * 60 +var h = m * 60 +var d = h * 24 +var y = d * 365.25 + +/** + * Parse or format the given `val`. + * + * Options: + * + * - `long` verbose formatting [false] + * + * @param {String|Number} val + * @param {Object} options + * @throws {Error} throw an error if val is not a non-empty string or a number + * @return {String|Number} + * @api public + */ + +module.exports = function (val, options) { + options = options || {} + var type = typeof val + if (type === 'string' && val.length > 0) { + return parse(val) + } else if (type === 'number' && isNaN(val) === false) { + return options.long ? + fmtLong(val) : + fmtShort(val) + } + throw new Error('val is not a non-empty string or a valid number. val=' + JSON.stringify(val)) +} + +/** + * Parse the given `str` and return milliseconds. + * + * @param {String} str + * @return {Number} + * @api private + */ + +function parse(str) { + str = String(str) + if (str.length > 10000) { + return + } + var match = /^((?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|years?|yrs?|y)?$/i.exec(str) + if (!match) { + return + } + var n = parseFloat(match[1]) + var type = (match[2] || 'ms').toLowerCase() + switch (type) { + case 'years': + case 'year': + case 'yrs': + case 'yr': + case 'y': + return n * y + case 'days': + case 'day': + case 'd': + return n * d + case 'hours': + case 'hour': + case 'hrs': + case 'hr': + case 'h': + return n * h + case 'minutes': + case 'minute': + case 'mins': + case 'min': + case 'm': + return n * m + case 'seconds': + case 'second': + case 'secs': + case 'sec': + case 's': + return n * s + case 'milliseconds': + case 'millisecond': + case 'msecs': + case 'msec': + case 'ms': + return n + default: + return undefined + } +} + +/** + * Short format for `ms`. + * + * @param {Number} ms + * @return {String} + * @api private + */ + +function fmtShort(ms) { + if (ms >= d) { + return Math.round(ms / d) + 'd' + } + if (ms >= h) { + return Math.round(ms / h) + 'h' + } + if (ms >= m) { + return Math.round(ms / m) + 'm' + } + if (ms >= s) { + return Math.round(ms / s) + 's' + } + return ms + 'ms' +} + +/** + * Long format for `ms`. + * + * @param {Number} ms + * @return {String} + * @api private + */ + +function fmtLong(ms) { + return plural(ms, d, 'day') || + plural(ms, h, 'hour') || + plural(ms, m, 'minute') || + plural(ms, s, 'second') || + ms + ' ms' +} + +/** + * Pluralization helper. + */ + +function plural(ms, n, name) { + if (ms < n) { + return + } + if (ms < n * 1.5) { + return Math.floor(ms / n) + ' ' + name + } + return Math.ceil(ms / n) + ' ' + name + 's' +} + +},{}],90:[function(require,module,exports){ +(function (process){ +/** + * This is the web browser implementation of `debug()`. + * + * Expose `debug()` as the module. + */ + +exports = module.exports = require('./debug'); +exports.log = log; +exports.formatArgs = formatArgs; +exports.save = save; +exports.load = load; +exports.useColors = useColors; +exports.storage = 'undefined' != typeof chrome + && 'undefined' != typeof chrome.storage + ? chrome.storage.local + : localstorage(); + +/** + * Colors. + */ + +exports.colors = [ + 'lightseagreen', + 'forestgreen', + 'goldenrod', + 'dodgerblue', + 'darkorchid', + 'crimson' +]; + +/** + * Currently only WebKit-based Web Inspectors, Firefox >= v31, + * and the Firebug extension (any Firefox version) are known + * to support "%c" CSS customizations. + * + * TODO: add a `localStorage` variable to explicitly enable/disable colors + */ + +function useColors() { + // NB: In an Electron preload script, document will be defined but not fully + // initialized. Since we know we're in Chrome, we'll just detect this case + // explicitly + if (typeof window !== 'undefined' && window && typeof window.process !== 'undefined' && window.process.type === 'renderer') { + return true; + } + + // is webkit? http://stackoverflow.com/a/16459606/376773 + // document is undefined in react-native: https://github.com/facebook/react-native/pull/1632 + return (typeof document !== 'undefined' && document && 'WebkitAppearance' in document.documentElement.style) || + // is firebug? http://stackoverflow.com/a/398120/376773 + (typeof window !== 'undefined' && window && window.console && (console.firebug || (console.exception && console.table))) || + // is firefox >= v31? + // https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages + (typeof navigator !== 'undefined' && navigator && navigator.userAgent && navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/) && parseInt(RegExp.$1, 10) >= 31) || + // double check webkit in userAgent just in case we are in a worker + (typeof navigator !== 'undefined' && navigator && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/)); +} + +/** + * Map %j to `JSON.stringify()`, since no Web Inspectors do that by default. + */ + +exports.formatters.j = function(v) { + try { + return JSON.stringify(v); + } catch (err) { + return '[UnexpectedJSONParseError]: ' + err.message; + } +}; + + +/** + * Colorize log arguments if enabled. + * + * @api public + */ + +function formatArgs(args) { + var useColors = this.useColors; + + args[0] = (useColors ? '%c' : '') + + this.namespace + + (useColors ? ' %c' : ' ') + + args[0] + + (useColors ? '%c ' : ' ') + + '+' + exports.humanize(this.diff); + + if (!useColors) return; + + var c = 'color: ' + this.color; + args.splice(1, 0, c, 'color: inherit') + + // the final "%c" is somewhat tricky, because there could be other + // arguments passed either before or after the %c, so we need to + // figure out the correct index to insert the CSS into + var index = 0; + var lastC = 0; + args[0].replace(/%[a-zA-Z%]/g, function(match) { + if ('%%' === match) return; + index++; + if ('%c' === match) { + // we only are interested in the *last* %c + // (the user may have provided their own) + lastC = index; + } + }); + + args.splice(lastC, 0, c); +} + +/** + * Invokes `console.log()` when available. + * No-op when `console.log` is not a "function". + * + * @api public + */ + +function log() { + // this hackery is required for IE8/9, where + // the `console.log` function doesn't have 'apply' + return 'object' === typeof console + && console.log + && Function.prototype.apply.call(console.log, console, arguments); +} + +/** + * Save `namespaces`. + * + * @param {String} namespaces + * @api private + */ + +function save(namespaces) { + try { + if (null == namespaces) { + exports.storage.removeItem('debug'); + } else { + exports.storage.debug = namespaces; + } + } catch(e) {} +} + +/** + * Load `namespaces`. + * + * @return {String} returns the previously persisted debug modes + * @api private + */ + +function load() { + try { + return exports.storage.debug; + } catch(e) {} + + // If debug isn't set in LS, and we're in Electron, try to load $DEBUG + if (typeof process !== 'undefined' && 'env' in process) { + return process.env.DEBUG; + } +} + +/** + * Enable namespaces listed in `localStorage.debug` initially. + */ + +exports.enable(load()); + +/** + * Localstorage attempts to return the localstorage. + * + * This is necessary because safari throws + * when a user disables cookies/localstorage + * and you attempt to access it. + * + * @return {LocalStorage} + * @api private + */ + +function localstorage() { + try { + return window.localStorage; + } catch (e) {} +} + +}).call(this,require('_process')) + +},{"./debug":91,"_process":1}],91:[function(require,module,exports){ + +/** + * This is the common logic for both the Node.js and web browser + * implementations of `debug()`. + * + * Expose `debug()` as the module. + */ + +exports = module.exports = createDebug.debug = createDebug['default'] = createDebug; +exports.coerce = coerce; +exports.disable = disable; +exports.enable = enable; +exports.enabled = enabled; +exports.humanize = require('ms'); + +/** + * The currently active debug mode names, and names to skip. + */ + +exports.names = []; +exports.skips = []; + +/** + * Map of special "%n" handling functions, for the debug "format" argument. + * + * Valid key names are a single, lower or upper-case letter, i.e. "n" and "N". + */ + +exports.formatters = {}; + +/** + * Previous log timestamp. + */ + +var prevTime; + +/** + * Select a color. + * @param {String} namespace + * @return {Number} + * @api private + */ + +function selectColor(namespace) { + var hash = 0, i; + + for (i in namespace) { + hash = ((hash << 5) - hash) + namespace.charCodeAt(i); + hash |= 0; // Convert to 32bit integer + } + + return exports.colors[Math.abs(hash) % exports.colors.length]; +} + +/** + * Create a debugger with the given `namespace`. + * + * @param {String} namespace + * @return {Function} + * @api public + */ + +function createDebug(namespace) { + + function debug() { + // disabled? + if (!debug.enabled) return; + + var self = debug; + + // set `diff` timestamp + var curr = +new Date(); + var ms = curr - (prevTime || curr); + self.diff = ms; + self.prev = prevTime; + self.curr = curr; + prevTime = curr; + + // turn the `arguments` into a proper Array + var args = new Array(arguments.length); + for (var i = 0; i < args.length; i++) { + args[i] = arguments[i]; + } + + args[0] = exports.coerce(args[0]); + + if ('string' !== typeof args[0]) { + // anything else let's inspect with %O + args.unshift('%O'); + } + + // apply any `formatters` transformations + var index = 0; + args[0] = args[0].replace(/%([a-zA-Z%])/g, function(match, format) { + // if we encounter an escaped % then don't increase the array index + if (match === '%%') return match; + index++; + var formatter = exports.formatters[format]; + if ('function' === typeof formatter) { + var val = args[index]; + match = formatter.call(self, val); + + // now we need to remove `args[index]` since it's inlined in the `format` + args.splice(index, 1); + index--; + } + return match; + }); + + // apply env-specific formatting (colors, etc.) + exports.formatArgs.call(self, args); + + var logFn = debug.log || exports.log || console.log.bind(console); + logFn.apply(self, args); + } + + debug.namespace = namespace; + debug.enabled = exports.enabled(namespace); + debug.useColors = exports.useColors(); + debug.color = selectColor(namespace); + + // env-specific initialization logic for debug instances + if ('function' === typeof exports.init) { + exports.init(debug); + } + + return debug; +} + +/** + * Enables a debug mode by namespaces. This can include modes + * separated by a colon and wildcards. + * + * @param {String} namespaces + * @api public + */ + +function enable(namespaces) { + exports.save(namespaces); + + exports.names = []; + exports.skips = []; + + var split = (namespaces || '').split(/[\s,]+/); + var len = split.length; + + for (var i = 0; i < len; i++) { + if (!split[i]) continue; // ignore empty strings + namespaces = split[i].replace(/\*/g, '.*?'); + if (namespaces[0] === '-') { + exports.skips.push(new RegExp('^' + namespaces.substr(1) + '$')); + } else { + exports.names.push(new RegExp('^' + namespaces + '$')); + } + } +} + +/** + * Disable debug output. + * + * @api public + */ + +function disable() { + exports.enable(''); +} + +/** + * Returns true if the given mode name is enabled, false otherwise. + * + * @param {String} name + * @return {Boolean} + * @api public + */ + +function enabled(name) { + var i, len; + for (i = 0, len = exports.skips.length; i < len; i++) { + if (exports.skips[i].test(name)) { + return false; + } + } + for (i = 0, len = exports.names.length; i < len; i++) { + if (exports.names[i].test(name)) { + return true; + } + } + return false; +} + +/** + * Coerce `val`. + * + * @param {Mixed} val + * @return {Mixed} + * @api private + */ + +function coerce(val) { + if (val instanceof Error) return val.stack || val.message; + return val; +} + +},{"ms":89}],92:[function(require,module,exports){ +/** + * Expose `PriorityQueue`. + */ +module.exports = PriorityQueue; + +/** + * Initializes a new empty `PriorityQueue` with the given `comparator(a, b)` + * function, uses `.DEFAULT_COMPARATOR()` when no function is provided. + * + * The comparator function must return a positive number when `a > b`, 0 when + * `a == b` and a negative number when `a < b`. + * + * @param {Function} + * @return {PriorityQueue} + * @api public + */ +function PriorityQueue(comparator) { + this._comparator = comparator || PriorityQueue.DEFAULT_COMPARATOR; + this._elements = []; +} + +/** + * Compares `a` and `b`, when `a > b` it returns a positive number, when + * it returns 0 and when `a < b` it returns a negative number. + * + * @param {String|Number} a + * @param {String|Number} b + * @return {Number} + * @api public + */ +PriorityQueue.DEFAULT_COMPARATOR = function(a, b) { + if (typeof a === 'number' && typeof b === 'number') { + return a - b; + } else { + a = a.toString(); + b = b.toString(); + + if (a == b) return 0; + + return (a > b) ? 1 : -1; + } +}; + +/** + * Returns whether the priority queue is empty or not. + * + * @return {Boolean} + * @api public + */ +PriorityQueue.prototype.isEmpty = function() { + return this.size() === 0; +}; + +/** + * Peeks at the top element of the priority queue. + * + * @return {Object} + * @throws {Error} when the queue is empty. + * @api public + */ +PriorityQueue.prototype.peek = function() { + if (this.isEmpty()) throw new Error('PriorityQueue is empty'); + + return this._elements[0]; +}; + +/** + * Dequeues the top element of the priority queue. + * + * @return {Object} + * @throws {Error} when the queue is empty. + * @api public + */ +PriorityQueue.prototype.deq = function() { + var first = this.peek(); + var last = this._elements.pop(); + var size = this.size(); + + if (size === 0) return first; + + this._elements[0] = last; + var current = 0; + + while (current < size) { + var largest = current; + var left = (2 * current) + 1; + var right = (2 * current) + 2; + + if (left < size && this._compare(left, largest) >= 0) { + largest = left; + } + + if (right < size && this._compare(right, largest) >= 0) { + largest = right; + } + + if (largest === current) break; + + this._swap(largest, current); + current = largest; + } + + return first; +}; + +/** + * Enqueues the `element` at the priority queue and returns its new size. + * + * @param {Object} element + * @return {Number} + * @api public + */ +PriorityQueue.prototype.enq = function(element) { + var size = this._elements.push(element); + var current = size - 1; + + while (current > 0) { + var parent = Math.floor((current - 1) / 2); + + if (this._compare(current, parent) <= 0) break; + + this._swap(parent, current); + current = parent; + } + + return size; +}; + +/** + * Returns the size of the priority queue. + * + * @return {Number} + * @api public + */ +PriorityQueue.prototype.size = function() { + return this._elements.length; +}; + +/** + * Iterates over queue elements + * + * @param {Function} fn + */ +PriorityQueue.prototype.forEach = function(fn) { + return this._elements.forEach(fn); +}; + +/** + * Compares the values at position `a` and `b` in the priority queue using its + * comparator function. + * + * @param {Number} a + * @param {Number} b + * @return {Number} + * @api private + */ +PriorityQueue.prototype._compare = function(a, b) { + return this._comparator(this._elements[a], this._elements[b]); +}; + +/** + * Swaps the values at position `a` and `b` in the priority queue. + * + * @param {Number} a + * @param {Number} b + * @api private + */ +PriorityQueue.prototype._swap = function(a, b) { + var aux = this._elements[a]; + this._elements[a] = this._elements[b]; + this._elements[b] = aux; +}; + +},{}],93:[function(require,module,exports){ + +/** + * Module Dependencies + */ + +var expr; +try { + expr = require('props'); +} catch(e) { + expr = require('component-props'); +} + +/** + * Expose `toFunction()`. + */ + +module.exports = toFunction; + +/** + * Convert `obj` to a `Function`. + * + * @param {Mixed} obj + * @return {Function} + * @api private + */ + +function toFunction(obj) { + switch ({}.toString.call(obj)) { + case '[object Object]': + return objectToFunction(obj); + case '[object Function]': + return obj; + case '[object String]': + return stringToFunction(obj); + case '[object RegExp]': + return regexpToFunction(obj); + default: + return defaultToFunction(obj); + } +} + +/** + * Default to strict equality. + * + * @param {Mixed} val + * @return {Function} + * @api private + */ + +function defaultToFunction(val) { + return function(obj){ + return val === obj; + }; +} + +/** + * Convert `re` to a function. + * + * @param {RegExp} re + * @return {Function} + * @api private + */ + +function regexpToFunction(re) { + return function(obj){ + return re.test(obj); + }; +} + +/** + * Convert property `str` to a function. + * + * @param {String} str + * @return {Function} + * @api private + */ + +function stringToFunction(str) { + // immediate such as "> 20" + if (/^ *\W+/.test(str)) return new Function('_', 'return _ ' + str); + + // properties such as "name.first" or "age > 18" or "age > 18 && age < 36" + return new Function('_', 'return ' + get(str)); +} + +/** + * Convert `object` to a function. + * + * @param {Object} object + * @return {Function} + * @api private + */ + +function objectToFunction(obj) { + var match = {}; + for (var key in obj) { + match[key] = typeof obj[key] === 'string' + ? defaultToFunction(obj[key]) + : toFunction(obj[key]); + } + return function(val){ + if (typeof val !== 'object') return false; + for (var key in match) { + if (!(key in val)) return false; + if (!match[key](val[key])) return false; + } + return true; + }; +} + +/** + * Built the getter function. Supports getter style functions + * + * @param {String} str + * @return {String} + * @api private + */ + +function get(str) { + var props = expr(str); + if (!props.length) return '_.' + str; + + var val, i, prop; + for (i = 0; i < props.length; i++) { + prop = props[i]; + val = '_.' + prop; + val = "('function' == typeof " + val + " ? " + val + "() : " + val + ")"; + + // mimic negative lookbehind to avoid problems with nested properties + str = stripNested(prop, str, val); + } + + return str; +} + +/** + * Mimic negative lookbehind to avoid problems with nested properties. + * + * See: http://blog.stevenlevithan.com/archives/mimic-lookbehind-javascript + * + * @param {String} prop + * @param {String} str + * @param {String} val + * @return {String} + * @api private + */ + +function stripNested (prop, str, val) { + return str.replace(new RegExp('(\\.)?' + prop, 'g'), function($0, $1) { + return $1 ? $0 : val; + }); +} + +},{"component-props":86,"props":86}]},{},[37]) +//# sourceMappingURL=bundle.js.map diff --git a/dist/bundle.js.map b/dist/bundle.js.map new file mode 100644 index 00000000..6eaf4b19 --- /dev/null +++ b/dist/bundle.js.map @@ -0,0 +1,199 @@ +{ + "version": 3, + "sources": [ + "../../../.nvm/versions/node/v6.0.0/lib/node_modules/mastarm/node_modules/browser-pack/_prelude.js", + "../../../.nvm/versions/node/v6.0.0/lib/node_modules/mastarm/node_modules/process/browser.js", + "lib/core/journey.js", + "lib/core/network.js", + "lib/core/path.js", + "lib/core/pathsegment.js", + "lib/core/pattern.js", + "lib/core/patterngroup.js", + "lib/core/route.js", + "lib/display/d3.geo.tile.js", + "lib/display/draw-grid.js", + "lib/display/index.js", + "lib/display/legend.js", + "lib/display/tile-layer.js", + "lib/graph/edge.js", + "lib/graph/edgegroup.js", + "lib/graph/index.js", + "lib/graph/vertex.js", + "lib/labeler/index.js", + "lib/labeler/label.js", + "lib/labeler/labeledgegroup.js", + "lib/labeler/pointlabel.js", + "lib/labeler/segmentlabel.js", + "lib/point/index.js", + "lib/point/multipoint.js", + "lib/point/place.js", + "lib/point/pointcluster.js", + "lib/point/pointclustermap.js", + "lib/point/stop.js", + "lib/point/turn.js", + "lib/renderer/default-renderer.js", + "lib/renderer/index.js", + "lib/renderer/renderededge.js", + "lib/renderer/renderedsegment.js", + "lib/renderer/wireframe-renderer.js", + "lib/styler/index.js", + "lib/styler/styles.js", + "lib/transitive.js", + "lib/util/index.js", + "lib/util/interpolate-line.js", + "lib/util/polyline.js", + "lib/util/spherical-mercator.js", + "node_modules/augment/augment.js", + "node_modules/babel-runtime/core-js/object/assign.js", + "node_modules/babel-runtime/core-js/object/keys.js", + "node_modules/babel-runtime/node_modules/core-js/library/fn/object/assign.js", + "node_modules/babel-runtime/node_modules/core-js/library/fn/object/keys.js", + "node_modules/babel-runtime/node_modules/core-js/library/modules/_a-function.js", + "node_modules/babel-runtime/node_modules/core-js/library/modules/_an-object.js", + "node_modules/babel-runtime/node_modules/core-js/library/modules/_array-includes.js", + "node_modules/babel-runtime/node_modules/core-js/library/modules/_cof.js", + "node_modules/babel-runtime/node_modules/core-js/library/modules/_core.js", + "node_modules/babel-runtime/node_modules/core-js/library/modules/_ctx.js", + "node_modules/babel-runtime/node_modules/core-js/library/modules/_defined.js", + "node_modules/babel-runtime/node_modules/core-js/library/modules/_descriptors.js", + "node_modules/babel-runtime/node_modules/core-js/library/modules/_dom-create.js", + "node_modules/babel-runtime/node_modules/core-js/library/modules/_enum-bug-keys.js", + "node_modules/babel-runtime/node_modules/core-js/library/modules/_export.js", + "node_modules/babel-runtime/node_modules/core-js/library/modules/_fails.js", + "node_modules/babel-runtime/node_modules/core-js/library/modules/_global.js", + "node_modules/babel-runtime/node_modules/core-js/library/modules/_has.js", + "node_modules/babel-runtime/node_modules/core-js/library/modules/_hide.js", + "node_modules/babel-runtime/node_modules/core-js/library/modules/_ie8-dom-define.js", + "node_modules/babel-runtime/node_modules/core-js/library/modules/_iobject.js", + "node_modules/babel-runtime/node_modules/core-js/library/modules/_is-object.js", + "node_modules/babel-runtime/node_modules/core-js/library/modules/_object-assign.js", + "node_modules/babel-runtime/node_modules/core-js/library/modules/_object-dp.js", + "node_modules/babel-runtime/node_modules/core-js/library/modules/_object-gops.js", + "node_modules/babel-runtime/node_modules/core-js/library/modules/_object-keys-internal.js", + "node_modules/babel-runtime/node_modules/core-js/library/modules/_object-keys.js", + "node_modules/babel-runtime/node_modules/core-js/library/modules/_object-pie.js", + "node_modules/babel-runtime/node_modules/core-js/library/modules/_object-sap.js", + "node_modules/babel-runtime/node_modules/core-js/library/modules/_property-desc.js", + "node_modules/babel-runtime/node_modules/core-js/library/modules/_shared-key.js", + "node_modules/babel-runtime/node_modules/core-js/library/modules/_shared.js", + "node_modules/babel-runtime/node_modules/core-js/library/modules/_to-index.js", + "node_modules/babel-runtime/node_modules/core-js/library/modules/_to-integer.js", + "node_modules/babel-runtime/node_modules/core-js/library/modules/_to-iobject.js", + "node_modules/babel-runtime/node_modules/core-js/library/modules/_to-length.js", + "node_modules/babel-runtime/node_modules/core-js/library/modules/_to-object.js", + "node_modules/babel-runtime/node_modules/core-js/library/modules/_to-primitive.js", + "node_modules/babel-runtime/node_modules/core-js/library/modules/_uid.js", + "node_modules/babel-runtime/node_modules/core-js/library/modules/es6.object.assign.js", + "node_modules/babel-runtime/node_modules/core-js/library/modules/es6.object.keys.js", + "node_modules/component-each/index.js", + "node_modules/component-emitter/index.js", + "node_modules/component-props/index.js", + "node_modules/component-type/index.js", + "node_modules/d3/d3.js", + "node_modules/debug/node_modules/ms/index.js", + "node_modules/debug/src/browser.js", + "node_modules/debug/src/debug.js", + "node_modules/priorityqueuejs/index.js", + "node_modules/to-function/index.js" + ], + "names": [], + "mappings": "AAAA;ACAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;ACpLA,IAAI,cAAc,QAAQ,eAAR,CAAlB;AACA,IAAI,cAAc,QAAQ,QAAR,CAAlB;AACA,IAAI,YAAY,QAAQ,eAAR,CAAhB;;AAEA,IAAI,OAAO,QAAQ,gBAAR,CAAX;AACA;;;;AAIA,OAAO,OAAP,GAAiB,OAAjB;;AAEA;;;;AAIA,SAAS,OAAT,CAAkB,IAAlB,EAAwB,OAAxB,EAAiC;AAC/B,OAAK,OAAL,GAAe,OAAf;;AAEA,OAAK,IAAI,GAAT,IAAgB,IAAhB,EAAsB;AACpB,S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,SAAT;AACxB,QAAI,GAAG,CAAH,IAAQ,SAAZ,EAAuB,GAAG,CAAH,IAAQ,SAAR;AACvB,QAAI,GAAG,CAAH,IAAQ,CAAC,SAAb,EAAwB,GAAG,CAAH,IAAQ,CAAC,SAAT;AACxB,WAAO,EAAP;AACD,GAXD;;AAaA;AACA,oBAAkB,SAAlB,CAA4B,OAA5B,GAAsC,UAAU,EAAV,EAAc;AAClD,WAAO,CACJ,GAAG,CAAH,IAAQ,GAAR,GAAc,CADV,EACc,CAAE,KAAK,EAAL,GAAU,GAAX,GAAkB,MAAM,KAAK,IAAL,CAAU,KAAK,GAAL,CAAS,CAAC,GAAG,CAAH,CAAD,GAAS,CAAlB,CAAV,CAAzB,IAA4D,GAD1E,CAAP;AAGD,GAJD;;AAMA,SAAO,iBAAP;AACD,CArKuB,EAAxB;;AAuKA,IAAI,OAAO,MAAP,KAAkB,WAAlB,IAAiC,OAAO,OAAP,KAAmB,WAAxD,EAAqE;AACnE,SAAO,OAAP,GAAiB,UAAU,iBAA3B;AACD;;;ACzKD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClCA;;ACAA;;ACAA;AACA;;ACDA;AACA;;ACDA;AACA;AACA;AACA;;ACHA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpBA;AACA;AACA;AACA;AACA;;ACJA;AACA;;ACDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnBA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;AACA;;ACHA;AACA;AACA;AACA;AACA;AACA;AACA;;ACNA;AACA;AACA;AACA;;ACHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5DA;AACA;AACA;AACA;AACA;AACA;AACA;;ACNA;AACA;AACA;AACA;;ACHA;AACA;AACA;AACA;;ACHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;;ACFA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;;ACFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACfA;;ACAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChBA;AACA;AACA;AACA;AACA;AACA;AACA;;ACNA;;ACAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;AACA;AACA;AACA;;ACLA;AACA;AACA;AACA;AACA;AACA;AACA;;ACNA;AACA;AACA;AACA;AACA;AACA;;ACLA;AACA;AACA;AACA;AACA;AACA;;ACLA;AACA;AACA;AACA;AACA;AACA;;ACLA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACXA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;AACA;;ACHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACRA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACj1SA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;ACrJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;ACtLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1MA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5KA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA", + "file": "generated.js", + "sourceRoot": "", + "sourcesContent": [ + "(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o 1) {\n for (var i = 1; i < arguments.length; i++) {\n args[i - 1] = arguments[i];\n }\n }\n queue.push(new Item(fun, args));\n if (queue.length === 1 && !draining) {\n runTimeout(drainQueue);\n }\n};\n\n// v8 likes predictible objects\nfunction Item(fun, array) {\n this.fun = fun;\n this.array = array;\n}\nItem.prototype.run = function () {\n this.fun.apply(null, this.array);\n};\nprocess.title = 'browser';\nprocess.browser = true;\nprocess.env = {};\nprocess.argv = [];\nprocess.version = ''; // empty string to avoid regexp issues\nprocess.versions = {};\n\nfunction noop() {}\n\nprocess.on = noop;\nprocess.addListener = noop;\nprocess.once = noop;\nprocess.off = noop;\nprocess.removeListener = noop;\nprocess.removeAllListeners = noop;\nprocess.emit = noop;\n\nprocess.binding = function (name) {\n throw new Error('process.binding is not supported');\n};\n\nprocess.cwd = function () { return '/' };\nprocess.chdir = function (dir) {\n throw new Error('process.chdir is not supported');\n};\nprocess.umask = function() { return 0; };\n", + "var PathSegment = require('./pathsegment')\nvar NetworkPath = require('./path')\nvar TurnPoint = require('../point/turn')\n\nvar each = require('component-each')\n/**\n * Expose `Journey`\n */\n\nmodule.exports = Journey\n\n/**\n *\n */\n\nfunction Journey (data, network) {\n this.network = network\n\n for (var key in data) {\n this[key] = data[key]\n }\n\n this.path = new NetworkPath(this)\n\n each(this.segments, function (segmentInfo) {\n var pathSegment = new PathSegment(segmentInfo.type, this.path)\n pathSegment.journeySegment = segmentInfo\n\n if (segmentInfo.type === 'TRANSIT') {\n if (segmentInfo.patterns) {\n each(segmentInfo.patterns, function (patternInfo) {\n pathSegment.addPattern(network.patterns[patternInfo.pattern_id],\n patternInfo.from_stop_index, patternInfo.to_stop_index)\n })\n } else if (segmentInfo.pattern_id) { // legacy support for single-pattern journey segments\n pathSegment.addPattern(network.patterns[segmentInfo.pattern_id],\n segmentInfo.from_stop_index, segmentInfo.to_stop_index)\n }\n } else { // non-transit segment\n var streetEdges = []\n // screen out degenerate transfer segments\n if (segmentInfo.from.type === 'STOP' && segmentInfo.to.type === 'STOP' &&\n segmentInfo.from.stop_id === segmentInfo.to.stop_id) return\n\n pathSegment.points.push(getEndPoint(segmentInfo.from, network))\n if (segmentInfo.streetEdges && segmentInfo.streetEdges.length > 0) {\n var lastTurnPoint = null\n\n for (var i = 0; i < segmentInfo.streetEdges.length; i++) {\n var streetEdgeId = segmentInfo.streetEdges[i]\n var streetEdge = network.streetEdges[streetEdgeId]\n streetEdge.id = streetEdgeId\n streetEdges.push(streetEdge)\n if (i >= segmentInfo.streetEdges.length - 1) continue\n\n if (lastTurnPoint) streetEdge.fromTurnPoint = lastTurnPoint\n var lastIndex = streetEdge.length - 1\n\n // screen out degenerate edges\n if (streetEdge.latLons[0][0] === streetEdge.latLons[lastIndex][0] &&\n streetEdge.latLons[0][1] === streetEdge.latLons[lastIndex][1]) {\n continue\n }\n\n // create a TurnPoint for the 'from' point of this edge\n var turnPoint = getTurnPoint({\n lat: streetEdge.latLons[lastIndex][0],\n lon: streetEdge.latLons[lastIndex][1],\n worldX: streetEdge.worldCoords[lastIndex][0],\n worldY: streetEdge.worldCoords[lastIndex][1]\n }, network)\n\n // compute the angle represented by this turn point\n /* turnPoint.turnAngle = Util.angleFromThreePoints(\n streetEdge.worldCoords[0][0],\n streetEdge.worldCoords[0][1],\n streetEdge.worldCoords[lastIndex][0],\n streetEdge.worldCoords[lastIndex][1],\n nextEdge.worldCoords[nextEdge.length-1][0],\n nextEdge.worldCoords[nextEdge.length-1][1]\n ); */\n\n pathSegment.points.push(turnPoint)\n lastTurnPoint = streetEdge.toTurnPoint = turnPoint\n }\n pathSegment.streetEdges = streetEdges\n }\n pathSegment.points.push(getEndPoint(segmentInfo.to, network))\n }\n this.path.addSegment(pathSegment)\n }, this)\n}\n\nfunction getEndPoint (pointInfo, network) {\n if (pointInfo.type === 'PLACE') {\n return network.places[pointInfo.place_id]\n } else if (pointInfo.type === 'STOP') {\n return network.stops[pointInfo.stop_id]\n }\n}\n\nJourney.prototype.getElementId = function () {\n return 'journey-' + this.journey_id\n}\n\n/* utility function for creating non-duplicative TurnPoints */\n\nfunction getTurnPoint (turnPointInfo, network) {\n var key = turnPointInfo.lat + '_' + turnPointInfo.lon\n if (key in network.turnPoints) return network.turnPoints[key]\n var turnPoint = new TurnPoint(turnPointInfo, key)\n network.turnPoints[key] = turnPoint\n // network.addVertexPoint(turnPoint);\n return turnPoint\n}\n", + "var each = require('component-each')\nvar debug = require('debug')('transitive:network')\nvar Emitter = require('component-emitter')\n\nvar Route = require('./route')\nvar RoutePattern = require('./pattern')\nvar Journey = require('./journey')\n\nvar Stop = require('../point/stop')\nvar Place = require('../point/place')\nvar PointClusterMap = require('../point/pointclustermap')\nvar RenderedEdge = require('../renderer/renderededge')\nvar RenderedSegment = require('../renderer/renderedsegment')\n\nvar Graph = require('../graph')\n\nvar Polyline = require('../util/polyline.js')\nvar SphericalMercator = require('../util/spherical-mercator')\nvar sm = new SphericalMercator()\n\n/**\n * Expose `Network`\n */\n\nmodule.exports = Network\n\n/**\n *\n */\n\nfunction Network (transitive, data) {\n this.transitive = transitive\n\n this.routes = {}\n this.stops = {}\n this.patterns = {}\n this.places = {}\n this.journeys = {}\n this.paths = []\n this.baseVertexPoints = []\n this.graph = new Graph(this, [])\n\n if (data) this.load(data)\n}\n\n/**\n * Mixin `Emitter`\n */\n\nEmitter(Network.prototype)\n\n/**\n * Load\n *\n * @param {Object} data\n */\n\nNetwork.prototype.load = function (data) {\n debug('loading', data)\n var self = this\n\n // check data\n if (!data) data = {}\n\n // Store data\n this.data = data\n\n // A list of points (stops & places) that will always become vertices in the network\n // graph (regardless of zoom scale). This includes all points that serve as a segment\n // endpoint and/or a convergence/divergence point between segments\n this.baseVertexPoints = []\n\n // object maps stop ids to arrays of unique stop_ids reachable from that stop\n this.adjacentStops = {}\n\n // maps lat_lon key to unique TurnPoint object\n this.turnPoints = {}\n\n // Copy/decode the streetEdge objects\n this.streetEdges = {}\n each(data.streetEdges, function (data) {\n var latLons = Polyline.decode(data.geometry.points)\n var coords = []\n each(latLons, function (latLon) {\n coords.push(sm.forward([latLon[1], latLon[0]]))\n })\n this.streetEdges[data.edge_id] = {\n latLons: latLons,\n worldCoords: coords,\n length: data.geometry.length\n }\n }, this)\n\n // Generate the route objects\n this.routes = {}\n each(data.routes, function (data) {\n this.routes[data.route_id] = new Route(data)\n }, this)\n\n // Generate the stop objects\n this.stops = {}\n each(data.stops, function (data) {\n this.stops[data.stop_id] = new Stop(data)\n }, this)\n\n // Generate the pattern objects\n this.patterns = {}\n each(data.patterns, function (data) {\n var pattern = new RoutePattern(data, this)\n this.patterns[data.pattern_id] = pattern\n var route = this.routes[data.route_id]\n if (route) {\n route.addPattern(pattern)\n pattern.route = route\n } else {\n debug('Error: pattern ' + data.pattern_id +\n ' refers to route that was not found: ' + data.route_id)\n }\n if (pattern.render) this.paths.push(pattern.createPath())\n }, this)\n\n // Generate the place objects\n this.places = {}\n each(data.places, function (data) {\n var place = this.places[data.place_id] = new Place(data, this)\n this.addVertexPoint(place)\n }, this)\n\n // Generate the internal Journey objects\n this.journeys = {}\n each(data.journeys, function (journeyData) {\n var journey = new Journey(journeyData, this)\n this.journeys[journeyData.journey_id] = journey\n this.paths.push(journey.path)\n }, this)\n\n // process the path segments\n for (var p = 0; p < this.paths.length; p++) {\n var path = this.paths[p]\n for (var s = 0; s < path.segments.length; s++) {\n this.processSegment(path.segments[s])\n }\n }\n\n // when rendering pattern paths only, determine convergence/divergence vertex\n // stops by looking for stops w/ >2 adjacent stops\n if (!data.journeys || data.journeys.length === 0) {\n for (var stopId in this.adjacentStops) {\n if (this.adjacentStops[stopId].length > 2) {\n this.addVertexPoint(this.stops[stopId])\n }\n }\n }\n\n // determine which TurnPoints should be base vertices\n var turnLookup = {}\n var addTurn = function (turn1, turn2) {\n if (!(turn1.getId() in turnLookup)) turnLookup[turn1.getId()] = []\n if (turnLookup[turn1.getId()].indexOf(turn2) === -1) turnLookup[turn1.getId()].push(turn2)\n }\n each(this.streetEdges, function (streetEdgeId) {\n var streetEdge = self.streetEdges[streetEdgeId]\n if (streetEdge.fromTurnPoint && streetEdge.toTurnPoint) {\n addTurn(streetEdge.toTurnPoint, streetEdge.fromTurnPoint)\n addTurn(streetEdge.fromTurnPoint, streetEdge.toTurnPoint)\n }\n })\n each(turnLookup, function (turnPointId) {\n var count = turnLookup[turnPointId].length\n if (count > 2) self.addVertexPoint(self.turnPoints[turnPointId])\n })\n\n this.createGraph()\n\n this.loaded = true\n this.emit('load', this)\n return this\n}\n\n/** Graph Creation/Processing Methods **/\n\nNetwork.prototype.clearGraphData = function () {\n each(this.paths, function (path) {\n path.clearGraphData()\n })\n}\n\nNetwork.prototype.createGraph = function () {\n this.applyZoomFactors(this.transitive.display.activeZoomFactors)\n\n // clear previous graph-specific data\n if (this.pointClusterMap) this.pointClusterMap.clearMultiPoints()\n each(this.stops, function (stopId) {\n this.stops[stopId].setFocused(true)\n }, this)\n\n // create the list of vertex points\n var vertexPoints\n if (this.mergeVertexThreshold && this.mergeVertexThreshold > 0) {\n this.pointClusterMap = new PointClusterMap(this, this.mergeVertexThreshold)\n vertexPoints = this.pointClusterMap.getVertexPoints(this.baseVertexPoints)\n } else vertexPoints = this.baseVertexPoints\n\n // core graph creation steps\n this.graph = new Graph(this, vertexPoints)\n this.populateGraphEdges()\n this.graph.pruneVertices()\n this.createInternalVertexPoints()\n if (this.isSnapping()) this.graph.snapToGrid(this.gridCellSize)\n this.graph.sortVertices()\n\n // other post-processing actions\n this.annotateTransitPoints()\n // this.initPlaceAdjacency();\n this.createRenderedSegments()\n this.transitive.labeler.updateLabelList(this.graph)\n this.updateGeometry(true)\n}\n\nNetwork.prototype.isSnapping = function () {\n return this.gridCellSize && this.gridCellSize !== 0\n}\n\n/*\n * identify and populate the 'internal' vertex points, which is zoom-level specfic\n */\n\nNetwork.prototype.createInternalVertexPoints = function () {\n this.internalVertexPoints = []\n\n for (var i in this.graph.edgeGroups) {\n var edgeGroup = this.graph.edgeGroups[i]\n\n var wlen = edgeGroup.getWorldLength()\n\n var splitPoints = []\n\n // compute the maximum number of internal points for this edge to add as graph vertices\n if (edgeGroup.hasTransit()) {\n var vertexFactor = this.internalVertexFactor //! edgeGroup.hasTransit() ? 1 : this.internalVertexFactor;\n var newVertexCount = Math.floor(wlen / vertexFactor)\n\n // get the priority queue of the edge's internal points\n var pq = edgeGroup.getInternalVertexPQ()\n\n // pull the 'best' points from the queue until we reach the maximum\n while (splitPoints.length < newVertexCount && pq.size() > 0) {\n var el = pq.deq()\n splitPoints.push(el.point)\n }\n }\n\n // perform the split operation (if needed)\n if (splitPoints.length > 0) {\n for (var e = 0; e < edgeGroup.edges.length; e++) {\n var edge = edgeGroup.edges[e]\n this.graph.splitEdgeAtInternalPoints(edge, splitPoints)\n }\n }\n }\n}\n\nNetwork.prototype.updateGeometry = function () {\n // clear the stop render data\n // for (var key in this.stops) this.stops[key].renderData = [];\n\n this.graph.vertices.forEach(function (vertex) {\n // vertex.snapped = false;\n vertex.point.clearRenderData()\n })\n\n // refresh the edge-based points\n this.graph.edges.forEach(function (edge) {\n edge.pointArray.forEach(function (point) {\n point.clearRenderData()\n })\n })\n\n this.renderedEdges.forEach(function (rEdge) {\n rEdge.clearOffsets()\n })\n\n // if (snapGrid)\n // if(this.gridCellSize && this.gridCellSize !== 0) this.graph.snapToGrid(this.gridCellSize);\n\n // this.fixPointOverlaps();\n\n this.graph.calculateGeometry(this.gridCellSize, this.angleConstraint)\n\n this.graph.apply2DOffsets(this)\n}\n\nNetwork.prototype.applyZoomFactors = function (factors) {\n this.gridCellSize = factors.gridCellSize\n this.internalVertexFactor = factors.internalVertexFactor\n this.angleConstraint = factors.angleConstraint\n this.mergeVertexThreshold = factors.mergeVertexThreshold\n}\n\n/**\n *\n */\n\nNetwork.prototype.processSegment = function (segment) {\n // iterate through this pattern's stops, associating stops/patterns with\n // each other and initializing the adjacentStops table\n var previousStop = null\n for (var i = 0; i < segment.points.length; i++) {\n var point = segment.points[i]\n point.used = true\n\n // called for each pair of adjacent stops in sequence\n if (previousStop && point.getType() === 'STOP') {\n this.addStopAdjacency(point.getId(), previousStop.getId())\n this.addStopAdjacency(previousStop.getId(), point.getId())\n }\n\n previousStop = (point.getType() === 'STOP') ? point : null\n\n // add the start and end points to the vertexStops collection\n var startPoint = segment.points[0]\n this.addVertexPoint(startPoint)\n startPoint.isSegmentEndPoint = true\n\n var endPoint = segment.points[segment.points.length - 1]\n this.addVertexPoint(endPoint)\n endPoint.isSegmentEndPoint = true\n }\n}\n\n/**\n * Helper function for stopAjacency table\n *\n * @param {Stop} adjacent stops list\n * @param {Stop} stopA\n * @param {Stop} stopB\n */\n\nNetwork.prototype.addStopAdjacency = function (stopIdA, stopIdB) {\n if (!this.adjacentStops[stopIdA]) this.adjacentStops[stopIdA] = []\n if (this.adjacentStops[stopIdA].indexOf(stopIdB) === -1) this.adjacentStops[stopIdA].push(stopIdB)\n}\n\n/**\n * Populate the graph edges\n */\n\nNetwork.prototype.populateGraphEdges = function () {\n // vertex associated with the last vertex point we passed in this sequence\n var lastVertex = null\n\n // collection of 'internal' (i.e. non-vertex) points passed\n // since the last vertex point\n var internalPoints = []\n\n each(this.paths, function (path) {\n each(path.segments, function (segment) {\n lastVertex = null\n\n var streetEdgeIndex = 0\n\n // for transit segments, see if there is a pattern with inter-stop geometry defined\n var representativePattern = null\n if (segment.type === 'TRANSIT') {\n for (var i = 0; i < segment.patternGroup.patterns.length; i++) {\n var pattern = segment.patternGroup.patterns[i]\n if (pattern.interStopGeometry && pattern.interStopGeometry.length === pattern.stops.length - 1) {\n representativePattern = pattern\n break\n }\n }\n }\n\n /**\n * geomCoords: The geographic coordinates for the graph edge currently\n * being constructed, used when rendering edges in \"real-world\" (i.e.\n * non-schematic) mode. geomCoords data is only initialized here for\n * street-based segments, using the segment's embedded street geometry\n * data (if provided).\n */\n var geomCoords = []\n\n /**\n * pointGeom: An array of point-specific geometry (i.e. the alignment\n * connecting this point to the following point in the containing\n * segment's point sequence. Currently applies to transit segments only.\n * pointGeom data is converted to geomCoords for rendering in the\n * splitEdgeAtInternalPoints method of NetworkGraph\n */\n var pointGeom = []\n\n each(segment.points, function (point, index) {\n if (segment.streetEdges) { // street-based segment with street-edge geometry\n for (var i = streetEdgeIndex; i < segment.streetEdges.length; i++) {\n if (index === 0) break\n\n geomCoords = geomCoords.concat(geomCoords.length > 0 ? segment.streetEdges[i].worldCoords.slice(1) : segment.streetEdges[i].worldCoords)\n if (segment.streetEdges[i].toTurnPoint === point) {\n streetEdgeIndex = i + 1\n break\n }\n }\n } else if (representativePattern) { // transit-based segment with known geometry\n var fromIndex = segment.patternGroup.getFromIndex(representativePattern)\n\n // ignore the first stop, since the geometry at this index represents\n // the alignment leading into that stop\n if (index > 0) {\n // add the alignment extending from this stop to the pointGeom array\n var geom = representativePattern.interStopGeometry[fromIndex + index - 1]\n pointGeom.push(geom)\n }\n }\n\n if (point.multipoint) point = point.multipoint\n\n if (point.graphVertex) { // this is a vertex point\n if (lastVertex !== null) {\n if (lastVertex.point === point) return\n\n // see if an equivalent graph edge already exists\n var fromVertex = lastVertex\n var toVertex = point.graphVertex\n var edge = this.graph.getEquivalentEdge(internalPoints, fromVertex, toVertex)\n\n // create a new graph edge if necessary\n if (!edge) {\n edge = this.graph.addEdge(internalPoints, fromVertex, toVertex, segment.getType())\n if (geomCoords && geomCoords.length > 0) edge.geomCoords = geomCoords\n if (pointGeom && pointGeom.length > 0) edge.pointGeom = pointGeom\n }\n\n // associate the graph edge and path segment with each other\n segment.addEdge(edge, fromVertex)\n edge.addPathSegment(segment)\n\n // reset the geomCoords and pointGeom arrays for the next edge\n geomCoords = []\n pointGeom = []\n }\n\n lastVertex = point.graphVertex\n internalPoints = []\n } else { // this is an internal point\n internalPoints.push(point)\n }\n }, this)\n // }\n }, this)\n }, this)\n}\n\nNetwork.prototype.createGraphEdge = function (segment, fromVertex, toVertex, internalPoints, geomCoords) {\n var edge = this.graph.getEquivalentEdge(internalPoints, fromVertex, toVertex)\n\n if (!edge) {\n edge = this.graph.addEdge(internalPoints, fromVertex, toVertex, segment.getType())\n\n // calculate the angle and apply to edge stops\n /* var dx = fromVertex.x - toVertex.x;\n var dy = fromVertex.y - toVertex.y;\n var angle = Math.atan2(dy, dx) * 180 / Math.PI;\n point.angle = lastVertex.point.angle = angle;\n for (var is = 0; is < internalPoints.length; is++) {\n internalPoints[is].angle = angle;\n } */\n\n if (geomCoords) edge.geomCoords = geomCoords\n\n debug('--- created edge ' + edge.toString())\n debug(edge)\n each(edge.geomCoords, function (c) {\n debug(c)\n })\n }\n\n segment.addEdge(edge, fromVertex)\n edge.addPathSegment(segment)\n}\n\nNetwork.prototype.annotateTransitPoints = function () {\n this.paths.forEach(function (path) {\n var transitSegments = []\n path.segments.forEach(function (pathSegment) {\n if (pathSegment.type === 'TRANSIT') transitSegments.push(pathSegment)\n })\n\n path.segments.forEach(function (pathSegment) {\n if (pathSegment.type === 'TRANSIT') {\n // if first transit segment in path, mark 'from' endpoint as board point\n if (transitSegments.indexOf(pathSegment) === 0) {\n pathSegment.points[0].isBoardPoint = true\n\n // if there are additional transit segments, mark the 'to' endpoint as a transfer point\n if (transitSegments.length > 1) pathSegment.points[pathSegment.points.length - 1].isTransferPoint = true\n\n // if last transit segment in path, mark 'to' endpoint as alight point\n } else if (transitSegments.indexOf(pathSegment) === transitSegments.length - 1) {\n pathSegment.points[pathSegment.points.length - 1].isAlightPoint = true\n\n // if there are additional transit segments, mark the 'from' endpoint as a transfer point\n if (transitSegments.length > 1) pathSegment.points[0].isTransferPoint = true\n\n // if this is an 'internal' transit segment, mark both endpoints as transfer points\n } else if (transitSegments.length > 2) {\n pathSegment.points[0].isTransferPoint = true\n pathSegment.points[pathSegment.points.length - 1].isTransferPoint = true\n }\n }\n })\n })\n}\n\nNetwork.prototype.initPlaceAdjacency = function () {\n each(this.places, function (placeId) {\n var place = this.places[placeId]\n if (!place.graphVertex) return\n each(place.graphVertex.incidentEdges(), function (edge) {\n var oppVertex = edge.oppositeVertex(place.graphVertex)\n if (oppVertex.point) {\n oppVertex.point.adjacentPlace = place\n }\n })\n }, this)\n}\n\nNetwork.prototype.createRenderedSegments = function () {\n this.reLookup = {}\n this.renderedEdges = []\n this.renderedSegments = []\n\n for (var patternId in this.patterns) {\n this.patterns[patternId].renderedEdges = []\n }\n\n each(this.paths, function (path) {\n each(path.segments, function (pathSegment) {\n pathSegment.renderedSegments = []\n\n if (pathSegment.type === 'TRANSIT') {\n // create a RenderedSegment for each pattern, except for buses which are collapsed to a single segment\n var busPatterns = []\n each(pathSegment.getPatterns(), function (pattern) {\n if (pattern.route.route_type === 3) busPatterns.push(pattern)\n else this.createRenderedSegment(pathSegment, [pattern])\n }, this)\n if (busPatterns.length > 0) {\n this.createRenderedSegment(pathSegment, busPatterns)\n }\n } else { // non-transit segments\n this.createRenderedSegment(pathSegment)\n }\n }, this)\n }, this)\n\n this.renderedEdges.sort(function (a, b) { // process render transit segments before walk\n if (a.getType() === 'WALK') return 1\n if (b.getType() === 'WALK') return -1\n })\n}\n\nNetwork.prototype.createRenderedSegment = function (pathSegment, patterns) {\n var rSegment = new RenderedSegment(pathSegment)\n\n each(pathSegment.edges, function (edge) {\n var rEdge = this.createRenderedEdge(pathSegment, edge.graphEdge, edge.forward, patterns)\n rSegment.addRenderedEdge(rEdge)\n }, this)\n if (patterns) {\n rSegment.patterns = patterns\n rSegment.mode = patterns[0].route.route_type\n }\n\n pathSegment.addRenderedSegment(rSegment)\n}\n\nNetwork.prototype.createRenderedEdge = function (pathSegment, gEdge, forward, patterns) {\n var rEdge\n\n // construct the edge key, disregarding mode qualifiers (e.g. \"_RENT\")\n var type = pathSegment.getType().split('_')[0]\n var key = gEdge.id + (forward ? 'F' : 'R') + '_' + type\n\n // for non-bus transit edges, append an exemplar pattern ID to the key\n if (patterns && patterns[0].route.route_type !== 3) {\n key += '_' + patterns[0].getId()\n }\n\n // see if this r-edge already exists\n if (key in this.reLookup) {\n rEdge = this.reLookup[key]\n } else { // if not, create it\n rEdge = new RenderedEdge(gEdge, forward, type)\n if (patterns) {\n each(patterns, function (pattern) {\n pattern.addRenderedEdge(rEdge)\n rEdge.addPattern(pattern)\n })\n rEdge.mode = patterns[0].route.route_type\n }\n rEdge.points.push(gEdge.fromVertex.point)\n rEdge.points.push(gEdge.toVertex.point)\n gEdge.addRenderedEdge(rEdge)\n rEdge.addPathSegment(pathSegment)\n\n this.renderedEdges.push(rEdge)\n this.reLookup[key] = rEdge\n }\n return rEdge\n}\n\nNetwork.prototype.addVertexPoint = function (point) {\n if (this.baseVertexPoints.indexOf(point) !== -1) return\n this.baseVertexPoints.push(point)\n}\n", + "var d3 = require('d3')\n\nvar interpolateLine = require('../util/interpolate-line')\n\n/**\n * Expose `NetworkPath`\n */\n\nmodule.exports = NetworkPath\n\n/**\n * NetworkPath -- a path through the network graph. Composed of PathSegments (which\n * are in turn composed of a sequence of graph edges)\n *\n * @param {Object} the parent onject (a RoutePattern or Journey)\n */\n\nfunction NetworkPath (parent) {\n this.parent = parent\n this.segments = []\n}\n\nNetworkPath.prototype.clearGraphData = function (segment) {\n this.segments.forEach(function (segment) {\n segment.clearGraphData()\n })\n}\n\n/**\n * addSegment: add a new segment to the end of this NetworkPath\n */\n\nNetworkPath.prototype.addSegment = function (segment) {\n this.segments.push(segment)\n segment.points.forEach(function (point) {\n point.paths.push(this)\n }, this)\n}\n\n/** highlight **/\n\nNetworkPath.prototype.drawHighlight = function (display, capExtension) {\n this.line = d3.svg.line() // the line translation function\n .x(function (pointInfo, i) {\n return display.xScale(pointInfo.x) + (pointInfo.offsetX || 0)\n })\n .y(function (pointInfo, i) {\n return display.yScale(pointInfo.y) - (pointInfo.offsetY || 0)\n })\n .interpolate(interpolateLine.bind(this))\n\n this.lineGraph = display.svg.append('path')\n .attr('id', 'transitive-path-highlight-' + this.parent.getElementId())\n .attr('class', 'transitive-path-highlight')\n .style('stroke-width', 24).style('stroke', '#ff4')\n .style('fill', 'none')\n .style('visibility', 'hidden')\n .data([this])\n}\n\nNetworkPath.prototype.getRenderedSegments = function () {\n var renderedSegments = []\n this.segments.forEach(function (pathSegment) {\n renderedSegments = renderedSegments.concat(pathSegment.renderedSegments)\n })\n return renderedSegments\n}\n\n/**\n * getPointArray\n */\n\nNetworkPath.prototype.getPointArray = function () {\n var points = []\n for (var i = 0; i < this.segments.length; i++) {\n var segment = this.segments[i]\n if (i > 0 && segment.points[0] === this.segments[i - 1].points[this.segments[i - 1].points.length - 1]) {\n points.concat(segment.points.slice(1))\n } else {\n points.concat(segment.points)\n }\n }\n return points\n}\n", + "/**\n * Dependencies\n */\n\nvar each = require('component-each')\n\nvar PatternGroup = require('./patterngroup')\nvar LabelEdgeGroup = require('../labeler/labeledgegroup.js')\n\nvar segmentId = 0\n\n/**\n * Expose `PathSegment`\n */\n\nmodule.exports = PathSegment\n\n/**\n *\n */\n\nfunction PathSegment (type, path) {\n this.id = segmentId++\n this.type = type\n this.path = path\n this.points = []\n this.edges = []\n this.renderedSegments = []\n this.patternGroup = new PatternGroup()\n}\n\nPathSegment.prototype.clearGraphData = function () {\n this.edges = []\n this.points.forEach(function (point) {\n point.graphVertex = null\n })\n this.renderLength = null\n}\n\nPathSegment.prototype.getId = function () {\n return this.id\n}\n\nPathSegment.prototype.getType = function () {\n return this.type\n}\n\nPathSegment.prototype.addRenderedSegment = function (rSegment) {\n this.renderedSegments.push(rSegment)\n}\n\nPathSegment.prototype.addEdge = function (graphEdge, originVertex) {\n this.edges.push({\n graphEdge: graphEdge,\n forward: (originVertex === graphEdge.fromVertex)\n })\n}\n\nPathSegment.prototype.insertEdgeAt = function (index, graphEdge, originVertex) {\n var edgeInfo = {\n graphEdge: graphEdge,\n forward: (originVertex === graphEdge.fromVertex)\n }\n this.edges.splice(index, 0, edgeInfo)\n}\n\nPathSegment.prototype.removeEdge = function (graphEdge) {\n var index = null\n for (var i = 0; i < this.edges.length; i++) {\n if (this.edges[i].graphEdge === graphEdge) {\n index = i\n break\n }\n }\n if (index !== null) this.edges.splice(index, 1)\n}\n\nPathSegment.prototype.getEdgeIndex = function (graphEdge) {\n for (var i = 0; i < this.edges.length; i++) {\n if (this.edges[i].graphEdge === graphEdge) return i\n }\n return -1\n}\n\n/**\n * Get graph vertices\n */\n\nPathSegment.prototype.getGraphVertices = function () {\n var vertices = []\n this.edges.forEach(function (edge, i) {\n if (i === 0) {\n vertices.push(edge.graphEdge.fromVertex)\n }\n vertices.push(edge.graphEdge.toVertex)\n })\n return vertices\n}\n\nPathSegment.prototype.vertexArray = function () {\n var vertex = this.startVertex()\n var array = [vertex]\n\n this.edges.forEach(function (edgeInfo) {\n vertex = edgeInfo.graphEdge.oppositeVertex(vertex)\n array.push(vertex)\n })\n\n return array\n}\n\nPathSegment.prototype.startVertex = function () {\n if (this.points[0].multipoint) return this.points[0].multipoint.graphVertex\n if (!this.edges || this.edges.length === 0) return null\n\n var firstGraphEdge = this.edges[0].graphEdge\n return this.edges[0].forward ? firstGraphEdge.fromVertex : firstGraphEdge.toVertex\n\n /* if (this.graphEdges.length === 1) return this.graphEdges[0].fromVertex;\n var first = this.graphEdges[0],\n next = this.graphEdges[1];\n if (first.toVertex == next.toVertex || first.toVertex == next.fromVertex)\n return first.fromVertex;\n if (first.fromVertex == next.toVertex || first.fromVertex == next.fromVertex)\n return first.toVertex;\n return null; */\n}\n\nPathSegment.prototype.endVertex = function () {\n if (this.points[this.points.length - 1].multipoint) return this.points[this.points.length - 1].multipoint.graphVertex\n if (!this.edges || this.edges.length === 0) return null\n\n var lastGraphEdge = this.edges[this.edges.length - 1].graphEdge\n return this.edges[this.edges.length - 1].forward ? lastGraphEdge.toVertex : lastGraphEdge.fromVertex\n\n /* if (this.graphEdges.length === 1) return this.graphEdges[0].toVertex;\n var last = this.graphEdges[this.graphEdges.length - 1],\n prev = this.graphEdges[this.graphEdges.length - 2];\n if (last.toVertex == prev.toVertex || last.toVertex == prev.fromVertex)\n return last.fromVertex;\n if (last.fromVertex == prev.toVertex || last.fromVertex == prev.fromVertex)\n return last.toVertex;\n return null; */\n}\n\nPathSegment.prototype.addPattern = function (pattern, fromIndex, toIndex) {\n // Initialize this segment's 'points' array to include the stops in the\n // provided pattern between the specified from and to indices, inclusive.\n // Only do this if the points array is empty or if the the length of the\n // segment being added exceeds that of the one currently stored.\n if ((toIndex - fromIndex + 1) > this.points.length) {\n this.points = []\n var lastStop = null\n for (var i = fromIndex; i <= toIndex; i++) {\n var stop = pattern.stops[i]\n if (lastStop !== stop) {\n this.points.push(stop)\n }\n lastStop = stop\n }\n }\n\n // Add the pattern to this segment's PatternGroup\n this.patternGroup.addPattern(pattern, fromIndex, toIndex)\n}\n\nPathSegment.prototype.getPattern = function () {\n return this.patternGroup.patterns[0]\n}\n\nPathSegment.prototype.getPatterns = function () {\n return this.patternGroup.patterns\n}\n\nPathSegment.prototype.getMode = function () {\n return this.patternGroup.patterns[0].route.route_type\n}\n\nPathSegment.prototype.toString = function () {\n var startVertex = this.startVertex()\n var endVertex = this.endVertex()\n return 'PathSegment id=' + this.id + ' type=' + this.type + ' from ' +\n (startVertex ? startVertex.toString() : '(unknown)') + ' to ' +\n (endVertex ? endVertex.toString() : '(unknown)')\n}\n\nPathSegment.prototype.getLabelEdgeGroups = function () {\n var edgeGroups = []\n each(this.renderedSegments, function (rSegment) {\n if (!rSegment.isFocused()) return\n var currentGroup = new LabelEdgeGroup(rSegment)\n each(rSegment.renderedEdges, function (rEdge) {\n currentGroup.addEdge(rEdge)\n if (rEdge.graphEdge.toVertex.point.containsSegmentEndPoint()) {\n edgeGroups.push(currentGroup)\n currentGroup = new LabelEdgeGroup(rSegment)\n }\n }, this)\n }, this)\n\n return edgeGroups\n}\n", + "var each = require('component-each')\n\nvar NetworkPath = require('./path')\nvar PathSegment = require('./pathsegment')\n\nvar Polyline = require('../util/polyline.js')\nvar SphericalMercator = require('../util/spherical-mercator')\nvar sm = new SphericalMercator()\n\n/**\n * Expose `RoutePattern`\n */\n\nmodule.exports = RoutePattern\n\n/**\n * A RoutePattern\n *\n * @param {Object} RoutePattern data object from the transitive.js input\n */\n\nfunction RoutePattern (data, transitive) {\n for (var key in data) {\n if (key === 'stops') continue\n this[key] = data[key]\n }\n\n // the array of Stops that make up this pattern\n this.stops = []\n\n // the inter-stop geometry, an array of point sequences (themselves arrays)\n // that represent the geometry beween stops i and i+1. This array should be\n // exactly one item shorter than the stops array.\n this.interStopGeometry = []\n\n if (transitive) {\n each(data.stops, function (stop) {\n // look up the Stop in the master collection and add to the stops array\n this.stops.push(transitive.stops[stop.stop_id])\n\n // if inter-stop geometry is provided: decode polyline, convert points\n // to SphericalMercator, and add to the interStopGeometry array\n if (stop.geometry) {\n var latLons = Polyline.decode(stop.geometry)\n var coords = []\n each(latLons, function (latLon) {\n coords.push(sm.forward([latLon[1], latLon[0]]))\n })\n this.interStopGeometry.push(coords)\n }\n }, this)\n }\n\n this.renderedEdges = []\n}\n\nRoutePattern.prototype.getId = function () {\n return this.pattern_id\n}\n\nRoutePattern.prototype.getElementId = function () {\n return 'pattern-' + this.pattern_id\n}\n\nRoutePattern.prototype.getName = function () {\n return this.pattern_name\n}\n\nRoutePattern.prototype.addRenderedEdge = function (rEdge) {\n if (this.renderedEdges.indexOf(rEdge) === -1) this.renderedEdges.push(rEdge)\n}\n\nRoutePattern.prototype.offsetAlignment = function (alignmentId, offset) {\n each(this.renderedEdges, function (rEdge) {\n rEdge.offsetAlignment(alignmentId, offset)\n })\n}\n\nRoutePattern.prototype.createPath = function () {\n var path = new NetworkPath(this)\n var pathSegment = new PathSegment('TRANSIT', path)\n pathSegment.addPattern(this, 0, this.stops.length - 1)\n path.addSegment(pathSegment)\n return path\n}\n", + "/**\n * Expose `PatternGroup`\n */\n\nmodule.exports = PatternGroup\n\n/**\n * PatternGroup -- a collection of one or more RoutePatterns associated with\n * a PathSegment\n *\n * @param {Object} RoutePattern data object from the transitive.js input\n */\n\nfunction PatternGroup () {\n this.patterns = []\n\n // lookup tables mapping pattern IDs to their from/to indices in the containing PathSegment\n this.fromIndexLookup = {}\n this.toIndexLookup = {}\n}\n\nPatternGroup.prototype.addPattern = function (pattern, fromIndex, toIndex) {\n if (this.patterns.indexOf(pattern) === -1) {\n this.patterns.push(pattern)\n this.fromIndexLookup[pattern.pattern_id] = fromIndex\n this.toIndexLookup[pattern.pattern_id] = toIndex\n }\n}\n\nPatternGroup.prototype.getFromIndex = function (pattern) {\n return this.fromIndexLookup[pattern.pattern_id]\n}\n\nPatternGroup.prototype.getToIndex = function (pattern) {\n return this.toIndexLookup[pattern.pattern_id]\n}\n", + "/**\n * Expose `Route`\n */\n\nmodule.exports = Route\n\n/**\n * A transit Route, as defined in the input data.\n * Routes contain one or more Patterns.\n *\n * @param {Object}\n */\n\nfunction Route (data) {\n for (var key in data) {\n if (key === 'patterns') continue\n this[key] = data[key]\n }\n\n this.patterns = []\n}\n\n/**\n * Add Pattern\n *\n * @param {Pattern}\n */\n\nRoute.prototype.addPattern = function (pattern) {\n this.patterns.push(pattern)\n pattern.route = this\n}\n\nRoute.prototype.getColor = function () {\n if (this.route_color) {\n if (this.route_color.charAt(0) === '#') return this.route_color\n return '#' + this.route_color\n }\n\n // assign a random shade of gray\n /* var c = 128 + Math.floor(64 * Math.random());\n var hex = c.toString(16);\n hex = (hex.length === 1) ? '0' + hex : hex;\n\n this.route_color = '#' + hex + hex + hex;\n\n return this.route_color; */\n}\n", + "var d3 = require('d3')\n\nmodule.exports = function () {\n var size = [960, 500]\n var scale = 256\n var translate = [size[0] / 2, size[1] / 2]\n var zoomDelta = 0\n\n function tile () {\n var z = Math.max(Math.log(scale) / Math.LN2 - 8, 0)\n var z0 = Math.round(z + zoomDelta)\n var k = Math.pow(2, z - z0 + 8)\n var origin = [(translate[0] - scale / 2) / k, (translate[1] - scale / 2) / k]\n var tiles = []\n var cols = d3.range(Math.max(0, Math.floor(-origin[0])), Math.max(0, Math.ceil(size[0] / k - origin[0])))\n var rows = d3.range(Math.max(0, Math.floor(-origin[1])), Math.max(0, Math.ceil(size[1] / k - origin[1])))\n\n rows.forEach(function (y) {\n cols.forEach(function (x) {\n tiles.push([x, y, z0])\n })\n })\n\n tiles.translate = origin\n tiles.scale = k\n\n return tiles\n }\n\n tile.size = function (_) {\n if (!arguments.length) return size\n size = _\n return tile\n }\n\n tile.scale = function (_) {\n if (!arguments.length) return scale\n scale = _\n return tile\n }\n\n tile.translate = function (_) {\n if (!arguments.length) return translate\n translate = _\n return tile\n }\n\n tile.zoomDelta = function (_) {\n if (!arguments.length) return zoomDelta\n zoomDelta = +_\n return tile\n }\n\n return tile\n}\n", + "/**\n * Draw the snapping grid\n *\n * @param {Display} display object\n * @param {Number} cell size\n */\n\nmodule.exports = function drawGrid (display, cellSize) {\n var svg = display.svg\n var xScale = display.xScale\n var yScale = display.yScale\n\n // Remove all current gridlines\n svg.selectAll('.gridline').remove()\n\n // Add a grid group \"behind\" everything else\n var grid = svg.insert('g', ':first-child')\n\n var xRange = xScale.range()\n var yRange = yScale.range()\n var xDomain = xScale.domain()\n var yDomain = yScale.domain()\n\n var xMin = Math.round(xDomain[0] / cellSize) * cellSize\n var xMax = Math.round(xDomain[1] / cellSize) * cellSize\n for (var x = xMin; x <= xMax; x += cellSize) appendLine(xScale(x), xScale(x), yRange[0], yRange[1])\n\n var yMin = Math.round(yDomain[0] / cellSize) * cellSize\n var yMax = Math.round(yDomain[1] / cellSize) * cellSize\n for (var y = yMin; y <= yMax; y += cellSize) appendLine(xRange[0], xRange[1], yScale(y), yScale(y))\n\n function appendLine (x1, x2, y1, y2) {\n grid.append('line')\n .attr({\n 'class': 'gridline',\n 'x1': x1,\n 'x2': x2,\n 'y1': y1,\n 'y2': y2\n })\n }\n}\n", + "var d3 = require('d3')\nvar debug = require('debug')('transitive:display')\n\nvar Legend = require('./legend')\nvar TileLayer = require('./tile-layer')\n\nvar SphericalMercator = require('../util/spherical-mercator')\nvar sm = new SphericalMercator()\n\n/**\n * Expose `Display`\n */\n\nmodule.exports = Display\n\n/**\n * The D3-based SVG display.\n *\n * @param {Object} options\n */\n\nfunction Display (transitive) {\n this.transitive = transitive\n var el = this.el = transitive.el\n this.width = el.clientWidth\n this.height = el.clientHeight\n\n // Set up the pan/zoom behavior\n var zoom = this.zoom = d3.behavior.zoom()\n .scaleExtent([0.25, 4])\n\n var self = this\n\n var zoomBehavior = function () {\n self.computeScale()\n if (self.scale !== self.lastScale) { // zoom action\n self.zoomChanged()\n } else { // pan action\n setTimeout(transitive.refresh.bind(transitive, true), 0)\n }\n\n var llb = self.llBounds()\n debug('ll bounds: ' + llb[0][0] + ',' + llb[0][1] + ' to ' + llb[1][0] +\n ',' + llb[1][1])\n }\n\n this.zoom.on('zoom.transitive', zoomBehavior)\n\n this.zoomFactors = transitive.options.zoomFactors || this.getDefaultZoomFactors()\n\n // set up the svg display\n var div = d3.select(el)\n .attr('class', 'Transitive')\n\n if (transitive.options.zoomEnabled) {\n div.call(zoom)\n }\n\n this.svg = div\n .append('svg')\n .attr('class', 'schematic-map')\n\n // initialize the x/y scale objects\n this.xScale = d3.scale.linear()\n this.yScale = d3.scale.linear()\n\n // set up the resize event handler\n if (transitive.options.autoResize) {\n d3.select(window).on('resize.display', function () {\n self.resized()\n transitive.refresh()\n })\n }\n\n // set the scale\n var bounds\n if (transitive.options.initialBounds) {\n bounds = [sm.forward(transitive.options.initialBounds[0]),\n sm.forward(transitive.options.initialBounds[1])\n ]\n } else if (transitive.network && transitive.network.graph) {\n bounds = transitive.network.graph.bounds()\n }\n\n if (bounds) {\n this.setScale(bounds, transitive.options)\n this.updateActiveZoomFactors(this.scale)\n this.lastScale = this.scale\n } else {\n this.updateActiveZoomFactors(1)\n }\n\n // set up the map layer\n if (transitive.options.mapboxId) {\n this.tileLayer = new TileLayer({\n el: this.el,\n display: this,\n graph: transitive.graph,\n mapboxId: transitive.options.mapboxId\n })\n }\n\n // set up the legend\n if (transitive.options.legendEl) {\n this.legend = new Legend(transitive.options.legendEl, this, transitive)\n }\n\n transitive.emit('initialize display', transitive, this)\n return this\n}\n\n/**\n * zoomChanged -- called when the zoom level changes, either by through the native\n * zoom support or the setBounds() API call. Updates zoom factors as needed and\n * performs appropriate update action (render or refresh)\n */\n\nDisplay.prototype.zoomChanged = function () {\n if (this.updateActiveZoomFactors(this.scale)) {\n this.transitive.network = null\n this.transitive.render()\n } else this.transitive.refresh()\n this.lastScale = this.scale\n}\n\nDisplay.prototype.updateActiveZoomFactors = function (scale) {\n var updated = false\n for (var i = 0; i < this.zoomFactors.length; i++) {\n var min = this.zoomFactors[i].minScale\n var max = (i < this.zoomFactors.length - 1)\n ? this.zoomFactors[i + 1].minScale\n : Number.MAX_VALUE\n\n // check if we've crossed into a new zoomFactor partition\n if ((!this.lastScale || this.lastScale < min || this.lastScale >= max) &&\n scale >= min && scale < max) {\n this.activeZoomFactors = this.zoomFactors[i]\n updated = true\n }\n }\n return updated\n}\n\n/**\n * Return default zoom factors\n */\n\nDisplay.prototype.getDefaultZoomFactors = function (data) {\n return [{\n minScale: 0,\n gridCellSize: 25,\n internalVertexFactor: 1000000,\n angleConstraint: 45,\n mergeVertexThreshold: 200\n }, {\n minScale: 1.5,\n gridCellSize: 0,\n internalVertexFactor: 0,\n angleConstraint: 5,\n mergeVertexThreshold: 0\n }]\n}\n\n/**\n * Empty the display\n */\n\nDisplay.prototype.empty = function () {\n debug('emptying svg')\n this.svg.selectAll('*').remove()\n\n this.haloLayer = this.svg.insert('g', ':first-child')\n}\n\n/**\n * Set the scale\n */\n\nDisplay.prototype.setScale = function (bounds, options) {\n this.height = this.el.clientHeight\n this.width = this.el.clientWidth\n\n var domains = getDomains(this, this.height, this.width, bounds, options)\n this.xScale.domain(domains[0])\n this.yScale.domain(domains[1])\n\n this.xScale.range([0, this.width])\n this.yScale.range([this.height, 0])\n\n debug('x scale %j -> %j', this.xScale.domain(), this.xScale.range())\n debug('y scale %j -> %j', this.yScale.domain(), this.yScale.range())\n\n this.zoom\n .x(this.xScale)\n .y(this.yScale)\n\n this.initXRes = (domains[0][1] - domains[0][0]) / this.width\n this.scale = 1\n\n this.scaleSet = true\n}\n\nDisplay.prototype.computeScale = function () {\n var newXRes = (this.xScale.domain()[1] - this.xScale.domain()[0]) / this.width\n this.scale = this.initXRes / newXRes\n}\n\n/**\n * updateDomains -- set x/y domains of geographic (spherical mercator) coordinate\n * system. Does *not* check/adjust aspect ratio.\n */\n\nDisplay.prototype.updateDomains = function (bounds) {\n this.xScale.domain([bounds[0][0], bounds[1][0]])\n this.yScale.domain([bounds[0][1], bounds[1][1]])\n\n this.zoom\n .x(this.xScale)\n .y(this.yScale)\n\n this.computeScale()\n}\n\nDisplay.prototype.resized = function () {\n var newWidth = this.el.clientWidth\n var newHeight = this.el.clientHeight\n\n var xDomain = this.xScale.domain()\n var xFactor = newWidth / this.width\n var xDomainAdj = (xDomain[1] - xDomain[0]) * (xFactor - 1) / 2\n this.xScale.domain([xDomain[0] - xDomainAdj, xDomain[1] + xDomainAdj])\n\n var yDomain = this.yScale.domain()\n var yFactor = newHeight / this.height\n var yDomainAdj = (yDomain[1] - yDomain[0]) * (yFactor - 1) / 2\n this.yScale.domain([yDomain[0] - yDomainAdj, yDomain[1] + yDomainAdj])\n\n this.xScale.range([0, newWidth])\n this.yScale.range([newHeight, 0])\n\n this.height = newHeight\n this.width = newWidth\n\n this.zoom\n .x(this.xScale)\n .y(this.yScale)\n}\n\nDisplay.prototype.xyBounds = function () {\n var x = this.xScale.domain()\n var y = this.yScale.domain()\n return [\n [x[0], y[0]],\n [x[1], y[1]]\n ]\n}\n\n/**\n * Lat/lon bounds\n */\n\nDisplay.prototype.llBounds = function () {\n var x = this.xScale.domain()\n var y = this.yScale.domain()\n\n return [\n sm.inverse([x[0], y[0]]),\n sm.inverse([x[1], y[1]])\n ]\n}\n\nDisplay.prototype.isInRange = function (x, y) {\n var xRange = this.xScale.range()\n var yRange = this.yScale.range()\n\n return x >= xRange[0] && x <= xRange[1] && y >= yRange[1] && y <= yRange[0]\n}\n\n/**\n * Compute the x/y coordinate space domains to fit the graph.\n */\n\nfunction getDomains (display, height, width, bounds, options) {\n var xmin = bounds[0][0]\n var xmax = bounds[1][0]\n var ymin = bounds[0][1]\n var ymax = bounds[1][1]\n var xRange = xmax - xmin\n var yRange = ymax - ymin\n\n var paddingFactor = (options && options.paddingFactor)\n ? options.paddingFactor\n : 0.1\n\n var margins = getMargins(options)\n\n var usableHeight = height - margins.top - margins.bottom\n var usableWidth = width - margins.left - margins.right\n var displayAspect = width / height\n var usableDisplayAspect = usableWidth / usableHeight\n var graphAspect = xRange / (yRange === 0 ? -Infinity : yRange)\n\n var padding\n var dispX1, dispX2, dispY1, dispY2\n var dispXRange, dispYRange\n\n if (usableDisplayAspect > graphAspect) { // y-axis is limiting\n padding = paddingFactor * yRange\n dispY1 = ymin - padding\n dispY2 = ymax + padding\n dispYRange = yRange + 2 * padding\n var addedYRange = (height / usableHeight * dispYRange) - dispYRange\n if (margins.top > 0 || margins.bottom > 0) {\n dispY1 -= margins.bottom / (margins.bottom + margins.top) * addedYRange\n dispY2 += margins.top / (margins.bottom + margins.top) * addedYRange\n }\n dispXRange = (dispY2 - dispY1) * displayAspect\n var xOffset = (margins.left - margins.right) / width\n var xMidpoint = (xmax + xmin - dispXRange * xOffset) / 2\n dispX1 = xMidpoint - dispXRange / 2\n dispX2 = xMidpoint + dispXRange / 2\n } else { // x-axis limiting\n padding = paddingFactor * xRange\n dispX1 = xmin - padding\n dispX2 = xmax + padding\n dispXRange = xRange + 2 * padding\n var addedXRange = (width / usableWidth * dispXRange) - dispXRange\n if (margins.left > 0 || margins.right > 0) {\n dispX1 -= margins.left / (margins.left + margins.right) * addedXRange\n dispX2 += margins.right / (margins.left + margins.right) * addedXRange\n }\n\n dispYRange = (dispX2 - dispX1) / displayAspect\n var yOffset = (margins.bottom - margins.top) / height\n var yMidpoint = (ymax + ymin - dispYRange * yOffset) / 2\n dispY1 = yMidpoint - dispYRange / 2\n dispY2 = yMidpoint + dispYRange / 2\n }\n\n return [\n [dispX1, dispX2],\n [dispY1, dispY2]\n ]\n}\n\nfunction getMargins (options) {\n var margins = {\n left: 0,\n right: 0,\n top: 0,\n bottom: 0\n }\n\n if (options && options.displayMargins) {\n if (options.displayMargins.top) margins.top = options.displayMargins.top\n if (options.displayMargins.bottom) margins.bottom = options.displayMargins.bottom\n if (options.displayMargins.left) margins.left = options.displayMargins.left\n if (options.displayMargins.right) margins.right = options.displayMargins.right\n }\n\n return margins\n}\n", + "var d3 = require('d3')\n\nvar RenderedEdge = require('../renderer/renderededge')\nvar RenderedSegment = require('../renderer/renderedsegment')\nvar Util = require('../util')\nvar Stop = require('../point/stop')\n\n/**\n * Expose `Legend`\n */\n\nmodule.exports = Legend\n\nfunction Legend (el, display, transitive) {\n this.el = el\n this.display = display\n this.transitive = transitive\n\n this.height = Util.parsePixelStyle(d3.select(el).style('height'))\n}\n\nLegend.prototype.render = function (legendSegments) {\n d3.select(this.el).selectAll(':not(.doNotEmpty)').remove()\n\n this.x = this.spacing\n this.y = this.height / 2\n\n var segment\n\n // iterate through the representative map segments\n for (var legendType in legendSegments) {\n var mapSegment = legendSegments[legendType]\n\n // create a segment solely for rendering in the legend\n segment = new RenderedSegment()\n segment.type = mapSegment.getType()\n segment.mode = mapSegment.mode\n segment.patterns = mapSegment.patterns\n\n var canvas = this.createCanvas()\n\n var renderData = []\n renderData.push({\n x: 0,\n y: canvas.height / 2\n })\n renderData.push({\n x: canvas.width,\n y: canvas.height / 2\n })\n\n segment.render(canvas)\n segment.refresh(canvas, renderData)\n\n this.renderText(getDisplayText(legendType))\n\n this.x += this.spacing * 2\n }\n\n // create the 'transfer' marker\n\n var rEdge = new RenderedEdge(null, true, 'TRANSIT')\n rEdge.pattern = {\n pattern_id: 'ptn',\n route: {\n route_type: 1\n }\n }\n\n var transferStop = new Stop()\n transferStop.isSegmentEndPoint = true\n transferStop.isTransferPoint = true\n\n this.renderPoint(transferStop, rEdge, 'Transfer')\n}\n\nLegend.prototype.renderPoint = function (point, rEdge, text) {\n var canvas = this.createCanvas()\n\n point.addRenderData({\n owner: point,\n rEdge: rEdge,\n x: canvas.width / 2,\n y: canvas.height / 2,\n offsetX: 0,\n offsetY: 0\n })\n\n point.render(canvas)\n\n canvas.styler.stylePoint(canvas, point)\n point.refresh(canvas)\n\n this.renderText(text)\n}\n\nLegend.prototype.renderText = function (text) {\n d3.select(this.el).append('div')\n .attr('class', 'legendLabel')\n .html(text)\n}\n\nLegend.prototype.createCanvas = function () {\n var container = d3.select(this.el).append('div')\n .attr('class', 'legendSvg')\n\n var width = Util.parsePixelStyle(container.style('width'))\n if (!width || width === 0) width = 30\n\n var height = Util.parsePixelStyle(container.style('height'))\n if (!height || height === 0) height = this.height\n\n var canvas = {\n xScale: d3.scale.linear(),\n yScale: d3.scale.linear(),\n styler: this.transitive.styler,\n zoom: this.display.zoom,\n width: width,\n height: height,\n svg: container.append('svg')\n .style('width', width)\n .style('height', height)\n }\n\n return canvas\n}\n\nfunction getDisplayText (type) {\n switch (type) {\n case 'WALK':\n return 'Walk'\n case 'BICYCLE':\n return 'Bike'\n case 'CAR':\n return 'Drive'\n case 'TRANSIT_0':\n return 'Tram'\n case 'TRANSIT_1':\n return 'Metro'\n case 'TRANSIT_2':\n return 'Rail'\n case 'TRANSIT_3':\n return 'Bus'\n case 'TRANSIT_4':\n return 'Ferry'\n }\n return type\n}\n", + "var d3 = require('d3')\nvar debug = require('debug')('transitive:tile-layer')\n\nvar geoTile = require('./d3.geo.tile')\n\nvar prefix = prefixMatch(['webkit', 'ms', 'Moz', 'O'])\n\n/**\n * Tile layer takes a parent element, a zoom behavior, and a Mapbox ID\n *\n * @param {Object} opts\n */\n\nmodule.exports = function TileLayer (opts) {\n debug('creating the tile layer')\n\n var el = opts.el\n var display = opts.display\n var height = el.clientHeight\n var id = opts.mapboxId\n var width = el.clientWidth\n\n // Set up the projection\n var projection = d3.geo.mercator()\n .translate([width / 2, height / 2])\n\n // Set up the map tiles\n var tile = geoTile()\n\n // Create the tile layer\n var tileLayer = d3.select(el)\n .append('div')\n .attr('class', 'tile-layer')\n\n // Initial zoom\n zoomed()\n\n this.zoomed = zoomed\n\n // Reload tiles on pan and zoom\n function zoomed () {\n // Get the height and width\n height = el.clientHeight\n width = el.clientWidth\n\n // Set the map tile size\n tile.size([width, height])\n\n // Get the current display bounds\n var bounds = display.llBounds()\n\n // Project the bounds based on the current projection\n var psw = projection(bounds[0])\n var pne = projection(bounds[1])\n\n // Based the new scale and translation vector off the current one\n var scale = projection.scale() * 2 * Math.PI\n var translate = projection.translate()\n\n var dx = pne[0] - psw[0]\n var dy = pne[1] - psw[1]\n\n scale = scale * (1 / Math.max(dx / width, dy / height))\n projection\n .translate([width / 2, height / 2])\n .scale(scale / 2 / Math.PI)\n\n // Reproject the bounds based on the new scale and translation vector\n psw = projection(bounds[0])\n pne = projection(bounds[1])\n var x = (psw[0] + pne[0]) / 2\n var y = (psw[1] + pne[1]) / 2\n translate = [width - x, height - y]\n\n // Update the Geo tiles\n tile\n .scale(scale)\n .translate(translate)\n\n // Get the new set of tiles and render\n renderTiles(tile())\n }\n\n // Render tiles\n function renderTiles (tiles) {\n var image = tileLayer\n .style(prefix + 'transform', matrix3d(tiles.scale, tiles.translate))\n .selectAll('.tile')\n .data(tiles, function (d) {\n return d\n })\n\n image.exit()\n .remove()\n\n image.enter().append('img')\n .attr('class', 'tile')\n .attr('src', function (d) {\n return 'http://' + ['a', 'b', 'c', 'd'][Math.random() * 4 | 0] +\n '.tiles.mapbox.com/v3/' + id + '/' + d[2] + '/' + d[0] +\n '/' + d[1] + '.png'\n })\n .style('left', function (d) {\n return (d[0] << 8) + 'px'\n })\n .style('top', function (d) {\n return (d[1] << 8) + 'px'\n })\n }\n}\n\n/**\n * Get the 3D Transform Matrix\n */\n\nfunction matrix3d (scale, translate) {\n var k = scale / 256\n var r = scale % 1 ? Number : Math.round\n return 'matrix3d(' + [k, 0, 0, 0, 0, k, 0, 0, 0, 0, k, 0, r(translate[0] *\n scale), r(translate[1] * scale), 0, 1] + ')'\n}\n\n/**\n * Match the transform prefix\n */\n\nfunction prefixMatch (p) {\n var i = -1\n var n = p.length\n var s = document.body.style\n while (++i < n) {\n if (p[i] + 'Transform' in s) return '-' + p[i].toLowerCase() + '-'\n }\n return ''\n}\n", + "var each = require('component-each')\n\nvar Util = require('../util')\n\n/**\n * Expose `Edge`\n */\n\nmodule.exports = Edge\n\n/**\n * Initialize a new edge\n * @constructor\n * @param {Point[]} pointArray - the internal Points for this Edge\n * @param {Vertex} fromVertex\n * @param {Vertex} toVertex\n */\n\nvar edgeId = 0\n\nfunction Edge (pointArray, fromVertex, toVertex) {\n this.id = edgeId++\n this.pointArray = pointArray\n this.fromVertex = fromVertex\n this.toVertex = toVertex\n this.pathSegments = []\n this.renderedEdges = []\n}\n\nEdge.prototype.getId = function () {\n return this.id\n}\n\n/**\n *\n */\n\nEdge.prototype.getLength = function () {\n var dx = this.toVertex.x - this.fromVertex.x\n var dy = this.toVertex.y - this.fromVertex.y\n return Math.sqrt(dx * dx + dy * dy)\n}\n\nEdge.prototype.getWorldLength = function () {\n if (!this.worldLength) this.calculateWorldLengthAndMidpoint()\n return this.worldLength\n}\n\nEdge.prototype.getWorldMidpoint = function () {\n if (!this.worldMidpoint) this.calculateWorldLengthAndMidpoint()\n return this.worldMidpoint\n}\n\nEdge.prototype.calculateWorldLengthAndMidpoint = function () {\n var allPoints = [this.fromVertex.point].concat(this.pointArray, [this.toVertex\n .point\n ])\n this.worldLength = 0\n for (var i = 0; i < allPoints.length - 1; i++) {\n this.worldLength += Util.distance(allPoints[i].worldX, allPoints[i].worldY,\n allPoints[i + 1].worldX, allPoints[i + 1].worldY)\n }\n\n if (this.worldLength === 0) {\n this.worldMidpoint = {\n x: this.fromVertex.point.worldX,\n y: this.fromVertex.point.worldY\n }\n } else {\n var distTraversed = 0\n for (i = 0; i < allPoints.length - 1; i++) {\n var dist = Util.distance(allPoints[i].worldX, allPoints[i].worldY,\n allPoints[i + 1].worldX, allPoints[i + 1].worldY)\n if ((distTraversed + dist) / this.worldLength >= 0.5) {\n // find the position along this segment (0 <= t <= 1) where the edge midpoint lies\n var t = (0.5 - distTraversed / this.worldLength) / (dist / this.worldLength)\n this.worldMidpoint = {\n x: allPoints[i].worldX + t * (allPoints[i + 1].worldX - allPoints[i].worldX),\n y: allPoints[i].worldY + t * (allPoints[i + 1].worldY - allPoints[i].worldY)\n }\n this.pointsBeforeMidpoint = i\n this.pointsAfterMidpoint = this.pointArray.length - i\n break\n }\n distTraversed += dist\n }\n }\n}\n\n/**\n *\n */\n\nEdge.prototype.isAxial = function () {\n return (this.toVertex.x === this.fromVertex.x) || (this.toVertex.y === this.fromVertex\n .y)\n}\n\n/**\n *\n */\n\nEdge.prototype.hasCurvature = function () {\n return this.elbow !== null\n}\n\n/**\n *\n */\n\nEdge.prototype.replaceVertex = function (oldVertex, newVertex) {\n if (oldVertex === this.fromVertex) this.fromVertex = newVertex\n if (oldVertex === this.toVertex) this.toVertex = newVertex\n}\n\n/**\n * Add a path segment that traverses this edge\n */\n\nEdge.prototype.addPathSegment = function (segment) {\n this.pathSegments.push(segment)\n}\n\nEdge.prototype.copyPathSegments = function (baseEdge) {\n each(baseEdge.pathSegments, function (pathSegment) {\n this.addPathSegment(pathSegment)\n }, this)\n}\n\nEdge.prototype.getPathSegmentIds = function (baseEdge) {\n var pathSegIds = []\n each(this.pathSegments, function (segment) {\n pathSegIds.push(segment.id)\n })\n pathSegIds.sort()\n return pathSegIds.join(',')\n}\n\n/**\n *\n */\n\nEdge.prototype.addRenderedEdge = function (rEdge) {\n if (this.renderedEdges.indexOf(rEdge) !== -1) return\n this.renderedEdges.push(rEdge)\n}\n\n/** internal geometry functions **/\n\nEdge.prototype.calculateGeometry = function (cellSize, angleConstraint) {\n // if(!this.hasTransit()) angleConstraint = 5;\n angleConstraint = angleConstraint || 45\n\n this.angleConstraintR = angleConstraint * Math.PI / 180\n\n this.fx = this.fromVertex.point.worldX\n this.fy = this.fromVertex.point.worldY\n this.tx = this.toVertex.point.worldX\n this.ty = this.toVertex.point.worldY\n\n var midpoint = this.getWorldMidpoint()\n\n var targetFromAngle = Util.getVectorAngle(midpoint.x - this.fx, midpoint.y -\n this.fy)\n this.constrainedFromAngle = Math.round(targetFromAngle / this.angleConstraintR) *\n this.angleConstraintR\n\n var fromAngleDelta = Math.abs(this.constrainedFromAngle - targetFromAngle)\n this.fvx = Math.cos(this.constrainedFromAngle)\n this.fvy = Math.sin(this.constrainedFromAngle)\n\n var targetToAngle = Util.getVectorAngle(midpoint.x - this.tx, midpoint.y -\n this.ty)\n\n this.constrainedToAngle = Math.round(targetToAngle / this.angleConstraintR) *\n this.angleConstraintR\n\n var toAngleDelta = Math.abs(this.constrainedToAngle - targetToAngle)\n this.tvx = Math.cos(this.constrainedToAngle)\n this.tvy = Math.sin(this.constrainedToAngle)\n\n var tol = 0.01\n var v = Util.normalizeVector({\n x: (this.toVertex.x - this.fromVertex.x),\n y: (this.toVertex.y - this.fromVertex.y)\n })\n\n // check if we need to add curvature\n if (!equalVectors(this.fvx, this.fvy, -this.tvx, -this.tvy, tol) || !equalVectors(this.fvx, this.fvy, v.x, v.y, tol)) {\n // see if the default endpoint angles produce a valid intersection\n var isect = this.computeEndpointIntersection()\n\n if (isect.intersect) { // if so, compute the elbow and we're done\n this.elbow = {\n x: this.fx + isect.u * this.fvx,\n y: this.fy + isect.u * this.fvy\n }\n } else {\n // if not, adjust the two endpoint angles until they properly intersect\n\n // default test: compare angle adjustments (if significant difference)\n if (Math.abs(fromAngleDelta - toAngleDelta) > 0.087) {\n if (fromAngleDelta < toAngleDelta) {\n this.adjustToAngle()\n } else {\n this.adjustFromAngle()\n }\n } else { // secondary test: look at distribution of shapepoints\n if (this.pointsAfterMidpoint < this.pointsBeforeMidpoint) {\n this.adjustToAngle()\n } else {\n this.adjustFromAngle()\n }\n }\n }\n }\n\n this.fromAngle = this.constrainedFromAngle\n this.toAngle = this.constrainedToAngle\n\n this.calculateVectors()\n this.calculateAlignmentIds()\n}\n\n/**\n * Adjust the 'to' endpoint angle by rotating it increments of angleConstraintR\n * until a valid intersection between the from and to endpoint rays is achieved.\n */\n\nEdge.prototype.adjustToAngle = function () {\n var ccw = Util.ccw(this.fx, this.fy, (this.fx + this.fvx), (this.fy + this.fvy), this.tx, this.ty)\n var delta = (ccw > 0) ? this.angleConstraintR : -this.angleConstraintR\n var i = 0\n var isect\n while (i++ < 100) {\n this.constrainedToAngle += delta\n this.tvx = Math.cos(this.constrainedToAngle)\n this.tvy = Math.sin(this.constrainedToAngle)\n isect = this.computeEndpointIntersection()\n if (isect.intersect) break\n }\n this.elbow = {\n x: this.fx + isect.u * this.fvx,\n y: this.fy + isect.u * this.fvy\n }\n}\n\n/**\n * Adjust the 'from' endpoint angle by rotating it increments of angleConstraintR\n * until a valid intersection between the from and to endpoint rays is achieved.\n */\n\nEdge.prototype.adjustFromAngle = function () {\n var ccw = Util.ccw(this.tx, this.ty, (this.tx + this.tvx), (this.ty + this.tvy),\n this.fx, this.fy)\n var delta = (ccw > 0) ? this.angleConstraintR : -this.angleConstraintR\n var i = 0\n var isect\n while (i++ < 100) {\n this.constrainedFromAngle += delta\n this.fvx = Math.cos(this.constrainedFromAngle)\n this.fvy = Math.sin(this.constrainedFromAngle)\n isect = this.computeEndpointIntersection()\n if (isect.intersect) break\n }\n this.elbow = {\n x: this.fx + isect.u * this.fvx,\n y: this.fy + isect.u * this.fvy\n }\n}\n\nEdge.prototype.computeEndpointIntersection = function () {\n return Util.rayIntersection(this.fx, this.fy, this.fvx, this.fvy,\n this.tx, this.ty, this.tvx, this.tvy)\n}\n\nfunction equalVectors (x1, y1, x2, y2, tol) {\n tol = tol || 0\n return Math.abs(x1 - x2) < tol && Math.abs(y1 - y2) < tol\n}\n\nEdge.prototype.calculateVectors = function (fromAngle, toAngle) {\n this.fromVector = {\n x: Math.cos(this.fromAngle),\n y: Math.sin(this.fromAngle)\n }\n\n this.fromleftVector = {\n x: -this.fromVector.y,\n y: this.fromVector.x\n }\n\n this.fromRightVector = {\n x: this.fromVector.y,\n y: -this.fromVector.x\n }\n\n this.toVector = {\n x: Math.cos(this.toAngle + Math.PI),\n y: Math.sin(this.toAngle + Math.PI)\n }\n\n this.toleftVector = {\n x: -this.toVector.y,\n y: this.toVector.x\n }\n\n this.toRightVector = {\n x: this.toVector.y,\n y: -this.toVector.x\n }\n}\n\n/**\n * Compute the 'alignment id', a string that uniquely identifies a line in\n * 2D space given a point and angle relative to the x-axis.\n */\n\nEdge.prototype.calculateAlignmentId = function (x, y, angle) {\n var angleD = Math.round(angle * 180 / Math.PI)\n if (angleD > 90) angleD -= 180\n if (angleD <= -90) angleD += 180\n\n if (angleD === 90) {\n return '90_x' + x\n }\n\n // calculate the y-axis crossing\n var ya = Math.round(y - x * Math.tan(angle))\n return angleD + '_y' + ya\n}\n\nEdge.prototype.calculateAlignmentIds = function () {\n this.fromAlignmentId = this.calculateAlignmentId(this.fromVertex.x, this.fromVertex\n .y, this.fromAngle)\n this.toAlignmentId = this.calculateAlignmentId(this.toVertex.x, this.toVertex\n .y, this.toAngle)\n}\n\nEdge.prototype.hasTransit = function (cellSize) {\n // debug(this);\n for (var i = 0; i < this.pathSegments.length; i++) {\n if (this.pathSegments[i].getType() === 'TRANSIT') {\n return true\n }\n }\n return false\n}\n\nEdge.prototype.getFromAlignmentId = function () {\n return this.fromAlignmentId\n}\n\nEdge.prototype.getToAlignmentId = function () {\n return this.toAlignmentId\n}\n\nEdge.prototype.getAlignmentRange = function (alignmentId) {\n var p1, p2\n if (alignmentId === this.fromAlignmentId) {\n p1 = this.fromVertex\n p2 = this.elbow || this.toVertex\n } else if (alignmentId === this.toAlignmentId) {\n p1 = this.toVertex\n p2 = this.elbow || this.fromVertex\n } else {\n return null\n }\n\n var min, max\n if (alignmentId.substring(0, 2) === '90') {\n min = Math.min(p1.y, p2.y)\n max = Math.max(p1.y, p2.y)\n } else {\n min = Math.min(p1.x, p2.x)\n max = Math.max(p1.x, p2.x)\n }\n\n return {\n min: min,\n max: max\n }\n}\n\nEdge.prototype.align = function (vertex, vector) {\n if (this.aligned || !this.hasCurvature()) return\n var currentVector = this.getVector(vertex)\n if (Math.abs(currentVector.x) !== Math.abs(vector.x) || Math.abs(\n currentVector.y) !== Math.abs(vector.y)) {\n this.curveAngle = -this.curveAngle\n this.calculateGeometry()\n }\n this.aligned = true\n}\n\nEdge.prototype.getGeometricCoords = function (fromOffsetPx, toOffsetPx, display, forward) {\n var coords = []\n\n // reverse the coords array if needed\n var geomCoords = forward ? this.geomCoords : this.geomCoords.concat().reverse()\n\n each(geomCoords, function (coord, i) {\n var fromVector = null\n var toVector = null\n var rightVector\n var xOffset, yOffset\n var x1 = display.xScale(coord[0])\n var y1 = display.yScale(coord[1])\n\n // calculate the vector leading in to this coordinate\n if (i > 0) {\n var prevCoord = geomCoords[i - 1]\n var x0 = display.xScale(prevCoord[0])\n var y0 = display.yScale(prevCoord[1])\n if (x1 === x0 && y1 === y0) return\n\n toVector = {\n x: x1 - x0,\n y: y1 - y0\n }\n }\n\n // calculate the vector leading out from this coordinate\n if (i < geomCoords.length - 1) {\n var nextCoord = geomCoords[i + 1]\n var x2 = display.xScale(nextCoord[0])\n var y2 = display.yScale(nextCoord[1])\n if (x2 === x1 && y2 === y1) return\n\n fromVector = {\n x: x2 - x1,\n y: y2 - y1\n }\n }\n\n if (fromVector && !toVector) { // the first point in the geomCoords sequence\n rightVector = Util.normalizeVector({\n x: fromVector.y,\n y: -fromVector.x\n })\n xOffset = fromOffsetPx * rightVector.x\n yOffset = fromOffsetPx * rightVector.y\n } else if (!fromVector && toVector) { // the last point in the geomCoords sequence\n rightVector = Util.normalizeVector({\n x: toVector.y,\n y: -toVector.x\n })\n xOffset = fromOffsetPx * rightVector.x\n yOffset = fromOffsetPx * rightVector.y\n } else { // an internal point\n rightVector = Util.normalizeVector({\n x: fromVector.y,\n y: -fromVector.x\n })\n xOffset = fromOffsetPx * rightVector.x\n yOffset = fromOffsetPx * rightVector.y\n\n // TODO: properly compute the offsets based on both vectors\n }\n\n coords.push({\n x: x1 + xOffset,\n y: y1 + yOffset\n })\n }, this)\n return coords\n}\n\nEdge.prototype.getRenderCoords = function (fromOffsetPx, toOffsetPx, display, forward) {\n var isBase = (fromOffsetPx === 0 && toOffsetPx === 0)\n\n if (!this.baseRenderCoords && !isBase) {\n this.calculateBaseRenderCoords(display)\n }\n\n var fromOffsetX = fromOffsetPx * this.fromRightVector.x\n var fromOffsetY = fromOffsetPx * this.fromRightVector.y\n\n var toOffsetX = toOffsetPx * this.toRightVector.x\n var toOffsetY = toOffsetPx * this.toRightVector.y\n\n var fx = this.fromVertex.getRenderX(display) + fromOffsetX\n var fy = this.fromVertex.getRenderY(display) - fromOffsetY\n var fvx = this.fromVector.x\n var fvy = -this.fromVector.y\n\n var tx = this.toVertex.getRenderX(display) + toOffsetX\n var ty = this.toVertex.getRenderY(display) - toOffsetY\n var tvx = -this.toVector.x\n var tvy = this.toVector.y\n\n var coords = []\n\n // append the first ('from') coordinate\n coords.push({\n x: forward ? fx : tx,\n y: forward ? fy : ty\n })\n\n var len = null\n var x1\n var y1\n var x2\n var y2\n\n // determine if this edge has an elbow, i.e. a bend in the middle\n if ((isBase && !this.isStraight()) || (!isBase && this.baseRenderCoords.length ===\n 4)) {\n var isect = Util.rayIntersection(fx, fy, fvx, fvy, tx, ty, tvx, tvy)\n if (isect.intersect) {\n var u = isect.u\n var ex = fx + fvx * u\n var ey = fy + fvy * u\n\n this.ccw = Util.ccw(fx, fy, ex, ey, tx, ty)\n\n // calculate the angle of the arc\n var angleR = this.getElbowAngle()\n\n // calculate the radius of the arc in pixels, taking offsets into consideration\n var rPx = this.getBaseRadiusPx() - this.ccw * (fromOffsetPx + toOffsetPx) /\n 2\n\n // calculate the distance from the elbow to place the arc endpoints in each direction\n var d = rPx * Math.tan(angleR / 2)\n\n // make sure the arc endpoint placement distance is not longer than the either of the\n // elbow-to-edge-endpoint distances\n var l1 = Util.distance(fx, fy, ex, ey)\n var l2 = Util.distance(tx, ty, ex, ey)\n d = Math.min(Math.min(l1, l2), d)\n\n x1 = ex - this.fromVector.x * d\n y1 = ey + this.fromVector.y * d\n\n x2 = ex + this.toVector.x * d\n y2 = ey - this.toVector.y * d\n\n var radius = Util.getRadiusFromAngleChord(angleR, Util.distance(x1, y1,\n x2, y2))\n var arc = angleR * (180 / Math.PI) * (this.ccw < 0 ? 1 : -1)\n\n if (forward) {\n coords.push({\n x: x1,\n y: y1,\n len: Util.distance(fx, fy, x1, y1)\n })\n\n coords.push({\n x: x2,\n y: y2,\n len: angleR * radius,\n arc: arc,\n radius: radius\n })\n\n len = Util.distance(x2, y2, tx, ty)\n } else { // backwards traversal\n coords.push({\n x: x2,\n y: y2,\n len: Util.distance(tx, ty, x2, y2)\n })\n\n coords.push({\n x: x1,\n y: y1,\n len: angleR * radius,\n arc: -arc,\n radius: radius\n })\n\n len = Util.distance(x1, y1, fx, fy)\n }\n }\n }\n\n // if the length wasn't calculated during elbow-creation, do it now\n if (len === null) len = Util.distance(fx, fy, tx, ty)\n\n // append the final ('to') coordinate\n coords.push({\n x: forward ? tx : fx,\n y: forward ? ty : fy,\n len: len\n })\n\n return coords\n}\n\nEdge.prototype.calculateBaseRenderCoords = function (display) {\n this.baseRenderCoords = this.getRenderCoords(0, 0, display, true)\n}\n\nEdge.prototype.isStraight = function () {\n var tol = 0.00001\n return (Math.abs(this.fromVector.x - this.toVector.x) < tol &&\n Math.abs(this.fromVector.y - this.toVector.y) < tol)\n}\n\nEdge.prototype.getBaseRadiusPx = function () {\n return 15\n}\n\nEdge.prototype.getElbowAngle = function () {\n var cx = this.fromVector.x - this.toVector.x\n var cy = this.fromVector.y - this.toVector.y\n\n var c = Math.sqrt(cx * cx + cy * cy) / 2\n\n var theta = Math.asin(c)\n\n return theta * 2\n}\n\nEdge.prototype.getRenderLength = function (display) {\n if (!this.baseRenderCoords) this.calculateBaseRenderCoords(display)\n\n if (!this.renderLength) {\n this.renderLength = 0\n for (var i = 1; i < this.baseRenderCoords.length; i++) {\n this.renderLength += this.baseRenderCoords[i].len\n }\n }\n return this.renderLength\n}\n\n/**\n * Retrieve the coordinate located at a defined percentage along an Edge's length.\n * @param {Number} t - a value between 0 and 1 representing the location of the\n * point to be computed\n * @param {Object[]} coords - the offset coordinates computed for this edge.\n * @param {Display} display\n * @returns {Object} - the coordinate as an {x,y} Object\n */\n\nEdge.prototype.coordAlongEdge = function (t, coords, display) {\n if (!this.baseRenderCoords) {\n this.calculateBaseRenderCoords(display)\n }\n\n if (coords.length !== this.baseRenderCoords.length) {\n return this.coordAlongOffsetEdge(t, coords, display)\n }\n\n // get the length of this edge in screen units using the \"base\" (i.e. un-offset) render coords\n var len = this.getRenderLength()\n\n var loc = t * len // the target distance along the Edge's base geometry\n var cur = 0 // our current location along the edge (in world units)\n\n for (var i = 1; i < this.baseRenderCoords.length; i++) {\n if (loc < cur + this.baseRenderCoords[i].len) {\n var t2 = (loc - cur) / this.baseRenderCoords[i].len\n\n if (coords[i].arc) {\n var r = coords[i].radius\n var theta = Math.PI * coords[i].arc / 180\n var ccw = Util.ccw(coords[0].x, coords[0].y, coords[1].x, coords[1].y,\n coords[2].x, coords[2].y)\n\n return Util.pointAlongArc(coords[1].x, coords[1].y, coords[2].x, coords[2].y, r, theta, ccw, t2)\n } else {\n var dx = coords[i].x - coords[i - 1].x\n var dy = coords[i].y - coords[i - 1].y\n\n return {\n x: coords[i - 1].x + dx * t2,\n y: coords[i - 1].y + dy * t2\n }\n }\n }\n cur += this.baseRenderCoords[i].len\n }\n}\n\nEdge.prototype.coordAlongOffsetEdge = function (t, coords, display) {\n if (!this.baseRenderCoords) this.calculateBaseRenderCoords(display)\n\n var len = 0\n for (var i = 1; i < coords.length; i++) {\n len += coords[i].len\n }\n\n var loc = t * len // the target distance along the Edge's base geometry\n var cur = 0 // our current location along the edge (in world units)\n\n for (i = 1; i < coords.length; i++) {\n if (loc < cur + coords[i].len) {\n var t2 = (loc - cur) / coords[i].len\n\n if (coords[i].arc) { // arc segment\n var r = coords[i].radius\n var theta = Math.PI * coords[i].arc / 180\n var ccw = Util.ccw(coords[0].x, coords[0].y, coords[1].x, coords[1].y,\n coords[2].x, coords[2].y)\n\n return Util.pointAlongArc(coords[1].x, coords[1].y, coords[2].x, coords[2].y, r, theta, ccw, t2)\n } else { // straight segment\n var dx = coords[i].x - coords[i - 1].x\n var dy = coords[i].y - coords[i - 1].y\n\n return {\n x: coords[i - 1].x + dx * t2,\n y: coords[i - 1].y + dy * t2\n }\n }\n }\n cur += coords[i].len\n }\n}\n\nEdge.prototype.clearRenderData = function () {\n this.baseRenderCoords = null\n this.renderLength = null\n}\n\nEdge.prototype.getVector = function (vertex) {\n if (vertex === this.fromVertex) return this.fromVector\n if (vertex === this.toVertex) return this.toVector\n}\n\n/**\n * Gets the vertex opposite another vertex on an edge\n */\n\nEdge.prototype.oppositeVertex = function (vertex) {\n if (vertex === this.toVertex) return this.fromVertex\n if (vertex === this.fromVertex) return this.toVertex\n return null\n}\n\nEdge.prototype.commonVertex = function (edge) {\n if (this.fromVertex === edge.fromVertex || this.fromVertex === edge.toVertex) return this.fromVertex\n if (this.toVertex === edge.fromVertex || this.toVertex === edge.toVertex) return this.toVertex\n return null\n}\n\n/**\n *\n */\n\nEdge.prototype.setPointLabelPosition = function (pos, skip) {\n if (this.fromVertex.point !== skip) this.fromVertex.point.labelPosition = pos\n if (this.toVertex.point !== skip) this.toVertex.point.labelPosition = pos\n\n this.pointArray.forEach(function (point) {\n if (point !== skip) point.labelPosition = pos\n })\n}\n\n/**\n * Determines if this edge is part of a standalone, non-transit path\n * (e.g. a walk/bike/drive-only journey)\n */\n\nEdge.prototype.isNonTransitPath = function () {\n return this.pathSegments.length === 1 && this.pathSegments[0] !== 'TRANSIT' &&\n this.pathSegments[0].path.segments.length === 1\n}\n\n/**\n *\n */\n\nEdge.prototype.toString = function () {\n return 'Edge ' + this.getId() + ' (' + this.fromVertex.toString() + ' to ' +\n this.toVertex.toString() + ')'\n}\n", + "var each = require('component-each')\nvar PriorityQueue = require('priorityqueuejs')\n\nvar Util = require('../util')\n\n/**\n * Expose `EdgeGroup`\n */\n\nmodule.exports = EdgeGroup\n\n/**\n * A group of edges that share the same endpoint vertices\n */\n\nfunction EdgeGroup (fromVertex, toVertex, type) {\n this.fromVertex = fromVertex\n this.toVertex = toVertex\n this.type = type\n this.edges = []\n this.commonPoints = null\n this.worldLength = 0\n}\n\nEdgeGroup.prototype.addEdge = function (edge) {\n this.edges.push(edge)\n edge.edgeGroup = this\n\n // update the groups worldLength\n this.worldLength = Math.max(this.worldLength, edge.getWorldLength())\n\n if (this.commonPoints === null) { // if this is first edge added, initialize group's commonPoint array to include all of edge's points\n this.commonPoints = []\n each(edge.pointArray, function (point) {\n this.commonPoints.push(point)\n }, this)\n } else { // otherwise, update commonPoints array to only include those in added edge\n var newCommonPoints = []\n each(edge.pointArray, function (point) {\n if (this.commonPoints.indexOf(point) !== -1) newCommonPoints.push(point)\n }, this)\n this.commonPoints = newCommonPoints\n }\n}\n\nEdgeGroup.prototype.getWorldLength = function () {\n return this.worldLength\n}\n\nEdgeGroup.prototype.getInternalVertexPQ = function () {\n // create an array of all points on the edge (endpoints and internal)\n var allPoints = ([this.fromVertex.point]).concat(this.commonPoints, [this.toVertex\n .point\n ])\n\n var pq = new PriorityQueue(function (a, b) {\n return a.weight - b.weight\n })\n\n for (var i = 1; i < allPoints.length - 1; i++) {\n var weight = this.getInternalVertexWeight(allPoints, i)\n pq.enq({\n weight: weight,\n point: allPoints[i]\n })\n }\n\n return pq\n}\n\nEdgeGroup.prototype.getInternalVertexWeight = function (pointArray, index) {\n var x1 = pointArray[index - 1].worldX\n var y1 = pointArray[index - 1].worldY\n var x2 = pointArray[index].worldX\n var y2 = pointArray[index].worldY\n var x3 = pointArray[index + 1].worldX\n var y3 = pointArray[index + 1].worldY\n\n // the weighting function is a combination of:\n // - the distances from this internal point to the two adjacent points, normalized for edge length (longer distances are prioritized)\n // - the angle formed by this point and the two adjacent ones ('sharper' angles are prioritized)\n var inDist = Util.distance(x1, y1, x2, y2)\n var outDist = Util.distance(x2, y2, x3, y3)\n var theta = Util.angleFromThreePoints(x1, y1, x2, y2, x3, y3)\n var edgeLen = this.getWorldLength()\n var weight = inDist / edgeLen + outDist / edgeLen + Math.abs(Math.PI - theta) / Math.PI\n\n return weight\n}\n\nEdgeGroup.prototype.hasTransit = function () {\n for (var i = 0; i < this.edges.length; i++) {\n if (this.edges[i].hasTransit()) return true\n }\n return false\n}\n\nEdgeGroup.prototype.isNonTransitPath = function () {\n return (this.edges.length === 1 && this.edges[0].isNonTransitPath())\n}\n\nEdgeGroup.prototype.getTurnPoints = function (maxAngle) {\n var points = []\n maxAngle = maxAngle || 0.75 * Math.PI\n each(this.commonPoints, function (point) {\n if (point.getType() !== 'TURN') return\n if (Math.abs(point.turnAngle) < maxAngle) {\n points.push(point)\n }\n })\n return points\n}\n", + "var d3 = require('d3')\nvar debug = require('debug')('transitive:graph')\nvar each = require('component-each')\n\nvar Edge = require('./edge')\nvar EdgeGroup = require('./edgegroup')\nvar Vertex = require('./vertex')\nvar MultiPoint = require('../point/multipoint')\nvar Util = require('../util')\n\n/**\n * Expose `NetworkGraph`\n */\n\nmodule.exports = NetworkGraph\n\n/**\n * An graph representing the underlying 'wireframe' network\n */\n\nfunction NetworkGraph (network, vertices) {\n this.network = network\n this.edges = []\n this.vertices = []\n\n /**\n * Object mapping groups of edges that share the same two vertices.\n * - Key is string of format A_B, where A and B are vertex IDs and A < B\n * - Value is array of edges\n */\n this.edgeGroups = {}\n\n // Add all base vertices\n for (var i in vertices) this.addVertex(vertices[i], vertices[i].worldX, vertices[i].worldY)\n}\n\n/**\n * Get the bounds of the graph in the graph's internal x/y coordinate space\n *\n * @return [[left, top], [right, bottom]]\n */\n\nNetworkGraph.prototype.bounds = function () {\n var xmax = null\n var xmin = null\n var ymax = null\n var ymin = null\n\n for (var i in this.vertices) {\n var vertex = this.vertices[i]\n xmin = xmin ? Math.min(xmin, vertex.x) : vertex.x\n xmax = xmax ? Math.max(xmax, vertex.x) : vertex.x\n ymin = ymin ? Math.min(ymin, vertex.y) : vertex.y\n ymax = ymax ? Math.max(ymax, vertex.y) : vertex.y\n }\n\n var maxExtent = 20037508.34\n return [\n [xmin || -maxExtent, ymin || -maxExtent],\n [xmax || maxExtent, ymax || maxExtent]\n ]\n}\n\n/**\n * Add Vertex\n */\n\nNetworkGraph.prototype.addVertex = function (point, x, y) {\n if (x === undefined || y === undefined) {\n var xy = Util.latLonToSphericalMercator(point.getLat(), point.getLon())\n x = xy[0]\n y = xy[1]\n }\n var vertex = new Vertex(point, x, y)\n this.vertices.push(vertex)\n return vertex\n}\n\n/**\n * Add Edge\n */\n\nNetworkGraph.prototype.addEdge = function (stops, from, to, segmentType) {\n if (this.vertices.indexOf(from) === -1 || this.vertices.indexOf(to) === -1) {\n debug('Error: Cannot add edge. Graph does not contain vertices.')\n return\n }\n\n var edge = new Edge(stops, from, to)\n this.edges.push(edge)\n from.edges.push(edge)\n to.edges.push(edge)\n\n var groupKey = this.network.transitive.options.groupEdges\n ? this.getEdgeGroupKey(edge, segmentType)\n : edge.getId()\n\n if (!(groupKey in this.edgeGroups)) {\n this.edgeGroups[groupKey] = new EdgeGroup(edge.fromVertex, edge.toVertex,\n segmentType)\n }\n this.edgeGroups[groupKey].addEdge(edge)\n\n return edge\n}\n\nNetworkGraph.prototype.removeEdge = function (edge) {\n // remove from the graph's edge collection\n var edgeIndex = this.edges.indexOf(edge)\n if (edgeIndex !== -1) this.edges.splice(edgeIndex, 1)\n\n // remove from any associated path segment edge lists\n edge.pathSegments.forEach(function (segment) {\n segment.removeEdge(edge)\n })\n\n // remove from the endpoint vertex incidentEdge collections\n edge.fromVertex.removeEdge(edge)\n edge.toVertex.removeEdge(edge)\n}\n\nNetworkGraph.prototype.getEdgeGroup = function (edge) {\n return this.edgeGroups[this.getEdgeGroupKey(edge)]\n}\n\nNetworkGraph.prototype.getEdgeGroupKey = function (edge, segmentType) {\n return edge.fromVertex.getId() < edge.toVertex.getId()\n ? segmentType + '_' + edge.fromVertex.getId() + '_' + edge.toVertex.getId()\n : segmentType + '_' + edge.toVertex.getId() + '_' + edge.fromVertex.getId()\n}\n\nNetworkGraph.prototype.mergeVertices = function (vertexArray) {\n var xTotal = 0\n var yTotal = 0\n\n var vertexGroups = {\n 'STOP': [],\n 'PLACE': [],\n 'TURN': [],\n 'MULTI': []\n }\n vertexArray.forEach(function (vertex) {\n if (vertex.point.getType() in vertexGroups) vertexGroups[vertex.point.getType()].push(vertex)\n })\n\n var mergePoint\n\n // don't merge stops and places, or multiple places:\n if ((vertexGroups.STOP.length > 0 && vertexGroups.PLACE.length > 0) ||\n vertexGroups.PLACE.length > 1 ||\n vertexGroups.MULTI.length > 0) return\n\n // if merging turns with a place, create a new merged vertex around the place\n if (vertexGroups.PLACE.length === 1 && vertexGroups.TURN.length > 0) {\n mergePoint = vertexGroups.PLACE[0].point\n // if merging turns with a single place, create a new merged vertex around the stop\n } else if (vertexGroups.STOP.length === 1 && vertexGroups.TURN.length > 0) {\n mergePoint = vertexGroups.STOP[0].point\n // if merging multiple stops, create a new MultiPoint vertex\n } else if (vertexGroups.STOP.length > 1) {\n mergePoint = new MultiPoint()\n each(vertexGroups.STOP, function (stopVertex) {\n mergePoint.addPoint(stopVertex.point)\n })\n // if merging multiple turns\n } else if (vertexGroups.TURN.length > 1) {\n mergePoint = vertexGroups.TURN[0].point\n }\n\n if (!mergePoint) return\n var mergedVertex = new Vertex(mergePoint, 0, 0)\n\n vertexArray.forEach(function (vertex) {\n xTotal += vertex.x\n yTotal += vertex.y\n\n var edges = []\n each(vertex.edges, function (edge) {\n edges.push(edge)\n })\n\n each(edges, function (edge) {\n if (vertexArray.indexOf(edge.fromVertex) !== -1 && vertexArray.indexOf(\n edge.toVertex) !== -1) {\n this.removeEdge(edge)\n return\n }\n edge.replaceVertex(vertex, mergedVertex)\n mergedVertex.addEdge(edge)\n }, this)\n var index = this.vertices.indexOf(vertex)\n if (index !== -1) this.vertices.splice(index, 1)\n }, this)\n\n mergedVertex.x = xTotal / vertexArray.length\n mergedVertex.y = yTotal / vertexArray.length\n mergedVertex.oldVertices = vertexArray\n\n this.vertices.push(mergedVertex)\n}\n\nNetworkGraph.prototype.sortVertices = function () {\n this.vertices.sort(function (a, b) {\n if (a.point && a.point.getType() === 'PLACE') return -1\n if (b.point && b.point.getType() === 'PLACE') return 1\n\n if (a.point && a.point.getType() === 'MULTI') return -1\n if (b.point && b.point.getType() === 'MULTI') return 1\n\n if (a.point && a.point.getType() === 'STOP') return -1\n if (b.point && b.point.getType() === 'STOP') return 1\n })\n}\n\n/**\n * Get the equivalent edge\n */\n\nNetworkGraph.prototype.getEquivalentEdge = function (pointArray, from, to) {\n for (var e = 0; e < this.edges.length; e++) {\n var edge = this.edges[e]\n if (edge.fromVertex === from && edge.toVertex === to && pointArray.length ===\n edge.pointArray.length && equal(pointArray, edge.pointArray)) {\n return edge\n }\n if (edge.fromVertex === to && edge.toVertex === from && pointArray.length ===\n edge.pointArray.length && equal(pointArray.slice(0).reverse(), edge.pointArray)) {\n return edge\n }\n }\n}\n\n/**\n * Split a specified graph edge around a set of specified split points, where\n * all split points are internal points of the edge to be split. A set of N\n * valid split points will result in N+1 new edges. The original edge is\n * removed from the graph.\n */\n\nNetworkGraph.prototype.splitEdgeAtInternalPoints = function (edge, points) {\n var subEdgePoints = []\n var newEdge\n var newEdgeInfoArr = []\n var fromVertex = edge.fromVertex\n var geomCoords = []\n\n // iterate through the parent edge points, creating new sub-edges as needed\n each(edge.pointArray, function (point, i) {\n if (edge.pointGeom && i < edge.pointGeom.length) {\n geomCoords = geomCoords.concat(edge.pointGeom[i])\n }\n if (points.indexOf(point) !== -1) { // we've reached a split point\n var x = point.worldX\n var y = point.worldY\n var newVertex = point.graphVertex || this.addVertex(point, x, y)\n newVertex.isInternal = true\n newEdge = this.addEdge(subEdgePoints, fromVertex, newVertex, edge.edgeGroup\n .type)\n newEdge.isInternal = true\n newEdge.copyPathSegments(edge)\n newEdgeInfoArr.push({\n graphEdge: newEdge,\n fromVertex: fromVertex\n })\n if (geomCoords.length > 0) newEdge.geomCoords = geomCoords\n\n subEdgePoints = []\n fromVertex = newVertex\n geomCoords = []\n } else { // otherwise, this point becomes an internal point of the new edge currently being created\n subEdgePoints.push(point)\n }\n }, this)\n\n // create the last sub-edge\n newEdge = this.addEdge(subEdgePoints, fromVertex, edge.toVertex, edge.edgeGroup\n .type)\n newEdge.isInternal = true\n newEdge.copyPathSegments(edge)\n if (edge.pointGeom && edge.pointArray.length < edge.pointGeom.length) {\n geomCoords = geomCoords.concat(edge.pointGeom[edge.pointArray.length])\n }\n if (geomCoords.length > 0) newEdge.geomCoords = geomCoords\n\n newEdgeInfoArr.push({\n graphEdge: newEdge,\n fromVertex: fromVertex\n })\n\n // insert the new edge sequence into the affected segments\n each(edge.pathSegments, function (pathSegment) {\n var indexInSegment = pathSegment.getEdgeIndex(edge)\n var forward = pathSegment.edges[indexInSegment].forward\n var index = pathSegment.getEdgeIndex(edge)\n each(forward ? newEdgeInfoArr : newEdgeInfoArr.reverse(), function (edgeInfo) {\n pathSegment.insertEdgeAt(index, edgeInfo.graphEdge, forward ? edgeInfo.fromVertex : edgeInfo.toVertex)\n index++\n })\n })\n\n // remove the original edge from the graph\n this.removeEdge(edge)\n}\n\n/* NetworkGraph.prototype.collapseTransfers = function(threshold) {\n if(!threshold) return;\n this.edges.forEach(function(edge) {\n if (edge.getLength() > threshold ||\n edge.fromVertex.point.containsFromPoint() ||\n edge.fromVertex.point.containsToPoint() ||\n edge.toVertex.point.containsFromPoint() ||\n edge.toVertex.point.containsToPoint()) return;\n //if(edge.fromVertex.point.getType() === 'PLACE' || edge.toVertex.point.getType() === 'PLACE') return;\n var notTransit = true;\n edge.pathSegments.forEach(function(segment) {\n notTransit = notTransit && segment.type !== 'TRANSIT';\n });\n if (notTransit) {\n this.mergeVertices([edge.fromVertex, edge.toVertex]);\n }\n }, this);\n}; */\n\nNetworkGraph.prototype.pruneVertices = function () {\n each(this.vertices, function (vertex) {\n if (vertex.point.containsSegmentEndPoint()) return\n\n var opposites = []\n var pathSegmentBundles = {} // maps pathSegment id list (string) to collection of edges (array)\n\n each(vertex.edges, function (edge) {\n var pathSegmentIds = edge.getPathSegmentIds()\n if (!(pathSegmentIds in pathSegmentBundles)) pathSegmentBundles[pathSegmentIds] = []\n pathSegmentBundles[pathSegmentIds].push(edge)\n var opp = edge.oppositeVertex(vertex)\n if (opposites.indexOf(opp) === -1) opposites.push(opp)\n })\n\n if (opposites.length !== 2) return\n\n each(pathSegmentBundles, function (ids) {\n var edgeArr = pathSegmentBundles[ids]\n if (edgeArr.length === 2) this.mergeEdges(edgeArr[0], edgeArr[1])\n }, this)\n }, this)\n}\n\nNetworkGraph.prototype.mergeEdges = function (edge1, edge2) {\n // check for infinite recursion loop case\n if (edge1.fromVertex === edge2.toVertex && edge2.fromVertex === edge1.toVertex) {\n return\n }\n\n // reverse edges if necessary\n if (edge1.fromVertex === edge2.toVertex) {\n this.mergeEdges(edge2, edge1)\n return\n }\n\n if (edge1.toVertex !== edge2.fromVertex) return // edges cannot be merged\n\n var internalPoints = edge1.pointArray.concat(edge2.pointArray)\n\n var newEdge = this.addEdge(internalPoints, edge1.fromVertex, edge2.toVertex,\n edge1.edgeGroup.type)\n newEdge.pathSegments = edge1.pathSegments\n each(newEdge.pathSegments, function (segment) {\n // var i = segment.graphEdges.indexOf(edge1);\n // segment.graphEdges.splice(i, 0, newEdge);\n var i = segment.getEdgeIndex(edge1)\n segment.insertEdgeAt(i, newEdge, newEdge.fromVertex)\n })\n\n // if both input edges are have coordinate geometry, merge the coords arrays in the new edge\n if (edge1.geomCoords && edge2.geomCoords) {\n newEdge.geomCoords = edge1.geomCoords.concat(edge2.geomCoords.length > 0\n ? edge2.geomCoords.slice(1)\n : [])\n }\n\n debug('merging:')\n debug(edge1)\n debug(edge2)\n this.removeEdge(edge1)\n this.removeEdge(edge2)\n}\n\nNetworkGraph.prototype.snapToGrid = function (cellSize) {\n var coincidenceMap = {}\n this.vertices.forEach(function (vertex) {\n var nx = Math.round(vertex.x / cellSize) * cellSize\n var ny = Math.round(vertex.y / cellSize) * cellSize\n vertex.x = nx\n vertex.y = ny\n\n var key = nx + '_' + ny\n if (!(key in coincidenceMap)) coincidenceMap[key] = [vertex]\n else coincidenceMap[key].push(vertex)\n })\n\n each(coincidenceMap, function (key) {\n var vertexArr = coincidenceMap[key]\n if (vertexArr.length > 1) {\n this.mergeVertices(vertexArr)\n }\n }, this)\n}\n\nNetworkGraph.prototype.calculateGeometry = function (cellSize, angleConstraint) {\n this.edges.forEach(function (edge) {\n edge.calculateGeometry(cellSize, angleConstraint)\n })\n}\n\nNetworkGraph.prototype.resetCoordinates = function () {\n this.vertices.forEach(function (vertex) {\n vertex.x = vertex.origX\n vertex.y = vertex.origY\n })\n}\n\nNetworkGraph.prototype.recenter = function () {\n var xCoords = []\n var yCoords = []\n this.vertices.forEach(function (v) {\n xCoords.push(v.x)\n yCoords.push(v.y)\n })\n\n var mx = d3.median(xCoords)\n var my = d3.median(yCoords)\n\n this.vertices.forEach(function (v) {\n v.x = v.x - mx\n v.y = v.y - my\n })\n}\n\n/** 2D line bundling & offsetting **/\n\nNetworkGraph.prototype.apply2DOffsets = function () {\n this.initComparisons()\n\n var alignmentBundles = {} // maps alignment ID to array of range-bounded bundles on that alignment\n\n var addToBundle = function (rEdge, alignmentId) {\n var bundle\n\n // compute the alignment range of the edge being bundled\n var range = rEdge.graphEdge.getAlignmentRange(alignmentId)\n\n // check if bundles already exist for this alignment\n if (!(alignmentId in alignmentBundles)) { // if not, create new and add to collection\n bundle = new AlignmentBundle()\n bundle.addEdge(rEdge, range.min, range.max)\n alignmentBundles[alignmentId] = [bundle] // new AlignmentBundle();\n } else { // 1 or more bundles currently exist for this alignmentId\n var bundleArr = alignmentBundles[alignmentId]\n\n // see if the segment range overlaps with that of an existing bundle\n for (var i = 0; i < bundleArr.length; i++) {\n if (bundleArr[i].rangeOverlaps(range.min, range.max)) {\n bundleArr[i].addEdge(rEdge, range.min, range.max)\n return\n }\n }\n\n // ..if not, create a new bundle\n bundle = new AlignmentBundle()\n bundle.addEdge(rEdge, range.min, range.max)\n bundleArr.push(bundle)\n }\n }\n\n each(this.edges, function (edge) {\n var fromAlignmentId = edge.getFromAlignmentId()\n var toAlignmentId = edge.getToAlignmentId()\n\n each(edge.renderedEdges, function (rEdge) {\n addToBundle(rEdge, fromAlignmentId)\n addToBundle(rEdge, toAlignmentId)\n })\n })\n\n var bundleSorter = function (a, b) {\n var aId = a.patternIds || a.pathSegmentIds\n var bId = b.patternIds || b.pathSegmentIds\n\n var aVector = a.getAlignmentVector(this.currentAlignmentId)\n var bVector = b.getAlignmentVector(this.currentAlignmentId)\n var isOutward = (Util.isOutwardVector(aVector) && Util.isOutwardVector(\n bVector)) ? 1 : -1\n\n var abCompId = aId + '_' + bId\n if (abCompId in this.bundleComparisons) {\n return isOutward * this.bundleComparisons[abCompId]\n }\n\n var baCompId = bId + '_' + aId\n if (baCompId in this.bundleComparisons) {\n return isOutward * this.bundleComparisons[baCompId]\n }\n\n if (a.route && b.route && a.route.route_type !== b.route.route_type) {\n return a.route.route_type > b.route.route_type ? 1 : -1\n }\n\n var isForward = (a.forward && b.forward) ? 1 : -1\n return isForward * isOutward * (aId < bId ? -1 : 1)\n }.bind(this)\n\n each(alignmentBundles, function (alignmentId) {\n var bundleArr = alignmentBundles[alignmentId]\n each(bundleArr, function (bundle) {\n if (bundle.items.length <= 1) return\n var lw = 1.2\n var bundleWidth = lw * (bundle.items.length - 1)\n\n this.currentAlignmentId = alignmentId\n bundle.items.sort(bundleSorter)\n each(bundle.items, function (rEdge, i) {\n var offset = (-bundleWidth / 2) + i * lw\n if (rEdge.getType() === 'TRANSIT') {\n each(rEdge.patterns, function (pattern) {\n pattern.offsetAlignment(alignmentId, offset)\n })\n } else rEdge.offsetAlignment(alignmentId, offset)\n })\n }, this)\n }, this)\n}\n\n/**\n * Traverses the graph vertex-by-vertex, creating comparisons between all pairs of\n * edges for which a topological relationship can be established.\n */\n\nNetworkGraph.prototype.initComparisons = function () {\n this.bundleComparisons = {}\n\n each(this.vertices, function (vertex) {\n var incidentGraphEdges = vertex.incidentEdges()\n\n var angleREdges = {}\n each(incidentGraphEdges, function (incidentGraphEdge) {\n var angle = (incidentGraphEdge.fromVertex === vertex) ? incidentGraphEdge.fromAngle : incidentGraphEdge.toAngle\n var angleDeg = 180 * angle / Math.PI\n if (!(angleDeg in angleREdges)) angleREdges[angleDeg] = []\n angleREdges[angleDeg] = angleREdges[angleDeg].concat(incidentGraphEdge.renderedEdges)\n })\n\n each(angleREdges, function (angle) {\n var rEdges = angleREdges[angle]\n if (rEdges.length < 2) return\n for (var i = 0; i < rEdges.length - 1; i++) {\n for (var j = i + 1; j < rEdges.length; j++) {\n var re1 = rEdges[i]\n var re2 = rEdges[j]\n\n var opp1 = re1.graphEdge.oppositeVertex(vertex)\n var opp2 = re2.graphEdge.oppositeVertex(vertex)\n\n var ccw = Util.ccw(opp1.x, opp1.y, vertex.x, vertex.y, opp2.x,\n opp2.y)\n\n if (ccw === 0) {\n var s1Ext = re1.findExtension(opp1)\n var s2Ext = re2.findExtension(opp2)\n if (s1Ext) opp1 = s1Ext.graphEdge.oppositeVertex(opp1)\n if (s2Ext) opp2 = s2Ext.graphEdge.oppositeVertex(opp2)\n ccw = Util.ccw(opp1.x, opp1.y, vertex.x, vertex.y, opp2.x, opp2\n .y)\n }\n\n ccw = getInverse(re1, re2, vertex) * ccw\n\n if (ccw > 0) {\n // e1 patterns are 'less' than e2 patterns\n this.storeComparison(re1, re2)\n }\n\n if (ccw < 0) {\n // e2 patterns are 'less' than e2 patterns\n this.storeComparison(re2, re1)\n }\n }\n }\n }, this)\n }, this)\n}\n\nfunction getInverse (s1, s2, vertex) {\n return (\n (s1.graphEdge.toVertex === vertex && s2.graphEdge.toVertex === vertex) ||\n (s1.graphEdge.toVertex === vertex && s2.graphEdge.fromVertex === vertex)\n ) ? -1 : 1\n}\n\nNetworkGraph.prototype.storeComparison = function (s1, s2) {\n var s1Id = s1.patternIds || s1.pathSegmentIds\n var s2Id = s2.patternIds || s2.pathSegmentIds\n debug('storing comparison: ' + s1Id + ' < ' + s2Id)\n this.bundleComparisons[s1Id + '_' + s2Id] = -1\n this.bundleComparisons[s2Id + '_' + s1Id] = 1\n}\n\n/**\n * AlignmentBundle class\n */\n\nfunction AlignmentBundle () {\n this.items = [] // RenderedEdges\n this.min = Number.MAX_VALUE\n this.max = -Number.MAX_VALUE\n}\n\nAlignmentBundle.prototype.addEdge = function (rEdge, min, max) {\n if (this.items.indexOf(rEdge) === -1) {\n this.items.push(rEdge)\n }\n\n this.min = Math.min(this.min, min)\n this.max = Math.max(this.max, max)\n}\n\nAlignmentBundle.prototype.rangeOverlaps = function (min, max) {\n return this.min < max && min < this.max\n}\n\n/**\n * Check if arrays are equal\n */\n\nfunction equal (a, b) {\n if (a.length !== b.length) {\n return false\n }\n\n for (var i in a) {\n if (a[i] !== b[i]) {\n return false\n }\n }\n\n return true\n}\n", + "/**\n * Expose `Vertex`\n */\n\nmodule.exports = Vertex\n\n/**\n * Initialize new Vertex\n *\n * @param {Stop/Place}\n * @param {Number}\n * @param {Number}\n */\n\nvar edgeId = 0\n\nfunction Vertex (point, x, y) {\n this.id = edgeId++\n this.point = point\n this.point.graphVertex = this\n this.x = this.origX = x\n this.y = this.origY = y\n this.edges = []\n}\n\nVertex.prototype.getId = function () {\n return this.id\n}\n\nVertex.prototype.getRenderX = function (display) {\n return display.xScale(this.x) + this.point.placeOffsets.x\n}\n\nVertex.prototype.getRenderY = function (display) {\n return display.yScale(this.y) + this.point.placeOffsets.y\n}\n\n/**\n * Move to new coordinate\n *\n * @param {Number}\n * @param {Number}\n */\n\nVertex.prototype.moveTo = function (x, y) {\n this.x = x\n this.y = y\n /* this.edges.forEach(function (edge) {\n edge.calculateVectors();\n }); */\n}\n\n/**\n * Get array of edges incident to vertex. Allows specification of \"incoming\" edge that will not be included in results\n *\n * @param {Edge}\n */\n\nVertex.prototype.incidentEdges = function (inEdge) {\n var results = []\n this.edges.forEach(function (edge) {\n if (edge !== inEdge) results.push(edge)\n })\n return results\n}\n\n/**\n * Add an edge to the vertex's edge list\n *\n * @param {Edge}\n */\n\nVertex.prototype.addEdge = function (edge) {\n var index = this.edges.indexOf(edge)\n if (index === -1) this.edges.push(edge)\n}\n\n/**\n * Remove an edge from the vertex's edge list\n *\n * @param {Edge}\n */\n\nVertex.prototype.removeEdge = function (edge) {\n var index = this.edges.indexOf(edge)\n if (index !== -1) this.edges.splice(index, 1)\n}\n\nVertex.prototype.toString = function () {\n return 'Vertex ' + this.getId() + ' (' + (this.point ? this.point.toString() : 'no point assigned') + ')'\n}\n", + "/**\n * Dependencies\n */\n\nvar augment = require('augment')\nvar each = require('component-each')\nvar d3 = require('d3')\n\nvar SegmentLabel = require('./segmentlabel')\nvar Util = require('../util')\n\n/**\n * Labeler object\n */\n\nvar Labeler = augment(Object, function () {\n this.constructor = function (transitive) {\n this.transitive = transitive\n this.clear()\n }\n\n this.clear = function (transitive) {\n this.points = []\n }\n\n this.updateLabelList = function (graph) {\n this.points = []\n graph.vertices.forEach(function (vertex) {\n var point = vertex.point\n if (point.getType() === 'PLACE' || point.getType() === 'MULTI' || (\n point.getType() === 'STOP' && point.isSegmentEndPoint)) {\n this.points.push(point)\n }\n }, this)\n\n this.points.sort(function compare (a, b) {\n if (a.containsFromPoint() || a.containsToPoint()) return -1\n if (b.containsFromPoint() || b.containsToPoint()) return 1\n return 0\n })\n }\n\n this.updateQuadtree = function () {\n this.quadtree = d3.geom.quadtree().extent([\n [-this.width, -this.height],\n [this.width * 2, this.height * 2]\n ])([])\n\n this.addPointsToQuadtree()\n // this.addSegmentsToQuadtree();\n }\n\n this.addPointsToQuadtree = function () {\n this.points.forEach(function (point) {\n var mbbox = point.getMarkerBBox()\n if (mbbox) this.addBBoxToQuadtree(point.getMarkerBBox())\n }, this)\n }\n\n this.addSegmentsToQuadtree = function () {\n this.transitive.renderSegments.forEach(function (segment) {\n if (segment.getType() !== 'TRANSIT') return\n\n var lw = this.transitive.style.compute(this.transitive.style.segments['stroke-width'], this.transitive.display, segment)\n lw = parseFloat(lw.substring(0, lw.length - 2), 10) - 2\n\n var x, x1, x2, y, y1, y2\n // debug(segment.toString());\n if (segment.renderData.length === 2) { // basic straight segment\n if (segment.renderData[0].x === segment.renderData[1].x) { // vertical\n x = segment.renderData[0].x - lw / 2\n y1 = segment.renderData[0].y\n y2 = segment.renderData[1].y\n this.addBBoxToQuadtree({\n x: x,\n y: Math.min(y1, y2),\n width: lw,\n height: Math.abs(y1 - y2)\n })\n } else if (segment.renderData[0].y === segment.renderData[1].y) { // horizontal\n x1 = segment.renderData[0].x\n x2 = segment.renderData[1].x\n y = segment.renderData[0].y - lw / 2\n this.addBBoxToQuadtree({\n x: Math.min(x1, x2),\n y: y,\n width: Math.abs(x1 - x2),\n height: lw\n })\n }\n }\n\n if (segment.renderData.length === 4) {\n // basic curved segment\n\n if (segment.renderData[0].x === segment.renderData[1].x) { // vertical first\n x = segment.renderData[0].x - lw / 2\n y1 = segment.renderData[0].y\n y2 = segment.renderData[3].y\n this.addBBoxToQuadtree({\n x: x,\n y: Math.min(y1, y2),\n width: lw,\n height: Math.abs(y1 - y2)\n })\n\n x1 = segment.renderData[0].x\n x2 = segment.renderData[3].x\n y = segment.renderData[3].y - lw / 2\n this.addBBoxToQuadtree({\n x: Math.min(x1, x2),\n y: y,\n width: Math.abs(x1 - x2),\n height: lw\n })\n } else if (segment.renderData[0].y === segment.renderData[1].y) { // horiz first\n x1 = segment.renderData[0].x\n x2 = segment.renderData[3].x\n y = segment.renderData[0].y - lw / 2\n this.addBBoxToQuadtree({\n x: Math.min(x1, x2),\n y: y,\n width: Math.abs(x1 - x2),\n height: lw\n })\n\n x = segment.renderData[3].x - lw / 2\n y1 = segment.renderData[0].y\n y2 = segment.renderData[3].y\n this.addBBoxToQuadtree({\n x: x,\n y: Math.min(y1, y2),\n width: lw,\n height: Math.abs(y1 - y2)\n })\n }\n }\n }, this)\n }\n\n this.addBBoxToQuadtree = function (bbox) {\n if (bbox.x + bbox.width / 2 < 0 || bbox.x - bbox.width / 2 > this.width ||\n bbox.y + bbox.height / 2 < 0 || bbox.y - bbox.height / 2 > this.height\n ) return\n\n this.quadtree.add([bbox.x + bbox.width / 2, bbox.y + bbox.height / 2,\n bbox\n ])\n\n this.maxBBoxWidth = Math.max(this.maxBBoxWidth, bbox.width)\n this.maxBBoxHeight = Math.max(this.maxBBoxHeight, bbox.height)\n }\n\n this.doLayout = function () {\n this.width = this.transitive.el.clientWidth\n this.height = this.transitive.el.clientHeight\n\n this.maxBBoxWidth = 0\n this.maxBBoxHeight = 0\n\n this.updateQuadtree()\n\n var labeledSegments = this.placeSegmentLabels()\n var labeledPoints = this.placePointLabels()\n\n return {\n segments: labeledSegments,\n points: labeledPoints\n }\n }\n\n this.placeSegmentLabels = function () {\n each(this.segmentLabels, function (label) {\n label.clear()\n })\n this.segmentLabels = []\n this.placedLabelKeys = []\n\n // collect the bus RenderSegments\n var busRSegments = []\n each(this.transitive.network.paths, function (path) {\n each(path.getRenderedSegments(), function (rSegment) {\n if (rSegment.type === 'TRANSIT' && rSegment.mode === 3) busRSegments.push(rSegment)\n })\n }, this)\n\n var edgeGroups = []\n each(this.transitive.network.paths, function (path) {\n each(path.segments, function (segment) {\n if (segment.type === 'TRANSIT' && segment.getMode() === 3) {\n edgeGroups = edgeGroups.concat(segment.getLabelEdgeGroups())\n }\n })\n }, this)\n\n // iterate through the sequence collection, labeling as necessary\n // each(busRSegments, function(rSegment) {\n each(edgeGroups, function (edgeGroup) {\n this.currentGroup = edgeGroup\n // get the array of label strings to be places (typically the unique route short names)\n this.labelTextArray = edgeGroup.getLabelTextArray()\n\n // create the initial label for placement\n this.labelTextIndex = 0\n\n var label = this.getNextLabel() // this.constructSegmentLabel(rSegment, labelTextArray[labelTextIndex]);\n if (!label) return\n\n // iterate through potential anchor locations, attempting placement at each one\n var labelAnchors = edgeGroup.getLabelAnchors(this.transitive.display,\n label.textHeight * 1.5)\n for (var i = 0; i < labelAnchors.length; i++) {\n label.labelAnchor = labelAnchors[i]\n\n // do not consider this anchor if it is out of the display range\n if (!this.transitive.display.isInRange(label.labelAnchor.x,\n label.labelAnchor.y)) continue\n\n // check for conflicts with existing placed elements\n var bbox = label.getBBox()\n var conflicts = this.findOverlaps(label, bbox)\n\n if (conflicts.length === 0) {\n // if no conflicts\n\n // place the current label\n this.segmentLabels.push(label)\n this.quadtree.add([label.labelAnchor.x, label.labelAnchor.y,\n label\n ])\n // debug('placing seg label for ' + label.labelText);\n\n label = this.getNextLabel()\n if (!label) break\n }\n } // end of anchor iteration loop\n }, this) // end of sequence iteration loop\n }\n\n this.getNextLabel = function () {\n while (this.labelTextIndex < this.labelTextArray.length) {\n var labelText = this.labelTextArray[this.labelTextIndex]\n var key = this.currentGroup.edgeIds + '_' + labelText\n if (this.placedLabelKeys.indexOf(key) !== -1) {\n this.labelTextIndex++\n continue\n }\n var label = this.constructSegmentLabel(this.currentGroup.renderedSegment,\n labelText)\n this.placedLabelKeys.push(key)\n this.labelTextIndex++\n return label\n }\n return null\n }\n\n this.constructSegmentLabel = function (segment, labelText) {\n var label = new SegmentLabel(segment, labelText)\n var styler = this.transitive.styler\n label.fontFamily = styler.compute(styler.labels['font-family'], this.transitive.display, {\n segment: segment\n })\n label.fontSize = styler.compute(styler.labels['font-size'], this.transitive.display, {\n segment: segment\n })\n var textBBox = Util.getTextBBox(labelText, {\n 'font-size': label.fontSize,\n 'font-family': label.fontFamily\n })\n label.textWidth = textBBox.width\n label.textHeight = textBBox.height\n label.computeContainerDimensions()\n\n return label\n }\n\n this.placePointLabels = function () {\n var styler = this.transitive.styler\n\n var labeledPoints = []\n\n this.points.forEach(function (point) {\n var labelText = point.label.getText()\n point.label.fontFamily = styler.compute(styler.labels['font-family'],\n this.transitive\n .display, {\n point: point\n })\n point.label.fontSize = styler.compute(styler.labels['font-size'],\n this.transitive\n .display, {\n point: point\n })\n var textBBox = Util.getTextBBox(labelText, {\n 'font-size': point.label.fontSize,\n 'font-family': point.label.fontFamily\n })\n point.label.textWidth = textBBox.width\n point.label.textHeight = textBBox.height\n\n var orientations = styler.compute(styler.labels.orientations, this.transitive\n .display, {\n point: point\n })\n\n var placedLabel = false\n for (var i = 0; i < orientations.length; i++) {\n point.label.setOrientation(orientations[i])\n if (!point.focused) continue\n\n if (!point.label.labelAnchor) continue\n\n var lx = point.label.labelAnchor.x\n var ly = point.label.labelAnchor.y\n\n // do not place label if out of range\n if (lx <= 0 || ly <= 0 || lx >= this.width || ly > this.height) continue\n\n var labelBBox = point.label.getBBox()\n\n var overlaps = this.findOverlaps(point.label, labelBBox)\n\n // do not place label if it overlaps with others\n if (overlaps.length > 0) continue\n\n // if we reach this point, the label is good to place\n\n point.label.setVisibility(true)\n labeledPoints.push(point)\n\n this.quadtree.add([labelBBox.x + labelBBox.width / 2, labelBBox.y +\n labelBBox.height / 2, point.label\n ])\n\n this.maxBBoxWidth = Math.max(this.maxBBoxWidth, labelBBox.width)\n this.maxBBoxHeight = Math.max(this.maxBBoxHeight, labelBBox.height)\n\n placedLabel = true\n break // do not consider any other orientations after places\n } // end of orientation loop\n\n // if label not placed at all, hide the element\n if (!placedLabel) {\n point.label.setVisibility(false)\n }\n }, this)\n return labeledPoints\n }\n\n this.findOverlaps = function (label, labelBBox) {\n var minX = labelBBox.x - this.maxBBoxWidth / 2\n var minY = labelBBox.y - this.maxBBoxHeight / 2\n var maxX = labelBBox.x + labelBBox.width + this.maxBBoxWidth / 2\n var maxY = labelBBox.y + labelBBox.height + this.maxBBoxHeight / 2\n // debug('findOverlaps %s,%s %s,%s', minX,minY,maxX,maxY);\n\n var matchItems = []\n this.quadtree.visit(function (node, x1, y1, x2, y2) {\n var p = node.point\n if ((p) && (p[0] >= minX) && (p[0] < maxX) && (p[1] >= minY) && (p[1] < maxY) && label.intersects(p[2])) {\n matchItems.push(p[2])\n }\n return x1 > maxX || y1 > maxY || x2 < minX || y2 < minY\n })\n return matchItems\n }\n\n this.findNearbySegmentLabels = function (label, x, y, buffer) {\n var minX = x - buffer\n var minY = y - buffer\n var maxX = x + buffer\n var maxY = y + buffer\n // debug('findNearby %s,%s %s,%s', minX,minY,maxX,maxY);\n\n var matchItems = []\n this.quadtree.visit(function (node, x1, y1, x2, y2) {\n var p = node.point\n if ((p) && (p[0] >= minX) && (p[0] < maxX) && (p[1] >= minY) && (p[1] < maxY) && (p[2].parent) && (label.parent.patternIds === p[2].parent.patternIds)) {\n matchItems.push(p[2])\n }\n return x1 > maxX || y1 > maxY || x2 < minX || y2 < minY\n })\n return matchItems\n }\n})\n\n/**\n * Expose `Labeler`\n */\n\nmodule.exports = Labeler\n", + "/**\n * Dependencies\n */\n\nvar augment = require('augment')\n\n/**\n * Label object\n */\n\nvar Label = augment(Object, function () {\n this.constructor = function (parent) {\n this.parent = parent\n this.sortableType = 'LABEL'\n }\n\n this.getText = function () {\n if (!this.labelText) this.labelText = this.initText()\n return this.labelText\n }\n\n this.initText = function () {\n return this.parent.getName()\n }\n\n this.render = function (display) {}\n\n this.refresh = function (display) {}\n\n this.setVisibility = function (visibility) {\n if (this.svgGroup) this.svgGroup.attr('visibility', visibility ? 'visible' : 'hidden')\n }\n\n this.getBBox = function () {\n return null\n }\n\n this.intersects = function (obj) {\n return null\n }\n\n this.intersectsBBox = function (bbox) {\n var thisBBox = this.getBBox(this.orientation)\n var r = (thisBBox.x <= bbox.x + bbox.width &&\n bbox.x <= thisBBox.x + thisBBox.width &&\n thisBBox.y <= bbox.y + bbox.height &&\n bbox.y <= thisBBox.y + thisBBox.height)\n return r\n }\n\n this.isFocused = function () {\n return this.parent.isFocused()\n }\n\n this.getZIndex = function () {\n return 1000000\n }\n})\n\n/**\n * Expose `Label`\n */\n\nmodule.exports = Label\n", + "/**\n * Dependencies\n */\n\nvar each = require('component-each')\n\n/**\n * Expose `LabelEdgeGroup`\n */\n\nmodule.exports = LabelEdgeGroup\n\n/**\n *\n */\n\nfunction LabelEdgeGroup (renderedSegment) {\n this.renderedSegment = renderedSegment\n this.renderedEdges = []\n}\n\nLabelEdgeGroup.prototype.addEdge = function (rEdge) {\n this.renderedEdges.push(rEdge)\n this.edgeIds = !this.edgeIds ? rEdge.getId() : this.edgeIds + ',' + rEdge.getId()\n}\n\nLabelEdgeGroup.prototype.getLabelTextArray = function () {\n var textArray = []\n each(this.renderedSegment.pathSegment.getPatterns(), function (pattern) {\n var shortName = pattern.route.route_short_name\n if (textArray.indexOf(shortName) === -1) textArray.push(shortName)\n })\n return textArray\n}\n\nLabelEdgeGroup.prototype.getLabelAnchors = function (display, spacing) {\n var labelAnchors = []\n var renderLen = this.getRenderLength(display)\n var anchorCount = Math.floor(renderLen / spacing)\n var pctSpacing = spacing / renderLen\n\n for (var i = 0; i < anchorCount; i++) {\n var t = (i % 2 === 0)\n ? 0.5 + (i / 2) * pctSpacing\n : 0.5 - ((i + 1) / 2) * pctSpacing\n var coord = this.coordAlongRenderedPath(t, display)\n if (coord) labelAnchors.push(coord)\n }\n\n return labelAnchors\n}\n\nLabelEdgeGroup.prototype.coordAlongRenderedPath = function (t, display) {\n var renderLen = this.getRenderLength(display)\n var loc = t * renderLen\n\n var cur = 0\n for (var i = 0; i < this.renderedEdges.length; i++) {\n var rEdge = this.renderedEdges[i]\n var edgeRenderLen = rEdge.graphEdge.getRenderLength(display)\n if (loc <= cur + edgeRenderLen) {\n var t2 = (loc - cur) / edgeRenderLen\n return rEdge.graphEdge.coordAlongEdge(t2, rEdge.renderData, display)\n }\n cur += edgeRenderLen\n }\n}\n\nLabelEdgeGroup.prototype.getRenderLength = function (display) {\n if (!this.renderLength) {\n this.renderLength = 0\n each(this.renderedEdges, function (rEdge) {\n this.renderLength += rEdge.graphEdge.getRenderLength(display)\n }, this)\n }\n return this.renderLength\n}\n", + "/**\n * Dependencies\n */\n\nvar augment = require('augment')\n\nvar Label = require('./label')\n\n/**\n * Label object\n */\n\nvar PointLabel = augment(Label, function (base) {\n this.constructor = function (parent) {\n base.constructor.call(this, parent)\n\n this.labelAngle = 0\n this.labelPosition = 1\n }\n\n this.initText = function () {\n return this.parent.getName()\n }\n\n this.render = function (display) {\n this.svgGroup = display.svg.append('g') // this.parent.labelSvg;\n this.svgGroup\n .attr('class', 'transitive-sortable')\n .datum({\n owner: this,\n sortableType: 'POINT_LABEL'\n })\n\n var typeStr = this.parent.getType().toLowerCase()\n\n this.mainLabel = this.svgGroup.append('text')\n .datum({\n owner: this\n })\n .attr('id', 'transitive-' + typeStr + '-label-' + this.parent.getId())\n .text(this.getText())\n .attr('font-size', this.fontSize)\n .attr('font-family', this.fontFamily)\n .attr('class', 'transitive-' + typeStr + '-label')\n }\n\n this.refresh = function (display) {\n if (!this.labelAnchor) return\n\n if (!this.svgGroup) this.render(display)\n\n this.svgGroup\n .attr('text-anchor', this.labelPosition > 0 ? 'start' : 'end')\n .attr('transform', function (d, i) {\n return 'translate(' + this.labelAnchor.x + ',' + this.labelAnchor\n .y + ')'\n }.bind(this))\n\n this.mainLabel\n .attr('transform', function (d, i) {\n return 'rotate(' + this.labelAngle + ', 0, 0)'\n }.bind(this))\n }\n\n this.setOrientation = function (orientation) {\n this.orientation = orientation\n\n var markerBBox = this.parent.getMarkerBBox()\n if (!markerBBox) return\n\n var x, y\n var offset = 5\n\n if (orientation === 'E') {\n x = markerBBox.x + markerBBox.width + offset\n y = markerBBox.y + markerBBox.height / 2\n this.labelPosition = 1\n this.labelAngle = 0\n } else if (orientation === 'W') {\n x = markerBBox.x - offset\n y = markerBBox.y + markerBBox.height / 2\n this.labelPosition = -1\n this.labelAngle = 0\n } else if (orientation === 'NE') {\n x = markerBBox.x + markerBBox.width + offset\n y = markerBBox.y - offset\n this.labelPosition = 1\n this.labelAngle = -45\n } else if (orientation === 'SE') {\n x = markerBBox.x + markerBBox.width + offset\n y = markerBBox.y + markerBBox.height + offset\n this.labelPosition = 1\n this.labelAngle = 45\n } else if (orientation === 'NW') {\n x = markerBBox.x - offset\n y = markerBBox.y - offset\n this.labelPosition = -1\n this.labelAngle = 45\n } else if (orientation === 'SW') {\n x = markerBBox.x - offset\n y = markerBBox.y + markerBBox.height + offset\n this.labelPosition = -1\n this.labelAngle = -45\n } else if (orientation === 'N') {\n x = markerBBox.x + markerBBox.width / 2\n y = markerBBox.y - offset\n this.labelPosition = 1\n this.labelAngle = -90\n } else if (orientation === 'S') {\n x = markerBBox.x + markerBBox.width / 2\n y = markerBBox.y + markerBBox.height + offset\n this.labelPosition = -1\n this.labelAngle = -90\n }\n\n this.labelAnchor = {\n x: x,\n y: y\n }\n }\n\n this.getBBox = function () {\n if (this.orientation === 'E') {\n return {\n x: this.labelAnchor.x,\n y: this.labelAnchor.y - this.textHeight,\n width: this.textWidth,\n height: this.textHeight\n }\n }\n\n if (this.orientation === 'W') {\n return {\n x: this.labelAnchor.x - this.textWidth,\n y: this.labelAnchor.y - this.textHeight,\n width: this.textWidth,\n height: this.textHeight\n }\n }\n\n if (this.orientation === 'N') {\n return {\n x: this.labelAnchor.x - this.textHeight,\n y: this.labelAnchor.y - this.textWidth,\n width: this.textHeight,\n height: this.textWidth\n }\n }\n\n if (this.orientation === 'S') {\n return {\n x: this.labelAnchor.x - this.textHeight,\n y: this.labelAnchor.y,\n width: this.textHeight,\n height: this.textWidth\n }\n }\n\n var bboxSide = this.textWidth * Math.sqrt(2) / 2\n\n if (this.orientation === 'NE') {\n return {\n x: this.labelAnchor.x,\n y: this.labelAnchor.y - bboxSide,\n width: bboxSide,\n height: bboxSide\n }\n }\n\n if (this.orientation === 'SE') {\n return {\n x: this.labelAnchor.x,\n y: this.labelAnchor.y,\n width: bboxSide,\n height: bboxSide\n }\n }\n\n if (this.orientation === 'NW') {\n return {\n x: this.labelAnchor.x - bboxSide,\n y: this.labelAnchor.y - bboxSide,\n width: bboxSide,\n height: bboxSide\n }\n }\n\n if (this.orientation === 'SW') {\n return {\n x: this.labelAnchor.x - bboxSide,\n y: this.labelAnchor.y,\n width: bboxSide,\n height: bboxSide\n }\n }\n }\n\n this.intersects = function (obj) {\n if (obj instanceof Label) {\n // todo: handle label-label intersection for diagonally placed labels separately\n return this.intersectsBBox(obj.getBBox())\n } else if (obj.x && obj.y && obj.width && obj.height) {\n return this.intersectsBBox(obj)\n }\n\n return false\n }\n\n this.runFocusTransition = function (display, callback) {\n if (this.mainLabel) {\n if (this.parent.isFocused()) this.setVisibility(true)\n this.mainLabel.transition()\n .style('opacity', this.parent.isFocused() ? 1 : 0)\n .call(callback)\n }\n }\n})\n\n/**\n * Expose `PointLabel`\n */\n\nmodule.exports = PointLabel\n", + "/**\n * Dependencies\n */\n\nvar augment = require('augment')\n\nvar Label = require('./label')\n\n/**\n * SegmentLabel object\n */\n\nvar SegmentLabel = augment(Label, function (base) {\n this.constructor = function (parent, text) {\n base.constructor.call(this, parent)\n this.labelText = text\n }\n\n /* this.initText = function() {\n return this.parent.patterns[0].route.route_short_name;\n }; */\n\n this.render = function (display) {\n this.svgGroup = this.parent.labelSvg.append('g')\n .attr('class', 'transitive-sortable')\n .datum({\n owner: this,\n sortableType: 'LABEL'\n })\n\n var padding = this.getPadding()\n\n this.computeContainerDimensions()\n\n this.containerSvg = this.svgGroup.append('rect')\n .datum(this) // { segment: this.parent })\n .attr({\n width: this.containerWidth,\n height: this.containerHeight\n })\n .attr('id', 'transitive-segment-label-container-' + this.parent.getId())\n .text(this.getText())\n .attr('class', 'transitive-segment-label-container')\n\n this.textSvg = this.svgGroup.append('text')\n .datum(this) // { segment: this.parent })\n .attr('id', 'transitive-segment-label-' + this.parent.getId())\n .text(this.getText())\n .attr('class', 'transitive-segment-label')\n .attr('font-size', this.fontSize)\n .attr('font-family', this.fontFamily)\n .attr('transform', function (d, i) {\n return 'translate(' + padding + ', ' + (this.textHeight -\n padding * 2) + ')'\n }.bind(this))\n }\n\n this.refresh = function (display) {\n if (!this.labelAnchor) return\n\n if (!this.svgGroup) this.render(display)\n\n this.svgGroup\n .attr('transform', function (d, i) {\n var tx = (this.labelAnchor.x - this.containerWidth / 2)\n var ty = (this.labelAnchor.y - this.containerHeight / 2)\n return 'translate(' + tx + ',' + ty + ')'\n }.bind(this))\n }\n\n this.getPadding = function () {\n return this.textHeight * 0.1\n }\n\n this.computeContainerDimensions = function () {\n this.containerWidth = this.textWidth + this.getPadding() * 2\n this.containerHeight = this.textHeight\n }\n\n this.getBBox = function () {\n return {\n x: this.labelAnchor.x - this.containerWidth / 2,\n y: this.labelAnchor.y - this.containerHeight / 2,\n width: this.containerWidth,\n height: this.containerHeight\n }\n }\n\n this.intersects = function (obj) {\n if (obj instanceof Label) {\n // todo: handle label-label intersection for diagonally placed labels separately\n return this.intersectsBBox(obj.getBBox())\n } else if (obj.x && obj.y && obj.width && obj.height) {\n return this.intersectsBBox(obj)\n }\n\n return false\n }\n\n this.clear = function () {\n this.labelAnchor = null\n if (this.svgGroup) {\n this.svgGroup.remove()\n this.svgGroup = null\n }\n }\n})\n\n/**\n * Expose `SegmentLabel`\n */\n\nmodule.exports = SegmentLabel\n", + "var augment = require('augment')\nvar each = require('component-each')\n\nvar PointLabel = require('../labeler/pointlabel')\n\nvar Point = augment(Object, function () {\n this.constructor = function (data) {\n for (var key in data) {\n this[key] = data[key]\n }\n\n this.paths = []\n this.renderData = []\n\n this.label = new PointLabel(this)\n this.renderLabel = true\n\n this.focused = true\n this.sortableType = 'POINT'\n\n this.placeOffsets = {\n x: 0,\n y: 0\n }\n\n this.zIndex = 10000\n }\n\n /**\n * Get unique ID for point -- must be defined by subclass\n */\n\n this.getId = function () {}\n\n this.getElementId = function () {\n return this.getType().toLowerCase() + '-' + this.getId()\n }\n\n /**\n * Get Point type -- must be defined by subclass\n */\n\n this.getType = function () {}\n\n /**\n * Get Point name\n */\n\n this.getName = function () {\n return this.getType() + ' point (ID=' + this.getId() + ')'\n }\n\n /**\n * Get latitude\n */\n\n this.getLat = function () {\n return 0\n }\n\n /**\n * Get longitude\n */\n\n this.getLon = function () {\n return 0\n }\n\n this.containsSegmentEndPoint = function () {\n return false\n }\n\n this.containsBoardPoint = function () {\n return false\n }\n\n this.containsAlightPoint = function () {\n return false\n }\n\n this.containsTransferPoint = function () {\n return false\n }\n\n this.getPatterns = function () {\n return []\n }\n\n /**\n * Draw the point\n *\n * @param {Display} display\n */\n\n this.render = function (display) {\n this.label.svgGroup = null\n }\n\n /**\n * Refresh a previously drawn point\n *\n * @param {Display} display\n */\n\n this.refresh = function (display) {}\n\n this.addRenderData = function () {}\n\n this.clearRenderData = function () {}\n\n this.containsFromPoint = function () {\n return false\n }\n\n this.containsToPoint = function () {\n return false\n }\n\n this.initSvg = function (display) {\n // set up the main svg group for this stop\n this.svgGroup = display.svg.append('g')\n .attr('id', 'transitive-' + this.getType().toLowerCase() + '-' + this\n .getId())\n // .attr('class', 'transitive-sortable')\n .datum(this)\n\n this.markerSvg = this.svgGroup.append('g')\n this.labelSvg = this.svgGroup.append('g')\n }\n\n //* * Shared geom utility functions **//\n\n this.constructMergedMarker = function (display) {\n var dataArray = this.getRenderDataArray()\n var xValues = []\n var yValues = []\n dataArray.forEach(function (data) {\n var x = data.x // display.xScale(data.x) + data.offsetX;\n var y = data.y // display.yScale(data.y) - data.offsetY;\n xValues.push(x)\n yValues.push(y)\n })\n var minX = Math.min.apply(Math, xValues)\n var minY = Math.min.apply(Math, yValues)\n var maxX = Math.max.apply(Math, xValues)\n var maxY = Math.max.apply(Math, yValues)\n\n // retrieve marker type and radius from the styler\n var markerType = display.styler.compute(display.styler.stops_merged['marker-type'], display, {\n owner: this\n })\n var stylerRadius = display.styler.compute(display.styler.stops_merged.r, display, {\n owner: this\n })\n\n var width\n var height\n var r\n\n // if this is a circle marker w/ a styler-defined fixed radius, use that\n if (markerType === 'circle' && stylerRadius) {\n width = height = stylerRadius * 2\n r = stylerRadius\n // otherwise, this is a dynamically-sized marker\n } else {\n var dx = maxX - minX\n var dy = maxY - minY\n\n var markerPadding = display.styler.compute(display.styler.stops_merged['marker-padding'], display, {\n owner: this\n }) || 0\n\n var patternRadius = display.styler.compute(display.styler[this.patternStylerKey].r, display, {\n owner: this\n })\n r = parseFloat(patternRadius) + markerPadding\n\n if (markerType === 'circle') {\n width = height = Math.max(dx, dy) + 2 * r\n r = width / 2\n } else {\n width = dx + 2 * r\n height = dy + 2 * r\n if (markerType === 'rectangle') r = 0\n }\n }\n\n return {\n x: (minX + maxX) / 2 - width / 2,\n y: (minY + maxY) / 2 - height / 2,\n width: width,\n height: height,\n rx: r,\n ry: r\n }\n }\n\n this.initMarkerData = function (display) {\n if (this.getType() !== 'STOP' && this.getType() !== 'MULTI') return\n\n this.mergedMarkerData = this.constructMergedMarker(display)\n\n this.placeOffsets = {\n x: 0,\n y: 0\n }\n if (this.adjacentPlace) {\n var placeR = display.styler.compute(display.styler.places.r, display, {\n owner: this.adjacentPlace\n })\n\n var placeX = display.xScale(this.adjacentPlace.worldX)\n var placeY = display.yScale(this.adjacentPlace.worldY)\n\n var thisR = this.mergedMarkerData.width / 2\n var thisX = this.mergedMarkerData.x + thisR\n var thisY = this.mergedMarkerData.y + thisR\n\n var dx = thisX - placeX\n var dy = thisY - placeY\n var dist = Math.sqrt(dx * dx + dy * dy)\n\n if (placeR + thisR > dist) {\n var f = (placeR + thisR) / dist\n this.placeOffsets = {\n x: (dx * f) - dx,\n y: (dy * f) - dy\n }\n\n this.mergedMarkerData.x += this.placeOffsets.x\n this.mergedMarkerData.y += this.placeOffsets.y\n\n each(this.graphVertex.incidentEdges(), function (edge) {\n each(edge.renderSegments, function (segment) {\n segment.refreshRenderData(display)\n })\n })\n }\n }\n }\n\n this.refreshLabel = function (display) {\n if (!this.renderLabel) return\n this.label.refresh(display)\n }\n\n this.getMarkerBBox = function () {\n return this.markerSvg.node().getBBox()\n }\n\n this.setFocused = function (focused) {\n this.focused = focused\n }\n\n this.isFocused = function () {\n return (this.focused === true)\n }\n\n this.runFocusTransition = function (display, callback) {}\n\n this.setAllPatternsFocused = function () {}\n\n this.getZIndex = function () {\n return this.zIndex\n }\n\n this.getAverageCoord = function () {\n var dataArray = this.getRenderDataArray()\n\n var xTotal = 0\n var yTotal = 0\n each(dataArray, function (data) {\n xTotal += data.x\n yTotal += data.y\n })\n\n return {\n x: xTotal / dataArray.length,\n y: yTotal / dataArray.length\n }\n }\n\n this.hasRenderData = function () {\n var dataArray = this.getRenderDataArray()\n return (dataArray && dataArray.length > 0)\n }\n\n this.makeDraggable = function (transitive) {}\n\n this.toString = function () {\n return this.getType() + ' point: ' + this.getId() + ' (' + this.getName() +\n ')'\n }\n})\n\n/**\n * Expose `Point`\n */\n\nmodule.exports = Point\n", + "/**\n * Dependencies\n */\n\nvar augment = require('augment')\nvar each = require('component-each')\n\nvar Point = require('./index')\n\n/**\n * MultiPoint: a Point subclass representing a collection of multiple points\n * that have been merged into one for display purposes.\n */\n\nvar MultiPoint = augment(Point, function (base) {\n this.constructor = function (pointArray) {\n base.constructor.call(this)\n this.points = []\n if (pointArray) {\n pointArray.forEach(function (point) {\n this.addPoint(point)\n }, this)\n }\n this.renderData = []\n this.id = 'multi'\n this.toPoint = this.fromPoint = null\n\n this.patternStylerKey = 'multipoints_pattern'\n }\n\n /**\n * Get id\n */\n\n this.getId = function () {\n return this.id\n }\n\n /**\n * Get type\n */\n\n this.getType = function () {\n return 'MULTI'\n }\n\n this.getName = function () {\n if (this.fromPoint) return this.fromPoint.getName()\n if (this.toPoint) return this.toPoint.getName()\n var shortest = null\n this.points.forEach(function (point) {\n if (point.getType() === 'TURN') return\n if (!shortest || point.getName().length < shortest.length) shortest = point.getName()\n })\n\n return shortest\n }\n\n this.containsSegmentEndPoint = function () {\n for (var i = 0; i < this.points.length; i++) {\n if (this.points[i].containsSegmentEndPoint()) return true\n }\n return false\n }\n\n this.containsBoardPoint = function () {\n for (var i = 0; i < this.points.length; i++) {\n if (this.points[i].containsBoardPoint()) return true\n }\n return false\n }\n\n this.containsAlightPoint = function () {\n for (var i = 0; i < this.points.length; i++) {\n if (this.points[i].containsAlightPoint()) return true\n }\n return false\n }\n\n this.containsTransferPoint = function () {\n for (var i = 0; i < this.points.length; i++) {\n if (this.points[i].containsTransferPoint()) return true\n }\n return false\n }\n\n this.containsFromPoint = function () {\n return (this.fromPoint !== null)\n }\n\n this.containsToPoint = function () {\n return (this.toPoint !== null)\n }\n\n this.getPatterns = function () {\n var patterns = []\n\n this.points.forEach(function (point) {\n if (!point.patterns) return\n point.patterns.forEach(function (pattern) {\n if (patterns.indexOf(pattern) === -1) patterns.push(pattern)\n })\n })\n\n return patterns\n }\n\n this.addPoint = function (point) {\n if (this.points.indexOf(point) !== -1) return\n this.points.push(point)\n this.id += '-' + point.getId()\n if (point.containsFromPoint()) { // getType() === 'PLACE' && point.getId() === 'from') {\n this.fromPoint = point\n }\n if (point.containsToPoint()) { // getType() === 'PLACE' && point.getId() === 'to') {\n this.toPoint = point\n }\n this.calcWorldCoords()\n }\n\n this.calcWorldCoords = function () {\n var tx = 0\n var ty = 0\n each(this.points, function (point) {\n tx += point.worldX\n ty += point.worldY\n })\n\n this.worldX = tx / this.points.length\n this.worldY = ty / this.points.length\n }\n\n /**\n * Add render data\n *\n * @param {Object} stopInfo\n */\n\n this.addRenderData = function (pointInfo) {\n if (pointInfo.offsetX !== 0 || pointInfo.offsetY !== 0) this.hasOffsetPoints = true\n this.renderData.push(pointInfo)\n }\n\n this.clearRenderData = function () {\n this.hasOffsetPoints = false\n this.renderData = []\n }\n\n /**\n * Draw a multipoint\n *\n * @param {Display} display\n */\n\n this.render = function (display) {\n base.render.call(this, display)\n\n if (!this.renderData) return\n\n // set up the main svg group for this stop\n this.initSvg(display)\n this.svgGroup\n .attr('class', 'transitive-sortable')\n .datum({\n owner: this,\n sortableType: 'POINT_MULTI'\n })\n\n if (this.containsSegmentEndPoint()) this.initMergedMarker(display)\n\n // set up the pattern markers\n /* this.marker = this.markerSvg.selectAll('circle')\n .data(this.renderData)\n .enter()\n .append('circle')\n .attr('class', 'transitive-multipoint-marker-pattern'); */\n }\n\n this.initMergedMarker = function (display) {\n // set up the merged marker\n if (this.fromPoint || this.toPoint) {\n this.mergedMarker = this.markerSvg.append('g').append('circle')\n .datum({\n owner: this\n })\n .attr('class', 'transitive-multipoint-marker-merged')\n } else if (this.hasOffsetPoints || this.renderData.length > 1) {\n this.mergedMarker = this.markerSvg.append('g').append('rect')\n .datum({\n owner: this\n })\n .attr('class', 'transitive-multipoint-marker-merged')\n }\n }\n\n /**\n * Refresh the point\n *\n * @param {Display} display\n */\n\n this.refresh = function (display) {\n if (!this.renderData) return\n\n // refresh the merged marker\n if (this.mergedMarker) {\n if (!this.mergedMarkerData) this.initMarkerData(display)\n\n this.mergedMarker.datum({\n owner: this\n })\n this.mergedMarker.attr(this.mergedMarkerData)\n }\n\n /* var cx, cy;\n // refresh the pattern-level markers\n this.marker.data(this.renderData);\n this.marker.attr('transform', function (d, i) {\n cx = d.x;\n cy = d.y;\n var x = display.xScale(d.x) + d.offsetX;\n var y = display.yScale(d.y) - d.offsetY;\n return 'translate(' + x +', ' + y +')';\n }); */\n }\n\n this.getRenderDataArray = function () {\n return this.renderData\n }\n\n this.setFocused = function (focused) {\n this.focused = focused\n each(this.points, function (point) {\n point.setFocused(focused)\n })\n }\n\n this.runFocusTransition = function (display, callback) {\n if (this.mergedMarker) {\n var newStrokeColor = display.styler.compute(display.styler.multipoints_merged\n .stroke, display, {\n owner: this\n })\n this.mergedMarker.transition().style('stroke', newStrokeColor).call(\n callback)\n }\n if (this.label) this.label.runFocusTransition(display, callback)\n }\n})\n\n/**\n * Expose `MultiPoint`\n */\n\nmodule.exports = MultiPoint\n", + "/**\n * Dependencies\n */\n\nvar augment = require('augment')\nvar d3 = require('d3')\n\nvar Point = require('./index')\nvar Util = require('../util')\n\nvar SphericalMercator = require('../util/spherical-mercator')\nvar sm = new SphericalMercator()\n\n/**\n * Place: a Point subclass representing a 'place' that can be rendered on the\n * map. A place is a point *other* than a transit stop/station, e.g. a home/work\n * location, a point of interest, etc.\n */\n\nvar Place = augment(Point, function (base) {\n /**\n * the constructor\n */\n\n this.constructor = function (data) {\n base.constructor.call(this, data)\n\n if (data && data.place_lat && data.place_lon) {\n var xy = Util.latLonToSphericalMercator(data.place_lat, data.place_lon)\n this.worldX = xy[0]\n this.worldY = xy[1]\n }\n\n this.zIndex = 100000\n }\n\n /**\n * Get Type\n */\n\n this.getType = function () {\n return 'PLACE'\n }\n\n /**\n * Get ID\n */\n\n this.getId = function () {\n return this.place_id\n }\n\n /**\n * Get Name\n */\n\n this.getName = function () {\n return this.place_name\n }\n\n /**\n * Get lat\n */\n\n this.getLat = function () {\n return this.place_lat\n }\n\n /**\n * Get lon\n */\n\n this.getLon = function () {\n return this.place_lon\n }\n\n this.containsSegmentEndPoint = function () {\n return true\n }\n\n this.containsFromPoint = function () {\n return (this.getId() === 'from')\n }\n\n this.containsToPoint = function () {\n return (this.getId() === 'to')\n }\n\n this.addRenderData = function (pointInfo) {\n this.renderData.push(pointInfo)\n }\n\n this.getRenderDataArray = function () {\n return this.renderData\n }\n\n this.clearRenderData = function () {\n this.renderData = []\n }\n\n /**\n * Draw a place\n *\n * @param {Display} display\n */\n\n this.render = function (display) {\n base.render.call(this, display)\n if (!this.renderData) return\n\n this.initSvg(display)\n this.svgGroup\n .attr('class', 'transitive-sortable')\n .datum({\n owner: this,\n sortableType: 'POINT_PLACE'\n })\n\n // set up the markers\n this.marker = this.markerSvg.append('circle')\n .datum({\n owner: this\n })\n .attr('class', 'transitive-place-circle')\n\n var iconUrl = display.styler.compute(display.styler.places_icon['xlink:href'], display, {\n owner: this\n })\n if (iconUrl) {\n this.icon = this.markerSvg.append('image')\n .datum({\n owner: this\n })\n .attr('class', 'transitive-place-icon')\n .attr('xlink:href', iconUrl)\n }\n }\n\n /**\n * Refresh the place\n *\n * @param {Display} display\n */\n\n this.refresh = function (display) {\n if (!this.renderData) return\n\n // refresh the marker/icon\n var x = display.xScale(this.worldX)\n var y = display.yScale(this.worldY)\n var translate = 'translate(' + x + ', ' + y + ')'\n this.marker.attr('transform', translate)\n if (this.icon) this.icon.attr('transform', translate)\n }\n\n this.makeDraggable = function (transitive) {\n var place = this\n var display = transitive.display\n var drag = d3.behavior.drag()\n .on('dragstart', function () {\n d3.event.sourceEvent.stopPropagation() // silence other listeners\n })\n .on('drag', function () {\n if (place.graphVertex) {\n var boundingRect = display.el.getBoundingClientRect()\n var x = display.xScale.invert(d3.event.sourceEvent.pageX -\n boundingRect.left)\n var y = display.yScale.invert(d3.event.sourceEvent.pageY -\n boundingRect.top)\n\n place.worldX = x\n place.worldY = y\n var ll = sm.inverse([x, y])\n place.place_lon = ll[0]\n place.place_lat = ll[1]\n\n place.refresh(display)\n }\n })\n .on('dragend', function () {\n transitive.emit('place.' + place.getId() + '.dragend', place)\n })\n this.markerSvg.call(drag)\n }\n})\n\n/**\n * Expose `Place`\n */\n\nmodule.exports = Place\n", + "/**\n * Dependencies\n */\n\nvar each = require('component-each')\n\n/**\n * Expose `PointCluster`\n */\n\nmodule.exports = PointCluster\n\n/**\n *\n */\n\nfunction PointCluster () {\n this.points = []\n}\n\nPointCluster.prototype.addPoint = function (point) {\n if (this.points.indexOf(point) === -1) this.points.push(point)\n}\n\nPointCluster.prototype.mergeVertices = function (graph) {\n var vertices = []\n each(this.points, function (point) {\n vertices.push(point.graphVertex)\n })\n graph.mergeVertices(vertices)\n}\n", + "/**\n * Dependencies\n */\n\nvar d3 = require('d3')\nvar each = require('component-each')\n\nvar PointCluster = require('./pointcluster')\nvar MultiPoint = require('./multipoint')\nvar Util = require('../util')\n\n/**\n * Expose `PointClusterMap`\n */\n\nmodule.exports = PointClusterMap\n\n/**\n *\n */\n\nfunction PointClusterMap (transitive) {\n this.transitive = transitive\n\n this.clusters = []\n this.clusterLookup = {} // maps Point object to its containing cluster\n\n var pointArr = []\n each(transitive.stops, function (key) {\n var point = transitive.stops[key]\n if (point.used) pointArr.push(point)\n }, this)\n each(transitive.turnPoints, function (key) {\n pointArr.push(transitive.turnPoints[key])\n }, this)\n\n var links = d3.geom.voronoi()\n .x(function (d) {\n return d.worldX\n })\n .y(function (d) {\n return d.worldY\n })\n .links(pointArr)\n\n each(links, function (link) {\n var dist = Util.distance(link.source.worldX, link.source.worldY, link.target\n .worldX, link.target.worldY)\n if (dist < 100 && (link.source.getType() !== 'TURN' || link.target.getType() !==\n 'TURN')) {\n var sourceInCluster = (link.source in this.clusterLookup)\n var targetInCluster = (link.target in this.clusterLookup)\n if (sourceInCluster && !targetInCluster) {\n this.addPointToCluster(link.target, this.clusterLookup[link.source])\n } else if (!sourceInCluster && targetInCluster) {\n this.addPointToCluster(link.source, this.clusterLookup[link.target])\n } else if (!sourceInCluster && !targetInCluster) {\n var cluster = new PointCluster()\n this.clusters.push(cluster)\n this.addPointToCluster(link.source, cluster)\n this.addPointToCluster(link.target, cluster)\n }\n }\n }, this)\n\n this.vertexPoints = []\n each(this.clusters, function (cluster) {\n var multipoint = new MultiPoint(cluster.points)\n this.vertexPoints.push(multipoint)\n each(cluster.points, function (point) {\n point.multipoint = multipoint\n }, this)\n }, this)\n}\n\nPointClusterMap.prototype.addPointToCluster = function (point, cluster) {\n cluster.addPoint(point)\n this.clusterLookup[point] = cluster\n}\n\nPointClusterMap.prototype.clearMultiPoints = function () {\n each(this.clusters, function (cluster) {\n each(cluster.points, function (point) {\n point.multipoint = null\n }, this)\n }, this)\n}\n\nPointClusterMap.prototype.getVertexPoints = function (baseVertexPoints) {\n if (!baseVertexPoints) return this.vertexPoints\n var vertexPoints = this.vertexPoints.concat()\n each(baseVertexPoints, function (point) {\n if (!point.multipoint) vertexPoints.push(point)\n })\n return vertexPoints\n}\n", + "/**\n * Dependencies\n */\n\nvar augment = require('augment')\nvar each = require('component-each')\n\nvar Point = require('./index')\nvar Util = require('../util')\n\n/**\n * Place: a Point subclass representing a 'place' that can be rendered on the\n * map. A place is a point *other* than a transit stop/station, e.g. a home/work\n * location, a point of interest, etc.\n */\n\nvar Stop = augment(Point, function (base) {\n this.constructor = function (data) {\n base.constructor.call(this, data)\n\n if (data && data.stop_lat && data.stop_lon) {\n var xy = Util.latLonToSphericalMercator(data.stop_lat, data.stop_lon)\n this.worldX = xy[0]\n this.worldY = xy[1]\n }\n\n this.patterns = []\n\n this.patternRenderData = {}\n this.patternFocused = {}\n this.patternCount = 0\n\n this.patternStylerKey = 'stops_pattern'\n\n this.isSegmentEndPoint = false\n }\n\n /**\n * Get id\n */\n\n this.getId = function () {\n return this.stop_id\n }\n\n /**\n * Get type\n */\n\n this.getType = function () {\n return 'STOP'\n }\n\n /**\n * Get name\n */\n\n this.getName = function () {\n if (!this.stop_name) return ('Unnamed Stop (ID=' + this.getId() + ')')\n return this.stop_name\n }\n\n /**\n * Get lat\n */\n\n this.getLat = function () {\n return this.stop_lat\n }\n\n /**\n * Get lon\n */\n\n this.getLon = function () {\n return this.stop_lon\n }\n\n this.containsSegmentEndPoint = function () {\n return this.isSegmentEndPoint\n }\n\n this.containsBoardPoint = function () {\n return this.isBoardPoint\n }\n\n this.containsAlightPoint = function () {\n return this.isAlightPoint\n }\n\n this.containsTransferPoint = function () {\n return this.isTransferPoint\n }\n\n this.getPatterns = function () {\n return this.patterns\n }\n\n this.addPattern = function (pattern) {\n if (this.patterns.indexOf(pattern) === -1) this.patterns.push(pattern)\n }\n\n /**\n * Add render data\n *\n * @param {Object} stopInfo\n */\n\n this.addRenderData = function (stopInfo) {\n if (stopInfo.rEdge.getType() === 'TRANSIT') {\n var s = {\n sortableType: 'POINT_STOP_PATTERN',\n owner: this,\n getZIndex: function () {\n if (this.owner.graphVertex) {\n return this.owner.getZIndex()\n }\n return this.rEdge.getZIndex() + 1\n }\n }\n\n for (var key in stopInfo) s[key] = stopInfo[key]\n\n var patternId = stopInfo.rEdge.patternIds\n this.patternRenderData[patternId] = s // .push(s);\n\n each(stopInfo.rEdge.patterns, function (pattern) {\n this.addPattern(pattern)\n }, this)\n }\n this.patternCount = Object.keys(this.patternRenderData).length\n }\n\n this.isPatternFocused = function (patternId) {\n if (!(patternId in this.patternFocused)) return true\n return (this.patternFocused[patternId])\n }\n\n this.setPatternFocused = function (patternId, focused) {\n this.patternFocused[patternId] = focused\n }\n\n this.setAllPatternsFocused = function (focused) {\n for (var key in this.patternRenderData) {\n this.patternFocused[key] = focused\n }\n }\n\n /**\n * Draw a stop\n *\n * @param {Display} display\n */\n\n this.render = function (display) {\n base.render.call(this, display)\n if (Object.keys(this.patternRenderData).length === 0) return\n\n var renderDataArray = this.getRenderDataArray()\n\n this.initSvg(display)\n\n // set up the merged marker\n this.mergedMarker = this.markerSvg.append('g').append('rect')\n .attr('class', 'transitive-sortable transitive-stop-marker-merged')\n .datum(this.getMergedRenderData())\n\n // set up the pattern-specific markers\n this.patternMarkers = this.markerSvg.append('g').selectAll('circle')\n .data(renderDataArray)\n .enter()\n .append('circle')\n .attr('class', 'transitive-sortable transitive-stop-marker-pattern')\n }\n\n /**\n * Refresh the stop\n *\n * @param {Display} display\n */\n\n this.refresh = function (display) {\n if (this.patternCount === 0) return\n\n if (!this.mergedMarkerData) this.initMarkerData(display)\n\n // refresh the pattern-level markers\n this.patternMarkers.data(this.getRenderDataArray())\n\n this.patternMarkers.attr('transform', function (d, i) {\n if (!isNaN(d.x) && !isNaN(d.y)) {\n var x = d.x + this.placeOffsets.x\n var y = d.y + this.placeOffsets.y\n return 'translate(' + x + ', ' + y + ')'\n }\n }.bind(this))\n\n // refresh the merged marker\n if (this.mergedMarker) {\n this.mergedMarker.datum(this.getMergedRenderData())\n if (!isNaN(this.mergedMarkerData.x) && !isNaN(this.mergedMarkerData.y)) this.mergedMarker.attr(this.mergedMarkerData)\n }\n }\n\n this.getMergedRenderData = function () {\n return {\n owner: this,\n sortableType: 'POINT_STOP_MERGED'\n }\n }\n\n this.getRenderDataArray = function () {\n var dataArray = []\n for (var patternId in this.patternRenderData) {\n dataArray.push(this.patternRenderData[patternId])\n }\n return dataArray\n }\n\n this.getMarkerBBox = function () {\n if (this.mergedMarker) return this.mergedMarkerData\n }\n\n this.isFocused = function () {\n if (this.mergedMarker || !this.patternRenderData) {\n return (this.focused === true)\n }\n\n var focused = true\n for (var patternId in this.patternRenderData) {\n focused = this && this.isPatternFocused(patternId)\n }\n return focused\n }\n\n this.runFocusTransition = function (display, callback) {\n if (this.mergedMarker) {\n var newStrokeColor = display.styler.compute(display.styler.stops_merged\n .stroke, display, {\n owner: this\n })\n this.mergedMarker.transition().style('stroke', newStrokeColor).call(\n callback)\n }\n if (this.label) this.label.runFocusTransition(display, callback)\n }\n\n this.clearRenderData = function () {\n this.patternRenderData = {}\n this.mergedMarkerData = null\n this.placeOffsets = {\n x: 0,\n y: 0\n }\n }\n})\n\n/**\n * Expose `Stop`\n */\n\nmodule.exports = Stop\n", + "/**\n * Dependencies\n */\n\nvar augment = require('augment')\n\nvar Point = require('./index')\n\nvar SphericalMercator = require('../util/spherical-mercator')\nvar sm = new SphericalMercator()\n\n/**\n *\n */\n\nvar TurnPoint = augment(Point, function (base) {\n this.constructor = function (data, id) {\n base.constructor.call(this, data)\n this.name = 'Turn @ ' + data.lat + ', ' + data.lon\n if (!this.worldX || !this.worldY) {\n var smCoords = sm.forward([data.lon, data.lat])\n this.worldX = smCoords[0]\n this.worldY = smCoords[1]\n this.isSegmentEndPoint = false\n }\n this.id = id\n }\n\n this.getId = function () {\n return this.id\n }\n\n this.getType = function () {\n return 'TURN'\n }\n\n this.getName = function () {\n return this.name\n }\n\n this.containsSegmentEndPoint = function () {\n return this.isSegmentEndPoint\n }\n})\n\n/**\n * Expose `TurnPoint`\n */\n\nmodule.exports = TurnPoint\n", + "var augment = require('augment')\nvar each = require('component-each')\n\nvar Renderer = require('./index')\n\n/**\n * A Renderer subclass for the default network rendering engine.\n *\n * @param {Object} the main Transitive object\n */\n\nvar DefaultRenderer = augment(Renderer, function (base) {\n this.constructor = function (transitive) {\n base.constructor.call(this, transitive)\n }\n\n this.render = function () {\n base.render.call(this)\n\n var self = this\n var display = this.transitive.display\n var network = this.transitive.network\n display.styler = this.transitive.styler\n\n var legendSegments = {}\n\n each(network.renderedEdges, function (rEdge) {\n rEdge.refreshRenderData(display)\n })\n\n each(network.paths, function (path) {\n each(path.segments, function (pathSegment) {\n each(pathSegment.renderedSegments, function (renderedSegment) {\n renderedSegment.render(display)\n var legendType = renderedSegment.getLegendType()\n if (!(legendType in legendSegments)) {\n legendSegments[legendType] = renderedSegment\n }\n })\n })\n })\n\n // draw the vertex-based points\n\n each(network.graph.vertices, function (vertex) {\n vertex.point.render(display)\n if (self.isDraggable(vertex.point)) {\n vertex.point.makeDraggable(self.transitive)\n }\n })\n\n // draw the edge-based points\n each(network.graph.edges, function (edge) {\n edge.pointArray.forEach(function (point) {\n point.render(display)\n })\n })\n\n if (display.legend) display.legend.render(legendSegments)\n\n this.transitive.refresh()\n }\n\n /**\n * Refresh\n */\n\n this.refresh = function (panning) {\n base.refresh.call(this, panning)\n\n var display = this.transitive.display\n var network = this.transitive.network\n var styler = this.transitive.styler\n\n network.graph.vertices.forEach(function (vertex) {\n vertex.point.clearRenderData()\n })\n network.graph.edges.forEach(function (edge) {\n edge.clearRenderData()\n })\n\n // refresh the segment and point marker data\n this.refreshSegmentRenderData()\n network.graph.vertices.forEach(function (vertex) {\n vertex.point.initMarkerData(display)\n })\n\n this.renderedSegments = []\n each(network.paths, function (path) {\n each(path.segments, function (pathSegment) {\n each(pathSegment.renderedSegments, function (rSegment) {\n rSegment.refresh(display)\n this.renderedSegments.push(rSegment)\n }, this)\n }, this)\n }, this)\n\n network.graph.vertices.forEach(function (vertex) {\n var point = vertex.point\n if (!point.svgGroup) return // check if this point is not currently rendered\n styler.stylePoint(display, point)\n point.refresh(display)\n })\n\n // re-draw the edge-based points\n network.graph.edges.forEach(function (edge) {\n edge.pointArray.forEach(function (point) {\n if (!point.svgGroup) return // check if this point is not currently rendered\n styler.styleStop(display, point)\n point.refresh(display)\n })\n })\n\n // refresh the label layout\n var labeledElements = this.transitive.labeler.doLayout()\n labeledElements.points.forEach(function (point) {\n point.refreshLabel(display)\n styler.stylePointLabel(display, point)\n })\n each(this.transitive.labeler.segmentLabels, function (label) {\n label.refresh(display)\n styler.styleSegmentLabel(display, label)\n })\n\n this.sortElements()\n }\n\n this.refreshSegmentRenderData = function () {\n each(this.transitive.network.renderedEdges, function (rEdge) {\n rEdge.refreshRenderData(this.transitive.display)\n }, this)\n\n // try intersecting adjacent rendered edges to create a smooth transition\n\n var isectKeys = [] // keep track of edge-edge intersections we've already computed\n each(this.transitive.network.paths, function (path) {\n each(path.segments, function (pathSegment) {\n each(pathSegment.renderedSegments, function (rSegment) {\n for (var s = 0; s < rSegment.renderedEdges.length - 1; s++) {\n var rEdge1 = rSegment.renderedEdges[s]\n var rEdge2 = rSegment.renderedEdges[s + 1]\n var key = rEdge1.getId() + '_' + rEdge2.getId()\n if (isectKeys.indexOf(key) !== -1) continue\n if (rEdge1.graphEdge.isInternal && rEdge2.graphEdge.isInternal) {\n rEdge1.intersect(rEdge2)\n }\n isectKeys.push(key)\n }\n })\n })\n })\n }\n\n /**\n * sortElements\n */\n\n this.sortElements = function () {\n this.renderedSegments.sort(function (a, b) {\n return (a.compareTo(b))\n })\n\n var focusBaseZIndex = 100000\n\n this.renderedSegments.forEach(function (rSegment, index) {\n rSegment.zIndex = index * 10 + (rSegment.isFocused()\n ? focusBaseZIndex\n : 0)\n })\n\n this.transitive.network.graph.vertices.forEach(function (vertex) {\n var point = vertex.point\n point.zIndex = point.zIndex + (point.isFocused() ? focusBaseZIndex : 0)\n })\n\n this.transitive.display.svg.selectAll('.transitive-sortable').sort(function (a, b) {\n var aIndex = (typeof a.getZIndex === 'function') ? a.getZIndex() : a.owner\n .getZIndex()\n var bIndex = (typeof b.getZIndex === 'function') ? b.getZIndex() : b.owner\n .getZIndex()\n return aIndex - bIndex\n })\n }\n\n /**\n * focusPath\n */\n\n this.focusPath = function (path) {\n var self = this\n var pathRenderedSegments = []\n var graph = this.transitive.network.graph\n\n if (path) { // if we're focusing a specific path\n pathRenderedSegments = path.getRenderedSegments()\n\n // un-focus all internal points\n graph.edges.forEach(function (edge) {\n edge.pointArray.forEach(function (point, i) {\n point.setAllPatternsFocused(false)\n })\n }, this)\n } else { // if we're returing to 'all-focused' mode\n // re-focus all internal points\n graph.edges.forEach(function (edge) {\n edge.pointArray.forEach(function (point, i) {\n point.setAllPatternsFocused(true)\n })\n }, this)\n }\n\n var focusChangeSegments = []\n var focusedVertexPoints = []\n each(this.renderedSegments, function (rSegment) {\n if (path && pathRenderedSegments.indexOf(rSegment) === -1) {\n if (rSegment.isFocused()) focusChangeSegments.push(rSegment)\n rSegment.setFocused(false)\n } else {\n if (!rSegment.isFocused()) focusChangeSegments.push(rSegment)\n rSegment.setFocused(true)\n focusedVertexPoints.push(rSegment.pathSegment.startVertex().point)\n focusedVertexPoints.push(rSegment.pathSegment.endVertex().point)\n }\n })\n\n var focusChangePoints = []\n graph.vertices.forEach(function (vertex) {\n var point = vertex.point\n if (focusedVertexPoints.indexOf(point) !== -1) {\n if (!point.isFocused()) focusChangePoints.push(point)\n point.setFocused(true)\n } else {\n if (point.isFocused()) focusChangePoints.push(point)\n point.setFocused(false)\n }\n }, this)\n\n // bring the focused elements to the front for the transition\n // if (path) this.sortElements();\n\n // create a transition callback function that invokes refresh() after all transitions complete\n var n = 0\n var refreshOnEnd = function (transition, callback) {\n transition\n .each(function () {\n ++n\n })\n .each('end', function () {\n if (!--n) self.transitive.refresh()\n })\n }\n\n // run the transtions on the affected elements\n each(focusChangeSegments, function (segment) {\n segment.runFocusTransition(this.transitive.display, refreshOnEnd)\n }, this)\n\n each(focusChangePoints, function (point) {\n point.runFocusTransition(this.transitive.display, refreshOnEnd)\n }, this)\n }\n})\n\n/**\n * Expose `DefaultRenderer`\n */\n\nmodule.exports = DefaultRenderer\n", + "var augment = require('augment')\nvar each = require('component-each')\n\nvar drawGrid = require('../display/draw-grid')\n\n/**\n * A superclass for a Transitive network rendering engine.\n *\n * @param {Object} the main Transitive object\n */\n\nvar Renderer = augment(Object, function () {\n this.constructor = function (transitive) {\n this.transitive = transitive\n }\n\n this.render = function () {\n var display = this.transitive.display\n display.styler = this.transitive.styler\n\n // remove all old svg elements\n display.empty()\n }\n\n /**\n * Refresh\n */\n\n this.refresh = function (panning) {\n var display = this.transitive.display\n var network = this.transitive.network\n\n if (display.tileLayer) display.tileLayer.zoomed()\n\n network.graph.vertices.forEach(function (vertex) {\n vertex.point.clearRenderData()\n })\n network.graph.edges.forEach(function (edge) {\n edge.clearRenderData()\n })\n\n // draw the grid, if necessary\n if (this.transitive.options.drawGrid) drawGrid(display, this.gridCellSize)\n }\n\n /**\n * sortElements\n */\n\n this.sortElements = function () {}\n\n /**\n * focusPath\n */\n\n this.focusPath = function (path) {}\n\n this.isDraggable = function (point) {\n var draggableTypes = this.transitive.options.draggableTypes\n if (!draggableTypes) return false\n\n var retval = false\n each(draggableTypes, function (type) {\n if (type === point.getType()) {\n // Return true in ether of the following cases:\n // 1. No ID array is provided for this point type (i.e. entire type is draggable)\n // 2. An ID array is provided and it includes this Point's ID\n retval = !draggableTypes[type] || draggableTypes[type].indexOf(point.getId()) !== -1\n }\n })\n return retval\n }\n})\n\n/**\n * Expose `Renderer`\n */\n\nmodule.exports = Renderer\n", + "var each = require('component-each')\n\nvar Util = require('../util')\n\nvar rEdgeId = 0\n\n/**\n * Expose `RenderedEdge`\n */\n\nmodule.exports = RenderedEdge\n\n/**\n *\n */\n\nfunction RenderedEdge (graphEdge, forward, type) {\n this.id = rEdgeId++\n this.graphEdge = graphEdge\n this.forward = forward\n this.type = type\n this.points = []\n this.clearOffsets()\n this.focused = true\n this.sortableType = 'SEGMENT'\n}\n\nRenderedEdge.prototype.clearGraphData = function () {\n this.graphEdge = null\n this.edgeFromOffset = 0\n this.edgeToOffset = 0\n}\n\nRenderedEdge.prototype.addPattern = function (pattern) {\n if (!this.patterns) this.patterns = []\n if (this.patterns.indexOf(pattern) !== -1) return\n this.patterns.push(pattern)\n\n // generate the patternIds field\n this.patternIds = constuctIdListString(this.patterns)\n}\n\nRenderedEdge.prototype.addPathSegment = function (pathSegment) {\n if (!this.pathSegments) this.pathSegments = []\n if (this.pathSegments.indexOf(pathSegment) !== -1) return\n this.pathSegments.push(pathSegment)\n\n // generate the pathSegmentIds field\n this.pathSegmentIds = constuctIdListString(this.pathSegments)\n}\n\nfunction constuctIdListString (items) {\n var idArr = []\n each(items, function (item) {\n idArr.push(item.getId())\n })\n idArr.sort()\n return idArr.join(',')\n}\n\nRenderedEdge.prototype.getId = function () {\n return this.id\n}\n\nRenderedEdge.prototype.getType = function () {\n return this.type\n}\n\nRenderedEdge.prototype.setFromOffset = function (offset) {\n this.fromOffset = offset\n}\n\nRenderedEdge.prototype.setToOffset = function (offset) {\n this.toOffset = offset\n}\n\nRenderedEdge.prototype.clearOffsets = function () {\n this.fromOffset = 0\n this.toOffset = 0\n}\n\nRenderedEdge.prototype.getAlignmentVector = function (alignmentId) {\n if (this.graphEdge.getFromAlignmentId() === alignmentId) {\n return this.graphEdge.fromVector\n }\n if (this.graphEdge.getToAlignmentId() === alignmentId) {\n return this.graphEdge.toVector\n }\n return null\n}\n\nRenderedEdge.prototype.offsetAlignment = function (alignmentId, offset) {\n if (this.graphEdge.getFromAlignmentId() === alignmentId) {\n this.setFromOffset(Util.isOutwardVector(this.graphEdge.fromVector)\n ? offset\n : -offset)\n }\n if (this.graphEdge.getToAlignmentId() === alignmentId) {\n this.setToOffset(Util.isOutwardVector(this.graphEdge.toVector) ? offset : -offset)\n }\n}\n\nRenderedEdge.prototype.setFocused = function (focused) {\n this.focused = focused\n}\n\nRenderedEdge.prototype.refreshRenderData = function (display) {\n if (this.graphEdge.fromVertex.x === this.graphEdge.toVertex.x &&\n this.graphEdge.fromVertex.y === this.graphEdge.toVertex.y) {\n this.renderData = []\n return\n }\n\n this.lineWidth = this.computeLineWidth(display, true)\n\n var fromOffsetPx = this.fromOffset * this.lineWidth\n var toOffsetPx = this.toOffset * this.lineWidth\n\n if (this.graphEdge.geomCoords) {\n this.renderData = this.graphEdge.getGeometricCoords(fromOffsetPx, toOffsetPx, display, this.forward)\n } else {\n this.renderData = this.graphEdge.getRenderCoords(fromOffsetPx, toOffsetPx,\n display, this.forward)\n }\n\n var firstRenderPoint = this.renderData[0]\n var lastRenderPoint = this.renderData[this.renderData.length - 1]\n\n var pt\n if (!this.graphEdge.fromVertex.isInternal) {\n pt = this.forward ? firstRenderPoint : lastRenderPoint\n if (pt) {\n this.graphEdge.fromVertex.point.addRenderData({\n x: pt.x,\n y: pt.y,\n rEdge: this\n })\n }\n }\n\n pt = this.forward ? lastRenderPoint : firstRenderPoint\n if (pt) {\n this.graphEdge.toVertex.point.addRenderData({\n x: pt.x,\n y: pt.y,\n rEdge: this\n })\n }\n\n each(this.graphEdge.pointArray, function (point, i) {\n if (point.getType() === 'TURN') return\n var t = (i + 1) / (this.graphEdge.pointArray.length + 1)\n var coord = this.graphEdge.coordAlongEdge(this.forward ? t : (1 - t),\n this.renderData, display)\n if (coord) {\n point.addRenderData({\n x: coord.x,\n y: coord.y,\n rEdge: this\n })\n }\n }, this)\n}\n\nRenderedEdge.prototype.computeLineWidth = function (display, includeEnvelope) {\n var styler = display.styler\n if (styler && display) {\n // compute the line width\n var env = styler.compute(styler.segments.envelope, display, this)\n if (env && includeEnvelope) {\n return parseFloat(env.substring(0, env.length - 2), 10) - 2\n } else {\n var lw = styler.compute(styler.segments['stroke-width'], display, this)\n return parseFloat(lw.substring(0, lw.length - 2), 10) - 2\n }\n }\n}\n\nRenderedEdge.prototype.isFocused = function () {\n return (this.focused === true)\n}\n\nRenderedEdge.prototype.getZIndex = function () {\n return 10000\n}\n\n/**\n * Computes the point of intersection between two adjacent, offset RenderedEdges (the\n * edge the function is called on and a second egde passed as a parameter)\n * by \"extending\" the adjacent edges and finding the point of intersection. If\n * such a point exists, the existing renderData arrays for the edges are\n * adjusted accordingly, as are any associated stops.\n */\n\nRenderedEdge.prototype.intersect = function (rEdge) {\n // do no intersect adjacent edges of unequal bundle size\n if (this.graphEdge.renderedEdges.length !== rEdge.graphEdge.renderedEdges.length) return\n\n var commonVertex = this.graphEdge.commonVertex(rEdge.graphEdge)\n if (!commonVertex || commonVertex.point.isSegmentEndPoint) return\n\n var thisCheck = (commonVertex === this.graphEdge.fromVertex && this.forward) || (commonVertex === this.graphEdge.toVertex &&\n !this.forward)\n var otherCheck = (commonVertex === rEdge.graphEdge.fromVertex && rEdge.forward) || (commonVertex === rEdge.graphEdge.toVertex &&\n !rEdge.forward)\n\n var p1 = (thisCheck)\n ? this.renderData[0]\n : this.renderData[this.renderData.length - 1]\n var v1 = this.graphEdge.getVector(commonVertex)\n\n var p2 = (otherCheck)\n ? rEdge.renderData[0]\n : rEdge.renderData[rEdge.renderData.length - 1]\n var v2 = rEdge.graphEdge.getVector(commonVertex)\n\n if ((!p1 || !p2 || !v1 || !v2) || (p1.x === p2.x && p1.y === p2.y)) return\n\n var isect = Util.lineIntersection(p1.x, p1.y, p1.x + v1.x, p1.y - v1.y, p2.x,\n p2.y, p2.x + v2.x, p2.y - v2.y)\n\n if (!isect.intersect) return\n\n // adjust the endpoint of the first edge\n if (thisCheck) {\n this.renderData[0].x = isect.x\n this.renderData[0].y = isect.y\n } else {\n this.renderData[this.renderData.length - 1].x = isect.x\n this.renderData[this.renderData.length - 1].y = isect.y\n }\n\n // adjust the endpoint of the second edge\n if (otherCheck) {\n rEdge.renderData[0].x = isect.x\n rEdge.renderData[0].y = isect.y\n } else {\n rEdge.renderData[rEdge.renderData.length - 1].x = isect.x\n rEdge.renderData[rEdge.renderData.length - 1].y = isect.y\n }\n\n // update the point renderData\n commonVertex.point.addRenderData({\n x: isect.x,\n y: isect.y,\n rEdge: this\n })\n}\n\nRenderedEdge.prototype.findExtension = function (vertex) {\n var incidentEdges = vertex.incidentEdges(this.graphEdge)\n var bundlerId = this.patternIds || this.pathSegmentIds\n for (var e = 0; e < incidentEdges.length; e++) {\n var edgeSegments = incidentEdges[e].renderedEdges\n for (var s = 0; s < edgeSegments.length; s++) {\n var segment = edgeSegments[s]\n var otherId = segment.patternIds || segment.pathSegmentIds\n if (bundlerId === otherId) {\n return segment\n }\n }\n }\n}\n\nRenderedEdge.prototype.toString = function () {\n return 'RenderedEdge ' + this.id + ' type=' + this.type + ' on ' + this.graphEdge\n .toString() + ' w/ patterns ' + this.patternIds + ' fwd=' + this.forward\n}\n", + "/**\n * Dependencies\n */\n\nvar d3 = require('d3')\nvar each = require('component-each')\n\nvar interpolateLine = require('../util/interpolate-line')\n\n/**\n * Expose `RenderedSegment`\n */\n\nmodule.exports = RenderedSegment\n\nvar rSegmentId = 0\n\n/**\n *\n */\n\nfunction RenderedSegment (pathSegment) {\n this.id = rSegmentId++\n this.renderedEdges = []\n this.pathSegment = pathSegment\n if (pathSegment) this.type = pathSegment.type\n this.focused = true\n}\n\nRenderedSegment.prototype.getId = function () {\n return this.id\n}\n\nRenderedSegment.prototype.getType = function () {\n return this.type\n}\n\nRenderedSegment.prototype.addRenderedEdge = function (rEdge) {\n this.renderedEdges.push(rEdge)\n}\n\nRenderedSegment.prototype.render = function (display) {\n this.line = d3.svg.line() // the line translation function\n .x(function (data, i) {\n return data.x\n })\n .y(function (data, i) {\n return data.y\n })\n .interpolate(interpolateLine.bind({\n segment: this,\n display: display\n }))\n\n this.svgGroup = display.svg.append('g')\n\n this.lineSvg = this.svgGroup.append('g')\n .attr('class', 'transitive-sortable')\n .datum({\n owner: this,\n sortableType: 'SEGMENT'\n })\n\n this.labelSvg = this.svgGroup.append('g')\n\n this.lineGraph = this.lineSvg.append('path')\n\n this.lineGraph\n .attr('class', 'transitive-line')\n .data([this])\n\n this.lineGraphFront = this.lineSvg.append('path')\n\n this.lineGraphFront\n .attr('class', 'transitive-line-front')\n .data([this])\n\n if (display.haloLayer) {\n this.lineGraphHalo = display.haloLayer.append('path')\n\n this.lineGraphHalo\n .attr('class', 'transitive-line-halo')\n .data([this])\n }\n}\n\nRenderedSegment.prototype.refresh = function (display, renderData) {\n if (renderData) {\n this.renderData = renderData\n } else {\n this.renderData = []\n each(this.renderedEdges, function (rEdge) {\n this.renderData = this.renderData.concat(rEdge.renderData)\n }, this)\n }\n\n var lineData = this.line(this.renderData)\n this.lineGraph.attr('d', lineData)\n this.lineGraphFront.attr('d', lineData)\n if (this.lineGraphHalo) this.lineGraphHalo.attr('d', lineData)\n display.styler.styleSegment(display, this)\n}\n\nRenderedSegment.prototype.setFocused = function (focused) {\n this.focused = focused\n}\n\nRenderedSegment.prototype.isFocused = function () {\n return this.focused\n}\n\nRenderedSegment.prototype.runFocusTransition = function (display, callback) {\n var newColor = display.styler.compute(display.styler.segments.stroke, display,\n this)\n this.lineGraph.transition().style('stroke', newColor).call(callback)\n}\n\nRenderedSegment.prototype.getZIndex = function () {\n return this.zIndex\n}\n\nRenderedSegment.prototype.computeLineWidth = function (display, includeEnvelope) {\n var styler = display.styler\n if (styler && display) {\n // compute the line width\n var env = styler.compute(styler.segments.envelope, display, this)\n if (env && includeEnvelope) {\n return parseFloat(env.substring(0, env.length - 2), 10) - 2\n } else {\n var lw = styler.compute(styler.segments['stroke-width'], display, this)\n return parseFloat(lw.substring(0, lw.length - 2), 10) - 2\n }\n }\n}\n\nRenderedSegment.prototype.compareTo = function (other) {\n // show transit segments in front of other types\n if (this.type === 'TRANSIT' && other.type !== 'TRANSIT') return -1\n if (other.type === 'TRANSIT' && this.type !== 'TRANSIT') return 1\n\n if (this.type === 'TRANSIT' && other.type === 'TRANSIT') {\n // for two transit segments, try sorting transit mode first\n if (this.mode && other.mode && this.mode !== other.mode) {\n return (this.mode > other.mode)\n }\n\n // for two transit segments of the same mode, sort by id (for display consistency)\n return (this.getId() < other.getId())\n }\n}\n\nRenderedSegment.prototype.getLabelTextArray = function () {\n var textArray = []\n each(this.patterns, function (pattern) {\n var shortName = pattern.route.route_short_name\n if (textArray.indexOf(shortName) === -1) textArray.push(shortName)\n })\n return textArray\n}\n\nRenderedSegment.prototype.getLabelAnchors = function (display, spacing) {\n var labelAnchors = []\n this.computeRenderLength(display)\n var anchorCount = Math.floor(this.renderLength / spacing)\n var pctSpacing = spacing / this.renderLength\n\n for (var i = 0; i < anchorCount; i++) {\n var t = (i % 2 === 0)\n ? 0.5 + (i / 2) * pctSpacing\n : 0.5 - ((i + 1) / 2) * pctSpacing\n var coord = this.coordAlongRenderedPath(t, display)\n if (coord) labelAnchors.push(coord)\n }\n\n return labelAnchors\n}\n\nRenderedSegment.prototype.coordAlongRenderedPath = function (t, display) {\n var loc = t * this.renderLength\n\n var cur = 0\n for (var i = 0; i < this.renderedEdges.length; i++) {\n var rEdge = this.renderedEdges[i]\n var edgeRenderLen = rEdge.graphEdge.getRenderLength(display)\n if (loc <= cur + edgeRenderLen) {\n var t2 = (loc - cur) / edgeRenderLen\n return rEdge.graphEdge.coordAlongEdge(t2, rEdge.renderData, display)\n }\n cur += edgeRenderLen\n }\n}\n\nRenderedSegment.prototype.computeRenderLength = function (display) {\n this.renderLength = 0\n each(this.renderedEdges, function (rEdge) {\n this.renderLength += rEdge.graphEdge.getRenderLength(display)\n }, this)\n}\n\nRenderedSegment.prototype.getLegendType = function () {\n if (this.type === 'TRANSIT') {\n return this.type + '_' + this.mode\n }\n return this.type\n}\n\nRenderedSegment.prototype.toString = function () {\n return 'RenderedSegment ' + this.id + ' on ' + (this.pathSegment ? this.pathSegment.toString() : ' (null segment)')\n}\n", + "var d3 = require('d3')\nvar augment = require('augment')\nvar each = require('component-each')\n\nvar Renderer = require('./index')\nvar Point = require('../point/index')\n\nvar interpolateLine = require('../util/interpolate-line')\n\n/**\n * A Renderer subclass for drawing a simplified representation of the graph\n * itself, i.e. just the edges and vertices.\n *\n * @param {Object} the main Transitive object\n */\n\nvar WireframeRenderer = augment(Renderer, function (base) {\n this.constructor = function (transitive) {\n base.constructor.call(this, transitive)\n }\n\n this.render = function () {\n base.render.call(this)\n\n var graph = this.transitive.network.graph\n\n var self = this\n\n this.wireframeEdges = []\n each(graph.edges, function (edge) {\n var wfEdge = new WireframeEdge(edge)\n wfEdge.render(self.transitive.display)\n self.wireframeEdges.push(wfEdge)\n })\n\n this.wireframeVertices = []\n each(graph.vertices, function (vertex) {\n var wfVertex = new WireframeVertex(vertex)\n wfVertex.render(self.transitive.display)\n self.wireframeVertices.push(wfVertex)\n })\n\n this.transitive.refresh()\n }\n\n this.refresh = function (panning) {\n base.refresh.call(this, panning)\n var self = this\n\n each(this.wireframeEdges, function (wfEdge) {\n wfEdge.refresh(self.transitive.display)\n })\n\n each(this.wireframeVertices, function (wfVertex) {\n wfVertex.refresh(self.transitive.display)\n })\n }\n\n /**\n * sortElements\n */\n\n this.sortElements = function () {}\n})\n\n/**\n * Expose `WireframeRenderer`\n */\n\nmodule.exports = WireframeRenderer\n\n/**\n * WireframeVertex helper class\n */\n\nvar WireframeVertex = augment(Point, function (base) {\n this.constructor = function (vertex) {\n base.constructor.call(this, {\n vertex: vertex\n })\n }\n\n this.getType = function () {\n return 'WIREFRAME_VERTEX'\n }\n\n /**\n * Draw the vertex\n *\n * @param {Display} display\n */\n\n this.render = function (display) {\n base.render.call(this, display)\n\n this.initSvg(display)\n this.svgGroup\n .attr('class', 'transitive-sortable')\n .datum({\n owner: this,\n sortableType: 'POINT_WIREFRAME_VERTEX'\n })\n\n // set up the marker\n this.marker = this.markerSvg.append('circle')\n .datum({\n owner: this\n })\n .attr('class', 'transitive-wireframe-vertex-circle')\n }\n\n /**\n * Refresh the vertex\n *\n * @param {Display} display\n */\n\n this.refresh = function (display) {\n var x = display.xScale(this.vertex.x)\n var y = display.yScale(this.vertex.y)\n var translate = 'translate(' + x + ', ' + y + ')'\n this.marker.attr('transform', translate)\n display.styler.styleWireframeVertex(display, this)\n }\n})\n\n/**\n * WireframeEdge helper class\n */\n\nvar WireframeEdge = augment(Object, function () {\n this.constructor = function (edge) {\n this.edge = edge\n }\n\n this.render = function (display) {\n this.line = d3.svg.line() // the line translation function\n .x(function (data, i) {\n return data.x\n })\n .y(function (data, i) {\n return data.y\n })\n .interpolate(interpolateLine.bind({\n segment: this,\n display: display\n }))\n\n this.svgGroup = display.svg.append('g')\n\n this.lineSvg = this.svgGroup.append('g')\n .attr('class', 'transitive-sortable')\n .datum({\n owner: this,\n sortableType: 'WIREFRAME_EDGE'\n })\n\n this.lineGraph = this.lineSvg.append('path')\n .attr('class', 'transitive-wireframe-edge-line')\n }\n\n this.refresh = function (display) {\n this.renderData = this.edge.getRenderCoords(0, 0, display, true)\n var lineData = this.line(this.renderData)\n this.lineGraph.attr('d', lineData)\n display.styler.styleWireframeEdge(display, this)\n }\n})\n", + "var Route = require('../core/route')\nvar RoutePattern = require('../core/pattern')\nvar Util = require('../util')\n\nvar styles = require('./styles')\n\n/**\n * Element Types\n */\n\nvar types = [\n 'labels',\n 'segments',\n 'segments_front',\n 'segments_halo',\n 'segment_labels',\n 'segment_label_containers',\n 'stops_merged',\n 'stops_pattern',\n 'places',\n 'places_icon',\n 'multipoints_merged',\n 'multipoints_pattern',\n 'wireframe_vertices',\n 'wireframe_edges'\n]\n\n/**\n * SVG attributes\n */\n\nvar svgAttributes = [\n 'height',\n 'target',\n 'title',\n 'width',\n 'y1',\n 'y2',\n 'x1',\n 'x2',\n 'cx',\n 'cy',\n 'dx',\n 'dy',\n 'rx',\n 'ry',\n 'd',\n 'r',\n 'y',\n 'x',\n 'transform'\n]\n\n/**\n * Expose `Styler`\n */\n\nmodule.exports = Styler\n\n/**\n * Styler object\n */\n\nfunction Styler (styles) {\n if (!(this instanceof Styler)) return new Styler(styles)\n\n // reset styles\n this.reset()\n\n // load styles\n if (styles) this.load(styles)\n}\n\n/**\n * Clear all current styles\n */\n\nStyler.prototype.clear = function () {\n for (var i in types) {\n this[types[i]] = {}\n }\n}\n\n/**\n * Reset to the predefined styles\n */\n\nStyler.prototype.reset = function () {\n for (var i in types) {\n var type = types[i]\n this[type] = Object.assign({}, styles[type] || {})\n for (var key in this[type]) {\n if (!Array.isArray(this[type][key])) this[type][key] = [this[type][key]]\n }\n }\n}\n\n/**\n * Load rules\n *\n * @param {Object} a set of style rules\n */\n\nStyler.prototype.load = function (styles) {\n for (var i in types) {\n var type = types[i]\n if (styles[type]) {\n for (var key in styles[type]) {\n this[type][key] = (this[type][key] || []).concat(styles[type][key])\n }\n }\n }\n}\n\n/**\n * Style a Segment using the rules defined in styles.js or the Transitive options\n *\n * @param {Display} Transitive Display object\n * @param {RenderedSegment} Transitive RenderedSegment object\n */\n\nStyler.prototype.styleSegment = function (display, segment) {\n if (segment.lineGraphHalo) {\n this.applyAttrAndStyle(\n display,\n segment.lineGraphHalo,\n this.segments_halo\n )\n }\n\n this.applyAttrAndStyle(\n display,\n segment.lineGraph,\n this.segments\n )\n\n this.applyAttrAndStyle(\n display,\n segment.lineGraphFront,\n this.segments_front\n )\n}\n\n/**\n * Style a WireframeEdge using the rules defined in styles.js or the Transitive options\n *\n * @param {Display} Transitive Display object\n * @param {WireframeEdge} Transitive WireframeEdge object\n */\n\nStyler.prototype.styleWireframeEdge = function (display, wfEdge) {\n this.applyAttrAndStyle(\n display,\n wfEdge.svgGroup.selectAll('.transitive-wireframe-edge-line'),\n this.wireframe_edges\n )\n}\n\n/**\n * Style a Point using the rules defined in styles.js or the Transitive options\n *\n * @param {Display} Transitive Display object\n * @param {Point} Transitive Point object\n */\n\nStyler.prototype.stylePoint = function (display, point) {\n if (point.getType() === 'STOP') this.styleStop(display, point)\n if (point.getType() === 'PLACE') this.stylePlace(display, point)\n if (point.getType() === 'MULTI') this.styleMultiPoint(display, point)\n if (point.getType() === 'WIREFRAME_VERTEX') this.styleWireframeVertex(display, point)\n}\n\n/**\n * Style a Stop using the rules defined in styles.js or the Transitive options\n *\n * @param {Display} Transitive Display object\n * @param {Stop} Transitive Stop object\n */\n\nStyler.prototype.styleStop = function (display, stop) {\n this.applyAttrAndStyle(\n display,\n stop.patternMarkers,\n this.stops_pattern\n )\n\n this.applyAttrAndStyle(\n display,\n stop.mergedMarker,\n this.stops_merged\n )\n\n this.applyAttrAndStyle(\n display,\n stop.svgGroup.selectAll('.transitive-stop-label'),\n this.labels\n )\n}\n\n/**\n * Style a Place using the rules defined in styles.js or the Transitive options\n *\n * @param {Display} Transitive Display object\n * @param {Place} Transitive Place object\n */\n\nStyler.prototype.stylePlace = function (display, place) {\n this.applyAttrAndStyle(\n display,\n place.svgGroup.selectAll('.transitive-place-circle'),\n this.places\n )\n\n this.applyAttrAndStyle(\n display,\n place.svgGroup.selectAll('.transitive-place-icon'),\n this.places_icon\n )\n\n this.applyAttrAndStyle(\n display,\n place.svgGroup.selectAll('.transitive-place-label'),\n this.labels\n )\n}\n\n/**\n * Style a MultiPoint using the rules defined in styles.js or the Transitive options\n *\n * @param {Display} Transitive Display object\n * @param {MultiPoint} Transitive MultiPoint object\n */\n\nStyler.prototype.styleMultiPoint = function (display, multipoint) {\n this.applyAttrAndStyle(\n display,\n multipoint.svgGroup.selectAll('.transitive-multipoint-marker-pattern'),\n this.multipoints_pattern\n )\n\n this.applyAttrAndStyle(\n display,\n multipoint.svgGroup.selectAll('.transitive-multipoint-marker-merged'),\n this.multipoints_merged\n )\n\n this.applyAttrAndStyle(\n display,\n multipoint.svgGroup.selectAll('.transitive-multi-label'),\n this.labels\n )\n}\n\n/**\n * Style a WireframeVertex using the rules defined in styles.js or the Transitive options\n *\n * @param {Display} Transitive Display object\n * @param {WireframeVertex} Transitive WireframeVertex object\n */\n\nStyler.prototype.styleWireframeVertex = function (display, wfVertex) {\n this.applyAttrAndStyle(\n display,\n wfVertex.svgGroup.selectAll('.transitive-wireframe-vertex-circle'),\n this.wireframe_vertices\n )\n}\n\n/**\n * Style a Point label using the rules defined in styles.js or the Transitive options\n *\n * @param {Display} Transitive Display object\n * @param {Point} Transitive Point object\n */\n\nStyler.prototype.stylePointLabel = function (display, point) {\n var pointType = point.getType().toLowerCase()\n\n this.applyAttrAndStyle(\n display,\n point.svgGroup.selectAll('.transitive-' + pointType + '-label'),\n this.labels\n )\n}\n\n/**\n * Style a Segment label using the rules defined in styles.js or the Transitive options\n *\n * @param {Display} Transitive Display object\n * @param {SegmentLabel} Transitive SegmentLabel object\n */\n\nStyler.prototype.styleSegmentLabel = function (display, label) {\n this.applyAttrAndStyle(\n display,\n label.svgGroup.selectAll('.transitive-segment-label-container'),\n this.segment_label_containers\n )\n this.applyAttrAndStyle(\n display,\n label.svgGroup.selectAll('.transitive-segment-label'),\n this.segment_labels\n )\n}\n\n/**\n * Check if it's an attribute or a style and apply accordingly\n *\n * @param {Display} the Display object\n * @param {Object} a D3 list of elements\n * @param {Object} the list of attributes\n */\n\nStyler.prototype.applyAttrAndStyle = function (display, elements, attributes) {\n for (var name in attributes) {\n var rules = attributes[name]\n var fn = svgAttributes.indexOf(name) === -1 ? 'style' : 'attr'\n\n this.applyRules(display, elements, name, rules, fn)\n }\n}\n\n/**\n * Apply style/attribute rules to a list of elements\n *\n * @param {Display} display object\n * @param {Object} elements\n * @param {String} rule name\n * @param {Array} rules\n * @param {String} style/attr\n */\n\nStyler.prototype.applyRules = function (display, elements, name, rules, fn) {\n var self = this\n elements[fn](name, function (data, index) {\n return self.compute(rules, display, data, index)\n })\n}\n\n/**\n * Compute a style rule based on the current display and data\n *\n * @param {Array} array of rules\n * @param {Object} the Display object\n * @param {Object} data associated with this object\n * @param {Number} index of this object\n */\n\nStyler.prototype.compute = function (rules, display, data, index) {\n var computed\n var self = this\n for (var i in rules) {\n var rule = rules[i]\n var val = isFunction(rule)\n ? rule.call(self, display, data, index, styles.utils)\n : rule\n if (val !== undefined && val !== null) computed = val\n }\n return computed\n}\n\n/**\n * Return the collection of default segment styles for a mode.\n *\n * @param {String} an OTP mode string\n */\n\nStyler.prototype.getModeStyles = function (mode, display) {\n var modeStyles = {}\n\n // simulate a segment w/ the specified style\n var segment = {\n focused: true,\n isFocused: function () {\n return true\n }\n }\n\n if (mode === 'WALK' || mode === 'BICYCLE' || mode === 'BICYCLE_RENT' || mode === 'CAR') {\n segment.type = mode\n } else { // assume a transit mode\n segment.type = 'TRANSIT'\n segment.mode = Util.otpModeToGtfsType(mode)\n var route = new Route({\n route_type: segment.mode,\n agency_id: '',\n route_id: '',\n route_short_name: '',\n route_long_name: ''\n })\n var pattern = new RoutePattern({})\n route.addPattern(pattern)\n segment.patterns = [pattern]\n }\n\n for (var attrName in this.segments) {\n var rules = this.segments[attrName]\n for (var i in rules) {\n var rule = rules[i]\n var val = isFunction(rule)\n ? rule.call(this, display, segment, 0, styles.utils)\n : rule\n if (val !== undefined && val !== null) {\n modeStyles[attrName] = val\n }\n }\n }\n\n return modeStyles\n}\n\n/**\n * Is function?\n */\n\nfunction isFunction (val) {\n return Object.prototype.toString.call(val) === '[object Function]'\n}\n", + "var d3 = require('d3')\n\n/**\n * Scales for utility functions to use\n */\n\nvar zoomScale = d3.scale.linear().domain([0.25, 1, 4])\nvar strokeScale = d3.scale.linear().domain([0.25, 1, 4]).range([5, 12, 19])\nvar fontScale = d3.scale.linear().domain([0.25, 1, 4]).range([10, 14, 18])\n\n/**\n * Scales for utility functions to use\n */\n\nvar notFocusedColor = '#e0e0e0'\n\n/**\n * Expose `utils` for the style functions to use\n */\n\nexports.utils = {\n pixels: function (zoom, min, normal, max) {\n return zoomScale.range([min, normal, max])(zoom)\n },\n strokeWidth: function (display) {\n return strokeScale(display.zoom.scale())\n },\n fontSize: function (display, data) {\n return Math.floor(fontScale(display.zoom.scale()))\n },\n defineSegmentCircleMarker: function (display, segment, radius, fillColor) {\n var markerId = 'circleMarker-' + segment.getId()\n display.svg.append('defs').append('svg:marker')\n .attr('id', markerId)\n .attr('refX', radius)\n .attr('refY', radius)\n .attr('markerWidth', radius * 2)\n .attr('markerHeight', radius * 2)\n .attr('markerUnits', 'userSpaceOnUse')\n .append('svg:circle')\n .attr('cx', radius)\n .attr('cy', radius)\n .attr('r', radius)\n .attr('fill', segment.focused ? fillColor : notFocusedColor)\n\n return 'url(#' + markerId + ')'\n }\n}\n\n/**\n * Default Wireframe Edge/Vertex Rules\n */\n\nexports.wireframe_vertices = {\n cx: 0,\n cy: 0,\n r: 3,\n fill: '#000'\n}\n\nexports.wireframe_edges = {\n stroke: '#444',\n 'stroke-width': 2,\n 'stroke-dasharray': '3px 2px',\n fill: 'none'\n}\n\n/**\n * Default Merged Stops Rules\n */\n\nvar stopsMerged = exports.stops_merged = {\n fill: function (display, data, index, utils) {\n return '#fff'\n },\n r: function (display, data, index, utils) {\n return utils.pixels(display.zoom.scale(), 8, 12, 16)\n },\n stroke: function (display, data, index, utils) {\n var point = data.owner\n if (!point.isFocused()) return notFocusedColor\n return '#000'\n },\n 'stroke-width': function (display, data, index, utils) {\n return 2\n },\n\n /**\n * Transitive-specific attribute specifying the shape of the main stop marker.\n * Can be 'roundedrect', 'rectangle' or 'circle'\n */\n\n 'marker-type': [\n 'circle',\n function (display, data, index, utils) {\n var point = data.owner\n if ((point.containsBoardPoint() || point.containsAlightPoint()) && !point.containsTransferPoint()) return 'circle'\n }\n ],\n\n /**\n * Transitive-specific attribute specifying any additional padding, in pixels,\n * to apply to main stop marker. A value of zero (default) results in a that\n * marker is flush to the edges of the pattern segment(s) the point is set against.\n * A value greater than zero creates a marker that is larger than the width of\n * the segments(s).\n */\n\n 'marker-padding': 3,\n\n visibility: function (display, data) {\n if (!data.owner.containsSegmentEndPoint()) return 'hidden'\n }\n}\n\n/**\n * Stops Along a Pattern\n */\n\nvar stopsPattern = exports.stops_pattern = {\n cx: 0,\n cy: 0,\n r: [\n 4,\n function (display, data, index, utils) {\n return utils.pixels(display.zoom.scale(), 1, 2, 4)\n },\n function (display, data, index, utils) {\n var point = data.owner\n var busOnly = true\n point.getPatterns().forEach(function (pattern) {\n if (pattern.route && pattern.route.route_type !== 3) busOnly = false\n })\n if (busOnly && !point.containsSegmentEndPoint()) {\n return 0.5 * utils.pixels(display.zoom.scale(), 2, 4, 6.5)\n }\n }\n ],\n stroke: 'none',\n visibility: function (display, data) {\n if (display.zoom.scale() < 1.5) return 'hidden'\n if (data.owner.containsSegmentEndPoint()) return 'hidden'\n }\n}\n\n/**\n * Default place rules\n */\n\nexports.places = {\n cx: 0,\n cy: 0,\n r: 14,\n stroke: '0px',\n fill: '#fff'\n}\n\n/**\n * Default MultiPoint rules -- based on Stop rules\n */\n\nvar multipointsMerged = exports.multipoints_merged = Object.assign({}, stopsMerged)\n\nmultipointsMerged.visibility = true\n\n/**\n * Default Multipoint Stops along a pattern\n */\n\nexports.multipoints_pattern = Object.assign({}, stopsPattern)\n\n/**\n * Default label rules\n */\n\nexports.labels = {\n 'font-size': function (display, data, index, utils) {\n return utils.fontSize(display, data) + 'px'\n },\n 'font-weight': function (display, data, index, utils) {\n var point = data.owner.parent\n if (point.containsBoardPoint() || point.containsAlightPoint()) return 'bold'\n },\n\n /**\n * 'orientations' is a transitive-specific attribute used to specify allowable\n * label placement orientations expressed as one of eight compass directions\n * relative to the point being labeled:\n *\n * 'N'\n * 'NW' | 'NE'\n * \\ | /\n * 'W' -- O -- 'E'\n * / | \\\n * 'SW' | 'SE'\n * 'S\n *\n * Labels oriented 'E' or 'W' are rendered horizontally, 'N' and 'S' vertically,\n * and all others at a 45-degree angle.\n *\n * Returns an array of allowed orientation codes in the order that they will be\n * tried by the labeler.\n */\n\n orientations: [\n ['E', 'W']\n ]\n}\n\n/**\n * All path segments\n * TODO: update old route-pattern-specific code below\n */\n\nexports.segments = {\n stroke: [\n '#008',\n function (display, data) {\n var segment = data\n if (!segment.focused) return notFocusedColor\n if (segment.type === 'TRANSIT') {\n if (segment.patterns) {\n if (segment.patterns[0].route.route_short_name.toLowerCase().substring(\n 0,\n 2) === 'dc') return '#f00'\n return segment.patterns[0].route.getColor()\n }\n } else if (segment.type === 'CAR') {\n return '#888'\n }\n }\n ],\n 'stroke-dasharray': [\n false,\n function (display, data) {\n var segment = data\n if (segment.frequency && segment.frequency.average < 12) {\n if (segment.frequency.average > 6) return '12px, 12px'\n return '12px, 2px'\n }\n }\n ],\n 'stroke-width': [\n '12px',\n function (display, data, index, utils) {\n var segment = data\n\n if (segment.mode === 3) {\n return utils.pixels(display.zoom.scale(), 2, 4, 8) + 'px'\n }\n return utils.pixels(display.zoom.scale(), 4, 8, 12) + 'px'\n }\n ],\n envelope: [\n\n function (display, data, index, utils) {\n var segment = data\n if (segment.type !== 'TRANSIT') {\n return '8px'\n }\n if (segment.mode === 3) {\n return utils.pixels(display.zoom.scale(), 4, 6, 10) + 'px'\n }\n return utils.pixels(display.zoom.scale(), 6, 10, 14) + 'px'\n }\n ]\n}\n\n/**\n * Segments Front\n */\n\nexports.segments_front = {\n stroke: '#008',\n 'stroke-width': function (display, data, index, utils) {\n return utils.pixels(display.zoom.scale(), 3, 6, 10) / 2 + 'px'\n },\n fill: 'none',\n display: [\n 'none',\n function (display, data, index, utils) {\n if (data.pattern && data.pattern.route && data.pattern.route.route_type ===\n 3 &&\n data.pattern.route.route_short_name.toLowerCase().substring(0, 2) ===\n 'dc') {\n return 'inline'\n }\n }\n ]\n}\n\n/**\n * Segments Halo\n */\n\nexports.segments_halo = {\n stroke: '#fff',\n 'stroke-width': function (display, data, index, utils) {\n return data.computeLineWidth(display) + 8\n },\n 'stroke-linecap': 'round',\n fill: 'none'\n}\n\n/**\n * Label Containers\n */\n\nexports.segment_label_containers = {\n fill: function (display, data) {\n if (!data.isFocused()) return notFocusedColor\n },\n 'stroke-width': function (display, data) {\n if (data.parent.pattern && data.parent.pattern.route.route_short_name.toLowerCase()\n .substring(0, 2) === 'dc') return 1\n return 0\n },\n rx: 3,\n ry: 3\n}\n", + "var d3 = require('d3')\nvar Emitter = require('component-emitter')\n\nvar Network = require('./core/network')\n\nvar Display = require('./display')\n\nvar DefaultRenderer = require('./renderer/default-renderer')\nvar WireframeRenderer = require('./renderer/wireframe-renderer')\n\nvar Styler = require('./styler')\nvar Labeler = require('./labeler')\n\nvar SphericalMercator = require('./util/spherical-mercator')\nvar sm = new SphericalMercator()\n\n/*\n * Expose `Transitive`\n */\n\nmodule.exports = Transitive\n\n/**\n * Create a new instance of `Transitive`\n *\n * @param {Object} options object\n * - data {Object} data to render\n * - styles {Object} styles to apply\n * - el {Element} the DOM element to render the main display to\n * - legendEl {Element} the DOM element to render the legend to\n * - drawGrid {Boolean} whether to draw a background grid (defaults to false)\n * - gridCellSize {Number} resolution of the grid in SphericalMercator meters\n * - draggableTypes {Array} a list of network element types to enable dragging for\n * - initialBounds {Array} initial lon/lat bounds for the display expressed as [[west, south], [east, north]]\n * - displayMargins {Object} padding to apply to the initial rendered network within the display. Expressed in pixels for top/bottom/left/right\n * - mapboxId {String} an Mapbox tileset id for rendering background tiles (Deprecated -- use Leaflet with Leaflet.TransitiveLayer)\n * - zoomEnabled {Boolean} whether to enable the display's built-in zoom/pan functionality (defaults to true)\n * - autoResize {Boolean} whether the display should listen for window resize events and update automatically (defaults to true)\n * - groupEdges {Boolean} whether to consider edges with the same origin/destination equivalent for rendering, even if intermediate stop sequence is different (defaults to true)\n */\n\nfunction Transitive (options) {\n console.log('**** trn');\n if (!(this instanceof Transitive)) return new Transitive(options)\n\n this.options = options\n if (this.options.zoomEnabled === undefined) this.options.zoomEnabled = true\n if (this.options.autoResize === undefined) this.options.autoResize = true\n if (this.options.groupEdges === undefined) this.options.groupEdges = true\n\n if (options.el) this.setElement(options.el)\n\n this.data = options.data\n\n this.setRenderer(this.options.initialRenderer || 'default')\n\n this.labeler = new Labeler(this)\n this.styler = new Styler(options.styles)\n}\n\n/**\n * Mixin `Emitter`\n */\n\nEmitter(Transitive.prototype)\n\n/**\n * Clear the Network data and redraw the (empty) map\n */\n\nTransitive.prototype.clearData = function () {\n this.network = this.data = null\n this.labeler.clear()\n this.emit('clear data', this)\n}\n\n/**\n * Update the Network data and redraw the map\n */\n\nTransitive.prototype.updateData = function (data) {\n this.network = null\n this.data = data\n if (this.display) this.display.scaleSet = false\n this.labeler.clear()\n this.emit('update data', this)\n}\n\n/**\n * Return the collection of default segment styles for a mode.\n *\n * @param {String} an OTP mode string\n */\n\nTransitive.prototype.getModeStyles = function (mode) {\n return this.styler.getModeStyles(mode, this.display || new Display(this))\n}\n\n/** Display/Render Methods **/\n\n/**\n * Set the DOM element that serves as the main map canvas\n */\n\nTransitive.prototype.setElement = function (el, legendEl) {\n if (this.el) d3.select(this.el).selectAll('*').remove()\n\n this.el = el\n this.display = new Display(this)\n\n // Emit click events\n var self = this\n this.display.svg.on('click', function () {\n var x = d3.event.x\n var y = d3.event.y\n var geographic = sm.inverse([x, y])\n self.emit('click', {\n x: x,\n y: y,\n lng: geographic[0],\n lat: geographic[1]\n })\n })\n\n this.emit('set element', this, this.el)\n return this\n}\n\n/**\n * Set the DOM element that serves as the main map canvas\n */\n\nTransitive.prototype.setRenderer = function (type) {\n switch (type) {\n case 'wireframe':\n this.renderer = new WireframeRenderer(this)\n break\n case 'default':\n this.renderer = new DefaultRenderer(this)\n break\n }\n}\n\n/**\n * Render\n */\n\nTransitive.prototype.render = function () {\n if (!this.network) {\n this.network = new Network(this, this.data)\n }\n\n if (!this.display.scaleSet) {\n this.display.setScale(this.network.graph.bounds(), this.options)\n }\n\n this.renderer.render()\n\n this.emit('render', this)\n}\n\n/**\n * Render to\n *\n * @param {Element} el\n */\n\nTransitive.prototype.renderTo = function (el) {\n this.setElement(el)\n this.render()\n\n this.emit('render to', this)\n return this\n}\n\n/**\n * Refresh\n */\n\nTransitive.prototype.refresh = function (panning) {\n if (!this.network) {\n this.render()\n }\n\n this.renderer.refresh()\n}\n\n/**\n * focusJourney\n */\n\nTransitive.prototype.focusJourney = function (journeyId) {\n var path = journeyId ? this.network.journeys[journeyId].path : null\n this.renderer.focusPath(path)\n}\n\n/**\n * Sets the Display bounds\n * @param {Array} lon/lat bounds expressed as [[west, south], [east, north]]\n */\n\nTransitive.prototype.setDisplayBounds = function (llBounds) {\n this.display.updateDomains([sm.forward(llBounds[0]), sm.forward(llBounds[1])])\n this.display.zoomChanged()\n}\n\n/**\n * Gets the Network bounds\n * @returns {Array} lon/lat bounds expressed as [[west, south], [east, north]]\n */\n\nTransitive.prototype.getNetworkBounds = function () {\n if (!this.network || !this.network.graph) return null\n var graphBounds = this.network.graph.bounds()\n var ll1 = sm.inverse(graphBounds[0])\n var ll2 = sm.inverse(graphBounds[1])\n return [\n [Math.min(ll1[0], ll2[0]), Math.min(ll1[1], ll2[1])],\n [Math.max(ll1[0], ll2[0]), Math.max(ll1[1], ll2[1])]\n ]\n}\n\n/**\n * resize\n */\n\nTransitive.prototype.resize = function (width, height) {\n if (!this.display) return\n d3.select(this.display.el)\n .style('width', width + 'px')\n .style('height', height + 'px')\n this.display.resized()\n}\n", + "/**\n * General Transitive utilities library\n */\n\nvar d3 = require('d3')\n\nvar tolerance = 0.000001\n\nmodule.exports.fuzzyEquals = function (a, b, tol) {\n tol = tol || tolerance\n return Math.abs(a - b) < tol\n}\n\nmodule.exports.distance = function (x1, y1, x2, y2) {\n return Math.sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1))\n}\n\nmodule.exports.getRadiusFromAngleChord = function (angleR, chordLen) {\n return (chordLen / 2) / Math.sin(angleR / 2)\n}\n\n/*\n * CCW utility function. Accepts 3 coord pairs; result is positive if points\n * have counterclockwise orientation, negative if clockwise, 0 if collinear.\n */\n\nmodule.exports.ccw = function (ax, ay, bx, by, cx, cy) {\n var raw = module.exports.ccwRaw(ax, ay, bx, by, cx, cy)\n return (raw === 0) ? 0 : raw / Math.abs(raw)\n}\n\nmodule.exports.ccwRaw = function (ax, ay, bx, by, cx, cy) {\n return (bx - ax) * (cy - ay) - (cx - ax) * (by - ay)\n}\n\n/*\n * Compute angle formed by three points in cartesian plane using law of cosines\n */\n\nmodule.exports.angleFromThreePoints = function (ax, ay, bx, by, cx, cy) {\n var c = module.exports.distance(ax, ay, bx, by)\n var a = module.exports.distance(bx, by, cx, cy)\n var b = module.exports.distance(ax, ay, cx, cy)\n return Math.acos((a * a + c * c - b * b) / (2 * a * c))\n}\n\nmodule.exports.pointAlongArc = function (x1, y1, x2, y2, r, theta, ccw, t) {\n ccw = Math.abs(ccw) / ccw // convert to 1 or -1\n\n var rot = Math.PI / 2 - Math.abs(theta) / 2\n var vectToCenter = module.exports.normalizeVector(module.exports.rotateVector({\n x: x2 - x1,\n y: y2 - y1\n }, ccw * rot))\n\n // calculate the center of the arc circle\n var cx = x1 + r * vectToCenter.x\n var cy = y1 + r * vectToCenter.y\n\n var vectFromCenter = module.exports.negateVector(vectToCenter)\n rot = Math.abs(theta) * t * ccw\n vectFromCenter = module.exports.normalizeVector(module.exports.rotateVector(\n vectFromCenter, rot))\n\n return {\n x: cx + r * vectFromCenter.x,\n y: cy + r * vectFromCenter.y\n }\n}\n\nmodule.exports.getVectorAngle = function (x, y) {\n var t = Math.atan(y / x)\n\n if (x < 0 && t <= 0) t += Math.PI\n else if (x < 0 && t >= 0) t -= Math.PI\n\n return t\n}\n\nmodule.exports.rayIntersection = function (ax, ay, avx, avy, bx, by, bvx, bvy) {\n var u = ((by - ay) * bvx - (bx - ax) * bvy) / (bvx * avy - bvy * avx)\n var v = ((by - ay) * avx - (bx - ax) * avy) / (bvx * avy - bvy * avx)\n\n return {\n u: u,\n v: v,\n intersect: (u > -tolerance && v > -tolerance)\n }\n}\n\nmodule.exports.lineIntersection = function (x1, y1, x2, y2, x3, y3, x4, y4) {\n var d = (x1 - x2) * (y3 - y4) - (y1 - y2) * (x3 - x4)\n\n if (d === 0) { // lines are parallel\n return {\n intersect: false\n }\n }\n\n return {\n x: ((x1 * y2 - y1 * x2) * (x3 - x4) - (x1 - x2) * (x3 * y4 - y3 * x4)) / d,\n y: ((x1 * y2 - y1 * x2) * (y3 - y4) - (y1 - y2) * (x3 * y4 - y3 * x4)) / d,\n intersect: true\n }\n}\n\n/**\n * Parse a pixel-based style descriptor, returning an number.\n *\n * @param {String/Number}\n */\n\nmodule.exports.parsePixelStyle = function (descriptor) {\n if (typeof descriptor === 'number') return descriptor\n return parseFloat(descriptor.substring(0, descriptor.length - 2), 10)\n}\n\nmodule.exports.isOutwardVector = function (vector) {\n if (!module.exports.fuzzyEquals(vector.x, 0)) return (vector.x > 0)\n return (vector.y > 0)\n}\n\nmodule.exports.getTextBBox = function (text, attrs) {\n var container = d3.select('body').append('svg')\n container.append('text')\n .attr({\n x: -1000,\n y: -1000\n })\n .attr(attrs)\n .text(text)\n var bbox = container.node().getBBox()\n container.remove()\n\n return {\n height: bbox.height,\n width: bbox.width\n }\n}\n\n/**\n * Convert lat/lon coords to spherical mercator meter x/y coords\n */\n\nmodule.exports.latLonToSphericalMercator = function (lat, lon) {\n var r = 6378137\n var x = r * lon * Math.PI / 180\n var y = r * Math.log(Math.tan(Math.PI / 4 + lat * Math.PI / 360))\n return [x, y]\n}\n\n/**\n * vector utilities\n */\n\nmodule.exports.normalizeVector = function (v) {\n var d = Math.sqrt(v.x * v.x + v.y * v.y)\n return {\n x: v.x / d,\n y: v.y / d\n }\n}\n\nmodule.exports.rotateVector = function (v, theta) {\n return {\n x: v.x * Math.cos(theta) - v.y * Math.sin(theta),\n y: v.x * Math.sin(theta) + v.y * Math.cos(theta)\n }\n}\n\nmodule.exports.negateVector = function (v) {\n return {\n x: -v.x,\n y: -v.y\n }\n}\n\nmodule.exports.addVectors = function (v1, v2) {\n return {\n x: v1.x + v2.x,\n y: v1.y + v2.y\n }\n}\n\n/**\n * GTFS utilities\n */\n\nmodule.exports.otpModeToGtfsType = function (otpMode) {\n switch (otpMode) {\n case 'TRAM':\n return 0\n case 'SUBWAY':\n return 1\n case 'RAIL':\n return 2\n case 'BUS':\n return 3\n case 'FERRY':\n return 4\n case 'CABLE_CAR':\n return 5\n case 'GONDOLA':\n return 6\n case 'FUNICULAR':\n return 7\n }\n}\n", + "/**\n * Line interpolation utility function\n *\n * @param {Array} points\n */\n\nvar Util = require('./index')\n\nmodule.exports = function (points) {\n var newPoints, i, r\n\n // determine if we need to resample the path (i.e. place new points at a regular\n // interval for marker-based styling) based on styler settings\n var resampleSpacing = this.display.styler.compute(this.display.styler.segments['marker-spacing'], this.display, this.segment)\n\n // handle the case of a simple straight line\n if (points.length === 2) {\n if (resampleSpacing) {\n newPoints = [points[0]]\n newPoints = newPoints.concat(resampleLine(points[0], points[1],\n resampleSpacing))\n return newPoints.join(' ')\n }\n return points.join(' ')\n }\n\n // otherwise, assume a curved segment\n\n if (resampleSpacing) {\n newPoints = [points[0]]\n for (i = 1; i < points.length; i++) {\n if (this.segment.renderData[i].arc) {\n // debug(this.renderData[i]);\n // var r = this.renderData[i].radius;\n // var sweep = (this.renderData[i].arc > 0) ? 0 : 1;\n // str += 'A ' + r + ',' + r + ' 0 0 ' + sweep + ' ' + points[i];\n r = this.segment.renderData[i].radius\n var theta = this.segment.renderData[i].arc * Math.PI / 180\n newPoints = newPoints.concat(resampleArc(points[i - 1], points[i], r,\n theta, -this.segment.renderData[i].arc, resampleSpacing))\n } else {\n newPoints = newPoints.concat(resampleLine(points[i - 1], points[i],\n resampleSpacing))\n }\n }\n return newPoints.join(' ')\n } else {\n var str = points[0]\n for (i = 1; i < points.length; i++) {\n if (this.segment.renderData[i].arc) {\n r = this.segment.renderData[i].radius\n var sweep = (this.segment.renderData[i].arc > 0) ? 0 : 1\n str += 'A ' + r + ',' + r + ' 0 0 ' + sweep + ' ' + points[i]\n } else {\n str += 'L' + points[i]\n }\n }\n return str\n }\n}\n\nfunction resampleLine (startPt, endPt, spacing) {\n var dx = endPt[0] - startPt[0]\n var dy = endPt[1] - startPt[1]\n var len = Math.sqrt(dx * dx + dy * dy)\n\n var sampledPts = [startPt]\n for (var l = spacing; l < len; l += spacing) {\n var t = l / len\n sampledPts.push([startPt[0] + t * dx, startPt[1] + t * dy])\n }\n\n sampledPts.push(endPt)\n\n return sampledPts\n}\n\nfunction resampleArc (startPt, endPt, r, theta, ccw, spacing) {\n var len = r * Math.abs(theta)\n\n var sampledPts = []\n for (var l = spacing; l < len; l += spacing) {\n var t = l / len\n var pt = Util.pointAlongArc(startPt[0], startPt[1], endPt[0], endPt[1], r,\n Math.abs(theta), ccw, t)\n sampledPts.push([pt.x, pt.y])\n }\n\n return sampledPts\n}\n", + "module.exports.decode = function (polyline) {\n var currentPosition = 0\n\n var currentLat = 0\n var currentLng = 0\n\n var dataLength = polyline.length\n\n var polylineLatLngs = []\n\n while (currentPosition < dataLength) {\n var shift = 0\n var result = 0\n\n var byte\n\n do {\n byte = polyline.charCodeAt(currentPosition++) - 63\n result |= (byte & 0x1f) << shift\n shift += 5\n } while (byte >= 0x20)\n\n var deltaLat = ((result & 1) ? ~(result >> 1) : (result >> 1))\n currentLat += deltaLat\n\n shift = 0\n result = 0\n\n do {\n byte = polyline.charCodeAt(currentPosition++) - 63\n result |= (byte & 0x1f) << shift\n shift += 5\n } while (byte >= 0x20)\n\n var deltLng = ((result & 1) ? ~(result >> 1) : (result >> 1))\n\n currentLng += deltLng\n\n polylineLatLngs.push([currentLat * 0.00001, currentLng * 0.00001])\n }\n return polylineLatLngs\n}\n", + "var SphericalMercator = (function () {\n // Closures including constants and other precalculated values.\n var cache = {}\n // var EPSLN = 1.0e-10\n var D2R = Math.PI / 180\n var R2D = 180 / Math.PI\n // 900913 properties.\n var A = 6378137\n var MAXEXTENT = 20037508.34\n\n // SphericalMercator constructor: precaches calculations\n // for fast tile lookups.\n function SphericalMercator (options) {\n options = options || {}\n this.size = options.size || 256\n if (!cache[this.size]) {\n var size = this.size\n var c = cache[this.size] = {}\n c.Bc = []\n c.Cc = []\n c.zc = []\n c.Ac = []\n for (var d = 0; d < 30; d++) {\n c.Bc.push(size / 360)\n c.Cc.push(size / (2 * Math.PI))\n c.zc.push(size / 2)\n c.Ac.push(size)\n size *= 2\n }\n }\n this.Bc = cache[this.size].Bc\n this.Cc = cache[this.size].Cc\n this.zc = cache[this.size].zc\n this.Ac = cache[this.size].Ac\n }\n\n // Convert lon lat to screen pixel value\n //\n // - `ll` {Array} `[lon, lat]` array of geographic coordinates.\n // - `zoom` {Number} zoom level.\n SphericalMercator.prototype.px = function (ll, zoom) {\n var d = this.zc[zoom]\n var f = Math.min(Math.max(Math.sin(D2R * ll[1]), -0.9999), 0.9999)\n var x = Math.round(d + ll[0] * this.Bc[zoom])\n var y = Math.round(d + 0.5 * Math.log((1 + f) / (1 - f)) * (-this.Cc[zoom]))\n if (x > this.Ac[zoom]) x = this.Ac[zoom]\n if (y > this.Ac[zoom]) y = this.Ac[zoom]\n // (x < 0) && (x = 0);\n // (y < 0) && (y = 0);\n return [x, y]\n }\n\n // Convert screen pixel value to lon lat\n //\n // - `px` {Array} `[x, y]` array of geographic coordinates.\n // - `zoom` {Number} zoom level.\n SphericalMercator.prototype.ll = function (px, zoom) {\n var g = (px[1] - this.zc[zoom]) / (-this.Cc[zoom])\n var lon = (px[0] - this.zc[zoom]) / this.Bc[zoom]\n var lat = R2D * (2 * Math.atan(Math.exp(g)) - 0.5 * Math.PI)\n return [lon, lat]\n }\n\n // Convert tile xyz value to bbox of the form `[w, s, e, n]`\n //\n // - `x` {Number} x (longitude) number.\n // - `y` {Number} y (latitude) number.\n // - `zoom` {Number} zoom.\n // - `tms_style` {Boolean} whether to compute using tms-style.\n // - `srs` {String} projection for resulting bbox (WGS84|900913).\n // - `return` {Array} bbox array of values in form `[w, s, e, n]`.\n SphericalMercator.prototype.bbox = function (x, y, zoom, tmsStyle, srs) {\n // Convert xyz into bbox with srs WGS84\n if (tmsStyle) {\n y = (Math.pow(2, zoom) - 1) - y\n }\n // Use +y to make sure it's a number to avoid inadvertent concatenation.\n var ll = [x * this.size, (+y + 1) * this.size] // lower left\n // Use +x to make sure it's a number to avoid inadvertent concatenation.\n var ur = [(+x + 1) * this.size, y * this.size] // upper right\n var bbox = this.ll(ll, zoom).concat(this.ll(ur, zoom))\n\n // If web mercator requested reproject to 900913.\n if (srs === '900913') {\n return this.convert(bbox, '900913')\n } else {\n return bbox\n }\n }\n\n // Convert bbox to xyx bounds\n //\n // - `bbox` {Number} bbox in the form `[w, s, e, n]`.\n // - `zoom` {Number} zoom.\n // - `tms_style` {Boolean} whether to compute using tms-style.\n // - `srs` {String} projection of input bbox (WGS84|900913).\n // - `@return` {Object} XYZ bounds containing minX, maxX, minY, maxY properties.\n SphericalMercator.prototype.xyz = function (bbox, zoom, tmsStyle, srs) {\n // If web mercator provided reproject to WGS84.\n if (srs === '900913') {\n bbox = this.convert(bbox, 'WGS84')\n }\n\n var ll = [bbox[0], bbox[1]] // lower left\n var ur = [bbox[2], bbox[3]] // upper right\n var pxll = this.px(ll, zoom)\n var pxur = this.px(ur, zoom)\n // Y = 0 for XYZ is the top hence minY uses px_ur[1].\n var bounds = {\n minX: Math.floor(pxll[0] / this.size),\n minY: Math.floor(pxur[1] / this.size),\n maxX: Math.floor((pxur[0] - 1) / this.size),\n maxY: Math.floor((pxll[1] - 1) / this.size)\n }\n if (tmsStyle) {\n var tms = {\n minY: (Math.pow(2, zoom) - 1) - bounds.maxY,\n maxY: (Math.pow(2, zoom) - 1) - bounds.minY\n }\n bounds.minY = tms.minY\n bounds.maxY = tms.maxY\n }\n return bounds\n }\n\n // Convert projection of given bbox.\n //\n // - `bbox` {Number} bbox in the form `[w, s, e, n]`.\n // - `to` {String} projection of output bbox (WGS84|900913). Input bbox\n // assumed to be the \"other\" projection.\n // - `@return` {Object} bbox with reprojected coordinates.\n SphericalMercator.prototype.convert = function (bbox, to) {\n if (to === '900913') {\n return this.forward(bbox.slice(0, 2)).concat(this.forward(bbox.slice(\n 2,\n 4)))\n } else {\n return this.inverse(bbox.slice(0, 2)).concat(this.inverse(bbox.slice(\n 2,\n 4)))\n }\n }\n\n // Convert lon/lat values to 900913 x/y.\n SphericalMercator.prototype.forward = function (ll) {\n var xy = [\n A * ll[0] * D2R,\n A * Math.log(Math.tan((Math.PI * 0.25) + (0.5 * ll[1] * D2R)))\n ]\n // if xy value is beyond maxextent (e.g. poles), return maxextent.\n if (xy[0] > MAXEXTENT) xy[0] = MAXEXTENT\n if (xy[0] < -MAXEXTENT) xy[0] = -MAXEXTENT\n if (xy[1] > MAXEXTENT) xy[1] = MAXEXTENT\n if (xy[1] < -MAXEXTENT) xy[1] = -MAXEXTENT\n return xy\n }\n\n // Convert 900913 x/y values to lon/lat.\n SphericalMercator.prototype.inverse = function (xy) {\n return [\n (xy[0] * R2D / A), ((Math.PI * 0.5) - 2.0 * Math.atan(Math.exp(-xy[1] / A))) * R2D\n ]\n }\n\n return SphericalMercator\n})()\n\nif (typeof module !== 'undefined' && typeof exports !== 'undefined') {\n module.exports = exports = SphericalMercator\n}\n", + "(function (global, factory) {\n if (typeof define === \"function\" && define.amd) define(factory);\n else if (typeof module === \"object\") module.exports = factory();\n else global.augment = factory();\n}(this, function () {\n \"use strict\";\n\n var Factory = function () {};\n var slice = Array.prototype.slice;\n\n var augment = function (base, body) {\n var uber = Factory.prototype = typeof base === \"function\" ? base.prototype : base;\n var prototype = new Factory, properties = body.apply(prototype, slice.call(arguments, 2).concat(uber));\n if (typeof properties === \"object\") for (var key in properties) prototype[key] = properties[key];\n if (!prototype.hasOwnProperty(\"constructor\")) return prototype;\n var constructor = prototype.constructor;\n constructor.prototype = prototype;\n return constructor;\n };\n\n augment.defclass = function (prototype) {\n var constructor = prototype.constructor;\n constructor.prototype = prototype;\n return constructor;\n };\n\n augment.extend = function (base, body) {\n return augment(base, function (uber) {\n this.uber = uber;\n return body;\n });\n };\n\n return augment;\n}));", + "module.exports = { \"default\": require(\"core-js/library/fn/object/assign\"), __esModule: true };", + "module.exports = { \"default\": require(\"core-js/library/fn/object/keys\"), __esModule: true };", + "require('../../modules/es6.object.assign');\nmodule.exports = require('../../modules/_core').Object.assign;", + "require('../../modules/es6.object.keys');\nmodule.exports = require('../../modules/_core').Object.keys;", + "module.exports = function(it){\n if(typeof it != 'function')throw TypeError(it + ' is not a function!');\n return it;\n};", + "var isObject = require('./_is-object');\nmodule.exports = function(it){\n if(!isObject(it))throw TypeError(it + ' is not an object!');\n return it;\n};", + "// false -> Array#indexOf\n// true -> Array#includes\nvar toIObject = require('./_to-iobject')\n , toLength = require('./_to-length')\n , toIndex = require('./_to-index');\nmodule.exports = function(IS_INCLUDES){\n return function($this, el, fromIndex){\n var O = toIObject($this)\n , length = toLength(O.length)\n , index = toIndex(fromIndex, length)\n , value;\n // Array#includes uses SameValueZero equality algorithm\n if(IS_INCLUDES && el != el)while(length > index){\n value = O[index++];\n if(value != value)return true;\n // Array#toIndex ignores holes, Array#includes - not\n } else for(;length > index; index++)if(IS_INCLUDES || index in O){\n if(O[index] === el)return IS_INCLUDES || index || 0;\n } return !IS_INCLUDES && -1;\n };\n};", + "var toString = {}.toString;\n\nmodule.exports = function(it){\n return toString.call(it).slice(8, -1);\n};", + "var core = module.exports = {version: '2.4.0'};\nif(typeof __e == 'number')__e = core; // eslint-disable-line no-undef", + "// optional / simple context binding\nvar aFunction = require('./_a-function');\nmodule.exports = function(fn, that, length){\n aFunction(fn);\n if(that === undefined)return fn;\n switch(length){\n case 1: return function(a){\n return fn.call(that, a);\n };\n case 2: return function(a, b){\n return fn.call(that, a, b);\n };\n case 3: return function(a, b, c){\n return fn.call(that, a, b, c);\n };\n }\n return function(/* ...args */){\n return fn.apply(that, arguments);\n };\n};", + "// 7.2.1 RequireObjectCoercible(argument)\nmodule.exports = function(it){\n if(it == undefined)throw TypeError(\"Can't call method on \" + it);\n return it;\n};", + "// Thank's IE8 for his funny defineProperty\nmodule.exports = !require('./_fails')(function(){\n return Object.defineProperty({}, 'a', {get: function(){ return 7; }}).a != 7;\n});", + "var isObject = require('./_is-object')\n , document = require('./_global').document\n // in old IE typeof document.createElement is 'object'\n , is = isObject(document) && isObject(document.createElement);\nmodule.exports = function(it){\n return is ? document.createElement(it) : {};\n};", + "// IE 8- don't enum bug keys\nmodule.exports = (\n 'constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf'\n).split(',');", + "var global = require('./_global')\n , core = require('./_core')\n , ctx = require('./_ctx')\n , hide = require('./_hide')\n , PROTOTYPE = 'prototype';\n\nvar $export = function(type, name, source){\n var IS_FORCED = type & $export.F\n , IS_GLOBAL = type & $export.G\n , IS_STATIC = type & $export.S\n , IS_PROTO = type & $export.P\n , IS_BIND = type & $export.B\n , IS_WRAP = type & $export.W\n , exports = IS_GLOBAL ? core : core[name] || (core[name] = {})\n , expProto = exports[PROTOTYPE]\n , target = IS_GLOBAL ? global : IS_STATIC ? global[name] : (global[name] || {})[PROTOTYPE]\n , key, own, out;\n if(IS_GLOBAL)source = name;\n for(key in source){\n // contains in native\n own = !IS_FORCED && target && target[key] !== undefined;\n if(own && key in exports)continue;\n // export native or passed\n out = own ? target[key] : source[key];\n // prevent global pollution for namespaces\n exports[key] = IS_GLOBAL && typeof target[key] != 'function' ? source[key]\n // bind timers to global for call from export context\n : IS_BIND && own ? ctx(out, global)\n // wrap global constructors for prevent change them in library\n : IS_WRAP && target[key] == out ? (function(C){\n var F = function(a, b, c){\n if(this instanceof C){\n switch(arguments.length){\n case 0: return new C;\n case 1: return new C(a);\n case 2: return new C(a, b);\n } return new C(a, b, c);\n } return C.apply(this, arguments);\n };\n F[PROTOTYPE] = C[PROTOTYPE];\n return F;\n // make static versions for prototype methods\n })(out) : IS_PROTO && typeof out == 'function' ? ctx(Function.call, out) : out;\n // export proto methods to core.%CONSTRUCTOR%.methods.%NAME%\n if(IS_PROTO){\n (exports.virtual || (exports.virtual = {}))[key] = out;\n // export proto methods to core.%CONSTRUCTOR%.prototype.%NAME%\n if(type & $export.R && expProto && !expProto[key])hide(expProto, key, out);\n }\n }\n};\n// type bitmap\n$export.F = 1; // forced\n$export.G = 2; // global\n$export.S = 4; // static\n$export.P = 8; // proto\n$export.B = 16; // bind\n$export.W = 32; // wrap\n$export.U = 64; // safe\n$export.R = 128; // real proto method for `library` \nmodule.exports = $export;", + "module.exports = function(exec){\n try {\n return !!exec();\n } catch(e){\n return true;\n }\n};", + "// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028\nvar global = module.exports = typeof window != 'undefined' && window.Math == Math\n ? window : typeof self != 'undefined' && self.Math == Math ? self : Function('return this')();\nif(typeof __g == 'number')__g = global; // eslint-disable-line no-undef", + "var hasOwnProperty = {}.hasOwnProperty;\nmodule.exports = function(it, key){\n return hasOwnProperty.call(it, key);\n};", + "var dP = require('./_object-dp')\n , createDesc = require('./_property-desc');\nmodule.exports = require('./_descriptors') ? function(object, key, value){\n return dP.f(object, key, createDesc(1, value));\n} : function(object, key, value){\n object[key] = value;\n return object;\n};", + "module.exports = !require('./_descriptors') && !require('./_fails')(function(){\n return Object.defineProperty(require('./_dom-create')('div'), 'a', {get: function(){ return 7; }}).a != 7;\n});", + "// fallback for non-array-like ES3 and non-enumerable old V8 strings\nvar cof = require('./_cof');\nmodule.exports = Object('z').propertyIsEnumerable(0) ? Object : function(it){\n return cof(it) == 'String' ? it.split('') : Object(it);\n};", + "module.exports = function(it){\n return typeof it === 'object' ? it !== null : typeof it === 'function';\n};", + "'use strict';\n// 19.1.2.1 Object.assign(target, source, ...)\nvar getKeys = require('./_object-keys')\n , gOPS = require('./_object-gops')\n , pIE = require('./_object-pie')\n , toObject = require('./_to-object')\n , IObject = require('./_iobject')\n , $assign = Object.assign;\n\n// should work with symbols and should have deterministic property order (V8 bug)\nmodule.exports = !$assign || require('./_fails')(function(){\n var A = {}\n , B = {}\n , S = Symbol()\n , K = 'abcdefghijklmnopqrst';\n A[S] = 7;\n K.split('').forEach(function(k){ B[k] = k; });\n return $assign({}, A)[S] != 7 || Object.keys($assign({}, B)).join('') != K;\n}) ? function assign(target, source){ // eslint-disable-line no-unused-vars\n var T = toObject(target)\n , aLen = arguments.length\n , index = 1\n , getSymbols = gOPS.f\n , isEnum = pIE.f;\n while(aLen > index){\n var S = IObject(arguments[index++])\n , keys = getSymbols ? getKeys(S).concat(getSymbols(S)) : getKeys(S)\n , length = keys.length\n , j = 0\n , key;\n while(length > j)if(isEnum.call(S, key = keys[j++]))T[key] = S[key];\n } return T;\n} : $assign;", + "var anObject = require('./_an-object')\n , IE8_DOM_DEFINE = require('./_ie8-dom-define')\n , toPrimitive = require('./_to-primitive')\n , dP = Object.defineProperty;\n\nexports.f = require('./_descriptors') ? Object.defineProperty : function defineProperty(O, P, Attributes){\n anObject(O);\n P = toPrimitive(P, true);\n anObject(Attributes);\n if(IE8_DOM_DEFINE)try {\n return dP(O, P, Attributes);\n } catch(e){ /* empty */ }\n if('get' in Attributes || 'set' in Attributes)throw TypeError('Accessors not supported!');\n if('value' in Attributes)O[P] = Attributes.value;\n return O;\n};", + "exports.f = Object.getOwnPropertySymbols;", + "var has = require('./_has')\n , toIObject = require('./_to-iobject')\n , arrayIndexOf = require('./_array-includes')(false)\n , IE_PROTO = require('./_shared-key')('IE_PROTO');\n\nmodule.exports = function(object, names){\n var O = toIObject(object)\n , i = 0\n , result = []\n , key;\n for(key in O)if(key != IE_PROTO)has(O, key) && result.push(key);\n // Don't enum bug & hidden keys\n while(names.length > i)if(has(O, key = names[i++])){\n ~arrayIndexOf(result, key) || result.push(key);\n }\n return result;\n};", + "// 19.1.2.14 / 15.2.3.14 Object.keys(O)\nvar $keys = require('./_object-keys-internal')\n , enumBugKeys = require('./_enum-bug-keys');\n\nmodule.exports = Object.keys || function keys(O){\n return $keys(O, enumBugKeys);\n};", + "exports.f = {}.propertyIsEnumerable;", + "// most Object methods by ES6 should accept primitives\nvar $export = require('./_export')\n , core = require('./_core')\n , fails = require('./_fails');\nmodule.exports = function(KEY, exec){\n var fn = (core.Object || {})[KEY] || Object[KEY]\n , exp = {};\n exp[KEY] = exec(fn);\n $export($export.S + $export.F * fails(function(){ fn(1); }), 'Object', exp);\n};", + "module.exports = function(bitmap, value){\n return {\n enumerable : !(bitmap & 1),\n configurable: !(bitmap & 2),\n writable : !(bitmap & 4),\n value : value\n };\n};", + "var shared = require('./_shared')('keys')\n , uid = require('./_uid');\nmodule.exports = function(key){\n return shared[key] || (shared[key] = uid(key));\n};", + "var global = require('./_global')\n , SHARED = '__core-js_shared__'\n , store = global[SHARED] || (global[SHARED] = {});\nmodule.exports = function(key){\n return store[key] || (store[key] = {});\n};", + "var toInteger = require('./_to-integer')\n , max = Math.max\n , min = Math.min;\nmodule.exports = function(index, length){\n index = toInteger(index);\n return index < 0 ? max(index + length, 0) : min(index, length);\n};", + "// 7.1.4 ToInteger\nvar ceil = Math.ceil\n , floor = Math.floor;\nmodule.exports = function(it){\n return isNaN(it = +it) ? 0 : (it > 0 ? floor : ceil)(it);\n};", + "// to indexed object, toObject with fallback for non-array-like ES3 strings\nvar IObject = require('./_iobject')\n , defined = require('./_defined');\nmodule.exports = function(it){\n return IObject(defined(it));\n};", + "// 7.1.15 ToLength\nvar toInteger = require('./_to-integer')\n , min = Math.min;\nmodule.exports = function(it){\n return it > 0 ? min(toInteger(it), 0x1fffffffffffff) : 0; // pow(2, 53) - 1 == 9007199254740991\n};", + "// 7.1.13 ToObject(argument)\nvar defined = require('./_defined');\nmodule.exports = function(it){\n return Object(defined(it));\n};", + "// 7.1.1 ToPrimitive(input [, PreferredType])\nvar isObject = require('./_is-object');\n// instead of the ES6 spec version, we didn't implement @@toPrimitive case\n// and the second argument - flag - preferred type is a string\nmodule.exports = function(it, S){\n if(!isObject(it))return it;\n var fn, val;\n if(S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it)))return val;\n if(typeof (fn = it.valueOf) == 'function' && !isObject(val = fn.call(it)))return val;\n if(!S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it)))return val;\n throw TypeError(\"Can't convert object to primitive value\");\n};", + "var id = 0\n , px = Math.random();\nmodule.exports = function(key){\n return 'Symbol('.concat(key === undefined ? '' : key, ')_', (++id + px).toString(36));\n};", + "// 19.1.3.1 Object.assign(target, source)\nvar $export = require('./_export');\n\n$export($export.S + $export.F, 'Object', {assign: require('./_object-assign')});", + "// 19.1.2.14 Object.keys(O)\nvar toObject = require('./_to-object')\n , $keys = require('./_object-keys');\n\nrequire('./_object-sap')('keys', function(){\n return function keys(it){\n return $keys(toObject(it));\n };\n});", + "\n/**\n * Module dependencies.\n */\n\ntry {\n var type = require('type');\n} catch (err) {\n var type = require('component-type');\n}\n\nvar toFunction = require('to-function');\n\n/**\n * HOP reference.\n */\n\nvar has = Object.prototype.hasOwnProperty;\n\n/**\n * Iterate the given `obj` and invoke `fn(val, i)`\n * in optional context `ctx`.\n *\n * @param {String|Array|Object} obj\n * @param {Function} fn\n * @param {Object} [ctx]\n * @api public\n */\n\nmodule.exports = function(obj, fn, ctx){\n fn = toFunction(fn);\n ctx = ctx || this;\n switch (type(obj)) {\n case 'array':\n return array(obj, fn, ctx);\n case 'object':\n if ('number' == typeof obj.length) return array(obj, fn, ctx);\n return object(obj, fn, ctx);\n case 'string':\n return string(obj, fn, ctx);\n }\n};\n\n/**\n * Iterate string chars.\n *\n * @param {String} obj\n * @param {Function} fn\n * @param {Object} ctx\n * @api private\n */\n\nfunction string(obj, fn, ctx) {\n for (var i = 0; i < obj.length; ++i) {\n fn.call(ctx, obj.charAt(i), i);\n }\n}\n\n/**\n * Iterate object keys.\n *\n * @param {Object} obj\n * @param {Function} fn\n * @param {Object} ctx\n * @api private\n */\n\nfunction object(obj, fn, ctx) {\n for (var key in obj) {\n if (has.call(obj, key)) {\n fn.call(ctx, key, obj[key]);\n }\n }\n}\n\n/**\n * Iterate array-ish.\n *\n * @param {Array|Object} obj\n * @param {Function} fn\n * @param {Object} ctx\n * @api private\n */\n\nfunction array(obj, fn, ctx) {\n for (var i = 0; i < obj.length; ++i) {\n fn.call(ctx, obj[i], i);\n }\n}\n", + "\r\n/**\r\n * Expose `Emitter`.\r\n */\r\n\r\nif (typeof module !== 'undefined') {\r\n module.exports = Emitter;\r\n}\r\n\r\n/**\r\n * Initialize a new `Emitter`.\r\n *\r\n * @api public\r\n */\r\n\r\nfunction Emitter(obj) {\r\n if (obj) return mixin(obj);\r\n};\r\n\r\n/**\r\n * Mixin the emitter properties.\r\n *\r\n * @param {Object} obj\r\n * @return {Object}\r\n * @api private\r\n */\r\n\r\nfunction mixin(obj) {\r\n for (var key in Emitter.prototype) {\r\n obj[key] = Emitter.prototype[key];\r\n }\r\n return obj;\r\n}\r\n\r\n/**\r\n * Listen on the given `event` with `fn`.\r\n *\r\n * @param {String} event\r\n * @param {Function} fn\r\n * @return {Emitter}\r\n * @api public\r\n */\r\n\r\nEmitter.prototype.on =\r\nEmitter.prototype.addEventListener = function(event, fn){\r\n this._callbacks = this._callbacks || {};\r\n (this._callbacks['$' + event] = this._callbacks['$' + event] || [])\r\n .push(fn);\r\n return this;\r\n};\r\n\r\n/**\r\n * Adds an `event` listener that will be invoked a single\r\n * time then automatically removed.\r\n *\r\n * @param {String} event\r\n * @param {Function} fn\r\n * @return {Emitter}\r\n * @api public\r\n */\r\n\r\nEmitter.prototype.once = function(event, fn){\r\n function on() {\r\n this.off(event, on);\r\n fn.apply(this, arguments);\r\n }\r\n\r\n on.fn = fn;\r\n this.on(event, on);\r\n return this;\r\n};\r\n\r\n/**\r\n * Remove the given callback for `event` or all\r\n * registered callbacks.\r\n *\r\n * @param {String} event\r\n * @param {Function} fn\r\n * @return {Emitter}\r\n * @api public\r\n */\r\n\r\nEmitter.prototype.off =\r\nEmitter.prototype.removeListener =\r\nEmitter.prototype.removeAllListeners =\r\nEmitter.prototype.removeEventListener = function(event, fn){\r\n this._callbacks = this._callbacks || {};\r\n\r\n // all\r\n if (0 == arguments.length) {\r\n this._callbacks = {};\r\n return this;\r\n }\r\n\r\n // specific event\r\n var callbacks = this._callbacks['$' + event];\r\n if (!callbacks) return this;\r\n\r\n // remove all handlers\r\n if (1 == arguments.length) {\r\n delete this._callbacks['$' + event];\r\n return this;\r\n }\r\n\r\n // remove specific handler\r\n var cb;\r\n for (var i = 0; i < callbacks.length; i++) {\r\n cb = callbacks[i];\r\n if (cb === fn || cb.fn === fn) {\r\n callbacks.splice(i, 1);\r\n break;\r\n }\r\n }\r\n return this;\r\n};\r\n\r\n/**\r\n * Emit `event` with the given args.\r\n *\r\n * @param {String} event\r\n * @param {Mixed} ...\r\n * @return {Emitter}\r\n */\r\n\r\nEmitter.prototype.emit = function(event){\r\n this._callbacks = this._callbacks || {};\r\n var args = [].slice.call(arguments, 1)\r\n , callbacks = this._callbacks['$' + event];\r\n\r\n if (callbacks) {\r\n callbacks = callbacks.slice(0);\r\n for (var i = 0, len = callbacks.length; i < len; ++i) {\r\n callbacks[i].apply(this, args);\r\n }\r\n }\r\n\r\n return this;\r\n};\r\n\r\n/**\r\n * Return array of callbacks for `event`.\r\n *\r\n * @param {String} event\r\n * @return {Array}\r\n * @api public\r\n */\r\n\r\nEmitter.prototype.listeners = function(event){\r\n this._callbacks = this._callbacks || {};\r\n return this._callbacks['$' + event] || [];\r\n};\r\n\r\n/**\r\n * Check if this emitter has `event` handlers.\r\n *\r\n * @param {String} event\r\n * @return {Boolean}\r\n * @api public\r\n */\r\n\r\nEmitter.prototype.hasListeners = function(event){\r\n return !! this.listeners(event).length;\r\n};\r\n", + "/**\n * Global Names\n */\n\nvar globals = /\\b(Array|Date|Object|Math|JSON)\\b/g;\n\n/**\n * Return immediate identifiers parsed from `str`.\n *\n * @param {String} str\n * @param {String|Function} map function or prefix\n * @return {Array}\n * @api public\n */\n\nmodule.exports = function(str, fn){\n var p = unique(props(str));\n if (fn && 'string' == typeof fn) fn = prefixed(fn);\n if (fn) return map(str, p, fn);\n return p;\n};\n\n/**\n * Return immediate identifiers in `str`.\n *\n * @param {String} str\n * @return {Array}\n * @api private\n */\n\nfunction props(str) {\n return str\n .replace(/\\.\\w+|\\w+ *\\(|\"[^\"]*\"|'[^']*'|\\/([^/]+)\\//g, '')\n .replace(globals, '')\n .match(/[a-zA-Z_]\\w*/g)\n || [];\n}\n\n/**\n * Return `str` with `props` mapped with `fn`.\n *\n * @param {String} str\n * @param {Array} props\n * @param {Function} fn\n * @return {String}\n * @api private\n */\n\nfunction map(str, props, fn) {\n var re = /\\.\\w+|\\w+ *\\(|\"[^\"]*\"|'[^']*'|\\/([^/]+)\\/|[a-zA-Z_]\\w*/g;\n return str.replace(re, function(_){\n if ('(' == _[_.length - 1]) return fn(_);\n if (!~props.indexOf(_)) return _;\n return fn(_);\n });\n}\n\n/**\n * Return unique array.\n *\n * @param {Array} arr\n * @return {Array}\n * @api private\n */\n\nfunction unique(arr) {\n var ret = [];\n\n for (var i = 0; i < arr.length; i++) {\n if (~ret.indexOf(arr[i])) continue;\n ret.push(arr[i]);\n }\n\n return ret;\n}\n\n/**\n * Map with prefix `str`.\n */\n\nfunction prefixed(str) {\n return function(_){\n return str + _;\n };\n}\n", + "\n/**\n * toString ref.\n */\n\nvar toString = Object.prototype.toString;\n\n/**\n * Return the type of `val`.\n *\n * @param {Mixed} val\n * @return {String}\n * @api public\n */\n\nmodule.exports = function(val){\n switch (toString.call(val)) {\n case '[object Function]': return 'function';\n case '[object Date]': return 'date';\n case '[object RegExp]': return 'regexp';\n case '[object Arguments]': return 'arguments';\n case '[object Array]': return 'array';\n case '[object String]': return 'string';\n }\n\n if (val === null) return 'null';\n if (val === undefined) return 'undefined';\n if (val && val.nodeType === 1) return 'element';\n if (val === Object(val)) return 'object';\n\n return typeof val;\n};\n", + "!function() {\n var d3 = {\n version: \"3.5.17\"\n };\n var d3_arraySlice = [].slice, d3_array = function(list) {\n return d3_arraySlice.call(list);\n };\n var d3_document = this.document;\n function d3_documentElement(node) {\n return node && (node.ownerDocument || node.document || node).documentElement;\n }\n function d3_window(node) {\n return node && (node.ownerDocument && node.ownerDocument.defaultView || node.document && node || node.defaultView);\n }\n if (d3_document) {\n try {\n d3_array(d3_document.documentElement.childNodes)[0].nodeType;\n } catch (e) {\n d3_array = function(list) {\n var i = list.length, array = new Array(i);\n while (i--) array[i] = list[i];\n return array;\n };\n }\n }\n if (!Date.now) Date.now = function() {\n return +new Date();\n };\n if (d3_document) {\n try {\n d3_document.createElement(\"DIV\").style.setProperty(\"opacity\", 0, \"\");\n } catch (error) {\n var d3_element_prototype = this.Element.prototype, d3_element_setAttribute = d3_element_prototype.setAttribute, d3_element_setAttributeNS = d3_element_prototype.setAttributeNS, d3_style_prototype = this.CSSStyleDeclaration.prototype, d3_style_setProperty = d3_style_prototype.setProperty;\n d3_element_prototype.setAttribute = function(name, value) {\n d3_element_setAttribute.call(this, name, value + \"\");\n };\n d3_element_prototype.setAttributeNS = function(space, local, value) {\n d3_element_setAttributeNS.call(this, space, local, value + \"\");\n };\n d3_style_prototype.setProperty = function(name, value, priority) {\n d3_style_setProperty.call(this, name, value + \"\", priority);\n };\n }\n }\n d3.ascending = d3_ascending;\n function d3_ascending(a, b) {\n return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;\n }\n d3.descending = function(a, b) {\n return b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN;\n };\n d3.min = function(array, f) {\n var i = -1, n = array.length, a, b;\n if (arguments.length === 1) {\n while (++i < n) if ((b = array[i]) != null && b >= b) {\n a = b;\n break;\n }\n while (++i < n) if ((b = array[i]) != null && a > b) a = b;\n } else {\n while (++i < n) if ((b = f.call(array, array[i], i)) != null && b >= b) {\n a = b;\n break;\n }\n while (++i < n) if ((b = f.call(array, array[i], i)) != null && a > b) a = b;\n }\n return a;\n };\n d3.max = function(array, f) {\n var i = -1, n = array.length, a, b;\n if (arguments.length === 1) {\n while (++i < n) if ((b = array[i]) != null && b >= b) {\n a = b;\n break;\n }\n while (++i < n) if ((b = array[i]) != null && b > a) a = b;\n } else {\n while (++i < n) if ((b = f.call(array, array[i], i)) != null && b >= b) {\n a = b;\n break;\n }\n while (++i < n) if ((b = f.call(array, array[i], i)) != null && b > a) a = b;\n }\n return a;\n };\n d3.extent = function(array, f) {\n var i = -1, n = array.length, a, b, c;\n if (arguments.length === 1) {\n while (++i < n) if ((b = array[i]) != null && b >= b) {\n a = c = b;\n break;\n }\n while (++i < n) if ((b = array[i]) != null) {\n if (a > b) a = b;\n if (c < b) c = b;\n }\n } else {\n while (++i < n) if ((b = f.call(array, array[i], i)) != null && b >= b) {\n a = c = b;\n break;\n }\n while (++i < n) if ((b = f.call(array, array[i], i)) != null) {\n if (a > b) a = b;\n if (c < b) c = b;\n }\n }\n return [ a, c ];\n };\n function d3_number(x) {\n return x === null ? NaN : +x;\n }\n function d3_numeric(x) {\n return !isNaN(x);\n }\n d3.sum = function(array, f) {\n var s = 0, n = array.length, a, i = -1;\n if (arguments.length === 1) {\n while (++i < n) if (d3_numeric(a = +array[i])) s += a;\n } else {\n while (++i < n) if (d3_numeric(a = +f.call(array, array[i], i))) s += a;\n }\n return s;\n };\n d3.mean = function(array, f) {\n var s = 0, n = array.length, a, i = -1, j = n;\n if (arguments.length === 1) {\n while (++i < n) if (d3_numeric(a = d3_number(array[i]))) s += a; else --j;\n } else {\n while (++i < n) if (d3_numeric(a = d3_number(f.call(array, array[i], i)))) s += a; else --j;\n }\n if (j) return s / j;\n };\n d3.quantile = function(values, p) {\n var H = (values.length - 1) * p + 1, h = Math.floor(H), v = +values[h - 1], e = H - h;\n return e ? v + e * (values[h] - v) : v;\n };\n d3.median = function(array, f) {\n var numbers = [], n = array.length, a, i = -1;\n if (arguments.length === 1) {\n while (++i < n) if (d3_numeric(a = d3_number(array[i]))) numbers.push(a);\n } else {\n while (++i < n) if (d3_numeric(a = d3_number(f.call(array, array[i], i)))) numbers.push(a);\n }\n if (numbers.length) return d3.quantile(numbers.sort(d3_ascending), .5);\n };\n d3.variance = function(array, f) {\n var n = array.length, m = 0, a, d, s = 0, i = -1, j = 0;\n if (arguments.length === 1) {\n while (++i < n) {\n if (d3_numeric(a = d3_number(array[i]))) {\n d = a - m;\n m += d / ++j;\n s += d * (a - m);\n }\n }\n } else {\n while (++i < n) {\n if (d3_numeric(a = d3_number(f.call(array, array[i], i)))) {\n d = a - m;\n m += d / ++j;\n s += d * (a - m);\n }\n }\n }\n if (j > 1) return s / (j - 1);\n };\n d3.deviation = function() {\n var v = d3.variance.apply(this, arguments);\n return v ? Math.sqrt(v) : v;\n };\n function d3_bisector(compare) {\n return {\n left: function(a, x, lo, hi) {\n if (arguments.length < 3) lo = 0;\n if (arguments.length < 4) hi = a.length;\n while (lo < hi) {\n var mid = lo + hi >>> 1;\n if (compare(a[mid], x) < 0) lo = mid + 1; else hi = mid;\n }\n return lo;\n },\n right: function(a, x, lo, hi) {\n if (arguments.length < 3) lo = 0;\n if (arguments.length < 4) hi = a.length;\n while (lo < hi) {\n var mid = lo + hi >>> 1;\n if (compare(a[mid], x) > 0) hi = mid; else lo = mid + 1;\n }\n return lo;\n }\n };\n }\n var d3_bisect = d3_bisector(d3_ascending);\n d3.bisectLeft = d3_bisect.left;\n d3.bisect = d3.bisectRight = d3_bisect.right;\n d3.bisector = function(f) {\n return d3_bisector(f.length === 1 ? function(d, x) {\n return d3_ascending(f(d), x);\n } : f);\n };\n d3.shuffle = function(array, i0, i1) {\n if ((m = arguments.length) < 3) {\n i1 = array.length;\n if (m < 2) i0 = 0;\n }\n var m = i1 - i0, t, i;\n while (m) {\n i = Math.random() * m-- | 0;\n t = array[m + i0], array[m + i0] = array[i + i0], array[i + i0] = t;\n }\n return array;\n };\n d3.permute = function(array, indexes) {\n var i = indexes.length, permutes = new Array(i);\n while (i--) permutes[i] = array[indexes[i]];\n return permutes;\n };\n d3.pairs = function(array) {\n var i = 0, n = array.length - 1, p0, p1 = array[0], pairs = new Array(n < 0 ? 0 : n);\n while (i < n) pairs[i] = [ p0 = p1, p1 = array[++i] ];\n return pairs;\n };\n d3.transpose = function(matrix) {\n if (!(n = matrix.length)) return [];\n for (var i = -1, m = d3.min(matrix, d3_transposeLength), transpose = new Array(m); ++i < m; ) {\n for (var j = -1, n, row = transpose[i] = new Array(n); ++j < n; ) {\n row[j] = matrix[j][i];\n }\n }\n return transpose;\n };\n function d3_transposeLength(d) {\n return d.length;\n }\n d3.zip = function() {\n return d3.transpose(arguments);\n };\n d3.keys = function(map) {\n var keys = [];\n for (var key in map) keys.push(key);\n return keys;\n };\n d3.values = function(map) {\n var values = [];\n for (var key in map) values.push(map[key]);\n return values;\n };\n d3.entries = function(map) {\n var entries = [];\n for (var key in map) entries.push({\n key: key,\n value: map[key]\n });\n return entries;\n };\n d3.merge = function(arrays) {\n var n = arrays.length, m, i = -1, j = 0, merged, array;\n while (++i < n) j += arrays[i].length;\n merged = new Array(j);\n while (--n >= 0) {\n array = arrays[n];\n m = array.length;\n while (--m >= 0) {\n merged[--j] = array[m];\n }\n }\n return merged;\n };\n var abs = Math.abs;\n d3.range = function(start, stop, step) {\n if (arguments.length < 3) {\n step = 1;\n if (arguments.length < 2) {\n stop = start;\n start = 0;\n }\n }\n if ((stop - start) / step === Infinity) throw new Error(\"infinite range\");\n var range = [], k = d3_range_integerScale(abs(step)), i = -1, j;\n start *= k, stop *= k, step *= k;\n if (step < 0) while ((j = start + step * ++i) > stop) range.push(j / k); else while ((j = start + step * ++i) < stop) range.push(j / k);\n return range;\n };\n function d3_range_integerScale(x) {\n var k = 1;\n while (x * k % 1) k *= 10;\n return k;\n }\n function d3_class(ctor, properties) {\n for (var key in properties) {\n Object.defineProperty(ctor.prototype, key, {\n value: properties[key],\n enumerable: false\n });\n }\n }\n d3.map = function(object, f) {\n var map = new d3_Map();\n if (object instanceof d3_Map) {\n object.forEach(function(key, value) {\n map.set(key, value);\n });\n } else if (Array.isArray(object)) {\n var i = -1, n = object.length, o;\n if (arguments.length === 1) while (++i < n) map.set(i, object[i]); else while (++i < n) map.set(f.call(object, o = object[i], i), o);\n } else {\n for (var key in object) map.set(key, object[key]);\n }\n return map;\n };\n function d3_Map() {\n this._ = Object.create(null);\n }\n var d3_map_proto = \"__proto__\", d3_map_zero = \"\\x00\";\n d3_class(d3_Map, {\n has: d3_map_has,\n get: function(key) {\n return this._[d3_map_escape(key)];\n },\n set: function(key, value) {\n return this._[d3_map_escape(key)] = value;\n },\n remove: d3_map_remove,\n keys: d3_map_keys,\n values: function() {\n var values = [];\n for (var key in this._) values.push(this._[key]);\n return values;\n },\n entries: function() {\n var entries = [];\n for (var key in this._) entries.push({\n key: d3_map_unescape(key),\n value: this._[key]\n });\n return entries;\n },\n size: d3_map_size,\n empty: d3_map_empty,\n forEach: function(f) {\n for (var key in this._) f.call(this, d3_map_unescape(key), this._[key]);\n }\n });\n function d3_map_escape(key) {\n return (key += \"\") === d3_map_proto || key[0] === d3_map_zero ? d3_map_zero + key : key;\n }\n function d3_map_unescape(key) {\n return (key += \"\")[0] === d3_map_zero ? key.slice(1) : key;\n }\n function d3_map_has(key) {\n return d3_map_escape(key) in this._;\n }\n function d3_map_remove(key) {\n return (key = d3_map_escape(key)) in this._ && delete this._[key];\n }\n function d3_map_keys() {\n var keys = [];\n for (var key in this._) keys.push(d3_map_unescape(key));\n return keys;\n }\n function d3_map_size() {\n var size = 0;\n for (var key in this._) ++size;\n return size;\n }\n function d3_map_empty() {\n for (var key in this._) return false;\n return true;\n }\n d3.nest = function() {\n var nest = {}, keys = [], sortKeys = [], sortValues, rollup;\n function map(mapType, array, depth) {\n if (depth >= keys.length) return rollup ? rollup.call(nest, array) : sortValues ? array.sort(sortValues) : array;\n var i = -1, n = array.length, key = keys[depth++], keyValue, object, setter, valuesByKey = new d3_Map(), values;\n while (++i < n) {\n if (values = valuesByKey.get(keyValue = key(object = array[i]))) {\n values.push(object);\n } else {\n valuesByKey.set(keyValue, [ object ]);\n }\n }\n if (mapType) {\n object = mapType();\n setter = function(keyValue, values) {\n object.set(keyValue, map(mapType, values, depth));\n };\n } else {\n object = {};\n setter = function(keyValue, values) {\n object[keyValue] = map(mapType, values, depth);\n };\n }\n valuesByKey.forEach(setter);\n return object;\n }\n function entries(map, depth) {\n if (depth >= keys.length) return map;\n var array = [], sortKey = sortKeys[depth++];\n map.forEach(function(key, keyMap) {\n array.push({\n key: key,\n values: entries(keyMap, depth)\n });\n });\n return sortKey ? array.sort(function(a, b) {\n return sortKey(a.key, b.key);\n }) : array;\n }\n nest.map = function(array, mapType) {\n return map(mapType, array, 0);\n };\n nest.entries = function(array) {\n return entries(map(d3.map, array, 0), 0);\n };\n nest.key = function(d) {\n keys.push(d);\n return nest;\n };\n nest.sortKeys = function(order) {\n sortKeys[keys.length - 1] = order;\n return nest;\n };\n nest.sortValues = function(order) {\n sortValues = order;\n return nest;\n };\n nest.rollup = function(f) {\n rollup = f;\n return nest;\n };\n return nest;\n };\n d3.set = function(array) {\n var set = new d3_Set();\n if (array) for (var i = 0, n = array.length; i < n; ++i) set.add(array[i]);\n return set;\n };\n function d3_Set() {\n this._ = Object.create(null);\n }\n d3_class(d3_Set, {\n has: d3_map_has,\n add: function(key) {\n this._[d3_map_escape(key += \"\")] = true;\n return key;\n },\n remove: d3_map_remove,\n values: d3_map_keys,\n size: d3_map_size,\n empty: d3_map_empty,\n forEach: function(f) {\n for (var key in this._) f.call(this, d3_map_unescape(key));\n }\n });\n d3.behavior = {};\n function d3_identity(d) {\n return d;\n }\n d3.rebind = function(target, source) {\n var i = 1, n = arguments.length, method;\n while (++i < n) target[method = arguments[i]] = d3_rebind(target, source, source[method]);\n return target;\n };\n function d3_rebind(target, source, method) {\n return function() {\n var value = method.apply(source, arguments);\n return value === source ? target : value;\n };\n }\n function d3_vendorSymbol(object, name) {\n if (name in object) return name;\n name = name.charAt(0).toUpperCase() + name.slice(1);\n for (var i = 0, n = d3_vendorPrefixes.length; i < n; ++i) {\n var prefixName = d3_vendorPrefixes[i] + name;\n if (prefixName in object) return prefixName;\n }\n }\n var d3_vendorPrefixes = [ \"webkit\", \"ms\", \"moz\", \"Moz\", \"o\", \"O\" ];\n function d3_noop() {}\n d3.dispatch = function() {\n var dispatch = new d3_dispatch(), i = -1, n = arguments.length;\n while (++i < n) dispatch[arguments[i]] = d3_dispatch_event(dispatch);\n return dispatch;\n };\n function d3_dispatch() {}\n d3_dispatch.prototype.on = function(type, listener) {\n var i = type.indexOf(\".\"), name = \"\";\n if (i >= 0) {\n name = type.slice(i + 1);\n type = type.slice(0, i);\n }\n if (type) return arguments.length < 2 ? this[type].on(name) : this[type].on(name, listener);\n if (arguments.length === 2) {\n if (listener == null) for (type in this) {\n if (this.hasOwnProperty(type)) this[type].on(name, null);\n }\n return this;\n }\n };\n function d3_dispatch_event(dispatch) {\n var listeners = [], listenerByName = new d3_Map();\n function event() {\n var z = listeners, i = -1, n = z.length, l;\n while (++i < n) if (l = z[i].on) l.apply(this, arguments);\n return dispatch;\n }\n event.on = function(name, listener) {\n var l = listenerByName.get(name), i;\n if (arguments.length < 2) return l && l.on;\n if (l) {\n l.on = null;\n listeners = listeners.slice(0, i = listeners.indexOf(l)).concat(listeners.slice(i + 1));\n listenerByName.remove(name);\n }\n if (listener) listeners.push(listenerByName.set(name, {\n on: listener\n }));\n return dispatch;\n };\n return event;\n }\n d3.event = null;\n function d3_eventPreventDefault() {\n d3.event.preventDefault();\n }\n function d3_eventSource() {\n var e = d3.event, s;\n while (s = e.sourceEvent) e = s;\n return e;\n }\n function d3_eventDispatch(target) {\n var dispatch = new d3_dispatch(), i = 0, n = arguments.length;\n while (++i < n) dispatch[arguments[i]] = d3_dispatch_event(dispatch);\n dispatch.of = function(thiz, argumentz) {\n return function(e1) {\n try {\n var e0 = e1.sourceEvent = d3.event;\n e1.target = target;\n d3.event = e1;\n dispatch[e1.type].apply(thiz, argumentz);\n } finally {\n d3.event = e0;\n }\n };\n };\n return dispatch;\n }\n d3.requote = function(s) {\n return s.replace(d3_requote_re, \"\\\\$&\");\n };\n var d3_requote_re = /[\\\\\\^\\$\\*\\+\\?\\|\\[\\]\\(\\)\\.\\{\\}]/g;\n var d3_subclass = {}.__proto__ ? function(object, prototype) {\n object.__proto__ = prototype;\n } : function(object, prototype) {\n for (var property in prototype) object[property] = prototype[property];\n };\n function d3_selection(groups) {\n d3_subclass(groups, d3_selectionPrototype);\n return groups;\n }\n var d3_select = function(s, n) {\n return n.querySelector(s);\n }, d3_selectAll = function(s, n) {\n return n.querySelectorAll(s);\n }, d3_selectMatches = function(n, s) {\n var d3_selectMatcher = n.matches || n[d3_vendorSymbol(n, \"matchesSelector\")];\n d3_selectMatches = function(n, s) {\n return d3_selectMatcher.call(n, s);\n };\n return d3_selectMatches(n, s);\n };\n if (typeof Sizzle === \"function\") {\n d3_select = function(s, n) {\n return Sizzle(s, n)[0] || null;\n };\n d3_selectAll = Sizzle;\n d3_selectMatches = Sizzle.matchesSelector;\n }\n d3.selection = function() {\n return d3.select(d3_document.documentElement);\n };\n var d3_selectionPrototype = d3.selection.prototype = [];\n d3_selectionPrototype.select = function(selector) {\n var subgroups = [], subgroup, subnode, group, node;\n selector = d3_selection_selector(selector);\n for (var j = -1, m = this.length; ++j < m; ) {\n subgroups.push(subgroup = []);\n subgroup.parentNode = (group = this[j]).parentNode;\n for (var i = -1, n = group.length; ++i < n; ) {\n if (node = group[i]) {\n subgroup.push(subnode = selector.call(node, node.__data__, i, j));\n if (subnode && \"__data__\" in node) subnode.__data__ = node.__data__;\n } else {\n subgroup.push(null);\n }\n }\n }\n return d3_selection(subgroups);\n };\n function d3_selection_selector(selector) {\n return typeof selector === \"function\" ? selector : function() {\n return d3_select(selector, this);\n };\n }\n d3_selectionPrototype.selectAll = function(selector) {\n var subgroups = [], subgroup, node;\n selector = d3_selection_selectorAll(selector);\n for (var j = -1, m = this.length; ++j < m; ) {\n for (var group = this[j], i = -1, n = group.length; ++i < n; ) {\n if (node = group[i]) {\n subgroups.push(subgroup = d3_array(selector.call(node, node.__data__, i, j)));\n subgroup.parentNode = node;\n }\n }\n }\n return d3_selection(subgroups);\n };\n function d3_selection_selectorAll(selector) {\n return typeof selector === \"function\" ? selector : function() {\n return d3_selectAll(selector, this);\n };\n }\n var d3_nsXhtml = \"http://www.w3.org/1999/xhtml\";\n var d3_nsPrefix = {\n svg: \"http://www.w3.org/2000/svg\",\n xhtml: d3_nsXhtml,\n xlink: \"http://www.w3.org/1999/xlink\",\n xml: \"http://www.w3.org/XML/1998/namespace\",\n xmlns: \"http://www.w3.org/2000/xmlns/\"\n };\n d3.ns = {\n prefix: d3_nsPrefix,\n qualify: function(name) {\n var i = name.indexOf(\":\"), prefix = name;\n if (i >= 0 && (prefix = name.slice(0, i)) !== \"xmlns\") name = name.slice(i + 1);\n return d3_nsPrefix.hasOwnProperty(prefix) ? {\n space: d3_nsPrefix[prefix],\n local: name\n } : name;\n }\n };\n d3_selectionPrototype.attr = function(name, value) {\n if (arguments.length < 2) {\n if (typeof name === \"string\") {\n var node = this.node();\n name = d3.ns.qualify(name);\n return name.local ? node.getAttributeNS(name.space, name.local) : node.getAttribute(name);\n }\n for (value in name) this.each(d3_selection_attr(value, name[value]));\n return this;\n }\n return this.each(d3_selection_attr(name, value));\n };\n function d3_selection_attr(name, value) {\n name = d3.ns.qualify(name);\n function attrNull() {\n this.removeAttribute(name);\n }\n function attrNullNS() {\n this.removeAttributeNS(name.space, name.local);\n }\n function attrConstant() {\n this.setAttribute(name, value);\n }\n function attrConstantNS() {\n this.setAttributeNS(name.space, name.local, value);\n }\n function attrFunction() {\n var x = value.apply(this, arguments);\n if (x == null) this.removeAttribute(name); else this.setAttribute(name, x);\n }\n function attrFunctionNS() {\n var x = value.apply(this, arguments);\n if (x == null) this.removeAttributeNS(name.space, name.local); else this.setAttributeNS(name.space, name.local, x);\n }\n return value == null ? name.local ? attrNullNS : attrNull : typeof value === \"function\" ? name.local ? attrFunctionNS : attrFunction : name.local ? attrConstantNS : attrConstant;\n }\n function d3_collapse(s) {\n return s.trim().replace(/\\s+/g, \" \");\n }\n d3_selectionPrototype.classed = function(name, value) {\n if (arguments.length < 2) {\n if (typeof name === \"string\") {\n var node = this.node(), n = (name = d3_selection_classes(name)).length, i = -1;\n if (value = node.classList) {\n while (++i < n) if (!value.contains(name[i])) return false;\n } else {\n value = node.getAttribute(\"class\");\n while (++i < n) if (!d3_selection_classedRe(name[i]).test(value)) return false;\n }\n return true;\n }\n for (value in name) this.each(d3_selection_classed(value, name[value]));\n return this;\n }\n return this.each(d3_selection_classed(name, value));\n };\n function d3_selection_classedRe(name) {\n return new RegExp(\"(?:^|\\\\s+)\" + d3.requote(name) + \"(?:\\\\s+|$)\", \"g\");\n }\n function d3_selection_classes(name) {\n return (name + \"\").trim().split(/^|\\s+/);\n }\n function d3_selection_classed(name, value) {\n name = d3_selection_classes(name).map(d3_selection_classedName);\n var n = name.length;\n function classedConstant() {\n var i = -1;\n while (++i < n) name[i](this, value);\n }\n function classedFunction() {\n var i = -1, x = value.apply(this, arguments);\n while (++i < n) name[i](this, x);\n }\n return typeof value === \"function\" ? classedFunction : classedConstant;\n }\n function d3_selection_classedName(name) {\n var re = d3_selection_classedRe(name);\n return function(node, value) {\n if (c = node.classList) return value ? c.add(name) : c.remove(name);\n var c = node.getAttribute(\"class\") || \"\";\n if (value) {\n re.lastIndex = 0;\n if (!re.test(c)) node.setAttribute(\"class\", d3_collapse(c + \" \" + name));\n } else {\n node.setAttribute(\"class\", d3_collapse(c.replace(re, \" \")));\n }\n };\n }\n d3_selectionPrototype.style = function(name, value, priority) {\n var n = arguments.length;\n if (n < 3) {\n if (typeof name !== \"string\") {\n if (n < 2) value = \"\";\n for (priority in name) this.each(d3_selection_style(priority, name[priority], value));\n return this;\n }\n if (n < 2) {\n var node = this.node();\n return d3_window(node).getComputedStyle(node, null).getPropertyValue(name);\n }\n priority = \"\";\n }\n return this.each(d3_selection_style(name, value, priority));\n };\n function d3_selection_style(name, value, priority) {\n function styleNull() {\n this.style.removeProperty(name);\n }\n function styleConstant() {\n this.style.setProperty(name, value, priority);\n }\n function styleFunction() {\n var x = value.apply(this, arguments);\n if (x == null) this.style.removeProperty(name); else this.style.setProperty(name, x, priority);\n }\n return value == null ? styleNull : typeof value === \"function\" ? styleFunction : styleConstant;\n }\n d3_selectionPrototype.property = function(name, value) {\n if (arguments.length < 2) {\n if (typeof name === \"string\") return this.node()[name];\n for (value in name) this.each(d3_selection_property(value, name[value]));\n return this;\n }\n return this.each(d3_selection_property(name, value));\n };\n function d3_selection_property(name, value) {\n function propertyNull() {\n delete this[name];\n }\n function propertyConstant() {\n this[name] = value;\n }\n function propertyFunction() {\n var x = value.apply(this, arguments);\n if (x == null) delete this[name]; else this[name] = x;\n }\n return value == null ? propertyNull : typeof value === \"function\" ? propertyFunction : propertyConstant;\n }\n d3_selectionPrototype.text = function(value) {\n return arguments.length ? this.each(typeof value === \"function\" ? function() {\n var v = value.apply(this, arguments);\n this.textContent = v == null ? \"\" : v;\n } : value == null ? function() {\n this.textContent = \"\";\n } : function() {\n this.textContent = value;\n }) : this.node().textContent;\n };\n d3_selectionPrototype.html = function(value) {\n return arguments.length ? this.each(typeof value === \"function\" ? function() {\n var v = value.apply(this, arguments);\n this.innerHTML = v == null ? \"\" : v;\n } : value == null ? function() {\n this.innerHTML = \"\";\n } : function() {\n this.innerHTML = value;\n }) : this.node().innerHTML;\n };\n d3_selectionPrototype.append = function(name) {\n name = d3_selection_creator(name);\n return this.select(function() {\n return this.appendChild(name.apply(this, arguments));\n });\n };\n function d3_selection_creator(name) {\n function create() {\n var document = this.ownerDocument, namespace = this.namespaceURI;\n return namespace === d3_nsXhtml && document.documentElement.namespaceURI === d3_nsXhtml ? document.createElement(name) : document.createElementNS(namespace, name);\n }\n function createNS() {\n return this.ownerDocument.createElementNS(name.space, name.local);\n }\n return typeof name === \"function\" ? name : (name = d3.ns.qualify(name)).local ? createNS : create;\n }\n d3_selectionPrototype.insert = function(name, before) {\n name = d3_selection_creator(name);\n before = d3_selection_selector(before);\n return this.select(function() {\n return this.insertBefore(name.apply(this, arguments), before.apply(this, arguments) || null);\n });\n };\n d3_selectionPrototype.remove = function() {\n return this.each(d3_selectionRemove);\n };\n function d3_selectionRemove() {\n var parent = this.parentNode;\n if (parent) parent.removeChild(this);\n }\n d3_selectionPrototype.data = function(value, key) {\n var i = -1, n = this.length, group, node;\n if (!arguments.length) {\n value = new Array(n = (group = this[0]).length);\n while (++i < n) {\n if (node = group[i]) {\n value[i] = node.__data__;\n }\n }\n return value;\n }\n function bind(group, groupData) {\n var i, n = group.length, m = groupData.length, n0 = Math.min(n, m), updateNodes = new Array(m), enterNodes = new Array(m), exitNodes = new Array(n), node, nodeData;\n if (key) {\n var nodeByKeyValue = new d3_Map(), keyValues = new Array(n), keyValue;\n for (i = -1; ++i < n; ) {\n if (node = group[i]) {\n if (nodeByKeyValue.has(keyValue = key.call(node, node.__data__, i))) {\n exitNodes[i] = node;\n } else {\n nodeByKeyValue.set(keyValue, node);\n }\n keyValues[i] = keyValue;\n }\n }\n for (i = -1; ++i < m; ) {\n if (!(node = nodeByKeyValue.get(keyValue = key.call(groupData, nodeData = groupData[i], i)))) {\n enterNodes[i] = d3_selection_dataNode(nodeData);\n } else if (node !== true) {\n updateNodes[i] = node;\n node.__data__ = nodeData;\n }\n nodeByKeyValue.set(keyValue, true);\n }\n for (i = -1; ++i < n; ) {\n if (i in keyValues && nodeByKeyValue.get(keyValues[i]) !== true) {\n exitNodes[i] = group[i];\n }\n }\n } else {\n for (i = -1; ++i < n0; ) {\n node = group[i];\n nodeData = groupData[i];\n if (node) {\n node.__data__ = nodeData;\n updateNodes[i] = node;\n } else {\n enterNodes[i] = d3_selection_dataNode(nodeData);\n }\n }\n for (;i < m; ++i) {\n enterNodes[i] = d3_selection_dataNode(groupData[i]);\n }\n for (;i < n; ++i) {\n exitNodes[i] = group[i];\n }\n }\n enterNodes.update = updateNodes;\n enterNodes.parentNode = updateNodes.parentNode = exitNodes.parentNode = group.parentNode;\n enter.push(enterNodes);\n update.push(updateNodes);\n exit.push(exitNodes);\n }\n var enter = d3_selection_enter([]), update = d3_selection([]), exit = d3_selection([]);\n if (typeof value === \"function\") {\n while (++i < n) {\n bind(group = this[i], value.call(group, group.parentNode.__data__, i));\n }\n } else {\n while (++i < n) {\n bind(group = this[i], value);\n }\n }\n update.enter = function() {\n return enter;\n };\n update.exit = function() {\n return exit;\n };\n return update;\n };\n function d3_selection_dataNode(data) {\n return {\n __data__: data\n };\n }\n d3_selectionPrototype.datum = function(value) {\n return arguments.length ? this.property(\"__data__\", value) : this.property(\"__data__\");\n };\n d3_selectionPrototype.filter = function(filter) {\n var subgroups = [], subgroup, group, node;\n if (typeof filter !== \"function\") filter = d3_selection_filter(filter);\n for (var j = 0, m = this.length; j < m; j++) {\n subgroups.push(subgroup = []);\n subgroup.parentNode = (group = this[j]).parentNode;\n for (var i = 0, n = group.length; i < n; i++) {\n if ((node = group[i]) && filter.call(node, node.__data__, i, j)) {\n subgroup.push(node);\n }\n }\n }\n return d3_selection(subgroups);\n };\n function d3_selection_filter(selector) {\n return function() {\n return d3_selectMatches(this, selector);\n };\n }\n d3_selectionPrototype.order = function() {\n for (var j = -1, m = this.length; ++j < m; ) {\n for (var group = this[j], i = group.length - 1, next = group[i], node; --i >= 0; ) {\n if (node = group[i]) {\n if (next && next !== node.nextSibling) next.parentNode.insertBefore(node, next);\n next = node;\n }\n }\n }\n return this;\n };\n d3_selectionPrototype.sort = function(comparator) {\n comparator = d3_selection_sortComparator.apply(this, arguments);\n for (var j = -1, m = this.length; ++j < m; ) this[j].sort(comparator);\n return this.order();\n };\n function d3_selection_sortComparator(comparator) {\n if (!arguments.length) comparator = d3_ascending;\n return function(a, b) {\n return a && b ? comparator(a.__data__, b.__data__) : !a - !b;\n };\n }\n d3_selectionPrototype.each = function(callback) {\n return d3_selection_each(this, function(node, i, j) {\n callback.call(node, node.__data__, i, j);\n });\n };\n function d3_selection_each(groups, callback) {\n for (var j = 0, m = groups.length; j < m; j++) {\n for (var group = groups[j], i = 0, n = group.length, node; i < n; i++) {\n if (node = group[i]) callback(node, i, j);\n }\n }\n return groups;\n }\n d3_selectionPrototype.call = function(callback) {\n var args = d3_array(arguments);\n callback.apply(args[0] = this, args);\n return this;\n };\n d3_selectionPrototype.empty = function() {\n return !this.node();\n };\n d3_selectionPrototype.node = function() {\n for (var j = 0, m = this.length; j < m; j++) {\n for (var group = this[j], i = 0, n = group.length; i < n; i++) {\n var node = group[i];\n if (node) return node;\n }\n }\n return null;\n };\n d3_selectionPrototype.size = function() {\n var n = 0;\n d3_selection_each(this, function() {\n ++n;\n });\n return n;\n };\n function d3_selection_enter(selection) {\n d3_subclass(selection, d3_selection_enterPrototype);\n return selection;\n }\n var d3_selection_enterPrototype = [];\n d3.selection.enter = d3_selection_enter;\n d3.selection.enter.prototype = d3_selection_enterPrototype;\n d3_selection_enterPrototype.append = d3_selectionPrototype.append;\n d3_selection_enterPrototype.empty = d3_selectionPrototype.empty;\n d3_selection_enterPrototype.node = d3_selectionPrototype.node;\n d3_selection_enterPrototype.call = d3_selectionPrototype.call;\n d3_selection_enterPrototype.size = d3_selectionPrototype.size;\n d3_selection_enterPrototype.select = function(selector) {\n var subgroups = [], subgroup, subnode, upgroup, group, node;\n for (var j = -1, m = this.length; ++j < m; ) {\n upgroup = (group = this[j]).update;\n subgroups.push(subgroup = []);\n subgroup.parentNode = group.parentNode;\n for (var i = -1, n = group.length; ++i < n; ) {\n if (node = group[i]) {\n subgroup.push(upgroup[i] = subnode = selector.call(group.parentNode, node.__data__, i, j));\n subnode.__data__ = node.__data__;\n } else {\n subgroup.push(null);\n }\n }\n }\n return d3_selection(subgroups);\n };\n d3_selection_enterPrototype.insert = function(name, before) {\n if (arguments.length < 2) before = d3_selection_enterInsertBefore(this);\n return d3_selectionPrototype.insert.call(this, name, before);\n };\n function d3_selection_enterInsertBefore(enter) {\n var i0, j0;\n return function(d, i, j) {\n var group = enter[j].update, n = group.length, node;\n if (j != j0) j0 = j, i0 = 0;\n if (i >= i0) i0 = i + 1;\n while (!(node = group[i0]) && ++i0 < n) ;\n return node;\n };\n }\n d3.select = function(node) {\n var group;\n if (typeof node === \"string\") {\n group = [ d3_select(node, d3_document) ];\n group.parentNode = d3_document.documentElement;\n } else {\n group = [ node ];\n group.parentNode = d3_documentElement(node);\n }\n return d3_selection([ group ]);\n };\n d3.selectAll = function(nodes) {\n var group;\n if (typeof nodes === \"string\") {\n group = d3_array(d3_selectAll(nodes, d3_document));\n group.parentNode = d3_document.documentElement;\n } else {\n group = d3_array(nodes);\n group.parentNode = null;\n }\n return d3_selection([ group ]);\n };\n d3_selectionPrototype.on = function(type, listener, capture) {\n var n = arguments.length;\n if (n < 3) {\n if (typeof type !== \"string\") {\n if (n < 2) listener = false;\n for (capture in type) this.each(d3_selection_on(capture, type[capture], listener));\n return this;\n }\n if (n < 2) return (n = this.node()[\"__on\" + type]) && n._;\n capture = false;\n }\n return this.each(d3_selection_on(type, listener, capture));\n };\n function d3_selection_on(type, listener, capture) {\n var name = \"__on\" + type, i = type.indexOf(\".\"), wrap = d3_selection_onListener;\n if (i > 0) type = type.slice(0, i);\n var filter = d3_selection_onFilters.get(type);\n if (filter) type = filter, wrap = d3_selection_onFilter;\n function onRemove() {\n var l = this[name];\n if (l) {\n this.removeEventListener(type, l, l.$);\n delete this[name];\n }\n }\n function onAdd() {\n var l = wrap(listener, d3_array(arguments));\n onRemove.call(this);\n this.addEventListener(type, this[name] = l, l.$ = capture);\n l._ = listener;\n }\n function removeAll() {\n var re = new RegExp(\"^__on([^.]+)\" + d3.requote(type) + \"$\"), match;\n for (var name in this) {\n if (match = name.match(re)) {\n var l = this[name];\n this.removeEventListener(match[1], l, l.$);\n delete this[name];\n }\n }\n }\n return i ? listener ? onAdd : onRemove : listener ? d3_noop : removeAll;\n }\n var d3_selection_onFilters = d3.map({\n mouseenter: \"mouseover\",\n mouseleave: \"mouseout\"\n });\n if (d3_document) {\n d3_selection_onFilters.forEach(function(k) {\n if (\"on\" + k in d3_document) d3_selection_onFilters.remove(k);\n });\n }\n function d3_selection_onListener(listener, argumentz) {\n return function(e) {\n var o = d3.event;\n d3.event = e;\n argumentz[0] = this.__data__;\n try {\n listener.apply(this, argumentz);\n } finally {\n d3.event = o;\n }\n };\n }\n function d3_selection_onFilter(listener, argumentz) {\n var l = d3_selection_onListener(listener, argumentz);\n return function(e) {\n var target = this, related = e.relatedTarget;\n if (!related || related !== target && !(related.compareDocumentPosition(target) & 8)) {\n l.call(target, e);\n }\n };\n }\n var d3_event_dragSelect, d3_event_dragId = 0;\n function d3_event_dragSuppress(node) {\n var name = \".dragsuppress-\" + ++d3_event_dragId, click = \"click\" + name, w = d3.select(d3_window(node)).on(\"touchmove\" + name, d3_eventPreventDefault).on(\"dragstart\" + name, d3_eventPreventDefault).on(\"selectstart\" + name, d3_eventPreventDefault);\n if (d3_event_dragSelect == null) {\n d3_event_dragSelect = \"onselectstart\" in node ? false : d3_vendorSymbol(node.style, \"userSelect\");\n }\n if (d3_event_dragSelect) {\n var style = d3_documentElement(node).style, select = style[d3_event_dragSelect];\n style[d3_event_dragSelect] = \"none\";\n }\n return function(suppressClick) {\n w.on(name, null);\n if (d3_event_dragSelect) style[d3_event_dragSelect] = select;\n if (suppressClick) {\n var off = function() {\n w.on(click, null);\n };\n w.on(click, function() {\n d3_eventPreventDefault();\n off();\n }, true);\n setTimeout(off, 0);\n }\n };\n }\n d3.mouse = function(container) {\n return d3_mousePoint(container, d3_eventSource());\n };\n var d3_mouse_bug44083 = this.navigator && /WebKit/.test(this.navigator.userAgent) ? -1 : 0;\n function d3_mousePoint(container, e) {\n if (e.changedTouches) e = e.changedTouches[0];\n var svg = container.ownerSVGElement || container;\n if (svg.createSVGPoint) {\n var point = svg.createSVGPoint();\n if (d3_mouse_bug44083 < 0) {\n var window = d3_window(container);\n if (window.scrollX || window.scrollY) {\n svg = d3.select(\"body\").append(\"svg\").style({\n position: \"absolute\",\n top: 0,\n left: 0,\n margin: 0,\n padding: 0,\n border: \"none\"\n }, \"important\");\n var ctm = svg[0][0].getScreenCTM();\n d3_mouse_bug44083 = !(ctm.f || ctm.e);\n svg.remove();\n }\n }\n if (d3_mouse_bug44083) point.x = e.pageX, point.y = e.pageY; else point.x = e.clientX, \n point.y = e.clientY;\n point = point.matrixTransform(container.getScreenCTM().inverse());\n return [ point.x, point.y ];\n }\n var rect = container.getBoundingClientRect();\n return [ e.clientX - rect.left - container.clientLeft, e.clientY - rect.top - container.clientTop ];\n }\n d3.touch = function(container, touches, identifier) {\n if (arguments.length < 3) identifier = touches, touches = d3_eventSource().changedTouches;\n if (touches) for (var i = 0, n = touches.length, touch; i < n; ++i) {\n if ((touch = touches[i]).identifier === identifier) {\n return d3_mousePoint(container, touch);\n }\n }\n };\n d3.behavior.drag = function() {\n var event = d3_eventDispatch(drag, \"drag\", \"dragstart\", \"dragend\"), origin = null, mousedown = dragstart(d3_noop, d3.mouse, d3_window, \"mousemove\", \"mouseup\"), touchstart = dragstart(d3_behavior_dragTouchId, d3.touch, d3_identity, \"touchmove\", \"touchend\");\n function drag() {\n this.on(\"mousedown.drag\", mousedown).on(\"touchstart.drag\", touchstart);\n }\n function dragstart(id, position, subject, move, end) {\n return function() {\n var that = this, target = d3.event.target.correspondingElement || d3.event.target, parent = that.parentNode, dispatch = event.of(that, arguments), dragged = 0, dragId = id(), dragName = \".drag\" + (dragId == null ? \"\" : \"-\" + dragId), dragOffset, dragSubject = d3.select(subject(target)).on(move + dragName, moved).on(end + dragName, ended), dragRestore = d3_event_dragSuppress(target), position0 = position(parent, dragId);\n if (origin) {\n dragOffset = origin.apply(that, arguments);\n dragOffset = [ dragOffset.x - position0[0], dragOffset.y - position0[1] ];\n } else {\n dragOffset = [ 0, 0 ];\n }\n dispatch({\n type: \"dragstart\"\n });\n function moved() {\n var position1 = position(parent, dragId), dx, dy;\n if (!position1) return;\n dx = position1[0] - position0[0];\n dy = position1[1] - position0[1];\n dragged |= dx | dy;\n position0 = position1;\n dispatch({\n type: \"drag\",\n x: position1[0] + dragOffset[0],\n y: position1[1] + dragOffset[1],\n dx: dx,\n dy: dy\n });\n }\n function ended() {\n if (!position(parent, dragId)) return;\n dragSubject.on(move + dragName, null).on(end + dragName, null);\n dragRestore(dragged);\n dispatch({\n type: \"dragend\"\n });\n }\n };\n }\n drag.origin = function(x) {\n if (!arguments.length) return origin;\n origin = x;\n return drag;\n };\n return d3.rebind(drag, event, \"on\");\n };\n function d3_behavior_dragTouchId() {\n return d3.event.changedTouches[0].identifier;\n }\n d3.touches = function(container, touches) {\n if (arguments.length < 2) touches = d3_eventSource().touches;\n return touches ? d3_array(touches).map(function(touch) {\n var point = d3_mousePoint(container, touch);\n point.identifier = touch.identifier;\n return point;\n }) : [];\n };\n var ε = 1e-6, ε2 = ε * ε, π = Math.PI, τ = 2 * π, τε = τ - ε, halfπ = π / 2, d3_radians = π / 180, d3_degrees = 180 / π;\n function d3_sgn(x) {\n return x > 0 ? 1 : x < 0 ? -1 : 0;\n }\n function d3_cross2d(a, b, c) {\n return (b[0] - a[0]) * (c[1] - a[1]) - (b[1] - a[1]) * (c[0] - a[0]);\n }\n function d3_acos(x) {\n return x > 1 ? 0 : x < -1 ? π : Math.acos(x);\n }\n function d3_asin(x) {\n return x > 1 ? halfπ : x < -1 ? -halfπ : Math.asin(x);\n }\n function d3_sinh(x) {\n return ((x = Math.exp(x)) - 1 / x) / 2;\n }\n function d3_cosh(x) {\n return ((x = Math.exp(x)) + 1 / x) / 2;\n }\n function d3_tanh(x) {\n return ((x = Math.exp(2 * x)) - 1) / (x + 1);\n }\n function d3_haversin(x) {\n return (x = Math.sin(x / 2)) * x;\n }\n var ρ = Math.SQRT2, ρ2 = 2, ρ4 = 4;\n d3.interpolateZoom = function(p0, p1) {\n var ux0 = p0[0], uy0 = p0[1], w0 = p0[2], ux1 = p1[0], uy1 = p1[1], w1 = p1[2], dx = ux1 - ux0, dy = uy1 - uy0, d2 = dx * dx + dy * dy, i, S;\n if (d2 < ε2) {\n S = Math.log(w1 / w0) / ρ;\n i = function(t) {\n return [ ux0 + t * dx, uy0 + t * dy, w0 * Math.exp(ρ * t * S) ];\n };\n } else {\n var d1 = Math.sqrt(d2), b0 = (w1 * w1 - w0 * w0 + ρ4 * d2) / (2 * w0 * ρ2 * d1), b1 = (w1 * w1 - w0 * w0 - ρ4 * d2) / (2 * w1 * ρ2 * d1), r0 = Math.log(Math.sqrt(b0 * b0 + 1) - b0), r1 = Math.log(Math.sqrt(b1 * b1 + 1) - b1);\n S = (r1 - r0) / ρ;\n i = function(t) {\n var s = t * S, coshr0 = d3_cosh(r0), u = w0 / (ρ2 * d1) * (coshr0 * d3_tanh(ρ * s + r0) - d3_sinh(r0));\n return [ ux0 + u * dx, uy0 + u * dy, w0 * coshr0 / d3_cosh(ρ * s + r0) ];\n };\n }\n i.duration = S * 1e3;\n return i;\n };\n d3.behavior.zoom = function() {\n var view = {\n x: 0,\n y: 0,\n k: 1\n }, translate0, center0, center, size = [ 960, 500 ], scaleExtent = d3_behavior_zoomInfinity, duration = 250, zooming = 0, mousedown = \"mousedown.zoom\", mousemove = \"mousemove.zoom\", mouseup = \"mouseup.zoom\", mousewheelTimer, touchstart = \"touchstart.zoom\", touchtime, event = d3_eventDispatch(zoom, \"zoomstart\", \"zoom\", \"zoomend\"), x0, x1, y0, y1;\n if (!d3_behavior_zoomWheel) {\n d3_behavior_zoomWheel = \"onwheel\" in d3_document ? (d3_behavior_zoomDelta = function() {\n return -d3.event.deltaY * (d3.event.deltaMode ? 120 : 1);\n }, \"wheel\") : \"onmousewheel\" in d3_document ? (d3_behavior_zoomDelta = function() {\n return d3.event.wheelDelta;\n }, \"mousewheel\") : (d3_behavior_zoomDelta = function() {\n return -d3.event.detail;\n }, \"MozMousePixelScroll\");\n }\n function zoom(g) {\n g.on(mousedown, mousedowned).on(d3_behavior_zoomWheel + \".zoom\", mousewheeled).on(\"dblclick.zoom\", dblclicked).on(touchstart, touchstarted);\n }\n zoom.event = function(g) {\n g.each(function() {\n var dispatch = event.of(this, arguments), view1 = view;\n if (d3_transitionInheritId) {\n d3.select(this).transition().each(\"start.zoom\", function() {\n view = this.__chart__ || {\n x: 0,\n y: 0,\n k: 1\n };\n zoomstarted(dispatch);\n }).tween(\"zoom:zoom\", function() {\n var dx = size[0], dy = size[1], cx = center0 ? center0[0] : dx / 2, cy = center0 ? center0[1] : dy / 2, i = d3.interpolateZoom([ (cx - view.x) / view.k, (cy - view.y) / view.k, dx / view.k ], [ (cx - view1.x) / view1.k, (cy - view1.y) / view1.k, dx / view1.k ]);\n return function(t) {\n var l = i(t), k = dx / l[2];\n this.__chart__ = view = {\n x: cx - l[0] * k,\n y: cy - l[1] * k,\n k: k\n };\n zoomed(dispatch);\n };\n }).each(\"interrupt.zoom\", function() {\n zoomended(dispatch);\n }).each(\"end.zoom\", function() {\n zoomended(dispatch);\n });\n } else {\n this.__chart__ = view;\n zoomstarted(dispatch);\n zoomed(dispatch);\n zoomended(dispatch);\n }\n });\n };\n zoom.translate = function(_) {\n if (!arguments.length) return [ view.x, view.y ];\n view = {\n x: +_[0],\n y: +_[1],\n k: view.k\n };\n rescale();\n return zoom;\n };\n zoom.scale = function(_) {\n if (!arguments.length) return view.k;\n view = {\n x: view.x,\n y: view.y,\n k: null\n };\n scaleTo(+_);\n rescale();\n return zoom;\n };\n zoom.scaleExtent = function(_) {\n if (!arguments.length) return scaleExtent;\n scaleExtent = _ == null ? d3_behavior_zoomInfinity : [ +_[0], +_[1] ];\n return zoom;\n };\n zoom.center = function(_) {\n if (!arguments.length) return center;\n center = _ && [ +_[0], +_[1] ];\n return zoom;\n };\n zoom.size = function(_) {\n if (!arguments.length) return size;\n size = _ && [ +_[0], +_[1] ];\n return zoom;\n };\n zoom.duration = function(_) {\n if (!arguments.length) return duration;\n duration = +_;\n return zoom;\n };\n zoom.x = function(z) {\n if (!arguments.length) return x1;\n x1 = z;\n x0 = z.copy();\n view = {\n x: 0,\n y: 0,\n k: 1\n };\n return zoom;\n };\n zoom.y = function(z) {\n if (!arguments.length) return y1;\n y1 = z;\n y0 = z.copy();\n view = {\n x: 0,\n y: 0,\n k: 1\n };\n return zoom;\n };\n function location(p) {\n return [ (p[0] - view.x) / view.k, (p[1] - view.y) / view.k ];\n }\n function point(l) {\n return [ l[0] * view.k + view.x, l[1] * view.k + view.y ];\n }\n function scaleTo(s) {\n view.k = Math.max(scaleExtent[0], Math.min(scaleExtent[1], s));\n }\n function translateTo(p, l) {\n l = point(l);\n view.x += p[0] - l[0];\n view.y += p[1] - l[1];\n }\n function zoomTo(that, p, l, k) {\n that.__chart__ = {\n x: view.x,\n y: view.y,\n k: view.k\n };\n scaleTo(Math.pow(2, k));\n translateTo(center0 = p, l);\n that = d3.select(that);\n if (duration > 0) that = that.transition().duration(duration);\n that.call(zoom.event);\n }\n function rescale() {\n if (x1) x1.domain(x0.range().map(function(x) {\n return (x - view.x) / view.k;\n }).map(x0.invert));\n if (y1) y1.domain(y0.range().map(function(y) {\n return (y - view.y) / view.k;\n }).map(y0.invert));\n }\n function zoomstarted(dispatch) {\n if (!zooming++) dispatch({\n type: \"zoomstart\"\n });\n }\n function zoomed(dispatch) {\n rescale();\n dispatch({\n type: \"zoom\",\n scale: view.k,\n translate: [ view.x, view.y ]\n });\n }\n function zoomended(dispatch) {\n if (!--zooming) dispatch({\n type: \"zoomend\"\n }), center0 = null;\n }\n function mousedowned() {\n var that = this, dispatch = event.of(that, arguments), dragged = 0, subject = d3.select(d3_window(that)).on(mousemove, moved).on(mouseup, ended), location0 = location(d3.mouse(that)), dragRestore = d3_event_dragSuppress(that);\n d3_selection_interrupt.call(that);\n zoomstarted(dispatch);\n function moved() {\n dragged = 1;\n translateTo(d3.mouse(that), location0);\n zoomed(dispatch);\n }\n function ended() {\n subject.on(mousemove, null).on(mouseup, null);\n dragRestore(dragged);\n zoomended(dispatch);\n }\n }\n function touchstarted() {\n var that = this, dispatch = event.of(that, arguments), locations0 = {}, distance0 = 0, scale0, zoomName = \".zoom-\" + d3.event.changedTouches[0].identifier, touchmove = \"touchmove\" + zoomName, touchend = \"touchend\" + zoomName, targets = [], subject = d3.select(that), dragRestore = d3_event_dragSuppress(that);\n started();\n zoomstarted(dispatch);\n subject.on(mousedown, null).on(touchstart, started);\n function relocate() {\n var touches = d3.touches(that);\n scale0 = view.k;\n touches.forEach(function(t) {\n if (t.identifier in locations0) locations0[t.identifier] = location(t);\n });\n return touches;\n }\n function started() {\n var target = d3.event.target;\n d3.select(target).on(touchmove, moved).on(touchend, ended);\n targets.push(target);\n var changed = d3.event.changedTouches;\n for (var i = 0, n = changed.length; i < n; ++i) {\n locations0[changed[i].identifier] = null;\n }\n var touches = relocate(), now = Date.now();\n if (touches.length === 1) {\n if (now - touchtime < 500) {\n var p = touches[0];\n zoomTo(that, p, locations0[p.identifier], Math.floor(Math.log(view.k) / Math.LN2) + 1);\n d3_eventPreventDefault();\n }\n touchtime = now;\n } else if (touches.length > 1) {\n var p = touches[0], q = touches[1], dx = p[0] - q[0], dy = p[1] - q[1];\n distance0 = dx * dx + dy * dy;\n }\n }\n function moved() {\n var touches = d3.touches(that), p0, l0, p1, l1;\n d3_selection_interrupt.call(that);\n for (var i = 0, n = touches.length; i < n; ++i, l1 = null) {\n p1 = touches[i];\n if (l1 = locations0[p1.identifier]) {\n if (l0) break;\n p0 = p1, l0 = l1;\n }\n }\n if (l1) {\n var distance1 = (distance1 = p1[0] - p0[0]) * distance1 + (distance1 = p1[1] - p0[1]) * distance1, scale1 = distance0 && Math.sqrt(distance1 / distance0);\n p0 = [ (p0[0] + p1[0]) / 2, (p0[1] + p1[1]) / 2 ];\n l0 = [ (l0[0] + l1[0]) / 2, (l0[1] + l1[1]) / 2 ];\n scaleTo(scale1 * scale0);\n }\n touchtime = null;\n translateTo(p0, l0);\n zoomed(dispatch);\n }\n function ended() {\n if (d3.event.touches.length) {\n var changed = d3.event.changedTouches;\n for (var i = 0, n = changed.length; i < n; ++i) {\n delete locations0[changed[i].identifier];\n }\n for (var identifier in locations0) {\n return void relocate();\n }\n }\n d3.selectAll(targets).on(zoomName, null);\n subject.on(mousedown, mousedowned).on(touchstart, touchstarted);\n dragRestore();\n zoomended(dispatch);\n }\n }\n function mousewheeled() {\n var dispatch = event.of(this, arguments);\n if (mousewheelTimer) clearTimeout(mousewheelTimer); else d3_selection_interrupt.call(this), \n translate0 = location(center0 = center || d3.mouse(this)), zoomstarted(dispatch);\n mousewheelTimer = setTimeout(function() {\n mousewheelTimer = null;\n zoomended(dispatch);\n }, 50);\n d3_eventPreventDefault();\n scaleTo(Math.pow(2, d3_behavior_zoomDelta() * .002) * view.k);\n translateTo(center0, translate0);\n zoomed(dispatch);\n }\n function dblclicked() {\n var p = d3.mouse(this), k = Math.log(view.k) / Math.LN2;\n zoomTo(this, p, location(p), d3.event.shiftKey ? Math.ceil(k) - 1 : Math.floor(k) + 1);\n }\n return d3.rebind(zoom, event, \"on\");\n };\n var d3_behavior_zoomInfinity = [ 0, Infinity ], d3_behavior_zoomDelta, d3_behavior_zoomWheel;\n d3.color = d3_color;\n function d3_color() {}\n d3_color.prototype.toString = function() {\n return this.rgb() + \"\";\n };\n d3.hsl = d3_hsl;\n function d3_hsl(h, s, l) {\n return this instanceof d3_hsl ? void (this.h = +h, this.s = +s, this.l = +l) : arguments.length < 2 ? h instanceof d3_hsl ? new d3_hsl(h.h, h.s, h.l) : d3_rgb_parse(\"\" + h, d3_rgb_hsl, d3_hsl) : new d3_hsl(h, s, l);\n }\n var d3_hslPrototype = d3_hsl.prototype = new d3_color();\n d3_hslPrototype.brighter = function(k) {\n k = Math.pow(.7, arguments.length ? k : 1);\n return new d3_hsl(this.h, this.s, this.l / k);\n };\n d3_hslPrototype.darker = function(k) {\n k = Math.pow(.7, arguments.length ? k : 1);\n return new d3_hsl(this.h, this.s, k * this.l);\n };\n d3_hslPrototype.rgb = function() {\n return d3_hsl_rgb(this.h, this.s, this.l);\n };\n function d3_hsl_rgb(h, s, l) {\n var m1, m2;\n h = isNaN(h) ? 0 : (h %= 360) < 0 ? h + 360 : h;\n s = isNaN(s) ? 0 : s < 0 ? 0 : s > 1 ? 1 : s;\n l = l < 0 ? 0 : l > 1 ? 1 : l;\n m2 = l <= .5 ? l * (1 + s) : l + s - l * s;\n m1 = 2 * l - m2;\n function v(h) {\n if (h > 360) h -= 360; else if (h < 0) h += 360;\n if (h < 60) return m1 + (m2 - m1) * h / 60;\n if (h < 180) return m2;\n if (h < 240) return m1 + (m2 - m1) * (240 - h) / 60;\n return m1;\n }\n function vv(h) {\n return Math.round(v(h) * 255);\n }\n return new d3_rgb(vv(h + 120), vv(h), vv(h - 120));\n }\n d3.hcl = d3_hcl;\n function d3_hcl(h, c, l) {\n return this instanceof d3_hcl ? void (this.h = +h, this.c = +c, this.l = +l) : arguments.length < 2 ? h instanceof d3_hcl ? new d3_hcl(h.h, h.c, h.l) : h instanceof d3_lab ? d3_lab_hcl(h.l, h.a, h.b) : d3_lab_hcl((h = d3_rgb_lab((h = d3.rgb(h)).r, h.g, h.b)).l, h.a, h.b) : new d3_hcl(h, c, l);\n }\n var d3_hclPrototype = d3_hcl.prototype = new d3_color();\n d3_hclPrototype.brighter = function(k) {\n return new d3_hcl(this.h, this.c, Math.min(100, this.l + d3_lab_K * (arguments.length ? k : 1)));\n };\n d3_hclPrototype.darker = function(k) {\n return new d3_hcl(this.h, this.c, Math.max(0, this.l - d3_lab_K * (arguments.length ? k : 1)));\n };\n d3_hclPrototype.rgb = function() {\n return d3_hcl_lab(this.h, this.c, this.l).rgb();\n };\n function d3_hcl_lab(h, c, l) {\n if (isNaN(h)) h = 0;\n if (isNaN(c)) c = 0;\n return new d3_lab(l, Math.cos(h *= d3_radians) * c, Math.sin(h) * c);\n }\n d3.lab = d3_lab;\n function d3_lab(l, a, b) {\n return this instanceof d3_lab ? void (this.l = +l, this.a = +a, this.b = +b) : arguments.length < 2 ? l instanceof d3_lab ? new d3_lab(l.l, l.a, l.b) : l instanceof d3_hcl ? d3_hcl_lab(l.h, l.c, l.l) : d3_rgb_lab((l = d3_rgb(l)).r, l.g, l.b) : new d3_lab(l, a, b);\n }\n var d3_lab_K = 18;\n var d3_lab_X = .95047, d3_lab_Y = 1, d3_lab_Z = 1.08883;\n var d3_labPrototype = d3_lab.prototype = new d3_color();\n d3_labPrototype.brighter = function(k) {\n return new d3_lab(Math.min(100, this.l + d3_lab_K * (arguments.length ? k : 1)), this.a, this.b);\n };\n d3_labPrototype.darker = function(k) {\n return new d3_lab(Math.max(0, this.l - d3_lab_K * (arguments.length ? k : 1)), this.a, this.b);\n };\n d3_labPrototype.rgb = function() {\n return d3_lab_rgb(this.l, this.a, this.b);\n };\n function d3_lab_rgb(l, a, b) {\n var y = (l + 16) / 116, x = y + a / 500, z = y - b / 200;\n x = d3_lab_xyz(x) * d3_lab_X;\n y = d3_lab_xyz(y) * d3_lab_Y;\n z = d3_lab_xyz(z) * d3_lab_Z;\n return new d3_rgb(d3_xyz_rgb(3.2404542 * x - 1.5371385 * y - .4985314 * z), d3_xyz_rgb(-.969266 * x + 1.8760108 * y + .041556 * z), d3_xyz_rgb(.0556434 * x - .2040259 * y + 1.0572252 * z));\n }\n function d3_lab_hcl(l, a, b) {\n return l > 0 ? new d3_hcl(Math.atan2(b, a) * d3_degrees, Math.sqrt(a * a + b * b), l) : new d3_hcl(NaN, NaN, l);\n }\n function d3_lab_xyz(x) {\n return x > .206893034 ? x * x * x : (x - 4 / 29) / 7.787037;\n }\n function d3_xyz_lab(x) {\n return x > .008856 ? Math.pow(x, 1 / 3) : 7.787037 * x + 4 / 29;\n }\n function d3_xyz_rgb(r) {\n return Math.round(255 * (r <= .00304 ? 12.92 * r : 1.055 * Math.pow(r, 1 / 2.4) - .055));\n }\n d3.rgb = d3_rgb;\n function d3_rgb(r, g, b) {\n return this instanceof d3_rgb ? void (this.r = ~~r, this.g = ~~g, this.b = ~~b) : arguments.length < 2 ? r instanceof d3_rgb ? new d3_rgb(r.r, r.g, r.b) : d3_rgb_parse(\"\" + r, d3_rgb, d3_hsl_rgb) : new d3_rgb(r, g, b);\n }\n function d3_rgbNumber(value) {\n return new d3_rgb(value >> 16, value >> 8 & 255, value & 255);\n }\n function d3_rgbString(value) {\n return d3_rgbNumber(value) + \"\";\n }\n var d3_rgbPrototype = d3_rgb.prototype = new d3_color();\n d3_rgbPrototype.brighter = function(k) {\n k = Math.pow(.7, arguments.length ? k : 1);\n var r = this.r, g = this.g, b = this.b, i = 30;\n if (!r && !g && !b) return new d3_rgb(i, i, i);\n if (r && r < i) r = i;\n if (g && g < i) g = i;\n if (b && b < i) b = i;\n return new d3_rgb(Math.min(255, r / k), Math.min(255, g / k), Math.min(255, b / k));\n };\n d3_rgbPrototype.darker = function(k) {\n k = Math.pow(.7, arguments.length ? k : 1);\n return new d3_rgb(k * this.r, k * this.g, k * this.b);\n };\n d3_rgbPrototype.hsl = function() {\n return d3_rgb_hsl(this.r, this.g, this.b);\n };\n d3_rgbPrototype.toString = function() {\n return \"#\" + d3_rgb_hex(this.r) + d3_rgb_hex(this.g) + d3_rgb_hex(this.b);\n };\n function d3_rgb_hex(v) {\n return v < 16 ? \"0\" + Math.max(0, v).toString(16) : Math.min(255, v).toString(16);\n }\n function d3_rgb_parse(format, rgb, hsl) {\n var r = 0, g = 0, b = 0, m1, m2, color;\n m1 = /([a-z]+)\\((.*)\\)/.exec(format = format.toLowerCase());\n if (m1) {\n m2 = m1[2].split(\",\");\n switch (m1[1]) {\n case \"hsl\":\n {\n return hsl(parseFloat(m2[0]), parseFloat(m2[1]) / 100, parseFloat(m2[2]) / 100);\n }\n\n case \"rgb\":\n {\n return rgb(d3_rgb_parseNumber(m2[0]), d3_rgb_parseNumber(m2[1]), d3_rgb_parseNumber(m2[2]));\n }\n }\n }\n if (color = d3_rgb_names.get(format)) {\n return rgb(color.r, color.g, color.b);\n }\n if (format != null && format.charAt(0) === \"#\" && !isNaN(color = parseInt(format.slice(1), 16))) {\n if (format.length === 4) {\n r = (color & 3840) >> 4;\n r = r >> 4 | r;\n g = color & 240;\n g = g >> 4 | g;\n b = color & 15;\n b = b << 4 | b;\n } else if (format.length === 7) {\n r = (color & 16711680) >> 16;\n g = (color & 65280) >> 8;\n b = color & 255;\n }\n }\n return rgb(r, g, b);\n }\n function d3_rgb_hsl(r, g, b) {\n var min = Math.min(r /= 255, g /= 255, b /= 255), max = Math.max(r, g, b), d = max - min, h, s, l = (max + min) / 2;\n if (d) {\n s = l < .5 ? d / (max + min) : d / (2 - max - min);\n if (r == max) h = (g - b) / d + (g < b ? 6 : 0); else if (g == max) h = (b - r) / d + 2; else h = (r - g) / d + 4;\n h *= 60;\n } else {\n h = NaN;\n s = l > 0 && l < 1 ? 0 : h;\n }\n return new d3_hsl(h, s, l);\n }\n function d3_rgb_lab(r, g, b) {\n r = d3_rgb_xyz(r);\n g = d3_rgb_xyz(g);\n b = d3_rgb_xyz(b);\n var x = d3_xyz_lab((.4124564 * r + .3575761 * g + .1804375 * b) / d3_lab_X), y = d3_xyz_lab((.2126729 * r + .7151522 * g + .072175 * b) / d3_lab_Y), z = d3_xyz_lab((.0193339 * r + .119192 * g + .9503041 * b) / d3_lab_Z);\n return d3_lab(116 * y - 16, 500 * (x - y), 200 * (y - z));\n }\n function d3_rgb_xyz(r) {\n return (r /= 255) <= .04045 ? r / 12.92 : Math.pow((r + .055) / 1.055, 2.4);\n }\n function d3_rgb_parseNumber(c) {\n var f = parseFloat(c);\n return c.charAt(c.length - 1) === \"%\" ? Math.round(f * 2.55) : f;\n }\n var d3_rgb_names = d3.map({\n aliceblue: 15792383,\n antiquewhite: 16444375,\n aqua: 65535,\n aquamarine: 8388564,\n azure: 15794175,\n beige: 16119260,\n bisque: 16770244,\n black: 0,\n blanchedalmond: 16772045,\n blue: 255,\n blueviolet: 9055202,\n brown: 10824234,\n burlywood: 14596231,\n cadetblue: 6266528,\n chartreuse: 8388352,\n chocolate: 13789470,\n coral: 16744272,\n cornflowerblue: 6591981,\n cornsilk: 16775388,\n crimson: 14423100,\n cyan: 65535,\n darkblue: 139,\n darkcyan: 35723,\n darkgoldenrod: 12092939,\n darkgray: 11119017,\n darkgreen: 25600,\n darkgrey: 11119017,\n darkkhaki: 12433259,\n darkmagenta: 9109643,\n darkolivegreen: 5597999,\n darkorange: 16747520,\n darkorchid: 10040012,\n darkred: 9109504,\n darksalmon: 15308410,\n darkseagreen: 9419919,\n darkslateblue: 4734347,\n darkslategray: 3100495,\n darkslategrey: 3100495,\n darkturquoise: 52945,\n darkviolet: 9699539,\n deeppink: 16716947,\n deepskyblue: 49151,\n dimgray: 6908265,\n dimgrey: 6908265,\n dodgerblue: 2003199,\n firebrick: 11674146,\n floralwhite: 16775920,\n forestgreen: 2263842,\n fuchsia: 16711935,\n gainsboro: 14474460,\n ghostwhite: 16316671,\n gold: 16766720,\n goldenrod: 14329120,\n gray: 8421504,\n green: 32768,\n greenyellow: 11403055,\n grey: 8421504,\n honeydew: 15794160,\n hotpink: 16738740,\n indianred: 13458524,\n indigo: 4915330,\n ivory: 16777200,\n khaki: 15787660,\n lavender: 15132410,\n lavenderblush: 16773365,\n lawngreen: 8190976,\n lemonchiffon: 16775885,\n lightblue: 11393254,\n lightcoral: 15761536,\n lightcyan: 14745599,\n lightgoldenrodyellow: 16448210,\n lightgray: 13882323,\n lightgreen: 9498256,\n lightgrey: 13882323,\n lightpink: 16758465,\n lightsalmon: 16752762,\n lightseagreen: 2142890,\n lightskyblue: 8900346,\n lightslategray: 7833753,\n lightslategrey: 7833753,\n lightsteelblue: 11584734,\n lightyellow: 16777184,\n lime: 65280,\n limegreen: 3329330,\n linen: 16445670,\n magenta: 16711935,\n maroon: 8388608,\n mediumaquamarine: 6737322,\n mediumblue: 205,\n mediumorchid: 12211667,\n mediumpurple: 9662683,\n mediumseagreen: 3978097,\n mediumslateblue: 8087790,\n mediumspringgreen: 64154,\n mediumturquoise: 4772300,\n mediumvioletred: 13047173,\n midnightblue: 1644912,\n mintcream: 16121850,\n mistyrose: 16770273,\n moccasin: 16770229,\n navajowhite: 16768685,\n navy: 128,\n oldlace: 16643558,\n olive: 8421376,\n olivedrab: 7048739,\n orange: 16753920,\n orangered: 16729344,\n orchid: 14315734,\n palegoldenrod: 15657130,\n palegreen: 10025880,\n paleturquoise: 11529966,\n palevioletred: 14381203,\n papayawhip: 16773077,\n peachpuff: 16767673,\n peru: 13468991,\n pink: 16761035,\n plum: 14524637,\n powderblue: 11591910,\n purple: 8388736,\n rebeccapurple: 6697881,\n red: 16711680,\n rosybrown: 12357519,\n royalblue: 4286945,\n saddlebrown: 9127187,\n salmon: 16416882,\n sandybrown: 16032864,\n seagreen: 3050327,\n seashell: 16774638,\n sienna: 10506797,\n silver: 12632256,\n skyblue: 8900331,\n slateblue: 6970061,\n slategray: 7372944,\n slategrey: 7372944,\n snow: 16775930,\n springgreen: 65407,\n steelblue: 4620980,\n tan: 13808780,\n teal: 32896,\n thistle: 14204888,\n tomato: 16737095,\n turquoise: 4251856,\n violet: 15631086,\n wheat: 16113331,\n white: 16777215,\n whitesmoke: 16119285,\n yellow: 16776960,\n yellowgreen: 10145074\n });\n d3_rgb_names.forEach(function(key, value) {\n d3_rgb_names.set(key, d3_rgbNumber(value));\n });\n function d3_functor(v) {\n return typeof v === \"function\" ? v : function() {\n return v;\n };\n }\n d3.functor = d3_functor;\n d3.xhr = d3_xhrType(d3_identity);\n function d3_xhrType(response) {\n return function(url, mimeType, callback) {\n if (arguments.length === 2 && typeof mimeType === \"function\") callback = mimeType, \n mimeType = null;\n return d3_xhr(url, mimeType, response, callback);\n };\n }\n function d3_xhr(url, mimeType, response, callback) {\n var xhr = {}, dispatch = d3.dispatch(\"beforesend\", \"progress\", \"load\", \"error\"), headers = {}, request = new XMLHttpRequest(), responseType = null;\n if (this.XDomainRequest && !(\"withCredentials\" in request) && /^(http(s)?:)?\\/\\//.test(url)) request = new XDomainRequest();\n \"onload\" in request ? request.onload = request.onerror = respond : request.onreadystatechange = function() {\n request.readyState > 3 && respond();\n };\n function respond() {\n var status = request.status, result;\n if (!status && d3_xhrHasResponse(request) || status >= 200 && status < 300 || status === 304) {\n try {\n result = response.call(xhr, request);\n } catch (e) {\n dispatch.error.call(xhr, e);\n return;\n }\n dispatch.load.call(xhr, result);\n } else {\n dispatch.error.call(xhr, request);\n }\n }\n request.onprogress = function(event) {\n var o = d3.event;\n d3.event = event;\n try {\n dispatch.progress.call(xhr, request);\n } finally {\n d3.event = o;\n }\n };\n xhr.header = function(name, value) {\n name = (name + \"\").toLowerCase();\n if (arguments.length < 2) return headers[name];\n if (value == null) delete headers[name]; else headers[name] = value + \"\";\n return xhr;\n };\n xhr.mimeType = function(value) {\n if (!arguments.length) return mimeType;\n mimeType = value == null ? null : value + \"\";\n return xhr;\n };\n xhr.responseType = function(value) {\n if (!arguments.length) return responseType;\n responseType = value;\n return xhr;\n };\n xhr.response = function(value) {\n response = value;\n return xhr;\n };\n [ \"get\", \"post\" ].forEach(function(method) {\n xhr[method] = function() {\n return xhr.send.apply(xhr, [ method ].concat(d3_array(arguments)));\n };\n });\n xhr.send = function(method, data, callback) {\n if (arguments.length === 2 && typeof data === \"function\") callback = data, data = null;\n request.open(method, url, true);\n if (mimeType != null && !(\"accept\" in headers)) headers[\"accept\"] = mimeType + \",*/*\";\n if (request.setRequestHeader) for (var name in headers) request.setRequestHeader(name, headers[name]);\n if (mimeType != null && request.overrideMimeType) request.overrideMimeType(mimeType);\n if (responseType != null) request.responseType = responseType;\n if (callback != null) xhr.on(\"error\", callback).on(\"load\", function(request) {\n callback(null, request);\n });\n dispatch.beforesend.call(xhr, request);\n request.send(data == null ? null : data);\n return xhr;\n };\n xhr.abort = function() {\n request.abort();\n return xhr;\n };\n d3.rebind(xhr, dispatch, \"on\");\n return callback == null ? xhr : xhr.get(d3_xhr_fixCallback(callback));\n }\n function d3_xhr_fixCallback(callback) {\n return callback.length === 1 ? function(error, request) {\n callback(error == null ? request : null);\n } : callback;\n }\n function d3_xhrHasResponse(request) {\n var type = request.responseType;\n return type && type !== \"text\" ? request.response : request.responseText;\n }\n d3.dsv = function(delimiter, mimeType) {\n var reFormat = new RegExp('[\"' + delimiter + \"\\n]\"), delimiterCode = delimiter.charCodeAt(0);\n function dsv(url, row, callback) {\n if (arguments.length < 3) callback = row, row = null;\n var xhr = d3_xhr(url, mimeType, row == null ? response : typedResponse(row), callback);\n xhr.row = function(_) {\n return arguments.length ? xhr.response((row = _) == null ? response : typedResponse(_)) : row;\n };\n return xhr;\n }\n function response(request) {\n return dsv.parse(request.responseText);\n }\n function typedResponse(f) {\n return function(request) {\n return dsv.parse(request.responseText, f);\n };\n }\n dsv.parse = function(text, f) {\n var o;\n return dsv.parseRows(text, function(row, i) {\n if (o) return o(row, i - 1);\n var a = new Function(\"d\", \"return {\" + row.map(function(name, i) {\n return JSON.stringify(name) + \": d[\" + i + \"]\";\n }).join(\",\") + \"}\");\n o = f ? function(row, i) {\n return f(a(row), i);\n } : a;\n });\n };\n dsv.parseRows = function(text, f) {\n var EOL = {}, EOF = {}, rows = [], N = text.length, I = 0, n = 0, t, eol;\n function token() {\n if (I >= N) return EOF;\n if (eol) return eol = false, EOL;\n var j = I;\n if (text.charCodeAt(j) === 34) {\n var i = j;\n while (i++ < N) {\n if (text.charCodeAt(i) === 34) {\n if (text.charCodeAt(i + 1) !== 34) break;\n ++i;\n }\n }\n I = i + 2;\n var c = text.charCodeAt(i + 1);\n if (c === 13) {\n eol = true;\n if (text.charCodeAt(i + 2) === 10) ++I;\n } else if (c === 10) {\n eol = true;\n }\n return text.slice(j + 1, i).replace(/\"\"/g, '\"');\n }\n while (I < N) {\n var c = text.charCodeAt(I++), k = 1;\n if (c === 10) eol = true; else if (c === 13) {\n eol = true;\n if (text.charCodeAt(I) === 10) ++I, ++k;\n } else if (c !== delimiterCode) continue;\n return text.slice(j, I - k);\n }\n return text.slice(j);\n }\n while ((t = token()) !== EOF) {\n var a = [];\n while (t !== EOL && t !== EOF) {\n a.push(t);\n t = token();\n }\n if (f && (a = f(a, n++)) == null) continue;\n rows.push(a);\n }\n return rows;\n };\n dsv.format = function(rows) {\n if (Array.isArray(rows[0])) return dsv.formatRows(rows);\n var fieldSet = new d3_Set(), fields = [];\n rows.forEach(function(row) {\n for (var field in row) {\n if (!fieldSet.has(field)) {\n fields.push(fieldSet.add(field));\n }\n }\n });\n return [ fields.map(formatValue).join(delimiter) ].concat(rows.map(function(row) {\n return fields.map(function(field) {\n return formatValue(row[field]);\n }).join(delimiter);\n })).join(\"\\n\");\n };\n dsv.formatRows = function(rows) {\n return rows.map(formatRow).join(\"\\n\");\n };\n function formatRow(row) {\n return row.map(formatValue).join(delimiter);\n }\n function formatValue(text) {\n return reFormat.test(text) ? '\"' + text.replace(/\\\"/g, '\"\"') + '\"' : text;\n }\n return dsv;\n };\n d3.csv = d3.dsv(\",\", \"text/csv\");\n d3.tsv = d3.dsv(\"\t\", \"text/tab-separated-values\");\n var d3_timer_queueHead, d3_timer_queueTail, d3_timer_interval, d3_timer_timeout, d3_timer_frame = this[d3_vendorSymbol(this, \"requestAnimationFrame\")] || function(callback) {\n setTimeout(callback, 17);\n };\n d3.timer = function() {\n d3_timer.apply(this, arguments);\n };\n function d3_timer(callback, delay, then) {\n var n = arguments.length;\n if (n < 2) delay = 0;\n if (n < 3) then = Date.now();\n var time = then + delay, timer = {\n c: callback,\n t: time,\n n: null\n };\n if (d3_timer_queueTail) d3_timer_queueTail.n = timer; else d3_timer_queueHead = timer;\n d3_timer_queueTail = timer;\n if (!d3_timer_interval) {\n d3_timer_timeout = clearTimeout(d3_timer_timeout);\n d3_timer_interval = 1;\n d3_timer_frame(d3_timer_step);\n }\n return timer;\n }\n function d3_timer_step() {\n var now = d3_timer_mark(), delay = d3_timer_sweep() - now;\n if (delay > 24) {\n if (isFinite(delay)) {\n clearTimeout(d3_timer_timeout);\n d3_timer_timeout = setTimeout(d3_timer_step, delay);\n }\n d3_timer_interval = 0;\n } else {\n d3_timer_interval = 1;\n d3_timer_frame(d3_timer_step);\n }\n }\n d3.timer.flush = function() {\n d3_timer_mark();\n d3_timer_sweep();\n };\n function d3_timer_mark() {\n var now = Date.now(), timer = d3_timer_queueHead;\n while (timer) {\n if (now >= timer.t && timer.c(now - timer.t)) timer.c = null;\n timer = timer.n;\n }\n return now;\n }\n function d3_timer_sweep() {\n var t0, t1 = d3_timer_queueHead, time = Infinity;\n while (t1) {\n if (t1.c) {\n if (t1.t < time) time = t1.t;\n t1 = (t0 = t1).n;\n } else {\n t1 = t0 ? t0.n = t1.n : d3_timer_queueHead = t1.n;\n }\n }\n d3_timer_queueTail = t0;\n return time;\n }\n function d3_format_precision(x, p) {\n return p - (x ? Math.ceil(Math.log(x) / Math.LN10) : 1);\n }\n d3.round = function(x, n) {\n return n ? Math.round(x * (n = Math.pow(10, n))) / n : Math.round(x);\n };\n var d3_formatPrefixes = [ \"y\", \"z\", \"a\", \"f\", \"p\", \"n\", \"µ\", \"m\", \"\", \"k\", \"M\", \"G\", \"T\", \"P\", \"E\", \"Z\", \"Y\" ].map(d3_formatPrefix);\n d3.formatPrefix = function(value, precision) {\n var i = 0;\n if (value = +value) {\n if (value < 0) value *= -1;\n if (precision) value = d3.round(value, d3_format_precision(value, precision));\n i = 1 + Math.floor(1e-12 + Math.log(value) / Math.LN10);\n i = Math.max(-24, Math.min(24, Math.floor((i - 1) / 3) * 3));\n }\n return d3_formatPrefixes[8 + i / 3];\n };\n function d3_formatPrefix(d, i) {\n var k = Math.pow(10, abs(8 - i) * 3);\n return {\n scale: i > 8 ? function(d) {\n return d / k;\n } : function(d) {\n return d * k;\n },\n symbol: d\n };\n }\n function d3_locale_numberFormat(locale) {\n var locale_decimal = locale.decimal, locale_thousands = locale.thousands, locale_grouping = locale.grouping, locale_currency = locale.currency, formatGroup = locale_grouping && locale_thousands ? function(value, width) {\n var i = value.length, t = [], j = 0, g = locale_grouping[0], length = 0;\n while (i > 0 && g > 0) {\n if (length + g + 1 > width) g = Math.max(1, width - length);\n t.push(value.substring(i -= g, i + g));\n if ((length += g + 1) > width) break;\n g = locale_grouping[j = (j + 1) % locale_grouping.length];\n }\n return t.reverse().join(locale_thousands);\n } : d3_identity;\n return function(specifier) {\n var match = d3_format_re.exec(specifier), fill = match[1] || \" \", align = match[2] || \">\", sign = match[3] || \"-\", symbol = match[4] || \"\", zfill = match[5], width = +match[6], comma = match[7], precision = match[8], type = match[9], scale = 1, prefix = \"\", suffix = \"\", integer = false, exponent = true;\n if (precision) precision = +precision.substring(1);\n if (zfill || fill === \"0\" && align === \"=\") {\n zfill = fill = \"0\";\n align = \"=\";\n }\n switch (type) {\n case \"n\":\n comma = true;\n type = \"g\";\n break;\n\n case \"%\":\n scale = 100;\n suffix = \"%\";\n type = \"f\";\n break;\n\n case \"p\":\n scale = 100;\n suffix = \"%\";\n type = \"r\";\n break;\n\n case \"b\":\n case \"o\":\n case \"x\":\n case \"X\":\n if (symbol === \"#\") prefix = \"0\" + type.toLowerCase();\n\n case \"c\":\n exponent = false;\n\n case \"d\":\n integer = true;\n precision = 0;\n break;\n\n case \"s\":\n scale = -1;\n type = \"r\";\n break;\n }\n if (symbol === \"$\") prefix = locale_currency[0], suffix = locale_currency[1];\n if (type == \"r\" && !precision) type = \"g\";\n if (precision != null) {\n if (type == \"g\") precision = Math.max(1, Math.min(21, precision)); else if (type == \"e\" || type == \"f\") precision = Math.max(0, Math.min(20, precision));\n }\n type = d3_format_types.get(type) || d3_format_typeDefault;\n var zcomma = zfill && comma;\n return function(value) {\n var fullSuffix = suffix;\n if (integer && value % 1) return \"\";\n var negative = value < 0 || value === 0 && 1 / value < 0 ? (value = -value, \"-\") : sign === \"-\" ? \"\" : sign;\n if (scale < 0) {\n var unit = d3.formatPrefix(value, precision);\n value = unit.scale(value);\n fullSuffix = unit.symbol + suffix;\n } else {\n value *= scale;\n }\n value = type(value, precision);\n var i = value.lastIndexOf(\".\"), before, after;\n if (i < 0) {\n var j = exponent ? value.lastIndexOf(\"e\") : -1;\n if (j < 0) before = value, after = \"\"; else before = value.substring(0, j), after = value.substring(j);\n } else {\n before = value.substring(0, i);\n after = locale_decimal + value.substring(i + 1);\n }\n if (!zfill && comma) before = formatGroup(before, Infinity);\n var length = prefix.length + before.length + after.length + (zcomma ? 0 : negative.length), padding = length < width ? new Array(length = width - length + 1).join(fill) : \"\";\n if (zcomma) before = formatGroup(padding + before, padding.length ? width - after.length : Infinity);\n negative += prefix;\n value = before + after;\n return (align === \"<\" ? negative + value + padding : align === \">\" ? padding + negative + value : align === \"^\" ? padding.substring(0, length >>= 1) + negative + value + padding.substring(length) : negative + (zcomma ? value : padding + value)) + fullSuffix;\n };\n };\n }\n var d3_format_re = /(?:([^{])?([<>=^]))?([+\\- ])?([$#])?(0)?(\\d+)?(,)?(\\.-?\\d+)?([a-z%])?/i;\n var d3_format_types = d3.map({\n b: function(x) {\n return x.toString(2);\n },\n c: function(x) {\n return String.fromCharCode(x);\n },\n o: function(x) {\n return x.toString(8);\n },\n x: function(x) {\n return x.toString(16);\n },\n X: function(x) {\n return x.toString(16).toUpperCase();\n },\n g: function(x, p) {\n return x.toPrecision(p);\n },\n e: function(x, p) {\n return x.toExponential(p);\n },\n f: function(x, p) {\n return x.toFixed(p);\n },\n r: function(x, p) {\n return (x = d3.round(x, d3_format_precision(x, p))).toFixed(Math.max(0, Math.min(20, d3_format_precision(x * (1 + 1e-15), p))));\n }\n });\n function d3_format_typeDefault(x) {\n return x + \"\";\n }\n var d3_time = d3.time = {}, d3_date = Date;\n function d3_date_utc() {\n this._ = new Date(arguments.length > 1 ? Date.UTC.apply(this, arguments) : arguments[0]);\n }\n d3_date_utc.prototype = {\n getDate: function() {\n return this._.getUTCDate();\n },\n getDay: function() {\n return this._.getUTCDay();\n },\n getFullYear: function() {\n return this._.getUTCFullYear();\n },\n getHours: function() {\n return this._.getUTCHours();\n },\n getMilliseconds: function() {\n return this._.getUTCMilliseconds();\n },\n getMinutes: function() {\n return this._.getUTCMinutes();\n },\n getMonth: function() {\n return this._.getUTCMonth();\n },\n getSeconds: function() {\n return this._.getUTCSeconds();\n },\n getTime: function() {\n return this._.getTime();\n },\n getTimezoneOffset: function() {\n return 0;\n },\n valueOf: function() {\n return this._.valueOf();\n },\n setDate: function() {\n d3_time_prototype.setUTCDate.apply(this._, arguments);\n },\n setDay: function() {\n d3_time_prototype.setUTCDay.apply(this._, arguments);\n },\n setFullYear: function() {\n d3_time_prototype.setUTCFullYear.apply(this._, arguments);\n },\n setHours: function() {\n d3_time_prototype.setUTCHours.apply(this._, arguments);\n },\n setMilliseconds: function() {\n d3_time_prototype.setUTCMilliseconds.apply(this._, arguments);\n },\n setMinutes: function() {\n d3_time_prototype.setUTCMinutes.apply(this._, arguments);\n },\n setMonth: function() {\n d3_time_prototype.setUTCMonth.apply(this._, arguments);\n },\n setSeconds: function() {\n d3_time_prototype.setUTCSeconds.apply(this._, arguments);\n },\n setTime: function() {\n d3_time_prototype.setTime.apply(this._, arguments);\n }\n };\n var d3_time_prototype = Date.prototype;\n function d3_time_interval(local, step, number) {\n function round(date) {\n var d0 = local(date), d1 = offset(d0, 1);\n return date - d0 < d1 - date ? d0 : d1;\n }\n function ceil(date) {\n step(date = local(new d3_date(date - 1)), 1);\n return date;\n }\n function offset(date, k) {\n step(date = new d3_date(+date), k);\n return date;\n }\n function range(t0, t1, dt) {\n var time = ceil(t0), times = [];\n if (dt > 1) {\n while (time < t1) {\n if (!(number(time) % dt)) times.push(new Date(+time));\n step(time, 1);\n }\n } else {\n while (time < t1) times.push(new Date(+time)), step(time, 1);\n }\n return times;\n }\n function range_utc(t0, t1, dt) {\n try {\n d3_date = d3_date_utc;\n var utc = new d3_date_utc();\n utc._ = t0;\n return range(utc, t1, dt);\n } finally {\n d3_date = Date;\n }\n }\n local.floor = local;\n local.round = round;\n local.ceil = ceil;\n local.offset = offset;\n local.range = range;\n var utc = local.utc = d3_time_interval_utc(local);\n utc.floor = utc;\n utc.round = d3_time_interval_utc(round);\n utc.ceil = d3_time_interval_utc(ceil);\n utc.offset = d3_time_interval_utc(offset);\n utc.range = range_utc;\n return local;\n }\n function d3_time_interval_utc(method) {\n return function(date, k) {\n try {\n d3_date = d3_date_utc;\n var utc = new d3_date_utc();\n utc._ = date;\n return method(utc, k)._;\n } finally {\n d3_date = Date;\n }\n };\n }\n d3_time.year = d3_time_interval(function(date) {\n date = d3_time.day(date);\n date.setMonth(0, 1);\n return date;\n }, function(date, offset) {\n date.setFullYear(date.getFullYear() + offset);\n }, function(date) {\n return date.getFullYear();\n });\n d3_time.years = d3_time.year.range;\n d3_time.years.utc = d3_time.year.utc.range;\n d3_time.day = d3_time_interval(function(date) {\n var day = new d3_date(2e3, 0);\n day.setFullYear(date.getFullYear(), date.getMonth(), date.getDate());\n return day;\n }, function(date, offset) {\n date.setDate(date.getDate() + offset);\n }, function(date) {\n return date.getDate() - 1;\n });\n d3_time.days = d3_time.day.range;\n d3_time.days.utc = d3_time.day.utc.range;\n d3_time.dayOfYear = function(date) {\n var year = d3_time.year(date);\n return Math.floor((date - year - (date.getTimezoneOffset() - year.getTimezoneOffset()) * 6e4) / 864e5);\n };\n [ \"sunday\", \"monday\", \"tuesday\", \"wednesday\", \"thursday\", \"friday\", \"saturday\" ].forEach(function(day, i) {\n i = 7 - i;\n var interval = d3_time[day] = d3_time_interval(function(date) {\n (date = d3_time.day(date)).setDate(date.getDate() - (date.getDay() + i) % 7);\n return date;\n }, function(date, offset) {\n date.setDate(date.getDate() + Math.floor(offset) * 7);\n }, function(date) {\n var day = d3_time.year(date).getDay();\n return Math.floor((d3_time.dayOfYear(date) + (day + i) % 7) / 7) - (day !== i);\n });\n d3_time[day + \"s\"] = interval.range;\n d3_time[day + \"s\"].utc = interval.utc.range;\n d3_time[day + \"OfYear\"] = function(date) {\n var day = d3_time.year(date).getDay();\n return Math.floor((d3_time.dayOfYear(date) + (day + i) % 7) / 7);\n };\n });\n d3_time.week = d3_time.sunday;\n d3_time.weeks = d3_time.sunday.range;\n d3_time.weeks.utc = d3_time.sunday.utc.range;\n d3_time.weekOfYear = d3_time.sundayOfYear;\n function d3_locale_timeFormat(locale) {\n var locale_dateTime = locale.dateTime, locale_date = locale.date, locale_time = locale.time, locale_periods = locale.periods, locale_days = locale.days, locale_shortDays = locale.shortDays, locale_months = locale.months, locale_shortMonths = locale.shortMonths;\n function d3_time_format(template) {\n var n = template.length;\n function format(date) {\n var string = [], i = -1, j = 0, c, p, f;\n while (++i < n) {\n if (template.charCodeAt(i) === 37) {\n string.push(template.slice(j, i));\n if ((p = d3_time_formatPads[c = template.charAt(++i)]) != null) c = template.charAt(++i);\n if (f = d3_time_formats[c]) c = f(date, p == null ? c === \"e\" ? \" \" : \"0\" : p);\n string.push(c);\n j = i + 1;\n }\n }\n string.push(template.slice(j, i));\n return string.join(\"\");\n }\n format.parse = function(string) {\n var d = {\n y: 1900,\n m: 0,\n d: 1,\n H: 0,\n M: 0,\n S: 0,\n L: 0,\n Z: null\n }, i = d3_time_parse(d, template, string, 0);\n if (i != string.length) return null;\n if (\"p\" in d) d.H = d.H % 12 + d.p * 12;\n var localZ = d.Z != null && d3_date !== d3_date_utc, date = new (localZ ? d3_date_utc : d3_date)();\n if (\"j\" in d) date.setFullYear(d.y, 0, d.j); else if (\"W\" in d || \"U\" in d) {\n if (!(\"w\" in d)) d.w = \"W\" in d ? 1 : 0;\n date.setFullYear(d.y, 0, 1);\n date.setFullYear(d.y, 0, \"W\" in d ? (d.w + 6) % 7 + d.W * 7 - (date.getDay() + 5) % 7 : d.w + d.U * 7 - (date.getDay() + 6) % 7);\n } else date.setFullYear(d.y, d.m, d.d);\n date.setHours(d.H + (d.Z / 100 | 0), d.M + d.Z % 100, d.S, d.L);\n return localZ ? date._ : date;\n };\n format.toString = function() {\n return template;\n };\n return format;\n }\n function d3_time_parse(date, template, string, j) {\n var c, p, t, i = 0, n = template.length, m = string.length;\n while (i < n) {\n if (j >= m) return -1;\n c = template.charCodeAt(i++);\n if (c === 37) {\n t = template.charAt(i++);\n p = d3_time_parsers[t in d3_time_formatPads ? template.charAt(i++) : t];\n if (!p || (j = p(date, string, j)) < 0) return -1;\n } else if (c != string.charCodeAt(j++)) {\n return -1;\n }\n }\n return j;\n }\n d3_time_format.utc = function(template) {\n var local = d3_time_format(template);\n function format(date) {\n try {\n d3_date = d3_date_utc;\n var utc = new d3_date();\n utc._ = date;\n return local(utc);\n } finally {\n d3_date = Date;\n }\n }\n format.parse = function(string) {\n try {\n d3_date = d3_date_utc;\n var date = local.parse(string);\n return date && date._;\n } finally {\n d3_date = Date;\n }\n };\n format.toString = local.toString;\n return format;\n };\n d3_time_format.multi = d3_time_format.utc.multi = d3_time_formatMulti;\n var d3_time_periodLookup = d3.map(), d3_time_dayRe = d3_time_formatRe(locale_days), d3_time_dayLookup = d3_time_formatLookup(locale_days), d3_time_dayAbbrevRe = d3_time_formatRe(locale_shortDays), d3_time_dayAbbrevLookup = d3_time_formatLookup(locale_shortDays), d3_time_monthRe = d3_time_formatRe(locale_months), d3_time_monthLookup = d3_time_formatLookup(locale_months), d3_time_monthAbbrevRe = d3_time_formatRe(locale_shortMonths), d3_time_monthAbbrevLookup = d3_time_formatLookup(locale_shortMonths);\n locale_periods.forEach(function(p, i) {\n d3_time_periodLookup.set(p.toLowerCase(), i);\n });\n var d3_time_formats = {\n a: function(d) {\n return locale_shortDays[d.getDay()];\n },\n A: function(d) {\n return locale_days[d.getDay()];\n },\n b: function(d) {\n return locale_shortMonths[d.getMonth()];\n },\n B: function(d) {\n return locale_months[d.getMonth()];\n },\n c: d3_time_format(locale_dateTime),\n d: function(d, p) {\n return d3_time_formatPad(d.getDate(), p, 2);\n },\n e: function(d, p) {\n return d3_time_formatPad(d.getDate(), p, 2);\n },\n H: function(d, p) {\n return d3_time_formatPad(d.getHours(), p, 2);\n },\n I: function(d, p) {\n return d3_time_formatPad(d.getHours() % 12 || 12, p, 2);\n },\n j: function(d, p) {\n return d3_time_formatPad(1 + d3_time.dayOfYear(d), p, 3);\n },\n L: function(d, p) {\n return d3_time_formatPad(d.getMilliseconds(), p, 3);\n },\n m: function(d, p) {\n return d3_time_formatPad(d.getMonth() + 1, p, 2);\n },\n M: function(d, p) {\n return d3_time_formatPad(d.getMinutes(), p, 2);\n },\n p: function(d) {\n return locale_periods[+(d.getHours() >= 12)];\n },\n S: function(d, p) {\n return d3_time_formatPad(d.getSeconds(), p, 2);\n },\n U: function(d, p) {\n return d3_time_formatPad(d3_time.sundayOfYear(d), p, 2);\n },\n w: function(d) {\n return d.getDay();\n },\n W: function(d, p) {\n return d3_time_formatPad(d3_time.mondayOfYear(d), p, 2);\n },\n x: d3_time_format(locale_date),\n X: d3_time_format(locale_time),\n y: function(d, p) {\n return d3_time_formatPad(d.getFullYear() % 100, p, 2);\n },\n Y: function(d, p) {\n return d3_time_formatPad(d.getFullYear() % 1e4, p, 4);\n },\n Z: d3_time_zone,\n \"%\": function() {\n return \"%\";\n }\n };\n var d3_time_parsers = {\n a: d3_time_parseWeekdayAbbrev,\n A: d3_time_parseWeekday,\n b: d3_time_parseMonthAbbrev,\n B: d3_time_parseMonth,\n c: d3_time_parseLocaleFull,\n d: d3_time_parseDay,\n e: d3_time_parseDay,\n H: d3_time_parseHour24,\n I: d3_time_parseHour24,\n j: d3_time_parseDayOfYear,\n L: d3_time_parseMilliseconds,\n m: d3_time_parseMonthNumber,\n M: d3_time_parseMinutes,\n p: d3_time_parseAmPm,\n S: d3_time_parseSeconds,\n U: d3_time_parseWeekNumberSunday,\n w: d3_time_parseWeekdayNumber,\n W: d3_time_parseWeekNumberMonday,\n x: d3_time_parseLocaleDate,\n X: d3_time_parseLocaleTime,\n y: d3_time_parseYear,\n Y: d3_time_parseFullYear,\n Z: d3_time_parseZone,\n \"%\": d3_time_parseLiteralPercent\n };\n function d3_time_parseWeekdayAbbrev(date, string, i) {\n d3_time_dayAbbrevRe.lastIndex = 0;\n var n = d3_time_dayAbbrevRe.exec(string.slice(i));\n return n ? (date.w = d3_time_dayAbbrevLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;\n }\n function d3_time_parseWeekday(date, string, i) {\n d3_time_dayRe.lastIndex = 0;\n var n = d3_time_dayRe.exec(string.slice(i));\n return n ? (date.w = d3_time_dayLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;\n }\n function d3_time_parseMonthAbbrev(date, string, i) {\n d3_time_monthAbbrevRe.lastIndex = 0;\n var n = d3_time_monthAbbrevRe.exec(string.slice(i));\n return n ? (date.m = d3_time_monthAbbrevLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;\n }\n function d3_time_parseMonth(date, string, i) {\n d3_time_monthRe.lastIndex = 0;\n var n = d3_time_monthRe.exec(string.slice(i));\n return n ? (date.m = d3_time_monthLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;\n }\n function d3_time_parseLocaleFull(date, string, i) {\n return d3_time_parse(date, d3_time_formats.c.toString(), string, i);\n }\n function d3_time_parseLocaleDate(date, string, i) {\n return d3_time_parse(date, d3_time_formats.x.toString(), string, i);\n }\n function d3_time_parseLocaleTime(date, string, i) {\n return d3_time_parse(date, d3_time_formats.X.toString(), string, i);\n }\n function d3_time_parseAmPm(date, string, i) {\n var n = d3_time_periodLookup.get(string.slice(i, i += 2).toLowerCase());\n return n == null ? -1 : (date.p = n, i);\n }\n return d3_time_format;\n }\n var d3_time_formatPads = {\n \"-\": \"\",\n _: \" \",\n \"0\": \"0\"\n }, d3_time_numberRe = /^\\s*\\d+/, d3_time_percentRe = /^%/;\n function d3_time_formatPad(value, fill, width) {\n var sign = value < 0 ? \"-\" : \"\", string = (sign ? -value : value) + \"\", length = string.length;\n return sign + (length < width ? new Array(width - length + 1).join(fill) + string : string);\n }\n function d3_time_formatRe(names) {\n return new RegExp(\"^(?:\" + names.map(d3.requote).join(\"|\") + \")\", \"i\");\n }\n function d3_time_formatLookup(names) {\n var map = new d3_Map(), i = -1, n = names.length;\n while (++i < n) map.set(names[i].toLowerCase(), i);\n return map;\n }\n function d3_time_parseWeekdayNumber(date, string, i) {\n d3_time_numberRe.lastIndex = 0;\n var n = d3_time_numberRe.exec(string.slice(i, i + 1));\n return n ? (date.w = +n[0], i + n[0].length) : -1;\n }\n function d3_time_parseWeekNumberSunday(date, string, i) {\n d3_time_numberRe.lastIndex = 0;\n var n = d3_time_numberRe.exec(string.slice(i));\n return n ? (date.U = +n[0], i + n[0].length) : -1;\n }\n function d3_time_parseWeekNumberMonday(date, string, i) {\n d3_time_numberRe.lastIndex = 0;\n var n = d3_time_numberRe.exec(string.slice(i));\n return n ? (date.W = +n[0], i + n[0].length) : -1;\n }\n function d3_time_parseFullYear(date, string, i) {\n d3_time_numberRe.lastIndex = 0;\n var n = d3_time_numberRe.exec(string.slice(i, i + 4));\n return n ? (date.y = +n[0], i + n[0].length) : -1;\n }\n function d3_time_parseYear(date, string, i) {\n d3_time_numberRe.lastIndex = 0;\n var n = d3_time_numberRe.exec(string.slice(i, i + 2));\n return n ? (date.y = d3_time_expandYear(+n[0]), i + n[0].length) : -1;\n }\n function d3_time_parseZone(date, string, i) {\n return /^[+-]\\d{4}$/.test(string = string.slice(i, i + 5)) ? (date.Z = -string, \n i + 5) : -1;\n }\n function d3_time_expandYear(d) {\n return d + (d > 68 ? 1900 : 2e3);\n }\n function d3_time_parseMonthNumber(date, string, i) {\n d3_time_numberRe.lastIndex = 0;\n var n = d3_time_numberRe.exec(string.slice(i, i + 2));\n return n ? (date.m = n[0] - 1, i + n[0].length) : -1;\n }\n function d3_time_parseDay(date, string, i) {\n d3_time_numberRe.lastIndex = 0;\n var n = d3_time_numberRe.exec(string.slice(i, i + 2));\n return n ? (date.d = +n[0], i + n[0].length) : -1;\n }\n function d3_time_parseDayOfYear(date, string, i) {\n d3_time_numberRe.lastIndex = 0;\n var n = d3_time_numberRe.exec(string.slice(i, i + 3));\n return n ? (date.j = +n[0], i + n[0].length) : -1;\n }\n function d3_time_parseHour24(date, string, i) {\n d3_time_numberRe.lastIndex = 0;\n var n = d3_time_numberRe.exec(string.slice(i, i + 2));\n return n ? (date.H = +n[0], i + n[0].length) : -1;\n }\n function d3_time_parseMinutes(date, string, i) {\n d3_time_numberRe.lastIndex = 0;\n var n = d3_time_numberRe.exec(string.slice(i, i + 2));\n return n ? (date.M = +n[0], i + n[0].length) : -1;\n }\n function d3_time_parseSeconds(date, string, i) {\n d3_time_numberRe.lastIndex = 0;\n var n = d3_time_numberRe.exec(string.slice(i, i + 2));\n return n ? (date.S = +n[0], i + n[0].length) : -1;\n }\n function d3_time_parseMilliseconds(date, string, i) {\n d3_time_numberRe.lastIndex = 0;\n var n = d3_time_numberRe.exec(string.slice(i, i + 3));\n return n ? (date.L = +n[0], i + n[0].length) : -1;\n }\n function d3_time_zone(d) {\n var z = d.getTimezoneOffset(), zs = z > 0 ? \"-\" : \"+\", zh = abs(z) / 60 | 0, zm = abs(z) % 60;\n return zs + d3_time_formatPad(zh, \"0\", 2) + d3_time_formatPad(zm, \"0\", 2);\n }\n function d3_time_parseLiteralPercent(date, string, i) {\n d3_time_percentRe.lastIndex = 0;\n var n = d3_time_percentRe.exec(string.slice(i, i + 1));\n return n ? i + n[0].length : -1;\n }\n function d3_time_formatMulti(formats) {\n var n = formats.length, i = -1;\n while (++i < n) formats[i][0] = this(formats[i][0]);\n return function(date) {\n var i = 0, f = formats[i];\n while (!f[1](date)) f = formats[++i];\n return f[0](date);\n };\n }\n d3.locale = function(locale) {\n return {\n numberFormat: d3_locale_numberFormat(locale),\n timeFormat: d3_locale_timeFormat(locale)\n };\n };\n var d3_locale_enUS = d3.locale({\n decimal: \".\",\n thousands: \",\",\n grouping: [ 3 ],\n currency: [ \"$\", \"\" ],\n dateTime: \"%a %b %e %X %Y\",\n date: \"%m/%d/%Y\",\n time: \"%H:%M:%S\",\n periods: [ \"AM\", \"PM\" ],\n days: [ \"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\", \"Thursday\", \"Friday\", \"Saturday\" ],\n shortDays: [ \"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\" ],\n months: [ \"January\", \"February\", \"March\", \"April\", \"May\", \"June\", \"July\", \"August\", \"September\", \"October\", \"November\", \"December\" ],\n shortMonths: [ \"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\" ]\n });\n d3.format = d3_locale_enUS.numberFormat;\n d3.geo = {};\n function d3_adder() {}\n d3_adder.prototype = {\n s: 0,\n t: 0,\n add: function(y) {\n d3_adderSum(y, this.t, d3_adderTemp);\n d3_adderSum(d3_adderTemp.s, this.s, this);\n if (this.s) this.t += d3_adderTemp.t; else this.s = d3_adderTemp.t;\n },\n reset: function() {\n this.s = this.t = 0;\n },\n valueOf: function() {\n return this.s;\n }\n };\n var d3_adderTemp = new d3_adder();\n function d3_adderSum(a, b, o) {\n var x = o.s = a + b, bv = x - a, av = x - bv;\n o.t = a - av + (b - bv);\n }\n d3.geo.stream = function(object, listener) {\n if (object && d3_geo_streamObjectType.hasOwnProperty(object.type)) {\n d3_geo_streamObjectType[object.type](object, listener);\n } else {\n d3_geo_streamGeometry(object, listener);\n }\n };\n function d3_geo_streamGeometry(geometry, listener) {\n if (geometry && d3_geo_streamGeometryType.hasOwnProperty(geometry.type)) {\n d3_geo_streamGeometryType[geometry.type](geometry, listener);\n }\n }\n var d3_geo_streamObjectType = {\n Feature: function(feature, listener) {\n d3_geo_streamGeometry(feature.geometry, listener);\n },\n FeatureCollection: function(object, listener) {\n var features = object.features, i = -1, n = features.length;\n while (++i < n) d3_geo_streamGeometry(features[i].geometry, listener);\n }\n };\n var d3_geo_streamGeometryType = {\n Sphere: function(object, listener) {\n listener.sphere();\n },\n Point: function(object, listener) {\n object = object.coordinates;\n listener.point(object[0], object[1], object[2]);\n },\n MultiPoint: function(object, listener) {\n var coordinates = object.coordinates, i = -1, n = coordinates.length;\n while (++i < n) object = coordinates[i], listener.point(object[0], object[1], object[2]);\n },\n LineString: function(object, listener) {\n d3_geo_streamLine(object.coordinates, listener, 0);\n },\n MultiLineString: function(object, listener) {\n var coordinates = object.coordinates, i = -1, n = coordinates.length;\n while (++i < n) d3_geo_streamLine(coordinates[i], listener, 0);\n },\n Polygon: function(object, listener) {\n d3_geo_streamPolygon(object.coordinates, listener);\n },\n MultiPolygon: function(object, listener) {\n var coordinates = object.coordinates, i = -1, n = coordinates.length;\n while (++i < n) d3_geo_streamPolygon(coordinates[i], listener);\n },\n GeometryCollection: function(object, listener) {\n var geometries = object.geometries, i = -1, n = geometries.length;\n while (++i < n) d3_geo_streamGeometry(geometries[i], listener);\n }\n };\n function d3_geo_streamLine(coordinates, listener, closed) {\n var i = -1, n = coordinates.length - closed, coordinate;\n listener.lineStart();\n while (++i < n) coordinate = coordinates[i], listener.point(coordinate[0], coordinate[1], coordinate[2]);\n listener.lineEnd();\n }\n function d3_geo_streamPolygon(coordinates, listener) {\n var i = -1, n = coordinates.length;\n listener.polygonStart();\n while (++i < n) d3_geo_streamLine(coordinates[i], listener, 1);\n listener.polygonEnd();\n }\n d3.geo.area = function(object) {\n d3_geo_areaSum = 0;\n d3.geo.stream(object, d3_geo_area);\n return d3_geo_areaSum;\n };\n var d3_geo_areaSum, d3_geo_areaRingSum = new d3_adder();\n var d3_geo_area = {\n sphere: function() {\n d3_geo_areaSum += 4 * π;\n },\n point: d3_noop,\n lineStart: d3_noop,\n lineEnd: d3_noop,\n polygonStart: function() {\n d3_geo_areaRingSum.reset();\n d3_geo_area.lineStart = d3_geo_areaRingStart;\n },\n polygonEnd: function() {\n var area = 2 * d3_geo_areaRingSum;\n d3_geo_areaSum += area < 0 ? 4 * π + area : area;\n d3_geo_area.lineStart = d3_geo_area.lineEnd = d3_geo_area.point = d3_noop;\n }\n };\n function d3_geo_areaRingStart() {\n var λ00, φ00, λ0, cosφ0, sinφ0;\n d3_geo_area.point = function(λ, φ) {\n d3_geo_area.point = nextPoint;\n λ0 = (λ00 = λ) * d3_radians, cosφ0 = Math.cos(φ = (φ00 = φ) * d3_radians / 2 + π / 4), \n sinφ0 = Math.sin(φ);\n };\n function nextPoint(λ, φ) {\n λ *= d3_radians;\n φ = φ * d3_radians / 2 + π / 4;\n var dλ = λ - λ0, sdλ = dλ >= 0 ? 1 : -1, adλ = sdλ * dλ, cosφ = Math.cos(φ), sinφ = Math.sin(φ), k = sinφ0 * sinφ, u = cosφ0 * cosφ + k * Math.cos(adλ), v = k * sdλ * Math.sin(adλ);\n d3_geo_areaRingSum.add(Math.atan2(v, u));\n λ0 = λ, cosφ0 = cosφ, sinφ0 = sinφ;\n }\n d3_geo_area.lineEnd = function() {\n nextPoint(λ00, φ00);\n };\n }\n function d3_geo_cartesian(spherical) {\n var λ = spherical[0], φ = spherical[1], cosφ = Math.cos(φ);\n return [ cosφ * Math.cos(λ), cosφ * Math.sin(λ), Math.sin(φ) ];\n }\n function d3_geo_cartesianDot(a, b) {\n return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];\n }\n function d3_geo_cartesianCross(a, b) {\n return [ a[1] * b[2] - a[2] * b[1], a[2] * b[0] - a[0] * b[2], a[0] * b[1] - a[1] * b[0] ];\n }\n function d3_geo_cartesianAdd(a, b) {\n a[0] += b[0];\n a[1] += b[1];\n a[2] += b[2];\n }\n function d3_geo_cartesianScale(vector, k) {\n return [ vector[0] * k, vector[1] * k, vector[2] * k ];\n }\n function d3_geo_cartesianNormalize(d) {\n var l = Math.sqrt(d[0] * d[0] + d[1] * d[1] + d[2] * d[2]);\n d[0] /= l;\n d[1] /= l;\n d[2] /= l;\n }\n function d3_geo_spherical(cartesian) {\n return [ Math.atan2(cartesian[1], cartesian[0]), d3_asin(cartesian[2]) ];\n }\n function d3_geo_sphericalEqual(a, b) {\n return abs(a[0] - b[0]) < ε && abs(a[1] - b[1]) < ε;\n }\n d3.geo.bounds = function() {\n var λ0, φ0, λ1, φ1, λ_, λ__, φ__, p0, dλSum, ranges, range;\n var bound = {\n point: point,\n lineStart: lineStart,\n lineEnd: lineEnd,\n polygonStart: function() {\n bound.point = ringPoint;\n bound.lineStart = ringStart;\n bound.lineEnd = ringEnd;\n dλSum = 0;\n d3_geo_area.polygonStart();\n },\n polygonEnd: function() {\n d3_geo_area.polygonEnd();\n bound.point = point;\n bound.lineStart = lineStart;\n bound.lineEnd = lineEnd;\n if (d3_geo_areaRingSum < 0) λ0 = -(λ1 = 180), φ0 = -(φ1 = 90); else if (dλSum > ε) φ1 = 90; else if (dλSum < -ε) φ0 = -90;\n range[0] = λ0, range[1] = λ1;\n }\n };\n function point(λ, φ) {\n ranges.push(range = [ λ0 = λ, λ1 = λ ]);\n if (φ < φ0) φ0 = φ;\n if (φ > φ1) φ1 = φ;\n }\n function linePoint(λ, φ) {\n var p = d3_geo_cartesian([ λ * d3_radians, φ * d3_radians ]);\n if (p0) {\n var normal = d3_geo_cartesianCross(p0, p), equatorial = [ normal[1], -normal[0], 0 ], inflection = d3_geo_cartesianCross(equatorial, normal);\n d3_geo_cartesianNormalize(inflection);\n inflection = d3_geo_spherical(inflection);\n var dλ = λ - λ_, s = dλ > 0 ? 1 : -1, λi = inflection[0] * d3_degrees * s, antimeridian = abs(dλ) > 180;\n if (antimeridian ^ (s * λ_ < λi && λi < s * λ)) {\n var φi = inflection[1] * d3_degrees;\n if (φi > φ1) φ1 = φi;\n } else if (λi = (λi + 360) % 360 - 180, antimeridian ^ (s * λ_ < λi && λi < s * λ)) {\n var φi = -inflection[1] * d3_degrees;\n if (φi < φ0) φ0 = φi;\n } else {\n if (φ < φ0) φ0 = φ;\n if (φ > φ1) φ1 = φ;\n }\n if (antimeridian) {\n if (λ < λ_) {\n if (angle(λ0, λ) > angle(λ0, λ1)) λ1 = λ;\n } else {\n if (angle(λ, λ1) > angle(λ0, λ1)) λ0 = λ;\n }\n } else {\n if (λ1 >= λ0) {\n if (λ < λ0) λ0 = λ;\n if (λ > λ1) λ1 = λ;\n } else {\n if (λ > λ_) {\n if (angle(λ0, λ) > angle(λ0, λ1)) λ1 = λ;\n } else {\n if (angle(λ, λ1) > angle(λ0, λ1)) λ0 = λ;\n }\n }\n }\n } else {\n point(λ, φ);\n }\n p0 = p, λ_ = λ;\n }\n function lineStart() {\n bound.point = linePoint;\n }\n function lineEnd() {\n range[0] = λ0, range[1] = λ1;\n bound.point = point;\n p0 = null;\n }\n function ringPoint(λ, φ) {\n if (p0) {\n var dλ = λ - λ_;\n dλSum += abs(dλ) > 180 ? dλ + (dλ > 0 ? 360 : -360) : dλ;\n } else λ__ = λ, φ__ = φ;\n d3_geo_area.point(λ, φ);\n linePoint(λ, φ);\n }\n function ringStart() {\n d3_geo_area.lineStart();\n }\n function ringEnd() {\n ringPoint(λ__, φ__);\n d3_geo_area.lineEnd();\n if (abs(dλSum) > ε) λ0 = -(λ1 = 180);\n range[0] = λ0, range[1] = λ1;\n p0 = null;\n }\n function angle(λ0, λ1) {\n return (λ1 -= λ0) < 0 ? λ1 + 360 : λ1;\n }\n function compareRanges(a, b) {\n return a[0] - b[0];\n }\n function withinRange(x, range) {\n return range[0] <= range[1] ? range[0] <= x && x <= range[1] : x < range[0] || range[1] < x;\n }\n return function(feature) {\n φ1 = λ1 = -(λ0 = φ0 = Infinity);\n ranges = [];\n d3.geo.stream(feature, bound);\n var n = ranges.length;\n if (n) {\n ranges.sort(compareRanges);\n for (var i = 1, a = ranges[0], b, merged = [ a ]; i < n; ++i) {\n b = ranges[i];\n if (withinRange(b[0], a) || withinRange(b[1], a)) {\n if (angle(a[0], b[1]) > angle(a[0], a[1])) a[1] = b[1];\n if (angle(b[0], a[1]) > angle(a[0], a[1])) a[0] = b[0];\n } else {\n merged.push(a = b);\n }\n }\n var best = -Infinity, dλ;\n for (var n = merged.length - 1, i = 0, a = merged[n], b; i <= n; a = b, ++i) {\n b = merged[i];\n if ((dλ = angle(a[1], b[0])) > best) best = dλ, λ0 = b[0], λ1 = a[1];\n }\n }\n ranges = range = null;\n return λ0 === Infinity || φ0 === Infinity ? [ [ NaN, NaN ], [ NaN, NaN ] ] : [ [ λ0, φ0 ], [ λ1, φ1 ] ];\n };\n }();\n d3.geo.centroid = function(object) {\n d3_geo_centroidW0 = d3_geo_centroidW1 = d3_geo_centroidX0 = d3_geo_centroidY0 = d3_geo_centroidZ0 = d3_geo_centroidX1 = d3_geo_centroidY1 = d3_geo_centroidZ1 = d3_geo_centroidX2 = d3_geo_centroidY2 = d3_geo_centroidZ2 = 0;\n d3.geo.stream(object, d3_geo_centroid);\n var x = d3_geo_centroidX2, y = d3_geo_centroidY2, z = d3_geo_centroidZ2, m = x * x + y * y + z * z;\n if (m < ε2) {\n x = d3_geo_centroidX1, y = d3_geo_centroidY1, z = d3_geo_centroidZ1;\n if (d3_geo_centroidW1 < ε) x = d3_geo_centroidX0, y = d3_geo_centroidY0, z = d3_geo_centroidZ0;\n m = x * x + y * y + z * z;\n if (m < ε2) return [ NaN, NaN ];\n }\n return [ Math.atan2(y, x) * d3_degrees, d3_asin(z / Math.sqrt(m)) * d3_degrees ];\n };\n var d3_geo_centroidW0, d3_geo_centroidW1, d3_geo_centroidX0, d3_geo_centroidY0, d3_geo_centroidZ0, d3_geo_centroidX1, d3_geo_centroidY1, d3_geo_centroidZ1, d3_geo_centroidX2, d3_geo_centroidY2, d3_geo_centroidZ2;\n var d3_geo_centroid = {\n sphere: d3_noop,\n point: d3_geo_centroidPoint,\n lineStart: d3_geo_centroidLineStart,\n lineEnd: d3_geo_centroidLineEnd,\n polygonStart: function() {\n d3_geo_centroid.lineStart = d3_geo_centroidRingStart;\n },\n polygonEnd: function() {\n d3_geo_centroid.lineStart = d3_geo_centroidLineStart;\n }\n };\n function d3_geo_centroidPoint(λ, φ) {\n λ *= d3_radians;\n var cosφ = Math.cos(φ *= d3_radians);\n d3_geo_centroidPointXYZ(cosφ * Math.cos(λ), cosφ * Math.sin(λ), Math.sin(φ));\n }\n function d3_geo_centroidPointXYZ(x, y, z) {\n ++d3_geo_centroidW0;\n d3_geo_centroidX0 += (x - d3_geo_centroidX0) / d3_geo_centroidW0;\n d3_geo_centroidY0 += (y - d3_geo_centroidY0) / d3_geo_centroidW0;\n d3_geo_centroidZ0 += (z - d3_geo_centroidZ0) / d3_geo_centroidW0;\n }\n function d3_geo_centroidLineStart() {\n var x0, y0, z0;\n d3_geo_centroid.point = function(λ, φ) {\n λ *= d3_radians;\n var cosφ = Math.cos(φ *= d3_radians);\n x0 = cosφ * Math.cos(λ);\n y0 = cosφ * Math.sin(λ);\n z0 = Math.sin(φ);\n d3_geo_centroid.point = nextPoint;\n d3_geo_centroidPointXYZ(x0, y0, z0);\n };\n function nextPoint(λ, φ) {\n λ *= d3_radians;\n var cosφ = Math.cos(φ *= d3_radians), x = cosφ * Math.cos(λ), y = cosφ * Math.sin(λ), z = Math.sin(φ), w = Math.atan2(Math.sqrt((w = y0 * z - z0 * y) * w + (w = z0 * x - x0 * z) * w + (w = x0 * y - y0 * x) * w), x0 * x + y0 * y + z0 * z);\n d3_geo_centroidW1 += w;\n d3_geo_centroidX1 += w * (x0 + (x0 = x));\n d3_geo_centroidY1 += w * (y0 + (y0 = y));\n d3_geo_centroidZ1 += w * (z0 + (z0 = z));\n d3_geo_centroidPointXYZ(x0, y0, z0);\n }\n }\n function d3_geo_centroidLineEnd() {\n d3_geo_centroid.point = d3_geo_centroidPoint;\n }\n function d3_geo_centroidRingStart() {\n var λ00, φ00, x0, y0, z0;\n d3_geo_centroid.point = function(λ, φ) {\n λ00 = λ, φ00 = φ;\n d3_geo_centroid.point = nextPoint;\n λ *= d3_radians;\n var cosφ = Math.cos(φ *= d3_radians);\n x0 = cosφ * Math.cos(λ);\n y0 = cosφ * Math.sin(λ);\n z0 = Math.sin(φ);\n d3_geo_centroidPointXYZ(x0, y0, z0);\n };\n d3_geo_centroid.lineEnd = function() {\n nextPoint(λ00, φ00);\n d3_geo_centroid.lineEnd = d3_geo_centroidLineEnd;\n d3_geo_centroid.point = d3_geo_centroidPoint;\n };\n function nextPoint(λ, φ) {\n λ *= d3_radians;\n var cosφ = Math.cos(φ *= d3_radians), x = cosφ * Math.cos(λ), y = cosφ * Math.sin(λ), z = Math.sin(φ), cx = y0 * z - z0 * y, cy = z0 * x - x0 * z, cz = x0 * y - y0 * x, m = Math.sqrt(cx * cx + cy * cy + cz * cz), u = x0 * x + y0 * y + z0 * z, v = m && -d3_acos(u) / m, w = Math.atan2(m, u);\n d3_geo_centroidX2 += v * cx;\n d3_geo_centroidY2 += v * cy;\n d3_geo_centroidZ2 += v * cz;\n d3_geo_centroidW1 += w;\n d3_geo_centroidX1 += w * (x0 + (x0 = x));\n d3_geo_centroidY1 += w * (y0 + (y0 = y));\n d3_geo_centroidZ1 += w * (z0 + (z0 = z));\n d3_geo_centroidPointXYZ(x0, y0, z0);\n }\n }\n function d3_geo_compose(a, b) {\n function compose(x, y) {\n return x = a(x, y), b(x[0], x[1]);\n }\n if (a.invert && b.invert) compose.invert = function(x, y) {\n return x = b.invert(x, y), x && a.invert(x[0], x[1]);\n };\n return compose;\n }\n function d3_true() {\n return true;\n }\n function d3_geo_clipPolygon(segments, compare, clipStartInside, interpolate, listener) {\n var subject = [], clip = [];\n segments.forEach(function(segment) {\n if ((n = segment.length - 1) <= 0) return;\n var n, p0 = segment[0], p1 = segment[n];\n if (d3_geo_sphericalEqual(p0, p1)) {\n listener.lineStart();\n for (var i = 0; i < n; ++i) listener.point((p0 = segment[i])[0], p0[1]);\n listener.lineEnd();\n return;\n }\n var a = new d3_geo_clipPolygonIntersection(p0, segment, null, true), b = new d3_geo_clipPolygonIntersection(p0, null, a, false);\n a.o = b;\n subject.push(a);\n clip.push(b);\n a = new d3_geo_clipPolygonIntersection(p1, segment, null, false);\n b = new d3_geo_clipPolygonIntersection(p1, null, a, true);\n a.o = b;\n subject.push(a);\n clip.push(b);\n });\n clip.sort(compare);\n d3_geo_clipPolygonLinkCircular(subject);\n d3_geo_clipPolygonLinkCircular(clip);\n if (!subject.length) return;\n for (var i = 0, entry = clipStartInside, n = clip.length; i < n; ++i) {\n clip[i].e = entry = !entry;\n }\n var start = subject[0], points, point;\n while (1) {\n var current = start, isSubject = true;\n while (current.v) if ((current = current.n) === start) return;\n points = current.z;\n listener.lineStart();\n do {\n current.v = current.o.v = true;\n if (current.e) {\n if (isSubject) {\n for (var i = 0, n = points.length; i < n; ++i) listener.point((point = points[i])[0], point[1]);\n } else {\n interpolate(current.x, current.n.x, 1, listener);\n }\n current = current.n;\n } else {\n if (isSubject) {\n points = current.p.z;\n for (var i = points.length - 1; i >= 0; --i) listener.point((point = points[i])[0], point[1]);\n } else {\n interpolate(current.x, current.p.x, -1, listener);\n }\n current = current.p;\n }\n current = current.o;\n points = current.z;\n isSubject = !isSubject;\n } while (!current.v);\n listener.lineEnd();\n }\n }\n function d3_geo_clipPolygonLinkCircular(array) {\n if (!(n = array.length)) return;\n var n, i = 0, a = array[0], b;\n while (++i < n) {\n a.n = b = array[i];\n b.p = a;\n a = b;\n }\n a.n = b = array[0];\n b.p = a;\n }\n function d3_geo_clipPolygonIntersection(point, points, other, entry) {\n this.x = point;\n this.z = points;\n this.o = other;\n this.e = entry;\n this.v = false;\n this.n = this.p = null;\n }\n function d3_geo_clip(pointVisible, clipLine, interpolate, clipStart) {\n return function(rotate, listener) {\n var line = clipLine(listener), rotatedClipStart = rotate.invert(clipStart[0], clipStart[1]);\n var clip = {\n point: point,\n lineStart: lineStart,\n lineEnd: lineEnd,\n polygonStart: function() {\n clip.point = pointRing;\n clip.lineStart = ringStart;\n clip.lineEnd = ringEnd;\n segments = [];\n polygon = [];\n },\n polygonEnd: function() {\n clip.point = point;\n clip.lineStart = lineStart;\n clip.lineEnd = lineEnd;\n segments = d3.merge(segments);\n var clipStartInside = d3_geo_pointInPolygon(rotatedClipStart, polygon);\n if (segments.length) {\n if (!polygonStarted) listener.polygonStart(), polygonStarted = true;\n d3_geo_clipPolygon(segments, d3_geo_clipSort, clipStartInside, interpolate, listener);\n } else if (clipStartInside) {\n if (!polygonStarted) listener.polygonStart(), polygonStarted = true;\n listener.lineStart();\n interpolate(null, null, 1, listener);\n listener.lineEnd();\n }\n if (polygonStarted) listener.polygonEnd(), polygonStarted = false;\n segments = polygon = null;\n },\n sphere: function() {\n listener.polygonStart();\n listener.lineStart();\n interpolate(null, null, 1, listener);\n listener.lineEnd();\n listener.polygonEnd();\n }\n };\n function point(λ, φ) {\n var point = rotate(λ, φ);\n if (pointVisible(λ = point[0], φ = point[1])) listener.point(λ, φ);\n }\n function pointLine(λ, φ) {\n var point = rotate(λ, φ);\n line.point(point[0], point[1]);\n }\n function lineStart() {\n clip.point = pointLine;\n line.lineStart();\n }\n function lineEnd() {\n clip.point = point;\n line.lineEnd();\n }\n var segments;\n var buffer = d3_geo_clipBufferListener(), ringListener = clipLine(buffer), polygonStarted = false, polygon, ring;\n function pointRing(λ, φ) {\n ring.push([ λ, φ ]);\n var point = rotate(λ, φ);\n ringListener.point(point[0], point[1]);\n }\n function ringStart() {\n ringListener.lineStart();\n ring = [];\n }\n function ringEnd() {\n pointRing(ring[0][0], ring[0][1]);\n ringListener.lineEnd();\n var clean = ringListener.clean(), ringSegments = buffer.buffer(), segment, n = ringSegments.length;\n ring.pop();\n polygon.push(ring);\n ring = null;\n if (!n) return;\n if (clean & 1) {\n segment = ringSegments[0];\n var n = segment.length - 1, i = -1, point;\n if (n > 0) {\n if (!polygonStarted) listener.polygonStart(), polygonStarted = true;\n listener.lineStart();\n while (++i < n) listener.point((point = segment[i])[0], point[1]);\n listener.lineEnd();\n }\n return;\n }\n if (n > 1 && clean & 2) ringSegments.push(ringSegments.pop().concat(ringSegments.shift()));\n segments.push(ringSegments.filter(d3_geo_clipSegmentLength1));\n }\n return clip;\n };\n }\n function d3_geo_clipSegmentLength1(segment) {\n return segment.length > 1;\n }\n function d3_geo_clipBufferListener() {\n var lines = [], line;\n return {\n lineStart: function() {\n lines.push(line = []);\n },\n point: function(λ, φ) {\n line.push([ λ, φ ]);\n },\n lineEnd: d3_noop,\n buffer: function() {\n var buffer = lines;\n lines = [];\n line = null;\n return buffer;\n },\n rejoin: function() {\n if (lines.length > 1) lines.push(lines.pop().concat(lines.shift()));\n }\n };\n }\n function d3_geo_clipSort(a, b) {\n return ((a = a.x)[0] < 0 ? a[1] - halfπ - ε : halfπ - a[1]) - ((b = b.x)[0] < 0 ? b[1] - halfπ - ε : halfπ - b[1]);\n }\n var d3_geo_clipAntimeridian = d3_geo_clip(d3_true, d3_geo_clipAntimeridianLine, d3_geo_clipAntimeridianInterpolate, [ -π, -π / 2 ]);\n function d3_geo_clipAntimeridianLine(listener) {\n var λ0 = NaN, φ0 = NaN, sλ0 = NaN, clean;\n return {\n lineStart: function() {\n listener.lineStart();\n clean = 1;\n },\n point: function(λ1, φ1) {\n var sλ1 = λ1 > 0 ? π : -π, dλ = abs(λ1 - λ0);\n if (abs(dλ - π) < ε) {\n listener.point(λ0, φ0 = (φ0 + φ1) / 2 > 0 ? halfπ : -halfπ);\n listener.point(sλ0, φ0);\n listener.lineEnd();\n listener.lineStart();\n listener.point(sλ1, φ0);\n listener.point(λ1, φ0);\n clean = 0;\n } else if (sλ0 !== sλ1 && dλ >= π) {\n if (abs(λ0 - sλ0) < ε) λ0 -= sλ0 * ε;\n if (abs(λ1 - sλ1) < ε) λ1 -= sλ1 * ε;\n φ0 = d3_geo_clipAntimeridianIntersect(λ0, φ0, λ1, φ1);\n listener.point(sλ0, φ0);\n listener.lineEnd();\n listener.lineStart();\n listener.point(sλ1, φ0);\n clean = 0;\n }\n listener.point(λ0 = λ1, φ0 = φ1);\n sλ0 = sλ1;\n },\n lineEnd: function() {\n listener.lineEnd();\n λ0 = φ0 = NaN;\n },\n clean: function() {\n return 2 - clean;\n }\n };\n }\n function d3_geo_clipAntimeridianIntersect(λ0, φ0, λ1, φ1) {\n var cosφ0, cosφ1, sinλ0_λ1 = Math.sin(λ0 - λ1);\n return abs(sinλ0_λ1) > ε ? Math.atan((Math.sin(φ0) * (cosφ1 = Math.cos(φ1)) * Math.sin(λ1) - Math.sin(φ1) * (cosφ0 = Math.cos(φ0)) * Math.sin(λ0)) / (cosφ0 * cosφ1 * sinλ0_λ1)) : (φ0 + φ1) / 2;\n }\n function d3_geo_clipAntimeridianInterpolate(from, to, direction, listener) {\n var φ;\n if (from == null) {\n φ = direction * halfπ;\n listener.point(-π, φ);\n listener.point(0, φ);\n listener.point(π, φ);\n listener.point(π, 0);\n listener.point(π, -φ);\n listener.point(0, -φ);\n listener.point(-π, -φ);\n listener.point(-π, 0);\n listener.point(-π, φ);\n } else if (abs(from[0] - to[0]) > ε) {\n var s = from[0] < to[0] ? π : -π;\n φ = direction * s / 2;\n listener.point(-s, φ);\n listener.point(0, φ);\n listener.point(s, φ);\n } else {\n listener.point(to[0], to[1]);\n }\n }\n function d3_geo_pointInPolygon(point, polygon) {\n var meridian = point[0], parallel = point[1], meridianNormal = [ Math.sin(meridian), -Math.cos(meridian), 0 ], polarAngle = 0, winding = 0;\n d3_geo_areaRingSum.reset();\n for (var i = 0, n = polygon.length; i < n; ++i) {\n var ring = polygon[i], m = ring.length;\n if (!m) continue;\n var point0 = ring[0], λ0 = point0[0], φ0 = point0[1] / 2 + π / 4, sinφ0 = Math.sin(φ0), cosφ0 = Math.cos(φ0), j = 1;\n while (true) {\n if (j === m) j = 0;\n point = ring[j];\n var λ = point[0], φ = point[1] / 2 + π / 4, sinφ = Math.sin(φ), cosφ = Math.cos(φ), dλ = λ - λ0, sdλ = dλ >= 0 ? 1 : -1, adλ = sdλ * dλ, antimeridian = adλ > π, k = sinφ0 * sinφ;\n d3_geo_areaRingSum.add(Math.atan2(k * sdλ * Math.sin(adλ), cosφ0 * cosφ + k * Math.cos(adλ)));\n polarAngle += antimeridian ? dλ + sdλ * τ : dλ;\n if (antimeridian ^ λ0 >= meridian ^ λ >= meridian) {\n var arc = d3_geo_cartesianCross(d3_geo_cartesian(point0), d3_geo_cartesian(point));\n d3_geo_cartesianNormalize(arc);\n var intersection = d3_geo_cartesianCross(meridianNormal, arc);\n d3_geo_cartesianNormalize(intersection);\n var φarc = (antimeridian ^ dλ >= 0 ? -1 : 1) * d3_asin(intersection[2]);\n if (parallel > φarc || parallel === φarc && (arc[0] || arc[1])) {\n winding += antimeridian ^ dλ >= 0 ? 1 : -1;\n }\n }\n if (!j++) break;\n λ0 = λ, sinφ0 = sinφ, cosφ0 = cosφ, point0 = point;\n }\n }\n return (polarAngle < -ε || polarAngle < ε && d3_geo_areaRingSum < -ε) ^ winding & 1;\n }\n function d3_geo_clipCircle(radius) {\n var cr = Math.cos(radius), smallRadius = cr > 0, notHemisphere = abs(cr) > ε, interpolate = d3_geo_circleInterpolate(radius, 6 * d3_radians);\n return d3_geo_clip(visible, clipLine, interpolate, smallRadius ? [ 0, -radius ] : [ -π, radius - π ]);\n function visible(λ, φ) {\n return Math.cos(λ) * Math.cos(φ) > cr;\n }\n function clipLine(listener) {\n var point0, c0, v0, v00, clean;\n return {\n lineStart: function() {\n v00 = v0 = false;\n clean = 1;\n },\n point: function(λ, φ) {\n var point1 = [ λ, φ ], point2, v = visible(λ, φ), c = smallRadius ? v ? 0 : code(λ, φ) : v ? code(λ + (λ < 0 ? π : -π), φ) : 0;\n if (!point0 && (v00 = v0 = v)) listener.lineStart();\n if (v !== v0) {\n point2 = intersect(point0, point1);\n if (d3_geo_sphericalEqual(point0, point2) || d3_geo_sphericalEqual(point1, point2)) {\n point1[0] += ε;\n point1[1] += ε;\n v = visible(point1[0], point1[1]);\n }\n }\n if (v !== v0) {\n clean = 0;\n if (v) {\n listener.lineStart();\n point2 = intersect(point1, point0);\n listener.point(point2[0], point2[1]);\n } else {\n point2 = intersect(point0, point1);\n listener.point(point2[0], point2[1]);\n listener.lineEnd();\n }\n point0 = point2;\n } else if (notHemisphere && point0 && smallRadius ^ v) {\n var t;\n if (!(c & c0) && (t = intersect(point1, point0, true))) {\n clean = 0;\n if (smallRadius) {\n listener.lineStart();\n listener.point(t[0][0], t[0][1]);\n listener.point(t[1][0], t[1][1]);\n listener.lineEnd();\n } else {\n listener.point(t[1][0], t[1][1]);\n listener.lineEnd();\n listener.lineStart();\n listener.point(t[0][0], t[0][1]);\n }\n }\n }\n if (v && (!point0 || !d3_geo_sphericalEqual(point0, point1))) {\n listener.point(point1[0], point1[1]);\n }\n point0 = point1, v0 = v, c0 = c;\n },\n lineEnd: function() {\n if (v0) listener.lineEnd();\n point0 = null;\n },\n clean: function() {\n return clean | (v00 && v0) << 1;\n }\n };\n }\n function intersect(a, b, two) {\n var pa = d3_geo_cartesian(a), pb = d3_geo_cartesian(b);\n var n1 = [ 1, 0, 0 ], n2 = d3_geo_cartesianCross(pa, pb), n2n2 = d3_geo_cartesianDot(n2, n2), n1n2 = n2[0], determinant = n2n2 - n1n2 * n1n2;\n if (!determinant) return !two && a;\n var c1 = cr * n2n2 / determinant, c2 = -cr * n1n2 / determinant, n1xn2 = d3_geo_cartesianCross(n1, n2), A = d3_geo_cartesianScale(n1, c1), B = d3_geo_cartesianScale(n2, c2);\n d3_geo_cartesianAdd(A, B);\n var u = n1xn2, w = d3_geo_cartesianDot(A, u), uu = d3_geo_cartesianDot(u, u), t2 = w * w - uu * (d3_geo_cartesianDot(A, A) - 1);\n if (t2 < 0) return;\n var t = Math.sqrt(t2), q = d3_geo_cartesianScale(u, (-w - t) / uu);\n d3_geo_cartesianAdd(q, A);\n q = d3_geo_spherical(q);\n if (!two) return q;\n var λ0 = a[0], λ1 = b[0], φ0 = a[1], φ1 = b[1], z;\n if (λ1 < λ0) z = λ0, λ0 = λ1, λ1 = z;\n var δλ = λ1 - λ0, polar = abs(δλ - π) < ε, meridian = polar || δλ < ε;\n if (!polar && φ1 < φ0) z = φ0, φ0 = φ1, φ1 = z;\n if (meridian ? polar ? φ0 + φ1 > 0 ^ q[1] < (abs(q[0] - λ0) < ε ? φ0 : φ1) : φ0 <= q[1] && q[1] <= φ1 : δλ > π ^ (λ0 <= q[0] && q[0] <= λ1)) {\n var q1 = d3_geo_cartesianScale(u, (-w + t) / uu);\n d3_geo_cartesianAdd(q1, A);\n return [ q, d3_geo_spherical(q1) ];\n }\n }\n function code(λ, φ) {\n var r = smallRadius ? radius : π - radius, code = 0;\n if (λ < -r) code |= 1; else if (λ > r) code |= 2;\n if (φ < -r) code |= 4; else if (φ > r) code |= 8;\n return code;\n }\n }\n function d3_geom_clipLine(x0, y0, x1, y1) {\n return function(line) {\n var a = line.a, b = line.b, ax = a.x, ay = a.y, bx = b.x, by = b.y, t0 = 0, t1 = 1, dx = bx - ax, dy = by - ay, r;\n r = x0 - ax;\n if (!dx && r > 0) return;\n r /= dx;\n if (dx < 0) {\n if (r < t0) return;\n if (r < t1) t1 = r;\n } else if (dx > 0) {\n if (r > t1) return;\n if (r > t0) t0 = r;\n }\n r = x1 - ax;\n if (!dx && r < 0) return;\n r /= dx;\n if (dx < 0) {\n if (r > t1) return;\n if (r > t0) t0 = r;\n } else if (dx > 0) {\n if (r < t0) return;\n if (r < t1) t1 = r;\n }\n r = y0 - ay;\n if (!dy && r > 0) return;\n r /= dy;\n if (dy < 0) {\n if (r < t0) return;\n if (r < t1) t1 = r;\n } else if (dy > 0) {\n if (r > t1) return;\n if (r > t0) t0 = r;\n }\n r = y1 - ay;\n if (!dy && r < 0) return;\n r /= dy;\n if (dy < 0) {\n if (r > t1) return;\n if (r > t0) t0 = r;\n } else if (dy > 0) {\n if (r < t0) return;\n if (r < t1) t1 = r;\n }\n if (t0 > 0) line.a = {\n x: ax + t0 * dx,\n y: ay + t0 * dy\n };\n if (t1 < 1) line.b = {\n x: ax + t1 * dx,\n y: ay + t1 * dy\n };\n return line;\n };\n }\n var d3_geo_clipExtentMAX = 1e9;\n d3.geo.clipExtent = function() {\n var x0, y0, x1, y1, stream, clip, clipExtent = {\n stream: function(output) {\n if (stream) stream.valid = false;\n stream = clip(output);\n stream.valid = true;\n return stream;\n },\n extent: function(_) {\n if (!arguments.length) return [ [ x0, y0 ], [ x1, y1 ] ];\n clip = d3_geo_clipExtent(x0 = +_[0][0], y0 = +_[0][1], x1 = +_[1][0], y1 = +_[1][1]);\n if (stream) stream.valid = false, stream = null;\n return clipExtent;\n }\n };\n return clipExtent.extent([ [ 0, 0 ], [ 960, 500 ] ]);\n };\n function d3_geo_clipExtent(x0, y0, x1, y1) {\n return function(listener) {\n var listener_ = listener, bufferListener = d3_geo_clipBufferListener(), clipLine = d3_geom_clipLine(x0, y0, x1, y1), segments, polygon, ring;\n var clip = {\n point: point,\n lineStart: lineStart,\n lineEnd: lineEnd,\n polygonStart: function() {\n listener = bufferListener;\n segments = [];\n polygon = [];\n clean = true;\n },\n polygonEnd: function() {\n listener = listener_;\n segments = d3.merge(segments);\n var clipStartInside = insidePolygon([ x0, y1 ]), inside = clean && clipStartInside, visible = segments.length;\n if (inside || visible) {\n listener.polygonStart();\n if (inside) {\n listener.lineStart();\n interpolate(null, null, 1, listener);\n listener.lineEnd();\n }\n if (visible) {\n d3_geo_clipPolygon(segments, compare, clipStartInside, interpolate, listener);\n }\n listener.polygonEnd();\n }\n segments = polygon = ring = null;\n }\n };\n function insidePolygon(p) {\n var wn = 0, n = polygon.length, y = p[1];\n for (var i = 0; i < n; ++i) {\n for (var j = 1, v = polygon[i], m = v.length, a = v[0], b; j < m; ++j) {\n b = v[j];\n if (a[1] <= y) {\n if (b[1] > y && d3_cross2d(a, b, p) > 0) ++wn;\n } else {\n if (b[1] <= y && d3_cross2d(a, b, p) < 0) --wn;\n }\n a = b;\n }\n }\n return wn !== 0;\n }\n function interpolate(from, to, direction, listener) {\n var a = 0, a1 = 0;\n if (from == null || (a = corner(from, direction)) !== (a1 = corner(to, direction)) || comparePoints(from, to) < 0 ^ direction > 0) {\n do {\n listener.point(a === 0 || a === 3 ? x0 : x1, a > 1 ? y1 : y0);\n } while ((a = (a + direction + 4) % 4) !== a1);\n } else {\n listener.point(to[0], to[1]);\n }\n }\n function pointVisible(x, y) {\n return x0 <= x && x <= x1 && y0 <= y && y <= y1;\n }\n function point(x, y) {\n if (pointVisible(x, y)) listener.point(x, y);\n }\n var x__, y__, v__, x_, y_, v_, first, clean;\n function lineStart() {\n clip.point = linePoint;\n if (polygon) polygon.push(ring = []);\n first = true;\n v_ = false;\n x_ = y_ = NaN;\n }\n function lineEnd() {\n if (segments) {\n linePoint(x__, y__);\n if (v__ && v_) bufferListener.rejoin();\n segments.push(bufferListener.buffer());\n }\n clip.point = point;\n if (v_) listener.lineEnd();\n }\n function linePoint(x, y) {\n x = Math.max(-d3_geo_clipExtentMAX, Math.min(d3_geo_clipExtentMAX, x));\n y = Math.max(-d3_geo_clipExtentMAX, Math.min(d3_geo_clipExtentMAX, y));\n var v = pointVisible(x, y);\n if (polygon) ring.push([ x, y ]);\n if (first) {\n x__ = x, y__ = y, v__ = v;\n first = false;\n if (v) {\n listener.lineStart();\n listener.point(x, y);\n }\n } else {\n if (v && v_) listener.point(x, y); else {\n var l = {\n a: {\n x: x_,\n y: y_\n },\n b: {\n x: x,\n y: y\n }\n };\n if (clipLine(l)) {\n if (!v_) {\n listener.lineStart();\n listener.point(l.a.x, l.a.y);\n }\n listener.point(l.b.x, l.b.y);\n if (!v) listener.lineEnd();\n clean = false;\n } else if (v) {\n listener.lineStart();\n listener.point(x, y);\n clean = false;\n }\n }\n }\n x_ = x, y_ = y, v_ = v;\n }\n return clip;\n };\n function corner(p, direction) {\n return abs(p[0] - x0) < ε ? direction > 0 ? 0 : 3 : abs(p[0] - x1) < ε ? direction > 0 ? 2 : 1 : abs(p[1] - y0) < ε ? direction > 0 ? 1 : 0 : direction > 0 ? 3 : 2;\n }\n function compare(a, b) {\n return comparePoints(a.x, b.x);\n }\n function comparePoints(a, b) {\n var ca = corner(a, 1), cb = corner(b, 1);\n return ca !== cb ? ca - cb : ca === 0 ? b[1] - a[1] : ca === 1 ? a[0] - b[0] : ca === 2 ? a[1] - b[1] : b[0] - a[0];\n }\n }\n function d3_geo_conic(projectAt) {\n var φ0 = 0, φ1 = π / 3, m = d3_geo_projectionMutator(projectAt), p = m(φ0, φ1);\n p.parallels = function(_) {\n if (!arguments.length) return [ φ0 / π * 180, φ1 / π * 180 ];\n return m(φ0 = _[0] * π / 180, φ1 = _[1] * π / 180);\n };\n return p;\n }\n function d3_geo_conicEqualArea(φ0, φ1) {\n var sinφ0 = Math.sin(φ0), n = (sinφ0 + Math.sin(φ1)) / 2, C = 1 + sinφ0 * (2 * n - sinφ0), ρ0 = Math.sqrt(C) / n;\n function forward(λ, φ) {\n var ρ = Math.sqrt(C - 2 * n * Math.sin(φ)) / n;\n return [ ρ * Math.sin(λ *= n), ρ0 - ρ * Math.cos(λ) ];\n }\n forward.invert = function(x, y) {\n var ρ0_y = ρ0 - y;\n return [ Math.atan2(x, ρ0_y) / n, d3_asin((C - (x * x + ρ0_y * ρ0_y) * n * n) / (2 * n)) ];\n };\n return forward;\n }\n (d3.geo.conicEqualArea = function() {\n return d3_geo_conic(d3_geo_conicEqualArea);\n }).raw = d3_geo_conicEqualArea;\n d3.geo.albers = function() {\n return d3.geo.conicEqualArea().rotate([ 96, 0 ]).center([ -.6, 38.7 ]).parallels([ 29.5, 45.5 ]).scale(1070);\n };\n d3.geo.albersUsa = function() {\n var lower48 = d3.geo.albers();\n var alaska = d3.geo.conicEqualArea().rotate([ 154, 0 ]).center([ -2, 58.5 ]).parallels([ 55, 65 ]);\n var hawaii = d3.geo.conicEqualArea().rotate([ 157, 0 ]).center([ -3, 19.9 ]).parallels([ 8, 18 ]);\n var point, pointStream = {\n point: function(x, y) {\n point = [ x, y ];\n }\n }, lower48Point, alaskaPoint, hawaiiPoint;\n function albersUsa(coordinates) {\n var x = coordinates[0], y = coordinates[1];\n point = null;\n (lower48Point(x, y), point) || (alaskaPoint(x, y), point) || hawaiiPoint(x, y);\n return point;\n }\n albersUsa.invert = function(coordinates) {\n var k = lower48.scale(), t = lower48.translate(), x = (coordinates[0] - t[0]) / k, y = (coordinates[1] - t[1]) / k;\n return (y >= .12 && y < .234 && x >= -.425 && x < -.214 ? alaska : y >= .166 && y < .234 && x >= -.214 && x < -.115 ? hawaii : lower48).invert(coordinates);\n };\n albersUsa.stream = function(stream) {\n var lower48Stream = lower48.stream(stream), alaskaStream = alaska.stream(stream), hawaiiStream = hawaii.stream(stream);\n return {\n point: function(x, y) {\n lower48Stream.point(x, y);\n alaskaStream.point(x, y);\n hawaiiStream.point(x, y);\n },\n sphere: function() {\n lower48Stream.sphere();\n alaskaStream.sphere();\n hawaiiStream.sphere();\n },\n lineStart: function() {\n lower48Stream.lineStart();\n alaskaStream.lineStart();\n hawaiiStream.lineStart();\n },\n lineEnd: function() {\n lower48Stream.lineEnd();\n alaskaStream.lineEnd();\n hawaiiStream.lineEnd();\n },\n polygonStart: function() {\n lower48Stream.polygonStart();\n alaskaStream.polygonStart();\n hawaiiStream.polygonStart();\n },\n polygonEnd: function() {\n lower48Stream.polygonEnd();\n alaskaStream.polygonEnd();\n hawaiiStream.polygonEnd();\n }\n };\n };\n albersUsa.precision = function(_) {\n if (!arguments.length) return lower48.precision();\n lower48.precision(_);\n alaska.precision(_);\n hawaii.precision(_);\n return albersUsa;\n };\n albersUsa.scale = function(_) {\n if (!arguments.length) return lower48.scale();\n lower48.scale(_);\n alaska.scale(_ * .35);\n hawaii.scale(_);\n return albersUsa.translate(lower48.translate());\n };\n albersUsa.translate = function(_) {\n if (!arguments.length) return lower48.translate();\n var k = lower48.scale(), x = +_[0], y = +_[1];\n lower48Point = lower48.translate(_).clipExtent([ [ x - .455 * k, y - .238 * k ], [ x + .455 * k, y + .238 * k ] ]).stream(pointStream).point;\n alaskaPoint = alaska.translate([ x - .307 * k, y + .201 * k ]).clipExtent([ [ x - .425 * k + ε, y + .12 * k + ε ], [ x - .214 * k - ε, y + .234 * k - ε ] ]).stream(pointStream).point;\n hawaiiPoint = hawaii.translate([ x - .205 * k, y + .212 * k ]).clipExtent([ [ x - .214 * k + ε, y + .166 * k + ε ], [ x - .115 * k - ε, y + .234 * k - ε ] ]).stream(pointStream).point;\n return albersUsa;\n };\n return albersUsa.scale(1070);\n };\n var d3_geo_pathAreaSum, d3_geo_pathAreaPolygon, d3_geo_pathArea = {\n point: d3_noop,\n lineStart: d3_noop,\n lineEnd: d3_noop,\n polygonStart: function() {\n d3_geo_pathAreaPolygon = 0;\n d3_geo_pathArea.lineStart = d3_geo_pathAreaRingStart;\n },\n polygonEnd: function() {\n d3_geo_pathArea.lineStart = d3_geo_pathArea.lineEnd = d3_geo_pathArea.point = d3_noop;\n d3_geo_pathAreaSum += abs(d3_geo_pathAreaPolygon / 2);\n }\n };\n function d3_geo_pathAreaRingStart() {\n var x00, y00, x0, y0;\n d3_geo_pathArea.point = function(x, y) {\n d3_geo_pathArea.point = nextPoint;\n x00 = x0 = x, y00 = y0 = y;\n };\n function nextPoint(x, y) {\n d3_geo_pathAreaPolygon += y0 * x - x0 * y;\n x0 = x, y0 = y;\n }\n d3_geo_pathArea.lineEnd = function() {\n nextPoint(x00, y00);\n };\n }\n var d3_geo_pathBoundsX0, d3_geo_pathBoundsY0, d3_geo_pathBoundsX1, d3_geo_pathBoundsY1;\n var d3_geo_pathBounds = {\n point: d3_geo_pathBoundsPoint,\n lineStart: d3_noop,\n lineEnd: d3_noop,\n polygonStart: d3_noop,\n polygonEnd: d3_noop\n };\n function d3_geo_pathBoundsPoint(x, y) {\n if (x < d3_geo_pathBoundsX0) d3_geo_pathBoundsX0 = x;\n if (x > d3_geo_pathBoundsX1) d3_geo_pathBoundsX1 = x;\n if (y < d3_geo_pathBoundsY0) d3_geo_pathBoundsY0 = y;\n if (y > d3_geo_pathBoundsY1) d3_geo_pathBoundsY1 = y;\n }\n function d3_geo_pathBuffer() {\n var pointCircle = d3_geo_pathBufferCircle(4.5), buffer = [];\n var stream = {\n point: point,\n lineStart: function() {\n stream.point = pointLineStart;\n },\n lineEnd: lineEnd,\n polygonStart: function() {\n stream.lineEnd = lineEndPolygon;\n },\n polygonEnd: function() {\n stream.lineEnd = lineEnd;\n stream.point = point;\n },\n pointRadius: function(_) {\n pointCircle = d3_geo_pathBufferCircle(_);\n return stream;\n },\n result: function() {\n if (buffer.length) {\n var result = buffer.join(\"\");\n buffer = [];\n return result;\n }\n }\n };\n function point(x, y) {\n buffer.push(\"M\", x, \",\", y, pointCircle);\n }\n function pointLineStart(x, y) {\n buffer.push(\"M\", x, \",\", y);\n stream.point = pointLine;\n }\n function pointLine(x, y) {\n buffer.push(\"L\", x, \",\", y);\n }\n function lineEnd() {\n stream.point = point;\n }\n function lineEndPolygon() {\n buffer.push(\"Z\");\n }\n return stream;\n }\n function d3_geo_pathBufferCircle(radius) {\n return \"m0,\" + radius + \"a\" + radius + \",\" + radius + \" 0 1,1 0,\" + -2 * radius + \"a\" + radius + \",\" + radius + \" 0 1,1 0,\" + 2 * radius + \"z\";\n }\n var d3_geo_pathCentroid = {\n point: d3_geo_pathCentroidPoint,\n lineStart: d3_geo_pathCentroidLineStart,\n lineEnd: d3_geo_pathCentroidLineEnd,\n polygonStart: function() {\n d3_geo_pathCentroid.lineStart = d3_geo_pathCentroidRingStart;\n },\n polygonEnd: function() {\n d3_geo_pathCentroid.point = d3_geo_pathCentroidPoint;\n d3_geo_pathCentroid.lineStart = d3_geo_pathCentroidLineStart;\n d3_geo_pathCentroid.lineEnd = d3_geo_pathCentroidLineEnd;\n }\n };\n function d3_geo_pathCentroidPoint(x, y) {\n d3_geo_centroidX0 += x;\n d3_geo_centroidY0 += y;\n ++d3_geo_centroidZ0;\n }\n function d3_geo_pathCentroidLineStart() {\n var x0, y0;\n d3_geo_pathCentroid.point = function(x, y) {\n d3_geo_pathCentroid.point = nextPoint;\n d3_geo_pathCentroidPoint(x0 = x, y0 = y);\n };\n function nextPoint(x, y) {\n var dx = x - x0, dy = y - y0, z = Math.sqrt(dx * dx + dy * dy);\n d3_geo_centroidX1 += z * (x0 + x) / 2;\n d3_geo_centroidY1 += z * (y0 + y) / 2;\n d3_geo_centroidZ1 += z;\n d3_geo_pathCentroidPoint(x0 = x, y0 = y);\n }\n }\n function d3_geo_pathCentroidLineEnd() {\n d3_geo_pathCentroid.point = d3_geo_pathCentroidPoint;\n }\n function d3_geo_pathCentroidRingStart() {\n var x00, y00, x0, y0;\n d3_geo_pathCentroid.point = function(x, y) {\n d3_geo_pathCentroid.point = nextPoint;\n d3_geo_pathCentroidPoint(x00 = x0 = x, y00 = y0 = y);\n };\n function nextPoint(x, y) {\n var dx = x - x0, dy = y - y0, z = Math.sqrt(dx * dx + dy * dy);\n d3_geo_centroidX1 += z * (x0 + x) / 2;\n d3_geo_centroidY1 += z * (y0 + y) / 2;\n d3_geo_centroidZ1 += z;\n z = y0 * x - x0 * y;\n d3_geo_centroidX2 += z * (x0 + x);\n d3_geo_centroidY2 += z * (y0 + y);\n d3_geo_centroidZ2 += z * 3;\n d3_geo_pathCentroidPoint(x0 = x, y0 = y);\n }\n d3_geo_pathCentroid.lineEnd = function() {\n nextPoint(x00, y00);\n };\n }\n function d3_geo_pathContext(context) {\n var pointRadius = 4.5;\n var stream = {\n point: point,\n lineStart: function() {\n stream.point = pointLineStart;\n },\n lineEnd: lineEnd,\n polygonStart: function() {\n stream.lineEnd = lineEndPolygon;\n },\n polygonEnd: function() {\n stream.lineEnd = lineEnd;\n stream.point = point;\n },\n pointRadius: function(_) {\n pointRadius = _;\n return stream;\n },\n result: d3_noop\n };\n function point(x, y) {\n context.moveTo(x + pointRadius, y);\n context.arc(x, y, pointRadius, 0, τ);\n }\n function pointLineStart(x, y) {\n context.moveTo(x, y);\n stream.point = pointLine;\n }\n function pointLine(x, y) {\n context.lineTo(x, y);\n }\n function lineEnd() {\n stream.point = point;\n }\n function lineEndPolygon() {\n context.closePath();\n }\n return stream;\n }\n function d3_geo_resample(project) {\n var δ2 = .5, cosMinDistance = Math.cos(30 * d3_radians), maxDepth = 16;\n function resample(stream) {\n return (maxDepth ? resampleRecursive : resampleNone)(stream);\n }\n function resampleNone(stream) {\n return d3_geo_transformPoint(stream, function(x, y) {\n x = project(x, y);\n stream.point(x[0], x[1]);\n });\n }\n function resampleRecursive(stream) {\n var λ00, φ00, x00, y00, a00, b00, c00, λ0, x0, y0, a0, b0, c0;\n var resample = {\n point: point,\n lineStart: lineStart,\n lineEnd: lineEnd,\n polygonStart: function() {\n stream.polygonStart();\n resample.lineStart = ringStart;\n },\n polygonEnd: function() {\n stream.polygonEnd();\n resample.lineStart = lineStart;\n }\n };\n function point(x, y) {\n x = project(x, y);\n stream.point(x[0], x[1]);\n }\n function lineStart() {\n x0 = NaN;\n resample.point = linePoint;\n stream.lineStart();\n }\n function linePoint(λ, φ) {\n var c = d3_geo_cartesian([ λ, φ ]), p = project(λ, φ);\n resampleLineTo(x0, y0, λ0, a0, b0, c0, x0 = p[0], y0 = p[1], λ0 = λ, a0 = c[0], b0 = c[1], c0 = c[2], maxDepth, stream);\n stream.point(x0, y0);\n }\n function lineEnd() {\n resample.point = point;\n stream.lineEnd();\n }\n function ringStart() {\n lineStart();\n resample.point = ringPoint;\n resample.lineEnd = ringEnd;\n }\n function ringPoint(λ, φ) {\n linePoint(λ00 = λ, φ00 = φ), x00 = x0, y00 = y0, a00 = a0, b00 = b0, c00 = c0;\n resample.point = linePoint;\n }\n function ringEnd() {\n resampleLineTo(x0, y0, λ0, a0, b0, c0, x00, y00, λ00, a00, b00, c00, maxDepth, stream);\n resample.lineEnd = lineEnd;\n lineEnd();\n }\n return resample;\n }\n function resampleLineTo(x0, y0, λ0, a0, b0, c0, x1, y1, λ1, a1, b1, c1, depth, stream) {\n var dx = x1 - x0, dy = y1 - y0, d2 = dx * dx + dy * dy;\n if (d2 > 4 * δ2 && depth--) {\n var a = a0 + a1, b = b0 + b1, c = c0 + c1, m = Math.sqrt(a * a + b * b + c * c), φ2 = Math.asin(c /= m), λ2 = abs(abs(c) - 1) < ε || abs(λ0 - λ1) < ε ? (λ0 + λ1) / 2 : Math.atan2(b, a), p = project(λ2, φ2), x2 = p[0], y2 = p[1], dx2 = x2 - x0, dy2 = y2 - y0, dz = dy * dx2 - dx * dy2;\n if (dz * dz / d2 > δ2 || abs((dx * dx2 + dy * dy2) / d2 - .5) > .3 || a0 * a1 + b0 * b1 + c0 * c1 < cosMinDistance) {\n resampleLineTo(x0, y0, λ0, a0, b0, c0, x2, y2, λ2, a /= m, b /= m, c, depth, stream);\n stream.point(x2, y2);\n resampleLineTo(x2, y2, λ2, a, b, c, x1, y1, λ1, a1, b1, c1, depth, stream);\n }\n }\n }\n resample.precision = function(_) {\n if (!arguments.length) return Math.sqrt(δ2);\n maxDepth = (δ2 = _ * _) > 0 && 16;\n return resample;\n };\n return resample;\n }\n d3.geo.path = function() {\n var pointRadius = 4.5, projection, context, projectStream, contextStream, cacheStream;\n function path(object) {\n if (object) {\n if (typeof pointRadius === \"function\") contextStream.pointRadius(+pointRadius.apply(this, arguments));\n if (!cacheStream || !cacheStream.valid) cacheStream = projectStream(contextStream);\n d3.geo.stream(object, cacheStream);\n }\n return contextStream.result();\n }\n path.area = function(object) {\n d3_geo_pathAreaSum = 0;\n d3.geo.stream(object, projectStream(d3_geo_pathArea));\n return d3_geo_pathAreaSum;\n };\n path.centroid = function(object) {\n d3_geo_centroidX0 = d3_geo_centroidY0 = d3_geo_centroidZ0 = d3_geo_centroidX1 = d3_geo_centroidY1 = d3_geo_centroidZ1 = d3_geo_centroidX2 = d3_geo_centroidY2 = d3_geo_centroidZ2 = 0;\n d3.geo.stream(object, projectStream(d3_geo_pathCentroid));\n return d3_geo_centroidZ2 ? [ d3_geo_centroidX2 / d3_geo_centroidZ2, d3_geo_centroidY2 / d3_geo_centroidZ2 ] : d3_geo_centroidZ1 ? [ d3_geo_centroidX1 / d3_geo_centroidZ1, d3_geo_centroidY1 / d3_geo_centroidZ1 ] : d3_geo_centroidZ0 ? [ d3_geo_centroidX0 / d3_geo_centroidZ0, d3_geo_centroidY0 / d3_geo_centroidZ0 ] : [ NaN, NaN ];\n };\n path.bounds = function(object) {\n d3_geo_pathBoundsX1 = d3_geo_pathBoundsY1 = -(d3_geo_pathBoundsX0 = d3_geo_pathBoundsY0 = Infinity);\n d3.geo.stream(object, projectStream(d3_geo_pathBounds));\n return [ [ d3_geo_pathBoundsX0, d3_geo_pathBoundsY0 ], [ d3_geo_pathBoundsX1, d3_geo_pathBoundsY1 ] ];\n };\n path.projection = function(_) {\n if (!arguments.length) return projection;\n projectStream = (projection = _) ? _.stream || d3_geo_pathProjectStream(_) : d3_identity;\n return reset();\n };\n path.context = function(_) {\n if (!arguments.length) return context;\n contextStream = (context = _) == null ? new d3_geo_pathBuffer() : new d3_geo_pathContext(_);\n if (typeof pointRadius !== \"function\") contextStream.pointRadius(pointRadius);\n return reset();\n };\n path.pointRadius = function(_) {\n if (!arguments.length) return pointRadius;\n pointRadius = typeof _ === \"function\" ? _ : (contextStream.pointRadius(+_), +_);\n return path;\n };\n function reset() {\n cacheStream = null;\n return path;\n }\n return path.projection(d3.geo.albersUsa()).context(null);\n };\n function d3_geo_pathProjectStream(project) {\n var resample = d3_geo_resample(function(x, y) {\n return project([ x * d3_degrees, y * d3_degrees ]);\n });\n return function(stream) {\n return d3_geo_projectionRadians(resample(stream));\n };\n }\n d3.geo.transform = function(methods) {\n return {\n stream: function(stream) {\n var transform = new d3_geo_transform(stream);\n for (var k in methods) transform[k] = methods[k];\n return transform;\n }\n };\n };\n function d3_geo_transform(stream) {\n this.stream = stream;\n }\n d3_geo_transform.prototype = {\n point: function(x, y) {\n this.stream.point(x, y);\n },\n sphere: function() {\n this.stream.sphere();\n },\n lineStart: function() {\n this.stream.lineStart();\n },\n lineEnd: function() {\n this.stream.lineEnd();\n },\n polygonStart: function() {\n this.stream.polygonStart();\n },\n polygonEnd: function() {\n this.stream.polygonEnd();\n }\n };\n function d3_geo_transformPoint(stream, point) {\n return {\n point: point,\n sphere: function() {\n stream.sphere();\n },\n lineStart: function() {\n stream.lineStart();\n },\n lineEnd: function() {\n stream.lineEnd();\n },\n polygonStart: function() {\n stream.polygonStart();\n },\n polygonEnd: function() {\n stream.polygonEnd();\n }\n };\n }\n d3.geo.projection = d3_geo_projection;\n d3.geo.projectionMutator = d3_geo_projectionMutator;\n function d3_geo_projection(project) {\n return d3_geo_projectionMutator(function() {\n return project;\n })();\n }\n function d3_geo_projectionMutator(projectAt) {\n var project, rotate, projectRotate, projectResample = d3_geo_resample(function(x, y) {\n x = project(x, y);\n return [ x[0] * k + δx, δy - x[1] * k ];\n }), k = 150, x = 480, y = 250, λ = 0, φ = 0, δλ = 0, δφ = 0, δγ = 0, δx, δy, preclip = d3_geo_clipAntimeridian, postclip = d3_identity, clipAngle = null, clipExtent = null, stream;\n function projection(point) {\n point = projectRotate(point[0] * d3_radians, point[1] * d3_radians);\n return [ point[0] * k + δx, δy - point[1] * k ];\n }\n function invert(point) {\n point = projectRotate.invert((point[0] - δx) / k, (δy - point[1]) / k);\n return point && [ point[0] * d3_degrees, point[1] * d3_degrees ];\n }\n projection.stream = function(output) {\n if (stream) stream.valid = false;\n stream = d3_geo_projectionRadians(preclip(rotate, projectResample(postclip(output))));\n stream.valid = true;\n return stream;\n };\n projection.clipAngle = function(_) {\n if (!arguments.length) return clipAngle;\n preclip = _ == null ? (clipAngle = _, d3_geo_clipAntimeridian) : d3_geo_clipCircle((clipAngle = +_) * d3_radians);\n return invalidate();\n };\n projection.clipExtent = function(_) {\n if (!arguments.length) return clipExtent;\n clipExtent = _;\n postclip = _ ? d3_geo_clipExtent(_[0][0], _[0][1], _[1][0], _[1][1]) : d3_identity;\n return invalidate();\n };\n projection.scale = function(_) {\n if (!arguments.length) return k;\n k = +_;\n return reset();\n };\n projection.translate = function(_) {\n if (!arguments.length) return [ x, y ];\n x = +_[0];\n y = +_[1];\n return reset();\n };\n projection.center = function(_) {\n if (!arguments.length) return [ λ * d3_degrees, φ * d3_degrees ];\n λ = _[0] % 360 * d3_radians;\n φ = _[1] % 360 * d3_radians;\n return reset();\n };\n projection.rotate = function(_) {\n if (!arguments.length) return [ δλ * d3_degrees, δφ * d3_degrees, δγ * d3_degrees ];\n δλ = _[0] % 360 * d3_radians;\n δφ = _[1] % 360 * d3_radians;\n δγ = _.length > 2 ? _[2] % 360 * d3_radians : 0;\n return reset();\n };\n d3.rebind(projection, projectResample, \"precision\");\n function reset() {\n projectRotate = d3_geo_compose(rotate = d3_geo_rotation(δλ, δφ, δγ), project);\n var center = project(λ, φ);\n δx = x - center[0] * k;\n δy = y + center[1] * k;\n return invalidate();\n }\n function invalidate() {\n if (stream) stream.valid = false, stream = null;\n return projection;\n }\n return function() {\n project = projectAt.apply(this, arguments);\n projection.invert = project.invert && invert;\n return reset();\n };\n }\n function d3_geo_projectionRadians(stream) {\n return d3_geo_transformPoint(stream, function(x, y) {\n stream.point(x * d3_radians, y * d3_radians);\n });\n }\n function d3_geo_equirectangular(λ, φ) {\n return [ λ, φ ];\n }\n (d3.geo.equirectangular = function() {\n return d3_geo_projection(d3_geo_equirectangular);\n }).raw = d3_geo_equirectangular.invert = d3_geo_equirectangular;\n d3.geo.rotation = function(rotate) {\n rotate = d3_geo_rotation(rotate[0] % 360 * d3_radians, rotate[1] * d3_radians, rotate.length > 2 ? rotate[2] * d3_radians : 0);\n function forward(coordinates) {\n coordinates = rotate(coordinates[0] * d3_radians, coordinates[1] * d3_radians);\n return coordinates[0] *= d3_degrees, coordinates[1] *= d3_degrees, coordinates;\n }\n forward.invert = function(coordinates) {\n coordinates = rotate.invert(coordinates[0] * d3_radians, coordinates[1] * d3_radians);\n return coordinates[0] *= d3_degrees, coordinates[1] *= d3_degrees, coordinates;\n };\n return forward;\n };\n function d3_geo_identityRotation(λ, φ) {\n return [ λ > π ? λ - τ : λ < -π ? λ + τ : λ, φ ];\n }\n d3_geo_identityRotation.invert = d3_geo_equirectangular;\n function d3_geo_rotation(δλ, δφ, δγ) {\n return δλ ? δφ || δγ ? d3_geo_compose(d3_geo_rotationλ(δλ), d3_geo_rotationφγ(δφ, δγ)) : d3_geo_rotationλ(δλ) : δφ || δγ ? d3_geo_rotationφγ(δφ, δγ) : d3_geo_identityRotation;\n }\n function d3_geo_forwardRotationλ(δλ) {\n return function(λ, φ) {\n return λ += δλ, [ λ > π ? λ - τ : λ < -π ? λ + τ : λ, φ ];\n };\n }\n function d3_geo_rotationλ(δλ) {\n var rotation = d3_geo_forwardRotationλ(δλ);\n rotation.invert = d3_geo_forwardRotationλ(-δλ);\n return rotation;\n }\n function d3_geo_rotationφγ(δφ, δγ) {\n var cosδφ = Math.cos(δφ), sinδφ = Math.sin(δφ), cosδγ = Math.cos(δγ), sinδγ = Math.sin(δγ);\n function rotation(λ, φ) {\n var cosφ = Math.cos(φ), x = Math.cos(λ) * cosφ, y = Math.sin(λ) * cosφ, z = Math.sin(φ), k = z * cosδφ + x * sinδφ;\n return [ Math.atan2(y * cosδγ - k * sinδγ, x * cosδφ - z * sinδφ), d3_asin(k * cosδγ + y * sinδγ) ];\n }\n rotation.invert = function(λ, φ) {\n var cosφ = Math.cos(φ), x = Math.cos(λ) * cosφ, y = Math.sin(λ) * cosφ, z = Math.sin(φ), k = z * cosδγ - y * sinδγ;\n return [ Math.atan2(y * cosδγ + z * sinδγ, x * cosδφ + k * sinδφ), d3_asin(k * cosδφ - x * sinδφ) ];\n };\n return rotation;\n }\n d3.geo.circle = function() {\n var origin = [ 0, 0 ], angle, precision = 6, interpolate;\n function circle() {\n var center = typeof origin === \"function\" ? origin.apply(this, arguments) : origin, rotate = d3_geo_rotation(-center[0] * d3_radians, -center[1] * d3_radians, 0).invert, ring = [];\n interpolate(null, null, 1, {\n point: function(x, y) {\n ring.push(x = rotate(x, y));\n x[0] *= d3_degrees, x[1] *= d3_degrees;\n }\n });\n return {\n type: \"Polygon\",\n coordinates: [ ring ]\n };\n }\n circle.origin = function(x) {\n if (!arguments.length) return origin;\n origin = x;\n return circle;\n };\n circle.angle = function(x) {\n if (!arguments.length) return angle;\n interpolate = d3_geo_circleInterpolate((angle = +x) * d3_radians, precision * d3_radians);\n return circle;\n };\n circle.precision = function(_) {\n if (!arguments.length) return precision;\n interpolate = d3_geo_circleInterpolate(angle * d3_radians, (precision = +_) * d3_radians);\n return circle;\n };\n return circle.angle(90);\n };\n function d3_geo_circleInterpolate(radius, precision) {\n var cr = Math.cos(radius), sr = Math.sin(radius);\n return function(from, to, direction, listener) {\n var step = direction * precision;\n if (from != null) {\n from = d3_geo_circleAngle(cr, from);\n to = d3_geo_circleAngle(cr, to);\n if (direction > 0 ? from < to : from > to) from += direction * τ;\n } else {\n from = radius + direction * τ;\n to = radius - .5 * step;\n }\n for (var point, t = from; direction > 0 ? t > to : t < to; t -= step) {\n listener.point((point = d3_geo_spherical([ cr, -sr * Math.cos(t), -sr * Math.sin(t) ]))[0], point[1]);\n }\n };\n }\n function d3_geo_circleAngle(cr, point) {\n var a = d3_geo_cartesian(point);\n a[0] -= cr;\n d3_geo_cartesianNormalize(a);\n var angle = d3_acos(-a[1]);\n return ((-a[2] < 0 ? -angle : angle) + 2 * Math.PI - ε) % (2 * Math.PI);\n }\n d3.geo.distance = function(a, b) {\n var Δλ = (b[0] - a[0]) * d3_radians, φ0 = a[1] * d3_radians, φ1 = b[1] * d3_radians, sinΔλ = Math.sin(Δλ), cosΔλ = Math.cos(Δλ), sinφ0 = Math.sin(φ0), cosφ0 = Math.cos(φ0), sinφ1 = Math.sin(φ1), cosφ1 = Math.cos(φ1), t;\n return Math.atan2(Math.sqrt((t = cosφ1 * sinΔλ) * t + (t = cosφ0 * sinφ1 - sinφ0 * cosφ1 * cosΔλ) * t), sinφ0 * sinφ1 + cosφ0 * cosφ1 * cosΔλ);\n };\n d3.geo.graticule = function() {\n var x1, x0, X1, X0, y1, y0, Y1, Y0, dx = 10, dy = dx, DX = 90, DY = 360, x, y, X, Y, precision = 2.5;\n function graticule() {\n return {\n type: \"MultiLineString\",\n coordinates: lines()\n };\n }\n function lines() {\n return d3.range(Math.ceil(X0 / DX) * DX, X1, DX).map(X).concat(d3.range(Math.ceil(Y0 / DY) * DY, Y1, DY).map(Y)).concat(d3.range(Math.ceil(x0 / dx) * dx, x1, dx).filter(function(x) {\n return abs(x % DX) > ε;\n }).map(x)).concat(d3.range(Math.ceil(y0 / dy) * dy, y1, dy).filter(function(y) {\n return abs(y % DY) > ε;\n }).map(y));\n }\n graticule.lines = function() {\n return lines().map(function(coordinates) {\n return {\n type: \"LineString\",\n coordinates: coordinates\n };\n });\n };\n graticule.outline = function() {\n return {\n type: \"Polygon\",\n coordinates: [ X(X0).concat(Y(Y1).slice(1), X(X1).reverse().slice(1), Y(Y0).reverse().slice(1)) ]\n };\n };\n graticule.extent = function(_) {\n if (!arguments.length) return graticule.minorExtent();\n return graticule.majorExtent(_).minorExtent(_);\n };\n graticule.majorExtent = function(_) {\n if (!arguments.length) return [ [ X0, Y0 ], [ X1, Y1 ] ];\n X0 = +_[0][0], X1 = +_[1][0];\n Y0 = +_[0][1], Y1 = +_[1][1];\n if (X0 > X1) _ = X0, X0 = X1, X1 = _;\n if (Y0 > Y1) _ = Y0, Y0 = Y1, Y1 = _;\n return graticule.precision(precision);\n };\n graticule.minorExtent = function(_) {\n if (!arguments.length) return [ [ x0, y0 ], [ x1, y1 ] ];\n x0 = +_[0][0], x1 = +_[1][0];\n y0 = +_[0][1], y1 = +_[1][1];\n if (x0 > x1) _ = x0, x0 = x1, x1 = _;\n if (y0 > y1) _ = y0, y0 = y1, y1 = _;\n return graticule.precision(precision);\n };\n graticule.step = function(_) {\n if (!arguments.length) return graticule.minorStep();\n return graticule.majorStep(_).minorStep(_);\n };\n graticule.majorStep = function(_) {\n if (!arguments.length) return [ DX, DY ];\n DX = +_[0], DY = +_[1];\n return graticule;\n };\n graticule.minorStep = function(_) {\n if (!arguments.length) return [ dx, dy ];\n dx = +_[0], dy = +_[1];\n return graticule;\n };\n graticule.precision = function(_) {\n if (!arguments.length) return precision;\n precision = +_;\n x = d3_geo_graticuleX(y0, y1, 90);\n y = d3_geo_graticuleY(x0, x1, precision);\n X = d3_geo_graticuleX(Y0, Y1, 90);\n Y = d3_geo_graticuleY(X0, X1, precision);\n return graticule;\n };\n return graticule.majorExtent([ [ -180, -90 + ε ], [ 180, 90 - ε ] ]).minorExtent([ [ -180, -80 - ε ], [ 180, 80 + ε ] ]);\n };\n function d3_geo_graticuleX(y0, y1, dy) {\n var y = d3.range(y0, y1 - ε, dy).concat(y1);\n return function(x) {\n return y.map(function(y) {\n return [ x, y ];\n });\n };\n }\n function d3_geo_graticuleY(x0, x1, dx) {\n var x = d3.range(x0, x1 - ε, dx).concat(x1);\n return function(y) {\n return x.map(function(x) {\n return [ x, y ];\n });\n };\n }\n function d3_source(d) {\n return d.source;\n }\n function d3_target(d) {\n return d.target;\n }\n d3.geo.greatArc = function() {\n var source = d3_source, source_, target = d3_target, target_;\n function greatArc() {\n return {\n type: \"LineString\",\n coordinates: [ source_ || source.apply(this, arguments), target_ || target.apply(this, arguments) ]\n };\n }\n greatArc.distance = function() {\n return d3.geo.distance(source_ || source.apply(this, arguments), target_ || target.apply(this, arguments));\n };\n greatArc.source = function(_) {\n if (!arguments.length) return source;\n source = _, source_ = typeof _ === \"function\" ? null : _;\n return greatArc;\n };\n greatArc.target = function(_) {\n if (!arguments.length) return target;\n target = _, target_ = typeof _ === \"function\" ? null : _;\n return greatArc;\n };\n greatArc.precision = function() {\n return arguments.length ? greatArc : 0;\n };\n return greatArc;\n };\n d3.geo.interpolate = function(source, target) {\n return d3_geo_interpolate(source[0] * d3_radians, source[1] * d3_radians, target[0] * d3_radians, target[1] * d3_radians);\n };\n function d3_geo_interpolate(x0, y0, x1, y1) {\n var cy0 = Math.cos(y0), sy0 = Math.sin(y0), cy1 = Math.cos(y1), sy1 = Math.sin(y1), kx0 = cy0 * Math.cos(x0), ky0 = cy0 * Math.sin(x0), kx1 = cy1 * Math.cos(x1), ky1 = cy1 * Math.sin(x1), d = 2 * Math.asin(Math.sqrt(d3_haversin(y1 - y0) + cy0 * cy1 * d3_haversin(x1 - x0))), k = 1 / Math.sin(d);\n var interpolate = d ? function(t) {\n var B = Math.sin(t *= d) * k, A = Math.sin(d - t) * k, x = A * kx0 + B * kx1, y = A * ky0 + B * ky1, z = A * sy0 + B * sy1;\n return [ Math.atan2(y, x) * d3_degrees, Math.atan2(z, Math.sqrt(x * x + y * y)) * d3_degrees ];\n } : function() {\n return [ x0 * d3_degrees, y0 * d3_degrees ];\n };\n interpolate.distance = d;\n return interpolate;\n }\n d3.geo.length = function(object) {\n d3_geo_lengthSum = 0;\n d3.geo.stream(object, d3_geo_length);\n return d3_geo_lengthSum;\n };\n var d3_geo_lengthSum;\n var d3_geo_length = {\n sphere: d3_noop,\n point: d3_noop,\n lineStart: d3_geo_lengthLineStart,\n lineEnd: d3_noop,\n polygonStart: d3_noop,\n polygonEnd: d3_noop\n };\n function d3_geo_lengthLineStart() {\n var λ0, sinφ0, cosφ0;\n d3_geo_length.point = function(λ, φ) {\n λ0 = λ * d3_radians, sinφ0 = Math.sin(φ *= d3_radians), cosφ0 = Math.cos(φ);\n d3_geo_length.point = nextPoint;\n };\n d3_geo_length.lineEnd = function() {\n d3_geo_length.point = d3_geo_length.lineEnd = d3_noop;\n };\n function nextPoint(λ, φ) {\n var sinφ = Math.sin(φ *= d3_radians), cosφ = Math.cos(φ), t = abs((λ *= d3_radians) - λ0), cosΔλ = Math.cos(t);\n d3_geo_lengthSum += Math.atan2(Math.sqrt((t = cosφ * Math.sin(t)) * t + (t = cosφ0 * sinφ - sinφ0 * cosφ * cosΔλ) * t), sinφ0 * sinφ + cosφ0 * cosφ * cosΔλ);\n λ0 = λ, sinφ0 = sinφ, cosφ0 = cosφ;\n }\n }\n function d3_geo_azimuthal(scale, angle) {\n function azimuthal(λ, φ) {\n var cosλ = Math.cos(λ), cosφ = Math.cos(φ), k = scale(cosλ * cosφ);\n return [ k * cosφ * Math.sin(λ), k * Math.sin(φ) ];\n }\n azimuthal.invert = function(x, y) {\n var ρ = Math.sqrt(x * x + y * y), c = angle(ρ), sinc = Math.sin(c), cosc = Math.cos(c);\n return [ Math.atan2(x * sinc, ρ * cosc), Math.asin(ρ && y * sinc / ρ) ];\n };\n return azimuthal;\n }\n var d3_geo_azimuthalEqualArea = d3_geo_azimuthal(function(cosλcosφ) {\n return Math.sqrt(2 / (1 + cosλcosφ));\n }, function(ρ) {\n return 2 * Math.asin(ρ / 2);\n });\n (d3.geo.azimuthalEqualArea = function() {\n return d3_geo_projection(d3_geo_azimuthalEqualArea);\n }).raw = d3_geo_azimuthalEqualArea;\n var d3_geo_azimuthalEquidistant = d3_geo_azimuthal(function(cosλcosφ) {\n var c = Math.acos(cosλcosφ);\n return c && c / Math.sin(c);\n }, d3_identity);\n (d3.geo.azimuthalEquidistant = function() {\n return d3_geo_projection(d3_geo_azimuthalEquidistant);\n }).raw = d3_geo_azimuthalEquidistant;\n function d3_geo_conicConformal(φ0, φ1) {\n var cosφ0 = Math.cos(φ0), t = function(φ) {\n return Math.tan(π / 4 + φ / 2);\n }, n = φ0 === φ1 ? Math.sin(φ0) : Math.log(cosφ0 / Math.cos(φ1)) / Math.log(t(φ1) / t(φ0)), F = cosφ0 * Math.pow(t(φ0), n) / n;\n if (!n) return d3_geo_mercator;\n function forward(λ, φ) {\n if (F > 0) {\n if (φ < -halfπ + ε) φ = -halfπ + ε;\n } else {\n if (φ > halfπ - ε) φ = halfπ - ε;\n }\n var ρ = F / Math.pow(t(φ), n);\n return [ ρ * Math.sin(n * λ), F - ρ * Math.cos(n * λ) ];\n }\n forward.invert = function(x, y) {\n var ρ0_y = F - y, ρ = d3_sgn(n) * Math.sqrt(x * x + ρ0_y * ρ0_y);\n return [ Math.atan2(x, ρ0_y) / n, 2 * Math.atan(Math.pow(F / ρ, 1 / n)) - halfπ ];\n };\n return forward;\n }\n (d3.geo.conicConformal = function() {\n return d3_geo_conic(d3_geo_conicConformal);\n }).raw = d3_geo_conicConformal;\n function d3_geo_conicEquidistant(φ0, φ1) {\n var cosφ0 = Math.cos(φ0), n = φ0 === φ1 ? Math.sin(φ0) : (cosφ0 - Math.cos(φ1)) / (φ1 - φ0), G = cosφ0 / n + φ0;\n if (abs(n) < ε) return d3_geo_equirectangular;\n function forward(λ, φ) {\n var ρ = G - φ;\n return [ ρ * Math.sin(n * λ), G - ρ * Math.cos(n * λ) ];\n }\n forward.invert = function(x, y) {\n var ρ0_y = G - y;\n return [ Math.atan2(x, ρ0_y) / n, G - d3_sgn(n) * Math.sqrt(x * x + ρ0_y * ρ0_y) ];\n };\n return forward;\n }\n (d3.geo.conicEquidistant = function() {\n return d3_geo_conic(d3_geo_conicEquidistant);\n }).raw = d3_geo_conicEquidistant;\n var d3_geo_gnomonic = d3_geo_azimuthal(function(cosλcosφ) {\n return 1 / cosλcosφ;\n }, Math.atan);\n (d3.geo.gnomonic = function() {\n return d3_geo_projection(d3_geo_gnomonic);\n }).raw = d3_geo_gnomonic;\n function d3_geo_mercator(λ, φ) {\n return [ λ, Math.log(Math.tan(π / 4 + φ / 2)) ];\n }\n d3_geo_mercator.invert = function(x, y) {\n return [ x, 2 * Math.atan(Math.exp(y)) - halfπ ];\n };\n function d3_geo_mercatorProjection(project) {\n var m = d3_geo_projection(project), scale = m.scale, translate = m.translate, clipExtent = m.clipExtent, clipAuto;\n m.scale = function() {\n var v = scale.apply(m, arguments);\n return v === m ? clipAuto ? m.clipExtent(null) : m : v;\n };\n m.translate = function() {\n var v = translate.apply(m, arguments);\n return v === m ? clipAuto ? m.clipExtent(null) : m : v;\n };\n m.clipExtent = function(_) {\n var v = clipExtent.apply(m, arguments);\n if (v === m) {\n if (clipAuto = _ == null) {\n var k = π * scale(), t = translate();\n clipExtent([ [ t[0] - k, t[1] - k ], [ t[0] + k, t[1] + k ] ]);\n }\n } else if (clipAuto) {\n v = null;\n }\n return v;\n };\n return m.clipExtent(null);\n }\n (d3.geo.mercator = function() {\n return d3_geo_mercatorProjection(d3_geo_mercator);\n }).raw = d3_geo_mercator;\n var d3_geo_orthographic = d3_geo_azimuthal(function() {\n return 1;\n }, Math.asin);\n (d3.geo.orthographic = function() {\n return d3_geo_projection(d3_geo_orthographic);\n }).raw = d3_geo_orthographic;\n var d3_geo_stereographic = d3_geo_azimuthal(function(cosλcosφ) {\n return 1 / (1 + cosλcosφ);\n }, function(ρ) {\n return 2 * Math.atan(ρ);\n });\n (d3.geo.stereographic = function() {\n return d3_geo_projection(d3_geo_stereographic);\n }).raw = d3_geo_stereographic;\n function d3_geo_transverseMercator(λ, φ) {\n return [ Math.log(Math.tan(π / 4 + φ / 2)), -λ ];\n }\n d3_geo_transverseMercator.invert = function(x, y) {\n return [ -y, 2 * Math.atan(Math.exp(x)) - halfπ ];\n };\n (d3.geo.transverseMercator = function() {\n var projection = d3_geo_mercatorProjection(d3_geo_transverseMercator), center = projection.center, rotate = projection.rotate;\n projection.center = function(_) {\n return _ ? center([ -_[1], _[0] ]) : (_ = center(), [ _[1], -_[0] ]);\n };\n projection.rotate = function(_) {\n return _ ? rotate([ _[0], _[1], _.length > 2 ? _[2] + 90 : 90 ]) : (_ = rotate(), \n [ _[0], _[1], _[2] - 90 ]);\n };\n return rotate([ 0, 0, 90 ]);\n }).raw = d3_geo_transverseMercator;\n d3.geom = {};\n function d3_geom_pointX(d) {\n return d[0];\n }\n function d3_geom_pointY(d) {\n return d[1];\n }\n d3.geom.hull = function(vertices) {\n var x = d3_geom_pointX, y = d3_geom_pointY;\n if (arguments.length) return hull(vertices);\n function hull(data) {\n if (data.length < 3) return [];\n var fx = d3_functor(x), fy = d3_functor(y), i, n = data.length, points = [], flippedPoints = [];\n for (i = 0; i < n; i++) {\n points.push([ +fx.call(this, data[i], i), +fy.call(this, data[i], i), i ]);\n }\n points.sort(d3_geom_hullOrder);\n for (i = 0; i < n; i++) flippedPoints.push([ points[i][0], -points[i][1] ]);\n var upper = d3_geom_hullUpper(points), lower = d3_geom_hullUpper(flippedPoints);\n var skipLeft = lower[0] === upper[0], skipRight = lower[lower.length - 1] === upper[upper.length - 1], polygon = [];\n for (i = upper.length - 1; i >= 0; --i) polygon.push(data[points[upper[i]][2]]);\n for (i = +skipLeft; i < lower.length - skipRight; ++i) polygon.push(data[points[lower[i]][2]]);\n return polygon;\n }\n hull.x = function(_) {\n return arguments.length ? (x = _, hull) : x;\n };\n hull.y = function(_) {\n return arguments.length ? (y = _, hull) : y;\n };\n return hull;\n };\n function d3_geom_hullUpper(points) {\n var n = points.length, hull = [ 0, 1 ], hs = 2;\n for (var i = 2; i < n; i++) {\n while (hs > 1 && d3_cross2d(points[hull[hs - 2]], points[hull[hs - 1]], points[i]) <= 0) --hs;\n hull[hs++] = i;\n }\n return hull.slice(0, hs);\n }\n function d3_geom_hullOrder(a, b) {\n return a[0] - b[0] || a[1] - b[1];\n }\n d3.geom.polygon = function(coordinates) {\n d3_subclass(coordinates, d3_geom_polygonPrototype);\n return coordinates;\n };\n var d3_geom_polygonPrototype = d3.geom.polygon.prototype = [];\n d3_geom_polygonPrototype.area = function() {\n var i = -1, n = this.length, a, b = this[n - 1], area = 0;\n while (++i < n) {\n a = b;\n b = this[i];\n area += a[1] * b[0] - a[0] * b[1];\n }\n return area * .5;\n };\n d3_geom_polygonPrototype.centroid = function(k) {\n var i = -1, n = this.length, x = 0, y = 0, a, b = this[n - 1], c;\n if (!arguments.length) k = -1 / (6 * this.area());\n while (++i < n) {\n a = b;\n b = this[i];\n c = a[0] * b[1] - b[0] * a[1];\n x += (a[0] + b[0]) * c;\n y += (a[1] + b[1]) * c;\n }\n return [ x * k, y * k ];\n };\n d3_geom_polygonPrototype.clip = function(subject) {\n var input, closed = d3_geom_polygonClosed(subject), i = -1, n = this.length - d3_geom_polygonClosed(this), j, m, a = this[n - 1], b, c, d;\n while (++i < n) {\n input = subject.slice();\n subject.length = 0;\n b = this[i];\n c = input[(m = input.length - closed) - 1];\n j = -1;\n while (++j < m) {\n d = input[j];\n if (d3_geom_polygonInside(d, a, b)) {\n if (!d3_geom_polygonInside(c, a, b)) {\n subject.push(d3_geom_polygonIntersect(c, d, a, b));\n }\n subject.push(d);\n } else if (d3_geom_polygonInside(c, a, b)) {\n subject.push(d3_geom_polygonIntersect(c, d, a, b));\n }\n c = d;\n }\n if (closed) subject.push(subject[0]);\n a = b;\n }\n return subject;\n };\n function d3_geom_polygonInside(p, a, b) {\n return (b[0] - a[0]) * (p[1] - a[1]) < (b[1] - a[1]) * (p[0] - a[0]);\n }\n function d3_geom_polygonIntersect(c, d, a, b) {\n var x1 = c[0], x3 = a[0], x21 = d[0] - x1, x43 = b[0] - x3, y1 = c[1], y3 = a[1], y21 = d[1] - y1, y43 = b[1] - y3, ua = (x43 * (y1 - y3) - y43 * (x1 - x3)) / (y43 * x21 - x43 * y21);\n return [ x1 + ua * x21, y1 + ua * y21 ];\n }\n function d3_geom_polygonClosed(coordinates) {\n var a = coordinates[0], b = coordinates[coordinates.length - 1];\n return !(a[0] - b[0] || a[1] - b[1]);\n }\n var d3_geom_voronoiEdges, d3_geom_voronoiCells, d3_geom_voronoiBeaches, d3_geom_voronoiBeachPool = [], d3_geom_voronoiFirstCircle, d3_geom_voronoiCircles, d3_geom_voronoiCirclePool = [];\n function d3_geom_voronoiBeach() {\n d3_geom_voronoiRedBlackNode(this);\n this.edge = this.site = this.circle = null;\n }\n function d3_geom_voronoiCreateBeach(site) {\n var beach = d3_geom_voronoiBeachPool.pop() || new d3_geom_voronoiBeach();\n beach.site = site;\n return beach;\n }\n function d3_geom_voronoiDetachBeach(beach) {\n d3_geom_voronoiDetachCircle(beach);\n d3_geom_voronoiBeaches.remove(beach);\n d3_geom_voronoiBeachPool.push(beach);\n d3_geom_voronoiRedBlackNode(beach);\n }\n function d3_geom_voronoiRemoveBeach(beach) {\n var circle = beach.circle, x = circle.x, y = circle.cy, vertex = {\n x: x,\n y: y\n }, previous = beach.P, next = beach.N, disappearing = [ beach ];\n d3_geom_voronoiDetachBeach(beach);\n var lArc = previous;\n while (lArc.circle && abs(x - lArc.circle.x) < ε && abs(y - lArc.circle.cy) < ε) {\n previous = lArc.P;\n disappearing.unshift(lArc);\n d3_geom_voronoiDetachBeach(lArc);\n lArc = previous;\n }\n disappearing.unshift(lArc);\n d3_geom_voronoiDetachCircle(lArc);\n var rArc = next;\n while (rArc.circle && abs(x - rArc.circle.x) < ε && abs(y - rArc.circle.cy) < ε) {\n next = rArc.N;\n disappearing.push(rArc);\n d3_geom_voronoiDetachBeach(rArc);\n rArc = next;\n }\n disappearing.push(rArc);\n d3_geom_voronoiDetachCircle(rArc);\n var nArcs = disappearing.length, iArc;\n for (iArc = 1; iArc < nArcs; ++iArc) {\n rArc = disappearing[iArc];\n lArc = disappearing[iArc - 1];\n d3_geom_voronoiSetEdgeEnd(rArc.edge, lArc.site, rArc.site, vertex);\n }\n lArc = disappearing[0];\n rArc = disappearing[nArcs - 1];\n rArc.edge = d3_geom_voronoiCreateEdge(lArc.site, rArc.site, null, vertex);\n d3_geom_voronoiAttachCircle(lArc);\n d3_geom_voronoiAttachCircle(rArc);\n }\n function d3_geom_voronoiAddBeach(site) {\n var x = site.x, directrix = site.y, lArc, rArc, dxl, dxr, node = d3_geom_voronoiBeaches._;\n while (node) {\n dxl = d3_geom_voronoiLeftBreakPoint(node, directrix) - x;\n if (dxl > ε) node = node.L; else {\n dxr = x - d3_geom_voronoiRightBreakPoint(node, directrix);\n if (dxr > ε) {\n if (!node.R) {\n lArc = node;\n break;\n }\n node = node.R;\n } else {\n if (dxl > -ε) {\n lArc = node.P;\n rArc = node;\n } else if (dxr > -ε) {\n lArc = node;\n rArc = node.N;\n } else {\n lArc = rArc = node;\n }\n break;\n }\n }\n }\n var newArc = d3_geom_voronoiCreateBeach(site);\n d3_geom_voronoiBeaches.insert(lArc, newArc);\n if (!lArc && !rArc) return;\n if (lArc === rArc) {\n d3_geom_voronoiDetachCircle(lArc);\n rArc = d3_geom_voronoiCreateBeach(lArc.site);\n d3_geom_voronoiBeaches.insert(newArc, rArc);\n newArc.edge = rArc.edge = d3_geom_voronoiCreateEdge(lArc.site, newArc.site);\n d3_geom_voronoiAttachCircle(lArc);\n d3_geom_voronoiAttachCircle(rArc);\n return;\n }\n if (!rArc) {\n newArc.edge = d3_geom_voronoiCreateEdge(lArc.site, newArc.site);\n return;\n }\n d3_geom_voronoiDetachCircle(lArc);\n d3_geom_voronoiDetachCircle(rArc);\n var lSite = lArc.site, ax = lSite.x, ay = lSite.y, bx = site.x - ax, by = site.y - ay, rSite = rArc.site, cx = rSite.x - ax, cy = rSite.y - ay, d = 2 * (bx * cy - by * cx), hb = bx * bx + by * by, hc = cx * cx + cy * cy, vertex = {\n x: (cy * hb - by * hc) / d + ax,\n y: (bx * hc - cx * hb) / d + ay\n };\n d3_geom_voronoiSetEdgeEnd(rArc.edge, lSite, rSite, vertex);\n newArc.edge = d3_geom_voronoiCreateEdge(lSite, site, null, vertex);\n rArc.edge = d3_geom_voronoiCreateEdge(site, rSite, null, vertex);\n d3_geom_voronoiAttachCircle(lArc);\n d3_geom_voronoiAttachCircle(rArc);\n }\n function d3_geom_voronoiLeftBreakPoint(arc, directrix) {\n var site = arc.site, rfocx = site.x, rfocy = site.y, pby2 = rfocy - directrix;\n if (!pby2) return rfocx;\n var lArc = arc.P;\n if (!lArc) return -Infinity;\n site = lArc.site;\n var lfocx = site.x, lfocy = site.y, plby2 = lfocy - directrix;\n if (!plby2) return lfocx;\n var hl = lfocx - rfocx, aby2 = 1 / pby2 - 1 / plby2, b = hl / plby2;\n if (aby2) return (-b + Math.sqrt(b * b - 2 * aby2 * (hl * hl / (-2 * plby2) - lfocy + plby2 / 2 + rfocy - pby2 / 2))) / aby2 + rfocx;\n return (rfocx + lfocx) / 2;\n }\n function d3_geom_voronoiRightBreakPoint(arc, directrix) {\n var rArc = arc.N;\n if (rArc) return d3_geom_voronoiLeftBreakPoint(rArc, directrix);\n var site = arc.site;\n return site.y === directrix ? site.x : Infinity;\n }\n function d3_geom_voronoiCell(site) {\n this.site = site;\n this.edges = [];\n }\n d3_geom_voronoiCell.prototype.prepare = function() {\n var halfEdges = this.edges, iHalfEdge = halfEdges.length, edge;\n while (iHalfEdge--) {\n edge = halfEdges[iHalfEdge].edge;\n if (!edge.b || !edge.a) halfEdges.splice(iHalfEdge, 1);\n }\n halfEdges.sort(d3_geom_voronoiHalfEdgeOrder);\n return halfEdges.length;\n };\n function d3_geom_voronoiCloseCells(extent) {\n var x0 = extent[0][0], x1 = extent[1][0], y0 = extent[0][1], y1 = extent[1][1], x2, y2, x3, y3, cells = d3_geom_voronoiCells, iCell = cells.length, cell, iHalfEdge, halfEdges, nHalfEdges, start, end;\n while (iCell--) {\n cell = cells[iCell];\n if (!cell || !cell.prepare()) continue;\n halfEdges = cell.edges;\n nHalfEdges = halfEdges.length;\n iHalfEdge = 0;\n while (iHalfEdge < nHalfEdges) {\n end = halfEdges[iHalfEdge].end(), x3 = end.x, y3 = end.y;\n start = halfEdges[++iHalfEdge % nHalfEdges].start(), x2 = start.x, y2 = start.y;\n if (abs(x3 - x2) > ε || abs(y3 - y2) > ε) {\n halfEdges.splice(iHalfEdge, 0, new d3_geom_voronoiHalfEdge(d3_geom_voronoiCreateBorderEdge(cell.site, end, abs(x3 - x0) < ε && y1 - y3 > ε ? {\n x: x0,\n y: abs(x2 - x0) < ε ? y2 : y1\n } : abs(y3 - y1) < ε && x1 - x3 > ε ? {\n x: abs(y2 - y1) < ε ? x2 : x1,\n y: y1\n } : abs(x3 - x1) < ε && y3 - y0 > ε ? {\n x: x1,\n y: abs(x2 - x1) < ε ? y2 : y0\n } : abs(y3 - y0) < ε && x3 - x0 > ε ? {\n x: abs(y2 - y0) < ε ? x2 : x0,\n y: y0\n } : null), cell.site, null));\n ++nHalfEdges;\n }\n }\n }\n }\n function d3_geom_voronoiHalfEdgeOrder(a, b) {\n return b.angle - a.angle;\n }\n function d3_geom_voronoiCircle() {\n d3_geom_voronoiRedBlackNode(this);\n this.x = this.y = this.arc = this.site = this.cy = null;\n }\n function d3_geom_voronoiAttachCircle(arc) {\n var lArc = arc.P, rArc = arc.N;\n if (!lArc || !rArc) return;\n var lSite = lArc.site, cSite = arc.site, rSite = rArc.site;\n if (lSite === rSite) return;\n var bx = cSite.x, by = cSite.y, ax = lSite.x - bx, ay = lSite.y - by, cx = rSite.x - bx, cy = rSite.y - by;\n var d = 2 * (ax * cy - ay * cx);\n if (d >= -ε2) return;\n var ha = ax * ax + ay * ay, hc = cx * cx + cy * cy, x = (cy * ha - ay * hc) / d, y = (ax * hc - cx * ha) / d, cy = y + by;\n var circle = d3_geom_voronoiCirclePool.pop() || new d3_geom_voronoiCircle();\n circle.arc = arc;\n circle.site = cSite;\n circle.x = x + bx;\n circle.y = cy + Math.sqrt(x * x + y * y);\n circle.cy = cy;\n arc.circle = circle;\n var before = null, node = d3_geom_voronoiCircles._;\n while (node) {\n if (circle.y < node.y || circle.y === node.y && circle.x <= node.x) {\n if (node.L) node = node.L; else {\n before = node.P;\n break;\n }\n } else {\n if (node.R) node = node.R; else {\n before = node;\n break;\n }\n }\n }\n d3_geom_voronoiCircles.insert(before, circle);\n if (!before) d3_geom_voronoiFirstCircle = circle;\n }\n function d3_geom_voronoiDetachCircle(arc) {\n var circle = arc.circle;\n if (circle) {\n if (!circle.P) d3_geom_voronoiFirstCircle = circle.N;\n d3_geom_voronoiCircles.remove(circle);\n d3_geom_voronoiCirclePool.push(circle);\n d3_geom_voronoiRedBlackNode(circle);\n arc.circle = null;\n }\n }\n function d3_geom_voronoiClipEdges(extent) {\n var edges = d3_geom_voronoiEdges, clip = d3_geom_clipLine(extent[0][0], extent[0][1], extent[1][0], extent[1][1]), i = edges.length, e;\n while (i--) {\n e = edges[i];\n if (!d3_geom_voronoiConnectEdge(e, extent) || !clip(e) || abs(e.a.x - e.b.x) < ε && abs(e.a.y - e.b.y) < ε) {\n e.a = e.b = null;\n edges.splice(i, 1);\n }\n }\n }\n function d3_geom_voronoiConnectEdge(edge, extent) {\n var vb = edge.b;\n if (vb) return true;\n var va = edge.a, x0 = extent[0][0], x1 = extent[1][0], y0 = extent[0][1], y1 = extent[1][1], lSite = edge.l, rSite = edge.r, lx = lSite.x, ly = lSite.y, rx = rSite.x, ry = rSite.y, fx = (lx + rx) / 2, fy = (ly + ry) / 2, fm, fb;\n if (ry === ly) {\n if (fx < x0 || fx >= x1) return;\n if (lx > rx) {\n if (!va) va = {\n x: fx,\n y: y0\n }; else if (va.y >= y1) return;\n vb = {\n x: fx,\n y: y1\n };\n } else {\n if (!va) va = {\n x: fx,\n y: y1\n }; else if (va.y < y0) return;\n vb = {\n x: fx,\n y: y0\n };\n }\n } else {\n fm = (lx - rx) / (ry - ly);\n fb = fy - fm * fx;\n if (fm < -1 || fm > 1) {\n if (lx > rx) {\n if (!va) va = {\n x: (y0 - fb) / fm,\n y: y0\n }; else if (va.y >= y1) return;\n vb = {\n x: (y1 - fb) / fm,\n y: y1\n };\n } else {\n if (!va) va = {\n x: (y1 - fb) / fm,\n y: y1\n }; else if (va.y < y0) return;\n vb = {\n x: (y0 - fb) / fm,\n y: y0\n };\n }\n } else {\n if (ly < ry) {\n if (!va) va = {\n x: x0,\n y: fm * x0 + fb\n }; else if (va.x >= x1) return;\n vb = {\n x: x1,\n y: fm * x1 + fb\n };\n } else {\n if (!va) va = {\n x: x1,\n y: fm * x1 + fb\n }; else if (va.x < x0) return;\n vb = {\n x: x0,\n y: fm * x0 + fb\n };\n }\n }\n }\n edge.a = va;\n edge.b = vb;\n return true;\n }\n function d3_geom_voronoiEdge(lSite, rSite) {\n this.l = lSite;\n this.r = rSite;\n this.a = this.b = null;\n }\n function d3_geom_voronoiCreateEdge(lSite, rSite, va, vb) {\n var edge = new d3_geom_voronoiEdge(lSite, rSite);\n d3_geom_voronoiEdges.push(edge);\n if (va) d3_geom_voronoiSetEdgeEnd(edge, lSite, rSite, va);\n if (vb) d3_geom_voronoiSetEdgeEnd(edge, rSite, lSite, vb);\n d3_geom_voronoiCells[lSite.i].edges.push(new d3_geom_voronoiHalfEdge(edge, lSite, rSite));\n d3_geom_voronoiCells[rSite.i].edges.push(new d3_geom_voronoiHalfEdge(edge, rSite, lSite));\n return edge;\n }\n function d3_geom_voronoiCreateBorderEdge(lSite, va, vb) {\n var edge = new d3_geom_voronoiEdge(lSite, null);\n edge.a = va;\n edge.b = vb;\n d3_geom_voronoiEdges.push(edge);\n return edge;\n }\n function d3_geom_voronoiSetEdgeEnd(edge, lSite, rSite, vertex) {\n if (!edge.a && !edge.b) {\n edge.a = vertex;\n edge.l = lSite;\n edge.r = rSite;\n } else if (edge.l === rSite) {\n edge.b = vertex;\n } else {\n edge.a = vertex;\n }\n }\n function d3_geom_voronoiHalfEdge(edge, lSite, rSite) {\n var va = edge.a, vb = edge.b;\n this.edge = edge;\n this.site = lSite;\n this.angle = rSite ? Math.atan2(rSite.y - lSite.y, rSite.x - lSite.x) : edge.l === lSite ? Math.atan2(vb.x - va.x, va.y - vb.y) : Math.atan2(va.x - vb.x, vb.y - va.y);\n }\n d3_geom_voronoiHalfEdge.prototype = {\n start: function() {\n return this.edge.l === this.site ? this.edge.a : this.edge.b;\n },\n end: function() {\n return this.edge.l === this.site ? this.edge.b : this.edge.a;\n }\n };\n function d3_geom_voronoiRedBlackTree() {\n this._ = null;\n }\n function d3_geom_voronoiRedBlackNode(node) {\n node.U = node.C = node.L = node.R = node.P = node.N = null;\n }\n d3_geom_voronoiRedBlackTree.prototype = {\n insert: function(after, node) {\n var parent, grandpa, uncle;\n if (after) {\n node.P = after;\n node.N = after.N;\n if (after.N) after.N.P = node;\n after.N = node;\n if (after.R) {\n after = after.R;\n while (after.L) after = after.L;\n after.L = node;\n } else {\n after.R = node;\n }\n parent = after;\n } else if (this._) {\n after = d3_geom_voronoiRedBlackFirst(this._);\n node.P = null;\n node.N = after;\n after.P = after.L = node;\n parent = after;\n } else {\n node.P = node.N = null;\n this._ = node;\n parent = null;\n }\n node.L = node.R = null;\n node.U = parent;\n node.C = true;\n after = node;\n while (parent && parent.C) {\n grandpa = parent.U;\n if (parent === grandpa.L) {\n uncle = grandpa.R;\n if (uncle && uncle.C) {\n parent.C = uncle.C = false;\n grandpa.C = true;\n after = grandpa;\n } else {\n if (after === parent.R) {\n d3_geom_voronoiRedBlackRotateLeft(this, parent);\n after = parent;\n parent = after.U;\n }\n parent.C = false;\n grandpa.C = true;\n d3_geom_voronoiRedBlackRotateRight(this, grandpa);\n }\n } else {\n uncle = grandpa.L;\n if (uncle && uncle.C) {\n parent.C = uncle.C = false;\n grandpa.C = true;\n after = grandpa;\n } else {\n if (after === parent.L) {\n d3_geom_voronoiRedBlackRotateRight(this, parent);\n after = parent;\n parent = after.U;\n }\n parent.C = false;\n grandpa.C = true;\n d3_geom_voronoiRedBlackRotateLeft(this, grandpa);\n }\n }\n parent = after.U;\n }\n this._.C = false;\n },\n remove: function(node) {\n if (node.N) node.N.P = node.P;\n if (node.P) node.P.N = node.N;\n node.N = node.P = null;\n var parent = node.U, sibling, left = node.L, right = node.R, next, red;\n if (!left) next = right; else if (!right) next = left; else next = d3_geom_voronoiRedBlackFirst(right);\n if (parent) {\n if (parent.L === node) parent.L = next; else parent.R = next;\n } else {\n this._ = next;\n }\n if (left && right) {\n red = next.C;\n next.C = node.C;\n next.L = left;\n left.U = next;\n if (next !== right) {\n parent = next.U;\n next.U = node.U;\n node = next.R;\n parent.L = node;\n next.R = right;\n right.U = next;\n } else {\n next.U = parent;\n parent = next;\n node = next.R;\n }\n } else {\n red = node.C;\n node = next;\n }\n if (node) node.U = parent;\n if (red) return;\n if (node && node.C) {\n node.C = false;\n return;\n }\n do {\n if (node === this._) break;\n if (node === parent.L) {\n sibling = parent.R;\n if (sibling.C) {\n sibling.C = false;\n parent.C = true;\n d3_geom_voronoiRedBlackRotateLeft(this, parent);\n sibling = parent.R;\n }\n if (sibling.L && sibling.L.C || sibling.R && sibling.R.C) {\n if (!sibling.R || !sibling.R.C) {\n sibling.L.C = false;\n sibling.C = true;\n d3_geom_voronoiRedBlackRotateRight(this, sibling);\n sibling = parent.R;\n }\n sibling.C = parent.C;\n parent.C = sibling.R.C = false;\n d3_geom_voronoiRedBlackRotateLeft(this, parent);\n node = this._;\n break;\n }\n } else {\n sibling = parent.L;\n if (sibling.C) {\n sibling.C = false;\n parent.C = true;\n d3_geom_voronoiRedBlackRotateRight(this, parent);\n sibling = parent.L;\n }\n if (sibling.L && sibling.L.C || sibling.R && sibling.R.C) {\n if (!sibling.L || !sibling.L.C) {\n sibling.R.C = false;\n sibling.C = true;\n d3_geom_voronoiRedBlackRotateLeft(this, sibling);\n sibling = parent.L;\n }\n sibling.C = parent.C;\n parent.C = sibling.L.C = false;\n d3_geom_voronoiRedBlackRotateRight(this, parent);\n node = this._;\n break;\n }\n }\n sibling.C = true;\n node = parent;\n parent = parent.U;\n } while (!node.C);\n if (node) node.C = false;\n }\n };\n function d3_geom_voronoiRedBlackRotateLeft(tree, node) {\n var p = node, q = node.R, parent = p.U;\n if (parent) {\n if (parent.L === p) parent.L = q; else parent.R = q;\n } else {\n tree._ = q;\n }\n q.U = parent;\n p.U = q;\n p.R = q.L;\n if (p.R) p.R.U = p;\n q.L = p;\n }\n function d3_geom_voronoiRedBlackRotateRight(tree, node) {\n var p = node, q = node.L, parent = p.U;\n if (parent) {\n if (parent.L === p) parent.L = q; else parent.R = q;\n } else {\n tree._ = q;\n }\n q.U = parent;\n p.U = q;\n p.L = q.R;\n if (p.L) p.L.U = p;\n q.R = p;\n }\n function d3_geom_voronoiRedBlackFirst(node) {\n while (node.L) node = node.L;\n return node;\n }\n function d3_geom_voronoi(sites, bbox) {\n var site = sites.sort(d3_geom_voronoiVertexOrder).pop(), x0, y0, circle;\n d3_geom_voronoiEdges = [];\n d3_geom_voronoiCells = new Array(sites.length);\n d3_geom_voronoiBeaches = new d3_geom_voronoiRedBlackTree();\n d3_geom_voronoiCircles = new d3_geom_voronoiRedBlackTree();\n while (true) {\n circle = d3_geom_voronoiFirstCircle;\n if (site && (!circle || site.y < circle.y || site.y === circle.y && site.x < circle.x)) {\n if (site.x !== x0 || site.y !== y0) {\n d3_geom_voronoiCells[site.i] = new d3_geom_voronoiCell(site);\n d3_geom_voronoiAddBeach(site);\n x0 = site.x, y0 = site.y;\n }\n site = sites.pop();\n } else if (circle) {\n d3_geom_voronoiRemoveBeach(circle.arc);\n } else {\n break;\n }\n }\n if (bbox) d3_geom_voronoiClipEdges(bbox), d3_geom_voronoiCloseCells(bbox);\n var diagram = {\n cells: d3_geom_voronoiCells,\n edges: d3_geom_voronoiEdges\n };\n d3_geom_voronoiBeaches = d3_geom_voronoiCircles = d3_geom_voronoiEdges = d3_geom_voronoiCells = null;\n return diagram;\n }\n function d3_geom_voronoiVertexOrder(a, b) {\n return b.y - a.y || b.x - a.x;\n }\n d3.geom.voronoi = function(points) {\n var x = d3_geom_pointX, y = d3_geom_pointY, fx = x, fy = y, clipExtent = d3_geom_voronoiClipExtent;\n if (points) return voronoi(points);\n function voronoi(data) {\n var polygons = new Array(data.length), x0 = clipExtent[0][0], y0 = clipExtent[0][1], x1 = clipExtent[1][0], y1 = clipExtent[1][1];\n d3_geom_voronoi(sites(data), clipExtent).cells.forEach(function(cell, i) {\n var edges = cell.edges, site = cell.site, polygon = polygons[i] = edges.length ? edges.map(function(e) {\n var s = e.start();\n return [ s.x, s.y ];\n }) : site.x >= x0 && site.x <= x1 && site.y >= y0 && site.y <= y1 ? [ [ x0, y1 ], [ x1, y1 ], [ x1, y0 ], [ x0, y0 ] ] : [];\n polygon.point = data[i];\n });\n return polygons;\n }\n function sites(data) {\n return data.map(function(d, i) {\n return {\n x: Math.round(fx(d, i) / ε) * ε,\n y: Math.round(fy(d, i) / ε) * ε,\n i: i\n };\n });\n }\n voronoi.links = function(data) {\n return d3_geom_voronoi(sites(data)).edges.filter(function(edge) {\n return edge.l && edge.r;\n }).map(function(edge) {\n return {\n source: data[edge.l.i],\n target: data[edge.r.i]\n };\n });\n };\n voronoi.triangles = function(data) {\n var triangles = [];\n d3_geom_voronoi(sites(data)).cells.forEach(function(cell, i) {\n var site = cell.site, edges = cell.edges.sort(d3_geom_voronoiHalfEdgeOrder), j = -1, m = edges.length, e0, s0, e1 = edges[m - 1].edge, s1 = e1.l === site ? e1.r : e1.l;\n while (++j < m) {\n e0 = e1;\n s0 = s1;\n e1 = edges[j].edge;\n s1 = e1.l === site ? e1.r : e1.l;\n if (i < s0.i && i < s1.i && d3_geom_voronoiTriangleArea(site, s0, s1) < 0) {\n triangles.push([ data[i], data[s0.i], data[s1.i] ]);\n }\n }\n });\n return triangles;\n };\n voronoi.x = function(_) {\n return arguments.length ? (fx = d3_functor(x = _), voronoi) : x;\n };\n voronoi.y = function(_) {\n return arguments.length ? (fy = d3_functor(y = _), voronoi) : y;\n };\n voronoi.clipExtent = function(_) {\n if (!arguments.length) return clipExtent === d3_geom_voronoiClipExtent ? null : clipExtent;\n clipExtent = _ == null ? d3_geom_voronoiClipExtent : _;\n return voronoi;\n };\n voronoi.size = function(_) {\n if (!arguments.length) return clipExtent === d3_geom_voronoiClipExtent ? null : clipExtent && clipExtent[1];\n return voronoi.clipExtent(_ && [ [ 0, 0 ], _ ]);\n };\n return voronoi;\n };\n var d3_geom_voronoiClipExtent = [ [ -1e6, -1e6 ], [ 1e6, 1e6 ] ];\n function d3_geom_voronoiTriangleArea(a, b, c) {\n return (a.x - c.x) * (b.y - a.y) - (a.x - b.x) * (c.y - a.y);\n }\n d3.geom.delaunay = function(vertices) {\n return d3.geom.voronoi().triangles(vertices);\n };\n d3.geom.quadtree = function(points, x1, y1, x2, y2) {\n var x = d3_geom_pointX, y = d3_geom_pointY, compat;\n if (compat = arguments.length) {\n x = d3_geom_quadtreeCompatX;\n y = d3_geom_quadtreeCompatY;\n if (compat === 3) {\n y2 = y1;\n x2 = x1;\n y1 = x1 = 0;\n }\n return quadtree(points);\n }\n function quadtree(data) {\n var d, fx = d3_functor(x), fy = d3_functor(y), xs, ys, i, n, x1_, y1_, x2_, y2_;\n if (x1 != null) {\n x1_ = x1, y1_ = y1, x2_ = x2, y2_ = y2;\n } else {\n x2_ = y2_ = -(x1_ = y1_ = Infinity);\n xs = [], ys = [];\n n = data.length;\n if (compat) for (i = 0; i < n; ++i) {\n d = data[i];\n if (d.x < x1_) x1_ = d.x;\n if (d.y < y1_) y1_ = d.y;\n if (d.x > x2_) x2_ = d.x;\n if (d.y > y2_) y2_ = d.y;\n xs.push(d.x);\n ys.push(d.y);\n } else for (i = 0; i < n; ++i) {\n var x_ = +fx(d = data[i], i), y_ = +fy(d, i);\n if (x_ < x1_) x1_ = x_;\n if (y_ < y1_) y1_ = y_;\n if (x_ > x2_) x2_ = x_;\n if (y_ > y2_) y2_ = y_;\n xs.push(x_);\n ys.push(y_);\n }\n }\n var dx = x2_ - x1_, dy = y2_ - y1_;\n if (dx > dy) y2_ = y1_ + dx; else x2_ = x1_ + dy;\n function insert(n, d, x, y, x1, y1, x2, y2) {\n if (isNaN(x) || isNaN(y)) return;\n if (n.leaf) {\n var nx = n.x, ny = n.y;\n if (nx != null) {\n if (abs(nx - x) + abs(ny - y) < .01) {\n insertChild(n, d, x, y, x1, y1, x2, y2);\n } else {\n var nPoint = n.point;\n n.x = n.y = n.point = null;\n insertChild(n, nPoint, nx, ny, x1, y1, x2, y2);\n insertChild(n, d, x, y, x1, y1, x2, y2);\n }\n } else {\n n.x = x, n.y = y, n.point = d;\n }\n } else {\n insertChild(n, d, x, y, x1, y1, x2, y2);\n }\n }\n function insertChild(n, d, x, y, x1, y1, x2, y2) {\n var xm = (x1 + x2) * .5, ym = (y1 + y2) * .5, right = x >= xm, below = y >= ym, i = below << 1 | right;\n n.leaf = false;\n n = n.nodes[i] || (n.nodes[i] = d3_geom_quadtreeNode());\n if (right) x1 = xm; else x2 = xm;\n if (below) y1 = ym; else y2 = ym;\n insert(n, d, x, y, x1, y1, x2, y2);\n }\n var root = d3_geom_quadtreeNode();\n root.add = function(d) {\n insert(root, d, +fx(d, ++i), +fy(d, i), x1_, y1_, x2_, y2_);\n };\n root.visit = function(f) {\n d3_geom_quadtreeVisit(f, root, x1_, y1_, x2_, y2_);\n };\n root.find = function(point) {\n return d3_geom_quadtreeFind(root, point[0], point[1], x1_, y1_, x2_, y2_);\n };\n i = -1;\n if (x1 == null) {\n while (++i < n) {\n insert(root, data[i], xs[i], ys[i], x1_, y1_, x2_, y2_);\n }\n --i;\n } else data.forEach(root.add);\n xs = ys = data = d = null;\n return root;\n }\n quadtree.x = function(_) {\n return arguments.length ? (x = _, quadtree) : x;\n };\n quadtree.y = function(_) {\n return arguments.length ? (y = _, quadtree) : y;\n };\n quadtree.extent = function(_) {\n if (!arguments.length) return x1 == null ? null : [ [ x1, y1 ], [ x2, y2 ] ];\n if (_ == null) x1 = y1 = x2 = y2 = null; else x1 = +_[0][0], y1 = +_[0][1], x2 = +_[1][0], \n y2 = +_[1][1];\n return quadtree;\n };\n quadtree.size = function(_) {\n if (!arguments.length) return x1 == null ? null : [ x2 - x1, y2 - y1 ];\n if (_ == null) x1 = y1 = x2 = y2 = null; else x1 = y1 = 0, x2 = +_[0], y2 = +_[1];\n return quadtree;\n };\n return quadtree;\n };\n function d3_geom_quadtreeCompatX(d) {\n return d.x;\n }\n function d3_geom_quadtreeCompatY(d) {\n return d.y;\n }\n function d3_geom_quadtreeNode() {\n return {\n leaf: true,\n nodes: [],\n point: null,\n x: null,\n y: null\n };\n }\n function d3_geom_quadtreeVisit(f, node, x1, y1, x2, y2) {\n if (!f(node, x1, y1, x2, y2)) {\n var sx = (x1 + x2) * .5, sy = (y1 + y2) * .5, children = node.nodes;\n if (children[0]) d3_geom_quadtreeVisit(f, children[0], x1, y1, sx, sy);\n if (children[1]) d3_geom_quadtreeVisit(f, children[1], sx, y1, x2, sy);\n if (children[2]) d3_geom_quadtreeVisit(f, children[2], x1, sy, sx, y2);\n if (children[3]) d3_geom_quadtreeVisit(f, children[3], sx, sy, x2, y2);\n }\n }\n function d3_geom_quadtreeFind(root, x, y, x0, y0, x3, y3) {\n var minDistance2 = Infinity, closestPoint;\n (function find(node, x1, y1, x2, y2) {\n if (x1 > x3 || y1 > y3 || x2 < x0 || y2 < y0) return;\n if (point = node.point) {\n var point, dx = x - node.x, dy = y - node.y, distance2 = dx * dx + dy * dy;\n if (distance2 < minDistance2) {\n var distance = Math.sqrt(minDistance2 = distance2);\n x0 = x - distance, y0 = y - distance;\n x3 = x + distance, y3 = y + distance;\n closestPoint = point;\n }\n }\n var children = node.nodes, xm = (x1 + x2) * .5, ym = (y1 + y2) * .5, right = x >= xm, below = y >= ym;\n for (var i = below << 1 | right, j = i + 4; i < j; ++i) {\n if (node = children[i & 3]) switch (i & 3) {\n case 0:\n find(node, x1, y1, xm, ym);\n break;\n\n case 1:\n find(node, xm, y1, x2, ym);\n break;\n\n case 2:\n find(node, x1, ym, xm, y2);\n break;\n\n case 3:\n find(node, xm, ym, x2, y2);\n break;\n }\n }\n })(root, x0, y0, x3, y3);\n return closestPoint;\n }\n d3.interpolateRgb = d3_interpolateRgb;\n function d3_interpolateRgb(a, b) {\n a = d3.rgb(a);\n b = d3.rgb(b);\n var ar = a.r, ag = a.g, ab = a.b, br = b.r - ar, bg = b.g - ag, bb = b.b - ab;\n return function(t) {\n return \"#\" + d3_rgb_hex(Math.round(ar + br * t)) + d3_rgb_hex(Math.round(ag + bg * t)) + d3_rgb_hex(Math.round(ab + bb * t));\n };\n }\n d3.interpolateObject = d3_interpolateObject;\n function d3_interpolateObject(a, b) {\n var i = {}, c = {}, k;\n for (k in a) {\n if (k in b) {\n i[k] = d3_interpolate(a[k], b[k]);\n } else {\n c[k] = a[k];\n }\n }\n for (k in b) {\n if (!(k in a)) {\n c[k] = b[k];\n }\n }\n return function(t) {\n for (k in i) c[k] = i[k](t);\n return c;\n };\n }\n d3.interpolateNumber = d3_interpolateNumber;\n function d3_interpolateNumber(a, b) {\n a = +a, b = +b;\n return function(t) {\n return a * (1 - t) + b * t;\n };\n }\n d3.interpolateString = d3_interpolateString;\n function d3_interpolateString(a, b) {\n var bi = d3_interpolate_numberA.lastIndex = d3_interpolate_numberB.lastIndex = 0, am, bm, bs, i = -1, s = [], q = [];\n a = a + \"\", b = b + \"\";\n while ((am = d3_interpolate_numberA.exec(a)) && (bm = d3_interpolate_numberB.exec(b))) {\n if ((bs = bm.index) > bi) {\n bs = b.slice(bi, bs);\n if (s[i]) s[i] += bs; else s[++i] = bs;\n }\n if ((am = am[0]) === (bm = bm[0])) {\n if (s[i]) s[i] += bm; else s[++i] = bm;\n } else {\n s[++i] = null;\n q.push({\n i: i,\n x: d3_interpolateNumber(am, bm)\n });\n }\n bi = d3_interpolate_numberB.lastIndex;\n }\n if (bi < b.length) {\n bs = b.slice(bi);\n if (s[i]) s[i] += bs; else s[++i] = bs;\n }\n return s.length < 2 ? q[0] ? (b = q[0].x, function(t) {\n return b(t) + \"\";\n }) : function() {\n return b;\n } : (b = q.length, function(t) {\n for (var i = 0, o; i < b; ++i) s[(o = q[i]).i] = o.x(t);\n return s.join(\"\");\n });\n }\n var d3_interpolate_numberA = /[-+]?(?:\\d+\\.?\\d*|\\.?\\d+)(?:[eE][-+]?\\d+)?/g, d3_interpolate_numberB = new RegExp(d3_interpolate_numberA.source, \"g\");\n d3.interpolate = d3_interpolate;\n function d3_interpolate(a, b) {\n var i = d3.interpolators.length, f;\n while (--i >= 0 && !(f = d3.interpolators[i](a, b))) ;\n return f;\n }\n d3.interpolators = [ function(a, b) {\n var t = typeof b;\n return (t === \"string\" ? d3_rgb_names.has(b.toLowerCase()) || /^(#|rgb\\(|hsl\\()/i.test(b) ? d3_interpolateRgb : d3_interpolateString : b instanceof d3_color ? d3_interpolateRgb : Array.isArray(b) ? d3_interpolateArray : t === \"object\" && isNaN(b) ? d3_interpolateObject : d3_interpolateNumber)(a, b);\n } ];\n d3.interpolateArray = d3_interpolateArray;\n function d3_interpolateArray(a, b) {\n var x = [], c = [], na = a.length, nb = b.length, n0 = Math.min(a.length, b.length), i;\n for (i = 0; i < n0; ++i) x.push(d3_interpolate(a[i], b[i]));\n for (;i < na; ++i) c[i] = a[i];\n for (;i < nb; ++i) c[i] = b[i];\n return function(t) {\n for (i = 0; i < n0; ++i) c[i] = x[i](t);\n return c;\n };\n }\n var d3_ease_default = function() {\n return d3_identity;\n };\n var d3_ease = d3.map({\n linear: d3_ease_default,\n poly: d3_ease_poly,\n quad: function() {\n return d3_ease_quad;\n },\n cubic: function() {\n return d3_ease_cubic;\n },\n sin: function() {\n return d3_ease_sin;\n },\n exp: function() {\n return d3_ease_exp;\n },\n circle: function() {\n return d3_ease_circle;\n },\n elastic: d3_ease_elastic,\n back: d3_ease_back,\n bounce: function() {\n return d3_ease_bounce;\n }\n });\n var d3_ease_mode = d3.map({\n \"in\": d3_identity,\n out: d3_ease_reverse,\n \"in-out\": d3_ease_reflect,\n \"out-in\": function(f) {\n return d3_ease_reflect(d3_ease_reverse(f));\n }\n });\n d3.ease = function(name) {\n var i = name.indexOf(\"-\"), t = i >= 0 ? name.slice(0, i) : name, m = i >= 0 ? name.slice(i + 1) : \"in\";\n t = d3_ease.get(t) || d3_ease_default;\n m = d3_ease_mode.get(m) || d3_identity;\n return d3_ease_clamp(m(t.apply(null, d3_arraySlice.call(arguments, 1))));\n };\n function d3_ease_clamp(f) {\n return function(t) {\n return t <= 0 ? 0 : t >= 1 ? 1 : f(t);\n };\n }\n function d3_ease_reverse(f) {\n return function(t) {\n return 1 - f(1 - t);\n };\n }\n function d3_ease_reflect(f) {\n return function(t) {\n return .5 * (t < .5 ? f(2 * t) : 2 - f(2 - 2 * t));\n };\n }\n function d3_ease_quad(t) {\n return t * t;\n }\n function d3_ease_cubic(t) {\n return t * t * t;\n }\n function d3_ease_cubicInOut(t) {\n if (t <= 0) return 0;\n if (t >= 1) return 1;\n var t2 = t * t, t3 = t2 * t;\n return 4 * (t < .5 ? t3 : 3 * (t - t2) + t3 - .75);\n }\n function d3_ease_poly(e) {\n return function(t) {\n return Math.pow(t, e);\n };\n }\n function d3_ease_sin(t) {\n return 1 - Math.cos(t * halfπ);\n }\n function d3_ease_exp(t) {\n return Math.pow(2, 10 * (t - 1));\n }\n function d3_ease_circle(t) {\n return 1 - Math.sqrt(1 - t * t);\n }\n function d3_ease_elastic(a, p) {\n var s;\n if (arguments.length < 2) p = .45;\n if (arguments.length) s = p / τ * Math.asin(1 / a); else a = 1, s = p / 4;\n return function(t) {\n return 1 + a * Math.pow(2, -10 * t) * Math.sin((t - s) * τ / p);\n };\n }\n function d3_ease_back(s) {\n if (!s) s = 1.70158;\n return function(t) {\n return t * t * ((s + 1) * t - s);\n };\n }\n function d3_ease_bounce(t) {\n return t < 1 / 2.75 ? 7.5625 * t * t : t < 2 / 2.75 ? 7.5625 * (t -= 1.5 / 2.75) * t + .75 : t < 2.5 / 2.75 ? 7.5625 * (t -= 2.25 / 2.75) * t + .9375 : 7.5625 * (t -= 2.625 / 2.75) * t + .984375;\n }\n d3.interpolateHcl = d3_interpolateHcl;\n function d3_interpolateHcl(a, b) {\n a = d3.hcl(a);\n b = d3.hcl(b);\n var ah = a.h, ac = a.c, al = a.l, bh = b.h - ah, bc = b.c - ac, bl = b.l - al;\n if (isNaN(bc)) bc = 0, ac = isNaN(ac) ? b.c : ac;\n if (isNaN(bh)) bh = 0, ah = isNaN(ah) ? b.h : ah; else if (bh > 180) bh -= 360; else if (bh < -180) bh += 360;\n return function(t) {\n return d3_hcl_lab(ah + bh * t, ac + bc * t, al + bl * t) + \"\";\n };\n }\n d3.interpolateHsl = d3_interpolateHsl;\n function d3_interpolateHsl(a, b) {\n a = d3.hsl(a);\n b = d3.hsl(b);\n var ah = a.h, as = a.s, al = a.l, bh = b.h - ah, bs = b.s - as, bl = b.l - al;\n if (isNaN(bs)) bs = 0, as = isNaN(as) ? b.s : as;\n if (isNaN(bh)) bh = 0, ah = isNaN(ah) ? b.h : ah; else if (bh > 180) bh -= 360; else if (bh < -180) bh += 360;\n return function(t) {\n return d3_hsl_rgb(ah + bh * t, as + bs * t, al + bl * t) + \"\";\n };\n }\n d3.interpolateLab = d3_interpolateLab;\n function d3_interpolateLab(a, b) {\n a = d3.lab(a);\n b = d3.lab(b);\n var al = a.l, aa = a.a, ab = a.b, bl = b.l - al, ba = b.a - aa, bb = b.b - ab;\n return function(t) {\n return d3_lab_rgb(al + bl * t, aa + ba * t, ab + bb * t) + \"\";\n };\n }\n d3.interpolateRound = d3_interpolateRound;\n function d3_interpolateRound(a, b) {\n b -= a;\n return function(t) {\n return Math.round(a + b * t);\n };\n }\n d3.transform = function(string) {\n var g = d3_document.createElementNS(d3.ns.prefix.svg, \"g\");\n return (d3.transform = function(string) {\n if (string != null) {\n g.setAttribute(\"transform\", string);\n var t = g.transform.baseVal.consolidate();\n }\n return new d3_transform(t ? t.matrix : d3_transformIdentity);\n })(string);\n };\n function d3_transform(m) {\n var r0 = [ m.a, m.b ], r1 = [ m.c, m.d ], kx = d3_transformNormalize(r0), kz = d3_transformDot(r0, r1), ky = d3_transformNormalize(d3_transformCombine(r1, r0, -kz)) || 0;\n if (r0[0] * r1[1] < r1[0] * r0[1]) {\n r0[0] *= -1;\n r0[1] *= -1;\n kx *= -1;\n kz *= -1;\n }\n this.rotate = (kx ? Math.atan2(r0[1], r0[0]) : Math.atan2(-r1[0], r1[1])) * d3_degrees;\n this.translate = [ m.e, m.f ];\n this.scale = [ kx, ky ];\n this.skew = ky ? Math.atan2(kz, ky) * d3_degrees : 0;\n }\n d3_transform.prototype.toString = function() {\n return \"translate(\" + this.translate + \")rotate(\" + this.rotate + \")skewX(\" + this.skew + \")scale(\" + this.scale + \")\";\n };\n function d3_transformDot(a, b) {\n return a[0] * b[0] + a[1] * b[1];\n }\n function d3_transformNormalize(a) {\n var k = Math.sqrt(d3_transformDot(a, a));\n if (k) {\n a[0] /= k;\n a[1] /= k;\n }\n return k;\n }\n function d3_transformCombine(a, b, k) {\n a[0] += k * b[0];\n a[1] += k * b[1];\n return a;\n }\n var d3_transformIdentity = {\n a: 1,\n b: 0,\n c: 0,\n d: 1,\n e: 0,\n f: 0\n };\n d3.interpolateTransform = d3_interpolateTransform;\n function d3_interpolateTransformPop(s) {\n return s.length ? s.pop() + \",\" : \"\";\n }\n function d3_interpolateTranslate(ta, tb, s, q) {\n if (ta[0] !== tb[0] || ta[1] !== tb[1]) {\n var i = s.push(\"translate(\", null, \",\", null, \")\");\n q.push({\n i: i - 4,\n x: d3_interpolateNumber(ta[0], tb[0])\n }, {\n i: i - 2,\n x: d3_interpolateNumber(ta[1], tb[1])\n });\n } else if (tb[0] || tb[1]) {\n s.push(\"translate(\" + tb + \")\");\n }\n }\n function d3_interpolateRotate(ra, rb, s, q) {\n if (ra !== rb) {\n if (ra - rb > 180) rb += 360; else if (rb - ra > 180) ra += 360;\n q.push({\n i: s.push(d3_interpolateTransformPop(s) + \"rotate(\", null, \")\") - 2,\n x: d3_interpolateNumber(ra, rb)\n });\n } else if (rb) {\n s.push(d3_interpolateTransformPop(s) + \"rotate(\" + rb + \")\");\n }\n }\n function d3_interpolateSkew(wa, wb, s, q) {\n if (wa !== wb) {\n q.push({\n i: s.push(d3_interpolateTransformPop(s) + \"skewX(\", null, \")\") - 2,\n x: d3_interpolateNumber(wa, wb)\n });\n } else if (wb) {\n s.push(d3_interpolateTransformPop(s) + \"skewX(\" + wb + \")\");\n }\n }\n function d3_interpolateScale(ka, kb, s, q) {\n if (ka[0] !== kb[0] || ka[1] !== kb[1]) {\n var i = s.push(d3_interpolateTransformPop(s) + \"scale(\", null, \",\", null, \")\");\n q.push({\n i: i - 4,\n x: d3_interpolateNumber(ka[0], kb[0])\n }, {\n i: i - 2,\n x: d3_interpolateNumber(ka[1], kb[1])\n });\n } else if (kb[0] !== 1 || kb[1] !== 1) {\n s.push(d3_interpolateTransformPop(s) + \"scale(\" + kb + \")\");\n }\n }\n function d3_interpolateTransform(a, b) {\n var s = [], q = [];\n a = d3.transform(a), b = d3.transform(b);\n d3_interpolateTranslate(a.translate, b.translate, s, q);\n d3_interpolateRotate(a.rotate, b.rotate, s, q);\n d3_interpolateSkew(a.skew, b.skew, s, q);\n d3_interpolateScale(a.scale, b.scale, s, q);\n a = b = null;\n return function(t) {\n var i = -1, n = q.length, o;\n while (++i < n) s[(o = q[i]).i] = o.x(t);\n return s.join(\"\");\n };\n }\n function d3_uninterpolateNumber(a, b) {\n b = (b -= a = +a) || 1 / b;\n return function(x) {\n return (x - a) / b;\n };\n }\n function d3_uninterpolateClamp(a, b) {\n b = (b -= a = +a) || 1 / b;\n return function(x) {\n return Math.max(0, Math.min(1, (x - a) / b));\n };\n }\n d3.layout = {};\n d3.layout.bundle = function() {\n return function(links) {\n var paths = [], i = -1, n = links.length;\n while (++i < n) paths.push(d3_layout_bundlePath(links[i]));\n return paths;\n };\n };\n function d3_layout_bundlePath(link) {\n var start = link.source, end = link.target, lca = d3_layout_bundleLeastCommonAncestor(start, end), points = [ start ];\n while (start !== lca) {\n start = start.parent;\n points.push(start);\n }\n var k = points.length;\n while (end !== lca) {\n points.splice(k, 0, end);\n end = end.parent;\n }\n return points;\n }\n function d3_layout_bundleAncestors(node) {\n var ancestors = [], parent = node.parent;\n while (parent != null) {\n ancestors.push(node);\n node = parent;\n parent = parent.parent;\n }\n ancestors.push(node);\n return ancestors;\n }\n function d3_layout_bundleLeastCommonAncestor(a, b) {\n if (a === b) return a;\n var aNodes = d3_layout_bundleAncestors(a), bNodes = d3_layout_bundleAncestors(b), aNode = aNodes.pop(), bNode = bNodes.pop(), sharedNode = null;\n while (aNode === bNode) {\n sharedNode = aNode;\n aNode = aNodes.pop();\n bNode = bNodes.pop();\n }\n return sharedNode;\n }\n d3.layout.chord = function() {\n var chord = {}, chords, groups, matrix, n, padding = 0, sortGroups, sortSubgroups, sortChords;\n function relayout() {\n var subgroups = {}, groupSums = [], groupIndex = d3.range(n), subgroupIndex = [], k, x, x0, i, j;\n chords = [];\n groups = [];\n k = 0, i = -1;\n while (++i < n) {\n x = 0, j = -1;\n while (++j < n) {\n x += matrix[i][j];\n }\n groupSums.push(x);\n subgroupIndex.push(d3.range(n));\n k += x;\n }\n if (sortGroups) {\n groupIndex.sort(function(a, b) {\n return sortGroups(groupSums[a], groupSums[b]);\n });\n }\n if (sortSubgroups) {\n subgroupIndex.forEach(function(d, i) {\n d.sort(function(a, b) {\n return sortSubgroups(matrix[i][a], matrix[i][b]);\n });\n });\n }\n k = (τ - padding * n) / k;\n x = 0, i = -1;\n while (++i < n) {\n x0 = x, j = -1;\n while (++j < n) {\n var di = groupIndex[i], dj = subgroupIndex[di][j], v = matrix[di][dj], a0 = x, a1 = x += v * k;\n subgroups[di + \"-\" + dj] = {\n index: di,\n subindex: dj,\n startAngle: a0,\n endAngle: a1,\n value: v\n };\n }\n groups[di] = {\n index: di,\n startAngle: x0,\n endAngle: x,\n value: groupSums[di]\n };\n x += padding;\n }\n i = -1;\n while (++i < n) {\n j = i - 1;\n while (++j < n) {\n var source = subgroups[i + \"-\" + j], target = subgroups[j + \"-\" + i];\n if (source.value || target.value) {\n chords.push(source.value < target.value ? {\n source: target,\n target: source\n } : {\n source: source,\n target: target\n });\n }\n }\n }\n if (sortChords) resort();\n }\n function resort() {\n chords.sort(function(a, b) {\n return sortChords((a.source.value + a.target.value) / 2, (b.source.value + b.target.value) / 2);\n });\n }\n chord.matrix = function(x) {\n if (!arguments.length) return matrix;\n n = (matrix = x) && matrix.length;\n chords = groups = null;\n return chord;\n };\n chord.padding = function(x) {\n if (!arguments.length) return padding;\n padding = x;\n chords = groups = null;\n return chord;\n };\n chord.sortGroups = function(x) {\n if (!arguments.length) return sortGroups;\n sortGroups = x;\n chords = groups = null;\n return chord;\n };\n chord.sortSubgroups = function(x) {\n if (!arguments.length) return sortSubgroups;\n sortSubgroups = x;\n chords = null;\n return chord;\n };\n chord.sortChords = function(x) {\n if (!arguments.length) return sortChords;\n sortChords = x;\n if (chords) resort();\n return chord;\n };\n chord.chords = function() {\n if (!chords) relayout();\n return chords;\n };\n chord.groups = function() {\n if (!groups) relayout();\n return groups;\n };\n return chord;\n };\n d3.layout.force = function() {\n var force = {}, event = d3.dispatch(\"start\", \"tick\", \"end\"), timer, size = [ 1, 1 ], drag, alpha, friction = .9, linkDistance = d3_layout_forceLinkDistance, linkStrength = d3_layout_forceLinkStrength, charge = -30, chargeDistance2 = d3_layout_forceChargeDistance2, gravity = .1, theta2 = .64, nodes = [], links = [], distances, strengths, charges;\n function repulse(node) {\n return function(quad, x1, _, x2) {\n if (quad.point !== node) {\n var dx = quad.cx - node.x, dy = quad.cy - node.y, dw = x2 - x1, dn = dx * dx + dy * dy;\n if (dw * dw / theta2 < dn) {\n if (dn < chargeDistance2) {\n var k = quad.charge / dn;\n node.px -= dx * k;\n node.py -= dy * k;\n }\n return true;\n }\n if (quad.point && dn && dn < chargeDistance2) {\n var k = quad.pointCharge / dn;\n node.px -= dx * k;\n node.py -= dy * k;\n }\n }\n return !quad.charge;\n };\n }\n force.tick = function() {\n if ((alpha *= .99) < .005) {\n timer = null;\n event.end({\n type: \"end\",\n alpha: alpha = 0\n });\n return true;\n }\n var n = nodes.length, m = links.length, q, i, o, s, t, l, k, x, y;\n for (i = 0; i < m; ++i) {\n o = links[i];\n s = o.source;\n t = o.target;\n x = t.x - s.x;\n y = t.y - s.y;\n if (l = x * x + y * y) {\n l = alpha * strengths[i] * ((l = Math.sqrt(l)) - distances[i]) / l;\n x *= l;\n y *= l;\n t.x -= x * (k = s.weight + t.weight ? s.weight / (s.weight + t.weight) : .5);\n t.y -= y * k;\n s.x += x * (k = 1 - k);\n s.y += y * k;\n }\n }\n if (k = alpha * gravity) {\n x = size[0] / 2;\n y = size[1] / 2;\n i = -1;\n if (k) while (++i < n) {\n o = nodes[i];\n o.x += (x - o.x) * k;\n o.y += (y - o.y) * k;\n }\n }\n if (charge) {\n d3_layout_forceAccumulate(q = d3.geom.quadtree(nodes), alpha, charges);\n i = -1;\n while (++i < n) {\n if (!(o = nodes[i]).fixed) {\n q.visit(repulse(o));\n }\n }\n }\n i = -1;\n while (++i < n) {\n o = nodes[i];\n if (o.fixed) {\n o.x = o.px;\n o.y = o.py;\n } else {\n o.x -= (o.px - (o.px = o.x)) * friction;\n o.y -= (o.py - (o.py = o.y)) * friction;\n }\n }\n event.tick({\n type: \"tick\",\n alpha: alpha\n });\n };\n force.nodes = function(x) {\n if (!arguments.length) return nodes;\n nodes = x;\n return force;\n };\n force.links = function(x) {\n if (!arguments.length) return links;\n links = x;\n return force;\n };\n force.size = function(x) {\n if (!arguments.length) return size;\n size = x;\n return force;\n };\n force.linkDistance = function(x) {\n if (!arguments.length) return linkDistance;\n linkDistance = typeof x === \"function\" ? x : +x;\n return force;\n };\n force.distance = force.linkDistance;\n force.linkStrength = function(x) {\n if (!arguments.length) return linkStrength;\n linkStrength = typeof x === \"function\" ? x : +x;\n return force;\n };\n force.friction = function(x) {\n if (!arguments.length) return friction;\n friction = +x;\n return force;\n };\n force.charge = function(x) {\n if (!arguments.length) return charge;\n charge = typeof x === \"function\" ? x : +x;\n return force;\n };\n force.chargeDistance = function(x) {\n if (!arguments.length) return Math.sqrt(chargeDistance2);\n chargeDistance2 = x * x;\n return force;\n };\n force.gravity = function(x) {\n if (!arguments.length) return gravity;\n gravity = +x;\n return force;\n };\n force.theta = function(x) {\n if (!arguments.length) return Math.sqrt(theta2);\n theta2 = x * x;\n return force;\n };\n force.alpha = function(x) {\n if (!arguments.length) return alpha;\n x = +x;\n if (alpha) {\n if (x > 0) {\n alpha = x;\n } else {\n timer.c = null, timer.t = NaN, timer = null;\n event.end({\n type: \"end\",\n alpha: alpha = 0\n });\n }\n } else if (x > 0) {\n event.start({\n type: \"start\",\n alpha: alpha = x\n });\n timer = d3_timer(force.tick);\n }\n return force;\n };\n force.start = function() {\n var i, n = nodes.length, m = links.length, w = size[0], h = size[1], neighbors, o;\n for (i = 0; i < n; ++i) {\n (o = nodes[i]).index = i;\n o.weight = 0;\n }\n for (i = 0; i < m; ++i) {\n o = links[i];\n if (typeof o.source == \"number\") o.source = nodes[o.source];\n if (typeof o.target == \"number\") o.target = nodes[o.target];\n ++o.source.weight;\n ++o.target.weight;\n }\n for (i = 0; i < n; ++i) {\n o = nodes[i];\n if (isNaN(o.x)) o.x = position(\"x\", w);\n if (isNaN(o.y)) o.y = position(\"y\", h);\n if (isNaN(o.px)) o.px = o.x;\n if (isNaN(o.py)) o.py = o.y;\n }\n distances = [];\n if (typeof linkDistance === \"function\") for (i = 0; i < m; ++i) distances[i] = +linkDistance.call(this, links[i], i); else for (i = 0; i < m; ++i) distances[i] = linkDistance;\n strengths = [];\n if (typeof linkStrength === \"function\") for (i = 0; i < m; ++i) strengths[i] = +linkStrength.call(this, links[i], i); else for (i = 0; i < m; ++i) strengths[i] = linkStrength;\n charges = [];\n if (typeof charge === \"function\") for (i = 0; i < n; ++i) charges[i] = +charge.call(this, nodes[i], i); else for (i = 0; i < n; ++i) charges[i] = charge;\n function position(dimension, size) {\n if (!neighbors) {\n neighbors = new Array(n);\n for (j = 0; j < n; ++j) {\n neighbors[j] = [];\n }\n for (j = 0; j < m; ++j) {\n var o = links[j];\n neighbors[o.source.index].push(o.target);\n neighbors[o.target.index].push(o.source);\n }\n }\n var candidates = neighbors[i], j = -1, l = candidates.length, x;\n while (++j < l) if (!isNaN(x = candidates[j][dimension])) return x;\n return Math.random() * size;\n }\n return force.resume();\n };\n force.resume = function() {\n return force.alpha(.1);\n };\n force.stop = function() {\n return force.alpha(0);\n };\n force.drag = function() {\n if (!drag) drag = d3.behavior.drag().origin(d3_identity).on(\"dragstart.force\", d3_layout_forceDragstart).on(\"drag.force\", dragmove).on(\"dragend.force\", d3_layout_forceDragend);\n if (!arguments.length) return drag;\n this.on(\"mouseover.force\", d3_layout_forceMouseover).on(\"mouseout.force\", d3_layout_forceMouseout).call(drag);\n };\n function dragmove(d) {\n d.px = d3.event.x, d.py = d3.event.y;\n force.resume();\n }\n return d3.rebind(force, event, \"on\");\n };\n function d3_layout_forceDragstart(d) {\n d.fixed |= 2;\n }\n function d3_layout_forceDragend(d) {\n d.fixed &= ~6;\n }\n function d3_layout_forceMouseover(d) {\n d.fixed |= 4;\n d.px = d.x, d.py = d.y;\n }\n function d3_layout_forceMouseout(d) {\n d.fixed &= ~4;\n }\n function d3_layout_forceAccumulate(quad, alpha, charges) {\n var cx = 0, cy = 0;\n quad.charge = 0;\n if (!quad.leaf) {\n var nodes = quad.nodes, n = nodes.length, i = -1, c;\n while (++i < n) {\n c = nodes[i];\n if (c == null) continue;\n d3_layout_forceAccumulate(c, alpha, charges);\n quad.charge += c.charge;\n cx += c.charge * c.cx;\n cy += c.charge * c.cy;\n }\n }\n if (quad.point) {\n if (!quad.leaf) {\n quad.point.x += Math.random() - .5;\n quad.point.y += Math.random() - .5;\n }\n var k = alpha * charges[quad.point.index];\n quad.charge += quad.pointCharge = k;\n cx += k * quad.point.x;\n cy += k * quad.point.y;\n }\n quad.cx = cx / quad.charge;\n quad.cy = cy / quad.charge;\n }\n var d3_layout_forceLinkDistance = 20, d3_layout_forceLinkStrength = 1, d3_layout_forceChargeDistance2 = Infinity;\n d3.layout.hierarchy = function() {\n var sort = d3_layout_hierarchySort, children = d3_layout_hierarchyChildren, value = d3_layout_hierarchyValue;\n function hierarchy(root) {\n var stack = [ root ], nodes = [], node;\n root.depth = 0;\n while ((node = stack.pop()) != null) {\n nodes.push(node);\n if ((childs = children.call(hierarchy, node, node.depth)) && (n = childs.length)) {\n var n, childs, child;\n while (--n >= 0) {\n stack.push(child = childs[n]);\n child.parent = node;\n child.depth = node.depth + 1;\n }\n if (value) node.value = 0;\n node.children = childs;\n } else {\n if (value) node.value = +value.call(hierarchy, node, node.depth) || 0;\n delete node.children;\n }\n }\n d3_layout_hierarchyVisitAfter(root, function(node) {\n var childs, parent;\n if (sort && (childs = node.children)) childs.sort(sort);\n if (value && (parent = node.parent)) parent.value += node.value;\n });\n return nodes;\n }\n hierarchy.sort = function(x) {\n if (!arguments.length) return sort;\n sort = x;\n return hierarchy;\n };\n hierarchy.children = function(x) {\n if (!arguments.length) return children;\n children = x;\n return hierarchy;\n };\n hierarchy.value = function(x) {\n if (!arguments.length) return value;\n value = x;\n return hierarchy;\n };\n hierarchy.revalue = function(root) {\n if (value) {\n d3_layout_hierarchyVisitBefore(root, function(node) {\n if (node.children) node.value = 0;\n });\n d3_layout_hierarchyVisitAfter(root, function(node) {\n var parent;\n if (!node.children) node.value = +value.call(hierarchy, node, node.depth) || 0;\n if (parent = node.parent) parent.value += node.value;\n });\n }\n return root;\n };\n return hierarchy;\n };\n function d3_layout_hierarchyRebind(object, hierarchy) {\n d3.rebind(object, hierarchy, \"sort\", \"children\", \"value\");\n object.nodes = object;\n object.links = d3_layout_hierarchyLinks;\n return object;\n }\n function d3_layout_hierarchyVisitBefore(node, callback) {\n var nodes = [ node ];\n while ((node = nodes.pop()) != null) {\n callback(node);\n if ((children = node.children) && (n = children.length)) {\n var n, children;\n while (--n >= 0) nodes.push(children[n]);\n }\n }\n }\n function d3_layout_hierarchyVisitAfter(node, callback) {\n var nodes = [ node ], nodes2 = [];\n while ((node = nodes.pop()) != null) {\n nodes2.push(node);\n if ((children = node.children) && (n = children.length)) {\n var i = -1, n, children;\n while (++i < n) nodes.push(children[i]);\n }\n }\n while ((node = nodes2.pop()) != null) {\n callback(node);\n }\n }\n function d3_layout_hierarchyChildren(d) {\n return d.children;\n }\n function d3_layout_hierarchyValue(d) {\n return d.value;\n }\n function d3_layout_hierarchySort(a, b) {\n return b.value - a.value;\n }\n function d3_layout_hierarchyLinks(nodes) {\n return d3.merge(nodes.map(function(parent) {\n return (parent.children || []).map(function(child) {\n return {\n source: parent,\n target: child\n };\n });\n }));\n }\n d3.layout.partition = function() {\n var hierarchy = d3.layout.hierarchy(), size = [ 1, 1 ];\n function position(node, x, dx, dy) {\n var children = node.children;\n node.x = x;\n node.y = node.depth * dy;\n node.dx = dx;\n node.dy = dy;\n if (children && (n = children.length)) {\n var i = -1, n, c, d;\n dx = node.value ? dx / node.value : 0;\n while (++i < n) {\n position(c = children[i], x, d = c.value * dx, dy);\n x += d;\n }\n }\n }\n function depth(node) {\n var children = node.children, d = 0;\n if (children && (n = children.length)) {\n var i = -1, n;\n while (++i < n) d = Math.max(d, depth(children[i]));\n }\n return 1 + d;\n }\n function partition(d, i) {\n var nodes = hierarchy.call(this, d, i);\n position(nodes[0], 0, size[0], size[1] / depth(nodes[0]));\n return nodes;\n }\n partition.size = function(x) {\n if (!arguments.length) return size;\n size = x;\n return partition;\n };\n return d3_layout_hierarchyRebind(partition, hierarchy);\n };\n d3.layout.pie = function() {\n var value = Number, sort = d3_layout_pieSortByValue, startAngle = 0, endAngle = τ, padAngle = 0;\n function pie(data) {\n var n = data.length, values = data.map(function(d, i) {\n return +value.call(pie, d, i);\n }), a = +(typeof startAngle === \"function\" ? startAngle.apply(this, arguments) : startAngle), da = (typeof endAngle === \"function\" ? endAngle.apply(this, arguments) : endAngle) - a, p = Math.min(Math.abs(da) / n, +(typeof padAngle === \"function\" ? padAngle.apply(this, arguments) : padAngle)), pa = p * (da < 0 ? -1 : 1), sum = d3.sum(values), k = sum ? (da - n * pa) / sum : 0, index = d3.range(n), arcs = [], v;\n if (sort != null) index.sort(sort === d3_layout_pieSortByValue ? function(i, j) {\n return values[j] - values[i];\n } : function(i, j) {\n return sort(data[i], data[j]);\n });\n index.forEach(function(i) {\n arcs[i] = {\n data: data[i],\n value: v = values[i],\n startAngle: a,\n endAngle: a += v * k + pa,\n padAngle: p\n };\n });\n return arcs;\n }\n pie.value = function(_) {\n if (!arguments.length) return value;\n value = _;\n return pie;\n };\n pie.sort = function(_) {\n if (!arguments.length) return sort;\n sort = _;\n return pie;\n };\n pie.startAngle = function(_) {\n if (!arguments.length) return startAngle;\n startAngle = _;\n return pie;\n };\n pie.endAngle = function(_) {\n if (!arguments.length) return endAngle;\n endAngle = _;\n return pie;\n };\n pie.padAngle = function(_) {\n if (!arguments.length) return padAngle;\n padAngle = _;\n return pie;\n };\n return pie;\n };\n var d3_layout_pieSortByValue = {};\n d3.layout.stack = function() {\n var values = d3_identity, order = d3_layout_stackOrderDefault, offset = d3_layout_stackOffsetZero, out = d3_layout_stackOut, x = d3_layout_stackX, y = d3_layout_stackY;\n function stack(data, index) {\n if (!(n = data.length)) return data;\n var series = data.map(function(d, i) {\n return values.call(stack, d, i);\n });\n var points = series.map(function(d) {\n return d.map(function(v, i) {\n return [ x.call(stack, v, i), y.call(stack, v, i) ];\n });\n });\n var orders = order.call(stack, points, index);\n series = d3.permute(series, orders);\n points = d3.permute(points, orders);\n var offsets = offset.call(stack, points, index);\n var m = series[0].length, n, i, j, o;\n for (j = 0; j < m; ++j) {\n out.call(stack, series[0][j], o = offsets[j], points[0][j][1]);\n for (i = 1; i < n; ++i) {\n out.call(stack, series[i][j], o += points[i - 1][j][1], points[i][j][1]);\n }\n }\n return data;\n }\n stack.values = function(x) {\n if (!arguments.length) return values;\n values = x;\n return stack;\n };\n stack.order = function(x) {\n if (!arguments.length) return order;\n order = typeof x === \"function\" ? x : d3_layout_stackOrders.get(x) || d3_layout_stackOrderDefault;\n return stack;\n };\n stack.offset = function(x) {\n if (!arguments.length) return offset;\n offset = typeof x === \"function\" ? x : d3_layout_stackOffsets.get(x) || d3_layout_stackOffsetZero;\n return stack;\n };\n stack.x = function(z) {\n if (!arguments.length) return x;\n x = z;\n return stack;\n };\n stack.y = function(z) {\n if (!arguments.length) return y;\n y = z;\n return stack;\n };\n stack.out = function(z) {\n if (!arguments.length) return out;\n out = z;\n return stack;\n };\n return stack;\n };\n function d3_layout_stackX(d) {\n return d.x;\n }\n function d3_layout_stackY(d) {\n return d.y;\n }\n function d3_layout_stackOut(d, y0, y) {\n d.y0 = y0;\n d.y = y;\n }\n var d3_layout_stackOrders = d3.map({\n \"inside-out\": function(data) {\n var n = data.length, i, j, max = data.map(d3_layout_stackMaxIndex), sums = data.map(d3_layout_stackReduceSum), index = d3.range(n).sort(function(a, b) {\n return max[a] - max[b];\n }), top = 0, bottom = 0, tops = [], bottoms = [];\n for (i = 0; i < n; ++i) {\n j = index[i];\n if (top < bottom) {\n top += sums[j];\n tops.push(j);\n } else {\n bottom += sums[j];\n bottoms.push(j);\n }\n }\n return bottoms.reverse().concat(tops);\n },\n reverse: function(data) {\n return d3.range(data.length).reverse();\n },\n \"default\": d3_layout_stackOrderDefault\n });\n var d3_layout_stackOffsets = d3.map({\n silhouette: function(data) {\n var n = data.length, m = data[0].length, sums = [], max = 0, i, j, o, y0 = [];\n for (j = 0; j < m; ++j) {\n for (i = 0, o = 0; i < n; i++) o += data[i][j][1];\n if (o > max) max = o;\n sums.push(o);\n }\n for (j = 0; j < m; ++j) {\n y0[j] = (max - sums[j]) / 2;\n }\n return y0;\n },\n wiggle: function(data) {\n var n = data.length, x = data[0], m = x.length, i, j, k, s1, s2, s3, dx, o, o0, y0 = [];\n y0[0] = o = o0 = 0;\n for (j = 1; j < m; ++j) {\n for (i = 0, s1 = 0; i < n; ++i) s1 += data[i][j][1];\n for (i = 0, s2 = 0, dx = x[j][0] - x[j - 1][0]; i < n; ++i) {\n for (k = 0, s3 = (data[i][j][1] - data[i][j - 1][1]) / (2 * dx); k < i; ++k) {\n s3 += (data[k][j][1] - data[k][j - 1][1]) / dx;\n }\n s2 += s3 * data[i][j][1];\n }\n y0[j] = o -= s1 ? s2 / s1 * dx : 0;\n if (o < o0) o0 = o;\n }\n for (j = 0; j < m; ++j) y0[j] -= o0;\n return y0;\n },\n expand: function(data) {\n var n = data.length, m = data[0].length, k = 1 / n, i, j, o, y0 = [];\n for (j = 0; j < m; ++j) {\n for (i = 0, o = 0; i < n; i++) o += data[i][j][1];\n if (o) for (i = 0; i < n; i++) data[i][j][1] /= o; else for (i = 0; i < n; i++) data[i][j][1] = k;\n }\n for (j = 0; j < m; ++j) y0[j] = 0;\n return y0;\n },\n zero: d3_layout_stackOffsetZero\n });\n function d3_layout_stackOrderDefault(data) {\n return d3.range(data.length);\n }\n function d3_layout_stackOffsetZero(data) {\n var j = -1, m = data[0].length, y0 = [];\n while (++j < m) y0[j] = 0;\n return y0;\n }\n function d3_layout_stackMaxIndex(array) {\n var i = 1, j = 0, v = array[0][1], k, n = array.length;\n for (;i < n; ++i) {\n if ((k = array[i][1]) > v) {\n j = i;\n v = k;\n }\n }\n return j;\n }\n function d3_layout_stackReduceSum(d) {\n return d.reduce(d3_layout_stackSum, 0);\n }\n function d3_layout_stackSum(p, d) {\n return p + d[1];\n }\n d3.layout.histogram = function() {\n var frequency = true, valuer = Number, ranger = d3_layout_histogramRange, binner = d3_layout_histogramBinSturges;\n function histogram(data, i) {\n var bins = [], values = data.map(valuer, this), range = ranger.call(this, values, i), thresholds = binner.call(this, range, values, i), bin, i = -1, n = values.length, m = thresholds.length - 1, k = frequency ? 1 : 1 / n, x;\n while (++i < m) {\n bin = bins[i] = [];\n bin.dx = thresholds[i + 1] - (bin.x = thresholds[i]);\n bin.y = 0;\n }\n if (m > 0) {\n i = -1;\n while (++i < n) {\n x = values[i];\n if (x >= range[0] && x <= range[1]) {\n bin = bins[d3.bisect(thresholds, x, 1, m) - 1];\n bin.y += k;\n bin.push(data[i]);\n }\n }\n }\n return bins;\n }\n histogram.value = function(x) {\n if (!arguments.length) return valuer;\n valuer = x;\n return histogram;\n };\n histogram.range = function(x) {\n if (!arguments.length) return ranger;\n ranger = d3_functor(x);\n return histogram;\n };\n histogram.bins = function(x) {\n if (!arguments.length) return binner;\n binner = typeof x === \"number\" ? function(range) {\n return d3_layout_histogramBinFixed(range, x);\n } : d3_functor(x);\n return histogram;\n };\n histogram.frequency = function(x) {\n if (!arguments.length) return frequency;\n frequency = !!x;\n return histogram;\n };\n return histogram;\n };\n function d3_layout_histogramBinSturges(range, values) {\n return d3_layout_histogramBinFixed(range, Math.ceil(Math.log(values.length) / Math.LN2 + 1));\n }\n function d3_layout_histogramBinFixed(range, n) {\n var x = -1, b = +range[0], m = (range[1] - b) / n, f = [];\n while (++x <= n) f[x] = m * x + b;\n return f;\n }\n function d3_layout_histogramRange(values) {\n return [ d3.min(values), d3.max(values) ];\n }\n d3.layout.pack = function() {\n var hierarchy = d3.layout.hierarchy().sort(d3_layout_packSort), padding = 0, size = [ 1, 1 ], radius;\n function pack(d, i) {\n var nodes = hierarchy.call(this, d, i), root = nodes[0], w = size[0], h = size[1], r = radius == null ? Math.sqrt : typeof radius === \"function\" ? radius : function() {\n return radius;\n };\n root.x = root.y = 0;\n d3_layout_hierarchyVisitAfter(root, function(d) {\n d.r = +r(d.value);\n });\n d3_layout_hierarchyVisitAfter(root, d3_layout_packSiblings);\n if (padding) {\n var dr = padding * (radius ? 1 : Math.max(2 * root.r / w, 2 * root.r / h)) / 2;\n d3_layout_hierarchyVisitAfter(root, function(d) {\n d.r += dr;\n });\n d3_layout_hierarchyVisitAfter(root, d3_layout_packSiblings);\n d3_layout_hierarchyVisitAfter(root, function(d) {\n d.r -= dr;\n });\n }\n d3_layout_packTransform(root, w / 2, h / 2, radius ? 1 : 1 / Math.max(2 * root.r / w, 2 * root.r / h));\n return nodes;\n }\n pack.size = function(_) {\n if (!arguments.length) return size;\n size = _;\n return pack;\n };\n pack.radius = function(_) {\n if (!arguments.length) return radius;\n radius = _ == null || typeof _ === \"function\" ? _ : +_;\n return pack;\n };\n pack.padding = function(_) {\n if (!arguments.length) return padding;\n padding = +_;\n return pack;\n };\n return d3_layout_hierarchyRebind(pack, hierarchy);\n };\n function d3_layout_packSort(a, b) {\n return a.value - b.value;\n }\n function d3_layout_packInsert(a, b) {\n var c = a._pack_next;\n a._pack_next = b;\n b._pack_prev = a;\n b._pack_next = c;\n c._pack_prev = b;\n }\n function d3_layout_packSplice(a, b) {\n a._pack_next = b;\n b._pack_prev = a;\n }\n function d3_layout_packIntersects(a, b) {\n var dx = b.x - a.x, dy = b.y - a.y, dr = a.r + b.r;\n return .999 * dr * dr > dx * dx + dy * dy;\n }\n function d3_layout_packSiblings(node) {\n if (!(nodes = node.children) || !(n = nodes.length)) return;\n var nodes, xMin = Infinity, xMax = -Infinity, yMin = Infinity, yMax = -Infinity, a, b, c, i, j, k, n;\n function bound(node) {\n xMin = Math.min(node.x - node.r, xMin);\n xMax = Math.max(node.x + node.r, xMax);\n yMin = Math.min(node.y - node.r, yMin);\n yMax = Math.max(node.y + node.r, yMax);\n }\n nodes.forEach(d3_layout_packLink);\n a = nodes[0];\n a.x = -a.r;\n a.y = 0;\n bound(a);\n if (n > 1) {\n b = nodes[1];\n b.x = b.r;\n b.y = 0;\n bound(b);\n if (n > 2) {\n c = nodes[2];\n d3_layout_packPlace(a, b, c);\n bound(c);\n d3_layout_packInsert(a, c);\n a._pack_prev = c;\n d3_layout_packInsert(c, b);\n b = a._pack_next;\n for (i = 3; i < n; i++) {\n d3_layout_packPlace(a, b, c = nodes[i]);\n var isect = 0, s1 = 1, s2 = 1;\n for (j = b._pack_next; j !== b; j = j._pack_next, s1++) {\n if (d3_layout_packIntersects(j, c)) {\n isect = 1;\n break;\n }\n }\n if (isect == 1) {\n for (k = a._pack_prev; k !== j._pack_prev; k = k._pack_prev, s2++) {\n if (d3_layout_packIntersects(k, c)) {\n break;\n }\n }\n }\n if (isect) {\n if (s1 < s2 || s1 == s2 && b.r < a.r) d3_layout_packSplice(a, b = j); else d3_layout_packSplice(a = k, b);\n i--;\n } else {\n d3_layout_packInsert(a, c);\n b = c;\n bound(c);\n }\n }\n }\n }\n var cx = (xMin + xMax) / 2, cy = (yMin + yMax) / 2, cr = 0;\n for (i = 0; i < n; i++) {\n c = nodes[i];\n c.x -= cx;\n c.y -= cy;\n cr = Math.max(cr, c.r + Math.sqrt(c.x * c.x + c.y * c.y));\n }\n node.r = cr;\n nodes.forEach(d3_layout_packUnlink);\n }\n function d3_layout_packLink(node) {\n node._pack_next = node._pack_prev = node;\n }\n function d3_layout_packUnlink(node) {\n delete node._pack_next;\n delete node._pack_prev;\n }\n function d3_layout_packTransform(node, x, y, k) {\n var children = node.children;\n node.x = x += k * node.x;\n node.y = y += k * node.y;\n node.r *= k;\n if (children) {\n var i = -1, n = children.length;\n while (++i < n) d3_layout_packTransform(children[i], x, y, k);\n }\n }\n function d3_layout_packPlace(a, b, c) {\n var db = a.r + c.r, dx = b.x - a.x, dy = b.y - a.y;\n if (db && (dx || dy)) {\n var da = b.r + c.r, dc = dx * dx + dy * dy;\n da *= da;\n db *= db;\n var x = .5 + (db - da) / (2 * dc), y = Math.sqrt(Math.max(0, 2 * da * (db + dc) - (db -= dc) * db - da * da)) / (2 * dc);\n c.x = a.x + x * dx + y * dy;\n c.y = a.y + x * dy - y * dx;\n } else {\n c.x = a.x + db;\n c.y = a.y;\n }\n }\n d3.layout.tree = function() {\n var hierarchy = d3.layout.hierarchy().sort(null).value(null), separation = d3_layout_treeSeparation, size = [ 1, 1 ], nodeSize = null;\n function tree(d, i) {\n var nodes = hierarchy.call(this, d, i), root0 = nodes[0], root1 = wrapTree(root0);\n d3_layout_hierarchyVisitAfter(root1, firstWalk), root1.parent.m = -root1.z;\n d3_layout_hierarchyVisitBefore(root1, secondWalk);\n if (nodeSize) d3_layout_hierarchyVisitBefore(root0, sizeNode); else {\n var left = root0, right = root0, bottom = root0;\n d3_layout_hierarchyVisitBefore(root0, function(node) {\n if (node.x < left.x) left = node;\n if (node.x > right.x) right = node;\n if (node.depth > bottom.depth) bottom = node;\n });\n var tx = separation(left, right) / 2 - left.x, kx = size[0] / (right.x + separation(right, left) / 2 + tx), ky = size[1] / (bottom.depth || 1);\n d3_layout_hierarchyVisitBefore(root0, function(node) {\n node.x = (node.x + tx) * kx;\n node.y = node.depth * ky;\n });\n }\n return nodes;\n }\n function wrapTree(root0) {\n var root1 = {\n A: null,\n children: [ root0 ]\n }, queue = [ root1 ], node1;\n while ((node1 = queue.pop()) != null) {\n for (var children = node1.children, child, i = 0, n = children.length; i < n; ++i) {\n queue.push((children[i] = child = {\n _: children[i],\n parent: node1,\n children: (child = children[i].children) && child.slice() || [],\n A: null,\n a: null,\n z: 0,\n m: 0,\n c: 0,\n s: 0,\n t: null,\n i: i\n }).a = child);\n }\n }\n return root1.children[0];\n }\n function firstWalk(v) {\n var children = v.children, siblings = v.parent.children, w = v.i ? siblings[v.i - 1] : null;\n if (children.length) {\n d3_layout_treeShift(v);\n var midpoint = (children[0].z + children[children.length - 1].z) / 2;\n if (w) {\n v.z = w.z + separation(v._, w._);\n v.m = v.z - midpoint;\n } else {\n v.z = midpoint;\n }\n } else if (w) {\n v.z = w.z + separation(v._, w._);\n }\n v.parent.A = apportion(v, w, v.parent.A || siblings[0]);\n }\n function secondWalk(v) {\n v._.x = v.z + v.parent.m;\n v.m += v.parent.m;\n }\n function apportion(v, w, ancestor) {\n if (w) {\n var vip = v, vop = v, vim = w, vom = vip.parent.children[0], sip = vip.m, sop = vop.m, sim = vim.m, som = vom.m, shift;\n while (vim = d3_layout_treeRight(vim), vip = d3_layout_treeLeft(vip), vim && vip) {\n vom = d3_layout_treeLeft(vom);\n vop = d3_layout_treeRight(vop);\n vop.a = v;\n shift = vim.z + sim - vip.z - sip + separation(vim._, vip._);\n if (shift > 0) {\n d3_layout_treeMove(d3_layout_treeAncestor(vim, v, ancestor), v, shift);\n sip += shift;\n sop += shift;\n }\n sim += vim.m;\n sip += vip.m;\n som += vom.m;\n sop += vop.m;\n }\n if (vim && !d3_layout_treeRight(vop)) {\n vop.t = vim;\n vop.m += sim - sop;\n }\n if (vip && !d3_layout_treeLeft(vom)) {\n vom.t = vip;\n vom.m += sip - som;\n ancestor = v;\n }\n }\n return ancestor;\n }\n function sizeNode(node) {\n node.x *= size[0];\n node.y = node.depth * size[1];\n }\n tree.separation = function(x) {\n if (!arguments.length) return separation;\n separation = x;\n return tree;\n };\n tree.size = function(x) {\n if (!arguments.length) return nodeSize ? null : size;\n nodeSize = (size = x) == null ? sizeNode : null;\n return tree;\n };\n tree.nodeSize = function(x) {\n if (!arguments.length) return nodeSize ? size : null;\n nodeSize = (size = x) == null ? null : sizeNode;\n return tree;\n };\n return d3_layout_hierarchyRebind(tree, hierarchy);\n };\n function d3_layout_treeSeparation(a, b) {\n return a.parent == b.parent ? 1 : 2;\n }\n function d3_layout_treeLeft(v) {\n var children = v.children;\n return children.length ? children[0] : v.t;\n }\n function d3_layout_treeRight(v) {\n var children = v.children, n;\n return (n = children.length) ? children[n - 1] : v.t;\n }\n function d3_layout_treeMove(wm, wp, shift) {\n var change = shift / (wp.i - wm.i);\n wp.c -= change;\n wp.s += shift;\n wm.c += change;\n wp.z += shift;\n wp.m += shift;\n }\n function d3_layout_treeShift(v) {\n var shift = 0, change = 0, children = v.children, i = children.length, w;\n while (--i >= 0) {\n w = children[i];\n w.z += shift;\n w.m += shift;\n shift += w.s + (change += w.c);\n }\n }\n function d3_layout_treeAncestor(vim, v, ancestor) {\n return vim.a.parent === v.parent ? vim.a : ancestor;\n }\n d3.layout.cluster = function() {\n var hierarchy = d3.layout.hierarchy().sort(null).value(null), separation = d3_layout_treeSeparation, size = [ 1, 1 ], nodeSize = false;\n function cluster(d, i) {\n var nodes = hierarchy.call(this, d, i), root = nodes[0], previousNode, x = 0;\n d3_layout_hierarchyVisitAfter(root, function(node) {\n var children = node.children;\n if (children && children.length) {\n node.x = d3_layout_clusterX(children);\n node.y = d3_layout_clusterY(children);\n } else {\n node.x = previousNode ? x += separation(node, previousNode) : 0;\n node.y = 0;\n previousNode = node;\n }\n });\n var left = d3_layout_clusterLeft(root), right = d3_layout_clusterRight(root), x0 = left.x - separation(left, right) / 2, x1 = right.x + separation(right, left) / 2;\n d3_layout_hierarchyVisitAfter(root, nodeSize ? function(node) {\n node.x = (node.x - root.x) * size[0];\n node.y = (root.y - node.y) * size[1];\n } : function(node) {\n node.x = (node.x - x0) / (x1 - x0) * size[0];\n node.y = (1 - (root.y ? node.y / root.y : 1)) * size[1];\n });\n return nodes;\n }\n cluster.separation = function(x) {\n if (!arguments.length) return separation;\n separation = x;\n return cluster;\n };\n cluster.size = function(x) {\n if (!arguments.length) return nodeSize ? null : size;\n nodeSize = (size = x) == null;\n return cluster;\n };\n cluster.nodeSize = function(x) {\n if (!arguments.length) return nodeSize ? size : null;\n nodeSize = (size = x) != null;\n return cluster;\n };\n return d3_layout_hierarchyRebind(cluster, hierarchy);\n };\n function d3_layout_clusterY(children) {\n return 1 + d3.max(children, function(child) {\n return child.y;\n });\n }\n function d3_layout_clusterX(children) {\n return children.reduce(function(x, child) {\n return x + child.x;\n }, 0) / children.length;\n }\n function d3_layout_clusterLeft(node) {\n var children = node.children;\n return children && children.length ? d3_layout_clusterLeft(children[0]) : node;\n }\n function d3_layout_clusterRight(node) {\n var children = node.children, n;\n return children && (n = children.length) ? d3_layout_clusterRight(children[n - 1]) : node;\n }\n d3.layout.treemap = function() {\n var hierarchy = d3.layout.hierarchy(), round = Math.round, size = [ 1, 1 ], padding = null, pad = d3_layout_treemapPadNull, sticky = false, stickies, mode = \"squarify\", ratio = .5 * (1 + Math.sqrt(5));\n function scale(children, k) {\n var i = -1, n = children.length, child, area;\n while (++i < n) {\n area = (child = children[i]).value * (k < 0 ? 0 : k);\n child.area = isNaN(area) || area <= 0 ? 0 : area;\n }\n }\n function squarify(node) {\n var children = node.children;\n if (children && children.length) {\n var rect = pad(node), row = [], remaining = children.slice(), child, best = Infinity, score, u = mode === \"slice\" ? rect.dx : mode === \"dice\" ? rect.dy : mode === \"slice-dice\" ? node.depth & 1 ? rect.dy : rect.dx : Math.min(rect.dx, rect.dy), n;\n scale(remaining, rect.dx * rect.dy / node.value);\n row.area = 0;\n while ((n = remaining.length) > 0) {\n row.push(child = remaining[n - 1]);\n row.area += child.area;\n if (mode !== \"squarify\" || (score = worst(row, u)) <= best) {\n remaining.pop();\n best = score;\n } else {\n row.area -= row.pop().area;\n position(row, u, rect, false);\n u = Math.min(rect.dx, rect.dy);\n row.length = row.area = 0;\n best = Infinity;\n }\n }\n if (row.length) {\n position(row, u, rect, true);\n row.length = row.area = 0;\n }\n children.forEach(squarify);\n }\n }\n function stickify(node) {\n var children = node.children;\n if (children && children.length) {\n var rect = pad(node), remaining = children.slice(), child, row = [];\n scale(remaining, rect.dx * rect.dy / node.value);\n row.area = 0;\n while (child = remaining.pop()) {\n row.push(child);\n row.area += child.area;\n if (child.z != null) {\n position(row, child.z ? rect.dx : rect.dy, rect, !remaining.length);\n row.length = row.area = 0;\n }\n }\n children.forEach(stickify);\n }\n }\n function worst(row, u) {\n var s = row.area, r, rmax = 0, rmin = Infinity, i = -1, n = row.length;\n while (++i < n) {\n if (!(r = row[i].area)) continue;\n if (r < rmin) rmin = r;\n if (r > rmax) rmax = r;\n }\n s *= s;\n u *= u;\n return s ? Math.max(u * rmax * ratio / s, s / (u * rmin * ratio)) : Infinity;\n }\n function position(row, u, rect, flush) {\n var i = -1, n = row.length, x = rect.x, y = rect.y, v = u ? round(row.area / u) : 0, o;\n if (u == rect.dx) {\n if (flush || v > rect.dy) v = rect.dy;\n while (++i < n) {\n o = row[i];\n o.x = x;\n o.y = y;\n o.dy = v;\n x += o.dx = Math.min(rect.x + rect.dx - x, v ? round(o.area / v) : 0);\n }\n o.z = true;\n o.dx += rect.x + rect.dx - x;\n rect.y += v;\n rect.dy -= v;\n } else {\n if (flush || v > rect.dx) v = rect.dx;\n while (++i < n) {\n o = row[i];\n o.x = x;\n o.y = y;\n o.dx = v;\n y += o.dy = Math.min(rect.y + rect.dy - y, v ? round(o.area / v) : 0);\n }\n o.z = false;\n o.dy += rect.y + rect.dy - y;\n rect.x += v;\n rect.dx -= v;\n }\n }\n function treemap(d) {\n var nodes = stickies || hierarchy(d), root = nodes[0];\n root.x = root.y = 0;\n if (root.value) root.dx = size[0], root.dy = size[1]; else root.dx = root.dy = 0;\n if (stickies) hierarchy.revalue(root);\n scale([ root ], root.dx * root.dy / root.value);\n (stickies ? stickify : squarify)(root);\n if (sticky) stickies = nodes;\n return nodes;\n }\n treemap.size = function(x) {\n if (!arguments.length) return size;\n size = x;\n return treemap;\n };\n treemap.padding = function(x) {\n if (!arguments.length) return padding;\n function padFunction(node) {\n var p = x.call(treemap, node, node.depth);\n return p == null ? d3_layout_treemapPadNull(node) : d3_layout_treemapPad(node, typeof p === \"number\" ? [ p, p, p, p ] : p);\n }\n function padConstant(node) {\n return d3_layout_treemapPad(node, x);\n }\n var type;\n pad = (padding = x) == null ? d3_layout_treemapPadNull : (type = typeof x) === \"function\" ? padFunction : type === \"number\" ? (x = [ x, x, x, x ], \n padConstant) : padConstant;\n return treemap;\n };\n treemap.round = function(x) {\n if (!arguments.length) return round != Number;\n round = x ? Math.round : Number;\n return treemap;\n };\n treemap.sticky = function(x) {\n if (!arguments.length) return sticky;\n sticky = x;\n stickies = null;\n return treemap;\n };\n treemap.ratio = function(x) {\n if (!arguments.length) return ratio;\n ratio = x;\n return treemap;\n };\n treemap.mode = function(x) {\n if (!arguments.length) return mode;\n mode = x + \"\";\n return treemap;\n };\n return d3_layout_hierarchyRebind(treemap, hierarchy);\n };\n function d3_layout_treemapPadNull(node) {\n return {\n x: node.x,\n y: node.y,\n dx: node.dx,\n dy: node.dy\n };\n }\n function d3_layout_treemapPad(node, padding) {\n var x = node.x + padding[3], y = node.y + padding[0], dx = node.dx - padding[1] - padding[3], dy = node.dy - padding[0] - padding[2];\n if (dx < 0) {\n x += dx / 2;\n dx = 0;\n }\n if (dy < 0) {\n y += dy / 2;\n dy = 0;\n }\n return {\n x: x,\n y: y,\n dx: dx,\n dy: dy\n };\n }\n d3.random = {\n normal: function(µ, σ) {\n var n = arguments.length;\n if (n < 2) σ = 1;\n if (n < 1) µ = 0;\n return function() {\n var x, y, r;\n do {\n x = Math.random() * 2 - 1;\n y = Math.random() * 2 - 1;\n r = x * x + y * y;\n } while (!r || r > 1);\n return µ + σ * x * Math.sqrt(-2 * Math.log(r) / r);\n };\n },\n logNormal: function() {\n var random = d3.random.normal.apply(d3, arguments);\n return function() {\n return Math.exp(random());\n };\n },\n bates: function(m) {\n var random = d3.random.irwinHall(m);\n return function() {\n return random() / m;\n };\n },\n irwinHall: function(m) {\n return function() {\n for (var s = 0, j = 0; j < m; j++) s += Math.random();\n return s;\n };\n }\n };\n d3.scale = {};\n function d3_scaleExtent(domain) {\n var start = domain[0], stop = domain[domain.length - 1];\n return start < stop ? [ start, stop ] : [ stop, start ];\n }\n function d3_scaleRange(scale) {\n return scale.rangeExtent ? scale.rangeExtent() : d3_scaleExtent(scale.range());\n }\n function d3_scale_bilinear(domain, range, uninterpolate, interpolate) {\n var u = uninterpolate(domain[0], domain[1]), i = interpolate(range[0], range[1]);\n return function(x) {\n return i(u(x));\n };\n }\n function d3_scale_nice(domain, nice) {\n var i0 = 0, i1 = domain.length - 1, x0 = domain[i0], x1 = domain[i1], dx;\n if (x1 < x0) {\n dx = i0, i0 = i1, i1 = dx;\n dx = x0, x0 = x1, x1 = dx;\n }\n domain[i0] = nice.floor(x0);\n domain[i1] = nice.ceil(x1);\n return domain;\n }\n function d3_scale_niceStep(step) {\n return step ? {\n floor: function(x) {\n return Math.floor(x / step) * step;\n },\n ceil: function(x) {\n return Math.ceil(x / step) * step;\n }\n } : d3_scale_niceIdentity;\n }\n var d3_scale_niceIdentity = {\n floor: d3_identity,\n ceil: d3_identity\n };\n function d3_scale_polylinear(domain, range, uninterpolate, interpolate) {\n var u = [], i = [], j = 0, k = Math.min(domain.length, range.length) - 1;\n if (domain[k] < domain[0]) {\n domain = domain.slice().reverse();\n range = range.slice().reverse();\n }\n while (++j <= k) {\n u.push(uninterpolate(domain[j - 1], domain[j]));\n i.push(interpolate(range[j - 1], range[j]));\n }\n return function(x) {\n var j = d3.bisect(domain, x, 1, k) - 1;\n return i[j](u[j](x));\n };\n }\n d3.scale.linear = function() {\n return d3_scale_linear([ 0, 1 ], [ 0, 1 ], d3_interpolate, false);\n };\n function d3_scale_linear(domain, range, interpolate, clamp) {\n var output, input;\n function rescale() {\n var linear = Math.min(domain.length, range.length) > 2 ? d3_scale_polylinear : d3_scale_bilinear, uninterpolate = clamp ? d3_uninterpolateClamp : d3_uninterpolateNumber;\n output = linear(domain, range, uninterpolate, interpolate);\n input = linear(range, domain, uninterpolate, d3_interpolate);\n return scale;\n }\n function scale(x) {\n return output(x);\n }\n scale.invert = function(y) {\n return input(y);\n };\n scale.domain = function(x) {\n if (!arguments.length) return domain;\n domain = x.map(Number);\n return rescale();\n };\n scale.range = function(x) {\n if (!arguments.length) return range;\n range = x;\n return rescale();\n };\n scale.rangeRound = function(x) {\n return scale.range(x).interpolate(d3_interpolateRound);\n };\n scale.clamp = function(x) {\n if (!arguments.length) return clamp;\n clamp = x;\n return rescale();\n };\n scale.interpolate = function(x) {\n if (!arguments.length) return interpolate;\n interpolate = x;\n return rescale();\n };\n scale.ticks = function(m) {\n return d3_scale_linearTicks(domain, m);\n };\n scale.tickFormat = function(m, format) {\n return d3_scale_linearTickFormat(domain, m, format);\n };\n scale.nice = function(m) {\n d3_scale_linearNice(domain, m);\n return rescale();\n };\n scale.copy = function() {\n return d3_scale_linear(domain, range, interpolate, clamp);\n };\n return rescale();\n }\n function d3_scale_linearRebind(scale, linear) {\n return d3.rebind(scale, linear, \"range\", \"rangeRound\", \"interpolate\", \"clamp\");\n }\n function d3_scale_linearNice(domain, m) {\n d3_scale_nice(domain, d3_scale_niceStep(d3_scale_linearTickRange(domain, m)[2]));\n d3_scale_nice(domain, d3_scale_niceStep(d3_scale_linearTickRange(domain, m)[2]));\n return domain;\n }\n function d3_scale_linearTickRange(domain, m) {\n if (m == null) m = 10;\n var extent = d3_scaleExtent(domain), span = extent[1] - extent[0], step = Math.pow(10, Math.floor(Math.log(span / m) / Math.LN10)), err = m / span * step;\n if (err <= .15) step *= 10; else if (err <= .35) step *= 5; else if (err <= .75) step *= 2;\n extent[0] = Math.ceil(extent[0] / step) * step;\n extent[1] = Math.floor(extent[1] / step) * step + step * .5;\n extent[2] = step;\n return extent;\n }\n function d3_scale_linearTicks(domain, m) {\n return d3.range.apply(d3, d3_scale_linearTickRange(domain, m));\n }\n function d3_scale_linearTickFormat(domain, m, format) {\n var range = d3_scale_linearTickRange(domain, m);\n if (format) {\n var match = d3_format_re.exec(format);\n match.shift();\n if (match[8] === \"s\") {\n var prefix = d3.formatPrefix(Math.max(abs(range[0]), abs(range[1])));\n if (!match[7]) match[7] = \".\" + d3_scale_linearPrecision(prefix.scale(range[2]));\n match[8] = \"f\";\n format = d3.format(match.join(\"\"));\n return function(d) {\n return format(prefix.scale(d)) + prefix.symbol;\n };\n }\n if (!match[7]) match[7] = \".\" + d3_scale_linearFormatPrecision(match[8], range);\n format = match.join(\"\");\n } else {\n format = \",.\" + d3_scale_linearPrecision(range[2]) + \"f\";\n }\n return d3.format(format);\n }\n var d3_scale_linearFormatSignificant = {\n s: 1,\n g: 1,\n p: 1,\n r: 1,\n e: 1\n };\n function d3_scale_linearPrecision(value) {\n return -Math.floor(Math.log(value) / Math.LN10 + .01);\n }\n function d3_scale_linearFormatPrecision(type, range) {\n var p = d3_scale_linearPrecision(range[2]);\n return type in d3_scale_linearFormatSignificant ? Math.abs(p - d3_scale_linearPrecision(Math.max(abs(range[0]), abs(range[1])))) + +(type !== \"e\") : p - (type === \"%\") * 2;\n }\n d3.scale.log = function() {\n return d3_scale_log(d3.scale.linear().domain([ 0, 1 ]), 10, true, [ 1, 10 ]);\n };\n function d3_scale_log(linear, base, positive, domain) {\n function log(x) {\n return (positive ? Math.log(x < 0 ? 0 : x) : -Math.log(x > 0 ? 0 : -x)) / Math.log(base);\n }\n function pow(x) {\n return positive ? Math.pow(base, x) : -Math.pow(base, -x);\n }\n function scale(x) {\n return linear(log(x));\n }\n scale.invert = function(x) {\n return pow(linear.invert(x));\n };\n scale.domain = function(x) {\n if (!arguments.length) return domain;\n positive = x[0] >= 0;\n linear.domain((domain = x.map(Number)).map(log));\n return scale;\n };\n scale.base = function(_) {\n if (!arguments.length) return base;\n base = +_;\n linear.domain(domain.map(log));\n return scale;\n };\n scale.nice = function() {\n var niced = d3_scale_nice(domain.map(log), positive ? Math : d3_scale_logNiceNegative);\n linear.domain(niced);\n domain = niced.map(pow);\n return scale;\n };\n scale.ticks = function() {\n var extent = d3_scaleExtent(domain), ticks = [], u = extent[0], v = extent[1], i = Math.floor(log(u)), j = Math.ceil(log(v)), n = base % 1 ? 2 : base;\n if (isFinite(j - i)) {\n if (positive) {\n for (;i < j; i++) for (var k = 1; k < n; k++) ticks.push(pow(i) * k);\n ticks.push(pow(i));\n } else {\n ticks.push(pow(i));\n for (;i++ < j; ) for (var k = n - 1; k > 0; k--) ticks.push(pow(i) * k);\n }\n for (i = 0; ticks[i] < u; i++) {}\n for (j = ticks.length; ticks[j - 1] > v; j--) {}\n ticks = ticks.slice(i, j);\n }\n return ticks;\n };\n scale.tickFormat = function(n, format) {\n if (!arguments.length) return d3_scale_logFormat;\n if (arguments.length < 2) format = d3_scale_logFormat; else if (typeof format !== \"function\") format = d3.format(format);\n var k = Math.max(1, base * n / scale.ticks().length);\n return function(d) {\n var i = d / pow(Math.round(log(d)));\n if (i * base < base - .5) i *= base;\n return i <= k ? format(d) : \"\";\n };\n };\n scale.copy = function() {\n return d3_scale_log(linear.copy(), base, positive, domain);\n };\n return d3_scale_linearRebind(scale, linear);\n }\n var d3_scale_logFormat = d3.format(\".0e\"), d3_scale_logNiceNegative = {\n floor: function(x) {\n return -Math.ceil(-x);\n },\n ceil: function(x) {\n return -Math.floor(-x);\n }\n };\n d3.scale.pow = function() {\n return d3_scale_pow(d3.scale.linear(), 1, [ 0, 1 ]);\n };\n function d3_scale_pow(linear, exponent, domain) {\n var powp = d3_scale_powPow(exponent), powb = d3_scale_powPow(1 / exponent);\n function scale(x) {\n return linear(powp(x));\n }\n scale.invert = function(x) {\n return powb(linear.invert(x));\n };\n scale.domain = function(x) {\n if (!arguments.length) return domain;\n linear.domain((domain = x.map(Number)).map(powp));\n return scale;\n };\n scale.ticks = function(m) {\n return d3_scale_linearTicks(domain, m);\n };\n scale.tickFormat = function(m, format) {\n return d3_scale_linearTickFormat(domain, m, format);\n };\n scale.nice = function(m) {\n return scale.domain(d3_scale_linearNice(domain, m));\n };\n scale.exponent = function(x) {\n if (!arguments.length) return exponent;\n powp = d3_scale_powPow(exponent = x);\n powb = d3_scale_powPow(1 / exponent);\n linear.domain(domain.map(powp));\n return scale;\n };\n scale.copy = function() {\n return d3_scale_pow(linear.copy(), exponent, domain);\n };\n return d3_scale_linearRebind(scale, linear);\n }\n function d3_scale_powPow(e) {\n return function(x) {\n return x < 0 ? -Math.pow(-x, e) : Math.pow(x, e);\n };\n }\n d3.scale.sqrt = function() {\n return d3.scale.pow().exponent(.5);\n };\n d3.scale.ordinal = function() {\n return d3_scale_ordinal([], {\n t: \"range\",\n a: [ [] ]\n });\n };\n function d3_scale_ordinal(domain, ranger) {\n var index, range, rangeBand;\n function scale(x) {\n return range[((index.get(x) || (ranger.t === \"range\" ? index.set(x, domain.push(x)) : NaN)) - 1) % range.length];\n }\n function steps(start, step) {\n return d3.range(domain.length).map(function(i) {\n return start + step * i;\n });\n }\n scale.domain = function(x) {\n if (!arguments.length) return domain;\n domain = [];\n index = new d3_Map();\n var i = -1, n = x.length, xi;\n while (++i < n) if (!index.has(xi = x[i])) index.set(xi, domain.push(xi));\n return scale[ranger.t].apply(scale, ranger.a);\n };\n scale.range = function(x) {\n if (!arguments.length) return range;\n range = x;\n rangeBand = 0;\n ranger = {\n t: \"range\",\n a: arguments\n };\n return scale;\n };\n scale.rangePoints = function(x, padding) {\n if (arguments.length < 2) padding = 0;\n var start = x[0], stop = x[1], step = domain.length < 2 ? (start = (start + stop) / 2, \n 0) : (stop - start) / (domain.length - 1 + padding);\n range = steps(start + step * padding / 2, step);\n rangeBand = 0;\n ranger = {\n t: \"rangePoints\",\n a: arguments\n };\n return scale;\n };\n scale.rangeRoundPoints = function(x, padding) {\n if (arguments.length < 2) padding = 0;\n var start = x[0], stop = x[1], step = domain.length < 2 ? (start = stop = Math.round((start + stop) / 2), \n 0) : (stop - start) / (domain.length - 1 + padding) | 0;\n range = steps(start + Math.round(step * padding / 2 + (stop - start - (domain.length - 1 + padding) * step) / 2), step);\n rangeBand = 0;\n ranger = {\n t: \"rangeRoundPoints\",\n a: arguments\n };\n return scale;\n };\n scale.rangeBands = function(x, padding, outerPadding) {\n if (arguments.length < 2) padding = 0;\n if (arguments.length < 3) outerPadding = padding;\n var reverse = x[1] < x[0], start = x[reverse - 0], stop = x[1 - reverse], step = (stop - start) / (domain.length - padding + 2 * outerPadding);\n range = steps(start + step * outerPadding, step);\n if (reverse) range.reverse();\n rangeBand = step * (1 - padding);\n ranger = {\n t: \"rangeBands\",\n a: arguments\n };\n return scale;\n };\n scale.rangeRoundBands = function(x, padding, outerPadding) {\n if (arguments.length < 2) padding = 0;\n if (arguments.length < 3) outerPadding = padding;\n var reverse = x[1] < x[0], start = x[reverse - 0], stop = x[1 - reverse], step = Math.floor((stop - start) / (domain.length - padding + 2 * outerPadding));\n range = steps(start + Math.round((stop - start - (domain.length - padding) * step) / 2), step);\n if (reverse) range.reverse();\n rangeBand = Math.round(step * (1 - padding));\n ranger = {\n t: \"rangeRoundBands\",\n a: arguments\n };\n return scale;\n };\n scale.rangeBand = function() {\n return rangeBand;\n };\n scale.rangeExtent = function() {\n return d3_scaleExtent(ranger.a[0]);\n };\n scale.copy = function() {\n return d3_scale_ordinal(domain, ranger);\n };\n return scale.domain(domain);\n }\n d3.scale.category10 = function() {\n return d3.scale.ordinal().range(d3_category10);\n };\n d3.scale.category20 = function() {\n return d3.scale.ordinal().range(d3_category20);\n };\n d3.scale.category20b = function() {\n return d3.scale.ordinal().range(d3_category20b);\n };\n d3.scale.category20c = function() {\n return d3.scale.ordinal().range(d3_category20c);\n };\n var d3_category10 = [ 2062260, 16744206, 2924588, 14034728, 9725885, 9197131, 14907330, 8355711, 12369186, 1556175 ].map(d3_rgbString);\n var d3_category20 = [ 2062260, 11454440, 16744206, 16759672, 2924588, 10018698, 14034728, 16750742, 9725885, 12955861, 9197131, 12885140, 14907330, 16234194, 8355711, 13092807, 12369186, 14408589, 1556175, 10410725 ].map(d3_rgbString);\n var d3_category20b = [ 3750777, 5395619, 7040719, 10264286, 6519097, 9216594, 11915115, 13556636, 9202993, 12426809, 15186514, 15190932, 8666169, 11356490, 14049643, 15177372, 8077683, 10834324, 13528509, 14589654 ].map(d3_rgbString);\n var d3_category20c = [ 3244733, 7057110, 10406625, 13032431, 15095053, 16616764, 16625259, 16634018, 3253076, 7652470, 10607003, 13101504, 7695281, 10394312, 12369372, 14342891, 6513507, 9868950, 12434877, 14277081 ].map(d3_rgbString);\n d3.scale.quantile = function() {\n return d3_scale_quantile([], []);\n };\n function d3_scale_quantile(domain, range) {\n var thresholds;\n function rescale() {\n var k = 0, q = range.length;\n thresholds = [];\n while (++k < q) thresholds[k - 1] = d3.quantile(domain, k / q);\n return scale;\n }\n function scale(x) {\n if (!isNaN(x = +x)) return range[d3.bisect(thresholds, x)];\n }\n scale.domain = function(x) {\n if (!arguments.length) return domain;\n domain = x.map(d3_number).filter(d3_numeric).sort(d3_ascending);\n return rescale();\n };\n scale.range = function(x) {\n if (!arguments.length) return range;\n range = x;\n return rescale();\n };\n scale.quantiles = function() {\n return thresholds;\n };\n scale.invertExtent = function(y) {\n y = range.indexOf(y);\n return y < 0 ? [ NaN, NaN ] : [ y > 0 ? thresholds[y - 1] : domain[0], y < thresholds.length ? thresholds[y] : domain[domain.length - 1] ];\n };\n scale.copy = function() {\n return d3_scale_quantile(domain, range);\n };\n return rescale();\n }\n d3.scale.quantize = function() {\n return d3_scale_quantize(0, 1, [ 0, 1 ]);\n };\n function d3_scale_quantize(x0, x1, range) {\n var kx, i;\n function scale(x) {\n return range[Math.max(0, Math.min(i, Math.floor(kx * (x - x0))))];\n }\n function rescale() {\n kx = range.length / (x1 - x0);\n i = range.length - 1;\n return scale;\n }\n scale.domain = function(x) {\n if (!arguments.length) return [ x0, x1 ];\n x0 = +x[0];\n x1 = +x[x.length - 1];\n return rescale();\n };\n scale.range = function(x) {\n if (!arguments.length) return range;\n range = x;\n return rescale();\n };\n scale.invertExtent = function(y) {\n y = range.indexOf(y);\n y = y < 0 ? NaN : y / kx + x0;\n return [ y, y + 1 / kx ];\n };\n scale.copy = function() {\n return d3_scale_quantize(x0, x1, range);\n };\n return rescale();\n }\n d3.scale.threshold = function() {\n return d3_scale_threshold([ .5 ], [ 0, 1 ]);\n };\n function d3_scale_threshold(domain, range) {\n function scale(x) {\n if (x <= x) return range[d3.bisect(domain, x)];\n }\n scale.domain = function(_) {\n if (!arguments.length) return domain;\n domain = _;\n return scale;\n };\n scale.range = function(_) {\n if (!arguments.length) return range;\n range = _;\n return scale;\n };\n scale.invertExtent = function(y) {\n y = range.indexOf(y);\n return [ domain[y - 1], domain[y] ];\n };\n scale.copy = function() {\n return d3_scale_threshold(domain, range);\n };\n return scale;\n }\n d3.scale.identity = function() {\n return d3_scale_identity([ 0, 1 ]);\n };\n function d3_scale_identity(domain) {\n function identity(x) {\n return +x;\n }\n identity.invert = identity;\n identity.domain = identity.range = function(x) {\n if (!arguments.length) return domain;\n domain = x.map(identity);\n return identity;\n };\n identity.ticks = function(m) {\n return d3_scale_linearTicks(domain, m);\n };\n identity.tickFormat = function(m, format) {\n return d3_scale_linearTickFormat(domain, m, format);\n };\n identity.copy = function() {\n return d3_scale_identity(domain);\n };\n return identity;\n }\n d3.svg = {};\n function d3_zero() {\n return 0;\n }\n d3.svg.arc = function() {\n var innerRadius = d3_svg_arcInnerRadius, outerRadius = d3_svg_arcOuterRadius, cornerRadius = d3_zero, padRadius = d3_svg_arcAuto, startAngle = d3_svg_arcStartAngle, endAngle = d3_svg_arcEndAngle, padAngle = d3_svg_arcPadAngle;\n function arc() {\n var r0 = Math.max(0, +innerRadius.apply(this, arguments)), r1 = Math.max(0, +outerRadius.apply(this, arguments)), a0 = startAngle.apply(this, arguments) - halfπ, a1 = endAngle.apply(this, arguments) - halfπ, da = Math.abs(a1 - a0), cw = a0 > a1 ? 0 : 1;\n if (r1 < r0) rc = r1, r1 = r0, r0 = rc;\n if (da >= τε) return circleSegment(r1, cw) + (r0 ? circleSegment(r0, 1 - cw) : \"\") + \"Z\";\n var rc, cr, rp, ap, p0 = 0, p1 = 0, x0, y0, x1, y1, x2, y2, x3, y3, path = [];\n if (ap = (+padAngle.apply(this, arguments) || 0) / 2) {\n rp = padRadius === d3_svg_arcAuto ? Math.sqrt(r0 * r0 + r1 * r1) : +padRadius.apply(this, arguments);\n if (!cw) p1 *= -1;\n if (r1) p1 = d3_asin(rp / r1 * Math.sin(ap));\n if (r0) p0 = d3_asin(rp / r0 * Math.sin(ap));\n }\n if (r1) {\n x0 = r1 * Math.cos(a0 + p1);\n y0 = r1 * Math.sin(a0 + p1);\n x1 = r1 * Math.cos(a1 - p1);\n y1 = r1 * Math.sin(a1 - p1);\n var l1 = Math.abs(a1 - a0 - 2 * p1) <= π ? 0 : 1;\n if (p1 && d3_svg_arcSweep(x0, y0, x1, y1) === cw ^ l1) {\n var h1 = (a0 + a1) / 2;\n x0 = r1 * Math.cos(h1);\n y0 = r1 * Math.sin(h1);\n x1 = y1 = null;\n }\n } else {\n x0 = y0 = 0;\n }\n if (r0) {\n x2 = r0 * Math.cos(a1 - p0);\n y2 = r0 * Math.sin(a1 - p0);\n x3 = r0 * Math.cos(a0 + p0);\n y3 = r0 * Math.sin(a0 + p0);\n var l0 = Math.abs(a0 - a1 + 2 * p0) <= π ? 0 : 1;\n if (p0 && d3_svg_arcSweep(x2, y2, x3, y3) === 1 - cw ^ l0) {\n var h0 = (a0 + a1) / 2;\n x2 = r0 * Math.cos(h0);\n y2 = r0 * Math.sin(h0);\n x3 = y3 = null;\n }\n } else {\n x2 = y2 = 0;\n }\n if (da > ε && (rc = Math.min(Math.abs(r1 - r0) / 2, +cornerRadius.apply(this, arguments))) > .001) {\n cr = r0 < r1 ^ cw ? 0 : 1;\n var rc1 = rc, rc0 = rc;\n if (da < π) {\n var oc = x3 == null ? [ x2, y2 ] : x1 == null ? [ x0, y0 ] : d3_geom_polygonIntersect([ x0, y0 ], [ x3, y3 ], [ x1, y1 ], [ x2, y2 ]), ax = x0 - oc[0], ay = y0 - oc[1], bx = x1 - oc[0], by = y1 - oc[1], kc = 1 / Math.sin(Math.acos((ax * bx + ay * by) / (Math.sqrt(ax * ax + ay * ay) * Math.sqrt(bx * bx + by * by))) / 2), lc = Math.sqrt(oc[0] * oc[0] + oc[1] * oc[1]);\n rc0 = Math.min(rc, (r0 - lc) / (kc - 1));\n rc1 = Math.min(rc, (r1 - lc) / (kc + 1));\n }\n if (x1 != null) {\n var t30 = d3_svg_arcCornerTangents(x3 == null ? [ x2, y2 ] : [ x3, y3 ], [ x0, y0 ], r1, rc1, cw), t12 = d3_svg_arcCornerTangents([ x1, y1 ], [ x2, y2 ], r1, rc1, cw);\n if (rc === rc1) {\n path.push(\"M\", t30[0], \"A\", rc1, \",\", rc1, \" 0 0,\", cr, \" \", t30[1], \"A\", r1, \",\", r1, \" 0 \", 1 - cw ^ d3_svg_arcSweep(t30[1][0], t30[1][1], t12[1][0], t12[1][1]), \",\", cw, \" \", t12[1], \"A\", rc1, \",\", rc1, \" 0 0,\", cr, \" \", t12[0]);\n } else {\n path.push(\"M\", t30[0], \"A\", rc1, \",\", rc1, \" 0 1,\", cr, \" \", t12[0]);\n }\n } else {\n path.push(\"M\", x0, \",\", y0);\n }\n if (x3 != null) {\n var t03 = d3_svg_arcCornerTangents([ x0, y0 ], [ x3, y3 ], r0, -rc0, cw), t21 = d3_svg_arcCornerTangents([ x2, y2 ], x1 == null ? [ x0, y0 ] : [ x1, y1 ], r0, -rc0, cw);\n if (rc === rc0) {\n path.push(\"L\", t21[0], \"A\", rc0, \",\", rc0, \" 0 0,\", cr, \" \", t21[1], \"A\", r0, \",\", r0, \" 0 \", cw ^ d3_svg_arcSweep(t21[1][0], t21[1][1], t03[1][0], t03[1][1]), \",\", 1 - cw, \" \", t03[1], \"A\", rc0, \",\", rc0, \" 0 0,\", cr, \" \", t03[0]);\n } else {\n path.push(\"L\", t21[0], \"A\", rc0, \",\", rc0, \" 0 0,\", cr, \" \", t03[0]);\n }\n } else {\n path.push(\"L\", x2, \",\", y2);\n }\n } else {\n path.push(\"M\", x0, \",\", y0);\n if (x1 != null) path.push(\"A\", r1, \",\", r1, \" 0 \", l1, \",\", cw, \" \", x1, \",\", y1);\n path.push(\"L\", x2, \",\", y2);\n if (x3 != null) path.push(\"A\", r0, \",\", r0, \" 0 \", l0, \",\", 1 - cw, \" \", x3, \",\", y3);\n }\n path.push(\"Z\");\n return path.join(\"\");\n }\n function circleSegment(r1, cw) {\n return \"M0,\" + r1 + \"A\" + r1 + \",\" + r1 + \" 0 1,\" + cw + \" 0,\" + -r1 + \"A\" + r1 + \",\" + r1 + \" 0 1,\" + cw + \" 0,\" + r1;\n }\n arc.innerRadius = function(v) {\n if (!arguments.length) return innerRadius;\n innerRadius = d3_functor(v);\n return arc;\n };\n arc.outerRadius = function(v) {\n if (!arguments.length) return outerRadius;\n outerRadius = d3_functor(v);\n return arc;\n };\n arc.cornerRadius = function(v) {\n if (!arguments.length) return cornerRadius;\n cornerRadius = d3_functor(v);\n return arc;\n };\n arc.padRadius = function(v) {\n if (!arguments.length) return padRadius;\n padRadius = v == d3_svg_arcAuto ? d3_svg_arcAuto : d3_functor(v);\n return arc;\n };\n arc.startAngle = function(v) {\n if (!arguments.length) return startAngle;\n startAngle = d3_functor(v);\n return arc;\n };\n arc.endAngle = function(v) {\n if (!arguments.length) return endAngle;\n endAngle = d3_functor(v);\n return arc;\n };\n arc.padAngle = function(v) {\n if (!arguments.length) return padAngle;\n padAngle = d3_functor(v);\n return arc;\n };\n arc.centroid = function() {\n var r = (+innerRadius.apply(this, arguments) + +outerRadius.apply(this, arguments)) / 2, a = (+startAngle.apply(this, arguments) + +endAngle.apply(this, arguments)) / 2 - halfπ;\n return [ Math.cos(a) * r, Math.sin(a) * r ];\n };\n return arc;\n };\n var d3_svg_arcAuto = \"auto\";\n function d3_svg_arcInnerRadius(d) {\n return d.innerRadius;\n }\n function d3_svg_arcOuterRadius(d) {\n return d.outerRadius;\n }\n function d3_svg_arcStartAngle(d) {\n return d.startAngle;\n }\n function d3_svg_arcEndAngle(d) {\n return d.endAngle;\n }\n function d3_svg_arcPadAngle(d) {\n return d && d.padAngle;\n }\n function d3_svg_arcSweep(x0, y0, x1, y1) {\n return (x0 - x1) * y0 - (y0 - y1) * x0 > 0 ? 0 : 1;\n }\n function d3_svg_arcCornerTangents(p0, p1, r1, rc, cw) {\n var x01 = p0[0] - p1[0], y01 = p0[1] - p1[1], lo = (cw ? rc : -rc) / Math.sqrt(x01 * x01 + y01 * y01), ox = lo * y01, oy = -lo * x01, x1 = p0[0] + ox, y1 = p0[1] + oy, x2 = p1[0] + ox, y2 = p1[1] + oy, x3 = (x1 + x2) / 2, y3 = (y1 + y2) / 2, dx = x2 - x1, dy = y2 - y1, d2 = dx * dx + dy * dy, r = r1 - rc, D = x1 * y2 - x2 * y1, d = (dy < 0 ? -1 : 1) * Math.sqrt(Math.max(0, r * r * d2 - D * D)), cx0 = (D * dy - dx * d) / d2, cy0 = (-D * dx - dy * d) / d2, cx1 = (D * dy + dx * d) / d2, cy1 = (-D * dx + dy * d) / d2, dx0 = cx0 - x3, dy0 = cy0 - y3, dx1 = cx1 - x3, dy1 = cy1 - y3;\n if (dx0 * dx0 + dy0 * dy0 > dx1 * dx1 + dy1 * dy1) cx0 = cx1, cy0 = cy1;\n return [ [ cx0 - ox, cy0 - oy ], [ cx0 * r1 / r, cy0 * r1 / r ] ];\n }\n function d3_svg_line(projection) {\n var x = d3_geom_pointX, y = d3_geom_pointY, defined = d3_true, interpolate = d3_svg_lineLinear, interpolateKey = interpolate.key, tension = .7;\n function line(data) {\n var segments = [], points = [], i = -1, n = data.length, d, fx = d3_functor(x), fy = d3_functor(y);\n function segment() {\n segments.push(\"M\", interpolate(projection(points), tension));\n }\n while (++i < n) {\n if (defined.call(this, d = data[i], i)) {\n points.push([ +fx.call(this, d, i), +fy.call(this, d, i) ]);\n } else if (points.length) {\n segment();\n points = [];\n }\n }\n if (points.length) segment();\n return segments.length ? segments.join(\"\") : null;\n }\n line.x = function(_) {\n if (!arguments.length) return x;\n x = _;\n return line;\n };\n line.y = function(_) {\n if (!arguments.length) return y;\n y = _;\n return line;\n };\n line.defined = function(_) {\n if (!arguments.length) return defined;\n defined = _;\n return line;\n };\n line.interpolate = function(_) {\n if (!arguments.length) return interpolateKey;\n if (typeof _ === \"function\") interpolateKey = interpolate = _; else interpolateKey = (interpolate = d3_svg_lineInterpolators.get(_) || d3_svg_lineLinear).key;\n return line;\n };\n line.tension = function(_) {\n if (!arguments.length) return tension;\n tension = _;\n return line;\n };\n return line;\n }\n d3.svg.line = function() {\n return d3_svg_line(d3_identity);\n };\n var d3_svg_lineInterpolators = d3.map({\n linear: d3_svg_lineLinear,\n \"linear-closed\": d3_svg_lineLinearClosed,\n step: d3_svg_lineStep,\n \"step-before\": d3_svg_lineStepBefore,\n \"step-after\": d3_svg_lineStepAfter,\n basis: d3_svg_lineBasis,\n \"basis-open\": d3_svg_lineBasisOpen,\n \"basis-closed\": d3_svg_lineBasisClosed,\n bundle: d3_svg_lineBundle,\n cardinal: d3_svg_lineCardinal,\n \"cardinal-open\": d3_svg_lineCardinalOpen,\n \"cardinal-closed\": d3_svg_lineCardinalClosed,\n monotone: d3_svg_lineMonotone\n });\n d3_svg_lineInterpolators.forEach(function(key, value) {\n value.key = key;\n value.closed = /-closed$/.test(key);\n });\n function d3_svg_lineLinear(points) {\n return points.length > 1 ? points.join(\"L\") : points + \"Z\";\n }\n function d3_svg_lineLinearClosed(points) {\n return points.join(\"L\") + \"Z\";\n }\n function d3_svg_lineStep(points) {\n var i = 0, n = points.length, p = points[0], path = [ p[0], \",\", p[1] ];\n while (++i < n) path.push(\"H\", (p[0] + (p = points[i])[0]) / 2, \"V\", p[1]);\n if (n > 1) path.push(\"H\", p[0]);\n return path.join(\"\");\n }\n function d3_svg_lineStepBefore(points) {\n var i = 0, n = points.length, p = points[0], path = [ p[0], \",\", p[1] ];\n while (++i < n) path.push(\"V\", (p = points[i])[1], \"H\", p[0]);\n return path.join(\"\");\n }\n function d3_svg_lineStepAfter(points) {\n var i = 0, n = points.length, p = points[0], path = [ p[0], \",\", p[1] ];\n while (++i < n) path.push(\"H\", (p = points[i])[0], \"V\", p[1]);\n return path.join(\"\");\n }\n function d3_svg_lineCardinalOpen(points, tension) {\n return points.length < 4 ? d3_svg_lineLinear(points) : points[1] + d3_svg_lineHermite(points.slice(1, -1), d3_svg_lineCardinalTangents(points, tension));\n }\n function d3_svg_lineCardinalClosed(points, tension) {\n return points.length < 3 ? d3_svg_lineLinearClosed(points) : points[0] + d3_svg_lineHermite((points.push(points[0]), \n points), d3_svg_lineCardinalTangents([ points[points.length - 2] ].concat(points, [ points[1] ]), tension));\n }\n function d3_svg_lineCardinal(points, tension) {\n return points.length < 3 ? d3_svg_lineLinear(points) : points[0] + d3_svg_lineHermite(points, d3_svg_lineCardinalTangents(points, tension));\n }\n function d3_svg_lineHermite(points, tangents) {\n if (tangents.length < 1 || points.length != tangents.length && points.length != tangents.length + 2) {\n return d3_svg_lineLinear(points);\n }\n var quad = points.length != tangents.length, path = \"\", p0 = points[0], p = points[1], t0 = tangents[0], t = t0, pi = 1;\n if (quad) {\n path += \"Q\" + (p[0] - t0[0] * 2 / 3) + \",\" + (p[1] - t0[1] * 2 / 3) + \",\" + p[0] + \",\" + p[1];\n p0 = points[1];\n pi = 2;\n }\n if (tangents.length > 1) {\n t = tangents[1];\n p = points[pi];\n pi++;\n path += \"C\" + (p0[0] + t0[0]) + \",\" + (p0[1] + t0[1]) + \",\" + (p[0] - t[0]) + \",\" + (p[1] - t[1]) + \",\" + p[0] + \",\" + p[1];\n for (var i = 2; i < tangents.length; i++, pi++) {\n p = points[pi];\n t = tangents[i];\n path += \"S\" + (p[0] - t[0]) + \",\" + (p[1] - t[1]) + \",\" + p[0] + \",\" + p[1];\n }\n }\n if (quad) {\n var lp = points[pi];\n path += \"Q\" + (p[0] + t[0] * 2 / 3) + \",\" + (p[1] + t[1] * 2 / 3) + \",\" + lp[0] + \",\" + lp[1];\n }\n return path;\n }\n function d3_svg_lineCardinalTangents(points, tension) {\n var tangents = [], a = (1 - tension) / 2, p0, p1 = points[0], p2 = points[1], i = 1, n = points.length;\n while (++i < n) {\n p0 = p1;\n p1 = p2;\n p2 = points[i];\n tangents.push([ a * (p2[0] - p0[0]), a * (p2[1] - p0[1]) ]);\n }\n return tangents;\n }\n function d3_svg_lineBasis(points) {\n if (points.length < 3) return d3_svg_lineLinear(points);\n var i = 1, n = points.length, pi = points[0], x0 = pi[0], y0 = pi[1], px = [ x0, x0, x0, (pi = points[1])[0] ], py = [ y0, y0, y0, pi[1] ], path = [ x0, \",\", y0, \"L\", d3_svg_lineDot4(d3_svg_lineBasisBezier3, px), \",\", d3_svg_lineDot4(d3_svg_lineBasisBezier3, py) ];\n points.push(points[n - 1]);\n while (++i <= n) {\n pi = points[i];\n px.shift();\n px.push(pi[0]);\n py.shift();\n py.push(pi[1]);\n d3_svg_lineBasisBezier(path, px, py);\n }\n points.pop();\n path.push(\"L\", pi);\n return path.join(\"\");\n }\n function d3_svg_lineBasisOpen(points) {\n if (points.length < 4) return d3_svg_lineLinear(points);\n var path = [], i = -1, n = points.length, pi, px = [ 0 ], py = [ 0 ];\n while (++i < 3) {\n pi = points[i];\n px.push(pi[0]);\n py.push(pi[1]);\n }\n path.push(d3_svg_lineDot4(d3_svg_lineBasisBezier3, px) + \",\" + d3_svg_lineDot4(d3_svg_lineBasisBezier3, py));\n --i;\n while (++i < n) {\n pi = points[i];\n px.shift();\n px.push(pi[0]);\n py.shift();\n py.push(pi[1]);\n d3_svg_lineBasisBezier(path, px, py);\n }\n return path.join(\"\");\n }\n function d3_svg_lineBasisClosed(points) {\n var path, i = -1, n = points.length, m = n + 4, pi, px = [], py = [];\n while (++i < 4) {\n pi = points[i % n];\n px.push(pi[0]);\n py.push(pi[1]);\n }\n path = [ d3_svg_lineDot4(d3_svg_lineBasisBezier3, px), \",\", d3_svg_lineDot4(d3_svg_lineBasisBezier3, py) ];\n --i;\n while (++i < m) {\n pi = points[i % n];\n px.shift();\n px.push(pi[0]);\n py.shift();\n py.push(pi[1]);\n d3_svg_lineBasisBezier(path, px, py);\n }\n return path.join(\"\");\n }\n function d3_svg_lineBundle(points, tension) {\n var n = points.length - 1;\n if (n) {\n var x0 = points[0][0], y0 = points[0][1], dx = points[n][0] - x0, dy = points[n][1] - y0, i = -1, p, t;\n while (++i <= n) {\n p = points[i];\n t = i / n;\n p[0] = tension * p[0] + (1 - tension) * (x0 + t * dx);\n p[1] = tension * p[1] + (1 - tension) * (y0 + t * dy);\n }\n }\n return d3_svg_lineBasis(points);\n }\n function d3_svg_lineDot4(a, b) {\n return a[0] * b[0] + a[1] * b[1] + a[2] * b[2] + a[3] * b[3];\n }\n var d3_svg_lineBasisBezier1 = [ 0, 2 / 3, 1 / 3, 0 ], d3_svg_lineBasisBezier2 = [ 0, 1 / 3, 2 / 3, 0 ], d3_svg_lineBasisBezier3 = [ 0, 1 / 6, 2 / 3, 1 / 6 ];\n function d3_svg_lineBasisBezier(path, x, y) {\n path.push(\"C\", d3_svg_lineDot4(d3_svg_lineBasisBezier1, x), \",\", d3_svg_lineDot4(d3_svg_lineBasisBezier1, y), \",\", d3_svg_lineDot4(d3_svg_lineBasisBezier2, x), \",\", d3_svg_lineDot4(d3_svg_lineBasisBezier2, y), \",\", d3_svg_lineDot4(d3_svg_lineBasisBezier3, x), \",\", d3_svg_lineDot4(d3_svg_lineBasisBezier3, y));\n }\n function d3_svg_lineSlope(p0, p1) {\n return (p1[1] - p0[1]) / (p1[0] - p0[0]);\n }\n function d3_svg_lineFiniteDifferences(points) {\n var i = 0, j = points.length - 1, m = [], p0 = points[0], p1 = points[1], d = m[0] = d3_svg_lineSlope(p0, p1);\n while (++i < j) {\n m[i] = (d + (d = d3_svg_lineSlope(p0 = p1, p1 = points[i + 1]))) / 2;\n }\n m[i] = d;\n return m;\n }\n function d3_svg_lineMonotoneTangents(points) {\n var tangents = [], d, a, b, s, m = d3_svg_lineFiniteDifferences(points), i = -1, j = points.length - 1;\n while (++i < j) {\n d = d3_svg_lineSlope(points[i], points[i + 1]);\n if (abs(d) < ε) {\n m[i] = m[i + 1] = 0;\n } else {\n a = m[i] / d;\n b = m[i + 1] / d;\n s = a * a + b * b;\n if (s > 9) {\n s = d * 3 / Math.sqrt(s);\n m[i] = s * a;\n m[i + 1] = s * b;\n }\n }\n }\n i = -1;\n while (++i <= j) {\n s = (points[Math.min(j, i + 1)][0] - points[Math.max(0, i - 1)][0]) / (6 * (1 + m[i] * m[i]));\n tangents.push([ s || 0, m[i] * s || 0 ]);\n }\n return tangents;\n }\n function d3_svg_lineMonotone(points) {\n return points.length < 3 ? d3_svg_lineLinear(points) : points[0] + d3_svg_lineHermite(points, d3_svg_lineMonotoneTangents(points));\n }\n d3.svg.line.radial = function() {\n var line = d3_svg_line(d3_svg_lineRadial);\n line.radius = line.x, delete line.x;\n line.angle = line.y, delete line.y;\n return line;\n };\n function d3_svg_lineRadial(points) {\n var point, i = -1, n = points.length, r, a;\n while (++i < n) {\n point = points[i];\n r = point[0];\n a = point[1] - halfπ;\n point[0] = r * Math.cos(a);\n point[1] = r * Math.sin(a);\n }\n return points;\n }\n function d3_svg_area(projection) {\n var x0 = d3_geom_pointX, x1 = d3_geom_pointX, y0 = 0, y1 = d3_geom_pointY, defined = d3_true, interpolate = d3_svg_lineLinear, interpolateKey = interpolate.key, interpolateReverse = interpolate, L = \"L\", tension = .7;\n function area(data) {\n var segments = [], points0 = [], points1 = [], i = -1, n = data.length, d, fx0 = d3_functor(x0), fy0 = d3_functor(y0), fx1 = x0 === x1 ? function() {\n return x;\n } : d3_functor(x1), fy1 = y0 === y1 ? function() {\n return y;\n } : d3_functor(y1), x, y;\n function segment() {\n segments.push(\"M\", interpolate(projection(points1), tension), L, interpolateReverse(projection(points0.reverse()), tension), \"Z\");\n }\n while (++i < n) {\n if (defined.call(this, d = data[i], i)) {\n points0.push([ x = +fx0.call(this, d, i), y = +fy0.call(this, d, i) ]);\n points1.push([ +fx1.call(this, d, i), +fy1.call(this, d, i) ]);\n } else if (points0.length) {\n segment();\n points0 = [];\n points1 = [];\n }\n }\n if (points0.length) segment();\n return segments.length ? segments.join(\"\") : null;\n }\n area.x = function(_) {\n if (!arguments.length) return x1;\n x0 = x1 = _;\n return area;\n };\n area.x0 = function(_) {\n if (!arguments.length) return x0;\n x0 = _;\n return area;\n };\n area.x1 = function(_) {\n if (!arguments.length) return x1;\n x1 = _;\n return area;\n };\n area.y = function(_) {\n if (!arguments.length) return y1;\n y0 = y1 = _;\n return area;\n };\n area.y0 = function(_) {\n if (!arguments.length) return y0;\n y0 = _;\n return area;\n };\n area.y1 = function(_) {\n if (!arguments.length) return y1;\n y1 = _;\n return area;\n };\n area.defined = function(_) {\n if (!arguments.length) return defined;\n defined = _;\n return area;\n };\n area.interpolate = function(_) {\n if (!arguments.length) return interpolateKey;\n if (typeof _ === \"function\") interpolateKey = interpolate = _; else interpolateKey = (interpolate = d3_svg_lineInterpolators.get(_) || d3_svg_lineLinear).key;\n interpolateReverse = interpolate.reverse || interpolate;\n L = interpolate.closed ? \"M\" : \"L\";\n return area;\n };\n area.tension = function(_) {\n if (!arguments.length) return tension;\n tension = _;\n return area;\n };\n return area;\n }\n d3_svg_lineStepBefore.reverse = d3_svg_lineStepAfter;\n d3_svg_lineStepAfter.reverse = d3_svg_lineStepBefore;\n d3.svg.area = function() {\n return d3_svg_area(d3_identity);\n };\n d3.svg.area.radial = function() {\n var area = d3_svg_area(d3_svg_lineRadial);\n area.radius = area.x, delete area.x;\n area.innerRadius = area.x0, delete area.x0;\n area.outerRadius = area.x1, delete area.x1;\n area.angle = area.y, delete area.y;\n area.startAngle = area.y0, delete area.y0;\n area.endAngle = area.y1, delete area.y1;\n return area;\n };\n d3.svg.chord = function() {\n var source = d3_source, target = d3_target, radius = d3_svg_chordRadius, startAngle = d3_svg_arcStartAngle, endAngle = d3_svg_arcEndAngle;\n function chord(d, i) {\n var s = subgroup(this, source, d, i), t = subgroup(this, target, d, i);\n return \"M\" + s.p0 + arc(s.r, s.p1, s.a1 - s.a0) + (equals(s, t) ? curve(s.r, s.p1, s.r, s.p0) : curve(s.r, s.p1, t.r, t.p0) + arc(t.r, t.p1, t.a1 - t.a0) + curve(t.r, t.p1, s.r, s.p0)) + \"Z\";\n }\n function subgroup(self, f, d, i) {\n var subgroup = f.call(self, d, i), r = radius.call(self, subgroup, i), a0 = startAngle.call(self, subgroup, i) - halfπ, a1 = endAngle.call(self, subgroup, i) - halfπ;\n return {\n r: r,\n a0: a0,\n a1: a1,\n p0: [ r * Math.cos(a0), r * Math.sin(a0) ],\n p1: [ r * Math.cos(a1), r * Math.sin(a1) ]\n };\n }\n function equals(a, b) {\n return a.a0 == b.a0 && a.a1 == b.a1;\n }\n function arc(r, p, a) {\n return \"A\" + r + \",\" + r + \" 0 \" + +(a > π) + \",1 \" + p;\n }\n function curve(r0, p0, r1, p1) {\n return \"Q 0,0 \" + p1;\n }\n chord.radius = function(v) {\n if (!arguments.length) return radius;\n radius = d3_functor(v);\n return chord;\n };\n chord.source = function(v) {\n if (!arguments.length) return source;\n source = d3_functor(v);\n return chord;\n };\n chord.target = function(v) {\n if (!arguments.length) return target;\n target = d3_functor(v);\n return chord;\n };\n chord.startAngle = function(v) {\n if (!arguments.length) return startAngle;\n startAngle = d3_functor(v);\n return chord;\n };\n chord.endAngle = function(v) {\n if (!arguments.length) return endAngle;\n endAngle = d3_functor(v);\n return chord;\n };\n return chord;\n };\n function d3_svg_chordRadius(d) {\n return d.radius;\n }\n d3.svg.diagonal = function() {\n var source = d3_source, target = d3_target, projection = d3_svg_diagonalProjection;\n function diagonal(d, i) {\n var p0 = source.call(this, d, i), p3 = target.call(this, d, i), m = (p0.y + p3.y) / 2, p = [ p0, {\n x: p0.x,\n y: m\n }, {\n x: p3.x,\n y: m\n }, p3 ];\n p = p.map(projection);\n return \"M\" + p[0] + \"C\" + p[1] + \" \" + p[2] + \" \" + p[3];\n }\n diagonal.source = function(x) {\n if (!arguments.length) return source;\n source = d3_functor(x);\n return diagonal;\n };\n diagonal.target = function(x) {\n if (!arguments.length) return target;\n target = d3_functor(x);\n return diagonal;\n };\n diagonal.projection = function(x) {\n if (!arguments.length) return projection;\n projection = x;\n return diagonal;\n };\n return diagonal;\n };\n function d3_svg_diagonalProjection(d) {\n return [ d.x, d.y ];\n }\n d3.svg.diagonal.radial = function() {\n var diagonal = d3.svg.diagonal(), projection = d3_svg_diagonalProjection, projection_ = diagonal.projection;\n diagonal.projection = function(x) {\n return arguments.length ? projection_(d3_svg_diagonalRadialProjection(projection = x)) : projection;\n };\n return diagonal;\n };\n function d3_svg_diagonalRadialProjection(projection) {\n return function() {\n var d = projection.apply(this, arguments), r = d[0], a = d[1] - halfπ;\n return [ r * Math.cos(a), r * Math.sin(a) ];\n };\n }\n d3.svg.symbol = function() {\n var type = d3_svg_symbolType, size = d3_svg_symbolSize;\n function symbol(d, i) {\n return (d3_svg_symbols.get(type.call(this, d, i)) || d3_svg_symbolCircle)(size.call(this, d, i));\n }\n symbol.type = function(x) {\n if (!arguments.length) return type;\n type = d3_functor(x);\n return symbol;\n };\n symbol.size = function(x) {\n if (!arguments.length) return size;\n size = d3_functor(x);\n return symbol;\n };\n return symbol;\n };\n function d3_svg_symbolSize() {\n return 64;\n }\n function d3_svg_symbolType() {\n return \"circle\";\n }\n function d3_svg_symbolCircle(size) {\n var r = Math.sqrt(size / π);\n return \"M0,\" + r + \"A\" + r + \",\" + r + \" 0 1,1 0,\" + -r + \"A\" + r + \",\" + r + \" 0 1,1 0,\" + r + \"Z\";\n }\n var d3_svg_symbols = d3.map({\n circle: d3_svg_symbolCircle,\n cross: function(size) {\n var r = Math.sqrt(size / 5) / 2;\n return \"M\" + -3 * r + \",\" + -r + \"H\" + -r + \"V\" + -3 * r + \"H\" + r + \"V\" + -r + \"H\" + 3 * r + \"V\" + r + \"H\" + r + \"V\" + 3 * r + \"H\" + -r + \"V\" + r + \"H\" + -3 * r + \"Z\";\n },\n diamond: function(size) {\n var ry = Math.sqrt(size / (2 * d3_svg_symbolTan30)), rx = ry * d3_svg_symbolTan30;\n return \"M0,\" + -ry + \"L\" + rx + \",0\" + \" 0,\" + ry + \" \" + -rx + \",0\" + \"Z\";\n },\n square: function(size) {\n var r = Math.sqrt(size) / 2;\n return \"M\" + -r + \",\" + -r + \"L\" + r + \",\" + -r + \" \" + r + \",\" + r + \" \" + -r + \",\" + r + \"Z\";\n },\n \"triangle-down\": function(size) {\n var rx = Math.sqrt(size / d3_svg_symbolSqrt3), ry = rx * d3_svg_symbolSqrt3 / 2;\n return \"M0,\" + ry + \"L\" + rx + \",\" + -ry + \" \" + -rx + \",\" + -ry + \"Z\";\n },\n \"triangle-up\": function(size) {\n var rx = Math.sqrt(size / d3_svg_symbolSqrt3), ry = rx * d3_svg_symbolSqrt3 / 2;\n return \"M0,\" + -ry + \"L\" + rx + \",\" + ry + \" \" + -rx + \",\" + ry + \"Z\";\n }\n });\n d3.svg.symbolTypes = d3_svg_symbols.keys();\n var d3_svg_symbolSqrt3 = Math.sqrt(3), d3_svg_symbolTan30 = Math.tan(30 * d3_radians);\n d3_selectionPrototype.transition = function(name) {\n var id = d3_transitionInheritId || ++d3_transitionId, ns = d3_transitionNamespace(name), subgroups = [], subgroup, node, transition = d3_transitionInherit || {\n time: Date.now(),\n ease: d3_ease_cubicInOut,\n delay: 0,\n duration: 250\n };\n for (var j = -1, m = this.length; ++j < m; ) {\n subgroups.push(subgroup = []);\n for (var group = this[j], i = -1, n = group.length; ++i < n; ) {\n if (node = group[i]) d3_transitionNode(node, i, ns, id, transition);\n subgroup.push(node);\n }\n }\n return d3_transition(subgroups, ns, id);\n };\n d3_selectionPrototype.interrupt = function(name) {\n return this.each(name == null ? d3_selection_interrupt : d3_selection_interruptNS(d3_transitionNamespace(name)));\n };\n var d3_selection_interrupt = d3_selection_interruptNS(d3_transitionNamespace());\n function d3_selection_interruptNS(ns) {\n return function() {\n var lock, activeId, active;\n if ((lock = this[ns]) && (active = lock[activeId = lock.active])) {\n active.timer.c = null;\n active.timer.t = NaN;\n if (--lock.count) delete lock[activeId]; else delete this[ns];\n lock.active += .5;\n active.event && active.event.interrupt.call(this, this.__data__, active.index);\n }\n };\n }\n function d3_transition(groups, ns, id) {\n d3_subclass(groups, d3_transitionPrototype);\n groups.namespace = ns;\n groups.id = id;\n return groups;\n }\n var d3_transitionPrototype = [], d3_transitionId = 0, d3_transitionInheritId, d3_transitionInherit;\n d3_transitionPrototype.call = d3_selectionPrototype.call;\n d3_transitionPrototype.empty = d3_selectionPrototype.empty;\n d3_transitionPrototype.node = d3_selectionPrototype.node;\n d3_transitionPrototype.size = d3_selectionPrototype.size;\n d3.transition = function(selection, name) {\n return selection && selection.transition ? d3_transitionInheritId ? selection.transition(name) : selection : d3.selection().transition(selection);\n };\n d3.transition.prototype = d3_transitionPrototype;\n d3_transitionPrototype.select = function(selector) {\n var id = this.id, ns = this.namespace, subgroups = [], subgroup, subnode, node;\n selector = d3_selection_selector(selector);\n for (var j = -1, m = this.length; ++j < m; ) {\n subgroups.push(subgroup = []);\n for (var group = this[j], i = -1, n = group.length; ++i < n; ) {\n if ((node = group[i]) && (subnode = selector.call(node, node.__data__, i, j))) {\n if (\"__data__\" in node) subnode.__data__ = node.__data__;\n d3_transitionNode(subnode, i, ns, id, node[ns][id]);\n subgroup.push(subnode);\n } else {\n subgroup.push(null);\n }\n }\n }\n return d3_transition(subgroups, ns, id);\n };\n d3_transitionPrototype.selectAll = function(selector) {\n var id = this.id, ns = this.namespace, subgroups = [], subgroup, subnodes, node, subnode, transition;\n selector = d3_selection_selectorAll(selector);\n for (var j = -1, m = this.length; ++j < m; ) {\n for (var group = this[j], i = -1, n = group.length; ++i < n; ) {\n if (node = group[i]) {\n transition = node[ns][id];\n subnodes = selector.call(node, node.__data__, i, j);\n subgroups.push(subgroup = []);\n for (var k = -1, o = subnodes.length; ++k < o; ) {\n if (subnode = subnodes[k]) d3_transitionNode(subnode, k, ns, id, transition);\n subgroup.push(subnode);\n }\n }\n }\n }\n return d3_transition(subgroups, ns, id);\n };\n d3_transitionPrototype.filter = function(filter) {\n var subgroups = [], subgroup, group, node;\n if (typeof filter !== \"function\") filter = d3_selection_filter(filter);\n for (var j = 0, m = this.length; j < m; j++) {\n subgroups.push(subgroup = []);\n for (var group = this[j], i = 0, n = group.length; i < n; i++) {\n if ((node = group[i]) && filter.call(node, node.__data__, i, j)) {\n subgroup.push(node);\n }\n }\n }\n return d3_transition(subgroups, this.namespace, this.id);\n };\n d3_transitionPrototype.tween = function(name, tween) {\n var id = this.id, ns = this.namespace;\n if (arguments.length < 2) return this.node()[ns][id].tween.get(name);\n return d3_selection_each(this, tween == null ? function(node) {\n node[ns][id].tween.remove(name);\n } : function(node) {\n node[ns][id].tween.set(name, tween);\n });\n };\n function d3_transition_tween(groups, name, value, tween) {\n var id = groups.id, ns = groups.namespace;\n return d3_selection_each(groups, typeof value === \"function\" ? function(node, i, j) {\n node[ns][id].tween.set(name, tween(value.call(node, node.__data__, i, j)));\n } : (value = tween(value), function(node) {\n node[ns][id].tween.set(name, value);\n }));\n }\n d3_transitionPrototype.attr = function(nameNS, value) {\n if (arguments.length < 2) {\n for (value in nameNS) this.attr(value, nameNS[value]);\n return this;\n }\n var interpolate = nameNS == \"transform\" ? d3_interpolateTransform : d3_interpolate, name = d3.ns.qualify(nameNS);\n function attrNull() {\n this.removeAttribute(name);\n }\n function attrNullNS() {\n this.removeAttributeNS(name.space, name.local);\n }\n function attrTween(b) {\n return b == null ? attrNull : (b += \"\", function() {\n var a = this.getAttribute(name), i;\n return a !== b && (i = interpolate(a, b), function(t) {\n this.setAttribute(name, i(t));\n });\n });\n }\n function attrTweenNS(b) {\n return b == null ? attrNullNS : (b += \"\", function() {\n var a = this.getAttributeNS(name.space, name.local), i;\n return a !== b && (i = interpolate(a, b), function(t) {\n this.setAttributeNS(name.space, name.local, i(t));\n });\n });\n }\n return d3_transition_tween(this, \"attr.\" + nameNS, value, name.local ? attrTweenNS : attrTween);\n };\n d3_transitionPrototype.attrTween = function(nameNS, tween) {\n var name = d3.ns.qualify(nameNS);\n function attrTween(d, i) {\n var f = tween.call(this, d, i, this.getAttribute(name));\n return f && function(t) {\n this.setAttribute(name, f(t));\n };\n }\n function attrTweenNS(d, i) {\n var f = tween.call(this, d, i, this.getAttributeNS(name.space, name.local));\n return f && function(t) {\n this.setAttributeNS(name.space, name.local, f(t));\n };\n }\n return this.tween(\"attr.\" + nameNS, name.local ? attrTweenNS : attrTween);\n };\n d3_transitionPrototype.style = function(name, value, priority) {\n var n = arguments.length;\n if (n < 3) {\n if (typeof name !== \"string\") {\n if (n < 2) value = \"\";\n for (priority in name) this.style(priority, name[priority], value);\n return this;\n }\n priority = \"\";\n }\n function styleNull() {\n this.style.removeProperty(name);\n }\n function styleString(b) {\n return b == null ? styleNull : (b += \"\", function() {\n var a = d3_window(this).getComputedStyle(this, null).getPropertyValue(name), i;\n return a !== b && (i = d3_interpolate(a, b), function(t) {\n this.style.setProperty(name, i(t), priority);\n });\n });\n }\n return d3_transition_tween(this, \"style.\" + name, value, styleString);\n };\n d3_transitionPrototype.styleTween = function(name, tween, priority) {\n if (arguments.length < 3) priority = \"\";\n function styleTween(d, i) {\n var f = tween.call(this, d, i, d3_window(this).getComputedStyle(this, null).getPropertyValue(name));\n return f && function(t) {\n this.style.setProperty(name, f(t), priority);\n };\n }\n return this.tween(\"style.\" + name, styleTween);\n };\n d3_transitionPrototype.text = function(value) {\n return d3_transition_tween(this, \"text\", value, d3_transition_text);\n };\n function d3_transition_text(b) {\n if (b == null) b = \"\";\n return function() {\n this.textContent = b;\n };\n }\n d3_transitionPrototype.remove = function() {\n var ns = this.namespace;\n return this.each(\"end.transition\", function() {\n var p;\n if (this[ns].count < 2 && (p = this.parentNode)) p.removeChild(this);\n });\n };\n d3_transitionPrototype.ease = function(value) {\n var id = this.id, ns = this.namespace;\n if (arguments.length < 1) return this.node()[ns][id].ease;\n if (typeof value !== \"function\") value = d3.ease.apply(d3, arguments);\n return d3_selection_each(this, function(node) {\n node[ns][id].ease = value;\n });\n };\n d3_transitionPrototype.delay = function(value) {\n var id = this.id, ns = this.namespace;\n if (arguments.length < 1) return this.node()[ns][id].delay;\n return d3_selection_each(this, typeof value === \"function\" ? function(node, i, j) {\n node[ns][id].delay = +value.call(node, node.__data__, i, j);\n } : (value = +value, function(node) {\n node[ns][id].delay = value;\n }));\n };\n d3_transitionPrototype.duration = function(value) {\n var id = this.id, ns = this.namespace;\n if (arguments.length < 1) return this.node()[ns][id].duration;\n return d3_selection_each(this, typeof value === \"function\" ? function(node, i, j) {\n node[ns][id].duration = Math.max(1, value.call(node, node.__data__, i, j));\n } : (value = Math.max(1, value), function(node) {\n node[ns][id].duration = value;\n }));\n };\n d3_transitionPrototype.each = function(type, listener) {\n var id = this.id, ns = this.namespace;\n if (arguments.length < 2) {\n var inherit = d3_transitionInherit, inheritId = d3_transitionInheritId;\n try {\n d3_transitionInheritId = id;\n d3_selection_each(this, function(node, i, j) {\n d3_transitionInherit = node[ns][id];\n type.call(node, node.__data__, i, j);\n });\n } finally {\n d3_transitionInherit = inherit;\n d3_transitionInheritId = inheritId;\n }\n } else {\n d3_selection_each(this, function(node) {\n var transition = node[ns][id];\n (transition.event || (transition.event = d3.dispatch(\"start\", \"end\", \"interrupt\"))).on(type, listener);\n });\n }\n return this;\n };\n d3_transitionPrototype.transition = function() {\n var id0 = this.id, id1 = ++d3_transitionId, ns = this.namespace, subgroups = [], subgroup, group, node, transition;\n for (var j = 0, m = this.length; j < m; j++) {\n subgroups.push(subgroup = []);\n for (var group = this[j], i = 0, n = group.length; i < n; i++) {\n if (node = group[i]) {\n transition = node[ns][id0];\n d3_transitionNode(node, i, ns, id1, {\n time: transition.time,\n ease: transition.ease,\n delay: transition.delay + transition.duration,\n duration: transition.duration\n });\n }\n subgroup.push(node);\n }\n }\n return d3_transition(subgroups, ns, id1);\n };\n function d3_transitionNamespace(name) {\n return name == null ? \"__transition__\" : \"__transition_\" + name + \"__\";\n }\n function d3_transitionNode(node, i, ns, id, inherit) {\n var lock = node[ns] || (node[ns] = {\n active: 0,\n count: 0\n }), transition = lock[id], time, timer, duration, ease, tweens;\n function schedule(elapsed) {\n var delay = transition.delay;\n timer.t = delay + time;\n if (delay <= elapsed) return start(elapsed - delay);\n timer.c = start;\n }\n function start(elapsed) {\n var activeId = lock.active, active = lock[activeId];\n if (active) {\n active.timer.c = null;\n active.timer.t = NaN;\n --lock.count;\n delete lock[activeId];\n active.event && active.event.interrupt.call(node, node.__data__, active.index);\n }\n for (var cancelId in lock) {\n if (+cancelId < id) {\n var cancel = lock[cancelId];\n cancel.timer.c = null;\n cancel.timer.t = NaN;\n --lock.count;\n delete lock[cancelId];\n }\n }\n timer.c = tick;\n d3_timer(function() {\n if (timer.c && tick(elapsed || 1)) {\n timer.c = null;\n timer.t = NaN;\n }\n return 1;\n }, 0, time);\n lock.active = id;\n transition.event && transition.event.start.call(node, node.__data__, i);\n tweens = [];\n transition.tween.forEach(function(key, value) {\n if (value = value.call(node, node.__data__, i)) {\n tweens.push(value);\n }\n });\n ease = transition.ease;\n duration = transition.duration;\n }\n function tick(elapsed) {\n var t = elapsed / duration, e = ease(t), n = tweens.length;\n while (n > 0) {\n tweens[--n].call(node, e);\n }\n if (t >= 1) {\n transition.event && transition.event.end.call(node, node.__data__, i);\n if (--lock.count) delete lock[id]; else delete node[ns];\n return 1;\n }\n }\n if (!transition) {\n time = inherit.time;\n timer = d3_timer(schedule, 0, time);\n transition = lock[id] = {\n tween: new d3_Map(),\n time: time,\n timer: timer,\n delay: inherit.delay,\n duration: inherit.duration,\n ease: inherit.ease,\n index: i\n };\n inherit = null;\n ++lock.count;\n }\n }\n d3.svg.axis = function() {\n var scale = d3.scale.linear(), orient = d3_svg_axisDefaultOrient, innerTickSize = 6, outerTickSize = 6, tickPadding = 3, tickArguments_ = [ 10 ], tickValues = null, tickFormat_;\n function axis(g) {\n g.each(function() {\n var g = d3.select(this);\n var scale0 = this.__chart__ || scale, scale1 = this.__chart__ = scale.copy();\n var ticks = tickValues == null ? scale1.ticks ? scale1.ticks.apply(scale1, tickArguments_) : scale1.domain() : tickValues, tickFormat = tickFormat_ == null ? scale1.tickFormat ? scale1.tickFormat.apply(scale1, tickArguments_) : d3_identity : tickFormat_, tick = g.selectAll(\".tick\").data(ticks, scale1), tickEnter = tick.enter().insert(\"g\", \".domain\").attr(\"class\", \"tick\").style(\"opacity\", ε), tickExit = d3.transition(tick.exit()).style(\"opacity\", ε).remove(), tickUpdate = d3.transition(tick.order()).style(\"opacity\", 1), tickSpacing = Math.max(innerTickSize, 0) + tickPadding, tickTransform;\n var range = d3_scaleRange(scale1), path = g.selectAll(\".domain\").data([ 0 ]), pathUpdate = (path.enter().append(\"path\").attr(\"class\", \"domain\"), \n d3.transition(path));\n tickEnter.append(\"line\");\n tickEnter.append(\"text\");\n var lineEnter = tickEnter.select(\"line\"), lineUpdate = tickUpdate.select(\"line\"), text = tick.select(\"text\").text(tickFormat), textEnter = tickEnter.select(\"text\"), textUpdate = tickUpdate.select(\"text\"), sign = orient === \"top\" || orient === \"left\" ? -1 : 1, x1, x2, y1, y2;\n if (orient === \"bottom\" || orient === \"top\") {\n tickTransform = d3_svg_axisX, x1 = \"x\", y1 = \"y\", x2 = \"x2\", y2 = \"y2\";\n text.attr(\"dy\", sign < 0 ? \"0em\" : \".71em\").style(\"text-anchor\", \"middle\");\n pathUpdate.attr(\"d\", \"M\" + range[0] + \",\" + sign * outerTickSize + \"V0H\" + range[1] + \"V\" + sign * outerTickSize);\n } else {\n tickTransform = d3_svg_axisY, x1 = \"y\", y1 = \"x\", x2 = \"y2\", y2 = \"x2\";\n text.attr(\"dy\", \".32em\").style(\"text-anchor\", sign < 0 ? \"end\" : \"start\");\n pathUpdate.attr(\"d\", \"M\" + sign * outerTickSize + \",\" + range[0] + \"H0V\" + range[1] + \"H\" + sign * outerTickSize);\n }\n lineEnter.attr(y2, sign * innerTickSize);\n textEnter.attr(y1, sign * tickSpacing);\n lineUpdate.attr(x2, 0).attr(y2, sign * innerTickSize);\n textUpdate.attr(x1, 0).attr(y1, sign * tickSpacing);\n if (scale1.rangeBand) {\n var x = scale1, dx = x.rangeBand() / 2;\n scale0 = scale1 = function(d) {\n return x(d) + dx;\n };\n } else if (scale0.rangeBand) {\n scale0 = scale1;\n } else {\n tickExit.call(tickTransform, scale1, scale0);\n }\n tickEnter.call(tickTransform, scale0, scale1);\n tickUpdate.call(tickTransform, scale1, scale1);\n });\n }\n axis.scale = function(x) {\n if (!arguments.length) return scale;\n scale = x;\n return axis;\n };\n axis.orient = function(x) {\n if (!arguments.length) return orient;\n orient = x in d3_svg_axisOrients ? x + \"\" : d3_svg_axisDefaultOrient;\n return axis;\n };\n axis.ticks = function() {\n if (!arguments.length) return tickArguments_;\n tickArguments_ = d3_array(arguments);\n return axis;\n };\n axis.tickValues = function(x) {\n if (!arguments.length) return tickValues;\n tickValues = x;\n return axis;\n };\n axis.tickFormat = function(x) {\n if (!arguments.length) return tickFormat_;\n tickFormat_ = x;\n return axis;\n };\n axis.tickSize = function(x) {\n var n = arguments.length;\n if (!n) return innerTickSize;\n innerTickSize = +x;\n outerTickSize = +arguments[n - 1];\n return axis;\n };\n axis.innerTickSize = function(x) {\n if (!arguments.length) return innerTickSize;\n innerTickSize = +x;\n return axis;\n };\n axis.outerTickSize = function(x) {\n if (!arguments.length) return outerTickSize;\n outerTickSize = +x;\n return axis;\n };\n axis.tickPadding = function(x) {\n if (!arguments.length) return tickPadding;\n tickPadding = +x;\n return axis;\n };\n axis.tickSubdivide = function() {\n return arguments.length && axis;\n };\n return axis;\n };\n var d3_svg_axisDefaultOrient = \"bottom\", d3_svg_axisOrients = {\n top: 1,\n right: 1,\n bottom: 1,\n left: 1\n };\n function d3_svg_axisX(selection, x0, x1) {\n selection.attr(\"transform\", function(d) {\n var v0 = x0(d);\n return \"translate(\" + (isFinite(v0) ? v0 : x1(d)) + \",0)\";\n });\n }\n function d3_svg_axisY(selection, y0, y1) {\n selection.attr(\"transform\", function(d) {\n var v0 = y0(d);\n return \"translate(0,\" + (isFinite(v0) ? v0 : y1(d)) + \")\";\n });\n }\n d3.svg.brush = function() {\n var event = d3_eventDispatch(brush, \"brushstart\", \"brush\", \"brushend\"), x = null, y = null, xExtent = [ 0, 0 ], yExtent = [ 0, 0 ], xExtentDomain, yExtentDomain, xClamp = true, yClamp = true, resizes = d3_svg_brushResizes[0];\n function brush(g) {\n g.each(function() {\n var g = d3.select(this).style(\"pointer-events\", \"all\").style(\"-webkit-tap-highlight-color\", \"rgba(0,0,0,0)\").on(\"mousedown.brush\", brushstart).on(\"touchstart.brush\", brushstart);\n var background = g.selectAll(\".background\").data([ 0 ]);\n background.enter().append(\"rect\").attr(\"class\", \"background\").style(\"visibility\", \"hidden\").style(\"cursor\", \"crosshair\");\n g.selectAll(\".extent\").data([ 0 ]).enter().append(\"rect\").attr(\"class\", \"extent\").style(\"cursor\", \"move\");\n var resize = g.selectAll(\".resize\").data(resizes, d3_identity);\n resize.exit().remove();\n resize.enter().append(\"g\").attr(\"class\", function(d) {\n return \"resize \" + d;\n }).style(\"cursor\", function(d) {\n return d3_svg_brushCursor[d];\n }).append(\"rect\").attr(\"x\", function(d) {\n return /[ew]$/.test(d) ? -3 : null;\n }).attr(\"y\", function(d) {\n return /^[ns]/.test(d) ? -3 : null;\n }).attr(\"width\", 6).attr(\"height\", 6).style(\"visibility\", \"hidden\");\n resize.style(\"display\", brush.empty() ? \"none\" : null);\n var gUpdate = d3.transition(g), backgroundUpdate = d3.transition(background), range;\n if (x) {\n range = d3_scaleRange(x);\n backgroundUpdate.attr(\"x\", range[0]).attr(\"width\", range[1] - range[0]);\n redrawX(gUpdate);\n }\n if (y) {\n range = d3_scaleRange(y);\n backgroundUpdate.attr(\"y\", range[0]).attr(\"height\", range[1] - range[0]);\n redrawY(gUpdate);\n }\n redraw(gUpdate);\n });\n }\n brush.event = function(g) {\n g.each(function() {\n var event_ = event.of(this, arguments), extent1 = {\n x: xExtent,\n y: yExtent,\n i: xExtentDomain,\n j: yExtentDomain\n }, extent0 = this.__chart__ || extent1;\n this.__chart__ = extent1;\n if (d3_transitionInheritId) {\n d3.select(this).transition().each(\"start.brush\", function() {\n xExtentDomain = extent0.i;\n yExtentDomain = extent0.j;\n xExtent = extent0.x;\n yExtent = extent0.y;\n event_({\n type: \"brushstart\"\n });\n }).tween(\"brush:brush\", function() {\n var xi = d3_interpolateArray(xExtent, extent1.x), yi = d3_interpolateArray(yExtent, extent1.y);\n xExtentDomain = yExtentDomain = null;\n return function(t) {\n xExtent = extent1.x = xi(t);\n yExtent = extent1.y = yi(t);\n event_({\n type: \"brush\",\n mode: \"resize\"\n });\n };\n }).each(\"end.brush\", function() {\n xExtentDomain = extent1.i;\n yExtentDomain = extent1.j;\n event_({\n type: \"brush\",\n mode: \"resize\"\n });\n event_({\n type: \"brushend\"\n });\n });\n } else {\n event_({\n type: \"brushstart\"\n });\n event_({\n type: \"brush\",\n mode: \"resize\"\n });\n event_({\n type: \"brushend\"\n });\n }\n });\n };\n function redraw(g) {\n g.selectAll(\".resize\").attr(\"transform\", function(d) {\n return \"translate(\" + xExtent[+/e$/.test(d)] + \",\" + yExtent[+/^s/.test(d)] + \")\";\n });\n }\n function redrawX(g) {\n g.select(\".extent\").attr(\"x\", xExtent[0]);\n g.selectAll(\".extent,.n>rect,.s>rect\").attr(\"width\", xExtent[1] - xExtent[0]);\n }\n function redrawY(g) {\n g.select(\".extent\").attr(\"y\", yExtent[0]);\n g.selectAll(\".extent,.e>rect,.w>rect\").attr(\"height\", yExtent[1] - yExtent[0]);\n }\n function brushstart() {\n var target = this, eventTarget = d3.select(d3.event.target), event_ = event.of(target, arguments), g = d3.select(target), resizing = eventTarget.datum(), resizingX = !/^(n|s)$/.test(resizing) && x, resizingY = !/^(e|w)$/.test(resizing) && y, dragging = eventTarget.classed(\"extent\"), dragRestore = d3_event_dragSuppress(target), center, origin = d3.mouse(target), offset;\n var w = d3.select(d3_window(target)).on(\"keydown.brush\", keydown).on(\"keyup.brush\", keyup);\n if (d3.event.changedTouches) {\n w.on(\"touchmove.brush\", brushmove).on(\"touchend.brush\", brushend);\n } else {\n w.on(\"mousemove.brush\", brushmove).on(\"mouseup.brush\", brushend);\n }\n g.interrupt().selectAll(\"*\").interrupt();\n if (dragging) {\n origin[0] = xExtent[0] - origin[0];\n origin[1] = yExtent[0] - origin[1];\n } else if (resizing) {\n var ex = +/w$/.test(resizing), ey = +/^n/.test(resizing);\n offset = [ xExtent[1 - ex] - origin[0], yExtent[1 - ey] - origin[1] ];\n origin[0] = xExtent[ex];\n origin[1] = yExtent[ey];\n } else if (d3.event.altKey) center = origin.slice();\n g.style(\"pointer-events\", \"none\").selectAll(\".resize\").style(\"display\", null);\n d3.select(\"body\").style(\"cursor\", eventTarget.style(\"cursor\"));\n event_({\n type: \"brushstart\"\n });\n brushmove();\n function keydown() {\n if (d3.event.keyCode == 32) {\n if (!dragging) {\n center = null;\n origin[0] -= xExtent[1];\n origin[1] -= yExtent[1];\n dragging = 2;\n }\n d3_eventPreventDefault();\n }\n }\n function keyup() {\n if (d3.event.keyCode == 32 && dragging == 2) {\n origin[0] += xExtent[1];\n origin[1] += yExtent[1];\n dragging = 0;\n d3_eventPreventDefault();\n }\n }\n function brushmove() {\n var point = d3.mouse(target), moved = false;\n if (offset) {\n point[0] += offset[0];\n point[1] += offset[1];\n }\n if (!dragging) {\n if (d3.event.altKey) {\n if (!center) center = [ (xExtent[0] + xExtent[1]) / 2, (yExtent[0] + yExtent[1]) / 2 ];\n origin[0] = xExtent[+(point[0] < center[0])];\n origin[1] = yExtent[+(point[1] < center[1])];\n } else center = null;\n }\n if (resizingX && move1(point, x, 0)) {\n redrawX(g);\n moved = true;\n }\n if (resizingY && move1(point, y, 1)) {\n redrawY(g);\n moved = true;\n }\n if (moved) {\n redraw(g);\n event_({\n type: \"brush\",\n mode: dragging ? \"move\" : \"resize\"\n });\n }\n }\n function move1(point, scale, i) {\n var range = d3_scaleRange(scale), r0 = range[0], r1 = range[1], position = origin[i], extent = i ? yExtent : xExtent, size = extent[1] - extent[0], min, max;\n if (dragging) {\n r0 -= position;\n r1 -= size + position;\n }\n min = (i ? yClamp : xClamp) ? Math.max(r0, Math.min(r1, point[i])) : point[i];\n if (dragging) {\n max = (min += position) + size;\n } else {\n if (center) position = Math.max(r0, Math.min(r1, 2 * center[i] - min));\n if (position < min) {\n max = min;\n min = position;\n } else {\n max = position;\n }\n }\n if (extent[0] != min || extent[1] != max) {\n if (i) yExtentDomain = null; else xExtentDomain = null;\n extent[0] = min;\n extent[1] = max;\n return true;\n }\n }\n function brushend() {\n brushmove();\n g.style(\"pointer-events\", \"all\").selectAll(\".resize\").style(\"display\", brush.empty() ? \"none\" : null);\n d3.select(\"body\").style(\"cursor\", null);\n w.on(\"mousemove.brush\", null).on(\"mouseup.brush\", null).on(\"touchmove.brush\", null).on(\"touchend.brush\", null).on(\"keydown.brush\", null).on(\"keyup.brush\", null);\n dragRestore();\n event_({\n type: \"brushend\"\n });\n }\n }\n brush.x = function(z) {\n if (!arguments.length) return x;\n x = z;\n resizes = d3_svg_brushResizes[!x << 1 | !y];\n return brush;\n };\n brush.y = function(z) {\n if (!arguments.length) return y;\n y = z;\n resizes = d3_svg_brushResizes[!x << 1 | !y];\n return brush;\n };\n brush.clamp = function(z) {\n if (!arguments.length) return x && y ? [ xClamp, yClamp ] : x ? xClamp : y ? yClamp : null;\n if (x && y) xClamp = !!z[0], yClamp = !!z[1]; else if (x) xClamp = !!z; else if (y) yClamp = !!z;\n return brush;\n };\n brush.extent = function(z) {\n var x0, x1, y0, y1, t;\n if (!arguments.length) {\n if (x) {\n if (xExtentDomain) {\n x0 = xExtentDomain[0], x1 = xExtentDomain[1];\n } else {\n x0 = xExtent[0], x1 = xExtent[1];\n if (x.invert) x0 = x.invert(x0), x1 = x.invert(x1);\n if (x1 < x0) t = x0, x0 = x1, x1 = t;\n }\n }\n if (y) {\n if (yExtentDomain) {\n y0 = yExtentDomain[0], y1 = yExtentDomain[1];\n } else {\n y0 = yExtent[0], y1 = yExtent[1];\n if (y.invert) y0 = y.invert(y0), y1 = y.invert(y1);\n if (y1 < y0) t = y0, y0 = y1, y1 = t;\n }\n }\n return x && y ? [ [ x0, y0 ], [ x1, y1 ] ] : x ? [ x0, x1 ] : y && [ y0, y1 ];\n }\n if (x) {\n x0 = z[0], x1 = z[1];\n if (y) x0 = x0[0], x1 = x1[0];\n xExtentDomain = [ x0, x1 ];\n if (x.invert) x0 = x(x0), x1 = x(x1);\n if (x1 < x0) t = x0, x0 = x1, x1 = t;\n if (x0 != xExtent[0] || x1 != xExtent[1]) xExtent = [ x0, x1 ];\n }\n if (y) {\n y0 = z[0], y1 = z[1];\n if (x) y0 = y0[1], y1 = y1[1];\n yExtentDomain = [ y0, y1 ];\n if (y.invert) y0 = y(y0), y1 = y(y1);\n if (y1 < y0) t = y0, y0 = y1, y1 = t;\n if (y0 != yExtent[0] || y1 != yExtent[1]) yExtent = [ y0, y1 ];\n }\n return brush;\n };\n brush.clear = function() {\n if (!brush.empty()) {\n xExtent = [ 0, 0 ], yExtent = [ 0, 0 ];\n xExtentDomain = yExtentDomain = null;\n }\n return brush;\n };\n brush.empty = function() {\n return !!x && xExtent[0] == xExtent[1] || !!y && yExtent[0] == yExtent[1];\n };\n return d3.rebind(brush, event, \"on\");\n };\n var d3_svg_brushCursor = {\n n: \"ns-resize\",\n e: \"ew-resize\",\n s: \"ns-resize\",\n w: \"ew-resize\",\n nw: \"nwse-resize\",\n ne: \"nesw-resize\",\n se: \"nwse-resize\",\n sw: \"nesw-resize\"\n };\n var d3_svg_brushResizes = [ [ \"n\", \"e\", \"s\", \"w\", \"nw\", \"ne\", \"se\", \"sw\" ], [ \"e\", \"w\" ], [ \"n\", \"s\" ], [] ];\n var d3_time_format = d3_time.format = d3_locale_enUS.timeFormat;\n var d3_time_formatUtc = d3_time_format.utc;\n var d3_time_formatIso = d3_time_formatUtc(\"%Y-%m-%dT%H:%M:%S.%LZ\");\n d3_time_format.iso = Date.prototype.toISOString && +new Date(\"2000-01-01T00:00:00.000Z\") ? d3_time_formatIsoNative : d3_time_formatIso;\n function d3_time_formatIsoNative(date) {\n return date.toISOString();\n }\n d3_time_formatIsoNative.parse = function(string) {\n var date = new Date(string);\n return isNaN(date) ? null : date;\n };\n d3_time_formatIsoNative.toString = d3_time_formatIso.toString;\n d3_time.second = d3_time_interval(function(date) {\n return new d3_date(Math.floor(date / 1e3) * 1e3);\n }, function(date, offset) {\n date.setTime(date.getTime() + Math.floor(offset) * 1e3);\n }, function(date) {\n return date.getSeconds();\n });\n d3_time.seconds = d3_time.second.range;\n d3_time.seconds.utc = d3_time.second.utc.range;\n d3_time.minute = d3_time_interval(function(date) {\n return new d3_date(Math.floor(date / 6e4) * 6e4);\n }, function(date, offset) {\n date.setTime(date.getTime() + Math.floor(offset) * 6e4);\n }, function(date) {\n return date.getMinutes();\n });\n d3_time.minutes = d3_time.minute.range;\n d3_time.minutes.utc = d3_time.minute.utc.range;\n d3_time.hour = d3_time_interval(function(date) {\n var timezone = date.getTimezoneOffset() / 60;\n return new d3_date((Math.floor(date / 36e5 - timezone) + timezone) * 36e5);\n }, function(date, offset) {\n date.setTime(date.getTime() + Math.floor(offset) * 36e5);\n }, function(date) {\n return date.getHours();\n });\n d3_time.hours = d3_time.hour.range;\n d3_time.hours.utc = d3_time.hour.utc.range;\n d3_time.month = d3_time_interval(function(date) {\n date = d3_time.day(date);\n date.setDate(1);\n return date;\n }, function(date, offset) {\n date.setMonth(date.getMonth() + offset);\n }, function(date) {\n return date.getMonth();\n });\n d3_time.months = d3_time.month.range;\n d3_time.months.utc = d3_time.month.utc.range;\n function d3_time_scale(linear, methods, format) {\n function scale(x) {\n return linear(x);\n }\n scale.invert = function(x) {\n return d3_time_scaleDate(linear.invert(x));\n };\n scale.domain = function(x) {\n if (!arguments.length) return linear.domain().map(d3_time_scaleDate);\n linear.domain(x);\n return scale;\n };\n function tickMethod(extent, count) {\n var span = extent[1] - extent[0], target = span / count, i = d3.bisect(d3_time_scaleSteps, target);\n return i == d3_time_scaleSteps.length ? [ methods.year, d3_scale_linearTickRange(extent.map(function(d) {\n return d / 31536e6;\n }), count)[2] ] : !i ? [ d3_time_scaleMilliseconds, d3_scale_linearTickRange(extent, count)[2] ] : methods[target / d3_time_scaleSteps[i - 1] < d3_time_scaleSteps[i] / target ? i - 1 : i];\n }\n scale.nice = function(interval, skip) {\n var domain = scale.domain(), extent = d3_scaleExtent(domain), method = interval == null ? tickMethod(extent, 10) : typeof interval === \"number\" && tickMethod(extent, interval);\n if (method) interval = method[0], skip = method[1];\n function skipped(date) {\n return !isNaN(date) && !interval.range(date, d3_time_scaleDate(+date + 1), skip).length;\n }\n return scale.domain(d3_scale_nice(domain, skip > 1 ? {\n floor: function(date) {\n while (skipped(date = interval.floor(date))) date = d3_time_scaleDate(date - 1);\n return date;\n },\n ceil: function(date) {\n while (skipped(date = interval.ceil(date))) date = d3_time_scaleDate(+date + 1);\n return date;\n }\n } : interval));\n };\n scale.ticks = function(interval, skip) {\n var extent = d3_scaleExtent(scale.domain()), method = interval == null ? tickMethod(extent, 10) : typeof interval === \"number\" ? tickMethod(extent, interval) : !interval.range && [ {\n range: interval\n }, skip ];\n if (method) interval = method[0], skip = method[1];\n return interval.range(extent[0], d3_time_scaleDate(+extent[1] + 1), skip < 1 ? 1 : skip);\n };\n scale.tickFormat = function() {\n return format;\n };\n scale.copy = function() {\n return d3_time_scale(linear.copy(), methods, format);\n };\n return d3_scale_linearRebind(scale, linear);\n }\n function d3_time_scaleDate(t) {\n return new Date(t);\n }\n var d3_time_scaleSteps = [ 1e3, 5e3, 15e3, 3e4, 6e4, 3e5, 9e5, 18e5, 36e5, 108e5, 216e5, 432e5, 864e5, 1728e5, 6048e5, 2592e6, 7776e6, 31536e6 ];\n var d3_time_scaleLocalMethods = [ [ d3_time.second, 1 ], [ d3_time.second, 5 ], [ d3_time.second, 15 ], [ d3_time.second, 30 ], [ d3_time.minute, 1 ], [ d3_time.minute, 5 ], [ d3_time.minute, 15 ], [ d3_time.minute, 30 ], [ d3_time.hour, 1 ], [ d3_time.hour, 3 ], [ d3_time.hour, 6 ], [ d3_time.hour, 12 ], [ d3_time.day, 1 ], [ d3_time.day, 2 ], [ d3_time.week, 1 ], [ d3_time.month, 1 ], [ d3_time.month, 3 ], [ d3_time.year, 1 ] ];\n var d3_time_scaleLocalFormat = d3_time_format.multi([ [ \".%L\", function(d) {\n return d.getMilliseconds();\n } ], [ \":%S\", function(d) {\n return d.getSeconds();\n } ], [ \"%I:%M\", function(d) {\n return d.getMinutes();\n } ], [ \"%I %p\", function(d) {\n return d.getHours();\n } ], [ \"%a %d\", function(d) {\n return d.getDay() && d.getDate() != 1;\n } ], [ \"%b %d\", function(d) {\n return d.getDate() != 1;\n } ], [ \"%B\", function(d) {\n return d.getMonth();\n } ], [ \"%Y\", d3_true ] ]);\n var d3_time_scaleMilliseconds = {\n range: function(start, stop, step) {\n return d3.range(Math.ceil(start / step) * step, +stop, step).map(d3_time_scaleDate);\n },\n floor: d3_identity,\n ceil: d3_identity\n };\n d3_time_scaleLocalMethods.year = d3_time.year;\n d3_time.scale = function() {\n return d3_time_scale(d3.scale.linear(), d3_time_scaleLocalMethods, d3_time_scaleLocalFormat);\n };\n var d3_time_scaleUtcMethods = d3_time_scaleLocalMethods.map(function(m) {\n return [ m[0].utc, m[1] ];\n });\n var d3_time_scaleUtcFormat = d3_time_formatUtc.multi([ [ \".%L\", function(d) {\n return d.getUTCMilliseconds();\n } ], [ \":%S\", function(d) {\n return d.getUTCSeconds();\n } ], [ \"%I:%M\", function(d) {\n return d.getUTCMinutes();\n } ], [ \"%I %p\", function(d) {\n return d.getUTCHours();\n } ], [ \"%a %d\", function(d) {\n return d.getUTCDay() && d.getUTCDate() != 1;\n } ], [ \"%b %d\", function(d) {\n return d.getUTCDate() != 1;\n } ], [ \"%B\", function(d) {\n return d.getUTCMonth();\n } ], [ \"%Y\", d3_true ] ]);\n d3_time_scaleUtcMethods.year = d3_time.year.utc;\n d3_time.scale.utc = function() {\n return d3_time_scale(d3.scale.linear(), d3_time_scaleUtcMethods, d3_time_scaleUtcFormat);\n };\n d3.text = d3_xhrType(function(request) {\n return request.responseText;\n });\n d3.json = function(url, callback) {\n return d3_xhr(url, \"application/json\", d3_json, callback);\n };\n function d3_json(request) {\n return JSON.parse(request.responseText);\n }\n d3.html = function(url, callback) {\n return d3_xhr(url, \"text/html\", d3_html, callback);\n };\n function d3_html(request) {\n var range = d3_document.createRange();\n range.selectNode(d3_document.body);\n return range.createContextualFragment(request.responseText);\n }\n d3.xml = d3_xhrType(function(request) {\n return request.responseXML;\n });\n if (typeof define === \"function\" && define.amd) this.d3 = d3, define(d3); else if (typeof module === \"object\" && module.exports) module.exports = d3; else this.d3 = d3;\n}();", + "/**\n * Helpers.\n */\n\nvar s = 1000\nvar m = s * 60\nvar h = m * 60\nvar d = h * 24\nvar y = d * 365.25\n\n/**\n * Parse or format the given `val`.\n *\n * Options:\n *\n * - `long` verbose formatting [false]\n *\n * @param {String|Number} val\n * @param {Object} options\n * @throws {Error} throw an error if val is not a non-empty string or a number\n * @return {String|Number}\n * @api public\n */\n\nmodule.exports = function (val, options) {\n options = options || {}\n var type = typeof val\n if (type === 'string' && val.length > 0) {\n return parse(val)\n } else if (type === 'number' && isNaN(val) === false) {\n return options.long ?\n\t\t\tfmtLong(val) :\n\t\t\tfmtShort(val)\n }\n throw new Error('val is not a non-empty string or a valid number. val=' + JSON.stringify(val))\n}\n\n/**\n * Parse the given `str` and return milliseconds.\n *\n * @param {String} str\n * @return {Number}\n * @api private\n */\n\nfunction parse(str) {\n str = String(str)\n if (str.length > 10000) {\n return\n }\n var match = /^((?:\\d+)?\\.?\\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|years?|yrs?|y)?$/i.exec(str)\n if (!match) {\n return\n }\n var n = parseFloat(match[1])\n var type = (match[2] || 'ms').toLowerCase()\n switch (type) {\n case 'years':\n case 'year':\n case 'yrs':\n case 'yr':\n case 'y':\n return n * y\n case 'days':\n case 'day':\n case 'd':\n return n * d\n case 'hours':\n case 'hour':\n case 'hrs':\n case 'hr':\n case 'h':\n return n * h\n case 'minutes':\n case 'minute':\n case 'mins':\n case 'min':\n case 'm':\n return n * m\n case 'seconds':\n case 'second':\n case 'secs':\n case 'sec':\n case 's':\n return n * s\n case 'milliseconds':\n case 'millisecond':\n case 'msecs':\n case 'msec':\n case 'ms':\n return n\n default:\n return undefined\n }\n}\n\n/**\n * Short format for `ms`.\n *\n * @param {Number} ms\n * @return {String}\n * @api private\n */\n\nfunction fmtShort(ms) {\n if (ms >= d) {\n return Math.round(ms / d) + 'd'\n }\n if (ms >= h) {\n return Math.round(ms / h) + 'h'\n }\n if (ms >= m) {\n return Math.round(ms / m) + 'm'\n }\n if (ms >= s) {\n return Math.round(ms / s) + 's'\n }\n return ms + 'ms'\n}\n\n/**\n * Long format for `ms`.\n *\n * @param {Number} ms\n * @return {String}\n * @api private\n */\n\nfunction fmtLong(ms) {\n return plural(ms, d, 'day') ||\n plural(ms, h, 'hour') ||\n plural(ms, m, 'minute') ||\n plural(ms, s, 'second') ||\n ms + ' ms'\n}\n\n/**\n * Pluralization helper.\n */\n\nfunction plural(ms, n, name) {\n if (ms < n) {\n return\n }\n if (ms < n * 1.5) {\n return Math.floor(ms / n) + ' ' + name\n }\n return Math.ceil(ms / n) + ' ' + name + 's'\n}\n", + "/**\n * This is the web browser implementation of `debug()`.\n *\n * Expose `debug()` as the module.\n */\n\nexports = module.exports = require('./debug');\nexports.log = log;\nexports.formatArgs = formatArgs;\nexports.save = save;\nexports.load = load;\nexports.useColors = useColors;\nexports.storage = 'undefined' != typeof chrome\n && 'undefined' != typeof chrome.storage\n ? chrome.storage.local\n : localstorage();\n\n/**\n * Colors.\n */\n\nexports.colors = [\n 'lightseagreen',\n 'forestgreen',\n 'goldenrod',\n 'dodgerblue',\n 'darkorchid',\n 'crimson'\n];\n\n/**\n * Currently only WebKit-based Web Inspectors, Firefox >= v31,\n * and the Firebug extension (any Firefox version) are known\n * to support \"%c\" CSS customizations.\n *\n * TODO: add a `localStorage` variable to explicitly enable/disable colors\n */\n\nfunction useColors() {\n // NB: In an Electron preload script, document will be defined but not fully\n // initialized. Since we know we're in Chrome, we'll just detect this case\n // explicitly\n if (typeof window !== 'undefined' && window && typeof window.process !== 'undefined' && window.process.type === 'renderer') {\n return true;\n }\n\n // is webkit? http://stackoverflow.com/a/16459606/376773\n // document is undefined in react-native: https://github.com/facebook/react-native/pull/1632\n return (typeof document !== 'undefined' && document && 'WebkitAppearance' in document.documentElement.style) ||\n // is firebug? http://stackoverflow.com/a/398120/376773\n (typeof window !== 'undefined' && window && window.console && (console.firebug || (console.exception && console.table))) ||\n // is firefox >= v31?\n // https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages\n (typeof navigator !== 'undefined' && navigator && navigator.userAgent && navigator.userAgent.toLowerCase().match(/firefox\\/(\\d+)/) && parseInt(RegExp.$1, 10) >= 31) ||\n // double check webkit in userAgent just in case we are in a worker\n (typeof navigator !== 'undefined' && navigator && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\\/(\\d+)/));\n}\n\n/**\n * Map %j to `JSON.stringify()`, since no Web Inspectors do that by default.\n */\n\nexports.formatters.j = function(v) {\n try {\n return JSON.stringify(v);\n } catch (err) {\n return '[UnexpectedJSONParseError]: ' + err.message;\n }\n};\n\n\n/**\n * Colorize log arguments if enabled.\n *\n * @api public\n */\n\nfunction formatArgs(args) {\n var useColors = this.useColors;\n\n args[0] = (useColors ? '%c' : '')\n + this.namespace\n + (useColors ? ' %c' : ' ')\n + args[0]\n + (useColors ? '%c ' : ' ')\n + '+' + exports.humanize(this.diff);\n\n if (!useColors) return;\n\n var c = 'color: ' + this.color;\n args.splice(1, 0, c, 'color: inherit')\n\n // the final \"%c\" is somewhat tricky, because there could be other\n // arguments passed either before or after the %c, so we need to\n // figure out the correct index to insert the CSS into\n var index = 0;\n var lastC = 0;\n args[0].replace(/%[a-zA-Z%]/g, function(match) {\n if ('%%' === match) return;\n index++;\n if ('%c' === match) {\n // we only are interested in the *last* %c\n // (the user may have provided their own)\n lastC = index;\n }\n });\n\n args.splice(lastC, 0, c);\n}\n\n/**\n * Invokes `console.log()` when available.\n * No-op when `console.log` is not a \"function\".\n *\n * @api public\n */\n\nfunction log() {\n // this hackery is required for IE8/9, where\n // the `console.log` function doesn't have 'apply'\n return 'object' === typeof console\n && console.log\n && Function.prototype.apply.call(console.log, console, arguments);\n}\n\n/**\n * Save `namespaces`.\n *\n * @param {String} namespaces\n * @api private\n */\n\nfunction save(namespaces) {\n try {\n if (null == namespaces) {\n exports.storage.removeItem('debug');\n } else {\n exports.storage.debug = namespaces;\n }\n } catch(e) {}\n}\n\n/**\n * Load `namespaces`.\n *\n * @return {String} returns the previously persisted debug modes\n * @api private\n */\n\nfunction load() {\n try {\n return exports.storage.debug;\n } catch(e) {}\n\n // If debug isn't set in LS, and we're in Electron, try to load $DEBUG\n if (typeof process !== 'undefined' && 'env' in process) {\n return process.env.DEBUG;\n }\n}\n\n/**\n * Enable namespaces listed in `localStorage.debug` initially.\n */\n\nexports.enable(load());\n\n/**\n * Localstorage attempts to return the localstorage.\n *\n * This is necessary because safari throws\n * when a user disables cookies/localstorage\n * and you attempt to access it.\n *\n * @return {LocalStorage}\n * @api private\n */\n\nfunction localstorage() {\n try {\n return window.localStorage;\n } catch (e) {}\n}\n", + "\n/**\n * This is the common logic for both the Node.js and web browser\n * implementations of `debug()`.\n *\n * Expose `debug()` as the module.\n */\n\nexports = module.exports = createDebug.debug = createDebug['default'] = createDebug;\nexports.coerce = coerce;\nexports.disable = disable;\nexports.enable = enable;\nexports.enabled = enabled;\nexports.humanize = require('ms');\n\n/**\n * The currently active debug mode names, and names to skip.\n */\n\nexports.names = [];\nexports.skips = [];\n\n/**\n * Map of special \"%n\" handling functions, for the debug \"format\" argument.\n *\n * Valid key names are a single, lower or upper-case letter, i.e. \"n\" and \"N\".\n */\n\nexports.formatters = {};\n\n/**\n * Previous log timestamp.\n */\n\nvar prevTime;\n\n/**\n * Select a color.\n * @param {String} namespace\n * @return {Number}\n * @api private\n */\n\nfunction selectColor(namespace) {\n var hash = 0, i;\n\n for (i in namespace) {\n hash = ((hash << 5) - hash) + namespace.charCodeAt(i);\n hash |= 0; // Convert to 32bit integer\n }\n\n return exports.colors[Math.abs(hash) % exports.colors.length];\n}\n\n/**\n * Create a debugger with the given `namespace`.\n *\n * @param {String} namespace\n * @return {Function}\n * @api public\n */\n\nfunction createDebug(namespace) {\n\n function debug() {\n // disabled?\n if (!debug.enabled) return;\n\n var self = debug;\n\n // set `diff` timestamp\n var curr = +new Date();\n var ms = curr - (prevTime || curr);\n self.diff = ms;\n self.prev = prevTime;\n self.curr = curr;\n prevTime = curr;\n\n // turn the `arguments` into a proper Array\n var args = new Array(arguments.length);\n for (var i = 0; i < args.length; i++) {\n args[i] = arguments[i];\n }\n\n args[0] = exports.coerce(args[0]);\n\n if ('string' !== typeof args[0]) {\n // anything else let's inspect with %O\n args.unshift('%O');\n }\n\n // apply any `formatters` transformations\n var index = 0;\n args[0] = args[0].replace(/%([a-zA-Z%])/g, function(match, format) {\n // if we encounter an escaped % then don't increase the array index\n if (match === '%%') return match;\n index++;\n var formatter = exports.formatters[format];\n if ('function' === typeof formatter) {\n var val = args[index];\n match = formatter.call(self, val);\n\n // now we need to remove `args[index]` since it's inlined in the `format`\n args.splice(index, 1);\n index--;\n }\n return match;\n });\n\n // apply env-specific formatting (colors, etc.)\n exports.formatArgs.call(self, args);\n\n var logFn = debug.log || exports.log || console.log.bind(console);\n logFn.apply(self, args);\n }\n\n debug.namespace = namespace;\n debug.enabled = exports.enabled(namespace);\n debug.useColors = exports.useColors();\n debug.color = selectColor(namespace);\n\n // env-specific initialization logic for debug instances\n if ('function' === typeof exports.init) {\n exports.init(debug);\n }\n\n return debug;\n}\n\n/**\n * Enables a debug mode by namespaces. This can include modes\n * separated by a colon and wildcards.\n *\n * @param {String} namespaces\n * @api public\n */\n\nfunction enable(namespaces) {\n exports.save(namespaces);\n\n exports.names = [];\n exports.skips = [];\n\n var split = (namespaces || '').split(/[\\s,]+/);\n var len = split.length;\n\n for (var i = 0; i < len; i++) {\n if (!split[i]) continue; // ignore empty strings\n namespaces = split[i].replace(/\\*/g, '.*?');\n if (namespaces[0] === '-') {\n exports.skips.push(new RegExp('^' + namespaces.substr(1) + '$'));\n } else {\n exports.names.push(new RegExp('^' + namespaces + '$'));\n }\n }\n}\n\n/**\n * Disable debug output.\n *\n * @api public\n */\n\nfunction disable() {\n exports.enable('');\n}\n\n/**\n * Returns true if the given mode name is enabled, false otherwise.\n *\n * @param {String} name\n * @return {Boolean}\n * @api public\n */\n\nfunction enabled(name) {\n var i, len;\n for (i = 0, len = exports.skips.length; i < len; i++) {\n if (exports.skips[i].test(name)) {\n return false;\n }\n }\n for (i = 0, len = exports.names.length; i < len; i++) {\n if (exports.names[i].test(name)) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * Coerce `val`.\n *\n * @param {Mixed} val\n * @return {Mixed}\n * @api private\n */\n\nfunction coerce(val) {\n if (val instanceof Error) return val.stack || val.message;\n return val;\n}\n", + "/**\n * Expose `PriorityQueue`.\n */\nmodule.exports = PriorityQueue;\n\n/**\n * Initializes a new empty `PriorityQueue` with the given `comparator(a, b)`\n * function, uses `.DEFAULT_COMPARATOR()` when no function is provided.\n *\n * The comparator function must return a positive number when `a > b`, 0 when\n * `a == b` and a negative number when `a < b`.\n *\n * @param {Function}\n * @return {PriorityQueue}\n * @api public\n */\nfunction PriorityQueue(comparator) {\n this._comparator = comparator || PriorityQueue.DEFAULT_COMPARATOR;\n this._elements = [];\n}\n\n/**\n * Compares `a` and `b`, when `a > b` it returns a positive number, when\n * it returns 0 and when `a < b` it returns a negative number.\n *\n * @param {String|Number} a\n * @param {String|Number} b\n * @return {Number}\n * @api public\n */\nPriorityQueue.DEFAULT_COMPARATOR = function(a, b) {\n if (typeof a === 'number' && typeof b === 'number') {\n return a - b;\n } else {\n a = a.toString();\n b = b.toString();\n\n if (a == b) return 0;\n\n return (a > b) ? 1 : -1;\n }\n};\n\n/**\n * Returns whether the priority queue is empty or not.\n *\n * @return {Boolean}\n * @api public\n */\nPriorityQueue.prototype.isEmpty = function() {\n return this.size() === 0;\n};\n\n/**\n * Peeks at the top element of the priority queue.\n *\n * @return {Object}\n * @throws {Error} when the queue is empty.\n * @api public\n */\nPriorityQueue.prototype.peek = function() {\n if (this.isEmpty()) throw new Error('PriorityQueue is empty');\n\n return this._elements[0];\n};\n\n/**\n * Dequeues the top element of the priority queue.\n *\n * @return {Object}\n * @throws {Error} when the queue is empty.\n * @api public\n */\nPriorityQueue.prototype.deq = function() {\n var first = this.peek();\n var last = this._elements.pop();\n var size = this.size();\n\n if (size === 0) return first;\n\n this._elements[0] = last;\n var current = 0;\n\n while (current < size) {\n var largest = current;\n var left = (2 * current) + 1;\n var right = (2 * current) + 2;\n\n if (left < size && this._compare(left, largest) >= 0) {\n largest = left;\n }\n\n if (right < size && this._compare(right, largest) >= 0) {\n largest = right;\n }\n\n if (largest === current) break;\n\n this._swap(largest, current);\n current = largest;\n }\n\n return first;\n};\n\n/**\n * Enqueues the `element` at the priority queue and returns its new size.\n *\n * @param {Object} element\n * @return {Number}\n * @api public\n */\nPriorityQueue.prototype.enq = function(element) {\n var size = this._elements.push(element);\n var current = size - 1;\n\n while (current > 0) {\n var parent = Math.floor((current - 1) / 2);\n\n if (this._compare(current, parent) <= 0) break;\n\n this._swap(parent, current);\n current = parent;\n }\n\n return size;\n};\n\n/**\n * Returns the size of the priority queue.\n *\n * @return {Number}\n * @api public\n */\nPriorityQueue.prototype.size = function() {\n return this._elements.length;\n};\n\n/**\n * Iterates over queue elements\n *\n * @param {Function} fn\n */\nPriorityQueue.prototype.forEach = function(fn) {\n return this._elements.forEach(fn);\n};\n\n/**\n * Compares the values at position `a` and `b` in the priority queue using its\n * comparator function.\n *\n * @param {Number} a\n * @param {Number} b\n * @return {Number}\n * @api private\n */\nPriorityQueue.prototype._compare = function(a, b) {\n return this._comparator(this._elements[a], this._elements[b]);\n};\n\n/**\n * Swaps the values at position `a` and `b` in the priority queue.\n *\n * @param {Number} a\n * @param {Number} b\n * @api private\n */\nPriorityQueue.prototype._swap = function(a, b) {\n var aux = this._elements[a];\n this._elements[a] = this._elements[b];\n this._elements[b] = aux;\n};\n", + "\n/**\n * Module Dependencies\n */\n\nvar expr;\ntry {\n expr = require('props');\n} catch(e) {\n expr = require('component-props');\n}\n\n/**\n * Expose `toFunction()`.\n */\n\nmodule.exports = toFunction;\n\n/**\n * Convert `obj` to a `Function`.\n *\n * @param {Mixed} obj\n * @return {Function}\n * @api private\n */\n\nfunction toFunction(obj) {\n switch ({}.toString.call(obj)) {\n case '[object Object]':\n return objectToFunction(obj);\n case '[object Function]':\n return obj;\n case '[object String]':\n return stringToFunction(obj);\n case '[object RegExp]':\n return regexpToFunction(obj);\n default:\n return defaultToFunction(obj);\n }\n}\n\n/**\n * Default to strict equality.\n *\n * @param {Mixed} val\n * @return {Function}\n * @api private\n */\n\nfunction defaultToFunction(val) {\n return function(obj){\n return val === obj;\n };\n}\n\n/**\n * Convert `re` to a function.\n *\n * @param {RegExp} re\n * @return {Function}\n * @api private\n */\n\nfunction regexpToFunction(re) {\n return function(obj){\n return re.test(obj);\n };\n}\n\n/**\n * Convert property `str` to a function.\n *\n * @param {String} str\n * @return {Function}\n * @api private\n */\n\nfunction stringToFunction(str) {\n // immediate such as \"> 20\"\n if (/^ *\\W+/.test(str)) return new Function('_', 'return _ ' + str);\n\n // properties such as \"name.first\" or \"age > 18\" or \"age > 18 && age < 36\"\n return new Function('_', 'return ' + get(str));\n}\n\n/**\n * Convert `object` to a function.\n *\n * @param {Object} object\n * @return {Function}\n * @api private\n */\n\nfunction objectToFunction(obj) {\n var match = {};\n for (var key in obj) {\n match[key] = typeof obj[key] === 'string'\n ? defaultToFunction(obj[key])\n : toFunction(obj[key]);\n }\n return function(val){\n if (typeof val !== 'object') return false;\n for (var key in match) {\n if (!(key in val)) return false;\n if (!match[key](val[key])) return false;\n }\n return true;\n };\n}\n\n/**\n * Built the getter function. Supports getter style functions\n *\n * @param {String} str\n * @return {String}\n * @api private\n */\n\nfunction get(str) {\n var props = expr(str);\n if (!props.length) return '_.' + str;\n\n var val, i, prop;\n for (i = 0; i < props.length; i++) {\n prop = props[i];\n val = '_.' + prop;\n val = \"('function' == typeof \" + val + \" ? \" + val + \"() : \" + val + \")\";\n\n // mimic negative lookbehind to avoid problems with nested properties\n str = stripNested(prop, str, val);\n }\n\n return str;\n}\n\n/**\n * Mimic negative lookbehind to avoid problems with nested properties.\n *\n * See: http://blog.stevenlevithan.com/archives/mimic-lookbehind-javascript\n *\n * @param {String} prop\n * @param {String} str\n * @param {String} val\n * @return {String}\n * @api private\n */\n\nfunction stripNested (prop, str, val) {\n return str.replace(new RegExp('(\\\\.)?' + prop, 'g'), function($0, $1) {\n return $1 ? $0 : val;\n });\n}\n" + ] +} \ No newline at end of file From bd371523eaf44fd54e5f7861ed28c2e6ba5638d5 Mon Sep 17 00:00:00 2001 From: David Emory Date: Tue, 25 Sep 2018 11:46:39 -0400 Subject: [PATCH 12/18] feat(renderer): Improve handling of direct-arc segments --- lib/renderer/renderedsegment.js | 12 ++++++++++-- lib/transitive.js | 1 - 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/lib/renderer/renderedsegment.js b/lib/renderer/renderedsegment.js index c22a6507..fcbaef2a 100644 --- a/lib/renderer/renderedsegment.js +++ b/lib/renderer/renderedsegment.js @@ -1,6 +1,6 @@ import { forEach } from 'lodash' -import { distance } from '../util' +import { distance, normalizeVector, rotateVector } from '../util' /** * RenderedSegment @@ -41,11 +41,19 @@ export default class RenderedSegment { if (this.pathSegment.journeySegment && this.pathSegment.journeySegment.arc) { const first = this.renderData[0] const last = this.renderData[this.renderData.length - 1] + const v = { + x: last.x - first.x, + y: last.y - first.y + } + const vp = rotateVector(normalizeVector(v), -Math.PI / 2) + const dist = distance(first.x, first.y, last.x, last.y) const arc = { x: last.x, y: last.y, arc: -45, - radius: distance(first.x, first.y, last.x, last.y) + radius: dist * 0.75, + ex: ((last.x + first.x) / 2) + vp.x * (dist / 4), + ey: ((last.y + first.y) / 2) + vp.y * (dist / 4) } this.renderData = [first, arc, last] } diff --git a/lib/transitive.js b/lib/transitive.js index 0e81d167..372b3158 100644 --- a/lib/transitive.js +++ b/lib/transitive.js @@ -35,7 +35,6 @@ import { sm } from './util' export default class Transitive { constructor (options) { - console.log('>>> TRN'); if (!(this instanceof Transitive)) return new Transitive(options) this.options = options From c54ee76fdeeda962d0cf932a4d7f8e02f35b8601 Mon Sep 17 00:00:00 2001 From: David Emory Date: Fri, 30 Nov 2018 13:06:44 -0800 Subject: [PATCH 13/18] fix(api): Fix bug with coordinate conversion when initialBounds option is provided --- lib/transitive.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/lib/transitive.js b/lib/transitive.js index 372b3158..74716bbd 100644 --- a/lib/transitive.js +++ b/lib/transitive.js @@ -56,7 +56,10 @@ export default class Transitive { this.styler = new Styler(options.styles, this) if (options.initialBounds) { - this.display.fitToWorldBounds(options.initialBounds) + this.display.fitToWorldBounds([ + sm.forward(options.initialBounds[0]), + sm.forward(options.initialBounds[1]) + ]) } } From bba5f8e7e6ad4a92f3853eb0a0cc0d6716455fb7 Mon Sep 17 00:00:00 2001 From: Evan Siroky Date: Mon, 17 Jun 2019 13:50:32 -0700 Subject: [PATCH 14/18] Add styling for micromobility --- lib/styler/styler.js | 10 +++++++++- lib/styler/styles.js | 11 ++++++++++- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/lib/styler/styler.js b/lib/styler/styler.js index 808ca696..7caf96ee 100644 --- a/lib/styler/styler.js +++ b/lib/styler/styler.js @@ -162,7 +162,15 @@ export default class Styler { } } - if (mode === 'WALK' || mode === 'BICYCLE' || mode === 'BICYCLE_RENT' || mode === 'CAR') { + if ( + mode === 'WALK' || + mode === 'BICYCLE' || + mode === 'BICYCLE_RENT' || + mode === 'CAR' || + mode === 'CAR_RENT' || + mode === 'MICROMOBILITY' || + mode === 'MICROMOBILITY_RENT' + ) { segment.type = mode } else { // assume a transit mode segment.type = 'TRANSIT' diff --git a/lib/styler/styles.js b/lib/styler/styles.js index 16e8a173..a9c3405f 100644 --- a/lib/styler/styles.js +++ b/lib/styler/styles.js @@ -231,6 +231,8 @@ const segments = { return '#888' } else if (segment.type.startsWith('BICYCLE')) { return '#f00' + } else if (segment.type.startsWith('MICROMOBILITY')) { + return '#f5a729' } else if (segment.type === 'WALK') { return '#86cdf9' } @@ -247,7 +249,13 @@ const segments = { function (display, data) { var segment = data if (segment.type === 'WALK') return '0, 8' - if (segment.type.startsWith('BICYCLE') || segment.type.startsWith('CAR')) return '8, 3' + if ( + segment.type.startsWith('BICYCLE') || + segment.type.startsWith('CAR') || + segment.type.startsWith('MICROMOBILITY') + ) { + return '8, 3' + } if (segment.frequency && segment.frequency.average < 12) { if (segment.frequency.average > 6) return '12, 12' return '12, 2' @@ -260,6 +268,7 @@ const segments = { if (segment.type === 'WALK') return 6 if (segment.type.startsWith('BICYCLE')) return 4 if (segment.type.startsWith('CAR')) return 4 + if (segment.type.startsWith('MICROMOBILITY')) return 4 if (segment.mode === 3) return 6 // Buses } ], From 3f38cd953b35183dcef51d763ca1e26118fed965 Mon Sep 17 00:00:00 2001 From: Evan Siroky Date: Mon, 17 Jun 2019 14:52:20 -0700 Subject: [PATCH 15/18] build: update to latest mastarm --- package.json | 4 +- yarn.lock | 8477 ++++++++++++++++++++++++++++++++++---------------- 2 files changed, 5877 insertions(+), 2604 deletions(-) diff --git a/package.json b/package.json index ada02691..71082c20 100644 --- a/package.json +++ b/package.json @@ -32,12 +32,12 @@ "scripts": { "prepublish": "mastarm prepublish lib:build", "cover": "npm test -- --coverage", - "lint": "mastarm lint", + "lint": "mastarm lint lib", "semantic-release": "semantic-release pre && npm publish && semantic-release post", "test": "mastarm test" }, "devDependencies": { - "mastarm": "^3.2.1", + "mastarm": "^5.0.1", "semantic-release": "^6.3.2" }, "standard": { diff --git a/yarn.lock b/yarn.lock index d38cb2bf..2f9db037 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,6 +2,919 @@ # yarn lockfile v1 +"@babel/code-frame@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.0.0.tgz#06e2ab19bdb535385559aabb5ba59729482800f8" + integrity sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA== + dependencies: + "@babel/highlight" "^7.0.0" + +"@babel/core@^7.1.0", "@babel/core@^7.3.4": + version "7.4.5" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.4.5.tgz#081f97e8ffca65a9b4b0fdc7e274e703f000c06a" + integrity sha512-OvjIh6aqXtlsA8ujtGKfC7LYWksYSX8yQcM8Ay3LuvVeQ63lcOKgoZWVqcpFwkd29aYU9rVx7jxhfhiEDV9MZA== + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/generator" "^7.4.4" + "@babel/helpers" "^7.4.4" + "@babel/parser" "^7.4.5" + "@babel/template" "^7.4.4" + "@babel/traverse" "^7.4.5" + "@babel/types" "^7.4.4" + convert-source-map "^1.1.0" + debug "^4.1.0" + json5 "^2.1.0" + lodash "^4.17.11" + resolve "^1.3.2" + semver "^5.4.1" + source-map "^0.5.0" + +"@babel/generator@^7.4.0", "@babel/generator@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.4.4.tgz#174a215eb843fc392c7edcaabeaa873de6e8f041" + integrity sha512-53UOLK6TVNqKxf7RUh8NE851EHRxOOeVXKbK2bivdb+iziMyk03Sr4eaE9OELCbyZAAafAKPDwF2TPUES5QbxQ== + dependencies: + "@babel/types" "^7.4.4" + jsesc "^2.5.1" + lodash "^4.17.11" + source-map "^0.5.0" + trim-right "^1.0.1" + +"@babel/helper-annotate-as-pure@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.0.0.tgz#323d39dd0b50e10c7c06ca7d7638e6864d8c5c32" + integrity sha512-3UYcJUj9kvSLbLbUIfQTqzcy5VX7GRZ/CCDrnOaZorFFM01aXp1+GJwuFGV4NDDoAS+mOUyHcO6UD/RfqOks3Q== + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-builder-binary-assignment-operator-visitor@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.1.0.tgz#6b69628dfe4087798e0c4ed98e3d4a6b2fbd2f5f" + integrity sha512-qNSR4jrmJ8M1VMM9tibvyRAHXQs2PmaksQF7c1CGJNipfe3D8p+wgNwgso/P2A2r2mdgBWAXljNWR0QRZAMW8w== + dependencies: + "@babel/helper-explode-assignable-expression" "^7.1.0" + "@babel/types" "^7.0.0" + +"@babel/helper-builder-react-jsx@^7.3.0": + version "7.3.0" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.3.0.tgz#a1ac95a5d2b3e88ae5e54846bf462eeb81b318a4" + integrity sha512-MjA9KgwCuPEkQd9ncSXvSyJ5y+j2sICHyrI0M3L+6fnS4wMSNDc1ARXsbTfbb2cXHn17VisSnU/sHFTCxVxSMw== + dependencies: + "@babel/types" "^7.3.0" + esutils "^2.0.0" + +"@babel/helper-call-delegate@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/helper-call-delegate/-/helper-call-delegate-7.4.4.tgz#87c1f8ca19ad552a736a7a27b1c1fcf8b1ff1f43" + integrity sha512-l79boDFJ8S1c5hvQvG+rc+wHw6IuH7YldmRKsYtpbawsxURu/paVy57FZMomGK22/JckepaikOkY0MoAmdyOlQ== + dependencies: + "@babel/helper-hoist-variables" "^7.4.4" + "@babel/traverse" "^7.4.4" + "@babel/types" "^7.4.4" + +"@babel/helper-create-class-features-plugin@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.4.4.tgz#fc3d690af6554cc9efc607364a82d48f58736dba" + integrity sha512-UbBHIa2qeAGgyiNR9RszVF7bUHEdgS4JAUNT8SiqrAN6YJVxlOxeLr5pBzb5kan302dejJ9nla4RyKcR1XT6XA== + dependencies: + "@babel/helper-function-name" "^7.1.0" + "@babel/helper-member-expression-to-functions" "^7.0.0" + "@babel/helper-optimise-call-expression" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-replace-supers" "^7.4.4" + "@babel/helper-split-export-declaration" "^7.4.4" + +"@babel/helper-define-map@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.4.4.tgz#6969d1f570b46bdc900d1eba8e5d59c48ba2c12a" + integrity sha512-IX3Ln8gLhZpSuqHJSnTNBWGDE9kdkTEWl21A/K7PQ00tseBwbqCHTvNLHSBd9M0R5rER4h5Rsvj9vw0R5SieBg== + dependencies: + "@babel/helper-function-name" "^7.1.0" + "@babel/types" "^7.4.4" + lodash "^4.17.11" + +"@babel/helper-explode-assignable-expression@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.1.0.tgz#537fa13f6f1674df745b0c00ec8fe4e99681c8f6" + integrity sha512-NRQpfHrJ1msCHtKjbzs9YcMmJZOg6mQMmGRB+hbamEdG5PNpaSm95275VD92DvJKuyl0s2sFiDmMZ+EnnvufqA== + dependencies: + "@babel/traverse" "^7.1.0" + "@babel/types" "^7.0.0" + +"@babel/helper-function-name@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz#a0ceb01685f73355d4360c1247f582bfafc8ff53" + integrity sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw== + dependencies: + "@babel/helper-get-function-arity" "^7.0.0" + "@babel/template" "^7.1.0" + "@babel/types" "^7.0.0" + +"@babel/helper-get-function-arity@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz#83572d4320e2a4657263734113c42868b64e49c3" + integrity sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ== + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-hoist-variables@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.4.4.tgz#0298b5f25c8c09c53102d52ac4a98f773eb2850a" + integrity sha512-VYk2/H/BnYbZDDg39hr3t2kKyifAm1W6zHRfhx8jGjIHpQEBv9dry7oQ2f3+J703TLu69nYdxsovl0XYfcnK4w== + dependencies: + "@babel/types" "^7.4.4" + +"@babel/helper-member-expression-to-functions@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.0.0.tgz#8cd14b0a0df7ff00f009e7d7a436945f47c7a16f" + integrity sha512-avo+lm/QmZlv27Zsi0xEor2fKcqWG56D5ae9dzklpIaY7cQMK5N8VSpaNVPPagiqmy7LrEjK1IWdGMOqPu5csg== + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-module-imports@^7.0.0", "@babel/helper-module-imports@^7.0.0-beta.49": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.0.0.tgz#96081b7111e486da4d2cd971ad1a4fe216cc2e3d" + integrity sha512-aP/hlLq01DWNEiDg4Jn23i+CXxW/owM4WpDLFUbpjxe4NS3BhLVZQ5i7E0ZrxuQ/vwekIeciyamgB1UIYxxM6A== + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-module-transforms@^7.1.0", "@babel/helper-module-transforms@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.4.4.tgz#96115ea42a2f139e619e98ed46df6019b94414b8" + integrity sha512-3Z1yp8TVQf+B4ynN7WoHPKS8EkdTbgAEy0nU0rs/1Kw4pDgmvYH3rz3aI11KgxKCba2cn7N+tqzV1mY2HMN96w== + dependencies: + "@babel/helper-module-imports" "^7.0.0" + "@babel/helper-simple-access" "^7.1.0" + "@babel/helper-split-export-declaration" "^7.4.4" + "@babel/template" "^7.4.4" + "@babel/types" "^7.4.4" + lodash "^4.17.11" + +"@babel/helper-optimise-call-expression@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.0.0.tgz#a2920c5702b073c15de51106200aa8cad20497d5" + integrity sha512-u8nd9NQePYNQV8iPWu/pLLYBqZBa4ZaY1YWRFMuxrid94wKI1QNt67NEZ7GAe5Kc/0LLScbim05xZFWkAdrj9g== + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-plugin-utils@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0.tgz#bbb3fbee98661c569034237cc03967ba99b4f250" + integrity sha512-CYAOUCARwExnEixLdB6sDm2dIJ/YgEAKDM1MOeMeZu9Ld/bDgVo8aiWrXwcY7OBh+1Ea2uUcVRcxKk0GJvW7QA== + +"@babel/helper-regex@^7.0.0", "@babel/helper-regex@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.4.4.tgz#a47e02bc91fb259d2e6727c2a30013e3ac13c4a2" + integrity sha512-Y5nuB/kESmR3tKjU8Nkn1wMGEx1tjJX076HBMeL3XLQCu6vA/YRzuTW0bbb+qRnXvQGn+d6Rx953yffl8vEy7Q== + dependencies: + lodash "^4.17.11" + +"@babel/helper-remap-async-to-generator@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.1.0.tgz#361d80821b6f38da75bd3f0785ece20a88c5fe7f" + integrity sha512-3fOK0L+Fdlg8S5al8u/hWE6vhufGSn0bN09xm2LXMy//REAF8kDCrYoOBKYmA8m5Nom+sV9LyLCwrFynA8/slg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.0.0" + "@babel/helper-wrap-function" "^7.1.0" + "@babel/template" "^7.1.0" + "@babel/traverse" "^7.1.0" + "@babel/types" "^7.0.0" + +"@babel/helper-replace-supers@^7.1.0", "@babel/helper-replace-supers@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.4.4.tgz#aee41783ebe4f2d3ab3ae775e1cc6f1a90cefa27" + integrity sha512-04xGEnd+s01nY1l15EuMS1rfKktNF+1CkKmHoErDppjAAZL+IUBZpzT748x262HF7fibaQPhbvWUl5HeSt1EXg== + dependencies: + "@babel/helper-member-expression-to-functions" "^7.0.0" + "@babel/helper-optimise-call-expression" "^7.0.0" + "@babel/traverse" "^7.4.4" + "@babel/types" "^7.4.4" + +"@babel/helper-simple-access@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.1.0.tgz#65eeb954c8c245beaa4e859da6188f39d71e585c" + integrity sha512-Vk+78hNjRbsiu49zAPALxTb+JUQCz1aolpd8osOF16BGnLtseD21nbHgLPGUwrXEurZgiCOUmvs3ExTu4F5x6w== + dependencies: + "@babel/template" "^7.1.0" + "@babel/types" "^7.0.0" + +"@babel/helper-split-export-declaration@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz#ff94894a340be78f53f06af038b205c49d993677" + integrity sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q== + dependencies: + "@babel/types" "^7.4.4" + +"@babel/helper-wrap-function@^7.1.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.2.0.tgz#c4e0012445769e2815b55296ead43a958549f6fa" + integrity sha512-o9fP1BZLLSrYlxYEYyl2aS+Flun5gtjTIG8iln+XuEzQTs0PLagAGSXUcqruJwD5fM48jzIEggCKpIfWTcR7pQ== + dependencies: + "@babel/helper-function-name" "^7.1.0" + "@babel/template" "^7.1.0" + "@babel/traverse" "^7.1.0" + "@babel/types" "^7.2.0" + +"@babel/helpers@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.4.4.tgz#868b0ef59c1dd4e78744562d5ce1b59c89f2f2a5" + integrity sha512-igczbR/0SeuPR8RFfC7tGrbdTbFL3QTvH6D+Z6zNxnTe//GyqmtHmDkzrqDmyZ3eSwPqB/LhyKoU5DXsp+Vp2A== + dependencies: + "@babel/template" "^7.4.4" + "@babel/traverse" "^7.4.4" + "@babel/types" "^7.4.4" + +"@babel/highlight@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.0.0.tgz#f710c38c8d458e6dd9a201afb637fcb781ce99e4" + integrity sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw== + dependencies: + chalk "^2.0.0" + esutils "^2.0.2" + js-tokens "^4.0.0" + +"@babel/parser@^7.0.0", "@babel/parser@^7.1.0", "@babel/parser@^7.4.3", "@babel/parser@^7.4.4", "@babel/parser@^7.4.5": + version "7.4.5" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.4.5.tgz#04af8d5d5a2b044a2a1bffacc1e5e6673544e872" + integrity sha512-9mUqkL1FF5T7f0WDFfAoDdiMVPWsdD1gZYzSnaXsxUCUqzuch/8of9G3VUSNiZmMBoRxT3neyVsqeiL/ZPcjew== + +"@babel/plugin-proposal-async-generator-functions@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.2.0.tgz#b289b306669dce4ad20b0252889a15768c9d417e" + integrity sha512-+Dfo/SCQqrwx48ptLVGLdE39YtWRuKc/Y9I5Fy0P1DDBB9lsAHpjcEJQt+4IifuSOSTLBKJObJqMvaO1pIE8LQ== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-remap-async-to-generator" "^7.1.0" + "@babel/plugin-syntax-async-generators" "^7.2.0" + +"@babel/plugin-proposal-class-properties@^7.3.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.4.4.tgz#93a6486eed86d53452ab9bab35e368e9461198ce" + integrity sha512-WjKTI8g8d5w1Bc9zgwSz2nfrsNQsXcCf9J9cdCvrJV6RF56yztwm4TmJC0MgJ9tvwO9gUA/mcYe89bLdGfiXFg== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.4.4" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-proposal-export-namespace-from@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.2.0.tgz#308fd4d04ff257fc3e4be090550840eeabad5dd9" + integrity sha512-DZUxbHYxQ5fUFIkMEnh75ogEdBLPfL+mQUqrO2hNY2LGm+tqFnxE924+mhAcCOh/8za8AaZsWHbq6bBoS3TAzA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-export-namespace-from" "^7.2.0" + +"@babel/plugin-proposal-json-strings@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.2.0.tgz#568ecc446c6148ae6b267f02551130891e29f317" + integrity sha512-MAFV1CA/YVmYwZG0fBQyXhmj0BHCB5egZHCKWIFVv/XCxAeVGIHfos3SwDck4LvCllENIAg7xMKOG5kH0dzyUg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-json-strings" "^7.2.0" + +"@babel/plugin-proposal-object-rest-spread@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.4.4.tgz#1ef173fcf24b3e2df92a678f027673b55e7e3005" + integrity sha512-dMBG6cSPBbHeEBdFXeQ2QLc5gUpg4Vkaz8octD4aoW/ISO+jBOcsuxYL7bsb5WSu8RLP6boxrBIALEHgoHtO9g== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-object-rest-spread" "^7.2.0" + +"@babel/plugin-proposal-optional-catch-binding@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.2.0.tgz#135d81edb68a081e55e56ec48541ece8065c38f5" + integrity sha512-mgYj3jCcxug6KUcX4OBoOJz3CMrwRfQELPQ5560F70YQUBZB7uac9fqaWamKR1iWUzGiK2t0ygzjTScZnVz75g== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-optional-catch-binding" "^7.2.0" + +"@babel/plugin-proposal-unicode-property-regex@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.4.4.tgz#501ffd9826c0b91da22690720722ac7cb1ca9c78" + integrity sha512-j1NwnOqMG9mFUOH58JTFsA/+ZYzQLUZ/drqWUqxCYLGeu2JFZL8YrNC9hBxKmWtAuOCHPcRpgv7fhap09Fb4kA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-regex" "^7.4.4" + regexpu-core "^4.5.4" + +"@babel/plugin-syntax-async-generators@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.2.0.tgz#69e1f0db34c6f5a0cf7e2b3323bf159a76c8cb7f" + integrity sha512-1ZrIRBv2t0GSlcwVoQ6VgSLpLgiN/FVQUzt9znxo7v2Ov4jJrs8RY8tv0wvDmFN3qIdMKWrmMMW6yZ0G19MfGg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-syntax-dynamic-import@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.2.0.tgz#69c159ffaf4998122161ad8ebc5e6d1f55df8612" + integrity sha512-mVxuJ0YroI/h/tbFTPGZR8cv6ai+STMKNBq0f8hFxsxWjl94qqhsb+wXbpNMDPU3cfR1TIsVFzU3nXyZMqyK4w== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-syntax-export-namespace-from@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.2.0.tgz#8d257838c6b3b779db52c0224443459bd27fb039" + integrity sha512-1zGA3UNch6A+A11nIzBVEaE3DDJbjfB+eLIcf0GGOh/BJr/8NxL3546MGhV/r0RhH4xADFIEso39TKCfEMlsGA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-syntax-flow@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.2.0.tgz#a765f061f803bc48f240c26f8747faf97c26bf7c" + integrity sha512-r6YMuZDWLtLlu0kqIim5o/3TNRAlWb073HwT3e2nKf9I8IIvOggPrnILYPsrrKilmn/mYEMCf/Z07w3yQJF6dg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-syntax-json-strings@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.2.0.tgz#72bd13f6ffe1d25938129d2a186b11fd62951470" + integrity sha512-5UGYnMSLRE1dqqZwug+1LISpA403HzlSfsg6P9VXU6TBjcSHeNlw4DxDx7LgpF+iKZoOG/+uzqoRHTdcUpiZNg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-syntax-jsx@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.2.0.tgz#0b85a3b4bc7cdf4cc4b8bf236335b907ca22e7c7" + integrity sha512-VyN4QANJkRW6lDBmENzRszvZf3/4AXaj9YR7GwrWeeN9tEBPuXbmDYVU9bYBN0D70zCWVwUy0HWq2553VCb6Hw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-syntax-object-rest-spread@^7.0.0", "@babel/plugin-syntax-object-rest-spread@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.2.0.tgz#3b7a3e733510c57e820b9142a6579ac8b0dfad2e" + integrity sha512-t0JKGgqk2We+9may3t0xDdmneaXmyxq0xieYcKHxIsrJO64n1OiMWNUtc5gQK1PA0NpdCRrtZp4z+IUaKugrSA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-syntax-optional-catch-binding@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.2.0.tgz#a94013d6eda8908dfe6a477e7f9eda85656ecf5c" + integrity sha512-bDe4xKNhb0LI7IvZHiA13kff0KEfaGX/Hv4lMA9+7TEc63hMNvfKo6ZFpXhKuEp+II/q35Gc4NoMeDZyaUbj9w== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-arrow-functions@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.2.0.tgz#9aeafbe4d6ffc6563bf8f8372091628f00779550" + integrity sha512-ER77Cax1+8/8jCB9fo4Ud161OZzWN5qawi4GusDuRLcDbDG+bIGYY20zb2dfAFdTRGzrfq2xZPvF0R64EHnimg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-async-to-generator@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.4.4.tgz#a3f1d01f2f21cadab20b33a82133116f14fb5894" + integrity sha512-YiqW2Li8TXmzgbXw+STsSqPBPFnGviiaSp6CYOq55X8GQ2SGVLrXB6pNid8HkqkZAzOH6knbai3snhP7v0fNwA== + dependencies: + "@babel/helper-module-imports" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-remap-async-to-generator" "^7.1.0" + +"@babel/plugin-transform-block-scoped-functions@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.2.0.tgz#5d3cc11e8d5ddd752aa64c9148d0db6cb79fd190" + integrity sha512-ntQPR6q1/NKuphly49+QiQiTN0O63uOwjdD6dhIjSWBI5xlrbUFh720TIpzBhpnrLfv2tNH/BXvLIab1+BAI0w== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-block-scoping@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.4.4.tgz#c13279fabf6b916661531841a23c4b7dae29646d" + integrity sha512-jkTUyWZcTrwxu5DD4rWz6rDB5Cjdmgz6z7M7RLXOJyCUkFBawssDGcGh8M/0FTSB87avyJI1HsTwUXp9nKA1PA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + lodash "^4.17.11" + +"@babel/plugin-transform-classes@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.4.4.tgz#0ce4094cdafd709721076d3b9c38ad31ca715eb6" + integrity sha512-/e44eFLImEGIpL9qPxSRat13I5QNRgBLu2hOQJCF7VLy/otSM/sypV1+XaIw5+502RX/+6YaSAPmldk+nhHDPw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.0.0" + "@babel/helper-define-map" "^7.4.4" + "@babel/helper-function-name" "^7.1.0" + "@babel/helper-optimise-call-expression" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-replace-supers" "^7.4.4" + "@babel/helper-split-export-declaration" "^7.4.4" + globals "^11.1.0" + +"@babel/plugin-transform-computed-properties@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.2.0.tgz#83a7df6a658865b1c8f641d510c6f3af220216da" + integrity sha512-kP/drqTxY6Xt3NNpKiMomfgkNn4o7+vKxK2DDKcBG9sHj51vHqMBGy8wbDS/J4lMxnqs153/T3+DmCEAkC5cpA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-destructuring@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.4.4.tgz#9d964717829cc9e4b601fc82a26a71a4d8faf20f" + integrity sha512-/aOx+nW0w8eHiEHm+BTERB2oJn5D127iye/SUQl7NjHy0lf+j7h4MKMMSOwdazGq9OxgiNADncE+SRJkCxjZpQ== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-dotall-regex@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.4.4.tgz#361a148bc951444312c69446d76ed1ea8e4450c3" + integrity sha512-P05YEhRc2h53lZDjRPk/OektxCVevFzZs2Gfjd545Wde3k+yFDbXORgl2e0xpbq8mLcKJ7Idss4fAg0zORN/zg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-regex" "^7.4.4" + regexpu-core "^4.5.4" + +"@babel/plugin-transform-duplicate-keys@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.2.0.tgz#d952c4930f312a4dbfff18f0b2914e60c35530b3" + integrity sha512-q+yuxW4DsTjNceUiTzK0L+AfQ0zD9rWaTLiUqHA8p0gxx7lu1EylenfzjeIWNkPy6e/0VG/Wjw9uf9LueQwLOw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-exponentiation-operator@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.2.0.tgz#a63868289e5b4007f7054d46491af51435766008" + integrity sha512-umh4hR6N7mu4Elq9GG8TOu9M0bakvlsREEC+ialrQN6ABS4oDQ69qJv1VtR3uxlKMCQMCvzk7vr17RHKcjx68A== + dependencies: + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.1.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-flow-strip-types@^7.0.0": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.4.4.tgz#d267a081f49a8705fc9146de0768c6b58dccd8f7" + integrity sha512-WyVedfeEIILYEaWGAUWzVNyqG4sfsNooMhXWsu/YzOvVGcsnPb5PguysjJqI3t3qiaYj0BR8T2f5njdjTGe44Q== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-flow" "^7.2.0" + +"@babel/plugin-transform-for-of@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.4.4.tgz#0267fc735e24c808ba173866c6c4d1440fc3c556" + integrity sha512-9T/5Dlr14Z9TIEXLXkt8T1DU7F24cbhwhMNUziN3hB1AXoZcdzPcTiKGRn/6iOymDqtTKWnr/BtRKN9JwbKtdQ== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-function-name@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.4.4.tgz#e1436116abb0610c2259094848754ac5230922ad" + integrity sha512-iU9pv7U+2jC9ANQkKeNF6DrPy4GBa4NWQtl6dHB4Pb3izX2JOEvDTFarlNsBj/63ZEzNNIAMs3Qw4fNCcSOXJA== + dependencies: + "@babel/helper-function-name" "^7.1.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-literals@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.2.0.tgz#690353e81f9267dad4fd8cfd77eafa86aba53ea1" + integrity sha512-2ThDhm4lI4oV7fVQ6pNNK+sx+c/GM5/SaML0w/r4ZB7sAneD/piDJtwdKlNckXeyGK7wlwg2E2w33C/Hh+VFCg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-member-expression-literals@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.2.0.tgz#fa10aa5c58a2cb6afcf2c9ffa8cb4d8b3d489a2d" + integrity sha512-HiU3zKkSU6scTidmnFJ0bMX8hz5ixC93b4MHMiYebmk2lUVNGOboPsqQvx5LzooihijUoLR/v7Nc1rbBtnc7FA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-modules-amd@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.2.0.tgz#82a9bce45b95441f617a24011dc89d12da7f4ee6" + integrity sha512-mK2A8ucqz1qhrdqjS9VMIDfIvvT2thrEsIQzbaTdc5QFzhDjQv2CkJJ5f6BXIkgbmaoax3zBr2RyvV/8zeoUZw== + dependencies: + "@babel/helper-module-transforms" "^7.1.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-modules-commonjs@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.4.4.tgz#0bef4713d30f1d78c2e59b3d6db40e60192cac1e" + integrity sha512-4sfBOJt58sEo9a2BQXnZq+Q3ZTSAUXyK3E30o36BOGnJ+tvJ6YSxF0PG6kERvbeISgProodWuI9UVG3/FMY6iw== + dependencies: + "@babel/helper-module-transforms" "^7.4.4" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-simple-access" "^7.1.0" + +"@babel/plugin-transform-modules-systemjs@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.4.4.tgz#dc83c5665b07d6c2a7b224c00ac63659ea36a405" + integrity sha512-MSiModfILQc3/oqnG7NrP1jHaSPryO6tA2kOMmAQApz5dayPxWiHqmq4sWH2xF5LcQK56LlbKByCd8Aah/OIkQ== + dependencies: + "@babel/helper-hoist-variables" "^7.4.4" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-modules-umd@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.2.0.tgz#7678ce75169f0877b8eb2235538c074268dd01ae" + integrity sha512-BV3bw6MyUH1iIsGhXlOK6sXhmSarZjtJ/vMiD9dNmpY8QXFFQTj+6v92pcfy1iqa8DeAfJFwoxcrS/TUZda6sw== + dependencies: + "@babel/helper-module-transforms" "^7.1.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-named-capturing-groups-regex@^7.4.5": + version "7.4.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.4.5.tgz#9d269fd28a370258199b4294736813a60bbdd106" + integrity sha512-z7+2IsWafTBbjNsOxU/Iv5CvTJlr5w4+HGu1HovKYTtgJ362f7kBcQglkfmlspKKZ3bgrbSGvLfNx++ZJgCWsg== + dependencies: + regexp-tree "^0.1.6" + +"@babel/plugin-transform-new-target@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.4.4.tgz#18d120438b0cc9ee95a47f2c72bc9768fbed60a5" + integrity sha512-r1z3T2DNGQwwe2vPGZMBNjioT2scgWzK9BCnDEh+46z8EEwXBq24uRzd65I7pjtugzPSj921aM15RpESgzsSuA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-object-super@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.2.0.tgz#b35d4c10f56bab5d650047dad0f1d8e8814b6598" + integrity sha512-VMyhPYZISFZAqAPVkiYb7dUe2AsVi2/wCT5+wZdsNO31FojQJa9ns40hzZ6U9f50Jlq4w6qwzdBB2uwqZ00ebg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-replace-supers" "^7.1.0" + +"@babel/plugin-transform-parameters@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.4.4.tgz#7556cf03f318bd2719fe4c922d2d808be5571e16" + integrity sha512-oMh5DUO1V63nZcu/ZVLQFqiihBGo4OpxJxR1otF50GMeCLiRx5nUdtokd+u9SuVJrvvuIh9OosRFPP4pIPnwmw== + dependencies: + "@babel/helper-call-delegate" "^7.4.4" + "@babel/helper-get-function-arity" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-property-literals@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.2.0.tgz#03e33f653f5b25c4eb572c98b9485055b389e905" + integrity sha512-9q7Dbk4RhgcLp8ebduOpCbtjh7C0itoLYHXd9ueASKAG/is5PQtMR5VJGka9NKqGhYEGn5ITahd4h9QeBMylWQ== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-react-display-name@^7.0.0", "@babel/plugin-transform-react-display-name@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.2.0.tgz#ebfaed87834ce8dc4279609a4f0c324c156e3eb0" + integrity sha512-Htf/tPa5haZvRMiNSQSFifK12gtr/8vwfr+A9y69uF0QcU77AVu4K7MiHEkTxF7lQoHOL0F9ErqgfNEAKgXj7A== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-react-jsx-self@^7.0.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.2.0.tgz#461e21ad9478f1031dd5e276108d027f1b5240ba" + integrity sha512-v6S5L/myicZEy+jr6ielB0OR8h+EH/1QFx/YJ7c7Ua+7lqsjj/vW6fD5FR9hB/6y7mGbfT4vAURn3xqBxsUcdg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-jsx" "^7.2.0" + +"@babel/plugin-transform-react-jsx-source@^7.0.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.2.0.tgz#20c8c60f0140f5dd3cd63418d452801cf3f7180f" + integrity sha512-A32OkKTp4i5U6aE88GwwcuV4HAprUgHcTq0sSafLxjr6AW0QahrCRCjxogkbbcdtpbXkuTOlgpjophCxb6sh5g== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-jsx" "^7.2.0" + +"@babel/plugin-transform-react-jsx@^7.0.0": + version "7.3.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.3.0.tgz#f2cab99026631c767e2745a5368b331cfe8f5290" + integrity sha512-a/+aRb7R06WcKvQLOu4/TpjKOdvVEKRLWFpKcNuHhiREPgGRB4TQJxq07+EZLS8LFVYpfq1a5lDUnuMdcCpBKg== + dependencies: + "@babel/helper-builder-react-jsx" "^7.3.0" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-jsx" "^7.2.0" + +"@babel/plugin-transform-regenerator@^7.4.5": + version "7.4.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.4.5.tgz#629dc82512c55cee01341fb27bdfcb210354680f" + integrity sha512-gBKRh5qAaCWntnd09S8QC7r3auLCqq5DI6O0DlfoyDjslSBVqBibrMdsqO+Uhmx3+BlOmE/Kw1HFxmGbv0N9dA== + dependencies: + regenerator-transform "^0.14.0" + +"@babel/plugin-transform-reserved-words@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.2.0.tgz#4792af87c998a49367597d07fedf02636d2e1634" + integrity sha512-fz43fqW8E1tAB3DKF19/vxbpib1fuyCwSPE418ge5ZxILnBhWyhtPgz8eh1RCGGJlwvksHkyxMxh0eenFi+kFw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-shorthand-properties@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.2.0.tgz#6333aee2f8d6ee7e28615457298934a3b46198f0" + integrity sha512-QP4eUM83ha9zmYtpbnyjTLAGKQritA5XW/iG9cjtuOI8s1RuL/3V6a3DeSHfKutJQ+ayUfeZJPcnCYEQzaPQqg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-spread@^7.2.0": + version "7.2.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.2.2.tgz#3103a9abe22f742b6d406ecd3cd49b774919b406" + integrity sha512-KWfky/58vubwtS0hLqEnrWJjsMGaOeSBn90Ezn5Jeg9Z8KKHmELbP1yGylMlm5N6TPKeY9A2+UaSYLdxahg01w== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-sticky-regex@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.2.0.tgz#a1e454b5995560a9c1e0d537dfc15061fd2687e1" + integrity sha512-KKYCoGaRAf+ckH8gEL3JHUaFVyNHKe3ASNsZ+AlktgHevvxGigoIttrEJb8iKN03Q7Eazlv1s6cx2B2cQ3Jabw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-regex" "^7.0.0" + +"@babel/plugin-transform-template-literals@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.4.4.tgz#9d28fea7bbce637fb7612a0750989d8321d4bcb0" + integrity sha512-mQrEC4TWkhLN0z8ygIvEL9ZEToPhG5K7KDW3pzGqOfIGZ28Jb0POUkeWcoz8HnHvhFy6dwAT1j8OzqN8s804+g== + dependencies: + "@babel/helper-annotate-as-pure" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-typeof-symbol@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.2.0.tgz#117d2bcec2fbf64b4b59d1f9819894682d29f2b2" + integrity sha512-2LNhETWYxiYysBtrBTqL8+La0jIoQQnIScUJc74OYvUGRmkskNY4EzLCnjHBzdmb38wqtTaixpo1NctEcvMDZw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-unicode-regex@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.4.4.tgz#ab4634bb4f14d36728bf5978322b35587787970f" + integrity sha512-il+/XdNw01i93+M9J9u4T7/e/Ue/vWfNZE4IRUQjplu2Mqb/AFTDimkw2tdEdSH50wuQXZAbXSql0UphQke+vA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-regex" "^7.4.4" + regexpu-core "^4.5.4" + +"@babel/polyfill@^7.2.5": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/polyfill/-/polyfill-7.4.4.tgz#78801cf3dbe657844eeabf31c1cae3828051e893" + integrity sha512-WlthFLfhQQhh+A2Gn5NSFl0Huxz36x86Jn+E9OW7ibK8edKPq+KLy4apM1yDpQ8kJOVi1OVjpP4vSDLdrI04dg== + dependencies: + core-js "^2.6.5" + regenerator-runtime "^0.13.2" + +"@babel/preset-env@^7.3.4": + version "7.4.5" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.4.5.tgz#2fad7f62983d5af563b5f3139242755884998a58" + integrity sha512-f2yNVXM+FsR5V8UwcFeIHzHWgnhXg3NpRmy0ADvALpnhB0SLbCvrCRr4BLOUYbQNLS+Z0Yer46x9dJXpXewI7w== + dependencies: + "@babel/helper-module-imports" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-proposal-async-generator-functions" "^7.2.0" + "@babel/plugin-proposal-json-strings" "^7.2.0" + "@babel/plugin-proposal-object-rest-spread" "^7.4.4" + "@babel/plugin-proposal-optional-catch-binding" "^7.2.0" + "@babel/plugin-proposal-unicode-property-regex" "^7.4.4" + "@babel/plugin-syntax-async-generators" "^7.2.0" + "@babel/plugin-syntax-json-strings" "^7.2.0" + "@babel/plugin-syntax-object-rest-spread" "^7.2.0" + "@babel/plugin-syntax-optional-catch-binding" "^7.2.0" + "@babel/plugin-transform-arrow-functions" "^7.2.0" + "@babel/plugin-transform-async-to-generator" "^7.4.4" + "@babel/plugin-transform-block-scoped-functions" "^7.2.0" + "@babel/plugin-transform-block-scoping" "^7.4.4" + "@babel/plugin-transform-classes" "^7.4.4" + "@babel/plugin-transform-computed-properties" "^7.2.0" + "@babel/plugin-transform-destructuring" "^7.4.4" + "@babel/plugin-transform-dotall-regex" "^7.4.4" + "@babel/plugin-transform-duplicate-keys" "^7.2.0" + "@babel/plugin-transform-exponentiation-operator" "^7.2.0" + "@babel/plugin-transform-for-of" "^7.4.4" + "@babel/plugin-transform-function-name" "^7.4.4" + "@babel/plugin-transform-literals" "^7.2.0" + "@babel/plugin-transform-member-expression-literals" "^7.2.0" + "@babel/plugin-transform-modules-amd" "^7.2.0" + "@babel/plugin-transform-modules-commonjs" "^7.4.4" + "@babel/plugin-transform-modules-systemjs" "^7.4.4" + "@babel/plugin-transform-modules-umd" "^7.2.0" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.4.5" + "@babel/plugin-transform-new-target" "^7.4.4" + "@babel/plugin-transform-object-super" "^7.2.0" + "@babel/plugin-transform-parameters" "^7.4.4" + "@babel/plugin-transform-property-literals" "^7.2.0" + "@babel/plugin-transform-regenerator" "^7.4.5" + "@babel/plugin-transform-reserved-words" "^7.2.0" + "@babel/plugin-transform-shorthand-properties" "^7.2.0" + "@babel/plugin-transform-spread" "^7.2.0" + "@babel/plugin-transform-sticky-regex" "^7.2.0" + "@babel/plugin-transform-template-literals" "^7.4.4" + "@babel/plugin-transform-typeof-symbol" "^7.2.0" + "@babel/plugin-transform-unicode-regex" "^7.4.4" + "@babel/types" "^7.4.4" + browserslist "^4.6.0" + core-js-compat "^3.1.1" + invariant "^2.2.2" + js-levenshtein "^1.1.3" + semver "^5.5.0" + +"@babel/preset-flow@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/preset-flow/-/preset-flow-7.0.0.tgz#afd764835d9535ec63d8c7d4caf1c06457263da2" + integrity sha512-bJOHrYOPqJZCkPVbG1Lot2r5OSsB+iUOaxiHdlOeB1yPWS6evswVHwvkDLZ54WTaTRIk89ds0iHmGZSnxlPejQ== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-transform-flow-strip-types" "^7.0.0" + +"@babel/preset-react@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.0.0.tgz#e86b4b3d99433c7b3e9e91747e2653958bc6b3c0" + integrity sha512-oayxyPS4Zj+hF6Et11BwuBkmpgT/zMxyuZgFrMeZID6Hdh3dGlk4sHCAhdBCpuCKW2ppBfl2uCCetlrUIJRY3w== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-transform-react-display-name" "^7.0.0" + "@babel/plugin-transform-react-jsx" "^7.0.0" + "@babel/plugin-transform-react-jsx-self" "^7.0.0" + "@babel/plugin-transform-react-jsx-source" "^7.0.0" + +"@babel/runtime@^7.3.4": + version "7.4.5" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.4.5.tgz#582bb531f5f9dc67d2fcb682979894f75e253f12" + integrity sha512-TuI4qpWZP6lGOGIuGWtp9sPluqYICmbk8T/1vpSysqJxRPkudh/ofFWyqdcMsDf2s7KvDL4/YHgKyvcS3g9CJQ== + dependencies: + regenerator-runtime "^0.13.2" + +"@babel/template@^7.1.0", "@babel/template@^7.4.0", "@babel/template@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.4.4.tgz#f4b88d1225689a08f5bc3a17483545be9e4ed237" + integrity sha512-CiGzLN9KgAvgZsnivND7rkA+AeJ9JB0ciPOD4U59GKbQP2iQl+olF1l76kJOupqidozfZ32ghwBEJDhnk9MEcw== + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/parser" "^7.4.4" + "@babel/types" "^7.4.4" + +"@babel/traverse@^7.0.0", "@babel/traverse@^7.1.0", "@babel/traverse@^7.4.3", "@babel/traverse@^7.4.4", "@babel/traverse@^7.4.5": + version "7.4.5" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.4.5.tgz#4e92d1728fd2f1897dafdd321efbff92156c3216" + integrity sha512-Vc+qjynwkjRmIFGxy0KYoPj4FdVDxLej89kMHFsWScq999uX+pwcX4v9mWRjW0KcAYTPAuVQl2LKP1wEVLsp+A== + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/generator" "^7.4.4" + "@babel/helper-function-name" "^7.1.0" + "@babel/helper-split-export-declaration" "^7.4.4" + "@babel/parser" "^7.4.5" + "@babel/types" "^7.4.4" + debug "^4.1.0" + globals "^11.1.0" + lodash "^4.17.11" + +"@babel/types@^7.0.0", "@babel/types@^7.0.0-beta.49", "@babel/types@^7.2.0", "@babel/types@^7.3.0", "@babel/types@^7.4.0", "@babel/types@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.4.4.tgz#8db9e9a629bb7c29370009b4b779ed93fe57d5f0" + integrity sha512-dOllgYdnEFOebhkKCjzSVFqw/PmmB8pH6RGOWkY4GsboQNd47b1fBThBSwlHAq9alF9vc1M3+6oqR47R50L0tQ== + dependencies: + esutils "^2.0.2" + lodash "^4.17.11" + to-fast-properties "^2.0.0" + +"@cnakazawa/watch@^1.0.3": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@cnakazawa/watch/-/watch-1.0.3.tgz#099139eaec7ebf07a27c1786a3ff64f39464d2ef" + integrity sha512-r5160ogAvGyHsal38Kux7YYtodEKOj89RGb28ht1jh3SJb08VwRwAKKJL0bGb04Zd/3r9FL3BFIc3bBidYffCA== + dependencies: + exec-sh "^0.3.2" + minimist "^1.2.0" + +"@csstools/convert-colors@^1.4.0": + version "1.4.0" + resolved "https://registry.yarnpkg.com/@csstools/convert-colors/-/convert-colors-1.4.0.tgz#ad495dc41b12e75d588c6db8b9834f08fa131eb7" + integrity sha512-5a6wqoJV/xEdbRNKVo6I4hO3VjyDq//8q2f9I6PBAvMesJHFauXDorcNCsr9RzvsZnaWi5NYCcfyqP1QeFHFbw== + +"@jest/console@^24.7.1": + version "24.7.1" + resolved "https://registry.yarnpkg.com/@jest/console/-/console-24.7.1.tgz#32a9e42535a97aedfe037e725bd67e954b459545" + integrity sha512-iNhtIy2M8bXlAOULWVTUxmnelTLFneTNEkHCgPmgd+zNwy9zVddJ6oS5rZ9iwoscNdT5mMwUd0C51v/fSlzItg== + dependencies: + "@jest/source-map" "^24.3.0" + chalk "^2.0.1" + slash "^2.0.0" + +"@jest/core@^24.8.0": + version "24.8.0" + resolved "https://registry.yarnpkg.com/@jest/core/-/core-24.8.0.tgz#fbbdcd42a41d0d39cddbc9f520c8bab0c33eed5b" + integrity sha512-R9rhAJwCBQzaRnrRgAdVfnglUuATXdwTRsYqs6NMdVcAl5euG8LtWDe+fVkN27YfKVBW61IojVsXKaOmSnqd/A== + dependencies: + "@jest/console" "^24.7.1" + "@jest/reporters" "^24.8.0" + "@jest/test-result" "^24.8.0" + "@jest/transform" "^24.8.0" + "@jest/types" "^24.8.0" + ansi-escapes "^3.0.0" + chalk "^2.0.1" + exit "^0.1.2" + graceful-fs "^4.1.15" + jest-changed-files "^24.8.0" + jest-config "^24.8.0" + jest-haste-map "^24.8.0" + jest-message-util "^24.8.0" + jest-regex-util "^24.3.0" + jest-resolve-dependencies "^24.8.0" + jest-runner "^24.8.0" + jest-runtime "^24.8.0" + jest-snapshot "^24.8.0" + jest-util "^24.8.0" + jest-validate "^24.8.0" + jest-watcher "^24.8.0" + micromatch "^3.1.10" + p-each-series "^1.0.0" + pirates "^4.0.1" + realpath-native "^1.1.0" + rimraf "^2.5.4" + strip-ansi "^5.0.0" + +"@jest/environment@^24.8.0": + version "24.8.0" + resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-24.8.0.tgz#0342261383c776bdd652168f68065ef144af0eac" + integrity sha512-vlGt2HLg7qM+vtBrSkjDxk9K0YtRBi7HfRFaDxoRtyi+DyVChzhF20duvpdAnKVBV6W5tym8jm0U9EfXbDk1tw== + dependencies: + "@jest/fake-timers" "^24.8.0" + "@jest/transform" "^24.8.0" + "@jest/types" "^24.8.0" + jest-mock "^24.8.0" + +"@jest/fake-timers@^24.8.0": + version "24.8.0" + resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-24.8.0.tgz#2e5b80a4f78f284bcb4bd5714b8e10dd36a8d3d1" + integrity sha512-2M4d5MufVXwi6VzZhJ9f5S/wU4ud2ck0kxPof1Iz3zWx6Y+V2eJrES9jEktB6O3o/oEyk+il/uNu9PvASjWXQw== + dependencies: + "@jest/types" "^24.8.0" + jest-message-util "^24.8.0" + jest-mock "^24.8.0" + +"@jest/reporters@^24.8.0": + version "24.8.0" + resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-24.8.0.tgz#075169cd029bddec54b8f2c0fc489fd0b9e05729" + integrity sha512-eZ9TyUYpyIIXfYCrw0UHUWUvE35vx5I92HGMgS93Pv7du+GHIzl+/vh8Qj9MCWFK/4TqyttVBPakWMOfZRIfxw== + dependencies: + "@jest/environment" "^24.8.0" + "@jest/test-result" "^24.8.0" + "@jest/transform" "^24.8.0" + "@jest/types" "^24.8.0" + chalk "^2.0.1" + exit "^0.1.2" + glob "^7.1.2" + istanbul-lib-coverage "^2.0.2" + istanbul-lib-instrument "^3.0.1" + istanbul-lib-report "^2.0.4" + istanbul-lib-source-maps "^3.0.1" + istanbul-reports "^2.1.1" + jest-haste-map "^24.8.0" + jest-resolve "^24.8.0" + jest-runtime "^24.8.0" + jest-util "^24.8.0" + jest-worker "^24.6.0" + node-notifier "^5.2.1" + slash "^2.0.0" + source-map "^0.6.0" + string-length "^2.0.0" + +"@jest/source-map@^24.3.0": + version "24.3.0" + resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-24.3.0.tgz#563be3aa4d224caf65ff77edc95cd1ca4da67f28" + integrity sha512-zALZt1t2ou8le/crCeeiRYzvdnTzaIlpOWaet45lNSqNJUnXbppUUFR4ZUAlzgDmKee4Q5P/tKXypI1RiHwgag== + dependencies: + callsites "^3.0.0" + graceful-fs "^4.1.15" + source-map "^0.6.0" + +"@jest/test-result@^24.8.0": + version "24.8.0" + resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-24.8.0.tgz#7675d0aaf9d2484caa65e048d9b467d160f8e9d3" + integrity sha512-+YdLlxwizlfqkFDh7Mc7ONPQAhA4YylU1s529vVM1rsf67vGZH/2GGm5uO8QzPeVyaVMobCQ7FTxl38QrKRlng== + dependencies: + "@jest/console" "^24.7.1" + "@jest/types" "^24.8.0" + "@types/istanbul-lib-coverage" "^2.0.0" + +"@jest/test-sequencer@^24.8.0": + version "24.8.0" + resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-24.8.0.tgz#2f993bcf6ef5eb4e65e8233a95a3320248cf994b" + integrity sha512-OzL/2yHyPdCHXEzhoBuq37CE99nkme15eHkAzXRVqthreWZamEMA0WoetwstsQBCXABhczpK03JNbc4L01vvLg== + dependencies: + "@jest/test-result" "^24.8.0" + jest-haste-map "^24.8.0" + jest-runner "^24.8.0" + jest-runtime "^24.8.0" + +"@jest/transform@^24.8.0": + version "24.8.0" + resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-24.8.0.tgz#628fb99dce4f9d254c6fd9341e3eea262e06fef5" + integrity sha512-xBMfFUP7TortCs0O+Xtez2W7Zu1PLH9bvJgtraN1CDST6LBM/eTOZ9SfwS/lvV8yOfcDpFmwf9bq5cYbXvqsvA== + dependencies: + "@babel/core" "^7.1.0" + "@jest/types" "^24.8.0" + babel-plugin-istanbul "^5.1.0" + chalk "^2.0.1" + convert-source-map "^1.4.0" + fast-json-stable-stringify "^2.0.0" + graceful-fs "^4.1.15" + jest-haste-map "^24.8.0" + jest-regex-util "^24.3.0" + jest-util "^24.8.0" + micromatch "^3.1.10" + realpath-native "^1.1.0" + slash "^2.0.0" + source-map "^0.6.1" + write-file-atomic "2.4.1" + +"@jest/types@^24.8.0": + version "24.8.0" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-24.8.0.tgz#f31e25948c58f0abd8c845ae26fcea1491dea7ad" + integrity sha512-g17UxVr2YfBtaMUxn9u/4+siG1ptg9IGYAYwvpwn61nBg779RXnjE/m7CxYcIzEt0AbHZZAHSEZNhkE2WxURVg== + dependencies: + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^1.1.1" + "@types/yargs" "^12.0.9" + "@semantic-release/commit-analyzer@^2.0.0": version "2.0.0" resolved "https://registry.yarnpkg.com/@semantic-release/commit-analyzer/-/commit-analyzer-2.0.0.tgz#924d1e2c30167c6a472bed9f66ee8f8e077489b2" @@ -35,18 +948,88 @@ conventional-changelog "0.0.17" github-url-from-git "^1.4.0" +"@types/babel__core@^7.1.0": + version "7.1.2" + resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.2.tgz#608c74f55928033fce18b99b213c16be4b3d114f" + integrity sha512-cfCCrFmiGY/yq0NuKNxIQvZFy9kY/1immpSpTngOnyIbD4+eJOG5mxphhHDv3CHL9GltO4GcKr54kGBg3RNdbg== + dependencies: + "@babel/parser" "^7.1.0" + "@babel/types" "^7.0.0" + "@types/babel__generator" "*" + "@types/babel__template" "*" + "@types/babel__traverse" "*" + +"@types/babel__generator@*": + version "7.0.2" + resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.0.2.tgz#d2112a6b21fad600d7674274293c85dce0cb47fc" + integrity sha512-NHcOfab3Zw4q5sEE2COkpfXjoE7o+PmqD9DQW4koUT3roNxwziUdXGnRndMat/LJNUtePwn1TlP4do3uoe3KZQ== + dependencies: + "@babel/types" "^7.0.0" + +"@types/babel__template@*": + version "7.0.2" + resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.0.2.tgz#4ff63d6b52eddac1de7b975a5223ed32ecea9307" + integrity sha512-/K6zCpeW7Imzgab2bLkLEbz0+1JlFSrUMdw7KoIIu+IUdu51GWaBZpd3y1VXGVXzynvGa4DaIaxNZHiON3GXUg== + dependencies: + "@babel/parser" "^7.1.0" + "@babel/types" "^7.0.0" + +"@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": + version "7.0.7" + resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.0.7.tgz#2496e9ff56196cc1429c72034e07eab6121b6f3f" + integrity sha512-CeBpmX1J8kWLcDEnI3Cl2Eo6RfbGvzUctA+CjZUhOKDFbLfcr7fc4usEqLNWetrlJd7RhAkyYe2czXop4fICpw== + dependencies: + "@babel/types" "^7.3.0" + +"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.1.tgz#42995b446db9a48a11a07ec083499a860e9138ff" + integrity sha512-hRJD2ahnnpLgsj6KWMYSrmXkM3rm2Dl1qkx6IOFD5FnuNPXJIG5L0dhgKXCYTRMGzU4n0wImQ/xfmRc4POUFlg== + +"@types/istanbul-lib-report@*": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-1.1.1.tgz#e5471e7fa33c61358dd38426189c037a58433b8c" + integrity sha512-3BUTyMzbZa2DtDI2BkERNC6jJw2Mr2Y0oGI7mRxYNBPxppbtEK1F66u3bKwU2g+wxwWI7PAoRpJnOY1grJqzHg== + dependencies: + "@types/istanbul-lib-coverage" "*" + +"@types/istanbul-reports@^1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-1.1.1.tgz#7a8cbf6a406f36c8add871625b278eaf0b0d255a" + integrity sha512-UpYjBi8xefVChsCoBpKShdxTllC9pwISirfoZsUa2AAdQg/Jd2KQGtSbw+ya7GPo7x/wAPlH6JBhKhAsXUEZNA== + dependencies: + "@types/istanbul-lib-coverage" "*" + "@types/istanbul-lib-report" "*" + +"@types/q@^1.5.1": + version "1.5.2" + resolved "https://registry.yarnpkg.com/@types/q/-/q-1.5.2.tgz#690a1475b84f2a884fd07cd797c00f5f31356ea8" + integrity sha512-ce5d3q03Ex0sy4R14722Rmt6MT07Ua+k4FwDfdcToYJcMKNtRVQvJ6JCAPdAmAnbRb6CsX6aYb9m96NGod9uTw== + +"@types/stack-utils@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-1.0.1.tgz#0a851d3bd96498fa25c33ab7278ed3bd65f06c3e" + integrity sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw== + +"@types/yargs@^12.0.2", "@types/yargs@^12.0.9": + version "12.0.12" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-12.0.12.tgz#45dd1d0638e8c8f153e87d296907659296873916" + integrity sha512-SOhuU4wNBxhhTHxYaiG5NY4HBhDIDnJF60GU+2LqHAdKKer86//e4yg69aENCtQ04n0ovz+tq2YPME5t5yp4pw== + JSONStream@^1.0.3: - version "1.2.1" - resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.2.1.tgz#32aa5790e799481083b49b4b7fa94e23bae69bf9" + version "1.3.5" + resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.5.tgz#3208c1f08d3a4d99261ab64f92302bc15e111ca0" + integrity sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ== dependencies: jsonparse "^1.2.0" through ">=2.2.7 <3" -abab@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/abab/-/abab-1.0.3.tgz#b81de5f7274ec4e756d797cd834f303642724e5d" +abab@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.0.tgz#aba0ab4c5eee2d4c79d3487d85450fb2376ebb0f" + integrity sha512-sY5AXXVZv4Y1VACTtR11UJCPHHudgY5i26Qj5TypE6DKlIApbwb5uqhXcJ5UUGbvZNRh7EeIoW+LrJumBsKp7w== -abbrev@1, abbrev@1.0.x: +abbrev@1: version "1.0.9" resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.0.9.tgz#91b4792588a7738c25f35dd6f63752a2f8776135" @@ -56,33 +1039,50 @@ acorn-dynamic-import@^2.0.0: dependencies: acorn "^4.0.3" -acorn-globals@^1.0.4: - version "1.0.9" - resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-1.0.9.tgz#55bb5e98691507b74579d0513413217c380c54cf" +acorn-dynamic-import@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/acorn-dynamic-import/-/acorn-dynamic-import-4.0.0.tgz#482210140582a36b83c3e342e1cfebcaa9240948" + integrity sha512-d3OEjQV4ROpoflsnUA8HozoIR504TFxNivYEUi6uwz0IYhBkTDXGuWlNdMtybRt3nqVx/L6XqMt0FxkXuWKZhw== + +acorn-globals@^4.1.0: + version "4.3.2" + resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-4.3.2.tgz#4e2c2313a597fd589720395f6354b41cd5ec8006" + integrity sha512-BbzvZhVtZP+Bs1J1HcwrQe8ycfO0wStkSGxuul3He3GkHOIZ6eTqOkPuw9IP1X3+IkOo4wiJmwkobzXYz4wewQ== dependencies: - acorn "^2.1.0" + acorn "^6.0.1" + acorn-walk "^6.0.1" -acorn-jsx@^3.0.0, acorn-jsx@^3.0.1: +acorn-jsx@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-3.0.1.tgz#afdf9488fb1ecefc8348f6fb22f464e32a58b36b" + integrity sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s= dependencies: acorn "^3.0.4" -acorn@^1.0.3: - version "1.2.2" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-1.2.2.tgz#c8ce27de0acc76d896d2b1fad3df588d9e82f014" +acorn-jsx@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.0.1.tgz#32a064fd925429216a09b141102bfdd185fae40e" + integrity sha512-HJ7CfNHrfJLlNTzIEUTj43LNWGkqpRLxm3YjAlcD0ACydk9XynzYsCBHxut+iqt+1aBXkx9UP/w/ZqMr13XIzg== -acorn@^2.1.0, acorn@^2.4.0, acorn@^2.7.0: - version "2.7.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-2.7.0.tgz#ab6e7d9d886aaca8b085bc3312b79a198433f0e7" +acorn-node@^1.2.0, acorn-node@^1.3.0, acorn-node@^1.5.2, acorn-node@^1.6.1: + version "1.7.0" + resolved "https://registry.yarnpkg.com/acorn-node/-/acorn-node-1.7.0.tgz#aac6a559d27af6176b076ab6fb13c5974c213e3b" + integrity sha512-XhahLSsCB6X6CJbe+uNu3Mn9sJBNFxtBN9NLgAOQovfS6Kh0lDUtmlclhjn9CvEK7A7YyRU13PXlNcpSiLI9Yw== + dependencies: + acorn "^6.1.1" + acorn-dynamic-import "^4.0.0" + acorn-walk "^6.1.1" + xtend "^4.0.1" + +acorn-walk@^6.0.1, acorn-walk@^6.1.1: + version "6.1.1" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-6.1.1.tgz#d363b66f5fac5f018ff9c3a1e7b6f8e310cc3913" + integrity sha512-OtUw6JUTgxA2QoqqmrmQ7F2NYqiBPi/L2jqHyFtllhOUvXYQXf0Z1CYUinIfyT4bTCGmrA7gX9FvHA81uzCoVw== acorn@^3.0.4: version "3.3.0" resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a" - -acorn@^4.0.1: - version "4.0.3" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.3.tgz#1a3e850b428e73ba6b09d1cc527f5aaad4d03ef1" + integrity sha1-ReN/s56No/JbruP/U2niu18iAXo= acorn@^4.0.3: version "4.0.13" @@ -92,6 +1092,16 @@ acorn@^5.0.0: version "5.7.1" resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.1.tgz#f095829297706a7c9776958c0afc8930a9b9d9d8" +acorn@^5.5.0, acorn@^5.5.3: + version "5.7.3" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.3.tgz#67aa231bf8812974b85235a96771eb6bd07ea279" + integrity sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw== + +acorn@^6.0.1, acorn@^6.0.7, acorn@^6.1.1: + version "6.1.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.1.1.tgz#7d25ae05bb8ad1f9b699108e1094ecd7884adc1f" + integrity sha512-jPTiwtOxaHNaAPg/dmrJ/beuzLRnXtB0kQPQ8JpotKJgTB6rX6c8mlf315941pyjBSaPg8NHXS9fhP4u17DpGA== + agent-base@2: version "2.0.1" resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-2.0.1.tgz#bd8f9e86a8eb221fffa07bd14befd55df142815e" @@ -99,14 +1109,15 @@ agent-base@2: extend "~3.0.0" semver "~5.0.1" -ajv-keywords@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-1.1.1.tgz#02550bc605a3e576041565628af972e06c549d50" - ajv-keywords@^1.1.1: version "1.5.1" resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-1.5.1.tgz#314dd0a4b3368fad3dfcdc54ede6171b886daf3c" +ajv-keywords@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-2.1.1.tgz#617997fc5f60576894c435f940d819e135b80762" + integrity sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I= + ajv@^4.7.0: version "4.7.7" resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.7.7.tgz#4980d5f65ce90a2579532eec66429f320dea0321" @@ -114,6 +1125,26 @@ ajv@^4.7.0: co "^4.6.0" json-stable-stringify "^1.0.1" +ajv@^5.2.3, ajv@^5.3.0: + version "5.5.2" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.2.tgz#73b5eeca3fab653e3d3f9422b341ad42205dc965" + integrity sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU= + dependencies: + co "^4.6.0" + fast-deep-equal "^1.0.0" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.3.0" + +ajv@^6.5.5, ajv@^6.9.1: + version "6.10.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.10.0.tgz#90d0d54439da587cd7e843bfb7045f50bd22bdf1" + integrity sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg== + dependencies: + fast-deep-equal "^2.0.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + align-text@^0.1.1, align-text@^0.1.3: version "0.1.4" resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117" @@ -122,39 +1153,49 @@ align-text@^0.1.1, align-text@^0.1.3: longest "^1.0.1" repeat-string "^1.5.2" -alphanum-sort@^1.0.1, alphanum-sort@^1.0.2: +alphanum-sort@^1.0.0, alphanum-sort@^1.0.1, alphanum-sort@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3" -amdefine@>=0.0.4: - version "1.0.0" - resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.0.tgz#fd17474700cb5cc9c2b709f0be9d23ce3c198c33" - -ansi-escapes@^1.1.0, ansi-escapes@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-1.4.0.tgz#d3a8a83b319aa67793662b13e761c7911422306e" +ansi-escapes@^3.0.0, ansi-escapes@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" + integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== ansi-regex@^0.2.0, ansi-regex@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-0.2.1.tgz#0d8e946967a3d8143f93e24e298525fc1b2235f9" + integrity sha1-DY6UaWej2BQ/k+JOKYUl/BsiNfk= ansi-regex@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.0.0.tgz#c5061b6e0ef8a81775e50f5d66151bf6bf371107" +ansi-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" + integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= + +ansi-regex@^4.0.0, ansi-regex@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" + integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== + ansi-styles@2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.0.1.tgz#b033f57f93e2d28adeb8bc11138fa13da0fd20a3" + integrity sha1-sDP1f5Pi0oreuLwRE4+hPaD9IKM= ansi-styles@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-1.1.0.tgz#eaecbf66cd706882760b2f4691582b8f55d7a7de" + integrity sha1-6uy/Zs1waIJ2Cy9GkVgrj1XXp94= ansi-styles@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" -ansi-styles@^3.2.1: +ansi-styles@^3.1.0, ansi-styles@^3.2.0, ansi-styles@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" dependencies: @@ -164,14 +1205,6 @@ ansi@^0.3.0, ansi@~0.3.0: version "0.3.1" resolved "https://registry.yarnpkg.com/ansi/-/ansi-0.3.1.tgz#0c42d4fb17160d5a9af1e484bace1c66922c1b21" -ansicolors@~0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/ansicolors/-/ansicolors-0.2.1.tgz#be089599097b74a5c9c4a84a0cdbcdb62bd87aef" - -any-promise@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-0.1.0.tgz#830b680aa7e56f33451d4b049f3bd8044498ee27" - anymatch@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.0.tgz#a3e52fa39168c825ff57b0248126ce5a8ff95507" @@ -186,10 +1219,6 @@ anymatch@^2.0.0: micromatch "^3.1.4" normalize-path "^2.1.1" -append-transform@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/append-transform/-/append-transform-0.3.0.tgz#d6933ce4a85f09445d9ccc4cc119051b7381a813" - aproba@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.0.4.tgz#2713680775e7614c8ba186c065d4e2e52d1072c0" @@ -217,10 +1246,19 @@ argparse@^1.0.7: argparse@~0.1.15: version "0.1.16" resolved "https://registry.yarnpkg.com/argparse/-/argparse-0.1.16.tgz#cfd01e0fbba3d6caed049fbd758d40f65196f57c" + integrity sha1-z9AeD7uj1srtBJ+9dY1A9lGW9Xw= dependencies: underscore "~1.7.0" underscore.string "~2.4.0" +aria-query@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-3.0.0.tgz#65b3fcc1ca1155a8c9ae64d6eee297f15d5133cc" + integrity sha1-ZbP8wcoRVajJrmTW7uKX8V1RM8w= + dependencies: + ast-types-flow "0.0.7" + commander "^2.11.0" + arr-diff@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" @@ -243,39 +1281,37 @@ arr-union@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" -array-differ@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/array-differ/-/array-differ-1.0.0.tgz#eff52e3758249d33be402b8bb8e564bb2b5d4031" - array-equal@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/array-equal/-/array-equal-1.0.0.tgz#8c2a5ef2472fd9ea742b04c77a75093ba2757c93" + integrity sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM= array-filter@~0.0.0: version "0.0.1" resolved "https://registry.yarnpkg.com/array-filter/-/array-filter-0.0.1.tgz#7da8cf2e26628ed732803581fd21f67cacd2eeec" + integrity sha1-fajPLiZijtcygDWB/SH2fKzS7uw= array-find-index@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" +array-includes@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.0.3.tgz#184b48f62d92d7452bb31b323165c7f8bd02266d" + integrity sha1-GEtI9i2S10UrsxsyMWXH+L0CJm0= + dependencies: + define-properties "^1.1.2" + es-abstract "^1.7.0" + array-map@~0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/array-map/-/array-map-0.0.0.tgz#88a2bab73d1cf7bcd5c1b118a003f66f665fa662" + integrity sha1-iKK6tz0c97zVwbEYoAP2b2ZfpmI= array-reduce@~0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/array-reduce/-/array-reduce-0.0.0.tgz#173899d3ffd1c7d9383e4479525dbe278cab5f2b" - -array-union@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" - dependencies: - array-uniq "^1.0.1" - -array-uniq@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" + integrity sha1-FziZ0//Rx9k4PkR5Ul2+J4yrXys= array-unique@^0.2.1: version "0.2.1" @@ -319,29 +1355,41 @@ assert@^1.1.1: dependencies: util "0.10.3" -assert@~1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/assert/-/assert-1.3.0.tgz#03939a622582a812cc202320a0b9a56c9b815849" +assert@^1.4.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/assert/-/assert-1.5.0.tgz#55c109aaf6e0aefdb3dc4b71240c70bf574b18eb" + integrity sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA== dependencies: + object-assign "^4.1.1" util "0.10.3" assign-symbols@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" -astw@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/astw/-/astw-2.0.0.tgz#08121ac8288d35611c0ceec663f6cd545604897d" - dependencies: - acorn "^1.0.3" +ast-types-flow@0.0.7, ast-types-flow@^0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.7.tgz#f70b735c6bca1a5c9c22d982c3e39e7feba3bdad" + integrity sha1-9wtzXGvKGlycItmCw+Oef+ujva0= + +astral-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" + integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== async-each@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" -async@1.x, async@^1.4.0, async@^1.4.2: - version "1.5.2" - resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" +async-each@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf" + integrity sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ== + +async-limiter@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.0.tgz#78faed8c3d074ab81f22b4e985d79e8738f720f8" + integrity sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg== async@^2.0.1: version "2.1.4" @@ -355,10 +1403,6 @@ async@^2.1.2: dependencies: lodash "^4.17.10" -async@~0.2.6: - version "0.2.10" - resolved "https://registry.yarnpkg.com/async/-/async-0.2.10.tgz#b6bbe0b0674b9d719708ca38de8c237cb526c3d1" - asynckit@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" @@ -374,17 +1418,7 @@ augment@4.3.0: autolinker@~0.15.0: version "0.15.3" resolved "https://registry.yarnpkg.com/autolinker/-/autolinker-0.15.3.tgz#342417d8f2f3461b14cf09088d5edf8791dc9832" - -autoprefixer@^6.0.2: - version "6.5.1" - resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-6.5.1.tgz#ae759a5221e709f3da17c2d656230e67c43cbb75" - dependencies: - browserslist "~1.4.0" - caniuse-db "^1.0.30000554" - normalize-range "^0.1.2" - num2fraction "^1.2.2" - postcss "^5.2.4" - postcss-value-parser "^3.2.3" + integrity sha1-NCQX2PLzRhsUzwkIjV7fh5HcmDI= autoprefixer@^6.3.1: version "6.7.7" @@ -397,27 +1431,59 @@ autoprefixer@^6.3.1: postcss "^5.2.16" postcss-value-parser "^3.2.3" -aws-sdk@^2.4.2: - version "2.6.8" - resolved "https://registry.yarnpkg.com/aws-sdk/-/aws-sdk-2.6.8.tgz#b43e68c7940c92b15e98e0582f35558a68b7628b" +autoprefixer@^9.4.9: + version "9.6.0" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.6.0.tgz#0111c6bde2ad20c6f17995a33fad7cf6854b4c87" + integrity sha512-kuip9YilBqhirhHEGHaBTZKXL//xxGnzvsD0FtBQa6z+A69qZD6s/BAX9VzDF1i9VKDquTJDQaPLSEhOnL6FvQ== + dependencies: + browserslist "^4.6.1" + caniuse-lite "^1.0.30000971" + chalk "^2.4.2" + normalize-range "^0.1.2" + num2fraction "^1.2.2" + postcss "^7.0.16" + postcss-value-parser "^3.3.1" + +aws-sdk@^2.414.0: + version "2.477.0" + resolved "https://registry.yarnpkg.com/aws-sdk/-/aws-sdk-2.477.0.tgz#6769a9176ba4234be9ed0ae9f0b064a17dccc3d1" + integrity sha512-CdUbQg0tIIydyCa+rUMzS7EuWV6hUQmSp6gWYy/hdsyeh+fpARjpijrerAML1iawsC47TKTgT5lYE97Kf6DTxg== dependencies: buffer "4.9.1" - crypto-browserify "1.0.9" + events "1.1.1" + ieee754 "1.1.8" jmespath "0.15.0" querystring "0.2.0" - sax "1.1.5" + sax "1.2.1" url "0.10.3" - xml2js "0.4.15" - xmlbuilder "2.6.2" + uuid "3.3.2" + xml2js "0.4.19" aws-sign2@~0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f" +aws-sign2@~0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" + integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= + aws4@^1.2.1: version "1.5.0" resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.5.0.tgz#0a29ffb79c31c9e712eeb087e8e7a64b4a56d755" +aws4@^1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.8.0.tgz#f0e003d9ca9e7f59c7a508945d7b2ef9a04a542f" + integrity sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ== + +axobject-query@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-2.0.2.tgz#ea187abe5b9002b377f925d8bf7d1c561adf38f9" + integrity sha512-MCeek8ZH7hKyO1rWUbKNQBbl4l2eY0ntk7OGi+q0RlafrCnfPxC06WZA+uebCfmYp4mNU9jRBP1AhGyf8+W3ww== + dependencies: + ast-types-flow "0.0.7" + babel-cli@^6.4.5: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-cli/-/babel-cli-6.26.0.tgz#502ab54874d7db88ad00b887a06383ce03d002f1" @@ -439,23 +1505,7 @@ babel-cli@^6.4.5: optionalDependencies: chokidar "^1.6.1" -babel-code-frame@^6.16.0: - version "6.16.0" - resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.16.0.tgz#f90e60da0862909d3ce098733b5d3987c97cb8de" - dependencies: - chalk "^1.1.0" - esutils "^2.0.2" - js-tokens "^2.0.0" - -babel-code-frame@^6.20.0: - version "6.20.0" - resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.20.0.tgz#b968f839090f9a8bc6d41938fb96cb84f7387b26" - dependencies: - chalk "^1.1.0" - esutils "^2.0.2" - js-tokens "^2.0.0" - -babel-code-frame@^6.26.0: +babel-code-frame@^6.22.0, babel-code-frame@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" dependencies: @@ -463,32 +1513,6 @@ babel-code-frame@^6.26.0: esutils "^2.0.2" js-tokens "^3.0.2" -babel-core@^6.0.0, babel-core@^6.0.14, babel-core@^6.10.4, babel-core@^6.16.0: - version "6.17.0" - resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.17.0.tgz#6c4576447df479e241e58c807e4bc7da4db7f425" - dependencies: - babel-code-frame "^6.16.0" - babel-generator "^6.17.0" - babel-helpers "^6.16.0" - babel-messages "^6.8.0" - babel-register "^6.16.0" - babel-runtime "^6.9.1" - babel-template "^6.16.0" - babel-traverse "^6.16.0" - babel-types "^6.16.0" - babylon "^6.11.0" - convert-source-map "^1.1.0" - debug "^2.1.1" - json5 "^0.4.0" - lodash "^4.2.0" - minimatch "^3.0.2" - path-exists "^1.0.0" - path-is-absolute "^1.0.0" - private "^0.1.6" - shebang-regex "^1.0.0" - slash "^1.0.0" - source-map "^0.5.0" - babel-core@^6.26.0, babel-core@^6.4.5: version "6.26.3" resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.3.tgz#b2e2f09e342d0f0c88e2f02e067794125e75c207" @@ -513,26 +1537,22 @@ babel-core@^6.26.0, babel-core@^6.4.5: slash "^1.0.0" source-map "^0.5.7" -babel-eslint@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-7.0.0.tgz#54e51b4033f54ac81326ecea4c646a779935196d" - dependencies: - babel-traverse "^6.15.0" - babel-types "^6.15.0" - babylon "^6.11.2" - lodash.pickby "^4.6.0" +babel-core@^7.0.0-bridge.0: + version "7.0.0-bridge.0" + resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-7.0.0-bridge.0.tgz#95a492ddd90f9b4e9a4a1da14eb335b87b634ece" + integrity sha512-poPX9mZH/5CSanm50Q+1toVci6pv5KSRv/5TWCwtzQS5XEwn40BcCrgIeMFWP9CKKIniKXNxoIOnOq4VVlGXhg== -babel-generator@^6.11.3, babel-generator@^6.17.0: - version "6.17.0" - resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.17.0.tgz#b894e3808beef7800f2550635bfe024b6226cf33" +babel-eslint@^10.0.1: + version "10.0.2" + resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-10.0.2.tgz#182d5ac204579ff0881684b040560fdcc1558456" + integrity sha512-UdsurWPtgiPgpJ06ryUnuaSXC2s0WoSZnQmEpbAH65XZSdwowgN5MvyP7e88nW07FYXv72erVtpBkxyDVKhH1Q== dependencies: - babel-messages "^6.8.0" - babel-runtime "^6.9.0" - babel-types "^6.16.0" - detect-indent "^3.0.1" - jsesc "^1.3.0" - lodash "^4.2.0" - source-map "^0.5.0" + "@babel/code-frame" "^7.0.0" + "@babel/parser" "^7.0.0" + "@babel/traverse" "^7.0.0" + "@babel/types" "^7.0.0" + eslint-scope "3.7.1" + eslint-visitor-keys "^1.0.0" babel-generator@^6.26.0: version "6.26.1" @@ -555,14 +1575,6 @@ babel-helper-bindify-decorators@^6.24.1: babel-traverse "^6.24.1" babel-types "^6.24.1" -babel-helper-bindify-decorators@^6.8.0: - version "6.8.0" - resolved "https://registry.yarnpkg.com/babel-helper-bindify-decorators/-/babel-helper-bindify-decorators-6.8.0.tgz#b34805a30b1433cc0042f7054f88a7133c144909" - dependencies: - babel-runtime "^6.0.0" - babel-traverse "^6.8.0" - babel-types "^6.8.0" - babel-helper-builder-binary-assignment-operator-visitor@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz#cce4517ada356f4220bcae8a02c2b346f9a56664" @@ -571,14 +1583,6 @@ babel-helper-builder-binary-assignment-operator-visitor@^6.24.1: babel-runtime "^6.22.0" babel-types "^6.24.1" -babel-helper-builder-binary-assignment-operator-visitor@^6.8.0: - version "6.15.0" - resolved "https://registry.yarnpkg.com/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.15.0.tgz#39e9ee143f797b642262e4646c681c32089ef1ab" - dependencies: - babel-helper-explode-assignable-expression "^6.8.0" - babel-runtime "^6.0.0" - babel-types "^6.15.0" - babel-helper-builder-react-jsx@^6.24.1: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-helper-builder-react-jsx/-/babel-helper-builder-react-jsx-6.26.0.tgz#39ff8313b75c8b65dceff1f31d383e0ff2a408a0" @@ -587,24 +1591,6 @@ babel-helper-builder-react-jsx@^6.24.1: babel-types "^6.26.0" esutils "^2.0.2" -babel-helper-builder-react-jsx@^6.8.0: - version "6.9.0" - resolved "https://registry.yarnpkg.com/babel-helper-builder-react-jsx/-/babel-helper-builder-react-jsx-6.9.0.tgz#a633978d669c4c9dcad716cc577ee3e0bb8ae723" - dependencies: - babel-runtime "^6.9.0" - babel-types "^6.9.0" - esutils "^2.0.0" - lodash "^4.2.0" - -babel-helper-call-delegate@^6.18.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.18.0.tgz#05b14aafa430884b034097ef29e9f067ea4133bd" - dependencies: - babel-helper-hoist-variables "^6.18.0" - babel-runtime "^6.0.0" - babel-traverse "^6.18.0" - babel-types "^6.18.0" - babel-helper-call-delegate@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz#ece6aacddc76e41c3461f88bfc575bd0daa2df8d" @@ -614,15 +1600,6 @@ babel-helper-call-delegate@^6.24.1: babel-traverse "^6.24.1" babel-types "^6.24.1" -babel-helper-define-map@^6.18.0, babel-helper-define-map@^6.8.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.18.0.tgz#8d6c85dc7fbb4c19be3de40474d18e97c3676ec2" - dependencies: - babel-helper-function-name "^6.18.0" - babel-runtime "^6.9.0" - babel-types "^6.18.0" - lodash "^4.2.0" - babel-helper-define-map@^6.24.1: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz#a5f56dab41a25f97ecb498c7ebaca9819f95be5f" @@ -640,14 +1617,6 @@ babel-helper-explode-assignable-expression@^6.24.1: babel-traverse "^6.24.1" babel-types "^6.24.1" -babel-helper-explode-assignable-expression@^6.8.0: - version "6.8.0" - resolved "https://registry.yarnpkg.com/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.8.0.tgz#9b3525e05b761c3b88919d730a28bad1967e6556" - dependencies: - babel-runtime "^6.0.0" - babel-traverse "^6.8.0" - babel-types "^6.8.0" - babel-helper-explode-class@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-helper-explode-class/-/babel-helper-explode-class-6.24.1.tgz#7dc2a3910dee007056e1e31d640ced3d54eaa9eb" @@ -657,25 +1626,6 @@ babel-helper-explode-class@^6.24.1: babel-traverse "^6.24.1" babel-types "^6.24.1" -babel-helper-explode-class@^6.8.0: - version "6.8.0" - resolved "https://registry.yarnpkg.com/babel-helper-explode-class/-/babel-helper-explode-class-6.8.0.tgz#196a228cc69ea57308695e4ebd1a36cf3f8eca3d" - dependencies: - babel-helper-bindify-decorators "^6.8.0" - babel-runtime "^6.0.0" - babel-traverse "^6.8.0" - babel-types "^6.8.0" - -babel-helper-function-name@^6.18.0, babel-helper-function-name@^6.8.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.18.0.tgz#68ec71aeba1f3e28b2a6f0730190b754a9bf30e6" - dependencies: - babel-helper-get-function-arity "^6.18.0" - babel-runtime "^6.0.0" - babel-template "^6.8.0" - babel-traverse "^6.18.0" - babel-types "^6.18.0" - babel-helper-function-name@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz#d3475b8c03ed98242a25b48351ab18399d3580a9" @@ -686,13 +1636,6 @@ babel-helper-function-name@^6.24.1: babel-traverse "^6.24.1" babel-types "^6.24.1" -babel-helper-get-function-arity@^6.18.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.18.0.tgz#a5b19695fd3f9cdfc328398b47dafcd7094f9f24" - dependencies: - babel-runtime "^6.0.0" - babel-types "^6.18.0" - babel-helper-get-function-arity@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz#8f7782aa93407c41d3aa50908f89b031b1b6853d" @@ -700,13 +1643,6 @@ babel-helper-get-function-arity@^6.24.1: babel-runtime "^6.22.0" babel-types "^6.24.1" -babel-helper-hoist-variables@^6.18.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.18.0.tgz#a835b5ab8b46d6de9babefae4d98ea41e866b82a" - dependencies: - babel-runtime "^6.0.0" - babel-types "^6.18.0" - babel-helper-hoist-variables@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz#1ecb27689c9d25513eadbc9914a73f5408be7a76" @@ -714,13 +1650,6 @@ babel-helper-hoist-variables@^6.24.1: babel-runtime "^6.22.0" babel-types "^6.24.1" -babel-helper-optimise-call-expression@^6.18.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.18.0.tgz#9261d0299ee1a4f08a6dd28b7b7c777348fd8f0f" - dependencies: - babel-runtime "^6.0.0" - babel-types "^6.18.0" - babel-helper-optimise-call-expression@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz#f7a13427ba9f73f8f4fa993c54a97882d1244257" @@ -736,24 +1665,6 @@ babel-helper-regex@^6.24.1: babel-types "^6.26.0" lodash "^4.17.4" -babel-helper-regex@^6.8.0: - version "6.9.0" - resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.9.0.tgz#c74265fde180ff9a16735fee05e63cadb9e0b057" - dependencies: - babel-runtime "^6.9.0" - babel-types "^6.9.0" - lodash "^4.2.0" - -babel-helper-remap-async-to-generator@^6.16.0, babel-helper-remap-async-to-generator@^6.16.2: - version "6.16.2" - resolved "https://registry.yarnpkg.com/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.16.2.tgz#24315bde8326c60022dc053cce84cfe38d724b82" - dependencies: - babel-helper-function-name "^6.8.0" - babel-runtime "^6.0.0" - babel-template "^6.16.0" - babel-traverse "^6.16.0" - babel-types "^6.16.0" - babel-helper-remap-async-to-generator@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz#5ec581827ad723fecdd381f1c928390676e4551b" @@ -764,17 +1675,6 @@ babel-helper-remap-async-to-generator@^6.24.1: babel-traverse "^6.24.1" babel-types "^6.24.1" -babel-helper-replace-supers@^6.18.0, babel-helper-replace-supers@^6.8.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.18.0.tgz#28ec69877be4144dbd64f4cc3a337e89f29a924e" - dependencies: - babel-helper-optimise-call-expression "^6.18.0" - babel-messages "^6.8.0" - babel-runtime "^6.0.0" - babel-template "^6.16.0" - babel-traverse "^6.18.0" - babel-types "^6.18.0" - babel-helper-replace-supers@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz#bf6dbfe43938d17369a213ca8a8bf74b6a90ab1a" @@ -786,13 +1686,6 @@ babel-helper-replace-supers@^6.24.1: babel-traverse "^6.24.1" babel-types "^6.24.1" -babel-helpers@^6.16.0: - version "6.16.0" - resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.16.0.tgz#1095ec10d99279460553e67eb3eee9973d3867e3" - dependencies: - babel-runtime "^6.0.0" - babel-template "^6.16.0" - babel-helpers@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2" @@ -800,13 +1693,18 @@ babel-helpers@^6.24.1: babel-runtime "^6.22.0" babel-template "^6.24.1" -babel-jest@^17.0.2: - version "17.0.2" - resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-17.0.2.tgz#8d51e0d03759713c331f108eb0b2eaa4c6efff74" +babel-jest@^24.1.0, babel-jest@^24.8.0: + version "24.8.0" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-24.8.0.tgz#5c15ff2b28e20b0f45df43fe6b7f2aae93dba589" + integrity sha512-+5/kaZt4I9efoXzPlZASyK/lN9qdRKmmUav9smVc0ruPQD7IsfucQ87gpOE8mn2jbDuS6M/YOW6n3v9ZoIfgnw== dependencies: - babel-core "^6.0.0" - babel-plugin-istanbul "^2.0.0" - babel-preset-jest "^17.0.2" + "@jest/transform" "^24.8.0" + "@jest/types" "^24.8.0" + "@types/babel__core" "^7.1.0" + babel-plugin-istanbul "^5.1.0" + babel-preset-jest "^24.6.0" + chalk "^2.4.2" + slash "^2.0.0" babel-loader@^6.2.1: version "6.4.1" @@ -823,15 +1721,12 @@ babel-messages@^6.23.0: dependencies: babel-runtime "^6.22.0" -babel-messages@^6.8.0: - version "6.8.0" - resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.8.0.tgz#bf504736ca967e6d65ef0adb5a2a5f947c8e0eb9" - dependencies: - babel-runtime "^6.0.0" - -babel-plugin-add-module-exports@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/babel-plugin-add-module-exports/-/babel-plugin-add-module-exports-0.2.1.tgz#9ae9a1f4a8dc67f0cdec4f4aeda1e43a5ff65e25" +babel-plugin-add-module-exports@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/babel-plugin-add-module-exports/-/babel-plugin-add-module-exports-1.0.2.tgz#96cd610d089af664f016467fc4567c099cce2d9c" + integrity sha512-4paN7RivvU3Rzju1vGSHWPjO8Y0rI6droWvSFKI6dvEQ4mvoV0zGojnlzVRfI6N8zISo6VERXt3coIuVmzuvNg== + optionalDependencies: + chokidar "^2.0.4" babel-plugin-check-es2015-constants@^6.22.0: version "6.22.0" @@ -839,24 +1734,37 @@ babel-plugin-check-es2015-constants@^6.22.0: dependencies: babel-runtime "^6.22.0" -babel-plugin-check-es2015-constants@^6.3.13: - version "6.8.0" - resolved "https://registry.yarnpkg.com/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.8.0.tgz#dbf024c32ed37bfda8dee1e76da02386a8d26fe7" +babel-plugin-istanbul@^5.1.0: + version "5.1.4" + resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-5.1.4.tgz#841d16b9a58eeb407a0ddce622ba02fe87a752ba" + integrity sha512-dySz4VJMH+dpndj0wjJ8JPs/7i1TdSPb1nRrn56/92pKOF9VKC1FMFJmMXjzlGGusnCAqujP6PBCiKq0sVA+YQ== dependencies: - babel-runtime "^6.0.0" + find-up "^3.0.0" + istanbul-lib-instrument "^3.3.0" + test-exclude "^5.2.3" -babel-plugin-istanbul@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-2.0.2.tgz#66c957fd3b2ace69215955c0ea5920980958cbf3" +babel-plugin-jest-hoist@^24.6.0: + version "24.6.0" + resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-24.6.0.tgz#f7f7f7ad150ee96d7a5e8e2c5da8319579e78019" + integrity sha512-3pKNH6hMt9SbOv0F3WVmy5CWQ4uogS3k0GY5XLyQHJ9EGpAT9XWkFd2ZiXXtkwFHdAHa5j7w7kfxSP5lAIwu7w== + dependencies: + "@types/babel__traverse" "^7.0.6" + +babel-plugin-lodash@^3.3.4: + version "3.3.4" + resolved "https://registry.yarnpkg.com/babel-plugin-lodash/-/babel-plugin-lodash-3.3.4.tgz#4f6844358a1340baed182adbeffa8df9967bc196" + integrity sha512-yDZLjK7TCkWl1gpBeBGmuaDIFhZKmkoL+Cu2MUUjv5VxUZx/z7tBGBCBcQs5RI1Bkz5LLmNdjx7paOyQtMovyg== dependencies: - find-up "^1.1.2" - istanbul-lib-instrument "^1.1.1" - lodash.assign "^4.2.0" - test-exclude "^2.1.1" + "@babel/helper-module-imports" "^7.0.0-beta.49" + "@babel/types" "^7.0.0-beta.49" + glob "^7.1.1" + lodash "^4.17.10" + require-package-name "^2.0.1" -babel-plugin-jest-hoist@^17.0.2: - version "17.0.2" - resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-17.0.2.tgz#213488ce825990acd4c30f887dca09fffeb45235" +babel-plugin-react-require@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/babel-plugin-react-require/-/babel-plugin-react-require-3.1.1.tgz#5c3d2564fa16b1e45212ed52519db147b1596106" + integrity sha512-XFz+B0dWx41fnGnugzCWn5rOgrDHb150N5gFhUfO3BgYDCT25o4sofRtd9uUfqUHoRu+t4/r5Cr2RMPIKuCt2g== babel-plugin-syntax-async-functions@^6.8.0: version "6.13.0" @@ -882,7 +1790,7 @@ babel-plugin-syntax-exponentiation-operator@^6.8.0: version "6.13.0" resolved "https://registry.yarnpkg.com/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz#9ee7e8337290da95288201a6a57f4170317830de" -babel-plugin-syntax-flow@^6.18.0, babel-plugin-syntax-flow@^6.3.13: +babel-plugin-syntax-flow@^6.18.0: version "6.18.0" resolved "https://registry.yarnpkg.com/babel-plugin-syntax-flow/-/babel-plugin-syntax-flow-6.18.0.tgz#4c3ab20a2af26aa20cd25995c398c4eb70310c8d" @@ -894,22 +1802,10 @@ babel-plugin-syntax-object-rest-spread@^6.8.0: version "6.13.0" resolved "https://registry.yarnpkg.com/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz#fd6536f2bce13836ffa3a5458c4903a597bb3bf5" -babel-plugin-syntax-trailing-function-commas@^6.13.0, babel-plugin-syntax-trailing-function-commas@^6.3.13: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.13.0.tgz#2b84b7d53dd744f94ff1fad7669406274b23f541" - babel-plugin-syntax-trailing-function-commas@^6.22.0: version "6.22.0" resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz#ba0360937f8d06e40180a43fe0d5616fff532cf3" -babel-plugin-transform-async-generator-functions@^6.17.0: - version "6.17.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-generator-functions/-/babel-plugin-transform-async-generator-functions-6.17.0.tgz#d0b5a2b2f0940f2b245fa20a00519ed7bc6cae54" - dependencies: - babel-helper-remap-async-to-generator "^6.16.2" - babel-plugin-syntax-async-generators "^6.5.0" - babel-runtime "^6.0.0" - babel-plugin-transform-async-generator-functions@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-generator-functions/-/babel-plugin-transform-async-generator-functions-6.24.1.tgz#f058900145fd3e9907a6ddf28da59f215258a5db" @@ -918,14 +1814,6 @@ babel-plugin-transform-async-generator-functions@^6.24.1: babel-plugin-syntax-async-generators "^6.5.0" babel-runtime "^6.22.0" -babel-plugin-transform-async-to-generator@^6.16.0, babel-plugin-transform-async-to-generator@^6.8.0: - version "6.16.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.16.0.tgz#19ec36cb1486b59f9f468adfa42ce13908ca2999" - dependencies: - babel-helper-remap-async-to-generator "^6.16.0" - babel-plugin-syntax-async-functions "^6.8.0" - babel-runtime "^6.0.0" - babel-plugin-transform-async-to-generator@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz#6536e378aff6cb1d5517ac0e40eb3e9fc8d08761" @@ -934,15 +1822,6 @@ babel-plugin-transform-async-to-generator@^6.24.1: babel-plugin-syntax-async-functions "^6.8.0" babel-runtime "^6.22.0" -babel-plugin-transform-class-properties@^6.18.0: - version "6.19.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.19.0.tgz#1274b349abaadc835164e2004f4a2444a2788d5f" - dependencies: - babel-helper-function-name "^6.18.0" - babel-plugin-syntax-class-properties "^6.8.0" - babel-runtime "^6.9.1" - babel-template "^6.15.0" - babel-plugin-transform-class-properties@^6.24.1, babel-plugin-transform-class-properties@^6.4.0: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.24.1.tgz#6a79763ea61d33d36f37b611aa9def81a81b46ac" @@ -960,17 +1839,6 @@ babel-plugin-transform-decorators-legacy@^1.3.4: babel-runtime "^6.2.0" babel-template "^6.3.0" -babel-plugin-transform-decorators@^6.13.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-decorators/-/babel-plugin-transform-decorators-6.13.0.tgz#82d65c1470ae83e2d13eebecb0a1c2476d62da9d" - dependencies: - babel-helper-define-map "^6.8.0" - babel-helper-explode-class "^6.8.0" - babel-plugin-syntax-decorators "^6.13.0" - babel-runtime "^6.0.0" - babel-template "^6.8.0" - babel-types "^6.13.0" - babel-plugin-transform-decorators@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-decorators/-/babel-plugin-transform-decorators-6.24.1.tgz#788013d8f8c6b5222bdf7b344390dfd77569e24d" @@ -987,24 +1855,12 @@ babel-plugin-transform-es2015-arrow-functions@^6.22.0: dependencies: babel-runtime "^6.22.0" -babel-plugin-transform-es2015-arrow-functions@^6.3.13: - version "6.8.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.8.0.tgz#5b63afc3181bdc9a8c4d481b5a4f3f7d7fef3d9d" - dependencies: - babel-runtime "^6.0.0" - babel-plugin-transform-es2015-block-scoped-functions@^6.22.0: version "6.22.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz#bbc51b49f964d70cb8d8e0b94e820246ce3a6141" dependencies: babel-runtime "^6.22.0" -babel-plugin-transform-es2015-block-scoped-functions@^6.3.13: - version "6.8.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.8.0.tgz#ed95d629c4b5a71ae29682b998f70d9833eb366d" - dependencies: - babel-runtime "^6.0.0" - babel-plugin-transform-es2015-block-scoping@^6.24.1: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz#d70f5299c1308d05c12f463813b0a09e73b1895f" @@ -1015,16 +1871,6 @@ babel-plugin-transform-es2015-block-scoping@^6.24.1: babel-types "^6.26.0" lodash "^4.17.4" -babel-plugin-transform-es2015-block-scoping@^6.6.0: - version "6.21.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.21.0.tgz#e840687f922e70fb2c42bb13501838c174a115ed" - dependencies: - babel-runtime "^6.20.0" - babel-template "^6.15.0" - babel-traverse "^6.21.0" - babel-types "^6.21.0" - lodash "^4.2.0" - babel-plugin-transform-es2015-classes@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz#5a4c58a50c9c9461e564b4b2a3bfabc97a2584db" @@ -1039,20 +1885,6 @@ babel-plugin-transform-es2015-classes@^6.24.1: babel-traverse "^6.24.1" babel-types "^6.24.1" -babel-plugin-transform-es2015-classes@^6.6.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.18.0.tgz#ffe7a17321bf83e494dcda0ae3fc72df48ffd1d9" - dependencies: - babel-helper-define-map "^6.18.0" - babel-helper-function-name "^6.18.0" - babel-helper-optimise-call-expression "^6.18.0" - babel-helper-replace-supers "^6.18.0" - babel-messages "^6.8.0" - babel-runtime "^6.9.0" - babel-template "^6.14.0" - babel-traverse "^6.18.0" - babel-types "^6.18.0" - babel-plugin-transform-es2015-computed-properties@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz#6fe2a8d16895d5634f4cd999b6d3480a308159b3" @@ -1060,26 +1892,12 @@ babel-plugin-transform-es2015-computed-properties@^6.24.1: babel-runtime "^6.22.0" babel-template "^6.24.1" -babel-plugin-transform-es2015-computed-properties@^6.3.13: - version "6.8.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.8.0.tgz#f51010fd61b3bd7b6b60a5fdfd307bb7a5279870" - dependencies: - babel-helper-define-map "^6.8.0" - babel-runtime "^6.0.0" - babel-template "^6.8.0" - babel-plugin-transform-es2015-destructuring@^6.22.0: version "6.23.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz#997bb1f1ab967f682d2b0876fe358d60e765c56d" dependencies: babel-runtime "^6.22.0" -babel-plugin-transform-es2015-destructuring@^6.6.0: - version "6.19.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.19.0.tgz#ff1d911c4b3f4cab621bd66702a869acd1900533" - dependencies: - babel-runtime "^6.9.0" - babel-plugin-transform-es2015-duplicate-keys@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz#73eb3d310ca969e3ef9ec91c53741a6f1576423e" @@ -1087,25 +1905,12 @@ babel-plugin-transform-es2015-duplicate-keys@^6.24.1: babel-runtime "^6.22.0" babel-types "^6.24.1" -babel-plugin-transform-es2015-duplicate-keys@^6.6.0: - version "6.8.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.8.0.tgz#fd8f7f7171fc108cc1c70c3164b9f15a81c25f7d" - dependencies: - babel-runtime "^6.0.0" - babel-types "^6.8.0" - babel-plugin-transform-es2015-for-of@^6.22.0: version "6.23.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz#f47c95b2b613df1d3ecc2fdb7573623c75248691" dependencies: babel-runtime "^6.22.0" -babel-plugin-transform-es2015-for-of@^6.6.0: - version "6.8.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.8.0.tgz#82eda139ba4270dda135c3ec1b1f2813fa62f23c" - dependencies: - babel-runtime "^6.0.0" - babel-plugin-transform-es2015-function-name@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz#834c89853bc36b1af0f3a4c5dbaa94fd8eacaa8b" @@ -1114,26 +1919,12 @@ babel-plugin-transform-es2015-function-name@^6.24.1: babel-runtime "^6.22.0" babel-types "^6.24.1" -babel-plugin-transform-es2015-function-name@^6.3.13: - version "6.9.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.9.0.tgz#8c135b17dbd064e5bba56ec511baaee2fca82719" - dependencies: - babel-helper-function-name "^6.8.0" - babel-runtime "^6.9.0" - babel-types "^6.9.0" - babel-plugin-transform-es2015-literals@^6.22.0: version "6.22.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz#4f54a02d6cd66cf915280019a31d31925377ca2e" dependencies: babel-runtime "^6.22.0" -babel-plugin-transform-es2015-literals@^6.3.13: - version "6.8.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.8.0.tgz#50aa2e5c7958fc2ab25d74ec117e0cc98f046468" - dependencies: - babel-runtime "^6.0.0" - babel-plugin-transform-es2015-modules-amd@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz#3b3e54017239842d6d19c3011c4bd2f00a00d154" @@ -1142,14 +1933,6 @@ babel-plugin-transform-es2015-modules-amd@^6.24.1: babel-runtime "^6.22.0" babel-template "^6.24.1" -babel-plugin-transform-es2015-modules-amd@^6.8.0: - version "6.8.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.8.0.tgz#25d954aa0bf04031fc46d2a8e6230bb1abbde4a3" - dependencies: - babel-plugin-transform-es2015-modules-commonjs "^6.8.0" - babel-runtime "^6.0.0" - babel-template "^6.8.0" - babel-plugin-transform-es2015-modules-commonjs@^6.24.1: version "6.26.2" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz#58a793863a9e7ca870bdc5a881117ffac27db6f3" @@ -1159,23 +1942,6 @@ babel-plugin-transform-es2015-modules-commonjs@^6.24.1: babel-template "^6.26.0" babel-types "^6.26.0" -babel-plugin-transform-es2015-modules-commonjs@^6.6.0, babel-plugin-transform-es2015-modules-commonjs@^6.8.0: - version "6.16.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.16.0.tgz#0a34b447bc88ad1a70988b6d199cca6d0b96c892" - dependencies: - babel-plugin-transform-strict-mode "^6.8.0" - babel-runtime "^6.0.0" - babel-template "^6.16.0" - babel-types "^6.16.0" - -babel-plugin-transform-es2015-modules-systemjs@^6.12.0: - version "6.19.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.19.0.tgz#50438136eba74527efa00a5b0fefaf1dc4071da6" - dependencies: - babel-helper-hoist-variables "^6.18.0" - babel-runtime "^6.11.6" - babel-template "^6.14.0" - babel-plugin-transform-es2015-modules-systemjs@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz#ff89a142b9119a906195f5f106ecf305d9407d23" @@ -1184,14 +1950,6 @@ babel-plugin-transform-es2015-modules-systemjs@^6.24.1: babel-runtime "^6.22.0" babel-template "^6.24.1" -babel-plugin-transform-es2015-modules-umd@^6.12.0: - version "6.12.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.12.0.tgz#5d73559eb49266775ed281c40be88a421bd371a3" - dependencies: - babel-plugin-transform-es2015-modules-amd "^6.8.0" - babel-runtime "^6.0.0" - babel-template "^6.8.0" - babel-plugin-transform-es2015-modules-umd@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz#ac997e6285cd18ed6176adb607d602344ad38468" @@ -1207,13 +1965,6 @@ babel-plugin-transform-es2015-object-super@^6.24.1: babel-helper-replace-supers "^6.24.1" babel-runtime "^6.22.0" -babel-plugin-transform-es2015-object-super@^6.3.13: - version "6.8.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.8.0.tgz#1b858740a5a4400887c23dcff6f4d56eea4a24c5" - dependencies: - babel-helper-replace-supers "^6.8.0" - babel-runtime "^6.0.0" - babel-plugin-transform-es2015-parameters@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz#57ac351ab49caf14a97cd13b09f66fdf0a625f2b" @@ -1225,17 +1976,6 @@ babel-plugin-transform-es2015-parameters@^6.24.1: babel-traverse "^6.24.1" babel-types "^6.24.1" -babel-plugin-transform-es2015-parameters@^6.6.0: - version "6.21.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.21.0.tgz#46a655e6864ef984091448cdf024d87b60b2a7d8" - dependencies: - babel-helper-call-delegate "^6.18.0" - babel-helper-get-function-arity "^6.18.0" - babel-runtime "^6.9.0" - babel-template "^6.16.0" - babel-traverse "^6.21.0" - babel-types "^6.21.0" - babel-plugin-transform-es2015-shorthand-properties@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz#24f875d6721c87661bbd99a4622e51f14de38aa0" @@ -1243,25 +1983,12 @@ babel-plugin-transform-es2015-shorthand-properties@^6.24.1: babel-runtime "^6.22.0" babel-types "^6.24.1" -babel-plugin-transform-es2015-shorthand-properties@^6.3.13: - version "6.8.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.8.0.tgz#f0a4c5fd471630acf333c2d99c3d677bf0952149" - dependencies: - babel-runtime "^6.0.0" - babel-types "^6.8.0" - babel-plugin-transform-es2015-spread@^6.22.0: version "6.22.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz#d6d68a99f89aedc4536c81a542e8dd9f1746f8d1" dependencies: babel-runtime "^6.22.0" -babel-plugin-transform-es2015-spread@^6.3.13: - version "6.8.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.8.0.tgz#0217f737e3b821fa5a669f187c6ed59205f05e9c" - dependencies: - babel-runtime "^6.0.0" - babel-plugin-transform-es2015-sticky-regex@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz#00c1cdb1aca71112cdf0cf6126c2ed6b457ccdbc" @@ -1270,38 +1997,18 @@ babel-plugin-transform-es2015-sticky-regex@^6.24.1: babel-runtime "^6.22.0" babel-types "^6.24.1" -babel-plugin-transform-es2015-sticky-regex@^6.3.13: - version "6.8.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.8.0.tgz#e73d300a440a35d5c64f5c2a344dc236e3df47be" - dependencies: - babel-helper-regex "^6.8.0" - babel-runtime "^6.0.0" - babel-types "^6.8.0" - babel-plugin-transform-es2015-template-literals@^6.22.0: version "6.22.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz#a84b3450f7e9f8f1f6839d6d687da84bb1236d8d" dependencies: babel-runtime "^6.22.0" -babel-plugin-transform-es2015-template-literals@^6.6.0: - version "6.8.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.8.0.tgz#86eb876d0a2c635da4ec048b4f7de9dfc897e66b" - dependencies: - babel-runtime "^6.0.0" - babel-plugin-transform-es2015-typeof-symbol@^6.22.0: version "6.23.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz#dec09f1cddff94b52ac73d505c84df59dcceb372" dependencies: babel-runtime "^6.22.0" -babel-plugin-transform-es2015-typeof-symbol@^6.6.0: - version "6.8.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.8.0.tgz#84c29eb1219372480955a020fef7a65c44f30533" - dependencies: - babel-runtime "^6.0.0" - babel-plugin-transform-es2015-unicode-regex@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz#d38b12f42ea7323f729387f18a7c5ae1faeb35e9" @@ -1310,14 +2017,6 @@ babel-plugin-transform-es2015-unicode-regex@^6.24.1: babel-runtime "^6.22.0" regexpu-core "^2.0.0" -babel-plugin-transform-es2015-unicode-regex@^6.3.13: - version "6.11.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.11.0.tgz#6298ceabaad88d50a3f4f392d8de997260f6ef2c" - dependencies: - babel-helper-regex "^6.8.0" - babel-runtime "^6.0.0" - regexpu-core "^2.0.0" - babel-plugin-transform-exponentiation-operator@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz#2ab0c9c7f3098fa48907772bb813fe41e8de3a0e" @@ -1326,21 +2025,6 @@ babel-plugin-transform-exponentiation-operator@^6.24.1: babel-plugin-syntax-exponentiation-operator "^6.8.0" babel-runtime "^6.22.0" -babel-plugin-transform-exponentiation-operator@^6.3.13, babel-plugin-transform-exponentiation-operator@^6.8.0: - version "6.8.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.8.0.tgz#db25742e9339eade676ca9acec46f955599a68a4" - dependencies: - babel-helper-builder-binary-assignment-operator-visitor "^6.8.0" - babel-plugin-syntax-exponentiation-operator "^6.8.0" - babel-runtime "^6.0.0" - -babel-plugin-transform-flow-strip-types@^6.18.0, babel-plugin-transform-flow-strip-types@^6.3.13: - version "6.21.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-flow-strip-types/-/babel-plugin-transform-flow-strip-types-6.21.0.tgz#2eea3f8b5bb234339b47283feac155cfb237b948" - dependencies: - babel-plugin-syntax-flow "^6.18.0" - babel-runtime "^6.0.0" - babel-plugin-transform-flow-strip-types@^6.22.0: version "6.22.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-flow-strip-types/-/babel-plugin-transform-flow-strip-types-6.22.0.tgz#84cb672935d43714fdc32bce84568d87441cf7cf" @@ -1348,13 +2032,6 @@ babel-plugin-transform-flow-strip-types@^6.22.0: babel-plugin-syntax-flow "^6.18.0" babel-runtime "^6.22.0" -babel-plugin-transform-object-rest-spread@^6.16.0: - version "6.16.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.16.0.tgz#db441d56fffc1999052fdebe2e2f25ebd28e36a9" - dependencies: - babel-plugin-syntax-object-rest-spread "^6.8.0" - babel-runtime "^6.0.0" - babel-plugin-transform-object-rest-spread@^6.22.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz#0f36692d50fef6b7e2d4b3ac1478137a963b7b06" @@ -1368,19 +2045,6 @@ babel-plugin-transform-react-display-name@^6.23.0: dependencies: babel-runtime "^6.22.0" -babel-plugin-transform-react-display-name@^6.3.13: - version "6.8.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-display-name/-/babel-plugin-transform-react-display-name-6.8.0.tgz#f7a084977383d728bdbdc2835bba0159577f660e" - dependencies: - babel-runtime "^6.0.0" - -babel-plugin-transform-react-jsx-self@^6.11.0: - version "6.11.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-jsx-self/-/babel-plugin-transform-react-jsx-self-6.11.0.tgz#605c9450c1429f97a930f7e1dfe3f0d9d0dbd0f4" - dependencies: - babel-plugin-syntax-jsx "^6.8.0" - babel-runtime "^6.9.0" - babel-plugin-transform-react-jsx-self@^6.22.0: version "6.22.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-jsx-self/-/babel-plugin-transform-react-jsx-self-6.22.0.tgz#df6d80a9da2612a121e6ddd7558bcbecf06e636e" @@ -1395,13 +2059,6 @@ babel-plugin-transform-react-jsx-source@^6.22.0: babel-plugin-syntax-jsx "^6.8.0" babel-runtime "^6.22.0" -babel-plugin-transform-react-jsx-source@^6.3.13: - version "6.9.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-jsx-source/-/babel-plugin-transform-react-jsx-source-6.9.0.tgz#af684a05c2067a86e0957d4f343295ccf5dccf00" - dependencies: - babel-plugin-syntax-jsx "^6.8.0" - babel-runtime "^6.9.0" - babel-plugin-transform-react-jsx@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-jsx/-/babel-plugin-transform-react-jsx-6.24.1.tgz#840a028e7df460dfc3a2d29f0c0d91f6376e66a3" @@ -1410,38 +2067,18 @@ babel-plugin-transform-react-jsx@^6.24.1: babel-plugin-syntax-jsx "^6.8.0" babel-runtime "^6.22.0" -babel-plugin-transform-react-jsx@^6.3.13: - version "6.8.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-jsx/-/babel-plugin-transform-react-jsx-6.8.0.tgz#94759942f70af18c617189aa7f3593f1644a71ab" - dependencies: - babel-helper-builder-react-jsx "^6.8.0" - babel-plugin-syntax-jsx "^6.8.0" - babel-runtime "^6.0.0" - babel-plugin-transform-regenerator@^6.24.1: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz#e0703696fbde27f0a3efcacf8b4dca2f7b3a8f2f" dependencies: regenerator-transform "^0.10.0" -babel-plugin-transform-regenerator@^6.6.0: - version "6.21.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.21.0.tgz#75d0c7e7f84f379358f508451c68a2c5fa5a9703" - dependencies: - regenerator-transform "0.9.8" - babel-plugin-transform-runtime@^6.4.3: version "6.23.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-runtime/-/babel-plugin-transform-runtime-6.23.0.tgz#88490d446502ea9b8e7efb0fe09ec4d99479b1ee" dependencies: babel-runtime "^6.22.0" -babel-plugin-transform-runtime@^6.9.0: - version "6.15.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-runtime/-/babel-plugin-transform-runtime-6.15.0.tgz#3d75b4d949ad81af157570273846fb59aeb0d57c" - dependencies: - babel-runtime "^6.9.0" - babel-plugin-transform-strict-mode@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz#d5faf7aa578a65bbe591cf5edae04a0c67020758" @@ -1449,13 +2086,6 @@ babel-plugin-transform-strict-mode@^6.24.1: babel-runtime "^6.22.0" babel-types "^6.24.1" -babel-plugin-transform-strict-mode@^6.8.0: - version "6.11.3" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.11.3.tgz#183741325126bc7ec9cf4c0fc257d3e7ca5afd40" - dependencies: - babel-runtime "^6.0.0" - babel-types "^6.8.0" - babel-polyfill@^6.16.0: version "6.20.0" resolved "https://registry.yarnpkg.com/babel-polyfill/-/babel-polyfill-6.20.0.tgz#de4a371006139e20990aac0be367d398331204e7" @@ -1472,39 +2102,6 @@ babel-polyfill@^6.26.0: core-js "^2.5.0" regenerator-runtime "^0.10.5" -babel-preset-env@^1.1.0: - version "1.1.4" - resolved "https://registry.yarnpkg.com/babel-preset-env/-/babel-preset-env-1.1.4.tgz#d876f9fcff5fe0612db3dcbc0c87503b41d4873f" - dependencies: - babel-plugin-check-es2015-constants "^6.3.13" - babel-plugin-syntax-trailing-function-commas "^6.13.0" - babel-plugin-transform-async-to-generator "^6.8.0" - babel-plugin-transform-es2015-arrow-functions "^6.3.13" - babel-plugin-transform-es2015-block-scoped-functions "^6.3.13" - babel-plugin-transform-es2015-block-scoping "^6.6.0" - babel-plugin-transform-es2015-classes "^6.6.0" - babel-plugin-transform-es2015-computed-properties "^6.3.13" - babel-plugin-transform-es2015-destructuring "^6.6.0" - babel-plugin-transform-es2015-duplicate-keys "^6.6.0" - babel-plugin-transform-es2015-for-of "^6.6.0" - babel-plugin-transform-es2015-function-name "^6.3.13" - babel-plugin-transform-es2015-literals "^6.3.13" - babel-plugin-transform-es2015-modules-amd "^6.8.0" - babel-plugin-transform-es2015-modules-commonjs "^6.6.0" - babel-plugin-transform-es2015-modules-systemjs "^6.12.0" - babel-plugin-transform-es2015-modules-umd "^6.12.0" - babel-plugin-transform-es2015-object-super "^6.3.13" - babel-plugin-transform-es2015-parameters "^6.6.0" - babel-plugin-transform-es2015-shorthand-properties "^6.3.13" - babel-plugin-transform-es2015-spread "^6.3.13" - babel-plugin-transform-es2015-sticky-regex "^6.3.13" - babel-plugin-transform-es2015-template-literals "^6.6.0" - babel-plugin-transform-es2015-typeof-symbol "^6.6.0" - babel-plugin-transform-es2015-unicode-regex "^6.3.13" - babel-plugin-transform-exponentiation-operator "^6.8.0" - babel-plugin-transform-regenerator "^6.6.0" - browserslist "^1.4.0" - babel-preset-es2015-webpack@^6.3.13: version "6.4.3" resolved "https://registry.yarnpkg.com/babel-preset-es2015-webpack/-/babel-preset-es2015-webpack-6.4.3.tgz#61e3711aea013fa50f500a151fc7989aa6eab20f" @@ -1546,11 +2143,13 @@ babel-preset-flow@^6.23.0: dependencies: babel-plugin-transform-flow-strip-types "^6.22.0" -babel-preset-jest@^17.0.2: - version "17.0.2" - resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-17.0.2.tgz#141e935debe164aaa0364c220d31ccb2176493b2" +babel-preset-jest@^24.6.0: + version "24.6.0" + resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-24.6.0.tgz#66f06136eefce87797539c0d63f1769cc3915984" + integrity sha512-pdZqLEdmy1ZK5kyRUfvBb2IfTPb2BUvIJczlPspS8fWmBQslNNDBqVfh7BW5leOVJMDZKzjD8XEyABTk6gQ5yw== dependencies: - babel-plugin-jest-hoist "^17.0.2" + "@babel/plugin-syntax-object-rest-spread" "^7.0.0" + babel-plugin-jest-hoist "^24.6.0" babel-preset-react@^6.3.13: version "6.24.1" @@ -1563,27 +2162,6 @@ babel-preset-react@^6.3.13: babel-plugin-transform-react-jsx-source "^6.22.0" babel-preset-flow "^6.23.0" -babel-preset-react@^6.5.0: - version "6.16.0" - resolved "https://registry.yarnpkg.com/babel-preset-react/-/babel-preset-react-6.16.0.tgz#aa117d60de0928607e343c4828906e4661824316" - dependencies: - babel-plugin-syntax-flow "^6.3.13" - babel-plugin-syntax-jsx "^6.3.13" - babel-plugin-transform-flow-strip-types "^6.3.13" - babel-plugin-transform-react-display-name "^6.3.13" - babel-plugin-transform-react-jsx "^6.3.13" - babel-plugin-transform-react-jsx-self "^6.11.0" - babel-plugin-transform-react-jsx-source "^6.3.13" - -babel-preset-stage-2@^6.17.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-preset-stage-2/-/babel-preset-stage-2-6.18.0.tgz#9eb7bf9a8e91c68260d5ba7500493caaada4b5b5" - dependencies: - babel-plugin-syntax-dynamic-import "^6.18.0" - babel-plugin-transform-class-properties "^6.18.0" - babel-plugin-transform-decorators "^6.13.0" - babel-preset-stage-3 "^6.17.0" - babel-preset-stage-2@^6.3.13: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-preset-stage-2/-/babel-preset-stage-2-6.24.1.tgz#d9e2960fb3d71187f0e64eec62bc07767219bdc1" @@ -1593,16 +2171,6 @@ babel-preset-stage-2@^6.3.13: babel-plugin-transform-decorators "^6.24.1" babel-preset-stage-3 "^6.24.1" -babel-preset-stage-3@^6.17.0: - version "6.17.0" - resolved "https://registry.yarnpkg.com/babel-preset-stage-3/-/babel-preset-stage-3-6.17.0.tgz#b6638e46db6e91e3f889013d8ce143917c685e39" - dependencies: - babel-plugin-syntax-trailing-function-commas "^6.3.13" - babel-plugin-transform-async-generator-functions "^6.17.0" - babel-plugin-transform-async-to-generator "^6.16.0" - babel-plugin-transform-exponentiation-operator "^6.3.13" - babel-plugin-transform-object-rest-spread "^6.16.0" - babel-preset-stage-3@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-preset-stage-3/-/babel-preset-stage-3-6.24.1.tgz#836ada0a9e7a7fa37cb138fb9326f87934a48395" @@ -1613,19 +2181,6 @@ babel-preset-stage-3@^6.24.1: babel-plugin-transform-exponentiation-operator "^6.24.1" babel-plugin-transform-object-rest-spread "^6.22.0" -babel-register@^6.16.0: - version "6.16.3" - resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.16.3.tgz#7b0c0ca7bfdeb9188ba4c27e5fcb7599a497c624" - dependencies: - babel-core "^6.16.0" - babel-runtime "^6.11.6" - core-js "^2.4.0" - home-or-tmp "^1.0.0" - lodash "^4.2.0" - mkdirp "^0.5.1" - path-exists "^1.0.0" - source-map-support "^0.4.2" - babel-register@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.26.0.tgz#6ed021173e2fcb486d7acb45c6009a856f647071" @@ -1638,13 +2193,6 @@ babel-register@^6.26.0: mkdirp "^0.5.1" source-map-support "^0.4.15" -babel-runtime@^6.0.0, babel-runtime@^6.11.6, babel-runtime@^6.9.0, babel-runtime@^6.9.1: - version "6.11.6" - resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.11.6.tgz#6db707fef2d49c49bfa3cb64efdb436b518b8222" - dependencies: - core-js "^2.4.0" - regenerator-runtime "^0.9.5" - babel-runtime@^6.18.0, babel-runtime@^6.20.0: version "6.20.0" resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.20.0.tgz#87300bdcf4cd770f09bf0048c64204e17806d16f" @@ -1652,23 +2200,13 @@ babel-runtime@^6.18.0, babel-runtime@^6.20.0: core-js "^2.4.0" regenerator-runtime "^0.10.0" -babel-runtime@^6.2.0, babel-runtime@^6.22.0, babel-runtime@^6.26.0: +babel-runtime@^6.2.0, babel-runtime@^6.22.0, babel-runtime@^6.23.0, babel-runtime@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" dependencies: core-js "^2.4.0" regenerator-runtime "^0.11.0" -babel-template@^6.14.0, babel-template@^6.15.0, babel-template@^6.16.0, babel-template@^6.8.0, babel-template@^6.9.0: - version "6.16.0" - resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.16.0.tgz#e149dd1a9f03a35f817ddbc4d0481988e7ebc8ca" - dependencies: - babel-runtime "^6.9.0" - babel-traverse "^6.16.0" - babel-types "^6.16.0" - babylon "^6.11.0" - lodash "^4.2.0" - babel-template@^6.24.1, babel-template@^6.26.0, babel-template@^6.3.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02" @@ -1679,34 +2217,6 @@ babel-template@^6.24.1, babel-template@^6.26.0, babel-template@^6.3.0: babylon "^6.18.0" lodash "^4.17.4" -babel-traverse@^6.15.0, babel-traverse@^6.16.0: - version "6.16.0" - resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.16.0.tgz#fba85ae1fd4d107de9ce003149cc57f53bef0c4f" - dependencies: - babel-code-frame "^6.16.0" - babel-messages "^6.8.0" - babel-runtime "^6.9.0" - babel-types "^6.16.0" - babylon "^6.11.0" - debug "^2.2.0" - globals "^8.3.0" - invariant "^2.2.0" - lodash "^4.2.0" - -babel-traverse@^6.18.0, babel-traverse@^6.21.0, babel-traverse@^6.8.0, babel-traverse@^6.9.0: - version "6.21.0" - resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.21.0.tgz#69c6365804f1a4f69eb1213f85b00a818b8c21ad" - dependencies: - babel-code-frame "^6.20.0" - babel-messages "^6.8.0" - babel-runtime "^6.20.0" - babel-types "^6.21.0" - babylon "^6.11.0" - debug "^2.2.0" - globals "^9.0.0" - invariant "^2.2.0" - lodash "^4.2.0" - babel-traverse@^6.24.1, babel-traverse@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee" @@ -1721,7 +2231,7 @@ babel-traverse@^6.24.1, babel-traverse@^6.26.0: invariant "^2.2.2" lodash "^4.17.4" -babel-types@^6.10.2, babel-types@^6.13.0, babel-types@^6.18.0, babel-types@^6.19.0, babel-types@^6.21.0, babel-types@^6.8.0, babel-types@^6.9.0: +babel-types@^6.19.0: version "6.21.0" resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.21.0.tgz#314b92168891ef6d3806b7f7a917fdf87c11a4b2" dependencies: @@ -1730,15 +2240,6 @@ babel-types@^6.10.2, babel-types@^6.13.0, babel-types@^6.18.0, babel-types@^6.19 lodash "^4.2.0" to-fast-properties "^1.0.1" -babel-types@^6.15.0, babel-types@^6.16.0: - version "6.16.0" - resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.16.0.tgz#71cca1dbe5337766225c5c193071e8ebcbcffcfe" - dependencies: - babel-runtime "^6.9.1" - esutils "^2.0.2" - lodash "^4.2.0" - to-fast-properties "^1.0.1" - babel-types@^6.24.1, babel-types@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497" @@ -1748,29 +2249,15 @@ babel-types@^6.24.1, babel-types@^6.26.0: lodash "^4.17.4" to-fast-properties "^1.0.3" -babelify@^7.3.0: - version "7.3.0" - resolved "https://registry.yarnpkg.com/babelify/-/babelify-7.3.0.tgz#aa56aede7067fd7bd549666ee16dc285087e88e5" - dependencies: - babel-core "^6.0.14" - object-assign "^4.0.0" - -babylon@^6.11.0, babylon@^6.11.2, babylon@^6.8.1: - version "6.11.6" - resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.11.6.tgz#56dc52e624882841c7fe095257fbcb4a5bb61ae1" +babelify@^10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/babelify/-/babelify-10.0.0.tgz#fe73b1a22583f06680d8d072e25a1e0d1d1d7fb5" + integrity sha512-X40FaxyH7t3X+JFAKvb1H9wooWKLRCi8pg3m8poqtdZaIng+bjzp9RvKQCvRjF9isHiPkXspbbXT/zwXLtwgwg== babylon@^6.18.0: version "6.18.0" resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" -balanced-match@0.1.0, balanced-match@~0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-0.1.0.tgz#b504bd05869b39259dd0c5efc35d843176dccc4a" - -balanced-match@^0.2.0: - version "0.2.1" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-0.2.1.tgz#7bc658b4bed61eee424ad74f75f5c3e2c4df3cc7" - balanced-match@^0.4.1, balanced-match@^0.4.2: version "0.4.2" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-0.4.2.tgz#cb3f3e3c732dc0f01ee70b403f302e61d7709838" @@ -1779,6 +2266,10 @@ balanced-match@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" +balanced-match@~0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-0.1.0.tgz#b504bd05869b39259dd0c5efc35d843176dccc4a" + base64-js@^1.0.2: version "1.2.0" resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.2.0.tgz#a39992d723584811982be5e290bb6a53d86700f1" @@ -1829,29 +2320,25 @@ bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0: version "4.11.6" resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.6.tgz#53344adb14617a13f6e8dd2ce28905d1c0ba3215" -body-parser@~1.14.0: - version "1.14.2" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.14.2.tgz#1015cb1fe2c443858259581db53332f8d0cf50f9" - dependencies: - bytes "2.2.0" - content-type "~1.0.1" - debug "~2.2.0" - depd "~1.1.0" - http-errors "~1.3.1" - iconv-lite "0.4.13" - on-finished "~2.3.0" - qs "5.2.0" - raw-body "~2.1.5" - type-is "~1.6.10" - bole@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/bole/-/bole-2.0.0.tgz#d8aa1c690467bfb4fe11b874acb2e8387e382615" + integrity sha1-2KocaQRnv7T+Ebh0rLLoOH44JhU= dependencies: core-util-is ">=1.0.1 <1.1.0-0" individual ">=3.0.0 <3.1.0-0" json-stringify-safe ">=5.0.0 <5.1.0-0" +boolbase@^1.0.0, boolbase@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" + integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24= + +boolify@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/boolify/-/boolify-1.0.1.tgz#b5c09e17cacd113d11b7bb3ed384cc012994d86b" + integrity sha1-tcCeF8rNET0Rt7s+04TMASmU2Gs= + boom@2.x.x: version "2.10.1" resolved "https://registry.yarnpkg.com/boom/-/boom-2.10.1.tgz#39c8918ceff5799f83f9492a848f625add0c766f" @@ -1880,7 +2367,7 @@ braces@^1.8.2: preserve "^0.2.0" repeat-element "^1.1.2" -braces@^2.3.0, braces@^2.3.1: +braces@^2.3.0, braces@^2.3.1, braces@^2.3.2: version "2.3.2" resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" dependencies: @@ -1900,18 +2387,26 @@ brorand@^1.0.1: resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.0.6.tgz#4028706b915f91f7b349a2e0bf3c376039d216e5" browser-pack@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/browser-pack/-/browser-pack-6.0.1.tgz#779887c792eaa1f64a46a22c8f1051cdcd96755f" + version "6.1.0" + resolved "https://registry.yarnpkg.com/browser-pack/-/browser-pack-6.1.0.tgz#c34ba10d0b9ce162b5af227c7131c92c2ecd5774" + integrity sha512-erYug8XoqzU3IfcU8fUgyHqyOXqIE4tUTTQ+7mqUjQlvnXkOO6OlT9c/ZoJVHYoAaqGxr09CN53G7XIsO4KtWA== dependencies: JSONStream "^1.0.3" - combine-source-map "~0.7.1" + combine-source-map "~0.8.0" defined "^1.0.0" + safe-buffer "^5.1.1" through2 "^2.0.0" umd "^3.0.0" -browser-resolve@^1.11.0, browser-resolve@^1.11.2, browser-resolve@^1.7.0: - version "1.11.2" - resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.2.tgz#8ff09b0a2c421718a1051c260b32e48f442938ce" +browser-process-hrtime@^0.1.2: + version "0.1.3" + resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-0.1.3.tgz#616f00faef1df7ec1b5bf9cfe2bdc3170f26c7b4" + integrity sha512-bRFnI4NnjO6cnyLmOV/7PVoDEMJChlcfN0z4s1YMBY989/SvlfMI1lgCnkFUs53e9gQF+w7qu7XdllSTiSl8Aw== + +browser-resolve@^1.11.0, browser-resolve@^1.11.3, browser-resolve@^1.7.0: + version "1.11.3" + resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.3.tgz#9b7cbb3d0f510e4cb86bdbd796124d28b5890af6" + integrity sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ== dependencies: resolve "1.1.7" @@ -1941,14 +2436,16 @@ browserify-des@^1.0.0: des.js "^1.0.0" inherits "^2.0.1" -browserify-markdown@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/browserify-markdown/-/browserify-markdown-1.0.0.tgz#56321cdbcf92478c0467ef56b321a0766db78243" +browserify-markdown@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/browserify-markdown/-/browserify-markdown-2.0.1.tgz#18e71dcb71abeba0bd802def00a2452d287fe36a" + integrity sha1-GOcdy3Gr66C9gC3vAKJFLSh/42o= dependencies: - highlight.js "^8.6.0" - remarkable "^1.6.0" + highlight.js "^9.7.0" + remarkable "github:matthewmueller/remarkable#3b896af" string-to-js "0.0.1" through "^2.3.7" + through2 "2.0.1" browserify-rsa@^4.0.0: version "4.0.1" @@ -1969,46 +2466,43 @@ browserify-sign@^4.0.0: inherits "^2.0.1" parse-asn1 "^5.0.0" -browserify-zlib@^0.2.0: +browserify-zlib@^0.2.0, browserify-zlib@~0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f" dependencies: pako "~1.0.5" -browserify-zlib@~0.1.2: - version "0.1.4" - resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.1.4.tgz#bb35f8a519f600e0fa6b8485241c979d0141fb2d" - dependencies: - pako "~0.2.0" - -browserify@^13.0.0, browserify@^13.0.1: - version "13.1.0" - resolved "https://registry.yarnpkg.com/browserify/-/browserify-13.1.0.tgz#d81a018e98dd7ca706ec04253d20f8a03b2af8ae" +browserify@^16.1.0, browserify@^16.2.3: + version "16.2.3" + resolved "https://registry.yarnpkg.com/browserify/-/browserify-16.2.3.tgz#7ee6e654ba4f92bce6ab3599c3485b1cc7a0ad0b" + integrity sha512-zQt/Gd1+W+IY+h/xX2NYMW4orQWhqSwyV+xsblycTtpOuB27h1fZhhNQuipJ4t79ohw4P4mMem0jp/ZkISQtjQ== dependencies: JSONStream "^1.0.3" - assert "~1.3.0" + assert "^1.4.0" browser-pack "^6.0.1" browser-resolve "^1.11.0" - browserify-zlib "~0.1.2" - buffer "^4.1.0" - concat-stream "~1.5.1" + browserify-zlib "~0.2.0" + buffer "^5.0.2" + cached-path-relative "^1.0.0" + concat-stream "^1.6.0" console-browserify "^1.1.0" constants-browserify "~1.0.0" crypto-browserify "^3.0.0" defined "^1.0.0" deps-sort "^2.0.0" - domain-browser "~1.1.0" + domain-browser "^1.2.0" duplexer2 "~0.1.2" - events "~1.1.0" - glob "^5.0.15" + events "^2.0.0" + glob "^7.1.0" has "^1.0.0" htmlescape "^1.1.0" - https-browserify "~0.0.0" + https-browserify "^1.0.0" inherits "~2.0.1" insert-module-globals "^7.0.0" labeled-stream-splicer "^2.0.0" - module-deps "^4.0.2" - os-browserify "~0.1.1" + mkdirp "^0.5.0" + module-deps "^6.0.0" + os-browserify "~0.3.0" parents "^1.0.1" path-browserify "~0.0.0" process "~0.11.0" @@ -2018,26 +2512,20 @@ browserify@^13.0.0, browserify@^13.0.1: readable-stream "^2.0.2" resolve "^1.1.4" shasum "^1.0.0" - shell-quote "^1.4.3" + shell-quote "^1.6.1" stream-browserify "^2.0.0" stream-http "^2.0.0" - string_decoder "~0.10.0" + string_decoder "^1.1.1" subarg "^1.0.0" syntax-error "^1.1.1" through2 "^2.0.0" timers-browserify "^1.0.1" - tty-browserify "~0.0.0" + tty-browserify "0.0.1" url "~0.11.0" util "~0.10.1" - vm-browserify "~0.0.1" + vm-browserify "^1.0.0" xtend "^4.0.0" -browserslist@^1.0.0, browserslist@^1.0.1, browserslist@^1.4.0, browserslist@~1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-1.4.0.tgz#9cfdcf5384d9158f5b70da2aa00b30e8ff019049" - dependencies: - caniuse-db "^1.0.30000539" - browserslist@^1.3.6, browserslist@^1.5.2, browserslist@^1.7.6: version "1.7.7" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-1.7.7.tgz#0bd76704258be829b2398bb50e4b62d1a166b0b9" @@ -2045,44 +2533,63 @@ browserslist@^1.3.6, browserslist@^1.5.2, browserslist@^1.7.6: caniuse-db "^1.0.30000639" electron-to-chromium "^1.2.7" -bser@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/bser/-/bser-1.0.2.tgz#381116970b2a6deea5646dd15dd7278444b56169" +browserslist@^4.0.0, browserslist@^4.4.2, browserslist@^4.6.0, browserslist@^4.6.1, browserslist@^4.6.2: + version "4.6.2" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.6.2.tgz#574c665950915c2ac73a4594b8537a9eba26203f" + integrity sha512-2neU/V0giQy9h3XMPwLhEY3+Ao0uHSwHvU8Q1Ea6AgLVL1sXbX3dzPrJ8NWe5Hi4PoTkCYXOtVR9rfRLI0J/8Q== + dependencies: + caniuse-lite "^1.0.30000974" + electron-to-chromium "^1.3.150" + node-releases "^1.1.23" + +bser@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/bser/-/bser-2.0.0.tgz#9ac78d3ed5d915804fd87acb158bc797147a1719" + integrity sha1-mseNPtXZFYBP2HrLFYvHlxR6Fxk= dependencies: node-int64 "^0.4.0" -budo@^9.0.0: - version "9.2.1" - resolved "https://registry.yarnpkg.com/budo/-/budo-9.2.1.tgz#c36c6c5097bd5ad43720cb3ae9d269870b4735ed" +budo@^11.6.1: + version "11.6.2" + resolved "https://registry.yarnpkg.com/budo/-/budo-11.6.2.tgz#0f26fc3db54fe4ab9561a0387bf34ae2a617c7e6" + integrity sha512-y6rcQHf//rqY1hsVJOUXGCHD0IZyVbbzAR1Cs1CYwI/akS7A8VMDhUNU9eXdQF2kM92ogPXEDsHo5ESdv5ZwPA== dependencies: bole "^2.0.0" - browserify "^13.0.1" - chokidar "^1.0.1" - connect-pushstate "^1.0.0" + browserify "^16.2.3" + chokidar "^2.0.4" + connect-pushstate "^1.1.0" + escape-html "^1.0.3" events "^1.0.2" garnish "^5.0.0" get-ports "^1.0.2" - http-proxy "^1.14.0" - inject-lr-script "^2.0.0" - internal-ip "^1.0.1" - micromatch "^2.2.0" - minimist "^1.1.0" + inject-lr-script "^2.1.0" + internal-ip "^3.0.1" + micromatch "^3.1.10" + on-finished "^2.3.0" + on-headers "^1.0.1" once "^1.3.2" opn "^3.0.2" - pem "^1.8.3" + path-is-absolute "^1.0.1" + pem "^1.13.2" + reload-css "^1.0.0" resolve "^1.1.6" - resp-modifier "^6.0.0" serve-static "^1.10.0" simple-html-index "^1.4.0" stacked "^1.1.1" stdout-stream "^1.4.0" strip-ansi "^3.0.0" + subarg "^1.0.0" term-color "^1.0.1" - tiny-lr "^0.2.0" url-trim "^1.0.0" - watchify-middleware "^1.6.0" + watchify-middleware "^1.8.2" + ws "^1.1.1" xtend "^4.0.0" +buffer-from@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" + integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== + buffer-shims@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/buffer-shims/-/buffer-shims-1.0.0.tgz#9978ce317388c649ad8793028c3477ef044a8b51" @@ -2091,7 +2598,7 @@ buffer-xor@^1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" -buffer@4.9.1, buffer@^4.1.0, buffer@^4.3.0: +buffer@4.9.1, buffer@^4.3.0: version "4.9.1" resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.1.tgz#6d1bb601b07a4efced97094132093027c95bc298" dependencies: @@ -2099,26 +2606,22 @@ buffer@4.9.1, buffer@^4.1.0, buffer@^4.3.0: ieee754 "^1.1.4" isarray "^1.0.0" +buffer@^5.0.2: + version "5.2.1" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.2.1.tgz#dd57fa0f109ac59c602479044dca7b8b3d0b71d6" + integrity sha512-c+Ko0loDaFfuPWiL02ls9Xd3GO3cPVmUobQ6t3rXNUk304u6hGq+8N/kFi+QEIKhzK3uwolVhLzszmfLmMLnqg== + dependencies: + base64-js "^1.0.2" + ieee754 "^1.1.4" + builtin-modules@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" -builtin-status-codes@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-2.0.0.tgz#6f22003baacf003ccd287afe6872151fddc58579" - builtin-status-codes@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" -bytes@2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-2.2.0.tgz#fd35464a403f6f9117c2de3609ecff9cae000588" - -bytes@2.4.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-2.4.0.tgz#7d97196f9d5baf7f6935e25985549edd2a6c2339" - cache-base@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" @@ -2133,19 +2636,51 @@ cache-base@^1.0.1: union-value "^1.0.0" unset-value "^1.0.0" +cached-path-relative@^1.0.0, cached-path-relative@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/cached-path-relative/-/cached-path-relative-1.0.2.tgz#a13df4196d26776220cc3356eb147a52dba2c6db" + integrity sha512-5r2GqsoEb4qMTTN9J+WzXfjov+hjxT+j3u5K+kIVNIwAd99DLCJE9pBIMP1qVeybV6JiijL385Oz0DcYxfbOIg== + +cachedir@2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cachedir/-/cachedir-2.1.0.tgz#b448c32b44cd9c0cd6ce4c419fa5b3c112c02191" + integrity sha512-xGBpPqoBvn3unBW7oxgb8aJn42K0m9m1/wyjmazah10Fq7bROGG3kRAE6OIyr3U3PIJUqGuebhCEdMk9OKJG0A== + +caller-callsite@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/caller-callsite/-/caller-callsite-2.0.0.tgz#847e0fce0a223750a9a027c54b33731ad3154134" + integrity sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ= + dependencies: + callsites "^2.0.0" + caller-path@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-0.1.0.tgz#94085ef63581ecd3daa92444a8fe94e82577751f" + integrity sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8= dependencies: callsites "^0.2.0" +caller-path@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-2.0.0.tgz#468f83044e369ab2010fac5f06ceee15bb2cb1f4" + integrity sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ= + dependencies: + caller-callsite "^2.0.0" + callsites@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/callsites/-/callsites-0.2.0.tgz#afab96262910a7f33c19a5775825c69f34e350ca" + integrity sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo= callsites@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50" + integrity sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA= + +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== camelcase-keys@^2.0.0: version "2.1.0" @@ -2154,6 +2689,15 @@ camelcase-keys@^2.0.0: camelcase "^2.0.0" map-obj "^1.0.0" +camelcase-keys@^4.1.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-4.2.0.tgz#a2aa5fb1af688758259c32c141426d78923b9b77" + integrity sha1-oqpfsa9oh1glnDLBQUJteJI7m3c= + dependencies: + camelcase "^4.1.0" + map-obj "^2.0.0" + quick-lru "^1.0.0" + camelcase@^1.0.2: version "1.2.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39" @@ -2166,15 +2710,15 @@ camelcase@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a" -caniuse-api@^1.3.2: - version "1.5.2" - resolved "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-1.5.2.tgz#8f393c682f661c0a997b77bba6e826483fb3600e" - dependencies: - browserslist "^1.0.1" - caniuse-db "^1.0.30000346" - lodash.memoize "^4.1.0" - lodash.uniq "^4.3.0" - shelljs "^0.7.0" +camelcase@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" + integrity sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0= + +camelcase@^5.0.0: + version "5.3.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" + integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== caniuse-api@^1.5.2: version "1.6.1" @@ -2185,25 +2729,41 @@ caniuse-api@^1.5.2: lodash.memoize "^4.1.2" lodash.uniq "^4.5.0" -caniuse-db@^1.0.30000346, caniuse-db@^1.0.30000539, caniuse-db@^1.0.30000554: - version "1.0.30000555" - resolved "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30000555.tgz#12572c4e0111781c49b01e1fdcc455e7456b8ed4" - +caniuse-api@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-3.0.0.tgz#5e4d90e2274961d46291997df599e3ed008ee4c0" + integrity sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw== + dependencies: + browserslist "^4.0.0" + caniuse-lite "^1.0.0" + lodash.memoize "^4.1.2" + lodash.uniq "^4.5.0" + caniuse-db@^1.0.30000529, caniuse-db@^1.0.30000634, caniuse-db@^1.0.30000639: version "1.0.30000859" resolved "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30000859.tgz#6e813a1757f19a93cb3675f6b5037aca80bea062" -cardinal@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/cardinal/-/cardinal-1.0.0.tgz#50e21c1b0aa37729f9377def196b5a9cec932ee9" +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000939, caniuse-lite@^1.0.30000941, caniuse-lite@^1.0.30000971, caniuse-lite@^1.0.30000974: + version "1.0.30000974" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000974.tgz#b7afe14ee004e97ce6dc73e3f878290a12928ad8" + integrity sha512-xc3rkNS/Zc3CmpMKuczWEdY2sZgx09BkAxfvkxlAEBTqcMHeL8QnPqhKse+5sRTi3nrw2pJwToD2WvKn1Uhvww== + +capture-exit@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/capture-exit/-/capture-exit-2.0.0.tgz#fb953bfaebeb781f62898239dabb426d08a509a4" + integrity sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g== dependencies: - ansicolors "~0.2.1" - redeyed "~1.0.0" + rsvp "^4.8.4" caseless@~0.11.0: version "0.11.0" resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.11.0.tgz#715b96ea9841593cc33067923f5ec60ebda4f7d7" +caseless@~0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" + integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= + center-align@^0.1.1: version "0.1.3" resolved "https://registry.yarnpkg.com/center-align/-/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907bc2b7ad" @@ -2211,19 +2771,19 @@ center-align@^0.1.1: align-text "^0.1.3" lazy-cache "^1.0.3" -chalk@1.1.3, chalk@^1.0.0, chalk@^1.1.0, chalk@^1.1.1, chalk@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" +chalk@2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.3.0.tgz#b5ea48efc9c1793dccc9b4767c93914d3f2d52ba" + integrity sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q== dependencies: - ansi-styles "^2.2.1" - escape-string-regexp "^1.0.2" - has-ansi "^2.0.0" - strip-ansi "^3.0.0" - supports-color "^2.0.0" + ansi-styles "^3.1.0" + escape-string-regexp "^1.0.5" + supports-color "^4.0.0" chalk@^0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/chalk/-/chalk-0.5.1.tgz#663b3a648b68b55d04690d49167aa837858f2174" + integrity sha1-Zjs6ZItotV0EaQ1JFnqoN4WPIXQ= dependencies: ansi-styles "^1.1.0" escape-string-regexp "^1.0.0" @@ -2231,6 +2791,25 @@ chalk@^0.5.1: strip-ansi "^0.3.0" supports-color "^0.2.0" +chalk@^1.1.1, chalk@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" + dependencies: + ansi-styles "^2.2.1" + escape-string-regexp "^1.0.2" + has-ansi "^2.0.0" + strip-ansi "^3.0.0" + supports-color "^2.0.0" + +chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + chalk@^2.4.1: version "2.4.1" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.1.tgz#18c49ab16a037b6eb0152cc83e3471338215b66e" @@ -2239,20 +2818,20 @@ chalk@^2.4.1: escape-string-regexp "^1.0.5" supports-color "^5.3.0" -chokidar@^1.0.0, chokidar@^1.0.1, chokidar@^1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.6.0.tgz#90c32ad4802901d7713de532dc284e96a63ad058" - dependencies: - anymatch "^1.3.0" - async-each "^1.0.0" - glob-parent "^2.0.0" - inherits "^2.0.1" - is-binary-path "^1.0.0" - is-glob "^2.0.0" - path-is-absolute "^1.0.0" - readdirp "^2.0.0" - optionalDependencies: - fsevents "^1.0.0" +chardet@^0.4.0: + version "0.4.2" + resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.4.2.tgz#b5473b33dc97c424e5d98dc87d55d4d8a29c8bf2" + integrity sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I= + +chardet@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" + integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== + +charenc@~0.0.1: + version "0.0.2" + resolved "https://registry.yarnpkg.com/charenc/-/charenc-0.0.2.tgz#c0a1d2f3a7092e03774bfa83f14c0fc5790a8667" + integrity sha1-wKHS86cJLgN3S/qD8UwPxXkKhmc= chokidar@^1.6.1: version "1.7.0" @@ -2288,19 +2867,44 @@ chokidar@^2.0.2: optionalDependencies: fsevents "^1.2.2" +chokidar@^2.0.4, chokidar@^2.1.1, chokidar@^2.1.2: + version "2.1.6" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.6.tgz#b6cad653a929e244ce8a834244164d241fa954c5" + integrity sha512-V2jUo67OKkc6ySiRpJrjlpJKl9kDuG+Xb8VgsGzb+aEouhgS1D0weyPU4lEzdAcsCAvrih2J2BqyXqHWvVLw5g== + dependencies: + anymatch "^2.0.0" + async-each "^1.0.1" + braces "^2.3.2" + glob-parent "^3.1.0" + inherits "^2.0.3" + is-binary-path "^1.0.0" + is-glob "^4.0.0" + normalize-path "^3.0.0" + path-is-absolute "^1.0.0" + readdirp "^2.2.1" + upath "^1.1.1" + optionalDependencies: + fsevents "^1.2.7" + chownr@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.0.1.tgz#e2a75042a9551908bebd25b8523d5f9769d79181" +ci-info@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" + integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== + cipher-base@^1.0.0, cipher-base@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.3.tgz#eeabf194419ce900da3018c207d212f2a6df0a07" dependencies: inherits "^2.0.1" -circular-json@^0.3.0: - version "0.3.1" - resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.1.tgz#be8b36aefccde8b3ca7aa2d6afc07a37242c0d2d" +circular-json@^0.3.1: + version "0.3.3" + resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.3.tgz#815c99ea84f6809529d2f45791bdf82711352d66" + integrity sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A== clap@^1.0.9: version "1.2.3" @@ -2317,28 +2921,17 @@ class-utils@^0.3.5: isobject "^3.0.0" static-extend "^0.1.1" -cli-cursor@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-1.0.2.tgz#64da3f7d56a54412e59794bd62dc35295e8f2987" - dependencies: - restore-cursor "^1.0.1" - -cli-table@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/cli-table/-/cli-table-0.3.1.tgz#f53b05266a8b1a0b934b3d0821e6e2dc5914ae23" - dependencies: - colors "1.0.3" - -cli-usage@^0.1.1: - version "0.1.4" - resolved "https://registry.yarnpkg.com/cli-usage/-/cli-usage-0.1.4.tgz#7c01e0dc706c234b39c933838c8e20b2175776e2" +cli-cursor@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" + integrity sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU= dependencies: - marked "^0.3.6" - marked-terminal "^1.6.2" + restore-cursor "^2.0.0" cli-width@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.1.0.tgz#b234ca209b29ef66fc518d9b98d5847b00edf00a" + version "2.2.0" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" + integrity sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk= cliui@^2.1.0: version "2.1.0" @@ -2356,6 +2949,15 @@ cliui@^3.2.0: strip-ansi "^3.0.1" wrap-ansi "^2.0.0" +cliui@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-4.1.0.tgz#348422dbe82d800b3022eef4f6ac10bf2e4d1b49" + integrity sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ== + dependencies: + string-width "^2.1.1" + strip-ansi "^4.0.0" + wrap-ansi "^2.0.0" + clone@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.2.tgz#260b7a99ebb1edfe247538175f783243cb19d149" @@ -2364,6 +2966,15 @@ co@^4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" +coa@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/coa/-/coa-2.0.2.tgz#43f6c21151b4ef2bf57187db0d73de229e3e7ec3" + integrity sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA== + dependencies: + "@types/q" "^1.5.1" + chalk "^2.4.1" + q "^1.1.2" + coa@~1.0.1: version "1.0.4" resolved "https://registry.yarnpkg.com/coa/-/coa-1.0.4.tgz#a9ef153660d6a86a8bdec0289a5c684d217432fd" @@ -2383,10 +2994,6 @@ collection-visit@^1.0.0: map-visit "^1.0.0" object-visit "^1.0.0" -color-convert@0.5.x, color-convert@^0.5.3: - version "0.5.3" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-0.5.3.tgz#bdb6c69ce660fadffe0b0007cc447e1b9f7282bd" - color-convert@^1.3.0: version "1.5.0" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.5.0.tgz#7a2b4efb4488df85bca6443cb038b7100fbe7de1" @@ -2397,19 +3004,25 @@ color-convert@^1.9.0: dependencies: color-name "1.1.1" -color-name@1.0.x, color-name@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.0.1.tgz#6b34b2b29b7716013972b0b9d5bedcfbb6718df8" +color-convert@^1.9.1: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" color-name@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.1.tgz#4b1415304cf50028ea81643643bd82ea05803689" -color-string@0.2.x: - version "0.2.4" - resolved "https://registry.yarnpkg.com/color-string/-/color-string-0.2.4.tgz#221ff64234f71aaa3e13bc8c7e8c95f3cdd8f81a" - dependencies: - color-name "1.0.x" +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= + +color-name@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.0.1.tgz#6b34b2b29b7716013972b0b9d5bedcfbb6718df8" color-string@^0.3.0: version "0.3.0" @@ -2417,12 +3030,13 @@ color-string@^0.3.0: dependencies: color-name "^1.0.0" -color@^0.10.1: - version "0.10.1" - resolved "https://registry.yarnpkg.com/color/-/color-0.10.1.tgz#c04188df82a209ddebccecdacd3ec320f193739f" +color-string@^1.5.2: + version "1.5.3" + resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.5.3.tgz#c9bbc5f01b58b5492f3d6857459cb6590ce204cc" + integrity sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw== dependencies: - color-convert "^0.5.3" - color-string "^0.3.0" + color-name "^1.0.0" + simple-swizzle "^0.2.2" color@^0.11.0: version "0.11.3" @@ -2432,19 +3046,13 @@ color@^0.11.0: color-convert "^1.3.0" color-string "^0.3.0" -color@^0.7.3: - version "0.7.3" - resolved "https://registry.yarnpkg.com/color/-/color-0.7.3.tgz#ab3ae4bc6cb8cfadb5d749c40f34aea088104f89" - dependencies: - color-convert "0.5.x" - color-string "0.2.x" - -color@^0.9.0: - version "0.9.0" - resolved "https://registry.yarnpkg.com/color/-/color-0.9.0.tgz#91146d460cdd5543ea1fa20aa0b597337509b64d" +color@^3.0.0: + version "3.1.2" + resolved "https://registry.yarnpkg.com/color/-/color-3.1.2.tgz#68148e7f85d41ad7649c5fa8c8106f098d229e10" + integrity sha512-vXTJhHebByxZn3lDvDJYw4lR5+uB3vuoHsuYA5AKuxRVn5wzzIfQKGLBmgdVRHKTJYeK5rvJcHnrd0Li49CFpg== dependencies: - color-convert "^0.5.3" - color-string "^0.3.0" + color-convert "^1.9.1" + color-string "^1.5.2" colormin@^1.0.5: version "1.1.2" @@ -2454,17 +3062,14 @@ colormin@^1.0.5: css-color-names "0.0.4" has "^1.0.1" -colors@1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b" - colors@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/colors/-/colors-1.1.2.tgz#168a4701756b6a7f51a12ce0c97bfa28c084ed63" -combine-source-map@~0.7.1: - version "0.7.2" - resolved "https://registry.yarnpkg.com/combine-source-map/-/combine-source-map-0.7.2.tgz#0870312856b307a87cc4ac486f3a9a62aeccc09e" +combine-source-map@^0.8.0, combine-source-map@~0.8.0: + version "0.8.0" + resolved "https://registry.yarnpkg.com/combine-source-map/-/combine-source-map-0.8.0.tgz#a58d0df042c186fcf822a8e8015f5450d2d79a8b" + integrity sha1-pY0N8ELBhvz4IqjoAV9UUNLXmos= dependencies: convert-source-map "~1.1.0" inline-source-map "~0.6.0" @@ -2477,35 +3082,54 @@ combined-stream@^1.0.5, combined-stream@~1.0.5: dependencies: delayed-stream "~1.0.0" +combined-stream@^1.0.6, combined-stream@~1.0.6: + version "1.0.8" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + commander@^2.11.0: version "2.15.1" resolved "https://registry.yarnpkg.com/commander/-/commander-2.15.1.tgz#df46e867d0fc2aec66a34662b406a9ccafff5b0f" +commander@^2.19.0, commander@~2.20.0: + version "2.20.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.0.tgz#d58bb2b5c1ee8f87b0d340027e9e94e222c5a422" + integrity sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ== + commander@^2.9.0: version "2.9.0" resolved "https://registry.yarnpkg.com/commander/-/commander-2.9.0.tgz#9c99094176e12240cb22d6c5146098400fe0f7d4" dependencies: graceful-readlink ">= 1.0.0" -commitizen@^2.8.2: - version "2.8.6" - resolved "https://registry.yarnpkg.com/commitizen/-/commitizen-2.8.6.tgz#578483abbf5b67368d1ccdb9d9d978c74972011b" - dependencies: - chalk "1.1.3" - cz-conventional-changelog "1.2.0" - dedent "0.6.0" - detect-indent "4.0.0" - find-node-modules "1.0.3" - find-root "1.0.0" - glob "7.0.5" - home-or-tmp "2.0.0" - inquirer "1.1.2" - lodash "4.15.0" +commitizen@^3.0.7: + version "3.1.1" + resolved "https://registry.yarnpkg.com/commitizen/-/commitizen-3.1.1.tgz#0135c8c68df52ce348d718f79b23eb03b8713918" + integrity sha512-n5pnG8sNM5a3dS3Kkh3rYr+hFdPWZlqV6pfz6KGLmWV/gsIiTqAwhTgFKkcF/paKUpfIMp0x4YZlD0xLBNTW9g== + dependencies: + cachedir "2.1.0" + cz-conventional-changelog "2.1.0" + dedent "0.7.0" + detect-indent "^5.0.0" + find-node-modules "2.0.0" + find-root "1.1.0" + fs-extra "^7.0.0" + glob "7.1.3" + inquirer "6.2.0" + is-utf8 "^0.2.1" + lodash "4.17.11" minimist "1.2.0" - path-exists "2.1.0" - shelljs "0.5.3" + shelljs "0.7.6" + strip-bom "3.0.0" strip-json-comments "2.0.1" +common-tags@^1.4.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/common-tags/-/common-tags-1.8.0.tgz#8e3153e542d4a39e9b10554434afaaf98956a937" + integrity sha512-6P6g0uetGpW/sdyUy/iQQCbFF0kWVMSIVSyYz7Zgjcgh8mgw8PQzDNZeyZ5DQ2gM7LBoZPHmnjz8rUthkBG5tw== + commondir@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" @@ -2533,7 +3157,17 @@ concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" -concat-stream@^1.4.6, concat-stream@^1.4.7, concat-stream@^1.5.0, concat-stream@^1.5.1, concat-stream@^1.5.2, concat-stream@~1.5.0, concat-stream@~1.5.1: +concat-stream@^1.5.0, concat-stream@^1.6.0, concat-stream@^1.6.1, concat-stream@~1.6.0: + version "1.6.2" + resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" + integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== + dependencies: + buffer-from "^1.0.0" + inherits "^2.0.3" + readable-stream "^2.2.2" + typedarray "^0.0.6" + +concat-stream@^1.5.2: version "1.5.2" resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.5.2.tgz#708978624d856af41a5a741defdd261da752c266" dependencies: @@ -2541,6 +3175,16 @@ concat-stream@^1.4.6, concat-stream@^1.4.7, concat-stream@^1.5.0, concat-stream@ readable-stream "~2.0.0" typedarray "~0.0.5" +concat-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-2.0.0.tgz#414cf5af790a48c60ab9be4527d56d5e41133cb1" + integrity sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A== + dependencies: + buffer-from "^1.0.0" + inherits "^2.0.3" + readable-stream "^3.0.2" + typedarray "^0.0.6" + config-chain@~1.1.8: version "1.1.11" resolved "https://registry.yarnpkg.com/config-chain/-/config-chain-1.1.11.tgz#aba09747dfbe4c3e70e766a6e41586e1859fc6f2" @@ -2548,9 +3192,10 @@ config-chain@~1.1.8: ini "^1.3.4" proto-list "~1.2.1" -connect-pushstate@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/connect-pushstate/-/connect-pushstate-1.0.0.tgz#cdc82173076f01b90bb084983a1f4493d4a28d04" +connect-pushstate@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/connect-pushstate/-/connect-pushstate-1.1.0.tgz#bcab224271c439604a0fb0f614c0a5f563e88e24" + integrity sha1-vKsiQnHEOWBKD7D2FMCl9WPojiQ= console-browserify@^1.1.0: version "1.1.0" @@ -2566,13 +3211,10 @@ constants-browserify@^1.0.0, constants-browserify@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" -content-type-parser@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/content-type-parser/-/content-type-parser-1.0.1.tgz#c3e56988c53c65127fb46d4032a3a900246fdc94" - -content-type@~1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.2.tgz#b7d113aee7a8dd27bd21133c4dc2529df1721eed" +contains-path@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/contains-path/-/contains-path-0.1.0.tgz#fe8cf184ff6670b6baef01a9d4861a5cbec4120a" + integrity sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo= conventional-changelog@0.0.17: version "0.0.17" @@ -2585,12 +3227,16 @@ conventional-changelog@0.0.17: normalize-package-data "^1.0.3" conventional-commit-types@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/conventional-commit-types/-/conventional-commit-types-2.1.0.tgz#45d860386c9a2e6537ee91d8a1b61bd0411b3d04" + version "2.1.1" + resolved "https://registry.yarnpkg.com/conventional-commit-types/-/conventional-commit-types-2.1.1.tgz#352eb53f56fbc7c1a6c1ba059c2b6670c90b2a8a" + integrity sha512-0Ts+fEdmjqYDOQ1yZ+LNgdSPO335XZw9qC10M7CxtLP3nIMGmeMhmkM8Taffa4+MXN13bRPlp0CtH+QfOzKTzw== -convert-source-map@^1.1.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.3.0.tgz#e9f3e9c6e2728efc2676696a70eb382f73106a67" +convert-source-map@^1.1.0, convert-source-map@^1.4.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.6.0.tgz#51b537a8c43e0f04dec1993bffcdd504e758ac20" + integrity sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A== + dependencies: + safe-buffer "~5.1.1" convert-source-map@^1.5.0, convert-source-map@^1.5.1: version "1.5.1" @@ -2599,11 +3245,26 @@ convert-source-map@^1.5.0, convert-source-map@^1.5.1: convert-source-map@~1.1.0: version "1.1.3" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.1.3.tgz#4829c877e9fe49b3161f3bf3673888e204699860" + integrity sha1-SCnId+n+SbMWHzvzZziI4gRpmGA= copy-descriptor@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" +core-js-compat@^3.1.1: + version "3.1.4" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.1.4.tgz#e4d0c40fbd01e65b1d457980fe4112d4358a7408" + integrity sha512-Z5zbO9f1d0YrJdoaQhphVAnKPimX92D6z8lCGphH89MNRxlL1prI9ExJPqVwP0/kgkQCv8c4GJGT8X16yUncOg== + dependencies: + browserslist "^4.6.2" + core-js-pure "3.1.4" + semver "^6.1.1" + +core-js-pure@3.1.4: + version "3.1.4" + resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.1.4.tgz#5fa17dc77002a169a3566cc48dc774d2e13e3769" + integrity sha512-uJ4Z7iPNwiu1foygbcZYJsJs1jiXrTTCvxfLDXNhI/I+NHbSIEyr548y4fcsCEyWY0XgfAG/qqaunJ1SThHenA== + core-js@^2.4.0: version "2.4.1" resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.4.1.tgz#4de911e667b0eae9124e34254b53aea6fc618d3e" @@ -2612,10 +3273,25 @@ core-js@^2.5.0: version "2.5.7" resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.7.tgz#f972608ff0cead68b841a16a932d0b183791814e" +core-js@^2.6.5: + version "2.6.9" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.9.tgz#6b4b214620c834152e179323727fc19741b084f2" + integrity sha512-HOpZf6eXmnl7la+cUdMnLvUxKNqLUzJvgIziQ0DiF3JwSImNphIqdGqzj6hIKyX04MmV0poclQ7+wjWvxQyR2A== + "core-util-is@>=1.0.1 <1.1.0-0", core-util-is@^1.0.1, core-util-is@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" +cosmiconfig@^5.0.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.2.1.tgz#040f726809c591e77a17c0a3626ca45b4f168b1a" + integrity sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA== + dependencies: + import-fresh "^2.0.0" + is-directory "^0.3.1" + js-yaml "^3.13.1" + parse-json "^4.0.0" + create-ecdh@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.0.tgz#888c723596cdf7612f6498233eebd7a35301737d" @@ -2639,32 +3315,38 @@ create-hmac@^1.1.0, create-hmac@^1.1.2: create-hash "^1.1.0" inherits "^2.0.1" +cross-spawn@^5.0.1, cross-spawn@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" + integrity sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk= + dependencies: + lru-cache "^4.0.1" + shebang-command "^1.2.0" + which "^1.2.9" + +cross-spawn@^6.0.0, cross-spawn@^6.0.5: + version "6.0.5" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" + integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== + dependencies: + nice-try "^1.0.4" + path-key "^2.0.1" + semver "^5.5.0" + shebang-command "^1.2.0" + which "^1.2.9" + +crypt@~0.0.1: + version "0.0.2" + resolved "https://registry.yarnpkg.com/crypt/-/crypt-0.0.2.tgz#88d7ff7ec0dfb86f713dc87bbb42d044d3e6c41b" + integrity sha1-iNf/fsDfuG9xPch7u0LQRNPmxBs= + cryptiles@2.x.x: version "2.0.5" resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-2.0.5.tgz#3bdfecdc608147c1c67202fa291e7dca59eaa3b8" dependencies: boom "2.x.x" -crypto-browserify@1.0.9: - version "1.0.9" - resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-1.0.9.tgz#cc5449685dfb85eb11c9828acc7cb87ab5bbfcc0" - -crypto-browserify@^3.0.0: - version "3.11.0" - resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.11.0.tgz#3652a0906ab9b2a7e0c3ce66a408e957a2485522" - dependencies: - browserify-cipher "^1.0.0" - browserify-sign "^4.0.0" - create-ecdh "^4.0.0" - create-hash "^1.1.0" - create-hmac "^1.1.0" - diffie-hellman "^5.0.0" - inherits "^2.0.1" - pbkdf2 "^3.0.3" - public-encrypt "^4.0.0" - randombytes "^2.0.0" - -crypto-browserify@^3.11.0: +crypto-browserify@^3.0.0, crypto-browserify@^3.11.0: version "3.12.0" resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" dependencies: @@ -2680,19 +3362,33 @@ crypto-browserify@^3.11.0: randombytes "^2.0.0" randomfill "^1.0.3" -css-color-function@^1.2.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/css-color-function/-/css-color-function-1.3.0.tgz#72c767baf978f01b8a8a94f42f17ba5d22a776fc" +css-blank-pseudo@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/css-blank-pseudo/-/css-blank-pseudo-0.1.4.tgz#dfdefd3254bf8a82027993674ccf35483bfcb3c5" + integrity sha512-LHz35Hr83dnFeipc7oqFDmsjHdljj3TQtxGGiNWSOsTLIAubSm4TEz8qCaKFpk7idaQ1GfWscF4E6mgpBysA1w== dependencies: - balanced-match "0.1.0" - color "^0.11.0" - debug "~0.7.4" - rgb "~0.1.0" + postcss "^7.0.5" -css-color-names@0.0.4: +css-color-names@0.0.4, css-color-names@^0.0.4: version "0.0.4" resolved "https://registry.yarnpkg.com/css-color-names/-/css-color-names-0.0.4.tgz#808adc2e79cf84738069b646cb20ec27beb629e0" +css-declaration-sorter@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz#c198940f63a76d7e36c1e71018b001721054cb22" + integrity sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA== + dependencies: + postcss "^7.0.1" + timsort "^0.3.0" + +css-has-pseudo@^0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/css-has-pseudo/-/css-has-pseudo-0.10.0.tgz#3c642ab34ca242c59c41a125df9105841f6966ee" + integrity sha512-Z8hnfsZu4o/kt+AuFzeGpLVhFOGO9mluyHBaA2bA8aCGTwah5sT3WV/fTHH8UNZUytOIImuGPrl/prlb4oX4qQ== + dependencies: + postcss "^7.0.6" + postcss-selector-parser "^5.0.0-rc.4" + css-loader@^0.23.1: version "0.23.1" resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-0.23.1.tgz#9fa23f2b5c0965235910ad5ecef3b8a36390fe50" @@ -2709,6 +3405,28 @@ css-loader@^0.23.1: postcss-modules-values "^1.1.0" source-list-map "^0.1.4" +css-prefers-color-scheme@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/css-prefers-color-scheme/-/css-prefers-color-scheme-3.1.1.tgz#6f830a2714199d4f0d0d0bb8a27916ed65cff1f4" + integrity sha512-MTu6+tMs9S3EUqzmqLXEcgNRbNkkD/TGFvowpeoWJn5Vfq7FMgsmRQs9X5NXAURiOBmOxm/lLjsDNXDE6k9bhg== + dependencies: + postcss "^7.0.5" + +css-select-base-adapter@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz#3b2ff4972cc362ab88561507a95408a1432135d7" + integrity sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w== + +css-select@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-2.0.2.tgz#ab4386cec9e1f668855564b17c3733b43b2a5ede" + integrity sha512-dSpYaDVoWaELjvZ3mS6IKZM/y2PMPa/XYoEfYNZePL4U/XgyxZNroHEHReDx/d+VgXh9VbCTtFqLkFbmeqeaRQ== + dependencies: + boolbase "^1.0.0" + css-what "^2.1.2" + domutils "^1.7.0" + nth-check "^1.0.2" + css-selector-tokenizer@^0.5.1: version "0.5.4" resolved "https://registry.yarnpkg.com/css-selector-tokenizer/-/css-selector-tokenizer-0.5.4.tgz#139bafd34a35fd0c1428487049e0699e6f6a2c21" @@ -2724,10 +3442,109 @@ css-selector-tokenizer@^0.7.0: fastparse "^1.1.1" regexpu-core "^1.0.0" +css-tree@1.0.0-alpha.28: + version "1.0.0-alpha.28" + resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.28.tgz#8e8968190d886c9477bc8d61e96f61af3f7ffa7f" + integrity sha512-joNNW1gCp3qFFzj4St6zk+Wh/NBv0vM5YbEreZk0SD4S23S+1xBKb6cLDg2uj4P4k/GUMlIm6cKIDqIG+vdt0w== + dependencies: + mdn-data "~1.1.0" + source-map "^0.5.3" + +css-tree@1.0.0-alpha.29: + version "1.0.0-alpha.29" + resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.29.tgz#3fa9d4ef3142cbd1c301e7664c1f352bd82f5a39" + integrity sha512-sRNb1XydwkW9IOci6iB2xmy8IGCj6r/fr+JWitvJ2JxQRPzN3T4AGGVWCMlVmVwM1gtgALJRmGIlWv5ppnGGkg== + dependencies: + mdn-data "~1.1.0" + source-map "^0.5.3" + +css-unit-converter@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/css-unit-converter/-/css-unit-converter-1.1.1.tgz#d9b9281adcfd8ced935bdbaba83786897f64e996" + integrity sha1-2bkoGtz9jO2TW9urqDeGiX9k6ZY= + +css-url-regex@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/css-url-regex/-/css-url-regex-1.1.0.tgz#83834230cc9f74c457de59eebd1543feeb83b7ec" + integrity sha1-g4NCMMyfdMRX3lnuvRVD/uuDt+w= + +css-what@^2.1.2: + version "2.1.3" + resolved "https://registry.yarnpkg.com/css-what/-/css-what-2.1.3.tgz#a6d7604573365fe74686c3f311c56513d88285f2" + integrity sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg== + +cssdb@^4.3.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/cssdb/-/cssdb-4.4.0.tgz#3bf2f2a68c10f5c6a08abd92378331ee803cddb0" + integrity sha512-LsTAR1JPEM9TpGhl/0p3nQecC2LJ0kD8X5YARu1hk/9I1gril5vDtMZyNxcEpxxDj34YNck/ucjuoUd66K03oQ== + cssesc@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-0.1.0.tgz#c814903e45623371a0477b40109aaafbeeaddbb4" +cssesc@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-2.0.0.tgz#3b13bd1bb1cb36e1bcb5a4dcd27f54c5dcb35703" + integrity sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg== + +cssnano-preset-default@^4.0.7: + version "4.0.7" + resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-4.0.7.tgz#51ec662ccfca0f88b396dcd9679cdb931be17f76" + integrity sha512-x0YHHx2h6p0fCl1zY9L9roD7rnlltugGu7zXSKQx6k2rYw0Hi3IqxcoAGF7u9Q5w1nt7vK0ulxV8Lo+EvllGsA== + dependencies: + css-declaration-sorter "^4.0.1" + cssnano-util-raw-cache "^4.0.1" + postcss "^7.0.0" + postcss-calc "^7.0.1" + postcss-colormin "^4.0.3" + postcss-convert-values "^4.0.1" + postcss-discard-comments "^4.0.2" + postcss-discard-duplicates "^4.0.2" + postcss-discard-empty "^4.0.1" + postcss-discard-overridden "^4.0.1" + postcss-merge-longhand "^4.0.11" + postcss-merge-rules "^4.0.3" + postcss-minify-font-values "^4.0.2" + postcss-minify-gradients "^4.0.2" + postcss-minify-params "^4.0.2" + postcss-minify-selectors "^4.0.2" + postcss-normalize-charset "^4.0.1" + postcss-normalize-display-values "^4.0.2" + postcss-normalize-positions "^4.0.2" + postcss-normalize-repeat-style "^4.0.2" + postcss-normalize-string "^4.0.2" + postcss-normalize-timing-functions "^4.0.2" + postcss-normalize-unicode "^4.0.1" + postcss-normalize-url "^4.0.1" + postcss-normalize-whitespace "^4.0.2" + postcss-ordered-values "^4.1.2" + postcss-reduce-initial "^4.0.3" + postcss-reduce-transforms "^4.0.2" + postcss-svgo "^4.0.2" + postcss-unique-selectors "^4.0.1" + +cssnano-util-get-arguments@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz#ed3a08299f21d75741b20f3b81f194ed49cc150f" + integrity sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8= + +cssnano-util-get-match@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz#c0e4ca07f5386bb17ec5e52250b4f5961365156d" + integrity sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0= + +cssnano-util-raw-cache@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz#b26d5fd5f72a11dfe7a7846fb4c67260f96bf282" + integrity sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA== + dependencies: + postcss "^7.0.0" + +cssnano-util-same-parent@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz#574082fb2859d2db433855835d9a8456ea18bbf3" + integrity sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q== + "cssnano@>=2.6.1 <4": version "3.10.0" resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-3.10.0.tgz#4f38f6cea2b9b17fa01490f23f1dc68ea65c1c38" @@ -2765,6 +3582,23 @@ cssesc@^0.1.0: postcss-value-parser "^3.2.3" postcss-zindex "^2.0.1" +cssnano@^4.1.10: + version "4.1.10" + resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-4.1.10.tgz#0ac41f0b13d13d465487e111b778d42da631b8b2" + integrity sha512-5wny+F6H4/8RgNlaqab4ktc3e0/blKutmq8yNlBFXA//nSFFAqAngjNVRzUvCgYROULmZZUoosL/KSoZo5aUaQ== + dependencies: + cosmiconfig "^5.0.0" + cssnano-preset-default "^4.0.7" + is-resolvable "^1.0.0" + postcss "^7.0.0" + +csso@^3.5.1: + version "3.5.1" + resolved "https://registry.yarnpkg.com/csso/-/csso-3.5.1.tgz#7b9eb8be61628973c1b261e169d2f024008e758b" + integrity sha512-vrqULLffYU1Q2tLdJvaCYbONStnfkfimRxXNaGjxMldI0C7JPBC4rB1RyjhfdZ4m1frm8pM9uRPKH3d2knZ8gg== + dependencies: + css-tree "1.0.0-alpha.29" + csso@~2.3.1: version "2.3.2" resolved "https://registry.yarnpkg.com/csso/-/csso-2.3.2.tgz#ddd52c587033f49e94b71fc55569f252e8ff5f85" @@ -2772,13 +3606,15 @@ csso@~2.3.1: clap "^1.0.9" source-map "^0.5.3" -cssom@0.3.x, "cssom@>= 0.3.0 < 0.4.0": - version "0.3.1" - resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.1.tgz#c9e37ef2490e64f6d1baa10fda852257082c25d3" +cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0": + version "0.3.6" + resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.6.tgz#f85206cee04efa841f3c5982a74ba96ab20d65ad" + integrity sha512-DtUeseGk9/GBW0hl0vVPpU22iHL6YB5BUX7ml1hB+GMpo0NX5G4voX3kdWiMSEguFtcW3Vh3djqNF4aIe6ne0A== -"cssstyle@>= 0.2.36 < 0.3.0": - version "0.2.37" - resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-0.2.37.tgz#541097234cb2513c83ceed3acddc27ff27987d54" +cssstyle@^1.0.0: + version "1.2.2" + resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-1.2.2.tgz#427ea4d585b18624f6fdbf9de7a2a1a3ba713077" + integrity sha512-43wY3kl1CVQSvL7wUY1qXkxVGkStjpkDmVjiIKX8R97uhajy8Bybay78uOtqvh7Q5GK75dNPfW0geWjE6qQQow== dependencies: cssom "0.3.x" @@ -2788,14 +3624,14 @@ currently-unhandled@^0.4.1: dependencies: array-find-index "^1.0.1" -cz-conventional-changelog@1.2.0, cz-conventional-changelog@^1.1.6: - version "1.2.0" - resolved "https://registry.yarnpkg.com/cz-conventional-changelog/-/cz-conventional-changelog-1.2.0.tgz#2bca04964c8919b23f3fd6a89ef5e6008b31b3f8" +cz-conventional-changelog@2.1.0, cz-conventional-changelog@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cz-conventional-changelog/-/cz-conventional-changelog-2.1.0.tgz#2f4bc7390e3244e4df293e6ba351e4c740a7c764" + integrity sha1-L0vHOQ4yROTfKT5ro1Hkx0Cnx2Q= dependencies: conventional-commit-types "^2.0.0" lodash.map "^4.5.1" longest "^1.0.1" - pad-right "^0.2.2" right-pad "^1.0.1" word-wrap "^1.0.3" @@ -2803,11 +3639,15 @@ d3@^3.5.8: version "3.5.17" resolved "https://registry.yarnpkg.com/d3/-/d3-3.5.17.tgz#bc46748004378b21a360c9fc7cf5231790762fb8" -d@^0.1.1, d@~0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/d/-/d-0.1.1.tgz#da184c535d18d8ee7ba2aa229b914009fae11309" - dependencies: - es5-ext "~0.10.2" +damerau-levenshtein@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.5.tgz#780cf7144eb2e8dbd1c3bb83ae31100ccc31a414" + integrity sha512-CBCRqFnpu715iPmw1KrdOrzRqbdFwQTwAWyyyYS42+iAgHCuXZ+/TdMgQkUENPomxEz9z1BEzuQU2Xw0kUuAgA== + +dash-ast@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/dash-ast/-/dash-ast-1.0.0.tgz#12029ba5fb2f8aa6f0a861795b23c1b4b6c27d37" + integrity sha512-Vy4dx7gquTeMcQR/hDkYLGUnwVil6vk4FOOct+djUnHOUWt+zJPJAaRIXaAFkPXtJjvlY7o3rfRu0/3hpnwoUA== dashdash@^1.12.0: version "1.14.0" @@ -2815,9 +3655,14 @@ dashdash@^1.12.0: dependencies: assert-plus "^1.0.0" -date-now@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/date-now/-/date-now-1.0.1.tgz#bb7d086438debe4182a485fb3df3fbfb99d6153c" +data-urls@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-1.1.0.tgz#15ee0582baa5e22bb59c77140da8f9c76963bbfe" + integrity sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ== + dependencies: + abab "^2.0.0" + whatwg-mimetype "^2.2.0" + whatwg-url "^7.0.0" date-now@^0.1.4: version "0.1.4" @@ -2831,30 +3676,35 @@ dateformat@^1.0.11: meow "^3.3.0" debounce@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/debounce/-/debounce-1.0.0.tgz#0948af513d2e4ce407916f8506a423d3f9cf72d8" - dependencies: - date-now "1.0.1" - -debug-log@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/debug-log/-/debug-log-1.0.1.tgz#2307632d4c04382b8df8a32f70b895046d52745f" + version "1.2.0" + resolved "https://registry.yarnpkg.com/debounce/-/debounce-1.2.0.tgz#44a540abc0ea9943018dc0eaa95cce87f65cd131" + integrity sha512-mYtLl1xfZLi1m4RtQYlZgJUNQjl4ZxVnHzIR8nLLgi4q1YT8o/WM+MK/f8yfcc9s5Ir5zRaPZyZU6xs1Syoocg== -debug@2, debug@^2.1.1, debug@^2.2.0, debug@^2.5.1: +debug@2, debug@^2.2.0, debug@^2.5.1: version "2.5.1" resolved "https://registry.yarnpkg.com/debug/-/debug-2.5.1.tgz#9107bb4a506052ec2a02314bc606313ed2b921c1" dependencies: ms "0.7.2" -debug@^2.1.2, debug@^2.3.3, debug@^2.6.8, debug@^2.6.9: +debug@2.6.9, debug@^2.1.2, debug@^2.3.3, debug@^2.6.8, debug@^2.6.9: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" dependencies: ms "2.0.0" -debug@~0.7.4: - version "0.7.4" - resolved "https://registry.yarnpkg.com/debug/-/debug-0.7.4.tgz#06e1ea8082c2cb14e39806e22e2f6f757f92af39" +debug@^3.1.0, debug@^3.2.6: + version "3.2.6" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" + integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== + dependencies: + ms "^2.1.1" + +debug@^4.0.1, debug@^4.1.0, debug@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" + integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== + dependencies: + ms "^2.1.1" debug@~2.2.0: version "2.2.0" @@ -2862,7 +3712,7 @@ debug@~2.2.0: dependencies: ms "0.7.1" -decamelize@^1.0.0, decamelize@^1.1.1, decamelize@^1.1.2: +decamelize@^1.0.0, decamelize@^1.1.1, decamelize@^1.1.2, decamelize@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" @@ -2870,9 +3720,10 @@ decode-uri-component@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" -dedent@0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.6.0.tgz#0e6da8f0ce52838ef5cec5c8f9396b0c1b64a3cb" +dedent@0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" + integrity sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw= deep-extend@^0.6.0: version "0.6.0" @@ -2885,6 +3736,22 @@ deep-extend@~0.4.0: deep-is@~0.1.3: version "0.1.3" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" + integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= + +default-gateway@^2.6.0: + version "2.7.2" + resolved "https://registry.yarnpkg.com/default-gateway/-/default-gateway-2.7.2.tgz#b7ef339e5e024b045467af403d50348db4642d0f" + integrity sha512-lAc4i9QJR0YHSDFdzeBQKfZ1SRDG3hsJNEkrpcZa8QhBfidLAilT60BDEIVUUGqosFp425KOgB3uYqcnQrWafQ== + dependencies: + execa "^0.10.0" + ip-regex "^2.1.0" + +define-properties@^1.1.2, define-properties@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" + integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== + dependencies: + object-keys "^1.0.12" define-property@^0.2.5: version "0.2.5" @@ -2909,29 +3776,6 @@ defined@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693" -deglob@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/deglob/-/deglob-2.0.0.tgz#dd087aa2971a0b1feeea66483c2c82685c73be86" - dependencies: - find-root "^1.0.0" - glob "^7.0.5" - ignore "^3.0.9" - pkg-config "^1.1.0" - run-parallel "^1.1.2" - uniq "^1.0.1" - -del@^2.0.2: - version "2.2.2" - resolved "https://registry.yarnpkg.com/del/-/del-2.2.2.tgz#c12c981d067846c84bcaf862cff930d907ffd1a8" - dependencies: - globby "^5.0.0" - is-path-cwd "^1.0.0" - is-path-in-cwd "^1.0.0" - object-assign "^4.0.1" - pify "^2.0.0" - pinkie-promise "^2.0.0" - rimraf "^2.2.8" - delayed-stream@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" @@ -2940,13 +3784,15 @@ delegates@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" -depd@~1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.0.tgz#e1bd82c6aab6ced965b97b88b17ed3e528ca18c3" +depd@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" + integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= deps-sort@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/deps-sort/-/deps-sort-2.0.0.tgz#091724902e84658260eb910748cccd1af6e21fb5" + integrity sha1-CRckkC6EZYJg65EHSMzNGvbiH7U= dependencies: JSONStream "^1.0.3" shasum "^1.0.0" @@ -2963,31 +3809,41 @@ des.js@^1.0.0: destroy@~1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" + integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= + +detect-file@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-1.0.0.tgz#f0d66d03672a825cb1b73bdb3fe62310c8e552b7" + integrity sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc= -detect-indent@4.0.0, detect-indent@^4.0.0: +detect-indent@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" dependencies: repeating "^2.0.0" -detect-indent@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-3.0.1.tgz#9dc5e5ddbceef8325764b9451b02bc6d54084f75" - dependencies: - get-stdin "^4.0.1" - minimist "^1.1.0" - repeating "^1.1.0" +detect-indent@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-5.0.0.tgz#3871cc0a6a002e8c3e5b3cf7f336264675f06b9d" + integrity sha1-OHHMCmoALow+Wzz38zYmRnXwa50= detect-libc@^1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" -detective@^4.0.0: - version "4.3.1" - resolved "https://registry.yarnpkg.com/detective/-/detective-4.3.1.tgz#9fb06dd1ee8f0ea4dbcc607cda39d9ce1d4f726f" +detect-newline@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-2.1.0.tgz#f41f1c10be4b00e87b5f13da680759f2c5bfd3e2" + integrity sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I= + +detective@^5.0.2: + version "5.2.0" + resolved "https://registry.yarnpkg.com/detective/-/detective-5.2.0.tgz#feb2a77e85b904ecdea459ad897cc90a99bd2a7b" + integrity sha512-6SsIx+nUUbuK0EthKjv0zrdnajCCXVYGmbYYiYjFVpzcjwEs/JMDZ8tPRG29J/HhN56t3GJp2cGSWDRjjot8Pg== dependencies: - acorn "^1.0.3" + acorn-node "^1.6.1" defined "^1.0.0" + minimist "^1.1.1" dezalgo@^1.0.1: version "1.0.3" @@ -2996,9 +3852,10 @@ dezalgo@^1.0.1: asap "^2.0.0" wrappy "1" -diff@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/diff/-/diff-3.0.1.tgz#a52d90cc08956994be00877bff97110062582c35" +diff-sequences@^24.3.0: + version "24.3.0" + resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-24.3.0.tgz#0f20e8a1df1abddaf4d9c226680952e64118b975" + integrity sha512-xLqpez+Zj9GKSnPWS0WZw1igGocZ+uua8+y+5dDNTT934N3QuY1sp2LkHzwiaYQGz60hMq0pjAshdeXm5VUOEw== diffie-hellman@^5.0.0: version "5.0.2" @@ -3008,24 +3865,76 @@ diffie-hellman@^5.0.0: miller-rabin "^4.0.0" randombytes "^2.0.0" -doctrine@^1.2.2: - version "1.4.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-1.4.0.tgz#e2db32defa752407b935b381e89f3740e469e599" +dlv@^1.1.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/dlv/-/dlv-1.1.3.tgz#5c198a8a11453596e751494d49874bc7732f2e79" + integrity sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA== + +doctrine@1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa" + integrity sha1-N53Ocw9hZvds76TmcHoVmwLFpvo= dependencies: esutils "^2.0.2" isarray "^1.0.0" -domain-browser@^1.1.1: +doctrine@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" + integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== + dependencies: + esutils "^2.0.2" + +doctrine@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" + integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== + dependencies: + esutils "^2.0.2" + +dom-serializer@0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.1.1.tgz#1ec4059e284babed36eec2941d4a970a189ce7c0" + integrity sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA== + dependencies: + domelementtype "^1.3.0" + entities "^1.1.1" + +domain-browser@^1.1.1, domain-browser@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" -domain-browser@~1.1.0: - version "1.1.7" - resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.1.7.tgz#867aa4b093faa05f1de08c06f4d7b21fdf8698bc" +domelementtype@1, domelementtype@^1.3.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.1.tgz#d048c44b37b0d10a7f2a3d5fee3f4333d790481f" + integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w== + +domexception@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/domexception/-/domexception-1.0.1.tgz#937442644ca6a31261ef36e3ec677fe805582c90" + integrity sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug== + dependencies: + webidl-conversions "^4.0.2" + +domutils@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a" + integrity sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg== + dependencies: + dom-serializer "0" + domelementtype "1" + +dot-prop@^4.1.1: + version "4.2.0" + resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.2.0.tgz#1f19e0c2e1aa0e32797c49799f2837ac6af69c57" + integrity sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ== + dependencies: + is-obj "^1.0.0" duplexer2@^0.1.2, duplexer2@~0.1.0, duplexer2@~0.1.2: version "0.1.4" resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.1.4.tgz#8b12dab878c0d69e3e7891051662a32fc6bddcc1" + integrity sha1-ixLauHjA1p4+eJEFFmKjL8a93ME= dependencies: readable-stream "^2.0.2" @@ -3042,11 +3951,17 @@ ecc-jsbn@~0.1.1: ee-first@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= electron-to-chromium@^1.2.7: version "1.3.50" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.50.tgz#7438b76f92b41b919f3fbdd350fbd0757dacddf7" +electron-to-chromium@^1.3.150: + version "1.3.164" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.164.tgz#8680b875577882c1572c42218d53fa9ba5f71d5d" + integrity sha512-VLlalqUeduN4+fayVtRZvGP2Hl1WrRxlwzh2XVVMJym3IFrQUS29BFQ1GP/BxOJXJI1OFCrJ5BnFEsAe8NHtOg== + elliptic@^6.0.0: version "6.3.2" resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.3.2.tgz#e4c81e0829cf0a65ab70e998b8232723b5c1bc48" @@ -3056,20 +3971,34 @@ elliptic@^6.0.0: hash.js "^1.0.0" inherits "^2.0.1" +emoji-regex@^7.0.1, emoji-regex@^7.0.2: + version "7.0.3" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" + integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== + emojis-list@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389" -encodeurl@~1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.1.tgz#79e3d58655346909fe6f0f45a5de68103b294d20" +encodeurl@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= encoding@^0.1.11: version "0.1.12" resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.12.tgz#538b66f3ee62cd1ab51ec323829d1f9480c74beb" + integrity sha1-U4tm8+5izRq1HsMjgp0flIDHS+s= dependencies: iconv-lite "~0.4.13" +end-of-stream@^1.1.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.1.tgz#ed29634d19baba463b6ce6b80a37213eab71ec43" + integrity sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q== + dependencies: + once "^1.4.0" + enhanced-resolve@^3.3.0: version "3.4.1" resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-3.4.1.tgz#0421e339fd71419b3da13d129b3979040230476e" @@ -3079,18 +4008,18 @@ enhanced-resolve@^3.3.0: object-assign "^4.0.1" tapable "^0.2.7" -envify@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/envify/-/envify-4.0.0.tgz#f791343e3d11cc29cce41150300a8af61c66cab0" - dependencies: - esprima "~3.1.0" - through "~2.3.4" +entities@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.2.tgz#bdfa735299664dfafd34529ed4f8522a275fea56" + integrity sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w== -"errno@>=0.1.1 <0.2.0-0": - version "0.1.4" - resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.4.tgz#b896e23a9e5e8ba33871fc996abd3635fc9a1c7d" +envify@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/envify/-/envify-4.1.0.tgz#f39ad3db9d6801b4e6b478b61028d3f0b6819f7e" + integrity sha512-IKRVVoAYr4pIx4yIWNsz9mOsboxlNXiu7TNBnem/K/uTHdkyzXWDzHCK7UTolqBbgaBz0tQHsD3YNls0uIIjiw== dependencies: - prr "~0.0.0" + esprima "^4.0.0" + through "~2.3.4" errno@^0.1.3: version "0.1.7" @@ -3104,199 +4033,355 @@ error-ex@^1.2.0: dependencies: is-arrayish "^0.2.1" +error-ex@^1.3.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + dependencies: + is-arrayish "^0.2.1" + errorify@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/errorify/-/errorify-0.3.1.tgz#53e0aaeeb18adc3e55f9f1eb4e2d95929f41b79b" + integrity sha1-U+Cq7rGK3D5V+fHrTi2Vkp9Bt5s= -es5-ext@^0.10.7, es5-ext@^0.10.8, es5-ext@~0.10.11, es5-ext@~0.10.2, es5-ext@~0.10.7: - version "0.10.12" - resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.12.tgz#aa84641d4db76b62abba5e45fd805ecbab140047" - dependencies: - es6-iterator "2" - es6-symbol "~3.1" - -es6-iterator@2: - version "2.0.0" - resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.0.tgz#bd968567d61635e33c0b80727613c9cb4b096bac" - dependencies: - d "^0.1.1" - es5-ext "^0.10.7" - es6-symbol "3" - -es6-map@^0.1.3: - version "0.1.4" - resolved "https://registry.yarnpkg.com/es6-map/-/es6-map-0.1.4.tgz#a34b147be224773a4d7da8072794cefa3632b897" - dependencies: - d "~0.1.1" - es5-ext "~0.10.11" - es6-iterator "2" - es6-set "~0.1.3" - es6-symbol "~3.1.0" - event-emitter "~0.3.4" - -es6-set@~0.1.3: - version "0.1.4" - resolved "https://registry.yarnpkg.com/es6-set/-/es6-set-0.1.4.tgz#9516b6761c2964b92ff479456233a247dc707ce8" +es-abstract@^1.11.0, es-abstract@^1.12.0, es-abstract@^1.5.1, es-abstract@^1.7.0: + version "1.13.0" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.13.0.tgz#ac86145fdd5099d8dd49558ccba2eaf9b88e24e9" + integrity sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg== dependencies: - d "~0.1.1" - es5-ext "~0.10.11" - es6-iterator "2" - es6-symbol "3" - event-emitter "~0.3.4" + es-to-primitive "^1.2.0" + function-bind "^1.1.1" + has "^1.0.3" + is-callable "^1.1.4" + is-regex "^1.0.4" + object-keys "^1.0.12" -es6-symbol@3, es6-symbol@~3.1, es6-symbol@~3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.0.tgz#94481c655e7a7cad82eba832d97d5433496d7ffa" +es-to-primitive@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.0.tgz#edf72478033456e8dda8ef09e00ad9650707f377" + integrity sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg== dependencies: - d "~0.1.1" - es5-ext "~0.10.11" + is-callable "^1.1.4" + is-date-object "^1.0.1" + is-symbol "^1.0.2" -es6-weak-map@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-2.0.1.tgz#0d2bbd8827eb5fb4ba8f97fbfea50d43db21ea81" - dependencies: - d "^0.1.1" - es5-ext "^0.10.8" - es6-iterator "2" - es6-symbol "3" +es6-promisify@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/es6-promisify/-/es6-promisify-6.0.1.tgz#6edaa45f3bd570ffe08febce66f7116be4b1cdb6" + integrity sha512-J3ZkwbEnnO+fGAKrjVpeUAnZshAdfZvbhQpqfIH9kSAspReRC4nJnu8ewm55b4y9ElyeuhCTzJD0XiH8Tsbhlw== -escape-html@~1.0.3: +escape-html@^1.0.3, escape-html@~1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= escape-string-regexp@^1.0.0, escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" -escodegen@1.8.x, escodegen@^1.6.1: - version "1.8.1" - resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.8.1.tgz#5a5b53af4693110bebb0867aa3430dd3b70a1018" +escodegen@^1.9.1: + version "1.11.1" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.11.1.tgz#c485ff8d6b4cdb89e27f4a856e91f118401ca510" + integrity sha512-JwiqFD9KdGVVpeuRa68yU3zZnBEOcPs0nKW7wZzXky8Z7tffdYUHbe11bPCV5jYlK6DVdKLWLm0f5I/QlL0Kmw== dependencies: - esprima "^2.7.1" - estraverse "^1.9.1" + esprima "^3.1.3" + estraverse "^4.2.0" esutils "^2.0.2" optionator "^0.8.1" optionalDependencies: - source-map "~0.2.0" + source-map "~0.6.1" -escope@^3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/escope/-/escope-3.6.0.tgz#e01975e812781a163a6dadfdd80398dc64c889c3" +eslint-config-standard-jsx@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/eslint-config-standard-jsx/-/eslint-config-standard-jsx-6.0.2.tgz#90c9aa16ac2c4f8970c13fc7efc608bacd02da70" + integrity sha512-D+YWAoXw+2GIdbMBRAzWwr1ZtvnSf4n4yL0gKGg7ShUOGXkSOLerI17K4F6LdQMJPNMoWYqepzQD/fKY+tXNSg== + +eslint-config-standard@^12.0.0: + version "12.0.0" + resolved "https://registry.yarnpkg.com/eslint-config-standard/-/eslint-config-standard-12.0.0.tgz#638b4c65db0bd5a41319f96bba1f15ddad2107d9" + integrity sha512-COUz8FnXhqFitYj4DTqHzidjIL/t4mumGZto5c7DrBpvWoie+Sn3P4sLEzUGeYhRElWuFEf8K1S1EfvD1vixCQ== + +eslint-import-resolver-node@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.2.tgz#58f15fb839b8d0576ca980413476aab2472db66a" + integrity sha512-sfmTqJfPSizWu4aymbPr4Iidp5yKm8yDkHp+Ir3YiTHiiDfxh69mOUsmiqW6RZ9zRXFaF64GtYmN7e+8GHBv6Q== dependencies: - es6-map "^0.1.3" - es6-weak-map "^2.0.1" - esrecurse "^4.1.0" - estraverse "^4.1.1" + debug "^2.6.9" + resolve "^1.5.0" -eslint-config-standard-jsx@3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/eslint-config-standard-jsx/-/eslint-config-standard-jsx-3.2.0.tgz#c240e26ed919a11a42aa4de8059472b38268d620" +eslint-module-utils@^2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.4.0.tgz#8b93499e9b00eab80ccb6614e69f03678e84e09a" + integrity sha512-14tltLm38Eu3zS+mt0KvILC3q8jyIAH518MlG+HO0p+yK885Lb1UHTY/UgR91eOyGdmxAPb+OLoW4znqIT6Ndw== + dependencies: + debug "^2.6.8" + pkg-dir "^2.0.0" -eslint-config-standard@6.2.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/eslint-config-standard/-/eslint-config-standard-6.2.0.tgz#1d2384ee074de6f6b6c0f2bbe976863032565aee" +eslint-plugin-es@^1.3.1: + version "1.4.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-es/-/eslint-plugin-es-1.4.0.tgz#475f65bb20c993fc10e8c8fe77d1d60068072da6" + integrity sha512-XfFmgFdIUDgvaRAlaXUkxrRg5JSADoRC8IkKLc/cISeR3yHVMefFHQZpcyXXEUUPHfy5DwviBcrfqlyqEwlQVw== + dependencies: + eslint-utils "^1.3.0" + regexpp "^2.0.1" -eslint-plugin-promise@~3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-promise/-/eslint-plugin-promise-3.0.0.tgz#1528635d0160f3484e425cce2169cb74cec0186a" +eslint-plugin-flowtype@^3.4.2: + version "3.10.3" + resolved "https://registry.yarnpkg.com/eslint-plugin-flowtype/-/eslint-plugin-flowtype-3.10.3.tgz#4a249e2fa98679d87cddbc00e22241e2466abe2e" + integrity sha512-b1OzI5drhiDmIG52jiZVR7IWQkiwN1vLD+VqvYuLnpzGBwfdw/mjdXz+qN7XN1IVKQ6pUSV0t4F9TxKoJNkpRA== + dependencies: + lodash "^4.17.11" -eslint-plugin-react@~6.4.1: - version "6.4.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-6.4.1.tgz#7d1aade747db15892f71eee1fea4addf97bcfa2b" +eslint-plugin-import@^2.16.0: + version "2.17.3" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.17.3.tgz#00548b4434c18faebaba04b24ae6198f280de189" + integrity sha512-qeVf/UwXFJbeyLbxuY8RgqDyEKCkqV7YC+E5S5uOjAp4tOc8zj01JP3ucoBM8JcEqd1qRasJSg6LLlisirfy0Q== dependencies: - doctrine "^1.2.2" - jsx-ast-utils "^1.3.1" + array-includes "^3.0.3" + contains-path "^0.1.0" + debug "^2.6.9" + doctrine "1.5.0" + eslint-import-resolver-node "^0.3.2" + eslint-module-utils "^2.4.0" + has "^1.0.3" + lodash "^4.17.11" + minimatch "^3.0.4" + read-pkg-up "^2.0.0" + resolve "^1.11.0" -eslint-plugin-standard@~2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-standard/-/eslint-plugin-standard-2.0.1.tgz#3589699ff9c917f2c25f76a916687f641c369ff3" +eslint-plugin-jest@^22.3.0: + version "22.6.4" + resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-22.6.4.tgz#2895b047dd82f90f43a58a25cf136220a21c9104" + integrity sha512-36OqnZR/uMCDxXGmTsqU4RwllR0IiB/XF8GW3ODmhsjiITKuI0GpgultWFt193ipN3HARkaIcKowpE6HBvRHNg== + +eslint-plugin-jsx-a11y@^6.2.1: + version "6.2.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.2.1.tgz#4ebba9f339b600ff415ae4166e3e2e008831cf0c" + integrity sha512-cjN2ObWrRz0TTw7vEcGQrx+YltMvZoOEx4hWU8eEERDnBIU00OTq7Vr+jA7DFKxiwLNv4tTh5Pq2GUNEa8b6+w== + dependencies: + aria-query "^3.0.0" + array-includes "^3.0.3" + ast-types-flow "^0.0.7" + axobject-query "^2.0.2" + damerau-levenshtein "^1.0.4" + emoji-regex "^7.0.2" + has "^1.0.3" + jsx-ast-utils "^2.0.1" + +eslint-plugin-node@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-node/-/eslint-plugin-node-8.0.1.tgz#55ae3560022863d141fa7a11799532340a685964" + integrity sha512-ZjOjbjEi6jd82rIpFSgagv4CHWzG9xsQAVp1ZPlhRnnYxcTgENUVBvhYmkQ7GvT1QFijUSo69RaiOJKhMu6i8w== + dependencies: + eslint-plugin-es "^1.3.1" + eslint-utils "^1.3.1" + ignore "^5.0.2" + minimatch "^3.0.4" + resolve "^1.8.1" + semver "^5.5.0" -eslint@~3.7.1: +eslint-plugin-promise@^4.0.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-promise/-/eslint-plugin-promise-4.1.1.tgz#1e08cb68b5b2cd8839f8d5864c796f56d82746db" + integrity sha512-faAHw7uzlNPy7b45J1guyjazw28M+7gJokKUjC5JSFoYfUEyy6Gw/i7YQvmv2Yk00sUjWcmzXQLpU1Ki/C2IZQ== + +eslint-plugin-react@^7.12.4: + version "7.13.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.13.0.tgz#bc13fd7101de67996ea51b33873cd9dc2b7e5758" + integrity sha512-uA5LrHylu8lW/eAH3bEQe9YdzpPaFd9yAJTwTi/i/BKTD7j6aQMKVAdGM/ML72zD6womuSK7EiGtMKuK06lWjQ== + dependencies: + array-includes "^3.0.3" + doctrine "^2.1.0" + has "^1.0.3" + jsx-ast-utils "^2.1.0" + object.fromentries "^2.0.0" + prop-types "^15.7.2" + resolve "^1.10.1" + +eslint-plugin-standard@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-standard/-/eslint-plugin-standard-4.0.0.tgz#f845b45109c99cd90e77796940a344546c8f6b5c" + integrity sha512-OwxJkR6TQiYMmt1EsNRMe5qG3GsbjlcOhbGUBY4LtavF9DsLaTcoR+j2Tdjqi23oUwKNUqX7qcn5fPStafMdlA== + +eslint-scope@3.7.1: version "3.7.1" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-3.7.1.tgz#7faa84599e0fea422f04bc32db49054051a3f11a" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-3.7.1.tgz#3d63c3edfda02e06e01a452ad88caacc7cdcb6e8" + integrity sha1-PWPD7f2gLgbgGkUq2IyqzHzctug= dependencies: - chalk "^1.1.3" - concat-stream "^1.4.6" - debug "^2.1.1" - doctrine "^1.2.2" - escope "^3.6.0" - espree "^3.3.1" - estraverse "^4.2.0" + esrecurse "^4.1.0" + estraverse "^4.1.1" + +eslint-scope@^3.7.1: + version "3.7.3" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-3.7.3.tgz#bb507200d3d17f60247636160b4826284b108535" + integrity sha512-W+B0SvF4gamyCTmUc+uITPY0989iXVfKvhwtmJocTaYoc/3khEHmEmvfY/Gn9HA9VV75jrQECsHizkNw1b68FA== + dependencies: + esrecurse "^4.1.0" + estraverse "^4.1.1" + +eslint-scope@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.3.tgz#ca03833310f6889a3264781aa82e63eb9cfe7848" + integrity sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg== + dependencies: + esrecurse "^4.1.0" + estraverse "^4.1.1" + +eslint-utils@^1.3.0, eslint-utils@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.3.1.tgz#9a851ba89ee7c460346f97cf8939c7298827e512" + integrity sha512-Z7YjnIldX+2XMcjr7ZkgEsOj/bREONV60qYeB/bjMAqqqZ4zxKyWX+BOUkdmRmA9riiIPVvo5x86m5elviOk0Q== + +eslint-visitor-keys@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#3f3180fb2e291017716acb4c9d6d5b5c34a6a81d" + integrity sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ== + +eslint@^4.0.0, eslint@^4.5.0: + version "4.19.1" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-4.19.1.tgz#32d1d653e1d90408854bfb296f076ec7e186a300" + integrity sha512-bT3/1x1EbZB7phzYu7vCr1v3ONuzDtX8WjuM9c0iYxe+cq+pwcKEoQjl7zd3RpC6YOLgnSy3cTN58M2jcoPDIQ== + dependencies: + ajv "^5.3.0" + babel-code-frame "^6.22.0" + chalk "^2.1.0" + concat-stream "^1.6.0" + cross-spawn "^5.1.0" + debug "^3.1.0" + doctrine "^2.1.0" + eslint-scope "^3.7.1" + eslint-visitor-keys "^1.0.0" + espree "^3.5.4" + esquery "^1.0.0" esutils "^2.0.2" file-entry-cache "^2.0.0" - glob "^7.0.3" - globals "^9.2.0" - ignore "^3.1.5" + functional-red-black-tree "^1.0.1" + glob "^7.1.2" + globals "^11.0.1" + ignore "^3.3.3" imurmurhash "^0.1.4" - inquirer "^0.12.0" - is-my-json-valid "^2.10.0" + inquirer "^3.0.6" is-resolvable "^1.0.0" - js-yaml "^3.5.1" - json-stable-stringify "^1.0.0" + js-yaml "^3.9.1" + json-stable-stringify-without-jsonify "^1.0.1" levn "^0.3.0" - lodash "^4.0.0" - mkdirp "^0.5.0" + lodash "^4.17.4" + minimatch "^3.0.2" + mkdirp "^0.5.1" natural-compare "^1.4.0" - optionator "^0.8.1" - path-is-inside "^1.0.1" - pluralize "^1.2.1" - progress "^1.1.8" - require-uncached "^1.0.2" - shelljs "^0.6.0" - strip-bom "^3.0.0" - strip-json-comments "~1.0.1" - table "^3.7.8" + optionator "^0.8.2" + path-is-inside "^1.0.2" + pluralize "^7.0.0" + progress "^2.0.0" + regexpp "^1.0.1" + require-uncached "^1.0.3" + semver "^5.3.0" + strip-ansi "^4.0.0" + strip-json-comments "~2.0.1" + table "4.0.2" text-table "~0.2.0" - user-home "^2.0.0" -espree@^3.3.1: - version "3.3.2" - resolved "https://registry.yarnpkg.com/espree/-/espree-3.3.2.tgz#dbf3fadeb4ecb4d4778303e50103b3d36c88b89c" - dependencies: - acorn "^4.0.1" +eslint@^5.15.1: + version "5.16.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-5.16.0.tgz#a1e3ac1aae4a3fbd8296fcf8f7ab7314cbb6abea" + integrity sha512-S3Rz11i7c8AA5JPv7xAH+dOyq/Cu/VXHiHXBPOU1k/JAM5dXqQPt3qcrhpHSorXmrpu2g0gkIBVXAqCpzfoZIg== + dependencies: + "@babel/code-frame" "^7.0.0" + ajv "^6.9.1" + chalk "^2.1.0" + cross-spawn "^6.0.5" + debug "^4.0.1" + doctrine "^3.0.0" + eslint-scope "^4.0.3" + eslint-utils "^1.3.1" + eslint-visitor-keys "^1.0.0" + espree "^5.0.1" + esquery "^1.0.1" + esutils "^2.0.2" + file-entry-cache "^5.0.1" + functional-red-black-tree "^1.0.1" + glob "^7.1.2" + globals "^11.7.0" + ignore "^4.0.6" + import-fresh "^3.0.0" + imurmurhash "^0.1.4" + inquirer "^6.2.2" + js-yaml "^3.13.0" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.3.0" + lodash "^4.17.11" + minimatch "^3.0.4" + mkdirp "^0.5.1" + natural-compare "^1.4.0" + optionator "^0.8.2" + path-is-inside "^1.0.2" + progress "^2.0.0" + regexpp "^2.0.1" + semver "^5.5.1" + strip-ansi "^4.0.0" + strip-json-comments "^2.0.1" + table "^5.2.3" + text-table "^0.2.0" + +espree@^3.5.2, espree@^3.5.4: + version "3.5.4" + resolved "https://registry.yarnpkg.com/espree/-/espree-3.5.4.tgz#b0f447187c8a8bed944b815a660bddf5deb5d1a7" + integrity sha512-yAcIQxtmMiB/jL32dzEp2enBeidsB7xWPLNiw3IIkpVds1P+h7qF9YwJq1yUNzp2OKXgAprs4F61ih66UsoD1A== + dependencies: + acorn "^5.5.0" acorn-jsx "^3.0.0" -esprima@2.7.x, esprima@^2.6.0, esprima@^2.7.1, esprima@~2.7.0: +espree@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-5.0.1.tgz#5d6526fa4fc7f0788a5cf75b15f30323e2f81f7a" + integrity sha512-qWAZcWh4XE/RwzLJejfcofscgMc9CamR6Tn1+XRXNzrvUSSbiAjGOI/fggztjIi7y9VLPqnICMIPiGyr8JaZ0A== + dependencies: + acorn "^6.0.7" + acorn-jsx "^5.0.0" + eslint-visitor-keys "^1.0.0" + +esprima@^2.6.0: version "2.7.3" resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" -esprima@~3.1.0: - version "3.1.2" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.2.tgz#954b5d19321ca436092fa90f06d6798531fe8184" +esprima@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633" + integrity sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM= -esrecurse@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.1.0.tgz#4713b6536adf7f2ac4f327d559e7756bff648220" +esprima@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + +esquery@^1.0.0, esquery@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.1.tgz#406c51658b1f5991a5f9b62b1dc25b00e3e5c708" + integrity sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA== dependencies: - estraverse "~4.1.0" - object-assign "^4.0.1" + estraverse "^4.0.0" -estraverse@^1.9.1: - version "1.9.3" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-1.9.3.tgz#af67f2dc922582415950926091a4005d29c9bb44" +esrecurse@^4.1.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf" + integrity sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ== + dependencies: + estraverse "^4.1.0" -estraverse@^4.1.1, estraverse@^4.2.0: +estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" - -estraverse@~4.1.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.1.1.tgz#f6caca728933a850ef90661d0e17982ba47111a2" + integrity sha1-De4/7TH81GlhjOc0IJn8GvoL2xM= esutils@^2.0.0, esutils@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" -etag@~1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/etag/-/etag-1.7.0.tgz#03d30b5f67dd6e632d2945d30d6652731a34d5d8" - -event-emitter@~0.3.4: - version "0.3.4" - resolved "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.3.4.tgz#8d63ddfb4cfe1fae3b32ca265c4c720222080bb5" - dependencies: - d "~0.1.1" - es5-ext "~0.10.7" +etag@~1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= event-stream@^3.3.0: version "3.3.4" @@ -3310,37 +4395,79 @@ event-stream@^3.3.0: stream-combiner "~0.0.4" through "~2.3.1" -eventemitter3@1.x.x: - version "1.2.0" - resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-1.2.0.tgz#1c86991d816ad1e504750e73874224ecf3bec508" - -events@^1.0.0, events@^1.0.2, events@~1.1.0: +events@1.1.1, events@^1.0.0, events@^1.0.2: version "1.1.1" resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924" +events@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/events/-/events-2.1.0.tgz#2a9a1e18e6106e0e812aa9ebd4a819b3c29c0ba5" + integrity sha512-3Zmiobend8P9DjmKAty0Era4jV8oJ0yGYe2nJJAxgymF9+N8F2m0hhZiMoWtcfepExzNKZumFU3ksdQbInGWCg== + evp_bytestokey@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.0.tgz#497b66ad9fef65cd7c08a6180824ba1476b66e53" dependencies: create-hash "^1.1.1" -exec-sh@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.2.0.tgz#14f75de3f20d286ef933099b2ce50a90359cef10" - dependencies: - merge "^1.1.3" +exec-sh@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.3.2.tgz#6738de2eb7c8e671d0366aea0b0db8c6f7d7391b" + integrity sha512-9sLAvzhI5nc8TpuQUh4ahMdCrWT00wPWz7j47/emR5+2qEfoZP5zzUXvx+vdx+H6ohhnsYC31iX04QLYJK8zTg== -exit-hook@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/exit-hook/-/exit-hook-1.1.1.tgz#f05ca233b48c05d54fff07765df8507e95c02ff8" +execa@^0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-0.10.0.tgz#ff456a8f53f90f8eccc71a96d11bdfc7f082cb50" + integrity sha512-7XOMnz8Ynx1gGo/3hyV9loYNPWM94jG3+3T3Y8tsfSstFmETmENCMU/A/zj8Lyaj1lkgEepKepvd6240tBRvlw== + dependencies: + cross-spawn "^6.0.0" + get-stream "^3.0.0" + is-stream "^1.1.0" + npm-run-path "^2.0.0" + p-finally "^1.0.0" + signal-exit "^3.0.0" + strip-eof "^1.0.0" -exorcist@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/exorcist/-/exorcist-0.4.0.tgz#1230ffdedd9248f42fbccf8b4a44d4cab29e3c64" +execa@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777" + integrity sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c= + dependencies: + cross-spawn "^5.0.1" + get-stream "^3.0.0" + is-stream "^1.1.0" + npm-run-path "^2.0.0" + p-finally "^1.0.0" + signal-exit "^3.0.0" + strip-eof "^1.0.0" + +execa@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" + integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA== + dependencies: + cross-spawn "^6.0.0" + get-stream "^4.0.0" + is-stream "^1.1.0" + npm-run-path "^2.0.0" + p-finally "^1.0.0" + signal-exit "^3.0.0" + strip-eof "^1.0.0" + +exit@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" + integrity sha1-BjJjj42HfMghB9MKD/8aF8uhzQw= + +exorcist@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/exorcist/-/exorcist-1.0.1.tgz#79316e3c4885845490f7bb405c0e5b5db1167c52" + integrity sha1-eTFuPEiFhFSQ97tAXA5bXbEWfFI= dependencies: + is-stream "~1.1.0" minimist "0.0.5" + mkdirp "~0.5.1" mold-source-map "~0.4.0" - nave "~0.5.1" expand-brackets@^0.1.4: version "0.1.5" @@ -3366,6 +4493,25 @@ expand-range@^1.8.1: dependencies: fill-range "^2.1.0" +expand-tilde@^2.0.0, expand-tilde@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-2.0.2.tgz#97e801aa052df02454de46b02bf621642cdc8502" + integrity sha1-l+gBqgUt8CRU3kawK/YhZCzchQI= + dependencies: + homedir-polyfill "^1.0.1" + +expect@^24.8.0: + version "24.8.0" + resolved "https://registry.yarnpkg.com/expect/-/expect-24.8.0.tgz#471f8ec256b7b6129ca2524b2a62f030df38718d" + integrity sha512-/zYvP8iMDrzaaxHVa724eJBCKqSHmO0FA7EDkBiRHxg6OipmMn1fN+C8T9L9K8yr7UONkOifu6+LLH+z76CnaA== + dependencies: + "@jest/types" "^24.8.0" + ansi-styles "^3.2.0" + jest-get-type "^24.8.0" + jest-matcher-utils "^24.8.0" + jest-message-util "^24.8.0" + jest-regex-util "^24.3.0" + extend-shallow@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" @@ -3379,21 +4525,37 @@ extend-shallow@^3.0.0, extend-shallow@^3.0.2: assign-symbols "^1.0.0" is-extendable "^1.0.1" -extend@3, extend@^3.0.0, extend@~3.0.0: +extend@3, extend@~3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.0.tgz#5a474353b9f3353ddd8176dfd37b91c83a46f1d4" extend@^1.2.1: version "1.3.0" resolved "https://registry.yarnpkg.com/extend/-/extend-1.3.0.tgz#d1516fb0ff5624d2ebf9123ea1dac5a1994004f8" + integrity sha1-0VFvsP9WJNLr+RI+odrFoZlABPg= -external-editor@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-1.1.0.tgz#c7fe15954b09af852b89aaec82a2707a0dc5597a" +extend@^3.0.0, extend@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" + integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== + +external-editor@^2.0.4: + version "2.2.0" + resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-2.2.0.tgz#045511cfd8d133f3846673d1047c154e214ad3d5" + integrity sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A== dependencies: - extend "^3.0.0" - spawn-sync "^1.0.15" - temp "^0.8.3" + chardet "^0.4.0" + iconv-lite "^0.4.17" + tmp "^0.0.33" + +external-editor@^3.0.0, external-editor@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.0.3.tgz#5866db29a97826dbe4bf3afd24070ead9ea43a27" + integrity sha512-bn71H9+qWoOQKyZDo25mOMVpSmXROAsTJVVVYzrrtol3d4y+AsKjf4Iwl2Q+IuT0kFSQ1qo166UuIwqYq7mGnA== + dependencies: + chardet "^0.7.0" + iconv-lite "^0.4.24" + tmp "^0.0.33" extglob@^0.3.1: version "0.3.2" @@ -3418,40 +4580,59 @@ extsprintf@1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.0.2.tgz#e1080e0658e300b06294990cc70e1502235fd550" +fast-deep-equal@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz#c053477817c86b51daa853c81e059b733d023614" + integrity sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ= + +fast-deep-equal@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" + integrity sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk= + +fast-json-stable-stringify@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" + integrity sha1-1RQsDK7msRifh9OnYREGT4bIu/I= + fast-levenshtein@~2.0.4: - version "2.0.5" - resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.5.tgz#bd33145744519ab1c36c3ee9f31f08e9079b67f2" + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= fastparse@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/fastparse/-/fastparse-1.1.1.tgz#d1e2643b38a94d7583b479060e6c4affc94071f8" -faye-websocket@~0.10.0: - version "0.10.0" - resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.10.0.tgz#4e492f8d04dfb6f89003507f6edbf2d501e7c6f4" - dependencies: - websocket-driver ">=0.5.1" - -fb-watchman@^1.8.0, fb-watchman@^1.9.0: - version "1.9.0" - resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-1.9.0.tgz#6f268f1f347a6b3c875d1e89da7e1ed79adfc0ec" +fb-watchman@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.0.tgz#54e9abf7dfa2f26cd9b1636c588c1afc05de5d58" + integrity sha1-VOmr99+i8mzZsWNsWIwa/AXeXVg= dependencies: - bser "^1.0.2" + bser "^2.0.0" -figures@^1.3.5: - version "1.7.0" - resolved "https://registry.yarnpkg.com/figures/-/figures-1.7.0.tgz#cbe1e3affcf1cd44b80cadfed28dc793a9701d2e" +figures@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" + integrity sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI= dependencies: escape-string-regexp "^1.0.5" - object-assign "^4.1.0" file-entry-cache@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-2.0.0.tgz#c392990c3e684783d838b8c84a45d8a048458361" + integrity sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E= dependencies: flat-cache "^1.2.1" object-assign "^4.0.1" +file-entry-cache@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-5.0.1.tgz#ca0f6efa6dd3d561333fb14515065c2fafdf439c" + integrity sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g== + dependencies: + flat-cache "^2.0.1" + file-loader@^0.8.5: version "0.8.5" resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-0.8.5.tgz#9275d031fe780f27d47f5f4af02bd43713cc151b" @@ -3462,13 +4643,6 @@ filename-regex@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.0.tgz#996e3e80479b98b9897f15a8a58b3d084e926775" -fileset@0.2.x: - version "0.2.1" - resolved "https://registry.yarnpkg.com/fileset/-/fileset-0.2.1.tgz#588ef8973c6623b2a76df465105696b96aac8067" - dependencies: - glob "5.x" - minimatch "2.x" - fill-range@^2.1.0: version "2.2.3" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.3.tgz#50b77dfd7e469bc7492470963699fe7a8485a723" @@ -3496,43 +4670,95 @@ find-cache-dir@^0.1.1: mkdirp "^0.5.1" pkg-dir "^1.0.0" -find-node-modules@1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/find-node-modules/-/find-node-modules-1.0.3.tgz#36117ea45c13d5d8352f82ba791c2b835d730a14" +find-node-modules@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/find-node-modules/-/find-node-modules-2.0.0.tgz#5db1fb9e668a3d451db3d618cd167cdd59e41b69" + integrity sha512-8MWIBRgJi/WpjjfVXumjPKCtmQ10B+fjx6zmSA+770GMJirLhWIzg8l763rhjl9xaeaHbnxPNRQKq2mgMhr+aw== dependencies: - findup-sync "^0.2.1" - merge "^1.2.0" + findup-sync "^3.0.0" + merge "^1.2.1" -find-root@1.0.0, find-root@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/find-root/-/find-root-1.0.0.tgz#962ff211aab25c6520feeeb8d6287f8f6e95807a" +find-root@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/find-root/-/find-root-1.1.0.tgz#abcfc8ba76f708c42a97b3d685b7e9450bfb9ce4" + integrity sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng== -find-up@^1.0.0, find-up@^1.1.2: +find-up@^1.0.0: version "1.1.2" resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" dependencies: path-exists "^2.0.0" pinkie-promise "^2.0.0" -findup-sync@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-0.2.1.tgz#e0a90a450075c49466ee513732057514b81e878c" +find-up@^2.0.0, find-up@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" + integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c= + dependencies: + locate-path "^2.0.0" + +find-up@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" + integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== + dependencies: + locate-path "^3.0.0" + +findup-sync@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-3.0.0.tgz#17b108f9ee512dfb7a5c7f3c8b27ea9e1a9c08d1" + integrity sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg== dependencies: - glob "~4.3.0" + detect-file "^1.0.0" + is-glob "^4.0.0" + micromatch "^3.0.4" + resolve-dir "^1.0.1" flat-cache@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.2.1.tgz#6c837d6225a7de5659323740b36d5361f71691ff" + version "1.3.4" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.3.4.tgz#2c2ef77525cc2929007dfffa1dd314aa9c9dee6f" + integrity sha512-VwyB3Lkgacfik2vhqR4uv2rvebqmDvFu4jlN/C1RzWoJEo8I7z4Q404oiqYCkq41mni8EzQnm95emU9seckwtg== dependencies: - circular-json "^0.3.0" - del "^2.0.2" + circular-json "^0.3.1" graceful-fs "^4.1.2" + rimraf "~2.6.2" write "^0.2.1" +flat-cache@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-2.0.1.tgz#5d296d6f04bda44a4630a301413bdbc2ec085ec0" + integrity sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA== + dependencies: + flatted "^2.0.0" + rimraf "2.6.3" + write "1.0.3" + +flat@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/flat/-/flat-4.1.0.tgz#090bec8b05e39cba309747f1d588f04dbaf98db2" + integrity sha512-Px/TiLIznH7gEDlPXcUD4KnBusa6kR6ayRUVcnEAbreRIuhkqow/mun59BuRXwoYk7ZQOLW1ZM05ilIvK38hFw== + dependencies: + is-buffer "~2.0.3" + +flatted@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.0.tgz#55122b6536ea496b4b44893ee2608141d10d9916" + integrity sha512-R+H8IZclI8AAkSBRQJLVOsxwAoHd6WC40b4QTNWIjzAa6BXOBfQcM587MXDTVPeYaopFNWHUFLx7eNmHDSxMWg== + flatten@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/flatten/-/flatten-1.0.2.tgz#dae46a9d78fbe25292258cc1e780a41d95c03782" +flow-bin@^0.94.0: + version "0.94.0" + resolved "https://registry.yarnpkg.com/flow-bin/-/flow-bin-0.94.0.tgz#b5d58fe7559705b73a18229f97edfc3ab6ffffcb" + integrity sha512-DYF7r9CJ/AksfmmB4+q+TyLMoeQPRnqtF1Pk7KY3zgfkB/nVuA3nXyzqgsIPIvnMSiFEXQcFK4z+iPxSLckZhQ== + +flow-runtime@^0.17.0: + version "0.17.0" + resolved "https://registry.yarnpkg.com/flow-runtime/-/flow-runtime-0.17.0.tgz#ff57dd22bd7b0682c7beff20c3590f6a4a8286e3" + integrity sha512-x621HugMPrtU68ddiRX0TkNRif9PS6ml3oeP6oo0k+Kv2issqCmifC4ZX59XnLUh9dfmBcj4GoZJXu4oe8L28Q== + follow-redirects@0.0.7: version "0.0.7" resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-0.0.7.tgz#34b90bab2a911aa347571da90f22bd36ecd8a919" @@ -3578,25 +4804,37 @@ form-data@~2.1.1: combined-stream "^1.0.5" mime-types "^2.1.12" +form-data@~2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" + integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.6" + mime-types "^2.1.12" + fragment-cache@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" dependencies: map-cache "^0.2.2" -fresh@0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.3.0.tgz#651f838e22424e7566de161d8358caa199f83d4f" +fresh@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= from2-string@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/from2-string/-/from2-string-1.1.0.tgz#18282b27d08a267cb3030cd2b8b4b0f212af752a" + integrity sha1-GCgrJ9CKJnyzAwzSuLSw8hKvdSo= dependencies: from2 "^2.0.3" from2@^2.0.3: version "2.3.0" resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af" + integrity sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8= dependencies: inherits "^2.0.1" readable-stream "^2.0.0" @@ -3605,6 +4843,15 @@ from@~0: version "0.1.3" resolved "https://registry.yarnpkg.com/from/-/from-0.1.3.tgz#ef63ac2062ac32acf7862e0d40b44b896f22f3bc" +fs-extra@^7.0.0: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9" + integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw== + dependencies: + graceful-fs "^4.1.2" + jsonfile "^4.0.0" + universalify "^0.1.0" + fs-minipass@^1.2.5: version "1.2.5" resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.5.tgz#06c277218454ec288df77ada54a03b8702aacb9d" @@ -3633,6 +4880,14 @@ fsevents@^1.2.2: nan "^2.9.2" node-pre-gyp "^0.10.0" +fsevents@^1.2.7: + version "1.2.9" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.9.tgz#3f5ed66583ccd6f400b5a00db6f7e861363e388f" + integrity sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw== + dependencies: + nan "^2.12.1" + node-pre-gyp "^0.12.0" + fstream-ignore@~1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/fstream-ignore/-/fstream-ignore-1.0.5.tgz#9c31dae34767018fe1d249b24dada67d092da105" @@ -3650,17 +4905,19 @@ fstream@^1.0.0, fstream@^1.0.2, fstream@~1.0.10: mkdirp ">=0.5 0" rimraf "2" -function-bind@^1.0.2: - version "1.1.0" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.0.tgz#16176714c801798e4e8f2cf7f7529467bb4a5771" - function-bind@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" +functional-red-black-tree@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" + integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= + garnish@^5.0.0: version "5.2.0" resolved "https://registry.yarnpkg.com/garnish/-/garnish-5.2.0.tgz#bed43659382e4b198e33c793897be7c701e65577" + integrity sha1-vtQ2WTguSxmOM8eTiXvnxwHmVXc= dependencies: chalk "^0.5.1" minimist "^1.1.0" @@ -3720,6 +4977,11 @@ generate-object-property@^1.1.0: dependencies: is-property "^1.0.0" +get-assigned-identifiers@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/get-assigned-identifiers/-/get-assigned-identifiers-1.2.0.tgz#6dbf411de648cbaf8d9169ebb0d2d576191e2ff1" + integrity sha512-mBBwmeGTrxEMO4pMaaf/uUEFHnYtwr8FTe8Y/mer4rcV/bye0qGm6pw1bGZFGStxC5O76c5ZAVBGnqHmOaJpdQ== + get-caller-file@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.2.tgz#f702e63127e7e231c160a80c1554acb70d5047e5" @@ -3727,6 +4989,7 @@ get-caller-file@^1.0.1: get-ports@^1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/get-ports/-/get-ports-1.0.3.tgz#f40bd580aca7ec0efb7b96cbfcbeb03ef894b5e8" + integrity sha1-9AvVgKyn7A77e5bL/L6wPviUteg= dependencies: map-limit "0.0.1" @@ -3737,6 +5000,19 @@ get-stdin@^4.0.1: get-stdin@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-5.0.1.tgz#122e161591e21ff4c52530305693f20e6393a398" + integrity sha1-Ei4WFZHiH/TFJTAwVpPyDmOTo5g= + +get-stream@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" + integrity sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ= + +get-stream@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" + integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== + dependencies: + pump "^3.0.0" get-value@^2.0.3, get-value@^2.0.6: version "2.0.6" @@ -3803,17 +5079,31 @@ glob-parent@^3.1.0: is-glob "^3.1.0" path-dirname "^1.0.0" -glob@5.x, glob@^5.0.15: - version "5.0.15" - resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1" +glob@7.1.3: + version "7.1.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" + integrity sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@^7.0.0, glob@^7.1.0, glob@^7.1.1, glob@^7.1.3: + version "7.1.4" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.4.tgz#aa608a2f6c577ad357e1ae5a5c26d9a8d1969255" + integrity sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A== dependencies: + fs.realpath "^1.0.0" inflight "^1.0.4" inherits "2" - minimatch "2 || 3" + minimatch "^3.0.4" once "^1.3.0" path-is-absolute "^1.0.0" -glob@7.0.5, glob@^7.0.0, glob@^7.0.3, glob@^7.0.5: +glob@^7.0.5: version "7.0.5" resolved "https://registry.yarnpkg.com/glob/-/glob-7.0.5.tgz#b4202a69099bbb4d292a7c1b95b6682b67ebdc95" dependencies: @@ -3835,37 +5125,51 @@ glob@^7.1.2: once "^1.3.0" path-is-absolute "^1.0.0" -glob@~4.3.0: - version "4.3.5" - resolved "https://registry.yarnpkg.com/glob/-/glob-4.3.5.tgz#80fbb08ca540f238acce5d11d1e9bc41e75173d3" +glob@~7.0.6: + version "7.0.6" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.0.6.tgz#211bafaf49e525b8cd93260d14ab136152b3f57a" + integrity sha1-IRuvr0nlJbjNkyYNFKsTYVKz9Xo= dependencies: + fs.realpath "^1.0.0" inflight "^1.0.4" inherits "2" - minimatch "^2.0.1" + minimatch "^3.0.2" once "^1.3.0" + path-is-absolute "^1.0.0" + +global-modules@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-1.0.0.tgz#6d770f0eb523ac78164d72b5e71a8877265cc3ea" + integrity sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg== + dependencies: + global-prefix "^1.0.1" + is-windows "^1.0.1" + resolve-dir "^1.0.0" -globals@^8.3.0: - version "8.18.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-8.18.0.tgz#93d4a62bdcac38cfafafc47d6b034768cb0ffcb4" +global-prefix@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-1.0.2.tgz#dbf743c6c14992593c655568cb66ed32c0122ebe" + integrity sha1-2/dDxsFJklk8ZVVoy2btMsASLr4= + dependencies: + expand-tilde "^2.0.2" + homedir-polyfill "^1.0.1" + ini "^1.3.4" + is-windows "^1.0.1" + which "^1.2.14" -globals@^9.0.0, globals@^9.2.0: - version "9.12.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-9.12.0.tgz#992ce90828c3a55fa8f16fada177adb64664cf9d" +globals@^11.0.1, globals@^11.1.0, globals@^11.7.0: + version "11.12.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== globals@^9.18.0: version "9.18.0" resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" -globby@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-5.0.0.tgz#ebd84667ca0dbb330b99bcfc68eac2bc54370e0d" - dependencies: - array-union "^1.0.1" - arrify "^1.0.0" - glob "^7.0.3" - object-assign "^4.0.1" - pify "^2.0.0" - pinkie-promise "^2.0.0" +graceful-fs@^4.1.11, graceful-fs@^4.1.15: + version "4.1.15" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.15.tgz#ffb703e1066e8a0eeaa4c8b80ba9253eeefbfb00" + integrity sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA== graceful-fs@^4.1.2, graceful-fs@^4.1.6: version "4.1.9" @@ -3879,19 +5183,26 @@ graceful-fs@^4.1.4: version "1.0.1" resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725" -growly@^1.2.0: +growly@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" + integrity sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE= -handlebars@^4.0.1, handlebars@^4.0.3: - version "4.0.5" - resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.5.tgz#92c6ed6bb164110c50d4d8d0fbddc70806c6f8e7" +handlebars@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.1.2.tgz#b6b37c1ced0306b221e094fc7aca3ec23b131b67" + integrity sha512-nvfrjqvt9xQ8Z/w0ijewdD/vvWDTOweBUm96NTr66Wfvo1mJenBLwcYmPs3TIBP5ruzYGD7Hx/DaM9RmhroGPw== dependencies: - async "^1.4.0" + neo-async "^2.6.0" optimist "^0.6.1" - source-map "^0.4.4" + source-map "^0.6.1" optionalDependencies: - uglify-js "^2.6" + uglify-js "^3.1.4" + +har-schema@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" + integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= har-validator@~2.0.6: version "2.0.6" @@ -3902,9 +5213,18 @@ har-validator@~2.0.6: is-my-json-valid "^2.12.4" pinkie-promise "^2.0.0" +har-validator@~5.1.0: + version "5.1.3" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.3.tgz#1ef89ebd3e4996557675eed9893110dc350fa080" + integrity sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g== + dependencies: + ajv "^6.5.5" + har-schema "^2.0.0" + has-ansi@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-0.1.0.tgz#84f265aae8c0e6a88a12d7022894b7568894c62e" + integrity sha1-hPJlqujA5qiKEtcCKJS3VoiUxi4= dependencies: ansi-regex "^0.2.0" @@ -3922,10 +5242,20 @@ has-flag@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" +has-flag@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-2.0.0.tgz#e8207af1cc7b30d446cc70b734b5e8be18f88d51" + integrity sha1-6CB68cx7MNRGzHC3NLXovhj4jVE= + has-flag@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" +has-symbols@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.0.tgz#ba1a8f1af2a0fc39650f5c850367704122063b44" + integrity sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q= + has-unicode@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" @@ -3957,13 +5287,7 @@ has-values@^1.0.0: is-number "^3.0.0" kind-of "^4.0.0" -has@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.1.tgz#8461733f538b0837c9361e39a9ab9e9704dc2f28" - dependencies: - function-bind "^1.0.2" - -has@^1.0.1: +has@^1.0.0, has@^1.0.1, has@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" dependencies: @@ -3984,67 +5308,74 @@ hawk@~3.1.3: hoek "2.x.x" sntp "1.x.x" -highlight.js@^8.6.0: - version "8.9.1" - resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-8.9.1.tgz#b8a9c5493212a9392f0222b649c9611497ebfb88" +hex-color-regex@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/hex-color-regex/-/hex-color-regex-1.1.0.tgz#4c06fccb4602fe2602b3c93df82d7e7dbf1a8a8e" + integrity sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ== + +highlight.js@^9.7.0: + version "9.15.8" + resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-9.15.8.tgz#f344fda123f36f1a65490e932cf90569e4999971" + integrity sha512-RrapkKQWwE+wKdF73VsOa2RQdIoO3mxwJ4P8mhbI6KYJUraUHRKM5w5zQQKXNk0xNL4UVRdulV9SBJcmzJNzVA== hoek@2.x.x: version "2.16.3" resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed" -home-or-tmp@2.0.0, home-or-tmp@^2.0.0: +home-or-tmp@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8" dependencies: os-homedir "^1.0.0" os-tmpdir "^1.0.1" -home-or-tmp@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-1.0.0.tgz#4b9f1e40800c3e50c6c27f781676afcce71f3985" +homedir-polyfill@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz#743298cef4e5af3e194161fbadcc2151d3a058e8" + integrity sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA== dependencies: - os-tmpdir "^1.0.1" - user-home "^1.1.1" + parse-passwd "^1.0.0" hosted-git-info@^2.1.4, hosted-git-info@^2.1.5: version "2.1.5" resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.1.5.tgz#0ba81d90da2e25ab34a332e6ec77936e1598118b" +hsl-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/hsl-regex/-/hsl-regex-1.0.0.tgz#d49330c789ed819e276a4c0d272dffa30b18fe6e" + integrity sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4= + +hsla-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/hsla-regex/-/hsla-regex-1.0.0.tgz#c1ce7a3168c8c6614033a4b5f7877f3b225f9c38" + integrity sha1-wc56MWjIxmFAM6S194d/OyJfnDg= + html-comment-regex@^1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/html-comment-regex/-/html-comment-regex-1.1.1.tgz#668b93776eaae55ebde8f3ad464b307a4963625e" -html-encoding-sniffer@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-1.0.1.tgz#79bf7a785ea495fe66165e734153f363ff5437da" +html-encoding-sniffer@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz#e70d84b94da53aa375e11fe3a351be6642ca46f8" + integrity sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw== dependencies: whatwg-encoding "^1.0.1" htmlescape@^1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/htmlescape/-/htmlescape-1.1.1.tgz#3a03edc2214bca3b66424a3e7959349509cb0351" + integrity sha1-OgPtwiFLyjtmQko+eVk0lQnLA1E= -http-errors@~1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.3.1.tgz#197e22cdebd4198585e8694ef6786197b91ed942" - dependencies: - inherits "~2.0.1" - statuses "1" - -http-errors@~1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.5.0.tgz#b1cb3d8260fd8e2386cad3189045943372d48211" - dependencies: - inherits "2.0.1" - setprototypeof "1.0.1" - statuses ">= 1.3.0 < 2" - -http-proxy@^1.14.0: - version "1.15.1" - resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.15.1.tgz#91a6088172e79bc0e821d5eb04ce702f32446393" +http-errors@~1.7.2: + version "1.7.2" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.2.tgz#4f5029cf13239f31036e5b2e55292bcfbcc85c8f" + integrity sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg== dependencies: - eventemitter3 "1.x.x" - requires-port "1.x.x" + depd "~1.1.2" + inherits "2.0.3" + setprototypeof "1.1.1" + statuses ">= 1.5.0 < 2" + toidentifier "1.0.0" http-signature@~1.1.0: version "1.1.1" @@ -4054,14 +5385,19 @@ http-signature@~1.1.0: jsprim "^1.2.2" sshpk "^1.7.0" +http-signature@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" + integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE= + dependencies: + assert-plus "^1.0.0" + jsprim "^1.2.2" + sshpk "^1.7.0" + https-browserify@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" -https-browserify@~0.0.0: - version "0.0.1" - resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-0.0.1.tgz#3f91365cabe60b77ed0ebba24b454e3e09d95a82" - https-proxy-agent@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-1.0.0.tgz#35f7da6c48ce4ddbfa264891ac593ee5ff8671e6" @@ -4070,9 +5406,12 @@ https-proxy-agent@^1.0.0: debug "2" extend "3" -iconv-lite@0.4.13, iconv-lite@^0.4.13, iconv-lite@~0.4.13: - version "0.4.13" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.13.tgz#1f88aba4ab0b1508e8312acc39345f36e992e2f2" +iconv-lite@0.4.24, iconv-lite@^0.4.17, iconv-lite@^0.4.24, iconv-lite@~0.4.13: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" iconv-lite@^0.4.4: version "0.4.23" @@ -4084,7 +5423,7 @@ icss-replace-symbols@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz#06ea6f83679a7749e386cfe1fe812ae5db223ded" -ieee754@^1.1.4: +ieee754@1.1.8, ieee754@^1.1.4: version "1.1.8" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.8.tgz#be33d40ac10ef1926701f6f08a2d86fbfd1ad3e4" @@ -4094,13 +5433,49 @@ ignore-walk@^3.0.1: dependencies: minimatch "^3.0.4" -ignore@^3.0.9, ignore@^3.1.5: - version "3.2.0" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.2.0.tgz#8d88f03c3002a0ac52114db25d2c673b0bf1e435" +ignore@^3.2.7, ignore@^3.3.3: + version "3.3.10" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.10.tgz#0a97fb876986e8081c631160f8f9f389157f0043" + integrity sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug== + +ignore@^4.0.6: + version "4.0.6" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" + integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== + +ignore@^5.0.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.2.tgz#e28e584d43ad7e92f96995019cc43b9e1ac49558" + integrity sha512-vdqWBp7MyzdmHkkRWV5nY+PfGRbYbahfuvsBCh277tq+w9zyNi7h5CYJCK0kmzti9kU+O/cB7sE8HvKv6aXAKQ== + +import-fresh@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-2.0.0.tgz#d81355c15612d386c61f9ddd3922d4304822a546" + integrity sha1-2BNVwVYS04bGH53dOSLUMEgipUY= + dependencies: + caller-path "^2.0.0" + resolve-from "^3.0.0" + +import-fresh@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.0.0.tgz#a3d897f420cab0e671236897f75bc14b4885c390" + integrity sha512-pOnA9tfM3Uwics+SaBLCNyZZZbK+4PTu0OPZtLlMIrv17EdBoC15S9Kn8ckJ9TZTyKb3ywNE5y1yeDxxGA7nTQ== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +import-local@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/import-local/-/import-local-2.0.0.tgz#55070be38a5993cf18ef6db7e961f5bee5c5a09d" + integrity sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ== + dependencies: + pkg-dir "^3.0.0" + resolve-cwd "^2.0.0" imurmurhash@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= indent-string@^2.1.0: version "2.1.0" @@ -4108,6 +5483,11 @@ indent-string@^2.1.0: dependencies: repeating "^2.0.0" +indent-string@^3.1.0, indent-string@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-3.2.0.tgz#4a5fd6d27cc332f37e5419a504dbb837105c9289" + integrity sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok= + indexes-of@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607" @@ -4119,6 +5499,7 @@ indexof@0.0.1: "individual@>=3.0.0 <3.1.0-0": version "3.0.0" resolved "https://registry.yarnpkg.com/individual/-/individual-3.0.0.tgz#e7ca4f85f8957b018734f285750dc22ec2f9862d" + integrity sha1-58pPhfiVewGHNPKFdQ3CLsL5hi0= inflight@^1.0.4: version "1.0.6" @@ -4127,7 +5508,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@~2.0.0, inherits@~2.0.1, inherits@~2.0.3: +inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.0, inherits@~2.0.1, inherits@~2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" @@ -4139,85 +5520,107 @@ ini@^1.2.0, ini@^1.3.4, ini@~1.3.0: version "1.3.4" resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.4.tgz#0537cb79daf59b59a1a517dff706c86ec039162e" -inject-lr-script@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/inject-lr-script/-/inject-lr-script-2.0.0.tgz#99487bbd224ac9c18f69c65a5c6dd6fa4191e903" +inject-lr-script@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/inject-lr-script/-/inject-lr-script-2.1.0.tgz#e61b5e84c118733906cbea01ec3d746698a39f65" + integrity sha1-5htehMEYczkGy+oB7D10Zpijn2U= dependencies: resp-modifier "^6.0.0" inline-source-map@~0.6.0: version "0.6.2" resolved "https://registry.yarnpkg.com/inline-source-map/-/inline-source-map-0.6.2.tgz#f9393471c18a79d1724f863fa38b586370ade2a5" + integrity sha1-+Tk0ccGKedFyT4Y/o4tYY3Ct4qU= dependencies: source-map "~0.5.3" -inquirer@1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-1.1.2.tgz#ac3ba5f06b8e7291abd9f22912c03f09cfe2dd1f" +inquirer@6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.2.0.tgz#51adcd776f661369dc1e894859c2560a224abdd8" + integrity sha512-QIEQG4YyQ2UYZGDC4srMZ7BjHOmNk1lR2JQj5UknBapklm6WHA+VVH7N+sUdX3A7NeCfGF8o4X1S3Ao7nAcIeg== dependencies: - ansi-escapes "^1.1.0" - chalk "^1.0.0" - cli-cursor "^1.0.1" + ansi-escapes "^3.0.0" + chalk "^2.0.0" + cli-cursor "^2.1.0" cli-width "^2.0.0" - external-editor "^1.0.1" - figures "^1.3.5" - lodash "^4.3.0" - mute-stream "0.0.6" - pinkie-promise "^2.0.0" + external-editor "^3.0.0" + figures "^2.0.0" + lodash "^4.17.10" + mute-stream "0.0.7" run-async "^2.2.0" - rx "^4.1.0" - string-width "^1.0.1" - strip-ansi "^3.0.0" + rxjs "^6.1.0" + string-width "^2.1.0" + strip-ansi "^4.0.0" through "^2.3.6" -inquirer@^0.12.0: - version "0.12.0" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-0.12.0.tgz#1ef2bfd63504df0bc75785fff8c2c41df12f077e" +inquirer@^3.0.6: + version "3.3.0" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.3.0.tgz#9dd2f2ad765dcab1ff0443b491442a20ba227dc9" + integrity sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ== dependencies: - ansi-escapes "^1.1.0" - ansi-regex "^2.0.0" - chalk "^1.0.0" - cli-cursor "^1.0.1" + ansi-escapes "^3.0.0" + chalk "^2.0.0" + cli-cursor "^2.1.0" cli-width "^2.0.0" - figures "^1.3.5" + external-editor "^2.0.4" + figures "^2.0.0" lodash "^4.3.0" - readline2 "^1.0.1" - run-async "^0.1.0" - rx-lite "^3.1.2" - string-width "^1.0.1" - strip-ansi "^3.0.0" + mute-stream "0.0.7" + run-async "^2.2.0" + rx-lite "^4.0.8" + rx-lite-aggregates "^4.0.8" + string-width "^2.1.0" + strip-ansi "^4.0.0" + through "^2.3.6" + +inquirer@^6.2.2: + version "6.3.1" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.3.1.tgz#7a413b5e7950811013a3db491c61d1f3b776e8e7" + integrity sha512-MmL624rfkFt4TG9y/Jvmt8vdmOo836U7Y0Hxr2aFk3RelZEGX4Igk0KabWrcaaZaTv9uzglOqWh1Vly+FAWAXA== + dependencies: + ansi-escapes "^3.2.0" + chalk "^2.4.2" + cli-cursor "^2.1.0" + cli-width "^2.0.0" + external-editor "^3.0.3" + figures "^2.0.0" + lodash "^4.17.11" + mute-stream "0.0.7" + run-async "^2.2.0" + rxjs "^6.4.0" + string-width "^2.1.0" + strip-ansi "^5.1.0" through "^2.3.6" insert-module-globals@^7.0.0: - version "7.0.1" - resolved "https://registry.yarnpkg.com/insert-module-globals/-/insert-module-globals-7.0.1.tgz#c03bf4e01cb086d5b5e5ace8ad0afe7889d638c3" + version "7.2.0" + resolved "https://registry.yarnpkg.com/insert-module-globals/-/insert-module-globals-7.2.0.tgz#ec87e5b42728479e327bd5c5c71611ddfb4752ba" + integrity sha512-VE6NlW+WGn2/AeOMd496AHFYmE7eLKkUY6Ty31k4og5vmA3Fjuwe9v6ifH6Xx/Hz27QvdoMoviw1/pqWRB09Sw== dependencies: JSONStream "^1.0.3" - combine-source-map "~0.7.1" - concat-stream "~1.5.1" + acorn-node "^1.5.2" + combine-source-map "^0.8.0" + concat-stream "^1.6.1" is-buffer "^1.1.0" - lexical-scope "^1.2.0" + path-is-absolute "^1.0.1" process "~0.11.0" through2 "^2.0.0" + undeclared-identifiers "^1.1.2" xtend "^4.0.0" -internal-ip@^1.0.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/internal-ip/-/internal-ip-1.2.0.tgz#ae9fbf93b984878785d50a8de1b356956058cf5c" +internal-ip@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/internal-ip/-/internal-ip-3.0.1.tgz#df5c99876e1d2eb2ea2d74f520e3f669a00ece27" + integrity sha512-NXXgESC2nNVtU+pqmC9e6R8B1GpKxzsAQhffvh5AL79qKnodd+L7tnEQmTiUAVngqLalPbSqRA7XGIEL5nCd0Q== dependencies: - meow "^3.3.0" + default-gateway "^2.6.0" + ipaddr.js "^1.5.2" interpret@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.0.1.tgz#d579fb7f693b858004947af39fa0db49f795602c" -invariant@^2.2.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.1.tgz#b097010547668c7e337028ebe816ebe36c8a8d54" - dependencies: - loose-envify "^1.0.0" - -invariant@^2.2.2: +invariant@^2.2.2, invariant@^2.2.4: version "2.2.4" resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" dependencies: @@ -4227,6 +5630,21 @@ invert-kv@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" +invert-kv@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-2.0.0.tgz#7393f5afa59ec9ff5f67a27620d11c226e3eec02" + integrity sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA== + +ip-regex@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-2.1.0.tgz#fa78bf5d2e6913c911ce9f819ee5146bb6d844e9" + integrity sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk= + +ipaddr.js@^1.5.2: + version "1.9.0" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.0.tgz#37df74e430a0e47550fe54a2defe30d8acd95f65" + integrity sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA== + is-absolute-url@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-2.1.0.tgz#50530dfb84fcc9aa7dbe7852e83a37b93b9f2aa6" @@ -4247,29 +5665,59 @@ is-arrayish@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" +is-arrayish@^0.3.1: + version "0.3.2" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" + integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== + is-binary-path@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" dependencies: binary-extensions "^1.0.0" -is-buffer@^1.0.2, is-buffer@^1.1.0: +is-buffer@^1.0.2: version "1.1.4" resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.4.tgz#cfc86ccd5dc5a52fa80489111c6920c457e2d98b" -is-buffer@^1.1.5: +is-buffer@^1.1.0, is-buffer@^1.1.5, is-buffer@~1.1.1: version "1.1.6" resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" +is-buffer@~2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.3.tgz#4ecf3fcf749cbd1e472689e109ac66261a25e725" + integrity sha512-U15Q7MXTuZlrbymiz95PJpZxu8IlipAp4dtS3wOdgPXx3mqBnslrWU14kxfHB+Py/+2PVKSr37dMAgM2A4uArw== + is-builtin-module@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe" dependencies: builtin-modules "^1.0.0" -is-ci@^1.0.9: - version "1.0.9" - resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-1.0.9.tgz#de2c5ffe49ab3237fda38c47c8a3bbfd55bbcca7" +is-callable@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.4.tgz#1e1adf219e1eeb684d691f9d6a05ff0d30a24d75" + integrity sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA== + +is-ci@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c" + integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w== + dependencies: + ci-info "^2.0.0" + +is-color-stop@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-color-stop/-/is-color-stop-1.1.0.tgz#cfff471aee4dd5c9e158598fbe12967b5cdad345" + integrity sha1-z/9HGu5N1cnhWFmPvhKWe1za00U= + dependencies: + css-color-names "^0.0.4" + hex-color-regex "^1.1.0" + hsl-regex "^1.0.0" + hsla-regex "^1.0.0" + rgb-regex "^1.0.1" + rgba-regex "^1.0.0" is-data-descriptor@^0.1.4: version "0.1.4" @@ -4283,6 +5731,11 @@ is-data-descriptor@^1.0.0: dependencies: kind-of "^6.0.0" +is-date-object@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16" + integrity sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY= + is-descriptor@^0.1.0: version "0.1.6" resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" @@ -4299,6 +5752,11 @@ is-descriptor@^1.0.0, is-descriptor@^1.0.2: is-data-descriptor "^1.0.0" kind-of "^6.0.2" +is-directory@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1" + integrity sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE= + is-dotfile@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.2.tgz#2c132383f39199f8edc268ca01b9b007d205cc4d" @@ -4339,6 +5797,16 @@ is-fullwidth-code-point@^1.0.0: dependencies: number-is-nan "^1.0.0" +is-fullwidth-code-point@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" + integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= + +is-generator-fn@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" + integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== + is-glob@^2.0.0, is-glob@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" @@ -4357,7 +5825,7 @@ is-glob@^4.0.0: dependencies: is-extglob "^2.1.1" -is-my-json-valid@^2.10.0, is-my-json-valid@^2.12.4: +is-my-json-valid@^2.12.4: version "2.15.0" resolved "https://registry.yarnpkg.com/is-my-json-valid/-/is-my-json-valid-2.15.0.tgz#936edda3ca3c211fd98f3b2d3e08da43f7b2915b" dependencies: @@ -4382,28 +5850,17 @@ is-number@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-4.0.0.tgz#0026e37f5454d73e356dfe6564699867c6a7f0ff" +is-obj@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" + integrity sha1-PkcprB9f3gJc19g6iW2rn09n2w8= + is-odd@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-odd/-/is-odd-2.0.0.tgz#7646624671fd7ea558ccd9a2795182f2958f1b24" dependencies: is-number "^4.0.0" -is-path-cwd@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d" - -is-path-in-cwd@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz#6477582b8214d602346094567003be8a9eac04dc" - dependencies: - is-path-inside "^1.0.0" - -is-path-inside@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.0.tgz#fc06e5a1683fbda13de667aff717bbc10a48f37f" - dependencies: - path-is-inside "^1.0.1" - is-plain-obj@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" @@ -4425,20 +5882,28 @@ is-primitive@^2.0.0: is-promise@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" + integrity sha1-eaKp7OfwlugPNtKy87wWwf9L8/o= is-property@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/is-property/-/is-property-1.0.2.tgz#57fe1c4e48474edd65b09911f26b1cd4095dda84" -is-resolvable@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.0.0.tgz#8df57c61ea2e3c501408d100fb013cf8d6e0cc62" +is-regex@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491" + integrity sha1-VRdIm1RwkbCTDglWVM7SXul+lJE= dependencies: - tryit "^1.0.1" + has "^1.0.1" -is-stream@^1.0.1: +is-resolvable@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88" + integrity sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg== + +is-stream@^1.0.1, is-stream@^1.1.0, is-stream@~1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" + integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= is-svg@^2.0.0: version "2.1.0" @@ -4446,29 +5911,50 @@ is-svg@^2.0.0: dependencies: html-comment-regex "^1.1.0" +is-svg@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-svg/-/is-svg-3.0.0.tgz#9321dbd29c212e5ca99c4fa9794c714bcafa2f75" + integrity sha512-gi4iHK53LR2ujhLVVj+37Ykh9GLqYHX6JOVXbLAucaG/Cqw9xwdFOjDM2qeifLs1sF1npXXFvDu0r5HNgCMrzQ== + dependencies: + html-comment-regex "^1.1.0" + +is-symbol@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.2.tgz#a055f6ae57192caee329e7a860118b497a950f38" + integrity sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw== + dependencies: + has-symbols "^1.0.0" + is-typedarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" -is-utf8@^0.2.0: +is-utf8@^0.2.0, is-utf8@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" -is-windows@^1.0.2: +is-windows@^1.0.1, is-windows@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" -isarray@0.0.1, isarray@~0.0.1: +is-wsl@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" + integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0= + +isarray@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" + integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8= isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" -isexe@^1.1.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-1.1.2.tgz#36f3e22e60750920f5e7241a476a8c6a42275ad0" +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= isnumeric@^0.2.0: version "0.2.0" @@ -4487,6 +5973,7 @@ isobject@^3.0.0, isobject@^3.0.1: isomorphic-fetch@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz#611ae1acf14f5e81f729507472819fe9733558a9" + integrity sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk= dependencies: node-fetch "^1.0.1" whatwg-fetch ">=0.10.0" @@ -4495,273 +5982,415 @@ isstream@~0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" -istanbul-api@^1.0.0-aplha.10: - version "1.0.0-aplha.10" - resolved "https://registry.yarnpkg.com/istanbul-api/-/istanbul-api-1.0.0-aplha.10.tgz#902edf5cf5404e0eba7e00ef46408488a0d3e337" - dependencies: - async "1.x" - clone "^1.0.2" - fileset "0.2.x" - istanbul-lib-coverage "^1.0.0-alpha" - istanbul-lib-hook "^1.0.0-alpha" - istanbul-lib-instrument "^1.0.0-alpha" - istanbul-lib-report "^1.0.0-alpha" - istanbul-lib-source-maps "^1.0.0-alpha" - istanbul-reports "^1.0.0-alpha" - js-yaml "3.x" - mkdirp "0.5.x" - once "1.x" - -istanbul-lib-coverage@^1.0.0, istanbul-lib-coverage@^1.0.0-alpha, istanbul-lib-coverage@^1.0.0-alpha.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-1.0.0.tgz#c3f9b6d226da12424064cce87fce0fb57fdfa7a2" - -istanbul-lib-hook@^1.0.0-alpha: - version "1.0.0-alpha.4" - resolved "https://registry.yarnpkg.com/istanbul-lib-hook/-/istanbul-lib-hook-1.0.0-alpha.4.tgz#8c5bb9f6fbd8526e0ae6cf639af28266906b938f" - dependencies: - append-transform "^0.3.0" - -istanbul-lib-instrument@^1.0.0-alpha, istanbul-lib-instrument@^1.1.1: - version "1.1.3" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-1.1.3.tgz#66d5353d1f592b9e34d1cf9acda9c3f1ab509696" - dependencies: - babel-generator "^6.11.3" - babel-template "^6.9.0" - babel-traverse "^6.9.0" - babel-types "^6.10.2" - babylon "^6.8.1" - istanbul-lib-coverage "^1.0.0" +istanbul-lib-coverage@^2.0.2, istanbul-lib-coverage@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz#675f0ab69503fad4b1d849f736baaca803344f49" + integrity sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA== -istanbul-lib-report@^1.0.0-alpha: - version "1.0.0-alpha.3" - resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-1.0.0-alpha.3.tgz#32d5f6ec7f33ca3a602209e278b2e6ff143498af" +istanbul-lib-instrument@^3.0.1, istanbul-lib-instrument@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-3.3.0.tgz#a5f63d91f0bbc0c3e479ef4c5de027335ec6d630" + integrity sha512-5nnIN4vo5xQZHdXno/YDXJ0G+I3dAm4XgzfSVTPLQpj/zAV2dV6Juy0yaf10/zrJOJeHoN3fraFe+XRq2bFVZA== + dependencies: + "@babel/generator" "^7.4.0" + "@babel/parser" "^7.4.3" + "@babel/template" "^7.4.0" + "@babel/traverse" "^7.4.3" + "@babel/types" "^7.4.0" + istanbul-lib-coverage "^2.0.5" + semver "^6.0.0" + +istanbul-lib-report@^2.0.4: + version "2.0.8" + resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-2.0.8.tgz#5a8113cd746d43c4889eba36ab10e7d50c9b4f33" + integrity sha512-fHBeG573EIihhAblwgxrSenp0Dby6tJMFR/HvlerBsrCTD5bkUuoNtn3gVh29ZCS824cGGBPn7Sg7cNk+2xUsQ== + dependencies: + istanbul-lib-coverage "^2.0.5" + make-dir "^2.1.0" + supports-color "^6.1.0" + +istanbul-lib-source-maps@^3.0.1: + version "3.0.6" + resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.6.tgz#284997c48211752ec486253da97e3879defba8c8" + integrity sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw== dependencies: - async "^1.4.2" - istanbul-lib-coverage "^1.0.0-alpha" - mkdirp "^0.5.1" - path-parse "^1.0.5" - rimraf "^2.4.3" - supports-color "^3.1.2" + debug "^4.1.1" + istanbul-lib-coverage "^2.0.5" + make-dir "^2.1.0" + rimraf "^2.6.3" + source-map "^0.6.1" -istanbul-lib-source-maps@^1.0.0-alpha: - version "1.0.2" - resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.0.2.tgz#9e91b0e5ae6ed203f67c69a34e6e98b10bb69a49" - dependencies: - istanbul-lib-coverage "^1.0.0-alpha.0" +istanbul-reports@^2.1.1: + version "2.2.6" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-2.2.6.tgz#7b4f2660d82b29303a8fe6091f8ca4bf058da1af" + integrity sha512-SKi4rnMyLBKe0Jy2uUdx28h8oG7ph2PPuQPvIAh31d+Ci+lSiEu4C+h3oBPuJ9+mPKhOyW0M8gY4U5NM1WLeXA== + dependencies: + handlebars "^4.1.2" + +jest-changed-files@^24.8.0: + version "24.8.0" + resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-24.8.0.tgz#7e7eb21cf687587a85e50f3d249d1327e15b157b" + integrity sha512-qgANC1Yrivsq+UrLXsvJefBKVoCsKB0Hv+mBb6NMjjZ90wwxCDmU3hsCXBya30cH+LnPYjwgcU65i6yJ5Nfuug== + dependencies: + "@jest/types" "^24.8.0" + execa "^1.0.0" + throat "^4.0.0" + +jest-cli@^24.8.0: + version "24.8.0" + resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-24.8.0.tgz#b075ac914492ed114fa338ade7362a301693e989" + integrity sha512-+p6J00jSMPQ116ZLlHJJvdf8wbjNbZdeSX9ptfHX06/MSNaXmKihQzx5vQcw0q2G6JsdVkUIdWbOWtSnaYs3yA== + dependencies: + "@jest/core" "^24.8.0" + "@jest/test-result" "^24.8.0" + "@jest/types" "^24.8.0" + chalk "^2.0.1" + exit "^0.1.2" + import-local "^2.0.0" + is-ci "^2.0.0" + jest-config "^24.8.0" + jest-util "^24.8.0" + jest-validate "^24.8.0" + prompts "^2.0.1" + realpath-native "^1.1.0" + yargs "^12.0.2" + +jest-config@^24.8.0: + version "24.8.0" + resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-24.8.0.tgz#77db3d265a6f726294687cbbccc36f8a76ee0f4f" + integrity sha512-Czl3Nn2uEzVGsOeaewGWoDPD8GStxCpAe0zOYs2x2l0fZAgPbCr3uwUkgNKV3LwE13VXythM946cd5rdGkkBZw== + dependencies: + "@babel/core" "^7.1.0" + "@jest/test-sequencer" "^24.8.0" + "@jest/types" "^24.8.0" + babel-jest "^24.8.0" + chalk "^2.0.1" + glob "^7.1.1" + jest-environment-jsdom "^24.8.0" + jest-environment-node "^24.8.0" + jest-get-type "^24.8.0" + jest-jasmine2 "^24.8.0" + jest-regex-util "^24.3.0" + jest-resolve "^24.8.0" + jest-util "^24.8.0" + jest-validate "^24.8.0" + micromatch "^3.1.10" + pretty-format "^24.8.0" + realpath-native "^1.1.0" + +jest-diff@^24.8.0: + version "24.8.0" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-24.8.0.tgz#146435e7d1e3ffdf293d53ff97e193f1d1546172" + integrity sha512-wxetCEl49zUpJ/bvUmIFjd/o52J+yWcoc5ZyPq4/W1LUKGEhRYDIbP1KcF6t+PvqNrGAFk4/JhtxDq/Nnzs66g== + dependencies: + chalk "^2.0.1" + diff-sequences "^24.3.0" + jest-get-type "^24.8.0" + pretty-format "^24.8.0" + +jest-docblock@^24.3.0: + version "24.3.0" + resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-24.3.0.tgz#b9c32dac70f72e4464520d2ba4aec02ab14db5dd" + integrity sha512-nlANmF9Yq1dufhFlKG9rasfQlrY7wINJbo3q01tu56Jv5eBU5jirylhF2O5ZBnLxzOVBGRDz/9NAwNyBtG4Nyg== + dependencies: + detect-newline "^2.1.0" + +jest-each@^24.8.0: + version "24.8.0" + resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-24.8.0.tgz#a05fd2bf94ddc0b1da66c6d13ec2457f35e52775" + integrity sha512-NrwK9gaL5+XgrgoCsd9svsoWdVkK4gnvyhcpzd6m487tXHqIdYeykgq3MKI1u4I+5Zf0tofr70at9dWJDeb+BA== + dependencies: + "@jest/types" "^24.8.0" + chalk "^2.0.1" + jest-get-type "^24.8.0" + jest-util "^24.8.0" + pretty-format "^24.8.0" + +jest-environment-jsdom@^24.8.0: + version "24.8.0" + resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-24.8.0.tgz#300f6949a146cabe1c9357ad9e9ecf9f43f38857" + integrity sha512-qbvgLmR7PpwjoFjM/sbuqHJt/NCkviuq9vus9NBn/76hhSidO+Z6Bn9tU8friecegbJL8gzZQEMZBQlFWDCwAQ== + dependencies: + "@jest/environment" "^24.8.0" + "@jest/fake-timers" "^24.8.0" + "@jest/types" "^24.8.0" + jest-mock "^24.8.0" + jest-util "^24.8.0" + jsdom "^11.5.1" + +jest-environment-node@^24.8.0: + version "24.8.0" + resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-24.8.0.tgz#d3f726ba8bc53087a60e7a84ca08883a4c892231" + integrity sha512-vIGUEScd1cdDgR6sqn2M08sJTRLQp6Dk/eIkCeO4PFHxZMOgy+uYLPMC4ix3PEfM5Au/x3uQ/5Tl0DpXXZsJ/Q== + dependencies: + "@jest/environment" "^24.8.0" + "@jest/fake-timers" "^24.8.0" + "@jest/types" "^24.8.0" + jest-mock "^24.8.0" + jest-util "^24.8.0" + +jest-get-type@^24.8.0: + version "24.8.0" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-24.8.0.tgz#a7440de30b651f5a70ea3ed7ff073a32dfe646fc" + integrity sha512-RR4fo8jEmMD9zSz2nLbs2j0zvPpk/KCEz3a62jJWbd2ayNo0cb+KFRxPHVhE4ZmgGJEQp0fosmNz84IfqM8cMQ== + +jest-haste-map@^24.8.0: + version "24.8.1" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-24.8.1.tgz#f39cc1d2b1d907e014165b4bd5a957afcb992982" + integrity sha512-SwaxMGVdAZk3ernAx2Uv2sorA7jm3Kx+lR0grp6rMmnY06Kn/urtKx1LPN2mGTea4fCT38impYT28FfcLUhX0g== + dependencies: + "@jest/types" "^24.8.0" + anymatch "^2.0.0" + fb-watchman "^2.0.0" + graceful-fs "^4.1.15" + invariant "^2.2.4" + jest-serializer "^24.4.0" + jest-util "^24.8.0" + jest-worker "^24.6.0" + micromatch "^3.1.10" + sane "^4.0.3" + walker "^1.0.7" + optionalDependencies: + fsevents "^1.2.7" + +jest-jasmine2@^24.8.0: + version "24.8.0" + resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-24.8.0.tgz#a9c7e14c83dd77d8b15e820549ce8987cc8cd898" + integrity sha512-cEky88npEE5LKd5jPpTdDCLvKkdyklnaRycBXL6GNmpxe41F0WN44+i7lpQKa/hcbXaQ+rc9RMaM4dsebrYong== + dependencies: + "@babel/traverse" "^7.1.0" + "@jest/environment" "^24.8.0" + "@jest/test-result" "^24.8.0" + "@jest/types" "^24.8.0" + chalk "^2.0.1" + co "^4.6.0" + expect "^24.8.0" + is-generator-fn "^2.0.0" + jest-each "^24.8.0" + jest-matcher-utils "^24.8.0" + jest-message-util "^24.8.0" + jest-runtime "^24.8.0" + jest-snapshot "^24.8.0" + jest-util "^24.8.0" + pretty-format "^24.8.0" + throat "^4.0.0" + +jest-leak-detector@^24.8.0: + version "24.8.0" + resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-24.8.0.tgz#c0086384e1f650c2d8348095df769f29b48e6980" + integrity sha512-cG0yRSK8A831LN8lIHxI3AblB40uhv0z+SsQdW3GoMMVcK+sJwrIIyax5tu3eHHNJ8Fu6IMDpnLda2jhn2pD/g== + dependencies: + pretty-format "^24.8.0" + +jest-matcher-utils@^24.8.0: + version "24.8.0" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-24.8.0.tgz#2bce42204c9af12bde46f83dc839efe8be832495" + integrity sha512-lex1yASY51FvUuHgm0GOVj7DCYEouWSlIYmCW7APSqB9v8mXmKSn5+sWVF0MhuASG0bnYY106/49JU1FZNl5hw== + dependencies: + chalk "^2.0.1" + jest-diff "^24.8.0" + jest-get-type "^24.8.0" + pretty-format "^24.8.0" + +jest-message-util@^24.8.0: + version "24.8.0" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-24.8.0.tgz#0d6891e72a4beacc0292b638685df42e28d6218b" + integrity sha512-p2k71rf/b6ns8btdB0uVdljWo9h0ovpnEe05ZKWceQGfXYr4KkzgKo3PBi8wdnd9OtNh46VpNIJynUn/3MKm1g== + dependencies: + "@babel/code-frame" "^7.0.0" + "@jest/test-result" "^24.8.0" + "@jest/types" "^24.8.0" + "@types/stack-utils" "^1.0.1" + chalk "^2.0.1" + micromatch "^3.1.10" + slash "^2.0.0" + stack-utils "^1.0.1" + +jest-mock@^24.8.0: + version "24.8.0" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-24.8.0.tgz#2f9d14d37699e863f1febf4e4d5a33b7fdbbde56" + integrity sha512-6kWugwjGjJw+ZkK4mDa0Df3sDlUTsV47MSrT0nGQ0RBWJbpODDQ8MHDVtGtUYBne3IwZUhtB7elxHspU79WH3A== + dependencies: + "@jest/types" "^24.8.0" + +jest-pnp-resolver@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.1.tgz#ecdae604c077a7fbc70defb6d517c3c1c898923a" + integrity sha512-pgFw2tm54fzgYvc/OHrnysABEObZCUNFnhjoRjaVOCN8NYc032/gVjPaHD4Aq6ApkSieWtfKAFQtmDKAmhupnQ== + +jest-regex-util@^24.3.0: + version "24.3.0" + resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-24.3.0.tgz#d5a65f60be1ae3e310d5214a0307581995227b36" + integrity sha512-tXQR1NEOyGlfylyEjg1ImtScwMq8Oh3iJbGTjN7p0J23EuVX1MA8rwU69K4sLbCmwzgCUbVkm0FkSF9TdzOhtg== + +jest-resolve-dependencies@^24.8.0: + version "24.8.0" + resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-24.8.0.tgz#19eec3241f2045d3f990dba331d0d7526acff8e0" + integrity sha512-hyK1qfIf/krV+fSNyhyJeq3elVMhK9Eijlwy+j5jqmZ9QsxwKBiP6qukQxaHtK8k6zql/KYWwCTQ+fDGTIJauw== + dependencies: + "@jest/types" "^24.8.0" + jest-regex-util "^24.3.0" + jest-snapshot "^24.8.0" + +jest-resolve@^24.8.0: + version "24.8.0" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-24.8.0.tgz#84b8e5408c1f6a11539793e2b5feb1b6e722439f" + integrity sha512-+hjSzi1PoRvnuOICoYd5V/KpIQmkAsfjFO71458hQ2Whi/yf1GDeBOFj8Gxw4LrApHsVJvn5fmjcPdmoUHaVKw== + dependencies: + "@jest/types" "^24.8.0" + browser-resolve "^1.11.3" + chalk "^2.0.1" + jest-pnp-resolver "^1.2.1" + realpath-native "^1.1.0" + +jest-runner@^24.8.0: + version "24.8.0" + resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-24.8.0.tgz#4f9ae07b767db27b740d7deffad0cf67ccb4c5bb" + integrity sha512-utFqC5BaA3JmznbissSs95X1ZF+d+4WuOWwpM9+Ak356YtMhHE/GXUondZdcyAAOTBEsRGAgH/0TwLzfI9h7ow== + dependencies: + "@jest/console" "^24.7.1" + "@jest/environment" "^24.8.0" + "@jest/test-result" "^24.8.0" + "@jest/types" "^24.8.0" + chalk "^2.4.2" + exit "^0.1.2" + graceful-fs "^4.1.15" + jest-config "^24.8.0" + jest-docblock "^24.3.0" + jest-haste-map "^24.8.0" + jest-jasmine2 "^24.8.0" + jest-leak-detector "^24.8.0" + jest-message-util "^24.8.0" + jest-resolve "^24.8.0" + jest-runtime "^24.8.0" + jest-util "^24.8.0" + jest-worker "^24.6.0" + source-map-support "^0.5.6" + throat "^4.0.0" + +jest-runtime@^24.8.0: + version "24.8.0" + resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-24.8.0.tgz#05f94d5b05c21f6dc54e427cd2e4980923350620" + integrity sha512-Mq0aIXhvO/3bX44ccT+czU1/57IgOMyy80oM0XR/nyD5zgBcesF84BPabZi39pJVA6UXw+fY2Q1N+4BiVUBWOA== + dependencies: + "@jest/console" "^24.7.1" + "@jest/environment" "^24.8.0" + "@jest/source-map" "^24.3.0" + "@jest/transform" "^24.8.0" + "@jest/types" "^24.8.0" + "@types/yargs" "^12.0.2" + chalk "^2.0.1" + exit "^0.1.2" + glob "^7.1.3" + graceful-fs "^4.1.15" + jest-config "^24.8.0" + jest-haste-map "^24.8.0" + jest-message-util "^24.8.0" + jest-mock "^24.8.0" + jest-regex-util "^24.3.0" + jest-resolve "^24.8.0" + jest-snapshot "^24.8.0" + jest-util "^24.8.0" + jest-validate "^24.8.0" + realpath-native "^1.1.0" + slash "^2.0.0" + strip-bom "^3.0.0" + yargs "^12.0.2" + +jest-serializer@^24.4.0: + version "24.4.0" + resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-24.4.0.tgz#f70c5918c8ea9235ccb1276d232e459080588db3" + integrity sha512-k//0DtglVstc1fv+GY/VHDIjrtNjdYvYjMlbLUed4kxrE92sIUewOi5Hj3vrpB8CXfkJntRPDRjCrCvUhBdL8Q== + +jest-snapshot@^24.8.0: + version "24.8.0" + resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-24.8.0.tgz#3bec6a59da2ff7bc7d097a853fb67f9d415cb7c6" + integrity sha512-5ehtWoc8oU9/cAPe6fez6QofVJLBKyqkY2+TlKTOf0VllBB/mqUNdARdcjlZrs9F1Cv+/HKoCS/BknT0+tmfPg== + dependencies: + "@babel/types" "^7.0.0" + "@jest/types" "^24.8.0" + chalk "^2.0.1" + expect "^24.8.0" + jest-diff "^24.8.0" + jest-matcher-utils "^24.8.0" + jest-message-util "^24.8.0" + jest-resolve "^24.8.0" mkdirp "^0.5.1" - rimraf "^2.4.4" - source-map "^0.5.3" - -istanbul-reports@^1.0.0-alpha: - version "1.0.0-alpha.8" - resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-1.0.0-alpha.8.tgz#094830f4c7f3d482e466aac8abda2495f9ae4689" - dependencies: - handlebars "^4.0.3" - -istanbul@^0.4.5: - version "0.4.5" - resolved "https://registry.yarnpkg.com/istanbul/-/istanbul-0.4.5.tgz#65c7d73d4c4da84d4f3ac310b918fb0b8033733b" - dependencies: - abbrev "1.0.x" - async "1.x" - escodegen "1.8.x" - esprima "2.7.x" - glob "^5.0.15" - handlebars "^4.0.1" - js-yaml "3.x" - mkdirp "0.5.x" - nopt "3.x" - once "1.x" - resolve "1.1.x" - supports-color "^3.1.0" - which "^1.1.1" - wordwrap "^1.0.0" - -jest-changed-files@^17.0.2: - version "17.0.2" - resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-17.0.2.tgz#f5657758736996f590a51b87e5c9369d904ba7b7" - -jest-cli@^17.0.3: - version "17.0.3" - resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-17.0.3.tgz#700b8c02a9ea0ec9eab0cd5a9fd42d8a858ce146" - dependencies: - ansi-escapes "^1.4.0" - callsites "^2.0.0" - chalk "^1.1.1" - graceful-fs "^4.1.6" - is-ci "^1.0.9" - istanbul-api "^1.0.0-aplha.10" - istanbul-lib-coverage "^1.0.0" - istanbul-lib-instrument "^1.1.1" - jest-changed-files "^17.0.2" - jest-config "^17.0.3" - jest-environment-jsdom "^17.0.2" - jest-file-exists "^17.0.0" - jest-haste-map "^17.0.3" - jest-jasmine2 "^17.0.3" - jest-mock "^17.0.2" - jest-resolve "^17.0.3" - jest-resolve-dependencies "^17.0.3" - jest-runtime "^17.0.3" - jest-snapshot "^17.0.3" - jest-util "^17.0.2" - json-stable-stringify "^1.0.0" - node-notifier "^4.6.1" - sane "~1.4.1" - strip-ansi "^3.0.1" - throat "^3.0.0" - which "^1.1.1" - worker-farm "^1.3.1" - yargs "^6.3.0" - -jest-config@^17.0.3: - version "17.0.3" - resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-17.0.3.tgz#b6ed75d90d090b731fd894231904cadb7d5a5df2" - dependencies: - chalk "^1.1.1" - istanbul "^0.4.5" - jest-environment-jsdom "^17.0.2" - jest-environment-node "^17.0.2" - jest-jasmine2 "^17.0.3" - jest-mock "^17.0.2" - jest-resolve "^17.0.3" - jest-util "^17.0.2" - json-stable-stringify "^1.0.0" - -jest-diff@^17.0.3: - version "17.0.3" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-17.0.3.tgz#8fb31efab3b314d7b61b7b66b0bdea617ef1c02f" - dependencies: - chalk "^1.1.3" - diff "^3.0.0" - jest-matcher-utils "^17.0.3" - pretty-format "~4.2.1" - -jest-environment-jsdom@^17.0.2: - version "17.0.2" - resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-17.0.2.tgz#a3098dc29806d40802c52b62b848ab6aa00fdba0" - dependencies: - jest-mock "^17.0.2" - jest-util "^17.0.2" - jsdom "^9.8.1" - -jest-environment-node@^17.0.2: - version "17.0.2" - resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-17.0.2.tgz#aff6133f4ca2faddcc5b0ce7d25cec83e16d8463" - dependencies: - jest-mock "^17.0.2" - jest-util "^17.0.2" - -jest-file-exists@^17.0.0: - version "17.0.0" - resolved "https://registry.yarnpkg.com/jest-file-exists/-/jest-file-exists-17.0.0.tgz#7f63eb73a1c43a13f461be261768b45af2cdd169" - -jest-haste-map@^17.0.3: - version "17.0.3" - resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-17.0.3.tgz#5232783e70577217b6b17d2a1c1766637a1d2fbd" - dependencies: - fb-watchman "^1.9.0" - graceful-fs "^4.1.6" - multimatch "^2.1.0" - sane "~1.4.1" - worker-farm "^1.3.1" - -jest-jasmine2@^17.0.3: - version "17.0.3" - resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-17.0.3.tgz#d4336b89f3ad288269a1c8e2bfc180dcf89c6ad1" - dependencies: - graceful-fs "^4.1.6" - jest-matchers "^17.0.3" - jest-snapshot "^17.0.3" - jest-util "^17.0.2" - -jest-matcher-utils@^17.0.3: - version "17.0.3" - resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-17.0.3.tgz#f108e49b956e152c6626dcc0aba864f59ab7b0d3" - dependencies: - chalk "^1.1.3" - pretty-format "~4.2.1" - -jest-matchers@^17.0.3: - version "17.0.3" - resolved "https://registry.yarnpkg.com/jest-matchers/-/jest-matchers-17.0.3.tgz#88b95348c919343db86d08f12354a8650ae7eddf" - dependencies: - jest-diff "^17.0.3" - jest-matcher-utils "^17.0.3" - jest-util "^17.0.2" - -jest-mock@^17.0.2: - version "17.0.2" - resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-17.0.2.tgz#3dfe9221afd9aa61b3d9992840813a358bb2f429" - -jest-resolve-dependencies@^17.0.3: - version "17.0.3" - resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-17.0.3.tgz#bbd37f4643704b97a980927212f3ab12b06e8894" - dependencies: - jest-file-exists "^17.0.0" - jest-resolve "^17.0.3" - -jest-resolve@^17.0.3: - version "17.0.3" - resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-17.0.3.tgz#7692a79de2831874375e9d664bc782c29e4da262" - dependencies: - browser-resolve "^1.11.2" - jest-file-exists "^17.0.0" - jest-haste-map "^17.0.3" - resolve "^1.1.6" - -jest-runtime@^17.0.3: - version "17.0.3" - resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-17.0.3.tgz#eff4055fe8c3e17c95ed1aaaf5f719c420b86b1f" - dependencies: - babel-core "^6.0.0" - babel-jest "^17.0.2" - babel-plugin-istanbul "^2.0.0" - chalk "^1.1.3" - graceful-fs "^4.1.6" - jest-config "^17.0.3" - jest-file-exists "^17.0.0" - jest-haste-map "^17.0.3" - jest-mock "^17.0.2" - jest-resolve "^17.0.3" - jest-snapshot "^17.0.3" - jest-util "^17.0.2" - json-stable-stringify "^1.0.0" - multimatch "^2.1.0" - yargs "^6.3.0" - -jest-snapshot@^17.0.3: - version "17.0.3" - resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-17.0.3.tgz#c8199db4ccbd5515cfecc8e800ab076bdda7abc0" - dependencies: - jest-diff "^17.0.3" - jest-file-exists "^17.0.0" - jest-matcher-utils "^17.0.3" - jest-util "^17.0.2" natural-compare "^1.4.0" - pretty-format "~4.2.1" - -jest-util@^17.0.2: - version "17.0.2" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-17.0.2.tgz#9fd9da8091e9904fb976da7e4d8912ca26968638" - dependencies: - chalk "^1.1.1" - diff "^3.0.0" - graceful-fs "^4.1.6" - jest-file-exists "^17.0.0" - jest-mock "^17.0.2" + pretty-format "^24.8.0" + semver "^5.5.0" + +jest-util@^24.8.0: + version "24.8.0" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-24.8.0.tgz#41f0e945da11df44cc76d64ffb915d0716f46cd1" + integrity sha512-DYZeE+XyAnbNt0BG1OQqKy/4GVLPtzwGx5tsnDrFcax36rVE3lTA5fbvgmbVPUZf9w77AJ8otqR4VBbfFJkUZA== + dependencies: + "@jest/console" "^24.7.1" + "@jest/fake-timers" "^24.8.0" + "@jest/source-map" "^24.3.0" + "@jest/test-result" "^24.8.0" + "@jest/types" "^24.8.0" + callsites "^3.0.0" + chalk "^2.0.1" + graceful-fs "^4.1.15" + is-ci "^2.0.0" mkdirp "^0.5.1" + slash "^2.0.0" + source-map "^0.6.0" + +jest-validate@^24.8.0: + version "24.8.0" + resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-24.8.0.tgz#624c41533e6dfe356ffadc6e2423a35c2d3b4849" + integrity sha512-+/N7VOEMW1Vzsrk3UWBDYTExTPwf68tavEPKDnJzrC6UlHtUDU/fuEdXqFoHzv9XnQ+zW6X3qMZhJ3YexfeLDA== + dependencies: + "@jest/types" "^24.8.0" + camelcase "^5.0.0" + chalk "^2.0.1" + jest-get-type "^24.8.0" + leven "^2.1.0" + pretty-format "^24.8.0" + +jest-watcher@^24.8.0: + version "24.8.0" + resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-24.8.0.tgz#58d49915ceddd2de85e238f6213cef1c93715de4" + integrity sha512-SBjwHt5NedQoVu54M5GEx7cl7IGEFFznvd/HNT8ier7cCAx/Qgu9ZMlaTQkvK22G1YOpcWBLQPFSImmxdn3DAw== + dependencies: + "@jest/test-result" "^24.8.0" + "@jest/types" "^24.8.0" + "@types/yargs" "^12.0.9" + ansi-escapes "^3.0.0" + chalk "^2.0.1" + jest-util "^24.8.0" + string-length "^2.0.0" + +jest-worker@^24.6.0: + version "24.6.0" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-24.6.0.tgz#7f81ceae34b7cde0c9827a6980c35b7cdc0161b3" + integrity sha512-jDwgW5W9qGNvpI1tNnvajh0a5IE/PuGLFmHk6aR/BZFz8tSgGw17GsDPXAJ6p91IvYDjOw8GpFbvvZGAK+DPQQ== + dependencies: + merge-stream "^1.0.1" + supports-color "^6.1.0" + +jest-yaml-transform@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/jest-yaml-transform/-/jest-yaml-transform-0.2.0.tgz#7e14ed59e563283b73be7e8f387f352e669147a4" + integrity sha512-Pu1KyURgi0Qfi0QrUr2xwV7SlYRxasLS+bPZfLxFks93LCIYFHdGnQ7pNxvqOrZdyBNXthCUT98JBjo4UCWflQ== + dependencies: + flat "^4.0.0" + js-yaml "^3.9.1" -jest@^17.0.3: - version "17.0.3" - resolved "https://registry.yarnpkg.com/jest/-/jest-17.0.3.tgz#89c43b30b0aaad42462e9ea701352dacbad4a354" +jest@^24.1.0: + version "24.8.0" + resolved "https://registry.yarnpkg.com/jest/-/jest-24.8.0.tgz#d5dff1984d0d1002196e9b7f12f75af1b2809081" + integrity sha512-o0HM90RKFRNWmAWvlyV8i5jGZ97pFwkeVoGvPW1EtLTgJc2+jcuqcbbqcSZLE/3f2S5pt0y2ZBETuhpWNl1Reg== dependencies: - jest-cli "^17.0.3" + import-local "^2.0.0" + jest-cli "^24.8.0" jmespath@0.15.0: version "0.15.0" resolved "https://registry.yarnpkg.com/jmespath/-/jmespath-0.15.0.tgz#a3f222a9aae9f966f5d27c796510e28091764217" + integrity sha1-o/Iiqarp+Wb10nx5ZRDigJF2Qhc= jodid25519@^1.0.0: version "1.0.2" @@ -4773,24 +6402,31 @@ js-base64@^2.1.9: version "2.1.9" resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.1.9.tgz#f0e80ae039a4bd654b5f281fc93f04a914a7fcce" +js-levenshtein@^1.1.3: + version "1.1.6" + resolved "https://registry.yarnpkg.com/js-levenshtein/-/js-levenshtein-1.1.6.tgz#c6cee58eb3550372df8deb85fad5ce66ce01d59d" + integrity sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g== + js-tokens@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-1.0.3.tgz#14e56eb68c8f1a92c43d59f5014ec29dc20f2ae1" -js-tokens@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-2.0.0.tgz#79903f5563ee778cc1162e6dcf1a0027c97f9cb5" +"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== js-tokens@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" -js-yaml@3.x, js-yaml@^3.5.1: - version "3.6.1" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.6.1.tgz#6e5fe67d8b205ce4d22fad05b7781e8dadcc4b30" +js-yaml@^3.13.0, js-yaml@^3.13.1, js-yaml@^3.9.1: + version "3.13.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" + integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== dependencies: argparse "^1.0.7" - esprima "^2.6.0" + esprima "^4.0.0" js-yaml@~3.7.0: version "3.7.0" @@ -4803,35 +6439,47 @@ jsbn@~0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.0.tgz#650987da0dd74f4ebf5a11377a2aa2d273e97dfd" -jsdom@^9.8.1: - version "9.9.1" - resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-9.9.1.tgz#84f3972ad394ab963233af8725211bce4d01bfd5" +jsdom@^11.5.1: + version "11.12.0" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-11.12.0.tgz#1a80d40ddd378a1de59656e9e6dc5a3ba8657bc8" + integrity sha512-y8Px43oyiBM13Zc1z780FrfNLJCXTL40EWlty/LXUtcjykRBNgLlCjWXpfSPBl2iv+N7koQN+dvqszHZgT/Fjw== dependencies: - abab "^1.0.0" - acorn "^2.4.0" - acorn-globals "^1.0.4" + abab "^2.0.0" + acorn "^5.5.3" + acorn-globals "^4.1.0" array-equal "^1.0.0" - content-type-parser "^1.0.1" - cssom ">= 0.3.0 < 0.4.0" - cssstyle ">= 0.2.36 < 0.3.0" - escodegen "^1.6.1" - html-encoding-sniffer "^1.0.1" - iconv-lite "^0.4.13" - nwmatcher ">= 1.3.9 < 2.0.0" - parse5 "^1.5.1" - request "^2.55.0" - sax "^1.1.4" - symbol-tree ">= 3.1.0 < 4.0.0" - tough-cookie "^2.3.1" - webidl-conversions "^3.0.1" - whatwg-encoding "^1.0.1" - whatwg-url "^4.1.0" - xml-name-validator ">= 2.0.1 < 3.0.0" + cssom ">= 0.3.2 < 0.4.0" + cssstyle "^1.0.0" + data-urls "^1.0.0" + domexception "^1.0.1" + escodegen "^1.9.1" + html-encoding-sniffer "^1.0.2" + left-pad "^1.3.0" + nwsapi "^2.0.7" + parse5 "4.0.0" + pn "^1.1.0" + request "^2.87.0" + request-promise-native "^1.0.5" + sax "^1.2.4" + symbol-tree "^3.2.2" + tough-cookie "^2.3.4" + w3c-hr-time "^1.0.1" + webidl-conversions "^4.0.2" + whatwg-encoding "^1.0.3" + whatwg-mimetype "^2.1.0" + whatwg-url "^6.4.1" + ws "^5.2.0" + xml-name-validator "^3.0.0" jsesc@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" +jsesc@^2.5.1: + version "2.5.2" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" + integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== + jsesc@~0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" @@ -4840,11 +6488,31 @@ json-loader@^0.5.4: version "0.5.7" resolved "https://registry.yarnpkg.com/json-loader/-/json-loader-0.5.7.tgz#dca14a70235ff82f0ac9a3abeb60d337a365185d" +json-parse-better-errors@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" + integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== + +json-schema-traverse@^0.3.0: + version "0.3.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340" + integrity sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A= + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + json-schema@0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" -json-stable-stringify@^1.0.0, json-stable-stringify@^1.0.1: +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= + +json-stable-stringify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" dependencies: @@ -4853,6 +6521,7 @@ json-stable-stringify@^1.0.0, json-stable-stringify@^1.0.1: json-stable-stringify@~0.0.0: version "0.0.1" resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-0.0.1.tgz#611c23e814db375527df851193db59dd2af27f45" + integrity sha1-YRwj6BTbN1Un34URk9tZ3Sryf0U= dependencies: jsonify "~0.0.0" @@ -4860,21 +6529,32 @@ json-stable-stringify@~0.0.0: version "5.0.1" resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" -json5@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/json5/-/json5-0.4.0.tgz#054352e4c4c80c86c0923877d449de176a732c8d" - json5@^0.5.0, json5@^0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" +json5@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.0.tgz#e7a0c62c48285c628d20a10b85c89bb807c32850" + integrity sha512-8Mh9h6xViijj36g7Dxi+Y4S6hNGV96vcJZr/SrlHh1LR/pEn/8j/+qIBbs44YKl69Lrfctp4QD+AdWLTMqEZAQ== + dependencies: + minimist "^1.2.0" + +jsonfile@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" + integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss= + optionalDependencies: + graceful-fs "^4.1.6" + jsonify@~0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" jsonparse@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.2.0.tgz#5c0c5685107160e72fe7489bddea0b44c2bc67bd" + version "1.3.1" + resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" + integrity sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA= jsonpointer@^4.0.0: version "4.0.0" @@ -4888,12 +6568,12 @@ jsprim@^1.2.2: json-schema "0.2.3" verror "1.3.6" -jsx-ast-utils@^1.3.1: - version "1.3.2" - resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-1.3.2.tgz#dff658782705352111f9865d40471bc4a955961e" +jsx-ast-utils@^2.0.1, jsx-ast-utils@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-2.1.0.tgz#0ee4e2c971fb9601c67b5641b71be80faecf0b36" + integrity sha512-yDGDG2DS4JcqhA6blsuYbtsT09xL8AoLuUR2Gb5exrw7UEM19sBcOTq+YBBhrNbl0PUC4R4LnFu+dHg2HKeVvA== dependencies: - acorn-jsx "^3.0.1" - object-assign "^4.1.0" + array-includes "^3.0.3" kind-of@^3.0.2: version "3.0.4" @@ -4921,12 +6601,17 @@ kind-of@^6.0.0, kind-of@^6.0.2: version "6.0.2" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051" +kleur@^3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" + integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== + labeled-stream-splicer@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/labeled-stream-splicer/-/labeled-stream-splicer-2.0.0.tgz#a52e1d138024c00b86b1c0c91f677918b8ae0a59" + version "2.0.2" + resolved "https://registry.yarnpkg.com/labeled-stream-splicer/-/labeled-stream-splicer-2.0.2.tgz#42a41a16abcd46fd046306cf4f2c3576fffb1c21" + integrity sha512-Ca4LSXFFZUjPScRaqOcFxneA0VpKZr4MMYCljyQr4LIewTLb3Y0IUTIsnBBsVubIeEfxeSZpSjSsRM8APEQaAw== dependencies: inherits "^2.0.1" - isarray "~0.0.1" stream-splicer "^2.0.0" lazy-cache@^1.0.3: @@ -4939,23 +6624,31 @@ lcid@^1.0.0: dependencies: invert-kv "^1.0.0" +lcid@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/lcid/-/lcid-2.0.0.tgz#6ef5d2df60e52f82eb228a4c373e8d1f397253cf" + integrity sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA== + dependencies: + invert-kv "^2.0.0" + +left-pad@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/left-pad/-/left-pad-1.3.0.tgz#5b8a3a7765dfe001261dde915589e782f8c94d1e" + integrity sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA== + +leven@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/leven/-/leven-2.1.0.tgz#c2e7a9f772094dee9d34202ae8acce4687875580" + integrity sha1-wuep93IJTe6dNCAq6KzORoeHVYA= + levn@^0.3.0, levn@~0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" + integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= dependencies: prelude-ls "~1.1.2" type-check "~0.3.2" -lexical-scope@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/lexical-scope/-/lexical-scope-1.2.0.tgz#fcea5edc704a4b3a8796cdca419c3a0afaf22df4" - dependencies: - astw "^2.0.0" - -livereload-js@^2.2.0: - version "2.2.2" - resolved "https://registry.yarnpkg.com/livereload-js/-/livereload-js-2.2.2.tgz#6c87257e648ab475bc24ea257457edcc1f8d0bc2" - load-json-file@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" @@ -4966,6 +6659,26 @@ load-json-file@^1.0.0: pinkie-promise "^2.0.0" strip-bom "^2.0.0" +load-json-file@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8" + integrity sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg= + dependencies: + graceful-fs "^4.1.2" + parse-json "^2.2.0" + pify "^2.0.0" + strip-bom "^3.0.0" + +load-json-file@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b" + integrity sha1-L19Fq5HjMhYjT9U62rZo607AmTs= + dependencies: + graceful-fs "^4.1.2" + parse-json "^4.0.0" + pify "^3.0.0" + strip-bom "^3.0.0" + loader-runner@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.3.0.tgz#f482aea82d543e07921700d5a46ef26fdac6b8a2" @@ -4987,13 +6700,21 @@ loader-utils@^1.0.2: emojis-list "^2.0.0" json5 "^0.5.0" -lodash._arraycopy@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/lodash._arraycopy/-/lodash._arraycopy-3.0.0.tgz#76e7b7c1f1fb92547374878a562ed06a3e50f6e1" +locate-path@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" + integrity sha1-K1aLJl7slExtnA3pw9u7ygNUzY4= + dependencies: + p-locate "^2.0.0" + path-exists "^3.0.0" -lodash._arrayeach@^3.0.0: +locate-path@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/lodash._arrayeach/-/lodash._arrayeach-3.0.0.tgz#bab156b2a90d3f1bbd5c653403349e5e5933ef9e" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" + integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== + dependencies: + p-locate "^3.0.0" + path-exists "^3.0.0" lodash._baseassign@^3.0.0: version "3.2.0" @@ -5002,25 +6723,10 @@ lodash._baseassign@^3.0.0: lodash._basecopy "^3.0.0" lodash.keys "^3.0.0" -lodash._baseclone@^3.0.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/lodash._baseclone/-/lodash._baseclone-3.3.0.tgz#303519bf6393fe7e42f34d8b630ef7794e3542b7" - dependencies: - lodash._arraycopy "^3.0.0" - lodash._arrayeach "^3.0.0" - lodash._baseassign "^3.0.0" - lodash._basefor "^3.0.0" - lodash.isarray "^3.0.0" - lodash.keys "^3.0.0" - lodash._basecopy@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz#8da0e6a876cf344c0ad8a54882111dd3c5c7ca36" -lodash._basefor@^3.0.0: - version "3.0.3" - resolved "https://registry.yarnpkg.com/lodash._basefor/-/lodash._basefor-3.0.3.tgz#7550b4e9218ef09fad24343b612021c79b4c20c2" - lodash._bindcallback@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz#e531c27644cf8b57a99e17ed95b35c748789392e" @@ -5051,6 +6757,7 @@ lodash._isiterateecall@^3.0.0: lodash._reinterpolate@~3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" + integrity sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0= lodash._root@^3.0.0: version "3.0.1" @@ -5064,23 +6771,12 @@ lodash.assign@^3.0.0: lodash._createassigner "^3.0.0" lodash.keys "^3.0.0" -lodash.assign@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-4.2.0.tgz#0d99f3ccd7a6d261d19bdaeb9245005d285808e7" - lodash.camelcase@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-3.0.1.tgz#932c8b87f8a4377897c67197533282f97aeac298" dependencies: lodash._createcompounder "^3.0.0" -lodash.clonedeep@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-3.0.2.tgz#a0a1e40d82a5ea89ff5b147b8444ed63d92827db" - dependencies: - lodash._baseclone "^3.0.0" - lodash._bindcallback "^3.0.0" - lodash.clonedeep@^4.0.1: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" @@ -5126,16 +6822,18 @@ lodash.keys@^3.0.0: lodash.map@^4.5.1: version "4.6.0" resolved "https://registry.yarnpkg.com/lodash.map/-/lodash.map-4.6.0.tgz#771ec7839e3473d9c4cde28b19394c3562f4f6d3" + integrity sha1-dx7Hg540c9nEzeKLGTlMNWL09tM= -lodash.memoize@^4.1.0, lodash.memoize@^4.1.2: +lodash.memoize@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" lodash.memoize@~3.0.3: version "3.0.4" resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-3.0.4.tgz#2dcbd2c287cbc0a55cc42328bd0c736150d53e3f" + integrity sha1-LcvSwofLwKVcxCMovQxzYVDVPj8= -lodash.merge@^4.0.1: +lodash.merge@^4.0.1, lodash.merge@^4.6.0: version "4.6.1" resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.1.tgz#adc25d9cb99b9391c59624f379fbba60d7111d54" @@ -5155,17 +6853,19 @@ lodash.padstart@^4.1.0: version "4.6.1" resolved "https://registry.yarnpkg.com/lodash.padstart/-/lodash.padstart-4.6.1.tgz#d2e3eebff0d9d39ad50f5cbd1b52a7bce6bb611b" -lodash.pickby@^4.6.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/lodash.pickby/-/lodash.pickby-4.6.0.tgz#7dea21d8c18d7703a27c704c15d3b84a67e33aff" - lodash.restparam@^3.0.0: version "3.6.1" resolved "https://registry.yarnpkg.com/lodash.restparam/-/lodash.restparam-3.6.1.tgz#936a4e309ef330a7645ed4145986c85ae5b20805" +lodash.sortby@^4.7.0: + version "4.7.0" + resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" + integrity sha1-7dFMgk4sycHgsKG0K7UhBRakJDg= + lodash.template@^4.2.4: version "4.4.0" resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-4.4.0.tgz#e73a0385c8355591746e020b99679c690e68fba0" + integrity sha1-5zoDhcg1VZF0bgILmWecaQ5o+6A= dependencies: lodash._reinterpolate "~3.0.0" lodash.templatesettings "^4.0.0" @@ -5173,10 +6873,21 @@ lodash.template@^4.2.4: lodash.templatesettings@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-4.1.0.tgz#2b4d4e95ba440d915ff08bc899e4553666713316" + integrity sha1-K01OlbpEDZFf8IvImeRVNmZxMxY= dependencies: lodash._reinterpolate "~3.0.0" -lodash.uniq@^4.3.0, lodash.uniq@^4.5.0: +lodash.toarray@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.toarray/-/lodash.toarray-4.4.0.tgz#24c4bfcd6b2fba38bfd0594db1179d8e9b656561" + integrity sha1-JMS/zWsvuji/0FlNsRedjptlZWE= + +lodash.unescape@4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/lodash.unescape/-/lodash.unescape-4.0.1.tgz#bf2249886ce514cda112fae9218cdc065211fc9c" + integrity sha1-vyJJiGzlFM2hEvrpIYzcBlIR/Jw= + +lodash.uniq@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" @@ -5186,15 +6897,16 @@ lodash.words@^3.0.0: dependencies: lodash._root "^3.0.0" -lodash@4.15.0: - version "4.15.0" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.15.0.tgz#3162391d8f0140aa22cf8f6b3c34d6b7f63d3aa9" +lodash@4.17.11, lodash@^4.15.0, lodash@^4.17.11, lodash@^4.3.0: + version "4.17.11" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d" + integrity sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg== lodash@^3.6.0: version "3.10.1" resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.10.1.tgz#5bf45e8e49ba4189e17d482789dfd15bd140b7b6" -lodash@^4.0.0, lodash@^4.1.0, lodash@^4.13.1, lodash@^4.14.0, lodash@^4.2.0, lodash@^4.3.0: +lodash@^4.0.0, lodash@^4.13.1, lodash@^4.14.0, lodash@^4.2.0: version "4.16.4" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.16.4.tgz#01ce306b9bad1319f2a5528674f88297aeb70127" @@ -5206,15 +6918,25 @@ lodash@~1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/lodash/-/lodash-1.3.1.tgz#a4663b53686b895ff074e2ba504dfb76a8e2b770" -lodash@~3.5.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.5.0.tgz#19bb3f4d51278f0b8c818ed145c74ecf9fe40e6d" +log-symbols@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-2.2.0.tgz#5740e1c5d6f0dfda4ad9323b5332107ef6b4c40a" + integrity sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg== + dependencies: + chalk "^2.0.1" -log-symbols@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-1.0.2.tgz#376ff7b58ea3086a0f09facc74617eca501e1a18" +loglevel-colored-level-prefix@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/loglevel-colored-level-prefix/-/loglevel-colored-level-prefix-1.0.0.tgz#6a40218fdc7ae15fc76c3d0f3e676c465388603e" + integrity sha1-akAhj9x64V/HbD0PPmdsRlOIYD4= dependencies: - chalk "^1.0.0" + chalk "^1.1.3" + loglevel "^1.4.1" + +loglevel@^1.4.1: + version "1.6.3" + resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.6.3.tgz#77f2eb64be55a404c9fd04ad16d57c1d6d6b1280" + integrity sha512-LoEDv5pgpvWgPF4kNYuIp0qqSJVWak/dML0RY74xlzMZiT9w77teNAwKYKWBTYjlokMirg+o3jBwp+vlLrcfAA== longest@^1.0.1: version "1.0.1" @@ -5226,6 +6948,13 @@ loose-envify@^1.0.0: dependencies: js-tokens "^1.0.1" +loose-envify@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== + dependencies: + js-tokens "^3.0.0 || ^4.0.0" + loud-rejection@^1.0.0: version "1.6.0" resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f" @@ -5233,12 +6962,43 @@ loud-rejection@^1.0.0: currently-unhandled "^0.4.1" signal-exit "^3.0.0" +lru-cache@^4.0.1: + version "4.1.5" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" + integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g== + dependencies: + pseudomap "^1.0.2" + yallist "^2.1.2" + +make-dir@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" + integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA== + dependencies: + pify "^4.0.1" + semver "^5.6.0" + +make-plural@^4.1.1: + version "4.3.0" + resolved "https://registry.yarnpkg.com/make-plural/-/make-plural-4.3.0.tgz#f23de08efdb0cac2e0c9ba9f315b0dff6b4c2735" + integrity sha512-xTYd4JVHpSCW+aqDof6w/MebaMVNTVYBZhbB/vi513xXdiPT92JMVCo0Jq8W2UZnzYRFeVbQiQ+I25l13JuKvA== + optionalDependencies: + minimist "^1.2.0" + makeerror@1.0.x: version "1.0.11" resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.11.tgz#e01a5c9109f2af79660e4e8b9587790184f5a96c" + integrity sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw= dependencies: tmpl "1.0.x" +map-age-cleaner@^0.1.1: + version "0.1.3" + resolved "https://registry.yarnpkg.com/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz#7d583a7306434c055fe474b0f45078e6e1b4b92a" + integrity sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w== + dependencies: + p-defer "^1.0.0" + map-cache@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" @@ -5246,6 +7006,7 @@ map-cache@^0.2.2: map-limit@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/map-limit/-/map-limit-0.0.1.tgz#eb7961031c0f0e8d001bf2d56fab685d58822f38" + integrity sha1-63lhAxwPDo0AG/LVb6toXViCLzg= dependencies: once "~1.3.0" @@ -5253,6 +7014,11 @@ map-obj@^1.0.0, map-obj@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" +map-obj@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-2.0.0.tgz#a65cd29087a92598b8791257a523e021222ac1f9" + integrity sha1-plzSkIepJZi4eRJXpSPgISIqwfk= + map-stream@~0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/map-stream/-/map-stream-0.1.0.tgz#e56aa94c4c8055a16404a0674b78f215f7c8e194" @@ -5263,65 +7029,80 @@ map-visit@^1.0.0: dependencies: object-visit "^1.0.0" -marked-terminal@^1.6.2: - version "1.6.2" - resolved "https://registry.yarnpkg.com/marked-terminal/-/marked-terminal-1.6.2.tgz#44c128d69b5d9776c848314cdf69d4ec96322973" - dependencies: - cardinal "^1.0.0" - chalk "^1.0.0" - cli-table "^0.3.1" - lodash.assign "^4.2.0" - node-emoji "^1.3.1" - -marked@^0.3.6: - version "0.3.6" - resolved "https://registry.yarnpkg.com/marked/-/marked-0.3.6.tgz#b2c6c618fccece4ef86c4fc6cb8a7cbf5aeda8d7" - -mastarm@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/mastarm/-/mastarm-3.2.1.tgz#7347cc68e5ae491edaa5c1128c43567e7a95b1a2" - dependencies: - aws-sdk "^2.4.2" - babel-core "^6.10.4" - babel-eslint "^7.0.0" - babel-jest "^17.0.2" - babel-plugin-add-module-exports "^0.2.1" - babel-plugin-transform-flow-strip-types "^6.18.0" - babel-plugin-transform-runtime "^6.9.0" - babel-preset-env "^1.1.0" - babel-preset-react "^6.5.0" - babel-preset-stage-2 "^6.17.0" - babelify "^7.3.0" - browserify "^13.0.1" - browserify-markdown "1.0.0" - budo "^9.0.0" - chokidar "^1.6.0" - commander "^2.9.0" - commitizen "^2.8.2" - concat-stream "^1.5.1" - cz-conventional-changelog "^1.1.6" - envify "^4.0.0" +mastarm@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/mastarm/-/mastarm-5.0.1.tgz#9b3e6431df58f791a456e62db508f4a863d84d29" + integrity sha512-g0PfS9ifvLMbpzS0+e5gdsGOo3HHoqXLbrBffqy3efcW9hV6f73jNv2ah9HdGSjlJuVqEEBdYqUwoeB7OEL6Fg== + dependencies: + "@babel/core" "^7.3.4" + "@babel/plugin-proposal-class-properties" "^7.3.4" + "@babel/plugin-proposal-export-namespace-from" "^7.2.0" + "@babel/plugin-syntax-dynamic-import" "^7.2.0" + "@babel/plugin-transform-react-display-name" "^7.2.0" + "@babel/polyfill" "^7.2.5" + "@babel/preset-env" "^7.3.4" + "@babel/preset-flow" "^7.0.0" + "@babel/preset-react" "^7.0.0" + "@babel/runtime" "^7.3.4" + aws-sdk "^2.414.0" + babel-core "^7.0.0-bridge.0" + babel-eslint "^10.0.1" + babel-jest "^24.1.0" + babel-plugin-add-module-exports "^1.0.0" + babel-plugin-istanbul "^5.1.0" + babel-plugin-lodash "^3.3.4" + babel-plugin-react-require "^3.1.1" + babelify "^10.0.0" + browserify "^16.2.3" + browserify-markdown "2.0.1" + budo "^11.6.1" + caniuse-lite "^1.0.30000941" + chokidar "^2.1.2" + commander "^2.19.0" + commitizen "^3.0.7" + concat-stream "^2.0.0" + cssnano "^4.1.10" + cz-conventional-changelog "^2.1.0" + envify "^4.1.0" errorify "^0.3.1" - exorcist "^0.4.0" - http-proxy "^1.14.0" + eslint "^5.15.1" + eslint-config-standard "^12.0.0" + eslint-config-standard-jsx "^6.0.2" + eslint-plugin-flowtype "^3.4.2" + eslint-plugin-import "^2.16.0" + eslint-plugin-jest "^22.3.0" + eslint-plugin-jsx-a11y "^6.2.1" + eslint-plugin-node "^8.0.1" + eslint-plugin-promise "^4.0.1" + eslint-plugin-react "^7.12.4" + eslint-plugin-standard "^4.0.0" + exorcist "^1.0.1" + flow-bin "^0.94.0" + flow-runtime "^0.17.0" + glob "^7.1.3" isomorphic-fetch "^2.2.1" - jest "^17.0.3" + jest "^24.1.0" + jest-yaml-transform "^0.2.0" lodash.uniq "^4.5.0" - mime "^1.3.4" + middleware-proxy "^2.0.5" + mime "^2.4.0" mkdirp "^0.5.1" - postcss "^5.0.21" - postcss-cssnext "^2.6.0" - postcss-import "^9.0.0" - postcss-reporter "^3.0.0" - postcss-safe-parser "^2.0.0" - rimraf "^2.5.4" - standard "^8.3.0" - standard-engine "^5.0.0" - through2 "^2.0.1" - uglifyify "^3.0.2" - uuid "^3.0.0" - watchify "^3.7.0" - yamljs "^0.2.8" + node-emoji "^1.10.0" + postcss "^7.0.14" + postcss-import "^12.0.1" + postcss-preset-env "^6.6.0" + postcss-reporter "^6.0.1" + postcss-safe-parser "^4.0.1" + prettier-eslint-cli "^4.7.1" + rimraf "^2.6.3" + slack-node "^0.1.8" + this-commit "^1.0.0" + through2 "^3.0.1" + uglifyify "^5.0.1" + username "^4.1.0" + uuid "^3.3.2" + watchify "^3.11.1" + yamljs "^0.3.0" math-expression-evaluator@^1.2.14: version "1.2.14" @@ -5329,6 +7110,20 @@ math-expression-evaluator@^1.2.14: dependencies: lodash.indexof "^4.0.5" +md5@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/md5/-/md5-2.2.1.tgz#53ab38d5fe3c8891ba465329ea23fac0540126f9" + integrity sha1-U6s41f48iJG6RlMp6iP6wFQBJvk= + dependencies: + charenc "~0.0.1" + crypt "~0.0.1" + is-buffer "~1.1.1" + +mdn-data@~1.1.0: + version "1.1.4" + resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-1.1.4.tgz#50b5d4ffc4575276573c4eedb8780812a8419f01" + integrity sha512-FSYbp3lyKjyj3E7fMl6rYvUdX0FBXaluGqlFoYESWQlyUTq8R+wp0rkFxoYFqZlHCvsUXGjyJmLQSnXToYhOSA== + measure-text@^0.0.4: version "0.0.4" resolved "https://registry.yarnpkg.com/measure-text/-/measure-text-0.0.4.tgz#2bfbc3d903b2b1f247d187a29617f807104f0a52" @@ -5357,9 +7152,21 @@ measure-text@^0.0.4: url-loader "~0.5.7" webpack "^2.0.7-beta" -media-typer@0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" +mem@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/mem/-/mem-1.1.0.tgz#5edd52b485ca1d900fe64895505399a0dfa45f76" + integrity sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y= + dependencies: + mimic-fn "^1.0.0" + +mem@^4.0.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/mem/-/mem-4.3.0.tgz#461af497bc4ae09608cdb2e60eefb69bff744178" + integrity sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w== + dependencies: + map-age-cleaner "^0.1.1" + mimic-fn "^2.0.0" + p-is-promise "^2.0.0" memory-fs@^0.4.0, memory-fs@~0.4.1: version "0.4.1" @@ -5383,11 +7190,35 @@ meow@^3.3.0: redent "^1.0.0" trim-newlines "^1.0.0" -merge@^1.1.3, merge@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/merge/-/merge-1.2.0.tgz#7531e39d4949c281a66b8c5a6e0265e8b05894da" +merge-stream@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-1.0.1.tgz#4041202d508a342ba00174008df0c251b8c135e1" + integrity sha1-QEEgLVCKNCugAXQAjfDCUbjBNeE= + dependencies: + readable-stream "^2.0.1" -micromatch@^2.1.5, micromatch@^2.2.0, micromatch@^2.3.11: +merge@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/merge/-/merge-1.2.1.tgz#38bebf80c3220a8a487b6fcfb3941bb11720c145" + integrity sha512-VjFo4P5Whtj4vsLzsYBu5ayHhoHJ0UqNm7ibvShmbmoz7tGi0vXaoJbGdB+GmDMLUdg8DpQXEIeVDAe8MaABvQ== + +messageformat-parser@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/messageformat-parser/-/messageformat-parser-1.1.0.tgz#13ba2250a76bbde8e0fca0dbb3475f95c594a90a" + integrity sha512-Hwem6G3MsKDLS1FtBRGIs8T50P1Q00r3srS6QJePCFbad9fq0nYxwf3rnU2BreApRGhmpKMV7oZI06Sy1c9TPA== + +messageformat@^1.0.2: + version "1.1.1" + resolved "https://registry.yarnpkg.com/messageformat/-/messageformat-1.1.1.tgz#ceaa2e6c86929d4807058275a7372b1bd963bdf6" + integrity sha512-Q0uXcDtF5pEZsVSyhzDOGgZZK6ykN79VY9CwU3Nv0gsqx62BjdJW0MT+63UkHQ4exe3HE33ZlxR2/YwoJarRTg== + dependencies: + glob "~7.0.6" + make-plural "^4.1.1" + messageformat-parser "^1.1.0" + nopt "~3.0.6" + reserved-words "^0.1.2" + +micromatch@^2.1.5: version "2.3.11" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" dependencies: @@ -5405,7 +7236,7 @@ micromatch@^2.1.5, micromatch@^2.2.0, micromatch@^2.3.11: parse-glob "^3.0.4" regex-cache "^0.4.2" -micromatch@^3.1.4: +micromatch@^3.0.4, micromatch@^3.1.10, micromatch@^3.1.4: version "3.1.10" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" dependencies: @@ -5423,6 +7254,13 @@ micromatch@^3.1.4: snapdragon "^0.8.1" to-regex "^3.0.2" +middleware-proxy@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/middleware-proxy/-/middleware-proxy-2.0.5.tgz#4038f309a1ee95afd3d017bc701950df82fd1660" + integrity sha512-ukMIikiSBnCenhzFz71UhptSiAxtvpJyrltKmkwwYADKTmqDnTVxU8tTZKNpDFhhhY4ZfV1GuEoN7DKXIGn2Wg== + dependencies: + request "^2.72.0" + miller-rabin@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.0.tgz#4a62fb1d42933c05583982f4c716f6fb9e6c6d3d" @@ -5430,40 +7268,66 @@ miller-rabin@^4.0.0: bn.js "^4.0.0" brorand "^1.0.1" +mime-db@1.40.0: + version "1.40.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.40.0.tgz#a65057e998db090f732a68f6c276d387d4126c32" + integrity sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA== + mime-db@~1.24.0: version "1.24.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.24.0.tgz#e2d13f939f0016c6e4e9ad25a8652f126c467f0c" -mime-types@^2.1.11, mime-types@^2.1.12, mime-types@~2.1.11, mime-types@~2.1.7: +mime-types@^2.1.11, mime-types@^2.1.12, mime-types@~2.1.7: version "2.1.12" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.12.tgz#152ba256777020dd4663f54c2e7bc26381e71729" dependencies: mime-db "~1.24.0" -mime@1.3.4, mime@^1.2.11, mime@^1.3.4: - version "1.3.4" - resolved "https://registry.yarnpkg.com/mime/-/mime-1.3.4.tgz#115f9e3b6b3daf2959983cb38f149a2d40eb5d53" +mime-types@~2.1.19: + version "2.1.24" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.24.tgz#b6f8d0b3e951efb77dedeca194cff6d16f676f81" + integrity sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ== + dependencies: + mime-db "1.40.0" mime@1.3.x: version "1.3.6" resolved "https://registry.yarnpkg.com/mime/-/mime-1.3.6.tgz#591d84d3653a6b0b4a3b9df8de5aa8108e72e5e0" +mime@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" + integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== + +mime@^1.2.11: + version "1.3.4" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.3.4.tgz#115f9e3b6b3daf2959983cb38f149a2d40eb5d53" + +mime@^2.4.0: + version "2.4.4" + resolved "https://registry.yarnpkg.com/mime/-/mime-2.4.4.tgz#bd7b91135fc6b01cde3e9bae33d659b63d8857e5" + integrity sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA== + +mimic-fn@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" + integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== + +mimic-fn@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + minimalistic-assert@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz#702be2dda6b37f4836bcb3f5db56641b64a1d3d3" -"minimatch@2 || 3", minimatch@^3.0.0, minimatch@^3.0.2: +minimatch@^3.0.0, minimatch@^3.0.2: version "3.0.3" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.3.tgz#2a4e4090b96b2db06a9d7df01055a62a77c9b774" dependencies: brace-expansion "^1.0.0" -minimatch@2.x, minimatch@^2.0.1: - version "2.0.10" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-2.0.10.tgz#8d087c39c6b38c001b97fca7ce6d0e1e80afbac7" - dependencies: - brace-expansion "^1.0.0" - minimatch@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" @@ -5473,8 +7337,9 @@ minimatch@^3.0.4: minimist@0.0.5: version "0.0.5" resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.5.tgz#d7aa327bcecf518f9106ac6b8f003fa3bcea8566" + integrity sha1-16oye87PUY+RBqxrjwA/o7zqhWY= -minimist@0.0.8, minimist@~0.0.1: +minimist@0.0.8: version "0.0.8" resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" @@ -5482,6 +7347,11 @@ minimist@1.2.0, minimist@^1.1.0, minimist@^1.1.1, minimist@^1.1.3, minimist@^1.2 version "1.2.0" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" +minimist@~0.0.1: + version "0.0.10" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" + integrity sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8= + minipass@^2.2.1, minipass@^2.3.3: version "2.3.3" resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.3.3.tgz#a7dcc8b7b833f5d368759cce544dccb55f50f233" @@ -5502,26 +7372,28 @@ mixin-deep@^1.2.0: for-in "^1.0.2" is-extendable "^1.0.1" -mkdirp@0.5.x, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0, mkdirp@~0.5.1: +"mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0, mkdirp@~0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" dependencies: minimist "0.0.8" -module-deps@^4.0.2: - version "4.0.7" - resolved "https://registry.yarnpkg.com/module-deps/-/module-deps-4.0.7.tgz#edfeb3937be7359bc14a6672c22ef124887f6ed2" +module-deps@^6.0.0: + version "6.2.1" + resolved "https://registry.yarnpkg.com/module-deps/-/module-deps-6.2.1.tgz#cfe558784060e926824f474b4e647287837cda50" + integrity sha512-UnEn6Ah36Tu4jFiBbJVUtt0h+iXqxpLqDvPS8nllbw5RZFmNJ1+Mz5BjYnM9ieH80zyxHkARGLnMIHlPK5bu6A== dependencies: JSONStream "^1.0.3" browser-resolve "^1.7.0" - concat-stream "~1.5.0" + cached-path-relative "^1.0.2" + concat-stream "~1.6.0" defined "^1.0.0" - detective "^4.0.0" + detective "^5.0.2" duplexer2 "^0.1.2" inherits "^2.0.1" parents "^1.0.0" readable-stream "^2.0.2" - resolve "^1.1.3" + resolve "^1.4.0" stream-combiner2 "^1.1.1" subarg "^1.0.0" through2 "^2.0.0" @@ -5530,6 +7402,7 @@ module-deps@^4.0.2: mold-source-map@~0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/mold-source-map/-/mold-source-map-0.4.0.tgz#cf67e0b31c47ab9badb5c9c25651862127bb8317" + integrity sha1-z2fgsxxHq5uttcnCVlGGISe7gxc= dependencies: convert-source-map "^1.1.0" through "~2.2.7" @@ -5546,22 +7419,25 @@ ms@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" -multimatch@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/multimatch/-/multimatch-2.1.0.tgz#9c7906a22fb4c02919e2f5f75161b4cdbd4b2a2b" - dependencies: - array-differ "^1.0.0" - array-union "^1.0.1" - arrify "^1.0.0" - minimatch "^3.0.0" +ms@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" + integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== -mute-stream@0.0.5: - version "0.0.5" - resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.5.tgz#8fbfabb0a98a253d3184331f9e8deb7372fac6c0" +ms@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== -mute-stream@0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.6.tgz#48962b19e169fd1dfc240b3f1e7317627bbc47db" +mute-stream@0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" + integrity sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s= + +nan@^2.12.1: + version "2.14.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.0.tgz#7818f722027b2459a86f0295d434d1fc2336c52c" + integrity sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg== nan@^2.3.0: version "2.4.0" @@ -5591,10 +7467,7 @@ nanomatch@^1.2.9: natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" - -nave@~0.5.1: - version "0.5.3" - resolved "https://registry.yarnpkg.com/nave/-/nave-0.5.3.tgz#5acec72375856e5c76c83bd21a68d713eb5f1ba4" + integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= needle@^2.2.0: version "2.2.1" @@ -5604,10 +7477,24 @@ needle@^2.2.0: iconv-lite "^0.4.4" sax "^1.2.4" +needle@^2.2.1: + version "2.4.0" + resolved "https://registry.yarnpkg.com/needle/-/needle-2.4.0.tgz#6833e74975c444642590e15a750288c5f939b57c" + integrity sha512-4Hnwzr3mi5L97hMYeNl8wRW/Onhy4nUKR/lVemJ8gJedxxUyBLm9kkrDColJvoSfwi0jCNhD+xCdOtiGDQiRZg== + dependencies: + debug "^3.2.6" + iconv-lite "^0.4.4" + sax "^1.2.4" + neo-async@^2.5.0: version "2.5.1" resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.5.1.tgz#acb909e327b1e87ec9ef15f41b8a269512ad41ee" +neo-async@^2.6.0: + version "2.6.1" + resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.1.tgz#ac27ada66167fa8849a6addd837f6b189ad2081c" + integrity sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw== + nerf-dart@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/nerf-dart/-/nerf-dart-1.0.0.tgz#e6dab7febf5ad816ea81cf5c629c5a0ebde72c1a" @@ -5616,15 +7503,22 @@ netrc@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/netrc/-/netrc-0.1.4.tgz#6be94fcaca8d77ade0a9670dc460914c94472444" -node-emoji@^1.3.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/node-emoji/-/node-emoji-1.4.1.tgz#c9fa0cf91094335bcb967a6f42b2305c15af2ebc" +nice-try@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" + integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== + +node-emoji@^1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/node-emoji/-/node-emoji-1.10.0.tgz#8886abd25d9c7bb61802a658523d1f8d2a89b2da" + integrity sha512-Yt3384If5H6BYGVHiHwTL+99OzJKHhgp82S8/dktEK73T26BazdgZ4JZh92xSVtGNJvz9UbXdNAc5hcrXV42vw== dependencies: - string.prototype.codepointat "^0.2.0" + lodash.toarray "^4.4.0" node-fetch@^1.0.1: - version "1.6.3" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.6.3.tgz#dc234edd6489982d58e8f0db4f695029abcd8c04" + version "1.7.3" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.3.tgz#980f6f72d85211a5347c6b2bc18c5b84c3eb47ef" + integrity sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ== dependencies: encoding "^0.1.11" is-stream "^1.0.1" @@ -5632,6 +7526,7 @@ node-fetch@^1.0.1: node-int64@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" + integrity sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs= node-libs-browser@^2.0.0: version "2.1.0" @@ -5661,17 +7556,21 @@ node-libs-browser@^2.0.0: util "^0.10.3" vm-browserify "0.0.4" -node-notifier@^4.6.1: - version "4.6.1" - resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-4.6.1.tgz#056d14244f3dcc1ceadfe68af9cff0c5473a33f3" +node-modules-regexp@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz#8d9dbe28964a4ac5712e9131642107c71e90ec40" + integrity sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA= + +node-notifier@^5.2.1: + version "5.4.0" + resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-5.4.0.tgz#7b455fdce9f7de0c63538297354f3db468426e6a" + integrity sha512-SUDEb+o71XR5lXSTyivXd9J7fCloE3SyP4lSgt3lU2oSANiox+SxlNRGPjDKrwU1YN3ix2KN/VGGCg0t01rttQ== dependencies: - cli-usage "^0.1.1" - growly "^1.2.0" - lodash.clonedeep "^3.0.0" - minimist "^1.1.1" - semver "^5.1.0" - shellwords "^0.1.0" - which "^1.0.5" + growly "^1.3.0" + is-wsl "^1.1.0" + semver "^5.5.0" + shellwords "^0.1.1" + which "^1.3.0" node-pre-gyp@^0.10.0: version "0.10.2" @@ -5688,6 +7587,22 @@ node-pre-gyp@^0.10.0: semver "^5.3.0" tar "^4" +node-pre-gyp@^0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.12.0.tgz#39ba4bb1439da030295f899e3b520b7785766149" + integrity sha512-4KghwV8vH5k+g2ylT+sLTjy5wmUOb9vPhnM8NHvRf9dHmnW/CndrFXy2aRPaPST6dugXSdHXfeaHQm77PIz/1A== + dependencies: + detect-libc "^1.0.2" + mkdirp "^0.5.1" + needle "^2.2.1" + nopt "^4.0.1" + npm-packlist "^1.1.6" + npmlog "^4.0.2" + rc "^1.2.7" + rimraf "^2.6.1" + semver "^5.3.0" + tar "^4" + node-pre-gyp@^0.6.29: version "0.6.30" resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.30.tgz#64d3073a6f573003717ccfe30c89023297babba1" @@ -5702,11 +7617,18 @@ node-pre-gyp@^0.6.29: tar "~2.2.0" tar-pack "~3.1.0" +node-releases@^1.1.23: + version "1.1.23" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.23.tgz#de7409f72de044a2fa59c097f436ba89c39997f0" + integrity sha512-uq1iL79YjfYC0WXoHbC/z28q/9pOl8kSHaXdWmAAc8No+bDwqkZbzIJz55g/MUsPgSGm9LZ7QSUbzTcH5tz47w== + dependencies: + semver "^5.3.0" + node-uuid@~1.4.7: version "1.4.7" resolved "https://registry.yarnpkg.com/node-uuid/-/node-uuid-1.4.7.tgz#6da5a17668c4b3dd59623bda11cf7fa4c1f60a6f" -nopt@3.x, nopt@^3.0.3, nopt@~3.0.1: +nopt@^3.0.3, nopt@~3.0.1, nopt@~3.0.6: version "3.0.6" resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" dependencies: @@ -5746,6 +7668,11 @@ normalize-path@^2.1.1: dependencies: remove-trailing-separator "^1.0.1" +normalize-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + normalize-range@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" @@ -5759,6 +7686,11 @@ normalize-url@^1.4.0: query-string "^4.1.0" sort-keys "^1.0.0" +normalize-url@^3.0.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-3.3.0.tgz#b2e1c4dc4f7c6d57743df733a4f5978d18650559" + integrity sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg== + npm-bundled@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.3.tgz#7e71703d973af3370a9591bafe3a63aca0be2308" @@ -5793,6 +7725,13 @@ npm-registry-client@^7.0.1: optionalDependencies: npmlog "~2.0.0 || ~3.1.0" +npm-run-path@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" + integrity sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8= + dependencies: + path-key "^2.0.0" + npmconf@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/npmconf/-/npmconf-2.1.2.tgz#66606a4a736f1e77a059aa071a79c94ab781853a" @@ -5842,6 +7781,13 @@ npmlog@^4.0.2: gauge "~2.6.0" set-blocking "~2.0.0" +nth-check@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.2.tgz#b2bd295c37e3dd58a3bf0700376663ba4d9cf05c" + integrity sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg== + dependencies: + boolbase "~1.0.0" + num2fraction@^1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/num2fraction/-/num2fraction-1.2.2.tgz#6f682b6a027a4e9ddfa4564cd2589d1d4e669ede" @@ -5850,18 +7796,29 @@ number-is-nan@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" -"nwmatcher@>= 1.3.9 < 2.0.0": - version "1.3.9" - resolved "https://registry.yarnpkg.com/nwmatcher/-/nwmatcher-1.3.9.tgz#8bab486ff7fa3dfd086656bbe8b17116d3692d2a" +nwsapi@^2.0.7: + version "2.1.4" + resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.1.4.tgz#e006a878db23636f8e8a67d33ca0e4edf61a842f" + integrity sha512-iGfd9Y6SFdTNldEy2L0GUhcarIutFmk+MPWIn9dmj8NMIup03G08uUF2KGbbmv/Ux4RT0VZJoP/sVbWA6d/VIw== oauth-sign@~0.8.1: version "0.8.2" resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" -object-assign@^4.0.0, object-assign@^4.0.1, object-assign@^4.1.0: +oauth-sign@~0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" + integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== + +object-assign@^4.0.1, object-assign@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.0.tgz#7a3b3d0e98063d43f4c03f2e8ae6cd51a86883a0" +object-assign@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= + object-copy@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" @@ -5870,12 +7827,35 @@ object-copy@^0.1.0: define-property "^0.2.5" kind-of "^3.0.3" +object-keys@^1.0.12: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + object-visit@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" dependencies: isobject "^3.0.0" +object.fromentries@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.0.tgz#49a543d92151f8277b3ac9600f1e930b189d30ab" + integrity sha512-9iLiI6H083uiqUuvzyY6qrlmc/Gz8hLQFOcb/Ri/0xXFkSNS3ctV+CbE6yM2+AnkYfOB3dGjdzC0wrMLIhQICA== + dependencies: + define-properties "^1.1.2" + es-abstract "^1.11.0" + function-bind "^1.1.1" + has "^1.0.1" + +object.getownpropertydescriptors@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz#8758c846f5b407adab0f236e0986f14b051caa16" + integrity sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY= + dependencies: + define-properties "^1.1.2" + es-abstract "^1.5.1" + object.omit@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.0.tgz#868597333d54e60662940bb458605dd6ae12fe94" @@ -5889,13 +7869,29 @@ object.pick@^1.3.0: dependencies: isobject "^3.0.1" -on-finished@~2.3.0: +object.values@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.0.tgz#bf6810ef5da3e5325790eaaa2be213ea84624da9" + integrity sha512-8mf0nKLAoFX6VlNVdhGj31SVYpaNFtUnuoOXWyFEstsWRgU837AK+JYM0iAxwkSzGRbwn8cbFmgbyxj1j4VbXg== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.12.0" + function-bind "^1.1.1" + has "^1.0.3" + +on-finished@^2.3.0, on-finished@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" + integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= dependencies: ee-first "1.1.1" -once@1.x, once@^1.3.0, once@^1.3.2, once@^1.3.3: +on-headers@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" + integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== + +once@^1.3.0, once@^1.3.1, once@^1.3.2, once@^1.3.3, once@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" dependencies: @@ -5907,30 +7903,32 @@ once@~1.3.0, once@~1.3.3: dependencies: wrappy "1" -onecolor@~2.4.0: - version "2.4.2" - resolved "https://registry.yarnpkg.com/onecolor/-/onecolor-2.4.2.tgz#a53ec3ff171c3446016dd5210d1a1b544bf7d874" - -onetime@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-1.1.0.tgz#a1f7838f8314c516f05ecefcbc4ccfe04b4ed789" +onetime@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" + integrity sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ= + dependencies: + mimic-fn "^1.0.0" opn@^3.0.2: version "3.0.3" resolved "https://registry.yarnpkg.com/opn/-/opn-3.0.3.tgz#b6d99e7399f78d65c3baaffef1fb288e9b85243a" + integrity sha1-ttmec5n3jWXDuq/+8fsojpuFJDo= dependencies: object-assign "^4.0.1" optimist@^0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686" + integrity sha1-2j6nRob6IaGaERwybpDrFaAZZoY= dependencies: minimist "~0.0.1" wordwrap "~0.0.2" -optionator@^0.8.1: +optionator@^0.8.1, optionator@^0.8.2: version "0.8.2" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" + integrity sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q= dependencies: deep-is "~0.1.3" fast-levenshtein "~2.0.4" @@ -5939,14 +7937,15 @@ optionator@^0.8.1: type-check "~0.3.2" wordwrap "~1.0.0" -os-browserify@^0.3.0: +options@>=0.0.5: + version "0.0.6" + resolved "https://registry.yarnpkg.com/options/-/options-0.0.6.tgz#ec22d312806bb53e731773e7cdaefcf1c643128f" + integrity sha1-7CLTEoBrtT5zF3Pnza788cZDEo8= + +os-browserify@^0.3.0, os-browserify@~0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" -os-browserify@~0.1.1: - version "0.1.2" - resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.1.2.tgz#49ca0293e0b19590a5f5de10c7f265a617d8fe54" - os-homedir@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" @@ -5957,11 +7956,25 @@ os-locale@^1.4.0: dependencies: lcid "^1.0.0" -os-shim@^0.1.2: - version "0.1.3" - resolved "https://registry.yarnpkg.com/os-shim/-/os-shim-0.1.3.tgz#6b62c3791cf7909ea35ed46e17658bb417cb3917" +os-locale@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-2.1.0.tgz#42bc2900a6b5b8bd17376c8e882b65afccf24bf2" + integrity sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA== + dependencies: + execa "^0.7.0" + lcid "^1.0.0" + mem "^1.1.0" + +os-locale@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-3.1.0.tgz#a802a6ee17f24c10483ab9935719cef4ed16bf1a" + integrity sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q== + dependencies: + execa "^1.0.0" + lcid "^2.0.0" + mem "^4.0.0" -os-tmpdir@^1.0.0, os-tmpdir@^1.0.1: +os-tmpdir@^1.0.0, os-tmpdir@^1.0.1, os-tmpdir@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" @@ -5982,6 +7995,7 @@ osenv@^0.1.4: outpipe@^1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/outpipe/-/outpipe-1.1.1.tgz#50cf8616365e87e031e29a5ec9339a3da4725fa2" + integrity sha1-UM+GFjZeh+Ax4ppeyTOaPaRyX6I= dependencies: shell-quote "^1.4.2" @@ -5993,29 +8007,100 @@ output-file-sync@^1.1.2: mkdirp "^0.5.1" object-assign "^4.1.0" +p-defer@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c" + integrity sha1-n26xgvbJqozXQwBKfU+WsZaw+ww= + +p-each-series@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-each-series/-/p-each-series-1.0.0.tgz#930f3d12dd1f50e7434457a22cd6f04ac6ad7f71" + integrity sha1-kw89Et0fUOdDRFeiLNbwSsatf3E= + dependencies: + p-reduce "^1.0.0" + +p-finally@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" + integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= + +p-is-promise@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-2.1.0.tgz#918cebaea248a62cf7ffab8e3bca8c5f882fc42e" + integrity sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg== + +p-limit@^1.1.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" + integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q== + dependencies: + p-try "^1.0.0" + +p-limit@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.2.0.tgz#417c9941e6027a9abcba5092dd2904e255b5fbc2" + integrity sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ== + dependencies: + p-try "^2.0.0" + +p-locate@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" + integrity sha1-IKAQOyIqcMj9OcwuWAaA893l7EM= + dependencies: + p-limit "^1.1.0" + +p-locate@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" + integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== + dependencies: + p-limit "^2.0.0" + +p-reduce@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-reduce/-/p-reduce-1.0.0.tgz#18c2b0dd936a4690a529f8231f58a0fdb6a47dfa" + integrity sha1-GMKw3ZNqRpClKfgjH1ig/bakffo= + +p-try@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" + integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M= + +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + pad-left@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/pad-left/-/pad-left-2.1.0.tgz#16e6a3b2d44a8e138cb0838cc7cb403a4fc9e994" + integrity sha1-FuajstRKjhOMsIOMx8tAOk/J6ZQ= dependencies: repeat-string "^1.5.4" pad-right@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/pad-right/-/pad-right-0.2.2.tgz#6fbc924045d244f2a2a244503060d3bfc6009774" + integrity sha1-b7ySQEXSRPKiokRQMGDTv8YAl3Q= dependencies: repeat-string "^1.5.2" -pako@~0.2.0: - version "0.2.9" - resolved "https://registry.yarnpkg.com/pako/-/pako-0.2.9.tgz#f3f7522f4ef782348da8161bad9ecfd51bf83a75" - pako@~1.0.5: version "1.0.6" resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.6.tgz#0101211baa70c4bca4a0f63f2206e97b7dfaf258" +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + parents@^1.0.0, parents@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/parents/-/parents-1.0.1.tgz#fedd4d2bf193a77745fe71e371d73c3307d9c751" + integrity sha1-/t1NK/GTp3dF/nHjcdc8MwfZx1E= dependencies: path-platform "~0.11.15" @@ -6048,47 +8133,75 @@ parse-json@^2.2.0: dependencies: error-ex "^1.2.0" +parse-json@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" + integrity sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA= + dependencies: + error-ex "^1.3.1" + json-parse-better-errors "^1.0.1" + parse-ms@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/parse-ms/-/parse-ms-1.0.1.tgz#56346d4749d78f23430ca0c713850aef91aa361d" + integrity sha1-VjRtR0nXjyNDDKDHE4UK75GqNh0= -parse5@^1.5.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/parse5/-/parse5-1.5.1.tgz#9b7f3b0de32be78dc2401b17573ccaf0f6f59d94" +parse-passwd@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" + integrity sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY= -parseurl@~1.3.0, parseurl@~1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.1.tgz#c8ab8c9223ba34888aa64a297b28853bec18da56" +parse5@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-4.0.0.tgz#6d78656e3da8d78b4ec0b906f7c08ef1dfe3f608" + integrity sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA== + +parseurl@~1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" + integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== pascalcase@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" -path-browserify@0.0.0, path-browserify@~0.0.0: +path-browserify@0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.0.tgz#a0b870729aae214005b7d5032ec2cbbb0fb4451a" +path-browserify@~0.0.0: + version "0.0.1" + resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.1.tgz#e6c4ddd7ed3aa27c68a20cc4e50e1a4ee83bbc4a" + integrity sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ== + path-dirname@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" -path-exists@2.1.0, path-exists@^2.0.0: +path-exists@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" dependencies: pinkie-promise "^2.0.0" -path-exists@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-1.0.0.tgz#d5a8998eb71ef37a74c34eb0d9eba6e878eea081" +path-exists@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= path-is-absolute@^1.0.0, path-is-absolute@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" -path-is-inside@^1.0.1: +path-is-inside@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" + integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM= + +path-key@^2.0.0, path-key@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" + integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= path-object@^2.3.0: version "2.3.0" @@ -6097,13 +8210,15 @@ path-object@^2.3.0: core-util-is "^1.0.1" lodash.assign "^3.0.0" -path-parse@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1" +path-parse@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" + integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== path-platform@~0.11.15: version "0.11.15" resolved "https://registry.yarnpkg.com/path-platform/-/path-platform-0.11.15.tgz#e864217f74c36850f0852b78dc7bf7d4a5721bf2" + integrity sha1-6GQhf3TDaFDwhSt43Hv31KVyG/I= path-type@^1.0.0: version "1.1.0" @@ -6113,6 +8228,20 @@ path-type@^1.0.0: pify "^2.0.0" pinkie-promise "^2.0.0" +path-type@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73" + integrity sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM= + dependencies: + pify "^2.0.0" + +path-type@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" + integrity sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg== + dependencies: + pify "^3.0.0" + pause-stream@0.0.11: version "0.0.11" resolved "https://registry.yarnpkg.com/pause-stream/-/pause-stream-0.0.11.tgz#fe5a34b0cbce12b5aa6a2b403ee2e73b602f1445" @@ -6125,17 +8254,35 @@ pbkdf2@^3.0.3: dependencies: create-hmac "^1.1.2" -pem@^1.8.3: - version "1.8.3" - resolved "https://registry.yarnpkg.com/pem/-/pem-1.8.3.tgz#e78fc65469698c7e85e4d62dd1018926ed89f3bd" +pem@^1.13.2: + version "1.14.2" + resolved "https://registry.yarnpkg.com/pem/-/pem-1.14.2.tgz#ab29350416bc3a532c30beeee0d541af897fb9ac" + integrity sha512-TOnPtq3ZFnCniOZ+rka4pk8UIze9xG1qI+wNE7EmkiR/cg+53uVvk5QbkWZ7M6RsuOxzz62FW1hlAobJr/lTOA== dependencies: + es6-promisify "^6.0.0" + md5 "^2.2.1" os-tmpdir "^1.0.1" - which "^1.2.4" + which "^1.3.1" + +performance-now@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" + integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= pify@^2.0.0, pify@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" +pify@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" + integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= + +pify@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" + integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== + pinkie-promise@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" @@ -6146,21 +8293,12 @@ pinkie@^2.0.0: version "2.0.4" resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" -pixrem@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/pixrem/-/pixrem-3.0.2.tgz#30d1bafb4c3bdce8e9bb4bd56a13985619320c34" - dependencies: - browserslist "^1.0.0" - postcss "^5.0.0" - reduce-css-calc "^1.2.7" - -pkg-config@^1.0.1, pkg-config@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/pkg-config/-/pkg-config-1.1.1.tgz#557ef22d73da3c8837107766c52eadabde298fe4" +pirates@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.1.tgz#643a92caf894566f91b2b986d2c66950a8e2fb87" + integrity sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA== dependencies: - debug-log "^1.0.0" - find-root "^1.0.0" - xtend "^4.0.1" + node-modules-regexp "^1.0.0" pkg-dir@^1.0.0: version "1.0.0" @@ -6168,40 +8306,48 @@ pkg-dir@^1.0.0: dependencies: find-up "^1.0.0" -pleeease-filters@^3.0.0: +pkg-dir@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b" + integrity sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s= + dependencies: + find-up "^2.1.0" + +pkg-dir@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/pleeease-filters/-/pleeease-filters-3.0.0.tgz#35a4d4c2086413eabc2ce17aaa2ec29054e3075c" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3" + integrity sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw== dependencies: - onecolor "~2.4.0" - postcss "^5.0.4" + find-up "^3.0.0" plur@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/plur/-/plur-1.0.0.tgz#db85c6814f5e5e5a3b49efc28d604fec62975156" + integrity sha1-24XGgU9eXlo7Se/CjWBP7GKXUVY= -pluralize@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-1.2.1.tgz#d1a21483fd22bb41e58a12fa3421823140897c45" +pluralize@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-7.0.0.tgz#298b89df8b93b0221dbf421ad2b1b1ea23fc6777" + integrity sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow== + +pn@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/pn/-/pn-1.1.0.tgz#e2f4cef0e219f463c179ab37463e4e1ecdccbafb" + integrity sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA== posix-character-classes@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" -postcss-apply@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/postcss-apply/-/postcss-apply-0.3.0.tgz#a2f37c5bdfa881e4c15f4f245ec0cd96dd2e70d5" - dependencies: - balanced-match "^0.4.1" - postcss "^5.0.21" - -postcss-attribute-case-insensitive@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-1.0.1.tgz#ceb73777e106167eb233f1938c9bd9f2e697308d" +postcss-attribute-case-insensitive@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-4.0.1.tgz#b2a721a0d279c2f9103a36331c88981526428cc7" + integrity sha512-L2YKB3vF4PetdTIthQVeT+7YiSzMoNMLLYxPXXppOOP7NoazEAy45sh2LvJ8leCQjfBcfkYQs8TtCcQjeZTp8A== dependencies: - postcss "^5.1.1" - postcss-selector-parser "^2.2.0" + postcss "^7.0.2" + postcss-selector-parser "^5.0.0" -postcss-calc@^5.0.0, postcss-calc@^5.2.0: +postcss-calc@^5.2.0: version "5.3.1" resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-5.3.1.tgz#77bae7ca928ad85716e2fda42f261bf7c1d65b5e" dependencies: @@ -6209,55 +8355,57 @@ postcss-calc@^5.0.0, postcss-calc@^5.2.0: postcss-message-helpers "^2.0.0" reduce-css-calc "^1.2.6" -postcss-color-function@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/postcss-color-function/-/postcss-color-function-2.0.1.tgz#9ad226f550e8a7c7f8b8a77860545b6dd7f55241" +postcss-calc@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-7.0.1.tgz#36d77bab023b0ecbb9789d84dcb23c4941145436" + integrity sha512-oXqx0m6tb4N3JGdmeMSc/i91KppbYsFZKdH0xMOqK8V1rJlzrKlTdokz8ozUXLVejydRN6u2IddxpcijRj2FqQ== dependencies: - css-color-function "^1.2.0" - postcss "^5.0.4" - postcss-message-helpers "^2.0.0" - postcss-value-parser "^3.3.0" + css-unit-converter "^1.1.1" + postcss "^7.0.5" + postcss-selector-parser "^5.0.0-rc.4" + postcss-value-parser "^3.3.1" -postcss-color-gray@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/postcss-color-gray/-/postcss-color-gray-3.0.0.tgz#dd65f7ad7bec4b63b458a5de88d6dd49c86cbf7b" +postcss-color-functional-notation@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/postcss-color-functional-notation/-/postcss-color-functional-notation-2.0.1.tgz#5efd37a88fbabeb00a2966d1e53d98ced93f74e0" + integrity sha512-ZBARCypjEDofW4P6IdPVTLhDNXPRn8T2s1zHbZidW6rPaaZvcnCS2soYFIQJrMZSxiePJ2XIYTlcb2ztr/eT2g== dependencies: - color "^0.7.3" - postcss "^5.0.4" - postcss-message-helpers "^2.0.0" - reduce-function-call "^1.0.1" + postcss "^7.0.2" + postcss-values-parser "^2.0.0" -postcss-color-hex-alpha@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/postcss-color-hex-alpha/-/postcss-color-hex-alpha-2.0.0.tgz#44fd6ecade66028648c881cb6504cdcbfdc6cd09" +postcss-color-gray@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/postcss-color-gray/-/postcss-color-gray-5.0.0.tgz#532a31eb909f8da898ceffe296fdc1f864be8547" + integrity sha512-q6BuRnAGKM/ZRpfDascZlIZPjvwsRye7UDNalqVz3s7GDxMtqPY6+Q871liNxsonUw8oC61OG+PSaysYpl1bnw== dependencies: - color "^0.10.1" - postcss "^5.0.4" - postcss-message-helpers "^2.0.0" + "@csstools/convert-colors" "^1.4.0" + postcss "^7.0.5" + postcss-values-parser "^2.0.0" -postcss-color-hwb@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/postcss-color-hwb/-/postcss-color-hwb-2.0.0.tgz#2c0d30a9563158f41eb3f6bddfdf1dae9cadae37" +postcss-color-hex-alpha@^5.0.2: + version "5.0.3" + resolved "https://registry.yarnpkg.com/postcss-color-hex-alpha/-/postcss-color-hex-alpha-5.0.3.tgz#a8d9ca4c39d497c9661e374b9c51899ef0f87388" + integrity sha512-PF4GDel8q3kkreVXKLAGNpHKilXsZ6xuu+mOQMHWHLPNyjiUBOr75sp5ZKJfmv1MCus5/DWUGcK9hm6qHEnXYw== dependencies: - color "^0.10.1" - postcss "^5.0.4" - postcss-message-helpers "^2.0.0" - reduce-function-call "^1.0.1" + postcss "^7.0.14" + postcss-values-parser "^2.0.1" -postcss-color-rebeccapurple@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-2.0.0.tgz#5a88225aeb924a1e3e8e2ea066c5cf4fe39d818a" +postcss-color-mod-function@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/postcss-color-mod-function/-/postcss-color-mod-function-3.0.3.tgz#816ba145ac11cc3cb6baa905a75a49f903e4d31d" + integrity sha512-YP4VG+xufxaVtzV6ZmhEtc+/aTXH3d0JLpnYfxqTvwZPbJhWqp8bSY3nfNzNRFLgB4XSaBA82OE4VjOOKpCdVQ== dependencies: - color "^0.9.0" - postcss "^5.0.4" + "@csstools/convert-colors" "^1.4.0" + postcss "^7.0.2" + postcss-values-parser "^2.0.0" -postcss-color-rgba-fallback@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/postcss-color-rgba-fallback/-/postcss-color-rgba-fallback-2.2.0.tgz#6d29491be5990a93173d47e7c76f5810b09402ba" +postcss-color-rebeccapurple@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-4.0.1.tgz#c7a89be872bb74e45b1e3022bfe5748823e6de77" + integrity sha512-aAe3OhkS6qJXBbqzvZth2Au4V3KieR5sRQ4ptb2b2O8wgvB3SJBsdG+jsn2BZbbwekDG8nTfcCNKcSfe/lEy8g== dependencies: - postcss "^5.0.0" - postcss-value-parser "^3.0.2" - rgb-hex "^1.0.0" + postcss "^7.0.2" + postcss-values-parser "^2.0.0" postcss-colormin@^2.1.8: version "2.2.2" @@ -6267,6 +8415,17 @@ postcss-colormin@^2.1.8: postcss "^5.0.13" postcss-value-parser "^3.2.3" +postcss-colormin@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-4.0.3.tgz#ae060bce93ed794ac71264f08132d550956bd381" + integrity sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw== + dependencies: + browserslist "^4.0.0" + color "^3.0.0" + has "^1.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + postcss-convert-values@^2.3.4: version "2.6.1" resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-2.6.1.tgz#bbd8593c5c1fd2e3d1c322bb925dcae8dae4d62d" @@ -6274,58 +8433,44 @@ postcss-convert-values@^2.3.4: postcss "^5.0.11" postcss-value-parser "^3.1.2" -postcss-cssnext@^2.6.0: - version "2.8.0" - resolved "https://registry.yarnpkg.com/postcss-cssnext/-/postcss-cssnext-2.8.0.tgz#fbaef792185967457812f66355d0c24707bb8cf3" +postcss-convert-values@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz#ca3813ed4da0f812f9d43703584e449ebe189a7f" + integrity sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ== dependencies: - autoprefixer "^6.0.2" - caniuse-api "^1.3.2" - chalk "^1.1.1" - pixrem "^3.0.0" - pleeease-filters "^3.0.0" - postcss "^5.0.4" - postcss-apply "^0.3.0" - postcss-attribute-case-insensitive "^1.0.1" - postcss-calc "^5.0.0" - postcss-color-function "^2.0.0" - postcss-color-gray "^3.0.0" - postcss-color-hex-alpha "^2.0.0" - postcss-color-hwb "^2.0.0" - postcss-color-rebeccapurple "^2.0.0" - postcss-color-rgba-fallback "^2.0.0" - postcss-custom-media "^5.0.0" - postcss-custom-properties "^5.0.0" - postcss-custom-selectors "^3.0.0" - postcss-font-variant "^2.0.0" - postcss-initial "^1.3.1" - postcss-media-minmax "^2.1.0" - postcss-nesting "^2.0.5" - postcss-pseudo-class-any-link "^1.0.0" - postcss-pseudoelements "^3.0.0" - postcss-replace-overflow-wrap "^1.0.0" - postcss-selector-matches "^2.0.0" - postcss-selector-not "^2.0.0" - -postcss-custom-media@^5.0.0: - version "5.0.1" - resolved "https://registry.yarnpkg.com/postcss-custom-media/-/postcss-custom-media-5.0.1.tgz#138d25a184bf2eb54de12d55a6c01c30a9d8bd81" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-custom-media@^7.0.7: + version "7.0.8" + resolved "https://registry.yarnpkg.com/postcss-custom-media/-/postcss-custom-media-7.0.8.tgz#fffd13ffeffad73621be5f387076a28b00294e0c" + integrity sha512-c9s5iX0Ge15o00HKbuRuTqNndsJUbaXdiNsksnVH8H4gdc+zbLzr/UasOwNG6CTDpLFekVY4672eWdiiWu2GUg== dependencies: - postcss "^5.0.0" + postcss "^7.0.14" -postcss-custom-properties@^5.0.0: - version "5.0.1" - resolved "https://registry.yarnpkg.com/postcss-custom-properties/-/postcss-custom-properties-5.0.1.tgz#e07d4f6c78e547cf04274f120f490d236e33ea19" +postcss-custom-properties@^8.0.9: + version "8.0.10" + resolved "https://registry.yarnpkg.com/postcss-custom-properties/-/postcss-custom-properties-8.0.10.tgz#e8dc969e1e15c555f0b836b7f278ef47e3cdeaff" + integrity sha512-GDL0dyd7++goDR4SSasYdRNNvp4Gqy1XMzcCnTijiph7VB27XXpJ8bW/AI0i2VSBZ55TpdGhMr37kMSpRfYD0Q== dependencies: - balanced-match "~0.1.0" - postcss "^5.0.0" + postcss "^7.0.14" + postcss-values-parser "^2.0.1" -postcss-custom-selectors@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/postcss-custom-selectors/-/postcss-custom-selectors-3.0.0.tgz#8f81249f5ed07a8d0917cf6a39fe5b056b7f96ac" +postcss-custom-selectors@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/postcss-custom-selectors/-/postcss-custom-selectors-5.1.2.tgz#64858c6eb2ecff2fb41d0b28c9dd7b3db4de7fba" + integrity sha512-DSGDhqinCqXqlS4R7KGxL1OSycd1lydugJ1ky4iRXPHdBRiozyMHrdu0H3o7qNOCiZwySZTUI5MV0T8QhCLu+w== + dependencies: + postcss "^7.0.2" + postcss-selector-parser "^5.0.0-rc.3" + +postcss-dir-pseudo-class@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-5.0.0.tgz#6e3a4177d0edb3abcc85fdb6fbb1c26dabaeaba2" + integrity sha512-3pm4oq8HYWMZePJY+5ANriPs3P07q+LW6FAdTlkFH2XqDdP4HeeJYMOzn0HYLhRSjBO3fhiqSwwU9xEULSrPgw== dependencies: - balanced-match "^0.2.0" - postcss "^5.0.0" - postcss-selector-matches "^2.0.0" + postcss "^7.0.2" + postcss-selector-parser "^5.0.0-rc.3" postcss-discard-comments@^2.0.4: version "2.0.4" @@ -6333,24 +8478,52 @@ postcss-discard-comments@^2.0.4: dependencies: postcss "^5.0.14" +postcss-discard-comments@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz#1fbabd2c246bff6aaad7997b2b0918f4d7af4033" + integrity sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg== + dependencies: + postcss "^7.0.0" + postcss-discard-duplicates@^2.0.1: version "2.1.0" resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-2.1.0.tgz#b9abf27b88ac188158a5eb12abcae20263b91932" dependencies: postcss "^5.0.4" +postcss-discard-duplicates@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz#3fe133cd3c82282e550fc9b239176a9207b784eb" + integrity sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ== + dependencies: + postcss "^7.0.0" + postcss-discard-empty@^2.0.1: version "2.1.0" resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-2.1.0.tgz#d2b4bd9d5ced5ebd8dcade7640c7d7cd7f4f92b5" dependencies: postcss "^5.0.14" +postcss-discard-empty@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz#c8c951e9f73ed9428019458444a02ad90bb9f765" + integrity sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w== + dependencies: + postcss "^7.0.0" + postcss-discard-overridden@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-0.1.1.tgz#8b1eaf554f686fb288cd874c55667b0aa3668d58" dependencies: postcss "^5.0.16" +postcss-discard-overridden@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz#652aef8a96726f029f5e3e00146ee7a4e755ff57" + integrity sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg== + dependencies: + postcss "^7.0.0" + postcss-discard-unused@^2.2.1: version "2.2.3" resolved "https://registry.yarnpkg.com/postcss-discard-unused/-/postcss-discard-unused-2.2.3.tgz#bce30b2cc591ffc634322b5fb3464b6d934f4433" @@ -6358,41 +8531,104 @@ postcss-discard-unused@^2.2.1: postcss "^5.0.14" uniqs "^2.0.0" +postcss-double-position-gradients@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/postcss-double-position-gradients/-/postcss-double-position-gradients-1.0.0.tgz#fc927d52fddc896cb3a2812ebc5df147e110522e" + integrity sha512-G+nV8EnQq25fOI8CH/B6krEohGWnF5+3A6H/+JEpOncu5dCnkS1QQ6+ct3Jkaepw1NGVqqOZH6lqrm244mCftA== + dependencies: + postcss "^7.0.5" + postcss-values-parser "^2.0.0" + +postcss-env-function@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/postcss-env-function/-/postcss-env-function-2.0.2.tgz#0f3e3d3c57f094a92c2baf4b6241f0b0da5365d7" + integrity sha512-rwac4BuZlITeUbiBq60h/xbLzXY43qOsIErngWa4l7Mt+RaSkT7QBjXVGTcBHupykkblHMDrBFh30zchYPaOUw== + dependencies: + postcss "^7.0.2" + postcss-values-parser "^2.0.0" + postcss-filter-plugins@^2.0.0: version "2.0.3" resolved "https://registry.yarnpkg.com/postcss-filter-plugins/-/postcss-filter-plugins-2.0.3.tgz#82245fdf82337041645e477114d8e593aa18b8ec" dependencies: postcss "^5.0.4" -postcss-font-variant@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/postcss-font-variant/-/postcss-font-variant-2.0.1.tgz#7ca29103f59fa02ca3ace2ca22b2f756853d4ef8" +postcss-focus-visible@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-focus-visible/-/postcss-focus-visible-4.0.0.tgz#477d107113ade6024b14128317ade2bd1e17046e" + integrity sha512-Z5CkWBw0+idJHSV6+Bgf2peDOFf/x4o+vX/pwcNYrWpXFrSfTkQ3JQ1ojrq9yS+upnAlNRHeg8uEwFTgorjI8g== dependencies: - postcss "^5.0.4" + postcss "^7.0.2" + +postcss-focus-within@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-focus-within/-/postcss-focus-within-3.0.0.tgz#763b8788596cee9b874c999201cdde80659ef680" + integrity sha512-W0APui8jQeBKbCGZudW37EeMCjDeVxKgiYfIIEo8Bdh5SpB9sxds/Iq8SEuzS0Q4YFOlG7EPFulbbxujpkrV2w== + dependencies: + postcss "^7.0.2" -postcss-import@^9.0.0: - version "9.0.0" - resolved "https://registry.yarnpkg.com/postcss-import/-/postcss-import-9.0.0.tgz#751fcd21c53eec6eb468890384ce3c114968b391" +postcss-font-variant@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-font-variant/-/postcss-font-variant-4.0.0.tgz#71dd3c6c10a0d846c5eda07803439617bbbabacc" + integrity sha512-M8BFYKOvCrI2aITzDad7kWuXXTm0YhGdP9Q8HanmN4EF1Hmcgs1KK5rSHylt/lUJe8yLxiSwWAHdScoEiIxztg== dependencies: - object-assign "^4.0.1" - postcss "^5.0.14" + postcss "^7.0.2" + +postcss-gap-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/postcss-gap-properties/-/postcss-gap-properties-2.0.0.tgz#431c192ab3ed96a3c3d09f2ff615960f902c1715" + integrity sha512-QZSqDaMgXCHuHTEzMsS2KfVDOq7ZFiknSpkrPJY6jmxbugUPTuSzs/vuE5I3zv0WAS+3vhrlqhijiprnuQfzmg== + dependencies: + postcss "^7.0.2" + +postcss-image-set-function@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/postcss-image-set-function/-/postcss-image-set-function-3.0.1.tgz#28920a2f29945bed4c3198d7df6496d410d3f288" + integrity sha512-oPTcFFip5LZy8Y/whto91L9xdRHCWEMs3e1MdJxhgt4jy2WYXfhkng59fH5qLXSCPN8k4n94p1Czrfe5IOkKUw== + dependencies: + postcss "^7.0.2" + postcss-values-parser "^2.0.0" + +postcss-import@^12.0.1: + version "12.0.1" + resolved "https://registry.yarnpkg.com/postcss-import/-/postcss-import-12.0.1.tgz#cf8c7ab0b5ccab5649024536e565f841928b7153" + integrity sha512-3Gti33dmCjyKBgimqGxL3vcV8w9+bsHwO5UrBawp796+jdardbcFl4RP5w/76BwNL7aGzpKstIfF9I+kdE8pTw== + dependencies: + postcss "^7.0.1" postcss-value-parser "^3.2.3" - promise-each "^2.2.0" read-cache "^1.0.0" resolve "^1.1.7" -postcss-initial@^1.3.1: - version "1.5.2" - resolved "https://registry.yarnpkg.com/postcss-initial/-/postcss-initial-1.5.2.tgz#61eb5ad871e7991aadfb3f497b16fe61aea92ffb" +postcss-initial@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-initial/-/postcss-initial-3.0.0.tgz#1772512faf11421b791fb2ca6879df5f68aa0517" + integrity sha512-WzrqZ5nG9R9fUtrA+we92R4jhVvEB32IIRTzfIG/PLL8UV4CvbF1ugTEHEFX6vWxl41Xt5RTCJPEZkuWzrOM+Q== dependencies: lodash.template "^4.2.4" - postcss "^5.0.19" + postcss "^7.0.2" -postcss-media-minmax@^2.1.0: - version "2.1.2" - resolved "https://registry.yarnpkg.com/postcss-media-minmax/-/postcss-media-minmax-2.1.2.tgz#444c5cf8926ab5e4fd8a2509e9297e751649cdf8" +postcss-lab-function@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/postcss-lab-function/-/postcss-lab-function-2.0.1.tgz#bb51a6856cd12289ab4ae20db1e3821ef13d7d2e" + integrity sha512-whLy1IeZKY+3fYdqQFuDBf8Auw+qFuVnChWjmxm/UhHWqNHZx+B99EwxTvGYmUBqe3Fjxs4L1BoZTJmPu6usVg== dependencies: - postcss "^5.0.4" + "@csstools/convert-colors" "^1.4.0" + postcss "^7.0.2" + postcss-values-parser "^2.0.0" + +postcss-logical@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-logical/-/postcss-logical-3.0.0.tgz#2495d0f8b82e9f262725f75f9401b34e7b45d5b5" + integrity sha512-1SUKdJc2vuMOmeItqGuNaC+N8MzBWFWEkAnRnLpFYj1tGGa7NqyVBujfRtgNa2gXR+6RkGUiB2O5Vmh7E2RmiA== + dependencies: + postcss "^7.0.2" + +postcss-media-minmax@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-media-minmax/-/postcss-media-minmax-4.0.0.tgz#b75bb6cbc217c8ac49433e12f22048814a4f5ed5" + integrity sha512-fo9moya6qyxsjbFAYl97qKO9gyre3qvbMnkOZeZwlsW6XYFsvs2DMGDlchVLfAd8LHPZDxivu/+qW2SMQeTHBw== + dependencies: + postcss "^7.0.2" postcss-merge-idents@^2.1.5: version "2.1.7" @@ -6408,6 +8644,16 @@ postcss-merge-longhand@^2.0.1: dependencies: postcss "^5.0.4" +postcss-merge-longhand@^4.0.11: + version "4.0.11" + resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz#62f49a13e4a0ee04e7b98f42bb16062ca2549e24" + integrity sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw== + dependencies: + css-color-names "0.0.4" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + stylehacks "^4.0.0" + postcss-merge-rules@^2.0.3: version "2.1.2" resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-2.1.2.tgz#d1df5dfaa7b1acc3be553f0e9e10e87c61b5f721" @@ -6418,6 +8664,18 @@ postcss-merge-rules@^2.0.3: postcss-selector-parser "^2.2.2" vendors "^1.0.0" +postcss-merge-rules@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz#362bea4ff5a1f98e4075a713c6cb25aefef9a650" + integrity sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ== + dependencies: + browserslist "^4.0.0" + caniuse-api "^3.0.0" + cssnano-util-same-parent "^4.0.0" + postcss "^7.0.0" + postcss-selector-parser "^3.0.0" + vendors "^1.0.0" + postcss-message-helpers@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/postcss-message-helpers/-/postcss-message-helpers-2.0.0.tgz#a4f2f4fab6e4fe002f0aed000478cdf52f9ba60e" @@ -6430,6 +8688,14 @@ postcss-minify-font-values@^1.0.2: postcss "^5.0.4" postcss-value-parser "^3.0.2" +postcss-minify-font-values@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz#cd4c344cce474343fac5d82206ab2cbcb8afd5a6" + integrity sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg== + dependencies: + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + postcss-minify-gradients@^1.0.1: version "1.0.5" resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-1.0.5.tgz#5dbda11373703f83cfb4a3ea3881d8d75ff5e6e1" @@ -6437,6 +8703,16 @@ postcss-minify-gradients@^1.0.1: postcss "^5.0.12" postcss-value-parser "^3.3.0" +postcss-minify-gradients@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz#93b29c2ff5099c535eecda56c4aa6e665a663471" + integrity sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q== + dependencies: + cssnano-util-get-arguments "^4.0.0" + is-color-stop "^1.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + postcss-minify-params@^1.0.4: version "1.2.2" resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-1.2.2.tgz#ad2ce071373b943b3d930a3fa59a358c28d6f1f3" @@ -6446,6 +8722,18 @@ postcss-minify-params@^1.0.4: postcss-value-parser "^3.0.2" uniqs "^2.0.0" +postcss-minify-params@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz#6b9cef030c11e35261f95f618c90036d680db874" + integrity sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg== + dependencies: + alphanum-sort "^1.0.0" + browserslist "^4.0.0" + cssnano-util-get-arguments "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + uniqs "^2.0.0" + postcss-minify-selectors@^2.0.4: version "2.1.1" resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-2.1.1.tgz#b2c6a98c0072cf91b932d1a496508114311735bf" @@ -6455,6 +8743,16 @@ postcss-minify-selectors@^2.0.4: postcss "^5.0.14" postcss-selector-parser "^2.0.0" +postcss-minify-selectors@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz#e2e5eb40bfee500d0cd9243500f5f8ea4262fbd8" + integrity sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g== + dependencies: + alphanum-sort "^1.0.0" + has "^1.0.0" + postcss "^7.0.0" + postcss-selector-parser "^3.0.0" + postcss-modules-extract-imports@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.1.0.tgz#b614c9720be6816eaee35fb3a5faa1dba6a05ddb" @@ -6482,11 +8780,12 @@ postcss-modules-values@^1.1.0: icss-replace-symbols "^1.1.0" postcss "^6.0.1" -postcss-nesting@^2.0.5: - version "2.3.1" - resolved "https://registry.yarnpkg.com/postcss-nesting/-/postcss-nesting-2.3.1.tgz#94a6b6a4ef707fbec20a87fee5c957759b4e01cf" +postcss-nesting@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/postcss-nesting/-/postcss-nesting-7.0.0.tgz#6e26a770a0c8fcba33782a6b6f350845e1a448f6" + integrity sha512-WSsbVd5Ampi3Y0nk/SKr5+K34n52PqMqEfswu6RtU4r7wA8vSD+gM8/D9qq4aJkHImwn1+9iEFTbjoWsQeqtaQ== dependencies: - postcss "^5.0.19" + postcss "^7.0.2" postcss-normalize-charset@^1.1.0: version "1.1.1" @@ -6494,6 +8793,69 @@ postcss-normalize-charset@^1.1.0: dependencies: postcss "^5.0.5" +postcss-normalize-charset@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz#8b35add3aee83a136b0471e0d59be58a50285dd4" + integrity sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g== + dependencies: + postcss "^7.0.0" + +postcss-normalize-display-values@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz#0dbe04a4ce9063d4667ed2be476bb830c825935a" + integrity sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ== + dependencies: + cssnano-util-get-match "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-positions@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz#05f757f84f260437378368a91f8932d4b102917f" + integrity sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA== + dependencies: + cssnano-util-get-arguments "^4.0.0" + has "^1.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-repeat-style@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz#c4ebbc289f3991a028d44751cbdd11918b17910c" + integrity sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q== + dependencies: + cssnano-util-get-arguments "^4.0.0" + cssnano-util-get-match "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-string@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz#cd44c40ab07a0c7a36dc5e99aace1eca4ec2690c" + integrity sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA== + dependencies: + has "^1.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-timing-functions@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz#8e009ca2a3949cdaf8ad23e6b6ab99cb5e7d28d9" + integrity sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A== + dependencies: + cssnano-util-get-match "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-unicode@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz#841bd48fdcf3019ad4baa7493a3d363b52ae1cfb" + integrity sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg== + dependencies: + browserslist "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + postcss-normalize-url@^3.0.7: version "3.0.8" resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-3.0.8.tgz#108f74b3f2fcdaf891a2ffa3ea4592279fc78222" @@ -6503,6 +8865,24 @@ postcss-normalize-url@^3.0.7: postcss "^5.0.14" postcss-value-parser "^3.2.3" +postcss-normalize-url@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz#10e437f86bc7c7e58f7b9652ed878daaa95faae1" + integrity sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA== + dependencies: + is-absolute-url "^2.0.0" + normalize-url "^3.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-whitespace@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz#bf1d4070fe4fcea87d1348e825d8cc0c5faa7d82" + integrity sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA== + dependencies: + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + postcss-ordered-values@^2.1.0: version "2.2.3" resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-2.2.3.tgz#eec6c2a67b6c412a8db2042e77fe8da43f95c11d" @@ -6510,18 +8890,87 @@ postcss-ordered-values@^2.1.0: postcss "^5.0.4" postcss-value-parser "^3.0.1" -postcss-pseudo-class-any-link@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-1.0.0.tgz#903239196401d335fe73ac756186fa62e693af26" +postcss-ordered-values@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz#0cf75c820ec7d5c4d280189559e0b571ebac0eee" + integrity sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw== dependencies: - postcss "^5.0.3" - postcss-selector-parser "^1.1.4" + cssnano-util-get-arguments "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" -postcss-pseudoelements@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/postcss-pseudoelements/-/postcss-pseudoelements-3.0.0.tgz#6c682177c7900ba053b6df17f8c590284c7b8bbc" +postcss-overflow-shorthand@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/postcss-overflow-shorthand/-/postcss-overflow-shorthand-2.0.0.tgz#31ecf350e9c6f6ddc250a78f0c3e111f32dd4c30" + integrity sha512-aK0fHc9CBNx8jbzMYhshZcEv8LtYnBIRYQD5i7w/K/wS9c2+0NSR6B3OVMu5y0hBHYLcMGjfU+dmWYNKH0I85g== dependencies: - postcss "^5.0.4" + postcss "^7.0.2" + +postcss-page-break@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/postcss-page-break/-/postcss-page-break-2.0.0.tgz#add52d0e0a528cabe6afee8b46e2abb277df46bf" + integrity sha512-tkpTSrLpfLfD9HvgOlJuigLuk39wVTbbd8RKcy8/ugV2bNBUW3xU+AIqyxhDrQr1VUj1RmyJrBn1YWrqUm9zAQ== + dependencies: + postcss "^7.0.2" + +postcss-place@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-place/-/postcss-place-4.0.1.tgz#e9f39d33d2dc584e46ee1db45adb77ca9d1dcc62" + integrity sha512-Zb6byCSLkgRKLODj/5mQugyuj9bvAAw9LqJJjgwz5cYryGeXfFZfSXoP1UfveccFmeq0b/2xxwcTEVScnqGxBg== + dependencies: + postcss "^7.0.2" + postcss-values-parser "^2.0.0" + +postcss-preset-env@^6.6.0: + version "6.6.0" + resolved "https://registry.yarnpkg.com/postcss-preset-env/-/postcss-preset-env-6.6.0.tgz#642e7d962e2bdc2e355db117c1eb63952690ed5b" + integrity sha512-I3zAiycfqXpPIFD6HXhLfWXIewAWO8emOKz+QSsxaUZb9Dp8HbF5kUf+4Wy/AxR33o+LRoO8blEWCHth0ZsCLA== + dependencies: + autoprefixer "^9.4.9" + browserslist "^4.4.2" + caniuse-lite "^1.0.30000939" + css-blank-pseudo "^0.1.4" + css-has-pseudo "^0.10.0" + css-prefers-color-scheme "^3.1.1" + cssdb "^4.3.0" + postcss "^7.0.14" + postcss-attribute-case-insensitive "^4.0.1" + postcss-color-functional-notation "^2.0.1" + postcss-color-gray "^5.0.0" + postcss-color-hex-alpha "^5.0.2" + postcss-color-mod-function "^3.0.3" + postcss-color-rebeccapurple "^4.0.1" + postcss-custom-media "^7.0.7" + postcss-custom-properties "^8.0.9" + postcss-custom-selectors "^5.1.2" + postcss-dir-pseudo-class "^5.0.0" + postcss-double-position-gradients "^1.0.0" + postcss-env-function "^2.0.2" + postcss-focus-visible "^4.0.0" + postcss-focus-within "^3.0.0" + postcss-font-variant "^4.0.0" + postcss-gap-properties "^2.0.0" + postcss-image-set-function "^3.0.1" + postcss-initial "^3.0.0" + postcss-lab-function "^2.0.1" + postcss-logical "^3.0.0" + postcss-media-minmax "^4.0.0" + postcss-nesting "^7.0.0" + postcss-overflow-shorthand "^2.0.0" + postcss-page-break "^2.0.0" + postcss-place "^4.0.1" + postcss-pseudo-class-any-link "^6.0.0" + postcss-replace-overflow-wrap "^3.0.0" + postcss-selector-matches "^4.0.0" + postcss-selector-not "^4.0.0" + +postcss-pseudo-class-any-link@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-6.0.0.tgz#2ed3eed393b3702879dec4a87032b210daeb04d1" + integrity sha512-lgXW9sYJdLqtmw23otOzrtbDXofUdfYzNm4PIpNE322/swES3VU9XlXHeJS46zT2onFO7V1QFdD4Q9LiZj8mew== + dependencies: + postcss "^7.0.2" + postcss-selector-parser "^5.0.0-rc.3" postcss-reduce-idents@^2.2.2: version "2.4.0" @@ -6536,6 +8985,16 @@ postcss-reduce-initial@^1.0.0: dependencies: postcss "^5.0.4" +postcss-reduce-initial@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz#7fd42ebea5e9c814609639e2c2e84ae270ba48df" + integrity sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA== + dependencies: + browserslist "^4.0.0" + caniuse-api "^3.0.0" + has "^1.0.0" + postcss "^7.0.0" + postcss-reduce-transforms@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-1.0.4.tgz#ff76f4d8212437b31c298a42d2e1444025771ae1" @@ -6544,48 +9003,55 @@ postcss-reduce-transforms@^1.0.3: postcss "^5.0.8" postcss-value-parser "^3.0.1" -postcss-replace-overflow-wrap@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-1.0.0.tgz#f0a03b31eab9636a6936bfd210e2aef1b434a643" +postcss-reduce-transforms@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz#17efa405eacc6e07be3414a5ca2d1074681d4e29" + integrity sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg== dependencies: - postcss "^5.0.16" + cssnano-util-get-match "^4.0.0" + has "^1.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" -postcss-reporter@^3.0.0: +postcss-replace-overflow-wrap@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/postcss-reporter/-/postcss-reporter-3.0.0.tgz#09ea0f37a444c5693878606e09b018ebeff7cf8f" + resolved "https://registry.yarnpkg.com/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-3.0.0.tgz#61b360ffdaedca84c7c918d2b0f0d0ea559ab01c" + integrity sha512-2T5hcEHArDT6X9+9dVSPQdo7QHzG4XKclFT8rU5TzJPDN7RIRTbO9c4drUISOVemLj03aezStHCR2AIcr8XLpw== dependencies: - chalk "^1.0.0" - lodash "^4.1.0" - log-symbols "^1.0.2" - postcss "^5.0.0" + postcss "^7.0.2" -postcss-safe-parser@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/postcss-safe-parser/-/postcss-safe-parser-2.0.0.tgz#5a629fe1363225a3a2b4b1f657b59d3462455c6b" +postcss-reporter@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/postcss-reporter/-/postcss-reporter-6.0.1.tgz#7c055120060a97c8837b4e48215661aafb74245f" + integrity sha512-LpmQjfRWyabc+fRygxZjpRxfhRf9u/fdlKf4VHG4TSPbV2XNsuISzYW1KL+1aQzx53CAppa1bKG4APIB/DOXXw== dependencies: - postcss "^5.2.0" + chalk "^2.4.1" + lodash "^4.17.11" + log-symbols "^2.2.0" + postcss "^7.0.7" -postcss-selector-matches@^2.0.0: - version "2.0.5" - resolved "https://registry.yarnpkg.com/postcss-selector-matches/-/postcss-selector-matches-2.0.5.tgz#fa0f43be57b68e77aa4cd11807023492a131027f" +postcss-safe-parser@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-safe-parser/-/postcss-safe-parser-4.0.1.tgz#8756d9e4c36fdce2c72b091bbc8ca176ab1fcdea" + integrity sha512-xZsFA3uX8MO3yAda03QrG3/Eg1LN3EPfjjf07vke/46HERLZyHrTsQ9E1r1w1W//fWEhtYNndo2hQplN2cVpCQ== dependencies: - balanced-match "^0.4.2" - postcss "^5.0.0" + postcss "^7.0.0" -postcss-selector-not@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/postcss-selector-not/-/postcss-selector-not-2.0.0.tgz#c73ad21a3f75234bee7fee269e154fd6a869798d" +postcss-selector-matches@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-selector-matches/-/postcss-selector-matches-4.0.0.tgz#71c8248f917ba2cc93037c9637ee09c64436fcff" + integrity sha512-LgsHwQR/EsRYSqlwdGzeaPKVT0Ml7LAT6E75T8W8xLJY62CE4S/l03BWIt3jT8Taq22kXP08s2SfTSzaraoPww== dependencies: - balanced-match "^0.2.0" - postcss "^5.0.0" + balanced-match "^1.0.0" + postcss "^7.0.2" -postcss-selector-parser@^1.1.4: - version "1.3.3" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-1.3.3.tgz#d2ee19df7a64f8ef21c1a71c86f7d4835c88c281" +postcss-selector-not@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-selector-not/-/postcss-selector-not-4.0.0.tgz#c68ff7ba96527499e832724a2674d65603b645c0" + integrity sha512-W+bkBZRhqJaYN8XAnbbZPLWMvZD1wKTu0UxtFKdhtGjWYmxhkUneoeOhRJKdAE5V7ZTlnbHfCR+6bNwK9e1dTQ== dependencies: - flatten "^1.0.2" - indexes-of "^1.0.1" - uniq "^1.0.1" + balanced-match "^1.0.0" + postcss "^7.0.2" postcss-selector-parser@^2.0.0, postcss-selector-parser@^2.2.2: version "2.2.3" @@ -6595,11 +9061,21 @@ postcss-selector-parser@^2.0.0, postcss-selector-parser@^2.2.2: indexes-of "^1.0.1" uniq "^1.0.1" -postcss-selector-parser@^2.2.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-2.2.1.tgz#fdbf696103b12b0a64060e5610507f410491f7c8" +postcss-selector-parser@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-3.1.1.tgz#4f875f4afb0c96573d5cf4d74011aee250a7e865" + integrity sha1-T4dfSvsMllc9XPTXQBGu4lCn6GU= dependencies: - flatten "^1.0.2" + dot-prop "^4.1.1" + indexes-of "^1.0.1" + uniq "^1.0.1" + +postcss-selector-parser@^5.0.0, postcss-selector-parser@^5.0.0-rc.3, postcss-selector-parser@^5.0.0-rc.4: + version "5.0.0" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz#249044356697b33b64f1a8f7c80922dddee7195c" + integrity sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ== + dependencies: + cssesc "^2.0.0" indexes-of "^1.0.1" uniq "^1.0.1" @@ -6612,6 +9088,16 @@ postcss-svgo@^2.1.1: postcss-value-parser "^3.2.3" svgo "^0.7.0" +postcss-svgo@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-4.0.2.tgz#17b997bc711b333bab143aaed3b8d3d6e3d38258" + integrity sha512-C6wyjo3VwFm0QgBy+Fu7gCYOkCmgmClghO+pjcxvrcBKtiKt0uCF+hvbMO1fyv5BMImRK90SMb+dwUnfbGd+jw== + dependencies: + is-svg "^3.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + svgo "^1.0.0" + postcss-unique-selectors@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-2.0.2.tgz#981d57d29ddcb33e7b1dfe1fd43b8649f933ca1d" @@ -6620,10 +9106,33 @@ postcss-unique-selectors@^2.0.2: postcss "^5.0.4" uniqs "^2.0.0" +postcss-unique-selectors@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz#9446911f3289bfd64c6d680f073c03b1f9ee4bac" + integrity sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg== + dependencies: + alphanum-sort "^1.0.0" + postcss "^7.0.0" + uniqs "^2.0.0" + +postcss-value-parser@^3.0.0, postcss-value-parser@^3.3.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz#9ff822547e2893213cf1c30efa51ac5fd1ba8281" + integrity sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ== + postcss-value-parser@^3.0.1, postcss-value-parser@^3.0.2, postcss-value-parser@^3.1.1, postcss-value-parser@^3.1.2, postcss-value-parser@^3.2.3, postcss-value-parser@^3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz#87f38f9f18f774a4ab4c8a232f5c5ce8872a9d15" +postcss-values-parser@^2.0.0, postcss-values-parser@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/postcss-values-parser/-/postcss-values-parser-2.0.1.tgz#da8b472d901da1e205b47bdc98637b9e9e550e5f" + integrity sha512-2tLuBsA6P4rYTNKCXYG/71C7j1pU6pK503suYOmn4xYrQIzW+opD+7FAFNuGSdZC/3Qfy334QbeMu7MEb8gOxg== + dependencies: + flatten "^1.0.2" + indexes-of "^1.0.1" + uniq "^1.0.1" + postcss-zindex@^2.0.1: version "2.2.0" resolved "https://registry.yarnpkg.com/postcss-zindex/-/postcss-zindex-2.2.0.tgz#d2109ddc055b91af67fc4cb3b025946639d2af22" @@ -6632,23 +9141,23 @@ postcss-zindex@^2.0.1: postcss "^5.0.4" uniqs "^2.0.0" -postcss@^5.0.0, postcss@^5.0.14, postcss@^5.0.16, postcss@^5.0.19, postcss@^5.0.2, postcss@^5.0.21, postcss@^5.0.3, postcss@^5.0.4, postcss@^5.1.1, postcss@^5.2.0, postcss@^5.2.4: - version "5.2.4" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-5.2.4.tgz#8eb4bee3e5c4e091585b116df32d8db24a535f21" +postcss@^5.0.10, postcss@^5.0.11, postcss@^5.0.12, postcss@^5.0.13, postcss@^5.0.5, postcss@^5.0.6, postcss@^5.0.8, postcss@^5.2.16: + version "5.2.18" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-5.2.18.tgz#badfa1497d46244f6390f58b319830d9107853c5" dependencies: chalk "^1.1.3" js-base64 "^2.1.9" source-map "^0.5.6" - supports-color "^3.1.2" + supports-color "^3.2.3" -postcss@^5.0.10, postcss@^5.0.11, postcss@^5.0.12, postcss@^5.0.13, postcss@^5.0.5, postcss@^5.0.6, postcss@^5.0.8, postcss@^5.2.16: - version "5.2.18" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-5.2.18.tgz#badfa1497d46244f6390f58b319830d9107853c5" +postcss@^5.0.14, postcss@^5.0.16, postcss@^5.0.2, postcss@^5.0.4: + version "5.2.4" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-5.2.4.tgz#8eb4bee3e5c4e091585b116df32d8db24a535f21" dependencies: chalk "^1.1.3" js-base64 "^2.1.9" source-map "^0.5.6" - supports-color "^3.2.3" + supports-color "^3.1.2" postcss@^6.0.1: version "6.0.23" @@ -6658,9 +9167,19 @@ postcss@^6.0.1: source-map "^0.6.1" supports-color "^5.4.0" +postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.16, postcss@^7.0.2, postcss@^7.0.5, postcss@^7.0.6, postcss@^7.0.7: + version "7.0.17" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.17.tgz#4da1bdff5322d4a0acaab4d87f3e782436bad31f" + integrity sha512-546ZowA+KZ3OasvQZHsbuEpysvwTZNGJv9EfyCQdsIDltPSWHAeTQ5fQy/Npi2ZDtLI3zs7Ps/p6wThErhm9fQ== + dependencies: + chalk "^2.4.2" + source-map "^0.6.1" + supports-color "^6.1.0" + prelude-ls@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" + integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= prepend-http@^1.0.0: version "1.0.4" @@ -6671,16 +9190,80 @@ preserve@^0.2.0: resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" prettier-bytes@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/prettier-bytes/-/prettier-bytes-1.0.3.tgz#932b31c23efddb36fc66a82dcef362af3122982f" + version "1.0.4" + resolved "https://registry.yarnpkg.com/prettier-bytes/-/prettier-bytes-1.0.4.tgz#994b02aa46f699c50b6257b5faaa7fe2557e62d6" + integrity sha1-mUsCqkb2mcULYle1+qp/4lV+YtY= -pretty-format@~4.2.1: - version "4.2.1" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-4.2.1.tgz#b1dad18c3be0c8209e64c7791fa67e252d2d3e07" +prettier-eslint-cli@^4.7.1: + version "4.7.1" + resolved "https://registry.yarnpkg.com/prettier-eslint-cli/-/prettier-eslint-cli-4.7.1.tgz#3d103c494baa4e80b99ad53e2b9db7620101859f" + integrity sha512-hQbsGaEVz97oBBcKdsJ46khv0kOGkMyWrXzcFOXW6X8UuetZ/j0yDJkNJgUTVc6PVFbbzBXk+qgd5vos9qzXPQ== + dependencies: + arrify "^1.0.1" + babel-runtime "^6.23.0" + boolify "^1.0.0" + camelcase-keys "^4.1.0" + chalk "2.3.0" + common-tags "^1.4.0" + eslint "^4.5.0" + find-up "^2.1.0" + get-stdin "^5.0.1" + glob "^7.1.1" + ignore "^3.2.7" + indent-string "^3.1.0" + lodash.memoize "^4.1.2" + loglevel-colored-level-prefix "^1.0.0" + messageformat "^1.0.2" + prettier-eslint "^8.5.0" + rxjs "^5.3.0" + yargs "10.0.3" + +prettier-eslint@^8.5.0: + version "8.8.2" + resolved "https://registry.yarnpkg.com/prettier-eslint/-/prettier-eslint-8.8.2.tgz#fcb29a48ab4524e234680797fe70e9d136ccaf0b" + integrity sha512-2UzApPuxi2yRoyMlXMazgR6UcH9DKJhNgCviIwY3ixZ9THWSSrUww5vkiZ3C48WvpFl1M1y/oU63deSy1puWEA== + dependencies: + babel-runtime "^6.26.0" + common-tags "^1.4.0" + dlv "^1.1.0" + eslint "^4.0.0" + indent-string "^3.2.0" + lodash.merge "^4.6.0" + loglevel-colored-level-prefix "^1.0.0" + prettier "^1.7.0" + pretty-format "^23.0.1" + require-relative "^0.8.7" + typescript "^2.5.1" + typescript-eslint-parser "^16.0.0" + vue-eslint-parser "^2.0.2" + +prettier@^1.7.0: + version "1.18.2" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.18.2.tgz#6823e7c5900017b4bd3acf46fe9ac4b4d7bda9ea" + integrity sha512-OeHeMc0JhFE9idD4ZdtNibzY0+TPHSpSSb9h8FqtP+YnoZZ1sl8Vc9b1sasjfymH3SonAF4QcA2+mzHPhMvIiw== + +pretty-format@^23.0.1: + version "23.6.0" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-23.6.0.tgz#5eaac8eeb6b33b987b7fe6097ea6a8a146ab5760" + integrity sha512-zf9NV1NSlDLDjycnwm6hpFATCGl/K1lt0R/GdkAK2O5LN/rwJoB+Mh93gGJjut4YbmecbfgLWVGSTCr0Ewvvbw== + dependencies: + ansi-regex "^3.0.0" + ansi-styles "^3.2.0" + +pretty-format@^24.8.0: + version "24.8.0" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-24.8.0.tgz#8dae7044f58db7cb8be245383b565a963e3c27f2" + integrity sha512-P952T7dkrDEplsR+TuY7q3VXDae5Sr7zmQb12JU/NDQa/3CH7/QW0yvqLcGN6jL+zQFKaoJcPc+yJxMTGmosqw== + dependencies: + "@jest/types" "^24.8.0" + ansi-regex "^4.0.0" + ansi-styles "^3.2.0" + react-is "^16.8.4" pretty-ms@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/pretty-ms/-/pretty-ms-2.1.0.tgz#4257c256df3fb0b451d6affaab021884126981dc" + integrity sha1-QlfCVt8/sLRR1q/6qwIYhBJpgdw= dependencies: is-finite "^1.0.1" parse-ms "^1.0.0" @@ -6706,36 +9289,50 @@ process-nextick-args@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa" -process@^0.11.10: +process@^0.11.10, process@~0.11.0: version "0.11.10" resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" -process@~0.11.0: - version "0.11.9" - resolved "https://registry.yarnpkg.com/process/-/process-0.11.9.tgz#7bd5ad21aa6253e7da8682264f1e11d11c0318c1" +progress@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" + integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== -progress@^1.1.8: - version "1.1.8" - resolved "https://registry.yarnpkg.com/progress/-/progress-1.1.8.tgz#e260c78f6161cdd9b0e56cc3e0a85de17c7a57be" +prompts@^2.0.1: + version "2.1.0" + resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.1.0.tgz#bf90bc71f6065d255ea2bdc0fe6520485c1b45db" + integrity sha512-+x5TozgqYdOwWsQFZizE/Tra3fKvAoy037kOyU6cgz84n8f6zxngLOV4O32kTwt9FcLCxAqw0P/c8rOr9y+Gfg== + dependencies: + kleur "^3.0.2" + sisteransi "^1.0.0" -promise-each@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/promise-each/-/promise-each-2.2.0.tgz#3353174eff2694481037e04e01f77aa0fb6d1b60" +prop-types@^15.7.2: + version "15.7.2" + resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5" + integrity sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ== dependencies: - any-promise "^0.1.0" + loose-envify "^1.4.0" + object-assign "^4.1.1" + react-is "^16.8.1" proto-list@~1.2.1: version "1.2.4" resolved "https://registry.yarnpkg.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849" -prr@~0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/prr/-/prr-0.0.0.tgz#1a84b85908325501411853d0081ee3fa86e2926a" - prr@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" +pseudomap@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" + integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM= + +psl@^1.1.24, psl@^1.1.28: + version "1.1.32" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.1.32.tgz#3f132717cf2f9c169724b2b6caf373cf694198db" + integrity sha512-MHACAkHpihU/REGGPLj4sEfc/XKW2bheigvHO1dUqjaKigMp1C8+WLQYRGgeKFMsw5PMfegZcaN8IDXK/cD0+g== + public-encrypt@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.0.tgz#39f699f3a46560dd5ebacbca693caf7c65c18cc6" @@ -6746,26 +9343,31 @@ public-encrypt@^4.0.0: parse-asn1 "^5.0.0" randombytes "^2.0.1" +pump@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" + integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + punycode@1.3.2: version "1.3.2" resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" -punycode@^1.2.4, punycode@^1.3.2: +punycode@^1.2.4, punycode@^1.3.2, punycode@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" +punycode@^2.1.0, punycode@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" + integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== + q@^1.1.2: version "1.5.1" resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" -qs@5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/qs/-/qs-5.2.0.tgz#a9f31142af468cb72b25b30136ba2456834916be" - -qs@~5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/qs/-/qs-5.1.0.tgz#4d932e5c7ea411cca76a312d39a606200fd50cd9" - qs@~6.2.0: version "6.2.1" resolved "https://registry.yarnpkg.com/qs/-/qs-6.2.1.tgz#ce03c5ff0935bc1d9d69a9f14cbd18e568d67625" @@ -6774,7 +9376,12 @@ qs@~6.3.0: version "6.3.0" resolved "https://registry.yarnpkg.com/qs/-/qs-6.3.0.tgz#f403b264f23bc01228c74131b407f18d5ea5d442" -query-string@^4.1.0: +qs@~6.5.2: + version "6.5.2" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" + integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== + +query-string@^4.1.0, query-string@^4.2.3: version "4.3.4" resolved "https://registry.yarnpkg.com/query-string/-/query-string-4.3.4.tgz#bbb693b9ca915c232515b228b1a02b609043dbeb" dependencies: @@ -6789,6 +9396,11 @@ querystring@0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" +quick-lru@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-1.1.0.tgz#4360b17c61136ad38078397ff11416e186dcfbb8" + integrity sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g= + randomatic@^1.1.3: version "1.1.5" resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-1.1.5.tgz#5e9ef5f2d573c67bd2b8124ae90b5156e457840b" @@ -6813,17 +9425,10 @@ randomfill@^1.0.3: randombytes "^2.0.5" safe-buffer "^5.1.0" -range-parser@~1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e" - -raw-body@~2.1.5: - version "2.1.7" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.1.7.tgz#adfeace2e4fb3098058014d08c072dcc59758774" - dependencies: - bytes "2.4.0" - iconv-lite "0.4.13" - unpipe "1.0.0" +range-parser@~1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" + integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== rc@^1.2.7: version "1.2.8" @@ -6843,15 +9448,22 @@ rc@~1.1.0: minimist "^1.2.0" strip-json-comments "~1.0.4" +react-is@^16.8.1, react-is@^16.8.4: + version "16.8.6" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.8.6.tgz#5bbc1e2d29141c9fbdfed456343fe2bc430a6a16" + integrity sha512-aUk3bHfZ2bRSVFFbbeVS4i+lNPZr3/WM5jT2J5omUVV1zzcs1nAaf3l51ctA5FFvCRbhrH0bdAsRRQddFJZPtA== + read-cache@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/read-cache/-/read-cache-1.0.0.tgz#e664ef31161166c9751cdbe8dbcf86b5fb58f774" + integrity sha1-5mTvMRYRZsl1HNvo28+GtftY93Q= dependencies: pify "^2.3.0" read-only-stream@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/read-only-stream/-/read-only-stream-2.0.0.tgz#2724fd6a8113d73764ac288d4386270c1dbf17f0" + integrity sha1-JyT9aoET1zdkrCiNQ4YnDB2/F/A= dependencies: readable-stream "^2.0.2" @@ -6862,6 +9474,22 @@ read-pkg-up@^1.0.1: find-up "^1.0.0" read-pkg "^1.0.0" +read-pkg-up@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be" + integrity sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4= + dependencies: + find-up "^2.0.0" + read-pkg "^2.0.0" + +read-pkg-up@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-4.0.0.tgz#1b221c6088ba7799601c808f91161c66e58f8978" + integrity sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA== + dependencies: + find-up "^3.0.0" + read-pkg "^3.0.0" + read-pkg@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" @@ -6870,28 +9498,44 @@ read-pkg@^1.0.0: normalize-package-data "^2.3.2" path-type "^1.0.0" +read-pkg@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8" + integrity sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg= + dependencies: + load-json-file "^2.0.0" + normalize-package-data "^2.3.2" + path-type "^2.0.0" + +read-pkg@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389" + integrity sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k= + dependencies: + load-json-file "^4.0.0" + normalize-package-data "^2.3.2" + path-type "^3.0.0" + +"readable-stream@2 || 3", readable-stream@^3.0.2: + version "3.4.0" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.4.0.tgz#a51c26754658e0a3c21dbf59163bd45ba6f447fc" + integrity sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + "readable-stream@>=1.0.33-1 <1.1.0-0": version "1.0.34" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" + integrity sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw= dependencies: core-util-is "~1.0.0" inherits "~2.0.1" isarray "0.0.1" string_decoder "~0.10.x" -readable-stream@^2.0.0, "readable-stream@^2.0.0 || ^1.1.13", readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.1.0, readable-stream@~2.1.4: - version "2.1.5" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.1.5.tgz#66fa8b720e1438b364681f2ad1a63c618448c9d0" - dependencies: - buffer-shims "^1.0.0" - core-util-is "~1.0.0" - inherits "~2.0.1" - isarray "~1.0.0" - process-nextick-args "~1.0.6" - string_decoder "~0.10.x" - util-deprecate "~1.0.1" - -readable-stream@^2.3.3, readable-stream@^2.3.6: +readable-stream@^2.0.0, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.6, readable-stream@~2.3.6: version "2.3.6" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" dependencies: @@ -6903,6 +9547,18 @@ readable-stream@^2.3.3, readable-stream@^2.3.6: string_decoder "~1.1.1" util-deprecate "~1.0.1" +"readable-stream@^2.0.0 || ^1.1.13", readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@~2.1.4: + version "2.1.5" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.1.5.tgz#66fa8b720e1438b364681f2ad1a63c618448c9d0" + dependencies: + buffer-shims "^1.0.0" + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "~1.0.0" + process-nextick-args "~1.0.6" + string_decoder "~0.10.x" + util-deprecate "~1.0.1" + readable-stream@~2.0.0, readable-stream@~2.0.5: version "2.0.6" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.0.6.tgz#8f90341e68a53ccc928788dacfcd11b36eb9b78e" @@ -6923,17 +9579,26 @@ readdirp@^2.0.0: readable-stream "^2.0.2" set-immediate-shim "^1.0.1" -readline2@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/readline2/-/readline2-1.0.1.tgz#41059608ffc154757b715d9989d199ffbf372e35" +readdirp@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" + integrity sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ== dependencies: - code-point-at "^1.0.0" - is-fullwidth-code-point "^1.0.0" - mute-stream "0.0.5" + graceful-fs "^4.1.11" + micromatch "^3.1.10" + readable-stream "^2.0.2" + +realpath-native@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/realpath-native/-/realpath-native-1.1.0.tgz#2003294fea23fb0672f2476ebe22fcf498a2d65c" + integrity sha512-wlgPA6cCIIg9gKz0fgAPjnzh4yR/LnXovwuo9hvyGvx3h8nX4+/iLZplfUWasXpqD8BdnGnP5njOFjkUwPzvjA== + dependencies: + util.promisify "^1.0.0" rechoir@^0.6.2: version "0.6.2" resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" + integrity sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q= dependencies: resolve "^1.1.6" @@ -6944,13 +9609,7 @@ redent@^1.0.0: indent-string "^2.1.0" strip-indent "^1.0.1" -redeyed@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/redeyed/-/redeyed-1.0.0.tgz#6ce25045c9e1f9b28c0ae73ce2960c8cb48184b1" - dependencies: - esprima "~2.7.0" - -reduce-css-calc@^1.2.6, reduce-css-calc@^1.2.7: +reduce-css-calc@^1.2.6: version "1.3.0" resolved "https://registry.yarnpkg.com/reduce-css-calc/-/reduce-css-calc-1.3.0.tgz#747c914e049614a4c9cfbba629871ad1d2927716" dependencies: @@ -6964,10 +9623,22 @@ reduce-function-call@^1.0.1: dependencies: balanced-match "~0.1.0" +regenerate-unicode-properties@^8.0.2: + version "8.1.0" + resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-8.1.0.tgz#ef51e0f0ea4ad424b77bf7cb41f3e015c70a3f0e" + integrity sha512-LGZzkgtLY79GeXLm8Dp0BVLdQlWICzBnJz/ipWUgo59qBaZ+BHtq51P2q1uVZlppMuUAT37SDk39qUbjTWB7bA== + dependencies: + regenerate "^1.4.0" + regenerate@^1.2.1: version "1.3.1" resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.3.1.tgz#0300203a5d2fdcf89116dce84275d011f5903f33" +regenerate@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.0.tgz#4a856ec4b56e4077c557589cae85e7a4c8869a11" + integrity sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg== + regenerator-runtime@^0.10.0: version "0.10.1" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.1.tgz#257f41961ce44558b18f7814af48c17559f9faeb" @@ -6980,17 +9651,10 @@ regenerator-runtime@^0.11.0: version "0.11.1" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" -regenerator-runtime@^0.9.5: - version "0.9.5" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.9.5.tgz#403d6d40a4bdff9c330dd9392dcbb2d9a8bba1fc" - -regenerator-transform@0.9.8: - version "0.9.8" - resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.9.8.tgz#0f88bb2bc03932ddb7b6b7312e68078f01026d6c" - dependencies: - babel-runtime "^6.18.0" - babel-types "^6.19.0" - private "^0.1.6" +regenerator-runtime@^0.13.2: + version "0.13.2" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.2.tgz#32e59c9a6fb9b1a4aff09b4930ca2d4477343447" + integrity sha512-S/TQAZJO+D3m9xeN1WTI8dLKBBiRgXBlTJvbWjCThHWZj9EvHK70Ff50/tYj2J/fvBY6JtFVwRuazHN2E7M9BA== regenerator-transform@^0.10.0: version "0.10.1" @@ -7000,6 +9664,13 @@ regenerator-transform@^0.10.0: babel-types "^6.19.0" private "^0.1.6" +regenerator-transform@^0.14.0: + version "0.14.0" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.14.0.tgz#2ca9aaf7a2c239dd32e4761218425b8c7a86ecaf" + integrity sha512-rtOelq4Cawlbmq9xuMR5gdFmv7ku/sFoB7sRiywx7aq53bc52b4j6zvH7Te1Vt/X2YveDKnCGUbioieU7FEL3w== + dependencies: + private "^0.1.6" + regex-cache@^0.4.2: version "0.4.3" resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.3.tgz#9b1a6c35d4d0dfcef5711ae651e8e9d3d7114145" @@ -7014,6 +9685,21 @@ regex-not@^1.0.0, regex-not@^1.0.2: extend-shallow "^3.0.2" safe-regex "^1.1.0" +regexp-tree@^0.1.6: + version "0.1.10" + resolved "https://registry.yarnpkg.com/regexp-tree/-/regexp-tree-0.1.10.tgz#d837816a039c7af8a8d64d7a7c3cf6a1d93450bc" + integrity sha512-K1qVSbcedffwuIslMwpe6vGlj+ZXRnGkvjAtFHfDZZZuEdA/h0dxljAPu9vhUo6Rrx2U2AwJ+nSQ6hK+lrP5MQ== + +regexpp@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-1.1.0.tgz#0e3516dd0b7904f413d2d4193dce4618c3a689ab" + integrity sha512-LOPw8FpgdQF9etWMaAfG/WRthIdXJGYp4mJ2Jgn/2lpkbod9jPn0t9UqN7AxBOKNfzRbYyVfgc7Vk4t/MpnXgw== + +regexpp@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f" + integrity sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw== + regexpu-core@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-1.0.0.tgz#86a763f58ee4d7c2f6b102e4764050de7ed90c6b" @@ -7030,19 +9716,50 @@ regexpu-core@^2.0.0: regjsgen "^0.2.0" regjsparser "^0.1.4" +regexpu-core@^4.5.4: + version "4.5.4" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.5.4.tgz#080d9d02289aa87fe1667a4f5136bc98a6aebaae" + integrity sha512-BtizvGtFQKGPUcTy56o3nk1bGRp4SZOTYrDtGNlqCQufptV5IkkLN6Emw+yunAJjzf+C9FQFtvq7IoA3+oMYHQ== + dependencies: + regenerate "^1.4.0" + regenerate-unicode-properties "^8.0.2" + regjsgen "^0.5.0" + regjsparser "^0.6.0" + unicode-match-property-ecmascript "^1.0.4" + unicode-match-property-value-ecmascript "^1.1.0" + regjsgen@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7" +regjsgen@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.0.tgz#a7634dc08f89209c2049adda3525711fb97265dd" + integrity sha512-RnIrLhrXCX5ow/E5/Mh2O4e/oa1/jW0eaBKTSy3LaCj+M3Bqvm97GWDp2yUtzIs4LEn65zR2yiYGFqb2ApnzDA== + regjsparser@^0.1.4: version "0.1.5" resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c" dependencies: jsesc "~0.5.0" -remarkable@^1.6.0: - version "1.7.1" - resolved "https://registry.yarnpkg.com/remarkable/-/remarkable-1.7.1.tgz#aaca4972100b66a642a63a1021ca4bac1be3bff6" +regjsparser@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.6.0.tgz#f1e6ae8b7da2bae96c99399b868cd6c933a2ba9c" + integrity sha512-RQ7YyokLiQBomUJuUG8iGVvkgOLxwyZM8k6d3q5SAXpg4r5TZJZigKFvC6PpD+qQ98bCDC5YelPeA3EucDoNeQ== + dependencies: + jsesc "~0.5.0" + +reload-css@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/reload-css/-/reload-css-1.0.2.tgz#6afb11162e2314feccdad6dc5fde821fd7318331" + integrity sha1-avsRFi4jFP7M2tbcX96CH9cxgzE= + dependencies: + query-string "^4.2.3" + +"remarkable@github:matthewmueller/remarkable#3b896af": + version "1.6.2" + resolved "https://codeload.github.com/matthewmueller/remarkable/tar.gz/3b896afdd1bb2963df11be63cfe96fbf2a3f39f3" dependencies: argparse "~0.1.15" autolinker "~0.15.0" @@ -7055,20 +9772,14 @@ repeat-element@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a" -repeat-string@^1.5.2, repeat-string@^1.5.4: +repeat-string@^1.5.2: version "1.5.4" resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.5.4.tgz#64ec0c91e0f4b475f90d5b643651e3e6e5b6c2d5" -repeat-string@^1.6.1: +repeat-string@^1.5.4, repeat-string@^1.6.1: version "1.6.1" resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" -repeating@^1.1.0: - version "1.1.3" - resolved "https://registry.yarnpkg.com/repeating/-/repeating-1.1.3.tgz#3d4114218877537494f97f77f9785fab810fa4ac" - dependencies: - is-finite "^1.0.0" - repeating@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" @@ -7081,6 +9792,22 @@ request-promise-core@1.1.1: dependencies: lodash "^4.13.1" +request-promise-core@1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.2.tgz#339f6aababcafdb31c799ff158700336301d3346" + integrity sha512-UHYyq1MO8GsefGEt7EprS8UrXsm1TxEvFUX1IMTuSLU2Rh7fTIdFtl8xD7JiEYiWU2dl+NYAjCTksTehQUxPag== + dependencies: + lodash "^4.17.11" + +request-promise-native@^1.0.5: + version "1.0.7" + resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.7.tgz#a49868a624bdea5069f1251d0a836e0d89aa2c59" + integrity sha512-rIMnbBdgNViL37nZ1b3L/VfPOpSi0TqVDQPAvO6U14lMzOLrt5nilxCQqtDKhZeDiW0/hkCXGoQjhgJd/tCh6w== + dependencies: + request-promise-core "1.1.2" + stealthy-require "^1.1.1" + tough-cookie "^2.3.3" + request-promise@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/request-promise/-/request-promise-4.1.1.tgz#26021e4f6f56fd4c309f6bf1ebd8c97a95ac1fb5" @@ -7089,7 +9816,7 @@ request-promise@^4.1.1: request-promise-core "1.1.1" stealthy-require "^1.0.0" -request@2.x, request@^2.55.0, request@^2.74.0, request@^2.78.0: +request@2.x, request@^2.74.0, request@^2.78.0: version "2.79.0" resolved "https://registry.yarnpkg.com/request/-/request-2.79.0.tgz#4dfe5bf6be8b8cdc37fcf93e04b65577722710de" dependencies: @@ -7114,6 +9841,32 @@ request@2.x, request@^2.55.0, request@^2.74.0, request@^2.78.0: tunnel-agent "~0.4.1" uuid "^3.0.0" +request@^2.72.0, request@^2.87.0: + version "2.88.0" + resolved "https://registry.yarnpkg.com/request/-/request-2.88.0.tgz#9c2fca4f7d35b592efe57c7f0a55e81052124fef" + integrity sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg== + dependencies: + aws-sign2 "~0.7.0" + aws4 "^1.8.0" + caseless "~0.12.0" + combined-stream "~1.0.6" + extend "~3.0.2" + forever-agent "~0.6.1" + form-data "~2.3.2" + har-validator "~5.1.0" + http-signature "~1.2.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.19" + oauth-sign "~0.9.0" + performance-now "^2.1.0" + qs "~6.5.2" + safe-buffer "^5.1.2" + tough-cookie "~2.4.3" + tunnel-agent "^0.6.0" + uuid "^3.3.2" + request@~2.74.0: version "2.74.0" resolved "https://registry.yarnpkg.com/request/-/request-2.74.0.tgz#7693ca768bbb0ea5c8ce08c084a45efa05b892ab" @@ -7140,6 +9893,16 @@ request@~2.74.0: tough-cookie "~2.3.0" tunnel-agent "~0.4.1" +requestretry@^1.2.2: + version "1.13.0" + resolved "https://registry.yarnpkg.com/requestretry/-/requestretry-1.13.0.tgz#213ec1006eeb750e8b8ce54176283d15a8d55d94" + integrity sha512-Lmh9qMvnQXADGAQxsXHP4rbgO6pffCfuR8XUBdP9aitJcLQJxhp7YZK4xAVYXnPJ5E52mwrfiKQtKonPL8xsmg== + dependencies: + extend "^3.0.0" + lodash "^4.15.0" + request "^2.74.0" + when "^3.7.7" + require-directory@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" @@ -7148,46 +9911,94 @@ require-main-filename@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" +require-main-filename@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" + integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== + +require-package-name@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/require-package-name/-/require-package-name-2.0.1.tgz#c11e97276b65b8e2923f75dabf5fb2ef0c3841b9" + integrity sha1-wR6XJ2tluOKSP3Xav1+y7ww4Qbk= + require-relative@^0.8.7: version "0.8.7" resolved "https://registry.yarnpkg.com/require-relative/-/require-relative-0.8.7.tgz#7999539fc9e047a37928fa196f8e1563dabd36de" -require-uncached@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/require-uncached/-/require-uncached-1.0.2.tgz#67dad3b733089e77030124678a459589faf6a7ec" +require-uncached@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/require-uncached/-/require-uncached-1.0.3.tgz#4e0d56d6c9662fd31e43011c4b95aa49955421d3" + integrity sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM= dependencies: caller-path "^0.1.0" resolve-from "^1.0.0" -requires-port@1.x.x: - version "1.0.0" - resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" +reserved-words@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/reserved-words/-/reserved-words-0.1.2.tgz#00a0940f98cd501aeaaac316411d9adc52b31ab1" + integrity sha1-AKCUD5jNUBrqqsMWQR2a3FKzGrE= + +resolve-cwd@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a" + integrity sha1-AKn3OHVW4nA46uIyyqNypqWbZlo= + dependencies: + resolve-from "^3.0.0" + +resolve-dir@^1.0.0, resolve-dir@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-1.0.1.tgz#79a40644c362be82f26effe739c9bb5382046f43" + integrity sha1-eaQGRMNivoLybv/nOcm7U4IEb0M= + dependencies: + expand-tilde "^2.0.0" + global-modules "^1.0.0" resolve-from@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226" + integrity sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY= + +resolve-from@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" + integrity sha1-six699nWiBvItuZTM17rywoYh0g= + +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== resolve-url@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" -resolve@1.1.7, resolve@1.1.x, resolve@^1.1.3, resolve@^1.1.4, resolve@^1.1.6, resolve@^1.1.7: +resolve@1.1.7: version "1.1.7" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" + integrity sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs= + +resolve@^1.1.4, resolve@^1.1.6, resolve@^1.1.7, resolve@^1.10.1, resolve@^1.11.0, resolve@^1.3.2, resolve@^1.4.0, resolve@^1.5.0, resolve@^1.8.1: + version "1.11.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.11.0.tgz#4014870ba296176b86343d50b60f3b50609ce232" + integrity sha512-WL2pBDjqT6pGUNSUzMw00o4T7If+z4H2x3Gz893WoUQ5KW8Vr9txp00ykiP16VBaZF5+j/OcXJHZ9+PCvdiDKw== + dependencies: + path-parse "^1.0.6" resp-modifier@^6.0.0: version "6.0.2" resolved "https://registry.yarnpkg.com/resp-modifier/-/resp-modifier-6.0.2.tgz#b124de5c4fbafcba541f48ffa73970f4aa456b4f" + integrity sha1-sSTeXE+6/LpUH0j/pzlw9KpFa08= dependencies: debug "^2.2.0" minimatch "^3.0.2" -restore-cursor@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-1.0.1.tgz#34661f46886327fed2991479152252df92daa541" +restore-cursor@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" + integrity sha1-n37ih/gv0ybU/RYpI9YhKe7g368= dependencies: - exit-hook "^1.0.0" - onetime "^1.0.0" + onetime "^2.0.0" + signal-exit "^3.0.2" ret@~0.1.10: version "0.1.15" @@ -7197,13 +10008,15 @@ retry@^0.10.0: version "0.10.0" resolved "https://registry.yarnpkg.com/retry/-/retry-0.10.0.tgz#649e15ca408422d98318161935e7f7d652d435dd" -rgb-hex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/rgb-hex/-/rgb-hex-1.0.0.tgz#bfaf8cd9cd9164b5a26d71eb4f15a0965324b3c1" +rgb-regex@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/rgb-regex/-/rgb-regex-1.0.1.tgz#c0e0d6882df0e23be254a475e8edd41915feaeb1" + integrity sha1-wODWiC3w4jviVKR16O3UGRX+rrE= -rgb@~0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/rgb/-/rgb-0.1.0.tgz#be27b291e8feffeac1bd99729721bfa40fc037b5" +rgba-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/rgba-regex/-/rgba-regex-1.0.0.tgz#43374e2e2ca0968b0ef1523460b7d730ff22eeb3" + integrity sha1-QzdOLiyglosO8VI0YLfXMP8i7rM= right-align@^0.1.1: version "0.1.3" @@ -7214,27 +10027,32 @@ right-align@^0.1.1: right-now@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/right-now/-/right-now-1.0.0.tgz#6e89609deebd7dcdaf8daecc9aea39cf585a0918" + integrity sha1-bolgne69fc2vja7Mmuo5z1haCRg= right-pad@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/right-pad/-/right-pad-1.0.1.tgz#8ca08c2cbb5b55e74dafa96bf7fd1a27d568c8d0" + integrity sha1-jKCMLLtbVedNr6lr9/0aJ9VoyNA= -rimraf@2, rimraf@^2.2.8, rimraf@^2.4.3, rimraf@^2.4.4, rimraf@^2.5.4, rimraf@~2.5.0, rimraf@~2.5.1: +rimraf@2, rimraf@~2.5.0, rimraf@~2.5.1: version "2.5.4" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.5.4.tgz#96800093cbf1a0c86bd95b4625467535c29dfa04" dependencies: glob "^7.0.5" +rimraf@2.6.3, rimraf@^2.5.4, rimraf@^2.6.3, rimraf@~2.6.2: + version "2.6.3" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" + integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== + dependencies: + glob "^7.1.3" + rimraf@^2.5.0, rimraf@^2.6.1: version "2.6.2" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" dependencies: glob "^7.0.5" -rimraf@~2.2.6: - version "2.2.8" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.2.8.tgz#e439be2aaee327321952730f99a8929e4fc50582" - ripemd160@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-1.0.1.tgz#93a4bbd4942bc574b69a8fa57c71de10ecca7d6e" @@ -7243,18 +10061,17 @@ rounded-rect@^0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/rounded-rect/-/rounded-rect-0.0.1.tgz#47d7f0356c6d893a2f6f057e379686b25190e0ac" -run-async@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/run-async/-/run-async-0.1.0.tgz#c8ad4a5e110661e402a7d21b530e009f25f8e389" - dependencies: - once "^1.3.0" +rsvp@^4.8.4: + version "4.8.5" + resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.5.tgz#c8f155311d167f68f21e168df71ec5b083113734" + integrity sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA== run-async@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.2.0.tgz#8783abd83c7bb86f41ee0602fc82404b3bd6e8b9" + version "2.3.0" + resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0" + integrity sha1-A3GrSuC91yDUFm19/aZP96RFpsA= dependencies: is-promise "^2.1.0" - pinkie-promise "^2.0.0" run-auto@^2.0.0: version "2.0.0" @@ -7262,23 +10079,37 @@ run-auto@^2.0.0: dependencies: dezalgo "^1.0.1" -run-parallel@^1.1.2: - version "1.1.6" - resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.1.6.tgz#29003c9a2163e01e2d2dfc90575f2c6c1d61a039" - run-series@^1.1.3: version "1.1.4" resolved "https://registry.yarnpkg.com/run-series/-/run-series-1.1.4.tgz#89a73ddc5e75c9ef8ab6320c0a1600d6a41179b9" -rx-lite@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-3.1.2.tgz#19ce502ca572665f3b647b10939f97fd1615f102" +rx-lite-aggregates@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz#753b87a89a11c95467c4ac1626c4efc4e05c67be" + integrity sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74= + dependencies: + rx-lite "*" -rx@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/rx/-/rx-4.1.0.tgz#a5f13ff79ef3b740fe30aa803fb09f98805d4782" +rx-lite@*, rx-lite@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-4.0.8.tgz#0b1e11af8bc44836f04a6407e92da42467b79444" + integrity sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ= + +rxjs@^5.3.0: + version "5.5.12" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-5.5.12.tgz#6fa61b8a77c3d793dbaf270bee2f43f652d741cc" + integrity sha512-xx2itnL5sBbqeeiVgNPVuQQ1nC8Jp2WfNJhXWHmElW9YmrpS9UVnNzhP3EH3HFqexO5Tlp8GhYY+WEcqcVMvGw== + dependencies: + symbol-observable "1.0.1" + +rxjs@^6.1.0, rxjs@^6.4.0: + version "6.5.2" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.2.tgz#2e35ce815cd46d84d02a209fb4e5921e051dbec7" + integrity sha512-HUb7j3kvb7p7eCUHE3FqjoDsC1xfZQ4AHFWfTKSpZ+sAhhz5X1WX0ZuUqWbzB2QhSLp3DoLUG+hMdEDKqWo2Zg== + dependencies: + tslib "^1.9.0" -safe-buffer@^5.1.0, safe-buffer@^5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: +safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" @@ -7292,22 +10123,27 @@ safe-regex@^1.1.0: version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" -sane@~1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/sane/-/sane-1.4.1.tgz#88f763d74040f5f0c256b6163db399bf110ac715" +sane@^4.0.3: + version "4.1.0" + resolved "https://registry.yarnpkg.com/sane/-/sane-4.1.0.tgz#ed881fd922733a6c461bc189dc2b6c006f3ffded" + integrity sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA== dependencies: - exec-sh "^0.2.0" - fb-watchman "^1.8.0" - minimatch "^3.0.2" + "@cnakazawa/watch" "^1.0.3" + anymatch "^2.0.0" + capture-exit "^2.0.0" + exec-sh "^0.3.2" + execa "^1.0.0" + fb-watchman "^2.0.0" + micromatch "^3.1.4" minimist "^1.1.1" walker "~1.0.5" - watch "~0.10.0" -sax@1.1.5, sax@>=0.6.0, sax@^1.1.4: - version "1.1.5" - resolved "https://registry.yarnpkg.com/sax/-/sax-1.1.5.tgz#1da50a8d00cdecd59405659f5ff85349fe773743" +sax@1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.1.tgz#7b8e656190b228e81a66aea748480d828cd2d37a" + integrity sha1-e45lYZCyKOgaZq6nSEgNgozS03o= -sax@^1.2.4, sax@~1.2.1: +sax@>=0.6.0, sax@^1.2.4, sax@~1.2.1, sax@~1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" @@ -7342,40 +10178,52 @@ semantic-release@^6.3.2: version "4.3.6" resolved "https://registry.yarnpkg.com/semver/-/semver-4.3.6.tgz#300bc6e0e86374f7ba61068b5b1ecd57fc6532da" -semver@^5.3.0: +semver@5.5.0, semver@^5.3.0: version "5.5.0" resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab" +semver@^5.4.1, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0: + version "5.7.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.0.tgz#790a7cf6fea5459bac96110b29b60412dc8ff96b" + integrity sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA== + +semver@^6.0.0, semver@^6.1.1: + version "6.1.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.1.1.tgz#53f53da9b30b2103cd4f15eab3a18ecbcb210c9b" + integrity sha512-rWYq2e5iYW+fFe/oPPtYJxYgjBm8sC4rmoGdUOgBB7VnwKt6HrL793l2voH1UlsyYZpJ4g0wfjnTEO1s1NP2eQ== + semver@~5.0.1: version "5.0.3" resolved "https://registry.yarnpkg.com/semver/-/semver-5.0.3.tgz#77466de589cd5d3c95f138aa78bc569a3cb5d27a" -send@0.14.1: - version "0.14.1" - resolved "https://registry.yarnpkg.com/send/-/send-0.14.1.tgz#a954984325392f51532a7760760e459598c89f7a" +send@0.17.1: + version "0.17.1" + resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8" + integrity sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg== dependencies: - debug "~2.2.0" - depd "~1.1.0" + debug "2.6.9" + depd "~1.1.2" destroy "~1.0.4" - encodeurl "~1.0.1" + encodeurl "~1.0.2" escape-html "~1.0.3" - etag "~1.7.0" - fresh "0.3.0" - http-errors "~1.5.0" - mime "1.3.4" - ms "0.7.1" + etag "~1.8.1" + fresh "0.5.2" + http-errors "~1.7.2" + mime "1.6.0" + ms "2.1.1" on-finished "~2.3.0" - range-parser "~1.2.0" - statuses "~1.3.0" + range-parser "~1.2.1" + statuses "~1.5.0" serve-static@^1.10.0: - version "1.11.1" - resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.11.1.tgz#d6cce7693505f733c759de57befc1af76c0f0805" + version "1.14.1" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.1.tgz#666e636dc4f010f7ef29970a88a674320898b2f9" + integrity sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg== dependencies: - encodeurl "~1.0.1" + encodeurl "~1.0.2" escape-html "~1.0.3" - parseurl "~1.3.1" - send "0.14.1" + parseurl "~1.3.3" + send "0.17.1" set-blocking@^2.0.0, set-blocking@~2.0.0: version "2.0.0" @@ -7407,73 +10255,133 @@ setimmediate@^1.0.4: version "1.0.5" resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" -setprototypeof@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.0.1.tgz#52009b27888c4dc48f591949c0a8275834c1ca7e" +setprototypeof@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683" + integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw== -sha.js@^2.3.6, sha.js@~2.4.4: +sha.js@^2.3.6: version "2.4.5" resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.5.tgz#27d171efcc82a118b99639ff581660242b506e7c" dependencies: inherits "^2.0.1" +sha.js@~2.4.4: + version "2.4.11" + resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" + integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + shasum@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/shasum/-/shasum-1.0.2.tgz#e7012310d8f417f4deb5712150e5678b87ae565f" + integrity sha1-5wEjENj0F/TetXEhUOVni4euVl8= dependencies: json-stable-stringify "~0.0.0" sha.js "~2.4.4" +shebang-command@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" + integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= + dependencies: + shebang-regex "^1.0.0" + shebang-regex@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" + integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= -shell-quote@^1.4.2, shell-quote@^1.4.3: +shell-quote@^1.4.2, shell-quote@^1.6.1: version "1.6.1" resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.6.1.tgz#f4781949cce402697127430ea3b3c5476f481767" + integrity sha1-9HgZSczkAmlxJ0MOo7PFR29IF2c= dependencies: array-filter "~0.0.0" array-map "~0.0.0" array-reduce "~0.0.0" jsonify "~0.0.0" -shelljs@0.5.3: - version "0.5.3" - resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.5.3.tgz#c54982b996c76ef0c1e6b59fbdc5825f5b713113" - -shelljs@^0.6.0: - version "0.6.1" - resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.6.1.tgz#ec6211bed1920442088fe0f70b2837232ed2c8a8" - -shelljs@^0.7.0: - version "0.7.4" - resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.7.4.tgz#b8f04b3a74ddfafea22acf98e0be45ded53d59c8" +shelljs@0.7.6: + version "0.7.6" + resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.7.6.tgz#379cccfb56b91c8601e4793356eb5382924de9ad" + integrity sha1-N5zM+1a5HIYB5HkzVutTgpJN6a0= dependencies: glob "^7.0.0" interpret "^1.0.0" rechoir "^0.6.2" -shellwords@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.0.tgz#66afd47b6a12932d9071cbfd98a52e785cd0ba14" +shellwords@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b" + integrity sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww== signal-exit@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.1.tgz#5a4c884992b63a7acd9badb7894c3ee9cfccad81" +signal-exit@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" + integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= + +simple-concat@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.0.tgz#7344cbb8b6e26fb27d66b2fc86f9f6d5997521c6" + integrity sha1-c0TLuLbib7J9ZrL8hvn21Zl1IcY= + simple-html-index@^1.4.0: version "1.5.0" resolved "https://registry.yarnpkg.com/simple-html-index/-/simple-html-index-1.5.0.tgz#2c93eeaebac001d8a135fc0022bd4ade8f58996f" + integrity sha1-LJPurrrAAdihNfwAIr1K3o9YmW8= dependencies: from2-string "^1.1.0" +simple-swizzle@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" + integrity sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo= + dependencies: + is-arrayish "^0.3.1" + +sisteransi@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.0.tgz#77d9622ff909080f1c19e5f4a1df0c1b0a27b88c" + integrity sha512-N+z4pHB4AmUv0SjveWRd6q1Nj5w62m5jodv+GD8lvmbY/83T/rpbJGZOnK5T149OldDj4Db07BSv9xY4K6NTPQ== + +slack-node@^0.1.8: + version "0.1.8" + resolved "https://registry.yarnpkg.com/slack-node/-/slack-node-0.1.8.tgz#cda98de8681485b301dc6742ddc3897117fad349" + integrity sha1-zamN6GgUhbMB3GdC3cOJcRf600k= + dependencies: + requestretry "^1.2.2" + slash@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" -slice-ansi@0.0.4: - version "0.0.4" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-0.0.4.tgz#edbf8903f66f7ce2f8eafd6ceed65e264c831b35" +slash@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44" + integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A== + +slice-ansi@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-1.0.0.tgz#044f1a49d8842ff307aad6b505ed178bd950134d" + integrity sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg== + dependencies: + is-fullwidth-code-point "^2.0.0" + +slice-ansi@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636" + integrity sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ== + dependencies: + ansi-styles "^3.2.0" + astral-regex "^1.0.0" + is-fullwidth-code-point "^2.0.0" slide@^1.1.3: version "1.1.6" @@ -7542,47 +10450,30 @@ source-map-support@^0.4.15: dependencies: source-map "^0.5.6" -source-map-support@^0.4.2: - version "0.4.3" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.3.tgz#693c8383d4389a4569486987c219744dfc601685" +source-map-support@^0.5.6, source-map-support@~0.5.10: + version "0.5.12" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.12.tgz#b4f3b10d51857a5af0138d3ce8003b201613d599" + integrity sha512-4h2Pbvyy15EE02G+JOZpUCmqWJuqrs+sEkzewTm++BPi7Hvn/HwcqLAcNxYAyI0x13CpPPn+kMjl+hplXMHITQ== dependencies: - source-map "^0.5.3" + buffer-from "^1.0.0" + source-map "^0.6.0" source-map-url@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" -source-map@^0.4.4: - version "0.4.4" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b" - dependencies: - amdefine ">=0.0.4" +source-map@^0.5.0, source-map@^0.5.7, source-map@~0.5.3: + version "0.5.7" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" -source-map@^0.5.0, source-map@^0.5.3, source-map@^0.5.6, source-map@~0.5.1, source-map@~0.5.3: +source-map@^0.5.3, source-map@^0.5.6, source-map@~0.5.1: version "0.5.6" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.6.tgz#75ce38f52bf0733c5a7f0c118d81334a2bb5f412" -source-map@^0.5.7: - version "0.5.7" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" - -source-map@^0.6.1, source-map@~0.6.1: +source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" -source-map@~0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.2.0.tgz#dab73fbcfc2ba819b4de03bd6f6eaa48164b3f9d" - dependencies: - amdefine ">=0.0.4" - -spawn-sync@^1.0.15: - version "1.0.15" - resolved "https://registry.yarnpkg.com/spawn-sync/-/spawn-sync-1.0.15.tgz#b00799557eb7fb0c8376c29d44e8a1ea67e57476" - dependencies: - concat-stream "^1.4.7" - os-shim "^0.1.2" - spdx-correct@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-1.0.2.tgz#4b3073d933ff51f3912f03ac5519498a4150db40" @@ -7610,6 +10501,7 @@ split-string@^3.0.1, split-string@^3.0.2: split2@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/split2/-/split2-0.2.1.tgz#02ddac9adc03ec0bb78c1282ec079ca6e85ae900" + integrity sha1-At2smtwD7Au3jBKC7Aecpuha6QA= dependencies: through2 "~0.6.1" @@ -7638,32 +10530,20 @@ sshpk@^1.7.0: jsbn "~0.1.0" tweetnacl "~0.14.0" +stable@^0.1.8: + version "0.1.8" + resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf" + integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w== + +stack-utils@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-1.0.2.tgz#33eba3897788558bebfc2db059dc158ec36cebb8" + integrity sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA== + stacked@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/stacked/-/stacked-1.1.1.tgz#2c7fa38cc7e37a3411a77cd8e792de448f9f6975" - -standard-engine@^5.0.0, standard-engine@~5.1.0: - version "5.1.1" - resolved "https://registry.yarnpkg.com/standard-engine/-/standard-engine-5.1.1.tgz#cb775eae1c50cfa8e76ab25456dd122af7f34788" - dependencies: - deglob "^2.0.0" - find-root "^1.0.0" - get-stdin "^5.0.1" - home-or-tmp "^2.0.0" - minimist "^1.1.0" - pkg-config "^1.0.1" - -standard@^8.3.0: - version "8.4.0" - resolved "https://registry.yarnpkg.com/standard/-/standard-8.4.0.tgz#483352e43faeb35a26e8ec163994e5138c31b650" - dependencies: - eslint "~3.7.1" - eslint-config-standard "6.2.0" - eslint-config-standard-jsx "3.2.0" - eslint-plugin-promise "~3.0.0" - eslint-plugin-react "~6.4.1" - eslint-plugin-standard "~2.0.1" - standard-engine "~5.1.0" + integrity sha1-LH+jjMfjejQRp3zY55LeRI+faXU= static-extend@^0.1.1: version "0.1.2" @@ -7672,13 +10552,15 @@ static-extend@^0.1.1: define-property "^0.2.5" object-copy "^0.1.0" -statuses@1, "statuses@>= 1.3.0 < 2", statuses@~1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.3.0.tgz#8e55758cb20e7682c1f4fce8dcab30bf01d1e07a" +"statuses@>= 1.5.0 < 2", statuses@~1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" + integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= stdout-stream@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/stdout-stream/-/stdout-stream-1.4.0.tgz#a2c7c8587e54d9427ea9edb3ac3f2cd522df378b" + version "1.4.1" + resolved "https://registry.yarnpkg.com/stdout-stream/-/stdout-stream-1.4.1.tgz#5ac174cdd5cd726104aa0c0b2bd83815d8d535de" + integrity sha512-j4emi03KXqJWcIeF8eIXkjMFN1Cmb8gUlDYGeBALLPo5qdyTfA9bOtl8m33lRoC+vFMkP3gl0WsDr6+gzxbbTA== dependencies: readable-stream "^2.0.1" @@ -7686,7 +10568,20 @@ stealthy-require@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.0.0.tgz#1a8ed8fc19a8b56268f76f5a1a3e3832b0c26200" -stream-browserify@^2.0.0, stream-browserify@^2.0.1: +stealthy-require@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" + integrity sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks= + +stream-browserify@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.2.tgz#87521d38a44aa7ee91ce1cd2a47df0cb49dd660b" + integrity sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg== + dependencies: + inherits "~2.0.1" + readable-stream "^2.0.2" + +stream-browserify@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.1.tgz#66266ee5f9bdb9940a4e4514cafb43bb71e5c9db" dependencies: @@ -7696,6 +10591,7 @@ stream-browserify@^2.0.0, stream-browserify@^2.0.1: stream-combiner2@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/stream-combiner2/-/stream-combiner2-1.1.1.tgz#fb4d8a1420ea362764e21ad4780397bebcb41cbe" + integrity sha1-+02KFCDqNidk4hrUeAOXvry0HL4= dependencies: duplexer2 "~0.1.0" readable-stream "^2.0.2" @@ -7710,17 +10606,7 @@ stream-consume@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/stream-consume/-/stream-consume-0.1.0.tgz#a41ead1a6d6081ceb79f65b061901b6d8f3d1d0f" -stream-http@^2.0.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.4.0.tgz#9599aa8e263667ce4190e0dc04a1d065d3595a7e" - dependencies: - builtin-status-codes "^2.0.0" - inherits "^2.0.1" - readable-stream "^2.1.0" - to-arraybuffer "^1.0.0" - xtend "^4.0.0" - -stream-http@^2.7.2: +stream-http@^2.0.0, stream-http@^2.7.2: version "2.8.3" resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.8.3.tgz#b2d242469288a5a27ec4fe8933acf623de6514fc" dependencies: @@ -7731,8 +10617,9 @@ stream-http@^2.7.2: xtend "^4.0.0" stream-splicer@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/stream-splicer/-/stream-splicer-2.0.0.tgz#1b63be438a133e4b671cc1935197600175910d83" + version "2.0.1" + resolved "https://registry.yarnpkg.com/stream-splicer/-/stream-splicer-2.0.1.tgz#0b13b7ee2b5ac7e0609a7463d83899589a363fcd" + integrity sha512-Xizh4/NPuYSyAXyT7g8IvdJ9HJpxIGL9PjyhtywCZvvP0OPIdqyrr4dMikeuvY8xahpdKEBlBTySe583totajg== dependencies: inherits "^2.0.1" readable-stream "^2.0.2" @@ -7741,9 +10628,18 @@ strict-uri-encode@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" +string-length@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/string-length/-/string-length-2.0.0.tgz#d40dbb686a3ace960c1cffca562bf2c45f8363ed" + integrity sha1-1A27aGo6zpYMHP/KVivyxF+DY+0= + dependencies: + astral-regex "^1.0.0" + strip-ansi "^4.0.0" + string-to-js@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/string-to-js/-/string-to-js-0.0.1.tgz#bf153c760636faa30769b804a0195552ba7ad80f" + integrity sha1-vxU8dgY2+qMHabgEoBlVUrp62A8= string-width@^1.0.1, string-width@^1.0.2: version "1.0.2" @@ -7753,9 +10649,22 @@ string-width@^1.0.1, string-width@^1.0.2: is-fullwidth-code-point "^1.0.0" strip-ansi "^3.0.0" -string.prototype.codepointat@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/string.prototype.codepointat/-/string.prototype.codepointat-0.2.0.tgz#6b26e9bd3afcaa7be3b4269b526de1b82000ac78" +string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" + integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== + dependencies: + is-fullwidth-code-point "^2.0.0" + strip-ansi "^4.0.0" + +string-width@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" + integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== + dependencies: + emoji-regex "^7.0.1" + is-fullwidth-code-point "^2.0.0" + strip-ansi "^5.1.0" string_decoder@^1.0.0, string_decoder@~1.1.1: version "1.1.1" @@ -7763,7 +10672,14 @@ string_decoder@^1.0.0, string_decoder@~1.1.1: dependencies: safe-buffer "~5.1.0" -string_decoder@~0.10.0, string_decoder@~0.10.x: +string_decoder@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.2.0.tgz#fe86e738b19544afe70469243b2a1ee9240eae8d" + integrity sha512-6YqyX6ZWEYguAxgZzHGL7SsCeGx3V2TtOTqZz1xSTSWnqsbWwbptafNyvf/ACquZUXV3DANr5BDIwNYe1mN42w== + dependencies: + safe-buffer "~5.1.0" + +string_decoder@~0.10.x: version "0.10.31" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" @@ -7774,6 +10690,7 @@ stringstream@~0.0.4: strip-ansi@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-0.3.0.tgz#25f48ea22ca79187f3174a4db8759347bb126220" + integrity sha1-JfSOoiynkYfzF0pNuHWTR7sSYiA= dependencies: ansi-regex "^0.2.1" @@ -7783,15 +10700,35 @@ strip-ansi@^3.0.0, strip-ansi@^3.0.1: dependencies: ansi-regex "^2.0.0" +strip-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" + integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= + dependencies: + ansi-regex "^3.0.0" + +strip-ansi@^5.0.0, strip-ansi@^5.1.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" + integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== + dependencies: + ansi-regex "^4.1.0" + +strip-bom@3.0.0, strip-bom@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= + strip-bom@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" dependencies: is-utf8 "^0.2.0" -strip-bom@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" +strip-eof@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" + integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= strip-indent@^1.0.1: version "1.0.1" @@ -7799,11 +10736,11 @@ strip-indent@^1.0.1: dependencies: get-stdin "^4.0.1" -strip-json-comments@2.0.1, strip-json-comments@~2.0.1: +strip-json-comments@2.0.1, strip-json-comments@^2.0.1, strip-json-comments@~2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" -strip-json-comments@~1.0.1, strip-json-comments@~1.0.4: +strip-json-comments@~1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-1.0.4.tgz#1e15fbcac97d3ee99bf2d73b4c656b082bbafb91" @@ -7813,19 +10750,31 @@ style-loader@^0.13.0: dependencies: loader-utils "^1.0.2" +stylehacks@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-4.0.3.tgz#6718fcaf4d1e07d8a1318690881e8d96726a71d5" + integrity sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g== + dependencies: + browserslist "^4.0.0" + postcss "^7.0.0" + postcss-selector-parser "^3.0.0" + subarg@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/subarg/-/subarg-1.0.0.tgz#f62cf17581e996b48fc965699f54c06ae268b8d2" + integrity sha1-9izxdYHplrSPyWVpn1TAauJouNI= dependencies: minimist "^1.1.0" supports-color@1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-1.3.1.tgz#15758df09d8ff3b4acc307539fabe27095e1042d" + integrity sha1-FXWN8J2P87SswwdTn6vicJXhBC0= supports-color@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-0.2.0.tgz#d92de2694eb3f67323973d7ae3d8b55b4c22190a" + integrity sha1-2S3iaU6z9nMjlz1649i1W0wiGQo= supports-color@^2.0.0: version "2.0.0" @@ -7843,12 +10792,26 @@ supports-color@^3.2.3: dependencies: has-flag "^1.0.0" +supports-color@^4.0.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-4.5.0.tgz#be7a0de484dec5c5cddf8b3d59125044912f635b" + integrity sha1-vnoN5ITexcXN34s9WRJQRJEvY1s= + dependencies: + has-flag "^2.0.0" + supports-color@^5.3.0, supports-color@^5.4.0: version "5.4.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.4.0.tgz#1c6b337402c2137605efe19f10fec390f6faab54" dependencies: has-flag "^3.0.0" +supports-color@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3" + integrity sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ== + dependencies: + has-flag "^3.0.0" + svg.js@^2.6.5: version "2.6.5" resolved "https://registry.yarnpkg.com/svg.js/-/svg.js-2.6.5.tgz#5b93d0c8c11e2b70812ef9de1562aa91975cc3b6" @@ -7865,26 +10828,64 @@ svgo@^0.7.0: sax "~1.2.1" whet.extend "~0.9.9" -"symbol-tree@>= 3.1.0 < 4.0.0": - version "3.1.4" - resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.1.4.tgz#02b279348d337debc39694c5c95f882d448a312a" +svgo@^1.0.0: + version "1.2.2" + resolved "https://registry.yarnpkg.com/svgo/-/svgo-1.2.2.tgz#0253d34eccf2aed4ad4f283e11ee75198f9d7316" + integrity sha512-rAfulcwp2D9jjdGu+0CuqlrAUin6bBWrpoqXWwKDZZZJfXcUXQSxLJOFJCQCSA0x0pP2U0TxSlJu2ROq5Bq6qA== + dependencies: + chalk "^2.4.1" + coa "^2.0.2" + css-select "^2.0.0" + css-select-base-adapter "^0.1.1" + css-tree "1.0.0-alpha.28" + css-url-regex "^1.1.0" + csso "^3.5.1" + js-yaml "^3.13.1" + mkdirp "~0.5.1" + object.values "^1.1.0" + sax "~1.2.4" + stable "^0.1.8" + unquote "~1.1.1" + util.promisify "~1.0.0" + +symbol-observable@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.0.1.tgz#8340fc4702c3122df5d22288f88283f513d3fdd4" + integrity sha1-g0D8RwLDEi310iKI+IKD9RPT/dQ= + +symbol-tree@^3.2.2: + version "3.2.4" + resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" + integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== syntax-error@^1.1.1: - version "1.1.6" - resolved "https://registry.yarnpkg.com/syntax-error/-/syntax-error-1.1.6.tgz#b4549706d386cc1c1dc7c2423f18579b6cade710" + version "1.4.0" + resolved "https://registry.yarnpkg.com/syntax-error/-/syntax-error-1.4.0.tgz#2d9d4ff5c064acb711594a3e3b95054ad51d907c" + integrity sha512-YPPlu67mdnHGTup2A8ff7BC2Pjq0e0Yp/IyTFN03zWO0RcK07uLcbi7C2KpGR2FvWbaB0+bfE27a+sBKebSo7w== dependencies: - acorn "^2.7.0" + acorn-node "^1.2.0" -table@^3.7.8: - version "3.8.0" - resolved "https://registry.yarnpkg.com/table/-/table-3.8.0.tgz#252166c7f3286684a9d561b0f3a8929caf3a997b" +table@4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/table/-/table-4.0.2.tgz#a33447375391e766ad34d3486e6e2aedc84d2e36" + integrity sha512-UUkEAPdSGxtRpiV9ozJ5cMTtYiqz7Ni1OGqLXRCynrvzdtR1p+cfOWe2RJLwvUG8hNanaSRjecIqwOjqeatDsA== dependencies: - ajv "^4.7.0" - ajv-keywords "^1.0.0" - chalk "^1.1.1" - lodash "^4.0.0" - slice-ansi "0.0.4" - string-width "^1.0.1" + ajv "^5.2.3" + ajv-keywords "^2.1.0" + chalk "^2.1.0" + lodash "^4.17.4" + slice-ansi "1.0.0" + string-width "^2.1.1" + +table@^5.2.3: + version "5.4.1" + resolved "https://registry.yarnpkg.com/table/-/table-5.4.1.tgz#0691ae2ebe8259858efb63e550b6d5f9300171e8" + integrity sha512-E6CK1/pZe2N75rGZQotFOdmzWQ1AILtgYbMAbAjvms0S1l5IDB47zG3nCnFGB/w+7nB3vKofbLXCH7HPBo864w== + dependencies: + ajv "^6.9.1" + lodash "^4.17.11" + slice-ansi "^2.1.0" + string-width "^3.0.0" tapable@^0.2.7, tapable@~0.2.5: version "0.2.8" @@ -7923,48 +10924,75 @@ tar@~2.2.0, tar@~2.2.1: fstream "^1.0.2" inherits "2" -temp@^0.8.3: - version "0.8.3" - resolved "https://registry.yarnpkg.com/temp/-/temp-0.8.3.tgz#e0c6bc4d26b903124410e4fed81103014dfc1f59" - dependencies: - os-tmpdir "^1.0.0" - rimraf "~2.2.6" - term-color@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/term-color/-/term-color-1.0.1.tgz#38e192553a473e35e41604ff5199846bf8117a3a" + integrity sha1-OOGSVTpHPjXkFgT/UZmEa/gRejo= dependencies: ansi-styles "2.0.1" supports-color "1.3.1" -test-exclude@^2.1.1: - version "2.1.3" - resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-2.1.3.tgz#a8d8968e1da83266f9864f2852c55e220f06434a" +terser@^3.7.5: + version "3.17.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-3.17.0.tgz#f88ffbeda0deb5637f9d24b0da66f4e15ab10cb2" + integrity sha512-/FQzzPJmCpjAH9Xvk2paiWrFq+5M6aVOf+2KRbwhByISDX/EujxsK+BAvrhb6H+2rtrLCHK9N01wO014vrIwVQ== dependencies: - arrify "^1.0.1" - micromatch "^2.3.11" - object-assign "^4.1.0" - read-pkg-up "^1.0.1" - require-main-filename "^1.0.1" + commander "^2.19.0" + source-map "~0.6.1" + source-map-support "~0.5.10" + +test-exclude@^5.2.3: + version "5.2.3" + resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-5.2.3.tgz#c3d3e1e311eb7ee405e092dac10aefd09091eac0" + integrity sha512-M+oxtseCFO3EDtAaGH7iiej3CBkzXqFMbzqYAACdzKui4eZA+pq3tZEwChvOdNfa7xxy8BfbmgJSIr43cC/+2g== + dependencies: + glob "^7.1.3" + minimatch "^3.0.4" + read-pkg-up "^4.0.0" + require-main-filename "^2.0.0" -text-table@~0.2.0: +text-table@^0.2.0, text-table@~0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= -throat@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/throat/-/throat-3.0.0.tgz#e7c64c867cbb3845f10877642f7b60055b8ec0d6" +this-commit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/this-commit/-/this-commit-1.0.0.tgz#17008b87e39d971ae684f0b3af45320c589756ed" + integrity sha1-FwCLh+OdlxrmhPCzr0UyDFiXVu0= + +throat@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/throat/-/throat-4.1.0.tgz#89037cbc92c56ab18926e6ba4cbb200e15672a6a" + integrity sha1-iQN8vJLFarGJJua6TLsgDhVnKmo= -through2@^2.0.0, through2@^2.0.1: +through2@2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.1.tgz#384e75314d49f32de12eebb8136b8eb6b5d59da9" + integrity sha1-OE51MU1J8y3hLuu4E2uOtrXVnak= dependencies: readable-stream "~2.0.0" xtend "~4.0.0" +through2@^2.0.0: + version "2.0.5" + resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" + integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== + dependencies: + readable-stream "~2.3.6" + xtend "~4.0.1" + +through2@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/through2/-/through2-3.0.1.tgz#39276e713c3302edf9e388dd9c812dd3b825bd5a" + integrity sha512-M96dvTalPT3YbYLaKaCuwu+j06D/8Jfib0o/PxbVt6Amhv3dUAtW6rTV1jPgJSBG83I/e04Y6xkVdVhSRhi0ww== + dependencies: + readable-stream "2 || 3" + through2@~0.6.1: version "0.6.5" resolved "https://registry.yarnpkg.com/through2/-/through2-0.6.5.tgz#41ab9c67b29d57209071410e1d7a7a968cd3ad48" + integrity sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg= dependencies: readable-stream ">=1.0.33-1 <1.1.0-0" xtend ">=4.0.0 <4.1.0-0" @@ -7976,10 +11004,12 @@ through@2, "through@>=2.2.7 <3", through@^2.3.6, through@^2.3.7, through@~2.3, t through@~2.2.7: version "2.2.7" resolved "https://registry.yarnpkg.com/through/-/through-2.2.7.tgz#6e8e21200191d4eb6a99f6f010df46aa1c6eb2bd" + integrity sha1-bo4hIAGR1OtqmfbwEN9Gqhxusr0= timers-browserify@^1.0.1: version "1.4.2" resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-1.4.2.tgz#c9c58b575be8407375cb5e2462dacee74359f41d" + integrity sha1-ycWLV1voQHN1y14kYtrO50NZ9B0= dependencies: process "~0.11.0" @@ -7989,20 +11019,22 @@ timers-browserify@^2.0.4: dependencies: setimmediate "^1.0.4" -tiny-lr@^0.2.0: - version "0.2.1" - resolved "https://registry.yarnpkg.com/tiny-lr/-/tiny-lr-0.2.1.tgz#b3fdba802e5d56a33c2f6f10794b32e477ac729d" +timsort@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/timsort/-/timsort-0.3.0.tgz#405411a8e7e6339fe64db9a234de11dc31e02bd4" + integrity sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q= + +tmp@^0.0.33: + version "0.0.33" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" + integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== dependencies: - body-parser "~1.14.0" - debug "~2.2.0" - faye-websocket "~0.10.0" - livereload-js "^2.2.0" - parseurl "~1.3.0" - qs "~5.1.0" + os-tmpdir "~1.0.2" tmpl@1.0.x: version "1.0.4" resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.4.tgz#23640dd7b42d00433911140820e5cf440e521dd1" + integrity sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE= to-arraybuffer@^1.0.0: version "1.0.1" @@ -8016,6 +11048,11 @@ to-fast-properties@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= + to-function@2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/to-function/-/to-function-2.0.6.tgz#7d56cd9c3b92fa8dbd7b22e83d51924de740ebc5" @@ -8044,13 +11081,37 @@ to-regex@^3.0.1, to-regex@^3.0.2: regex-not "^1.0.2" safe-regex "^1.1.0" -tough-cookie@^2.3.1, tough-cookie@~2.3.0: +toidentifier@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" + integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== + +tough-cookie@^2.3.3, tough-cookie@^2.3.4: + version "2.5.0" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" + integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== + dependencies: + psl "^1.1.28" + punycode "^2.1.1" + +tough-cookie@~2.3.0: version "2.3.1" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.1.tgz#99c77dfbb7d804249e8a299d4cb0fd81fef083fd" -tr46@~0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" +tough-cookie@~2.4.3: + version "2.4.3" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.4.3.tgz#53f36da3f47783b0925afa06ff9f3b165280f781" + integrity sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ== + dependencies: + psl "^1.1.24" + punycode "^1.4.1" + +tr46@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-1.0.1.tgz#a8b13fd6bfd2489519674ccde55ba3693b706d09" + integrity sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk= + dependencies: + punycode "^2.1.0" travis-ci@^2.1.1: version "2.1.1" @@ -8079,14 +11140,27 @@ trim-right@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" -tryit@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/tryit/-/tryit-1.0.2.tgz#c196b0073e6b1c595d93c9c830855b7acc32a453" +tslib@^1.9.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.10.0.tgz#c3c19f95973fb0a62973fb09d90d961ee43e5c8a" + integrity sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ== -tty-browserify@0.0.0, tty-browserify@~0.0.0: +tty-browserify@0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" +tty-browserify@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.1.tgz#3f05251ee17904dfd0677546670db9651682b811" + integrity sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw== + +tunnel-agent@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= + dependencies: + safe-buffer "^5.0.1" + tunnel-agent@~0.4.1: version "0.4.3" resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.4.3.tgz#6373db76909fe570e08d73583365ed828a74eeeb" @@ -8098,28 +11172,26 @@ tweetnacl@^0.14.3, tweetnacl@~0.14.0: type-check@~0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" + integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I= dependencies: prelude-ls "~1.1.2" -type-is@~1.6.10: - version "1.6.13" - resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.13.tgz#6e83ba7bc30cd33a7bb0b7fb00737a2085bf9d08" - dependencies: - media-typer "0.3.0" - mime-types "~2.1.11" - -typedarray@~0.0.5: +typedarray@^0.0.6, typedarray@~0.0.5: version "0.0.6" resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" -uglify-js@2.x.x, uglify-js@^2.6: - version "2.7.3" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.7.3.tgz#39b3a7329b89f5ec507e344c6e22568698ef4868" +typescript-eslint-parser@^16.0.0: + version "16.0.1" + resolved "https://registry.yarnpkg.com/typescript-eslint-parser/-/typescript-eslint-parser-16.0.1.tgz#b40681c7043b222b9772748b700a000b241c031b" + integrity sha512-IKawLTu4A2xN3aN/cPLxvZ0bhxZHILGDKTZWvWNJ3sLNhJ3PjfMEDQmR2VMpdRPrmWOadgWXRwjLBzSA8AGsaQ== dependencies: - async "~0.2.6" - source-map "~0.5.1" - uglify-to-browserify "~1.0.0" - yargs "~3.10.0" + lodash.unescape "4.0.1" + semver "5.5.0" + +typescript@^2.5.1: + version "2.9.2" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.9.2.tgz#1cbf61d05d6b96269244eb6a3bce4bd914e0f00c" + integrity sha512-Gr4p6nFNaoufRIY4NMdpQRNmgxVIGMs4Fcu/ujdYk3nAZqk7supzBE9idmvfZIlH/Cuj//dvi+019qEue9lV0w== uglify-js@^2.8.27: version "2.8.29" @@ -8130,19 +11202,28 @@ uglify-js@^2.8.27: optionalDependencies: uglify-to-browserify "~1.0.0" +uglify-js@^3.1.4: + version "3.6.0" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.6.0.tgz#704681345c53a8b2079fb6cec294b05ead242ff5" + integrity sha512-W+jrUHJr3DXKhrsS7NUVxn3zqMOFn0hL/Ei6v0anCIMoKC93TjcflTagwIHLW7SfMFfiQuktQyFVCFHGUE0+yg== + dependencies: + commander "~2.20.0" + source-map "~0.6.1" + uglify-to-browserify@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7" -uglifyify@^3.0.2: - version "3.0.3" - resolved "https://registry.yarnpkg.com/uglifyify/-/uglifyify-3.0.3.tgz#e53ba71977dbff773e340e5e35292825965d66d2" +uglifyify@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/uglifyify/-/uglifyify-5.0.1.tgz#70b1d8b413c410348c8e35e7f8bd1330a422d5f6" + integrity sha512-PO44rgExvwj3rkK0UzenHVnPU18drBy9x9HOUmgkuRh6K2KIsDqrB5LqxGtjybgGTOS1JeP8SBc+TN5rhiva6w== dependencies: convert-source-map "~1.1.0" extend "^1.2.1" minimatch "^3.0.2" + terser "^3.7.5" through "~2.3.4" - uglify-js "2.x.x" uid-number@0.0.5: version "0.0.5" @@ -8152,9 +11233,26 @@ uid-number@~0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81" +ultron@1.0.x: + version "1.0.2" + resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.0.2.tgz#ace116ab557cd197386a4e88f4685378c8b2e4fa" + integrity sha1-rOEWq1V80Zc4ak6I9GhTeMiy5Po= + umd@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/umd/-/umd-3.0.1.tgz#8ae556e11011f63c2596708a8837259f01b3d60e" + version "3.0.3" + resolved "https://registry.yarnpkg.com/umd/-/umd-3.0.3.tgz#aa9fe653c42b9097678489c01000acb69f0b26cf" + integrity sha512-4IcGSufhFshvLNcMCV80UnQVlZ5pMOC8mvNPForqwA4+lzYQuetTESLDQkeLmihq8bRcnpbQa48Wb8Lh16/xow== + +undeclared-identifiers@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/undeclared-identifiers/-/undeclared-identifiers-1.1.3.tgz#9254c1d37bdac0ac2b52de4b6722792d2a91e30f" + integrity sha512-pJOW4nxjlmfwKApE4zvxLScM/njmwj/DiUBv7EabwE4O8kRUy+HIwxQtZLBPll/jx1LJyBcqNfB3/cpv9EZwOw== + dependencies: + acorn-node "^1.3.0" + dash-ast "^1.0.0" + get-assigned-identifiers "^1.2.0" + simple-concat "^1.0.0" + xtend "^4.0.1" underscore.string@~2.2.0rc: version "2.2.1" @@ -8163,10 +11261,35 @@ underscore.string@~2.2.0rc: underscore.string@~2.4.0: version "2.4.0" resolved "https://registry.yarnpkg.com/underscore.string/-/underscore.string-2.4.0.tgz#8cdd8fbac4e2d2ea1e7e2e8097c42f442280f85b" + integrity sha1-jN2PusTi0uoefi6Al8QvRCKA+Fs= underscore@~1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.7.0.tgz#6bbaf0877500d36be34ecaa584e0db9fef035209" + integrity sha1-a7rwh3UA02vjTsqlhODbn+8DUgk= + +unicode-canonical-property-names-ecmascript@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz#2619800c4c825800efdd8343af7dd9933cbe2818" + integrity sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ== + +unicode-match-property-ecmascript@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz#8ed2a32569961bce9227d09cd3ffbb8fed5f020c" + integrity sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg== + dependencies: + unicode-canonical-property-names-ecmascript "^1.0.4" + unicode-property-aliases-ecmascript "^1.0.4" + +unicode-match-property-value-ecmascript@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.1.0.tgz#5b4b426e08d13a80365e0d657ac7a6c1ec46a277" + integrity sha512-hDTHvaBk3RmFzvSl0UVrUmC3PuW9wKVnpoUDYH0JDkSIovzw+J5viQmeYHxVSBptubnr7PbH2e0fnpDRQnQl5g== + +unicode-property-aliases-ecmascript@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.5.tgz#a9cc6cc7ce63a0a3023fc99e341b94431d405a57" + integrity sha512-L5RAqCfXqAwR3RriF8pM0lU0w4Ryf/GgzONwi6KnL1taJQa7x1TCxdJnILX59WIGOwR57IVxn7Nej0fz1Ny6fw== union-value@^1.0.0: version "1.0.0" @@ -8192,9 +11315,15 @@ units-css@^0.4.0: isnumeric "^0.2.0" viewport-dimensions "^0.2.0" -unpipe@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" +universalify@^0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" + integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== + +unquote@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/unquote/-/unquote-1.1.1.tgz#8fded7324ec6e88a0ff8b905e7c098cdc086d544" + integrity sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ= unset-value@^1.0.0: version "1.0.0" @@ -8207,6 +11336,18 @@ upath@^1.0.5: version "1.1.0" resolved "https://registry.yarnpkg.com/upath/-/upath-1.1.0.tgz#35256597e46a581db4793d0ce47fa9aebfc9fabd" +upath@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/upath/-/upath-1.1.2.tgz#3db658600edaeeccbe6db5e684d67ee8c2acd068" + integrity sha512-kXpym8nmDmlCBr7nKdIx8P2jNBa+pBpIUFRnKJ4dr8htyYGJFokkr2ZvERRtUN+9SY+JqXouNgUPtv6JQva/2Q== + +uri-js@^4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" + integrity sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ== + dependencies: + punycode "^2.1.0" + urix@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" @@ -8221,10 +11362,12 @@ url-loader@~0.5.7: url-trim@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/url-trim/-/url-trim-1.0.0.tgz#40057e2f164b88e5daca7269da47e6d1dd837adc" + integrity sha1-QAV+LxZLiOXaynJp2kfm0d2Detw= url@0.10.3: version "0.10.3" resolved "https://registry.yarnpkg.com/url/-/url-0.10.3.tgz#021e4d9c7705f21bbf37d03ceb58767402774c64" + integrity sha1-Ah5NnHcF8hu/N9A861h2dAJ3TGQ= dependencies: punycode "1.3.2" querystring "0.2.0" @@ -8246,28 +11389,43 @@ user-home@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/user-home/-/user-home-1.1.1.tgz#2b5be23a32b63a7c9deb8d0f28d485724a3df190" -user-home@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/user-home/-/user-home-2.0.0.tgz#9c70bfd8169bc1dcbf48604e0f04b8b49cde9e9f" +username@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/username/-/username-4.1.0.tgz#640f2ae13d17c51e7fb1d3517ad7c17fcd5d1670" + integrity sha512-sKh1KCsMfv8jPIC9VdeQhrNAgkl842jS/M74HQv7Byr0AMAwKZt8mLWX9DmtMeD8nQA3eKa10f5LbqlSVmokMg== dependencies: - os-homedir "^1.0.0" + execa "^1.0.0" + mem "^4.0.0" -util-deprecate@~1.0.1: +util-deprecate@^1.0.1, util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" -util@0.10.3, util@~0.10.1: +util.promisify@^1.0.0, util.promisify@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.0.tgz#440f7165a459c9a16dc145eb8e72f35687097030" + integrity sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA== + dependencies: + define-properties "^1.1.2" + object.getownpropertydescriptors "^2.0.3" + +util@0.10.3: version "0.10.3" resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" dependencies: inherits "2.0.1" -util@^0.10.3: +util@^0.10.3, util@~0.10.1: version "0.10.4" resolved "https://registry.yarnpkg.com/util/-/util-0.10.4.tgz#3aa0125bfe668a4672de58857d3ace27ecb76901" dependencies: inherits "2.0.3" +uuid@3.3.2, uuid@^3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131" + integrity sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA== + uuid@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.0.1.tgz#6544bba2dfda8c1cf17e629a3a305e2bb1fee6c1" @@ -8299,46 +11457,69 @@ viewport-dimensions@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/viewport-dimensions/-/viewport-dimensions-0.2.0.tgz#de740747db5387fd1725f5175e91bac76afdf36c" -vm-browserify@0.0.4, vm-browserify@~0.0.1: +vm-browserify@0.0.4: version "0.0.4" resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-0.0.4.tgz#5d7ea45bbef9e4a6ff65f95438e0a87c357d5a73" dependencies: indexof "0.0.1" +vm-browserify@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.0.tgz#bd76d6a23323e2ca8ffa12028dc04559c75f9019" + integrity sha512-iq+S7vZJE60yejDYM0ek6zg308+UZsdtPExWP9VZoCFCz1zkJoXFnAX7aZfd/ZwrkidzdUZL0C/ryW+JwAiIGw== + +vue-eslint-parser@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/vue-eslint-parser/-/vue-eslint-parser-2.0.3.tgz#c268c96c6d94cfe3d938a5f7593959b0ca3360d1" + integrity sha512-ZezcU71Owm84xVF6gfurBQUGg8WQ+WZGxgDEQu1IHFBZNx7BFZg3L1yHxrCBNNwbwFtE1GuvfJKMtb6Xuwc/Bw== + dependencies: + debug "^3.1.0" + eslint-scope "^3.7.1" + eslint-visitor-keys "^1.0.0" + espree "^3.5.2" + esquery "^1.0.0" + lodash "^4.17.4" + +w3c-hr-time@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.1.tgz#82ac2bff63d950ea9e3189a58a65625fedf19045" + integrity sha1-gqwr/2PZUOqeMYmlimViX+3xkEU= + dependencies: + browser-process-hrtime "^0.1.2" + walk@^2.3.9: version "2.3.9" resolved "https://registry.yarnpkg.com/walk/-/walk-2.3.9.tgz#31b4db6678f2ae01c39ea9fb8725a9031e558a7b" dependencies: foreachasync "^3.0.0" -walker@~1.0.5: +walker@^1.0.7, walker@~1.0.5: version "1.0.7" resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.7.tgz#2f7f9b8fd10d677262b18a884e28d19618e028fb" + integrity sha1-L3+bj9ENZ3JisYqITijRlhjgKPs= dependencies: makeerror "1.0.x" -watch@~0.10.0: - version "0.10.0" - resolved "https://registry.yarnpkg.com/watch/-/watch-0.10.0.tgz#77798b2da0f9910d595f1ace5b0c2258521f21dc" - -watchify-middleware@^1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/watchify-middleware/-/watchify-middleware-1.6.0.tgz#6db6e28f0279de1ca1209ae4f1a7f063745877c4" +watchify-middleware@^1.8.2: + version "1.8.2" + resolved "https://registry.yarnpkg.com/watchify-middleware/-/watchify-middleware-1.8.2.tgz#be84fd318049cc281f0a1da274410f9ba45a7c1e" + integrity sha512-A+x5K0mHVEK2WSLOEbazcXDFnSlralMZzk364Ea39F4xFl2jGl4VQLLN5HwrnRzpF5/Ggf1Q2he0HpJtflUiHg== dependencies: concat-stream "^1.5.0" debounce "^1.0.0" events "^1.0.2" object-assign "^4.0.1" strip-ansi "^3.0.0" - watchify "^3.3.1" + watchify "^3.11.1" -watchify@^3.3.1, watchify@^3.7.0: - version "3.7.0" - resolved "https://registry.yarnpkg.com/watchify/-/watchify-3.7.0.tgz#ee2f2c5c8c37312303f998b818b2b3450eefe648" +watchify@^3.11.1: + version "3.11.1" + resolved "https://registry.yarnpkg.com/watchify/-/watchify-3.11.1.tgz#8e4665871fff1ef64c0430d1a2c9d084d9721881" + integrity sha512-WwnUClyFNRMB2NIiHgJU9RQPQNqVeFk7OmZaWf5dC5EnNa0Mgr7imBydbaJ7tGTuPM2hz1Cb4uiBvK9NVxMfog== dependencies: - anymatch "^1.3.0" - browserify "^13.0.0" - chokidar "^1.0.0" + anymatch "^2.0.0" + browserify "^16.1.0" + chokidar "^2.1.1" defined "^1.0.0" outpipe "^1.1.0" through2 "^2.0.0" @@ -8352,9 +11533,10 @@ watchpack@^1.3.1: graceful-fs "^4.1.2" neo-async "^2.5.0" -webidl-conversions@^3.0.0, webidl-conversions@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" +webidl-conversions@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" + integrity sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg== webpack-sources@^1.0.1: version "1.1.0" @@ -8389,32 +11571,45 @@ webpack@^2.0.7-beta: webpack-sources "^1.0.1" yargs "^6.0.0" -websocket-driver@>=0.5.1: - version "0.6.5" - resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.6.5.tgz#5cb2556ceb85f4373c6d8238aa691c8454e13a36" +whatwg-encoding@^1.0.1, whatwg-encoding@^1.0.3: + version "1.0.5" + resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz#5abacf777c32166a51d085d6b4f3e7d27113ddb0" + integrity sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw== dependencies: - websocket-extensions ">=0.1.1" + iconv-lite "0.4.24" -websocket-extensions@>=0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.1.tgz#76899499c184b6ef754377c2dbb0cd6cb55d29e7" +whatwg-fetch@>=0.10.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.0.0.tgz#fc804e458cc460009b1a2b966bc8817d2578aefb" + integrity sha512-9GSJUgz1D4MfyKU7KRqwOjXCXTqWdFNvEr7eUBYchQiVc744mqK/MzXPNR2WsPkmkOa4ywfg8C2n8h+13Bey1Q== -whatwg-encoding@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.1.tgz#3c6c451a198ee7aec55b1ec61d0920c67801a5f4" - dependencies: - iconv-lite "0.4.13" +whatwg-mimetype@^2.1.0, whatwg-mimetype@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf" + integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g== -whatwg-fetch@>=0.10.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-1.0.0.tgz#01c2ac4df40e236aaa18480e3be74bd5c8eb798e" +whatwg-url@^6.4.1: + version "6.5.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-6.5.0.tgz#f2df02bff176fd65070df74ad5ccbb5a199965a8" + integrity sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ== + dependencies: + lodash.sortby "^4.7.0" + tr46 "^1.0.1" + webidl-conversions "^4.0.2" -whatwg-url@^4.1.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-4.1.1.tgz#567074923352de781e3500d64a86aa92a971b4a4" +whatwg-url@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-7.0.0.tgz#fde926fa54a599f3adf82dff25a9f7be02dc6edd" + integrity sha512-37GeVSIJ3kn1JgKyjiYNmSLP1yzbpb29jdmwBSgkD9h40/hyrR/OifpVUndji3tmwGgD8qpw7iQu3RSbCrBpsQ== dependencies: - tr46 "~0.0.3" - webidl-conversions "^3.0.0" + lodash.sortby "^4.7.0" + tr46 "^1.0.1" + webidl-conversions "^4.0.2" + +when@^3.7.7: + version "3.7.8" + resolved "https://registry.yarnpkg.com/when/-/when-3.7.8.tgz#c7130b6a7ea04693e842cdc9e7a1f2aa39a39f82" + integrity sha1-xxMLan6gRpPoQs3J56Hyqjmjn4I= whet.extend@~0.9.9: version "0.9.9" @@ -8424,11 +11619,17 @@ which-module@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f" -which@^1.0.5, which@^1.1.1, which@^1.2.4: - version "1.2.11" - resolved "https://registry.yarnpkg.com/which/-/which-1.2.11.tgz#c8b2eeea6b8c1659fa7c1dd4fdaabe9533dc5e8b" +which-module@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" + integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= + +which@^1.2.14, which@^1.2.9, which@^1.3.0, which@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== dependencies: - isexe "^1.1.1" + isexe "^2.0.0" wide-align@^1.1.0: version "1.1.0" @@ -8440,28 +11641,24 @@ window-size@0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d" -window-size@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.2.0.tgz#b4315bb4214a3d7058ebeee892e13fa24d98b075" - word-wrap@^1.0.3: - version "1.1.0" - resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.1.0.tgz#356153d61d10610d600785c5d701288e0ae764a6" + version "1.2.3" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" + integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== -wordwrap@0.0.2, wordwrap@~0.0.2: +wordwrap@0.0.2: version "0.0.2" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f" -wordwrap@^1.0.0, wordwrap@~1.0.0: +wordwrap@~0.0.2: + version "0.0.3" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" + integrity sha1-o9XabNXAvAAI03I0u68b7WMFkQc= + +wordwrap@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" - -worker-farm@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.3.1.tgz#4333112bb49b17aa050b87895ca6b2cacf40e5ff" - dependencies: - errno ">=0.1.1 <0.2.0-0" - xtend ">=4.0.0 <4.1.0-0" + integrity sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus= wrap-ansi@^2.0.0: version "2.0.0" @@ -8473,30 +11670,63 @@ wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" +write-file-atomic@2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.4.1.tgz#d0b05463c188ae804396fd5ab2a370062af87529" + integrity sha512-TGHFeZEZMnv+gBFRfjAcxL5bPHrsGKtnb4qsFAws7/vlh+QfwAaySIw4AXP9ZskTTh5GWu3FLuJhsWVdiJPGvg== + dependencies: + graceful-fs "^4.1.11" + imurmurhash "^0.1.4" + signal-exit "^3.0.2" + +write@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/write/-/write-1.0.3.tgz#0800e14523b923a387e415123c865616aae0f5c3" + integrity sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig== + dependencies: + mkdirp "^0.5.1" + write@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/write/-/write-0.2.1.tgz#5fc03828e264cea3fe91455476f7a3c566cb0757" + integrity sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c= dependencies: mkdirp "^0.5.1" -"xml-name-validator@>= 2.0.1 < 3.0.0": - version "2.0.1" - resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-2.0.1.tgz#4d8b8f1eccd3419aa362061becef515e1e559635" +ws@^1.1.1: + version "1.1.5" + resolved "https://registry.yarnpkg.com/ws/-/ws-1.1.5.tgz#cbd9e6e75e09fc5d2c90015f21f0c40875e0dd51" + integrity sha512-o3KqipXNUdS7wpQzBHSe180lBGO60SoK0yVo3CYJgb2MkobuWuBX6dhkYP5ORCLd55y+SaflMOV5fqAB53ux4w== + dependencies: + options ">=0.0.5" + ultron "1.0.x" -xml2js@0.4.15: - version "0.4.15" - resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.4.15.tgz#95cd03ff2dd144ec28bc6273bf2b2890c581ad0c" +ws@^5.2.0: + version "5.2.2" + resolved "https://registry.yarnpkg.com/ws/-/ws-5.2.2.tgz#dffef14866b8e8dc9133582514d1befaf96e980f" + integrity sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA== dependencies: - sax ">=0.6.0" - xmlbuilder ">=2.4.6" + async-limiter "~1.0.0" -xmlbuilder@2.6.2, xmlbuilder@>=2.4.6: - version "2.6.2" - resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-2.6.2.tgz#f916f6d10d45dc171b1be2e6e673fb6e0cc35d0a" +xml-name-validator@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" + integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw== + +xml2js@0.4.19: + version "0.4.19" + resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.4.19.tgz#686c20f213209e94abf0d1bcf1efaa291c7827a7" + integrity sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q== dependencies: - lodash "~3.5.0" + sax ">=0.6.0" + xmlbuilder "~9.0.1" -"xtend@>=4.0.0 <4.1.0-0", xtend@^4.0.0, xtend@^4.0.1, xtend@~4.0.0: +xmlbuilder@~9.0.1: + version "9.0.7" + resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-9.0.7.tgz#132ee63d2ec5565c557e20f4c22df9aca686b10d" + integrity sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0= + +"xtend@>=4.0.0 <4.1.0-0", xtend@^4.0.0, xtend@^4.0.1, xtend@~4.0.0, xtend@~4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" @@ -8504,44 +11734,88 @@ y18n@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" +"y18n@^3.2.1 || ^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" + integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w== + +yallist@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" + integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= + yallist@^3.0.0, yallist@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.2.tgz#8452b4bb7e83c7c188d8041c1a837c773d6d8bb9" -yamljs@^0.2.8: - version "0.2.8" - resolved "https://registry.yarnpkg.com/yamljs/-/yamljs-0.2.8.tgz#ef23fb006e62f6ae07b406aa2a949561f336ea5c" +yamljs@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/yamljs/-/yamljs-0.3.0.tgz#dc060bf267447b39f7304e9b2bfbe8b5a7ddb03b" + integrity sha512-C/FsVVhht4iPQYXOInoxUM/1ELSf9EsgKH34FofQOp6hwCPrW4vG4w5++TED3xRUo8gD7l0P1J1dLlDYzODsTQ== dependencies: argparse "^1.0.7" glob "^7.0.5" +yargs-parser@^11.1.1: + version "11.1.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-11.1.1.tgz#879a0865973bca9f6bab5cbdf3b1c67ec7d3bcf4" + integrity sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ== + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + yargs-parser@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-4.2.0.tgz#6ced869cd05a3dca6a1eaee38b68aeed4b0b4101" dependencies: camelcase "^3.0.0" -yargs@^6.0.0: - version "6.6.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-6.6.0.tgz#782ec21ef403345f830a808ca3d513af56065208" +yargs-parser@^8.0.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-8.1.0.tgz#f1376a33b6629a5d063782944da732631e966950" + integrity sha512-yP+6QqN8BmrgW2ggLtTbdrOyBNSI7zBa4IykmiV5R1wl1JWNxQvWhMfMdmzIYtKU7oP3OOInY/tl2ov3BDjnJQ== + dependencies: + camelcase "^4.1.0" + +yargs@10.0.3: + version "10.0.3" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-10.0.3.tgz#6542debd9080ad517ec5048fb454efe9e4d4aaae" + integrity sha512-DqBpQ8NAUX4GyPP/ijDGHsJya4tYqLQrjPr95HNsr1YwL3+daCfvBwg7+gIC6IdJhR2kATh3hb61vjzMWEtjdw== dependencies: - camelcase "^3.0.0" cliui "^3.2.0" decamelize "^1.1.1" + find-up "^2.1.0" get-caller-file "^1.0.1" - os-locale "^1.4.0" - read-pkg-up "^1.0.1" + os-locale "^2.0.0" require-directory "^2.1.1" require-main-filename "^1.0.1" set-blocking "^2.0.0" - string-width "^1.0.2" - which-module "^1.0.0" + string-width "^2.0.0" + which-module "^2.0.0" y18n "^3.2.1" - yargs-parser "^4.2.0" + yargs-parser "^8.0.0" -yargs@^6.3.0: - version "6.5.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-6.5.0.tgz#a902e23a1f0fe912b2a03f6131b7ed740c9718ff" +yargs@^12.0.2: + version "12.0.5" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-12.0.5.tgz#05f5997b609647b64f66b81e3b4b10a368e7ad13" + integrity sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw== + dependencies: + cliui "^4.0.0" + decamelize "^1.2.0" + find-up "^3.0.0" + get-caller-file "^1.0.1" + os-locale "^3.0.0" + require-directory "^2.1.1" + require-main-filename "^1.0.1" + set-blocking "^2.0.0" + string-width "^2.0.0" + which-module "^2.0.0" + y18n "^3.2.1 || ^4.0.0" + yargs-parser "^11.1.1" + +yargs@^6.0.0: + version "6.6.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-6.6.0.tgz#782ec21ef403345f830a808ca3d513af56065208" dependencies: camelcase "^3.0.0" cliui "^3.2.0" @@ -8554,7 +11828,6 @@ yargs@^6.3.0: set-blocking "^2.0.0" string-width "^1.0.2" which-module "^1.0.0" - window-size "^0.2.0" y18n "^3.2.1" yargs-parser "^4.2.0" From 4e7843f50f36948f4c1670e27169d9c9333d37fe Mon Sep 17 00:00:00 2001 From: Evan Siroky Date: Mon, 17 Jun 2019 14:52:45 -0700 Subject: [PATCH 16/18] fix: fix all linting errors --- lib/core/network.js | 4 ++-- lib/display/display.js | 1 - lib/graph/edge.js | 2 +- lib/graph/graph.js | 4 ++-- lib/labeler/labeler.js | 4 ++-- lib/labeler/pointlabel.js | 4 ++-- lib/labeler/segmentlabel.js | 8 ++++---- lib/point/multipoint.js | 9 ++++++--- lib/point/place.js | 1 - lib/point/stop.js | 6 +++--- lib/renderer/default-renderer.js | 4 ++-- lib/styler/styler.js | 30 +----------------------------- lib/styler/styles.js | 5 ++--- lib/transitive.js | 2 ++ 14 files changed, 29 insertions(+), 55 deletions(-) diff --git a/lib/core/network.js b/lib/core/network.js index 52922046..f0c0b353 100644 --- a/lib/core/network.js +++ b/lib/core/network.js @@ -1,5 +1,3 @@ -const debug = require('debug')('transitive:network') - import { forEach } from 'lodash' import Emitter from 'component-emitter' @@ -15,6 +13,8 @@ import Graph from '../graph/graph' import Polyline from '../util/polyline.js' import { sm } from '../util' +const debug = require('debug')('transitive:network') + /** * Network */ diff --git a/lib/display/display.js b/lib/display/display.js index e27a23bf..fb2edc1a 100644 --- a/lib/display/display.js +++ b/lib/display/display.js @@ -1,4 +1,3 @@ -//import { scaleLinear } from 'd3-scale' import LinearScale from '../util/linear-scale.js' export default class Display { diff --git a/lib/graph/edge.js b/lib/graph/edge.js index bb99ffdd..8cdc87ee 100644 --- a/lib/graph/edge.js +++ b/lib/graph/edge.js @@ -192,7 +192,7 @@ export default class Edge { y: this.fy + isect.u * this.fvy } } else { - // if not, adjust the two endpoint angles until they properly intersect + // if not, adjust the two endpoint angles until they properly intersect // default test: compare angle adjustments (if significant difference) if (Math.abs(fromAngleDelta - toAngleDelta) > 0.087) { diff --git a/lib/graph/graph.js b/lib/graph/graph.js index 64204e7d..e6d9858d 100644 --- a/lib/graph/graph.js +++ b/lib/graph/graph.js @@ -1,5 +1,3 @@ -var debug = require('debug')('transitive:graph') - import d3 from 'd3' import { forEach } from 'lodash' @@ -9,6 +7,8 @@ import Vertex from './vertex' import MultiPoint from '../point/multipoint' import { ccw, isOutwardVector, sm } from '../util' +var debug = require('debug')('transitive:graph') + /** * A graph representing the underlying 'wireframe' network */ diff --git a/lib/labeler/labeler.js b/lib/labeler/labeler.js index cc5fedb5..dc58ffde 100644 --- a/lib/labeler/labeler.js +++ b/lib/labeler/labeler.js @@ -165,7 +165,7 @@ export default class Labeler { var styler = this.transitive.styler const placedLabels = [] - //var labeledPoints = [] + // var labeledPoints = [] forEach(this.points, point => { var labelText = point.label.getText() @@ -211,7 +211,7 @@ export default class Labeler { // if we reach this point, the label is good to place point.label.setVisibility(true) - //labeledPoints.push(point) + // labeledPoints.push(point) placedLabels.push(point.label) this.quadtree.add([labelBBox.x + labelBBox.width / 2, labelBBox.y + diff --git a/lib/labeler/pointlabel.js b/lib/labeler/pointlabel.js index 8afce360..41daec68 100644 --- a/lib/labeler/pointlabel.js +++ b/lib/labeler/pointlabel.js @@ -16,7 +16,7 @@ export default class PointLabel extends Label { return this.parent.getName() } - /*render (display) { + /* render (display) { this.svgGroup = display.svg.append('g') // this.parent.labelSvg; this.svgGroup .attr('class', 'transitive-sortable') @@ -54,7 +54,7 @@ export default class PointLabel extends Label { .attr('transform', (d, i) => { return 'rotate(' + this.labelAngle + ', 0, 0)' }) - }*/ + } */ render (display) { const text = this.getText() diff --git a/lib/labeler/segmentlabel.js b/lib/labeler/segmentlabel.js index c21cdb78..da99f6d6 100644 --- a/lib/labeler/segmentlabel.js +++ b/lib/labeler/segmentlabel.js @@ -32,7 +32,7 @@ export default class SegmentLabel extends Label { } refresh (display) { - /*if (!this.labelAnchor) return + /* if (!this.labelAnchor) return if (!this.svgGroup) this.render(display) @@ -41,7 +41,7 @@ export default class SegmentLabel extends Label { var tx = (this.labelAnchor.x - this.containerWidth / 2) var ty = (this.labelAnchor.y - this.containerHeight / 2) return 'translate(' + tx + ',' + ty + ')' - })*/ + }) */ } getPadding () { @@ -73,11 +73,11 @@ export default class SegmentLabel extends Label { return false } - /*clear () { + /* clear () { this.labelAnchor = null if (this.svgGroup) { this.svgGroup.remove() this.svgGroup = null } - }*/ + } */ } diff --git a/lib/point/multipoint.js b/lib/point/multipoint.js index e8a0860c..5b4b15d5 100644 --- a/lib/point/multipoint.js +++ b/lib/point/multipoint.js @@ -213,10 +213,13 @@ export default class MultiPoint extends Point { runFocusTransition (display, callback) { if (this.mergedMarker) { - var newStrokeColor = display.styler.compute(display.styler.multipoints_merged - .stroke, display, { + var newStrokeColor = display.styler.compute( + display.styler.multipoints_merged.stroke, + display, + { owner: this - }) + } + ) this.mergedMarker.transition().style('stroke', newStrokeColor).call( callback) } diff --git a/lib/point/place.js b/lib/point/place.js index be134965..d8addcff 100644 --- a/lib/point/place.js +++ b/lib/point/place.js @@ -99,7 +99,6 @@ export default class Place extends Point { const styler = display.styler if (!this.renderData) return - var displayStyle = styler.compute2('places', 'display', this) if (displayStyle === 'none') return diff --git a/lib/point/stop.js b/lib/point/stop.js index 3c61c48f..1dc074ad 100644 --- a/lib/point/stop.js +++ b/lib/point/stop.js @@ -182,8 +182,8 @@ export default class Stop extends Point { // TODO: Restore inline stop if (!this.isSegmentEndPoint) { - const renderDataArray = this.getRenderDataArray() - /*for (let renderData of renderDataArray) { + /* const renderDataArray = this.getRenderDataArray() + for (let renderData of renderDataArray) { display.drawCircle({ x: renderData.x, y: renderData.y @@ -191,7 +191,7 @@ export default class Stop extends Point { fill: '#fff', r: renderData.rEdge.lineWidth * 0.4 }) - }*/ + } */ } } diff --git a/lib/renderer/default-renderer.js b/lib/renderer/default-renderer.js index c5c98fcc..e0fac31a 100644 --- a/lib/renderer/default-renderer.js +++ b/lib/renderer/default-renderer.js @@ -58,11 +58,11 @@ export default class DefaultRenderer extends Renderer { forEach(focusedPoints, pt => pt.render(display)) // TODO: draw the edge-based points - /*forEach(network.graph.edges, edge => { + /* forEach(network.graph.edges, edge => { forEach(edge.pointArray, point => { point.render(display) }) - })*/ + }) */ // 5. Labels const labels = this.transitive.labeler.doLayout() diff --git a/lib/styler/styler.js b/lib/styler/styler.js index 7caf96ee..07eb5d15 100644 --- a/lib/styler/styler.js +++ b/lib/styler/styler.js @@ -25,39 +25,13 @@ var types = [ 'wireframe_edges' ] -/** - * SVG attributes - */ - -var svgAttributes = [ - 'height', - 'target', - 'title', - 'width', - 'y1', - 'y2', - 'x1', - 'x2', - 'cx', - 'cy', - 'dx', - 'dy', - 'rx', - 'ry', - 'd', - 'r', - 'y', - 'x', - 'transform' -] - /** * Styler object */ export default class Styler { constructor (styles, transitive) { - //if (!(this instanceof Styler)) return new Styler(styles) + // if (!(this instanceof Styler)) return new Styler(styles) this.transitive = transitive // reset styles @@ -108,7 +82,6 @@ export default class Styler { } } - /** * Compute a style rule based on the current display and data * @@ -144,7 +117,6 @@ export default class Styler { return computed } - /** * Return the collection of default segment styles for a mode. * diff --git a/lib/styler/styles.js b/lib/styler/styles.js index a9c3405f..14a9f597 100644 --- a/lib/styler/styles.js +++ b/lib/styler/styles.js @@ -172,10 +172,10 @@ const multipointsPattern = Object.assign({}, stopsPattern) const labels = { 'font-size': 15, 'font-family': 'sans-serif', - /*'font-weight': function (display, data, index, utils) { + /* 'font-weight': function (display, data, index, utils) { var point = data.owner.parent if (point.containsBoardPoint() || point.containsAlightPoint()) return 'bold' - },*/ + }, */ /** * 'orientations' is a transitive-specific attribute used to specify allowable @@ -202,7 +202,6 @@ const labels = { ] } - const segmentLabels = { 'font-size': 15, 'font-family': 'sans-serif', diff --git a/lib/transitive.js b/lib/transitive.js index 74716bbd..9182a149 100644 --- a/lib/transitive.js +++ b/lib/transitive.js @@ -1,3 +1,5 @@ +/* globals Display */ + import d3 from 'd3' import Emitter from 'component-emitter' From ced261d0067045d58604cddbcaad09001794b4d8 Mon Sep 17 00:00:00 2001 From: Evan Siroky Date: Mon, 17 Jun 2019 14:59:24 -0700 Subject: [PATCH 17/18] ci: update to latest semantic-release --- .travis.yml | 11 +- package.json | 2 +- yarn.lock | 3152 ++++++++++++++++++++++++++++++++++++++++---------- 3 files changed, 2549 insertions(+), 616 deletions(-) diff --git a/.travis.yml b/.travis.yml index 5745e77d..be33a82d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,22 +1,19 @@ sudo: false language: node_js cache: - directories: - - ~/.yarn-cache + yarn: true notifications: email: false node_js: - - '6' -before_install: - - npm i -g yarn codecov + - '10' install: - yarn script: - npm run lint - npm run cover - - codecov after_success: - - yarn run semantic-release + - bash <(curl -s https://codecov.io/bash) + - semantic-release branches: except: - /^v\d+\.\d+\.\d+$/ diff --git a/package.json b/package.json index 71082c20..2d1bfd8d 100644 --- a/package.json +++ b/package.json @@ -38,7 +38,7 @@ }, "devDependencies": { "mastarm": "^5.0.1", - "semantic-release": "^6.3.2" + "semantic-release": "^15.13.16" }, "standard": { "parser": "babel-eslint" diff --git a/yarn.lock b/yarn.lock index 2f9db037..8b3ec060 100644 --- a/yarn.lock +++ b/yarn.lock @@ -915,38 +915,140 @@ "@types/istanbul-reports" "^1.1.1" "@types/yargs" "^12.0.9" -"@semantic-release/commit-analyzer@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@semantic-release/commit-analyzer/-/commit-analyzer-2.0.0.tgz#924d1e2c30167c6a472bed9f66ee8f8e077489b2" - dependencies: - conventional-changelog "0.0.17" - -"@semantic-release/condition-travis@^5.0.2": - version "5.0.2" - resolved "https://registry.yarnpkg.com/@semantic-release/condition-travis/-/condition-travis-5.0.2.tgz#f4bb777a6c6db5565d70754a9b629233bd4a6597" +"@mrmlnc/readdir-enhanced@^2.2.1": + version "2.2.1" + resolved "https://registry.yarnpkg.com/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz#524af240d1a360527b730475ecfa1344aa540dde" + integrity sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g== dependencies: - "@semantic-release/error" "^1.0.0" - semver "^5.0.3" - travis-deploy-once "1.0.0-node-0.10-support" + call-me-maybe "^1.0.1" + glob-to-regexp "^0.3.0" -"@semantic-release/error@^1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@semantic-release/error/-/error-1.0.0.tgz#bb8f8eeedd5c7f8c46f96b37ef39e1b8c376c1cc" +"@nodelib/fs.stat@^1.1.2": + version "1.1.3" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz#2b5a3ab3f918cca48a8c754c08168e3f03eba61b" + integrity sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw== -"@semantic-release/last-release-npm@^1.2.1": - version "1.2.1" - resolved "https://registry.yarnpkg.com/@semantic-release/last-release-npm/-/last-release-npm-1.2.1.tgz#ff748142ecf15354b833a86ba18205f7fce594ee" +"@octokit/endpoint@^5.1.0": + version "5.1.7" + resolved "https://registry.yarnpkg.com/@octokit/endpoint/-/endpoint-5.1.7.tgz#cfbd473a6adf5fea747520972e1af676406f7c26" + integrity sha512-MfsXHx9z9EPxLYSf7PYuzWvVZTotx+/QTFk7UMp4Fv83k3QrvmovEjP0pl141g+Uq/w9CcDuuXhsiq4X3oxVsA== dependencies: - "@semantic-release/error" "^1.0.0" - npm-registry-client "^7.0.1" - npmlog "^1.2.1" + deepmerge "3.2.1" + is-plain-object "^3.0.0" + universal-user-agent "^2.1.0" + url-template "^2.0.8" -"@semantic-release/release-notes-generator@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@semantic-release/release-notes-generator/-/release-notes-generator-2.0.0.tgz#7c5da65689466d536a53fdfa9f4d62a3bd13c16e" +"@octokit/request-error@^1.0.1", "@octokit/request-error@^1.0.2": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@octokit/request-error/-/request-error-1.0.4.tgz#15e1dc22123ba4a9a4391914d80ec1e5303a23be" + integrity sha512-L4JaJDXn8SGT+5G0uX79rZLv0MNJmfGa4vb4vy1NnpjSnWDLJRy6m90udGwvMmavwsStgbv2QNkPzzTCMmL+ig== dependencies: - conventional-changelog "0.0.17" - github-url-from-git "^1.4.0" + deprecation "^2.0.0" + once "^1.4.0" + +"@octokit/request@^4.0.1": + version "4.1.1" + resolved "https://registry.yarnpkg.com/@octokit/request/-/request-4.1.1.tgz#614262214f48417b4d3b14e047d09a9c8e2f7a09" + integrity sha512-LOyL0i3oxRo418EXRSJNk/3Q4I0/NKawTn6H/CQp+wnrG1UFLGu080gSsgnWobhPo5BpUNgSQ5BRk5FOOJhD1Q== + dependencies: + "@octokit/endpoint" "^5.1.0" + "@octokit/request-error" "^1.0.1" + deprecation "^2.0.0" + is-plain-object "^3.0.0" + node-fetch "^2.3.0" + once "^1.4.0" + universal-user-agent "^2.1.0" + +"@octokit/rest@^16.27.0": + version "16.28.2" + resolved "https://registry.yarnpkg.com/@octokit/rest/-/rest-16.28.2.tgz#3fc3b8700046ab29ab1e2a4bdf49f89e94f7ba27" + integrity sha512-csuYiHvJ1P/GFDadVn0QhwO83R1+YREjcwCY7ZIezB6aJTRIEidJZj+R7gAkUhT687cqYb4cXTZsDVu9F+Fmug== + dependencies: + "@octokit/request" "^4.0.1" + "@octokit/request-error" "^1.0.2" + atob-lite "^2.0.0" + before-after-hook "^1.4.0" + btoa-lite "^1.0.0" + deprecation "^2.0.0" + lodash.get "^4.4.2" + lodash.set "^4.3.2" + lodash.uniq "^4.5.0" + octokit-pagination-methods "^1.1.0" + once "^1.4.0" + universal-user-agent "^2.0.0" + url-template "^2.0.8" + +"@semantic-release/commit-analyzer@^6.1.0": + version "6.2.0" + resolved "https://registry.yarnpkg.com/@semantic-release/commit-analyzer/-/commit-analyzer-6.2.0.tgz#5cd25ce67ba9ba5b46e47457505e63629e186695" + integrity sha512-oUtPydYcbtJsEY6WCPi4wynTgRecK5zCkKaGmHi+9Xl7d6jGf7LomnJCg++6dNF1tyavrbGMSdXTCPH6Dx9LbA== + dependencies: + conventional-changelog-angular "^5.0.0" + conventional-commits-filter "^2.0.0" + conventional-commits-parser "^3.0.0" + debug "^4.0.0" + import-from "^3.0.0" + lodash "^4.17.4" + +"@semantic-release/error@^2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@semantic-release/error/-/error-2.2.0.tgz#ee9d5a09c9969eade1ec864776aeda5c5cddbbf0" + integrity sha512-9Tj/qn+y2j+sjCI3Jd+qseGtHjOAeg7dU2/lVcqIQ9TV3QDaDXDYXcoOHU+7o2Hwh8L8ymL4gfuO7KxDs3q2zg== + +"@semantic-release/github@^5.1.0": + version "5.4.0" + resolved "https://registry.yarnpkg.com/@semantic-release/github/-/github-5.4.0.tgz#b170d1ceb3f682604cb4a2aff39bf5906159c91d" + integrity sha512-qtaV/8xIu2a8jt6lACFps0gVDfJby1h7Ra5On3VF60PkrKft87ru9sywAl9gtTfSfOyUlFaNCNlf3mvDaekpzQ== + dependencies: + "@octokit/rest" "^16.27.0" + "@semantic-release/error" "^2.2.0" + aggregate-error "^3.0.0" + bottleneck "^2.18.1" + debug "^4.0.0" + dir-glob "^2.0.0" + fs-extra "^8.0.0" + globby "^9.0.0" + http-proxy-agent "^2.1.0" + https-proxy-agent "^2.2.1" + issue-parser "^4.0.0" + lodash "^4.17.4" + mime "^2.4.3" + p-filter "^2.0.0" + p-retry "^4.0.0" + parse-github-url "^1.0.1" + url-join "^4.0.0" + +"@semantic-release/npm@^5.0.5": + version "5.1.9" + resolved "https://registry.yarnpkg.com/@semantic-release/npm/-/npm-5.1.9.tgz#30d775433c91f32d7365382574aeda3b1422a5df" + integrity sha512-Hcwhiu7zC0hD0ZPTkEE5bsK9l0z7Ou+N/mcSpYT1kq96ETMQtyZee0gjxXiAGaIHJ7wlMuUhHbYp7iAaI1965w== + dependencies: + "@semantic-release/error" "^2.2.0" + aggregate-error "^3.0.0" + execa "^1.0.0" + fs-extra "^8.0.0" + lodash "^4.17.4" + nerf-dart "^1.0.0" + normalize-url "^4.0.0" + npm "^6.8.0" + rc "^1.2.8" + read-pkg "^5.0.0" + registry-auth-token "^3.3.1" + +"@semantic-release/release-notes-generator@^7.1.2": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@semantic-release/release-notes-generator/-/release-notes-generator-7.2.0.tgz#d09f9f97a0f33149411c36843d1378d3c290ada8" + integrity sha512-CQAN6ViNL27p0TivCabpuDSjLl9eaP5yHRwSVYLLGg6RXu972PFk3DqOKuMQHsyDAx7wze2vU8qESt6/Mt6AuQ== + dependencies: + conventional-changelog-angular "^5.0.0" + conventional-changelog-writer "^4.0.0" + conventional-commits-filter "^2.0.0" + conventional-commits-parser "^3.0.0" + debug "^4.0.0" + get-stream "^5.0.0" + import-from "^3.0.0" + into-stream "^5.0.0" + lodash "^4.17.4" "@types/babel__core@^7.1.0": version "7.1.2" @@ -981,6 +1083,20 @@ dependencies: "@babel/types" "^7.3.0" +"@types/events@*": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@types/events/-/events-3.0.0.tgz#2862f3f58a9a7f7c3e78d79f130dd4d71c25c2a7" + integrity sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g== + +"@types/glob@^7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.1.tgz#aa59a1c6e3fbc421e07ccd31a944c30eba521575" + integrity sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w== + dependencies: + "@types/events" "*" + "@types/minimatch" "*" + "@types/node" "*" + "@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0": version "2.0.1" resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.1.tgz#42995b446db9a48a11a07ec083499a860e9138ff" @@ -1001,11 +1117,31 @@ "@types/istanbul-lib-coverage" "*" "@types/istanbul-lib-report" "*" +"@types/minimatch@*": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d" + integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA== + +"@types/node@*": + version "12.0.8" + resolved "https://registry.yarnpkg.com/@types/node/-/node-12.0.8.tgz#551466be11b2adc3f3d47156758f610bd9f6b1d8" + integrity sha512-b8bbUOTwzIY3V5vDTY1fIJ+ePKDUBqt2hC2woVGotdQQhG/2Sh62HOKHrT7ab+VerXAcPyAiTEipPu/FsreUtg== + +"@types/normalize-package-data@^2.4.0": + version "2.4.0" + resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz#e486d0d97396d79beedd0a6e33f4534ff6b4973e" + integrity sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA== + "@types/q@^1.5.1": version "1.5.2" resolved "https://registry.yarnpkg.com/@types/q/-/q-1.5.2.tgz#690a1475b84f2a884fd07cd797c00f5f31356ea8" integrity sha512-ce5d3q03Ex0sy4R14722Rmt6MT07Ua+k4FwDfdcToYJcMKNtRVQvJ6JCAPdAmAnbRb6CsX6aYb9m96NGod9uTw== +"@types/retry@^0.12.0": + version "0.12.0" + resolved "https://registry.yarnpkg.com/@types/retry/-/retry-0.12.0.tgz#2b35eccfcee7d38cd72ad99232fbd58bffb3c84d" + integrity sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA== + "@types/stack-utils@^1.0.1": version "1.0.1" resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-1.0.1.tgz#0a851d3bd96498fa25c33ab7278ed3bd65f06c3e" @@ -1016,7 +1152,7 @@ resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-12.0.12.tgz#45dd1d0638e8c8f153e87d296907659296873916" integrity sha512-SOhuU4wNBxhhTHxYaiG5NY4HBhDIDnJF60GU+2LqHAdKKer86//e4yg69aENCtQ04n0ovz+tq2YPME5t5yp4pw== -JSONStream@^1.0.3: +JSONStream@^1.0.3, JSONStream@^1.0.4, JSONStream@^1.3.4, JSONStream@^1.3.5: version "1.3.5" resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.5.tgz#3208c1f08d3a4d99261ab64f92302bc15e111ca0" integrity sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ== @@ -1033,6 +1169,11 @@ abbrev@1: version "1.0.9" resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.0.9.tgz#91b4792588a7738c25f35dd6f63752a2f8776135" +abbrev@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" + integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== + acorn-dynamic-import@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/acorn-dynamic-import/-/acorn-dynamic-import-2.0.2.tgz#c752bd210bef679501b6c6cb7fc84f8f47158cc4" @@ -1102,12 +1243,34 @@ acorn@^6.0.1, acorn@^6.0.7, acorn@^6.1.1: resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.1.1.tgz#7d25ae05bb8ad1f9b699108e1094ecd7884adc1f" integrity sha512-jPTiwtOxaHNaAPg/dmrJ/beuzLRnXtB0kQPQ8JpotKJgTB6rX6c8mlf315941pyjBSaPg8NHXS9fhP4u17DpGA== -agent-base@2: - version "2.0.1" - resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-2.0.1.tgz#bd8f9e86a8eb221fffa07bd14befd55df142815e" +agent-base@4, agent-base@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-4.3.0.tgz#8165f01c436009bccad0b1d122f05ed770efc6ee" + integrity sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg== dependencies: - extend "~3.0.0" - semver "~5.0.1" + es6-promisify "^5.0.0" + +agent-base@~4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-4.2.1.tgz#d89e5999f797875674c07d87f260fc41e83e8ca9" + integrity sha512-JVwXMr9nHYTUXsBFKUqhJwvlcYU/blreOEUkhNR2eXZIvwd+c+o5V4MgDPKWnMS/56awN3TRzIP+KoPn+roQtg== + dependencies: + es6-promisify "^5.0.0" + +agentkeepalive@^3.4.1: + version "3.5.2" + resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-3.5.2.tgz#a113924dd3fa24a0bc3b78108c450c2abee00f67" + integrity sha512-e0L/HNe6qkQ7H19kTlRRqUibEAwDK5AFk6y3PtMsuut2VAH6+Q4xZml1tNDJD7kSAyqmbG/K08K5WEJYtUrSlQ== + dependencies: + humanize-ms "^1.2.1" + +aggregate-error@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.0.0.tgz#5b5a3c95e9095f311c9ab16c19fb4f3527cd3f79" + integrity sha512-yKD9kEoJIR+2IFqhMwayIBgheLYbB3PS2OBhWae1L/ODTd/JF/30cW0bc9TqzRL3k4U41Dieu3BF4I29p8xesA== + dependencies: + clean-stack "^2.0.0" + indent-string "^3.2.0" ajv-keywords@^1.1.1: version "1.5.1" @@ -1157,7 +1320,14 @@ alphanum-sort@^1.0.0, alphanum-sort@^1.0.1, alphanum-sort@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3" -ansi-escapes@^3.0.0, ansi-escapes@^3.2.0: +ansi-align@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-2.0.0.tgz#c36aeccba563b89ceb556f3690f0b1d9e3547f7f" + integrity sha1-w2rsy6VjuJzrVW82kPCx2eNUf38= + dependencies: + string-width "^2.0.0" + +ansi-escapes@^3.0.0, ansi-escapes@^3.1.0, ansi-escapes@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== @@ -1201,9 +1371,15 @@ ansi-styles@^3.1.0, ansi-styles@^3.2.0, ansi-styles@^3.2.1: dependencies: color-convert "^1.9.0" -ansi@^0.3.0, ansi@~0.3.0: - version "0.3.1" - resolved "https://registry.yarnpkg.com/ansi/-/ansi-0.3.1.tgz#0c42d4fb17160d5a9af1e484bace1c66922c1b21" +ansicolors@~0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/ansicolors/-/ansicolors-0.3.2.tgz#665597de86a9ffe3aa9bfbe6cae5c6ea426b4979" + integrity sha1-ZlWX3oap/+Oqm/vmyuXG6kJrSXk= + +ansistyles@~0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/ansistyles/-/ansistyles-0.1.3.tgz#5de60415bda071bb37127854c864f41b23254539" + integrity sha1-XeYEFb2gcbs3EnhUyGT0GyMlRTk= anymatch@^1.3.0: version "1.3.0" @@ -1223,12 +1399,20 @@ aproba@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.0.4.tgz#2713680775e7614c8ba186c065d4e2e52d1072c0" -are-we-there-yet@~1.0.0: - version "1.0.6" - resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.0.6.tgz#a2d28c93102aa6cc96245a26cb954de06ec53f0c" - dependencies: - delegates "^1.0.0" - readable-stream "^2.0.0 || ^1.1.13" +aproba@^1.1.1, aproba@^1.1.2: + version "1.2.0" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" + integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== + +"aproba@^1.1.2 || 2", aproba@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-2.0.0.tgz#52520b8ae5b569215b354efc0caa3fe1e45a8adc" + integrity sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ== + +archy@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/archy/-/archy-1.0.0.tgz#f9c8c13757cc1dd7bc379ac77b2c62a5c2868c40" + integrity sha1-+cjBN1fMHde8N5rHeyxipcKGjEA= are-we-there-yet@~1.1.2: version "1.1.2" @@ -1251,6 +1435,11 @@ argparse@~0.1.15: underscore "~1.7.0" underscore.string "~2.4.0" +argv-formatter@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/argv-formatter/-/argv-formatter-1.0.0.tgz#a0ca0cbc29a5b73e836eebe1cbf6c5e0e4eb82f9" + integrity sha1-oMoMvCmltz6Dbuvhy/bF4OTrgvk= + aria-query@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-3.0.0.tgz#65b3fcc1ca1155a8c9ae64d6eee297f15d5133cc" @@ -1295,6 +1484,11 @@ array-find-index@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" +array-ify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/array-ify/-/array-ify-1.0.0.tgz#9e528762b4a9066ad163a6962a364418e9626ece" + integrity sha1-nlKHYrSpBmrRY6aWKjZEGOlibs4= + array-includes@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.0.3.tgz#184b48f62d92d7452bb31b323165c7f8bd02266d" @@ -1313,6 +1507,23 @@ array-reduce@~0.0.0: resolved "https://registry.yarnpkg.com/array-reduce/-/array-reduce-0.0.0.tgz#173899d3ffd1c7d9383e4479525dbe278cab5f2b" integrity sha1-FziZ0//Rx9k4PkR5Ul2+J4yrXys= +array-union@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" + integrity sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk= + dependencies: + array-uniq "^1.0.1" + +array-uniq@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" + integrity sha1-r2rId6Jcx/dOBYiUdThY39sk/bY= + +array-uniq@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-2.1.0.tgz#46603d5e28e79bfd02b046fcc1d77c6820bd8e98" + integrity sha512-bdHxtev7FN6+MXI1YFW0Q8mQ8dTJc2S8AMfju+ZR77pbg2yAdVyDlwkaUI7Har0LyOMRFPHrJ9lYdyjZZswdlQ== + array-unique@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" @@ -1391,12 +1602,6 @@ async-limiter@~1.0.0: resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.0.tgz#78faed8c3d074ab81f22b4e985d79e8738f720f8" integrity sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg== -async@^2.0.1: - version "2.1.4" - resolved "https://registry.yarnpkg.com/async/-/async-2.1.4.tgz#2d2160c7788032e4dd6cbe2502f1f9a2c8f6cde4" - dependencies: - lodash "^4.14.0" - async@^2.1.2: version "2.6.1" resolved "https://registry.yarnpkg.com/async/-/async-2.6.1.tgz#b245a23ca71930044ec53fa46aa00a3e87c6a610" @@ -1407,6 +1612,11 @@ asynckit@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" +atob-lite@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/atob-lite/-/atob-lite-2.0.0.tgz#0fef5ad46f1bd7a8502c65727f0367d5ee43d696" + integrity sha1-D+9a1G8b16hQLGVyfwNn1e5D1pY= + atob@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.1.tgz#ae2d5a729477f289d60dd7f96a6314a22dd6c22a" @@ -2086,14 +2296,6 @@ babel-plugin-transform-strict-mode@^6.24.1: babel-runtime "^6.22.0" babel-types "^6.24.1" -babel-polyfill@^6.16.0: - version "6.20.0" - resolved "https://registry.yarnpkg.com/babel-polyfill/-/babel-polyfill-6.20.0.tgz#de4a371006139e20990aac0be367d398331204e7" - dependencies: - babel-runtime "^6.20.0" - core-js "^2.4.0" - regenerator-runtime "^0.10.0" - babel-polyfill@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-polyfill/-/babel-polyfill-6.26.0.tgz#379937abc67d7895970adc621f284cd966cf2153" @@ -2292,29 +2494,40 @@ bcrypt-pbkdf@^1.0.0: dependencies: tweetnacl "^0.14.3" +before-after-hook@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/before-after-hook/-/before-after-hook-1.4.0.tgz#2b6bf23dca4f32e628fd2747c10a37c74a4b484d" + integrity sha512-l5r9ir56nda3qu14nAXIlyq1MmUSs0meCIaFAh8HwkFwP1F8eToOuS3ah2VAHHcY04jaYD7FpJC5JTXHYRbkzg== + big.js@^3.1.3: version "3.2.0" resolved "https://registry.yarnpkg.com/big.js/-/big.js-3.2.0.tgz#a5fc298b81b9e0dca2e458824784b65c52ba588e" +bin-links@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/bin-links/-/bin-links-1.1.2.tgz#fb74bd54bae6b7befc6c6221f25322ac830d9757" + integrity sha512-8eEHVgYP03nILphilltWjeIjMbKyJo3wvp9K816pHbhP301ismzw15mxAAEVQ/USUwcP++1uNrbERbp8lOA6Fg== + dependencies: + bluebird "^3.5.0" + cmd-shim "^2.0.2" + gentle-fs "^2.0.0" + graceful-fs "^4.1.11" + write-file-atomic "^2.3.0" + binary-extensions@^1.0.0: version "1.7.0" resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.7.0.tgz#6c1610db163abfb34edfe42fa423343a1e01185d" -bl@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/bl/-/bl-1.1.2.tgz#fdca871a99713aa00d19e3bbba41c44787a65398" - dependencies: - readable-stream "~2.0.5" - block-stream@*: version "0.0.9" resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a" dependencies: inherits "~2.0.0" -bluebird@^3.4.1, bluebird@^3.4.6: - version "3.4.6" - resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.4.6.tgz#01da8d821d87813d158967e743d5fe6c62cf8c0f" +bluebird@^3.5.0, bluebird@^3.5.1, bluebird@^3.5.3, bluebird@^3.5.5: + version "3.5.5" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.5.tgz#a8d0afd73251effbbd5fe384a77d73003c17a71f" + integrity sha512-5am6HnnfN+urzt4yfg7IgTbotDjIT/u8AJpEt0sIU9FtXfVeezXAPKswrG+xKUCOYAINpSdgZVDU6QFh+cuH3w== bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0: version "4.11.6" @@ -2345,6 +2558,24 @@ boom@2.x.x: dependencies: hoek "2.x.x" +bottleneck@^2.18.1: + version "2.19.1" + resolved "https://registry.yarnpkg.com/bottleneck/-/bottleneck-2.19.1.tgz#f7657aed83edff1fa41d438cdbdf3e0931a1d3f0" + integrity sha512-TrdmthuOG5SpYfFQTprSQOtqQUTreAgPkCFfow/aVOnryRRpIwiwfiQmmJUiiHUKgPV7LBNlfGecJ5hCVs30gw== + +boxen@^1.2.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/boxen/-/boxen-1.3.0.tgz#55c6c39a8ba58d9c61ad22cd877532deb665a20b" + integrity sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw== + dependencies: + ansi-align "^2.0.0" + camelcase "^4.0.0" + chalk "^2.0.1" + cli-boxes "^1.0.0" + string-width "^2.0.0" + term-size "^1.2.0" + widest-line "^2.0.0" + brace-expansion@^1.0.0: version "1.1.6" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.6.tgz#7197d7eaa9b87e648390ea61fc66c84427420df9" @@ -2549,6 +2780,11 @@ bser@^2.0.0: dependencies: node-int64 "^0.4.0" +btoa-lite@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/btoa-lite/-/btoa-lite-1.0.0.tgz#337766da15801210fdd956c22e9c6891ab9d0337" + integrity sha1-M3dm2hWAEhD92VbCLpxokaudAzc= + budo@^11.6.1: version "11.6.2" resolved "https://registry.yarnpkg.com/budo/-/budo-11.6.2.tgz#0f26fc3db54fe4ab9561a0387bf34ae2a617c7e6" @@ -2622,6 +2858,41 @@ builtin-status-codes@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" +builtins@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/builtins/-/builtins-1.0.3.tgz#cb94faeb61c8696451db36534e1422f94f0aee88" + integrity sha1-y5T662HIaWRR2zZTThQi+U8K7og= + +byline@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/byline/-/byline-5.0.0.tgz#741c5216468eadc457b03410118ad77de8c1ddb1" + integrity sha1-dBxSFkaOrcRXsDQQEYrXfejB3bE= + +byte-size@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/byte-size/-/byte-size-5.0.1.tgz#4b651039a5ecd96767e71a3d7ed380e48bed4191" + integrity sha512-/XuKeqWocKsYa/cBY1YbSJSWWqTi4cFgr9S6OyM7PBaPbr9zvNGwWP33vt0uqGhwDdN+y3yhbXVILEUpnwEWGw== + +cacache@^11.0.1, cacache@^11.3.2: + version "11.3.3" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-11.3.3.tgz#8bd29df8c6a718a6ebd2d010da4d7972ae3bbadc" + integrity sha512-p8WcneCytvzPxhDvYp31PD039vi77I12W+/KfR9S8AZbaiARFBCpsPJS+9uhWfeBfeAtW7o/4vt3MUqLkbY6nA== + dependencies: + bluebird "^3.5.5" + chownr "^1.1.1" + figgy-pudding "^3.5.1" + glob "^7.1.4" + graceful-fs "^4.1.15" + lru-cache "^5.1.1" + mississippi "^3.0.0" + mkdirp "^0.5.1" + move-concurrently "^1.0.1" + promise-inflight "^1.0.1" + rimraf "^2.6.3" + ssri "^6.0.1" + unique-filename "^1.1.1" + y18n "^4.0.0" + cache-base@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" @@ -2646,6 +2917,16 @@ cachedir@2.1.0: resolved "https://registry.yarnpkg.com/cachedir/-/cachedir-2.1.0.tgz#b448c32b44cd9c0cd6ce4c419fa5b3c112c02191" integrity sha512-xGBpPqoBvn3unBW7oxgb8aJn42K0m9m1/wyjmazah10Fq7bROGG3kRAE6OIyr3U3PIJUqGuebhCEdMk9OKJG0A== +call-limit@~1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/call-limit/-/call-limit-1.1.1.tgz#ef15f2670db3f1992557e2d965abc459e6e358d4" + integrity sha512-5twvci5b9eRBw2wCfPtN0GmlR2/gadZqyFpPhOK6CvMFoFgA+USnZ6Jpu1lhG9h85pQ3Ouil3PfXWRD4EUaRiQ== + +call-me-maybe@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/call-me-maybe/-/call-me-maybe-1.0.1.tgz#26d208ea89e37b5cbde60250a15f031c16a4d66b" + integrity sha1-JtII6onje1y95gJQoV8DHBak1ms= + caller-callsite@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/caller-callsite/-/caller-callsite-2.0.0.tgz#847e0fce0a223750a9a027c54b33731ad3154134" @@ -2682,14 +2963,7 @@ callsites@^3.0.0: resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== -camelcase-keys@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7" - dependencies: - camelcase "^2.0.0" - map-obj "^1.0.0" - -camelcase-keys@^4.1.0: +camelcase-keys@^4.0.0, camelcase-keys@^4.1.0: version "4.2.0" resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-4.2.0.tgz#a2aa5fb1af688758259c32c141426d78923b9b77" integrity sha1-oqpfsa9oh1glnDLBQUJteJI7m3c= @@ -2702,15 +2976,11 @@ camelcase@^1.0.2: version "1.2.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39" -camelcase@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" - camelcase@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a" -camelcase@^4.1.0: +camelcase@^4.0.0, camelcase@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" integrity sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0= @@ -2755,6 +3025,19 @@ capture-exit@^2.0.0: dependencies: rsvp "^4.8.4" +capture-stack-trace@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz#a6c0bbe1f38f3aa0b92238ecb6ff42c344d4135d" + integrity sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw== + +cardinal@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/cardinal/-/cardinal-2.1.1.tgz#7cc1055d822d212954d07b085dea251cc7bc5505" + integrity sha1-fMEFXYItISlU0HsIXeolHMe8VQU= + dependencies: + ansicolors "~0.3.2" + redeyed "~2.1.0" + caseless@~0.11.0: version "0.11.0" resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.11.0.tgz#715b96ea9841593cc33067923f5ec60ebda4f7d7" @@ -2801,7 +3084,7 @@ chalk@^1.1.1, chalk@^1.1.3: strip-ansi "^3.0.0" supports-color "^2.0.0" -chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.4.2: +chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.2, chalk@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== @@ -2890,11 +3173,28 @@ chownr@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.0.1.tgz#e2a75042a9551908bebd25b8523d5f9769d79181" +chownr@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.1.tgz#54726b8b8fff4df053c42187e801fb4412df1494" + integrity sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g== + +ci-info@^1.5.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.6.0.tgz#2ca20dbb9ceb32d4524a683303313f0304b1e497" + integrity sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A== + ci-info@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== +cidr-regex@^2.0.10: + version "2.0.10" + resolved "https://registry.yarnpkg.com/cidr-regex/-/cidr-regex-2.0.10.tgz#af13878bd4ad704de77d6dc800799358b3afa70d" + integrity sha512-sB3ogMQXWvreNPbJUZMRApxuRYd+KoIo4RGQ81VatjmMW6WJPo+IJZ2846FGItr9VzKo5w7DXzijPLGtSd0N3Q== + dependencies: + ip-regex "^2.1.0" + cipher-base@^1.0.0, cipher-base@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.3.tgz#eeabf194419ce900da3018c207d212f2a6df0a07" @@ -2921,6 +3221,24 @@ class-utils@^0.3.5: isobject "^3.0.0" static-extend "^0.1.1" +clean-stack@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.1.0.tgz#9e7fec7f3f8340a2ab4f127c80273085e8fbbdd0" + integrity sha512-uQWrpRm+iZZUCAp7ZZJQbd4Za9I3AjR/3YTjmcnAtkauaIm/T5CT6U8zVI6e60T6OANqBFAzuR9/HB3NzuZCRA== + +cli-boxes@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-1.0.0.tgz#4fa917c3e59c94a004cd61f8ee509da651687143" + integrity sha1-T6kXw+WclKAEzWH47lCdplFocUM= + +cli-columns@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/cli-columns/-/cli-columns-3.1.2.tgz#6732d972979efc2ae444a1f08e08fa139c96a18e" + integrity sha1-ZzLZcpee/CrkRKHwjgj6E5yWoY4= + dependencies: + string-width "^2.0.0" + strip-ansi "^3.0.1" + cli-cursor@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" @@ -2928,6 +3246,23 @@ cli-cursor@^2.1.0: dependencies: restore-cursor "^2.0.0" +cli-table3@^0.5.0, cli-table3@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.5.1.tgz#0252372d94dfc40dbd8df06005f48f31f656f202" + integrity sha512-7Qg2Jrep1S/+Q3EceiZtQcDPWxhAvBw+ERf1162v4sikJrvojMHFqXt8QIVha8UlH9rgU0BeWPytZ9/TzYqlUw== + dependencies: + object-assign "^4.1.0" + string-width "^2.1.1" + optionalDependencies: + colors "^1.1.2" + +cli-table@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/cli-table/-/cli-table-0.3.1.tgz#f53b05266a8b1a0b934b3d0821e6e2dc5914ae23" + integrity sha1-9TsFJmqLGguTSz0IIebi3FkUriM= + dependencies: + colors "1.0.3" + cli-width@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" @@ -2958,10 +3293,27 @@ cliui@^4.0.0: strip-ansi "^4.0.0" wrap-ansi "^2.0.0" +cliui@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" + integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA== + dependencies: + string-width "^3.1.0" + strip-ansi "^5.2.0" + wrap-ansi "^5.1.0" + clone@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.2.tgz#260b7a99ebb1edfe247538175f783243cb19d149" +cmd-shim@^2.0.2, cmd-shim@~2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/cmd-shim/-/cmd-shim-2.0.2.tgz#6fcbda99483a8fd15d7d30a196ca69d688a2efdb" + integrity sha1-b8vamUg6j9FdfTChlspp1oii79s= + dependencies: + graceful-fs "^4.1.2" + mkdirp "~0.5.0" + co@^4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" @@ -3062,10 +3414,28 @@ colormin@^1.0.5: css-color-names "0.0.4" has "^1.0.1" +colors@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b" + integrity sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs= + +colors@^1.1.2: + version "1.3.3" + resolved "https://registry.yarnpkg.com/colors/-/colors-1.3.3.tgz#39e005d546afe01e01f9c4ca8fa50f686a01205d" + integrity sha512-mmGt/1pZqYRjMxB1axhTo16/snVZ5krrKkcmMeVKxzECMMXoCgnvTPp10QgHfcbQZw8Dq2jMNG6je4JlWU0gWg== + colors@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/colors/-/colors-1.1.2.tgz#168a4701756b6a7f51a12ce0c97bfa28c084ed63" +columnify@~1.5.4: + version "1.5.4" + resolved "https://registry.yarnpkg.com/columnify/-/columnify-1.5.4.tgz#4737ddf1c7b69a8a7c340570782e947eec8e78bb" + integrity sha1-Rzfd8ce2mop8NAVweC6UfuyOeLs= + dependencies: + strip-ansi "^3.0.0" + wcwidth "^1.0.0" + combine-source-map@^0.8.0, combine-source-map@~0.8.0: version "0.8.0" resolved "https://registry.yarnpkg.com/combine-source-map/-/combine-source-map-0.8.0.tgz#a58d0df042c186fcf822a8e8015f5450d2d79a8b" @@ -3134,6 +3504,14 @@ commondir@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" +compare-func@^1.3.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/compare-func/-/compare-func-1.3.2.tgz#99dd0ba457e1f9bc722b12c08ec33eeab31fa648" + integrity sha1-md0LpFfh+bxyKxLAjsM+6rMfpkg= + dependencies: + array-ify "^1.0.0" + dot-prop "^3.0.0" + component-each: version "0.2.6" resolved "https://registry.yarnpkg.com/component-each/-/component-each-0.2.6.tgz#991faf31ef4fcafbad04237124d381b3394941d5" @@ -3167,14 +3545,6 @@ concat-stream@^1.5.0, concat-stream@^1.6.0, concat-stream@^1.6.1, concat-stream@ readable-stream "^2.2.2" typedarray "^0.0.6" -concat-stream@^1.5.2: - version "1.5.2" - resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.5.2.tgz#708978624d856af41a5a741defdd261da752c266" - dependencies: - inherits "~2.0.1" - readable-stream "~2.0.0" - typedarray "~0.0.5" - concat-stream@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-2.0.0.tgz#414cf5af790a48c60ab9be4527d56d5e41133cb1" @@ -3185,13 +3555,26 @@ concat-stream@^2.0.0: readable-stream "^3.0.2" typedarray "^0.0.6" -config-chain@~1.1.8: - version "1.1.11" - resolved "https://registry.yarnpkg.com/config-chain/-/config-chain-1.1.11.tgz#aba09747dfbe4c3e70e766a6e41586e1859fc6f2" +config-chain@^1.1.12: + version "1.1.12" + resolved "https://registry.yarnpkg.com/config-chain/-/config-chain-1.1.12.tgz#0fde8d091200eb5e808caf25fe618c02f48e4efa" + integrity sha512-a1eOIcu8+7lUInge4Rpf/n4Krkf3Dd9lqhljRzII1/Zno/kRtUWnznPO3jOKBmTEktkt3fkxisUcivoj0ebzoA== dependencies: ini "^1.3.4" proto-list "~1.2.1" +configstore@^3.0.0: + version "3.1.2" + resolved "https://registry.yarnpkg.com/configstore/-/configstore-3.1.2.tgz#c6f25defaeef26df12dd33414b001fe81a543f8f" + integrity sha512-vtv5HtGjcYUgFrXc6Kx747B83MRRVS5R1VTEQoXvuP+kMI+if6uywV0nDGoiydJRy4yk7h9od5Og0kxx4zUXmw== + dependencies: + dot-prop "^4.1.0" + graceful-fs "^4.1.2" + make-dir "^1.0.0" + unique-string "^1.0.0" + write-file-atomic "^2.0.0" + xdg-basedir "^3.0.0" + connect-pushstate@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/connect-pushstate/-/connect-pushstate-1.1.0.tgz#bcab224271c439604a0fb0f614c0a5f563e88e24" @@ -3203,7 +3586,7 @@ console-browserify@^1.1.0: dependencies: date-now "^0.1.4" -console-control-strings@^1.0.0, console-control-strings@~1.1.0: +console-control-strings@^1.0.0, console-control-strings@^1.1.0, console-control-strings@~1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" @@ -3216,21 +3599,56 @@ contains-path@^0.1.0: resolved "https://registry.yarnpkg.com/contains-path/-/contains-path-0.1.0.tgz#fe8cf184ff6670b6baef01a9d4861a5cbec4120a" integrity sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo= -conventional-changelog@0.0.17: - version "0.0.17" - resolved "https://registry.yarnpkg.com/conventional-changelog/-/conventional-changelog-0.0.17.tgz#5e0216600f4686190f0c82efbb0b3dd11b49ce34" +conventional-changelog-angular@^5.0.0: + version "5.0.3" + resolved "https://registry.yarnpkg.com/conventional-changelog-angular/-/conventional-changelog-angular-5.0.3.tgz#299fdd43df5a1f095283ac16aeedfb0a682ecab0" + integrity sha512-YD1xzH7r9yXQte/HF9JBuEDfvjxxwDGGwZU1+ndanbY0oFgA+Po1T9JDSpPLdP0pZT6MhCAsdvFKC4TJ4MTJTA== dependencies: - dateformat "^1.0.11" - event-stream "^3.3.0" - github-url-from-git "^1.4.0" - lodash "^3.6.0" - normalize-package-data "^1.0.3" + compare-func "^1.3.1" + q "^1.5.1" + +conventional-changelog-writer@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/conventional-changelog-writer/-/conventional-changelog-writer-4.0.3.tgz#916a2b302d0bb5ef18efd236a034c13fb273cde1" + integrity sha512-bIlpSiQtQZ1+nDVHEEh798Erj2jhN/wEjyw9sfxY9es6h7pREE5BNJjfv0hXGH/FTrAsEpHUq4xzK99eePpwuA== + dependencies: + compare-func "^1.3.1" + conventional-commits-filter "^2.0.1" + dateformat "^3.0.0" + handlebars "^4.1.0" + json-stringify-safe "^5.0.1" + lodash "^4.2.1" + meow "^4.0.0" + semver "^5.5.0" + split "^1.0.0" + through2 "^2.0.0" conventional-commit-types@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/conventional-commit-types/-/conventional-commit-types-2.1.1.tgz#352eb53f56fbc7c1a6c1ba059c2b6670c90b2a8a" integrity sha512-0Ts+fEdmjqYDOQ1yZ+LNgdSPO335XZw9qC10M7CxtLP3nIMGmeMhmkM8Taffa4+MXN13bRPlp0CtH+QfOzKTzw== +conventional-commits-filter@^2.0.0, conventional-commits-filter@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/conventional-commits-filter/-/conventional-commits-filter-2.0.1.tgz#55a135de1802f6510b6758e0a6aa9e0b28618db3" + integrity sha512-92OU8pz/977udhBjgPEbg3sbYzIxMDFTlQT97w7KdhR9igNqdJvy8smmedAAgn4tPiqseFloKkrVfbXCVd+E7A== + dependencies: + is-subset "^0.1.1" + modify-values "^1.0.0" + +conventional-commits-parser@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/conventional-commits-parser/-/conventional-commits-parser-3.0.1.tgz#fe1c49753df3f98edb2285a5e485e11ffa7f2e4c" + integrity sha512-P6U5UOvDeidUJ8ebHVDIoXzI7gMlQ1OF/id6oUvp8cnZvOXMt1n8nYl74Ey9YMn0uVQtxmCtjPQawpsssBWtGg== + dependencies: + JSONStream "^1.0.4" + is-text-path "^1.0.0" + lodash "^4.2.1" + meow "^4.0.0" + split2 "^2.0.0" + through2 "^2.0.0" + trim-off-newlines "^1.0.0" + convert-source-map@^1.1.0, convert-source-map@^1.4.0: version "1.6.0" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.6.0.tgz#51b537a8c43e0f04dec1993bffcdd504e758ac20" @@ -3247,6 +3665,18 @@ convert-source-map@~1.1.0: resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.1.3.tgz#4829c877e9fe49b3161f3bf3673888e204699860" integrity sha1-SCnId+n+SbMWHzvzZziI4gRpmGA= +copy-concurrently@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0" + integrity sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A== + dependencies: + aproba "^1.1.1" + fs-write-stream-atomic "^1.0.8" + iferr "^0.1.5" + mkdirp "^0.5.1" + rimraf "^2.5.4" + run-queue "^1.0.0" + copy-descriptor@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" @@ -3278,11 +3708,11 @@ core-js@^2.6.5: resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.9.tgz#6b4b214620c834152e179323727fc19741b084f2" integrity sha512-HOpZf6eXmnl7la+cUdMnLvUxKNqLUzJvgIziQ0DiF3JwSImNphIqdGqzj6hIKyX04MmV0poclQ7+wjWvxQyR2A== -"core-util-is@>=1.0.1 <1.1.0-0", core-util-is@^1.0.1, core-util-is@~1.0.0: +"core-util-is@>=1.0.1 <1.1.0-0", core-util-is@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" -cosmiconfig@^5.0.0: +cosmiconfig@^5.0.0, cosmiconfig@^5.0.1: version "5.2.1" resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.2.1.tgz#040f726809c591e77a17c0a3626ca45b4f168b1a" integrity sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA== @@ -3299,6 +3729,13 @@ create-ecdh@^4.0.0: bn.js "^4.1.0" elliptic "^6.0.0" +create-error-class@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/create-error-class/-/create-error-class-3.0.2.tgz#06be7abef947a3f14a30fd610671d401bca8b7b6" + integrity sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y= + dependencies: + capture-stack-trace "^1.0.0" + create-hash@^1.1.0, create-hash@^1.1.1: version "1.1.2" resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.1.2.tgz#51210062d7bb7479f6c65bb41a92208b1d61abad" @@ -3362,6 +3799,11 @@ crypto-browserify@^3.0.0, crypto-browserify@^3.11.0: randombytes "^2.0.0" randomfill "^1.0.3" +crypto-random-string@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-1.0.0.tgz#a230f64f568310e1498009940790ec99545bca7e" + integrity sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4= + css-blank-pseudo@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/css-blank-pseudo/-/css-blank-pseudo-0.1.4.tgz#dfdefd3254bf8a82027993674ccf35483bfcb3c5" @@ -3624,6 +4066,11 @@ currently-unhandled@^0.4.1: dependencies: array-find-index "^1.0.1" +cyclist@~0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-0.2.2.tgz#1b33792e11e914a2fd6d6ed6447464444e5fa640" + integrity sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA= + cz-conventional-changelog@2.1.0, cz-conventional-changelog@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/cz-conventional-changelog/-/cz-conventional-changelog-2.1.0.tgz#2f4bc7390e3244e4df293e6ba351e4c740a7c764" @@ -3668,30 +4115,35 @@ date-now@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b" -dateformat@^1.0.11: - version "1.0.12" - resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-1.0.12.tgz#9f124b67594c937ff706932e4a642cca8dbbfee9" - dependencies: - get-stdin "^4.0.1" - meow "^3.3.0" +dateformat@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-3.0.3.tgz#a6e37499a4d9a9cf85ef5872044d62901c9889ae" + integrity sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q== debounce@^1.0.0: version "1.2.0" resolved "https://registry.yarnpkg.com/debounce/-/debounce-1.2.0.tgz#44a540abc0ea9943018dc0eaa95cce87f65cd131" integrity sha512-mYtLl1xfZLi1m4RtQYlZgJUNQjl4ZxVnHzIR8nLLgi4q1YT8o/WM+MK/f8yfcc9s5Ir5zRaPZyZU6xs1Syoocg== -debug@2, debug@^2.2.0, debug@^2.5.1: - version "2.5.1" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.5.1.tgz#9107bb4a506052ec2a02314bc606313ed2b921c1" - dependencies: - ms "0.7.2" - debug@2.6.9, debug@^2.1.2, debug@^2.3.3, debug@^2.6.8, debug@^2.6.9: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" dependencies: ms "2.0.0" +debug@3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" + integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g== + dependencies: + ms "2.0.0" + +debug@^2.2.0, debug@^2.5.1: + version "2.5.1" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.5.1.tgz#9107bb4a506052ec2a02314bc606313ed2b921c1" + dependencies: + ms "0.7.2" + debug@^3.1.0, debug@^3.2.6: version "3.2.6" resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" @@ -3699,7 +4151,7 @@ debug@^3.1.0, debug@^3.2.6: dependencies: ms "^2.1.1" -debug@^4.0.1, debug@^4.1.0, debug@^4.1.1: +debug@^4.0.0, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== @@ -3712,7 +4164,20 @@ debug@~2.2.0: dependencies: ms "0.7.1" -decamelize@^1.0.0, decamelize@^1.1.1, decamelize@^1.1.2, decamelize@^1.2.0: +debuglog@*, debuglog@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/debuglog/-/debuglog-1.0.1.tgz#aa24ffb9ac3df9a2351837cfb2d279360cd78492" + integrity sha1-qiT/uaw9+aI1GDfPstJ5NgzXhJI= + +decamelize-keys@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/decamelize-keys/-/decamelize-keys-1.1.0.tgz#d171a87933252807eb3cb61dc1c1445d078df2d9" + integrity sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk= + dependencies: + decamelize "^1.1.0" + map-obj "^1.0.0" + +decamelize@^1.0.0, decamelize@^1.1.0, decamelize@^1.1.1, decamelize@^1.1.2, decamelize@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" @@ -3738,6 +4203,11 @@ deep-is@~0.1.3: resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= +deepmerge@3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-3.2.1.tgz#76a1f47854bcfcd66ee9a948d110540a8e12b261" + integrity sha512-+hbDSzTqEW0fWgnlKksg7XAOtT+ddZS5lHZJ6f6MdixRs9wQy+50fm1uUCVb1IkvjLUYX/SfFO021ZNwriURTw== + default-gateway@^2.6.0: version "2.7.2" resolved "https://registry.yarnpkg.com/default-gateway/-/default-gateway-2.7.2.tgz#b7ef339e5e024b045467af403d50348db4642d0f" @@ -3746,6 +4216,13 @@ default-gateway@^2.6.0: execa "^0.10.0" ip-regex "^2.1.0" +defaults@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d" + integrity sha1-xlYFHpgX2f8I7YgUd/P+QBnz730= + dependencies: + clone "^1.0.2" + define-properties@^1.1.2, define-properties@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" @@ -3789,6 +4266,11 @@ depd@~1.1.2: resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= +deprecation@^2.0.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/deprecation/-/deprecation-2.3.1.tgz#6368cbdb40abf3373b525ac87e4a260c3a700919" + integrity sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ== + deps-sort@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/deps-sort/-/deps-sort-2.0.0.tgz#091724902e84658260eb910748cccd1af6e21fb5" @@ -3822,7 +4304,7 @@ detect-indent@^4.0.0: dependencies: repeating "^2.0.0" -detect-indent@^5.0.0: +detect-indent@^5.0.0, detect-indent@~5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-5.0.0.tgz#3871cc0a6a002e8c3e5b3cf7f336264675f06b9d" integrity sha1-OHHMCmoALow+Wzz38zYmRnXwa50= @@ -3845,9 +4327,10 @@ detective@^5.0.2: defined "^1.0.0" minimist "^1.1.1" -dezalgo@^1.0.1: +dezalgo@^1.0.0, dezalgo@~1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/dezalgo/-/dezalgo-1.0.3.tgz#7f742de066fc748bc8db820569dddce49bf0d456" + integrity sha1-f3Qt4Gb8dIvI24IFad3c5Jvw1FY= dependencies: asap "^2.0.0" wrappy "1" @@ -3865,6 +4348,13 @@ diffie-hellman@^5.0.0: miller-rabin "^4.0.0" randombytes "^2.0.0" +dir-glob@^2.0.0, dir-glob@^2.2.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-2.2.2.tgz#fa09f0694153c8918b18ba0deafae94769fc50c4" + integrity sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw== + dependencies: + path-type "^3.0.0" + dlv@^1.1.0: version "1.1.3" resolved "https://registry.yarnpkg.com/dlv/-/dlv-1.1.3.tgz#5c198a8a11453596e751494d49874bc7732f2e79" @@ -3924,13 +4414,25 @@ domutils@^1.7.0: dom-serializer "0" domelementtype "1" -dot-prop@^4.1.1: +dot-prop@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-3.0.0.tgz#1b708af094a49c9a0e7dbcad790aba539dac1177" + integrity sha1-G3CK8JSknJoOfbyteQq6U52sEXc= + dependencies: + is-obj "^1.0.0" + +dot-prop@^4.1.0, dot-prop@^4.1.1: version "4.2.0" resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.2.0.tgz#1f19e0c2e1aa0e32797c49799f2837ac6af69c57" integrity sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ== dependencies: is-obj "^1.0.0" +dotenv@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-5.0.1.tgz#a5317459bd3d79ab88cff6e44057a6a3fbb1fcef" + integrity sha512-4As8uPrjfwb7VXC+WnLCbXK7y+Ueb2B3zgNCePYfhxS1PYeaO1YTeplffTEcbfLhvFNGLAz90VvJs9yomG7bow== + duplexer2@^0.1.2, duplexer2@~0.1.0, duplexer2@~0.1.2: version "0.1.4" resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.1.4.tgz#8b12dab878c0d69e3e7891051662a32fc6bddcc1" @@ -3938,9 +4440,20 @@ duplexer2@^0.1.2, duplexer2@~0.1.0, duplexer2@~0.1.2: dependencies: readable-stream "^2.0.2" -duplexer@~0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.1.tgz#ace6ff808c1ce66b57d1ebf97977acb02334cfc1" +duplexer3@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" + integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI= + +duplexify@^3.4.2, duplexify@^3.6.0: + version "3.7.1" + resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.7.1.tgz#2a4df5317f6ccfd91f86d6fd25d8d8a103b88309" + integrity sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g== + dependencies: + end-of-stream "^1.0.0" + inherits "^2.0.1" + readable-stream "^2.0.0" + stream-shift "^1.0.0" ecc-jsbn@~0.1.1: version "0.1.1" @@ -3948,6 +4461,11 @@ ecc-jsbn@~0.1.1: dependencies: jsbn "~0.1.0" +editor@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/editor/-/editor-1.0.0.tgz#60c7f87bd62bcc6a894fa8ccd6afb7823a24f742" + integrity sha1-YMf4e9YrzGqJT6jM1q+3gjok90I= + ee-first@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" @@ -3992,7 +4510,7 @@ encoding@^0.1.11: dependencies: iconv-lite "~0.4.13" -end-of-stream@^1.1.0: +end-of-stream@^1.0.0, end-of-stream@^1.1.0: version "1.4.1" resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.1.tgz#ed29634d19baba463b6ce6b80a37213eab71ec43" integrity sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q== @@ -4013,6 +4531,14 @@ entities@^1.1.1: resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.2.tgz#bdfa735299664dfafd34529ed4f8522a275fea56" integrity sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w== +env-ci@^4.0.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/env-ci/-/env-ci-4.1.1.tgz#b8438fc7258a0dc7a4f4c4816de730767946a718" + integrity sha512-eTgpkALDeYRGNhYM2fO9LKsWDifoUgKL7hxpPZqFMP2IU7f+r89DtKqCmk3yQB/jxS8CmZTfKnWO5TiIDFs9Hw== + dependencies: + execa "^1.0.0" + java-properties "^1.0.0" + envify@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/envify/-/envify-4.1.0.tgz#f39ad3db9d6801b4e6b478b61028d3f0b6819f7e" @@ -4021,7 +4547,12 @@ envify@^4.1.0: esprima "^4.0.0" through "~2.3.4" -errno@^0.1.3: +err-code@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/err-code/-/err-code-1.1.2.tgz#06e0116d3028f6aef4806849eb0ea6a748ae6960" + integrity sha1-BuARbTAo9q70gGhJ6w6mp0iuaWA= + +errno@^0.1.3, errno@~0.1.7: version "0.1.7" resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz#4684d71779ad39af177e3f007996f7c67c852618" dependencies: @@ -4066,6 +4597,18 @@ es-to-primitive@^1.2.0: is-date-object "^1.0.1" is-symbol "^1.0.2" +es6-promise@^4.0.3: + version "4.2.8" + resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a" + integrity sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w== + +es6-promisify@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/es6-promisify/-/es6-promisify-5.0.0.tgz#5109d62f3e56ea967c4b63505aef08291c8a5203" + integrity sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM= + dependencies: + es6-promise "^4.0.3" + es6-promisify@^6.0.0: version "6.0.1" resolved "https://registry.yarnpkg.com/es6-promisify/-/es6-promisify-6.0.1.tgz#6edaa45f3bd570ffe08febce66f7116be4b1cdb6" @@ -4350,7 +4893,7 @@ esprima@^3.1.3: resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633" integrity sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM= -esprima@^4.0.0: +esprima@^4.0.0, esprima@~4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== @@ -4383,18 +4926,6 @@ etag@~1.8.1: resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= -event-stream@^3.3.0: - version "3.3.4" - resolved "https://registry.yarnpkg.com/event-stream/-/event-stream-3.3.4.tgz#4ab4c9a0f5a54db9338b4c34d86bfce8f4b35571" - dependencies: - duplexer "~0.1.1" - from "~0" - map-stream "~0.1.0" - pause-stream "0.0.11" - split "0.3" - stream-combiner "~0.0.4" - through "~2.3.1" - events@1.1.1, events@^1.0.0, events@^1.0.2: version "1.1.1" resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924" @@ -4525,10 +5056,6 @@ extend-shallow@^3.0.0, extend-shallow@^3.0.2: assign-symbols "^1.0.0" is-extendable "^1.0.1" -extend@3, extend@~3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.0.tgz#5a474353b9f3353ddd8176dfd37b91c83a46f1d4" - extend@^1.2.1: version "1.3.0" resolved "https://registry.yarnpkg.com/extend/-/extend-1.3.0.tgz#d1516fb0ff5624d2ebf9123ea1dac5a1994004f8" @@ -4539,6 +5066,10 @@ extend@^3.0.0, extend@~3.0.2: resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== +extend@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.0.tgz#5a474353b9f3353ddd8176dfd37b91c83a46f1d4" + external-editor@^2.0.4: version "2.2.0" resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-2.2.0.tgz#045511cfd8d133f3846673d1047c154e214ad3d5" @@ -4590,6 +5121,18 @@ fast-deep-equal@^2.0.1: resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" integrity sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk= +fast-glob@^2.2.6: + version "2.2.7" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-2.2.7.tgz#6953857c3afa475fff92ee6015d52da70a4cd39d" + integrity sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw== + dependencies: + "@mrmlnc/readdir-enhanced" "^2.2.1" + "@nodelib/fs.stat" "^1.1.2" + glob-parent "^3.1.0" + is-glob "^4.0.0" + merge2 "^1.2.3" + micromatch "^3.1.10" + fast-json-stable-stringify@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" @@ -4611,6 +5154,11 @@ fb-watchman@^2.0.0: dependencies: bser "^2.0.0" +figgy-pudding@^3.4.1, figgy-pudding@^3.5.1: + version "3.5.1" + resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.1.tgz#862470112901c727a0e495a80744bd5baa1d6790" + integrity sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w== + figures@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" @@ -4618,6 +5166,13 @@ figures@^2.0.0: dependencies: escape-string-regexp "^1.0.5" +figures@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-3.0.0.tgz#756275c964646163cc6f9197c7a0295dbfd04de9" + integrity sha512-HKri+WoWoUgr83pehn/SIgLOMZ9nAWC6dcGj26RY2R4F50u4+RTUz0RCrUlOV3nKRAICW1UGzyb+kcX2qK1S/g== + dependencies: + escape-string-regexp "^1.0.5" + file-entry-cache@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-2.0.0.tgz#c392990c3e684783d838b8c84a45d8a048458361" @@ -4678,6 +5233,11 @@ find-node-modules@2.0.0: findup-sync "^3.0.0" merge "^1.2.1" +find-npm-prefix@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/find-npm-prefix/-/find-npm-prefix-1.0.2.tgz#8d8ce2c78b3b4b9e66c8acc6a37c231eb841cfdf" + integrity sha512-KEftzJ+H90x6pcKtdXZEPsQse8/y/UnvzRKrOSQFprnrGaFuJ62fVkP34Iu2IYuMvyauCyoLTNkJZgrrGA2wkA== + find-root@1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/find-root/-/find-root-1.1.0.tgz#abcfc8ba76f708c42a97b3d685b7e9450bfb9ce4" @@ -4704,6 +5264,22 @@ find-up@^3.0.0: dependencies: locate-path "^3.0.0" +find-up@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== + dependencies: + locate-path "^5.0.0" + path-exists "^4.0.0" + +find-versions@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/find-versions/-/find-versions-3.1.0.tgz#10161f29cf3eb4350dec10a29bdde75bff0df32d" + integrity sha512-NCTfNiVzeE/xL+roNDffGuRbrWI6atI18lTJ22vKp7rs2OhYzMK3W1dIdO2TUndH/QMcacM4d1uWwgcZcHK69Q== + dependencies: + array-uniq "^2.1.0" + semver-regex "^2.0.0" + findup-sync@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-3.0.0.tgz#17b108f9ee512dfb7a5c7f3c8b27ea9e1a9c08d1" @@ -4759,12 +5335,13 @@ flow-runtime@^0.17.0: resolved "https://registry.yarnpkg.com/flow-runtime/-/flow-runtime-0.17.0.tgz#ff57dd22bd7b0682c7beff20c3590f6a4a8286e3" integrity sha512-x621HugMPrtU68ddiRX0TkNRif9PS6ml3oeP6oo0k+Kv2issqCmifC4ZX59XnLUh9dfmBcj4GoZJXu4oe8L28Q== -follow-redirects@0.0.7: - version "0.0.7" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-0.0.7.tgz#34b90bab2a911aa347571da90f22bd36ecd8a919" +flush-write-stream@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.1.1.tgz#8dd7d873a1babc207d94ead0c2e0e44276ebf2e8" + integrity sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w== dependencies: - debug "^2.2.0" - stream-consume "^0.1.0" + inherits "^2.0.3" + readable-stream "^2.3.6" for-in@^0.1.5: version "0.1.6" @@ -4780,22 +5357,10 @@ for-own@^0.1.3: dependencies: for-in "^0.1.5" -foreachasync@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/foreachasync/-/foreachasync-3.0.0.tgz#5502987dc8714be3392097f32e0071c9dee07cf6" - forever-agent@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" -form-data@~1.0.0-rc4: - version "1.0.1" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-1.0.1.tgz#ae315db9a4907fa065502304a66d7733475ee37c" - dependencies: - async "^2.0.1" - combined-stream "^1.0.5" - mime-types "^2.1.11" - form-data@~2.1.1: version "2.1.2" resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.1.2.tgz#89c3534008b97eada4cbb157d58f6f5df025eae4" @@ -4831,7 +5396,15 @@ from2-string@^1.1.0: dependencies: from2 "^2.0.3" -from2@^2.0.3: +from2@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/from2/-/from2-1.3.0.tgz#88413baaa5f9a597cfde9221d86986cd3c061dfd" + integrity sha1-iEE7qqX5pZfP3pIh2GmGzTwGHf0= + dependencies: + inherits "~2.0.1" + readable-stream "~1.1.10" + +from2@^2.0.3, from2@^2.1.0, from2@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af" integrity sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8= @@ -4839,10 +5412,6 @@ from2@^2.0.3: inherits "^2.0.1" readable-stream "^2.0.0" -from@~0: - version "0.1.3" - resolved "https://registry.yarnpkg.com/from/-/from-0.1.3.tgz#ef63ac2062ac32acf7862e0d40b44b896f22f3bc" - fs-extra@^7.0.0: version "7.0.1" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9" @@ -4852,6 +5421,15 @@ fs-extra@^7.0.0: jsonfile "^4.0.0" universalify "^0.1.0" +fs-extra@^8.0.0: + version "8.0.1" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.0.1.tgz#90294081f978b1f182f347a440a209154344285b" + integrity sha512-W+XLrggcDzlle47X/XnS7FXrXu9sDo+Ze9zpndeBxdgv88FHLm1HtmkhEwavruS6koanBjp098rUpHs65EmG7A== + dependencies: + graceful-fs "^4.1.2" + jsonfile "^4.0.0" + universalify "^0.1.0" + fs-minipass@^1.2.5: version "1.2.5" resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.5.tgz#06c277218454ec288df77ada54a03b8702aacb9d" @@ -4862,6 +5440,25 @@ fs-readdir-recursive@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz#e32fc030a2ccee44a6b5371308da54be0b397d27" +fs-vacuum@^1.2.10, fs-vacuum@~1.2.10: + version "1.2.10" + resolved "https://registry.yarnpkg.com/fs-vacuum/-/fs-vacuum-1.2.10.tgz#b7629bec07a4031a2548fdf99f5ecf1cc8b31e36" + integrity sha1-t2Kb7AekAxolSP35n17PHMizHjY= + dependencies: + graceful-fs "^4.1.2" + path-is-inside "^1.0.1" + rimraf "^2.5.2" + +fs-write-stream-atomic@^1.0.8, fs-write-stream-atomic@~1.0.10: + version "1.0.10" + resolved "https://registry.yarnpkg.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz#b47df53493ef911df75731e70a9ded0189db40c9" + integrity sha1-tH31NJPvkR33VzHnCp3tAYnbQMk= + dependencies: + graceful-fs "^4.1.2" + iferr "^0.1.5" + imurmurhash "^0.1.4" + readable-stream "1 || 2" + fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" @@ -4905,6 +5502,16 @@ fstream@^1.0.0, fstream@^1.0.2, fstream@~1.0.10: mkdirp ">=0.5 0" rimraf "2" +fstream@^1.0.12: + version "1.0.12" + resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.12.tgz#4e8ba8ee2d48be4f7d0de505455548eae5932045" + integrity sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg== + dependencies: + graceful-fs "^4.1.2" + inherits "~2.0.0" + mkdirp ">=0.5 0" + rimraf "2" + function-bind@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" @@ -4930,16 +5537,6 @@ garnish@^5.0.0: stdout-stream "^1.4.0" url-trim "^1.0.0" -gauge@~1.2.0: - version "1.2.7" - resolved "https://registry.yarnpkg.com/gauge/-/gauge-1.2.7.tgz#e9cec5483d3d4ee0ef44b60a7d99e4935e136d93" - dependencies: - ansi "^0.3.0" - has-unicode "^2.0.0" - lodash.pad "^4.1.0" - lodash.padend "^4.1.0" - lodash.padstart "^4.1.0" - gauge@~2.6.0: version "2.6.0" resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.6.0.tgz#d35301ad18e96902b4751dcbbe40f4218b942a46" @@ -4977,6 +5574,25 @@ generate-object-property@^1.1.0: dependencies: is-property "^1.0.0" +genfun@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/genfun/-/genfun-5.0.0.tgz#9dd9710a06900a5c4a5bf57aca5da4e52fe76537" + integrity sha512-KGDOARWVga7+rnB3z9Sd2Letx515owfk0hSxHGuqjANb1M+x2bGZGqHLiozPsYMdM2OubeMni/Hpwmjq6qIUhA== + +gentle-fs@^2.0.0, gentle-fs@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/gentle-fs/-/gentle-fs-2.0.1.tgz#585cfd612bfc5cd52471fdb42537f016a5ce3687" + integrity sha512-cEng5+3fuARewXktTEGbwsktcldA+YsnUEaXZwcK/3pjSE1X9ObnTs+/8rYf8s+RnIcQm2D5x3rwpN7Zom8Bew== + dependencies: + aproba "^1.1.2" + fs-vacuum "^1.2.10" + graceful-fs "^4.1.11" + iferr "^0.1.5" + mkdirp "^0.5.1" + path-is-inside "^1.0.2" + read-cmd-shim "^1.0.1" + slide "^1.1.6" + get-assigned-identifiers@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/get-assigned-identifiers/-/get-assigned-identifiers-1.2.0.tgz#6dbf411de648cbaf8d9169ebb0d2d576191e2ff1" @@ -4986,6 +5602,11 @@ get-caller-file@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.2.tgz#f702e63127e7e231c160a80c1554acb70d5047e5" +get-caller-file@^2.0.1: + version "2.0.5" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + get-ports@^1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/get-ports/-/get-ports-1.0.3.tgz#f40bd580aca7ec0efb7b96cbfcbeb03ef894b5e8" @@ -4993,10 +5614,6 @@ get-ports@^1.0.2: dependencies: map-limit "0.0.1" -get-stdin@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" - get-stdin@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-5.0.1.tgz#122e161591e21ff4c52530305693f20e6393a398" @@ -5007,13 +5624,20 @@ get-stream@^3.0.0: resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" integrity sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ= -get-stream@^4.0.0: +get-stream@^4.0.0, get-stream@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== dependencies: pump "^3.0.0" +get-stream@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.1.0.tgz#01203cdc92597f9b909067c3e656cc1f4d3c4dc9" + integrity sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw== + dependencies: + pump "^3.0.0" + get-value@^2.0.3, get-value@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" @@ -5024,40 +5648,17 @@ getpass@^0.1.1: dependencies: assert-plus "^1.0.0" -git-head@^1.2.1: - version "1.14.0" - resolved "https://registry.yarnpkg.com/git-head/-/git-head-1.14.0.tgz#be31c107fb8402098561250ef1e9d88842c391b8" - dependencies: - git-refs "^1.1.3" - -git-refs@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/git-refs/-/git-refs-1.1.3.tgz#83097cb3a92585c4a4926ec54e2182df9e20e89d" - dependencies: - path-object "^2.3.0" - slash "^1.0.0" - walk "^2.3.9" - -github-url-from-git@^1.3.0, github-url-from-git@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/github-url-from-git/-/github-url-from-git-1.4.0.tgz#285e6b520819001bde128674704379e4ff03e0de" - -github-url-from-username-repo@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/github-url-from-username-repo/-/github-url-from-username-repo-1.0.2.tgz#7dd79330d2abe69c10c2cef79714c97215791dfa" - -github@^7.0.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/github/-/github-7.1.0.tgz#ba12eece6dc0fc65ddbf104b8fe36e8a7b9d5b30" +git-log-parser@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/git-log-parser/-/git-log-parser-1.2.0.tgz#2e6a4c1b13fc00028207ba795a7ac31667b9fd4a" + integrity sha1-LmpMGxP8AAKCB7p5WnrDFme5/Uo= dependencies: - follow-redirects "0.0.7" - https-proxy-agent "^1.0.0" - mime "^1.2.11" - netrc "^0.1.4" - -github@~0.1.10: - version "0.1.16" - resolved "https://registry.yarnpkg.com/github/-/github-0.1.16.tgz#895d2a85b0feb7980d89ac0ce4f44dcaa03f17b5" + argv-formatter "~1.0.0" + spawn-error-forwarder "~1.0.0" + split2 "~1.0.0" + stream-combiner2 "~1.1.1" + through2 "~2.0.0" + traverse "~0.6.6" glob-base@^0.3.0: version "0.3.0" @@ -5079,6 +5680,11 @@ glob-parent@^3.1.0: is-glob "^3.1.0" path-dirname "^1.0.0" +glob-to-regexp@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz#8c5a1494d2066c570cc3bfe4496175acc4d502ab" + integrity sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs= + glob@7.1.3: version "7.1.3" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" @@ -5091,7 +5697,7 @@ glob@7.1.3: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^7.0.0, glob@^7.1.0, glob@^7.1.1, glob@^7.1.3: +glob@^7.0.0, glob@^7.0.3, glob@^7.1.0, glob@^7.1.1, glob@^7.1.3, glob@^7.1.4: version "7.1.4" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.4.tgz#aa608a2f6c577ad357e1ae5a5c26d9a8d1969255" integrity sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A== @@ -5137,6 +5743,13 @@ glob@~7.0.6: once "^1.3.0" path-is-absolute "^1.0.0" +global-dirs@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-0.1.1.tgz#b319c0dd4607f353f3be9cca4c72fc148c49f445" + integrity sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU= + dependencies: + ini "^1.3.4" + global-modules@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-1.0.0.tgz#6d770f0eb523ac78164d72b5e71a8877265cc3ea" @@ -5166,6 +5779,37 @@ globals@^9.18.0: version "9.18.0" resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" +globby@^9.0.0: + version "9.2.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-9.2.0.tgz#fd029a706c703d29bdd170f4b6db3a3f7a7cb63d" + integrity sha512-ollPHROa5mcxDEkwg6bPt3QbEf4pDQSNtd6JPL1YvOvAo/7/0VAm9TccUeoTmarjPw4pfUthSCqcyfNB1I3ZSg== + dependencies: + "@types/glob" "^7.1.1" + array-union "^1.0.2" + dir-glob "^2.2.2" + fast-glob "^2.2.6" + glob "^7.1.3" + ignore "^4.0.3" + pify "^4.0.1" + slash "^2.0.0" + +got@^6.7.1: + version "6.7.1" + resolved "https://registry.yarnpkg.com/got/-/got-6.7.1.tgz#240cd05785a9a18e561dc1b44b41c763ef1e8db0" + integrity sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA= + dependencies: + create-error-class "^3.0.0" + duplexer3 "^0.1.4" + get-stream "^3.0.0" + is-redirect "^1.0.0" + is-retry-allowed "^1.0.0" + is-stream "^1.0.0" + lowercase-keys "^1.0.0" + safe-buffer "^5.0.1" + timed-out "^4.0.0" + unzip-response "^2.0.1" + url-parse-lax "^1.0.0" + graceful-fs@^4.1.11, graceful-fs@^4.1.15: version "4.1.15" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.15.tgz#ffb703e1066e8a0eeaa4c8b80ba9253eeefbfb00" @@ -5188,7 +5832,7 @@ growly@^1.3.0: resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" integrity sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE= -handlebars@^4.1.2: +handlebars@^4.1.0, handlebars@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.1.2.tgz#b6b37c1ced0306b221e094fc7aca3ec23b131b67" integrity sha512-nvfrjqvt9xQ8Z/w0ijewdD/vvWDTOweBUm96NTr66Wfvo1mJenBLwcYmPs3TIBP5ruzYGD7Hx/DaM9RmhroGPw== @@ -5256,7 +5900,7 @@ has-symbols@^1.0.0: resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.0.tgz#ba1a8f1af2a0fc39650f5c850367704122063b44" integrity sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q= -has-unicode@^2.0.0: +has-unicode@^2.0.0, has-unicode@~2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" @@ -5336,10 +5980,20 @@ homedir-polyfill@^1.0.1: dependencies: parse-passwd "^1.0.0" -hosted-git-info@^2.1.4, hosted-git-info@^2.1.5: +hook-std@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/hook-std/-/hook-std-2.0.0.tgz#ff9aafdebb6a989a354f729bb6445cf4a3a7077c" + integrity sha512-zZ6T5WcuBMIUVh49iPQS9t977t7C0l7OtHrpeMb5uk48JdflRX0NSFvCekfYNmGQETnLq9W/isMyHl69kxGi8g== + +hosted-git-info@^2.1.4: version "2.1.5" resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.1.5.tgz#0ba81d90da2e25ab34a332e6ec77936e1598118b" +hosted-git-info@^2.6.0, hosted-git-info@^2.7.1: + version "2.7.1" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.7.1.tgz#97f236977bd6e125408930ff6de3eec6281ec047" + integrity sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w== + hsl-regex@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/hsl-regex/-/hsl-regex-1.0.0.tgz#d49330c789ed819e276a4c0d272dffa30b18fe6e" @@ -5366,6 +6020,11 @@ htmlescape@^1.1.0: resolved "https://registry.yarnpkg.com/htmlescape/-/htmlescape-1.1.1.tgz#3a03edc2214bca3b66424a3e7959349509cb0351" integrity sha1-OgPtwiFLyjtmQko+eVk0lQnLA1E= +http-cache-semantics@^3.8.1: + version "3.8.1" + resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz#39b0e16add9b605bf0a9ef3d9daaf4843b4cacd2" + integrity sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w== + http-errors@~1.7.2: version "1.7.2" resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.2.tgz#4f5029cf13239f31036e5b2e55292bcfbcc85c8f" @@ -5377,6 +6036,14 @@ http-errors@~1.7.2: statuses ">= 1.5.0 < 2" toidentifier "1.0.0" +http-proxy-agent@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz#e4821beef5b2142a2026bd73926fe537631c5405" + integrity sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg== + dependencies: + agent-base "4" + debug "3.1.0" + http-signature@~1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.1.1.tgz#df72e267066cd0ac67fb76adf8e134a8fbcf91bf" @@ -5398,13 +6065,20 @@ https-browserify@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" -https-proxy-agent@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-1.0.0.tgz#35f7da6c48ce4ddbfa264891ac593ee5ff8671e6" +https-proxy-agent@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-2.2.1.tgz#51552970fa04d723e04c56d04178c3f92592bbc0" + integrity sha512-HPCTS1LW51bcyMYbxUIOO4HEOlQ1/1qRaFWcyxvwaqUS9TY88aoEuHUY33kuAh1YhVVaDQhLZsnPd+XNARWZlQ== + dependencies: + agent-base "^4.1.0" + debug "^3.1.0" + +humanize-ms@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/humanize-ms/-/humanize-ms-1.2.1.tgz#c46e3159a293f6b896da29316d8b6fe8bb79bbed" + integrity sha1-xG4xWaKT9riW2ikxbYtv6Lt5u+0= dependencies: - agent-base "2" - debug "2" - extend "3" + ms "^2.0.0" iconv-lite@0.4.24, iconv-lite@^0.4.17, iconv-lite@^0.4.24, iconv-lite@~0.4.13: version "0.4.24" @@ -5427,6 +6101,16 @@ ieee754@1.1.8, ieee754@^1.1.4: version "1.1.8" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.8.tgz#be33d40ac10ef1926701f6f08a2d86fbfd1ad3e4" +iferr@^0.1.5: + version "0.1.5" + resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501" + integrity sha1-xg7taebY/bazEEofy8ocGS3FtQE= + +iferr@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/iferr/-/iferr-1.0.2.tgz#e9fde49a9da06dc4a4194c6c9ed6d08305037a6d" + integrity sha512-9AfeLfji44r5TKInjhz3W9DyZI1zR1JAf2hVBMGhddAKPqBsupb89jGfbCTHIGZd6fGZl9WlHdn4AObygyMKwg== + ignore-walk@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.1.tgz#a83e62e7d272ac0e3b551aaa82831a19b69f82f8" @@ -5438,7 +6122,7 @@ ignore@^3.2.7, ignore@^3.3.3: resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.10.tgz#0a97fb876986e8081c631160f8f9f389157f0043" integrity sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug== -ignore@^4.0.6: +ignore@^4.0.3, ignore@^4.0.6: version "4.0.6" resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== @@ -5464,6 +6148,18 @@ import-fresh@^3.0.0: parent-module "^1.0.0" resolve-from "^4.0.0" +import-from@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/import-from/-/import-from-3.0.0.tgz#055cfec38cd5a27d8057ca51376d7d3bf0891966" + integrity sha512-CiuXOFFSzkU5x/CR0+z7T91Iht4CXgfCxVOFRhh2Zyhg5wOpWvvDLQUsWl+gcN+QscYBjez8hDCt85O7RLDttQ== + dependencies: + resolve-from "^5.0.0" + +import-lazy@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43" + integrity sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM= + import-local@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/import-local/-/import-local-2.0.0.tgz#55070be38a5993cf18ef6db7e961f5bee5c5a09d" @@ -5472,18 +6168,12 @@ import-local@^2.0.0: pkg-dir "^3.0.0" resolve-cwd "^2.0.0" -imurmurhash@^0.1.4: +imurmurhash@*, imurmurhash@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= -indent-string@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80" - dependencies: - repeating "^2.0.0" - -indent-string@^3.1.0, indent-string@^3.2.0: +indent-string@^3.0.0, indent-string@^3.1.0, indent-string@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-3.2.0.tgz#4a5fd6d27cc332f37e5419a504dbb837105c9289" integrity sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok= @@ -5501,7 +6191,7 @@ indexof@0.0.1: resolved "https://registry.yarnpkg.com/individual/-/individual-3.0.0.tgz#e7ca4f85f8957b018734f285750dc22ec2f9862d" integrity sha1-58pPhfiVewGHNPKFdQ3CLsL5hi0= -inflight@^1.0.4: +inflight@^1.0.4, inflight@~1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" dependencies: @@ -5516,10 +6206,29 @@ inherits@2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" -ini@^1.2.0, ini@^1.3.4, ini@~1.3.0: +ini@^1.3.4, ini@~1.3.0: version "1.3.4" resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.4.tgz#0537cb79daf59b59a1a517dff706c86ec039162e" +ini@^1.3.5: + version "1.3.5" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" + integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== + +init-package-json@^1.10.3: + version "1.10.3" + resolved "https://registry.yarnpkg.com/init-package-json/-/init-package-json-1.10.3.tgz#45ffe2f610a8ca134f2bd1db5637b235070f6cbe" + integrity sha512-zKSiXKhQveNteyhcj1CoOP8tqp1QuxPIPBl8Bid99DGLFqA1p87M6lNgfjJHSBoWJJlidGOv5rWjyYKEB3g2Jw== + dependencies: + glob "^7.1.1" + npm-package-arg "^4.0.0 || ^5.0.0 || ^6.0.0" + promzard "^0.3.0" + read "~1.0.1" + read-package-json "1 || 2" + semver "2.x || 3.x || 4 || 5" + validate-npm-package-license "^3.0.1" + validate-npm-package-name "^3.0.0" + inject-lr-script@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/inject-lr-script/-/inject-lr-script-2.1.0.tgz#e61b5e84c118733906cbea01ec3d746698a39f65" @@ -5620,6 +6329,14 @@ interpret@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.0.1.tgz#d579fb7f693b858004947af39fa0db49f795602c" +into-stream@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/into-stream/-/into-stream-5.1.0.tgz#b05f37d8fed05c06a0b43b556d74e53e5af23878" + integrity sha512-cbDhb8qlxKMxPBk/QxTtYg1DQ4CwXmadu7quG3B7nrJsgSncEreF2kwWKZFdnjc/lSNNIkFPsjI7SM0Cx/QXPw== + dependencies: + from2 "^2.3.0" + p-is-promise "^2.0.0" + invariant@^2.2.2, invariant@^2.2.4: version "2.2.4" resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" @@ -5640,6 +6357,11 @@ ip-regex@^2.1.0: resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-2.1.0.tgz#fa78bf5d2e6913c911ce9f819ee5146bb6d844e9" integrity sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk= +ip@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a" + integrity sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo= + ipaddr.js@^1.5.2: version "1.9.0" resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.0.tgz#37df74e430a0e47550fe54a2defe30d8acd95f65" @@ -5700,6 +6422,13 @@ is-callable@^1.1.4: resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.4.tgz#1e1adf219e1eeb684d691f9d6a05ff0d30a24d75" integrity sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA== +is-ci@^1.0.10: + version "1.2.1" + resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-1.2.1.tgz#e3779c8ee17fccf428488f6e281187f2e632841c" + integrity sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg== + dependencies: + ci-info "^1.5.0" + is-ci@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c" @@ -5707,6 +6436,13 @@ is-ci@^2.0.0: dependencies: ci-info "^2.0.0" +is-cidr@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-cidr/-/is-cidr-3.0.0.tgz#1acf35c9e881063cd5f696d48959b30fed3eed56" + integrity sha512-8Xnnbjsb0x462VoYiGlhEi+drY8SFwrHiSYuzc/CEwco55vkehTaxAyIjEdpi3EMvLPPJAJi9FlzP+h+03gp0Q== + dependencies: + cidr-regex "^2.0.10" + is-color-stop@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-color-stop/-/is-color-stop-1.1.0.tgz#cfff471aee4dd5c9e158598fbe12967b5cdad345" @@ -5825,6 +6561,14 @@ is-glob@^4.0.0: dependencies: is-extglob "^2.1.1" +is-installed-globally@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.1.0.tgz#0dfd98f5a9111716dd535dda6492f67bf3d25a80" + integrity sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA= + dependencies: + global-dirs "^0.1.0" + is-path-inside "^1.0.0" + is-my-json-valid@^2.12.4: version "2.15.0" resolved "https://registry.yarnpkg.com/is-my-json-valid/-/is-my-json-valid-2.15.0.tgz#936edda3ca3c211fd98f3b2d3e08da43f7b2915b" @@ -5834,6 +6578,11 @@ is-my-json-valid@^2.12.4: jsonpointer "^4.0.0" xtend "^4.0.0" +is-npm@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-1.0.0.tgz#f2fb63a65e4905b406c86072765a1a4dc793b9f4" + integrity sha1-8vtjpl5JBbQGyGBydloaTceTufQ= + is-number@^2.0.2, is-number@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" @@ -5861,7 +6610,14 @@ is-odd@^2.0.0: dependencies: is-number "^4.0.0" -is-plain-obj@^1.0.0: +is-path-inside@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.1.tgz#8ef5b7de50437a3fdca6b4e865ef7aa55cb48036" + integrity sha1-jvW33lBDej/cprToZe96pVy0gDY= + dependencies: + path-is-inside "^1.0.1" + +is-plain-obj@^1.0.0, is-plain-obj@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" @@ -5871,6 +6627,13 @@ is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4: dependencies: isobject "^3.0.1" +is-plain-object@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-3.0.0.tgz#47bfc5da1b5d50d64110806c199359482e75a928" + integrity sha512-tZIpofR+P05k8Aocp7UI/2UTa9lTJSebCXpFFoR9aibpokDj/uXBsJ8luUu0tTVYKkMU6URDUuOfJZ7koewXvg== + dependencies: + isobject "^4.0.0" + is-posix-bracket@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" @@ -5888,6 +6651,11 @@ is-property@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/is-property/-/is-property-1.0.2.tgz#57fe1c4e48474edd65b09911f26b1cd4095dda84" +is-redirect@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-redirect/-/is-redirect-1.0.0.tgz#1d03dded53bd8db0f30c26e4f95d36fc7c87dc24" + integrity sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ= + is-regex@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491" @@ -5900,11 +6668,21 @@ is-resolvable@^1.0.0: resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88" integrity sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg== -is-stream@^1.0.1, is-stream@^1.1.0, is-stream@~1.1.0: +is-retry-allowed@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz#11a060568b67339444033d0125a61a20d564fb34" + integrity sha1-EaBgVotnM5REAz0BJaYaINVk+zQ= + +is-stream@^1.0.0, is-stream@^1.0.1, is-stream@^1.1.0, is-stream@~1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= +is-subset@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-subset/-/is-subset-0.1.1.tgz#8a59117d932de1de00f245fcdd39ce43f1e939a6" + integrity sha1-ilkRfZMt4d4A8kX83TnOQ/HpOaY= + is-svg@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-svg/-/is-svg-2.1.0.tgz#cf61090da0d9efbcab8722deba6f032208dbb0e9" @@ -5925,6 +6703,13 @@ is-symbol@^1.0.2: dependencies: has-symbols "^1.0.0" +is-text-path@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-text-path/-/is-text-path-1.0.1.tgz#4e1aa0fb51bfbcb3e92688001397202c1775b66e" + integrity sha1-Thqg+1G/vLPpJogAE5cgLBd1tm4= + dependencies: + text-extensions "^1.0.0" + is-typedarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" @@ -5970,6 +6755,11 @@ isobject@^3.0.0, isobject@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" +isobject@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-4.0.0.tgz#3f1c9155e73b192022a80819bacd0343711697b0" + integrity sha512-S/2fF5wH8SJA/kmwr6HYhK/RI/OkhD84k8ntalo0iJjZikgq1XFvR5M8NPT1x5F7fBwCG3qHfnzeP/Vh/ZxCUA== + isomorphic-fetch@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz#611ae1acf14f5e81f729507472819fe9733558a9" @@ -5982,6 +6772,17 @@ isstream@~0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" +issue-parser@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/issue-parser/-/issue-parser-4.0.0.tgz#397817323abbb70c7c29cea2ff62448cf83b686c" + integrity sha512-1RmmAXHl5+cqTZ9dRr861xWy0Gkc9TWTEklgjKv+nhlB1dY1NmGBV8b20jTWRL5cPGpOIXkz84kEcDBM8Nc0cw== + dependencies: + lodash.capitalize "^4.2.1" + lodash.escaperegexp "^4.1.2" + lodash.isplainobject "^4.0.6" + lodash.isstring "^4.0.1" + lodash.uniqby "^4.7.0" + istanbul-lib-coverage@^2.0.2, istanbul-lib-coverage@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz#675f0ab69503fad4b1d849f736baaca803344f49" @@ -6027,6 +6828,11 @@ istanbul-reports@^2.1.1: dependencies: handlebars "^4.1.2" +java-properties@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/java-properties/-/java-properties-1.0.1.tgz#ea0b5986c0894d73cf2a44de8bd216c459a07a94" + integrity sha512-HbTaaXlIHoDVNXjmp4flOBWOfYBkrVN8dD1tp4m+95M/ADSDW/BxWbiwyVIhw/2+5d0cof4PHZCbE7+S1ukTQw== + jest-changed-files@^24.8.0: version "24.8.0" resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-24.8.0.tgz#7e7eb21cf687587a85e50f3d249d1327e15b157b" @@ -6488,7 +7294,7 @@ json-loader@^0.5.4: version "0.5.7" resolved "https://registry.yarnpkg.com/json-loader/-/json-loader-0.5.7.tgz#dca14a70235ff82f0ac9a3abeb60d337a365185d" -json-parse-better-errors@^1.0.1: +json-parse-better-errors@^1.0.0, json-parse-better-errors@^1.0.1, json-parse-better-errors@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== @@ -6525,7 +7331,7 @@ json-stable-stringify@~0.0.0: dependencies: jsonify "~0.0.0" -"json-stringify-safe@>=5.0.0 <5.1.0-0", json-stringify-safe@~5.0.1: +"json-stringify-safe@>=5.0.0 <5.1.0-0", json-stringify-safe@^5.0.1, json-stringify-safe@~5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" @@ -6614,10 +7420,22 @@ labeled-stream-splicer@^2.0.0: inherits "^2.0.1" stream-splicer "^2.0.0" +latest-version@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-3.1.0.tgz#a205383fea322b33b5ae3b18abee0dc2f356ee15" + integrity sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU= + dependencies: + package-json "^4.0.0" + lazy-cache@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" +lazy-property@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/lazy-property/-/lazy-property-1.0.0.tgz#84ddc4b370679ba8bd4cdcfa4c06b43d57111147" + integrity sha1-hN3Es3Bnm6i9TNz6TAa0PVcREUc= + lcid@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" @@ -6649,6 +7467,140 @@ levn@^0.3.0, levn@~0.3.0: prelude-ls "~1.1.2" type-check "~0.3.2" +libcipm@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/libcipm/-/libcipm-3.0.3.tgz#2e764effe0b90d458790dab3165794c804075ed3" + integrity sha512-71V5CpTI+zFydTc5IjJ/tx8JHbXEJvmYF2zaSVW1V3X1rRnRjXqh44iuiyry1xgi3ProUQ1vX1uwFiWs00+2og== + dependencies: + bin-links "^1.1.2" + bluebird "^3.5.1" + figgy-pudding "^3.5.1" + find-npm-prefix "^1.0.2" + graceful-fs "^4.1.11" + ini "^1.3.5" + lock-verify "^2.0.2" + mkdirp "^0.5.1" + npm-lifecycle "^2.0.3" + npm-logical-tree "^1.2.1" + npm-package-arg "^6.1.0" + pacote "^9.1.0" + read-package-json "^2.0.13" + rimraf "^2.6.2" + worker-farm "^1.6.0" + +libnpm@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/libnpm/-/libnpm-2.0.1.tgz#a48fcdee3c25e13c77eb7c60a0efe561d7fb0d8f" + integrity sha512-qTKoxyJvpBxHZQB6k0AhSLajyXq9ZE/lUsZzuHAplr2Bpv9G+k4YuYlExYdUCeVRRGqcJt8hvkPh4tBwKoV98w== + dependencies: + bin-links "^1.1.2" + bluebird "^3.5.3" + find-npm-prefix "^1.0.2" + libnpmaccess "^3.0.1" + libnpmconfig "^1.2.1" + libnpmhook "^5.0.2" + libnpmorg "^1.0.0" + libnpmpublish "^1.1.0" + libnpmsearch "^2.0.0" + libnpmteam "^1.0.1" + lock-verify "^2.0.2" + npm-lifecycle "^2.1.0" + npm-logical-tree "^1.2.1" + npm-package-arg "^6.1.0" + npm-profile "^4.0.1" + npm-registry-fetch "^3.8.0" + npmlog "^4.1.2" + pacote "^9.2.3" + read-package-json "^2.0.13" + stringify-package "^1.0.0" + +libnpmaccess@*, libnpmaccess@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/libnpmaccess/-/libnpmaccess-3.0.1.tgz#5b3a9de621f293d425191aa2e779102f84167fa8" + integrity sha512-RlZ7PNarCBt+XbnP7R6PoVgOq9t+kou5rvhaInoNibhPO7eMlRfS0B8yjatgn2yaHIwWNyoJDolC/6Lc5L/IQA== + dependencies: + aproba "^2.0.0" + get-stream "^4.0.0" + npm-package-arg "^6.1.0" + npm-registry-fetch "^3.8.0" + +libnpmconfig@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/libnpmconfig/-/libnpmconfig-1.2.1.tgz#c0c2f793a74e67d4825e5039e7a02a0044dfcbc0" + integrity sha512-9esX8rTQAHqarx6qeZqmGQKBNZR5OIbl/Ayr0qQDy3oXja2iFVQQI81R6GZ2a02bSNZ9p3YOGX1O6HHCb1X7kA== + dependencies: + figgy-pudding "^3.5.1" + find-up "^3.0.0" + ini "^1.3.5" + +libnpmhook@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/libnpmhook/-/libnpmhook-5.0.2.tgz#d12817b0fb893f36f1d5be20017f2aea25825d94" + integrity sha512-vLenmdFWhRfnnZiNFPNMog6CK7Ujofy2TWiM2CrpZUjBRIhHkJeDaAbJdYCT6W4lcHtyrJR8yXW8KFyq6UAp1g== + dependencies: + aproba "^2.0.0" + figgy-pudding "^3.4.1" + get-stream "^4.0.0" + npm-registry-fetch "^3.8.0" + +libnpmorg@*, libnpmorg@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/libnpmorg/-/libnpmorg-1.0.0.tgz#979b868c48ba28c5820e3bb9d9e73c883c16a232" + integrity sha512-o+4eVJBoDGMgRwh2lJY0a8pRV2c/tQM/SxlqXezjcAg26Qe9jigYVs+Xk0vvlYDWCDhP0g74J8UwWeAgsB7gGw== + dependencies: + aproba "^2.0.0" + figgy-pudding "^3.4.1" + get-stream "^4.0.0" + npm-registry-fetch "^3.8.0" + +libnpmpublish@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/libnpmpublish/-/libnpmpublish-1.1.1.tgz#ff0c6bb0b4ad2bda2ad1f5fba6760a4af37125f0" + integrity sha512-nefbvJd/wY38zdt+b9SHL6171vqBrMtZ56Gsgfd0duEKb/pB8rDT4/ObUQLrHz1tOfht1flt2zM+UGaemzAG5g== + dependencies: + aproba "^2.0.0" + figgy-pudding "^3.5.1" + get-stream "^4.0.0" + lodash.clonedeep "^4.5.0" + normalize-package-data "^2.4.0" + npm-package-arg "^6.1.0" + npm-registry-fetch "^3.8.0" + semver "^5.5.1" + ssri "^6.0.1" + +libnpmsearch@*, libnpmsearch@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/libnpmsearch/-/libnpmsearch-2.0.1.tgz#eccc73a8fbf267d765d18082b85daa2512501f96" + integrity sha512-K0yXyut9MHHCAH+DOiglQCpmBKPZXSUu76+BE2maSEfQN15OwNaA/Aiioe9lRFlVFOr7WcuJCY+VSl+gLi9NTA== + dependencies: + figgy-pudding "^3.5.1" + get-stream "^4.0.0" + npm-registry-fetch "^3.8.0" + +libnpmteam@*, libnpmteam@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/libnpmteam/-/libnpmteam-1.0.1.tgz#ff704b1b6c06ea674b3b1101ac3e305f5114f213" + integrity sha512-gDdrflKFCX7TNwOMX1snWojCoDE5LoRWcfOC0C/fqF7mBq8Uz9zWAX4B2RllYETNO7pBupBaSyBDkTAC15cAMg== + dependencies: + aproba "^2.0.0" + figgy-pudding "^3.4.1" + get-stream "^4.0.0" + npm-registry-fetch "^3.8.0" + +libnpx@^10.2.0: + version "10.2.0" + resolved "https://registry.yarnpkg.com/libnpx/-/libnpx-10.2.0.tgz#1bf4a1c9f36081f64935eb014041da10855e3102" + integrity sha512-X28coei8/XRCt15cYStbLBph+KGhFra4VQhRBPuH/HHMkC5dxM8v24RVgUsvODKCrUZ0eTgiTqJp6zbl0sskQQ== + dependencies: + dotenv "^5.0.1" + npm-package-arg "^6.0.0" + rimraf "^2.6.2" + safe-buffer "^5.1.0" + update-notifier "^2.3.0" + which "^1.3.0" + y18n "^4.0.0" + yargs "^11.0.0" + load-json-file@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" @@ -6716,28 +7668,57 @@ locate-path@^3.0.0: p-locate "^3.0.0" path-exists "^3.0.0" -lodash._baseassign@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz#8c38a099500f215ad09e59f1722fd0c52bfe0a4e" +locate-path@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" + integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== dependencies: - lodash._basecopy "^3.0.0" - lodash.keys "^3.0.0" + p-locate "^4.1.0" -lodash._basecopy@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz#8da0e6a876cf344c0ad8a54882111dd3c5c7ca36" +lock-verify@^2.0.2, lock-verify@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/lock-verify/-/lock-verify-2.1.0.tgz#fff4c918b8db9497af0c5fa7f6d71555de3ceb47" + integrity sha512-vcLpxnGvrqisKvLQ2C2v0/u7LVly17ak2YSgoK4PrdsYBXQIax19vhKiLfvKNFx7FRrpTnitrpzF/uuCMuorIg== + dependencies: + npm-package-arg "^6.1.0" + semver "^5.4.1" -lodash._bindcallback@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz#e531c27644cf8b57a99e17ed95b35c748789392e" +lockfile@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/lockfile/-/lockfile-1.0.4.tgz#07f819d25ae48f87e538e6578b6964a4981a5609" + integrity sha512-cvbTwETRfsFh4nHsL1eGWapU1XFi5Ot9E85sWAwia7Y7EgB7vfqcZhTKZ+l7hCGxSPoushMv5GKhT5PdLv03WA== + dependencies: + signal-exit "^3.0.2" -lodash._createassigner@^3.0.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/lodash._createassigner/-/lodash._createassigner-3.1.1.tgz#838a5bae2fdaca63ac22dee8e19fa4e6d6970b11" +lodash._baseindexof@*: + version "3.1.0" + resolved "https://registry.yarnpkg.com/lodash._baseindexof/-/lodash._baseindexof-3.1.0.tgz#fe52b53a1c6761e42618d654e4a25789ed61822c" + integrity sha1-/lK1OhxnYeQmGNZU5KJXie1hgiw= + +lodash._baseuniq@~4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash._baseuniq/-/lodash._baseuniq-4.6.0.tgz#0ebb44e456814af7905c6212fa2c9b2d51b841e8" + integrity sha1-DrtE5FaBSveQXGIS+iybLVG4Qeg= dependencies: - lodash._bindcallback "^3.0.0" - lodash._isiterateecall "^3.0.0" - lodash.restparam "^3.0.0" + lodash._createset "~4.0.0" + lodash._root "~3.0.0" + +lodash._bindcallback@*: + version "3.0.1" + resolved "https://registry.yarnpkg.com/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz#e531c27644cf8b57a99e17ed95b35c748789392e" + integrity sha1-5THCdkTPi1epnhftlbNcdIeJOS4= + +lodash._cacheindexof@*: + version "3.0.2" + resolved "https://registry.yarnpkg.com/lodash._cacheindexof/-/lodash._cacheindexof-3.0.2.tgz#3dc69ac82498d2ee5e3ce56091bafd2adc7bde92" + integrity sha1-PcaayCSY0u5ePOVgkbr9Ktx73pI= + +lodash._createcache@*: + version "3.1.2" + resolved "https://registry.yarnpkg.com/lodash._createcache/-/lodash._createcache-3.1.2.tgz#56d6a064017625e79ebca6b8018e17440bdcf093" + integrity sha1-VtagZAF2JeeevKa4AY4XRAvc8JM= + dependencies: + lodash._getnative "^3.0.0" lodash._createcompounder@^3.0.0: version "3.0.0" @@ -6746,38 +7727,36 @@ lodash._createcompounder@^3.0.0: lodash.deburr "^3.0.0" lodash.words "^3.0.0" -lodash._getnative@^3.0.0: +lodash._createset@~4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/lodash._createset/-/lodash._createset-4.0.3.tgz#0f4659fbb09d75194fa9e2b88a6644d363c9fe26" + integrity sha1-D0ZZ+7CddRlPqeK4imZE02PJ/iY= + +lodash._getnative@*, lodash._getnative@^3.0.0: version "3.9.1" resolved "https://registry.yarnpkg.com/lodash._getnative/-/lodash._getnative-3.9.1.tgz#570bc7dede46d61cdcde687d65d3eecbaa3aaff5" -lodash._isiterateecall@^3.0.0: - version "3.0.9" - resolved "https://registry.yarnpkg.com/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz#5203ad7ba425fae842460e696db9cf3e6aac057c" - lodash._reinterpolate@~3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" integrity sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0= -lodash._root@^3.0.0: +lodash._root@^3.0.0, lodash._root@~3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/lodash._root/-/lodash._root-3.0.1.tgz#fba1c4524c19ee9a5f8136b4609f017cf4ded692" -lodash.assign@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-3.2.0.tgz#3ce9f0234b4b2223e296b8fa0ac1fee8ebca64fa" - dependencies: - lodash._baseassign "^3.0.0" - lodash._createassigner "^3.0.0" - lodash.keys "^3.0.0" - lodash.camelcase@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-3.0.1.tgz#932c8b87f8a4377897c67197533282f97aeac298" dependencies: lodash._createcompounder "^3.0.0" -lodash.clonedeep@^4.0.1: +lodash.capitalize@^4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/lodash.capitalize/-/lodash.capitalize-4.2.1.tgz#f826c9b4e2a8511d84e3aca29db05e1a4f3b72a9" + integrity sha1-+CbJtOKoUR2E46yinbBeGk87cqk= + +lodash.clonedeep@^4.0.1, lodash.clonedeep@^4.5.0, lodash.clonedeep@~4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" @@ -6791,33 +7770,37 @@ lodash.deburr@^3.0.0: dependencies: lodash._root "^3.0.0" +lodash.escaperegexp@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz#64762c48618082518ac3df4ccf5d5886dae20347" + integrity sha1-ZHYsSGGAglGKw99Mz11YhtriA0c= + lodash.foreach@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.foreach/-/lodash.foreach-4.5.0.tgz#1a6a35eace401280c7f06dddec35165ab27e3e53" +lodash.get@^4.4.2: + version "4.4.2" + resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" + integrity sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk= + lodash.indexof@^4.0.5: version "4.0.5" resolved "https://registry.yarnpkg.com/lodash.indexof/-/lodash.indexof-4.0.5.tgz#53714adc2cddd6ed87638f893aa9b6c24e31ef3c" -lodash.isarguments@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz#2f573d85c6a24289ff00663b491c1d338ff3458a" - -lodash.isarray@^3.0.0: - version "3.0.4" - resolved "https://registry.yarnpkg.com/lodash.isarray/-/lodash.isarray-3.0.4.tgz#79e4eb88c36a8122af86f844aa9bcd851b5fbb55" - lodash.isfinite@^3.3.0: version "3.3.2" resolved "https://registry.yarnpkg.com/lodash.isfinite/-/lodash.isfinite-3.3.2.tgz#fb89b65a9a80281833f0b7478b3a5104f898ebb3" -lodash.keys@^3.0.0: - version "3.1.2" - resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-3.1.2.tgz#4dbc0472b156be50a0b286855d1bd0b0c656098a" - dependencies: - lodash._getnative "^3.0.0" - lodash.isarguments "^3.0.0" - lodash.isarray "^3.0.0" +lodash.isplainobject@^4.0.6: + version "4.0.6" + resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" + integrity sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs= + +lodash.isstring@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/lodash.isstring/-/lodash.isstring-4.0.1.tgz#d527dfb5456eca7cc9bb95d5daeaf88ba54a5451" + integrity sha1-1SfftUVuynzJu5XV2ur4i6VKVFE= lodash.map@^4.5.1: version "4.6.0" @@ -6841,21 +7824,15 @@ lodash.omit@^4.0.1: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.omit/-/lodash.omit-4.5.0.tgz#6eb19ae5a1ee1dd9df0b969e66ce0b7fa30b5e60" -lodash.pad@^4.1.0: - version "4.5.1" - resolved "https://registry.yarnpkg.com/lodash.pad/-/lodash.pad-4.5.1.tgz#4330949a833a7c8da22cc20f6a26c4d59debba70" - -lodash.padend@^4.1.0: - version "4.6.1" - resolved "https://registry.yarnpkg.com/lodash.padend/-/lodash.padend-4.6.1.tgz#53ccba047d06e158d311f45da625f4e49e6f166e" - -lodash.padstart@^4.1.0: - version "4.6.1" - resolved "https://registry.yarnpkg.com/lodash.padstart/-/lodash.padstart-4.6.1.tgz#d2e3eebff0d9d39ad50f5cbd1b52a7bce6bb611b" - -lodash.restparam@^3.0.0: +lodash.restparam@*: version "3.6.1" resolved "https://registry.yarnpkg.com/lodash.restparam/-/lodash.restparam-3.6.1.tgz#936a4e309ef330a7645ed4145986c85ae5b20805" + integrity sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU= + +lodash.set@^4.3.2: + version "4.3.2" + resolved "https://registry.yarnpkg.com/lodash.set/-/lodash.set-4.3.2.tgz#d8757b1da807dde24816b0d6a84bea1a76230b23" + integrity sha1-2HV7HagH3eJIFrDWqEvqGnYjCyM= lodash.sortby@^4.7.0: version "4.7.0" @@ -6887,36 +7864,43 @@ lodash.unescape@4.0.1: resolved "https://registry.yarnpkg.com/lodash.unescape/-/lodash.unescape-4.0.1.tgz#bf2249886ce514cda112fae9218cdc065211fc9c" integrity sha1-vyJJiGzlFM2hEvrpIYzcBlIR/Jw= -lodash.uniq@^4.5.0: +lodash.union@~4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.union/-/lodash.union-4.6.0.tgz#48bb5088409f16f1821666641c44dd1aaae3cd88" + integrity sha1-SLtQiECfFvGCFmZkHETdGqrjzYg= + +lodash.uniq@^4.5.0, lodash.uniq@~4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" +lodash.uniqby@^4.7.0: + version "4.7.0" + resolved "https://registry.yarnpkg.com/lodash.uniqby/-/lodash.uniqby-4.7.0.tgz#d99c07a669e9e6d24e1362dfe266c67616af1302" + integrity sha1-2ZwHpmnp5tJOE2Lf4mbGdhavEwI= + +lodash.without@~4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.without/-/lodash.without-4.4.0.tgz#3cd4574a00b67bae373a94b748772640507b7aac" + integrity sha1-PNRXSgC2e643OpS3SHcmQFB7eqw= + lodash.words@^3.0.0: version "3.2.0" resolved "https://registry.yarnpkg.com/lodash.words/-/lodash.words-3.2.0.tgz#4e2a8649bc08745b17c695b1a3ce8fee596623b3" dependencies: lodash._root "^3.0.0" -lodash@4.17.11, lodash@^4.15.0, lodash@^4.17.11, lodash@^4.3.0: +lodash@4.17.11, lodash@^4.15.0, lodash@^4.17.11, lodash@^4.2.1, lodash@^4.3.0: version "4.17.11" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d" integrity sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg== -lodash@^3.6.0: - version "3.10.1" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.10.1.tgz#5bf45e8e49ba4189e17d482789dfd15bd140b7b6" - -lodash@^4.0.0, lodash@^4.13.1, lodash@^4.14.0, lodash@^4.2.0: - version "4.16.4" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.16.4.tgz#01ce306b9bad1319f2a5528674f88297aeb70127" - lodash@^4.17.10, lodash@^4.17.4: version "4.17.10" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.10.tgz#1b7793cf7259ea38fb3661d4d38b3260af8ae4e7" -lodash@~1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-1.3.1.tgz#a4663b53686b895ff074e2ba504dfb76a8e2b770" +lodash@^4.2.0: + version "4.16.4" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.16.4.tgz#01ce306b9bad1319f2a5528674f88297aeb70127" log-symbols@^2.2.0: version "2.2.0" @@ -6962,7 +7946,12 @@ loud-rejection@^1.0.0: currently-unhandled "^0.4.1" signal-exit "^3.0.0" -lru-cache@^4.0.1: +lowercase-keys@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" + integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA== + +lru-cache@^4.0.1, lru-cache@^4.1.2, lru-cache@^4.1.3, lru-cache@^4.1.5: version "4.1.5" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g== @@ -6970,6 +7959,25 @@ lru-cache@^4.0.1: pseudomap "^1.0.2" yallist "^2.1.2" +lru-cache@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== + dependencies: + yallist "^3.0.2" + +macos-release@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/macos-release/-/macos-release-2.3.0.tgz#eb1930b036c0800adebccd5f17bc4c12de8bb71f" + integrity sha512-OHhSbtcviqMPt7yfw5ef5aghS2jzFVKEFyCJndQt2YpSQ9qRVSEv2axSJI1paVThEu+FFGs584h/1YhxjVqajA== + +make-dir@^1.0.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c" + integrity sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ== + dependencies: + pify "^3.0.0" + make-dir@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" @@ -6978,6 +7986,23 @@ make-dir@^2.1.0: pify "^4.0.1" semver "^5.6.0" +make-fetch-happen@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-4.0.1.tgz#141497cb878f243ba93136c83d8aba12c216c083" + integrity sha512-7R5ivfy9ilRJ1EMKIOziwrns9fGeAD4bAha8EB7BIiBBLHm2KeTUGCrICFt2rbHfzheTLynv50GnNTK1zDTrcQ== + dependencies: + agentkeepalive "^3.4.1" + cacache "^11.0.1" + http-cache-semantics "^3.8.1" + http-proxy-agent "^2.1.0" + https-proxy-agent "^2.2.1" + lru-cache "^4.1.2" + mississippi "^3.0.0" + node-fetch-npm "^2.0.2" + promise-retry "^1.1.1" + socks-proxy-agent "^4.0.0" + ssri "^6.0.0" + make-plural@^4.1.1: version "4.3.0" resolved "https://registry.yarnpkg.com/make-plural/-/make-plural-4.3.0.tgz#f23de08efdb0cac2e0c9ba9f315b0dff6b4c2735" @@ -7010,7 +8035,7 @@ map-limit@0.0.1: dependencies: once "~1.3.0" -map-obj@^1.0.0, map-obj@^1.0.1: +map-obj@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" @@ -7019,16 +8044,29 @@ map-obj@^2.0.0: resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-2.0.0.tgz#a65cd29087a92598b8791257a523e021222ac1f9" integrity sha1-plzSkIepJZi4eRJXpSPgISIqwfk= -map-stream@~0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/map-stream/-/map-stream-0.1.0.tgz#e56aa94c4c8055a16404a0674b78f215f7c8e194" - map-visit@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" dependencies: object-visit "^1.0.0" +marked-terminal@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/marked-terminal/-/marked-terminal-3.2.0.tgz#3fc91d54569332bcf096292af178d82219000474" + integrity sha512-Yr1yVS0BbDG55vx7be1D0mdv+jGs9AW563o/Tt/7FTsId2J0yqhrTeXAqq/Q0DyyXltIn6CSxzesQuFqXgafjQ== + dependencies: + ansi-escapes "^3.1.0" + cardinal "^2.1.1" + chalk "^2.4.1" + cli-table "^0.3.1" + node-emoji "^1.4.1" + supports-hyperlinks "^1.0.1" + +marked@^0.6.0: + version "0.6.2" + resolved "https://registry.yarnpkg.com/marked/-/marked-0.6.2.tgz#c574be8b545a8b48641456ca1dbe0e37b6dccc1a" + integrity sha512-LqxwVH3P/rqKX4EKGz7+c2G9r98WeM/SW34ybhgNGhUQNKtf1GmmSkJ6cDGJ/t6tiyae49qRkpyTw2B9HOrgUA== + mastarm@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/mastarm/-/mastarm-5.0.1.tgz#9b3e6431df58f791a456e62db508f4a863d84d29" @@ -7124,6 +8162,11 @@ mdn-data@~1.1.0: resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-1.1.4.tgz#50b5d4ffc4575276573c4eedb8780812a8419f01" integrity sha512-FSYbp3lyKjyj3E7fMl6rYvUdX0FBXaluGqlFoYESWQlyUTq8R+wp0rkFxoYFqZlHCvsUXGjyJmLQSnXToYhOSA== +meant@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/meant/-/meant-1.0.1.tgz#66044fea2f23230ec806fb515efea29c44d2115d" + integrity sha512-UakVLFjKkbbUwNWJ2frVLnnAtbb7D7DsloxRd3s/gDpI8rdv8W5Hp3NaDb+POBI1fQdeussER6NB8vpcRURvlg== + measure-text@^0.0.4: version "0.0.4" resolved "https://registry.yarnpkg.com/measure-text/-/measure-text-0.0.4.tgz#2bfbc3d903b2b1f247d187a29617f807104f0a52" @@ -7175,20 +8218,20 @@ memory-fs@^0.4.0, memory-fs@~0.4.1: errno "^0.1.3" readable-stream "^2.0.1" -meow@^3.3.0: - version "3.7.0" - resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb" +meow@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/meow/-/meow-4.0.1.tgz#d48598f6f4b1472f35bf6317a95945ace347f975" + integrity sha512-xcSBHD5Z86zaOc+781KrupuHAzeGXSLtiAOmBsiLDiPSaYSB6hdew2ng9EBAnZ62jagG9MHAOdxpDi/lWBFJ/A== dependencies: - camelcase-keys "^2.0.0" - decamelize "^1.1.2" + camelcase-keys "^4.0.0" + decamelize-keys "^1.0.0" loud-rejection "^1.0.0" - map-obj "^1.0.1" minimist "^1.1.3" + minimist-options "^3.0.1" normalize-package-data "^2.3.4" - object-assign "^4.0.1" - read-pkg-up "^1.0.1" - redent "^1.0.0" - trim-newlines "^1.0.0" + read-pkg-up "^3.0.0" + redent "^2.0.0" + trim-newlines "^2.0.0" merge-stream@^1.0.1: version "1.0.1" @@ -7197,6 +8240,11 @@ merge-stream@^1.0.1: dependencies: readable-stream "^2.0.1" +merge2@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.2.3.tgz#7ee99dbd69bb6481689253f018488a1b902b0ed5" + integrity sha512-gdUU1Fwj5ep4kplwcmftruWofEFt6lfpkkr3h860CXbAB9c3hGb55EOL2ali0Td5oebvW0E1+3Sr+Ur7XfKpRA== + merge@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/merge/-/merge-1.2.1.tgz#38bebf80c3220a8a487b6fcfb3941bb11720c145" @@ -7277,7 +8325,7 @@ mime-db@~1.24.0: version "1.24.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.24.0.tgz#e2d13f939f0016c6e4e9ad25a8652f126c467f0c" -mime-types@^2.1.11, mime-types@^2.1.12, mime-types@~2.1.7: +mime-types@^2.1.12, mime-types@~2.1.7: version "2.1.12" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.12.tgz#152ba256777020dd4663f54c2e7bc26381e71729" dependencies: @@ -7299,11 +8347,7 @@ mime@1.6.0: resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== -mime@^1.2.11: - version "1.3.4" - resolved "https://registry.yarnpkg.com/mime/-/mime-1.3.4.tgz#115f9e3b6b3daf2959983cb38f149a2d40eb5d53" - -mime@^2.4.0: +mime@^2.4.0, mime@^2.4.3: version "2.4.4" resolved "https://registry.yarnpkg.com/mime/-/mime-2.4.4.tgz#bd7b91135fc6b01cde3e9bae33d659b63d8857e5" integrity sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA== @@ -7334,6 +8378,14 @@ minimatch@^3.0.4: dependencies: brace-expansion "^1.1.7" +minimist-options@^3.0.1: + version "3.0.2" + resolved "https://registry.yarnpkg.com/minimist-options/-/minimist-options-3.0.2.tgz#fba4c8191339e13ecf4d61beb03f070103f3d954" + integrity sha512-FyBrT/d0d4+uiZRbqznPXqw3IpZZG3gl3wKWiX784FycUKVwBt0uLBFkQrtE4tZOrgo78nZp2jnKz3L65T5LdQ== + dependencies: + arrify "^1.0.1" + is-plain-obj "^1.1.0" + minimist@0.0.5: version "0.0.5" resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.5.tgz#d7aa327bcecf518f9106ac6b8f003fa3bcea8566" @@ -7359,12 +8411,43 @@ minipass@^2.2.1, minipass@^2.3.3: safe-buffer "^5.1.2" yallist "^3.0.0" +minipass@^2.3.5: + version "2.3.5" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.3.5.tgz#cacebe492022497f656b0f0f51e2682a9ed2d848" + integrity sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA== + dependencies: + safe-buffer "^5.1.2" + yallist "^3.0.0" + minizlib@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.1.0.tgz#11e13658ce46bc3a70a267aac58359d1e0c29ceb" dependencies: minipass "^2.2.1" +minizlib@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.2.1.tgz#dd27ea6136243c7c880684e8672bb3a45fd9b614" + integrity sha512-7+4oTUOWKg7AuL3vloEWekXY2/D20cevzsrNT2kGWm+39J9hGTCBv8VI5Pm5lXZ/o3/mdR4f8rflAPhnQb8mPA== + dependencies: + minipass "^2.2.1" + +mississippi@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-3.0.0.tgz#ea0a3291f97e0b5e8776b363d5f0a12d94c67022" + integrity sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA== + dependencies: + concat-stream "^1.5.0" + duplexify "^3.4.2" + end-of-stream "^1.1.0" + flush-write-stream "^1.0.0" + from2 "^2.1.0" + parallel-transform "^1.1.0" + pump "^3.0.0" + pumpify "^1.3.3" + stream-each "^1.1.0" + through2 "^2.0.0" + mixin-deep@^1.2.0: version "1.3.1" resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.1.tgz#a49e7268dce1a0d9698e45326c5626df3543d0fe" @@ -7378,6 +8461,11 @@ mixin-deep@^1.2.0: dependencies: minimist "0.0.8" +modify-values@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/modify-values/-/modify-values-1.0.1.tgz#b3939fa605546474e3e3e3c63d64bd43b4ee6022" + integrity sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw== + module-deps@^6.0.0: version "6.2.1" resolved "https://registry.yarnpkg.com/module-deps/-/module-deps-6.2.1.tgz#cfe558784060e926824f474b4e647287837cda50" @@ -7407,6 +8495,18 @@ mold-source-map@~0.4.0: convert-source-map "^1.1.0" through "~2.2.7" +move-concurrently@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92" + integrity sha1-viwAX9oy4LKa8fBdfEszIUxwH5I= + dependencies: + aproba "^1.1.1" + copy-concurrently "^1.0.0" + fs-write-stream-atomic "^1.0.8" + mkdirp "^0.5.1" + rimraf "^2.5.4" + run-queue "^1.0.3" + ms@0.7.1: version "0.7.1" resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.1.tgz#9cd13c03adbff25b65effde7ce864ee952017098" @@ -7424,7 +8524,7 @@ ms@2.1.1: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== -ms@^2.1.1: +ms@^2.0.0, ms@^2.1.1: version "2.1.2" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== @@ -7434,6 +8534,11 @@ mute-stream@0.0.7: resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" integrity sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s= +mute-stream@~0.0.4: + version "0.0.8" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" + integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== + nan@^2.12.1: version "2.14.0" resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.0.tgz#7818f722027b2459a86f0295d434d1fc2336c52c" @@ -7499,22 +8604,27 @@ nerf-dart@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/nerf-dart/-/nerf-dart-1.0.0.tgz#e6dab7febf5ad816ea81cf5c629c5a0ebde72c1a" -netrc@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/netrc/-/netrc-0.1.4.tgz#6be94fcaca8d77ade0a9670dc460914c94472444" - nice-try@^1.0.4: version "1.0.5" resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== -node-emoji@^1.10.0: +node-emoji@^1.10.0, node-emoji@^1.4.1: version "1.10.0" resolved "https://registry.yarnpkg.com/node-emoji/-/node-emoji-1.10.0.tgz#8886abd25d9c7bb61802a658523d1f8d2a89b2da" integrity sha512-Yt3384If5H6BYGVHiHwTL+99OzJKHhgp82S8/dktEK73T26BazdgZ4JZh92xSVtGNJvz9UbXdNAc5hcrXV42vw== dependencies: lodash.toarray "^4.4.0" +node-fetch-npm@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/node-fetch-npm/-/node-fetch-npm-2.0.2.tgz#7258c9046182dca345b4208eda918daf33697ff7" + integrity sha512-nJIxm1QmAj4v3nfCvEeCrYSoVwXyxLnaPBK5W1W5DGEJwjlKuC2VEUycGw5oxk+4zZahRrB84PUJJgEmhFTDFw== + dependencies: + encoding "^0.1.11" + json-parse-better-errors "^1.0.0" + safe-buffer "^5.1.1" + node-fetch@^1.0.1: version "1.7.3" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.3.tgz#980f6f72d85211a5347c6b2bc18c5b84c3eb47ef" @@ -7523,6 +8633,46 @@ node-fetch@^1.0.1: encoding "^0.1.11" is-stream "^1.0.1" +node-fetch@^2.3.0: + version "2.6.0" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.0.tgz#e633456386d4aa55863f676a7ab0daa8fdecb0fd" + integrity sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA== + +node-gyp@^3.8.0: + version "3.8.0" + resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-3.8.0.tgz#540304261c330e80d0d5edce253a68cb3964218c" + integrity sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA== + dependencies: + fstream "^1.0.0" + glob "^7.0.3" + graceful-fs "^4.1.2" + mkdirp "^0.5.0" + nopt "2 || 3" + npmlog "0 || 1 || 2 || 3 || 4" + osenv "0" + request "^2.87.0" + rimraf "2" + semver "~5.3.0" + tar "^2.0.0" + which "1" + +node-gyp@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-4.0.0.tgz#972654af4e5dd0cd2a19081b4b46fe0442ba6f45" + integrity sha512-2XiryJ8sICNo6ej8d0idXDEMKfVfFK7kekGCtJAuelGsYHQxhj13KTf95swTCN2dZ/4lTfZ84Fu31jqJEEgjWA== + dependencies: + glob "^7.0.3" + graceful-fs "^4.1.2" + mkdirp "^0.5.0" + nopt "2 || 3" + npmlog "0 || 1 || 2 || 3 || 4" + osenv "0" + request "^2.87.0" + rimraf "2" + semver "~5.3.0" + tar "^4.4.8" + which "1" + node-int64@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" @@ -7624,32 +8774,30 @@ node-releases@^1.1.23: dependencies: semver "^5.3.0" -node-uuid@~1.4.7: - version "1.4.7" - resolved "https://registry.yarnpkg.com/node-uuid/-/node-uuid-1.4.7.tgz#6da5a17668c4b3dd59623bda11cf7fa4c1f60a6f" - -nopt@^3.0.3, nopt@~3.0.1, nopt@~3.0.6: +"nopt@2 || 3", nopt@~3.0.1, nopt@~3.0.6: version "3.0.6" resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" dependencies: abbrev "1" -nopt@^4.0.1: +nopt@^4.0.1, nopt@~4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" dependencies: abbrev "1" osenv "^0.1.4" -normalize-package-data@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-1.0.3.tgz#8be955b8907af975f1a4584ea8bb9b41492312f5" +normalize-package-data@^2.0.0, normalize-package-data@^2.4.0, normalize-package-data@^2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" + integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== dependencies: - github-url-from-git "^1.3.0" - github-url-from-username-repo "^1.0.0" - semver "2 || 3 || 4" + hosted-git-info "^2.1.4" + resolve "^1.10.0" + semver "2 || 3 || 4 || 5" + validate-npm-package-license "^3.0.1" -normalize-package-data@^2.3.2, normalize-package-data@^2.3.4, "normalize-package-data@~1.0.1 || ^2.0.0": +normalize-package-data@^2.3.2, normalize-package-data@^2.3.4: version "2.3.5" resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.3.5.tgz#8d924f142960e1777e7ffe170543631cc7cb02df" dependencies: @@ -7691,16 +8839,71 @@ normalize-url@^3.0.0: resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-3.3.0.tgz#b2e1c4dc4f7c6d57743df733a4f5978d18650559" integrity sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg== +normalize-url@^4.0.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.3.0.tgz#9c49e10fc1876aeb76dba88bf1b2b5d9fa57b2ee" + integrity sha512-0NLtR71o4k6GLP+mr6Ty34c5GA6CMoEsncKJxvQd8NzPxaHRJNnb5gZE8R1XF4CPIS7QPHLJ74IFszwtNVAHVQ== + +npm-audit-report@^1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/npm-audit-report/-/npm-audit-report-1.3.2.tgz#303bc78cd9e4c226415076a4f7e528c89fc77018" + integrity sha512-abeqS5ONyXNaZJPGAf6TOUMNdSe1Y6cpc9MLBRn+CuUoYbfdca6AxOyXVlfIv9OgKX+cacblbG5w7A6ccwoTPw== + dependencies: + cli-table3 "^0.5.0" + console-control-strings "^1.1.0" + npm-bundled@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.3.tgz#7e71703d973af3370a9591bafe3a63aca0be2308" -"npm-package-arg@^3.0.0 || ^4.0.0": - version "4.2.0" - resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-4.2.0.tgz#809bc61cabf54bd5ff94f6165c89ba8ee88c115c" +npm-cache-filename@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/npm-cache-filename/-/npm-cache-filename-1.0.2.tgz#ded306c5b0bfc870a9e9faf823bc5f283e05ae11" + integrity sha1-3tMGxbC/yHCp6fr4I7xfKD4FrhE= + +npm-install-checks@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/npm-install-checks/-/npm-install-checks-3.0.0.tgz#d4aecdfd51a53e3723b7b2f93b2ee28e307bc0d7" + integrity sha1-1K7N/VGlPjcjt7L5Oy7ijjB7wNc= dependencies: - hosted-git-info "^2.1.5" - semver "^5.1.0" + semver "^2.3.0 || 3.x || 4 || 5" + +npm-lifecycle@^2.0.3, npm-lifecycle@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/npm-lifecycle/-/npm-lifecycle-2.1.1.tgz#0027c09646f0fd346c5c93377bdaba59c6748fdf" + integrity sha512-+Vg6I60Z75V/09pdcH5iUo/99Q/vop35PaI99elvxk56azSVVsdsSsS/sXqKDNwbRRNN1qSxkcO45ZOu0yOWew== + dependencies: + byline "^5.0.0" + graceful-fs "^4.1.15" + node-gyp "^4.0.0" + resolve-from "^4.0.0" + slide "^1.1.6" + uid-number "0.0.6" + umask "^1.1.0" + which "^1.3.1" + +npm-logical-tree@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/npm-logical-tree/-/npm-logical-tree-1.2.1.tgz#44610141ca24664cad35d1e607176193fd8f5b88" + integrity sha512-AJI/qxDB2PWI4LG1CYN579AY1vCiNyWfkiquCsJWqntRu/WwimVrC8yXeILBFHDwxfOejxewlmnvW9XXjMlYIg== + +"npm-package-arg@^4.0.0 || ^5.0.0 || ^6.0.0", npm-package-arg@^6.0.0, npm-package-arg@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-6.1.0.tgz#15ae1e2758a5027efb4c250554b85a737db7fcc1" + integrity sha512-zYbhP2k9DbJhA0Z3HKUePUgdB1x7MfIfKssC+WLPFMKTBZKpZh5m13PgexJjCq6KW7j17r0jHWcCpxEqnnncSA== + dependencies: + hosted-git-info "^2.6.0" + osenv "^0.1.5" + semver "^5.5.0" + validate-npm-package-name "^3.0.0" + +npm-packlist@^1.1.12, npm-packlist@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.4.1.tgz#19064cdf988da80ea3cee45533879d90192bbfbc" + integrity sha512-+TcdO7HJJ8peiiYhvPxsEDhF3PJFGUGRcFsGve3vxvxdcpO2Z4Z7rkosRM0kWj6LfbK/P0gu3dzk5RU1ffvFcw== + dependencies: + ignore-walk "^3.0.1" + npm-bundled "^1.0.1" npm-packlist@^1.1.6: version "1.1.10" @@ -7709,21 +8912,35 @@ npm-packlist@^1.1.6: ignore-walk "^3.0.1" npm-bundled "^1.0.1" -npm-registry-client@^7.0.1: - version "7.2.1" - resolved "https://registry.yarnpkg.com/npm-registry-client/-/npm-registry-client-7.2.1.tgz#c792266b088cc313f8525e7e35248626c723db75" +npm-pick-manifest@^2.2.3: + version "2.2.3" + resolved "https://registry.yarnpkg.com/npm-pick-manifest/-/npm-pick-manifest-2.2.3.tgz#32111d2a9562638bb2c8f2bf27f7f3092c8fae40" + integrity sha512-+IluBC5K201+gRU85vFlUwX3PFShZAbAgDNp2ewJdWMVSppdo/Zih0ul2Ecky/X7b51J7LrrUAP+XOmOCvYZqA== dependencies: - concat-stream "^1.5.2" - graceful-fs "^4.1.6" - normalize-package-data "~1.0.1 || ^2.0.0" - npm-package-arg "^3.0.0 || ^4.0.0" - once "^1.3.3" - request "^2.74.0" - retry "^0.10.0" - semver "2 >=2.2.1 || 3.x || 4 || 5" - slide "^1.1.3" - optionalDependencies: - npmlog "~2.0.0 || ~3.1.0" + figgy-pudding "^3.5.1" + npm-package-arg "^6.0.0" + semver "^5.4.1" + +npm-profile@*, npm-profile@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/npm-profile/-/npm-profile-4.0.1.tgz#d350f7a5e6b60691c7168fbb8392c3603583f5aa" + integrity sha512-NQ1I/1Q7YRtHZXkcuU1/IyHeLy6pd+ScKg4+DQHdfsm769TGq6HPrkbuNJVJS4zwE+0mvvmeULzQdWn2L2EsVA== + dependencies: + aproba "^1.1.2 || 2" + figgy-pudding "^3.4.1" + npm-registry-fetch "^3.8.0" + +npm-registry-fetch@^3.8.0, npm-registry-fetch@^3.9.0: + version "3.9.0" + resolved "https://registry.yarnpkg.com/npm-registry-fetch/-/npm-registry-fetch-3.9.0.tgz#44d841780e2833f06accb34488f8c7450d1a6856" + integrity sha512-srwmt8YhNajAoSAaDWndmZgx89lJwIZ1GWxOuckH4Coek4uHv5S+o/l9FLQe/awA+JwTnj4FJHldxhlXdZEBmw== + dependencies: + JSONStream "^1.3.4" + bluebird "^3.5.1" + figgy-pudding "^3.4.1" + lru-cache "^4.1.3" + make-fetch-happen "^4.0.1" + npm-package-arg "^6.1.0" npm-run-path@^2.0.0: version "2.0.2" @@ -7732,38 +8949,126 @@ npm-run-path@^2.0.0: dependencies: path-key "^2.0.0" -npmconf@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/npmconf/-/npmconf-2.1.2.tgz#66606a4a736f1e77a059aa071a79c94ab781853a" - dependencies: - config-chain "~1.1.8" - inherits "~2.0.0" - ini "^1.2.0" - mkdirp "^0.5.0" - nopt "~3.0.1" - once "~1.3.0" - osenv "^0.1.0" - semver "2 || 3 || 4" - uid-number "0.0.5" - -npmlog@4.x, npmlog@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.0.0.tgz#e094503961c70c1774eb76692080e8d578a9f88f" - dependencies: - are-we-there-yet "~1.1.2" - console-control-strings "~1.1.0" - gauge "~2.6.0" - set-blocking "~2.0.0" - -npmlog@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-1.2.1.tgz#28e7be619609b53f7ad1dd300a10d64d716268b6" - dependencies: - ansi "~0.3.0" - are-we-there-yet "~1.0.0" - gauge "~1.2.0" +npm-user-validate@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/npm-user-validate/-/npm-user-validate-1.0.0.tgz#8ceca0f5cea04d4e93519ef72d0557a75122e951" + integrity sha1-jOyg9c6gTU6TUZ73LQVXp1Ei6VE= + +npm@^6.8.0: + version "6.9.0" + resolved "https://registry.yarnpkg.com/npm/-/npm-6.9.0.tgz#5296720486814a64a7fb082de00c4b5cfd11211f" + integrity sha512-91V+zB5hDxO+Jyp2sUKS7juHlIM95dGQxTeQtmZI1nAI/7kjWXFipPrtwwKjhyKmV4GsS2LzJhrxRjGWsU9z/w== + dependencies: + JSONStream "^1.3.5" + abbrev "~1.1.1" + ansicolors "~0.3.2" + ansistyles "~0.1.3" + aproba "^2.0.0" + archy "~1.0.0" + bin-links "^1.1.2" + bluebird "^3.5.3" + byte-size "^5.0.1" + cacache "^11.3.2" + call-limit "~1.1.0" + chownr "^1.1.1" + ci-info "^2.0.0" + cli-columns "^3.1.2" + cli-table3 "^0.5.1" + cmd-shim "~2.0.2" + columnify "~1.5.4" + config-chain "^1.1.12" + detect-indent "~5.0.0" + detect-newline "^2.1.0" + dezalgo "~1.0.3" + editor "~1.0.0" + figgy-pudding "^3.5.1" + find-npm-prefix "^1.0.2" + fs-vacuum "~1.2.10" + fs-write-stream-atomic "~1.0.10" + gentle-fs "^2.0.1" + glob "^7.1.3" + graceful-fs "^4.1.15" + has-unicode "~2.0.1" + hosted-git-info "^2.7.1" + iferr "^1.0.2" + inflight "~1.0.6" + inherits "~2.0.3" + ini "^1.3.5" + init-package-json "^1.10.3" + is-cidr "^3.0.0" + json-parse-better-errors "^1.0.2" + lazy-property "~1.0.0" + libcipm "^3.0.3" + libnpm "^2.0.1" + libnpmhook "^5.0.2" + libnpx "^10.2.0" + lock-verify "^2.1.0" + lockfile "^1.0.4" + lodash._baseuniq "~4.6.0" + lodash.clonedeep "~4.5.0" + lodash.union "~4.6.0" + lodash.uniq "~4.5.0" + lodash.without "~4.4.0" + lru-cache "^4.1.5" + meant "~1.0.1" + mississippi "^3.0.0" + mkdirp "~0.5.1" + move-concurrently "^1.0.1" + node-gyp "^3.8.0" + nopt "~4.0.1" + normalize-package-data "^2.5.0" + npm-audit-report "^1.3.2" + npm-cache-filename "~1.0.2" + npm-install-checks "~3.0.0" + npm-lifecycle "^2.1.0" + npm-package-arg "^6.1.0" + npm-packlist "^1.4.1" + npm-pick-manifest "^2.2.3" + npm-registry-fetch "^3.9.0" + npm-user-validate "~1.0.0" + npmlog "~4.1.2" + once "~1.4.0" + opener "^1.5.1" + osenv "^0.1.5" + pacote "^9.5.0" + path-is-inside "~1.0.2" + promise-inflight "~1.0.1" + qrcode-terminal "^0.12.0" + query-string "^6.2.0" + qw "~1.0.1" + read "~1.0.7" + read-cmd-shim "~1.0.1" + read-installed "~4.0.3" + read-package-json "^2.0.13" + read-package-tree "^5.2.2" + readable-stream "^3.1.1" + request "^2.88.0" + retry "^0.12.0" + rimraf "^2.6.3" + safe-buffer "^5.1.2" + semver "^5.6.0" + sha "~2.0.1" + slide "~1.1.6" + sorted-object "~2.0.1" + sorted-union-stream "~2.1.3" + ssri "^6.0.1" + stringify-package "^1.0.0" + tar "^4.4.8" + text-table "~0.2.0" + tiny-relative-date "^1.3.0" + uid-number "0.0.6" + umask "~1.1.0" + unique-filename "^1.1.1" + unpipe "~1.0.0" + update-notifier "^2.5.0" + uuid "^3.3.2" + validate-npm-package-license "^3.0.4" + validate-npm-package-name "~3.0.0" + which "^1.3.1" + worker-farm "^1.6.0" + write-file-atomic "^2.4.2" -npmlog@^4.0.2: +"npmlog@0 || 1 || 2 || 3 || 4", npmlog@^4.0.2, npmlog@^4.1.2, npmlog@~4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" dependencies: @@ -7772,9 +9077,9 @@ npmlog@^4.0.2: gauge "~2.7.3" set-blocking "~2.0.0" -"npmlog@~2.0.0 || ~3.1.0": - version "3.1.2" - resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-3.1.2.tgz#2d46fa874337af9498a2f12bb43d8d0be4a36873" +npmlog@4.x: + version "4.0.0" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.0.0.tgz#e094503961c70c1774eb76692080e8d578a9f88f" dependencies: are-we-there-yet "~1.1.2" console-control-strings "~1.1.0" @@ -7879,6 +9184,11 @@ object.values@^1.1.0: function-bind "^1.1.1" has "^1.0.3" +octokit-pagination-methods@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/octokit-pagination-methods/-/octokit-pagination-methods-1.1.0.tgz#cf472edc9d551055f9ef73f6e42b4dbb4c80bea4" + integrity sha512-fZ4qZdQ2nxJvtcasX7Ghl+WlWS/d9IgnBIwFZXVNNZUmzpno91SX5bc5vuxiuKoCtK78XxGGNuSCrDC7xYB3OQ== + on-finished@^2.3.0, on-finished@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" @@ -7891,7 +9201,7 @@ on-headers@^1.0.1: resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== -once@^1.3.0, once@^1.3.1, once@^1.3.2, once@^1.3.3, once@^1.4.0: +once@^1.3.0, once@^1.3.1, once@^1.3.2, once@^1.4.0, once@~1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" dependencies: @@ -7910,6 +9220,11 @@ onetime@^2.0.0: dependencies: mimic-fn "^1.0.0" +opener@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.1.tgz#6d2f0e77f1a0af0032aca716c2c1fbb8e7e8abed" + integrity sha512-goYSy5c2UXE4Ra1xixabeVh1guIX/ZV/YokJksb6q2lubWu6UbvPQ20p542/sFIll1nl8JnCyK9oBaOcCWXwvA== + opn@^3.0.2: version "3.0.3" resolved "https://registry.yarnpkg.com/opn/-/opn-3.0.3.tgz#b6d99e7399f78d65c3baaffef1fb288e9b85243a" @@ -7965,7 +9280,7 @@ os-locale@^2.0.0: lcid "^1.0.0" mem "^1.1.0" -os-locale@^3.0.0: +os-locale@^3.0.0, os-locale@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-3.1.0.tgz#a802a6ee17f24c10483ab9935719cef4ed16bf1a" integrity sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q== @@ -7974,18 +9289,19 @@ os-locale@^3.0.0: lcid "^2.0.0" mem "^4.0.0" +os-name@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/os-name/-/os-name-3.1.0.tgz#dec19d966296e1cd62d701a5a66ee1ddeae70801" + integrity sha512-h8L+8aNjNcMpo/mAIBPn5PXCM16iyPGjHNWo6U1YO8sJTMHtEtyczI6QJnLoplswm6goopQkqc7OAnjhWcugVg== + dependencies: + macos-release "^2.2.0" + windows-release "^3.1.0" + os-tmpdir@^1.0.0, os-tmpdir@^1.0.1, os-tmpdir@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" -osenv@^0.1.0: - version "0.1.3" - resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.3.tgz#83cf05c6d6458fc4d5ac6362ea325d92f2754217" - dependencies: - os-homedir "^1.0.0" - os-tmpdir "^1.0.0" - -osenv@^0.1.4: +osenv@0, osenv@^0.1.4, osenv@^0.1.5: version "0.1.5" resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" dependencies: @@ -8019,6 +9335,13 @@ p-each-series@^1.0.0: dependencies: p-reduce "^1.0.0" +p-filter@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/p-filter/-/p-filter-2.1.0.tgz#1b1472562ae7a0f742f0f3d3d3718ea66ff9c09c" + integrity sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw== + dependencies: + p-map "^2.0.0" + p-finally@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" @@ -8036,7 +9359,7 @@ p-limit@^1.1.0: dependencies: p-try "^1.0.0" -p-limit@^2.0.0: +p-limit@^2.0.0, p-limit@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.2.0.tgz#417c9941e6027a9abcba5092dd2904e255b5fbc2" integrity sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ== @@ -8057,11 +9380,36 @@ p-locate@^3.0.0: dependencies: p-limit "^2.0.0" +p-locate@^4.0.0, p-locate@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" + integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== + dependencies: + p-limit "^2.2.0" + +p-map@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-2.1.0.tgz#310928feef9c9ecc65b68b17693018a665cea175" + integrity sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw== + p-reduce@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-reduce/-/p-reduce-1.0.0.tgz#18c2b0dd936a4690a529f8231f58a0fdb6a47dfa" integrity sha1-GMKw3ZNqRpClKfgjH1ig/bakffo= +p-reduce@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/p-reduce/-/p-reduce-2.1.0.tgz#09408da49507c6c274faa31f28df334bc712b64a" + integrity sha512-2USApvnsutq8uoxZBGbbWM0JIYLiEMJ9RlaN7fAzVNb9OZN0SHjjTTfIcb667XynS5Y1VhwDJVDa72TnPzAYWw== + +p-retry@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-4.1.0.tgz#9ce7cef2069e84bf590df3b8ec18d740109338d6" + integrity sha512-oepllyG9gX1qH4Sm20YAKxg1GA7L7puhvGnTfimi31P07zSIj7SDV6YtuAx9nbJF51DES+2CIIRkXs8GKqWJxA== + dependencies: + "@types/retry" "^0.12.0" + retry "^0.12.0" + p-try@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" @@ -8072,6 +9420,49 @@ p-try@^2.0.0: resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== +package-json@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/package-json/-/package-json-4.0.1.tgz#8869a0401253661c4c4ca3da6c2121ed555f5eed" + integrity sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0= + dependencies: + got "^6.7.1" + registry-auth-token "^3.0.1" + registry-url "^3.0.3" + semver "^5.1.0" + +pacote@^9.1.0, pacote@^9.2.3, pacote@^9.5.0: + version "9.5.1" + resolved "https://registry.yarnpkg.com/pacote/-/pacote-9.5.1.tgz#adb0d23daeef6d0b813ab5891d0c6459ccec998d" + integrity sha512-Zqvczvf/zZ7QNosdE9uTC7SRuvSs9tFqRkF6cJl+2HH7COBnx4BRAGpeXJlrbN+mM0CMHpbi620xdEHhCflghA== + dependencies: + bluebird "^3.5.3" + cacache "^11.3.2" + figgy-pudding "^3.5.1" + get-stream "^4.1.0" + glob "^7.1.3" + lru-cache "^5.1.1" + make-fetch-happen "^4.0.1" + minimatch "^3.0.4" + minipass "^2.3.5" + mississippi "^3.0.0" + mkdirp "^0.5.1" + normalize-package-data "^2.4.0" + npm-package-arg "^6.1.0" + npm-packlist "^1.1.12" + npm-pick-manifest "^2.2.3" + npm-registry-fetch "^3.8.0" + osenv "^0.1.5" + promise-inflight "^1.0.1" + promise-retry "^1.1.1" + protoduck "^5.0.1" + rimraf "^2.6.2" + safe-buffer "^5.1.2" + semver "^5.6.0" + ssri "^6.0.1" + tar "^4.4.8" + unique-filename "^1.1.1" + which "^1.3.1" + pad-left@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/pad-left/-/pad-left-2.1.0.tgz#16e6a3b2d44a8e138cb0838cc7cb403a4fc9e994" @@ -8090,6 +9481,15 @@ pako@~1.0.5: version "1.0.6" resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.6.tgz#0101211baa70c4bca4a0f63f2206e97b7dfaf258" +parallel-transform@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/parallel-transform/-/parallel-transform-1.1.0.tgz#d410f065b05da23081fcd10f28854c29bda33b06" + integrity sha1-1BDwZbBdojCB/NEPKIVMKb2jOwY= + dependencies: + cyclist "~0.2.2" + inherits "^2.0.3" + readable-stream "^2.1.5" + parent-module@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" @@ -8114,9 +9514,10 @@ parse-asn1@^5.0.0: evp_bytestokey "^1.0.0" pbkdf2 "^3.0.3" -parse-github-repo-url@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/parse-github-repo-url/-/parse-github-repo-url-1.3.0.tgz#d4de02d68e2e60f0d6a182e7a8cb21b6f38c730b" +parse-github-url@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/parse-github-url/-/parse-github-url-1.0.2.tgz#242d3b65cbcdda14bb50439e3242acf6971db395" + integrity sha512-kgBf6avCbO3Cn6+RnzRGLkUsv4ZVqv/VfAYkRsyBcgkshNvVBkRn1FEZcW0Jb+npXQWm2vHPnnOqFteZxRRGNw== parse-glob@^3.0.4: version "3.0.4" @@ -8189,11 +9590,16 @@ path-exists@^3.0.0: resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + path-is-absolute@^1.0.0, path-is-absolute@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" -path-is-inside@^1.0.2: +path-is-inside@^1.0.1, path-is-inside@^1.0.2, path-is-inside@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM= @@ -8203,13 +9609,6 @@ path-key@^2.0.0, path-key@^2.0.1: resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= -path-object@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/path-object/-/path-object-2.3.0.tgz#03e46653e5c375c60af1cabdd94bc6448a5d9110" - dependencies: - core-util-is "^1.0.1" - lodash.assign "^3.0.0" - path-parse@^1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" @@ -8242,12 +9641,6 @@ path-type@^3.0.0: dependencies: pify "^3.0.0" -pause-stream@0.0.11: - version "0.0.11" - resolved "https://registry.yarnpkg.com/pause-stream/-/pause-stream-0.0.11.tgz#fe5a34b0cbce12b5aa6a2b403ee2e73b602f1445" - dependencies: - through "~2.3" - pbkdf2@^3.0.3: version "3.0.9" resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.9.tgz#f2c4b25a600058b3c3773c086c37dbbee1ffe693" @@ -8300,6 +9693,14 @@ pirates@^4.0.1: dependencies: node-modules-regexp "^1.0.0" +pkg-conf@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/pkg-conf/-/pkg-conf-2.1.0.tgz#2126514ca6f2abfebd168596df18ba57867f0058" + integrity sha1-ISZRTKbyq/69FoWW3xi6V4Z/AFg= + dependencies: + find-up "^2.0.0" + load-json-file "^4.0.0" + pkg-dir@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-1.0.0.tgz#7a4b508a8d5bb2d629d447056ff4e9c9314cf3d4" @@ -9181,7 +10582,7 @@ prelude-ls@~1.1.2: resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= -prepend-http@^1.0.0: +prepend-http@^1.0.0, prepend-http@^1.0.1: version "1.0.4" resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" @@ -9298,6 +10699,19 @@ progress@^2.0.0: resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== +promise-inflight@^1.0.1, promise-inflight@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" + integrity sha1-mEcocL8igTL8vdhoEputEsPAKeM= + +promise-retry@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/promise-retry/-/promise-retry-1.1.1.tgz#6739e968e3051da20ce6497fb2b50f6911df3d6d" + integrity sha1-ZznpaOMFHaIM5kl/srUPaRHfPW0= + dependencies: + err-code "^1.0.0" + retry "^0.10.0" + prompts@^2.0.1: version "2.1.0" resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.1.0.tgz#bf90bc71f6065d255ea2bdc0fe6520485c1b45db" @@ -9306,6 +10720,13 @@ prompts@^2.0.1: kleur "^3.0.2" sisteransi "^1.0.0" +promzard@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/promzard/-/promzard-0.3.0.tgz#26a5d6ee8c7dee4cb12208305acfb93ba382a9ee" + integrity sha1-JqXW7ox97kyxIggwWs+5O6OCqe4= + dependencies: + read "1" + prop-types@^15.7.2: version "15.7.2" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5" @@ -9319,6 +10740,13 @@ proto-list@~1.2.1: version "1.2.4" resolved "https://registry.yarnpkg.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849" +protoduck@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/protoduck/-/protoduck-5.0.1.tgz#03c3659ca18007b69a50fd82a7ebcc516261151f" + integrity sha512-WxoCeDCoCBY55BMvj4cAEjdVUFGRWed9ZxPlqTKYyw1nDDTQ4pqmnIMAGfJlg7Dx35uB/M+PHJPTmGOvaCaPTg== + dependencies: + genfun "^5.0.0" + prr@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" @@ -9343,6 +10771,14 @@ public-encrypt@^4.0.0: parse-asn1 "^5.0.0" randombytes "^2.0.1" +pump@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pump/-/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909" + integrity sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + pump@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" @@ -9351,6 +10787,15 @@ pump@^3.0.0: end-of-stream "^1.1.0" once "^1.3.1" +pumpify@^1.3.3: + version "1.5.1" + resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-1.5.1.tgz#36513be246ab27570b1a374a5ce278bfd74370ce" + integrity sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ== + dependencies: + duplexify "^3.6.0" + inherits "^2.0.3" + pump "^2.0.0" + punycode@1.3.2: version "1.3.2" resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" @@ -9364,13 +10809,14 @@ punycode@^2.1.0, punycode@^2.1.1: resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== -q@^1.1.2: +q@^1.1.2, q@^1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" -qs@~6.2.0: - version "6.2.1" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.2.1.tgz#ce03c5ff0935bc1d9d69a9f14cbd18e568d67625" +qrcode-terminal@^0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/qrcode-terminal/-/qrcode-terminal-0.12.0.tgz#bb5b699ef7f9f0505092a3748be4464fe71b5819" + integrity sha512-EXtzRZmC+YGmGlDFbXKxQiMZNwCLEO6BANKXG4iCtSIM0yqc/pappSx3RIKr4r0uh5JsBckOXeKrB3Iz7mdQpQ== qs@~6.3.0: version "6.3.0" @@ -9388,6 +10834,15 @@ query-string@^4.1.0, query-string@^4.2.3: object-assign "^4.1.0" strict-uri-encode "^1.0.0" +query-string@^6.2.0: + version "6.7.0" + resolved "https://registry.yarnpkg.com/query-string/-/query-string-6.7.0.tgz#7e92bf8525140cf8c5ebf500f26716b0de5b7023" + integrity sha512-oQ01H1jrgDRbPq5SjtJF470S418GOrKkds+fpvAt6DQatHXl7bmkaJulHbTIM+QNGtoPpa8f5k9W3Zk50zXRPQ== + dependencies: + decode-uri-component "^0.2.0" + split-on-first "^1.0.0" + strict-uri-encode "^2.0.0" + querystring-es3@^0.2.0, querystring-es3@~0.2.0: version "0.2.1" resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" @@ -9401,6 +10856,11 @@ quick-lru@^1.0.0: resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-1.1.0.tgz#4360b17c61136ad38078397ff11416e186dcfbb8" integrity sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g= +qw@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/qw/-/qw-1.0.1.tgz#efbfdc740f9ad054304426acb183412cc8b996d4" + integrity sha1-77/cdA+a0FQwRCassYNBLMi5ltQ= + randomatic@^1.1.3: version "1.1.5" resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-1.1.5.tgz#5e9ef5f2d573c67bd2b8124ae90b5156e457840b" @@ -9430,7 +10890,7 @@ range-parser@~1.2.1: resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== -rc@^1.2.7: +rc@^1.0.1, rc@^1.1.6, rc@^1.2.7, rc@^1.2.8: version "1.2.8" resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" dependencies: @@ -9460,6 +10920,27 @@ read-cache@^1.0.0: dependencies: pify "^2.3.0" +read-cmd-shim@^1.0.1, read-cmd-shim@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/read-cmd-shim/-/read-cmd-shim-1.0.1.tgz#2d5d157786a37c055d22077c32c53f8329e91c7b" + integrity sha1-LV0Vd4ajfAVdIgd8MsU/gynpHHs= + dependencies: + graceful-fs "^4.1.2" + +read-installed@~4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/read-installed/-/read-installed-4.0.3.tgz#ff9b8b67f187d1e4c29b9feb31f6b223acd19067" + integrity sha1-/5uLZ/GH0eTCm5/rMfayI6zRkGc= + dependencies: + debuglog "^1.0.1" + read-package-json "^2.0.0" + readdir-scoped-modules "^1.0.0" + semver "2 || 3 || 4 || 5" + slide "~1.1.3" + util-extend "^1.0.1" + optionalDependencies: + graceful-fs "^4.1.2" + read-only-stream@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/read-only-stream/-/read-only-stream-2.0.0.tgz#2724fd6a8113d73764ac288d4386270c1dbf17f0" @@ -9467,6 +10948,29 @@ read-only-stream@^2.0.0: dependencies: readable-stream "^2.0.2" +"read-package-json@1 || 2", read-package-json@^2.0.0, read-package-json@^2.0.13: + version "2.0.13" + resolved "https://registry.yarnpkg.com/read-package-json/-/read-package-json-2.0.13.tgz#2e82ebd9f613baa6d2ebe3aa72cefe3f68e41f4a" + integrity sha512-/1dZ7TRZvGrYqE0UAfN6qQb5GYBsNcqS1C0tNK601CFOJmtHI7NIGXwetEPU/OtoFHZL3hDxm4rolFFVE9Bnmg== + dependencies: + glob "^7.1.1" + json-parse-better-errors "^1.0.1" + normalize-package-data "^2.0.0" + slash "^1.0.0" + optionalDependencies: + graceful-fs "^4.1.2" + +read-package-tree@^5.2.2: + version "5.2.2" + resolved "https://registry.yarnpkg.com/read-package-tree/-/read-package-tree-5.2.2.tgz#4b6a0ef2d943c1ea36a578214c9a7f6b7424f7a8" + integrity sha512-rW3XWUUkhdKmN2JKB4FL563YAgtINifso5KShykufR03nJ5loGFlkUMe1g/yxmqX073SoYYTsgXu7XdDinKZuA== + dependencies: + debuglog "^1.0.1" + dezalgo "^1.0.0" + once "^1.3.0" + read-package-json "^2.0.0" + readdir-scoped-modules "^1.0.0" + read-pkg-up@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" @@ -9482,6 +10986,14 @@ read-pkg-up@^2.0.0: find-up "^2.0.0" read-pkg "^2.0.0" +read-pkg-up@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-3.0.0.tgz#3ed496685dba0f8fe118d0691dc51f4a1ff96f07" + integrity sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc= + dependencies: + find-up "^2.0.0" + read-pkg "^3.0.0" + read-pkg-up@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-4.0.0.tgz#1b221c6088ba7799601c808f91161c66e58f8978" @@ -9490,6 +11002,15 @@ read-pkg-up@^4.0.0: find-up "^3.0.0" read-pkg "^3.0.0" +read-pkg-up@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-6.0.0.tgz#da75ce72762f2fa1f20c5a40d4dd80c77db969e3" + integrity sha512-odtTvLl+EXo1eTsMnoUHRmg/XmXdTkwXVxy4VFE9Kp6cCq7b3l7QMdBndND3eAFzrbSAXC/WCUOQQ9rLjifKZw== + dependencies: + find-up "^4.0.0" + read-pkg "^5.1.1" + type-fest "^0.5.0" + read-pkg@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" @@ -9516,7 +11037,36 @@ read-pkg@^3.0.0: normalize-package-data "^2.3.2" path-type "^3.0.0" -"readable-stream@2 || 3", readable-stream@^3.0.2: +read-pkg@^5.0.0, read-pkg@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-5.1.1.tgz#5cf234dde7a405c90c88a519ab73c467e9cb83f5" + integrity sha512-dFcTLQi6BZ+aFUaICg7er+/usEoqFdQxiEBsEMNGoipenihtxxtdrQuBXvyANCEI8VuUIVYFgeHGx9sLLvim4w== + dependencies: + "@types/normalize-package-data" "^2.4.0" + normalize-package-data "^2.5.0" + parse-json "^4.0.0" + type-fest "^0.4.1" + +read@1, read@~1.0.1, read@~1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/read/-/read-1.0.7.tgz#b3da19bd052431a97671d44a42634adf710b40c4" + integrity sha1-s9oZvQUkMal2cdRKQmNK33ELQMQ= + dependencies: + mute-stream "~0.0.4" + +"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.6, readable-stream@~2.3.6: + version "2.3.6" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + +"readable-stream@2 || 3", readable-stream@^3.0.2, readable-stream@^3.1.1: version "3.4.0" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.4.0.tgz#a51c26754658e0a3c21dbf59163bd45ba6f447fc" integrity sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ== @@ -9535,18 +11085,6 @@ read-pkg@^3.0.0: isarray "0.0.1" string_decoder "~0.10.x" -readable-stream@^2.0.0, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.6, readable-stream@~2.3.6: - version "2.3.6" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.3" - isarray "~1.0.0" - process-nextick-args "~2.0.0" - safe-buffer "~5.1.1" - string_decoder "~1.1.1" - util-deprecate "~1.0.1" - "readable-stream@^2.0.0 || ^1.1.13", readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@~2.1.4: version "2.1.5" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.1.5.tgz#66fa8b720e1438b364681f2ad1a63c618448c9d0" @@ -9559,7 +11097,17 @@ readable-stream@^2.0.0, readable-stream@^2.2.2, readable-stream@^2.3.3, readable string_decoder "~0.10.x" util-deprecate "~1.0.1" -readable-stream@~2.0.0, readable-stream@~2.0.5: +readable-stream@~1.1.10: + version "1.1.14" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9" + integrity sha1-fPTFTvZI44EwhMY23SB54WbAgdk= + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "0.0.1" + string_decoder "~0.10.x" + +readable-stream@~2.0.0: version "2.0.6" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.0.6.tgz#8f90341e68a53ccc928788dacfcd11b36eb9b78e" dependencies: @@ -9570,6 +11118,16 @@ readable-stream@~2.0.0, readable-stream@~2.0.5: string_decoder "~0.10.x" util-deprecate "~1.0.1" +readdir-scoped-modules@*, readdir-scoped-modules@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/readdir-scoped-modules/-/readdir-scoped-modules-1.0.2.tgz#9fafa37d286be5d92cbaebdee030dc9b5f406747" + integrity sha1-n6+jfShr5dksuuve4DDcm19AZ0c= + dependencies: + debuglog "^1.0.1" + dezalgo "^1.0.0" + graceful-fs "^4.1.2" + once "^1.3.0" + readdirp@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.1.0.tgz#4ed0ad060df3073300c48440373f72d1cc642d78" @@ -9602,12 +11160,20 @@ rechoir@^0.6.2: dependencies: resolve "^1.1.6" -redent@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde" +redent@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/redent/-/redent-2.0.0.tgz#c1b2007b42d57eb1389079b3c8333639d5e1ccaa" + integrity sha1-wbIAe0LVfrE4kHmzyDM2OdXhzKo= dependencies: - indent-string "^2.1.0" - strip-indent "^1.0.1" + indent-string "^3.0.0" + strip-indent "^2.0.0" + +redeyed@~2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/redeyed/-/redeyed-2.1.1.tgz#8984b5815d99cb220469c99eeeffe38913e6cc0b" + integrity sha1-iYS1gV2ZyyIEacme7v/jiRPmzAs= + dependencies: + esprima "~4.0.0" reduce-css-calc@^1.2.6: version "1.3.0" @@ -9728,6 +11294,21 @@ regexpu-core@^4.5.4: unicode-match-property-ecmascript "^1.0.4" unicode-match-property-value-ecmascript "^1.1.0" +registry-auth-token@^3.0.1, registry-auth-token@^3.3.1: + version "3.4.0" + resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-3.4.0.tgz#d7446815433f5d5ed6431cd5dca21048f66b397e" + integrity sha512-4LM6Fw8eBQdwMYcES4yTnn2TqIasbXuwDx3um+QRs7S55aMKCBKBxvPXl2RiUjHwuJLTyYfxSpmfSAjQpcuP+A== + dependencies: + rc "^1.1.6" + safe-buffer "^5.0.1" + +registry-url@^3.0.3: + version "3.1.0" + resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-3.1.0.tgz#3d4ef870f73dde1d77f0cf9a381432444e174942" + integrity sha1-PU74cPc93h138M+aOBQyRE4XSUI= + dependencies: + rc "^1.0.1" + regjsgen@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7" @@ -9786,12 +11367,6 @@ repeating@^2.0.0: dependencies: is-finite "^1.0.0" -request-promise-core@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.1.tgz#3eee00b2c5aa83239cfb04c5700da36f81cd08b6" - dependencies: - lodash "^4.13.1" - request-promise-core@1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.2.tgz#339f6aababcafdb31c799ff158700336301d3346" @@ -9805,18 +11380,10 @@ request-promise-native@^1.0.5: integrity sha512-rIMnbBdgNViL37nZ1b3L/VfPOpSi0TqVDQPAvO6U14lMzOLrt5nilxCQqtDKhZeDiW0/hkCXGoQjhgJd/tCh6w== dependencies: request-promise-core "1.1.2" - stealthy-require "^1.1.1" - tough-cookie "^2.3.3" - -request-promise@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/request-promise/-/request-promise-4.1.1.tgz#26021e4f6f56fd4c309f6bf1ebd8c97a95ac1fb5" - dependencies: - bluebird "^3.4.1" - request-promise-core "1.1.1" - stealthy-require "^1.0.0" + stealthy-require "^1.1.1" + tough-cookie "^2.3.3" -request@2.x, request@^2.74.0, request@^2.78.0: +request@2.x, request@^2.74.0: version "2.79.0" resolved "https://registry.yarnpkg.com/request/-/request-2.79.0.tgz#4dfe5bf6be8b8cdc37fcf93e04b65577722710de" dependencies: @@ -9841,7 +11408,7 @@ request@2.x, request@^2.74.0, request@^2.78.0: tunnel-agent "~0.4.1" uuid "^3.0.0" -request@^2.72.0, request@^2.87.0: +request@^2.72.0, request@^2.87.0, request@^2.88.0: version "2.88.0" resolved "https://registry.yarnpkg.com/request/-/request-2.88.0.tgz#9c2fca4f7d35b592efe57c7f0a55e81052124fef" integrity sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg== @@ -9867,32 +11434,6 @@ request@^2.72.0, request@^2.87.0: tunnel-agent "^0.6.0" uuid "^3.3.2" -request@~2.74.0: - version "2.74.0" - resolved "https://registry.yarnpkg.com/request/-/request-2.74.0.tgz#7693ca768bbb0ea5c8ce08c084a45efa05b892ab" - dependencies: - aws-sign2 "~0.6.0" - aws4 "^1.2.1" - bl "~1.1.2" - caseless "~0.11.0" - combined-stream "~1.0.5" - extend "~3.0.0" - forever-agent "~0.6.1" - form-data "~1.0.0-rc4" - har-validator "~2.0.6" - hawk "~3.1.3" - http-signature "~1.1.0" - is-typedarray "~1.0.0" - isstream "~0.1.2" - json-stringify-safe "~5.0.1" - mime-types "~2.1.7" - node-uuid "~1.4.7" - oauth-sign "~0.8.1" - qs "~6.2.0" - stringstream "~0.0.4" - tough-cookie "~2.3.0" - tunnel-agent "~0.4.1" - requestretry@^1.2.2: version "1.13.0" resolved "https://registry.yarnpkg.com/requestretry/-/requestretry-1.13.0.tgz#213ec1006eeb750e8b8ce54176283d15a8d55d94" @@ -9968,6 +11509,11 @@ resolve-from@^4.0.0: resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== +resolve-from@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" + integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== + resolve-url@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" @@ -9977,7 +11523,7 @@ resolve@1.1.7: resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" integrity sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs= -resolve@^1.1.4, resolve@^1.1.6, resolve@^1.1.7, resolve@^1.10.1, resolve@^1.11.0, resolve@^1.3.2, resolve@^1.4.0, resolve@^1.5.0, resolve@^1.8.1: +resolve@^1.1.4, resolve@^1.1.6, resolve@^1.1.7, resolve@^1.10.0, resolve@^1.10.1, resolve@^1.11.0, resolve@^1.3.2, resolve@^1.4.0, resolve@^1.5.0, resolve@^1.8.1: version "1.11.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.11.0.tgz#4014870ba296176b86343d50b60f3b50609ce232" integrity sha512-WL2pBDjqT6pGUNSUzMw00o4T7If+z4H2x3Gz893WoUQ5KW8Vr9txp00ykiP16VBaZF5+j/OcXJHZ9+PCvdiDKw== @@ -10008,6 +11554,11 @@ retry@^0.10.0: version "0.10.0" resolved "https://registry.yarnpkg.com/retry/-/retry-0.10.0.tgz#649e15ca408422d98318161935e7f7d652d435dd" +retry@^0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" + integrity sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs= + rgb-regex@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/rgb-regex/-/rgb-regex-1.0.1.tgz#c0e0d6882df0e23be254a475e8edd41915feaeb1" @@ -10040,7 +11591,7 @@ rimraf@2, rimraf@~2.5.0, rimraf@~2.5.1: dependencies: glob "^7.0.5" -rimraf@2.6.3, rimraf@^2.5.4, rimraf@^2.6.3, rimraf@~2.6.2: +rimraf@2.6.3, rimraf@^2.5.2, rimraf@^2.5.4, rimraf@^2.6.2, rimraf@^2.6.3, rimraf@~2.6.2: version "2.6.3" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== @@ -10073,15 +11624,12 @@ run-async@^2.2.0: dependencies: is-promise "^2.1.0" -run-auto@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/run-auto/-/run-auto-2.0.0.tgz#5f4353f58adbd6b74926489b4f259e1dad6a78d6" +run-queue@^1.0.0, run-queue@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/run-queue/-/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47" + integrity sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec= dependencies: - dezalgo "^1.0.1" - -run-series@^1.1.3: - version "1.1.4" - resolved "https://registry.yarnpkg.com/run-series/-/run-series-1.1.4.tgz#89a73ddc5e75c9ef8ab6320c0a1600d6a41179b9" + aproba "^1.1.1" rx-lite-aggregates@^4.0.8: version "4.0.8" @@ -10147,55 +11695,68 @@ sax@>=0.6.0, sax@^1.2.4, sax@~1.2.1, sax@~1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" -semantic-release@^6.3.2: - version "6.3.5" - resolved "https://registry.yarnpkg.com/semantic-release/-/semantic-release-6.3.5.tgz#6e3559b7490a4f79df9cdccca24f849f0a13640e" - dependencies: - "@semantic-release/commit-analyzer" "^2.0.0" - "@semantic-release/condition-travis" "^5.0.2" - "@semantic-release/error" "^1.0.0" - "@semantic-release/last-release-npm" "^1.2.1" - "@semantic-release/release-notes-generator" "^2.0.0" - git-head "^1.2.1" - github "^7.0.0" - lodash "^4.0.0" - nerf-dart "^1.0.0" - nopt "^3.0.3" - normalize-package-data "^2.3.4" - npmconf "^2.1.2" - npmlog "^4.0.0" - parse-github-repo-url "^1.3.0" - require-relative "^0.8.7" - run-auto "^2.0.0" - run-series "^1.1.3" - semver "^5.2.0" +semantic-release@^15.13.16: + version "15.13.16" + resolved "https://registry.yarnpkg.com/semantic-release/-/semantic-release-15.13.16.tgz#568b388790e5670acebcc6866113c37fbd968458" + integrity sha512-N/KsJyoABnq17h4WhfJW2lJRuDChulD5zMm8qxRx6mN9oQ49DfvzGKmQlTFj2VF6qwG1TEe723SxIYaGD7IDzA== + dependencies: + "@semantic-release/commit-analyzer" "^6.1.0" + "@semantic-release/error" "^2.2.0" + "@semantic-release/github" "^5.1.0" + "@semantic-release/npm" "^5.0.5" + "@semantic-release/release-notes-generator" "^7.1.2" + aggregate-error "^3.0.0" + cosmiconfig "^5.0.1" + debug "^4.0.0" + env-ci "^4.0.0" + execa "^1.0.0" + figures "^3.0.0" + find-versions "^3.0.0" + get-stream "^5.0.0" + git-log-parser "^1.2.0" + hook-std "^2.0.0" + hosted-git-info "^2.7.1" + lodash "^4.17.4" + marked "^0.6.0" + marked-terminal "^3.2.0" + p-locate "^4.0.0" + p-reduce "^2.0.0" + read-pkg-up "^6.0.0" + resolve-from "^5.0.0" + semver "^6.0.0" + signale "^1.2.1" + yargs "^13.1.0" + +semver-diff@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-2.1.0.tgz#4bbb8437c8d37e4b0cf1a68fd726ec6d645d6d36" + integrity sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY= + dependencies: + semver "^5.0.3" + +semver-regex@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/semver-regex/-/semver-regex-2.0.0.tgz#a93c2c5844539a770233379107b38c7b4ac9d338" + integrity sha512-mUdIBBvdn0PLOeP3TEkMH7HHeUP3GjsXCwKarjv/kGmUFOYg1VqEemKhoQpWMu6X2I8kHeuVdGibLGkVK+/5Qw== -"semver@2 >=2.2.1 || 3.x || 4 || 5", "semver@2 || 3 || 4 || 5", semver@^5.0.3, semver@^5.1.0, semver@^5.2.0, semver@~5.3.0: +"semver@2 || 3 || 4 || 5", semver@^5.0.3, semver@^5.1.0, semver@~5.3.0: version "5.3.0" resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" -"semver@2 || 3 || 4": - version "4.3.6" - resolved "https://registry.yarnpkg.com/semver/-/semver-4.3.6.tgz#300bc6e0e86374f7ba61068b5b1ecd57fc6532da" +"semver@2.x || 3.x || 4 || 5", "semver@^2.3.0 || 3.x || 4 || 5", semver@^5.4.1, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0: + version "5.7.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.0.tgz#790a7cf6fea5459bac96110b29b60412dc8ff96b" + integrity sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA== semver@5.5.0, semver@^5.3.0: version "5.5.0" resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab" -semver@^5.4.1, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0: - version "5.7.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.0.tgz#790a7cf6fea5459bac96110b29b60412dc8ff96b" - integrity sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA== - semver@^6.0.0, semver@^6.1.1: version "6.1.1" resolved "https://registry.yarnpkg.com/semver/-/semver-6.1.1.tgz#53f53da9b30b2103cd4f15eab3a18ecbcb210c9b" integrity sha512-rWYq2e5iYW+fFe/oPPtYJxYgjBm8sC4rmoGdUOgBB7VnwKt6HrL793l2voH1UlsyYZpJ4g0wfjnTEO1s1NP2eQ== -semver@~5.0.1: - version "5.0.3" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.0.3.tgz#77466de589cd5d3c95f138aa78bc569a3cb5d27a" - send@0.17.1: version "0.17.1" resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8" @@ -10274,6 +11835,14 @@ sha.js@~2.4.4: inherits "^2.0.1" safe-buffer "^5.0.1" +sha@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/sha/-/sha-2.0.1.tgz#6030822fbd2c9823949f8f72ed6411ee5cf25aae" + integrity sha1-YDCCL70smCOUn49y7WQR7lzyWq4= + dependencies: + graceful-fs "^4.1.2" + readable-stream "^2.0.2" + shasum@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/shasum/-/shasum-1.0.2.tgz#e7012310d8f417f4deb5712150e5678b87ae565f" @@ -10327,6 +11896,15 @@ signal-exit@^3.0.2: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= +signale@^1.2.1: + version "1.4.0" + resolved "https://registry.yarnpkg.com/signale/-/signale-1.4.0.tgz#c4be58302fb0262ac00fc3d886a7c113759042f1" + integrity sha512-iuh+gPf28RkltuJC7W5MRi6XAjTDCAPC/prJUpQoG4vIP3MJZ+GTydVnodXA7pwvTKb2cA0m9OFZW/cdWy/I/w== + dependencies: + chalk "^2.3.2" + figures "^2.0.0" + pkg-conf "^2.1.0" + simple-concat@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.0.tgz#7344cbb8b6e26fb27d66b2fc86f9f6d5997521c6" @@ -10383,9 +11961,15 @@ slice-ansi@^2.1.0: astral-regex "^1.0.0" is-fullwidth-code-point "^2.0.0" -slide@^1.1.3: +slide@^1.1.6, slide@~1.1.3, slide@~1.1.6: version "1.1.6" resolved "https://registry.yarnpkg.com/slide/-/slide-1.1.6.tgz#56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707" + integrity sha1-VusCfWW00tzmyy4tMsTUr8nh1wc= + +smart-buffer@4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.0.2.tgz#5207858c3815cc69110703c6b94e46c15634395d" + integrity sha512-JDhEpTKzXusOqXZ0BUIdH+CjFdO/CR3tLlf5CN34IypI+xMmXW1uB16OOY8z3cICbJlDAVJzNbwBhNO0wt9OAw== snapdragon-node@^2.0.1: version "2.1.1" @@ -10420,12 +12004,41 @@ sntp@1.x.x: dependencies: hoek "2.x.x" +socks-proxy-agent@^4.0.0: + version "4.0.2" + resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-4.0.2.tgz#3c8991f3145b2799e70e11bd5fbc8b1963116386" + integrity sha512-NT6syHhI9LmuEMSK6Kd2V7gNv5KFZoLE7V5udWmn0de+3Mkj3UMA/AJPLyeNUVmElCurSHtUdM3ETpR3z770Wg== + dependencies: + agent-base "~4.2.1" + socks "~2.3.2" + +socks@~2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/socks/-/socks-2.3.2.tgz#ade388e9e6d87fdb11649c15746c578922a5883e" + integrity sha512-pCpjxQgOByDHLlNqlnh/mNSAxIUkyBBuwwhTcV+enZGbDaClPvHdvm6uvOwZfFJkam7cGhBNbb4JxiP8UZkRvQ== + dependencies: + ip "^1.1.5" + smart-buffer "4.0.2" + sort-keys@^1.0.0: version "1.1.2" resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-1.1.2.tgz#441b6d4d346798f1b4e49e8920adfba0e543f9ad" dependencies: is-plain-obj "^1.0.0" +sorted-object@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/sorted-object/-/sorted-object-2.0.1.tgz#7d631f4bd3a798a24af1dffcfbfe83337a5df5fc" + integrity sha1-fWMfS9OnmKJK8d/8+/6DM3pd9fw= + +sorted-union-stream@~2.1.3: + version "2.1.3" + resolved "https://registry.yarnpkg.com/sorted-union-stream/-/sorted-union-stream-2.1.3.tgz#c7794c7e077880052ff71a8d4a2dbb4a9a638ac7" + integrity sha1-x3lMfgd4gAUv9xqNSi27Sppjisc= + dependencies: + from2 "^1.3.0" + stream-iterate "^1.1.0" + source-list-map@^0.1.4: version "0.1.8" resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-0.1.8.tgz#c550b2ab5427f6b3f21f5afead88c4f5587b2106" @@ -10474,12 +12087,38 @@ source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" +spawn-error-forwarder@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/spawn-error-forwarder/-/spawn-error-forwarder-1.0.0.tgz#1afd94738e999b0346d7b9fc373be55e07577029" + integrity sha1-Gv2Uc46ZmwNG17n8NzvlXgdXcCk= + +spdx-correct@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.0.tgz#fb83e504445268f154b074e218c87c003cd31df4" + integrity sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q== + dependencies: + spdx-expression-parse "^3.0.0" + spdx-license-ids "^3.0.0" + spdx-correct@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-1.0.2.tgz#4b3073d933ff51f3912f03ac5519498a4150db40" dependencies: spdx-license-ids "^1.0.2" +spdx-exceptions@^2.1.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz#2ea450aee74f2a89bfb94519c07fcd6f41322977" + integrity sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA== + +spdx-expression-parse@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz#99e119b7a5da00e05491c9fa338b7904823b41d0" + integrity sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg== + dependencies: + spdx-exceptions "^2.1.0" + spdx-license-ids "^3.0.0" + spdx-expression-parse@~1.0.0: version "1.0.4" resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz#9bdf2f20e1f40ed447fbe273266191fced51626c" @@ -10488,10 +12127,20 @@ spdx-license-ids@^1.0.2: version "1.2.2" resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz#c9df7a3424594ade6bd11900d596696dc06bac57" +spdx-license-ids@^3.0.0: + version "3.0.4" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.4.tgz#75ecd1a88de8c184ef015eafb51b5b48bfd11bb1" + integrity sha512-7j8LYJLeY/Yb6ACbQ7F76qy5jHkp0U6jgBfJsk97bwWlVUnUWsAgpyaCvo17h0/RQGnQ036tVDomiwoI4pDkQA== + sphericalmercator@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/sphericalmercator/-/sphericalmercator-1.0.5.tgz#ddc5a049e360e000d0fad9fc22c4071882584980" +split-on-first@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/split-on-first/-/split-on-first-1.1.0.tgz#f610afeee3b12bce1d0c30425e76398b78249a5f" + integrity sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw== + split-string@^3.0.1, split-string@^3.0.2: version "3.1.0" resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" @@ -10505,9 +12154,24 @@ split2@^0.2.1: dependencies: through2 "~0.6.1" -split@0.3: - version "0.3.3" - resolved "https://registry.yarnpkg.com/split/-/split-0.3.3.tgz#cd0eea5e63a211dfff7eb0f091c4133e2d0dd28f" +split2@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/split2/-/split2-2.2.0.tgz#186b2575bcf83e85b7d18465756238ee4ee42493" + integrity sha512-RAb22TG39LhI31MbreBgIuKiIKhVsawfTgEGqKHTK87aG+ul/PB8Sqoi3I7kVdRWiCfrKxK3uo4/YUkpNvhPbw== + dependencies: + through2 "^2.0.2" + +split2@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/split2/-/split2-1.0.0.tgz#52e2e221d88c75f9a73f90556e263ff96772b314" + integrity sha1-UuLiIdiMdfmnP5BVbiY/+WdysxQ= + dependencies: + through2 "~2.0.0" + +split@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/split/-/split-1.0.1.tgz#605bd9be303aa59fb35f9229fbea0ddec9ea07d9" + integrity sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg== dependencies: through "2" @@ -10530,6 +12194,13 @@ sshpk@^1.7.0: jsbn "~0.1.0" tweetnacl "~0.14.0" +ssri@^6.0.0, ssri@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-6.0.1.tgz#2a3c41b28dd45b62b63676ecb74001265ae9edd8" + integrity sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA== + dependencies: + figgy-pudding "^3.5.1" + stable@^0.1.8: version "0.1.8" resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf" @@ -10564,10 +12235,6 @@ stdout-stream@^1.4.0: dependencies: readable-stream "^2.0.1" -stealthy-require@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.0.0.tgz#1a8ed8fc19a8b56268f76f5a1a3e3832b0c26200" - stealthy-require@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" @@ -10588,7 +12255,7 @@ stream-browserify@^2.0.1: inherits "~2.0.1" readable-stream "^2.0.2" -stream-combiner2@^1.1.1: +stream-combiner2@^1.1.1, stream-combiner2@~1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/stream-combiner2/-/stream-combiner2-1.1.1.tgz#fb4d8a1420ea362764e21ad4780397bebcb41cbe" integrity sha1-+02KFCDqNidk4hrUeAOXvry0HL4= @@ -10596,15 +12263,13 @@ stream-combiner2@^1.1.1: duplexer2 "~0.1.0" readable-stream "^2.0.2" -stream-combiner@~0.0.4: - version "0.0.4" - resolved "https://registry.yarnpkg.com/stream-combiner/-/stream-combiner-0.0.4.tgz#4d5e433c185261dde623ca3f44c586bcf5c4ad14" +stream-each@^1.1.0: + version "1.2.3" + resolved "https://registry.yarnpkg.com/stream-each/-/stream-each-1.2.3.tgz#ebe27a0c389b04fbcc233642952e10731afa9bae" + integrity sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw== dependencies: - duplexer "~0.1.1" - -stream-consume@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/stream-consume/-/stream-consume-0.1.0.tgz#a41ead1a6d6081ceb79f65b061901b6d8f3d1d0f" + end-of-stream "^1.1.0" + stream-shift "^1.0.0" stream-http@^2.0.0, stream-http@^2.7.2: version "2.8.3" @@ -10616,6 +12281,19 @@ stream-http@^2.0.0, stream-http@^2.7.2: to-arraybuffer "^1.0.0" xtend "^4.0.0" +stream-iterate@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/stream-iterate/-/stream-iterate-1.2.0.tgz#2bd7c77296c1702a46488b8ad41f79865eecd4e1" + integrity sha1-K9fHcpbBcCpGSIuK1B95hl7s1OE= + dependencies: + readable-stream "^2.1.5" + stream-shift "^1.0.0" + +stream-shift@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.0.tgz#d5c752825e5367e786f78e18e445ea223a155952" + integrity sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI= + stream-splicer@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/stream-splicer/-/stream-splicer-2.0.1.tgz#0b13b7ee2b5ac7e0609a7463d83899589a363fcd" @@ -10628,6 +12306,11 @@ strict-uri-encode@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" +strict-uri-encode@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz#b9c7330c7042862f6b142dc274bbcc5866ce3546" + integrity sha1-ucczDHBChi9rFC3CdLvMWGbONUY= + string-length@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/string-length/-/string-length-2.0.0.tgz#d40dbb686a3ace960c1cffca562bf2c45f8363ed" @@ -10657,7 +12340,7 @@ string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1: is-fullwidth-code-point "^2.0.0" strip-ansi "^4.0.0" -string-width@^3.0.0: +string-width@^3.0.0, string-width@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== @@ -10683,6 +12366,11 @@ string_decoder@~0.10.x: version "0.10.31" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" +stringify-package@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/stringify-package/-/stringify-package-1.0.0.tgz#e02828089333d7d45cd8c287c30aa9a13375081b" + integrity sha512-JIQqiWmLiEozOC0b0BtxZ/AOUtdUZHCBPgqIZ2kSJJqGwgb9neo44XdTHUC4HZSGqi03hOeB7W/E8rAlKnGe9g== + stringstream@~0.0.4: version "0.0.5" resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878" @@ -10707,7 +12395,7 @@ strip-ansi@^4.0.0: dependencies: ansi-regex "^3.0.0" -strip-ansi@^5.0.0, strip-ansi@^5.1.0: +strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== @@ -10730,11 +12418,10 @@ strip-eof@^1.0.0: resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= -strip-indent@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2" - dependencies: - get-stdin "^4.0.1" +strip-indent@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-2.0.0.tgz#5ef8db295d01e6ed6cbf7aab96998d7822527b68" + integrity sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g= strip-json-comments@2.0.1, strip-json-comments@^2.0.1, strip-json-comments@~2.0.1: version "2.0.1" @@ -10799,6 +12486,13 @@ supports-color@^4.0.0: dependencies: has-flag "^2.0.0" +supports-color@^5.0.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + supports-color@^5.3.0, supports-color@^5.4.0: version "5.4.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.4.0.tgz#1c6b337402c2137605efe19f10fec390f6faab54" @@ -10812,6 +12506,14 @@ supports-color@^6.1.0: dependencies: has-flag "^3.0.0" +supports-hyperlinks@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/supports-hyperlinks/-/supports-hyperlinks-1.0.1.tgz#71daedf36cc1060ac5100c351bb3da48c29c0ef7" + integrity sha512-HHi5kVSefKaJkGYXbDuKbUGRVxqnWGn3J2e39CYcNJEfWciGq2zYtOhXLTlvrOZW1QU7VX67w7fMmWafHX9Pfw== + dependencies: + has-flag "^2.0.0" + supports-color "^5.0.0" + svg.js@^2.6.5: version "2.6.5" resolved "https://registry.yarnpkg.com/svg.js/-/svg.js-2.6.5.tgz#5b93d0c8c11e2b70812ef9de1562aa91975cc3b6" @@ -10904,6 +12606,15 @@ tar-pack@~3.1.0: tar "~2.2.1" uid-number "~0.0.6" +tar@^2.0.0: + version "2.2.2" + resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.2.tgz#0ca8848562c7299b8b446ff6a4d60cdbb23edc40" + integrity sha512-FCEhQ/4rE1zYv9rYXJw/msRqsnmlje5jHP6huWeBZ704jUTy02c5AZyWujpMR1ax6mVw9NyJMfuK2CMDWVIfgA== + dependencies: + block-stream "*" + fstream "^1.0.12" + inherits "2" + tar@^4: version "4.4.4" resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.4.tgz#ec8409fae9f665a4355cc3b4087d0820232bb8cd" @@ -10916,6 +12627,19 @@ tar@^4: safe-buffer "^5.1.2" yallist "^3.0.2" +tar@^4.4.8: + version "4.4.10" + resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.10.tgz#946b2810b9a5e0b26140cf78bea6b0b0d689eba1" + integrity sha512-g2SVs5QIxvo6OLp0GudTqEf05maawKUxXru104iaayWA09551tFCTI8f1Asb4lPfkBr91k07iL4c11XO3/b0tA== + dependencies: + chownr "^1.1.1" + fs-minipass "^1.2.5" + minipass "^2.3.5" + minizlib "^1.2.1" + mkdirp "^0.5.0" + safe-buffer "^5.1.2" + yallist "^3.0.3" + tar@~2.2.0, tar@~2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1" @@ -10932,6 +12656,13 @@ term-color@^1.0.1: ansi-styles "2.0.1" supports-color "1.3.1" +term-size@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/term-size/-/term-size-1.2.0.tgz#458b83887f288fc56d6fffbfad262e26638efa69" + integrity sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk= + dependencies: + execa "^0.7.0" + terser@^3.7.5: version "3.17.0" resolved "https://registry.yarnpkg.com/terser/-/terser-3.17.0.tgz#f88ffbeda0deb5637f9d24b0da66f4e15ab10cb2" @@ -10951,6 +12682,11 @@ test-exclude@^5.2.3: read-pkg-up "^4.0.0" require-main-filename "^2.0.0" +text-extensions@^1.0.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/text-extensions/-/text-extensions-1.9.0.tgz#1853e45fee39c945ce6f6c36b2d659b5aabc2a26" + integrity sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ== + text-table@^0.2.0, text-table@~0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" @@ -10974,7 +12710,7 @@ through2@2.0.1: readable-stream "~2.0.0" xtend "~4.0.0" -through2@^2.0.0: +through2@^2.0.0, through2@^2.0.2, through2@~2.0.0: version "2.0.5" resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== @@ -10997,7 +12733,7 @@ through2@~0.6.1: readable-stream ">=1.0.33-1 <1.1.0-0" xtend ">=4.0.0 <4.1.0-0" -through@2, "through@>=2.2.7 <3", through@^2.3.6, through@^2.3.7, through@~2.3, through@~2.3.1, through@~2.3.4: +through@2, "through@>=2.2.7 <3", through@^2.3.6, through@^2.3.7, through@~2.3.4: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" @@ -11006,6 +12742,11 @@ through@~2.2.7: resolved "https://registry.yarnpkg.com/through/-/through-2.2.7.tgz#6e8e21200191d4eb6a99f6f010df46aa1c6eb2bd" integrity sha1-bo4hIAGR1OtqmfbwEN9Gqhxusr0= +timed-out@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f" + integrity sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8= + timers-browserify@^1.0.1: version "1.4.2" resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-1.4.2.tgz#c9c58b575be8407375cb5e2462dacee74359f41d" @@ -11024,6 +12765,11 @@ timsort@^0.3.0: resolved "https://registry.yarnpkg.com/timsort/-/timsort-0.3.0.tgz#405411a8e7e6339fe64db9a234de11dc31e02bd4" integrity sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q= +tiny-relative-date@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/tiny-relative-date/-/tiny-relative-date-1.3.0.tgz#fa08aad501ed730f31cc043181d995c39a935e07" + integrity sha512-MOQHpzllWxDCHHaDno30hhLfbouoYlOI8YlMNtvKe1zXbjEVhbcEovQxvZrPvtiYW630GQDoMMarCnjfyfHA+A== + tmp@^0.0.33: version "0.0.33" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" @@ -11113,28 +12859,20 @@ tr46@^1.0.1: dependencies: punycode "^2.1.0" -travis-ci@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/travis-ci/-/travis-ci-2.1.1.tgz#98696265af827ae3576f31aa06d876e74b4b082e" - dependencies: - github "~0.1.10" - lodash "~1.3.1" - request "~2.74.0" - underscore.string "~2.2.0rc" +traverse@~0.6.6: + version "0.6.6" + resolved "https://registry.yarnpkg.com/traverse/-/traverse-0.6.6.tgz#cbdf560fd7b9af632502fed40f918c157ea97137" + integrity sha1-y99WD9e5r2MlAv7UD5GMFX6pcTc= -travis-deploy-once@1.0.0-node-0.10-support: - version "1.0.0-node-0.10-support" - resolved "https://registry.yarnpkg.com/travis-deploy-once/-/travis-deploy-once-1.0.0-node-0.10-support.tgz#98ecce7d95b2f4ba5dcdeeebf54b9df87713d5e6" - dependencies: - babel-polyfill "^6.16.0" - bluebird "^3.4.6" - request "^2.78.0" - request-promise "^4.1.1" - travis-ci "^2.1.1" +trim-newlines@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-2.0.0.tgz#b403d0b91be50c331dfc4b82eeceb22c3de16d20" + integrity sha1-tAPQuRvlDDMd/EuC7s6yLD3hbSA= -trim-newlines@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" +trim-off-newlines@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/trim-off-newlines/-/trim-off-newlines-1.0.1.tgz#9f9ba9d9efa8764c387698bcbfeb2c848f11adb3" + integrity sha1-n5up2e+odkw4dpi8v+sshI8RrbM= trim-right@^1.0.1: version "1.0.1" @@ -11176,7 +12914,17 @@ type-check@~0.3.2: dependencies: prelude-ls "~1.1.2" -typedarray@^0.0.6, typedarray@~0.0.5: +type-fest@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.4.1.tgz#8bdf77743385d8a4f13ba95f610f5ccd68c728f8" + integrity sha512-IwzA/LSfD2vC1/YDYMv/zHP4rDF1usCwllsDpbolT3D4fUepIO7f9K70jjmUewU/LmGUKJcwcVtDCpnKk4BPMw== + +type-fest@^0.5.0: + version "0.5.2" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.5.2.tgz#d6ef42a0356c6cd45f49485c3b6281fc148e48a2" + integrity sha512-DWkS49EQKVX//Tbupb9TFa19c7+MK1XmzkrZUR8TAktmE/DizXoaoJV6TZ/tSIPXipqNiRI6CyAe7x69Jb6RSw== + +typedarray@^0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" @@ -11225,11 +12973,7 @@ uglifyify@^5.0.1: terser "^3.7.5" through "~2.3.4" -uid-number@0.0.5: - version "0.0.5" - resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.5.tgz#5a3db23ef5dbd55b81fce0ec9a2ac6fccdebb81e" - -uid-number@~0.0.6: +uid-number@0.0.6, uid-number@~0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81" @@ -11238,6 +12982,11 @@ ultron@1.0.x: resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.0.2.tgz#ace116ab557cd197386a4e88f4685378c8b2e4fa" integrity sha1-rOEWq1V80Zc4ak6I9GhTeMiy5Po= +umask@^1.1.0, umask@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/umask/-/umask-1.1.0.tgz#f29cebf01df517912bb58ff9c4e50fde8e33320d" + integrity sha1-8pzr8B31F5ErtY/5xOUP3o4zMg0= + umd@^3.0.0: version "3.0.3" resolved "https://registry.yarnpkg.com/umd/-/umd-3.0.3.tgz#aa9fe653c42b9097678489c01000acb69f0b26cf" @@ -11254,10 +13003,6 @@ undeclared-identifiers@^1.1.2: simple-concat "^1.0.0" xtend "^4.0.1" -underscore.string@~2.2.0rc: - version "2.2.1" - resolved "https://registry.yarnpkg.com/underscore.string/-/underscore.string-2.2.1.tgz#d7c0fa2af5d5a1a67f4253daee98132e733f0f19" - underscore.string@~2.4.0: version "2.4.0" resolved "https://registry.yarnpkg.com/underscore.string/-/underscore.string-2.4.0.tgz#8cdd8fbac4e2d2ea1e7e2e8097c42f442280f85b" @@ -11308,6 +13053,27 @@ uniqs@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/uniqs/-/uniqs-2.0.0.tgz#ffede4b36b25290696e6e165d4a59edb998e6b02" +unique-filename@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230" + integrity sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ== + dependencies: + unique-slug "^2.0.0" + +unique-slug@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.2.tgz#baabce91083fc64e945b0f3ad613e264f7cd4e6c" + integrity sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w== + dependencies: + imurmurhash "^0.1.4" + +unique-string@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-1.0.0.tgz#9e1057cca851abb93398f8b33ae187b99caec11a" + integrity sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo= + dependencies: + crypto-random-string "^1.0.0" + units-css@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/units-css/-/units-css-0.4.0.tgz#d6228653a51983d7c16ff28f8b9dc3b1ffed3a07" @@ -11315,11 +13081,23 @@ units-css@^0.4.0: isnumeric "^0.2.0" viewport-dimensions "^0.2.0" +universal-user-agent@^2.0.0, universal-user-agent@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/universal-user-agent/-/universal-user-agent-2.1.0.tgz#5abfbcc036a1ba490cb941f8fd68c46d3669e8e4" + integrity sha512-8itiX7G05Tu3mGDTdNY2fB4KJ8MgZLS54RdG6PkkfwMAavrXu1mV/lls/GABx9O3Rw4PnTtasxrvbMQoBYY92Q== + dependencies: + os-name "^3.0.0" + universalify@^0.1.0: version "0.1.2" resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== +unpipe@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= + unquote@~1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/unquote/-/unquote-1.1.1.tgz#8fded7324ec6e88a0ff8b905e7c098cdc086d544" @@ -11332,6 +13110,11 @@ unset-value@^1.0.0: has-value "^0.3.1" isobject "^3.0.0" +unzip-response@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/unzip-response/-/unzip-response-2.0.1.tgz#d2f0f737d16b0615e72a6935ed04214572d56f97" + integrity sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c= + upath@^1.0.5: version "1.1.0" resolved "https://registry.yarnpkg.com/upath/-/upath-1.1.0.tgz#35256597e46a581db4793d0ce47fa9aebfc9fabd" @@ -11341,6 +13124,22 @@ upath@^1.1.1: resolved "https://registry.yarnpkg.com/upath/-/upath-1.1.2.tgz#3db658600edaeeccbe6db5e684d67ee8c2acd068" integrity sha512-kXpym8nmDmlCBr7nKdIx8P2jNBa+pBpIUFRnKJ4dr8htyYGJFokkr2ZvERRtUN+9SY+JqXouNgUPtv6JQva/2Q== +update-notifier@^2.3.0, update-notifier@^2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-2.5.0.tgz#d0744593e13f161e406acb1d9408b72cad08aff6" + integrity sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw== + dependencies: + boxen "^1.2.1" + chalk "^2.0.1" + configstore "^3.0.0" + import-lazy "^2.1.0" + is-ci "^1.0.10" + is-installed-globally "^0.1.0" + is-npm "^1.0.0" + latest-version "^3.0.0" + semver-diff "^2.0.0" + xdg-basedir "^3.0.0" + uri-js@^4.2.2: version "4.2.2" resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" @@ -11352,6 +13151,11 @@ urix@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" +url-join@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/url-join/-/url-join-4.0.0.tgz#4d3340e807d3773bda9991f8305acdcc2a665d2a" + integrity sha1-TTNA6AfTdzvamZH4MFrNzCpmXSo= + url-loader@~0.5.7: version "0.5.9" resolved "https://registry.yarnpkg.com/url-loader/-/url-loader-0.5.9.tgz#cc8fea82c7b906e7777019250869e569e995c295" @@ -11359,6 +13163,18 @@ url-loader@~0.5.7: loader-utils "^1.0.2" mime "1.3.x" +url-parse-lax@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-1.0.0.tgz#7af8f303645e9bd79a272e7a14ac68bc0609da73" + integrity sha1-evjzA2Rem9eaJy56FKxovAYJ2nM= + dependencies: + prepend-http "^1.0.1" + +url-template@^2.0.8: + version "2.0.8" + resolved "https://registry.yarnpkg.com/url-template/-/url-template-2.0.8.tgz#fc565a3cccbff7730c775f5641f9555791439f21" + integrity sha1-/FZaPMy/93MMd19WQflVV5FDnyE= + url-trim@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/url-trim/-/url-trim-1.0.0.tgz#40057e2f164b88e5daca7269da47e6d1dd837adc" @@ -11401,6 +13217,11 @@ util-deprecate@^1.0.1, util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" +util-extend@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/util-extend/-/util-extend-1.0.3.tgz#a7c216d267545169637b3b6edc6ca9119e2ff93f" + integrity sha1-p8IW0mdUUWljeztu3GypEZ4v+T8= + util.promisify@^1.0.0, util.promisify@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.0.tgz#440f7165a459c9a16dc145eb8e72f35687097030" @@ -11443,6 +13264,21 @@ validate-npm-package-license@^3.0.1: spdx-correct "~1.0.0" spdx-expression-parse "~1.0.0" +validate-npm-package-license@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" + integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== + dependencies: + spdx-correct "^3.0.0" + spdx-expression-parse "^3.0.0" + +validate-npm-package-name@^3.0.0, validate-npm-package-name@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz#5fa912d81eb7d0c74afc140de7317f0ca7df437e" + integrity sha1-X6kS2B630MdK/BQN5zF/DKffQ34= + dependencies: + builtins "^1.0.3" + vendors@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/vendors/-/vendors-1.0.2.tgz#7fcb5eef9f5623b156bcea89ec37d63676f21801" @@ -11487,12 +13323,6 @@ w3c-hr-time@^1.0.1: dependencies: browser-process-hrtime "^0.1.2" -walk@^2.3.9: - version "2.3.9" - resolved "https://registry.yarnpkg.com/walk/-/walk-2.3.9.tgz#31b4db6678f2ae01c39ea9fb8725a9031e558a7b" - dependencies: - foreachasync "^3.0.0" - walker@^1.0.7, walker@~1.0.5: version "1.0.7" resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.7.tgz#2f7f9b8fd10d677262b18a884e28d19618e028fb" @@ -11533,6 +13363,13 @@ watchpack@^1.3.1: graceful-fs "^4.1.2" neo-async "^2.5.0" +wcwidth@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" + integrity sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g= + dependencies: + defaults "^1.0.3" + webidl-conversions@^4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" @@ -11624,7 +13461,7 @@ which-module@^2.0.0: resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= -which@^1.2.14, which@^1.2.9, which@^1.3.0, which@^1.3.1: +which@1, which@^1.2.14, which@^1.2.9, which@^1.3.0, which@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== @@ -11637,10 +13474,24 @@ wide-align@^1.1.0: dependencies: string-width "^1.0.1" +widest-line@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-2.0.1.tgz#7438764730ec7ef4381ce4df82fb98a53142a3fc" + integrity sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA== + dependencies: + string-width "^2.1.1" + window-size@0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d" +windows-release@^3.1.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/windows-release/-/windows-release-3.2.0.tgz#8122dad5afc303d833422380680a79cdfa91785f" + integrity sha512-QTlz2hKLrdqukrsapKsINzqMgOUpQW268eJ0OaOpJN32h272waxR9fkB9VoWRtK7uKHG5EHJcTXQBD8XZVJkFA== + dependencies: + execa "^1.0.0" + word-wrap@^1.0.3: version "1.2.3" resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" @@ -11660,12 +13511,28 @@ wordwrap@~1.0.0: resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" integrity sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus= +worker-farm@^1.6.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.7.0.tgz#26a94c5391bbca926152002f69b84a4bf772e5a8" + integrity sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw== + dependencies: + errno "~0.1.7" + wrap-ansi@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.0.0.tgz#7d30f8f873f9a5bbc3a64dabc8d177e071ae426f" dependencies: string-width "^1.0.1" +wrap-ansi@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" + integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q== + dependencies: + ansi-styles "^3.2.0" + string-width "^3.0.0" + strip-ansi "^5.0.0" + wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" @@ -11679,6 +13546,15 @@ write-file-atomic@2.4.1: imurmurhash "^0.1.4" signal-exit "^3.0.2" +write-file-atomic@^2.0.0, write-file-atomic@^2.3.0, write-file-atomic@^2.4.2: + version "2.4.3" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.4.3.tgz#1fd2e9ae1df3e75b8d8c367443c692d4ca81f481" + integrity sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ== + dependencies: + graceful-fs "^4.1.11" + imurmurhash "^0.1.4" + signal-exit "^3.0.2" + write@1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/write/-/write-1.0.3.tgz#0800e14523b923a387e415123c865616aae0f5c3" @@ -11708,6 +13584,11 @@ ws@^5.2.0: dependencies: async-limiter "~1.0.0" +xdg-basedir@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-3.0.0.tgz#496b2cc109eca8dbacfe2dc72b603c17c5870ad4" + integrity sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ= + xml-name-validator@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" @@ -11734,7 +13615,7 @@ y18n@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" -"y18n@^3.2.1 || ^4.0.0": +"y18n@^3.2.1 || ^4.0.0", y18n@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w== @@ -11748,6 +13629,11 @@ yallist@^3.0.0, yallist@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.2.tgz#8452b4bb7e83c7c188d8041c1a837c773d6d8bb9" +yallist@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.3.tgz#b4b049e314be545e3ce802236d6cd22cd91c3de9" + integrity sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A== + yamljs@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/yamljs/-/yamljs-0.3.0.tgz#dc060bf267447b39f7304e9b2bfbe8b5a7ddb03b" @@ -11764,6 +13650,14 @@ yargs-parser@^11.1.1: camelcase "^5.0.0" decamelize "^1.2.0" +yargs-parser@^13.1.0: + version "13.1.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.1.tgz#d26058532aa06d365fe091f6a1fc06b2f7e5eca0" + integrity sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ== + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + yargs-parser@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-4.2.0.tgz#6ced869cd05a3dca6a1eaee38b68aeed4b0b4101" @@ -11777,6 +13671,13 @@ yargs-parser@^8.0.0: dependencies: camelcase "^4.1.0" +yargs-parser@^9.0.2: + version "9.0.2" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-9.0.2.tgz#9ccf6a43460fe4ed40a9bb68f48d43b8a68cc077" + integrity sha1-nM9qQ0YP5O1Aqbto9I1DuKaMwHc= + dependencies: + camelcase "^4.1.0" + yargs@10.0.3: version "10.0.3" resolved "https://registry.yarnpkg.com/yargs/-/yargs-10.0.3.tgz#6542debd9080ad517ec5048fb454efe9e4d4aaae" @@ -11795,6 +13696,24 @@ yargs@10.0.3: y18n "^3.2.1" yargs-parser "^8.0.0" +yargs@^11.0.0: + version "11.1.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-11.1.0.tgz#90b869934ed6e871115ea2ff58b03f4724ed2d77" + integrity sha512-NwW69J42EsCSanF8kyn5upxvjp5ds+t3+udGBeTbFnERA+lF541DDpMawzo4z6W/QrzNM18D+BPMiOBibnFV5A== + dependencies: + cliui "^4.0.0" + decamelize "^1.1.1" + find-up "^2.1.0" + get-caller-file "^1.0.1" + os-locale "^2.0.0" + require-directory "^2.1.1" + require-main-filename "^1.0.1" + set-blocking "^2.0.0" + string-width "^2.0.0" + which-module "^2.0.0" + y18n "^3.2.1" + yargs-parser "^9.0.2" + yargs@^12.0.2: version "12.0.5" resolved "https://registry.yarnpkg.com/yargs/-/yargs-12.0.5.tgz#05f5997b609647b64f66b81e3b4b10a368e7ad13" @@ -11813,6 +13732,23 @@ yargs@^12.0.2: y18n "^3.2.1 || ^4.0.0" yargs-parser "^11.1.1" +yargs@^13.1.0: + version "13.2.4" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.2.4.tgz#0b562b794016eb9651b98bd37acf364aa5d6dc83" + integrity sha512-HG/DWAJa1PAnHT9JAhNa8AbAv3FPaiLzioSjCcmuXXhP8MlpHO5vwls4g4j6n30Z74GVQj8Xa62dWVx1QCGklg== + dependencies: + cliui "^5.0.0" + find-up "^3.0.0" + get-caller-file "^2.0.1" + os-locale "^3.1.0" + require-directory "^2.1.1" + require-main-filename "^2.0.0" + set-blocking "^2.0.0" + string-width "^3.0.0" + which-module "^2.0.0" + y18n "^4.0.0" + yargs-parser "^13.1.0" + yargs@^6.0.0: version "6.6.0" resolved "https://registry.yarnpkg.com/yargs/-/yargs-6.6.0.tgz#782ec21ef403345f830a808ca3d513af56065208" From 4ffc0ab7624c4e13e341b5fcb9ad1005e775e814 Mon Sep 17 00:00:00 2001 From: Evan Siroky Date: Mon, 17 Jun 2019 15:05:31 -0700 Subject: [PATCH 18/18] build: remove no-longer needed dist files from repo --- dist/bundle.css | 106 - dist/bundle.js | 19276 ------------------------------------------- dist/bundle.js.map | 199 - 3 files changed, 19581 deletions(-) delete mode 100644 dist/bundle.css delete mode 100644 dist/bundle.js delete mode 100644 dist/bundle.js.map diff --git a/dist/bundle.css b/dist/bundle.css deleted file mode 100644 index 29b1d9ad..00000000 --- a/dist/bundle.css +++ /dev/null @@ -1,106 +0,0 @@ - -/** - * Transitive Base Styles - */ - -.Transitive { - overflow: hidden; -} - -/** - * Schematic Map - */ - -.Transitive > .schematic-map { - position: absolute; - left: 0; - top: 0; - width: 100%; - height: 100%; - z-index: 100; -} - -/** - * Labels - */ - -.Transitive > .schematic-map .transitive-stop-label, -.Transitive > .schematic-map .transitive-multi-label, -.Transitive > .schematic-map .transitive-place-label { - text-shadow: - -2px -2px 0 #fff, - 2px -2px 0 #fff, - -2px 2px 0 #fff, - 2px 2px 0 #fff; -} - -.Transitive > .schematic-map .transitive-segment-label { - fill: #fff; -} - -/** - * Label Container - */ - -.Transitive > .schematic-map .transitive-segment-label-container { - fill: #008; -} - -/** - * Lines - */ - -.Transitive > .schematic-map .transitive-line { - stroke-linecap: round; - fill: none; -} - -/** - * Places - */ - -.Transitive > .schematic-map .transitive-place-circle { - fill: #fff; - stroke: #333; - stroke-width: 2px; -} - -/** - * Stops - */ - -.Transitive > .schematic-map .transitive-stop-marker-pattern, -.Transitive > .schematic-map .transitive-stop-marker-merged, -.Transitive > .schematic-map .transitive-multipoint-marker-merged { - fill: #fff; - stroke: #333; - stroke-width: 1px; -} - -/** - * Tile Layer - */ - -.Transitive > .tile-layer { - position: absolute; - z-index: 50; -} - -.Transitive > .tile-layer > .tile { - pointer-events: none; - position: absolute; - width: 256px; - height: 256px; -} - -/** - * Grid - */ - -.Transitive .gridline { - fill: none; - stroke: #ccc; - stroke-width: 1px; -} - -/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIjxpbnB1dCBjc3MgMT4iXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUNBOztHQUVHOztBQUVIO0VBQ0UsaUJBQWlCO0NBQ2xCOztBQUVEOztHQUVHOztBQUVIO0VBQ0UsbUJBQW1CO0VBQ25CLFFBQVE7RUFDUixPQUFPO0VBQ1AsWUFBWTtFQUNaLGFBQWE7RUFDYixhQUFhO0NBQ2Q7O0FBRUQ7O0dBRUc7O0FBRUg7OztFQUdFOzs7O29CQUlrQjtDQUNuQjs7QUFFRDtFQUNFLFdBQVc7Q0FDWjs7QUFFRDs7R0FFRzs7QUFFSDtFQUNFLFdBQVc7Q0FDWjs7QUFFRDs7R0FFRzs7QUFFSDtFQUNFLHNCQUFzQjtFQUN0QixXQUFXO0NBQ1o7O0FBRUQ7O0dBRUc7O0FBRUg7RUFDRSxXQUFXO0VBQ1gsYUFBYTtFQUNiLGtCQUFrQjtDQUNuQjs7QUFFRDs7R0FFRzs7QUFFSDs7O0VBR0UsV0FBVztFQUNYLGFBQWE7RUFDYixrQkFBa0I7Q0FDbkI7O0FBRUQ7O0dBRUc7O0FBRUg7RUFDRSxtQkFBbUI7RUFDbkIsWUFBWTtDQUNiOztBQUVEO0VBQ0UscUJBQXFCO0VBQ3JCLG1CQUFtQjtFQUNuQixhQUFhO0VBQ2IsY0FBYztDQUNmOztBQUVEOztHQUVHOztBQUVIO0VBQ0UsV0FBVztFQUNYLGFBQWE7RUFDYixrQkFBa0I7Q0FDbkIiLCJmaWxlIjoiYnVuZGxlLmNzcyIsInNvdXJjZXNDb250ZW50IjpbIlxuLyoqXG4gKiBUcmFuc2l0aXZlIEJhc2UgU3R5bGVzXG4gKi9cblxuLlRyYW5zaXRpdmUge1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuXG4vKipcbiAqIFNjaGVtYXRpYyBNYXBcbiAqL1xuXG4uVHJhbnNpdGl2ZSA+IC5zY2hlbWF0aWMtbWFwIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICBsZWZ0OiAwO1xuICB0b3A6IDA7XG4gIHdpZHRoOiAxMDAlO1xuICBoZWlnaHQ6IDEwMCU7XG4gIHotaW5kZXg6IDEwMDtcbn1cblxuLyoqXG4gKiBMYWJlbHNcbiAqL1xuXG4uVHJhbnNpdGl2ZSA+IC5zY2hlbWF0aWMtbWFwIC50cmFuc2l0aXZlLXN0b3AtbGFiZWwsXG4uVHJhbnNpdGl2ZSA+IC5zY2hlbWF0aWMtbWFwIC50cmFuc2l0aXZlLW11bHRpLWxhYmVsLFxuLlRyYW5zaXRpdmUgPiAuc2NoZW1hdGljLW1hcCAudHJhbnNpdGl2ZS1wbGFjZS1sYWJlbCB7XG4gIHRleHQtc2hhZG93OlxuICAgLTJweCAtMnB4IDAgI2ZmZixcbiAgICAycHggLTJweCAwICNmZmYsXG4gICAgLTJweCAycHggMCAjZmZmLFxuICAgICAycHggMnB4IDAgI2ZmZjtcbn1cblxuLlRyYW5zaXRpdmUgPiAuc2NoZW1hdGljLW1hcCAudHJhbnNpdGl2ZS1zZWdtZW50LWxhYmVsIHtcbiAgZmlsbDogI2ZmZjtcbn1cblxuLyoqXG4gKiBMYWJlbCBDb250YWluZXJcbiAqL1xuXG4uVHJhbnNpdGl2ZSA+IC5zY2hlbWF0aWMtbWFwIC50cmFuc2l0aXZlLXNlZ21lbnQtbGFiZWwtY29udGFpbmVyIHtcbiAgZmlsbDogIzAwODtcbn1cblxuLyoqXG4gKiBMaW5lc1xuICovXG5cbi5UcmFuc2l0aXZlID4gLnNjaGVtYXRpYy1tYXAgLnRyYW5zaXRpdmUtbGluZSB7XG4gIHN0cm9rZS1saW5lY2FwOiByb3VuZDtcbiAgZmlsbDogbm9uZTtcbn1cblxuLyoqXG4gKiBQbGFjZXNcbiAqL1xuXG4uVHJhbnNpdGl2ZSA+IC5zY2hlbWF0aWMtbWFwIC50cmFuc2l0aXZlLXBsYWNlLWNpcmNsZSB7XG4gIGZpbGw6ICNmZmY7XG4gIHN0cm9rZTogIzMzMztcbiAgc3Ryb2tlLXdpZHRoOiAycHg7XG59XG5cbi8qKlxuICogU3RvcHNcbiAqL1xuXG4uVHJhbnNpdGl2ZSA+IC5zY2hlbWF0aWMtbWFwIC50cmFuc2l0aXZlLXN0b3AtbWFya2VyLXBhdHRlcm4sXG4uVHJhbnNpdGl2ZSA+IC5zY2hlbWF0aWMtbWFwIC50cmFuc2l0aXZlLXN0b3AtbWFya2VyLW1lcmdlZCxcbi5UcmFuc2l0aXZlID4gLnNjaGVtYXRpYy1tYXAgLnRyYW5zaXRpdmUtbXVsdGlwb2ludC1tYXJrZXItbWVyZ2VkIHtcbiAgZmlsbDogI2ZmZjtcbiAgc3Ryb2tlOiAjMzMzO1xuICBzdHJva2Utd2lkdGg6IDFweDtcbn1cblxuLyoqXG4gKiBUaWxlIExheWVyXG4gKi9cblxuLlRyYW5zaXRpdmUgPiAudGlsZS1sYXllciB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgei1pbmRleDogNTA7XG59XG5cbi5UcmFuc2l0aXZlID4gLnRpbGUtbGF5ZXIgPiAudGlsZSB7XG4gIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHdpZHRoOiAyNTZweDtcbiAgaGVpZ2h0OiAyNTZweDtcbn1cblxuLyoqXG4gKiBHcmlkXG4gKi9cblxuLlRyYW5zaXRpdmUgLmdyaWRsaW5lIHtcbiAgZmlsbDogbm9uZTtcbiAgc3Ryb2tlOiAjY2NjO1xuICBzdHJva2Utd2lkdGg6IDFweDtcbn1cbiJdfQ== */ \ No newline at end of file diff --git a/dist/bundle.js b/dist/bundle.js deleted file mode 100644 index 51f7ef5b..00000000 --- a/dist/bundle.js +++ /dev/null @@ -1,19276 +0,0 @@ -(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o 1) { - for (var i = 1; i < arguments.length; i++) { - args[i - 1] = arguments[i]; - } - } - queue.push(new Item(fun, args)); - if (queue.length === 1 && !draining) { - runTimeout(drainQueue); - } -}; - -// v8 likes predictible objects -function Item(fun, array) { - this.fun = fun; - this.array = array; -} -Item.prototype.run = function () { - this.fun.apply(null, this.array); -}; -process.title = 'browser'; -process.browser = true; -process.env = {}; -process.argv = []; -process.version = ''; // empty string to avoid regexp issues -process.versions = {}; - -function noop() {} - -process.on = noop; -process.addListener = noop; -process.once = noop; -process.off = noop; -process.removeListener = noop; -process.removeAllListeners = noop; -process.emit = noop; - -process.binding = function (name) { - throw new Error('process.binding is not supported'); -}; - -process.cwd = function () { return '/' }; -process.chdir = function (dir) { - throw new Error('process.chdir is not supported'); -}; -process.umask = function() { return 0; }; - -},{}],2:[function(require,module,exports){ -'use strict'; - -var PathSegment = require('./pathsegment'); -var NetworkPath = require('./path'); -var TurnPoint = require('../point/turn'); - -var each = require('component-each'); -/** - * Expose `Journey` - */ - -module.exports = Journey; - -/** - * - */ - -function Journey(data, network) { - this.network = network; - - for (var key in data) { - this[key] = data[key]; - } - - this.path = new NetworkPath(this); - - each(this.segments, function (segmentInfo) { - var pathSegment = new PathSegment(segmentInfo.type, this.path); - pathSegment.journeySegment = segmentInfo; - - if (segmentInfo.type === 'TRANSIT') { - if (segmentInfo.patterns) { - each(segmentInfo.patterns, function (patternInfo) { - pathSegment.addPattern(network.patterns[patternInfo.pattern_id], patternInfo.from_stop_index, patternInfo.to_stop_index); - }); - } else if (segmentInfo.pattern_id) { - // legacy support for single-pattern journey segments - pathSegment.addPattern(network.patterns[segmentInfo.pattern_id], segmentInfo.from_stop_index, segmentInfo.to_stop_index); - } - } else { - // non-transit segment - var streetEdges = []; - // screen out degenerate transfer segments - if (segmentInfo.from.type === 'STOP' && segmentInfo.to.type === 'STOP' && segmentInfo.from.stop_id === segmentInfo.to.stop_id) return; - - pathSegment.points.push(getEndPoint(segmentInfo.from, network)); - if (segmentInfo.streetEdges && segmentInfo.streetEdges.length > 0) { - var lastTurnPoint = null; - - for (var i = 0; i < segmentInfo.streetEdges.length; i++) { - var streetEdgeId = segmentInfo.streetEdges[i]; - var streetEdge = network.streetEdges[streetEdgeId]; - streetEdge.id = streetEdgeId; - streetEdges.push(streetEdge); - if (i >= segmentInfo.streetEdges.length - 1) continue; - - if (lastTurnPoint) streetEdge.fromTurnPoint = lastTurnPoint; - var lastIndex = streetEdge.length - 1; - - // screen out degenerate edges - if (streetEdge.latLons[0][0] === streetEdge.latLons[lastIndex][0] && streetEdge.latLons[0][1] === streetEdge.latLons[lastIndex][1]) { - continue; - } - - // create a TurnPoint for the 'from' point of this edge - var turnPoint = getTurnPoint({ - lat: streetEdge.latLons[lastIndex][0], - lon: streetEdge.latLons[lastIndex][1], - worldX: streetEdge.worldCoords[lastIndex][0], - worldY: streetEdge.worldCoords[lastIndex][1] - }, network); - - // compute the angle represented by this turn point - /* turnPoint.turnAngle = Util.angleFromThreePoints( - streetEdge.worldCoords[0][0], - streetEdge.worldCoords[0][1], - streetEdge.worldCoords[lastIndex][0], - streetEdge.worldCoords[lastIndex][1], - nextEdge.worldCoords[nextEdge.length-1][0], - nextEdge.worldCoords[nextEdge.length-1][1] - ); */ - - pathSegment.points.push(turnPoint); - lastTurnPoint = streetEdge.toTurnPoint = turnPoint; - } - pathSegment.streetEdges = streetEdges; - } - pathSegment.points.push(getEndPoint(segmentInfo.to, network)); - } - this.path.addSegment(pathSegment); - }, this); -} - -function getEndPoint(pointInfo, network) { - if (pointInfo.type === 'PLACE') { - return network.places[pointInfo.place_id]; - } else if (pointInfo.type === 'STOP') { - return network.stops[pointInfo.stop_id]; - } -} - -Journey.prototype.getElementId = function () { - return 'journey-' + this.journey_id; -}; - -/* utility function for creating non-duplicative TurnPoints */ - -function getTurnPoint(turnPointInfo, network) { - var key = turnPointInfo.lat + '_' + turnPointInfo.lon; - if (key in network.turnPoints) return network.turnPoints[key]; - var turnPoint = new TurnPoint(turnPointInfo, key); - network.turnPoints[key] = turnPoint; - // network.addVertexPoint(turnPoint); - return turnPoint; -} - -},{"../point/turn":29,"./path":4,"./pathsegment":5,"component-each":84}],3:[function(require,module,exports){ -'use strict'; - -var each = require('component-each'); -var debug = require('debug')('transitive:network'); -var Emitter = require('component-emitter'); - -var Route = require('./route'); -var RoutePattern = require('./pattern'); -var Journey = require('./journey'); - -var Stop = require('../point/stop'); -var Place = require('../point/place'); -var PointClusterMap = require('../point/pointclustermap'); -var RenderedEdge = require('../renderer/renderededge'); -var RenderedSegment = require('../renderer/renderedsegment'); - -var Graph = require('../graph'); - -var Polyline = require('../util/polyline.js'); -var SphericalMercator = require('../util/spherical-mercator'); -var sm = new SphericalMercator(); - -/** - * Expose `Network` - */ - -module.exports = Network; - -/** - * - */ - -function Network(transitive, data) { - this.transitive = transitive; - - this.routes = {}; - this.stops = {}; - this.patterns = {}; - this.places = {}; - this.journeys = {}; - this.paths = []; - this.baseVertexPoints = []; - this.graph = new Graph(this, []); - - if (data) this.load(data); -} - -/** - * Mixin `Emitter` - */ - -Emitter(Network.prototype); - -/** - * Load - * - * @param {Object} data - */ - -Network.prototype.load = function (data) { - debug('loading', data); - var self = this; - - // check data - if (!data) data = {}; - - // Store data - this.data = data; - - // A list of points (stops & places) that will always become vertices in the network - // graph (regardless of zoom scale). This includes all points that serve as a segment - // endpoint and/or a convergence/divergence point between segments - this.baseVertexPoints = []; - - // object maps stop ids to arrays of unique stop_ids reachable from that stop - this.adjacentStops = {}; - - // maps lat_lon key to unique TurnPoint object - this.turnPoints = {}; - - // Copy/decode the streetEdge objects - this.streetEdges = {}; - each(data.streetEdges, function (data) { - var latLons = Polyline.decode(data.geometry.points); - var coords = []; - each(latLons, function (latLon) { - coords.push(sm.forward([latLon[1], latLon[0]])); - }); - this.streetEdges[data.edge_id] = { - latLons: latLons, - worldCoords: coords, - length: data.geometry.length - }; - }, this); - - // Generate the route objects - this.routes = {}; - each(data.routes, function (data) { - this.routes[data.route_id] = new Route(data); - }, this); - - // Generate the stop objects - this.stops = {}; - each(data.stops, function (data) { - this.stops[data.stop_id] = new Stop(data); - }, this); - - // Generate the pattern objects - this.patterns = {}; - each(data.patterns, function (data) { - var pattern = new RoutePattern(data, this); - this.patterns[data.pattern_id] = pattern; - var route = this.routes[data.route_id]; - if (route) { - route.addPattern(pattern); - pattern.route = route; - } else { - debug('Error: pattern ' + data.pattern_id + ' refers to route that was not found: ' + data.route_id); - } - if (pattern.render) this.paths.push(pattern.createPath()); - }, this); - - // Generate the place objects - this.places = {}; - each(data.places, function (data) { - var place = this.places[data.place_id] = new Place(data, this); - this.addVertexPoint(place); - }, this); - - // Generate the internal Journey objects - this.journeys = {}; - each(data.journeys, function (journeyData) { - var journey = new Journey(journeyData, this); - this.journeys[journeyData.journey_id] = journey; - this.paths.push(journey.path); - }, this); - - // process the path segments - for (var p = 0; p < this.paths.length; p++) { - var path = this.paths[p]; - for (var s = 0; s < path.segments.length; s++) { - this.processSegment(path.segments[s]); - } - } - - // when rendering pattern paths only, determine convergence/divergence vertex - // stops by looking for stops w/ >2 adjacent stops - if (!data.journeys || data.journeys.length === 0) { - for (var stopId in this.adjacentStops) { - if (this.adjacentStops[stopId].length > 2) { - this.addVertexPoint(this.stops[stopId]); - } - } - } - - // determine which TurnPoints should be base vertices - var turnLookup = {}; - var addTurn = function addTurn(turn1, turn2) { - if (!(turn1.getId() in turnLookup)) turnLookup[turn1.getId()] = []; - if (turnLookup[turn1.getId()].indexOf(turn2) === -1) turnLookup[turn1.getId()].push(turn2); - }; - each(this.streetEdges, function (streetEdgeId) { - var streetEdge = self.streetEdges[streetEdgeId]; - if (streetEdge.fromTurnPoint && streetEdge.toTurnPoint) { - addTurn(streetEdge.toTurnPoint, streetEdge.fromTurnPoint); - addTurn(streetEdge.fromTurnPoint, streetEdge.toTurnPoint); - } - }); - each(turnLookup, function (turnPointId) { - var count = turnLookup[turnPointId].length; - if (count > 2) self.addVertexPoint(self.turnPoints[turnPointId]); - }); - - this.createGraph(); - - this.loaded = true; - this.emit('load', this); - return this; -}; - -/** Graph Creation/Processing Methods **/ - -Network.prototype.clearGraphData = function () { - each(this.paths, function (path) { - path.clearGraphData(); - }); -}; - -Network.prototype.createGraph = function () { - this.applyZoomFactors(this.transitive.display.activeZoomFactors); - - // clear previous graph-specific data - if (this.pointClusterMap) this.pointClusterMap.clearMultiPoints(); - each(this.stops, function (stopId) { - this.stops[stopId].setFocused(true); - }, this); - - // create the list of vertex points - var vertexPoints; - if (this.mergeVertexThreshold && this.mergeVertexThreshold > 0) { - this.pointClusterMap = new PointClusterMap(this, this.mergeVertexThreshold); - vertexPoints = this.pointClusterMap.getVertexPoints(this.baseVertexPoints); - } else vertexPoints = this.baseVertexPoints; - - // core graph creation steps - this.graph = new Graph(this, vertexPoints); - this.populateGraphEdges(); - this.graph.pruneVertices(); - this.createInternalVertexPoints(); - if (this.isSnapping()) this.graph.snapToGrid(this.gridCellSize); - this.graph.sortVertices(); - - // other post-processing actions - this.annotateTransitPoints(); - // this.initPlaceAdjacency(); - this.createRenderedSegments(); - this.transitive.labeler.updateLabelList(this.graph); - this.updateGeometry(true); -}; - -Network.prototype.isSnapping = function () { - return this.gridCellSize && this.gridCellSize !== 0; -}; - -/* - * identify and populate the 'internal' vertex points, which is zoom-level specfic - */ - -Network.prototype.createInternalVertexPoints = function () { - this.internalVertexPoints = []; - - for (var i in this.graph.edgeGroups) { - var edgeGroup = this.graph.edgeGroups[i]; - - var wlen = edgeGroup.getWorldLength(); - - var splitPoints = []; - - // compute the maximum number of internal points for this edge to add as graph vertices - if (edgeGroup.hasTransit()) { - var vertexFactor = this.internalVertexFactor; //! edgeGroup.hasTransit() ? 1 : this.internalVertexFactor; - var newVertexCount = Math.floor(wlen / vertexFactor); - - // get the priority queue of the edge's internal points - var pq = edgeGroup.getInternalVertexPQ(); - - // pull the 'best' points from the queue until we reach the maximum - while (splitPoints.length < newVertexCount && pq.size() > 0) { - var el = pq.deq(); - splitPoints.push(el.point); - } - } - - // perform the split operation (if needed) - if (splitPoints.length > 0) { - for (var e = 0; e < edgeGroup.edges.length; e++) { - var edge = edgeGroup.edges[e]; - this.graph.splitEdgeAtInternalPoints(edge, splitPoints); - } - } - } -}; - -Network.prototype.updateGeometry = function () { - // clear the stop render data - // for (var key in this.stops) this.stops[key].renderData = []; - - this.graph.vertices.forEach(function (vertex) { - // vertex.snapped = false; - vertex.point.clearRenderData(); - }); - - // refresh the edge-based points - this.graph.edges.forEach(function (edge) { - edge.pointArray.forEach(function (point) { - point.clearRenderData(); - }); - }); - - this.renderedEdges.forEach(function (rEdge) { - rEdge.clearOffsets(); - }); - - // if (snapGrid) - // if(this.gridCellSize && this.gridCellSize !== 0) this.graph.snapToGrid(this.gridCellSize); - - // this.fixPointOverlaps(); - - this.graph.calculateGeometry(this.gridCellSize, this.angleConstraint); - - this.graph.apply2DOffsets(this); -}; - -Network.prototype.applyZoomFactors = function (factors) { - this.gridCellSize = factors.gridCellSize; - this.internalVertexFactor = factors.internalVertexFactor; - this.angleConstraint = factors.angleConstraint; - this.mergeVertexThreshold = factors.mergeVertexThreshold; -}; - -/** - * - */ - -Network.prototype.processSegment = function (segment) { - // iterate through this pattern's stops, associating stops/patterns with - // each other and initializing the adjacentStops table - var previousStop = null; - for (var i = 0; i < segment.points.length; i++) { - var point = segment.points[i]; - point.used = true; - - // called for each pair of adjacent stops in sequence - if (previousStop && point.getType() === 'STOP') { - this.addStopAdjacency(point.getId(), previousStop.getId()); - this.addStopAdjacency(previousStop.getId(), point.getId()); - } - - previousStop = point.getType() === 'STOP' ? point : null; - - // add the start and end points to the vertexStops collection - var startPoint = segment.points[0]; - this.addVertexPoint(startPoint); - startPoint.isSegmentEndPoint = true; - - var endPoint = segment.points[segment.points.length - 1]; - this.addVertexPoint(endPoint); - endPoint.isSegmentEndPoint = true; - } -}; - -/** - * Helper function for stopAjacency table - * - * @param {Stop} adjacent stops list - * @param {Stop} stopA - * @param {Stop} stopB - */ - -Network.prototype.addStopAdjacency = function (stopIdA, stopIdB) { - if (!this.adjacentStops[stopIdA]) this.adjacentStops[stopIdA] = []; - if (this.adjacentStops[stopIdA].indexOf(stopIdB) === -1) this.adjacentStops[stopIdA].push(stopIdB); -}; - -/** - * Populate the graph edges - */ - -Network.prototype.populateGraphEdges = function () { - // vertex associated with the last vertex point we passed in this sequence - var lastVertex = null; - - // collection of 'internal' (i.e. non-vertex) points passed - // since the last vertex point - var internalPoints = []; - - each(this.paths, function (path) { - each(path.segments, function (segment) { - lastVertex = null; - - var streetEdgeIndex = 0; - - // for transit segments, see if there is a pattern with inter-stop geometry defined - var representativePattern = null; - if (segment.type === 'TRANSIT') { - for (var i = 0; i < segment.patternGroup.patterns.length; i++) { - var pattern = segment.patternGroup.patterns[i]; - if (pattern.interStopGeometry && pattern.interStopGeometry.length === pattern.stops.length - 1) { - representativePattern = pattern; - break; - } - } - } - - /** - * geomCoords: The geographic coordinates for the graph edge currently - * being constructed, used when rendering edges in "real-world" (i.e. - * non-schematic) mode. geomCoords data is only initialized here for - * street-based segments, using the segment's embedded street geometry - * data (if provided). - */ - var geomCoords = []; - - /** - * pointGeom: An array of point-specific geometry (i.e. the alignment - * connecting this point to the following point in the containing - * segment's point sequence. Currently applies to transit segments only. - * pointGeom data is converted to geomCoords for rendering in the - * splitEdgeAtInternalPoints method of NetworkGraph - */ - var pointGeom = []; - - each(segment.points, function (point, index) { - if (segment.streetEdges) { - // street-based segment with street-edge geometry - for (var i = streetEdgeIndex; i < segment.streetEdges.length; i++) { - if (index === 0) break; - - geomCoords = geomCoords.concat(geomCoords.length > 0 ? segment.streetEdges[i].worldCoords.slice(1) : segment.streetEdges[i].worldCoords); - if (segment.streetEdges[i].toTurnPoint === point) { - streetEdgeIndex = i + 1; - break; - } - } - } else if (representativePattern) { - // transit-based segment with known geometry - var fromIndex = segment.patternGroup.getFromIndex(representativePattern); - - // ignore the first stop, since the geometry at this index represents - // the alignment leading into that stop - if (index > 0) { - // add the alignment extending from this stop to the pointGeom array - var geom = representativePattern.interStopGeometry[fromIndex + index - 1]; - pointGeom.push(geom); - } - } - - if (point.multipoint) point = point.multipoint; - - if (point.graphVertex) { - // this is a vertex point - if (lastVertex !== null) { - if (lastVertex.point === point) return; - - // see if an equivalent graph edge already exists - var fromVertex = lastVertex; - var toVertex = point.graphVertex; - var edge = this.graph.getEquivalentEdge(internalPoints, fromVertex, toVertex); - - // create a new graph edge if necessary - if (!edge) { - edge = this.graph.addEdge(internalPoints, fromVertex, toVertex, segment.getType()); - if (geomCoords && geomCoords.length > 0) edge.geomCoords = geomCoords; - if (pointGeom && pointGeom.length > 0) edge.pointGeom = pointGeom; - } - - // associate the graph edge and path segment with each other - segment.addEdge(edge, fromVertex); - edge.addPathSegment(segment); - - // reset the geomCoords and pointGeom arrays for the next edge - geomCoords = []; - pointGeom = []; - } - - lastVertex = point.graphVertex; - internalPoints = []; - } else { - // this is an internal point - internalPoints.push(point); - } - }, this); - // } - }, this); - }, this); -}; - -Network.prototype.createGraphEdge = function (segment, fromVertex, toVertex, internalPoints, geomCoords) { - var edge = this.graph.getEquivalentEdge(internalPoints, fromVertex, toVertex); - - if (!edge) { - edge = this.graph.addEdge(internalPoints, fromVertex, toVertex, segment.getType()); - - // calculate the angle and apply to edge stops - /* var dx = fromVertex.x - toVertex.x; - var dy = fromVertex.y - toVertex.y; - var angle = Math.atan2(dy, dx) * 180 / Math.PI; - point.angle = lastVertex.point.angle = angle; - for (var is = 0; is < internalPoints.length; is++) { - internalPoints[is].angle = angle; - } */ - - if (geomCoords) edge.geomCoords = geomCoords; - - debug('--- created edge ' + edge.toString()); - debug(edge); - each(edge.geomCoords, function (c) { - debug(c); - }); - } - - segment.addEdge(edge, fromVertex); - edge.addPathSegment(segment); -}; - -Network.prototype.annotateTransitPoints = function () { - this.paths.forEach(function (path) { - var transitSegments = []; - path.segments.forEach(function (pathSegment) { - if (pathSegment.type === 'TRANSIT') transitSegments.push(pathSegment); - }); - - path.segments.forEach(function (pathSegment) { - if (pathSegment.type === 'TRANSIT') { - // if first transit segment in path, mark 'from' endpoint as board point - if (transitSegments.indexOf(pathSegment) === 0) { - pathSegment.points[0].isBoardPoint = true; - - // if there are additional transit segments, mark the 'to' endpoint as a transfer point - if (transitSegments.length > 1) pathSegment.points[pathSegment.points.length - 1].isTransferPoint = true; - - // if last transit segment in path, mark 'to' endpoint as alight point - } else if (transitSegments.indexOf(pathSegment) === transitSegments.length - 1) { - pathSegment.points[pathSegment.points.length - 1].isAlightPoint = true; - - // if there are additional transit segments, mark the 'from' endpoint as a transfer point - if (transitSegments.length > 1) pathSegment.points[0].isTransferPoint = true; - - // if this is an 'internal' transit segment, mark both endpoints as transfer points - } else if (transitSegments.length > 2) { - pathSegment.points[0].isTransferPoint = true; - pathSegment.points[pathSegment.points.length - 1].isTransferPoint = true; - } - } - }); - }); -}; - -Network.prototype.initPlaceAdjacency = function () { - each(this.places, function (placeId) { - var place = this.places[placeId]; - if (!place.graphVertex) return; - each(place.graphVertex.incidentEdges(), function (edge) { - var oppVertex = edge.oppositeVertex(place.graphVertex); - if (oppVertex.point) { - oppVertex.point.adjacentPlace = place; - } - }); - }, this); -}; - -Network.prototype.createRenderedSegments = function () { - this.reLookup = {}; - this.renderedEdges = []; - this.renderedSegments = []; - - for (var patternId in this.patterns) { - this.patterns[patternId].renderedEdges = []; - } - - each(this.paths, function (path) { - each(path.segments, function (pathSegment) { - pathSegment.renderedSegments = []; - - if (pathSegment.type === 'TRANSIT') { - // create a RenderedSegment for each pattern, except for buses which are collapsed to a single segment - var busPatterns = []; - each(pathSegment.getPatterns(), function (pattern) { - if (pattern.route.route_type === 3) busPatterns.push(pattern);else this.createRenderedSegment(pathSegment, [pattern]); - }, this); - if (busPatterns.length > 0) { - this.createRenderedSegment(pathSegment, busPatterns); - } - } else { - // non-transit segments - this.createRenderedSegment(pathSegment); - } - }, this); - }, this); - - this.renderedEdges.sort(function (a, b) { - // process render transit segments before walk - if (a.getType() === 'WALK') return 1; - if (b.getType() === 'WALK') return -1; - }); -}; - -Network.prototype.createRenderedSegment = function (pathSegment, patterns) { - var rSegment = new RenderedSegment(pathSegment); - - each(pathSegment.edges, function (edge) { - var rEdge = this.createRenderedEdge(pathSegment, edge.graphEdge, edge.forward, patterns); - rSegment.addRenderedEdge(rEdge); - }, this); - if (patterns) { - rSegment.patterns = patterns; - rSegment.mode = patterns[0].route.route_type; - } - - pathSegment.addRenderedSegment(rSegment); -}; - -Network.prototype.createRenderedEdge = function (pathSegment, gEdge, forward, patterns) { - var rEdge; - - // construct the edge key, disregarding mode qualifiers (e.g. "_RENT") - var type = pathSegment.getType().split('_')[0]; - var key = gEdge.id + (forward ? 'F' : 'R') + '_' + type; - - // for non-bus transit edges, append an exemplar pattern ID to the key - if (patterns && patterns[0].route.route_type !== 3) { - key += '_' + patterns[0].getId(); - } - - // see if this r-edge already exists - if (key in this.reLookup) { - rEdge = this.reLookup[key]; - } else { - // if not, create it - rEdge = new RenderedEdge(gEdge, forward, type); - if (patterns) { - each(patterns, function (pattern) { - pattern.addRenderedEdge(rEdge); - rEdge.addPattern(pattern); - }); - rEdge.mode = patterns[0].route.route_type; - } - rEdge.points.push(gEdge.fromVertex.point); - rEdge.points.push(gEdge.toVertex.point); - gEdge.addRenderedEdge(rEdge); - rEdge.addPathSegment(pathSegment); - - this.renderedEdges.push(rEdge); - this.reLookup[key] = rEdge; - } - return rEdge; -}; - -Network.prototype.addVertexPoint = function (point) { - if (this.baseVertexPoints.indexOf(point) !== -1) return; - this.baseVertexPoints.push(point); -}; - -},{"../graph":16,"../point/place":25,"../point/pointclustermap":27,"../point/stop":28,"../renderer/renderededge":32,"../renderer/renderedsegment":33,"../util/polyline.js":40,"../util/spherical-mercator":41,"./journey":2,"./pattern":6,"./route":8,"component-each":84,"component-emitter":85,"debug":90}],4:[function(require,module,exports){ -'use strict'; - -var d3 = require('d3'); - -var interpolateLine = require('../util/interpolate-line'); - -/** - * Expose `NetworkPath` - */ - -module.exports = NetworkPath; - -/** - * NetworkPath -- a path through the network graph. Composed of PathSegments (which - * are in turn composed of a sequence of graph edges) - * - * @param {Object} the parent onject (a RoutePattern or Journey) - */ - -function NetworkPath(parent) { - this.parent = parent; - this.segments = []; -} - -NetworkPath.prototype.clearGraphData = function (segment) { - this.segments.forEach(function (segment) { - segment.clearGraphData(); - }); -}; - -/** - * addSegment: add a new segment to the end of this NetworkPath - */ - -NetworkPath.prototype.addSegment = function (segment) { - this.segments.push(segment); - segment.points.forEach(function (point) { - point.paths.push(this); - }, this); -}; - -/** highlight **/ - -NetworkPath.prototype.drawHighlight = function (display, capExtension) { - this.line = d3.svg.line() // the line translation function - .x(function (pointInfo, i) { - return display.xScale(pointInfo.x) + (pointInfo.offsetX || 0); - }).y(function (pointInfo, i) { - return display.yScale(pointInfo.y) - (pointInfo.offsetY || 0); - }).interpolate(interpolateLine.bind(this)); - - this.lineGraph = display.svg.append('path').attr('id', 'transitive-path-highlight-' + this.parent.getElementId()).attr('class', 'transitive-path-highlight').style('stroke-width', 24).style('stroke', '#ff4').style('fill', 'none').style('visibility', 'hidden').data([this]); -}; - -NetworkPath.prototype.getRenderedSegments = function () { - var renderedSegments = []; - this.segments.forEach(function (pathSegment) { - renderedSegments = renderedSegments.concat(pathSegment.renderedSegments); - }); - return renderedSegments; -}; - -/** - * getPointArray - */ - -NetworkPath.prototype.getPointArray = function () { - var points = []; - for (var i = 0; i < this.segments.length; i++) { - var segment = this.segments[i]; - if (i > 0 && segment.points[0] === this.segments[i - 1].points[this.segments[i - 1].points.length - 1]) { - points.concat(segment.points.slice(1)); - } else { - points.concat(segment.points); - } - } - return points; -}; - -},{"../util/interpolate-line":39,"d3":88}],5:[function(require,module,exports){ -'use strict'; - -/** - * Dependencies - */ - -var each = require('component-each'); - -var PatternGroup = require('./patterngroup'); -var LabelEdgeGroup = require('../labeler/labeledgegroup.js'); - -var segmentId = 0; - -/** - * Expose `PathSegment` - */ - -module.exports = PathSegment; - -/** - * - */ - -function PathSegment(type, path) { - this.id = segmentId++; - this.type = type; - this.path = path; - this.points = []; - this.edges = []; - this.renderedSegments = []; - this.patternGroup = new PatternGroup(); -} - -PathSegment.prototype.clearGraphData = function () { - this.edges = []; - this.points.forEach(function (point) { - point.graphVertex = null; - }); - this.renderLength = null; -}; - -PathSegment.prototype.getId = function () { - return this.id; -}; - -PathSegment.prototype.getType = function () { - return this.type; -}; - -PathSegment.prototype.addRenderedSegment = function (rSegment) { - this.renderedSegments.push(rSegment); -}; - -PathSegment.prototype.addEdge = function (graphEdge, originVertex) { - this.edges.push({ - graphEdge: graphEdge, - forward: originVertex === graphEdge.fromVertex - }); -}; - -PathSegment.prototype.insertEdgeAt = function (index, graphEdge, originVertex) { - var edgeInfo = { - graphEdge: graphEdge, - forward: originVertex === graphEdge.fromVertex - }; - this.edges.splice(index, 0, edgeInfo); -}; - -PathSegment.prototype.removeEdge = function (graphEdge) { - var index = null; - for (var i = 0; i < this.edges.length; i++) { - if (this.edges[i].graphEdge === graphEdge) { - index = i; - break; - } - } - if (index !== null) this.edges.splice(index, 1); -}; - -PathSegment.prototype.getEdgeIndex = function (graphEdge) { - for (var i = 0; i < this.edges.length; i++) { - if (this.edges[i].graphEdge === graphEdge) return i; - } - return -1; -}; - -/** - * Get graph vertices - */ - -PathSegment.prototype.getGraphVertices = function () { - var vertices = []; - this.edges.forEach(function (edge, i) { - if (i === 0) { - vertices.push(edge.graphEdge.fromVertex); - } - vertices.push(edge.graphEdge.toVertex); - }); - return vertices; -}; - -PathSegment.prototype.vertexArray = function () { - var vertex = this.startVertex(); - var array = [vertex]; - - this.edges.forEach(function (edgeInfo) { - vertex = edgeInfo.graphEdge.oppositeVertex(vertex); - array.push(vertex); - }); - - return array; -}; - -PathSegment.prototype.startVertex = function () { - if (this.points[0].multipoint) return this.points[0].multipoint.graphVertex; - if (!this.edges || this.edges.length === 0) return null; - - var firstGraphEdge = this.edges[0].graphEdge; - return this.edges[0].forward ? firstGraphEdge.fromVertex : firstGraphEdge.toVertex; - - /* if (this.graphEdges.length === 1) return this.graphEdges[0].fromVertex; - var first = this.graphEdges[0], - next = this.graphEdges[1]; - if (first.toVertex == next.toVertex || first.toVertex == next.fromVertex) - return first.fromVertex; - if (first.fromVertex == next.toVertex || first.fromVertex == next.fromVertex) - return first.toVertex; - return null; */ -}; - -PathSegment.prototype.endVertex = function () { - if (this.points[this.points.length - 1].multipoint) return this.points[this.points.length - 1].multipoint.graphVertex; - if (!this.edges || this.edges.length === 0) return null; - - var lastGraphEdge = this.edges[this.edges.length - 1].graphEdge; - return this.edges[this.edges.length - 1].forward ? lastGraphEdge.toVertex : lastGraphEdge.fromVertex; - - /* if (this.graphEdges.length === 1) return this.graphEdges[0].toVertex; - var last = this.graphEdges[this.graphEdges.length - 1], - prev = this.graphEdges[this.graphEdges.length - 2]; - if (last.toVertex == prev.toVertex || last.toVertex == prev.fromVertex) - return last.fromVertex; - if (last.fromVertex == prev.toVertex || last.fromVertex == prev.fromVertex) - return last.toVertex; - return null; */ -}; - -PathSegment.prototype.addPattern = function (pattern, fromIndex, toIndex) { - // Initialize this segment's 'points' array to include the stops in the - // provided pattern between the specified from and to indices, inclusive. - // Only do this if the points array is empty or if the the length of the - // segment being added exceeds that of the one currently stored. - if (toIndex - fromIndex + 1 > this.points.length) { - this.points = []; - var lastStop = null; - for (var i = fromIndex; i <= toIndex; i++) { - var stop = pattern.stops[i]; - if (lastStop !== stop) { - this.points.push(stop); - } - lastStop = stop; - } - } - - // Add the pattern to this segment's PatternGroup - this.patternGroup.addPattern(pattern, fromIndex, toIndex); -}; - -PathSegment.prototype.getPattern = function () { - return this.patternGroup.patterns[0]; -}; - -PathSegment.prototype.getPatterns = function () { - return this.patternGroup.patterns; -}; - -PathSegment.prototype.getMode = function () { - return this.patternGroup.patterns[0].route.route_type; -}; - -PathSegment.prototype.toString = function () { - var startVertex = this.startVertex(); - var endVertex = this.endVertex(); - return 'PathSegment id=' + this.id + ' type=' + this.type + ' from ' + (startVertex ? startVertex.toString() : '(unknown)') + ' to ' + (endVertex ? endVertex.toString() : '(unknown)'); -}; - -PathSegment.prototype.getLabelEdgeGroups = function () { - var edgeGroups = []; - each(this.renderedSegments, function (rSegment) { - if (!rSegment.isFocused()) return; - var currentGroup = new LabelEdgeGroup(rSegment); - each(rSegment.renderedEdges, function (rEdge) { - currentGroup.addEdge(rEdge); - if (rEdge.graphEdge.toVertex.point.containsSegmentEndPoint()) { - edgeGroups.push(currentGroup); - currentGroup = new LabelEdgeGroup(rSegment); - } - }, this); - }, this); - - return edgeGroups; -}; - -},{"../labeler/labeledgegroup.js":20,"./patterngroup":7,"component-each":84}],6:[function(require,module,exports){ -'use strict'; - -var each = require('component-each'); - -var NetworkPath = require('./path'); -var PathSegment = require('./pathsegment'); - -var Polyline = require('../util/polyline.js'); -var SphericalMercator = require('../util/spherical-mercator'); -var sm = new SphericalMercator(); - -/** - * Expose `RoutePattern` - */ - -module.exports = RoutePattern; - -/** - * A RoutePattern - * - * @param {Object} RoutePattern data object from the transitive.js input - */ - -function RoutePattern(data, transitive) { - for (var key in data) { - if (key === 'stops') continue; - this[key] = data[key]; - } - - // the array of Stops that make up this pattern - this.stops = []; - - // the inter-stop geometry, an array of point sequences (themselves arrays) - // that represent the geometry beween stops i and i+1. This array should be - // exactly one item shorter than the stops array. - this.interStopGeometry = []; - - if (transitive) { - each(data.stops, function (stop) { - // look up the Stop in the master collection and add to the stops array - this.stops.push(transitive.stops[stop.stop_id]); - - // if inter-stop geometry is provided: decode polyline, convert points - // to SphericalMercator, and add to the interStopGeometry array - if (stop.geometry) { - var latLons = Polyline.decode(stop.geometry); - var coords = []; - each(latLons, function (latLon) { - coords.push(sm.forward([latLon[1], latLon[0]])); - }); - this.interStopGeometry.push(coords); - } - }, this); - } - - this.renderedEdges = []; -} - -RoutePattern.prototype.getId = function () { - return this.pattern_id; -}; - -RoutePattern.prototype.getElementId = function () { - return 'pattern-' + this.pattern_id; -}; - -RoutePattern.prototype.getName = function () { - return this.pattern_name; -}; - -RoutePattern.prototype.addRenderedEdge = function (rEdge) { - if (this.renderedEdges.indexOf(rEdge) === -1) this.renderedEdges.push(rEdge); -}; - -RoutePattern.prototype.offsetAlignment = function (alignmentId, offset) { - each(this.renderedEdges, function (rEdge) { - rEdge.offsetAlignment(alignmentId, offset); - }); -}; - -RoutePattern.prototype.createPath = function () { - var path = new NetworkPath(this); - var pathSegment = new PathSegment('TRANSIT', path); - pathSegment.addPattern(this, 0, this.stops.length - 1); - path.addSegment(pathSegment); - return path; -}; - -},{"../util/polyline.js":40,"../util/spherical-mercator":41,"./path":4,"./pathsegment":5,"component-each":84}],7:[function(require,module,exports){ -"use strict"; - -/** - * Expose `PatternGroup` - */ - -module.exports = PatternGroup; - -/** - * PatternGroup -- a collection of one or more RoutePatterns associated with - * a PathSegment - * - * @param {Object} RoutePattern data object from the transitive.js input - */ - -function PatternGroup() { - this.patterns = []; - - // lookup tables mapping pattern IDs to their from/to indices in the containing PathSegment - this.fromIndexLookup = {}; - this.toIndexLookup = {}; -} - -PatternGroup.prototype.addPattern = function (pattern, fromIndex, toIndex) { - if (this.patterns.indexOf(pattern) === -1) { - this.patterns.push(pattern); - this.fromIndexLookup[pattern.pattern_id] = fromIndex; - this.toIndexLookup[pattern.pattern_id] = toIndex; - } -}; - -PatternGroup.prototype.getFromIndex = function (pattern) { - return this.fromIndexLookup[pattern.pattern_id]; -}; - -PatternGroup.prototype.getToIndex = function (pattern) { - return this.toIndexLookup[pattern.pattern_id]; -}; - -},{}],8:[function(require,module,exports){ -'use strict'; - -/** - * Expose `Route` - */ - -module.exports = Route; - -/** - * A transit Route, as defined in the input data. - * Routes contain one or more Patterns. - * - * @param {Object} - */ - -function Route(data) { - for (var key in data) { - if (key === 'patterns') continue; - this[key] = data[key]; - } - - this.patterns = []; -} - -/** - * Add Pattern - * - * @param {Pattern} - */ - -Route.prototype.addPattern = function (pattern) { - this.patterns.push(pattern); - pattern.route = this; -}; - -Route.prototype.getColor = function () { - if (this.route_color) { - if (this.route_color.charAt(0) === '#') return this.route_color; - return '#' + this.route_color; - } - - // assign a random shade of gray - /* var c = 128 + Math.floor(64 * Math.random()); - var hex = c.toString(16); - hex = (hex.length === 1) ? '0' + hex : hex; - this.route_color = '#' + hex + hex + hex; - return this.route_color; */ -}; - -},{}],9:[function(require,module,exports){ -'use strict'; - -var d3 = require('d3'); - -module.exports = function () { - var size = [960, 500]; - var scale = 256; - var translate = [size[0] / 2, size[1] / 2]; - var zoomDelta = 0; - - function tile() { - var z = Math.max(Math.log(scale) / Math.LN2 - 8, 0); - var z0 = Math.round(z + zoomDelta); - var k = Math.pow(2, z - z0 + 8); - var origin = [(translate[0] - scale / 2) / k, (translate[1] - scale / 2) / k]; - var tiles = []; - var cols = d3.range(Math.max(0, Math.floor(-origin[0])), Math.max(0, Math.ceil(size[0] / k - origin[0]))); - var rows = d3.range(Math.max(0, Math.floor(-origin[1])), Math.max(0, Math.ceil(size[1] / k - origin[1]))); - - rows.forEach(function (y) { - cols.forEach(function (x) { - tiles.push([x, y, z0]); - }); - }); - - tiles.translate = origin; - tiles.scale = k; - - return tiles; - } - - tile.size = function (_) { - if (!arguments.length) return size; - size = _; - return tile; - }; - - tile.scale = function (_) { - if (!arguments.length) return scale; - scale = _; - return tile; - }; - - tile.translate = function (_) { - if (!arguments.length) return translate; - translate = _; - return tile; - }; - - tile.zoomDelta = function (_) { - if (!arguments.length) return zoomDelta; - zoomDelta = +_; - return tile; - }; - - return tile; -}; - -},{"d3":88}],10:[function(require,module,exports){ -'use strict'; - -/** - * Draw the snapping grid - * - * @param {Display} display object - * @param {Number} cell size - */ - -module.exports = function drawGrid(display, cellSize) { - var svg = display.svg; - var xScale = display.xScale; - var yScale = display.yScale; - - // Remove all current gridlines - svg.selectAll('.gridline').remove(); - - // Add a grid group "behind" everything else - var grid = svg.insert('g', ':first-child'); - - var xRange = xScale.range(); - var yRange = yScale.range(); - var xDomain = xScale.domain(); - var yDomain = yScale.domain(); - - var xMin = Math.round(xDomain[0] / cellSize) * cellSize; - var xMax = Math.round(xDomain[1] / cellSize) * cellSize; - for (var x = xMin; x <= xMax; x += cellSize) { - appendLine(xScale(x), xScale(x), yRange[0], yRange[1]); - }var yMin = Math.round(yDomain[0] / cellSize) * cellSize; - var yMax = Math.round(yDomain[1] / cellSize) * cellSize; - for (var y = yMin; y <= yMax; y += cellSize) { - appendLine(xRange[0], xRange[1], yScale(y), yScale(y)); - }function appendLine(x1, x2, y1, y2) { - grid.append('line').attr({ - 'class': 'gridline', - 'x1': x1, - 'x2': x2, - 'y1': y1, - 'y2': y2 - }); - } -}; - -},{}],11:[function(require,module,exports){ -'use strict'; - -var d3 = require('d3'); -var debug = require('debug')('transitive:display'); - -var Legend = require('./legend'); -var TileLayer = require('./tile-layer'); - -var SphericalMercator = require('../util/spherical-mercator'); -var sm = new SphericalMercator(); - -/** - * Expose `Display` - */ - -module.exports = Display; - -/** - * The D3-based SVG display. - * - * @param {Object} options - */ - -function Display(transitive) { - this.transitive = transitive; - var el = this.el = transitive.el; - this.width = el.clientWidth; - this.height = el.clientHeight; - - // Set up the pan/zoom behavior - var zoom = this.zoom = d3.behavior.zoom().scaleExtent([0.25, 4]); - - var self = this; - - var zoomBehavior = function zoomBehavior() { - self.computeScale(); - if (self.scale !== self.lastScale) { - // zoom action - self.zoomChanged(); - } else { - // pan action - setTimeout(transitive.refresh.bind(transitive, true), 0); - } - - var llb = self.llBounds(); - debug('ll bounds: ' + llb[0][0] + ',' + llb[0][1] + ' to ' + llb[1][0] + ',' + llb[1][1]); - }; - - this.zoom.on('zoom.transitive', zoomBehavior); - - this.zoomFactors = transitive.options.zoomFactors || this.getDefaultZoomFactors(); - - // set up the svg display - var div = d3.select(el).attr('class', 'Transitive'); - - if (transitive.options.zoomEnabled) { - div.call(zoom); - } - - this.svg = div.append('svg').attr('class', 'schematic-map'); - - // initialize the x/y scale objects - this.xScale = d3.scale.linear(); - this.yScale = d3.scale.linear(); - - // set up the resize event handler - if (transitive.options.autoResize) { - d3.select(window).on('resize.display', function () { - self.resized(); - transitive.refresh(); - }); - } - - // set the scale - var bounds; - if (transitive.options.initialBounds) { - bounds = [sm.forward(transitive.options.initialBounds[0]), sm.forward(transitive.options.initialBounds[1])]; - } else if (transitive.network && transitive.network.graph) { - bounds = transitive.network.graph.bounds(); - } - - if (bounds) { - this.setScale(bounds, transitive.options); - this.updateActiveZoomFactors(this.scale); - this.lastScale = this.scale; - } else { - this.updateActiveZoomFactors(1); - } - - // set up the map layer - if (transitive.options.mapboxId) { - this.tileLayer = new TileLayer({ - el: this.el, - display: this, - graph: transitive.graph, - mapboxId: transitive.options.mapboxId - }); - } - - // set up the legend - if (transitive.options.legendEl) { - this.legend = new Legend(transitive.options.legendEl, this, transitive); - } - - transitive.emit('initialize display', transitive, this); - return this; -} - -/** - * zoomChanged -- called when the zoom level changes, either by through the native - * zoom support or the setBounds() API call. Updates zoom factors as needed and - * performs appropriate update action (render or refresh) - */ - -Display.prototype.zoomChanged = function () { - if (this.updateActiveZoomFactors(this.scale)) { - this.transitive.network = null; - this.transitive.render(); - } else this.transitive.refresh(); - this.lastScale = this.scale; -}; - -Display.prototype.updateActiveZoomFactors = function (scale) { - var updated = false; - for (var i = 0; i < this.zoomFactors.length; i++) { - var min = this.zoomFactors[i].minScale; - var max = i < this.zoomFactors.length - 1 ? this.zoomFactors[i + 1].minScale : Number.MAX_VALUE; - - // check if we've crossed into a new zoomFactor partition - if ((!this.lastScale || this.lastScale < min || this.lastScale >= max) && scale >= min && scale < max) { - this.activeZoomFactors = this.zoomFactors[i]; - updated = true; - } - } - return updated; -}; - -/** - * Return default zoom factors - */ - -Display.prototype.getDefaultZoomFactors = function (data) { - return [{ - minScale: 0, - gridCellSize: 25, - internalVertexFactor: 1000000, - angleConstraint: 45, - mergeVertexThreshold: 200 - }, { - minScale: 1.5, - gridCellSize: 0, - internalVertexFactor: 0, - angleConstraint: 5, - mergeVertexThreshold: 0 - }]; -}; - -/** - * Empty the display - */ - -Display.prototype.empty = function () { - debug('emptying svg'); - this.svg.selectAll('*').remove(); - - this.haloLayer = this.svg.insert('g', ':first-child'); -}; - -/** - * Set the scale - */ - -Display.prototype.setScale = function (bounds, options) { - this.height = this.el.clientHeight; - this.width = this.el.clientWidth; - - var domains = getDomains(this, this.height, this.width, bounds, options); - this.xScale.domain(domains[0]); - this.yScale.domain(domains[1]); - - this.xScale.range([0, this.width]); - this.yScale.range([this.height, 0]); - - debug('x scale %j -> %j', this.xScale.domain(), this.xScale.range()); - debug('y scale %j -> %j', this.yScale.domain(), this.yScale.range()); - - this.zoom.x(this.xScale).y(this.yScale); - - this.initXRes = (domains[0][1] - domains[0][0]) / this.width; - this.scale = 1; - - this.scaleSet = true; -}; - -Display.prototype.computeScale = function () { - var newXRes = (this.xScale.domain()[1] - this.xScale.domain()[0]) / this.width; - this.scale = this.initXRes / newXRes; -}; - -/** - * updateDomains -- set x/y domains of geographic (spherical mercator) coordinate - * system. Does *not* check/adjust aspect ratio. - */ - -Display.prototype.updateDomains = function (bounds) { - this.xScale.domain([bounds[0][0], bounds[1][0]]); - this.yScale.domain([bounds[0][1], bounds[1][1]]); - - this.zoom.x(this.xScale).y(this.yScale); - - this.computeScale(); -}; - -Display.prototype.resized = function () { - var newWidth = this.el.clientWidth; - var newHeight = this.el.clientHeight; - - var xDomain = this.xScale.domain(); - var xFactor = newWidth / this.width; - var xDomainAdj = (xDomain[1] - xDomain[0]) * (xFactor - 1) / 2; - this.xScale.domain([xDomain[0] - xDomainAdj, xDomain[1] + xDomainAdj]); - - var yDomain = this.yScale.domain(); - var yFactor = newHeight / this.height; - var yDomainAdj = (yDomain[1] - yDomain[0]) * (yFactor - 1) / 2; - this.yScale.domain([yDomain[0] - yDomainAdj, yDomain[1] + yDomainAdj]); - - this.xScale.range([0, newWidth]); - this.yScale.range([newHeight, 0]); - - this.height = newHeight; - this.width = newWidth; - - this.zoom.x(this.xScale).y(this.yScale); -}; - -Display.prototype.xyBounds = function () { - var x = this.xScale.domain(); - var y = this.yScale.domain(); - return [[x[0], y[0]], [x[1], y[1]]]; -}; - -/** - * Lat/lon bounds - */ - -Display.prototype.llBounds = function () { - var x = this.xScale.domain(); - var y = this.yScale.domain(); - - return [sm.inverse([x[0], y[0]]), sm.inverse([x[1], y[1]])]; -}; - -Display.prototype.isInRange = function (x, y) { - var xRange = this.xScale.range(); - var yRange = this.yScale.range(); - - return x >= xRange[0] && x <= xRange[1] && y >= yRange[1] && y <= yRange[0]; -}; - -/** - * Compute the x/y coordinate space domains to fit the graph. - */ - -function getDomains(display, height, width, bounds, options) { - var xmin = bounds[0][0]; - var xmax = bounds[1][0]; - var ymin = bounds[0][1]; - var ymax = bounds[1][1]; - var xRange = xmax - xmin; - var yRange = ymax - ymin; - - var paddingFactor = options && options.paddingFactor ? options.paddingFactor : 0.1; - - var margins = getMargins(options); - - var usableHeight = height - margins.top - margins.bottom; - var usableWidth = width - margins.left - margins.right; - var displayAspect = width / height; - var usableDisplayAspect = usableWidth / usableHeight; - var graphAspect = xRange / (yRange === 0 ? -Infinity : yRange); - - var padding; - var dispX1, dispX2, dispY1, dispY2; - var dispXRange, dispYRange; - - if (usableDisplayAspect > graphAspect) { - // y-axis is limiting - padding = paddingFactor * yRange; - dispY1 = ymin - padding; - dispY2 = ymax + padding; - dispYRange = yRange + 2 * padding; - var addedYRange = height / usableHeight * dispYRange - dispYRange; - if (margins.top > 0 || margins.bottom > 0) { - dispY1 -= margins.bottom / (margins.bottom + margins.top) * addedYRange; - dispY2 += margins.top / (margins.bottom + margins.top) * addedYRange; - } - dispXRange = (dispY2 - dispY1) * displayAspect; - var xOffset = (margins.left - margins.right) / width; - var xMidpoint = (xmax + xmin - dispXRange * xOffset) / 2; - dispX1 = xMidpoint - dispXRange / 2; - dispX2 = xMidpoint + dispXRange / 2; - } else { - // x-axis limiting - padding = paddingFactor * xRange; - dispX1 = xmin - padding; - dispX2 = xmax + padding; - dispXRange = xRange + 2 * padding; - var addedXRange = width / usableWidth * dispXRange - dispXRange; - if (margins.left > 0 || margins.right > 0) { - dispX1 -= margins.left / (margins.left + margins.right) * addedXRange; - dispX2 += margins.right / (margins.left + margins.right) * addedXRange; - } - - dispYRange = (dispX2 - dispX1) / displayAspect; - var yOffset = (margins.bottom - margins.top) / height; - var yMidpoint = (ymax + ymin - dispYRange * yOffset) / 2; - dispY1 = yMidpoint - dispYRange / 2; - dispY2 = yMidpoint + dispYRange / 2; - } - - return [[dispX1, dispX2], [dispY1, dispY2]]; -} - -function getMargins(options) { - var margins = { - left: 0, - right: 0, - top: 0, - bottom: 0 - }; - - if (options && options.displayMargins) { - if (options.displayMargins.top) margins.top = options.displayMargins.top; - if (options.displayMargins.bottom) margins.bottom = options.displayMargins.bottom; - if (options.displayMargins.left) margins.left = options.displayMargins.left; - if (options.displayMargins.right) margins.right = options.displayMargins.right; - } - - return margins; -} - -},{"../util/spherical-mercator":41,"./legend":12,"./tile-layer":13,"d3":88,"debug":90}],12:[function(require,module,exports){ -'use strict'; - -var d3 = require('d3'); - -var RenderedEdge = require('../renderer/renderededge'); -var RenderedSegment = require('../renderer/renderedsegment'); -var Util = require('../util'); -var Stop = require('../point/stop'); - -/** - * Expose `Legend` - */ - -module.exports = Legend; - -function Legend(el, display, transitive) { - this.el = el; - this.display = display; - this.transitive = transitive; - - this.height = Util.parsePixelStyle(d3.select(el).style('height')); -} - -Legend.prototype.render = function (legendSegments) { - d3.select(this.el).selectAll(':not(.doNotEmpty)').remove(); - - this.x = this.spacing; - this.y = this.height / 2; - - var segment; - - // iterate through the representative map segments - for (var legendType in legendSegments) { - var mapSegment = legendSegments[legendType]; - - // create a segment solely for rendering in the legend - segment = new RenderedSegment(); - segment.type = mapSegment.getType(); - segment.mode = mapSegment.mode; - segment.patterns = mapSegment.patterns; - - var canvas = this.createCanvas(); - - var renderData = []; - renderData.push({ - x: 0, - y: canvas.height / 2 - }); - renderData.push({ - x: canvas.width, - y: canvas.height / 2 - }); - - segment.render(canvas); - segment.refresh(canvas, renderData); - - this.renderText(getDisplayText(legendType)); - - this.x += this.spacing * 2; - } - - // create the 'transfer' marker - - var rEdge = new RenderedEdge(null, true, 'TRANSIT'); - rEdge.pattern = { - pattern_id: 'ptn', - route: { - route_type: 1 - } - }; - - var transferStop = new Stop(); - transferStop.isSegmentEndPoint = true; - transferStop.isTransferPoint = true; - - this.renderPoint(transferStop, rEdge, 'Transfer'); -}; - -Legend.prototype.renderPoint = function (point, rEdge, text) { - var canvas = this.createCanvas(); - - point.addRenderData({ - owner: point, - rEdge: rEdge, - x: canvas.width / 2, - y: canvas.height / 2, - offsetX: 0, - offsetY: 0 - }); - - point.render(canvas); - - canvas.styler.stylePoint(canvas, point); - point.refresh(canvas); - - this.renderText(text); -}; - -Legend.prototype.renderText = function (text) { - d3.select(this.el).append('div').attr('class', 'legendLabel').html(text); -}; - -Legend.prototype.createCanvas = function () { - var container = d3.select(this.el).append('div').attr('class', 'legendSvg'); - - var width = Util.parsePixelStyle(container.style('width')); - if (!width || width === 0) width = 30; - - var height = Util.parsePixelStyle(container.style('height')); - if (!height || height === 0) height = this.height; - - var canvas = { - xScale: d3.scale.linear(), - yScale: d3.scale.linear(), - styler: this.transitive.styler, - zoom: this.display.zoom, - width: width, - height: height, - svg: container.append('svg').style('width', width).style('height', height) - }; - - return canvas; -}; - -function getDisplayText(type) { - switch (type) { - case 'WALK': - return 'Walk'; - case 'BICYCLE': - return 'Bike'; - case 'CAR': - return 'Drive'; - case 'TRANSIT_0': - return 'Tram'; - case 'TRANSIT_1': - return 'Metro'; - case 'TRANSIT_2': - return 'Rail'; - case 'TRANSIT_3': - return 'Bus'; - case 'TRANSIT_4': - return 'Ferry'; - } - return type; -} - -},{"../point/stop":28,"../renderer/renderededge":32,"../renderer/renderedsegment":33,"../util":38,"d3":88}],13:[function(require,module,exports){ -'use strict'; - -var d3 = require('d3'); -var debug = require('debug')('transitive:tile-layer'); - -var geoTile = require('./d3.geo.tile'); - -var prefix = prefixMatch(['webkit', 'ms', 'Moz', 'O']); - -/** - * Tile layer takes a parent element, a zoom behavior, and a Mapbox ID - * - * @param {Object} opts - */ - -module.exports = function TileLayer(opts) { - debug('creating the tile layer'); - - var el = opts.el; - var display = opts.display; - var height = el.clientHeight; - var id = opts.mapboxId; - var width = el.clientWidth; - - // Set up the projection - var projection = d3.geo.mercator().translate([width / 2, height / 2]); - - // Set up the map tiles - var tile = geoTile(); - - // Create the tile layer - var tileLayer = d3.select(el).append('div').attr('class', 'tile-layer'); - - // Initial zoom - zoomed(); - - this.zoomed = zoomed; - - // Reload tiles on pan and zoom - function zoomed() { - // Get the height and width - height = el.clientHeight; - width = el.clientWidth; - - // Set the map tile size - tile.size([width, height]); - - // Get the current display bounds - var bounds = display.llBounds(); - - // Project the bounds based on the current projection - var psw = projection(bounds[0]); - var pne = projection(bounds[1]); - - // Based the new scale and translation vector off the current one - var scale = projection.scale() * 2 * Math.PI; - var translate = projection.translate(); - - var dx = pne[0] - psw[0]; - var dy = pne[1] - psw[1]; - - scale = scale * (1 / Math.max(dx / width, dy / height)); - projection.translate([width / 2, height / 2]).scale(scale / 2 / Math.PI); - - // Reproject the bounds based on the new scale and translation vector - psw = projection(bounds[0]); - pne = projection(bounds[1]); - var x = (psw[0] + pne[0]) / 2; - var y = (psw[1] + pne[1]) / 2; - translate = [width - x, height - y]; - - // Update the Geo tiles - tile.scale(scale).translate(translate); - - // Get the new set of tiles and render - renderTiles(tile()); - } - - // Render tiles - function renderTiles(tiles) { - var image = tileLayer.style(prefix + 'transform', matrix3d(tiles.scale, tiles.translate)).selectAll('.tile').data(tiles, function (d) { - return d; - }); - - image.exit().remove(); - - image.enter().append('img').attr('class', 'tile').attr('src', function (d) { - return 'http://' + ['a', 'b', 'c', 'd'][Math.random() * 4 | 0] + '.tiles.mapbox.com/v3/' + id + '/' + d[2] + '/' + d[0] + '/' + d[1] + '.png'; - }).style('left', function (d) { - return (d[0] << 8) + 'px'; - }).style('top', function (d) { - return (d[1] << 8) + 'px'; - }); - } -}; - -/** - * Get the 3D Transform Matrix - */ - -function matrix3d(scale, translate) { - var k = scale / 256; - var r = scale % 1 ? Number : Math.round; - return 'matrix3d(' + [k, 0, 0, 0, 0, k, 0, 0, 0, 0, k, 0, r(translate[0] * scale), r(translate[1] * scale), 0, 1] + ')'; -} - -/** - * Match the transform prefix - */ - -function prefixMatch(p) { - var i = -1; - var n = p.length; - var s = document.body.style; - while (++i < n) { - if (p[i] + 'Transform' in s) return '-' + p[i].toLowerCase() + '-'; - } - return ''; -} - -},{"./d3.geo.tile":9,"d3":88,"debug":90}],14:[function(require,module,exports){ -'use strict'; - -var each = require('component-each'); - -var Util = require('../util'); - -/** - * Expose `Edge` - */ - -module.exports = Edge; - -/** - * Initialize a new edge - * @constructor - * @param {Point[]} pointArray - the internal Points for this Edge - * @param {Vertex} fromVertex - * @param {Vertex} toVertex - */ - -var edgeId = 0; - -function Edge(pointArray, fromVertex, toVertex) { - this.id = edgeId++; - this.pointArray = pointArray; - this.fromVertex = fromVertex; - this.toVertex = toVertex; - this.pathSegments = []; - this.renderedEdges = []; -} - -Edge.prototype.getId = function () { - return this.id; -}; - -/** - * - */ - -Edge.prototype.getLength = function () { - var dx = this.toVertex.x - this.fromVertex.x; - var dy = this.toVertex.y - this.fromVertex.y; - return Math.sqrt(dx * dx + dy * dy); -}; - -Edge.prototype.getWorldLength = function () { - if (!this.worldLength) this.calculateWorldLengthAndMidpoint(); - return this.worldLength; -}; - -Edge.prototype.getWorldMidpoint = function () { - if (!this.worldMidpoint) this.calculateWorldLengthAndMidpoint(); - return this.worldMidpoint; -}; - -Edge.prototype.calculateWorldLengthAndMidpoint = function () { - var allPoints = [this.fromVertex.point].concat(this.pointArray, [this.toVertex.point]); - this.worldLength = 0; - for (var i = 0; i < allPoints.length - 1; i++) { - this.worldLength += Util.distance(allPoints[i].worldX, allPoints[i].worldY, allPoints[i + 1].worldX, allPoints[i + 1].worldY); - } - - if (this.worldLength === 0) { - this.worldMidpoint = { - x: this.fromVertex.point.worldX, - y: this.fromVertex.point.worldY - }; - } else { - var distTraversed = 0; - for (i = 0; i < allPoints.length - 1; i++) { - var dist = Util.distance(allPoints[i].worldX, allPoints[i].worldY, allPoints[i + 1].worldX, allPoints[i + 1].worldY); - if ((distTraversed + dist) / this.worldLength >= 0.5) { - // find the position along this segment (0 <= t <= 1) where the edge midpoint lies - var t = (0.5 - distTraversed / this.worldLength) / (dist / this.worldLength); - this.worldMidpoint = { - x: allPoints[i].worldX + t * (allPoints[i + 1].worldX - allPoints[i].worldX), - y: allPoints[i].worldY + t * (allPoints[i + 1].worldY - allPoints[i].worldY) - }; - this.pointsBeforeMidpoint = i; - this.pointsAfterMidpoint = this.pointArray.length - i; - break; - } - distTraversed += dist; - } - } -}; - -/** - * - */ - -Edge.prototype.isAxial = function () { - return this.toVertex.x === this.fromVertex.x || this.toVertex.y === this.fromVertex.y; -}; - -/** - * - */ - -Edge.prototype.hasCurvature = function () { - return this.elbow !== null; -}; - -/** - * - */ - -Edge.prototype.replaceVertex = function (oldVertex, newVertex) { - if (oldVertex === this.fromVertex) this.fromVertex = newVertex; - if (oldVertex === this.toVertex) this.toVertex = newVertex; -}; - -/** - * Add a path segment that traverses this edge - */ - -Edge.prototype.addPathSegment = function (segment) { - this.pathSegments.push(segment); -}; - -Edge.prototype.copyPathSegments = function (baseEdge) { - each(baseEdge.pathSegments, function (pathSegment) { - this.addPathSegment(pathSegment); - }, this); -}; - -Edge.prototype.getPathSegmentIds = function (baseEdge) { - var pathSegIds = []; - each(this.pathSegments, function (segment) { - pathSegIds.push(segment.id); - }); - pathSegIds.sort(); - return pathSegIds.join(','); -}; - -/** - * - */ - -Edge.prototype.addRenderedEdge = function (rEdge) { - if (this.renderedEdges.indexOf(rEdge) !== -1) return; - this.renderedEdges.push(rEdge); -}; - -/** internal geometry functions **/ - -Edge.prototype.calculateGeometry = function (cellSize, angleConstraint) { - // if(!this.hasTransit()) angleConstraint = 5; - angleConstraint = angleConstraint || 45; - - this.angleConstraintR = angleConstraint * Math.PI / 180; - - this.fx = this.fromVertex.point.worldX; - this.fy = this.fromVertex.point.worldY; - this.tx = this.toVertex.point.worldX; - this.ty = this.toVertex.point.worldY; - - var midpoint = this.getWorldMidpoint(); - - var targetFromAngle = Util.getVectorAngle(midpoint.x - this.fx, midpoint.y - this.fy); - this.constrainedFromAngle = Math.round(targetFromAngle / this.angleConstraintR) * this.angleConstraintR; - - var fromAngleDelta = Math.abs(this.constrainedFromAngle - targetFromAngle); - this.fvx = Math.cos(this.constrainedFromAngle); - this.fvy = Math.sin(this.constrainedFromAngle); - - var targetToAngle = Util.getVectorAngle(midpoint.x - this.tx, midpoint.y - this.ty); - - this.constrainedToAngle = Math.round(targetToAngle / this.angleConstraintR) * this.angleConstraintR; - - var toAngleDelta = Math.abs(this.constrainedToAngle - targetToAngle); - this.tvx = Math.cos(this.constrainedToAngle); - this.tvy = Math.sin(this.constrainedToAngle); - - var tol = 0.01; - var v = Util.normalizeVector({ - x: this.toVertex.x - this.fromVertex.x, - y: this.toVertex.y - this.fromVertex.y - }); - - // check if we need to add curvature - if (!equalVectors(this.fvx, this.fvy, -this.tvx, -this.tvy, tol) || !equalVectors(this.fvx, this.fvy, v.x, v.y, tol)) { - // see if the default endpoint angles produce a valid intersection - var isect = this.computeEndpointIntersection(); - - if (isect.intersect) { - // if so, compute the elbow and we're done - this.elbow = { - x: this.fx + isect.u * this.fvx, - y: this.fy + isect.u * this.fvy - }; - } else { - // if not, adjust the two endpoint angles until they properly intersect - - // default test: compare angle adjustments (if significant difference) - if (Math.abs(fromAngleDelta - toAngleDelta) > 0.087) { - if (fromAngleDelta < toAngleDelta) { - this.adjustToAngle(); - } else { - this.adjustFromAngle(); - } - } else { - // secondary test: look at distribution of shapepoints - if (this.pointsAfterMidpoint < this.pointsBeforeMidpoint) { - this.adjustToAngle(); - } else { - this.adjustFromAngle(); - } - } - } - } - - this.fromAngle = this.constrainedFromAngle; - this.toAngle = this.constrainedToAngle; - - this.calculateVectors(); - this.calculateAlignmentIds(); -}; - -/** - * Adjust the 'to' endpoint angle by rotating it increments of angleConstraintR - * until a valid intersection between the from and to endpoint rays is achieved. - */ - -Edge.prototype.adjustToAngle = function () { - var ccw = Util.ccw(this.fx, this.fy, this.fx + this.fvx, this.fy + this.fvy, this.tx, this.ty); - var delta = ccw > 0 ? this.angleConstraintR : -this.angleConstraintR; - var i = 0; - var isect; - while (i++ < 100) { - this.constrainedToAngle += delta; - this.tvx = Math.cos(this.constrainedToAngle); - this.tvy = Math.sin(this.constrainedToAngle); - isect = this.computeEndpointIntersection(); - if (isect.intersect) break; - } - this.elbow = { - x: this.fx + isect.u * this.fvx, - y: this.fy + isect.u * this.fvy - }; -}; - -/** - * Adjust the 'from' endpoint angle by rotating it increments of angleConstraintR - * until a valid intersection between the from and to endpoint rays is achieved. - */ - -Edge.prototype.adjustFromAngle = function () { - var ccw = Util.ccw(this.tx, this.ty, this.tx + this.tvx, this.ty + this.tvy, this.fx, this.fy); - var delta = ccw > 0 ? this.angleConstraintR : -this.angleConstraintR; - var i = 0; - var isect; - while (i++ < 100) { - this.constrainedFromAngle += delta; - this.fvx = Math.cos(this.constrainedFromAngle); - this.fvy = Math.sin(this.constrainedFromAngle); - isect = this.computeEndpointIntersection(); - if (isect.intersect) break; - } - this.elbow = { - x: this.fx + isect.u * this.fvx, - y: this.fy + isect.u * this.fvy - }; -}; - -Edge.prototype.computeEndpointIntersection = function () { - return Util.rayIntersection(this.fx, this.fy, this.fvx, this.fvy, this.tx, this.ty, this.tvx, this.tvy); -}; - -function equalVectors(x1, y1, x2, y2, tol) { - tol = tol || 0; - return Math.abs(x1 - x2) < tol && Math.abs(y1 - y2) < tol; -} - -Edge.prototype.calculateVectors = function (fromAngle, toAngle) { - this.fromVector = { - x: Math.cos(this.fromAngle), - y: Math.sin(this.fromAngle) - }; - - this.fromleftVector = { - x: -this.fromVector.y, - y: this.fromVector.x - }; - - this.fromRightVector = { - x: this.fromVector.y, - y: -this.fromVector.x - }; - - this.toVector = { - x: Math.cos(this.toAngle + Math.PI), - y: Math.sin(this.toAngle + Math.PI) - }; - - this.toleftVector = { - x: -this.toVector.y, - y: this.toVector.x - }; - - this.toRightVector = { - x: this.toVector.y, - y: -this.toVector.x - }; -}; - -/** - * Compute the 'alignment id', a string that uniquely identifies a line in - * 2D space given a point and angle relative to the x-axis. - */ - -Edge.prototype.calculateAlignmentId = function (x, y, angle) { - var angleD = Math.round(angle * 180 / Math.PI); - if (angleD > 90) angleD -= 180; - if (angleD <= -90) angleD += 180; - - if (angleD === 90) { - return '90_x' + x; - } - - // calculate the y-axis crossing - var ya = Math.round(y - x * Math.tan(angle)); - return angleD + '_y' + ya; -}; - -Edge.prototype.calculateAlignmentIds = function () { - this.fromAlignmentId = this.calculateAlignmentId(this.fromVertex.x, this.fromVertex.y, this.fromAngle); - this.toAlignmentId = this.calculateAlignmentId(this.toVertex.x, this.toVertex.y, this.toAngle); -}; - -Edge.prototype.hasTransit = function (cellSize) { - // debug(this); - for (var i = 0; i < this.pathSegments.length; i++) { - if (this.pathSegments[i].getType() === 'TRANSIT') { - return true; - } - } - return false; -}; - -Edge.prototype.getFromAlignmentId = function () { - return this.fromAlignmentId; -}; - -Edge.prototype.getToAlignmentId = function () { - return this.toAlignmentId; -}; - -Edge.prototype.getAlignmentRange = function (alignmentId) { - var p1, p2; - if (alignmentId === this.fromAlignmentId) { - p1 = this.fromVertex; - p2 = this.elbow || this.toVertex; - } else if (alignmentId === this.toAlignmentId) { - p1 = this.toVertex; - p2 = this.elbow || this.fromVertex; - } else { - return null; - } - - var min, max; - if (alignmentId.substring(0, 2) === '90') { - min = Math.min(p1.y, p2.y); - max = Math.max(p1.y, p2.y); - } else { - min = Math.min(p1.x, p2.x); - max = Math.max(p1.x, p2.x); - } - - return { - min: min, - max: max - }; -}; - -Edge.prototype.align = function (vertex, vector) { - if (this.aligned || !this.hasCurvature()) return; - var currentVector = this.getVector(vertex); - if (Math.abs(currentVector.x) !== Math.abs(vector.x) || Math.abs(currentVector.y) !== Math.abs(vector.y)) { - this.curveAngle = -this.curveAngle; - this.calculateGeometry(); - } - this.aligned = true; -}; - -Edge.prototype.getGeometricCoords = function (fromOffsetPx, toOffsetPx, display, forward) { - var coords = []; - - // reverse the coords array if needed - var geomCoords = forward ? this.geomCoords : this.geomCoords.concat().reverse(); - - each(geomCoords, function (coord, i) { - var fromVector = null; - var toVector = null; - var rightVector; - var xOffset, yOffset; - var x1 = display.xScale(coord[0]); - var y1 = display.yScale(coord[1]); - - // calculate the vector leading in to this coordinate - if (i > 0) { - var prevCoord = geomCoords[i - 1]; - var x0 = display.xScale(prevCoord[0]); - var y0 = display.yScale(prevCoord[1]); - if (x1 === x0 && y1 === y0) return; - - toVector = { - x: x1 - x0, - y: y1 - y0 - }; - } - - // calculate the vector leading out from this coordinate - if (i < geomCoords.length - 1) { - var nextCoord = geomCoords[i + 1]; - var x2 = display.xScale(nextCoord[0]); - var y2 = display.yScale(nextCoord[1]); - if (x2 === x1 && y2 === y1) return; - - fromVector = { - x: x2 - x1, - y: y2 - y1 - }; - } - - if (fromVector && !toVector) { - // the first point in the geomCoords sequence - rightVector = Util.normalizeVector({ - x: fromVector.y, - y: -fromVector.x - }); - xOffset = fromOffsetPx * rightVector.x; - yOffset = fromOffsetPx * rightVector.y; - } else if (!fromVector && toVector) { - // the last point in the geomCoords sequence - rightVector = Util.normalizeVector({ - x: toVector.y, - y: -toVector.x - }); - xOffset = fromOffsetPx * rightVector.x; - yOffset = fromOffsetPx * rightVector.y; - } else { - // an internal point - rightVector = Util.normalizeVector({ - x: fromVector.y, - y: -fromVector.x - }); - xOffset = fromOffsetPx * rightVector.x; - yOffset = fromOffsetPx * rightVector.y; - - // TODO: properly compute the offsets based on both vectors - } - - coords.push({ - x: x1 + xOffset, - y: y1 + yOffset - }); - }, this); - return coords; -}; - -Edge.prototype.getRenderCoords = function (fromOffsetPx, toOffsetPx, display, forward) { - var isBase = fromOffsetPx === 0 && toOffsetPx === 0; - - if (!this.baseRenderCoords && !isBase) { - this.calculateBaseRenderCoords(display); - } - - var fromOffsetX = fromOffsetPx * this.fromRightVector.x; - var fromOffsetY = fromOffsetPx * this.fromRightVector.y; - - var toOffsetX = toOffsetPx * this.toRightVector.x; - var toOffsetY = toOffsetPx * this.toRightVector.y; - - var fx = this.fromVertex.getRenderX(display) + fromOffsetX; - var fy = this.fromVertex.getRenderY(display) - fromOffsetY; - var fvx = this.fromVector.x; - var fvy = -this.fromVector.y; - - var tx = this.toVertex.getRenderX(display) + toOffsetX; - var ty = this.toVertex.getRenderY(display) - toOffsetY; - var tvx = -this.toVector.x; - var tvy = this.toVector.y; - - var coords = []; - - // append the first ('from') coordinate - coords.push({ - x: forward ? fx : tx, - y: forward ? fy : ty - }); - - var len = null; - var x1; - var y1; - var x2; - var y2; - - // determine if this edge has an elbow, i.e. a bend in the middle - if (isBase && !this.isStraight() || !isBase && this.baseRenderCoords.length === 4) { - var isect = Util.rayIntersection(fx, fy, fvx, fvy, tx, ty, tvx, tvy); - if (isect.intersect) { - var u = isect.u; - var ex = fx + fvx * u; - var ey = fy + fvy * u; - - this.ccw = Util.ccw(fx, fy, ex, ey, tx, ty); - - // calculate the angle of the arc - var angleR = this.getElbowAngle(); - - // calculate the radius of the arc in pixels, taking offsets into consideration - var rPx = this.getBaseRadiusPx() - this.ccw * (fromOffsetPx + toOffsetPx) / 2; - - // calculate the distance from the elbow to place the arc endpoints in each direction - var d = rPx * Math.tan(angleR / 2); - - // make sure the arc endpoint placement distance is not longer than the either of the - // elbow-to-edge-endpoint distances - var l1 = Util.distance(fx, fy, ex, ey); - var l2 = Util.distance(tx, ty, ex, ey); - d = Math.min(Math.min(l1, l2), d); - - x1 = ex - this.fromVector.x * d; - y1 = ey + this.fromVector.y * d; - - x2 = ex + this.toVector.x * d; - y2 = ey - this.toVector.y * d; - - var radius = Util.getRadiusFromAngleChord(angleR, Util.distance(x1, y1, x2, y2)); - var arc = angleR * (180 / Math.PI) * (this.ccw < 0 ? 1 : -1); - - if (forward) { - coords.push({ - x: x1, - y: y1, - len: Util.distance(fx, fy, x1, y1) - }); - - coords.push({ - x: x2, - y: y2, - len: angleR * radius, - arc: arc, - radius: radius - }); - - len = Util.distance(x2, y2, tx, ty); - } else { - // backwards traversal - coords.push({ - x: x2, - y: y2, - len: Util.distance(tx, ty, x2, y2) - }); - - coords.push({ - x: x1, - y: y1, - len: angleR * radius, - arc: -arc, - radius: radius - }); - - len = Util.distance(x1, y1, fx, fy); - } - } - } - - // if the length wasn't calculated during elbow-creation, do it now - if (len === null) len = Util.distance(fx, fy, tx, ty); - - // append the final ('to') coordinate - coords.push({ - x: forward ? tx : fx, - y: forward ? ty : fy, - len: len - }); - - return coords; -}; - -Edge.prototype.calculateBaseRenderCoords = function (display) { - this.baseRenderCoords = this.getRenderCoords(0, 0, display, true); -}; - -Edge.prototype.isStraight = function () { - var tol = 0.00001; - return Math.abs(this.fromVector.x - this.toVector.x) < tol && Math.abs(this.fromVector.y - this.toVector.y) < tol; -}; - -Edge.prototype.getBaseRadiusPx = function () { - return 15; -}; - -Edge.prototype.getElbowAngle = function () { - var cx = this.fromVector.x - this.toVector.x; - var cy = this.fromVector.y - this.toVector.y; - - var c = Math.sqrt(cx * cx + cy * cy) / 2; - - var theta = Math.asin(c); - - return theta * 2; -}; - -Edge.prototype.getRenderLength = function (display) { - if (!this.baseRenderCoords) this.calculateBaseRenderCoords(display); - - if (!this.renderLength) { - this.renderLength = 0; - for (var i = 1; i < this.baseRenderCoords.length; i++) { - this.renderLength += this.baseRenderCoords[i].len; - } - } - return this.renderLength; -}; - -/** - * Retrieve the coordinate located at a defined percentage along an Edge's length. - * @param {Number} t - a value between 0 and 1 representing the location of the - * point to be computed - * @param {Object[]} coords - the offset coordinates computed for this edge. - * @param {Display} display - * @returns {Object} - the coordinate as an {x,y} Object - */ - -Edge.prototype.coordAlongEdge = function (t, coords, display) { - if (!this.baseRenderCoords) { - this.calculateBaseRenderCoords(display); - } - - if (coords.length !== this.baseRenderCoords.length) { - return this.coordAlongOffsetEdge(t, coords, display); - } - - // get the length of this edge in screen units using the "base" (i.e. un-offset) render coords - var len = this.getRenderLength(); - - var loc = t * len; // the target distance along the Edge's base geometry - var cur = 0; // our current location along the edge (in world units) - - for (var i = 1; i < this.baseRenderCoords.length; i++) { - if (loc < cur + this.baseRenderCoords[i].len) { - var t2 = (loc - cur) / this.baseRenderCoords[i].len; - - if (coords[i].arc) { - var r = coords[i].radius; - var theta = Math.PI * coords[i].arc / 180; - var ccw = Util.ccw(coords[0].x, coords[0].y, coords[1].x, coords[1].y, coords[2].x, coords[2].y); - - return Util.pointAlongArc(coords[1].x, coords[1].y, coords[2].x, coords[2].y, r, theta, ccw, t2); - } else { - var dx = coords[i].x - coords[i - 1].x; - var dy = coords[i].y - coords[i - 1].y; - - return { - x: coords[i - 1].x + dx * t2, - y: coords[i - 1].y + dy * t2 - }; - } - } - cur += this.baseRenderCoords[i].len; - } -}; - -Edge.prototype.coordAlongOffsetEdge = function (t, coords, display) { - if (!this.baseRenderCoords) this.calculateBaseRenderCoords(display); - - var len = 0; - for (var i = 1; i < coords.length; i++) { - len += coords[i].len; - } - - var loc = t * len; // the target distance along the Edge's base geometry - var cur = 0; // our current location along the edge (in world units) - - for (i = 1; i < coords.length; i++) { - if (loc < cur + coords[i].len) { - var t2 = (loc - cur) / coords[i].len; - - if (coords[i].arc) { - // arc segment - var r = coords[i].radius; - var theta = Math.PI * coords[i].arc / 180; - var ccw = Util.ccw(coords[0].x, coords[0].y, coords[1].x, coords[1].y, coords[2].x, coords[2].y); - - return Util.pointAlongArc(coords[1].x, coords[1].y, coords[2].x, coords[2].y, r, theta, ccw, t2); - } else { - // straight segment - var dx = coords[i].x - coords[i - 1].x; - var dy = coords[i].y - coords[i - 1].y; - - return { - x: coords[i - 1].x + dx * t2, - y: coords[i - 1].y + dy * t2 - }; - } - } - cur += coords[i].len; - } -}; - -Edge.prototype.clearRenderData = function () { - this.baseRenderCoords = null; - this.renderLength = null; -}; - -Edge.prototype.getVector = function (vertex) { - if (vertex === this.fromVertex) return this.fromVector; - if (vertex === this.toVertex) return this.toVector; -}; - -/** - * Gets the vertex opposite another vertex on an edge - */ - -Edge.prototype.oppositeVertex = function (vertex) { - if (vertex === this.toVertex) return this.fromVertex; - if (vertex === this.fromVertex) return this.toVertex; - return null; -}; - -Edge.prototype.commonVertex = function (edge) { - if (this.fromVertex === edge.fromVertex || this.fromVertex === edge.toVertex) return this.fromVertex; - if (this.toVertex === edge.fromVertex || this.toVertex === edge.toVertex) return this.toVertex; - return null; -}; - -/** - * - */ - -Edge.prototype.setPointLabelPosition = function (pos, skip) { - if (this.fromVertex.point !== skip) this.fromVertex.point.labelPosition = pos; - if (this.toVertex.point !== skip) this.toVertex.point.labelPosition = pos; - - this.pointArray.forEach(function (point) { - if (point !== skip) point.labelPosition = pos; - }); -}; - -/** - * Determines if this edge is part of a standalone, non-transit path - * (e.g. a walk/bike/drive-only journey) - */ - -Edge.prototype.isNonTransitPath = function () { - return this.pathSegments.length === 1 && this.pathSegments[0] !== 'TRANSIT' && this.pathSegments[0].path.segments.length === 1; -}; - -/** - * - */ - -Edge.prototype.toString = function () { - return 'Edge ' + this.getId() + ' (' + this.fromVertex.toString() + ' to ' + this.toVertex.toString() + ')'; -}; - -},{"../util":38,"component-each":84}],15:[function(require,module,exports){ -'use strict'; - -var each = require('component-each'); -var PriorityQueue = require('priorityqueuejs'); - -var Util = require('../util'); - -/** - * Expose `EdgeGroup` - */ - -module.exports = EdgeGroup; - -/** - * A group of edges that share the same endpoint vertices - */ - -function EdgeGroup(fromVertex, toVertex, type) { - this.fromVertex = fromVertex; - this.toVertex = toVertex; - this.type = type; - this.edges = []; - this.commonPoints = null; - this.worldLength = 0; -} - -EdgeGroup.prototype.addEdge = function (edge) { - this.edges.push(edge); - edge.edgeGroup = this; - - // update the groups worldLength - this.worldLength = Math.max(this.worldLength, edge.getWorldLength()); - - if (this.commonPoints === null) { - // if this is first edge added, initialize group's commonPoint array to include all of edge's points - this.commonPoints = []; - each(edge.pointArray, function (point) { - this.commonPoints.push(point); - }, this); - } else { - // otherwise, update commonPoints array to only include those in added edge - var newCommonPoints = []; - each(edge.pointArray, function (point) { - if (this.commonPoints.indexOf(point) !== -1) newCommonPoints.push(point); - }, this); - this.commonPoints = newCommonPoints; - } -}; - -EdgeGroup.prototype.getWorldLength = function () { - return this.worldLength; -}; - -EdgeGroup.prototype.getInternalVertexPQ = function () { - // create an array of all points on the edge (endpoints and internal) - var allPoints = [this.fromVertex.point].concat(this.commonPoints, [this.toVertex.point]); - - var pq = new PriorityQueue(function (a, b) { - return a.weight - b.weight; - }); - - for (var i = 1; i < allPoints.length - 1; i++) { - var weight = this.getInternalVertexWeight(allPoints, i); - pq.enq({ - weight: weight, - point: allPoints[i] - }); - } - - return pq; -}; - -EdgeGroup.prototype.getInternalVertexWeight = function (pointArray, index) { - var x1 = pointArray[index - 1].worldX; - var y1 = pointArray[index - 1].worldY; - var x2 = pointArray[index].worldX; - var y2 = pointArray[index].worldY; - var x3 = pointArray[index + 1].worldX; - var y3 = pointArray[index + 1].worldY; - - // the weighting function is a combination of: - // - the distances from this internal point to the two adjacent points, normalized for edge length (longer distances are prioritized) - // - the angle formed by this point and the two adjacent ones ('sharper' angles are prioritized) - var inDist = Util.distance(x1, y1, x2, y2); - var outDist = Util.distance(x2, y2, x3, y3); - var theta = Util.angleFromThreePoints(x1, y1, x2, y2, x3, y3); - var edgeLen = this.getWorldLength(); - var weight = inDist / edgeLen + outDist / edgeLen + Math.abs(Math.PI - theta) / Math.PI; - - return weight; -}; - -EdgeGroup.prototype.hasTransit = function () { - for (var i = 0; i < this.edges.length; i++) { - if (this.edges[i].hasTransit()) return true; - } - return false; -}; - -EdgeGroup.prototype.isNonTransitPath = function () { - return this.edges.length === 1 && this.edges[0].isNonTransitPath(); -}; - -EdgeGroup.prototype.getTurnPoints = function (maxAngle) { - var points = []; - maxAngle = maxAngle || 0.75 * Math.PI; - each(this.commonPoints, function (point) { - if (point.getType() !== 'TURN') return; - if (Math.abs(point.turnAngle) < maxAngle) { - points.push(point); - } - }); - return points; -}; - -},{"../util":38,"component-each":84,"priorityqueuejs":92}],16:[function(require,module,exports){ -'use strict'; - -var d3 = require('d3'); -var debug = require('debug')('transitive:graph'); -var each = require('component-each'); - -var Edge = require('./edge'); -var EdgeGroup = require('./edgegroup'); -var Vertex = require('./vertex'); -var MultiPoint = require('../point/multipoint'); -var Util = require('../util'); - -/** - * Expose `NetworkGraph` - */ - -module.exports = NetworkGraph; - -/** - * An graph representing the underlying 'wireframe' network - */ - -function NetworkGraph(network, vertices) { - this.network = network; - this.edges = []; - this.vertices = []; - - /** - * Object mapping groups of edges that share the same two vertices. - * - Key is string of format A_B, where A and B are vertex IDs and A < B - * - Value is array of edges - */ - this.edgeGroups = {}; - - // Add all base vertices - for (var i in vertices) { - this.addVertex(vertices[i], vertices[i].worldX, vertices[i].worldY); - } -} - -/** - * Get the bounds of the graph in the graph's internal x/y coordinate space - * - * @return [[left, top], [right, bottom]] - */ - -NetworkGraph.prototype.bounds = function () { - var xmax = null; - var xmin = null; - var ymax = null; - var ymin = null; - - for (var i in this.vertices) { - var vertex = this.vertices[i]; - xmin = xmin ? Math.min(xmin, vertex.x) : vertex.x; - xmax = xmax ? Math.max(xmax, vertex.x) : vertex.x; - ymin = ymin ? Math.min(ymin, vertex.y) : vertex.y; - ymax = ymax ? Math.max(ymax, vertex.y) : vertex.y; - } - - var maxExtent = 20037508.34; - return [[xmin || -maxExtent, ymin || -maxExtent], [xmax || maxExtent, ymax || maxExtent]]; -}; - -/** - * Add Vertex - */ - -NetworkGraph.prototype.addVertex = function (point, x, y) { - if (x === undefined || y === undefined) { - var xy = Util.latLonToSphericalMercator(point.getLat(), point.getLon()); - x = xy[0]; - y = xy[1]; - } - var vertex = new Vertex(point, x, y); - this.vertices.push(vertex); - return vertex; -}; - -/** - * Add Edge - */ - -NetworkGraph.prototype.addEdge = function (stops, from, to, segmentType) { - if (this.vertices.indexOf(from) === -1 || this.vertices.indexOf(to) === -1) { - debug('Error: Cannot add edge. Graph does not contain vertices.'); - return; - } - - var edge = new Edge(stops, from, to); - this.edges.push(edge); - from.edges.push(edge); - to.edges.push(edge); - - var groupKey = this.network.transitive.options.groupEdges ? this.getEdgeGroupKey(edge, segmentType) : edge.getId(); - - if (!(groupKey in this.edgeGroups)) { - this.edgeGroups[groupKey] = new EdgeGroup(edge.fromVertex, edge.toVertex, segmentType); - } - this.edgeGroups[groupKey].addEdge(edge); - - return edge; -}; - -NetworkGraph.prototype.removeEdge = function (edge) { - // remove from the graph's edge collection - var edgeIndex = this.edges.indexOf(edge); - if (edgeIndex !== -1) this.edges.splice(edgeIndex, 1); - - // remove from any associated path segment edge lists - edge.pathSegments.forEach(function (segment) { - segment.removeEdge(edge); - }); - - // remove from the endpoint vertex incidentEdge collections - edge.fromVertex.removeEdge(edge); - edge.toVertex.removeEdge(edge); -}; - -NetworkGraph.prototype.getEdgeGroup = function (edge) { - return this.edgeGroups[this.getEdgeGroupKey(edge)]; -}; - -NetworkGraph.prototype.getEdgeGroupKey = function (edge, segmentType) { - return edge.fromVertex.getId() < edge.toVertex.getId() ? segmentType + '_' + edge.fromVertex.getId() + '_' + edge.toVertex.getId() : segmentType + '_' + edge.toVertex.getId() + '_' + edge.fromVertex.getId(); -}; - -NetworkGraph.prototype.mergeVertices = function (vertexArray) { - var xTotal = 0; - var yTotal = 0; - - var vertexGroups = { - 'STOP': [], - 'PLACE': [], - 'TURN': [], - 'MULTI': [] - }; - vertexArray.forEach(function (vertex) { - if (vertex.point.getType() in vertexGroups) vertexGroups[vertex.point.getType()].push(vertex); - }); - - var mergePoint; - - // don't merge stops and places, or multiple places: - if (vertexGroups.STOP.length > 0 && vertexGroups.PLACE.length > 0 || vertexGroups.PLACE.length > 1 || vertexGroups.MULTI.length > 0) return; - - // if merging turns with a place, create a new merged vertex around the place - if (vertexGroups.PLACE.length === 1 && vertexGroups.TURN.length > 0) { - mergePoint = vertexGroups.PLACE[0].point; - // if merging turns with a single place, create a new merged vertex around the stop - } else if (vertexGroups.STOP.length === 1 && vertexGroups.TURN.length > 0) { - mergePoint = vertexGroups.STOP[0].point; - // if merging multiple stops, create a new MultiPoint vertex - } else if (vertexGroups.STOP.length > 1) { - mergePoint = new MultiPoint(); - each(vertexGroups.STOP, function (stopVertex) { - mergePoint.addPoint(stopVertex.point); - }); - // if merging multiple turns - } else if (vertexGroups.TURN.length > 1) { - mergePoint = vertexGroups.TURN[0].point; - } - - if (!mergePoint) return; - var mergedVertex = new Vertex(mergePoint, 0, 0); - - vertexArray.forEach(function (vertex) { - xTotal += vertex.x; - yTotal += vertex.y; - - var edges = []; - each(vertex.edges, function (edge) { - edges.push(edge); - }); - - each(edges, function (edge) { - if (vertexArray.indexOf(edge.fromVertex) !== -1 && vertexArray.indexOf(edge.toVertex) !== -1) { - this.removeEdge(edge); - return; - } - edge.replaceVertex(vertex, mergedVertex); - mergedVertex.addEdge(edge); - }, this); - var index = this.vertices.indexOf(vertex); - if (index !== -1) this.vertices.splice(index, 1); - }, this); - - mergedVertex.x = xTotal / vertexArray.length; - mergedVertex.y = yTotal / vertexArray.length; - mergedVertex.oldVertices = vertexArray; - - this.vertices.push(mergedVertex); -}; - -NetworkGraph.prototype.sortVertices = function () { - this.vertices.sort(function (a, b) { - if (a.point && a.point.getType() === 'PLACE') return -1; - if (b.point && b.point.getType() === 'PLACE') return 1; - - if (a.point && a.point.getType() === 'MULTI') return -1; - if (b.point && b.point.getType() === 'MULTI') return 1; - - if (a.point && a.point.getType() === 'STOP') return -1; - if (b.point && b.point.getType() === 'STOP') return 1; - }); -}; - -/** - * Get the equivalent edge - */ - -NetworkGraph.prototype.getEquivalentEdge = function (pointArray, from, to) { - for (var e = 0; e < this.edges.length; e++) { - var edge = this.edges[e]; - if (edge.fromVertex === from && edge.toVertex === to && pointArray.length === edge.pointArray.length && equal(pointArray, edge.pointArray)) { - return edge; - } - if (edge.fromVertex === to && edge.toVertex === from && pointArray.length === edge.pointArray.length && equal(pointArray.slice(0).reverse(), edge.pointArray)) { - return edge; - } - } -}; - -/** - * Split a specified graph edge around a set of specified split points, where - * all split points are internal points of the edge to be split. A set of N - * valid split points will result in N+1 new edges. The original edge is - * removed from the graph. - */ - -NetworkGraph.prototype.splitEdgeAtInternalPoints = function (edge, points) { - var subEdgePoints = []; - var newEdge; - var newEdgeInfoArr = []; - var fromVertex = edge.fromVertex; - var geomCoords = []; - - // iterate through the parent edge points, creating new sub-edges as needed - each(edge.pointArray, function (point, i) { - if (edge.pointGeom && i < edge.pointGeom.length) { - geomCoords = geomCoords.concat(edge.pointGeom[i]); - } - if (points.indexOf(point) !== -1) { - // we've reached a split point - var x = point.worldX; - var y = point.worldY; - var newVertex = point.graphVertex || this.addVertex(point, x, y); - newVertex.isInternal = true; - newEdge = this.addEdge(subEdgePoints, fromVertex, newVertex, edge.edgeGroup.type); - newEdge.isInternal = true; - newEdge.copyPathSegments(edge); - newEdgeInfoArr.push({ - graphEdge: newEdge, - fromVertex: fromVertex - }); - if (geomCoords.length > 0) newEdge.geomCoords = geomCoords; - - subEdgePoints = []; - fromVertex = newVertex; - geomCoords = []; - } else { - // otherwise, this point becomes an internal point of the new edge currently being created - subEdgePoints.push(point); - } - }, this); - - // create the last sub-edge - newEdge = this.addEdge(subEdgePoints, fromVertex, edge.toVertex, edge.edgeGroup.type); - newEdge.isInternal = true; - newEdge.copyPathSegments(edge); - if (edge.pointGeom && edge.pointArray.length < edge.pointGeom.length) { - geomCoords = geomCoords.concat(edge.pointGeom[edge.pointArray.length]); - } - if (geomCoords.length > 0) newEdge.geomCoords = geomCoords; - - newEdgeInfoArr.push({ - graphEdge: newEdge, - fromVertex: fromVertex - }); - - // insert the new edge sequence into the affected segments - each(edge.pathSegments, function (pathSegment) { - var indexInSegment = pathSegment.getEdgeIndex(edge); - var forward = pathSegment.edges[indexInSegment].forward; - var index = pathSegment.getEdgeIndex(edge); - each(forward ? newEdgeInfoArr : newEdgeInfoArr.reverse(), function (edgeInfo) { - pathSegment.insertEdgeAt(index, edgeInfo.graphEdge, forward ? edgeInfo.fromVertex : edgeInfo.toVertex); - index++; - }); - }); - - // remove the original edge from the graph - this.removeEdge(edge); -}; - -/* NetworkGraph.prototype.collapseTransfers = function(threshold) { - if(!threshold) return; - this.edges.forEach(function(edge) { - if (edge.getLength() > threshold || - edge.fromVertex.point.containsFromPoint() || - edge.fromVertex.point.containsToPoint() || - edge.toVertex.point.containsFromPoint() || - edge.toVertex.point.containsToPoint()) return; - //if(edge.fromVertex.point.getType() === 'PLACE' || edge.toVertex.point.getType() === 'PLACE') return; - var notTransit = true; - edge.pathSegments.forEach(function(segment) { - notTransit = notTransit && segment.type !== 'TRANSIT'; - }); - if (notTransit) { - this.mergeVertices([edge.fromVertex, edge.toVertex]); - } - }, this); -}; */ - -NetworkGraph.prototype.pruneVertices = function () { - each(this.vertices, function (vertex) { - if (vertex.point.containsSegmentEndPoint()) return; - - var opposites = []; - var pathSegmentBundles = {}; // maps pathSegment id list (string) to collection of edges (array) - - each(vertex.edges, function (edge) { - var pathSegmentIds = edge.getPathSegmentIds(); - if (!(pathSegmentIds in pathSegmentBundles)) pathSegmentBundles[pathSegmentIds] = []; - pathSegmentBundles[pathSegmentIds].push(edge); - var opp = edge.oppositeVertex(vertex); - if (opposites.indexOf(opp) === -1) opposites.push(opp); - }); - - if (opposites.length !== 2) return; - - each(pathSegmentBundles, function (ids) { - var edgeArr = pathSegmentBundles[ids]; - if (edgeArr.length === 2) this.mergeEdges(edgeArr[0], edgeArr[1]); - }, this); - }, this); -}; - -NetworkGraph.prototype.mergeEdges = function (edge1, edge2) { - // check for infinite recursion loop case - if (edge1.fromVertex === edge2.toVertex && edge2.fromVertex === edge1.toVertex) { - return; - } - - // reverse edges if necessary - if (edge1.fromVertex === edge2.toVertex) { - this.mergeEdges(edge2, edge1); - return; - } - - if (edge1.toVertex !== edge2.fromVertex) return; // edges cannot be merged - - var internalPoints = edge1.pointArray.concat(edge2.pointArray); - - var newEdge = this.addEdge(internalPoints, edge1.fromVertex, edge2.toVertex, edge1.edgeGroup.type); - newEdge.pathSegments = edge1.pathSegments; - each(newEdge.pathSegments, function (segment) { - // var i = segment.graphEdges.indexOf(edge1); - // segment.graphEdges.splice(i, 0, newEdge); - var i = segment.getEdgeIndex(edge1); - segment.insertEdgeAt(i, newEdge, newEdge.fromVertex); - }); - - // if both input edges are have coordinate geometry, merge the coords arrays in the new edge - if (edge1.geomCoords && edge2.geomCoords) { - newEdge.geomCoords = edge1.geomCoords.concat(edge2.geomCoords.length > 0 ? edge2.geomCoords.slice(1) : []); - } - - debug('merging:'); - debug(edge1); - debug(edge2); - this.removeEdge(edge1); - this.removeEdge(edge2); -}; - -NetworkGraph.prototype.snapToGrid = function (cellSize) { - var coincidenceMap = {}; - this.vertices.forEach(function (vertex) { - var nx = Math.round(vertex.x / cellSize) * cellSize; - var ny = Math.round(vertex.y / cellSize) * cellSize; - vertex.x = nx; - vertex.y = ny; - - var key = nx + '_' + ny; - if (!(key in coincidenceMap)) coincidenceMap[key] = [vertex];else coincidenceMap[key].push(vertex); - }); - - each(coincidenceMap, function (key) { - var vertexArr = coincidenceMap[key]; - if (vertexArr.length > 1) { - this.mergeVertices(vertexArr); - } - }, this); -}; - -NetworkGraph.prototype.calculateGeometry = function (cellSize, angleConstraint) { - this.edges.forEach(function (edge) { - edge.calculateGeometry(cellSize, angleConstraint); - }); -}; - -NetworkGraph.prototype.resetCoordinates = function () { - this.vertices.forEach(function (vertex) { - vertex.x = vertex.origX; - vertex.y = vertex.origY; - }); -}; - -NetworkGraph.prototype.recenter = function () { - var xCoords = []; - var yCoords = []; - this.vertices.forEach(function (v) { - xCoords.push(v.x); - yCoords.push(v.y); - }); - - var mx = d3.median(xCoords); - var my = d3.median(yCoords); - - this.vertices.forEach(function (v) { - v.x = v.x - mx; - v.y = v.y - my; - }); -}; - -/** 2D line bundling & offsetting **/ - -NetworkGraph.prototype.apply2DOffsets = function () { - this.initComparisons(); - - var alignmentBundles = {}; // maps alignment ID to array of range-bounded bundles on that alignment - - var addToBundle = function addToBundle(rEdge, alignmentId) { - var bundle; - - // compute the alignment range of the edge being bundled - var range = rEdge.graphEdge.getAlignmentRange(alignmentId); - - // check if bundles already exist for this alignment - if (!(alignmentId in alignmentBundles)) { - // if not, create new and add to collection - bundle = new AlignmentBundle(); - bundle.addEdge(rEdge, range.min, range.max); - alignmentBundles[alignmentId] = [bundle]; // new AlignmentBundle(); - } else { - // 1 or more bundles currently exist for this alignmentId - var bundleArr = alignmentBundles[alignmentId]; - - // see if the segment range overlaps with that of an existing bundle - for (var i = 0; i < bundleArr.length; i++) { - if (bundleArr[i].rangeOverlaps(range.min, range.max)) { - bundleArr[i].addEdge(rEdge, range.min, range.max); - return; - } - } - - // ..if not, create a new bundle - bundle = new AlignmentBundle(); - bundle.addEdge(rEdge, range.min, range.max); - bundleArr.push(bundle); - } - }; - - each(this.edges, function (edge) { - var fromAlignmentId = edge.getFromAlignmentId(); - var toAlignmentId = edge.getToAlignmentId(); - - each(edge.renderedEdges, function (rEdge) { - addToBundle(rEdge, fromAlignmentId); - addToBundle(rEdge, toAlignmentId); - }); - }); - - var bundleSorter = function (a, b) { - var aId = a.patternIds || a.pathSegmentIds; - var bId = b.patternIds || b.pathSegmentIds; - - var aVector = a.getAlignmentVector(this.currentAlignmentId); - var bVector = b.getAlignmentVector(this.currentAlignmentId); - var isOutward = Util.isOutwardVector(aVector) && Util.isOutwardVector(bVector) ? 1 : -1; - - var abCompId = aId + '_' + bId; - if (abCompId in this.bundleComparisons) { - return isOutward * this.bundleComparisons[abCompId]; - } - - var baCompId = bId + '_' + aId; - if (baCompId in this.bundleComparisons) { - return isOutward * this.bundleComparisons[baCompId]; - } - - if (a.route && b.route && a.route.route_type !== b.route.route_type) { - return a.route.route_type > b.route.route_type ? 1 : -1; - } - - var isForward = a.forward && b.forward ? 1 : -1; - return isForward * isOutward * (aId < bId ? -1 : 1); - }.bind(this); - - each(alignmentBundles, function (alignmentId) { - var bundleArr = alignmentBundles[alignmentId]; - each(bundleArr, function (bundle) { - if (bundle.items.length <= 1) return; - var lw = 1.2; - var bundleWidth = lw * (bundle.items.length - 1); - - this.currentAlignmentId = alignmentId; - bundle.items.sort(bundleSorter); - each(bundle.items, function (rEdge, i) { - var offset = -bundleWidth / 2 + i * lw; - if (rEdge.getType() === 'TRANSIT') { - each(rEdge.patterns, function (pattern) { - pattern.offsetAlignment(alignmentId, offset); - }); - } else rEdge.offsetAlignment(alignmentId, offset); - }); - }, this); - }, this); -}; - -/** - * Traverses the graph vertex-by-vertex, creating comparisons between all pairs of - * edges for which a topological relationship can be established. - */ - -NetworkGraph.prototype.initComparisons = function () { - this.bundleComparisons = {}; - - each(this.vertices, function (vertex) { - var incidentGraphEdges = vertex.incidentEdges(); - - var angleREdges = {}; - each(incidentGraphEdges, function (incidentGraphEdge) { - var angle = incidentGraphEdge.fromVertex === vertex ? incidentGraphEdge.fromAngle : incidentGraphEdge.toAngle; - var angleDeg = 180 * angle / Math.PI; - if (!(angleDeg in angleREdges)) angleREdges[angleDeg] = []; - angleREdges[angleDeg] = angleREdges[angleDeg].concat(incidentGraphEdge.renderedEdges); - }); - - each(angleREdges, function (angle) { - var rEdges = angleREdges[angle]; - if (rEdges.length < 2) return; - for (var i = 0; i < rEdges.length - 1; i++) { - for (var j = i + 1; j < rEdges.length; j++) { - var re1 = rEdges[i]; - var re2 = rEdges[j]; - - var opp1 = re1.graphEdge.oppositeVertex(vertex); - var opp2 = re2.graphEdge.oppositeVertex(vertex); - - var ccw = Util.ccw(opp1.x, opp1.y, vertex.x, vertex.y, opp2.x, opp2.y); - - if (ccw === 0) { - var s1Ext = re1.findExtension(opp1); - var s2Ext = re2.findExtension(opp2); - if (s1Ext) opp1 = s1Ext.graphEdge.oppositeVertex(opp1); - if (s2Ext) opp2 = s2Ext.graphEdge.oppositeVertex(opp2); - ccw = Util.ccw(opp1.x, opp1.y, vertex.x, vertex.y, opp2.x, opp2.y); - } - - ccw = getInverse(re1, re2, vertex) * ccw; - - if (ccw > 0) { - // e1 patterns are 'less' than e2 patterns - this.storeComparison(re1, re2); - } - - if (ccw < 0) { - // e2 patterns are 'less' than e2 patterns - this.storeComparison(re2, re1); - } - } - } - }, this); - }, this); -}; - -function getInverse(s1, s2, vertex) { - return s1.graphEdge.toVertex === vertex && s2.graphEdge.toVertex === vertex || s1.graphEdge.toVertex === vertex && s2.graphEdge.fromVertex === vertex ? -1 : 1; -} - -NetworkGraph.prototype.storeComparison = function (s1, s2) { - var s1Id = s1.patternIds || s1.pathSegmentIds; - var s2Id = s2.patternIds || s2.pathSegmentIds; - debug('storing comparison: ' + s1Id + ' < ' + s2Id); - this.bundleComparisons[s1Id + '_' + s2Id] = -1; - this.bundleComparisons[s2Id + '_' + s1Id] = 1; -}; - -/** - * AlignmentBundle class - */ - -function AlignmentBundle() { - this.items = []; // RenderedEdges - this.min = Number.MAX_VALUE; - this.max = -Number.MAX_VALUE; -} - -AlignmentBundle.prototype.addEdge = function (rEdge, min, max) { - if (this.items.indexOf(rEdge) === -1) { - this.items.push(rEdge); - } - - this.min = Math.min(this.min, min); - this.max = Math.max(this.max, max); -}; - -AlignmentBundle.prototype.rangeOverlaps = function (min, max) { - return this.min < max && min < this.max; -}; - -/** - * Check if arrays are equal - */ - -function equal(a, b) { - if (a.length !== b.length) { - return false; - } - - for (var i in a) { - if (a[i] !== b[i]) { - return false; - } - } - - return true; -} - -},{"../point/multipoint":24,"../util":38,"./edge":14,"./edgegroup":15,"./vertex":17,"component-each":84,"d3":88,"debug":90}],17:[function(require,module,exports){ -'use strict'; - -/** - * Expose `Vertex` - */ - -module.exports = Vertex; - -/** - * Initialize new Vertex - * - * @param {Stop/Place} - * @param {Number} - * @param {Number} - */ - -var edgeId = 0; - -function Vertex(point, x, y) { - this.id = edgeId++; - this.point = point; - this.point.graphVertex = this; - this.x = this.origX = x; - this.y = this.origY = y; - this.edges = []; -} - -Vertex.prototype.getId = function () { - return this.id; -}; - -Vertex.prototype.getRenderX = function (display) { - return display.xScale(this.x) + this.point.placeOffsets.x; -}; - -Vertex.prototype.getRenderY = function (display) { - return display.yScale(this.y) + this.point.placeOffsets.y; -}; - -/** - * Move to new coordinate - * - * @param {Number} - * @param {Number} - */ - -Vertex.prototype.moveTo = function (x, y) { - this.x = x; - this.y = y; - /* this.edges.forEach(function (edge) { - edge.calculateVectors(); - }); */ -}; - -/** - * Get array of edges incident to vertex. Allows specification of "incoming" edge that will not be included in results - * - * @param {Edge} - */ - -Vertex.prototype.incidentEdges = function (inEdge) { - var results = []; - this.edges.forEach(function (edge) { - if (edge !== inEdge) results.push(edge); - }); - return results; -}; - -/** - * Add an edge to the vertex's edge list - * - * @param {Edge} - */ - -Vertex.prototype.addEdge = function (edge) { - var index = this.edges.indexOf(edge); - if (index === -1) this.edges.push(edge); -}; - -/** - * Remove an edge from the vertex's edge list - * - * @param {Edge} - */ - -Vertex.prototype.removeEdge = function (edge) { - var index = this.edges.indexOf(edge); - if (index !== -1) this.edges.splice(index, 1); -}; - -Vertex.prototype.toString = function () { - return 'Vertex ' + this.getId() + ' (' + (this.point ? this.point.toString() : 'no point assigned') + ')'; -}; - -},{}],18:[function(require,module,exports){ -'use strict'; - -/** - * Dependencies - */ - -var augment = require('augment'); -var each = require('component-each'); -var d3 = require('d3'); - -var SegmentLabel = require('./segmentlabel'); -var Util = require('../util'); - -/** - * Labeler object - */ - -var Labeler = augment(Object, function () { - this.constructor = function (transitive) { - this.transitive = transitive; - this.clear(); - }; - - this.clear = function (transitive) { - this.points = []; - }; - - this.updateLabelList = function (graph) { - this.points = []; - graph.vertices.forEach(function (vertex) { - var point = vertex.point; - if (point.getType() === 'PLACE' || point.getType() === 'MULTI' || point.getType() === 'STOP' && point.isSegmentEndPoint) { - this.points.push(point); - } - }, this); - - this.points.sort(function compare(a, b) { - if (a.containsFromPoint() || a.containsToPoint()) return -1; - if (b.containsFromPoint() || b.containsToPoint()) return 1; - return 0; - }); - }; - - this.updateQuadtree = function () { - this.quadtree = d3.geom.quadtree().extent([[-this.width, -this.height], [this.width * 2, this.height * 2]])([]); - - this.addPointsToQuadtree(); - // this.addSegmentsToQuadtree(); - }; - - this.addPointsToQuadtree = function () { - this.points.forEach(function (point) { - var mbbox = point.getMarkerBBox(); - if (mbbox) this.addBBoxToQuadtree(point.getMarkerBBox()); - }, this); - }; - - this.addSegmentsToQuadtree = function () { - this.transitive.renderSegments.forEach(function (segment) { - if (segment.getType() !== 'TRANSIT') return; - - var lw = this.transitive.style.compute(this.transitive.style.segments['stroke-width'], this.transitive.display, segment); - lw = parseFloat(lw.substring(0, lw.length - 2), 10) - 2; - - var x, x1, x2, y, y1, y2; - // debug(segment.toString()); - if (segment.renderData.length === 2) { - // basic straight segment - if (segment.renderData[0].x === segment.renderData[1].x) { - // vertical - x = segment.renderData[0].x - lw / 2; - y1 = segment.renderData[0].y; - y2 = segment.renderData[1].y; - this.addBBoxToQuadtree({ - x: x, - y: Math.min(y1, y2), - width: lw, - height: Math.abs(y1 - y2) - }); - } else if (segment.renderData[0].y === segment.renderData[1].y) { - // horizontal - x1 = segment.renderData[0].x; - x2 = segment.renderData[1].x; - y = segment.renderData[0].y - lw / 2; - this.addBBoxToQuadtree({ - x: Math.min(x1, x2), - y: y, - width: Math.abs(x1 - x2), - height: lw - }); - } - } - - if (segment.renderData.length === 4) { - // basic curved segment - - if (segment.renderData[0].x === segment.renderData[1].x) { - // vertical first - x = segment.renderData[0].x - lw / 2; - y1 = segment.renderData[0].y; - y2 = segment.renderData[3].y; - this.addBBoxToQuadtree({ - x: x, - y: Math.min(y1, y2), - width: lw, - height: Math.abs(y1 - y2) - }); - - x1 = segment.renderData[0].x; - x2 = segment.renderData[3].x; - y = segment.renderData[3].y - lw / 2; - this.addBBoxToQuadtree({ - x: Math.min(x1, x2), - y: y, - width: Math.abs(x1 - x2), - height: lw - }); - } else if (segment.renderData[0].y === segment.renderData[1].y) { - // horiz first - x1 = segment.renderData[0].x; - x2 = segment.renderData[3].x; - y = segment.renderData[0].y - lw / 2; - this.addBBoxToQuadtree({ - x: Math.min(x1, x2), - y: y, - width: Math.abs(x1 - x2), - height: lw - }); - - x = segment.renderData[3].x - lw / 2; - y1 = segment.renderData[0].y; - y2 = segment.renderData[3].y; - this.addBBoxToQuadtree({ - x: x, - y: Math.min(y1, y2), - width: lw, - height: Math.abs(y1 - y2) - }); - } - } - }, this); - }; - - this.addBBoxToQuadtree = function (bbox) { - if (bbox.x + bbox.width / 2 < 0 || bbox.x - bbox.width / 2 > this.width || bbox.y + bbox.height / 2 < 0 || bbox.y - bbox.height / 2 > this.height) return; - - this.quadtree.add([bbox.x + bbox.width / 2, bbox.y + bbox.height / 2, bbox]); - - this.maxBBoxWidth = Math.max(this.maxBBoxWidth, bbox.width); - this.maxBBoxHeight = Math.max(this.maxBBoxHeight, bbox.height); - }; - - this.doLayout = function () { - this.width = this.transitive.el.clientWidth; - this.height = this.transitive.el.clientHeight; - - this.maxBBoxWidth = 0; - this.maxBBoxHeight = 0; - - this.updateQuadtree(); - - var labeledSegments = this.placeSegmentLabels(); - var labeledPoints = this.placePointLabels(); - - return { - segments: labeledSegments, - points: labeledPoints - }; - }; - - this.placeSegmentLabels = function () { - each(this.segmentLabels, function (label) { - label.clear(); - }); - this.segmentLabels = []; - this.placedLabelKeys = []; - - // collect the bus RenderSegments - var busRSegments = []; - each(this.transitive.network.paths, function (path) { - each(path.getRenderedSegments(), function (rSegment) { - if (rSegment.type === 'TRANSIT' && rSegment.mode === 3) busRSegments.push(rSegment); - }); - }, this); - - var edgeGroups = []; - each(this.transitive.network.paths, function (path) { - each(path.segments, function (segment) { - if (segment.type === 'TRANSIT' && segment.getMode() === 3) { - edgeGroups = edgeGroups.concat(segment.getLabelEdgeGroups()); - } - }); - }, this); - - // iterate through the sequence collection, labeling as necessary - // each(busRSegments, function(rSegment) { - each(edgeGroups, function (edgeGroup) { - this.currentGroup = edgeGroup; - // get the array of label strings to be places (typically the unique route short names) - this.labelTextArray = edgeGroup.getLabelTextArray(); - - // create the initial label for placement - this.labelTextIndex = 0; - - var label = this.getNextLabel(); // this.constructSegmentLabel(rSegment, labelTextArray[labelTextIndex]); - if (!label) return; - - // iterate through potential anchor locations, attempting placement at each one - var labelAnchors = edgeGroup.getLabelAnchors(this.transitive.display, label.textHeight * 1.5); - for (var i = 0; i < labelAnchors.length; i++) { - label.labelAnchor = labelAnchors[i]; - - // do not consider this anchor if it is out of the display range - if (!this.transitive.display.isInRange(label.labelAnchor.x, label.labelAnchor.y)) continue; - - // check for conflicts with existing placed elements - var bbox = label.getBBox(); - var conflicts = this.findOverlaps(label, bbox); - - if (conflicts.length === 0) { - // if no conflicts - - // place the current label - this.segmentLabels.push(label); - this.quadtree.add([label.labelAnchor.x, label.labelAnchor.y, label]); - // debug('placing seg label for ' + label.labelText); - - label = this.getNextLabel(); - if (!label) break; - } - } // end of anchor iteration loop - }, this); // end of sequence iteration loop - }; - - this.getNextLabel = function () { - while (this.labelTextIndex < this.labelTextArray.length) { - var labelText = this.labelTextArray[this.labelTextIndex]; - var key = this.currentGroup.edgeIds + '_' + labelText; - if (this.placedLabelKeys.indexOf(key) !== -1) { - this.labelTextIndex++; - continue; - } - var label = this.constructSegmentLabel(this.currentGroup.renderedSegment, labelText); - this.placedLabelKeys.push(key); - this.labelTextIndex++; - return label; - } - return null; - }; - - this.constructSegmentLabel = function (segment, labelText) { - var label = new SegmentLabel(segment, labelText); - var styler = this.transitive.styler; - label.fontFamily = styler.compute(styler.labels['font-family'], this.transitive.display, { - segment: segment - }); - label.fontSize = styler.compute(styler.labels['font-size'], this.transitive.display, { - segment: segment - }); - var textBBox = Util.getTextBBox(labelText, { - 'font-size': label.fontSize, - 'font-family': label.fontFamily - }); - label.textWidth = textBBox.width; - label.textHeight = textBBox.height; - label.computeContainerDimensions(); - - return label; - }; - - this.placePointLabels = function () { - var styler = this.transitive.styler; - - var labeledPoints = []; - - this.points.forEach(function (point) { - var labelText = point.label.getText(); - point.label.fontFamily = styler.compute(styler.labels['font-family'], this.transitive.display, { - point: point - }); - point.label.fontSize = styler.compute(styler.labels['font-size'], this.transitive.display, { - point: point - }); - var textBBox = Util.getTextBBox(labelText, { - 'font-size': point.label.fontSize, - 'font-family': point.label.fontFamily - }); - point.label.textWidth = textBBox.width; - point.label.textHeight = textBBox.height; - - var orientations = styler.compute(styler.labels.orientations, this.transitive.display, { - point: point - }); - - var placedLabel = false; - for (var i = 0; i < orientations.length; i++) { - point.label.setOrientation(orientations[i]); - if (!point.focused) continue; - - if (!point.label.labelAnchor) continue; - - var lx = point.label.labelAnchor.x; - var ly = point.label.labelAnchor.y; - - // do not place label if out of range - if (lx <= 0 || ly <= 0 || lx >= this.width || ly > this.height) continue; - - var labelBBox = point.label.getBBox(); - - var overlaps = this.findOverlaps(point.label, labelBBox); - - // do not place label if it overlaps with others - if (overlaps.length > 0) continue; - - // if we reach this point, the label is good to place - - point.label.setVisibility(true); - labeledPoints.push(point); - - this.quadtree.add([labelBBox.x + labelBBox.width / 2, labelBBox.y + labelBBox.height / 2, point.label]); - - this.maxBBoxWidth = Math.max(this.maxBBoxWidth, labelBBox.width); - this.maxBBoxHeight = Math.max(this.maxBBoxHeight, labelBBox.height); - - placedLabel = true; - break; // do not consider any other orientations after places - } // end of orientation loop - - // if label not placed at all, hide the element - if (!placedLabel) { - point.label.setVisibility(false); - } - }, this); - return labeledPoints; - }; - - this.findOverlaps = function (label, labelBBox) { - var minX = labelBBox.x - this.maxBBoxWidth / 2; - var minY = labelBBox.y - this.maxBBoxHeight / 2; - var maxX = labelBBox.x + labelBBox.width + this.maxBBoxWidth / 2; - var maxY = labelBBox.y + labelBBox.height + this.maxBBoxHeight / 2; - // debug('findOverlaps %s,%s %s,%s', minX,minY,maxX,maxY); - - var matchItems = []; - this.quadtree.visit(function (node, x1, y1, x2, y2) { - var p = node.point; - if (p && p[0] >= minX && p[0] < maxX && p[1] >= minY && p[1] < maxY && label.intersects(p[2])) { - matchItems.push(p[2]); - } - return x1 > maxX || y1 > maxY || x2 < minX || y2 < minY; - }); - return matchItems; - }; - - this.findNearbySegmentLabels = function (label, x, y, buffer) { - var minX = x - buffer; - var minY = y - buffer; - var maxX = x + buffer; - var maxY = y + buffer; - // debug('findNearby %s,%s %s,%s', minX,minY,maxX,maxY); - - var matchItems = []; - this.quadtree.visit(function (node, x1, y1, x2, y2) { - var p = node.point; - if (p && p[0] >= minX && p[0] < maxX && p[1] >= minY && p[1] < maxY && p[2].parent && label.parent.patternIds === p[2].parent.patternIds) { - matchItems.push(p[2]); - } - return x1 > maxX || y1 > maxY || x2 < minX || y2 < minY; - }); - return matchItems; - }; -}); - -/** - * Expose `Labeler` - */ - -module.exports = Labeler; - -},{"../util":38,"./segmentlabel":22,"augment":42,"component-each":84,"d3":88}],19:[function(require,module,exports){ -'use strict'; - -/** - * Dependencies - */ - -var augment = require('augment'); - -/** - * Label object - */ - -var Label = augment(Object, function () { - this.constructor = function (parent) { - this.parent = parent; - this.sortableType = 'LABEL'; - }; - - this.getText = function () { - if (!this.labelText) this.labelText = this.initText(); - return this.labelText; - }; - - this.initText = function () { - return this.parent.getName(); - }; - - this.render = function (display) {}; - - this.refresh = function (display) {}; - - this.setVisibility = function (visibility) { - if (this.svgGroup) this.svgGroup.attr('visibility', visibility ? 'visible' : 'hidden'); - }; - - this.getBBox = function () { - return null; - }; - - this.intersects = function (obj) { - return null; - }; - - this.intersectsBBox = function (bbox) { - var thisBBox = this.getBBox(this.orientation); - var r = thisBBox.x <= bbox.x + bbox.width && bbox.x <= thisBBox.x + thisBBox.width && thisBBox.y <= bbox.y + bbox.height && bbox.y <= thisBBox.y + thisBBox.height; - return r; - }; - - this.isFocused = function () { - return this.parent.isFocused(); - }; - - this.getZIndex = function () { - return 1000000; - }; -}); - -/** - * Expose `Label` - */ - -module.exports = Label; - -},{"augment":42}],20:[function(require,module,exports){ -'use strict'; - -/** - * Dependencies - */ - -var each = require('component-each'); - -/** - * Expose `LabelEdgeGroup` - */ - -module.exports = LabelEdgeGroup; - -/** - * - */ - -function LabelEdgeGroup(renderedSegment) { - this.renderedSegment = renderedSegment; - this.renderedEdges = []; -} - -LabelEdgeGroup.prototype.addEdge = function (rEdge) { - this.renderedEdges.push(rEdge); - this.edgeIds = !this.edgeIds ? rEdge.getId() : this.edgeIds + ',' + rEdge.getId(); -}; - -LabelEdgeGroup.prototype.getLabelTextArray = function () { - var textArray = []; - each(this.renderedSegment.pathSegment.getPatterns(), function (pattern) { - var shortName = pattern.route.route_short_name; - if (textArray.indexOf(shortName) === -1) textArray.push(shortName); - }); - return textArray; -}; - -LabelEdgeGroup.prototype.getLabelAnchors = function (display, spacing) { - var labelAnchors = []; - var renderLen = this.getRenderLength(display); - var anchorCount = Math.floor(renderLen / spacing); - var pctSpacing = spacing / renderLen; - - for (var i = 0; i < anchorCount; i++) { - var t = i % 2 === 0 ? 0.5 + i / 2 * pctSpacing : 0.5 - (i + 1) / 2 * pctSpacing; - var coord = this.coordAlongRenderedPath(t, display); - if (coord) labelAnchors.push(coord); - } - - return labelAnchors; -}; - -LabelEdgeGroup.prototype.coordAlongRenderedPath = function (t, display) { - var renderLen = this.getRenderLength(display); - var loc = t * renderLen; - - var cur = 0; - for (var i = 0; i < this.renderedEdges.length; i++) { - var rEdge = this.renderedEdges[i]; - var edgeRenderLen = rEdge.graphEdge.getRenderLength(display); - if (loc <= cur + edgeRenderLen) { - var t2 = (loc - cur) / edgeRenderLen; - return rEdge.graphEdge.coordAlongEdge(t2, rEdge.renderData, display); - } - cur += edgeRenderLen; - } -}; - -LabelEdgeGroup.prototype.getRenderLength = function (display) { - if (!this.renderLength) { - this.renderLength = 0; - each(this.renderedEdges, function (rEdge) { - this.renderLength += rEdge.graphEdge.getRenderLength(display); - }, this); - } - return this.renderLength; -}; - -},{"component-each":84}],21:[function(require,module,exports){ -'use strict'; - -/** - * Dependencies - */ - -var augment = require('augment'); - -var Label = require('./label'); - -/** - * Label object - */ - -var PointLabel = augment(Label, function (base) { - this.constructor = function (parent) { - base.constructor.call(this, parent); - - this.labelAngle = 0; - this.labelPosition = 1; - }; - - this.initText = function () { - return this.parent.getName(); - }; - - this.render = function (display) { - this.svgGroup = display.svg.append('g'); // this.parent.labelSvg; - this.svgGroup.attr('class', 'transitive-sortable').datum({ - owner: this, - sortableType: 'POINT_LABEL' - }); - - var typeStr = this.parent.getType().toLowerCase(); - - this.mainLabel = this.svgGroup.append('text').datum({ - owner: this - }).attr('id', 'transitive-' + typeStr + '-label-' + this.parent.getId()).text(this.getText()).attr('font-size', this.fontSize).attr('font-family', this.fontFamily).attr('class', 'transitive-' + typeStr + '-label'); - }; - - this.refresh = function (display) { - if (!this.labelAnchor) return; - - if (!this.svgGroup) this.render(display); - - this.svgGroup.attr('text-anchor', this.labelPosition > 0 ? 'start' : 'end').attr('transform', function (d, i) { - return 'translate(' + this.labelAnchor.x + ',' + this.labelAnchor.y + ')'; - }.bind(this)); - - this.mainLabel.attr('transform', function (d, i) { - return 'rotate(' + this.labelAngle + ', 0, 0)'; - }.bind(this)); - }; - - this.setOrientation = function (orientation) { - this.orientation = orientation; - - var markerBBox = this.parent.getMarkerBBox(); - if (!markerBBox) return; - - var x, y; - var offset = 5; - - if (orientation === 'E') { - x = markerBBox.x + markerBBox.width + offset; - y = markerBBox.y + markerBBox.height / 2; - this.labelPosition = 1; - this.labelAngle = 0; - } else if (orientation === 'W') { - x = markerBBox.x - offset; - y = markerBBox.y + markerBBox.height / 2; - this.labelPosition = -1; - this.labelAngle = 0; - } else if (orientation === 'NE') { - x = markerBBox.x + markerBBox.width + offset; - y = markerBBox.y - offset; - this.labelPosition = 1; - this.labelAngle = -45; - } else if (orientation === 'SE') { - x = markerBBox.x + markerBBox.width + offset; - y = markerBBox.y + markerBBox.height + offset; - this.labelPosition = 1; - this.labelAngle = 45; - } else if (orientation === 'NW') { - x = markerBBox.x - offset; - y = markerBBox.y - offset; - this.labelPosition = -1; - this.labelAngle = 45; - } else if (orientation === 'SW') { - x = markerBBox.x - offset; - y = markerBBox.y + markerBBox.height + offset; - this.labelPosition = -1; - this.labelAngle = -45; - } else if (orientation === 'N') { - x = markerBBox.x + markerBBox.width / 2; - y = markerBBox.y - offset; - this.labelPosition = 1; - this.labelAngle = -90; - } else if (orientation === 'S') { - x = markerBBox.x + markerBBox.width / 2; - y = markerBBox.y + markerBBox.height + offset; - this.labelPosition = -1; - this.labelAngle = -90; - } - - this.labelAnchor = { - x: x, - y: y - }; - }; - - this.getBBox = function () { - if (this.orientation === 'E') { - return { - x: this.labelAnchor.x, - y: this.labelAnchor.y - this.textHeight, - width: this.textWidth, - height: this.textHeight - }; - } - - if (this.orientation === 'W') { - return { - x: this.labelAnchor.x - this.textWidth, - y: this.labelAnchor.y - this.textHeight, - width: this.textWidth, - height: this.textHeight - }; - } - - if (this.orientation === 'N') { - return { - x: this.labelAnchor.x - this.textHeight, - y: this.labelAnchor.y - this.textWidth, - width: this.textHeight, - height: this.textWidth - }; - } - - if (this.orientation === 'S') { - return { - x: this.labelAnchor.x - this.textHeight, - y: this.labelAnchor.y, - width: this.textHeight, - height: this.textWidth - }; - } - - var bboxSide = this.textWidth * Math.sqrt(2) / 2; - - if (this.orientation === 'NE') { - return { - x: this.labelAnchor.x, - y: this.labelAnchor.y - bboxSide, - width: bboxSide, - height: bboxSide - }; - } - - if (this.orientation === 'SE') { - return { - x: this.labelAnchor.x, - y: this.labelAnchor.y, - width: bboxSide, - height: bboxSide - }; - } - - if (this.orientation === 'NW') { - return { - x: this.labelAnchor.x - bboxSide, - y: this.labelAnchor.y - bboxSide, - width: bboxSide, - height: bboxSide - }; - } - - if (this.orientation === 'SW') { - return { - x: this.labelAnchor.x - bboxSide, - y: this.labelAnchor.y, - width: bboxSide, - height: bboxSide - }; - } - }; - - this.intersects = function (obj) { - if (obj instanceof Label) { - // todo: handle label-label intersection for diagonally placed labels separately - return this.intersectsBBox(obj.getBBox()); - } else if (obj.x && obj.y && obj.width && obj.height) { - return this.intersectsBBox(obj); - } - - return false; - }; - - this.runFocusTransition = function (display, callback) { - if (this.mainLabel) { - if (this.parent.isFocused()) this.setVisibility(true); - this.mainLabel.transition().style('opacity', this.parent.isFocused() ? 1 : 0).call(callback); - } - }; -}); - -/** - * Expose `PointLabel` - */ - -module.exports = PointLabel; - -},{"./label":19,"augment":42}],22:[function(require,module,exports){ -'use strict'; - -/** - * Dependencies - */ - -var augment = require('augment'); - -var Label = require('./label'); - -/** - * SegmentLabel object - */ - -var SegmentLabel = augment(Label, function (base) { - this.constructor = function (parent, text) { - base.constructor.call(this, parent); - this.labelText = text; - }; - - /* this.initText = function() { - return this.parent.patterns[0].route.route_short_name; - }; */ - - this.render = function (display) { - this.svgGroup = this.parent.labelSvg.append('g').attr('class', 'transitive-sortable').datum({ - owner: this, - sortableType: 'LABEL' - }); - - var padding = this.getPadding(); - - this.computeContainerDimensions(); - - this.containerSvg = this.svgGroup.append('rect').datum(this) // { segment: this.parent }) - .attr({ - width: this.containerWidth, - height: this.containerHeight - }).attr('id', 'transitive-segment-label-container-' + this.parent.getId()).text(this.getText()).attr('class', 'transitive-segment-label-container'); - - this.textSvg = this.svgGroup.append('text').datum(this) // { segment: this.parent }) - .attr('id', 'transitive-segment-label-' + this.parent.getId()).text(this.getText()).attr('class', 'transitive-segment-label').attr('font-size', this.fontSize).attr('font-family', this.fontFamily).attr('transform', function (d, i) { - return 'translate(' + padding + ', ' + (this.textHeight - padding * 2) + ')'; - }.bind(this)); - }; - - this.refresh = function (display) { - if (!this.labelAnchor) return; - - if (!this.svgGroup) this.render(display); - - this.svgGroup.attr('transform', function (d, i) { - var tx = this.labelAnchor.x - this.containerWidth / 2; - var ty = this.labelAnchor.y - this.containerHeight / 2; - return 'translate(' + tx + ',' + ty + ')'; - }.bind(this)); - }; - - this.getPadding = function () { - return this.textHeight * 0.1; - }; - - this.computeContainerDimensions = function () { - this.containerWidth = this.textWidth + this.getPadding() * 2; - this.containerHeight = this.textHeight; - }; - - this.getBBox = function () { - return { - x: this.labelAnchor.x - this.containerWidth / 2, - y: this.labelAnchor.y - this.containerHeight / 2, - width: this.containerWidth, - height: this.containerHeight - }; - }; - - this.intersects = function (obj) { - if (obj instanceof Label) { - // todo: handle label-label intersection for diagonally placed labels separately - return this.intersectsBBox(obj.getBBox()); - } else if (obj.x && obj.y && obj.width && obj.height) { - return this.intersectsBBox(obj); - } - - return false; - }; - - this.clear = function () { - this.labelAnchor = null; - if (this.svgGroup) { - this.svgGroup.remove(); - this.svgGroup = null; - } - }; -}); - -/** - * Expose `SegmentLabel` - */ - -module.exports = SegmentLabel; - -},{"./label":19,"augment":42}],23:[function(require,module,exports){ -'use strict'; - -var augment = require('augment'); -var each = require('component-each'); - -var PointLabel = require('../labeler/pointlabel'); - -var Point = augment(Object, function () { - this.constructor = function (data) { - for (var key in data) { - this[key] = data[key]; - } - - this.paths = []; - this.renderData = []; - - this.label = new PointLabel(this); - this.renderLabel = true; - - this.focused = true; - this.sortableType = 'POINT'; - - this.placeOffsets = { - x: 0, - y: 0 - }; - - this.zIndex = 10000; - }; - - /** - * Get unique ID for point -- must be defined by subclass - */ - - this.getId = function () {}; - - this.getElementId = function () { - return this.getType().toLowerCase() + '-' + this.getId(); - }; - - /** - * Get Point type -- must be defined by subclass - */ - - this.getType = function () {}; - - /** - * Get Point name - */ - - this.getName = function () { - return this.getType() + ' point (ID=' + this.getId() + ')'; - }; - - /** - * Get latitude - */ - - this.getLat = function () { - return 0; - }; - - /** - * Get longitude - */ - - this.getLon = function () { - return 0; - }; - - this.containsSegmentEndPoint = function () { - return false; - }; - - this.containsBoardPoint = function () { - return false; - }; - - this.containsAlightPoint = function () { - return false; - }; - - this.containsTransferPoint = function () { - return false; - }; - - this.getPatterns = function () { - return []; - }; - - /** - * Draw the point - * - * @param {Display} display - */ - - this.render = function (display) { - this.label.svgGroup = null; - }; - - /** - * Refresh a previously drawn point - * - * @param {Display} display - */ - - this.refresh = function (display) {}; - - this.addRenderData = function () {}; - - this.clearRenderData = function () {}; - - this.containsFromPoint = function () { - return false; - }; - - this.containsToPoint = function () { - return false; - }; - - this.initSvg = function (display) { - // set up the main svg group for this stop - this.svgGroup = display.svg.append('g').attr('id', 'transitive-' + this.getType().toLowerCase() + '-' + this.getId()) - // .attr('class', 'transitive-sortable') - .datum(this); - - this.markerSvg = this.svgGroup.append('g'); - this.labelSvg = this.svgGroup.append('g'); - }; - - //* * Shared geom utility functions **// - - this.constructMergedMarker = function (display) { - var dataArray = this.getRenderDataArray(); - var xValues = []; - var yValues = []; - dataArray.forEach(function (data) { - var x = data.x; // display.xScale(data.x) + data.offsetX; - var y = data.y; // display.yScale(data.y) - data.offsetY; - xValues.push(x); - yValues.push(y); - }); - var minX = Math.min.apply(Math, xValues); - var minY = Math.min.apply(Math, yValues); - var maxX = Math.max.apply(Math, xValues); - var maxY = Math.max.apply(Math, yValues); - - // retrieve marker type and radius from the styler - var markerType = display.styler.compute(display.styler.stops_merged['marker-type'], display, { - owner: this - }); - var stylerRadius = display.styler.compute(display.styler.stops_merged.r, display, { - owner: this - }); - - var width; - var height; - var r; - - // if this is a circle marker w/ a styler-defined fixed radius, use that - if (markerType === 'circle' && stylerRadius) { - width = height = stylerRadius * 2; - r = stylerRadius; - // otherwise, this is a dynamically-sized marker - } else { - var dx = maxX - minX; - var dy = maxY - minY; - - var markerPadding = display.styler.compute(display.styler.stops_merged['marker-padding'], display, { - owner: this - }) || 0; - - var patternRadius = display.styler.compute(display.styler[this.patternStylerKey].r, display, { - owner: this - }); - r = parseFloat(patternRadius) + markerPadding; - - if (markerType === 'circle') { - width = height = Math.max(dx, dy) + 2 * r; - r = width / 2; - } else { - width = dx + 2 * r; - height = dy + 2 * r; - if (markerType === 'rectangle') r = 0; - } - } - - return { - x: (minX + maxX) / 2 - width / 2, - y: (minY + maxY) / 2 - height / 2, - width: width, - height: height, - rx: r, - ry: r - }; - }; - - this.initMarkerData = function (display) { - if (this.getType() !== 'STOP' && this.getType() !== 'MULTI') return; - - this.mergedMarkerData = this.constructMergedMarker(display); - - this.placeOffsets = { - x: 0, - y: 0 - }; - if (this.adjacentPlace) { - var placeR = display.styler.compute(display.styler.places.r, display, { - owner: this.adjacentPlace - }); - - var placeX = display.xScale(this.adjacentPlace.worldX); - var placeY = display.yScale(this.adjacentPlace.worldY); - - var thisR = this.mergedMarkerData.width / 2; - var thisX = this.mergedMarkerData.x + thisR; - var thisY = this.mergedMarkerData.y + thisR; - - var dx = thisX - placeX; - var dy = thisY - placeY; - var dist = Math.sqrt(dx * dx + dy * dy); - - if (placeR + thisR > dist) { - var f = (placeR + thisR) / dist; - this.placeOffsets = { - x: dx * f - dx, - y: dy * f - dy - }; - - this.mergedMarkerData.x += this.placeOffsets.x; - this.mergedMarkerData.y += this.placeOffsets.y; - - each(this.graphVertex.incidentEdges(), function (edge) { - each(edge.renderSegments, function (segment) { - segment.refreshRenderData(display); - }); - }); - } - } - }; - - this.refreshLabel = function (display) { - if (!this.renderLabel) return; - this.label.refresh(display); - }; - - this.getMarkerBBox = function () { - return this.markerSvg.node().getBBox(); - }; - - this.setFocused = function (focused) { - this.focused = focused; - }; - - this.isFocused = function () { - return this.focused === true; - }; - - this.runFocusTransition = function (display, callback) {}; - - this.setAllPatternsFocused = function () {}; - - this.getZIndex = function () { - return this.zIndex; - }; - - this.getAverageCoord = function () { - var dataArray = this.getRenderDataArray(); - - var xTotal = 0; - var yTotal = 0; - each(dataArray, function (data) { - xTotal += data.x; - yTotal += data.y; - }); - - return { - x: xTotal / dataArray.length, - y: yTotal / dataArray.length - }; - }; - - this.hasRenderData = function () { - var dataArray = this.getRenderDataArray(); - return dataArray && dataArray.length > 0; - }; - - this.makeDraggable = function (transitive) {}; - - this.toString = function () { - return this.getType() + ' point: ' + this.getId() + ' (' + this.getName() + ')'; - }; -}); - -/** - * Expose `Point` - */ - -module.exports = Point; - -},{"../labeler/pointlabel":21,"augment":42,"component-each":84}],24:[function(require,module,exports){ -'use strict'; - -/** - * Dependencies - */ - -var augment = require('augment'); -var each = require('component-each'); - -var Point = require('./index'); - -/** - * MultiPoint: a Point subclass representing a collection of multiple points - * that have been merged into one for display purposes. - */ - -var MultiPoint = augment(Point, function (base) { - this.constructor = function (pointArray) { - base.constructor.call(this); - this.points = []; - if (pointArray) { - pointArray.forEach(function (point) { - this.addPoint(point); - }, this); - } - this.renderData = []; - this.id = 'multi'; - this.toPoint = this.fromPoint = null; - - this.patternStylerKey = 'multipoints_pattern'; - }; - - /** - * Get id - */ - - this.getId = function () { - return this.id; - }; - - /** - * Get type - */ - - this.getType = function () { - return 'MULTI'; - }; - - this.getName = function () { - if (this.fromPoint) return this.fromPoint.getName(); - if (this.toPoint) return this.toPoint.getName(); - var shortest = null; - this.points.forEach(function (point) { - if (point.getType() === 'TURN') return; - if (!shortest || point.getName().length < shortest.length) shortest = point.getName(); - }); - - return shortest; - }; - - this.containsSegmentEndPoint = function () { - for (var i = 0; i < this.points.length; i++) { - if (this.points[i].containsSegmentEndPoint()) return true; - } - return false; - }; - - this.containsBoardPoint = function () { - for (var i = 0; i < this.points.length; i++) { - if (this.points[i].containsBoardPoint()) return true; - } - return false; - }; - - this.containsAlightPoint = function () { - for (var i = 0; i < this.points.length; i++) { - if (this.points[i].containsAlightPoint()) return true; - } - return false; - }; - - this.containsTransferPoint = function () { - for (var i = 0; i < this.points.length; i++) { - if (this.points[i].containsTransferPoint()) return true; - } - return false; - }; - - this.containsFromPoint = function () { - return this.fromPoint !== null; - }; - - this.containsToPoint = function () { - return this.toPoint !== null; - }; - - this.getPatterns = function () { - var patterns = []; - - this.points.forEach(function (point) { - if (!point.patterns) return; - point.patterns.forEach(function (pattern) { - if (patterns.indexOf(pattern) === -1) patterns.push(pattern); - }); - }); - - return patterns; - }; - - this.addPoint = function (point) { - if (this.points.indexOf(point) !== -1) return; - this.points.push(point); - this.id += '-' + point.getId(); - if (point.containsFromPoint()) { - // getType() === 'PLACE' && point.getId() === 'from') { - this.fromPoint = point; - } - if (point.containsToPoint()) { - // getType() === 'PLACE' && point.getId() === 'to') { - this.toPoint = point; - } - this.calcWorldCoords(); - }; - - this.calcWorldCoords = function () { - var tx = 0; - var ty = 0; - each(this.points, function (point) { - tx += point.worldX; - ty += point.worldY; - }); - - this.worldX = tx / this.points.length; - this.worldY = ty / this.points.length; - }; - - /** - * Add render data - * - * @param {Object} stopInfo - */ - - this.addRenderData = function (pointInfo) { - if (pointInfo.offsetX !== 0 || pointInfo.offsetY !== 0) this.hasOffsetPoints = true; - this.renderData.push(pointInfo); - }; - - this.clearRenderData = function () { - this.hasOffsetPoints = false; - this.renderData = []; - }; - - /** - * Draw a multipoint - * - * @param {Display} display - */ - - this.render = function (display) { - base.render.call(this, display); - - if (!this.renderData) return; - - // set up the main svg group for this stop - this.initSvg(display); - this.svgGroup.attr('class', 'transitive-sortable').datum({ - owner: this, - sortableType: 'POINT_MULTI' - }); - - if (this.containsSegmentEndPoint()) this.initMergedMarker(display); - - // set up the pattern markers - /* this.marker = this.markerSvg.selectAll('circle') - .data(this.renderData) - .enter() - .append('circle') - .attr('class', 'transitive-multipoint-marker-pattern'); */ - }; - - this.initMergedMarker = function (display) { - // set up the merged marker - if (this.fromPoint || this.toPoint) { - this.mergedMarker = this.markerSvg.append('g').append('circle').datum({ - owner: this - }).attr('class', 'transitive-multipoint-marker-merged'); - } else if (this.hasOffsetPoints || this.renderData.length > 1) { - this.mergedMarker = this.markerSvg.append('g').append('rect').datum({ - owner: this - }).attr('class', 'transitive-multipoint-marker-merged'); - } - }; - - /** - * Refresh the point - * - * @param {Display} display - */ - - this.refresh = function (display) { - if (!this.renderData) return; - - // refresh the merged marker - if (this.mergedMarker) { - if (!this.mergedMarkerData) this.initMarkerData(display); - - this.mergedMarker.datum({ - owner: this - }); - this.mergedMarker.attr(this.mergedMarkerData); - } - - /* var cx, cy; - // refresh the pattern-level markers - this.marker.data(this.renderData); - this.marker.attr('transform', function (d, i) { - cx = d.x; - cy = d.y; - var x = display.xScale(d.x) + d.offsetX; - var y = display.yScale(d.y) - d.offsetY; - return 'translate(' + x +', ' + y +')'; - }); */ - }; - - this.getRenderDataArray = function () { - return this.renderData; - }; - - this.setFocused = function (focused) { - this.focused = focused; - each(this.points, function (point) { - point.setFocused(focused); - }); - }; - - this.runFocusTransition = function (display, callback) { - if (this.mergedMarker) { - var newStrokeColor = display.styler.compute(display.styler.multipoints_merged.stroke, display, { - owner: this - }); - this.mergedMarker.transition().style('stroke', newStrokeColor).call(callback); - } - if (this.label) this.label.runFocusTransition(display, callback); - }; -}); - -/** - * Expose `MultiPoint` - */ - -module.exports = MultiPoint; - -},{"./index":23,"augment":42,"component-each":84}],25:[function(require,module,exports){ -'use strict'; - -/** - * Dependencies - */ - -var augment = require('augment'); -var d3 = require('d3'); - -var Point = require('./index'); -var Util = require('../util'); - -var SphericalMercator = require('../util/spherical-mercator'); -var sm = new SphericalMercator(); - -/** - * Place: a Point subclass representing a 'place' that can be rendered on the - * map. A place is a point *other* than a transit stop/station, e.g. a home/work - * location, a point of interest, etc. - */ - -var Place = augment(Point, function (base) { - /** - * the constructor - */ - - this.constructor = function (data) { - base.constructor.call(this, data); - - if (data && data.place_lat && data.place_lon) { - var xy = Util.latLonToSphericalMercator(data.place_lat, data.place_lon); - this.worldX = xy[0]; - this.worldY = xy[1]; - } - - this.zIndex = 100000; - }; - - /** - * Get Type - */ - - this.getType = function () { - return 'PLACE'; - }; - - /** - * Get ID - */ - - this.getId = function () { - return this.place_id; - }; - - /** - * Get Name - */ - - this.getName = function () { - return this.place_name; - }; - - /** - * Get lat - */ - - this.getLat = function () { - return this.place_lat; - }; - - /** - * Get lon - */ - - this.getLon = function () { - return this.place_lon; - }; - - this.containsSegmentEndPoint = function () { - return true; - }; - - this.containsFromPoint = function () { - return this.getId() === 'from'; - }; - - this.containsToPoint = function () { - return this.getId() === 'to'; - }; - - this.addRenderData = function (pointInfo) { - this.renderData.push(pointInfo); - }; - - this.getRenderDataArray = function () { - return this.renderData; - }; - - this.clearRenderData = function () { - this.renderData = []; - }; - - /** - * Draw a place - * - * @param {Display} display - */ - - this.render = function (display) { - base.render.call(this, display); - if (!this.renderData) return; - - this.initSvg(display); - this.svgGroup.attr('class', 'transitive-sortable').datum({ - owner: this, - sortableType: 'POINT_PLACE' - }); - - // set up the markers - this.marker = this.markerSvg.append('circle').datum({ - owner: this - }).attr('class', 'transitive-place-circle'); - - var iconUrl = display.styler.compute(display.styler.places_icon['xlink:href'], display, { - owner: this - }); - if (iconUrl) { - this.icon = this.markerSvg.append('image').datum({ - owner: this - }).attr('class', 'transitive-place-icon').attr('xlink:href', iconUrl); - } - }; - - /** - * Refresh the place - * - * @param {Display} display - */ - - this.refresh = function (display) { - if (!this.renderData) return; - - // refresh the marker/icon - var x = display.xScale(this.worldX); - var y = display.yScale(this.worldY); - var translate = 'translate(' + x + ', ' + y + ')'; - this.marker.attr('transform', translate); - if (this.icon) this.icon.attr('transform', translate); - }; - - this.makeDraggable = function (transitive) { - var place = this; - var display = transitive.display; - var drag = d3.behavior.drag().on('dragstart', function () { - d3.event.sourceEvent.stopPropagation(); // silence other listeners - }).on('drag', function () { - if (place.graphVertex) { - var boundingRect = display.el.getBoundingClientRect(); - var x = display.xScale.invert(d3.event.sourceEvent.pageX - boundingRect.left); - var y = display.yScale.invert(d3.event.sourceEvent.pageY - boundingRect.top); - - place.worldX = x; - place.worldY = y; - var ll = sm.inverse([x, y]); - place.place_lon = ll[0]; - place.place_lat = ll[1]; - - place.refresh(display); - } - }).on('dragend', function () { - transitive.emit('place.' + place.getId() + '.dragend', place); - }); - this.markerSvg.call(drag); - }; -}); - -/** - * Expose `Place` - */ - -module.exports = Place; - -},{"../util":38,"../util/spherical-mercator":41,"./index":23,"augment":42,"d3":88}],26:[function(require,module,exports){ -'use strict'; - -/** - * Dependencies - */ - -var each = require('component-each'); - -/** - * Expose `PointCluster` - */ - -module.exports = PointCluster; - -/** - * - */ - -function PointCluster() { - this.points = []; -} - -PointCluster.prototype.addPoint = function (point) { - if (this.points.indexOf(point) === -1) this.points.push(point); -}; - -PointCluster.prototype.mergeVertices = function (graph) { - var vertices = []; - each(this.points, function (point) { - vertices.push(point.graphVertex); - }); - graph.mergeVertices(vertices); -}; - -},{"component-each":84}],27:[function(require,module,exports){ -'use strict'; - -/** - * Dependencies - */ - -var d3 = require('d3'); -var each = require('component-each'); - -var PointCluster = require('./pointcluster'); -var MultiPoint = require('./multipoint'); -var Util = require('../util'); - -/** - * Expose `PointClusterMap` - */ - -module.exports = PointClusterMap; - -/** - * - */ - -function PointClusterMap(transitive) { - this.transitive = transitive; - - this.clusters = []; - this.clusterLookup = {}; // maps Point object to its containing cluster - - var pointArr = []; - each(transitive.stops, function (key) { - var point = transitive.stops[key]; - if (point.used) pointArr.push(point); - }, this); - each(transitive.turnPoints, function (key) { - pointArr.push(transitive.turnPoints[key]); - }, this); - - var links = d3.geom.voronoi().x(function (d) { - return d.worldX; - }).y(function (d) { - return d.worldY; - }).links(pointArr); - - each(links, function (link) { - var dist = Util.distance(link.source.worldX, link.source.worldY, link.target.worldX, link.target.worldY); - if (dist < 100 && (link.source.getType() !== 'TURN' || link.target.getType() !== 'TURN')) { - var sourceInCluster = link.source in this.clusterLookup; - var targetInCluster = link.target in this.clusterLookup; - if (sourceInCluster && !targetInCluster) { - this.addPointToCluster(link.target, this.clusterLookup[link.source]); - } else if (!sourceInCluster && targetInCluster) { - this.addPointToCluster(link.source, this.clusterLookup[link.target]); - } else if (!sourceInCluster && !targetInCluster) { - var cluster = new PointCluster(); - this.clusters.push(cluster); - this.addPointToCluster(link.source, cluster); - this.addPointToCluster(link.target, cluster); - } - } - }, this); - - this.vertexPoints = []; - each(this.clusters, function (cluster) { - var multipoint = new MultiPoint(cluster.points); - this.vertexPoints.push(multipoint); - each(cluster.points, function (point) { - point.multipoint = multipoint; - }, this); - }, this); -} - -PointClusterMap.prototype.addPointToCluster = function (point, cluster) { - cluster.addPoint(point); - this.clusterLookup[point] = cluster; -}; - -PointClusterMap.prototype.clearMultiPoints = function () { - each(this.clusters, function (cluster) { - each(cluster.points, function (point) { - point.multipoint = null; - }, this); - }, this); -}; - -PointClusterMap.prototype.getVertexPoints = function (baseVertexPoints) { - if (!baseVertexPoints) return this.vertexPoints; - var vertexPoints = this.vertexPoints.concat(); - each(baseVertexPoints, function (point) { - if (!point.multipoint) vertexPoints.push(point); - }); - return vertexPoints; -}; - -},{"../util":38,"./multipoint":24,"./pointcluster":26,"component-each":84,"d3":88}],28:[function(require,module,exports){ -'use strict'; - -var _keys = require('babel-runtime/core-js/object/keys'); - -var _keys2 = _interopRequireDefault(_keys); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -/** - * Dependencies - */ - -var augment = require('augment'); -var each = require('component-each'); - -var Point = require('./index'); -var Util = require('../util'); - -/** - * Place: a Point subclass representing a 'place' that can be rendered on the - * map. A place is a point *other* than a transit stop/station, e.g. a home/work - * location, a point of interest, etc. - */ - -var Stop = augment(Point, function (base) { - this.constructor = function (data) { - base.constructor.call(this, data); - - if (data && data.stop_lat && data.stop_lon) { - var xy = Util.latLonToSphericalMercator(data.stop_lat, data.stop_lon); - this.worldX = xy[0]; - this.worldY = xy[1]; - } - - this.patterns = []; - - this.patternRenderData = {}; - this.patternFocused = {}; - this.patternCount = 0; - - this.patternStylerKey = 'stops_pattern'; - - this.isSegmentEndPoint = false; - }; - - /** - * Get id - */ - - this.getId = function () { - return this.stop_id; - }; - - /** - * Get type - */ - - this.getType = function () { - return 'STOP'; - }; - - /** - * Get name - */ - - this.getName = function () { - if (!this.stop_name) return 'Unnamed Stop (ID=' + this.getId() + ')'; - return this.stop_name; - }; - - /** - * Get lat - */ - - this.getLat = function () { - return this.stop_lat; - }; - - /** - * Get lon - */ - - this.getLon = function () { - return this.stop_lon; - }; - - this.containsSegmentEndPoint = function () { - return this.isSegmentEndPoint; - }; - - this.containsBoardPoint = function () { - return this.isBoardPoint; - }; - - this.containsAlightPoint = function () { - return this.isAlightPoint; - }; - - this.containsTransferPoint = function () { - return this.isTransferPoint; - }; - - this.getPatterns = function () { - return this.patterns; - }; - - this.addPattern = function (pattern) { - if (this.patterns.indexOf(pattern) === -1) this.patterns.push(pattern); - }; - - /** - * Add render data - * - * @param {Object} stopInfo - */ - - this.addRenderData = function (stopInfo) { - if (stopInfo.rEdge.getType() === 'TRANSIT') { - var s = { - sortableType: 'POINT_STOP_PATTERN', - owner: this, - getZIndex: function getZIndex() { - if (this.owner.graphVertex) { - return this.owner.getZIndex(); - } - return this.rEdge.getZIndex() + 1; - } - }; - - for (var key in stopInfo) { - s[key] = stopInfo[key]; - }var patternId = stopInfo.rEdge.patternIds; - this.patternRenderData[patternId] = s; // .push(s); - - each(stopInfo.rEdge.patterns, function (pattern) { - this.addPattern(pattern); - }, this); - } - this.patternCount = (0, _keys2.default)(this.patternRenderData).length; - }; - - this.isPatternFocused = function (patternId) { - if (!(patternId in this.patternFocused)) return true; - return this.patternFocused[patternId]; - }; - - this.setPatternFocused = function (patternId, focused) { - this.patternFocused[patternId] = focused; - }; - - this.setAllPatternsFocused = function (focused) { - for (var key in this.patternRenderData) { - this.patternFocused[key] = focused; - } - }; - - /** - * Draw a stop - * - * @param {Display} display - */ - - this.render = function (display) { - base.render.call(this, display); - if ((0, _keys2.default)(this.patternRenderData).length === 0) return; - - var renderDataArray = this.getRenderDataArray(); - - this.initSvg(display); - - // set up the merged marker - this.mergedMarker = this.markerSvg.append('g').append('rect').attr('class', 'transitive-sortable transitive-stop-marker-merged').datum(this.getMergedRenderData()); - - // set up the pattern-specific markers - this.patternMarkers = this.markerSvg.append('g').selectAll('circle').data(renderDataArray).enter().append('circle').attr('class', 'transitive-sortable transitive-stop-marker-pattern'); - }; - - /** - * Refresh the stop - * - * @param {Display} display - */ - - this.refresh = function (display) { - if (this.patternCount === 0) return; - - if (!this.mergedMarkerData) this.initMarkerData(display); - - // refresh the pattern-level markers - this.patternMarkers.data(this.getRenderDataArray()); - - this.patternMarkers.attr('transform', function (d, i) { - if (!isNaN(d.x) && !isNaN(d.y)) { - var x = d.x + this.placeOffsets.x; - var y = d.y + this.placeOffsets.y; - return 'translate(' + x + ', ' + y + ')'; - } - }.bind(this)); - - // refresh the merged marker - if (this.mergedMarker) { - this.mergedMarker.datum(this.getMergedRenderData()); - if (!isNaN(this.mergedMarkerData.x) && !isNaN(this.mergedMarkerData.y)) this.mergedMarker.attr(this.mergedMarkerData); - } - }; - - this.getMergedRenderData = function () { - return { - owner: this, - sortableType: 'POINT_STOP_MERGED' - }; - }; - - this.getRenderDataArray = function () { - var dataArray = []; - for (var patternId in this.patternRenderData) { - dataArray.push(this.patternRenderData[patternId]); - } - return dataArray; - }; - - this.getMarkerBBox = function () { - if (this.mergedMarker) return this.mergedMarkerData; - }; - - this.isFocused = function () { - if (this.mergedMarker || !this.patternRenderData) { - return this.focused === true; - } - - var focused = true; - for (var patternId in this.patternRenderData) { - focused = this && this.isPatternFocused(patternId); - } - return focused; - }; - - this.runFocusTransition = function (display, callback) { - if (this.mergedMarker) { - var newStrokeColor = display.styler.compute(display.styler.stops_merged.stroke, display, { - owner: this - }); - this.mergedMarker.transition().style('stroke', newStrokeColor).call(callback); - } - if (this.label) this.label.runFocusTransition(display, callback); - }; - - this.clearRenderData = function () { - this.patternRenderData = {}; - this.mergedMarkerData = null; - this.placeOffsets = { - x: 0, - y: 0 - }; - }; -}); - -/** - * Expose `Stop` - */ - -module.exports = Stop; - -},{"../util":38,"./index":23,"augment":42,"babel-runtime/core-js/object/keys":44,"component-each":84}],29:[function(require,module,exports){ -'use strict'; - -/** - * Dependencies - */ - -var augment = require('augment'); - -var Point = require('./index'); - -var SphericalMercator = require('../util/spherical-mercator'); -var sm = new SphericalMercator(); - -/** - * - */ - -var TurnPoint = augment(Point, function (base) { - this.constructor = function (data, id) { - base.constructor.call(this, data); - this.name = 'Turn @ ' + data.lat + ', ' + data.lon; - if (!this.worldX || !this.worldY) { - var smCoords = sm.forward([data.lon, data.lat]); - this.worldX = smCoords[0]; - this.worldY = smCoords[1]; - this.isSegmentEndPoint = false; - } - this.id = id; - }; - - this.getId = function () { - return this.id; - }; - - this.getType = function () { - return 'TURN'; - }; - - this.getName = function () { - return this.name; - }; - - this.containsSegmentEndPoint = function () { - return this.isSegmentEndPoint; - }; -}); - -/** - * Expose `TurnPoint` - */ - -module.exports = TurnPoint; - -},{"../util/spherical-mercator":41,"./index":23,"augment":42}],30:[function(require,module,exports){ -'use strict'; - -var augment = require('augment'); -var each = require('component-each'); - -var Renderer = require('./index'); - -/** - * A Renderer subclass for the default network rendering engine. - * - * @param {Object} the main Transitive object - */ - -var DefaultRenderer = augment(Renderer, function (base) { - this.constructor = function (transitive) { - base.constructor.call(this, transitive); - }; - - this.render = function () { - base.render.call(this); - - var self = this; - var display = this.transitive.display; - var network = this.transitive.network; - display.styler = this.transitive.styler; - - var legendSegments = {}; - - each(network.renderedEdges, function (rEdge) { - rEdge.refreshRenderData(display); - }); - - each(network.paths, function (path) { - each(path.segments, function (pathSegment) { - each(pathSegment.renderedSegments, function (renderedSegment) { - renderedSegment.render(display); - var legendType = renderedSegment.getLegendType(); - if (!(legendType in legendSegments)) { - legendSegments[legendType] = renderedSegment; - } - }); - }); - }); - - // draw the vertex-based points - - each(network.graph.vertices, function (vertex) { - vertex.point.render(display); - if (self.isDraggable(vertex.point)) { - vertex.point.makeDraggable(self.transitive); - } - }); - - // draw the edge-based points - each(network.graph.edges, function (edge) { - edge.pointArray.forEach(function (point) { - point.render(display); - }); - }); - - if (display.legend) display.legend.render(legendSegments); - - this.transitive.refresh(); - }; - - /** - * Refresh - */ - - this.refresh = function (panning) { - base.refresh.call(this, panning); - - var display = this.transitive.display; - var network = this.transitive.network; - var styler = this.transitive.styler; - - network.graph.vertices.forEach(function (vertex) { - vertex.point.clearRenderData(); - }); - network.graph.edges.forEach(function (edge) { - edge.clearRenderData(); - }); - - // refresh the segment and point marker data - this.refreshSegmentRenderData(); - network.graph.vertices.forEach(function (vertex) { - vertex.point.initMarkerData(display); - }); - - this.renderedSegments = []; - each(network.paths, function (path) { - each(path.segments, function (pathSegment) { - each(pathSegment.renderedSegments, function (rSegment) { - rSegment.refresh(display); - this.renderedSegments.push(rSegment); - }, this); - }, this); - }, this); - - network.graph.vertices.forEach(function (vertex) { - var point = vertex.point; - if (!point.svgGroup) return; // check if this point is not currently rendered - styler.stylePoint(display, point); - point.refresh(display); - }); - - // re-draw the edge-based points - network.graph.edges.forEach(function (edge) { - edge.pointArray.forEach(function (point) { - if (!point.svgGroup) return; // check if this point is not currently rendered - styler.styleStop(display, point); - point.refresh(display); - }); - }); - - // refresh the label layout - var labeledElements = this.transitive.labeler.doLayout(); - labeledElements.points.forEach(function (point) { - point.refreshLabel(display); - styler.stylePointLabel(display, point); - }); - each(this.transitive.labeler.segmentLabels, function (label) { - label.refresh(display); - styler.styleSegmentLabel(display, label); - }); - - this.sortElements(); - }; - - this.refreshSegmentRenderData = function () { - each(this.transitive.network.renderedEdges, function (rEdge) { - rEdge.refreshRenderData(this.transitive.display); - }, this); - - // try intersecting adjacent rendered edges to create a smooth transition - - var isectKeys = []; // keep track of edge-edge intersections we've already computed - each(this.transitive.network.paths, function (path) { - each(path.segments, function (pathSegment) { - each(pathSegment.renderedSegments, function (rSegment) { - for (var s = 0; s < rSegment.renderedEdges.length - 1; s++) { - var rEdge1 = rSegment.renderedEdges[s]; - var rEdge2 = rSegment.renderedEdges[s + 1]; - var key = rEdge1.getId() + '_' + rEdge2.getId(); - if (isectKeys.indexOf(key) !== -1) continue; - if (rEdge1.graphEdge.isInternal && rEdge2.graphEdge.isInternal) { - rEdge1.intersect(rEdge2); - } - isectKeys.push(key); - } - }); - }); - }); - }; - - /** - * sortElements - */ - - this.sortElements = function () { - this.renderedSegments.sort(function (a, b) { - return a.compareTo(b); - }); - - var focusBaseZIndex = 100000; - - this.renderedSegments.forEach(function (rSegment, index) { - rSegment.zIndex = index * 10 + (rSegment.isFocused() ? focusBaseZIndex : 0); - }); - - this.transitive.network.graph.vertices.forEach(function (vertex) { - var point = vertex.point; - point.zIndex = point.zIndex + (point.isFocused() ? focusBaseZIndex : 0); - }); - - this.transitive.display.svg.selectAll('.transitive-sortable').sort(function (a, b) { - var aIndex = typeof a.getZIndex === 'function' ? a.getZIndex() : a.owner.getZIndex(); - var bIndex = typeof b.getZIndex === 'function' ? b.getZIndex() : b.owner.getZIndex(); - return aIndex - bIndex; - }); - }; - - /** - * focusPath - */ - - this.focusPath = function (path) { - var self = this; - var pathRenderedSegments = []; - var graph = this.transitive.network.graph; - - if (path) { - // if we're focusing a specific path - pathRenderedSegments = path.getRenderedSegments(); - - // un-focus all internal points - graph.edges.forEach(function (edge) { - edge.pointArray.forEach(function (point, i) { - point.setAllPatternsFocused(false); - }); - }, this); - } else { - // if we're returing to 'all-focused' mode - // re-focus all internal points - graph.edges.forEach(function (edge) { - edge.pointArray.forEach(function (point, i) { - point.setAllPatternsFocused(true); - }); - }, this); - } - - var focusChangeSegments = []; - var focusedVertexPoints = []; - each(this.renderedSegments, function (rSegment) { - if (path && pathRenderedSegments.indexOf(rSegment) === -1) { - if (rSegment.isFocused()) focusChangeSegments.push(rSegment); - rSegment.setFocused(false); - } else { - if (!rSegment.isFocused()) focusChangeSegments.push(rSegment); - rSegment.setFocused(true); - focusedVertexPoints.push(rSegment.pathSegment.startVertex().point); - focusedVertexPoints.push(rSegment.pathSegment.endVertex().point); - } - }); - - var focusChangePoints = []; - graph.vertices.forEach(function (vertex) { - var point = vertex.point; - if (focusedVertexPoints.indexOf(point) !== -1) { - if (!point.isFocused()) focusChangePoints.push(point); - point.setFocused(true); - } else { - if (point.isFocused()) focusChangePoints.push(point); - point.setFocused(false); - } - }, this); - - // bring the focused elements to the front for the transition - // if (path) this.sortElements(); - - // create a transition callback function that invokes refresh() after all transitions complete - var n = 0; - var refreshOnEnd = function refreshOnEnd(transition, callback) { - transition.each(function () { - ++n; - }).each('end', function () { - if (! --n) self.transitive.refresh(); - }); - }; - - // run the transtions on the affected elements - each(focusChangeSegments, function (segment) { - segment.runFocusTransition(this.transitive.display, refreshOnEnd); - }, this); - - each(focusChangePoints, function (point) { - point.runFocusTransition(this.transitive.display, refreshOnEnd); - }, this); - }; -}); - -/** - * Expose `DefaultRenderer` - */ - -module.exports = DefaultRenderer; - -},{"./index":31,"augment":42,"component-each":84}],31:[function(require,module,exports){ -'use strict'; - -var augment = require('augment'); -var each = require('component-each'); - -var drawGrid = require('../display/draw-grid'); - -/** - * A superclass for a Transitive network rendering engine. - * - * @param {Object} the main Transitive object - */ - -var Renderer = augment(Object, function () { - this.constructor = function (transitive) { - this.transitive = transitive; - }; - - this.render = function () { - var display = this.transitive.display; - display.styler = this.transitive.styler; - - // remove all old svg elements - display.empty(); - }; - - /** - * Refresh - */ - - this.refresh = function (panning) { - var display = this.transitive.display; - var network = this.transitive.network; - - if (display.tileLayer) display.tileLayer.zoomed(); - - network.graph.vertices.forEach(function (vertex) { - vertex.point.clearRenderData(); - }); - network.graph.edges.forEach(function (edge) { - edge.clearRenderData(); - }); - - // draw the grid, if necessary - if (this.transitive.options.drawGrid) drawGrid(display, this.gridCellSize); - }; - - /** - * sortElements - */ - - this.sortElements = function () {}; - - /** - * focusPath - */ - - this.focusPath = function (path) {}; - - this.isDraggable = function (point) { - var draggableTypes = this.transitive.options.draggableTypes; - if (!draggableTypes) return false; - - var retval = false; - each(draggableTypes, function (type) { - if (type === point.getType()) { - // Return true in ether of the following cases: - // 1. No ID array is provided for this point type (i.e. entire type is draggable) - // 2. An ID array is provided and it includes this Point's ID - retval = !draggableTypes[type] || draggableTypes[type].indexOf(point.getId()) !== -1; - } - }); - return retval; - }; -}); - -/** - * Expose `Renderer` - */ - -module.exports = Renderer; - -},{"../display/draw-grid":10,"augment":42,"component-each":84}],32:[function(require,module,exports){ -'use strict'; - -var each = require('component-each'); - -var Util = require('../util'); - -var rEdgeId = 0; - -/** - * Expose `RenderedEdge` - */ - -module.exports = RenderedEdge; - -/** - * - */ - -function RenderedEdge(graphEdge, forward, type) { - this.id = rEdgeId++; - this.graphEdge = graphEdge; - this.forward = forward; - this.type = type; - this.points = []; - this.clearOffsets(); - this.focused = true; - this.sortableType = 'SEGMENT'; -} - -RenderedEdge.prototype.clearGraphData = function () { - this.graphEdge = null; - this.edgeFromOffset = 0; - this.edgeToOffset = 0; -}; - -RenderedEdge.prototype.addPattern = function (pattern) { - if (!this.patterns) this.patterns = []; - if (this.patterns.indexOf(pattern) !== -1) return; - this.patterns.push(pattern); - - // generate the patternIds field - this.patternIds = constuctIdListString(this.patterns); -}; - -RenderedEdge.prototype.addPathSegment = function (pathSegment) { - if (!this.pathSegments) this.pathSegments = []; - if (this.pathSegments.indexOf(pathSegment) !== -1) return; - this.pathSegments.push(pathSegment); - - // generate the pathSegmentIds field - this.pathSegmentIds = constuctIdListString(this.pathSegments); -}; - -function constuctIdListString(items) { - var idArr = []; - each(items, function (item) { - idArr.push(item.getId()); - }); - idArr.sort(); - return idArr.join(','); -} - -RenderedEdge.prototype.getId = function () { - return this.id; -}; - -RenderedEdge.prototype.getType = function () { - return this.type; -}; - -RenderedEdge.prototype.setFromOffset = function (offset) { - this.fromOffset = offset; -}; - -RenderedEdge.prototype.setToOffset = function (offset) { - this.toOffset = offset; -}; - -RenderedEdge.prototype.clearOffsets = function () { - this.fromOffset = 0; - this.toOffset = 0; -}; - -RenderedEdge.prototype.getAlignmentVector = function (alignmentId) { - if (this.graphEdge.getFromAlignmentId() === alignmentId) { - return this.graphEdge.fromVector; - } - if (this.graphEdge.getToAlignmentId() === alignmentId) { - return this.graphEdge.toVector; - } - return null; -}; - -RenderedEdge.prototype.offsetAlignment = function (alignmentId, offset) { - if (this.graphEdge.getFromAlignmentId() === alignmentId) { - this.setFromOffset(Util.isOutwardVector(this.graphEdge.fromVector) ? offset : -offset); - } - if (this.graphEdge.getToAlignmentId() === alignmentId) { - this.setToOffset(Util.isOutwardVector(this.graphEdge.toVector) ? offset : -offset); - } -}; - -RenderedEdge.prototype.setFocused = function (focused) { - this.focused = focused; -}; - -RenderedEdge.prototype.refreshRenderData = function (display) { - if (this.graphEdge.fromVertex.x === this.graphEdge.toVertex.x && this.graphEdge.fromVertex.y === this.graphEdge.toVertex.y) { - this.renderData = []; - return; - } - - this.lineWidth = this.computeLineWidth(display, true); - - var fromOffsetPx = this.fromOffset * this.lineWidth; - var toOffsetPx = this.toOffset * this.lineWidth; - - if (this.graphEdge.geomCoords) { - this.renderData = this.graphEdge.getGeometricCoords(fromOffsetPx, toOffsetPx, display, this.forward); - } else { - this.renderData = this.graphEdge.getRenderCoords(fromOffsetPx, toOffsetPx, display, this.forward); - } - - var firstRenderPoint = this.renderData[0]; - var lastRenderPoint = this.renderData[this.renderData.length - 1]; - - var pt; - if (!this.graphEdge.fromVertex.isInternal) { - pt = this.forward ? firstRenderPoint : lastRenderPoint; - if (pt) { - this.graphEdge.fromVertex.point.addRenderData({ - x: pt.x, - y: pt.y, - rEdge: this - }); - } - } - - pt = this.forward ? lastRenderPoint : firstRenderPoint; - if (pt) { - this.graphEdge.toVertex.point.addRenderData({ - x: pt.x, - y: pt.y, - rEdge: this - }); - } - - each(this.graphEdge.pointArray, function (point, i) { - if (point.getType() === 'TURN') return; - var t = (i + 1) / (this.graphEdge.pointArray.length + 1); - var coord = this.graphEdge.coordAlongEdge(this.forward ? t : 1 - t, this.renderData, display); - if (coord) { - point.addRenderData({ - x: coord.x, - y: coord.y, - rEdge: this - }); - } - }, this); -}; - -RenderedEdge.prototype.computeLineWidth = function (display, includeEnvelope) { - var styler = display.styler; - if (styler && display) { - // compute the line width - var env = styler.compute(styler.segments.envelope, display, this); - if (env && includeEnvelope) { - return parseFloat(env.substring(0, env.length - 2), 10) - 2; - } else { - var lw = styler.compute(styler.segments['stroke-width'], display, this); - return parseFloat(lw.substring(0, lw.length - 2), 10) - 2; - } - } -}; - -RenderedEdge.prototype.isFocused = function () { - return this.focused === true; -}; - -RenderedEdge.prototype.getZIndex = function () { - return 10000; -}; - -/** - * Computes the point of intersection between two adjacent, offset RenderedEdges (the - * edge the function is called on and a second egde passed as a parameter) - * by "extending" the adjacent edges and finding the point of intersection. If - * such a point exists, the existing renderData arrays for the edges are - * adjusted accordingly, as are any associated stops. - */ - -RenderedEdge.prototype.intersect = function (rEdge) { - // do no intersect adjacent edges of unequal bundle size - if (this.graphEdge.renderedEdges.length !== rEdge.graphEdge.renderedEdges.length) return; - - var commonVertex = this.graphEdge.commonVertex(rEdge.graphEdge); - if (!commonVertex || commonVertex.point.isSegmentEndPoint) return; - - var thisCheck = commonVertex === this.graphEdge.fromVertex && this.forward || commonVertex === this.graphEdge.toVertex && !this.forward; - var otherCheck = commonVertex === rEdge.graphEdge.fromVertex && rEdge.forward || commonVertex === rEdge.graphEdge.toVertex && !rEdge.forward; - - var p1 = thisCheck ? this.renderData[0] : this.renderData[this.renderData.length - 1]; - var v1 = this.graphEdge.getVector(commonVertex); - - var p2 = otherCheck ? rEdge.renderData[0] : rEdge.renderData[rEdge.renderData.length - 1]; - var v2 = rEdge.graphEdge.getVector(commonVertex); - - if (!p1 || !p2 || !v1 || !v2 || p1.x === p2.x && p1.y === p2.y) return; - - var isect = Util.lineIntersection(p1.x, p1.y, p1.x + v1.x, p1.y - v1.y, p2.x, p2.y, p2.x + v2.x, p2.y - v2.y); - - if (!isect.intersect) return; - - // adjust the endpoint of the first edge - if (thisCheck) { - this.renderData[0].x = isect.x; - this.renderData[0].y = isect.y; - } else { - this.renderData[this.renderData.length - 1].x = isect.x; - this.renderData[this.renderData.length - 1].y = isect.y; - } - - // adjust the endpoint of the second edge - if (otherCheck) { - rEdge.renderData[0].x = isect.x; - rEdge.renderData[0].y = isect.y; - } else { - rEdge.renderData[rEdge.renderData.length - 1].x = isect.x; - rEdge.renderData[rEdge.renderData.length - 1].y = isect.y; - } - - // update the point renderData - commonVertex.point.addRenderData({ - x: isect.x, - y: isect.y, - rEdge: this - }); -}; - -RenderedEdge.prototype.findExtension = function (vertex) { - var incidentEdges = vertex.incidentEdges(this.graphEdge); - var bundlerId = this.patternIds || this.pathSegmentIds; - for (var e = 0; e < incidentEdges.length; e++) { - var edgeSegments = incidentEdges[e].renderedEdges; - for (var s = 0; s < edgeSegments.length; s++) { - var segment = edgeSegments[s]; - var otherId = segment.patternIds || segment.pathSegmentIds; - if (bundlerId === otherId) { - return segment; - } - } - } -}; - -RenderedEdge.prototype.toString = function () { - return 'RenderedEdge ' + this.id + ' type=' + this.type + ' on ' + this.graphEdge.toString() + ' w/ patterns ' + this.patternIds + ' fwd=' + this.forward; -}; - -},{"../util":38,"component-each":84}],33:[function(require,module,exports){ -'use strict'; - -/** - * Dependencies - */ - -var d3 = require('d3'); -var each = require('component-each'); - -var interpolateLine = require('../util/interpolate-line'); - -/** - * Expose `RenderedSegment` - */ - -module.exports = RenderedSegment; - -var rSegmentId = 0; - -/** - * - */ - -function RenderedSegment(pathSegment) { - this.id = rSegmentId++; - this.renderedEdges = []; - this.pathSegment = pathSegment; - if (pathSegment) this.type = pathSegment.type; - this.focused = true; -} - -RenderedSegment.prototype.getId = function () { - return this.id; -}; - -RenderedSegment.prototype.getType = function () { - return this.type; -}; - -RenderedSegment.prototype.addRenderedEdge = function (rEdge) { - this.renderedEdges.push(rEdge); -}; - -RenderedSegment.prototype.render = function (display) { - this.line = d3.svg.line() // the line translation function - .x(function (data, i) { - return data.x; - }).y(function (data, i) { - return data.y; - }).interpolate(interpolateLine.bind({ - segment: this, - display: display - })); - - this.svgGroup = display.svg.append('g'); - - this.lineSvg = this.svgGroup.append('g').attr('class', 'transitive-sortable').datum({ - owner: this, - sortableType: 'SEGMENT' - }); - - this.labelSvg = this.svgGroup.append('g'); - - this.lineGraph = this.lineSvg.append('path'); - - this.lineGraph.attr('class', 'transitive-line').data([this]); - - this.lineGraphFront = this.lineSvg.append('path'); - - this.lineGraphFront.attr('class', 'transitive-line-front').data([this]); - - if (display.haloLayer) { - this.lineGraphHalo = display.haloLayer.append('path'); - - this.lineGraphHalo.attr('class', 'transitive-line-halo').data([this]); - } -}; - -RenderedSegment.prototype.refresh = function (display, renderData) { - if (renderData) { - this.renderData = renderData; - } else { - this.renderData = []; - each(this.renderedEdges, function (rEdge) { - this.renderData = this.renderData.concat(rEdge.renderData); - }, this); - } - - var lineData = this.line(this.renderData); - this.lineGraph.attr('d', lineData); - this.lineGraphFront.attr('d', lineData); - if (this.lineGraphHalo) this.lineGraphHalo.attr('d', lineData); - display.styler.styleSegment(display, this); -}; - -RenderedSegment.prototype.setFocused = function (focused) { - this.focused = focused; -}; - -RenderedSegment.prototype.isFocused = function () { - return this.focused; -}; - -RenderedSegment.prototype.runFocusTransition = function (display, callback) { - var newColor = display.styler.compute(display.styler.segments.stroke, display, this); - this.lineGraph.transition().style('stroke', newColor).call(callback); -}; - -RenderedSegment.prototype.getZIndex = function () { - return this.zIndex; -}; - -RenderedSegment.prototype.computeLineWidth = function (display, includeEnvelope) { - var styler = display.styler; - if (styler && display) { - // compute the line width - var env = styler.compute(styler.segments.envelope, display, this); - if (env && includeEnvelope) { - return parseFloat(env.substring(0, env.length - 2), 10) - 2; - } else { - var lw = styler.compute(styler.segments['stroke-width'], display, this); - return parseFloat(lw.substring(0, lw.length - 2), 10) - 2; - } - } -}; - -RenderedSegment.prototype.compareTo = function (other) { - // show transit segments in front of other types - if (this.type === 'TRANSIT' && other.type !== 'TRANSIT') return -1; - if (other.type === 'TRANSIT' && this.type !== 'TRANSIT') return 1; - - if (this.type === 'TRANSIT' && other.type === 'TRANSIT') { - // for two transit segments, try sorting transit mode first - if (this.mode && other.mode && this.mode !== other.mode) { - return this.mode > other.mode; - } - - // for two transit segments of the same mode, sort by id (for display consistency) - return this.getId() < other.getId(); - } -}; - -RenderedSegment.prototype.getLabelTextArray = function () { - var textArray = []; - each(this.patterns, function (pattern) { - var shortName = pattern.route.route_short_name; - if (textArray.indexOf(shortName) === -1) textArray.push(shortName); - }); - return textArray; -}; - -RenderedSegment.prototype.getLabelAnchors = function (display, spacing) { - var labelAnchors = []; - this.computeRenderLength(display); - var anchorCount = Math.floor(this.renderLength / spacing); - var pctSpacing = spacing / this.renderLength; - - for (var i = 0; i < anchorCount; i++) { - var t = i % 2 === 0 ? 0.5 + i / 2 * pctSpacing : 0.5 - (i + 1) / 2 * pctSpacing; - var coord = this.coordAlongRenderedPath(t, display); - if (coord) labelAnchors.push(coord); - } - - return labelAnchors; -}; - -RenderedSegment.prototype.coordAlongRenderedPath = function (t, display) { - var loc = t * this.renderLength; - - var cur = 0; - for (var i = 0; i < this.renderedEdges.length; i++) { - var rEdge = this.renderedEdges[i]; - var edgeRenderLen = rEdge.graphEdge.getRenderLength(display); - if (loc <= cur + edgeRenderLen) { - var t2 = (loc - cur) / edgeRenderLen; - return rEdge.graphEdge.coordAlongEdge(t2, rEdge.renderData, display); - } - cur += edgeRenderLen; - } -}; - -RenderedSegment.prototype.computeRenderLength = function (display) { - this.renderLength = 0; - each(this.renderedEdges, function (rEdge) { - this.renderLength += rEdge.graphEdge.getRenderLength(display); - }, this); -}; - -RenderedSegment.prototype.getLegendType = function () { - if (this.type === 'TRANSIT') { - return this.type + '_' + this.mode; - } - return this.type; -}; - -RenderedSegment.prototype.toString = function () { - return 'RenderedSegment ' + this.id + ' on ' + (this.pathSegment ? this.pathSegment.toString() : ' (null segment)'); -}; - -},{"../util/interpolate-line":39,"component-each":84,"d3":88}],34:[function(require,module,exports){ -'use strict'; - -var d3 = require('d3'); -var augment = require('augment'); -var each = require('component-each'); - -var Renderer = require('./index'); -var Point = require('../point/index'); - -var interpolateLine = require('../util/interpolate-line'); - -/** - * A Renderer subclass for drawing a simplified representation of the graph - * itself, i.e. just the edges and vertices. - * - * @param {Object} the main Transitive object - */ - -var WireframeRenderer = augment(Renderer, function (base) { - this.constructor = function (transitive) { - base.constructor.call(this, transitive); - }; - - this.render = function () { - base.render.call(this); - - var graph = this.transitive.network.graph; - - var self = this; - - this.wireframeEdges = []; - each(graph.edges, function (edge) { - var wfEdge = new WireframeEdge(edge); - wfEdge.render(self.transitive.display); - self.wireframeEdges.push(wfEdge); - }); - - this.wireframeVertices = []; - each(graph.vertices, function (vertex) { - var wfVertex = new WireframeVertex(vertex); - wfVertex.render(self.transitive.display); - self.wireframeVertices.push(wfVertex); - }); - - this.transitive.refresh(); - }; - - this.refresh = function (panning) { - base.refresh.call(this, panning); - var self = this; - - each(this.wireframeEdges, function (wfEdge) { - wfEdge.refresh(self.transitive.display); - }); - - each(this.wireframeVertices, function (wfVertex) { - wfVertex.refresh(self.transitive.display); - }); - }; - - /** - * sortElements - */ - - this.sortElements = function () {}; -}); - -/** - * Expose `WireframeRenderer` - */ - -module.exports = WireframeRenderer; - -/** - * WireframeVertex helper class - */ - -var WireframeVertex = augment(Point, function (base) { - this.constructor = function (vertex) { - base.constructor.call(this, { - vertex: vertex - }); - }; - - this.getType = function () { - return 'WIREFRAME_VERTEX'; - }; - - /** - * Draw the vertex - * - * @param {Display} display - */ - - this.render = function (display) { - base.render.call(this, display); - - this.initSvg(display); - this.svgGroup.attr('class', 'transitive-sortable').datum({ - owner: this, - sortableType: 'POINT_WIREFRAME_VERTEX' - }); - - // set up the marker - this.marker = this.markerSvg.append('circle').datum({ - owner: this - }).attr('class', 'transitive-wireframe-vertex-circle'); - }; - - /** - * Refresh the vertex - * - * @param {Display} display - */ - - this.refresh = function (display) { - var x = display.xScale(this.vertex.x); - var y = display.yScale(this.vertex.y); - var translate = 'translate(' + x + ', ' + y + ')'; - this.marker.attr('transform', translate); - display.styler.styleWireframeVertex(display, this); - }; -}); - -/** - * WireframeEdge helper class - */ - -var WireframeEdge = augment(Object, function () { - this.constructor = function (edge) { - this.edge = edge; - }; - - this.render = function (display) { - this.line = d3.svg.line() // the line translation function - .x(function (data, i) { - return data.x; - }).y(function (data, i) { - return data.y; - }).interpolate(interpolateLine.bind({ - segment: this, - display: display - })); - - this.svgGroup = display.svg.append('g'); - - this.lineSvg = this.svgGroup.append('g').attr('class', 'transitive-sortable').datum({ - owner: this, - sortableType: 'WIREFRAME_EDGE' - }); - - this.lineGraph = this.lineSvg.append('path').attr('class', 'transitive-wireframe-edge-line'); - }; - - this.refresh = function (display) { - this.renderData = this.edge.getRenderCoords(0, 0, display, true); - var lineData = this.line(this.renderData); - this.lineGraph.attr('d', lineData); - display.styler.styleWireframeEdge(display, this); - }; -}); - -},{"../point/index":23,"../util/interpolate-line":39,"./index":31,"augment":42,"component-each":84,"d3":88}],35:[function(require,module,exports){ -'use strict'; - -var _assign = require('babel-runtime/core-js/object/assign'); - -var _assign2 = _interopRequireDefault(_assign); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -var Route = require('../core/route'); -var RoutePattern = require('../core/pattern'); -var Util = require('../util'); - -var styles = require('./styles'); - -/** - * Element Types - */ - -var types = ['labels', 'segments', 'segments_front', 'segments_halo', 'segment_labels', 'segment_label_containers', 'stops_merged', 'stops_pattern', 'places', 'places_icon', 'multipoints_merged', 'multipoints_pattern', 'wireframe_vertices', 'wireframe_edges']; - -/** - * SVG attributes - */ - -var svgAttributes = ['height', 'target', 'title', 'width', 'y1', 'y2', 'x1', 'x2', 'cx', 'cy', 'dx', 'dy', 'rx', 'ry', 'd', 'r', 'y', 'x', 'transform']; - -/** - * Expose `Styler` - */ - -module.exports = Styler; - -/** - * Styler object - */ - -function Styler(styles) { - if (!(this instanceof Styler)) return new Styler(styles); - - // reset styles - this.reset(); - - // load styles - if (styles) this.load(styles); -} - -/** - * Clear all current styles - */ - -Styler.prototype.clear = function () { - for (var i in types) { - this[types[i]] = {}; - } -}; - -/** - * Reset to the predefined styles - */ - -Styler.prototype.reset = function () { - for (var i in types) { - var type = types[i]; - this[type] = (0, _assign2.default)({}, styles[type] || {}); - for (var key in this[type]) { - if (!Array.isArray(this[type][key])) this[type][key] = [this[type][key]]; - } - } -}; - -/** - * Load rules - * - * @param {Object} a set of style rules - */ - -Styler.prototype.load = function (styles) { - for (var i in types) { - var type = types[i]; - if (styles[type]) { - for (var key in styles[type]) { - this[type][key] = (this[type][key] || []).concat(styles[type][key]); - } - } - } -}; - -/** - * Style a Segment using the rules defined in styles.js or the Transitive options - * - * @param {Display} Transitive Display object - * @param {RenderedSegment} Transitive RenderedSegment object - */ - -Styler.prototype.styleSegment = function (display, segment) { - if (segment.lineGraphHalo) { - this.applyAttrAndStyle(display, segment.lineGraphHalo, this.segments_halo); - } - - this.applyAttrAndStyle(display, segment.lineGraph, this.segments); - - this.applyAttrAndStyle(display, segment.lineGraphFront, this.segments_front); -}; - -/** - * Style a WireframeEdge using the rules defined in styles.js or the Transitive options - * - * @param {Display} Transitive Display object - * @param {WireframeEdge} Transitive WireframeEdge object - */ - -Styler.prototype.styleWireframeEdge = function (display, wfEdge) { - this.applyAttrAndStyle(display, wfEdge.svgGroup.selectAll('.transitive-wireframe-edge-line'), this.wireframe_edges); -}; - -/** - * Style a Point using the rules defined in styles.js or the Transitive options - * - * @param {Display} Transitive Display object - * @param {Point} Transitive Point object - */ - -Styler.prototype.stylePoint = function (display, point) { - if (point.getType() === 'STOP') this.styleStop(display, point); - if (point.getType() === 'PLACE') this.stylePlace(display, point); - if (point.getType() === 'MULTI') this.styleMultiPoint(display, point); - if (point.getType() === 'WIREFRAME_VERTEX') this.styleWireframeVertex(display, point); -}; - -/** - * Style a Stop using the rules defined in styles.js or the Transitive options - * - * @param {Display} Transitive Display object - * @param {Stop} Transitive Stop object - */ - -Styler.prototype.styleStop = function (display, stop) { - this.applyAttrAndStyle(display, stop.patternMarkers, this.stops_pattern); - - this.applyAttrAndStyle(display, stop.mergedMarker, this.stops_merged); - - this.applyAttrAndStyle(display, stop.svgGroup.selectAll('.transitive-stop-label'), this.labels); -}; - -/** - * Style a Place using the rules defined in styles.js or the Transitive options - * - * @param {Display} Transitive Display object - * @param {Place} Transitive Place object - */ - -Styler.prototype.stylePlace = function (display, place) { - this.applyAttrAndStyle(display, place.svgGroup.selectAll('.transitive-place-circle'), this.places); - - this.applyAttrAndStyle(display, place.svgGroup.selectAll('.transitive-place-icon'), this.places_icon); - - this.applyAttrAndStyle(display, place.svgGroup.selectAll('.transitive-place-label'), this.labels); -}; - -/** - * Style a MultiPoint using the rules defined in styles.js or the Transitive options - * - * @param {Display} Transitive Display object - * @param {MultiPoint} Transitive MultiPoint object - */ - -Styler.prototype.styleMultiPoint = function (display, multipoint) { - this.applyAttrAndStyle(display, multipoint.svgGroup.selectAll('.transitive-multipoint-marker-pattern'), this.multipoints_pattern); - - this.applyAttrAndStyle(display, multipoint.svgGroup.selectAll('.transitive-multipoint-marker-merged'), this.multipoints_merged); - - this.applyAttrAndStyle(display, multipoint.svgGroup.selectAll('.transitive-multi-label'), this.labels); -}; - -/** - * Style a WireframeVertex using the rules defined in styles.js or the Transitive options - * - * @param {Display} Transitive Display object - * @param {WireframeVertex} Transitive WireframeVertex object - */ - -Styler.prototype.styleWireframeVertex = function (display, wfVertex) { - this.applyAttrAndStyle(display, wfVertex.svgGroup.selectAll('.transitive-wireframe-vertex-circle'), this.wireframe_vertices); -}; - -/** - * Style a Point label using the rules defined in styles.js or the Transitive options - * - * @param {Display} Transitive Display object - * @param {Point} Transitive Point object - */ - -Styler.prototype.stylePointLabel = function (display, point) { - var pointType = point.getType().toLowerCase(); - - this.applyAttrAndStyle(display, point.svgGroup.selectAll('.transitive-' + pointType + '-label'), this.labels); -}; - -/** - * Style a Segment label using the rules defined in styles.js or the Transitive options - * - * @param {Display} Transitive Display object - * @param {SegmentLabel} Transitive SegmentLabel object - */ - -Styler.prototype.styleSegmentLabel = function (display, label) { - this.applyAttrAndStyle(display, label.svgGroup.selectAll('.transitive-segment-label-container'), this.segment_label_containers); - this.applyAttrAndStyle(display, label.svgGroup.selectAll('.transitive-segment-label'), this.segment_labels); -}; - -/** - * Check if it's an attribute or a style and apply accordingly - * - * @param {Display} the Display object - * @param {Object} a D3 list of elements - * @param {Object} the list of attributes - */ - -Styler.prototype.applyAttrAndStyle = function (display, elements, attributes) { - for (var name in attributes) { - var rules = attributes[name]; - var fn = svgAttributes.indexOf(name) === -1 ? 'style' : 'attr'; - - this.applyRules(display, elements, name, rules, fn); - } -}; - -/** - * Apply style/attribute rules to a list of elements - * - * @param {Display} display object - * @param {Object} elements - * @param {String} rule name - * @param {Array} rules - * @param {String} style/attr - */ - -Styler.prototype.applyRules = function (display, elements, name, rules, fn) { - var self = this; - elements[fn](name, function (data, index) { - return self.compute(rules, display, data, index); - }); -}; - -/** - * Compute a style rule based on the current display and data - * - * @param {Array} array of rules - * @param {Object} the Display object - * @param {Object} data associated with this object - * @param {Number} index of this object - */ - -Styler.prototype.compute = function (rules, display, data, index) { - var computed; - var self = this; - for (var i in rules) { - var rule = rules[i]; - var val = isFunction(rule) ? rule.call(self, display, data, index, styles.utils) : rule; - if (val !== undefined && val !== null) computed = val; - } - return computed; -}; - -/** - * Return the collection of default segment styles for a mode. - * - * @param {String} an OTP mode string - */ - -Styler.prototype.getModeStyles = function (mode, display) { - var modeStyles = {}; - - // simulate a segment w/ the specified style - var segment = { - focused: true, - isFocused: function isFocused() { - return true; - } - }; - - if (mode === 'WALK' || mode === 'BICYCLE' || mode === 'BICYCLE_RENT' || mode === 'CAR') { - segment.type = mode; - } else { - // assume a transit mode - segment.type = 'TRANSIT'; - segment.mode = Util.otpModeToGtfsType(mode); - var route = new Route({ - route_type: segment.mode, - agency_id: '', - route_id: '', - route_short_name: '', - route_long_name: '' - }); - var pattern = new RoutePattern({}); - route.addPattern(pattern); - segment.patterns = [pattern]; - } - - for (var attrName in this.segments) { - var rules = this.segments[attrName]; - for (var i in rules) { - var rule = rules[i]; - var val = isFunction(rule) ? rule.call(this, display, segment, 0, styles.utils) : rule; - if (val !== undefined && val !== null) { - modeStyles[attrName] = val; - } - } - } - - return modeStyles; -}; - -/** - * Is function? - */ - -function isFunction(val) { - return Object.prototype.toString.call(val) === '[object Function]'; -} - -},{"../core/pattern":6,"../core/route":8,"../util":38,"./styles":36,"babel-runtime/core-js/object/assign":43}],36:[function(require,module,exports){ -'use strict'; - -var _assign = require('babel-runtime/core-js/object/assign'); - -var _assign2 = _interopRequireDefault(_assign); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -var d3 = require('d3'); - -/** - * Scales for utility functions to use - */ - -var zoomScale = d3.scale.linear().domain([0.25, 1, 4]); -var strokeScale = d3.scale.linear().domain([0.25, 1, 4]).range([5, 12, 19]); -var fontScale = d3.scale.linear().domain([0.25, 1, 4]).range([10, 14, 18]); - -/** - * Scales for utility functions to use - */ - -var notFocusedColor = '#e0e0e0'; - -/** - * Expose `utils` for the style functions to use - */ - -exports.utils = { - pixels: function pixels(zoom, min, normal, max) { - return zoomScale.range([min, normal, max])(zoom); - }, - strokeWidth: function strokeWidth(display) { - return strokeScale(display.zoom.scale()); - }, - fontSize: function fontSize(display, data) { - return Math.floor(fontScale(display.zoom.scale())); - }, - defineSegmentCircleMarker: function defineSegmentCircleMarker(display, segment, radius, fillColor) { - var markerId = 'circleMarker-' + segment.getId(); - display.svg.append('defs').append('svg:marker').attr('id', markerId).attr('refX', radius).attr('refY', radius).attr('markerWidth', radius * 2).attr('markerHeight', radius * 2).attr('markerUnits', 'userSpaceOnUse').append('svg:circle').attr('cx', radius).attr('cy', radius).attr('r', radius).attr('fill', segment.focused ? fillColor : notFocusedColor); - - return 'url(#' + markerId + ')'; - } -}; - -/** - * Default Wireframe Edge/Vertex Rules - */ - -exports.wireframe_vertices = { - cx: 0, - cy: 0, - r: 3, - fill: '#000' -}; - -exports.wireframe_edges = { - stroke: '#444', - 'stroke-width': 2, - 'stroke-dasharray': '3px 2px', - fill: 'none' -}; - -/** - * Default Merged Stops Rules - */ - -var stopsMerged = exports.stops_merged = { - fill: function fill(display, data, index, utils) { - return '#fff'; - }, - r: function r(display, data, index, utils) { - return utils.pixels(display.zoom.scale(), 8, 12, 16); - }, - stroke: function stroke(display, data, index, utils) { - var point = data.owner; - if (!point.isFocused()) return notFocusedColor; - return '#000'; - }, - 'stroke-width': function strokeWidth(display, data, index, utils) { - return 2; - }, - - /** - * Transitive-specific attribute specifying the shape of the main stop marker. - * Can be 'roundedrect', 'rectangle' or 'circle' - */ - - 'marker-type': ['circle', function (display, data, index, utils) { - var point = data.owner; - if ((point.containsBoardPoint() || point.containsAlightPoint()) && !point.containsTransferPoint()) return 'circle'; - }], - - /** - * Transitive-specific attribute specifying any additional padding, in pixels, - * to apply to main stop marker. A value of zero (default) results in a that - * marker is flush to the edges of the pattern segment(s) the point is set against. - * A value greater than zero creates a marker that is larger than the width of - * the segments(s). - */ - - 'marker-padding': 3, - - visibility: function visibility(display, data) { - if (!data.owner.containsSegmentEndPoint()) return 'hidden'; - } -}; - -/** - * Stops Along a Pattern - */ - -var stopsPattern = exports.stops_pattern = { - cx: 0, - cy: 0, - r: [4, function (display, data, index, utils) { - return utils.pixels(display.zoom.scale(), 1, 2, 4); - }, function (display, data, index, utils) { - var point = data.owner; - var busOnly = true; - point.getPatterns().forEach(function (pattern) { - if (pattern.route && pattern.route.route_type !== 3) busOnly = false; - }); - if (busOnly && !point.containsSegmentEndPoint()) { - return 0.5 * utils.pixels(display.zoom.scale(), 2, 4, 6.5); - } - }], - stroke: 'none', - visibility: function visibility(display, data) { - if (display.zoom.scale() < 1.5) return 'hidden'; - if (data.owner.containsSegmentEndPoint()) return 'hidden'; - } -}; - -/** - * Default place rules - */ - -exports.places = { - cx: 0, - cy: 0, - r: 14, - stroke: '0px', - fill: '#fff' -}; - -/** - * Default MultiPoint rules -- based on Stop rules - */ - -var multipointsMerged = exports.multipoints_merged = (0, _assign2.default)({}, stopsMerged); - -multipointsMerged.visibility = true; - -/** - * Default Multipoint Stops along a pattern - */ - -exports.multipoints_pattern = (0, _assign2.default)({}, stopsPattern); - -/** - * Default label rules - */ - -exports.labels = { - 'font-size': function fontSize(display, data, index, utils) { - return utils.fontSize(display, data) + 'px'; - }, - 'font-weight': function fontWeight(display, data, index, utils) { - var point = data.owner.parent; - if (point.containsBoardPoint() || point.containsAlightPoint()) return 'bold'; - }, - - /** - * 'orientations' is a transitive-specific attribute used to specify allowable - * label placement orientations expressed as one of eight compass directions - * relative to the point being labeled: - * - * 'N' - * 'NW' | 'NE' - * \ | / - * 'W' -- O -- 'E' - * / | \ - * 'SW' | 'SE' - * 'S - * - * Labels oriented 'E' or 'W' are rendered horizontally, 'N' and 'S' vertically, - * and all others at a 45-degree angle. - * - * Returns an array of allowed orientation codes in the order that they will be - * tried by the labeler. - */ - - orientations: [['E', 'W']] -}; - -/** - * All path segments - * TODO: update old route-pattern-specific code below - */ - -exports.segments = { - stroke: ['#008', function (display, data) { - var segment = data; - if (!segment.focused) return notFocusedColor; - if (segment.type === 'TRANSIT') { - if (segment.patterns) { - if (segment.patterns[0].route.route_short_name.toLowerCase().substring(0, 2) === 'dc') return '#f00'; - return segment.patterns[0].route.getColor(); - } - } else if (segment.type === 'CAR') { - return '#888'; - } - }], - 'stroke-dasharray': [false, function (display, data) { - var segment = data; - if (segment.frequency && segment.frequency.average < 12) { - if (segment.frequency.average > 6) return '12px, 12px'; - return '12px, 2px'; - } - }], - 'stroke-width': ['12px', function (display, data, index, utils) { - var segment = data; - - if (segment.mode === 3) { - return utils.pixels(display.zoom.scale(), 2, 4, 8) + 'px'; - } - return utils.pixels(display.zoom.scale(), 4, 8, 12) + 'px'; - }], - envelope: [function (display, data, index, utils) { - var segment = data; - if (segment.type !== 'TRANSIT') { - return '8px'; - } - if (segment.mode === 3) { - return utils.pixels(display.zoom.scale(), 4, 6, 10) + 'px'; - } - return utils.pixels(display.zoom.scale(), 6, 10, 14) + 'px'; - }] -}; - -/** - * Segments Front - */ - -exports.segments_front = { - stroke: '#008', - 'stroke-width': function strokeWidth(display, data, index, utils) { - return utils.pixels(display.zoom.scale(), 3, 6, 10) / 2 + 'px'; - }, - fill: 'none', - display: ['none', function (display, data, index, utils) { - if (data.pattern && data.pattern.route && data.pattern.route.route_type === 3 && data.pattern.route.route_short_name.toLowerCase().substring(0, 2) === 'dc') { - return 'inline'; - } - }] -}; - -/** - * Segments Halo - */ - -exports.segments_halo = { - stroke: '#fff', - 'stroke-width': function strokeWidth(display, data, index, utils) { - return data.computeLineWidth(display) + 8; - }, - 'stroke-linecap': 'round', - fill: 'none' -}; - -/** - * Label Containers - */ - -exports.segment_label_containers = { - fill: function fill(display, data) { - if (!data.isFocused()) return notFocusedColor; - }, - 'stroke-width': function strokeWidth(display, data) { - if (data.parent.pattern && data.parent.pattern.route.route_short_name.toLowerCase().substring(0, 2) === 'dc') return 1; - return 0; - }, - rx: 3, - ry: 3 -}; - -},{"babel-runtime/core-js/object/assign":43,"d3":88}],37:[function(require,module,exports){ -'use strict'; - -var d3 = require('d3'); -var Emitter = require('component-emitter'); - -var Network = require('./core/network'); - -var Display = require('./display'); - -var DefaultRenderer = require('./renderer/default-renderer'); -var WireframeRenderer = require('./renderer/wireframe-renderer'); - -var Styler = require('./styler'); -var Labeler = require('./labeler'); - -var SphericalMercator = require('./util/spherical-mercator'); -var sm = new SphericalMercator(); - -/* - * Expose `Transitive` - */ - -module.exports = Transitive; - -/** - * Create a new instance of `Transitive` - * - * @param {Object} options object - * - data {Object} data to render - * - styles {Object} styles to apply - * - el {Element} the DOM element to render the main display to - * - legendEl {Element} the DOM element to render the legend to - * - drawGrid {Boolean} whether to draw a background grid (defaults to false) - * - gridCellSize {Number} resolution of the grid in SphericalMercator meters - * - draggableTypes {Array} a list of network element types to enable dragging for - * - initialBounds {Array} initial lon/lat bounds for the display expressed as [[west, south], [east, north]] - * - displayMargins {Object} padding to apply to the initial rendered network within the display. Expressed in pixels for top/bottom/left/right - * - mapboxId {String} an Mapbox tileset id for rendering background tiles (Deprecated -- use Leaflet with Leaflet.TransitiveLayer) - * - zoomEnabled {Boolean} whether to enable the display's built-in zoom/pan functionality (defaults to true) - * - autoResize {Boolean} whether the display should listen for window resize events and update automatically (defaults to true) - * - groupEdges {Boolean} whether to consider edges with the same origin/destination equivalent for rendering, even if intermediate stop sequence is different (defaults to true) - */ - -function Transitive(options) { - console.log('**** trn'); - if (!(this instanceof Transitive)) return new Transitive(options); - - this.options = options; - if (this.options.zoomEnabled === undefined) this.options.zoomEnabled = true; - if (this.options.autoResize === undefined) this.options.autoResize = true; - if (this.options.groupEdges === undefined) this.options.groupEdges = true; - - if (options.el) this.setElement(options.el); - - this.data = options.data; - - this.setRenderer(this.options.initialRenderer || 'default'); - - this.labeler = new Labeler(this); - this.styler = new Styler(options.styles); -} - -/** - * Mixin `Emitter` - */ - -Emitter(Transitive.prototype); - -/** - * Clear the Network data and redraw the (empty) map - */ - -Transitive.prototype.clearData = function () { - this.network = this.data = null; - this.labeler.clear(); - this.emit('clear data', this); -}; - -/** - * Update the Network data and redraw the map - */ - -Transitive.prototype.updateData = function (data) { - this.network = null; - this.data = data; - if (this.display) this.display.scaleSet = false; - this.labeler.clear(); - this.emit('update data', this); -}; - -/** - * Return the collection of default segment styles for a mode. - * - * @param {String} an OTP mode string - */ - -Transitive.prototype.getModeStyles = function (mode) { - return this.styler.getModeStyles(mode, this.display || new Display(this)); -}; - -/** Display/Render Methods **/ - -/** - * Set the DOM element that serves as the main map canvas - */ - -Transitive.prototype.setElement = function (el, legendEl) { - if (this.el) d3.select(this.el).selectAll('*').remove(); - - this.el = el; - this.display = new Display(this); - - // Emit click events - var self = this; - this.display.svg.on('click', function () { - var x = d3.event.x; - var y = d3.event.y; - var geographic = sm.inverse([x, y]); - self.emit('click', { - x: x, - y: y, - lng: geographic[0], - lat: geographic[1] - }); - }); - - this.emit('set element', this, this.el); - return this; -}; - -/** - * Set the DOM element that serves as the main map canvas - */ - -Transitive.prototype.setRenderer = function (type) { - switch (type) { - case 'wireframe': - this.renderer = new WireframeRenderer(this); - break; - case 'default': - this.renderer = new DefaultRenderer(this); - break; - } -}; - -/** - * Render - */ - -Transitive.prototype.render = function () { - if (!this.network) { - this.network = new Network(this, this.data); - } - - if (!this.display.scaleSet) { - this.display.setScale(this.network.graph.bounds(), this.options); - } - - this.renderer.render(); - - this.emit('render', this); -}; - -/** - * Render to - * - * @param {Element} el - */ - -Transitive.prototype.renderTo = function (el) { - this.setElement(el); - this.render(); - - this.emit('render to', this); - return this; -}; - -/** - * Refresh - */ - -Transitive.prototype.refresh = function (panning) { - if (!this.network) { - this.render(); - } - - this.renderer.refresh(); -}; - -/** - * focusJourney - */ - -Transitive.prototype.focusJourney = function (journeyId) { - var path = journeyId ? this.network.journeys[journeyId].path : null; - this.renderer.focusPath(path); -}; - -/** - * Sets the Display bounds - * @param {Array} lon/lat bounds expressed as [[west, south], [east, north]] - */ - -Transitive.prototype.setDisplayBounds = function (llBounds) { - this.display.updateDomains([sm.forward(llBounds[0]), sm.forward(llBounds[1])]); - this.display.zoomChanged(); -}; - -/** - * Gets the Network bounds - * @returns {Array} lon/lat bounds expressed as [[west, south], [east, north]] - */ - -Transitive.prototype.getNetworkBounds = function () { - if (!this.network || !this.network.graph) return null; - var graphBounds = this.network.graph.bounds(); - var ll1 = sm.inverse(graphBounds[0]); - var ll2 = sm.inverse(graphBounds[1]); - return [[Math.min(ll1[0], ll2[0]), Math.min(ll1[1], ll2[1])], [Math.max(ll1[0], ll2[0]), Math.max(ll1[1], ll2[1])]]; -}; - -/** - * resize - */ - -Transitive.prototype.resize = function (width, height) { - if (!this.display) return; - d3.select(this.display.el).style('width', width + 'px').style('height', height + 'px'); - this.display.resized(); -}; - -},{"./core/network":3,"./display":11,"./labeler":18,"./renderer/default-renderer":30,"./renderer/wireframe-renderer":34,"./styler":35,"./util/spherical-mercator":41,"component-emitter":85,"d3":88}],38:[function(require,module,exports){ -'use strict'; - -/** - * General Transitive utilities library - */ - -var d3 = require('d3'); - -var tolerance = 0.000001; - -module.exports.fuzzyEquals = function (a, b, tol) { - tol = tol || tolerance; - return Math.abs(a - b) < tol; -}; - -module.exports.distance = function (x1, y1, x2, y2) { - return Math.sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1)); -}; - -module.exports.getRadiusFromAngleChord = function (angleR, chordLen) { - return chordLen / 2 / Math.sin(angleR / 2); -}; - -/* - * CCW utility function. Accepts 3 coord pairs; result is positive if points - * have counterclockwise orientation, negative if clockwise, 0 if collinear. - */ - -module.exports.ccw = function (ax, ay, bx, by, cx, cy) { - var raw = module.exports.ccwRaw(ax, ay, bx, by, cx, cy); - return raw === 0 ? 0 : raw / Math.abs(raw); -}; - -module.exports.ccwRaw = function (ax, ay, bx, by, cx, cy) { - return (bx - ax) * (cy - ay) - (cx - ax) * (by - ay); -}; - -/* - * Compute angle formed by three points in cartesian plane using law of cosines - */ - -module.exports.angleFromThreePoints = function (ax, ay, bx, by, cx, cy) { - var c = module.exports.distance(ax, ay, bx, by); - var a = module.exports.distance(bx, by, cx, cy); - var b = module.exports.distance(ax, ay, cx, cy); - return Math.acos((a * a + c * c - b * b) / (2 * a * c)); -}; - -module.exports.pointAlongArc = function (x1, y1, x2, y2, r, theta, ccw, t) { - ccw = Math.abs(ccw) / ccw; // convert to 1 or -1 - - var rot = Math.PI / 2 - Math.abs(theta) / 2; - var vectToCenter = module.exports.normalizeVector(module.exports.rotateVector({ - x: x2 - x1, - y: y2 - y1 - }, ccw * rot)); - - // calculate the center of the arc circle - var cx = x1 + r * vectToCenter.x; - var cy = y1 + r * vectToCenter.y; - - var vectFromCenter = module.exports.negateVector(vectToCenter); - rot = Math.abs(theta) * t * ccw; - vectFromCenter = module.exports.normalizeVector(module.exports.rotateVector(vectFromCenter, rot)); - - return { - x: cx + r * vectFromCenter.x, - y: cy + r * vectFromCenter.y - }; -}; - -module.exports.getVectorAngle = function (x, y) { - var t = Math.atan(y / x); - - if (x < 0 && t <= 0) t += Math.PI;else if (x < 0 && t >= 0) t -= Math.PI; - - return t; -}; - -module.exports.rayIntersection = function (ax, ay, avx, avy, bx, by, bvx, bvy) { - var u = ((by - ay) * bvx - (bx - ax) * bvy) / (bvx * avy - bvy * avx); - var v = ((by - ay) * avx - (bx - ax) * avy) / (bvx * avy - bvy * avx); - - return { - u: u, - v: v, - intersect: u > -tolerance && v > -tolerance - }; -}; - -module.exports.lineIntersection = function (x1, y1, x2, y2, x3, y3, x4, y4) { - var d = (x1 - x2) * (y3 - y4) - (y1 - y2) * (x3 - x4); - - if (d === 0) { - // lines are parallel - return { - intersect: false - }; - } - - return { - x: ((x1 * y2 - y1 * x2) * (x3 - x4) - (x1 - x2) * (x3 * y4 - y3 * x4)) / d, - y: ((x1 * y2 - y1 * x2) * (y3 - y4) - (y1 - y2) * (x3 * y4 - y3 * x4)) / d, - intersect: true - }; -}; - -/** - * Parse a pixel-based style descriptor, returning an number. - * - * @param {String/Number} - */ - -module.exports.parsePixelStyle = function (descriptor) { - if (typeof descriptor === 'number') return descriptor; - return parseFloat(descriptor.substring(0, descriptor.length - 2), 10); -}; - -module.exports.isOutwardVector = function (vector) { - if (!module.exports.fuzzyEquals(vector.x, 0)) return vector.x > 0; - return vector.y > 0; -}; - -module.exports.getTextBBox = function (text, attrs) { - var container = d3.select('body').append('svg'); - container.append('text').attr({ - x: -1000, - y: -1000 - }).attr(attrs).text(text); - var bbox = container.node().getBBox(); - container.remove(); - - return { - height: bbox.height, - width: bbox.width - }; -}; - -/** - * Convert lat/lon coords to spherical mercator meter x/y coords - */ - -module.exports.latLonToSphericalMercator = function (lat, lon) { - var r = 6378137; - var x = r * lon * Math.PI / 180; - var y = r * Math.log(Math.tan(Math.PI / 4 + lat * Math.PI / 360)); - return [x, y]; -}; - -/** - * vector utilities - */ - -module.exports.normalizeVector = function (v) { - var d = Math.sqrt(v.x * v.x + v.y * v.y); - return { - x: v.x / d, - y: v.y / d - }; -}; - -module.exports.rotateVector = function (v, theta) { - return { - x: v.x * Math.cos(theta) - v.y * Math.sin(theta), - y: v.x * Math.sin(theta) + v.y * Math.cos(theta) - }; -}; - -module.exports.negateVector = function (v) { - return { - x: -v.x, - y: -v.y - }; -}; - -module.exports.addVectors = function (v1, v2) { - return { - x: v1.x + v2.x, - y: v1.y + v2.y - }; -}; - -/** - * GTFS utilities - */ - -module.exports.otpModeToGtfsType = function (otpMode) { - switch (otpMode) { - case 'TRAM': - return 0; - case 'SUBWAY': - return 1; - case 'RAIL': - return 2; - case 'BUS': - return 3; - case 'FERRY': - return 4; - case 'CABLE_CAR': - return 5; - case 'GONDOLA': - return 6; - case 'FUNICULAR': - return 7; - } -}; - -},{"d3":88}],39:[function(require,module,exports){ -'use strict'; - -/** - * Line interpolation utility function - * - * @param {Array} points - */ - -var Util = require('./index'); - -module.exports = function (points) { - var newPoints, i, r; - - // determine if we need to resample the path (i.e. place new points at a regular - // interval for marker-based styling) based on styler settings - var resampleSpacing = this.display.styler.compute(this.display.styler.segments['marker-spacing'], this.display, this.segment); - - // handle the case of a simple straight line - if (points.length === 2) { - if (resampleSpacing) { - newPoints = [points[0]]; - newPoints = newPoints.concat(resampleLine(points[0], points[1], resampleSpacing)); - return newPoints.join(' '); - } - return points.join(' '); - } - - // otherwise, assume a curved segment - - if (resampleSpacing) { - newPoints = [points[0]]; - for (i = 1; i < points.length; i++) { - if (this.segment.renderData[i].arc) { - // debug(this.renderData[i]); - // var r = this.renderData[i].radius; - // var sweep = (this.renderData[i].arc > 0) ? 0 : 1; - // str += 'A ' + r + ',' + r + ' 0 0 ' + sweep + ' ' + points[i]; - r = this.segment.renderData[i].radius; - var theta = this.segment.renderData[i].arc * Math.PI / 180; - newPoints = newPoints.concat(resampleArc(points[i - 1], points[i], r, theta, -this.segment.renderData[i].arc, resampleSpacing)); - } else { - newPoints = newPoints.concat(resampleLine(points[i - 1], points[i], resampleSpacing)); - } - } - return newPoints.join(' '); - } else { - var str = points[0]; - for (i = 1; i < points.length; i++) { - if (this.segment.renderData[i].arc) { - r = this.segment.renderData[i].radius; - var sweep = this.segment.renderData[i].arc > 0 ? 0 : 1; - str += 'A ' + r + ',' + r + ' 0 0 ' + sweep + ' ' + points[i]; - } else { - str += 'L' + points[i]; - } - } - return str; - } -}; - -function resampleLine(startPt, endPt, spacing) { - var dx = endPt[0] - startPt[0]; - var dy = endPt[1] - startPt[1]; - var len = Math.sqrt(dx * dx + dy * dy); - - var sampledPts = [startPt]; - for (var l = spacing; l < len; l += spacing) { - var t = l / len; - sampledPts.push([startPt[0] + t * dx, startPt[1] + t * dy]); - } - - sampledPts.push(endPt); - - return sampledPts; -} - -function resampleArc(startPt, endPt, r, theta, ccw, spacing) { - var len = r * Math.abs(theta); - - var sampledPts = []; - for (var l = spacing; l < len; l += spacing) { - var t = l / len; - var pt = Util.pointAlongArc(startPt[0], startPt[1], endPt[0], endPt[1], r, Math.abs(theta), ccw, t); - sampledPts.push([pt.x, pt.y]); - } - - return sampledPts; -} - -},{"./index":38}],40:[function(require,module,exports){ -"use strict"; - -module.exports.decode = function (polyline) { - var currentPosition = 0; - - var currentLat = 0; - var currentLng = 0; - - var dataLength = polyline.length; - - var polylineLatLngs = []; - - while (currentPosition < dataLength) { - var shift = 0; - var result = 0; - - var byte; - - do { - byte = polyline.charCodeAt(currentPosition++) - 63; - result |= (byte & 0x1f) << shift; - shift += 5; - } while (byte >= 0x20); - - var deltaLat = result & 1 ? ~(result >> 1) : result >> 1; - currentLat += deltaLat; - - shift = 0; - result = 0; - - do { - byte = polyline.charCodeAt(currentPosition++) - 63; - result |= (byte & 0x1f) << shift; - shift += 5; - } while (byte >= 0x20); - - var deltLng = result & 1 ? ~(result >> 1) : result >> 1; - - currentLng += deltLng; - - polylineLatLngs.push([currentLat * 0.00001, currentLng * 0.00001]); - } - return polylineLatLngs; -}; - -},{}],41:[function(require,module,exports){ -'use strict'; - -var SphericalMercator = function () { - // Closures including constants and other precalculated values. - var cache = {}; - // var EPSLN = 1.0e-10 - var D2R = Math.PI / 180; - var R2D = 180 / Math.PI; - // 900913 properties. - var A = 6378137; - var MAXEXTENT = 20037508.34; - - // SphericalMercator constructor: precaches calculations - // for fast tile lookups. - function SphericalMercator(options) { - options = options || {}; - this.size = options.size || 256; - if (!cache[this.size]) { - var size = this.size; - var c = cache[this.size] = {}; - c.Bc = []; - c.Cc = []; - c.zc = []; - c.Ac = []; - for (var d = 0; d < 30; d++) { - c.Bc.push(size / 360); - c.Cc.push(size / (2 * Math.PI)); - c.zc.push(size / 2); - c.Ac.push(size); - size *= 2; - } - } - this.Bc = cache[this.size].Bc; - this.Cc = cache[this.size].Cc; - this.zc = cache[this.size].zc; - this.Ac = cache[this.size].Ac; - } - - // Convert lon lat to screen pixel value - // - // - `ll` {Array} `[lon, lat]` array of geographic coordinates. - // - `zoom` {Number} zoom level. - SphericalMercator.prototype.px = function (ll, zoom) { - var d = this.zc[zoom]; - var f = Math.min(Math.max(Math.sin(D2R * ll[1]), -0.9999), 0.9999); - var x = Math.round(d + ll[0] * this.Bc[zoom]); - var y = Math.round(d + 0.5 * Math.log((1 + f) / (1 - f)) * -this.Cc[zoom]); - if (x > this.Ac[zoom]) x = this.Ac[zoom]; - if (y > this.Ac[zoom]) y = this.Ac[zoom]; - // (x < 0) && (x = 0); - // (y < 0) && (y = 0); - return [x, y]; - }; - - // Convert screen pixel value to lon lat - // - // - `px` {Array} `[x, y]` array of geographic coordinates. - // - `zoom` {Number} zoom level. - SphericalMercator.prototype.ll = function (px, zoom) { - var g = (px[1] - this.zc[zoom]) / -this.Cc[zoom]; - var lon = (px[0] - this.zc[zoom]) / this.Bc[zoom]; - var lat = R2D * (2 * Math.atan(Math.exp(g)) - 0.5 * Math.PI); - return [lon, lat]; - }; - - // Convert tile xyz value to bbox of the form `[w, s, e, n]` - // - // - `x` {Number} x (longitude) number. - // - `y` {Number} y (latitude) number. - // - `zoom` {Number} zoom. - // - `tms_style` {Boolean} whether to compute using tms-style. - // - `srs` {String} projection for resulting bbox (WGS84|900913). - // - `return` {Array} bbox array of values in form `[w, s, e, n]`. - SphericalMercator.prototype.bbox = function (x, y, zoom, tmsStyle, srs) { - // Convert xyz into bbox with srs WGS84 - if (tmsStyle) { - y = Math.pow(2, zoom) - 1 - y; - } - // Use +y to make sure it's a number to avoid inadvertent concatenation. - var ll = [x * this.size, (+y + 1) * this.size]; // lower left - // Use +x to make sure it's a number to avoid inadvertent concatenation. - var ur = [(+x + 1) * this.size, y * this.size]; // upper right - var bbox = this.ll(ll, zoom).concat(this.ll(ur, zoom)); - - // If web mercator requested reproject to 900913. - if (srs === '900913') { - return this.convert(bbox, '900913'); - } else { - return bbox; - } - }; - - // Convert bbox to xyx bounds - // - // - `bbox` {Number} bbox in the form `[w, s, e, n]`. - // - `zoom` {Number} zoom. - // - `tms_style` {Boolean} whether to compute using tms-style. - // - `srs` {String} projection of input bbox (WGS84|900913). - // - `@return` {Object} XYZ bounds containing minX, maxX, minY, maxY properties. - SphericalMercator.prototype.xyz = function (bbox, zoom, tmsStyle, srs) { - // If web mercator provided reproject to WGS84. - if (srs === '900913') { - bbox = this.convert(bbox, 'WGS84'); - } - - var ll = [bbox[0], bbox[1]]; // lower left - var ur = [bbox[2], bbox[3]]; // upper right - var pxll = this.px(ll, zoom); - var pxur = this.px(ur, zoom); - // Y = 0 for XYZ is the top hence minY uses px_ur[1]. - var bounds = { - minX: Math.floor(pxll[0] / this.size), - minY: Math.floor(pxur[1] / this.size), - maxX: Math.floor((pxur[0] - 1) / this.size), - maxY: Math.floor((pxll[1] - 1) / this.size) - }; - if (tmsStyle) { - var tms = { - minY: Math.pow(2, zoom) - 1 - bounds.maxY, - maxY: Math.pow(2, zoom) - 1 - bounds.minY - }; - bounds.minY = tms.minY; - bounds.maxY = tms.maxY; - } - return bounds; - }; - - // Convert projection of given bbox. - // - // - `bbox` {Number} bbox in the form `[w, s, e, n]`. - // - `to` {String} projection of output bbox (WGS84|900913). Input bbox - // assumed to be the "other" projection. - // - `@return` {Object} bbox with reprojected coordinates. - SphericalMercator.prototype.convert = function (bbox, to) { - if (to === '900913') { - return this.forward(bbox.slice(0, 2)).concat(this.forward(bbox.slice(2, 4))); - } else { - return this.inverse(bbox.slice(0, 2)).concat(this.inverse(bbox.slice(2, 4))); - } - }; - - // Convert lon/lat values to 900913 x/y. - SphericalMercator.prototype.forward = function (ll) { - var xy = [A * ll[0] * D2R, A * Math.log(Math.tan(Math.PI * 0.25 + 0.5 * ll[1] * D2R))]; - // if xy value is beyond maxextent (e.g. poles), return maxextent. - if (xy[0] > MAXEXTENT) xy[0] = MAXEXTENT; - if (xy[0] < -MAXEXTENT) xy[0] = -MAXEXTENT; - if (xy[1] > MAXEXTENT) xy[1] = MAXEXTENT; - if (xy[1] < -MAXEXTENT) xy[1] = -MAXEXTENT; - return xy; - }; - - // Convert 900913 x/y values to lon/lat. - SphericalMercator.prototype.inverse = function (xy) { - return [xy[0] * R2D / A, (Math.PI * 0.5 - 2.0 * Math.atan(Math.exp(-xy[1] / A))) * R2D]; - }; - - return SphericalMercator; -}(); - -if (typeof module !== 'undefined' && typeof exports !== 'undefined') { - module.exports = exports = SphericalMercator; -} - -},{}],42:[function(require,module,exports){ -(function (global, factory) { - if (typeof define === "function" && define.amd) define(factory); - else if (typeof module === "object") module.exports = factory(); - else global.augment = factory(); -}(this, function () { - "use strict"; - - var Factory = function () {}; - var slice = Array.prototype.slice; - - var augment = function (base, body) { - var uber = Factory.prototype = typeof base === "function" ? base.prototype : base; - var prototype = new Factory, properties = body.apply(prototype, slice.call(arguments, 2).concat(uber)); - if (typeof properties === "object") for (var key in properties) prototype[key] = properties[key]; - if (!prototype.hasOwnProperty("constructor")) return prototype; - var constructor = prototype.constructor; - constructor.prototype = prototype; - return constructor; - }; - - augment.defclass = function (prototype) { - var constructor = prototype.constructor; - constructor.prototype = prototype; - return constructor; - }; - - augment.extend = function (base, body) { - return augment(base, function (uber) { - this.uber = uber; - return body; - }); - }; - - return augment; -})); -},{}],43:[function(require,module,exports){ -module.exports = { "default": require("core-js/library/fn/object/assign"), __esModule: true }; -},{"core-js/library/fn/object/assign":45}],44:[function(require,module,exports){ -module.exports = { "default": require("core-js/library/fn/object/keys"), __esModule: true }; -},{"core-js/library/fn/object/keys":46}],45:[function(require,module,exports){ -require('../../modules/es6.object.assign'); -module.exports = require('../../modules/_core').Object.assign; -},{"../../modules/_core":51,"../../modules/es6.object.assign":82}],46:[function(require,module,exports){ -require('../../modules/es6.object.keys'); -module.exports = require('../../modules/_core').Object.keys; -},{"../../modules/_core":51,"../../modules/es6.object.keys":83}],47:[function(require,module,exports){ -module.exports = function(it){ - if(typeof it != 'function')throw TypeError(it + ' is not a function!'); - return it; -}; -},{}],48:[function(require,module,exports){ -var isObject = require('./_is-object'); -module.exports = function(it){ - if(!isObject(it))throw TypeError(it + ' is not an object!'); - return it; -}; -},{"./_is-object":64}],49:[function(require,module,exports){ -// false -> Array#indexOf -// true -> Array#includes -var toIObject = require('./_to-iobject') - , toLength = require('./_to-length') - , toIndex = require('./_to-index'); -module.exports = function(IS_INCLUDES){ - return function($this, el, fromIndex){ - var O = toIObject($this) - , length = toLength(O.length) - , index = toIndex(fromIndex, length) - , value; - // Array#includes uses SameValueZero equality algorithm - if(IS_INCLUDES && el != el)while(length > index){ - value = O[index++]; - if(value != value)return true; - // Array#toIndex ignores holes, Array#includes - not - } else for(;length > index; index++)if(IS_INCLUDES || index in O){ - if(O[index] === el)return IS_INCLUDES || index || 0; - } return !IS_INCLUDES && -1; - }; -}; -},{"./_to-index":75,"./_to-iobject":77,"./_to-length":78}],50:[function(require,module,exports){ -var toString = {}.toString; - -module.exports = function(it){ - return toString.call(it).slice(8, -1); -}; -},{}],51:[function(require,module,exports){ -var core = module.exports = {version: '2.4.0'}; -if(typeof __e == 'number')__e = core; // eslint-disable-line no-undef -},{}],52:[function(require,module,exports){ -// optional / simple context binding -var aFunction = require('./_a-function'); -module.exports = function(fn, that, length){ - aFunction(fn); - if(that === undefined)return fn; - switch(length){ - case 1: return function(a){ - return fn.call(that, a); - }; - case 2: return function(a, b){ - return fn.call(that, a, b); - }; - case 3: return function(a, b, c){ - return fn.call(that, a, b, c); - }; - } - return function(/* ...args */){ - return fn.apply(that, arguments); - }; -}; -},{"./_a-function":47}],53:[function(require,module,exports){ -// 7.2.1 RequireObjectCoercible(argument) -module.exports = function(it){ - if(it == undefined)throw TypeError("Can't call method on " + it); - return it; -}; -},{}],54:[function(require,module,exports){ -// Thank's IE8 for his funny defineProperty -module.exports = !require('./_fails')(function(){ - return Object.defineProperty({}, 'a', {get: function(){ return 7; }}).a != 7; -}); -},{"./_fails":58}],55:[function(require,module,exports){ -var isObject = require('./_is-object') - , document = require('./_global').document - // in old IE typeof document.createElement is 'object' - , is = isObject(document) && isObject(document.createElement); -module.exports = function(it){ - return is ? document.createElement(it) : {}; -}; -},{"./_global":59,"./_is-object":64}],56:[function(require,module,exports){ -// IE 8- don't enum bug keys -module.exports = ( - 'constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf' -).split(','); -},{}],57:[function(require,module,exports){ -var global = require('./_global') - , core = require('./_core') - , ctx = require('./_ctx') - , hide = require('./_hide') - , PROTOTYPE = 'prototype'; - -var $export = function(type, name, source){ - var IS_FORCED = type & $export.F - , IS_GLOBAL = type & $export.G - , IS_STATIC = type & $export.S - , IS_PROTO = type & $export.P - , IS_BIND = type & $export.B - , IS_WRAP = type & $export.W - , exports = IS_GLOBAL ? core : core[name] || (core[name] = {}) - , expProto = exports[PROTOTYPE] - , target = IS_GLOBAL ? global : IS_STATIC ? global[name] : (global[name] || {})[PROTOTYPE] - , key, own, out; - if(IS_GLOBAL)source = name; - for(key in source){ - // contains in native - own = !IS_FORCED && target && target[key] !== undefined; - if(own && key in exports)continue; - // export native or passed - out = own ? target[key] : source[key]; - // prevent global pollution for namespaces - exports[key] = IS_GLOBAL && typeof target[key] != 'function' ? source[key] - // bind timers to global for call from export context - : IS_BIND && own ? ctx(out, global) - // wrap global constructors for prevent change them in library - : IS_WRAP && target[key] == out ? (function(C){ - var F = function(a, b, c){ - if(this instanceof C){ - switch(arguments.length){ - case 0: return new C; - case 1: return new C(a); - case 2: return new C(a, b); - } return new C(a, b, c); - } return C.apply(this, arguments); - }; - F[PROTOTYPE] = C[PROTOTYPE]; - return F; - // make static versions for prototype methods - })(out) : IS_PROTO && typeof out == 'function' ? ctx(Function.call, out) : out; - // export proto methods to core.%CONSTRUCTOR%.methods.%NAME% - if(IS_PROTO){ - (exports.virtual || (exports.virtual = {}))[key] = out; - // export proto methods to core.%CONSTRUCTOR%.prototype.%NAME% - if(type & $export.R && expProto && !expProto[key])hide(expProto, key, out); - } - } -}; -// type bitmap -$export.F = 1; // forced -$export.G = 2; // global -$export.S = 4; // static -$export.P = 8; // proto -$export.B = 16; // bind -$export.W = 32; // wrap -$export.U = 64; // safe -$export.R = 128; // real proto method for `library` -module.exports = $export; -},{"./_core":51,"./_ctx":52,"./_global":59,"./_hide":61}],58:[function(require,module,exports){ -module.exports = function(exec){ - try { - return !!exec(); - } catch(e){ - return true; - } -}; -},{}],59:[function(require,module,exports){ -// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028 -var global = module.exports = typeof window != 'undefined' && window.Math == Math - ? window : typeof self != 'undefined' && self.Math == Math ? self : Function('return this')(); -if(typeof __g == 'number')__g = global; // eslint-disable-line no-undef -},{}],60:[function(require,module,exports){ -var hasOwnProperty = {}.hasOwnProperty; -module.exports = function(it, key){ - return hasOwnProperty.call(it, key); -}; -},{}],61:[function(require,module,exports){ -var dP = require('./_object-dp') - , createDesc = require('./_property-desc'); -module.exports = require('./_descriptors') ? function(object, key, value){ - return dP.f(object, key, createDesc(1, value)); -} : function(object, key, value){ - object[key] = value; - return object; -}; -},{"./_descriptors":54,"./_object-dp":66,"./_property-desc":72}],62:[function(require,module,exports){ -module.exports = !require('./_descriptors') && !require('./_fails')(function(){ - return Object.defineProperty(require('./_dom-create')('div'), 'a', {get: function(){ return 7; }}).a != 7; -}); -},{"./_descriptors":54,"./_dom-create":55,"./_fails":58}],63:[function(require,module,exports){ -// fallback for non-array-like ES3 and non-enumerable old V8 strings -var cof = require('./_cof'); -module.exports = Object('z').propertyIsEnumerable(0) ? Object : function(it){ - return cof(it) == 'String' ? it.split('') : Object(it); -}; -},{"./_cof":50}],64:[function(require,module,exports){ -module.exports = function(it){ - return typeof it === 'object' ? it !== null : typeof it === 'function'; -}; -},{}],65:[function(require,module,exports){ -'use strict'; -// 19.1.2.1 Object.assign(target, source, ...) -var getKeys = require('./_object-keys') - , gOPS = require('./_object-gops') - , pIE = require('./_object-pie') - , toObject = require('./_to-object') - , IObject = require('./_iobject') - , $assign = Object.assign; - -// should work with symbols and should have deterministic property order (V8 bug) -module.exports = !$assign || require('./_fails')(function(){ - var A = {} - , B = {} - , S = Symbol() - , K = 'abcdefghijklmnopqrst'; - A[S] = 7; - K.split('').forEach(function(k){ B[k] = k; }); - return $assign({}, A)[S] != 7 || Object.keys($assign({}, B)).join('') != K; -}) ? function assign(target, source){ // eslint-disable-line no-unused-vars - var T = toObject(target) - , aLen = arguments.length - , index = 1 - , getSymbols = gOPS.f - , isEnum = pIE.f; - while(aLen > index){ - var S = IObject(arguments[index++]) - , keys = getSymbols ? getKeys(S).concat(getSymbols(S)) : getKeys(S) - , length = keys.length - , j = 0 - , key; - while(length > j)if(isEnum.call(S, key = keys[j++]))T[key] = S[key]; - } return T; -} : $assign; -},{"./_fails":58,"./_iobject":63,"./_object-gops":67,"./_object-keys":69,"./_object-pie":70,"./_to-object":79}],66:[function(require,module,exports){ -var anObject = require('./_an-object') - , IE8_DOM_DEFINE = require('./_ie8-dom-define') - , toPrimitive = require('./_to-primitive') - , dP = Object.defineProperty; - -exports.f = require('./_descriptors') ? Object.defineProperty : function defineProperty(O, P, Attributes){ - anObject(O); - P = toPrimitive(P, true); - anObject(Attributes); - if(IE8_DOM_DEFINE)try { - return dP(O, P, Attributes); - } catch(e){ /* empty */ } - if('get' in Attributes || 'set' in Attributes)throw TypeError('Accessors not supported!'); - if('value' in Attributes)O[P] = Attributes.value; - return O; -}; -},{"./_an-object":48,"./_descriptors":54,"./_ie8-dom-define":62,"./_to-primitive":80}],67:[function(require,module,exports){ -exports.f = Object.getOwnPropertySymbols; -},{}],68:[function(require,module,exports){ -var has = require('./_has') - , toIObject = require('./_to-iobject') - , arrayIndexOf = require('./_array-includes')(false) - , IE_PROTO = require('./_shared-key')('IE_PROTO'); - -module.exports = function(object, names){ - var O = toIObject(object) - , i = 0 - , result = [] - , key; - for(key in O)if(key != IE_PROTO)has(O, key) && result.push(key); - // Don't enum bug & hidden keys - while(names.length > i)if(has(O, key = names[i++])){ - ~arrayIndexOf(result, key) || result.push(key); - } - return result; -}; -},{"./_array-includes":49,"./_has":60,"./_shared-key":73,"./_to-iobject":77}],69:[function(require,module,exports){ -// 19.1.2.14 / 15.2.3.14 Object.keys(O) -var $keys = require('./_object-keys-internal') - , enumBugKeys = require('./_enum-bug-keys'); - -module.exports = Object.keys || function keys(O){ - return $keys(O, enumBugKeys); -}; -},{"./_enum-bug-keys":56,"./_object-keys-internal":68}],70:[function(require,module,exports){ -exports.f = {}.propertyIsEnumerable; -},{}],71:[function(require,module,exports){ -// most Object methods by ES6 should accept primitives -var $export = require('./_export') - , core = require('./_core') - , fails = require('./_fails'); -module.exports = function(KEY, exec){ - var fn = (core.Object || {})[KEY] || Object[KEY] - , exp = {}; - exp[KEY] = exec(fn); - $export($export.S + $export.F * fails(function(){ fn(1); }), 'Object', exp); -}; -},{"./_core":51,"./_export":57,"./_fails":58}],72:[function(require,module,exports){ -module.exports = function(bitmap, value){ - return { - enumerable : !(bitmap & 1), - configurable: !(bitmap & 2), - writable : !(bitmap & 4), - value : value - }; -}; -},{}],73:[function(require,module,exports){ -var shared = require('./_shared')('keys') - , uid = require('./_uid'); -module.exports = function(key){ - return shared[key] || (shared[key] = uid(key)); -}; -},{"./_shared":74,"./_uid":81}],74:[function(require,module,exports){ -var global = require('./_global') - , SHARED = '__core-js_shared__' - , store = global[SHARED] || (global[SHARED] = {}); -module.exports = function(key){ - return store[key] || (store[key] = {}); -}; -},{"./_global":59}],75:[function(require,module,exports){ -var toInteger = require('./_to-integer') - , max = Math.max - , min = Math.min; -module.exports = function(index, length){ - index = toInteger(index); - return index < 0 ? max(index + length, 0) : min(index, length); -}; -},{"./_to-integer":76}],76:[function(require,module,exports){ -// 7.1.4 ToInteger -var ceil = Math.ceil - , floor = Math.floor; -module.exports = function(it){ - return isNaN(it = +it) ? 0 : (it > 0 ? floor : ceil)(it); -}; -},{}],77:[function(require,module,exports){ -// to indexed object, toObject with fallback for non-array-like ES3 strings -var IObject = require('./_iobject') - , defined = require('./_defined'); -module.exports = function(it){ - return IObject(defined(it)); -}; -},{"./_defined":53,"./_iobject":63}],78:[function(require,module,exports){ -// 7.1.15 ToLength -var toInteger = require('./_to-integer') - , min = Math.min; -module.exports = function(it){ - return it > 0 ? min(toInteger(it), 0x1fffffffffffff) : 0; // pow(2, 53) - 1 == 9007199254740991 -}; -},{"./_to-integer":76}],79:[function(require,module,exports){ -// 7.1.13 ToObject(argument) -var defined = require('./_defined'); -module.exports = function(it){ - return Object(defined(it)); -}; -},{"./_defined":53}],80:[function(require,module,exports){ -// 7.1.1 ToPrimitive(input [, PreferredType]) -var isObject = require('./_is-object'); -// instead of the ES6 spec version, we didn't implement @@toPrimitive case -// and the second argument - flag - preferred type is a string -module.exports = function(it, S){ - if(!isObject(it))return it; - var fn, val; - if(S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it)))return val; - if(typeof (fn = it.valueOf) == 'function' && !isObject(val = fn.call(it)))return val; - if(!S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it)))return val; - throw TypeError("Can't convert object to primitive value"); -}; -},{"./_is-object":64}],81:[function(require,module,exports){ -var id = 0 - , px = Math.random(); -module.exports = function(key){ - return 'Symbol('.concat(key === undefined ? '' : key, ')_', (++id + px).toString(36)); -}; -},{}],82:[function(require,module,exports){ -// 19.1.3.1 Object.assign(target, source) -var $export = require('./_export'); - -$export($export.S + $export.F, 'Object', {assign: require('./_object-assign')}); -},{"./_export":57,"./_object-assign":65}],83:[function(require,module,exports){ -// 19.1.2.14 Object.keys(O) -var toObject = require('./_to-object') - , $keys = require('./_object-keys'); - -require('./_object-sap')('keys', function(){ - return function keys(it){ - return $keys(toObject(it)); - }; -}); -},{"./_object-keys":69,"./_object-sap":71,"./_to-object":79}],84:[function(require,module,exports){ - -/** - * Module dependencies. - */ - -try { - var type = require('type'); -} catch (err) { - var type = require('component-type'); -} - -var toFunction = require('to-function'); - -/** - * HOP reference. - */ - -var has = Object.prototype.hasOwnProperty; - -/** - * Iterate the given `obj` and invoke `fn(val, i)` - * in optional context `ctx`. - * - * @param {String|Array|Object} obj - * @param {Function} fn - * @param {Object} [ctx] - * @api public - */ - -module.exports = function(obj, fn, ctx){ - fn = toFunction(fn); - ctx = ctx || this; - switch (type(obj)) { - case 'array': - return array(obj, fn, ctx); - case 'object': - if ('number' == typeof obj.length) return array(obj, fn, ctx); - return object(obj, fn, ctx); - case 'string': - return string(obj, fn, ctx); - } -}; - -/** - * Iterate string chars. - * - * @param {String} obj - * @param {Function} fn - * @param {Object} ctx - * @api private - */ - -function string(obj, fn, ctx) { - for (var i = 0; i < obj.length; ++i) { - fn.call(ctx, obj.charAt(i), i); - } -} - -/** - * Iterate object keys. - * - * @param {Object} obj - * @param {Function} fn - * @param {Object} ctx - * @api private - */ - -function object(obj, fn, ctx) { - for (var key in obj) { - if (has.call(obj, key)) { - fn.call(ctx, key, obj[key]); - } - } -} - -/** - * Iterate array-ish. - * - * @param {Array|Object} obj - * @param {Function} fn - * @param {Object} ctx - * @api private - */ - -function array(obj, fn, ctx) { - for (var i = 0; i < obj.length; ++i) { - fn.call(ctx, obj[i], i); - } -} - -},{"component-type":87,"to-function":93,"type":87}],85:[function(require,module,exports){ - -/** - * Expose `Emitter`. - */ - -if (typeof module !== 'undefined') { - module.exports = Emitter; -} - -/** - * Initialize a new `Emitter`. - * - * @api public - */ - -function Emitter(obj) { - if (obj) return mixin(obj); -}; - -/** - * Mixin the emitter properties. - * - * @param {Object} obj - * @return {Object} - * @api private - */ - -function mixin(obj) { - for (var key in Emitter.prototype) { - obj[key] = Emitter.prototype[key]; - } - return obj; -} - -/** - * Listen on the given `event` with `fn`. - * - * @param {String} event - * @param {Function} fn - * @return {Emitter} - * @api public - */ - -Emitter.prototype.on = -Emitter.prototype.addEventListener = function(event, fn){ - this._callbacks = this._callbacks || {}; - (this._callbacks['$' + event] = this._callbacks['$' + event] || []) - .push(fn); - return this; -}; - -/** - * Adds an `event` listener that will be invoked a single - * time then automatically removed. - * - * @param {String} event - * @param {Function} fn - * @return {Emitter} - * @api public - */ - -Emitter.prototype.once = function(event, fn){ - function on() { - this.off(event, on); - fn.apply(this, arguments); - } - - on.fn = fn; - this.on(event, on); - return this; -}; - -/** - * Remove the given callback for `event` or all - * registered callbacks. - * - * @param {String} event - * @param {Function} fn - * @return {Emitter} - * @api public - */ - -Emitter.prototype.off = -Emitter.prototype.removeListener = -Emitter.prototype.removeAllListeners = -Emitter.prototype.removeEventListener = function(event, fn){ - this._callbacks = this._callbacks || {}; - - // all - if (0 == arguments.length) { - this._callbacks = {}; - return this; - } - - // specific event - var callbacks = this._callbacks['$' + event]; - if (!callbacks) return this; - - // remove all handlers - if (1 == arguments.length) { - delete this._callbacks['$' + event]; - return this; - } - - // remove specific handler - var cb; - for (var i = 0; i < callbacks.length; i++) { - cb = callbacks[i]; - if (cb === fn || cb.fn === fn) { - callbacks.splice(i, 1); - break; - } - } - return this; -}; - -/** - * Emit `event` with the given args. - * - * @param {String} event - * @param {Mixed} ... - * @return {Emitter} - */ - -Emitter.prototype.emit = function(event){ - this._callbacks = this._callbacks || {}; - var args = [].slice.call(arguments, 1) - , callbacks = this._callbacks['$' + event]; - - if (callbacks) { - callbacks = callbacks.slice(0); - for (var i = 0, len = callbacks.length; i < len; ++i) { - callbacks[i].apply(this, args); - } - } - - return this; -}; - -/** - * Return array of callbacks for `event`. - * - * @param {String} event - * @return {Array} - * @api public - */ - -Emitter.prototype.listeners = function(event){ - this._callbacks = this._callbacks || {}; - return this._callbacks['$' + event] || []; -}; - -/** - * Check if this emitter has `event` handlers. - * - * @param {String} event - * @return {Boolean} - * @api public - */ - -Emitter.prototype.hasListeners = function(event){ - return !! this.listeners(event).length; -}; - -},{}],86:[function(require,module,exports){ -/** - * Global Names - */ - -var globals = /\b(Array|Date|Object|Math|JSON)\b/g; - -/** - * Return immediate identifiers parsed from `str`. - * - * @param {String} str - * @param {String|Function} map function or prefix - * @return {Array} - * @api public - */ - -module.exports = function(str, fn){ - var p = unique(props(str)); - if (fn && 'string' == typeof fn) fn = prefixed(fn); - if (fn) return map(str, p, fn); - return p; -}; - -/** - * Return immediate identifiers in `str`. - * - * @param {String} str - * @return {Array} - * @api private - */ - -function props(str) { - return str - .replace(/\.\w+|\w+ *\(|"[^"]*"|'[^']*'|\/([^/]+)\//g, '') - .replace(globals, '') - .match(/[a-zA-Z_]\w*/g) - || []; -} - -/** - * Return `str` with `props` mapped with `fn`. - * - * @param {String} str - * @param {Array} props - * @param {Function} fn - * @return {String} - * @api private - */ - -function map(str, props, fn) { - var re = /\.\w+|\w+ *\(|"[^"]*"|'[^']*'|\/([^/]+)\/|[a-zA-Z_]\w*/g; - return str.replace(re, function(_){ - if ('(' == _[_.length - 1]) return fn(_); - if (!~props.indexOf(_)) return _; - return fn(_); - }); -} - -/** - * Return unique array. - * - * @param {Array} arr - * @return {Array} - * @api private - */ - -function unique(arr) { - var ret = []; - - for (var i = 0; i < arr.length; i++) { - if (~ret.indexOf(arr[i])) continue; - ret.push(arr[i]); - } - - return ret; -} - -/** - * Map with prefix `str`. - */ - -function prefixed(str) { - return function(_){ - return str + _; - }; -} - -},{}],87:[function(require,module,exports){ - -/** - * toString ref. - */ - -var toString = Object.prototype.toString; - -/** - * Return the type of `val`. - * - * @param {Mixed} val - * @return {String} - * @api public - */ - -module.exports = function(val){ - switch (toString.call(val)) { - case '[object Function]': return 'function'; - case '[object Date]': return 'date'; - case '[object RegExp]': return 'regexp'; - case '[object Arguments]': return 'arguments'; - case '[object Array]': return 'array'; - case '[object String]': return 'string'; - } - - if (val === null) return 'null'; - if (val === undefined) return 'undefined'; - if (val && val.nodeType === 1) return 'element'; - if (val === Object(val)) return 'object'; - - return typeof val; -}; - -},{}],88:[function(require,module,exports){ -!function() { - var d3 = { - version: "3.5.17" - }; - var d3_arraySlice = [].slice, d3_array = function(list) { - return d3_arraySlice.call(list); - }; - var d3_document = this.document; - function d3_documentElement(node) { - return node && (node.ownerDocument || node.document || node).documentElement; - } - function d3_window(node) { - return node && (node.ownerDocument && node.ownerDocument.defaultView || node.document && node || node.defaultView); - } - if (d3_document) { - try { - d3_array(d3_document.documentElement.childNodes)[0].nodeType; - } catch (e) { - d3_array = function(list) { - var i = list.length, array = new Array(i); - while (i--) array[i] = list[i]; - return array; - }; - } - } - if (!Date.now) Date.now = function() { - return +new Date(); - }; - if (d3_document) { - try { - d3_document.createElement("DIV").style.setProperty("opacity", 0, ""); - } catch (error) { - var d3_element_prototype = this.Element.prototype, d3_element_setAttribute = d3_element_prototype.setAttribute, d3_element_setAttributeNS = d3_element_prototype.setAttributeNS, d3_style_prototype = this.CSSStyleDeclaration.prototype, d3_style_setProperty = d3_style_prototype.setProperty; - d3_element_prototype.setAttribute = function(name, value) { - d3_element_setAttribute.call(this, name, value + ""); - }; - d3_element_prototype.setAttributeNS = function(space, local, value) { - d3_element_setAttributeNS.call(this, space, local, value + ""); - }; - d3_style_prototype.setProperty = function(name, value, priority) { - d3_style_setProperty.call(this, name, value + "", priority); - }; - } - } - d3.ascending = d3_ascending; - function d3_ascending(a, b) { - return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN; - } - d3.descending = function(a, b) { - return b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN; - }; - d3.min = function(array, f) { - var i = -1, n = array.length, a, b; - if (arguments.length === 1) { - while (++i < n) if ((b = array[i]) != null && b >= b) { - a = b; - break; - } - while (++i < n) if ((b = array[i]) != null && a > b) a = b; - } else { - while (++i < n) if ((b = f.call(array, array[i], i)) != null && b >= b) { - a = b; - break; - } - while (++i < n) if ((b = f.call(array, array[i], i)) != null && a > b) a = b; - } - return a; - }; - d3.max = function(array, f) { - var i = -1, n = array.length, a, b; - if (arguments.length === 1) { - while (++i < n) if ((b = array[i]) != null && b >= b) { - a = b; - break; - } - while (++i < n) if ((b = array[i]) != null && b > a) a = b; - } else { - while (++i < n) if ((b = f.call(array, array[i], i)) != null && b >= b) { - a = b; - break; - } - while (++i < n) if ((b = f.call(array, array[i], i)) != null && b > a) a = b; - } - return a; - }; - d3.extent = function(array, f) { - var i = -1, n = array.length, a, b, c; - if (arguments.length === 1) { - while (++i < n) if ((b = array[i]) != null && b >= b) { - a = c = b; - break; - } - while (++i < n) if ((b = array[i]) != null) { - if (a > b) a = b; - if (c < b) c = b; - } - } else { - while (++i < n) if ((b = f.call(array, array[i], i)) != null && b >= b) { - a = c = b; - break; - } - while (++i < n) if ((b = f.call(array, array[i], i)) != null) { - if (a > b) a = b; - if (c < b) c = b; - } - } - return [ a, c ]; - }; - function d3_number(x) { - return x === null ? NaN : +x; - } - function d3_numeric(x) { - return !isNaN(x); - } - d3.sum = function(array, f) { - var s = 0, n = array.length, a, i = -1; - if (arguments.length === 1) { - while (++i < n) if (d3_numeric(a = +array[i])) s += a; - } else { - while (++i < n) if (d3_numeric(a = +f.call(array, array[i], i))) s += a; - } - return s; - }; - d3.mean = function(array, f) { - var s = 0, n = array.length, a, i = -1, j = n; - if (arguments.length === 1) { - while (++i < n) if (d3_numeric(a = d3_number(array[i]))) s += a; else --j; - } else { - while (++i < n) if (d3_numeric(a = d3_number(f.call(array, array[i], i)))) s += a; else --j; - } - if (j) return s / j; - }; - d3.quantile = function(values, p) { - var H = (values.length - 1) * p + 1, h = Math.floor(H), v = +values[h - 1], e = H - h; - return e ? v + e * (values[h] - v) : v; - }; - d3.median = function(array, f) { - var numbers = [], n = array.length, a, i = -1; - if (arguments.length === 1) { - while (++i < n) if (d3_numeric(a = d3_number(array[i]))) numbers.push(a); - } else { - while (++i < n) if (d3_numeric(a = d3_number(f.call(array, array[i], i)))) numbers.push(a); - } - if (numbers.length) return d3.quantile(numbers.sort(d3_ascending), .5); - }; - d3.variance = function(array, f) { - var n = array.length, m = 0, a, d, s = 0, i = -1, j = 0; - if (arguments.length === 1) { - while (++i < n) { - if (d3_numeric(a = d3_number(array[i]))) { - d = a - m; - m += d / ++j; - s += d * (a - m); - } - } - } else { - while (++i < n) { - if (d3_numeric(a = d3_number(f.call(array, array[i], i)))) { - d = a - m; - m += d / ++j; - s += d * (a - m); - } - } - } - if (j > 1) return s / (j - 1); - }; - d3.deviation = function() { - var v = d3.variance.apply(this, arguments); - return v ? Math.sqrt(v) : v; - }; - function d3_bisector(compare) { - return { - left: function(a, x, lo, hi) { - if (arguments.length < 3) lo = 0; - if (arguments.length < 4) hi = a.length; - while (lo < hi) { - var mid = lo + hi >>> 1; - if (compare(a[mid], x) < 0) lo = mid + 1; else hi = mid; - } - return lo; - }, - right: function(a, x, lo, hi) { - if (arguments.length < 3) lo = 0; - if (arguments.length < 4) hi = a.length; - while (lo < hi) { - var mid = lo + hi >>> 1; - if (compare(a[mid], x) > 0) hi = mid; else lo = mid + 1; - } - return lo; - } - }; - } - var d3_bisect = d3_bisector(d3_ascending); - d3.bisectLeft = d3_bisect.left; - d3.bisect = d3.bisectRight = d3_bisect.right; - d3.bisector = function(f) { - return d3_bisector(f.length === 1 ? function(d, x) { - return d3_ascending(f(d), x); - } : f); - }; - d3.shuffle = function(array, i0, i1) { - if ((m = arguments.length) < 3) { - i1 = array.length; - if (m < 2) i0 = 0; - } - var m = i1 - i0, t, i; - while (m) { - i = Math.random() * m-- | 0; - t = array[m + i0], array[m + i0] = array[i + i0], array[i + i0] = t; - } - return array; - }; - d3.permute = function(array, indexes) { - var i = indexes.length, permutes = new Array(i); - while (i--) permutes[i] = array[indexes[i]]; - return permutes; - }; - d3.pairs = function(array) { - var i = 0, n = array.length - 1, p0, p1 = array[0], pairs = new Array(n < 0 ? 0 : n); - while (i < n) pairs[i] = [ p0 = p1, p1 = array[++i] ]; - return pairs; - }; - d3.transpose = function(matrix) { - if (!(n = matrix.length)) return []; - for (var i = -1, m = d3.min(matrix, d3_transposeLength), transpose = new Array(m); ++i < m; ) { - for (var j = -1, n, row = transpose[i] = new Array(n); ++j < n; ) { - row[j] = matrix[j][i]; - } - } - return transpose; - }; - function d3_transposeLength(d) { - return d.length; - } - d3.zip = function() { - return d3.transpose(arguments); - }; - d3.keys = function(map) { - var keys = []; - for (var key in map) keys.push(key); - return keys; - }; - d3.values = function(map) { - var values = []; - for (var key in map) values.push(map[key]); - return values; - }; - d3.entries = function(map) { - var entries = []; - for (var key in map) entries.push({ - key: key, - value: map[key] - }); - return entries; - }; - d3.merge = function(arrays) { - var n = arrays.length, m, i = -1, j = 0, merged, array; - while (++i < n) j += arrays[i].length; - merged = new Array(j); - while (--n >= 0) { - array = arrays[n]; - m = array.length; - while (--m >= 0) { - merged[--j] = array[m]; - } - } - return merged; - }; - var abs = Math.abs; - d3.range = function(start, stop, step) { - if (arguments.length < 3) { - step = 1; - if (arguments.length < 2) { - stop = start; - start = 0; - } - } - if ((stop - start) / step === Infinity) throw new Error("infinite range"); - var range = [], k = d3_range_integerScale(abs(step)), i = -1, j; - start *= k, stop *= k, step *= k; - if (step < 0) while ((j = start + step * ++i) > stop) range.push(j / k); else while ((j = start + step * ++i) < stop) range.push(j / k); - return range; - }; - function d3_range_integerScale(x) { - var k = 1; - while (x * k % 1) k *= 10; - return k; - } - function d3_class(ctor, properties) { - for (var key in properties) { - Object.defineProperty(ctor.prototype, key, { - value: properties[key], - enumerable: false - }); - } - } - d3.map = function(object, f) { - var map = new d3_Map(); - if (object instanceof d3_Map) { - object.forEach(function(key, value) { - map.set(key, value); - }); - } else if (Array.isArray(object)) { - var i = -1, n = object.length, o; - if (arguments.length === 1) while (++i < n) map.set(i, object[i]); else while (++i < n) map.set(f.call(object, o = object[i], i), o); - } else { - for (var key in object) map.set(key, object[key]); - } - return map; - }; - function d3_Map() { - this._ = Object.create(null); - } - var d3_map_proto = "__proto__", d3_map_zero = "\x00"; - d3_class(d3_Map, { - has: d3_map_has, - get: function(key) { - return this._[d3_map_escape(key)]; - }, - set: function(key, value) { - return this._[d3_map_escape(key)] = value; - }, - remove: d3_map_remove, - keys: d3_map_keys, - values: function() { - var values = []; - for (var key in this._) values.push(this._[key]); - return values; - }, - entries: function() { - var entries = []; - for (var key in this._) entries.push({ - key: d3_map_unescape(key), - value: this._[key] - }); - return entries; - }, - size: d3_map_size, - empty: d3_map_empty, - forEach: function(f) { - for (var key in this._) f.call(this, d3_map_unescape(key), this._[key]); - } - }); - function d3_map_escape(key) { - return (key += "") === d3_map_proto || key[0] === d3_map_zero ? d3_map_zero + key : key; - } - function d3_map_unescape(key) { - return (key += "")[0] === d3_map_zero ? key.slice(1) : key; - } - function d3_map_has(key) { - return d3_map_escape(key) in this._; - } - function d3_map_remove(key) { - return (key = d3_map_escape(key)) in this._ && delete this._[key]; - } - function d3_map_keys() { - var keys = []; - for (var key in this._) keys.push(d3_map_unescape(key)); - return keys; - } - function d3_map_size() { - var size = 0; - for (var key in this._) ++size; - return size; - } - function d3_map_empty() { - for (var key in this._) return false; - return true; - } - d3.nest = function() { - var nest = {}, keys = [], sortKeys = [], sortValues, rollup; - function map(mapType, array, depth) { - if (depth >= keys.length) return rollup ? rollup.call(nest, array) : sortValues ? array.sort(sortValues) : array; - var i = -1, n = array.length, key = keys[depth++], keyValue, object, setter, valuesByKey = new d3_Map(), values; - while (++i < n) { - if (values = valuesByKey.get(keyValue = key(object = array[i]))) { - values.push(object); - } else { - valuesByKey.set(keyValue, [ object ]); - } - } - if (mapType) { - object = mapType(); - setter = function(keyValue, values) { - object.set(keyValue, map(mapType, values, depth)); - }; - } else { - object = {}; - setter = function(keyValue, values) { - object[keyValue] = map(mapType, values, depth); - }; - } - valuesByKey.forEach(setter); - return object; - } - function entries(map, depth) { - if (depth >= keys.length) return map; - var array = [], sortKey = sortKeys[depth++]; - map.forEach(function(key, keyMap) { - array.push({ - key: key, - values: entries(keyMap, depth) - }); - }); - return sortKey ? array.sort(function(a, b) { - return sortKey(a.key, b.key); - }) : array; - } - nest.map = function(array, mapType) { - return map(mapType, array, 0); - }; - nest.entries = function(array) { - return entries(map(d3.map, array, 0), 0); - }; - nest.key = function(d) { - keys.push(d); - return nest; - }; - nest.sortKeys = function(order) { - sortKeys[keys.length - 1] = order; - return nest; - }; - nest.sortValues = function(order) { - sortValues = order; - return nest; - }; - nest.rollup = function(f) { - rollup = f; - return nest; - }; - return nest; - }; - d3.set = function(array) { - var set = new d3_Set(); - if (array) for (var i = 0, n = array.length; i < n; ++i) set.add(array[i]); - return set; - }; - function d3_Set() { - this._ = Object.create(null); - } - d3_class(d3_Set, { - has: d3_map_has, - add: function(key) { - this._[d3_map_escape(key += "")] = true; - return key; - }, - remove: d3_map_remove, - values: d3_map_keys, - size: d3_map_size, - empty: d3_map_empty, - forEach: function(f) { - for (var key in this._) f.call(this, d3_map_unescape(key)); - } - }); - d3.behavior = {}; - function d3_identity(d) { - return d; - } - d3.rebind = function(target, source) { - var i = 1, n = arguments.length, method; - while (++i < n) target[method = arguments[i]] = d3_rebind(target, source, source[method]); - return target; - }; - function d3_rebind(target, source, method) { - return function() { - var value = method.apply(source, arguments); - return value === source ? target : value; - }; - } - function d3_vendorSymbol(object, name) { - if (name in object) return name; - name = name.charAt(0).toUpperCase() + name.slice(1); - for (var i = 0, n = d3_vendorPrefixes.length; i < n; ++i) { - var prefixName = d3_vendorPrefixes[i] + name; - if (prefixName in object) return prefixName; - } - } - var d3_vendorPrefixes = [ "webkit", "ms", "moz", "Moz", "o", "O" ]; - function d3_noop() {} - d3.dispatch = function() { - var dispatch = new d3_dispatch(), i = -1, n = arguments.length; - while (++i < n) dispatch[arguments[i]] = d3_dispatch_event(dispatch); - return dispatch; - }; - function d3_dispatch() {} - d3_dispatch.prototype.on = function(type, listener) { - var i = type.indexOf("."), name = ""; - if (i >= 0) { - name = type.slice(i + 1); - type = type.slice(0, i); - } - if (type) return arguments.length < 2 ? this[type].on(name) : this[type].on(name, listener); - if (arguments.length === 2) { - if (listener == null) for (type in this) { - if (this.hasOwnProperty(type)) this[type].on(name, null); - } - return this; - } - }; - function d3_dispatch_event(dispatch) { - var listeners = [], listenerByName = new d3_Map(); - function event() { - var z = listeners, i = -1, n = z.length, l; - while (++i < n) if (l = z[i].on) l.apply(this, arguments); - return dispatch; - } - event.on = function(name, listener) { - var l = listenerByName.get(name), i; - if (arguments.length < 2) return l && l.on; - if (l) { - l.on = null; - listeners = listeners.slice(0, i = listeners.indexOf(l)).concat(listeners.slice(i + 1)); - listenerByName.remove(name); - } - if (listener) listeners.push(listenerByName.set(name, { - on: listener - })); - return dispatch; - }; - return event; - } - d3.event = null; - function d3_eventPreventDefault() { - d3.event.preventDefault(); - } - function d3_eventSource() { - var e = d3.event, s; - while (s = e.sourceEvent) e = s; - return e; - } - function d3_eventDispatch(target) { - var dispatch = new d3_dispatch(), i = 0, n = arguments.length; - while (++i < n) dispatch[arguments[i]] = d3_dispatch_event(dispatch); - dispatch.of = function(thiz, argumentz) { - return function(e1) { - try { - var e0 = e1.sourceEvent = d3.event; - e1.target = target; - d3.event = e1; - dispatch[e1.type].apply(thiz, argumentz); - } finally { - d3.event = e0; - } - }; - }; - return dispatch; - } - d3.requote = function(s) { - return s.replace(d3_requote_re, "\\$&"); - }; - var d3_requote_re = /[\\\^\$\*\+\?\|\[\]\(\)\.\{\}]/g; - var d3_subclass = {}.__proto__ ? function(object, prototype) { - object.__proto__ = prototype; - } : function(object, prototype) { - for (var property in prototype) object[property] = prototype[property]; - }; - function d3_selection(groups) { - d3_subclass(groups, d3_selectionPrototype); - return groups; - } - var d3_select = function(s, n) { - return n.querySelector(s); - }, d3_selectAll = function(s, n) { - return n.querySelectorAll(s); - }, d3_selectMatches = function(n, s) { - var d3_selectMatcher = n.matches || n[d3_vendorSymbol(n, "matchesSelector")]; - d3_selectMatches = function(n, s) { - return d3_selectMatcher.call(n, s); - }; - return d3_selectMatches(n, s); - }; - if (typeof Sizzle === "function") { - d3_select = function(s, n) { - return Sizzle(s, n)[0] || null; - }; - d3_selectAll = Sizzle; - d3_selectMatches = Sizzle.matchesSelector; - } - d3.selection = function() { - return d3.select(d3_document.documentElement); - }; - var d3_selectionPrototype = d3.selection.prototype = []; - d3_selectionPrototype.select = function(selector) { - var subgroups = [], subgroup, subnode, group, node; - selector = d3_selection_selector(selector); - for (var j = -1, m = this.length; ++j < m; ) { - subgroups.push(subgroup = []); - subgroup.parentNode = (group = this[j]).parentNode; - for (var i = -1, n = group.length; ++i < n; ) { - if (node = group[i]) { - subgroup.push(subnode = selector.call(node, node.__data__, i, j)); - if (subnode && "__data__" in node) subnode.__data__ = node.__data__; - } else { - subgroup.push(null); - } - } - } - return d3_selection(subgroups); - }; - function d3_selection_selector(selector) { - return typeof selector === "function" ? selector : function() { - return d3_select(selector, this); - }; - } - d3_selectionPrototype.selectAll = function(selector) { - var subgroups = [], subgroup, node; - selector = d3_selection_selectorAll(selector); - for (var j = -1, m = this.length; ++j < m; ) { - for (var group = this[j], i = -1, n = group.length; ++i < n; ) { - if (node = group[i]) { - subgroups.push(subgroup = d3_array(selector.call(node, node.__data__, i, j))); - subgroup.parentNode = node; - } - } - } - return d3_selection(subgroups); - }; - function d3_selection_selectorAll(selector) { - return typeof selector === "function" ? selector : function() { - return d3_selectAll(selector, this); - }; - } - var d3_nsXhtml = "http://www.w3.org/1999/xhtml"; - var d3_nsPrefix = { - svg: "http://www.w3.org/2000/svg", - xhtml: d3_nsXhtml, - xlink: "http://www.w3.org/1999/xlink", - xml: "http://www.w3.org/XML/1998/namespace", - xmlns: "http://www.w3.org/2000/xmlns/" - }; - d3.ns = { - prefix: d3_nsPrefix, - qualify: function(name) { - var i = name.indexOf(":"), prefix = name; - if (i >= 0 && (prefix = name.slice(0, i)) !== "xmlns") name = name.slice(i + 1); - return d3_nsPrefix.hasOwnProperty(prefix) ? { - space: d3_nsPrefix[prefix], - local: name - } : name; - } - }; - d3_selectionPrototype.attr = function(name, value) { - if (arguments.length < 2) { - if (typeof name === "string") { - var node = this.node(); - name = d3.ns.qualify(name); - return name.local ? node.getAttributeNS(name.space, name.local) : node.getAttribute(name); - } - for (value in name) this.each(d3_selection_attr(value, name[value])); - return this; - } - return this.each(d3_selection_attr(name, value)); - }; - function d3_selection_attr(name, value) { - name = d3.ns.qualify(name); - function attrNull() { - this.removeAttribute(name); - } - function attrNullNS() { - this.removeAttributeNS(name.space, name.local); - } - function attrConstant() { - this.setAttribute(name, value); - } - function attrConstantNS() { - this.setAttributeNS(name.space, name.local, value); - } - function attrFunction() { - var x = value.apply(this, arguments); - if (x == null) this.removeAttribute(name); else this.setAttribute(name, x); - } - function attrFunctionNS() { - var x = value.apply(this, arguments); - if (x == null) this.removeAttributeNS(name.space, name.local); else this.setAttributeNS(name.space, name.local, x); - } - return value == null ? name.local ? attrNullNS : attrNull : typeof value === "function" ? name.local ? attrFunctionNS : attrFunction : name.local ? attrConstantNS : attrConstant; - } - function d3_collapse(s) { - return s.trim().replace(/\s+/g, " "); - } - d3_selectionPrototype.classed = function(name, value) { - if (arguments.length < 2) { - if (typeof name === "string") { - var node = this.node(), n = (name = d3_selection_classes(name)).length, i = -1; - if (value = node.classList) { - while (++i < n) if (!value.contains(name[i])) return false; - } else { - value = node.getAttribute("class"); - while (++i < n) if (!d3_selection_classedRe(name[i]).test(value)) return false; - } - return true; - } - for (value in name) this.each(d3_selection_classed(value, name[value])); - return this; - } - return this.each(d3_selection_classed(name, value)); - }; - function d3_selection_classedRe(name) { - return new RegExp("(?:^|\\s+)" + d3.requote(name) + "(?:\\s+|$)", "g"); - } - function d3_selection_classes(name) { - return (name + "").trim().split(/^|\s+/); - } - function d3_selection_classed(name, value) { - name = d3_selection_classes(name).map(d3_selection_classedName); - var n = name.length; - function classedConstant() { - var i = -1; - while (++i < n) name[i](this, value); - } - function classedFunction() { - var i = -1, x = value.apply(this, arguments); - while (++i < n) name[i](this, x); - } - return typeof value === "function" ? classedFunction : classedConstant; - } - function d3_selection_classedName(name) { - var re = d3_selection_classedRe(name); - return function(node, value) { - if (c = node.classList) return value ? c.add(name) : c.remove(name); - var c = node.getAttribute("class") || ""; - if (value) { - re.lastIndex = 0; - if (!re.test(c)) node.setAttribute("class", d3_collapse(c + " " + name)); - } else { - node.setAttribute("class", d3_collapse(c.replace(re, " "))); - } - }; - } - d3_selectionPrototype.style = function(name, value, priority) { - var n = arguments.length; - if (n < 3) { - if (typeof name !== "string") { - if (n < 2) value = ""; - for (priority in name) this.each(d3_selection_style(priority, name[priority], value)); - return this; - } - if (n < 2) { - var node = this.node(); - return d3_window(node).getComputedStyle(node, null).getPropertyValue(name); - } - priority = ""; - } - return this.each(d3_selection_style(name, value, priority)); - }; - function d3_selection_style(name, value, priority) { - function styleNull() { - this.style.removeProperty(name); - } - function styleConstant() { - this.style.setProperty(name, value, priority); - } - function styleFunction() { - var x = value.apply(this, arguments); - if (x == null) this.style.removeProperty(name); else this.style.setProperty(name, x, priority); - } - return value == null ? styleNull : typeof value === "function" ? styleFunction : styleConstant; - } - d3_selectionPrototype.property = function(name, value) { - if (arguments.length < 2) { - if (typeof name === "string") return this.node()[name]; - for (value in name) this.each(d3_selection_property(value, name[value])); - return this; - } - return this.each(d3_selection_property(name, value)); - }; - function d3_selection_property(name, value) { - function propertyNull() { - delete this[name]; - } - function propertyConstant() { - this[name] = value; - } - function propertyFunction() { - var x = value.apply(this, arguments); - if (x == null) delete this[name]; else this[name] = x; - } - return value == null ? propertyNull : typeof value === "function" ? propertyFunction : propertyConstant; - } - d3_selectionPrototype.text = function(value) { - return arguments.length ? this.each(typeof value === "function" ? function() { - var v = value.apply(this, arguments); - this.textContent = v == null ? "" : v; - } : value == null ? function() { - this.textContent = ""; - } : function() { - this.textContent = value; - }) : this.node().textContent; - }; - d3_selectionPrototype.html = function(value) { - return arguments.length ? this.each(typeof value === "function" ? function() { - var v = value.apply(this, arguments); - this.innerHTML = v == null ? "" : v; - } : value == null ? function() { - this.innerHTML = ""; - } : function() { - this.innerHTML = value; - }) : this.node().innerHTML; - }; - d3_selectionPrototype.append = function(name) { - name = d3_selection_creator(name); - return this.select(function() { - return this.appendChild(name.apply(this, arguments)); - }); - }; - function d3_selection_creator(name) { - function create() { - var document = this.ownerDocument, namespace = this.namespaceURI; - return namespace === d3_nsXhtml && document.documentElement.namespaceURI === d3_nsXhtml ? document.createElement(name) : document.createElementNS(namespace, name); - } - function createNS() { - return this.ownerDocument.createElementNS(name.space, name.local); - } - return typeof name === "function" ? name : (name = d3.ns.qualify(name)).local ? createNS : create; - } - d3_selectionPrototype.insert = function(name, before) { - name = d3_selection_creator(name); - before = d3_selection_selector(before); - return this.select(function() { - return this.insertBefore(name.apply(this, arguments), before.apply(this, arguments) || null); - }); - }; - d3_selectionPrototype.remove = function() { - return this.each(d3_selectionRemove); - }; - function d3_selectionRemove() { - var parent = this.parentNode; - if (parent) parent.removeChild(this); - } - d3_selectionPrototype.data = function(value, key) { - var i = -1, n = this.length, group, node; - if (!arguments.length) { - value = new Array(n = (group = this[0]).length); - while (++i < n) { - if (node = group[i]) { - value[i] = node.__data__; - } - } - return value; - } - function bind(group, groupData) { - var i, n = group.length, m = groupData.length, n0 = Math.min(n, m), updateNodes = new Array(m), enterNodes = new Array(m), exitNodes = new Array(n), node, nodeData; - if (key) { - var nodeByKeyValue = new d3_Map(), keyValues = new Array(n), keyValue; - for (i = -1; ++i < n; ) { - if (node = group[i]) { - if (nodeByKeyValue.has(keyValue = key.call(node, node.__data__, i))) { - exitNodes[i] = node; - } else { - nodeByKeyValue.set(keyValue, node); - } - keyValues[i] = keyValue; - } - } - for (i = -1; ++i < m; ) { - if (!(node = nodeByKeyValue.get(keyValue = key.call(groupData, nodeData = groupData[i], i)))) { - enterNodes[i] = d3_selection_dataNode(nodeData); - } else if (node !== true) { - updateNodes[i] = node; - node.__data__ = nodeData; - } - nodeByKeyValue.set(keyValue, true); - } - for (i = -1; ++i < n; ) { - if (i in keyValues && nodeByKeyValue.get(keyValues[i]) !== true) { - exitNodes[i] = group[i]; - } - } - } else { - for (i = -1; ++i < n0; ) { - node = group[i]; - nodeData = groupData[i]; - if (node) { - node.__data__ = nodeData; - updateNodes[i] = node; - } else { - enterNodes[i] = d3_selection_dataNode(nodeData); - } - } - for (;i < m; ++i) { - enterNodes[i] = d3_selection_dataNode(groupData[i]); - } - for (;i < n; ++i) { - exitNodes[i] = group[i]; - } - } - enterNodes.update = updateNodes; - enterNodes.parentNode = updateNodes.parentNode = exitNodes.parentNode = group.parentNode; - enter.push(enterNodes); - update.push(updateNodes); - exit.push(exitNodes); - } - var enter = d3_selection_enter([]), update = d3_selection([]), exit = d3_selection([]); - if (typeof value === "function") { - while (++i < n) { - bind(group = this[i], value.call(group, group.parentNode.__data__, i)); - } - } else { - while (++i < n) { - bind(group = this[i], value); - } - } - update.enter = function() { - return enter; - }; - update.exit = function() { - return exit; - }; - return update; - }; - function d3_selection_dataNode(data) { - return { - __data__: data - }; - } - d3_selectionPrototype.datum = function(value) { - return arguments.length ? this.property("__data__", value) : this.property("__data__"); - }; - d3_selectionPrototype.filter = function(filter) { - var subgroups = [], subgroup, group, node; - if (typeof filter !== "function") filter = d3_selection_filter(filter); - for (var j = 0, m = this.length; j < m; j++) { - subgroups.push(subgroup = []); - subgroup.parentNode = (group = this[j]).parentNode; - for (var i = 0, n = group.length; i < n; i++) { - if ((node = group[i]) && filter.call(node, node.__data__, i, j)) { - subgroup.push(node); - } - } - } - return d3_selection(subgroups); - }; - function d3_selection_filter(selector) { - return function() { - return d3_selectMatches(this, selector); - }; - } - d3_selectionPrototype.order = function() { - for (var j = -1, m = this.length; ++j < m; ) { - for (var group = this[j], i = group.length - 1, next = group[i], node; --i >= 0; ) { - if (node = group[i]) { - if (next && next !== node.nextSibling) next.parentNode.insertBefore(node, next); - next = node; - } - } - } - return this; - }; - d3_selectionPrototype.sort = function(comparator) { - comparator = d3_selection_sortComparator.apply(this, arguments); - for (var j = -1, m = this.length; ++j < m; ) this[j].sort(comparator); - return this.order(); - }; - function d3_selection_sortComparator(comparator) { - if (!arguments.length) comparator = d3_ascending; - return function(a, b) { - return a && b ? comparator(a.__data__, b.__data__) : !a - !b; - }; - } - d3_selectionPrototype.each = function(callback) { - return d3_selection_each(this, function(node, i, j) { - callback.call(node, node.__data__, i, j); - }); - }; - function d3_selection_each(groups, callback) { - for (var j = 0, m = groups.length; j < m; j++) { - for (var group = groups[j], i = 0, n = group.length, node; i < n; i++) { - if (node = group[i]) callback(node, i, j); - } - } - return groups; - } - d3_selectionPrototype.call = function(callback) { - var args = d3_array(arguments); - callback.apply(args[0] = this, args); - return this; - }; - d3_selectionPrototype.empty = function() { - return !this.node(); - }; - d3_selectionPrototype.node = function() { - for (var j = 0, m = this.length; j < m; j++) { - for (var group = this[j], i = 0, n = group.length; i < n; i++) { - var node = group[i]; - if (node) return node; - } - } - return null; - }; - d3_selectionPrototype.size = function() { - var n = 0; - d3_selection_each(this, function() { - ++n; - }); - return n; - }; - function d3_selection_enter(selection) { - d3_subclass(selection, d3_selection_enterPrototype); - return selection; - } - var d3_selection_enterPrototype = []; - d3.selection.enter = d3_selection_enter; - d3.selection.enter.prototype = d3_selection_enterPrototype; - d3_selection_enterPrototype.append = d3_selectionPrototype.append; - d3_selection_enterPrototype.empty = d3_selectionPrototype.empty; - d3_selection_enterPrototype.node = d3_selectionPrototype.node; - d3_selection_enterPrototype.call = d3_selectionPrototype.call; - d3_selection_enterPrototype.size = d3_selectionPrototype.size; - d3_selection_enterPrototype.select = function(selector) { - var subgroups = [], subgroup, subnode, upgroup, group, node; - for (var j = -1, m = this.length; ++j < m; ) { - upgroup = (group = this[j]).update; - subgroups.push(subgroup = []); - subgroup.parentNode = group.parentNode; - for (var i = -1, n = group.length; ++i < n; ) { - if (node = group[i]) { - subgroup.push(upgroup[i] = subnode = selector.call(group.parentNode, node.__data__, i, j)); - subnode.__data__ = node.__data__; - } else { - subgroup.push(null); - } - } - } - return d3_selection(subgroups); - }; - d3_selection_enterPrototype.insert = function(name, before) { - if (arguments.length < 2) before = d3_selection_enterInsertBefore(this); - return d3_selectionPrototype.insert.call(this, name, before); - }; - function d3_selection_enterInsertBefore(enter) { - var i0, j0; - return function(d, i, j) { - var group = enter[j].update, n = group.length, node; - if (j != j0) j0 = j, i0 = 0; - if (i >= i0) i0 = i + 1; - while (!(node = group[i0]) && ++i0 < n) ; - return node; - }; - } - d3.select = function(node) { - var group; - if (typeof node === "string") { - group = [ d3_select(node, d3_document) ]; - group.parentNode = d3_document.documentElement; - } else { - group = [ node ]; - group.parentNode = d3_documentElement(node); - } - return d3_selection([ group ]); - }; - d3.selectAll = function(nodes) { - var group; - if (typeof nodes === "string") { - group = d3_array(d3_selectAll(nodes, d3_document)); - group.parentNode = d3_document.documentElement; - } else { - group = d3_array(nodes); - group.parentNode = null; - } - return d3_selection([ group ]); - }; - d3_selectionPrototype.on = function(type, listener, capture) { - var n = arguments.length; - if (n < 3) { - if (typeof type !== "string") { - if (n < 2) listener = false; - for (capture in type) this.each(d3_selection_on(capture, type[capture], listener)); - return this; - } - if (n < 2) return (n = this.node()["__on" + type]) && n._; - capture = false; - } - return this.each(d3_selection_on(type, listener, capture)); - }; - function d3_selection_on(type, listener, capture) { - var name = "__on" + type, i = type.indexOf("."), wrap = d3_selection_onListener; - if (i > 0) type = type.slice(0, i); - var filter = d3_selection_onFilters.get(type); - if (filter) type = filter, wrap = d3_selection_onFilter; - function onRemove() { - var l = this[name]; - if (l) { - this.removeEventListener(type, l, l.$); - delete this[name]; - } - } - function onAdd() { - var l = wrap(listener, d3_array(arguments)); - onRemove.call(this); - this.addEventListener(type, this[name] = l, l.$ = capture); - l._ = listener; - } - function removeAll() { - var re = new RegExp("^__on([^.]+)" + d3.requote(type) + "$"), match; - for (var name in this) { - if (match = name.match(re)) { - var l = this[name]; - this.removeEventListener(match[1], l, l.$); - delete this[name]; - } - } - } - return i ? listener ? onAdd : onRemove : listener ? d3_noop : removeAll; - } - var d3_selection_onFilters = d3.map({ - mouseenter: "mouseover", - mouseleave: "mouseout" - }); - if (d3_document) { - d3_selection_onFilters.forEach(function(k) { - if ("on" + k in d3_document) d3_selection_onFilters.remove(k); - }); - } - function d3_selection_onListener(listener, argumentz) { - return function(e) { - var o = d3.event; - d3.event = e; - argumentz[0] = this.__data__; - try { - listener.apply(this, argumentz); - } finally { - d3.event = o; - } - }; - } - function d3_selection_onFilter(listener, argumentz) { - var l = d3_selection_onListener(listener, argumentz); - return function(e) { - var target = this, related = e.relatedTarget; - if (!related || related !== target && !(related.compareDocumentPosition(target) & 8)) { - l.call(target, e); - } - }; - } - var d3_event_dragSelect, d3_event_dragId = 0; - function d3_event_dragSuppress(node) { - var name = ".dragsuppress-" + ++d3_event_dragId, click = "click" + name, w = d3.select(d3_window(node)).on("touchmove" + name, d3_eventPreventDefault).on("dragstart" + name, d3_eventPreventDefault).on("selectstart" + name, d3_eventPreventDefault); - if (d3_event_dragSelect == null) { - d3_event_dragSelect = "onselectstart" in node ? false : d3_vendorSymbol(node.style, "userSelect"); - } - if (d3_event_dragSelect) { - var style = d3_documentElement(node).style, select = style[d3_event_dragSelect]; - style[d3_event_dragSelect] = "none"; - } - return function(suppressClick) { - w.on(name, null); - if (d3_event_dragSelect) style[d3_event_dragSelect] = select; - if (suppressClick) { - var off = function() { - w.on(click, null); - }; - w.on(click, function() { - d3_eventPreventDefault(); - off(); - }, true); - setTimeout(off, 0); - } - }; - } - d3.mouse = function(container) { - return d3_mousePoint(container, d3_eventSource()); - }; - var d3_mouse_bug44083 = this.navigator && /WebKit/.test(this.navigator.userAgent) ? -1 : 0; - function d3_mousePoint(container, e) { - if (e.changedTouches) e = e.changedTouches[0]; - var svg = container.ownerSVGElement || container; - if (svg.createSVGPoint) { - var point = svg.createSVGPoint(); - if (d3_mouse_bug44083 < 0) { - var window = d3_window(container); - if (window.scrollX || window.scrollY) { - svg = d3.select("body").append("svg").style({ - position: "absolute", - top: 0, - left: 0, - margin: 0, - padding: 0, - border: "none" - }, "important"); - var ctm = svg[0][0].getScreenCTM(); - d3_mouse_bug44083 = !(ctm.f || ctm.e); - svg.remove(); - } - } - if (d3_mouse_bug44083) point.x = e.pageX, point.y = e.pageY; else point.x = e.clientX, - point.y = e.clientY; - point = point.matrixTransform(container.getScreenCTM().inverse()); - return [ point.x, point.y ]; - } - var rect = container.getBoundingClientRect(); - return [ e.clientX - rect.left - container.clientLeft, e.clientY - rect.top - container.clientTop ]; - } - d3.touch = function(container, touches, identifier) { - if (arguments.length < 3) identifier = touches, touches = d3_eventSource().changedTouches; - if (touches) for (var i = 0, n = touches.length, touch; i < n; ++i) { - if ((touch = touches[i]).identifier === identifier) { - return d3_mousePoint(container, touch); - } - } - }; - d3.behavior.drag = function() { - var event = d3_eventDispatch(drag, "drag", "dragstart", "dragend"), origin = null, mousedown = dragstart(d3_noop, d3.mouse, d3_window, "mousemove", "mouseup"), touchstart = dragstart(d3_behavior_dragTouchId, d3.touch, d3_identity, "touchmove", "touchend"); - function drag() { - this.on("mousedown.drag", mousedown).on("touchstart.drag", touchstart); - } - function dragstart(id, position, subject, move, end) { - return function() { - var that = this, target = d3.event.target.correspondingElement || d3.event.target, parent = that.parentNode, dispatch = event.of(that, arguments), dragged = 0, dragId = id(), dragName = ".drag" + (dragId == null ? "" : "-" + dragId), dragOffset, dragSubject = d3.select(subject(target)).on(move + dragName, moved).on(end + dragName, ended), dragRestore = d3_event_dragSuppress(target), position0 = position(parent, dragId); - if (origin) { - dragOffset = origin.apply(that, arguments); - dragOffset = [ dragOffset.x - position0[0], dragOffset.y - position0[1] ]; - } else { - dragOffset = [ 0, 0 ]; - } - dispatch({ - type: "dragstart" - }); - function moved() { - var position1 = position(parent, dragId), dx, dy; - if (!position1) return; - dx = position1[0] - position0[0]; - dy = position1[1] - position0[1]; - dragged |= dx | dy; - position0 = position1; - dispatch({ - type: "drag", - x: position1[0] + dragOffset[0], - y: position1[1] + dragOffset[1], - dx: dx, - dy: dy - }); - } - function ended() { - if (!position(parent, dragId)) return; - dragSubject.on(move + dragName, null).on(end + dragName, null); - dragRestore(dragged); - dispatch({ - type: "dragend" - }); - } - }; - } - drag.origin = function(x) { - if (!arguments.length) return origin; - origin = x; - return drag; - }; - return d3.rebind(drag, event, "on"); - }; - function d3_behavior_dragTouchId() { - return d3.event.changedTouches[0].identifier; - } - d3.touches = function(container, touches) { - if (arguments.length < 2) touches = d3_eventSource().touches; - return touches ? d3_array(touches).map(function(touch) { - var point = d3_mousePoint(container, touch); - point.identifier = touch.identifier; - return point; - }) : []; - }; - var ε = 1e-6, ε2 = ε * ε, π = Math.PI, τ = 2 * π, τε = τ - ε, halfπ = π / 2, d3_radians = π / 180, d3_degrees = 180 / π; - function d3_sgn(x) { - return x > 0 ? 1 : x < 0 ? -1 : 0; - } - function d3_cross2d(a, b, c) { - return (b[0] - a[0]) * (c[1] - a[1]) - (b[1] - a[1]) * (c[0] - a[0]); - } - function d3_acos(x) { - return x > 1 ? 0 : x < -1 ? π : Math.acos(x); - } - function d3_asin(x) { - return x > 1 ? halfπ : x < -1 ? -halfπ : Math.asin(x); - } - function d3_sinh(x) { - return ((x = Math.exp(x)) - 1 / x) / 2; - } - function d3_cosh(x) { - return ((x = Math.exp(x)) + 1 / x) / 2; - } - function d3_tanh(x) { - return ((x = Math.exp(2 * x)) - 1) / (x + 1); - } - function d3_haversin(x) { - return (x = Math.sin(x / 2)) * x; - } - var ρ = Math.SQRT2, ρ2 = 2, ρ4 = 4; - d3.interpolateZoom = function(p0, p1) { - var ux0 = p0[0], uy0 = p0[1], w0 = p0[2], ux1 = p1[0], uy1 = p1[1], w1 = p1[2], dx = ux1 - ux0, dy = uy1 - uy0, d2 = dx * dx + dy * dy, i, S; - if (d2 < ε2) { - S = Math.log(w1 / w0) / ρ; - i = function(t) { - return [ ux0 + t * dx, uy0 + t * dy, w0 * Math.exp(ρ * t * S) ]; - }; - } else { - var d1 = Math.sqrt(d2), b0 = (w1 * w1 - w0 * w0 + ρ4 * d2) / (2 * w0 * ρ2 * d1), b1 = (w1 * w1 - w0 * w0 - ρ4 * d2) / (2 * w1 * ρ2 * d1), r0 = Math.log(Math.sqrt(b0 * b0 + 1) - b0), r1 = Math.log(Math.sqrt(b1 * b1 + 1) - b1); - S = (r1 - r0) / ρ; - i = function(t) { - var s = t * S, coshr0 = d3_cosh(r0), u = w0 / (ρ2 * d1) * (coshr0 * d3_tanh(ρ * s + r0) - d3_sinh(r0)); - return [ ux0 + u * dx, uy0 + u * dy, w0 * coshr0 / d3_cosh(ρ * s + r0) ]; - }; - } - i.duration = S * 1e3; - return i; - }; - d3.behavior.zoom = function() { - var view = { - x: 0, - y: 0, - k: 1 - }, translate0, center0, center, size = [ 960, 500 ], scaleExtent = d3_behavior_zoomInfinity, duration = 250, zooming = 0, mousedown = "mousedown.zoom", mousemove = "mousemove.zoom", mouseup = "mouseup.zoom", mousewheelTimer, touchstart = "touchstart.zoom", touchtime, event = d3_eventDispatch(zoom, "zoomstart", "zoom", "zoomend"), x0, x1, y0, y1; - if (!d3_behavior_zoomWheel) { - d3_behavior_zoomWheel = "onwheel" in d3_document ? (d3_behavior_zoomDelta = function() { - return -d3.event.deltaY * (d3.event.deltaMode ? 120 : 1); - }, "wheel") : "onmousewheel" in d3_document ? (d3_behavior_zoomDelta = function() { - return d3.event.wheelDelta; - }, "mousewheel") : (d3_behavior_zoomDelta = function() { - return -d3.event.detail; - }, "MozMousePixelScroll"); - } - function zoom(g) { - g.on(mousedown, mousedowned).on(d3_behavior_zoomWheel + ".zoom", mousewheeled).on("dblclick.zoom", dblclicked).on(touchstart, touchstarted); - } - zoom.event = function(g) { - g.each(function() { - var dispatch = event.of(this, arguments), view1 = view; - if (d3_transitionInheritId) { - d3.select(this).transition().each("start.zoom", function() { - view = this.__chart__ || { - x: 0, - y: 0, - k: 1 - }; - zoomstarted(dispatch); - }).tween("zoom:zoom", function() { - var dx = size[0], dy = size[1], cx = center0 ? center0[0] : dx / 2, cy = center0 ? center0[1] : dy / 2, i = d3.interpolateZoom([ (cx - view.x) / view.k, (cy - view.y) / view.k, dx / view.k ], [ (cx - view1.x) / view1.k, (cy - view1.y) / view1.k, dx / view1.k ]); - return function(t) { - var l = i(t), k = dx / l[2]; - this.__chart__ = view = { - x: cx - l[0] * k, - y: cy - l[1] * k, - k: k - }; - zoomed(dispatch); - }; - }).each("interrupt.zoom", function() { - zoomended(dispatch); - }).each("end.zoom", function() { - zoomended(dispatch); - }); - } else { - this.__chart__ = view; - zoomstarted(dispatch); - zoomed(dispatch); - zoomended(dispatch); - } - }); - }; - zoom.translate = function(_) { - if (!arguments.length) return [ view.x, view.y ]; - view = { - x: +_[0], - y: +_[1], - k: view.k - }; - rescale(); - return zoom; - }; - zoom.scale = function(_) { - if (!arguments.length) return view.k; - view = { - x: view.x, - y: view.y, - k: null - }; - scaleTo(+_); - rescale(); - return zoom; - }; - zoom.scaleExtent = function(_) { - if (!arguments.length) return scaleExtent; - scaleExtent = _ == null ? d3_behavior_zoomInfinity : [ +_[0], +_[1] ]; - return zoom; - }; - zoom.center = function(_) { - if (!arguments.length) return center; - center = _ && [ +_[0], +_[1] ]; - return zoom; - }; - zoom.size = function(_) { - if (!arguments.length) return size; - size = _ && [ +_[0], +_[1] ]; - return zoom; - }; - zoom.duration = function(_) { - if (!arguments.length) return duration; - duration = +_; - return zoom; - }; - zoom.x = function(z) { - if (!arguments.length) return x1; - x1 = z; - x0 = z.copy(); - view = { - x: 0, - y: 0, - k: 1 - }; - return zoom; - }; - zoom.y = function(z) { - if (!arguments.length) return y1; - y1 = z; - y0 = z.copy(); - view = { - x: 0, - y: 0, - k: 1 - }; - return zoom; - }; - function location(p) { - return [ (p[0] - view.x) / view.k, (p[1] - view.y) / view.k ]; - } - function point(l) { - return [ l[0] * view.k + view.x, l[1] * view.k + view.y ]; - } - function scaleTo(s) { - view.k = Math.max(scaleExtent[0], Math.min(scaleExtent[1], s)); - } - function translateTo(p, l) { - l = point(l); - view.x += p[0] - l[0]; - view.y += p[1] - l[1]; - } - function zoomTo(that, p, l, k) { - that.__chart__ = { - x: view.x, - y: view.y, - k: view.k - }; - scaleTo(Math.pow(2, k)); - translateTo(center0 = p, l); - that = d3.select(that); - if (duration > 0) that = that.transition().duration(duration); - that.call(zoom.event); - } - function rescale() { - if (x1) x1.domain(x0.range().map(function(x) { - return (x - view.x) / view.k; - }).map(x0.invert)); - if (y1) y1.domain(y0.range().map(function(y) { - return (y - view.y) / view.k; - }).map(y0.invert)); - } - function zoomstarted(dispatch) { - if (!zooming++) dispatch({ - type: "zoomstart" - }); - } - function zoomed(dispatch) { - rescale(); - dispatch({ - type: "zoom", - scale: view.k, - translate: [ view.x, view.y ] - }); - } - function zoomended(dispatch) { - if (!--zooming) dispatch({ - type: "zoomend" - }), center0 = null; - } - function mousedowned() { - var that = this, dispatch = event.of(that, arguments), dragged = 0, subject = d3.select(d3_window(that)).on(mousemove, moved).on(mouseup, ended), location0 = location(d3.mouse(that)), dragRestore = d3_event_dragSuppress(that); - d3_selection_interrupt.call(that); - zoomstarted(dispatch); - function moved() { - dragged = 1; - translateTo(d3.mouse(that), location0); - zoomed(dispatch); - } - function ended() { - subject.on(mousemove, null).on(mouseup, null); - dragRestore(dragged); - zoomended(dispatch); - } - } - function touchstarted() { - var that = this, dispatch = event.of(that, arguments), locations0 = {}, distance0 = 0, scale0, zoomName = ".zoom-" + d3.event.changedTouches[0].identifier, touchmove = "touchmove" + zoomName, touchend = "touchend" + zoomName, targets = [], subject = d3.select(that), dragRestore = d3_event_dragSuppress(that); - started(); - zoomstarted(dispatch); - subject.on(mousedown, null).on(touchstart, started); - function relocate() { - var touches = d3.touches(that); - scale0 = view.k; - touches.forEach(function(t) { - if (t.identifier in locations0) locations0[t.identifier] = location(t); - }); - return touches; - } - function started() { - var target = d3.event.target; - d3.select(target).on(touchmove, moved).on(touchend, ended); - targets.push(target); - var changed = d3.event.changedTouches; - for (var i = 0, n = changed.length; i < n; ++i) { - locations0[changed[i].identifier] = null; - } - var touches = relocate(), now = Date.now(); - if (touches.length === 1) { - if (now - touchtime < 500) { - var p = touches[0]; - zoomTo(that, p, locations0[p.identifier], Math.floor(Math.log(view.k) / Math.LN2) + 1); - d3_eventPreventDefault(); - } - touchtime = now; - } else if (touches.length > 1) { - var p = touches[0], q = touches[1], dx = p[0] - q[0], dy = p[1] - q[1]; - distance0 = dx * dx + dy * dy; - } - } - function moved() { - var touches = d3.touches(that), p0, l0, p1, l1; - d3_selection_interrupt.call(that); - for (var i = 0, n = touches.length; i < n; ++i, l1 = null) { - p1 = touches[i]; - if (l1 = locations0[p1.identifier]) { - if (l0) break; - p0 = p1, l0 = l1; - } - } - if (l1) { - var distance1 = (distance1 = p1[0] - p0[0]) * distance1 + (distance1 = p1[1] - p0[1]) * distance1, scale1 = distance0 && Math.sqrt(distance1 / distance0); - p0 = [ (p0[0] + p1[0]) / 2, (p0[1] + p1[1]) / 2 ]; - l0 = [ (l0[0] + l1[0]) / 2, (l0[1] + l1[1]) / 2 ]; - scaleTo(scale1 * scale0); - } - touchtime = null; - translateTo(p0, l0); - zoomed(dispatch); - } - function ended() { - if (d3.event.touches.length) { - var changed = d3.event.changedTouches; - for (var i = 0, n = changed.length; i < n; ++i) { - delete locations0[changed[i].identifier]; - } - for (var identifier in locations0) { - return void relocate(); - } - } - d3.selectAll(targets).on(zoomName, null); - subject.on(mousedown, mousedowned).on(touchstart, touchstarted); - dragRestore(); - zoomended(dispatch); - } - } - function mousewheeled() { - var dispatch = event.of(this, arguments); - if (mousewheelTimer) clearTimeout(mousewheelTimer); else d3_selection_interrupt.call(this), - translate0 = location(center0 = center || d3.mouse(this)), zoomstarted(dispatch); - mousewheelTimer = setTimeout(function() { - mousewheelTimer = null; - zoomended(dispatch); - }, 50); - d3_eventPreventDefault(); - scaleTo(Math.pow(2, d3_behavior_zoomDelta() * .002) * view.k); - translateTo(center0, translate0); - zoomed(dispatch); - } - function dblclicked() { - var p = d3.mouse(this), k = Math.log(view.k) / Math.LN2; - zoomTo(this, p, location(p), d3.event.shiftKey ? Math.ceil(k) - 1 : Math.floor(k) + 1); - } - return d3.rebind(zoom, event, "on"); - }; - var d3_behavior_zoomInfinity = [ 0, Infinity ], d3_behavior_zoomDelta, d3_behavior_zoomWheel; - d3.color = d3_color; - function d3_color() {} - d3_color.prototype.toString = function() { - return this.rgb() + ""; - }; - d3.hsl = d3_hsl; - function d3_hsl(h, s, l) { - return this instanceof d3_hsl ? void (this.h = +h, this.s = +s, this.l = +l) : arguments.length < 2 ? h instanceof d3_hsl ? new d3_hsl(h.h, h.s, h.l) : d3_rgb_parse("" + h, d3_rgb_hsl, d3_hsl) : new d3_hsl(h, s, l); - } - var d3_hslPrototype = d3_hsl.prototype = new d3_color(); - d3_hslPrototype.brighter = function(k) { - k = Math.pow(.7, arguments.length ? k : 1); - return new d3_hsl(this.h, this.s, this.l / k); - }; - d3_hslPrototype.darker = function(k) { - k = Math.pow(.7, arguments.length ? k : 1); - return new d3_hsl(this.h, this.s, k * this.l); - }; - d3_hslPrototype.rgb = function() { - return d3_hsl_rgb(this.h, this.s, this.l); - }; - function d3_hsl_rgb(h, s, l) { - var m1, m2; - h = isNaN(h) ? 0 : (h %= 360) < 0 ? h + 360 : h; - s = isNaN(s) ? 0 : s < 0 ? 0 : s > 1 ? 1 : s; - l = l < 0 ? 0 : l > 1 ? 1 : l; - m2 = l <= .5 ? l * (1 + s) : l + s - l * s; - m1 = 2 * l - m2; - function v(h) { - if (h > 360) h -= 360; else if (h < 0) h += 360; - if (h < 60) return m1 + (m2 - m1) * h / 60; - if (h < 180) return m2; - if (h < 240) return m1 + (m2 - m1) * (240 - h) / 60; - return m1; - } - function vv(h) { - return Math.round(v(h) * 255); - } - return new d3_rgb(vv(h + 120), vv(h), vv(h - 120)); - } - d3.hcl = d3_hcl; - function d3_hcl(h, c, l) { - return this instanceof d3_hcl ? void (this.h = +h, this.c = +c, this.l = +l) : arguments.length < 2 ? h instanceof d3_hcl ? new d3_hcl(h.h, h.c, h.l) : h instanceof d3_lab ? d3_lab_hcl(h.l, h.a, h.b) : d3_lab_hcl((h = d3_rgb_lab((h = d3.rgb(h)).r, h.g, h.b)).l, h.a, h.b) : new d3_hcl(h, c, l); - } - var d3_hclPrototype = d3_hcl.prototype = new d3_color(); - d3_hclPrototype.brighter = function(k) { - return new d3_hcl(this.h, this.c, Math.min(100, this.l + d3_lab_K * (arguments.length ? k : 1))); - }; - d3_hclPrototype.darker = function(k) { - return new d3_hcl(this.h, this.c, Math.max(0, this.l - d3_lab_K * (arguments.length ? k : 1))); - }; - d3_hclPrototype.rgb = function() { - return d3_hcl_lab(this.h, this.c, this.l).rgb(); - }; - function d3_hcl_lab(h, c, l) { - if (isNaN(h)) h = 0; - if (isNaN(c)) c = 0; - return new d3_lab(l, Math.cos(h *= d3_radians) * c, Math.sin(h) * c); - } - d3.lab = d3_lab; - function d3_lab(l, a, b) { - return this instanceof d3_lab ? void (this.l = +l, this.a = +a, this.b = +b) : arguments.length < 2 ? l instanceof d3_lab ? new d3_lab(l.l, l.a, l.b) : l instanceof d3_hcl ? d3_hcl_lab(l.h, l.c, l.l) : d3_rgb_lab((l = d3_rgb(l)).r, l.g, l.b) : new d3_lab(l, a, b); - } - var d3_lab_K = 18; - var d3_lab_X = .95047, d3_lab_Y = 1, d3_lab_Z = 1.08883; - var d3_labPrototype = d3_lab.prototype = new d3_color(); - d3_labPrototype.brighter = function(k) { - return new d3_lab(Math.min(100, this.l + d3_lab_K * (arguments.length ? k : 1)), this.a, this.b); - }; - d3_labPrototype.darker = function(k) { - return new d3_lab(Math.max(0, this.l - d3_lab_K * (arguments.length ? k : 1)), this.a, this.b); - }; - d3_labPrototype.rgb = function() { - return d3_lab_rgb(this.l, this.a, this.b); - }; - function d3_lab_rgb(l, a, b) { - var y = (l + 16) / 116, x = y + a / 500, z = y - b / 200; - x = d3_lab_xyz(x) * d3_lab_X; - y = d3_lab_xyz(y) * d3_lab_Y; - z = d3_lab_xyz(z) * d3_lab_Z; - return new d3_rgb(d3_xyz_rgb(3.2404542 * x - 1.5371385 * y - .4985314 * z), d3_xyz_rgb(-.969266 * x + 1.8760108 * y + .041556 * z), d3_xyz_rgb(.0556434 * x - .2040259 * y + 1.0572252 * z)); - } - function d3_lab_hcl(l, a, b) { - return l > 0 ? new d3_hcl(Math.atan2(b, a) * d3_degrees, Math.sqrt(a * a + b * b), l) : new d3_hcl(NaN, NaN, l); - } - function d3_lab_xyz(x) { - return x > .206893034 ? x * x * x : (x - 4 / 29) / 7.787037; - } - function d3_xyz_lab(x) { - return x > .008856 ? Math.pow(x, 1 / 3) : 7.787037 * x + 4 / 29; - } - function d3_xyz_rgb(r) { - return Math.round(255 * (r <= .00304 ? 12.92 * r : 1.055 * Math.pow(r, 1 / 2.4) - .055)); - } - d3.rgb = d3_rgb; - function d3_rgb(r, g, b) { - return this instanceof d3_rgb ? void (this.r = ~~r, this.g = ~~g, this.b = ~~b) : arguments.length < 2 ? r instanceof d3_rgb ? new d3_rgb(r.r, r.g, r.b) : d3_rgb_parse("" + r, d3_rgb, d3_hsl_rgb) : new d3_rgb(r, g, b); - } - function d3_rgbNumber(value) { - return new d3_rgb(value >> 16, value >> 8 & 255, value & 255); - } - function d3_rgbString(value) { - return d3_rgbNumber(value) + ""; - } - var d3_rgbPrototype = d3_rgb.prototype = new d3_color(); - d3_rgbPrototype.brighter = function(k) { - k = Math.pow(.7, arguments.length ? k : 1); - var r = this.r, g = this.g, b = this.b, i = 30; - if (!r && !g && !b) return new d3_rgb(i, i, i); - if (r && r < i) r = i; - if (g && g < i) g = i; - if (b && b < i) b = i; - return new d3_rgb(Math.min(255, r / k), Math.min(255, g / k), Math.min(255, b / k)); - }; - d3_rgbPrototype.darker = function(k) { - k = Math.pow(.7, arguments.length ? k : 1); - return new d3_rgb(k * this.r, k * this.g, k * this.b); - }; - d3_rgbPrototype.hsl = function() { - return d3_rgb_hsl(this.r, this.g, this.b); - }; - d3_rgbPrototype.toString = function() { - return "#" + d3_rgb_hex(this.r) + d3_rgb_hex(this.g) + d3_rgb_hex(this.b); - }; - function d3_rgb_hex(v) { - return v < 16 ? "0" + Math.max(0, v).toString(16) : Math.min(255, v).toString(16); - } - function d3_rgb_parse(format, rgb, hsl) { - var r = 0, g = 0, b = 0, m1, m2, color; - m1 = /([a-z]+)\((.*)\)/.exec(format = format.toLowerCase()); - if (m1) { - m2 = m1[2].split(","); - switch (m1[1]) { - case "hsl": - { - return hsl(parseFloat(m2[0]), parseFloat(m2[1]) / 100, parseFloat(m2[2]) / 100); - } - - case "rgb": - { - return rgb(d3_rgb_parseNumber(m2[0]), d3_rgb_parseNumber(m2[1]), d3_rgb_parseNumber(m2[2])); - } - } - } - if (color = d3_rgb_names.get(format)) { - return rgb(color.r, color.g, color.b); - } - if (format != null && format.charAt(0) === "#" && !isNaN(color = parseInt(format.slice(1), 16))) { - if (format.length === 4) { - r = (color & 3840) >> 4; - r = r >> 4 | r; - g = color & 240; - g = g >> 4 | g; - b = color & 15; - b = b << 4 | b; - } else if (format.length === 7) { - r = (color & 16711680) >> 16; - g = (color & 65280) >> 8; - b = color & 255; - } - } - return rgb(r, g, b); - } - function d3_rgb_hsl(r, g, b) { - var min = Math.min(r /= 255, g /= 255, b /= 255), max = Math.max(r, g, b), d = max - min, h, s, l = (max + min) / 2; - if (d) { - s = l < .5 ? d / (max + min) : d / (2 - max - min); - if (r == max) h = (g - b) / d + (g < b ? 6 : 0); else if (g == max) h = (b - r) / d + 2; else h = (r - g) / d + 4; - h *= 60; - } else { - h = NaN; - s = l > 0 && l < 1 ? 0 : h; - } - return new d3_hsl(h, s, l); - } - function d3_rgb_lab(r, g, b) { - r = d3_rgb_xyz(r); - g = d3_rgb_xyz(g); - b = d3_rgb_xyz(b); - var x = d3_xyz_lab((.4124564 * r + .3575761 * g + .1804375 * b) / d3_lab_X), y = d3_xyz_lab((.2126729 * r + .7151522 * g + .072175 * b) / d3_lab_Y), z = d3_xyz_lab((.0193339 * r + .119192 * g + .9503041 * b) / d3_lab_Z); - return d3_lab(116 * y - 16, 500 * (x - y), 200 * (y - z)); - } - function d3_rgb_xyz(r) { - return (r /= 255) <= .04045 ? r / 12.92 : Math.pow((r + .055) / 1.055, 2.4); - } - function d3_rgb_parseNumber(c) { - var f = parseFloat(c); - return c.charAt(c.length - 1) === "%" ? Math.round(f * 2.55) : f; - } - var d3_rgb_names = d3.map({ - aliceblue: 15792383, - antiquewhite: 16444375, - aqua: 65535, - aquamarine: 8388564, - azure: 15794175, - beige: 16119260, - bisque: 16770244, - black: 0, - blanchedalmond: 16772045, - blue: 255, - blueviolet: 9055202, - brown: 10824234, - burlywood: 14596231, - cadetblue: 6266528, - chartreuse: 8388352, - chocolate: 13789470, - coral: 16744272, - cornflowerblue: 6591981, - cornsilk: 16775388, - crimson: 14423100, - cyan: 65535, - darkblue: 139, - darkcyan: 35723, - darkgoldenrod: 12092939, - darkgray: 11119017, - darkgreen: 25600, - darkgrey: 11119017, - darkkhaki: 12433259, - darkmagenta: 9109643, - darkolivegreen: 5597999, - darkorange: 16747520, - darkorchid: 10040012, - darkred: 9109504, - darksalmon: 15308410, - darkseagreen: 9419919, - darkslateblue: 4734347, - darkslategray: 3100495, - darkslategrey: 3100495, - darkturquoise: 52945, - darkviolet: 9699539, - deeppink: 16716947, - deepskyblue: 49151, - dimgray: 6908265, - dimgrey: 6908265, - dodgerblue: 2003199, - firebrick: 11674146, - floralwhite: 16775920, - forestgreen: 2263842, - fuchsia: 16711935, - gainsboro: 14474460, - ghostwhite: 16316671, - gold: 16766720, - goldenrod: 14329120, - gray: 8421504, - green: 32768, - greenyellow: 11403055, - grey: 8421504, - honeydew: 15794160, - hotpink: 16738740, - indianred: 13458524, - indigo: 4915330, - ivory: 16777200, - khaki: 15787660, - lavender: 15132410, - lavenderblush: 16773365, - lawngreen: 8190976, - lemonchiffon: 16775885, - lightblue: 11393254, - lightcoral: 15761536, - lightcyan: 14745599, - lightgoldenrodyellow: 16448210, - lightgray: 13882323, - lightgreen: 9498256, - lightgrey: 13882323, - lightpink: 16758465, - lightsalmon: 16752762, - lightseagreen: 2142890, - lightskyblue: 8900346, - lightslategray: 7833753, - lightslategrey: 7833753, - lightsteelblue: 11584734, - lightyellow: 16777184, - lime: 65280, - limegreen: 3329330, - linen: 16445670, - magenta: 16711935, - maroon: 8388608, - mediumaquamarine: 6737322, - mediumblue: 205, - mediumorchid: 12211667, - mediumpurple: 9662683, - mediumseagreen: 3978097, - mediumslateblue: 8087790, - mediumspringgreen: 64154, - mediumturquoise: 4772300, - mediumvioletred: 13047173, - midnightblue: 1644912, - mintcream: 16121850, - mistyrose: 16770273, - moccasin: 16770229, - navajowhite: 16768685, - navy: 128, - oldlace: 16643558, - olive: 8421376, - olivedrab: 7048739, - orange: 16753920, - orangered: 16729344, - orchid: 14315734, - palegoldenrod: 15657130, - palegreen: 10025880, - paleturquoise: 11529966, - palevioletred: 14381203, - papayawhip: 16773077, - peachpuff: 16767673, - peru: 13468991, - pink: 16761035, - plum: 14524637, - powderblue: 11591910, - purple: 8388736, - rebeccapurple: 6697881, - red: 16711680, - rosybrown: 12357519, - royalblue: 4286945, - saddlebrown: 9127187, - salmon: 16416882, - sandybrown: 16032864, - seagreen: 3050327, - seashell: 16774638, - sienna: 10506797, - silver: 12632256, - skyblue: 8900331, - slateblue: 6970061, - slategray: 7372944, - slategrey: 7372944, - snow: 16775930, - springgreen: 65407, - steelblue: 4620980, - tan: 13808780, - teal: 32896, - thistle: 14204888, - tomato: 16737095, - turquoise: 4251856, - violet: 15631086, - wheat: 16113331, - white: 16777215, - whitesmoke: 16119285, - yellow: 16776960, - yellowgreen: 10145074 - }); - d3_rgb_names.forEach(function(key, value) { - d3_rgb_names.set(key, d3_rgbNumber(value)); - }); - function d3_functor(v) { - return typeof v === "function" ? v : function() { - return v; - }; - } - d3.functor = d3_functor; - d3.xhr = d3_xhrType(d3_identity); - function d3_xhrType(response) { - return function(url, mimeType, callback) { - if (arguments.length === 2 && typeof mimeType === "function") callback = mimeType, - mimeType = null; - return d3_xhr(url, mimeType, response, callback); - }; - } - function d3_xhr(url, mimeType, response, callback) { - var xhr = {}, dispatch = d3.dispatch("beforesend", "progress", "load", "error"), headers = {}, request = new XMLHttpRequest(), responseType = null; - if (this.XDomainRequest && !("withCredentials" in request) && /^(http(s)?:)?\/\//.test(url)) request = new XDomainRequest(); - "onload" in request ? request.onload = request.onerror = respond : request.onreadystatechange = function() { - request.readyState > 3 && respond(); - }; - function respond() { - var status = request.status, result; - if (!status && d3_xhrHasResponse(request) || status >= 200 && status < 300 || status === 304) { - try { - result = response.call(xhr, request); - } catch (e) { - dispatch.error.call(xhr, e); - return; - } - dispatch.load.call(xhr, result); - } else { - dispatch.error.call(xhr, request); - } - } - request.onprogress = function(event) { - var o = d3.event; - d3.event = event; - try { - dispatch.progress.call(xhr, request); - } finally { - d3.event = o; - } - }; - xhr.header = function(name, value) { - name = (name + "").toLowerCase(); - if (arguments.length < 2) return headers[name]; - if (value == null) delete headers[name]; else headers[name] = value + ""; - return xhr; - }; - xhr.mimeType = function(value) { - if (!arguments.length) return mimeType; - mimeType = value == null ? null : value + ""; - return xhr; - }; - xhr.responseType = function(value) { - if (!arguments.length) return responseType; - responseType = value; - return xhr; - }; - xhr.response = function(value) { - response = value; - return xhr; - }; - [ "get", "post" ].forEach(function(method) { - xhr[method] = function() { - return xhr.send.apply(xhr, [ method ].concat(d3_array(arguments))); - }; - }); - xhr.send = function(method, data, callback) { - if (arguments.length === 2 && typeof data === "function") callback = data, data = null; - request.open(method, url, true); - if (mimeType != null && !("accept" in headers)) headers["accept"] = mimeType + ",*/*"; - if (request.setRequestHeader) for (var name in headers) request.setRequestHeader(name, headers[name]); - if (mimeType != null && request.overrideMimeType) request.overrideMimeType(mimeType); - if (responseType != null) request.responseType = responseType; - if (callback != null) xhr.on("error", callback).on("load", function(request) { - callback(null, request); - }); - dispatch.beforesend.call(xhr, request); - request.send(data == null ? null : data); - return xhr; - }; - xhr.abort = function() { - request.abort(); - return xhr; - }; - d3.rebind(xhr, dispatch, "on"); - return callback == null ? xhr : xhr.get(d3_xhr_fixCallback(callback)); - } - function d3_xhr_fixCallback(callback) { - return callback.length === 1 ? function(error, request) { - callback(error == null ? request : null); - } : callback; - } - function d3_xhrHasResponse(request) { - var type = request.responseType; - return type && type !== "text" ? request.response : request.responseText; - } - d3.dsv = function(delimiter, mimeType) { - var reFormat = new RegExp('["' + delimiter + "\n]"), delimiterCode = delimiter.charCodeAt(0); - function dsv(url, row, callback) { - if (arguments.length < 3) callback = row, row = null; - var xhr = d3_xhr(url, mimeType, row == null ? response : typedResponse(row), callback); - xhr.row = function(_) { - return arguments.length ? xhr.response((row = _) == null ? response : typedResponse(_)) : row; - }; - return xhr; - } - function response(request) { - return dsv.parse(request.responseText); - } - function typedResponse(f) { - return function(request) { - return dsv.parse(request.responseText, f); - }; - } - dsv.parse = function(text, f) { - var o; - return dsv.parseRows(text, function(row, i) { - if (o) return o(row, i - 1); - var a = new Function("d", "return {" + row.map(function(name, i) { - return JSON.stringify(name) + ": d[" + i + "]"; - }).join(",") + "}"); - o = f ? function(row, i) { - return f(a(row), i); - } : a; - }); - }; - dsv.parseRows = function(text, f) { - var EOL = {}, EOF = {}, rows = [], N = text.length, I = 0, n = 0, t, eol; - function token() { - if (I >= N) return EOF; - if (eol) return eol = false, EOL; - var j = I; - if (text.charCodeAt(j) === 34) { - var i = j; - while (i++ < N) { - if (text.charCodeAt(i) === 34) { - if (text.charCodeAt(i + 1) !== 34) break; - ++i; - } - } - I = i + 2; - var c = text.charCodeAt(i + 1); - if (c === 13) { - eol = true; - if (text.charCodeAt(i + 2) === 10) ++I; - } else if (c === 10) { - eol = true; - } - return text.slice(j + 1, i).replace(/""/g, '"'); - } - while (I < N) { - var c = text.charCodeAt(I++), k = 1; - if (c === 10) eol = true; else if (c === 13) { - eol = true; - if (text.charCodeAt(I) === 10) ++I, ++k; - } else if (c !== delimiterCode) continue; - return text.slice(j, I - k); - } - return text.slice(j); - } - while ((t = token()) !== EOF) { - var a = []; - while (t !== EOL && t !== EOF) { - a.push(t); - t = token(); - } - if (f && (a = f(a, n++)) == null) continue; - rows.push(a); - } - return rows; - }; - dsv.format = function(rows) { - if (Array.isArray(rows[0])) return dsv.formatRows(rows); - var fieldSet = new d3_Set(), fields = []; - rows.forEach(function(row) { - for (var field in row) { - if (!fieldSet.has(field)) { - fields.push(fieldSet.add(field)); - } - } - }); - return [ fields.map(formatValue).join(delimiter) ].concat(rows.map(function(row) { - return fields.map(function(field) { - return formatValue(row[field]); - }).join(delimiter); - })).join("\n"); - }; - dsv.formatRows = function(rows) { - return rows.map(formatRow).join("\n"); - }; - function formatRow(row) { - return row.map(formatValue).join(delimiter); - } - function formatValue(text) { - return reFormat.test(text) ? '"' + text.replace(/\"/g, '""') + '"' : text; - } - return dsv; - }; - d3.csv = d3.dsv(",", "text/csv"); - d3.tsv = d3.dsv(" ", "text/tab-separated-values"); - var d3_timer_queueHead, d3_timer_queueTail, d3_timer_interval, d3_timer_timeout, d3_timer_frame = this[d3_vendorSymbol(this, "requestAnimationFrame")] || function(callback) { - setTimeout(callback, 17); - }; - d3.timer = function() { - d3_timer.apply(this, arguments); - }; - function d3_timer(callback, delay, then) { - var n = arguments.length; - if (n < 2) delay = 0; - if (n < 3) then = Date.now(); - var time = then + delay, timer = { - c: callback, - t: time, - n: null - }; - if (d3_timer_queueTail) d3_timer_queueTail.n = timer; else d3_timer_queueHead = timer; - d3_timer_queueTail = timer; - if (!d3_timer_interval) { - d3_timer_timeout = clearTimeout(d3_timer_timeout); - d3_timer_interval = 1; - d3_timer_frame(d3_timer_step); - } - return timer; - } - function d3_timer_step() { - var now = d3_timer_mark(), delay = d3_timer_sweep() - now; - if (delay > 24) { - if (isFinite(delay)) { - clearTimeout(d3_timer_timeout); - d3_timer_timeout = setTimeout(d3_timer_step, delay); - } - d3_timer_interval = 0; - } else { - d3_timer_interval = 1; - d3_timer_frame(d3_timer_step); - } - } - d3.timer.flush = function() { - d3_timer_mark(); - d3_timer_sweep(); - }; - function d3_timer_mark() { - var now = Date.now(), timer = d3_timer_queueHead; - while (timer) { - if (now >= timer.t && timer.c(now - timer.t)) timer.c = null; - timer = timer.n; - } - return now; - } - function d3_timer_sweep() { - var t0, t1 = d3_timer_queueHead, time = Infinity; - while (t1) { - if (t1.c) { - if (t1.t < time) time = t1.t; - t1 = (t0 = t1).n; - } else { - t1 = t0 ? t0.n = t1.n : d3_timer_queueHead = t1.n; - } - } - d3_timer_queueTail = t0; - return time; - } - function d3_format_precision(x, p) { - return p - (x ? Math.ceil(Math.log(x) / Math.LN10) : 1); - } - d3.round = function(x, n) { - return n ? Math.round(x * (n = Math.pow(10, n))) / n : Math.round(x); - }; - var d3_formatPrefixes = [ "y", "z", "a", "f", "p", "n", "µ", "m", "", "k", "M", "G", "T", "P", "E", "Z", "Y" ].map(d3_formatPrefix); - d3.formatPrefix = function(value, precision) { - var i = 0; - if (value = +value) { - if (value < 0) value *= -1; - if (precision) value = d3.round(value, d3_format_precision(value, precision)); - i = 1 + Math.floor(1e-12 + Math.log(value) / Math.LN10); - i = Math.max(-24, Math.min(24, Math.floor((i - 1) / 3) * 3)); - } - return d3_formatPrefixes[8 + i / 3]; - }; - function d3_formatPrefix(d, i) { - var k = Math.pow(10, abs(8 - i) * 3); - return { - scale: i > 8 ? function(d) { - return d / k; - } : function(d) { - return d * k; - }, - symbol: d - }; - } - function d3_locale_numberFormat(locale) { - var locale_decimal = locale.decimal, locale_thousands = locale.thousands, locale_grouping = locale.grouping, locale_currency = locale.currency, formatGroup = locale_grouping && locale_thousands ? function(value, width) { - var i = value.length, t = [], j = 0, g = locale_grouping[0], length = 0; - while (i > 0 && g > 0) { - if (length + g + 1 > width) g = Math.max(1, width - length); - t.push(value.substring(i -= g, i + g)); - if ((length += g + 1) > width) break; - g = locale_grouping[j = (j + 1) % locale_grouping.length]; - } - return t.reverse().join(locale_thousands); - } : d3_identity; - return function(specifier) { - var match = d3_format_re.exec(specifier), fill = match[1] || " ", align = match[2] || ">", sign = match[3] || "-", symbol = match[4] || "", zfill = match[5], width = +match[6], comma = match[7], precision = match[8], type = match[9], scale = 1, prefix = "", suffix = "", integer = false, exponent = true; - if (precision) precision = +precision.substring(1); - if (zfill || fill === "0" && align === "=") { - zfill = fill = "0"; - align = "="; - } - switch (type) { - case "n": - comma = true; - type = "g"; - break; - - case "%": - scale = 100; - suffix = "%"; - type = "f"; - break; - - case "p": - scale = 100; - suffix = "%"; - type = "r"; - break; - - case "b": - case "o": - case "x": - case "X": - if (symbol === "#") prefix = "0" + type.toLowerCase(); - - case "c": - exponent = false; - - case "d": - integer = true; - precision = 0; - break; - - case "s": - scale = -1; - type = "r"; - break; - } - if (symbol === "$") prefix = locale_currency[0], suffix = locale_currency[1]; - if (type == "r" && !precision) type = "g"; - if (precision != null) { - if (type == "g") precision = Math.max(1, Math.min(21, precision)); else if (type == "e" || type == "f") precision = Math.max(0, Math.min(20, precision)); - } - type = d3_format_types.get(type) || d3_format_typeDefault; - var zcomma = zfill && comma; - return function(value) { - var fullSuffix = suffix; - if (integer && value % 1) return ""; - var negative = value < 0 || value === 0 && 1 / value < 0 ? (value = -value, "-") : sign === "-" ? "" : sign; - if (scale < 0) { - var unit = d3.formatPrefix(value, precision); - value = unit.scale(value); - fullSuffix = unit.symbol + suffix; - } else { - value *= scale; - } - value = type(value, precision); - var i = value.lastIndexOf("."), before, after; - if (i < 0) { - var j = exponent ? value.lastIndexOf("e") : -1; - if (j < 0) before = value, after = ""; else before = value.substring(0, j), after = value.substring(j); - } else { - before = value.substring(0, i); - after = locale_decimal + value.substring(i + 1); - } - if (!zfill && comma) before = formatGroup(before, Infinity); - var length = prefix.length + before.length + after.length + (zcomma ? 0 : negative.length), padding = length < width ? new Array(length = width - length + 1).join(fill) : ""; - if (zcomma) before = formatGroup(padding + before, padding.length ? width - after.length : Infinity); - negative += prefix; - value = before + after; - return (align === "<" ? negative + value + padding : align === ">" ? padding + negative + value : align === "^" ? padding.substring(0, length >>= 1) + negative + value + padding.substring(length) : negative + (zcomma ? value : padding + value)) + fullSuffix; - }; - }; - } - var d3_format_re = /(?:([^{])?([<>=^]))?([+\- ])?([$#])?(0)?(\d+)?(,)?(\.-?\d+)?([a-z%])?/i; - var d3_format_types = d3.map({ - b: function(x) { - return x.toString(2); - }, - c: function(x) { - return String.fromCharCode(x); - }, - o: function(x) { - return x.toString(8); - }, - x: function(x) { - return x.toString(16); - }, - X: function(x) { - return x.toString(16).toUpperCase(); - }, - g: function(x, p) { - return x.toPrecision(p); - }, - e: function(x, p) { - return x.toExponential(p); - }, - f: function(x, p) { - return x.toFixed(p); - }, - r: function(x, p) { - return (x = d3.round(x, d3_format_precision(x, p))).toFixed(Math.max(0, Math.min(20, d3_format_precision(x * (1 + 1e-15), p)))); - } - }); - function d3_format_typeDefault(x) { - return x + ""; - } - var d3_time = d3.time = {}, d3_date = Date; - function d3_date_utc() { - this._ = new Date(arguments.length > 1 ? Date.UTC.apply(this, arguments) : arguments[0]); - } - d3_date_utc.prototype = { - getDate: function() { - return this._.getUTCDate(); - }, - getDay: function() { - return this._.getUTCDay(); - }, - getFullYear: function() { - return this._.getUTCFullYear(); - }, - getHours: function() { - return this._.getUTCHours(); - }, - getMilliseconds: function() { - return this._.getUTCMilliseconds(); - }, - getMinutes: function() { - return this._.getUTCMinutes(); - }, - getMonth: function() { - return this._.getUTCMonth(); - }, - getSeconds: function() { - return this._.getUTCSeconds(); - }, - getTime: function() { - return this._.getTime(); - }, - getTimezoneOffset: function() { - return 0; - }, - valueOf: function() { - return this._.valueOf(); - }, - setDate: function() { - d3_time_prototype.setUTCDate.apply(this._, arguments); - }, - setDay: function() { - d3_time_prototype.setUTCDay.apply(this._, arguments); - }, - setFullYear: function() { - d3_time_prototype.setUTCFullYear.apply(this._, arguments); - }, - setHours: function() { - d3_time_prototype.setUTCHours.apply(this._, arguments); - }, - setMilliseconds: function() { - d3_time_prototype.setUTCMilliseconds.apply(this._, arguments); - }, - setMinutes: function() { - d3_time_prototype.setUTCMinutes.apply(this._, arguments); - }, - setMonth: function() { - d3_time_prototype.setUTCMonth.apply(this._, arguments); - }, - setSeconds: function() { - d3_time_prototype.setUTCSeconds.apply(this._, arguments); - }, - setTime: function() { - d3_time_prototype.setTime.apply(this._, arguments); - } - }; - var d3_time_prototype = Date.prototype; - function d3_time_interval(local, step, number) { - function round(date) { - var d0 = local(date), d1 = offset(d0, 1); - return date - d0 < d1 - date ? d0 : d1; - } - function ceil(date) { - step(date = local(new d3_date(date - 1)), 1); - return date; - } - function offset(date, k) { - step(date = new d3_date(+date), k); - return date; - } - function range(t0, t1, dt) { - var time = ceil(t0), times = []; - if (dt > 1) { - while (time < t1) { - if (!(number(time) % dt)) times.push(new Date(+time)); - step(time, 1); - } - } else { - while (time < t1) times.push(new Date(+time)), step(time, 1); - } - return times; - } - function range_utc(t0, t1, dt) { - try { - d3_date = d3_date_utc; - var utc = new d3_date_utc(); - utc._ = t0; - return range(utc, t1, dt); - } finally { - d3_date = Date; - } - } - local.floor = local; - local.round = round; - local.ceil = ceil; - local.offset = offset; - local.range = range; - var utc = local.utc = d3_time_interval_utc(local); - utc.floor = utc; - utc.round = d3_time_interval_utc(round); - utc.ceil = d3_time_interval_utc(ceil); - utc.offset = d3_time_interval_utc(offset); - utc.range = range_utc; - return local; - } - function d3_time_interval_utc(method) { - return function(date, k) { - try { - d3_date = d3_date_utc; - var utc = new d3_date_utc(); - utc._ = date; - return method(utc, k)._; - } finally { - d3_date = Date; - } - }; - } - d3_time.year = d3_time_interval(function(date) { - date = d3_time.day(date); - date.setMonth(0, 1); - return date; - }, function(date, offset) { - date.setFullYear(date.getFullYear() + offset); - }, function(date) { - return date.getFullYear(); - }); - d3_time.years = d3_time.year.range; - d3_time.years.utc = d3_time.year.utc.range; - d3_time.day = d3_time_interval(function(date) { - var day = new d3_date(2e3, 0); - day.setFullYear(date.getFullYear(), date.getMonth(), date.getDate()); - return day; - }, function(date, offset) { - date.setDate(date.getDate() + offset); - }, function(date) { - return date.getDate() - 1; - }); - d3_time.days = d3_time.day.range; - d3_time.days.utc = d3_time.day.utc.range; - d3_time.dayOfYear = function(date) { - var year = d3_time.year(date); - return Math.floor((date - year - (date.getTimezoneOffset() - year.getTimezoneOffset()) * 6e4) / 864e5); - }; - [ "sunday", "monday", "tuesday", "wednesday", "thursday", "friday", "saturday" ].forEach(function(day, i) { - i = 7 - i; - var interval = d3_time[day] = d3_time_interval(function(date) { - (date = d3_time.day(date)).setDate(date.getDate() - (date.getDay() + i) % 7); - return date; - }, function(date, offset) { - date.setDate(date.getDate() + Math.floor(offset) * 7); - }, function(date) { - var day = d3_time.year(date).getDay(); - return Math.floor((d3_time.dayOfYear(date) + (day + i) % 7) / 7) - (day !== i); - }); - d3_time[day + "s"] = interval.range; - d3_time[day + "s"].utc = interval.utc.range; - d3_time[day + "OfYear"] = function(date) { - var day = d3_time.year(date).getDay(); - return Math.floor((d3_time.dayOfYear(date) + (day + i) % 7) / 7); - }; - }); - d3_time.week = d3_time.sunday; - d3_time.weeks = d3_time.sunday.range; - d3_time.weeks.utc = d3_time.sunday.utc.range; - d3_time.weekOfYear = d3_time.sundayOfYear; - function d3_locale_timeFormat(locale) { - var locale_dateTime = locale.dateTime, locale_date = locale.date, locale_time = locale.time, locale_periods = locale.periods, locale_days = locale.days, locale_shortDays = locale.shortDays, locale_months = locale.months, locale_shortMonths = locale.shortMonths; - function d3_time_format(template) { - var n = template.length; - function format(date) { - var string = [], i = -1, j = 0, c, p, f; - while (++i < n) { - if (template.charCodeAt(i) === 37) { - string.push(template.slice(j, i)); - if ((p = d3_time_formatPads[c = template.charAt(++i)]) != null) c = template.charAt(++i); - if (f = d3_time_formats[c]) c = f(date, p == null ? c === "e" ? " " : "0" : p); - string.push(c); - j = i + 1; - } - } - string.push(template.slice(j, i)); - return string.join(""); - } - format.parse = function(string) { - var d = { - y: 1900, - m: 0, - d: 1, - H: 0, - M: 0, - S: 0, - L: 0, - Z: null - }, i = d3_time_parse(d, template, string, 0); - if (i != string.length) return null; - if ("p" in d) d.H = d.H % 12 + d.p * 12; - var localZ = d.Z != null && d3_date !== d3_date_utc, date = new (localZ ? d3_date_utc : d3_date)(); - if ("j" in d) date.setFullYear(d.y, 0, d.j); else if ("W" in d || "U" in d) { - if (!("w" in d)) d.w = "W" in d ? 1 : 0; - date.setFullYear(d.y, 0, 1); - date.setFullYear(d.y, 0, "W" in d ? (d.w + 6) % 7 + d.W * 7 - (date.getDay() + 5) % 7 : d.w + d.U * 7 - (date.getDay() + 6) % 7); - } else date.setFullYear(d.y, d.m, d.d); - date.setHours(d.H + (d.Z / 100 | 0), d.M + d.Z % 100, d.S, d.L); - return localZ ? date._ : date; - }; - format.toString = function() { - return template; - }; - return format; - } - function d3_time_parse(date, template, string, j) { - var c, p, t, i = 0, n = template.length, m = string.length; - while (i < n) { - if (j >= m) return -1; - c = template.charCodeAt(i++); - if (c === 37) { - t = template.charAt(i++); - p = d3_time_parsers[t in d3_time_formatPads ? template.charAt(i++) : t]; - if (!p || (j = p(date, string, j)) < 0) return -1; - } else if (c != string.charCodeAt(j++)) { - return -1; - } - } - return j; - } - d3_time_format.utc = function(template) { - var local = d3_time_format(template); - function format(date) { - try { - d3_date = d3_date_utc; - var utc = new d3_date(); - utc._ = date; - return local(utc); - } finally { - d3_date = Date; - } - } - format.parse = function(string) { - try { - d3_date = d3_date_utc; - var date = local.parse(string); - return date && date._; - } finally { - d3_date = Date; - } - }; - format.toString = local.toString; - return format; - }; - d3_time_format.multi = d3_time_format.utc.multi = d3_time_formatMulti; - var d3_time_periodLookup = d3.map(), d3_time_dayRe = d3_time_formatRe(locale_days), d3_time_dayLookup = d3_time_formatLookup(locale_days), d3_time_dayAbbrevRe = d3_time_formatRe(locale_shortDays), d3_time_dayAbbrevLookup = d3_time_formatLookup(locale_shortDays), d3_time_monthRe = d3_time_formatRe(locale_months), d3_time_monthLookup = d3_time_formatLookup(locale_months), d3_time_monthAbbrevRe = d3_time_formatRe(locale_shortMonths), d3_time_monthAbbrevLookup = d3_time_formatLookup(locale_shortMonths); - locale_periods.forEach(function(p, i) { - d3_time_periodLookup.set(p.toLowerCase(), i); - }); - var d3_time_formats = { - a: function(d) { - return locale_shortDays[d.getDay()]; - }, - A: function(d) { - return locale_days[d.getDay()]; - }, - b: function(d) { - return locale_shortMonths[d.getMonth()]; - }, - B: function(d) { - return locale_months[d.getMonth()]; - }, - c: d3_time_format(locale_dateTime), - d: function(d, p) { - return d3_time_formatPad(d.getDate(), p, 2); - }, - e: function(d, p) { - return d3_time_formatPad(d.getDate(), p, 2); - }, - H: function(d, p) { - return d3_time_formatPad(d.getHours(), p, 2); - }, - I: function(d, p) { - return d3_time_formatPad(d.getHours() % 12 || 12, p, 2); - }, - j: function(d, p) { - return d3_time_formatPad(1 + d3_time.dayOfYear(d), p, 3); - }, - L: function(d, p) { - return d3_time_formatPad(d.getMilliseconds(), p, 3); - }, - m: function(d, p) { - return d3_time_formatPad(d.getMonth() + 1, p, 2); - }, - M: function(d, p) { - return d3_time_formatPad(d.getMinutes(), p, 2); - }, - p: function(d) { - return locale_periods[+(d.getHours() >= 12)]; - }, - S: function(d, p) { - return d3_time_formatPad(d.getSeconds(), p, 2); - }, - U: function(d, p) { - return d3_time_formatPad(d3_time.sundayOfYear(d), p, 2); - }, - w: function(d) { - return d.getDay(); - }, - W: function(d, p) { - return d3_time_formatPad(d3_time.mondayOfYear(d), p, 2); - }, - x: d3_time_format(locale_date), - X: d3_time_format(locale_time), - y: function(d, p) { - return d3_time_formatPad(d.getFullYear() % 100, p, 2); - }, - Y: function(d, p) { - return d3_time_formatPad(d.getFullYear() % 1e4, p, 4); - }, - Z: d3_time_zone, - "%": function() { - return "%"; - } - }; - var d3_time_parsers = { - a: d3_time_parseWeekdayAbbrev, - A: d3_time_parseWeekday, - b: d3_time_parseMonthAbbrev, - B: d3_time_parseMonth, - c: d3_time_parseLocaleFull, - d: d3_time_parseDay, - e: d3_time_parseDay, - H: d3_time_parseHour24, - I: d3_time_parseHour24, - j: d3_time_parseDayOfYear, - L: d3_time_parseMilliseconds, - m: d3_time_parseMonthNumber, - M: d3_time_parseMinutes, - p: d3_time_parseAmPm, - S: d3_time_parseSeconds, - U: d3_time_parseWeekNumberSunday, - w: d3_time_parseWeekdayNumber, - W: d3_time_parseWeekNumberMonday, - x: d3_time_parseLocaleDate, - X: d3_time_parseLocaleTime, - y: d3_time_parseYear, - Y: d3_time_parseFullYear, - Z: d3_time_parseZone, - "%": d3_time_parseLiteralPercent - }; - function d3_time_parseWeekdayAbbrev(date, string, i) { - d3_time_dayAbbrevRe.lastIndex = 0; - var n = d3_time_dayAbbrevRe.exec(string.slice(i)); - return n ? (date.w = d3_time_dayAbbrevLookup.get(n[0].toLowerCase()), i + n[0].length) : -1; - } - function d3_time_parseWeekday(date, string, i) { - d3_time_dayRe.lastIndex = 0; - var n = d3_time_dayRe.exec(string.slice(i)); - return n ? (date.w = d3_time_dayLookup.get(n[0].toLowerCase()), i + n[0].length) : -1; - } - function d3_time_parseMonthAbbrev(date, string, i) { - d3_time_monthAbbrevRe.lastIndex = 0; - var n = d3_time_monthAbbrevRe.exec(string.slice(i)); - return n ? (date.m = d3_time_monthAbbrevLookup.get(n[0].toLowerCase()), i + n[0].length) : -1; - } - function d3_time_parseMonth(date, string, i) { - d3_time_monthRe.lastIndex = 0; - var n = d3_time_monthRe.exec(string.slice(i)); - return n ? (date.m = d3_time_monthLookup.get(n[0].toLowerCase()), i + n[0].length) : -1; - } - function d3_time_parseLocaleFull(date, string, i) { - return d3_time_parse(date, d3_time_formats.c.toString(), string, i); - } - function d3_time_parseLocaleDate(date, string, i) { - return d3_time_parse(date, d3_time_formats.x.toString(), string, i); - } - function d3_time_parseLocaleTime(date, string, i) { - return d3_time_parse(date, d3_time_formats.X.toString(), string, i); - } - function d3_time_parseAmPm(date, string, i) { - var n = d3_time_periodLookup.get(string.slice(i, i += 2).toLowerCase()); - return n == null ? -1 : (date.p = n, i); - } - return d3_time_format; - } - var d3_time_formatPads = { - "-": "", - _: " ", - "0": "0" - }, d3_time_numberRe = /^\s*\d+/, d3_time_percentRe = /^%/; - function d3_time_formatPad(value, fill, width) { - var sign = value < 0 ? "-" : "", string = (sign ? -value : value) + "", length = string.length; - return sign + (length < width ? new Array(width - length + 1).join(fill) + string : string); - } - function d3_time_formatRe(names) { - return new RegExp("^(?:" + names.map(d3.requote).join("|") + ")", "i"); - } - function d3_time_formatLookup(names) { - var map = new d3_Map(), i = -1, n = names.length; - while (++i < n) map.set(names[i].toLowerCase(), i); - return map; - } - function d3_time_parseWeekdayNumber(date, string, i) { - d3_time_numberRe.lastIndex = 0; - var n = d3_time_numberRe.exec(string.slice(i, i + 1)); - return n ? (date.w = +n[0], i + n[0].length) : -1; - } - function d3_time_parseWeekNumberSunday(date, string, i) { - d3_time_numberRe.lastIndex = 0; - var n = d3_time_numberRe.exec(string.slice(i)); - return n ? (date.U = +n[0], i + n[0].length) : -1; - } - function d3_time_parseWeekNumberMonday(date, string, i) { - d3_time_numberRe.lastIndex = 0; - var n = d3_time_numberRe.exec(string.slice(i)); - return n ? (date.W = +n[0], i + n[0].length) : -1; - } - function d3_time_parseFullYear(date, string, i) { - d3_time_numberRe.lastIndex = 0; - var n = d3_time_numberRe.exec(string.slice(i, i + 4)); - return n ? (date.y = +n[0], i + n[0].length) : -1; - } - function d3_time_parseYear(date, string, i) { - d3_time_numberRe.lastIndex = 0; - var n = d3_time_numberRe.exec(string.slice(i, i + 2)); - return n ? (date.y = d3_time_expandYear(+n[0]), i + n[0].length) : -1; - } - function d3_time_parseZone(date, string, i) { - return /^[+-]\d{4}$/.test(string = string.slice(i, i + 5)) ? (date.Z = -string, - i + 5) : -1; - } - function d3_time_expandYear(d) { - return d + (d > 68 ? 1900 : 2e3); - } - function d3_time_parseMonthNumber(date, string, i) { - d3_time_numberRe.lastIndex = 0; - var n = d3_time_numberRe.exec(string.slice(i, i + 2)); - return n ? (date.m = n[0] - 1, i + n[0].length) : -1; - } - function d3_time_parseDay(date, string, i) { - d3_time_numberRe.lastIndex = 0; - var n = d3_time_numberRe.exec(string.slice(i, i + 2)); - return n ? (date.d = +n[0], i + n[0].length) : -1; - } - function d3_time_parseDayOfYear(date, string, i) { - d3_time_numberRe.lastIndex = 0; - var n = d3_time_numberRe.exec(string.slice(i, i + 3)); - return n ? (date.j = +n[0], i + n[0].length) : -1; - } - function d3_time_parseHour24(date, string, i) { - d3_time_numberRe.lastIndex = 0; - var n = d3_time_numberRe.exec(string.slice(i, i + 2)); - return n ? (date.H = +n[0], i + n[0].length) : -1; - } - function d3_time_parseMinutes(date, string, i) { - d3_time_numberRe.lastIndex = 0; - var n = d3_time_numberRe.exec(string.slice(i, i + 2)); - return n ? (date.M = +n[0], i + n[0].length) : -1; - } - function d3_time_parseSeconds(date, string, i) { - d3_time_numberRe.lastIndex = 0; - var n = d3_time_numberRe.exec(string.slice(i, i + 2)); - return n ? (date.S = +n[0], i + n[0].length) : -1; - } - function d3_time_parseMilliseconds(date, string, i) { - d3_time_numberRe.lastIndex = 0; - var n = d3_time_numberRe.exec(string.slice(i, i + 3)); - return n ? (date.L = +n[0], i + n[0].length) : -1; - } - function d3_time_zone(d) { - var z = d.getTimezoneOffset(), zs = z > 0 ? "-" : "+", zh = abs(z) / 60 | 0, zm = abs(z) % 60; - return zs + d3_time_formatPad(zh, "0", 2) + d3_time_formatPad(zm, "0", 2); - } - function d3_time_parseLiteralPercent(date, string, i) { - d3_time_percentRe.lastIndex = 0; - var n = d3_time_percentRe.exec(string.slice(i, i + 1)); - return n ? i + n[0].length : -1; - } - function d3_time_formatMulti(formats) { - var n = formats.length, i = -1; - while (++i < n) formats[i][0] = this(formats[i][0]); - return function(date) { - var i = 0, f = formats[i]; - while (!f[1](date)) f = formats[++i]; - return f[0](date); - }; - } - d3.locale = function(locale) { - return { - numberFormat: d3_locale_numberFormat(locale), - timeFormat: d3_locale_timeFormat(locale) - }; - }; - var d3_locale_enUS = d3.locale({ - decimal: ".", - thousands: ",", - grouping: [ 3 ], - currency: [ "$", "" ], - dateTime: "%a %b %e %X %Y", - date: "%m/%d/%Y", - time: "%H:%M:%S", - periods: [ "AM", "PM" ], - days: [ "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" ], - shortDays: [ "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" ], - months: [ "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" ], - shortMonths: [ "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" ] - }); - d3.format = d3_locale_enUS.numberFormat; - d3.geo = {}; - function d3_adder() {} - d3_adder.prototype = { - s: 0, - t: 0, - add: function(y) { - d3_adderSum(y, this.t, d3_adderTemp); - d3_adderSum(d3_adderTemp.s, this.s, this); - if (this.s) this.t += d3_adderTemp.t; else this.s = d3_adderTemp.t; - }, - reset: function() { - this.s = this.t = 0; - }, - valueOf: function() { - return this.s; - } - }; - var d3_adderTemp = new d3_adder(); - function d3_adderSum(a, b, o) { - var x = o.s = a + b, bv = x - a, av = x - bv; - o.t = a - av + (b - bv); - } - d3.geo.stream = function(object, listener) { - if (object && d3_geo_streamObjectType.hasOwnProperty(object.type)) { - d3_geo_streamObjectType[object.type](object, listener); - } else { - d3_geo_streamGeometry(object, listener); - } - }; - function d3_geo_streamGeometry(geometry, listener) { - if (geometry && d3_geo_streamGeometryType.hasOwnProperty(geometry.type)) { - d3_geo_streamGeometryType[geometry.type](geometry, listener); - } - } - var d3_geo_streamObjectType = { - Feature: function(feature, listener) { - d3_geo_streamGeometry(feature.geometry, listener); - }, - FeatureCollection: function(object, listener) { - var features = object.features, i = -1, n = features.length; - while (++i < n) d3_geo_streamGeometry(features[i].geometry, listener); - } - }; - var d3_geo_streamGeometryType = { - Sphere: function(object, listener) { - listener.sphere(); - }, - Point: function(object, listener) { - object = object.coordinates; - listener.point(object[0], object[1], object[2]); - }, - MultiPoint: function(object, listener) { - var coordinates = object.coordinates, i = -1, n = coordinates.length; - while (++i < n) object = coordinates[i], listener.point(object[0], object[1], object[2]); - }, - LineString: function(object, listener) { - d3_geo_streamLine(object.coordinates, listener, 0); - }, - MultiLineString: function(object, listener) { - var coordinates = object.coordinates, i = -1, n = coordinates.length; - while (++i < n) d3_geo_streamLine(coordinates[i], listener, 0); - }, - Polygon: function(object, listener) { - d3_geo_streamPolygon(object.coordinates, listener); - }, - MultiPolygon: function(object, listener) { - var coordinates = object.coordinates, i = -1, n = coordinates.length; - while (++i < n) d3_geo_streamPolygon(coordinates[i], listener); - }, - GeometryCollection: function(object, listener) { - var geometries = object.geometries, i = -1, n = geometries.length; - while (++i < n) d3_geo_streamGeometry(geometries[i], listener); - } - }; - function d3_geo_streamLine(coordinates, listener, closed) { - var i = -1, n = coordinates.length - closed, coordinate; - listener.lineStart(); - while (++i < n) coordinate = coordinates[i], listener.point(coordinate[0], coordinate[1], coordinate[2]); - listener.lineEnd(); - } - function d3_geo_streamPolygon(coordinates, listener) { - var i = -1, n = coordinates.length; - listener.polygonStart(); - while (++i < n) d3_geo_streamLine(coordinates[i], listener, 1); - listener.polygonEnd(); - } - d3.geo.area = function(object) { - d3_geo_areaSum = 0; - d3.geo.stream(object, d3_geo_area); - return d3_geo_areaSum; - }; - var d3_geo_areaSum, d3_geo_areaRingSum = new d3_adder(); - var d3_geo_area = { - sphere: function() { - d3_geo_areaSum += 4 * π; - }, - point: d3_noop, - lineStart: d3_noop, - lineEnd: d3_noop, - polygonStart: function() { - d3_geo_areaRingSum.reset(); - d3_geo_area.lineStart = d3_geo_areaRingStart; - }, - polygonEnd: function() { - var area = 2 * d3_geo_areaRingSum; - d3_geo_areaSum += area < 0 ? 4 * π + area : area; - d3_geo_area.lineStart = d3_geo_area.lineEnd = d3_geo_area.point = d3_noop; - } - }; - function d3_geo_areaRingStart() { - var λ00, φ00, λ0, cosφ0, sinφ0; - d3_geo_area.point = function(λ, φ) { - d3_geo_area.point = nextPoint; - λ0 = (λ00 = λ) * d3_radians, cosφ0 = Math.cos(φ = (φ00 = φ) * d3_radians / 2 + π / 4), - sinφ0 = Math.sin(φ); - }; - function nextPoint(λ, φ) { - λ *= d3_radians; - φ = φ * d3_radians / 2 + π / 4; - var dλ = λ - λ0, sdλ = dλ >= 0 ? 1 : -1, adλ = sdλ * dλ, cosφ = Math.cos(φ), sinφ = Math.sin(φ), k = sinφ0 * sinφ, u = cosφ0 * cosφ + k * Math.cos(adλ), v = k * sdλ * Math.sin(adλ); - d3_geo_areaRingSum.add(Math.atan2(v, u)); - λ0 = λ, cosφ0 = cosφ, sinφ0 = sinφ; - } - d3_geo_area.lineEnd = function() { - nextPoint(λ00, φ00); - }; - } - function d3_geo_cartesian(spherical) { - var λ = spherical[0], φ = spherical[1], cosφ = Math.cos(φ); - return [ cosφ * Math.cos(λ), cosφ * Math.sin(λ), Math.sin(φ) ]; - } - function d3_geo_cartesianDot(a, b) { - return a[0] * b[0] + a[1] * b[1] + a[2] * b[2]; - } - function d3_geo_cartesianCross(a, b) { - return [ a[1] * b[2] - a[2] * b[1], a[2] * b[0] - a[0] * b[2], a[0] * b[1] - a[1] * b[0] ]; - } - function d3_geo_cartesianAdd(a, b) { - a[0] += b[0]; - a[1] += b[1]; - a[2] += b[2]; - } - function d3_geo_cartesianScale(vector, k) { - return [ vector[0] * k, vector[1] * k, vector[2] * k ]; - } - function d3_geo_cartesianNormalize(d) { - var l = Math.sqrt(d[0] * d[0] + d[1] * d[1] + d[2] * d[2]); - d[0] /= l; - d[1] /= l; - d[2] /= l; - } - function d3_geo_spherical(cartesian) { - return [ Math.atan2(cartesian[1], cartesian[0]), d3_asin(cartesian[2]) ]; - } - function d3_geo_sphericalEqual(a, b) { - return abs(a[0] - b[0]) < ε && abs(a[1] - b[1]) < ε; - } - d3.geo.bounds = function() { - var λ0, φ0, λ1, φ1, λ_, λ__, φ__, p0, dλSum, ranges, range; - var bound = { - point: point, - lineStart: lineStart, - lineEnd: lineEnd, - polygonStart: function() { - bound.point = ringPoint; - bound.lineStart = ringStart; - bound.lineEnd = ringEnd; - dλSum = 0; - d3_geo_area.polygonStart(); - }, - polygonEnd: function() { - d3_geo_area.polygonEnd(); - bound.point = point; - bound.lineStart = lineStart; - bound.lineEnd = lineEnd; - if (d3_geo_areaRingSum < 0) λ0 = -(λ1 = 180), φ0 = -(φ1 = 90); else if (dλSum > ε) φ1 = 90; else if (dλSum < -ε) φ0 = -90; - range[0] = λ0, range[1] = λ1; - } - }; - function point(λ, φ) { - ranges.push(range = [ λ0 = λ, λ1 = λ ]); - if (φ < φ0) φ0 = φ; - if (φ > φ1) φ1 = φ; - } - function linePoint(λ, φ) { - var p = d3_geo_cartesian([ λ * d3_radians, φ * d3_radians ]); - if (p0) { - var normal = d3_geo_cartesianCross(p0, p), equatorial = [ normal[1], -normal[0], 0 ], inflection = d3_geo_cartesianCross(equatorial, normal); - d3_geo_cartesianNormalize(inflection); - inflection = d3_geo_spherical(inflection); - var dλ = λ - λ_, s = dλ > 0 ? 1 : -1, λi = inflection[0] * d3_degrees * s, antimeridian = abs(dλ) > 180; - if (antimeridian ^ (s * λ_ < λi && λi < s * λ)) { - var φi = inflection[1] * d3_degrees; - if (φi > φ1) φ1 = φi; - } else if (λi = (λi + 360) % 360 - 180, antimeridian ^ (s * λ_ < λi && λi < s * λ)) { - var φi = -inflection[1] * d3_degrees; - if (φi < φ0) φ0 = φi; - } else { - if (φ < φ0) φ0 = φ; - if (φ > φ1) φ1 = φ; - } - if (antimeridian) { - if (λ < λ_) { - if (angle(λ0, λ) > angle(λ0, λ1)) λ1 = λ; - } else { - if (angle(λ, λ1) > angle(λ0, λ1)) λ0 = λ; - } - } else { - if (λ1 >= λ0) { - if (λ < λ0) λ0 = λ; - if (λ > λ1) λ1 = λ; - } else { - if (λ > λ_) { - if (angle(λ0, λ) > angle(λ0, λ1)) λ1 = λ; - } else { - if (angle(λ, λ1) > angle(λ0, λ1)) λ0 = λ; - } - } - } - } else { - point(λ, φ); - } - p0 = p, λ_ = λ; - } - function lineStart() { - bound.point = linePoint; - } - function lineEnd() { - range[0] = λ0, range[1] = λ1; - bound.point = point; - p0 = null; - } - function ringPoint(λ, φ) { - if (p0) { - var dλ = λ - λ_; - dλSum += abs(dλ) > 180 ? dλ + (dλ > 0 ? 360 : -360) : dλ; - } else λ__ = λ, φ__ = φ; - d3_geo_area.point(λ, φ); - linePoint(λ, φ); - } - function ringStart() { - d3_geo_area.lineStart(); - } - function ringEnd() { - ringPoint(λ__, φ__); - d3_geo_area.lineEnd(); - if (abs(dλSum) > ε) λ0 = -(λ1 = 180); - range[0] = λ0, range[1] = λ1; - p0 = null; - } - function angle(λ0, λ1) { - return (λ1 -= λ0) < 0 ? λ1 + 360 : λ1; - } - function compareRanges(a, b) { - return a[0] - b[0]; - } - function withinRange(x, range) { - return range[0] <= range[1] ? range[0] <= x && x <= range[1] : x < range[0] || range[1] < x; - } - return function(feature) { - φ1 = λ1 = -(λ0 = φ0 = Infinity); - ranges = []; - d3.geo.stream(feature, bound); - var n = ranges.length; - if (n) { - ranges.sort(compareRanges); - for (var i = 1, a = ranges[0], b, merged = [ a ]; i < n; ++i) { - b = ranges[i]; - if (withinRange(b[0], a) || withinRange(b[1], a)) { - if (angle(a[0], b[1]) > angle(a[0], a[1])) a[1] = b[1]; - if (angle(b[0], a[1]) > angle(a[0], a[1])) a[0] = b[0]; - } else { - merged.push(a = b); - } - } - var best = -Infinity, dλ; - for (var n = merged.length - 1, i = 0, a = merged[n], b; i <= n; a = b, ++i) { - b = merged[i]; - if ((dλ = angle(a[1], b[0])) > best) best = dλ, λ0 = b[0], λ1 = a[1]; - } - } - ranges = range = null; - return λ0 === Infinity || φ0 === Infinity ? [ [ NaN, NaN ], [ NaN, NaN ] ] : [ [ λ0, φ0 ], [ λ1, φ1 ] ]; - }; - }(); - d3.geo.centroid = function(object) { - d3_geo_centroidW0 = d3_geo_centroidW1 = d3_geo_centroidX0 = d3_geo_centroidY0 = d3_geo_centroidZ0 = d3_geo_centroidX1 = d3_geo_centroidY1 = d3_geo_centroidZ1 = d3_geo_centroidX2 = d3_geo_centroidY2 = d3_geo_centroidZ2 = 0; - d3.geo.stream(object, d3_geo_centroid); - var x = d3_geo_centroidX2, y = d3_geo_centroidY2, z = d3_geo_centroidZ2, m = x * x + y * y + z * z; - if (m < ε2) { - x = d3_geo_centroidX1, y = d3_geo_centroidY1, z = d3_geo_centroidZ1; - if (d3_geo_centroidW1 < ε) x = d3_geo_centroidX0, y = d3_geo_centroidY0, z = d3_geo_centroidZ0; - m = x * x + y * y + z * z; - if (m < ε2) return [ NaN, NaN ]; - } - return [ Math.atan2(y, x) * d3_degrees, d3_asin(z / Math.sqrt(m)) * d3_degrees ]; - }; - var d3_geo_centroidW0, d3_geo_centroidW1, d3_geo_centroidX0, d3_geo_centroidY0, d3_geo_centroidZ0, d3_geo_centroidX1, d3_geo_centroidY1, d3_geo_centroidZ1, d3_geo_centroidX2, d3_geo_centroidY2, d3_geo_centroidZ2; - var d3_geo_centroid = { - sphere: d3_noop, - point: d3_geo_centroidPoint, - lineStart: d3_geo_centroidLineStart, - lineEnd: d3_geo_centroidLineEnd, - polygonStart: function() { - d3_geo_centroid.lineStart = d3_geo_centroidRingStart; - }, - polygonEnd: function() { - d3_geo_centroid.lineStart = d3_geo_centroidLineStart; - } - }; - function d3_geo_centroidPoint(λ, φ) { - λ *= d3_radians; - var cosφ = Math.cos(φ *= d3_radians); - d3_geo_centroidPointXYZ(cosφ * Math.cos(λ), cosφ * Math.sin(λ), Math.sin(φ)); - } - function d3_geo_centroidPointXYZ(x, y, z) { - ++d3_geo_centroidW0; - d3_geo_centroidX0 += (x - d3_geo_centroidX0) / d3_geo_centroidW0; - d3_geo_centroidY0 += (y - d3_geo_centroidY0) / d3_geo_centroidW0; - d3_geo_centroidZ0 += (z - d3_geo_centroidZ0) / d3_geo_centroidW0; - } - function d3_geo_centroidLineStart() { - var x0, y0, z0; - d3_geo_centroid.point = function(λ, φ) { - λ *= d3_radians; - var cosφ = Math.cos(φ *= d3_radians); - x0 = cosφ * Math.cos(λ); - y0 = cosφ * Math.sin(λ); - z0 = Math.sin(φ); - d3_geo_centroid.point = nextPoint; - d3_geo_centroidPointXYZ(x0, y0, z0); - }; - function nextPoint(λ, φ) { - λ *= d3_radians; - var cosφ = Math.cos(φ *= d3_radians), x = cosφ * Math.cos(λ), y = cosφ * Math.sin(λ), z = Math.sin(φ), w = Math.atan2(Math.sqrt((w = y0 * z - z0 * y) * w + (w = z0 * x - x0 * z) * w + (w = x0 * y - y0 * x) * w), x0 * x + y0 * y + z0 * z); - d3_geo_centroidW1 += w; - d3_geo_centroidX1 += w * (x0 + (x0 = x)); - d3_geo_centroidY1 += w * (y0 + (y0 = y)); - d3_geo_centroidZ1 += w * (z0 + (z0 = z)); - d3_geo_centroidPointXYZ(x0, y0, z0); - } - } - function d3_geo_centroidLineEnd() { - d3_geo_centroid.point = d3_geo_centroidPoint; - } - function d3_geo_centroidRingStart() { - var λ00, φ00, x0, y0, z0; - d3_geo_centroid.point = function(λ, φ) { - λ00 = λ, φ00 = φ; - d3_geo_centroid.point = nextPoint; - λ *= d3_radians; - var cosφ = Math.cos(φ *= d3_radians); - x0 = cosφ * Math.cos(λ); - y0 = cosφ * Math.sin(λ); - z0 = Math.sin(φ); - d3_geo_centroidPointXYZ(x0, y0, z0); - }; - d3_geo_centroid.lineEnd = function() { - nextPoint(λ00, φ00); - d3_geo_centroid.lineEnd = d3_geo_centroidLineEnd; - d3_geo_centroid.point = d3_geo_centroidPoint; - }; - function nextPoint(λ, φ) { - λ *= d3_radians; - var cosφ = Math.cos(φ *= d3_radians), x = cosφ * Math.cos(λ), y = cosφ * Math.sin(λ), z = Math.sin(φ), cx = y0 * z - z0 * y, cy = z0 * x - x0 * z, cz = x0 * y - y0 * x, m = Math.sqrt(cx * cx + cy * cy + cz * cz), u = x0 * x + y0 * y + z0 * z, v = m && -d3_acos(u) / m, w = Math.atan2(m, u); - d3_geo_centroidX2 += v * cx; - d3_geo_centroidY2 += v * cy; - d3_geo_centroidZ2 += v * cz; - d3_geo_centroidW1 += w; - d3_geo_centroidX1 += w * (x0 + (x0 = x)); - d3_geo_centroidY1 += w * (y0 + (y0 = y)); - d3_geo_centroidZ1 += w * (z0 + (z0 = z)); - d3_geo_centroidPointXYZ(x0, y0, z0); - } - } - function d3_geo_compose(a, b) { - function compose(x, y) { - return x = a(x, y), b(x[0], x[1]); - } - if (a.invert && b.invert) compose.invert = function(x, y) { - return x = b.invert(x, y), x && a.invert(x[0], x[1]); - }; - return compose; - } - function d3_true() { - return true; - } - function d3_geo_clipPolygon(segments, compare, clipStartInside, interpolate, listener) { - var subject = [], clip = []; - segments.forEach(function(segment) { - if ((n = segment.length - 1) <= 0) return; - var n, p0 = segment[0], p1 = segment[n]; - if (d3_geo_sphericalEqual(p0, p1)) { - listener.lineStart(); - for (var i = 0; i < n; ++i) listener.point((p0 = segment[i])[0], p0[1]); - listener.lineEnd(); - return; - } - var a = new d3_geo_clipPolygonIntersection(p0, segment, null, true), b = new d3_geo_clipPolygonIntersection(p0, null, a, false); - a.o = b; - subject.push(a); - clip.push(b); - a = new d3_geo_clipPolygonIntersection(p1, segment, null, false); - b = new d3_geo_clipPolygonIntersection(p1, null, a, true); - a.o = b; - subject.push(a); - clip.push(b); - }); - clip.sort(compare); - d3_geo_clipPolygonLinkCircular(subject); - d3_geo_clipPolygonLinkCircular(clip); - if (!subject.length) return; - for (var i = 0, entry = clipStartInside, n = clip.length; i < n; ++i) { - clip[i].e = entry = !entry; - } - var start = subject[0], points, point; - while (1) { - var current = start, isSubject = true; - while (current.v) if ((current = current.n) === start) return; - points = current.z; - listener.lineStart(); - do { - current.v = current.o.v = true; - if (current.e) { - if (isSubject) { - for (var i = 0, n = points.length; i < n; ++i) listener.point((point = points[i])[0], point[1]); - } else { - interpolate(current.x, current.n.x, 1, listener); - } - current = current.n; - } else { - if (isSubject) { - points = current.p.z; - for (var i = points.length - 1; i >= 0; --i) listener.point((point = points[i])[0], point[1]); - } else { - interpolate(current.x, current.p.x, -1, listener); - } - current = current.p; - } - current = current.o; - points = current.z; - isSubject = !isSubject; - } while (!current.v); - listener.lineEnd(); - } - } - function d3_geo_clipPolygonLinkCircular(array) { - if (!(n = array.length)) return; - var n, i = 0, a = array[0], b; - while (++i < n) { - a.n = b = array[i]; - b.p = a; - a = b; - } - a.n = b = array[0]; - b.p = a; - } - function d3_geo_clipPolygonIntersection(point, points, other, entry) { - this.x = point; - this.z = points; - this.o = other; - this.e = entry; - this.v = false; - this.n = this.p = null; - } - function d3_geo_clip(pointVisible, clipLine, interpolate, clipStart) { - return function(rotate, listener) { - var line = clipLine(listener), rotatedClipStart = rotate.invert(clipStart[0], clipStart[1]); - var clip = { - point: point, - lineStart: lineStart, - lineEnd: lineEnd, - polygonStart: function() { - clip.point = pointRing; - clip.lineStart = ringStart; - clip.lineEnd = ringEnd; - segments = []; - polygon = []; - }, - polygonEnd: function() { - clip.point = point; - clip.lineStart = lineStart; - clip.lineEnd = lineEnd; - segments = d3.merge(segments); - var clipStartInside = d3_geo_pointInPolygon(rotatedClipStart, polygon); - if (segments.length) { - if (!polygonStarted) listener.polygonStart(), polygonStarted = true; - d3_geo_clipPolygon(segments, d3_geo_clipSort, clipStartInside, interpolate, listener); - } else if (clipStartInside) { - if (!polygonStarted) listener.polygonStart(), polygonStarted = true; - listener.lineStart(); - interpolate(null, null, 1, listener); - listener.lineEnd(); - } - if (polygonStarted) listener.polygonEnd(), polygonStarted = false; - segments = polygon = null; - }, - sphere: function() { - listener.polygonStart(); - listener.lineStart(); - interpolate(null, null, 1, listener); - listener.lineEnd(); - listener.polygonEnd(); - } - }; - function point(λ, φ) { - var point = rotate(λ, φ); - if (pointVisible(λ = point[0], φ = point[1])) listener.point(λ, φ); - } - function pointLine(λ, φ) { - var point = rotate(λ, φ); - line.point(point[0], point[1]); - } - function lineStart() { - clip.point = pointLine; - line.lineStart(); - } - function lineEnd() { - clip.point = point; - line.lineEnd(); - } - var segments; - var buffer = d3_geo_clipBufferListener(), ringListener = clipLine(buffer), polygonStarted = false, polygon, ring; - function pointRing(λ, φ) { - ring.push([ λ, φ ]); - var point = rotate(λ, φ); - ringListener.point(point[0], point[1]); - } - function ringStart() { - ringListener.lineStart(); - ring = []; - } - function ringEnd() { - pointRing(ring[0][0], ring[0][1]); - ringListener.lineEnd(); - var clean = ringListener.clean(), ringSegments = buffer.buffer(), segment, n = ringSegments.length; - ring.pop(); - polygon.push(ring); - ring = null; - if (!n) return; - if (clean & 1) { - segment = ringSegments[0]; - var n = segment.length - 1, i = -1, point; - if (n > 0) { - if (!polygonStarted) listener.polygonStart(), polygonStarted = true; - listener.lineStart(); - while (++i < n) listener.point((point = segment[i])[0], point[1]); - listener.lineEnd(); - } - return; - } - if (n > 1 && clean & 2) ringSegments.push(ringSegments.pop().concat(ringSegments.shift())); - segments.push(ringSegments.filter(d3_geo_clipSegmentLength1)); - } - return clip; - }; - } - function d3_geo_clipSegmentLength1(segment) { - return segment.length > 1; - } - function d3_geo_clipBufferListener() { - var lines = [], line; - return { - lineStart: function() { - lines.push(line = []); - }, - point: function(λ, φ) { - line.push([ λ, φ ]); - }, - lineEnd: d3_noop, - buffer: function() { - var buffer = lines; - lines = []; - line = null; - return buffer; - }, - rejoin: function() { - if (lines.length > 1) lines.push(lines.pop().concat(lines.shift())); - } - }; - } - function d3_geo_clipSort(a, b) { - return ((a = a.x)[0] < 0 ? a[1] - halfπ - ε : halfπ - a[1]) - ((b = b.x)[0] < 0 ? b[1] - halfπ - ε : halfπ - b[1]); - } - var d3_geo_clipAntimeridian = d3_geo_clip(d3_true, d3_geo_clipAntimeridianLine, d3_geo_clipAntimeridianInterpolate, [ -π, -π / 2 ]); - function d3_geo_clipAntimeridianLine(listener) { - var λ0 = NaN, φ0 = NaN, sλ0 = NaN, clean; - return { - lineStart: function() { - listener.lineStart(); - clean = 1; - }, - point: function(λ1, φ1) { - var sλ1 = λ1 > 0 ? π : -π, dλ = abs(λ1 - λ0); - if (abs(dλ - π) < ε) { - listener.point(λ0, φ0 = (φ0 + φ1) / 2 > 0 ? halfπ : -halfπ); - listener.point(sλ0, φ0); - listener.lineEnd(); - listener.lineStart(); - listener.point(sλ1, φ0); - listener.point(λ1, φ0); - clean = 0; - } else if (sλ0 !== sλ1 && dλ >= π) { - if (abs(λ0 - sλ0) < ε) λ0 -= sλ0 * ε; - if (abs(λ1 - sλ1) < ε) λ1 -= sλ1 * ε; - φ0 = d3_geo_clipAntimeridianIntersect(λ0, φ0, λ1, φ1); - listener.point(sλ0, φ0); - listener.lineEnd(); - listener.lineStart(); - listener.point(sλ1, φ0); - clean = 0; - } - listener.point(λ0 = λ1, φ0 = φ1); - sλ0 = sλ1; - }, - lineEnd: function() { - listener.lineEnd(); - λ0 = φ0 = NaN; - }, - clean: function() { - return 2 - clean; - } - }; - } - function d3_geo_clipAntimeridianIntersect(λ0, φ0, λ1, φ1) { - var cosφ0, cosφ1, sinλ0_λ1 = Math.sin(λ0 - λ1); - return abs(sinλ0_λ1) > ε ? Math.atan((Math.sin(φ0) * (cosφ1 = Math.cos(φ1)) * Math.sin(λ1) - Math.sin(φ1) * (cosφ0 = Math.cos(φ0)) * Math.sin(λ0)) / (cosφ0 * cosφ1 * sinλ0_λ1)) : (φ0 + φ1) / 2; - } - function d3_geo_clipAntimeridianInterpolate(from, to, direction, listener) { - var φ; - if (from == null) { - φ = direction * halfπ; - listener.point(-π, φ); - listener.point(0, φ); - listener.point(π, φ); - listener.point(π, 0); - listener.point(π, -φ); - listener.point(0, -φ); - listener.point(-π, -φ); - listener.point(-π, 0); - listener.point(-π, φ); - } else if (abs(from[0] - to[0]) > ε) { - var s = from[0] < to[0] ? π : -π; - φ = direction * s / 2; - listener.point(-s, φ); - listener.point(0, φ); - listener.point(s, φ); - } else { - listener.point(to[0], to[1]); - } - } - function d3_geo_pointInPolygon(point, polygon) { - var meridian = point[0], parallel = point[1], meridianNormal = [ Math.sin(meridian), -Math.cos(meridian), 0 ], polarAngle = 0, winding = 0; - d3_geo_areaRingSum.reset(); - for (var i = 0, n = polygon.length; i < n; ++i) { - var ring = polygon[i], m = ring.length; - if (!m) continue; - var point0 = ring[0], λ0 = point0[0], φ0 = point0[1] / 2 + π / 4, sinφ0 = Math.sin(φ0), cosφ0 = Math.cos(φ0), j = 1; - while (true) { - if (j === m) j = 0; - point = ring[j]; - var λ = point[0], φ = point[1] / 2 + π / 4, sinφ = Math.sin(φ), cosφ = Math.cos(φ), dλ = λ - λ0, sdλ = dλ >= 0 ? 1 : -1, adλ = sdλ * dλ, antimeridian = adλ > π, k = sinφ0 * sinφ; - d3_geo_areaRingSum.add(Math.atan2(k * sdλ * Math.sin(adλ), cosφ0 * cosφ + k * Math.cos(adλ))); - polarAngle += antimeridian ? dλ + sdλ * τ : dλ; - if (antimeridian ^ λ0 >= meridian ^ λ >= meridian) { - var arc = d3_geo_cartesianCross(d3_geo_cartesian(point0), d3_geo_cartesian(point)); - d3_geo_cartesianNormalize(arc); - var intersection = d3_geo_cartesianCross(meridianNormal, arc); - d3_geo_cartesianNormalize(intersection); - var φarc = (antimeridian ^ dλ >= 0 ? -1 : 1) * d3_asin(intersection[2]); - if (parallel > φarc || parallel === φarc && (arc[0] || arc[1])) { - winding += antimeridian ^ dλ >= 0 ? 1 : -1; - } - } - if (!j++) break; - λ0 = λ, sinφ0 = sinφ, cosφ0 = cosφ, point0 = point; - } - } - return (polarAngle < -ε || polarAngle < ε && d3_geo_areaRingSum < -ε) ^ winding & 1; - } - function d3_geo_clipCircle(radius) { - var cr = Math.cos(radius), smallRadius = cr > 0, notHemisphere = abs(cr) > ε, interpolate = d3_geo_circleInterpolate(radius, 6 * d3_radians); - return d3_geo_clip(visible, clipLine, interpolate, smallRadius ? [ 0, -radius ] : [ -π, radius - π ]); - function visible(λ, φ) { - return Math.cos(λ) * Math.cos(φ) > cr; - } - function clipLine(listener) { - var point0, c0, v0, v00, clean; - return { - lineStart: function() { - v00 = v0 = false; - clean = 1; - }, - point: function(λ, φ) { - var point1 = [ λ, φ ], point2, v = visible(λ, φ), c = smallRadius ? v ? 0 : code(λ, φ) : v ? code(λ + (λ < 0 ? π : -π), φ) : 0; - if (!point0 && (v00 = v0 = v)) listener.lineStart(); - if (v !== v0) { - point2 = intersect(point0, point1); - if (d3_geo_sphericalEqual(point0, point2) || d3_geo_sphericalEqual(point1, point2)) { - point1[0] += ε; - point1[1] += ε; - v = visible(point1[0], point1[1]); - } - } - if (v !== v0) { - clean = 0; - if (v) { - listener.lineStart(); - point2 = intersect(point1, point0); - listener.point(point2[0], point2[1]); - } else { - point2 = intersect(point0, point1); - listener.point(point2[0], point2[1]); - listener.lineEnd(); - } - point0 = point2; - } else if (notHemisphere && point0 && smallRadius ^ v) { - var t; - if (!(c & c0) && (t = intersect(point1, point0, true))) { - clean = 0; - if (smallRadius) { - listener.lineStart(); - listener.point(t[0][0], t[0][1]); - listener.point(t[1][0], t[1][1]); - listener.lineEnd(); - } else { - listener.point(t[1][0], t[1][1]); - listener.lineEnd(); - listener.lineStart(); - listener.point(t[0][0], t[0][1]); - } - } - } - if (v && (!point0 || !d3_geo_sphericalEqual(point0, point1))) { - listener.point(point1[0], point1[1]); - } - point0 = point1, v0 = v, c0 = c; - }, - lineEnd: function() { - if (v0) listener.lineEnd(); - point0 = null; - }, - clean: function() { - return clean | (v00 && v0) << 1; - } - }; - } - function intersect(a, b, two) { - var pa = d3_geo_cartesian(a), pb = d3_geo_cartesian(b); - var n1 = [ 1, 0, 0 ], n2 = d3_geo_cartesianCross(pa, pb), n2n2 = d3_geo_cartesianDot(n2, n2), n1n2 = n2[0], determinant = n2n2 - n1n2 * n1n2; - if (!determinant) return !two && a; - var c1 = cr * n2n2 / determinant, c2 = -cr * n1n2 / determinant, n1xn2 = d3_geo_cartesianCross(n1, n2), A = d3_geo_cartesianScale(n1, c1), B = d3_geo_cartesianScale(n2, c2); - d3_geo_cartesianAdd(A, B); - var u = n1xn2, w = d3_geo_cartesianDot(A, u), uu = d3_geo_cartesianDot(u, u), t2 = w * w - uu * (d3_geo_cartesianDot(A, A) - 1); - if (t2 < 0) return; - var t = Math.sqrt(t2), q = d3_geo_cartesianScale(u, (-w - t) / uu); - d3_geo_cartesianAdd(q, A); - q = d3_geo_spherical(q); - if (!two) return q; - var λ0 = a[0], λ1 = b[0], φ0 = a[1], φ1 = b[1], z; - if (λ1 < λ0) z = λ0, λ0 = λ1, λ1 = z; - var δλ = λ1 - λ0, polar = abs(δλ - π) < ε, meridian = polar || δλ < ε; - if (!polar && φ1 < φ0) z = φ0, φ0 = φ1, φ1 = z; - if (meridian ? polar ? φ0 + φ1 > 0 ^ q[1] < (abs(q[0] - λ0) < ε ? φ0 : φ1) : φ0 <= q[1] && q[1] <= φ1 : δλ > π ^ (λ0 <= q[0] && q[0] <= λ1)) { - var q1 = d3_geo_cartesianScale(u, (-w + t) / uu); - d3_geo_cartesianAdd(q1, A); - return [ q, d3_geo_spherical(q1) ]; - } - } - function code(λ, φ) { - var r = smallRadius ? radius : π - radius, code = 0; - if (λ < -r) code |= 1; else if (λ > r) code |= 2; - if (φ < -r) code |= 4; else if (φ > r) code |= 8; - return code; - } - } - function d3_geom_clipLine(x0, y0, x1, y1) { - return function(line) { - var a = line.a, b = line.b, ax = a.x, ay = a.y, bx = b.x, by = b.y, t0 = 0, t1 = 1, dx = bx - ax, dy = by - ay, r; - r = x0 - ax; - if (!dx && r > 0) return; - r /= dx; - if (dx < 0) { - if (r < t0) return; - if (r < t1) t1 = r; - } else if (dx > 0) { - if (r > t1) return; - if (r > t0) t0 = r; - } - r = x1 - ax; - if (!dx && r < 0) return; - r /= dx; - if (dx < 0) { - if (r > t1) return; - if (r > t0) t0 = r; - } else if (dx > 0) { - if (r < t0) return; - if (r < t1) t1 = r; - } - r = y0 - ay; - if (!dy && r > 0) return; - r /= dy; - if (dy < 0) { - if (r < t0) return; - if (r < t1) t1 = r; - } else if (dy > 0) { - if (r > t1) return; - if (r > t0) t0 = r; - } - r = y1 - ay; - if (!dy && r < 0) return; - r /= dy; - if (dy < 0) { - if (r > t1) return; - if (r > t0) t0 = r; - } else if (dy > 0) { - if (r < t0) return; - if (r < t1) t1 = r; - } - if (t0 > 0) line.a = { - x: ax + t0 * dx, - y: ay + t0 * dy - }; - if (t1 < 1) line.b = { - x: ax + t1 * dx, - y: ay + t1 * dy - }; - return line; - }; - } - var d3_geo_clipExtentMAX = 1e9; - d3.geo.clipExtent = function() { - var x0, y0, x1, y1, stream, clip, clipExtent = { - stream: function(output) { - if (stream) stream.valid = false; - stream = clip(output); - stream.valid = true; - return stream; - }, - extent: function(_) { - if (!arguments.length) return [ [ x0, y0 ], [ x1, y1 ] ]; - clip = d3_geo_clipExtent(x0 = +_[0][0], y0 = +_[0][1], x1 = +_[1][0], y1 = +_[1][1]); - if (stream) stream.valid = false, stream = null; - return clipExtent; - } - }; - return clipExtent.extent([ [ 0, 0 ], [ 960, 500 ] ]); - }; - function d3_geo_clipExtent(x0, y0, x1, y1) { - return function(listener) { - var listener_ = listener, bufferListener = d3_geo_clipBufferListener(), clipLine = d3_geom_clipLine(x0, y0, x1, y1), segments, polygon, ring; - var clip = { - point: point, - lineStart: lineStart, - lineEnd: lineEnd, - polygonStart: function() { - listener = bufferListener; - segments = []; - polygon = []; - clean = true; - }, - polygonEnd: function() { - listener = listener_; - segments = d3.merge(segments); - var clipStartInside = insidePolygon([ x0, y1 ]), inside = clean && clipStartInside, visible = segments.length; - if (inside || visible) { - listener.polygonStart(); - if (inside) { - listener.lineStart(); - interpolate(null, null, 1, listener); - listener.lineEnd(); - } - if (visible) { - d3_geo_clipPolygon(segments, compare, clipStartInside, interpolate, listener); - } - listener.polygonEnd(); - } - segments = polygon = ring = null; - } - }; - function insidePolygon(p) { - var wn = 0, n = polygon.length, y = p[1]; - for (var i = 0; i < n; ++i) { - for (var j = 1, v = polygon[i], m = v.length, a = v[0], b; j < m; ++j) { - b = v[j]; - if (a[1] <= y) { - if (b[1] > y && d3_cross2d(a, b, p) > 0) ++wn; - } else { - if (b[1] <= y && d3_cross2d(a, b, p) < 0) --wn; - } - a = b; - } - } - return wn !== 0; - } - function interpolate(from, to, direction, listener) { - var a = 0, a1 = 0; - if (from == null || (a = corner(from, direction)) !== (a1 = corner(to, direction)) || comparePoints(from, to) < 0 ^ direction > 0) { - do { - listener.point(a === 0 || a === 3 ? x0 : x1, a > 1 ? y1 : y0); - } while ((a = (a + direction + 4) % 4) !== a1); - } else { - listener.point(to[0], to[1]); - } - } - function pointVisible(x, y) { - return x0 <= x && x <= x1 && y0 <= y && y <= y1; - } - function point(x, y) { - if (pointVisible(x, y)) listener.point(x, y); - } - var x__, y__, v__, x_, y_, v_, first, clean; - function lineStart() { - clip.point = linePoint; - if (polygon) polygon.push(ring = []); - first = true; - v_ = false; - x_ = y_ = NaN; - } - function lineEnd() { - if (segments) { - linePoint(x__, y__); - if (v__ && v_) bufferListener.rejoin(); - segments.push(bufferListener.buffer()); - } - clip.point = point; - if (v_) listener.lineEnd(); - } - function linePoint(x, y) { - x = Math.max(-d3_geo_clipExtentMAX, Math.min(d3_geo_clipExtentMAX, x)); - y = Math.max(-d3_geo_clipExtentMAX, Math.min(d3_geo_clipExtentMAX, y)); - var v = pointVisible(x, y); - if (polygon) ring.push([ x, y ]); - if (first) { - x__ = x, y__ = y, v__ = v; - first = false; - if (v) { - listener.lineStart(); - listener.point(x, y); - } - } else { - if (v && v_) listener.point(x, y); else { - var l = { - a: { - x: x_, - y: y_ - }, - b: { - x: x, - y: y - } - }; - if (clipLine(l)) { - if (!v_) { - listener.lineStart(); - listener.point(l.a.x, l.a.y); - } - listener.point(l.b.x, l.b.y); - if (!v) listener.lineEnd(); - clean = false; - } else if (v) { - listener.lineStart(); - listener.point(x, y); - clean = false; - } - } - } - x_ = x, y_ = y, v_ = v; - } - return clip; - }; - function corner(p, direction) { - return abs(p[0] - x0) < ε ? direction > 0 ? 0 : 3 : abs(p[0] - x1) < ε ? direction > 0 ? 2 : 1 : abs(p[1] - y0) < ε ? direction > 0 ? 1 : 0 : direction > 0 ? 3 : 2; - } - function compare(a, b) { - return comparePoints(a.x, b.x); - } - function comparePoints(a, b) { - var ca = corner(a, 1), cb = corner(b, 1); - return ca !== cb ? ca - cb : ca === 0 ? b[1] - a[1] : ca === 1 ? a[0] - b[0] : ca === 2 ? a[1] - b[1] : b[0] - a[0]; - } - } - function d3_geo_conic(projectAt) { - var φ0 = 0, φ1 = π / 3, m = d3_geo_projectionMutator(projectAt), p = m(φ0, φ1); - p.parallels = function(_) { - if (!arguments.length) return [ φ0 / π * 180, φ1 / π * 180 ]; - return m(φ0 = _[0] * π / 180, φ1 = _[1] * π / 180); - }; - return p; - } - function d3_geo_conicEqualArea(φ0, φ1) { - var sinφ0 = Math.sin(φ0), n = (sinφ0 + Math.sin(φ1)) / 2, C = 1 + sinφ0 * (2 * n - sinφ0), ρ0 = Math.sqrt(C) / n; - function forward(λ, φ) { - var ρ = Math.sqrt(C - 2 * n * Math.sin(φ)) / n; - return [ ρ * Math.sin(λ *= n), ρ0 - ρ * Math.cos(λ) ]; - } - forward.invert = function(x, y) { - var ρ0_y = ρ0 - y; - return [ Math.atan2(x, ρ0_y) / n, d3_asin((C - (x * x + ρ0_y * ρ0_y) * n * n) / (2 * n)) ]; - }; - return forward; - } - (d3.geo.conicEqualArea = function() { - return d3_geo_conic(d3_geo_conicEqualArea); - }).raw = d3_geo_conicEqualArea; - d3.geo.albers = function() { - return d3.geo.conicEqualArea().rotate([ 96, 0 ]).center([ -.6, 38.7 ]).parallels([ 29.5, 45.5 ]).scale(1070); - }; - d3.geo.albersUsa = function() { - var lower48 = d3.geo.albers(); - var alaska = d3.geo.conicEqualArea().rotate([ 154, 0 ]).center([ -2, 58.5 ]).parallels([ 55, 65 ]); - var hawaii = d3.geo.conicEqualArea().rotate([ 157, 0 ]).center([ -3, 19.9 ]).parallels([ 8, 18 ]); - var point, pointStream = { - point: function(x, y) { - point = [ x, y ]; - } - }, lower48Point, alaskaPoint, hawaiiPoint; - function albersUsa(coordinates) { - var x = coordinates[0], y = coordinates[1]; - point = null; - (lower48Point(x, y), point) || (alaskaPoint(x, y), point) || hawaiiPoint(x, y); - return point; - } - albersUsa.invert = function(coordinates) { - var k = lower48.scale(), t = lower48.translate(), x = (coordinates[0] - t[0]) / k, y = (coordinates[1] - t[1]) / k; - return (y >= .12 && y < .234 && x >= -.425 && x < -.214 ? alaska : y >= .166 && y < .234 && x >= -.214 && x < -.115 ? hawaii : lower48).invert(coordinates); - }; - albersUsa.stream = function(stream) { - var lower48Stream = lower48.stream(stream), alaskaStream = alaska.stream(stream), hawaiiStream = hawaii.stream(stream); - return { - point: function(x, y) { - lower48Stream.point(x, y); - alaskaStream.point(x, y); - hawaiiStream.point(x, y); - }, - sphere: function() { - lower48Stream.sphere(); - alaskaStream.sphere(); - hawaiiStream.sphere(); - }, - lineStart: function() { - lower48Stream.lineStart(); - alaskaStream.lineStart(); - hawaiiStream.lineStart(); - }, - lineEnd: function() { - lower48Stream.lineEnd(); - alaskaStream.lineEnd(); - hawaiiStream.lineEnd(); - }, - polygonStart: function() { - lower48Stream.polygonStart(); - alaskaStream.polygonStart(); - hawaiiStream.polygonStart(); - }, - polygonEnd: function() { - lower48Stream.polygonEnd(); - alaskaStream.polygonEnd(); - hawaiiStream.polygonEnd(); - } - }; - }; - albersUsa.precision = function(_) { - if (!arguments.length) return lower48.precision(); - lower48.precision(_); - alaska.precision(_); - hawaii.precision(_); - return albersUsa; - }; - albersUsa.scale = function(_) { - if (!arguments.length) return lower48.scale(); - lower48.scale(_); - alaska.scale(_ * .35); - hawaii.scale(_); - return albersUsa.translate(lower48.translate()); - }; - albersUsa.translate = function(_) { - if (!arguments.length) return lower48.translate(); - var k = lower48.scale(), x = +_[0], y = +_[1]; - lower48Point = lower48.translate(_).clipExtent([ [ x - .455 * k, y - .238 * k ], [ x + .455 * k, y + .238 * k ] ]).stream(pointStream).point; - alaskaPoint = alaska.translate([ x - .307 * k, y + .201 * k ]).clipExtent([ [ x - .425 * k + ε, y + .12 * k + ε ], [ x - .214 * k - ε, y + .234 * k - ε ] ]).stream(pointStream).point; - hawaiiPoint = hawaii.translate([ x - .205 * k, y + .212 * k ]).clipExtent([ [ x - .214 * k + ε, y + .166 * k + ε ], [ x - .115 * k - ε, y + .234 * k - ε ] ]).stream(pointStream).point; - return albersUsa; - }; - return albersUsa.scale(1070); - }; - var d3_geo_pathAreaSum, d3_geo_pathAreaPolygon, d3_geo_pathArea = { - point: d3_noop, - lineStart: d3_noop, - lineEnd: d3_noop, - polygonStart: function() { - d3_geo_pathAreaPolygon = 0; - d3_geo_pathArea.lineStart = d3_geo_pathAreaRingStart; - }, - polygonEnd: function() { - d3_geo_pathArea.lineStart = d3_geo_pathArea.lineEnd = d3_geo_pathArea.point = d3_noop; - d3_geo_pathAreaSum += abs(d3_geo_pathAreaPolygon / 2); - } - }; - function d3_geo_pathAreaRingStart() { - var x00, y00, x0, y0; - d3_geo_pathArea.point = function(x, y) { - d3_geo_pathArea.point = nextPoint; - x00 = x0 = x, y00 = y0 = y; - }; - function nextPoint(x, y) { - d3_geo_pathAreaPolygon += y0 * x - x0 * y; - x0 = x, y0 = y; - } - d3_geo_pathArea.lineEnd = function() { - nextPoint(x00, y00); - }; - } - var d3_geo_pathBoundsX0, d3_geo_pathBoundsY0, d3_geo_pathBoundsX1, d3_geo_pathBoundsY1; - var d3_geo_pathBounds = { - point: d3_geo_pathBoundsPoint, - lineStart: d3_noop, - lineEnd: d3_noop, - polygonStart: d3_noop, - polygonEnd: d3_noop - }; - function d3_geo_pathBoundsPoint(x, y) { - if (x < d3_geo_pathBoundsX0) d3_geo_pathBoundsX0 = x; - if (x > d3_geo_pathBoundsX1) d3_geo_pathBoundsX1 = x; - if (y < d3_geo_pathBoundsY0) d3_geo_pathBoundsY0 = y; - if (y > d3_geo_pathBoundsY1) d3_geo_pathBoundsY1 = y; - } - function d3_geo_pathBuffer() { - var pointCircle = d3_geo_pathBufferCircle(4.5), buffer = []; - var stream = { - point: point, - lineStart: function() { - stream.point = pointLineStart; - }, - lineEnd: lineEnd, - polygonStart: function() { - stream.lineEnd = lineEndPolygon; - }, - polygonEnd: function() { - stream.lineEnd = lineEnd; - stream.point = point; - }, - pointRadius: function(_) { - pointCircle = d3_geo_pathBufferCircle(_); - return stream; - }, - result: function() { - if (buffer.length) { - var result = buffer.join(""); - buffer = []; - return result; - } - } - }; - function point(x, y) { - buffer.push("M", x, ",", y, pointCircle); - } - function pointLineStart(x, y) { - buffer.push("M", x, ",", y); - stream.point = pointLine; - } - function pointLine(x, y) { - buffer.push("L", x, ",", y); - } - function lineEnd() { - stream.point = point; - } - function lineEndPolygon() { - buffer.push("Z"); - } - return stream; - } - function d3_geo_pathBufferCircle(radius) { - return "m0," + radius + "a" + radius + "," + radius + " 0 1,1 0," + -2 * radius + "a" + radius + "," + radius + " 0 1,1 0," + 2 * radius + "z"; - } - var d3_geo_pathCentroid = { - point: d3_geo_pathCentroidPoint, - lineStart: d3_geo_pathCentroidLineStart, - lineEnd: d3_geo_pathCentroidLineEnd, - polygonStart: function() { - d3_geo_pathCentroid.lineStart = d3_geo_pathCentroidRingStart; - }, - polygonEnd: function() { - d3_geo_pathCentroid.point = d3_geo_pathCentroidPoint; - d3_geo_pathCentroid.lineStart = d3_geo_pathCentroidLineStart; - d3_geo_pathCentroid.lineEnd = d3_geo_pathCentroidLineEnd; - } - }; - function d3_geo_pathCentroidPoint(x, y) { - d3_geo_centroidX0 += x; - d3_geo_centroidY0 += y; - ++d3_geo_centroidZ0; - } - function d3_geo_pathCentroidLineStart() { - var x0, y0; - d3_geo_pathCentroid.point = function(x, y) { - d3_geo_pathCentroid.point = nextPoint; - d3_geo_pathCentroidPoint(x0 = x, y0 = y); - }; - function nextPoint(x, y) { - var dx = x - x0, dy = y - y0, z = Math.sqrt(dx * dx + dy * dy); - d3_geo_centroidX1 += z * (x0 + x) / 2; - d3_geo_centroidY1 += z * (y0 + y) / 2; - d3_geo_centroidZ1 += z; - d3_geo_pathCentroidPoint(x0 = x, y0 = y); - } - } - function d3_geo_pathCentroidLineEnd() { - d3_geo_pathCentroid.point = d3_geo_pathCentroidPoint; - } - function d3_geo_pathCentroidRingStart() { - var x00, y00, x0, y0; - d3_geo_pathCentroid.point = function(x, y) { - d3_geo_pathCentroid.point = nextPoint; - d3_geo_pathCentroidPoint(x00 = x0 = x, y00 = y0 = y); - }; - function nextPoint(x, y) { - var dx = x - x0, dy = y - y0, z = Math.sqrt(dx * dx + dy * dy); - d3_geo_centroidX1 += z * (x0 + x) / 2; - d3_geo_centroidY1 += z * (y0 + y) / 2; - d3_geo_centroidZ1 += z; - z = y0 * x - x0 * y; - d3_geo_centroidX2 += z * (x0 + x); - d3_geo_centroidY2 += z * (y0 + y); - d3_geo_centroidZ2 += z * 3; - d3_geo_pathCentroidPoint(x0 = x, y0 = y); - } - d3_geo_pathCentroid.lineEnd = function() { - nextPoint(x00, y00); - }; - } - function d3_geo_pathContext(context) { - var pointRadius = 4.5; - var stream = { - point: point, - lineStart: function() { - stream.point = pointLineStart; - }, - lineEnd: lineEnd, - polygonStart: function() { - stream.lineEnd = lineEndPolygon; - }, - polygonEnd: function() { - stream.lineEnd = lineEnd; - stream.point = point; - }, - pointRadius: function(_) { - pointRadius = _; - return stream; - }, - result: d3_noop - }; - function point(x, y) { - context.moveTo(x + pointRadius, y); - context.arc(x, y, pointRadius, 0, τ); - } - function pointLineStart(x, y) { - context.moveTo(x, y); - stream.point = pointLine; - } - function pointLine(x, y) { - context.lineTo(x, y); - } - function lineEnd() { - stream.point = point; - } - function lineEndPolygon() { - context.closePath(); - } - return stream; - } - function d3_geo_resample(project) { - var δ2 = .5, cosMinDistance = Math.cos(30 * d3_radians), maxDepth = 16; - function resample(stream) { - return (maxDepth ? resampleRecursive : resampleNone)(stream); - } - function resampleNone(stream) { - return d3_geo_transformPoint(stream, function(x, y) { - x = project(x, y); - stream.point(x[0], x[1]); - }); - } - function resampleRecursive(stream) { - var λ00, φ00, x00, y00, a00, b00, c00, λ0, x0, y0, a0, b0, c0; - var resample = { - point: point, - lineStart: lineStart, - lineEnd: lineEnd, - polygonStart: function() { - stream.polygonStart(); - resample.lineStart = ringStart; - }, - polygonEnd: function() { - stream.polygonEnd(); - resample.lineStart = lineStart; - } - }; - function point(x, y) { - x = project(x, y); - stream.point(x[0], x[1]); - } - function lineStart() { - x0 = NaN; - resample.point = linePoint; - stream.lineStart(); - } - function linePoint(λ, φ) { - var c = d3_geo_cartesian([ λ, φ ]), p = project(λ, φ); - resampleLineTo(x0, y0, λ0, a0, b0, c0, x0 = p[0], y0 = p[1], λ0 = λ, a0 = c[0], b0 = c[1], c0 = c[2], maxDepth, stream); - stream.point(x0, y0); - } - function lineEnd() { - resample.point = point; - stream.lineEnd(); - } - function ringStart() { - lineStart(); - resample.point = ringPoint; - resample.lineEnd = ringEnd; - } - function ringPoint(λ, φ) { - linePoint(λ00 = λ, φ00 = φ), x00 = x0, y00 = y0, a00 = a0, b00 = b0, c00 = c0; - resample.point = linePoint; - } - function ringEnd() { - resampleLineTo(x0, y0, λ0, a0, b0, c0, x00, y00, λ00, a00, b00, c00, maxDepth, stream); - resample.lineEnd = lineEnd; - lineEnd(); - } - return resample; - } - function resampleLineTo(x0, y0, λ0, a0, b0, c0, x1, y1, λ1, a1, b1, c1, depth, stream) { - var dx = x1 - x0, dy = y1 - y0, d2 = dx * dx + dy * dy; - if (d2 > 4 * δ2 && depth--) { - var a = a0 + a1, b = b0 + b1, c = c0 + c1, m = Math.sqrt(a * a + b * b + c * c), φ2 = Math.asin(c /= m), λ2 = abs(abs(c) - 1) < ε || abs(λ0 - λ1) < ε ? (λ0 + λ1) / 2 : Math.atan2(b, a), p = project(λ2, φ2), x2 = p[0], y2 = p[1], dx2 = x2 - x0, dy2 = y2 - y0, dz = dy * dx2 - dx * dy2; - if (dz * dz / d2 > δ2 || abs((dx * dx2 + dy * dy2) / d2 - .5) > .3 || a0 * a1 + b0 * b1 + c0 * c1 < cosMinDistance) { - resampleLineTo(x0, y0, λ0, a0, b0, c0, x2, y2, λ2, a /= m, b /= m, c, depth, stream); - stream.point(x2, y2); - resampleLineTo(x2, y2, λ2, a, b, c, x1, y1, λ1, a1, b1, c1, depth, stream); - } - } - } - resample.precision = function(_) { - if (!arguments.length) return Math.sqrt(δ2); - maxDepth = (δ2 = _ * _) > 0 && 16; - return resample; - }; - return resample; - } - d3.geo.path = function() { - var pointRadius = 4.5, projection, context, projectStream, contextStream, cacheStream; - function path(object) { - if (object) { - if (typeof pointRadius === "function") contextStream.pointRadius(+pointRadius.apply(this, arguments)); - if (!cacheStream || !cacheStream.valid) cacheStream = projectStream(contextStream); - d3.geo.stream(object, cacheStream); - } - return contextStream.result(); - } - path.area = function(object) { - d3_geo_pathAreaSum = 0; - d3.geo.stream(object, projectStream(d3_geo_pathArea)); - return d3_geo_pathAreaSum; - }; - path.centroid = function(object) { - d3_geo_centroidX0 = d3_geo_centroidY0 = d3_geo_centroidZ0 = d3_geo_centroidX1 = d3_geo_centroidY1 = d3_geo_centroidZ1 = d3_geo_centroidX2 = d3_geo_centroidY2 = d3_geo_centroidZ2 = 0; - d3.geo.stream(object, projectStream(d3_geo_pathCentroid)); - return d3_geo_centroidZ2 ? [ d3_geo_centroidX2 / d3_geo_centroidZ2, d3_geo_centroidY2 / d3_geo_centroidZ2 ] : d3_geo_centroidZ1 ? [ d3_geo_centroidX1 / d3_geo_centroidZ1, d3_geo_centroidY1 / d3_geo_centroidZ1 ] : d3_geo_centroidZ0 ? [ d3_geo_centroidX0 / d3_geo_centroidZ0, d3_geo_centroidY0 / d3_geo_centroidZ0 ] : [ NaN, NaN ]; - }; - path.bounds = function(object) { - d3_geo_pathBoundsX1 = d3_geo_pathBoundsY1 = -(d3_geo_pathBoundsX0 = d3_geo_pathBoundsY0 = Infinity); - d3.geo.stream(object, projectStream(d3_geo_pathBounds)); - return [ [ d3_geo_pathBoundsX0, d3_geo_pathBoundsY0 ], [ d3_geo_pathBoundsX1, d3_geo_pathBoundsY1 ] ]; - }; - path.projection = function(_) { - if (!arguments.length) return projection; - projectStream = (projection = _) ? _.stream || d3_geo_pathProjectStream(_) : d3_identity; - return reset(); - }; - path.context = function(_) { - if (!arguments.length) return context; - contextStream = (context = _) == null ? new d3_geo_pathBuffer() : new d3_geo_pathContext(_); - if (typeof pointRadius !== "function") contextStream.pointRadius(pointRadius); - return reset(); - }; - path.pointRadius = function(_) { - if (!arguments.length) return pointRadius; - pointRadius = typeof _ === "function" ? _ : (contextStream.pointRadius(+_), +_); - return path; - }; - function reset() { - cacheStream = null; - return path; - } - return path.projection(d3.geo.albersUsa()).context(null); - }; - function d3_geo_pathProjectStream(project) { - var resample = d3_geo_resample(function(x, y) { - return project([ x * d3_degrees, y * d3_degrees ]); - }); - return function(stream) { - return d3_geo_projectionRadians(resample(stream)); - }; - } - d3.geo.transform = function(methods) { - return { - stream: function(stream) { - var transform = new d3_geo_transform(stream); - for (var k in methods) transform[k] = methods[k]; - return transform; - } - }; - }; - function d3_geo_transform(stream) { - this.stream = stream; - } - d3_geo_transform.prototype = { - point: function(x, y) { - this.stream.point(x, y); - }, - sphere: function() { - this.stream.sphere(); - }, - lineStart: function() { - this.stream.lineStart(); - }, - lineEnd: function() { - this.stream.lineEnd(); - }, - polygonStart: function() { - this.stream.polygonStart(); - }, - polygonEnd: function() { - this.stream.polygonEnd(); - } - }; - function d3_geo_transformPoint(stream, point) { - return { - point: point, - sphere: function() { - stream.sphere(); - }, - lineStart: function() { - stream.lineStart(); - }, - lineEnd: function() { - stream.lineEnd(); - }, - polygonStart: function() { - stream.polygonStart(); - }, - polygonEnd: function() { - stream.polygonEnd(); - } - }; - } - d3.geo.projection = d3_geo_projection; - d3.geo.projectionMutator = d3_geo_projectionMutator; - function d3_geo_projection(project) { - return d3_geo_projectionMutator(function() { - return project; - })(); - } - function d3_geo_projectionMutator(projectAt) { - var project, rotate, projectRotate, projectResample = d3_geo_resample(function(x, y) { - x = project(x, y); - return [ x[0] * k + δx, δy - x[1] * k ]; - }), k = 150, x = 480, y = 250, λ = 0, φ = 0, δλ = 0, δφ = 0, δγ = 0, δx, δy, preclip = d3_geo_clipAntimeridian, postclip = d3_identity, clipAngle = null, clipExtent = null, stream; - function projection(point) { - point = projectRotate(point[0] * d3_radians, point[1] * d3_radians); - return [ point[0] * k + δx, δy - point[1] * k ]; - } - function invert(point) { - point = projectRotate.invert((point[0] - δx) / k, (δy - point[1]) / k); - return point && [ point[0] * d3_degrees, point[1] * d3_degrees ]; - } - projection.stream = function(output) { - if (stream) stream.valid = false; - stream = d3_geo_projectionRadians(preclip(rotate, projectResample(postclip(output)))); - stream.valid = true; - return stream; - }; - projection.clipAngle = function(_) { - if (!arguments.length) return clipAngle; - preclip = _ == null ? (clipAngle = _, d3_geo_clipAntimeridian) : d3_geo_clipCircle((clipAngle = +_) * d3_radians); - return invalidate(); - }; - projection.clipExtent = function(_) { - if (!arguments.length) return clipExtent; - clipExtent = _; - postclip = _ ? d3_geo_clipExtent(_[0][0], _[0][1], _[1][0], _[1][1]) : d3_identity; - return invalidate(); - }; - projection.scale = function(_) { - if (!arguments.length) return k; - k = +_; - return reset(); - }; - projection.translate = function(_) { - if (!arguments.length) return [ x, y ]; - x = +_[0]; - y = +_[1]; - return reset(); - }; - projection.center = function(_) { - if (!arguments.length) return [ λ * d3_degrees, φ * d3_degrees ]; - λ = _[0] % 360 * d3_radians; - φ = _[1] % 360 * d3_radians; - return reset(); - }; - projection.rotate = function(_) { - if (!arguments.length) return [ δλ * d3_degrees, δφ * d3_degrees, δγ * d3_degrees ]; - δλ = _[0] % 360 * d3_radians; - δφ = _[1] % 360 * d3_radians; - δγ = _.length > 2 ? _[2] % 360 * d3_radians : 0; - return reset(); - }; - d3.rebind(projection, projectResample, "precision"); - function reset() { - projectRotate = d3_geo_compose(rotate = d3_geo_rotation(δλ, δφ, δγ), project); - var center = project(λ, φ); - δx = x - center[0] * k; - δy = y + center[1] * k; - return invalidate(); - } - function invalidate() { - if (stream) stream.valid = false, stream = null; - return projection; - } - return function() { - project = projectAt.apply(this, arguments); - projection.invert = project.invert && invert; - return reset(); - }; - } - function d3_geo_projectionRadians(stream) { - return d3_geo_transformPoint(stream, function(x, y) { - stream.point(x * d3_radians, y * d3_radians); - }); - } - function d3_geo_equirectangular(λ, φ) { - return [ λ, φ ]; - } - (d3.geo.equirectangular = function() { - return d3_geo_projection(d3_geo_equirectangular); - }).raw = d3_geo_equirectangular.invert = d3_geo_equirectangular; - d3.geo.rotation = function(rotate) { - rotate = d3_geo_rotation(rotate[0] % 360 * d3_radians, rotate[1] * d3_radians, rotate.length > 2 ? rotate[2] * d3_radians : 0); - function forward(coordinates) { - coordinates = rotate(coordinates[0] * d3_radians, coordinates[1] * d3_radians); - return coordinates[0] *= d3_degrees, coordinates[1] *= d3_degrees, coordinates; - } - forward.invert = function(coordinates) { - coordinates = rotate.invert(coordinates[0] * d3_radians, coordinates[1] * d3_radians); - return coordinates[0] *= d3_degrees, coordinates[1] *= d3_degrees, coordinates; - }; - return forward; - }; - function d3_geo_identityRotation(λ, φ) { - return [ λ > π ? λ - τ : λ < -π ? λ + τ : λ, φ ]; - } - d3_geo_identityRotation.invert = d3_geo_equirectangular; - function d3_geo_rotation(δλ, δφ, δγ) { - return δλ ? δφ || δγ ? d3_geo_compose(d3_geo_rotationλ(δλ), d3_geo_rotationφγ(δφ, δγ)) : d3_geo_rotationλ(δλ) : δφ || δγ ? d3_geo_rotationφγ(δφ, δγ) : d3_geo_identityRotation; - } - function d3_geo_forwardRotationλ(δλ) { - return function(λ, φ) { - return λ += δλ, [ λ > π ? λ - τ : λ < -π ? λ + τ : λ, φ ]; - }; - } - function d3_geo_rotationλ(δλ) { - var rotation = d3_geo_forwardRotationλ(δλ); - rotation.invert = d3_geo_forwardRotationλ(-δλ); - return rotation; - } - function d3_geo_rotationφγ(δφ, δγ) { - var cosδφ = Math.cos(δφ), sinδφ = Math.sin(δφ), cosδγ = Math.cos(δγ), sinδγ = Math.sin(δγ); - function rotation(λ, φ) { - var cosφ = Math.cos(φ), x = Math.cos(λ) * cosφ, y = Math.sin(λ) * cosφ, z = Math.sin(φ), k = z * cosδφ + x * sinδφ; - return [ Math.atan2(y * cosδγ - k * sinδγ, x * cosδφ - z * sinδφ), d3_asin(k * cosδγ + y * sinδγ) ]; - } - rotation.invert = function(λ, φ) { - var cosφ = Math.cos(φ), x = Math.cos(λ) * cosφ, y = Math.sin(λ) * cosφ, z = Math.sin(φ), k = z * cosδγ - y * sinδγ; - return [ Math.atan2(y * cosδγ + z * sinδγ, x * cosδφ + k * sinδφ), d3_asin(k * cosδφ - x * sinδφ) ]; - }; - return rotation; - } - d3.geo.circle = function() { - var origin = [ 0, 0 ], angle, precision = 6, interpolate; - function circle() { - var center = typeof origin === "function" ? origin.apply(this, arguments) : origin, rotate = d3_geo_rotation(-center[0] * d3_radians, -center[1] * d3_radians, 0).invert, ring = []; - interpolate(null, null, 1, { - point: function(x, y) { - ring.push(x = rotate(x, y)); - x[0] *= d3_degrees, x[1] *= d3_degrees; - } - }); - return { - type: "Polygon", - coordinates: [ ring ] - }; - } - circle.origin = function(x) { - if (!arguments.length) return origin; - origin = x; - return circle; - }; - circle.angle = function(x) { - if (!arguments.length) return angle; - interpolate = d3_geo_circleInterpolate((angle = +x) * d3_radians, precision * d3_radians); - return circle; - }; - circle.precision = function(_) { - if (!arguments.length) return precision; - interpolate = d3_geo_circleInterpolate(angle * d3_radians, (precision = +_) * d3_radians); - return circle; - }; - return circle.angle(90); - }; - function d3_geo_circleInterpolate(radius, precision) { - var cr = Math.cos(radius), sr = Math.sin(radius); - return function(from, to, direction, listener) { - var step = direction * precision; - if (from != null) { - from = d3_geo_circleAngle(cr, from); - to = d3_geo_circleAngle(cr, to); - if (direction > 0 ? from < to : from > to) from += direction * τ; - } else { - from = radius + direction * τ; - to = radius - .5 * step; - } - for (var point, t = from; direction > 0 ? t > to : t < to; t -= step) { - listener.point((point = d3_geo_spherical([ cr, -sr * Math.cos(t), -sr * Math.sin(t) ]))[0], point[1]); - } - }; - } - function d3_geo_circleAngle(cr, point) { - var a = d3_geo_cartesian(point); - a[0] -= cr; - d3_geo_cartesianNormalize(a); - var angle = d3_acos(-a[1]); - return ((-a[2] < 0 ? -angle : angle) + 2 * Math.PI - ε) % (2 * Math.PI); - } - d3.geo.distance = function(a, b) { - var Δλ = (b[0] - a[0]) * d3_radians, φ0 = a[1] * d3_radians, φ1 = b[1] * d3_radians, sinΔλ = Math.sin(Δλ), cosΔλ = Math.cos(Δλ), sinφ0 = Math.sin(φ0), cosφ0 = Math.cos(φ0), sinφ1 = Math.sin(φ1), cosφ1 = Math.cos(φ1), t; - return Math.atan2(Math.sqrt((t = cosφ1 * sinΔλ) * t + (t = cosφ0 * sinφ1 - sinφ0 * cosφ1 * cosΔλ) * t), sinφ0 * sinφ1 + cosφ0 * cosφ1 * cosΔλ); - }; - d3.geo.graticule = function() { - var x1, x0, X1, X0, y1, y0, Y1, Y0, dx = 10, dy = dx, DX = 90, DY = 360, x, y, X, Y, precision = 2.5; - function graticule() { - return { - type: "MultiLineString", - coordinates: lines() - }; - } - function lines() { - return d3.range(Math.ceil(X0 / DX) * DX, X1, DX).map(X).concat(d3.range(Math.ceil(Y0 / DY) * DY, Y1, DY).map(Y)).concat(d3.range(Math.ceil(x0 / dx) * dx, x1, dx).filter(function(x) { - return abs(x % DX) > ε; - }).map(x)).concat(d3.range(Math.ceil(y0 / dy) * dy, y1, dy).filter(function(y) { - return abs(y % DY) > ε; - }).map(y)); - } - graticule.lines = function() { - return lines().map(function(coordinates) { - return { - type: "LineString", - coordinates: coordinates - }; - }); - }; - graticule.outline = function() { - return { - type: "Polygon", - coordinates: [ X(X0).concat(Y(Y1).slice(1), X(X1).reverse().slice(1), Y(Y0).reverse().slice(1)) ] - }; - }; - graticule.extent = function(_) { - if (!arguments.length) return graticule.minorExtent(); - return graticule.majorExtent(_).minorExtent(_); - }; - graticule.majorExtent = function(_) { - if (!arguments.length) return [ [ X0, Y0 ], [ X1, Y1 ] ]; - X0 = +_[0][0], X1 = +_[1][0]; - Y0 = +_[0][1], Y1 = +_[1][1]; - if (X0 > X1) _ = X0, X0 = X1, X1 = _; - if (Y0 > Y1) _ = Y0, Y0 = Y1, Y1 = _; - return graticule.precision(precision); - }; - graticule.minorExtent = function(_) { - if (!arguments.length) return [ [ x0, y0 ], [ x1, y1 ] ]; - x0 = +_[0][0], x1 = +_[1][0]; - y0 = +_[0][1], y1 = +_[1][1]; - if (x0 > x1) _ = x0, x0 = x1, x1 = _; - if (y0 > y1) _ = y0, y0 = y1, y1 = _; - return graticule.precision(precision); - }; - graticule.step = function(_) { - if (!arguments.length) return graticule.minorStep(); - return graticule.majorStep(_).minorStep(_); - }; - graticule.majorStep = function(_) { - if (!arguments.length) return [ DX, DY ]; - DX = +_[0], DY = +_[1]; - return graticule; - }; - graticule.minorStep = function(_) { - if (!arguments.length) return [ dx, dy ]; - dx = +_[0], dy = +_[1]; - return graticule; - }; - graticule.precision = function(_) { - if (!arguments.length) return precision; - precision = +_; - x = d3_geo_graticuleX(y0, y1, 90); - y = d3_geo_graticuleY(x0, x1, precision); - X = d3_geo_graticuleX(Y0, Y1, 90); - Y = d3_geo_graticuleY(X0, X1, precision); - return graticule; - }; - return graticule.majorExtent([ [ -180, -90 + ε ], [ 180, 90 - ε ] ]).minorExtent([ [ -180, -80 - ε ], [ 180, 80 + ε ] ]); - }; - function d3_geo_graticuleX(y0, y1, dy) { - var y = d3.range(y0, y1 - ε, dy).concat(y1); - return function(x) { - return y.map(function(y) { - return [ x, y ]; - }); - }; - } - function d3_geo_graticuleY(x0, x1, dx) { - var x = d3.range(x0, x1 - ε, dx).concat(x1); - return function(y) { - return x.map(function(x) { - return [ x, y ]; - }); - }; - } - function d3_source(d) { - return d.source; - } - function d3_target(d) { - return d.target; - } - d3.geo.greatArc = function() { - var source = d3_source, source_, target = d3_target, target_; - function greatArc() { - return { - type: "LineString", - coordinates: [ source_ || source.apply(this, arguments), target_ || target.apply(this, arguments) ] - }; - } - greatArc.distance = function() { - return d3.geo.distance(source_ || source.apply(this, arguments), target_ || target.apply(this, arguments)); - }; - greatArc.source = function(_) { - if (!arguments.length) return source; - source = _, source_ = typeof _ === "function" ? null : _; - return greatArc; - }; - greatArc.target = function(_) { - if (!arguments.length) return target; - target = _, target_ = typeof _ === "function" ? null : _; - return greatArc; - }; - greatArc.precision = function() { - return arguments.length ? greatArc : 0; - }; - return greatArc; - }; - d3.geo.interpolate = function(source, target) { - return d3_geo_interpolate(source[0] * d3_radians, source[1] * d3_radians, target[0] * d3_radians, target[1] * d3_radians); - }; - function d3_geo_interpolate(x0, y0, x1, y1) { - var cy0 = Math.cos(y0), sy0 = Math.sin(y0), cy1 = Math.cos(y1), sy1 = Math.sin(y1), kx0 = cy0 * Math.cos(x0), ky0 = cy0 * Math.sin(x0), kx1 = cy1 * Math.cos(x1), ky1 = cy1 * Math.sin(x1), d = 2 * Math.asin(Math.sqrt(d3_haversin(y1 - y0) + cy0 * cy1 * d3_haversin(x1 - x0))), k = 1 / Math.sin(d); - var interpolate = d ? function(t) { - var B = Math.sin(t *= d) * k, A = Math.sin(d - t) * k, x = A * kx0 + B * kx1, y = A * ky0 + B * ky1, z = A * sy0 + B * sy1; - return [ Math.atan2(y, x) * d3_degrees, Math.atan2(z, Math.sqrt(x * x + y * y)) * d3_degrees ]; - } : function() { - return [ x0 * d3_degrees, y0 * d3_degrees ]; - }; - interpolate.distance = d; - return interpolate; - } - d3.geo.length = function(object) { - d3_geo_lengthSum = 0; - d3.geo.stream(object, d3_geo_length); - return d3_geo_lengthSum; - }; - var d3_geo_lengthSum; - var d3_geo_length = { - sphere: d3_noop, - point: d3_noop, - lineStart: d3_geo_lengthLineStart, - lineEnd: d3_noop, - polygonStart: d3_noop, - polygonEnd: d3_noop - }; - function d3_geo_lengthLineStart() { - var λ0, sinφ0, cosφ0; - d3_geo_length.point = function(λ, φ) { - λ0 = λ * d3_radians, sinφ0 = Math.sin(φ *= d3_radians), cosφ0 = Math.cos(φ); - d3_geo_length.point = nextPoint; - }; - d3_geo_length.lineEnd = function() { - d3_geo_length.point = d3_geo_length.lineEnd = d3_noop; - }; - function nextPoint(λ, φ) { - var sinφ = Math.sin(φ *= d3_radians), cosφ = Math.cos(φ), t = abs((λ *= d3_radians) - λ0), cosΔλ = Math.cos(t); - d3_geo_lengthSum += Math.atan2(Math.sqrt((t = cosφ * Math.sin(t)) * t + (t = cosφ0 * sinφ - sinφ0 * cosφ * cosΔλ) * t), sinφ0 * sinφ + cosφ0 * cosφ * cosΔλ); - λ0 = λ, sinφ0 = sinφ, cosφ0 = cosφ; - } - } - function d3_geo_azimuthal(scale, angle) { - function azimuthal(λ, φ) { - var cosλ = Math.cos(λ), cosφ = Math.cos(φ), k = scale(cosλ * cosφ); - return [ k * cosφ * Math.sin(λ), k * Math.sin(φ) ]; - } - azimuthal.invert = function(x, y) { - var ρ = Math.sqrt(x * x + y * y), c = angle(ρ), sinc = Math.sin(c), cosc = Math.cos(c); - return [ Math.atan2(x * sinc, ρ * cosc), Math.asin(ρ && y * sinc / ρ) ]; - }; - return azimuthal; - } - var d3_geo_azimuthalEqualArea = d3_geo_azimuthal(function(cosλcosφ) { - return Math.sqrt(2 / (1 + cosλcosφ)); - }, function(ρ) { - return 2 * Math.asin(ρ / 2); - }); - (d3.geo.azimuthalEqualArea = function() { - return d3_geo_projection(d3_geo_azimuthalEqualArea); - }).raw = d3_geo_azimuthalEqualArea; - var d3_geo_azimuthalEquidistant = d3_geo_azimuthal(function(cosλcosφ) { - var c = Math.acos(cosλcosφ); - return c && c / Math.sin(c); - }, d3_identity); - (d3.geo.azimuthalEquidistant = function() { - return d3_geo_projection(d3_geo_azimuthalEquidistant); - }).raw = d3_geo_azimuthalEquidistant; - function d3_geo_conicConformal(φ0, φ1) { - var cosφ0 = Math.cos(φ0), t = function(φ) { - return Math.tan(π / 4 + φ / 2); - }, n = φ0 === φ1 ? Math.sin(φ0) : Math.log(cosφ0 / Math.cos(φ1)) / Math.log(t(φ1) / t(φ0)), F = cosφ0 * Math.pow(t(φ0), n) / n; - if (!n) return d3_geo_mercator; - function forward(λ, φ) { - if (F > 0) { - if (φ < -halfπ + ε) φ = -halfπ + ε; - } else { - if (φ > halfπ - ε) φ = halfπ - ε; - } - var ρ = F / Math.pow(t(φ), n); - return [ ρ * Math.sin(n * λ), F - ρ * Math.cos(n * λ) ]; - } - forward.invert = function(x, y) { - var ρ0_y = F - y, ρ = d3_sgn(n) * Math.sqrt(x * x + ρ0_y * ρ0_y); - return [ Math.atan2(x, ρ0_y) / n, 2 * Math.atan(Math.pow(F / ρ, 1 / n)) - halfπ ]; - }; - return forward; - } - (d3.geo.conicConformal = function() { - return d3_geo_conic(d3_geo_conicConformal); - }).raw = d3_geo_conicConformal; - function d3_geo_conicEquidistant(φ0, φ1) { - var cosφ0 = Math.cos(φ0), n = φ0 === φ1 ? Math.sin(φ0) : (cosφ0 - Math.cos(φ1)) / (φ1 - φ0), G = cosφ0 / n + φ0; - if (abs(n) < ε) return d3_geo_equirectangular; - function forward(λ, φ) { - var ρ = G - φ; - return [ ρ * Math.sin(n * λ), G - ρ * Math.cos(n * λ) ]; - } - forward.invert = function(x, y) { - var ρ0_y = G - y; - return [ Math.atan2(x, ρ0_y) / n, G - d3_sgn(n) * Math.sqrt(x * x + ρ0_y * ρ0_y) ]; - }; - return forward; - } - (d3.geo.conicEquidistant = function() { - return d3_geo_conic(d3_geo_conicEquidistant); - }).raw = d3_geo_conicEquidistant; - var d3_geo_gnomonic = d3_geo_azimuthal(function(cosλcosφ) { - return 1 / cosλcosφ; - }, Math.atan); - (d3.geo.gnomonic = function() { - return d3_geo_projection(d3_geo_gnomonic); - }).raw = d3_geo_gnomonic; - function d3_geo_mercator(λ, φ) { - return [ λ, Math.log(Math.tan(π / 4 + φ / 2)) ]; - } - d3_geo_mercator.invert = function(x, y) { - return [ x, 2 * Math.atan(Math.exp(y)) - halfπ ]; - }; - function d3_geo_mercatorProjection(project) { - var m = d3_geo_projection(project), scale = m.scale, translate = m.translate, clipExtent = m.clipExtent, clipAuto; - m.scale = function() { - var v = scale.apply(m, arguments); - return v === m ? clipAuto ? m.clipExtent(null) : m : v; - }; - m.translate = function() { - var v = translate.apply(m, arguments); - return v === m ? clipAuto ? m.clipExtent(null) : m : v; - }; - m.clipExtent = function(_) { - var v = clipExtent.apply(m, arguments); - if (v === m) { - if (clipAuto = _ == null) { - var k = π * scale(), t = translate(); - clipExtent([ [ t[0] - k, t[1] - k ], [ t[0] + k, t[1] + k ] ]); - } - } else if (clipAuto) { - v = null; - } - return v; - }; - return m.clipExtent(null); - } - (d3.geo.mercator = function() { - return d3_geo_mercatorProjection(d3_geo_mercator); - }).raw = d3_geo_mercator; - var d3_geo_orthographic = d3_geo_azimuthal(function() { - return 1; - }, Math.asin); - (d3.geo.orthographic = function() { - return d3_geo_projection(d3_geo_orthographic); - }).raw = d3_geo_orthographic; - var d3_geo_stereographic = d3_geo_azimuthal(function(cosλcosφ) { - return 1 / (1 + cosλcosφ); - }, function(ρ) { - return 2 * Math.atan(ρ); - }); - (d3.geo.stereographic = function() { - return d3_geo_projection(d3_geo_stereographic); - }).raw = d3_geo_stereographic; - function d3_geo_transverseMercator(λ, φ) { - return [ Math.log(Math.tan(π / 4 + φ / 2)), -λ ]; - } - d3_geo_transverseMercator.invert = function(x, y) { - return [ -y, 2 * Math.atan(Math.exp(x)) - halfπ ]; - }; - (d3.geo.transverseMercator = function() { - var projection = d3_geo_mercatorProjection(d3_geo_transverseMercator), center = projection.center, rotate = projection.rotate; - projection.center = function(_) { - return _ ? center([ -_[1], _[0] ]) : (_ = center(), [ _[1], -_[0] ]); - }; - projection.rotate = function(_) { - return _ ? rotate([ _[0], _[1], _.length > 2 ? _[2] + 90 : 90 ]) : (_ = rotate(), - [ _[0], _[1], _[2] - 90 ]); - }; - return rotate([ 0, 0, 90 ]); - }).raw = d3_geo_transverseMercator; - d3.geom = {}; - function d3_geom_pointX(d) { - return d[0]; - } - function d3_geom_pointY(d) { - return d[1]; - } - d3.geom.hull = function(vertices) { - var x = d3_geom_pointX, y = d3_geom_pointY; - if (arguments.length) return hull(vertices); - function hull(data) { - if (data.length < 3) return []; - var fx = d3_functor(x), fy = d3_functor(y), i, n = data.length, points = [], flippedPoints = []; - for (i = 0; i < n; i++) { - points.push([ +fx.call(this, data[i], i), +fy.call(this, data[i], i), i ]); - } - points.sort(d3_geom_hullOrder); - for (i = 0; i < n; i++) flippedPoints.push([ points[i][0], -points[i][1] ]); - var upper = d3_geom_hullUpper(points), lower = d3_geom_hullUpper(flippedPoints); - var skipLeft = lower[0] === upper[0], skipRight = lower[lower.length - 1] === upper[upper.length - 1], polygon = []; - for (i = upper.length - 1; i >= 0; --i) polygon.push(data[points[upper[i]][2]]); - for (i = +skipLeft; i < lower.length - skipRight; ++i) polygon.push(data[points[lower[i]][2]]); - return polygon; - } - hull.x = function(_) { - return arguments.length ? (x = _, hull) : x; - }; - hull.y = function(_) { - return arguments.length ? (y = _, hull) : y; - }; - return hull; - }; - function d3_geom_hullUpper(points) { - var n = points.length, hull = [ 0, 1 ], hs = 2; - for (var i = 2; i < n; i++) { - while (hs > 1 && d3_cross2d(points[hull[hs - 2]], points[hull[hs - 1]], points[i]) <= 0) --hs; - hull[hs++] = i; - } - return hull.slice(0, hs); - } - function d3_geom_hullOrder(a, b) { - return a[0] - b[0] || a[1] - b[1]; - } - d3.geom.polygon = function(coordinates) { - d3_subclass(coordinates, d3_geom_polygonPrototype); - return coordinates; - }; - var d3_geom_polygonPrototype = d3.geom.polygon.prototype = []; - d3_geom_polygonPrototype.area = function() { - var i = -1, n = this.length, a, b = this[n - 1], area = 0; - while (++i < n) { - a = b; - b = this[i]; - area += a[1] * b[0] - a[0] * b[1]; - } - return area * .5; - }; - d3_geom_polygonPrototype.centroid = function(k) { - var i = -1, n = this.length, x = 0, y = 0, a, b = this[n - 1], c; - if (!arguments.length) k = -1 / (6 * this.area()); - while (++i < n) { - a = b; - b = this[i]; - c = a[0] * b[1] - b[0] * a[1]; - x += (a[0] + b[0]) * c; - y += (a[1] + b[1]) * c; - } - return [ x * k, y * k ]; - }; - d3_geom_polygonPrototype.clip = function(subject) { - var input, closed = d3_geom_polygonClosed(subject), i = -1, n = this.length - d3_geom_polygonClosed(this), j, m, a = this[n - 1], b, c, d; - while (++i < n) { - input = subject.slice(); - subject.length = 0; - b = this[i]; - c = input[(m = input.length - closed) - 1]; - j = -1; - while (++j < m) { - d = input[j]; - if (d3_geom_polygonInside(d, a, b)) { - if (!d3_geom_polygonInside(c, a, b)) { - subject.push(d3_geom_polygonIntersect(c, d, a, b)); - } - subject.push(d); - } else if (d3_geom_polygonInside(c, a, b)) { - subject.push(d3_geom_polygonIntersect(c, d, a, b)); - } - c = d; - } - if (closed) subject.push(subject[0]); - a = b; - } - return subject; - }; - function d3_geom_polygonInside(p, a, b) { - return (b[0] - a[0]) * (p[1] - a[1]) < (b[1] - a[1]) * (p[0] - a[0]); - } - function d3_geom_polygonIntersect(c, d, a, b) { - var x1 = c[0], x3 = a[0], x21 = d[0] - x1, x43 = b[0] - x3, y1 = c[1], y3 = a[1], y21 = d[1] - y1, y43 = b[1] - y3, ua = (x43 * (y1 - y3) - y43 * (x1 - x3)) / (y43 * x21 - x43 * y21); - return [ x1 + ua * x21, y1 + ua * y21 ]; - } - function d3_geom_polygonClosed(coordinates) { - var a = coordinates[0], b = coordinates[coordinates.length - 1]; - return !(a[0] - b[0] || a[1] - b[1]); - } - var d3_geom_voronoiEdges, d3_geom_voronoiCells, d3_geom_voronoiBeaches, d3_geom_voronoiBeachPool = [], d3_geom_voronoiFirstCircle, d3_geom_voronoiCircles, d3_geom_voronoiCirclePool = []; - function d3_geom_voronoiBeach() { - d3_geom_voronoiRedBlackNode(this); - this.edge = this.site = this.circle = null; - } - function d3_geom_voronoiCreateBeach(site) { - var beach = d3_geom_voronoiBeachPool.pop() || new d3_geom_voronoiBeach(); - beach.site = site; - return beach; - } - function d3_geom_voronoiDetachBeach(beach) { - d3_geom_voronoiDetachCircle(beach); - d3_geom_voronoiBeaches.remove(beach); - d3_geom_voronoiBeachPool.push(beach); - d3_geom_voronoiRedBlackNode(beach); - } - function d3_geom_voronoiRemoveBeach(beach) { - var circle = beach.circle, x = circle.x, y = circle.cy, vertex = { - x: x, - y: y - }, previous = beach.P, next = beach.N, disappearing = [ beach ]; - d3_geom_voronoiDetachBeach(beach); - var lArc = previous; - while (lArc.circle && abs(x - lArc.circle.x) < ε && abs(y - lArc.circle.cy) < ε) { - previous = lArc.P; - disappearing.unshift(lArc); - d3_geom_voronoiDetachBeach(lArc); - lArc = previous; - } - disappearing.unshift(lArc); - d3_geom_voronoiDetachCircle(lArc); - var rArc = next; - while (rArc.circle && abs(x - rArc.circle.x) < ε && abs(y - rArc.circle.cy) < ε) { - next = rArc.N; - disappearing.push(rArc); - d3_geom_voronoiDetachBeach(rArc); - rArc = next; - } - disappearing.push(rArc); - d3_geom_voronoiDetachCircle(rArc); - var nArcs = disappearing.length, iArc; - for (iArc = 1; iArc < nArcs; ++iArc) { - rArc = disappearing[iArc]; - lArc = disappearing[iArc - 1]; - d3_geom_voronoiSetEdgeEnd(rArc.edge, lArc.site, rArc.site, vertex); - } - lArc = disappearing[0]; - rArc = disappearing[nArcs - 1]; - rArc.edge = d3_geom_voronoiCreateEdge(lArc.site, rArc.site, null, vertex); - d3_geom_voronoiAttachCircle(lArc); - d3_geom_voronoiAttachCircle(rArc); - } - function d3_geom_voronoiAddBeach(site) { - var x = site.x, directrix = site.y, lArc, rArc, dxl, dxr, node = d3_geom_voronoiBeaches._; - while (node) { - dxl = d3_geom_voronoiLeftBreakPoint(node, directrix) - x; - if (dxl > ε) node = node.L; else { - dxr = x - d3_geom_voronoiRightBreakPoint(node, directrix); - if (dxr > ε) { - if (!node.R) { - lArc = node; - break; - } - node = node.R; - } else { - if (dxl > -ε) { - lArc = node.P; - rArc = node; - } else if (dxr > -ε) { - lArc = node; - rArc = node.N; - } else { - lArc = rArc = node; - } - break; - } - } - } - var newArc = d3_geom_voronoiCreateBeach(site); - d3_geom_voronoiBeaches.insert(lArc, newArc); - if (!lArc && !rArc) return; - if (lArc === rArc) { - d3_geom_voronoiDetachCircle(lArc); - rArc = d3_geom_voronoiCreateBeach(lArc.site); - d3_geom_voronoiBeaches.insert(newArc, rArc); - newArc.edge = rArc.edge = d3_geom_voronoiCreateEdge(lArc.site, newArc.site); - d3_geom_voronoiAttachCircle(lArc); - d3_geom_voronoiAttachCircle(rArc); - return; - } - if (!rArc) { - newArc.edge = d3_geom_voronoiCreateEdge(lArc.site, newArc.site); - return; - } - d3_geom_voronoiDetachCircle(lArc); - d3_geom_voronoiDetachCircle(rArc); - var lSite = lArc.site, ax = lSite.x, ay = lSite.y, bx = site.x - ax, by = site.y - ay, rSite = rArc.site, cx = rSite.x - ax, cy = rSite.y - ay, d = 2 * (bx * cy - by * cx), hb = bx * bx + by * by, hc = cx * cx + cy * cy, vertex = { - x: (cy * hb - by * hc) / d + ax, - y: (bx * hc - cx * hb) / d + ay - }; - d3_geom_voronoiSetEdgeEnd(rArc.edge, lSite, rSite, vertex); - newArc.edge = d3_geom_voronoiCreateEdge(lSite, site, null, vertex); - rArc.edge = d3_geom_voronoiCreateEdge(site, rSite, null, vertex); - d3_geom_voronoiAttachCircle(lArc); - d3_geom_voronoiAttachCircle(rArc); - } - function d3_geom_voronoiLeftBreakPoint(arc, directrix) { - var site = arc.site, rfocx = site.x, rfocy = site.y, pby2 = rfocy - directrix; - if (!pby2) return rfocx; - var lArc = arc.P; - if (!lArc) return -Infinity; - site = lArc.site; - var lfocx = site.x, lfocy = site.y, plby2 = lfocy - directrix; - if (!plby2) return lfocx; - var hl = lfocx - rfocx, aby2 = 1 / pby2 - 1 / plby2, b = hl / plby2; - if (aby2) return (-b + Math.sqrt(b * b - 2 * aby2 * (hl * hl / (-2 * plby2) - lfocy + plby2 / 2 + rfocy - pby2 / 2))) / aby2 + rfocx; - return (rfocx + lfocx) / 2; - } - function d3_geom_voronoiRightBreakPoint(arc, directrix) { - var rArc = arc.N; - if (rArc) return d3_geom_voronoiLeftBreakPoint(rArc, directrix); - var site = arc.site; - return site.y === directrix ? site.x : Infinity; - } - function d3_geom_voronoiCell(site) { - this.site = site; - this.edges = []; - } - d3_geom_voronoiCell.prototype.prepare = function() { - var halfEdges = this.edges, iHalfEdge = halfEdges.length, edge; - while (iHalfEdge--) { - edge = halfEdges[iHalfEdge].edge; - if (!edge.b || !edge.a) halfEdges.splice(iHalfEdge, 1); - } - halfEdges.sort(d3_geom_voronoiHalfEdgeOrder); - return halfEdges.length; - }; - function d3_geom_voronoiCloseCells(extent) { - var x0 = extent[0][0], x1 = extent[1][0], y0 = extent[0][1], y1 = extent[1][1], x2, y2, x3, y3, cells = d3_geom_voronoiCells, iCell = cells.length, cell, iHalfEdge, halfEdges, nHalfEdges, start, end; - while (iCell--) { - cell = cells[iCell]; - if (!cell || !cell.prepare()) continue; - halfEdges = cell.edges; - nHalfEdges = halfEdges.length; - iHalfEdge = 0; - while (iHalfEdge < nHalfEdges) { - end = halfEdges[iHalfEdge].end(), x3 = end.x, y3 = end.y; - start = halfEdges[++iHalfEdge % nHalfEdges].start(), x2 = start.x, y2 = start.y; - if (abs(x3 - x2) > ε || abs(y3 - y2) > ε) { - halfEdges.splice(iHalfEdge, 0, new d3_geom_voronoiHalfEdge(d3_geom_voronoiCreateBorderEdge(cell.site, end, abs(x3 - x0) < ε && y1 - y3 > ε ? { - x: x0, - y: abs(x2 - x0) < ε ? y2 : y1 - } : abs(y3 - y1) < ε && x1 - x3 > ε ? { - x: abs(y2 - y1) < ε ? x2 : x1, - y: y1 - } : abs(x3 - x1) < ε && y3 - y0 > ε ? { - x: x1, - y: abs(x2 - x1) < ε ? y2 : y0 - } : abs(y3 - y0) < ε && x3 - x0 > ε ? { - x: abs(y2 - y0) < ε ? x2 : x0, - y: y0 - } : null), cell.site, null)); - ++nHalfEdges; - } - } - } - } - function d3_geom_voronoiHalfEdgeOrder(a, b) { - return b.angle - a.angle; - } - function d3_geom_voronoiCircle() { - d3_geom_voronoiRedBlackNode(this); - this.x = this.y = this.arc = this.site = this.cy = null; - } - function d3_geom_voronoiAttachCircle(arc) { - var lArc = arc.P, rArc = arc.N; - if (!lArc || !rArc) return; - var lSite = lArc.site, cSite = arc.site, rSite = rArc.site; - if (lSite === rSite) return; - var bx = cSite.x, by = cSite.y, ax = lSite.x - bx, ay = lSite.y - by, cx = rSite.x - bx, cy = rSite.y - by; - var d = 2 * (ax * cy - ay * cx); - if (d >= -ε2) return; - var ha = ax * ax + ay * ay, hc = cx * cx + cy * cy, x = (cy * ha - ay * hc) / d, y = (ax * hc - cx * ha) / d, cy = y + by; - var circle = d3_geom_voronoiCirclePool.pop() || new d3_geom_voronoiCircle(); - circle.arc = arc; - circle.site = cSite; - circle.x = x + bx; - circle.y = cy + Math.sqrt(x * x + y * y); - circle.cy = cy; - arc.circle = circle; - var before = null, node = d3_geom_voronoiCircles._; - while (node) { - if (circle.y < node.y || circle.y === node.y && circle.x <= node.x) { - if (node.L) node = node.L; else { - before = node.P; - break; - } - } else { - if (node.R) node = node.R; else { - before = node; - break; - } - } - } - d3_geom_voronoiCircles.insert(before, circle); - if (!before) d3_geom_voronoiFirstCircle = circle; - } - function d3_geom_voronoiDetachCircle(arc) { - var circle = arc.circle; - if (circle) { - if (!circle.P) d3_geom_voronoiFirstCircle = circle.N; - d3_geom_voronoiCircles.remove(circle); - d3_geom_voronoiCirclePool.push(circle); - d3_geom_voronoiRedBlackNode(circle); - arc.circle = null; - } - } - function d3_geom_voronoiClipEdges(extent) { - var edges = d3_geom_voronoiEdges, clip = d3_geom_clipLine(extent[0][0], extent[0][1], extent[1][0], extent[1][1]), i = edges.length, e; - while (i--) { - e = edges[i]; - if (!d3_geom_voronoiConnectEdge(e, extent) || !clip(e) || abs(e.a.x - e.b.x) < ε && abs(e.a.y - e.b.y) < ε) { - e.a = e.b = null; - edges.splice(i, 1); - } - } - } - function d3_geom_voronoiConnectEdge(edge, extent) { - var vb = edge.b; - if (vb) return true; - var va = edge.a, x0 = extent[0][0], x1 = extent[1][0], y0 = extent[0][1], y1 = extent[1][1], lSite = edge.l, rSite = edge.r, lx = lSite.x, ly = lSite.y, rx = rSite.x, ry = rSite.y, fx = (lx + rx) / 2, fy = (ly + ry) / 2, fm, fb; - if (ry === ly) { - if (fx < x0 || fx >= x1) return; - if (lx > rx) { - if (!va) va = { - x: fx, - y: y0 - }; else if (va.y >= y1) return; - vb = { - x: fx, - y: y1 - }; - } else { - if (!va) va = { - x: fx, - y: y1 - }; else if (va.y < y0) return; - vb = { - x: fx, - y: y0 - }; - } - } else { - fm = (lx - rx) / (ry - ly); - fb = fy - fm * fx; - if (fm < -1 || fm > 1) { - if (lx > rx) { - if (!va) va = { - x: (y0 - fb) / fm, - y: y0 - }; else if (va.y >= y1) return; - vb = { - x: (y1 - fb) / fm, - y: y1 - }; - } else { - if (!va) va = { - x: (y1 - fb) / fm, - y: y1 - }; else if (va.y < y0) return; - vb = { - x: (y0 - fb) / fm, - y: y0 - }; - } - } else { - if (ly < ry) { - if (!va) va = { - x: x0, - y: fm * x0 + fb - }; else if (va.x >= x1) return; - vb = { - x: x1, - y: fm * x1 + fb - }; - } else { - if (!va) va = { - x: x1, - y: fm * x1 + fb - }; else if (va.x < x0) return; - vb = { - x: x0, - y: fm * x0 + fb - }; - } - } - } - edge.a = va; - edge.b = vb; - return true; - } - function d3_geom_voronoiEdge(lSite, rSite) { - this.l = lSite; - this.r = rSite; - this.a = this.b = null; - } - function d3_geom_voronoiCreateEdge(lSite, rSite, va, vb) { - var edge = new d3_geom_voronoiEdge(lSite, rSite); - d3_geom_voronoiEdges.push(edge); - if (va) d3_geom_voronoiSetEdgeEnd(edge, lSite, rSite, va); - if (vb) d3_geom_voronoiSetEdgeEnd(edge, rSite, lSite, vb); - d3_geom_voronoiCells[lSite.i].edges.push(new d3_geom_voronoiHalfEdge(edge, lSite, rSite)); - d3_geom_voronoiCells[rSite.i].edges.push(new d3_geom_voronoiHalfEdge(edge, rSite, lSite)); - return edge; - } - function d3_geom_voronoiCreateBorderEdge(lSite, va, vb) { - var edge = new d3_geom_voronoiEdge(lSite, null); - edge.a = va; - edge.b = vb; - d3_geom_voronoiEdges.push(edge); - return edge; - } - function d3_geom_voronoiSetEdgeEnd(edge, lSite, rSite, vertex) { - if (!edge.a && !edge.b) { - edge.a = vertex; - edge.l = lSite; - edge.r = rSite; - } else if (edge.l === rSite) { - edge.b = vertex; - } else { - edge.a = vertex; - } - } - function d3_geom_voronoiHalfEdge(edge, lSite, rSite) { - var va = edge.a, vb = edge.b; - this.edge = edge; - this.site = lSite; - this.angle = rSite ? Math.atan2(rSite.y - lSite.y, rSite.x - lSite.x) : edge.l === lSite ? Math.atan2(vb.x - va.x, va.y - vb.y) : Math.atan2(va.x - vb.x, vb.y - va.y); - } - d3_geom_voronoiHalfEdge.prototype = { - start: function() { - return this.edge.l === this.site ? this.edge.a : this.edge.b; - }, - end: function() { - return this.edge.l === this.site ? this.edge.b : this.edge.a; - } - }; - function d3_geom_voronoiRedBlackTree() { - this._ = null; - } - function d3_geom_voronoiRedBlackNode(node) { - node.U = node.C = node.L = node.R = node.P = node.N = null; - } - d3_geom_voronoiRedBlackTree.prototype = { - insert: function(after, node) { - var parent, grandpa, uncle; - if (after) { - node.P = after; - node.N = after.N; - if (after.N) after.N.P = node; - after.N = node; - if (after.R) { - after = after.R; - while (after.L) after = after.L; - after.L = node; - } else { - after.R = node; - } - parent = after; - } else if (this._) { - after = d3_geom_voronoiRedBlackFirst(this._); - node.P = null; - node.N = after; - after.P = after.L = node; - parent = after; - } else { - node.P = node.N = null; - this._ = node; - parent = null; - } - node.L = node.R = null; - node.U = parent; - node.C = true; - after = node; - while (parent && parent.C) { - grandpa = parent.U; - if (parent === grandpa.L) { - uncle = grandpa.R; - if (uncle && uncle.C) { - parent.C = uncle.C = false; - grandpa.C = true; - after = grandpa; - } else { - if (after === parent.R) { - d3_geom_voronoiRedBlackRotateLeft(this, parent); - after = parent; - parent = after.U; - } - parent.C = false; - grandpa.C = true; - d3_geom_voronoiRedBlackRotateRight(this, grandpa); - } - } else { - uncle = grandpa.L; - if (uncle && uncle.C) { - parent.C = uncle.C = false; - grandpa.C = true; - after = grandpa; - } else { - if (after === parent.L) { - d3_geom_voronoiRedBlackRotateRight(this, parent); - after = parent; - parent = after.U; - } - parent.C = false; - grandpa.C = true; - d3_geom_voronoiRedBlackRotateLeft(this, grandpa); - } - } - parent = after.U; - } - this._.C = false; - }, - remove: function(node) { - if (node.N) node.N.P = node.P; - if (node.P) node.P.N = node.N; - node.N = node.P = null; - var parent = node.U, sibling, left = node.L, right = node.R, next, red; - if (!left) next = right; else if (!right) next = left; else next = d3_geom_voronoiRedBlackFirst(right); - if (parent) { - if (parent.L === node) parent.L = next; else parent.R = next; - } else { - this._ = next; - } - if (left && right) { - red = next.C; - next.C = node.C; - next.L = left; - left.U = next; - if (next !== right) { - parent = next.U; - next.U = node.U; - node = next.R; - parent.L = node; - next.R = right; - right.U = next; - } else { - next.U = parent; - parent = next; - node = next.R; - } - } else { - red = node.C; - node = next; - } - if (node) node.U = parent; - if (red) return; - if (node && node.C) { - node.C = false; - return; - } - do { - if (node === this._) break; - if (node === parent.L) { - sibling = parent.R; - if (sibling.C) { - sibling.C = false; - parent.C = true; - d3_geom_voronoiRedBlackRotateLeft(this, parent); - sibling = parent.R; - } - if (sibling.L && sibling.L.C || sibling.R && sibling.R.C) { - if (!sibling.R || !sibling.R.C) { - sibling.L.C = false; - sibling.C = true; - d3_geom_voronoiRedBlackRotateRight(this, sibling); - sibling = parent.R; - } - sibling.C = parent.C; - parent.C = sibling.R.C = false; - d3_geom_voronoiRedBlackRotateLeft(this, parent); - node = this._; - break; - } - } else { - sibling = parent.L; - if (sibling.C) { - sibling.C = false; - parent.C = true; - d3_geom_voronoiRedBlackRotateRight(this, parent); - sibling = parent.L; - } - if (sibling.L && sibling.L.C || sibling.R && sibling.R.C) { - if (!sibling.L || !sibling.L.C) { - sibling.R.C = false; - sibling.C = true; - d3_geom_voronoiRedBlackRotateLeft(this, sibling); - sibling = parent.L; - } - sibling.C = parent.C; - parent.C = sibling.L.C = false; - d3_geom_voronoiRedBlackRotateRight(this, parent); - node = this._; - break; - } - } - sibling.C = true; - node = parent; - parent = parent.U; - } while (!node.C); - if (node) node.C = false; - } - }; - function d3_geom_voronoiRedBlackRotateLeft(tree, node) { - var p = node, q = node.R, parent = p.U; - if (parent) { - if (parent.L === p) parent.L = q; else parent.R = q; - } else { - tree._ = q; - } - q.U = parent; - p.U = q; - p.R = q.L; - if (p.R) p.R.U = p; - q.L = p; - } - function d3_geom_voronoiRedBlackRotateRight(tree, node) { - var p = node, q = node.L, parent = p.U; - if (parent) { - if (parent.L === p) parent.L = q; else parent.R = q; - } else { - tree._ = q; - } - q.U = parent; - p.U = q; - p.L = q.R; - if (p.L) p.L.U = p; - q.R = p; - } - function d3_geom_voronoiRedBlackFirst(node) { - while (node.L) node = node.L; - return node; - } - function d3_geom_voronoi(sites, bbox) { - var site = sites.sort(d3_geom_voronoiVertexOrder).pop(), x0, y0, circle; - d3_geom_voronoiEdges = []; - d3_geom_voronoiCells = new Array(sites.length); - d3_geom_voronoiBeaches = new d3_geom_voronoiRedBlackTree(); - d3_geom_voronoiCircles = new d3_geom_voronoiRedBlackTree(); - while (true) { - circle = d3_geom_voronoiFirstCircle; - if (site && (!circle || site.y < circle.y || site.y === circle.y && site.x < circle.x)) { - if (site.x !== x0 || site.y !== y0) { - d3_geom_voronoiCells[site.i] = new d3_geom_voronoiCell(site); - d3_geom_voronoiAddBeach(site); - x0 = site.x, y0 = site.y; - } - site = sites.pop(); - } else if (circle) { - d3_geom_voronoiRemoveBeach(circle.arc); - } else { - break; - } - } - if (bbox) d3_geom_voronoiClipEdges(bbox), d3_geom_voronoiCloseCells(bbox); - var diagram = { - cells: d3_geom_voronoiCells, - edges: d3_geom_voronoiEdges - }; - d3_geom_voronoiBeaches = d3_geom_voronoiCircles = d3_geom_voronoiEdges = d3_geom_voronoiCells = null; - return diagram; - } - function d3_geom_voronoiVertexOrder(a, b) { - return b.y - a.y || b.x - a.x; - } - d3.geom.voronoi = function(points) { - var x = d3_geom_pointX, y = d3_geom_pointY, fx = x, fy = y, clipExtent = d3_geom_voronoiClipExtent; - if (points) return voronoi(points); - function voronoi(data) { - var polygons = new Array(data.length), x0 = clipExtent[0][0], y0 = clipExtent[0][1], x1 = clipExtent[1][0], y1 = clipExtent[1][1]; - d3_geom_voronoi(sites(data), clipExtent).cells.forEach(function(cell, i) { - var edges = cell.edges, site = cell.site, polygon = polygons[i] = edges.length ? edges.map(function(e) { - var s = e.start(); - return [ s.x, s.y ]; - }) : site.x >= x0 && site.x <= x1 && site.y >= y0 && site.y <= y1 ? [ [ x0, y1 ], [ x1, y1 ], [ x1, y0 ], [ x0, y0 ] ] : []; - polygon.point = data[i]; - }); - return polygons; - } - function sites(data) { - return data.map(function(d, i) { - return { - x: Math.round(fx(d, i) / ε) * ε, - y: Math.round(fy(d, i) / ε) * ε, - i: i - }; - }); - } - voronoi.links = function(data) { - return d3_geom_voronoi(sites(data)).edges.filter(function(edge) { - return edge.l && edge.r; - }).map(function(edge) { - return { - source: data[edge.l.i], - target: data[edge.r.i] - }; - }); - }; - voronoi.triangles = function(data) { - var triangles = []; - d3_geom_voronoi(sites(data)).cells.forEach(function(cell, i) { - var site = cell.site, edges = cell.edges.sort(d3_geom_voronoiHalfEdgeOrder), j = -1, m = edges.length, e0, s0, e1 = edges[m - 1].edge, s1 = e1.l === site ? e1.r : e1.l; - while (++j < m) { - e0 = e1; - s0 = s1; - e1 = edges[j].edge; - s1 = e1.l === site ? e1.r : e1.l; - if (i < s0.i && i < s1.i && d3_geom_voronoiTriangleArea(site, s0, s1) < 0) { - triangles.push([ data[i], data[s0.i], data[s1.i] ]); - } - } - }); - return triangles; - }; - voronoi.x = function(_) { - return arguments.length ? (fx = d3_functor(x = _), voronoi) : x; - }; - voronoi.y = function(_) { - return arguments.length ? (fy = d3_functor(y = _), voronoi) : y; - }; - voronoi.clipExtent = function(_) { - if (!arguments.length) return clipExtent === d3_geom_voronoiClipExtent ? null : clipExtent; - clipExtent = _ == null ? d3_geom_voronoiClipExtent : _; - return voronoi; - }; - voronoi.size = function(_) { - if (!arguments.length) return clipExtent === d3_geom_voronoiClipExtent ? null : clipExtent && clipExtent[1]; - return voronoi.clipExtent(_ && [ [ 0, 0 ], _ ]); - }; - return voronoi; - }; - var d3_geom_voronoiClipExtent = [ [ -1e6, -1e6 ], [ 1e6, 1e6 ] ]; - function d3_geom_voronoiTriangleArea(a, b, c) { - return (a.x - c.x) * (b.y - a.y) - (a.x - b.x) * (c.y - a.y); - } - d3.geom.delaunay = function(vertices) { - return d3.geom.voronoi().triangles(vertices); - }; - d3.geom.quadtree = function(points, x1, y1, x2, y2) { - var x = d3_geom_pointX, y = d3_geom_pointY, compat; - if (compat = arguments.length) { - x = d3_geom_quadtreeCompatX; - y = d3_geom_quadtreeCompatY; - if (compat === 3) { - y2 = y1; - x2 = x1; - y1 = x1 = 0; - } - return quadtree(points); - } - function quadtree(data) { - var d, fx = d3_functor(x), fy = d3_functor(y), xs, ys, i, n, x1_, y1_, x2_, y2_; - if (x1 != null) { - x1_ = x1, y1_ = y1, x2_ = x2, y2_ = y2; - } else { - x2_ = y2_ = -(x1_ = y1_ = Infinity); - xs = [], ys = []; - n = data.length; - if (compat) for (i = 0; i < n; ++i) { - d = data[i]; - if (d.x < x1_) x1_ = d.x; - if (d.y < y1_) y1_ = d.y; - if (d.x > x2_) x2_ = d.x; - if (d.y > y2_) y2_ = d.y; - xs.push(d.x); - ys.push(d.y); - } else for (i = 0; i < n; ++i) { - var x_ = +fx(d = data[i], i), y_ = +fy(d, i); - if (x_ < x1_) x1_ = x_; - if (y_ < y1_) y1_ = y_; - if (x_ > x2_) x2_ = x_; - if (y_ > y2_) y2_ = y_; - xs.push(x_); - ys.push(y_); - } - } - var dx = x2_ - x1_, dy = y2_ - y1_; - if (dx > dy) y2_ = y1_ + dx; else x2_ = x1_ + dy; - function insert(n, d, x, y, x1, y1, x2, y2) { - if (isNaN(x) || isNaN(y)) return; - if (n.leaf) { - var nx = n.x, ny = n.y; - if (nx != null) { - if (abs(nx - x) + abs(ny - y) < .01) { - insertChild(n, d, x, y, x1, y1, x2, y2); - } else { - var nPoint = n.point; - n.x = n.y = n.point = null; - insertChild(n, nPoint, nx, ny, x1, y1, x2, y2); - insertChild(n, d, x, y, x1, y1, x2, y2); - } - } else { - n.x = x, n.y = y, n.point = d; - } - } else { - insertChild(n, d, x, y, x1, y1, x2, y2); - } - } - function insertChild(n, d, x, y, x1, y1, x2, y2) { - var xm = (x1 + x2) * .5, ym = (y1 + y2) * .5, right = x >= xm, below = y >= ym, i = below << 1 | right; - n.leaf = false; - n = n.nodes[i] || (n.nodes[i] = d3_geom_quadtreeNode()); - if (right) x1 = xm; else x2 = xm; - if (below) y1 = ym; else y2 = ym; - insert(n, d, x, y, x1, y1, x2, y2); - } - var root = d3_geom_quadtreeNode(); - root.add = function(d) { - insert(root, d, +fx(d, ++i), +fy(d, i), x1_, y1_, x2_, y2_); - }; - root.visit = function(f) { - d3_geom_quadtreeVisit(f, root, x1_, y1_, x2_, y2_); - }; - root.find = function(point) { - return d3_geom_quadtreeFind(root, point[0], point[1], x1_, y1_, x2_, y2_); - }; - i = -1; - if (x1 == null) { - while (++i < n) { - insert(root, data[i], xs[i], ys[i], x1_, y1_, x2_, y2_); - } - --i; - } else data.forEach(root.add); - xs = ys = data = d = null; - return root; - } - quadtree.x = function(_) { - return arguments.length ? (x = _, quadtree) : x; - }; - quadtree.y = function(_) { - return arguments.length ? (y = _, quadtree) : y; - }; - quadtree.extent = function(_) { - if (!arguments.length) return x1 == null ? null : [ [ x1, y1 ], [ x2, y2 ] ]; - if (_ == null) x1 = y1 = x2 = y2 = null; else x1 = +_[0][0], y1 = +_[0][1], x2 = +_[1][0], - y2 = +_[1][1]; - return quadtree; - }; - quadtree.size = function(_) { - if (!arguments.length) return x1 == null ? null : [ x2 - x1, y2 - y1 ]; - if (_ == null) x1 = y1 = x2 = y2 = null; else x1 = y1 = 0, x2 = +_[0], y2 = +_[1]; - return quadtree; - }; - return quadtree; - }; - function d3_geom_quadtreeCompatX(d) { - return d.x; - } - function d3_geom_quadtreeCompatY(d) { - return d.y; - } - function d3_geom_quadtreeNode() { - return { - leaf: true, - nodes: [], - point: null, - x: null, - y: null - }; - } - function d3_geom_quadtreeVisit(f, node, x1, y1, x2, y2) { - if (!f(node, x1, y1, x2, y2)) { - var sx = (x1 + x2) * .5, sy = (y1 + y2) * .5, children = node.nodes; - if (children[0]) d3_geom_quadtreeVisit(f, children[0], x1, y1, sx, sy); - if (children[1]) d3_geom_quadtreeVisit(f, children[1], sx, y1, x2, sy); - if (children[2]) d3_geom_quadtreeVisit(f, children[2], x1, sy, sx, y2); - if (children[3]) d3_geom_quadtreeVisit(f, children[3], sx, sy, x2, y2); - } - } - function d3_geom_quadtreeFind(root, x, y, x0, y0, x3, y3) { - var minDistance2 = Infinity, closestPoint; - (function find(node, x1, y1, x2, y2) { - if (x1 > x3 || y1 > y3 || x2 < x0 || y2 < y0) return; - if (point = node.point) { - var point, dx = x - node.x, dy = y - node.y, distance2 = dx * dx + dy * dy; - if (distance2 < minDistance2) { - var distance = Math.sqrt(minDistance2 = distance2); - x0 = x - distance, y0 = y - distance; - x3 = x + distance, y3 = y + distance; - closestPoint = point; - } - } - var children = node.nodes, xm = (x1 + x2) * .5, ym = (y1 + y2) * .5, right = x >= xm, below = y >= ym; - for (var i = below << 1 | right, j = i + 4; i < j; ++i) { - if (node = children[i & 3]) switch (i & 3) { - case 0: - find(node, x1, y1, xm, ym); - break; - - case 1: - find(node, xm, y1, x2, ym); - break; - - case 2: - find(node, x1, ym, xm, y2); - break; - - case 3: - find(node, xm, ym, x2, y2); - break; - } - } - })(root, x0, y0, x3, y3); - return closestPoint; - } - d3.interpolateRgb = d3_interpolateRgb; - function d3_interpolateRgb(a, b) { - a = d3.rgb(a); - b = d3.rgb(b); - var ar = a.r, ag = a.g, ab = a.b, br = b.r - ar, bg = b.g - ag, bb = b.b - ab; - return function(t) { - return "#" + d3_rgb_hex(Math.round(ar + br * t)) + d3_rgb_hex(Math.round(ag + bg * t)) + d3_rgb_hex(Math.round(ab + bb * t)); - }; - } - d3.interpolateObject = d3_interpolateObject; - function d3_interpolateObject(a, b) { - var i = {}, c = {}, k; - for (k in a) { - if (k in b) { - i[k] = d3_interpolate(a[k], b[k]); - } else { - c[k] = a[k]; - } - } - for (k in b) { - if (!(k in a)) { - c[k] = b[k]; - } - } - return function(t) { - for (k in i) c[k] = i[k](t); - return c; - }; - } - d3.interpolateNumber = d3_interpolateNumber; - function d3_interpolateNumber(a, b) { - a = +a, b = +b; - return function(t) { - return a * (1 - t) + b * t; - }; - } - d3.interpolateString = d3_interpolateString; - function d3_interpolateString(a, b) { - var bi = d3_interpolate_numberA.lastIndex = d3_interpolate_numberB.lastIndex = 0, am, bm, bs, i = -1, s = [], q = []; - a = a + "", b = b + ""; - while ((am = d3_interpolate_numberA.exec(a)) && (bm = d3_interpolate_numberB.exec(b))) { - if ((bs = bm.index) > bi) { - bs = b.slice(bi, bs); - if (s[i]) s[i] += bs; else s[++i] = bs; - } - if ((am = am[0]) === (bm = bm[0])) { - if (s[i]) s[i] += bm; else s[++i] = bm; - } else { - s[++i] = null; - q.push({ - i: i, - x: d3_interpolateNumber(am, bm) - }); - } - bi = d3_interpolate_numberB.lastIndex; - } - if (bi < b.length) { - bs = b.slice(bi); - if (s[i]) s[i] += bs; else s[++i] = bs; - } - return s.length < 2 ? q[0] ? (b = q[0].x, function(t) { - return b(t) + ""; - }) : function() { - return b; - } : (b = q.length, function(t) { - for (var i = 0, o; i < b; ++i) s[(o = q[i]).i] = o.x(t); - return s.join(""); - }); - } - var d3_interpolate_numberA = /[-+]?(?:\d+\.?\d*|\.?\d+)(?:[eE][-+]?\d+)?/g, d3_interpolate_numberB = new RegExp(d3_interpolate_numberA.source, "g"); - d3.interpolate = d3_interpolate; - function d3_interpolate(a, b) { - var i = d3.interpolators.length, f; - while (--i >= 0 && !(f = d3.interpolators[i](a, b))) ; - return f; - } - d3.interpolators = [ function(a, b) { - var t = typeof b; - return (t === "string" ? d3_rgb_names.has(b.toLowerCase()) || /^(#|rgb\(|hsl\()/i.test(b) ? d3_interpolateRgb : d3_interpolateString : b instanceof d3_color ? d3_interpolateRgb : Array.isArray(b) ? d3_interpolateArray : t === "object" && isNaN(b) ? d3_interpolateObject : d3_interpolateNumber)(a, b); - } ]; - d3.interpolateArray = d3_interpolateArray; - function d3_interpolateArray(a, b) { - var x = [], c = [], na = a.length, nb = b.length, n0 = Math.min(a.length, b.length), i; - for (i = 0; i < n0; ++i) x.push(d3_interpolate(a[i], b[i])); - for (;i < na; ++i) c[i] = a[i]; - for (;i < nb; ++i) c[i] = b[i]; - return function(t) { - for (i = 0; i < n0; ++i) c[i] = x[i](t); - return c; - }; - } - var d3_ease_default = function() { - return d3_identity; - }; - var d3_ease = d3.map({ - linear: d3_ease_default, - poly: d3_ease_poly, - quad: function() { - return d3_ease_quad; - }, - cubic: function() { - return d3_ease_cubic; - }, - sin: function() { - return d3_ease_sin; - }, - exp: function() { - return d3_ease_exp; - }, - circle: function() { - return d3_ease_circle; - }, - elastic: d3_ease_elastic, - back: d3_ease_back, - bounce: function() { - return d3_ease_bounce; - } - }); - var d3_ease_mode = d3.map({ - "in": d3_identity, - out: d3_ease_reverse, - "in-out": d3_ease_reflect, - "out-in": function(f) { - return d3_ease_reflect(d3_ease_reverse(f)); - } - }); - d3.ease = function(name) { - var i = name.indexOf("-"), t = i >= 0 ? name.slice(0, i) : name, m = i >= 0 ? name.slice(i + 1) : "in"; - t = d3_ease.get(t) || d3_ease_default; - m = d3_ease_mode.get(m) || d3_identity; - return d3_ease_clamp(m(t.apply(null, d3_arraySlice.call(arguments, 1)))); - }; - function d3_ease_clamp(f) { - return function(t) { - return t <= 0 ? 0 : t >= 1 ? 1 : f(t); - }; - } - function d3_ease_reverse(f) { - return function(t) { - return 1 - f(1 - t); - }; - } - function d3_ease_reflect(f) { - return function(t) { - return .5 * (t < .5 ? f(2 * t) : 2 - f(2 - 2 * t)); - }; - } - function d3_ease_quad(t) { - return t * t; - } - function d3_ease_cubic(t) { - return t * t * t; - } - function d3_ease_cubicInOut(t) { - if (t <= 0) return 0; - if (t >= 1) return 1; - var t2 = t * t, t3 = t2 * t; - return 4 * (t < .5 ? t3 : 3 * (t - t2) + t3 - .75); - } - function d3_ease_poly(e) { - return function(t) { - return Math.pow(t, e); - }; - } - function d3_ease_sin(t) { - return 1 - Math.cos(t * halfπ); - } - function d3_ease_exp(t) { - return Math.pow(2, 10 * (t - 1)); - } - function d3_ease_circle(t) { - return 1 - Math.sqrt(1 - t * t); - } - function d3_ease_elastic(a, p) { - var s; - if (arguments.length < 2) p = .45; - if (arguments.length) s = p / τ * Math.asin(1 / a); else a = 1, s = p / 4; - return function(t) { - return 1 + a * Math.pow(2, -10 * t) * Math.sin((t - s) * τ / p); - }; - } - function d3_ease_back(s) { - if (!s) s = 1.70158; - return function(t) { - return t * t * ((s + 1) * t - s); - }; - } - function d3_ease_bounce(t) { - return t < 1 / 2.75 ? 7.5625 * t * t : t < 2 / 2.75 ? 7.5625 * (t -= 1.5 / 2.75) * t + .75 : t < 2.5 / 2.75 ? 7.5625 * (t -= 2.25 / 2.75) * t + .9375 : 7.5625 * (t -= 2.625 / 2.75) * t + .984375; - } - d3.interpolateHcl = d3_interpolateHcl; - function d3_interpolateHcl(a, b) { - a = d3.hcl(a); - b = d3.hcl(b); - var ah = a.h, ac = a.c, al = a.l, bh = b.h - ah, bc = b.c - ac, bl = b.l - al; - if (isNaN(bc)) bc = 0, ac = isNaN(ac) ? b.c : ac; - if (isNaN(bh)) bh = 0, ah = isNaN(ah) ? b.h : ah; else if (bh > 180) bh -= 360; else if (bh < -180) bh += 360; - return function(t) { - return d3_hcl_lab(ah + bh * t, ac + bc * t, al + bl * t) + ""; - }; - } - d3.interpolateHsl = d3_interpolateHsl; - function d3_interpolateHsl(a, b) { - a = d3.hsl(a); - b = d3.hsl(b); - var ah = a.h, as = a.s, al = a.l, bh = b.h - ah, bs = b.s - as, bl = b.l - al; - if (isNaN(bs)) bs = 0, as = isNaN(as) ? b.s : as; - if (isNaN(bh)) bh = 0, ah = isNaN(ah) ? b.h : ah; else if (bh > 180) bh -= 360; else if (bh < -180) bh += 360; - return function(t) { - return d3_hsl_rgb(ah + bh * t, as + bs * t, al + bl * t) + ""; - }; - } - d3.interpolateLab = d3_interpolateLab; - function d3_interpolateLab(a, b) { - a = d3.lab(a); - b = d3.lab(b); - var al = a.l, aa = a.a, ab = a.b, bl = b.l - al, ba = b.a - aa, bb = b.b - ab; - return function(t) { - return d3_lab_rgb(al + bl * t, aa + ba * t, ab + bb * t) + ""; - }; - } - d3.interpolateRound = d3_interpolateRound; - function d3_interpolateRound(a, b) { - b -= a; - return function(t) { - return Math.round(a + b * t); - }; - } - d3.transform = function(string) { - var g = d3_document.createElementNS(d3.ns.prefix.svg, "g"); - return (d3.transform = function(string) { - if (string != null) { - g.setAttribute("transform", string); - var t = g.transform.baseVal.consolidate(); - } - return new d3_transform(t ? t.matrix : d3_transformIdentity); - })(string); - }; - function d3_transform(m) { - var r0 = [ m.a, m.b ], r1 = [ m.c, m.d ], kx = d3_transformNormalize(r0), kz = d3_transformDot(r0, r1), ky = d3_transformNormalize(d3_transformCombine(r1, r0, -kz)) || 0; - if (r0[0] * r1[1] < r1[0] * r0[1]) { - r0[0] *= -1; - r0[1] *= -1; - kx *= -1; - kz *= -1; - } - this.rotate = (kx ? Math.atan2(r0[1], r0[0]) : Math.atan2(-r1[0], r1[1])) * d3_degrees; - this.translate = [ m.e, m.f ]; - this.scale = [ kx, ky ]; - this.skew = ky ? Math.atan2(kz, ky) * d3_degrees : 0; - } - d3_transform.prototype.toString = function() { - return "translate(" + this.translate + ")rotate(" + this.rotate + ")skewX(" + this.skew + ")scale(" + this.scale + ")"; - }; - function d3_transformDot(a, b) { - return a[0] * b[0] + a[1] * b[1]; - } - function d3_transformNormalize(a) { - var k = Math.sqrt(d3_transformDot(a, a)); - if (k) { - a[0] /= k; - a[1] /= k; - } - return k; - } - function d3_transformCombine(a, b, k) { - a[0] += k * b[0]; - a[1] += k * b[1]; - return a; - } - var d3_transformIdentity = { - a: 1, - b: 0, - c: 0, - d: 1, - e: 0, - f: 0 - }; - d3.interpolateTransform = d3_interpolateTransform; - function d3_interpolateTransformPop(s) { - return s.length ? s.pop() + "," : ""; - } - function d3_interpolateTranslate(ta, tb, s, q) { - if (ta[0] !== tb[0] || ta[1] !== tb[1]) { - var i = s.push("translate(", null, ",", null, ")"); - q.push({ - i: i - 4, - x: d3_interpolateNumber(ta[0], tb[0]) - }, { - i: i - 2, - x: d3_interpolateNumber(ta[1], tb[1]) - }); - } else if (tb[0] || tb[1]) { - s.push("translate(" + tb + ")"); - } - } - function d3_interpolateRotate(ra, rb, s, q) { - if (ra !== rb) { - if (ra - rb > 180) rb += 360; else if (rb - ra > 180) ra += 360; - q.push({ - i: s.push(d3_interpolateTransformPop(s) + "rotate(", null, ")") - 2, - x: d3_interpolateNumber(ra, rb) - }); - } else if (rb) { - s.push(d3_interpolateTransformPop(s) + "rotate(" + rb + ")"); - } - } - function d3_interpolateSkew(wa, wb, s, q) { - if (wa !== wb) { - q.push({ - i: s.push(d3_interpolateTransformPop(s) + "skewX(", null, ")") - 2, - x: d3_interpolateNumber(wa, wb) - }); - } else if (wb) { - s.push(d3_interpolateTransformPop(s) + "skewX(" + wb + ")"); - } - } - function d3_interpolateScale(ka, kb, s, q) { - if (ka[0] !== kb[0] || ka[1] !== kb[1]) { - var i = s.push(d3_interpolateTransformPop(s) + "scale(", null, ",", null, ")"); - q.push({ - i: i - 4, - x: d3_interpolateNumber(ka[0], kb[0]) - }, { - i: i - 2, - x: d3_interpolateNumber(ka[1], kb[1]) - }); - } else if (kb[0] !== 1 || kb[1] !== 1) { - s.push(d3_interpolateTransformPop(s) + "scale(" + kb + ")"); - } - } - function d3_interpolateTransform(a, b) { - var s = [], q = []; - a = d3.transform(a), b = d3.transform(b); - d3_interpolateTranslate(a.translate, b.translate, s, q); - d3_interpolateRotate(a.rotate, b.rotate, s, q); - d3_interpolateSkew(a.skew, b.skew, s, q); - d3_interpolateScale(a.scale, b.scale, s, q); - a = b = null; - return function(t) { - var i = -1, n = q.length, o; - while (++i < n) s[(o = q[i]).i] = o.x(t); - return s.join(""); - }; - } - function d3_uninterpolateNumber(a, b) { - b = (b -= a = +a) || 1 / b; - return function(x) { - return (x - a) / b; - }; - } - function d3_uninterpolateClamp(a, b) { - b = (b -= a = +a) || 1 / b; - return function(x) { - return Math.max(0, Math.min(1, (x - a) / b)); - }; - } - d3.layout = {}; - d3.layout.bundle = function() { - return function(links) { - var paths = [], i = -1, n = links.length; - while (++i < n) paths.push(d3_layout_bundlePath(links[i])); - return paths; - }; - }; - function d3_layout_bundlePath(link) { - var start = link.source, end = link.target, lca = d3_layout_bundleLeastCommonAncestor(start, end), points = [ start ]; - while (start !== lca) { - start = start.parent; - points.push(start); - } - var k = points.length; - while (end !== lca) { - points.splice(k, 0, end); - end = end.parent; - } - return points; - } - function d3_layout_bundleAncestors(node) { - var ancestors = [], parent = node.parent; - while (parent != null) { - ancestors.push(node); - node = parent; - parent = parent.parent; - } - ancestors.push(node); - return ancestors; - } - function d3_layout_bundleLeastCommonAncestor(a, b) { - if (a === b) return a; - var aNodes = d3_layout_bundleAncestors(a), bNodes = d3_layout_bundleAncestors(b), aNode = aNodes.pop(), bNode = bNodes.pop(), sharedNode = null; - while (aNode === bNode) { - sharedNode = aNode; - aNode = aNodes.pop(); - bNode = bNodes.pop(); - } - return sharedNode; - } - d3.layout.chord = function() { - var chord = {}, chords, groups, matrix, n, padding = 0, sortGroups, sortSubgroups, sortChords; - function relayout() { - var subgroups = {}, groupSums = [], groupIndex = d3.range(n), subgroupIndex = [], k, x, x0, i, j; - chords = []; - groups = []; - k = 0, i = -1; - while (++i < n) { - x = 0, j = -1; - while (++j < n) { - x += matrix[i][j]; - } - groupSums.push(x); - subgroupIndex.push(d3.range(n)); - k += x; - } - if (sortGroups) { - groupIndex.sort(function(a, b) { - return sortGroups(groupSums[a], groupSums[b]); - }); - } - if (sortSubgroups) { - subgroupIndex.forEach(function(d, i) { - d.sort(function(a, b) { - return sortSubgroups(matrix[i][a], matrix[i][b]); - }); - }); - } - k = (τ - padding * n) / k; - x = 0, i = -1; - while (++i < n) { - x0 = x, j = -1; - while (++j < n) { - var di = groupIndex[i], dj = subgroupIndex[di][j], v = matrix[di][dj], a0 = x, a1 = x += v * k; - subgroups[di + "-" + dj] = { - index: di, - subindex: dj, - startAngle: a0, - endAngle: a1, - value: v - }; - } - groups[di] = { - index: di, - startAngle: x0, - endAngle: x, - value: groupSums[di] - }; - x += padding; - } - i = -1; - while (++i < n) { - j = i - 1; - while (++j < n) { - var source = subgroups[i + "-" + j], target = subgroups[j + "-" + i]; - if (source.value || target.value) { - chords.push(source.value < target.value ? { - source: target, - target: source - } : { - source: source, - target: target - }); - } - } - } - if (sortChords) resort(); - } - function resort() { - chords.sort(function(a, b) { - return sortChords((a.source.value + a.target.value) / 2, (b.source.value + b.target.value) / 2); - }); - } - chord.matrix = function(x) { - if (!arguments.length) return matrix; - n = (matrix = x) && matrix.length; - chords = groups = null; - return chord; - }; - chord.padding = function(x) { - if (!arguments.length) return padding; - padding = x; - chords = groups = null; - return chord; - }; - chord.sortGroups = function(x) { - if (!arguments.length) return sortGroups; - sortGroups = x; - chords = groups = null; - return chord; - }; - chord.sortSubgroups = function(x) { - if (!arguments.length) return sortSubgroups; - sortSubgroups = x; - chords = null; - return chord; - }; - chord.sortChords = function(x) { - if (!arguments.length) return sortChords; - sortChords = x; - if (chords) resort(); - return chord; - }; - chord.chords = function() { - if (!chords) relayout(); - return chords; - }; - chord.groups = function() { - if (!groups) relayout(); - return groups; - }; - return chord; - }; - d3.layout.force = function() { - var force = {}, event = d3.dispatch("start", "tick", "end"), timer, size = [ 1, 1 ], drag, alpha, friction = .9, linkDistance = d3_layout_forceLinkDistance, linkStrength = d3_layout_forceLinkStrength, charge = -30, chargeDistance2 = d3_layout_forceChargeDistance2, gravity = .1, theta2 = .64, nodes = [], links = [], distances, strengths, charges; - function repulse(node) { - return function(quad, x1, _, x2) { - if (quad.point !== node) { - var dx = quad.cx - node.x, dy = quad.cy - node.y, dw = x2 - x1, dn = dx * dx + dy * dy; - if (dw * dw / theta2 < dn) { - if (dn < chargeDistance2) { - var k = quad.charge / dn; - node.px -= dx * k; - node.py -= dy * k; - } - return true; - } - if (quad.point && dn && dn < chargeDistance2) { - var k = quad.pointCharge / dn; - node.px -= dx * k; - node.py -= dy * k; - } - } - return !quad.charge; - }; - } - force.tick = function() { - if ((alpha *= .99) < .005) { - timer = null; - event.end({ - type: "end", - alpha: alpha = 0 - }); - return true; - } - var n = nodes.length, m = links.length, q, i, o, s, t, l, k, x, y; - for (i = 0; i < m; ++i) { - o = links[i]; - s = o.source; - t = o.target; - x = t.x - s.x; - y = t.y - s.y; - if (l = x * x + y * y) { - l = alpha * strengths[i] * ((l = Math.sqrt(l)) - distances[i]) / l; - x *= l; - y *= l; - t.x -= x * (k = s.weight + t.weight ? s.weight / (s.weight + t.weight) : .5); - t.y -= y * k; - s.x += x * (k = 1 - k); - s.y += y * k; - } - } - if (k = alpha * gravity) { - x = size[0] / 2; - y = size[1] / 2; - i = -1; - if (k) while (++i < n) { - o = nodes[i]; - o.x += (x - o.x) * k; - o.y += (y - o.y) * k; - } - } - if (charge) { - d3_layout_forceAccumulate(q = d3.geom.quadtree(nodes), alpha, charges); - i = -1; - while (++i < n) { - if (!(o = nodes[i]).fixed) { - q.visit(repulse(o)); - } - } - } - i = -1; - while (++i < n) { - o = nodes[i]; - if (o.fixed) { - o.x = o.px; - o.y = o.py; - } else { - o.x -= (o.px - (o.px = o.x)) * friction; - o.y -= (o.py - (o.py = o.y)) * friction; - } - } - event.tick({ - type: "tick", - alpha: alpha - }); - }; - force.nodes = function(x) { - if (!arguments.length) return nodes; - nodes = x; - return force; - }; - force.links = function(x) { - if (!arguments.length) return links; - links = x; - return force; - }; - force.size = function(x) { - if (!arguments.length) return size; - size = x; - return force; - }; - force.linkDistance = function(x) { - if (!arguments.length) return linkDistance; - linkDistance = typeof x === "function" ? x : +x; - return force; - }; - force.distance = force.linkDistance; - force.linkStrength = function(x) { - if (!arguments.length) return linkStrength; - linkStrength = typeof x === "function" ? x : +x; - return force; - }; - force.friction = function(x) { - if (!arguments.length) return friction; - friction = +x; - return force; - }; - force.charge = function(x) { - if (!arguments.length) return charge; - charge = typeof x === "function" ? x : +x; - return force; - }; - force.chargeDistance = function(x) { - if (!arguments.length) return Math.sqrt(chargeDistance2); - chargeDistance2 = x * x; - return force; - }; - force.gravity = function(x) { - if (!arguments.length) return gravity; - gravity = +x; - return force; - }; - force.theta = function(x) { - if (!arguments.length) return Math.sqrt(theta2); - theta2 = x * x; - return force; - }; - force.alpha = function(x) { - if (!arguments.length) return alpha; - x = +x; - if (alpha) { - if (x > 0) { - alpha = x; - } else { - timer.c = null, timer.t = NaN, timer = null; - event.end({ - type: "end", - alpha: alpha = 0 - }); - } - } else if (x > 0) { - event.start({ - type: "start", - alpha: alpha = x - }); - timer = d3_timer(force.tick); - } - return force; - }; - force.start = function() { - var i, n = nodes.length, m = links.length, w = size[0], h = size[1], neighbors, o; - for (i = 0; i < n; ++i) { - (o = nodes[i]).index = i; - o.weight = 0; - } - for (i = 0; i < m; ++i) { - o = links[i]; - if (typeof o.source == "number") o.source = nodes[o.source]; - if (typeof o.target == "number") o.target = nodes[o.target]; - ++o.source.weight; - ++o.target.weight; - } - for (i = 0; i < n; ++i) { - o = nodes[i]; - if (isNaN(o.x)) o.x = position("x", w); - if (isNaN(o.y)) o.y = position("y", h); - if (isNaN(o.px)) o.px = o.x; - if (isNaN(o.py)) o.py = o.y; - } - distances = []; - if (typeof linkDistance === "function") for (i = 0; i < m; ++i) distances[i] = +linkDistance.call(this, links[i], i); else for (i = 0; i < m; ++i) distances[i] = linkDistance; - strengths = []; - if (typeof linkStrength === "function") for (i = 0; i < m; ++i) strengths[i] = +linkStrength.call(this, links[i], i); else for (i = 0; i < m; ++i) strengths[i] = linkStrength; - charges = []; - if (typeof charge === "function") for (i = 0; i < n; ++i) charges[i] = +charge.call(this, nodes[i], i); else for (i = 0; i < n; ++i) charges[i] = charge; - function position(dimension, size) { - if (!neighbors) { - neighbors = new Array(n); - for (j = 0; j < n; ++j) { - neighbors[j] = []; - } - for (j = 0; j < m; ++j) { - var o = links[j]; - neighbors[o.source.index].push(o.target); - neighbors[o.target.index].push(o.source); - } - } - var candidates = neighbors[i], j = -1, l = candidates.length, x; - while (++j < l) if (!isNaN(x = candidates[j][dimension])) return x; - return Math.random() * size; - } - return force.resume(); - }; - force.resume = function() { - return force.alpha(.1); - }; - force.stop = function() { - return force.alpha(0); - }; - force.drag = function() { - if (!drag) drag = d3.behavior.drag().origin(d3_identity).on("dragstart.force", d3_layout_forceDragstart).on("drag.force", dragmove).on("dragend.force", d3_layout_forceDragend); - if (!arguments.length) return drag; - this.on("mouseover.force", d3_layout_forceMouseover).on("mouseout.force", d3_layout_forceMouseout).call(drag); - }; - function dragmove(d) { - d.px = d3.event.x, d.py = d3.event.y; - force.resume(); - } - return d3.rebind(force, event, "on"); - }; - function d3_layout_forceDragstart(d) { - d.fixed |= 2; - } - function d3_layout_forceDragend(d) { - d.fixed &= ~6; - } - function d3_layout_forceMouseover(d) { - d.fixed |= 4; - d.px = d.x, d.py = d.y; - } - function d3_layout_forceMouseout(d) { - d.fixed &= ~4; - } - function d3_layout_forceAccumulate(quad, alpha, charges) { - var cx = 0, cy = 0; - quad.charge = 0; - if (!quad.leaf) { - var nodes = quad.nodes, n = nodes.length, i = -1, c; - while (++i < n) { - c = nodes[i]; - if (c == null) continue; - d3_layout_forceAccumulate(c, alpha, charges); - quad.charge += c.charge; - cx += c.charge * c.cx; - cy += c.charge * c.cy; - } - } - if (quad.point) { - if (!quad.leaf) { - quad.point.x += Math.random() - .5; - quad.point.y += Math.random() - .5; - } - var k = alpha * charges[quad.point.index]; - quad.charge += quad.pointCharge = k; - cx += k * quad.point.x; - cy += k * quad.point.y; - } - quad.cx = cx / quad.charge; - quad.cy = cy / quad.charge; - } - var d3_layout_forceLinkDistance = 20, d3_layout_forceLinkStrength = 1, d3_layout_forceChargeDistance2 = Infinity; - d3.layout.hierarchy = function() { - var sort = d3_layout_hierarchySort, children = d3_layout_hierarchyChildren, value = d3_layout_hierarchyValue; - function hierarchy(root) { - var stack = [ root ], nodes = [], node; - root.depth = 0; - while ((node = stack.pop()) != null) { - nodes.push(node); - if ((childs = children.call(hierarchy, node, node.depth)) && (n = childs.length)) { - var n, childs, child; - while (--n >= 0) { - stack.push(child = childs[n]); - child.parent = node; - child.depth = node.depth + 1; - } - if (value) node.value = 0; - node.children = childs; - } else { - if (value) node.value = +value.call(hierarchy, node, node.depth) || 0; - delete node.children; - } - } - d3_layout_hierarchyVisitAfter(root, function(node) { - var childs, parent; - if (sort && (childs = node.children)) childs.sort(sort); - if (value && (parent = node.parent)) parent.value += node.value; - }); - return nodes; - } - hierarchy.sort = function(x) { - if (!arguments.length) return sort; - sort = x; - return hierarchy; - }; - hierarchy.children = function(x) { - if (!arguments.length) return children; - children = x; - return hierarchy; - }; - hierarchy.value = function(x) { - if (!arguments.length) return value; - value = x; - return hierarchy; - }; - hierarchy.revalue = function(root) { - if (value) { - d3_layout_hierarchyVisitBefore(root, function(node) { - if (node.children) node.value = 0; - }); - d3_layout_hierarchyVisitAfter(root, function(node) { - var parent; - if (!node.children) node.value = +value.call(hierarchy, node, node.depth) || 0; - if (parent = node.parent) parent.value += node.value; - }); - } - return root; - }; - return hierarchy; - }; - function d3_layout_hierarchyRebind(object, hierarchy) { - d3.rebind(object, hierarchy, "sort", "children", "value"); - object.nodes = object; - object.links = d3_layout_hierarchyLinks; - return object; - } - function d3_layout_hierarchyVisitBefore(node, callback) { - var nodes = [ node ]; - while ((node = nodes.pop()) != null) { - callback(node); - if ((children = node.children) && (n = children.length)) { - var n, children; - while (--n >= 0) nodes.push(children[n]); - } - } - } - function d3_layout_hierarchyVisitAfter(node, callback) { - var nodes = [ node ], nodes2 = []; - while ((node = nodes.pop()) != null) { - nodes2.push(node); - if ((children = node.children) && (n = children.length)) { - var i = -1, n, children; - while (++i < n) nodes.push(children[i]); - } - } - while ((node = nodes2.pop()) != null) { - callback(node); - } - } - function d3_layout_hierarchyChildren(d) { - return d.children; - } - function d3_layout_hierarchyValue(d) { - return d.value; - } - function d3_layout_hierarchySort(a, b) { - return b.value - a.value; - } - function d3_layout_hierarchyLinks(nodes) { - return d3.merge(nodes.map(function(parent) { - return (parent.children || []).map(function(child) { - return { - source: parent, - target: child - }; - }); - })); - } - d3.layout.partition = function() { - var hierarchy = d3.layout.hierarchy(), size = [ 1, 1 ]; - function position(node, x, dx, dy) { - var children = node.children; - node.x = x; - node.y = node.depth * dy; - node.dx = dx; - node.dy = dy; - if (children && (n = children.length)) { - var i = -1, n, c, d; - dx = node.value ? dx / node.value : 0; - while (++i < n) { - position(c = children[i], x, d = c.value * dx, dy); - x += d; - } - } - } - function depth(node) { - var children = node.children, d = 0; - if (children && (n = children.length)) { - var i = -1, n; - while (++i < n) d = Math.max(d, depth(children[i])); - } - return 1 + d; - } - function partition(d, i) { - var nodes = hierarchy.call(this, d, i); - position(nodes[0], 0, size[0], size[1] / depth(nodes[0])); - return nodes; - } - partition.size = function(x) { - if (!arguments.length) return size; - size = x; - return partition; - }; - return d3_layout_hierarchyRebind(partition, hierarchy); - }; - d3.layout.pie = function() { - var value = Number, sort = d3_layout_pieSortByValue, startAngle = 0, endAngle = τ, padAngle = 0; - function pie(data) { - var n = data.length, values = data.map(function(d, i) { - return +value.call(pie, d, i); - }), a = +(typeof startAngle === "function" ? startAngle.apply(this, arguments) : startAngle), da = (typeof endAngle === "function" ? endAngle.apply(this, arguments) : endAngle) - a, p = Math.min(Math.abs(da) / n, +(typeof padAngle === "function" ? padAngle.apply(this, arguments) : padAngle)), pa = p * (da < 0 ? -1 : 1), sum = d3.sum(values), k = sum ? (da - n * pa) / sum : 0, index = d3.range(n), arcs = [], v; - if (sort != null) index.sort(sort === d3_layout_pieSortByValue ? function(i, j) { - return values[j] - values[i]; - } : function(i, j) { - return sort(data[i], data[j]); - }); - index.forEach(function(i) { - arcs[i] = { - data: data[i], - value: v = values[i], - startAngle: a, - endAngle: a += v * k + pa, - padAngle: p - }; - }); - return arcs; - } - pie.value = function(_) { - if (!arguments.length) return value; - value = _; - return pie; - }; - pie.sort = function(_) { - if (!arguments.length) return sort; - sort = _; - return pie; - }; - pie.startAngle = function(_) { - if (!arguments.length) return startAngle; - startAngle = _; - return pie; - }; - pie.endAngle = function(_) { - if (!arguments.length) return endAngle; - endAngle = _; - return pie; - }; - pie.padAngle = function(_) { - if (!arguments.length) return padAngle; - padAngle = _; - return pie; - }; - return pie; - }; - var d3_layout_pieSortByValue = {}; - d3.layout.stack = function() { - var values = d3_identity, order = d3_layout_stackOrderDefault, offset = d3_layout_stackOffsetZero, out = d3_layout_stackOut, x = d3_layout_stackX, y = d3_layout_stackY; - function stack(data, index) { - if (!(n = data.length)) return data; - var series = data.map(function(d, i) { - return values.call(stack, d, i); - }); - var points = series.map(function(d) { - return d.map(function(v, i) { - return [ x.call(stack, v, i), y.call(stack, v, i) ]; - }); - }); - var orders = order.call(stack, points, index); - series = d3.permute(series, orders); - points = d3.permute(points, orders); - var offsets = offset.call(stack, points, index); - var m = series[0].length, n, i, j, o; - for (j = 0; j < m; ++j) { - out.call(stack, series[0][j], o = offsets[j], points[0][j][1]); - for (i = 1; i < n; ++i) { - out.call(stack, series[i][j], o += points[i - 1][j][1], points[i][j][1]); - } - } - return data; - } - stack.values = function(x) { - if (!arguments.length) return values; - values = x; - return stack; - }; - stack.order = function(x) { - if (!arguments.length) return order; - order = typeof x === "function" ? x : d3_layout_stackOrders.get(x) || d3_layout_stackOrderDefault; - return stack; - }; - stack.offset = function(x) { - if (!arguments.length) return offset; - offset = typeof x === "function" ? x : d3_layout_stackOffsets.get(x) || d3_layout_stackOffsetZero; - return stack; - }; - stack.x = function(z) { - if (!arguments.length) return x; - x = z; - return stack; - }; - stack.y = function(z) { - if (!arguments.length) return y; - y = z; - return stack; - }; - stack.out = function(z) { - if (!arguments.length) return out; - out = z; - return stack; - }; - return stack; - }; - function d3_layout_stackX(d) { - return d.x; - } - function d3_layout_stackY(d) { - return d.y; - } - function d3_layout_stackOut(d, y0, y) { - d.y0 = y0; - d.y = y; - } - var d3_layout_stackOrders = d3.map({ - "inside-out": function(data) { - var n = data.length, i, j, max = data.map(d3_layout_stackMaxIndex), sums = data.map(d3_layout_stackReduceSum), index = d3.range(n).sort(function(a, b) { - return max[a] - max[b]; - }), top = 0, bottom = 0, tops = [], bottoms = []; - for (i = 0; i < n; ++i) { - j = index[i]; - if (top < bottom) { - top += sums[j]; - tops.push(j); - } else { - bottom += sums[j]; - bottoms.push(j); - } - } - return bottoms.reverse().concat(tops); - }, - reverse: function(data) { - return d3.range(data.length).reverse(); - }, - "default": d3_layout_stackOrderDefault - }); - var d3_layout_stackOffsets = d3.map({ - silhouette: function(data) { - var n = data.length, m = data[0].length, sums = [], max = 0, i, j, o, y0 = []; - for (j = 0; j < m; ++j) { - for (i = 0, o = 0; i < n; i++) o += data[i][j][1]; - if (o > max) max = o; - sums.push(o); - } - for (j = 0; j < m; ++j) { - y0[j] = (max - sums[j]) / 2; - } - return y0; - }, - wiggle: function(data) { - var n = data.length, x = data[0], m = x.length, i, j, k, s1, s2, s3, dx, o, o0, y0 = []; - y0[0] = o = o0 = 0; - for (j = 1; j < m; ++j) { - for (i = 0, s1 = 0; i < n; ++i) s1 += data[i][j][1]; - for (i = 0, s2 = 0, dx = x[j][0] - x[j - 1][0]; i < n; ++i) { - for (k = 0, s3 = (data[i][j][1] - data[i][j - 1][1]) / (2 * dx); k < i; ++k) { - s3 += (data[k][j][1] - data[k][j - 1][1]) / dx; - } - s2 += s3 * data[i][j][1]; - } - y0[j] = o -= s1 ? s2 / s1 * dx : 0; - if (o < o0) o0 = o; - } - for (j = 0; j < m; ++j) y0[j] -= o0; - return y0; - }, - expand: function(data) { - var n = data.length, m = data[0].length, k = 1 / n, i, j, o, y0 = []; - for (j = 0; j < m; ++j) { - for (i = 0, o = 0; i < n; i++) o += data[i][j][1]; - if (o) for (i = 0; i < n; i++) data[i][j][1] /= o; else for (i = 0; i < n; i++) data[i][j][1] = k; - } - for (j = 0; j < m; ++j) y0[j] = 0; - return y0; - }, - zero: d3_layout_stackOffsetZero - }); - function d3_layout_stackOrderDefault(data) { - return d3.range(data.length); - } - function d3_layout_stackOffsetZero(data) { - var j = -1, m = data[0].length, y0 = []; - while (++j < m) y0[j] = 0; - return y0; - } - function d3_layout_stackMaxIndex(array) { - var i = 1, j = 0, v = array[0][1], k, n = array.length; - for (;i < n; ++i) { - if ((k = array[i][1]) > v) { - j = i; - v = k; - } - } - return j; - } - function d3_layout_stackReduceSum(d) { - return d.reduce(d3_layout_stackSum, 0); - } - function d3_layout_stackSum(p, d) { - return p + d[1]; - } - d3.layout.histogram = function() { - var frequency = true, valuer = Number, ranger = d3_layout_histogramRange, binner = d3_layout_histogramBinSturges; - function histogram(data, i) { - var bins = [], values = data.map(valuer, this), range = ranger.call(this, values, i), thresholds = binner.call(this, range, values, i), bin, i = -1, n = values.length, m = thresholds.length - 1, k = frequency ? 1 : 1 / n, x; - while (++i < m) { - bin = bins[i] = []; - bin.dx = thresholds[i + 1] - (bin.x = thresholds[i]); - bin.y = 0; - } - if (m > 0) { - i = -1; - while (++i < n) { - x = values[i]; - if (x >= range[0] && x <= range[1]) { - bin = bins[d3.bisect(thresholds, x, 1, m) - 1]; - bin.y += k; - bin.push(data[i]); - } - } - } - return bins; - } - histogram.value = function(x) { - if (!arguments.length) return valuer; - valuer = x; - return histogram; - }; - histogram.range = function(x) { - if (!arguments.length) return ranger; - ranger = d3_functor(x); - return histogram; - }; - histogram.bins = function(x) { - if (!arguments.length) return binner; - binner = typeof x === "number" ? function(range) { - return d3_layout_histogramBinFixed(range, x); - } : d3_functor(x); - return histogram; - }; - histogram.frequency = function(x) { - if (!arguments.length) return frequency; - frequency = !!x; - return histogram; - }; - return histogram; - }; - function d3_layout_histogramBinSturges(range, values) { - return d3_layout_histogramBinFixed(range, Math.ceil(Math.log(values.length) / Math.LN2 + 1)); - } - function d3_layout_histogramBinFixed(range, n) { - var x = -1, b = +range[0], m = (range[1] - b) / n, f = []; - while (++x <= n) f[x] = m * x + b; - return f; - } - function d3_layout_histogramRange(values) { - return [ d3.min(values), d3.max(values) ]; - } - d3.layout.pack = function() { - var hierarchy = d3.layout.hierarchy().sort(d3_layout_packSort), padding = 0, size = [ 1, 1 ], radius; - function pack(d, i) { - var nodes = hierarchy.call(this, d, i), root = nodes[0], w = size[0], h = size[1], r = radius == null ? Math.sqrt : typeof radius === "function" ? radius : function() { - return radius; - }; - root.x = root.y = 0; - d3_layout_hierarchyVisitAfter(root, function(d) { - d.r = +r(d.value); - }); - d3_layout_hierarchyVisitAfter(root, d3_layout_packSiblings); - if (padding) { - var dr = padding * (radius ? 1 : Math.max(2 * root.r / w, 2 * root.r / h)) / 2; - d3_layout_hierarchyVisitAfter(root, function(d) { - d.r += dr; - }); - d3_layout_hierarchyVisitAfter(root, d3_layout_packSiblings); - d3_layout_hierarchyVisitAfter(root, function(d) { - d.r -= dr; - }); - } - d3_layout_packTransform(root, w / 2, h / 2, radius ? 1 : 1 / Math.max(2 * root.r / w, 2 * root.r / h)); - return nodes; - } - pack.size = function(_) { - if (!arguments.length) return size; - size = _; - return pack; - }; - pack.radius = function(_) { - if (!arguments.length) return radius; - radius = _ == null || typeof _ === "function" ? _ : +_; - return pack; - }; - pack.padding = function(_) { - if (!arguments.length) return padding; - padding = +_; - return pack; - }; - return d3_layout_hierarchyRebind(pack, hierarchy); - }; - function d3_layout_packSort(a, b) { - return a.value - b.value; - } - function d3_layout_packInsert(a, b) { - var c = a._pack_next; - a._pack_next = b; - b._pack_prev = a; - b._pack_next = c; - c._pack_prev = b; - } - function d3_layout_packSplice(a, b) { - a._pack_next = b; - b._pack_prev = a; - } - function d3_layout_packIntersects(a, b) { - var dx = b.x - a.x, dy = b.y - a.y, dr = a.r + b.r; - return .999 * dr * dr > dx * dx + dy * dy; - } - function d3_layout_packSiblings(node) { - if (!(nodes = node.children) || !(n = nodes.length)) return; - var nodes, xMin = Infinity, xMax = -Infinity, yMin = Infinity, yMax = -Infinity, a, b, c, i, j, k, n; - function bound(node) { - xMin = Math.min(node.x - node.r, xMin); - xMax = Math.max(node.x + node.r, xMax); - yMin = Math.min(node.y - node.r, yMin); - yMax = Math.max(node.y + node.r, yMax); - } - nodes.forEach(d3_layout_packLink); - a = nodes[0]; - a.x = -a.r; - a.y = 0; - bound(a); - if (n > 1) { - b = nodes[1]; - b.x = b.r; - b.y = 0; - bound(b); - if (n > 2) { - c = nodes[2]; - d3_layout_packPlace(a, b, c); - bound(c); - d3_layout_packInsert(a, c); - a._pack_prev = c; - d3_layout_packInsert(c, b); - b = a._pack_next; - for (i = 3; i < n; i++) { - d3_layout_packPlace(a, b, c = nodes[i]); - var isect = 0, s1 = 1, s2 = 1; - for (j = b._pack_next; j !== b; j = j._pack_next, s1++) { - if (d3_layout_packIntersects(j, c)) { - isect = 1; - break; - } - } - if (isect == 1) { - for (k = a._pack_prev; k !== j._pack_prev; k = k._pack_prev, s2++) { - if (d3_layout_packIntersects(k, c)) { - break; - } - } - } - if (isect) { - if (s1 < s2 || s1 == s2 && b.r < a.r) d3_layout_packSplice(a, b = j); else d3_layout_packSplice(a = k, b); - i--; - } else { - d3_layout_packInsert(a, c); - b = c; - bound(c); - } - } - } - } - var cx = (xMin + xMax) / 2, cy = (yMin + yMax) / 2, cr = 0; - for (i = 0; i < n; i++) { - c = nodes[i]; - c.x -= cx; - c.y -= cy; - cr = Math.max(cr, c.r + Math.sqrt(c.x * c.x + c.y * c.y)); - } - node.r = cr; - nodes.forEach(d3_layout_packUnlink); - } - function d3_layout_packLink(node) { - node._pack_next = node._pack_prev = node; - } - function d3_layout_packUnlink(node) { - delete node._pack_next; - delete node._pack_prev; - } - function d3_layout_packTransform(node, x, y, k) { - var children = node.children; - node.x = x += k * node.x; - node.y = y += k * node.y; - node.r *= k; - if (children) { - var i = -1, n = children.length; - while (++i < n) d3_layout_packTransform(children[i], x, y, k); - } - } - function d3_layout_packPlace(a, b, c) { - var db = a.r + c.r, dx = b.x - a.x, dy = b.y - a.y; - if (db && (dx || dy)) { - var da = b.r + c.r, dc = dx * dx + dy * dy; - da *= da; - db *= db; - var x = .5 + (db - da) / (2 * dc), y = Math.sqrt(Math.max(0, 2 * da * (db + dc) - (db -= dc) * db - da * da)) / (2 * dc); - c.x = a.x + x * dx + y * dy; - c.y = a.y + x * dy - y * dx; - } else { - c.x = a.x + db; - c.y = a.y; - } - } - d3.layout.tree = function() { - var hierarchy = d3.layout.hierarchy().sort(null).value(null), separation = d3_layout_treeSeparation, size = [ 1, 1 ], nodeSize = null; - function tree(d, i) { - var nodes = hierarchy.call(this, d, i), root0 = nodes[0], root1 = wrapTree(root0); - d3_layout_hierarchyVisitAfter(root1, firstWalk), root1.parent.m = -root1.z; - d3_layout_hierarchyVisitBefore(root1, secondWalk); - if (nodeSize) d3_layout_hierarchyVisitBefore(root0, sizeNode); else { - var left = root0, right = root0, bottom = root0; - d3_layout_hierarchyVisitBefore(root0, function(node) { - if (node.x < left.x) left = node; - if (node.x > right.x) right = node; - if (node.depth > bottom.depth) bottom = node; - }); - var tx = separation(left, right) / 2 - left.x, kx = size[0] / (right.x + separation(right, left) / 2 + tx), ky = size[1] / (bottom.depth || 1); - d3_layout_hierarchyVisitBefore(root0, function(node) { - node.x = (node.x + tx) * kx; - node.y = node.depth * ky; - }); - } - return nodes; - } - function wrapTree(root0) { - var root1 = { - A: null, - children: [ root0 ] - }, queue = [ root1 ], node1; - while ((node1 = queue.pop()) != null) { - for (var children = node1.children, child, i = 0, n = children.length; i < n; ++i) { - queue.push((children[i] = child = { - _: children[i], - parent: node1, - children: (child = children[i].children) && child.slice() || [], - A: null, - a: null, - z: 0, - m: 0, - c: 0, - s: 0, - t: null, - i: i - }).a = child); - } - } - return root1.children[0]; - } - function firstWalk(v) { - var children = v.children, siblings = v.parent.children, w = v.i ? siblings[v.i - 1] : null; - if (children.length) { - d3_layout_treeShift(v); - var midpoint = (children[0].z + children[children.length - 1].z) / 2; - if (w) { - v.z = w.z + separation(v._, w._); - v.m = v.z - midpoint; - } else { - v.z = midpoint; - } - } else if (w) { - v.z = w.z + separation(v._, w._); - } - v.parent.A = apportion(v, w, v.parent.A || siblings[0]); - } - function secondWalk(v) { - v._.x = v.z + v.parent.m; - v.m += v.parent.m; - } - function apportion(v, w, ancestor) { - if (w) { - var vip = v, vop = v, vim = w, vom = vip.parent.children[0], sip = vip.m, sop = vop.m, sim = vim.m, som = vom.m, shift; - while (vim = d3_layout_treeRight(vim), vip = d3_layout_treeLeft(vip), vim && vip) { - vom = d3_layout_treeLeft(vom); - vop = d3_layout_treeRight(vop); - vop.a = v; - shift = vim.z + sim - vip.z - sip + separation(vim._, vip._); - if (shift > 0) { - d3_layout_treeMove(d3_layout_treeAncestor(vim, v, ancestor), v, shift); - sip += shift; - sop += shift; - } - sim += vim.m; - sip += vip.m; - som += vom.m; - sop += vop.m; - } - if (vim && !d3_layout_treeRight(vop)) { - vop.t = vim; - vop.m += sim - sop; - } - if (vip && !d3_layout_treeLeft(vom)) { - vom.t = vip; - vom.m += sip - som; - ancestor = v; - } - } - return ancestor; - } - function sizeNode(node) { - node.x *= size[0]; - node.y = node.depth * size[1]; - } - tree.separation = function(x) { - if (!arguments.length) return separation; - separation = x; - return tree; - }; - tree.size = function(x) { - if (!arguments.length) return nodeSize ? null : size; - nodeSize = (size = x) == null ? sizeNode : null; - return tree; - }; - tree.nodeSize = function(x) { - if (!arguments.length) return nodeSize ? size : null; - nodeSize = (size = x) == null ? null : sizeNode; - return tree; - }; - return d3_layout_hierarchyRebind(tree, hierarchy); - }; - function d3_layout_treeSeparation(a, b) { - return a.parent == b.parent ? 1 : 2; - } - function d3_layout_treeLeft(v) { - var children = v.children; - return children.length ? children[0] : v.t; - } - function d3_layout_treeRight(v) { - var children = v.children, n; - return (n = children.length) ? children[n - 1] : v.t; - } - function d3_layout_treeMove(wm, wp, shift) { - var change = shift / (wp.i - wm.i); - wp.c -= change; - wp.s += shift; - wm.c += change; - wp.z += shift; - wp.m += shift; - } - function d3_layout_treeShift(v) { - var shift = 0, change = 0, children = v.children, i = children.length, w; - while (--i >= 0) { - w = children[i]; - w.z += shift; - w.m += shift; - shift += w.s + (change += w.c); - } - } - function d3_layout_treeAncestor(vim, v, ancestor) { - return vim.a.parent === v.parent ? vim.a : ancestor; - } - d3.layout.cluster = function() { - var hierarchy = d3.layout.hierarchy().sort(null).value(null), separation = d3_layout_treeSeparation, size = [ 1, 1 ], nodeSize = false; - function cluster(d, i) { - var nodes = hierarchy.call(this, d, i), root = nodes[0], previousNode, x = 0; - d3_layout_hierarchyVisitAfter(root, function(node) { - var children = node.children; - if (children && children.length) { - node.x = d3_layout_clusterX(children); - node.y = d3_layout_clusterY(children); - } else { - node.x = previousNode ? x += separation(node, previousNode) : 0; - node.y = 0; - previousNode = node; - } - }); - var left = d3_layout_clusterLeft(root), right = d3_layout_clusterRight(root), x0 = left.x - separation(left, right) / 2, x1 = right.x + separation(right, left) / 2; - d3_layout_hierarchyVisitAfter(root, nodeSize ? function(node) { - node.x = (node.x - root.x) * size[0]; - node.y = (root.y - node.y) * size[1]; - } : function(node) { - node.x = (node.x - x0) / (x1 - x0) * size[0]; - node.y = (1 - (root.y ? node.y / root.y : 1)) * size[1]; - }); - return nodes; - } - cluster.separation = function(x) { - if (!arguments.length) return separation; - separation = x; - return cluster; - }; - cluster.size = function(x) { - if (!arguments.length) return nodeSize ? null : size; - nodeSize = (size = x) == null; - return cluster; - }; - cluster.nodeSize = function(x) { - if (!arguments.length) return nodeSize ? size : null; - nodeSize = (size = x) != null; - return cluster; - }; - return d3_layout_hierarchyRebind(cluster, hierarchy); - }; - function d3_layout_clusterY(children) { - return 1 + d3.max(children, function(child) { - return child.y; - }); - } - function d3_layout_clusterX(children) { - return children.reduce(function(x, child) { - return x + child.x; - }, 0) / children.length; - } - function d3_layout_clusterLeft(node) { - var children = node.children; - return children && children.length ? d3_layout_clusterLeft(children[0]) : node; - } - function d3_layout_clusterRight(node) { - var children = node.children, n; - return children && (n = children.length) ? d3_layout_clusterRight(children[n - 1]) : node; - } - d3.layout.treemap = function() { - var hierarchy = d3.layout.hierarchy(), round = Math.round, size = [ 1, 1 ], padding = null, pad = d3_layout_treemapPadNull, sticky = false, stickies, mode = "squarify", ratio = .5 * (1 + Math.sqrt(5)); - function scale(children, k) { - var i = -1, n = children.length, child, area; - while (++i < n) { - area = (child = children[i]).value * (k < 0 ? 0 : k); - child.area = isNaN(area) || area <= 0 ? 0 : area; - } - } - function squarify(node) { - var children = node.children; - if (children && children.length) { - var rect = pad(node), row = [], remaining = children.slice(), child, best = Infinity, score, u = mode === "slice" ? rect.dx : mode === "dice" ? rect.dy : mode === "slice-dice" ? node.depth & 1 ? rect.dy : rect.dx : Math.min(rect.dx, rect.dy), n; - scale(remaining, rect.dx * rect.dy / node.value); - row.area = 0; - while ((n = remaining.length) > 0) { - row.push(child = remaining[n - 1]); - row.area += child.area; - if (mode !== "squarify" || (score = worst(row, u)) <= best) { - remaining.pop(); - best = score; - } else { - row.area -= row.pop().area; - position(row, u, rect, false); - u = Math.min(rect.dx, rect.dy); - row.length = row.area = 0; - best = Infinity; - } - } - if (row.length) { - position(row, u, rect, true); - row.length = row.area = 0; - } - children.forEach(squarify); - } - } - function stickify(node) { - var children = node.children; - if (children && children.length) { - var rect = pad(node), remaining = children.slice(), child, row = []; - scale(remaining, rect.dx * rect.dy / node.value); - row.area = 0; - while (child = remaining.pop()) { - row.push(child); - row.area += child.area; - if (child.z != null) { - position(row, child.z ? rect.dx : rect.dy, rect, !remaining.length); - row.length = row.area = 0; - } - } - children.forEach(stickify); - } - } - function worst(row, u) { - var s = row.area, r, rmax = 0, rmin = Infinity, i = -1, n = row.length; - while (++i < n) { - if (!(r = row[i].area)) continue; - if (r < rmin) rmin = r; - if (r > rmax) rmax = r; - } - s *= s; - u *= u; - return s ? Math.max(u * rmax * ratio / s, s / (u * rmin * ratio)) : Infinity; - } - function position(row, u, rect, flush) { - var i = -1, n = row.length, x = rect.x, y = rect.y, v = u ? round(row.area / u) : 0, o; - if (u == rect.dx) { - if (flush || v > rect.dy) v = rect.dy; - while (++i < n) { - o = row[i]; - o.x = x; - o.y = y; - o.dy = v; - x += o.dx = Math.min(rect.x + rect.dx - x, v ? round(o.area / v) : 0); - } - o.z = true; - o.dx += rect.x + rect.dx - x; - rect.y += v; - rect.dy -= v; - } else { - if (flush || v > rect.dx) v = rect.dx; - while (++i < n) { - o = row[i]; - o.x = x; - o.y = y; - o.dx = v; - y += o.dy = Math.min(rect.y + rect.dy - y, v ? round(o.area / v) : 0); - } - o.z = false; - o.dy += rect.y + rect.dy - y; - rect.x += v; - rect.dx -= v; - } - } - function treemap(d) { - var nodes = stickies || hierarchy(d), root = nodes[0]; - root.x = root.y = 0; - if (root.value) root.dx = size[0], root.dy = size[1]; else root.dx = root.dy = 0; - if (stickies) hierarchy.revalue(root); - scale([ root ], root.dx * root.dy / root.value); - (stickies ? stickify : squarify)(root); - if (sticky) stickies = nodes; - return nodes; - } - treemap.size = function(x) { - if (!arguments.length) return size; - size = x; - return treemap; - }; - treemap.padding = function(x) { - if (!arguments.length) return padding; - function padFunction(node) { - var p = x.call(treemap, node, node.depth); - return p == null ? d3_layout_treemapPadNull(node) : d3_layout_treemapPad(node, typeof p === "number" ? [ p, p, p, p ] : p); - } - function padConstant(node) { - return d3_layout_treemapPad(node, x); - } - var type; - pad = (padding = x) == null ? d3_layout_treemapPadNull : (type = typeof x) === "function" ? padFunction : type === "number" ? (x = [ x, x, x, x ], - padConstant) : padConstant; - return treemap; - }; - treemap.round = function(x) { - if (!arguments.length) return round != Number; - round = x ? Math.round : Number; - return treemap; - }; - treemap.sticky = function(x) { - if (!arguments.length) return sticky; - sticky = x; - stickies = null; - return treemap; - }; - treemap.ratio = function(x) { - if (!arguments.length) return ratio; - ratio = x; - return treemap; - }; - treemap.mode = function(x) { - if (!arguments.length) return mode; - mode = x + ""; - return treemap; - }; - return d3_layout_hierarchyRebind(treemap, hierarchy); - }; - function d3_layout_treemapPadNull(node) { - return { - x: node.x, - y: node.y, - dx: node.dx, - dy: node.dy - }; - } - function d3_layout_treemapPad(node, padding) { - var x = node.x + padding[3], y = node.y + padding[0], dx = node.dx - padding[1] - padding[3], dy = node.dy - padding[0] - padding[2]; - if (dx < 0) { - x += dx / 2; - dx = 0; - } - if (dy < 0) { - y += dy / 2; - dy = 0; - } - return { - x: x, - y: y, - dx: dx, - dy: dy - }; - } - d3.random = { - normal: function(µ, σ) { - var n = arguments.length; - if (n < 2) σ = 1; - if (n < 1) µ = 0; - return function() { - var x, y, r; - do { - x = Math.random() * 2 - 1; - y = Math.random() * 2 - 1; - r = x * x + y * y; - } while (!r || r > 1); - return µ + σ * x * Math.sqrt(-2 * Math.log(r) / r); - }; - }, - logNormal: function() { - var random = d3.random.normal.apply(d3, arguments); - return function() { - return Math.exp(random()); - }; - }, - bates: function(m) { - var random = d3.random.irwinHall(m); - return function() { - return random() / m; - }; - }, - irwinHall: function(m) { - return function() { - for (var s = 0, j = 0; j < m; j++) s += Math.random(); - return s; - }; - } - }; - d3.scale = {}; - function d3_scaleExtent(domain) { - var start = domain[0], stop = domain[domain.length - 1]; - return start < stop ? [ start, stop ] : [ stop, start ]; - } - function d3_scaleRange(scale) { - return scale.rangeExtent ? scale.rangeExtent() : d3_scaleExtent(scale.range()); - } - function d3_scale_bilinear(domain, range, uninterpolate, interpolate) { - var u = uninterpolate(domain[0], domain[1]), i = interpolate(range[0], range[1]); - return function(x) { - return i(u(x)); - }; - } - function d3_scale_nice(domain, nice) { - var i0 = 0, i1 = domain.length - 1, x0 = domain[i0], x1 = domain[i1], dx; - if (x1 < x0) { - dx = i0, i0 = i1, i1 = dx; - dx = x0, x0 = x1, x1 = dx; - } - domain[i0] = nice.floor(x0); - domain[i1] = nice.ceil(x1); - return domain; - } - function d3_scale_niceStep(step) { - return step ? { - floor: function(x) { - return Math.floor(x / step) * step; - }, - ceil: function(x) { - return Math.ceil(x / step) * step; - } - } : d3_scale_niceIdentity; - } - var d3_scale_niceIdentity = { - floor: d3_identity, - ceil: d3_identity - }; - function d3_scale_polylinear(domain, range, uninterpolate, interpolate) { - var u = [], i = [], j = 0, k = Math.min(domain.length, range.length) - 1; - if (domain[k] < domain[0]) { - domain = domain.slice().reverse(); - range = range.slice().reverse(); - } - while (++j <= k) { - u.push(uninterpolate(domain[j - 1], domain[j])); - i.push(interpolate(range[j - 1], range[j])); - } - return function(x) { - var j = d3.bisect(domain, x, 1, k) - 1; - return i[j](u[j](x)); - }; - } - d3.scale.linear = function() { - return d3_scale_linear([ 0, 1 ], [ 0, 1 ], d3_interpolate, false); - }; - function d3_scale_linear(domain, range, interpolate, clamp) { - var output, input; - function rescale() { - var linear = Math.min(domain.length, range.length) > 2 ? d3_scale_polylinear : d3_scale_bilinear, uninterpolate = clamp ? d3_uninterpolateClamp : d3_uninterpolateNumber; - output = linear(domain, range, uninterpolate, interpolate); - input = linear(range, domain, uninterpolate, d3_interpolate); - return scale; - } - function scale(x) { - return output(x); - } - scale.invert = function(y) { - return input(y); - }; - scale.domain = function(x) { - if (!arguments.length) return domain; - domain = x.map(Number); - return rescale(); - }; - scale.range = function(x) { - if (!arguments.length) return range; - range = x; - return rescale(); - }; - scale.rangeRound = function(x) { - return scale.range(x).interpolate(d3_interpolateRound); - }; - scale.clamp = function(x) { - if (!arguments.length) return clamp; - clamp = x; - return rescale(); - }; - scale.interpolate = function(x) { - if (!arguments.length) return interpolate; - interpolate = x; - return rescale(); - }; - scale.ticks = function(m) { - return d3_scale_linearTicks(domain, m); - }; - scale.tickFormat = function(m, format) { - return d3_scale_linearTickFormat(domain, m, format); - }; - scale.nice = function(m) { - d3_scale_linearNice(domain, m); - return rescale(); - }; - scale.copy = function() { - return d3_scale_linear(domain, range, interpolate, clamp); - }; - return rescale(); - } - function d3_scale_linearRebind(scale, linear) { - return d3.rebind(scale, linear, "range", "rangeRound", "interpolate", "clamp"); - } - function d3_scale_linearNice(domain, m) { - d3_scale_nice(domain, d3_scale_niceStep(d3_scale_linearTickRange(domain, m)[2])); - d3_scale_nice(domain, d3_scale_niceStep(d3_scale_linearTickRange(domain, m)[2])); - return domain; - } - function d3_scale_linearTickRange(domain, m) { - if (m == null) m = 10; - var extent = d3_scaleExtent(domain), span = extent[1] - extent[0], step = Math.pow(10, Math.floor(Math.log(span / m) / Math.LN10)), err = m / span * step; - if (err <= .15) step *= 10; else if (err <= .35) step *= 5; else if (err <= .75) step *= 2; - extent[0] = Math.ceil(extent[0] / step) * step; - extent[1] = Math.floor(extent[1] / step) * step + step * .5; - extent[2] = step; - return extent; - } - function d3_scale_linearTicks(domain, m) { - return d3.range.apply(d3, d3_scale_linearTickRange(domain, m)); - } - function d3_scale_linearTickFormat(domain, m, format) { - var range = d3_scale_linearTickRange(domain, m); - if (format) { - var match = d3_format_re.exec(format); - match.shift(); - if (match[8] === "s") { - var prefix = d3.formatPrefix(Math.max(abs(range[0]), abs(range[1]))); - if (!match[7]) match[7] = "." + d3_scale_linearPrecision(prefix.scale(range[2])); - match[8] = "f"; - format = d3.format(match.join("")); - return function(d) { - return format(prefix.scale(d)) + prefix.symbol; - }; - } - if (!match[7]) match[7] = "." + d3_scale_linearFormatPrecision(match[8], range); - format = match.join(""); - } else { - format = ",." + d3_scale_linearPrecision(range[2]) + "f"; - } - return d3.format(format); - } - var d3_scale_linearFormatSignificant = { - s: 1, - g: 1, - p: 1, - r: 1, - e: 1 - }; - function d3_scale_linearPrecision(value) { - return -Math.floor(Math.log(value) / Math.LN10 + .01); - } - function d3_scale_linearFormatPrecision(type, range) { - var p = d3_scale_linearPrecision(range[2]); - return type in d3_scale_linearFormatSignificant ? Math.abs(p - d3_scale_linearPrecision(Math.max(abs(range[0]), abs(range[1])))) + +(type !== "e") : p - (type === "%") * 2; - } - d3.scale.log = function() { - return d3_scale_log(d3.scale.linear().domain([ 0, 1 ]), 10, true, [ 1, 10 ]); - }; - function d3_scale_log(linear, base, positive, domain) { - function log(x) { - return (positive ? Math.log(x < 0 ? 0 : x) : -Math.log(x > 0 ? 0 : -x)) / Math.log(base); - } - function pow(x) { - return positive ? Math.pow(base, x) : -Math.pow(base, -x); - } - function scale(x) { - return linear(log(x)); - } - scale.invert = function(x) { - return pow(linear.invert(x)); - }; - scale.domain = function(x) { - if (!arguments.length) return domain; - positive = x[0] >= 0; - linear.domain((domain = x.map(Number)).map(log)); - return scale; - }; - scale.base = function(_) { - if (!arguments.length) return base; - base = +_; - linear.domain(domain.map(log)); - return scale; - }; - scale.nice = function() { - var niced = d3_scale_nice(domain.map(log), positive ? Math : d3_scale_logNiceNegative); - linear.domain(niced); - domain = niced.map(pow); - return scale; - }; - scale.ticks = function() { - var extent = d3_scaleExtent(domain), ticks = [], u = extent[0], v = extent[1], i = Math.floor(log(u)), j = Math.ceil(log(v)), n = base % 1 ? 2 : base; - if (isFinite(j - i)) { - if (positive) { - for (;i < j; i++) for (var k = 1; k < n; k++) ticks.push(pow(i) * k); - ticks.push(pow(i)); - } else { - ticks.push(pow(i)); - for (;i++ < j; ) for (var k = n - 1; k > 0; k--) ticks.push(pow(i) * k); - } - for (i = 0; ticks[i] < u; i++) {} - for (j = ticks.length; ticks[j - 1] > v; j--) {} - ticks = ticks.slice(i, j); - } - return ticks; - }; - scale.tickFormat = function(n, format) { - if (!arguments.length) return d3_scale_logFormat; - if (arguments.length < 2) format = d3_scale_logFormat; else if (typeof format !== "function") format = d3.format(format); - var k = Math.max(1, base * n / scale.ticks().length); - return function(d) { - var i = d / pow(Math.round(log(d))); - if (i * base < base - .5) i *= base; - return i <= k ? format(d) : ""; - }; - }; - scale.copy = function() { - return d3_scale_log(linear.copy(), base, positive, domain); - }; - return d3_scale_linearRebind(scale, linear); - } - var d3_scale_logFormat = d3.format(".0e"), d3_scale_logNiceNegative = { - floor: function(x) { - return -Math.ceil(-x); - }, - ceil: function(x) { - return -Math.floor(-x); - } - }; - d3.scale.pow = function() { - return d3_scale_pow(d3.scale.linear(), 1, [ 0, 1 ]); - }; - function d3_scale_pow(linear, exponent, domain) { - var powp = d3_scale_powPow(exponent), powb = d3_scale_powPow(1 / exponent); - function scale(x) { - return linear(powp(x)); - } - scale.invert = function(x) { - return powb(linear.invert(x)); - }; - scale.domain = function(x) { - if (!arguments.length) return domain; - linear.domain((domain = x.map(Number)).map(powp)); - return scale; - }; - scale.ticks = function(m) { - return d3_scale_linearTicks(domain, m); - }; - scale.tickFormat = function(m, format) { - return d3_scale_linearTickFormat(domain, m, format); - }; - scale.nice = function(m) { - return scale.domain(d3_scale_linearNice(domain, m)); - }; - scale.exponent = function(x) { - if (!arguments.length) return exponent; - powp = d3_scale_powPow(exponent = x); - powb = d3_scale_powPow(1 / exponent); - linear.domain(domain.map(powp)); - return scale; - }; - scale.copy = function() { - return d3_scale_pow(linear.copy(), exponent, domain); - }; - return d3_scale_linearRebind(scale, linear); - } - function d3_scale_powPow(e) { - return function(x) { - return x < 0 ? -Math.pow(-x, e) : Math.pow(x, e); - }; - } - d3.scale.sqrt = function() { - return d3.scale.pow().exponent(.5); - }; - d3.scale.ordinal = function() { - return d3_scale_ordinal([], { - t: "range", - a: [ [] ] - }); - }; - function d3_scale_ordinal(domain, ranger) { - var index, range, rangeBand; - function scale(x) { - return range[((index.get(x) || (ranger.t === "range" ? index.set(x, domain.push(x)) : NaN)) - 1) % range.length]; - } - function steps(start, step) { - return d3.range(domain.length).map(function(i) { - return start + step * i; - }); - } - scale.domain = function(x) { - if (!arguments.length) return domain; - domain = []; - index = new d3_Map(); - var i = -1, n = x.length, xi; - while (++i < n) if (!index.has(xi = x[i])) index.set(xi, domain.push(xi)); - return scale[ranger.t].apply(scale, ranger.a); - }; - scale.range = function(x) { - if (!arguments.length) return range; - range = x; - rangeBand = 0; - ranger = { - t: "range", - a: arguments - }; - return scale; - }; - scale.rangePoints = function(x, padding) { - if (arguments.length < 2) padding = 0; - var start = x[0], stop = x[1], step = domain.length < 2 ? (start = (start + stop) / 2, - 0) : (stop - start) / (domain.length - 1 + padding); - range = steps(start + step * padding / 2, step); - rangeBand = 0; - ranger = { - t: "rangePoints", - a: arguments - }; - return scale; - }; - scale.rangeRoundPoints = function(x, padding) { - if (arguments.length < 2) padding = 0; - var start = x[0], stop = x[1], step = domain.length < 2 ? (start = stop = Math.round((start + stop) / 2), - 0) : (stop - start) / (domain.length - 1 + padding) | 0; - range = steps(start + Math.round(step * padding / 2 + (stop - start - (domain.length - 1 + padding) * step) / 2), step); - rangeBand = 0; - ranger = { - t: "rangeRoundPoints", - a: arguments - }; - return scale; - }; - scale.rangeBands = function(x, padding, outerPadding) { - if (arguments.length < 2) padding = 0; - if (arguments.length < 3) outerPadding = padding; - var reverse = x[1] < x[0], start = x[reverse - 0], stop = x[1 - reverse], step = (stop - start) / (domain.length - padding + 2 * outerPadding); - range = steps(start + step * outerPadding, step); - if (reverse) range.reverse(); - rangeBand = step * (1 - padding); - ranger = { - t: "rangeBands", - a: arguments - }; - return scale; - }; - scale.rangeRoundBands = function(x, padding, outerPadding) { - if (arguments.length < 2) padding = 0; - if (arguments.length < 3) outerPadding = padding; - var reverse = x[1] < x[0], start = x[reverse - 0], stop = x[1 - reverse], step = Math.floor((stop - start) / (domain.length - padding + 2 * outerPadding)); - range = steps(start + Math.round((stop - start - (domain.length - padding) * step) / 2), step); - if (reverse) range.reverse(); - rangeBand = Math.round(step * (1 - padding)); - ranger = { - t: "rangeRoundBands", - a: arguments - }; - return scale; - }; - scale.rangeBand = function() { - return rangeBand; - }; - scale.rangeExtent = function() { - return d3_scaleExtent(ranger.a[0]); - }; - scale.copy = function() { - return d3_scale_ordinal(domain, ranger); - }; - return scale.domain(domain); - } - d3.scale.category10 = function() { - return d3.scale.ordinal().range(d3_category10); - }; - d3.scale.category20 = function() { - return d3.scale.ordinal().range(d3_category20); - }; - d3.scale.category20b = function() { - return d3.scale.ordinal().range(d3_category20b); - }; - d3.scale.category20c = function() { - return d3.scale.ordinal().range(d3_category20c); - }; - var d3_category10 = [ 2062260, 16744206, 2924588, 14034728, 9725885, 9197131, 14907330, 8355711, 12369186, 1556175 ].map(d3_rgbString); - var d3_category20 = [ 2062260, 11454440, 16744206, 16759672, 2924588, 10018698, 14034728, 16750742, 9725885, 12955861, 9197131, 12885140, 14907330, 16234194, 8355711, 13092807, 12369186, 14408589, 1556175, 10410725 ].map(d3_rgbString); - var d3_category20b = [ 3750777, 5395619, 7040719, 10264286, 6519097, 9216594, 11915115, 13556636, 9202993, 12426809, 15186514, 15190932, 8666169, 11356490, 14049643, 15177372, 8077683, 10834324, 13528509, 14589654 ].map(d3_rgbString); - var d3_category20c = [ 3244733, 7057110, 10406625, 13032431, 15095053, 16616764, 16625259, 16634018, 3253076, 7652470, 10607003, 13101504, 7695281, 10394312, 12369372, 14342891, 6513507, 9868950, 12434877, 14277081 ].map(d3_rgbString); - d3.scale.quantile = function() { - return d3_scale_quantile([], []); - }; - function d3_scale_quantile(domain, range) { - var thresholds; - function rescale() { - var k = 0, q = range.length; - thresholds = []; - while (++k < q) thresholds[k - 1] = d3.quantile(domain, k / q); - return scale; - } - function scale(x) { - if (!isNaN(x = +x)) return range[d3.bisect(thresholds, x)]; - } - scale.domain = function(x) { - if (!arguments.length) return domain; - domain = x.map(d3_number).filter(d3_numeric).sort(d3_ascending); - return rescale(); - }; - scale.range = function(x) { - if (!arguments.length) return range; - range = x; - return rescale(); - }; - scale.quantiles = function() { - return thresholds; - }; - scale.invertExtent = function(y) { - y = range.indexOf(y); - return y < 0 ? [ NaN, NaN ] : [ y > 0 ? thresholds[y - 1] : domain[0], y < thresholds.length ? thresholds[y] : domain[domain.length - 1] ]; - }; - scale.copy = function() { - return d3_scale_quantile(domain, range); - }; - return rescale(); - } - d3.scale.quantize = function() { - return d3_scale_quantize(0, 1, [ 0, 1 ]); - }; - function d3_scale_quantize(x0, x1, range) { - var kx, i; - function scale(x) { - return range[Math.max(0, Math.min(i, Math.floor(kx * (x - x0))))]; - } - function rescale() { - kx = range.length / (x1 - x0); - i = range.length - 1; - return scale; - } - scale.domain = function(x) { - if (!arguments.length) return [ x0, x1 ]; - x0 = +x[0]; - x1 = +x[x.length - 1]; - return rescale(); - }; - scale.range = function(x) { - if (!arguments.length) return range; - range = x; - return rescale(); - }; - scale.invertExtent = function(y) { - y = range.indexOf(y); - y = y < 0 ? NaN : y / kx + x0; - return [ y, y + 1 / kx ]; - }; - scale.copy = function() { - return d3_scale_quantize(x0, x1, range); - }; - return rescale(); - } - d3.scale.threshold = function() { - return d3_scale_threshold([ .5 ], [ 0, 1 ]); - }; - function d3_scale_threshold(domain, range) { - function scale(x) { - if (x <= x) return range[d3.bisect(domain, x)]; - } - scale.domain = function(_) { - if (!arguments.length) return domain; - domain = _; - return scale; - }; - scale.range = function(_) { - if (!arguments.length) return range; - range = _; - return scale; - }; - scale.invertExtent = function(y) { - y = range.indexOf(y); - return [ domain[y - 1], domain[y] ]; - }; - scale.copy = function() { - return d3_scale_threshold(domain, range); - }; - return scale; - } - d3.scale.identity = function() { - return d3_scale_identity([ 0, 1 ]); - }; - function d3_scale_identity(domain) { - function identity(x) { - return +x; - } - identity.invert = identity; - identity.domain = identity.range = function(x) { - if (!arguments.length) return domain; - domain = x.map(identity); - return identity; - }; - identity.ticks = function(m) { - return d3_scale_linearTicks(domain, m); - }; - identity.tickFormat = function(m, format) { - return d3_scale_linearTickFormat(domain, m, format); - }; - identity.copy = function() { - return d3_scale_identity(domain); - }; - return identity; - } - d3.svg = {}; - function d3_zero() { - return 0; - } - d3.svg.arc = function() { - var innerRadius = d3_svg_arcInnerRadius, outerRadius = d3_svg_arcOuterRadius, cornerRadius = d3_zero, padRadius = d3_svg_arcAuto, startAngle = d3_svg_arcStartAngle, endAngle = d3_svg_arcEndAngle, padAngle = d3_svg_arcPadAngle; - function arc() { - var r0 = Math.max(0, +innerRadius.apply(this, arguments)), r1 = Math.max(0, +outerRadius.apply(this, arguments)), a0 = startAngle.apply(this, arguments) - halfπ, a1 = endAngle.apply(this, arguments) - halfπ, da = Math.abs(a1 - a0), cw = a0 > a1 ? 0 : 1; - if (r1 < r0) rc = r1, r1 = r0, r0 = rc; - if (da >= τε) return circleSegment(r1, cw) + (r0 ? circleSegment(r0, 1 - cw) : "") + "Z"; - var rc, cr, rp, ap, p0 = 0, p1 = 0, x0, y0, x1, y1, x2, y2, x3, y3, path = []; - if (ap = (+padAngle.apply(this, arguments) || 0) / 2) { - rp = padRadius === d3_svg_arcAuto ? Math.sqrt(r0 * r0 + r1 * r1) : +padRadius.apply(this, arguments); - if (!cw) p1 *= -1; - if (r1) p1 = d3_asin(rp / r1 * Math.sin(ap)); - if (r0) p0 = d3_asin(rp / r0 * Math.sin(ap)); - } - if (r1) { - x0 = r1 * Math.cos(a0 + p1); - y0 = r1 * Math.sin(a0 + p1); - x1 = r1 * Math.cos(a1 - p1); - y1 = r1 * Math.sin(a1 - p1); - var l1 = Math.abs(a1 - a0 - 2 * p1) <= π ? 0 : 1; - if (p1 && d3_svg_arcSweep(x0, y0, x1, y1) === cw ^ l1) { - var h1 = (a0 + a1) / 2; - x0 = r1 * Math.cos(h1); - y0 = r1 * Math.sin(h1); - x1 = y1 = null; - } - } else { - x0 = y0 = 0; - } - if (r0) { - x2 = r0 * Math.cos(a1 - p0); - y2 = r0 * Math.sin(a1 - p0); - x3 = r0 * Math.cos(a0 + p0); - y3 = r0 * Math.sin(a0 + p0); - var l0 = Math.abs(a0 - a1 + 2 * p0) <= π ? 0 : 1; - if (p0 && d3_svg_arcSweep(x2, y2, x3, y3) === 1 - cw ^ l0) { - var h0 = (a0 + a1) / 2; - x2 = r0 * Math.cos(h0); - y2 = r0 * Math.sin(h0); - x3 = y3 = null; - } - } else { - x2 = y2 = 0; - } - if (da > ε && (rc = Math.min(Math.abs(r1 - r0) / 2, +cornerRadius.apply(this, arguments))) > .001) { - cr = r0 < r1 ^ cw ? 0 : 1; - var rc1 = rc, rc0 = rc; - if (da < π) { - var oc = x3 == null ? [ x2, y2 ] : x1 == null ? [ x0, y0 ] : d3_geom_polygonIntersect([ x0, y0 ], [ x3, y3 ], [ x1, y1 ], [ x2, y2 ]), ax = x0 - oc[0], ay = y0 - oc[1], bx = x1 - oc[0], by = y1 - oc[1], kc = 1 / Math.sin(Math.acos((ax * bx + ay * by) / (Math.sqrt(ax * ax + ay * ay) * Math.sqrt(bx * bx + by * by))) / 2), lc = Math.sqrt(oc[0] * oc[0] + oc[1] * oc[1]); - rc0 = Math.min(rc, (r0 - lc) / (kc - 1)); - rc1 = Math.min(rc, (r1 - lc) / (kc + 1)); - } - if (x1 != null) { - var t30 = d3_svg_arcCornerTangents(x3 == null ? [ x2, y2 ] : [ x3, y3 ], [ x0, y0 ], r1, rc1, cw), t12 = d3_svg_arcCornerTangents([ x1, y1 ], [ x2, y2 ], r1, rc1, cw); - if (rc === rc1) { - path.push("M", t30[0], "A", rc1, ",", rc1, " 0 0,", cr, " ", t30[1], "A", r1, ",", r1, " 0 ", 1 - cw ^ d3_svg_arcSweep(t30[1][0], t30[1][1], t12[1][0], t12[1][1]), ",", cw, " ", t12[1], "A", rc1, ",", rc1, " 0 0,", cr, " ", t12[0]); - } else { - path.push("M", t30[0], "A", rc1, ",", rc1, " 0 1,", cr, " ", t12[0]); - } - } else { - path.push("M", x0, ",", y0); - } - if (x3 != null) { - var t03 = d3_svg_arcCornerTangents([ x0, y0 ], [ x3, y3 ], r0, -rc0, cw), t21 = d3_svg_arcCornerTangents([ x2, y2 ], x1 == null ? [ x0, y0 ] : [ x1, y1 ], r0, -rc0, cw); - if (rc === rc0) { - path.push("L", t21[0], "A", rc0, ",", rc0, " 0 0,", cr, " ", t21[1], "A", r0, ",", r0, " 0 ", cw ^ d3_svg_arcSweep(t21[1][0], t21[1][1], t03[1][0], t03[1][1]), ",", 1 - cw, " ", t03[1], "A", rc0, ",", rc0, " 0 0,", cr, " ", t03[0]); - } else { - path.push("L", t21[0], "A", rc0, ",", rc0, " 0 0,", cr, " ", t03[0]); - } - } else { - path.push("L", x2, ",", y2); - } - } else { - path.push("M", x0, ",", y0); - if (x1 != null) path.push("A", r1, ",", r1, " 0 ", l1, ",", cw, " ", x1, ",", y1); - path.push("L", x2, ",", y2); - if (x3 != null) path.push("A", r0, ",", r0, " 0 ", l0, ",", 1 - cw, " ", x3, ",", y3); - } - path.push("Z"); - return path.join(""); - } - function circleSegment(r1, cw) { - return "M0," + r1 + "A" + r1 + "," + r1 + " 0 1," + cw + " 0," + -r1 + "A" + r1 + "," + r1 + " 0 1," + cw + " 0," + r1; - } - arc.innerRadius = function(v) { - if (!arguments.length) return innerRadius; - innerRadius = d3_functor(v); - return arc; - }; - arc.outerRadius = function(v) { - if (!arguments.length) return outerRadius; - outerRadius = d3_functor(v); - return arc; - }; - arc.cornerRadius = function(v) { - if (!arguments.length) return cornerRadius; - cornerRadius = d3_functor(v); - return arc; - }; - arc.padRadius = function(v) { - if (!arguments.length) return padRadius; - padRadius = v == d3_svg_arcAuto ? d3_svg_arcAuto : d3_functor(v); - return arc; - }; - arc.startAngle = function(v) { - if (!arguments.length) return startAngle; - startAngle = d3_functor(v); - return arc; - }; - arc.endAngle = function(v) { - if (!arguments.length) return endAngle; - endAngle = d3_functor(v); - return arc; - }; - arc.padAngle = function(v) { - if (!arguments.length) return padAngle; - padAngle = d3_functor(v); - return arc; - }; - arc.centroid = function() { - var r = (+innerRadius.apply(this, arguments) + +outerRadius.apply(this, arguments)) / 2, a = (+startAngle.apply(this, arguments) + +endAngle.apply(this, arguments)) / 2 - halfπ; - return [ Math.cos(a) * r, Math.sin(a) * r ]; - }; - return arc; - }; - var d3_svg_arcAuto = "auto"; - function d3_svg_arcInnerRadius(d) { - return d.innerRadius; - } - function d3_svg_arcOuterRadius(d) { - return d.outerRadius; - } - function d3_svg_arcStartAngle(d) { - return d.startAngle; - } - function d3_svg_arcEndAngle(d) { - return d.endAngle; - } - function d3_svg_arcPadAngle(d) { - return d && d.padAngle; - } - function d3_svg_arcSweep(x0, y0, x1, y1) { - return (x0 - x1) * y0 - (y0 - y1) * x0 > 0 ? 0 : 1; - } - function d3_svg_arcCornerTangents(p0, p1, r1, rc, cw) { - var x01 = p0[0] - p1[0], y01 = p0[1] - p1[1], lo = (cw ? rc : -rc) / Math.sqrt(x01 * x01 + y01 * y01), ox = lo * y01, oy = -lo * x01, x1 = p0[0] + ox, y1 = p0[1] + oy, x2 = p1[0] + ox, y2 = p1[1] + oy, x3 = (x1 + x2) / 2, y3 = (y1 + y2) / 2, dx = x2 - x1, dy = y2 - y1, d2 = dx * dx + dy * dy, r = r1 - rc, D = x1 * y2 - x2 * y1, d = (dy < 0 ? -1 : 1) * Math.sqrt(Math.max(0, r * r * d2 - D * D)), cx0 = (D * dy - dx * d) / d2, cy0 = (-D * dx - dy * d) / d2, cx1 = (D * dy + dx * d) / d2, cy1 = (-D * dx + dy * d) / d2, dx0 = cx0 - x3, dy0 = cy0 - y3, dx1 = cx1 - x3, dy1 = cy1 - y3; - if (dx0 * dx0 + dy0 * dy0 > dx1 * dx1 + dy1 * dy1) cx0 = cx1, cy0 = cy1; - return [ [ cx0 - ox, cy0 - oy ], [ cx0 * r1 / r, cy0 * r1 / r ] ]; - } - function d3_svg_line(projection) { - var x = d3_geom_pointX, y = d3_geom_pointY, defined = d3_true, interpolate = d3_svg_lineLinear, interpolateKey = interpolate.key, tension = .7; - function line(data) { - var segments = [], points = [], i = -1, n = data.length, d, fx = d3_functor(x), fy = d3_functor(y); - function segment() { - segments.push("M", interpolate(projection(points), tension)); - } - while (++i < n) { - if (defined.call(this, d = data[i], i)) { - points.push([ +fx.call(this, d, i), +fy.call(this, d, i) ]); - } else if (points.length) { - segment(); - points = []; - } - } - if (points.length) segment(); - return segments.length ? segments.join("") : null; - } - line.x = function(_) { - if (!arguments.length) return x; - x = _; - return line; - }; - line.y = function(_) { - if (!arguments.length) return y; - y = _; - return line; - }; - line.defined = function(_) { - if (!arguments.length) return defined; - defined = _; - return line; - }; - line.interpolate = function(_) { - if (!arguments.length) return interpolateKey; - if (typeof _ === "function") interpolateKey = interpolate = _; else interpolateKey = (interpolate = d3_svg_lineInterpolators.get(_) || d3_svg_lineLinear).key; - return line; - }; - line.tension = function(_) { - if (!arguments.length) return tension; - tension = _; - return line; - }; - return line; - } - d3.svg.line = function() { - return d3_svg_line(d3_identity); - }; - var d3_svg_lineInterpolators = d3.map({ - linear: d3_svg_lineLinear, - "linear-closed": d3_svg_lineLinearClosed, - step: d3_svg_lineStep, - "step-before": d3_svg_lineStepBefore, - "step-after": d3_svg_lineStepAfter, - basis: d3_svg_lineBasis, - "basis-open": d3_svg_lineBasisOpen, - "basis-closed": d3_svg_lineBasisClosed, - bundle: d3_svg_lineBundle, - cardinal: d3_svg_lineCardinal, - "cardinal-open": d3_svg_lineCardinalOpen, - "cardinal-closed": d3_svg_lineCardinalClosed, - monotone: d3_svg_lineMonotone - }); - d3_svg_lineInterpolators.forEach(function(key, value) { - value.key = key; - value.closed = /-closed$/.test(key); - }); - function d3_svg_lineLinear(points) { - return points.length > 1 ? points.join("L") : points + "Z"; - } - function d3_svg_lineLinearClosed(points) { - return points.join("L") + "Z"; - } - function d3_svg_lineStep(points) { - var i = 0, n = points.length, p = points[0], path = [ p[0], ",", p[1] ]; - while (++i < n) path.push("H", (p[0] + (p = points[i])[0]) / 2, "V", p[1]); - if (n > 1) path.push("H", p[0]); - return path.join(""); - } - function d3_svg_lineStepBefore(points) { - var i = 0, n = points.length, p = points[0], path = [ p[0], ",", p[1] ]; - while (++i < n) path.push("V", (p = points[i])[1], "H", p[0]); - return path.join(""); - } - function d3_svg_lineStepAfter(points) { - var i = 0, n = points.length, p = points[0], path = [ p[0], ",", p[1] ]; - while (++i < n) path.push("H", (p = points[i])[0], "V", p[1]); - return path.join(""); - } - function d3_svg_lineCardinalOpen(points, tension) { - return points.length < 4 ? d3_svg_lineLinear(points) : points[1] + d3_svg_lineHermite(points.slice(1, -1), d3_svg_lineCardinalTangents(points, tension)); - } - function d3_svg_lineCardinalClosed(points, tension) { - return points.length < 3 ? d3_svg_lineLinearClosed(points) : points[0] + d3_svg_lineHermite((points.push(points[0]), - points), d3_svg_lineCardinalTangents([ points[points.length - 2] ].concat(points, [ points[1] ]), tension)); - } - function d3_svg_lineCardinal(points, tension) { - return points.length < 3 ? d3_svg_lineLinear(points) : points[0] + d3_svg_lineHermite(points, d3_svg_lineCardinalTangents(points, tension)); - } - function d3_svg_lineHermite(points, tangents) { - if (tangents.length < 1 || points.length != tangents.length && points.length != tangents.length + 2) { - return d3_svg_lineLinear(points); - } - var quad = points.length != tangents.length, path = "", p0 = points[0], p = points[1], t0 = tangents[0], t = t0, pi = 1; - if (quad) { - path += "Q" + (p[0] - t0[0] * 2 / 3) + "," + (p[1] - t0[1] * 2 / 3) + "," + p[0] + "," + p[1]; - p0 = points[1]; - pi = 2; - } - if (tangents.length > 1) { - t = tangents[1]; - p = points[pi]; - pi++; - path += "C" + (p0[0] + t0[0]) + "," + (p0[1] + t0[1]) + "," + (p[0] - t[0]) + "," + (p[1] - t[1]) + "," + p[0] + "," + p[1]; - for (var i = 2; i < tangents.length; i++, pi++) { - p = points[pi]; - t = tangents[i]; - path += "S" + (p[0] - t[0]) + "," + (p[1] - t[1]) + "," + p[0] + "," + p[1]; - } - } - if (quad) { - var lp = points[pi]; - path += "Q" + (p[0] + t[0] * 2 / 3) + "," + (p[1] + t[1] * 2 / 3) + "," + lp[0] + "," + lp[1]; - } - return path; - } - function d3_svg_lineCardinalTangents(points, tension) { - var tangents = [], a = (1 - tension) / 2, p0, p1 = points[0], p2 = points[1], i = 1, n = points.length; - while (++i < n) { - p0 = p1; - p1 = p2; - p2 = points[i]; - tangents.push([ a * (p2[0] - p0[0]), a * (p2[1] - p0[1]) ]); - } - return tangents; - } - function d3_svg_lineBasis(points) { - if (points.length < 3) return d3_svg_lineLinear(points); - var i = 1, n = points.length, pi = points[0], x0 = pi[0], y0 = pi[1], px = [ x0, x0, x0, (pi = points[1])[0] ], py = [ y0, y0, y0, pi[1] ], path = [ x0, ",", y0, "L", d3_svg_lineDot4(d3_svg_lineBasisBezier3, px), ",", d3_svg_lineDot4(d3_svg_lineBasisBezier3, py) ]; - points.push(points[n - 1]); - while (++i <= n) { - pi = points[i]; - px.shift(); - px.push(pi[0]); - py.shift(); - py.push(pi[1]); - d3_svg_lineBasisBezier(path, px, py); - } - points.pop(); - path.push("L", pi); - return path.join(""); - } - function d3_svg_lineBasisOpen(points) { - if (points.length < 4) return d3_svg_lineLinear(points); - var path = [], i = -1, n = points.length, pi, px = [ 0 ], py = [ 0 ]; - while (++i < 3) { - pi = points[i]; - px.push(pi[0]); - py.push(pi[1]); - } - path.push(d3_svg_lineDot4(d3_svg_lineBasisBezier3, px) + "," + d3_svg_lineDot4(d3_svg_lineBasisBezier3, py)); - --i; - while (++i < n) { - pi = points[i]; - px.shift(); - px.push(pi[0]); - py.shift(); - py.push(pi[1]); - d3_svg_lineBasisBezier(path, px, py); - } - return path.join(""); - } - function d3_svg_lineBasisClosed(points) { - var path, i = -1, n = points.length, m = n + 4, pi, px = [], py = []; - while (++i < 4) { - pi = points[i % n]; - px.push(pi[0]); - py.push(pi[1]); - } - path = [ d3_svg_lineDot4(d3_svg_lineBasisBezier3, px), ",", d3_svg_lineDot4(d3_svg_lineBasisBezier3, py) ]; - --i; - while (++i < m) { - pi = points[i % n]; - px.shift(); - px.push(pi[0]); - py.shift(); - py.push(pi[1]); - d3_svg_lineBasisBezier(path, px, py); - } - return path.join(""); - } - function d3_svg_lineBundle(points, tension) { - var n = points.length - 1; - if (n) { - var x0 = points[0][0], y0 = points[0][1], dx = points[n][0] - x0, dy = points[n][1] - y0, i = -1, p, t; - while (++i <= n) { - p = points[i]; - t = i / n; - p[0] = tension * p[0] + (1 - tension) * (x0 + t * dx); - p[1] = tension * p[1] + (1 - tension) * (y0 + t * dy); - } - } - return d3_svg_lineBasis(points); - } - function d3_svg_lineDot4(a, b) { - return a[0] * b[0] + a[1] * b[1] + a[2] * b[2] + a[3] * b[3]; - } - var d3_svg_lineBasisBezier1 = [ 0, 2 / 3, 1 / 3, 0 ], d3_svg_lineBasisBezier2 = [ 0, 1 / 3, 2 / 3, 0 ], d3_svg_lineBasisBezier3 = [ 0, 1 / 6, 2 / 3, 1 / 6 ]; - function d3_svg_lineBasisBezier(path, x, y) { - path.push("C", d3_svg_lineDot4(d3_svg_lineBasisBezier1, x), ",", d3_svg_lineDot4(d3_svg_lineBasisBezier1, y), ",", d3_svg_lineDot4(d3_svg_lineBasisBezier2, x), ",", d3_svg_lineDot4(d3_svg_lineBasisBezier2, y), ",", d3_svg_lineDot4(d3_svg_lineBasisBezier3, x), ",", d3_svg_lineDot4(d3_svg_lineBasisBezier3, y)); - } - function d3_svg_lineSlope(p0, p1) { - return (p1[1] - p0[1]) / (p1[0] - p0[0]); - } - function d3_svg_lineFiniteDifferences(points) { - var i = 0, j = points.length - 1, m = [], p0 = points[0], p1 = points[1], d = m[0] = d3_svg_lineSlope(p0, p1); - while (++i < j) { - m[i] = (d + (d = d3_svg_lineSlope(p0 = p1, p1 = points[i + 1]))) / 2; - } - m[i] = d; - return m; - } - function d3_svg_lineMonotoneTangents(points) { - var tangents = [], d, a, b, s, m = d3_svg_lineFiniteDifferences(points), i = -1, j = points.length - 1; - while (++i < j) { - d = d3_svg_lineSlope(points[i], points[i + 1]); - if (abs(d) < ε) { - m[i] = m[i + 1] = 0; - } else { - a = m[i] / d; - b = m[i + 1] / d; - s = a * a + b * b; - if (s > 9) { - s = d * 3 / Math.sqrt(s); - m[i] = s * a; - m[i + 1] = s * b; - } - } - } - i = -1; - while (++i <= j) { - s = (points[Math.min(j, i + 1)][0] - points[Math.max(0, i - 1)][0]) / (6 * (1 + m[i] * m[i])); - tangents.push([ s || 0, m[i] * s || 0 ]); - } - return tangents; - } - function d3_svg_lineMonotone(points) { - return points.length < 3 ? d3_svg_lineLinear(points) : points[0] + d3_svg_lineHermite(points, d3_svg_lineMonotoneTangents(points)); - } - d3.svg.line.radial = function() { - var line = d3_svg_line(d3_svg_lineRadial); - line.radius = line.x, delete line.x; - line.angle = line.y, delete line.y; - return line; - }; - function d3_svg_lineRadial(points) { - var point, i = -1, n = points.length, r, a; - while (++i < n) { - point = points[i]; - r = point[0]; - a = point[1] - halfπ; - point[0] = r * Math.cos(a); - point[1] = r * Math.sin(a); - } - return points; - } - function d3_svg_area(projection) { - var x0 = d3_geom_pointX, x1 = d3_geom_pointX, y0 = 0, y1 = d3_geom_pointY, defined = d3_true, interpolate = d3_svg_lineLinear, interpolateKey = interpolate.key, interpolateReverse = interpolate, L = "L", tension = .7; - function area(data) { - var segments = [], points0 = [], points1 = [], i = -1, n = data.length, d, fx0 = d3_functor(x0), fy0 = d3_functor(y0), fx1 = x0 === x1 ? function() { - return x; - } : d3_functor(x1), fy1 = y0 === y1 ? function() { - return y; - } : d3_functor(y1), x, y; - function segment() { - segments.push("M", interpolate(projection(points1), tension), L, interpolateReverse(projection(points0.reverse()), tension), "Z"); - } - while (++i < n) { - if (defined.call(this, d = data[i], i)) { - points0.push([ x = +fx0.call(this, d, i), y = +fy0.call(this, d, i) ]); - points1.push([ +fx1.call(this, d, i), +fy1.call(this, d, i) ]); - } else if (points0.length) { - segment(); - points0 = []; - points1 = []; - } - } - if (points0.length) segment(); - return segments.length ? segments.join("") : null; - } - area.x = function(_) { - if (!arguments.length) return x1; - x0 = x1 = _; - return area; - }; - area.x0 = function(_) { - if (!arguments.length) return x0; - x0 = _; - return area; - }; - area.x1 = function(_) { - if (!arguments.length) return x1; - x1 = _; - return area; - }; - area.y = function(_) { - if (!arguments.length) return y1; - y0 = y1 = _; - return area; - }; - area.y0 = function(_) { - if (!arguments.length) return y0; - y0 = _; - return area; - }; - area.y1 = function(_) { - if (!arguments.length) return y1; - y1 = _; - return area; - }; - area.defined = function(_) { - if (!arguments.length) return defined; - defined = _; - return area; - }; - area.interpolate = function(_) { - if (!arguments.length) return interpolateKey; - if (typeof _ === "function") interpolateKey = interpolate = _; else interpolateKey = (interpolate = d3_svg_lineInterpolators.get(_) || d3_svg_lineLinear).key; - interpolateReverse = interpolate.reverse || interpolate; - L = interpolate.closed ? "M" : "L"; - return area; - }; - area.tension = function(_) { - if (!arguments.length) return tension; - tension = _; - return area; - }; - return area; - } - d3_svg_lineStepBefore.reverse = d3_svg_lineStepAfter; - d3_svg_lineStepAfter.reverse = d3_svg_lineStepBefore; - d3.svg.area = function() { - return d3_svg_area(d3_identity); - }; - d3.svg.area.radial = function() { - var area = d3_svg_area(d3_svg_lineRadial); - area.radius = area.x, delete area.x; - area.innerRadius = area.x0, delete area.x0; - area.outerRadius = area.x1, delete area.x1; - area.angle = area.y, delete area.y; - area.startAngle = area.y0, delete area.y0; - area.endAngle = area.y1, delete area.y1; - return area; - }; - d3.svg.chord = function() { - var source = d3_source, target = d3_target, radius = d3_svg_chordRadius, startAngle = d3_svg_arcStartAngle, endAngle = d3_svg_arcEndAngle; - function chord(d, i) { - var s = subgroup(this, source, d, i), t = subgroup(this, target, d, i); - return "M" + s.p0 + arc(s.r, s.p1, s.a1 - s.a0) + (equals(s, t) ? curve(s.r, s.p1, s.r, s.p0) : curve(s.r, s.p1, t.r, t.p0) + arc(t.r, t.p1, t.a1 - t.a0) + curve(t.r, t.p1, s.r, s.p0)) + "Z"; - } - function subgroup(self, f, d, i) { - var subgroup = f.call(self, d, i), r = radius.call(self, subgroup, i), a0 = startAngle.call(self, subgroup, i) - halfπ, a1 = endAngle.call(self, subgroup, i) - halfπ; - return { - r: r, - a0: a0, - a1: a1, - p0: [ r * Math.cos(a0), r * Math.sin(a0) ], - p1: [ r * Math.cos(a1), r * Math.sin(a1) ] - }; - } - function equals(a, b) { - return a.a0 == b.a0 && a.a1 == b.a1; - } - function arc(r, p, a) { - return "A" + r + "," + r + " 0 " + +(a > π) + ",1 " + p; - } - function curve(r0, p0, r1, p1) { - return "Q 0,0 " + p1; - } - chord.radius = function(v) { - if (!arguments.length) return radius; - radius = d3_functor(v); - return chord; - }; - chord.source = function(v) { - if (!arguments.length) return source; - source = d3_functor(v); - return chord; - }; - chord.target = function(v) { - if (!arguments.length) return target; - target = d3_functor(v); - return chord; - }; - chord.startAngle = function(v) { - if (!arguments.length) return startAngle; - startAngle = d3_functor(v); - return chord; - }; - chord.endAngle = function(v) { - if (!arguments.length) return endAngle; - endAngle = d3_functor(v); - return chord; - }; - return chord; - }; - function d3_svg_chordRadius(d) { - return d.radius; - } - d3.svg.diagonal = function() { - var source = d3_source, target = d3_target, projection = d3_svg_diagonalProjection; - function diagonal(d, i) { - var p0 = source.call(this, d, i), p3 = target.call(this, d, i), m = (p0.y + p3.y) / 2, p = [ p0, { - x: p0.x, - y: m - }, { - x: p3.x, - y: m - }, p3 ]; - p = p.map(projection); - return "M" + p[0] + "C" + p[1] + " " + p[2] + " " + p[3]; - } - diagonal.source = function(x) { - if (!arguments.length) return source; - source = d3_functor(x); - return diagonal; - }; - diagonal.target = function(x) { - if (!arguments.length) return target; - target = d3_functor(x); - return diagonal; - }; - diagonal.projection = function(x) { - if (!arguments.length) return projection; - projection = x; - return diagonal; - }; - return diagonal; - }; - function d3_svg_diagonalProjection(d) { - return [ d.x, d.y ]; - } - d3.svg.diagonal.radial = function() { - var diagonal = d3.svg.diagonal(), projection = d3_svg_diagonalProjection, projection_ = diagonal.projection; - diagonal.projection = function(x) { - return arguments.length ? projection_(d3_svg_diagonalRadialProjection(projection = x)) : projection; - }; - return diagonal; - }; - function d3_svg_diagonalRadialProjection(projection) { - return function() { - var d = projection.apply(this, arguments), r = d[0], a = d[1] - halfπ; - return [ r * Math.cos(a), r * Math.sin(a) ]; - }; - } - d3.svg.symbol = function() { - var type = d3_svg_symbolType, size = d3_svg_symbolSize; - function symbol(d, i) { - return (d3_svg_symbols.get(type.call(this, d, i)) || d3_svg_symbolCircle)(size.call(this, d, i)); - } - symbol.type = function(x) { - if (!arguments.length) return type; - type = d3_functor(x); - return symbol; - }; - symbol.size = function(x) { - if (!arguments.length) return size; - size = d3_functor(x); - return symbol; - }; - return symbol; - }; - function d3_svg_symbolSize() { - return 64; - } - function d3_svg_symbolType() { - return "circle"; - } - function d3_svg_symbolCircle(size) { - var r = Math.sqrt(size / π); - return "M0," + r + "A" + r + "," + r + " 0 1,1 0," + -r + "A" + r + "," + r + " 0 1,1 0," + r + "Z"; - } - var d3_svg_symbols = d3.map({ - circle: d3_svg_symbolCircle, - cross: function(size) { - var r = Math.sqrt(size / 5) / 2; - return "M" + -3 * r + "," + -r + "H" + -r + "V" + -3 * r + "H" + r + "V" + -r + "H" + 3 * r + "V" + r + "H" + r + "V" + 3 * r + "H" + -r + "V" + r + "H" + -3 * r + "Z"; - }, - diamond: function(size) { - var ry = Math.sqrt(size / (2 * d3_svg_symbolTan30)), rx = ry * d3_svg_symbolTan30; - return "M0," + -ry + "L" + rx + ",0" + " 0," + ry + " " + -rx + ",0" + "Z"; - }, - square: function(size) { - var r = Math.sqrt(size) / 2; - return "M" + -r + "," + -r + "L" + r + "," + -r + " " + r + "," + r + " " + -r + "," + r + "Z"; - }, - "triangle-down": function(size) { - var rx = Math.sqrt(size / d3_svg_symbolSqrt3), ry = rx * d3_svg_symbolSqrt3 / 2; - return "M0," + ry + "L" + rx + "," + -ry + " " + -rx + "," + -ry + "Z"; - }, - "triangle-up": function(size) { - var rx = Math.sqrt(size / d3_svg_symbolSqrt3), ry = rx * d3_svg_symbolSqrt3 / 2; - return "M0," + -ry + "L" + rx + "," + ry + " " + -rx + "," + ry + "Z"; - } - }); - d3.svg.symbolTypes = d3_svg_symbols.keys(); - var d3_svg_symbolSqrt3 = Math.sqrt(3), d3_svg_symbolTan30 = Math.tan(30 * d3_radians); - d3_selectionPrototype.transition = function(name) { - var id = d3_transitionInheritId || ++d3_transitionId, ns = d3_transitionNamespace(name), subgroups = [], subgroup, node, transition = d3_transitionInherit || { - time: Date.now(), - ease: d3_ease_cubicInOut, - delay: 0, - duration: 250 - }; - for (var j = -1, m = this.length; ++j < m; ) { - subgroups.push(subgroup = []); - for (var group = this[j], i = -1, n = group.length; ++i < n; ) { - if (node = group[i]) d3_transitionNode(node, i, ns, id, transition); - subgroup.push(node); - } - } - return d3_transition(subgroups, ns, id); - }; - d3_selectionPrototype.interrupt = function(name) { - return this.each(name == null ? d3_selection_interrupt : d3_selection_interruptNS(d3_transitionNamespace(name))); - }; - var d3_selection_interrupt = d3_selection_interruptNS(d3_transitionNamespace()); - function d3_selection_interruptNS(ns) { - return function() { - var lock, activeId, active; - if ((lock = this[ns]) && (active = lock[activeId = lock.active])) { - active.timer.c = null; - active.timer.t = NaN; - if (--lock.count) delete lock[activeId]; else delete this[ns]; - lock.active += .5; - active.event && active.event.interrupt.call(this, this.__data__, active.index); - } - }; - } - function d3_transition(groups, ns, id) { - d3_subclass(groups, d3_transitionPrototype); - groups.namespace = ns; - groups.id = id; - return groups; - } - var d3_transitionPrototype = [], d3_transitionId = 0, d3_transitionInheritId, d3_transitionInherit; - d3_transitionPrototype.call = d3_selectionPrototype.call; - d3_transitionPrototype.empty = d3_selectionPrototype.empty; - d3_transitionPrototype.node = d3_selectionPrototype.node; - d3_transitionPrototype.size = d3_selectionPrototype.size; - d3.transition = function(selection, name) { - return selection && selection.transition ? d3_transitionInheritId ? selection.transition(name) : selection : d3.selection().transition(selection); - }; - d3.transition.prototype = d3_transitionPrototype; - d3_transitionPrototype.select = function(selector) { - var id = this.id, ns = this.namespace, subgroups = [], subgroup, subnode, node; - selector = d3_selection_selector(selector); - for (var j = -1, m = this.length; ++j < m; ) { - subgroups.push(subgroup = []); - for (var group = this[j], i = -1, n = group.length; ++i < n; ) { - if ((node = group[i]) && (subnode = selector.call(node, node.__data__, i, j))) { - if ("__data__" in node) subnode.__data__ = node.__data__; - d3_transitionNode(subnode, i, ns, id, node[ns][id]); - subgroup.push(subnode); - } else { - subgroup.push(null); - } - } - } - return d3_transition(subgroups, ns, id); - }; - d3_transitionPrototype.selectAll = function(selector) { - var id = this.id, ns = this.namespace, subgroups = [], subgroup, subnodes, node, subnode, transition; - selector = d3_selection_selectorAll(selector); - for (var j = -1, m = this.length; ++j < m; ) { - for (var group = this[j], i = -1, n = group.length; ++i < n; ) { - if (node = group[i]) { - transition = node[ns][id]; - subnodes = selector.call(node, node.__data__, i, j); - subgroups.push(subgroup = []); - for (var k = -1, o = subnodes.length; ++k < o; ) { - if (subnode = subnodes[k]) d3_transitionNode(subnode, k, ns, id, transition); - subgroup.push(subnode); - } - } - } - } - return d3_transition(subgroups, ns, id); - }; - d3_transitionPrototype.filter = function(filter) { - var subgroups = [], subgroup, group, node; - if (typeof filter !== "function") filter = d3_selection_filter(filter); - for (var j = 0, m = this.length; j < m; j++) { - subgroups.push(subgroup = []); - for (var group = this[j], i = 0, n = group.length; i < n; i++) { - if ((node = group[i]) && filter.call(node, node.__data__, i, j)) { - subgroup.push(node); - } - } - } - return d3_transition(subgroups, this.namespace, this.id); - }; - d3_transitionPrototype.tween = function(name, tween) { - var id = this.id, ns = this.namespace; - if (arguments.length < 2) return this.node()[ns][id].tween.get(name); - return d3_selection_each(this, tween == null ? function(node) { - node[ns][id].tween.remove(name); - } : function(node) { - node[ns][id].tween.set(name, tween); - }); - }; - function d3_transition_tween(groups, name, value, tween) { - var id = groups.id, ns = groups.namespace; - return d3_selection_each(groups, typeof value === "function" ? function(node, i, j) { - node[ns][id].tween.set(name, tween(value.call(node, node.__data__, i, j))); - } : (value = tween(value), function(node) { - node[ns][id].tween.set(name, value); - })); - } - d3_transitionPrototype.attr = function(nameNS, value) { - if (arguments.length < 2) { - for (value in nameNS) this.attr(value, nameNS[value]); - return this; - } - var interpolate = nameNS == "transform" ? d3_interpolateTransform : d3_interpolate, name = d3.ns.qualify(nameNS); - function attrNull() { - this.removeAttribute(name); - } - function attrNullNS() { - this.removeAttributeNS(name.space, name.local); - } - function attrTween(b) { - return b == null ? attrNull : (b += "", function() { - var a = this.getAttribute(name), i; - return a !== b && (i = interpolate(a, b), function(t) { - this.setAttribute(name, i(t)); - }); - }); - } - function attrTweenNS(b) { - return b == null ? attrNullNS : (b += "", function() { - var a = this.getAttributeNS(name.space, name.local), i; - return a !== b && (i = interpolate(a, b), function(t) { - this.setAttributeNS(name.space, name.local, i(t)); - }); - }); - } - return d3_transition_tween(this, "attr." + nameNS, value, name.local ? attrTweenNS : attrTween); - }; - d3_transitionPrototype.attrTween = function(nameNS, tween) { - var name = d3.ns.qualify(nameNS); - function attrTween(d, i) { - var f = tween.call(this, d, i, this.getAttribute(name)); - return f && function(t) { - this.setAttribute(name, f(t)); - }; - } - function attrTweenNS(d, i) { - var f = tween.call(this, d, i, this.getAttributeNS(name.space, name.local)); - return f && function(t) { - this.setAttributeNS(name.space, name.local, f(t)); - }; - } - return this.tween("attr." + nameNS, name.local ? attrTweenNS : attrTween); - }; - d3_transitionPrototype.style = function(name, value, priority) { - var n = arguments.length; - if (n < 3) { - if (typeof name !== "string") { - if (n < 2) value = ""; - for (priority in name) this.style(priority, name[priority], value); - return this; - } - priority = ""; - } - function styleNull() { - this.style.removeProperty(name); - } - function styleString(b) { - return b == null ? styleNull : (b += "", function() { - var a = d3_window(this).getComputedStyle(this, null).getPropertyValue(name), i; - return a !== b && (i = d3_interpolate(a, b), function(t) { - this.style.setProperty(name, i(t), priority); - }); - }); - } - return d3_transition_tween(this, "style." + name, value, styleString); - }; - d3_transitionPrototype.styleTween = function(name, tween, priority) { - if (arguments.length < 3) priority = ""; - function styleTween(d, i) { - var f = tween.call(this, d, i, d3_window(this).getComputedStyle(this, null).getPropertyValue(name)); - return f && function(t) { - this.style.setProperty(name, f(t), priority); - }; - } - return this.tween("style." + name, styleTween); - }; - d3_transitionPrototype.text = function(value) { - return d3_transition_tween(this, "text", value, d3_transition_text); - }; - function d3_transition_text(b) { - if (b == null) b = ""; - return function() { - this.textContent = b; - }; - } - d3_transitionPrototype.remove = function() { - var ns = this.namespace; - return this.each("end.transition", function() { - var p; - if (this[ns].count < 2 && (p = this.parentNode)) p.removeChild(this); - }); - }; - d3_transitionPrototype.ease = function(value) { - var id = this.id, ns = this.namespace; - if (arguments.length < 1) return this.node()[ns][id].ease; - if (typeof value !== "function") value = d3.ease.apply(d3, arguments); - return d3_selection_each(this, function(node) { - node[ns][id].ease = value; - }); - }; - d3_transitionPrototype.delay = function(value) { - var id = this.id, ns = this.namespace; - if (arguments.length < 1) return this.node()[ns][id].delay; - return d3_selection_each(this, typeof value === "function" ? function(node, i, j) { - node[ns][id].delay = +value.call(node, node.__data__, i, j); - } : (value = +value, function(node) { - node[ns][id].delay = value; - })); - }; - d3_transitionPrototype.duration = function(value) { - var id = this.id, ns = this.namespace; - if (arguments.length < 1) return this.node()[ns][id].duration; - return d3_selection_each(this, typeof value === "function" ? function(node, i, j) { - node[ns][id].duration = Math.max(1, value.call(node, node.__data__, i, j)); - } : (value = Math.max(1, value), function(node) { - node[ns][id].duration = value; - })); - }; - d3_transitionPrototype.each = function(type, listener) { - var id = this.id, ns = this.namespace; - if (arguments.length < 2) { - var inherit = d3_transitionInherit, inheritId = d3_transitionInheritId; - try { - d3_transitionInheritId = id; - d3_selection_each(this, function(node, i, j) { - d3_transitionInherit = node[ns][id]; - type.call(node, node.__data__, i, j); - }); - } finally { - d3_transitionInherit = inherit; - d3_transitionInheritId = inheritId; - } - } else { - d3_selection_each(this, function(node) { - var transition = node[ns][id]; - (transition.event || (transition.event = d3.dispatch("start", "end", "interrupt"))).on(type, listener); - }); - } - return this; - }; - d3_transitionPrototype.transition = function() { - var id0 = this.id, id1 = ++d3_transitionId, ns = this.namespace, subgroups = [], subgroup, group, node, transition; - for (var j = 0, m = this.length; j < m; j++) { - subgroups.push(subgroup = []); - for (var group = this[j], i = 0, n = group.length; i < n; i++) { - if (node = group[i]) { - transition = node[ns][id0]; - d3_transitionNode(node, i, ns, id1, { - time: transition.time, - ease: transition.ease, - delay: transition.delay + transition.duration, - duration: transition.duration - }); - } - subgroup.push(node); - } - } - return d3_transition(subgroups, ns, id1); - }; - function d3_transitionNamespace(name) { - return name == null ? "__transition__" : "__transition_" + name + "__"; - } - function d3_transitionNode(node, i, ns, id, inherit) { - var lock = node[ns] || (node[ns] = { - active: 0, - count: 0 - }), transition = lock[id], time, timer, duration, ease, tweens; - function schedule(elapsed) { - var delay = transition.delay; - timer.t = delay + time; - if (delay <= elapsed) return start(elapsed - delay); - timer.c = start; - } - function start(elapsed) { - var activeId = lock.active, active = lock[activeId]; - if (active) { - active.timer.c = null; - active.timer.t = NaN; - --lock.count; - delete lock[activeId]; - active.event && active.event.interrupt.call(node, node.__data__, active.index); - } - for (var cancelId in lock) { - if (+cancelId < id) { - var cancel = lock[cancelId]; - cancel.timer.c = null; - cancel.timer.t = NaN; - --lock.count; - delete lock[cancelId]; - } - } - timer.c = tick; - d3_timer(function() { - if (timer.c && tick(elapsed || 1)) { - timer.c = null; - timer.t = NaN; - } - return 1; - }, 0, time); - lock.active = id; - transition.event && transition.event.start.call(node, node.__data__, i); - tweens = []; - transition.tween.forEach(function(key, value) { - if (value = value.call(node, node.__data__, i)) { - tweens.push(value); - } - }); - ease = transition.ease; - duration = transition.duration; - } - function tick(elapsed) { - var t = elapsed / duration, e = ease(t), n = tweens.length; - while (n > 0) { - tweens[--n].call(node, e); - } - if (t >= 1) { - transition.event && transition.event.end.call(node, node.__data__, i); - if (--lock.count) delete lock[id]; else delete node[ns]; - return 1; - } - } - if (!transition) { - time = inherit.time; - timer = d3_timer(schedule, 0, time); - transition = lock[id] = { - tween: new d3_Map(), - time: time, - timer: timer, - delay: inherit.delay, - duration: inherit.duration, - ease: inherit.ease, - index: i - }; - inherit = null; - ++lock.count; - } - } - d3.svg.axis = function() { - var scale = d3.scale.linear(), orient = d3_svg_axisDefaultOrient, innerTickSize = 6, outerTickSize = 6, tickPadding = 3, tickArguments_ = [ 10 ], tickValues = null, tickFormat_; - function axis(g) { - g.each(function() { - var g = d3.select(this); - var scale0 = this.__chart__ || scale, scale1 = this.__chart__ = scale.copy(); - var ticks = tickValues == null ? scale1.ticks ? scale1.ticks.apply(scale1, tickArguments_) : scale1.domain() : tickValues, tickFormat = tickFormat_ == null ? scale1.tickFormat ? scale1.tickFormat.apply(scale1, tickArguments_) : d3_identity : tickFormat_, tick = g.selectAll(".tick").data(ticks, scale1), tickEnter = tick.enter().insert("g", ".domain").attr("class", "tick").style("opacity", ε), tickExit = d3.transition(tick.exit()).style("opacity", ε).remove(), tickUpdate = d3.transition(tick.order()).style("opacity", 1), tickSpacing = Math.max(innerTickSize, 0) + tickPadding, tickTransform; - var range = d3_scaleRange(scale1), path = g.selectAll(".domain").data([ 0 ]), pathUpdate = (path.enter().append("path").attr("class", "domain"), - d3.transition(path)); - tickEnter.append("line"); - tickEnter.append("text"); - var lineEnter = tickEnter.select("line"), lineUpdate = tickUpdate.select("line"), text = tick.select("text").text(tickFormat), textEnter = tickEnter.select("text"), textUpdate = tickUpdate.select("text"), sign = orient === "top" || orient === "left" ? -1 : 1, x1, x2, y1, y2; - if (orient === "bottom" || orient === "top") { - tickTransform = d3_svg_axisX, x1 = "x", y1 = "y", x2 = "x2", y2 = "y2"; - text.attr("dy", sign < 0 ? "0em" : ".71em").style("text-anchor", "middle"); - pathUpdate.attr("d", "M" + range[0] + "," + sign * outerTickSize + "V0H" + range[1] + "V" + sign * outerTickSize); - } else { - tickTransform = d3_svg_axisY, x1 = "y", y1 = "x", x2 = "y2", y2 = "x2"; - text.attr("dy", ".32em").style("text-anchor", sign < 0 ? "end" : "start"); - pathUpdate.attr("d", "M" + sign * outerTickSize + "," + range[0] + "H0V" + range[1] + "H" + sign * outerTickSize); - } - lineEnter.attr(y2, sign * innerTickSize); - textEnter.attr(y1, sign * tickSpacing); - lineUpdate.attr(x2, 0).attr(y2, sign * innerTickSize); - textUpdate.attr(x1, 0).attr(y1, sign * tickSpacing); - if (scale1.rangeBand) { - var x = scale1, dx = x.rangeBand() / 2; - scale0 = scale1 = function(d) { - return x(d) + dx; - }; - } else if (scale0.rangeBand) { - scale0 = scale1; - } else { - tickExit.call(tickTransform, scale1, scale0); - } - tickEnter.call(tickTransform, scale0, scale1); - tickUpdate.call(tickTransform, scale1, scale1); - }); - } - axis.scale = function(x) { - if (!arguments.length) return scale; - scale = x; - return axis; - }; - axis.orient = function(x) { - if (!arguments.length) return orient; - orient = x in d3_svg_axisOrients ? x + "" : d3_svg_axisDefaultOrient; - return axis; - }; - axis.ticks = function() { - if (!arguments.length) return tickArguments_; - tickArguments_ = d3_array(arguments); - return axis; - }; - axis.tickValues = function(x) { - if (!arguments.length) return tickValues; - tickValues = x; - return axis; - }; - axis.tickFormat = function(x) { - if (!arguments.length) return tickFormat_; - tickFormat_ = x; - return axis; - }; - axis.tickSize = function(x) { - var n = arguments.length; - if (!n) return innerTickSize; - innerTickSize = +x; - outerTickSize = +arguments[n - 1]; - return axis; - }; - axis.innerTickSize = function(x) { - if (!arguments.length) return innerTickSize; - innerTickSize = +x; - return axis; - }; - axis.outerTickSize = function(x) { - if (!arguments.length) return outerTickSize; - outerTickSize = +x; - return axis; - }; - axis.tickPadding = function(x) { - if (!arguments.length) return tickPadding; - tickPadding = +x; - return axis; - }; - axis.tickSubdivide = function() { - return arguments.length && axis; - }; - return axis; - }; - var d3_svg_axisDefaultOrient = "bottom", d3_svg_axisOrients = { - top: 1, - right: 1, - bottom: 1, - left: 1 - }; - function d3_svg_axisX(selection, x0, x1) { - selection.attr("transform", function(d) { - var v0 = x0(d); - return "translate(" + (isFinite(v0) ? v0 : x1(d)) + ",0)"; - }); - } - function d3_svg_axisY(selection, y0, y1) { - selection.attr("transform", function(d) { - var v0 = y0(d); - return "translate(0," + (isFinite(v0) ? v0 : y1(d)) + ")"; - }); - } - d3.svg.brush = function() { - var event = d3_eventDispatch(brush, "brushstart", "brush", "brushend"), x = null, y = null, xExtent = [ 0, 0 ], yExtent = [ 0, 0 ], xExtentDomain, yExtentDomain, xClamp = true, yClamp = true, resizes = d3_svg_brushResizes[0]; - function brush(g) { - g.each(function() { - var g = d3.select(this).style("pointer-events", "all").style("-webkit-tap-highlight-color", "rgba(0,0,0,0)").on("mousedown.brush", brushstart).on("touchstart.brush", brushstart); - var background = g.selectAll(".background").data([ 0 ]); - background.enter().append("rect").attr("class", "background").style("visibility", "hidden").style("cursor", "crosshair"); - g.selectAll(".extent").data([ 0 ]).enter().append("rect").attr("class", "extent").style("cursor", "move"); - var resize = g.selectAll(".resize").data(resizes, d3_identity); - resize.exit().remove(); - resize.enter().append("g").attr("class", function(d) { - return "resize " + d; - }).style("cursor", function(d) { - return d3_svg_brushCursor[d]; - }).append("rect").attr("x", function(d) { - return /[ew]$/.test(d) ? -3 : null; - }).attr("y", function(d) { - return /^[ns]/.test(d) ? -3 : null; - }).attr("width", 6).attr("height", 6).style("visibility", "hidden"); - resize.style("display", brush.empty() ? "none" : null); - var gUpdate = d3.transition(g), backgroundUpdate = d3.transition(background), range; - if (x) { - range = d3_scaleRange(x); - backgroundUpdate.attr("x", range[0]).attr("width", range[1] - range[0]); - redrawX(gUpdate); - } - if (y) { - range = d3_scaleRange(y); - backgroundUpdate.attr("y", range[0]).attr("height", range[1] - range[0]); - redrawY(gUpdate); - } - redraw(gUpdate); - }); - } - brush.event = function(g) { - g.each(function() { - var event_ = event.of(this, arguments), extent1 = { - x: xExtent, - y: yExtent, - i: xExtentDomain, - j: yExtentDomain - }, extent0 = this.__chart__ || extent1; - this.__chart__ = extent1; - if (d3_transitionInheritId) { - d3.select(this).transition().each("start.brush", function() { - xExtentDomain = extent0.i; - yExtentDomain = extent0.j; - xExtent = extent0.x; - yExtent = extent0.y; - event_({ - type: "brushstart" - }); - }).tween("brush:brush", function() { - var xi = d3_interpolateArray(xExtent, extent1.x), yi = d3_interpolateArray(yExtent, extent1.y); - xExtentDomain = yExtentDomain = null; - return function(t) { - xExtent = extent1.x = xi(t); - yExtent = extent1.y = yi(t); - event_({ - type: "brush", - mode: "resize" - }); - }; - }).each("end.brush", function() { - xExtentDomain = extent1.i; - yExtentDomain = extent1.j; - event_({ - type: "brush", - mode: "resize" - }); - event_({ - type: "brushend" - }); - }); - } else { - event_({ - type: "brushstart" - }); - event_({ - type: "brush", - mode: "resize" - }); - event_({ - type: "brushend" - }); - } - }); - }; - function redraw(g) { - g.selectAll(".resize").attr("transform", function(d) { - return "translate(" + xExtent[+/e$/.test(d)] + "," + yExtent[+/^s/.test(d)] + ")"; - }); - } - function redrawX(g) { - g.select(".extent").attr("x", xExtent[0]); - g.selectAll(".extent,.n>rect,.s>rect").attr("width", xExtent[1] - xExtent[0]); - } - function redrawY(g) { - g.select(".extent").attr("y", yExtent[0]); - g.selectAll(".extent,.e>rect,.w>rect").attr("height", yExtent[1] - yExtent[0]); - } - function brushstart() { - var target = this, eventTarget = d3.select(d3.event.target), event_ = event.of(target, arguments), g = d3.select(target), resizing = eventTarget.datum(), resizingX = !/^(n|s)$/.test(resizing) && x, resizingY = !/^(e|w)$/.test(resizing) && y, dragging = eventTarget.classed("extent"), dragRestore = d3_event_dragSuppress(target), center, origin = d3.mouse(target), offset; - var w = d3.select(d3_window(target)).on("keydown.brush", keydown).on("keyup.brush", keyup); - if (d3.event.changedTouches) { - w.on("touchmove.brush", brushmove).on("touchend.brush", brushend); - } else { - w.on("mousemove.brush", brushmove).on("mouseup.brush", brushend); - } - g.interrupt().selectAll("*").interrupt(); - if (dragging) { - origin[0] = xExtent[0] - origin[0]; - origin[1] = yExtent[0] - origin[1]; - } else if (resizing) { - var ex = +/w$/.test(resizing), ey = +/^n/.test(resizing); - offset = [ xExtent[1 - ex] - origin[0], yExtent[1 - ey] - origin[1] ]; - origin[0] = xExtent[ex]; - origin[1] = yExtent[ey]; - } else if (d3.event.altKey) center = origin.slice(); - g.style("pointer-events", "none").selectAll(".resize").style("display", null); - d3.select("body").style("cursor", eventTarget.style("cursor")); - event_({ - type: "brushstart" - }); - brushmove(); - function keydown() { - if (d3.event.keyCode == 32) { - if (!dragging) { - center = null; - origin[0] -= xExtent[1]; - origin[1] -= yExtent[1]; - dragging = 2; - } - d3_eventPreventDefault(); - } - } - function keyup() { - if (d3.event.keyCode == 32 && dragging == 2) { - origin[0] += xExtent[1]; - origin[1] += yExtent[1]; - dragging = 0; - d3_eventPreventDefault(); - } - } - function brushmove() { - var point = d3.mouse(target), moved = false; - if (offset) { - point[0] += offset[0]; - point[1] += offset[1]; - } - if (!dragging) { - if (d3.event.altKey) { - if (!center) center = [ (xExtent[0] + xExtent[1]) / 2, (yExtent[0] + yExtent[1]) / 2 ]; - origin[0] = xExtent[+(point[0] < center[0])]; - origin[1] = yExtent[+(point[1] < center[1])]; - } else center = null; - } - if (resizingX && move1(point, x, 0)) { - redrawX(g); - moved = true; - } - if (resizingY && move1(point, y, 1)) { - redrawY(g); - moved = true; - } - if (moved) { - redraw(g); - event_({ - type: "brush", - mode: dragging ? "move" : "resize" - }); - } - } - function move1(point, scale, i) { - var range = d3_scaleRange(scale), r0 = range[0], r1 = range[1], position = origin[i], extent = i ? yExtent : xExtent, size = extent[1] - extent[0], min, max; - if (dragging) { - r0 -= position; - r1 -= size + position; - } - min = (i ? yClamp : xClamp) ? Math.max(r0, Math.min(r1, point[i])) : point[i]; - if (dragging) { - max = (min += position) + size; - } else { - if (center) position = Math.max(r0, Math.min(r1, 2 * center[i] - min)); - if (position < min) { - max = min; - min = position; - } else { - max = position; - } - } - if (extent[0] != min || extent[1] != max) { - if (i) yExtentDomain = null; else xExtentDomain = null; - extent[0] = min; - extent[1] = max; - return true; - } - } - function brushend() { - brushmove(); - g.style("pointer-events", "all").selectAll(".resize").style("display", brush.empty() ? "none" : null); - d3.select("body").style("cursor", null); - w.on("mousemove.brush", null).on("mouseup.brush", null).on("touchmove.brush", null).on("touchend.brush", null).on("keydown.brush", null).on("keyup.brush", null); - dragRestore(); - event_({ - type: "brushend" - }); - } - } - brush.x = function(z) { - if (!arguments.length) return x; - x = z; - resizes = d3_svg_brushResizes[!x << 1 | !y]; - return brush; - }; - brush.y = function(z) { - if (!arguments.length) return y; - y = z; - resizes = d3_svg_brushResizes[!x << 1 | !y]; - return brush; - }; - brush.clamp = function(z) { - if (!arguments.length) return x && y ? [ xClamp, yClamp ] : x ? xClamp : y ? yClamp : null; - if (x && y) xClamp = !!z[0], yClamp = !!z[1]; else if (x) xClamp = !!z; else if (y) yClamp = !!z; - return brush; - }; - brush.extent = function(z) { - var x0, x1, y0, y1, t; - if (!arguments.length) { - if (x) { - if (xExtentDomain) { - x0 = xExtentDomain[0], x1 = xExtentDomain[1]; - } else { - x0 = xExtent[0], x1 = xExtent[1]; - if (x.invert) x0 = x.invert(x0), x1 = x.invert(x1); - if (x1 < x0) t = x0, x0 = x1, x1 = t; - } - } - if (y) { - if (yExtentDomain) { - y0 = yExtentDomain[0], y1 = yExtentDomain[1]; - } else { - y0 = yExtent[0], y1 = yExtent[1]; - if (y.invert) y0 = y.invert(y0), y1 = y.invert(y1); - if (y1 < y0) t = y0, y0 = y1, y1 = t; - } - } - return x && y ? [ [ x0, y0 ], [ x1, y1 ] ] : x ? [ x0, x1 ] : y && [ y0, y1 ]; - } - if (x) { - x0 = z[0], x1 = z[1]; - if (y) x0 = x0[0], x1 = x1[0]; - xExtentDomain = [ x0, x1 ]; - if (x.invert) x0 = x(x0), x1 = x(x1); - if (x1 < x0) t = x0, x0 = x1, x1 = t; - if (x0 != xExtent[0] || x1 != xExtent[1]) xExtent = [ x0, x1 ]; - } - if (y) { - y0 = z[0], y1 = z[1]; - if (x) y0 = y0[1], y1 = y1[1]; - yExtentDomain = [ y0, y1 ]; - if (y.invert) y0 = y(y0), y1 = y(y1); - if (y1 < y0) t = y0, y0 = y1, y1 = t; - if (y0 != yExtent[0] || y1 != yExtent[1]) yExtent = [ y0, y1 ]; - } - return brush; - }; - brush.clear = function() { - if (!brush.empty()) { - xExtent = [ 0, 0 ], yExtent = [ 0, 0 ]; - xExtentDomain = yExtentDomain = null; - } - return brush; - }; - brush.empty = function() { - return !!x && xExtent[0] == xExtent[1] || !!y && yExtent[0] == yExtent[1]; - }; - return d3.rebind(brush, event, "on"); - }; - var d3_svg_brushCursor = { - n: "ns-resize", - e: "ew-resize", - s: "ns-resize", - w: "ew-resize", - nw: "nwse-resize", - ne: "nesw-resize", - se: "nwse-resize", - sw: "nesw-resize" - }; - var d3_svg_brushResizes = [ [ "n", "e", "s", "w", "nw", "ne", "se", "sw" ], [ "e", "w" ], [ "n", "s" ], [] ]; - var d3_time_format = d3_time.format = d3_locale_enUS.timeFormat; - var d3_time_formatUtc = d3_time_format.utc; - var d3_time_formatIso = d3_time_formatUtc("%Y-%m-%dT%H:%M:%S.%LZ"); - d3_time_format.iso = Date.prototype.toISOString && +new Date("2000-01-01T00:00:00.000Z") ? d3_time_formatIsoNative : d3_time_formatIso; - function d3_time_formatIsoNative(date) { - return date.toISOString(); - } - d3_time_formatIsoNative.parse = function(string) { - var date = new Date(string); - return isNaN(date) ? null : date; - }; - d3_time_formatIsoNative.toString = d3_time_formatIso.toString; - d3_time.second = d3_time_interval(function(date) { - return new d3_date(Math.floor(date / 1e3) * 1e3); - }, function(date, offset) { - date.setTime(date.getTime() + Math.floor(offset) * 1e3); - }, function(date) { - return date.getSeconds(); - }); - d3_time.seconds = d3_time.second.range; - d3_time.seconds.utc = d3_time.second.utc.range; - d3_time.minute = d3_time_interval(function(date) { - return new d3_date(Math.floor(date / 6e4) * 6e4); - }, function(date, offset) { - date.setTime(date.getTime() + Math.floor(offset) * 6e4); - }, function(date) { - return date.getMinutes(); - }); - d3_time.minutes = d3_time.minute.range; - d3_time.minutes.utc = d3_time.minute.utc.range; - d3_time.hour = d3_time_interval(function(date) { - var timezone = date.getTimezoneOffset() / 60; - return new d3_date((Math.floor(date / 36e5 - timezone) + timezone) * 36e5); - }, function(date, offset) { - date.setTime(date.getTime() + Math.floor(offset) * 36e5); - }, function(date) { - return date.getHours(); - }); - d3_time.hours = d3_time.hour.range; - d3_time.hours.utc = d3_time.hour.utc.range; - d3_time.month = d3_time_interval(function(date) { - date = d3_time.day(date); - date.setDate(1); - return date; - }, function(date, offset) { - date.setMonth(date.getMonth() + offset); - }, function(date) { - return date.getMonth(); - }); - d3_time.months = d3_time.month.range; - d3_time.months.utc = d3_time.month.utc.range; - function d3_time_scale(linear, methods, format) { - function scale(x) { - return linear(x); - } - scale.invert = function(x) { - return d3_time_scaleDate(linear.invert(x)); - }; - scale.domain = function(x) { - if (!arguments.length) return linear.domain().map(d3_time_scaleDate); - linear.domain(x); - return scale; - }; - function tickMethod(extent, count) { - var span = extent[1] - extent[0], target = span / count, i = d3.bisect(d3_time_scaleSteps, target); - return i == d3_time_scaleSteps.length ? [ methods.year, d3_scale_linearTickRange(extent.map(function(d) { - return d / 31536e6; - }), count)[2] ] : !i ? [ d3_time_scaleMilliseconds, d3_scale_linearTickRange(extent, count)[2] ] : methods[target / d3_time_scaleSteps[i - 1] < d3_time_scaleSteps[i] / target ? i - 1 : i]; - } - scale.nice = function(interval, skip) { - var domain = scale.domain(), extent = d3_scaleExtent(domain), method = interval == null ? tickMethod(extent, 10) : typeof interval === "number" && tickMethod(extent, interval); - if (method) interval = method[0], skip = method[1]; - function skipped(date) { - return !isNaN(date) && !interval.range(date, d3_time_scaleDate(+date + 1), skip).length; - } - return scale.domain(d3_scale_nice(domain, skip > 1 ? { - floor: function(date) { - while (skipped(date = interval.floor(date))) date = d3_time_scaleDate(date - 1); - return date; - }, - ceil: function(date) { - while (skipped(date = interval.ceil(date))) date = d3_time_scaleDate(+date + 1); - return date; - } - } : interval)); - }; - scale.ticks = function(interval, skip) { - var extent = d3_scaleExtent(scale.domain()), method = interval == null ? tickMethod(extent, 10) : typeof interval === "number" ? tickMethod(extent, interval) : !interval.range && [ { - range: interval - }, skip ]; - if (method) interval = method[0], skip = method[1]; - return interval.range(extent[0], d3_time_scaleDate(+extent[1] + 1), skip < 1 ? 1 : skip); - }; - scale.tickFormat = function() { - return format; - }; - scale.copy = function() { - return d3_time_scale(linear.copy(), methods, format); - }; - return d3_scale_linearRebind(scale, linear); - } - function d3_time_scaleDate(t) { - return new Date(t); - } - var d3_time_scaleSteps = [ 1e3, 5e3, 15e3, 3e4, 6e4, 3e5, 9e5, 18e5, 36e5, 108e5, 216e5, 432e5, 864e5, 1728e5, 6048e5, 2592e6, 7776e6, 31536e6 ]; - var d3_time_scaleLocalMethods = [ [ d3_time.second, 1 ], [ d3_time.second, 5 ], [ d3_time.second, 15 ], [ d3_time.second, 30 ], [ d3_time.minute, 1 ], [ d3_time.minute, 5 ], [ d3_time.minute, 15 ], [ d3_time.minute, 30 ], [ d3_time.hour, 1 ], [ d3_time.hour, 3 ], [ d3_time.hour, 6 ], [ d3_time.hour, 12 ], [ d3_time.day, 1 ], [ d3_time.day, 2 ], [ d3_time.week, 1 ], [ d3_time.month, 1 ], [ d3_time.month, 3 ], [ d3_time.year, 1 ] ]; - var d3_time_scaleLocalFormat = d3_time_format.multi([ [ ".%L", function(d) { - return d.getMilliseconds(); - } ], [ ":%S", function(d) { - return d.getSeconds(); - } ], [ "%I:%M", function(d) { - return d.getMinutes(); - } ], [ "%I %p", function(d) { - return d.getHours(); - } ], [ "%a %d", function(d) { - return d.getDay() && d.getDate() != 1; - } ], [ "%b %d", function(d) { - return d.getDate() != 1; - } ], [ "%B", function(d) { - return d.getMonth(); - } ], [ "%Y", d3_true ] ]); - var d3_time_scaleMilliseconds = { - range: function(start, stop, step) { - return d3.range(Math.ceil(start / step) * step, +stop, step).map(d3_time_scaleDate); - }, - floor: d3_identity, - ceil: d3_identity - }; - d3_time_scaleLocalMethods.year = d3_time.year; - d3_time.scale = function() { - return d3_time_scale(d3.scale.linear(), d3_time_scaleLocalMethods, d3_time_scaleLocalFormat); - }; - var d3_time_scaleUtcMethods = d3_time_scaleLocalMethods.map(function(m) { - return [ m[0].utc, m[1] ]; - }); - var d3_time_scaleUtcFormat = d3_time_formatUtc.multi([ [ ".%L", function(d) { - return d.getUTCMilliseconds(); - } ], [ ":%S", function(d) { - return d.getUTCSeconds(); - } ], [ "%I:%M", function(d) { - return d.getUTCMinutes(); - } ], [ "%I %p", function(d) { - return d.getUTCHours(); - } ], [ "%a %d", function(d) { - return d.getUTCDay() && d.getUTCDate() != 1; - } ], [ "%b %d", function(d) { - return d.getUTCDate() != 1; - } ], [ "%B", function(d) { - return d.getUTCMonth(); - } ], [ "%Y", d3_true ] ]); - d3_time_scaleUtcMethods.year = d3_time.year.utc; - d3_time.scale.utc = function() { - return d3_time_scale(d3.scale.linear(), d3_time_scaleUtcMethods, d3_time_scaleUtcFormat); - }; - d3.text = d3_xhrType(function(request) { - return request.responseText; - }); - d3.json = function(url, callback) { - return d3_xhr(url, "application/json", d3_json, callback); - }; - function d3_json(request) { - return JSON.parse(request.responseText); - } - d3.html = function(url, callback) { - return d3_xhr(url, "text/html", d3_html, callback); - }; - function d3_html(request) { - var range = d3_document.createRange(); - range.selectNode(d3_document.body); - return range.createContextualFragment(request.responseText); - } - d3.xml = d3_xhrType(function(request) { - return request.responseXML; - }); - if (typeof define === "function" && define.amd) this.d3 = d3, define(d3); else if (typeof module === "object" && module.exports) module.exports = d3; else this.d3 = d3; -}(); -},{}],89:[function(require,module,exports){ -/** - * Helpers. - */ - -var s = 1000 -var m = s * 60 -var h = m * 60 -var d = h * 24 -var y = d * 365.25 - -/** - * Parse or format the given `val`. - * - * Options: - * - * - `long` verbose formatting [false] - * - * @param {String|Number} val - * @param {Object} options - * @throws {Error} throw an error if val is not a non-empty string or a number - * @return {String|Number} - * @api public - */ - -module.exports = function (val, options) { - options = options || {} - var type = typeof val - if (type === 'string' && val.length > 0) { - return parse(val) - } else if (type === 'number' && isNaN(val) === false) { - return options.long ? - fmtLong(val) : - fmtShort(val) - } - throw new Error('val is not a non-empty string or a valid number. val=' + JSON.stringify(val)) -} - -/** - * Parse the given `str` and return milliseconds. - * - * @param {String} str - * @return {Number} - * @api private - */ - -function parse(str) { - str = String(str) - if (str.length > 10000) { - return - } - var match = /^((?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|years?|yrs?|y)?$/i.exec(str) - if (!match) { - return - } - var n = parseFloat(match[1]) - var type = (match[2] || 'ms').toLowerCase() - switch (type) { - case 'years': - case 'year': - case 'yrs': - case 'yr': - case 'y': - return n * y - case 'days': - case 'day': - case 'd': - return n * d - case 'hours': - case 'hour': - case 'hrs': - case 'hr': - case 'h': - return n * h - case 'minutes': - case 'minute': - case 'mins': - case 'min': - case 'm': - return n * m - case 'seconds': - case 'second': - case 'secs': - case 'sec': - case 's': - return n * s - case 'milliseconds': - case 'millisecond': - case 'msecs': - case 'msec': - case 'ms': - return n - default: - return undefined - } -} - -/** - * Short format for `ms`. - * - * @param {Number} ms - * @return {String} - * @api private - */ - -function fmtShort(ms) { - if (ms >= d) { - return Math.round(ms / d) + 'd' - } - if (ms >= h) { - return Math.round(ms / h) + 'h' - } - if (ms >= m) { - return Math.round(ms / m) + 'm' - } - if (ms >= s) { - return Math.round(ms / s) + 's' - } - return ms + 'ms' -} - -/** - * Long format for `ms`. - * - * @param {Number} ms - * @return {String} - * @api private - */ - -function fmtLong(ms) { - return plural(ms, d, 'day') || - plural(ms, h, 'hour') || - plural(ms, m, 'minute') || - plural(ms, s, 'second') || - ms + ' ms' -} - -/** - * Pluralization helper. - */ - -function plural(ms, n, name) { - if (ms < n) { - return - } - if (ms < n * 1.5) { - return Math.floor(ms / n) + ' ' + name - } - return Math.ceil(ms / n) + ' ' + name + 's' -} - -},{}],90:[function(require,module,exports){ -(function (process){ -/** - * This is the web browser implementation of `debug()`. - * - * Expose `debug()` as the module. - */ - -exports = module.exports = require('./debug'); -exports.log = log; -exports.formatArgs = formatArgs; -exports.save = save; -exports.load = load; -exports.useColors = useColors; -exports.storage = 'undefined' != typeof chrome - && 'undefined' != typeof chrome.storage - ? chrome.storage.local - : localstorage(); - -/** - * Colors. - */ - -exports.colors = [ - 'lightseagreen', - 'forestgreen', - 'goldenrod', - 'dodgerblue', - 'darkorchid', - 'crimson' -]; - -/** - * Currently only WebKit-based Web Inspectors, Firefox >= v31, - * and the Firebug extension (any Firefox version) are known - * to support "%c" CSS customizations. - * - * TODO: add a `localStorage` variable to explicitly enable/disable colors - */ - -function useColors() { - // NB: In an Electron preload script, document will be defined but not fully - // initialized. Since we know we're in Chrome, we'll just detect this case - // explicitly - if (typeof window !== 'undefined' && window && typeof window.process !== 'undefined' && window.process.type === 'renderer') { - return true; - } - - // is webkit? http://stackoverflow.com/a/16459606/376773 - // document is undefined in react-native: https://github.com/facebook/react-native/pull/1632 - return (typeof document !== 'undefined' && document && 'WebkitAppearance' in document.documentElement.style) || - // is firebug? http://stackoverflow.com/a/398120/376773 - (typeof window !== 'undefined' && window && window.console && (console.firebug || (console.exception && console.table))) || - // is firefox >= v31? - // https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages - (typeof navigator !== 'undefined' && navigator && navigator.userAgent && navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/) && parseInt(RegExp.$1, 10) >= 31) || - // double check webkit in userAgent just in case we are in a worker - (typeof navigator !== 'undefined' && navigator && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/)); -} - -/** - * Map %j to `JSON.stringify()`, since no Web Inspectors do that by default. - */ - -exports.formatters.j = function(v) { - try { - return JSON.stringify(v); - } catch (err) { - return '[UnexpectedJSONParseError]: ' + err.message; - } -}; - - -/** - * Colorize log arguments if enabled. - * - * @api public - */ - -function formatArgs(args) { - var useColors = this.useColors; - - args[0] = (useColors ? '%c' : '') - + this.namespace - + (useColors ? ' %c' : ' ') - + args[0] - + (useColors ? '%c ' : ' ') - + '+' + exports.humanize(this.diff); - - if (!useColors) return; - - var c = 'color: ' + this.color; - args.splice(1, 0, c, 'color: inherit') - - // the final "%c" is somewhat tricky, because there could be other - // arguments passed either before or after the %c, so we need to - // figure out the correct index to insert the CSS into - var index = 0; - var lastC = 0; - args[0].replace(/%[a-zA-Z%]/g, function(match) { - if ('%%' === match) return; - index++; - if ('%c' === match) { - // we only are interested in the *last* %c - // (the user may have provided their own) - lastC = index; - } - }); - - args.splice(lastC, 0, c); -} - -/** - * Invokes `console.log()` when available. - * No-op when `console.log` is not a "function". - * - * @api public - */ - -function log() { - // this hackery is required for IE8/9, where - // the `console.log` function doesn't have 'apply' - return 'object' === typeof console - && console.log - && Function.prototype.apply.call(console.log, console, arguments); -} - -/** - * Save `namespaces`. - * - * @param {String} namespaces - * @api private - */ - -function save(namespaces) { - try { - if (null == namespaces) { - exports.storage.removeItem('debug'); - } else { - exports.storage.debug = namespaces; - } - } catch(e) {} -} - -/** - * Load `namespaces`. - * - * @return {String} returns the previously persisted debug modes - * @api private - */ - -function load() { - try { - return exports.storage.debug; - } catch(e) {} - - // If debug isn't set in LS, and we're in Electron, try to load $DEBUG - if (typeof process !== 'undefined' && 'env' in process) { - return process.env.DEBUG; - } -} - -/** - * Enable namespaces listed in `localStorage.debug` initially. - */ - -exports.enable(load()); - -/** - * Localstorage attempts to return the localstorage. - * - * This is necessary because safari throws - * when a user disables cookies/localstorage - * and you attempt to access it. - * - * @return {LocalStorage} - * @api private - */ - -function localstorage() { - try { - return window.localStorage; - } catch (e) {} -} - -}).call(this,require('_process')) - -},{"./debug":91,"_process":1}],91:[function(require,module,exports){ - -/** - * This is the common logic for both the Node.js and web browser - * implementations of `debug()`. - * - * Expose `debug()` as the module. - */ - -exports = module.exports = createDebug.debug = createDebug['default'] = createDebug; -exports.coerce = coerce; -exports.disable = disable; -exports.enable = enable; -exports.enabled = enabled; -exports.humanize = require('ms'); - -/** - * The currently active debug mode names, and names to skip. - */ - -exports.names = []; -exports.skips = []; - -/** - * Map of special "%n" handling functions, for the debug "format" argument. - * - * Valid key names are a single, lower or upper-case letter, i.e. "n" and "N". - */ - -exports.formatters = {}; - -/** - * Previous log timestamp. - */ - -var prevTime; - -/** - * Select a color. - * @param {String} namespace - * @return {Number} - * @api private - */ - -function selectColor(namespace) { - var hash = 0, i; - - for (i in namespace) { - hash = ((hash << 5) - hash) + namespace.charCodeAt(i); - hash |= 0; // Convert to 32bit integer - } - - return exports.colors[Math.abs(hash) % exports.colors.length]; -} - -/** - * Create a debugger with the given `namespace`. - * - * @param {String} namespace - * @return {Function} - * @api public - */ - -function createDebug(namespace) { - - function debug() { - // disabled? - if (!debug.enabled) return; - - var self = debug; - - // set `diff` timestamp - var curr = +new Date(); - var ms = curr - (prevTime || curr); - self.diff = ms; - self.prev = prevTime; - self.curr = curr; - prevTime = curr; - - // turn the `arguments` into a proper Array - var args = new Array(arguments.length); - for (var i = 0; i < args.length; i++) { - args[i] = arguments[i]; - } - - args[0] = exports.coerce(args[0]); - - if ('string' !== typeof args[0]) { - // anything else let's inspect with %O - args.unshift('%O'); - } - - // apply any `formatters` transformations - var index = 0; - args[0] = args[0].replace(/%([a-zA-Z%])/g, function(match, format) { - // if we encounter an escaped % then don't increase the array index - if (match === '%%') return match; - index++; - var formatter = exports.formatters[format]; - if ('function' === typeof formatter) { - var val = args[index]; - match = formatter.call(self, val); - - // now we need to remove `args[index]` since it's inlined in the `format` - args.splice(index, 1); - index--; - } - return match; - }); - - // apply env-specific formatting (colors, etc.) - exports.formatArgs.call(self, args); - - var logFn = debug.log || exports.log || console.log.bind(console); - logFn.apply(self, args); - } - - debug.namespace = namespace; - debug.enabled = exports.enabled(namespace); - debug.useColors = exports.useColors(); - debug.color = selectColor(namespace); - - // env-specific initialization logic for debug instances - if ('function' === typeof exports.init) { - exports.init(debug); - } - - return debug; -} - -/** - * Enables a debug mode by namespaces. This can include modes - * separated by a colon and wildcards. - * - * @param {String} namespaces - * @api public - */ - -function enable(namespaces) { - exports.save(namespaces); - - exports.names = []; - exports.skips = []; - - var split = (namespaces || '').split(/[\s,]+/); - var len = split.length; - - for (var i = 0; i < len; i++) { - if (!split[i]) continue; // ignore empty strings - namespaces = split[i].replace(/\*/g, '.*?'); - if (namespaces[0] === '-') { - exports.skips.push(new RegExp('^' + namespaces.substr(1) + '$')); - } else { - exports.names.push(new RegExp('^' + namespaces + '$')); - } - } -} - -/** - * Disable debug output. - * - * @api public - */ - -function disable() { - exports.enable(''); -} - -/** - * Returns true if the given mode name is enabled, false otherwise. - * - * @param {String} name - * @return {Boolean} - * @api public - */ - -function enabled(name) { - var i, len; - for (i = 0, len = exports.skips.length; i < len; i++) { - if (exports.skips[i].test(name)) { - return false; - } - } - for (i = 0, len = exports.names.length; i < len; i++) { - if (exports.names[i].test(name)) { - return true; - } - } - return false; -} - -/** - * Coerce `val`. - * - * @param {Mixed} val - * @return {Mixed} - * @api private - */ - -function coerce(val) { - if (val instanceof Error) return val.stack || val.message; - return val; -} - -},{"ms":89}],92:[function(require,module,exports){ -/** - * Expose `PriorityQueue`. - */ -module.exports = PriorityQueue; - -/** - * Initializes a new empty `PriorityQueue` with the given `comparator(a, b)` - * function, uses `.DEFAULT_COMPARATOR()` when no function is provided. - * - * The comparator function must return a positive number when `a > b`, 0 when - * `a == b` and a negative number when `a < b`. - * - * @param {Function} - * @return {PriorityQueue} - * @api public - */ -function PriorityQueue(comparator) { - this._comparator = comparator || PriorityQueue.DEFAULT_COMPARATOR; - this._elements = []; -} - -/** - * Compares `a` and `b`, when `a > b` it returns a positive number, when - * it returns 0 and when `a < b` it returns a negative number. - * - * @param {String|Number} a - * @param {String|Number} b - * @return {Number} - * @api public - */ -PriorityQueue.DEFAULT_COMPARATOR = function(a, b) { - if (typeof a === 'number' && typeof b === 'number') { - return a - b; - } else { - a = a.toString(); - b = b.toString(); - - if (a == b) return 0; - - return (a > b) ? 1 : -1; - } -}; - -/** - * Returns whether the priority queue is empty or not. - * - * @return {Boolean} - * @api public - */ -PriorityQueue.prototype.isEmpty = function() { - return this.size() === 0; -}; - -/** - * Peeks at the top element of the priority queue. - * - * @return {Object} - * @throws {Error} when the queue is empty. - * @api public - */ -PriorityQueue.prototype.peek = function() { - if (this.isEmpty()) throw new Error('PriorityQueue is empty'); - - return this._elements[0]; -}; - -/** - * Dequeues the top element of the priority queue. - * - * @return {Object} - * @throws {Error} when the queue is empty. - * @api public - */ -PriorityQueue.prototype.deq = function() { - var first = this.peek(); - var last = this._elements.pop(); - var size = this.size(); - - if (size === 0) return first; - - this._elements[0] = last; - var current = 0; - - while (current < size) { - var largest = current; - var left = (2 * current) + 1; - var right = (2 * current) + 2; - - if (left < size && this._compare(left, largest) >= 0) { - largest = left; - } - - if (right < size && this._compare(right, largest) >= 0) { - largest = right; - } - - if (largest === current) break; - - this._swap(largest, current); - current = largest; - } - - return first; -}; - -/** - * Enqueues the `element` at the priority queue and returns its new size. - * - * @param {Object} element - * @return {Number} - * @api public - */ -PriorityQueue.prototype.enq = function(element) { - var size = this._elements.push(element); - var current = size - 1; - - while (current > 0) { - var parent = Math.floor((current - 1) / 2); - - if (this._compare(current, parent) <= 0) break; - - this._swap(parent, current); - current = parent; - } - - return size; -}; - -/** - * Returns the size of the priority queue. - * - * @return {Number} - * @api public - */ -PriorityQueue.prototype.size = function() { - return this._elements.length; -}; - -/** - * Iterates over queue elements - * - * @param {Function} fn - */ -PriorityQueue.prototype.forEach = function(fn) { - return this._elements.forEach(fn); -}; - -/** - * Compares the values at position `a` and `b` in the priority queue using its - * comparator function. - * - * @param {Number} a - * @param {Number} b - * @return {Number} - * @api private - */ -PriorityQueue.prototype._compare = function(a, b) { - return this._comparator(this._elements[a], this._elements[b]); -}; - -/** - * Swaps the values at position `a` and `b` in the priority queue. - * - * @param {Number} a - * @param {Number} b - * @api private - */ -PriorityQueue.prototype._swap = function(a, b) { - var aux = this._elements[a]; - this._elements[a] = this._elements[b]; - this._elements[b] = aux; -}; - -},{}],93:[function(require,module,exports){ - -/** - * Module Dependencies - */ - -var expr; -try { - expr = require('props'); -} catch(e) { - expr = require('component-props'); -} - -/** - * Expose `toFunction()`. - */ - -module.exports = toFunction; - -/** - * Convert `obj` to a `Function`. - * - * @param {Mixed} obj - * @return {Function} - * @api private - */ - -function toFunction(obj) { - switch ({}.toString.call(obj)) { - case '[object Object]': - return objectToFunction(obj); - case '[object Function]': - return obj; - case '[object String]': - return stringToFunction(obj); - case '[object RegExp]': - return regexpToFunction(obj); - default: - return defaultToFunction(obj); - } -} - -/** - * Default to strict equality. - * - * @param {Mixed} val - * @return {Function} - * @api private - */ - -function defaultToFunction(val) { - return function(obj){ - return val === obj; - }; -} - -/** - * Convert `re` to a function. - * - * @param {RegExp} re - * @return {Function} - * @api private - */ - -function regexpToFunction(re) { - return function(obj){ - return re.test(obj); - }; -} - -/** - * Convert property `str` to a function. - * - * @param {String} str - * @return {Function} - * @api private - */ - -function stringToFunction(str) { - // immediate such as "> 20" - if (/^ *\W+/.test(str)) return new Function('_', 'return _ ' + str); - - // properties such as "name.first" or "age > 18" or "age > 18 && age < 36" - return new Function('_', 'return ' + get(str)); -} - -/** - * Convert `object` to a function. - * - * @param {Object} object - * @return {Function} - * @api private - */ - -function objectToFunction(obj) { - var match = {}; - for (var key in obj) { - match[key] = typeof obj[key] === 'string' - ? defaultToFunction(obj[key]) - : toFunction(obj[key]); - } - return function(val){ - if (typeof val !== 'object') return false; - for (var key in match) { - if (!(key in val)) return false; - if (!match[key](val[key])) return false; - } - return true; - }; -} - -/** - * Built the getter function. Supports getter style functions - * - * @param {String} str - * @return {String} - * @api private - */ - -function get(str) { - var props = expr(str); - if (!props.length) return '_.' + str; - - var val, i, prop; - for (i = 0; i < props.length; i++) { - prop = props[i]; - val = '_.' + prop; - val = "('function' == typeof " + val + " ? " + val + "() : " + val + ")"; - - // mimic negative lookbehind to avoid problems with nested properties - str = stripNested(prop, str, val); - } - - return str; -} - -/** - * Mimic negative lookbehind to avoid problems with nested properties. - * - * See: http://blog.stevenlevithan.com/archives/mimic-lookbehind-javascript - * - * @param {String} prop - * @param {String} str - * @param {String} val - * @return {String} - * @api private - */ - -function stripNested (prop, str, val) { - return str.replace(new RegExp('(\\.)?' + prop, 'g'), function($0, $1) { - return $1 ? $0 : val; - }); -} - -},{"component-props":86,"props":86}]},{},[37]) -//# sourceMappingURL=bundle.js.map diff --git a/dist/bundle.js.map b/dist/bundle.js.map deleted file mode 100644 index 6eaf4b19..00000000 --- a/dist/bundle.js.map +++ /dev/null @@ -1,199 +0,0 @@ -{ - "version": 3, - "sources": [ - "../../../.nvm/versions/node/v6.0.0/lib/node_modules/mastarm/node_modules/browser-pack/_prelude.js", - "../../../.nvm/versions/node/v6.0.0/lib/node_modules/mastarm/node_modules/process/browser.js", - "lib/core/journey.js", - "lib/core/network.js", - "lib/core/path.js", - "lib/core/pathsegment.js", - "lib/core/pattern.js", - "lib/core/patterngroup.js", - "lib/core/route.js", - "lib/display/d3.geo.tile.js", - "lib/display/draw-grid.js", - "lib/display/index.js", - "lib/display/legend.js", - "lib/display/tile-layer.js", - "lib/graph/edge.js", - "lib/graph/edgegroup.js", - "lib/graph/index.js", - "lib/graph/vertex.js", - "lib/labeler/index.js", - "lib/labeler/label.js", - "lib/labeler/labeledgegroup.js", - "lib/labeler/pointlabel.js", - "lib/labeler/segmentlabel.js", - "lib/point/index.js", - "lib/point/multipoint.js", - "lib/point/place.js", - "lib/point/pointcluster.js", - "lib/point/pointclustermap.js", - "lib/point/stop.js", - "lib/point/turn.js", - "lib/renderer/default-renderer.js", - "lib/renderer/index.js", - "lib/renderer/renderededge.js", - "lib/renderer/renderedsegment.js", - "lib/renderer/wireframe-renderer.js", - "lib/styler/index.js", - "lib/styler/styles.js", - "lib/transitive.js", - "lib/util/index.js", - "lib/util/interpolate-line.js", - "lib/util/polyline.js", - "lib/util/spherical-mercator.js", - "node_modules/augment/augment.js", - "node_modules/babel-runtime/core-js/object/assign.js", - "node_modules/babel-runtime/core-js/object/keys.js", - "node_modules/babel-runtime/node_modules/core-js/library/fn/object/assign.js", - "node_modules/babel-runtime/node_modules/core-js/library/fn/object/keys.js", - "node_modules/babel-runtime/node_modules/core-js/library/modules/_a-function.js", - "node_modules/babel-runtime/node_modules/core-js/library/modules/_an-object.js", - "node_modules/babel-runtime/node_modules/core-js/library/modules/_array-includes.js", - "node_modules/babel-runtime/node_modules/core-js/library/modules/_cof.js", - "node_modules/babel-runtime/node_modules/core-js/library/modules/_core.js", - "node_modules/babel-runtime/node_modules/core-js/library/modules/_ctx.js", - "node_modules/babel-runtime/node_modules/core-js/library/modules/_defined.js", - "node_modules/babel-runtime/node_modules/core-js/library/modules/_descriptors.js", - "node_modules/babel-runtime/node_modules/core-js/library/modules/_dom-create.js", - "node_modules/babel-runtime/node_modules/core-js/library/modules/_enum-bug-keys.js", - "node_modules/babel-runtime/node_modules/core-js/library/modules/_export.js", - "node_modules/babel-runtime/node_modules/core-js/library/modules/_fails.js", - "node_modules/babel-runtime/node_modules/core-js/library/modules/_global.js", - "node_modules/babel-runtime/node_modules/core-js/library/modules/_has.js", - "node_modules/babel-runtime/node_modules/core-js/library/modules/_hide.js", - "node_modules/babel-runtime/node_modules/core-js/library/modules/_ie8-dom-define.js", - "node_modules/babel-runtime/node_modules/core-js/library/modules/_iobject.js", - "node_modules/babel-runtime/node_modules/core-js/library/modules/_is-object.js", - "node_modules/babel-runtime/node_modules/core-js/library/modules/_object-assign.js", - "node_modules/babel-runtime/node_modules/core-js/library/modules/_object-dp.js", - "node_modules/babel-runtime/node_modules/core-js/library/modules/_object-gops.js", - "node_modules/babel-runtime/node_modules/core-js/library/modules/_object-keys-internal.js", - "node_modules/babel-runtime/node_modules/core-js/library/modules/_object-keys.js", - "node_modules/babel-runtime/node_modules/core-js/library/modules/_object-pie.js", - "node_modules/babel-runtime/node_modules/core-js/library/modules/_object-sap.js", - "node_modules/babel-runtime/node_modules/core-js/library/modules/_property-desc.js", - "node_modules/babel-runtime/node_modules/core-js/library/modules/_shared-key.js", - "node_modules/babel-runtime/node_modules/core-js/library/modules/_shared.js", - "node_modules/babel-runtime/node_modules/core-js/library/modules/_to-index.js", - "node_modules/babel-runtime/node_modules/core-js/library/modules/_to-integer.js", - "node_modules/babel-runtime/node_modules/core-js/library/modules/_to-iobject.js", - "node_modules/babel-runtime/node_modules/core-js/library/modules/_to-length.js", - "node_modules/babel-runtime/node_modules/core-js/library/modules/_to-object.js", - "node_modules/babel-runtime/node_modules/core-js/library/modules/_to-primitive.js", - "node_modules/babel-runtime/node_modules/core-js/library/modules/_uid.js", - "node_modules/babel-runtime/node_modules/core-js/library/modules/es6.object.assign.js", - "node_modules/babel-runtime/node_modules/core-js/library/modules/es6.object.keys.js", - "node_modules/component-each/index.js", - "node_modules/component-emitter/index.js", - "node_modules/component-props/index.js", - "node_modules/component-type/index.js", - "node_modules/d3/d3.js", - "node_modules/debug/node_modules/ms/index.js", - "node_modules/debug/src/browser.js", - "node_modules/debug/src/debug.js", - "node_modules/priorityqueuejs/index.js", - "node_modules/to-function/index.js" - ], - "names": [], - "mappings": "AAAA;ACAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;ACpLA,IAAI,cAAc,QAAQ,eAAR,CAAlB;AACA,IAAI,cAAc,QAAQ,QAAR,CAAlB;AACA,IAAI,YAAY,QAAQ,eAAR,CAAhB;;AAEA,IAAI,OAAO,QAAQ,gBAAR,CAAX;AACA;;;;AAIA,OAAO,OAAP,GAAiB,OAAjB;;AAEA;;;;AAIA,SAAS,OAAT,CAAkB,IAAlB,EAAwB,OAAxB,EAAiC;AAC/B,OAAK,OAAL,GAAe,OAAf;;AAEA,OAAK,IAAI,GAAT,IAAgB,IAAhB,EAAsB;AACpB,S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,SAAT;AACxB,QAAI,GAAG,CAAH,IAAQ,SAAZ,EAAuB,GAAG,CAAH,IAAQ,SAAR;AACvB,QAAI,GAAG,CAAH,IAAQ,CAAC,SAAb,EAAwB,GAAG,CAAH,IAAQ,CAAC,SAAT;AACxB,WAAO,EAAP;AACD,GAXD;;AAaA;AACA,oBAAkB,SAAlB,CAA4B,OAA5B,GAAsC,UAAU,EAAV,EAAc;AAClD,WAAO,CACJ,GAAG,CAAH,IAAQ,GAAR,GAAc,CADV,EACc,CAAE,KAAK,EAAL,GAAU,GAAX,GAAkB,MAAM,KAAK,IAAL,CAAU,KAAK,GAAL,CAAS,CAAC,GAAG,CAAH,CAAD,GAAS,CAAlB,CAAV,CAAzB,IAA4D,GAD1E,CAAP;AAGD,GAJD;;AAMA,SAAO,iBAAP;AACD,CArKuB,EAAxB;;AAuKA,IAAI,OAAO,MAAP,KAAkB,WAAlB,IAAiC,OAAO,OAAP,KAAmB,WAAxD,EAAqE;AACnE,SAAO,OAAP,GAAiB,UAAU,iBAA3B;AACD;;;ACzKD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClCA;;ACAA;;ACAA;AACA;;ACDA;AACA;;ACDA;AACA;AACA;AACA;;ACHA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpBA;AACA;AACA;AACA;AACA;;ACJA;AACA;;ACDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnBA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;AACA;;ACHA;AACA;AACA;AACA;AACA;AACA;AACA;;ACNA;AACA;AACA;AACA;;ACHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5DA;AACA;AACA;AACA;AACA;AACA;AACA;;ACNA;AACA;AACA;AACA;;ACHA;AACA;AACA;AACA;;ACHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;;ACFA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;;ACFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACfA;;ACAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChBA;AACA;AACA;AACA;AACA;AACA;AACA;;ACNA;;ACAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;AACA;AACA;AACA;;ACLA;AACA;AACA;AACA;AACA;AACA;AACA;;ACNA;AACA;AACA;AACA;AACA;AACA;;ACLA;AACA;AACA;AACA;AACA;AACA;;ACLA;AACA;AACA;AACA;AACA;AACA;;ACLA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACXA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;AACA;;ACHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACRA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACj1SA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;ACrJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;ACtLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1MA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5KA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA", - "file": "generated.js", - "sourceRoot": "", - "sourcesContent": [ - "(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o 1) {\n for (var i = 1; i < arguments.length; i++) {\n args[i - 1] = arguments[i];\n }\n }\n queue.push(new Item(fun, args));\n if (queue.length === 1 && !draining) {\n runTimeout(drainQueue);\n }\n};\n\n// v8 likes predictible objects\nfunction Item(fun, array) {\n this.fun = fun;\n this.array = array;\n}\nItem.prototype.run = function () {\n this.fun.apply(null, this.array);\n};\nprocess.title = 'browser';\nprocess.browser = true;\nprocess.env = {};\nprocess.argv = [];\nprocess.version = ''; // empty string to avoid regexp issues\nprocess.versions = {};\n\nfunction noop() {}\n\nprocess.on = noop;\nprocess.addListener = noop;\nprocess.once = noop;\nprocess.off = noop;\nprocess.removeListener = noop;\nprocess.removeAllListeners = noop;\nprocess.emit = noop;\n\nprocess.binding = function (name) {\n throw new Error('process.binding is not supported');\n};\n\nprocess.cwd = function () { return '/' };\nprocess.chdir = function (dir) {\n throw new Error('process.chdir is not supported');\n};\nprocess.umask = function() { return 0; };\n", - "var PathSegment = require('./pathsegment')\nvar NetworkPath = require('./path')\nvar TurnPoint = require('../point/turn')\n\nvar each = require('component-each')\n/**\n * Expose `Journey`\n */\n\nmodule.exports = Journey\n\n/**\n *\n */\n\nfunction Journey (data, network) {\n this.network = network\n\n for (var key in data) {\n this[key] = data[key]\n }\n\n this.path = new NetworkPath(this)\n\n each(this.segments, function (segmentInfo) {\n var pathSegment = new PathSegment(segmentInfo.type, this.path)\n pathSegment.journeySegment = segmentInfo\n\n if (segmentInfo.type === 'TRANSIT') {\n if (segmentInfo.patterns) {\n each(segmentInfo.patterns, function (patternInfo) {\n pathSegment.addPattern(network.patterns[patternInfo.pattern_id],\n patternInfo.from_stop_index, patternInfo.to_stop_index)\n })\n } else if (segmentInfo.pattern_id) { // legacy support for single-pattern journey segments\n pathSegment.addPattern(network.patterns[segmentInfo.pattern_id],\n segmentInfo.from_stop_index, segmentInfo.to_stop_index)\n }\n } else { // non-transit segment\n var streetEdges = []\n // screen out degenerate transfer segments\n if (segmentInfo.from.type === 'STOP' && segmentInfo.to.type === 'STOP' &&\n segmentInfo.from.stop_id === segmentInfo.to.stop_id) return\n\n pathSegment.points.push(getEndPoint(segmentInfo.from, network))\n if (segmentInfo.streetEdges && segmentInfo.streetEdges.length > 0) {\n var lastTurnPoint = null\n\n for (var i = 0; i < segmentInfo.streetEdges.length; i++) {\n var streetEdgeId = segmentInfo.streetEdges[i]\n var streetEdge = network.streetEdges[streetEdgeId]\n streetEdge.id = streetEdgeId\n streetEdges.push(streetEdge)\n if (i >= segmentInfo.streetEdges.length - 1) continue\n\n if (lastTurnPoint) streetEdge.fromTurnPoint = lastTurnPoint\n var lastIndex = streetEdge.length - 1\n\n // screen out degenerate edges\n if (streetEdge.latLons[0][0] === streetEdge.latLons[lastIndex][0] &&\n streetEdge.latLons[0][1] === streetEdge.latLons[lastIndex][1]) {\n continue\n }\n\n // create a TurnPoint for the 'from' point of this edge\n var turnPoint = getTurnPoint({\n lat: streetEdge.latLons[lastIndex][0],\n lon: streetEdge.latLons[lastIndex][1],\n worldX: streetEdge.worldCoords[lastIndex][0],\n worldY: streetEdge.worldCoords[lastIndex][1]\n }, network)\n\n // compute the angle represented by this turn point\n /* turnPoint.turnAngle = Util.angleFromThreePoints(\n streetEdge.worldCoords[0][0],\n streetEdge.worldCoords[0][1],\n streetEdge.worldCoords[lastIndex][0],\n streetEdge.worldCoords[lastIndex][1],\n nextEdge.worldCoords[nextEdge.length-1][0],\n nextEdge.worldCoords[nextEdge.length-1][1]\n ); */\n\n pathSegment.points.push(turnPoint)\n lastTurnPoint = streetEdge.toTurnPoint = turnPoint\n }\n pathSegment.streetEdges = streetEdges\n }\n pathSegment.points.push(getEndPoint(segmentInfo.to, network))\n }\n this.path.addSegment(pathSegment)\n }, this)\n}\n\nfunction getEndPoint (pointInfo, network) {\n if (pointInfo.type === 'PLACE') {\n return network.places[pointInfo.place_id]\n } else if (pointInfo.type === 'STOP') {\n return network.stops[pointInfo.stop_id]\n }\n}\n\nJourney.prototype.getElementId = function () {\n return 'journey-' + this.journey_id\n}\n\n/* utility function for creating non-duplicative TurnPoints */\n\nfunction getTurnPoint (turnPointInfo, network) {\n var key = turnPointInfo.lat + '_' + turnPointInfo.lon\n if (key in network.turnPoints) return network.turnPoints[key]\n var turnPoint = new TurnPoint(turnPointInfo, key)\n network.turnPoints[key] = turnPoint\n // network.addVertexPoint(turnPoint);\n return turnPoint\n}\n", - "var each = require('component-each')\nvar debug = require('debug')('transitive:network')\nvar Emitter = require('component-emitter')\n\nvar Route = require('./route')\nvar RoutePattern = require('./pattern')\nvar Journey = require('./journey')\n\nvar Stop = require('../point/stop')\nvar Place = require('../point/place')\nvar PointClusterMap = require('../point/pointclustermap')\nvar RenderedEdge = require('../renderer/renderededge')\nvar RenderedSegment = require('../renderer/renderedsegment')\n\nvar Graph = require('../graph')\n\nvar Polyline = require('../util/polyline.js')\nvar SphericalMercator = require('../util/spherical-mercator')\nvar sm = new SphericalMercator()\n\n/**\n * Expose `Network`\n */\n\nmodule.exports = Network\n\n/**\n *\n */\n\nfunction Network (transitive, data) {\n this.transitive = transitive\n\n this.routes = {}\n this.stops = {}\n this.patterns = {}\n this.places = {}\n this.journeys = {}\n this.paths = []\n this.baseVertexPoints = []\n this.graph = new Graph(this, [])\n\n if (data) this.load(data)\n}\n\n/**\n * Mixin `Emitter`\n */\n\nEmitter(Network.prototype)\n\n/**\n * Load\n *\n * @param {Object} data\n */\n\nNetwork.prototype.load = function (data) {\n debug('loading', data)\n var self = this\n\n // check data\n if (!data) data = {}\n\n // Store data\n this.data = data\n\n // A list of points (stops & places) that will always become vertices in the network\n // graph (regardless of zoom scale). This includes all points that serve as a segment\n // endpoint and/or a convergence/divergence point between segments\n this.baseVertexPoints = []\n\n // object maps stop ids to arrays of unique stop_ids reachable from that stop\n this.adjacentStops = {}\n\n // maps lat_lon key to unique TurnPoint object\n this.turnPoints = {}\n\n // Copy/decode the streetEdge objects\n this.streetEdges = {}\n each(data.streetEdges, function (data) {\n var latLons = Polyline.decode(data.geometry.points)\n var coords = []\n each(latLons, function (latLon) {\n coords.push(sm.forward([latLon[1], latLon[0]]))\n })\n this.streetEdges[data.edge_id] = {\n latLons: latLons,\n worldCoords: coords,\n length: data.geometry.length\n }\n }, this)\n\n // Generate the route objects\n this.routes = {}\n each(data.routes, function (data) {\n this.routes[data.route_id] = new Route(data)\n }, this)\n\n // Generate the stop objects\n this.stops = {}\n each(data.stops, function (data) {\n this.stops[data.stop_id] = new Stop(data)\n }, this)\n\n // Generate the pattern objects\n this.patterns = {}\n each(data.patterns, function (data) {\n var pattern = new RoutePattern(data, this)\n this.patterns[data.pattern_id] = pattern\n var route = this.routes[data.route_id]\n if (route) {\n route.addPattern(pattern)\n pattern.route = route\n } else {\n debug('Error: pattern ' + data.pattern_id +\n ' refers to route that was not found: ' + data.route_id)\n }\n if (pattern.render) this.paths.push(pattern.createPath())\n }, this)\n\n // Generate the place objects\n this.places = {}\n each(data.places, function (data) {\n var place = this.places[data.place_id] = new Place(data, this)\n this.addVertexPoint(place)\n }, this)\n\n // Generate the internal Journey objects\n this.journeys = {}\n each(data.journeys, function (journeyData) {\n var journey = new Journey(journeyData, this)\n this.journeys[journeyData.journey_id] = journey\n this.paths.push(journey.path)\n }, this)\n\n // process the path segments\n for (var p = 0; p < this.paths.length; p++) {\n var path = this.paths[p]\n for (var s = 0; s < path.segments.length; s++) {\n this.processSegment(path.segments[s])\n }\n }\n\n // when rendering pattern paths only, determine convergence/divergence vertex\n // stops by looking for stops w/ >2 adjacent stops\n if (!data.journeys || data.journeys.length === 0) {\n for (var stopId in this.adjacentStops) {\n if (this.adjacentStops[stopId].length > 2) {\n this.addVertexPoint(this.stops[stopId])\n }\n }\n }\n\n // determine which TurnPoints should be base vertices\n var turnLookup = {}\n var addTurn = function (turn1, turn2) {\n if (!(turn1.getId() in turnLookup)) turnLookup[turn1.getId()] = []\n if (turnLookup[turn1.getId()].indexOf(turn2) === -1) turnLookup[turn1.getId()].push(turn2)\n }\n each(this.streetEdges, function (streetEdgeId) {\n var streetEdge = self.streetEdges[streetEdgeId]\n if (streetEdge.fromTurnPoint && streetEdge.toTurnPoint) {\n addTurn(streetEdge.toTurnPoint, streetEdge.fromTurnPoint)\n addTurn(streetEdge.fromTurnPoint, streetEdge.toTurnPoint)\n }\n })\n each(turnLookup, function (turnPointId) {\n var count = turnLookup[turnPointId].length\n if (count > 2) self.addVertexPoint(self.turnPoints[turnPointId])\n })\n\n this.createGraph()\n\n this.loaded = true\n this.emit('load', this)\n return this\n}\n\n/** Graph Creation/Processing Methods **/\n\nNetwork.prototype.clearGraphData = function () {\n each(this.paths, function (path) {\n path.clearGraphData()\n })\n}\n\nNetwork.prototype.createGraph = function () {\n this.applyZoomFactors(this.transitive.display.activeZoomFactors)\n\n // clear previous graph-specific data\n if (this.pointClusterMap) this.pointClusterMap.clearMultiPoints()\n each(this.stops, function (stopId) {\n this.stops[stopId].setFocused(true)\n }, this)\n\n // create the list of vertex points\n var vertexPoints\n if (this.mergeVertexThreshold && this.mergeVertexThreshold > 0) {\n this.pointClusterMap = new PointClusterMap(this, this.mergeVertexThreshold)\n vertexPoints = this.pointClusterMap.getVertexPoints(this.baseVertexPoints)\n } else vertexPoints = this.baseVertexPoints\n\n // core graph creation steps\n this.graph = new Graph(this, vertexPoints)\n this.populateGraphEdges()\n this.graph.pruneVertices()\n this.createInternalVertexPoints()\n if (this.isSnapping()) this.graph.snapToGrid(this.gridCellSize)\n this.graph.sortVertices()\n\n // other post-processing actions\n this.annotateTransitPoints()\n // this.initPlaceAdjacency();\n this.createRenderedSegments()\n this.transitive.labeler.updateLabelList(this.graph)\n this.updateGeometry(true)\n}\n\nNetwork.prototype.isSnapping = function () {\n return this.gridCellSize && this.gridCellSize !== 0\n}\n\n/*\n * identify and populate the 'internal' vertex points, which is zoom-level specfic\n */\n\nNetwork.prototype.createInternalVertexPoints = function () {\n this.internalVertexPoints = []\n\n for (var i in this.graph.edgeGroups) {\n var edgeGroup = this.graph.edgeGroups[i]\n\n var wlen = edgeGroup.getWorldLength()\n\n var splitPoints = []\n\n // compute the maximum number of internal points for this edge to add as graph vertices\n if (edgeGroup.hasTransit()) {\n var vertexFactor = this.internalVertexFactor //! edgeGroup.hasTransit() ? 1 : this.internalVertexFactor;\n var newVertexCount = Math.floor(wlen / vertexFactor)\n\n // get the priority queue of the edge's internal points\n var pq = edgeGroup.getInternalVertexPQ()\n\n // pull the 'best' points from the queue until we reach the maximum\n while (splitPoints.length < newVertexCount && pq.size() > 0) {\n var el = pq.deq()\n splitPoints.push(el.point)\n }\n }\n\n // perform the split operation (if needed)\n if (splitPoints.length > 0) {\n for (var e = 0; e < edgeGroup.edges.length; e++) {\n var edge = edgeGroup.edges[e]\n this.graph.splitEdgeAtInternalPoints(edge, splitPoints)\n }\n }\n }\n}\n\nNetwork.prototype.updateGeometry = function () {\n // clear the stop render data\n // for (var key in this.stops) this.stops[key].renderData = [];\n\n this.graph.vertices.forEach(function (vertex) {\n // vertex.snapped = false;\n vertex.point.clearRenderData()\n })\n\n // refresh the edge-based points\n this.graph.edges.forEach(function (edge) {\n edge.pointArray.forEach(function (point) {\n point.clearRenderData()\n })\n })\n\n this.renderedEdges.forEach(function (rEdge) {\n rEdge.clearOffsets()\n })\n\n // if (snapGrid)\n // if(this.gridCellSize && this.gridCellSize !== 0) this.graph.snapToGrid(this.gridCellSize);\n\n // this.fixPointOverlaps();\n\n this.graph.calculateGeometry(this.gridCellSize, this.angleConstraint)\n\n this.graph.apply2DOffsets(this)\n}\n\nNetwork.prototype.applyZoomFactors = function (factors) {\n this.gridCellSize = factors.gridCellSize\n this.internalVertexFactor = factors.internalVertexFactor\n this.angleConstraint = factors.angleConstraint\n this.mergeVertexThreshold = factors.mergeVertexThreshold\n}\n\n/**\n *\n */\n\nNetwork.prototype.processSegment = function (segment) {\n // iterate through this pattern's stops, associating stops/patterns with\n // each other and initializing the adjacentStops table\n var previousStop = null\n for (var i = 0; i < segment.points.length; i++) {\n var point = segment.points[i]\n point.used = true\n\n // called for each pair of adjacent stops in sequence\n if (previousStop && point.getType() === 'STOP') {\n this.addStopAdjacency(point.getId(), previousStop.getId())\n this.addStopAdjacency(previousStop.getId(), point.getId())\n }\n\n previousStop = (point.getType() === 'STOP') ? point : null\n\n // add the start and end points to the vertexStops collection\n var startPoint = segment.points[0]\n this.addVertexPoint(startPoint)\n startPoint.isSegmentEndPoint = true\n\n var endPoint = segment.points[segment.points.length - 1]\n this.addVertexPoint(endPoint)\n endPoint.isSegmentEndPoint = true\n }\n}\n\n/**\n * Helper function for stopAjacency table\n *\n * @param {Stop} adjacent stops list\n * @param {Stop} stopA\n * @param {Stop} stopB\n */\n\nNetwork.prototype.addStopAdjacency = function (stopIdA, stopIdB) {\n if (!this.adjacentStops[stopIdA]) this.adjacentStops[stopIdA] = []\n if (this.adjacentStops[stopIdA].indexOf(stopIdB) === -1) this.adjacentStops[stopIdA].push(stopIdB)\n}\n\n/**\n * Populate the graph edges\n */\n\nNetwork.prototype.populateGraphEdges = function () {\n // vertex associated with the last vertex point we passed in this sequence\n var lastVertex = null\n\n // collection of 'internal' (i.e. non-vertex) points passed\n // since the last vertex point\n var internalPoints = []\n\n each(this.paths, function (path) {\n each(path.segments, function (segment) {\n lastVertex = null\n\n var streetEdgeIndex = 0\n\n // for transit segments, see if there is a pattern with inter-stop geometry defined\n var representativePattern = null\n if (segment.type === 'TRANSIT') {\n for (var i = 0; i < segment.patternGroup.patterns.length; i++) {\n var pattern = segment.patternGroup.patterns[i]\n if (pattern.interStopGeometry && pattern.interStopGeometry.length === pattern.stops.length - 1) {\n representativePattern = pattern\n break\n }\n }\n }\n\n /**\n * geomCoords: The geographic coordinates for the graph edge currently\n * being constructed, used when rendering edges in \"real-world\" (i.e.\n * non-schematic) mode. geomCoords data is only initialized here for\n * street-based segments, using the segment's embedded street geometry\n * data (if provided).\n */\n var geomCoords = []\n\n /**\n * pointGeom: An array of point-specific geometry (i.e. the alignment\n * connecting this point to the following point in the containing\n * segment's point sequence. Currently applies to transit segments only.\n * pointGeom data is converted to geomCoords for rendering in the\n * splitEdgeAtInternalPoints method of NetworkGraph\n */\n var pointGeom = []\n\n each(segment.points, function (point, index) {\n if (segment.streetEdges) { // street-based segment with street-edge geometry\n for (var i = streetEdgeIndex; i < segment.streetEdges.length; i++) {\n if (index === 0) break\n\n geomCoords = geomCoords.concat(geomCoords.length > 0 ? segment.streetEdges[i].worldCoords.slice(1) : segment.streetEdges[i].worldCoords)\n if (segment.streetEdges[i].toTurnPoint === point) {\n streetEdgeIndex = i + 1\n break\n }\n }\n } else if (representativePattern) { // transit-based segment with known geometry\n var fromIndex = segment.patternGroup.getFromIndex(representativePattern)\n\n // ignore the first stop, since the geometry at this index represents\n // the alignment leading into that stop\n if (index > 0) {\n // add the alignment extending from this stop to the pointGeom array\n var geom = representativePattern.interStopGeometry[fromIndex + index - 1]\n pointGeom.push(geom)\n }\n }\n\n if (point.multipoint) point = point.multipoint\n\n if (point.graphVertex) { // this is a vertex point\n if (lastVertex !== null) {\n if (lastVertex.point === point) return\n\n // see if an equivalent graph edge already exists\n var fromVertex = lastVertex\n var toVertex = point.graphVertex\n var edge = this.graph.getEquivalentEdge(internalPoints, fromVertex, toVertex)\n\n // create a new graph edge if necessary\n if (!edge) {\n edge = this.graph.addEdge(internalPoints, fromVertex, toVertex, segment.getType())\n if (geomCoords && geomCoords.length > 0) edge.geomCoords = geomCoords\n if (pointGeom && pointGeom.length > 0) edge.pointGeom = pointGeom\n }\n\n // associate the graph edge and path segment with each other\n segment.addEdge(edge, fromVertex)\n edge.addPathSegment(segment)\n\n // reset the geomCoords and pointGeom arrays for the next edge\n geomCoords = []\n pointGeom = []\n }\n\n lastVertex = point.graphVertex\n internalPoints = []\n } else { // this is an internal point\n internalPoints.push(point)\n }\n }, this)\n // }\n }, this)\n }, this)\n}\n\nNetwork.prototype.createGraphEdge = function (segment, fromVertex, toVertex, internalPoints, geomCoords) {\n var edge = this.graph.getEquivalentEdge(internalPoints, fromVertex, toVertex)\n\n if (!edge) {\n edge = this.graph.addEdge(internalPoints, fromVertex, toVertex, segment.getType())\n\n // calculate the angle and apply to edge stops\n /* var dx = fromVertex.x - toVertex.x;\n var dy = fromVertex.y - toVertex.y;\n var angle = Math.atan2(dy, dx) * 180 / Math.PI;\n point.angle = lastVertex.point.angle = angle;\n for (var is = 0; is < internalPoints.length; is++) {\n internalPoints[is].angle = angle;\n } */\n\n if (geomCoords) edge.geomCoords = geomCoords\n\n debug('--- created edge ' + edge.toString())\n debug(edge)\n each(edge.geomCoords, function (c) {\n debug(c)\n })\n }\n\n segment.addEdge(edge, fromVertex)\n edge.addPathSegment(segment)\n}\n\nNetwork.prototype.annotateTransitPoints = function () {\n this.paths.forEach(function (path) {\n var transitSegments = []\n path.segments.forEach(function (pathSegment) {\n if (pathSegment.type === 'TRANSIT') transitSegments.push(pathSegment)\n })\n\n path.segments.forEach(function (pathSegment) {\n if (pathSegment.type === 'TRANSIT') {\n // if first transit segment in path, mark 'from' endpoint as board point\n if (transitSegments.indexOf(pathSegment) === 0) {\n pathSegment.points[0].isBoardPoint = true\n\n // if there are additional transit segments, mark the 'to' endpoint as a transfer point\n if (transitSegments.length > 1) pathSegment.points[pathSegment.points.length - 1].isTransferPoint = true\n\n // if last transit segment in path, mark 'to' endpoint as alight point\n } else if (transitSegments.indexOf(pathSegment) === transitSegments.length - 1) {\n pathSegment.points[pathSegment.points.length - 1].isAlightPoint = true\n\n // if there are additional transit segments, mark the 'from' endpoint as a transfer point\n if (transitSegments.length > 1) pathSegment.points[0].isTransferPoint = true\n\n // if this is an 'internal' transit segment, mark both endpoints as transfer points\n } else if (transitSegments.length > 2) {\n pathSegment.points[0].isTransferPoint = true\n pathSegment.points[pathSegment.points.length - 1].isTransferPoint = true\n }\n }\n })\n })\n}\n\nNetwork.prototype.initPlaceAdjacency = function () {\n each(this.places, function (placeId) {\n var place = this.places[placeId]\n if (!place.graphVertex) return\n each(place.graphVertex.incidentEdges(), function (edge) {\n var oppVertex = edge.oppositeVertex(place.graphVertex)\n if (oppVertex.point) {\n oppVertex.point.adjacentPlace = place\n }\n })\n }, this)\n}\n\nNetwork.prototype.createRenderedSegments = function () {\n this.reLookup = {}\n this.renderedEdges = []\n this.renderedSegments = []\n\n for (var patternId in this.patterns) {\n this.patterns[patternId].renderedEdges = []\n }\n\n each(this.paths, function (path) {\n each(path.segments, function (pathSegment) {\n pathSegment.renderedSegments = []\n\n if (pathSegment.type === 'TRANSIT') {\n // create a RenderedSegment for each pattern, except for buses which are collapsed to a single segment\n var busPatterns = []\n each(pathSegment.getPatterns(), function (pattern) {\n if (pattern.route.route_type === 3) busPatterns.push(pattern)\n else this.createRenderedSegment(pathSegment, [pattern])\n }, this)\n if (busPatterns.length > 0) {\n this.createRenderedSegment(pathSegment, busPatterns)\n }\n } else { // non-transit segments\n this.createRenderedSegment(pathSegment)\n }\n }, this)\n }, this)\n\n this.renderedEdges.sort(function (a, b) { // process render transit segments before walk\n if (a.getType() === 'WALK') return 1\n if (b.getType() === 'WALK') return -1\n })\n}\n\nNetwork.prototype.createRenderedSegment = function (pathSegment, patterns) {\n var rSegment = new RenderedSegment(pathSegment)\n\n each(pathSegment.edges, function (edge) {\n var rEdge = this.createRenderedEdge(pathSegment, edge.graphEdge, edge.forward, patterns)\n rSegment.addRenderedEdge(rEdge)\n }, this)\n if (patterns) {\n rSegment.patterns = patterns\n rSegment.mode = patterns[0].route.route_type\n }\n\n pathSegment.addRenderedSegment(rSegment)\n}\n\nNetwork.prototype.createRenderedEdge = function (pathSegment, gEdge, forward, patterns) {\n var rEdge\n\n // construct the edge key, disregarding mode qualifiers (e.g. \"_RENT\")\n var type = pathSegment.getType().split('_')[0]\n var key = gEdge.id + (forward ? 'F' : 'R') + '_' + type\n\n // for non-bus transit edges, append an exemplar pattern ID to the key\n if (patterns && patterns[0].route.route_type !== 3) {\n key += '_' + patterns[0].getId()\n }\n\n // see if this r-edge already exists\n if (key in this.reLookup) {\n rEdge = this.reLookup[key]\n } else { // if not, create it\n rEdge = new RenderedEdge(gEdge, forward, type)\n if (patterns) {\n each(patterns, function (pattern) {\n pattern.addRenderedEdge(rEdge)\n rEdge.addPattern(pattern)\n })\n rEdge.mode = patterns[0].route.route_type\n }\n rEdge.points.push(gEdge.fromVertex.point)\n rEdge.points.push(gEdge.toVertex.point)\n gEdge.addRenderedEdge(rEdge)\n rEdge.addPathSegment(pathSegment)\n\n this.renderedEdges.push(rEdge)\n this.reLookup[key] = rEdge\n }\n return rEdge\n}\n\nNetwork.prototype.addVertexPoint = function (point) {\n if (this.baseVertexPoints.indexOf(point) !== -1) return\n this.baseVertexPoints.push(point)\n}\n", - "var d3 = require('d3')\n\nvar interpolateLine = require('../util/interpolate-line')\n\n/**\n * Expose `NetworkPath`\n */\n\nmodule.exports = NetworkPath\n\n/**\n * NetworkPath -- a path through the network graph. Composed of PathSegments (which\n * are in turn composed of a sequence of graph edges)\n *\n * @param {Object} the parent onject (a RoutePattern or Journey)\n */\n\nfunction NetworkPath (parent) {\n this.parent = parent\n this.segments = []\n}\n\nNetworkPath.prototype.clearGraphData = function (segment) {\n this.segments.forEach(function (segment) {\n segment.clearGraphData()\n })\n}\n\n/**\n * addSegment: add a new segment to the end of this NetworkPath\n */\n\nNetworkPath.prototype.addSegment = function (segment) {\n this.segments.push(segment)\n segment.points.forEach(function (point) {\n point.paths.push(this)\n }, this)\n}\n\n/** highlight **/\n\nNetworkPath.prototype.drawHighlight = function (display, capExtension) {\n this.line = d3.svg.line() // the line translation function\n .x(function (pointInfo, i) {\n return display.xScale(pointInfo.x) + (pointInfo.offsetX || 0)\n })\n .y(function (pointInfo, i) {\n return display.yScale(pointInfo.y) - (pointInfo.offsetY || 0)\n })\n .interpolate(interpolateLine.bind(this))\n\n this.lineGraph = display.svg.append('path')\n .attr('id', 'transitive-path-highlight-' + this.parent.getElementId())\n .attr('class', 'transitive-path-highlight')\n .style('stroke-width', 24).style('stroke', '#ff4')\n .style('fill', 'none')\n .style('visibility', 'hidden')\n .data([this])\n}\n\nNetworkPath.prototype.getRenderedSegments = function () {\n var renderedSegments = []\n this.segments.forEach(function (pathSegment) {\n renderedSegments = renderedSegments.concat(pathSegment.renderedSegments)\n })\n return renderedSegments\n}\n\n/**\n * getPointArray\n */\n\nNetworkPath.prototype.getPointArray = function () {\n var points = []\n for (var i = 0; i < this.segments.length; i++) {\n var segment = this.segments[i]\n if (i > 0 && segment.points[0] === this.segments[i - 1].points[this.segments[i - 1].points.length - 1]) {\n points.concat(segment.points.slice(1))\n } else {\n points.concat(segment.points)\n }\n }\n return points\n}\n", - "/**\n * Dependencies\n */\n\nvar each = require('component-each')\n\nvar PatternGroup = require('./patterngroup')\nvar LabelEdgeGroup = require('../labeler/labeledgegroup.js')\n\nvar segmentId = 0\n\n/**\n * Expose `PathSegment`\n */\n\nmodule.exports = PathSegment\n\n/**\n *\n */\n\nfunction PathSegment (type, path) {\n this.id = segmentId++\n this.type = type\n this.path = path\n this.points = []\n this.edges = []\n this.renderedSegments = []\n this.patternGroup = new PatternGroup()\n}\n\nPathSegment.prototype.clearGraphData = function () {\n this.edges = []\n this.points.forEach(function (point) {\n point.graphVertex = null\n })\n this.renderLength = null\n}\n\nPathSegment.prototype.getId = function () {\n return this.id\n}\n\nPathSegment.prototype.getType = function () {\n return this.type\n}\n\nPathSegment.prototype.addRenderedSegment = function (rSegment) {\n this.renderedSegments.push(rSegment)\n}\n\nPathSegment.prototype.addEdge = function (graphEdge, originVertex) {\n this.edges.push({\n graphEdge: graphEdge,\n forward: (originVertex === graphEdge.fromVertex)\n })\n}\n\nPathSegment.prototype.insertEdgeAt = function (index, graphEdge, originVertex) {\n var edgeInfo = {\n graphEdge: graphEdge,\n forward: (originVertex === graphEdge.fromVertex)\n }\n this.edges.splice(index, 0, edgeInfo)\n}\n\nPathSegment.prototype.removeEdge = function (graphEdge) {\n var index = null\n for (var i = 0; i < this.edges.length; i++) {\n if (this.edges[i].graphEdge === graphEdge) {\n index = i\n break\n }\n }\n if (index !== null) this.edges.splice(index, 1)\n}\n\nPathSegment.prototype.getEdgeIndex = function (graphEdge) {\n for (var i = 0; i < this.edges.length; i++) {\n if (this.edges[i].graphEdge === graphEdge) return i\n }\n return -1\n}\n\n/**\n * Get graph vertices\n */\n\nPathSegment.prototype.getGraphVertices = function () {\n var vertices = []\n this.edges.forEach(function (edge, i) {\n if (i === 0) {\n vertices.push(edge.graphEdge.fromVertex)\n }\n vertices.push(edge.graphEdge.toVertex)\n })\n return vertices\n}\n\nPathSegment.prototype.vertexArray = function () {\n var vertex = this.startVertex()\n var array = [vertex]\n\n this.edges.forEach(function (edgeInfo) {\n vertex = edgeInfo.graphEdge.oppositeVertex(vertex)\n array.push(vertex)\n })\n\n return array\n}\n\nPathSegment.prototype.startVertex = function () {\n if (this.points[0].multipoint) return this.points[0].multipoint.graphVertex\n if (!this.edges || this.edges.length === 0) return null\n\n var firstGraphEdge = this.edges[0].graphEdge\n return this.edges[0].forward ? firstGraphEdge.fromVertex : firstGraphEdge.toVertex\n\n /* if (this.graphEdges.length === 1) return this.graphEdges[0].fromVertex;\n var first = this.graphEdges[0],\n next = this.graphEdges[1];\n if (first.toVertex == next.toVertex || first.toVertex == next.fromVertex)\n return first.fromVertex;\n if (first.fromVertex == next.toVertex || first.fromVertex == next.fromVertex)\n return first.toVertex;\n return null; */\n}\n\nPathSegment.prototype.endVertex = function () {\n if (this.points[this.points.length - 1].multipoint) return this.points[this.points.length - 1].multipoint.graphVertex\n if (!this.edges || this.edges.length === 0) return null\n\n var lastGraphEdge = this.edges[this.edges.length - 1].graphEdge\n return this.edges[this.edges.length - 1].forward ? lastGraphEdge.toVertex : lastGraphEdge.fromVertex\n\n /* if (this.graphEdges.length === 1) return this.graphEdges[0].toVertex;\n var last = this.graphEdges[this.graphEdges.length - 1],\n prev = this.graphEdges[this.graphEdges.length - 2];\n if (last.toVertex == prev.toVertex || last.toVertex == prev.fromVertex)\n return last.fromVertex;\n if (last.fromVertex == prev.toVertex || last.fromVertex == prev.fromVertex)\n return last.toVertex;\n return null; */\n}\n\nPathSegment.prototype.addPattern = function (pattern, fromIndex, toIndex) {\n // Initialize this segment's 'points' array to include the stops in the\n // provided pattern between the specified from and to indices, inclusive.\n // Only do this if the points array is empty or if the the length of the\n // segment being added exceeds that of the one currently stored.\n if ((toIndex - fromIndex + 1) > this.points.length) {\n this.points = []\n var lastStop = null\n for (var i = fromIndex; i <= toIndex; i++) {\n var stop = pattern.stops[i]\n if (lastStop !== stop) {\n this.points.push(stop)\n }\n lastStop = stop\n }\n }\n\n // Add the pattern to this segment's PatternGroup\n this.patternGroup.addPattern(pattern, fromIndex, toIndex)\n}\n\nPathSegment.prototype.getPattern = function () {\n return this.patternGroup.patterns[0]\n}\n\nPathSegment.prototype.getPatterns = function () {\n return this.patternGroup.patterns\n}\n\nPathSegment.prototype.getMode = function () {\n return this.patternGroup.patterns[0].route.route_type\n}\n\nPathSegment.prototype.toString = function () {\n var startVertex = this.startVertex()\n var endVertex = this.endVertex()\n return 'PathSegment id=' + this.id + ' type=' + this.type + ' from ' +\n (startVertex ? startVertex.toString() : '(unknown)') + ' to ' +\n (endVertex ? endVertex.toString() : '(unknown)')\n}\n\nPathSegment.prototype.getLabelEdgeGroups = function () {\n var edgeGroups = []\n each(this.renderedSegments, function (rSegment) {\n if (!rSegment.isFocused()) return\n var currentGroup = new LabelEdgeGroup(rSegment)\n each(rSegment.renderedEdges, function (rEdge) {\n currentGroup.addEdge(rEdge)\n if (rEdge.graphEdge.toVertex.point.containsSegmentEndPoint()) {\n edgeGroups.push(currentGroup)\n currentGroup = new LabelEdgeGroup(rSegment)\n }\n }, this)\n }, this)\n\n return edgeGroups\n}\n", - "var each = require('component-each')\n\nvar NetworkPath = require('./path')\nvar PathSegment = require('./pathsegment')\n\nvar Polyline = require('../util/polyline.js')\nvar SphericalMercator = require('../util/spherical-mercator')\nvar sm = new SphericalMercator()\n\n/**\n * Expose `RoutePattern`\n */\n\nmodule.exports = RoutePattern\n\n/**\n * A RoutePattern\n *\n * @param {Object} RoutePattern data object from the transitive.js input\n */\n\nfunction RoutePattern (data, transitive) {\n for (var key in data) {\n if (key === 'stops') continue\n this[key] = data[key]\n }\n\n // the array of Stops that make up this pattern\n this.stops = []\n\n // the inter-stop geometry, an array of point sequences (themselves arrays)\n // that represent the geometry beween stops i and i+1. This array should be\n // exactly one item shorter than the stops array.\n this.interStopGeometry = []\n\n if (transitive) {\n each(data.stops, function (stop) {\n // look up the Stop in the master collection and add to the stops array\n this.stops.push(transitive.stops[stop.stop_id])\n\n // if inter-stop geometry is provided: decode polyline, convert points\n // to SphericalMercator, and add to the interStopGeometry array\n if (stop.geometry) {\n var latLons = Polyline.decode(stop.geometry)\n var coords = []\n each(latLons, function (latLon) {\n coords.push(sm.forward([latLon[1], latLon[0]]))\n })\n this.interStopGeometry.push(coords)\n }\n }, this)\n }\n\n this.renderedEdges = []\n}\n\nRoutePattern.prototype.getId = function () {\n return this.pattern_id\n}\n\nRoutePattern.prototype.getElementId = function () {\n return 'pattern-' + this.pattern_id\n}\n\nRoutePattern.prototype.getName = function () {\n return this.pattern_name\n}\n\nRoutePattern.prototype.addRenderedEdge = function (rEdge) {\n if (this.renderedEdges.indexOf(rEdge) === -1) this.renderedEdges.push(rEdge)\n}\n\nRoutePattern.prototype.offsetAlignment = function (alignmentId, offset) {\n each(this.renderedEdges, function (rEdge) {\n rEdge.offsetAlignment(alignmentId, offset)\n })\n}\n\nRoutePattern.prototype.createPath = function () {\n var path = new NetworkPath(this)\n var pathSegment = new PathSegment('TRANSIT', path)\n pathSegment.addPattern(this, 0, this.stops.length - 1)\n path.addSegment(pathSegment)\n return path\n}\n", - "/**\n * Expose `PatternGroup`\n */\n\nmodule.exports = PatternGroup\n\n/**\n * PatternGroup -- a collection of one or more RoutePatterns associated with\n * a PathSegment\n *\n * @param {Object} RoutePattern data object from the transitive.js input\n */\n\nfunction PatternGroup () {\n this.patterns = []\n\n // lookup tables mapping pattern IDs to their from/to indices in the containing PathSegment\n this.fromIndexLookup = {}\n this.toIndexLookup = {}\n}\n\nPatternGroup.prototype.addPattern = function (pattern, fromIndex, toIndex) {\n if (this.patterns.indexOf(pattern) === -1) {\n this.patterns.push(pattern)\n this.fromIndexLookup[pattern.pattern_id] = fromIndex\n this.toIndexLookup[pattern.pattern_id] = toIndex\n }\n}\n\nPatternGroup.prototype.getFromIndex = function (pattern) {\n return this.fromIndexLookup[pattern.pattern_id]\n}\n\nPatternGroup.prototype.getToIndex = function (pattern) {\n return this.toIndexLookup[pattern.pattern_id]\n}\n", - "/**\n * Expose `Route`\n */\n\nmodule.exports = Route\n\n/**\n * A transit Route, as defined in the input data.\n * Routes contain one or more Patterns.\n *\n * @param {Object}\n */\n\nfunction Route (data) {\n for (var key in data) {\n if (key === 'patterns') continue\n this[key] = data[key]\n }\n\n this.patterns = []\n}\n\n/**\n * Add Pattern\n *\n * @param {Pattern}\n */\n\nRoute.prototype.addPattern = function (pattern) {\n this.patterns.push(pattern)\n pattern.route = this\n}\n\nRoute.prototype.getColor = function () {\n if (this.route_color) {\n if (this.route_color.charAt(0) === '#') return this.route_color\n return '#' + this.route_color\n }\n\n // assign a random shade of gray\n /* var c = 128 + Math.floor(64 * Math.random());\n var hex = c.toString(16);\n hex = (hex.length === 1) ? '0' + hex : hex;\n\n this.route_color = '#' + hex + hex + hex;\n\n return this.route_color; */\n}\n", - "var d3 = require('d3')\n\nmodule.exports = function () {\n var size = [960, 500]\n var scale = 256\n var translate = [size[0] / 2, size[1] / 2]\n var zoomDelta = 0\n\n function tile () {\n var z = Math.max(Math.log(scale) / Math.LN2 - 8, 0)\n var z0 = Math.round(z + zoomDelta)\n var k = Math.pow(2, z - z0 + 8)\n var origin = [(translate[0] - scale / 2) / k, (translate[1] - scale / 2) / k]\n var tiles = []\n var cols = d3.range(Math.max(0, Math.floor(-origin[0])), Math.max(0, Math.ceil(size[0] / k - origin[0])))\n var rows = d3.range(Math.max(0, Math.floor(-origin[1])), Math.max(0, Math.ceil(size[1] / k - origin[1])))\n\n rows.forEach(function (y) {\n cols.forEach(function (x) {\n tiles.push([x, y, z0])\n })\n })\n\n tiles.translate = origin\n tiles.scale = k\n\n return tiles\n }\n\n tile.size = function (_) {\n if (!arguments.length) return size\n size = _\n return tile\n }\n\n tile.scale = function (_) {\n if (!arguments.length) return scale\n scale = _\n return tile\n }\n\n tile.translate = function (_) {\n if (!arguments.length) return translate\n translate = _\n return tile\n }\n\n tile.zoomDelta = function (_) {\n if (!arguments.length) return zoomDelta\n zoomDelta = +_\n return tile\n }\n\n return tile\n}\n", - "/**\n * Draw the snapping grid\n *\n * @param {Display} display object\n * @param {Number} cell size\n */\n\nmodule.exports = function drawGrid (display, cellSize) {\n var svg = display.svg\n var xScale = display.xScale\n var yScale = display.yScale\n\n // Remove all current gridlines\n svg.selectAll('.gridline').remove()\n\n // Add a grid group \"behind\" everything else\n var grid = svg.insert('g', ':first-child')\n\n var xRange = xScale.range()\n var yRange = yScale.range()\n var xDomain = xScale.domain()\n var yDomain = yScale.domain()\n\n var xMin = Math.round(xDomain[0] / cellSize) * cellSize\n var xMax = Math.round(xDomain[1] / cellSize) * cellSize\n for (var x = xMin; x <= xMax; x += cellSize) appendLine(xScale(x), xScale(x), yRange[0], yRange[1])\n\n var yMin = Math.round(yDomain[0] / cellSize) * cellSize\n var yMax = Math.round(yDomain[1] / cellSize) * cellSize\n for (var y = yMin; y <= yMax; y += cellSize) appendLine(xRange[0], xRange[1], yScale(y), yScale(y))\n\n function appendLine (x1, x2, y1, y2) {\n grid.append('line')\n .attr({\n 'class': 'gridline',\n 'x1': x1,\n 'x2': x2,\n 'y1': y1,\n 'y2': y2\n })\n }\n}\n", - "var d3 = require('d3')\nvar debug = require('debug')('transitive:display')\n\nvar Legend = require('./legend')\nvar TileLayer = require('./tile-layer')\n\nvar SphericalMercator = require('../util/spherical-mercator')\nvar sm = new SphericalMercator()\n\n/**\n * Expose `Display`\n */\n\nmodule.exports = Display\n\n/**\n * The D3-based SVG display.\n *\n * @param {Object} options\n */\n\nfunction Display (transitive) {\n this.transitive = transitive\n var el = this.el = transitive.el\n this.width = el.clientWidth\n this.height = el.clientHeight\n\n // Set up the pan/zoom behavior\n var zoom = this.zoom = d3.behavior.zoom()\n .scaleExtent([0.25, 4])\n\n var self = this\n\n var zoomBehavior = function () {\n self.computeScale()\n if (self.scale !== self.lastScale) { // zoom action\n self.zoomChanged()\n } else { // pan action\n setTimeout(transitive.refresh.bind(transitive, true), 0)\n }\n\n var llb = self.llBounds()\n debug('ll bounds: ' + llb[0][0] + ',' + llb[0][1] + ' to ' + llb[1][0] +\n ',' + llb[1][1])\n }\n\n this.zoom.on('zoom.transitive', zoomBehavior)\n\n this.zoomFactors = transitive.options.zoomFactors || this.getDefaultZoomFactors()\n\n // set up the svg display\n var div = d3.select(el)\n .attr('class', 'Transitive')\n\n if (transitive.options.zoomEnabled) {\n div.call(zoom)\n }\n\n this.svg = div\n .append('svg')\n .attr('class', 'schematic-map')\n\n // initialize the x/y scale objects\n this.xScale = d3.scale.linear()\n this.yScale = d3.scale.linear()\n\n // set up the resize event handler\n if (transitive.options.autoResize) {\n d3.select(window).on('resize.display', function () {\n self.resized()\n transitive.refresh()\n })\n }\n\n // set the scale\n var bounds\n if (transitive.options.initialBounds) {\n bounds = [sm.forward(transitive.options.initialBounds[0]),\n sm.forward(transitive.options.initialBounds[1])\n ]\n } else if (transitive.network && transitive.network.graph) {\n bounds = transitive.network.graph.bounds()\n }\n\n if (bounds) {\n this.setScale(bounds, transitive.options)\n this.updateActiveZoomFactors(this.scale)\n this.lastScale = this.scale\n } else {\n this.updateActiveZoomFactors(1)\n }\n\n // set up the map layer\n if (transitive.options.mapboxId) {\n this.tileLayer = new TileLayer({\n el: this.el,\n display: this,\n graph: transitive.graph,\n mapboxId: transitive.options.mapboxId\n })\n }\n\n // set up the legend\n if (transitive.options.legendEl) {\n this.legend = new Legend(transitive.options.legendEl, this, transitive)\n }\n\n transitive.emit('initialize display', transitive, this)\n return this\n}\n\n/**\n * zoomChanged -- called when the zoom level changes, either by through the native\n * zoom support or the setBounds() API call. Updates zoom factors as needed and\n * performs appropriate update action (render or refresh)\n */\n\nDisplay.prototype.zoomChanged = function () {\n if (this.updateActiveZoomFactors(this.scale)) {\n this.transitive.network = null\n this.transitive.render()\n } else this.transitive.refresh()\n this.lastScale = this.scale\n}\n\nDisplay.prototype.updateActiveZoomFactors = function (scale) {\n var updated = false\n for (var i = 0; i < this.zoomFactors.length; i++) {\n var min = this.zoomFactors[i].minScale\n var max = (i < this.zoomFactors.length - 1)\n ? this.zoomFactors[i + 1].minScale\n : Number.MAX_VALUE\n\n // check if we've crossed into a new zoomFactor partition\n if ((!this.lastScale || this.lastScale < min || this.lastScale >= max) &&\n scale >= min && scale < max) {\n this.activeZoomFactors = this.zoomFactors[i]\n updated = true\n }\n }\n return updated\n}\n\n/**\n * Return default zoom factors\n */\n\nDisplay.prototype.getDefaultZoomFactors = function (data) {\n return [{\n minScale: 0,\n gridCellSize: 25,\n internalVertexFactor: 1000000,\n angleConstraint: 45,\n mergeVertexThreshold: 200\n }, {\n minScale: 1.5,\n gridCellSize: 0,\n internalVertexFactor: 0,\n angleConstraint: 5,\n mergeVertexThreshold: 0\n }]\n}\n\n/**\n * Empty the display\n */\n\nDisplay.prototype.empty = function () {\n debug('emptying svg')\n this.svg.selectAll('*').remove()\n\n this.haloLayer = this.svg.insert('g', ':first-child')\n}\n\n/**\n * Set the scale\n */\n\nDisplay.prototype.setScale = function (bounds, options) {\n this.height = this.el.clientHeight\n this.width = this.el.clientWidth\n\n var domains = getDomains(this, this.height, this.width, bounds, options)\n this.xScale.domain(domains[0])\n this.yScale.domain(domains[1])\n\n this.xScale.range([0, this.width])\n this.yScale.range([this.height, 0])\n\n debug('x scale %j -> %j', this.xScale.domain(), this.xScale.range())\n debug('y scale %j -> %j', this.yScale.domain(), this.yScale.range())\n\n this.zoom\n .x(this.xScale)\n .y(this.yScale)\n\n this.initXRes = (domains[0][1] - domains[0][0]) / this.width\n this.scale = 1\n\n this.scaleSet = true\n}\n\nDisplay.prototype.computeScale = function () {\n var newXRes = (this.xScale.domain()[1] - this.xScale.domain()[0]) / this.width\n this.scale = this.initXRes / newXRes\n}\n\n/**\n * updateDomains -- set x/y domains of geographic (spherical mercator) coordinate\n * system. Does *not* check/adjust aspect ratio.\n */\n\nDisplay.prototype.updateDomains = function (bounds) {\n this.xScale.domain([bounds[0][0], bounds[1][0]])\n this.yScale.domain([bounds[0][1], bounds[1][1]])\n\n this.zoom\n .x(this.xScale)\n .y(this.yScale)\n\n this.computeScale()\n}\n\nDisplay.prototype.resized = function () {\n var newWidth = this.el.clientWidth\n var newHeight = this.el.clientHeight\n\n var xDomain = this.xScale.domain()\n var xFactor = newWidth / this.width\n var xDomainAdj = (xDomain[1] - xDomain[0]) * (xFactor - 1) / 2\n this.xScale.domain([xDomain[0] - xDomainAdj, xDomain[1] + xDomainAdj])\n\n var yDomain = this.yScale.domain()\n var yFactor = newHeight / this.height\n var yDomainAdj = (yDomain[1] - yDomain[0]) * (yFactor - 1) / 2\n this.yScale.domain([yDomain[0] - yDomainAdj, yDomain[1] + yDomainAdj])\n\n this.xScale.range([0, newWidth])\n this.yScale.range([newHeight, 0])\n\n this.height = newHeight\n this.width = newWidth\n\n this.zoom\n .x(this.xScale)\n .y(this.yScale)\n}\n\nDisplay.prototype.xyBounds = function () {\n var x = this.xScale.domain()\n var y = this.yScale.domain()\n return [\n [x[0], y[0]],\n [x[1], y[1]]\n ]\n}\n\n/**\n * Lat/lon bounds\n */\n\nDisplay.prototype.llBounds = function () {\n var x = this.xScale.domain()\n var y = this.yScale.domain()\n\n return [\n sm.inverse([x[0], y[0]]),\n sm.inverse([x[1], y[1]])\n ]\n}\n\nDisplay.prototype.isInRange = function (x, y) {\n var xRange = this.xScale.range()\n var yRange = this.yScale.range()\n\n return x >= xRange[0] && x <= xRange[1] && y >= yRange[1] && y <= yRange[0]\n}\n\n/**\n * Compute the x/y coordinate space domains to fit the graph.\n */\n\nfunction getDomains (display, height, width, bounds, options) {\n var xmin = bounds[0][0]\n var xmax = bounds[1][0]\n var ymin = bounds[0][1]\n var ymax = bounds[1][1]\n var xRange = xmax - xmin\n var yRange = ymax - ymin\n\n var paddingFactor = (options && options.paddingFactor)\n ? options.paddingFactor\n : 0.1\n\n var margins = getMargins(options)\n\n var usableHeight = height - margins.top - margins.bottom\n var usableWidth = width - margins.left - margins.right\n var displayAspect = width / height\n var usableDisplayAspect = usableWidth / usableHeight\n var graphAspect = xRange / (yRange === 0 ? -Infinity : yRange)\n\n var padding\n var dispX1, dispX2, dispY1, dispY2\n var dispXRange, dispYRange\n\n if (usableDisplayAspect > graphAspect) { // y-axis is limiting\n padding = paddingFactor * yRange\n dispY1 = ymin - padding\n dispY2 = ymax + padding\n dispYRange = yRange + 2 * padding\n var addedYRange = (height / usableHeight * dispYRange) - dispYRange\n if (margins.top > 0 || margins.bottom > 0) {\n dispY1 -= margins.bottom / (margins.bottom + margins.top) * addedYRange\n dispY2 += margins.top / (margins.bottom + margins.top) * addedYRange\n }\n dispXRange = (dispY2 - dispY1) * displayAspect\n var xOffset = (margins.left - margins.right) / width\n var xMidpoint = (xmax + xmin - dispXRange * xOffset) / 2\n dispX1 = xMidpoint - dispXRange / 2\n dispX2 = xMidpoint + dispXRange / 2\n } else { // x-axis limiting\n padding = paddingFactor * xRange\n dispX1 = xmin - padding\n dispX2 = xmax + padding\n dispXRange = xRange + 2 * padding\n var addedXRange = (width / usableWidth * dispXRange) - dispXRange\n if (margins.left > 0 || margins.right > 0) {\n dispX1 -= margins.left / (margins.left + margins.right) * addedXRange\n dispX2 += margins.right / (margins.left + margins.right) * addedXRange\n }\n\n dispYRange = (dispX2 - dispX1) / displayAspect\n var yOffset = (margins.bottom - margins.top) / height\n var yMidpoint = (ymax + ymin - dispYRange * yOffset) / 2\n dispY1 = yMidpoint - dispYRange / 2\n dispY2 = yMidpoint + dispYRange / 2\n }\n\n return [\n [dispX1, dispX2],\n [dispY1, dispY2]\n ]\n}\n\nfunction getMargins (options) {\n var margins = {\n left: 0,\n right: 0,\n top: 0,\n bottom: 0\n }\n\n if (options && options.displayMargins) {\n if (options.displayMargins.top) margins.top = options.displayMargins.top\n if (options.displayMargins.bottom) margins.bottom = options.displayMargins.bottom\n if (options.displayMargins.left) margins.left = options.displayMargins.left\n if (options.displayMargins.right) margins.right = options.displayMargins.right\n }\n\n return margins\n}\n", - "var d3 = require('d3')\n\nvar RenderedEdge = require('../renderer/renderededge')\nvar RenderedSegment = require('../renderer/renderedsegment')\nvar Util = require('../util')\nvar Stop = require('../point/stop')\n\n/**\n * Expose `Legend`\n */\n\nmodule.exports = Legend\n\nfunction Legend (el, display, transitive) {\n this.el = el\n this.display = display\n this.transitive = transitive\n\n this.height = Util.parsePixelStyle(d3.select(el).style('height'))\n}\n\nLegend.prototype.render = function (legendSegments) {\n d3.select(this.el).selectAll(':not(.doNotEmpty)').remove()\n\n this.x = this.spacing\n this.y = this.height / 2\n\n var segment\n\n // iterate through the representative map segments\n for (var legendType in legendSegments) {\n var mapSegment = legendSegments[legendType]\n\n // create a segment solely for rendering in the legend\n segment = new RenderedSegment()\n segment.type = mapSegment.getType()\n segment.mode = mapSegment.mode\n segment.patterns = mapSegment.patterns\n\n var canvas = this.createCanvas()\n\n var renderData = []\n renderData.push({\n x: 0,\n y: canvas.height / 2\n })\n renderData.push({\n x: canvas.width,\n y: canvas.height / 2\n })\n\n segment.render(canvas)\n segment.refresh(canvas, renderData)\n\n this.renderText(getDisplayText(legendType))\n\n this.x += this.spacing * 2\n }\n\n // create the 'transfer' marker\n\n var rEdge = new RenderedEdge(null, true, 'TRANSIT')\n rEdge.pattern = {\n pattern_id: 'ptn',\n route: {\n route_type: 1\n }\n }\n\n var transferStop = new Stop()\n transferStop.isSegmentEndPoint = true\n transferStop.isTransferPoint = true\n\n this.renderPoint(transferStop, rEdge, 'Transfer')\n}\n\nLegend.prototype.renderPoint = function (point, rEdge, text) {\n var canvas = this.createCanvas()\n\n point.addRenderData({\n owner: point,\n rEdge: rEdge,\n x: canvas.width / 2,\n y: canvas.height / 2,\n offsetX: 0,\n offsetY: 0\n })\n\n point.render(canvas)\n\n canvas.styler.stylePoint(canvas, point)\n point.refresh(canvas)\n\n this.renderText(text)\n}\n\nLegend.prototype.renderText = function (text) {\n d3.select(this.el).append('div')\n .attr('class', 'legendLabel')\n .html(text)\n}\n\nLegend.prototype.createCanvas = function () {\n var container = d3.select(this.el).append('div')\n .attr('class', 'legendSvg')\n\n var width = Util.parsePixelStyle(container.style('width'))\n if (!width || width === 0) width = 30\n\n var height = Util.parsePixelStyle(container.style('height'))\n if (!height || height === 0) height = this.height\n\n var canvas = {\n xScale: d3.scale.linear(),\n yScale: d3.scale.linear(),\n styler: this.transitive.styler,\n zoom: this.display.zoom,\n width: width,\n height: height,\n svg: container.append('svg')\n .style('width', width)\n .style('height', height)\n }\n\n return canvas\n}\n\nfunction getDisplayText (type) {\n switch (type) {\n case 'WALK':\n return 'Walk'\n case 'BICYCLE':\n return 'Bike'\n case 'CAR':\n return 'Drive'\n case 'TRANSIT_0':\n return 'Tram'\n case 'TRANSIT_1':\n return 'Metro'\n case 'TRANSIT_2':\n return 'Rail'\n case 'TRANSIT_3':\n return 'Bus'\n case 'TRANSIT_4':\n return 'Ferry'\n }\n return type\n}\n", - "var d3 = require('d3')\nvar debug = require('debug')('transitive:tile-layer')\n\nvar geoTile = require('./d3.geo.tile')\n\nvar prefix = prefixMatch(['webkit', 'ms', 'Moz', 'O'])\n\n/**\n * Tile layer takes a parent element, a zoom behavior, and a Mapbox ID\n *\n * @param {Object} opts\n */\n\nmodule.exports = function TileLayer (opts) {\n debug('creating the tile layer')\n\n var el = opts.el\n var display = opts.display\n var height = el.clientHeight\n var id = opts.mapboxId\n var width = el.clientWidth\n\n // Set up the projection\n var projection = d3.geo.mercator()\n .translate([width / 2, height / 2])\n\n // Set up the map tiles\n var tile = geoTile()\n\n // Create the tile layer\n var tileLayer = d3.select(el)\n .append('div')\n .attr('class', 'tile-layer')\n\n // Initial zoom\n zoomed()\n\n this.zoomed = zoomed\n\n // Reload tiles on pan and zoom\n function zoomed () {\n // Get the height and width\n height = el.clientHeight\n width = el.clientWidth\n\n // Set the map tile size\n tile.size([width, height])\n\n // Get the current display bounds\n var bounds = display.llBounds()\n\n // Project the bounds based on the current projection\n var psw = projection(bounds[0])\n var pne = projection(bounds[1])\n\n // Based the new scale and translation vector off the current one\n var scale = projection.scale() * 2 * Math.PI\n var translate = projection.translate()\n\n var dx = pne[0] - psw[0]\n var dy = pne[1] - psw[1]\n\n scale = scale * (1 / Math.max(dx / width, dy / height))\n projection\n .translate([width / 2, height / 2])\n .scale(scale / 2 / Math.PI)\n\n // Reproject the bounds based on the new scale and translation vector\n psw = projection(bounds[0])\n pne = projection(bounds[1])\n var x = (psw[0] + pne[0]) / 2\n var y = (psw[1] + pne[1]) / 2\n translate = [width - x, height - y]\n\n // Update the Geo tiles\n tile\n .scale(scale)\n .translate(translate)\n\n // Get the new set of tiles and render\n renderTiles(tile())\n }\n\n // Render tiles\n function renderTiles (tiles) {\n var image = tileLayer\n .style(prefix + 'transform', matrix3d(tiles.scale, tiles.translate))\n .selectAll('.tile')\n .data(tiles, function (d) {\n return d\n })\n\n image.exit()\n .remove()\n\n image.enter().append('img')\n .attr('class', 'tile')\n .attr('src', function (d) {\n return 'http://' + ['a', 'b', 'c', 'd'][Math.random() * 4 | 0] +\n '.tiles.mapbox.com/v3/' + id + '/' + d[2] + '/' + d[0] +\n '/' + d[1] + '.png'\n })\n .style('left', function (d) {\n return (d[0] << 8) + 'px'\n })\n .style('top', function (d) {\n return (d[1] << 8) + 'px'\n })\n }\n}\n\n/**\n * Get the 3D Transform Matrix\n */\n\nfunction matrix3d (scale, translate) {\n var k = scale / 256\n var r = scale % 1 ? Number : Math.round\n return 'matrix3d(' + [k, 0, 0, 0, 0, k, 0, 0, 0, 0, k, 0, r(translate[0] *\n scale), r(translate[1] * scale), 0, 1] + ')'\n}\n\n/**\n * Match the transform prefix\n */\n\nfunction prefixMatch (p) {\n var i = -1\n var n = p.length\n var s = document.body.style\n while (++i < n) {\n if (p[i] + 'Transform' in s) return '-' + p[i].toLowerCase() + '-'\n }\n return ''\n}\n", - "var each = require('component-each')\n\nvar Util = require('../util')\n\n/**\n * Expose `Edge`\n */\n\nmodule.exports = Edge\n\n/**\n * Initialize a new edge\n * @constructor\n * @param {Point[]} pointArray - the internal Points for this Edge\n * @param {Vertex} fromVertex\n * @param {Vertex} toVertex\n */\n\nvar edgeId = 0\n\nfunction Edge (pointArray, fromVertex, toVertex) {\n this.id = edgeId++\n this.pointArray = pointArray\n this.fromVertex = fromVertex\n this.toVertex = toVertex\n this.pathSegments = []\n this.renderedEdges = []\n}\n\nEdge.prototype.getId = function () {\n return this.id\n}\n\n/**\n *\n */\n\nEdge.prototype.getLength = function () {\n var dx = this.toVertex.x - this.fromVertex.x\n var dy = this.toVertex.y - this.fromVertex.y\n return Math.sqrt(dx * dx + dy * dy)\n}\n\nEdge.prototype.getWorldLength = function () {\n if (!this.worldLength) this.calculateWorldLengthAndMidpoint()\n return this.worldLength\n}\n\nEdge.prototype.getWorldMidpoint = function () {\n if (!this.worldMidpoint) this.calculateWorldLengthAndMidpoint()\n return this.worldMidpoint\n}\n\nEdge.prototype.calculateWorldLengthAndMidpoint = function () {\n var allPoints = [this.fromVertex.point].concat(this.pointArray, [this.toVertex\n .point\n ])\n this.worldLength = 0\n for (var i = 0; i < allPoints.length - 1; i++) {\n this.worldLength += Util.distance(allPoints[i].worldX, allPoints[i].worldY,\n allPoints[i + 1].worldX, allPoints[i + 1].worldY)\n }\n\n if (this.worldLength === 0) {\n this.worldMidpoint = {\n x: this.fromVertex.point.worldX,\n y: this.fromVertex.point.worldY\n }\n } else {\n var distTraversed = 0\n for (i = 0; i < allPoints.length - 1; i++) {\n var dist = Util.distance(allPoints[i].worldX, allPoints[i].worldY,\n allPoints[i + 1].worldX, allPoints[i + 1].worldY)\n if ((distTraversed + dist) / this.worldLength >= 0.5) {\n // find the position along this segment (0 <= t <= 1) where the edge midpoint lies\n var t = (0.5 - distTraversed / this.worldLength) / (dist / this.worldLength)\n this.worldMidpoint = {\n x: allPoints[i].worldX + t * (allPoints[i + 1].worldX - allPoints[i].worldX),\n y: allPoints[i].worldY + t * (allPoints[i + 1].worldY - allPoints[i].worldY)\n }\n this.pointsBeforeMidpoint = i\n this.pointsAfterMidpoint = this.pointArray.length - i\n break\n }\n distTraversed += dist\n }\n }\n}\n\n/**\n *\n */\n\nEdge.prototype.isAxial = function () {\n return (this.toVertex.x === this.fromVertex.x) || (this.toVertex.y === this.fromVertex\n .y)\n}\n\n/**\n *\n */\n\nEdge.prototype.hasCurvature = function () {\n return this.elbow !== null\n}\n\n/**\n *\n */\n\nEdge.prototype.replaceVertex = function (oldVertex, newVertex) {\n if (oldVertex === this.fromVertex) this.fromVertex = newVertex\n if (oldVertex === this.toVertex) this.toVertex = newVertex\n}\n\n/**\n * Add a path segment that traverses this edge\n */\n\nEdge.prototype.addPathSegment = function (segment) {\n this.pathSegments.push(segment)\n}\n\nEdge.prototype.copyPathSegments = function (baseEdge) {\n each(baseEdge.pathSegments, function (pathSegment) {\n this.addPathSegment(pathSegment)\n }, this)\n}\n\nEdge.prototype.getPathSegmentIds = function (baseEdge) {\n var pathSegIds = []\n each(this.pathSegments, function (segment) {\n pathSegIds.push(segment.id)\n })\n pathSegIds.sort()\n return pathSegIds.join(',')\n}\n\n/**\n *\n */\n\nEdge.prototype.addRenderedEdge = function (rEdge) {\n if (this.renderedEdges.indexOf(rEdge) !== -1) return\n this.renderedEdges.push(rEdge)\n}\n\n/** internal geometry functions **/\n\nEdge.prototype.calculateGeometry = function (cellSize, angleConstraint) {\n // if(!this.hasTransit()) angleConstraint = 5;\n angleConstraint = angleConstraint || 45\n\n this.angleConstraintR = angleConstraint * Math.PI / 180\n\n this.fx = this.fromVertex.point.worldX\n this.fy = this.fromVertex.point.worldY\n this.tx = this.toVertex.point.worldX\n this.ty = this.toVertex.point.worldY\n\n var midpoint = this.getWorldMidpoint()\n\n var targetFromAngle = Util.getVectorAngle(midpoint.x - this.fx, midpoint.y -\n this.fy)\n this.constrainedFromAngle = Math.round(targetFromAngle / this.angleConstraintR) *\n this.angleConstraintR\n\n var fromAngleDelta = Math.abs(this.constrainedFromAngle - targetFromAngle)\n this.fvx = Math.cos(this.constrainedFromAngle)\n this.fvy = Math.sin(this.constrainedFromAngle)\n\n var targetToAngle = Util.getVectorAngle(midpoint.x - this.tx, midpoint.y -\n this.ty)\n\n this.constrainedToAngle = Math.round(targetToAngle / this.angleConstraintR) *\n this.angleConstraintR\n\n var toAngleDelta = Math.abs(this.constrainedToAngle - targetToAngle)\n this.tvx = Math.cos(this.constrainedToAngle)\n this.tvy = Math.sin(this.constrainedToAngle)\n\n var tol = 0.01\n var v = Util.normalizeVector({\n x: (this.toVertex.x - this.fromVertex.x),\n y: (this.toVertex.y - this.fromVertex.y)\n })\n\n // check if we need to add curvature\n if (!equalVectors(this.fvx, this.fvy, -this.tvx, -this.tvy, tol) || !equalVectors(this.fvx, this.fvy, v.x, v.y, tol)) {\n // see if the default endpoint angles produce a valid intersection\n var isect = this.computeEndpointIntersection()\n\n if (isect.intersect) { // if so, compute the elbow and we're done\n this.elbow = {\n x: this.fx + isect.u * this.fvx,\n y: this.fy + isect.u * this.fvy\n }\n } else {\n // if not, adjust the two endpoint angles until they properly intersect\n\n // default test: compare angle adjustments (if significant difference)\n if (Math.abs(fromAngleDelta - toAngleDelta) > 0.087) {\n if (fromAngleDelta < toAngleDelta) {\n this.adjustToAngle()\n } else {\n this.adjustFromAngle()\n }\n } else { // secondary test: look at distribution of shapepoints\n if (this.pointsAfterMidpoint < this.pointsBeforeMidpoint) {\n this.adjustToAngle()\n } else {\n this.adjustFromAngle()\n }\n }\n }\n }\n\n this.fromAngle = this.constrainedFromAngle\n this.toAngle = this.constrainedToAngle\n\n this.calculateVectors()\n this.calculateAlignmentIds()\n}\n\n/**\n * Adjust the 'to' endpoint angle by rotating it increments of angleConstraintR\n * until a valid intersection between the from and to endpoint rays is achieved.\n */\n\nEdge.prototype.adjustToAngle = function () {\n var ccw = Util.ccw(this.fx, this.fy, (this.fx + this.fvx), (this.fy + this.fvy), this.tx, this.ty)\n var delta = (ccw > 0) ? this.angleConstraintR : -this.angleConstraintR\n var i = 0\n var isect\n while (i++ < 100) {\n this.constrainedToAngle += delta\n this.tvx = Math.cos(this.constrainedToAngle)\n this.tvy = Math.sin(this.constrainedToAngle)\n isect = this.computeEndpointIntersection()\n if (isect.intersect) break\n }\n this.elbow = {\n x: this.fx + isect.u * this.fvx,\n y: this.fy + isect.u * this.fvy\n }\n}\n\n/**\n * Adjust the 'from' endpoint angle by rotating it increments of angleConstraintR\n * until a valid intersection between the from and to endpoint rays is achieved.\n */\n\nEdge.prototype.adjustFromAngle = function () {\n var ccw = Util.ccw(this.tx, this.ty, (this.tx + this.tvx), (this.ty + this.tvy),\n this.fx, this.fy)\n var delta = (ccw > 0) ? this.angleConstraintR : -this.angleConstraintR\n var i = 0\n var isect\n while (i++ < 100) {\n this.constrainedFromAngle += delta\n this.fvx = Math.cos(this.constrainedFromAngle)\n this.fvy = Math.sin(this.constrainedFromAngle)\n isect = this.computeEndpointIntersection()\n if (isect.intersect) break\n }\n this.elbow = {\n x: this.fx + isect.u * this.fvx,\n y: this.fy + isect.u * this.fvy\n }\n}\n\nEdge.prototype.computeEndpointIntersection = function () {\n return Util.rayIntersection(this.fx, this.fy, this.fvx, this.fvy,\n this.tx, this.ty, this.tvx, this.tvy)\n}\n\nfunction equalVectors (x1, y1, x2, y2, tol) {\n tol = tol || 0\n return Math.abs(x1 - x2) < tol && Math.abs(y1 - y2) < tol\n}\n\nEdge.prototype.calculateVectors = function (fromAngle, toAngle) {\n this.fromVector = {\n x: Math.cos(this.fromAngle),\n y: Math.sin(this.fromAngle)\n }\n\n this.fromleftVector = {\n x: -this.fromVector.y,\n y: this.fromVector.x\n }\n\n this.fromRightVector = {\n x: this.fromVector.y,\n y: -this.fromVector.x\n }\n\n this.toVector = {\n x: Math.cos(this.toAngle + Math.PI),\n y: Math.sin(this.toAngle + Math.PI)\n }\n\n this.toleftVector = {\n x: -this.toVector.y,\n y: this.toVector.x\n }\n\n this.toRightVector = {\n x: this.toVector.y,\n y: -this.toVector.x\n }\n}\n\n/**\n * Compute the 'alignment id', a string that uniquely identifies a line in\n * 2D space given a point and angle relative to the x-axis.\n */\n\nEdge.prototype.calculateAlignmentId = function (x, y, angle) {\n var angleD = Math.round(angle * 180 / Math.PI)\n if (angleD > 90) angleD -= 180\n if (angleD <= -90) angleD += 180\n\n if (angleD === 90) {\n return '90_x' + x\n }\n\n // calculate the y-axis crossing\n var ya = Math.round(y - x * Math.tan(angle))\n return angleD + '_y' + ya\n}\n\nEdge.prototype.calculateAlignmentIds = function () {\n this.fromAlignmentId = this.calculateAlignmentId(this.fromVertex.x, this.fromVertex\n .y, this.fromAngle)\n this.toAlignmentId = this.calculateAlignmentId(this.toVertex.x, this.toVertex\n .y, this.toAngle)\n}\n\nEdge.prototype.hasTransit = function (cellSize) {\n // debug(this);\n for (var i = 0; i < this.pathSegments.length; i++) {\n if (this.pathSegments[i].getType() === 'TRANSIT') {\n return true\n }\n }\n return false\n}\n\nEdge.prototype.getFromAlignmentId = function () {\n return this.fromAlignmentId\n}\n\nEdge.prototype.getToAlignmentId = function () {\n return this.toAlignmentId\n}\n\nEdge.prototype.getAlignmentRange = function (alignmentId) {\n var p1, p2\n if (alignmentId === this.fromAlignmentId) {\n p1 = this.fromVertex\n p2 = this.elbow || this.toVertex\n } else if (alignmentId === this.toAlignmentId) {\n p1 = this.toVertex\n p2 = this.elbow || this.fromVertex\n } else {\n return null\n }\n\n var min, max\n if (alignmentId.substring(0, 2) === '90') {\n min = Math.min(p1.y, p2.y)\n max = Math.max(p1.y, p2.y)\n } else {\n min = Math.min(p1.x, p2.x)\n max = Math.max(p1.x, p2.x)\n }\n\n return {\n min: min,\n max: max\n }\n}\n\nEdge.prototype.align = function (vertex, vector) {\n if (this.aligned || !this.hasCurvature()) return\n var currentVector = this.getVector(vertex)\n if (Math.abs(currentVector.x) !== Math.abs(vector.x) || Math.abs(\n currentVector.y) !== Math.abs(vector.y)) {\n this.curveAngle = -this.curveAngle\n this.calculateGeometry()\n }\n this.aligned = true\n}\n\nEdge.prototype.getGeometricCoords = function (fromOffsetPx, toOffsetPx, display, forward) {\n var coords = []\n\n // reverse the coords array if needed\n var geomCoords = forward ? this.geomCoords : this.geomCoords.concat().reverse()\n\n each(geomCoords, function (coord, i) {\n var fromVector = null\n var toVector = null\n var rightVector\n var xOffset, yOffset\n var x1 = display.xScale(coord[0])\n var y1 = display.yScale(coord[1])\n\n // calculate the vector leading in to this coordinate\n if (i > 0) {\n var prevCoord = geomCoords[i - 1]\n var x0 = display.xScale(prevCoord[0])\n var y0 = display.yScale(prevCoord[1])\n if (x1 === x0 && y1 === y0) return\n\n toVector = {\n x: x1 - x0,\n y: y1 - y0\n }\n }\n\n // calculate the vector leading out from this coordinate\n if (i < geomCoords.length - 1) {\n var nextCoord = geomCoords[i + 1]\n var x2 = display.xScale(nextCoord[0])\n var y2 = display.yScale(nextCoord[1])\n if (x2 === x1 && y2 === y1) return\n\n fromVector = {\n x: x2 - x1,\n y: y2 - y1\n }\n }\n\n if (fromVector && !toVector) { // the first point in the geomCoords sequence\n rightVector = Util.normalizeVector({\n x: fromVector.y,\n y: -fromVector.x\n })\n xOffset = fromOffsetPx * rightVector.x\n yOffset = fromOffsetPx * rightVector.y\n } else if (!fromVector && toVector) { // the last point in the geomCoords sequence\n rightVector = Util.normalizeVector({\n x: toVector.y,\n y: -toVector.x\n })\n xOffset = fromOffsetPx * rightVector.x\n yOffset = fromOffsetPx * rightVector.y\n } else { // an internal point\n rightVector = Util.normalizeVector({\n x: fromVector.y,\n y: -fromVector.x\n })\n xOffset = fromOffsetPx * rightVector.x\n yOffset = fromOffsetPx * rightVector.y\n\n // TODO: properly compute the offsets based on both vectors\n }\n\n coords.push({\n x: x1 + xOffset,\n y: y1 + yOffset\n })\n }, this)\n return coords\n}\n\nEdge.prototype.getRenderCoords = function (fromOffsetPx, toOffsetPx, display, forward) {\n var isBase = (fromOffsetPx === 0 && toOffsetPx === 0)\n\n if (!this.baseRenderCoords && !isBase) {\n this.calculateBaseRenderCoords(display)\n }\n\n var fromOffsetX = fromOffsetPx * this.fromRightVector.x\n var fromOffsetY = fromOffsetPx * this.fromRightVector.y\n\n var toOffsetX = toOffsetPx * this.toRightVector.x\n var toOffsetY = toOffsetPx * this.toRightVector.y\n\n var fx = this.fromVertex.getRenderX(display) + fromOffsetX\n var fy = this.fromVertex.getRenderY(display) - fromOffsetY\n var fvx = this.fromVector.x\n var fvy = -this.fromVector.y\n\n var tx = this.toVertex.getRenderX(display) + toOffsetX\n var ty = this.toVertex.getRenderY(display) - toOffsetY\n var tvx = -this.toVector.x\n var tvy = this.toVector.y\n\n var coords = []\n\n // append the first ('from') coordinate\n coords.push({\n x: forward ? fx : tx,\n y: forward ? fy : ty\n })\n\n var len = null\n var x1\n var y1\n var x2\n var y2\n\n // determine if this edge has an elbow, i.e. a bend in the middle\n if ((isBase && !this.isStraight()) || (!isBase && this.baseRenderCoords.length ===\n 4)) {\n var isect = Util.rayIntersection(fx, fy, fvx, fvy, tx, ty, tvx, tvy)\n if (isect.intersect) {\n var u = isect.u\n var ex = fx + fvx * u\n var ey = fy + fvy * u\n\n this.ccw = Util.ccw(fx, fy, ex, ey, tx, ty)\n\n // calculate the angle of the arc\n var angleR = this.getElbowAngle()\n\n // calculate the radius of the arc in pixels, taking offsets into consideration\n var rPx = this.getBaseRadiusPx() - this.ccw * (fromOffsetPx + toOffsetPx) /\n 2\n\n // calculate the distance from the elbow to place the arc endpoints in each direction\n var d = rPx * Math.tan(angleR / 2)\n\n // make sure the arc endpoint placement distance is not longer than the either of the\n // elbow-to-edge-endpoint distances\n var l1 = Util.distance(fx, fy, ex, ey)\n var l2 = Util.distance(tx, ty, ex, ey)\n d = Math.min(Math.min(l1, l2), d)\n\n x1 = ex - this.fromVector.x * d\n y1 = ey + this.fromVector.y * d\n\n x2 = ex + this.toVector.x * d\n y2 = ey - this.toVector.y * d\n\n var radius = Util.getRadiusFromAngleChord(angleR, Util.distance(x1, y1,\n x2, y2))\n var arc = angleR * (180 / Math.PI) * (this.ccw < 0 ? 1 : -1)\n\n if (forward) {\n coords.push({\n x: x1,\n y: y1,\n len: Util.distance(fx, fy, x1, y1)\n })\n\n coords.push({\n x: x2,\n y: y2,\n len: angleR * radius,\n arc: arc,\n radius: radius\n })\n\n len = Util.distance(x2, y2, tx, ty)\n } else { // backwards traversal\n coords.push({\n x: x2,\n y: y2,\n len: Util.distance(tx, ty, x2, y2)\n })\n\n coords.push({\n x: x1,\n y: y1,\n len: angleR * radius,\n arc: -arc,\n radius: radius\n })\n\n len = Util.distance(x1, y1, fx, fy)\n }\n }\n }\n\n // if the length wasn't calculated during elbow-creation, do it now\n if (len === null) len = Util.distance(fx, fy, tx, ty)\n\n // append the final ('to') coordinate\n coords.push({\n x: forward ? tx : fx,\n y: forward ? ty : fy,\n len: len\n })\n\n return coords\n}\n\nEdge.prototype.calculateBaseRenderCoords = function (display) {\n this.baseRenderCoords = this.getRenderCoords(0, 0, display, true)\n}\n\nEdge.prototype.isStraight = function () {\n var tol = 0.00001\n return (Math.abs(this.fromVector.x - this.toVector.x) < tol &&\n Math.abs(this.fromVector.y - this.toVector.y) < tol)\n}\n\nEdge.prototype.getBaseRadiusPx = function () {\n return 15\n}\n\nEdge.prototype.getElbowAngle = function () {\n var cx = this.fromVector.x - this.toVector.x\n var cy = this.fromVector.y - this.toVector.y\n\n var c = Math.sqrt(cx * cx + cy * cy) / 2\n\n var theta = Math.asin(c)\n\n return theta * 2\n}\n\nEdge.prototype.getRenderLength = function (display) {\n if (!this.baseRenderCoords) this.calculateBaseRenderCoords(display)\n\n if (!this.renderLength) {\n this.renderLength = 0\n for (var i = 1; i < this.baseRenderCoords.length; i++) {\n this.renderLength += this.baseRenderCoords[i].len\n }\n }\n return this.renderLength\n}\n\n/**\n * Retrieve the coordinate located at a defined percentage along an Edge's length.\n * @param {Number} t - a value between 0 and 1 representing the location of the\n * point to be computed\n * @param {Object[]} coords - the offset coordinates computed for this edge.\n * @param {Display} display\n * @returns {Object} - the coordinate as an {x,y} Object\n */\n\nEdge.prototype.coordAlongEdge = function (t, coords, display) {\n if (!this.baseRenderCoords) {\n this.calculateBaseRenderCoords(display)\n }\n\n if (coords.length !== this.baseRenderCoords.length) {\n return this.coordAlongOffsetEdge(t, coords, display)\n }\n\n // get the length of this edge in screen units using the \"base\" (i.e. un-offset) render coords\n var len = this.getRenderLength()\n\n var loc = t * len // the target distance along the Edge's base geometry\n var cur = 0 // our current location along the edge (in world units)\n\n for (var i = 1; i < this.baseRenderCoords.length; i++) {\n if (loc < cur + this.baseRenderCoords[i].len) {\n var t2 = (loc - cur) / this.baseRenderCoords[i].len\n\n if (coords[i].arc) {\n var r = coords[i].radius\n var theta = Math.PI * coords[i].arc / 180\n var ccw = Util.ccw(coords[0].x, coords[0].y, coords[1].x, coords[1].y,\n coords[2].x, coords[2].y)\n\n return Util.pointAlongArc(coords[1].x, coords[1].y, coords[2].x, coords[2].y, r, theta, ccw, t2)\n } else {\n var dx = coords[i].x - coords[i - 1].x\n var dy = coords[i].y - coords[i - 1].y\n\n return {\n x: coords[i - 1].x + dx * t2,\n y: coords[i - 1].y + dy * t2\n }\n }\n }\n cur += this.baseRenderCoords[i].len\n }\n}\n\nEdge.prototype.coordAlongOffsetEdge = function (t, coords, display) {\n if (!this.baseRenderCoords) this.calculateBaseRenderCoords(display)\n\n var len = 0\n for (var i = 1; i < coords.length; i++) {\n len += coords[i].len\n }\n\n var loc = t * len // the target distance along the Edge's base geometry\n var cur = 0 // our current location along the edge (in world units)\n\n for (i = 1; i < coords.length; i++) {\n if (loc < cur + coords[i].len) {\n var t2 = (loc - cur) / coords[i].len\n\n if (coords[i].arc) { // arc segment\n var r = coords[i].radius\n var theta = Math.PI * coords[i].arc / 180\n var ccw = Util.ccw(coords[0].x, coords[0].y, coords[1].x, coords[1].y,\n coords[2].x, coords[2].y)\n\n return Util.pointAlongArc(coords[1].x, coords[1].y, coords[2].x, coords[2].y, r, theta, ccw, t2)\n } else { // straight segment\n var dx = coords[i].x - coords[i - 1].x\n var dy = coords[i].y - coords[i - 1].y\n\n return {\n x: coords[i - 1].x + dx * t2,\n y: coords[i - 1].y + dy * t2\n }\n }\n }\n cur += coords[i].len\n }\n}\n\nEdge.prototype.clearRenderData = function () {\n this.baseRenderCoords = null\n this.renderLength = null\n}\n\nEdge.prototype.getVector = function (vertex) {\n if (vertex === this.fromVertex) return this.fromVector\n if (vertex === this.toVertex) return this.toVector\n}\n\n/**\n * Gets the vertex opposite another vertex on an edge\n */\n\nEdge.prototype.oppositeVertex = function (vertex) {\n if (vertex === this.toVertex) return this.fromVertex\n if (vertex === this.fromVertex) return this.toVertex\n return null\n}\n\nEdge.prototype.commonVertex = function (edge) {\n if (this.fromVertex === edge.fromVertex || this.fromVertex === edge.toVertex) return this.fromVertex\n if (this.toVertex === edge.fromVertex || this.toVertex === edge.toVertex) return this.toVertex\n return null\n}\n\n/**\n *\n */\n\nEdge.prototype.setPointLabelPosition = function (pos, skip) {\n if (this.fromVertex.point !== skip) this.fromVertex.point.labelPosition = pos\n if (this.toVertex.point !== skip) this.toVertex.point.labelPosition = pos\n\n this.pointArray.forEach(function (point) {\n if (point !== skip) point.labelPosition = pos\n })\n}\n\n/**\n * Determines if this edge is part of a standalone, non-transit path\n * (e.g. a walk/bike/drive-only journey)\n */\n\nEdge.prototype.isNonTransitPath = function () {\n return this.pathSegments.length === 1 && this.pathSegments[0] !== 'TRANSIT' &&\n this.pathSegments[0].path.segments.length === 1\n}\n\n/**\n *\n */\n\nEdge.prototype.toString = function () {\n return 'Edge ' + this.getId() + ' (' + this.fromVertex.toString() + ' to ' +\n this.toVertex.toString() + ')'\n}\n", - "var each = require('component-each')\nvar PriorityQueue = require('priorityqueuejs')\n\nvar Util = require('../util')\n\n/**\n * Expose `EdgeGroup`\n */\n\nmodule.exports = EdgeGroup\n\n/**\n * A group of edges that share the same endpoint vertices\n */\n\nfunction EdgeGroup (fromVertex, toVertex, type) {\n this.fromVertex = fromVertex\n this.toVertex = toVertex\n this.type = type\n this.edges = []\n this.commonPoints = null\n this.worldLength = 0\n}\n\nEdgeGroup.prototype.addEdge = function (edge) {\n this.edges.push(edge)\n edge.edgeGroup = this\n\n // update the groups worldLength\n this.worldLength = Math.max(this.worldLength, edge.getWorldLength())\n\n if (this.commonPoints === null) { // if this is first edge added, initialize group's commonPoint array to include all of edge's points\n this.commonPoints = []\n each(edge.pointArray, function (point) {\n this.commonPoints.push(point)\n }, this)\n } else { // otherwise, update commonPoints array to only include those in added edge\n var newCommonPoints = []\n each(edge.pointArray, function (point) {\n if (this.commonPoints.indexOf(point) !== -1) newCommonPoints.push(point)\n }, this)\n this.commonPoints = newCommonPoints\n }\n}\n\nEdgeGroup.prototype.getWorldLength = function () {\n return this.worldLength\n}\n\nEdgeGroup.prototype.getInternalVertexPQ = function () {\n // create an array of all points on the edge (endpoints and internal)\n var allPoints = ([this.fromVertex.point]).concat(this.commonPoints, [this.toVertex\n .point\n ])\n\n var pq = new PriorityQueue(function (a, b) {\n return a.weight - b.weight\n })\n\n for (var i = 1; i < allPoints.length - 1; i++) {\n var weight = this.getInternalVertexWeight(allPoints, i)\n pq.enq({\n weight: weight,\n point: allPoints[i]\n })\n }\n\n return pq\n}\n\nEdgeGroup.prototype.getInternalVertexWeight = function (pointArray, index) {\n var x1 = pointArray[index - 1].worldX\n var y1 = pointArray[index - 1].worldY\n var x2 = pointArray[index].worldX\n var y2 = pointArray[index].worldY\n var x3 = pointArray[index + 1].worldX\n var y3 = pointArray[index + 1].worldY\n\n // the weighting function is a combination of:\n // - the distances from this internal point to the two adjacent points, normalized for edge length (longer distances are prioritized)\n // - the angle formed by this point and the two adjacent ones ('sharper' angles are prioritized)\n var inDist = Util.distance(x1, y1, x2, y2)\n var outDist = Util.distance(x2, y2, x3, y3)\n var theta = Util.angleFromThreePoints(x1, y1, x2, y2, x3, y3)\n var edgeLen = this.getWorldLength()\n var weight = inDist / edgeLen + outDist / edgeLen + Math.abs(Math.PI - theta) / Math.PI\n\n return weight\n}\n\nEdgeGroup.prototype.hasTransit = function () {\n for (var i = 0; i < this.edges.length; i++) {\n if (this.edges[i].hasTransit()) return true\n }\n return false\n}\n\nEdgeGroup.prototype.isNonTransitPath = function () {\n return (this.edges.length === 1 && this.edges[0].isNonTransitPath())\n}\n\nEdgeGroup.prototype.getTurnPoints = function (maxAngle) {\n var points = []\n maxAngle = maxAngle || 0.75 * Math.PI\n each(this.commonPoints, function (point) {\n if (point.getType() !== 'TURN') return\n if (Math.abs(point.turnAngle) < maxAngle) {\n points.push(point)\n }\n })\n return points\n}\n", - "var d3 = require('d3')\nvar debug = require('debug')('transitive:graph')\nvar each = require('component-each')\n\nvar Edge = require('./edge')\nvar EdgeGroup = require('./edgegroup')\nvar Vertex = require('./vertex')\nvar MultiPoint = require('../point/multipoint')\nvar Util = require('../util')\n\n/**\n * Expose `NetworkGraph`\n */\n\nmodule.exports = NetworkGraph\n\n/**\n * An graph representing the underlying 'wireframe' network\n */\n\nfunction NetworkGraph (network, vertices) {\n this.network = network\n this.edges = []\n this.vertices = []\n\n /**\n * Object mapping groups of edges that share the same two vertices.\n * - Key is string of format A_B, where A and B are vertex IDs and A < B\n * - Value is array of edges\n */\n this.edgeGroups = {}\n\n // Add all base vertices\n for (var i in vertices) this.addVertex(vertices[i], vertices[i].worldX, vertices[i].worldY)\n}\n\n/**\n * Get the bounds of the graph in the graph's internal x/y coordinate space\n *\n * @return [[left, top], [right, bottom]]\n */\n\nNetworkGraph.prototype.bounds = function () {\n var xmax = null\n var xmin = null\n var ymax = null\n var ymin = null\n\n for (var i in this.vertices) {\n var vertex = this.vertices[i]\n xmin = xmin ? Math.min(xmin, vertex.x) : vertex.x\n xmax = xmax ? Math.max(xmax, vertex.x) : vertex.x\n ymin = ymin ? Math.min(ymin, vertex.y) : vertex.y\n ymax = ymax ? Math.max(ymax, vertex.y) : vertex.y\n }\n\n var maxExtent = 20037508.34\n return [\n [xmin || -maxExtent, ymin || -maxExtent],\n [xmax || maxExtent, ymax || maxExtent]\n ]\n}\n\n/**\n * Add Vertex\n */\n\nNetworkGraph.prototype.addVertex = function (point, x, y) {\n if (x === undefined || y === undefined) {\n var xy = Util.latLonToSphericalMercator(point.getLat(), point.getLon())\n x = xy[0]\n y = xy[1]\n }\n var vertex = new Vertex(point, x, y)\n this.vertices.push(vertex)\n return vertex\n}\n\n/**\n * Add Edge\n */\n\nNetworkGraph.prototype.addEdge = function (stops, from, to, segmentType) {\n if (this.vertices.indexOf(from) === -1 || this.vertices.indexOf(to) === -1) {\n debug('Error: Cannot add edge. Graph does not contain vertices.')\n return\n }\n\n var edge = new Edge(stops, from, to)\n this.edges.push(edge)\n from.edges.push(edge)\n to.edges.push(edge)\n\n var groupKey = this.network.transitive.options.groupEdges\n ? this.getEdgeGroupKey(edge, segmentType)\n : edge.getId()\n\n if (!(groupKey in this.edgeGroups)) {\n this.edgeGroups[groupKey] = new EdgeGroup(edge.fromVertex, edge.toVertex,\n segmentType)\n }\n this.edgeGroups[groupKey].addEdge(edge)\n\n return edge\n}\n\nNetworkGraph.prototype.removeEdge = function (edge) {\n // remove from the graph's edge collection\n var edgeIndex = this.edges.indexOf(edge)\n if (edgeIndex !== -1) this.edges.splice(edgeIndex, 1)\n\n // remove from any associated path segment edge lists\n edge.pathSegments.forEach(function (segment) {\n segment.removeEdge(edge)\n })\n\n // remove from the endpoint vertex incidentEdge collections\n edge.fromVertex.removeEdge(edge)\n edge.toVertex.removeEdge(edge)\n}\n\nNetworkGraph.prototype.getEdgeGroup = function (edge) {\n return this.edgeGroups[this.getEdgeGroupKey(edge)]\n}\n\nNetworkGraph.prototype.getEdgeGroupKey = function (edge, segmentType) {\n return edge.fromVertex.getId() < edge.toVertex.getId()\n ? segmentType + '_' + edge.fromVertex.getId() + '_' + edge.toVertex.getId()\n : segmentType + '_' + edge.toVertex.getId() + '_' + edge.fromVertex.getId()\n}\n\nNetworkGraph.prototype.mergeVertices = function (vertexArray) {\n var xTotal = 0\n var yTotal = 0\n\n var vertexGroups = {\n 'STOP': [],\n 'PLACE': [],\n 'TURN': [],\n 'MULTI': []\n }\n vertexArray.forEach(function (vertex) {\n if (vertex.point.getType() in vertexGroups) vertexGroups[vertex.point.getType()].push(vertex)\n })\n\n var mergePoint\n\n // don't merge stops and places, or multiple places:\n if ((vertexGroups.STOP.length > 0 && vertexGroups.PLACE.length > 0) ||\n vertexGroups.PLACE.length > 1 ||\n vertexGroups.MULTI.length > 0) return\n\n // if merging turns with a place, create a new merged vertex around the place\n if (vertexGroups.PLACE.length === 1 && vertexGroups.TURN.length > 0) {\n mergePoint = vertexGroups.PLACE[0].point\n // if merging turns with a single place, create a new merged vertex around the stop\n } else if (vertexGroups.STOP.length === 1 && vertexGroups.TURN.length > 0) {\n mergePoint = vertexGroups.STOP[0].point\n // if merging multiple stops, create a new MultiPoint vertex\n } else if (vertexGroups.STOP.length > 1) {\n mergePoint = new MultiPoint()\n each(vertexGroups.STOP, function (stopVertex) {\n mergePoint.addPoint(stopVertex.point)\n })\n // if merging multiple turns\n } else if (vertexGroups.TURN.length > 1) {\n mergePoint = vertexGroups.TURN[0].point\n }\n\n if (!mergePoint) return\n var mergedVertex = new Vertex(mergePoint, 0, 0)\n\n vertexArray.forEach(function (vertex) {\n xTotal += vertex.x\n yTotal += vertex.y\n\n var edges = []\n each(vertex.edges, function (edge) {\n edges.push(edge)\n })\n\n each(edges, function (edge) {\n if (vertexArray.indexOf(edge.fromVertex) !== -1 && vertexArray.indexOf(\n edge.toVertex) !== -1) {\n this.removeEdge(edge)\n return\n }\n edge.replaceVertex(vertex, mergedVertex)\n mergedVertex.addEdge(edge)\n }, this)\n var index = this.vertices.indexOf(vertex)\n if (index !== -1) this.vertices.splice(index, 1)\n }, this)\n\n mergedVertex.x = xTotal / vertexArray.length\n mergedVertex.y = yTotal / vertexArray.length\n mergedVertex.oldVertices = vertexArray\n\n this.vertices.push(mergedVertex)\n}\n\nNetworkGraph.prototype.sortVertices = function () {\n this.vertices.sort(function (a, b) {\n if (a.point && a.point.getType() === 'PLACE') return -1\n if (b.point && b.point.getType() === 'PLACE') return 1\n\n if (a.point && a.point.getType() === 'MULTI') return -1\n if (b.point && b.point.getType() === 'MULTI') return 1\n\n if (a.point && a.point.getType() === 'STOP') return -1\n if (b.point && b.point.getType() === 'STOP') return 1\n })\n}\n\n/**\n * Get the equivalent edge\n */\n\nNetworkGraph.prototype.getEquivalentEdge = function (pointArray, from, to) {\n for (var e = 0; e < this.edges.length; e++) {\n var edge = this.edges[e]\n if (edge.fromVertex === from && edge.toVertex === to && pointArray.length ===\n edge.pointArray.length && equal(pointArray, edge.pointArray)) {\n return edge\n }\n if (edge.fromVertex === to && edge.toVertex === from && pointArray.length ===\n edge.pointArray.length && equal(pointArray.slice(0).reverse(), edge.pointArray)) {\n return edge\n }\n }\n}\n\n/**\n * Split a specified graph edge around a set of specified split points, where\n * all split points are internal points of the edge to be split. A set of N\n * valid split points will result in N+1 new edges. The original edge is\n * removed from the graph.\n */\n\nNetworkGraph.prototype.splitEdgeAtInternalPoints = function (edge, points) {\n var subEdgePoints = []\n var newEdge\n var newEdgeInfoArr = []\n var fromVertex = edge.fromVertex\n var geomCoords = []\n\n // iterate through the parent edge points, creating new sub-edges as needed\n each(edge.pointArray, function (point, i) {\n if (edge.pointGeom && i < edge.pointGeom.length) {\n geomCoords = geomCoords.concat(edge.pointGeom[i])\n }\n if (points.indexOf(point) !== -1) { // we've reached a split point\n var x = point.worldX\n var y = point.worldY\n var newVertex = point.graphVertex || this.addVertex(point, x, y)\n newVertex.isInternal = true\n newEdge = this.addEdge(subEdgePoints, fromVertex, newVertex, edge.edgeGroup\n .type)\n newEdge.isInternal = true\n newEdge.copyPathSegments(edge)\n newEdgeInfoArr.push({\n graphEdge: newEdge,\n fromVertex: fromVertex\n })\n if (geomCoords.length > 0) newEdge.geomCoords = geomCoords\n\n subEdgePoints = []\n fromVertex = newVertex\n geomCoords = []\n } else { // otherwise, this point becomes an internal point of the new edge currently being created\n subEdgePoints.push(point)\n }\n }, this)\n\n // create the last sub-edge\n newEdge = this.addEdge(subEdgePoints, fromVertex, edge.toVertex, edge.edgeGroup\n .type)\n newEdge.isInternal = true\n newEdge.copyPathSegments(edge)\n if (edge.pointGeom && edge.pointArray.length < edge.pointGeom.length) {\n geomCoords = geomCoords.concat(edge.pointGeom[edge.pointArray.length])\n }\n if (geomCoords.length > 0) newEdge.geomCoords = geomCoords\n\n newEdgeInfoArr.push({\n graphEdge: newEdge,\n fromVertex: fromVertex\n })\n\n // insert the new edge sequence into the affected segments\n each(edge.pathSegments, function (pathSegment) {\n var indexInSegment = pathSegment.getEdgeIndex(edge)\n var forward = pathSegment.edges[indexInSegment].forward\n var index = pathSegment.getEdgeIndex(edge)\n each(forward ? newEdgeInfoArr : newEdgeInfoArr.reverse(), function (edgeInfo) {\n pathSegment.insertEdgeAt(index, edgeInfo.graphEdge, forward ? edgeInfo.fromVertex : edgeInfo.toVertex)\n index++\n })\n })\n\n // remove the original edge from the graph\n this.removeEdge(edge)\n}\n\n/* NetworkGraph.prototype.collapseTransfers = function(threshold) {\n if(!threshold) return;\n this.edges.forEach(function(edge) {\n if (edge.getLength() > threshold ||\n edge.fromVertex.point.containsFromPoint() ||\n edge.fromVertex.point.containsToPoint() ||\n edge.toVertex.point.containsFromPoint() ||\n edge.toVertex.point.containsToPoint()) return;\n //if(edge.fromVertex.point.getType() === 'PLACE' || edge.toVertex.point.getType() === 'PLACE') return;\n var notTransit = true;\n edge.pathSegments.forEach(function(segment) {\n notTransit = notTransit && segment.type !== 'TRANSIT';\n });\n if (notTransit) {\n this.mergeVertices([edge.fromVertex, edge.toVertex]);\n }\n }, this);\n}; */\n\nNetworkGraph.prototype.pruneVertices = function () {\n each(this.vertices, function (vertex) {\n if (vertex.point.containsSegmentEndPoint()) return\n\n var opposites = []\n var pathSegmentBundles = {} // maps pathSegment id list (string) to collection of edges (array)\n\n each(vertex.edges, function (edge) {\n var pathSegmentIds = edge.getPathSegmentIds()\n if (!(pathSegmentIds in pathSegmentBundles)) pathSegmentBundles[pathSegmentIds] = []\n pathSegmentBundles[pathSegmentIds].push(edge)\n var opp = edge.oppositeVertex(vertex)\n if (opposites.indexOf(opp) === -1) opposites.push(opp)\n })\n\n if (opposites.length !== 2) return\n\n each(pathSegmentBundles, function (ids) {\n var edgeArr = pathSegmentBundles[ids]\n if (edgeArr.length === 2) this.mergeEdges(edgeArr[0], edgeArr[1])\n }, this)\n }, this)\n}\n\nNetworkGraph.prototype.mergeEdges = function (edge1, edge2) {\n // check for infinite recursion loop case\n if (edge1.fromVertex === edge2.toVertex && edge2.fromVertex === edge1.toVertex) {\n return\n }\n\n // reverse edges if necessary\n if (edge1.fromVertex === edge2.toVertex) {\n this.mergeEdges(edge2, edge1)\n return\n }\n\n if (edge1.toVertex !== edge2.fromVertex) return // edges cannot be merged\n\n var internalPoints = edge1.pointArray.concat(edge2.pointArray)\n\n var newEdge = this.addEdge(internalPoints, edge1.fromVertex, edge2.toVertex,\n edge1.edgeGroup.type)\n newEdge.pathSegments = edge1.pathSegments\n each(newEdge.pathSegments, function (segment) {\n // var i = segment.graphEdges.indexOf(edge1);\n // segment.graphEdges.splice(i, 0, newEdge);\n var i = segment.getEdgeIndex(edge1)\n segment.insertEdgeAt(i, newEdge, newEdge.fromVertex)\n })\n\n // if both input edges are have coordinate geometry, merge the coords arrays in the new edge\n if (edge1.geomCoords && edge2.geomCoords) {\n newEdge.geomCoords = edge1.geomCoords.concat(edge2.geomCoords.length > 0\n ? edge2.geomCoords.slice(1)\n : [])\n }\n\n debug('merging:')\n debug(edge1)\n debug(edge2)\n this.removeEdge(edge1)\n this.removeEdge(edge2)\n}\n\nNetworkGraph.prototype.snapToGrid = function (cellSize) {\n var coincidenceMap = {}\n this.vertices.forEach(function (vertex) {\n var nx = Math.round(vertex.x / cellSize) * cellSize\n var ny = Math.round(vertex.y / cellSize) * cellSize\n vertex.x = nx\n vertex.y = ny\n\n var key = nx + '_' + ny\n if (!(key in coincidenceMap)) coincidenceMap[key] = [vertex]\n else coincidenceMap[key].push(vertex)\n })\n\n each(coincidenceMap, function (key) {\n var vertexArr = coincidenceMap[key]\n if (vertexArr.length > 1) {\n this.mergeVertices(vertexArr)\n }\n }, this)\n}\n\nNetworkGraph.prototype.calculateGeometry = function (cellSize, angleConstraint) {\n this.edges.forEach(function (edge) {\n edge.calculateGeometry(cellSize, angleConstraint)\n })\n}\n\nNetworkGraph.prototype.resetCoordinates = function () {\n this.vertices.forEach(function (vertex) {\n vertex.x = vertex.origX\n vertex.y = vertex.origY\n })\n}\n\nNetworkGraph.prototype.recenter = function () {\n var xCoords = []\n var yCoords = []\n this.vertices.forEach(function (v) {\n xCoords.push(v.x)\n yCoords.push(v.y)\n })\n\n var mx = d3.median(xCoords)\n var my = d3.median(yCoords)\n\n this.vertices.forEach(function (v) {\n v.x = v.x - mx\n v.y = v.y - my\n })\n}\n\n/** 2D line bundling & offsetting **/\n\nNetworkGraph.prototype.apply2DOffsets = function () {\n this.initComparisons()\n\n var alignmentBundles = {} // maps alignment ID to array of range-bounded bundles on that alignment\n\n var addToBundle = function (rEdge, alignmentId) {\n var bundle\n\n // compute the alignment range of the edge being bundled\n var range = rEdge.graphEdge.getAlignmentRange(alignmentId)\n\n // check if bundles already exist for this alignment\n if (!(alignmentId in alignmentBundles)) { // if not, create new and add to collection\n bundle = new AlignmentBundle()\n bundle.addEdge(rEdge, range.min, range.max)\n alignmentBundles[alignmentId] = [bundle] // new AlignmentBundle();\n } else { // 1 or more bundles currently exist for this alignmentId\n var bundleArr = alignmentBundles[alignmentId]\n\n // see if the segment range overlaps with that of an existing bundle\n for (var i = 0; i < bundleArr.length; i++) {\n if (bundleArr[i].rangeOverlaps(range.min, range.max)) {\n bundleArr[i].addEdge(rEdge, range.min, range.max)\n return\n }\n }\n\n // ..if not, create a new bundle\n bundle = new AlignmentBundle()\n bundle.addEdge(rEdge, range.min, range.max)\n bundleArr.push(bundle)\n }\n }\n\n each(this.edges, function (edge) {\n var fromAlignmentId = edge.getFromAlignmentId()\n var toAlignmentId = edge.getToAlignmentId()\n\n each(edge.renderedEdges, function (rEdge) {\n addToBundle(rEdge, fromAlignmentId)\n addToBundle(rEdge, toAlignmentId)\n })\n })\n\n var bundleSorter = function (a, b) {\n var aId = a.patternIds || a.pathSegmentIds\n var bId = b.patternIds || b.pathSegmentIds\n\n var aVector = a.getAlignmentVector(this.currentAlignmentId)\n var bVector = b.getAlignmentVector(this.currentAlignmentId)\n var isOutward = (Util.isOutwardVector(aVector) && Util.isOutwardVector(\n bVector)) ? 1 : -1\n\n var abCompId = aId + '_' + bId\n if (abCompId in this.bundleComparisons) {\n return isOutward * this.bundleComparisons[abCompId]\n }\n\n var baCompId = bId + '_' + aId\n if (baCompId in this.bundleComparisons) {\n return isOutward * this.bundleComparisons[baCompId]\n }\n\n if (a.route && b.route && a.route.route_type !== b.route.route_type) {\n return a.route.route_type > b.route.route_type ? 1 : -1\n }\n\n var isForward = (a.forward && b.forward) ? 1 : -1\n return isForward * isOutward * (aId < bId ? -1 : 1)\n }.bind(this)\n\n each(alignmentBundles, function (alignmentId) {\n var bundleArr = alignmentBundles[alignmentId]\n each(bundleArr, function (bundle) {\n if (bundle.items.length <= 1) return\n var lw = 1.2\n var bundleWidth = lw * (bundle.items.length - 1)\n\n this.currentAlignmentId = alignmentId\n bundle.items.sort(bundleSorter)\n each(bundle.items, function (rEdge, i) {\n var offset = (-bundleWidth / 2) + i * lw\n if (rEdge.getType() === 'TRANSIT') {\n each(rEdge.patterns, function (pattern) {\n pattern.offsetAlignment(alignmentId, offset)\n })\n } else rEdge.offsetAlignment(alignmentId, offset)\n })\n }, this)\n }, this)\n}\n\n/**\n * Traverses the graph vertex-by-vertex, creating comparisons between all pairs of\n * edges for which a topological relationship can be established.\n */\n\nNetworkGraph.prototype.initComparisons = function () {\n this.bundleComparisons = {}\n\n each(this.vertices, function (vertex) {\n var incidentGraphEdges = vertex.incidentEdges()\n\n var angleREdges = {}\n each(incidentGraphEdges, function (incidentGraphEdge) {\n var angle = (incidentGraphEdge.fromVertex === vertex) ? incidentGraphEdge.fromAngle : incidentGraphEdge.toAngle\n var angleDeg = 180 * angle / Math.PI\n if (!(angleDeg in angleREdges)) angleREdges[angleDeg] = []\n angleREdges[angleDeg] = angleREdges[angleDeg].concat(incidentGraphEdge.renderedEdges)\n })\n\n each(angleREdges, function (angle) {\n var rEdges = angleREdges[angle]\n if (rEdges.length < 2) return\n for (var i = 0; i < rEdges.length - 1; i++) {\n for (var j = i + 1; j < rEdges.length; j++) {\n var re1 = rEdges[i]\n var re2 = rEdges[j]\n\n var opp1 = re1.graphEdge.oppositeVertex(vertex)\n var opp2 = re2.graphEdge.oppositeVertex(vertex)\n\n var ccw = Util.ccw(opp1.x, opp1.y, vertex.x, vertex.y, opp2.x,\n opp2.y)\n\n if (ccw === 0) {\n var s1Ext = re1.findExtension(opp1)\n var s2Ext = re2.findExtension(opp2)\n if (s1Ext) opp1 = s1Ext.graphEdge.oppositeVertex(opp1)\n if (s2Ext) opp2 = s2Ext.graphEdge.oppositeVertex(opp2)\n ccw = Util.ccw(opp1.x, opp1.y, vertex.x, vertex.y, opp2.x, opp2\n .y)\n }\n\n ccw = getInverse(re1, re2, vertex) * ccw\n\n if (ccw > 0) {\n // e1 patterns are 'less' than e2 patterns\n this.storeComparison(re1, re2)\n }\n\n if (ccw < 0) {\n // e2 patterns are 'less' than e2 patterns\n this.storeComparison(re2, re1)\n }\n }\n }\n }, this)\n }, this)\n}\n\nfunction getInverse (s1, s2, vertex) {\n return (\n (s1.graphEdge.toVertex === vertex && s2.graphEdge.toVertex === vertex) ||\n (s1.graphEdge.toVertex === vertex && s2.graphEdge.fromVertex === vertex)\n ) ? -1 : 1\n}\n\nNetworkGraph.prototype.storeComparison = function (s1, s2) {\n var s1Id = s1.patternIds || s1.pathSegmentIds\n var s2Id = s2.patternIds || s2.pathSegmentIds\n debug('storing comparison: ' + s1Id + ' < ' + s2Id)\n this.bundleComparisons[s1Id + '_' + s2Id] = -1\n this.bundleComparisons[s2Id + '_' + s1Id] = 1\n}\n\n/**\n * AlignmentBundle class\n */\n\nfunction AlignmentBundle () {\n this.items = [] // RenderedEdges\n this.min = Number.MAX_VALUE\n this.max = -Number.MAX_VALUE\n}\n\nAlignmentBundle.prototype.addEdge = function (rEdge, min, max) {\n if (this.items.indexOf(rEdge) === -1) {\n this.items.push(rEdge)\n }\n\n this.min = Math.min(this.min, min)\n this.max = Math.max(this.max, max)\n}\n\nAlignmentBundle.prototype.rangeOverlaps = function (min, max) {\n return this.min < max && min < this.max\n}\n\n/**\n * Check if arrays are equal\n */\n\nfunction equal (a, b) {\n if (a.length !== b.length) {\n return false\n }\n\n for (var i in a) {\n if (a[i] !== b[i]) {\n return false\n }\n }\n\n return true\n}\n", - "/**\n * Expose `Vertex`\n */\n\nmodule.exports = Vertex\n\n/**\n * Initialize new Vertex\n *\n * @param {Stop/Place}\n * @param {Number}\n * @param {Number}\n */\n\nvar edgeId = 0\n\nfunction Vertex (point, x, y) {\n this.id = edgeId++\n this.point = point\n this.point.graphVertex = this\n this.x = this.origX = x\n this.y = this.origY = y\n this.edges = []\n}\n\nVertex.prototype.getId = function () {\n return this.id\n}\n\nVertex.prototype.getRenderX = function (display) {\n return display.xScale(this.x) + this.point.placeOffsets.x\n}\n\nVertex.prototype.getRenderY = function (display) {\n return display.yScale(this.y) + this.point.placeOffsets.y\n}\n\n/**\n * Move to new coordinate\n *\n * @param {Number}\n * @param {Number}\n */\n\nVertex.prototype.moveTo = function (x, y) {\n this.x = x\n this.y = y\n /* this.edges.forEach(function (edge) {\n edge.calculateVectors();\n }); */\n}\n\n/**\n * Get array of edges incident to vertex. Allows specification of \"incoming\" edge that will not be included in results\n *\n * @param {Edge}\n */\n\nVertex.prototype.incidentEdges = function (inEdge) {\n var results = []\n this.edges.forEach(function (edge) {\n if (edge !== inEdge) results.push(edge)\n })\n return results\n}\n\n/**\n * Add an edge to the vertex's edge list\n *\n * @param {Edge}\n */\n\nVertex.prototype.addEdge = function (edge) {\n var index = this.edges.indexOf(edge)\n if (index === -1) this.edges.push(edge)\n}\n\n/**\n * Remove an edge from the vertex's edge list\n *\n * @param {Edge}\n */\n\nVertex.prototype.removeEdge = function (edge) {\n var index = this.edges.indexOf(edge)\n if (index !== -1) this.edges.splice(index, 1)\n}\n\nVertex.prototype.toString = function () {\n return 'Vertex ' + this.getId() + ' (' + (this.point ? this.point.toString() : 'no point assigned') + ')'\n}\n", - "/**\n * Dependencies\n */\n\nvar augment = require('augment')\nvar each = require('component-each')\nvar d3 = require('d3')\n\nvar SegmentLabel = require('./segmentlabel')\nvar Util = require('../util')\n\n/**\n * Labeler object\n */\n\nvar Labeler = augment(Object, function () {\n this.constructor = function (transitive) {\n this.transitive = transitive\n this.clear()\n }\n\n this.clear = function (transitive) {\n this.points = []\n }\n\n this.updateLabelList = function (graph) {\n this.points = []\n graph.vertices.forEach(function (vertex) {\n var point = vertex.point\n if (point.getType() === 'PLACE' || point.getType() === 'MULTI' || (\n point.getType() === 'STOP' && point.isSegmentEndPoint)) {\n this.points.push(point)\n }\n }, this)\n\n this.points.sort(function compare (a, b) {\n if (a.containsFromPoint() || a.containsToPoint()) return -1\n if (b.containsFromPoint() || b.containsToPoint()) return 1\n return 0\n })\n }\n\n this.updateQuadtree = function () {\n this.quadtree = d3.geom.quadtree().extent([\n [-this.width, -this.height],\n [this.width * 2, this.height * 2]\n ])([])\n\n this.addPointsToQuadtree()\n // this.addSegmentsToQuadtree();\n }\n\n this.addPointsToQuadtree = function () {\n this.points.forEach(function (point) {\n var mbbox = point.getMarkerBBox()\n if (mbbox) this.addBBoxToQuadtree(point.getMarkerBBox())\n }, this)\n }\n\n this.addSegmentsToQuadtree = function () {\n this.transitive.renderSegments.forEach(function (segment) {\n if (segment.getType() !== 'TRANSIT') return\n\n var lw = this.transitive.style.compute(this.transitive.style.segments['stroke-width'], this.transitive.display, segment)\n lw = parseFloat(lw.substring(0, lw.length - 2), 10) - 2\n\n var x, x1, x2, y, y1, y2\n // debug(segment.toString());\n if (segment.renderData.length === 2) { // basic straight segment\n if (segment.renderData[0].x === segment.renderData[1].x) { // vertical\n x = segment.renderData[0].x - lw / 2\n y1 = segment.renderData[0].y\n y2 = segment.renderData[1].y\n this.addBBoxToQuadtree({\n x: x,\n y: Math.min(y1, y2),\n width: lw,\n height: Math.abs(y1 - y2)\n })\n } else if (segment.renderData[0].y === segment.renderData[1].y) { // horizontal\n x1 = segment.renderData[0].x\n x2 = segment.renderData[1].x\n y = segment.renderData[0].y - lw / 2\n this.addBBoxToQuadtree({\n x: Math.min(x1, x2),\n y: y,\n width: Math.abs(x1 - x2),\n height: lw\n })\n }\n }\n\n if (segment.renderData.length === 4) {\n // basic curved segment\n\n if (segment.renderData[0].x === segment.renderData[1].x) { // vertical first\n x = segment.renderData[0].x - lw / 2\n y1 = segment.renderData[0].y\n y2 = segment.renderData[3].y\n this.addBBoxToQuadtree({\n x: x,\n y: Math.min(y1, y2),\n width: lw,\n height: Math.abs(y1 - y2)\n })\n\n x1 = segment.renderData[0].x\n x2 = segment.renderData[3].x\n y = segment.renderData[3].y - lw / 2\n this.addBBoxToQuadtree({\n x: Math.min(x1, x2),\n y: y,\n width: Math.abs(x1 - x2),\n height: lw\n })\n } else if (segment.renderData[0].y === segment.renderData[1].y) { // horiz first\n x1 = segment.renderData[0].x\n x2 = segment.renderData[3].x\n y = segment.renderData[0].y - lw / 2\n this.addBBoxToQuadtree({\n x: Math.min(x1, x2),\n y: y,\n width: Math.abs(x1 - x2),\n height: lw\n })\n\n x = segment.renderData[3].x - lw / 2\n y1 = segment.renderData[0].y\n y2 = segment.renderData[3].y\n this.addBBoxToQuadtree({\n x: x,\n y: Math.min(y1, y2),\n width: lw,\n height: Math.abs(y1 - y2)\n })\n }\n }\n }, this)\n }\n\n this.addBBoxToQuadtree = function (bbox) {\n if (bbox.x + bbox.width / 2 < 0 || bbox.x - bbox.width / 2 > this.width ||\n bbox.y + bbox.height / 2 < 0 || bbox.y - bbox.height / 2 > this.height\n ) return\n\n this.quadtree.add([bbox.x + bbox.width / 2, bbox.y + bbox.height / 2,\n bbox\n ])\n\n this.maxBBoxWidth = Math.max(this.maxBBoxWidth, bbox.width)\n this.maxBBoxHeight = Math.max(this.maxBBoxHeight, bbox.height)\n }\n\n this.doLayout = function () {\n this.width = this.transitive.el.clientWidth\n this.height = this.transitive.el.clientHeight\n\n this.maxBBoxWidth = 0\n this.maxBBoxHeight = 0\n\n this.updateQuadtree()\n\n var labeledSegments = this.placeSegmentLabels()\n var labeledPoints = this.placePointLabels()\n\n return {\n segments: labeledSegments,\n points: labeledPoints\n }\n }\n\n this.placeSegmentLabels = function () {\n each(this.segmentLabels, function (label) {\n label.clear()\n })\n this.segmentLabels = []\n this.placedLabelKeys = []\n\n // collect the bus RenderSegments\n var busRSegments = []\n each(this.transitive.network.paths, function (path) {\n each(path.getRenderedSegments(), function (rSegment) {\n if (rSegment.type === 'TRANSIT' && rSegment.mode === 3) busRSegments.push(rSegment)\n })\n }, this)\n\n var edgeGroups = []\n each(this.transitive.network.paths, function (path) {\n each(path.segments, function (segment) {\n if (segment.type === 'TRANSIT' && segment.getMode() === 3) {\n edgeGroups = edgeGroups.concat(segment.getLabelEdgeGroups())\n }\n })\n }, this)\n\n // iterate through the sequence collection, labeling as necessary\n // each(busRSegments, function(rSegment) {\n each(edgeGroups, function (edgeGroup) {\n this.currentGroup = edgeGroup\n // get the array of label strings to be places (typically the unique route short names)\n this.labelTextArray = edgeGroup.getLabelTextArray()\n\n // create the initial label for placement\n this.labelTextIndex = 0\n\n var label = this.getNextLabel() // this.constructSegmentLabel(rSegment, labelTextArray[labelTextIndex]);\n if (!label) return\n\n // iterate through potential anchor locations, attempting placement at each one\n var labelAnchors = edgeGroup.getLabelAnchors(this.transitive.display,\n label.textHeight * 1.5)\n for (var i = 0; i < labelAnchors.length; i++) {\n label.labelAnchor = labelAnchors[i]\n\n // do not consider this anchor if it is out of the display range\n if (!this.transitive.display.isInRange(label.labelAnchor.x,\n label.labelAnchor.y)) continue\n\n // check for conflicts with existing placed elements\n var bbox = label.getBBox()\n var conflicts = this.findOverlaps(label, bbox)\n\n if (conflicts.length === 0) {\n // if no conflicts\n\n // place the current label\n this.segmentLabels.push(label)\n this.quadtree.add([label.labelAnchor.x, label.labelAnchor.y,\n label\n ])\n // debug('placing seg label for ' + label.labelText);\n\n label = this.getNextLabel()\n if (!label) break\n }\n } // end of anchor iteration loop\n }, this) // end of sequence iteration loop\n }\n\n this.getNextLabel = function () {\n while (this.labelTextIndex < this.labelTextArray.length) {\n var labelText = this.labelTextArray[this.labelTextIndex]\n var key = this.currentGroup.edgeIds + '_' + labelText\n if (this.placedLabelKeys.indexOf(key) !== -1) {\n this.labelTextIndex++\n continue\n }\n var label = this.constructSegmentLabel(this.currentGroup.renderedSegment,\n labelText)\n this.placedLabelKeys.push(key)\n this.labelTextIndex++\n return label\n }\n return null\n }\n\n this.constructSegmentLabel = function (segment, labelText) {\n var label = new SegmentLabel(segment, labelText)\n var styler = this.transitive.styler\n label.fontFamily = styler.compute(styler.labels['font-family'], this.transitive.display, {\n segment: segment\n })\n label.fontSize = styler.compute(styler.labels['font-size'], this.transitive.display, {\n segment: segment\n })\n var textBBox = Util.getTextBBox(labelText, {\n 'font-size': label.fontSize,\n 'font-family': label.fontFamily\n })\n label.textWidth = textBBox.width\n label.textHeight = textBBox.height\n label.computeContainerDimensions()\n\n return label\n }\n\n this.placePointLabels = function () {\n var styler = this.transitive.styler\n\n var labeledPoints = []\n\n this.points.forEach(function (point) {\n var labelText = point.label.getText()\n point.label.fontFamily = styler.compute(styler.labels['font-family'],\n this.transitive\n .display, {\n point: point\n })\n point.label.fontSize = styler.compute(styler.labels['font-size'],\n this.transitive\n .display, {\n point: point\n })\n var textBBox = Util.getTextBBox(labelText, {\n 'font-size': point.label.fontSize,\n 'font-family': point.label.fontFamily\n })\n point.label.textWidth = textBBox.width\n point.label.textHeight = textBBox.height\n\n var orientations = styler.compute(styler.labels.orientations, this.transitive\n .display, {\n point: point\n })\n\n var placedLabel = false\n for (var i = 0; i < orientations.length; i++) {\n point.label.setOrientation(orientations[i])\n if (!point.focused) continue\n\n if (!point.label.labelAnchor) continue\n\n var lx = point.label.labelAnchor.x\n var ly = point.label.labelAnchor.y\n\n // do not place label if out of range\n if (lx <= 0 || ly <= 0 || lx >= this.width || ly > this.height) continue\n\n var labelBBox = point.label.getBBox()\n\n var overlaps = this.findOverlaps(point.label, labelBBox)\n\n // do not place label if it overlaps with others\n if (overlaps.length > 0) continue\n\n // if we reach this point, the label is good to place\n\n point.label.setVisibility(true)\n labeledPoints.push(point)\n\n this.quadtree.add([labelBBox.x + labelBBox.width / 2, labelBBox.y +\n labelBBox.height / 2, point.label\n ])\n\n this.maxBBoxWidth = Math.max(this.maxBBoxWidth, labelBBox.width)\n this.maxBBoxHeight = Math.max(this.maxBBoxHeight, labelBBox.height)\n\n placedLabel = true\n break // do not consider any other orientations after places\n } // end of orientation loop\n\n // if label not placed at all, hide the element\n if (!placedLabel) {\n point.label.setVisibility(false)\n }\n }, this)\n return labeledPoints\n }\n\n this.findOverlaps = function (label, labelBBox) {\n var minX = labelBBox.x - this.maxBBoxWidth / 2\n var minY = labelBBox.y - this.maxBBoxHeight / 2\n var maxX = labelBBox.x + labelBBox.width + this.maxBBoxWidth / 2\n var maxY = labelBBox.y + labelBBox.height + this.maxBBoxHeight / 2\n // debug('findOverlaps %s,%s %s,%s', minX,minY,maxX,maxY);\n\n var matchItems = []\n this.quadtree.visit(function (node, x1, y1, x2, y2) {\n var p = node.point\n if ((p) && (p[0] >= minX) && (p[0] < maxX) && (p[1] >= minY) && (p[1] < maxY) && label.intersects(p[2])) {\n matchItems.push(p[2])\n }\n return x1 > maxX || y1 > maxY || x2 < minX || y2 < minY\n })\n return matchItems\n }\n\n this.findNearbySegmentLabels = function (label, x, y, buffer) {\n var minX = x - buffer\n var minY = y - buffer\n var maxX = x + buffer\n var maxY = y + buffer\n // debug('findNearby %s,%s %s,%s', minX,minY,maxX,maxY);\n\n var matchItems = []\n this.quadtree.visit(function (node, x1, y1, x2, y2) {\n var p = node.point\n if ((p) && (p[0] >= minX) && (p[0] < maxX) && (p[1] >= minY) && (p[1] < maxY) && (p[2].parent) && (label.parent.patternIds === p[2].parent.patternIds)) {\n matchItems.push(p[2])\n }\n return x1 > maxX || y1 > maxY || x2 < minX || y2 < minY\n })\n return matchItems\n }\n})\n\n/**\n * Expose `Labeler`\n */\n\nmodule.exports = Labeler\n", - "/**\n * Dependencies\n */\n\nvar augment = require('augment')\n\n/**\n * Label object\n */\n\nvar Label = augment(Object, function () {\n this.constructor = function (parent) {\n this.parent = parent\n this.sortableType = 'LABEL'\n }\n\n this.getText = function () {\n if (!this.labelText) this.labelText = this.initText()\n return this.labelText\n }\n\n this.initText = function () {\n return this.parent.getName()\n }\n\n this.render = function (display) {}\n\n this.refresh = function (display) {}\n\n this.setVisibility = function (visibility) {\n if (this.svgGroup) this.svgGroup.attr('visibility', visibility ? 'visible' : 'hidden')\n }\n\n this.getBBox = function () {\n return null\n }\n\n this.intersects = function (obj) {\n return null\n }\n\n this.intersectsBBox = function (bbox) {\n var thisBBox = this.getBBox(this.orientation)\n var r = (thisBBox.x <= bbox.x + bbox.width &&\n bbox.x <= thisBBox.x + thisBBox.width &&\n thisBBox.y <= bbox.y + bbox.height &&\n bbox.y <= thisBBox.y + thisBBox.height)\n return r\n }\n\n this.isFocused = function () {\n return this.parent.isFocused()\n }\n\n this.getZIndex = function () {\n return 1000000\n }\n})\n\n/**\n * Expose `Label`\n */\n\nmodule.exports = Label\n", - "/**\n * Dependencies\n */\n\nvar each = require('component-each')\n\n/**\n * Expose `LabelEdgeGroup`\n */\n\nmodule.exports = LabelEdgeGroup\n\n/**\n *\n */\n\nfunction LabelEdgeGroup (renderedSegment) {\n this.renderedSegment = renderedSegment\n this.renderedEdges = []\n}\n\nLabelEdgeGroup.prototype.addEdge = function (rEdge) {\n this.renderedEdges.push(rEdge)\n this.edgeIds = !this.edgeIds ? rEdge.getId() : this.edgeIds + ',' + rEdge.getId()\n}\n\nLabelEdgeGroup.prototype.getLabelTextArray = function () {\n var textArray = []\n each(this.renderedSegment.pathSegment.getPatterns(), function (pattern) {\n var shortName = pattern.route.route_short_name\n if (textArray.indexOf(shortName) === -1) textArray.push(shortName)\n })\n return textArray\n}\n\nLabelEdgeGroup.prototype.getLabelAnchors = function (display, spacing) {\n var labelAnchors = []\n var renderLen = this.getRenderLength(display)\n var anchorCount = Math.floor(renderLen / spacing)\n var pctSpacing = spacing / renderLen\n\n for (var i = 0; i < anchorCount; i++) {\n var t = (i % 2 === 0)\n ? 0.5 + (i / 2) * pctSpacing\n : 0.5 - ((i + 1) / 2) * pctSpacing\n var coord = this.coordAlongRenderedPath(t, display)\n if (coord) labelAnchors.push(coord)\n }\n\n return labelAnchors\n}\n\nLabelEdgeGroup.prototype.coordAlongRenderedPath = function (t, display) {\n var renderLen = this.getRenderLength(display)\n var loc = t * renderLen\n\n var cur = 0\n for (var i = 0; i < this.renderedEdges.length; i++) {\n var rEdge = this.renderedEdges[i]\n var edgeRenderLen = rEdge.graphEdge.getRenderLength(display)\n if (loc <= cur + edgeRenderLen) {\n var t2 = (loc - cur) / edgeRenderLen\n return rEdge.graphEdge.coordAlongEdge(t2, rEdge.renderData, display)\n }\n cur += edgeRenderLen\n }\n}\n\nLabelEdgeGroup.prototype.getRenderLength = function (display) {\n if (!this.renderLength) {\n this.renderLength = 0\n each(this.renderedEdges, function (rEdge) {\n this.renderLength += rEdge.graphEdge.getRenderLength(display)\n }, this)\n }\n return this.renderLength\n}\n", - "/**\n * Dependencies\n */\n\nvar augment = require('augment')\n\nvar Label = require('./label')\n\n/**\n * Label object\n */\n\nvar PointLabel = augment(Label, function (base) {\n this.constructor = function (parent) {\n base.constructor.call(this, parent)\n\n this.labelAngle = 0\n this.labelPosition = 1\n }\n\n this.initText = function () {\n return this.parent.getName()\n }\n\n this.render = function (display) {\n this.svgGroup = display.svg.append('g') // this.parent.labelSvg;\n this.svgGroup\n .attr('class', 'transitive-sortable')\n .datum({\n owner: this,\n sortableType: 'POINT_LABEL'\n })\n\n var typeStr = this.parent.getType().toLowerCase()\n\n this.mainLabel = this.svgGroup.append('text')\n .datum({\n owner: this\n })\n .attr('id', 'transitive-' + typeStr + '-label-' + this.parent.getId())\n .text(this.getText())\n .attr('font-size', this.fontSize)\n .attr('font-family', this.fontFamily)\n .attr('class', 'transitive-' + typeStr + '-label')\n }\n\n this.refresh = function (display) {\n if (!this.labelAnchor) return\n\n if (!this.svgGroup) this.render(display)\n\n this.svgGroup\n .attr('text-anchor', this.labelPosition > 0 ? 'start' : 'end')\n .attr('transform', function (d, i) {\n return 'translate(' + this.labelAnchor.x + ',' + this.labelAnchor\n .y + ')'\n }.bind(this))\n\n this.mainLabel\n .attr('transform', function (d, i) {\n return 'rotate(' + this.labelAngle + ', 0, 0)'\n }.bind(this))\n }\n\n this.setOrientation = function (orientation) {\n this.orientation = orientation\n\n var markerBBox = this.parent.getMarkerBBox()\n if (!markerBBox) return\n\n var x, y\n var offset = 5\n\n if (orientation === 'E') {\n x = markerBBox.x + markerBBox.width + offset\n y = markerBBox.y + markerBBox.height / 2\n this.labelPosition = 1\n this.labelAngle = 0\n } else if (orientation === 'W') {\n x = markerBBox.x - offset\n y = markerBBox.y + markerBBox.height / 2\n this.labelPosition = -1\n this.labelAngle = 0\n } else if (orientation === 'NE') {\n x = markerBBox.x + markerBBox.width + offset\n y = markerBBox.y - offset\n this.labelPosition = 1\n this.labelAngle = -45\n } else if (orientation === 'SE') {\n x = markerBBox.x + markerBBox.width + offset\n y = markerBBox.y + markerBBox.height + offset\n this.labelPosition = 1\n this.labelAngle = 45\n } else if (orientation === 'NW') {\n x = markerBBox.x - offset\n y = markerBBox.y - offset\n this.labelPosition = -1\n this.labelAngle = 45\n } else if (orientation === 'SW') {\n x = markerBBox.x - offset\n y = markerBBox.y + markerBBox.height + offset\n this.labelPosition = -1\n this.labelAngle = -45\n } else if (orientation === 'N') {\n x = markerBBox.x + markerBBox.width / 2\n y = markerBBox.y - offset\n this.labelPosition = 1\n this.labelAngle = -90\n } else if (orientation === 'S') {\n x = markerBBox.x + markerBBox.width / 2\n y = markerBBox.y + markerBBox.height + offset\n this.labelPosition = -1\n this.labelAngle = -90\n }\n\n this.labelAnchor = {\n x: x,\n y: y\n }\n }\n\n this.getBBox = function () {\n if (this.orientation === 'E') {\n return {\n x: this.labelAnchor.x,\n y: this.labelAnchor.y - this.textHeight,\n width: this.textWidth,\n height: this.textHeight\n }\n }\n\n if (this.orientation === 'W') {\n return {\n x: this.labelAnchor.x - this.textWidth,\n y: this.labelAnchor.y - this.textHeight,\n width: this.textWidth,\n height: this.textHeight\n }\n }\n\n if (this.orientation === 'N') {\n return {\n x: this.labelAnchor.x - this.textHeight,\n y: this.labelAnchor.y - this.textWidth,\n width: this.textHeight,\n height: this.textWidth\n }\n }\n\n if (this.orientation === 'S') {\n return {\n x: this.labelAnchor.x - this.textHeight,\n y: this.labelAnchor.y,\n width: this.textHeight,\n height: this.textWidth\n }\n }\n\n var bboxSide = this.textWidth * Math.sqrt(2) / 2\n\n if (this.orientation === 'NE') {\n return {\n x: this.labelAnchor.x,\n y: this.labelAnchor.y - bboxSide,\n width: bboxSide,\n height: bboxSide\n }\n }\n\n if (this.orientation === 'SE') {\n return {\n x: this.labelAnchor.x,\n y: this.labelAnchor.y,\n width: bboxSide,\n height: bboxSide\n }\n }\n\n if (this.orientation === 'NW') {\n return {\n x: this.labelAnchor.x - bboxSide,\n y: this.labelAnchor.y - bboxSide,\n width: bboxSide,\n height: bboxSide\n }\n }\n\n if (this.orientation === 'SW') {\n return {\n x: this.labelAnchor.x - bboxSide,\n y: this.labelAnchor.y,\n width: bboxSide,\n height: bboxSide\n }\n }\n }\n\n this.intersects = function (obj) {\n if (obj instanceof Label) {\n // todo: handle label-label intersection for diagonally placed labels separately\n return this.intersectsBBox(obj.getBBox())\n } else if (obj.x && obj.y && obj.width && obj.height) {\n return this.intersectsBBox(obj)\n }\n\n return false\n }\n\n this.runFocusTransition = function (display, callback) {\n if (this.mainLabel) {\n if (this.parent.isFocused()) this.setVisibility(true)\n this.mainLabel.transition()\n .style('opacity', this.parent.isFocused() ? 1 : 0)\n .call(callback)\n }\n }\n})\n\n/**\n * Expose `PointLabel`\n */\n\nmodule.exports = PointLabel\n", - "/**\n * Dependencies\n */\n\nvar augment = require('augment')\n\nvar Label = require('./label')\n\n/**\n * SegmentLabel object\n */\n\nvar SegmentLabel = augment(Label, function (base) {\n this.constructor = function (parent, text) {\n base.constructor.call(this, parent)\n this.labelText = text\n }\n\n /* this.initText = function() {\n return this.parent.patterns[0].route.route_short_name;\n }; */\n\n this.render = function (display) {\n this.svgGroup = this.parent.labelSvg.append('g')\n .attr('class', 'transitive-sortable')\n .datum({\n owner: this,\n sortableType: 'LABEL'\n })\n\n var padding = this.getPadding()\n\n this.computeContainerDimensions()\n\n this.containerSvg = this.svgGroup.append('rect')\n .datum(this) // { segment: this.parent })\n .attr({\n width: this.containerWidth,\n height: this.containerHeight\n })\n .attr('id', 'transitive-segment-label-container-' + this.parent.getId())\n .text(this.getText())\n .attr('class', 'transitive-segment-label-container')\n\n this.textSvg = this.svgGroup.append('text')\n .datum(this) // { segment: this.parent })\n .attr('id', 'transitive-segment-label-' + this.parent.getId())\n .text(this.getText())\n .attr('class', 'transitive-segment-label')\n .attr('font-size', this.fontSize)\n .attr('font-family', this.fontFamily)\n .attr('transform', function (d, i) {\n return 'translate(' + padding + ', ' + (this.textHeight -\n padding * 2) + ')'\n }.bind(this))\n }\n\n this.refresh = function (display) {\n if (!this.labelAnchor) return\n\n if (!this.svgGroup) this.render(display)\n\n this.svgGroup\n .attr('transform', function (d, i) {\n var tx = (this.labelAnchor.x - this.containerWidth / 2)\n var ty = (this.labelAnchor.y - this.containerHeight / 2)\n return 'translate(' + tx + ',' + ty + ')'\n }.bind(this))\n }\n\n this.getPadding = function () {\n return this.textHeight * 0.1\n }\n\n this.computeContainerDimensions = function () {\n this.containerWidth = this.textWidth + this.getPadding() * 2\n this.containerHeight = this.textHeight\n }\n\n this.getBBox = function () {\n return {\n x: this.labelAnchor.x - this.containerWidth / 2,\n y: this.labelAnchor.y - this.containerHeight / 2,\n width: this.containerWidth,\n height: this.containerHeight\n }\n }\n\n this.intersects = function (obj) {\n if (obj instanceof Label) {\n // todo: handle label-label intersection for diagonally placed labels separately\n return this.intersectsBBox(obj.getBBox())\n } else if (obj.x && obj.y && obj.width && obj.height) {\n return this.intersectsBBox(obj)\n }\n\n return false\n }\n\n this.clear = function () {\n this.labelAnchor = null\n if (this.svgGroup) {\n this.svgGroup.remove()\n this.svgGroup = null\n }\n }\n})\n\n/**\n * Expose `SegmentLabel`\n */\n\nmodule.exports = SegmentLabel\n", - "var augment = require('augment')\nvar each = require('component-each')\n\nvar PointLabel = require('../labeler/pointlabel')\n\nvar Point = augment(Object, function () {\n this.constructor = function (data) {\n for (var key in data) {\n this[key] = data[key]\n }\n\n this.paths = []\n this.renderData = []\n\n this.label = new PointLabel(this)\n this.renderLabel = true\n\n this.focused = true\n this.sortableType = 'POINT'\n\n this.placeOffsets = {\n x: 0,\n y: 0\n }\n\n this.zIndex = 10000\n }\n\n /**\n * Get unique ID for point -- must be defined by subclass\n */\n\n this.getId = function () {}\n\n this.getElementId = function () {\n return this.getType().toLowerCase() + '-' + this.getId()\n }\n\n /**\n * Get Point type -- must be defined by subclass\n */\n\n this.getType = function () {}\n\n /**\n * Get Point name\n */\n\n this.getName = function () {\n return this.getType() + ' point (ID=' + this.getId() + ')'\n }\n\n /**\n * Get latitude\n */\n\n this.getLat = function () {\n return 0\n }\n\n /**\n * Get longitude\n */\n\n this.getLon = function () {\n return 0\n }\n\n this.containsSegmentEndPoint = function () {\n return false\n }\n\n this.containsBoardPoint = function () {\n return false\n }\n\n this.containsAlightPoint = function () {\n return false\n }\n\n this.containsTransferPoint = function () {\n return false\n }\n\n this.getPatterns = function () {\n return []\n }\n\n /**\n * Draw the point\n *\n * @param {Display} display\n */\n\n this.render = function (display) {\n this.label.svgGroup = null\n }\n\n /**\n * Refresh a previously drawn point\n *\n * @param {Display} display\n */\n\n this.refresh = function (display) {}\n\n this.addRenderData = function () {}\n\n this.clearRenderData = function () {}\n\n this.containsFromPoint = function () {\n return false\n }\n\n this.containsToPoint = function () {\n return false\n }\n\n this.initSvg = function (display) {\n // set up the main svg group for this stop\n this.svgGroup = display.svg.append('g')\n .attr('id', 'transitive-' + this.getType().toLowerCase() + '-' + this\n .getId())\n // .attr('class', 'transitive-sortable')\n .datum(this)\n\n this.markerSvg = this.svgGroup.append('g')\n this.labelSvg = this.svgGroup.append('g')\n }\n\n //* * Shared geom utility functions **//\n\n this.constructMergedMarker = function (display) {\n var dataArray = this.getRenderDataArray()\n var xValues = []\n var yValues = []\n dataArray.forEach(function (data) {\n var x = data.x // display.xScale(data.x) + data.offsetX;\n var y = data.y // display.yScale(data.y) - data.offsetY;\n xValues.push(x)\n yValues.push(y)\n })\n var minX = Math.min.apply(Math, xValues)\n var minY = Math.min.apply(Math, yValues)\n var maxX = Math.max.apply(Math, xValues)\n var maxY = Math.max.apply(Math, yValues)\n\n // retrieve marker type and radius from the styler\n var markerType = display.styler.compute(display.styler.stops_merged['marker-type'], display, {\n owner: this\n })\n var stylerRadius = display.styler.compute(display.styler.stops_merged.r, display, {\n owner: this\n })\n\n var width\n var height\n var r\n\n // if this is a circle marker w/ a styler-defined fixed radius, use that\n if (markerType === 'circle' && stylerRadius) {\n width = height = stylerRadius * 2\n r = stylerRadius\n // otherwise, this is a dynamically-sized marker\n } else {\n var dx = maxX - minX\n var dy = maxY - minY\n\n var markerPadding = display.styler.compute(display.styler.stops_merged['marker-padding'], display, {\n owner: this\n }) || 0\n\n var patternRadius = display.styler.compute(display.styler[this.patternStylerKey].r, display, {\n owner: this\n })\n r = parseFloat(patternRadius) + markerPadding\n\n if (markerType === 'circle') {\n width = height = Math.max(dx, dy) + 2 * r\n r = width / 2\n } else {\n width = dx + 2 * r\n height = dy + 2 * r\n if (markerType === 'rectangle') r = 0\n }\n }\n\n return {\n x: (minX + maxX) / 2 - width / 2,\n y: (minY + maxY) / 2 - height / 2,\n width: width,\n height: height,\n rx: r,\n ry: r\n }\n }\n\n this.initMarkerData = function (display) {\n if (this.getType() !== 'STOP' && this.getType() !== 'MULTI') return\n\n this.mergedMarkerData = this.constructMergedMarker(display)\n\n this.placeOffsets = {\n x: 0,\n y: 0\n }\n if (this.adjacentPlace) {\n var placeR = display.styler.compute(display.styler.places.r, display, {\n owner: this.adjacentPlace\n })\n\n var placeX = display.xScale(this.adjacentPlace.worldX)\n var placeY = display.yScale(this.adjacentPlace.worldY)\n\n var thisR = this.mergedMarkerData.width / 2\n var thisX = this.mergedMarkerData.x + thisR\n var thisY = this.mergedMarkerData.y + thisR\n\n var dx = thisX - placeX\n var dy = thisY - placeY\n var dist = Math.sqrt(dx * dx + dy * dy)\n\n if (placeR + thisR > dist) {\n var f = (placeR + thisR) / dist\n this.placeOffsets = {\n x: (dx * f) - dx,\n y: (dy * f) - dy\n }\n\n this.mergedMarkerData.x += this.placeOffsets.x\n this.mergedMarkerData.y += this.placeOffsets.y\n\n each(this.graphVertex.incidentEdges(), function (edge) {\n each(edge.renderSegments, function (segment) {\n segment.refreshRenderData(display)\n })\n })\n }\n }\n }\n\n this.refreshLabel = function (display) {\n if (!this.renderLabel) return\n this.label.refresh(display)\n }\n\n this.getMarkerBBox = function () {\n return this.markerSvg.node().getBBox()\n }\n\n this.setFocused = function (focused) {\n this.focused = focused\n }\n\n this.isFocused = function () {\n return (this.focused === true)\n }\n\n this.runFocusTransition = function (display, callback) {}\n\n this.setAllPatternsFocused = function () {}\n\n this.getZIndex = function () {\n return this.zIndex\n }\n\n this.getAverageCoord = function () {\n var dataArray = this.getRenderDataArray()\n\n var xTotal = 0\n var yTotal = 0\n each(dataArray, function (data) {\n xTotal += data.x\n yTotal += data.y\n })\n\n return {\n x: xTotal / dataArray.length,\n y: yTotal / dataArray.length\n }\n }\n\n this.hasRenderData = function () {\n var dataArray = this.getRenderDataArray()\n return (dataArray && dataArray.length > 0)\n }\n\n this.makeDraggable = function (transitive) {}\n\n this.toString = function () {\n return this.getType() + ' point: ' + this.getId() + ' (' + this.getName() +\n ')'\n }\n})\n\n/**\n * Expose `Point`\n */\n\nmodule.exports = Point\n", - "/**\n * Dependencies\n */\n\nvar augment = require('augment')\nvar each = require('component-each')\n\nvar Point = require('./index')\n\n/**\n * MultiPoint: a Point subclass representing a collection of multiple points\n * that have been merged into one for display purposes.\n */\n\nvar MultiPoint = augment(Point, function (base) {\n this.constructor = function (pointArray) {\n base.constructor.call(this)\n this.points = []\n if (pointArray) {\n pointArray.forEach(function (point) {\n this.addPoint(point)\n }, this)\n }\n this.renderData = []\n this.id = 'multi'\n this.toPoint = this.fromPoint = null\n\n this.patternStylerKey = 'multipoints_pattern'\n }\n\n /**\n * Get id\n */\n\n this.getId = function () {\n return this.id\n }\n\n /**\n * Get type\n */\n\n this.getType = function () {\n return 'MULTI'\n }\n\n this.getName = function () {\n if (this.fromPoint) return this.fromPoint.getName()\n if (this.toPoint) return this.toPoint.getName()\n var shortest = null\n this.points.forEach(function (point) {\n if (point.getType() === 'TURN') return\n if (!shortest || point.getName().length < shortest.length) shortest = point.getName()\n })\n\n return shortest\n }\n\n this.containsSegmentEndPoint = function () {\n for (var i = 0; i < this.points.length; i++) {\n if (this.points[i].containsSegmentEndPoint()) return true\n }\n return false\n }\n\n this.containsBoardPoint = function () {\n for (var i = 0; i < this.points.length; i++) {\n if (this.points[i].containsBoardPoint()) return true\n }\n return false\n }\n\n this.containsAlightPoint = function () {\n for (var i = 0; i < this.points.length; i++) {\n if (this.points[i].containsAlightPoint()) return true\n }\n return false\n }\n\n this.containsTransferPoint = function () {\n for (var i = 0; i < this.points.length; i++) {\n if (this.points[i].containsTransferPoint()) return true\n }\n return false\n }\n\n this.containsFromPoint = function () {\n return (this.fromPoint !== null)\n }\n\n this.containsToPoint = function () {\n return (this.toPoint !== null)\n }\n\n this.getPatterns = function () {\n var patterns = []\n\n this.points.forEach(function (point) {\n if (!point.patterns) return\n point.patterns.forEach(function (pattern) {\n if (patterns.indexOf(pattern) === -1) patterns.push(pattern)\n })\n })\n\n return patterns\n }\n\n this.addPoint = function (point) {\n if (this.points.indexOf(point) !== -1) return\n this.points.push(point)\n this.id += '-' + point.getId()\n if (point.containsFromPoint()) { // getType() === 'PLACE' && point.getId() === 'from') {\n this.fromPoint = point\n }\n if (point.containsToPoint()) { // getType() === 'PLACE' && point.getId() === 'to') {\n this.toPoint = point\n }\n this.calcWorldCoords()\n }\n\n this.calcWorldCoords = function () {\n var tx = 0\n var ty = 0\n each(this.points, function (point) {\n tx += point.worldX\n ty += point.worldY\n })\n\n this.worldX = tx / this.points.length\n this.worldY = ty / this.points.length\n }\n\n /**\n * Add render data\n *\n * @param {Object} stopInfo\n */\n\n this.addRenderData = function (pointInfo) {\n if (pointInfo.offsetX !== 0 || pointInfo.offsetY !== 0) this.hasOffsetPoints = true\n this.renderData.push(pointInfo)\n }\n\n this.clearRenderData = function () {\n this.hasOffsetPoints = false\n this.renderData = []\n }\n\n /**\n * Draw a multipoint\n *\n * @param {Display} display\n */\n\n this.render = function (display) {\n base.render.call(this, display)\n\n if (!this.renderData) return\n\n // set up the main svg group for this stop\n this.initSvg(display)\n this.svgGroup\n .attr('class', 'transitive-sortable')\n .datum({\n owner: this,\n sortableType: 'POINT_MULTI'\n })\n\n if (this.containsSegmentEndPoint()) this.initMergedMarker(display)\n\n // set up the pattern markers\n /* this.marker = this.markerSvg.selectAll('circle')\n .data(this.renderData)\n .enter()\n .append('circle')\n .attr('class', 'transitive-multipoint-marker-pattern'); */\n }\n\n this.initMergedMarker = function (display) {\n // set up the merged marker\n if (this.fromPoint || this.toPoint) {\n this.mergedMarker = this.markerSvg.append('g').append('circle')\n .datum({\n owner: this\n })\n .attr('class', 'transitive-multipoint-marker-merged')\n } else if (this.hasOffsetPoints || this.renderData.length > 1) {\n this.mergedMarker = this.markerSvg.append('g').append('rect')\n .datum({\n owner: this\n })\n .attr('class', 'transitive-multipoint-marker-merged')\n }\n }\n\n /**\n * Refresh the point\n *\n * @param {Display} display\n */\n\n this.refresh = function (display) {\n if (!this.renderData) return\n\n // refresh the merged marker\n if (this.mergedMarker) {\n if (!this.mergedMarkerData) this.initMarkerData(display)\n\n this.mergedMarker.datum({\n owner: this\n })\n this.mergedMarker.attr(this.mergedMarkerData)\n }\n\n /* var cx, cy;\n // refresh the pattern-level markers\n this.marker.data(this.renderData);\n this.marker.attr('transform', function (d, i) {\n cx = d.x;\n cy = d.y;\n var x = display.xScale(d.x) + d.offsetX;\n var y = display.yScale(d.y) - d.offsetY;\n return 'translate(' + x +', ' + y +')';\n }); */\n }\n\n this.getRenderDataArray = function () {\n return this.renderData\n }\n\n this.setFocused = function (focused) {\n this.focused = focused\n each(this.points, function (point) {\n point.setFocused(focused)\n })\n }\n\n this.runFocusTransition = function (display, callback) {\n if (this.mergedMarker) {\n var newStrokeColor = display.styler.compute(display.styler.multipoints_merged\n .stroke, display, {\n owner: this\n })\n this.mergedMarker.transition().style('stroke', newStrokeColor).call(\n callback)\n }\n if (this.label) this.label.runFocusTransition(display, callback)\n }\n})\n\n/**\n * Expose `MultiPoint`\n */\n\nmodule.exports = MultiPoint\n", - "/**\n * Dependencies\n */\n\nvar augment = require('augment')\nvar d3 = require('d3')\n\nvar Point = require('./index')\nvar Util = require('../util')\n\nvar SphericalMercator = require('../util/spherical-mercator')\nvar sm = new SphericalMercator()\n\n/**\n * Place: a Point subclass representing a 'place' that can be rendered on the\n * map. A place is a point *other* than a transit stop/station, e.g. a home/work\n * location, a point of interest, etc.\n */\n\nvar Place = augment(Point, function (base) {\n /**\n * the constructor\n */\n\n this.constructor = function (data) {\n base.constructor.call(this, data)\n\n if (data && data.place_lat && data.place_lon) {\n var xy = Util.latLonToSphericalMercator(data.place_lat, data.place_lon)\n this.worldX = xy[0]\n this.worldY = xy[1]\n }\n\n this.zIndex = 100000\n }\n\n /**\n * Get Type\n */\n\n this.getType = function () {\n return 'PLACE'\n }\n\n /**\n * Get ID\n */\n\n this.getId = function () {\n return this.place_id\n }\n\n /**\n * Get Name\n */\n\n this.getName = function () {\n return this.place_name\n }\n\n /**\n * Get lat\n */\n\n this.getLat = function () {\n return this.place_lat\n }\n\n /**\n * Get lon\n */\n\n this.getLon = function () {\n return this.place_lon\n }\n\n this.containsSegmentEndPoint = function () {\n return true\n }\n\n this.containsFromPoint = function () {\n return (this.getId() === 'from')\n }\n\n this.containsToPoint = function () {\n return (this.getId() === 'to')\n }\n\n this.addRenderData = function (pointInfo) {\n this.renderData.push(pointInfo)\n }\n\n this.getRenderDataArray = function () {\n return this.renderData\n }\n\n this.clearRenderData = function () {\n this.renderData = []\n }\n\n /**\n * Draw a place\n *\n * @param {Display} display\n */\n\n this.render = function (display) {\n base.render.call(this, display)\n if (!this.renderData) return\n\n this.initSvg(display)\n this.svgGroup\n .attr('class', 'transitive-sortable')\n .datum({\n owner: this,\n sortableType: 'POINT_PLACE'\n })\n\n // set up the markers\n this.marker = this.markerSvg.append('circle')\n .datum({\n owner: this\n })\n .attr('class', 'transitive-place-circle')\n\n var iconUrl = display.styler.compute(display.styler.places_icon['xlink:href'], display, {\n owner: this\n })\n if (iconUrl) {\n this.icon = this.markerSvg.append('image')\n .datum({\n owner: this\n })\n .attr('class', 'transitive-place-icon')\n .attr('xlink:href', iconUrl)\n }\n }\n\n /**\n * Refresh the place\n *\n * @param {Display} display\n */\n\n this.refresh = function (display) {\n if (!this.renderData) return\n\n // refresh the marker/icon\n var x = display.xScale(this.worldX)\n var y = display.yScale(this.worldY)\n var translate = 'translate(' + x + ', ' + y + ')'\n this.marker.attr('transform', translate)\n if (this.icon) this.icon.attr('transform', translate)\n }\n\n this.makeDraggable = function (transitive) {\n var place = this\n var display = transitive.display\n var drag = d3.behavior.drag()\n .on('dragstart', function () {\n d3.event.sourceEvent.stopPropagation() // silence other listeners\n })\n .on('drag', function () {\n if (place.graphVertex) {\n var boundingRect = display.el.getBoundingClientRect()\n var x = display.xScale.invert(d3.event.sourceEvent.pageX -\n boundingRect.left)\n var y = display.yScale.invert(d3.event.sourceEvent.pageY -\n boundingRect.top)\n\n place.worldX = x\n place.worldY = y\n var ll = sm.inverse([x, y])\n place.place_lon = ll[0]\n place.place_lat = ll[1]\n\n place.refresh(display)\n }\n })\n .on('dragend', function () {\n transitive.emit('place.' + place.getId() + '.dragend', place)\n })\n this.markerSvg.call(drag)\n }\n})\n\n/**\n * Expose `Place`\n */\n\nmodule.exports = Place\n", - "/**\n * Dependencies\n */\n\nvar each = require('component-each')\n\n/**\n * Expose `PointCluster`\n */\n\nmodule.exports = PointCluster\n\n/**\n *\n */\n\nfunction PointCluster () {\n this.points = []\n}\n\nPointCluster.prototype.addPoint = function (point) {\n if (this.points.indexOf(point) === -1) this.points.push(point)\n}\n\nPointCluster.prototype.mergeVertices = function (graph) {\n var vertices = []\n each(this.points, function (point) {\n vertices.push(point.graphVertex)\n })\n graph.mergeVertices(vertices)\n}\n", - "/**\n * Dependencies\n */\n\nvar d3 = require('d3')\nvar each = require('component-each')\n\nvar PointCluster = require('./pointcluster')\nvar MultiPoint = require('./multipoint')\nvar Util = require('../util')\n\n/**\n * Expose `PointClusterMap`\n */\n\nmodule.exports = PointClusterMap\n\n/**\n *\n */\n\nfunction PointClusterMap (transitive) {\n this.transitive = transitive\n\n this.clusters = []\n this.clusterLookup = {} // maps Point object to its containing cluster\n\n var pointArr = []\n each(transitive.stops, function (key) {\n var point = transitive.stops[key]\n if (point.used) pointArr.push(point)\n }, this)\n each(transitive.turnPoints, function (key) {\n pointArr.push(transitive.turnPoints[key])\n }, this)\n\n var links = d3.geom.voronoi()\n .x(function (d) {\n return d.worldX\n })\n .y(function (d) {\n return d.worldY\n })\n .links(pointArr)\n\n each(links, function (link) {\n var dist = Util.distance(link.source.worldX, link.source.worldY, link.target\n .worldX, link.target.worldY)\n if (dist < 100 && (link.source.getType() !== 'TURN' || link.target.getType() !==\n 'TURN')) {\n var sourceInCluster = (link.source in this.clusterLookup)\n var targetInCluster = (link.target in this.clusterLookup)\n if (sourceInCluster && !targetInCluster) {\n this.addPointToCluster(link.target, this.clusterLookup[link.source])\n } else if (!sourceInCluster && targetInCluster) {\n this.addPointToCluster(link.source, this.clusterLookup[link.target])\n } else if (!sourceInCluster && !targetInCluster) {\n var cluster = new PointCluster()\n this.clusters.push(cluster)\n this.addPointToCluster(link.source, cluster)\n this.addPointToCluster(link.target, cluster)\n }\n }\n }, this)\n\n this.vertexPoints = []\n each(this.clusters, function (cluster) {\n var multipoint = new MultiPoint(cluster.points)\n this.vertexPoints.push(multipoint)\n each(cluster.points, function (point) {\n point.multipoint = multipoint\n }, this)\n }, this)\n}\n\nPointClusterMap.prototype.addPointToCluster = function (point, cluster) {\n cluster.addPoint(point)\n this.clusterLookup[point] = cluster\n}\n\nPointClusterMap.prototype.clearMultiPoints = function () {\n each(this.clusters, function (cluster) {\n each(cluster.points, function (point) {\n point.multipoint = null\n }, this)\n }, this)\n}\n\nPointClusterMap.prototype.getVertexPoints = function (baseVertexPoints) {\n if (!baseVertexPoints) return this.vertexPoints\n var vertexPoints = this.vertexPoints.concat()\n each(baseVertexPoints, function (point) {\n if (!point.multipoint) vertexPoints.push(point)\n })\n return vertexPoints\n}\n", - "/**\n * Dependencies\n */\n\nvar augment = require('augment')\nvar each = require('component-each')\n\nvar Point = require('./index')\nvar Util = require('../util')\n\n/**\n * Place: a Point subclass representing a 'place' that can be rendered on the\n * map. A place is a point *other* than a transit stop/station, e.g. a home/work\n * location, a point of interest, etc.\n */\n\nvar Stop = augment(Point, function (base) {\n this.constructor = function (data) {\n base.constructor.call(this, data)\n\n if (data && data.stop_lat && data.stop_lon) {\n var xy = Util.latLonToSphericalMercator(data.stop_lat, data.stop_lon)\n this.worldX = xy[0]\n this.worldY = xy[1]\n }\n\n this.patterns = []\n\n this.patternRenderData = {}\n this.patternFocused = {}\n this.patternCount = 0\n\n this.patternStylerKey = 'stops_pattern'\n\n this.isSegmentEndPoint = false\n }\n\n /**\n * Get id\n */\n\n this.getId = function () {\n return this.stop_id\n }\n\n /**\n * Get type\n */\n\n this.getType = function () {\n return 'STOP'\n }\n\n /**\n * Get name\n */\n\n this.getName = function () {\n if (!this.stop_name) return ('Unnamed Stop (ID=' + this.getId() + ')')\n return this.stop_name\n }\n\n /**\n * Get lat\n */\n\n this.getLat = function () {\n return this.stop_lat\n }\n\n /**\n * Get lon\n */\n\n this.getLon = function () {\n return this.stop_lon\n }\n\n this.containsSegmentEndPoint = function () {\n return this.isSegmentEndPoint\n }\n\n this.containsBoardPoint = function () {\n return this.isBoardPoint\n }\n\n this.containsAlightPoint = function () {\n return this.isAlightPoint\n }\n\n this.containsTransferPoint = function () {\n return this.isTransferPoint\n }\n\n this.getPatterns = function () {\n return this.patterns\n }\n\n this.addPattern = function (pattern) {\n if (this.patterns.indexOf(pattern) === -1) this.patterns.push(pattern)\n }\n\n /**\n * Add render data\n *\n * @param {Object} stopInfo\n */\n\n this.addRenderData = function (stopInfo) {\n if (stopInfo.rEdge.getType() === 'TRANSIT') {\n var s = {\n sortableType: 'POINT_STOP_PATTERN',\n owner: this,\n getZIndex: function () {\n if (this.owner.graphVertex) {\n return this.owner.getZIndex()\n }\n return this.rEdge.getZIndex() + 1\n }\n }\n\n for (var key in stopInfo) s[key] = stopInfo[key]\n\n var patternId = stopInfo.rEdge.patternIds\n this.patternRenderData[patternId] = s // .push(s);\n\n each(stopInfo.rEdge.patterns, function (pattern) {\n this.addPattern(pattern)\n }, this)\n }\n this.patternCount = Object.keys(this.patternRenderData).length\n }\n\n this.isPatternFocused = function (patternId) {\n if (!(patternId in this.patternFocused)) return true\n return (this.patternFocused[patternId])\n }\n\n this.setPatternFocused = function (patternId, focused) {\n this.patternFocused[patternId] = focused\n }\n\n this.setAllPatternsFocused = function (focused) {\n for (var key in this.patternRenderData) {\n this.patternFocused[key] = focused\n }\n }\n\n /**\n * Draw a stop\n *\n * @param {Display} display\n */\n\n this.render = function (display) {\n base.render.call(this, display)\n if (Object.keys(this.patternRenderData).length === 0) return\n\n var renderDataArray = this.getRenderDataArray()\n\n this.initSvg(display)\n\n // set up the merged marker\n this.mergedMarker = this.markerSvg.append('g').append('rect')\n .attr('class', 'transitive-sortable transitive-stop-marker-merged')\n .datum(this.getMergedRenderData())\n\n // set up the pattern-specific markers\n this.patternMarkers = this.markerSvg.append('g').selectAll('circle')\n .data(renderDataArray)\n .enter()\n .append('circle')\n .attr('class', 'transitive-sortable transitive-stop-marker-pattern')\n }\n\n /**\n * Refresh the stop\n *\n * @param {Display} display\n */\n\n this.refresh = function (display) {\n if (this.patternCount === 0) return\n\n if (!this.mergedMarkerData) this.initMarkerData(display)\n\n // refresh the pattern-level markers\n this.patternMarkers.data(this.getRenderDataArray())\n\n this.patternMarkers.attr('transform', function (d, i) {\n if (!isNaN(d.x) && !isNaN(d.y)) {\n var x = d.x + this.placeOffsets.x\n var y = d.y + this.placeOffsets.y\n return 'translate(' + x + ', ' + y + ')'\n }\n }.bind(this))\n\n // refresh the merged marker\n if (this.mergedMarker) {\n this.mergedMarker.datum(this.getMergedRenderData())\n if (!isNaN(this.mergedMarkerData.x) && !isNaN(this.mergedMarkerData.y)) this.mergedMarker.attr(this.mergedMarkerData)\n }\n }\n\n this.getMergedRenderData = function () {\n return {\n owner: this,\n sortableType: 'POINT_STOP_MERGED'\n }\n }\n\n this.getRenderDataArray = function () {\n var dataArray = []\n for (var patternId in this.patternRenderData) {\n dataArray.push(this.patternRenderData[patternId])\n }\n return dataArray\n }\n\n this.getMarkerBBox = function () {\n if (this.mergedMarker) return this.mergedMarkerData\n }\n\n this.isFocused = function () {\n if (this.mergedMarker || !this.patternRenderData) {\n return (this.focused === true)\n }\n\n var focused = true\n for (var patternId in this.patternRenderData) {\n focused = this && this.isPatternFocused(patternId)\n }\n return focused\n }\n\n this.runFocusTransition = function (display, callback) {\n if (this.mergedMarker) {\n var newStrokeColor = display.styler.compute(display.styler.stops_merged\n .stroke, display, {\n owner: this\n })\n this.mergedMarker.transition().style('stroke', newStrokeColor).call(\n callback)\n }\n if (this.label) this.label.runFocusTransition(display, callback)\n }\n\n this.clearRenderData = function () {\n this.patternRenderData = {}\n this.mergedMarkerData = null\n this.placeOffsets = {\n x: 0,\n y: 0\n }\n }\n})\n\n/**\n * Expose `Stop`\n */\n\nmodule.exports = Stop\n", - "/**\n * Dependencies\n */\n\nvar augment = require('augment')\n\nvar Point = require('./index')\n\nvar SphericalMercator = require('../util/spherical-mercator')\nvar sm = new SphericalMercator()\n\n/**\n *\n */\n\nvar TurnPoint = augment(Point, function (base) {\n this.constructor = function (data, id) {\n base.constructor.call(this, data)\n this.name = 'Turn @ ' + data.lat + ', ' + data.lon\n if (!this.worldX || !this.worldY) {\n var smCoords = sm.forward([data.lon, data.lat])\n this.worldX = smCoords[0]\n this.worldY = smCoords[1]\n this.isSegmentEndPoint = false\n }\n this.id = id\n }\n\n this.getId = function () {\n return this.id\n }\n\n this.getType = function () {\n return 'TURN'\n }\n\n this.getName = function () {\n return this.name\n }\n\n this.containsSegmentEndPoint = function () {\n return this.isSegmentEndPoint\n }\n})\n\n/**\n * Expose `TurnPoint`\n */\n\nmodule.exports = TurnPoint\n", - "var augment = require('augment')\nvar each = require('component-each')\n\nvar Renderer = require('./index')\n\n/**\n * A Renderer subclass for the default network rendering engine.\n *\n * @param {Object} the main Transitive object\n */\n\nvar DefaultRenderer = augment(Renderer, function (base) {\n this.constructor = function (transitive) {\n base.constructor.call(this, transitive)\n }\n\n this.render = function () {\n base.render.call(this)\n\n var self = this\n var display = this.transitive.display\n var network = this.transitive.network\n display.styler = this.transitive.styler\n\n var legendSegments = {}\n\n each(network.renderedEdges, function (rEdge) {\n rEdge.refreshRenderData(display)\n })\n\n each(network.paths, function (path) {\n each(path.segments, function (pathSegment) {\n each(pathSegment.renderedSegments, function (renderedSegment) {\n renderedSegment.render(display)\n var legendType = renderedSegment.getLegendType()\n if (!(legendType in legendSegments)) {\n legendSegments[legendType] = renderedSegment\n }\n })\n })\n })\n\n // draw the vertex-based points\n\n each(network.graph.vertices, function (vertex) {\n vertex.point.render(display)\n if (self.isDraggable(vertex.point)) {\n vertex.point.makeDraggable(self.transitive)\n }\n })\n\n // draw the edge-based points\n each(network.graph.edges, function (edge) {\n edge.pointArray.forEach(function (point) {\n point.render(display)\n })\n })\n\n if (display.legend) display.legend.render(legendSegments)\n\n this.transitive.refresh()\n }\n\n /**\n * Refresh\n */\n\n this.refresh = function (panning) {\n base.refresh.call(this, panning)\n\n var display = this.transitive.display\n var network = this.transitive.network\n var styler = this.transitive.styler\n\n network.graph.vertices.forEach(function (vertex) {\n vertex.point.clearRenderData()\n })\n network.graph.edges.forEach(function (edge) {\n edge.clearRenderData()\n })\n\n // refresh the segment and point marker data\n this.refreshSegmentRenderData()\n network.graph.vertices.forEach(function (vertex) {\n vertex.point.initMarkerData(display)\n })\n\n this.renderedSegments = []\n each(network.paths, function (path) {\n each(path.segments, function (pathSegment) {\n each(pathSegment.renderedSegments, function (rSegment) {\n rSegment.refresh(display)\n this.renderedSegments.push(rSegment)\n }, this)\n }, this)\n }, this)\n\n network.graph.vertices.forEach(function (vertex) {\n var point = vertex.point\n if (!point.svgGroup) return // check if this point is not currently rendered\n styler.stylePoint(display, point)\n point.refresh(display)\n })\n\n // re-draw the edge-based points\n network.graph.edges.forEach(function (edge) {\n edge.pointArray.forEach(function (point) {\n if (!point.svgGroup) return // check if this point is not currently rendered\n styler.styleStop(display, point)\n point.refresh(display)\n })\n })\n\n // refresh the label layout\n var labeledElements = this.transitive.labeler.doLayout()\n labeledElements.points.forEach(function (point) {\n point.refreshLabel(display)\n styler.stylePointLabel(display, point)\n })\n each(this.transitive.labeler.segmentLabels, function (label) {\n label.refresh(display)\n styler.styleSegmentLabel(display, label)\n })\n\n this.sortElements()\n }\n\n this.refreshSegmentRenderData = function () {\n each(this.transitive.network.renderedEdges, function (rEdge) {\n rEdge.refreshRenderData(this.transitive.display)\n }, this)\n\n // try intersecting adjacent rendered edges to create a smooth transition\n\n var isectKeys = [] // keep track of edge-edge intersections we've already computed\n each(this.transitive.network.paths, function (path) {\n each(path.segments, function (pathSegment) {\n each(pathSegment.renderedSegments, function (rSegment) {\n for (var s = 0; s < rSegment.renderedEdges.length - 1; s++) {\n var rEdge1 = rSegment.renderedEdges[s]\n var rEdge2 = rSegment.renderedEdges[s + 1]\n var key = rEdge1.getId() + '_' + rEdge2.getId()\n if (isectKeys.indexOf(key) !== -1) continue\n if (rEdge1.graphEdge.isInternal && rEdge2.graphEdge.isInternal) {\n rEdge1.intersect(rEdge2)\n }\n isectKeys.push(key)\n }\n })\n })\n })\n }\n\n /**\n * sortElements\n */\n\n this.sortElements = function () {\n this.renderedSegments.sort(function (a, b) {\n return (a.compareTo(b))\n })\n\n var focusBaseZIndex = 100000\n\n this.renderedSegments.forEach(function (rSegment, index) {\n rSegment.zIndex = index * 10 + (rSegment.isFocused()\n ? focusBaseZIndex\n : 0)\n })\n\n this.transitive.network.graph.vertices.forEach(function (vertex) {\n var point = vertex.point\n point.zIndex = point.zIndex + (point.isFocused() ? focusBaseZIndex : 0)\n })\n\n this.transitive.display.svg.selectAll('.transitive-sortable').sort(function (a, b) {\n var aIndex = (typeof a.getZIndex === 'function') ? a.getZIndex() : a.owner\n .getZIndex()\n var bIndex = (typeof b.getZIndex === 'function') ? b.getZIndex() : b.owner\n .getZIndex()\n return aIndex - bIndex\n })\n }\n\n /**\n * focusPath\n */\n\n this.focusPath = function (path) {\n var self = this\n var pathRenderedSegments = []\n var graph = this.transitive.network.graph\n\n if (path) { // if we're focusing a specific path\n pathRenderedSegments = path.getRenderedSegments()\n\n // un-focus all internal points\n graph.edges.forEach(function (edge) {\n edge.pointArray.forEach(function (point, i) {\n point.setAllPatternsFocused(false)\n })\n }, this)\n } else { // if we're returing to 'all-focused' mode\n // re-focus all internal points\n graph.edges.forEach(function (edge) {\n edge.pointArray.forEach(function (point, i) {\n point.setAllPatternsFocused(true)\n })\n }, this)\n }\n\n var focusChangeSegments = []\n var focusedVertexPoints = []\n each(this.renderedSegments, function (rSegment) {\n if (path && pathRenderedSegments.indexOf(rSegment) === -1) {\n if (rSegment.isFocused()) focusChangeSegments.push(rSegment)\n rSegment.setFocused(false)\n } else {\n if (!rSegment.isFocused()) focusChangeSegments.push(rSegment)\n rSegment.setFocused(true)\n focusedVertexPoints.push(rSegment.pathSegment.startVertex().point)\n focusedVertexPoints.push(rSegment.pathSegment.endVertex().point)\n }\n })\n\n var focusChangePoints = []\n graph.vertices.forEach(function (vertex) {\n var point = vertex.point\n if (focusedVertexPoints.indexOf(point) !== -1) {\n if (!point.isFocused()) focusChangePoints.push(point)\n point.setFocused(true)\n } else {\n if (point.isFocused()) focusChangePoints.push(point)\n point.setFocused(false)\n }\n }, this)\n\n // bring the focused elements to the front for the transition\n // if (path) this.sortElements();\n\n // create a transition callback function that invokes refresh() after all transitions complete\n var n = 0\n var refreshOnEnd = function (transition, callback) {\n transition\n .each(function () {\n ++n\n })\n .each('end', function () {\n if (!--n) self.transitive.refresh()\n })\n }\n\n // run the transtions on the affected elements\n each(focusChangeSegments, function (segment) {\n segment.runFocusTransition(this.transitive.display, refreshOnEnd)\n }, this)\n\n each(focusChangePoints, function (point) {\n point.runFocusTransition(this.transitive.display, refreshOnEnd)\n }, this)\n }\n})\n\n/**\n * Expose `DefaultRenderer`\n */\n\nmodule.exports = DefaultRenderer\n", - "var augment = require('augment')\nvar each = require('component-each')\n\nvar drawGrid = require('../display/draw-grid')\n\n/**\n * A superclass for a Transitive network rendering engine.\n *\n * @param {Object} the main Transitive object\n */\n\nvar Renderer = augment(Object, function () {\n this.constructor = function (transitive) {\n this.transitive = transitive\n }\n\n this.render = function () {\n var display = this.transitive.display\n display.styler = this.transitive.styler\n\n // remove all old svg elements\n display.empty()\n }\n\n /**\n * Refresh\n */\n\n this.refresh = function (panning) {\n var display = this.transitive.display\n var network = this.transitive.network\n\n if (display.tileLayer) display.tileLayer.zoomed()\n\n network.graph.vertices.forEach(function (vertex) {\n vertex.point.clearRenderData()\n })\n network.graph.edges.forEach(function (edge) {\n edge.clearRenderData()\n })\n\n // draw the grid, if necessary\n if (this.transitive.options.drawGrid) drawGrid(display, this.gridCellSize)\n }\n\n /**\n * sortElements\n */\n\n this.sortElements = function () {}\n\n /**\n * focusPath\n */\n\n this.focusPath = function (path) {}\n\n this.isDraggable = function (point) {\n var draggableTypes = this.transitive.options.draggableTypes\n if (!draggableTypes) return false\n\n var retval = false\n each(draggableTypes, function (type) {\n if (type === point.getType()) {\n // Return true in ether of the following cases:\n // 1. No ID array is provided for this point type (i.e. entire type is draggable)\n // 2. An ID array is provided and it includes this Point's ID\n retval = !draggableTypes[type] || draggableTypes[type].indexOf(point.getId()) !== -1\n }\n })\n return retval\n }\n})\n\n/**\n * Expose `Renderer`\n */\n\nmodule.exports = Renderer\n", - "var each = require('component-each')\n\nvar Util = require('../util')\n\nvar rEdgeId = 0\n\n/**\n * Expose `RenderedEdge`\n */\n\nmodule.exports = RenderedEdge\n\n/**\n *\n */\n\nfunction RenderedEdge (graphEdge, forward, type) {\n this.id = rEdgeId++\n this.graphEdge = graphEdge\n this.forward = forward\n this.type = type\n this.points = []\n this.clearOffsets()\n this.focused = true\n this.sortableType = 'SEGMENT'\n}\n\nRenderedEdge.prototype.clearGraphData = function () {\n this.graphEdge = null\n this.edgeFromOffset = 0\n this.edgeToOffset = 0\n}\n\nRenderedEdge.prototype.addPattern = function (pattern) {\n if (!this.patterns) this.patterns = []\n if (this.patterns.indexOf(pattern) !== -1) return\n this.patterns.push(pattern)\n\n // generate the patternIds field\n this.patternIds = constuctIdListString(this.patterns)\n}\n\nRenderedEdge.prototype.addPathSegment = function (pathSegment) {\n if (!this.pathSegments) this.pathSegments = []\n if (this.pathSegments.indexOf(pathSegment) !== -1) return\n this.pathSegments.push(pathSegment)\n\n // generate the pathSegmentIds field\n this.pathSegmentIds = constuctIdListString(this.pathSegments)\n}\n\nfunction constuctIdListString (items) {\n var idArr = []\n each(items, function (item) {\n idArr.push(item.getId())\n })\n idArr.sort()\n return idArr.join(',')\n}\n\nRenderedEdge.prototype.getId = function () {\n return this.id\n}\n\nRenderedEdge.prototype.getType = function () {\n return this.type\n}\n\nRenderedEdge.prototype.setFromOffset = function (offset) {\n this.fromOffset = offset\n}\n\nRenderedEdge.prototype.setToOffset = function (offset) {\n this.toOffset = offset\n}\n\nRenderedEdge.prototype.clearOffsets = function () {\n this.fromOffset = 0\n this.toOffset = 0\n}\n\nRenderedEdge.prototype.getAlignmentVector = function (alignmentId) {\n if (this.graphEdge.getFromAlignmentId() === alignmentId) {\n return this.graphEdge.fromVector\n }\n if (this.graphEdge.getToAlignmentId() === alignmentId) {\n return this.graphEdge.toVector\n }\n return null\n}\n\nRenderedEdge.prototype.offsetAlignment = function (alignmentId, offset) {\n if (this.graphEdge.getFromAlignmentId() === alignmentId) {\n this.setFromOffset(Util.isOutwardVector(this.graphEdge.fromVector)\n ? offset\n : -offset)\n }\n if (this.graphEdge.getToAlignmentId() === alignmentId) {\n this.setToOffset(Util.isOutwardVector(this.graphEdge.toVector) ? offset : -offset)\n }\n}\n\nRenderedEdge.prototype.setFocused = function (focused) {\n this.focused = focused\n}\n\nRenderedEdge.prototype.refreshRenderData = function (display) {\n if (this.graphEdge.fromVertex.x === this.graphEdge.toVertex.x &&\n this.graphEdge.fromVertex.y === this.graphEdge.toVertex.y) {\n this.renderData = []\n return\n }\n\n this.lineWidth = this.computeLineWidth(display, true)\n\n var fromOffsetPx = this.fromOffset * this.lineWidth\n var toOffsetPx = this.toOffset * this.lineWidth\n\n if (this.graphEdge.geomCoords) {\n this.renderData = this.graphEdge.getGeometricCoords(fromOffsetPx, toOffsetPx, display, this.forward)\n } else {\n this.renderData = this.graphEdge.getRenderCoords(fromOffsetPx, toOffsetPx,\n display, this.forward)\n }\n\n var firstRenderPoint = this.renderData[0]\n var lastRenderPoint = this.renderData[this.renderData.length - 1]\n\n var pt\n if (!this.graphEdge.fromVertex.isInternal) {\n pt = this.forward ? firstRenderPoint : lastRenderPoint\n if (pt) {\n this.graphEdge.fromVertex.point.addRenderData({\n x: pt.x,\n y: pt.y,\n rEdge: this\n })\n }\n }\n\n pt = this.forward ? lastRenderPoint : firstRenderPoint\n if (pt) {\n this.graphEdge.toVertex.point.addRenderData({\n x: pt.x,\n y: pt.y,\n rEdge: this\n })\n }\n\n each(this.graphEdge.pointArray, function (point, i) {\n if (point.getType() === 'TURN') return\n var t = (i + 1) / (this.graphEdge.pointArray.length + 1)\n var coord = this.graphEdge.coordAlongEdge(this.forward ? t : (1 - t),\n this.renderData, display)\n if (coord) {\n point.addRenderData({\n x: coord.x,\n y: coord.y,\n rEdge: this\n })\n }\n }, this)\n}\n\nRenderedEdge.prototype.computeLineWidth = function (display, includeEnvelope) {\n var styler = display.styler\n if (styler && display) {\n // compute the line width\n var env = styler.compute(styler.segments.envelope, display, this)\n if (env && includeEnvelope) {\n return parseFloat(env.substring(0, env.length - 2), 10) - 2\n } else {\n var lw = styler.compute(styler.segments['stroke-width'], display, this)\n return parseFloat(lw.substring(0, lw.length - 2), 10) - 2\n }\n }\n}\n\nRenderedEdge.prototype.isFocused = function () {\n return (this.focused === true)\n}\n\nRenderedEdge.prototype.getZIndex = function () {\n return 10000\n}\n\n/**\n * Computes the point of intersection between two adjacent, offset RenderedEdges (the\n * edge the function is called on and a second egde passed as a parameter)\n * by \"extending\" the adjacent edges and finding the point of intersection. If\n * such a point exists, the existing renderData arrays for the edges are\n * adjusted accordingly, as are any associated stops.\n */\n\nRenderedEdge.prototype.intersect = function (rEdge) {\n // do no intersect adjacent edges of unequal bundle size\n if (this.graphEdge.renderedEdges.length !== rEdge.graphEdge.renderedEdges.length) return\n\n var commonVertex = this.graphEdge.commonVertex(rEdge.graphEdge)\n if (!commonVertex || commonVertex.point.isSegmentEndPoint) return\n\n var thisCheck = (commonVertex === this.graphEdge.fromVertex && this.forward) || (commonVertex === this.graphEdge.toVertex &&\n !this.forward)\n var otherCheck = (commonVertex === rEdge.graphEdge.fromVertex && rEdge.forward) || (commonVertex === rEdge.graphEdge.toVertex &&\n !rEdge.forward)\n\n var p1 = (thisCheck)\n ? this.renderData[0]\n : this.renderData[this.renderData.length - 1]\n var v1 = this.graphEdge.getVector(commonVertex)\n\n var p2 = (otherCheck)\n ? rEdge.renderData[0]\n : rEdge.renderData[rEdge.renderData.length - 1]\n var v2 = rEdge.graphEdge.getVector(commonVertex)\n\n if ((!p1 || !p2 || !v1 || !v2) || (p1.x === p2.x && p1.y === p2.y)) return\n\n var isect = Util.lineIntersection(p1.x, p1.y, p1.x + v1.x, p1.y - v1.y, p2.x,\n p2.y, p2.x + v2.x, p2.y - v2.y)\n\n if (!isect.intersect) return\n\n // adjust the endpoint of the first edge\n if (thisCheck) {\n this.renderData[0].x = isect.x\n this.renderData[0].y = isect.y\n } else {\n this.renderData[this.renderData.length - 1].x = isect.x\n this.renderData[this.renderData.length - 1].y = isect.y\n }\n\n // adjust the endpoint of the second edge\n if (otherCheck) {\n rEdge.renderData[0].x = isect.x\n rEdge.renderData[0].y = isect.y\n } else {\n rEdge.renderData[rEdge.renderData.length - 1].x = isect.x\n rEdge.renderData[rEdge.renderData.length - 1].y = isect.y\n }\n\n // update the point renderData\n commonVertex.point.addRenderData({\n x: isect.x,\n y: isect.y,\n rEdge: this\n })\n}\n\nRenderedEdge.prototype.findExtension = function (vertex) {\n var incidentEdges = vertex.incidentEdges(this.graphEdge)\n var bundlerId = this.patternIds || this.pathSegmentIds\n for (var e = 0; e < incidentEdges.length; e++) {\n var edgeSegments = incidentEdges[e].renderedEdges\n for (var s = 0; s < edgeSegments.length; s++) {\n var segment = edgeSegments[s]\n var otherId = segment.patternIds || segment.pathSegmentIds\n if (bundlerId === otherId) {\n return segment\n }\n }\n }\n}\n\nRenderedEdge.prototype.toString = function () {\n return 'RenderedEdge ' + this.id + ' type=' + this.type + ' on ' + this.graphEdge\n .toString() + ' w/ patterns ' + this.patternIds + ' fwd=' + this.forward\n}\n", - "/**\n * Dependencies\n */\n\nvar d3 = require('d3')\nvar each = require('component-each')\n\nvar interpolateLine = require('../util/interpolate-line')\n\n/**\n * Expose `RenderedSegment`\n */\n\nmodule.exports = RenderedSegment\n\nvar rSegmentId = 0\n\n/**\n *\n */\n\nfunction RenderedSegment (pathSegment) {\n this.id = rSegmentId++\n this.renderedEdges = []\n this.pathSegment = pathSegment\n if (pathSegment) this.type = pathSegment.type\n this.focused = true\n}\n\nRenderedSegment.prototype.getId = function () {\n return this.id\n}\n\nRenderedSegment.prototype.getType = function () {\n return this.type\n}\n\nRenderedSegment.prototype.addRenderedEdge = function (rEdge) {\n this.renderedEdges.push(rEdge)\n}\n\nRenderedSegment.prototype.render = function (display) {\n this.line = d3.svg.line() // the line translation function\n .x(function (data, i) {\n return data.x\n })\n .y(function (data, i) {\n return data.y\n })\n .interpolate(interpolateLine.bind({\n segment: this,\n display: display\n }))\n\n this.svgGroup = display.svg.append('g')\n\n this.lineSvg = this.svgGroup.append('g')\n .attr('class', 'transitive-sortable')\n .datum({\n owner: this,\n sortableType: 'SEGMENT'\n })\n\n this.labelSvg = this.svgGroup.append('g')\n\n this.lineGraph = this.lineSvg.append('path')\n\n this.lineGraph\n .attr('class', 'transitive-line')\n .data([this])\n\n this.lineGraphFront = this.lineSvg.append('path')\n\n this.lineGraphFront\n .attr('class', 'transitive-line-front')\n .data([this])\n\n if (display.haloLayer) {\n this.lineGraphHalo = display.haloLayer.append('path')\n\n this.lineGraphHalo\n .attr('class', 'transitive-line-halo')\n .data([this])\n }\n}\n\nRenderedSegment.prototype.refresh = function (display, renderData) {\n if (renderData) {\n this.renderData = renderData\n } else {\n this.renderData = []\n each(this.renderedEdges, function (rEdge) {\n this.renderData = this.renderData.concat(rEdge.renderData)\n }, this)\n }\n\n var lineData = this.line(this.renderData)\n this.lineGraph.attr('d', lineData)\n this.lineGraphFront.attr('d', lineData)\n if (this.lineGraphHalo) this.lineGraphHalo.attr('d', lineData)\n display.styler.styleSegment(display, this)\n}\n\nRenderedSegment.prototype.setFocused = function (focused) {\n this.focused = focused\n}\n\nRenderedSegment.prototype.isFocused = function () {\n return this.focused\n}\n\nRenderedSegment.prototype.runFocusTransition = function (display, callback) {\n var newColor = display.styler.compute(display.styler.segments.stroke, display,\n this)\n this.lineGraph.transition().style('stroke', newColor).call(callback)\n}\n\nRenderedSegment.prototype.getZIndex = function () {\n return this.zIndex\n}\n\nRenderedSegment.prototype.computeLineWidth = function (display, includeEnvelope) {\n var styler = display.styler\n if (styler && display) {\n // compute the line width\n var env = styler.compute(styler.segments.envelope, display, this)\n if (env && includeEnvelope) {\n return parseFloat(env.substring(0, env.length - 2), 10) - 2\n } else {\n var lw = styler.compute(styler.segments['stroke-width'], display, this)\n return parseFloat(lw.substring(0, lw.length - 2), 10) - 2\n }\n }\n}\n\nRenderedSegment.prototype.compareTo = function (other) {\n // show transit segments in front of other types\n if (this.type === 'TRANSIT' && other.type !== 'TRANSIT') return -1\n if (other.type === 'TRANSIT' && this.type !== 'TRANSIT') return 1\n\n if (this.type === 'TRANSIT' && other.type === 'TRANSIT') {\n // for two transit segments, try sorting transit mode first\n if (this.mode && other.mode && this.mode !== other.mode) {\n return (this.mode > other.mode)\n }\n\n // for two transit segments of the same mode, sort by id (for display consistency)\n return (this.getId() < other.getId())\n }\n}\n\nRenderedSegment.prototype.getLabelTextArray = function () {\n var textArray = []\n each(this.patterns, function (pattern) {\n var shortName = pattern.route.route_short_name\n if (textArray.indexOf(shortName) === -1) textArray.push(shortName)\n })\n return textArray\n}\n\nRenderedSegment.prototype.getLabelAnchors = function (display, spacing) {\n var labelAnchors = []\n this.computeRenderLength(display)\n var anchorCount = Math.floor(this.renderLength / spacing)\n var pctSpacing = spacing / this.renderLength\n\n for (var i = 0; i < anchorCount; i++) {\n var t = (i % 2 === 0)\n ? 0.5 + (i / 2) * pctSpacing\n : 0.5 - ((i + 1) / 2) * pctSpacing\n var coord = this.coordAlongRenderedPath(t, display)\n if (coord) labelAnchors.push(coord)\n }\n\n return labelAnchors\n}\n\nRenderedSegment.prototype.coordAlongRenderedPath = function (t, display) {\n var loc = t * this.renderLength\n\n var cur = 0\n for (var i = 0; i < this.renderedEdges.length; i++) {\n var rEdge = this.renderedEdges[i]\n var edgeRenderLen = rEdge.graphEdge.getRenderLength(display)\n if (loc <= cur + edgeRenderLen) {\n var t2 = (loc - cur) / edgeRenderLen\n return rEdge.graphEdge.coordAlongEdge(t2, rEdge.renderData, display)\n }\n cur += edgeRenderLen\n }\n}\n\nRenderedSegment.prototype.computeRenderLength = function (display) {\n this.renderLength = 0\n each(this.renderedEdges, function (rEdge) {\n this.renderLength += rEdge.graphEdge.getRenderLength(display)\n }, this)\n}\n\nRenderedSegment.prototype.getLegendType = function () {\n if (this.type === 'TRANSIT') {\n return this.type + '_' + this.mode\n }\n return this.type\n}\n\nRenderedSegment.prototype.toString = function () {\n return 'RenderedSegment ' + this.id + ' on ' + (this.pathSegment ? this.pathSegment.toString() : ' (null segment)')\n}\n", - "var d3 = require('d3')\nvar augment = require('augment')\nvar each = require('component-each')\n\nvar Renderer = require('./index')\nvar Point = require('../point/index')\n\nvar interpolateLine = require('../util/interpolate-line')\n\n/**\n * A Renderer subclass for drawing a simplified representation of the graph\n * itself, i.e. just the edges and vertices.\n *\n * @param {Object} the main Transitive object\n */\n\nvar WireframeRenderer = augment(Renderer, function (base) {\n this.constructor = function (transitive) {\n base.constructor.call(this, transitive)\n }\n\n this.render = function () {\n base.render.call(this)\n\n var graph = this.transitive.network.graph\n\n var self = this\n\n this.wireframeEdges = []\n each(graph.edges, function (edge) {\n var wfEdge = new WireframeEdge(edge)\n wfEdge.render(self.transitive.display)\n self.wireframeEdges.push(wfEdge)\n })\n\n this.wireframeVertices = []\n each(graph.vertices, function (vertex) {\n var wfVertex = new WireframeVertex(vertex)\n wfVertex.render(self.transitive.display)\n self.wireframeVertices.push(wfVertex)\n })\n\n this.transitive.refresh()\n }\n\n this.refresh = function (panning) {\n base.refresh.call(this, panning)\n var self = this\n\n each(this.wireframeEdges, function (wfEdge) {\n wfEdge.refresh(self.transitive.display)\n })\n\n each(this.wireframeVertices, function (wfVertex) {\n wfVertex.refresh(self.transitive.display)\n })\n }\n\n /**\n * sortElements\n */\n\n this.sortElements = function () {}\n})\n\n/**\n * Expose `WireframeRenderer`\n */\n\nmodule.exports = WireframeRenderer\n\n/**\n * WireframeVertex helper class\n */\n\nvar WireframeVertex = augment(Point, function (base) {\n this.constructor = function (vertex) {\n base.constructor.call(this, {\n vertex: vertex\n })\n }\n\n this.getType = function () {\n return 'WIREFRAME_VERTEX'\n }\n\n /**\n * Draw the vertex\n *\n * @param {Display} display\n */\n\n this.render = function (display) {\n base.render.call(this, display)\n\n this.initSvg(display)\n this.svgGroup\n .attr('class', 'transitive-sortable')\n .datum({\n owner: this,\n sortableType: 'POINT_WIREFRAME_VERTEX'\n })\n\n // set up the marker\n this.marker = this.markerSvg.append('circle')\n .datum({\n owner: this\n })\n .attr('class', 'transitive-wireframe-vertex-circle')\n }\n\n /**\n * Refresh the vertex\n *\n * @param {Display} display\n */\n\n this.refresh = function (display) {\n var x = display.xScale(this.vertex.x)\n var y = display.yScale(this.vertex.y)\n var translate = 'translate(' + x + ', ' + y + ')'\n this.marker.attr('transform', translate)\n display.styler.styleWireframeVertex(display, this)\n }\n})\n\n/**\n * WireframeEdge helper class\n */\n\nvar WireframeEdge = augment(Object, function () {\n this.constructor = function (edge) {\n this.edge = edge\n }\n\n this.render = function (display) {\n this.line = d3.svg.line() // the line translation function\n .x(function (data, i) {\n return data.x\n })\n .y(function (data, i) {\n return data.y\n })\n .interpolate(interpolateLine.bind({\n segment: this,\n display: display\n }))\n\n this.svgGroup = display.svg.append('g')\n\n this.lineSvg = this.svgGroup.append('g')\n .attr('class', 'transitive-sortable')\n .datum({\n owner: this,\n sortableType: 'WIREFRAME_EDGE'\n })\n\n this.lineGraph = this.lineSvg.append('path')\n .attr('class', 'transitive-wireframe-edge-line')\n }\n\n this.refresh = function (display) {\n this.renderData = this.edge.getRenderCoords(0, 0, display, true)\n var lineData = this.line(this.renderData)\n this.lineGraph.attr('d', lineData)\n display.styler.styleWireframeEdge(display, this)\n }\n})\n", - "var Route = require('../core/route')\nvar RoutePattern = require('../core/pattern')\nvar Util = require('../util')\n\nvar styles = require('./styles')\n\n/**\n * Element Types\n */\n\nvar types = [\n 'labels',\n 'segments',\n 'segments_front',\n 'segments_halo',\n 'segment_labels',\n 'segment_label_containers',\n 'stops_merged',\n 'stops_pattern',\n 'places',\n 'places_icon',\n 'multipoints_merged',\n 'multipoints_pattern',\n 'wireframe_vertices',\n 'wireframe_edges'\n]\n\n/**\n * SVG attributes\n */\n\nvar svgAttributes = [\n 'height',\n 'target',\n 'title',\n 'width',\n 'y1',\n 'y2',\n 'x1',\n 'x2',\n 'cx',\n 'cy',\n 'dx',\n 'dy',\n 'rx',\n 'ry',\n 'd',\n 'r',\n 'y',\n 'x',\n 'transform'\n]\n\n/**\n * Expose `Styler`\n */\n\nmodule.exports = Styler\n\n/**\n * Styler object\n */\n\nfunction Styler (styles) {\n if (!(this instanceof Styler)) return new Styler(styles)\n\n // reset styles\n this.reset()\n\n // load styles\n if (styles) this.load(styles)\n}\n\n/**\n * Clear all current styles\n */\n\nStyler.prototype.clear = function () {\n for (var i in types) {\n this[types[i]] = {}\n }\n}\n\n/**\n * Reset to the predefined styles\n */\n\nStyler.prototype.reset = function () {\n for (var i in types) {\n var type = types[i]\n this[type] = Object.assign({}, styles[type] || {})\n for (var key in this[type]) {\n if (!Array.isArray(this[type][key])) this[type][key] = [this[type][key]]\n }\n }\n}\n\n/**\n * Load rules\n *\n * @param {Object} a set of style rules\n */\n\nStyler.prototype.load = function (styles) {\n for (var i in types) {\n var type = types[i]\n if (styles[type]) {\n for (var key in styles[type]) {\n this[type][key] = (this[type][key] || []).concat(styles[type][key])\n }\n }\n }\n}\n\n/**\n * Style a Segment using the rules defined in styles.js or the Transitive options\n *\n * @param {Display} Transitive Display object\n * @param {RenderedSegment} Transitive RenderedSegment object\n */\n\nStyler.prototype.styleSegment = function (display, segment) {\n if (segment.lineGraphHalo) {\n this.applyAttrAndStyle(\n display,\n segment.lineGraphHalo,\n this.segments_halo\n )\n }\n\n this.applyAttrAndStyle(\n display,\n segment.lineGraph,\n this.segments\n )\n\n this.applyAttrAndStyle(\n display,\n segment.lineGraphFront,\n this.segments_front\n )\n}\n\n/**\n * Style a WireframeEdge using the rules defined in styles.js or the Transitive options\n *\n * @param {Display} Transitive Display object\n * @param {WireframeEdge} Transitive WireframeEdge object\n */\n\nStyler.prototype.styleWireframeEdge = function (display, wfEdge) {\n this.applyAttrAndStyle(\n display,\n wfEdge.svgGroup.selectAll('.transitive-wireframe-edge-line'),\n this.wireframe_edges\n )\n}\n\n/**\n * Style a Point using the rules defined in styles.js or the Transitive options\n *\n * @param {Display} Transitive Display object\n * @param {Point} Transitive Point object\n */\n\nStyler.prototype.stylePoint = function (display, point) {\n if (point.getType() === 'STOP') this.styleStop(display, point)\n if (point.getType() === 'PLACE') this.stylePlace(display, point)\n if (point.getType() === 'MULTI') this.styleMultiPoint(display, point)\n if (point.getType() === 'WIREFRAME_VERTEX') this.styleWireframeVertex(display, point)\n}\n\n/**\n * Style a Stop using the rules defined in styles.js or the Transitive options\n *\n * @param {Display} Transitive Display object\n * @param {Stop} Transitive Stop object\n */\n\nStyler.prototype.styleStop = function (display, stop) {\n this.applyAttrAndStyle(\n display,\n stop.patternMarkers,\n this.stops_pattern\n )\n\n this.applyAttrAndStyle(\n display,\n stop.mergedMarker,\n this.stops_merged\n )\n\n this.applyAttrAndStyle(\n display,\n stop.svgGroup.selectAll('.transitive-stop-label'),\n this.labels\n )\n}\n\n/**\n * Style a Place using the rules defined in styles.js or the Transitive options\n *\n * @param {Display} Transitive Display object\n * @param {Place} Transitive Place object\n */\n\nStyler.prototype.stylePlace = function (display, place) {\n this.applyAttrAndStyle(\n display,\n place.svgGroup.selectAll('.transitive-place-circle'),\n this.places\n )\n\n this.applyAttrAndStyle(\n display,\n place.svgGroup.selectAll('.transitive-place-icon'),\n this.places_icon\n )\n\n this.applyAttrAndStyle(\n display,\n place.svgGroup.selectAll('.transitive-place-label'),\n this.labels\n )\n}\n\n/**\n * Style a MultiPoint using the rules defined in styles.js or the Transitive options\n *\n * @param {Display} Transitive Display object\n * @param {MultiPoint} Transitive MultiPoint object\n */\n\nStyler.prototype.styleMultiPoint = function (display, multipoint) {\n this.applyAttrAndStyle(\n display,\n multipoint.svgGroup.selectAll('.transitive-multipoint-marker-pattern'),\n this.multipoints_pattern\n )\n\n this.applyAttrAndStyle(\n display,\n multipoint.svgGroup.selectAll('.transitive-multipoint-marker-merged'),\n this.multipoints_merged\n )\n\n this.applyAttrAndStyle(\n display,\n multipoint.svgGroup.selectAll('.transitive-multi-label'),\n this.labels\n )\n}\n\n/**\n * Style a WireframeVertex using the rules defined in styles.js or the Transitive options\n *\n * @param {Display} Transitive Display object\n * @param {WireframeVertex} Transitive WireframeVertex object\n */\n\nStyler.prototype.styleWireframeVertex = function (display, wfVertex) {\n this.applyAttrAndStyle(\n display,\n wfVertex.svgGroup.selectAll('.transitive-wireframe-vertex-circle'),\n this.wireframe_vertices\n )\n}\n\n/**\n * Style a Point label using the rules defined in styles.js or the Transitive options\n *\n * @param {Display} Transitive Display object\n * @param {Point} Transitive Point object\n */\n\nStyler.prototype.stylePointLabel = function (display, point) {\n var pointType = point.getType().toLowerCase()\n\n this.applyAttrAndStyle(\n display,\n point.svgGroup.selectAll('.transitive-' + pointType + '-label'),\n this.labels\n )\n}\n\n/**\n * Style a Segment label using the rules defined in styles.js or the Transitive options\n *\n * @param {Display} Transitive Display object\n * @param {SegmentLabel} Transitive SegmentLabel object\n */\n\nStyler.prototype.styleSegmentLabel = function (display, label) {\n this.applyAttrAndStyle(\n display,\n label.svgGroup.selectAll('.transitive-segment-label-container'),\n this.segment_label_containers\n )\n this.applyAttrAndStyle(\n display,\n label.svgGroup.selectAll('.transitive-segment-label'),\n this.segment_labels\n )\n}\n\n/**\n * Check if it's an attribute or a style and apply accordingly\n *\n * @param {Display} the Display object\n * @param {Object} a D3 list of elements\n * @param {Object} the list of attributes\n */\n\nStyler.prototype.applyAttrAndStyle = function (display, elements, attributes) {\n for (var name in attributes) {\n var rules = attributes[name]\n var fn = svgAttributes.indexOf(name) === -1 ? 'style' : 'attr'\n\n this.applyRules(display, elements, name, rules, fn)\n }\n}\n\n/**\n * Apply style/attribute rules to a list of elements\n *\n * @param {Display} display object\n * @param {Object} elements\n * @param {String} rule name\n * @param {Array} rules\n * @param {String} style/attr\n */\n\nStyler.prototype.applyRules = function (display, elements, name, rules, fn) {\n var self = this\n elements[fn](name, function (data, index) {\n return self.compute(rules, display, data, index)\n })\n}\n\n/**\n * Compute a style rule based on the current display and data\n *\n * @param {Array} array of rules\n * @param {Object} the Display object\n * @param {Object} data associated with this object\n * @param {Number} index of this object\n */\n\nStyler.prototype.compute = function (rules, display, data, index) {\n var computed\n var self = this\n for (var i in rules) {\n var rule = rules[i]\n var val = isFunction(rule)\n ? rule.call(self, display, data, index, styles.utils)\n : rule\n if (val !== undefined && val !== null) computed = val\n }\n return computed\n}\n\n/**\n * Return the collection of default segment styles for a mode.\n *\n * @param {String} an OTP mode string\n */\n\nStyler.prototype.getModeStyles = function (mode, display) {\n var modeStyles = {}\n\n // simulate a segment w/ the specified style\n var segment = {\n focused: true,\n isFocused: function () {\n return true\n }\n }\n\n if (mode === 'WALK' || mode === 'BICYCLE' || mode === 'BICYCLE_RENT' || mode === 'CAR') {\n segment.type = mode\n } else { // assume a transit mode\n segment.type = 'TRANSIT'\n segment.mode = Util.otpModeToGtfsType(mode)\n var route = new Route({\n route_type: segment.mode,\n agency_id: '',\n route_id: '',\n route_short_name: '',\n route_long_name: ''\n })\n var pattern = new RoutePattern({})\n route.addPattern(pattern)\n segment.patterns = [pattern]\n }\n\n for (var attrName in this.segments) {\n var rules = this.segments[attrName]\n for (var i in rules) {\n var rule = rules[i]\n var val = isFunction(rule)\n ? rule.call(this, display, segment, 0, styles.utils)\n : rule\n if (val !== undefined && val !== null) {\n modeStyles[attrName] = val\n }\n }\n }\n\n return modeStyles\n}\n\n/**\n * Is function?\n */\n\nfunction isFunction (val) {\n return Object.prototype.toString.call(val) === '[object Function]'\n}\n", - "var d3 = require('d3')\n\n/**\n * Scales for utility functions to use\n */\n\nvar zoomScale = d3.scale.linear().domain([0.25, 1, 4])\nvar strokeScale = d3.scale.linear().domain([0.25, 1, 4]).range([5, 12, 19])\nvar fontScale = d3.scale.linear().domain([0.25, 1, 4]).range([10, 14, 18])\n\n/**\n * Scales for utility functions to use\n */\n\nvar notFocusedColor = '#e0e0e0'\n\n/**\n * Expose `utils` for the style functions to use\n */\n\nexports.utils = {\n pixels: function (zoom, min, normal, max) {\n return zoomScale.range([min, normal, max])(zoom)\n },\n strokeWidth: function (display) {\n return strokeScale(display.zoom.scale())\n },\n fontSize: function (display, data) {\n return Math.floor(fontScale(display.zoom.scale()))\n },\n defineSegmentCircleMarker: function (display, segment, radius, fillColor) {\n var markerId = 'circleMarker-' + segment.getId()\n display.svg.append('defs').append('svg:marker')\n .attr('id', markerId)\n .attr('refX', radius)\n .attr('refY', radius)\n .attr('markerWidth', radius * 2)\n .attr('markerHeight', radius * 2)\n .attr('markerUnits', 'userSpaceOnUse')\n .append('svg:circle')\n .attr('cx', radius)\n .attr('cy', radius)\n .attr('r', radius)\n .attr('fill', segment.focused ? fillColor : notFocusedColor)\n\n return 'url(#' + markerId + ')'\n }\n}\n\n/**\n * Default Wireframe Edge/Vertex Rules\n */\n\nexports.wireframe_vertices = {\n cx: 0,\n cy: 0,\n r: 3,\n fill: '#000'\n}\n\nexports.wireframe_edges = {\n stroke: '#444',\n 'stroke-width': 2,\n 'stroke-dasharray': '3px 2px',\n fill: 'none'\n}\n\n/**\n * Default Merged Stops Rules\n */\n\nvar stopsMerged = exports.stops_merged = {\n fill: function (display, data, index, utils) {\n return '#fff'\n },\n r: function (display, data, index, utils) {\n return utils.pixels(display.zoom.scale(), 8, 12, 16)\n },\n stroke: function (display, data, index, utils) {\n var point = data.owner\n if (!point.isFocused()) return notFocusedColor\n return '#000'\n },\n 'stroke-width': function (display, data, index, utils) {\n return 2\n },\n\n /**\n * Transitive-specific attribute specifying the shape of the main stop marker.\n * Can be 'roundedrect', 'rectangle' or 'circle'\n */\n\n 'marker-type': [\n 'circle',\n function (display, data, index, utils) {\n var point = data.owner\n if ((point.containsBoardPoint() || point.containsAlightPoint()) && !point.containsTransferPoint()) return 'circle'\n }\n ],\n\n /**\n * Transitive-specific attribute specifying any additional padding, in pixels,\n * to apply to main stop marker. A value of zero (default) results in a that\n * marker is flush to the edges of the pattern segment(s) the point is set against.\n * A value greater than zero creates a marker that is larger than the width of\n * the segments(s).\n */\n\n 'marker-padding': 3,\n\n visibility: function (display, data) {\n if (!data.owner.containsSegmentEndPoint()) return 'hidden'\n }\n}\n\n/**\n * Stops Along a Pattern\n */\n\nvar stopsPattern = exports.stops_pattern = {\n cx: 0,\n cy: 0,\n r: [\n 4,\n function (display, data, index, utils) {\n return utils.pixels(display.zoom.scale(), 1, 2, 4)\n },\n function (display, data, index, utils) {\n var point = data.owner\n var busOnly = true\n point.getPatterns().forEach(function (pattern) {\n if (pattern.route && pattern.route.route_type !== 3) busOnly = false\n })\n if (busOnly && !point.containsSegmentEndPoint()) {\n return 0.5 * utils.pixels(display.zoom.scale(), 2, 4, 6.5)\n }\n }\n ],\n stroke: 'none',\n visibility: function (display, data) {\n if (display.zoom.scale() < 1.5) return 'hidden'\n if (data.owner.containsSegmentEndPoint()) return 'hidden'\n }\n}\n\n/**\n * Default place rules\n */\n\nexports.places = {\n cx: 0,\n cy: 0,\n r: 14,\n stroke: '0px',\n fill: '#fff'\n}\n\n/**\n * Default MultiPoint rules -- based on Stop rules\n */\n\nvar multipointsMerged = exports.multipoints_merged = Object.assign({}, stopsMerged)\n\nmultipointsMerged.visibility = true\n\n/**\n * Default Multipoint Stops along a pattern\n */\n\nexports.multipoints_pattern = Object.assign({}, stopsPattern)\n\n/**\n * Default label rules\n */\n\nexports.labels = {\n 'font-size': function (display, data, index, utils) {\n return utils.fontSize(display, data) + 'px'\n },\n 'font-weight': function (display, data, index, utils) {\n var point = data.owner.parent\n if (point.containsBoardPoint() || point.containsAlightPoint()) return 'bold'\n },\n\n /**\n * 'orientations' is a transitive-specific attribute used to specify allowable\n * label placement orientations expressed as one of eight compass directions\n * relative to the point being labeled:\n *\n * 'N'\n * 'NW' | 'NE'\n * \\ | /\n * 'W' -- O -- 'E'\n * / | \\\n * 'SW' | 'SE'\n * 'S\n *\n * Labels oriented 'E' or 'W' are rendered horizontally, 'N' and 'S' vertically,\n * and all others at a 45-degree angle.\n *\n * Returns an array of allowed orientation codes in the order that they will be\n * tried by the labeler.\n */\n\n orientations: [\n ['E', 'W']\n ]\n}\n\n/**\n * All path segments\n * TODO: update old route-pattern-specific code below\n */\n\nexports.segments = {\n stroke: [\n '#008',\n function (display, data) {\n var segment = data\n if (!segment.focused) return notFocusedColor\n if (segment.type === 'TRANSIT') {\n if (segment.patterns) {\n if (segment.patterns[0].route.route_short_name.toLowerCase().substring(\n 0,\n 2) === 'dc') return '#f00'\n return segment.patterns[0].route.getColor()\n }\n } else if (segment.type === 'CAR') {\n return '#888'\n }\n }\n ],\n 'stroke-dasharray': [\n false,\n function (display, data) {\n var segment = data\n if (segment.frequency && segment.frequency.average < 12) {\n if (segment.frequency.average > 6) return '12px, 12px'\n return '12px, 2px'\n }\n }\n ],\n 'stroke-width': [\n '12px',\n function (display, data, index, utils) {\n var segment = data\n\n if (segment.mode === 3) {\n return utils.pixels(display.zoom.scale(), 2, 4, 8) + 'px'\n }\n return utils.pixels(display.zoom.scale(), 4, 8, 12) + 'px'\n }\n ],\n envelope: [\n\n function (display, data, index, utils) {\n var segment = data\n if (segment.type !== 'TRANSIT') {\n return '8px'\n }\n if (segment.mode === 3) {\n return utils.pixels(display.zoom.scale(), 4, 6, 10) + 'px'\n }\n return utils.pixels(display.zoom.scale(), 6, 10, 14) + 'px'\n }\n ]\n}\n\n/**\n * Segments Front\n */\n\nexports.segments_front = {\n stroke: '#008',\n 'stroke-width': function (display, data, index, utils) {\n return utils.pixels(display.zoom.scale(), 3, 6, 10) / 2 + 'px'\n },\n fill: 'none',\n display: [\n 'none',\n function (display, data, index, utils) {\n if (data.pattern && data.pattern.route && data.pattern.route.route_type ===\n 3 &&\n data.pattern.route.route_short_name.toLowerCase().substring(0, 2) ===\n 'dc') {\n return 'inline'\n }\n }\n ]\n}\n\n/**\n * Segments Halo\n */\n\nexports.segments_halo = {\n stroke: '#fff',\n 'stroke-width': function (display, data, index, utils) {\n return data.computeLineWidth(display) + 8\n },\n 'stroke-linecap': 'round',\n fill: 'none'\n}\n\n/**\n * Label Containers\n */\n\nexports.segment_label_containers = {\n fill: function (display, data) {\n if (!data.isFocused()) return notFocusedColor\n },\n 'stroke-width': function (display, data) {\n if (data.parent.pattern && data.parent.pattern.route.route_short_name.toLowerCase()\n .substring(0, 2) === 'dc') return 1\n return 0\n },\n rx: 3,\n ry: 3\n}\n", - "var d3 = require('d3')\nvar Emitter = require('component-emitter')\n\nvar Network = require('./core/network')\n\nvar Display = require('./display')\n\nvar DefaultRenderer = require('./renderer/default-renderer')\nvar WireframeRenderer = require('./renderer/wireframe-renderer')\n\nvar Styler = require('./styler')\nvar Labeler = require('./labeler')\n\nvar SphericalMercator = require('./util/spherical-mercator')\nvar sm = new SphericalMercator()\n\n/*\n * Expose `Transitive`\n */\n\nmodule.exports = Transitive\n\n/**\n * Create a new instance of `Transitive`\n *\n * @param {Object} options object\n * - data {Object} data to render\n * - styles {Object} styles to apply\n * - el {Element} the DOM element to render the main display to\n * - legendEl {Element} the DOM element to render the legend to\n * - drawGrid {Boolean} whether to draw a background grid (defaults to false)\n * - gridCellSize {Number} resolution of the grid in SphericalMercator meters\n * - draggableTypes {Array} a list of network element types to enable dragging for\n * - initialBounds {Array} initial lon/lat bounds for the display expressed as [[west, south], [east, north]]\n * - displayMargins {Object} padding to apply to the initial rendered network within the display. Expressed in pixels for top/bottom/left/right\n * - mapboxId {String} an Mapbox tileset id for rendering background tiles (Deprecated -- use Leaflet with Leaflet.TransitiveLayer)\n * - zoomEnabled {Boolean} whether to enable the display's built-in zoom/pan functionality (defaults to true)\n * - autoResize {Boolean} whether the display should listen for window resize events and update automatically (defaults to true)\n * - groupEdges {Boolean} whether to consider edges with the same origin/destination equivalent for rendering, even if intermediate stop sequence is different (defaults to true)\n */\n\nfunction Transitive (options) {\n console.log('**** trn');\n if (!(this instanceof Transitive)) return new Transitive(options)\n\n this.options = options\n if (this.options.zoomEnabled === undefined) this.options.zoomEnabled = true\n if (this.options.autoResize === undefined) this.options.autoResize = true\n if (this.options.groupEdges === undefined) this.options.groupEdges = true\n\n if (options.el) this.setElement(options.el)\n\n this.data = options.data\n\n this.setRenderer(this.options.initialRenderer || 'default')\n\n this.labeler = new Labeler(this)\n this.styler = new Styler(options.styles)\n}\n\n/**\n * Mixin `Emitter`\n */\n\nEmitter(Transitive.prototype)\n\n/**\n * Clear the Network data and redraw the (empty) map\n */\n\nTransitive.prototype.clearData = function () {\n this.network = this.data = null\n this.labeler.clear()\n this.emit('clear data', this)\n}\n\n/**\n * Update the Network data and redraw the map\n */\n\nTransitive.prototype.updateData = function (data) {\n this.network = null\n this.data = data\n if (this.display) this.display.scaleSet = false\n this.labeler.clear()\n this.emit('update data', this)\n}\n\n/**\n * Return the collection of default segment styles for a mode.\n *\n * @param {String} an OTP mode string\n */\n\nTransitive.prototype.getModeStyles = function (mode) {\n return this.styler.getModeStyles(mode, this.display || new Display(this))\n}\n\n/** Display/Render Methods **/\n\n/**\n * Set the DOM element that serves as the main map canvas\n */\n\nTransitive.prototype.setElement = function (el, legendEl) {\n if (this.el) d3.select(this.el).selectAll('*').remove()\n\n this.el = el\n this.display = new Display(this)\n\n // Emit click events\n var self = this\n this.display.svg.on('click', function () {\n var x = d3.event.x\n var y = d3.event.y\n var geographic = sm.inverse([x, y])\n self.emit('click', {\n x: x,\n y: y,\n lng: geographic[0],\n lat: geographic[1]\n })\n })\n\n this.emit('set element', this, this.el)\n return this\n}\n\n/**\n * Set the DOM element that serves as the main map canvas\n */\n\nTransitive.prototype.setRenderer = function (type) {\n switch (type) {\n case 'wireframe':\n this.renderer = new WireframeRenderer(this)\n break\n case 'default':\n this.renderer = new DefaultRenderer(this)\n break\n }\n}\n\n/**\n * Render\n */\n\nTransitive.prototype.render = function () {\n if (!this.network) {\n this.network = new Network(this, this.data)\n }\n\n if (!this.display.scaleSet) {\n this.display.setScale(this.network.graph.bounds(), this.options)\n }\n\n this.renderer.render()\n\n this.emit('render', this)\n}\n\n/**\n * Render to\n *\n * @param {Element} el\n */\n\nTransitive.prototype.renderTo = function (el) {\n this.setElement(el)\n this.render()\n\n this.emit('render to', this)\n return this\n}\n\n/**\n * Refresh\n */\n\nTransitive.prototype.refresh = function (panning) {\n if (!this.network) {\n this.render()\n }\n\n this.renderer.refresh()\n}\n\n/**\n * focusJourney\n */\n\nTransitive.prototype.focusJourney = function (journeyId) {\n var path = journeyId ? this.network.journeys[journeyId].path : null\n this.renderer.focusPath(path)\n}\n\n/**\n * Sets the Display bounds\n * @param {Array} lon/lat bounds expressed as [[west, south], [east, north]]\n */\n\nTransitive.prototype.setDisplayBounds = function (llBounds) {\n this.display.updateDomains([sm.forward(llBounds[0]), sm.forward(llBounds[1])])\n this.display.zoomChanged()\n}\n\n/**\n * Gets the Network bounds\n * @returns {Array} lon/lat bounds expressed as [[west, south], [east, north]]\n */\n\nTransitive.prototype.getNetworkBounds = function () {\n if (!this.network || !this.network.graph) return null\n var graphBounds = this.network.graph.bounds()\n var ll1 = sm.inverse(graphBounds[0])\n var ll2 = sm.inverse(graphBounds[1])\n return [\n [Math.min(ll1[0], ll2[0]), Math.min(ll1[1], ll2[1])],\n [Math.max(ll1[0], ll2[0]), Math.max(ll1[1], ll2[1])]\n ]\n}\n\n/**\n * resize\n */\n\nTransitive.prototype.resize = function (width, height) {\n if (!this.display) return\n d3.select(this.display.el)\n .style('width', width + 'px')\n .style('height', height + 'px')\n this.display.resized()\n}\n", - "/**\n * General Transitive utilities library\n */\n\nvar d3 = require('d3')\n\nvar tolerance = 0.000001\n\nmodule.exports.fuzzyEquals = function (a, b, tol) {\n tol = tol || tolerance\n return Math.abs(a - b) < tol\n}\n\nmodule.exports.distance = function (x1, y1, x2, y2) {\n return Math.sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1))\n}\n\nmodule.exports.getRadiusFromAngleChord = function (angleR, chordLen) {\n return (chordLen / 2) / Math.sin(angleR / 2)\n}\n\n/*\n * CCW utility function. Accepts 3 coord pairs; result is positive if points\n * have counterclockwise orientation, negative if clockwise, 0 if collinear.\n */\n\nmodule.exports.ccw = function (ax, ay, bx, by, cx, cy) {\n var raw = module.exports.ccwRaw(ax, ay, bx, by, cx, cy)\n return (raw === 0) ? 0 : raw / Math.abs(raw)\n}\n\nmodule.exports.ccwRaw = function (ax, ay, bx, by, cx, cy) {\n return (bx - ax) * (cy - ay) - (cx - ax) * (by - ay)\n}\n\n/*\n * Compute angle formed by three points in cartesian plane using law of cosines\n */\n\nmodule.exports.angleFromThreePoints = function (ax, ay, bx, by, cx, cy) {\n var c = module.exports.distance(ax, ay, bx, by)\n var a = module.exports.distance(bx, by, cx, cy)\n var b = module.exports.distance(ax, ay, cx, cy)\n return Math.acos((a * a + c * c - b * b) / (2 * a * c))\n}\n\nmodule.exports.pointAlongArc = function (x1, y1, x2, y2, r, theta, ccw, t) {\n ccw = Math.abs(ccw) / ccw // convert to 1 or -1\n\n var rot = Math.PI / 2 - Math.abs(theta) / 2\n var vectToCenter = module.exports.normalizeVector(module.exports.rotateVector({\n x: x2 - x1,\n y: y2 - y1\n }, ccw * rot))\n\n // calculate the center of the arc circle\n var cx = x1 + r * vectToCenter.x\n var cy = y1 + r * vectToCenter.y\n\n var vectFromCenter = module.exports.negateVector(vectToCenter)\n rot = Math.abs(theta) * t * ccw\n vectFromCenter = module.exports.normalizeVector(module.exports.rotateVector(\n vectFromCenter, rot))\n\n return {\n x: cx + r * vectFromCenter.x,\n y: cy + r * vectFromCenter.y\n }\n}\n\nmodule.exports.getVectorAngle = function (x, y) {\n var t = Math.atan(y / x)\n\n if (x < 0 && t <= 0) t += Math.PI\n else if (x < 0 && t >= 0) t -= Math.PI\n\n return t\n}\n\nmodule.exports.rayIntersection = function (ax, ay, avx, avy, bx, by, bvx, bvy) {\n var u = ((by - ay) * bvx - (bx - ax) * bvy) / (bvx * avy - bvy * avx)\n var v = ((by - ay) * avx - (bx - ax) * avy) / (bvx * avy - bvy * avx)\n\n return {\n u: u,\n v: v,\n intersect: (u > -tolerance && v > -tolerance)\n }\n}\n\nmodule.exports.lineIntersection = function (x1, y1, x2, y2, x3, y3, x4, y4) {\n var d = (x1 - x2) * (y3 - y4) - (y1 - y2) * (x3 - x4)\n\n if (d === 0) { // lines are parallel\n return {\n intersect: false\n }\n }\n\n return {\n x: ((x1 * y2 - y1 * x2) * (x3 - x4) - (x1 - x2) * (x3 * y4 - y3 * x4)) / d,\n y: ((x1 * y2 - y1 * x2) * (y3 - y4) - (y1 - y2) * (x3 * y4 - y3 * x4)) / d,\n intersect: true\n }\n}\n\n/**\n * Parse a pixel-based style descriptor, returning an number.\n *\n * @param {String/Number}\n */\n\nmodule.exports.parsePixelStyle = function (descriptor) {\n if (typeof descriptor === 'number') return descriptor\n return parseFloat(descriptor.substring(0, descriptor.length - 2), 10)\n}\n\nmodule.exports.isOutwardVector = function (vector) {\n if (!module.exports.fuzzyEquals(vector.x, 0)) return (vector.x > 0)\n return (vector.y > 0)\n}\n\nmodule.exports.getTextBBox = function (text, attrs) {\n var container = d3.select('body').append('svg')\n container.append('text')\n .attr({\n x: -1000,\n y: -1000\n })\n .attr(attrs)\n .text(text)\n var bbox = container.node().getBBox()\n container.remove()\n\n return {\n height: bbox.height,\n width: bbox.width\n }\n}\n\n/**\n * Convert lat/lon coords to spherical mercator meter x/y coords\n */\n\nmodule.exports.latLonToSphericalMercator = function (lat, lon) {\n var r = 6378137\n var x = r * lon * Math.PI / 180\n var y = r * Math.log(Math.tan(Math.PI / 4 + lat * Math.PI / 360))\n return [x, y]\n}\n\n/**\n * vector utilities\n */\n\nmodule.exports.normalizeVector = function (v) {\n var d = Math.sqrt(v.x * v.x + v.y * v.y)\n return {\n x: v.x / d,\n y: v.y / d\n }\n}\n\nmodule.exports.rotateVector = function (v, theta) {\n return {\n x: v.x * Math.cos(theta) - v.y * Math.sin(theta),\n y: v.x * Math.sin(theta) + v.y * Math.cos(theta)\n }\n}\n\nmodule.exports.negateVector = function (v) {\n return {\n x: -v.x,\n y: -v.y\n }\n}\n\nmodule.exports.addVectors = function (v1, v2) {\n return {\n x: v1.x + v2.x,\n y: v1.y + v2.y\n }\n}\n\n/**\n * GTFS utilities\n */\n\nmodule.exports.otpModeToGtfsType = function (otpMode) {\n switch (otpMode) {\n case 'TRAM':\n return 0\n case 'SUBWAY':\n return 1\n case 'RAIL':\n return 2\n case 'BUS':\n return 3\n case 'FERRY':\n return 4\n case 'CABLE_CAR':\n return 5\n case 'GONDOLA':\n return 6\n case 'FUNICULAR':\n return 7\n }\n}\n", - "/**\n * Line interpolation utility function\n *\n * @param {Array} points\n */\n\nvar Util = require('./index')\n\nmodule.exports = function (points) {\n var newPoints, i, r\n\n // determine if we need to resample the path (i.e. place new points at a regular\n // interval for marker-based styling) based on styler settings\n var resampleSpacing = this.display.styler.compute(this.display.styler.segments['marker-spacing'], this.display, this.segment)\n\n // handle the case of a simple straight line\n if (points.length === 2) {\n if (resampleSpacing) {\n newPoints = [points[0]]\n newPoints = newPoints.concat(resampleLine(points[0], points[1],\n resampleSpacing))\n return newPoints.join(' ')\n }\n return points.join(' ')\n }\n\n // otherwise, assume a curved segment\n\n if (resampleSpacing) {\n newPoints = [points[0]]\n for (i = 1; i < points.length; i++) {\n if (this.segment.renderData[i].arc) {\n // debug(this.renderData[i]);\n // var r = this.renderData[i].radius;\n // var sweep = (this.renderData[i].arc > 0) ? 0 : 1;\n // str += 'A ' + r + ',' + r + ' 0 0 ' + sweep + ' ' + points[i];\n r = this.segment.renderData[i].radius\n var theta = this.segment.renderData[i].arc * Math.PI / 180\n newPoints = newPoints.concat(resampleArc(points[i - 1], points[i], r,\n theta, -this.segment.renderData[i].arc, resampleSpacing))\n } else {\n newPoints = newPoints.concat(resampleLine(points[i - 1], points[i],\n resampleSpacing))\n }\n }\n return newPoints.join(' ')\n } else {\n var str = points[0]\n for (i = 1; i < points.length; i++) {\n if (this.segment.renderData[i].arc) {\n r = this.segment.renderData[i].radius\n var sweep = (this.segment.renderData[i].arc > 0) ? 0 : 1\n str += 'A ' + r + ',' + r + ' 0 0 ' + sweep + ' ' + points[i]\n } else {\n str += 'L' + points[i]\n }\n }\n return str\n }\n}\n\nfunction resampleLine (startPt, endPt, spacing) {\n var dx = endPt[0] - startPt[0]\n var dy = endPt[1] - startPt[1]\n var len = Math.sqrt(dx * dx + dy * dy)\n\n var sampledPts = [startPt]\n for (var l = spacing; l < len; l += spacing) {\n var t = l / len\n sampledPts.push([startPt[0] + t * dx, startPt[1] + t * dy])\n }\n\n sampledPts.push(endPt)\n\n return sampledPts\n}\n\nfunction resampleArc (startPt, endPt, r, theta, ccw, spacing) {\n var len = r * Math.abs(theta)\n\n var sampledPts = []\n for (var l = spacing; l < len; l += spacing) {\n var t = l / len\n var pt = Util.pointAlongArc(startPt[0], startPt[1], endPt[0], endPt[1], r,\n Math.abs(theta), ccw, t)\n sampledPts.push([pt.x, pt.y])\n }\n\n return sampledPts\n}\n", - "module.exports.decode = function (polyline) {\n var currentPosition = 0\n\n var currentLat = 0\n var currentLng = 0\n\n var dataLength = polyline.length\n\n var polylineLatLngs = []\n\n while (currentPosition < dataLength) {\n var shift = 0\n var result = 0\n\n var byte\n\n do {\n byte = polyline.charCodeAt(currentPosition++) - 63\n result |= (byte & 0x1f) << shift\n shift += 5\n } while (byte >= 0x20)\n\n var deltaLat = ((result & 1) ? ~(result >> 1) : (result >> 1))\n currentLat += deltaLat\n\n shift = 0\n result = 0\n\n do {\n byte = polyline.charCodeAt(currentPosition++) - 63\n result |= (byte & 0x1f) << shift\n shift += 5\n } while (byte >= 0x20)\n\n var deltLng = ((result & 1) ? ~(result >> 1) : (result >> 1))\n\n currentLng += deltLng\n\n polylineLatLngs.push([currentLat * 0.00001, currentLng * 0.00001])\n }\n return polylineLatLngs\n}\n", - "var SphericalMercator = (function () {\n // Closures including constants and other precalculated values.\n var cache = {}\n // var EPSLN = 1.0e-10\n var D2R = Math.PI / 180\n var R2D = 180 / Math.PI\n // 900913 properties.\n var A = 6378137\n var MAXEXTENT = 20037508.34\n\n // SphericalMercator constructor: precaches calculations\n // for fast tile lookups.\n function SphericalMercator (options) {\n options = options || {}\n this.size = options.size || 256\n if (!cache[this.size]) {\n var size = this.size\n var c = cache[this.size] = {}\n c.Bc = []\n c.Cc = []\n c.zc = []\n c.Ac = []\n for (var d = 0; d < 30; d++) {\n c.Bc.push(size / 360)\n c.Cc.push(size / (2 * Math.PI))\n c.zc.push(size / 2)\n c.Ac.push(size)\n size *= 2\n }\n }\n this.Bc = cache[this.size].Bc\n this.Cc = cache[this.size].Cc\n this.zc = cache[this.size].zc\n this.Ac = cache[this.size].Ac\n }\n\n // Convert lon lat to screen pixel value\n //\n // - `ll` {Array} `[lon, lat]` array of geographic coordinates.\n // - `zoom` {Number} zoom level.\n SphericalMercator.prototype.px = function (ll, zoom) {\n var d = this.zc[zoom]\n var f = Math.min(Math.max(Math.sin(D2R * ll[1]), -0.9999), 0.9999)\n var x = Math.round(d + ll[0] * this.Bc[zoom])\n var y = Math.round(d + 0.5 * Math.log((1 + f) / (1 - f)) * (-this.Cc[zoom]))\n if (x > this.Ac[zoom]) x = this.Ac[zoom]\n if (y > this.Ac[zoom]) y = this.Ac[zoom]\n // (x < 0) && (x = 0);\n // (y < 0) && (y = 0);\n return [x, y]\n }\n\n // Convert screen pixel value to lon lat\n //\n // - `px` {Array} `[x, y]` array of geographic coordinates.\n // - `zoom` {Number} zoom level.\n SphericalMercator.prototype.ll = function (px, zoom) {\n var g = (px[1] - this.zc[zoom]) / (-this.Cc[zoom])\n var lon = (px[0] - this.zc[zoom]) / this.Bc[zoom]\n var lat = R2D * (2 * Math.atan(Math.exp(g)) - 0.5 * Math.PI)\n return [lon, lat]\n }\n\n // Convert tile xyz value to bbox of the form `[w, s, e, n]`\n //\n // - `x` {Number} x (longitude) number.\n // - `y` {Number} y (latitude) number.\n // - `zoom` {Number} zoom.\n // - `tms_style` {Boolean} whether to compute using tms-style.\n // - `srs` {String} projection for resulting bbox (WGS84|900913).\n // - `return` {Array} bbox array of values in form `[w, s, e, n]`.\n SphericalMercator.prototype.bbox = function (x, y, zoom, tmsStyle, srs) {\n // Convert xyz into bbox with srs WGS84\n if (tmsStyle) {\n y = (Math.pow(2, zoom) - 1) - y\n }\n // Use +y to make sure it's a number to avoid inadvertent concatenation.\n var ll = [x * this.size, (+y + 1) * this.size] // lower left\n // Use +x to make sure it's a number to avoid inadvertent concatenation.\n var ur = [(+x + 1) * this.size, y * this.size] // upper right\n var bbox = this.ll(ll, zoom).concat(this.ll(ur, zoom))\n\n // If web mercator requested reproject to 900913.\n if (srs === '900913') {\n return this.convert(bbox, '900913')\n } else {\n return bbox\n }\n }\n\n // Convert bbox to xyx bounds\n //\n // - `bbox` {Number} bbox in the form `[w, s, e, n]`.\n // - `zoom` {Number} zoom.\n // - `tms_style` {Boolean} whether to compute using tms-style.\n // - `srs` {String} projection of input bbox (WGS84|900913).\n // - `@return` {Object} XYZ bounds containing minX, maxX, minY, maxY properties.\n SphericalMercator.prototype.xyz = function (bbox, zoom, tmsStyle, srs) {\n // If web mercator provided reproject to WGS84.\n if (srs === '900913') {\n bbox = this.convert(bbox, 'WGS84')\n }\n\n var ll = [bbox[0], bbox[1]] // lower left\n var ur = [bbox[2], bbox[3]] // upper right\n var pxll = this.px(ll, zoom)\n var pxur = this.px(ur, zoom)\n // Y = 0 for XYZ is the top hence minY uses px_ur[1].\n var bounds = {\n minX: Math.floor(pxll[0] / this.size),\n minY: Math.floor(pxur[1] / this.size),\n maxX: Math.floor((pxur[0] - 1) / this.size),\n maxY: Math.floor((pxll[1] - 1) / this.size)\n }\n if (tmsStyle) {\n var tms = {\n minY: (Math.pow(2, zoom) - 1) - bounds.maxY,\n maxY: (Math.pow(2, zoom) - 1) - bounds.minY\n }\n bounds.minY = tms.minY\n bounds.maxY = tms.maxY\n }\n return bounds\n }\n\n // Convert projection of given bbox.\n //\n // - `bbox` {Number} bbox in the form `[w, s, e, n]`.\n // - `to` {String} projection of output bbox (WGS84|900913). Input bbox\n // assumed to be the \"other\" projection.\n // - `@return` {Object} bbox with reprojected coordinates.\n SphericalMercator.prototype.convert = function (bbox, to) {\n if (to === '900913') {\n return this.forward(bbox.slice(0, 2)).concat(this.forward(bbox.slice(\n 2,\n 4)))\n } else {\n return this.inverse(bbox.slice(0, 2)).concat(this.inverse(bbox.slice(\n 2,\n 4)))\n }\n }\n\n // Convert lon/lat values to 900913 x/y.\n SphericalMercator.prototype.forward = function (ll) {\n var xy = [\n A * ll[0] * D2R,\n A * Math.log(Math.tan((Math.PI * 0.25) + (0.5 * ll[1] * D2R)))\n ]\n // if xy value is beyond maxextent (e.g. poles), return maxextent.\n if (xy[0] > MAXEXTENT) xy[0] = MAXEXTENT\n if (xy[0] < -MAXEXTENT) xy[0] = -MAXEXTENT\n if (xy[1] > MAXEXTENT) xy[1] = MAXEXTENT\n if (xy[1] < -MAXEXTENT) xy[1] = -MAXEXTENT\n return xy\n }\n\n // Convert 900913 x/y values to lon/lat.\n SphericalMercator.prototype.inverse = function (xy) {\n return [\n (xy[0] * R2D / A), ((Math.PI * 0.5) - 2.0 * Math.atan(Math.exp(-xy[1] / A))) * R2D\n ]\n }\n\n return SphericalMercator\n})()\n\nif (typeof module !== 'undefined' && typeof exports !== 'undefined') {\n module.exports = exports = SphericalMercator\n}\n", - "(function (global, factory) {\n if (typeof define === \"function\" && define.amd) define(factory);\n else if (typeof module === \"object\") module.exports = factory();\n else global.augment = factory();\n}(this, function () {\n \"use strict\";\n\n var Factory = function () {};\n var slice = Array.prototype.slice;\n\n var augment = function (base, body) {\n var uber = Factory.prototype = typeof base === \"function\" ? base.prototype : base;\n var prototype = new Factory, properties = body.apply(prototype, slice.call(arguments, 2).concat(uber));\n if (typeof properties === \"object\") for (var key in properties) prototype[key] = properties[key];\n if (!prototype.hasOwnProperty(\"constructor\")) return prototype;\n var constructor = prototype.constructor;\n constructor.prototype = prototype;\n return constructor;\n };\n\n augment.defclass = function (prototype) {\n var constructor = prototype.constructor;\n constructor.prototype = prototype;\n return constructor;\n };\n\n augment.extend = function (base, body) {\n return augment(base, function (uber) {\n this.uber = uber;\n return body;\n });\n };\n\n return augment;\n}));", - "module.exports = { \"default\": require(\"core-js/library/fn/object/assign\"), __esModule: true };", - "module.exports = { \"default\": require(\"core-js/library/fn/object/keys\"), __esModule: true };", - "require('../../modules/es6.object.assign');\nmodule.exports = require('../../modules/_core').Object.assign;", - "require('../../modules/es6.object.keys');\nmodule.exports = require('../../modules/_core').Object.keys;", - "module.exports = function(it){\n if(typeof it != 'function')throw TypeError(it + ' is not a function!');\n return it;\n};", - "var isObject = require('./_is-object');\nmodule.exports = function(it){\n if(!isObject(it))throw TypeError(it + ' is not an object!');\n return it;\n};", - "// false -> Array#indexOf\n// true -> Array#includes\nvar toIObject = require('./_to-iobject')\n , toLength = require('./_to-length')\n , toIndex = require('./_to-index');\nmodule.exports = function(IS_INCLUDES){\n return function($this, el, fromIndex){\n var O = toIObject($this)\n , length = toLength(O.length)\n , index = toIndex(fromIndex, length)\n , value;\n // Array#includes uses SameValueZero equality algorithm\n if(IS_INCLUDES && el != el)while(length > index){\n value = O[index++];\n if(value != value)return true;\n // Array#toIndex ignores holes, Array#includes - not\n } else for(;length > index; index++)if(IS_INCLUDES || index in O){\n if(O[index] === el)return IS_INCLUDES || index || 0;\n } return !IS_INCLUDES && -1;\n };\n};", - "var toString = {}.toString;\n\nmodule.exports = function(it){\n return toString.call(it).slice(8, -1);\n};", - "var core = module.exports = {version: '2.4.0'};\nif(typeof __e == 'number')__e = core; // eslint-disable-line no-undef", - "// optional / simple context binding\nvar aFunction = require('./_a-function');\nmodule.exports = function(fn, that, length){\n aFunction(fn);\n if(that === undefined)return fn;\n switch(length){\n case 1: return function(a){\n return fn.call(that, a);\n };\n case 2: return function(a, b){\n return fn.call(that, a, b);\n };\n case 3: return function(a, b, c){\n return fn.call(that, a, b, c);\n };\n }\n return function(/* ...args */){\n return fn.apply(that, arguments);\n };\n};", - "// 7.2.1 RequireObjectCoercible(argument)\nmodule.exports = function(it){\n if(it == undefined)throw TypeError(\"Can't call method on \" + it);\n return it;\n};", - "// Thank's IE8 for his funny defineProperty\nmodule.exports = !require('./_fails')(function(){\n return Object.defineProperty({}, 'a', {get: function(){ return 7; }}).a != 7;\n});", - "var isObject = require('./_is-object')\n , document = require('./_global').document\n // in old IE typeof document.createElement is 'object'\n , is = isObject(document) && isObject(document.createElement);\nmodule.exports = function(it){\n return is ? document.createElement(it) : {};\n};", - "// IE 8- don't enum bug keys\nmodule.exports = (\n 'constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf'\n).split(',');", - "var global = require('./_global')\n , core = require('./_core')\n , ctx = require('./_ctx')\n , hide = require('./_hide')\n , PROTOTYPE = 'prototype';\n\nvar $export = function(type, name, source){\n var IS_FORCED = type & $export.F\n , IS_GLOBAL = type & $export.G\n , IS_STATIC = type & $export.S\n , IS_PROTO = type & $export.P\n , IS_BIND = type & $export.B\n , IS_WRAP = type & $export.W\n , exports = IS_GLOBAL ? core : core[name] || (core[name] = {})\n , expProto = exports[PROTOTYPE]\n , target = IS_GLOBAL ? global : IS_STATIC ? global[name] : (global[name] || {})[PROTOTYPE]\n , key, own, out;\n if(IS_GLOBAL)source = name;\n for(key in source){\n // contains in native\n own = !IS_FORCED && target && target[key] !== undefined;\n if(own && key in exports)continue;\n // export native or passed\n out = own ? target[key] : source[key];\n // prevent global pollution for namespaces\n exports[key] = IS_GLOBAL && typeof target[key] != 'function' ? source[key]\n // bind timers to global for call from export context\n : IS_BIND && own ? ctx(out, global)\n // wrap global constructors for prevent change them in library\n : IS_WRAP && target[key] == out ? (function(C){\n var F = function(a, b, c){\n if(this instanceof C){\n switch(arguments.length){\n case 0: return new C;\n case 1: return new C(a);\n case 2: return new C(a, b);\n } return new C(a, b, c);\n } return C.apply(this, arguments);\n };\n F[PROTOTYPE] = C[PROTOTYPE];\n return F;\n // make static versions for prototype methods\n })(out) : IS_PROTO && typeof out == 'function' ? ctx(Function.call, out) : out;\n // export proto methods to core.%CONSTRUCTOR%.methods.%NAME%\n if(IS_PROTO){\n (exports.virtual || (exports.virtual = {}))[key] = out;\n // export proto methods to core.%CONSTRUCTOR%.prototype.%NAME%\n if(type & $export.R && expProto && !expProto[key])hide(expProto, key, out);\n }\n }\n};\n// type bitmap\n$export.F = 1; // forced\n$export.G = 2; // global\n$export.S = 4; // static\n$export.P = 8; // proto\n$export.B = 16; // bind\n$export.W = 32; // wrap\n$export.U = 64; // safe\n$export.R = 128; // real proto method for `library` \nmodule.exports = $export;", - "module.exports = function(exec){\n try {\n return !!exec();\n } catch(e){\n return true;\n }\n};", - "// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028\nvar global = module.exports = typeof window != 'undefined' && window.Math == Math\n ? window : typeof self != 'undefined' && self.Math == Math ? self : Function('return this')();\nif(typeof __g == 'number')__g = global; // eslint-disable-line no-undef", - "var hasOwnProperty = {}.hasOwnProperty;\nmodule.exports = function(it, key){\n return hasOwnProperty.call(it, key);\n};", - "var dP = require('./_object-dp')\n , createDesc = require('./_property-desc');\nmodule.exports = require('./_descriptors') ? function(object, key, value){\n return dP.f(object, key, createDesc(1, value));\n} : function(object, key, value){\n object[key] = value;\n return object;\n};", - "module.exports = !require('./_descriptors') && !require('./_fails')(function(){\n return Object.defineProperty(require('./_dom-create')('div'), 'a', {get: function(){ return 7; }}).a != 7;\n});", - "// fallback for non-array-like ES3 and non-enumerable old V8 strings\nvar cof = require('./_cof');\nmodule.exports = Object('z').propertyIsEnumerable(0) ? Object : function(it){\n return cof(it) == 'String' ? it.split('') : Object(it);\n};", - "module.exports = function(it){\n return typeof it === 'object' ? it !== null : typeof it === 'function';\n};", - "'use strict';\n// 19.1.2.1 Object.assign(target, source, ...)\nvar getKeys = require('./_object-keys')\n , gOPS = require('./_object-gops')\n , pIE = require('./_object-pie')\n , toObject = require('./_to-object')\n , IObject = require('./_iobject')\n , $assign = Object.assign;\n\n// should work with symbols and should have deterministic property order (V8 bug)\nmodule.exports = !$assign || require('./_fails')(function(){\n var A = {}\n , B = {}\n , S = Symbol()\n , K = 'abcdefghijklmnopqrst';\n A[S] = 7;\n K.split('').forEach(function(k){ B[k] = k; });\n return $assign({}, A)[S] != 7 || Object.keys($assign({}, B)).join('') != K;\n}) ? function assign(target, source){ // eslint-disable-line no-unused-vars\n var T = toObject(target)\n , aLen = arguments.length\n , index = 1\n , getSymbols = gOPS.f\n , isEnum = pIE.f;\n while(aLen > index){\n var S = IObject(arguments[index++])\n , keys = getSymbols ? getKeys(S).concat(getSymbols(S)) : getKeys(S)\n , length = keys.length\n , j = 0\n , key;\n while(length > j)if(isEnum.call(S, key = keys[j++]))T[key] = S[key];\n } return T;\n} : $assign;", - "var anObject = require('./_an-object')\n , IE8_DOM_DEFINE = require('./_ie8-dom-define')\n , toPrimitive = require('./_to-primitive')\n , dP = Object.defineProperty;\n\nexports.f = require('./_descriptors') ? Object.defineProperty : function defineProperty(O, P, Attributes){\n anObject(O);\n P = toPrimitive(P, true);\n anObject(Attributes);\n if(IE8_DOM_DEFINE)try {\n return dP(O, P, Attributes);\n } catch(e){ /* empty */ }\n if('get' in Attributes || 'set' in Attributes)throw TypeError('Accessors not supported!');\n if('value' in Attributes)O[P] = Attributes.value;\n return O;\n};", - "exports.f = Object.getOwnPropertySymbols;", - "var has = require('./_has')\n , toIObject = require('./_to-iobject')\n , arrayIndexOf = require('./_array-includes')(false)\n , IE_PROTO = require('./_shared-key')('IE_PROTO');\n\nmodule.exports = function(object, names){\n var O = toIObject(object)\n , i = 0\n , result = []\n , key;\n for(key in O)if(key != IE_PROTO)has(O, key) && result.push(key);\n // Don't enum bug & hidden keys\n while(names.length > i)if(has(O, key = names[i++])){\n ~arrayIndexOf(result, key) || result.push(key);\n }\n return result;\n};", - "// 19.1.2.14 / 15.2.3.14 Object.keys(O)\nvar $keys = require('./_object-keys-internal')\n , enumBugKeys = require('./_enum-bug-keys');\n\nmodule.exports = Object.keys || function keys(O){\n return $keys(O, enumBugKeys);\n};", - "exports.f = {}.propertyIsEnumerable;", - "// most Object methods by ES6 should accept primitives\nvar $export = require('./_export')\n , core = require('./_core')\n , fails = require('./_fails');\nmodule.exports = function(KEY, exec){\n var fn = (core.Object || {})[KEY] || Object[KEY]\n , exp = {};\n exp[KEY] = exec(fn);\n $export($export.S + $export.F * fails(function(){ fn(1); }), 'Object', exp);\n};", - "module.exports = function(bitmap, value){\n return {\n enumerable : !(bitmap & 1),\n configurable: !(bitmap & 2),\n writable : !(bitmap & 4),\n value : value\n };\n};", - "var shared = require('./_shared')('keys')\n , uid = require('./_uid');\nmodule.exports = function(key){\n return shared[key] || (shared[key] = uid(key));\n};", - "var global = require('./_global')\n , SHARED = '__core-js_shared__'\n , store = global[SHARED] || (global[SHARED] = {});\nmodule.exports = function(key){\n return store[key] || (store[key] = {});\n};", - "var toInteger = require('./_to-integer')\n , max = Math.max\n , min = Math.min;\nmodule.exports = function(index, length){\n index = toInteger(index);\n return index < 0 ? max(index + length, 0) : min(index, length);\n};", - "// 7.1.4 ToInteger\nvar ceil = Math.ceil\n , floor = Math.floor;\nmodule.exports = function(it){\n return isNaN(it = +it) ? 0 : (it > 0 ? floor : ceil)(it);\n};", - "// to indexed object, toObject with fallback for non-array-like ES3 strings\nvar IObject = require('./_iobject')\n , defined = require('./_defined');\nmodule.exports = function(it){\n return IObject(defined(it));\n};", - "// 7.1.15 ToLength\nvar toInteger = require('./_to-integer')\n , min = Math.min;\nmodule.exports = function(it){\n return it > 0 ? min(toInteger(it), 0x1fffffffffffff) : 0; // pow(2, 53) - 1 == 9007199254740991\n};", - "// 7.1.13 ToObject(argument)\nvar defined = require('./_defined');\nmodule.exports = function(it){\n return Object(defined(it));\n};", - "// 7.1.1 ToPrimitive(input [, PreferredType])\nvar isObject = require('./_is-object');\n// instead of the ES6 spec version, we didn't implement @@toPrimitive case\n// and the second argument - flag - preferred type is a string\nmodule.exports = function(it, S){\n if(!isObject(it))return it;\n var fn, val;\n if(S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it)))return val;\n if(typeof (fn = it.valueOf) == 'function' && !isObject(val = fn.call(it)))return val;\n if(!S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it)))return val;\n throw TypeError(\"Can't convert object to primitive value\");\n};", - "var id = 0\n , px = Math.random();\nmodule.exports = function(key){\n return 'Symbol('.concat(key === undefined ? '' : key, ')_', (++id + px).toString(36));\n};", - "// 19.1.3.1 Object.assign(target, source)\nvar $export = require('./_export');\n\n$export($export.S + $export.F, 'Object', {assign: require('./_object-assign')});", - "// 19.1.2.14 Object.keys(O)\nvar toObject = require('./_to-object')\n , $keys = require('./_object-keys');\n\nrequire('./_object-sap')('keys', function(){\n return function keys(it){\n return $keys(toObject(it));\n };\n});", - "\n/**\n * Module dependencies.\n */\n\ntry {\n var type = require('type');\n} catch (err) {\n var type = require('component-type');\n}\n\nvar toFunction = require('to-function');\n\n/**\n * HOP reference.\n */\n\nvar has = Object.prototype.hasOwnProperty;\n\n/**\n * Iterate the given `obj` and invoke `fn(val, i)`\n * in optional context `ctx`.\n *\n * @param {String|Array|Object} obj\n * @param {Function} fn\n * @param {Object} [ctx]\n * @api public\n */\n\nmodule.exports = function(obj, fn, ctx){\n fn = toFunction(fn);\n ctx = ctx || this;\n switch (type(obj)) {\n case 'array':\n return array(obj, fn, ctx);\n case 'object':\n if ('number' == typeof obj.length) return array(obj, fn, ctx);\n return object(obj, fn, ctx);\n case 'string':\n return string(obj, fn, ctx);\n }\n};\n\n/**\n * Iterate string chars.\n *\n * @param {String} obj\n * @param {Function} fn\n * @param {Object} ctx\n * @api private\n */\n\nfunction string(obj, fn, ctx) {\n for (var i = 0; i < obj.length; ++i) {\n fn.call(ctx, obj.charAt(i), i);\n }\n}\n\n/**\n * Iterate object keys.\n *\n * @param {Object} obj\n * @param {Function} fn\n * @param {Object} ctx\n * @api private\n */\n\nfunction object(obj, fn, ctx) {\n for (var key in obj) {\n if (has.call(obj, key)) {\n fn.call(ctx, key, obj[key]);\n }\n }\n}\n\n/**\n * Iterate array-ish.\n *\n * @param {Array|Object} obj\n * @param {Function} fn\n * @param {Object} ctx\n * @api private\n */\n\nfunction array(obj, fn, ctx) {\n for (var i = 0; i < obj.length; ++i) {\n fn.call(ctx, obj[i], i);\n }\n}\n", - "\r\n/**\r\n * Expose `Emitter`.\r\n */\r\n\r\nif (typeof module !== 'undefined') {\r\n module.exports = Emitter;\r\n}\r\n\r\n/**\r\n * Initialize a new `Emitter`.\r\n *\r\n * @api public\r\n */\r\n\r\nfunction Emitter(obj) {\r\n if (obj) return mixin(obj);\r\n};\r\n\r\n/**\r\n * Mixin the emitter properties.\r\n *\r\n * @param {Object} obj\r\n * @return {Object}\r\n * @api private\r\n */\r\n\r\nfunction mixin(obj) {\r\n for (var key in Emitter.prototype) {\r\n obj[key] = Emitter.prototype[key];\r\n }\r\n return obj;\r\n}\r\n\r\n/**\r\n * Listen on the given `event` with `fn`.\r\n *\r\n * @param {String} event\r\n * @param {Function} fn\r\n * @return {Emitter}\r\n * @api public\r\n */\r\n\r\nEmitter.prototype.on =\r\nEmitter.prototype.addEventListener = function(event, fn){\r\n this._callbacks = this._callbacks || {};\r\n (this._callbacks['$' + event] = this._callbacks['$' + event] || [])\r\n .push(fn);\r\n return this;\r\n};\r\n\r\n/**\r\n * Adds an `event` listener that will be invoked a single\r\n * time then automatically removed.\r\n *\r\n * @param {String} event\r\n * @param {Function} fn\r\n * @return {Emitter}\r\n * @api public\r\n */\r\n\r\nEmitter.prototype.once = function(event, fn){\r\n function on() {\r\n this.off(event, on);\r\n fn.apply(this, arguments);\r\n }\r\n\r\n on.fn = fn;\r\n this.on(event, on);\r\n return this;\r\n};\r\n\r\n/**\r\n * Remove the given callback for `event` or all\r\n * registered callbacks.\r\n *\r\n * @param {String} event\r\n * @param {Function} fn\r\n * @return {Emitter}\r\n * @api public\r\n */\r\n\r\nEmitter.prototype.off =\r\nEmitter.prototype.removeListener =\r\nEmitter.prototype.removeAllListeners =\r\nEmitter.prototype.removeEventListener = function(event, fn){\r\n this._callbacks = this._callbacks || {};\r\n\r\n // all\r\n if (0 == arguments.length) {\r\n this._callbacks = {};\r\n return this;\r\n }\r\n\r\n // specific event\r\n var callbacks = this._callbacks['$' + event];\r\n if (!callbacks) return this;\r\n\r\n // remove all handlers\r\n if (1 == arguments.length) {\r\n delete this._callbacks['$' + event];\r\n return this;\r\n }\r\n\r\n // remove specific handler\r\n var cb;\r\n for (var i = 0; i < callbacks.length; i++) {\r\n cb = callbacks[i];\r\n if (cb === fn || cb.fn === fn) {\r\n callbacks.splice(i, 1);\r\n break;\r\n }\r\n }\r\n return this;\r\n};\r\n\r\n/**\r\n * Emit `event` with the given args.\r\n *\r\n * @param {String} event\r\n * @param {Mixed} ...\r\n * @return {Emitter}\r\n */\r\n\r\nEmitter.prototype.emit = function(event){\r\n this._callbacks = this._callbacks || {};\r\n var args = [].slice.call(arguments, 1)\r\n , callbacks = this._callbacks['$' + event];\r\n\r\n if (callbacks) {\r\n callbacks = callbacks.slice(0);\r\n for (var i = 0, len = callbacks.length; i < len; ++i) {\r\n callbacks[i].apply(this, args);\r\n }\r\n }\r\n\r\n return this;\r\n};\r\n\r\n/**\r\n * Return array of callbacks for `event`.\r\n *\r\n * @param {String} event\r\n * @return {Array}\r\n * @api public\r\n */\r\n\r\nEmitter.prototype.listeners = function(event){\r\n this._callbacks = this._callbacks || {};\r\n return this._callbacks['$' + event] || [];\r\n};\r\n\r\n/**\r\n * Check if this emitter has `event` handlers.\r\n *\r\n * @param {String} event\r\n * @return {Boolean}\r\n * @api public\r\n */\r\n\r\nEmitter.prototype.hasListeners = function(event){\r\n return !! this.listeners(event).length;\r\n};\r\n", - "/**\n * Global Names\n */\n\nvar globals = /\\b(Array|Date|Object|Math|JSON)\\b/g;\n\n/**\n * Return immediate identifiers parsed from `str`.\n *\n * @param {String} str\n * @param {String|Function} map function or prefix\n * @return {Array}\n * @api public\n */\n\nmodule.exports = function(str, fn){\n var p = unique(props(str));\n if (fn && 'string' == typeof fn) fn = prefixed(fn);\n if (fn) return map(str, p, fn);\n return p;\n};\n\n/**\n * Return immediate identifiers in `str`.\n *\n * @param {String} str\n * @return {Array}\n * @api private\n */\n\nfunction props(str) {\n return str\n .replace(/\\.\\w+|\\w+ *\\(|\"[^\"]*\"|'[^']*'|\\/([^/]+)\\//g, '')\n .replace(globals, '')\n .match(/[a-zA-Z_]\\w*/g)\n || [];\n}\n\n/**\n * Return `str` with `props` mapped with `fn`.\n *\n * @param {String} str\n * @param {Array} props\n * @param {Function} fn\n * @return {String}\n * @api private\n */\n\nfunction map(str, props, fn) {\n var re = /\\.\\w+|\\w+ *\\(|\"[^\"]*\"|'[^']*'|\\/([^/]+)\\/|[a-zA-Z_]\\w*/g;\n return str.replace(re, function(_){\n if ('(' == _[_.length - 1]) return fn(_);\n if (!~props.indexOf(_)) return _;\n return fn(_);\n });\n}\n\n/**\n * Return unique array.\n *\n * @param {Array} arr\n * @return {Array}\n * @api private\n */\n\nfunction unique(arr) {\n var ret = [];\n\n for (var i = 0; i < arr.length; i++) {\n if (~ret.indexOf(arr[i])) continue;\n ret.push(arr[i]);\n }\n\n return ret;\n}\n\n/**\n * Map with prefix `str`.\n */\n\nfunction prefixed(str) {\n return function(_){\n return str + _;\n };\n}\n", - "\n/**\n * toString ref.\n */\n\nvar toString = Object.prototype.toString;\n\n/**\n * Return the type of `val`.\n *\n * @param {Mixed} val\n * @return {String}\n * @api public\n */\n\nmodule.exports = function(val){\n switch (toString.call(val)) {\n case '[object Function]': return 'function';\n case '[object Date]': return 'date';\n case '[object RegExp]': return 'regexp';\n case '[object Arguments]': return 'arguments';\n case '[object Array]': return 'array';\n case '[object String]': return 'string';\n }\n\n if (val === null) return 'null';\n if (val === undefined) return 'undefined';\n if (val && val.nodeType === 1) return 'element';\n if (val === Object(val)) return 'object';\n\n return typeof val;\n};\n", - "!function() {\n var d3 = {\n version: \"3.5.17\"\n };\n var d3_arraySlice = [].slice, d3_array = function(list) {\n return d3_arraySlice.call(list);\n };\n var d3_document = this.document;\n function d3_documentElement(node) {\n return node && (node.ownerDocument || node.document || node).documentElement;\n }\n function d3_window(node) {\n return node && (node.ownerDocument && node.ownerDocument.defaultView || node.document && node || node.defaultView);\n }\n if (d3_document) {\n try {\n d3_array(d3_document.documentElement.childNodes)[0].nodeType;\n } catch (e) {\n d3_array = function(list) {\n var i = list.length, array = new Array(i);\n while (i--) array[i] = list[i];\n return array;\n };\n }\n }\n if (!Date.now) Date.now = function() {\n return +new Date();\n };\n if (d3_document) {\n try {\n d3_document.createElement(\"DIV\").style.setProperty(\"opacity\", 0, \"\");\n } catch (error) {\n var d3_element_prototype = this.Element.prototype, d3_element_setAttribute = d3_element_prototype.setAttribute, d3_element_setAttributeNS = d3_element_prototype.setAttributeNS, d3_style_prototype = this.CSSStyleDeclaration.prototype, d3_style_setProperty = d3_style_prototype.setProperty;\n d3_element_prototype.setAttribute = function(name, value) {\n d3_element_setAttribute.call(this, name, value + \"\");\n };\n d3_element_prototype.setAttributeNS = function(space, local, value) {\n d3_element_setAttributeNS.call(this, space, local, value + \"\");\n };\n d3_style_prototype.setProperty = function(name, value, priority) {\n d3_style_setProperty.call(this, name, value + \"\", priority);\n };\n }\n }\n d3.ascending = d3_ascending;\n function d3_ascending(a, b) {\n return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;\n }\n d3.descending = function(a, b) {\n return b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN;\n };\n d3.min = function(array, f) {\n var i = -1, n = array.length, a, b;\n if (arguments.length === 1) {\n while (++i < n) if ((b = array[i]) != null && b >= b) {\n a = b;\n break;\n }\n while (++i < n) if ((b = array[i]) != null && a > b) a = b;\n } else {\n while (++i < n) if ((b = f.call(array, array[i], i)) != null && b >= b) {\n a = b;\n break;\n }\n while (++i < n) if ((b = f.call(array, array[i], i)) != null && a > b) a = b;\n }\n return a;\n };\n d3.max = function(array, f) {\n var i = -1, n = array.length, a, b;\n if (arguments.length === 1) {\n while (++i < n) if ((b = array[i]) != null && b >= b) {\n a = b;\n break;\n }\n while (++i < n) if ((b = array[i]) != null && b > a) a = b;\n } else {\n while (++i < n) if ((b = f.call(array, array[i], i)) != null && b >= b) {\n a = b;\n break;\n }\n while (++i < n) if ((b = f.call(array, array[i], i)) != null && b > a) a = b;\n }\n return a;\n };\n d3.extent = function(array, f) {\n var i = -1, n = array.length, a, b, c;\n if (arguments.length === 1) {\n while (++i < n) if ((b = array[i]) != null && b >= b) {\n a = c = b;\n break;\n }\n while (++i < n) if ((b = array[i]) != null) {\n if (a > b) a = b;\n if (c < b) c = b;\n }\n } else {\n while (++i < n) if ((b = f.call(array, array[i], i)) != null && b >= b) {\n a = c = b;\n break;\n }\n while (++i < n) if ((b = f.call(array, array[i], i)) != null) {\n if (a > b) a = b;\n if (c < b) c = b;\n }\n }\n return [ a, c ];\n };\n function d3_number(x) {\n return x === null ? NaN : +x;\n }\n function d3_numeric(x) {\n return !isNaN(x);\n }\n d3.sum = function(array, f) {\n var s = 0, n = array.length, a, i = -1;\n if (arguments.length === 1) {\n while (++i < n) if (d3_numeric(a = +array[i])) s += a;\n } else {\n while (++i < n) if (d3_numeric(a = +f.call(array, array[i], i))) s += a;\n }\n return s;\n };\n d3.mean = function(array, f) {\n var s = 0, n = array.length, a, i = -1, j = n;\n if (arguments.length === 1) {\n while (++i < n) if (d3_numeric(a = d3_number(array[i]))) s += a; else --j;\n } else {\n while (++i < n) if (d3_numeric(a = d3_number(f.call(array, array[i], i)))) s += a; else --j;\n }\n if (j) return s / j;\n };\n d3.quantile = function(values, p) {\n var H = (values.length - 1) * p + 1, h = Math.floor(H), v = +values[h - 1], e = H - h;\n return e ? v + e * (values[h] - v) : v;\n };\n d3.median = function(array, f) {\n var numbers = [], n = array.length, a, i = -1;\n if (arguments.length === 1) {\n while (++i < n) if (d3_numeric(a = d3_number(array[i]))) numbers.push(a);\n } else {\n while (++i < n) if (d3_numeric(a = d3_number(f.call(array, array[i], i)))) numbers.push(a);\n }\n if (numbers.length) return d3.quantile(numbers.sort(d3_ascending), .5);\n };\n d3.variance = function(array, f) {\n var n = array.length, m = 0, a, d, s = 0, i = -1, j = 0;\n if (arguments.length === 1) {\n while (++i < n) {\n if (d3_numeric(a = d3_number(array[i]))) {\n d = a - m;\n m += d / ++j;\n s += d * (a - m);\n }\n }\n } else {\n while (++i < n) {\n if (d3_numeric(a = d3_number(f.call(array, array[i], i)))) {\n d = a - m;\n m += d / ++j;\n s += d * (a - m);\n }\n }\n }\n if (j > 1) return s / (j - 1);\n };\n d3.deviation = function() {\n var v = d3.variance.apply(this, arguments);\n return v ? Math.sqrt(v) : v;\n };\n function d3_bisector(compare) {\n return {\n left: function(a, x, lo, hi) {\n if (arguments.length < 3) lo = 0;\n if (arguments.length < 4) hi = a.length;\n while (lo < hi) {\n var mid = lo + hi >>> 1;\n if (compare(a[mid], x) < 0) lo = mid + 1; else hi = mid;\n }\n return lo;\n },\n right: function(a, x, lo, hi) {\n if (arguments.length < 3) lo = 0;\n if (arguments.length < 4) hi = a.length;\n while (lo < hi) {\n var mid = lo + hi >>> 1;\n if (compare(a[mid], x) > 0) hi = mid; else lo = mid + 1;\n }\n return lo;\n }\n };\n }\n var d3_bisect = d3_bisector(d3_ascending);\n d3.bisectLeft = d3_bisect.left;\n d3.bisect = d3.bisectRight = d3_bisect.right;\n d3.bisector = function(f) {\n return d3_bisector(f.length === 1 ? function(d, x) {\n return d3_ascending(f(d), x);\n } : f);\n };\n d3.shuffle = function(array, i0, i1) {\n if ((m = arguments.length) < 3) {\n i1 = array.length;\n if (m < 2) i0 = 0;\n }\n var m = i1 - i0, t, i;\n while (m) {\n i = Math.random() * m-- | 0;\n t = array[m + i0], array[m + i0] = array[i + i0], array[i + i0] = t;\n }\n return array;\n };\n d3.permute = function(array, indexes) {\n var i = indexes.length, permutes = new Array(i);\n while (i--) permutes[i] = array[indexes[i]];\n return permutes;\n };\n d3.pairs = function(array) {\n var i = 0, n = array.length - 1, p0, p1 = array[0], pairs = new Array(n < 0 ? 0 : n);\n while (i < n) pairs[i] = [ p0 = p1, p1 = array[++i] ];\n return pairs;\n };\n d3.transpose = function(matrix) {\n if (!(n = matrix.length)) return [];\n for (var i = -1, m = d3.min(matrix, d3_transposeLength), transpose = new Array(m); ++i < m; ) {\n for (var j = -1, n, row = transpose[i] = new Array(n); ++j < n; ) {\n row[j] = matrix[j][i];\n }\n }\n return transpose;\n };\n function d3_transposeLength(d) {\n return d.length;\n }\n d3.zip = function() {\n return d3.transpose(arguments);\n };\n d3.keys = function(map) {\n var keys = [];\n for (var key in map) keys.push(key);\n return keys;\n };\n d3.values = function(map) {\n var values = [];\n for (var key in map) values.push(map[key]);\n return values;\n };\n d3.entries = function(map) {\n var entries = [];\n for (var key in map) entries.push({\n key: key,\n value: map[key]\n });\n return entries;\n };\n d3.merge = function(arrays) {\n var n = arrays.length, m, i = -1, j = 0, merged, array;\n while (++i < n) j += arrays[i].length;\n merged = new Array(j);\n while (--n >= 0) {\n array = arrays[n];\n m = array.length;\n while (--m >= 0) {\n merged[--j] = array[m];\n }\n }\n return merged;\n };\n var abs = Math.abs;\n d3.range = function(start, stop, step) {\n if (arguments.length < 3) {\n step = 1;\n if (arguments.length < 2) {\n stop = start;\n start = 0;\n }\n }\n if ((stop - start) / step === Infinity) throw new Error(\"infinite range\");\n var range = [], k = d3_range_integerScale(abs(step)), i = -1, j;\n start *= k, stop *= k, step *= k;\n if (step < 0) while ((j = start + step * ++i) > stop) range.push(j / k); else while ((j = start + step * ++i) < stop) range.push(j / k);\n return range;\n };\n function d3_range_integerScale(x) {\n var k = 1;\n while (x * k % 1) k *= 10;\n return k;\n }\n function d3_class(ctor, properties) {\n for (var key in properties) {\n Object.defineProperty(ctor.prototype, key, {\n value: properties[key],\n enumerable: false\n });\n }\n }\n d3.map = function(object, f) {\n var map = new d3_Map();\n if (object instanceof d3_Map) {\n object.forEach(function(key, value) {\n map.set(key, value);\n });\n } else if (Array.isArray(object)) {\n var i = -1, n = object.length, o;\n if (arguments.length === 1) while (++i < n) map.set(i, object[i]); else while (++i < n) map.set(f.call(object, o = object[i], i), o);\n } else {\n for (var key in object) map.set(key, object[key]);\n }\n return map;\n };\n function d3_Map() {\n this._ = Object.create(null);\n }\n var d3_map_proto = \"__proto__\", d3_map_zero = \"\\x00\";\n d3_class(d3_Map, {\n has: d3_map_has,\n get: function(key) {\n return this._[d3_map_escape(key)];\n },\n set: function(key, value) {\n return this._[d3_map_escape(key)] = value;\n },\n remove: d3_map_remove,\n keys: d3_map_keys,\n values: function() {\n var values = [];\n for (var key in this._) values.push(this._[key]);\n return values;\n },\n entries: function() {\n var entries = [];\n for (var key in this._) entries.push({\n key: d3_map_unescape(key),\n value: this._[key]\n });\n return entries;\n },\n size: d3_map_size,\n empty: d3_map_empty,\n forEach: function(f) {\n for (var key in this._) f.call(this, d3_map_unescape(key), this._[key]);\n }\n });\n function d3_map_escape(key) {\n return (key += \"\") === d3_map_proto || key[0] === d3_map_zero ? d3_map_zero + key : key;\n }\n function d3_map_unescape(key) {\n return (key += \"\")[0] === d3_map_zero ? key.slice(1) : key;\n }\n function d3_map_has(key) {\n return d3_map_escape(key) in this._;\n }\n function d3_map_remove(key) {\n return (key = d3_map_escape(key)) in this._ && delete this._[key];\n }\n function d3_map_keys() {\n var keys = [];\n for (var key in this._) keys.push(d3_map_unescape(key));\n return keys;\n }\n function d3_map_size() {\n var size = 0;\n for (var key in this._) ++size;\n return size;\n }\n function d3_map_empty() {\n for (var key in this._) return false;\n return true;\n }\n d3.nest = function() {\n var nest = {}, keys = [], sortKeys = [], sortValues, rollup;\n function map(mapType, array, depth) {\n if (depth >= keys.length) return rollup ? rollup.call(nest, array) : sortValues ? array.sort(sortValues) : array;\n var i = -1, n = array.length, key = keys[depth++], keyValue, object, setter, valuesByKey = new d3_Map(), values;\n while (++i < n) {\n if (values = valuesByKey.get(keyValue = key(object = array[i]))) {\n values.push(object);\n } else {\n valuesByKey.set(keyValue, [ object ]);\n }\n }\n if (mapType) {\n object = mapType();\n setter = function(keyValue, values) {\n object.set(keyValue, map(mapType, values, depth));\n };\n } else {\n object = {};\n setter = function(keyValue, values) {\n object[keyValue] = map(mapType, values, depth);\n };\n }\n valuesByKey.forEach(setter);\n return object;\n }\n function entries(map, depth) {\n if (depth >= keys.length) return map;\n var array = [], sortKey = sortKeys[depth++];\n map.forEach(function(key, keyMap) {\n array.push({\n key: key,\n values: entries(keyMap, depth)\n });\n });\n return sortKey ? array.sort(function(a, b) {\n return sortKey(a.key, b.key);\n }) : array;\n }\n nest.map = function(array, mapType) {\n return map(mapType, array, 0);\n };\n nest.entries = function(array) {\n return entries(map(d3.map, array, 0), 0);\n };\n nest.key = function(d) {\n keys.push(d);\n return nest;\n };\n nest.sortKeys = function(order) {\n sortKeys[keys.length - 1] = order;\n return nest;\n };\n nest.sortValues = function(order) {\n sortValues = order;\n return nest;\n };\n nest.rollup = function(f) {\n rollup = f;\n return nest;\n };\n return nest;\n };\n d3.set = function(array) {\n var set = new d3_Set();\n if (array) for (var i = 0, n = array.length; i < n; ++i) set.add(array[i]);\n return set;\n };\n function d3_Set() {\n this._ = Object.create(null);\n }\n d3_class(d3_Set, {\n has: d3_map_has,\n add: function(key) {\n this._[d3_map_escape(key += \"\")] = true;\n return key;\n },\n remove: d3_map_remove,\n values: d3_map_keys,\n size: d3_map_size,\n empty: d3_map_empty,\n forEach: function(f) {\n for (var key in this._) f.call(this, d3_map_unescape(key));\n }\n });\n d3.behavior = {};\n function d3_identity(d) {\n return d;\n }\n d3.rebind = function(target, source) {\n var i = 1, n = arguments.length, method;\n while (++i < n) target[method = arguments[i]] = d3_rebind(target, source, source[method]);\n return target;\n };\n function d3_rebind(target, source, method) {\n return function() {\n var value = method.apply(source, arguments);\n return value === source ? target : value;\n };\n }\n function d3_vendorSymbol(object, name) {\n if (name in object) return name;\n name = name.charAt(0).toUpperCase() + name.slice(1);\n for (var i = 0, n = d3_vendorPrefixes.length; i < n; ++i) {\n var prefixName = d3_vendorPrefixes[i] + name;\n if (prefixName in object) return prefixName;\n }\n }\n var d3_vendorPrefixes = [ \"webkit\", \"ms\", \"moz\", \"Moz\", \"o\", \"O\" ];\n function d3_noop() {}\n d3.dispatch = function() {\n var dispatch = new d3_dispatch(), i = -1, n = arguments.length;\n while (++i < n) dispatch[arguments[i]] = d3_dispatch_event(dispatch);\n return dispatch;\n };\n function d3_dispatch() {}\n d3_dispatch.prototype.on = function(type, listener) {\n var i = type.indexOf(\".\"), name = \"\";\n if (i >= 0) {\n name = type.slice(i + 1);\n type = type.slice(0, i);\n }\n if (type) return arguments.length < 2 ? this[type].on(name) : this[type].on(name, listener);\n if (arguments.length === 2) {\n if (listener == null) for (type in this) {\n if (this.hasOwnProperty(type)) this[type].on(name, null);\n }\n return this;\n }\n };\n function d3_dispatch_event(dispatch) {\n var listeners = [], listenerByName = new d3_Map();\n function event() {\n var z = listeners, i = -1, n = z.length, l;\n while (++i < n) if (l = z[i].on) l.apply(this, arguments);\n return dispatch;\n }\n event.on = function(name, listener) {\n var l = listenerByName.get(name), i;\n if (arguments.length < 2) return l && l.on;\n if (l) {\n l.on = null;\n listeners = listeners.slice(0, i = listeners.indexOf(l)).concat(listeners.slice(i + 1));\n listenerByName.remove(name);\n }\n if (listener) listeners.push(listenerByName.set(name, {\n on: listener\n }));\n return dispatch;\n };\n return event;\n }\n d3.event = null;\n function d3_eventPreventDefault() {\n d3.event.preventDefault();\n }\n function d3_eventSource() {\n var e = d3.event, s;\n while (s = e.sourceEvent) e = s;\n return e;\n }\n function d3_eventDispatch(target) {\n var dispatch = new d3_dispatch(), i = 0, n = arguments.length;\n while (++i < n) dispatch[arguments[i]] = d3_dispatch_event(dispatch);\n dispatch.of = function(thiz, argumentz) {\n return function(e1) {\n try {\n var e0 = e1.sourceEvent = d3.event;\n e1.target = target;\n d3.event = e1;\n dispatch[e1.type].apply(thiz, argumentz);\n } finally {\n d3.event = e0;\n }\n };\n };\n return dispatch;\n }\n d3.requote = function(s) {\n return s.replace(d3_requote_re, \"\\\\$&\");\n };\n var d3_requote_re = /[\\\\\\^\\$\\*\\+\\?\\|\\[\\]\\(\\)\\.\\{\\}]/g;\n var d3_subclass = {}.__proto__ ? function(object, prototype) {\n object.__proto__ = prototype;\n } : function(object, prototype) {\n for (var property in prototype) object[property] = prototype[property];\n };\n function d3_selection(groups) {\n d3_subclass(groups, d3_selectionPrototype);\n return groups;\n }\n var d3_select = function(s, n) {\n return n.querySelector(s);\n }, d3_selectAll = function(s, n) {\n return n.querySelectorAll(s);\n }, d3_selectMatches = function(n, s) {\n var d3_selectMatcher = n.matches || n[d3_vendorSymbol(n, \"matchesSelector\")];\n d3_selectMatches = function(n, s) {\n return d3_selectMatcher.call(n, s);\n };\n return d3_selectMatches(n, s);\n };\n if (typeof Sizzle === \"function\") {\n d3_select = function(s, n) {\n return Sizzle(s, n)[0] || null;\n };\n d3_selectAll = Sizzle;\n d3_selectMatches = Sizzle.matchesSelector;\n }\n d3.selection = function() {\n return d3.select(d3_document.documentElement);\n };\n var d3_selectionPrototype = d3.selection.prototype = [];\n d3_selectionPrototype.select = function(selector) {\n var subgroups = [], subgroup, subnode, group, node;\n selector = d3_selection_selector(selector);\n for (var j = -1, m = this.length; ++j < m; ) {\n subgroups.push(subgroup = []);\n subgroup.parentNode = (group = this[j]).parentNode;\n for (var i = -1, n = group.length; ++i < n; ) {\n if (node = group[i]) {\n subgroup.push(subnode = selector.call(node, node.__data__, i, j));\n if (subnode && \"__data__\" in node) subnode.__data__ = node.__data__;\n } else {\n subgroup.push(null);\n }\n }\n }\n return d3_selection(subgroups);\n };\n function d3_selection_selector(selector) {\n return typeof selector === \"function\" ? selector : function() {\n return d3_select(selector, this);\n };\n }\n d3_selectionPrototype.selectAll = function(selector) {\n var subgroups = [], subgroup, node;\n selector = d3_selection_selectorAll(selector);\n for (var j = -1, m = this.length; ++j < m; ) {\n for (var group = this[j], i = -1, n = group.length; ++i < n; ) {\n if (node = group[i]) {\n subgroups.push(subgroup = d3_array(selector.call(node, node.__data__, i, j)));\n subgroup.parentNode = node;\n }\n }\n }\n return d3_selection(subgroups);\n };\n function d3_selection_selectorAll(selector) {\n return typeof selector === \"function\" ? selector : function() {\n return d3_selectAll(selector, this);\n };\n }\n var d3_nsXhtml = \"http://www.w3.org/1999/xhtml\";\n var d3_nsPrefix = {\n svg: \"http://www.w3.org/2000/svg\",\n xhtml: d3_nsXhtml,\n xlink: \"http://www.w3.org/1999/xlink\",\n xml: \"http://www.w3.org/XML/1998/namespace\",\n xmlns: \"http://www.w3.org/2000/xmlns/\"\n };\n d3.ns = {\n prefix: d3_nsPrefix,\n qualify: function(name) {\n var i = name.indexOf(\":\"), prefix = name;\n if (i >= 0 && (prefix = name.slice(0, i)) !== \"xmlns\") name = name.slice(i + 1);\n return d3_nsPrefix.hasOwnProperty(prefix) ? {\n space: d3_nsPrefix[prefix],\n local: name\n } : name;\n }\n };\n d3_selectionPrototype.attr = function(name, value) {\n if (arguments.length < 2) {\n if (typeof name === \"string\") {\n var node = this.node();\n name = d3.ns.qualify(name);\n return name.local ? node.getAttributeNS(name.space, name.local) : node.getAttribute(name);\n }\n for (value in name) this.each(d3_selection_attr(value, name[value]));\n return this;\n }\n return this.each(d3_selection_attr(name, value));\n };\n function d3_selection_attr(name, value) {\n name = d3.ns.qualify(name);\n function attrNull() {\n this.removeAttribute(name);\n }\n function attrNullNS() {\n this.removeAttributeNS(name.space, name.local);\n }\n function attrConstant() {\n this.setAttribute(name, value);\n }\n function attrConstantNS() {\n this.setAttributeNS(name.space, name.local, value);\n }\n function attrFunction() {\n var x = value.apply(this, arguments);\n if (x == null) this.removeAttribute(name); else this.setAttribute(name, x);\n }\n function attrFunctionNS() {\n var x = value.apply(this, arguments);\n if (x == null) this.removeAttributeNS(name.space, name.local); else this.setAttributeNS(name.space, name.local, x);\n }\n return value == null ? name.local ? attrNullNS : attrNull : typeof value === \"function\" ? name.local ? attrFunctionNS : attrFunction : name.local ? attrConstantNS : attrConstant;\n }\n function d3_collapse(s) {\n return s.trim().replace(/\\s+/g, \" \");\n }\n d3_selectionPrototype.classed = function(name, value) {\n if (arguments.length < 2) {\n if (typeof name === \"string\") {\n var node = this.node(), n = (name = d3_selection_classes(name)).length, i = -1;\n if (value = node.classList) {\n while (++i < n) if (!value.contains(name[i])) return false;\n } else {\n value = node.getAttribute(\"class\");\n while (++i < n) if (!d3_selection_classedRe(name[i]).test(value)) return false;\n }\n return true;\n }\n for (value in name) this.each(d3_selection_classed(value, name[value]));\n return this;\n }\n return this.each(d3_selection_classed(name, value));\n };\n function d3_selection_classedRe(name) {\n return new RegExp(\"(?:^|\\\\s+)\" + d3.requote(name) + \"(?:\\\\s+|$)\", \"g\");\n }\n function d3_selection_classes(name) {\n return (name + \"\").trim().split(/^|\\s+/);\n }\n function d3_selection_classed(name, value) {\n name = d3_selection_classes(name).map(d3_selection_classedName);\n var n = name.length;\n function classedConstant() {\n var i = -1;\n while (++i < n) name[i](this, value);\n }\n function classedFunction() {\n var i = -1, x = value.apply(this, arguments);\n while (++i < n) name[i](this, x);\n }\n return typeof value === \"function\" ? classedFunction : classedConstant;\n }\n function d3_selection_classedName(name) {\n var re = d3_selection_classedRe(name);\n return function(node, value) {\n if (c = node.classList) return value ? c.add(name) : c.remove(name);\n var c = node.getAttribute(\"class\") || \"\";\n if (value) {\n re.lastIndex = 0;\n if (!re.test(c)) node.setAttribute(\"class\", d3_collapse(c + \" \" + name));\n } else {\n node.setAttribute(\"class\", d3_collapse(c.replace(re, \" \")));\n }\n };\n }\n d3_selectionPrototype.style = function(name, value, priority) {\n var n = arguments.length;\n if (n < 3) {\n if (typeof name !== \"string\") {\n if (n < 2) value = \"\";\n for (priority in name) this.each(d3_selection_style(priority, name[priority], value));\n return this;\n }\n if (n < 2) {\n var node = this.node();\n return d3_window(node).getComputedStyle(node, null).getPropertyValue(name);\n }\n priority = \"\";\n }\n return this.each(d3_selection_style(name, value, priority));\n };\n function d3_selection_style(name, value, priority) {\n function styleNull() {\n this.style.removeProperty(name);\n }\n function styleConstant() {\n this.style.setProperty(name, value, priority);\n }\n function styleFunction() {\n var x = value.apply(this, arguments);\n if (x == null) this.style.removeProperty(name); else this.style.setProperty(name, x, priority);\n }\n return value == null ? styleNull : typeof value === \"function\" ? styleFunction : styleConstant;\n }\n d3_selectionPrototype.property = function(name, value) {\n if (arguments.length < 2) {\n if (typeof name === \"string\") return this.node()[name];\n for (value in name) this.each(d3_selection_property(value, name[value]));\n return this;\n }\n return this.each(d3_selection_property(name, value));\n };\n function d3_selection_property(name, value) {\n function propertyNull() {\n delete this[name];\n }\n function propertyConstant() {\n this[name] = value;\n }\n function propertyFunction() {\n var x = value.apply(this, arguments);\n if (x == null) delete this[name]; else this[name] = x;\n }\n return value == null ? propertyNull : typeof value === \"function\" ? propertyFunction : propertyConstant;\n }\n d3_selectionPrototype.text = function(value) {\n return arguments.length ? this.each(typeof value === \"function\" ? function() {\n var v = value.apply(this, arguments);\n this.textContent = v == null ? \"\" : v;\n } : value == null ? function() {\n this.textContent = \"\";\n } : function() {\n this.textContent = value;\n }) : this.node().textContent;\n };\n d3_selectionPrototype.html = function(value) {\n return arguments.length ? this.each(typeof value === \"function\" ? function() {\n var v = value.apply(this, arguments);\n this.innerHTML = v == null ? \"\" : v;\n } : value == null ? function() {\n this.innerHTML = \"\";\n } : function() {\n this.innerHTML = value;\n }) : this.node().innerHTML;\n };\n d3_selectionPrototype.append = function(name) {\n name = d3_selection_creator(name);\n return this.select(function() {\n return this.appendChild(name.apply(this, arguments));\n });\n };\n function d3_selection_creator(name) {\n function create() {\n var document = this.ownerDocument, namespace = this.namespaceURI;\n return namespace === d3_nsXhtml && document.documentElement.namespaceURI === d3_nsXhtml ? document.createElement(name) : document.createElementNS(namespace, name);\n }\n function createNS() {\n return this.ownerDocument.createElementNS(name.space, name.local);\n }\n return typeof name === \"function\" ? name : (name = d3.ns.qualify(name)).local ? createNS : create;\n }\n d3_selectionPrototype.insert = function(name, before) {\n name = d3_selection_creator(name);\n before = d3_selection_selector(before);\n return this.select(function() {\n return this.insertBefore(name.apply(this, arguments), before.apply(this, arguments) || null);\n });\n };\n d3_selectionPrototype.remove = function() {\n return this.each(d3_selectionRemove);\n };\n function d3_selectionRemove() {\n var parent = this.parentNode;\n if (parent) parent.removeChild(this);\n }\n d3_selectionPrototype.data = function(value, key) {\n var i = -1, n = this.length, group, node;\n if (!arguments.length) {\n value = new Array(n = (group = this[0]).length);\n while (++i < n) {\n if (node = group[i]) {\n value[i] = node.__data__;\n }\n }\n return value;\n }\n function bind(group, groupData) {\n var i, n = group.length, m = groupData.length, n0 = Math.min(n, m), updateNodes = new Array(m), enterNodes = new Array(m), exitNodes = new Array(n), node, nodeData;\n if (key) {\n var nodeByKeyValue = new d3_Map(), keyValues = new Array(n), keyValue;\n for (i = -1; ++i < n; ) {\n if (node = group[i]) {\n if (nodeByKeyValue.has(keyValue = key.call(node, node.__data__, i))) {\n exitNodes[i] = node;\n } else {\n nodeByKeyValue.set(keyValue, node);\n }\n keyValues[i] = keyValue;\n }\n }\n for (i = -1; ++i < m; ) {\n if (!(node = nodeByKeyValue.get(keyValue = key.call(groupData, nodeData = groupData[i], i)))) {\n enterNodes[i] = d3_selection_dataNode(nodeData);\n } else if (node !== true) {\n updateNodes[i] = node;\n node.__data__ = nodeData;\n }\n nodeByKeyValue.set(keyValue, true);\n }\n for (i = -1; ++i < n; ) {\n if (i in keyValues && nodeByKeyValue.get(keyValues[i]) !== true) {\n exitNodes[i] = group[i];\n }\n }\n } else {\n for (i = -1; ++i < n0; ) {\n node = group[i];\n nodeData = groupData[i];\n if (node) {\n node.__data__ = nodeData;\n updateNodes[i] = node;\n } else {\n enterNodes[i] = d3_selection_dataNode(nodeData);\n }\n }\n for (;i < m; ++i) {\n enterNodes[i] = d3_selection_dataNode(groupData[i]);\n }\n for (;i < n; ++i) {\n exitNodes[i] = group[i];\n }\n }\n enterNodes.update = updateNodes;\n enterNodes.parentNode = updateNodes.parentNode = exitNodes.parentNode = group.parentNode;\n enter.push(enterNodes);\n update.push(updateNodes);\n exit.push(exitNodes);\n }\n var enter = d3_selection_enter([]), update = d3_selection([]), exit = d3_selection([]);\n if (typeof value === \"function\") {\n while (++i < n) {\n bind(group = this[i], value.call(group, group.parentNode.__data__, i));\n }\n } else {\n while (++i < n) {\n bind(group = this[i], value);\n }\n }\n update.enter = function() {\n return enter;\n };\n update.exit = function() {\n return exit;\n };\n return update;\n };\n function d3_selection_dataNode(data) {\n return {\n __data__: data\n };\n }\n d3_selectionPrototype.datum = function(value) {\n return arguments.length ? this.property(\"__data__\", value) : this.property(\"__data__\");\n };\n d3_selectionPrototype.filter = function(filter) {\n var subgroups = [], subgroup, group, node;\n if (typeof filter !== \"function\") filter = d3_selection_filter(filter);\n for (var j = 0, m = this.length; j < m; j++) {\n subgroups.push(subgroup = []);\n subgroup.parentNode = (group = this[j]).parentNode;\n for (var i = 0, n = group.length; i < n; i++) {\n if ((node = group[i]) && filter.call(node, node.__data__, i, j)) {\n subgroup.push(node);\n }\n }\n }\n return d3_selection(subgroups);\n };\n function d3_selection_filter(selector) {\n return function() {\n return d3_selectMatches(this, selector);\n };\n }\n d3_selectionPrototype.order = function() {\n for (var j = -1, m = this.length; ++j < m; ) {\n for (var group = this[j], i = group.length - 1, next = group[i], node; --i >= 0; ) {\n if (node = group[i]) {\n if (next && next !== node.nextSibling) next.parentNode.insertBefore(node, next);\n next = node;\n }\n }\n }\n return this;\n };\n d3_selectionPrototype.sort = function(comparator) {\n comparator = d3_selection_sortComparator.apply(this, arguments);\n for (var j = -1, m = this.length; ++j < m; ) this[j].sort(comparator);\n return this.order();\n };\n function d3_selection_sortComparator(comparator) {\n if (!arguments.length) comparator = d3_ascending;\n return function(a, b) {\n return a && b ? comparator(a.__data__, b.__data__) : !a - !b;\n };\n }\n d3_selectionPrototype.each = function(callback) {\n return d3_selection_each(this, function(node, i, j) {\n callback.call(node, node.__data__, i, j);\n });\n };\n function d3_selection_each(groups, callback) {\n for (var j = 0, m = groups.length; j < m; j++) {\n for (var group = groups[j], i = 0, n = group.length, node; i < n; i++) {\n if (node = group[i]) callback(node, i, j);\n }\n }\n return groups;\n }\n d3_selectionPrototype.call = function(callback) {\n var args = d3_array(arguments);\n callback.apply(args[0] = this, args);\n return this;\n };\n d3_selectionPrototype.empty = function() {\n return !this.node();\n };\n d3_selectionPrototype.node = function() {\n for (var j = 0, m = this.length; j < m; j++) {\n for (var group = this[j], i = 0, n = group.length; i < n; i++) {\n var node = group[i];\n if (node) return node;\n }\n }\n return null;\n };\n d3_selectionPrototype.size = function() {\n var n = 0;\n d3_selection_each(this, function() {\n ++n;\n });\n return n;\n };\n function d3_selection_enter(selection) {\n d3_subclass(selection, d3_selection_enterPrototype);\n return selection;\n }\n var d3_selection_enterPrototype = [];\n d3.selection.enter = d3_selection_enter;\n d3.selection.enter.prototype = d3_selection_enterPrototype;\n d3_selection_enterPrototype.append = d3_selectionPrototype.append;\n d3_selection_enterPrototype.empty = d3_selectionPrototype.empty;\n d3_selection_enterPrototype.node = d3_selectionPrototype.node;\n d3_selection_enterPrototype.call = d3_selectionPrototype.call;\n d3_selection_enterPrototype.size = d3_selectionPrototype.size;\n d3_selection_enterPrototype.select = function(selector) {\n var subgroups = [], subgroup, subnode, upgroup, group, node;\n for (var j = -1, m = this.length; ++j < m; ) {\n upgroup = (group = this[j]).update;\n subgroups.push(subgroup = []);\n subgroup.parentNode = group.parentNode;\n for (var i = -1, n = group.length; ++i < n; ) {\n if (node = group[i]) {\n subgroup.push(upgroup[i] = subnode = selector.call(group.parentNode, node.__data__, i, j));\n subnode.__data__ = node.__data__;\n } else {\n subgroup.push(null);\n }\n }\n }\n return d3_selection(subgroups);\n };\n d3_selection_enterPrototype.insert = function(name, before) {\n if (arguments.length < 2) before = d3_selection_enterInsertBefore(this);\n return d3_selectionPrototype.insert.call(this, name, before);\n };\n function d3_selection_enterInsertBefore(enter) {\n var i0, j0;\n return function(d, i, j) {\n var group = enter[j].update, n = group.length, node;\n if (j != j0) j0 = j, i0 = 0;\n if (i >= i0) i0 = i + 1;\n while (!(node = group[i0]) && ++i0 < n) ;\n return node;\n };\n }\n d3.select = function(node) {\n var group;\n if (typeof node === \"string\") {\n group = [ d3_select(node, d3_document) ];\n group.parentNode = d3_document.documentElement;\n } else {\n group = [ node ];\n group.parentNode = d3_documentElement(node);\n }\n return d3_selection([ group ]);\n };\n d3.selectAll = function(nodes) {\n var group;\n if (typeof nodes === \"string\") {\n group = d3_array(d3_selectAll(nodes, d3_document));\n group.parentNode = d3_document.documentElement;\n } else {\n group = d3_array(nodes);\n group.parentNode = null;\n }\n return d3_selection([ group ]);\n };\n d3_selectionPrototype.on = function(type, listener, capture) {\n var n = arguments.length;\n if (n < 3) {\n if (typeof type !== \"string\") {\n if (n < 2) listener = false;\n for (capture in type) this.each(d3_selection_on(capture, type[capture], listener));\n return this;\n }\n if (n < 2) return (n = this.node()[\"__on\" + type]) && n._;\n capture = false;\n }\n return this.each(d3_selection_on(type, listener, capture));\n };\n function d3_selection_on(type, listener, capture) {\n var name = \"__on\" + type, i = type.indexOf(\".\"), wrap = d3_selection_onListener;\n if (i > 0) type = type.slice(0, i);\n var filter = d3_selection_onFilters.get(type);\n if (filter) type = filter, wrap = d3_selection_onFilter;\n function onRemove() {\n var l = this[name];\n if (l) {\n this.removeEventListener(type, l, l.$);\n delete this[name];\n }\n }\n function onAdd() {\n var l = wrap(listener, d3_array(arguments));\n onRemove.call(this);\n this.addEventListener(type, this[name] = l, l.$ = capture);\n l._ = listener;\n }\n function removeAll() {\n var re = new RegExp(\"^__on([^.]+)\" + d3.requote(type) + \"$\"), match;\n for (var name in this) {\n if (match = name.match(re)) {\n var l = this[name];\n this.removeEventListener(match[1], l, l.$);\n delete this[name];\n }\n }\n }\n return i ? listener ? onAdd : onRemove : listener ? d3_noop : removeAll;\n }\n var d3_selection_onFilters = d3.map({\n mouseenter: \"mouseover\",\n mouseleave: \"mouseout\"\n });\n if (d3_document) {\n d3_selection_onFilters.forEach(function(k) {\n if (\"on\" + k in d3_document) d3_selection_onFilters.remove(k);\n });\n }\n function d3_selection_onListener(listener, argumentz) {\n return function(e) {\n var o = d3.event;\n d3.event = e;\n argumentz[0] = this.__data__;\n try {\n listener.apply(this, argumentz);\n } finally {\n d3.event = o;\n }\n };\n }\n function d3_selection_onFilter(listener, argumentz) {\n var l = d3_selection_onListener(listener, argumentz);\n return function(e) {\n var target = this, related = e.relatedTarget;\n if (!related || related !== target && !(related.compareDocumentPosition(target) & 8)) {\n l.call(target, e);\n }\n };\n }\n var d3_event_dragSelect, d3_event_dragId = 0;\n function d3_event_dragSuppress(node) {\n var name = \".dragsuppress-\" + ++d3_event_dragId, click = \"click\" + name, w = d3.select(d3_window(node)).on(\"touchmove\" + name, d3_eventPreventDefault).on(\"dragstart\" + name, d3_eventPreventDefault).on(\"selectstart\" + name, d3_eventPreventDefault);\n if (d3_event_dragSelect == null) {\n d3_event_dragSelect = \"onselectstart\" in node ? false : d3_vendorSymbol(node.style, \"userSelect\");\n }\n if (d3_event_dragSelect) {\n var style = d3_documentElement(node).style, select = style[d3_event_dragSelect];\n style[d3_event_dragSelect] = \"none\";\n }\n return function(suppressClick) {\n w.on(name, null);\n if (d3_event_dragSelect) style[d3_event_dragSelect] = select;\n if (suppressClick) {\n var off = function() {\n w.on(click, null);\n };\n w.on(click, function() {\n d3_eventPreventDefault();\n off();\n }, true);\n setTimeout(off, 0);\n }\n };\n }\n d3.mouse = function(container) {\n return d3_mousePoint(container, d3_eventSource());\n };\n var d3_mouse_bug44083 = this.navigator && /WebKit/.test(this.navigator.userAgent) ? -1 : 0;\n function d3_mousePoint(container, e) {\n if (e.changedTouches) e = e.changedTouches[0];\n var svg = container.ownerSVGElement || container;\n if (svg.createSVGPoint) {\n var point = svg.createSVGPoint();\n if (d3_mouse_bug44083 < 0) {\n var window = d3_window(container);\n if (window.scrollX || window.scrollY) {\n svg = d3.select(\"body\").append(\"svg\").style({\n position: \"absolute\",\n top: 0,\n left: 0,\n margin: 0,\n padding: 0,\n border: \"none\"\n }, \"important\");\n var ctm = svg[0][0].getScreenCTM();\n d3_mouse_bug44083 = !(ctm.f || ctm.e);\n svg.remove();\n }\n }\n if (d3_mouse_bug44083) point.x = e.pageX, point.y = e.pageY; else point.x = e.clientX, \n point.y = e.clientY;\n point = point.matrixTransform(container.getScreenCTM().inverse());\n return [ point.x, point.y ];\n }\n var rect = container.getBoundingClientRect();\n return [ e.clientX - rect.left - container.clientLeft, e.clientY - rect.top - container.clientTop ];\n }\n d3.touch = function(container, touches, identifier) {\n if (arguments.length < 3) identifier = touches, touches = d3_eventSource().changedTouches;\n if (touches) for (var i = 0, n = touches.length, touch; i < n; ++i) {\n if ((touch = touches[i]).identifier === identifier) {\n return d3_mousePoint(container, touch);\n }\n }\n };\n d3.behavior.drag = function() {\n var event = d3_eventDispatch(drag, \"drag\", \"dragstart\", \"dragend\"), origin = null, mousedown = dragstart(d3_noop, d3.mouse, d3_window, \"mousemove\", \"mouseup\"), touchstart = dragstart(d3_behavior_dragTouchId, d3.touch, d3_identity, \"touchmove\", \"touchend\");\n function drag() {\n this.on(\"mousedown.drag\", mousedown).on(\"touchstart.drag\", touchstart);\n }\n function dragstart(id, position, subject, move, end) {\n return function() {\n var that = this, target = d3.event.target.correspondingElement || d3.event.target, parent = that.parentNode, dispatch = event.of(that, arguments), dragged = 0, dragId = id(), dragName = \".drag\" + (dragId == null ? \"\" : \"-\" + dragId), dragOffset, dragSubject = d3.select(subject(target)).on(move + dragName, moved).on(end + dragName, ended), dragRestore = d3_event_dragSuppress(target), position0 = position(parent, dragId);\n if (origin) {\n dragOffset = origin.apply(that, arguments);\n dragOffset = [ dragOffset.x - position0[0], dragOffset.y - position0[1] ];\n } else {\n dragOffset = [ 0, 0 ];\n }\n dispatch({\n type: \"dragstart\"\n });\n function moved() {\n var position1 = position(parent, dragId), dx, dy;\n if (!position1) return;\n dx = position1[0] - position0[0];\n dy = position1[1] - position0[1];\n dragged |= dx | dy;\n position0 = position1;\n dispatch({\n type: \"drag\",\n x: position1[0] + dragOffset[0],\n y: position1[1] + dragOffset[1],\n dx: dx,\n dy: dy\n });\n }\n function ended() {\n if (!position(parent, dragId)) return;\n dragSubject.on(move + dragName, null).on(end + dragName, null);\n dragRestore(dragged);\n dispatch({\n type: \"dragend\"\n });\n }\n };\n }\n drag.origin = function(x) {\n if (!arguments.length) return origin;\n origin = x;\n return drag;\n };\n return d3.rebind(drag, event, \"on\");\n };\n function d3_behavior_dragTouchId() {\n return d3.event.changedTouches[0].identifier;\n }\n d3.touches = function(container, touches) {\n if (arguments.length < 2) touches = d3_eventSource().touches;\n return touches ? d3_array(touches).map(function(touch) {\n var point = d3_mousePoint(container, touch);\n point.identifier = touch.identifier;\n return point;\n }) : [];\n };\n var ε = 1e-6, ε2 = ε * ε, π = Math.PI, τ = 2 * π, τε = τ - ε, halfπ = π / 2, d3_radians = π / 180, d3_degrees = 180 / π;\n function d3_sgn(x) {\n return x > 0 ? 1 : x < 0 ? -1 : 0;\n }\n function d3_cross2d(a, b, c) {\n return (b[0] - a[0]) * (c[1] - a[1]) - (b[1] - a[1]) * (c[0] - a[0]);\n }\n function d3_acos(x) {\n return x > 1 ? 0 : x < -1 ? π : Math.acos(x);\n }\n function d3_asin(x) {\n return x > 1 ? halfπ : x < -1 ? -halfπ : Math.asin(x);\n }\n function d3_sinh(x) {\n return ((x = Math.exp(x)) - 1 / x) / 2;\n }\n function d3_cosh(x) {\n return ((x = Math.exp(x)) + 1 / x) / 2;\n }\n function d3_tanh(x) {\n return ((x = Math.exp(2 * x)) - 1) / (x + 1);\n }\n function d3_haversin(x) {\n return (x = Math.sin(x / 2)) * x;\n }\n var ρ = Math.SQRT2, ρ2 = 2, ρ4 = 4;\n d3.interpolateZoom = function(p0, p1) {\n var ux0 = p0[0], uy0 = p0[1], w0 = p0[2], ux1 = p1[0], uy1 = p1[1], w1 = p1[2], dx = ux1 - ux0, dy = uy1 - uy0, d2 = dx * dx + dy * dy, i, S;\n if (d2 < ε2) {\n S = Math.log(w1 / w0) / ρ;\n i = function(t) {\n return [ ux0 + t * dx, uy0 + t * dy, w0 * Math.exp(ρ * t * S) ];\n };\n } else {\n var d1 = Math.sqrt(d2), b0 = (w1 * w1 - w0 * w0 + ρ4 * d2) / (2 * w0 * ρ2 * d1), b1 = (w1 * w1 - w0 * w0 - ρ4 * d2) / (2 * w1 * ρ2 * d1), r0 = Math.log(Math.sqrt(b0 * b0 + 1) - b0), r1 = Math.log(Math.sqrt(b1 * b1 + 1) - b1);\n S = (r1 - r0) / ρ;\n i = function(t) {\n var s = t * S, coshr0 = d3_cosh(r0), u = w0 / (ρ2 * d1) * (coshr0 * d3_tanh(ρ * s + r0) - d3_sinh(r0));\n return [ ux0 + u * dx, uy0 + u * dy, w0 * coshr0 / d3_cosh(ρ * s + r0) ];\n };\n }\n i.duration = S * 1e3;\n return i;\n };\n d3.behavior.zoom = function() {\n var view = {\n x: 0,\n y: 0,\n k: 1\n }, translate0, center0, center, size = [ 960, 500 ], scaleExtent = d3_behavior_zoomInfinity, duration = 250, zooming = 0, mousedown = \"mousedown.zoom\", mousemove = \"mousemove.zoom\", mouseup = \"mouseup.zoom\", mousewheelTimer, touchstart = \"touchstart.zoom\", touchtime, event = d3_eventDispatch(zoom, \"zoomstart\", \"zoom\", \"zoomend\"), x0, x1, y0, y1;\n if (!d3_behavior_zoomWheel) {\n d3_behavior_zoomWheel = \"onwheel\" in d3_document ? (d3_behavior_zoomDelta = function() {\n return -d3.event.deltaY * (d3.event.deltaMode ? 120 : 1);\n }, \"wheel\") : \"onmousewheel\" in d3_document ? (d3_behavior_zoomDelta = function() {\n return d3.event.wheelDelta;\n }, \"mousewheel\") : (d3_behavior_zoomDelta = function() {\n return -d3.event.detail;\n }, \"MozMousePixelScroll\");\n }\n function zoom(g) {\n g.on(mousedown, mousedowned).on(d3_behavior_zoomWheel + \".zoom\", mousewheeled).on(\"dblclick.zoom\", dblclicked).on(touchstart, touchstarted);\n }\n zoom.event = function(g) {\n g.each(function() {\n var dispatch = event.of(this, arguments), view1 = view;\n if (d3_transitionInheritId) {\n d3.select(this).transition().each(\"start.zoom\", function() {\n view = this.__chart__ || {\n x: 0,\n y: 0,\n k: 1\n };\n zoomstarted(dispatch);\n }).tween(\"zoom:zoom\", function() {\n var dx = size[0], dy = size[1], cx = center0 ? center0[0] : dx / 2, cy = center0 ? center0[1] : dy / 2, i = d3.interpolateZoom([ (cx - view.x) / view.k, (cy - view.y) / view.k, dx / view.k ], [ (cx - view1.x) / view1.k, (cy - view1.y) / view1.k, dx / view1.k ]);\n return function(t) {\n var l = i(t), k = dx / l[2];\n this.__chart__ = view = {\n x: cx - l[0] * k,\n y: cy - l[1] * k,\n k: k\n };\n zoomed(dispatch);\n };\n }).each(\"interrupt.zoom\", function() {\n zoomended(dispatch);\n }).each(\"end.zoom\", function() {\n zoomended(dispatch);\n });\n } else {\n this.__chart__ = view;\n zoomstarted(dispatch);\n zoomed(dispatch);\n zoomended(dispatch);\n }\n });\n };\n zoom.translate = function(_) {\n if (!arguments.length) return [ view.x, view.y ];\n view = {\n x: +_[0],\n y: +_[1],\n k: view.k\n };\n rescale();\n return zoom;\n };\n zoom.scale = function(_) {\n if (!arguments.length) return view.k;\n view = {\n x: view.x,\n y: view.y,\n k: null\n };\n scaleTo(+_);\n rescale();\n return zoom;\n };\n zoom.scaleExtent = function(_) {\n if (!arguments.length) return scaleExtent;\n scaleExtent = _ == null ? d3_behavior_zoomInfinity : [ +_[0], +_[1] ];\n return zoom;\n };\n zoom.center = function(_) {\n if (!arguments.length) return center;\n center = _ && [ +_[0], +_[1] ];\n return zoom;\n };\n zoom.size = function(_) {\n if (!arguments.length) return size;\n size = _ && [ +_[0], +_[1] ];\n return zoom;\n };\n zoom.duration = function(_) {\n if (!arguments.length) return duration;\n duration = +_;\n return zoom;\n };\n zoom.x = function(z) {\n if (!arguments.length) return x1;\n x1 = z;\n x0 = z.copy();\n view = {\n x: 0,\n y: 0,\n k: 1\n };\n return zoom;\n };\n zoom.y = function(z) {\n if (!arguments.length) return y1;\n y1 = z;\n y0 = z.copy();\n view = {\n x: 0,\n y: 0,\n k: 1\n };\n return zoom;\n };\n function location(p) {\n return [ (p[0] - view.x) / view.k, (p[1] - view.y) / view.k ];\n }\n function point(l) {\n return [ l[0] * view.k + view.x, l[1] * view.k + view.y ];\n }\n function scaleTo(s) {\n view.k = Math.max(scaleExtent[0], Math.min(scaleExtent[1], s));\n }\n function translateTo(p, l) {\n l = point(l);\n view.x += p[0] - l[0];\n view.y += p[1] - l[1];\n }\n function zoomTo(that, p, l, k) {\n that.__chart__ = {\n x: view.x,\n y: view.y,\n k: view.k\n };\n scaleTo(Math.pow(2, k));\n translateTo(center0 = p, l);\n that = d3.select(that);\n if (duration > 0) that = that.transition().duration(duration);\n that.call(zoom.event);\n }\n function rescale() {\n if (x1) x1.domain(x0.range().map(function(x) {\n return (x - view.x) / view.k;\n }).map(x0.invert));\n if (y1) y1.domain(y0.range().map(function(y) {\n return (y - view.y) / view.k;\n }).map(y0.invert));\n }\n function zoomstarted(dispatch) {\n if (!zooming++) dispatch({\n type: \"zoomstart\"\n });\n }\n function zoomed(dispatch) {\n rescale();\n dispatch({\n type: \"zoom\",\n scale: view.k,\n translate: [ view.x, view.y ]\n });\n }\n function zoomended(dispatch) {\n if (!--zooming) dispatch({\n type: \"zoomend\"\n }), center0 = null;\n }\n function mousedowned() {\n var that = this, dispatch = event.of(that, arguments), dragged = 0, subject = d3.select(d3_window(that)).on(mousemove, moved).on(mouseup, ended), location0 = location(d3.mouse(that)), dragRestore = d3_event_dragSuppress(that);\n d3_selection_interrupt.call(that);\n zoomstarted(dispatch);\n function moved() {\n dragged = 1;\n translateTo(d3.mouse(that), location0);\n zoomed(dispatch);\n }\n function ended() {\n subject.on(mousemove, null).on(mouseup, null);\n dragRestore(dragged);\n zoomended(dispatch);\n }\n }\n function touchstarted() {\n var that = this, dispatch = event.of(that, arguments), locations0 = {}, distance0 = 0, scale0, zoomName = \".zoom-\" + d3.event.changedTouches[0].identifier, touchmove = \"touchmove\" + zoomName, touchend = \"touchend\" + zoomName, targets = [], subject = d3.select(that), dragRestore = d3_event_dragSuppress(that);\n started();\n zoomstarted(dispatch);\n subject.on(mousedown, null).on(touchstart, started);\n function relocate() {\n var touches = d3.touches(that);\n scale0 = view.k;\n touches.forEach(function(t) {\n if (t.identifier in locations0) locations0[t.identifier] = location(t);\n });\n return touches;\n }\n function started() {\n var target = d3.event.target;\n d3.select(target).on(touchmove, moved).on(touchend, ended);\n targets.push(target);\n var changed = d3.event.changedTouches;\n for (var i = 0, n = changed.length; i < n; ++i) {\n locations0[changed[i].identifier] = null;\n }\n var touches = relocate(), now = Date.now();\n if (touches.length === 1) {\n if (now - touchtime < 500) {\n var p = touches[0];\n zoomTo(that, p, locations0[p.identifier], Math.floor(Math.log(view.k) / Math.LN2) + 1);\n d3_eventPreventDefault();\n }\n touchtime = now;\n } else if (touches.length > 1) {\n var p = touches[0], q = touches[1], dx = p[0] - q[0], dy = p[1] - q[1];\n distance0 = dx * dx + dy * dy;\n }\n }\n function moved() {\n var touches = d3.touches(that), p0, l0, p1, l1;\n d3_selection_interrupt.call(that);\n for (var i = 0, n = touches.length; i < n; ++i, l1 = null) {\n p1 = touches[i];\n if (l1 = locations0[p1.identifier]) {\n if (l0) break;\n p0 = p1, l0 = l1;\n }\n }\n if (l1) {\n var distance1 = (distance1 = p1[0] - p0[0]) * distance1 + (distance1 = p1[1] - p0[1]) * distance1, scale1 = distance0 && Math.sqrt(distance1 / distance0);\n p0 = [ (p0[0] + p1[0]) / 2, (p0[1] + p1[1]) / 2 ];\n l0 = [ (l0[0] + l1[0]) / 2, (l0[1] + l1[1]) / 2 ];\n scaleTo(scale1 * scale0);\n }\n touchtime = null;\n translateTo(p0, l0);\n zoomed(dispatch);\n }\n function ended() {\n if (d3.event.touches.length) {\n var changed = d3.event.changedTouches;\n for (var i = 0, n = changed.length; i < n; ++i) {\n delete locations0[changed[i].identifier];\n }\n for (var identifier in locations0) {\n return void relocate();\n }\n }\n d3.selectAll(targets).on(zoomName, null);\n subject.on(mousedown, mousedowned).on(touchstart, touchstarted);\n dragRestore();\n zoomended(dispatch);\n }\n }\n function mousewheeled() {\n var dispatch = event.of(this, arguments);\n if (mousewheelTimer) clearTimeout(mousewheelTimer); else d3_selection_interrupt.call(this), \n translate0 = location(center0 = center || d3.mouse(this)), zoomstarted(dispatch);\n mousewheelTimer = setTimeout(function() {\n mousewheelTimer = null;\n zoomended(dispatch);\n }, 50);\n d3_eventPreventDefault();\n scaleTo(Math.pow(2, d3_behavior_zoomDelta() * .002) * view.k);\n translateTo(center0, translate0);\n zoomed(dispatch);\n }\n function dblclicked() {\n var p = d3.mouse(this), k = Math.log(view.k) / Math.LN2;\n zoomTo(this, p, location(p), d3.event.shiftKey ? Math.ceil(k) - 1 : Math.floor(k) + 1);\n }\n return d3.rebind(zoom, event, \"on\");\n };\n var d3_behavior_zoomInfinity = [ 0, Infinity ], d3_behavior_zoomDelta, d3_behavior_zoomWheel;\n d3.color = d3_color;\n function d3_color() {}\n d3_color.prototype.toString = function() {\n return this.rgb() + \"\";\n };\n d3.hsl = d3_hsl;\n function d3_hsl(h, s, l) {\n return this instanceof d3_hsl ? void (this.h = +h, this.s = +s, this.l = +l) : arguments.length < 2 ? h instanceof d3_hsl ? new d3_hsl(h.h, h.s, h.l) : d3_rgb_parse(\"\" + h, d3_rgb_hsl, d3_hsl) : new d3_hsl(h, s, l);\n }\n var d3_hslPrototype = d3_hsl.prototype = new d3_color();\n d3_hslPrototype.brighter = function(k) {\n k = Math.pow(.7, arguments.length ? k : 1);\n return new d3_hsl(this.h, this.s, this.l / k);\n };\n d3_hslPrototype.darker = function(k) {\n k = Math.pow(.7, arguments.length ? k : 1);\n return new d3_hsl(this.h, this.s, k * this.l);\n };\n d3_hslPrototype.rgb = function() {\n return d3_hsl_rgb(this.h, this.s, this.l);\n };\n function d3_hsl_rgb(h, s, l) {\n var m1, m2;\n h = isNaN(h) ? 0 : (h %= 360) < 0 ? h + 360 : h;\n s = isNaN(s) ? 0 : s < 0 ? 0 : s > 1 ? 1 : s;\n l = l < 0 ? 0 : l > 1 ? 1 : l;\n m2 = l <= .5 ? l * (1 + s) : l + s - l * s;\n m1 = 2 * l - m2;\n function v(h) {\n if (h > 360) h -= 360; else if (h < 0) h += 360;\n if (h < 60) return m1 + (m2 - m1) * h / 60;\n if (h < 180) return m2;\n if (h < 240) return m1 + (m2 - m1) * (240 - h) / 60;\n return m1;\n }\n function vv(h) {\n return Math.round(v(h) * 255);\n }\n return new d3_rgb(vv(h + 120), vv(h), vv(h - 120));\n }\n d3.hcl = d3_hcl;\n function d3_hcl(h, c, l) {\n return this instanceof d3_hcl ? void (this.h = +h, this.c = +c, this.l = +l) : arguments.length < 2 ? h instanceof d3_hcl ? new d3_hcl(h.h, h.c, h.l) : h instanceof d3_lab ? d3_lab_hcl(h.l, h.a, h.b) : d3_lab_hcl((h = d3_rgb_lab((h = d3.rgb(h)).r, h.g, h.b)).l, h.a, h.b) : new d3_hcl(h, c, l);\n }\n var d3_hclPrototype = d3_hcl.prototype = new d3_color();\n d3_hclPrototype.brighter = function(k) {\n return new d3_hcl(this.h, this.c, Math.min(100, this.l + d3_lab_K * (arguments.length ? k : 1)));\n };\n d3_hclPrototype.darker = function(k) {\n return new d3_hcl(this.h, this.c, Math.max(0, this.l - d3_lab_K * (arguments.length ? k : 1)));\n };\n d3_hclPrototype.rgb = function() {\n return d3_hcl_lab(this.h, this.c, this.l).rgb();\n };\n function d3_hcl_lab(h, c, l) {\n if (isNaN(h)) h = 0;\n if (isNaN(c)) c = 0;\n return new d3_lab(l, Math.cos(h *= d3_radians) * c, Math.sin(h) * c);\n }\n d3.lab = d3_lab;\n function d3_lab(l, a, b) {\n return this instanceof d3_lab ? void (this.l = +l, this.a = +a, this.b = +b) : arguments.length < 2 ? l instanceof d3_lab ? new d3_lab(l.l, l.a, l.b) : l instanceof d3_hcl ? d3_hcl_lab(l.h, l.c, l.l) : d3_rgb_lab((l = d3_rgb(l)).r, l.g, l.b) : new d3_lab(l, a, b);\n }\n var d3_lab_K = 18;\n var d3_lab_X = .95047, d3_lab_Y = 1, d3_lab_Z = 1.08883;\n var d3_labPrototype = d3_lab.prototype = new d3_color();\n d3_labPrototype.brighter = function(k) {\n return new d3_lab(Math.min(100, this.l + d3_lab_K * (arguments.length ? k : 1)), this.a, this.b);\n };\n d3_labPrototype.darker = function(k) {\n return new d3_lab(Math.max(0, this.l - d3_lab_K * (arguments.length ? k : 1)), this.a, this.b);\n };\n d3_labPrototype.rgb = function() {\n return d3_lab_rgb(this.l, this.a, this.b);\n };\n function d3_lab_rgb(l, a, b) {\n var y = (l + 16) / 116, x = y + a / 500, z = y - b / 200;\n x = d3_lab_xyz(x) * d3_lab_X;\n y = d3_lab_xyz(y) * d3_lab_Y;\n z = d3_lab_xyz(z) * d3_lab_Z;\n return new d3_rgb(d3_xyz_rgb(3.2404542 * x - 1.5371385 * y - .4985314 * z), d3_xyz_rgb(-.969266 * x + 1.8760108 * y + .041556 * z), d3_xyz_rgb(.0556434 * x - .2040259 * y + 1.0572252 * z));\n }\n function d3_lab_hcl(l, a, b) {\n return l > 0 ? new d3_hcl(Math.atan2(b, a) * d3_degrees, Math.sqrt(a * a + b * b), l) : new d3_hcl(NaN, NaN, l);\n }\n function d3_lab_xyz(x) {\n return x > .206893034 ? x * x * x : (x - 4 / 29) / 7.787037;\n }\n function d3_xyz_lab(x) {\n return x > .008856 ? Math.pow(x, 1 / 3) : 7.787037 * x + 4 / 29;\n }\n function d3_xyz_rgb(r) {\n return Math.round(255 * (r <= .00304 ? 12.92 * r : 1.055 * Math.pow(r, 1 / 2.4) - .055));\n }\n d3.rgb = d3_rgb;\n function d3_rgb(r, g, b) {\n return this instanceof d3_rgb ? void (this.r = ~~r, this.g = ~~g, this.b = ~~b) : arguments.length < 2 ? r instanceof d3_rgb ? new d3_rgb(r.r, r.g, r.b) : d3_rgb_parse(\"\" + r, d3_rgb, d3_hsl_rgb) : new d3_rgb(r, g, b);\n }\n function d3_rgbNumber(value) {\n return new d3_rgb(value >> 16, value >> 8 & 255, value & 255);\n }\n function d3_rgbString(value) {\n return d3_rgbNumber(value) + \"\";\n }\n var d3_rgbPrototype = d3_rgb.prototype = new d3_color();\n d3_rgbPrototype.brighter = function(k) {\n k = Math.pow(.7, arguments.length ? k : 1);\n var r = this.r, g = this.g, b = this.b, i = 30;\n if (!r && !g && !b) return new d3_rgb(i, i, i);\n if (r && r < i) r = i;\n if (g && g < i) g = i;\n if (b && b < i) b = i;\n return new d3_rgb(Math.min(255, r / k), Math.min(255, g / k), Math.min(255, b / k));\n };\n d3_rgbPrototype.darker = function(k) {\n k = Math.pow(.7, arguments.length ? k : 1);\n return new d3_rgb(k * this.r, k * this.g, k * this.b);\n };\n d3_rgbPrototype.hsl = function() {\n return d3_rgb_hsl(this.r, this.g, this.b);\n };\n d3_rgbPrototype.toString = function() {\n return \"#\" + d3_rgb_hex(this.r) + d3_rgb_hex(this.g) + d3_rgb_hex(this.b);\n };\n function d3_rgb_hex(v) {\n return v < 16 ? \"0\" + Math.max(0, v).toString(16) : Math.min(255, v).toString(16);\n }\n function d3_rgb_parse(format, rgb, hsl) {\n var r = 0, g = 0, b = 0, m1, m2, color;\n m1 = /([a-z]+)\\((.*)\\)/.exec(format = format.toLowerCase());\n if (m1) {\n m2 = m1[2].split(\",\");\n switch (m1[1]) {\n case \"hsl\":\n {\n return hsl(parseFloat(m2[0]), parseFloat(m2[1]) / 100, parseFloat(m2[2]) / 100);\n }\n\n case \"rgb\":\n {\n return rgb(d3_rgb_parseNumber(m2[0]), d3_rgb_parseNumber(m2[1]), d3_rgb_parseNumber(m2[2]));\n }\n }\n }\n if (color = d3_rgb_names.get(format)) {\n return rgb(color.r, color.g, color.b);\n }\n if (format != null && format.charAt(0) === \"#\" && !isNaN(color = parseInt(format.slice(1), 16))) {\n if (format.length === 4) {\n r = (color & 3840) >> 4;\n r = r >> 4 | r;\n g = color & 240;\n g = g >> 4 | g;\n b = color & 15;\n b = b << 4 | b;\n } else if (format.length === 7) {\n r = (color & 16711680) >> 16;\n g = (color & 65280) >> 8;\n b = color & 255;\n }\n }\n return rgb(r, g, b);\n }\n function d3_rgb_hsl(r, g, b) {\n var min = Math.min(r /= 255, g /= 255, b /= 255), max = Math.max(r, g, b), d = max - min, h, s, l = (max + min) / 2;\n if (d) {\n s = l < .5 ? d / (max + min) : d / (2 - max - min);\n if (r == max) h = (g - b) / d + (g < b ? 6 : 0); else if (g == max) h = (b - r) / d + 2; else h = (r - g) / d + 4;\n h *= 60;\n } else {\n h = NaN;\n s = l > 0 && l < 1 ? 0 : h;\n }\n return new d3_hsl(h, s, l);\n }\n function d3_rgb_lab(r, g, b) {\n r = d3_rgb_xyz(r);\n g = d3_rgb_xyz(g);\n b = d3_rgb_xyz(b);\n var x = d3_xyz_lab((.4124564 * r + .3575761 * g + .1804375 * b) / d3_lab_X), y = d3_xyz_lab((.2126729 * r + .7151522 * g + .072175 * b) / d3_lab_Y), z = d3_xyz_lab((.0193339 * r + .119192 * g + .9503041 * b) / d3_lab_Z);\n return d3_lab(116 * y - 16, 500 * (x - y), 200 * (y - z));\n }\n function d3_rgb_xyz(r) {\n return (r /= 255) <= .04045 ? r / 12.92 : Math.pow((r + .055) / 1.055, 2.4);\n }\n function d3_rgb_parseNumber(c) {\n var f = parseFloat(c);\n return c.charAt(c.length - 1) === \"%\" ? Math.round(f * 2.55) : f;\n }\n var d3_rgb_names = d3.map({\n aliceblue: 15792383,\n antiquewhite: 16444375,\n aqua: 65535,\n aquamarine: 8388564,\n azure: 15794175,\n beige: 16119260,\n bisque: 16770244,\n black: 0,\n blanchedalmond: 16772045,\n blue: 255,\n blueviolet: 9055202,\n brown: 10824234,\n burlywood: 14596231,\n cadetblue: 6266528,\n chartreuse: 8388352,\n chocolate: 13789470,\n coral: 16744272,\n cornflowerblue: 6591981,\n cornsilk: 16775388,\n crimson: 14423100,\n cyan: 65535,\n darkblue: 139,\n darkcyan: 35723,\n darkgoldenrod: 12092939,\n darkgray: 11119017,\n darkgreen: 25600,\n darkgrey: 11119017,\n darkkhaki: 12433259,\n darkmagenta: 9109643,\n darkolivegreen: 5597999,\n darkorange: 16747520,\n darkorchid: 10040012,\n darkred: 9109504,\n darksalmon: 15308410,\n darkseagreen: 9419919,\n darkslateblue: 4734347,\n darkslategray: 3100495,\n darkslategrey: 3100495,\n darkturquoise: 52945,\n darkviolet: 9699539,\n deeppink: 16716947,\n deepskyblue: 49151,\n dimgray: 6908265,\n dimgrey: 6908265,\n dodgerblue: 2003199,\n firebrick: 11674146,\n floralwhite: 16775920,\n forestgreen: 2263842,\n fuchsia: 16711935,\n gainsboro: 14474460,\n ghostwhite: 16316671,\n gold: 16766720,\n goldenrod: 14329120,\n gray: 8421504,\n green: 32768,\n greenyellow: 11403055,\n grey: 8421504,\n honeydew: 15794160,\n hotpink: 16738740,\n indianred: 13458524,\n indigo: 4915330,\n ivory: 16777200,\n khaki: 15787660,\n lavender: 15132410,\n lavenderblush: 16773365,\n lawngreen: 8190976,\n lemonchiffon: 16775885,\n lightblue: 11393254,\n lightcoral: 15761536,\n lightcyan: 14745599,\n lightgoldenrodyellow: 16448210,\n lightgray: 13882323,\n lightgreen: 9498256,\n lightgrey: 13882323,\n lightpink: 16758465,\n lightsalmon: 16752762,\n lightseagreen: 2142890,\n lightskyblue: 8900346,\n lightslategray: 7833753,\n lightslategrey: 7833753,\n lightsteelblue: 11584734,\n lightyellow: 16777184,\n lime: 65280,\n limegreen: 3329330,\n linen: 16445670,\n magenta: 16711935,\n maroon: 8388608,\n mediumaquamarine: 6737322,\n mediumblue: 205,\n mediumorchid: 12211667,\n mediumpurple: 9662683,\n mediumseagreen: 3978097,\n mediumslateblue: 8087790,\n mediumspringgreen: 64154,\n mediumturquoise: 4772300,\n mediumvioletred: 13047173,\n midnightblue: 1644912,\n mintcream: 16121850,\n mistyrose: 16770273,\n moccasin: 16770229,\n navajowhite: 16768685,\n navy: 128,\n oldlace: 16643558,\n olive: 8421376,\n olivedrab: 7048739,\n orange: 16753920,\n orangered: 16729344,\n orchid: 14315734,\n palegoldenrod: 15657130,\n palegreen: 10025880,\n paleturquoise: 11529966,\n palevioletred: 14381203,\n papayawhip: 16773077,\n peachpuff: 16767673,\n peru: 13468991,\n pink: 16761035,\n plum: 14524637,\n powderblue: 11591910,\n purple: 8388736,\n rebeccapurple: 6697881,\n red: 16711680,\n rosybrown: 12357519,\n royalblue: 4286945,\n saddlebrown: 9127187,\n salmon: 16416882,\n sandybrown: 16032864,\n seagreen: 3050327,\n seashell: 16774638,\n sienna: 10506797,\n silver: 12632256,\n skyblue: 8900331,\n slateblue: 6970061,\n slategray: 7372944,\n slategrey: 7372944,\n snow: 16775930,\n springgreen: 65407,\n steelblue: 4620980,\n tan: 13808780,\n teal: 32896,\n thistle: 14204888,\n tomato: 16737095,\n turquoise: 4251856,\n violet: 15631086,\n wheat: 16113331,\n white: 16777215,\n whitesmoke: 16119285,\n yellow: 16776960,\n yellowgreen: 10145074\n });\n d3_rgb_names.forEach(function(key, value) {\n d3_rgb_names.set(key, d3_rgbNumber(value));\n });\n function d3_functor(v) {\n return typeof v === \"function\" ? v : function() {\n return v;\n };\n }\n d3.functor = d3_functor;\n d3.xhr = d3_xhrType(d3_identity);\n function d3_xhrType(response) {\n return function(url, mimeType, callback) {\n if (arguments.length === 2 && typeof mimeType === \"function\") callback = mimeType, \n mimeType = null;\n return d3_xhr(url, mimeType, response, callback);\n };\n }\n function d3_xhr(url, mimeType, response, callback) {\n var xhr = {}, dispatch = d3.dispatch(\"beforesend\", \"progress\", \"load\", \"error\"), headers = {}, request = new XMLHttpRequest(), responseType = null;\n if (this.XDomainRequest && !(\"withCredentials\" in request) && /^(http(s)?:)?\\/\\//.test(url)) request = new XDomainRequest();\n \"onload\" in request ? request.onload = request.onerror = respond : request.onreadystatechange = function() {\n request.readyState > 3 && respond();\n };\n function respond() {\n var status = request.status, result;\n if (!status && d3_xhrHasResponse(request) || status >= 200 && status < 300 || status === 304) {\n try {\n result = response.call(xhr, request);\n } catch (e) {\n dispatch.error.call(xhr, e);\n return;\n }\n dispatch.load.call(xhr, result);\n } else {\n dispatch.error.call(xhr, request);\n }\n }\n request.onprogress = function(event) {\n var o = d3.event;\n d3.event = event;\n try {\n dispatch.progress.call(xhr, request);\n } finally {\n d3.event = o;\n }\n };\n xhr.header = function(name, value) {\n name = (name + \"\").toLowerCase();\n if (arguments.length < 2) return headers[name];\n if (value == null) delete headers[name]; else headers[name] = value + \"\";\n return xhr;\n };\n xhr.mimeType = function(value) {\n if (!arguments.length) return mimeType;\n mimeType = value == null ? null : value + \"\";\n return xhr;\n };\n xhr.responseType = function(value) {\n if (!arguments.length) return responseType;\n responseType = value;\n return xhr;\n };\n xhr.response = function(value) {\n response = value;\n return xhr;\n };\n [ \"get\", \"post\" ].forEach(function(method) {\n xhr[method] = function() {\n return xhr.send.apply(xhr, [ method ].concat(d3_array(arguments)));\n };\n });\n xhr.send = function(method, data, callback) {\n if (arguments.length === 2 && typeof data === \"function\") callback = data, data = null;\n request.open(method, url, true);\n if (mimeType != null && !(\"accept\" in headers)) headers[\"accept\"] = mimeType + \",*/*\";\n if (request.setRequestHeader) for (var name in headers) request.setRequestHeader(name, headers[name]);\n if (mimeType != null && request.overrideMimeType) request.overrideMimeType(mimeType);\n if (responseType != null) request.responseType = responseType;\n if (callback != null) xhr.on(\"error\", callback).on(\"load\", function(request) {\n callback(null, request);\n });\n dispatch.beforesend.call(xhr, request);\n request.send(data == null ? null : data);\n return xhr;\n };\n xhr.abort = function() {\n request.abort();\n return xhr;\n };\n d3.rebind(xhr, dispatch, \"on\");\n return callback == null ? xhr : xhr.get(d3_xhr_fixCallback(callback));\n }\n function d3_xhr_fixCallback(callback) {\n return callback.length === 1 ? function(error, request) {\n callback(error == null ? request : null);\n } : callback;\n }\n function d3_xhrHasResponse(request) {\n var type = request.responseType;\n return type && type !== \"text\" ? request.response : request.responseText;\n }\n d3.dsv = function(delimiter, mimeType) {\n var reFormat = new RegExp('[\"' + delimiter + \"\\n]\"), delimiterCode = delimiter.charCodeAt(0);\n function dsv(url, row, callback) {\n if (arguments.length < 3) callback = row, row = null;\n var xhr = d3_xhr(url, mimeType, row == null ? response : typedResponse(row), callback);\n xhr.row = function(_) {\n return arguments.length ? xhr.response((row = _) == null ? response : typedResponse(_)) : row;\n };\n return xhr;\n }\n function response(request) {\n return dsv.parse(request.responseText);\n }\n function typedResponse(f) {\n return function(request) {\n return dsv.parse(request.responseText, f);\n };\n }\n dsv.parse = function(text, f) {\n var o;\n return dsv.parseRows(text, function(row, i) {\n if (o) return o(row, i - 1);\n var a = new Function(\"d\", \"return {\" + row.map(function(name, i) {\n return JSON.stringify(name) + \": d[\" + i + \"]\";\n }).join(\",\") + \"}\");\n o = f ? function(row, i) {\n return f(a(row), i);\n } : a;\n });\n };\n dsv.parseRows = function(text, f) {\n var EOL = {}, EOF = {}, rows = [], N = text.length, I = 0, n = 0, t, eol;\n function token() {\n if (I >= N) return EOF;\n if (eol) return eol = false, EOL;\n var j = I;\n if (text.charCodeAt(j) === 34) {\n var i = j;\n while (i++ < N) {\n if (text.charCodeAt(i) === 34) {\n if (text.charCodeAt(i + 1) !== 34) break;\n ++i;\n }\n }\n I = i + 2;\n var c = text.charCodeAt(i + 1);\n if (c === 13) {\n eol = true;\n if (text.charCodeAt(i + 2) === 10) ++I;\n } else if (c === 10) {\n eol = true;\n }\n return text.slice(j + 1, i).replace(/\"\"/g, '\"');\n }\n while (I < N) {\n var c = text.charCodeAt(I++), k = 1;\n if (c === 10) eol = true; else if (c === 13) {\n eol = true;\n if (text.charCodeAt(I) === 10) ++I, ++k;\n } else if (c !== delimiterCode) continue;\n return text.slice(j, I - k);\n }\n return text.slice(j);\n }\n while ((t = token()) !== EOF) {\n var a = [];\n while (t !== EOL && t !== EOF) {\n a.push(t);\n t = token();\n }\n if (f && (a = f(a, n++)) == null) continue;\n rows.push(a);\n }\n return rows;\n };\n dsv.format = function(rows) {\n if (Array.isArray(rows[0])) return dsv.formatRows(rows);\n var fieldSet = new d3_Set(), fields = [];\n rows.forEach(function(row) {\n for (var field in row) {\n if (!fieldSet.has(field)) {\n fields.push(fieldSet.add(field));\n }\n }\n });\n return [ fields.map(formatValue).join(delimiter) ].concat(rows.map(function(row) {\n return fields.map(function(field) {\n return formatValue(row[field]);\n }).join(delimiter);\n })).join(\"\\n\");\n };\n dsv.formatRows = function(rows) {\n return rows.map(formatRow).join(\"\\n\");\n };\n function formatRow(row) {\n return row.map(formatValue).join(delimiter);\n }\n function formatValue(text) {\n return reFormat.test(text) ? '\"' + text.replace(/\\\"/g, '\"\"') + '\"' : text;\n }\n return dsv;\n };\n d3.csv = d3.dsv(\",\", \"text/csv\");\n d3.tsv = d3.dsv(\"\t\", \"text/tab-separated-values\");\n var d3_timer_queueHead, d3_timer_queueTail, d3_timer_interval, d3_timer_timeout, d3_timer_frame = this[d3_vendorSymbol(this, \"requestAnimationFrame\")] || function(callback) {\n setTimeout(callback, 17);\n };\n d3.timer = function() {\n d3_timer.apply(this, arguments);\n };\n function d3_timer(callback, delay, then) {\n var n = arguments.length;\n if (n < 2) delay = 0;\n if (n < 3) then = Date.now();\n var time = then + delay, timer = {\n c: callback,\n t: time,\n n: null\n };\n if (d3_timer_queueTail) d3_timer_queueTail.n = timer; else d3_timer_queueHead = timer;\n d3_timer_queueTail = timer;\n if (!d3_timer_interval) {\n d3_timer_timeout = clearTimeout(d3_timer_timeout);\n d3_timer_interval = 1;\n d3_timer_frame(d3_timer_step);\n }\n return timer;\n }\n function d3_timer_step() {\n var now = d3_timer_mark(), delay = d3_timer_sweep() - now;\n if (delay > 24) {\n if (isFinite(delay)) {\n clearTimeout(d3_timer_timeout);\n d3_timer_timeout = setTimeout(d3_timer_step, delay);\n }\n d3_timer_interval = 0;\n } else {\n d3_timer_interval = 1;\n d3_timer_frame(d3_timer_step);\n }\n }\n d3.timer.flush = function() {\n d3_timer_mark();\n d3_timer_sweep();\n };\n function d3_timer_mark() {\n var now = Date.now(), timer = d3_timer_queueHead;\n while (timer) {\n if (now >= timer.t && timer.c(now - timer.t)) timer.c = null;\n timer = timer.n;\n }\n return now;\n }\n function d3_timer_sweep() {\n var t0, t1 = d3_timer_queueHead, time = Infinity;\n while (t1) {\n if (t1.c) {\n if (t1.t < time) time = t1.t;\n t1 = (t0 = t1).n;\n } else {\n t1 = t0 ? t0.n = t1.n : d3_timer_queueHead = t1.n;\n }\n }\n d3_timer_queueTail = t0;\n return time;\n }\n function d3_format_precision(x, p) {\n return p - (x ? Math.ceil(Math.log(x) / Math.LN10) : 1);\n }\n d3.round = function(x, n) {\n return n ? Math.round(x * (n = Math.pow(10, n))) / n : Math.round(x);\n };\n var d3_formatPrefixes = [ \"y\", \"z\", \"a\", \"f\", \"p\", \"n\", \"µ\", \"m\", \"\", \"k\", \"M\", \"G\", \"T\", \"P\", \"E\", \"Z\", \"Y\" ].map(d3_formatPrefix);\n d3.formatPrefix = function(value, precision) {\n var i = 0;\n if (value = +value) {\n if (value < 0) value *= -1;\n if (precision) value = d3.round(value, d3_format_precision(value, precision));\n i = 1 + Math.floor(1e-12 + Math.log(value) / Math.LN10);\n i = Math.max(-24, Math.min(24, Math.floor((i - 1) / 3) * 3));\n }\n return d3_formatPrefixes[8 + i / 3];\n };\n function d3_formatPrefix(d, i) {\n var k = Math.pow(10, abs(8 - i) * 3);\n return {\n scale: i > 8 ? function(d) {\n return d / k;\n } : function(d) {\n return d * k;\n },\n symbol: d\n };\n }\n function d3_locale_numberFormat(locale) {\n var locale_decimal = locale.decimal, locale_thousands = locale.thousands, locale_grouping = locale.grouping, locale_currency = locale.currency, formatGroup = locale_grouping && locale_thousands ? function(value, width) {\n var i = value.length, t = [], j = 0, g = locale_grouping[0], length = 0;\n while (i > 0 && g > 0) {\n if (length + g + 1 > width) g = Math.max(1, width - length);\n t.push(value.substring(i -= g, i + g));\n if ((length += g + 1) > width) break;\n g = locale_grouping[j = (j + 1) % locale_grouping.length];\n }\n return t.reverse().join(locale_thousands);\n } : d3_identity;\n return function(specifier) {\n var match = d3_format_re.exec(specifier), fill = match[1] || \" \", align = match[2] || \">\", sign = match[3] || \"-\", symbol = match[4] || \"\", zfill = match[5], width = +match[6], comma = match[7], precision = match[8], type = match[9], scale = 1, prefix = \"\", suffix = \"\", integer = false, exponent = true;\n if (precision) precision = +precision.substring(1);\n if (zfill || fill === \"0\" && align === \"=\") {\n zfill = fill = \"0\";\n align = \"=\";\n }\n switch (type) {\n case \"n\":\n comma = true;\n type = \"g\";\n break;\n\n case \"%\":\n scale = 100;\n suffix = \"%\";\n type = \"f\";\n break;\n\n case \"p\":\n scale = 100;\n suffix = \"%\";\n type = \"r\";\n break;\n\n case \"b\":\n case \"o\":\n case \"x\":\n case \"X\":\n if (symbol === \"#\") prefix = \"0\" + type.toLowerCase();\n\n case \"c\":\n exponent = false;\n\n case \"d\":\n integer = true;\n precision = 0;\n break;\n\n case \"s\":\n scale = -1;\n type = \"r\";\n break;\n }\n if (symbol === \"$\") prefix = locale_currency[0], suffix = locale_currency[1];\n if (type == \"r\" && !precision) type = \"g\";\n if (precision != null) {\n if (type == \"g\") precision = Math.max(1, Math.min(21, precision)); else if (type == \"e\" || type == \"f\") precision = Math.max(0, Math.min(20, precision));\n }\n type = d3_format_types.get(type) || d3_format_typeDefault;\n var zcomma = zfill && comma;\n return function(value) {\n var fullSuffix = suffix;\n if (integer && value % 1) return \"\";\n var negative = value < 0 || value === 0 && 1 / value < 0 ? (value = -value, \"-\") : sign === \"-\" ? \"\" : sign;\n if (scale < 0) {\n var unit = d3.formatPrefix(value, precision);\n value = unit.scale(value);\n fullSuffix = unit.symbol + suffix;\n } else {\n value *= scale;\n }\n value = type(value, precision);\n var i = value.lastIndexOf(\".\"), before, after;\n if (i < 0) {\n var j = exponent ? value.lastIndexOf(\"e\") : -1;\n if (j < 0) before = value, after = \"\"; else before = value.substring(0, j), after = value.substring(j);\n } else {\n before = value.substring(0, i);\n after = locale_decimal + value.substring(i + 1);\n }\n if (!zfill && comma) before = formatGroup(before, Infinity);\n var length = prefix.length + before.length + after.length + (zcomma ? 0 : negative.length), padding = length < width ? new Array(length = width - length + 1).join(fill) : \"\";\n if (zcomma) before = formatGroup(padding + before, padding.length ? width - after.length : Infinity);\n negative += prefix;\n value = before + after;\n return (align === \"<\" ? negative + value + padding : align === \">\" ? padding + negative + value : align === \"^\" ? padding.substring(0, length >>= 1) + negative + value + padding.substring(length) : negative + (zcomma ? value : padding + value)) + fullSuffix;\n };\n };\n }\n var d3_format_re = /(?:([^{])?([<>=^]))?([+\\- ])?([$#])?(0)?(\\d+)?(,)?(\\.-?\\d+)?([a-z%])?/i;\n var d3_format_types = d3.map({\n b: function(x) {\n return x.toString(2);\n },\n c: function(x) {\n return String.fromCharCode(x);\n },\n o: function(x) {\n return x.toString(8);\n },\n x: function(x) {\n return x.toString(16);\n },\n X: function(x) {\n return x.toString(16).toUpperCase();\n },\n g: function(x, p) {\n return x.toPrecision(p);\n },\n e: function(x, p) {\n return x.toExponential(p);\n },\n f: function(x, p) {\n return x.toFixed(p);\n },\n r: function(x, p) {\n return (x = d3.round(x, d3_format_precision(x, p))).toFixed(Math.max(0, Math.min(20, d3_format_precision(x * (1 + 1e-15), p))));\n }\n });\n function d3_format_typeDefault(x) {\n return x + \"\";\n }\n var d3_time = d3.time = {}, d3_date = Date;\n function d3_date_utc() {\n this._ = new Date(arguments.length > 1 ? Date.UTC.apply(this, arguments) : arguments[0]);\n }\n d3_date_utc.prototype = {\n getDate: function() {\n return this._.getUTCDate();\n },\n getDay: function() {\n return this._.getUTCDay();\n },\n getFullYear: function() {\n return this._.getUTCFullYear();\n },\n getHours: function() {\n return this._.getUTCHours();\n },\n getMilliseconds: function() {\n return this._.getUTCMilliseconds();\n },\n getMinutes: function() {\n return this._.getUTCMinutes();\n },\n getMonth: function() {\n return this._.getUTCMonth();\n },\n getSeconds: function() {\n return this._.getUTCSeconds();\n },\n getTime: function() {\n return this._.getTime();\n },\n getTimezoneOffset: function() {\n return 0;\n },\n valueOf: function() {\n return this._.valueOf();\n },\n setDate: function() {\n d3_time_prototype.setUTCDate.apply(this._, arguments);\n },\n setDay: function() {\n d3_time_prototype.setUTCDay.apply(this._, arguments);\n },\n setFullYear: function() {\n d3_time_prototype.setUTCFullYear.apply(this._, arguments);\n },\n setHours: function() {\n d3_time_prototype.setUTCHours.apply(this._, arguments);\n },\n setMilliseconds: function() {\n d3_time_prototype.setUTCMilliseconds.apply(this._, arguments);\n },\n setMinutes: function() {\n d3_time_prototype.setUTCMinutes.apply(this._, arguments);\n },\n setMonth: function() {\n d3_time_prototype.setUTCMonth.apply(this._, arguments);\n },\n setSeconds: function() {\n d3_time_prototype.setUTCSeconds.apply(this._, arguments);\n },\n setTime: function() {\n d3_time_prototype.setTime.apply(this._, arguments);\n }\n };\n var d3_time_prototype = Date.prototype;\n function d3_time_interval(local, step, number) {\n function round(date) {\n var d0 = local(date), d1 = offset(d0, 1);\n return date - d0 < d1 - date ? d0 : d1;\n }\n function ceil(date) {\n step(date = local(new d3_date(date - 1)), 1);\n return date;\n }\n function offset(date, k) {\n step(date = new d3_date(+date), k);\n return date;\n }\n function range(t0, t1, dt) {\n var time = ceil(t0), times = [];\n if (dt > 1) {\n while (time < t1) {\n if (!(number(time) % dt)) times.push(new Date(+time));\n step(time, 1);\n }\n } else {\n while (time < t1) times.push(new Date(+time)), step(time, 1);\n }\n return times;\n }\n function range_utc(t0, t1, dt) {\n try {\n d3_date = d3_date_utc;\n var utc = new d3_date_utc();\n utc._ = t0;\n return range(utc, t1, dt);\n } finally {\n d3_date = Date;\n }\n }\n local.floor = local;\n local.round = round;\n local.ceil = ceil;\n local.offset = offset;\n local.range = range;\n var utc = local.utc = d3_time_interval_utc(local);\n utc.floor = utc;\n utc.round = d3_time_interval_utc(round);\n utc.ceil = d3_time_interval_utc(ceil);\n utc.offset = d3_time_interval_utc(offset);\n utc.range = range_utc;\n return local;\n }\n function d3_time_interval_utc(method) {\n return function(date, k) {\n try {\n d3_date = d3_date_utc;\n var utc = new d3_date_utc();\n utc._ = date;\n return method(utc, k)._;\n } finally {\n d3_date = Date;\n }\n };\n }\n d3_time.year = d3_time_interval(function(date) {\n date = d3_time.day(date);\n date.setMonth(0, 1);\n return date;\n }, function(date, offset) {\n date.setFullYear(date.getFullYear() + offset);\n }, function(date) {\n return date.getFullYear();\n });\n d3_time.years = d3_time.year.range;\n d3_time.years.utc = d3_time.year.utc.range;\n d3_time.day = d3_time_interval(function(date) {\n var day = new d3_date(2e3, 0);\n day.setFullYear(date.getFullYear(), date.getMonth(), date.getDate());\n return day;\n }, function(date, offset) {\n date.setDate(date.getDate() + offset);\n }, function(date) {\n return date.getDate() - 1;\n });\n d3_time.days = d3_time.day.range;\n d3_time.days.utc = d3_time.day.utc.range;\n d3_time.dayOfYear = function(date) {\n var year = d3_time.year(date);\n return Math.floor((date - year - (date.getTimezoneOffset() - year.getTimezoneOffset()) * 6e4) / 864e5);\n };\n [ \"sunday\", \"monday\", \"tuesday\", \"wednesday\", \"thursday\", \"friday\", \"saturday\" ].forEach(function(day, i) {\n i = 7 - i;\n var interval = d3_time[day] = d3_time_interval(function(date) {\n (date = d3_time.day(date)).setDate(date.getDate() - (date.getDay() + i) % 7);\n return date;\n }, function(date, offset) {\n date.setDate(date.getDate() + Math.floor(offset) * 7);\n }, function(date) {\n var day = d3_time.year(date).getDay();\n return Math.floor((d3_time.dayOfYear(date) + (day + i) % 7) / 7) - (day !== i);\n });\n d3_time[day + \"s\"] = interval.range;\n d3_time[day + \"s\"].utc = interval.utc.range;\n d3_time[day + \"OfYear\"] = function(date) {\n var day = d3_time.year(date).getDay();\n return Math.floor((d3_time.dayOfYear(date) + (day + i) % 7) / 7);\n };\n });\n d3_time.week = d3_time.sunday;\n d3_time.weeks = d3_time.sunday.range;\n d3_time.weeks.utc = d3_time.sunday.utc.range;\n d3_time.weekOfYear = d3_time.sundayOfYear;\n function d3_locale_timeFormat(locale) {\n var locale_dateTime = locale.dateTime, locale_date = locale.date, locale_time = locale.time, locale_periods = locale.periods, locale_days = locale.days, locale_shortDays = locale.shortDays, locale_months = locale.months, locale_shortMonths = locale.shortMonths;\n function d3_time_format(template) {\n var n = template.length;\n function format(date) {\n var string = [], i = -1, j = 0, c, p, f;\n while (++i < n) {\n if (template.charCodeAt(i) === 37) {\n string.push(template.slice(j, i));\n if ((p = d3_time_formatPads[c = template.charAt(++i)]) != null) c = template.charAt(++i);\n if (f = d3_time_formats[c]) c = f(date, p == null ? c === \"e\" ? \" \" : \"0\" : p);\n string.push(c);\n j = i + 1;\n }\n }\n string.push(template.slice(j, i));\n return string.join(\"\");\n }\n format.parse = function(string) {\n var d = {\n y: 1900,\n m: 0,\n d: 1,\n H: 0,\n M: 0,\n S: 0,\n L: 0,\n Z: null\n }, i = d3_time_parse(d, template, string, 0);\n if (i != string.length) return null;\n if (\"p\" in d) d.H = d.H % 12 + d.p * 12;\n var localZ = d.Z != null && d3_date !== d3_date_utc, date = new (localZ ? d3_date_utc : d3_date)();\n if (\"j\" in d) date.setFullYear(d.y, 0, d.j); else if (\"W\" in d || \"U\" in d) {\n if (!(\"w\" in d)) d.w = \"W\" in d ? 1 : 0;\n date.setFullYear(d.y, 0, 1);\n date.setFullYear(d.y, 0, \"W\" in d ? (d.w + 6) % 7 + d.W * 7 - (date.getDay() + 5) % 7 : d.w + d.U * 7 - (date.getDay() + 6) % 7);\n } else date.setFullYear(d.y, d.m, d.d);\n date.setHours(d.H + (d.Z / 100 | 0), d.M + d.Z % 100, d.S, d.L);\n return localZ ? date._ : date;\n };\n format.toString = function() {\n return template;\n };\n return format;\n }\n function d3_time_parse(date, template, string, j) {\n var c, p, t, i = 0, n = template.length, m = string.length;\n while (i < n) {\n if (j >= m) return -1;\n c = template.charCodeAt(i++);\n if (c === 37) {\n t = template.charAt(i++);\n p = d3_time_parsers[t in d3_time_formatPads ? template.charAt(i++) : t];\n if (!p || (j = p(date, string, j)) < 0) return -1;\n } else if (c != string.charCodeAt(j++)) {\n return -1;\n }\n }\n return j;\n }\n d3_time_format.utc = function(template) {\n var local = d3_time_format(template);\n function format(date) {\n try {\n d3_date = d3_date_utc;\n var utc = new d3_date();\n utc._ = date;\n return local(utc);\n } finally {\n d3_date = Date;\n }\n }\n format.parse = function(string) {\n try {\n d3_date = d3_date_utc;\n var date = local.parse(string);\n return date && date._;\n } finally {\n d3_date = Date;\n }\n };\n format.toString = local.toString;\n return format;\n };\n d3_time_format.multi = d3_time_format.utc.multi = d3_time_formatMulti;\n var d3_time_periodLookup = d3.map(), d3_time_dayRe = d3_time_formatRe(locale_days), d3_time_dayLookup = d3_time_formatLookup(locale_days), d3_time_dayAbbrevRe = d3_time_formatRe(locale_shortDays), d3_time_dayAbbrevLookup = d3_time_formatLookup(locale_shortDays), d3_time_monthRe = d3_time_formatRe(locale_months), d3_time_monthLookup = d3_time_formatLookup(locale_months), d3_time_monthAbbrevRe = d3_time_formatRe(locale_shortMonths), d3_time_monthAbbrevLookup = d3_time_formatLookup(locale_shortMonths);\n locale_periods.forEach(function(p, i) {\n d3_time_periodLookup.set(p.toLowerCase(), i);\n });\n var d3_time_formats = {\n a: function(d) {\n return locale_shortDays[d.getDay()];\n },\n A: function(d) {\n return locale_days[d.getDay()];\n },\n b: function(d) {\n return locale_shortMonths[d.getMonth()];\n },\n B: function(d) {\n return locale_months[d.getMonth()];\n },\n c: d3_time_format(locale_dateTime),\n d: function(d, p) {\n return d3_time_formatPad(d.getDate(), p, 2);\n },\n e: function(d, p) {\n return d3_time_formatPad(d.getDate(), p, 2);\n },\n H: function(d, p) {\n return d3_time_formatPad(d.getHours(), p, 2);\n },\n I: function(d, p) {\n return d3_time_formatPad(d.getHours() % 12 || 12, p, 2);\n },\n j: function(d, p) {\n return d3_time_formatPad(1 + d3_time.dayOfYear(d), p, 3);\n },\n L: function(d, p) {\n return d3_time_formatPad(d.getMilliseconds(), p, 3);\n },\n m: function(d, p) {\n return d3_time_formatPad(d.getMonth() + 1, p, 2);\n },\n M: function(d, p) {\n return d3_time_formatPad(d.getMinutes(), p, 2);\n },\n p: function(d) {\n return locale_periods[+(d.getHours() >= 12)];\n },\n S: function(d, p) {\n return d3_time_formatPad(d.getSeconds(), p, 2);\n },\n U: function(d, p) {\n return d3_time_formatPad(d3_time.sundayOfYear(d), p, 2);\n },\n w: function(d) {\n return d.getDay();\n },\n W: function(d, p) {\n return d3_time_formatPad(d3_time.mondayOfYear(d), p, 2);\n },\n x: d3_time_format(locale_date),\n X: d3_time_format(locale_time),\n y: function(d, p) {\n return d3_time_formatPad(d.getFullYear() % 100, p, 2);\n },\n Y: function(d, p) {\n return d3_time_formatPad(d.getFullYear() % 1e4, p, 4);\n },\n Z: d3_time_zone,\n \"%\": function() {\n return \"%\";\n }\n };\n var d3_time_parsers = {\n a: d3_time_parseWeekdayAbbrev,\n A: d3_time_parseWeekday,\n b: d3_time_parseMonthAbbrev,\n B: d3_time_parseMonth,\n c: d3_time_parseLocaleFull,\n d: d3_time_parseDay,\n e: d3_time_parseDay,\n H: d3_time_parseHour24,\n I: d3_time_parseHour24,\n j: d3_time_parseDayOfYear,\n L: d3_time_parseMilliseconds,\n m: d3_time_parseMonthNumber,\n M: d3_time_parseMinutes,\n p: d3_time_parseAmPm,\n S: d3_time_parseSeconds,\n U: d3_time_parseWeekNumberSunday,\n w: d3_time_parseWeekdayNumber,\n W: d3_time_parseWeekNumberMonday,\n x: d3_time_parseLocaleDate,\n X: d3_time_parseLocaleTime,\n y: d3_time_parseYear,\n Y: d3_time_parseFullYear,\n Z: d3_time_parseZone,\n \"%\": d3_time_parseLiteralPercent\n };\n function d3_time_parseWeekdayAbbrev(date, string, i) {\n d3_time_dayAbbrevRe.lastIndex = 0;\n var n = d3_time_dayAbbrevRe.exec(string.slice(i));\n return n ? (date.w = d3_time_dayAbbrevLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;\n }\n function d3_time_parseWeekday(date, string, i) {\n d3_time_dayRe.lastIndex = 0;\n var n = d3_time_dayRe.exec(string.slice(i));\n return n ? (date.w = d3_time_dayLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;\n }\n function d3_time_parseMonthAbbrev(date, string, i) {\n d3_time_monthAbbrevRe.lastIndex = 0;\n var n = d3_time_monthAbbrevRe.exec(string.slice(i));\n return n ? (date.m = d3_time_monthAbbrevLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;\n }\n function d3_time_parseMonth(date, string, i) {\n d3_time_monthRe.lastIndex = 0;\n var n = d3_time_monthRe.exec(string.slice(i));\n return n ? (date.m = d3_time_monthLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;\n }\n function d3_time_parseLocaleFull(date, string, i) {\n return d3_time_parse(date, d3_time_formats.c.toString(), string, i);\n }\n function d3_time_parseLocaleDate(date, string, i) {\n return d3_time_parse(date, d3_time_formats.x.toString(), string, i);\n }\n function d3_time_parseLocaleTime(date, string, i) {\n return d3_time_parse(date, d3_time_formats.X.toString(), string, i);\n }\n function d3_time_parseAmPm(date, string, i) {\n var n = d3_time_periodLookup.get(string.slice(i, i += 2).toLowerCase());\n return n == null ? -1 : (date.p = n, i);\n }\n return d3_time_format;\n }\n var d3_time_formatPads = {\n \"-\": \"\",\n _: \" \",\n \"0\": \"0\"\n }, d3_time_numberRe = /^\\s*\\d+/, d3_time_percentRe = /^%/;\n function d3_time_formatPad(value, fill, width) {\n var sign = value < 0 ? \"-\" : \"\", string = (sign ? -value : value) + \"\", length = string.length;\n return sign + (length < width ? new Array(width - length + 1).join(fill) + string : string);\n }\n function d3_time_formatRe(names) {\n return new RegExp(\"^(?:\" + names.map(d3.requote).join(\"|\") + \")\", \"i\");\n }\n function d3_time_formatLookup(names) {\n var map = new d3_Map(), i = -1, n = names.length;\n while (++i < n) map.set(names[i].toLowerCase(), i);\n return map;\n }\n function d3_time_parseWeekdayNumber(date, string, i) {\n d3_time_numberRe.lastIndex = 0;\n var n = d3_time_numberRe.exec(string.slice(i, i + 1));\n return n ? (date.w = +n[0], i + n[0].length) : -1;\n }\n function d3_time_parseWeekNumberSunday(date, string, i) {\n d3_time_numberRe.lastIndex = 0;\n var n = d3_time_numberRe.exec(string.slice(i));\n return n ? (date.U = +n[0], i + n[0].length) : -1;\n }\n function d3_time_parseWeekNumberMonday(date, string, i) {\n d3_time_numberRe.lastIndex = 0;\n var n = d3_time_numberRe.exec(string.slice(i));\n return n ? (date.W = +n[0], i + n[0].length) : -1;\n }\n function d3_time_parseFullYear(date, string, i) {\n d3_time_numberRe.lastIndex = 0;\n var n = d3_time_numberRe.exec(string.slice(i, i + 4));\n return n ? (date.y = +n[0], i + n[0].length) : -1;\n }\n function d3_time_parseYear(date, string, i) {\n d3_time_numberRe.lastIndex = 0;\n var n = d3_time_numberRe.exec(string.slice(i, i + 2));\n return n ? (date.y = d3_time_expandYear(+n[0]), i + n[0].length) : -1;\n }\n function d3_time_parseZone(date, string, i) {\n return /^[+-]\\d{4}$/.test(string = string.slice(i, i + 5)) ? (date.Z = -string, \n i + 5) : -1;\n }\n function d3_time_expandYear(d) {\n return d + (d > 68 ? 1900 : 2e3);\n }\n function d3_time_parseMonthNumber(date, string, i) {\n d3_time_numberRe.lastIndex = 0;\n var n = d3_time_numberRe.exec(string.slice(i, i + 2));\n return n ? (date.m = n[0] - 1, i + n[0].length) : -1;\n }\n function d3_time_parseDay(date, string, i) {\n d3_time_numberRe.lastIndex = 0;\n var n = d3_time_numberRe.exec(string.slice(i, i + 2));\n return n ? (date.d = +n[0], i + n[0].length) : -1;\n }\n function d3_time_parseDayOfYear(date, string, i) {\n d3_time_numberRe.lastIndex = 0;\n var n = d3_time_numberRe.exec(string.slice(i, i + 3));\n return n ? (date.j = +n[0], i + n[0].length) : -1;\n }\n function d3_time_parseHour24(date, string, i) {\n d3_time_numberRe.lastIndex = 0;\n var n = d3_time_numberRe.exec(string.slice(i, i + 2));\n return n ? (date.H = +n[0], i + n[0].length) : -1;\n }\n function d3_time_parseMinutes(date, string, i) {\n d3_time_numberRe.lastIndex = 0;\n var n = d3_time_numberRe.exec(string.slice(i, i + 2));\n return n ? (date.M = +n[0], i + n[0].length) : -1;\n }\n function d3_time_parseSeconds(date, string, i) {\n d3_time_numberRe.lastIndex = 0;\n var n = d3_time_numberRe.exec(string.slice(i, i + 2));\n return n ? (date.S = +n[0], i + n[0].length) : -1;\n }\n function d3_time_parseMilliseconds(date, string, i) {\n d3_time_numberRe.lastIndex = 0;\n var n = d3_time_numberRe.exec(string.slice(i, i + 3));\n return n ? (date.L = +n[0], i + n[0].length) : -1;\n }\n function d3_time_zone(d) {\n var z = d.getTimezoneOffset(), zs = z > 0 ? \"-\" : \"+\", zh = abs(z) / 60 | 0, zm = abs(z) % 60;\n return zs + d3_time_formatPad(zh, \"0\", 2) + d3_time_formatPad(zm, \"0\", 2);\n }\n function d3_time_parseLiteralPercent(date, string, i) {\n d3_time_percentRe.lastIndex = 0;\n var n = d3_time_percentRe.exec(string.slice(i, i + 1));\n return n ? i + n[0].length : -1;\n }\n function d3_time_formatMulti(formats) {\n var n = formats.length, i = -1;\n while (++i < n) formats[i][0] = this(formats[i][0]);\n return function(date) {\n var i = 0, f = formats[i];\n while (!f[1](date)) f = formats[++i];\n return f[0](date);\n };\n }\n d3.locale = function(locale) {\n return {\n numberFormat: d3_locale_numberFormat(locale),\n timeFormat: d3_locale_timeFormat(locale)\n };\n };\n var d3_locale_enUS = d3.locale({\n decimal: \".\",\n thousands: \",\",\n grouping: [ 3 ],\n currency: [ \"$\", \"\" ],\n dateTime: \"%a %b %e %X %Y\",\n date: \"%m/%d/%Y\",\n time: \"%H:%M:%S\",\n periods: [ \"AM\", \"PM\" ],\n days: [ \"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\", \"Thursday\", \"Friday\", \"Saturday\" ],\n shortDays: [ \"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\" ],\n months: [ \"January\", \"February\", \"March\", \"April\", \"May\", \"June\", \"July\", \"August\", \"September\", \"October\", \"November\", \"December\" ],\n shortMonths: [ \"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\" ]\n });\n d3.format = d3_locale_enUS.numberFormat;\n d3.geo = {};\n function d3_adder() {}\n d3_adder.prototype = {\n s: 0,\n t: 0,\n add: function(y) {\n d3_adderSum(y, this.t, d3_adderTemp);\n d3_adderSum(d3_adderTemp.s, this.s, this);\n if (this.s) this.t += d3_adderTemp.t; else this.s = d3_adderTemp.t;\n },\n reset: function() {\n this.s = this.t = 0;\n },\n valueOf: function() {\n return this.s;\n }\n };\n var d3_adderTemp = new d3_adder();\n function d3_adderSum(a, b, o) {\n var x = o.s = a + b, bv = x - a, av = x - bv;\n o.t = a - av + (b - bv);\n }\n d3.geo.stream = function(object, listener) {\n if (object && d3_geo_streamObjectType.hasOwnProperty(object.type)) {\n d3_geo_streamObjectType[object.type](object, listener);\n } else {\n d3_geo_streamGeometry(object, listener);\n }\n };\n function d3_geo_streamGeometry(geometry, listener) {\n if (geometry && d3_geo_streamGeometryType.hasOwnProperty(geometry.type)) {\n d3_geo_streamGeometryType[geometry.type](geometry, listener);\n }\n }\n var d3_geo_streamObjectType = {\n Feature: function(feature, listener) {\n d3_geo_streamGeometry(feature.geometry, listener);\n },\n FeatureCollection: function(object, listener) {\n var features = object.features, i = -1, n = features.length;\n while (++i < n) d3_geo_streamGeometry(features[i].geometry, listener);\n }\n };\n var d3_geo_streamGeometryType = {\n Sphere: function(object, listener) {\n listener.sphere();\n },\n Point: function(object, listener) {\n object = object.coordinates;\n listener.point(object[0], object[1], object[2]);\n },\n MultiPoint: function(object, listener) {\n var coordinates = object.coordinates, i = -1, n = coordinates.length;\n while (++i < n) object = coordinates[i], listener.point(object[0], object[1], object[2]);\n },\n LineString: function(object, listener) {\n d3_geo_streamLine(object.coordinates, listener, 0);\n },\n MultiLineString: function(object, listener) {\n var coordinates = object.coordinates, i = -1, n = coordinates.length;\n while (++i < n) d3_geo_streamLine(coordinates[i], listener, 0);\n },\n Polygon: function(object, listener) {\n d3_geo_streamPolygon(object.coordinates, listener);\n },\n MultiPolygon: function(object, listener) {\n var coordinates = object.coordinates, i = -1, n = coordinates.length;\n while (++i < n) d3_geo_streamPolygon(coordinates[i], listener);\n },\n GeometryCollection: function(object, listener) {\n var geometries = object.geometries, i = -1, n = geometries.length;\n while (++i < n) d3_geo_streamGeometry(geometries[i], listener);\n }\n };\n function d3_geo_streamLine(coordinates, listener, closed) {\n var i = -1, n = coordinates.length - closed, coordinate;\n listener.lineStart();\n while (++i < n) coordinate = coordinates[i], listener.point(coordinate[0], coordinate[1], coordinate[2]);\n listener.lineEnd();\n }\n function d3_geo_streamPolygon(coordinates, listener) {\n var i = -1, n = coordinates.length;\n listener.polygonStart();\n while (++i < n) d3_geo_streamLine(coordinates[i], listener, 1);\n listener.polygonEnd();\n }\n d3.geo.area = function(object) {\n d3_geo_areaSum = 0;\n d3.geo.stream(object, d3_geo_area);\n return d3_geo_areaSum;\n };\n var d3_geo_areaSum, d3_geo_areaRingSum = new d3_adder();\n var d3_geo_area = {\n sphere: function() {\n d3_geo_areaSum += 4 * π;\n },\n point: d3_noop,\n lineStart: d3_noop,\n lineEnd: d3_noop,\n polygonStart: function() {\n d3_geo_areaRingSum.reset();\n d3_geo_area.lineStart = d3_geo_areaRingStart;\n },\n polygonEnd: function() {\n var area = 2 * d3_geo_areaRingSum;\n d3_geo_areaSum += area < 0 ? 4 * π + area : area;\n d3_geo_area.lineStart = d3_geo_area.lineEnd = d3_geo_area.point = d3_noop;\n }\n };\n function d3_geo_areaRingStart() {\n var λ00, φ00, λ0, cosφ0, sinφ0;\n d3_geo_area.point = function(λ, φ) {\n d3_geo_area.point = nextPoint;\n λ0 = (λ00 = λ) * d3_radians, cosφ0 = Math.cos(φ = (φ00 = φ) * d3_radians / 2 + π / 4), \n sinφ0 = Math.sin(φ);\n };\n function nextPoint(λ, φ) {\n λ *= d3_radians;\n φ = φ * d3_radians / 2 + π / 4;\n var dλ = λ - λ0, sdλ = dλ >= 0 ? 1 : -1, adλ = sdλ * dλ, cosφ = Math.cos(φ), sinφ = Math.sin(φ), k = sinφ0 * sinφ, u = cosφ0 * cosφ + k * Math.cos(adλ), v = k * sdλ * Math.sin(adλ);\n d3_geo_areaRingSum.add(Math.atan2(v, u));\n λ0 = λ, cosφ0 = cosφ, sinφ0 = sinφ;\n }\n d3_geo_area.lineEnd = function() {\n nextPoint(λ00, φ00);\n };\n }\n function d3_geo_cartesian(spherical) {\n var λ = spherical[0], φ = spherical[1], cosφ = Math.cos(φ);\n return [ cosφ * Math.cos(λ), cosφ * Math.sin(λ), Math.sin(φ) ];\n }\n function d3_geo_cartesianDot(a, b) {\n return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];\n }\n function d3_geo_cartesianCross(a, b) {\n return [ a[1] * b[2] - a[2] * b[1], a[2] * b[0] - a[0] * b[2], a[0] * b[1] - a[1] * b[0] ];\n }\n function d3_geo_cartesianAdd(a, b) {\n a[0] += b[0];\n a[1] += b[1];\n a[2] += b[2];\n }\n function d3_geo_cartesianScale(vector, k) {\n return [ vector[0] * k, vector[1] * k, vector[2] * k ];\n }\n function d3_geo_cartesianNormalize(d) {\n var l = Math.sqrt(d[0] * d[0] + d[1] * d[1] + d[2] * d[2]);\n d[0] /= l;\n d[1] /= l;\n d[2] /= l;\n }\n function d3_geo_spherical(cartesian) {\n return [ Math.atan2(cartesian[1], cartesian[0]), d3_asin(cartesian[2]) ];\n }\n function d3_geo_sphericalEqual(a, b) {\n return abs(a[0] - b[0]) < ε && abs(a[1] - b[1]) < ε;\n }\n d3.geo.bounds = function() {\n var λ0, φ0, λ1, φ1, λ_, λ__, φ__, p0, dλSum, ranges, range;\n var bound = {\n point: point,\n lineStart: lineStart,\n lineEnd: lineEnd,\n polygonStart: function() {\n bound.point = ringPoint;\n bound.lineStart = ringStart;\n bound.lineEnd = ringEnd;\n dλSum = 0;\n d3_geo_area.polygonStart();\n },\n polygonEnd: function() {\n d3_geo_area.polygonEnd();\n bound.point = point;\n bound.lineStart = lineStart;\n bound.lineEnd = lineEnd;\n if (d3_geo_areaRingSum < 0) λ0 = -(λ1 = 180), φ0 = -(φ1 = 90); else if (dλSum > ε) φ1 = 90; else if (dλSum < -ε) φ0 = -90;\n range[0] = λ0, range[1] = λ1;\n }\n };\n function point(λ, φ) {\n ranges.push(range = [ λ0 = λ, λ1 = λ ]);\n if (φ < φ0) φ0 = φ;\n if (φ > φ1) φ1 = φ;\n }\n function linePoint(λ, φ) {\n var p = d3_geo_cartesian([ λ * d3_radians, φ * d3_radians ]);\n if (p0) {\n var normal = d3_geo_cartesianCross(p0, p), equatorial = [ normal[1], -normal[0], 0 ], inflection = d3_geo_cartesianCross(equatorial, normal);\n d3_geo_cartesianNormalize(inflection);\n inflection = d3_geo_spherical(inflection);\n var dλ = λ - λ_, s = dλ > 0 ? 1 : -1, λi = inflection[0] * d3_degrees * s, antimeridian = abs(dλ) > 180;\n if (antimeridian ^ (s * λ_ < λi && λi < s * λ)) {\n var φi = inflection[1] * d3_degrees;\n if (φi > φ1) φ1 = φi;\n } else if (λi = (λi + 360) % 360 - 180, antimeridian ^ (s * λ_ < λi && λi < s * λ)) {\n var φi = -inflection[1] * d3_degrees;\n if (φi < φ0) φ0 = φi;\n } else {\n if (φ < φ0) φ0 = φ;\n if (φ > φ1) φ1 = φ;\n }\n if (antimeridian) {\n if (λ < λ_) {\n if (angle(λ0, λ) > angle(λ0, λ1)) λ1 = λ;\n } else {\n if (angle(λ, λ1) > angle(λ0, λ1)) λ0 = λ;\n }\n } else {\n if (λ1 >= λ0) {\n if (λ < λ0) λ0 = λ;\n if (λ > λ1) λ1 = λ;\n } else {\n if (λ > λ_) {\n if (angle(λ0, λ) > angle(λ0, λ1)) λ1 = λ;\n } else {\n if (angle(λ, λ1) > angle(λ0, λ1)) λ0 = λ;\n }\n }\n }\n } else {\n point(λ, φ);\n }\n p0 = p, λ_ = λ;\n }\n function lineStart() {\n bound.point = linePoint;\n }\n function lineEnd() {\n range[0] = λ0, range[1] = λ1;\n bound.point = point;\n p0 = null;\n }\n function ringPoint(λ, φ) {\n if (p0) {\n var dλ = λ - λ_;\n dλSum += abs(dλ) > 180 ? dλ + (dλ > 0 ? 360 : -360) : dλ;\n } else λ__ = λ, φ__ = φ;\n d3_geo_area.point(λ, φ);\n linePoint(λ, φ);\n }\n function ringStart() {\n d3_geo_area.lineStart();\n }\n function ringEnd() {\n ringPoint(λ__, φ__);\n d3_geo_area.lineEnd();\n if (abs(dλSum) > ε) λ0 = -(λ1 = 180);\n range[0] = λ0, range[1] = λ1;\n p0 = null;\n }\n function angle(λ0, λ1) {\n return (λ1 -= λ0) < 0 ? λ1 + 360 : λ1;\n }\n function compareRanges(a, b) {\n return a[0] - b[0];\n }\n function withinRange(x, range) {\n return range[0] <= range[1] ? range[0] <= x && x <= range[1] : x < range[0] || range[1] < x;\n }\n return function(feature) {\n φ1 = λ1 = -(λ0 = φ0 = Infinity);\n ranges = [];\n d3.geo.stream(feature, bound);\n var n = ranges.length;\n if (n) {\n ranges.sort(compareRanges);\n for (var i = 1, a = ranges[0], b, merged = [ a ]; i < n; ++i) {\n b = ranges[i];\n if (withinRange(b[0], a) || withinRange(b[1], a)) {\n if (angle(a[0], b[1]) > angle(a[0], a[1])) a[1] = b[1];\n if (angle(b[0], a[1]) > angle(a[0], a[1])) a[0] = b[0];\n } else {\n merged.push(a = b);\n }\n }\n var best = -Infinity, dλ;\n for (var n = merged.length - 1, i = 0, a = merged[n], b; i <= n; a = b, ++i) {\n b = merged[i];\n if ((dλ = angle(a[1], b[0])) > best) best = dλ, λ0 = b[0], λ1 = a[1];\n }\n }\n ranges = range = null;\n return λ0 === Infinity || φ0 === Infinity ? [ [ NaN, NaN ], [ NaN, NaN ] ] : [ [ λ0, φ0 ], [ λ1, φ1 ] ];\n };\n }();\n d3.geo.centroid = function(object) {\n d3_geo_centroidW0 = d3_geo_centroidW1 = d3_geo_centroidX0 = d3_geo_centroidY0 = d3_geo_centroidZ0 = d3_geo_centroidX1 = d3_geo_centroidY1 = d3_geo_centroidZ1 = d3_geo_centroidX2 = d3_geo_centroidY2 = d3_geo_centroidZ2 = 0;\n d3.geo.stream(object, d3_geo_centroid);\n var x = d3_geo_centroidX2, y = d3_geo_centroidY2, z = d3_geo_centroidZ2, m = x * x + y * y + z * z;\n if (m < ε2) {\n x = d3_geo_centroidX1, y = d3_geo_centroidY1, z = d3_geo_centroidZ1;\n if (d3_geo_centroidW1 < ε) x = d3_geo_centroidX0, y = d3_geo_centroidY0, z = d3_geo_centroidZ0;\n m = x * x + y * y + z * z;\n if (m < ε2) return [ NaN, NaN ];\n }\n return [ Math.atan2(y, x) * d3_degrees, d3_asin(z / Math.sqrt(m)) * d3_degrees ];\n };\n var d3_geo_centroidW0, d3_geo_centroidW1, d3_geo_centroidX0, d3_geo_centroidY0, d3_geo_centroidZ0, d3_geo_centroidX1, d3_geo_centroidY1, d3_geo_centroidZ1, d3_geo_centroidX2, d3_geo_centroidY2, d3_geo_centroidZ2;\n var d3_geo_centroid = {\n sphere: d3_noop,\n point: d3_geo_centroidPoint,\n lineStart: d3_geo_centroidLineStart,\n lineEnd: d3_geo_centroidLineEnd,\n polygonStart: function() {\n d3_geo_centroid.lineStart = d3_geo_centroidRingStart;\n },\n polygonEnd: function() {\n d3_geo_centroid.lineStart = d3_geo_centroidLineStart;\n }\n };\n function d3_geo_centroidPoint(λ, φ) {\n λ *= d3_radians;\n var cosφ = Math.cos(φ *= d3_radians);\n d3_geo_centroidPointXYZ(cosφ * Math.cos(λ), cosφ * Math.sin(λ), Math.sin(φ));\n }\n function d3_geo_centroidPointXYZ(x, y, z) {\n ++d3_geo_centroidW0;\n d3_geo_centroidX0 += (x - d3_geo_centroidX0) / d3_geo_centroidW0;\n d3_geo_centroidY0 += (y - d3_geo_centroidY0) / d3_geo_centroidW0;\n d3_geo_centroidZ0 += (z - d3_geo_centroidZ0) / d3_geo_centroidW0;\n }\n function d3_geo_centroidLineStart() {\n var x0, y0, z0;\n d3_geo_centroid.point = function(λ, φ) {\n λ *= d3_radians;\n var cosφ = Math.cos(φ *= d3_radians);\n x0 = cosφ * Math.cos(λ);\n y0 = cosφ * Math.sin(λ);\n z0 = Math.sin(φ);\n d3_geo_centroid.point = nextPoint;\n d3_geo_centroidPointXYZ(x0, y0, z0);\n };\n function nextPoint(λ, φ) {\n λ *= d3_radians;\n var cosφ = Math.cos(φ *= d3_radians), x = cosφ * Math.cos(λ), y = cosφ * Math.sin(λ), z = Math.sin(φ), w = Math.atan2(Math.sqrt((w = y0 * z - z0 * y) * w + (w = z0 * x - x0 * z) * w + (w = x0 * y - y0 * x) * w), x0 * x + y0 * y + z0 * z);\n d3_geo_centroidW1 += w;\n d3_geo_centroidX1 += w * (x0 + (x0 = x));\n d3_geo_centroidY1 += w * (y0 + (y0 = y));\n d3_geo_centroidZ1 += w * (z0 + (z0 = z));\n d3_geo_centroidPointXYZ(x0, y0, z0);\n }\n }\n function d3_geo_centroidLineEnd() {\n d3_geo_centroid.point = d3_geo_centroidPoint;\n }\n function d3_geo_centroidRingStart() {\n var λ00, φ00, x0, y0, z0;\n d3_geo_centroid.point = function(λ, φ) {\n λ00 = λ, φ00 = φ;\n d3_geo_centroid.point = nextPoint;\n λ *= d3_radians;\n var cosφ = Math.cos(φ *= d3_radians);\n x0 = cosφ * Math.cos(λ);\n y0 = cosφ * Math.sin(λ);\n z0 = Math.sin(φ);\n d3_geo_centroidPointXYZ(x0, y0, z0);\n };\n d3_geo_centroid.lineEnd = function() {\n nextPoint(λ00, φ00);\n d3_geo_centroid.lineEnd = d3_geo_centroidLineEnd;\n d3_geo_centroid.point = d3_geo_centroidPoint;\n };\n function nextPoint(λ, φ) {\n λ *= d3_radians;\n var cosφ = Math.cos(φ *= d3_radians), x = cosφ * Math.cos(λ), y = cosφ * Math.sin(λ), z = Math.sin(φ), cx = y0 * z - z0 * y, cy = z0 * x - x0 * z, cz = x0 * y - y0 * x, m = Math.sqrt(cx * cx + cy * cy + cz * cz), u = x0 * x + y0 * y + z0 * z, v = m && -d3_acos(u) / m, w = Math.atan2(m, u);\n d3_geo_centroidX2 += v * cx;\n d3_geo_centroidY2 += v * cy;\n d3_geo_centroidZ2 += v * cz;\n d3_geo_centroidW1 += w;\n d3_geo_centroidX1 += w * (x0 + (x0 = x));\n d3_geo_centroidY1 += w * (y0 + (y0 = y));\n d3_geo_centroidZ1 += w * (z0 + (z0 = z));\n d3_geo_centroidPointXYZ(x0, y0, z0);\n }\n }\n function d3_geo_compose(a, b) {\n function compose(x, y) {\n return x = a(x, y), b(x[0], x[1]);\n }\n if (a.invert && b.invert) compose.invert = function(x, y) {\n return x = b.invert(x, y), x && a.invert(x[0], x[1]);\n };\n return compose;\n }\n function d3_true() {\n return true;\n }\n function d3_geo_clipPolygon(segments, compare, clipStartInside, interpolate, listener) {\n var subject = [], clip = [];\n segments.forEach(function(segment) {\n if ((n = segment.length - 1) <= 0) return;\n var n, p0 = segment[0], p1 = segment[n];\n if (d3_geo_sphericalEqual(p0, p1)) {\n listener.lineStart();\n for (var i = 0; i < n; ++i) listener.point((p0 = segment[i])[0], p0[1]);\n listener.lineEnd();\n return;\n }\n var a = new d3_geo_clipPolygonIntersection(p0, segment, null, true), b = new d3_geo_clipPolygonIntersection(p0, null, a, false);\n a.o = b;\n subject.push(a);\n clip.push(b);\n a = new d3_geo_clipPolygonIntersection(p1, segment, null, false);\n b = new d3_geo_clipPolygonIntersection(p1, null, a, true);\n a.o = b;\n subject.push(a);\n clip.push(b);\n });\n clip.sort(compare);\n d3_geo_clipPolygonLinkCircular(subject);\n d3_geo_clipPolygonLinkCircular(clip);\n if (!subject.length) return;\n for (var i = 0, entry = clipStartInside, n = clip.length; i < n; ++i) {\n clip[i].e = entry = !entry;\n }\n var start = subject[0], points, point;\n while (1) {\n var current = start, isSubject = true;\n while (current.v) if ((current = current.n) === start) return;\n points = current.z;\n listener.lineStart();\n do {\n current.v = current.o.v = true;\n if (current.e) {\n if (isSubject) {\n for (var i = 0, n = points.length; i < n; ++i) listener.point((point = points[i])[0], point[1]);\n } else {\n interpolate(current.x, current.n.x, 1, listener);\n }\n current = current.n;\n } else {\n if (isSubject) {\n points = current.p.z;\n for (var i = points.length - 1; i >= 0; --i) listener.point((point = points[i])[0], point[1]);\n } else {\n interpolate(current.x, current.p.x, -1, listener);\n }\n current = current.p;\n }\n current = current.o;\n points = current.z;\n isSubject = !isSubject;\n } while (!current.v);\n listener.lineEnd();\n }\n }\n function d3_geo_clipPolygonLinkCircular(array) {\n if (!(n = array.length)) return;\n var n, i = 0, a = array[0], b;\n while (++i < n) {\n a.n = b = array[i];\n b.p = a;\n a = b;\n }\n a.n = b = array[0];\n b.p = a;\n }\n function d3_geo_clipPolygonIntersection(point, points, other, entry) {\n this.x = point;\n this.z = points;\n this.o = other;\n this.e = entry;\n this.v = false;\n this.n = this.p = null;\n }\n function d3_geo_clip(pointVisible, clipLine, interpolate, clipStart) {\n return function(rotate, listener) {\n var line = clipLine(listener), rotatedClipStart = rotate.invert(clipStart[0], clipStart[1]);\n var clip = {\n point: point,\n lineStart: lineStart,\n lineEnd: lineEnd,\n polygonStart: function() {\n clip.point = pointRing;\n clip.lineStart = ringStart;\n clip.lineEnd = ringEnd;\n segments = [];\n polygon = [];\n },\n polygonEnd: function() {\n clip.point = point;\n clip.lineStart = lineStart;\n clip.lineEnd = lineEnd;\n segments = d3.merge(segments);\n var clipStartInside = d3_geo_pointInPolygon(rotatedClipStart, polygon);\n if (segments.length) {\n if (!polygonStarted) listener.polygonStart(), polygonStarted = true;\n d3_geo_clipPolygon(segments, d3_geo_clipSort, clipStartInside, interpolate, listener);\n } else if (clipStartInside) {\n if (!polygonStarted) listener.polygonStart(), polygonStarted = true;\n listener.lineStart();\n interpolate(null, null, 1, listener);\n listener.lineEnd();\n }\n if (polygonStarted) listener.polygonEnd(), polygonStarted = false;\n segments = polygon = null;\n },\n sphere: function() {\n listener.polygonStart();\n listener.lineStart();\n interpolate(null, null, 1, listener);\n listener.lineEnd();\n listener.polygonEnd();\n }\n };\n function point(λ, φ) {\n var point = rotate(λ, φ);\n if (pointVisible(λ = point[0], φ = point[1])) listener.point(λ, φ);\n }\n function pointLine(λ, φ) {\n var point = rotate(λ, φ);\n line.point(point[0], point[1]);\n }\n function lineStart() {\n clip.point = pointLine;\n line.lineStart();\n }\n function lineEnd() {\n clip.point = point;\n line.lineEnd();\n }\n var segments;\n var buffer = d3_geo_clipBufferListener(), ringListener = clipLine(buffer), polygonStarted = false, polygon, ring;\n function pointRing(λ, φ) {\n ring.push([ λ, φ ]);\n var point = rotate(λ, φ);\n ringListener.point(point[0], point[1]);\n }\n function ringStart() {\n ringListener.lineStart();\n ring = [];\n }\n function ringEnd() {\n pointRing(ring[0][0], ring[0][1]);\n ringListener.lineEnd();\n var clean = ringListener.clean(), ringSegments = buffer.buffer(), segment, n = ringSegments.length;\n ring.pop();\n polygon.push(ring);\n ring = null;\n if (!n) return;\n if (clean & 1) {\n segment = ringSegments[0];\n var n = segment.length - 1, i = -1, point;\n if (n > 0) {\n if (!polygonStarted) listener.polygonStart(), polygonStarted = true;\n listener.lineStart();\n while (++i < n) listener.point((point = segment[i])[0], point[1]);\n listener.lineEnd();\n }\n return;\n }\n if (n > 1 && clean & 2) ringSegments.push(ringSegments.pop().concat(ringSegments.shift()));\n segments.push(ringSegments.filter(d3_geo_clipSegmentLength1));\n }\n return clip;\n };\n }\n function d3_geo_clipSegmentLength1(segment) {\n return segment.length > 1;\n }\n function d3_geo_clipBufferListener() {\n var lines = [], line;\n return {\n lineStart: function() {\n lines.push(line = []);\n },\n point: function(λ, φ) {\n line.push([ λ, φ ]);\n },\n lineEnd: d3_noop,\n buffer: function() {\n var buffer = lines;\n lines = [];\n line = null;\n return buffer;\n },\n rejoin: function() {\n if (lines.length > 1) lines.push(lines.pop().concat(lines.shift()));\n }\n };\n }\n function d3_geo_clipSort(a, b) {\n return ((a = a.x)[0] < 0 ? a[1] - halfπ - ε : halfπ - a[1]) - ((b = b.x)[0] < 0 ? b[1] - halfπ - ε : halfπ - b[1]);\n }\n var d3_geo_clipAntimeridian = d3_geo_clip(d3_true, d3_geo_clipAntimeridianLine, d3_geo_clipAntimeridianInterpolate, [ -π, -π / 2 ]);\n function d3_geo_clipAntimeridianLine(listener) {\n var λ0 = NaN, φ0 = NaN, sλ0 = NaN, clean;\n return {\n lineStart: function() {\n listener.lineStart();\n clean = 1;\n },\n point: function(λ1, φ1) {\n var sλ1 = λ1 > 0 ? π : -π, dλ = abs(λ1 - λ0);\n if (abs(dλ - π) < ε) {\n listener.point(λ0, φ0 = (φ0 + φ1) / 2 > 0 ? halfπ : -halfπ);\n listener.point(sλ0, φ0);\n listener.lineEnd();\n listener.lineStart();\n listener.point(sλ1, φ0);\n listener.point(λ1, φ0);\n clean = 0;\n } else if (sλ0 !== sλ1 && dλ >= π) {\n if (abs(λ0 - sλ0) < ε) λ0 -= sλ0 * ε;\n if (abs(λ1 - sλ1) < ε) λ1 -= sλ1 * ε;\n φ0 = d3_geo_clipAntimeridianIntersect(λ0, φ0, λ1, φ1);\n listener.point(sλ0, φ0);\n listener.lineEnd();\n listener.lineStart();\n listener.point(sλ1, φ0);\n clean = 0;\n }\n listener.point(λ0 = λ1, φ0 = φ1);\n sλ0 = sλ1;\n },\n lineEnd: function() {\n listener.lineEnd();\n λ0 = φ0 = NaN;\n },\n clean: function() {\n return 2 - clean;\n }\n };\n }\n function d3_geo_clipAntimeridianIntersect(λ0, φ0, λ1, φ1) {\n var cosφ0, cosφ1, sinλ0_λ1 = Math.sin(λ0 - λ1);\n return abs(sinλ0_λ1) > ε ? Math.atan((Math.sin(φ0) * (cosφ1 = Math.cos(φ1)) * Math.sin(λ1) - Math.sin(φ1) * (cosφ0 = Math.cos(φ0)) * Math.sin(λ0)) / (cosφ0 * cosφ1 * sinλ0_λ1)) : (φ0 + φ1) / 2;\n }\n function d3_geo_clipAntimeridianInterpolate(from, to, direction, listener) {\n var φ;\n if (from == null) {\n φ = direction * halfπ;\n listener.point(-π, φ);\n listener.point(0, φ);\n listener.point(π, φ);\n listener.point(π, 0);\n listener.point(π, -φ);\n listener.point(0, -φ);\n listener.point(-π, -φ);\n listener.point(-π, 0);\n listener.point(-π, φ);\n } else if (abs(from[0] - to[0]) > ε) {\n var s = from[0] < to[0] ? π : -π;\n φ = direction * s / 2;\n listener.point(-s, φ);\n listener.point(0, φ);\n listener.point(s, φ);\n } else {\n listener.point(to[0], to[1]);\n }\n }\n function d3_geo_pointInPolygon(point, polygon) {\n var meridian = point[0], parallel = point[1], meridianNormal = [ Math.sin(meridian), -Math.cos(meridian), 0 ], polarAngle = 0, winding = 0;\n d3_geo_areaRingSum.reset();\n for (var i = 0, n = polygon.length; i < n; ++i) {\n var ring = polygon[i], m = ring.length;\n if (!m) continue;\n var point0 = ring[0], λ0 = point0[0], φ0 = point0[1] / 2 + π / 4, sinφ0 = Math.sin(φ0), cosφ0 = Math.cos(φ0), j = 1;\n while (true) {\n if (j === m) j = 0;\n point = ring[j];\n var λ = point[0], φ = point[1] / 2 + π / 4, sinφ = Math.sin(φ), cosφ = Math.cos(φ), dλ = λ - λ0, sdλ = dλ >= 0 ? 1 : -1, adλ = sdλ * dλ, antimeridian = adλ > π, k = sinφ0 * sinφ;\n d3_geo_areaRingSum.add(Math.atan2(k * sdλ * Math.sin(adλ), cosφ0 * cosφ + k * Math.cos(adλ)));\n polarAngle += antimeridian ? dλ + sdλ * τ : dλ;\n if (antimeridian ^ λ0 >= meridian ^ λ >= meridian) {\n var arc = d3_geo_cartesianCross(d3_geo_cartesian(point0), d3_geo_cartesian(point));\n d3_geo_cartesianNormalize(arc);\n var intersection = d3_geo_cartesianCross(meridianNormal, arc);\n d3_geo_cartesianNormalize(intersection);\n var φarc = (antimeridian ^ dλ >= 0 ? -1 : 1) * d3_asin(intersection[2]);\n if (parallel > φarc || parallel === φarc && (arc[0] || arc[1])) {\n winding += antimeridian ^ dλ >= 0 ? 1 : -1;\n }\n }\n if (!j++) break;\n λ0 = λ, sinφ0 = sinφ, cosφ0 = cosφ, point0 = point;\n }\n }\n return (polarAngle < -ε || polarAngle < ε && d3_geo_areaRingSum < -ε) ^ winding & 1;\n }\n function d3_geo_clipCircle(radius) {\n var cr = Math.cos(radius), smallRadius = cr > 0, notHemisphere = abs(cr) > ε, interpolate = d3_geo_circleInterpolate(radius, 6 * d3_radians);\n return d3_geo_clip(visible, clipLine, interpolate, smallRadius ? [ 0, -radius ] : [ -π, radius - π ]);\n function visible(λ, φ) {\n return Math.cos(λ) * Math.cos(φ) > cr;\n }\n function clipLine(listener) {\n var point0, c0, v0, v00, clean;\n return {\n lineStart: function() {\n v00 = v0 = false;\n clean = 1;\n },\n point: function(λ, φ) {\n var point1 = [ λ, φ ], point2, v = visible(λ, φ), c = smallRadius ? v ? 0 : code(λ, φ) : v ? code(λ + (λ < 0 ? π : -π), φ) : 0;\n if (!point0 && (v00 = v0 = v)) listener.lineStart();\n if (v !== v0) {\n point2 = intersect(point0, point1);\n if (d3_geo_sphericalEqual(point0, point2) || d3_geo_sphericalEqual(point1, point2)) {\n point1[0] += ε;\n point1[1] += ε;\n v = visible(point1[0], point1[1]);\n }\n }\n if (v !== v0) {\n clean = 0;\n if (v) {\n listener.lineStart();\n point2 = intersect(point1, point0);\n listener.point(point2[0], point2[1]);\n } else {\n point2 = intersect(point0, point1);\n listener.point(point2[0], point2[1]);\n listener.lineEnd();\n }\n point0 = point2;\n } else if (notHemisphere && point0 && smallRadius ^ v) {\n var t;\n if (!(c & c0) && (t = intersect(point1, point0, true))) {\n clean = 0;\n if (smallRadius) {\n listener.lineStart();\n listener.point(t[0][0], t[0][1]);\n listener.point(t[1][0], t[1][1]);\n listener.lineEnd();\n } else {\n listener.point(t[1][0], t[1][1]);\n listener.lineEnd();\n listener.lineStart();\n listener.point(t[0][0], t[0][1]);\n }\n }\n }\n if (v && (!point0 || !d3_geo_sphericalEqual(point0, point1))) {\n listener.point(point1[0], point1[1]);\n }\n point0 = point1, v0 = v, c0 = c;\n },\n lineEnd: function() {\n if (v0) listener.lineEnd();\n point0 = null;\n },\n clean: function() {\n return clean | (v00 && v0) << 1;\n }\n };\n }\n function intersect(a, b, two) {\n var pa = d3_geo_cartesian(a), pb = d3_geo_cartesian(b);\n var n1 = [ 1, 0, 0 ], n2 = d3_geo_cartesianCross(pa, pb), n2n2 = d3_geo_cartesianDot(n2, n2), n1n2 = n2[0], determinant = n2n2 - n1n2 * n1n2;\n if (!determinant) return !two && a;\n var c1 = cr * n2n2 / determinant, c2 = -cr * n1n2 / determinant, n1xn2 = d3_geo_cartesianCross(n1, n2), A = d3_geo_cartesianScale(n1, c1), B = d3_geo_cartesianScale(n2, c2);\n d3_geo_cartesianAdd(A, B);\n var u = n1xn2, w = d3_geo_cartesianDot(A, u), uu = d3_geo_cartesianDot(u, u), t2 = w * w - uu * (d3_geo_cartesianDot(A, A) - 1);\n if (t2 < 0) return;\n var t = Math.sqrt(t2), q = d3_geo_cartesianScale(u, (-w - t) / uu);\n d3_geo_cartesianAdd(q, A);\n q = d3_geo_spherical(q);\n if (!two) return q;\n var λ0 = a[0], λ1 = b[0], φ0 = a[1], φ1 = b[1], z;\n if (λ1 < λ0) z = λ0, λ0 = λ1, λ1 = z;\n var δλ = λ1 - λ0, polar = abs(δλ - π) < ε, meridian = polar || δλ < ε;\n if (!polar && φ1 < φ0) z = φ0, φ0 = φ1, φ1 = z;\n if (meridian ? polar ? φ0 + φ1 > 0 ^ q[1] < (abs(q[0] - λ0) < ε ? φ0 : φ1) : φ0 <= q[1] && q[1] <= φ1 : δλ > π ^ (λ0 <= q[0] && q[0] <= λ1)) {\n var q1 = d3_geo_cartesianScale(u, (-w + t) / uu);\n d3_geo_cartesianAdd(q1, A);\n return [ q, d3_geo_spherical(q1) ];\n }\n }\n function code(λ, φ) {\n var r = smallRadius ? radius : π - radius, code = 0;\n if (λ < -r) code |= 1; else if (λ > r) code |= 2;\n if (φ < -r) code |= 4; else if (φ > r) code |= 8;\n return code;\n }\n }\n function d3_geom_clipLine(x0, y0, x1, y1) {\n return function(line) {\n var a = line.a, b = line.b, ax = a.x, ay = a.y, bx = b.x, by = b.y, t0 = 0, t1 = 1, dx = bx - ax, dy = by - ay, r;\n r = x0 - ax;\n if (!dx && r > 0) return;\n r /= dx;\n if (dx < 0) {\n if (r < t0) return;\n if (r < t1) t1 = r;\n } else if (dx > 0) {\n if (r > t1) return;\n if (r > t0) t0 = r;\n }\n r = x1 - ax;\n if (!dx && r < 0) return;\n r /= dx;\n if (dx < 0) {\n if (r > t1) return;\n if (r > t0) t0 = r;\n } else if (dx > 0) {\n if (r < t0) return;\n if (r < t1) t1 = r;\n }\n r = y0 - ay;\n if (!dy && r > 0) return;\n r /= dy;\n if (dy < 0) {\n if (r < t0) return;\n if (r < t1) t1 = r;\n } else if (dy > 0) {\n if (r > t1) return;\n if (r > t0) t0 = r;\n }\n r = y1 - ay;\n if (!dy && r < 0) return;\n r /= dy;\n if (dy < 0) {\n if (r > t1) return;\n if (r > t0) t0 = r;\n } else if (dy > 0) {\n if (r < t0) return;\n if (r < t1) t1 = r;\n }\n if (t0 > 0) line.a = {\n x: ax + t0 * dx,\n y: ay + t0 * dy\n };\n if (t1 < 1) line.b = {\n x: ax + t1 * dx,\n y: ay + t1 * dy\n };\n return line;\n };\n }\n var d3_geo_clipExtentMAX = 1e9;\n d3.geo.clipExtent = function() {\n var x0, y0, x1, y1, stream, clip, clipExtent = {\n stream: function(output) {\n if (stream) stream.valid = false;\n stream = clip(output);\n stream.valid = true;\n return stream;\n },\n extent: function(_) {\n if (!arguments.length) return [ [ x0, y0 ], [ x1, y1 ] ];\n clip = d3_geo_clipExtent(x0 = +_[0][0], y0 = +_[0][1], x1 = +_[1][0], y1 = +_[1][1]);\n if (stream) stream.valid = false, stream = null;\n return clipExtent;\n }\n };\n return clipExtent.extent([ [ 0, 0 ], [ 960, 500 ] ]);\n };\n function d3_geo_clipExtent(x0, y0, x1, y1) {\n return function(listener) {\n var listener_ = listener, bufferListener = d3_geo_clipBufferListener(), clipLine = d3_geom_clipLine(x0, y0, x1, y1), segments, polygon, ring;\n var clip = {\n point: point,\n lineStart: lineStart,\n lineEnd: lineEnd,\n polygonStart: function() {\n listener = bufferListener;\n segments = [];\n polygon = [];\n clean = true;\n },\n polygonEnd: function() {\n listener = listener_;\n segments = d3.merge(segments);\n var clipStartInside = insidePolygon([ x0, y1 ]), inside = clean && clipStartInside, visible = segments.length;\n if (inside || visible) {\n listener.polygonStart();\n if (inside) {\n listener.lineStart();\n interpolate(null, null, 1, listener);\n listener.lineEnd();\n }\n if (visible) {\n d3_geo_clipPolygon(segments, compare, clipStartInside, interpolate, listener);\n }\n listener.polygonEnd();\n }\n segments = polygon = ring = null;\n }\n };\n function insidePolygon(p) {\n var wn = 0, n = polygon.length, y = p[1];\n for (var i = 0; i < n; ++i) {\n for (var j = 1, v = polygon[i], m = v.length, a = v[0], b; j < m; ++j) {\n b = v[j];\n if (a[1] <= y) {\n if (b[1] > y && d3_cross2d(a, b, p) > 0) ++wn;\n } else {\n if (b[1] <= y && d3_cross2d(a, b, p) < 0) --wn;\n }\n a = b;\n }\n }\n return wn !== 0;\n }\n function interpolate(from, to, direction, listener) {\n var a = 0, a1 = 0;\n if (from == null || (a = corner(from, direction)) !== (a1 = corner(to, direction)) || comparePoints(from, to) < 0 ^ direction > 0) {\n do {\n listener.point(a === 0 || a === 3 ? x0 : x1, a > 1 ? y1 : y0);\n } while ((a = (a + direction + 4) % 4) !== a1);\n } else {\n listener.point(to[0], to[1]);\n }\n }\n function pointVisible(x, y) {\n return x0 <= x && x <= x1 && y0 <= y && y <= y1;\n }\n function point(x, y) {\n if (pointVisible(x, y)) listener.point(x, y);\n }\n var x__, y__, v__, x_, y_, v_, first, clean;\n function lineStart() {\n clip.point = linePoint;\n if (polygon) polygon.push(ring = []);\n first = true;\n v_ = false;\n x_ = y_ = NaN;\n }\n function lineEnd() {\n if (segments) {\n linePoint(x__, y__);\n if (v__ && v_) bufferListener.rejoin();\n segments.push(bufferListener.buffer());\n }\n clip.point = point;\n if (v_) listener.lineEnd();\n }\n function linePoint(x, y) {\n x = Math.max(-d3_geo_clipExtentMAX, Math.min(d3_geo_clipExtentMAX, x));\n y = Math.max(-d3_geo_clipExtentMAX, Math.min(d3_geo_clipExtentMAX, y));\n var v = pointVisible(x, y);\n if (polygon) ring.push([ x, y ]);\n if (first) {\n x__ = x, y__ = y, v__ = v;\n first = false;\n if (v) {\n listener.lineStart();\n listener.point(x, y);\n }\n } else {\n if (v && v_) listener.point(x, y); else {\n var l = {\n a: {\n x: x_,\n y: y_\n },\n b: {\n x: x,\n y: y\n }\n };\n if (clipLine(l)) {\n if (!v_) {\n listener.lineStart();\n listener.point(l.a.x, l.a.y);\n }\n listener.point(l.b.x, l.b.y);\n if (!v) listener.lineEnd();\n clean = false;\n } else if (v) {\n listener.lineStart();\n listener.point(x, y);\n clean = false;\n }\n }\n }\n x_ = x, y_ = y, v_ = v;\n }\n return clip;\n };\n function corner(p, direction) {\n return abs(p[0] - x0) < ε ? direction > 0 ? 0 : 3 : abs(p[0] - x1) < ε ? direction > 0 ? 2 : 1 : abs(p[1] - y0) < ε ? direction > 0 ? 1 : 0 : direction > 0 ? 3 : 2;\n }\n function compare(a, b) {\n return comparePoints(a.x, b.x);\n }\n function comparePoints(a, b) {\n var ca = corner(a, 1), cb = corner(b, 1);\n return ca !== cb ? ca - cb : ca === 0 ? b[1] - a[1] : ca === 1 ? a[0] - b[0] : ca === 2 ? a[1] - b[1] : b[0] - a[0];\n }\n }\n function d3_geo_conic(projectAt) {\n var φ0 = 0, φ1 = π / 3, m = d3_geo_projectionMutator(projectAt), p = m(φ0, φ1);\n p.parallels = function(_) {\n if (!arguments.length) return [ φ0 / π * 180, φ1 / π * 180 ];\n return m(φ0 = _[0] * π / 180, φ1 = _[1] * π / 180);\n };\n return p;\n }\n function d3_geo_conicEqualArea(φ0, φ1) {\n var sinφ0 = Math.sin(φ0), n = (sinφ0 + Math.sin(φ1)) / 2, C = 1 + sinφ0 * (2 * n - sinφ0), ρ0 = Math.sqrt(C) / n;\n function forward(λ, φ) {\n var ρ = Math.sqrt(C - 2 * n * Math.sin(φ)) / n;\n return [ ρ * Math.sin(λ *= n), ρ0 - ρ * Math.cos(λ) ];\n }\n forward.invert = function(x, y) {\n var ρ0_y = ρ0 - y;\n return [ Math.atan2(x, ρ0_y) / n, d3_asin((C - (x * x + ρ0_y * ρ0_y) * n * n) / (2 * n)) ];\n };\n return forward;\n }\n (d3.geo.conicEqualArea = function() {\n return d3_geo_conic(d3_geo_conicEqualArea);\n }).raw = d3_geo_conicEqualArea;\n d3.geo.albers = function() {\n return d3.geo.conicEqualArea().rotate([ 96, 0 ]).center([ -.6, 38.7 ]).parallels([ 29.5, 45.5 ]).scale(1070);\n };\n d3.geo.albersUsa = function() {\n var lower48 = d3.geo.albers();\n var alaska = d3.geo.conicEqualArea().rotate([ 154, 0 ]).center([ -2, 58.5 ]).parallels([ 55, 65 ]);\n var hawaii = d3.geo.conicEqualArea().rotate([ 157, 0 ]).center([ -3, 19.9 ]).parallels([ 8, 18 ]);\n var point, pointStream = {\n point: function(x, y) {\n point = [ x, y ];\n }\n }, lower48Point, alaskaPoint, hawaiiPoint;\n function albersUsa(coordinates) {\n var x = coordinates[0], y = coordinates[1];\n point = null;\n (lower48Point(x, y), point) || (alaskaPoint(x, y), point) || hawaiiPoint(x, y);\n return point;\n }\n albersUsa.invert = function(coordinates) {\n var k = lower48.scale(), t = lower48.translate(), x = (coordinates[0] - t[0]) / k, y = (coordinates[1] - t[1]) / k;\n return (y >= .12 && y < .234 && x >= -.425 && x < -.214 ? alaska : y >= .166 && y < .234 && x >= -.214 && x < -.115 ? hawaii : lower48).invert(coordinates);\n };\n albersUsa.stream = function(stream) {\n var lower48Stream = lower48.stream(stream), alaskaStream = alaska.stream(stream), hawaiiStream = hawaii.stream(stream);\n return {\n point: function(x, y) {\n lower48Stream.point(x, y);\n alaskaStream.point(x, y);\n hawaiiStream.point(x, y);\n },\n sphere: function() {\n lower48Stream.sphere();\n alaskaStream.sphere();\n hawaiiStream.sphere();\n },\n lineStart: function() {\n lower48Stream.lineStart();\n alaskaStream.lineStart();\n hawaiiStream.lineStart();\n },\n lineEnd: function() {\n lower48Stream.lineEnd();\n alaskaStream.lineEnd();\n hawaiiStream.lineEnd();\n },\n polygonStart: function() {\n lower48Stream.polygonStart();\n alaskaStream.polygonStart();\n hawaiiStream.polygonStart();\n },\n polygonEnd: function() {\n lower48Stream.polygonEnd();\n alaskaStream.polygonEnd();\n hawaiiStream.polygonEnd();\n }\n };\n };\n albersUsa.precision = function(_) {\n if (!arguments.length) return lower48.precision();\n lower48.precision(_);\n alaska.precision(_);\n hawaii.precision(_);\n return albersUsa;\n };\n albersUsa.scale = function(_) {\n if (!arguments.length) return lower48.scale();\n lower48.scale(_);\n alaska.scale(_ * .35);\n hawaii.scale(_);\n return albersUsa.translate(lower48.translate());\n };\n albersUsa.translate = function(_) {\n if (!arguments.length) return lower48.translate();\n var k = lower48.scale(), x = +_[0], y = +_[1];\n lower48Point = lower48.translate(_).clipExtent([ [ x - .455 * k, y - .238 * k ], [ x + .455 * k, y + .238 * k ] ]).stream(pointStream).point;\n alaskaPoint = alaska.translate([ x - .307 * k, y + .201 * k ]).clipExtent([ [ x - .425 * k + ε, y + .12 * k + ε ], [ x - .214 * k - ε, y + .234 * k - ε ] ]).stream(pointStream).point;\n hawaiiPoint = hawaii.translate([ x - .205 * k, y + .212 * k ]).clipExtent([ [ x - .214 * k + ε, y + .166 * k + ε ], [ x - .115 * k - ε, y + .234 * k - ε ] ]).stream(pointStream).point;\n return albersUsa;\n };\n return albersUsa.scale(1070);\n };\n var d3_geo_pathAreaSum, d3_geo_pathAreaPolygon, d3_geo_pathArea = {\n point: d3_noop,\n lineStart: d3_noop,\n lineEnd: d3_noop,\n polygonStart: function() {\n d3_geo_pathAreaPolygon = 0;\n d3_geo_pathArea.lineStart = d3_geo_pathAreaRingStart;\n },\n polygonEnd: function() {\n d3_geo_pathArea.lineStart = d3_geo_pathArea.lineEnd = d3_geo_pathArea.point = d3_noop;\n d3_geo_pathAreaSum += abs(d3_geo_pathAreaPolygon / 2);\n }\n };\n function d3_geo_pathAreaRingStart() {\n var x00, y00, x0, y0;\n d3_geo_pathArea.point = function(x, y) {\n d3_geo_pathArea.point = nextPoint;\n x00 = x0 = x, y00 = y0 = y;\n };\n function nextPoint(x, y) {\n d3_geo_pathAreaPolygon += y0 * x - x0 * y;\n x0 = x, y0 = y;\n }\n d3_geo_pathArea.lineEnd = function() {\n nextPoint(x00, y00);\n };\n }\n var d3_geo_pathBoundsX0, d3_geo_pathBoundsY0, d3_geo_pathBoundsX1, d3_geo_pathBoundsY1;\n var d3_geo_pathBounds = {\n point: d3_geo_pathBoundsPoint,\n lineStart: d3_noop,\n lineEnd: d3_noop,\n polygonStart: d3_noop,\n polygonEnd: d3_noop\n };\n function d3_geo_pathBoundsPoint(x, y) {\n if (x < d3_geo_pathBoundsX0) d3_geo_pathBoundsX0 = x;\n if (x > d3_geo_pathBoundsX1) d3_geo_pathBoundsX1 = x;\n if (y < d3_geo_pathBoundsY0) d3_geo_pathBoundsY0 = y;\n if (y > d3_geo_pathBoundsY1) d3_geo_pathBoundsY1 = y;\n }\n function d3_geo_pathBuffer() {\n var pointCircle = d3_geo_pathBufferCircle(4.5), buffer = [];\n var stream = {\n point: point,\n lineStart: function() {\n stream.point = pointLineStart;\n },\n lineEnd: lineEnd,\n polygonStart: function() {\n stream.lineEnd = lineEndPolygon;\n },\n polygonEnd: function() {\n stream.lineEnd = lineEnd;\n stream.point = point;\n },\n pointRadius: function(_) {\n pointCircle = d3_geo_pathBufferCircle(_);\n return stream;\n },\n result: function() {\n if (buffer.length) {\n var result = buffer.join(\"\");\n buffer = [];\n return result;\n }\n }\n };\n function point(x, y) {\n buffer.push(\"M\", x, \",\", y, pointCircle);\n }\n function pointLineStart(x, y) {\n buffer.push(\"M\", x, \",\", y);\n stream.point = pointLine;\n }\n function pointLine(x, y) {\n buffer.push(\"L\", x, \",\", y);\n }\n function lineEnd() {\n stream.point = point;\n }\n function lineEndPolygon() {\n buffer.push(\"Z\");\n }\n return stream;\n }\n function d3_geo_pathBufferCircle(radius) {\n return \"m0,\" + radius + \"a\" + radius + \",\" + radius + \" 0 1,1 0,\" + -2 * radius + \"a\" + radius + \",\" + radius + \" 0 1,1 0,\" + 2 * radius + \"z\";\n }\n var d3_geo_pathCentroid = {\n point: d3_geo_pathCentroidPoint,\n lineStart: d3_geo_pathCentroidLineStart,\n lineEnd: d3_geo_pathCentroidLineEnd,\n polygonStart: function() {\n d3_geo_pathCentroid.lineStart = d3_geo_pathCentroidRingStart;\n },\n polygonEnd: function() {\n d3_geo_pathCentroid.point = d3_geo_pathCentroidPoint;\n d3_geo_pathCentroid.lineStart = d3_geo_pathCentroidLineStart;\n d3_geo_pathCentroid.lineEnd = d3_geo_pathCentroidLineEnd;\n }\n };\n function d3_geo_pathCentroidPoint(x, y) {\n d3_geo_centroidX0 += x;\n d3_geo_centroidY0 += y;\n ++d3_geo_centroidZ0;\n }\n function d3_geo_pathCentroidLineStart() {\n var x0, y0;\n d3_geo_pathCentroid.point = function(x, y) {\n d3_geo_pathCentroid.point = nextPoint;\n d3_geo_pathCentroidPoint(x0 = x, y0 = y);\n };\n function nextPoint(x, y) {\n var dx = x - x0, dy = y - y0, z = Math.sqrt(dx * dx + dy * dy);\n d3_geo_centroidX1 += z * (x0 + x) / 2;\n d3_geo_centroidY1 += z * (y0 + y) / 2;\n d3_geo_centroidZ1 += z;\n d3_geo_pathCentroidPoint(x0 = x, y0 = y);\n }\n }\n function d3_geo_pathCentroidLineEnd() {\n d3_geo_pathCentroid.point = d3_geo_pathCentroidPoint;\n }\n function d3_geo_pathCentroidRingStart() {\n var x00, y00, x0, y0;\n d3_geo_pathCentroid.point = function(x, y) {\n d3_geo_pathCentroid.point = nextPoint;\n d3_geo_pathCentroidPoint(x00 = x0 = x, y00 = y0 = y);\n };\n function nextPoint(x, y) {\n var dx = x - x0, dy = y - y0, z = Math.sqrt(dx * dx + dy * dy);\n d3_geo_centroidX1 += z * (x0 + x) / 2;\n d3_geo_centroidY1 += z * (y0 + y) / 2;\n d3_geo_centroidZ1 += z;\n z = y0 * x - x0 * y;\n d3_geo_centroidX2 += z * (x0 + x);\n d3_geo_centroidY2 += z * (y0 + y);\n d3_geo_centroidZ2 += z * 3;\n d3_geo_pathCentroidPoint(x0 = x, y0 = y);\n }\n d3_geo_pathCentroid.lineEnd = function() {\n nextPoint(x00, y00);\n };\n }\n function d3_geo_pathContext(context) {\n var pointRadius = 4.5;\n var stream = {\n point: point,\n lineStart: function() {\n stream.point = pointLineStart;\n },\n lineEnd: lineEnd,\n polygonStart: function() {\n stream.lineEnd = lineEndPolygon;\n },\n polygonEnd: function() {\n stream.lineEnd = lineEnd;\n stream.point = point;\n },\n pointRadius: function(_) {\n pointRadius = _;\n return stream;\n },\n result: d3_noop\n };\n function point(x, y) {\n context.moveTo(x + pointRadius, y);\n context.arc(x, y, pointRadius, 0, τ);\n }\n function pointLineStart(x, y) {\n context.moveTo(x, y);\n stream.point = pointLine;\n }\n function pointLine(x, y) {\n context.lineTo(x, y);\n }\n function lineEnd() {\n stream.point = point;\n }\n function lineEndPolygon() {\n context.closePath();\n }\n return stream;\n }\n function d3_geo_resample(project) {\n var δ2 = .5, cosMinDistance = Math.cos(30 * d3_radians), maxDepth = 16;\n function resample(stream) {\n return (maxDepth ? resampleRecursive : resampleNone)(stream);\n }\n function resampleNone(stream) {\n return d3_geo_transformPoint(stream, function(x, y) {\n x = project(x, y);\n stream.point(x[0], x[1]);\n });\n }\n function resampleRecursive(stream) {\n var λ00, φ00, x00, y00, a00, b00, c00, λ0, x0, y0, a0, b0, c0;\n var resample = {\n point: point,\n lineStart: lineStart,\n lineEnd: lineEnd,\n polygonStart: function() {\n stream.polygonStart();\n resample.lineStart = ringStart;\n },\n polygonEnd: function() {\n stream.polygonEnd();\n resample.lineStart = lineStart;\n }\n };\n function point(x, y) {\n x = project(x, y);\n stream.point(x[0], x[1]);\n }\n function lineStart() {\n x0 = NaN;\n resample.point = linePoint;\n stream.lineStart();\n }\n function linePoint(λ, φ) {\n var c = d3_geo_cartesian([ λ, φ ]), p = project(λ, φ);\n resampleLineTo(x0, y0, λ0, a0, b0, c0, x0 = p[0], y0 = p[1], λ0 = λ, a0 = c[0], b0 = c[1], c0 = c[2], maxDepth, stream);\n stream.point(x0, y0);\n }\n function lineEnd() {\n resample.point = point;\n stream.lineEnd();\n }\n function ringStart() {\n lineStart();\n resample.point = ringPoint;\n resample.lineEnd = ringEnd;\n }\n function ringPoint(λ, φ) {\n linePoint(λ00 = λ, φ00 = φ), x00 = x0, y00 = y0, a00 = a0, b00 = b0, c00 = c0;\n resample.point = linePoint;\n }\n function ringEnd() {\n resampleLineTo(x0, y0, λ0, a0, b0, c0, x00, y00, λ00, a00, b00, c00, maxDepth, stream);\n resample.lineEnd = lineEnd;\n lineEnd();\n }\n return resample;\n }\n function resampleLineTo(x0, y0, λ0, a0, b0, c0, x1, y1, λ1, a1, b1, c1, depth, stream) {\n var dx = x1 - x0, dy = y1 - y0, d2 = dx * dx + dy * dy;\n if (d2 > 4 * δ2 && depth--) {\n var a = a0 + a1, b = b0 + b1, c = c0 + c1, m = Math.sqrt(a * a + b * b + c * c), φ2 = Math.asin(c /= m), λ2 = abs(abs(c) - 1) < ε || abs(λ0 - λ1) < ε ? (λ0 + λ1) / 2 : Math.atan2(b, a), p = project(λ2, φ2), x2 = p[0], y2 = p[1], dx2 = x2 - x0, dy2 = y2 - y0, dz = dy * dx2 - dx * dy2;\n if (dz * dz / d2 > δ2 || abs((dx * dx2 + dy * dy2) / d2 - .5) > .3 || a0 * a1 + b0 * b1 + c0 * c1 < cosMinDistance) {\n resampleLineTo(x0, y0, λ0, a0, b0, c0, x2, y2, λ2, a /= m, b /= m, c, depth, stream);\n stream.point(x2, y2);\n resampleLineTo(x2, y2, λ2, a, b, c, x1, y1, λ1, a1, b1, c1, depth, stream);\n }\n }\n }\n resample.precision = function(_) {\n if (!arguments.length) return Math.sqrt(δ2);\n maxDepth = (δ2 = _ * _) > 0 && 16;\n return resample;\n };\n return resample;\n }\n d3.geo.path = function() {\n var pointRadius = 4.5, projection, context, projectStream, contextStream, cacheStream;\n function path(object) {\n if (object) {\n if (typeof pointRadius === \"function\") contextStream.pointRadius(+pointRadius.apply(this, arguments));\n if (!cacheStream || !cacheStream.valid) cacheStream = projectStream(contextStream);\n d3.geo.stream(object, cacheStream);\n }\n return contextStream.result();\n }\n path.area = function(object) {\n d3_geo_pathAreaSum = 0;\n d3.geo.stream(object, projectStream(d3_geo_pathArea));\n return d3_geo_pathAreaSum;\n };\n path.centroid = function(object) {\n d3_geo_centroidX0 = d3_geo_centroidY0 = d3_geo_centroidZ0 = d3_geo_centroidX1 = d3_geo_centroidY1 = d3_geo_centroidZ1 = d3_geo_centroidX2 = d3_geo_centroidY2 = d3_geo_centroidZ2 = 0;\n d3.geo.stream(object, projectStream(d3_geo_pathCentroid));\n return d3_geo_centroidZ2 ? [ d3_geo_centroidX2 / d3_geo_centroidZ2, d3_geo_centroidY2 / d3_geo_centroidZ2 ] : d3_geo_centroidZ1 ? [ d3_geo_centroidX1 / d3_geo_centroidZ1, d3_geo_centroidY1 / d3_geo_centroidZ1 ] : d3_geo_centroidZ0 ? [ d3_geo_centroidX0 / d3_geo_centroidZ0, d3_geo_centroidY0 / d3_geo_centroidZ0 ] : [ NaN, NaN ];\n };\n path.bounds = function(object) {\n d3_geo_pathBoundsX1 = d3_geo_pathBoundsY1 = -(d3_geo_pathBoundsX0 = d3_geo_pathBoundsY0 = Infinity);\n d3.geo.stream(object, projectStream(d3_geo_pathBounds));\n return [ [ d3_geo_pathBoundsX0, d3_geo_pathBoundsY0 ], [ d3_geo_pathBoundsX1, d3_geo_pathBoundsY1 ] ];\n };\n path.projection = function(_) {\n if (!arguments.length) return projection;\n projectStream = (projection = _) ? _.stream || d3_geo_pathProjectStream(_) : d3_identity;\n return reset();\n };\n path.context = function(_) {\n if (!arguments.length) return context;\n contextStream = (context = _) == null ? new d3_geo_pathBuffer() : new d3_geo_pathContext(_);\n if (typeof pointRadius !== \"function\") contextStream.pointRadius(pointRadius);\n return reset();\n };\n path.pointRadius = function(_) {\n if (!arguments.length) return pointRadius;\n pointRadius = typeof _ === \"function\" ? _ : (contextStream.pointRadius(+_), +_);\n return path;\n };\n function reset() {\n cacheStream = null;\n return path;\n }\n return path.projection(d3.geo.albersUsa()).context(null);\n };\n function d3_geo_pathProjectStream(project) {\n var resample = d3_geo_resample(function(x, y) {\n return project([ x * d3_degrees, y * d3_degrees ]);\n });\n return function(stream) {\n return d3_geo_projectionRadians(resample(stream));\n };\n }\n d3.geo.transform = function(methods) {\n return {\n stream: function(stream) {\n var transform = new d3_geo_transform(stream);\n for (var k in methods) transform[k] = methods[k];\n return transform;\n }\n };\n };\n function d3_geo_transform(stream) {\n this.stream = stream;\n }\n d3_geo_transform.prototype = {\n point: function(x, y) {\n this.stream.point(x, y);\n },\n sphere: function() {\n this.stream.sphere();\n },\n lineStart: function() {\n this.stream.lineStart();\n },\n lineEnd: function() {\n this.stream.lineEnd();\n },\n polygonStart: function() {\n this.stream.polygonStart();\n },\n polygonEnd: function() {\n this.stream.polygonEnd();\n }\n };\n function d3_geo_transformPoint(stream, point) {\n return {\n point: point,\n sphere: function() {\n stream.sphere();\n },\n lineStart: function() {\n stream.lineStart();\n },\n lineEnd: function() {\n stream.lineEnd();\n },\n polygonStart: function() {\n stream.polygonStart();\n },\n polygonEnd: function() {\n stream.polygonEnd();\n }\n };\n }\n d3.geo.projection = d3_geo_projection;\n d3.geo.projectionMutator = d3_geo_projectionMutator;\n function d3_geo_projection(project) {\n return d3_geo_projectionMutator(function() {\n return project;\n })();\n }\n function d3_geo_projectionMutator(projectAt) {\n var project, rotate, projectRotate, projectResample = d3_geo_resample(function(x, y) {\n x = project(x, y);\n return [ x[0] * k + δx, δy - x[1] * k ];\n }), k = 150, x = 480, y = 250, λ = 0, φ = 0, δλ = 0, δφ = 0, δγ = 0, δx, δy, preclip = d3_geo_clipAntimeridian, postclip = d3_identity, clipAngle = null, clipExtent = null, stream;\n function projection(point) {\n point = projectRotate(point[0] * d3_radians, point[1] * d3_radians);\n return [ point[0] * k + δx, δy - point[1] * k ];\n }\n function invert(point) {\n point = projectRotate.invert((point[0] - δx) / k, (δy - point[1]) / k);\n return point && [ point[0] * d3_degrees, point[1] * d3_degrees ];\n }\n projection.stream = function(output) {\n if (stream) stream.valid = false;\n stream = d3_geo_projectionRadians(preclip(rotate, projectResample(postclip(output))));\n stream.valid = true;\n return stream;\n };\n projection.clipAngle = function(_) {\n if (!arguments.length) return clipAngle;\n preclip = _ == null ? (clipAngle = _, d3_geo_clipAntimeridian) : d3_geo_clipCircle((clipAngle = +_) * d3_radians);\n return invalidate();\n };\n projection.clipExtent = function(_) {\n if (!arguments.length) return clipExtent;\n clipExtent = _;\n postclip = _ ? d3_geo_clipExtent(_[0][0], _[0][1], _[1][0], _[1][1]) : d3_identity;\n return invalidate();\n };\n projection.scale = function(_) {\n if (!arguments.length) return k;\n k = +_;\n return reset();\n };\n projection.translate = function(_) {\n if (!arguments.length) return [ x, y ];\n x = +_[0];\n y = +_[1];\n return reset();\n };\n projection.center = function(_) {\n if (!arguments.length) return [ λ * d3_degrees, φ * d3_degrees ];\n λ = _[0] % 360 * d3_radians;\n φ = _[1] % 360 * d3_radians;\n return reset();\n };\n projection.rotate = function(_) {\n if (!arguments.length) return [ δλ * d3_degrees, δφ * d3_degrees, δγ * d3_degrees ];\n δλ = _[0] % 360 * d3_radians;\n δφ = _[1] % 360 * d3_radians;\n δγ = _.length > 2 ? _[2] % 360 * d3_radians : 0;\n return reset();\n };\n d3.rebind(projection, projectResample, \"precision\");\n function reset() {\n projectRotate = d3_geo_compose(rotate = d3_geo_rotation(δλ, δφ, δγ), project);\n var center = project(λ, φ);\n δx = x - center[0] * k;\n δy = y + center[1] * k;\n return invalidate();\n }\n function invalidate() {\n if (stream) stream.valid = false, stream = null;\n return projection;\n }\n return function() {\n project = projectAt.apply(this, arguments);\n projection.invert = project.invert && invert;\n return reset();\n };\n }\n function d3_geo_projectionRadians(stream) {\n return d3_geo_transformPoint(stream, function(x, y) {\n stream.point(x * d3_radians, y * d3_radians);\n });\n }\n function d3_geo_equirectangular(λ, φ) {\n return [ λ, φ ];\n }\n (d3.geo.equirectangular = function() {\n return d3_geo_projection(d3_geo_equirectangular);\n }).raw = d3_geo_equirectangular.invert = d3_geo_equirectangular;\n d3.geo.rotation = function(rotate) {\n rotate = d3_geo_rotation(rotate[0] % 360 * d3_radians, rotate[1] * d3_radians, rotate.length > 2 ? rotate[2] * d3_radians : 0);\n function forward(coordinates) {\n coordinates = rotate(coordinates[0] * d3_radians, coordinates[1] * d3_radians);\n return coordinates[0] *= d3_degrees, coordinates[1] *= d3_degrees, coordinates;\n }\n forward.invert = function(coordinates) {\n coordinates = rotate.invert(coordinates[0] * d3_radians, coordinates[1] * d3_radians);\n return coordinates[0] *= d3_degrees, coordinates[1] *= d3_degrees, coordinates;\n };\n return forward;\n };\n function d3_geo_identityRotation(λ, φ) {\n return [ λ > π ? λ - τ : λ < -π ? λ + τ : λ, φ ];\n }\n d3_geo_identityRotation.invert = d3_geo_equirectangular;\n function d3_geo_rotation(δλ, δφ, δγ) {\n return δλ ? δφ || δγ ? d3_geo_compose(d3_geo_rotationλ(δλ), d3_geo_rotationφγ(δφ, δγ)) : d3_geo_rotationλ(δλ) : δφ || δγ ? d3_geo_rotationφγ(δφ, δγ) : d3_geo_identityRotation;\n }\n function d3_geo_forwardRotationλ(δλ) {\n return function(λ, φ) {\n return λ += δλ, [ λ > π ? λ - τ : λ < -π ? λ + τ : λ, φ ];\n };\n }\n function d3_geo_rotationλ(δλ) {\n var rotation = d3_geo_forwardRotationλ(δλ);\n rotation.invert = d3_geo_forwardRotationλ(-δλ);\n return rotation;\n }\n function d3_geo_rotationφγ(δφ, δγ) {\n var cosδφ = Math.cos(δφ), sinδφ = Math.sin(δφ), cosδγ = Math.cos(δγ), sinδγ = Math.sin(δγ);\n function rotation(λ, φ) {\n var cosφ = Math.cos(φ), x = Math.cos(λ) * cosφ, y = Math.sin(λ) * cosφ, z = Math.sin(φ), k = z * cosδφ + x * sinδφ;\n return [ Math.atan2(y * cosδγ - k * sinδγ, x * cosδφ - z * sinδφ), d3_asin(k * cosδγ + y * sinδγ) ];\n }\n rotation.invert = function(λ, φ) {\n var cosφ = Math.cos(φ), x = Math.cos(λ) * cosφ, y = Math.sin(λ) * cosφ, z = Math.sin(φ), k = z * cosδγ - y * sinδγ;\n return [ Math.atan2(y * cosδγ + z * sinδγ, x * cosδφ + k * sinδφ), d3_asin(k * cosδφ - x * sinδφ) ];\n };\n return rotation;\n }\n d3.geo.circle = function() {\n var origin = [ 0, 0 ], angle, precision = 6, interpolate;\n function circle() {\n var center = typeof origin === \"function\" ? origin.apply(this, arguments) : origin, rotate = d3_geo_rotation(-center[0] * d3_radians, -center[1] * d3_radians, 0).invert, ring = [];\n interpolate(null, null, 1, {\n point: function(x, y) {\n ring.push(x = rotate(x, y));\n x[0] *= d3_degrees, x[1] *= d3_degrees;\n }\n });\n return {\n type: \"Polygon\",\n coordinates: [ ring ]\n };\n }\n circle.origin = function(x) {\n if (!arguments.length) return origin;\n origin = x;\n return circle;\n };\n circle.angle = function(x) {\n if (!arguments.length) return angle;\n interpolate = d3_geo_circleInterpolate((angle = +x) * d3_radians, precision * d3_radians);\n return circle;\n };\n circle.precision = function(_) {\n if (!arguments.length) return precision;\n interpolate = d3_geo_circleInterpolate(angle * d3_radians, (precision = +_) * d3_radians);\n return circle;\n };\n return circle.angle(90);\n };\n function d3_geo_circleInterpolate(radius, precision) {\n var cr = Math.cos(radius), sr = Math.sin(radius);\n return function(from, to, direction, listener) {\n var step = direction * precision;\n if (from != null) {\n from = d3_geo_circleAngle(cr, from);\n to = d3_geo_circleAngle(cr, to);\n if (direction > 0 ? from < to : from > to) from += direction * τ;\n } else {\n from = radius + direction * τ;\n to = radius - .5 * step;\n }\n for (var point, t = from; direction > 0 ? t > to : t < to; t -= step) {\n listener.point((point = d3_geo_spherical([ cr, -sr * Math.cos(t), -sr * Math.sin(t) ]))[0], point[1]);\n }\n };\n }\n function d3_geo_circleAngle(cr, point) {\n var a = d3_geo_cartesian(point);\n a[0] -= cr;\n d3_geo_cartesianNormalize(a);\n var angle = d3_acos(-a[1]);\n return ((-a[2] < 0 ? -angle : angle) + 2 * Math.PI - ε) % (2 * Math.PI);\n }\n d3.geo.distance = function(a, b) {\n var Δλ = (b[0] - a[0]) * d3_radians, φ0 = a[1] * d3_radians, φ1 = b[1] * d3_radians, sinΔλ = Math.sin(Δλ), cosΔλ = Math.cos(Δλ), sinφ0 = Math.sin(φ0), cosφ0 = Math.cos(φ0), sinφ1 = Math.sin(φ1), cosφ1 = Math.cos(φ1), t;\n return Math.atan2(Math.sqrt((t = cosφ1 * sinΔλ) * t + (t = cosφ0 * sinφ1 - sinφ0 * cosφ1 * cosΔλ) * t), sinφ0 * sinφ1 + cosφ0 * cosφ1 * cosΔλ);\n };\n d3.geo.graticule = function() {\n var x1, x0, X1, X0, y1, y0, Y1, Y0, dx = 10, dy = dx, DX = 90, DY = 360, x, y, X, Y, precision = 2.5;\n function graticule() {\n return {\n type: \"MultiLineString\",\n coordinates: lines()\n };\n }\n function lines() {\n return d3.range(Math.ceil(X0 / DX) * DX, X1, DX).map(X).concat(d3.range(Math.ceil(Y0 / DY) * DY, Y1, DY).map(Y)).concat(d3.range(Math.ceil(x0 / dx) * dx, x1, dx).filter(function(x) {\n return abs(x % DX) > ε;\n }).map(x)).concat(d3.range(Math.ceil(y0 / dy) * dy, y1, dy).filter(function(y) {\n return abs(y % DY) > ε;\n }).map(y));\n }\n graticule.lines = function() {\n return lines().map(function(coordinates) {\n return {\n type: \"LineString\",\n coordinates: coordinates\n };\n });\n };\n graticule.outline = function() {\n return {\n type: \"Polygon\",\n coordinates: [ X(X0).concat(Y(Y1).slice(1), X(X1).reverse().slice(1), Y(Y0).reverse().slice(1)) ]\n };\n };\n graticule.extent = function(_) {\n if (!arguments.length) return graticule.minorExtent();\n return graticule.majorExtent(_).minorExtent(_);\n };\n graticule.majorExtent = function(_) {\n if (!arguments.length) return [ [ X0, Y0 ], [ X1, Y1 ] ];\n X0 = +_[0][0], X1 = +_[1][0];\n Y0 = +_[0][1], Y1 = +_[1][1];\n if (X0 > X1) _ = X0, X0 = X1, X1 = _;\n if (Y0 > Y1) _ = Y0, Y0 = Y1, Y1 = _;\n return graticule.precision(precision);\n };\n graticule.minorExtent = function(_) {\n if (!arguments.length) return [ [ x0, y0 ], [ x1, y1 ] ];\n x0 = +_[0][0], x1 = +_[1][0];\n y0 = +_[0][1], y1 = +_[1][1];\n if (x0 > x1) _ = x0, x0 = x1, x1 = _;\n if (y0 > y1) _ = y0, y0 = y1, y1 = _;\n return graticule.precision(precision);\n };\n graticule.step = function(_) {\n if (!arguments.length) return graticule.minorStep();\n return graticule.majorStep(_).minorStep(_);\n };\n graticule.majorStep = function(_) {\n if (!arguments.length) return [ DX, DY ];\n DX = +_[0], DY = +_[1];\n return graticule;\n };\n graticule.minorStep = function(_) {\n if (!arguments.length) return [ dx, dy ];\n dx = +_[0], dy = +_[1];\n return graticule;\n };\n graticule.precision = function(_) {\n if (!arguments.length) return precision;\n precision = +_;\n x = d3_geo_graticuleX(y0, y1, 90);\n y = d3_geo_graticuleY(x0, x1, precision);\n X = d3_geo_graticuleX(Y0, Y1, 90);\n Y = d3_geo_graticuleY(X0, X1, precision);\n return graticule;\n };\n return graticule.majorExtent([ [ -180, -90 + ε ], [ 180, 90 - ε ] ]).minorExtent([ [ -180, -80 - ε ], [ 180, 80 + ε ] ]);\n };\n function d3_geo_graticuleX(y0, y1, dy) {\n var y = d3.range(y0, y1 - ε, dy).concat(y1);\n return function(x) {\n return y.map(function(y) {\n return [ x, y ];\n });\n };\n }\n function d3_geo_graticuleY(x0, x1, dx) {\n var x = d3.range(x0, x1 - ε, dx).concat(x1);\n return function(y) {\n return x.map(function(x) {\n return [ x, y ];\n });\n };\n }\n function d3_source(d) {\n return d.source;\n }\n function d3_target(d) {\n return d.target;\n }\n d3.geo.greatArc = function() {\n var source = d3_source, source_, target = d3_target, target_;\n function greatArc() {\n return {\n type: \"LineString\",\n coordinates: [ source_ || source.apply(this, arguments), target_ || target.apply(this, arguments) ]\n };\n }\n greatArc.distance = function() {\n return d3.geo.distance(source_ || source.apply(this, arguments), target_ || target.apply(this, arguments));\n };\n greatArc.source = function(_) {\n if (!arguments.length) return source;\n source = _, source_ = typeof _ === \"function\" ? null : _;\n return greatArc;\n };\n greatArc.target = function(_) {\n if (!arguments.length) return target;\n target = _, target_ = typeof _ === \"function\" ? null : _;\n return greatArc;\n };\n greatArc.precision = function() {\n return arguments.length ? greatArc : 0;\n };\n return greatArc;\n };\n d3.geo.interpolate = function(source, target) {\n return d3_geo_interpolate(source[0] * d3_radians, source[1] * d3_radians, target[0] * d3_radians, target[1] * d3_radians);\n };\n function d3_geo_interpolate(x0, y0, x1, y1) {\n var cy0 = Math.cos(y0), sy0 = Math.sin(y0), cy1 = Math.cos(y1), sy1 = Math.sin(y1), kx0 = cy0 * Math.cos(x0), ky0 = cy0 * Math.sin(x0), kx1 = cy1 * Math.cos(x1), ky1 = cy1 * Math.sin(x1), d = 2 * Math.asin(Math.sqrt(d3_haversin(y1 - y0) + cy0 * cy1 * d3_haversin(x1 - x0))), k = 1 / Math.sin(d);\n var interpolate = d ? function(t) {\n var B = Math.sin(t *= d) * k, A = Math.sin(d - t) * k, x = A * kx0 + B * kx1, y = A * ky0 + B * ky1, z = A * sy0 + B * sy1;\n return [ Math.atan2(y, x) * d3_degrees, Math.atan2(z, Math.sqrt(x * x + y * y)) * d3_degrees ];\n } : function() {\n return [ x0 * d3_degrees, y0 * d3_degrees ];\n };\n interpolate.distance = d;\n return interpolate;\n }\n d3.geo.length = function(object) {\n d3_geo_lengthSum = 0;\n d3.geo.stream(object, d3_geo_length);\n return d3_geo_lengthSum;\n };\n var d3_geo_lengthSum;\n var d3_geo_length = {\n sphere: d3_noop,\n point: d3_noop,\n lineStart: d3_geo_lengthLineStart,\n lineEnd: d3_noop,\n polygonStart: d3_noop,\n polygonEnd: d3_noop\n };\n function d3_geo_lengthLineStart() {\n var λ0, sinφ0, cosφ0;\n d3_geo_length.point = function(λ, φ) {\n λ0 = λ * d3_radians, sinφ0 = Math.sin(φ *= d3_radians), cosφ0 = Math.cos(φ);\n d3_geo_length.point = nextPoint;\n };\n d3_geo_length.lineEnd = function() {\n d3_geo_length.point = d3_geo_length.lineEnd = d3_noop;\n };\n function nextPoint(λ, φ) {\n var sinφ = Math.sin(φ *= d3_radians), cosφ = Math.cos(φ), t = abs((λ *= d3_radians) - λ0), cosΔλ = Math.cos(t);\n d3_geo_lengthSum += Math.atan2(Math.sqrt((t = cosφ * Math.sin(t)) * t + (t = cosφ0 * sinφ - sinφ0 * cosφ * cosΔλ) * t), sinφ0 * sinφ + cosφ0 * cosφ * cosΔλ);\n λ0 = λ, sinφ0 = sinφ, cosφ0 = cosφ;\n }\n }\n function d3_geo_azimuthal(scale, angle) {\n function azimuthal(λ, φ) {\n var cosλ = Math.cos(λ), cosφ = Math.cos(φ), k = scale(cosλ * cosφ);\n return [ k * cosφ * Math.sin(λ), k * Math.sin(φ) ];\n }\n azimuthal.invert = function(x, y) {\n var ρ = Math.sqrt(x * x + y * y), c = angle(ρ), sinc = Math.sin(c), cosc = Math.cos(c);\n return [ Math.atan2(x * sinc, ρ * cosc), Math.asin(ρ && y * sinc / ρ) ];\n };\n return azimuthal;\n }\n var d3_geo_azimuthalEqualArea = d3_geo_azimuthal(function(cosλcosφ) {\n return Math.sqrt(2 / (1 + cosλcosφ));\n }, function(ρ) {\n return 2 * Math.asin(ρ / 2);\n });\n (d3.geo.azimuthalEqualArea = function() {\n return d3_geo_projection(d3_geo_azimuthalEqualArea);\n }).raw = d3_geo_azimuthalEqualArea;\n var d3_geo_azimuthalEquidistant = d3_geo_azimuthal(function(cosλcosφ) {\n var c = Math.acos(cosλcosφ);\n return c && c / Math.sin(c);\n }, d3_identity);\n (d3.geo.azimuthalEquidistant = function() {\n return d3_geo_projection(d3_geo_azimuthalEquidistant);\n }).raw = d3_geo_azimuthalEquidistant;\n function d3_geo_conicConformal(φ0, φ1) {\n var cosφ0 = Math.cos(φ0), t = function(φ) {\n return Math.tan(π / 4 + φ / 2);\n }, n = φ0 === φ1 ? Math.sin(φ0) : Math.log(cosφ0 / Math.cos(φ1)) / Math.log(t(φ1) / t(φ0)), F = cosφ0 * Math.pow(t(φ0), n) / n;\n if (!n) return d3_geo_mercator;\n function forward(λ, φ) {\n if (F > 0) {\n if (φ < -halfπ + ε) φ = -halfπ + ε;\n } else {\n if (φ > halfπ - ε) φ = halfπ - ε;\n }\n var ρ = F / Math.pow(t(φ), n);\n return [ ρ * Math.sin(n * λ), F - ρ * Math.cos(n * λ) ];\n }\n forward.invert = function(x, y) {\n var ρ0_y = F - y, ρ = d3_sgn(n) * Math.sqrt(x * x + ρ0_y * ρ0_y);\n return [ Math.atan2(x, ρ0_y) / n, 2 * Math.atan(Math.pow(F / ρ, 1 / n)) - halfπ ];\n };\n return forward;\n }\n (d3.geo.conicConformal = function() {\n return d3_geo_conic(d3_geo_conicConformal);\n }).raw = d3_geo_conicConformal;\n function d3_geo_conicEquidistant(φ0, φ1) {\n var cosφ0 = Math.cos(φ0), n = φ0 === φ1 ? Math.sin(φ0) : (cosφ0 - Math.cos(φ1)) / (φ1 - φ0), G = cosφ0 / n + φ0;\n if (abs(n) < ε) return d3_geo_equirectangular;\n function forward(λ, φ) {\n var ρ = G - φ;\n return [ ρ * Math.sin(n * λ), G - ρ * Math.cos(n * λ) ];\n }\n forward.invert = function(x, y) {\n var ρ0_y = G - y;\n return [ Math.atan2(x, ρ0_y) / n, G - d3_sgn(n) * Math.sqrt(x * x + ρ0_y * ρ0_y) ];\n };\n return forward;\n }\n (d3.geo.conicEquidistant = function() {\n return d3_geo_conic(d3_geo_conicEquidistant);\n }).raw = d3_geo_conicEquidistant;\n var d3_geo_gnomonic = d3_geo_azimuthal(function(cosλcosφ) {\n return 1 / cosλcosφ;\n }, Math.atan);\n (d3.geo.gnomonic = function() {\n return d3_geo_projection(d3_geo_gnomonic);\n }).raw = d3_geo_gnomonic;\n function d3_geo_mercator(λ, φ) {\n return [ λ, Math.log(Math.tan(π / 4 + φ / 2)) ];\n }\n d3_geo_mercator.invert = function(x, y) {\n return [ x, 2 * Math.atan(Math.exp(y)) - halfπ ];\n };\n function d3_geo_mercatorProjection(project) {\n var m = d3_geo_projection(project), scale = m.scale, translate = m.translate, clipExtent = m.clipExtent, clipAuto;\n m.scale = function() {\n var v = scale.apply(m, arguments);\n return v === m ? clipAuto ? m.clipExtent(null) : m : v;\n };\n m.translate = function() {\n var v = translate.apply(m, arguments);\n return v === m ? clipAuto ? m.clipExtent(null) : m : v;\n };\n m.clipExtent = function(_) {\n var v = clipExtent.apply(m, arguments);\n if (v === m) {\n if (clipAuto = _ == null) {\n var k = π * scale(), t = translate();\n clipExtent([ [ t[0] - k, t[1] - k ], [ t[0] + k, t[1] + k ] ]);\n }\n } else if (clipAuto) {\n v = null;\n }\n return v;\n };\n return m.clipExtent(null);\n }\n (d3.geo.mercator = function() {\n return d3_geo_mercatorProjection(d3_geo_mercator);\n }).raw = d3_geo_mercator;\n var d3_geo_orthographic = d3_geo_azimuthal(function() {\n return 1;\n }, Math.asin);\n (d3.geo.orthographic = function() {\n return d3_geo_projection(d3_geo_orthographic);\n }).raw = d3_geo_orthographic;\n var d3_geo_stereographic = d3_geo_azimuthal(function(cosλcosφ) {\n return 1 / (1 + cosλcosφ);\n }, function(ρ) {\n return 2 * Math.atan(ρ);\n });\n (d3.geo.stereographic = function() {\n return d3_geo_projection(d3_geo_stereographic);\n }).raw = d3_geo_stereographic;\n function d3_geo_transverseMercator(λ, φ) {\n return [ Math.log(Math.tan(π / 4 + φ / 2)), -λ ];\n }\n d3_geo_transverseMercator.invert = function(x, y) {\n return [ -y, 2 * Math.atan(Math.exp(x)) - halfπ ];\n };\n (d3.geo.transverseMercator = function() {\n var projection = d3_geo_mercatorProjection(d3_geo_transverseMercator), center = projection.center, rotate = projection.rotate;\n projection.center = function(_) {\n return _ ? center([ -_[1], _[0] ]) : (_ = center(), [ _[1], -_[0] ]);\n };\n projection.rotate = function(_) {\n return _ ? rotate([ _[0], _[1], _.length > 2 ? _[2] + 90 : 90 ]) : (_ = rotate(), \n [ _[0], _[1], _[2] - 90 ]);\n };\n return rotate([ 0, 0, 90 ]);\n }).raw = d3_geo_transverseMercator;\n d3.geom = {};\n function d3_geom_pointX(d) {\n return d[0];\n }\n function d3_geom_pointY(d) {\n return d[1];\n }\n d3.geom.hull = function(vertices) {\n var x = d3_geom_pointX, y = d3_geom_pointY;\n if (arguments.length) return hull(vertices);\n function hull(data) {\n if (data.length < 3) return [];\n var fx = d3_functor(x), fy = d3_functor(y), i, n = data.length, points = [], flippedPoints = [];\n for (i = 0; i < n; i++) {\n points.push([ +fx.call(this, data[i], i), +fy.call(this, data[i], i), i ]);\n }\n points.sort(d3_geom_hullOrder);\n for (i = 0; i < n; i++) flippedPoints.push([ points[i][0], -points[i][1] ]);\n var upper = d3_geom_hullUpper(points), lower = d3_geom_hullUpper(flippedPoints);\n var skipLeft = lower[0] === upper[0], skipRight = lower[lower.length - 1] === upper[upper.length - 1], polygon = [];\n for (i = upper.length - 1; i >= 0; --i) polygon.push(data[points[upper[i]][2]]);\n for (i = +skipLeft; i < lower.length - skipRight; ++i) polygon.push(data[points[lower[i]][2]]);\n return polygon;\n }\n hull.x = function(_) {\n return arguments.length ? (x = _, hull) : x;\n };\n hull.y = function(_) {\n return arguments.length ? (y = _, hull) : y;\n };\n return hull;\n };\n function d3_geom_hullUpper(points) {\n var n = points.length, hull = [ 0, 1 ], hs = 2;\n for (var i = 2; i < n; i++) {\n while (hs > 1 && d3_cross2d(points[hull[hs - 2]], points[hull[hs - 1]], points[i]) <= 0) --hs;\n hull[hs++] = i;\n }\n return hull.slice(0, hs);\n }\n function d3_geom_hullOrder(a, b) {\n return a[0] - b[0] || a[1] - b[1];\n }\n d3.geom.polygon = function(coordinates) {\n d3_subclass(coordinates, d3_geom_polygonPrototype);\n return coordinates;\n };\n var d3_geom_polygonPrototype = d3.geom.polygon.prototype = [];\n d3_geom_polygonPrototype.area = function() {\n var i = -1, n = this.length, a, b = this[n - 1], area = 0;\n while (++i < n) {\n a = b;\n b = this[i];\n area += a[1] * b[0] - a[0] * b[1];\n }\n return area * .5;\n };\n d3_geom_polygonPrototype.centroid = function(k) {\n var i = -1, n = this.length, x = 0, y = 0, a, b = this[n - 1], c;\n if (!arguments.length) k = -1 / (6 * this.area());\n while (++i < n) {\n a = b;\n b = this[i];\n c = a[0] * b[1] - b[0] * a[1];\n x += (a[0] + b[0]) * c;\n y += (a[1] + b[1]) * c;\n }\n return [ x * k, y * k ];\n };\n d3_geom_polygonPrototype.clip = function(subject) {\n var input, closed = d3_geom_polygonClosed(subject), i = -1, n = this.length - d3_geom_polygonClosed(this), j, m, a = this[n - 1], b, c, d;\n while (++i < n) {\n input = subject.slice();\n subject.length = 0;\n b = this[i];\n c = input[(m = input.length - closed) - 1];\n j = -1;\n while (++j < m) {\n d = input[j];\n if (d3_geom_polygonInside(d, a, b)) {\n if (!d3_geom_polygonInside(c, a, b)) {\n subject.push(d3_geom_polygonIntersect(c, d, a, b));\n }\n subject.push(d);\n } else if (d3_geom_polygonInside(c, a, b)) {\n subject.push(d3_geom_polygonIntersect(c, d, a, b));\n }\n c = d;\n }\n if (closed) subject.push(subject[0]);\n a = b;\n }\n return subject;\n };\n function d3_geom_polygonInside(p, a, b) {\n return (b[0] - a[0]) * (p[1] - a[1]) < (b[1] - a[1]) * (p[0] - a[0]);\n }\n function d3_geom_polygonIntersect(c, d, a, b) {\n var x1 = c[0], x3 = a[0], x21 = d[0] - x1, x43 = b[0] - x3, y1 = c[1], y3 = a[1], y21 = d[1] - y1, y43 = b[1] - y3, ua = (x43 * (y1 - y3) - y43 * (x1 - x3)) / (y43 * x21 - x43 * y21);\n return [ x1 + ua * x21, y1 + ua * y21 ];\n }\n function d3_geom_polygonClosed(coordinates) {\n var a = coordinates[0], b = coordinates[coordinates.length - 1];\n return !(a[0] - b[0] || a[1] - b[1]);\n }\n var d3_geom_voronoiEdges, d3_geom_voronoiCells, d3_geom_voronoiBeaches, d3_geom_voronoiBeachPool = [], d3_geom_voronoiFirstCircle, d3_geom_voronoiCircles, d3_geom_voronoiCirclePool = [];\n function d3_geom_voronoiBeach() {\n d3_geom_voronoiRedBlackNode(this);\n this.edge = this.site = this.circle = null;\n }\n function d3_geom_voronoiCreateBeach(site) {\n var beach = d3_geom_voronoiBeachPool.pop() || new d3_geom_voronoiBeach();\n beach.site = site;\n return beach;\n }\n function d3_geom_voronoiDetachBeach(beach) {\n d3_geom_voronoiDetachCircle(beach);\n d3_geom_voronoiBeaches.remove(beach);\n d3_geom_voronoiBeachPool.push(beach);\n d3_geom_voronoiRedBlackNode(beach);\n }\n function d3_geom_voronoiRemoveBeach(beach) {\n var circle = beach.circle, x = circle.x, y = circle.cy, vertex = {\n x: x,\n y: y\n }, previous = beach.P, next = beach.N, disappearing = [ beach ];\n d3_geom_voronoiDetachBeach(beach);\n var lArc = previous;\n while (lArc.circle && abs(x - lArc.circle.x) < ε && abs(y - lArc.circle.cy) < ε) {\n previous = lArc.P;\n disappearing.unshift(lArc);\n d3_geom_voronoiDetachBeach(lArc);\n lArc = previous;\n }\n disappearing.unshift(lArc);\n d3_geom_voronoiDetachCircle(lArc);\n var rArc = next;\n while (rArc.circle && abs(x - rArc.circle.x) < ε && abs(y - rArc.circle.cy) < ε) {\n next = rArc.N;\n disappearing.push(rArc);\n d3_geom_voronoiDetachBeach(rArc);\n rArc = next;\n }\n disappearing.push(rArc);\n d3_geom_voronoiDetachCircle(rArc);\n var nArcs = disappearing.length, iArc;\n for (iArc = 1; iArc < nArcs; ++iArc) {\n rArc = disappearing[iArc];\n lArc = disappearing[iArc - 1];\n d3_geom_voronoiSetEdgeEnd(rArc.edge, lArc.site, rArc.site, vertex);\n }\n lArc = disappearing[0];\n rArc = disappearing[nArcs - 1];\n rArc.edge = d3_geom_voronoiCreateEdge(lArc.site, rArc.site, null, vertex);\n d3_geom_voronoiAttachCircle(lArc);\n d3_geom_voronoiAttachCircle(rArc);\n }\n function d3_geom_voronoiAddBeach(site) {\n var x = site.x, directrix = site.y, lArc, rArc, dxl, dxr, node = d3_geom_voronoiBeaches._;\n while (node) {\n dxl = d3_geom_voronoiLeftBreakPoint(node, directrix) - x;\n if (dxl > ε) node = node.L; else {\n dxr = x - d3_geom_voronoiRightBreakPoint(node, directrix);\n if (dxr > ε) {\n if (!node.R) {\n lArc = node;\n break;\n }\n node = node.R;\n } else {\n if (dxl > -ε) {\n lArc = node.P;\n rArc = node;\n } else if (dxr > -ε) {\n lArc = node;\n rArc = node.N;\n } else {\n lArc = rArc = node;\n }\n break;\n }\n }\n }\n var newArc = d3_geom_voronoiCreateBeach(site);\n d3_geom_voronoiBeaches.insert(lArc, newArc);\n if (!lArc && !rArc) return;\n if (lArc === rArc) {\n d3_geom_voronoiDetachCircle(lArc);\n rArc = d3_geom_voronoiCreateBeach(lArc.site);\n d3_geom_voronoiBeaches.insert(newArc, rArc);\n newArc.edge = rArc.edge = d3_geom_voronoiCreateEdge(lArc.site, newArc.site);\n d3_geom_voronoiAttachCircle(lArc);\n d3_geom_voronoiAttachCircle(rArc);\n return;\n }\n if (!rArc) {\n newArc.edge = d3_geom_voronoiCreateEdge(lArc.site, newArc.site);\n return;\n }\n d3_geom_voronoiDetachCircle(lArc);\n d3_geom_voronoiDetachCircle(rArc);\n var lSite = lArc.site, ax = lSite.x, ay = lSite.y, bx = site.x - ax, by = site.y - ay, rSite = rArc.site, cx = rSite.x - ax, cy = rSite.y - ay, d = 2 * (bx * cy - by * cx), hb = bx * bx + by * by, hc = cx * cx + cy * cy, vertex = {\n x: (cy * hb - by * hc) / d + ax,\n y: (bx * hc - cx * hb) / d + ay\n };\n d3_geom_voronoiSetEdgeEnd(rArc.edge, lSite, rSite, vertex);\n newArc.edge = d3_geom_voronoiCreateEdge(lSite, site, null, vertex);\n rArc.edge = d3_geom_voronoiCreateEdge(site, rSite, null, vertex);\n d3_geom_voronoiAttachCircle(lArc);\n d3_geom_voronoiAttachCircle(rArc);\n }\n function d3_geom_voronoiLeftBreakPoint(arc, directrix) {\n var site = arc.site, rfocx = site.x, rfocy = site.y, pby2 = rfocy - directrix;\n if (!pby2) return rfocx;\n var lArc = arc.P;\n if (!lArc) return -Infinity;\n site = lArc.site;\n var lfocx = site.x, lfocy = site.y, plby2 = lfocy - directrix;\n if (!plby2) return lfocx;\n var hl = lfocx - rfocx, aby2 = 1 / pby2 - 1 / plby2, b = hl / plby2;\n if (aby2) return (-b + Math.sqrt(b * b - 2 * aby2 * (hl * hl / (-2 * plby2) - lfocy + plby2 / 2 + rfocy - pby2 / 2))) / aby2 + rfocx;\n return (rfocx + lfocx) / 2;\n }\n function d3_geom_voronoiRightBreakPoint(arc, directrix) {\n var rArc = arc.N;\n if (rArc) return d3_geom_voronoiLeftBreakPoint(rArc, directrix);\n var site = arc.site;\n return site.y === directrix ? site.x : Infinity;\n }\n function d3_geom_voronoiCell(site) {\n this.site = site;\n this.edges = [];\n }\n d3_geom_voronoiCell.prototype.prepare = function() {\n var halfEdges = this.edges, iHalfEdge = halfEdges.length, edge;\n while (iHalfEdge--) {\n edge = halfEdges[iHalfEdge].edge;\n if (!edge.b || !edge.a) halfEdges.splice(iHalfEdge, 1);\n }\n halfEdges.sort(d3_geom_voronoiHalfEdgeOrder);\n return halfEdges.length;\n };\n function d3_geom_voronoiCloseCells(extent) {\n var x0 = extent[0][0], x1 = extent[1][0], y0 = extent[0][1], y1 = extent[1][1], x2, y2, x3, y3, cells = d3_geom_voronoiCells, iCell = cells.length, cell, iHalfEdge, halfEdges, nHalfEdges, start, end;\n while (iCell--) {\n cell = cells[iCell];\n if (!cell || !cell.prepare()) continue;\n halfEdges = cell.edges;\n nHalfEdges = halfEdges.length;\n iHalfEdge = 0;\n while (iHalfEdge < nHalfEdges) {\n end = halfEdges[iHalfEdge].end(), x3 = end.x, y3 = end.y;\n start = halfEdges[++iHalfEdge % nHalfEdges].start(), x2 = start.x, y2 = start.y;\n if (abs(x3 - x2) > ε || abs(y3 - y2) > ε) {\n halfEdges.splice(iHalfEdge, 0, new d3_geom_voronoiHalfEdge(d3_geom_voronoiCreateBorderEdge(cell.site, end, abs(x3 - x0) < ε && y1 - y3 > ε ? {\n x: x0,\n y: abs(x2 - x0) < ε ? y2 : y1\n } : abs(y3 - y1) < ε && x1 - x3 > ε ? {\n x: abs(y2 - y1) < ε ? x2 : x1,\n y: y1\n } : abs(x3 - x1) < ε && y3 - y0 > ε ? {\n x: x1,\n y: abs(x2 - x1) < ε ? y2 : y0\n } : abs(y3 - y0) < ε && x3 - x0 > ε ? {\n x: abs(y2 - y0) < ε ? x2 : x0,\n y: y0\n } : null), cell.site, null));\n ++nHalfEdges;\n }\n }\n }\n }\n function d3_geom_voronoiHalfEdgeOrder(a, b) {\n return b.angle - a.angle;\n }\n function d3_geom_voronoiCircle() {\n d3_geom_voronoiRedBlackNode(this);\n this.x = this.y = this.arc = this.site = this.cy = null;\n }\n function d3_geom_voronoiAttachCircle(arc) {\n var lArc = arc.P, rArc = arc.N;\n if (!lArc || !rArc) return;\n var lSite = lArc.site, cSite = arc.site, rSite = rArc.site;\n if (lSite === rSite) return;\n var bx = cSite.x, by = cSite.y, ax = lSite.x - bx, ay = lSite.y - by, cx = rSite.x - bx, cy = rSite.y - by;\n var d = 2 * (ax * cy - ay * cx);\n if (d >= -ε2) return;\n var ha = ax * ax + ay * ay, hc = cx * cx + cy * cy, x = (cy * ha - ay * hc) / d, y = (ax * hc - cx * ha) / d, cy = y + by;\n var circle = d3_geom_voronoiCirclePool.pop() || new d3_geom_voronoiCircle();\n circle.arc = arc;\n circle.site = cSite;\n circle.x = x + bx;\n circle.y = cy + Math.sqrt(x * x + y * y);\n circle.cy = cy;\n arc.circle = circle;\n var before = null, node = d3_geom_voronoiCircles._;\n while (node) {\n if (circle.y < node.y || circle.y === node.y && circle.x <= node.x) {\n if (node.L) node = node.L; else {\n before = node.P;\n break;\n }\n } else {\n if (node.R) node = node.R; else {\n before = node;\n break;\n }\n }\n }\n d3_geom_voronoiCircles.insert(before, circle);\n if (!before) d3_geom_voronoiFirstCircle = circle;\n }\n function d3_geom_voronoiDetachCircle(arc) {\n var circle = arc.circle;\n if (circle) {\n if (!circle.P) d3_geom_voronoiFirstCircle = circle.N;\n d3_geom_voronoiCircles.remove(circle);\n d3_geom_voronoiCirclePool.push(circle);\n d3_geom_voronoiRedBlackNode(circle);\n arc.circle = null;\n }\n }\n function d3_geom_voronoiClipEdges(extent) {\n var edges = d3_geom_voronoiEdges, clip = d3_geom_clipLine(extent[0][0], extent[0][1], extent[1][0], extent[1][1]), i = edges.length, e;\n while (i--) {\n e = edges[i];\n if (!d3_geom_voronoiConnectEdge(e, extent) || !clip(e) || abs(e.a.x - e.b.x) < ε && abs(e.a.y - e.b.y) < ε) {\n e.a = e.b = null;\n edges.splice(i, 1);\n }\n }\n }\n function d3_geom_voronoiConnectEdge(edge, extent) {\n var vb = edge.b;\n if (vb) return true;\n var va = edge.a, x0 = extent[0][0], x1 = extent[1][0], y0 = extent[0][1], y1 = extent[1][1], lSite = edge.l, rSite = edge.r, lx = lSite.x, ly = lSite.y, rx = rSite.x, ry = rSite.y, fx = (lx + rx) / 2, fy = (ly + ry) / 2, fm, fb;\n if (ry === ly) {\n if (fx < x0 || fx >= x1) return;\n if (lx > rx) {\n if (!va) va = {\n x: fx,\n y: y0\n }; else if (va.y >= y1) return;\n vb = {\n x: fx,\n y: y1\n };\n } else {\n if (!va) va = {\n x: fx,\n y: y1\n }; else if (va.y < y0) return;\n vb = {\n x: fx,\n y: y0\n };\n }\n } else {\n fm = (lx - rx) / (ry - ly);\n fb = fy - fm * fx;\n if (fm < -1 || fm > 1) {\n if (lx > rx) {\n if (!va) va = {\n x: (y0 - fb) / fm,\n y: y0\n }; else if (va.y >= y1) return;\n vb = {\n x: (y1 - fb) / fm,\n y: y1\n };\n } else {\n if (!va) va = {\n x: (y1 - fb) / fm,\n y: y1\n }; else if (va.y < y0) return;\n vb = {\n x: (y0 - fb) / fm,\n y: y0\n };\n }\n } else {\n if (ly < ry) {\n if (!va) va = {\n x: x0,\n y: fm * x0 + fb\n }; else if (va.x >= x1) return;\n vb = {\n x: x1,\n y: fm * x1 + fb\n };\n } else {\n if (!va) va = {\n x: x1,\n y: fm * x1 + fb\n }; else if (va.x < x0) return;\n vb = {\n x: x0,\n y: fm * x0 + fb\n };\n }\n }\n }\n edge.a = va;\n edge.b = vb;\n return true;\n }\n function d3_geom_voronoiEdge(lSite, rSite) {\n this.l = lSite;\n this.r = rSite;\n this.a = this.b = null;\n }\n function d3_geom_voronoiCreateEdge(lSite, rSite, va, vb) {\n var edge = new d3_geom_voronoiEdge(lSite, rSite);\n d3_geom_voronoiEdges.push(edge);\n if (va) d3_geom_voronoiSetEdgeEnd(edge, lSite, rSite, va);\n if (vb) d3_geom_voronoiSetEdgeEnd(edge, rSite, lSite, vb);\n d3_geom_voronoiCells[lSite.i].edges.push(new d3_geom_voronoiHalfEdge(edge, lSite, rSite));\n d3_geom_voronoiCells[rSite.i].edges.push(new d3_geom_voronoiHalfEdge(edge, rSite, lSite));\n return edge;\n }\n function d3_geom_voronoiCreateBorderEdge(lSite, va, vb) {\n var edge = new d3_geom_voronoiEdge(lSite, null);\n edge.a = va;\n edge.b = vb;\n d3_geom_voronoiEdges.push(edge);\n return edge;\n }\n function d3_geom_voronoiSetEdgeEnd(edge, lSite, rSite, vertex) {\n if (!edge.a && !edge.b) {\n edge.a = vertex;\n edge.l = lSite;\n edge.r = rSite;\n } else if (edge.l === rSite) {\n edge.b = vertex;\n } else {\n edge.a = vertex;\n }\n }\n function d3_geom_voronoiHalfEdge(edge, lSite, rSite) {\n var va = edge.a, vb = edge.b;\n this.edge = edge;\n this.site = lSite;\n this.angle = rSite ? Math.atan2(rSite.y - lSite.y, rSite.x - lSite.x) : edge.l === lSite ? Math.atan2(vb.x - va.x, va.y - vb.y) : Math.atan2(va.x - vb.x, vb.y - va.y);\n }\n d3_geom_voronoiHalfEdge.prototype = {\n start: function() {\n return this.edge.l === this.site ? this.edge.a : this.edge.b;\n },\n end: function() {\n return this.edge.l === this.site ? this.edge.b : this.edge.a;\n }\n };\n function d3_geom_voronoiRedBlackTree() {\n this._ = null;\n }\n function d3_geom_voronoiRedBlackNode(node) {\n node.U = node.C = node.L = node.R = node.P = node.N = null;\n }\n d3_geom_voronoiRedBlackTree.prototype = {\n insert: function(after, node) {\n var parent, grandpa, uncle;\n if (after) {\n node.P = after;\n node.N = after.N;\n if (after.N) after.N.P = node;\n after.N = node;\n if (after.R) {\n after = after.R;\n while (after.L) after = after.L;\n after.L = node;\n } else {\n after.R = node;\n }\n parent = after;\n } else if (this._) {\n after = d3_geom_voronoiRedBlackFirst(this._);\n node.P = null;\n node.N = after;\n after.P = after.L = node;\n parent = after;\n } else {\n node.P = node.N = null;\n this._ = node;\n parent = null;\n }\n node.L = node.R = null;\n node.U = parent;\n node.C = true;\n after = node;\n while (parent && parent.C) {\n grandpa = parent.U;\n if (parent === grandpa.L) {\n uncle = grandpa.R;\n if (uncle && uncle.C) {\n parent.C = uncle.C = false;\n grandpa.C = true;\n after = grandpa;\n } else {\n if (after === parent.R) {\n d3_geom_voronoiRedBlackRotateLeft(this, parent);\n after = parent;\n parent = after.U;\n }\n parent.C = false;\n grandpa.C = true;\n d3_geom_voronoiRedBlackRotateRight(this, grandpa);\n }\n } else {\n uncle = grandpa.L;\n if (uncle && uncle.C) {\n parent.C = uncle.C = false;\n grandpa.C = true;\n after = grandpa;\n } else {\n if (after === parent.L) {\n d3_geom_voronoiRedBlackRotateRight(this, parent);\n after = parent;\n parent = after.U;\n }\n parent.C = false;\n grandpa.C = true;\n d3_geom_voronoiRedBlackRotateLeft(this, grandpa);\n }\n }\n parent = after.U;\n }\n this._.C = false;\n },\n remove: function(node) {\n if (node.N) node.N.P = node.P;\n if (node.P) node.P.N = node.N;\n node.N = node.P = null;\n var parent = node.U, sibling, left = node.L, right = node.R, next, red;\n if (!left) next = right; else if (!right) next = left; else next = d3_geom_voronoiRedBlackFirst(right);\n if (parent) {\n if (parent.L === node) parent.L = next; else parent.R = next;\n } else {\n this._ = next;\n }\n if (left && right) {\n red = next.C;\n next.C = node.C;\n next.L = left;\n left.U = next;\n if (next !== right) {\n parent = next.U;\n next.U = node.U;\n node = next.R;\n parent.L = node;\n next.R = right;\n right.U = next;\n } else {\n next.U = parent;\n parent = next;\n node = next.R;\n }\n } else {\n red = node.C;\n node = next;\n }\n if (node) node.U = parent;\n if (red) return;\n if (node && node.C) {\n node.C = false;\n return;\n }\n do {\n if (node === this._) break;\n if (node === parent.L) {\n sibling = parent.R;\n if (sibling.C) {\n sibling.C = false;\n parent.C = true;\n d3_geom_voronoiRedBlackRotateLeft(this, parent);\n sibling = parent.R;\n }\n if (sibling.L && sibling.L.C || sibling.R && sibling.R.C) {\n if (!sibling.R || !sibling.R.C) {\n sibling.L.C = false;\n sibling.C = true;\n d3_geom_voronoiRedBlackRotateRight(this, sibling);\n sibling = parent.R;\n }\n sibling.C = parent.C;\n parent.C = sibling.R.C = false;\n d3_geom_voronoiRedBlackRotateLeft(this, parent);\n node = this._;\n break;\n }\n } else {\n sibling = parent.L;\n if (sibling.C) {\n sibling.C = false;\n parent.C = true;\n d3_geom_voronoiRedBlackRotateRight(this, parent);\n sibling = parent.L;\n }\n if (sibling.L && sibling.L.C || sibling.R && sibling.R.C) {\n if (!sibling.L || !sibling.L.C) {\n sibling.R.C = false;\n sibling.C = true;\n d3_geom_voronoiRedBlackRotateLeft(this, sibling);\n sibling = parent.L;\n }\n sibling.C = parent.C;\n parent.C = sibling.L.C = false;\n d3_geom_voronoiRedBlackRotateRight(this, parent);\n node = this._;\n break;\n }\n }\n sibling.C = true;\n node = parent;\n parent = parent.U;\n } while (!node.C);\n if (node) node.C = false;\n }\n };\n function d3_geom_voronoiRedBlackRotateLeft(tree, node) {\n var p = node, q = node.R, parent = p.U;\n if (parent) {\n if (parent.L === p) parent.L = q; else parent.R = q;\n } else {\n tree._ = q;\n }\n q.U = parent;\n p.U = q;\n p.R = q.L;\n if (p.R) p.R.U = p;\n q.L = p;\n }\n function d3_geom_voronoiRedBlackRotateRight(tree, node) {\n var p = node, q = node.L, parent = p.U;\n if (parent) {\n if (parent.L === p) parent.L = q; else parent.R = q;\n } else {\n tree._ = q;\n }\n q.U = parent;\n p.U = q;\n p.L = q.R;\n if (p.L) p.L.U = p;\n q.R = p;\n }\n function d3_geom_voronoiRedBlackFirst(node) {\n while (node.L) node = node.L;\n return node;\n }\n function d3_geom_voronoi(sites, bbox) {\n var site = sites.sort(d3_geom_voronoiVertexOrder).pop(), x0, y0, circle;\n d3_geom_voronoiEdges = [];\n d3_geom_voronoiCells = new Array(sites.length);\n d3_geom_voronoiBeaches = new d3_geom_voronoiRedBlackTree();\n d3_geom_voronoiCircles = new d3_geom_voronoiRedBlackTree();\n while (true) {\n circle = d3_geom_voronoiFirstCircle;\n if (site && (!circle || site.y < circle.y || site.y === circle.y && site.x < circle.x)) {\n if (site.x !== x0 || site.y !== y0) {\n d3_geom_voronoiCells[site.i] = new d3_geom_voronoiCell(site);\n d3_geom_voronoiAddBeach(site);\n x0 = site.x, y0 = site.y;\n }\n site = sites.pop();\n } else if (circle) {\n d3_geom_voronoiRemoveBeach(circle.arc);\n } else {\n break;\n }\n }\n if (bbox) d3_geom_voronoiClipEdges(bbox), d3_geom_voronoiCloseCells(bbox);\n var diagram = {\n cells: d3_geom_voronoiCells,\n edges: d3_geom_voronoiEdges\n };\n d3_geom_voronoiBeaches = d3_geom_voronoiCircles = d3_geom_voronoiEdges = d3_geom_voronoiCells = null;\n return diagram;\n }\n function d3_geom_voronoiVertexOrder(a, b) {\n return b.y - a.y || b.x - a.x;\n }\n d3.geom.voronoi = function(points) {\n var x = d3_geom_pointX, y = d3_geom_pointY, fx = x, fy = y, clipExtent = d3_geom_voronoiClipExtent;\n if (points) return voronoi(points);\n function voronoi(data) {\n var polygons = new Array(data.length), x0 = clipExtent[0][0], y0 = clipExtent[0][1], x1 = clipExtent[1][0], y1 = clipExtent[1][1];\n d3_geom_voronoi(sites(data), clipExtent).cells.forEach(function(cell, i) {\n var edges = cell.edges, site = cell.site, polygon = polygons[i] = edges.length ? edges.map(function(e) {\n var s = e.start();\n return [ s.x, s.y ];\n }) : site.x >= x0 && site.x <= x1 && site.y >= y0 && site.y <= y1 ? [ [ x0, y1 ], [ x1, y1 ], [ x1, y0 ], [ x0, y0 ] ] : [];\n polygon.point = data[i];\n });\n return polygons;\n }\n function sites(data) {\n return data.map(function(d, i) {\n return {\n x: Math.round(fx(d, i) / ε) * ε,\n y: Math.round(fy(d, i) / ε) * ε,\n i: i\n };\n });\n }\n voronoi.links = function(data) {\n return d3_geom_voronoi(sites(data)).edges.filter(function(edge) {\n return edge.l && edge.r;\n }).map(function(edge) {\n return {\n source: data[edge.l.i],\n target: data[edge.r.i]\n };\n });\n };\n voronoi.triangles = function(data) {\n var triangles = [];\n d3_geom_voronoi(sites(data)).cells.forEach(function(cell, i) {\n var site = cell.site, edges = cell.edges.sort(d3_geom_voronoiHalfEdgeOrder), j = -1, m = edges.length, e0, s0, e1 = edges[m - 1].edge, s1 = e1.l === site ? e1.r : e1.l;\n while (++j < m) {\n e0 = e1;\n s0 = s1;\n e1 = edges[j].edge;\n s1 = e1.l === site ? e1.r : e1.l;\n if (i < s0.i && i < s1.i && d3_geom_voronoiTriangleArea(site, s0, s1) < 0) {\n triangles.push([ data[i], data[s0.i], data[s1.i] ]);\n }\n }\n });\n return triangles;\n };\n voronoi.x = function(_) {\n return arguments.length ? (fx = d3_functor(x = _), voronoi) : x;\n };\n voronoi.y = function(_) {\n return arguments.length ? (fy = d3_functor(y = _), voronoi) : y;\n };\n voronoi.clipExtent = function(_) {\n if (!arguments.length) return clipExtent === d3_geom_voronoiClipExtent ? null : clipExtent;\n clipExtent = _ == null ? d3_geom_voronoiClipExtent : _;\n return voronoi;\n };\n voronoi.size = function(_) {\n if (!arguments.length) return clipExtent === d3_geom_voronoiClipExtent ? null : clipExtent && clipExtent[1];\n return voronoi.clipExtent(_ && [ [ 0, 0 ], _ ]);\n };\n return voronoi;\n };\n var d3_geom_voronoiClipExtent = [ [ -1e6, -1e6 ], [ 1e6, 1e6 ] ];\n function d3_geom_voronoiTriangleArea(a, b, c) {\n return (a.x - c.x) * (b.y - a.y) - (a.x - b.x) * (c.y - a.y);\n }\n d3.geom.delaunay = function(vertices) {\n return d3.geom.voronoi().triangles(vertices);\n };\n d3.geom.quadtree = function(points, x1, y1, x2, y2) {\n var x = d3_geom_pointX, y = d3_geom_pointY, compat;\n if (compat = arguments.length) {\n x = d3_geom_quadtreeCompatX;\n y = d3_geom_quadtreeCompatY;\n if (compat === 3) {\n y2 = y1;\n x2 = x1;\n y1 = x1 = 0;\n }\n return quadtree(points);\n }\n function quadtree(data) {\n var d, fx = d3_functor(x), fy = d3_functor(y), xs, ys, i, n, x1_, y1_, x2_, y2_;\n if (x1 != null) {\n x1_ = x1, y1_ = y1, x2_ = x2, y2_ = y2;\n } else {\n x2_ = y2_ = -(x1_ = y1_ = Infinity);\n xs = [], ys = [];\n n = data.length;\n if (compat) for (i = 0; i < n; ++i) {\n d = data[i];\n if (d.x < x1_) x1_ = d.x;\n if (d.y < y1_) y1_ = d.y;\n if (d.x > x2_) x2_ = d.x;\n if (d.y > y2_) y2_ = d.y;\n xs.push(d.x);\n ys.push(d.y);\n } else for (i = 0; i < n; ++i) {\n var x_ = +fx(d = data[i], i), y_ = +fy(d, i);\n if (x_ < x1_) x1_ = x_;\n if (y_ < y1_) y1_ = y_;\n if (x_ > x2_) x2_ = x_;\n if (y_ > y2_) y2_ = y_;\n xs.push(x_);\n ys.push(y_);\n }\n }\n var dx = x2_ - x1_, dy = y2_ - y1_;\n if (dx > dy) y2_ = y1_ + dx; else x2_ = x1_ + dy;\n function insert(n, d, x, y, x1, y1, x2, y2) {\n if (isNaN(x) || isNaN(y)) return;\n if (n.leaf) {\n var nx = n.x, ny = n.y;\n if (nx != null) {\n if (abs(nx - x) + abs(ny - y) < .01) {\n insertChild(n, d, x, y, x1, y1, x2, y2);\n } else {\n var nPoint = n.point;\n n.x = n.y = n.point = null;\n insertChild(n, nPoint, nx, ny, x1, y1, x2, y2);\n insertChild(n, d, x, y, x1, y1, x2, y2);\n }\n } else {\n n.x = x, n.y = y, n.point = d;\n }\n } else {\n insertChild(n, d, x, y, x1, y1, x2, y2);\n }\n }\n function insertChild(n, d, x, y, x1, y1, x2, y2) {\n var xm = (x1 + x2) * .5, ym = (y1 + y2) * .5, right = x >= xm, below = y >= ym, i = below << 1 | right;\n n.leaf = false;\n n = n.nodes[i] || (n.nodes[i] = d3_geom_quadtreeNode());\n if (right) x1 = xm; else x2 = xm;\n if (below) y1 = ym; else y2 = ym;\n insert(n, d, x, y, x1, y1, x2, y2);\n }\n var root = d3_geom_quadtreeNode();\n root.add = function(d) {\n insert(root, d, +fx(d, ++i), +fy(d, i), x1_, y1_, x2_, y2_);\n };\n root.visit = function(f) {\n d3_geom_quadtreeVisit(f, root, x1_, y1_, x2_, y2_);\n };\n root.find = function(point) {\n return d3_geom_quadtreeFind(root, point[0], point[1], x1_, y1_, x2_, y2_);\n };\n i = -1;\n if (x1 == null) {\n while (++i < n) {\n insert(root, data[i], xs[i], ys[i], x1_, y1_, x2_, y2_);\n }\n --i;\n } else data.forEach(root.add);\n xs = ys = data = d = null;\n return root;\n }\n quadtree.x = function(_) {\n return arguments.length ? (x = _, quadtree) : x;\n };\n quadtree.y = function(_) {\n return arguments.length ? (y = _, quadtree) : y;\n };\n quadtree.extent = function(_) {\n if (!arguments.length) return x1 == null ? null : [ [ x1, y1 ], [ x2, y2 ] ];\n if (_ == null) x1 = y1 = x2 = y2 = null; else x1 = +_[0][0], y1 = +_[0][1], x2 = +_[1][0], \n y2 = +_[1][1];\n return quadtree;\n };\n quadtree.size = function(_) {\n if (!arguments.length) return x1 == null ? null : [ x2 - x1, y2 - y1 ];\n if (_ == null) x1 = y1 = x2 = y2 = null; else x1 = y1 = 0, x2 = +_[0], y2 = +_[1];\n return quadtree;\n };\n return quadtree;\n };\n function d3_geom_quadtreeCompatX(d) {\n return d.x;\n }\n function d3_geom_quadtreeCompatY(d) {\n return d.y;\n }\n function d3_geom_quadtreeNode() {\n return {\n leaf: true,\n nodes: [],\n point: null,\n x: null,\n y: null\n };\n }\n function d3_geom_quadtreeVisit(f, node, x1, y1, x2, y2) {\n if (!f(node, x1, y1, x2, y2)) {\n var sx = (x1 + x2) * .5, sy = (y1 + y2) * .5, children = node.nodes;\n if (children[0]) d3_geom_quadtreeVisit(f, children[0], x1, y1, sx, sy);\n if (children[1]) d3_geom_quadtreeVisit(f, children[1], sx, y1, x2, sy);\n if (children[2]) d3_geom_quadtreeVisit(f, children[2], x1, sy, sx, y2);\n if (children[3]) d3_geom_quadtreeVisit(f, children[3], sx, sy, x2, y2);\n }\n }\n function d3_geom_quadtreeFind(root, x, y, x0, y0, x3, y3) {\n var minDistance2 = Infinity, closestPoint;\n (function find(node, x1, y1, x2, y2) {\n if (x1 > x3 || y1 > y3 || x2 < x0 || y2 < y0) return;\n if (point = node.point) {\n var point, dx = x - node.x, dy = y - node.y, distance2 = dx * dx + dy * dy;\n if (distance2 < minDistance2) {\n var distance = Math.sqrt(minDistance2 = distance2);\n x0 = x - distance, y0 = y - distance;\n x3 = x + distance, y3 = y + distance;\n closestPoint = point;\n }\n }\n var children = node.nodes, xm = (x1 + x2) * .5, ym = (y1 + y2) * .5, right = x >= xm, below = y >= ym;\n for (var i = below << 1 | right, j = i + 4; i < j; ++i) {\n if (node = children[i & 3]) switch (i & 3) {\n case 0:\n find(node, x1, y1, xm, ym);\n break;\n\n case 1:\n find(node, xm, y1, x2, ym);\n break;\n\n case 2:\n find(node, x1, ym, xm, y2);\n break;\n\n case 3:\n find(node, xm, ym, x2, y2);\n break;\n }\n }\n })(root, x0, y0, x3, y3);\n return closestPoint;\n }\n d3.interpolateRgb = d3_interpolateRgb;\n function d3_interpolateRgb(a, b) {\n a = d3.rgb(a);\n b = d3.rgb(b);\n var ar = a.r, ag = a.g, ab = a.b, br = b.r - ar, bg = b.g - ag, bb = b.b - ab;\n return function(t) {\n return \"#\" + d3_rgb_hex(Math.round(ar + br * t)) + d3_rgb_hex(Math.round(ag + bg * t)) + d3_rgb_hex(Math.round(ab + bb * t));\n };\n }\n d3.interpolateObject = d3_interpolateObject;\n function d3_interpolateObject(a, b) {\n var i = {}, c = {}, k;\n for (k in a) {\n if (k in b) {\n i[k] = d3_interpolate(a[k], b[k]);\n } else {\n c[k] = a[k];\n }\n }\n for (k in b) {\n if (!(k in a)) {\n c[k] = b[k];\n }\n }\n return function(t) {\n for (k in i) c[k] = i[k](t);\n return c;\n };\n }\n d3.interpolateNumber = d3_interpolateNumber;\n function d3_interpolateNumber(a, b) {\n a = +a, b = +b;\n return function(t) {\n return a * (1 - t) + b * t;\n };\n }\n d3.interpolateString = d3_interpolateString;\n function d3_interpolateString(a, b) {\n var bi = d3_interpolate_numberA.lastIndex = d3_interpolate_numberB.lastIndex = 0, am, bm, bs, i = -1, s = [], q = [];\n a = a + \"\", b = b + \"\";\n while ((am = d3_interpolate_numberA.exec(a)) && (bm = d3_interpolate_numberB.exec(b))) {\n if ((bs = bm.index) > bi) {\n bs = b.slice(bi, bs);\n if (s[i]) s[i] += bs; else s[++i] = bs;\n }\n if ((am = am[0]) === (bm = bm[0])) {\n if (s[i]) s[i] += bm; else s[++i] = bm;\n } else {\n s[++i] = null;\n q.push({\n i: i,\n x: d3_interpolateNumber(am, bm)\n });\n }\n bi = d3_interpolate_numberB.lastIndex;\n }\n if (bi < b.length) {\n bs = b.slice(bi);\n if (s[i]) s[i] += bs; else s[++i] = bs;\n }\n return s.length < 2 ? q[0] ? (b = q[0].x, function(t) {\n return b(t) + \"\";\n }) : function() {\n return b;\n } : (b = q.length, function(t) {\n for (var i = 0, o; i < b; ++i) s[(o = q[i]).i] = o.x(t);\n return s.join(\"\");\n });\n }\n var d3_interpolate_numberA = /[-+]?(?:\\d+\\.?\\d*|\\.?\\d+)(?:[eE][-+]?\\d+)?/g, d3_interpolate_numberB = new RegExp(d3_interpolate_numberA.source, \"g\");\n d3.interpolate = d3_interpolate;\n function d3_interpolate(a, b) {\n var i = d3.interpolators.length, f;\n while (--i >= 0 && !(f = d3.interpolators[i](a, b))) ;\n return f;\n }\n d3.interpolators = [ function(a, b) {\n var t = typeof b;\n return (t === \"string\" ? d3_rgb_names.has(b.toLowerCase()) || /^(#|rgb\\(|hsl\\()/i.test(b) ? d3_interpolateRgb : d3_interpolateString : b instanceof d3_color ? d3_interpolateRgb : Array.isArray(b) ? d3_interpolateArray : t === \"object\" && isNaN(b) ? d3_interpolateObject : d3_interpolateNumber)(a, b);\n } ];\n d3.interpolateArray = d3_interpolateArray;\n function d3_interpolateArray(a, b) {\n var x = [], c = [], na = a.length, nb = b.length, n0 = Math.min(a.length, b.length), i;\n for (i = 0; i < n0; ++i) x.push(d3_interpolate(a[i], b[i]));\n for (;i < na; ++i) c[i] = a[i];\n for (;i < nb; ++i) c[i] = b[i];\n return function(t) {\n for (i = 0; i < n0; ++i) c[i] = x[i](t);\n return c;\n };\n }\n var d3_ease_default = function() {\n return d3_identity;\n };\n var d3_ease = d3.map({\n linear: d3_ease_default,\n poly: d3_ease_poly,\n quad: function() {\n return d3_ease_quad;\n },\n cubic: function() {\n return d3_ease_cubic;\n },\n sin: function() {\n return d3_ease_sin;\n },\n exp: function() {\n return d3_ease_exp;\n },\n circle: function() {\n return d3_ease_circle;\n },\n elastic: d3_ease_elastic,\n back: d3_ease_back,\n bounce: function() {\n return d3_ease_bounce;\n }\n });\n var d3_ease_mode = d3.map({\n \"in\": d3_identity,\n out: d3_ease_reverse,\n \"in-out\": d3_ease_reflect,\n \"out-in\": function(f) {\n return d3_ease_reflect(d3_ease_reverse(f));\n }\n });\n d3.ease = function(name) {\n var i = name.indexOf(\"-\"), t = i >= 0 ? name.slice(0, i) : name, m = i >= 0 ? name.slice(i + 1) : \"in\";\n t = d3_ease.get(t) || d3_ease_default;\n m = d3_ease_mode.get(m) || d3_identity;\n return d3_ease_clamp(m(t.apply(null, d3_arraySlice.call(arguments, 1))));\n };\n function d3_ease_clamp(f) {\n return function(t) {\n return t <= 0 ? 0 : t >= 1 ? 1 : f(t);\n };\n }\n function d3_ease_reverse(f) {\n return function(t) {\n return 1 - f(1 - t);\n };\n }\n function d3_ease_reflect(f) {\n return function(t) {\n return .5 * (t < .5 ? f(2 * t) : 2 - f(2 - 2 * t));\n };\n }\n function d3_ease_quad(t) {\n return t * t;\n }\n function d3_ease_cubic(t) {\n return t * t * t;\n }\n function d3_ease_cubicInOut(t) {\n if (t <= 0) return 0;\n if (t >= 1) return 1;\n var t2 = t * t, t3 = t2 * t;\n return 4 * (t < .5 ? t3 : 3 * (t - t2) + t3 - .75);\n }\n function d3_ease_poly(e) {\n return function(t) {\n return Math.pow(t, e);\n };\n }\n function d3_ease_sin(t) {\n return 1 - Math.cos(t * halfπ);\n }\n function d3_ease_exp(t) {\n return Math.pow(2, 10 * (t - 1));\n }\n function d3_ease_circle(t) {\n return 1 - Math.sqrt(1 - t * t);\n }\n function d3_ease_elastic(a, p) {\n var s;\n if (arguments.length < 2) p = .45;\n if (arguments.length) s = p / τ * Math.asin(1 / a); else a = 1, s = p / 4;\n return function(t) {\n return 1 + a * Math.pow(2, -10 * t) * Math.sin((t - s) * τ / p);\n };\n }\n function d3_ease_back(s) {\n if (!s) s = 1.70158;\n return function(t) {\n return t * t * ((s + 1) * t - s);\n };\n }\n function d3_ease_bounce(t) {\n return t < 1 / 2.75 ? 7.5625 * t * t : t < 2 / 2.75 ? 7.5625 * (t -= 1.5 / 2.75) * t + .75 : t < 2.5 / 2.75 ? 7.5625 * (t -= 2.25 / 2.75) * t + .9375 : 7.5625 * (t -= 2.625 / 2.75) * t + .984375;\n }\n d3.interpolateHcl = d3_interpolateHcl;\n function d3_interpolateHcl(a, b) {\n a = d3.hcl(a);\n b = d3.hcl(b);\n var ah = a.h, ac = a.c, al = a.l, bh = b.h - ah, bc = b.c - ac, bl = b.l - al;\n if (isNaN(bc)) bc = 0, ac = isNaN(ac) ? b.c : ac;\n if (isNaN(bh)) bh = 0, ah = isNaN(ah) ? b.h : ah; else if (bh > 180) bh -= 360; else if (bh < -180) bh += 360;\n return function(t) {\n return d3_hcl_lab(ah + bh * t, ac + bc * t, al + bl * t) + \"\";\n };\n }\n d3.interpolateHsl = d3_interpolateHsl;\n function d3_interpolateHsl(a, b) {\n a = d3.hsl(a);\n b = d3.hsl(b);\n var ah = a.h, as = a.s, al = a.l, bh = b.h - ah, bs = b.s - as, bl = b.l - al;\n if (isNaN(bs)) bs = 0, as = isNaN(as) ? b.s : as;\n if (isNaN(bh)) bh = 0, ah = isNaN(ah) ? b.h : ah; else if (bh > 180) bh -= 360; else if (bh < -180) bh += 360;\n return function(t) {\n return d3_hsl_rgb(ah + bh * t, as + bs * t, al + bl * t) + \"\";\n };\n }\n d3.interpolateLab = d3_interpolateLab;\n function d3_interpolateLab(a, b) {\n a = d3.lab(a);\n b = d3.lab(b);\n var al = a.l, aa = a.a, ab = a.b, bl = b.l - al, ba = b.a - aa, bb = b.b - ab;\n return function(t) {\n return d3_lab_rgb(al + bl * t, aa + ba * t, ab + bb * t) + \"\";\n };\n }\n d3.interpolateRound = d3_interpolateRound;\n function d3_interpolateRound(a, b) {\n b -= a;\n return function(t) {\n return Math.round(a + b * t);\n };\n }\n d3.transform = function(string) {\n var g = d3_document.createElementNS(d3.ns.prefix.svg, \"g\");\n return (d3.transform = function(string) {\n if (string != null) {\n g.setAttribute(\"transform\", string);\n var t = g.transform.baseVal.consolidate();\n }\n return new d3_transform(t ? t.matrix : d3_transformIdentity);\n })(string);\n };\n function d3_transform(m) {\n var r0 = [ m.a, m.b ], r1 = [ m.c, m.d ], kx = d3_transformNormalize(r0), kz = d3_transformDot(r0, r1), ky = d3_transformNormalize(d3_transformCombine(r1, r0, -kz)) || 0;\n if (r0[0] * r1[1] < r1[0] * r0[1]) {\n r0[0] *= -1;\n r0[1] *= -1;\n kx *= -1;\n kz *= -1;\n }\n this.rotate = (kx ? Math.atan2(r0[1], r0[0]) : Math.atan2(-r1[0], r1[1])) * d3_degrees;\n this.translate = [ m.e, m.f ];\n this.scale = [ kx, ky ];\n this.skew = ky ? Math.atan2(kz, ky) * d3_degrees : 0;\n }\n d3_transform.prototype.toString = function() {\n return \"translate(\" + this.translate + \")rotate(\" + this.rotate + \")skewX(\" + this.skew + \")scale(\" + this.scale + \")\";\n };\n function d3_transformDot(a, b) {\n return a[0] * b[0] + a[1] * b[1];\n }\n function d3_transformNormalize(a) {\n var k = Math.sqrt(d3_transformDot(a, a));\n if (k) {\n a[0] /= k;\n a[1] /= k;\n }\n return k;\n }\n function d3_transformCombine(a, b, k) {\n a[0] += k * b[0];\n a[1] += k * b[1];\n return a;\n }\n var d3_transformIdentity = {\n a: 1,\n b: 0,\n c: 0,\n d: 1,\n e: 0,\n f: 0\n };\n d3.interpolateTransform = d3_interpolateTransform;\n function d3_interpolateTransformPop(s) {\n return s.length ? s.pop() + \",\" : \"\";\n }\n function d3_interpolateTranslate(ta, tb, s, q) {\n if (ta[0] !== tb[0] || ta[1] !== tb[1]) {\n var i = s.push(\"translate(\", null, \",\", null, \")\");\n q.push({\n i: i - 4,\n x: d3_interpolateNumber(ta[0], tb[0])\n }, {\n i: i - 2,\n x: d3_interpolateNumber(ta[1], tb[1])\n });\n } else if (tb[0] || tb[1]) {\n s.push(\"translate(\" + tb + \")\");\n }\n }\n function d3_interpolateRotate(ra, rb, s, q) {\n if (ra !== rb) {\n if (ra - rb > 180) rb += 360; else if (rb - ra > 180) ra += 360;\n q.push({\n i: s.push(d3_interpolateTransformPop(s) + \"rotate(\", null, \")\") - 2,\n x: d3_interpolateNumber(ra, rb)\n });\n } else if (rb) {\n s.push(d3_interpolateTransformPop(s) + \"rotate(\" + rb + \")\");\n }\n }\n function d3_interpolateSkew(wa, wb, s, q) {\n if (wa !== wb) {\n q.push({\n i: s.push(d3_interpolateTransformPop(s) + \"skewX(\", null, \")\") - 2,\n x: d3_interpolateNumber(wa, wb)\n });\n } else if (wb) {\n s.push(d3_interpolateTransformPop(s) + \"skewX(\" + wb + \")\");\n }\n }\n function d3_interpolateScale(ka, kb, s, q) {\n if (ka[0] !== kb[0] || ka[1] !== kb[1]) {\n var i = s.push(d3_interpolateTransformPop(s) + \"scale(\", null, \",\", null, \")\");\n q.push({\n i: i - 4,\n x: d3_interpolateNumber(ka[0], kb[0])\n }, {\n i: i - 2,\n x: d3_interpolateNumber(ka[1], kb[1])\n });\n } else if (kb[0] !== 1 || kb[1] !== 1) {\n s.push(d3_interpolateTransformPop(s) + \"scale(\" + kb + \")\");\n }\n }\n function d3_interpolateTransform(a, b) {\n var s = [], q = [];\n a = d3.transform(a), b = d3.transform(b);\n d3_interpolateTranslate(a.translate, b.translate, s, q);\n d3_interpolateRotate(a.rotate, b.rotate, s, q);\n d3_interpolateSkew(a.skew, b.skew, s, q);\n d3_interpolateScale(a.scale, b.scale, s, q);\n a = b = null;\n return function(t) {\n var i = -1, n = q.length, o;\n while (++i < n) s[(o = q[i]).i] = o.x(t);\n return s.join(\"\");\n };\n }\n function d3_uninterpolateNumber(a, b) {\n b = (b -= a = +a) || 1 / b;\n return function(x) {\n return (x - a) / b;\n };\n }\n function d3_uninterpolateClamp(a, b) {\n b = (b -= a = +a) || 1 / b;\n return function(x) {\n return Math.max(0, Math.min(1, (x - a) / b));\n };\n }\n d3.layout = {};\n d3.layout.bundle = function() {\n return function(links) {\n var paths = [], i = -1, n = links.length;\n while (++i < n) paths.push(d3_layout_bundlePath(links[i]));\n return paths;\n };\n };\n function d3_layout_bundlePath(link) {\n var start = link.source, end = link.target, lca = d3_layout_bundleLeastCommonAncestor(start, end), points = [ start ];\n while (start !== lca) {\n start = start.parent;\n points.push(start);\n }\n var k = points.length;\n while (end !== lca) {\n points.splice(k, 0, end);\n end = end.parent;\n }\n return points;\n }\n function d3_layout_bundleAncestors(node) {\n var ancestors = [], parent = node.parent;\n while (parent != null) {\n ancestors.push(node);\n node = parent;\n parent = parent.parent;\n }\n ancestors.push(node);\n return ancestors;\n }\n function d3_layout_bundleLeastCommonAncestor(a, b) {\n if (a === b) return a;\n var aNodes = d3_layout_bundleAncestors(a), bNodes = d3_layout_bundleAncestors(b), aNode = aNodes.pop(), bNode = bNodes.pop(), sharedNode = null;\n while (aNode === bNode) {\n sharedNode = aNode;\n aNode = aNodes.pop();\n bNode = bNodes.pop();\n }\n return sharedNode;\n }\n d3.layout.chord = function() {\n var chord = {}, chords, groups, matrix, n, padding = 0, sortGroups, sortSubgroups, sortChords;\n function relayout() {\n var subgroups = {}, groupSums = [], groupIndex = d3.range(n), subgroupIndex = [], k, x, x0, i, j;\n chords = [];\n groups = [];\n k = 0, i = -1;\n while (++i < n) {\n x = 0, j = -1;\n while (++j < n) {\n x += matrix[i][j];\n }\n groupSums.push(x);\n subgroupIndex.push(d3.range(n));\n k += x;\n }\n if (sortGroups) {\n groupIndex.sort(function(a, b) {\n return sortGroups(groupSums[a], groupSums[b]);\n });\n }\n if (sortSubgroups) {\n subgroupIndex.forEach(function(d, i) {\n d.sort(function(a, b) {\n return sortSubgroups(matrix[i][a], matrix[i][b]);\n });\n });\n }\n k = (τ - padding * n) / k;\n x = 0, i = -1;\n while (++i < n) {\n x0 = x, j = -1;\n while (++j < n) {\n var di = groupIndex[i], dj = subgroupIndex[di][j], v = matrix[di][dj], a0 = x, a1 = x += v * k;\n subgroups[di + \"-\" + dj] = {\n index: di,\n subindex: dj,\n startAngle: a0,\n endAngle: a1,\n value: v\n };\n }\n groups[di] = {\n index: di,\n startAngle: x0,\n endAngle: x,\n value: groupSums[di]\n };\n x += padding;\n }\n i = -1;\n while (++i < n) {\n j = i - 1;\n while (++j < n) {\n var source = subgroups[i + \"-\" + j], target = subgroups[j + \"-\" + i];\n if (source.value || target.value) {\n chords.push(source.value < target.value ? {\n source: target,\n target: source\n } : {\n source: source,\n target: target\n });\n }\n }\n }\n if (sortChords) resort();\n }\n function resort() {\n chords.sort(function(a, b) {\n return sortChords((a.source.value + a.target.value) / 2, (b.source.value + b.target.value) / 2);\n });\n }\n chord.matrix = function(x) {\n if (!arguments.length) return matrix;\n n = (matrix = x) && matrix.length;\n chords = groups = null;\n return chord;\n };\n chord.padding = function(x) {\n if (!arguments.length) return padding;\n padding = x;\n chords = groups = null;\n return chord;\n };\n chord.sortGroups = function(x) {\n if (!arguments.length) return sortGroups;\n sortGroups = x;\n chords = groups = null;\n return chord;\n };\n chord.sortSubgroups = function(x) {\n if (!arguments.length) return sortSubgroups;\n sortSubgroups = x;\n chords = null;\n return chord;\n };\n chord.sortChords = function(x) {\n if (!arguments.length) return sortChords;\n sortChords = x;\n if (chords) resort();\n return chord;\n };\n chord.chords = function() {\n if (!chords) relayout();\n return chords;\n };\n chord.groups = function() {\n if (!groups) relayout();\n return groups;\n };\n return chord;\n };\n d3.layout.force = function() {\n var force = {}, event = d3.dispatch(\"start\", \"tick\", \"end\"), timer, size = [ 1, 1 ], drag, alpha, friction = .9, linkDistance = d3_layout_forceLinkDistance, linkStrength = d3_layout_forceLinkStrength, charge = -30, chargeDistance2 = d3_layout_forceChargeDistance2, gravity = .1, theta2 = .64, nodes = [], links = [], distances, strengths, charges;\n function repulse(node) {\n return function(quad, x1, _, x2) {\n if (quad.point !== node) {\n var dx = quad.cx - node.x, dy = quad.cy - node.y, dw = x2 - x1, dn = dx * dx + dy * dy;\n if (dw * dw / theta2 < dn) {\n if (dn < chargeDistance2) {\n var k = quad.charge / dn;\n node.px -= dx * k;\n node.py -= dy * k;\n }\n return true;\n }\n if (quad.point && dn && dn < chargeDistance2) {\n var k = quad.pointCharge / dn;\n node.px -= dx * k;\n node.py -= dy * k;\n }\n }\n return !quad.charge;\n };\n }\n force.tick = function() {\n if ((alpha *= .99) < .005) {\n timer = null;\n event.end({\n type: \"end\",\n alpha: alpha = 0\n });\n return true;\n }\n var n = nodes.length, m = links.length, q, i, o, s, t, l, k, x, y;\n for (i = 0; i < m; ++i) {\n o = links[i];\n s = o.source;\n t = o.target;\n x = t.x - s.x;\n y = t.y - s.y;\n if (l = x * x + y * y) {\n l = alpha * strengths[i] * ((l = Math.sqrt(l)) - distances[i]) / l;\n x *= l;\n y *= l;\n t.x -= x * (k = s.weight + t.weight ? s.weight / (s.weight + t.weight) : .5);\n t.y -= y * k;\n s.x += x * (k = 1 - k);\n s.y += y * k;\n }\n }\n if (k = alpha * gravity) {\n x = size[0] / 2;\n y = size[1] / 2;\n i = -1;\n if (k) while (++i < n) {\n o = nodes[i];\n o.x += (x - o.x) * k;\n o.y += (y - o.y) * k;\n }\n }\n if (charge) {\n d3_layout_forceAccumulate(q = d3.geom.quadtree(nodes), alpha, charges);\n i = -1;\n while (++i < n) {\n if (!(o = nodes[i]).fixed) {\n q.visit(repulse(o));\n }\n }\n }\n i = -1;\n while (++i < n) {\n o = nodes[i];\n if (o.fixed) {\n o.x = o.px;\n o.y = o.py;\n } else {\n o.x -= (o.px - (o.px = o.x)) * friction;\n o.y -= (o.py - (o.py = o.y)) * friction;\n }\n }\n event.tick({\n type: \"tick\",\n alpha: alpha\n });\n };\n force.nodes = function(x) {\n if (!arguments.length) return nodes;\n nodes = x;\n return force;\n };\n force.links = function(x) {\n if (!arguments.length) return links;\n links = x;\n return force;\n };\n force.size = function(x) {\n if (!arguments.length) return size;\n size = x;\n return force;\n };\n force.linkDistance = function(x) {\n if (!arguments.length) return linkDistance;\n linkDistance = typeof x === \"function\" ? x : +x;\n return force;\n };\n force.distance = force.linkDistance;\n force.linkStrength = function(x) {\n if (!arguments.length) return linkStrength;\n linkStrength = typeof x === \"function\" ? x : +x;\n return force;\n };\n force.friction = function(x) {\n if (!arguments.length) return friction;\n friction = +x;\n return force;\n };\n force.charge = function(x) {\n if (!arguments.length) return charge;\n charge = typeof x === \"function\" ? x : +x;\n return force;\n };\n force.chargeDistance = function(x) {\n if (!arguments.length) return Math.sqrt(chargeDistance2);\n chargeDistance2 = x * x;\n return force;\n };\n force.gravity = function(x) {\n if (!arguments.length) return gravity;\n gravity = +x;\n return force;\n };\n force.theta = function(x) {\n if (!arguments.length) return Math.sqrt(theta2);\n theta2 = x * x;\n return force;\n };\n force.alpha = function(x) {\n if (!arguments.length) return alpha;\n x = +x;\n if (alpha) {\n if (x > 0) {\n alpha = x;\n } else {\n timer.c = null, timer.t = NaN, timer = null;\n event.end({\n type: \"end\",\n alpha: alpha = 0\n });\n }\n } else if (x > 0) {\n event.start({\n type: \"start\",\n alpha: alpha = x\n });\n timer = d3_timer(force.tick);\n }\n return force;\n };\n force.start = function() {\n var i, n = nodes.length, m = links.length, w = size[0], h = size[1], neighbors, o;\n for (i = 0; i < n; ++i) {\n (o = nodes[i]).index = i;\n o.weight = 0;\n }\n for (i = 0; i < m; ++i) {\n o = links[i];\n if (typeof o.source == \"number\") o.source = nodes[o.source];\n if (typeof o.target == \"number\") o.target = nodes[o.target];\n ++o.source.weight;\n ++o.target.weight;\n }\n for (i = 0; i < n; ++i) {\n o = nodes[i];\n if (isNaN(o.x)) o.x = position(\"x\", w);\n if (isNaN(o.y)) o.y = position(\"y\", h);\n if (isNaN(o.px)) o.px = o.x;\n if (isNaN(o.py)) o.py = o.y;\n }\n distances = [];\n if (typeof linkDistance === \"function\") for (i = 0; i < m; ++i) distances[i] = +linkDistance.call(this, links[i], i); else for (i = 0; i < m; ++i) distances[i] = linkDistance;\n strengths = [];\n if (typeof linkStrength === \"function\") for (i = 0; i < m; ++i) strengths[i] = +linkStrength.call(this, links[i], i); else for (i = 0; i < m; ++i) strengths[i] = linkStrength;\n charges = [];\n if (typeof charge === \"function\") for (i = 0; i < n; ++i) charges[i] = +charge.call(this, nodes[i], i); else for (i = 0; i < n; ++i) charges[i] = charge;\n function position(dimension, size) {\n if (!neighbors) {\n neighbors = new Array(n);\n for (j = 0; j < n; ++j) {\n neighbors[j] = [];\n }\n for (j = 0; j < m; ++j) {\n var o = links[j];\n neighbors[o.source.index].push(o.target);\n neighbors[o.target.index].push(o.source);\n }\n }\n var candidates = neighbors[i], j = -1, l = candidates.length, x;\n while (++j < l) if (!isNaN(x = candidates[j][dimension])) return x;\n return Math.random() * size;\n }\n return force.resume();\n };\n force.resume = function() {\n return force.alpha(.1);\n };\n force.stop = function() {\n return force.alpha(0);\n };\n force.drag = function() {\n if (!drag) drag = d3.behavior.drag().origin(d3_identity).on(\"dragstart.force\", d3_layout_forceDragstart).on(\"drag.force\", dragmove).on(\"dragend.force\", d3_layout_forceDragend);\n if (!arguments.length) return drag;\n this.on(\"mouseover.force\", d3_layout_forceMouseover).on(\"mouseout.force\", d3_layout_forceMouseout).call(drag);\n };\n function dragmove(d) {\n d.px = d3.event.x, d.py = d3.event.y;\n force.resume();\n }\n return d3.rebind(force, event, \"on\");\n };\n function d3_layout_forceDragstart(d) {\n d.fixed |= 2;\n }\n function d3_layout_forceDragend(d) {\n d.fixed &= ~6;\n }\n function d3_layout_forceMouseover(d) {\n d.fixed |= 4;\n d.px = d.x, d.py = d.y;\n }\n function d3_layout_forceMouseout(d) {\n d.fixed &= ~4;\n }\n function d3_layout_forceAccumulate(quad, alpha, charges) {\n var cx = 0, cy = 0;\n quad.charge = 0;\n if (!quad.leaf) {\n var nodes = quad.nodes, n = nodes.length, i = -1, c;\n while (++i < n) {\n c = nodes[i];\n if (c == null) continue;\n d3_layout_forceAccumulate(c, alpha, charges);\n quad.charge += c.charge;\n cx += c.charge * c.cx;\n cy += c.charge * c.cy;\n }\n }\n if (quad.point) {\n if (!quad.leaf) {\n quad.point.x += Math.random() - .5;\n quad.point.y += Math.random() - .5;\n }\n var k = alpha * charges[quad.point.index];\n quad.charge += quad.pointCharge = k;\n cx += k * quad.point.x;\n cy += k * quad.point.y;\n }\n quad.cx = cx / quad.charge;\n quad.cy = cy / quad.charge;\n }\n var d3_layout_forceLinkDistance = 20, d3_layout_forceLinkStrength = 1, d3_layout_forceChargeDistance2 = Infinity;\n d3.layout.hierarchy = function() {\n var sort = d3_layout_hierarchySort, children = d3_layout_hierarchyChildren, value = d3_layout_hierarchyValue;\n function hierarchy(root) {\n var stack = [ root ], nodes = [], node;\n root.depth = 0;\n while ((node = stack.pop()) != null) {\n nodes.push(node);\n if ((childs = children.call(hierarchy, node, node.depth)) && (n = childs.length)) {\n var n, childs, child;\n while (--n >= 0) {\n stack.push(child = childs[n]);\n child.parent = node;\n child.depth = node.depth + 1;\n }\n if (value) node.value = 0;\n node.children = childs;\n } else {\n if (value) node.value = +value.call(hierarchy, node, node.depth) || 0;\n delete node.children;\n }\n }\n d3_layout_hierarchyVisitAfter(root, function(node) {\n var childs, parent;\n if (sort && (childs = node.children)) childs.sort(sort);\n if (value && (parent = node.parent)) parent.value += node.value;\n });\n return nodes;\n }\n hierarchy.sort = function(x) {\n if (!arguments.length) return sort;\n sort = x;\n return hierarchy;\n };\n hierarchy.children = function(x) {\n if (!arguments.length) return children;\n children = x;\n return hierarchy;\n };\n hierarchy.value = function(x) {\n if (!arguments.length) return value;\n value = x;\n return hierarchy;\n };\n hierarchy.revalue = function(root) {\n if (value) {\n d3_layout_hierarchyVisitBefore(root, function(node) {\n if (node.children) node.value = 0;\n });\n d3_layout_hierarchyVisitAfter(root, function(node) {\n var parent;\n if (!node.children) node.value = +value.call(hierarchy, node, node.depth) || 0;\n if (parent = node.parent) parent.value += node.value;\n });\n }\n return root;\n };\n return hierarchy;\n };\n function d3_layout_hierarchyRebind(object, hierarchy) {\n d3.rebind(object, hierarchy, \"sort\", \"children\", \"value\");\n object.nodes = object;\n object.links = d3_layout_hierarchyLinks;\n return object;\n }\n function d3_layout_hierarchyVisitBefore(node, callback) {\n var nodes = [ node ];\n while ((node = nodes.pop()) != null) {\n callback(node);\n if ((children = node.children) && (n = children.length)) {\n var n, children;\n while (--n >= 0) nodes.push(children[n]);\n }\n }\n }\n function d3_layout_hierarchyVisitAfter(node, callback) {\n var nodes = [ node ], nodes2 = [];\n while ((node = nodes.pop()) != null) {\n nodes2.push(node);\n if ((children = node.children) && (n = children.length)) {\n var i = -1, n, children;\n while (++i < n) nodes.push(children[i]);\n }\n }\n while ((node = nodes2.pop()) != null) {\n callback(node);\n }\n }\n function d3_layout_hierarchyChildren(d) {\n return d.children;\n }\n function d3_layout_hierarchyValue(d) {\n return d.value;\n }\n function d3_layout_hierarchySort(a, b) {\n return b.value - a.value;\n }\n function d3_layout_hierarchyLinks(nodes) {\n return d3.merge(nodes.map(function(parent) {\n return (parent.children || []).map(function(child) {\n return {\n source: parent,\n target: child\n };\n });\n }));\n }\n d3.layout.partition = function() {\n var hierarchy = d3.layout.hierarchy(), size = [ 1, 1 ];\n function position(node, x, dx, dy) {\n var children = node.children;\n node.x = x;\n node.y = node.depth * dy;\n node.dx = dx;\n node.dy = dy;\n if (children && (n = children.length)) {\n var i = -1, n, c, d;\n dx = node.value ? dx / node.value : 0;\n while (++i < n) {\n position(c = children[i], x, d = c.value * dx, dy);\n x += d;\n }\n }\n }\n function depth(node) {\n var children = node.children, d = 0;\n if (children && (n = children.length)) {\n var i = -1, n;\n while (++i < n) d = Math.max(d, depth(children[i]));\n }\n return 1 + d;\n }\n function partition(d, i) {\n var nodes = hierarchy.call(this, d, i);\n position(nodes[0], 0, size[0], size[1] / depth(nodes[0]));\n return nodes;\n }\n partition.size = function(x) {\n if (!arguments.length) return size;\n size = x;\n return partition;\n };\n return d3_layout_hierarchyRebind(partition, hierarchy);\n };\n d3.layout.pie = function() {\n var value = Number, sort = d3_layout_pieSortByValue, startAngle = 0, endAngle = τ, padAngle = 0;\n function pie(data) {\n var n = data.length, values = data.map(function(d, i) {\n return +value.call(pie, d, i);\n }), a = +(typeof startAngle === \"function\" ? startAngle.apply(this, arguments) : startAngle), da = (typeof endAngle === \"function\" ? endAngle.apply(this, arguments) : endAngle) - a, p = Math.min(Math.abs(da) / n, +(typeof padAngle === \"function\" ? padAngle.apply(this, arguments) : padAngle)), pa = p * (da < 0 ? -1 : 1), sum = d3.sum(values), k = sum ? (da - n * pa) / sum : 0, index = d3.range(n), arcs = [], v;\n if (sort != null) index.sort(sort === d3_layout_pieSortByValue ? function(i, j) {\n return values[j] - values[i];\n } : function(i, j) {\n return sort(data[i], data[j]);\n });\n index.forEach(function(i) {\n arcs[i] = {\n data: data[i],\n value: v = values[i],\n startAngle: a,\n endAngle: a += v * k + pa,\n padAngle: p\n };\n });\n return arcs;\n }\n pie.value = function(_) {\n if (!arguments.length) return value;\n value = _;\n return pie;\n };\n pie.sort = function(_) {\n if (!arguments.length) return sort;\n sort = _;\n return pie;\n };\n pie.startAngle = function(_) {\n if (!arguments.length) return startAngle;\n startAngle = _;\n return pie;\n };\n pie.endAngle = function(_) {\n if (!arguments.length) return endAngle;\n endAngle = _;\n return pie;\n };\n pie.padAngle = function(_) {\n if (!arguments.length) return padAngle;\n padAngle = _;\n return pie;\n };\n return pie;\n };\n var d3_layout_pieSortByValue = {};\n d3.layout.stack = function() {\n var values = d3_identity, order = d3_layout_stackOrderDefault, offset = d3_layout_stackOffsetZero, out = d3_layout_stackOut, x = d3_layout_stackX, y = d3_layout_stackY;\n function stack(data, index) {\n if (!(n = data.length)) return data;\n var series = data.map(function(d, i) {\n return values.call(stack, d, i);\n });\n var points = series.map(function(d) {\n return d.map(function(v, i) {\n return [ x.call(stack, v, i), y.call(stack, v, i) ];\n });\n });\n var orders = order.call(stack, points, index);\n series = d3.permute(series, orders);\n points = d3.permute(points, orders);\n var offsets = offset.call(stack, points, index);\n var m = series[0].length, n, i, j, o;\n for (j = 0; j < m; ++j) {\n out.call(stack, series[0][j], o = offsets[j], points[0][j][1]);\n for (i = 1; i < n; ++i) {\n out.call(stack, series[i][j], o += points[i - 1][j][1], points[i][j][1]);\n }\n }\n return data;\n }\n stack.values = function(x) {\n if (!arguments.length) return values;\n values = x;\n return stack;\n };\n stack.order = function(x) {\n if (!arguments.length) return order;\n order = typeof x === \"function\" ? x : d3_layout_stackOrders.get(x) || d3_layout_stackOrderDefault;\n return stack;\n };\n stack.offset = function(x) {\n if (!arguments.length) return offset;\n offset = typeof x === \"function\" ? x : d3_layout_stackOffsets.get(x) || d3_layout_stackOffsetZero;\n return stack;\n };\n stack.x = function(z) {\n if (!arguments.length) return x;\n x = z;\n return stack;\n };\n stack.y = function(z) {\n if (!arguments.length) return y;\n y = z;\n return stack;\n };\n stack.out = function(z) {\n if (!arguments.length) return out;\n out = z;\n return stack;\n };\n return stack;\n };\n function d3_layout_stackX(d) {\n return d.x;\n }\n function d3_layout_stackY(d) {\n return d.y;\n }\n function d3_layout_stackOut(d, y0, y) {\n d.y0 = y0;\n d.y = y;\n }\n var d3_layout_stackOrders = d3.map({\n \"inside-out\": function(data) {\n var n = data.length, i, j, max = data.map(d3_layout_stackMaxIndex), sums = data.map(d3_layout_stackReduceSum), index = d3.range(n).sort(function(a, b) {\n return max[a] - max[b];\n }), top = 0, bottom = 0, tops = [], bottoms = [];\n for (i = 0; i < n; ++i) {\n j = index[i];\n if (top < bottom) {\n top += sums[j];\n tops.push(j);\n } else {\n bottom += sums[j];\n bottoms.push(j);\n }\n }\n return bottoms.reverse().concat(tops);\n },\n reverse: function(data) {\n return d3.range(data.length).reverse();\n },\n \"default\": d3_layout_stackOrderDefault\n });\n var d3_layout_stackOffsets = d3.map({\n silhouette: function(data) {\n var n = data.length, m = data[0].length, sums = [], max = 0, i, j, o, y0 = [];\n for (j = 0; j < m; ++j) {\n for (i = 0, o = 0; i < n; i++) o += data[i][j][1];\n if (o > max) max = o;\n sums.push(o);\n }\n for (j = 0; j < m; ++j) {\n y0[j] = (max - sums[j]) / 2;\n }\n return y0;\n },\n wiggle: function(data) {\n var n = data.length, x = data[0], m = x.length, i, j, k, s1, s2, s3, dx, o, o0, y0 = [];\n y0[0] = o = o0 = 0;\n for (j = 1; j < m; ++j) {\n for (i = 0, s1 = 0; i < n; ++i) s1 += data[i][j][1];\n for (i = 0, s2 = 0, dx = x[j][0] - x[j - 1][0]; i < n; ++i) {\n for (k = 0, s3 = (data[i][j][1] - data[i][j - 1][1]) / (2 * dx); k < i; ++k) {\n s3 += (data[k][j][1] - data[k][j - 1][1]) / dx;\n }\n s2 += s3 * data[i][j][1];\n }\n y0[j] = o -= s1 ? s2 / s1 * dx : 0;\n if (o < o0) o0 = o;\n }\n for (j = 0; j < m; ++j) y0[j] -= o0;\n return y0;\n },\n expand: function(data) {\n var n = data.length, m = data[0].length, k = 1 / n, i, j, o, y0 = [];\n for (j = 0; j < m; ++j) {\n for (i = 0, o = 0; i < n; i++) o += data[i][j][1];\n if (o) for (i = 0; i < n; i++) data[i][j][1] /= o; else for (i = 0; i < n; i++) data[i][j][1] = k;\n }\n for (j = 0; j < m; ++j) y0[j] = 0;\n return y0;\n },\n zero: d3_layout_stackOffsetZero\n });\n function d3_layout_stackOrderDefault(data) {\n return d3.range(data.length);\n }\n function d3_layout_stackOffsetZero(data) {\n var j = -1, m = data[0].length, y0 = [];\n while (++j < m) y0[j] = 0;\n return y0;\n }\n function d3_layout_stackMaxIndex(array) {\n var i = 1, j = 0, v = array[0][1], k, n = array.length;\n for (;i < n; ++i) {\n if ((k = array[i][1]) > v) {\n j = i;\n v = k;\n }\n }\n return j;\n }\n function d3_layout_stackReduceSum(d) {\n return d.reduce(d3_layout_stackSum, 0);\n }\n function d3_layout_stackSum(p, d) {\n return p + d[1];\n }\n d3.layout.histogram = function() {\n var frequency = true, valuer = Number, ranger = d3_layout_histogramRange, binner = d3_layout_histogramBinSturges;\n function histogram(data, i) {\n var bins = [], values = data.map(valuer, this), range = ranger.call(this, values, i), thresholds = binner.call(this, range, values, i), bin, i = -1, n = values.length, m = thresholds.length - 1, k = frequency ? 1 : 1 / n, x;\n while (++i < m) {\n bin = bins[i] = [];\n bin.dx = thresholds[i + 1] - (bin.x = thresholds[i]);\n bin.y = 0;\n }\n if (m > 0) {\n i = -1;\n while (++i < n) {\n x = values[i];\n if (x >= range[0] && x <= range[1]) {\n bin = bins[d3.bisect(thresholds, x, 1, m) - 1];\n bin.y += k;\n bin.push(data[i]);\n }\n }\n }\n return bins;\n }\n histogram.value = function(x) {\n if (!arguments.length) return valuer;\n valuer = x;\n return histogram;\n };\n histogram.range = function(x) {\n if (!arguments.length) return ranger;\n ranger = d3_functor(x);\n return histogram;\n };\n histogram.bins = function(x) {\n if (!arguments.length) return binner;\n binner = typeof x === \"number\" ? function(range) {\n return d3_layout_histogramBinFixed(range, x);\n } : d3_functor(x);\n return histogram;\n };\n histogram.frequency = function(x) {\n if (!arguments.length) return frequency;\n frequency = !!x;\n return histogram;\n };\n return histogram;\n };\n function d3_layout_histogramBinSturges(range, values) {\n return d3_layout_histogramBinFixed(range, Math.ceil(Math.log(values.length) / Math.LN2 + 1));\n }\n function d3_layout_histogramBinFixed(range, n) {\n var x = -1, b = +range[0], m = (range[1] - b) / n, f = [];\n while (++x <= n) f[x] = m * x + b;\n return f;\n }\n function d3_layout_histogramRange(values) {\n return [ d3.min(values), d3.max(values) ];\n }\n d3.layout.pack = function() {\n var hierarchy = d3.layout.hierarchy().sort(d3_layout_packSort), padding = 0, size = [ 1, 1 ], radius;\n function pack(d, i) {\n var nodes = hierarchy.call(this, d, i), root = nodes[0], w = size[0], h = size[1], r = radius == null ? Math.sqrt : typeof radius === \"function\" ? radius : function() {\n return radius;\n };\n root.x = root.y = 0;\n d3_layout_hierarchyVisitAfter(root, function(d) {\n d.r = +r(d.value);\n });\n d3_layout_hierarchyVisitAfter(root, d3_layout_packSiblings);\n if (padding) {\n var dr = padding * (radius ? 1 : Math.max(2 * root.r / w, 2 * root.r / h)) / 2;\n d3_layout_hierarchyVisitAfter(root, function(d) {\n d.r += dr;\n });\n d3_layout_hierarchyVisitAfter(root, d3_layout_packSiblings);\n d3_layout_hierarchyVisitAfter(root, function(d) {\n d.r -= dr;\n });\n }\n d3_layout_packTransform(root, w / 2, h / 2, radius ? 1 : 1 / Math.max(2 * root.r / w, 2 * root.r / h));\n return nodes;\n }\n pack.size = function(_) {\n if (!arguments.length) return size;\n size = _;\n return pack;\n };\n pack.radius = function(_) {\n if (!arguments.length) return radius;\n radius = _ == null || typeof _ === \"function\" ? _ : +_;\n return pack;\n };\n pack.padding = function(_) {\n if (!arguments.length) return padding;\n padding = +_;\n return pack;\n };\n return d3_layout_hierarchyRebind(pack, hierarchy);\n };\n function d3_layout_packSort(a, b) {\n return a.value - b.value;\n }\n function d3_layout_packInsert(a, b) {\n var c = a._pack_next;\n a._pack_next = b;\n b._pack_prev = a;\n b._pack_next = c;\n c._pack_prev = b;\n }\n function d3_layout_packSplice(a, b) {\n a._pack_next = b;\n b._pack_prev = a;\n }\n function d3_layout_packIntersects(a, b) {\n var dx = b.x - a.x, dy = b.y - a.y, dr = a.r + b.r;\n return .999 * dr * dr > dx * dx + dy * dy;\n }\n function d3_layout_packSiblings(node) {\n if (!(nodes = node.children) || !(n = nodes.length)) return;\n var nodes, xMin = Infinity, xMax = -Infinity, yMin = Infinity, yMax = -Infinity, a, b, c, i, j, k, n;\n function bound(node) {\n xMin = Math.min(node.x - node.r, xMin);\n xMax = Math.max(node.x + node.r, xMax);\n yMin = Math.min(node.y - node.r, yMin);\n yMax = Math.max(node.y + node.r, yMax);\n }\n nodes.forEach(d3_layout_packLink);\n a = nodes[0];\n a.x = -a.r;\n a.y = 0;\n bound(a);\n if (n > 1) {\n b = nodes[1];\n b.x = b.r;\n b.y = 0;\n bound(b);\n if (n > 2) {\n c = nodes[2];\n d3_layout_packPlace(a, b, c);\n bound(c);\n d3_layout_packInsert(a, c);\n a._pack_prev = c;\n d3_layout_packInsert(c, b);\n b = a._pack_next;\n for (i = 3; i < n; i++) {\n d3_layout_packPlace(a, b, c = nodes[i]);\n var isect = 0, s1 = 1, s2 = 1;\n for (j = b._pack_next; j !== b; j = j._pack_next, s1++) {\n if (d3_layout_packIntersects(j, c)) {\n isect = 1;\n break;\n }\n }\n if (isect == 1) {\n for (k = a._pack_prev; k !== j._pack_prev; k = k._pack_prev, s2++) {\n if (d3_layout_packIntersects(k, c)) {\n break;\n }\n }\n }\n if (isect) {\n if (s1 < s2 || s1 == s2 && b.r < a.r) d3_layout_packSplice(a, b = j); else d3_layout_packSplice(a = k, b);\n i--;\n } else {\n d3_layout_packInsert(a, c);\n b = c;\n bound(c);\n }\n }\n }\n }\n var cx = (xMin + xMax) / 2, cy = (yMin + yMax) / 2, cr = 0;\n for (i = 0; i < n; i++) {\n c = nodes[i];\n c.x -= cx;\n c.y -= cy;\n cr = Math.max(cr, c.r + Math.sqrt(c.x * c.x + c.y * c.y));\n }\n node.r = cr;\n nodes.forEach(d3_layout_packUnlink);\n }\n function d3_layout_packLink(node) {\n node._pack_next = node._pack_prev = node;\n }\n function d3_layout_packUnlink(node) {\n delete node._pack_next;\n delete node._pack_prev;\n }\n function d3_layout_packTransform(node, x, y, k) {\n var children = node.children;\n node.x = x += k * node.x;\n node.y = y += k * node.y;\n node.r *= k;\n if (children) {\n var i = -1, n = children.length;\n while (++i < n) d3_layout_packTransform(children[i], x, y, k);\n }\n }\n function d3_layout_packPlace(a, b, c) {\n var db = a.r + c.r, dx = b.x - a.x, dy = b.y - a.y;\n if (db && (dx || dy)) {\n var da = b.r + c.r, dc = dx * dx + dy * dy;\n da *= da;\n db *= db;\n var x = .5 + (db - da) / (2 * dc), y = Math.sqrt(Math.max(0, 2 * da * (db + dc) - (db -= dc) * db - da * da)) / (2 * dc);\n c.x = a.x + x * dx + y * dy;\n c.y = a.y + x * dy - y * dx;\n } else {\n c.x = a.x + db;\n c.y = a.y;\n }\n }\n d3.layout.tree = function() {\n var hierarchy = d3.layout.hierarchy().sort(null).value(null), separation = d3_layout_treeSeparation, size = [ 1, 1 ], nodeSize = null;\n function tree(d, i) {\n var nodes = hierarchy.call(this, d, i), root0 = nodes[0], root1 = wrapTree(root0);\n d3_layout_hierarchyVisitAfter(root1, firstWalk), root1.parent.m = -root1.z;\n d3_layout_hierarchyVisitBefore(root1, secondWalk);\n if (nodeSize) d3_layout_hierarchyVisitBefore(root0, sizeNode); else {\n var left = root0, right = root0, bottom = root0;\n d3_layout_hierarchyVisitBefore(root0, function(node) {\n if (node.x < left.x) left = node;\n if (node.x > right.x) right = node;\n if (node.depth > bottom.depth) bottom = node;\n });\n var tx = separation(left, right) / 2 - left.x, kx = size[0] / (right.x + separation(right, left) / 2 + tx), ky = size[1] / (bottom.depth || 1);\n d3_layout_hierarchyVisitBefore(root0, function(node) {\n node.x = (node.x + tx) * kx;\n node.y = node.depth * ky;\n });\n }\n return nodes;\n }\n function wrapTree(root0) {\n var root1 = {\n A: null,\n children: [ root0 ]\n }, queue = [ root1 ], node1;\n while ((node1 = queue.pop()) != null) {\n for (var children = node1.children, child, i = 0, n = children.length; i < n; ++i) {\n queue.push((children[i] = child = {\n _: children[i],\n parent: node1,\n children: (child = children[i].children) && child.slice() || [],\n A: null,\n a: null,\n z: 0,\n m: 0,\n c: 0,\n s: 0,\n t: null,\n i: i\n }).a = child);\n }\n }\n return root1.children[0];\n }\n function firstWalk(v) {\n var children = v.children, siblings = v.parent.children, w = v.i ? siblings[v.i - 1] : null;\n if (children.length) {\n d3_layout_treeShift(v);\n var midpoint = (children[0].z + children[children.length - 1].z) / 2;\n if (w) {\n v.z = w.z + separation(v._, w._);\n v.m = v.z - midpoint;\n } else {\n v.z = midpoint;\n }\n } else if (w) {\n v.z = w.z + separation(v._, w._);\n }\n v.parent.A = apportion(v, w, v.parent.A || siblings[0]);\n }\n function secondWalk(v) {\n v._.x = v.z + v.parent.m;\n v.m += v.parent.m;\n }\n function apportion(v, w, ancestor) {\n if (w) {\n var vip = v, vop = v, vim = w, vom = vip.parent.children[0], sip = vip.m, sop = vop.m, sim = vim.m, som = vom.m, shift;\n while (vim = d3_layout_treeRight(vim), vip = d3_layout_treeLeft(vip), vim && vip) {\n vom = d3_layout_treeLeft(vom);\n vop = d3_layout_treeRight(vop);\n vop.a = v;\n shift = vim.z + sim - vip.z - sip + separation(vim._, vip._);\n if (shift > 0) {\n d3_layout_treeMove(d3_layout_treeAncestor(vim, v, ancestor), v, shift);\n sip += shift;\n sop += shift;\n }\n sim += vim.m;\n sip += vip.m;\n som += vom.m;\n sop += vop.m;\n }\n if (vim && !d3_layout_treeRight(vop)) {\n vop.t = vim;\n vop.m += sim - sop;\n }\n if (vip && !d3_layout_treeLeft(vom)) {\n vom.t = vip;\n vom.m += sip - som;\n ancestor = v;\n }\n }\n return ancestor;\n }\n function sizeNode(node) {\n node.x *= size[0];\n node.y = node.depth * size[1];\n }\n tree.separation = function(x) {\n if (!arguments.length) return separation;\n separation = x;\n return tree;\n };\n tree.size = function(x) {\n if (!arguments.length) return nodeSize ? null : size;\n nodeSize = (size = x) == null ? sizeNode : null;\n return tree;\n };\n tree.nodeSize = function(x) {\n if (!arguments.length) return nodeSize ? size : null;\n nodeSize = (size = x) == null ? null : sizeNode;\n return tree;\n };\n return d3_layout_hierarchyRebind(tree, hierarchy);\n };\n function d3_layout_treeSeparation(a, b) {\n return a.parent == b.parent ? 1 : 2;\n }\n function d3_layout_treeLeft(v) {\n var children = v.children;\n return children.length ? children[0] : v.t;\n }\n function d3_layout_treeRight(v) {\n var children = v.children, n;\n return (n = children.length) ? children[n - 1] : v.t;\n }\n function d3_layout_treeMove(wm, wp, shift) {\n var change = shift / (wp.i - wm.i);\n wp.c -= change;\n wp.s += shift;\n wm.c += change;\n wp.z += shift;\n wp.m += shift;\n }\n function d3_layout_treeShift(v) {\n var shift = 0, change = 0, children = v.children, i = children.length, w;\n while (--i >= 0) {\n w = children[i];\n w.z += shift;\n w.m += shift;\n shift += w.s + (change += w.c);\n }\n }\n function d3_layout_treeAncestor(vim, v, ancestor) {\n return vim.a.parent === v.parent ? vim.a : ancestor;\n }\n d3.layout.cluster = function() {\n var hierarchy = d3.layout.hierarchy().sort(null).value(null), separation = d3_layout_treeSeparation, size = [ 1, 1 ], nodeSize = false;\n function cluster(d, i) {\n var nodes = hierarchy.call(this, d, i), root = nodes[0], previousNode, x = 0;\n d3_layout_hierarchyVisitAfter(root, function(node) {\n var children = node.children;\n if (children && children.length) {\n node.x = d3_layout_clusterX(children);\n node.y = d3_layout_clusterY(children);\n } else {\n node.x = previousNode ? x += separation(node, previousNode) : 0;\n node.y = 0;\n previousNode = node;\n }\n });\n var left = d3_layout_clusterLeft(root), right = d3_layout_clusterRight(root), x0 = left.x - separation(left, right) / 2, x1 = right.x + separation(right, left) / 2;\n d3_layout_hierarchyVisitAfter(root, nodeSize ? function(node) {\n node.x = (node.x - root.x) * size[0];\n node.y = (root.y - node.y) * size[1];\n } : function(node) {\n node.x = (node.x - x0) / (x1 - x0) * size[0];\n node.y = (1 - (root.y ? node.y / root.y : 1)) * size[1];\n });\n return nodes;\n }\n cluster.separation = function(x) {\n if (!arguments.length) return separation;\n separation = x;\n return cluster;\n };\n cluster.size = function(x) {\n if (!arguments.length) return nodeSize ? null : size;\n nodeSize = (size = x) == null;\n return cluster;\n };\n cluster.nodeSize = function(x) {\n if (!arguments.length) return nodeSize ? size : null;\n nodeSize = (size = x) != null;\n return cluster;\n };\n return d3_layout_hierarchyRebind(cluster, hierarchy);\n };\n function d3_layout_clusterY(children) {\n return 1 + d3.max(children, function(child) {\n return child.y;\n });\n }\n function d3_layout_clusterX(children) {\n return children.reduce(function(x, child) {\n return x + child.x;\n }, 0) / children.length;\n }\n function d3_layout_clusterLeft(node) {\n var children = node.children;\n return children && children.length ? d3_layout_clusterLeft(children[0]) : node;\n }\n function d3_layout_clusterRight(node) {\n var children = node.children, n;\n return children && (n = children.length) ? d3_layout_clusterRight(children[n - 1]) : node;\n }\n d3.layout.treemap = function() {\n var hierarchy = d3.layout.hierarchy(), round = Math.round, size = [ 1, 1 ], padding = null, pad = d3_layout_treemapPadNull, sticky = false, stickies, mode = \"squarify\", ratio = .5 * (1 + Math.sqrt(5));\n function scale(children, k) {\n var i = -1, n = children.length, child, area;\n while (++i < n) {\n area = (child = children[i]).value * (k < 0 ? 0 : k);\n child.area = isNaN(area) || area <= 0 ? 0 : area;\n }\n }\n function squarify(node) {\n var children = node.children;\n if (children && children.length) {\n var rect = pad(node), row = [], remaining = children.slice(), child, best = Infinity, score, u = mode === \"slice\" ? rect.dx : mode === \"dice\" ? rect.dy : mode === \"slice-dice\" ? node.depth & 1 ? rect.dy : rect.dx : Math.min(rect.dx, rect.dy), n;\n scale(remaining, rect.dx * rect.dy / node.value);\n row.area = 0;\n while ((n = remaining.length) > 0) {\n row.push(child = remaining[n - 1]);\n row.area += child.area;\n if (mode !== \"squarify\" || (score = worst(row, u)) <= best) {\n remaining.pop();\n best = score;\n } else {\n row.area -= row.pop().area;\n position(row, u, rect, false);\n u = Math.min(rect.dx, rect.dy);\n row.length = row.area = 0;\n best = Infinity;\n }\n }\n if (row.length) {\n position(row, u, rect, true);\n row.length = row.area = 0;\n }\n children.forEach(squarify);\n }\n }\n function stickify(node) {\n var children = node.children;\n if (children && children.length) {\n var rect = pad(node), remaining = children.slice(), child, row = [];\n scale(remaining, rect.dx * rect.dy / node.value);\n row.area = 0;\n while (child = remaining.pop()) {\n row.push(child);\n row.area += child.area;\n if (child.z != null) {\n position(row, child.z ? rect.dx : rect.dy, rect, !remaining.length);\n row.length = row.area = 0;\n }\n }\n children.forEach(stickify);\n }\n }\n function worst(row, u) {\n var s = row.area, r, rmax = 0, rmin = Infinity, i = -1, n = row.length;\n while (++i < n) {\n if (!(r = row[i].area)) continue;\n if (r < rmin) rmin = r;\n if (r > rmax) rmax = r;\n }\n s *= s;\n u *= u;\n return s ? Math.max(u * rmax * ratio / s, s / (u * rmin * ratio)) : Infinity;\n }\n function position(row, u, rect, flush) {\n var i = -1, n = row.length, x = rect.x, y = rect.y, v = u ? round(row.area / u) : 0, o;\n if (u == rect.dx) {\n if (flush || v > rect.dy) v = rect.dy;\n while (++i < n) {\n o = row[i];\n o.x = x;\n o.y = y;\n o.dy = v;\n x += o.dx = Math.min(rect.x + rect.dx - x, v ? round(o.area / v) : 0);\n }\n o.z = true;\n o.dx += rect.x + rect.dx - x;\n rect.y += v;\n rect.dy -= v;\n } else {\n if (flush || v > rect.dx) v = rect.dx;\n while (++i < n) {\n o = row[i];\n o.x = x;\n o.y = y;\n o.dx = v;\n y += o.dy = Math.min(rect.y + rect.dy - y, v ? round(o.area / v) : 0);\n }\n o.z = false;\n o.dy += rect.y + rect.dy - y;\n rect.x += v;\n rect.dx -= v;\n }\n }\n function treemap(d) {\n var nodes = stickies || hierarchy(d), root = nodes[0];\n root.x = root.y = 0;\n if (root.value) root.dx = size[0], root.dy = size[1]; else root.dx = root.dy = 0;\n if (stickies) hierarchy.revalue(root);\n scale([ root ], root.dx * root.dy / root.value);\n (stickies ? stickify : squarify)(root);\n if (sticky) stickies = nodes;\n return nodes;\n }\n treemap.size = function(x) {\n if (!arguments.length) return size;\n size = x;\n return treemap;\n };\n treemap.padding = function(x) {\n if (!arguments.length) return padding;\n function padFunction(node) {\n var p = x.call(treemap, node, node.depth);\n return p == null ? d3_layout_treemapPadNull(node) : d3_layout_treemapPad(node, typeof p === \"number\" ? [ p, p, p, p ] : p);\n }\n function padConstant(node) {\n return d3_layout_treemapPad(node, x);\n }\n var type;\n pad = (padding = x) == null ? d3_layout_treemapPadNull : (type = typeof x) === \"function\" ? padFunction : type === \"number\" ? (x = [ x, x, x, x ], \n padConstant) : padConstant;\n return treemap;\n };\n treemap.round = function(x) {\n if (!arguments.length) return round != Number;\n round = x ? Math.round : Number;\n return treemap;\n };\n treemap.sticky = function(x) {\n if (!arguments.length) return sticky;\n sticky = x;\n stickies = null;\n return treemap;\n };\n treemap.ratio = function(x) {\n if (!arguments.length) return ratio;\n ratio = x;\n return treemap;\n };\n treemap.mode = function(x) {\n if (!arguments.length) return mode;\n mode = x + \"\";\n return treemap;\n };\n return d3_layout_hierarchyRebind(treemap, hierarchy);\n };\n function d3_layout_treemapPadNull(node) {\n return {\n x: node.x,\n y: node.y,\n dx: node.dx,\n dy: node.dy\n };\n }\n function d3_layout_treemapPad(node, padding) {\n var x = node.x + padding[3], y = node.y + padding[0], dx = node.dx - padding[1] - padding[3], dy = node.dy - padding[0] - padding[2];\n if (dx < 0) {\n x += dx / 2;\n dx = 0;\n }\n if (dy < 0) {\n y += dy / 2;\n dy = 0;\n }\n return {\n x: x,\n y: y,\n dx: dx,\n dy: dy\n };\n }\n d3.random = {\n normal: function(µ, σ) {\n var n = arguments.length;\n if (n < 2) σ = 1;\n if (n < 1) µ = 0;\n return function() {\n var x, y, r;\n do {\n x = Math.random() * 2 - 1;\n y = Math.random() * 2 - 1;\n r = x * x + y * y;\n } while (!r || r > 1);\n return µ + σ * x * Math.sqrt(-2 * Math.log(r) / r);\n };\n },\n logNormal: function() {\n var random = d3.random.normal.apply(d3, arguments);\n return function() {\n return Math.exp(random());\n };\n },\n bates: function(m) {\n var random = d3.random.irwinHall(m);\n return function() {\n return random() / m;\n };\n },\n irwinHall: function(m) {\n return function() {\n for (var s = 0, j = 0; j < m; j++) s += Math.random();\n return s;\n };\n }\n };\n d3.scale = {};\n function d3_scaleExtent(domain) {\n var start = domain[0], stop = domain[domain.length - 1];\n return start < stop ? [ start, stop ] : [ stop, start ];\n }\n function d3_scaleRange(scale) {\n return scale.rangeExtent ? scale.rangeExtent() : d3_scaleExtent(scale.range());\n }\n function d3_scale_bilinear(domain, range, uninterpolate, interpolate) {\n var u = uninterpolate(domain[0], domain[1]), i = interpolate(range[0], range[1]);\n return function(x) {\n return i(u(x));\n };\n }\n function d3_scale_nice(domain, nice) {\n var i0 = 0, i1 = domain.length - 1, x0 = domain[i0], x1 = domain[i1], dx;\n if (x1 < x0) {\n dx = i0, i0 = i1, i1 = dx;\n dx = x0, x0 = x1, x1 = dx;\n }\n domain[i0] = nice.floor(x0);\n domain[i1] = nice.ceil(x1);\n return domain;\n }\n function d3_scale_niceStep(step) {\n return step ? {\n floor: function(x) {\n return Math.floor(x / step) * step;\n },\n ceil: function(x) {\n return Math.ceil(x / step) * step;\n }\n } : d3_scale_niceIdentity;\n }\n var d3_scale_niceIdentity = {\n floor: d3_identity,\n ceil: d3_identity\n };\n function d3_scale_polylinear(domain, range, uninterpolate, interpolate) {\n var u = [], i = [], j = 0, k = Math.min(domain.length, range.length) - 1;\n if (domain[k] < domain[0]) {\n domain = domain.slice().reverse();\n range = range.slice().reverse();\n }\n while (++j <= k) {\n u.push(uninterpolate(domain[j - 1], domain[j]));\n i.push(interpolate(range[j - 1], range[j]));\n }\n return function(x) {\n var j = d3.bisect(domain, x, 1, k) - 1;\n return i[j](u[j](x));\n };\n }\n d3.scale.linear = function() {\n return d3_scale_linear([ 0, 1 ], [ 0, 1 ], d3_interpolate, false);\n };\n function d3_scale_linear(domain, range, interpolate, clamp) {\n var output, input;\n function rescale() {\n var linear = Math.min(domain.length, range.length) > 2 ? d3_scale_polylinear : d3_scale_bilinear, uninterpolate = clamp ? d3_uninterpolateClamp : d3_uninterpolateNumber;\n output = linear(domain, range, uninterpolate, interpolate);\n input = linear(range, domain, uninterpolate, d3_interpolate);\n return scale;\n }\n function scale(x) {\n return output(x);\n }\n scale.invert = function(y) {\n return input(y);\n };\n scale.domain = function(x) {\n if (!arguments.length) return domain;\n domain = x.map(Number);\n return rescale();\n };\n scale.range = function(x) {\n if (!arguments.length) return range;\n range = x;\n return rescale();\n };\n scale.rangeRound = function(x) {\n return scale.range(x).interpolate(d3_interpolateRound);\n };\n scale.clamp = function(x) {\n if (!arguments.length) return clamp;\n clamp = x;\n return rescale();\n };\n scale.interpolate = function(x) {\n if (!arguments.length) return interpolate;\n interpolate = x;\n return rescale();\n };\n scale.ticks = function(m) {\n return d3_scale_linearTicks(domain, m);\n };\n scale.tickFormat = function(m, format) {\n return d3_scale_linearTickFormat(domain, m, format);\n };\n scale.nice = function(m) {\n d3_scale_linearNice(domain, m);\n return rescale();\n };\n scale.copy = function() {\n return d3_scale_linear(domain, range, interpolate, clamp);\n };\n return rescale();\n }\n function d3_scale_linearRebind(scale, linear) {\n return d3.rebind(scale, linear, \"range\", \"rangeRound\", \"interpolate\", \"clamp\");\n }\n function d3_scale_linearNice(domain, m) {\n d3_scale_nice(domain, d3_scale_niceStep(d3_scale_linearTickRange(domain, m)[2]));\n d3_scale_nice(domain, d3_scale_niceStep(d3_scale_linearTickRange(domain, m)[2]));\n return domain;\n }\n function d3_scale_linearTickRange(domain, m) {\n if (m == null) m = 10;\n var extent = d3_scaleExtent(domain), span = extent[1] - extent[0], step = Math.pow(10, Math.floor(Math.log(span / m) / Math.LN10)), err = m / span * step;\n if (err <= .15) step *= 10; else if (err <= .35) step *= 5; else if (err <= .75) step *= 2;\n extent[0] = Math.ceil(extent[0] / step) * step;\n extent[1] = Math.floor(extent[1] / step) * step + step * .5;\n extent[2] = step;\n return extent;\n }\n function d3_scale_linearTicks(domain, m) {\n return d3.range.apply(d3, d3_scale_linearTickRange(domain, m));\n }\n function d3_scale_linearTickFormat(domain, m, format) {\n var range = d3_scale_linearTickRange(domain, m);\n if (format) {\n var match = d3_format_re.exec(format);\n match.shift();\n if (match[8] === \"s\") {\n var prefix = d3.formatPrefix(Math.max(abs(range[0]), abs(range[1])));\n if (!match[7]) match[7] = \".\" + d3_scale_linearPrecision(prefix.scale(range[2]));\n match[8] = \"f\";\n format = d3.format(match.join(\"\"));\n return function(d) {\n return format(prefix.scale(d)) + prefix.symbol;\n };\n }\n if (!match[7]) match[7] = \".\" + d3_scale_linearFormatPrecision(match[8], range);\n format = match.join(\"\");\n } else {\n format = \",.\" + d3_scale_linearPrecision(range[2]) + \"f\";\n }\n return d3.format(format);\n }\n var d3_scale_linearFormatSignificant = {\n s: 1,\n g: 1,\n p: 1,\n r: 1,\n e: 1\n };\n function d3_scale_linearPrecision(value) {\n return -Math.floor(Math.log(value) / Math.LN10 + .01);\n }\n function d3_scale_linearFormatPrecision(type, range) {\n var p = d3_scale_linearPrecision(range[2]);\n return type in d3_scale_linearFormatSignificant ? Math.abs(p - d3_scale_linearPrecision(Math.max(abs(range[0]), abs(range[1])))) + +(type !== \"e\") : p - (type === \"%\") * 2;\n }\n d3.scale.log = function() {\n return d3_scale_log(d3.scale.linear().domain([ 0, 1 ]), 10, true, [ 1, 10 ]);\n };\n function d3_scale_log(linear, base, positive, domain) {\n function log(x) {\n return (positive ? Math.log(x < 0 ? 0 : x) : -Math.log(x > 0 ? 0 : -x)) / Math.log(base);\n }\n function pow(x) {\n return positive ? Math.pow(base, x) : -Math.pow(base, -x);\n }\n function scale(x) {\n return linear(log(x));\n }\n scale.invert = function(x) {\n return pow(linear.invert(x));\n };\n scale.domain = function(x) {\n if (!arguments.length) return domain;\n positive = x[0] >= 0;\n linear.domain((domain = x.map(Number)).map(log));\n return scale;\n };\n scale.base = function(_) {\n if (!arguments.length) return base;\n base = +_;\n linear.domain(domain.map(log));\n return scale;\n };\n scale.nice = function() {\n var niced = d3_scale_nice(domain.map(log), positive ? Math : d3_scale_logNiceNegative);\n linear.domain(niced);\n domain = niced.map(pow);\n return scale;\n };\n scale.ticks = function() {\n var extent = d3_scaleExtent(domain), ticks = [], u = extent[0], v = extent[1], i = Math.floor(log(u)), j = Math.ceil(log(v)), n = base % 1 ? 2 : base;\n if (isFinite(j - i)) {\n if (positive) {\n for (;i < j; i++) for (var k = 1; k < n; k++) ticks.push(pow(i) * k);\n ticks.push(pow(i));\n } else {\n ticks.push(pow(i));\n for (;i++ < j; ) for (var k = n - 1; k > 0; k--) ticks.push(pow(i) * k);\n }\n for (i = 0; ticks[i] < u; i++) {}\n for (j = ticks.length; ticks[j - 1] > v; j--) {}\n ticks = ticks.slice(i, j);\n }\n return ticks;\n };\n scale.tickFormat = function(n, format) {\n if (!arguments.length) return d3_scale_logFormat;\n if (arguments.length < 2) format = d3_scale_logFormat; else if (typeof format !== \"function\") format = d3.format(format);\n var k = Math.max(1, base * n / scale.ticks().length);\n return function(d) {\n var i = d / pow(Math.round(log(d)));\n if (i * base < base - .5) i *= base;\n return i <= k ? format(d) : \"\";\n };\n };\n scale.copy = function() {\n return d3_scale_log(linear.copy(), base, positive, domain);\n };\n return d3_scale_linearRebind(scale, linear);\n }\n var d3_scale_logFormat = d3.format(\".0e\"), d3_scale_logNiceNegative = {\n floor: function(x) {\n return -Math.ceil(-x);\n },\n ceil: function(x) {\n return -Math.floor(-x);\n }\n };\n d3.scale.pow = function() {\n return d3_scale_pow(d3.scale.linear(), 1, [ 0, 1 ]);\n };\n function d3_scale_pow(linear, exponent, domain) {\n var powp = d3_scale_powPow(exponent), powb = d3_scale_powPow(1 / exponent);\n function scale(x) {\n return linear(powp(x));\n }\n scale.invert = function(x) {\n return powb(linear.invert(x));\n };\n scale.domain = function(x) {\n if (!arguments.length) return domain;\n linear.domain((domain = x.map(Number)).map(powp));\n return scale;\n };\n scale.ticks = function(m) {\n return d3_scale_linearTicks(domain, m);\n };\n scale.tickFormat = function(m, format) {\n return d3_scale_linearTickFormat(domain, m, format);\n };\n scale.nice = function(m) {\n return scale.domain(d3_scale_linearNice(domain, m));\n };\n scale.exponent = function(x) {\n if (!arguments.length) return exponent;\n powp = d3_scale_powPow(exponent = x);\n powb = d3_scale_powPow(1 / exponent);\n linear.domain(domain.map(powp));\n return scale;\n };\n scale.copy = function() {\n return d3_scale_pow(linear.copy(), exponent, domain);\n };\n return d3_scale_linearRebind(scale, linear);\n }\n function d3_scale_powPow(e) {\n return function(x) {\n return x < 0 ? -Math.pow(-x, e) : Math.pow(x, e);\n };\n }\n d3.scale.sqrt = function() {\n return d3.scale.pow().exponent(.5);\n };\n d3.scale.ordinal = function() {\n return d3_scale_ordinal([], {\n t: \"range\",\n a: [ [] ]\n });\n };\n function d3_scale_ordinal(domain, ranger) {\n var index, range, rangeBand;\n function scale(x) {\n return range[((index.get(x) || (ranger.t === \"range\" ? index.set(x, domain.push(x)) : NaN)) - 1) % range.length];\n }\n function steps(start, step) {\n return d3.range(domain.length).map(function(i) {\n return start + step * i;\n });\n }\n scale.domain = function(x) {\n if (!arguments.length) return domain;\n domain = [];\n index = new d3_Map();\n var i = -1, n = x.length, xi;\n while (++i < n) if (!index.has(xi = x[i])) index.set(xi, domain.push(xi));\n return scale[ranger.t].apply(scale, ranger.a);\n };\n scale.range = function(x) {\n if (!arguments.length) return range;\n range = x;\n rangeBand = 0;\n ranger = {\n t: \"range\",\n a: arguments\n };\n return scale;\n };\n scale.rangePoints = function(x, padding) {\n if (arguments.length < 2) padding = 0;\n var start = x[0], stop = x[1], step = domain.length < 2 ? (start = (start + stop) / 2, \n 0) : (stop - start) / (domain.length - 1 + padding);\n range = steps(start + step * padding / 2, step);\n rangeBand = 0;\n ranger = {\n t: \"rangePoints\",\n a: arguments\n };\n return scale;\n };\n scale.rangeRoundPoints = function(x, padding) {\n if (arguments.length < 2) padding = 0;\n var start = x[0], stop = x[1], step = domain.length < 2 ? (start = stop = Math.round((start + stop) / 2), \n 0) : (stop - start) / (domain.length - 1 + padding) | 0;\n range = steps(start + Math.round(step * padding / 2 + (stop - start - (domain.length - 1 + padding) * step) / 2), step);\n rangeBand = 0;\n ranger = {\n t: \"rangeRoundPoints\",\n a: arguments\n };\n return scale;\n };\n scale.rangeBands = function(x, padding, outerPadding) {\n if (arguments.length < 2) padding = 0;\n if (arguments.length < 3) outerPadding = padding;\n var reverse = x[1] < x[0], start = x[reverse - 0], stop = x[1 - reverse], step = (stop - start) / (domain.length - padding + 2 * outerPadding);\n range = steps(start + step * outerPadding, step);\n if (reverse) range.reverse();\n rangeBand = step * (1 - padding);\n ranger = {\n t: \"rangeBands\",\n a: arguments\n };\n return scale;\n };\n scale.rangeRoundBands = function(x, padding, outerPadding) {\n if (arguments.length < 2) padding = 0;\n if (arguments.length < 3) outerPadding = padding;\n var reverse = x[1] < x[0], start = x[reverse - 0], stop = x[1 - reverse], step = Math.floor((stop - start) / (domain.length - padding + 2 * outerPadding));\n range = steps(start + Math.round((stop - start - (domain.length - padding) * step) / 2), step);\n if (reverse) range.reverse();\n rangeBand = Math.round(step * (1 - padding));\n ranger = {\n t: \"rangeRoundBands\",\n a: arguments\n };\n return scale;\n };\n scale.rangeBand = function() {\n return rangeBand;\n };\n scale.rangeExtent = function() {\n return d3_scaleExtent(ranger.a[0]);\n };\n scale.copy = function() {\n return d3_scale_ordinal(domain, ranger);\n };\n return scale.domain(domain);\n }\n d3.scale.category10 = function() {\n return d3.scale.ordinal().range(d3_category10);\n };\n d3.scale.category20 = function() {\n return d3.scale.ordinal().range(d3_category20);\n };\n d3.scale.category20b = function() {\n return d3.scale.ordinal().range(d3_category20b);\n };\n d3.scale.category20c = function() {\n return d3.scale.ordinal().range(d3_category20c);\n };\n var d3_category10 = [ 2062260, 16744206, 2924588, 14034728, 9725885, 9197131, 14907330, 8355711, 12369186, 1556175 ].map(d3_rgbString);\n var d3_category20 = [ 2062260, 11454440, 16744206, 16759672, 2924588, 10018698, 14034728, 16750742, 9725885, 12955861, 9197131, 12885140, 14907330, 16234194, 8355711, 13092807, 12369186, 14408589, 1556175, 10410725 ].map(d3_rgbString);\n var d3_category20b = [ 3750777, 5395619, 7040719, 10264286, 6519097, 9216594, 11915115, 13556636, 9202993, 12426809, 15186514, 15190932, 8666169, 11356490, 14049643, 15177372, 8077683, 10834324, 13528509, 14589654 ].map(d3_rgbString);\n var d3_category20c = [ 3244733, 7057110, 10406625, 13032431, 15095053, 16616764, 16625259, 16634018, 3253076, 7652470, 10607003, 13101504, 7695281, 10394312, 12369372, 14342891, 6513507, 9868950, 12434877, 14277081 ].map(d3_rgbString);\n d3.scale.quantile = function() {\n return d3_scale_quantile([], []);\n };\n function d3_scale_quantile(domain, range) {\n var thresholds;\n function rescale() {\n var k = 0, q = range.length;\n thresholds = [];\n while (++k < q) thresholds[k - 1] = d3.quantile(domain, k / q);\n return scale;\n }\n function scale(x) {\n if (!isNaN(x = +x)) return range[d3.bisect(thresholds, x)];\n }\n scale.domain = function(x) {\n if (!arguments.length) return domain;\n domain = x.map(d3_number).filter(d3_numeric).sort(d3_ascending);\n return rescale();\n };\n scale.range = function(x) {\n if (!arguments.length) return range;\n range = x;\n return rescale();\n };\n scale.quantiles = function() {\n return thresholds;\n };\n scale.invertExtent = function(y) {\n y = range.indexOf(y);\n return y < 0 ? [ NaN, NaN ] : [ y > 0 ? thresholds[y - 1] : domain[0], y < thresholds.length ? thresholds[y] : domain[domain.length - 1] ];\n };\n scale.copy = function() {\n return d3_scale_quantile(domain, range);\n };\n return rescale();\n }\n d3.scale.quantize = function() {\n return d3_scale_quantize(0, 1, [ 0, 1 ]);\n };\n function d3_scale_quantize(x0, x1, range) {\n var kx, i;\n function scale(x) {\n return range[Math.max(0, Math.min(i, Math.floor(kx * (x - x0))))];\n }\n function rescale() {\n kx = range.length / (x1 - x0);\n i = range.length - 1;\n return scale;\n }\n scale.domain = function(x) {\n if (!arguments.length) return [ x0, x1 ];\n x0 = +x[0];\n x1 = +x[x.length - 1];\n return rescale();\n };\n scale.range = function(x) {\n if (!arguments.length) return range;\n range = x;\n return rescale();\n };\n scale.invertExtent = function(y) {\n y = range.indexOf(y);\n y = y < 0 ? NaN : y / kx + x0;\n return [ y, y + 1 / kx ];\n };\n scale.copy = function() {\n return d3_scale_quantize(x0, x1, range);\n };\n return rescale();\n }\n d3.scale.threshold = function() {\n return d3_scale_threshold([ .5 ], [ 0, 1 ]);\n };\n function d3_scale_threshold(domain, range) {\n function scale(x) {\n if (x <= x) return range[d3.bisect(domain, x)];\n }\n scale.domain = function(_) {\n if (!arguments.length) return domain;\n domain = _;\n return scale;\n };\n scale.range = function(_) {\n if (!arguments.length) return range;\n range = _;\n return scale;\n };\n scale.invertExtent = function(y) {\n y = range.indexOf(y);\n return [ domain[y - 1], domain[y] ];\n };\n scale.copy = function() {\n return d3_scale_threshold(domain, range);\n };\n return scale;\n }\n d3.scale.identity = function() {\n return d3_scale_identity([ 0, 1 ]);\n };\n function d3_scale_identity(domain) {\n function identity(x) {\n return +x;\n }\n identity.invert = identity;\n identity.domain = identity.range = function(x) {\n if (!arguments.length) return domain;\n domain = x.map(identity);\n return identity;\n };\n identity.ticks = function(m) {\n return d3_scale_linearTicks(domain, m);\n };\n identity.tickFormat = function(m, format) {\n return d3_scale_linearTickFormat(domain, m, format);\n };\n identity.copy = function() {\n return d3_scale_identity(domain);\n };\n return identity;\n }\n d3.svg = {};\n function d3_zero() {\n return 0;\n }\n d3.svg.arc = function() {\n var innerRadius = d3_svg_arcInnerRadius, outerRadius = d3_svg_arcOuterRadius, cornerRadius = d3_zero, padRadius = d3_svg_arcAuto, startAngle = d3_svg_arcStartAngle, endAngle = d3_svg_arcEndAngle, padAngle = d3_svg_arcPadAngle;\n function arc() {\n var r0 = Math.max(0, +innerRadius.apply(this, arguments)), r1 = Math.max(0, +outerRadius.apply(this, arguments)), a0 = startAngle.apply(this, arguments) - halfπ, a1 = endAngle.apply(this, arguments) - halfπ, da = Math.abs(a1 - a0), cw = a0 > a1 ? 0 : 1;\n if (r1 < r0) rc = r1, r1 = r0, r0 = rc;\n if (da >= τε) return circleSegment(r1, cw) + (r0 ? circleSegment(r0, 1 - cw) : \"\") + \"Z\";\n var rc, cr, rp, ap, p0 = 0, p1 = 0, x0, y0, x1, y1, x2, y2, x3, y3, path = [];\n if (ap = (+padAngle.apply(this, arguments) || 0) / 2) {\n rp = padRadius === d3_svg_arcAuto ? Math.sqrt(r0 * r0 + r1 * r1) : +padRadius.apply(this, arguments);\n if (!cw) p1 *= -1;\n if (r1) p1 = d3_asin(rp / r1 * Math.sin(ap));\n if (r0) p0 = d3_asin(rp / r0 * Math.sin(ap));\n }\n if (r1) {\n x0 = r1 * Math.cos(a0 + p1);\n y0 = r1 * Math.sin(a0 + p1);\n x1 = r1 * Math.cos(a1 - p1);\n y1 = r1 * Math.sin(a1 - p1);\n var l1 = Math.abs(a1 - a0 - 2 * p1) <= π ? 0 : 1;\n if (p1 && d3_svg_arcSweep(x0, y0, x1, y1) === cw ^ l1) {\n var h1 = (a0 + a1) / 2;\n x0 = r1 * Math.cos(h1);\n y0 = r1 * Math.sin(h1);\n x1 = y1 = null;\n }\n } else {\n x0 = y0 = 0;\n }\n if (r0) {\n x2 = r0 * Math.cos(a1 - p0);\n y2 = r0 * Math.sin(a1 - p0);\n x3 = r0 * Math.cos(a0 + p0);\n y3 = r0 * Math.sin(a0 + p0);\n var l0 = Math.abs(a0 - a1 + 2 * p0) <= π ? 0 : 1;\n if (p0 && d3_svg_arcSweep(x2, y2, x3, y3) === 1 - cw ^ l0) {\n var h0 = (a0 + a1) / 2;\n x2 = r0 * Math.cos(h0);\n y2 = r0 * Math.sin(h0);\n x3 = y3 = null;\n }\n } else {\n x2 = y2 = 0;\n }\n if (da > ε && (rc = Math.min(Math.abs(r1 - r0) / 2, +cornerRadius.apply(this, arguments))) > .001) {\n cr = r0 < r1 ^ cw ? 0 : 1;\n var rc1 = rc, rc0 = rc;\n if (da < π) {\n var oc = x3 == null ? [ x2, y2 ] : x1 == null ? [ x0, y0 ] : d3_geom_polygonIntersect([ x0, y0 ], [ x3, y3 ], [ x1, y1 ], [ x2, y2 ]), ax = x0 - oc[0], ay = y0 - oc[1], bx = x1 - oc[0], by = y1 - oc[1], kc = 1 / Math.sin(Math.acos((ax * bx + ay * by) / (Math.sqrt(ax * ax + ay * ay) * Math.sqrt(bx * bx + by * by))) / 2), lc = Math.sqrt(oc[0] * oc[0] + oc[1] * oc[1]);\n rc0 = Math.min(rc, (r0 - lc) / (kc - 1));\n rc1 = Math.min(rc, (r1 - lc) / (kc + 1));\n }\n if (x1 != null) {\n var t30 = d3_svg_arcCornerTangents(x3 == null ? [ x2, y2 ] : [ x3, y3 ], [ x0, y0 ], r1, rc1, cw), t12 = d3_svg_arcCornerTangents([ x1, y1 ], [ x2, y2 ], r1, rc1, cw);\n if (rc === rc1) {\n path.push(\"M\", t30[0], \"A\", rc1, \",\", rc1, \" 0 0,\", cr, \" \", t30[1], \"A\", r1, \",\", r1, \" 0 \", 1 - cw ^ d3_svg_arcSweep(t30[1][0], t30[1][1], t12[1][0], t12[1][1]), \",\", cw, \" \", t12[1], \"A\", rc1, \",\", rc1, \" 0 0,\", cr, \" \", t12[0]);\n } else {\n path.push(\"M\", t30[0], \"A\", rc1, \",\", rc1, \" 0 1,\", cr, \" \", t12[0]);\n }\n } else {\n path.push(\"M\", x0, \",\", y0);\n }\n if (x3 != null) {\n var t03 = d3_svg_arcCornerTangents([ x0, y0 ], [ x3, y3 ], r0, -rc0, cw), t21 = d3_svg_arcCornerTangents([ x2, y2 ], x1 == null ? [ x0, y0 ] : [ x1, y1 ], r0, -rc0, cw);\n if (rc === rc0) {\n path.push(\"L\", t21[0], \"A\", rc0, \",\", rc0, \" 0 0,\", cr, \" \", t21[1], \"A\", r0, \",\", r0, \" 0 \", cw ^ d3_svg_arcSweep(t21[1][0], t21[1][1], t03[1][0], t03[1][1]), \",\", 1 - cw, \" \", t03[1], \"A\", rc0, \",\", rc0, \" 0 0,\", cr, \" \", t03[0]);\n } else {\n path.push(\"L\", t21[0], \"A\", rc0, \",\", rc0, \" 0 0,\", cr, \" \", t03[0]);\n }\n } else {\n path.push(\"L\", x2, \",\", y2);\n }\n } else {\n path.push(\"M\", x0, \",\", y0);\n if (x1 != null) path.push(\"A\", r1, \",\", r1, \" 0 \", l1, \",\", cw, \" \", x1, \",\", y1);\n path.push(\"L\", x2, \",\", y2);\n if (x3 != null) path.push(\"A\", r0, \",\", r0, \" 0 \", l0, \",\", 1 - cw, \" \", x3, \",\", y3);\n }\n path.push(\"Z\");\n return path.join(\"\");\n }\n function circleSegment(r1, cw) {\n return \"M0,\" + r1 + \"A\" + r1 + \",\" + r1 + \" 0 1,\" + cw + \" 0,\" + -r1 + \"A\" + r1 + \",\" + r1 + \" 0 1,\" + cw + \" 0,\" + r1;\n }\n arc.innerRadius = function(v) {\n if (!arguments.length) return innerRadius;\n innerRadius = d3_functor(v);\n return arc;\n };\n arc.outerRadius = function(v) {\n if (!arguments.length) return outerRadius;\n outerRadius = d3_functor(v);\n return arc;\n };\n arc.cornerRadius = function(v) {\n if (!arguments.length) return cornerRadius;\n cornerRadius = d3_functor(v);\n return arc;\n };\n arc.padRadius = function(v) {\n if (!arguments.length) return padRadius;\n padRadius = v == d3_svg_arcAuto ? d3_svg_arcAuto : d3_functor(v);\n return arc;\n };\n arc.startAngle = function(v) {\n if (!arguments.length) return startAngle;\n startAngle = d3_functor(v);\n return arc;\n };\n arc.endAngle = function(v) {\n if (!arguments.length) return endAngle;\n endAngle = d3_functor(v);\n return arc;\n };\n arc.padAngle = function(v) {\n if (!arguments.length) return padAngle;\n padAngle = d3_functor(v);\n return arc;\n };\n arc.centroid = function() {\n var r = (+innerRadius.apply(this, arguments) + +outerRadius.apply(this, arguments)) / 2, a = (+startAngle.apply(this, arguments) + +endAngle.apply(this, arguments)) / 2 - halfπ;\n return [ Math.cos(a) * r, Math.sin(a) * r ];\n };\n return arc;\n };\n var d3_svg_arcAuto = \"auto\";\n function d3_svg_arcInnerRadius(d) {\n return d.innerRadius;\n }\n function d3_svg_arcOuterRadius(d) {\n return d.outerRadius;\n }\n function d3_svg_arcStartAngle(d) {\n return d.startAngle;\n }\n function d3_svg_arcEndAngle(d) {\n return d.endAngle;\n }\n function d3_svg_arcPadAngle(d) {\n return d && d.padAngle;\n }\n function d3_svg_arcSweep(x0, y0, x1, y1) {\n return (x0 - x1) * y0 - (y0 - y1) * x0 > 0 ? 0 : 1;\n }\n function d3_svg_arcCornerTangents(p0, p1, r1, rc, cw) {\n var x01 = p0[0] - p1[0], y01 = p0[1] - p1[1], lo = (cw ? rc : -rc) / Math.sqrt(x01 * x01 + y01 * y01), ox = lo * y01, oy = -lo * x01, x1 = p0[0] + ox, y1 = p0[1] + oy, x2 = p1[0] + ox, y2 = p1[1] + oy, x3 = (x1 + x2) / 2, y3 = (y1 + y2) / 2, dx = x2 - x1, dy = y2 - y1, d2 = dx * dx + dy * dy, r = r1 - rc, D = x1 * y2 - x2 * y1, d = (dy < 0 ? -1 : 1) * Math.sqrt(Math.max(0, r * r * d2 - D * D)), cx0 = (D * dy - dx * d) / d2, cy0 = (-D * dx - dy * d) / d2, cx1 = (D * dy + dx * d) / d2, cy1 = (-D * dx + dy * d) / d2, dx0 = cx0 - x3, dy0 = cy0 - y3, dx1 = cx1 - x3, dy1 = cy1 - y3;\n if (dx0 * dx0 + dy0 * dy0 > dx1 * dx1 + dy1 * dy1) cx0 = cx1, cy0 = cy1;\n return [ [ cx0 - ox, cy0 - oy ], [ cx0 * r1 / r, cy0 * r1 / r ] ];\n }\n function d3_svg_line(projection) {\n var x = d3_geom_pointX, y = d3_geom_pointY, defined = d3_true, interpolate = d3_svg_lineLinear, interpolateKey = interpolate.key, tension = .7;\n function line(data) {\n var segments = [], points = [], i = -1, n = data.length, d, fx = d3_functor(x), fy = d3_functor(y);\n function segment() {\n segments.push(\"M\", interpolate(projection(points), tension));\n }\n while (++i < n) {\n if (defined.call(this, d = data[i], i)) {\n points.push([ +fx.call(this, d, i), +fy.call(this, d, i) ]);\n } else if (points.length) {\n segment();\n points = [];\n }\n }\n if (points.length) segment();\n return segments.length ? segments.join(\"\") : null;\n }\n line.x = function(_) {\n if (!arguments.length) return x;\n x = _;\n return line;\n };\n line.y = function(_) {\n if (!arguments.length) return y;\n y = _;\n return line;\n };\n line.defined = function(_) {\n if (!arguments.length) return defined;\n defined = _;\n return line;\n };\n line.interpolate = function(_) {\n if (!arguments.length) return interpolateKey;\n if (typeof _ === \"function\") interpolateKey = interpolate = _; else interpolateKey = (interpolate = d3_svg_lineInterpolators.get(_) || d3_svg_lineLinear).key;\n return line;\n };\n line.tension = function(_) {\n if (!arguments.length) return tension;\n tension = _;\n return line;\n };\n return line;\n }\n d3.svg.line = function() {\n return d3_svg_line(d3_identity);\n };\n var d3_svg_lineInterpolators = d3.map({\n linear: d3_svg_lineLinear,\n \"linear-closed\": d3_svg_lineLinearClosed,\n step: d3_svg_lineStep,\n \"step-before\": d3_svg_lineStepBefore,\n \"step-after\": d3_svg_lineStepAfter,\n basis: d3_svg_lineBasis,\n \"basis-open\": d3_svg_lineBasisOpen,\n \"basis-closed\": d3_svg_lineBasisClosed,\n bundle: d3_svg_lineBundle,\n cardinal: d3_svg_lineCardinal,\n \"cardinal-open\": d3_svg_lineCardinalOpen,\n \"cardinal-closed\": d3_svg_lineCardinalClosed,\n monotone: d3_svg_lineMonotone\n });\n d3_svg_lineInterpolators.forEach(function(key, value) {\n value.key = key;\n value.closed = /-closed$/.test(key);\n });\n function d3_svg_lineLinear(points) {\n return points.length > 1 ? points.join(\"L\") : points + \"Z\";\n }\n function d3_svg_lineLinearClosed(points) {\n return points.join(\"L\") + \"Z\";\n }\n function d3_svg_lineStep(points) {\n var i = 0, n = points.length, p = points[0], path = [ p[0], \",\", p[1] ];\n while (++i < n) path.push(\"H\", (p[0] + (p = points[i])[0]) / 2, \"V\", p[1]);\n if (n > 1) path.push(\"H\", p[0]);\n return path.join(\"\");\n }\n function d3_svg_lineStepBefore(points) {\n var i = 0, n = points.length, p = points[0], path = [ p[0], \",\", p[1] ];\n while (++i < n) path.push(\"V\", (p = points[i])[1], \"H\", p[0]);\n return path.join(\"\");\n }\n function d3_svg_lineStepAfter(points) {\n var i = 0, n = points.length, p = points[0], path = [ p[0], \",\", p[1] ];\n while (++i < n) path.push(\"H\", (p = points[i])[0], \"V\", p[1]);\n return path.join(\"\");\n }\n function d3_svg_lineCardinalOpen(points, tension) {\n return points.length < 4 ? d3_svg_lineLinear(points) : points[1] + d3_svg_lineHermite(points.slice(1, -1), d3_svg_lineCardinalTangents(points, tension));\n }\n function d3_svg_lineCardinalClosed(points, tension) {\n return points.length < 3 ? d3_svg_lineLinearClosed(points) : points[0] + d3_svg_lineHermite((points.push(points[0]), \n points), d3_svg_lineCardinalTangents([ points[points.length - 2] ].concat(points, [ points[1] ]), tension));\n }\n function d3_svg_lineCardinal(points, tension) {\n return points.length < 3 ? d3_svg_lineLinear(points) : points[0] + d3_svg_lineHermite(points, d3_svg_lineCardinalTangents(points, tension));\n }\n function d3_svg_lineHermite(points, tangents) {\n if (tangents.length < 1 || points.length != tangents.length && points.length != tangents.length + 2) {\n return d3_svg_lineLinear(points);\n }\n var quad = points.length != tangents.length, path = \"\", p0 = points[0], p = points[1], t0 = tangents[0], t = t0, pi = 1;\n if (quad) {\n path += \"Q\" + (p[0] - t0[0] * 2 / 3) + \",\" + (p[1] - t0[1] * 2 / 3) + \",\" + p[0] + \",\" + p[1];\n p0 = points[1];\n pi = 2;\n }\n if (tangents.length > 1) {\n t = tangents[1];\n p = points[pi];\n pi++;\n path += \"C\" + (p0[0] + t0[0]) + \",\" + (p0[1] + t0[1]) + \",\" + (p[0] - t[0]) + \",\" + (p[1] - t[1]) + \",\" + p[0] + \",\" + p[1];\n for (var i = 2; i < tangents.length; i++, pi++) {\n p = points[pi];\n t = tangents[i];\n path += \"S\" + (p[0] - t[0]) + \",\" + (p[1] - t[1]) + \",\" + p[0] + \",\" + p[1];\n }\n }\n if (quad) {\n var lp = points[pi];\n path += \"Q\" + (p[0] + t[0] * 2 / 3) + \",\" + (p[1] + t[1] * 2 / 3) + \",\" + lp[0] + \",\" + lp[1];\n }\n return path;\n }\n function d3_svg_lineCardinalTangents(points, tension) {\n var tangents = [], a = (1 - tension) / 2, p0, p1 = points[0], p2 = points[1], i = 1, n = points.length;\n while (++i < n) {\n p0 = p1;\n p1 = p2;\n p2 = points[i];\n tangents.push([ a * (p2[0] - p0[0]), a * (p2[1] - p0[1]) ]);\n }\n return tangents;\n }\n function d3_svg_lineBasis(points) {\n if (points.length < 3) return d3_svg_lineLinear(points);\n var i = 1, n = points.length, pi = points[0], x0 = pi[0], y0 = pi[1], px = [ x0, x0, x0, (pi = points[1])[0] ], py = [ y0, y0, y0, pi[1] ], path = [ x0, \",\", y0, \"L\", d3_svg_lineDot4(d3_svg_lineBasisBezier3, px), \",\", d3_svg_lineDot4(d3_svg_lineBasisBezier3, py) ];\n points.push(points[n - 1]);\n while (++i <= n) {\n pi = points[i];\n px.shift();\n px.push(pi[0]);\n py.shift();\n py.push(pi[1]);\n d3_svg_lineBasisBezier(path, px, py);\n }\n points.pop();\n path.push(\"L\", pi);\n return path.join(\"\");\n }\n function d3_svg_lineBasisOpen(points) {\n if (points.length < 4) return d3_svg_lineLinear(points);\n var path = [], i = -1, n = points.length, pi, px = [ 0 ], py = [ 0 ];\n while (++i < 3) {\n pi = points[i];\n px.push(pi[0]);\n py.push(pi[1]);\n }\n path.push(d3_svg_lineDot4(d3_svg_lineBasisBezier3, px) + \",\" + d3_svg_lineDot4(d3_svg_lineBasisBezier3, py));\n --i;\n while (++i < n) {\n pi = points[i];\n px.shift();\n px.push(pi[0]);\n py.shift();\n py.push(pi[1]);\n d3_svg_lineBasisBezier(path, px, py);\n }\n return path.join(\"\");\n }\n function d3_svg_lineBasisClosed(points) {\n var path, i = -1, n = points.length, m = n + 4, pi, px = [], py = [];\n while (++i < 4) {\n pi = points[i % n];\n px.push(pi[0]);\n py.push(pi[1]);\n }\n path = [ d3_svg_lineDot4(d3_svg_lineBasisBezier3, px), \",\", d3_svg_lineDot4(d3_svg_lineBasisBezier3, py) ];\n --i;\n while (++i < m) {\n pi = points[i % n];\n px.shift();\n px.push(pi[0]);\n py.shift();\n py.push(pi[1]);\n d3_svg_lineBasisBezier(path, px, py);\n }\n return path.join(\"\");\n }\n function d3_svg_lineBundle(points, tension) {\n var n = points.length - 1;\n if (n) {\n var x0 = points[0][0], y0 = points[0][1], dx = points[n][0] - x0, dy = points[n][1] - y0, i = -1, p, t;\n while (++i <= n) {\n p = points[i];\n t = i / n;\n p[0] = tension * p[0] + (1 - tension) * (x0 + t * dx);\n p[1] = tension * p[1] + (1 - tension) * (y0 + t * dy);\n }\n }\n return d3_svg_lineBasis(points);\n }\n function d3_svg_lineDot4(a, b) {\n return a[0] * b[0] + a[1] * b[1] + a[2] * b[2] + a[3] * b[3];\n }\n var d3_svg_lineBasisBezier1 = [ 0, 2 / 3, 1 / 3, 0 ], d3_svg_lineBasisBezier2 = [ 0, 1 / 3, 2 / 3, 0 ], d3_svg_lineBasisBezier3 = [ 0, 1 / 6, 2 / 3, 1 / 6 ];\n function d3_svg_lineBasisBezier(path, x, y) {\n path.push(\"C\", d3_svg_lineDot4(d3_svg_lineBasisBezier1, x), \",\", d3_svg_lineDot4(d3_svg_lineBasisBezier1, y), \",\", d3_svg_lineDot4(d3_svg_lineBasisBezier2, x), \",\", d3_svg_lineDot4(d3_svg_lineBasisBezier2, y), \",\", d3_svg_lineDot4(d3_svg_lineBasisBezier3, x), \",\", d3_svg_lineDot4(d3_svg_lineBasisBezier3, y));\n }\n function d3_svg_lineSlope(p0, p1) {\n return (p1[1] - p0[1]) / (p1[0] - p0[0]);\n }\n function d3_svg_lineFiniteDifferences(points) {\n var i = 0, j = points.length - 1, m = [], p0 = points[0], p1 = points[1], d = m[0] = d3_svg_lineSlope(p0, p1);\n while (++i < j) {\n m[i] = (d + (d = d3_svg_lineSlope(p0 = p1, p1 = points[i + 1]))) / 2;\n }\n m[i] = d;\n return m;\n }\n function d3_svg_lineMonotoneTangents(points) {\n var tangents = [], d, a, b, s, m = d3_svg_lineFiniteDifferences(points), i = -1, j = points.length - 1;\n while (++i < j) {\n d = d3_svg_lineSlope(points[i], points[i + 1]);\n if (abs(d) < ε) {\n m[i] = m[i + 1] = 0;\n } else {\n a = m[i] / d;\n b = m[i + 1] / d;\n s = a * a + b * b;\n if (s > 9) {\n s = d * 3 / Math.sqrt(s);\n m[i] = s * a;\n m[i + 1] = s * b;\n }\n }\n }\n i = -1;\n while (++i <= j) {\n s = (points[Math.min(j, i + 1)][0] - points[Math.max(0, i - 1)][0]) / (6 * (1 + m[i] * m[i]));\n tangents.push([ s || 0, m[i] * s || 0 ]);\n }\n return tangents;\n }\n function d3_svg_lineMonotone(points) {\n return points.length < 3 ? d3_svg_lineLinear(points) : points[0] + d3_svg_lineHermite(points, d3_svg_lineMonotoneTangents(points));\n }\n d3.svg.line.radial = function() {\n var line = d3_svg_line(d3_svg_lineRadial);\n line.radius = line.x, delete line.x;\n line.angle = line.y, delete line.y;\n return line;\n };\n function d3_svg_lineRadial(points) {\n var point, i = -1, n = points.length, r, a;\n while (++i < n) {\n point = points[i];\n r = point[0];\n a = point[1] - halfπ;\n point[0] = r * Math.cos(a);\n point[1] = r * Math.sin(a);\n }\n return points;\n }\n function d3_svg_area(projection) {\n var x0 = d3_geom_pointX, x1 = d3_geom_pointX, y0 = 0, y1 = d3_geom_pointY, defined = d3_true, interpolate = d3_svg_lineLinear, interpolateKey = interpolate.key, interpolateReverse = interpolate, L = \"L\", tension = .7;\n function area(data) {\n var segments = [], points0 = [], points1 = [], i = -1, n = data.length, d, fx0 = d3_functor(x0), fy0 = d3_functor(y0), fx1 = x0 === x1 ? function() {\n return x;\n } : d3_functor(x1), fy1 = y0 === y1 ? function() {\n return y;\n } : d3_functor(y1), x, y;\n function segment() {\n segments.push(\"M\", interpolate(projection(points1), tension), L, interpolateReverse(projection(points0.reverse()), tension), \"Z\");\n }\n while (++i < n) {\n if (defined.call(this, d = data[i], i)) {\n points0.push([ x = +fx0.call(this, d, i), y = +fy0.call(this, d, i) ]);\n points1.push([ +fx1.call(this, d, i), +fy1.call(this, d, i) ]);\n } else if (points0.length) {\n segment();\n points0 = [];\n points1 = [];\n }\n }\n if (points0.length) segment();\n return segments.length ? segments.join(\"\") : null;\n }\n area.x = function(_) {\n if (!arguments.length) return x1;\n x0 = x1 = _;\n return area;\n };\n area.x0 = function(_) {\n if (!arguments.length) return x0;\n x0 = _;\n return area;\n };\n area.x1 = function(_) {\n if (!arguments.length) return x1;\n x1 = _;\n return area;\n };\n area.y = function(_) {\n if (!arguments.length) return y1;\n y0 = y1 = _;\n return area;\n };\n area.y0 = function(_) {\n if (!arguments.length) return y0;\n y0 = _;\n return area;\n };\n area.y1 = function(_) {\n if (!arguments.length) return y1;\n y1 = _;\n return area;\n };\n area.defined = function(_) {\n if (!arguments.length) return defined;\n defined = _;\n return area;\n };\n area.interpolate = function(_) {\n if (!arguments.length) return interpolateKey;\n if (typeof _ === \"function\") interpolateKey = interpolate = _; else interpolateKey = (interpolate = d3_svg_lineInterpolators.get(_) || d3_svg_lineLinear).key;\n interpolateReverse = interpolate.reverse || interpolate;\n L = interpolate.closed ? \"M\" : \"L\";\n return area;\n };\n area.tension = function(_) {\n if (!arguments.length) return tension;\n tension = _;\n return area;\n };\n return area;\n }\n d3_svg_lineStepBefore.reverse = d3_svg_lineStepAfter;\n d3_svg_lineStepAfter.reverse = d3_svg_lineStepBefore;\n d3.svg.area = function() {\n return d3_svg_area(d3_identity);\n };\n d3.svg.area.radial = function() {\n var area = d3_svg_area(d3_svg_lineRadial);\n area.radius = area.x, delete area.x;\n area.innerRadius = area.x0, delete area.x0;\n area.outerRadius = area.x1, delete area.x1;\n area.angle = area.y, delete area.y;\n area.startAngle = area.y0, delete area.y0;\n area.endAngle = area.y1, delete area.y1;\n return area;\n };\n d3.svg.chord = function() {\n var source = d3_source, target = d3_target, radius = d3_svg_chordRadius, startAngle = d3_svg_arcStartAngle, endAngle = d3_svg_arcEndAngle;\n function chord(d, i) {\n var s = subgroup(this, source, d, i), t = subgroup(this, target, d, i);\n return \"M\" + s.p0 + arc(s.r, s.p1, s.a1 - s.a0) + (equals(s, t) ? curve(s.r, s.p1, s.r, s.p0) : curve(s.r, s.p1, t.r, t.p0) + arc(t.r, t.p1, t.a1 - t.a0) + curve(t.r, t.p1, s.r, s.p0)) + \"Z\";\n }\n function subgroup(self, f, d, i) {\n var subgroup = f.call(self, d, i), r = radius.call(self, subgroup, i), a0 = startAngle.call(self, subgroup, i) - halfπ, a1 = endAngle.call(self, subgroup, i) - halfπ;\n return {\n r: r,\n a0: a0,\n a1: a1,\n p0: [ r * Math.cos(a0), r * Math.sin(a0) ],\n p1: [ r * Math.cos(a1), r * Math.sin(a1) ]\n };\n }\n function equals(a, b) {\n return a.a0 == b.a0 && a.a1 == b.a1;\n }\n function arc(r, p, a) {\n return \"A\" + r + \",\" + r + \" 0 \" + +(a > π) + \",1 \" + p;\n }\n function curve(r0, p0, r1, p1) {\n return \"Q 0,0 \" + p1;\n }\n chord.radius = function(v) {\n if (!arguments.length) return radius;\n radius = d3_functor(v);\n return chord;\n };\n chord.source = function(v) {\n if (!arguments.length) return source;\n source = d3_functor(v);\n return chord;\n };\n chord.target = function(v) {\n if (!arguments.length) return target;\n target = d3_functor(v);\n return chord;\n };\n chord.startAngle = function(v) {\n if (!arguments.length) return startAngle;\n startAngle = d3_functor(v);\n return chord;\n };\n chord.endAngle = function(v) {\n if (!arguments.length) return endAngle;\n endAngle = d3_functor(v);\n return chord;\n };\n return chord;\n };\n function d3_svg_chordRadius(d) {\n return d.radius;\n }\n d3.svg.diagonal = function() {\n var source = d3_source, target = d3_target, projection = d3_svg_diagonalProjection;\n function diagonal(d, i) {\n var p0 = source.call(this, d, i), p3 = target.call(this, d, i), m = (p0.y + p3.y) / 2, p = [ p0, {\n x: p0.x,\n y: m\n }, {\n x: p3.x,\n y: m\n }, p3 ];\n p = p.map(projection);\n return \"M\" + p[0] + \"C\" + p[1] + \" \" + p[2] + \" \" + p[3];\n }\n diagonal.source = function(x) {\n if (!arguments.length) return source;\n source = d3_functor(x);\n return diagonal;\n };\n diagonal.target = function(x) {\n if (!arguments.length) return target;\n target = d3_functor(x);\n return diagonal;\n };\n diagonal.projection = function(x) {\n if (!arguments.length) return projection;\n projection = x;\n return diagonal;\n };\n return diagonal;\n };\n function d3_svg_diagonalProjection(d) {\n return [ d.x, d.y ];\n }\n d3.svg.diagonal.radial = function() {\n var diagonal = d3.svg.diagonal(), projection = d3_svg_diagonalProjection, projection_ = diagonal.projection;\n diagonal.projection = function(x) {\n return arguments.length ? projection_(d3_svg_diagonalRadialProjection(projection = x)) : projection;\n };\n return diagonal;\n };\n function d3_svg_diagonalRadialProjection(projection) {\n return function() {\n var d = projection.apply(this, arguments), r = d[0], a = d[1] - halfπ;\n return [ r * Math.cos(a), r * Math.sin(a) ];\n };\n }\n d3.svg.symbol = function() {\n var type = d3_svg_symbolType, size = d3_svg_symbolSize;\n function symbol(d, i) {\n return (d3_svg_symbols.get(type.call(this, d, i)) || d3_svg_symbolCircle)(size.call(this, d, i));\n }\n symbol.type = function(x) {\n if (!arguments.length) return type;\n type = d3_functor(x);\n return symbol;\n };\n symbol.size = function(x) {\n if (!arguments.length) return size;\n size = d3_functor(x);\n return symbol;\n };\n return symbol;\n };\n function d3_svg_symbolSize() {\n return 64;\n }\n function d3_svg_symbolType() {\n return \"circle\";\n }\n function d3_svg_symbolCircle(size) {\n var r = Math.sqrt(size / π);\n return \"M0,\" + r + \"A\" + r + \",\" + r + \" 0 1,1 0,\" + -r + \"A\" + r + \",\" + r + \" 0 1,1 0,\" + r + \"Z\";\n }\n var d3_svg_symbols = d3.map({\n circle: d3_svg_symbolCircle,\n cross: function(size) {\n var r = Math.sqrt(size / 5) / 2;\n return \"M\" + -3 * r + \",\" + -r + \"H\" + -r + \"V\" + -3 * r + \"H\" + r + \"V\" + -r + \"H\" + 3 * r + \"V\" + r + \"H\" + r + \"V\" + 3 * r + \"H\" + -r + \"V\" + r + \"H\" + -3 * r + \"Z\";\n },\n diamond: function(size) {\n var ry = Math.sqrt(size / (2 * d3_svg_symbolTan30)), rx = ry * d3_svg_symbolTan30;\n return \"M0,\" + -ry + \"L\" + rx + \",0\" + \" 0,\" + ry + \" \" + -rx + \",0\" + \"Z\";\n },\n square: function(size) {\n var r = Math.sqrt(size) / 2;\n return \"M\" + -r + \",\" + -r + \"L\" + r + \",\" + -r + \" \" + r + \",\" + r + \" \" + -r + \",\" + r + \"Z\";\n },\n \"triangle-down\": function(size) {\n var rx = Math.sqrt(size / d3_svg_symbolSqrt3), ry = rx * d3_svg_symbolSqrt3 / 2;\n return \"M0,\" + ry + \"L\" + rx + \",\" + -ry + \" \" + -rx + \",\" + -ry + \"Z\";\n },\n \"triangle-up\": function(size) {\n var rx = Math.sqrt(size / d3_svg_symbolSqrt3), ry = rx * d3_svg_symbolSqrt3 / 2;\n return \"M0,\" + -ry + \"L\" + rx + \",\" + ry + \" \" + -rx + \",\" + ry + \"Z\";\n }\n });\n d3.svg.symbolTypes = d3_svg_symbols.keys();\n var d3_svg_symbolSqrt3 = Math.sqrt(3), d3_svg_symbolTan30 = Math.tan(30 * d3_radians);\n d3_selectionPrototype.transition = function(name) {\n var id = d3_transitionInheritId || ++d3_transitionId, ns = d3_transitionNamespace(name), subgroups = [], subgroup, node, transition = d3_transitionInherit || {\n time: Date.now(),\n ease: d3_ease_cubicInOut,\n delay: 0,\n duration: 250\n };\n for (var j = -1, m = this.length; ++j < m; ) {\n subgroups.push(subgroup = []);\n for (var group = this[j], i = -1, n = group.length; ++i < n; ) {\n if (node = group[i]) d3_transitionNode(node, i, ns, id, transition);\n subgroup.push(node);\n }\n }\n return d3_transition(subgroups, ns, id);\n };\n d3_selectionPrototype.interrupt = function(name) {\n return this.each(name == null ? d3_selection_interrupt : d3_selection_interruptNS(d3_transitionNamespace(name)));\n };\n var d3_selection_interrupt = d3_selection_interruptNS(d3_transitionNamespace());\n function d3_selection_interruptNS(ns) {\n return function() {\n var lock, activeId, active;\n if ((lock = this[ns]) && (active = lock[activeId = lock.active])) {\n active.timer.c = null;\n active.timer.t = NaN;\n if (--lock.count) delete lock[activeId]; else delete this[ns];\n lock.active += .5;\n active.event && active.event.interrupt.call(this, this.__data__, active.index);\n }\n };\n }\n function d3_transition(groups, ns, id) {\n d3_subclass(groups, d3_transitionPrototype);\n groups.namespace = ns;\n groups.id = id;\n return groups;\n }\n var d3_transitionPrototype = [], d3_transitionId = 0, d3_transitionInheritId, d3_transitionInherit;\n d3_transitionPrototype.call = d3_selectionPrototype.call;\n d3_transitionPrototype.empty = d3_selectionPrototype.empty;\n d3_transitionPrototype.node = d3_selectionPrototype.node;\n d3_transitionPrototype.size = d3_selectionPrototype.size;\n d3.transition = function(selection, name) {\n return selection && selection.transition ? d3_transitionInheritId ? selection.transition(name) : selection : d3.selection().transition(selection);\n };\n d3.transition.prototype = d3_transitionPrototype;\n d3_transitionPrototype.select = function(selector) {\n var id = this.id, ns = this.namespace, subgroups = [], subgroup, subnode, node;\n selector = d3_selection_selector(selector);\n for (var j = -1, m = this.length; ++j < m; ) {\n subgroups.push(subgroup = []);\n for (var group = this[j], i = -1, n = group.length; ++i < n; ) {\n if ((node = group[i]) && (subnode = selector.call(node, node.__data__, i, j))) {\n if (\"__data__\" in node) subnode.__data__ = node.__data__;\n d3_transitionNode(subnode, i, ns, id, node[ns][id]);\n subgroup.push(subnode);\n } else {\n subgroup.push(null);\n }\n }\n }\n return d3_transition(subgroups, ns, id);\n };\n d3_transitionPrototype.selectAll = function(selector) {\n var id = this.id, ns = this.namespace, subgroups = [], subgroup, subnodes, node, subnode, transition;\n selector = d3_selection_selectorAll(selector);\n for (var j = -1, m = this.length; ++j < m; ) {\n for (var group = this[j], i = -1, n = group.length; ++i < n; ) {\n if (node = group[i]) {\n transition = node[ns][id];\n subnodes = selector.call(node, node.__data__, i, j);\n subgroups.push(subgroup = []);\n for (var k = -1, o = subnodes.length; ++k < o; ) {\n if (subnode = subnodes[k]) d3_transitionNode(subnode, k, ns, id, transition);\n subgroup.push(subnode);\n }\n }\n }\n }\n return d3_transition(subgroups, ns, id);\n };\n d3_transitionPrototype.filter = function(filter) {\n var subgroups = [], subgroup, group, node;\n if (typeof filter !== \"function\") filter = d3_selection_filter(filter);\n for (var j = 0, m = this.length; j < m; j++) {\n subgroups.push(subgroup = []);\n for (var group = this[j], i = 0, n = group.length; i < n; i++) {\n if ((node = group[i]) && filter.call(node, node.__data__, i, j)) {\n subgroup.push(node);\n }\n }\n }\n return d3_transition(subgroups, this.namespace, this.id);\n };\n d3_transitionPrototype.tween = function(name, tween) {\n var id = this.id, ns = this.namespace;\n if (arguments.length < 2) return this.node()[ns][id].tween.get(name);\n return d3_selection_each(this, tween == null ? function(node) {\n node[ns][id].tween.remove(name);\n } : function(node) {\n node[ns][id].tween.set(name, tween);\n });\n };\n function d3_transition_tween(groups, name, value, tween) {\n var id = groups.id, ns = groups.namespace;\n return d3_selection_each(groups, typeof value === \"function\" ? function(node, i, j) {\n node[ns][id].tween.set(name, tween(value.call(node, node.__data__, i, j)));\n } : (value = tween(value), function(node) {\n node[ns][id].tween.set(name, value);\n }));\n }\n d3_transitionPrototype.attr = function(nameNS, value) {\n if (arguments.length < 2) {\n for (value in nameNS) this.attr(value, nameNS[value]);\n return this;\n }\n var interpolate = nameNS == \"transform\" ? d3_interpolateTransform : d3_interpolate, name = d3.ns.qualify(nameNS);\n function attrNull() {\n this.removeAttribute(name);\n }\n function attrNullNS() {\n this.removeAttributeNS(name.space, name.local);\n }\n function attrTween(b) {\n return b == null ? attrNull : (b += \"\", function() {\n var a = this.getAttribute(name), i;\n return a !== b && (i = interpolate(a, b), function(t) {\n this.setAttribute(name, i(t));\n });\n });\n }\n function attrTweenNS(b) {\n return b == null ? attrNullNS : (b += \"\", function() {\n var a = this.getAttributeNS(name.space, name.local), i;\n return a !== b && (i = interpolate(a, b), function(t) {\n this.setAttributeNS(name.space, name.local, i(t));\n });\n });\n }\n return d3_transition_tween(this, \"attr.\" + nameNS, value, name.local ? attrTweenNS : attrTween);\n };\n d3_transitionPrototype.attrTween = function(nameNS, tween) {\n var name = d3.ns.qualify(nameNS);\n function attrTween(d, i) {\n var f = tween.call(this, d, i, this.getAttribute(name));\n return f && function(t) {\n this.setAttribute(name, f(t));\n };\n }\n function attrTweenNS(d, i) {\n var f = tween.call(this, d, i, this.getAttributeNS(name.space, name.local));\n return f && function(t) {\n this.setAttributeNS(name.space, name.local, f(t));\n };\n }\n return this.tween(\"attr.\" + nameNS, name.local ? attrTweenNS : attrTween);\n };\n d3_transitionPrototype.style = function(name, value, priority) {\n var n = arguments.length;\n if (n < 3) {\n if (typeof name !== \"string\") {\n if (n < 2) value = \"\";\n for (priority in name) this.style(priority, name[priority], value);\n return this;\n }\n priority = \"\";\n }\n function styleNull() {\n this.style.removeProperty(name);\n }\n function styleString(b) {\n return b == null ? styleNull : (b += \"\", function() {\n var a = d3_window(this).getComputedStyle(this, null).getPropertyValue(name), i;\n return a !== b && (i = d3_interpolate(a, b), function(t) {\n this.style.setProperty(name, i(t), priority);\n });\n });\n }\n return d3_transition_tween(this, \"style.\" + name, value, styleString);\n };\n d3_transitionPrototype.styleTween = function(name, tween, priority) {\n if (arguments.length < 3) priority = \"\";\n function styleTween(d, i) {\n var f = tween.call(this, d, i, d3_window(this).getComputedStyle(this, null).getPropertyValue(name));\n return f && function(t) {\n this.style.setProperty(name, f(t), priority);\n };\n }\n return this.tween(\"style.\" + name, styleTween);\n };\n d3_transitionPrototype.text = function(value) {\n return d3_transition_tween(this, \"text\", value, d3_transition_text);\n };\n function d3_transition_text(b) {\n if (b == null) b = \"\";\n return function() {\n this.textContent = b;\n };\n }\n d3_transitionPrototype.remove = function() {\n var ns = this.namespace;\n return this.each(\"end.transition\", function() {\n var p;\n if (this[ns].count < 2 && (p = this.parentNode)) p.removeChild(this);\n });\n };\n d3_transitionPrototype.ease = function(value) {\n var id = this.id, ns = this.namespace;\n if (arguments.length < 1) return this.node()[ns][id].ease;\n if (typeof value !== \"function\") value = d3.ease.apply(d3, arguments);\n return d3_selection_each(this, function(node) {\n node[ns][id].ease = value;\n });\n };\n d3_transitionPrototype.delay = function(value) {\n var id = this.id, ns = this.namespace;\n if (arguments.length < 1) return this.node()[ns][id].delay;\n return d3_selection_each(this, typeof value === \"function\" ? function(node, i, j) {\n node[ns][id].delay = +value.call(node, node.__data__, i, j);\n } : (value = +value, function(node) {\n node[ns][id].delay = value;\n }));\n };\n d3_transitionPrototype.duration = function(value) {\n var id = this.id, ns = this.namespace;\n if (arguments.length < 1) return this.node()[ns][id].duration;\n return d3_selection_each(this, typeof value === \"function\" ? function(node, i, j) {\n node[ns][id].duration = Math.max(1, value.call(node, node.__data__, i, j));\n } : (value = Math.max(1, value), function(node) {\n node[ns][id].duration = value;\n }));\n };\n d3_transitionPrototype.each = function(type, listener) {\n var id = this.id, ns = this.namespace;\n if (arguments.length < 2) {\n var inherit = d3_transitionInherit, inheritId = d3_transitionInheritId;\n try {\n d3_transitionInheritId = id;\n d3_selection_each(this, function(node, i, j) {\n d3_transitionInherit = node[ns][id];\n type.call(node, node.__data__, i, j);\n });\n } finally {\n d3_transitionInherit = inherit;\n d3_transitionInheritId = inheritId;\n }\n } else {\n d3_selection_each(this, function(node) {\n var transition = node[ns][id];\n (transition.event || (transition.event = d3.dispatch(\"start\", \"end\", \"interrupt\"))).on(type, listener);\n });\n }\n return this;\n };\n d3_transitionPrototype.transition = function() {\n var id0 = this.id, id1 = ++d3_transitionId, ns = this.namespace, subgroups = [], subgroup, group, node, transition;\n for (var j = 0, m = this.length; j < m; j++) {\n subgroups.push(subgroup = []);\n for (var group = this[j], i = 0, n = group.length; i < n; i++) {\n if (node = group[i]) {\n transition = node[ns][id0];\n d3_transitionNode(node, i, ns, id1, {\n time: transition.time,\n ease: transition.ease,\n delay: transition.delay + transition.duration,\n duration: transition.duration\n });\n }\n subgroup.push(node);\n }\n }\n return d3_transition(subgroups, ns, id1);\n };\n function d3_transitionNamespace(name) {\n return name == null ? \"__transition__\" : \"__transition_\" + name + \"__\";\n }\n function d3_transitionNode(node, i, ns, id, inherit) {\n var lock = node[ns] || (node[ns] = {\n active: 0,\n count: 0\n }), transition = lock[id], time, timer, duration, ease, tweens;\n function schedule(elapsed) {\n var delay = transition.delay;\n timer.t = delay + time;\n if (delay <= elapsed) return start(elapsed - delay);\n timer.c = start;\n }\n function start(elapsed) {\n var activeId = lock.active, active = lock[activeId];\n if (active) {\n active.timer.c = null;\n active.timer.t = NaN;\n --lock.count;\n delete lock[activeId];\n active.event && active.event.interrupt.call(node, node.__data__, active.index);\n }\n for (var cancelId in lock) {\n if (+cancelId < id) {\n var cancel = lock[cancelId];\n cancel.timer.c = null;\n cancel.timer.t = NaN;\n --lock.count;\n delete lock[cancelId];\n }\n }\n timer.c = tick;\n d3_timer(function() {\n if (timer.c && tick(elapsed || 1)) {\n timer.c = null;\n timer.t = NaN;\n }\n return 1;\n }, 0, time);\n lock.active = id;\n transition.event && transition.event.start.call(node, node.__data__, i);\n tweens = [];\n transition.tween.forEach(function(key, value) {\n if (value = value.call(node, node.__data__, i)) {\n tweens.push(value);\n }\n });\n ease = transition.ease;\n duration = transition.duration;\n }\n function tick(elapsed) {\n var t = elapsed / duration, e = ease(t), n = tweens.length;\n while (n > 0) {\n tweens[--n].call(node, e);\n }\n if (t >= 1) {\n transition.event && transition.event.end.call(node, node.__data__, i);\n if (--lock.count) delete lock[id]; else delete node[ns];\n return 1;\n }\n }\n if (!transition) {\n time = inherit.time;\n timer = d3_timer(schedule, 0, time);\n transition = lock[id] = {\n tween: new d3_Map(),\n time: time,\n timer: timer,\n delay: inherit.delay,\n duration: inherit.duration,\n ease: inherit.ease,\n index: i\n };\n inherit = null;\n ++lock.count;\n }\n }\n d3.svg.axis = function() {\n var scale = d3.scale.linear(), orient = d3_svg_axisDefaultOrient, innerTickSize = 6, outerTickSize = 6, tickPadding = 3, tickArguments_ = [ 10 ], tickValues = null, tickFormat_;\n function axis(g) {\n g.each(function() {\n var g = d3.select(this);\n var scale0 = this.__chart__ || scale, scale1 = this.__chart__ = scale.copy();\n var ticks = tickValues == null ? scale1.ticks ? scale1.ticks.apply(scale1, tickArguments_) : scale1.domain() : tickValues, tickFormat = tickFormat_ == null ? scale1.tickFormat ? scale1.tickFormat.apply(scale1, tickArguments_) : d3_identity : tickFormat_, tick = g.selectAll(\".tick\").data(ticks, scale1), tickEnter = tick.enter().insert(\"g\", \".domain\").attr(\"class\", \"tick\").style(\"opacity\", ε), tickExit = d3.transition(tick.exit()).style(\"opacity\", ε).remove(), tickUpdate = d3.transition(tick.order()).style(\"opacity\", 1), tickSpacing = Math.max(innerTickSize, 0) + tickPadding, tickTransform;\n var range = d3_scaleRange(scale1), path = g.selectAll(\".domain\").data([ 0 ]), pathUpdate = (path.enter().append(\"path\").attr(\"class\", \"domain\"), \n d3.transition(path));\n tickEnter.append(\"line\");\n tickEnter.append(\"text\");\n var lineEnter = tickEnter.select(\"line\"), lineUpdate = tickUpdate.select(\"line\"), text = tick.select(\"text\").text(tickFormat), textEnter = tickEnter.select(\"text\"), textUpdate = tickUpdate.select(\"text\"), sign = orient === \"top\" || orient === \"left\" ? -1 : 1, x1, x2, y1, y2;\n if (orient === \"bottom\" || orient === \"top\") {\n tickTransform = d3_svg_axisX, x1 = \"x\", y1 = \"y\", x2 = \"x2\", y2 = \"y2\";\n text.attr(\"dy\", sign < 0 ? \"0em\" : \".71em\").style(\"text-anchor\", \"middle\");\n pathUpdate.attr(\"d\", \"M\" + range[0] + \",\" + sign * outerTickSize + \"V0H\" + range[1] + \"V\" + sign * outerTickSize);\n } else {\n tickTransform = d3_svg_axisY, x1 = \"y\", y1 = \"x\", x2 = \"y2\", y2 = \"x2\";\n text.attr(\"dy\", \".32em\").style(\"text-anchor\", sign < 0 ? \"end\" : \"start\");\n pathUpdate.attr(\"d\", \"M\" + sign * outerTickSize + \",\" + range[0] + \"H0V\" + range[1] + \"H\" + sign * outerTickSize);\n }\n lineEnter.attr(y2, sign * innerTickSize);\n textEnter.attr(y1, sign * tickSpacing);\n lineUpdate.attr(x2, 0).attr(y2, sign * innerTickSize);\n textUpdate.attr(x1, 0).attr(y1, sign * tickSpacing);\n if (scale1.rangeBand) {\n var x = scale1, dx = x.rangeBand() / 2;\n scale0 = scale1 = function(d) {\n return x(d) + dx;\n };\n } else if (scale0.rangeBand) {\n scale0 = scale1;\n } else {\n tickExit.call(tickTransform, scale1, scale0);\n }\n tickEnter.call(tickTransform, scale0, scale1);\n tickUpdate.call(tickTransform, scale1, scale1);\n });\n }\n axis.scale = function(x) {\n if (!arguments.length) return scale;\n scale = x;\n return axis;\n };\n axis.orient = function(x) {\n if (!arguments.length) return orient;\n orient = x in d3_svg_axisOrients ? x + \"\" : d3_svg_axisDefaultOrient;\n return axis;\n };\n axis.ticks = function() {\n if (!arguments.length) return tickArguments_;\n tickArguments_ = d3_array(arguments);\n return axis;\n };\n axis.tickValues = function(x) {\n if (!arguments.length) return tickValues;\n tickValues = x;\n return axis;\n };\n axis.tickFormat = function(x) {\n if (!arguments.length) return tickFormat_;\n tickFormat_ = x;\n return axis;\n };\n axis.tickSize = function(x) {\n var n = arguments.length;\n if (!n) return innerTickSize;\n innerTickSize = +x;\n outerTickSize = +arguments[n - 1];\n return axis;\n };\n axis.innerTickSize = function(x) {\n if (!arguments.length) return innerTickSize;\n innerTickSize = +x;\n return axis;\n };\n axis.outerTickSize = function(x) {\n if (!arguments.length) return outerTickSize;\n outerTickSize = +x;\n return axis;\n };\n axis.tickPadding = function(x) {\n if (!arguments.length) return tickPadding;\n tickPadding = +x;\n return axis;\n };\n axis.tickSubdivide = function() {\n return arguments.length && axis;\n };\n return axis;\n };\n var d3_svg_axisDefaultOrient = \"bottom\", d3_svg_axisOrients = {\n top: 1,\n right: 1,\n bottom: 1,\n left: 1\n };\n function d3_svg_axisX(selection, x0, x1) {\n selection.attr(\"transform\", function(d) {\n var v0 = x0(d);\n return \"translate(\" + (isFinite(v0) ? v0 : x1(d)) + \",0)\";\n });\n }\n function d3_svg_axisY(selection, y0, y1) {\n selection.attr(\"transform\", function(d) {\n var v0 = y0(d);\n return \"translate(0,\" + (isFinite(v0) ? v0 : y1(d)) + \")\";\n });\n }\n d3.svg.brush = function() {\n var event = d3_eventDispatch(brush, \"brushstart\", \"brush\", \"brushend\"), x = null, y = null, xExtent = [ 0, 0 ], yExtent = [ 0, 0 ], xExtentDomain, yExtentDomain, xClamp = true, yClamp = true, resizes = d3_svg_brushResizes[0];\n function brush(g) {\n g.each(function() {\n var g = d3.select(this).style(\"pointer-events\", \"all\").style(\"-webkit-tap-highlight-color\", \"rgba(0,0,0,0)\").on(\"mousedown.brush\", brushstart).on(\"touchstart.brush\", brushstart);\n var background = g.selectAll(\".background\").data([ 0 ]);\n background.enter().append(\"rect\").attr(\"class\", \"background\").style(\"visibility\", \"hidden\").style(\"cursor\", \"crosshair\");\n g.selectAll(\".extent\").data([ 0 ]).enter().append(\"rect\").attr(\"class\", \"extent\").style(\"cursor\", \"move\");\n var resize = g.selectAll(\".resize\").data(resizes, d3_identity);\n resize.exit().remove();\n resize.enter().append(\"g\").attr(\"class\", function(d) {\n return \"resize \" + d;\n }).style(\"cursor\", function(d) {\n return d3_svg_brushCursor[d];\n }).append(\"rect\").attr(\"x\", function(d) {\n return /[ew]$/.test(d) ? -3 : null;\n }).attr(\"y\", function(d) {\n return /^[ns]/.test(d) ? -3 : null;\n }).attr(\"width\", 6).attr(\"height\", 6).style(\"visibility\", \"hidden\");\n resize.style(\"display\", brush.empty() ? \"none\" : null);\n var gUpdate = d3.transition(g), backgroundUpdate = d3.transition(background), range;\n if (x) {\n range = d3_scaleRange(x);\n backgroundUpdate.attr(\"x\", range[0]).attr(\"width\", range[1] - range[0]);\n redrawX(gUpdate);\n }\n if (y) {\n range = d3_scaleRange(y);\n backgroundUpdate.attr(\"y\", range[0]).attr(\"height\", range[1] - range[0]);\n redrawY(gUpdate);\n }\n redraw(gUpdate);\n });\n }\n brush.event = function(g) {\n g.each(function() {\n var event_ = event.of(this, arguments), extent1 = {\n x: xExtent,\n y: yExtent,\n i: xExtentDomain,\n j: yExtentDomain\n }, extent0 = this.__chart__ || extent1;\n this.__chart__ = extent1;\n if (d3_transitionInheritId) {\n d3.select(this).transition().each(\"start.brush\", function() {\n xExtentDomain = extent0.i;\n yExtentDomain = extent0.j;\n xExtent = extent0.x;\n yExtent = extent0.y;\n event_({\n type: \"brushstart\"\n });\n }).tween(\"brush:brush\", function() {\n var xi = d3_interpolateArray(xExtent, extent1.x), yi = d3_interpolateArray(yExtent, extent1.y);\n xExtentDomain = yExtentDomain = null;\n return function(t) {\n xExtent = extent1.x = xi(t);\n yExtent = extent1.y = yi(t);\n event_({\n type: \"brush\",\n mode: \"resize\"\n });\n };\n }).each(\"end.brush\", function() {\n xExtentDomain = extent1.i;\n yExtentDomain = extent1.j;\n event_({\n type: \"brush\",\n mode: \"resize\"\n });\n event_({\n type: \"brushend\"\n });\n });\n } else {\n event_({\n type: \"brushstart\"\n });\n event_({\n type: \"brush\",\n mode: \"resize\"\n });\n event_({\n type: \"brushend\"\n });\n }\n });\n };\n function redraw(g) {\n g.selectAll(\".resize\").attr(\"transform\", function(d) {\n return \"translate(\" + xExtent[+/e$/.test(d)] + \",\" + yExtent[+/^s/.test(d)] + \")\";\n });\n }\n function redrawX(g) {\n g.select(\".extent\").attr(\"x\", xExtent[0]);\n g.selectAll(\".extent,.n>rect,.s>rect\").attr(\"width\", xExtent[1] - xExtent[0]);\n }\n function redrawY(g) {\n g.select(\".extent\").attr(\"y\", yExtent[0]);\n g.selectAll(\".extent,.e>rect,.w>rect\").attr(\"height\", yExtent[1] - yExtent[0]);\n }\n function brushstart() {\n var target = this, eventTarget = d3.select(d3.event.target), event_ = event.of(target, arguments), g = d3.select(target), resizing = eventTarget.datum(), resizingX = !/^(n|s)$/.test(resizing) && x, resizingY = !/^(e|w)$/.test(resizing) && y, dragging = eventTarget.classed(\"extent\"), dragRestore = d3_event_dragSuppress(target), center, origin = d3.mouse(target), offset;\n var w = d3.select(d3_window(target)).on(\"keydown.brush\", keydown).on(\"keyup.brush\", keyup);\n if (d3.event.changedTouches) {\n w.on(\"touchmove.brush\", brushmove).on(\"touchend.brush\", brushend);\n } else {\n w.on(\"mousemove.brush\", brushmove).on(\"mouseup.brush\", brushend);\n }\n g.interrupt().selectAll(\"*\").interrupt();\n if (dragging) {\n origin[0] = xExtent[0] - origin[0];\n origin[1] = yExtent[0] - origin[1];\n } else if (resizing) {\n var ex = +/w$/.test(resizing), ey = +/^n/.test(resizing);\n offset = [ xExtent[1 - ex] - origin[0], yExtent[1 - ey] - origin[1] ];\n origin[0] = xExtent[ex];\n origin[1] = yExtent[ey];\n } else if (d3.event.altKey) center = origin.slice();\n g.style(\"pointer-events\", \"none\").selectAll(\".resize\").style(\"display\", null);\n d3.select(\"body\").style(\"cursor\", eventTarget.style(\"cursor\"));\n event_({\n type: \"brushstart\"\n });\n brushmove();\n function keydown() {\n if (d3.event.keyCode == 32) {\n if (!dragging) {\n center = null;\n origin[0] -= xExtent[1];\n origin[1] -= yExtent[1];\n dragging = 2;\n }\n d3_eventPreventDefault();\n }\n }\n function keyup() {\n if (d3.event.keyCode == 32 && dragging == 2) {\n origin[0] += xExtent[1];\n origin[1] += yExtent[1];\n dragging = 0;\n d3_eventPreventDefault();\n }\n }\n function brushmove() {\n var point = d3.mouse(target), moved = false;\n if (offset) {\n point[0] += offset[0];\n point[1] += offset[1];\n }\n if (!dragging) {\n if (d3.event.altKey) {\n if (!center) center = [ (xExtent[0] + xExtent[1]) / 2, (yExtent[0] + yExtent[1]) / 2 ];\n origin[0] = xExtent[+(point[0] < center[0])];\n origin[1] = yExtent[+(point[1] < center[1])];\n } else center = null;\n }\n if (resizingX && move1(point, x, 0)) {\n redrawX(g);\n moved = true;\n }\n if (resizingY && move1(point, y, 1)) {\n redrawY(g);\n moved = true;\n }\n if (moved) {\n redraw(g);\n event_({\n type: \"brush\",\n mode: dragging ? \"move\" : \"resize\"\n });\n }\n }\n function move1(point, scale, i) {\n var range = d3_scaleRange(scale), r0 = range[0], r1 = range[1], position = origin[i], extent = i ? yExtent : xExtent, size = extent[1] - extent[0], min, max;\n if (dragging) {\n r0 -= position;\n r1 -= size + position;\n }\n min = (i ? yClamp : xClamp) ? Math.max(r0, Math.min(r1, point[i])) : point[i];\n if (dragging) {\n max = (min += position) + size;\n } else {\n if (center) position = Math.max(r0, Math.min(r1, 2 * center[i] - min));\n if (position < min) {\n max = min;\n min = position;\n } else {\n max = position;\n }\n }\n if (extent[0] != min || extent[1] != max) {\n if (i) yExtentDomain = null; else xExtentDomain = null;\n extent[0] = min;\n extent[1] = max;\n return true;\n }\n }\n function brushend() {\n brushmove();\n g.style(\"pointer-events\", \"all\").selectAll(\".resize\").style(\"display\", brush.empty() ? \"none\" : null);\n d3.select(\"body\").style(\"cursor\", null);\n w.on(\"mousemove.brush\", null).on(\"mouseup.brush\", null).on(\"touchmove.brush\", null).on(\"touchend.brush\", null).on(\"keydown.brush\", null).on(\"keyup.brush\", null);\n dragRestore();\n event_({\n type: \"brushend\"\n });\n }\n }\n brush.x = function(z) {\n if (!arguments.length) return x;\n x = z;\n resizes = d3_svg_brushResizes[!x << 1 | !y];\n return brush;\n };\n brush.y = function(z) {\n if (!arguments.length) return y;\n y = z;\n resizes = d3_svg_brushResizes[!x << 1 | !y];\n return brush;\n };\n brush.clamp = function(z) {\n if (!arguments.length) return x && y ? [ xClamp, yClamp ] : x ? xClamp : y ? yClamp : null;\n if (x && y) xClamp = !!z[0], yClamp = !!z[1]; else if (x) xClamp = !!z; else if (y) yClamp = !!z;\n return brush;\n };\n brush.extent = function(z) {\n var x0, x1, y0, y1, t;\n if (!arguments.length) {\n if (x) {\n if (xExtentDomain) {\n x0 = xExtentDomain[0], x1 = xExtentDomain[1];\n } else {\n x0 = xExtent[0], x1 = xExtent[1];\n if (x.invert) x0 = x.invert(x0), x1 = x.invert(x1);\n if (x1 < x0) t = x0, x0 = x1, x1 = t;\n }\n }\n if (y) {\n if (yExtentDomain) {\n y0 = yExtentDomain[0], y1 = yExtentDomain[1];\n } else {\n y0 = yExtent[0], y1 = yExtent[1];\n if (y.invert) y0 = y.invert(y0), y1 = y.invert(y1);\n if (y1 < y0) t = y0, y0 = y1, y1 = t;\n }\n }\n return x && y ? [ [ x0, y0 ], [ x1, y1 ] ] : x ? [ x0, x1 ] : y && [ y0, y1 ];\n }\n if (x) {\n x0 = z[0], x1 = z[1];\n if (y) x0 = x0[0], x1 = x1[0];\n xExtentDomain = [ x0, x1 ];\n if (x.invert) x0 = x(x0), x1 = x(x1);\n if (x1 < x0) t = x0, x0 = x1, x1 = t;\n if (x0 != xExtent[0] || x1 != xExtent[1]) xExtent = [ x0, x1 ];\n }\n if (y) {\n y0 = z[0], y1 = z[1];\n if (x) y0 = y0[1], y1 = y1[1];\n yExtentDomain = [ y0, y1 ];\n if (y.invert) y0 = y(y0), y1 = y(y1);\n if (y1 < y0) t = y0, y0 = y1, y1 = t;\n if (y0 != yExtent[0] || y1 != yExtent[1]) yExtent = [ y0, y1 ];\n }\n return brush;\n };\n brush.clear = function() {\n if (!brush.empty()) {\n xExtent = [ 0, 0 ], yExtent = [ 0, 0 ];\n xExtentDomain = yExtentDomain = null;\n }\n return brush;\n };\n brush.empty = function() {\n return !!x && xExtent[0] == xExtent[1] || !!y && yExtent[0] == yExtent[1];\n };\n return d3.rebind(brush, event, \"on\");\n };\n var d3_svg_brushCursor = {\n n: \"ns-resize\",\n e: \"ew-resize\",\n s: \"ns-resize\",\n w: \"ew-resize\",\n nw: \"nwse-resize\",\n ne: \"nesw-resize\",\n se: \"nwse-resize\",\n sw: \"nesw-resize\"\n };\n var d3_svg_brushResizes = [ [ \"n\", \"e\", \"s\", \"w\", \"nw\", \"ne\", \"se\", \"sw\" ], [ \"e\", \"w\" ], [ \"n\", \"s\" ], [] ];\n var d3_time_format = d3_time.format = d3_locale_enUS.timeFormat;\n var d3_time_formatUtc = d3_time_format.utc;\n var d3_time_formatIso = d3_time_formatUtc(\"%Y-%m-%dT%H:%M:%S.%LZ\");\n d3_time_format.iso = Date.prototype.toISOString && +new Date(\"2000-01-01T00:00:00.000Z\") ? d3_time_formatIsoNative : d3_time_formatIso;\n function d3_time_formatIsoNative(date) {\n return date.toISOString();\n }\n d3_time_formatIsoNative.parse = function(string) {\n var date = new Date(string);\n return isNaN(date) ? null : date;\n };\n d3_time_formatIsoNative.toString = d3_time_formatIso.toString;\n d3_time.second = d3_time_interval(function(date) {\n return new d3_date(Math.floor(date / 1e3) * 1e3);\n }, function(date, offset) {\n date.setTime(date.getTime() + Math.floor(offset) * 1e3);\n }, function(date) {\n return date.getSeconds();\n });\n d3_time.seconds = d3_time.second.range;\n d3_time.seconds.utc = d3_time.second.utc.range;\n d3_time.minute = d3_time_interval(function(date) {\n return new d3_date(Math.floor(date / 6e4) * 6e4);\n }, function(date, offset) {\n date.setTime(date.getTime() + Math.floor(offset) * 6e4);\n }, function(date) {\n return date.getMinutes();\n });\n d3_time.minutes = d3_time.minute.range;\n d3_time.minutes.utc = d3_time.minute.utc.range;\n d3_time.hour = d3_time_interval(function(date) {\n var timezone = date.getTimezoneOffset() / 60;\n return new d3_date((Math.floor(date / 36e5 - timezone) + timezone) * 36e5);\n }, function(date, offset) {\n date.setTime(date.getTime() + Math.floor(offset) * 36e5);\n }, function(date) {\n return date.getHours();\n });\n d3_time.hours = d3_time.hour.range;\n d3_time.hours.utc = d3_time.hour.utc.range;\n d3_time.month = d3_time_interval(function(date) {\n date = d3_time.day(date);\n date.setDate(1);\n return date;\n }, function(date, offset) {\n date.setMonth(date.getMonth() + offset);\n }, function(date) {\n return date.getMonth();\n });\n d3_time.months = d3_time.month.range;\n d3_time.months.utc = d3_time.month.utc.range;\n function d3_time_scale(linear, methods, format) {\n function scale(x) {\n return linear(x);\n }\n scale.invert = function(x) {\n return d3_time_scaleDate(linear.invert(x));\n };\n scale.domain = function(x) {\n if (!arguments.length) return linear.domain().map(d3_time_scaleDate);\n linear.domain(x);\n return scale;\n };\n function tickMethod(extent, count) {\n var span = extent[1] - extent[0], target = span / count, i = d3.bisect(d3_time_scaleSteps, target);\n return i == d3_time_scaleSteps.length ? [ methods.year, d3_scale_linearTickRange(extent.map(function(d) {\n return d / 31536e6;\n }), count)[2] ] : !i ? [ d3_time_scaleMilliseconds, d3_scale_linearTickRange(extent, count)[2] ] : methods[target / d3_time_scaleSteps[i - 1] < d3_time_scaleSteps[i] / target ? i - 1 : i];\n }\n scale.nice = function(interval, skip) {\n var domain = scale.domain(), extent = d3_scaleExtent(domain), method = interval == null ? tickMethod(extent, 10) : typeof interval === \"number\" && tickMethod(extent, interval);\n if (method) interval = method[0], skip = method[1];\n function skipped(date) {\n return !isNaN(date) && !interval.range(date, d3_time_scaleDate(+date + 1), skip).length;\n }\n return scale.domain(d3_scale_nice(domain, skip > 1 ? {\n floor: function(date) {\n while (skipped(date = interval.floor(date))) date = d3_time_scaleDate(date - 1);\n return date;\n },\n ceil: function(date) {\n while (skipped(date = interval.ceil(date))) date = d3_time_scaleDate(+date + 1);\n return date;\n }\n } : interval));\n };\n scale.ticks = function(interval, skip) {\n var extent = d3_scaleExtent(scale.domain()), method = interval == null ? tickMethod(extent, 10) : typeof interval === \"number\" ? tickMethod(extent, interval) : !interval.range && [ {\n range: interval\n }, skip ];\n if (method) interval = method[0], skip = method[1];\n return interval.range(extent[0], d3_time_scaleDate(+extent[1] + 1), skip < 1 ? 1 : skip);\n };\n scale.tickFormat = function() {\n return format;\n };\n scale.copy = function() {\n return d3_time_scale(linear.copy(), methods, format);\n };\n return d3_scale_linearRebind(scale, linear);\n }\n function d3_time_scaleDate(t) {\n return new Date(t);\n }\n var d3_time_scaleSteps = [ 1e3, 5e3, 15e3, 3e4, 6e4, 3e5, 9e5, 18e5, 36e5, 108e5, 216e5, 432e5, 864e5, 1728e5, 6048e5, 2592e6, 7776e6, 31536e6 ];\n var d3_time_scaleLocalMethods = [ [ d3_time.second, 1 ], [ d3_time.second, 5 ], [ d3_time.second, 15 ], [ d3_time.second, 30 ], [ d3_time.minute, 1 ], [ d3_time.minute, 5 ], [ d3_time.minute, 15 ], [ d3_time.minute, 30 ], [ d3_time.hour, 1 ], [ d3_time.hour, 3 ], [ d3_time.hour, 6 ], [ d3_time.hour, 12 ], [ d3_time.day, 1 ], [ d3_time.day, 2 ], [ d3_time.week, 1 ], [ d3_time.month, 1 ], [ d3_time.month, 3 ], [ d3_time.year, 1 ] ];\n var d3_time_scaleLocalFormat = d3_time_format.multi([ [ \".%L\", function(d) {\n return d.getMilliseconds();\n } ], [ \":%S\", function(d) {\n return d.getSeconds();\n } ], [ \"%I:%M\", function(d) {\n return d.getMinutes();\n } ], [ \"%I %p\", function(d) {\n return d.getHours();\n } ], [ \"%a %d\", function(d) {\n return d.getDay() && d.getDate() != 1;\n } ], [ \"%b %d\", function(d) {\n return d.getDate() != 1;\n } ], [ \"%B\", function(d) {\n return d.getMonth();\n } ], [ \"%Y\", d3_true ] ]);\n var d3_time_scaleMilliseconds = {\n range: function(start, stop, step) {\n return d3.range(Math.ceil(start / step) * step, +stop, step).map(d3_time_scaleDate);\n },\n floor: d3_identity,\n ceil: d3_identity\n };\n d3_time_scaleLocalMethods.year = d3_time.year;\n d3_time.scale = function() {\n return d3_time_scale(d3.scale.linear(), d3_time_scaleLocalMethods, d3_time_scaleLocalFormat);\n };\n var d3_time_scaleUtcMethods = d3_time_scaleLocalMethods.map(function(m) {\n return [ m[0].utc, m[1] ];\n });\n var d3_time_scaleUtcFormat = d3_time_formatUtc.multi([ [ \".%L\", function(d) {\n return d.getUTCMilliseconds();\n } ], [ \":%S\", function(d) {\n return d.getUTCSeconds();\n } ], [ \"%I:%M\", function(d) {\n return d.getUTCMinutes();\n } ], [ \"%I %p\", function(d) {\n return d.getUTCHours();\n } ], [ \"%a %d\", function(d) {\n return d.getUTCDay() && d.getUTCDate() != 1;\n } ], [ \"%b %d\", function(d) {\n return d.getUTCDate() != 1;\n } ], [ \"%B\", function(d) {\n return d.getUTCMonth();\n } ], [ \"%Y\", d3_true ] ]);\n d3_time_scaleUtcMethods.year = d3_time.year.utc;\n d3_time.scale.utc = function() {\n return d3_time_scale(d3.scale.linear(), d3_time_scaleUtcMethods, d3_time_scaleUtcFormat);\n };\n d3.text = d3_xhrType(function(request) {\n return request.responseText;\n });\n d3.json = function(url, callback) {\n return d3_xhr(url, \"application/json\", d3_json, callback);\n };\n function d3_json(request) {\n return JSON.parse(request.responseText);\n }\n d3.html = function(url, callback) {\n return d3_xhr(url, \"text/html\", d3_html, callback);\n };\n function d3_html(request) {\n var range = d3_document.createRange();\n range.selectNode(d3_document.body);\n return range.createContextualFragment(request.responseText);\n }\n d3.xml = d3_xhrType(function(request) {\n return request.responseXML;\n });\n if (typeof define === \"function\" && define.amd) this.d3 = d3, define(d3); else if (typeof module === \"object\" && module.exports) module.exports = d3; else this.d3 = d3;\n}();", - "/**\n * Helpers.\n */\n\nvar s = 1000\nvar m = s * 60\nvar h = m * 60\nvar d = h * 24\nvar y = d * 365.25\n\n/**\n * Parse or format the given `val`.\n *\n * Options:\n *\n * - `long` verbose formatting [false]\n *\n * @param {String|Number} val\n * @param {Object} options\n * @throws {Error} throw an error if val is not a non-empty string or a number\n * @return {String|Number}\n * @api public\n */\n\nmodule.exports = function (val, options) {\n options = options || {}\n var type = typeof val\n if (type === 'string' && val.length > 0) {\n return parse(val)\n } else if (type === 'number' && isNaN(val) === false) {\n return options.long ?\n\t\t\tfmtLong(val) :\n\t\t\tfmtShort(val)\n }\n throw new Error('val is not a non-empty string or a valid number. val=' + JSON.stringify(val))\n}\n\n/**\n * Parse the given `str` and return milliseconds.\n *\n * @param {String} str\n * @return {Number}\n * @api private\n */\n\nfunction parse(str) {\n str = String(str)\n if (str.length > 10000) {\n return\n }\n var match = /^((?:\\d+)?\\.?\\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|years?|yrs?|y)?$/i.exec(str)\n if (!match) {\n return\n }\n var n = parseFloat(match[1])\n var type = (match[2] || 'ms').toLowerCase()\n switch (type) {\n case 'years':\n case 'year':\n case 'yrs':\n case 'yr':\n case 'y':\n return n * y\n case 'days':\n case 'day':\n case 'd':\n return n * d\n case 'hours':\n case 'hour':\n case 'hrs':\n case 'hr':\n case 'h':\n return n * h\n case 'minutes':\n case 'minute':\n case 'mins':\n case 'min':\n case 'm':\n return n * m\n case 'seconds':\n case 'second':\n case 'secs':\n case 'sec':\n case 's':\n return n * s\n case 'milliseconds':\n case 'millisecond':\n case 'msecs':\n case 'msec':\n case 'ms':\n return n\n default:\n return undefined\n }\n}\n\n/**\n * Short format for `ms`.\n *\n * @param {Number} ms\n * @return {String}\n * @api private\n */\n\nfunction fmtShort(ms) {\n if (ms >= d) {\n return Math.round(ms / d) + 'd'\n }\n if (ms >= h) {\n return Math.round(ms / h) + 'h'\n }\n if (ms >= m) {\n return Math.round(ms / m) + 'm'\n }\n if (ms >= s) {\n return Math.round(ms / s) + 's'\n }\n return ms + 'ms'\n}\n\n/**\n * Long format for `ms`.\n *\n * @param {Number} ms\n * @return {String}\n * @api private\n */\n\nfunction fmtLong(ms) {\n return plural(ms, d, 'day') ||\n plural(ms, h, 'hour') ||\n plural(ms, m, 'minute') ||\n plural(ms, s, 'second') ||\n ms + ' ms'\n}\n\n/**\n * Pluralization helper.\n */\n\nfunction plural(ms, n, name) {\n if (ms < n) {\n return\n }\n if (ms < n * 1.5) {\n return Math.floor(ms / n) + ' ' + name\n }\n return Math.ceil(ms / n) + ' ' + name + 's'\n}\n", - "/**\n * This is the web browser implementation of `debug()`.\n *\n * Expose `debug()` as the module.\n */\n\nexports = module.exports = require('./debug');\nexports.log = log;\nexports.formatArgs = formatArgs;\nexports.save = save;\nexports.load = load;\nexports.useColors = useColors;\nexports.storage = 'undefined' != typeof chrome\n && 'undefined' != typeof chrome.storage\n ? chrome.storage.local\n : localstorage();\n\n/**\n * Colors.\n */\n\nexports.colors = [\n 'lightseagreen',\n 'forestgreen',\n 'goldenrod',\n 'dodgerblue',\n 'darkorchid',\n 'crimson'\n];\n\n/**\n * Currently only WebKit-based Web Inspectors, Firefox >= v31,\n * and the Firebug extension (any Firefox version) are known\n * to support \"%c\" CSS customizations.\n *\n * TODO: add a `localStorage` variable to explicitly enable/disable colors\n */\n\nfunction useColors() {\n // NB: In an Electron preload script, document will be defined but not fully\n // initialized. Since we know we're in Chrome, we'll just detect this case\n // explicitly\n if (typeof window !== 'undefined' && window && typeof window.process !== 'undefined' && window.process.type === 'renderer') {\n return true;\n }\n\n // is webkit? http://stackoverflow.com/a/16459606/376773\n // document is undefined in react-native: https://github.com/facebook/react-native/pull/1632\n return (typeof document !== 'undefined' && document && 'WebkitAppearance' in document.documentElement.style) ||\n // is firebug? http://stackoverflow.com/a/398120/376773\n (typeof window !== 'undefined' && window && window.console && (console.firebug || (console.exception && console.table))) ||\n // is firefox >= v31?\n // https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages\n (typeof navigator !== 'undefined' && navigator && navigator.userAgent && navigator.userAgent.toLowerCase().match(/firefox\\/(\\d+)/) && parseInt(RegExp.$1, 10) >= 31) ||\n // double check webkit in userAgent just in case we are in a worker\n (typeof navigator !== 'undefined' && navigator && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\\/(\\d+)/));\n}\n\n/**\n * Map %j to `JSON.stringify()`, since no Web Inspectors do that by default.\n */\n\nexports.formatters.j = function(v) {\n try {\n return JSON.stringify(v);\n } catch (err) {\n return '[UnexpectedJSONParseError]: ' + err.message;\n }\n};\n\n\n/**\n * Colorize log arguments if enabled.\n *\n * @api public\n */\n\nfunction formatArgs(args) {\n var useColors = this.useColors;\n\n args[0] = (useColors ? '%c' : '')\n + this.namespace\n + (useColors ? ' %c' : ' ')\n + args[0]\n + (useColors ? '%c ' : ' ')\n + '+' + exports.humanize(this.diff);\n\n if (!useColors) return;\n\n var c = 'color: ' + this.color;\n args.splice(1, 0, c, 'color: inherit')\n\n // the final \"%c\" is somewhat tricky, because there could be other\n // arguments passed either before or after the %c, so we need to\n // figure out the correct index to insert the CSS into\n var index = 0;\n var lastC = 0;\n args[0].replace(/%[a-zA-Z%]/g, function(match) {\n if ('%%' === match) return;\n index++;\n if ('%c' === match) {\n // we only are interested in the *last* %c\n // (the user may have provided their own)\n lastC = index;\n }\n });\n\n args.splice(lastC, 0, c);\n}\n\n/**\n * Invokes `console.log()` when available.\n * No-op when `console.log` is not a \"function\".\n *\n * @api public\n */\n\nfunction log() {\n // this hackery is required for IE8/9, where\n // the `console.log` function doesn't have 'apply'\n return 'object' === typeof console\n && console.log\n && Function.prototype.apply.call(console.log, console, arguments);\n}\n\n/**\n * Save `namespaces`.\n *\n * @param {String} namespaces\n * @api private\n */\n\nfunction save(namespaces) {\n try {\n if (null == namespaces) {\n exports.storage.removeItem('debug');\n } else {\n exports.storage.debug = namespaces;\n }\n } catch(e) {}\n}\n\n/**\n * Load `namespaces`.\n *\n * @return {String} returns the previously persisted debug modes\n * @api private\n */\n\nfunction load() {\n try {\n return exports.storage.debug;\n } catch(e) {}\n\n // If debug isn't set in LS, and we're in Electron, try to load $DEBUG\n if (typeof process !== 'undefined' && 'env' in process) {\n return process.env.DEBUG;\n }\n}\n\n/**\n * Enable namespaces listed in `localStorage.debug` initially.\n */\n\nexports.enable(load());\n\n/**\n * Localstorage attempts to return the localstorage.\n *\n * This is necessary because safari throws\n * when a user disables cookies/localstorage\n * and you attempt to access it.\n *\n * @return {LocalStorage}\n * @api private\n */\n\nfunction localstorage() {\n try {\n return window.localStorage;\n } catch (e) {}\n}\n", - "\n/**\n * This is the common logic for both the Node.js and web browser\n * implementations of `debug()`.\n *\n * Expose `debug()` as the module.\n */\n\nexports = module.exports = createDebug.debug = createDebug['default'] = createDebug;\nexports.coerce = coerce;\nexports.disable = disable;\nexports.enable = enable;\nexports.enabled = enabled;\nexports.humanize = require('ms');\n\n/**\n * The currently active debug mode names, and names to skip.\n */\n\nexports.names = [];\nexports.skips = [];\n\n/**\n * Map of special \"%n\" handling functions, for the debug \"format\" argument.\n *\n * Valid key names are a single, lower or upper-case letter, i.e. \"n\" and \"N\".\n */\n\nexports.formatters = {};\n\n/**\n * Previous log timestamp.\n */\n\nvar prevTime;\n\n/**\n * Select a color.\n * @param {String} namespace\n * @return {Number}\n * @api private\n */\n\nfunction selectColor(namespace) {\n var hash = 0, i;\n\n for (i in namespace) {\n hash = ((hash << 5) - hash) + namespace.charCodeAt(i);\n hash |= 0; // Convert to 32bit integer\n }\n\n return exports.colors[Math.abs(hash) % exports.colors.length];\n}\n\n/**\n * Create a debugger with the given `namespace`.\n *\n * @param {String} namespace\n * @return {Function}\n * @api public\n */\n\nfunction createDebug(namespace) {\n\n function debug() {\n // disabled?\n if (!debug.enabled) return;\n\n var self = debug;\n\n // set `diff` timestamp\n var curr = +new Date();\n var ms = curr - (prevTime || curr);\n self.diff = ms;\n self.prev = prevTime;\n self.curr = curr;\n prevTime = curr;\n\n // turn the `arguments` into a proper Array\n var args = new Array(arguments.length);\n for (var i = 0; i < args.length; i++) {\n args[i] = arguments[i];\n }\n\n args[0] = exports.coerce(args[0]);\n\n if ('string' !== typeof args[0]) {\n // anything else let's inspect with %O\n args.unshift('%O');\n }\n\n // apply any `formatters` transformations\n var index = 0;\n args[0] = args[0].replace(/%([a-zA-Z%])/g, function(match, format) {\n // if we encounter an escaped % then don't increase the array index\n if (match === '%%') return match;\n index++;\n var formatter = exports.formatters[format];\n if ('function' === typeof formatter) {\n var val = args[index];\n match = formatter.call(self, val);\n\n // now we need to remove `args[index]` since it's inlined in the `format`\n args.splice(index, 1);\n index--;\n }\n return match;\n });\n\n // apply env-specific formatting (colors, etc.)\n exports.formatArgs.call(self, args);\n\n var logFn = debug.log || exports.log || console.log.bind(console);\n logFn.apply(self, args);\n }\n\n debug.namespace = namespace;\n debug.enabled = exports.enabled(namespace);\n debug.useColors = exports.useColors();\n debug.color = selectColor(namespace);\n\n // env-specific initialization logic for debug instances\n if ('function' === typeof exports.init) {\n exports.init(debug);\n }\n\n return debug;\n}\n\n/**\n * Enables a debug mode by namespaces. This can include modes\n * separated by a colon and wildcards.\n *\n * @param {String} namespaces\n * @api public\n */\n\nfunction enable(namespaces) {\n exports.save(namespaces);\n\n exports.names = [];\n exports.skips = [];\n\n var split = (namespaces || '').split(/[\\s,]+/);\n var len = split.length;\n\n for (var i = 0; i < len; i++) {\n if (!split[i]) continue; // ignore empty strings\n namespaces = split[i].replace(/\\*/g, '.*?');\n if (namespaces[0] === '-') {\n exports.skips.push(new RegExp('^' + namespaces.substr(1) + '$'));\n } else {\n exports.names.push(new RegExp('^' + namespaces + '$'));\n }\n }\n}\n\n/**\n * Disable debug output.\n *\n * @api public\n */\n\nfunction disable() {\n exports.enable('');\n}\n\n/**\n * Returns true if the given mode name is enabled, false otherwise.\n *\n * @param {String} name\n * @return {Boolean}\n * @api public\n */\n\nfunction enabled(name) {\n var i, len;\n for (i = 0, len = exports.skips.length; i < len; i++) {\n if (exports.skips[i].test(name)) {\n return false;\n }\n }\n for (i = 0, len = exports.names.length; i < len; i++) {\n if (exports.names[i].test(name)) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * Coerce `val`.\n *\n * @param {Mixed} val\n * @return {Mixed}\n * @api private\n */\n\nfunction coerce(val) {\n if (val instanceof Error) return val.stack || val.message;\n return val;\n}\n", - "/**\n * Expose `PriorityQueue`.\n */\nmodule.exports = PriorityQueue;\n\n/**\n * Initializes a new empty `PriorityQueue` with the given `comparator(a, b)`\n * function, uses `.DEFAULT_COMPARATOR()` when no function is provided.\n *\n * The comparator function must return a positive number when `a > b`, 0 when\n * `a == b` and a negative number when `a < b`.\n *\n * @param {Function}\n * @return {PriorityQueue}\n * @api public\n */\nfunction PriorityQueue(comparator) {\n this._comparator = comparator || PriorityQueue.DEFAULT_COMPARATOR;\n this._elements = [];\n}\n\n/**\n * Compares `a` and `b`, when `a > b` it returns a positive number, when\n * it returns 0 and when `a < b` it returns a negative number.\n *\n * @param {String|Number} a\n * @param {String|Number} b\n * @return {Number}\n * @api public\n */\nPriorityQueue.DEFAULT_COMPARATOR = function(a, b) {\n if (typeof a === 'number' && typeof b === 'number') {\n return a - b;\n } else {\n a = a.toString();\n b = b.toString();\n\n if (a == b) return 0;\n\n return (a > b) ? 1 : -1;\n }\n};\n\n/**\n * Returns whether the priority queue is empty or not.\n *\n * @return {Boolean}\n * @api public\n */\nPriorityQueue.prototype.isEmpty = function() {\n return this.size() === 0;\n};\n\n/**\n * Peeks at the top element of the priority queue.\n *\n * @return {Object}\n * @throws {Error} when the queue is empty.\n * @api public\n */\nPriorityQueue.prototype.peek = function() {\n if (this.isEmpty()) throw new Error('PriorityQueue is empty');\n\n return this._elements[0];\n};\n\n/**\n * Dequeues the top element of the priority queue.\n *\n * @return {Object}\n * @throws {Error} when the queue is empty.\n * @api public\n */\nPriorityQueue.prototype.deq = function() {\n var first = this.peek();\n var last = this._elements.pop();\n var size = this.size();\n\n if (size === 0) return first;\n\n this._elements[0] = last;\n var current = 0;\n\n while (current < size) {\n var largest = current;\n var left = (2 * current) + 1;\n var right = (2 * current) + 2;\n\n if (left < size && this._compare(left, largest) >= 0) {\n largest = left;\n }\n\n if (right < size && this._compare(right, largest) >= 0) {\n largest = right;\n }\n\n if (largest === current) break;\n\n this._swap(largest, current);\n current = largest;\n }\n\n return first;\n};\n\n/**\n * Enqueues the `element` at the priority queue and returns its new size.\n *\n * @param {Object} element\n * @return {Number}\n * @api public\n */\nPriorityQueue.prototype.enq = function(element) {\n var size = this._elements.push(element);\n var current = size - 1;\n\n while (current > 0) {\n var parent = Math.floor((current - 1) / 2);\n\n if (this._compare(current, parent) <= 0) break;\n\n this._swap(parent, current);\n current = parent;\n }\n\n return size;\n};\n\n/**\n * Returns the size of the priority queue.\n *\n * @return {Number}\n * @api public\n */\nPriorityQueue.prototype.size = function() {\n return this._elements.length;\n};\n\n/**\n * Iterates over queue elements\n *\n * @param {Function} fn\n */\nPriorityQueue.prototype.forEach = function(fn) {\n return this._elements.forEach(fn);\n};\n\n/**\n * Compares the values at position `a` and `b` in the priority queue using its\n * comparator function.\n *\n * @param {Number} a\n * @param {Number} b\n * @return {Number}\n * @api private\n */\nPriorityQueue.prototype._compare = function(a, b) {\n return this._comparator(this._elements[a], this._elements[b]);\n};\n\n/**\n * Swaps the values at position `a` and `b` in the priority queue.\n *\n * @param {Number} a\n * @param {Number} b\n * @api private\n */\nPriorityQueue.prototype._swap = function(a, b) {\n var aux = this._elements[a];\n this._elements[a] = this._elements[b];\n this._elements[b] = aux;\n};\n", - "\n/**\n * Module Dependencies\n */\n\nvar expr;\ntry {\n expr = require('props');\n} catch(e) {\n expr = require('component-props');\n}\n\n/**\n * Expose `toFunction()`.\n */\n\nmodule.exports = toFunction;\n\n/**\n * Convert `obj` to a `Function`.\n *\n * @param {Mixed} obj\n * @return {Function}\n * @api private\n */\n\nfunction toFunction(obj) {\n switch ({}.toString.call(obj)) {\n case '[object Object]':\n return objectToFunction(obj);\n case '[object Function]':\n return obj;\n case '[object String]':\n return stringToFunction(obj);\n case '[object RegExp]':\n return regexpToFunction(obj);\n default:\n return defaultToFunction(obj);\n }\n}\n\n/**\n * Default to strict equality.\n *\n * @param {Mixed} val\n * @return {Function}\n * @api private\n */\n\nfunction defaultToFunction(val) {\n return function(obj){\n return val === obj;\n };\n}\n\n/**\n * Convert `re` to a function.\n *\n * @param {RegExp} re\n * @return {Function}\n * @api private\n */\n\nfunction regexpToFunction(re) {\n return function(obj){\n return re.test(obj);\n };\n}\n\n/**\n * Convert property `str` to a function.\n *\n * @param {String} str\n * @return {Function}\n * @api private\n */\n\nfunction stringToFunction(str) {\n // immediate such as \"> 20\"\n if (/^ *\\W+/.test(str)) return new Function('_', 'return _ ' + str);\n\n // properties such as \"name.first\" or \"age > 18\" or \"age > 18 && age < 36\"\n return new Function('_', 'return ' + get(str));\n}\n\n/**\n * Convert `object` to a function.\n *\n * @param {Object} object\n * @return {Function}\n * @api private\n */\n\nfunction objectToFunction(obj) {\n var match = {};\n for (var key in obj) {\n match[key] = typeof obj[key] === 'string'\n ? defaultToFunction(obj[key])\n : toFunction(obj[key]);\n }\n return function(val){\n if (typeof val !== 'object') return false;\n for (var key in match) {\n if (!(key in val)) return false;\n if (!match[key](val[key])) return false;\n }\n return true;\n };\n}\n\n/**\n * Built the getter function. Supports getter style functions\n *\n * @param {String} str\n * @return {String}\n * @api private\n */\n\nfunction get(str) {\n var props = expr(str);\n if (!props.length) return '_.' + str;\n\n var val, i, prop;\n for (i = 0; i < props.length; i++) {\n prop = props[i];\n val = '_.' + prop;\n val = \"('function' == typeof \" + val + \" ? \" + val + \"() : \" + val + \")\";\n\n // mimic negative lookbehind to avoid problems with nested properties\n str = stripNested(prop, str, val);\n }\n\n return str;\n}\n\n/**\n * Mimic negative lookbehind to avoid problems with nested properties.\n *\n * See: http://blog.stevenlevithan.com/archives/mimic-lookbehind-javascript\n *\n * @param {String} prop\n * @param {String} str\n * @param {String} val\n * @return {String}\n * @api private\n */\n\nfunction stripNested (prop, str, val) {\n return str.replace(new RegExp('(\\\\.)?' + prop, 'g'), function($0, $1) {\n return $1 ? $0 : val;\n });\n}\n" - ] -} \ No newline at end of file