diff --git a/README.md b/README.md
index d4960a78a6..7fae0a34aa 100644
--- a/README.md
+++ b/README.md
@@ -1749,11 +1749,19 @@ In addition to the [standard mark options](#marks), the following optional chann
If either of the **x** or **y** channels are not specified, the corresponding position is controlled by the **frameAnchor** option.
-The following options are also supported:
+The following constant options are also supported:
+* **shape** - the shape of the vector; defaults to *arrow*
+* **r** - a radius in pixels; defaults to 3.5
* **anchor** - one of *start*, *middle*, or *end*; defaults to *middle*
* **frameAnchor** - the [frame anchor](#frameanchor); defaults to *middle*
+The **shape** option controls the visual appearance (path geometry) of the vector and supports the following values:
+
+* *arrow* (default) - an arrow with head size proportional to its length
+* *spike* - an isosceles triangle with open base
+* any object with a **draw** method; it receives a *context*, *length*, and *radius*
+
If the **anchor** is *start*, the arrow will start at the given *xy* position and point in the direction given by the rotation angle. If the **anchor** is *end*, the arrow will maintain the same orientation, but be positioned such that it ends in the given *xy* position. If the **anchor** is *middle*, the arrow will be likewise be positioned such that its midpoint intersects the given *xy* position.
If the **x** channel is not specified, vectors will be horizontally centered in the plot (or facet). Likewise if the **y** channel is not specified, vectors will be vertically centered in the plot (or facet). Typically either *x*, *y*, or both are specified.
@@ -1792,6 +1800,14 @@ Equivalent to [Plot.vector](#plotvectordata-options) except that if the **y** op
+#### Plot.spike(*data*, *options*)
+
+
+
+Equivalent to [Plot.vector](#plotvectordata-options) except that the **shape** defaults to *spike*, the **stroke** defaults to *currentColor*, the **strokeWidth** defaults to 1, the **fill** defaults to **stroke**, the **fillOpacity** defaults to 0.3, and the **anchor** defaults to *start*.
+
+
+
## Decorations
Decorations are static marks that do not represent data. Currently this includes only [Plot.frame](#frame), although internally Plot’s axes are implemented as decorations and may in the future be exposed here for more flexible configuration.
@@ -2064,6 +2080,32 @@ Bins on *y*. Also groups on *x* and first channel of *z*, *fill*, or *stroke*, i
+### Centroid
+
+#### Plot.centroid(*options*)
+
+
+
+The centroid initializer derives **x** and **y** channels representing the planar (projected) centroids for the the given GeoJSON geometry. If the **geometry** option is not specified, the mark’s data is assumed to be GeoJSON objects.
+
+```js
+Plot.dot(regions.features, Plot.centroid()).plot({projection: "reflect-y"})
+```
+
+
+
+#### Plot.geoCentroid(*options*)
+
+
+
+The geoCentroid transform derives **x** and **y** channels representing the spherical centroids for the the given GeoJSON geometry. If the **geometry** option is not specified, the mark’s data is assumed to be GeoJSON objects.
+
+```js
+Plot.dot(counties.features, Plot.geoCentroid()).plot({projection: "albers-usa"})
+```
+
+
+
### Group
[
](https://observablehq.com/@observablehq/plot-group)
diff --git a/src/index.js b/src/index.js
index aebeac3b0e..1f25d2b7d9 100644
--- a/src/index.js
+++ b/src/index.js
@@ -19,10 +19,11 @@ export {RuleX, RuleY, ruleX, ruleY} from "./marks/rule.js";
export {Text, text, textX, textY} from "./marks/text.js";
export {TickX, TickY, tickX, tickY} from "./marks/tick.js";
export {tree, cluster} from "./marks/tree.js";
-export {Vector, vector, vectorX, vectorY} from "./marks/vector.js";
+export {Vector, vector, vectorX, vectorY, spike} from "./marks/vector.js";
export {valueof, column} from "./options.js";
export {filter, reverse, sort, shuffle, basic as transform, initializer} from "./transforms/basic.js";
export {bin, binX, binY} from "./transforms/bin.js";
+export {centroid, geoCentroid} from "./transforms/centroid.js";
export {dodgeX, dodgeY} from "./transforms/dodge.js";
export {group, groupX, groupY, groupZ} from "./transforms/group.js";
export {hexbin} from "./transforms/hexbin.js";
diff --git a/src/marks/dot.js b/src/marks/dot.js
index d6198ad2c1..4109260fc7 100644
--- a/src/marks/dot.js
+++ b/src/marks/dot.js
@@ -11,6 +11,7 @@ import {
applyTransform
} from "../style.js";
import {maybeSymbolChannel} from "../symbols.js";
+import {template} from "../template.js";
import {sort} from "../transforms/basic.js";
import {maybeIntervalMidX, maybeIntervalMidY} from "../transforms/interval.js";
@@ -66,9 +67,10 @@ export class Dot extends Mark {
render(index, scales, channels, dimensions, context) {
const {x, y} = scales;
const {x: X, y: Y, r: R, rotate: A, symbol: S} = channels;
+ const {r, rotate, symbol} = this;
const [cx, cy] = applyFrameAnchor(this, dimensions);
const circle = this.symbol === symbolCircle;
- const {r} = this;
+ const size = R ? undefined : r * r * Math.PI;
if (negative(r)) index = [];
return create("svg:g", context)
.call(applyIndirectStyles, this, scales, dimensions, context)
@@ -89,29 +91,39 @@ export class Dot extends Mark {
.attr("r", R ? (i) => R[i] : r);
}
: (selection) => {
- const translate =
- X && Y
- ? (i) => `translate(${X[i]},${Y[i]})`
- : X
- ? (i) => `translate(${X[i]},${cy})`
- : Y
- ? (i) => `translate(${cx},${Y[i]})`
- : () => `translate(${cx},${cy})`;
selection
.attr(
"transform",
- A
- ? (i) => `${translate(i)} rotate(${A[i]})`
- : this.rotate
- ? (i) => `${translate(i)} rotate(${this.rotate})`
- : translate
+ template`translate(${X ? (i) => X[i] : cx},${Y ? (i) => Y[i] : cy})${
+ A ? (i) => ` rotate(${A[i]})` : rotate ? ` rotate(${rotate})` : ``
+ }`
)
- .attr("d", (i) => {
- const p = path(),
- radius = R ? R[i] : r;
- (S ? S[i] : this.symbol).draw(p, radius * radius * Math.PI);
- return p;
- });
+ .attr(
+ "d",
+ R && S
+ ? (i) => {
+ const p = path();
+ S[i].draw(p, R[i] * R[i] * Math.PI);
+ return p;
+ }
+ : R
+ ? (i) => {
+ const p = path();
+ symbol.draw(p, R[i] * R[i] * Math.PI);
+ return p;
+ }
+ : S
+ ? (i) => {
+ const p = path();
+ S[i].draw(p, size);
+ return p;
+ }
+ : (() => {
+ const p = path();
+ symbol.draw(p, size);
+ return p;
+ })()
+ );
}
)
.call(applyChannelStyles, this, channels)
diff --git a/src/marks/text.js b/src/marks/text.js
index 0f9a7d8997..c1414080b3 100644
--- a/src/marks/text.js
+++ b/src/marks/text.js
@@ -26,6 +26,7 @@ import {
impliedString,
applyFrameAnchor
} from "../style.js";
+import {template} from "../template.js";
import {maybeIntervalMidX, maybeIntervalMidY} from "../transforms/interval.js";
const defaults = {
@@ -100,29 +101,9 @@ export class Text extends Mark {
.call(applyMultilineText, this, T)
.attr(
"transform",
- R
- ? X && Y
- ? (i) => `translate(${X[i]},${Y[i]}) rotate(${R[i]})`
- : X
- ? (i) => `translate(${X[i]},${cy}) rotate(${R[i]})`
- : Y
- ? (i) => `translate(${cx},${Y[i]}) rotate(${R[i]})`
- : (i) => `translate(${cx},${cy}) rotate(${R[i]})`
- : rotate
- ? X && Y
- ? (i) => `translate(${X[i]},${Y[i]}) rotate(${rotate})`
- : X
- ? (i) => `translate(${X[i]},${cy}) rotate(${rotate})`
- : Y
- ? (i) => `translate(${cx},${Y[i]}) rotate(${rotate})`
- : `translate(${cx},${cy}) rotate(${rotate})`
- : X && Y
- ? (i) => `translate(${X[i]},${Y[i]})`
- : X
- ? (i) => `translate(${X[i]},${cy})`
- : Y
- ? (i) => `translate(${cx},${Y[i]})`
- : `translate(${cx},${cy})`
+ template`translate(${X ? (i) => X[i] : cx},${Y ? (i) => Y[i] : cy})${
+ R ? (i) => ` rotate(${R[i]})` : rotate ? ` rotate(${rotate})` : ``
+ }`
)
.call(applyAttr, "font-size", FS && ((i) => FS[i]))
.call(applyChannelStyles, this, channels)
diff --git a/src/marks/vector.js b/src/marks/vector.js
index 296ce43869..3541c02f66 100644
--- a/src/marks/vector.js
+++ b/src/marks/vector.js
@@ -1,5 +1,5 @@
+import {path} from "d3";
import {create} from "../context.js";
-import {radians} from "../math.js";
import {maybeFrameAnchor, maybeNumberChannel, maybeTuple, keyword, identity} from "../options.js";
import {Mark} from "../plot.js";
import {
@@ -9,18 +9,63 @@ import {
applyIndirectStyles,
applyTransform
} from "../style.js";
+import {template} from "../template.js";
const defaults = {
ariaLabel: "vector",
- fill: null,
+ fill: "none",
stroke: "currentColor",
strokeWidth: 1.5,
+ strokeLinejoin: "round",
strokeLinecap: "round"
};
+const defaultRadius = 3.5;
+
+// The size of the arrowhead is proportional to its length, but we still allow
+// the relative size of the head to be controlled via the mark’s width option;
+// doubling the default radius will produce an arrowhead that is twice as big.
+// That said, we’ll probably want a arrow with a fixed head size, too.
+const wingRatio = defaultRadius * 5;
+
+const shapeArrow = {
+ draw(context, l, r) {
+ const wing = (l * r) / wingRatio;
+ context.moveTo(0, 0);
+ context.lineTo(0, -l);
+ context.moveTo(-wing, wing - l);
+ context.lineTo(0, -l);
+ context.lineTo(wing, wing - l);
+ }
+};
+
+const shapeSpike = {
+ draw(context, l, r) {
+ context.moveTo(-r, 0);
+ context.lineTo(0, -l);
+ context.lineTo(r, 0);
+ }
+};
+
+const shapes = new Map([
+ ["arrow", shapeArrow],
+ ["spike", shapeSpike]
+]);
+
+function isShapeObject(value) {
+ return value && typeof value.draw === "function";
+}
+
+function Shape(shape) {
+ if (isShapeObject(shape)) return shape;
+ const value = shapes.get(`${shape}`.toLowerCase());
+ if (value) return value;
+ throw new Error(`invalid shape: ${shape}`);
+}
+
export class Vector extends Mark {
constructor(data, options = {}) {
- const {x, y, length, rotate, anchor = "middle", frameAnchor} = options;
+ const {x, y, r = defaultRadius, length, rotate, shape = shapeArrow, anchor = "middle", frameAnchor} = options;
const [vl, cl] = maybeNumberChannel(length, 12);
const [vr, cr] = maybeNumberChannel(rotate, 0);
super(
@@ -34,23 +79,19 @@ export class Vector extends Mark {
options,
defaults
);
+ this.r = +r;
this.length = cl;
this.rotate = cr;
+ this.shape = Shape(shape);
this.anchor = keyword(anchor, "anchor", ["start", "middle", "end"]);
this.frameAnchor = maybeFrameAnchor(frameAnchor);
}
render(index, scales, channels, dimensions, context) {
const {x, y} = scales;
- const {x: X, y: Y, length: L, rotate: R} = channels;
- const {length, rotate, anchor} = this;
+ const {x: X, y: Y, length: L, rotate: A} = channels;
+ const {length, rotate, anchor, shape, r} = this;
const [cx, cy] = applyFrameAnchor(this, dimensions);
- const fl = L ? (i) => L[i] : () => length;
- const fr = R ? (i) => R[i] : () => rotate;
- const fx = X ? (i) => X[i] : () => cx;
- const fy = Y ? (i) => Y[i] : () => cy;
- const k = anchor === "start" ? 0 : anchor === "end" ? 1 : 0.5;
return create("svg:g", context)
- .attr("fill", "none")
.call(applyIndirectStyles, this, scales, dimensions, context)
.call(applyTransform, this, {x: X && x, y: Y && y})
.call((g) =>
@@ -60,15 +101,36 @@ export class Vector extends Mark {
.enter()
.append("path")
.call(applyDirectStyles, this)
- .attr("d", (i) => {
- const l = fl(i),
- a = fr(i) * radians;
- const x = Math.sin(a) * l,
- y = -Math.cos(a) * l;
- const d = (x + y) / 5,
- e = (x - y) / 5;
- return `M${fx(i) - x * k},${fy(i) - y * k}l${x},${y}m${-e},${-d}l${e},${d}l${-d},${e}`;
- })
+ .attr(
+ "transform",
+ template`translate(${X ? (i) => X[i] : cx},${Y ? (i) => Y[i] : cy})${
+ A ? (i) => ` rotate(${A[i]})` : rotate ? ` rotate(${rotate})` : ``
+ }${
+ anchor === "start"
+ ? ``
+ : anchor === "end"
+ ? L
+ ? (i) => ` translate(0,${L[i]})`
+ : ` translate(0,${length})`
+ : L
+ ? (i) => ` translate(0,${L[i] / 2})`
+ : ` translate(0,${length / 2})`
+ }`
+ )
+ .attr(
+ "d",
+ L
+ ? (i) => {
+ const p = path();
+ shape.draw(p, L[i], r);
+ return p;
+ }
+ : (() => {
+ const p = path();
+ shape.draw(p, length, r);
+ return p;
+ })()
+ )
.call(applyChannelStyles, this, channels)
)
.node();
@@ -77,19 +139,33 @@ export class Vector extends Mark {
/** @jsdoc vector */
export function vector(data, options = {}) {
- let {x, y, ...remainingOptions} = options;
+ let {x, y, ...rest} = options;
if (options.frameAnchor === undefined) [x, y] = maybeTuple(x, y);
- return new Vector(data, {...remainingOptions, x, y});
+ return new Vector(data, {...rest, x, y});
}
/** @jsdoc vectorX */
export function vectorX(data, options = {}) {
- const {x = identity, ...remainingOptions} = options;
- return new Vector(data, {...remainingOptions, x});
+ const {x = identity, ...rest} = options;
+ return new Vector(data, {...rest, x});
}
/** @jsdoc vectorY */
export function vectorY(data, options = {}) {
- const {y = identity, ...remainingOptions} = options;
- return new Vector(data, {...remainingOptions, y});
+ const {y = identity, ...rest} = options;
+ return new Vector(data, {...rest, y});
+}
+
+/** @jsdoc spike */
+export function spike(data, options = {}) {
+ const {
+ shape = shapeSpike,
+ stroke = defaults.stroke,
+ strokeWidth = 1,
+ fill = stroke,
+ fillOpacity = 0.3,
+ anchor = "start",
+ ...rest
+ } = options;
+ return vector(data, {...rest, shape, stroke, strokeWidth, fill, fillOpacity, anchor});
}
diff --git a/src/template.js b/src/template.js
new file mode 100644
index 0000000000..a12aa434e9
--- /dev/null
+++ b/src/template.js
@@ -0,0 +1,25 @@
+export function template(strings, ...parts) {
+ let n = parts.length;
+
+ // If any of the interpolated parameters are strings rather than functions,
+ // bake them into the template to optimize performance during render.
+ for (let j = 0, copy = true; j < n; ++j) {
+ if (typeof parts[j] !== "function") {
+ if (copy) {
+ strings = strings.slice(); // copy before mutate
+ copy = false;
+ }
+ strings.splice(j, 2, strings[j] + parts[j] + strings[j + 1]);
+ parts.splice(j, 1);
+ --j, --n;
+ }
+ }
+
+ return (i) => {
+ let s = strings[0];
+ for (let j = 0; j < n; ++j) {
+ s += parts[j](i) + strings[j + 1];
+ }
+ return s;
+ };
+}
diff --git a/src/transforms/centroid.js b/src/transforms/centroid.js
new file mode 100644
index 0000000000..69575135b1
--- /dev/null
+++ b/src/transforms/centroid.js
@@ -0,0 +1,27 @@
+import {geoCentroid as GeoCentroid, geoPath} from "d3";
+import {identity, valueof} from "../options.js";
+import {initializer} from "./basic.js";
+
+/** @jsdoc centroid */
+export function centroid({geometry = identity, ...options} = {}) {
+ // Suppress defaults for x and y since they will be computed by the initializer.
+ return initializer({...options, x: null, y: null}, (data, facets, channels, scales, dimensions, {projection}) => {
+ const G = valueof(data, geometry);
+ const n = G.length;
+ const X = new Float64Array(n);
+ const Y = new Float64Array(n);
+ const path = geoPath(projection);
+ for (let i = 0; i < n; ++i) [X[i], Y[i]] = path.centroid(G[i]);
+ return {data, facets, channels: {x: {value: X}, y: {value: Y}}};
+ });
+}
+
+/** @jsdoc geoCentroid */
+export function geoCentroid({geometry = identity, ...options} = {}) {
+ let C;
+ return {
+ ...options,
+ x: {transform: (data) => Float64Array.from((C = valueof(valueof(data, geometry), GeoCentroid)), ([x]) => x)},
+ y: {transform: () => Float64Array.from(C, ([, y]) => y)}
+ };
+}
diff --git a/test/data/us-county-population.csv b/test/data/us-county-population.csv
new file mode 100644
index 0000000000..892d6000c3
--- /dev/null
+++ b/test/data/us-county-population.csv
@@ -0,0 +1,2911 @@
+state,county,population
+13,213,39358
+13,215,200303
+13,217,103901
+13,219,35071
+25,019,10694
+25,021,691218
+25,023,506657
+25,025,767719
+25,027,813589
+26,001,10461
+26,003,9396
+26,005,113666
+26,007,28929
+26,009,23215
+26,011,15327
+26,013,8612
+26,015,59316
+26,017,106107
+26,019,17462
+26,021,155134
+26,023,43603
+26,025,134691
+26,027,51795
+26,029,26172
+26,031,25579
+26,033,38330
+26,035,30608
+26,037,77245
+26,039,13840
+26,041,36570
+26,043,25889
+26,045,108544
+26,047,33091
+26,049,413090
+26,051,25367
+26,053,15650
+26,055,90715
+26,057,41676
+26,059,46024
+26,061,36565
+26,063,32021
+26,065,284559
+26,067,64126
+26,069,25373
+26,071,11393
+26,073,70574
+26,075,159483
+26,077,258605
+26,079,17259
+26,081,629352
+26,085,11415
+26,087,88310
+26,089,21764
+26,091,98673
+26,093,185841
+26,095,6451
+26,097,10998
+26,099,859703
+26,101,24465
+26,103,67418
+26,105,28755
+26,107,43259
+26,109,23568
+26,111,83559
+26,113,15032
+26,115,149945
+26,117,62922
+26,119,9317
+26,121,172148
+26,123,47957
+26,125,1235215
+26,127,26152
+26,129,21103
+26,131,6165
+26,133,23172
+26,135,8374
+26,137,24198
+26,139,276583
+26,141,12955
+26,143,23900
+26,145,195201
+26,147,160069
+26,149,60923
+26,151,41761
+26,153,8186
+26,155,68800
+26,157,54014
+26,159,75216
+26,161,358082
+26,163,1767593
+26,165,32829
+27,001,15722
+27,003,341249
+27,005,33375
+27,007,45644
+27,009,39457
+27,011,5098
+27,013,65524
+27,015,25327
+27,017,35482
+27,019,97143
+27,021,28633
+27,023,12126
+27,025,54041
+27,027,61402
+27,029,8764
+27,031,5215
+27,033,11557
+27,035,63321
+27,037,411402
+27,039,20361
+27,041,36862
+27,043,14119
+27,045,20877
+27,047,30751
+27,049,46450
+27,051,5943
+27,053,1209265
+27,055,18791
+27,057,20640
+27,059,38461
+27,061,45356
+27,063,10163
+27,065,15918
+27,067,42510
+27,071,12930
+27,073,6916
+27,075,10721
+27,079,27650
+27,081,5793
+27,083,25670
+27,085,35926
+27,087,5480
+27,089,9406
+27,091,20193
+27,093,23094
+27,095,25788
+27,097,32850
+27,099,39248
+27,101,8463
+27,103,33226
+27,105,21729
+27,107,6638
+27,109,150104
+27,111,57694
+27,113,14156
+27,115,29067
+27,117,9285
+27,119,31550
+27,121,10975
+27,123,531528
+27,127,15578
+27,129,14995
+27,131,65116
+27,133,9554
+27,135,15609
+27,137,200353
+27,139,139490
+27,141,91188
+27,143,14957
+27,145,153661
+27,147,36541
+27,149,9762
+27,151,9483
+27,153,24335
+27,157,21327
+27,159,13755
+27,161,19034
+27,163,248745
+27,165,10996
+27,167,6479
+27,169,51145
+27,171,129922
+27,173,10038
+28,001,31747
+28,003,37309
+28,005,12692
+28,007,19085
+28,009,8378
+28,011,33615
+28,013,14724
+28,015,10301
+28,017,17357
+28,019,8320
+28,021,9209
+28,023,16203
+28,025,20147
+28,027,24804
+28,029,28780
+28,031,19503
+28,033,170890
+28,035,76274
+28,037,7818
+28,039,23313
+28,041,13941
+28,043,21518
+28,045,46028
+28,047,198570
+28,049,244596
+28,051,18547
+28,053,8822
+28,057,23511
+28,059,140850
+28,061,16538
+28,063,7528
+28,065,11771
+28,067,68313
+28,069,10128
+28,071,52193
+28,073,59623
+28,075,79233
+28,077,12603
+28,079,23011
+28,081,85281
+28,083,30500
+28,085,34691
+28,087,59785
+28,089,101791
+28,091,25810
+28,093,36196
+28,095,36029
+28,097,10353
+28,099,29474
+28,101,21652
+28,103,11098
+28,105,49424
+28,107,34319
+28,109,55167
+28,111,12174
+28,113,39939
+28,115,30862
+28,117,25339
+28,119,7634
+28,121,147930
+28,123,28268
+28,127,27279
+28,129,16137
+28,131,17995
+28,133,27424
+28,135,14776
+28,137,28338
+28,139,22061
+28,141,19503
+28,143,10407
+28,145,27989
+28,147,14812
+28,149,47834
+28,151,48824
+31,051,5809
+31,053,36679
+31,055,543253
+31,059,5676
+31,067,21778
+31,079,61105
+31,081,9118
+31,089,10360
+31,093,6365
+31,095,7354
+31,097,5167
+31,099,6548
+31,101,8103
+31,107,8551
+31,109,301707
+31,111,35777
+31,119,35125
+31,121,7793
+31,127,7101
+31,131,15890
+31,137,9236
+31,139,7179
+31,141,32703
+31,143,5242
+31,145,10884
+31,147,8149
+31,151,14356
+31,153,172460
+31,155,20946
+31,157,36599
+31,159,17113
+31,161,5259
+31,167,6022
+31,169,5163
+31,173,6989
+31,177,20338
+31,179,9414
+31,185,13842
+32,001,24148
+32,003,2070153
+32,005,47426
+32,007,52029
+32,013,17091
+32,015,5907
+32,017,5155
+32,019,51897
+32,023,43198
+32,027,6690
+32,031,439914
+32,033,9893
+32,510,54412
+33,001,60392
+33,003,47416
+33,005,76320
+33,007,32219
+33,009,89164
+33,011,404948
+33,013,147715
+33,015,300365
+33,017,125913
+33,019,43051
+34,001,274026
+34,003,930310
+34,005,450236
+34,007,511145
+34,009,95404
+34,011,155744
+34,013,792586
+34,015,291286
+34,017,668526
+34,019,125708
+34,021,371101
+34,023,831852
+34,025,627532
+34,027,498215
+34,029,586166
+34,031,507204
+34,033,64504
+34,035,331686
+34,037,144694
+34,039,550436
+34,041,107095
+28,153,20517
+28,155,9922
+28,157,9233
+28,159,18519
+28,161,12380
+28,163,27719
+29,001,25547
+29,003,17347
+29,005,5380
+29,007,25868
+29,009,35716
+29,011,12075
+29,013,16513
+29,015,18825
+29,017,12282
+29,019,172773
+29,021,89415
+29,023,42887
+29,025,9057
+29,027,44693
+29,029,44152
+29,031,78089
+29,033,9009
+29,035,6249
+29,037,101324
+29,039,13932
+29,041,7615
+29,043,82053
+29,045,6860
+29,047,233135
+29,049,20494
+29,051,76603
+29,053,17613
+29,055,24545
+29,057,7590
+29,059,16508
+29,061,8257
+29,063,12706
+29,065,15578
+29,067,13467
+29,069,31271
+29,071,102063
+29,073,14875
+29,075,6745
+29,077,285449
+29,079,10231
+29,081,8649
+29,083,21930
+29,085,9267
+29,089,10148
+29,091,40265
+29,093,10220
+29,095,683643
+29,097,117376
+29,099,222453
+29,101,54229
+29,105,35505
+29,107,32789
+29,109,38204
+29,111,10146
+29,113,54286
+29,115,12319
+29,117,15057
+29,119,22720
+29,121,15399
+29,123,12403
+29,125,8987
+29,127,28858
+29,131,25011
+29,133,14112
+29,135,15840
+29,137,8642
+29,139,11820
+29,141,20182
+29,143,18229
+29,145,58741
+29,147,23026
+29,149,10922
+29,151,13704
+29,153,9450
+29,155,17599
+29,157,19152
+29,159,42193
+29,161,44833
+29,163,18475
+29,165,94970
+29,167,31113
+29,169,53302
+29,173,10225
+29,175,25081
+29,177,22921
+29,179,6530
+29,181,13936
+29,183,379856
+29,185,9444
+29,186,17937
+29,187,66230
+29,189,1000560
+29,195,23214
+29,201,38994
+29,203,8256
+29,205,6148
+29,207,29788
+29,209,31197
+29,211,6416
+29,213,53853
+29,215,25690
+29,217,20836
+29,219,33290
+29,221,25002
+29,223,13341
+29,225,37075
+29,229,18378
+29,510,316030
+30,001,9317
+30,003,13214
+30,005,6609
+30,007,5692
+30,009,10340
+30,013,82049
+30,015,5837
+30,017,11980
+30,021,9431
+30,023,9176
+30,027,11429
+30,029,94696
+30,031,97958
+30,035,13695
+30,041,16529
+30,043,11601
+30,047,29311
+30,049,65989
+30,053,19268
+30,057,7810
+30,063,113101
+30,067,15843
+30,073,6166
+30,077,6928
+30,081,41130
+30,083,11392
+30,085,11230
+30,087,9348
+30,089,11375
+30,093,34560
+30,095,9342
+30,099,6067
+30,101,5114
+30,105,7576
+30,111,155344
+31,001,31536
+31,003,6421
+31,011,5353
+31,013,11279
+31,019,48402
+31,021,6594
+31,023,8205
+31,025,25463
+31,027,8657
+31,031,5781
+31,033,10090
+31,035,6313
+31,037,10499
+31,039,9055
+31,041,10784
+31,043,20697
+31,045,9082
+31,047,23924
+22,065,11803
+22,067,26739
+22,069,39258
+22,071,382922
+22,073,156398
+22,075,23584
+22,077,22366
+22,079,132373
+22,081,8757
+22,083,20692
+22,085,24144
+22,087,44091
+22,089,52708
+22,091,10714
+22,093,21581
+22,095,43888
+22,097,83699
+22,099,53385
+22,101,53053
+22,103,246269
+22,105,127115
+22,109,113099
+22,111,22460
+22,113,59524
+22,115,52101
+22,117,46367
+22,119,40335
+22,121,25017
+22,123,11370
+22,125,15384
+22,127,14695
+23,001,107376
+23,003,69405
+23,005,288204
+23,007,30270
+23,009,54483
+23,011,120953
+23,013,39717
+23,015,34165
+23,017,57299
+23,019,152978
+23,021,17044
+23,023,35134
+23,025,51363
+23,027,39071
+23,029,31925
+23,031,200536
+24,001,73060
+24,003,559737
+24,005,825666
+24,009,90527
+24,011,32653
+24,013,167535
+24,015,102175
+24,017,154357
+24,019,32451
+24,021,243465
+24,023,29677
+24,025,249776
+24,027,308447
+24,029,19819
+24,031,1026371
+24,033,897693
+24,035,48712
+24,037,110675
+24,039,25899
+24,041,37668
+24,043,149571
+24,045,101527
+24,047,51441
+24,510,621000
+25,001,214703
+25,003,128563
+25,005,554868
+25,007,17137
+25,009,769362
+25,011,70916
+25,013,468072
+25,015,161035
+25,017,1567610
+36,115,62465
+36,117,91874
+36,119,969229
+36,121,41239
+36,123,25106
+37,001,156372
+37,003,37211
+37,005,10868
+37,007,25883
+37,009,26992
+37,011,17633
+37,013,47513
+37,015,20324
+37,017,34454
+37,019,119167
+37,021,250112
+37,023,89082
+37,025,192296
+37,027,81623
+37,029,10228
+37,031,68537
+37,033,23094
+37,035,155461
+37,037,68778
+37,039,27226
+37,041,14556
+37,043,10730
+37,045,97113
+37,047,57015
+37,049,104190
+37,051,325841
+37,053,24864
+37,055,35187
+37,057,164058
+37,059,41568
+37,061,59121
+37,063,294618
+37,065,54669
+37,067,364691
+37,069,62989
+37,071,211753
+37,073,11615
+37,075,8651
+37,077,58341
+37,079,21241
+37,081,511815
+37,083,52849
+37,085,126620
+37,087,59577
+37,089,110905
+37,091,24285
+37,093,51853
+37,095,5629
+37,097,167493
+37,099,41227
+37,101,182155
+37,103,10074
+37,105,59540
+37,107,58343
+37,109,79783
+37,111,45013
+37,113,33991
+37,115,21130
+37,117,23510
+37,119,1011774
+37,121,15263
+37,123,27475
+37,125,93070
+37,127,94385
+37,129,216430
+37,131,20628
+37,133,185755
+37,135,139807
+37,137,12892
+37,139,39909
+37,141,56358
+37,143,13470
+37,145,39196
+37,147,175150
+37,149,20324
+37,151,142588
+37,153,45710
+37,155,134576
+37,157,91898
+37,159,138694
+37,161,66701
+37,163,63713
+37,165,35711
+37,167,60610
+37,169,46453
+37,171,72767
+37,173,14234
+37,175,33062
+37,179,217614
+37,181,44508
+37,183,998576
+37,185,20324
+37,187,12503
+37,189,52745
+37,191,124447
+37,193,68888
+37,195,81617
+37,197,37819
+37,199,17599
+38,003,11033
+38,005,6802
+38,009,6650
+38,015,90560
+38,017,166852
+38,021,5160
+38,035,69793
+38,049,5912
+38,053,10718
+38,055,9576
+38,057,8671
+38,059,29633
+38,061,9675
+38,067,7136
+38,071,11578
+38,073,5457
+38,077,16329
+38,079,14607
+38,089,29837
+38,093,21108
+38,097,8075
+38,099,10995
+38,101,68954
+38,105,31643
+39,001,28111
+39,003,104664
+39,005,53343
+39,007,99175
+39,009,65103
+39,011,45871
+39,013,69228
+39,015,44059
+39,017,373638
+39,019,28108
+39,021,39175
+39,023,136175
+39,025,201092
+39,027,41854
+39,029,105230
+39,031,36665
+39,033,42485
+39,035,1258710
+39,037,52185
+39,039,38488
+39,041,188996
+39,043,75808
+39,045,150163
+39,047,28719
+39,049,1232118
+39,051,42466
+39,053,30376
+39,055,94020
+39,057,164325
+39,059,39478
+39,061,805965
+39,063,75672
+39,065,31652
+39,067,15521
+39,069,27890
+39,071,43109
+39,073,28690
+39,075,43702
+39,077,58704
+39,079,32717
+39,081,67607
+39,083,60878
+39,085,229266
+39,087,61503
+39,089,169762
+39,091,45388
+39,093,304091
+39,095,434800
+39,097,43537
+39,099,233015
+39,101,65620
+39,103,175543
+39,105,23345
+39,107,40886
+39,109,103864
+39,111,14442
+39,113,532761
+39,115,14857
+39,117,35032
+39,119,85991
+39,121,14429
+39,123,40981
+39,125,19057
+39,127,35947
+39,129,56804
+39,131,28298
+39,133,161796
+39,135,41561
+39,137,34116
+39,139,121888
+39,141,77193
+39,143,59870
+39,145,77366
+39,147,55711
+39,149,48949
+39,151,374762
+39,153,541372
+39,155,204908
+39,157,92579
+39,159,53955
+39,161,28501
+39,163,13128
+39,165,222184
+39,167,61154
+39,169,115747
+39,171,37270
+39,173,129418
+39,175,22359
+40,001,22161
+40,003,5784
+40,005,13847
+40,007,5479
+40,009,23290
+40,011,9777
+40,013,44529
+40,015,29510
+40,017,129571
+40,019,48530
+40,021,48267
+40,023,15051
+40,027,271818
+40,029,5755
+40,031,124583
+40,033,6062
+40,035,14683
+40,037,70931
+40,039,29248
+40,041,41433
+40,047,62481
+40,049,27570
+40,051,53955
+40,055,6081
+40,061,12835
+40,063,13727
+40,065,25864
+40,067,6280
+40,069,11027
+40,071,45398
+40,073,15392
+40,075,9239
+40,077,10643
+40,079,49885
+40,081,34640
+40,083,45171
+40,085,9768
+40,087,37222
+40,089,33071
+40,091,20161
+40,093,7721
+40,095,16079
+40,097,40923
+40,099,13792
+40,101,69939
+40,103,11470
+40,105,10510
+40,107,12212
+40,109,764698
+40,111,39322
+40,113,47923
+40,115,32022
+40,117,16444
+40,119,79953
+40,121,44643
+40,123,38213
+40,125,71551
+40,127,11149
+40,131,89970
+40,133,25403
+40,135,41344
+40,137,44631
+40,139,21499
+40,141,7611
+40,143,629823
+40,145,76190
+40,147,51892
+40,149,11626
+40,151,9125
+40,153,21111
+41,001,16030
+41,003,87455
+41,005,394967
+41,007,37660
+41,009,49645
+41,011,62944
+41,013,21334
+41,015,22364
+41,017,170813
+41,019,107375
+41,023,7227
+41,025,7214
+41,027,22842
+41,029,210916
+41,031,22305
+41,033,84063
+41,035,65946
+41,037,7799
+41,039,360273
+41,041,46685
+41,043,119862
+41,045,30474
+41,047,326527
+41,049,11207
+41,051,778193
+41,053,78470
+41,057,25552
+41,059,76582
+41,061,25758
+41,063,6836
+41,065,25657
+41,067,564088
+41,071,102217
+42,001,101759
+42,003,1230360
+42,005,67512
+42,007,169205
+42,009,48852
+42,011,414097
+42,013,125917
+42,015,61808
+42,017,626220
+42,019,185974
+42,021,137762
+42,025,64330
+47,035,57895
+47,037,667885
+47,039,11703
+47,041,19159
+47,043,50926
+47,045,37970
+47,047,39071
+47,049,17936
+47,051,41348
+47,053,49511
+47,055,29034
+47,057,22813
+47,059,68502
+47,061,13494
+47,063,63203
+47,065,351305
+47,067,6609
+47,069,25975
+47,071,25839
+47,073,56567
+47,075,18129
+47,077,27952
+47,079,32291
+47,081,24251
+47,083,8234
+47,085,18216
+47,087,11526
+47,089,52851
+47,091,17923
+47,093,448164
+47,095,7643
+47,097,27261
+47,099,42406
+47,101,11907
+47,103,33582
+47,105,50637
+47,107,52606
+47,109,26057
+47,111,22924
+47,113,98128
+47,115,28363
+47,117,31335
+47,119,85767
+47,121,11804
+47,123,45482
+47,125,189709
+47,127,6314
+47,129,21688
+47,131,30900
+47,133,22090
+47,135,7891
+47,137,5096
+47,139,16697
+47,141,74652
+47,143,32461
+47,145,52983
+47,147,67905
+47,149,290289
+47,151,22029
+47,153,14710
+47,155,94537
+47,157,936990
+47,159,19176
+47,161,13257
+47,163,156644
+47,165,172786
+47,167,61558
+47,169,7970
+47,171,17945
+47,173,19081
+47,175,5641
+47,177,40099
+47,179,126044
+47,181,16842
+47,183,34024
+47,185,26373
+47,187,205645
+47,189,125616
+48,001,57772
+48,003,17215
+48,005,87657
+48,007,24729
+48,009,8750
+42,027,159178
+42,029,512028
+42,031,38939
+42,033,81170
+42,035,39536
+42,037,66772
+42,039,87027
+42,041,243838
+42,043,271962
+42,045,562316
+42,047,31111
+42,049,279133
+42,051,134229
+42,053,7493
+42,055,152707
+42,057,14653
+42,059,37669
+42,061,45844
+42,063,87491
+42,065,44575
+42,067,24811
+42,069,213006
+42,071,533110
+42,073,88528
+42,075,136950
+42,077,358792
+42,079,318917
+42,081,116313
+42,083,42609
+42,085,114598
+42,087,46585
+42,089,167126
+42,091,815876
+42,093,18404
+42,095,300520
+42,097,93590
+42,099,45647
+42,101,1559938
+42,103,56210
+42,105,17239
+42,107,145503
+42,109,40246
+42,111,76201
+42,113,6302
+42,115,41832
+42,117,42031
+42,119,45178
+42,121,53460
+42,123,40649
+42,125,208269
+42,127,51307
+42,129,359377
+42,131,27975
+42,133,440604
+44,001,49228
+44,003,164886
+44,005,82714
+44,007,631344
+44,009,126319
+45,001,24951
+45,003,165146
+45,005,9589
+45,007,192709
+45,009,15057
+45,011,21917
+45,013,175316
+45,015,199081
+45,017,14886
+45,019,380673
+45,021,56274
+45,023,32435
+45,025,46083
+45,027,34056
+45,029,37884
+45,031,67689
+45,033,31273
+45,035,148517
+45,037,26388
+45,039,23025
+45,041,138575
+45,043,60804
+45,045,482191
+45,047,69881
+45,049,20296
+45,051,300418
+45,053,27186
+45,055,63090
+45,057,83704
+45,059,66442
+45,061,18189
+45,063,277702
+45,065,9806
+45,067,31975
+45,069,27702
+45,071,37750
+45,073,75375
+45,075,89731
+45,077,120722
+45,079,401743
+45,081,20113
+45,083,294229
+45,085,107682
+45,087,27928
+45,089,32816
+45,091,245606
+46,005,18155
+46,009,7001
+46,011,33435
+46,013,38430
+46,015,5312
+46,019,10268
+46,023,9277
+46,027,14029
+46,029,27886
+46,033,8447
+46,035,19824
+46,037,5588
+46,041,5652
+46,047,6874
+46,051,7195
+46,057,5995
+46,065,17518
+46,067,7264
+46,077,5070
+46,079,12331
+46,081,24859
+46,083,51396
+46,087,5616
+46,093,26840
+46,099,182014
+46,101,6445
+46,103,107298
+46,109,10294
+46,115,6539
+46,121,10019
+46,123,5475
+46,125,8289
+46,127,14842
+46,129,5538
+46,135,22649
+47,001,75545
+47,003,46331
+47,005,16173
+47,007,14073
+47,009,126192
+47,011,102860
+47,013,40008
+47,015,13855
+47,017,28417
+47,019,56707
+47,021,39575
+47,023,17355
+47,025,31701
+47,027,7769
+47,029,35256
+47,031,53808
+47,033,14558
+35,001,674777
+35,005,65610
+35,006,27373
+35,007,12716
+35,009,50544
+35,013,213825
+35,015,56369
+35,017,28879
+35,025,68930
+35,027,19726
+35,028,17895
+35,029,24627
+35,031,74346
+35,035,65333
+35,037,8555
+35,039,39924
+35,041,19618
+35,043,138117
+35,045,122537
+35,047,28350
+35,049,147320
+35,051,11442
+35,053,17324
+35,055,32961
+35,057,15599
+35,061,75993
+36,001,307891
+36,003,47700
+36,005,1436785
+36,007,197381
+36,009,78506
+36,011,78783
+36,013,131748
+36,015,87742
+36,017,49286
+36,019,81505
+36,021,61860
+36,023,48713
+36,025,46480
+36,027,295905
+36,029,922129
+36,031,38598
+36,033,51007
+36,035,54297
+36,037,59053
+36,039,48069
+36,043,63558
+36,045,117966
+36,047,2606852
+36,049,27107
+36,051,64622
+36,053,72089
+36,055,749236
+36,057,49667
+36,059,1356801
+36,061,1634989
+36,063,213374
+36,065,232858
+36,067,468050
+36,069,109450
+36,071,376242
+36,073,41938
+36,075,120513
+36,077,60979
+36,079,99408
+36,081,2310011
+36,083,159959
+36,085,473324
+36,087,322642
+36,089,111529
+36,091,224929
+36,093,154845
+36,095,31667
+36,097,18336
+36,099,35036
+36,101,98151
+36,103,1498130
+36,105,75818
+36,107,49649
+36,109,104268
+36,111,180505
+36,113,64911
+48,227,36423
+48,231,89068
+48,233,21782
+48,237,8866
+48,239,14678
+48,241,35640
+48,245,252993
+48,247,5218
+48,249,41486
+48,251,157544
+48,253,19944
+48,255,14984
+48,257,111830
+48,259,39010
+48,265,50505
+48,273,31877
+48,277,49626
+48,279,13561
+48,281,20357
+48,283,7319
+48,285,19654
+48,287,16754
+48,289,16923
+48,291,78598
+48,293,23469
+48,297,11976
+48,299,19624
+48,303,294682
+48,305,5723
+48,307,8242
+48,309,243394
+48,313,13843
+48,315,10191
+48,317,5451
+48,321,36719
+48,323,56830
+48,325,47920
+48,329,155817
+48,331,24372
+48,335,8995
+48,337,19384
+48,339,518849
+48,341,22186
+48,343,12653
+48,347,65556
+48,349,48177
+48,351,14138
+48,353,15017
+48,355,355667
+48,357,10577
+48,361,83751
+48,363,27922
+48,365,23771
+48,367,123601
+48,369,9921
+48,371,15826
+48,373,46583
+48,375,121883
+48,377,7144
+48,379,11087
+48,381,128603
+48,387,12455
+48,389,14438
+48,391,7315
+48,395,16537
+48,397,88010
+48,399,10411
+48,401,53197
+48,403,10367
+48,405,8556
+48,407,27172
+48,409,66706
+48,411,5881
+48,415,17314
+48,419,25705
+48,423,219745
+48,425,8673
+48,427,63008
+48,429,9787
+48,437,7639
+48,439,1947529
+48,441,135234
+48,445,12724
+48,449,32592
+48,451,116264
+48,453,1148176
+48,455,14360
+48,457,21371
+48,459,40295
+48,463,27055
+48,465,48862
+48,467,53070
+48,469,90989
+48,471,69926
+48,473,47049
+48,475,11396
+48,477,34544
+48,479,266006
+48,481,41377
+48,483,5642
+48,485,132148
+48,487,13061
+48,489,21944
+48,491,490619
+48,493,46444
+48,495,7723
+48,497,62089
+48,499,43198
+48,501,8316
+48,503,18275
+48,505,14335
+48,507,12107
+49,001,6437
+49,003,51528
+49,005,118824
+49,007,20733
+49,011,329292
+49,013,20078
+49,015,10570
+49,017,5020
+49,019,9428
+49,021,47751
+49,023,10507
+49,025,7216
+49,027,12604
+49,029,10645
+49,035,1092518
+49,037,15540
+49,039,28551
+49,041,20913
+49,043,39009
+49,045,61986
+49,047,36308
+49,049,564177
+49,051,27895
+49,053,151959
+49,057,241328
+50,001,36926
+50,003,36503
+50,005,30859
+50,007,160510
+50,009,6173
+50,011,48625
+50,013,6945
+50,015,25136
+50,017,28897
+50,019,27076
+50,021,60133
+50,023,58963
+50,025,43609
+50,027,55894
+51,001,33060
+51,003,104287
+51,005,15919
+51,007,12793
+51,009,31999
+51,011,15314
+51,013,226092
+51,015,74330
+51,019,76933
+51,021,6612
+51,023,33192
+51,025,16573
+51,027,23158
+51,029,17030
+51,031,55061
+51,033,29640
+51,035,29733
+51,036,7086
+51,037,12232
+51,041,331839
+51,043,14307
+51,045,5195
+51,047,48952
+51,049,9769
+51,051,15304
+51,053,28155
+51,057,11130
+51,059,1132887
+51,061,68025
+51,063,15587
+51,065,26046
+51,067,56230
+51,069,82321
+51,071,16871
+51,073,37021
+51,075,21979
+51,077,15180
+51,079,19085
+51,081,11698
+51,083,35305
+51,085,102199
+51,087,321921
+51,089,52209
+51,093,36027
+51,095,71900
+51,097,7140
+51,099,25260
+51,101,16156
+51,103,11055
+51,105,24911
+51,107,362435
+51,109,34350
+51,111,12450
+51,113,13122
+51,115,8848
+51,117,31209
+51,119,10728
+51,121,97227
+51,125,14831
+51,127,20051
+51,131,12118
+51,133,12272
+51,135,15641
+51,137,34873
+51,139,23759
+51,141,18180
+51,143,62392
+51,145,28286
+51,147,23077
+51,149,37664
+51,153,443630
+51,155,34417
+51,157,7416
+51,159,8868
+51,161,93655
+51,163,22450
+51,165,78427
+51,167,27973
+51,169,22378
+51,171,42857
+51,173,31513
+51,175,18291
+51,177,129181
+51,179,139548
+51,181,6731
+51,183,11733
+51,185,43367
+51,187,38807
+51,191,54562
+51,193,17528
+51,195,40074
+51,197,29171
+51,199,66919
+51,510,151473
+51,520,17340
+51,530,6610
+51,540,45538
+51,550,233194
+51,570,17554
+51,580,5650
+51,590,42360
+55,087,181799
+55,089,87625
+55,091,7349
+55,093,40881
+55,095,43483
+55,097,70551
+55,099,13707
+55,101,194873
+55,103,17642
+55,105,160986
+55,107,14272
+55,109,86726
+55,111,63317
+55,113,16438
+55,115,41384
+55,117,115269
+55,119,20521
+55,121,29521
+55,123,30442
+55,125,21373
+55,127,103021
+55,129,15685
+55,131,133422
+55,133,395377
+55,135,51974
+55,137,24238
+55,139,169487
+55,141,73621
+56,001,37836
+56,003,11931
+56,005,48473
+56,007,15696
+56,009,14223
+56,011,7284
+56,013,40683
+56,015,13546
+56,019,8572
+56,021,96459
+56,023,18543
+56,025,80871
+56,029,29083
+56,031,8740
+56,033,29924
+56,035,10032
+56,037,44812
+56,039,22623
+56,041,20893
+56,043,8351
+56,045,7175
+72,001,18760
+72,003,40083
+72,005,56893
+72,007,27323
+72,009,24438
+72,011,28250
+72,013,91096
+72,015,18778
+72,017,24699
+72,019,29548
+72,021,192974
+72,023,50096
+72,025,136372
+72,027,33481
+72,029,47174
+72,031,165040
+72,033,26137
+72,035,46071
+72,037,12538
+72,039,17644
+72,041,41782
+72,043,40090
+72,045,20153
+72,047,35484
+72,051,38013
+72,053,33912
+72,054,12287
+72,055,17788
+72,057,43210
+72,059,20025
+72,061,92444
+51,595,5565
+51,600,23620
+51,610,13597
+51,620,8413
+51,630,27853
+51,640,6858
+51,650,136789
+51,660,51979
+51,670,22332
+51,678,7036
+51,680,78755
+51,683,41149
+51,685,15827
+51,690,13551
+51,700,181606
+51,710,245724
+51,730,31997
+51,735,12068
+51,740,96071
+51,750,17186
+51,760,216773
+51,770,99329
+51,775,25290
+51,790,24234
+51,800,87061
+51,810,449733
+51,820,21366
+51,830,14988
+51,840,27349
+53,001,19100
+53,003,22113
+53,005,187519
+53,007,74761
+53,009,72969
+53,011,450893
+53,015,102854
+53,017,40101
+53,019,7639
+53,021,87810
+53,025,92530
+53,027,71233
+53,029,80113
+53,031,30333
+53,033,2079550
+53,035,257488
+53,037,42785
+53,039,20930
+53,041,75724
+53,043,10326
+53,045,61060
+53,047,41299
+53,049,20743
+53,051,13001
+53,053,832896
+53,055,16056
+53,057,120475
+53,059,11316
+53,061,758649
+53,063,485859
+53,065,43744
+53,067,266311
+53,071,59809
+53,073,209729
+53,075,47494
+53,077,247681
+54,001,16892
+54,003,110173
+54,005,23645
+54,007,14463
+54,009,23473
+54,011,96623
+54,013,7482
+54,015,9033
+54,017,8363
+54,019,45192
+54,021,8497
+54,023,11770
+54,025,35580
+54,027,23455
+54,029,30024
+54,031,13942
+54,033,68775
+54,035,29199
+54,037,55531
+54,039,189636
+54,041,16422
+54,043,21482
+54,045,35166
+54,047,20273
+54,049,56716
+54,051,32296
+54,053,27060
+54,055,61476
+54,057,27606
+54,059,25549
+54,061,102827
+54,063,13496
+54,065,17514
+54,067,25743
+54,069,43257
+54,071,7291
+54,073,7612
+54,075,8620
+54,077,33793
+54,079,56743
+54,081,78051
+54,083,29287
+54,085,10044
+54,087,14513
+54,089,13325
+54,091,16949
+54,093,6922
+54,095,9000
+54,097,24632
+54,099,41237
+54,101,8820
+54,103,15997
+54,105,5826
+54,107,86262
+54,109,22537
+55,001,20294
+55,003,15936
+55,005,45548
+55,007,14987
+55,009,256621
+55,011,13256
+55,013,15259
+55,015,49653
+55,017,63355
+55,019,34486
+55,021,56650
+55,023,16415
+55,025,516818
+55,027,88404
+55,029,27669
+55,031,43705
+55,033,44348
+55,035,101907
+55,039,101968
+55,041,9108
+55,043,51723
+55,045,37050
+55,047,18881
+55,049,23751
+55,051,5850
+55,053,20566
+55,055,84538
+55,057,26399
+55,059,167896
+55,061,20459
+55,063,117538
+55,065,16793
+55,067,19414
+55,069,28171
+55,071,80178
+55,073,135367
+55,075,41090
+55,077,15082
+55,079,955306
+55,081,45365
+55,083,37475
+55,085,35604
+48,013,47710
+48,015,29107
+48,017,7131
+48,019,21015
+48,021,78286
+48,025,32706
+48,027,330859
+48,029,1858699
+48,031,10918
+48,035,17953
+48,037,93483
+48,039,338419
+48,041,209896
+48,043,9188
+48,047,7217
+48,049,37935
+48,051,17417
+48,053,44584
+48,055,39848
+48,057,21805
+48,059,13596
+48,061,418785
+48,063,12631
+48,065,6027
+48,067,30346
+48,069,7875
+48,071,38072
+48,073,51257
+48,075,7059
+48,077,10367
+48,083,8476
+48,085,886633
+48,089,20792
+48,091,124234
+48,093,13506
+48,097,38878
+48,099,75710
+48,107,5987
+48,111,7052
+48,113,2513054
+48,115,13317
+48,117,19039
+48,119,5226
+48,121,754650
+48,123,20660
+48,127,10842
+48,131,11510
+48,133,18252
+48,135,153177
+48,139,160225
+48,141,833592
+48,143,40641
+48,145,17265
+48,147,33757
+48,149,24909
+48,153,6088
+48,157,683756
+48,159,10571
+48,161,19585
+48,163,18542
+48,165,19485
+48,167,314485
+48,169,6614
+48,171,25732
+48,175,7463
+48,177,20370
+48,179,23028
+48,181,124231
+48,183,123283
+48,185,27140
+48,187,147313
+48,189,35007
+48,193,8232
+48,195,5552
+48,199,55624
+48,201,4434257
+48,203,66431
+48,205,5966
+48,207,5812
+48,209,185686
+48,213,79213
+48,215,828334
+48,217,34901
+48,219,23377
+48,221,54217
+48,223,35844
+48,225,22802
+72,063,46990
+72,065,41327
+72,067,16678
+72,069,55621
+72,071,43919
+72,073,15605
+72,075,48658
+72,077,39942
+72,079,24323
+72,081,28052
+72,083,9093
+72,085,38466
+72,087,27857
+72,089,19237
+72,091,41468
+72,093,6274
+72,095,11506
+72,097,81594
+72,099,38289
+72,101,32087
+72,103,26722
+72,105,29467
+72,107,22258
+72,109,18135
+72,111,22231
+72,113,152594
+72,115,24904
+72,117,14700
+72,119,52479
+72,121,24013
+72,123,29722
+72,125,33546
+72,127,363744
+72,129,39283
+72,131,39755
+72,133,22732
+72,135,74467
+72,137,83645
+72,139,70737
+72,141,30869
+72,143,39018
+72,145,55866
+72,147,9046
+72,149,24186
+72,151,35670
+72,153,38519
+06,079,278680
+06,081,754748
+06,083,439395
+06,085,1885056
+06,087,270931
+06,089,179228
+06,093,43668
+06,095,429596
+06,097,497776
+06,099,530561
+06,101,95406
+06,103,63015
+06,105,13180
+06,107,455769
+06,109,53864
+06,111,843110
+06,113,209671
+06,115,73897
+08,001,479977
+08,003,16353
+08,005,617668
+08,007,12355
+08,011,5816
+08,013,313961
+08,014,62449
+08,015,18507
+08,019,9238
+08,021,8213
+08,025,5537
+08,029,30221
+08,031,663303
+08,035,314238
+08,037,52894
+08,039,24225
+08,041,665171
+08,043,46835
+08,045,57495
+08,047,5708
+08,049,14490
+08,051,15889
+08,055,6521
+08,059,558810
+08,063,8174
+08,065,7401
+08,067,53994
+08,069,325228
+08,071,14322
+08,073,5515
+08,075,21862
+08,077,148166
+08,081,13034
+08,083,26006
+08,085,40866
+08,087,28288
+08,089,18440
+08,093,16440
+08,097,17543
+08,099,12121
+08,101,162158
+08,103,6658
+08,105,11623
+08,107,23980
+08,109,6255
+08,113,7767
+08,117,29269
+08,119,23472
+08,123,278065
+08,125,10150
+09,001,941618
+09,003,895699
+09,005,185141
+09,007,164438
+09,009,860874
+09,011,272033
+09,013,151689
+09,015,117078
+10,001,171474
+10,003,551997
+10,005,211224
+11,001,659009
+12,001,256581
+12,003,27312
+12,005,178361
+12,007,26919
+12,009,560683
+12,011,1863780
+12,013,14550
+12,015,169642
+12,017,140453
+12,019,200346
+12,021,348236
+12,023,68198
+12,027,35134
+12,029,16084
+12,031,900890
+12,033,309574
+12,035,102917
+12,037,11705
+12,039,46153
+12,041,17033
+12,043,13420
+12,045,15851
+12,047,14362
+12,049,27302
+12,051,38376
+12,053,176797
+12,055,98862
+12,057,1323059
+12,059,19569
+12,061,145342
+12,063,48721
+12,065,14082
+12,067,8742
+12,069,317586
+12,071,680970
+12,073,284788
+12,075,39707
+12,077,8285
+12,079,18560
+12,081,353411
+12,083,340341
+12,085,153592
+12,086,2664418
+12,087,77150
+12,089,77187
+12,091,195798
+12,093,39420
+12,095,1256055
+12,097,311962
+12,099,1398757
+12,101,488310
+12,103,939548
+12,105,637691
+12,107,72304
+12,109,218362
+12,111,293136
+12,113,163903
+12,115,398011
+12,117,442905
+12,119,113589
+12,121,43653
+12,123,22582
+12,125,15159
+12,127,510806
+12,129,31314
+12,131,61528
+12,133,24627
+13,001,18410
+13,003,8268
+13,005,11251
+13,009,45808
+13,011,18336
+13,013,73340
+13,015,101942
+13,017,17405
+13,019,18986
+13,021,154194
+13,023,12835
+13,025,18403
+13,027,15645
+13,029,34104
+13,031,73141
+13,033,22838
+13,035,23479
+13,037,6443
+13,039,52092
+01,001,55049
+01,003,199510
+01,005,26614
+01,007,22572
+01,009,57704
+01,011,10552
+01,013,20280
+01,015,115883
+01,017,34018
+01,019,25897
+01,021,43817
+01,023,13287
+01,025,24847
+01,027,13483
+01,029,14991
+01,031,50991
+01,033,54377
+01,035,12697
+01,037,10864
+01,039,37729
+01,041,13896
+01,043,81316
+01,045,49607
+01,047,41426
+01,049,70937
+01,051,80957
+01,053,37875
+01,055,103363
+01,057,16783
+01,059,31573
+01,061,26765
+01,063,8587
+01,065,15159
+01,067,17187
+01,069,103891
+01,071,52608
+01,073,659096
+01,075,14066
+01,077,92641
+01,079,33433
+01,081,153947
+01,083,90257
+01,085,10565
+01,087,19684
+01,089,349973
+01,091,20066
+01,093,30239
+01,095,94534
+01,097,414291
+01,099,21975
+01,101,227392
+01,103,119555
+01,105,9856
+01,107,20042
+01,109,33277
+01,111,22615
+01,113,58636
+01,115,86576
+01,117,205951
+01,119,13285
+01,121,81057
+01,123,40958
+01,125,202471
+01,127,65593
+01,129,16909
+01,131,11119
+01,133,24013
+02,016,5714
+02,020,299321
+02,050,17885
+02,090,100150
+02,110,32524
+02,122,57637
+02,130,13715
+02,150,13918
+02,170,98679
+02,180,9879
+02,185,9681
+02,188,7723
+02,198,6374
+02,220,8921
+02,240,6970
+02,261,9522
+02,290,5600
+04,001,72346
+04,003,128177
+04,005,138064
+04,007,53179
+04,009,37529
+04,011,9224
+04,012,20304
+04,013,4088549
+04,015,203629
+04,017,108209
+04,019,1003338
+04,021,397604
+04,023,46547
+04,025,218586
+04,027,203292
+05,001,18569
+05,003,20989
+05,005,40992
+05,007,245231
+05,009,37301
+05,011,11096
+05,013,5210
+05,015,27690
+05,017,11189
+05,019,22684
+05,021,15202
+05,023,25587
+05,025,8421
+05,027,24168
+05,029,21060
+05,031,102884
+05,033,61927
+05,035,49511
+05,037,17329
+05,039,7738
+05,041,12234
+05,043,18688
+05,045,120417
+05,047,17799
+05,049,12186
+05,051,97119
+05,053,18046
+05,055,43745
+05,057,22208
+05,059,33440
+05,061,13487
+05,063,37030
+05,065,13461
+05,067,17495
+05,069,72385
+05,071,26025
+05,073,7127
+05,075,16915
+05,077,9781
+05,079,13935
+05,081,12616
+05,083,21935
+05,085,71279
+05,087,15761
+05,089,16404
+05,091,43666
+05,093,44199
+05,095,7542
+05,097,9100
+05,099,8668
+05,101,7988
+05,103,24728
+05,105,10246
+05,107,19929
+05,109,11017
+05,111,24131
+05,113,20290
+05,115,63107
+05,117,8334
+05,119,391806
+05,121,17584
+05,123,27023
+05,125,115577
+05,127,10661
+05,129,7938
+05,131,127351
+05,133,17193
+05,135,17027
+05,137,12503
+05,139,40334
+05,141,16892
+05,143,219930
+05,145,78823
+05,147,6873
+05,149,21716
+06,001,1605217
+06,005,36963
+06,007,223877
+06,009,44787
+06,011,21361
+06,013,1107925
+06,015,27628
+06,017,183000
+06,019,963160
+06,021,27976
+06,023,135182
+06,025,178807
+06,027,18326
+06,029,871337
+06,031,150261
+06,033,64076
+06,035,31945
+06,037,10057155
+06,039,153366
+06,041,259358
+06,043,17645
+06,045,87409
+06,047,265001
+06,049,9033
+06,051,14051
+06,053,430201
+06,055,140823
+06,057,98639
+06,059,3132211
+06,061,370571
+06,063,18754
+06,065,2323892
+06,067,1479300
+06,069,58051
+06,071,2106754
+06,073,3253356
+06,075,850282
+06,077,714860
+13,221,14743
+13,223,149830
+13,225,26907
+13,227,29992
+13,229,19030
+13,231,17843
+13,233,41263
+13,235,11460
+13,237,21259
+13,241,16312
+13,243,7224
+13,245,201418
+13,247,87569
+13,249,5089
+13,251,14114
+13,253,8696
+13,255,64006
+13,257,25584
+13,259,5791
+13,261,31070
+13,263,6373
+13,267,25260
+13,269,8354
+13,271,16405
+13,273,9132
+13,275,44977
+13,277,40691
+13,279,27160
+13,281,10976
+13,283,6711
+13,285,69314
+13,287,8151
+13,289,8363
+13,291,22033
+13,293,26394
+13,295,68143
+13,297,87436
+13,299,35671
+13,301,5504
+13,303,20680
+13,305,30006
+13,309,7932
+13,311,28140
+13,313,103653
+13,315,8884
+13,317,9924
+13,319,9312
+13,321,20988
+15,001,193680
+15,003,986999
+15,007,70447
+15,009,162456
+16,001,425798
+16,005,83815
+16,007,5928
+16,009,9068
+16,011,45261
+16,013,21427
+16,015,6891
+16,017,41389
+16,019,108989
+16,021,11141
+16,027,202782
+16,029,6813
+16,031,23441
+16,035,8528
+16,039,26103
+16,041,13013
+16,043,12896
+16,045,16853
+16,047,15157
+16,049,16251
+16,051,27096
+16,053,22694
+16,055,147716
+16,057,38593
+16,059,7743
+16,063,5292
+16,065,38114
+16,067,20331
+16,069,39995
+16,073,11356
+16,075,22773
+16,077,7696
+16,079,12551
+16,081,10437
+16,083,80955
+16,085,9897
+16,087,10035
+17,001,66949
+17,003,7051
+17,005,17137
+17,007,53656
+17,009,6836
+17,011,33822
+17,015,14793
+17,017,13068
+17,019,206420
+17,021,33888
+17,023,16089
+17,025,13466
+17,027,37858
+17,029,52802
+17,031,5227575
+17,033,19441
+17,035,10890
+17,037,104458
+17,039,16322
+17,041,19770
+17,043,930514
+17,045,17828
+17,047,6612
+17,049,34356
+17,051,22025
+17,053,13758
+17,055,39503
+17,057,36047
+17,059,5325
+17,061,13390
+17,063,50338
+17,065,8251
+17,067,18633
+17,071,6966
+17,073,49681
+17,075,28814
+17,077,59188
+17,079,9592
+17,081,38523
+17,083,22441
+17,085,22186
+17,087,12866
+17,089,526615
+17,091,111493
+17,093,121452
+17,095,51752
+17,097,702890
+17,099,111935
+17,101,16582
+17,103,34718
+17,105,37278
+17,107,29820
+17,109,31727
+17,111,307083
+17,113,173254
+17,115,108404
+17,117,46482
+17,119,266759
+17,121,38503
+17,123,12060
+17,125,13931
+17,127,14883
+17,129,12576
+17,131,15971
+17,133,33703
+17,135,29301
+17,137,34801
+17,139,14915
+17,141,52034
+17,143,186818
+17,145,21595
+17,147,16469
+17,149,16054
+17,153,5792
+17,155,5746
+17,157,32934
+17,159,16072
+17,161,146536
+17,163,265569
+17,165,24659
+17,167,198639
+17,169,7205
+17,171,5169
+17,173,22011
+17,175,5840
+17,177,46283
+17,179,135400
+17,181,17458
+17,183,79613
+17,185,11587
+17,187,17611
+17,189,14369
+17,191,16517
+17,193,14410
+17,195,57155
+17,197,685378
+17,199,67336
+17,201,288896
+17,203,39123
+18,001,34813
+18,003,365565
+18,005,80203
+18,007,8709
+18,009,12364
+18,011,61884
+18,013,14965
+18,015,20007
+18,017,38324
+18,019,113993
+18,021,26568
+18,023,32692
+18,025,10582
+18,027,32583
+18,029,49552
+18,031,26340
+18,033,42489
+18,035,116463
+18,037,42345
+18,039,201640
+18,041,23608
+18,043,76290
+18,045,16741
+18,047,22887
+18,049,20412
+18,051,33684
+18,053,68269
+18,055,32633
+18,057,303042
+18,059,71955
+18,061,39370
+18,063,155817
+18,065,48953
+18,067,82728
+18,069,36696
+18,071,43637
+18,073,33461
+18,075,21196
+18,077,32482
+18,079,28023
+18,081,147567
+18,083,37956
+18,085,78461
+18,087,38395
+18,089,489698
+18,091,110993
+18,093,45696
+18,095,129862
+18,097,932142
+18,099,46833
+18,101,10218
+18,103,36093
+18,105,143292
+18,107,38108
+18,109,69504
+18,111,14022
+18,113,47587
+18,115,6003
+18,117,19579
+18,119,21038
+18,121,17033
+18,123,19301
+18,125,12554
+18,127,167016
+18,129,25527
+18,131,12910
+18,133,37626
+18,135,25403
+18,137,28633
+18,139,16873
+18,141,267696
+18,143,23734
+18,145,44404
+18,147,20777
+18,149,23069
+18,151,34279
+18,153,21026
+18,155,10484
+18,157,183397
+18,159,15447
+18,161,7251
+18,163,181692
+18,165,15752
+18,167,108099
+18,169,32177
+18,171,8309
+18,173,61427
+18,175,27792
+18,177,67423
+18,179,27836
+18,181,24265
+18,183,33354
+19,001,7330
+19,005,14001
+19,007,12602
+19,009,5793
+19,011,25720
+19,013,132821
+19,015,26411
+19,017,24663
+19,019,21031
+19,021,20445
+19,023,14933
+19,025,9876
+19,027,20555
+19,029,13433
+19,031,18389
+19,033,43303
+19,035,11752
+19,037,12164
+19,039,9273
+19,041,16478
+19,043,17735
+19,045,47972
+19,047,17147
+19,049,78074
+19,051,8768
+19,053,8210
+19,055,17445
+19,057,40114
+19,059,17046
+19,061,96359
+19,063,9820
+19,065,20391
+19,067,16004
+19,069,10393
+19,071,7019
+19,073,9083
+19,075,12373
+19,077,10691
+19,079,15227
+19,081,11006
+19,083,17324
+19,085,14335
+19,087,19941
+19,089,9430
+19,091,9607
+19,093,7041
+19,095,16326
+19,097,19529
+19,099,36715
+19,101,17662
+19,103,142006
+19,105,20481
+19,107,10234
+19,109,15226
+19,111,35172
+19,113,218076
+19,115,11251
+19,117,8700
+19,119,11730
+19,121,15661
+19,123,22324
+19,125,33197
+21,137,24424
+21,139,9353
+21,141,26757
+21,143,8325
+21,145,65292
+21,147,17850
+21,149,9492
+21,151,87324
+21,153,12887
+21,155,19497
+21,157,31213
+21,159,12478
+21,161,17229
+21,163,28751
+21,165,6345
+21,167,21411
+21,169,9983
+21,171,10692
+21,173,27391
+21,175,13379
+21,177,31216
+21,179,44875
+21,181,7062
+21,183,24152
+21,185,63876
+21,187,10673
+21,191,14509
+21,193,27818
+21,195,62791
+21,197,12387
+21,199,63772
+21,203,16893
+21,205,24302
+21,207,17684
+21,209,51348
+21,211,44967
+21,213,17856
+21,215,17798
+21,217,25315
+21,219,12465
+21,221,14267
+21,223,8751
+21,225,15065
+21,227,121066
+21,229,12017
+21,231,20557
+21,233,13331
+21,235,35842
+21,237,7221
+21,239,25591
+22,001,62372
+22,003,25619
+22,005,117009
+22,007,22973
+22,009,41252
+22,011,36435
+22,013,13924
+22,015,124720
+22,017,253125
+22,019,197233
+22,021,9997
+22,023,6739
+22,025,10145
+22,027,16452
+22,029,20288
+22,031,27047
+22,033,445337
+22,035,7419
+22,037,19756
+22,039,33765
+22,041,20464
+22,043,22372
+22,045,73799
+22,047,33159
+22,049,15999
+22,051,435204
+22,053,31399
+22,055,234963
+22,057,97688
+22,059,14927
+22,061,47480
+22,063,135925
+19,127,40735
+19,129,14841
+19,131,10757
+19,133,9013
+19,135,7964
+19,137,10380
+19,139,42949
+19,141,14055
+19,143,6154
+19,145,15552
+19,147,9155
+19,149,24972
+19,151,7061
+19,153,459159
+19,155,93198
+19,157,18622
+19,159,5054
+19,161,10034
+19,163,171116
+19,165,11944
+19,167,34621
+19,169,94834
+19,171,17423
+19,173,6209
+19,175,12539
+19,177,7380
+19,179,35242
+19,181,48170
+19,183,22115
+19,185,6403
+19,187,37050
+19,189,10580
+19,191,20789
+19,193,102426
+19,195,7562
+19,197,12891
+20,001,12951
+20,003,7858
+20,005,16557
+20,009,27214
+20,011,14751
+20,013,9810
+20,015,66264
+20,021,20737
+20,027,8346
+20,029,9302
+20,031,8433
+20,035,35977
+20,037,39281
+20,041,19384
+20,043,7793
+20,045,116352
+20,051,29032
+20,053,6375
+20,055,36983
+20,057,34492
+20,059,25663
+20,061,36818
+20,067,7748
+20,069,6037
+20,073,6304
+20,077,5798
+20,079,34814
+20,085,13365
+20,087,18880
+20,091,572428
+20,095,7697
+20,099,20833
+20,103,78785
+20,107,9524
+20,111,33401
+20,113,29164
+20,115,12213
+20,117,9963
+20,121,32787
+20,123,6299
+20,125,33765
+20,127,5694
+20,131,10177
+20,133,16358
+20,137,5558
+20,139,16001
+20,143,6004
+20,145,6840
+20,147,5484
+20,149,22920
+20,151,9729
+20,155,63803
+20,159,9949
+20,161,75026
+20,163,5160
+20,167,6988
+20,169,55547
+20,173,508221
+20,175,23185
+20,177,178567
+20,181,6038
+20,189,5738
+20,191,23509
+20,193,7909
+20,197,6960
+20,201,5613
+20,205,8956
+20,209,161777
+21,001,19156
+21,003,20421
+21,005,21867
+21,007,8216
+21,009,43287
+21,011,12113
+21,013,27676
+21,015,125656
+21,017,20004
+21,019,48716
+21,021,29650
+21,023,8404
+21,025,13476
+21,027,20000
+21,029,77727
+21,031,12828
+21,033,12758
+21,035,38302
+21,037,91456
+21,041,10776
+21,043,27292
+21,045,15928
+21,047,73936
+21,049,35706
+21,051,21160
+21,053,10172
+21,055,9211
+21,057,6780
+21,059,98724
+21,061,12086
+21,063,7661
+21,065,14406
+21,067,311529
+21,069,14543
+21,071,38144
+21,073,49982
+21,075,6323
+21,077,8543
+21,079,17051
+21,081,24705
+21,083,37379
+21,085,26092
+21,087,11123
+21,089,36255
+21,091,8716
+21,093,107573
+21,095,28031
+21,097,18629
+21,099,18510
+21,101,46362
+21,103,15528
+21,107,46359
+21,109,13357
+21,111,759724
+21,113,51015
+21,115,23280
+21,117,163393
+21,119,15884
+21,121,31740
+21,123,14127
+21,125,59950
+21,127,15870
+21,129,6896
+21,131,10869
+21,133,23382
+21,135,13646
+13,043,10962
+13,045,113756
+13,047,65645
+13,049,12968
+13,051,282613
+13,053,11882
+13,055,25046
+13,057,230629
+13,059,122037
+13,063,270269
+13,065,6814
+13,067,728388
+13,069,43042
+13,071,46002
+13,073,139904
+13,075,17103
+13,077,135625
+13,079,12483
+13,081,23061
+13,083,16356
+13,085,22939
+13,087,27237
+13,089,723902
+13,091,20995
+13,093,14089
+13,095,92326
+13,097,138283
+13,099,10480
+13,103,55852
+13,105,19394
+13,107,22723
+13,109,10733
+13,111,24017
+13,113,109495
+13,115,96199
+13,117,203841
+13,119,22188
+13,121,996757
+13,123,28956
+13,127,82623
+13,129,56079
+13,131,25145
+13,133,16535
+13,135,874242
+13,137,43724
+13,139,190482
+13,141,8747
+13,143,28667
+13,145,32992
+13,147,25518
+13,149,11571
+13,151,214171
+13,153,149137
+13,155,9365
+13,157,62131
+13,159,13571
+13,161,14953
+13,163,16201
+13,165,9055
+13,167,9694
+13,169,28701
+13,171,18195
+13,173,10382
+13,175,47802
+13,177,29134
+13,179,63949
+13,181,7712
+13,183,17243
+13,185,113898
+13,187,31094
+13,189,21558
+13,191,13941
+13,193,13846
+13,195,28362
+13,197,8646
+13,199,21195
+13,201,5911
+13,205,22778
+13,207,27044
+13,209,9005
+13,211,17943
\ No newline at end of file
diff --git a/test/output/caltrainDirection.svg b/test/output/caltrainDirection.svg
index ad5130abf2..e9f7a1fba7 100644
--- a/test/output/caltrainDirection.svg
+++ b/test/output/caltrainDirection.svg
@@ -48,93 +48,93 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/test/output/countryCentroids.svg b/test/output/countryCentroids.svg
new file mode 100644
index 0000000000..54fc982920
--- /dev/null
+++ b/test/output/countryCentroids.svg
@@ -0,0 +1,204 @@
+
\ No newline at end of file
diff --git a/test/output/shorthandVector.svg b/test/output/shorthandVector.svg
index cdda4f9eab..292bb30652 100644
--- a/test/output/shorthandVector.svg
+++ b/test/output/shorthandVector.svg
@@ -77,46 +77,46 @@
Feb 25
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/test/output/shorthandVectorX.svg b/test/output/shorthandVectorX.svg
index dc281fd9e1..e50d9d2a4f 100644
--- a/test/output/shorthandVectorX.svg
+++ b/test/output/shorthandVectorX.svg
@@ -30,46 +30,46 @@
175
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/test/output/usCountySpikes.svg b/test/output/usCountySpikes.svg
new file mode 100644
index 0000000000..4e0145d60d
--- /dev/null
+++ b/test/output/usCountySpikes.svg
@@ -0,0 +1,2857 @@
+
\ No newline at end of file
diff --git a/test/output/usPresidentialElectionMap2020.svg b/test/output/usPresidentialElectionMap2020.svg
index 2c6a702ed2..042268d7cc 100644
--- a/test/output/usPresidentialElectionMap2020.svg
+++ b/test/output/usPresidentialElectionMap2020.svg
@@ -16,3117 +16,3117 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/test/output/vectorField.svg b/test/output/vectorField.svg
index 917047e503..edb081ad33 100644
--- a/test/output/vectorField.svg
+++ b/test/output/vectorField.svg
@@ -77,1030 +77,1030 @@
6
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/test/output/vectorFrame.svg b/test/output/vectorFrame.svg
index 82fa82b96a..7b8dff39fb 100644
--- a/test/output/vectorFrame.svg
+++ b/test/output/vectorFrame.svg
@@ -14,17 +14,17 @@
}
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
Ο
\ No newline at end of file
diff --git a/test/plots/country-centroids.js b/test/plots/country-centroids.js
new file mode 100644
index 0000000000..3344f3d1c2
--- /dev/null
+++ b/test/plots/country-centroids.js
@@ -0,0 +1,20 @@
+import * as Plot from "@observablehq/plot";
+import * as d3 from "d3";
+import {feature} from "topojson-client";
+
+export default async function () {
+ const world = await d3.json("data/countries-110m.json");
+ const land = feature(world, world.objects.land);
+ const countries = feature(world, world.objects.countries).features;
+ return Plot.plot({
+ projection: "mercator",
+ marks: [
+ Plot.graticule(),
+ Plot.geo(land, {fill: "#ddd"}),
+ Plot.geo(countries, {stroke: "#fff"}),
+ Plot.text(countries, Plot.geoCentroid({fill: "red", text: "id"})),
+ Plot.text(countries, Plot.centroid({fill: "blue", text: "id"})),
+ Plot.frame()
+ ]
+ });
+}
diff --git a/test/plots/index.js b/test/plots/index.js
index f6e18e20d3..4436ba723f 100644
--- a/test/plots/index.js
+++ b/test/plots/index.js
@@ -41,6 +41,7 @@ export {default as carsMpg} from "./cars-mpg.js";
export {default as carsParcoords} from "./cars-parcoords.js";
export {default as clamp} from "./clamp.js";
export {default as collapsedHistogram} from "./collapsed-histogram.js";
+export {default as countryCentroids} from "./country-centroids.js";
export {default as covidIhmeProjectedDeaths} from "./covid-ihme-projected-deaths.js";
export {default as crimeanWarArrow} from "./crimean-war-arrow.js";
export {default as crimeanWarLine} from "./crimean-war-line.js";
@@ -251,6 +252,7 @@ export {default as usCongressAgeColorExplicit} from "./us-congress-age-color-exp
export {default as usCongressAgeGender} from "./us-congress-age-gender.js";
export {default as usCongressAgeSymbolExplicit} from "./us-congress-age-symbol-explicit.js";
export {default as usCountyChoropleth} from "./us-county-choropleth.js";
+export {default as usCountySpikes} from "./us-county-spikes.js";
export {default as usPopulationStateAge} from "./us-population-state-age.js";
export {default as usPopulationStateAgeDots} from "./us-population-state-age-dots.js";
export {default as usPresidentFavorabilityDots} from "./us-president-favorability-dots.js";
diff --git a/test/plots/us-county-spikes.js b/test/plots/us-county-spikes.js
new file mode 100644
index 0000000000..031b755b09
--- /dev/null
+++ b/test/plots/us-county-spikes.js
@@ -0,0 +1,31 @@
+import * as Plot from "@observablehq/plot";
+import * as d3 from "d3";
+import {feature, mesh} from "topojson-client";
+
+export default async function () {
+ const [[nation, counties, statemesh], population] = await Promise.all([
+ d3
+ .json("data/us-counties-10m.json")
+ .then((us) => [
+ feature(us, us.objects.nation),
+ feature(us, us.objects.counties),
+ mesh(us, us.objects.states, (a, b) => a !== b)
+ ]),
+ d3
+ .csv("data/us-county-population.csv")
+ .then((data) => new Map(data.map(({state, county, population}) => [state + county, +population])))
+ ]);
+ return Plot.plot({
+ width: 960,
+ height: 600,
+ projection: "albers-usa",
+ length: {
+ range: [0, 200]
+ },
+ marks: [
+ Plot.geo(nation, {fill: "#e0e0e0"}),
+ Plot.geo(statemesh, {stroke: "white"}),
+ Plot.spike(counties.features, Plot.geoCentroid({stroke: "red", length: (d) => population.get(d.id)}))
+ ]
+ });
+}
diff --git a/test/plots/us-presidential-election-map-2020.js b/test/plots/us-presidential-election-map-2020.js
index 4ed989e6d0..329358b044 100644
--- a/test/plots/us-presidential-election-map-2020.js
+++ b/test/plots/us-presidential-election-map-2020.js
@@ -7,23 +7,25 @@ export default async function () {
d3.json("data/us-counties-10m.json").then((us) => [feature(us, us.objects.counties), mesh(us, us.objects.states)]),
d3.csv("data/us-presidential-election-2020.csv")
]);
- const centroids = new Map(counties.features.map((d) => [d.id, d3.geoCentroid(d)]));
+ const geom = new Map(counties.features.map((d) => [d.id, d]));
return Plot.plot({
width: 960,
height: 600,
projection: "albers-usa",
marks: [
Plot.geo(statemesh),
- Plot.vector(elections, {
- filter: (d) => d.votes > 0,
- anchor: "start",
- x: (d) => centroids.get(d.fips)?.[0],
- y: (d) => centroids.get(d.fips)?.[1],
- sort: (d) => Math.abs(+d.results_trumpd - +d.results_bidenj),
- stroke: (d) => (+d.results_trumpd > +d.results_bidenj ? "red" : "blue"),
- length: (d) => Math.sqrt(Math.abs(+d.margin2020 * +d.votes)),
- rotate: (d) => (+d.results_bidenj < +d.results_trumpd ? 60 : -60)
- })
+ Plot.vector(
+ elections,
+ Plot.geoCentroid({
+ geometry: ({fips}) => geom.get(fips),
+ filter: (d) => d.votes > 0,
+ anchor: "start",
+ sort: (d) => Math.abs(+d.results_trumpd - +d.results_bidenj),
+ stroke: (d) => (+d.results_trumpd > +d.results_bidenj ? "red" : "blue"),
+ length: (d) => Math.sqrt(Math.abs(+d.margin2020 * +d.votes)),
+ rotate: (d) => (+d.results_bidenj < +d.results_trumpd ? 60 : -60)
+ })
+ )
]
});
}