@knowvah/dot-engine 2.3.1 → 2.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (115) hide show
  1. package/dist/common/arith.d.ts +12 -0
  2. package/dist/common/arith.d.ts.map +1 -1
  3. package/dist/common/edge-in-box.d.ts +31 -0
  4. package/dist/common/edge-in-box.d.ts.map +1 -0
  5. package/dist/common/htmltable-emit.d.ts +1 -1
  6. package/dist/common/htmltable-emit.d.ts.map +1 -1
  7. package/dist/common/make-label.d.ts +3 -1
  8. package/dist/common/make-label.d.ts.map +1 -1
  9. package/dist/common/poly-gencode.d.ts +12 -1
  10. package/dist/common/poly-gencode.d.ts.map +1 -1
  11. package/dist/gvc/device.d.ts.map +1 -1
  12. package/dist/gvc/emit-gates.d.ts +35 -0
  13. package/dist/gvc/emit-gates.d.ts.map +1 -0
  14. package/dist/gvc/job.d.ts +4 -0
  15. package/dist/gvc/job.d.ts.map +1 -1
  16. package/dist/gvc/viewport.d.ts +13 -0
  17. package/dist/gvc/viewport.d.ts.map +1 -1
  18. package/dist/index.js +821 -548
  19. package/dist/index.js.map +4 -4
  20. package/dist/layout/circo/blockpath.d.ts +1 -38
  21. package/dist/layout/circo/blockpath.d.ts.map +1 -1
  22. package/dist/layout/circo/crossings.d.ts +59 -0
  23. package/dist/layout/circo/crossings.d.ts.map +1 -0
  24. package/dist/layout/dot/edge-route-chain.d.ts +5 -3
  25. package/dist/layout/dot/edge-route-chain.d.ts.map +1 -1
  26. package/dist/layout/dot/edge-route.d.ts.map +1 -1
  27. package/dist/layout/dot/index.d.ts +10 -2
  28. package/dist/layout/dot/index.d.ts.map +1 -1
  29. package/dist/layout/dot/ortho-adapter.d.ts +6 -2
  30. package/dist/layout/dot/ortho-adapter.d.ts.map +1 -1
  31. package/dist/layout/dot/pack-components.d.ts +4 -1
  32. package/dist/layout/dot/pack-components.d.ts.map +1 -1
  33. package/dist/layout/dot/splines-flat-multi.d.ts +4 -4
  34. package/dist/layout/dot/splines-flat.d.ts +1 -11
  35. package/dist/layout/dot/splines-flat.d.ts.map +1 -1
  36. package/dist/layout/dot/splines-route.d.ts.map +1 -1
  37. package/dist/layout/neato/constraint-adjust.d.ts +32 -0
  38. package/dist/layout/neato/constraint-adjust.d.ts.map +1 -1
  39. package/dist/layout/neato/multispline.d.ts.map +1 -1
  40. package/dist/layout/neato/splines.d.ts.map +1 -1
  41. package/dist/layout/pack/poly-pack.d.ts +3 -0
  42. package/dist/layout/pack/poly-pack.d.ts.map +1 -1
  43. package/dist/layout/pack/poly-place.d.ts.map +1 -1
  44. package/dist/layout/sfdp/__fixtures__/pcp-rotate-native.d.ts +23 -0
  45. package/dist/layout/sfdp/__fixtures__/pcp-rotate-native.d.ts.map +1 -0
  46. package/dist/layout/sfdp/spring-driver.d.ts +6 -0
  47. package/dist/layout/sfdp/spring-driver.d.ts.map +1 -1
  48. package/dist/ortho/index.d.ts +4 -1
  49. package/dist/ortho/index.d.ts.map +1 -1
  50. package/dist/ortho/maze.d.ts +5 -2
  51. package/dist/ortho/maze.d.ts.map +1 -1
  52. package/dist/ortho/partition.d.ts +8 -1
  53. package/dist/ortho/partition.d.ts.map +1 -1
  54. package/dist/ortho/trap-segment.d.ts +2 -1
  55. package/dist/ortho/trap-segment.d.ts.map +1 -1
  56. package/dist/ortho/trapezoid.d.ts.map +1 -1
  57. package/dist/parser/index.d.ts +0 -7
  58. package/dist/parser/index.d.ts.map +1 -1
  59. package/dist/parser/number-scan.d.ts +31 -0
  60. package/dist/parser/number-scan.d.ts.map +1 -0
  61. package/dist/render/dot/edge-draw.d.ts +12 -0
  62. package/dist/render/dot/edge-draw.d.ts.map +1 -1
  63. package/dist/render/svg-graph.d.ts +6 -5
  64. package/dist/render/svg-graph.d.ts.map +1 -1
  65. package/dist/render/svg.d.ts +2 -21
  66. package/dist/render/svg.d.ts.map +1 -1
  67. package/dist/render.js +821 -548
  68. package/dist/render.js.map +4 -4
  69. package/dist/xdot/parse.d.ts.map +1 -1
  70. package/package.json +1 -1
  71. package/src/common/arith.ts +25 -0
  72. package/src/common/edge-in-box.ts +54 -0
  73. package/src/common/graph-init.ts +3 -3
  74. package/src/common/htmltable-emit.ts +4 -2
  75. package/src/common/make-label.ts +3 -1
  76. package/src/common/poly-gencode.ts +18 -4
  77. package/src/gvc/device.ts +8 -41
  78. package/src/gvc/edge-labels.ts +30 -13
  79. package/src/gvc/emit-gates.ts +89 -0
  80. package/src/gvc/job.ts +4 -0
  81. package/src/gvc/viewport.ts +29 -0
  82. package/src/layout/circo/blockpath.ts +6 -125
  83. package/src/layout/circo/crossings.ts +171 -0
  84. package/src/layout/dot/__fixtures__/2784.dot +1 -0
  85. package/src/layout/dot/__fixtures__/2784.native-16.1.svg +48 -0
  86. package/src/layout/dot/edge-route-chain.ts +11 -5
  87. package/src/layout/dot/edge-route.ts +2 -1
  88. package/src/layout/dot/index.ts +14 -4
  89. package/src/layout/dot/ortho-adapter.ts +7 -3
  90. package/src/layout/dot/pack-components.ts +11 -4
  91. package/src/layout/dot/splines-flat-multi.ts +4 -4
  92. package/src/layout/dot/splines-flat.ts +5 -32
  93. package/src/layout/dot/splines-route.ts +10 -2
  94. package/src/layout/dot/splines.ts +6 -6
  95. package/src/layout/neato/constraint-adjust.ts +10 -4
  96. package/src/layout/neato/multispline.ts +26 -9
  97. package/src/layout/neato/splines.ts +7 -7
  98. package/src/layout/pack/poly-pack.ts +19 -6
  99. package/src/layout/pack/poly-place.ts +9 -2
  100. package/src/layout/sfdp/__fixtures__/pcp-rotate-native.ts +94 -0
  101. package/src/layout/sfdp/spring-driver.ts +45 -13
  102. package/src/ortho/index.ts +22 -13
  103. package/src/ortho/maze.ts +8 -2
  104. package/src/ortho/partition.ts +17 -2
  105. package/src/ortho/trap-segment.ts +47 -24
  106. package/src/ortho/trapezoid.ts +24 -15
  107. package/src/parser/dot.js +334 -343
  108. package/src/parser/dot.pegjs +19 -5
  109. package/src/parser/index.ts +15 -0
  110. package/src/parser/number-scan.ts +118 -0
  111. package/src/render/dot/edge-draw.ts +25 -0
  112. package/src/render/svg-graph.ts +77 -47
  113. package/src/render/svg-helpers.ts +2 -2
  114. package/src/render/svg.ts +4 -41
  115. package/src/xdot/parse.ts +19 -5
package/dist/render.js CHANGED
@@ -5086,8 +5086,8 @@ function normalizeFontName(name) {
5086
5086
  for (let i = 0; i < name.length; i++) {
5087
5087
  const ch = name[i];
5088
5088
  const code = ch.charCodeAt(0);
5089
- const isLetter = code >= 65 && code <= 90 || code >= 97 && code <= 122;
5090
- if (isLetter) result += ch.toLowerCase();
5089
+ const isLetter2 = code >= 65 && code <= 90 || code >= 97 && code <= 122;
5090
+ if (isLetter2) result += ch.toLowerCase();
5091
5091
  }
5092
5092
  return result;
5093
5093
  }
@@ -7338,7 +7338,7 @@ function interpretCRNL(str) {
7338
7338
 
7339
7339
  // src/common/make-label.ts
7340
7340
  var DEFAULT_FONTSIZE2 = 14;
7341
- var DEFAULT_FONTNAME = "Times,serif";
7341
+ var DEFAULT_FONTNAME = "Times-Roman";
7342
7342
  var DEFAULT_COLOR = "black";
7343
7343
  function getPenColor(obj) {
7344
7344
  if (obj === void 0) return void 0;
@@ -8765,6 +8765,10 @@ var RenderJob = class {
8765
8765
  format;
8766
8766
  bb = { ll: { x: 0, y: 0 }, ur: { x: 0, y: 0 } };
8767
8767
  pad = { x: 0, y: 0 };
8768
+ /** Current page clip in graph units, as setup_page computes it from the
8769
+ * viewport focus/view (see setupPageClip). Read by the SVG page translate and
8770
+ * background. @see lib/gvc/gvcjob.h:GVJ_s.clip; lib/common/emit.c:setup_page */
8771
+ clip = { ll: { x: 0, y: 0 }, ur: { x: 0, y: 0 } };
8768
8772
  /** Graph-level `margin=` (init_job_margin); page-pagination margin, distinct
8769
8773
  * from node/cluster label margin. @see lib/common/emit.c:3309-3331 */
8770
8774
  margin = { x: 0, y: 0 };
@@ -10317,11 +10321,11 @@ function emitHtmlLabel(placed, pos, renderer, job) {
10317
10321
  style: placed.style
10318
10322
  });
10319
10323
  }
10320
- for (const cell2 of placed.cells) emitHtmlCell(cell2, pos, renderer, job);
10321
10324
  emitTableRules(placed, pos, renderer, job);
10322
10325
  if (placed.border > 0) {
10323
10326
  emitBorder({ box: placed.box, pos, border: placed.border, color: placed.color, sides: placed.sides, style: placed.style }, renderer, job);
10324
10327
  }
10328
+ for (const cell2 of placed.cells) emitHtmlCell(cell2, pos, renderer, job);
10325
10329
  }
10326
10330
  if (inAnchor) endHtmlAnchor(renderer, job);
10327
10331
  if (clustersLast && initHtmlAnchor(anchorData, tblBox, renderer, job)) {
@@ -10509,6 +10513,18 @@ function fms(a, b, c) {
10509
10513
  function cround(v) {
10510
10514
  return v >= 0 ? Math.floor(v + 0.5) : Math.ceil(v - 0.5);
10511
10515
  }
10516
+ var INT64_MAX = 2n ** 63n - 1n;
10517
+ var INT64_MIN = -(2n ** 63n);
10518
+ var TWO_POW_63 = 2 ** 63;
10519
+ function croundNarrow32(v) {
10520
+ const r = cround(v);
10521
+ let i64;
10522
+ if (Number.isNaN(r)) i64 = 0n;
10523
+ else if (r >= TWO_POW_63) i64 = INT64_MAX;
10524
+ else if (r < -TWO_POW_63) i64 = INT64_MIN;
10525
+ else i64 = BigInt(r);
10526
+ return Number(BigInt.asIntN(32, i64));
10527
+ }
10512
10528
  function RADIANS(deg) {
10513
10529
  return deg / 180 * Math.PI;
10514
10530
  }
@@ -11346,6 +11362,8 @@ function parseSegs(colorlist) {
11346
11362
  }
11347
11363
 
11348
11364
  // src/util/math.ts
11365
+ var INT32_MAX = 2147483647;
11366
+ var INT32_MIN = -2147483648;
11349
11367
  function isExactlyEqual(a, b) {
11350
11368
  const buf = new ArrayBuffer(16);
11351
11369
  const dv = new DataView(buf);
@@ -11357,6 +11375,11 @@ function isExactlyEqual(a, b) {
11357
11375
  }
11358
11376
  return true;
11359
11377
  }
11378
+ function d2i(v) {
11379
+ if (v > INT32_MAX) return INT32_MAX;
11380
+ if (v < INT32_MIN) return INT32_MIN;
11381
+ return Math.trunc(v);
11382
+ }
11360
11383
 
11361
11384
  // src/common/colorData.ts
11362
11385
  var COLOR_LIB = [
@@ -14568,9 +14591,12 @@ function isMulticolor(fillcolor) {
14568
14591
  return fillcolor.includes(":");
14569
14592
  }
14570
14593
  function renderEllipse(ring, coord, renderer, job, filled) {
14571
- const rx = Math.abs((ring[1].x - ring[0].x) / 2);
14572
- const ry = Math.abs((ring[1].y - ring[0].y) / 2);
14573
- const center = transformPoint(coord, job);
14594
+ const af0 = { x: ring[0].x + coord.x, y: ring[0].y + coord.y };
14595
+ const af1 = { x: ring[1].x + coord.x, y: ring[1].y + coord.y };
14596
+ const mid = { x: (af0.x + af1.x) / 2, y: (af0.y + af1.y) / 2 };
14597
+ const rx = af1.x - mid.x;
14598
+ const ry = af1.y - mid.y;
14599
+ const center = transformPoint(mid, job);
14574
14600
  renderer.ellipse(center, rx, ry, filled, job);
14575
14601
  }
14576
14602
  function renderPolygon(ring, coord, renderer, job, filled) {
@@ -18173,7 +18199,7 @@ var BGCOLOR_TRANSPARENT = "\0transparent";
18173
18199
  function formatG(n) {
18174
18200
  return String(parseFloat(n.toPrecision(6)));
18175
18201
  }
18176
- function emitSvgTag(job) {
18202
+ function emitSvgTag(job, svgid = "") {
18177
18203
  const bb = job.bb;
18178
18204
  const szx = bb.ur.x - bb.ll.x + 2 * job.pad.x;
18179
18205
  const szy = bb.ur.y - bb.ll.y + 2 * job.pad.y;
@@ -18182,16 +18208,20 @@ function emitSvgTag(job) {
18182
18208
  const rotated = job.rotation !== 0;
18183
18209
  const pageX = rotated ? viewY : viewX;
18184
18210
  const pageY = rotated ? viewX : viewY;
18185
- const w = cround(pageX + 2 * job.margin.x);
18186
- const h = cround(pageY + 2 * job.margin.y);
18211
+ const w = croundNarrow32(pageX + 2 * job.margin.x);
18212
+ const h = croundNarrow32(pageY + 2 * job.margin.y);
18187
18213
  job.write('<svg width="' + String(w) + 'pt" height="' + String(h) + 'pt"\n');
18188
- const vbLLx = cround(job.margin.x);
18189
- const vbLLy = cround(job.margin.y);
18190
- const vbURx = cround(job.margin.x + pageX);
18191
- const vbURy = cround(job.margin.y + pageY);
18214
+ const vbLLx = croundNarrow32(job.margin.x);
18215
+ const vbLLy = croundNarrow32(job.margin.y);
18216
+ const vbURx = croundNarrow32(job.margin.x + pageX);
18217
+ const vbURy = croundNarrow32(job.margin.y + pageY);
18192
18218
  job.write(' viewBox="' + String(vbLLx) + ".00 " + String(vbLLy) + ".00 " + String(vbURx) + ".00 " + String(vbURy) + '.00"\n');
18193
18219
  job.write(' xmlns="http://www.w3.org/2000/svg"');
18194
- job.write(' xmlns:xlink="http://www.w3.org/1999/xlink">\n');
18220
+ job.write(' xmlns:xlink="http://www.w3.org/1999/xlink"');
18221
+ if (svgid !== void 0 && svgid.length > 0) {
18222
+ job.write(' id="' + escapeXmlTitle(svgid) + '"');
18223
+ }
18224
+ job.write(">\n");
18195
18225
  }
18196
18226
  function emitGraphGroupOpen(graphId, classStr, tx, ty, job) {
18197
18227
  const sx = formatG(job.scale.x);
@@ -18215,12 +18245,12 @@ function resolveGraphBgcolor(bgcolorAttr) {
18215
18245
  const solid = grad !== null ? grad[0] : bgcolorAttr;
18216
18246
  return colorPaint(resolveRenderColor(solid));
18217
18247
  }
18218
- function emitGraphBackground(bb, resolvedColor, job) {
18248
+ function emitGraphBackground(clip, resolvedColor, job) {
18219
18249
  if (resolvedColor === BGCOLOR_TRANSPARENT) return;
18220
- const left2 = bb.ll.x - job.pad.x;
18221
- const right2 = bb.ur.x + job.pad.x;
18222
- const top = -(bb.ur.y + job.pad.y);
18223
- const bottom = -(bb.ll.y - job.pad.y);
18250
+ const left2 = clip.ll.x;
18251
+ const right2 = clip.ur.x;
18252
+ const top = -clip.ur.y;
18253
+ const bottom = -clip.ll.y;
18224
18254
  const corners = [
18225
18255
  [left2, bottom],
18226
18256
  [left2, top],
@@ -18237,11 +18267,11 @@ function emitGraphBackground(bb, resolvedColor, job) {
18237
18267
  });
18238
18268
  job.write('"/>\n');
18239
18269
  }
18240
- function bgGradientPts(bb, pad) {
18241
- const left2 = bb.ll.x - pad.x;
18242
- const right2 = bb.ur.x + pad.x;
18243
- const bottom = bb.ll.y - pad.y;
18244
- const top = bb.ur.y + pad.y;
18270
+ function bgGradientPts(clip) {
18271
+ const left2 = clip.ll.x;
18272
+ const right2 = clip.ur.x;
18273
+ const bottom = clip.ll.y;
18274
+ const top = clip.ur.y;
18245
18275
  return [
18246
18276
  { x: left2, y: bottom },
18247
18277
  { x: left2, y: top },
@@ -18249,11 +18279,11 @@ function bgGradientPts(bb, pad) {
18249
18279
  { x: right2, y: bottom }
18250
18280
  ];
18251
18281
  }
18252
- function writeGradientPolygon(bb, id, job) {
18253
- const left2 = bb.ll.x - job.pad.x;
18254
- const right2 = bb.ur.x + job.pad.x;
18255
- const top = -(bb.ur.y + job.pad.y);
18256
- const bottom = -(bb.ll.y - job.pad.y);
18282
+ function writeGradientPolygon(clip, id, job) {
18283
+ const left2 = clip.ll.x;
18284
+ const right2 = clip.ur.x;
18285
+ const top = -clip.ur.y;
18286
+ const bottom = -clip.ll.y;
18257
18287
  const corners = [
18258
18288
  [left2, bottom],
18259
18289
  [left2, top],
@@ -18270,7 +18300,7 @@ function writeGradientPolygon(bb, id, job) {
18270
18300
  });
18271
18301
  job.write('"/>\n');
18272
18302
  }
18273
- function emitGradientBackground(bb, spec, job) {
18303
+ function emitGradientBackground(clip, spec, job) {
18274
18304
  const obj = createObjState(0 /* RootGraph */);
18275
18305
  obj.id = "graph0";
18276
18306
  obj.fillColor = resolveRenderColor(spec.fillColor);
@@ -18285,10 +18315,10 @@ function emitGradientBackground(bb, spec, job) {
18285
18315
  emitRadialGradient(job, gid);
18286
18316
  } else {
18287
18317
  gid = gradientId("graph0", "l", job.linearGradId++);
18288
- emitLinearGradient(job, bgGradientPts(bb, job.pad), gid);
18318
+ emitLinearGradient(job, bgGradientPts(clip), gid);
18289
18319
  }
18290
18320
  job.popObj();
18291
- writeGradientPolygon(bb, gid, job);
18321
+ writeGradientPolygon(clip, gid, job);
18292
18322
  }
18293
18323
  function resolveBgGradientSpec(g, bgcolorAttr) {
18294
18324
  const stop = findStopColor(bgcolorAttr);
@@ -18298,17 +18328,17 @@ function resolveBgGradientSpec(g, bgcolorAttr) {
18298
18328
  const angle = angleStr ? parseInt(angleStr, 10) || 0 : 0;
18299
18329
  return { fillColor: stop.fillColor, stopColor: stop.stopColor, frac: stop.frac, angle, radial: flags.radial };
18300
18330
  }
18301
- function emitBgcolorBackground(g, bb, bgcolorAttr, job) {
18331
+ function emitBgcolorBackground(g, clip, bgcolorAttr, job) {
18302
18332
  if (!bgcolorAttr || bgcolorAttr.length === 0 || bgcolorAttr === "transparent") {
18303
- emitGraphBackground(bb, resolveGraphBgcolor(bgcolorAttr), job);
18333
+ emitGraphBackground(clip, resolveGraphBgcolor(bgcolorAttr), job);
18304
18334
  return;
18305
18335
  }
18306
18336
  const spec = resolveBgGradientSpec(g, bgcolorAttr);
18307
18337
  if (spec !== null) {
18308
- emitGradientBackground(bb, spec, job);
18338
+ emitGradientBackground(clip, spec, job);
18309
18339
  return;
18310
18340
  }
18311
- emitGraphBackground(bb, resolveGraphBgcolor(bgcolorAttr), job);
18341
+ emitGraphBackground(clip, resolveGraphBgcolor(bgcolorAttr), job);
18312
18342
  }
18313
18343
  function svgBeginGraph(g, job) {
18314
18344
  job.devscale = { x: 1, y: -1 };
@@ -18322,13 +18352,23 @@ function svgBeginGraph(g, job) {
18322
18352
  }
18323
18353
  job.write(SVG_DOCTYPE);
18324
18354
  job.write(SVG_GENERATOR_COMMENT);
18325
- emitSvgTag(job);
18355
+ const comment = g.attrs.get("comment");
18356
+ if (comment !== void 0 && comment.length > 0) svgComment(comment, job);
18357
+ emitTitlePagesComment(g, job);
18358
+ emitSvgTag(job, g.attrs.get("svgid"));
18359
+ }
18360
+ function emitTitlePagesComment(g, job) {
18361
+ job.write("<!--");
18362
+ if (g.name.length > 0 && g.name[0] !== "%") {
18363
+ job.write(" Title: " + escapeXmlTitle(g.name));
18364
+ }
18365
+ job.write(" Pages: 1 -->\n");
18326
18366
  }
18327
18367
  function svgBeginPage(g, job) {
18328
- const bb = job.bb;
18368
+ const clip = job.clip;
18329
18369
  const z = job.scale.x;
18330
- const tx = job.rotation !== 0 ? -(bb.ur.x + job.pad.x) - job.margin.x / z : job.pad.x + job.margin.x / z;
18331
- const ty = bb.ur.y + job.pad.y + job.margin.y / z;
18370
+ const tx = job.rotation !== 0 ? -clip.ur.x - job.margin.x / z : -clip.ll.x + job.margin.x / z;
18371
+ const ty = clip.ur.y + job.margin.y / z;
18332
18372
  emitGraphGroupOpen(
18333
18373
  job.idLayerPrefix() + svgGraphId(g, job),
18334
18374
  svgGraphClass(g),
@@ -18339,7 +18379,7 @@ function svgBeginPage(g, job) {
18339
18379
  emitGraphTitle(g, job);
18340
18380
  }
18341
18381
  function svgPageBackground(g, job) {
18342
- emitBgcolorBackground(g, job.bb, g.attrs.get("bgcolor"), job);
18382
+ emitBgcolorBackground(g, job.clip, g.attrs.get("bgcolor"), job);
18343
18383
  }
18344
18384
  function svgEndPage(job) {
18345
18385
  job.write("</g>\n");
@@ -18675,7 +18715,7 @@ function svgPolyline(pts, job) {
18675
18715
  job.write('"/>\n');
18676
18716
  }
18677
18717
  function svgComment(text, job) {
18678
- job.write("<!-- " + escapeXml(text) + " -->\n");
18718
+ job.write("<!-- " + escapeXmlTitle(text) + " -->\n");
18679
18719
  }
18680
18720
  function svgEdgePath(e, job) {
18681
18721
  const spl = e.info.spl;
@@ -18862,6 +18902,22 @@ function initJobViewportZoom(bb, size, pad) {
18862
18902
  if (drawingNeedsFit(size, szx, szy)) return Math.min(size.x / szx, size.y / szy);
18863
18903
  return 1;
18864
18904
  }
18905
+ function setupPageClip(bb, size, pad, z) {
18906
+ const jbLL = { x: bb.ll.x - pad.x, y: bb.ll.y - pad.y };
18907
+ const jbUR = { x: bb.ur.x + pad.x, y: bb.ur.y + pad.y };
18908
+ const sz = { x: jbUR.x - jbLL.x, y: jbUR.y - jbLL.y };
18909
+ if (size !== null && size.x > 1e-3 && size.y > 1e-3) {
18910
+ if (sz.x <= 1e-3) sz.x = size.x;
18911
+ if (sz.y <= 1e-3) sz.y = size.y;
18912
+ }
18913
+ const focus = { x: 0.5 * (bb.ll.x + bb.ur.x), y: 0.5 * (bb.ll.y + bb.ur.y) };
18914
+ const pageSize = { x: z * sz.x / z, y: z * sz.y / z };
18915
+ const ll = {
18916
+ x: focus.x + pageSize.x * (0 - 1 / 2),
18917
+ y: focus.y + pageSize.y * (0 - 1 / 2)
18918
+ };
18919
+ return { ll, ur: { x: ll.x + pageSize.x, y: ll.y + pageSize.y } };
18920
+ }
18865
18921
 
18866
18922
  // src/gvc/anchor.ts
18867
18923
  function attr(attrs, key) {
@@ -19373,10 +19429,22 @@ function renderClusterLabel(sg, renderer, job) {
19373
19429
  renderOneLabel(sg.info.label, renderer, job, false);
19374
19430
  }
19375
19431
 
19376
- // src/gvc/device.ts
19377
- function labelTextOf2(lp) {
19378
- return lp?.text ?? null;
19432
+ // src/common/edge-in-box.ts
19433
+ function overlapLabel(lp, b) {
19434
+ const sx = lp.dimen.x / 2;
19435
+ const sy = lp.dimen.y / 2;
19436
+ const bb = {
19437
+ ll: { x: lp.pos.x - sx, y: lp.pos.y - sy },
19438
+ ur: { x: lp.pos.x + sx, y: lp.pos.y + sy }
19439
+ };
19440
+ return boxOverlap(b, bb);
19379
19441
  }
19442
+ function edgeHasDrawableContent(e, clip) {
19443
+ const i = e.info;
19444
+ return i.spl !== void 0 || i.label !== void 0 && i.label.set && overlapLabel(i.label, clip) || i.xlabel !== void 0 || i.head_label !== void 0 || i.tail_label !== void 0;
19445
+ }
19446
+
19447
+ // src/gvc/emit-gates.ts
19380
19448
  function nodeBBox(n) {
19381
19449
  const { coord, lw, rw, ht } = n.info;
19382
19450
  return {
@@ -19391,6 +19459,26 @@ function nodeInBox(n, job) {
19391
19459
  };
19392
19460
  return boxOverlap(nodeBBox(n), clip);
19393
19461
  }
19462
+ function gvrenderComment(renderer, job, str) {
19463
+ if (str === void 0 || str.length === 0) return;
19464
+ renderer.comment?.(str, job);
19465
+ }
19466
+ function emitNodeComments(n, renderer, job) {
19467
+ gvrenderComment(renderer, job, n.name);
19468
+ gvrenderComment(renderer, job, nodeAttr(n, n.root, "comment"));
19469
+ }
19470
+ function emitEdgeComments(e, renderer, job) {
19471
+ if (!edgeHasDrawableContent(e, job.bb)) return;
19472
+ const kind = e.head.root.kind;
19473
+ const op = kind === "directed" || kind === "strict-directed" ? "->" : "--";
19474
+ gvrenderComment(renderer, job, e.tail.name + op + e.head.name);
19475
+ gvrenderComment(renderer, job, e.attrs.get("comment"));
19476
+ }
19477
+
19478
+ // src/gvc/device.ts
19479
+ function labelTextOf2(lp) {
19480
+ return lp?.text ?? null;
19481
+ }
19394
19482
  function emitNodeBody(n, renderer, job) {
19395
19483
  setHtmlAnchorObj(svgNodeId(n, job), labelTextOf2(n.info.label), job.obj ?? void 0);
19396
19484
  setHtmlObjImgscale(nodeAttr(n, n.root, "imagescale"));
@@ -19406,6 +19494,7 @@ function renderNode(n, renderer, job, done) {
19406
19494
  if (done.has(n)) return;
19407
19495
  done.add(n);
19408
19496
  if (!nodeInBox(n, job)) return;
19497
+ emitNodeComments(n, renderer, job);
19409
19498
  const nodeStyle = nodeAttr(n, n.root, "style");
19410
19499
  if (parseStyleFlags(nodeStyle).invis) return;
19411
19500
  if (!isPointNode(n) && styleHasInvisibleAlias(nodeStyle)) return;
@@ -19431,6 +19520,7 @@ function setEdgePen(e, job) {
19431
19520
  obj.rawStyle = styleTokens(e.attrs.get("style"));
19432
19521
  }
19433
19522
  function renderEdge(e, renderer, job) {
19523
+ emitEdgeComments(e, renderer, job);
19434
19524
  const edgeStyle = e.attrs.get("style");
19435
19525
  if (parseStyleFlags(edgeStyle).invis || styleHasInvisibleAlias(edgeStyle)) return;
19436
19526
  const obj = createObjState(3 /* Edge */);
@@ -19544,7 +19634,9 @@ function render(ctx, g, format, inlineImages = false) {
19544
19634
  job.bb = g.info.bb;
19545
19635
  job.pad = parseGraphPad(g.attrs.get("pad"));
19546
19636
  job.margin = parseGraphMargin(g.attrs.get("margin"));
19547
- const z = initJobViewportZoom(job.bb, parseDrawingSize(g.attrs.get("size")), job.pad);
19637
+ const drawingSize = parseDrawingSize(g.attrs.get("size"));
19638
+ const z = initJobViewportZoom(job.bb, drawingSize, job.pad);
19639
+ job.clip = setupPageClip(job.bb, drawingSize, job.pad, z);
19548
19640
  const drawingDpi = lateDouble(
19549
19641
  g.attrs.get("dpi"),
19550
19642
  lateDouble(g.attrs.get("resolution"), 0, 0),
@@ -27199,7 +27291,7 @@ function routeMultiRankEdgeFaithful(g, e) {
27199
27291
  }
27200
27292
  const segs = chainSegments(e);
27201
27293
  if (segs.length === 0 || segs[segs.length - 1].head !== e.head) return null;
27202
- return routeChainSegmented(g, segs[0], segs[segs.length - 1], segs);
27294
+ return routeChainSegmented(g, segs[0], segs[segs.length - 1], segs) ?? "lost";
27203
27295
  }
27204
27296
  function entryRunSegments(e) {
27205
27297
  const segs = [e];
@@ -27271,7 +27363,10 @@ function routeBackEdge(e, _tailBox, _headBox, g) {
27271
27363
  if (segs.length < 2 || segs[segs.length - 1].head !== e.tail) return;
27272
27364
  const fwdEdge = makeFwdEdge(e);
27273
27365
  const fwd = routeChainSegmented(g, segs[0], segs[segs.length - 1], segs);
27274
- if (fwd === null) return;
27366
+ if (fwd === null) {
27367
+ e.info.lost = true;
27368
+ return;
27369
+ }
27275
27370
  clipAndInstall(fwdEdge, fwdEdge.head, fwd, fwd.length, buildDotSinfo());
27276
27371
  if (swapEndsP(e)) swapEdgeSpline(e);
27277
27372
  }
@@ -27423,7 +27518,7 @@ function baseSplineForGroup(g, e0) {
27423
27518
  const orig = resolveOrigEdge(e0);
27424
27519
  const fe = isBackEdgeMember(orig) ? makeFwdEdge(orig) : orig;
27425
27520
  const pts = routeRegularEdgeFaithful(g, fe);
27426
- if (pts === "lost") return null;
27521
+ if (pts === "lost") return "lost";
27427
27522
  return pts ?? routeMultiRankEdgeFaithful(g, fe);
27428
27523
  }
27429
27524
  function isBackEdgeMember(e) {
@@ -27452,6 +27547,10 @@ function routeParallelEdgeGroup(g, edges, multisep) {
27452
27547
  return o.info.head_port?.defined || o.info.tail_port?.defined;
27453
27548
  }) ?? edges[0];
27454
27549
  const base = baseSplineForGroup(g, baseEdge);
27550
+ if (base === "lost") {
27551
+ for (const e of edges) resolveOrigEdge(e).info.lost = true;
27552
+ return;
27553
+ }
27455
27554
  if (base === null) return;
27456
27555
  if (cnt === 1) {
27457
27556
  installShiftedEdge(edges[0], base);
@@ -30357,6 +30456,10 @@ function routeOneEdge(e, g) {
30357
30456
  function routeFaithfulMultiRank(e, g) {
30358
30457
  const pts = routeMultiRankEdgeFaithful(g, e);
30359
30458
  if (pts === null) return false;
30459
+ if (pts === "lost") {
30460
+ e.info.lost = true;
30461
+ return true;
30462
+ }
30360
30463
  clipAndInstall(e, e.head, pts, pts.length, buildDotSinfo());
30361
30464
  return true;
30362
30465
  }
@@ -30865,24 +30968,28 @@ function addSegment(segnum, seg2, tr, qs) {
30865
30968
  swapSegEndpoints(s);
30866
30969
  isSwapped = true;
30867
30970
  }
30868
- let tfirst;
30869
- if (!inserted(segnum, seg2, isSwapped ? LASTPT : FIRSTPT)) {
30870
- tfirst = insertV0(s, seg2, tr, qs, segnum);
30871
- } else {
30872
- tfirst = locateEndpoint(s.v0, s.v1, s.root0, seg2, qs);
30971
+ const ctx = { s, seg: seg2, tr, qs, segnum, tribot: false, isSwapped };
30972
+ const tfirst = firstTrap(ctx);
30973
+ const tlast = lastTrap(ctx);
30974
+ if (threadSegment(ctx, tfirst, tlast) !== 0) return -1;
30975
+ seg2[segnum].isInserted = true;
30976
+ return 0;
30977
+ }
30978
+ function firstTrap(c) {
30979
+ if (!inserted(c.segnum, c.seg, c.isSwapped ? LASTPT : FIRSTPT)) {
30980
+ return insertV0(c.s, c.seg, c.tr, c.qs, c.segnum);
30873
30981
  }
30874
- let tlast;
30875
- let tribot = false;
30876
- if (!inserted(segnum, seg2, isSwapped ? FIRSTPT : LASTPT)) {
30877
- tlast = insertV1(s, seg2, tr, qs, segnum);
30878
- } else {
30879
- tlast = locateEndpoint(s.v1, s.v0, s.root1, seg2, qs);
30880
- tribot = true;
30982
+ return locateEndpoint(c.s.v0, c.s.v1, c.s.root0, c.seg, c.qs);
30983
+ }
30984
+ function lastTrap(c) {
30985
+ if (!inserted(c.segnum, c.seg, c.isSwapped ? FIRSTPT : LASTPT)) {
30986
+ return insertV1(c.s, c.seg, c.tr, c.qs, c.segnum);
30881
30987
  }
30882
- threadSegment(s, seg2, tr, qs, segnum, tfirst, tlast, tribot, isSwapped);
30883
- seg2[segnum].isInserted = true;
30988
+ c.tribot = true;
30989
+ return locateEndpoint(c.s.v1, c.s.v0, c.s.root1, c.seg, c.qs);
30884
30990
  }
30885
- function threadSegment(s, seg2, tr, qs, segnum, tfirst, tlast, tribot, isSwapped) {
30991
+ function threadSegment(c, tfirst, tlast) {
30992
+ const { s, seg: seg2, tr, qs, segnum, tribot, isSwapped } = c;
30886
30993
  let tfirstr = INVALID_TRAP;
30887
30994
  let tlastr = INVALID_TRAP;
30888
30995
  let t = tfirst;
@@ -30909,17 +31016,20 @@ function threadSegment(s, seg2, tr, qs, segnum, tfirst, tlast, tribot, isSwapped
30909
31016
  if (equalTo(tr[t].lo, tr[tlast].lo)) tlastr = tn;
30910
31017
  const tSav = t;
30911
31018
  const tnSav = tn;
31019
+ if (!isValidTrap(tr[t].d0) && !isValidTrap(tr[t].d1)) {
31020
+ console.error("trapezoid segment construction failed");
31021
+ return -1;
31022
+ }
30912
31023
  t = advanceT(s, seg2, tr, t, tn, tlast, segnum, isSwapped, tribot);
30913
31024
  tr[tSav].rseg = segnum;
30914
31025
  tr[tnSav].lseg = segnum;
30915
31026
  }
30916
31027
  mergeTrapezoids(segnum, tfirst, tlast, S_LEFT, tr, qs);
30917
31028
  mergeTrapezoids(segnum, tfirstr, tlastr, S_RIGHT, tr, qs);
31029
+ return 0;
30918
31030
  }
30919
31031
  function advanceT(s, seg2, tr, t, tn, tlast, segnum, isSwapped, tribot) {
30920
- if (!isValidTrap(tr[t].d0) && !isValidTrap(tr[t].d1)) {
30921
- return INVALID_TRAP;
30922
- } else if (isValidTrap(tr[t].d0) && !isValidTrap(tr[t].d1)) {
31032
+ if (isValidTrap(tr[t].d0) && !isValidTrap(tr[t].d1)) {
30923
31033
  handleD0Only(s, seg2, tr, t, tn, tlast, segnum, isSwapped, tribot);
30924
31034
  return tr[t].d0;
30925
31035
  } else if (!isValidTrap(tr[t].d0) && isValidTrap(tr[t].d1)) {
@@ -30939,33 +31049,16 @@ function findNewRoots(segnum, seg2, tr, qs) {
30939
31049
  // src/ortho/trapezoid.ts
30940
31050
  function constructTrapezoids(nseg, seg2, permute) {
30941
31051
  const qs = [];
30942
- const tr = [];
30943
- tr.push({
30944
- lseg: 0,
30945
- rseg: 0,
30946
- hi: { x: 0, y: 0 },
30947
- lo: { x: 0, y: 0 },
30948
- u0: 0,
30949
- u1: 0,
30950
- d0: 0,
30951
- d1: 0,
30952
- sink: 0,
30953
- usave: 0,
30954
- uside: 0,
30955
- isValid: false
30956
- });
31052
+ const tr = [sentinelTrap()];
30957
31053
  let segi = 0;
30958
31054
  const root = initQueryStructure(permute[segi++], seg2, tr, qs);
30959
- for (let i = 1; i <= nseg; i++) {
30960
- seg2[i].root0 = root;
30961
- seg2[i].root1 = root;
30962
- }
31055
+ seedRoots(nseg, seg2, root);
30963
31056
  const logstar = mathLogstarN(nseg);
30964
31057
  for (let h = 1; h <= logstar; h++) {
30965
31058
  const lo = mathN(nseg, h - 1) + 1;
30966
31059
  const hi = mathN(nseg, h);
30967
31060
  for (let i = lo; i <= hi; i++) {
30968
- addSegment(permute[segi++], seg2, tr, qs);
31061
+ if (addSegment(permute[segi++], seg2, tr, qs) !== 0) return [];
30969
31062
  }
30970
31063
  for (let i = 1; i <= nseg; i++) {
30971
31064
  findNewRoots(i, seg2, tr, qs);
@@ -30973,10 +31066,32 @@ function constructTrapezoids(nseg, seg2, permute) {
30973
31066
  }
30974
31067
  const remaining = mathN(nseg, logstar) + 1;
30975
31068
  for (let i = remaining; i <= nseg; i++) {
30976
- addSegment(permute[segi++], seg2, tr, qs);
31069
+ if (addSegment(permute[segi++], seg2, tr, qs) !== 0) return [];
30977
31070
  }
30978
31071
  return tr;
30979
31072
  }
31073
+ function sentinelTrap() {
31074
+ return {
31075
+ lseg: 0,
31076
+ rseg: 0,
31077
+ hi: { x: 0, y: 0 },
31078
+ lo: { x: 0, y: 0 },
31079
+ u0: 0,
31080
+ u1: 0,
31081
+ d0: 0,
31082
+ d1: 0,
31083
+ sink: 0,
31084
+ usave: 0,
31085
+ uside: 0,
31086
+ isValid: false
31087
+ };
31088
+ }
31089
+ function seedRoots(nseg, seg2, root) {
31090
+ for (let i = 1; i <= nseg; i++) {
31091
+ seg2[i].root0 = root;
31092
+ seg2[i].root1 = root;
31093
+ }
31094
+ }
30980
31095
  function initQueryStructure(segnum, seg2, tr, qs) {
30981
31096
  const s = seg2[segnum];
30982
31097
  const i1 = newQNode(qs);
@@ -31280,10 +31395,18 @@ function partition(cells, bb) {
31280
31395
  const hSeg = h.genSegments(cells, bb, false);
31281
31396
  const hPerm = h.generateRandomOrdering(nsegs);
31282
31397
  const hTr = constructTrapezoids(nsegs, hSeg, hPerm);
31398
+ if (hTr.length === 0) {
31399
+ console.error("horizontal trapezoid construction failed");
31400
+ return null;
31401
+ }
31283
31402
  const hDecomp = h.monotonateTrapezoids(hTr, hSeg, false);
31284
31403
  const vSeg = h.genSegments(cells, bb, true);
31285
31404
  const vPerm = h.generateRandomOrdering(nsegs);
31286
31405
  const vTr = constructTrapezoids(nsegs, vSeg, vPerm);
31406
+ if (vTr.length === 0) {
31407
+ console.error("vertical trapezoid construction failed");
31408
+ return null;
31409
+ }
31287
31410
  const vDecomp = h.monotonateTrapezoids(vTr, vSeg, true);
31288
31411
  const result = [];
31289
31412
  for (const v of vDecomp) {
@@ -31292,7 +31415,7 @@ function partition(cells, bb) {
31292
31415
  if (isect) result.push(isect);
31293
31416
  }
31294
31417
  }
31295
- return result;
31418
+ return result.length === 0 ? null : result;
31296
31419
  }
31297
31420
 
31298
31421
  // src/ortho/rawgraph.ts
@@ -32140,6 +32263,7 @@ function mkMaze(g) {
32140
32263
  UR: { x: BB.UR.x + MARGIN, y: BB.UR.y + MARGIN }
32141
32264
  };
32142
32265
  const rects = partition(gcells, BB);
32266
+ if (rects === null) return null;
32143
32267
  const cells = rects.map((bb) => ({
32144
32268
  flags: 0,
32145
32269
  nedges: 0,
@@ -32621,6 +32745,24 @@ function buildSpline(e, rte, mp) {
32621
32745
  pts.push({ ...p });
32622
32746
  return pts;
32623
32747
  }
32748
+ function ensureDummyNodes(sg, gstart) {
32749
+ while (sg.nodes.length < gstart + 2) {
32750
+ sg.nodes.push({
32751
+ nVal: 0,
32752
+ nIdx: 0,
32753
+ nDad: null,
32754
+ nEdge: null,
32755
+ nAdj: 0,
32756
+ saveNAdj: 0,
32757
+ cells: [null, null],
32758
+ adjEdgeList: [],
32759
+ index: sg.nodes.length,
32760
+ isVert: false,
32761
+ x: 0,
32762
+ y: 0
32763
+ });
32764
+ }
32765
+ }
32624
32766
  function orthoEdges(g, useLbls, clipAndInstall2) {
32625
32767
  if (useLbls) {
32626
32768
  console.warn(
@@ -32630,6 +32772,7 @@ function orthoEdges(g, useLbls, clipAndInstall2) {
32630
32772
  }
32631
32773
  void useLbls;
32632
32774
  const mp = mkMaze(g);
32775
+ if (mp === null) return -1;
32633
32776
  const sg = mp.sg;
32634
32777
  const es = g.edges.map((e) => ({ e, d: edgeLen(e) }));
32635
32778
  gvQsort(es, edgeCmp);
@@ -32639,22 +32782,7 @@ function orthoEdges(g, useLbls, clipAndInstall2) {
32639
32782
  const pq = pqGenForGraph(sg);
32640
32783
  const sn = sg.nodes[gstart];
32641
32784
  const dn = sg.nodes[gstart + 1];
32642
- while (sg.nodes.length < gstart + 2) {
32643
- sg.nodes.push({
32644
- nVal: 0,
32645
- nIdx: 0,
32646
- nDad: null,
32647
- nEdge: null,
32648
- nAdj: 0,
32649
- saveNAdj: 0,
32650
- cells: [null, null],
32651
- adjEdgeList: [],
32652
- index: sg.nodes.length,
32653
- isVert: false,
32654
- x: 0,
32655
- y: 0
32656
- });
32657
- }
32785
+ ensureDummyNodes(sg, gstart);
32658
32786
  for (let i = 0; i < nEdges; i++) {
32659
32787
  const e = es[i].e;
32660
32788
  const start = mp.gcells[g.nodes.indexOf(e.tail)];
@@ -32668,7 +32796,7 @@ function orthoEdges(g, useLbls, clipAndInstall2) {
32668
32796
  if (shortPath(pq, sg, dn, sn) !== 0) {
32669
32797
  pqFree(pq);
32670
32798
  freeMaze(mp);
32671
- return;
32799
+ return 0;
32672
32800
  }
32673
32801
  routeList[i] = convertSPtoRoute(sg, sn, dn);
32674
32802
  reset(sg);
@@ -32679,7 +32807,7 @@ function orthoEdges(g, useLbls, clipAndInstall2) {
32679
32807
  assignSegs(routeList, mp);
32680
32808
  if (assignTracks(mp) !== 0) {
32681
32809
  freeMaze(mp);
32682
- return;
32810
+ return 0;
32683
32811
  }
32684
32812
  if (clipAndInstall2) {
32685
32813
  for (let i = 0; i < nEdges; i++) {
@@ -32690,6 +32818,7 @@ function orthoEdges(g, useLbls, clipAndInstall2) {
32690
32818
  }
32691
32819
  }
32692
32820
  freeMaze(mp);
32821
+ return 0;
32693
32822
  }
32694
32823
 
32695
32824
  // src/layout/dot/ortho-adapter.ts
@@ -32760,7 +32889,7 @@ function installOrthoResult(oe, pts) {
32760
32889
  clipAndInstall(origEdge, origEdge.head, pts, pts.length, ORTHO_SINFO);
32761
32890
  }
32762
32891
  function dispatchOrthoEdges(g, useLbls) {
32763
- orthoEdges(
32892
+ return orthoEdges(
32764
32893
  buildOrthoGraph(g),
32765
32894
  useLbls,
32766
32895
  (_og, oe, pts) => installOrthoResult(oe, pts)
@@ -33297,12 +33426,12 @@ function resetRW(g) {
33297
33426
  }
33298
33427
  function orthoDispatch(g) {
33299
33428
  resetRW(g);
33429
+ let rc;
33300
33430
  if (((g.root.info.has_labels ?? 0) & EDGE_LABEL) !== 0) {
33301
33431
  setEdgeLabelPos(g);
33302
- dispatchOrthoEdges(g, true);
33303
- } else {
33304
- dispatchOrthoEdges(g, false);
33305
- }
33432
+ rc = dispatchOrthoEdges(g, true);
33433
+ } else rc = dispatchOrthoEdges(g, false);
33434
+ if (rc !== 0) return rc;
33306
33435
  placePortLabels(g);
33307
33436
  g.info.edgeLabelsDone = true;
33308
33437
  return 0;
@@ -33828,12 +33957,14 @@ function computeStep(ng, bbs, margin) {
33828
33957
  c -= W * H;
33829
33958
  }
33830
33959
  const d = b * b - 4 * a * c;
33831
- if (d < 0) return 1;
33832
- const root = Math.floor((-b + Math.sqrt(d)) / (2 * a));
33833
- return root <= 0 ? 1 : root;
33960
+ const r = Math.sqrt(d);
33961
+ const l1 = (-b + r) / (2 * a);
33962
+ let root = Number.isNaN(l1) ? 0 : d2i(l1);
33963
+ if (root === 0) root = 1;
33964
+ return root;
33834
33965
  }
33835
33966
  function gridCells(x, s) {
33836
- return Math.ceil(x / s);
33967
+ return d2i(Math.ceil(x / s));
33837
33968
  }
33838
33969
  function cval(v, s) {
33839
33970
  return v >= 0 ? v / s : (v + 1) / s - 1;
@@ -33874,8 +34005,8 @@ function fits(x, y, info, ctx) {
33874
34005
  const bb = ctx.bbs[info.index];
33875
34006
  if (bb === void 0) return null;
33876
34007
  const place = {
33877
- x: ctx.step * x - cround(bb.ll.x),
33878
- y: ctx.step * y - cround(bb.ll.y)
34008
+ x: Math.imul(ctx.step, x) - cround(bb.ll.x),
34009
+ y: Math.imul(ctx.step, y) - cround(bb.ll.y)
33879
34010
  };
33880
34011
  markCells(info.cells, x, y, ctx.ps);
33881
34012
  return place;
@@ -33958,7 +34089,7 @@ function computeStep2(bbs, margin) {
33958
34089
  c -= W * H;
33959
34090
  }
33960
34091
  const r = Math.sqrt(b * b - 4 * a * c);
33961
- const root = Math.trunc((-b + r) / (2 * a));
34092
+ const root = d2i((-b + r) / (2 * a));
33962
34093
  return root === 0 ? 1 : root;
33963
34094
  }
33964
34095
  function lineXDominant(st, ps) {
@@ -34104,7 +34235,7 @@ function fits2(x, y, info, ctx) {
34104
34235
  }
34105
34236
  const bb = ctx.bbs[info.index];
34106
34237
  const LL = { x: cround(bb.ll.x), y: cround(bb.ll.y) };
34107
- ctx.places[info.index] = { x: ctx.step * x - LL.x, y: ctx.step * y - LL.y };
34238
+ ctx.places[info.index] = { x: Math.imul(ctx.step, x) - LL.x, y: Math.imul(ctx.step, y) - LL.y };
34108
34239
  for (const c of info.cells) ctx.ps.add(c.x + x, c.y + y);
34109
34240
  return true;
34110
34241
  }
@@ -34590,7 +34721,7 @@ function dotLayoutComponent(sg, root) {
34590
34721
  dotRank(sg);
34591
34722
  dotMincross(sg);
34592
34723
  dotPosition(sg);
34593
- dotPhasePostNoFinish(sg);
34724
+ return dotPhasePostNoFinish(sg);
34594
34725
  }
34595
34726
  function mapClust(clone, origOf) {
34596
34727
  const orig = origOf.get(clone);
@@ -34676,7 +34807,9 @@ function packComponentsClusterAware(root, comps, pinfo) {
34676
34807
  }
34677
34808
  function layoutAndPack(root, comps, pinfo, origOf) {
34678
34809
  dotGraphInit(root);
34679
- for (const sg of comps) dotLayoutComponent(sg, root);
34810
+ for (const sg of comps) {
34811
+ if (dotLayoutComponent(sg, root) !== 0) return;
34812
+ }
34680
34813
  packComponentsClusterAware(root, comps, pinfo);
34681
34814
  copyClusterInfo(comps, root, origOf);
34682
34815
  expandRootBbForClusters(root);
@@ -34708,11 +34841,13 @@ function dotPhaseInit(g) {
34708
34841
  function dotPhasePostNoFinish(g) {
34709
34842
  removeFill(g);
34710
34843
  dotSameports(g);
34711
- dotSplines(g);
34844
+ const r = dotSplines(g);
34845
+ if (r !== 0) return r;
34712
34846
  if (mapbool2(g.attrs.get("compound") ?? g.root.attrs.get("compound"))) dotCompoundEdges(g);
34847
+ return 0;
34713
34848
  }
34714
34849
  function dotPhasePost(g) {
34715
- dotPhasePostNoFinish(g);
34850
+ if (dotPhasePostNoFinish(g) !== 0) return;
34716
34851
  gvPostprocess(g);
34717
34852
  }
34718
34853
  function graphPhase(g) {
@@ -37598,10 +37733,10 @@ function raySegIntersect(v, w, a, b) {
37598
37733
  const mv = { x: w.x - v.x, y: w.y - v.y };
37599
37734
  const lv = { x: b.x - a.x, y: b.y - a.y };
37600
37735
  const ln = { x: -lv.y, y: lv.x };
37601
- const lc = -(ln.x * a.x + ln.y * a.y);
37602
- const dt = ln.x * mv.x + ln.y * mv.y;
37736
+ const lc = -fma(ln.x, a.x, ln.y * a.y);
37737
+ const dt = fma(ln.x, mv.x, ln.y * mv.y);
37603
37738
  if (Math.abs(dt) < SMALL3) return null;
37604
- const s = (ln.x * v.x + ln.y * v.y + lc) / dt;
37739
+ const s = (fma(ln.x, v.x, ln.y * v.y) + lc) / dt;
37605
37740
  return { x: v.x - s * mv.x, y: v.y - s * mv.y };
37606
37741
  }
37607
37742
  function triPoint(trip, vx, v, w) {
@@ -37619,36 +37754,44 @@ function ctrlPtIdx(v, ps) {
37619
37754
  return -1;
37620
37755
  }
37621
37756
  var SEP = 15;
37757
+ function bisectorTarget(v, cosTheta, sinTheta) {
37758
+ return { x: fma(cosTheta, 100, v.x), y: fma(sinTheta, 100, v.y) };
37759
+ }
37760
+ function distFused(p, q) {
37761
+ const dx = p.x - q.x;
37762
+ const dy = p.y - q.y;
37763
+ return Math.sqrt(fma(dx, dx, dy * dy));
37764
+ }
37622
37765
  function mkCtrlPts(s, mult, prev, v, nxt, trip) {
37623
37766
  const idx = ctrlPtIdx(v, trip.ps);
37624
37767
  if (idx < 0) return null;
37625
37768
  const theta = bisect(prev, v, nxt);
37626
37769
  let sinTheta = Math.sin(theta);
37627
37770
  let cosTheta = Math.cos(theta);
37628
- let w = { x: v.x + 100 * cosTheta, y: v.y + 100 * sinTheta };
37771
+ let w = bisectorTarget(v, cosTheta, sinTheta);
37629
37772
  if (idx > s) {
37630
37773
  if (wind(prev, v, w) !== 1) {
37631
37774
  sinTheta *= -1;
37632
37775
  cosTheta *= -1;
37633
- w = { x: v.x + 100 * cosTheta, y: v.y + 100 * sinTheta };
37776
+ w = bisectorTarget(v, cosTheta, sinTheta);
37634
37777
  }
37635
37778
  } else if (wind(prev, v, w) !== -1) {
37636
37779
  sinTheta *= -1;
37637
37780
  cosTheta *= -1;
37638
- w = { x: v.x + 100 * cosTheta, y: v.y + 100 * sinTheta };
37781
+ w = bisectorTarget(v, cosTheta, sinTheta);
37639
37782
  }
37640
37783
  const q = triPoint(trip, idx, v, w);
37641
37784
  if (q === null) return null;
37642
- const d = Math.hypot(q.x - v.x, q.y - v.y);
37785
+ const d = distFused(q, v);
37643
37786
  const sep = d >= mult * SEP ? SEP : d / mult;
37644
37787
  const ps = new Array(mult);
37645
37788
  if (idx < s) {
37646
37789
  for (let i = 0; i < mult; i++) {
37647
- ps[i] = { x: v.x + i * sep * cosTheta, y: v.y + i * sep * sinTheta };
37790
+ ps[i] = { x: fma(i * sep, cosTheta, v.x), y: fma(i * sep, sinTheta, v.y) };
37648
37791
  }
37649
37792
  } else {
37650
37793
  for (let i = 0; i < mult; i++) {
37651
- ps[mult - i - 1] = { x: v.x + i * sep * cosTheta, y: v.y + i * sep * sinTheta };
37794
+ ps[mult - i - 1] = { x: fma(i * sep, cosTheta, v.x), y: fma(i * sep, sinTheta, v.y) };
37652
37795
  }
37653
37796
  }
37654
37797
  return ps;
@@ -38082,7 +38225,7 @@ var ObstacleHelper = class {
38082
38225
  };
38083
38226
  function ellipseTangentSlope(a, b, p) {
38084
38227
  const signY = p.y >= 0 ? 1 : -1;
38085
- return -signY * (b * p.x) / (a * Math.sqrt(a * a - p.x * p.x));
38228
+ return -signY * (b * p.x) / (a * Math.sqrt(fma(a, a, -(p.x * p.x))));
38086
38229
  }
38087
38230
  function circumscribedCorner(a, b, i, nsides) {
38088
38231
  const angle0 = 2 * Math.PI * (i - 0.5) / nsides;
@@ -38091,8 +38234,8 @@ function circumscribedCorner(a, b, i, nsides) {
38091
38234
  const p1 = { x: a * Math.cos(angle1), y: b * Math.sin(angle1) };
38092
38235
  const m0 = ellipseTangentSlope(a, b, p0);
38093
38236
  const m1 = ellipseTangentSlope(a, b, p1);
38094
- const x = (m0 * p0.x - p0.y - m1 * p1.x + p1.y) / (m0 - m1);
38095
- const y = p0.y + m0 * (x - p0.x);
38237
+ const x = (fms(p1.x, m1, fma(m0, p0.x, -p0.y)) + p1.y) / (m0 - m1);
38238
+ const y = fma(m0, x - p0.x, p0.y);
38096
38239
  return { x, y };
38097
38240
  }
38098
38241
  function boxCornerMargin(j, m) {
@@ -42169,8 +42312,8 @@ function initItem(n, margin) {
42169
42312
  let w2;
42170
42313
  let h2;
42171
42314
  if (margin.doAdd) {
42172
- w2 = Math.trunc(SCALE * (cround(width / 2 * POINTS_PER_INCH6) + margin.x));
42173
- h2 = Math.trunc(SCALE * (cround(height / 2 * POINTS_PER_INCH6) + margin.y));
42315
+ w2 = d2i(SCALE * (cround(width / 2 * POINTS_PER_INCH6) + margin.x));
42316
+ h2 = d2i(SCALE * (cround(height / 2 * POINTS_PER_INCH6) + margin.y));
42174
42317
  } else {
42175
42318
  w2 = cround(margin.x * SCALE2 * width * POINTS_PER_INCH6);
42176
42319
  h2 = cround(margin.y * SCALE2 * height * POINTS_PER_INCH6);
@@ -46178,6 +46321,20 @@ function powerLawGraph(A3) {
46178
46321
  }
46179
46322
  return mask[1] > 0.8 * max && mask[1] > 0.3 * m;
46180
46323
  }
46324
+ var PCP_COVARIANCE_LANES = 4;
46325
+ function pcpCovariance(n, dim, x, y) {
46326
+ const nUnfused = n - n % PCP_COVARIANCE_LANES;
46327
+ for (let i = 0; i < n; i++) {
46328
+ for (let k = 0; k < dim; k++) {
46329
+ for (let l = 0; l < dim; l++) {
46330
+ const a = x[i * dim + k];
46331
+ const b = x[i * dim + l];
46332
+ const acc = y[dim * k + l];
46333
+ y[dim * k + l] = i < nUnfused ? acc + a * b : fma(a, b, acc);
46334
+ }
46335
+ }
46336
+ }
46337
+ }
46181
46338
  function pcpRotate(n, dim, x) {
46182
46339
  const y = [0, 0, 0, 0];
46183
46340
  const center = [0, 0];
@@ -46188,24 +46345,23 @@ function pcpRotate(n, dim, x) {
46188
46345
  for (let i = 0; i < n; i++) {
46189
46346
  for (let k = 0; k < dim; k++) x[dim * i + k] -= center[k];
46190
46347
  }
46191
- for (let i = 0; i < n; i++) {
46192
- for (let k = 0; k < dim; k++) {
46193
- for (let l = 0; l < dim; l++) {
46194
- y[dim * k + l] = fma(x[i * dim + k], x[i * dim + l], y[dim * k + l]);
46195
- }
46196
- }
46197
- }
46348
+ pcpCovariance(n, dim, x, y);
46198
46349
  const axis = [0, 1];
46199
46350
  if (y[1] !== 0) {
46200
- axis[0] = -(-y[0] + y[3] - Math.sqrt(y[0] * y[0] + 4 * y[1] * y[1] - 2 * y[0] * y[3] + y[3] * y[3])) / (2 * y[1]);
46351
+ const radicand = fma(
46352
+ y[3],
46353
+ y[3],
46354
+ fma(-2 * y[0], y[3], fma(y[0], y[0], 4 * y[1] * y[1]))
46355
+ );
46356
+ axis[0] = -(-y[0] + y[3] - Math.sqrt(radicand)) / (2 * y[1]);
46201
46357
  axis[1] = 1;
46202
46358
  }
46203
- const dist4 = Math.sqrt(1 + axis[0] * axis[0]);
46359
+ const dist4 = Math.sqrt(fma(axis[0], axis[0], 1));
46204
46360
  axis[0] = axis[0] / dist4;
46205
46361
  axis[1] = axis[1] / dist4;
46206
46362
  for (let i = 0; i < n; i++) {
46207
- const x0 = x[dim * i] * axis[0] + x[dim * i + 1] * axis[1];
46208
- const x1 = -x[dim * i] * axis[1] + x[dim * i + 1] * axis[0];
46363
+ const x0 = fma(x[dim * i], axis[0], x[dim * i + 1] * axis[1]);
46364
+ const x1 = fma(-x[dim * i], axis[1], x[dim * i + 1] * axis[0]);
46209
46365
  x[dim * i] = x0;
46210
46366
  x[dim * i + 1] = x1;
46211
46367
  }
@@ -46468,16 +46624,7 @@ function makeCData(dn) {
46468
46624
  };
46469
46625
  }
46470
46626
 
46471
- // src/layout/circo/blockpath.ts
46472
- function blockGraph(allEdges3, sn) {
46473
- const ns = new Set(sn.subGraph.nodes);
46474
- for (const n of sn.subGraph.nodes) {
46475
- for (const e of allEdges3) {
46476
- if (e.tail === n && ns.has(e.head) && !sn.subGraph.edges.includes(e))
46477
- sn.subGraph.edges.push(e);
46478
- }
46479
- }
46480
- }
46627
+ // src/layout/circo/crossings.ts
46481
46628
  function derivedOf(n) {
46482
46629
  return n.info.alg?.derivedNode ?? null;
46483
46630
  }
@@ -46488,27 +46635,51 @@ function closeOpenEdge(e, d, opened) {
46488
46635
  }
46489
46636
  return cross2;
46490
46637
  }
46491
- function openEdgesAt(d, edges, opened, order) {
46638
+ function agfstedgeLists(edges) {
46639
+ const seq2 = /* @__PURE__ */ new Map();
46640
+ edges.forEach((e, i) => seq2.set(e, i));
46641
+ const by = (end) => (a, b) => end(a).orig.id - end(b).orig.id || seq2.get(a) - seq2.get(b);
46642
+ const out = /* @__PURE__ */ new Map();
46643
+ const inn = /* @__PURE__ */ new Map();
46492
46644
  for (const e of edges) {
46493
- if (e.order === 0 && (e.tail === d || e.head === d)) {
46494
- e.order = order;
46495
- opened.push(e);
46496
- }
46645
+ out.set(e.tail, [...out.get(e.tail) ?? [], e]);
46646
+ inn.set(e.head, [...inn.get(e.head) ?? [], e]);
46647
+ }
46648
+ const lists = /* @__PURE__ */ new Map();
46649
+ for (const d of /* @__PURE__ */ new Set([...out.keys(), ...inn.keys()])) {
46650
+ const o = (out.get(d) ?? []).sort(by((e) => e.head));
46651
+ const i = (inn.get(d) ?? []).sort(by((e) => e.tail));
46652
+ lists.set(d, [...o, ...i]);
46497
46653
  }
46654
+ return lists;
46498
46655
  }
46499
46656
  function countCrossings(list, edges) {
46500
46657
  for (const e of edges) e.order = 0;
46501
- const opened = [];
46658
+ const incident = agfstedgeLists(edges);
46659
+ const opened = /* @__PURE__ */ new Map();
46502
46660
  let crossings = 0;
46503
46661
  let order = 1;
46504
46662
  for (const n of list) {
46505
46663
  const d = derivedOf(n);
46506
46664
  if (!d) continue;
46507
- for (const e of edges) {
46508
- if (e.order > 0 && (e.tail === d || e.head === d))
46509
- crossings += closeOpenEdge(e, d, opened);
46665
+ const es = incident.get(d) ?? [];
46666
+ crossings += closeEdgesAt(d, es, opened);
46667
+ for (const e of es) {
46668
+ if (e.order === 0) {
46669
+ e.order = order;
46670
+ opened.set(e, d);
46671
+ }
46510
46672
  }
46511
- openEdgesAt(d, edges, opened, order++);
46673
+ order++;
46674
+ }
46675
+ return crossings;
46676
+ }
46677
+ function closeEdgesAt(d, es, opened) {
46678
+ let crossings = 0;
46679
+ for (const e of es) {
46680
+ if (e.order === 0) continue;
46681
+ crossings += closeOpenEdge(e, d, opened.keys());
46682
+ if (opened.get(e) === d) opened.delete(e);
46512
46683
  }
46513
46684
  return crossings;
46514
46685
  }
@@ -46561,6 +46732,17 @@ function spanIncident(dn, edges, ord, seq2) {
46561
46732
  const inn = edges.filter((e) => e.head === dn).sort((a, b) => (ord.get(a.tail) ?? 0) - (ord.get(b.tail) ?? 0) || (seq2.get(a) ?? 0) - (seq2.get(b) ?? 0));
46562
46733
  return [...out, ...inn];
46563
46734
  }
46735
+
46736
+ // src/layout/circo/blockpath.ts
46737
+ function blockGraph(allEdges3, sn) {
46738
+ const ns = new Set(sn.subGraph.nodes);
46739
+ for (const n of sn.subGraph.nodes) {
46740
+ for (const e of allEdges3) {
46741
+ if (e.tail === n && ns.has(e.head) && !sn.subGraph.edges.includes(e))
46742
+ sn.subGraph.edges.push(e);
46743
+ }
46744
+ }
46745
+ }
46564
46746
  function dfsSpan(sn, map, edges, ord, seq2) {
46565
46747
  sn.visited = true;
46566
46748
  for (const e of spanIncident(sn.dn, edges, ord, seq2)) {
@@ -48039,17 +48221,30 @@ function renderEdgeLabels(e, renderer, job) {
48039
48221
  }
48040
48222
  function emitEdgeLabel(lp, id, hs, renderer, job, spl, emitState) {
48041
48223
  if (!lp?.set) return;
48042
- const open = hs.url !== null || hs.explicit;
48043
- if (open) openAnchorWith(renderer, job, hs.url, hs.tooltip, hs.target, id);
48044
- const savedOverride = job.labelEmitOverride;
48045
- if (emitState !== void 0) job.labelEmitOverride = emitState;
48046
- try {
48047
- renderOneLabel(lp, renderer, job);
48048
- } finally {
48049
- job.labelEmitOverride = savedOverride;
48224
+ withObjEmitState(job, emitState ?? 11 /* ELabel */, () => {
48225
+ const open = hs.url !== null || hs.explicit;
48226
+ if (open) openAnchorWith(renderer, job, hs.url, hs.tooltip, hs.target, id);
48227
+ const savedOverride = job.labelEmitOverride;
48228
+ if (emitState !== void 0) job.labelEmitOverride = emitState;
48229
+ try {
48230
+ renderOneLabel(lp, renderer, job);
48231
+ } finally {
48232
+ job.labelEmitOverride = savedOverride;
48233
+ }
48234
+ if (spl) emitAttachment(lp, spl, renderer, job);
48235
+ if (open) renderer.endAnchor?.(job);
48236
+ });
48237
+ }
48238
+ function withObjEmitState(job, lkind, fn) {
48239
+ const obj = job.obj;
48240
+ if (obj === null) {
48241
+ fn();
48242
+ return;
48050
48243
  }
48051
- if (spl) emitAttachment(lp, spl, renderer, job);
48052
- if (open) renderer.endAnchor?.(job);
48244
+ const oldEmitState = obj.emitState;
48245
+ obj.emitState = lkind;
48246
+ fn();
48247
+ obj.emitState = oldEmitState;
48053
48248
  }
48054
48249
  function emitAttachment(lp, spl, renderer, job) {
48055
48250
  if (!lp?.set) return;
@@ -49635,6 +49830,7 @@ var DotWriterBase = class {
49635
49830
 
49636
49831
  // src/render/dot/edge-draw.ts
49637
49832
  var DEFAULT_COLOR5 = "black";
49833
+ var DEFAULT_LINE_STYLE = ["solid", "setlinewidth(1)"];
49638
49834
  function emitArrowOp(buf, op, pen) {
49639
49835
  switch (op.kind) {
49640
49836
  case "polygon":
@@ -49658,6 +49854,25 @@ function emitArrowOp(buf, op, pen) {
49658
49854
  var EdgeDrawBase = class extends DotWriterBase {
49659
49855
  /** setlinewidth state per emit_state. @see gvrender_core_dot.c penwidth[] */
49660
49856
  penwidth = new Array(12).fill(1);
49857
+ /**
49858
+ * emit_attachment's draw calls (decorate=true): gvrender_set_style with the
49859
+ * default line style sets the obj's rawstyle/pen/penwidth (setlinewidth 1),
49860
+ * gvrender_set_pencolor sets the pen to the label fontcolor (first entry of
49861
+ * a color list), then gvrender_polyline → xdot_polyline emits the style ops
49862
+ * (`S 5 -solid`; setlinewidth is filtered), the pen color and `L 3`.
49863
+ * @see lib/common/emit.c:emit_attachment (1886-1893)
49864
+ * @see lib/gvc/gvrender.c:gvrender_set_style / gvrender_set_pencolor
49865
+ */
49866
+ attachmentPolyline(pts, pencolor, job) {
49867
+ const obj = job.obj;
49868
+ if (obj !== null) {
49869
+ obj.rawStyle = [...DEFAULT_LINE_STYLE];
49870
+ obj.pen = 3 /* Solid */;
49871
+ obj.penWidth = 1;
49872
+ obj.penColor = resolveRenderColor(pencolor.split(":")[0]);
49873
+ }
49874
+ this.polyline(pts, job);
49875
+ }
49661
49876
  /**
49662
49877
  * The plain single-colour spline branch of beginEdge — lifted verbatim so the
49663
49878
  * four-way spline-kind chain above stays readable; no branch was reordered or
@@ -50191,19 +50406,6 @@ function emitMulticolorArrows(e, job, headColor, tailColor) {
50191
50406
  emitArrowOps(headOps, headColor, job, pw, colorOpacity(resolveRenderColor(headColor)));
50192
50407
  }
50193
50408
  }
50194
- function overlapLabel(lp, b) {
50195
- const sx = lp.dimen.x / 2;
50196
- const sy = lp.dimen.y / 2;
50197
- const bb = {
50198
- ll: { x: lp.pos.x - sx, y: lp.pos.y - sy },
50199
- ur: { x: lp.pos.x + sx, y: lp.pos.y + sy }
50200
- };
50201
- return boxOverlap(b, bb);
50202
- }
50203
- function edgeHasDrawableContent(e, clip) {
50204
- const i = e.info;
50205
- return i.spl !== void 0 || i.label !== void 0 && i.label.set && overlapLabel(i.label, clip) || i.xlabel !== void 0 || i.head_label !== void 0 || i.tail_label !== void 0;
50206
- }
50207
50409
  var SvgRenderer = class {
50208
50410
  type = "svg";
50209
50411
  /** @see plugin/core/gvplugin_core.c registration table */
@@ -50468,9 +50670,9 @@ function peg$parse(input, options) {
50468
50670
  const peg$c0 = "{";
50469
50671
  const peg$c1 = "}";
50470
50672
  const peg$c2 = ";";
50471
- const peg$c3 = "[";
50472
- const peg$c4 = "]";
50473
- const peg$c5 = "=";
50673
+ const peg$c3 = "=";
50674
+ const peg$c4 = "[";
50675
+ const peg$c5 = "]";
50474
50676
  const peg$c6 = ":";
50475
50677
  const peg$c7 = "->";
50476
50678
  const peg$c8 = "--";
@@ -50494,32 +50696,30 @@ function peg$parse(input, options) {
50494
50696
  const peg$r3 = /^[A-Za-z_\x80-\uFFFF]/;
50495
50697
  const peg$r4 = /^[A-Za-z_0-9\x80-\uFFFF]/;
50496
50698
  const peg$r5 = /^[0-9]/;
50497
- const peg$r6 = /^[eE]/;
50498
- const peg$r7 = /^[+\-]/;
50499
- const peg$r8 = /^[Ss]/;
50500
- const peg$r9 = /^[Tt]/;
50501
- const peg$r10 = /^[Rr]/;
50502
- const peg$r11 = /^[Ii]/;
50503
- const peg$r12 = /^[Cc]/;
50504
- const peg$r13 = /^[Gg]/;
50505
- const peg$r14 = /^[Aa]/;
50506
- const peg$r15 = /^[Pp]/;
50507
- const peg$r16 = /^[Hh]/;
50508
- const peg$r17 = /^[Dd]/;
50509
- const peg$r18 = /^[Nn]/;
50510
- const peg$r19 = /^[Oo]/;
50511
- const peg$r20 = /^[Ee]/;
50512
- const peg$r21 = /^[Uu]/;
50513
- const peg$r22 = /^[Bb]/;
50514
- const peg$r23 = /^[ \t\r\n]/;
50515
- const peg$r24 = /^[^\n]/;
50699
+ const peg$r6 = /^[Ss]/;
50700
+ const peg$r7 = /^[Tt]/;
50701
+ const peg$r8 = /^[Rr]/;
50702
+ const peg$r9 = /^[Ii]/;
50703
+ const peg$r10 = /^[Cc]/;
50704
+ const peg$r11 = /^[Gg]/;
50705
+ const peg$r12 = /^[Aa]/;
50706
+ const peg$r13 = /^[Pp]/;
50707
+ const peg$r14 = /^[Hh]/;
50708
+ const peg$r15 = /^[Dd]/;
50709
+ const peg$r16 = /^[Nn]/;
50710
+ const peg$r17 = /^[Oo]/;
50711
+ const peg$r18 = /^[Ee]/;
50712
+ const peg$r19 = /^[Uu]/;
50713
+ const peg$r20 = /^[Bb]/;
50714
+ const peg$r21 = /^[ \t\r\n]/;
50715
+ const peg$r22 = /^[^\n]/;
50516
50716
  const peg$e0 = peg$literalExpectation("{", false);
50517
50717
  const peg$e1 = peg$literalExpectation("}", false);
50518
50718
  const peg$e2 = peg$literalExpectation(";", false);
50519
- const peg$e3 = peg$literalExpectation("[", false);
50520
- const peg$e4 = peg$literalExpectation("]", false);
50521
- const peg$e5 = peg$classExpectation([";", ","], false, false, false);
50522
- const peg$e6 = peg$literalExpectation("=", false);
50719
+ const peg$e3 = peg$literalExpectation("=", false);
50720
+ const peg$e4 = peg$literalExpectation("[", false);
50721
+ const peg$e5 = peg$literalExpectation("]", false);
50722
+ const peg$e6 = peg$classExpectation([";", ","], false, false, false);
50523
50723
  const peg$e7 = peg$literalExpectation(":", false);
50524
50724
  const peg$e8 = peg$otherExpectation("edge operator");
50525
50725
  const peg$e9 = peg$literalExpectation("->", false);
@@ -50539,30 +50739,28 @@ function peg$parse(input, options) {
50539
50739
  const peg$e23 = peg$literalExpectation("-", false);
50540
50740
  const peg$e24 = peg$classExpectation([["0", "9"]], false, false, false);
50541
50741
  const peg$e25 = peg$literalExpectation(".", false);
50542
- const peg$e26 = peg$classExpectation(["e", "E"], false, false, false);
50543
- const peg$e27 = peg$classExpectation(["+", "-"], false, false, false);
50544
- const peg$e28 = peg$classExpectation(["S", "s"], false, false, false);
50545
- const peg$e29 = peg$classExpectation(["T", "t"], false, false, false);
50546
- const peg$e30 = peg$classExpectation(["R", "r"], false, false, false);
50547
- const peg$e31 = peg$classExpectation(["I", "i"], false, false, false);
50548
- const peg$e32 = peg$classExpectation(["C", "c"], false, false, false);
50549
- const peg$e33 = peg$classExpectation(["G", "g"], false, false, false);
50550
- const peg$e34 = peg$classExpectation(["A", "a"], false, false, false);
50551
- const peg$e35 = peg$classExpectation(["P", "p"], false, false, false);
50552
- const peg$e36 = peg$classExpectation(["H", "h"], false, false, false);
50553
- const peg$e37 = peg$classExpectation(["D", "d"], false, false, false);
50554
- const peg$e38 = peg$classExpectation(["N", "n"], false, false, false);
50555
- const peg$e39 = peg$classExpectation(["O", "o"], false, false, false);
50556
- const peg$e40 = peg$classExpectation(["E", "e"], false, false, false);
50557
- const peg$e41 = peg$classExpectation(["U", "u"], false, false, false);
50558
- const peg$e42 = peg$classExpectation(["B", "b"], false, false, false);
50559
- const peg$e43 = peg$classExpectation([" ", " ", "\r", "\n"], false, false, false);
50560
- const peg$e44 = peg$literalExpectation("/*", false);
50561
- const peg$e45 = peg$literalExpectation("*/", false);
50562
- const peg$e46 = peg$literalExpectation("//", false);
50563
- const peg$e47 = peg$classExpectation(["\n"], true, false, false);
50564
- const peg$e48 = peg$literalExpectation("\n", false);
50565
- const peg$e49 = peg$literalExpectation("#", false);
50742
+ const peg$e26 = peg$classExpectation(["S", "s"], false, false, false);
50743
+ const peg$e27 = peg$classExpectation(["T", "t"], false, false, false);
50744
+ const peg$e28 = peg$classExpectation(["R", "r"], false, false, false);
50745
+ const peg$e29 = peg$classExpectation(["I", "i"], false, false, false);
50746
+ const peg$e30 = peg$classExpectation(["C", "c"], false, false, false);
50747
+ const peg$e31 = peg$classExpectation(["G", "g"], false, false, false);
50748
+ const peg$e32 = peg$classExpectation(["A", "a"], false, false, false);
50749
+ const peg$e33 = peg$classExpectation(["P", "p"], false, false, false);
50750
+ const peg$e34 = peg$classExpectation(["H", "h"], false, false, false);
50751
+ const peg$e35 = peg$classExpectation(["D", "d"], false, false, false);
50752
+ const peg$e36 = peg$classExpectation(["N", "n"], false, false, false);
50753
+ const peg$e37 = peg$classExpectation(["O", "o"], false, false, false);
50754
+ const peg$e38 = peg$classExpectation(["E", "e"], false, false, false);
50755
+ const peg$e39 = peg$classExpectation(["U", "u"], false, false, false);
50756
+ const peg$e40 = peg$classExpectation(["B", "b"], false, false, false);
50757
+ const peg$e41 = peg$classExpectation([" ", " ", "\r", "\n"], false, false, false);
50758
+ const peg$e42 = peg$literalExpectation("/*", false);
50759
+ const peg$e43 = peg$literalExpectation("*/", false);
50760
+ const peg$e44 = peg$literalExpectation("//", false);
50761
+ const peg$e45 = peg$classExpectation(["\n"], true, false, false);
50762
+ const peg$e46 = peg$literalExpectation("\n", false);
50763
+ const peg$e47 = peg$literalExpectation("#", false);
50566
50764
  function peg$f0(s, t, id, stmts) {
50567
50765
  return {
50568
50766
  type: "graph",
@@ -50605,37 +50803,44 @@ function peg$parse(input, options) {
50605
50803
  function peg$f11(s) {
50606
50804
  return s;
50607
50805
  }
50608
- function peg$f12(t, attrs) {
50806
+ function peg$f12(t, m, attrs) {
50807
+ if (m) console.error("Warning: attribute macros not implemented");
50609
50808
  return { type: "attr", target: t, attrs };
50610
50809
  }
50611
50810
  function peg$f13(a) {
50612
50811
  return { type: "assign", key: a.key, value: a.value };
50613
50812
  }
50614
50813
  function peg$f14() {
50615
- return "graph";
50814
+ return true;
50616
50815
  }
50617
50816
  function peg$f15() {
50618
- return "node";
50817
+ return false;
50619
50818
  }
50620
50819
  function peg$f16() {
50820
+ return "graph";
50821
+ }
50822
+ function peg$f17() {
50823
+ return "node";
50824
+ }
50825
+ function peg$f18() {
50621
50826
  return "edge";
50622
50827
  }
50623
- function peg$f17(defs, rest) {
50828
+ function peg$f19(defs, rest) {
50624
50829
  return defs.concat(rest);
50625
50830
  }
50626
- function peg$f18() {
50831
+ function peg$f20() {
50627
50832
  return [];
50628
50833
  }
50629
- function peg$f19(a) {
50834
+ function peg$f21(a) {
50630
50835
  return a;
50631
50836
  }
50632
- function peg$f20(pairs) {
50837
+ function peg$f22(pairs) {
50633
50838
  return pairs;
50634
50839
  }
50635
- function peg$f21(k, v) {
50840
+ function peg$f23(k, v) {
50636
50841
  return { key: k, value: v };
50637
50842
  }
50638
- function peg$f22(head, chain, attrs) {
50843
+ function peg$f24(head, chain, attrs) {
50639
50844
  if (chain.length > 0) {
50640
50845
  const nodes = [head].concat(chain);
50641
50846
  return { type: "edge", nodes, attrs };
@@ -50646,70 +50851,70 @@ function peg$parse(input, options) {
50646
50851
  return { type: "node", id: head, attrs };
50647
50852
  }
50648
50853
  }
50649
- function peg$f23(s) {
50854
+ function peg$f25(s) {
50650
50855
  return s;
50651
50856
  }
50652
- function peg$f24(n) {
50857
+ function peg$f26(n) {
50653
50858
  return n;
50654
50859
  }
50655
- function peg$f25(id, port, compass) {
50860
+ function peg$f27(id, port, compass) {
50656
50861
  return { id, port, compass };
50657
50862
  }
50658
- function peg$f26(id, port) {
50863
+ function peg$f28(id, port) {
50659
50864
  return { id, port, compass: null };
50660
50865
  }
50661
- function peg$f27(id) {
50866
+ function peg$f29(id) {
50662
50867
  return { id, port: null, compass: null };
50663
50868
  }
50664
- function peg$f28(s, rest) {
50869
+ function peg$f30(s, rest) {
50665
50870
  return [s].concat(rest);
50666
50871
  }
50667
- function peg$f29() {
50872
+ function peg$f31() {
50668
50873
  return [];
50669
50874
  }
50670
- function peg$f30(id, stmts) {
50875
+ function peg$f32(id, stmts) {
50671
50876
  return { type: "subgraph", id, stmts };
50672
50877
  }
50673
- function peg$f31(stmts) {
50878
+ function peg$f33(stmts) {
50674
50879
  return { type: "subgraph", id: null, stmts };
50675
50880
  }
50676
- function peg$f32(stmts) {
50881
+ function peg$f34(stmts) {
50677
50882
  return { type: "subgraph", id: null, stmts };
50678
50883
  }
50679
- function peg$f33(first, s) {
50884
+ function peg$f35(first, s) {
50680
50885
  return s;
50681
50886
  }
50682
- function peg$f34(first, rest) {
50887
+ function peg$f36(first, rest) {
50683
50888
  return rest.length > 0 ? first + rest.join("") : first;
50684
50889
  }
50685
- function peg$f35(chars) {
50890
+ function peg$f37(chars) {
50686
50891
  return chars.join("");
50687
50892
  }
50688
- function peg$f36() {
50893
+ function peg$f38() {
50689
50894
  return '"';
50690
50895
  }
50691
- function peg$f37() {
50896
+ function peg$f39() {
50692
50897
  return "";
50693
50898
  }
50694
- function peg$f38(c) {
50899
+ function peg$f40(c) {
50695
50900
  return "\\" + c;
50696
50901
  }
50697
- function peg$f39(content) {
50902
+ function peg$f41(content) {
50698
50903
  return "" + content;
50699
50904
  }
50700
- function peg$f40(chars) {
50905
+ function peg$f42(chars) {
50701
50906
  return chars.join("");
50702
50907
  }
50703
- function peg$f41(nested2, content) {
50908
+ function peg$f43(nested2, content) {
50704
50909
  return "<" + content + ">";
50705
50910
  }
50706
- function peg$f42(n) {
50911
+ function peg$f44(n) {
50707
50912
  return n;
50708
50913
  }
50709
- function peg$f43(first, rest) {
50914
+ function peg$f45(first, rest) {
50710
50915
  return first + rest.join("");
50711
50916
  }
50712
- function peg$f44(s) {
50917
+ function peg$f46(s) {
50713
50918
  return Array.isArray(s) ? s.flat(Infinity).filter((x) => x !== null && x !== void 0).join("") : String(s);
50714
50919
  }
50715
50920
  let peg$currPos = options.peg$currPos | 0;
@@ -51080,15 +51285,21 @@ function peg$parse(input, options) {
51080
51285
  return s0;
51081
51286
  }
51082
51287
  function peg$parseAttrStmt() {
51083
- let s0, s12, s2, s3;
51288
+ let s0, s12, s2, s3, s4;
51084
51289
  s0 = peg$currPos;
51085
51290
  s12 = peg$parseAttrType();
51086
51291
  if (s12 !== peg$FAILED) {
51087
51292
  s2 = peg$parse_();
51088
- s3 = peg$parseAttrListReq();
51293
+ s3 = peg$parseOptMacroName();
51089
51294
  if (s3 !== peg$FAILED) {
51090
- peg$savedPos = s0;
51091
- s0 = peg$f12(s12, s3);
51295
+ s4 = peg$parseAttrListReq();
51296
+ if (s4 !== peg$FAILED) {
51297
+ peg$savedPos = s0;
51298
+ s0 = peg$f12(s12, s3, s4);
51299
+ } else {
51300
+ peg$currPos = s0;
51301
+ s0 = peg$FAILED;
51302
+ }
51092
51303
  } else {
51093
51304
  peg$currPos = s0;
51094
51305
  s0 = peg$FAILED;
@@ -51108,13 +51319,49 @@ function peg$parse(input, options) {
51108
51319
  }
51109
51320
  return s0;
51110
51321
  }
51322
+ function peg$parseOptMacroName() {
51323
+ let s0, s12, s2, s3, s4;
51324
+ s0 = peg$currPos;
51325
+ s12 = peg$parseAtom();
51326
+ if (s12 !== peg$FAILED) {
51327
+ s2 = peg$parse_();
51328
+ if (input.charCodeAt(peg$currPos) === 61) {
51329
+ s3 = peg$c3;
51330
+ peg$currPos++;
51331
+ } else {
51332
+ s3 = peg$FAILED;
51333
+ if (peg$silentFails === 0) {
51334
+ peg$fail(peg$e3);
51335
+ }
51336
+ }
51337
+ if (s3 !== peg$FAILED) {
51338
+ s4 = peg$parse_();
51339
+ peg$savedPos = s0;
51340
+ s0 = peg$f14();
51341
+ } else {
51342
+ peg$currPos = s0;
51343
+ s0 = peg$FAILED;
51344
+ }
51345
+ } else {
51346
+ peg$currPos = s0;
51347
+ s0 = peg$FAILED;
51348
+ }
51349
+ if (s0 === peg$FAILED) {
51350
+ s0 = peg$currPos;
51351
+ s12 = "";
51352
+ peg$savedPos = s0;
51353
+ s12 = peg$f15();
51354
+ s0 = s12;
51355
+ }
51356
+ return s0;
51357
+ }
51111
51358
  function peg$parseAttrType() {
51112
51359
  let s0, s12;
51113
51360
  s0 = peg$currPos;
51114
51361
  s12 = peg$parseGraphKw();
51115
51362
  if (s12 !== peg$FAILED) {
51116
51363
  peg$savedPos = s0;
51117
- s12 = peg$f14();
51364
+ s12 = peg$f16();
51118
51365
  }
51119
51366
  s0 = s12;
51120
51367
  if (s0 === peg$FAILED) {
@@ -51122,7 +51369,7 @@ function peg$parse(input, options) {
51122
51369
  s12 = peg$parseNodeKw();
51123
51370
  if (s12 !== peg$FAILED) {
51124
51371
  peg$savedPos = s0;
51125
- s12 = peg$f15();
51372
+ s12 = peg$f17();
51126
51373
  }
51127
51374
  s0 = s12;
51128
51375
  if (s0 === peg$FAILED) {
@@ -51130,7 +51377,7 @@ function peg$parse(input, options) {
51130
51377
  s12 = peg$parseEdgeKw();
51131
51378
  if (s12 !== peg$FAILED) {
51132
51379
  peg$savedPos = s0;
51133
- s12 = peg$f16();
51380
+ s12 = peg$f18();
51134
51381
  }
51135
51382
  s0 = s12;
51136
51383
  }
@@ -51142,12 +51389,12 @@ function peg$parse(input, options) {
51142
51389
  s0 = peg$currPos;
51143
51390
  s12 = peg$parse_();
51144
51391
  if (input.charCodeAt(peg$currPos) === 91) {
51145
- s2 = peg$c3;
51392
+ s2 = peg$c4;
51146
51393
  peg$currPos++;
51147
51394
  } else {
51148
51395
  s2 = peg$FAILED;
51149
51396
  if (peg$silentFails === 0) {
51150
- peg$fail(peg$e3);
51397
+ peg$fail(peg$e4);
51151
51398
  }
51152
51399
  }
51153
51400
  if (s2 !== peg$FAILED) {
@@ -51155,19 +51402,19 @@ function peg$parse(input, options) {
51155
51402
  s4 = peg$parseAttrDefs();
51156
51403
  s5 = peg$parse_();
51157
51404
  if (input.charCodeAt(peg$currPos) === 93) {
51158
- s6 = peg$c4;
51405
+ s6 = peg$c5;
51159
51406
  peg$currPos++;
51160
51407
  } else {
51161
51408
  s6 = peg$FAILED;
51162
51409
  if (peg$silentFails === 0) {
51163
- peg$fail(peg$e4);
51410
+ peg$fail(peg$e5);
51164
51411
  }
51165
51412
  }
51166
51413
  if (s6 !== peg$FAILED) {
51167
51414
  s7 = peg$parseAttrList();
51168
51415
  if (s7 !== peg$FAILED) {
51169
51416
  peg$savedPos = s0;
51170
- s0 = peg$f17(s4, s7);
51417
+ s0 = peg$f19(s4, s7);
51171
51418
  } else {
51172
51419
  peg$currPos = s0;
51173
51420
  s0 = peg$FAILED;
@@ -51189,7 +51436,7 @@ function peg$parse(input, options) {
51189
51436
  s0 = peg$currPos;
51190
51437
  s12 = "";
51191
51438
  peg$savedPos = s0;
51192
- s12 = peg$f18();
51439
+ s12 = peg$f20();
51193
51440
  s0 = s12;
51194
51441
  }
51195
51442
  return s0;
@@ -51209,7 +51456,7 @@ function peg$parse(input, options) {
51209
51456
  } else {
51210
51457
  s6 = peg$FAILED;
51211
51458
  if (peg$silentFails === 0) {
51212
- peg$fail(peg$e5);
51459
+ peg$fail(peg$e6);
51213
51460
  }
51214
51461
  }
51215
51462
  if (s6 !== peg$FAILED) {
@@ -51224,7 +51471,7 @@ function peg$parse(input, options) {
51224
51471
  s5 = null;
51225
51472
  }
51226
51473
  peg$savedPos = s2;
51227
- s2 = peg$f19(s3);
51474
+ s2 = peg$f21(s3);
51228
51475
  } else {
51229
51476
  peg$currPos = s2;
51230
51477
  s2 = peg$FAILED;
@@ -51242,7 +51489,7 @@ function peg$parse(input, options) {
51242
51489
  } else {
51243
51490
  s6 = peg$FAILED;
51244
51491
  if (peg$silentFails === 0) {
51245
- peg$fail(peg$e5);
51492
+ peg$fail(peg$e6);
51246
51493
  }
51247
51494
  }
51248
51495
  if (s6 !== peg$FAILED) {
@@ -51257,14 +51504,14 @@ function peg$parse(input, options) {
51257
51504
  s5 = null;
51258
51505
  }
51259
51506
  peg$savedPos = s2;
51260
- s2 = peg$f19(s3);
51507
+ s2 = peg$f21(s3);
51261
51508
  } else {
51262
51509
  peg$currPos = s2;
51263
51510
  s2 = peg$FAILED;
51264
51511
  }
51265
51512
  }
51266
51513
  peg$savedPos = s0;
51267
- s12 = peg$f20(s12);
51514
+ s12 = peg$f22(s12);
51268
51515
  s0 = s12;
51269
51516
  return s0;
51270
51517
  }
@@ -51275,12 +51522,12 @@ function peg$parse(input, options) {
51275
51522
  if (s12 !== peg$FAILED) {
51276
51523
  s2 = peg$parse_();
51277
51524
  if (input.charCodeAt(peg$currPos) === 61) {
51278
- s3 = peg$c5;
51525
+ s3 = peg$c3;
51279
51526
  peg$currPos++;
51280
51527
  } else {
51281
51528
  s3 = peg$FAILED;
51282
51529
  if (peg$silentFails === 0) {
51283
- peg$fail(peg$e6);
51530
+ peg$fail(peg$e3);
51284
51531
  }
51285
51532
  }
51286
51533
  if (s3 !== peg$FAILED) {
@@ -51288,7 +51535,7 @@ function peg$parse(input, options) {
51288
51535
  s5 = peg$parseAtom();
51289
51536
  if (s5 !== peg$FAILED) {
51290
51537
  peg$savedPos = s0;
51291
- s0 = peg$f21(s12, s5);
51538
+ s0 = peg$f23(s12, s5);
51292
51539
  } else {
51293
51540
  peg$currPos = s0;
51294
51541
  s0 = peg$FAILED;
@@ -51315,7 +51562,7 @@ function peg$parse(input, options) {
51315
51562
  s5 = peg$parseAttrList();
51316
51563
  if (s5 !== peg$FAILED) {
51317
51564
  peg$savedPos = s0;
51318
- s0 = peg$f22(s12, s3, s5);
51565
+ s0 = peg$f24(s12, s3, s5);
51319
51566
  } else {
51320
51567
  peg$currPos = s0;
51321
51568
  s0 = peg$FAILED;
@@ -51336,7 +51583,7 @@ function peg$parse(input, options) {
51336
51583
  s12 = peg$parseSubgraph();
51337
51584
  if (s12 !== peg$FAILED) {
51338
51585
  peg$savedPos = s0;
51339
- s12 = peg$f23(s12);
51586
+ s12 = peg$f25(s12);
51340
51587
  }
51341
51588
  s0 = s12;
51342
51589
  if (s0 === peg$FAILED) {
@@ -51344,7 +51591,7 @@ function peg$parse(input, options) {
51344
51591
  s12 = peg$parseNode();
51345
51592
  if (s12 !== peg$FAILED) {
51346
51593
  peg$savedPos = s0;
51347
- s12 = peg$f24(s12);
51594
+ s12 = peg$f26(s12);
51348
51595
  }
51349
51596
  s0 = s12;
51350
51597
  }
@@ -51384,7 +51631,7 @@ function peg$parse(input, options) {
51384
51631
  s9 = peg$parseAtom();
51385
51632
  if (s9 !== peg$FAILED) {
51386
51633
  peg$savedPos = s0;
51387
- s0 = peg$f25(s12, s5, s9);
51634
+ s0 = peg$f27(s12, s5, s9);
51388
51635
  } else {
51389
51636
  peg$currPos = s0;
51390
51637
  s0 = peg$FAILED;
@@ -51424,7 +51671,7 @@ function peg$parse(input, options) {
51424
51671
  s5 = peg$parseAtom();
51425
51672
  if (s5 !== peg$FAILED) {
51426
51673
  peg$savedPos = s0;
51427
- s0 = peg$f26(s12, s5);
51674
+ s0 = peg$f28(s12, s5);
51428
51675
  } else {
51429
51676
  peg$currPos = s0;
51430
51677
  s0 = peg$FAILED;
@@ -51442,7 +51689,7 @@ function peg$parse(input, options) {
51442
51689
  s12 = peg$parseAtom();
51443
51690
  if (s12 !== peg$FAILED) {
51444
51691
  peg$savedPos = s0;
51445
- s12 = peg$f27(s12);
51692
+ s12 = peg$f29(s12);
51446
51693
  }
51447
51694
  s0 = s12;
51448
51695
  }
@@ -51461,7 +51708,7 @@ function peg$parse(input, options) {
51461
51708
  s5 = peg$parseEdgeChain();
51462
51709
  if (s5 !== peg$FAILED) {
51463
51710
  peg$savedPos = s0;
51464
- s0 = peg$f28(s3, s5);
51711
+ s0 = peg$f30(s3, s5);
51465
51712
  } else {
51466
51713
  peg$currPos = s0;
51467
51714
  s0 = peg$FAILED;
@@ -51478,7 +51725,7 @@ function peg$parse(input, options) {
51478
51725
  s0 = peg$currPos;
51479
51726
  s12 = "";
51480
51727
  peg$savedPos = s0;
51481
- s12 = peg$f29();
51728
+ s12 = peg$f31();
51482
51729
  s0 = s12;
51483
51730
  }
51484
51731
  return s0;
@@ -51549,7 +51796,7 @@ function peg$parse(input, options) {
51549
51796
  }
51550
51797
  if (s9 !== peg$FAILED) {
51551
51798
  peg$savedPos = s0;
51552
- s0 = peg$f30(s3, s7);
51799
+ s0 = peg$f32(s3, s7);
51553
51800
  } else {
51554
51801
  peg$currPos = s0;
51555
51802
  s0 = peg$FAILED;
@@ -51600,7 +51847,7 @@ function peg$parse(input, options) {
51600
51847
  }
51601
51848
  if (s7 !== peg$FAILED) {
51602
51849
  peg$savedPos = s0;
51603
- s0 = peg$f31(s5);
51850
+ s0 = peg$f33(s5);
51604
51851
  } else {
51605
51852
  peg$currPos = s0;
51606
51853
  s0 = peg$FAILED;
@@ -51644,7 +51891,7 @@ function peg$parse(input, options) {
51644
51891
  }
51645
51892
  if (s5 !== peg$FAILED) {
51646
51893
  peg$savedPos = s0;
51647
- s0 = peg$f32(s3);
51894
+ s0 = peg$f34(s3);
51648
51895
  } else {
51649
51896
  peg$currPos = s0;
51650
51897
  s0 = peg$FAILED;
@@ -51683,7 +51930,7 @@ function peg$parse(input, options) {
51683
51930
  s7 = peg$parseQAtom();
51684
51931
  if (s7 !== peg$FAILED) {
51685
51932
  peg$savedPos = s3;
51686
- s3 = peg$f33(s12, s7);
51933
+ s3 = peg$f35(s12, s7);
51687
51934
  } else {
51688
51935
  peg$currPos = s3;
51689
51936
  s3 = peg$FAILED;
@@ -51710,7 +51957,7 @@ function peg$parse(input, options) {
51710
51957
  s7 = peg$parseQAtom();
51711
51958
  if (s7 !== peg$FAILED) {
51712
51959
  peg$savedPos = s3;
51713
- s3 = peg$f33(s12, s7);
51960
+ s3 = peg$f35(s12, s7);
51714
51961
  } else {
51715
51962
  peg$currPos = s3;
51716
51963
  s3 = peg$FAILED;
@@ -51721,7 +51968,7 @@ function peg$parse(input, options) {
51721
51968
  }
51722
51969
  }
51723
51970
  peg$savedPos = s0;
51724
- s0 = peg$f34(s12, s2);
51971
+ s0 = peg$f36(s12, s2);
51725
51972
  } else {
51726
51973
  peg$currPos = s0;
51727
51974
  s0 = peg$FAILED;
@@ -51769,7 +52016,7 @@ function peg$parse(input, options) {
51769
52016
  }
51770
52017
  if (s3 !== peg$FAILED) {
51771
52018
  peg$savedPos = s0;
51772
- s0 = peg$f35(s2);
52019
+ s0 = peg$f37(s2);
51773
52020
  } else {
51774
52021
  peg$currPos = s0;
51775
52022
  s0 = peg$FAILED;
@@ -51794,7 +52041,7 @@ function peg$parse(input, options) {
51794
52041
  }
51795
52042
  if (s12 !== peg$FAILED) {
51796
52043
  peg$savedPos = s0;
51797
- s12 = peg$f36();
52044
+ s12 = peg$f38();
51798
52045
  }
51799
52046
  s0 = s12;
51800
52047
  if (s0 === peg$FAILED) {
@@ -51810,7 +52057,7 @@ function peg$parse(input, options) {
51810
52057
  }
51811
52058
  if (s12 !== peg$FAILED) {
51812
52059
  peg$savedPos = s0;
51813
- s12 = peg$f37();
52060
+ s12 = peg$f39();
51814
52061
  }
51815
52062
  s0 = s12;
51816
52063
  if (s0 === peg$FAILED) {
@@ -51836,7 +52083,7 @@ function peg$parse(input, options) {
51836
52083
  }
51837
52084
  if (s2 !== peg$FAILED) {
51838
52085
  peg$savedPos = s0;
51839
- s0 = peg$f38(s2);
52086
+ s0 = peg$f40(s2);
51840
52087
  } else {
51841
52088
  peg$currPos = s0;
51842
52089
  s0 = peg$FAILED;
@@ -51885,7 +52132,7 @@ function peg$parse(input, options) {
51885
52132
  }
51886
52133
  if (s3 !== peg$FAILED) {
51887
52134
  peg$savedPos = s0;
51888
- s0 = peg$f39(s2);
52135
+ s0 = peg$f41(s2);
51889
52136
  } else {
51890
52137
  peg$currPos = s0;
51891
52138
  s0 = peg$FAILED;
@@ -51906,7 +52153,7 @@ function peg$parse(input, options) {
51906
52153
  s2 = peg$parseHtmlChar();
51907
52154
  }
51908
52155
  peg$savedPos = s0;
51909
- s12 = peg$f40(s12);
52156
+ s12 = peg$f42(s12);
51910
52157
  s0 = s12;
51911
52158
  return s0;
51912
52159
  }
@@ -51936,7 +52183,7 @@ function peg$parse(input, options) {
51936
52183
  }
51937
52184
  if (s3 !== peg$FAILED) {
51938
52185
  peg$savedPos = s0;
51939
- s0 = peg$f41(s12, s2);
52186
+ s0 = peg$f43(s12, s2);
51940
52187
  } else {
51941
52188
  peg$currPos = s0;
51942
52189
  s0 = peg$FAILED;
@@ -51981,7 +52228,7 @@ function peg$parse(input, options) {
51981
52228
  s2 = peg$parseName();
51982
52229
  if (s2 !== peg$FAILED) {
51983
52230
  peg$savedPos = s0;
51984
- s0 = peg$f42(s2);
52231
+ s0 = peg$f44(s2);
51985
52232
  } else {
51986
52233
  peg$currPos = s0;
51987
52234
  s0 = peg$FAILED;
@@ -52029,7 +52276,7 @@ function peg$parse(input, options) {
52029
52276
  }
52030
52277
  }
52031
52278
  peg$savedPos = s0;
52032
- s0 = peg$f43(s12, s2);
52279
+ s0 = peg$f45(s12, s2);
52033
52280
  } else {
52034
52281
  peg$currPos = s0;
52035
52282
  s0 = peg$FAILED;
@@ -52179,70 +52426,7 @@ function peg$parse(input, options) {
52179
52426
  }
52180
52427
  }
52181
52428
  if (s3 !== peg$FAILED) {
52182
- s4 = peg$currPos;
52183
- s5 = input.charAt(peg$currPos);
52184
- if (peg$r6.test(s5)) {
52185
- peg$currPos++;
52186
- } else {
52187
- s5 = peg$FAILED;
52188
- if (peg$silentFails === 0) {
52189
- peg$fail(peg$e26);
52190
- }
52191
- }
52192
- if (s5 !== peg$FAILED) {
52193
- s6 = input.charAt(peg$currPos);
52194
- if (peg$r7.test(s6)) {
52195
- peg$currPos++;
52196
- } else {
52197
- s6 = peg$FAILED;
52198
- if (peg$silentFails === 0) {
52199
- peg$fail(peg$e27);
52200
- }
52201
- }
52202
- if (s6 === peg$FAILED) {
52203
- s6 = null;
52204
- }
52205
- s7 = [];
52206
- s8 = input.charAt(peg$currPos);
52207
- if (peg$r5.test(s8)) {
52208
- peg$currPos++;
52209
- } else {
52210
- s8 = peg$FAILED;
52211
- if (peg$silentFails === 0) {
52212
- peg$fail(peg$e24);
52213
- }
52214
- }
52215
- if (s8 !== peg$FAILED) {
52216
- while (s8 !== peg$FAILED) {
52217
- s7.push(s8);
52218
- s8 = input.charAt(peg$currPos);
52219
- if (peg$r5.test(s8)) {
52220
- peg$currPos++;
52221
- } else {
52222
- s8 = peg$FAILED;
52223
- if (peg$silentFails === 0) {
52224
- peg$fail(peg$e24);
52225
- }
52226
- }
52227
- }
52228
- } else {
52229
- s7 = peg$FAILED;
52230
- }
52231
- if (s7 !== peg$FAILED) {
52232
- s5 = [s5, s6, s7];
52233
- s4 = s5;
52234
- } else {
52235
- peg$currPos = s4;
52236
- s4 = peg$FAILED;
52237
- }
52238
- } else {
52239
- peg$currPos = s4;
52240
- s4 = peg$FAILED;
52241
- }
52242
- if (s4 === peg$FAILED) {
52243
- s4 = null;
52244
- }
52245
- s2 = [s2, s3, s4];
52429
+ s2 = [s2, s3];
52246
52430
  s12 = s2;
52247
52431
  } else {
52248
52432
  peg$currPos = s12;
@@ -52250,7 +52434,7 @@ function peg$parse(input, options) {
52250
52434
  }
52251
52435
  if (s12 !== peg$FAILED) {
52252
52436
  peg$savedPos = s0;
52253
- s12 = peg$f44(s12);
52437
+ s12 = peg$f46(s12);
52254
52438
  }
52255
52439
  s0 = s12;
52256
52440
  return s0;
@@ -52259,62 +52443,62 @@ function peg$parse(input, options) {
52259
52443
  let s0, s12, s2, s3, s4, s5, s6, s7, s8;
52260
52444
  s0 = peg$currPos;
52261
52445
  s12 = input.charAt(peg$currPos);
52262
- if (peg$r8.test(s12)) {
52446
+ if (peg$r6.test(s12)) {
52263
52447
  peg$currPos++;
52264
52448
  } else {
52265
52449
  s12 = peg$FAILED;
52266
52450
  if (peg$silentFails === 0) {
52267
- peg$fail(peg$e28);
52451
+ peg$fail(peg$e26);
52268
52452
  }
52269
52453
  }
52270
52454
  if (s12 !== peg$FAILED) {
52271
52455
  s2 = input.charAt(peg$currPos);
52272
- if (peg$r9.test(s2)) {
52456
+ if (peg$r7.test(s2)) {
52273
52457
  peg$currPos++;
52274
52458
  } else {
52275
52459
  s2 = peg$FAILED;
52276
52460
  if (peg$silentFails === 0) {
52277
- peg$fail(peg$e29);
52461
+ peg$fail(peg$e27);
52278
52462
  }
52279
52463
  }
52280
52464
  if (s2 !== peg$FAILED) {
52281
52465
  s3 = input.charAt(peg$currPos);
52282
- if (peg$r10.test(s3)) {
52466
+ if (peg$r8.test(s3)) {
52283
52467
  peg$currPos++;
52284
52468
  } else {
52285
52469
  s3 = peg$FAILED;
52286
52470
  if (peg$silentFails === 0) {
52287
- peg$fail(peg$e30);
52471
+ peg$fail(peg$e28);
52288
52472
  }
52289
52473
  }
52290
52474
  if (s3 !== peg$FAILED) {
52291
52475
  s4 = input.charAt(peg$currPos);
52292
- if (peg$r11.test(s4)) {
52476
+ if (peg$r9.test(s4)) {
52293
52477
  peg$currPos++;
52294
52478
  } else {
52295
52479
  s4 = peg$FAILED;
52296
52480
  if (peg$silentFails === 0) {
52297
- peg$fail(peg$e31);
52481
+ peg$fail(peg$e29);
52298
52482
  }
52299
52483
  }
52300
52484
  if (s4 !== peg$FAILED) {
52301
52485
  s5 = input.charAt(peg$currPos);
52302
- if (peg$r12.test(s5)) {
52486
+ if (peg$r10.test(s5)) {
52303
52487
  peg$currPos++;
52304
52488
  } else {
52305
52489
  s5 = peg$FAILED;
52306
52490
  if (peg$silentFails === 0) {
52307
- peg$fail(peg$e32);
52491
+ peg$fail(peg$e30);
52308
52492
  }
52309
52493
  }
52310
52494
  if (s5 !== peg$FAILED) {
52311
52495
  s6 = input.charAt(peg$currPos);
52312
- if (peg$r9.test(s6)) {
52496
+ if (peg$r7.test(s6)) {
52313
52497
  peg$currPos++;
52314
52498
  } else {
52315
52499
  s6 = peg$FAILED;
52316
52500
  if (peg$silentFails === 0) {
52317
- peg$fail(peg$e29);
52501
+ peg$fail(peg$e27);
52318
52502
  }
52319
52503
  }
52320
52504
  if (s6 !== peg$FAILED) {
@@ -52365,52 +52549,52 @@ function peg$parse(input, options) {
52365
52549
  let s0, s12, s2, s3, s4, s5, s6, s7;
52366
52550
  s0 = peg$currPos;
52367
52551
  s12 = input.charAt(peg$currPos);
52368
- if (peg$r13.test(s12)) {
52552
+ if (peg$r11.test(s12)) {
52369
52553
  peg$currPos++;
52370
52554
  } else {
52371
52555
  s12 = peg$FAILED;
52372
52556
  if (peg$silentFails === 0) {
52373
- peg$fail(peg$e33);
52557
+ peg$fail(peg$e31);
52374
52558
  }
52375
52559
  }
52376
52560
  if (s12 !== peg$FAILED) {
52377
52561
  s2 = input.charAt(peg$currPos);
52378
- if (peg$r10.test(s2)) {
52562
+ if (peg$r8.test(s2)) {
52379
52563
  peg$currPos++;
52380
52564
  } else {
52381
52565
  s2 = peg$FAILED;
52382
52566
  if (peg$silentFails === 0) {
52383
- peg$fail(peg$e30);
52567
+ peg$fail(peg$e28);
52384
52568
  }
52385
52569
  }
52386
52570
  if (s2 !== peg$FAILED) {
52387
52571
  s3 = input.charAt(peg$currPos);
52388
- if (peg$r14.test(s3)) {
52572
+ if (peg$r12.test(s3)) {
52389
52573
  peg$currPos++;
52390
52574
  } else {
52391
52575
  s3 = peg$FAILED;
52392
52576
  if (peg$silentFails === 0) {
52393
- peg$fail(peg$e34);
52577
+ peg$fail(peg$e32);
52394
52578
  }
52395
52579
  }
52396
52580
  if (s3 !== peg$FAILED) {
52397
52581
  s4 = input.charAt(peg$currPos);
52398
- if (peg$r15.test(s4)) {
52582
+ if (peg$r13.test(s4)) {
52399
52583
  peg$currPos++;
52400
52584
  } else {
52401
52585
  s4 = peg$FAILED;
52402
52586
  if (peg$silentFails === 0) {
52403
- peg$fail(peg$e35);
52587
+ peg$fail(peg$e33);
52404
52588
  }
52405
52589
  }
52406
52590
  if (s4 !== peg$FAILED) {
52407
52591
  s5 = input.charAt(peg$currPos);
52408
- if (peg$r16.test(s5)) {
52592
+ if (peg$r14.test(s5)) {
52409
52593
  peg$currPos++;
52410
52594
  } else {
52411
52595
  s5 = peg$FAILED;
52412
52596
  if (peg$silentFails === 0) {
52413
- peg$fail(peg$e36);
52597
+ peg$fail(peg$e34);
52414
52598
  }
52415
52599
  }
52416
52600
  if (s5 !== peg$FAILED) {
@@ -52457,72 +52641,72 @@ function peg$parse(input, options) {
52457
52641
  let s0, s12, s2, s3, s4, s5, s6, s7, s8, s9;
52458
52642
  s0 = peg$currPos;
52459
52643
  s12 = input.charAt(peg$currPos);
52460
- if (peg$r17.test(s12)) {
52644
+ if (peg$r15.test(s12)) {
52461
52645
  peg$currPos++;
52462
52646
  } else {
52463
52647
  s12 = peg$FAILED;
52464
52648
  if (peg$silentFails === 0) {
52465
- peg$fail(peg$e37);
52649
+ peg$fail(peg$e35);
52466
52650
  }
52467
52651
  }
52468
52652
  if (s12 !== peg$FAILED) {
52469
52653
  s2 = input.charAt(peg$currPos);
52470
- if (peg$r11.test(s2)) {
52654
+ if (peg$r9.test(s2)) {
52471
52655
  peg$currPos++;
52472
52656
  } else {
52473
52657
  s2 = peg$FAILED;
52474
52658
  if (peg$silentFails === 0) {
52475
- peg$fail(peg$e31);
52659
+ peg$fail(peg$e29);
52476
52660
  }
52477
52661
  }
52478
52662
  if (s2 !== peg$FAILED) {
52479
52663
  s3 = input.charAt(peg$currPos);
52480
- if (peg$r13.test(s3)) {
52664
+ if (peg$r11.test(s3)) {
52481
52665
  peg$currPos++;
52482
52666
  } else {
52483
52667
  s3 = peg$FAILED;
52484
52668
  if (peg$silentFails === 0) {
52485
- peg$fail(peg$e33);
52669
+ peg$fail(peg$e31);
52486
52670
  }
52487
52671
  }
52488
52672
  if (s3 !== peg$FAILED) {
52489
52673
  s4 = input.charAt(peg$currPos);
52490
- if (peg$r10.test(s4)) {
52674
+ if (peg$r8.test(s4)) {
52491
52675
  peg$currPos++;
52492
52676
  } else {
52493
52677
  s4 = peg$FAILED;
52494
52678
  if (peg$silentFails === 0) {
52495
- peg$fail(peg$e30);
52679
+ peg$fail(peg$e28);
52496
52680
  }
52497
52681
  }
52498
52682
  if (s4 !== peg$FAILED) {
52499
52683
  s5 = input.charAt(peg$currPos);
52500
- if (peg$r14.test(s5)) {
52684
+ if (peg$r12.test(s5)) {
52501
52685
  peg$currPos++;
52502
52686
  } else {
52503
52687
  s5 = peg$FAILED;
52504
52688
  if (peg$silentFails === 0) {
52505
- peg$fail(peg$e34);
52689
+ peg$fail(peg$e32);
52506
52690
  }
52507
52691
  }
52508
52692
  if (s5 !== peg$FAILED) {
52509
52693
  s6 = input.charAt(peg$currPos);
52510
- if (peg$r15.test(s6)) {
52694
+ if (peg$r13.test(s6)) {
52511
52695
  peg$currPos++;
52512
52696
  } else {
52513
52697
  s6 = peg$FAILED;
52514
52698
  if (peg$silentFails === 0) {
52515
- peg$fail(peg$e35);
52699
+ peg$fail(peg$e33);
52516
52700
  }
52517
52701
  }
52518
52702
  if (s6 !== peg$FAILED) {
52519
52703
  s7 = input.charAt(peg$currPos);
52520
- if (peg$r16.test(s7)) {
52704
+ if (peg$r14.test(s7)) {
52521
52705
  peg$currPos++;
52522
52706
  } else {
52523
52707
  s7 = peg$FAILED;
52524
52708
  if (peg$silentFails === 0) {
52525
- peg$fail(peg$e36);
52709
+ peg$fail(peg$e34);
52526
52710
  }
52527
52711
  }
52528
52712
  if (s7 !== peg$FAILED) {
@@ -52577,42 +52761,42 @@ function peg$parse(input, options) {
52577
52761
  let s0, s12, s2, s3, s4, s5, s6;
52578
52762
  s0 = peg$currPos;
52579
52763
  s12 = input.charAt(peg$currPos);
52580
- if (peg$r18.test(s12)) {
52764
+ if (peg$r16.test(s12)) {
52581
52765
  peg$currPos++;
52582
52766
  } else {
52583
52767
  s12 = peg$FAILED;
52584
52768
  if (peg$silentFails === 0) {
52585
- peg$fail(peg$e38);
52769
+ peg$fail(peg$e36);
52586
52770
  }
52587
52771
  }
52588
52772
  if (s12 !== peg$FAILED) {
52589
52773
  s2 = input.charAt(peg$currPos);
52590
- if (peg$r19.test(s2)) {
52774
+ if (peg$r17.test(s2)) {
52591
52775
  peg$currPos++;
52592
52776
  } else {
52593
52777
  s2 = peg$FAILED;
52594
52778
  if (peg$silentFails === 0) {
52595
- peg$fail(peg$e39);
52779
+ peg$fail(peg$e37);
52596
52780
  }
52597
52781
  }
52598
52782
  if (s2 !== peg$FAILED) {
52599
52783
  s3 = input.charAt(peg$currPos);
52600
- if (peg$r17.test(s3)) {
52784
+ if (peg$r15.test(s3)) {
52601
52785
  peg$currPos++;
52602
52786
  } else {
52603
52787
  s3 = peg$FAILED;
52604
52788
  if (peg$silentFails === 0) {
52605
- peg$fail(peg$e37);
52789
+ peg$fail(peg$e35);
52606
52790
  }
52607
52791
  }
52608
52792
  if (s3 !== peg$FAILED) {
52609
52793
  s4 = input.charAt(peg$currPos);
52610
- if (peg$r20.test(s4)) {
52794
+ if (peg$r18.test(s4)) {
52611
52795
  peg$currPos++;
52612
52796
  } else {
52613
52797
  s4 = peg$FAILED;
52614
52798
  if (peg$silentFails === 0) {
52615
- peg$fail(peg$e40);
52799
+ peg$fail(peg$e38);
52616
52800
  }
52617
52801
  }
52618
52802
  if (s4 !== peg$FAILED) {
@@ -52655,42 +52839,42 @@ function peg$parse(input, options) {
52655
52839
  let s0, s12, s2, s3, s4, s5, s6;
52656
52840
  s0 = peg$currPos;
52657
52841
  s12 = input.charAt(peg$currPos);
52658
- if (peg$r20.test(s12)) {
52842
+ if (peg$r18.test(s12)) {
52659
52843
  peg$currPos++;
52660
52844
  } else {
52661
52845
  s12 = peg$FAILED;
52662
52846
  if (peg$silentFails === 0) {
52663
- peg$fail(peg$e40);
52847
+ peg$fail(peg$e38);
52664
52848
  }
52665
52849
  }
52666
52850
  if (s12 !== peg$FAILED) {
52667
52851
  s2 = input.charAt(peg$currPos);
52668
- if (peg$r17.test(s2)) {
52852
+ if (peg$r15.test(s2)) {
52669
52853
  peg$currPos++;
52670
52854
  } else {
52671
52855
  s2 = peg$FAILED;
52672
52856
  if (peg$silentFails === 0) {
52673
- peg$fail(peg$e37);
52857
+ peg$fail(peg$e35);
52674
52858
  }
52675
52859
  }
52676
52860
  if (s2 !== peg$FAILED) {
52677
52861
  s3 = input.charAt(peg$currPos);
52678
- if (peg$r13.test(s3)) {
52862
+ if (peg$r11.test(s3)) {
52679
52863
  peg$currPos++;
52680
52864
  } else {
52681
52865
  s3 = peg$FAILED;
52682
52866
  if (peg$silentFails === 0) {
52683
- peg$fail(peg$e33);
52867
+ peg$fail(peg$e31);
52684
52868
  }
52685
52869
  }
52686
52870
  if (s3 !== peg$FAILED) {
52687
52871
  s4 = input.charAt(peg$currPos);
52688
- if (peg$r20.test(s4)) {
52872
+ if (peg$r18.test(s4)) {
52689
52873
  peg$currPos++;
52690
52874
  } else {
52691
52875
  s4 = peg$FAILED;
52692
52876
  if (peg$silentFails === 0) {
52693
- peg$fail(peg$e40);
52877
+ peg$fail(peg$e38);
52694
52878
  }
52695
52879
  }
52696
52880
  if (s4 !== peg$FAILED) {
@@ -52733,82 +52917,82 @@ function peg$parse(input, options) {
52733
52917
  let s0, s12, s2, s3, s4, s5, s6, s7, s8, s9, s10;
52734
52918
  s0 = peg$currPos;
52735
52919
  s12 = input.charAt(peg$currPos);
52736
- if (peg$r8.test(s12)) {
52920
+ if (peg$r6.test(s12)) {
52737
52921
  peg$currPos++;
52738
52922
  } else {
52739
52923
  s12 = peg$FAILED;
52740
52924
  if (peg$silentFails === 0) {
52741
- peg$fail(peg$e28);
52925
+ peg$fail(peg$e26);
52742
52926
  }
52743
52927
  }
52744
52928
  if (s12 !== peg$FAILED) {
52745
52929
  s2 = input.charAt(peg$currPos);
52746
- if (peg$r21.test(s2)) {
52930
+ if (peg$r19.test(s2)) {
52747
52931
  peg$currPos++;
52748
52932
  } else {
52749
52933
  s2 = peg$FAILED;
52750
52934
  if (peg$silentFails === 0) {
52751
- peg$fail(peg$e41);
52935
+ peg$fail(peg$e39);
52752
52936
  }
52753
52937
  }
52754
52938
  if (s2 !== peg$FAILED) {
52755
52939
  s3 = input.charAt(peg$currPos);
52756
- if (peg$r22.test(s3)) {
52940
+ if (peg$r20.test(s3)) {
52757
52941
  peg$currPos++;
52758
52942
  } else {
52759
52943
  s3 = peg$FAILED;
52760
52944
  if (peg$silentFails === 0) {
52761
- peg$fail(peg$e42);
52945
+ peg$fail(peg$e40);
52762
52946
  }
52763
52947
  }
52764
52948
  if (s3 !== peg$FAILED) {
52765
52949
  s4 = input.charAt(peg$currPos);
52766
- if (peg$r13.test(s4)) {
52950
+ if (peg$r11.test(s4)) {
52767
52951
  peg$currPos++;
52768
52952
  } else {
52769
52953
  s4 = peg$FAILED;
52770
52954
  if (peg$silentFails === 0) {
52771
- peg$fail(peg$e33);
52955
+ peg$fail(peg$e31);
52772
52956
  }
52773
52957
  }
52774
52958
  if (s4 !== peg$FAILED) {
52775
52959
  s5 = input.charAt(peg$currPos);
52776
- if (peg$r10.test(s5)) {
52960
+ if (peg$r8.test(s5)) {
52777
52961
  peg$currPos++;
52778
52962
  } else {
52779
52963
  s5 = peg$FAILED;
52780
52964
  if (peg$silentFails === 0) {
52781
- peg$fail(peg$e30);
52965
+ peg$fail(peg$e28);
52782
52966
  }
52783
52967
  }
52784
52968
  if (s5 !== peg$FAILED) {
52785
52969
  s6 = input.charAt(peg$currPos);
52786
- if (peg$r14.test(s6)) {
52970
+ if (peg$r12.test(s6)) {
52787
52971
  peg$currPos++;
52788
52972
  } else {
52789
52973
  s6 = peg$FAILED;
52790
52974
  if (peg$silentFails === 0) {
52791
- peg$fail(peg$e34);
52975
+ peg$fail(peg$e32);
52792
52976
  }
52793
52977
  }
52794
52978
  if (s6 !== peg$FAILED) {
52795
52979
  s7 = input.charAt(peg$currPos);
52796
- if (peg$r15.test(s7)) {
52980
+ if (peg$r13.test(s7)) {
52797
52981
  peg$currPos++;
52798
52982
  } else {
52799
52983
  s7 = peg$FAILED;
52800
52984
  if (peg$silentFails === 0) {
52801
- peg$fail(peg$e35);
52985
+ peg$fail(peg$e33);
52802
52986
  }
52803
52987
  }
52804
52988
  if (s7 !== peg$FAILED) {
52805
52989
  s8 = input.charAt(peg$currPos);
52806
- if (peg$r16.test(s8)) {
52990
+ if (peg$r14.test(s8)) {
52807
52991
  peg$currPos++;
52808
52992
  } else {
52809
52993
  s8 = peg$FAILED;
52810
52994
  if (peg$silentFails === 0) {
52811
- peg$fail(peg$e36);
52995
+ peg$fail(peg$e34);
52812
52996
  }
52813
52997
  }
52814
52998
  if (s8 !== peg$FAILED) {
@@ -52881,62 +53065,62 @@ function peg$parse(input, options) {
52881
53065
  s0 = peg$currPos;
52882
53066
  s12 = peg$currPos;
52883
53067
  s2 = input.charAt(peg$currPos);
52884
- if (peg$r8.test(s2)) {
53068
+ if (peg$r6.test(s2)) {
52885
53069
  peg$currPos++;
52886
53070
  } else {
52887
53071
  s2 = peg$FAILED;
52888
53072
  if (peg$silentFails === 0) {
52889
- peg$fail(peg$e28);
53073
+ peg$fail(peg$e26);
52890
53074
  }
52891
53075
  }
52892
53076
  if (s2 !== peg$FAILED) {
52893
53077
  s3 = input.charAt(peg$currPos);
52894
- if (peg$r9.test(s3)) {
53078
+ if (peg$r7.test(s3)) {
52895
53079
  peg$currPos++;
52896
53080
  } else {
52897
53081
  s3 = peg$FAILED;
52898
53082
  if (peg$silentFails === 0) {
52899
- peg$fail(peg$e29);
53083
+ peg$fail(peg$e27);
52900
53084
  }
52901
53085
  }
52902
53086
  if (s3 !== peg$FAILED) {
52903
53087
  s4 = input.charAt(peg$currPos);
52904
- if (peg$r10.test(s4)) {
53088
+ if (peg$r8.test(s4)) {
52905
53089
  peg$currPos++;
52906
53090
  } else {
52907
53091
  s4 = peg$FAILED;
52908
53092
  if (peg$silentFails === 0) {
52909
- peg$fail(peg$e30);
53093
+ peg$fail(peg$e28);
52910
53094
  }
52911
53095
  }
52912
53096
  if (s4 !== peg$FAILED) {
52913
53097
  s5 = input.charAt(peg$currPos);
52914
- if (peg$r11.test(s5)) {
53098
+ if (peg$r9.test(s5)) {
52915
53099
  peg$currPos++;
52916
53100
  } else {
52917
53101
  s5 = peg$FAILED;
52918
53102
  if (peg$silentFails === 0) {
52919
- peg$fail(peg$e31);
53103
+ peg$fail(peg$e29);
52920
53104
  }
52921
53105
  }
52922
53106
  if (s5 !== peg$FAILED) {
52923
53107
  s6 = input.charAt(peg$currPos);
52924
- if (peg$r12.test(s6)) {
53108
+ if (peg$r10.test(s6)) {
52925
53109
  peg$currPos++;
52926
53110
  } else {
52927
53111
  s6 = peg$FAILED;
52928
53112
  if (peg$silentFails === 0) {
52929
- peg$fail(peg$e32);
53113
+ peg$fail(peg$e30);
52930
53114
  }
52931
53115
  }
52932
53116
  if (s6 !== peg$FAILED) {
52933
53117
  s7 = input.charAt(peg$currPos);
52934
- if (peg$r9.test(s7)) {
53118
+ if (peg$r7.test(s7)) {
52935
53119
  peg$currPos++;
52936
53120
  } else {
52937
53121
  s7 = peg$FAILED;
52938
53122
  if (peg$silentFails === 0) {
52939
- peg$fail(peg$e29);
53123
+ peg$fail(peg$e27);
52940
53124
  }
52941
53125
  }
52942
53126
  if (s7 !== peg$FAILED) {
@@ -52969,72 +53153,72 @@ function peg$parse(input, options) {
52969
53153
  if (s12 === peg$FAILED) {
52970
53154
  s12 = peg$currPos;
52971
53155
  s2 = input.charAt(peg$currPos);
52972
- if (peg$r17.test(s2)) {
53156
+ if (peg$r15.test(s2)) {
52973
53157
  peg$currPos++;
52974
53158
  } else {
52975
53159
  s2 = peg$FAILED;
52976
53160
  if (peg$silentFails === 0) {
52977
- peg$fail(peg$e37);
53161
+ peg$fail(peg$e35);
52978
53162
  }
52979
53163
  }
52980
53164
  if (s2 !== peg$FAILED) {
52981
53165
  s3 = input.charAt(peg$currPos);
52982
- if (peg$r11.test(s3)) {
53166
+ if (peg$r9.test(s3)) {
52983
53167
  peg$currPos++;
52984
53168
  } else {
52985
53169
  s3 = peg$FAILED;
52986
53170
  if (peg$silentFails === 0) {
52987
- peg$fail(peg$e31);
53171
+ peg$fail(peg$e29);
52988
53172
  }
52989
53173
  }
52990
53174
  if (s3 !== peg$FAILED) {
52991
53175
  s4 = input.charAt(peg$currPos);
52992
- if (peg$r13.test(s4)) {
53176
+ if (peg$r11.test(s4)) {
52993
53177
  peg$currPos++;
52994
53178
  } else {
52995
53179
  s4 = peg$FAILED;
52996
53180
  if (peg$silentFails === 0) {
52997
- peg$fail(peg$e33);
53181
+ peg$fail(peg$e31);
52998
53182
  }
52999
53183
  }
53000
53184
  if (s4 !== peg$FAILED) {
53001
53185
  s5 = input.charAt(peg$currPos);
53002
- if (peg$r10.test(s5)) {
53186
+ if (peg$r8.test(s5)) {
53003
53187
  peg$currPos++;
53004
53188
  } else {
53005
53189
  s5 = peg$FAILED;
53006
53190
  if (peg$silentFails === 0) {
53007
- peg$fail(peg$e30);
53191
+ peg$fail(peg$e28);
53008
53192
  }
53009
53193
  }
53010
53194
  if (s5 !== peg$FAILED) {
53011
53195
  s6 = input.charAt(peg$currPos);
53012
- if (peg$r14.test(s6)) {
53196
+ if (peg$r12.test(s6)) {
53013
53197
  peg$currPos++;
53014
53198
  } else {
53015
53199
  s6 = peg$FAILED;
53016
53200
  if (peg$silentFails === 0) {
53017
- peg$fail(peg$e34);
53201
+ peg$fail(peg$e32);
53018
53202
  }
53019
53203
  }
53020
53204
  if (s6 !== peg$FAILED) {
53021
53205
  s7 = input.charAt(peg$currPos);
53022
- if (peg$r15.test(s7)) {
53206
+ if (peg$r13.test(s7)) {
53023
53207
  peg$currPos++;
53024
53208
  } else {
53025
53209
  s7 = peg$FAILED;
53026
53210
  if (peg$silentFails === 0) {
53027
- peg$fail(peg$e35);
53211
+ peg$fail(peg$e33);
53028
53212
  }
53029
53213
  }
53030
53214
  if (s7 !== peg$FAILED) {
53031
53215
  s8 = input.charAt(peg$currPos);
53032
- if (peg$r16.test(s8)) {
53216
+ if (peg$r14.test(s8)) {
53033
53217
  peg$currPos++;
53034
53218
  } else {
53035
53219
  s8 = peg$FAILED;
53036
53220
  if (peg$silentFails === 0) {
53037
- peg$fail(peg$e36);
53221
+ peg$fail(peg$e34);
53038
53222
  }
53039
53223
  }
53040
53224
  if (s8 !== peg$FAILED) {
@@ -53071,52 +53255,52 @@ function peg$parse(input, options) {
53071
53255
  if (s12 === peg$FAILED) {
53072
53256
  s12 = peg$currPos;
53073
53257
  s2 = input.charAt(peg$currPos);
53074
- if (peg$r13.test(s2)) {
53258
+ if (peg$r11.test(s2)) {
53075
53259
  peg$currPos++;
53076
53260
  } else {
53077
53261
  s2 = peg$FAILED;
53078
53262
  if (peg$silentFails === 0) {
53079
- peg$fail(peg$e33);
53263
+ peg$fail(peg$e31);
53080
53264
  }
53081
53265
  }
53082
53266
  if (s2 !== peg$FAILED) {
53083
53267
  s3 = input.charAt(peg$currPos);
53084
- if (peg$r10.test(s3)) {
53268
+ if (peg$r8.test(s3)) {
53085
53269
  peg$currPos++;
53086
53270
  } else {
53087
53271
  s3 = peg$FAILED;
53088
53272
  if (peg$silentFails === 0) {
53089
- peg$fail(peg$e30);
53273
+ peg$fail(peg$e28);
53090
53274
  }
53091
53275
  }
53092
53276
  if (s3 !== peg$FAILED) {
53093
53277
  s4 = input.charAt(peg$currPos);
53094
- if (peg$r14.test(s4)) {
53278
+ if (peg$r12.test(s4)) {
53095
53279
  peg$currPos++;
53096
53280
  } else {
53097
53281
  s4 = peg$FAILED;
53098
53282
  if (peg$silentFails === 0) {
53099
- peg$fail(peg$e34);
53283
+ peg$fail(peg$e32);
53100
53284
  }
53101
53285
  }
53102
53286
  if (s4 !== peg$FAILED) {
53103
53287
  s5 = input.charAt(peg$currPos);
53104
- if (peg$r15.test(s5)) {
53288
+ if (peg$r13.test(s5)) {
53105
53289
  peg$currPos++;
53106
53290
  } else {
53107
53291
  s5 = peg$FAILED;
53108
53292
  if (peg$silentFails === 0) {
53109
- peg$fail(peg$e35);
53293
+ peg$fail(peg$e33);
53110
53294
  }
53111
53295
  }
53112
53296
  if (s5 !== peg$FAILED) {
53113
53297
  s6 = input.charAt(peg$currPos);
53114
- if (peg$r16.test(s6)) {
53298
+ if (peg$r14.test(s6)) {
53115
53299
  peg$currPos++;
53116
53300
  } else {
53117
53301
  s6 = peg$FAILED;
53118
53302
  if (peg$silentFails === 0) {
53119
- peg$fail(peg$e36);
53303
+ peg$fail(peg$e34);
53120
53304
  }
53121
53305
  }
53122
53306
  if (s6 !== peg$FAILED) {
@@ -53145,42 +53329,42 @@ function peg$parse(input, options) {
53145
53329
  if (s12 === peg$FAILED) {
53146
53330
  s12 = peg$currPos;
53147
53331
  s2 = input.charAt(peg$currPos);
53148
- if (peg$r18.test(s2)) {
53332
+ if (peg$r16.test(s2)) {
53149
53333
  peg$currPos++;
53150
53334
  } else {
53151
53335
  s2 = peg$FAILED;
53152
53336
  if (peg$silentFails === 0) {
53153
- peg$fail(peg$e38);
53337
+ peg$fail(peg$e36);
53154
53338
  }
53155
53339
  }
53156
53340
  if (s2 !== peg$FAILED) {
53157
53341
  s3 = input.charAt(peg$currPos);
53158
- if (peg$r19.test(s3)) {
53342
+ if (peg$r17.test(s3)) {
53159
53343
  peg$currPos++;
53160
53344
  } else {
53161
53345
  s3 = peg$FAILED;
53162
53346
  if (peg$silentFails === 0) {
53163
- peg$fail(peg$e39);
53347
+ peg$fail(peg$e37);
53164
53348
  }
53165
53349
  }
53166
53350
  if (s3 !== peg$FAILED) {
53167
53351
  s4 = input.charAt(peg$currPos);
53168
- if (peg$r17.test(s4)) {
53352
+ if (peg$r15.test(s4)) {
53169
53353
  peg$currPos++;
53170
53354
  } else {
53171
53355
  s4 = peg$FAILED;
53172
53356
  if (peg$silentFails === 0) {
53173
- peg$fail(peg$e37);
53357
+ peg$fail(peg$e35);
53174
53358
  }
53175
53359
  }
53176
53360
  if (s4 !== peg$FAILED) {
53177
53361
  s5 = input.charAt(peg$currPos);
53178
- if (peg$r20.test(s5)) {
53362
+ if (peg$r18.test(s5)) {
53179
53363
  peg$currPos++;
53180
53364
  } else {
53181
53365
  s5 = peg$FAILED;
53182
53366
  if (peg$silentFails === 0) {
53183
- peg$fail(peg$e40);
53367
+ peg$fail(peg$e38);
53184
53368
  }
53185
53369
  }
53186
53370
  if (s5 !== peg$FAILED) {
@@ -53205,42 +53389,42 @@ function peg$parse(input, options) {
53205
53389
  if (s12 === peg$FAILED) {
53206
53390
  s12 = peg$currPos;
53207
53391
  s2 = input.charAt(peg$currPos);
53208
- if (peg$r20.test(s2)) {
53392
+ if (peg$r18.test(s2)) {
53209
53393
  peg$currPos++;
53210
53394
  } else {
53211
53395
  s2 = peg$FAILED;
53212
53396
  if (peg$silentFails === 0) {
53213
- peg$fail(peg$e40);
53397
+ peg$fail(peg$e38);
53214
53398
  }
53215
53399
  }
53216
53400
  if (s2 !== peg$FAILED) {
53217
53401
  s3 = input.charAt(peg$currPos);
53218
- if (peg$r17.test(s3)) {
53402
+ if (peg$r15.test(s3)) {
53219
53403
  peg$currPos++;
53220
53404
  } else {
53221
53405
  s3 = peg$FAILED;
53222
53406
  if (peg$silentFails === 0) {
53223
- peg$fail(peg$e37);
53407
+ peg$fail(peg$e35);
53224
53408
  }
53225
53409
  }
53226
53410
  if (s3 !== peg$FAILED) {
53227
53411
  s4 = input.charAt(peg$currPos);
53228
- if (peg$r13.test(s4)) {
53412
+ if (peg$r11.test(s4)) {
53229
53413
  peg$currPos++;
53230
53414
  } else {
53231
53415
  s4 = peg$FAILED;
53232
53416
  if (peg$silentFails === 0) {
53233
- peg$fail(peg$e33);
53417
+ peg$fail(peg$e31);
53234
53418
  }
53235
53419
  }
53236
53420
  if (s4 !== peg$FAILED) {
53237
53421
  s5 = input.charAt(peg$currPos);
53238
- if (peg$r20.test(s5)) {
53422
+ if (peg$r18.test(s5)) {
53239
53423
  peg$currPos++;
53240
53424
  } else {
53241
53425
  s5 = peg$FAILED;
53242
53426
  if (peg$silentFails === 0) {
53243
- peg$fail(peg$e40);
53427
+ peg$fail(peg$e38);
53244
53428
  }
53245
53429
  }
53246
53430
  if (s5 !== peg$FAILED) {
@@ -53265,82 +53449,82 @@ function peg$parse(input, options) {
53265
53449
  if (s12 === peg$FAILED) {
53266
53450
  s12 = peg$currPos;
53267
53451
  s2 = input.charAt(peg$currPos);
53268
- if (peg$r8.test(s2)) {
53452
+ if (peg$r6.test(s2)) {
53269
53453
  peg$currPos++;
53270
53454
  } else {
53271
53455
  s2 = peg$FAILED;
53272
53456
  if (peg$silentFails === 0) {
53273
- peg$fail(peg$e28);
53457
+ peg$fail(peg$e26);
53274
53458
  }
53275
53459
  }
53276
53460
  if (s2 !== peg$FAILED) {
53277
53461
  s3 = input.charAt(peg$currPos);
53278
- if (peg$r21.test(s3)) {
53462
+ if (peg$r19.test(s3)) {
53279
53463
  peg$currPos++;
53280
53464
  } else {
53281
53465
  s3 = peg$FAILED;
53282
53466
  if (peg$silentFails === 0) {
53283
- peg$fail(peg$e41);
53467
+ peg$fail(peg$e39);
53284
53468
  }
53285
53469
  }
53286
53470
  if (s3 !== peg$FAILED) {
53287
53471
  s4 = input.charAt(peg$currPos);
53288
- if (peg$r22.test(s4)) {
53472
+ if (peg$r20.test(s4)) {
53289
53473
  peg$currPos++;
53290
53474
  } else {
53291
53475
  s4 = peg$FAILED;
53292
53476
  if (peg$silentFails === 0) {
53293
- peg$fail(peg$e42);
53477
+ peg$fail(peg$e40);
53294
53478
  }
53295
53479
  }
53296
53480
  if (s4 !== peg$FAILED) {
53297
53481
  s5 = input.charAt(peg$currPos);
53298
- if (peg$r13.test(s5)) {
53482
+ if (peg$r11.test(s5)) {
53299
53483
  peg$currPos++;
53300
53484
  } else {
53301
53485
  s5 = peg$FAILED;
53302
53486
  if (peg$silentFails === 0) {
53303
- peg$fail(peg$e33);
53487
+ peg$fail(peg$e31);
53304
53488
  }
53305
53489
  }
53306
53490
  if (s5 !== peg$FAILED) {
53307
53491
  s6 = input.charAt(peg$currPos);
53308
- if (peg$r10.test(s6)) {
53492
+ if (peg$r8.test(s6)) {
53309
53493
  peg$currPos++;
53310
53494
  } else {
53311
53495
  s6 = peg$FAILED;
53312
53496
  if (peg$silentFails === 0) {
53313
- peg$fail(peg$e30);
53497
+ peg$fail(peg$e28);
53314
53498
  }
53315
53499
  }
53316
53500
  if (s6 !== peg$FAILED) {
53317
53501
  s7 = input.charAt(peg$currPos);
53318
- if (peg$r14.test(s7)) {
53502
+ if (peg$r12.test(s7)) {
53319
53503
  peg$currPos++;
53320
53504
  } else {
53321
53505
  s7 = peg$FAILED;
53322
53506
  if (peg$silentFails === 0) {
53323
- peg$fail(peg$e34);
53507
+ peg$fail(peg$e32);
53324
53508
  }
53325
53509
  }
53326
53510
  if (s7 !== peg$FAILED) {
53327
53511
  s8 = input.charAt(peg$currPos);
53328
- if (peg$r15.test(s8)) {
53512
+ if (peg$r13.test(s8)) {
53329
53513
  peg$currPos++;
53330
53514
  } else {
53331
53515
  s8 = peg$FAILED;
53332
53516
  if (peg$silentFails === 0) {
53333
- peg$fail(peg$e35);
53517
+ peg$fail(peg$e33);
53334
53518
  }
53335
53519
  }
53336
53520
  if (s8 !== peg$FAILED) {
53337
53521
  s9 = input.charAt(peg$currPos);
53338
- if (peg$r16.test(s9)) {
53522
+ if (peg$r14.test(s9)) {
53339
53523
  peg$currPos++;
53340
53524
  } else {
53341
53525
  s9 = peg$FAILED;
53342
53526
  if (peg$silentFails === 0) {
53343
- peg$fail(peg$e36);
53527
+ peg$fail(peg$e34);
53344
53528
  }
53345
53529
  }
53346
53530
  if (s9 !== peg$FAILED) {
@@ -53412,24 +53596,24 @@ function peg$parse(input, options) {
53412
53596
  s0 = [];
53413
53597
  s12 = [];
53414
53598
  s2 = input.charAt(peg$currPos);
53415
- if (peg$r23.test(s2)) {
53599
+ if (peg$r21.test(s2)) {
53416
53600
  peg$currPos++;
53417
53601
  } else {
53418
53602
  s2 = peg$FAILED;
53419
53603
  if (peg$silentFails === 0) {
53420
- peg$fail(peg$e43);
53604
+ peg$fail(peg$e41);
53421
53605
  }
53422
53606
  }
53423
53607
  if (s2 !== peg$FAILED) {
53424
53608
  while (s2 !== peg$FAILED) {
53425
53609
  s12.push(s2);
53426
53610
  s2 = input.charAt(peg$currPos);
53427
- if (peg$r23.test(s2)) {
53611
+ if (peg$r21.test(s2)) {
53428
53612
  peg$currPos++;
53429
53613
  } else {
53430
53614
  s2 = peg$FAILED;
53431
53615
  if (peg$silentFails === 0) {
53432
- peg$fail(peg$e43);
53616
+ peg$fail(peg$e41);
53433
53617
  }
53434
53618
  }
53435
53619
  }
@@ -53449,24 +53633,24 @@ function peg$parse(input, options) {
53449
53633
  s0.push(s12);
53450
53634
  s12 = [];
53451
53635
  s2 = input.charAt(peg$currPos);
53452
- if (peg$r23.test(s2)) {
53636
+ if (peg$r21.test(s2)) {
53453
53637
  peg$currPos++;
53454
53638
  } else {
53455
53639
  s2 = peg$FAILED;
53456
53640
  if (peg$silentFails === 0) {
53457
- peg$fail(peg$e43);
53641
+ peg$fail(peg$e41);
53458
53642
  }
53459
53643
  }
53460
53644
  if (s2 !== peg$FAILED) {
53461
53645
  while (s2 !== peg$FAILED) {
53462
53646
  s12.push(s2);
53463
53647
  s2 = input.charAt(peg$currPos);
53464
- if (peg$r23.test(s2)) {
53648
+ if (peg$r21.test(s2)) {
53465
53649
  peg$currPos++;
53466
53650
  } else {
53467
53651
  s2 = peg$FAILED;
53468
53652
  if (peg$silentFails === 0) {
53469
- peg$fail(peg$e43);
53653
+ peg$fail(peg$e41);
53470
53654
  }
53471
53655
  }
53472
53656
  }
@@ -53494,7 +53678,7 @@ function peg$parse(input, options) {
53494
53678
  } else {
53495
53679
  s12 = peg$FAILED;
53496
53680
  if (peg$silentFails === 0) {
53497
- peg$fail(peg$e44);
53681
+ peg$fail(peg$e42);
53498
53682
  }
53499
53683
  }
53500
53684
  if (s12 !== peg$FAILED) {
@@ -53508,7 +53692,7 @@ function peg$parse(input, options) {
53508
53692
  } else {
53509
53693
  s5 = peg$FAILED;
53510
53694
  if (peg$silentFails === 0) {
53511
- peg$fail(peg$e45);
53695
+ peg$fail(peg$e43);
53512
53696
  }
53513
53697
  }
53514
53698
  peg$silentFails--;
@@ -53550,7 +53734,7 @@ function peg$parse(input, options) {
53550
53734
  } else {
53551
53735
  s5 = peg$FAILED;
53552
53736
  if (peg$silentFails === 0) {
53553
- peg$fail(peg$e45);
53737
+ peg$fail(peg$e43);
53554
53738
  }
53555
53739
  }
53556
53740
  peg$silentFails--;
@@ -53588,7 +53772,7 @@ function peg$parse(input, options) {
53588
53772
  } else {
53589
53773
  s3 = peg$FAILED;
53590
53774
  if (peg$silentFails === 0) {
53591
- peg$fail(peg$e45);
53775
+ peg$fail(peg$e43);
53592
53776
  }
53593
53777
  }
53594
53778
  if (s3 !== peg$FAILED) {
@@ -53613,29 +53797,29 @@ function peg$parse(input, options) {
53613
53797
  } else {
53614
53798
  s12 = peg$FAILED;
53615
53799
  if (peg$silentFails === 0) {
53616
- peg$fail(peg$e46);
53800
+ peg$fail(peg$e44);
53617
53801
  }
53618
53802
  }
53619
53803
  if (s12 !== peg$FAILED) {
53620
53804
  s2 = [];
53621
53805
  s3 = input.charAt(peg$currPos);
53622
- if (peg$r24.test(s3)) {
53806
+ if (peg$r22.test(s3)) {
53623
53807
  peg$currPos++;
53624
53808
  } else {
53625
53809
  s3 = peg$FAILED;
53626
53810
  if (peg$silentFails === 0) {
53627
- peg$fail(peg$e47);
53811
+ peg$fail(peg$e45);
53628
53812
  }
53629
53813
  }
53630
53814
  while (s3 !== peg$FAILED) {
53631
53815
  s2.push(s3);
53632
53816
  s3 = input.charAt(peg$currPos);
53633
- if (peg$r24.test(s3)) {
53817
+ if (peg$r22.test(s3)) {
53634
53818
  peg$currPos++;
53635
53819
  } else {
53636
53820
  s3 = peg$FAILED;
53637
53821
  if (peg$silentFails === 0) {
53638
- peg$fail(peg$e47);
53822
+ peg$fail(peg$e45);
53639
53823
  }
53640
53824
  }
53641
53825
  }
@@ -53645,7 +53829,7 @@ function peg$parse(input, options) {
53645
53829
  } else {
53646
53830
  s3 = peg$FAILED;
53647
53831
  if (peg$silentFails === 0) {
53648
- peg$fail(peg$e48);
53832
+ peg$fail(peg$e46);
53649
53833
  }
53650
53834
  }
53651
53835
  if (s3 === peg$FAILED) {
@@ -53690,29 +53874,29 @@ function peg$parse(input, options) {
53690
53874
  } else {
53691
53875
  s12 = peg$FAILED;
53692
53876
  if (peg$silentFails === 0) {
53693
- peg$fail(peg$e49);
53877
+ peg$fail(peg$e47);
53694
53878
  }
53695
53879
  }
53696
53880
  if (s12 !== peg$FAILED) {
53697
53881
  s2 = [];
53698
53882
  s3 = input.charAt(peg$currPos);
53699
- if (peg$r24.test(s3)) {
53883
+ if (peg$r22.test(s3)) {
53700
53884
  peg$currPos++;
53701
53885
  } else {
53702
53886
  s3 = peg$FAILED;
53703
53887
  if (peg$silentFails === 0) {
53704
- peg$fail(peg$e47);
53888
+ peg$fail(peg$e45);
53705
53889
  }
53706
53890
  }
53707
53891
  while (s3 !== peg$FAILED) {
53708
53892
  s2.push(s3);
53709
53893
  s3 = input.charAt(peg$currPos);
53710
- if (peg$r24.test(s3)) {
53894
+ if (peg$r22.test(s3)) {
53711
53895
  peg$currPos++;
53712
53896
  } else {
53713
53897
  s3 = peg$FAILED;
53714
53898
  if (peg$silentFails === 0) {
53715
- peg$fail(peg$e47);
53899
+ peg$fail(peg$e45);
53716
53900
  }
53717
53901
  }
53718
53902
  }
@@ -53722,7 +53906,7 @@ function peg$parse(input, options) {
53722
53906
  } else {
53723
53907
  s3 = peg$FAILED;
53724
53908
  if (peg$silentFails === 0) {
53725
- peg$fail(peg$e48);
53909
+ peg$fail(peg$e46);
53726
53910
  }
53727
53911
  }
53728
53912
  if (s3 === peg$FAILED) {
@@ -54085,6 +54269,75 @@ function buildFromAst(ast) {
54085
54269
  return graph;
54086
54270
  }
54087
54271
 
54272
+ // src/parser/number-scan.ts
54273
+ var ASCII_DEL = 127;
54274
+ function isLetter(c) {
54275
+ if (c === void 0) return false;
54276
+ return c >= "A" && c <= "Z" || c >= "a" && c <= "z" || c === "_" || c.charCodeAt(0) > ASCII_DEL;
54277
+ }
54278
+ function isDigit(c) {
54279
+ return c !== void 0 && c >= "0" && c <= "9";
54280
+ }
54281
+ function startsNumber(s, i) {
54282
+ const c = s[i];
54283
+ if (isDigit(c)) return true;
54284
+ if (c === ".") return isDigit(s[i + 1]);
54285
+ if (c !== "-") return false;
54286
+ return isDigit(s[i + 1]) || s[i + 1] === "." && isDigit(s[i + 2]);
54287
+ }
54288
+ function matchNumber(s, i) {
54289
+ let j = s[i] === "-" ? i + 1 : i;
54290
+ if (s[j] === ".") {
54291
+ j++;
54292
+ while (isDigit(s[j])) j++;
54293
+ } else {
54294
+ while (isDigit(s[j])) j++;
54295
+ if (s[j] === ".") {
54296
+ j++;
54297
+ while (isDigit(s[j])) j++;
54298
+ }
54299
+ }
54300
+ if (s[j] === "." || isLetter(s[j])) j++;
54301
+ return j;
54302
+ }
54303
+ function twoDots(text) {
54304
+ const dot = text.indexOf(".");
54305
+ return dot !== -1 && dot !== text.length - 1;
54306
+ }
54307
+ function chkNum(text) {
54308
+ const c = text[text.length - 1];
54309
+ return !isDigit(c) && c !== "." || c === "." && twoDots(text);
54310
+ }
54311
+ function lexToken(s, i) {
54312
+ if (isLetter(s[i])) {
54313
+ let j2 = i + 1;
54314
+ while (isLetter(s[j2]) || isDigit(s[j2])) j2++;
54315
+ return { next: j2, bad: null };
54316
+ }
54317
+ if (s[i] === "-" && (s[i + 1] === "-" || s[i + 1] === ">")) return { next: i + 2, bad: null };
54318
+ if (!startsNumber(s, i)) return { next: i + 1, bad: null };
54319
+ const j = matchNumber(s, i);
54320
+ const text = s.slice(i, j);
54321
+ return chkNum(text) ? { next: j - 1, bad: text } : { next: j, bad: null };
54322
+ }
54323
+ function scanNumberAmbiguities(src, stripped) {
54324
+ const out = [];
54325
+ let line = 1;
54326
+ let lineAt = 0;
54327
+ for (let i = 0; i < stripped.length; ) {
54328
+ const { next, bad } = lexToken(stripped, i);
54329
+ if (bad !== null) {
54330
+ for (; lineAt < i; lineAt++) if (src[lineAt] === "\n") line++;
54331
+ out.push({ text: bad, line, offset: i });
54332
+ }
54333
+ i = next;
54334
+ }
54335
+ return out;
54336
+ }
54337
+ function numberAmbiguityMessage(a) {
54338
+ return `Warning: syntax ambiguity - badly delimited number '${a.text}' in line ${a.line} of input splits into two tokens`;
54339
+ }
54340
+
54088
54341
  // src/parser/index.ts
54089
54342
  var ParseError = class extends DotEngineError {
54090
54343
  type = "syntax";
@@ -54244,6 +54497,12 @@ function isPeggyError(err) {
54244
54497
  if (typeof e["location"] !== "object" || e["location"] === null) return false;
54245
54498
  return "start" in e["location"];
54246
54499
  }
54500
+ function warnNumberAmbiguities(src, upTo) {
54501
+ for (const a of scanNumberAmbiguities(src, Stripper.strip(src))) {
54502
+ if (a.offset > upTo) break;
54503
+ console.error(numberAmbiguityMessage(a));
54504
+ }
54505
+ }
54247
54506
  function parse(src) {
54248
54507
  if (typeof src !== "string") {
54249
54508
  throw invalidArgType("dotSource", "string", src);
@@ -54254,6 +54513,7 @@ function parse(src) {
54254
54513
  } catch (err) {
54255
54514
  if (isPeggyError(err)) {
54256
54515
  const start = err.location.start;
54516
+ warnNumberAmbiguities(src, start.offset);
54257
54517
  const code = err.found === null ? "SYNTAX_UNEXPECTED_EOF" : "SYNTAX_ERROR";
54258
54518
  throw new ParseError(
54259
54519
  err instanceof Error ? err.message : String(err),
@@ -54271,6 +54531,7 @@ function parse(src) {
54271
54531
  }
54272
54532
  throw err;
54273
54533
  }
54534
+ warnNumberAmbiguities(src, src.length);
54274
54535
  validateEdgeOperators(src, ast.directed);
54275
54536
  return buildFromAst(ast);
54276
54537
  }
@@ -54279,6 +54540,7 @@ function parse(src) {
54279
54540
  var XDOT_PARSE_ERROR = 1;
54280
54541
 
54281
54542
  // src/xdot/parse.ts
54543
+ var ULONG_MAX = 0xffffffffffffffffn;
54282
54544
  var XdotParser = class _XdotParser {
54283
54545
  static isWs(c) {
54284
54546
  return c === " " || c === " " || c === "\n" || c === "\r";
@@ -54322,12 +54584,23 @@ var XdotParser = class _XdotParser {
54322
54584
  if (i === digStart) return null;
54323
54585
  return { val: parseInt(s.slice(start, i), 10), pos: i };
54324
54586
  }
54587
+ /**
54588
+ * strtoul(s, &endp, 10) cast to unsigned int: optional sign, a leading "-"
54589
+ * negates modulo 2^64, magnitude overflow saturates to ULONG_MAX, and the
54590
+ * result keeps the low 32 bits.
54591
+ * @see lib/xdot/xdot.c:parseUInt
54592
+ */
54325
54593
  static parseUInt_(s, pos) {
54326
54594
  const i = _XdotParser.skipWs(s, pos);
54327
- const start = i;
54328
- const end = _XdotParser.consumeDigits(s, i);
54595
+ let start = i;
54596
+ const negative = i < s.length && s[i] === "-";
54597
+ if (i < s.length && (s[i] === "-" || s[i] === "+")) start++;
54598
+ const end = _XdotParser.consumeDigits(s, start);
54329
54599
  if (end === start) return null;
54330
- return { val: parseInt(s.slice(start, end), 10), pos: end };
54600
+ const mag = BigInt(s.slice(start, end));
54601
+ const clamped = mag > ULONG_MAX ? ULONG_MAX : mag;
54602
+ const wrapped = negative && mag <= ULONG_MAX ? BigInt.asUintN(64, -clamped) : clamped;
54603
+ return { val: Number(BigInt.asUintN(32, wrapped)), pos: end };
54331
54604
  }
54332
54605
  static parseRect(s, pos) {
54333
54606
  const rx = _XdotParser.parseReal(s, pos);
@@ -54424,7 +54697,7 @@ var XdotParser = class _XdotParser {
54424
54697
  if (!rx1) return null;
54425
54698
  const ry1 = _XdotParser.parseReal(s, rx1.pos);
54426
54699
  if (!ry1) return null;
54427
- const rn = _XdotParser.parseInt_(s, ry1.pos);
54700
+ const rn = _XdotParser.parseUInt_(s, ry1.pos);
54428
54701
  if (!rn) return null;
54429
54702
  const rs = _XdotParser.parseStops(s, rn.pos, rn.val);
54430
54703
  if (!rs) return null;
@@ -54443,7 +54716,7 @@ var XdotParser = class _XdotParser {
54443
54716
  if (!ry1) return null;
54444
54717
  const rr1 = _XdotParser.parseReal(s, ry1.pos);
54445
54718
  if (!rr1) return null;
54446
- const rn = _XdotParser.parseInt_(s, rr1.pos);
54719
+ const rn = _XdotParser.parseUInt_(s, rr1.pos);
54447
54720
  if (!rn) return null;
54448
54721
  const rs = _XdotParser.parseStops(s, rn.pos, rn.val);
54449
54722
  if (!rs) return null;