// HydroPulse — Map component (SVG Europe with partner dots + demo sites)

const { useState: useStateMap, useRef: useRefMap, useEffect: useEffectMap } = React;

// --- Geographic projection -------------------------------------------------
// The map is a recognizable Europe outline drawn in the viewBox "0 0 1000 750".
// All landmasses and markers share ONE coordinate system: a simple
// equirectangular projection over the bounding box below. Marker positions are
// derived from real lat/lon (overriding the normalized coords in data.js) so
// every dot lands on the correct country.
const HP_GEO_BOX = { lonMin: -12, lonMax: 35, latMin: 33, latMax: 60 };
function hpProject(lat, lon) {
  var x = ((lon - HP_GEO_BOX.lonMin) / (HP_GEO_BOX.lonMax - HP_GEO_BOX.lonMin)) * 1000;
  var y = ((HP_GEO_BOX.latMax - lat) / (HP_GEO_BOX.latMax - HP_GEO_BOX.latMin)) * 750;
  return { x: x, y: y };
}

// Demonstration sites keyed by data.js sites[].id -> real lat/lon.
// spain-mountain (Granada) is nudged so it stays clickable next to spain-arid.
// madeira is an Atlantic island far off the SW corner: it is rendered in a
// dedicated inset box (see HP_MADEIRA_INSET) rather than projected on the map.
const HP_SITE_GEO = {
  "swiss-alpine": { lat: 46.5, lon: 8.0 },
  "golesti": { lat: 44.9, lon: 24.9 },
  "spain-arid": { lat: 37.4, lon: -4.5 },
  "spain-mountain": { lat: 37.2, lon: -3.6, dx: 6, dy: 10 },
  "madeira": { inset: true },
};

// Partner country points keyed by country code (mapPoints[].c) -> real lat/lon.
const HP_PARTNER_GEO = {
  GR: { lat: 39.0, lon: 22.0 },
  DK: { lat: 56.0, lon: 10.0 },
  CH: { lat: 46.8, lon: 8.2 },
  ES: { lat: 40.2, lon: -3.7 },
  PL: { lat: 52.0, lon: 19.0 },
  CY: { lat: 35.0, lon: 33.0 },
  RO: { lat: 45.9, lon: 25.0 },
  PT: { lat: 39.5, lon: -8.0 },
  UK: { lat: 54.0, lon: -2.0 },
};

// Inset frame for Madeira (an island ~700km SW of mainland Portugal) so its
// marker is never lost off-canvas. The marker sits inside this small box.
const HP_MADEIRA_INSET = { x: 36, y: 470, w: 132, h: 96 };

function hpSiteXY(site) {
  var g = HP_SITE_GEO[site.id];
  if (g && !g.inset) {
    var p = hpProject(g.lat, g.lon);
    return { x: p.x + (g.dx || 0), y: p.y + (g.dy || 0), inset: false };
  }
  if (g && g.inset) {
    // Centre of the Madeira inset box.
    return { x: HP_MADEIRA_INSET.x + HP_MADEIRA_INSET.w / 2, y: HP_MADEIRA_INSET.y + HP_MADEIRA_INSET.h - 26, inset: true };
  }
  // Fallback to data.js normalized coords if an id is ever unmapped.
  return { x: site.coord.x * 1000, y: site.coord.y * 750, inset: false };
}

function hpPartnerXY(point) {
  var g = HP_PARTNER_GEO[point.c] || HP_PARTNER_GEO[point.id];
  if (g) { var p = hpProject(g.lat, g.lon); return { x: p.x, y: p.y }; }
  return { x: point.x * 1000, y: point.y * 750 };
}

// Recognizable simplified Europe coastline, projected through hpProject (above)
// onto the 0..1000 / 0..750 viewBox. Each entry is one closed landmass.
const HP_EUROPE_PATHS = [
  "M668.9 527.2 L672.3 505.4 L667.4 504.2 L665.6 494.8 L674.7 481.7 L677.1 486.9 L684.3 485.8 L692 494.1 L691.4 518.9 L696.5 530.2 L701.8 530.7 L703 539.9 L695.1 552.8 L687.6 555.7 L687.5 563.2 L680.7 564.3 L677.9 554.5 L665.7 544 L669.8 545.8 L666.1 537.6 L669.4 527.6 Z",
  "M630.8 475.3 L622.6 459.5 L598.8 438.9 L598.4 430.6 L590.1 421.9 L591.7 411.2 L603 416.6 L615.2 409.3 L667.5 419.7 L661.8 434.6 L672.8 443 L664.6 444.1 L669.8 456.4 L658.5 458 L661.1 465.3 L653.2 465.1 L648 484.3 L631.6 474.5 Z",
  "M848.5 476.6 L839.3 486.9 L851.3 500.5 L841.8 502.6 L834.7 496.9 L821.7 500.7 L810.1 508 L811.5 517.9 L793.2 521 L771.6 511.9 L743.3 518.3 L745 506.6 L731.2 491 L735.3 486.7 L732.8 477.2 L744.8 466.9 L731.2 449.3 L737.3 438.5 L745.6 442.3 L741.3 447.1 L744 449.5 L795.3 454.9 L827.9 440.7 L849.3 444.3 L863.5 451.5 L864 457.3 L853 462 L849 476.2 Z",
  "M971.3 684.6 L991.3 675.3 L977.1 686.9 L980.6 695.4 L971.9 695.4 L958.1 706.6 L944.8 701.4 L942 691.8 L954.4 690.3 L955.8 683.5 L970.9 684.7 Z",
  "M500.3 143.6 L507.6 147.5 L499 149.4 L489.1 144.7 L492.3 140.2 L498.1 142.7 Z",
  "M511.4 141.9 L514.2 143.4 L509.9 151.1 L504.4 140.6 L511.1 141.8 Z",
  "M575.6 139 L567.7 136.1 L569.4 130.4 L577.5 135 L575.8 139 Z",
  "M483.9 125.5 L484.7 135.5 L478.7 138.1 L461.2 125 L484 125.2 Z",
  "M522.7 111.3 L523.4 119.3 L514.7 125.6 L520.5 130.9 L511.2 134.2 L514.5 135.7 L511.5 139.8 L504.9 133.2 L494.6 133.3 L491.3 120.5 L486.7 118.5 L496.7 118.1 L500.3 113.9 L495.2 111.3 L505.8 112.2 L506.3 120.5 L509.8 113.4 L511.9 120.7 L507.6 112 L516.8 107.5 L522.8 111.2 Z",
  "M467.5 81.3 L474.7 83.9 L474.6 90.3 L465.2 93 L475.3 91.8 L472.1 98.1 L488.6 98.9 L483.9 106.6 L473.3 106.2 L472.1 115.9 L465.2 115.4 L467.9 119.3 L458.5 119.3 L464.2 122.1 L459.3 127.2 L461.5 133.4 L456.6 135.4 L462.6 143.6 L440.4 141.9 L439.9 135.7 L435.6 136.8 L440.2 135.1 L438.8 127 L427.4 123.6 L428.2 111.5 L429.5 116.4 L434 114 L428 111.1 L428 96.4 L430.1 91.4 L441 97.7 L440 93.9 L448.3 88.7 L448.1 95.4 L453.7 96.5 L450.6 85.7 L467.4 81.5 Z",
  "M477.3 66.9 L479.6 76.9 L475.2 83.6 L449.3 81.9 L439.8 84.9 L434.4 92.3 L437.3 94.9 L430.8 88.7 L438.8 79.9 L455.1 79.1 L467.2 67 L480.4 62.6 L477.4 66.6 Z",
  "M97.7 140.2 L81.5 153.8 L99.4 163.5 L105.8 155.1 L114.4 165.6 L125.4 166.6 L119.5 168.1 L125.9 178.8 L122.9 184.6 L127.4 196 L117 212.3 L120 217.2 L106.5 214.4 L106.3 218.4 L94.1 219.4 L83.3 227.5 L76 225.5 L78.4 229.5 L70.3 234.1 L46.4 237.6 L54.2 229.9 L39.8 233 L51.5 225.8 L34.6 225.6 L47.7 218.1 L32.6 219.2 L48.1 215.4 L46 211.7 L50 206.6 L67.7 203.7 L43.9 206.8 L65.1 187.1 L38.8 183.1 L38.6 179.2 L49 177.8 L44.5 173.4 L51.9 170.6 L43.8 170.4 L47.1 168.3 L40.2 160.3 L75.1 159.1 L70.9 157 L81.1 149.1 L68.1 147.5 L78.4 142.5 L75.3 140.6 L78.4 135.9 L89.5 132.1 L91.6 136.3 L92.4 131.3 L95.2 135.5 L91.9 140.3 L96.9 137.4 L94.7 133.1 L98.3 128.3 L107.8 132.3 L99.4 137.6 Z",
  "M744.5 39 L751.7 43.5 L729.5 50.3 L723.9 58.1 L727.7 51.5 L720.2 47.8 L723.6 45.7 L719.8 41.5 L744.2 38.9 Z",
  "M739.4 27.8 L745.6 32.3 L735.1 36.5 L724.3 29.4 L739 27.7 Z",
  "M803.8 10.3 L855.2 17.3 L838.9 33 L839.9 49.6 L847.3 59.1 L837.7 68.5 L819.4 68.7 L793.5 53.2 L772.7 59.1 L777.8 46.5 L768.3 49.1 L755.3 39.5 L755.9 35 L763.3 34.2 L755 33.1 L758.3 28.6 L753.3 27.3 L754.7 21.9 L803.7 10.1 Z",
  "M549.7 311.8 L568.1 317.2 L575 305 L614.6 313.1 L613.7 323.2 L620.6 333 L618.5 340.9 L604.8 342.5 L610.9 346 L605.4 349.6 L606.5 361 L564.8 377.6 L520 369.7 L514.7 358.5 L493 362 L489.7 367.4 L476.4 361 L470.4 365.3 L459.5 359.3 L458.9 346.1 L467.1 346.1 L471.8 353.5 L478.3 344.7 L491.4 350.1 L526.3 342.1 L532.3 348 L534 343.2 L526.8 329.9 L540.3 323.2 L541.3 317.6 L547.4 319 L549.2 312.8 Z",
  "M568.1 317.2 L557.1 316.8 L527.4 296 L520.3 286.2 L522.2 280.1 L512.6 268.8 L517.5 272 L531.6 266.2 L559.8 253.3 L559.8 248.5 L569.5 255 L578.2 249.6 L582.5 256.1 L603.6 259.9 L600.1 265.9 L609.3 274.7 L617.1 271.8 L615.1 265.6 L632.5 268.9 L629.7 273.4 L635 278.1 L650.6 280.2 L656.4 291.2 L632.2 309.6 L621 309.2 L615.9 316.1 L575 305 L568.2 317.1 Z",
  "M854.6 -275.3 L874.4 -269.7 L878.7 -263.5 L868.5 -256.4 L871.4 -251.4 L860.3 -247.1 L868.5 -245.7 L860.8 -237 L865.9 -227.6 L894.2 -213.7 L873.9 -191.6 L896.5 -158.9 L889.8 -157 L885 -145.8 L890.9 -142.2 L885.9 -136.9 L896.6 -132.6 L894.8 -122.4 L905.9 -117.3 L906.3 -112.4 L893.5 -104 L927.4 -81 L920.4 -69.7 L845.5 -14.2 L820.5 -11.9 L822.5 -18 L817.5 -10.9 L805.1 -11.1 L806.8 -6.7 L801.3 -10.1 L775.8 0.3 L756.1 -1.9 L742.3 5.4 L751.9 -0.6 L747 2.2 L750.2 -1 L742 -4 L746.5 -9.6 L735.2 -5.9 L736.9 -10.9 L709.8 -18.2 L712 -43.1 L716.3 -43 L707.5 -55.7 L710.4 -61.2 L704.5 -68.1 L704.3 -76.7 L716.7 -84 L713.5 -89.7 L730.6 -90.9 L727.4 -96.2 L751.5 -108.2 L777.5 -133.4 L794.9 -134.1 L791.2 -137.9 L796.7 -137.6 L792.9 -143.6 L794.8 -152.1 L780.2 -157.1 L780.6 -163.8 L769.7 -160.8 L760 -172.2 L758.3 -178.8 L766.1 -188.9 L756.8 -198.8 L761 -206 L753.9 -207.4 L758.7 -220.9 L693.2 -251.7 L703.4 -251 L702.8 -255.9 L709 -259.1 L716.6 -257.9 L731.9 -242 L749 -239.7 L765.5 -245.3 L785.8 -238.4 L803.4 -249.7 L807.4 -268.7 L818.1 -275.8 L849 -280.2 L854.3 -275.4 Z",
  "M456.3 481.1 L458.6 496.5 L451.5 517.6 L442.3 512.3 L445.1 508.7 L438.1 501 L441.4 498.6 L437.8 489.3 L453.1 481.2 L454.2 472.2 L456.3 480.9 Z",
  "M309.4 247.5 L311.7 255.1 L322.4 255.9 L325.5 263.2 L343.9 269.9 L343.6 278.4 L358.1 273.1 L359 283.4 L371.9 291.6 L391.8 292.3 L398.5 300.9 L430.3 306.5 L416.6 330 L416.8 344.9 L404.1 347.3 L382.3 383.1 L400.1 377 L399.7 384.8 L405.1 390.8 L400.2 396.5 L407.6 406.2 L396.2 413.6 L404.9 421.4 L401.6 434 L419.3 441.9 L396.6 467.1 L379.5 470.6 L362.4 462.5 L366.6 459.2 L362.4 456.8 L358.3 461.4 L355.2 456.2 L354.3 462.2 L341.5 456.6 L320.9 470.3 L318.3 476.7 L322.9 487.9 L309.4 490.8 L270.6 476.1 L269.7 480.9 L255.2 481 L224.8 471 L225.7 464.9 L217.4 462.2 L224.6 454.4 L229.6 427.1 L233.3 425.7 L228.7 426 L231.1 402.8 L238.3 406.6 L243.9 419.6 L238.8 403.9 L228.9 397.2 L231.6 380.1 L217.3 375.3 L210.2 366 L213.1 360.2 L209.4 354.4 L215.2 353.1 L203.5 353.8 L205.1 347.1 L195 347.3 L197.9 343.4 L188.7 347.9 L180.7 340 L162.5 338.8 L154.8 332.2 L164.2 330.1 L158.3 324 L166.3 325 L154 324 L154.7 317.8 L179.1 314.6 L180.6 310.1 L188.8 309.3 L198.2 319.4 L206.2 314.6 L213.3 319.1 L213 314.3 L226.2 315.5 L214 285.4 L228.4 286.6 L231.6 295.4 L250.5 297.7 L264.4 293 L257 291.3 L259.3 286 L286.4 274.3 L289.9 253.4 L308.9 247.7 Z",
  "M540.1 148.9 L546.3 151 L547.5 159 L534.4 157.4 L537.6 156 L535 151.5 L542.6 153 L537.1 151.1 L540.1 148.8 Z",
  "M488.9 156.1 L491.3 161.2 L484.2 165.2 L485.5 169.7 L498.1 168.9 L521.8 153.5 L530.3 154.9 L518.8 159.5 L532.4 155.6 L541.6 164 L547.2 162 L549.2 171 L559.1 175 L561.5 190.4 L556.4 198.3 L566.8 206.3 L564.6 211.3 L569.4 220.3 L565.9 227.3 L573.9 237.8 L573.7 248.6 L570.2 255 L559.8 248.5 L559.8 253.3 L531.6 266.2 L517.5 272 L512.6 268.8 L522.2 280.1 L520.3 286.2 L525 293.8 L547.7 308.8 L549.4 316.2 L526.8 329.9 L534 343.2 L532.2 348.1 L526.3 342.1 L491.4 350.1 L478.3 344.7 L471.8 353.5 L464.1 344.6 L437.6 338.7 L434.2 341.6 L437.8 344.7 L419.1 346 L415.2 342 L416.6 330 L430.3 306.5 L398.5 300.9 L390.7 292.8 L394.1 283.1 L385.4 276.1 L390.9 265.5 L380.1 248.8 L387.7 239.9 L382.2 227.6 L398.9 224.8 L399.1 219 L405.4 215.6 L397.6 207 L405.4 204.3 L412 186.1 L404.7 184.1 L409.1 176 L425.7 174.7 L427.6 182.1 L432.8 177.4 L436.2 184.6 L440 169.6 L452.8 170.6 L464.5 179.5 L444.7 168.3 L444.3 158.5 L438.3 157.4 L447.2 153 L437.9 142.6 L431.7 146.2 L433.9 137.4 L435.3 141.7 L466.3 144.7 L468.8 151.2 L465.3 154 L488.3 156 Z",
  "M762.9 680 L803.5 685.1 L804.4 691.4 L814.9 686.6 L811.1 694.6 L782 696 L774.2 689.1 L757.2 687.9 L757.6 677.4 L762.7 679.9 Z",
  "M846.5 669.7 L845.1 662.1 L855.7 654 L846.8 669.6 Z",
  "M693.9 600.2 L697.7 609.4 L688.1 606.2 L693 598.1 Z",
  "M754.5 587.4 L769.2 593.1 L771.5 605.1 L778.1 607 L776.7 612.4 L767 600.2 L758.3 599.5 L748 587.6 L741.1 588.2 L750.9 582.3 L754.2 586.9 Z",
  "M816.5 575.7 L819.5 584.1 L810.4 581.3 L814.1 577.7 L804.9 578.2 L816.6 575.4 Z",
  "M679.3 561.3 L682.5 573.1 L673.9 564.5 L678 560.6 Z",
  "M814.8 508.1 L822 517.8 L815.4 521.3 L816.2 529 L810.8 535 L790.2 527.5 L760.1 534.8 L763.3 544.3 L774.4 551 L760.2 545.8 L765.7 556.9 L753.5 547.7 L760.6 557.6 L752.8 555.8 L751.2 549.2 L742.5 544.5 L742.8 537.7 L736 542.3 L736.1 555.2 L752 578.4 L745.9 580.7 L749.4 578.2 L743.4 573.4 L741 577.6 L746.2 582.3 L734.5 587.3 L765.1 603.3 L767.9 617.3 L764.9 620.3 L756.9 609.9 L745 613.2 L755.9 626.7 L748.5 630.8 L738.8 623.3 L749 654.5 L736.9 644.3 L733.8 655.9 L726.7 638.3 L722.1 639.2 L720.9 646.7 L717.1 644 L716.2 627.1 L704.8 613.1 L720.4 601.6 L741.9 612.8 L749.5 606.9 L732 598.7 L705.3 602.7 L696.4 588.9 L705.3 583.3 L698.3 580.2 L696.4 584.7 L681.1 564.1 L685.6 565.3 L689.6 560.7 L687.6 555.7 L695.1 552.8 L703 539.9 L701.8 531.8 L771.4 511.9 L793.2 521 L808.1 518.9 L812.7 515.6 L810.1 508 L814.4 508.1 Z",
  "M623.4 472 L646.8 482.9 L649.5 489 L622.7 471.9 Z",
  "M607.9 375.7 L631.3 393.5 L647.3 395.9 L655.7 391.3 L661.7 402.3 L659.2 406.1 L668.6 410.4 L663.1 410.8 L658.7 420.7 L643.7 412.8 L615.2 409.3 L602 416.7 L591.2 411.9 L590.1 421.9 L598.4 430.6 L598.8 438.9 L622.6 459.5 L631.2 471.4 L628.4 473.7 L614.6 461 L596.5 458.8 L584.1 446.5 L576.9 437.1 L585.7 437.1 L572.3 425.2 L571.1 413.5 L560.1 406.9 L551.2 423 L542.5 403 L561.6 403.1 L566 397.9 L578.2 404.8 L581 395.8 L589.3 393.2 L588.4 382.8 L607.6 375.6 Z",
  "M655.7 391.3 L647.3 395.9 L631.3 393.5 L607.1 374.8 L603.1 365.4 L598.1 364.7 L606.6 360.9 L605.4 349.6 L610.9 346 L605.3 341.7 L618.2 341.4 L622.1 332.6 L633.7 340.4 L652.6 340 L656.4 331.9 L679.5 329.6 L694.9 317.7 L711.5 317.4 L718.7 323.9 L729.1 322 L742.4 334.6 L723.7 346.8 L703.8 382 L671.7 384.1 L656.1 391.4 Z",
  "M1013.3 743.2 L1011.8 766.8 L1004.4 762.6 L999.6 773.5 L999.3 782.5 L1004.5 784.7 L997.7 795.1 L1010.2 793.1 L998 847.6 L984.4 799.5 L990.6 790.7 L1002.1 747.4 L1010.7 747.4 L1012.5 742.5 Z",
  "M513.4 361.1 L520 369.7 L547.2 374.3 L540.1 380.7 L546.2 384 L542.1 388.6 L551.5 399 L536 395.1 L516.9 403.4 L514.1 409.3 L522.1 417.7 L515.9 424.6 L518.5 437.6 L545.1 456.8 L553.5 481.4 L568.9 497.6 L598.8 502.4 L594.3 514.5 L638.5 537.7 L649.3 552.6 L645.7 561.3 L635.3 547.7 L615.4 542.9 L606.1 562 L620.2 572.5 L620.6 584.4 L608.4 588.9 L607.9 599.1 L597.2 613.1 L589.8 613 L587.8 604.8 L593.7 598 L592.2 593.4 L600.5 585.8 L588.5 554.6 L573.2 549.1 L569.7 536.9 L560.2 539.6 L562.9 534.9 L554.8 532.7 L547.1 520.8 L532.6 520.7 L502.6 491.6 L491.5 489.1 L493.2 485.4 L480.6 473.4 L469.5 443.6 L441.5 432.5 L427 447.4 L415.6 450.5 L418.3 439.7 L401.7 434.1 L404.9 421.4 L396.2 413.6 L407.6 406.2 L400.4 393.4 L422.5 391.1 L434.8 376 L435 382.1 L447.6 393.4 L453.1 374.9 L470.9 382.6 L469.2 373.9 L478 373.7 L478.1 364.7 L489.7 367.4 L493.3 361.9 L513.3 360.8 Z",
  "M457.7 523.7 L464.4 540.9 L460.1 548.5 L458.9 579.2 L447.2 575.9 L443.8 586.7 L434.2 584.5 L437.4 559.3 L433.9 558.3 L433.3 541.9 L428.6 539.1 L429.6 530.2 L438.3 532 L451.8 520.7 Z",
  "M585.7 607.3 L576.3 625.6 L581.2 638.6 L576.2 648.6 L524.6 623.4 L519.6 616.8 L521.4 610.8 L538.7 605 L548.3 611.9 L586.4 605.3 Z",
  "M703.6 99 L703.3 87.9 L717.1 67.8 L735.8 62.4 L758.7 84.3 L774.5 76.5 L772.7 59.1 L789.9 53.4 L819.4 68.7 L841.4 68.4 L847.9 74.7 L844.7 85.7 L856.1 103.8 L842.5 116.9 L816.5 119.1 L802.1 107.9 L789.3 105.5 L785.1 98.6 L769.4 103.9 L724.8 99.5 L703.2 109 L703.1 98.4 Z",
  "M821.6 120.1 L842.5 116.9 L853.7 106.5 L881.1 112.3 L882.8 119.8 L904 116.7 L913.3 122.2 L910.9 130.7 L915.5 137.7 L910.2 144.6 L922 160.1 L932.9 164.9 L931.2 172.1 L946.4 174.6 L951.6 184.4 L939.1 192 L923.5 189 L920.6 193.8 L927.3 199.9 L927.4 213.4 L931.6 219.2 L913.7 220.2 L905.6 232.1 L905.3 243 L897.4 236.3 L879.6 239.6 L874.9 232.3 L867.1 238.6 L856.6 231.6 L845.7 237.1 L834 228.9 L803.7 223.9 L774.4 225.4 L756.6 234.9 L758.3 220 L748.2 214.4 L764.7 201.4 L755.4 168.1 L774.2 169.8 L797.3 158.2 L803.9 162.2 L798.9 157.4 L804 142.5 L826 131.1 L818.2 129.4 L821.7 120.5 Z",
  "M787.2 102.9 L821.6 120.1 L818.2 129.4 L826 131 L804 142.5 L798.9 157.4 L803.7 162.4 L797.3 158.2 L774.2 169.8 L755.4 168.1 L754.4 161.8 L738.6 154.5 L741.9 143.8 L736.2 137.6 L706 129.4 L703.2 109 L714.2 102.9 L743.3 99.3 L776 103.6 L784.9 98.6 L787.1 102.6 Z",
  "M622.4 332.6 L613.6 323 L618 311.9 L633.1 309 L650.4 291.8 L663.1 294.4 L669.7 288.9 L676.4 294.3 L676 299.8 L682.4 300.7 L688.5 294.6 L715.3 293.4 L735.3 303.3 L725.6 322.9 L694.9 317.7 L679.5 329.6 L656.4 331.9 L652.2 340 L633.7 340.4 L622.4 332.9 Z",
  "M698.3 530.3 L690.6 513.2 L693 503.5 L704.6 494.4 L730.5 490 L745 506.6 L743.8 517.8 L714.9 531.3 L698.5 530 Z",
  "M346.9 242.7 L350.7 236.7 L362.5 236.5 L366.8 242.7 L379.9 245.8 L376.4 256.7 L388.7 260.5 L391.5 268.8 L378.1 279.1 L379.5 290.3 L371.9 291.6 L359 283.4 L358.1 273.1 L343.6 278.4 L341.2 267.9 L325.5 263.2 L322.3 255.8 L311.7 255.1 L309.4 247.5 L322 241 L346.8 242.6 Z",
  "M383.5 272.7 L394.1 283.2 L390.7 292.8 L382.5 293.1 L377.3 282.4 L383.4 272.7 Z",
  "M648 484.3 L653.2 465.1 L661 465.5 L659.7 456.8 L689 476.8 L681.2 479.1 L682.4 484.4 L677.1 486.9 L673.3 482.8 L665.6 494.8 L667.4 504.2 L647.9 485.5 Z",
  "M335.4 240.4 L345 239.7 L339.4 244 L328.8 243.3 L327 239.6 L334.9 240.3 Z",
  "M378 210.7 L364.8 212.6 L373.9 205.9 L379.4 206.4 L378.4 210.5 Z",
  "M401.5 182.9 L408.7 187.7 L408.7 194.4 L405.3 204.5 L397.6 207 L405.4 215.6 L399.1 219 L398.9 224.8 L382.2 227.6 L387.7 237.1 L380.1 248.7 L384.7 252.3 L383.2 256.7 L375.3 254.5 L379.8 245.7 L366.8 242.7 L362.6 236.5 L348.7 240.1 L328.5 235.2 L346.5 237.5 L333.8 230.3 L344 231 L337.6 227.4 L352.9 209.4 L370.7 215.3 L379.8 209.4 L369.7 192.5 L363.8 195.9 L368.2 202.6 L362.4 204.6 L362.3 211.8 L352.8 209.1 L356.2 195.5 L380.7 183.8 L401.5 182.7 Z",
  "M368.9 -44.2 L360.4 -46.6 L369.5 -52.9 L399.2 -51.9 L364.9 -52.6 L370.3 -56 L364.9 -61.4 L371.6 -55.7 L371.4 -60.7 L390.6 -57.1 L381.8 -62.5 L389.7 -65.8 L394.4 -58.5 L391.2 -65.8 L398.1 -67.9 L405.2 -58 L404.8 -63 L412 -63.2 L388.5 -68 L396.8 -69.4 L388.6 -71.9 L415.7 -69.4 L420.8 -71.4 L413.2 -72.1 L417.1 -74.8 L428.6 -74.7 L403.4 -75.6 L405 -82.4 L425.3 -82.6 L437.2 -73.7 L422.9 -83.5 L427.4 -86.3 L437 -79 L434.4 -82 L439.7 -82.8 L428.9 -86.7 L445.5 -89.1 L435.8 -91.4 L439.4 -94.7 L455.5 -93.7 L450.1 -97.1 L462.1 -100.8 L473.5 -90.6 L470.1 -95.4 L487.5 -95.9 L483.4 -100.1 L499.2 -105.3 L491.4 -107.1 L499.9 -111.3 L497 -114.2 L480.3 -105.7 L489.7 -107.7 L488.1 -103.8 L470.1 -97.3 L463.6 -101.7 L470.2 -104.5 L458.4 -104.7 L472.1 -109.2 L468.5 -113 L482 -120.9 L478.6 -122.9 L486.2 -121.5 L482.1 -123.6 L488.5 -127.8 L494.1 -119.9 L504.9 -127.2 L498.3 -130.5 L515.3 -137.3 L494.6 -131.4 L504.3 -136.1 L495.7 -135.7 L530.6 -147.5 L515.9 -145.2 L524.2 -150.5 L518.3 -156.9 L527.4 -156.6 L522.4 -159.7 L524.8 -164.4 L535.6 -162.5 L525 -168.5 L556.3 -175.6 L532.5 -171.8 L543.3 -175.1 L532.4 -175.6 L535.6 -177.9 L531.3 -181.1 L547.4 -183.4 L536.9 -181.8 L543.3 -184.3 L536.8 -186.5 L553 -188.4 L543.6 -192.4 L565.2 -194.8 L558.8 -196.6 L569.1 -197.7 L565.4 -199.9 L590.2 -199.2 L560.9 -200.9 L575.2 -210.3 L573.1 -207.5 L583.9 -207.6 L588.1 -201.8 L586 -207.7 L593.6 -210 L579.8 -209 L580.8 -214.4 L591.1 -214.7 L570.5 -212.2 L575.2 -216 L569.3 -216.8 L593 -220.1 L580.5 -223.2 L595.2 -229 L606.3 -216.5 L600.2 -222.3 L611 -224.1 L597.9 -229.9 L612.9 -225.9 L602.5 -232.4 L620 -232.4 L624.6 -227.1 L621.3 -232.4 L629.2 -232.1 L624.8 -233.6 L628.6 -236.9 L605.5 -236.3 L616.3 -241.7 L631.5 -240.4 L622 -243.2 L633.9 -243.2 L627 -245.3 L634.9 -246.7 L626.1 -247.4 L641.5 -254.2 L638.2 -257.8 L643.8 -263.5 L659.7 -257.9 L648 -262.5 L656.5 -265.3 L668.9 -256.3 L658.7 -267.3 L675.7 -272.5 L670.8 -261.1 L674 -261.9 L686.8 -277.1 L689.9 -274.2 L686.8 -263.2 L679.4 -257.1 L690.8 -266 L699 -263.6 L691.2 -267.5 L692.9 -271.1 L703.7 -276.3 L699.9 -273.6 L703.1 -271.8 L708.7 -278.3 L725.4 -270.4 L719.1 -278.7 L725.5 -280.9 L706.5 -283.4 L713.1 -286.2 L743.9 -283.4 L729.5 -278.9 L751.3 -276.1 L756 -278.4 L748.4 -280.2 L758.7 -289.4 L773.5 -290.4 L769.3 -293.6 L773.7 -296.9 L781.5 -295.1 L771.2 -299.4 L779.5 -299.3 L780 -304.8 L807 -301.8 L788.8 -291.7 L793 -288.9 L786 -280.2 L792.2 -280.3 L819.6 -303.5 L824.1 -302.7 L815.8 -295.6 L822.4 -295.5 L820.4 -287.5 L841.8 -300.1 L832.7 -303.1 L834.8 -306.2 L855.5 -307.8 L862.1 -303.4 L843.6 -294.6 L857.3 -297.6 L847.9 -291.1 L858.2 -291.8 L851.9 -279.5 L869.2 -302.2 L879.7 -296.2 L889 -298.1 L887 -294.8 L895.8 -297.5 L901 -294.3 L893.7 -292.6 L906 -292.8 L916.6 -285.8 L895.6 -279.7 L863.7 -282.3 L886.6 -276.9 L880.1 -273.8 L888 -275.1 L882.7 -268.2 L897.6 -269.1 L899.9 -274.5 L900.8 -268.6 L903.6 -272.6 L913.7 -269.2 L910.6 -264.7 L895.4 -268.2 L895.7 -264 L878.9 -258.8 L874.5 -251 L867.7 -254.2 L878.7 -263.3 L874.6 -269.6 L842.5 -279.8 L808 -269.5 L803.4 -249.7 L785.8 -238.4 L765.5 -245.3 L749 -239.7 L731.9 -242 L716.6 -257.9 L709 -259.1 L702.8 -255.9 L703.4 -251 L682.9 -251.2 L688.3 -244.1 L679.5 -231.6 L640.2 -236.3 L641.6 -226.8 L635.8 -220.7 L622.8 -224.7 L611.2 -219.4 L597.6 -205.9 L603.3 -194.9 L582.2 -180 L584.4 -174.6 L563.9 -170.3 L566.7 -161.9 L563.7 -147.6 L546 -127.3 L555.7 -124.2 L552.9 -111.6 L525.1 -110.2 L509.3 -90.9 L514.2 -83.8 L511.6 -71.9 L516.9 -62.8 L513.3 -48 L528.9 -37.8 L524.2 -29.4 L515.1 -27.8 L523.5 -12.3 L520.5 -1.8 L506.7 4.3 L502.6 30.4 L484.4 21.7 L480 7.5 L482.6 2.7 L478.1 4.4 L479 13.2 L472.8 7.6 L479.1 19.1 L473 26.7 L458.3 24.6 L461.6 28.2 L430 52.3 L395.7 53.6 L399 48.6 L383.2 45 L371.4 34.9 L373.5 26.9 L386.6 32.4 L385.5 29 L396.2 26.3 L383.7 30.6 L380.1 25.8 L392.9 19 L382.9 18.6 L393 12.4 L372.6 20.1 L365.5 13.7 L389.5 4.4 L376.6 4.6 L387.3 -8.2 L396.6 -11.4 L394.1 -2.1 L396.9 -10.4 L406.6 -13.7 L387.7 -11.5 L377.6 0.4 L373.3 -4.2 L377.3 -10.7 L370.4 -3.6 L364.7 -9.6 L367.9 -14.6 L376.6 -12.6 L376.6 -19.3 L367.3 -15.4 L360.2 -22.2 L370.9 -17.4 L366.7 -21.5 L373.1 -24.2 L363.1 -23.1 L362.2 -29.2 L395.5 -32 L406.7 -23.9 L404.3 -30.4 L413.4 -32.8 L410.7 -36 L416.5 -41.1 L410.2 -32.2 L395.1 -33.7 L397.9 -38.9 L393.6 -31.4 L370.2 -29.7 L360.7 -35 L375.2 -37.8 L360.6 -39.2 L378.8 -40.4 L365.7 -41.6 L368.6 -44.3 Z",
  "M656.4 291.2 L650.6 280.2 L631 274.8 L632.4 268.9 L614.7 265.6 L617.1 271.8 L609.4 274.8 L600.1 266 L605.3 261.9 L603 259.4 L582.5 256.1 L578.2 249.6 L570.8 253.7 L575.3 242.5 L565.9 227.3 L569.4 220.3 L564.6 211.3 L566.8 206.4 L556.4 198.3 L561.5 190.4 L559.1 175 L566.3 171.8 L558 168.6 L639 143.5 L654.8 148.2 L646.9 146 L654.4 156.4 L673.4 154 L665 159 L676.5 154.5 L744.5 155.9 L755 162.8 L764.5 194.1 L764.4 202.6 L748.2 214.4 L758.3 220 L756.2 233.5 L769 253.9 L765 255.1 L768.3 260.4 L765.9 266.3 L759.7 267.3 L737.8 289.8 L742.3 305.5 L715.3 293.4 L688.5 294.6 L682.4 300.7 L676 299.8 L676.4 294.3 L669.7 288.9 L658.9 292.2 Z",
  "M80.8 503.5 L115 501.3 L116.2 508.9 L123.7 511.7 L107.8 527.3 L110.7 541 L105.8 550.3 L109.1 555 L106 564.6 L95.1 564.7 L107.3 582.6 L100.7 591.6 L99.6 598.6 L107.8 605.3 L95.2 623.5 L97.6 633.7 L64 638.2 L70.8 599.6 L59.9 599.5 L57.9 592.5 L65.5 589.8 L64.2 584.8 L61.3 591.3 L53.3 589.3 L71 536.5 L66.4 504.3 L80.8 495.8 L80.5 502.7 Z",
  "M696.3 384 L705.9 380.7 L729.2 341 L747.8 330.4 L777.8 334.6 L785.5 341.3 L825.7 326.4 L856 370.4 L852.5 400.5 L865.8 410.6 L884.9 406 L885.4 420.8 L869.5 418.2 L867.6 426.2 L872.2 425.5 L867.1 427.3 L870.8 427.3 L864.6 435.8 L863.5 451.5 L830.6 440.4 L796.1 454.9 L746 449.9 L741.3 447.5 L745.5 442.1 L733.2 431.9 L738.6 427.6 L732.7 424.6 L726.1 431.1 L710.5 422.6 L713.1 412.5 L698 403.4 L697.9 395.4 L686.4 385.7 L696.3 384.1 Z",
  "M853.6 365.2 L829.8 329 L822 326.2 L845.9 320.8 L875.5 333.8 L876.3 348.8 L884.7 352 L884.5 362.6 L892.6 366.3 L891.5 374.2 L896.4 377.5 L872.2 375.6 L871.7 388.7 L855.6 404.2 L852.5 400.5 L856.4 376.8 L853.6 365.3 Z",
  "M547.2 374.3 L564.8 377.6 L600.7 364.5 L608.7 375.7 L602 374.1 L588.4 382.8 L589.3 393.2 L581 395.8 L578.2 404.8 L566 397.9 L561.9 403.1 L546.9 404.3 L544.5 402.3 L551.5 399 L542.1 388.6 L546.2 384 L540.1 380.6 L547.2 374.4 Z",
  "M324.4 562.9 L329 565 L320.4 576 L306.1 566.3 L318.9 558 L324.3 562.9 Z",
  "M346.2 556.6 L346.6 560.9 L336.7 557.7 L336.9 554 L345.6 555.7 Z",
  "M88.2 451.1 L105.4 458.6 L130.8 454.2 L159.3 461.2 L217.3 461.3 L225.7 464.9 L224.8 471 L243.6 478.4 L269.7 480.9 L270.6 476.1 L284.2 480.1 L286.3 487.7 L309.4 490.8 L320.1 486.8 L325.9 491.1 L317.9 507.8 L270.3 533 L274.5 535.6 L266.8 539.7 L248.5 569.2 L251.4 582.5 L259.9 590.1 L244.4 602.1 L237 619 L240.1 622 L220.3 628.5 L210 646.4 L161.7 646.6 L135.9 666.5 L126.6 661.3 L115.3 638.3 L97.9 633.9 L95.2 623.5 L107.8 605.3 L99.6 598.6 L107.2 581.8 L95.1 564.7 L106 564.6 L109.1 555 L105.8 550.3 L110.7 541 L107.8 527.3 L123.7 511.7 L116.2 508.9 L115 501.3 L82.1 505.3 L80.8 495.8 L66.6 503.4 L66 496.9 L72.8 490.2 L66.6 493 L71.1 488.1 L65.8 487 L69.8 480.5 L63.1 485.4 L65.7 478 L57.6 474.4 L60.2 467.1 L78.1 461 L88.2 451 Z",
  "M613.5 88.1 L606.1 104.7 L604.1 96.4 L616.5 74.9 L619.7 74.4 L613.6 88 Z",
  "M642.7 85.8 L640.7 68.9 L653.7 57.7 L660.3 60.4 L655.5 63.8 L653.4 76.6 L642.9 85.7 Z",
  "M719.3 -238.1 L740.9 -233 L758.9 -220.6 L753.9 -207.4 L761 -206 L756.8 -198.8 L766.1 -188.9 L758.8 -175.3 L769.5 -161.5 L746.4 -158.3 L737.1 -164 L737.4 -159.8 L730.4 -161.9 L732 -153.8 L718.4 -159 L727.6 -154 L712.2 -149.6 L716.1 -145.7 L707.7 -148.3 L715.3 -142.8 L702.9 -134 L714.6 -123.3 L697.4 -107.5 L674.6 -95.3 L668.7 -98.6 L661 -88.3 L657.2 -90.9 L644.5 -83.3 L650.6 -82.1 L642.7 -77.2 L631.8 -83.1 L639.3 -72.3 L624 -69.1 L631 -62 L624.5 -54 L627.6 -45.4 L620 -47.8 L622.8 -46.8 L619.1 -44.5 L620.2 -26.3 L625 -17.2 L637.2 -16.6 L651.2 -6.6 L646.7 -5.8 L655.7 -2.7 L661.1 3.1 L656.7 5.6 L661.2 7.2 L640.2 18.5 L633.3 16.7 L629.7 5.4 L626.5 9 L630.2 7.5 L632.6 15.5 L625.2 9.6 L625.7 14.7 L596.2 14 L613.6 14.2 L625 20.9 L647.5 15.7 L652.1 19.1 L644.2 19.1 L644.9 24.1 L636.1 31.7 L631.1 23.1 L630.3 30.5 L624.5 34.7 L599.9 38.1 L615.7 42.1 L604.5 42.4 L613.3 50 L608.8 55.9 L612.1 58.8 L606.3 56 L610.7 62.8 L604.7 58.5 L610.9 63.7 L610.5 70.3 L592.9 108.5 L568 106.6 L569.5 110.3 L557.8 115.8 L561.1 124 L557.3 128.2 L538.1 129.4 L531.5 127.8 L533.2 119.6 L520.2 102.8 L527.9 104.6 L523.9 99.7 L529.8 98.4 L529.5 93.4 L508.9 72.2 L503.6 59.8 L508.2 49.7 L494.4 45.9 L491.6 29.2 L496.1 25 L502.6 30.4 L506.7 4.3 L520.8 -2.1 L523.5 -13.3 L515.1 -27.8 L524.2 -29.4 L528.9 -37.8 L513.3 -48 L516.9 -62.8 L511.6 -71.9 L514.2 -83.8 L509.3 -90.9 L525.1 -110.2 L552.9 -111.6 L555.7 -124.2 L546 -127.3 L563.7 -147.6 L566.7 -161.9 L563.9 -170.3 L584.4 -174.6 L582.2 -180 L603.3 -194.9 L597.6 -205.9 L611.2 -219.4 L622.8 -224.7 L635.8 -220.7 L641.6 -226.8 L640.2 -236.3 L679.7 -231.7 L688.3 -244.1 L682.9 -251.2 L698.9 -250.3 L718.6 -238.2 Z",
  "M419.1 346 L437.8 344.7 L434.2 341.6 L437.6 338.7 L452.4 342.7 L460.7 348.5 L456.9 359.5 L470.4 365.3 L476.6 361.1 L478.2 373.3 L470.6 371.9 L469.8 382.8 L453 375 L446.8 393.6 L435 382.1 L434.8 376 L422.5 391.1 L406.5 392.2 L399.7 384.8 L399.8 376.8 L382.3 383.1 L404.1 347.3 L418.2 345.8 Z",
  "M1002.1 501.1 L1010.8 510.1 L1022.4 508.6 L1030.4 521 L1038.5 517.9 L1071.5 530.3 L1094.1 524.7 L1109.1 530.1 L1139 513.2 L1166.8 511.7 L1184.5 529.8 L1184.2 552.5 L1198.9 554.9 L1208.6 564.4 L1204.4 561.7 L1200.3 571.5 L1192.2 572.6 L1198 600.3 L1201.8 601.5 L1196.3 613.9 L1204.6 618.7 L1208.2 634.7 L1198.2 639.7 L1194 630.1 L1165.8 628.2 L1161.2 634.7 L1152.8 630.8 L1122.8 635.6 L1090 648.2 L1069 641.3 L1050.7 648.5 L1035.3 643.5 L1036 660 L1029.6 660.7 L1024.9 671.7 L1016.7 658.4 L1025.9 648.7 L1021.7 640.9 L1007.2 651.7 L992.8 644.3 L978.5 659 L953.4 666 L936.5 651.5 L915.9 643.1 L906.9 643 L902.3 661 L886.7 663.4 L875.4 656.9 L873.5 647.7 L860.7 642.2 L850.7 651.3 L853.5 644.4 L837.9 647.8 L858.1 637.8 L835.3 639.9 L842.5 632.4 L833.9 629.1 L835.5 612.3 L814.4 603.8 L819.4 599.4 L816.4 592.7 L823 602.6 L833.3 598.7 L824.1 593.2 L831.2 586.8 L822.2 576 L828.5 567.4 L810 570.1 L812.2 556.1 L823.6 544.9 L846.2 546.9 L845.9 540.8 L851.6 542.1 L850 545.6 L873.5 545.4 L867.6 541 L871.8 537.9 L892.3 535.2 L875.1 530.2 L875.9 521.5 L919.8 525.3 L942.2 507.7 L964.6 499.4 L1002.2 500.8 Z",
  "M838.2 499.8 L851.3 500.5 L855.2 512.7 L874.3 521 L873.5 525.5 L840.6 528.2 L811.9 554.2 L813.1 546.5 L826.1 539.3 L810 538.3 L816.2 529 L815.4 521.3 L822 517.8 L815.9 505.9 L830.7 497.6 L838.1 499.7 Z",
  "M120.1 132.3 L134.3 144.3 L129.6 149.9 L136.7 147.8 L139.8 153.2 L138.1 156.6 L134.1 150.7 L137 158.8 L126.7 165.8 L114.5 165.6 L105.8 155.1 L99.4 163.5 L81.5 153.8 L90.4 150.2 L86.7 147.2 L94.6 145.5 L99.4 137.6 L119.7 132.2 Z",
  "M132.3 97 L133.7 101.3 L120.8 103.8 L127.6 97.5 L120.9 94.4 L132 96.9 Z",
  "M124.6 67.6 L125 74.8 L135.2 76.2 L128.1 82.6 L110.9 70.9 L120.3 64.3 L124.6 67.4 Z",
  "M123.3 45.7 L120.7 49 L124 49.8 L114.5 53.3 L120.1 54.7 L114.4 57.9 L113.1 54 L113.6 58.9 L107.1 63.2 L103.7 60.1 L110 58.3 L103.7 51.8 L124.1 43.9 Z",
  "M167 188.2 L197.8 184.8 L189.2 179.1 L195.5 160.5 L186.7 163.9 L178 152.4 L183.4 142.1 L191 139.7 L179.3 139.1 L171 145.4 L161.8 141.4 L162 147.9 L152.1 142.5 L150.2 148.6 L145.2 138.9 L157.2 125.1 L150.7 119.5 L151.5 112.9 L160 113.3 L152.6 108 L149.4 114.8 L142.5 115.3 L148.3 104.7 L139.8 110.9 L138 128.8 L132.4 130.6 L136.7 102.1 L146.6 97 L140.5 97.8 L146.4 88.4 L134.5 97.4 L127.5 93.4 L137.2 91.8 L122.7 91.4 L134.8 87.1 L129.3 86.4 L137.9 83.4 L133.5 80.2 L140.4 80.4 L135.1 78.8 L140.3 77 L136.2 74.2 L139.4 71.7 L131.5 73.2 L131.1 67.4 L138.1 68.5 L131.7 65.6 L131.6 60.5 L146.7 59.7 L139.2 53.4 L143 53.3 L140.6 48.3 L147.4 48.2 L148.8 38.2 L154.1 43.3 L191.2 37.7 L188.9 45.3 L169.9 59.2 L161.9 58.2 L175 59.5 L161.4 66.6 L168.5 64.9 L165.4 69.7 L184.3 63.2 L215.7 66.1 L217.6 70.6 L201.5 95 L185.6 101.2 L193.9 98.6 L200.4 103.7 L176.1 110.3 L198.8 109.5 L211.1 114.8 L220.6 122.8 L227.7 145.5 L253.7 163.6 L250.7 166.3 L257.8 178.8 L240 175 L249 174.6 L260.3 183.3 L262.6 191.8 L255.3 197.8 L282.6 196.5 L292.5 205 L288.9 220.1 L280 221.6 L281.4 227.5 L270.2 230 L275.5 233.2 L263.5 237.5 L284.8 239.2 L284.9 245.7 L276.1 251.9 L260.5 257.3 L230.8 254.3 L203.5 262.7 L193.1 257.4 L181.7 261.4 L177.1 271.7 L154 269.1 L144.7 279 L134.1 273.5 L153.6 261.3 L159.1 249.6 L167.7 244.1 L190.9 244.3 L204.7 229 L184.1 239.5 L173.6 232.8 L165 235 L168.6 231.2 L143.7 229.7 L146.8 228.4 L143.8 224.5 L167.4 212.9 L167.4 196.8 L154 200.3 L166 188.7 Z",
  "M227.7 -13.6 L233.3 -12.3 L228.3 4.1 L227.8 -6.7 L219.3 -7.9 L227.2 -9.9 L221 -13.2 L227.9 -17 Z",
  "M966.3 212.3 L975.3 212.2 L987.7 227.5 L980.8 231.8 L986.9 242.7 L1007.9 248.8 L1012.9 267.5 L1024.2 266 L1034.9 271.9 L1052.3 265.6 L1064.3 280.5 L1070.4 275.7 L1089 281.1 L1102.1 290.2 L1109.4 288.9 L1110.2 296.5 L1100 304.9 L1108 309 L1099.1 316.2 L1106.4 325.1 L1101.3 338.1 L1082 337.2 L1071.1 344.4 L1066.7 359.5 L1054.5 358.7 L1019.3 370.8 L1000.2 386.8 L1007.4 379.3 L1004.2 376.6 L990.7 389.3 L987.3 388.5 L990.3 383.7 L971.7 382.8 L981.8 390.6 L992.2 390.5 L988.5 395.4 L999.7 399.1 L1002.7 407.6 L1007.3 407.4 L994.4 385.9 L1010.1 408.6 L1034.8 406.2 L1030.6 414.8 L1011.1 413.4 L1001.9 422.4 L972.8 433.6 L965.2 428.3 L969.2 427.1 L969.2 413.8 L946.4 405.7 L973.9 390.9 L970.2 384.5 L947 386.8 L931.7 381 L937.2 377.5 L925.8 372.7 L943.8 376.1 L949.9 371.1 L936.6 371.4 L930.8 354.1 L935.6 363.2 L934.1 371 L925 371.4 L927.5 366.5 L911.3 373.7 L899 392.3 L888.2 399.5 L885.8 393.9 L887.4 410.7 L879.2 404.5 L865.8 410.6 L855.6 403.9 L862.2 402.3 L871.7 388.7 L871.7 376 L896.4 377.5 L891.5 374.2 L892.6 366.3 L884.5 362.6 L884.7 352 L876.3 348.8 L875.4 333.7 L841.4 320.3 L785.5 341.3 L777.8 334.6 L748.3 330.3 L742.5 334.6 L726.6 321.9 L735.4 303.2 L742.3 305.5 L737.9 289.7 L768.3 262 L765 255.5 L769 253.9 L759.2 242 L758.5 232.3 L765.7 233.6 L774.4 225.4 L803.7 223.9 L834 228.9 L845.7 237.1 L856.6 231.6 L867.1 238.6 L874.9 232.3 L879.6 239.6 L897.4 236.3 L905.3 243 L905.6 232.1 L914 220 L938.8 221 L944.6 212.9 L966.3 212.3 Z",
  "M682.4 484.4 L680.4 479.9 L688.3 475.4 L664.4 458 L670.4 453.3 L664.6 444.1 L672.8 443.1 L661.8 434.6 L667.5 419.7 L659.7 419.3 L663.1 410.8 L668.6 410.4 L659.2 406.1 L661.7 402.3 L655.7 391.3 L685.1 384.7 L697.9 395.4 L698 403.4 L713.1 412.5 L710.6 422.8 L726.1 431.1 L732.7 424.6 L739.6 428.8 L733.2 431 L738.1 437.1 L731.2 449.3 L744.8 466.9 L732.8 477.2 L734.5 488.9 L704.6 494.4 L694.3 504 L692 494 L682.9 485.1 Z",
  "M709.9 130.9 L741.3 141.8 L740.1 156.6 L676.5 154.5 L689.5 147.8 L678.1 148.9 L680.2 140.1 L689.7 140.4 L700.9 130.9 L692.1 139.8 L704 141.8 L709.9 130.9 Z",
  "M1043 -108.3 L1273.8 268.5 L1265.8 266.1 L1261.8 276.9 L1253.8 281.6 L1251 296.1 L1256.7 301.6 L1244.7 321.7 L1257.9 325.8 L1258.2 338.3 L1263.5 342 L1264.6 337.7 L1280.9 341.5 L1298.5 367.3 L1288.1 368 L1288.5 373.2 L1304.4 381.6 L1290.8 385.6 L1291.8 393.6 L1288.6 389.8 L1273 398.4 L1267.1 395.3 L1268.9 401.3 L1263.4 396 L1267.4 401.2 L1256.9 422.7 L1248.5 429.9 L1262.8 443.7 L1264 458.3 L1270.2 448.1 L1265.2 471.7 L1289 504.6 L1271.6 522.3 L1261.2 518.9 L1250.2 503.8 L1226.5 494.3 L1227.7 485.7 L1211.2 478.8 L1186.9 483.3 L1187.9 479.2 L1167.2 467.3 L1140.2 466 L1121 457.1 L1109.1 456.3 L1106.4 461.7 L1080 436.9 L1034.5 413.1 L1041.7 409 L1035.4 407.6 L1039 404.5 L1044.2 410.1 L1058.2 408.4 L1055.1 399.2 L1062.6 388.2 L1075.8 387.9 L1058.1 370.4 L1076.1 370.8 L1071.8 369 L1073.7 365.1 L1091 360.8 L1090.4 353.8 L1068.8 358.1 L1068.6 351.7 L1082 337.2 L1102.1 337.3 L1106.4 325.1 L1099.1 316.2 L1108 309 L1099.9 305.3 L1109.9 298.6 L1109.4 288.9 L1102.1 290.2 L1070.4 275.7 L1064.3 280.5 L1052.3 265.6 L1034.9 271.9 L1024.2 266 L1012.9 267.5 L1007.9 248.8 L986.9 242.7 L980.8 231.8 L987.8 227.8 L975.1 212.1 L944.6 212.9 L941 220 L931.6 219.2 L927.4 213.4 L927.3 199.9 L920.6 193.8 L924.2 188.6 L940.9 191.5 L951.9 181.6 L945.8 174.3 L931.2 172.1 L932.9 164.9 L922 160.1 L910.2 144.6 L915.5 137.7 L910.9 130.7 L913.2 122 L898.8 115.2 L882.8 119.8 L881.1 112.3 L855 107.4 L849.8 88.2 L844.7 85.7 L848.1 74.9 L837.5 68.1 L847.3 59.2 L839.9 49.6 L838.8 33.7 L854.7 19.2 L851.2 6.7 L859 9.4 L861.7 4 L868.9 6 L876.3 -0.2 L898.9 0.9 L863.9 -10.7 L860.5 -15.5 L866 -12.6 L862.8 -16.8 L865.7 -20.4 L847 -15.2 L920.4 -69.7 L927.4 -81 L893.5 -104 L906.3 -112.4 L905.9 -117.3 L894.8 -122.4 L896.6 -132.6 L885.9 -136.9 L890.9 -142.2 L885 -145.8 L889.8 -157 L896.5 -158.9 L873.9 -191.6 L894.2 -213.7 L865.9 -227.6 L860.8 -237 L868.5 -245.7 L860.6 -247.6 L875.1 -251.3 L878.9 -258.8 L895.7 -264 L895.8 -268.4 L912 -264.9 L911.8 -272 L931.8 -269 L930.4 -273.3 L938.4 -272 L936.9 -276.7 L960.2 -270.2 L954.8 -266.2 L938.5 -268.8 L946.8 -264.2 L940.4 -261.8 L968.5 -261.7 L962.5 -257.6 L968.8 -255.3 L957.9 -248.7 L971.1 -259 L1017.8 -255.5 L1127.5 -214.3 L1130.1 -201.3 L1136 -197.9 L1132.3 -189.9 L1107.9 -174.4 L1076.8 -168.1 L988.7 -181.5 L950.4 -197.8 L933.1 -198.7 L964.2 -184.7 L954.7 -182.8 L968.7 -181.6 L956.3 -181.1 L972.9 -178.6 L964.1 -175.4 L980.9 -173.6 L996.8 -163.9 L999.2 -158.8 L993.4 -161.2 L993.2 -151.4 L986.8 -149.4 L998.6 -134.4 L995.5 -126.3 L1042.1 -108.4 Z",
];

window.MapInfoPanel = function MapInfoPanel({ entity, type, onClose }) {
  if (!entity) {
    return (
      <div style={{ padding: "32px 28px", border: "1px solid var(--rule-strong)", background: "var(--paper)", minHeight: 200, display: "flex", alignItems: "center" }}>
        <p className="body-sm" style={{ color: "var(--muted)", margin: 0 }}>
          {type === "partners" ? "Select a country marker to view consortium partners." : "Select a demonstration site on the map to view details."}
        </p>
      </div>
    );
  }

  if (type === "partners" && entity.partners) {
    return (
      <div style={{ padding: "28px", border: "1px solid var(--rule-strong)", background: "var(--paper)" }}>
        <div style={{ display: "flex", justifyContent: "space-between", alignItems: "start", gap: 16, marginBottom: 20 }}>
          <div>
            <div className="caption">{entity.country.toUpperCase()}</div>
            <h3 className="display-sm" style={{ margin: "8px 0 0" }}>{entity.partners.length} partner{entity.partners.length > 1 ? "s" : ""}</h3>
          </div>
          {onClose && (
            <button type="button" onClick={onClose} aria-label="Close" style={{ background: "transparent", border: "1px solid var(--rule)", padding: "6px 10px", cursor: "pointer", fontFamily: "var(--mono)", fontSize: 10 }}>CLOSE</button>
          )}
        </div>
        <div style={{ display: "grid", gap: 16 }}>
          {entity.partners.map(function (p) {
            return (
              <div key={p.id} style={{ paddingBottom: 16, borderBottom: "1px solid var(--rule)" }}>
                <div className="display-sm" style={{ fontSize: 18, marginBottom: 6 }}>{p.name}</div>
                <div className="body-sm" style={{ color: "var(--muted)" }}>{p.role} · {p.shortName}</div>
                <div style={{ marginTop: 10, fontFamily: "var(--mono)", fontSize: 11, letterSpacing: "0.06em", color: "var(--teal-deep)" }}>
                  MAIN CONTACT · {p.pi}
                </div>
              </div>
            );
          })}
        </div>
      </div>
    );
  }

  return (
    <div style={{ padding: "28px", border: "1px solid var(--rule-strong)", background: "var(--paper)" }}>
      <div style={{ display: "flex", justifyContent: "space-between", alignItems: "start", gap: 16, marginBottom: 16 }}>
        <div>
          <div className="caption">{entity.country.toUpperCase()} · {entity.region}</div>
          <h3 className="display-sm" style={{ margin: "8px 0 0" }}>{entity.name}</h3>
        </div>
        {onClose && (
          <button type="button" onClick={onClose} aria-label="Close" style={{ background: "transparent", border: "1px solid var(--rule)", padding: "6px 10px", cursor: "pointer", fontFamily: "var(--mono)", fontSize: 10 }}>CLOSE</button>
        )}
      </div>
      <p className="body-sm" style={{ color: "var(--muted)", margin: "0 0 20px" }}>{entity.summary}</p>
      <div style={{ display: "flex", gap: 8, flexWrap: "wrap", marginBottom: 16 }}>
        {entity.focus.map(function (f) {
          return (
            <span key={f} style={{ fontFamily: "var(--mono)", fontSize: 10, letterSpacing: "0.08em", textTransform: "uppercase", padding: "4px 8px", border: "1px solid var(--rule)", color: "var(--muted)" }}>{f}</span>
          );
        })}
      </div>
      <div className="body-sm" style={{ color: "var(--ink)" }}><strong>Lead partners:</strong> {entity.lead}</div>
    </div>
  );
};

window.EuropeMap = function EuropeMap({
  highlightSites = true,
  highlightPartners = false,
  mode = "sites",
  selectedId = null,
  onSelect,
  onSiteClick,
  compact = false,
  showInfoPanel = false,
  infoPanelBelow = false,
}) {
  const sites = HP_DATA.sites;
  const partnerPoints = typeof HP_partnerMapPoints === "function" ? HP_partnerMapPoints() : [];
  const [hover, setHover] = useStateMap(null);
  const showSites = mode === "sites" || mode === "both";
  const showPartners = mode === "partners" || mode === "both" || highlightPartners;

  function handleSiteClick(site) {
    if (onSelect) onSelect(site.id, site);
    else if (onSiteClick) onSiteClick(site);
  }

  function handlePartnerClick(point) {
    if (onSelect) onSelect(point.id, point);
  }

  var selectedSite = selectedId && showSites ? sites.find(function (s) { return s.id === selectedId; }) : null;
  var selectedPartner = selectedId && showPartners ? partnerPoints.find(function (p) { return p.id === selectedId; }) : null;
  var panelEntity = selectedSite || selectedPartner;
  var panelType = selectedPartner ? "partners" : "sites";

  var mapBlock = (
    <div style={{ position: "relative", width: "100%", aspectRatio: compact ? "16/10" : "4/3", background: "var(--ink)", overflow: "hidden" }}>
      <svg width="100%" height="100%" viewBox="0 0 1000 750" preserveAspectRatio="xMidYMid slice" style={{ position: "absolute", inset: 0 }}>
        <defs>
          <pattern id="grid" width="40" height="40" patternUnits="userSpaceOnUse">
            <path d="M 40 0 L 0 0 0 40" fill="none" stroke="rgba(250,247,240,0.04)" strokeWidth="1"/>
          </pattern>
          <radialGradient id="glow" cx="50%" cy="50%" r="50%">
            <stop offset="0%" stopColor="var(--teal)" stopOpacity="0.35"/>
            <stop offset="100%" stopColor="var(--teal)" stopOpacity="0"/>
          </radialGradient>
        </defs>
        <rect width="1000" height="750" fill="url(#grid)"/>
        <rect width="1000" height="750" fill="url(#glow)"/>

        {/* Recognizable Europe landmass — subtle lighter fill so markers pop. */}
        <g fill="rgba(250,247,240,0.085)" stroke="rgba(250,247,240,0.32)" strokeWidth="0.9" strokeLinejoin="round" strokeLinecap="round">
          {HP_EUROPE_PATHS.map(function (d, i) {
            return <path key={"land-" + i} d={d}/>;
          })}
        </g>

        {/* Subtle accent strokes hinting at major river systems / coastlines. */}
        <g stroke="var(--teal)" strokeOpacity="0.30" strokeWidth="1.1" fill="none" strokeLinecap="round">
          <path d="M 430 375 Q 470 410 520 405 Q 600 430 640 483"/>
          <path d="M 470 70 Q 520 150 560 240 Q 600 330 660 410"/>
          <path d="M 175 550 Q 130 560 86 569"/>
          <path d="M 660 222 Q 700 320 723 410"/>
        </g>

        {/* Madeira inset — an Atlantic island far SW of the mainland, framed so
            its demonstration-site marker is never lost off-canvas. */}
        {showSites && highlightSites && (
          <g>
            <rect x={HP_MADEIRA_INSET.x} y={HP_MADEIRA_INSET.y} width={HP_MADEIRA_INSET.w} height={HP_MADEIRA_INSET.h}
              fill="rgba(250,247,240,0.04)" stroke="rgba(250,247,240,0.28)" strokeWidth="1" strokeDasharray="4 4"/>
            <text x={HP_MADEIRA_INSET.x + 10} y={HP_MADEIRA_INSET.y + 18} fill="rgba(250,247,240,0.6)" fontFamily="var(--mono)" fontSize="9" letterSpacing="0.1em">MADEIRA</text>
            <text x={HP_MADEIRA_INSET.x + 10} y={HP_MADEIRA_INSET.y + 31} fill="rgba(250,247,240,0.35)" fontFamily="var(--mono)" fontSize="8" letterSpacing="0.06em">ATLANTIC · PT</text>
            {/* tiny island glyph inside the inset */}
            <path d={"M " + (HP_MADEIRA_INSET.x + 44) + " " + (HP_MADEIRA_INSET.y + 58) + " q 12 -6 26 -2 q 8 4 0 8 q -16 5 -27 1 q -6 -4 1 -7 Z"}
              fill="rgba(250,247,240,0.10)" stroke="rgba(250,247,240,0.30)" strokeWidth="1"/>
          </g>
        )}

        {showPartners && partnerPoints.map(function (p) {
          var pos = hpPartnerXY(p);
          var cx = pos.x;
          var cy = pos.y;
          var active = hover === p.id || selectedId === p.id;
          return (
            <g key={p.id}
              role="button"
              tabIndex={0}
              aria-label={"Partners in " + p.country}
              style={{ cursor: "pointer" }}
              onMouseEnter={function () { setHover(p.id); }}
              onMouseLeave={function () { setHover(null); }}
              onClick={function () { handlePartnerClick(p); }}
              onKeyDown={function (e) { if (e.key === "Enter" || e.key === " ") { e.preventDefault(); handlePartnerClick(p); } }}
            >
              <circle cx={cx} cy={cy} r={active ? 16 : 12} fill="rgba(250,247,240,0.15)" stroke="rgba(250,247,240,0.55)" strokeWidth={active ? 2 : 1}/>
              <circle cx={cx} cy={cy} r={active ? 5 : 3.5} fill={active ? "var(--paper)" : "rgba(250,247,240,0.75)"}/>
              {active && !showInfoPanel && (
                <g>
                  <line x1={cx} y1={cy - 10} x2={cx} y2={cy - 40} stroke="rgba(250,247,240,0.5)" strokeWidth="1"/>
                  <rect x={cx - 80} y={cy - 72} width="160" height="28" fill="var(--paper)" stroke="var(--rule-strong)"/>
                  <text x={cx} y={cy - 54} textAnchor="middle" fill="var(--ink)" fontFamily="var(--display)" fontSize="12">{p.country}</text>
                </g>
              )}
            </g>
          );
        })}

        {showSites && highlightSites && sites.map(function (s) {
          var pos = hpSiteXY(s);
          var cx = pos.x;
          var cy = pos.y;
          var active = hover === s.id || selectedId === s.id;
          return (
            <g key={s.id}
              role="button"
              tabIndex={0}
              aria-label={s.name}
              style={{ cursor: "pointer" }}
              onMouseEnter={function () { setHover(s.id); }}
              onMouseLeave={function () { setHover(null); }}
              onClick={function () { handleSiteClick(s); }}
              onKeyDown={function (e) { if (e.key === "Enter" || e.key === " ") { e.preventDefault(); handleSiteClick(s); } }}
            >
              <circle cx={cx} cy={cy} r={active ? 24 : 18} fill="var(--teal)" fillOpacity="0.25"/>
              <circle cx={cx} cy={cy} r={active ? 10 : 7} fill="var(--paper)" stroke="var(--teal)" strokeWidth="2"/>
              {active && !showInfoPanel && (
                <g>
                  <line x1={cx} y1={cy - 14} x2={cx} y2={cy - 46} stroke="rgba(250,247,240,0.5)" strokeWidth="1"/>
                  <rect x={cx - 100} y={cy - 82} width="200" height="34" fill="var(--paper)" stroke="var(--rule-strong)"/>
                  <text x={cx} y={cy - 65} textAnchor="middle" fill="var(--ink)" fontFamily="var(--display)" fontSize="13">{s.name}</text>
                  <text x={cx} y={cy - 52} textAnchor="middle" fill="var(--muted)" fontFamily="var(--mono)" fontSize="9" letterSpacing="0.08em">{s.country.toUpperCase()}</text>
                </g>
              )}
            </g>
          );
        })}

        <g transform="translate(60, 640)" fontFamily="var(--mono)" fontSize="10" fill="rgba(250,247,240,0.6)" letterSpacing="0.1em">
          {showSites && (
            <g>
              <circle cx="0" cy="0" r="3.5" fill="var(--paper)" stroke="var(--teal)" strokeWidth="1.5"/>
              <text x="12" y="3">DEMONSTRATION SITE</text>
            </g>
          )}
          {showPartners && (
            <g transform={showSites ? "translate(0, 22)" : ""}>
              <circle cx="0" cy="0" r="1.5" fill="rgba(250,247,240,0.75)"/>
              <text x="12" y="3">PARTNER INSTITUTION</text>
            </g>
          )}
        </g>
        <g transform="translate(910, 40)" fontFamily="var(--mono)" fontSize="9" fill="rgba(250,247,240,0.4)" letterSpacing="0.12em">
          <text textAnchor="end" x="80">N 60°</text>
          <text textAnchor="end" x="80" y="14">W 12° — E 35°</text>
        </g>
      </svg>
    </div>
  );

  if (!showInfoPanel) return mapBlock;

  if (infoPanelBelow) {
    return (
      <div>
        {mapBlock}
        <div style={{ marginTop: 24 }}>
          <MapInfoPanel entity={panelEntity} type={panelType} onClose={function () { if (onSelect) onSelect(null, null); }}/>
        </div>
      </div>
    );
  }

  return (
    <div style={{ display: "grid", gridTemplateColumns: "1.4fr 1fr", gap: 24, alignItems: "start" }} className="hp-map-split">
      {mapBlock}
      <MapInfoPanel entity={panelEntity} type={panelType} onClose={function () { if (onSelect) onSelect(null, null); }}/>
      <style>{`@media (max-width: 900px) { .hp-map-split { grid-template-columns: 1fr !important; } }`}</style>
    </div>
  );
};
