{"id":36898,"date":"2026-08-27T17:21:49","date_gmt":"2026-08-27T17:21:49","guid":{"rendered":"https:\/\/volatusaerospace.com\/?page_id=36898"},"modified":"2026-09-08T10:18:15","modified_gmt":"2026-09-08T10:18:15","slug":"wildfires","status":"publish","type":"page","link":"https:\/\/volatusaerospace.com\/fr-ca\/services\/emergency-and-disaster-response\/wildfires\/","title":{"rendered":"R\u00e9ponse aux incendies de for\u00eat et intelligence a\u00e9rienne | Surveillance autonome"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"36898\" class=\"elementor elementor-36898\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-b679b54 e-con-full e-flex e-con e-parent\" data-id=\"b679b54\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-a1d9b42 elementor-widget__width-initial elementor-absolute elementor-widget elementor-widget-html\" data-id=\"a1d9b42\" data-element_type=\"widget\" data-e-type=\"widget\" data-settings=\"{&quot;_position&quot;:&quot;absolute&quot;}\" data-widget_type=\"html.default\">\n\t\t\t\t\t<!--\r\n\r\n  ============================================================\r\n\r\n  CANADA WILDFIRE HOTSPOT HERO \u2014 ELEMENTOR \"HTML\" WIDGET\r\n\r\n  ============================================================\r\n\r\n  HOW TO USE\r\n\r\n  1. In Elementor, add an \"HTML\" widget (Pro) to a Section.\r\n\r\n  2. Paste this ENTIRE block (link tags, div, style, script) into\r\n\r\n     the widget's code box.\r\n\r\n  3. Section settings: Content Width = Full Width (or Boxed, your\r\n\r\n     call), Height = Min Height, set Min Height to 100vh (or\r\n\r\n     whatever your header offset needs). You do NOT need to set\r\n\r\n     the Section's overflow to hidden \u2014 the widget clips itself.\r\n\r\n  4. Drop your real Elementor Heading \/ Button widgets into the\r\n\r\n     SAME section, after this HTML widget, and set their Advanced\r\n\r\n     > Position to \"Absolute\" (or use a nested flex column) so\r\n\r\n     they sit on top of the animation. A `.vhero-left-slot` div is\r\n\r\n     included below purely as a visual guide for where left-aligned\r\n\r\n     copy should live \u2014 delete it once your real widgets are in\r\n\r\n     place, it renders nothing on its own.\r\n\r\n  WHAT CHANGED FROM THE STANDALONE VERSION (and why)\r\n\r\n  - Removed <!DOCTYPE>\/<html>\/<head>\/<body> \u2014 a widget can't own\r\n\r\n    the document shell.\r\n\r\n  - Removed the global `* { margin:0; padding:0; box-sizing:border-box }`\r\n\r\n    and `html, body { overflow:hidden; height:100% }` resets. Those\r\n\r\n    would have nuked spacing on every element on the page and\r\n\r\n    blocked scrolling of the rest of the site. All resets are now\r\n\r\n    scoped under `.vhero-wildfire-canada`.\r\n\r\n  - Renamed every class (`.hero`, `.corner`, `.tooltip-title`, \u2026)\r\n\r\n    to a `vhero-` prefix so it can't collide with your theme's or\r\n\r\n    another widget's CSS. Removed the `id` attributes entirely\r\n\r\n    (canada-svg, tooltip, tt-title, \u2026) so you can duplicate this\r\n\r\n    widget on the same page without invalid duplicate IDs \u2014 the\r\n\r\n    script scopes everything per-instance instead.\r\n\r\n  - `--gold` etc. CSS variables moved off `:root` and onto the\r\n\r\n    widget's own class, so they don't leak into the rest of the\r\n\r\n    site's custom properties.\r\n\r\n  - Swapped the `document.write()` CDN fallback for D3 (which\r\n\r\n    would wipe the page if it ran after load, which it will inside\r\n\r\n    an Elementor-rendered widget) for a proper async script loader.\r\n\r\n  - Canvas + hotspot sizing now reads the WIDGET's own bounding box\r\n\r\n    via ResizeObserver instead of `window.innerWidth\/innerHeight`,\r\n\r\n    so it's correct even if the hero isn't pinned to the very top\r\n\r\n    of the page (e.g. below a sticky header) or the section isn't\r\n\r\n    exactly viewport-sized.\r\n\r\n  - Tooltip position is now computed relative to the widget's own\r\n\r\n    rect instead of raw `clientX\/clientY`, which was quietly wrong\r\n\r\n    any time the hero wasn't flush against the top-left of the\r\n\r\n    viewport.\r\n\r\n  - Added an IntersectionObserver so the render loop pauses when\r\n\r\n    the hero scrolls out of view \u2014 same pause-when-offscreen \/\r\n\r\n    ResizeObserver hardening pattern as your other Volatus\r\n\r\n    Elementor widgets.\r\n\r\n  - The whole thing is wrapped so multiple copies of this widget\r\n\r\n    can exist on one page (or get re-rendered by the Elementor\r\n\r\n    editor) without clobbering each other.\r\n\r\n-->\r\n\r\n<link rel=\"preconnect\" href=\"https:\/\/fonts.googleapis.com\" \/>\r\n\r\n<link rel=\"preconnect\" href=\"https:\/\/fonts.gstatic.com\" crossorigin \/>\r\n\r\n<link href=\"https:\/\/fonts.googleapis.com\/css2?family=DM+Sans:wght@400;500;700&family=JetBrains+Mono:wght@400;500;700;800&family=Montserrat:wght@400;600;700;800;900&display=swap\" rel=\"stylesheet\" \/>\r\n\r\n<!--\r\n\r\n  Fonts: these <link> tags will still fetch and apply correctly even\r\n\r\n  outside <head> (every modern browser handles this fine), but for\r\n\r\n  best preload performance move them into your theme's <head> or\r\n\r\n  Elementor's Custom Code (Header) area if you want to squeeze out\r\n\r\n  the last bit of load time. Not required for the widget to work.\r\n\r\n-->\r\n\r\n<div class=\"vhero-wildfire-canada\">\r\n\r\n  <!-- Background: Canada map GeoJSON, right-aligned -->\r\n\r\n  <div class=\"vhero-bg\">\r\n\r\n    <div class=\"vhero-canada-wrap\">\r\n\r\n      <svg class=\"vhero-canada-svg\" viewBox=\"0 0 1200 800\" preserveAspectRatio=\"xMidYMid meet\">\r\n\r\n        <g class=\"vhero-graticule-layer\"><\/g>\r\n\r\n        <g class=\"vhero-radar-rings\"><\/g>\r\n\r\n        <g class=\"vhero-provinces-layer\"><\/g>\r\n\r\n        <g class=\"vhero-hotspot-hitboxes\"><\/g>\r\n\r\n      <\/svg>\r\n\r\n    <\/div>\r\n\r\n  <\/div>\r\n\r\n  <!-- Single canvas: embers + radar sweep + hotspot pings -->\r\n\r\n  <canvas class=\"vhero-fx-canvas\"><\/canvas>\r\n\r\n  <!-- Tooltip HUD -->\r\n\r\n  <div class=\"vhero-tooltip\">\r\n\r\n    <div class=\"vhero-tooltip-title vhero-tt-title\">SECTOR<\/div>\r\n\r\n    <div class=\"vhero-tooltip-row\"><span>CLASSIFICATION:<\/span><span class=\"val vhero-tt-type\">-<\/span><\/div>\r\n\r\n    <div class=\"vhero-tooltip-row\"><span>HAZARD \/ FWI:<\/span><span class=\"val alert vhero-tt-status\">-<\/span><\/div>\r\n\r\n  <\/div>\r\n\r\n  <!-- Content layer -->\r\n\r\n  <div class=\"vhero-content\">\r\n\r\n    <div class=\"vhero-left-slot\">\r\n\r\n      <!-- Delete this comment and drop your real Elementor Heading \/\r\n\r\n           Button widgets here (as absolutely-positioned siblings in\r\n\r\n           the same Section) \u2014 your headline, subtext, and CTA go\r\n\r\n           on top of the animation, roughly in this left-hand zone. -->\r\n\r\n    <\/div>\r\n\r\n    <div class=\"vhero-bottom-hud\">\r\n\r\n      <div class=\"vhero-hud-item\">\r\n\r\n        <span class=\"vhero-hud-label\">ACTIVE WILDFIRE HOTSPOTS<\/span>\r\n\r\n        <span class=\"vhero-hud-val\">\r\n\r\n          <span class=\"vhero-live-dot\"><\/span>\r\n\r\n          <span class=\"vhero-detected-count\">00 ACTIVE<\/span>\r\n\r\n        <\/span>\r\n\r\n      <\/div>\r\n\r\n    <\/div>\r\n\r\n  <\/div>\r\n\r\n<\/div>\r\n\r\n<style>\r\n\/* ============================================================\r\n   1. DESKTOP CONTROLS (Screens > 1024px)\r\n   ============================================================ *\/\r\n.vhero-wildfire-canada {\r\n  \/* Desktop Zoom Multiplier (1.30 = 30% bigger) *\/\r\n  --vhero-map-scale: 1.05;\r\n\r\n  \/* Desktop Position Shift: positive moves RIGHT \/ DOWN *\/\r\n  --vhero-map-shift-x: 8vw;\r\n  --vhero-map-shift-y: 0px;\r\n\r\n  \/* Desktop Map Container Dimensions (Expanded) *\/\r\n  --vhero-map-width: min(65vw, 1100px);\r\n  --vhero-map-height: min(88vh, 850px);\r\n  --vhero-map-right-padding: 0vw;\r\n\r\n\/* ============================================================\r\n   2. MOBILE & TABLET CONTROLS (Screens <= 1024px)\r\n   ============================================================ *\/\r\n  \/* Overall Hero Section Height on Mobile (default: 80vh) *\/\r\n  --vhero-mobile-hero-height: 90vh;\r\n\r\n  \/* Mobile Dynamic Width (fills mobile screen width) *\/\r\n  --vhero-mobile-map-width: 98vw;\r\n\r\n  \/* Mobile Dynamic Map Height *\/\r\n  --vhero-mobile-map-height: 48vh;\r\n\r\n  \/* Mobile Zoom Multiplier (1.20 = 20% bigger on mobile) *\/\r\n  --vhero-mobile-map-scale: 1.20;\r\n\r\n  \/* Mobile Shift Adjustments (positive = right \/ down) *\/\r\n  --vhero-mobile-map-shift-x: 0px;\r\n  --vhero-mobile-map-shift-y: 25px; \/* Shifted down to clear Contact button *\/\r\n\r\n  \/* Mobile Bottom Clearance (distance above bottom edge) *\/\r\n  --vhero-mobile-map-bottom: 10px;\r\n\r\n  \/* Color Palette *\/\r\n  --vhero-gold: #FFB601;\r\n  --vhero-gold-soft: #FFC933;\r\n  --vhero-black: #060608;\r\n  --vhero-light: #E8E8E8;\r\n  --vhero-med: #909090;\r\n  --vhero-dark: #2a2a2e;\r\n  --vhero-ember: #FF4500;\r\n\r\n  position: relative;\r\n  isolation: isolate;\r\n  width: 100%;\r\n  height: 100vh;\r\n  overflow: hidden;\r\n  background:\r\n    radial-gradient(ellipse 65% 55% at 75% 50%, rgba(255,182,1,0.06) 0%, transparent 65%),\r\n    linear-gradient(180deg, #070709 0%, #0d0d12 100%);\r\n  color: var(--vhero-light);\r\n  font-family: 'DM Sans', sans-serif;\r\n  -webkit-font-smoothing: antialiased;\r\n}\r\n\r\n.vhero-wildfire-canada,\r\n.vhero-wildfire-canada *,\r\n.vhero-wildfire-canada *::before,\r\n.vhero-wildfire-canada *::after {\r\n  box-sizing: border-box;\r\n  margin: 0;\r\n  padding: 0;\r\n}\r\n\r\n\/* Atmospheric left darkening for text contrast *\/\r\n.vhero-wildfire-canada::before {\r\n  content: \"\";\r\n  position: absolute;\r\n  inset: 0;\r\n  background: linear-gradient(90deg,\r\n    rgba(8,8,10,0.96) 0%,\r\n    rgba(8,8,10,0.85) 35%,\r\n    rgba(8,8,10,0.4) 65%,\r\n    rgba(8,8,10,0.15) 100%);\r\n  z-index: 2;\r\n  pointer-events: none;\r\n}\r\n\r\n.vhero-bg {\r\n  position: absolute;\r\n  inset: 0;\r\n  z-index: 1;\r\n  display: flex;\r\n  align-items: center;\r\n  justify-content: flex-end;\r\n  padding-right: var(--vhero-map-right-padding, 0vw);\r\n}\r\n\r\n.vhero-canada-wrap {\r\n  position: relative;\r\n  width: var(--vhero-map-width, min(65vw, 1100px));\r\n  height: var(--vhero-map-height, min(88vh, 850px));\r\n  transform: translate(var(--vhero-map-shift-x, 0px), var(--vhero-map-shift-y, 0px)) scale(var(--vhero-map-scale, 1));\r\n  transform-origin: center right;\r\n}\r\n\r\n.vhero-canada-svg {\r\n\r\n  width: 100%;\r\n\r\n  height: 100%;\r\n\r\n  display: block;\r\n\r\n}\r\n\r\n.vhero-province-path {\r\n\r\n  fill: rgba(255, 182, 1, 0.03);\r\n\r\n  stroke: rgba(255, 182, 1, 0.42);\r\n\r\n  stroke-width: 0.85;\r\n\r\n  stroke-linejoin: round;\r\n\r\n  stroke-linecap: round;\r\n\r\n  transition: fill 0.25s ease, stroke 0.25s ease;\r\n\r\n  cursor: pointer;\r\n\r\n  pointer-events: visiblePainted;\r\n\r\n}\r\n\r\n.vhero-province-path:hover {\r\n\r\n  fill: rgba(255, 182, 1, 0.12);\r\n\r\n  stroke: var(--vhero-gold);\r\n\r\n  stroke-width: 1.3;\r\n\r\n}\r\n\r\n.vhero-geo-graticule {\r\n\r\n  stroke: rgba(255, 182, 1, 0.05);\r\n\r\n  stroke-width: 0.5;\r\n\r\n  fill: none;\r\n\r\n}\r\n\r\n.vhero-radar-ring {\r\n\r\n  fill: none;\r\n\r\n  stroke: rgba(255, 182, 1, 0.07);\r\n\r\n  stroke-width: 0.6;\r\n\r\n  stroke-dasharray: 4 4;\r\n\r\n}\r\n\r\n.vhero-fx-canvas {\r\n\r\n  position: absolute;\r\n\r\n  inset: 0;\r\n\r\n  z-index: 4;\r\n\r\n  pointer-events: none;\r\n\r\n}\r\n\r\n.vhero-tooltip {\r\n\r\n  position: absolute;\r\n\r\n  z-index: 30;\r\n\r\n  background: rgba(10, 10, 14, 0.95);\r\n\r\n  border: 1px solid var(--vhero-gold);\r\n\r\n  padding: 10px 14px;\r\n\r\n  font-family: 'JetBrains Mono', monospace;\r\n\r\n  font-size: 9.5px;\r\n\r\n  color: var(--vhero-light);\r\n\r\n  pointer-events: none;\r\n\r\n  opacity: 0;\r\n\r\n  transition: opacity 0.15s ease;\r\n\r\n  backdrop-filter: blur(6px);\r\n\r\n  box-shadow: 0 10px 25px rgba(0,0,0,0.7);\r\n\r\n  min-width: 180px;\r\n\r\n}\r\n\r\n.vhero-tooltip-title {\r\n\r\n  color: var(--vhero-gold);\r\n\r\n  font-weight: 700;\r\n\r\n  font-size: 11px;\r\n\r\n  letter-spacing: 1.5px;\r\n\r\n  margin-bottom: 4px;\r\n\r\n  border-bottom: 1px solid rgba(255,182,1,0.2);\r\n\r\n  padding-bottom: 3px;\r\n\r\n}\r\n\r\n.vhero-tooltip-row {\r\n\r\n  display: flex;\r\n\r\n  justify-content: space-between;\r\n\r\n  margin-top: 3px;\r\n\r\n  color: var(--vhero-med);\r\n\r\n}\r\n\r\n.vhero-tooltip-row .val { color: var(--vhero-light); font-weight: 600; }\r\n\r\n.vhero-tooltip-row .val.alert { color: #FF4500; font-weight: 700; }\r\n\r\n.vhero-content {\r\n\r\n  position: relative;\r\n\r\n  z-index: 6;\r\n\r\n  width: 100%;\r\n\r\n  height: 100%;\r\n\r\n  display: flex;\r\n\r\n  flex-direction: column;\r\n\r\n  justify-content: space-between;\r\n\r\n  padding: 32px 48px;\r\n\r\n  pointer-events: none;\r\n\r\n}\r\n\r\n.vhero-left-slot {\r\n\r\n  width: clamp(380px, 42vw, 640px);\r\n\r\n  max-width: 50%;\r\n\r\n  pointer-events: auto;\r\n\r\n  display: flex;\r\n\r\n  flex-direction: column;\r\n\r\n  gap: 20px;\r\n\r\n  margin-top: auto;\r\n\r\n  margin-bottom: auto;\r\n\r\n}\r\n\r\n.vhero-bottom-hud {\r\n\r\n  display: flex;\r\n\r\n  justify-content: flex-end;\r\n\r\n  align-items: flex-end;\r\n\r\n  font-family: 'JetBrains Mono', monospace;\r\n\r\n  font-size: 9.5px;\r\n\r\n  letter-spacing: 2px;\r\n\r\n}\r\n\r\n.vhero-hud-item {\r\n  display: flex;\r\n  flex-direction: column;\r\n  gap: 3px;\r\n  align-items: flex-end;\r\n  background: rgba(12, 12, 16, 0.75);\r\n  border: 1px solid rgba(255, 182, 1, 0.25);\r\n  padding: 5px 10px;\r\n  backdrop-filter: blur(6px);\r\n}\r\n\r\n.vhero-hud-label {\r\n  color: var(--vhero-med);\r\n  font-size: 7.5px;\r\n  letter-spacing: 1.5px;\r\n}\r\n\r\n.vhero-hud-val {\r\n  color: #FF4500;\r\n  font-size: 10px;\r\n  letter-spacing: 1.2px;\r\n  font-weight: 700;\r\n  display: flex;\r\n  align-items: center;\r\n  gap: 6px;\r\n}\r\n\r\n.vhero-live-dot {\r\n\r\n  width: 6px;\r\n\r\n  height: 6px;\r\n\r\n  background: #FF4500;\r\n\r\n  border-radius: 50%;\r\n\r\n  box-shadow: 0 0 8px #FF4500;\r\n\r\n  animation: vhero-live-pulse 2s infinite;\r\n\r\n}\r\n\r\n@keyframes vhero-live-pulse {\r\n\r\n  0%, 100% { box-shadow: 0 0 0 0 rgba(255,69,0,0.8); }\r\n\r\n  50% { box-shadow: 0 0 0 6px rgba(255,69,0,0); }\r\n\r\n}\r\n\r\n@media (max-width: 1024px) {\r\n  \/* Mobile Hero Section Height *\/\r\n  .vhero-wildfire-canada {\r\n    height: var(--vhero-mobile-hero-height, 80vh);\r\n  }\r\n\r\n  \/* Position map lower down on mobile *\/\r\n  .vhero-wildfire-canada .vhero-bg {\r\n    align-items: flex-end;\r\n    justify-content: center;\r\n    padding-right: 0;\r\n    padding-bottom: var(--vhero-mobile-map-bottom, 12px);\r\n    z-index: 1;\r\n  }\r\n\r\n  \/* Dynamic responsive map sizing for mobile sitting in lower canvas *\/\r\n  .vhero-wildfire-canada .vhero-canada-wrap {\r\n    width: var(--vhero-mobile-map-width, 92vw);\r\n    height: var(--vhero-mobile-map-height, 42vh);\r\n    max-height: 480px;\r\n    transform: translate(var(--vhero-mobile-map-shift-x, 0px), var(--vhero-mobile-map-shift-y, 20px)) scale(var(--vhero-mobile-map-scale, 1.0));\r\n    transform-origin: center bottom;\r\n    opacity: 0.95;\r\n  }\r\n\r\n  \/* Vertical atmospheric gradient for mobile so top text is crystal clear *\/\r\n  .vhero-wildfire-canada::before {\r\n    background: linear-gradient(180deg,\r\n      rgba(8,8,10,0.96) 0%,\r\n      rgba(8,8,10,0.85) 42%,\r\n      rgba(8,8,10,0.3) 72%,\r\n      rgba(8,8,10,0.1) 100%);\r\n  }\r\n\r\n  .vhero-wildfire-canada .vhero-content {\r\n    padding: 20px 16px 14px 16px;\r\n  }\r\n\r\n  .vhero-wildfire-canada .vhero-left-slot {\r\n    width: 100%;\r\n    max-width: 100%;\r\n    margin-top: 0;\r\n    margin-bottom: auto;\r\n  }\r\n\r\n  .vhero-wildfire-canada .vhero-bottom-hud {\r\n    justify-content: flex-start;\r\n  }\r\n\r\n  \/* Reduced text size & compact padding for Active Hotspots element on mobile *\/\r\n  .vhero-wildfire-canada .vhero-hud-item {\r\n    align-items: flex-start;\r\n    padding: 4px 8px;\r\n    gap: 2px;\r\n  }\r\n\r\n  .vhero-wildfire-canada .vhero-hud-label {\r\n    font-size: 6.5px;\r\n    letter-spacing: 1.2px;\r\n  }\r\n\r\n  .vhero-wildfire-canada .vhero-hud-val {\r\n    font-size: 9px;\r\n    letter-spacing: 1px;\r\n    gap: 5px;\r\n  }\r\n\r\n  .vhero-wildfire-canada .vhero-live-dot {\r\n    width: 4.5px;\r\n    height: 4.5px;\r\n  }\r\n}\r\n<\/style>\r\n\r\n<script>\r\n\r\n(function () {\r\n\r\n  'use strict';\r\n\r\n  var SVG_WIDTH = 1200;\r\n\r\n  var SVG_HEIGHT = 800;\r\n\r\n  \/* ============================================================\r\n\r\n     Shared geodata \u2014 defined once, reused by every instance of\r\n\r\n     this widget on the page.\r\n\r\n     ============================================================ *\/\r\n\r\n  var vheroCanadaGeoJSON = {\"type\":\"FeatureCollection\",\"features\":[{\"type\":\"Feature\",\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[-78.019,62.592],[-77.867,62.589],[-77.838,62.557],[-78.103,62.559],[-78.108,62.583],[-78.019,62.592]]],[[[-69.183,59.129],[-69.199,59.067],[-69.133,59.055],[-69.221,58.992],[-69.223,58.953],[-69.29,58.977],[-69.356,58.95],[-69.278,59.067],[-69.357,59.14],[-69.275,59.155],[-69.183,59.129]]],[[[-79.496,56.767],[-79.486,56.658],[-79.524,56.667],[-79.567,56.615],[-79.584,56.653],[-79.549,56.681],[-79.552,56.732],[-79.59,56.768],[-79.582,56.807],[-79.496,56.767]]],[[[-78.9,56.319],[-79.211,55.856],[-78.983,56.39],[-79.283,55.864],[-79.151,56.233],[-79.493,55.859],[-79.786,55.789],[-79.513,56.135],[-80.025,55.901],[-79.457,56.553],[-79.61,56.132],[-79.427,56.203],[-79.269,56.625],[-78.9,56.319]]],[[[-79.556,56.499],[-79.701,56.306],[-79.986,56.2],[-80.11,56.198],[-80.044,56.311],[-79.869,56.332],[-79.877,56.379],[-79.699,56.369],[-79.614,56.432],[-79.585,56.499],[-79.543,56.528],[-79.556,56.499]]],[[[-78.661,56.415],[-78.676,56.181],[-78.933,56.116],[-78.917,56.172],[-78.825,56.263],[-78.846,56.277],[-78.809,56.339],[-78.832,56.351],[-78.732,56.441],[-78.667,56.44],[-78.661,56.415]]],[[[-79.009,56.064],[-78.957,56.084],[-78.949,56.037],[-79.003,56.013],[-78.934,56.02],[-79.003,55.98],[-79.054,55.866],[-79.136,55.789],[-79.031,55.969],[-79.009,56.064]]],[[[-63.492,49.841],[-61.662,49.144],[-62.243,49.062],[-63.583,49.387],[-64.514,49.864],[-63.492,49.841]]],[[[-61.408,47.641],[-61.381,47.62],[-61.493,47.552],[-61.549,47.554],[-61.471,47.617],[-61.542,47.617],[-61.69,47.535],[-61.712,47.518],[-61.856,47.417],[-61.777,47.432],[-61.675,47.535],[-61.594,47.555],[-61.701,47.492],[-61.764,47.397],[-61.83,47.402],[-61.86,47.352],[-61.933,47.333],[-61.958,47.262],[-61.908,47.273],[-61.819,47.233],[-61.783,47.261],[-61.799,47.233],[-61.859,47.218],[-62.01,47.221],[-61.928,47.407],[-61.536,47.632],[-61.408,47.641]]],[[[-70.814,46.998],[-70.904,46.914],[-71.13,46.856],[-70.897,47.013],[-70.836,47.028],[-70.814,46.998]]],[[[-57.104,51.413],[-58.628,51.276],[-59.015,50.749],[-59.099,50.879],[-60.134,50.204],[-66.442,50.269],[-67.151,49.807],[-67.386,49.322],[-68.444,49.192],[-69.684,48.138],[-71.071,48.44],[-69.73,48.109],[-71.299,46.742],[-70.541,47.002],[-68.823,48.364],[-66.639,49.121],[-64.942,49.214],[-64.236,48.91],[-64.158,48.756],[-64.558,48.88],[-64.16,48.623],[-65.27,48.013],[-65.893,48.219],[-67.364,47.841],[-68.373,47.925],[-68.38,47.559],[-69.04,47.297],[-69.231,47.453],[-69.985,46.691],[-70.635,45.392],[-71.447,45.236],[-71.506,45.013],[-74.736,44.993],[-74.325,45.201],[-74.397,45.564],[-76.338,45.456],[-77.555,46.152],[-78.704,46.337],[-79.576,47.442],[-79.538,50.959],[-79.33,50.758],[-79.551,51.553],[-79.24,51.635],[-78.845,51.164],[-78.689,51.484],[-79.033,51.776],[-78.406,52.238],[-78.763,52.564],[-78.687,52.88],[-78.983,53.024],[-79.11,53.502],[-78.916,53.561],[-79.151,53.705],[-78.901,53.815],[-79.287,54.082],[-79.049,54.183],[-79.38,54.194],[-79.761,54.658],[-77.76,55.288],[-76.658,56.061],[-76.519,56.406],[-76.806,57.669],[-77.444,58.188],[-78.569,58.614],[-78.571,58.961],[-77.685,59.393],[-77.913,59.415],[-77.774,59.71],[-77.314,59.565],[-77.542,59.689],[-77.294,59.794],[-77.427,59.915],[-76.759,60.159],[-77.631,60.065],[-77.406,60.13],[-77.741,60.424],[-77.413,60.544],[-77.834,60.639],[-77.512,60.836],[-78.191,60.789],[-77.694,61.203],[-77.793,61.454],[-77.475,61.542],[-78.006,61.733],[-78.156,62.278],[-77.418,62.59],[-75.646,62.292],[-75.895,62.159],[-75.322,62.311],[-74.556,62.105],[-74.726,62.245],[-73.679,62.48],[-72.627,62.116],[-72.794,61.835],[-72.206,61.863],[-71.99,61.676],[-72.303,61.567],[-71.572,61.606],[-71.888,61.431],[-71.585,61.407],[-71.823,61.373],[-71.578,61.155],[-70.146,61.085],[-69.927,60.808],[-69.514,61.069],[-69.369,60.811],[-69.826,60.526],[-69.625,60.068],[-71.031,60.062],[-69.563,59.868],[-69.758,59.32],[-69.235,59.239],[-69.54,59.166],[-69.344,59.091],[-69.548,58.808],[-69.869,59.053],[-69.798,58.829],[-70.25,58.77],[-69.813,58.589],[-69.13,58.902],[-68.356,58.774],[-68.194,58.541],[-68.344,58.127],[-69.369,57.765],[-68.404,58.04],[-68.003,58.576],[-67.856,58.315],[-68.128,58.074],[-67.732,58.462],[-67.71,57.923],[-67.481,58.274],[-66.619,58.488],[-66.465,58.82],[-65.936,58.605],[-66.066,58.32],[-65.829,58.573],[-66.104,58.774],[-65.798,58.847],[-65.881,59.011],[-65.317,59.041],[-65.715,59.148],[-65.571,59.378],[-65.357,59.277],[-65.542,59.49],[-64.983,59.376],[-65.544,59.736],[-64.984,59.763],[-65.232,59.886],[-64.955,60.256],[-64.535,60.303],[-64.854,60.262],[-64.599,60.111],[-64.906,60.048],[-64.654,59.93],[-64.827,59.531],[-64.34,59.496],[-64.535,59.197],[-64.291,59.017],[-64.879,58.927],[-63.481,58.749],[-64.051,58.676],[-63.819,58.471],[-64.432,58.086],[-63.596,57.734],[-63.871,56.878],[-64.129,56.71],[-63.871,56.439],[-64.137,56.304],[-63.877,56.217],[-64.02,56.076],[-63.445,56.023],[-63.715,55.859],[-63.096,55.35],[-63.519,55.184],[-63.669,54.612],[-65.69,54.713],[-66.779,55.339],[-66.699,54.742],[-67.428,55.071],[-67.036,54.622],[-67.601,54.566],[-67.485,54.234],[-67.782,54.064],[-67.492,53.604],[-66.91,53.34],[-67.067,52.699],[-66.346,52.974],[-66.439,52.201],[-65.109,52.171],[-64.588,51.829],[-64.581,51.558],[-64.116,52.151],[-64.173,52.851],[-63.693,53.114],[-63.378,52.651],[-64.082,52.471],[-63.751,52.0],[-57.101,52],[-57.104,51.413]]]]},\"properties\":{\"name\":\"Quebec\"}},{\"type\":\"Feature\",\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[-55.883,53.486],[-55.729,53.45],[-55.795,53.458],[-55.774,53.414],[-55.817,53.418],[-55.801,53.392],[-55.972,53.446],[-55.883,53.486]]],[[[-55.467,50.784],[-55.557,50.701],[-55.653,50.727],[-55.619,50.791],[-55.589,50.772],[-55.463,50.806],[-55.467,50.784]]],[[[-54.081,49.736],[-53.982,49.649],[-54.258,49.567],[-54.293,49.581],[-54.303,49.67],[-54.255,49.672],[-54.283,49.717],[-54.215,49.721],[-54.192,49.675],[-54.148,49.747],[-54.081,49.736]]],[[[-54.53,49.634],[-54.577,49.559],[-54.727,49.528],[-54.739,49.49],[-54.872,49.487],[-54.807,49.517],[-54.884,49.546],[-54.892,49.591],[-54.793,49.603],[-54.788,49.558],[-54.744,49.545],[-54.627,49.633],[-54.621,49.603],[-54.536,49.664],[-54.53,49.634]]],[[[-53.564,48.191],[-53.51,48.198],[-53.513,48.145],[-53.553,48.107],[-53.531,48.098],[-53.634,48.075],[-53.856,48.098],[-53.936,48.182],[-53.906,48.21],[-53.851,48.161],[-53.765,48.175],[-53.69,48.147],[-53.564,48.191]]],[[[-55.928,47.677],[-55.93,47.639],[-55.876,47.612],[-55.902,47.602],[-56.114,47.645],[-55.928,47.677]]],[[[-54.125,47.641],[-54.243,47.399],[-54.364,47.407],[-54.262,47.475],[-54.206,47.546],[-54.24,47.558],[-54.173,47.621],[-54.172,47.586],[-54.135,47.668],[-54.125,47.641]]],[[[-64.632,60.357],[-64.79,60.391],[-64.867,60.45],[-64.856,60.474],[-64.64,60.485],[-64.526,60.413],[-64.532,60.374],[-64.471,60.406],[-64.427,60.401],[-64.428,60.373],[-64.478,60.334],[-64.424,60.282],[-64.632,60.357]]],[[[-64.535,60.303],[-64.759,60.231],[-64.377,60.161],[-64.827,59.986],[-64.174,60.028],[-64.255,59.757],[-63.924,59.654],[-64.122,59.52],[-63.722,59.514],[-64.062,59.382],[-63.38,59.284],[-64.047,59.019],[-63.125,59.055],[-63.325,58.856],[-62.868,58.711],[-63.589,58.301],[-62.556,58.478],[-62.905,58.21],[-62.583,58.217],[-63.341,57.98],[-62.453,58.175],[-62.31,58.029],[-62.673,57.93],[-62.127,57.968],[-61.883,57.638],[-62.545,57.501],[-61.358,57.087],[-61.906,56.795],[-61.689,56.617],[-62.586,56.793],[-61.655,56.534],[-62.139,56.445],[-61.589,56.287],[-62.076,56.285],[-61.351,56.222],[-61.452,56.057],[-61.237,56.043],[-61.504,56.007],[-60.756,55.849],[-60.938,55.727],[-60.602,55.815],[-60.679,55.564],[-60.34,55.786],[-60.478,55.347],[-60.197,55.422],[-60.683,54.995],[-59.779,55.33],[-59.964,55.11],[-59.427,55.14],[-59.944,54.75],[-59.161,55.237],[-59.384,54.973],[-59.024,55.157],[-58.917,54.851],[-57.347,54.579],[-59.576,54.049],[-58.379,54.23],[-60.131,53.777],[-60.134,53.528],[-60.918,53.709],[-60.048,53.495],[-60.406,53.364],[-60.114,53.27],[-58.842,53.943],[-57.789,54.069],[-58.384,54.19],[-57.428,54.182],[-57.076,53.823],[-57.55,53.592],[-57.372,53.431],[-56.465,53.782],[-56.726,53.674],[-55.808,53.341],[-55.754,53.135],[-56.167,53.029],[-55.803,52.839],[-56.16,52.794],[-55.739,52.643],[-56.497,52.594],[-55.646,52.437],[-56.195,52.436],[-55.69,52.101],[-57.104,51.413],[-57.101,52],[-63.751,52.0],[-64.082,52.471],[-63.378,52.651],[-63.693,53.114],[-64.173,52.851],[-64.116,52.151],[-64.581,51.558],[-64.588,51.829],[-65.109,52.171],[-66.439,52.201],[-66.346,52.974],[-67.067,52.699],[-66.91,53.34],[-67.492,53.604],[-67.782,54.064],[-67.485,54.234],[-67.601,54.566],[-67.036,54.622],[-67.428,55.071],[-66.699,54.742],[-66.779,55.339],[-65.69,54.713],[-63.669,54.612],[-63.519,55.184],[-63.096,55.35],[-63.715,55.859],[-63.445,56.023],[-64.02,56.076],[-63.877,56.217],[-64.137,56.304],[-63.871,56.439],[-64.129,56.71],[-63.871,56.878],[-63.596,57.734],[-64.432,58.086],[-63.819,58.471],[-64.051,58.676],[-63.481,58.749],[-64.879,58.927],[-64.291,59.017],[-64.535,59.197],[-64.34,59.496],[-64.827,59.531],[-64.654,59.93],[-64.906,60.048],[-64.599,60.111],[-64.854,60.262],[-64.535,60.303]]],[[[-64.048,59.849],[-64.033,59.804],[-64.076,59.788],[-63.96,59.756],[-63.997,59.724],[-64.134,59.696],[-64.163,59.704],[-64.144,59.727],[-64.204,59.734],[-64.188,59.768],[-64.129,59.757],[-64.153,59.788],[-64.122,59.849],[-64.048,59.849]]],[[[-61.884,57.867],[-61.882,57.813],[-61.947,57.787],[-62.109,57.829],[-61.995,57.909],[-61.928,57.909],[-61.94,57.872],[-61.884,57.867]]],[[[-61.654,57.771],[-61.696,57.712],[-61.769,57.717],[-61.828,57.779],[-61.897,57.758],[-61.779,57.845],[-61.699,57.83],[-61.724,57.783],[-61.676,57.796],[-61.654,57.771]]],[[[-61.927,57.452],[-62.022,57.521],[-61.975,57.581],[-61.932,57.586],[-61.947,57.549],[-61.896,57.586],[-61.781,57.548],[-61.783,57.508],[-61.927,57.452]]],[[[-61.644,57.523],[-61.691,57.496],[-61.647,57.483],[-61.674,57.464],[-61.79,57.46],[-61.826,57.431],[-61.694,57.442],[-61.615,57.419],[-61.648,57.394],[-61.9,57.437],[-61.782,57.486],[-61.737,57.537],[-61.644,57.523]]],[[[-61.355,56.911],[-61.586,56.766],[-61.391,56.619],[-61.644,56.734],[-61.355,56.911]]],[[[-61.558,56.552],[-61.325,56.512],[-61.361,56.472],[-61.174,56.477],[-61.224,56.451],[-61.149,56.441],[-61.474,56.467],[-61.503,56.436],[-61.631,56.465],[-61.63,56.491],[-61.418,56.483],[-61.633,56.506],[-61.572,56.518],[-61.602,56.553],[-61.558,56.552]]],[[[-61.547,56.391],[-61.475,56.407],[-61.412,56.372],[-61.464,56.346],[-61.416,56.322],[-61.483,56.31],[-61.686,56.353],[-61.796,56.413],[-61.547,56.391]]],[[[-61.089,56.17],[-60.935,56.011],[-61.221,56.051],[-61.089,56.17]]],[[[-60.748,55.932],[-60.751,55.91],[-60.686,55.922],[-60.756,55.88],[-60.902,55.871],[-60.815,55.886],[-60.874,55.904],[-60.865,55.953],[-60.748,55.932]]],[[[-57.941,54.912],[-57.989,54.867],[-57.984,54.802],[-57.939,54.828],[-57.885,54.802],[-57.865,54.832],[-57.842,54.812],[-57.882,54.791],[-58.139,54.757],[-58.225,54.835],[-58.216,54.878],[-58.17,54.854],[-57.941,54.912]]],[[[-55.877,50.863],[-56.097,50.717],[-56.155,50.886],[-56.108,50.652],[-56.502,50.383],[-56.858,49.546],[-56.117,50.153],[-56.188,49.924],[-55.46,49.958],[-56.003,49.748],[-56.172,49.579],[-55.833,49.687],[-56.129,49.426],[-55.369,49.503],[-55.304,49.312],[-55.137,49.541],[-55.383,49.041],[-54.447,49.543],[-54.487,49.26],[-54.042,49.481],[-53.456,49.252],[-54.178,48.801],[-53.6,48.685],[-54.164,48.383],[-52.976,48.599],[-53.662,48.163],[-53.941,48.231],[-53.664,48.064],[-53.919,48.022],[-53.606,48.046],[-53.93,47.849],[-53.667,47.522],[-53.291,47.999],[-52.833,48.097],[-53.267,47.606],[-53.122,47.413],[-52.779,47.803],[-52.62,47.5],[-53.091,46.643],[-53.618,46.644],[-53.559,47.203],[-54.19,46.824],[-53.804,47.427],[-54.263,47.901],[-54.403,47.451],[-54.613,47.363],[-54.418,47.604],[-54.831,47.421],[-55.384,46.866],[-55.983,46.952],[-54.697,47.665],[-55.358,47.726],[-55.588,47.399],[-55.926,47.439],[-55.746,47.585],[-56.104,47.464],[-55.628,47.675],[-55.917,47.657],[-55.774,47.957],[-56.779,47.527],[-58.272,47.752],[-59.304,47.61],[-59.401,47.907],[-58.266,48.517],[-59.229,48.529],[-58.775,48.779],[-58.959,48.614],[-58.709,48.571],[-58.352,49.15],[-57.892,48.982],[-58.144,49.122],[-57.849,49.182],[-58.223,49.39],[-57.696,49.464],[-57.948,49.674],[-57.373,50.591],[-57.151,50.616],[-57.398,50.692],[-56.928,50.916],[-57.089,51.02],[-56.689,51.337],[-55.516,51.602],[-55.598,51.304],[-56.086,51.368],[-55.71,51.174],[-55.877,50.863]]]]},\"properties\":{\"name\":\"Newfoundland and Labrador\"}},{\"type\":\"Feature\",\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[-131.077,52.15],[-130.948,52.094],[-130.992,52.061],[-131.07,52.072],[-130.986,52.012],[-131.042,52.022],[-131.007,51.979],[-131.039,51.967],[-131.022,51.941],[-131.11,51.999],[-131.085,52.023],[-131.12,52.056],[-131.123,52.124],[-131.077,52.15]]],[[[-130.165,55.014],[-130.15,54.947],[-130.27,54.831],[-130.399,54.765],[-130.459,54.818],[-130.213,55.013],[-130.165,55.014]]],[[[-130.459,54.8],[-130.436,54.763],[-130.463,54.709],[-130.539,54.704],[-130.611,54.753],[-130.459,54.8]]],[[[-130.747,54.615],[-130.761,54.555],[-130.965,54.457],[-130.926,54.619],[-130.747,54.615]]],[[[-132.881,53.6],[-133.109,53.787],[-133.067,54.174],[-132.575,54.116],[-132.659,53.939],[-132.163,54.005],[-132.225,53.78],[-132.663,53.679],[-132.468,53.571],[-132.156,53.7],[-132.178,54.041],[-131.656,54.16],[-131.982,53.252],[-132.499,53.159],[-132.753,53.316],[-132.4,53.331],[-132.881,53.6]]],[[[-130.336,54.068],[-130.344,53.835],[-130.497,53.874],[-130.349,53.997],[-130.71,53.856],[-130.336,54.068]]],[[[-129.48,53.249],[-130.266,53.881],[-129.425,53.431],[-129.48,53.249]]],[[[-130.272,53.798],[-130.091,53.569],[-130.403,53.682],[-130.272,53.798]]],[[[-128.824,53.701],[-129.163,53.382],[-129.153,53.639],[-128.824,53.701]]],[[[-130.391,53.617],[-129.921,53.424],[-129.729,53.215],[-129.742,53.178],[-129.932,53.158],[-130.014,53.247],[-130.079,53.27],[-130.094,53.326],[-130.141,53.322],[-130.203,53.379],[-130.306,53.384],[-130.412,53.493],[-130.334,53.515],[-130.459,53.515],[-130.527,53.552],[-130.508,53.632],[-130.391,53.617]]],[[[-128.986,53.523],[-128.918,53.331],[-129.122,53.318],[-128.986,53.523]]],[[[-129.169,53.296],[-129.132,53.114],[-129.275,53.084],[-129.333,53.138],[-129.338,53.185],[-129.245,53.282],[-129.274,53.328],[-129.227,53.326],[-129.169,53.296]]],[[[-128.594,52.659],[-128.752,52.601],[-128.653,52.967],[-128.766,52.662],[-129.08,52.772],[-128.836,53.036],[-129.012,53.14],[-128.862,53.034],[-129.166,52.923],[-129.086,53.294],[-128.606,53.145],[-128.594,52.659]]],[[[-131.074,52.219],[-131.271,52.121],[-132.237,52.825],[-132.343,52.942],[-132.113,52.998],[-132.562,53.145],[-131.794,53.251],[-131.595,53.035],[-131.999,53.051],[-131.612,52.926],[-131.982,52.88],[-131.074,52.219]]],[[[-129.463,53.18],[-129.313,53.057],[-129.29,52.972],[-129.414,53.011],[-129.475,53.102],[-129.545,53.128],[-129.522,53.184],[-129.463,53.18]]],[[[-128.499,52.871],[-128.451,52.805],[-128.512,52.641],[-128.54,52.703],[-128.499,52.871]]],[[[-128.17,52.818],[-128.247,52.621],[-128.285,52.599],[-128.325,52.776],[-128.225,52.782],[-128.17,52.818]]],[[[-129.231,52.816],[-128.923,52.607],[-128.944,52.47],[-128.983,52.453],[-129.009,52.526],[-129.11,52.553],[-129.119,52.605],[-129.211,52.649],[-129.224,52.677],[-129.194,52.683],[-129.271,52.719],[-129.281,52.817],[-129.231,52.816]]],[[[-128.373,52.791],[-128.275,52.49],[-128.366,52.382],[-128.442,52.368],[-128.468,52.393],[-128.394,52.465],[-128.423,52.475],[-128.438,52.544],[-128.451,52.627],[-128.418,52.708],[-128.442,52.747],[-128.373,52.791]]],[[[-131.469,52.731],[-131.439,52.702],[-131.458,52.631],[-131.59,52.662],[-131.593,52.634],[-131.548,52.611],[-131.585,52.585],[-131.71,52.705],[-131.575,52.727],[-131.675,52.705],[-131.549,52.688],[-131.469,52.731]]],[[[-128.535,52.647],[-128.487,52.437],[-128.813,52.52],[-128.535,52.647]]],[[[-128.616,52.449],[-128.618,52.33],[-128.676,52.266],[-128.726,52.316],[-128.759,52.449],[-128.674,52.482],[-128.616,52.449]]],[[[-127.596,52.152],[-127.88,51.945],[-127.789,52.222],[-127.235,52.417],[-127.596,52.152]]],[[[-128.092,52.408],[-128.057,52.329],[-128.214,52.28],[-128.115,52.418],[-128.092,52.408]]],[[[-127.962,52.289],[-127.908,52.205],[-127.925,52.174],[-128.093,52.192],[-128.012,52.232],[-128.046,52.258],[-128.17,52.25],[-128.048,52.301],[-127.962,52.289]]],[[[-128.148,52.183],[-128.151,52.081],[-128.206,52.019],[-128.253,52.02],[-128.292,52.119],[-128.24,52.184],[-128.148,52.183]]],[[[-128.032,52.163],[-127.879,52.167],[-127.963,52.075],[-128.106,52.1],[-128.115,52.149],[-128.032,52.163]]],[[[-127.951,52.047],[-128.019,51.77],[-128.255,51.866],[-127.951,52.047]]],[[[-127.998,51.712],[-127.914,51.411],[-128.153,51.602],[-127.998,51.712]]],[[[-127.121,49.852],[-127.09,50.142],[-127.907,50.121],[-127.745,50.242],[-127.924,50.463],[-127.447,50.373],[-127.419,50.597],[-128.051,50.447],[-128.417,50.769],[-127.91,50.871],[-125.564,50.364],[-124.789,49.464],[-123.958,49.228],[-123.276,48.451],[-123.583,48.301],[-125.114,48.731],[-124.808,49.241],[-124.906,49.002],[-125.484,48.916],[-125.877,49.088],[-125.606,49.21],[-125.777,49.366],[-126.023,49.268],[-125.905,49.436],[-126.578,49.408],[-126.103,49.679],[-126.585,49.701],[-126.829,49.965],[-127.121,49.852]]],[[[-126.798,50.769],[-126.865,50.789],[-126.906,50.823],[-126.881,50.83],[-126.794,50.805],[-126.779,50.832],[-126.643,50.847],[-126.563,50.8],[-126.798,50.769]]],[[[-126.252,50.819],[-126.177,50.744],[-126.244,50.717],[-126.266,50.655],[-126.618,50.665],[-126.39,50.806],[-126.252,50.819]]],[[[-126.336,50.522],[-126.624,50.534],[-126.286,50.598],[-126.225,50.557],[-126.336,50.522]]],[[[-125.371,50.456],[-125.331,50.425],[-125.386,50.37],[-125.458,50.349],[-125.537,50.379],[-125.371,50.456]]],[[[-125.273,50.431],[-125.134,50.123],[-125.393,50.296],[-125.273,50.431]]],[[[-124.899,50.294],[-124.811,50.276],[-124.82,50.206],[-124.757,50.178],[-124.807,50.114],[-124.871,50.157],[-124.834,50.192],[-124.916,50.189],[-124.963,50.236],[-124.899,50.294]]],[[[-125.345,50.264],[-125.255,50.294],[-125.167,50.214],[-125.187,50.142],[-125.233,50.118],[-125.178,50.079],[-125.168,49.981],[-125.216,50.079],[-125.324,50.143],[-125.345,50.264]]],[[[-124.983,50.226],[-124.891,50.068],[-124.987,50.013],[-125,50.064],[-125.067,50.107],[-124.982,50.176],[-125.006,50.226],[-124.983,50.226]]],[[[-126.769,49.879],[-126.633,49.596],[-126.974,49.74],[-126.769,49.879]]],[[[-124.123,49.494],[-124.44,49.612],[-124.477,49.672],[-124.654,49.736],[-124.657,49.797],[-124.351,49.698],[-124.123,49.494]]],[[[-126.127,49.39],[-126.073,49.343],[-126.065,49.251],[-126.239,49.29],[-126.235,49.374],[-126.127,49.39]]],[[[-123.675,49.093],[-123.522,48.96],[-123.312,48.868],[-123.379,48.857],[-123.53,48.938],[-123.662,49.035],[-123.705,49.1],[-123.675,49.093]]],[[[-123.577,48.929],[-123.434,48.844],[-123.494,48.845],[-123.372,48.758],[-123.456,48.765],[-123.432,48.721],[-123.525,48.722],[-123.552,48.752],[-123.533,48.795],[-123.572,48.829],[-123.548,48.86],[-123.593,48.898],[-123.597,48.947],[-123.577,48.929]]],[[[-117.031,49],[-123.034,48.999],[-123.249,49.274],[-122.853,49.436],[-123.269,49.331],[-123.16,49.699],[-123.536,49.381],[-124.068,49.634],[-123.941,49.742],[-123.77,49.505],[-123.534,49.701],[-123.931,49.764],[-123.821,50.152],[-123.985,50.216],[-123.809,50.1],[-123.926,49.826],[-124.271,49.743],[-124.742,49.958],[-124.715,50.327],[-124.348,50.502],[-125.078,50.322],[-124.85,50.935],[-125.17,50.412],[-125.573,50.459],[-125.433,50.714],[-125.7,50.428],[-126.275,50.508],[-125.704,50.678],[-125.506,50.933],[-125.634,51.097],[-125.643,50.784],[-125.937,50.681],[-126.553,50.835],[-126.17,50.937],[-126.516,51.071],[-126.661,50.868],[-127.399,50.926],[-127.503,51.097],[-126.653,51.15],[-127.79,51.166],[-127.143,51.318],[-127.784,51.333],[-127.501,51.614],[-126.605,51.713],[-127.426,51.667],[-127.351,51.864],[-127.64,51.459],[-127.878,51.674],[-127.866,51.9],[-127.172,52.312],[-126.669,51.984],[-126.941,52.304],[-126.737,52.378],[-127.186,52.381],[-126.967,52.829],[-127.612,52.295],[-128.057,52.395],[-127.88,52.58],[-128.394,52.291],[-128.025,52.912],[-128.441,52.823],[-128.481,53.142],[-128.973,53.553],[-127.868,53.24],[-128.817,53.623],[-128.471,53.833],[-128.609,54.031],[-129.004,53.893],[-129.311,53.38],[-130.101,53.947],[-130.047,54.153],[-129.719,53.951],[-129.93,54.183],[-129.47,54.237],[-130.123,54.154],[-130.481,54.365],[-130.417,54.63],[-129.96,54.327],[-130.369,54.668],[-129.881,54.615],[-130.174,54.847],[-129.622,54.998],[-129.998,55.018],[-129.471,55.473],[-129.708,55.41],[-129.812,55.629],[-130.114,54.996],[-129.944,55.282],[-130.089,56.118],[-131.824,56.597],[-133.43,58.459],[-135.474,59.802],[-136.344,59.603],[-136.584,59.163],[-137.465,58.906],[-137.591,59.239],[-138.939,59.998],[-119.983,59.989],[-120.001,53.808],[-119.735,53.635],[-119.902,53.52],[-118.76,53.125],[-118.223,52.366],[-118.006,52.488],[-117.76,52.201],[-117.319,52.182],[-116.919,51.709],[-116.659,51.797],[-115.647,50.855],[-115.017,50.575],[-114.659,50.065],[-114.738,49.609],[-114.035,49.031],[-117.031,49]]]]},\"properties\":{\"name\":\"British Columbia\"}},{\"type\":\"Feature\",\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[-109.978,78.671],[-109.255,78.479],[-109.984,78.326],[-109.978,78.671]]],[[[-109.792,78.099],[-109.581,78.058],[-109.987,77.924],[-109.792,78.099]]],[[[-108.483,76.457],[-108.077,76.28],[-108.497,76.04],[-107.632,75.991],[-108.02,75.781],[-107.064,75.893],[-106.875,75.644],[-106.616,75.797],[-106.896,75.941],[-106.606,76.058],[-105.668,75.956],[-105.388,75.656],[-105.993,75.056],[-108.373,74.911],[-108.832,75.07],[-110.008,74.833],[-110.004,75.533],[-108.899,75.476],[-108.827,75.687],[-110.002,75.876],[-109.291,76.035],[-110.0,76.225],[-109.998,76.475],[-108.774,76.858],[-108.446,76.724],[-108.727,76.638],[-108.483,76.457]]],[[[-110.02,72.442],[-109.783,72.429],[-110.019,72.712],[-109.77,72.722],[-110.019,72.75],[-110.018,72.975],[-109.112,72.74],[-108.621,72.55],[-108.238,71.714],[-107.845,71.604],[-107.257,71.9],[-107.779,72.137],[-108.3,73.136],[-107.864,73.189],[-108.144,73.307],[-105.856,73.057],[-105.364,72.785],[-105.019,72.067],[-104.355,71.574],[-104.278,71.351],[-104.649,71.119],[-103.556,70.601],[-102.931,70.491],[-103.067,70.67],[-101.552,70.109],[-100.973,70.156],[-100.878,69.772],[-101.33,69.67],[-101.445,69.909],[-101.673,69.646],[-102.23,69.917],[-102.681,69.76],[-102.508,69.564],[-103.487,69.685],[-103.023,69.494],[-103.209,69.123],[-102.46,69.482],[-102.058,69.484],[-102.217,69.225],[-101.752,69.161],[-102.895,68.8],[-105.129,68.896],[-104.923,69.075],[-106.406,69.181],[-106.31,69.404],[-106.602,69.499],[-107.304,69.032],[-108.938,68.741],[-113.309,68.467],[-113.044,68.504],[-113.677,68.811],[-113.692,69.189],[-113.521,69.179],[-116.526,69.407],[-116.91,69.59],[-116.514,69.635],[-117.085,69.999],[-112.658,69.835],[-110.029,69.995],[-110.02,72.442]]],[[[-92.744,69.672],[-90.319,69.441],[-91.447,69.35],[-90.665,69.083],[-90.436,68.874],[-90.607,68.446],[-90.207,68.231],[-89.39,69.219],[-88.209,68.912],[-87.788,68.327],[-88.392,68.287],[-88.371,67.959],[-87.273,67.096],[-86.963,67.251],[-87.09,67.351],[-86.532,67.347],[-86.525,67.681],[-85.893,68.051],[-85.646,68.737],[-84.775,68.737],[-85.141,68.947],[-84.528,69.017],[-85.316,69.148],[-85.543,69.476],[-85.344,69.813],[-85.562,69.859],[-82.255,69.636],[-83.294,69.534],[-81.332,69.182],[-82.057,68.874],[-81.383,68.867],[-81.256,68.643],[-82.648,68.445],[-82.314,68.147],[-81.989,68.207],[-82.103,67.907],[-81.239,67.436],[-81.524,66.991],[-83.368,66.349],[-83.977,66.582],[-83.908,66.877],[-84.26,66.716],[-84.584,66.978],[-84.371,66.971],[-84.927,67.059],[-84.64,66.978],[-85.229,66.873],[-84.602,66.936],[-83.679,66.201],[-83.848,66.153],[-84.529,66.404],[-84.375,66.159],[-85.252,66.273],[-85.48,66.581],[-86.781,66.521],[-85.898,66.163],[-87.373,65.323],[-89.672,65.939],[-91.497,65.946],[-90,65.797],[-89.054,65.329],[-87.051,65.236],[-86.97,65.054],[-88.113,64.136],[-88.737,63.968],[-89.261,64.161],[-89.024,63.95],[-89.486,63.942],[-89.773,64.241],[-90.121,64.128],[-89.814,63.937],[-90.279,64.004],[-90,63.774],[-90.205,63.612],[-92.376,63.777],[-93.773,64.194],[-93.65,63.877],[-92.104,63.702],[-92.472,63.523],[-91.776,63.716],[-90.786,63.396],[-90.975,63.419],[-90.689,63.355],[-90.627,63.059],[-91.356,62.789],[-92.455,62.815],[-91.881,62.619],[-92.616,62.614],[-92.53,62.443],[-92.823,62.349],[-92.47,62.147],[-93.145,62.337],[-92.79,62.177],[-93.619,61.949],[-93.256,61.742],[-94.111,61.323],[-93.98,61.096],[-94.797,60.497],[-94.614,60.381],[-94.8,60.0],[-102.002,60.0],[-101.984,64.213],[-109.387,64.827],[-110.652,65.5],[-112.499,65.506],[-120.658,68.001],[-120.665,69.551],[-117.154,68.886],[-115.593,68.972],[-113.912,68.389],[-114.96,68.286],[-114.765,68.186],[-115.237,68.182],[-115.11,68.012],[-115.507,67.889],[-111.894,67.679],[-110.117,68.009],[-109.726,67.717],[-109.066,67.714],[-108.813,67.349],[-108.62,67.625],[-108.484,67.349],[-108.015,67.293],[-107.881,67.048],[-108.623,67.15],[-107.222,66.349],[-107.797,66.756],[-107.651,67.076],[-107.564,66.834],[-107.084,66.821],[-108.007,67.707],[-107.651,67.941],[-107.891,68.082],[-106.445,68.152],[-106.448,68.345],[-105.73,68.419],[-105.666,68.639],[-106.551,68.515],[-106.543,68.291],[-107.813,68.342],[-107.603,68.165],[-108.37,68.113],[-108.402,68.294],[-108.819,68.267],[-108.345,68.602],[-106.215,68.941],[-105.475,68.721],[-105.321,68.474],[-105.533,68.409],[-104.894,68.349],[-104.5,68.032],[-103.404,68.164],[-102.228,67.687],[-100.7,67.847],[-98.931,67.696],[-98.354,67.796],[-98.724,67.954],[-98.585,68.092],[-97.548,67.596],[-97.059,67.675],[-97.24,67.926],[-98.095,67.833],[-98.715,68.362],[-97.743,68.371],[-98.01,68.498],[-97.852,68.542],[-96.631,68.179],[-96.411,68.316],[-96.789,68.017],[-95.892,68.294],[-96.465,67.478],[-96.097,67.465],[-96.114,67.213],[-95.566,67.377],[-95.833,67.163],[-95.436,67.194],[-95.35,66.964],[-96.461,67.062],[-95.82,66.584],[-95.652,66.729],[-96.086,66.927],[-95.219,66.974],[-95.352,67.148],[-95.163,67.287],[-95.704,67.739],[-95.473,68.061],[-94.722,68.055],[-93.376,68.633],[-93.752,68.614],[-93.566,68.849],[-93.804,69.069],[-94.095,68.758],[-94.632,68.75],[-94.599,68.966],[-94.006,69.154],[-94.303,69.305],[-93.526,69.438],[-93.837,69.164],[-93.379,69.376],[-96.198,69.86],[-96.569,70.269],[-96.243,70.57],[-95.797,70.529],[-96.061,70.617],[-95.818,70.71],[-96.612,70.794],[-96.37,71.09],[-96.504,71.277],[-95.535,71.291],[-95.377,71.509],[-95.908,71.601],[-94.608,71.866],[-95.217,71.945],[-94.564,71.997],[-94.424,71.661],[-93.712,71.761],[-93.811,71.646],[-92.974,71.341],[-92.852,70.857],[-93.043,70.864],[-91.511,70.153],[-92.363,70.24],[-92.587,70.077],[-91.94,70.02],[-92.744,69.672]]],[[[-61.283,66.617],[-62.187,66.627],[-61.555,66.336],[-62.89,66.333],[-61.96,66.012],[-63.062,66.121],[-62.288,65.813],[-62.864,65.911],[-62.569,65.757],[-62.848,65.764],[-62.645,65.587],[-63.212,65.641],[-63.488,65.936],[-63.348,65.667],[-63.729,65.676],[-63.32,65.593],[-63.618,65.542],[-63.293,65.429],[-63.656,65.471],[-63.336,65.301],[-63.547,64.887],[-63.799,65.182],[-64.381,65.181],[-64.237,65.43],[-64.535,65.097],[-64.911,65.34],[-64.413,65.479],[-65.144,65.428],[-64.71,65.652],[-65.3,65.631],[-64.791,65.723],[-65.498,65.737],[-64.735,65.969],[-64.722,66.217],[-64.356,66.35],[-65.916,65.951],[-65.476,66.388],[-66.139,66.131],[-67.059,66.643],[-66.884,66.566],[-67.106,66.486],[-67.741,66.571],[-67.149,66.444],[-67.406,66.43],[-67.282,66.275],[-67.993,66.504],[-67.194,65.91],[-67.914,65.899],[-68.516,66.299],[-68.835,66.185],[-68.027,66.075],[-68.347,66.038],[-68.204,65.793],[-67.811,65.816],[-68.026,65.481],[-67.328,65.662],[-67.451,65.494],[-67.058,65.427],[-67.409,65.333],[-66.929,65.23],[-67.108,65.059],[-66.726,65.18],[-66.915,65.051],[-66.698,64.764],[-66.689,65.039],[-66.148,64.869],[-66.212,64.686],[-65.664,64.808],[-65.726,64.498],[-65.115,64.511],[-65.195,64.31],[-65.658,64.303],[-64.668,64.033],[-64.984,63.814],[-64.508,63.651],[-64.649,63.238],[-65.299,63.812],[-64.987,63.602],[-65.123,63.4],[-64.921,63.236],[-65.149,63.286],[-64.627,62.9],[-65.274,63.001],[-64.928,62.632],[-65.145,62.566],[-65.332,62.926],[-66.393,62.995],[-66.651,63.375],[-66.54,62.994],[-67.915,63.759],[-67.717,63.364],[-68.995,63.756],[-67.976,63.064],[-67.61,63.094],[-67.77,62.958],[-67.553,63.049],[-67.666,62.919],[-65.933,62.204],[-66.201,62.113],[-65.955,61.89],[-66.395,61.871],[-68.548,62.249],[-69.442,62.547],[-69.597,62.662],[-69.395,62.763],[-70.255,62.756],[-71.152,62.985],[-70.909,63.171],[-71.244,63.001],[-71.714,63.179],[-71.775,63.412],[-72.146,63.446],[-71.235,63.608],[-71.904,63.81],[-71.923,63.645],[-72.317,63.674],[-72.092,63.905],[-72.526,63.788],[-72.665,64.081],[-73.384,64.272],[-73.261,64.363],[-73.472,64.415],[-73.168,64.577],[-73.309,64.659],[-73.929,64.602],[-73.786,64.477],[-74.09,64.329],[-74.061,64.733],[-74.382,64.57],[-74.704,64.736],[-74.479,64.836],[-74.64,64.904],[-74.985,64.796],[-74.47,64.557],[-74.681,64.372],[-75.843,64.608],[-75.727,64.367],[-76.671,64.184],[-77.878,64.374],[-78.299,64.705],[-77.964,65.047],[-77.329,65.179],[-77.422,65.461],[-75.786,65.224],[-75.428,65.048],[-75.668,64.941],[-75.397,64.717],[-75.344,64.92],[-75.567,64.884],[-75.187,65.102],[-75.95,65.318],[-73.48,65.451],[-74.466,66.152],[-72.193,67.273],[-72.942,67.925],[-72.992,68.234],[-73.496,68.276],[-73.212,68.377],[-73.632,68.247],[-73.949,68.412],[-73.754,68.684],[-74.366,68.539],[-74.726,68.73],[-74.551,68.831],[-74.984,68.809],[-74.692,68.865],[-75.042,68.903],[-74.786,69.076],[-76.661,68.699],[-76.626,69.018],[-75.592,69.222],[-76.638,69.547],[-76.188,69.665],[-77.192,69.64],[-76.781,69.749],[-77.309,69.831],[-76.975,69.936],[-77.616,69.742],[-77.673,70.181],[-78.402,70.212],[-79.071,70.47],[-78.719,70.548],[-79.009,70.68],[-79.174,70.428],[-79.589,70.399],[-78.922,70.301],[-78.664,70.004],[-78.796,69.877],[-81.728,70.132],[-80.791,69.791],[-80.968,69.714],[-82.993,70.304],[-81.711,69.934],[-82.143,69.781],[-83.067,70.011],[-85.727,69.991],[-86.552,70.235],[-86.391,70.522],[-86.647,70.319],[-86.953,70.467],[-87.247,70.383],[-86.986,70.282],[-87.866,70.239],[-88.889,70.529],[-89.559,71.09],[-87.003,70.994],[-87.829,71.262],[-89.9,71.351],[-90.04,71.598],[-89.796,71.76],[-90.119,71.926],[-89.575,72.164],[-89.897,72.189],[-89.908,72.432],[-89.471,72.666],[-89.575,72.785],[-89.246,72.785],[-89.361,72.992],[-89.047,73.247],[-88.619,73.28],[-88.857,73.336],[-87.457,73.76],[-85.239,73.822],[-84.838,73.742],[-85.915,73.366],[-86.741,72.728],[-86.241,72.42],[-86.421,72.013],[-84.833,71.279],[-86.82,70.989],[-84.875,71.173],[-85.127,71.087],[-84.794,70.927],[-84.607,71.649],[-86.051,72.011],[-85.509,72.068],[-85.471,72.262],[-84.165,72.021],[-84.933,72.284],[-84.442,72.383],[-85.535,72.47],[-85.688,72.894],[-83.955,72.748],[-85.535,73.022],[-83.634,72.982],[-85.134,73.306],[-84.355,73.223],[-84.656,73.391],[-84.171,73.475],[-83.601,73.297],[-84.007,73.51],[-81.573,73.72],[-80.247,72.731],[-81.379,72.242],[-80.516,72.504],[-80.969,72.2],[-80.567,72.073],[-81.087,72.047],[-80.793,72.028],[-80.95,71.881],[-80.261,72.295],[-79.674,72.127],[-80.164,72.327],[-79.837,72.499],[-79.596,72.335],[-79.75,72.216],[-79.33,72.397],[-78.949,72.273],[-79.233,71.976],[-78.508,71.876],[-78.924,72.015],[-78.854,72.173],[-77.759,71.75],[-78.861,72.235],[-76.997,72.128],[-78.559,72.438],[-77.614,72.752],[-75.232,72.501],[-74.947,72.25],[-76.411,71.859],[-75.233,72.084],[-75.88,71.702],[-75.036,72.126],[-74.244,72.073],[-74.23,71.823],[-75.39,71.681],[-74.934,71.664],[-75.406,71.512],[-74.632,71.646],[-75.152,71.466],[-74.699,71.391],[-75.065,71.181],[-74.523,71.662],[-74.109,71.736],[-74.156,71.532],[-73.978,71.76],[-73.62,71.716],[-74.319,71.409],[-74.029,71.438],[-74.235,71.198],[-73.622,71.583],[-73.635,71.359],[-73.38,71.385],[-73.898,71.057],[-73.35,71.345],[-73.049,71.268],[-73.377,70.981],[-72.558,71.66],[-71.444,71.469],[-71.123,71.272],[-71.464,71.062],[-72.772,70.816],[-72.164,70.836],[-72.543,70.61],[-70.614,71.062],[-70.747,70.746],[-71.961,70.421],[-71.168,70.532],[-71.536,70.02],[-70.997,70.626],[-69.893,70.883],[-70.478,70.476],[-69.451,70.792],[-68.284,70.541],[-70.451,69.857],[-68.683,70.204],[-69.983,69.616],[-68.64,69.94],[-68.056,70.323],[-67.118,69.726],[-70.035,69.537],[-67.258,69.467],[-66.647,69.204],[-68.984,69.357],[-68.077,69.217],[-68.968,69.221],[-68.503,69.199],[-69.029,68.971],[-68.178,69.147],[-67.706,69.016],[-68.486,68.89],[-67.771,68.781],[-69.384,68.816],[-68.049,68.682],[-68.902,68.604],[-67.923,68.551],[-67.959,68.396],[-67.67,68.561],[-67.492,68.527],[-67.613,68.379],[-66.664,68.432],[-67.87,68.26],[-67.016,68.319],[-67.599,68.165],[-67.011,68.295],[-66.735,67.982],[-66.309,68.127],[-66.184,68.013],[-66.399,67.869],[-66.747,67.875],[-66.386,67.772],[-65.912,68.159],[-66.009,67.626],[-65.818,67.968],[-65.444,67.992],[-65.614,67.781],[-65.357,67.595],[-65.554,67.788],[-65.407,67.922],[-64.714,67.982],[-65.067,67.931],[-65.2,67.644],[-64.568,67.82],[-64.364,67.754],[-64.639,67.661],[-64.04,67.534],[-64.441,67.475],[-63.908,67.311],[-64.798,67.357],[-64.232,67.293],[-64.783,67.19],[-63.963,67.272],[-64.697,67.003],[-63.562,67.237],[-63.772,66.959],[-63.11,67.33],[-62.971,67.221],[-63.241,66.962],[-63.822,66.816],[-63.442,66.908],[-63.42,66.699],[-62.847,66.962],[-62.9,66.637],[-62.743,66.942],[-62.313,66.727],[-62.427,66.921],[-62.054,67.049],[-61.283,66.617]]],[[[-67.544,82.962],[-66.369,82.888],[-68.643,82.629],[-64.836,82.907],[-63.389,82.805],[-63.85,82.716],[-62.926,82.576],[-63.37,82.439],[-61.608,82.48],[-61.131,82.377],[-61.193,82.224],[-65.789,81.632],[-69.291,81.719],[-66.609,81.513],[-69.995,81.099],[-65.725,81.494],[-64.566,81.546],[-64.735,81.374],[-67.591,80.933],[-69.596,80.361],[-70.812,80.563],[-69.961,80.256],[-70.179,80.189],[-72.4,80.219],[-71.896,80.114],[-72.341,80.059],[-70.508,80.1],[-71.416,79.93],[-70.91,79.886],[-71.136,79.785],[-74.846,79.847],[-73.349,79.766],[-73.126,79.558],[-73.354,79.506],[-75.058,79.374],[-77.143,79.547],[-75.89,79.348],[-78.051,79.355],[-74.497,79.225],[-74.827,79.174],[-74.437,79.058],[-74.725,79.023],[-76.098,79.199],[-78.891,79.063],[-77.708,79.013],[-78.248,78.77],[-77.712,78.966],[-75.72,78.966],[-76.44,78.839],[-74.911,78.851],[-74.633,78.588],[-76.684,78.522],[-75.031,78.331],[-76.855,78.227],[-75.581,78.116],[-75.923,77.957],[-78.261,77.995],[-78.42,77.899],[-77.723,77.599],[-78.777,77.307],[-80.753,77.331],[-81.928,77.686],[-81.166,77.337],[-82.194,77.3],[-81.787,77.157],[-79.255,77.219],[-79.005,77.097],[-79.387,76.927],[-78.07,77.014],[-77.715,76.821],[-78.377,76.458],[-78.791,76.572],[-79.273,76.304],[-81.076,76.129],[-80.772,76.419],[-82.04,76.509],[-81.786,76.686],[-82.75,76.819],[-82.081,76.561],[-82.18,76.417],[-83.1,76.464],[-83.38,76.759],[-83.523,76.701],[-83.224,76.411],[-84.284,76.658],[-84.237,76.444],[-85.051,76.514],[-84.382,76.312],[-85.195,76.281],[-86.372,76.386],[-86.212,76.535],[-86.63,76.635],[-86.301,76.525],[-86.717,76.346],[-87.537,76.617],[-87.416,76.348],[-88.351,76.385],[-88.519,76.816],[-88.704,76.71],[-88.496,76.552],[-88.608,76.4],[-88.734,76.594],[-89.213,76.43],[-89.677,76.567],[-89.412,76.68],[-89.533,76.854],[-86.614,77.181],[-87.712,77.36],[-88.223,77.856],[-86.422,77.831],[-85.794,77.42],[-84.529,77.296],[-83.465,77.348],[-83.836,77.455],[-82.319,78.071],[-83.873,77.493],[-84.859,77.543],[-84.49,77.746],[-85.299,77.661],[-84.955,77.836],[-85.39,77.842],[-84.314,77.892],[-85.679,77.929],[-84.026,78.176],[-84.974,78.209],[-84.573,78.351],[-84.867,78.369],[-84.619,78.588],[-85.508,78.099],[-86.288,78.076],[-85.833,78.38],[-87.529,78.132],[-87.087,78.206],[-87.513,78.225],[-87.517,78.426],[-86.639,78.799],[-85.064,78.919],[-82.308,78.569],[-82.594,78.703],[-82.232,78.736],[-83.255,78.835],[-81.713,78.84],[-81.487,79.052],[-82.503,78.883],[-84.767,79.037],[-83.359,79.051],[-84.327,79.189],[-85.05,79.622],[-86.486,79.764],[-86.367,79.963],[-85.255,79.921],[-86.483,80.009],[-86.659,80.128],[-86.515,80.299],[-83.782,80.246],[-81.707,79.587],[-79.905,79.647],[-81.525,79.714],[-81.663,79.903],[-81.4,79.938],[-83.204,80.318],[-78.064,80.565],[-79.96,80.615],[-76.512,80.854],[-78.935,80.876],[-78.464,81.161],[-76.778,81.444],[-79.502,81.194],[-79.089,81.095],[-79.265,80.924],[-80.919,80.656],[-83.097,80.542],[-81.759,80.813],[-83.357,80.686],[-83.569,80.739],[-83.257,80.839],[-83.864,80.757],[-83.841,80.546],[-85.067,80.505],[-86.739,80.597],[-85.774,80.949],[-82.364,81.179],[-85.609,81.054],[-87.458,80.628],[-89.462,80.919],[-84.746,81.289],[-89.629,81.009],[-90.352,81.167],[-88.944,81.244],[-89.952,81.329],[-87.245,81.49],[-90.443,81.367],[-90.857,81.444],[-89.586,81.621],[-91.957,81.659],[-89.333,81.806],[-88.076,82.105],[-84.635,81.886],[-86.876,82.202],[-85.371,82.28],[-85.912,82.436],[-85.047,82.482],[-83.516,82.317],[-83.112,82.065],[-81.878,82.036],[-82.677,82.108],[-83.029,82.277],[-82.654,82.282],[-79.229,81.816],[-82.729,82.408],[-81.476,82.499],[-82.344,82.595],[-81.972,82.666],[-80.582,82.543],[-81.411,82.828],[-78.521,82.677],[-80.393,82.876],[-79.458,82.974],[-77.128,82.863],[-75.892,82.592],[-76.231,82.445],[-75.396,82.615],[-77.184,83.034],[-74.436,83.027],[-72.634,82.694],[-73.651,82.926],[-72.651,83.096],[-70.871,82.881],[-71.497,83.007],[-70.804,83.105],[-67.544,82.962]]],[[[-96.742,76.982],[-93.658,76.91],[-93.18,76.741],[-93.548,76.386],[-93.109,76.616],[-90.986,76.649],[-90.468,76.473],[-91.416,76.46],[-89.192,76.242],[-91.614,76.262],[-90.191,76.061],[-91.161,76.018],[-90.938,76.0],[-91.13,75.839],[-90,76.01],[-89.775,75.787],[-89.164,75.775],[-89.765,75.576],[-88.964,75.432],[-88.739,75.679],[-87.534,75.446],[-87.251,75.621],[-86.597,75.362],[-84.003,75.821],[-81.118,75.776],[-81.271,75.651],[-79.954,75.54],[-80.373,75.463],[-79.586,75.455],[-79.442,75.277],[-79.629,75.175],[-80.441,75.038],[-79.336,74.889],[-80.322,74.938],[-80.098,74.82],[-80.248,74.576],[-81.811,74.457],[-82.914,74.549],[-83.528,74.902],[-83.319,74.767],[-83.612,74.541],[-84.899,74.503],[-84.991,74.698],[-85.259,74.491],[-85.527,74.689],[-85.581,74.498],[-88.535,74.504],[-88.293,74.772],[-88.548,74.908],[-88.836,74.661],[-89.089,74.837],[-89.185,74.587],[-89.929,74.531],[-91.025,74.703],[-90.772,74.885],[-91.226,74.734],[-91.107,74.626],[-91.676,74.672],[-92.066,74.813],[-92.229,75.071],[-92.051,75.147],[-92.504,75.218],[-92.005,75.595],[-92.109,75.859],[-93.061,76.345],[-95.387,76.236],[-94.814,76.329],[-96.947,76.724],[-96.306,76.754],[-96.742,76.982]]],[[[-86.41,64.583],[-86.014,65.709],[-85.543,65.933],[-85.156,65.777],[-85.052,65.607],[-85.312,65.538],[-84.925,65.21],[-84.562,65.481],[-82.092,64.685],[-81.6,64.203],[-81.987,63.994],[-80.935,64.13],[-80.172,63.771],[-81.076,63.451],[-82.472,63.68],[-82.361,63.905],[-83.087,63.955],[-83.02,64.189],[-83.548,64.102],[-83.637,63.766],[-84.283,63.629],[-84.586,63.308],[-85.493,63.12],[-85.711,63.767],[-87.217,63.622],[-86.189,64.102],[-86.41,64.583]]],[[[-94.342,81.11],[-93.123,81.115],[-94.382,81.251],[-94.154,81.36],[-92.148,81.236],[-90.665,80.685],[-90.766,80.566],[-89.245,80.517],[-89.059,80.461],[-89.251,80.278],[-88.535,80.099],[-88.146,80.094],[-88.649,80.394],[-87.684,80.41],[-87.563,80.179],[-88.066,80.121],[-87.037,79.962],[-87.489,79.841],[-86.958,79.904],[-87.463,79.535],[-86.334,79.646],[-86.071,79.434],[-85.682,79.613],[-84.904,79.268],[-86.983,79.057],[-87.616,78.645],[-88.003,78.807],[-87.746,79.086],[-88.202,78.976],[-88.13,78.685],[-88.352,78.653],[-87.908,78.549],[-88.804,78.61],[-88.536,78.413],[-88.818,78.154],[-90,78.61],[-89.452,78.162],[-90.186,78.333],[-90.744,78.323],[-90.325,78.272],[-90.465,78.135],[-92.083,78.212],[-92.979,78.483],[-91.658,78.564],[-93.271,78.584],[-93.814,78.766],[-93.038,78.766],[-94.282,78.969],[-90.363,79.247],[-92.447,79.223],[-91.129,79.391],[-93.091,79.482],[-95.235,79.286],[-95.736,79.537],[-94.318,79.779],[-95.853,79.646],[-96.803,80.091],[-94.417,79.979],[-94.804,80.093],[-94.12,80.183],[-96.682,80.342],[-95.441,80.338],[-95.98,80.585],[-93.786,80.526],[-95.534,80.819],[-94.905,81.057],[-93.936,81.018],[-94.342,81.11]]],[[[-101.086,73.326],[-101.621,73.49],[-100.415,73.418],[-101.118,73.723],[-100.027,73.73],[-99.843,73.878],[-100.143,73.931],[-99.189,73.685],[-97.224,73.856],[-96.969,73.633],[-97.668,73.483],[-97.172,73.353],[-97.841,73.273],[-98.51,73.009],[-98.446,72.866],[-97.283,72.964],[-97.415,72.86],[-97.03,72.717],[-97.197,72.604],[-96.537,72.75],[-96.298,72.416],[-96.872,72.321],[-96.533,72.237],[-96.867,72.041],[-96.489,72.035],[-96.764,71.915],[-96.571,71.819],[-98.207,71.646],[-98.267,71.904],[-98.494,71.714],[-98.038,71.527],[-98.198,71.415],[-99.238,71.345],[-100.634,72.186],[-101.777,72.3],[-102.742,72.724],[-102.501,73.031],[-101.962,73.089],[-101.367,72.725],[-100.448,72.736],[-100.422,73.035],[-100.031,72.935],[-100.545,73.228],[-99.772,73.208],[-101.086,73.326]]],[[[-95.601,73.284],[-95.659,73.732],[-94.618,73.651],[-95.325,73.952],[-94.732,74.095],[-90.204,73.888],[-91.634,73.229],[-91.368,73.201],[-92.066,72.752],[-94.298,72.77],[-93.463,72.462],[-94.228,72.04],[-94.063,71.978],[-95.208,71.989],[-94.752,72.153],[-95.171,72.139],[-95.133,72.46],[-95.602,72.702],[-95.601,73.284]]],[[[-99.455,75.975],[-100.221,76.132],[-99.414,76.158],[-100.439,76.212],[-99.849,76.284],[-100.982,76.505],[-99.684,76.633],[-99.08,76.397],[-98.846,76.436],[-99.027,76.601],[-98.48,76.679],[-97.663,76.481],[-97.558,75.864],[-97.939,75.741],[-97.387,75.683],[-97.281,75.397],[-98.043,75.481],[-97.775,75.423],[-98.129,75.302],[-97.567,75.147],[-98.099,75.223],[-97.982,75.015],[-100.394,75.037],[-100.539,75.205],[-99.988,75.236],[-100.698,75.436],[-98.972,75.71],[-102.878,75.625],[-102.009,75.703],[-102.366,75.79],[-101.864,75.902],[-100.911,75.812],[-101.849,76.025],[-101.385,76.249],[-102.133,76.22],[-101.862,76.45],[-100.145,75.908],[-99.455,75.975]]],[[[-99.58,69.044],[-98.393,69.308],[-98.557,69.581],[-98.004,69.436],[-98.368,69.601],[-97.974,69.892],[-96.218,69.311],[-96.23,69.055],[-96.048,69.228],[-95.834,68.873],[-95.207,68.85],[-96.504,68.446],[-99.58,69.044]]],[[[-104.042,78.621],[-103.319,78.74],[-104.199,78.77],[-103.822,78.898],[-104.204,78.992],[-105.012,78.804],[-104.681,79.017],[-105.629,79.161],[-103.723,79.357],[-102.877,79.233],[-102.579,78.873],[-101.942,79.085],[-100.987,78.937],[-101.186,78.803],[-100.351,78.828],[-99.53,78.578],[-99.794,78.297],[-98.946,78.062],[-99.907,77.779],[-100.607,77.86],[-101.036,78.196],[-104.467,78.265],[-105.043,78.506],[-103.524,78.496],[-104.042,78.621]]],[[[-80.772,73.75],[-77.424,73.555],[-76.059,72.901],[-79.594,72.753],[-79.999,72.863],[-80.152,73.222],[-80.876,73.328],[-80.772,73.75]]],[[[-75,68.12],[-75.072,67.539],[-75.908,67.249],[-77.045,67.261],[-77.323,67.698],[-76.607,68.279],[-75,68.12]]],[[[-95.959,74.856],[-96.614,74.985],[-96.463,75.193],[-94.883,75.636],[-93.677,75.357],[-93.406,74.884],[-93.485,74.688],[-94.643,74.624],[-95.959,74.856]]],[[[-82.186,62.98],[-81.866,62.923],[-81.939,62.71],[-83.002,62.204],[-83.704,62.142],[-83.945,62.427],[-83.374,62.907],[-82.186,62.98]]],[[[-97.949,78.816],[-94.895,78.396],[-95.399,78.231],[-94.888,78.059],[-97.097,77.803],[-97.776,78.035],[-96.871,78.133],[-97.927,78.218],[-98.411,78.49],[-98.019,78.543],[-98.365,78.768],[-97.949,78.816]]],[[[-105.226,72.933],[-107.034,73.486],[-106.206,73.734],[-104.581,73.6],[-104.573,73.323],[-105.226,72.933]]],[[[-79.541,61.8],[-79.846,61.57],[-80.275,61.807],[-80.269,62.107],[-79.947,62.386],[-79.443,62.38],[-79.261,62.164],[-79.541,61.8]]],[[[-81.088,53.179],[-80.713,52.689],[-82.063,53.027],[-81.088,53.179]]],[[[-83.921,66.01],[-83.211,65.706],[-84.144,65.764],[-84.47,66.133],[-83.921,66.01]]],[[[-93.175,77.704],[-93.571,77.438],[-96.329,77.605],[-95.465,77.808],[-93.175,77.704]]],[[[-73.655,68.008],[-73.412,67.975],[-73.449,67.762],[-74.481,67.789],[-74.778,68.006],[-74.339,68.177],[-73.655,68.008]]],[[[-105.649,77.749],[-104.368,77.224],[-105.396,77.213],[-106.092,77.715],[-105.649,77.749]]],[[[-78.213,63.496],[-77.495,63.266],[-77.958,63.093],[-78.562,63.396],[-78.213,63.496]]],[[[-78.459,69.39],[-78.214,69.288],[-78.725,68.969],[-79.4,68.872],[-78.459,69.39]]],[[[-79.768,69.753],[-79.329,69.701],[-80.059,69.644],[-80.012,69.492],[-80.809,69.683],[-79.768,69.753]]],[[[-90,77.548],[-89.636,77.339],[-90,77.214],[-91.209,77.415],[-90.906,77.653],[-90,77.548]]],[[[-97.654,74.1],[-98.393,73.845],[-99.438,73.897],[-97.654,74.1]]],[[[-104.152,75.435],[-103.803,75.36],[-103.583,75.165],[-103.73,75.1],[-104.931,75.132],[-104.152,75.435]]],[[[-86.435,68.162],[-86.572,67.729],[-86.946,67.909],[-86.712,68.299],[-86.435,68.162]]],[[[-70.588,62.774],[-70.212,62.578],[-70.724,62.55],[-70.92,62.741],[-70.771,62.767],[-71.241,62.881],[-70.588,62.774]]],[[[-104.134,76.669],[-103.005,76.43],[-104.379,76.323],[-104.683,76.597],[-104.134,76.669]]],[[[-84.91,66],[-84.668,65.561],[-85.118,65.765],[-85.173,65.995],[-84.91,66]]],[[[-64.66,61.588],[-64.875,61.322],[-65.488,61.599],[-64.66,61.588]]],[[[-98.83,79.664],[-100.193,80.034],[-98.869,80.078],[-98.644,79.8],[-98.83,79.664]]],[[[-102.652,76.288],[-102.529,76.154],[-103.342,76.037],[-104.483,76.142],[-102.652,76.288]]],[[[-76.682,63.481],[-76.542,63.462],[-76.65,63.431],[-76.632,63.412],[-76.692,63.368],[-76.974,63.404],[-77.243,63.544],[-77.428,63.589],[-77.401,63.598],[-77.44,63.619],[-77.334,63.627],[-77.457,63.643],[-77.343,63.696],[-77.117,63.654],[-77.122,63.68],[-77.061,63.673],[-76.616,63.523],[-76.682,63.481]]],[[[-79.058,54.918],[-79.777,54.778],[-79.682,54.81],[-79.728,54.813],[-79.687,54.838],[-79.467,54.888],[-79.054,54.947],[-79.015,54.932],[-79.058,54.918]]],[[[-64.326,63.638],[-64.061,63.271],[-64.422,63.472],[-64.326,63.638]]],[[[-75,68.672],[-74.811,68.321],[-75.416,68.518],[-75,68.672]]],[[[-78.142,69.742],[-77.947,69.647],[-78.088,69.577],[-78.88,69.477],[-78.142,69.742]]],[[[-90,76.838],[-89.674,76.737],[-89.863,76.604],[-89.671,76.504],[-90.6,76.735],[-90,76.838]]],[[[-77.114,69.442],[-76.647,69.337],[-77.214,69.126],[-77.36,69.393],[-77.114,69.442]]],[[[-96.025,75.603],[-96.851,75.35],[-97.053,75.492],[-96.025,75.603]]],[[[-101.989,75.934],[-102.394,75.881],[-102.497,75.796],[-102.612,75.767],[-103.138,75.743],[-103.383,75.766],[-103.247,75.797],[-103.298,75.81],[-103.051,75.832],[-103.147,75.854],[-103.059,75.896],[-102.696,75.947],[-102.165,75.991],[-101.989,75.934]]],[[[-67.949,60.561],[-67.853,60.375],[-68.387,60.241],[-67.949,60.561]]],[[[-78.893,76.116],[-79.177,75.946],[-78.879,75.844],[-79.752,75.879],[-78.893,76.116]]],[[[-101.672,77.893],[-101.118,77.714],[-102.53,77.834],[-101.672,77.893]]],[[[-95.489,69.566],[-95.516,69.331],[-95.816,69.563],[-95.991,69.353],[-95.92,69.595],[-95.489,69.566]]],[[[-71.795,71.053],[-71.34,70.991],[-72.112,70.811],[-72.226,70.931],[-71.795,71.053]]],[[[-102.353,76.074],[-102.316,76.037],[-102.366,76.006],[-103.339,75.908],[-103.7,75.887],[-103.902,75.899],[-103.972,75.938],[-102.868,76.067],[-102.353,76.074]]],[[[-101.694,68.768],[-101.831,68.567],[-102.349,68.683],[-101.694,68.768]]],[[[-100.324,68.996],[-100.176,68.795],[-100.628,68.766],[-100.624,68.996],[-100.324,68.996]]],[[[-100.297,76.722],[-101.274,76.561],[-101.688,76.586],[-100.716,76.756],[-100.297,76.722]]],[[[-87.266,70.114],[-87.103,70.121],[-87.145,70.143],[-87.091,70.15],[-86.799,70.087],[-86.64,70.117],[-86.457,70.007],[-86.662,69.967],[-87.002,70.015],[-87.104,69.988],[-87.377,70.093],[-87.266,70.114]]],[[[-96.136,69.546],[-96.147,69.346],[-96.737,69.577],[-96.136,69.546]]],[[[-79.297,52.092],[-79.253,52.071],[-79.322,52.032],[-79.32,51.97],[-79.377,51.936],[-79.612,51.914],[-79.653,51.981],[-79.623,52.025],[-79.538,52.023],[-79.338,52.11],[-79.297,52.092]]],[[[-64.383,62.526],[-64.364,62.496],[-64.482,62.482],[-64.394,62.461],[-64.505,62.443],[-64.477,62.408],[-64.591,62.367],[-64.927,62.418],[-64.966,62.466],[-64.793,62.491],[-64.862,62.521],[-64.816,62.56],[-64.683,62.532],[-64.55,62.536],[-64.55,62.562],[-64.467,62.544],[-64.463,62.514],[-64.383,62.526]]],[[[-64.549,63.895],[-64.436,63.673],[-64.916,63.806],[-64.549,63.895]]],[[[-73.061,71.295],[-73.38,71.52],[-72.827,71.455],[-73.061,71.295]]],[[[-85.924,79.054],[-85.167,79.021],[-86.388,78.883],[-85.924,79.054]]],[[[-104.683,68.574],[-104.545,68.396],[-105.082,68.546],[-104.683,68.574]]],[[[-96.772,73.182],[-96.658,72.954],[-97.14,73.052],[-96.772,73.182]]],[[[-65.068,61.924],[-64.829,61.752],[-65.211,61.817],[-65.068,61.924]]],[[[-65.266,64.693],[-65.309,64.66],[-65.25,64.664],[-65.214,64.626],[-65.429,64.591],[-65.363,64.58],[-65.397,64.556],[-65.539,64.547],[-65.461,64.521],[-65.69,64.52],[-65.66,64.574],[-65.449,64.679],[-65.414,64.734],[-65.381,64.734],[-65.402,64.646],[-65.297,64.734],[-65.266,64.693]]],[[[-100.461,70.66],[-100.224,70.457],[-100.676,70.563],[-100.461,70.66]]],[[[-78.795,68.439],[-78.943,68.512],[-78.669,68.583],[-78.898,68.649],[-78.461,68.617],[-78.795,68.439]]],[[[-94.482,75.974],[-94.354,75.754],[-94.906,75.931],[-94.482,75.974]]],[[[-78.227,60.809],[-78.397,60.744],[-78.656,60.703],[-78.698,60.722],[-78.574,60.784],[-78.224,60.831],[-78.227,60.809]]],[[[-73.669,64.427],[-73.509,64.552],[-73.558,64.313],[-73.669,64.427]]],[[[-101.053,69.504],[-101.23,69.369],[-101.387,69.538],[-101.053,69.504]]],[[[-74.481,62.74],[-74.374,62.681],[-74.016,62.665],[-73.958,62.612],[-74.169,62.602],[-74.541,62.668],[-74.651,62.718],[-74.481,62.74]]],[[[-74.341,68.462],[-74.27,68.455],[-74.075,68.331],[-74.15,68.25],[-74.229,68.251],[-74.278,68.295],[-74.213,68.319],[-74.389,68.398],[-74.393,68.445],[-74.341,68.462]]],[[[-79.099,68.349],[-78.802,68.272],[-79.09,68.17],[-79.099,68.349]]],[[[-67.87,69.701],[-67.721,69.645],[-67.92,69.522],[-68.31,69.591],[-67.87,69.701]]],[[[-90.195,69.417],[-90.155,69.351],[-90.329,69.236],[-90.51,69.335],[-90.501,69.372],[-90.351,69.425],[-90.294,69.434],[-90.242,69.389],[-90.219,69.402],[-90.245,69.427],[-90.205,69.446],[-90.195,69.417]]],[[[-62.895,67.059],[-62.81,67.057],[-62.796,67.1],[-62.62,67.135],[-62.652,67.166],[-62.632,67.177],[-62.418,67.191],[-62.375,67.166],[-62.58,67.102],[-62.652,67.047],[-62.734,67.043],[-62.752,67.011],[-62.895,67.059]]],[[[-97.368,74.623],[-97.257,74.591],[-97.388,74.506],[-97.653,74.456],[-97.793,74.486],[-97.631,74.538],[-97.617,74.575],[-97.532,74.606],[-97.368,74.623]]],[[[-95.629,74.641],[-95.404,74.603],[-95.246,74.522],[-95.481,74.5],[-95.845,74.564],[-95.629,74.641]]],[[[-66.327,68.147],[-66.629,68.182],[-66.662,68.209],[-66.552,68.202],[-66.5,68.24],[-66.349,68.229],[-66.283,68.268],[-66.199,68.267],[-66.269,68.211],[-66.257,68.164],[-66.327,68.147]]],[[[-90.576,69.199],[-90.613,69.208],[-90.62,69.252],[-90.691,69.228],[-90.646,69.259],[-90.696,69.278],[-90.655,69.305],[-90.681,69.311],[-90.652,69.351],[-90.777,69.272],[-90.776,69.33],[-90.673,69.374],[-90.559,69.347],[-90.472,69.281],[-90.495,69.242],[-90.454,69.226],[-90.576,69.199]]],[[[-82.936,66.251],[-82.996,66.199],[-83.08,66.197],[-83.287,66.256],[-83.272,66.305],[-83.298,66.314],[-83.252,66.345],[-83.142,66.309],[-83.168,66.284],[-83.055,66.255],[-82.913,66.276],[-82.936,66.251]]],[[[-64.955,63.554],[-64.881,63.486],[-64.848,63.388],[-64.942,63.431],[-64.972,63.495],[-65.053,63.548],[-64.987,63.515],[-65.008,63.556],[-64.955,63.554]]],[[[-100.096,69.117],[-100.007,68.939],[-100.257,69.027],[-100.096,69.117]]],[[[-85.26,77.587],[-85.011,77.574],[-84.814,77.497],[-85.168,77.457],[-85.153,77.508],[-85.538,77.54],[-85.26,77.587]]],[[[-77.625,63.998],[-77.753,63.926],[-77.982,63.976],[-77.944,64.011],[-77.774,64.032],[-77.557,64.028],[-77.625,63.998]]],[[[-107.883,67.462],[-107.893,67.384],[-107.934,67.362],[-107.911,67.311],[-108.151,67.406],[-108.125,67.422],[-108.041,67.387],[-108.033,67.407],[-108.075,67.42],[-108.061,67.442],[-107.918,67.489],[-107.883,67.462]]],[[[-62.259,65.729],[-62.298,65.709],[-62.186,65.712],[-62.168,65.703],[-62.199,65.686],[-62.128,65.674],[-62.215,65.61],[-62.272,65.663],[-62.332,65.612],[-62.313,65.661],[-62.466,65.664],[-62.442,65.689],[-62.484,65.727],[-62.444,65.745],[-62.374,65.72],[-62.32,65.749],[-62.259,65.729]]],[[[-79.93,59.874],[-79.879,59.855],[-79.928,59.812],[-80.09,59.752],[-80.091,59.808],[-80.184,59.748],[-80.103,59.845],[-80.015,59.885],[-79.93,59.874]]],[[[-63.926,67.633],[-63.761,67.515],[-64.025,67.511],[-63.926,67.633]]],[[[-96.688,72.883],[-96.722,72.829],[-96.641,72.782],[-96.741,72.726],[-96.955,72.734],[-97.011,72.776],[-96.921,72.795],[-96.921,72.836],[-96.799,72.881],[-96.688,72.883]]],[[[-95.065,80.681],[-94.971,80.635],[-95.19,80.609],[-96.149,80.665],[-95.491,80.7],[-95.065,80.681]]],[[[-79.784,56.941],[-79.717,56.814],[-79.758,56.782],[-79.793,56.79],[-79.811,56.892],[-79.898,56.885],[-79.859,56.939],[-79.784,56.941]]],[[[-90.027,68.753],[-90.003,68.807],[-89.914,68.853],[-89.896,68.83],[-89.926,68.804],[-89.856,68.822],[-89.862,68.798],[-89.782,68.767],[-89.944,68.662],[-89.959,68.677],[-89.916,68.705],[-89.967,68.695],[-89.957,68.725],[-90.027,68.753]]],[[[-107.983,67.645],[-107.922,67.541],[-108.067,67.54],[-108.03,67.499],[-108.109,67.471],[-108.143,67.542],[-108.074,67.558],[-108.12,67.576],[-108.118,67.67],[-107.983,67.645]]],[[[-100.48,75.546],[-100.32,75.591],[-100.886,75.546],[-101.039,75.567],[-100.235,75.623],[-100.158,75.585],[-100.48,75.546]]],[[[-63.456,67.264],[-63.83,67.284],[-63.586,67.353],[-63.589,67.305],[-63.485,67.341],[-63.369,67.302],[-63.456,67.264]]],[[[-74.772,68.673],[-74.648,68.652],[-74.654,68.608],[-74.518,68.559],[-74.834,68.57],[-74.89,68.625],[-74.772,68.673]]],[[[-91.535,69.727],[-91.736,69.789],[-91.419,69.88],[-91.535,69.727]]],[[[-102.897,78.269],[-102.799,78.25],[-102.781,78.205],[-103.042,78.122],[-103.213,78.121],[-103.282,78.158],[-103.063,78.258],[-102.897,78.269]]],[[[-79.707,57.581],[-79.705,57.509],[-79.771,57.514],[-79.806,57.418],[-79.856,57.48],[-79.811,57.482],[-79.777,57.531],[-79.827,57.538],[-79.734,57.619],[-79.707,57.581]]],[[[-91.072,77.253],[-90.815,77.24],[-90.714,77.201],[-90.868,77.138],[-91.185,77.164],[-91.299,77.218],[-91.072,77.253]]],[[[-64.172,63.634],[-64.078,63.551],[-64.106,63.532],[-64.092,63.482],[-64.209,63.575],[-64.213,63.624],[-64.172,63.634]]],[[[-64.999,64.354],[-64.989,64.318],[-65.038,64.29],[-64.885,64.288],[-64.989,64.209],[-65.066,64.227],[-65.115,64.329],[-64.999,64.354]]],[[[-99.529,76.726],[-99.434,76.695],[-99.582,76.67],[-99.658,76.681],[-99.552,76.71],[-100.129,76.722],[-100.038,76.751],[-99.529,76.726]]],[[[-108.951,67.973],[-108.884,67.949],[-108.911,67.924],[-108.866,67.9],[-108.901,67.87],[-109.199,67.972],[-109.059,67.952],[-109.074,67.974],[-108.951,67.973]]],[[[-72.925,71.649],[-72.709,71.655],[-72.661,71.598],[-72.742,71.534],[-72.95,71.547],[-73.04,71.58],[-72.925,71.649]]],[[[-67.441,69.588],[-67.311,69.549],[-67.545,69.526],[-67.492,69.496],[-67.75,69.521],[-67.55,69.566],[-67.518,69.6],[-67.441,69.588]]],[[[-82.796,69.805],[-82.46,69.762],[-82.495,69.752],[-82.453,69.721],[-82.543,69.704],[-82.72,69.733],[-82.878,69.775],[-82.796,69.805]]],[[[-65.714,61.824],[-65.679,61.747],[-65.948,61.79],[-65.809,61.863],[-65.752,61.851],[-65.795,61.843],[-65.781,61.826],[-65.714,61.824]]],[[[-107.582,67.196],[-107.32,67.099],[-107.528,67.078],[-107.629,67.183],[-107.582,67.196]]],[[[-66.821,66.388],[-66.574,66.311],[-66.642,66.279],[-66.812,66.317],[-66.848,66.342],[-66.783,66.339],[-66.959,66.406],[-66.821,66.388]]],[[[-93.087,61.829],[-93.136,61.872],[-93.219,61.879],[-93.224,61.913],[-93.062,61.931],[-92.969,61.888],[-93.002,61.847],[-93.087,61.829]]],[[[-79.952,53.348],[-79.957,53.312],[-79.912,53.291],[-79.943,53.267],[-80.018,53.266],[-80.085,53.327],[-80.061,53.356],[-79.945,53.368],[-79.952,53.348]]],[[[-88.053,78.446],[-88.057,78.407],[-88.154,78.366],[-88.166,78.308],[-88.255,78.247],[-88.36,78.238],[-88.408,78.264],[-88.404,78.298],[-88.327,78.337],[-88.2,78.354],[-88.248,78.373],[-88.235,78.427],[-88.053,78.446]]],[[[-107.645,73.57],[-107.931,73.539],[-108.085,73.586],[-108.007,73.619],[-107.681,73.621],[-107.585,73.603],[-107.645,73.57]]],[[[-68.419,68.81],[-67.661,68.702],[-67.87,68.699],[-68.451,68.784],[-68.419,68.81]]],[[[-64.334,63.852],[-64.18,63.866],[-64.179,63.811],[-64.237,63.796],[-64.181,63.785],[-64.257,63.774],[-64.398,63.846],[-64.334,63.852]]],[[[-78.94,72.436],[-78.732,72.369],[-78.95,72.335],[-79.053,72.361],[-79.067,72.42],[-78.94,72.436]]],[[[-83.577,69.781],[-83.709,69.759],[-83.656,69.732],[-83.689,69.719],[-83.917,69.779],[-83.887,69.819],[-83.832,69.825],[-83.577,69.781]]],[[[-64.885,62.594],[-64.839,62.578],[-64.861,62.561],[-64.973,62.53],[-65.142,62.547],[-65.003,62.599],[-64.885,62.594]]],[[[-110.728,68.484],[-111.098,68.477],[-110.822,68.548],[-110.746,68.526],[-110.696,68.486],[-110.728,68.484]]],[[[-97.327,69.932],[-97.347,69.897],[-97.231,69.883],[-97.269,69.852],[-97.493,69.918],[-97.454,69.963],[-97.327,69.932]]],[[[-73.731,64.386],[-73.698,64.27],[-73.781,64.283],[-73.834,64.332],[-73.781,64.406],[-73.731,64.386]]],[[[-83.348,65.832],[-83.485,65.801],[-83.586,65.854],[-83.37,65.867],[-83.285,65.839],[-83.348,65.832]]],[[[-109.447,68.092],[-109.315,68.036],[-109.314,67.986],[-109.539,68.047],[-109.47,68.045],[-109.505,68.089],[-109.447,68.092]]],[[[-82.01,68.333],[-82.073,68.303],[-82.346,68.368],[-82.235,68.354],[-82.243,68.383],[-82.217,68.384],[-82.01,68.333]]],[[[-79.552,72.451],[-79.436,72.418],[-79.441,72.371],[-79.534,72.346],[-79.609,72.367],[-79.683,72.431],[-79.552,72.451]]],[[[-101.52,69.197],[-101.495,69.16],[-101.564,69.1],[-101.698,69.095],[-101.601,69.152],[-101.71,69.169],[-101.695,69.207],[-101.52,69.197]]],[[[-74.556,78.776],[-74.164,78.716],[-74.334,78.675],[-74.614,78.703],[-74.707,78.737],[-74.632,78.777],[-74.556,78.776]]],[[[-94.515,78.278],[-94.309,78.179],[-94.506,78.173],[-94.671,78.241],[-94.694,78.259],[-94.661,78.279],[-94.515,78.278]]],[[[-97.338,67.721],[-97.327,67.682],[-97.371,67.658],[-97.503,67.624],[-97.551,67.643],[-97.53,67.676],[-97.561,67.693],[-97.338,67.721]]],[[[-108.286,67.533],[-108.302,67.491],[-108.368,67.467],[-108.496,67.524],[-108.467,67.541],[-108.491,67.563],[-108.458,67.568],[-108.37,67.543],[-108.336,67.566],[-108.286,67.533]]],[[[-111.529,68.291],[-111.605,68.281],[-111.672,68.225],[-111.779,68.241],[-111.704,68.299],[-111.514,68.311],[-111.529,68.291]]],[[[-79.844,56.858],[-79.814,56.817],[-79.877,56.748],[-79.941,56.764],[-79.946,56.834],[-79.844,56.858]]],[[[-73.213,71.699],[-73.15,71.674],[-73.283,71.638],[-73.352,71.557],[-73.451,71.584],[-73.348,71.658],[-73.213,71.699]]],[[[-108.049,67.949],[-108.091,67.881],[-108.254,67.882],[-108.198,67.951],[-108.101,67.975],[-108.049,67.949]]],[[[-90,73.986],[-90.285,74.03],[-90,74.066],[-89.902,74.038],[-90,73.986]]],[[[-62.231,66.269],[-62.148,66.208],[-62.43,66.229],[-62.231,66.269]]],[[[-104.071,77.161],[-103.999,77.124],[-104.197,77.077],[-104.432,77.099],[-104.301,77.155],[-104.071,77.161]]],[[[-77.676,77.865],[-77.569,77.85],[-77.579,77.819],[-77.681,77.793],[-77.875,77.774],[-77.955,77.83],[-77.676,77.865]]],[[[-65.648,68.169],[-65.503,68.151],[-65.496,68.128],[-65.687,68.096],[-65.717,68.176],[-65.648,68.169]]],[[[-90.144,68.968],[-89.914,69.007],[-89.934,68.951],[-89.907,68.922],[-90.144,68.968]]],[[[-95.329,71.842],[-95.26,71.827],[-95.311,71.737],[-95.488,71.741],[-95.361,71.79],[-95.439,71.79],[-95.45,71.819],[-95.329,71.842]]],[[[-95.372,77.238],[-95.216,77.202],[-95.207,77.178],[-95.245,77.164],[-95.64,77.238],[-95.372,77.238]]],[[[-94.854,76.137],[-94.816,76.101],[-94.929,76.051],[-95.049,76.051],[-95.147,76.117],[-95.013,76.106],[-94.854,76.137]]],[[[-82.636,69.871],[-82.517,69.854],[-82.426,69.787],[-82.564,69.801],[-82.689,69.851],[-82.636,69.871]]],[[[-86.067,72.294],[-85.864,72.297],[-85.837,72.263],[-85.908,72.218],[-86.096,72.276],[-86.067,72.294]]],[[[-103.332,75.872],[-103.591,75.831],[-103.864,75.871],[-103.332,75.872]]],[[[-97.243,77.037],[-97.093,77.005],[-97.256,76.967],[-97.473,76.981],[-97.243,77.037]]],[[[-96.456,75.818],[-96.554,75.739],[-96.717,75.74],[-96.661,75.789],[-96.456,75.818]]],[[[-74.708,72.207],[-74.797,72.168],[-74.947,72.173],[-74.851,72.218],[-74.674,72.23],[-74.708,72.207]]],[[[-101.682,78.227],[-101.604,78.187],[-101.626,78.148],[-101.882,78.162],[-101.785,78.187],[-101.753,78.227],[-101.682,78.227]]],[[[-84.098,76.507],[-83.908,76.465],[-83.986,76.423],[-84.109,76.444],[-84.104,76.484],[-84.139,76.507],[-84.098,76.507]]],[[[-62.961,67.055],[-62.912,67.015],[-62.978,67.007],[-63.139,67.059],[-63.111,67.08],[-62.961,67.055]]],[[[-66.644,81.562],[-66.897,81.587],[-66.297,81.585],[-66.644,81.562]]],[[[-71.044,71.143],[-71.113,71.089],[-71.255,71.074],[-71.201,71.126],[-71.044,71.143]]],[[[-78.419,82.899],[-78.415,82.942],[-78.362,82.959],[-78.117,82.942],[-78.366,82.884],[-78.419,82.899]]],[[[-91.762,81.548],[-91.961,81.595],[-91.582,81.578],[-91.762,81.548]]]]},\"properties\":{\"name\":\"Nunavut\"}},{\"type\":\"Feature\",\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[-110.394,78.752],[-109.978,78.671],[-109.984,78.326],[-113.334,78.333],[-110.394,78.752]]],[[[-109.987,77.924],[-110.896,77.856],[-110.105,77.775],[-110.225,77.505],[-112.057,77.323],[-113.198,77.524],[-113.32,77.796],[-111.093,78.092],[-109.986,78.101],[-109.987,77.924]]],[[[-110.008,74.833],[-113.472,74.419],[-114.394,74.708],[-111.551,75.011],[-111.068,75.272],[-113.941,75.057],[-113.647,75.184],[-113.929,75.174],[-113.806,75.327],[-113.319,75.418],[-114.065,75.466],[-114.171,75.227],[-114.615,75.275],[-114.395,75.091],[-115.195,74.99],[-115.257,75.18],[-115.691,74.964],[-116.239,75.201],[-117.684,75.253],[-114.998,75.696],[-117.25,75.586],[-116.816,75.796],[-114.799,75.892],[-116.727,75.951],[-116.164,76.197],[-114.681,76.165],[-115.922,76.281],[-114.702,76.515],[-114.118,76.435],[-113.983,76.19],[-112.425,76.168],[-111.728,75.922],[-112.226,75.811],[-111.452,75.837],[-111.271,75.522],[-110.004,75.533],[-110.008,74.833]]],[[[-110.002,75.876],[-110.056,75.891],[-110.002,75.898],[-110.002,75.876]]],[[[-110.0,76.225],[-110.384,76.427],[-109.998,76.475],[-110.0,76.225]]],[[[-117.431,69.995],[-114.543,70.313],[-111.443,70.29],[-113.938,70.715],[-117.544,70.595],[-118.31,70.897],[-117.85,71.157],[-115.058,71.523],[-118.112,71.374],[-118.29,71.482],[-117.701,71.671],[-119.05,71.627],[-119.088,71.908],[-118.113,72.232],[-118.537,72.494],[-117.354,72.916],[-114.562,73.376],[-113.954,73.126],[-113.969,72.813],[-114.558,72.561],[-113.443,72.672],[-113.599,72.783],[-113.007,73.009],[-111.226,72.723],[-111.906,72.35],[-111.643,72.348],[-111.763,72.199],[-111.35,72.453],[-111.033,72.282],[-110.701,72.576],[-110.02,72.442],[-110.029,69.995],[-112.658,69.835],[-117.085,69.999],[-116.514,69.635],[-117.247,69.757],[-117.431,69.995]]],[[[-110.02,72.494],[-110.256,72.557],[-110.104,72.558],[-110.02,72.529],[-110.02,72.494]]],[[[-110.019,72.623],[-110.291,72.671],[-110.178,72.681],[-110.213,72.712],[-110.188,72.726],[-110.078,72.727],[-110.019,72.712],[-110.019,72.623]]],[[[-110.019,72.75],[-110.757,72.971],[-110.018,72.975],[-110.019,72.75]]],[[[-102.002,60.0],[-124.029,60.023],[-124.206,60.457],[-124.614,60.669],[-124.579,60.953],[-126.826,60.755],[-127.142,61.467],[-127.973,61.689],[-128.547,62.122],[-129.294,62.156],[-129.172,62.482],[-129.774,62.874],[-129.599,63.052],[-130.151,63.266],[-129.82,63.483],[-130.321,63.696],[-130.12,63.808],[-130.864,64.043],[-131.142,64.424],[-131.818,64.378],[-131.703,64.536],[-132.622,64.827],[-132.333,65.035],[-132.781,65.23],[-132.174,65.591],[-132.573,65.849],[-132.343,65.982],[-133.629,65.974],[-133.57,66.278],[-133.825,66.317],[-133.587,66.565],[-134.092,66.955],[-133.831,67.003],[-136.165,67.004],[-136.158,67.508],[-136.445,67.716],[-136.446,68.873],[-135.16,68.657],[-135.624,68.886],[-134.846,68.929],[-134.219,68.693],[-134.629,69.009],[-134.154,69.259],[-129.673,70.267],[-129.497,70.021],[-132.838,69.217],[-132.888,68.98],[-133.485,68.85],[-132.918,68.69],[-133.38,68.845],[-132.492,68.801],[-132.865,69.068],[-132.223,69.142],[-131.714,69.398],[-131.97,69.406],[-131.246,69.498],[-131.415,69.297],[-131.161,69.389],[-131.248,69.583],[-131.128,69.362],[-131.094,69.609],[-130.923,69.135],[-130.365,69.694],[-128.9,69.972],[-129.169,69.825],[-128.977,69.675],[-128.343,70.117],[-127.515,70.222],[-128.193,70.387],[-127.997,70.591],[-127.174,70.272],[-126.256,69.527],[-125.426,69.312],[-125.089,69.45],[-125.622,69.419],[-125.118,69.486],[-125.366,69.69],[-124.822,69.715],[-125.276,69.808],[-124.63,69.979],[-125.188,70.009],[-124.436,70.036],[-124.68,70.15],[-124.386,70.145],[-124.501,69.726],[-124.035,69.679],[-124.447,69.367],[-123.381,69.411],[-122.959,69.834],[-120.881,69.639],[-120.665,69.551],[-120.658,68.001],[-112.499,65.506],[-110.652,65.5],[-109.387,64.827],[-101.984,64.213],[-102.002,60.0]]],[[[-119.745,74.026],[-119.465,74.221],[-119.121,74.2],[-119.168,73.987],[-118.674,74.22],[-117.439,74.229],[-115.323,73.474],[-120.251,72.259],[-120.543,71.517],[-123.095,71.08],[-123.949,71.658],[-125.998,71.974],[-124.948,72.571],[-125.114,72.862],[-124.476,72.927],[-124.869,73.081],[-123.775,73.764],[-124.771,74.34],[-121.519,74.549],[-119.525,74.23],[-119.745,74.026]]],[[[-116.145,77.023],[-115.731,76.95],[-116.365,76.926],[-115.897,76.692],[-117.04,76.537],[-116.939,76.346],[-117.32,76.258],[-118.06,76.409],[-117.799,76.818],[-118.338,76.768],[-118.495,76.712],[-118.304,76.552],[-118.976,76.499],[-118.567,76.337],[-119.076,76.083],[-119.714,76.332],[-119.553,76.118],[-119.805,76.109],[-119.481,75.971],[-119.87,75.857],[-120.454,75.816],[-120.384,75.968],[-120.884,76.198],[-120.932,75.96],[-121.295,75.907],[-123.038,76.085],[-119.153,77.326],[-117.023,77.291],[-116.652,77.388],[-117.15,77.457],[-116.417,77.557],[-115.389,77.312],[-116.269,77.19],[-116.145,77.023]]],[[[-135.85,69.007],[-135.518,69.024],[-135.915,69.257],[-135.411,69.097],[-135.804,69.317],[-134.408,69.474],[-134.596,69.514],[-134.491,69.722],[-133.748,69.542],[-134.676,69.011],[-134.227,68.696],[-134.834,68.987],[-135.85,69.007]]],[[[-117.623,76.114],[-118.204,75.599],[-119.408,75.606],[-117.623,76.114]]],[[[-114.193,77.698],[-115.116,77.958],[-114.287,78.066],[-113.576,77.814],[-114.193,77.698]]],[[[-114.055,76.704],[-114.876,76.771],[-113.808,76.889],[-113.454,76.773],[-114.055,76.704]]],[[[-120.868,75.913],[-120.898,75.826],[-121.033,75.738],[-121.288,75.753],[-121.029,75.811],[-120.998,75.868],[-121.048,75.9],[-120.998,75.926],[-120.878,75.936],[-120.868,75.913]]],[[[-112.237,70.362],[-111.672,70.307],[-112.09,70.296],[-112.318,70.346],[-112.237,70.362]]],[[[-109.883,68.114],[-109.932,68.079],[-110.259,68.042],[-109.922,68.134],[-109.883,68.114]]],[[[-128.12,70.597],[-128.144,70.568],[-128.231,70.598],[-128.242,70.57],[-128.342,70.542],[-128.234,70.656],[-128.095,70.621],[-128.12,70.597]]],[[[-117.183,70.537],[-117.302,70.562],[-117.199,70.592],[-116.879,70.547],[-117.183,70.537]]],[[[-135.298,69.305],[-135.566,69.391],[-135.338,69.389],[-135.339,69.351],[-135.272,69.358],[-135.298,69.305]]],[[[-122.633,75.92],[-122.324,75.9],[-122.341,75.863],[-122.399,75.859],[-122.692,75.9],[-122.633,75.92]]],[[[-124.308,73.632],[-124.114,73.564],[-124.344,73.56],[-124.359,73.63],[-124.308,73.632]]],[[[-113.779,77.104],[-113.931,77.13],[-113.699,77.145],[-113.664,77.123],[-113.779,77.104]]]]},\"properties\":{\"name\":\"Northwest Territories\"}},{\"type\":\"Feature\",\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[-64.483,47.918],[-64.515,47.833],[-64.605,47.748],[-64.647,47.729],[-64.691,47.753],[-64.646,47.789],[-64.703,47.824],[-64.668,47.867],[-64.609,47.887],[-64.533,47.864],[-64.483,47.918]]],[[[-69.04,47.297],[-68.38,47.559],[-68.373,47.925],[-68.116,48.002],[-67.364,47.841],[-66.357,48.073],[-65.635,47.621],[-64.824,47.811],[-64.677,47.736],[-64.91,47.353],[-65.37,47.087],[-64.799,47.08],[-64.905,46.851],[-64.559,46.22],[-63.776,46.121],[-64.482,45.723],[-64.754,46.089],[-64.642,45.717],[-65.74,45.245],[-66.126,45.304],[-66.003,45.462],[-66.441,45.073],[-67.346,45.122],[-67.44,45.592],[-67.804,45.678],[-67.792,47.061],[-68.231,47.352],[-69.04,47.297]]]]},\"properties\":{\"name\":\"New Brunswick\"}},{\"type\":\"Feature\",\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[-60.91,45.546],[-61.0,45.456],[-61.021,45.469],[-60.999,45.494],[-61.072,45.502],[-61.108,45.541],[-61.017,45.575],[-60.9,45.576],[-60.879,45.556],[-60.91,45.546]]],[[[-66.765,44.801],[-66.735,44.729],[-66.761,44.676],[-66.9,44.613],[-66.859,44.743],[-66.765,44.801]]],[[[-60.596,46.196],[-61.113,45.955],[-60.734,46.047],[-61.143,45.696],[-60.734,45.674],[-60.396,45.996],[-60.785,45.946],[-60.348,46.311],[-59.811,46.163],[-59.819,45.929],[-60.673,45.564],[-61.455,45.706],[-61.548,46.026],[-60.592,47.033],[-60.302,46.837],[-60.596,46.196]]],[[[-64.043,45.992],[-62.673,45.768],[-62.744,45.611],[-61.917,45.886],[-61.881,45.687],[-61.229,45.502],[-61.457,45.344],[-60.97,45.27],[-62.84,44.711],[-63.658,44.715],[-63.631,44.436],[-63.932,44.513],[-63.887,44.691],[-64.083,44.467],[-64.302,44.561],[-64.239,44.294],[-64.431,44.338],[-64.835,43.825],[-65.726,43.502],[-65.861,43.804],[-66.123,43.741],[-66.212,44.095],[-65.841,44.574],[-66.103,44.5],[-64.489,45.335],[-64.156,44.978],[-64.153,45.193],[-63.361,45.361],[-64.937,45.327],[-64.043,45.992]]]]},\"properties\":{\"name\":\"Nova Scotia\"}},{\"type\":\"Feature\",\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[-102.002,60.0],[-102.001,55.83],[-101.367,49],[-110.001,49],[-110.001,59.995],[-102.002,60.0]]]]},\"properties\":{\"name\":\"Saskatchewan\"}},{\"type\":\"Feature\",\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[-114.06,49],[-114.738,49.609],[-114.659,50.065],[-115.017,50.575],[-115.647,50.855],[-116.659,51.797],[-116.919,51.709],[-117.319,52.182],[-117.76,52.201],[-118.006,52.488],[-118.223,52.366],[-118.76,53.125],[-119.902,53.52],[-119.735,53.635],[-120.001,53.808],[-119.983,59.989],[-110.001,59.995],[-110.001,49],[-114.06,49]]]]},\"properties\":{\"name\":\"Alberta\"}},{\"type\":\"Feature\",\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[-63.989,46.394],[-64.071,46.636],[-64.417,46.681],[-63.999,47.062],[-63.938,46.477],[-61.971,46.457],[-62.747,45.948],[-63.122,46.212],[-62.963,46.32],[-63.262,46.138],[-63.989,46.394]]]]},\"properties\":{\"name\":\"Prince Edward Island\"}},{\"type\":\"Feature\",\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[-139.121,69.529],[-139.252,69.58],[-139.333,69.566],[-139.133,69.648],[-138.867,69.588],[-139.023,69.581],[-139.121,69.529]]],[[[-123.817,59.995],[-138.939,59.998],[-139.189,60.089],[-139.068,60.352],[-140.995,60.307],[-141.003,69.642],[-139.143,69.511],[-136.42,68.901],[-136.445,67.716],[-136.158,67.508],[-136.165,67.004],[-133.831,67.003],[-134.092,66.955],[-133.587,66.565],[-133.825,66.317],[-133.57,66.278],[-133.629,65.974],[-132.343,65.982],[-132.573,65.849],[-132.174,65.591],[-132.781,65.23],[-132.333,65.035],[-132.622,64.827],[-131.703,64.536],[-131.818,64.378],[-131.142,64.424],[-130.864,64.043],[-130.12,63.808],[-130.321,63.696],[-129.82,63.483],[-130.151,63.266],[-129.599,63.052],[-129.774,62.874],[-129.172,62.482],[-129.294,62.156],[-128.547,62.122],[-127.973,61.689],[-127.142,61.467],[-126.826,60.755],[-124.579,60.953],[-124.614,60.669],[-123.817,59.995]]]]},\"properties\":{\"name\":\"Yukon Territory\"}},{\"type\":\"Feature\",\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[-102.002,60.0],[-94.8,60.0],[-94.659,59.351],[-94.996,59.054],[-94.203,58.804],[-94.363,58.219],[-94.177,58.771],[-93.152,58.738],[-92.419,57.337],[-92.876,56.907],[-91.002,57.261],[-89.18,56.869],[-95.15,52.826],[-95.158,49],[-101.367,49],[-102.001,55.83],[-102.002,60.0]]]]},\"properties\":{\"name\":\"Manitoba\"}},{\"type\":\"Feature\",\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[-79.547,51.46],[-79.538,50.982],[-79.752,51.184],[-79.547,51.46]]],[[[-79.538,50.959],[-79.576,47.442],[-78.951,46.512],[-76.805,45.865],[-76.338,45.456],[-74.646,45.636],[-74.397,45.564],[-74.325,45.201],[-75.977,44.384],[-77.557,44.121],[-76.847,44.118],[-77.134,43.856],[-77.704,44.041],[-79.092,43.826],[-79.776,43.32],[-79.074,43.267],[-78.925,42.91],[-80.204,42.79],[-80.451,42.612],[-80.114,42.541],[-81.333,42.651],[-82.506,41.913],[-83.124,42.07],[-83.03,42.313],[-82.427,42.354],[-82.638,42.547],[-82.472,42.899],[-81.746,43.346],[-81.745,44.084],[-81.268,44.617],[-81.695,45.265],[-80.949,44.964],[-81.133,44.758],[-80.893,44.791],[-80.942,44.595],[-80.65,44.726],[-80.09,44.468],[-80.104,44.82],[-79.66,44.752],[-80.1,45.123],[-80.059,45.383],[-80.35,45.383],[-80.748,45.921],[-84.517,46.482],[-84.544,46.825],[-84.351,46.883],[-84.778,46.982],[-84.579,47.289],[-85.028,47.611],[-84.844,47.949],[-85.86,47.985],[-86.435,48.777],[-88.261,48.993],[-88.204,48.607],[-88.56,48.43],[-88.314,48.761],[-88.48,48.854],[-88.74,48.37],[-88.939,48.314],[-88.759,48.581],[-89.139,48.484],[-89.338,48.116],[-89.9,47.993],[-90.864,48.254],[-91.571,48.044],[-92.947,48.628],[-93.781,48.512],[-94.57,48.714],[-94.832,49.331],[-95.152,49.372],[-95.15,52.826],[-89.18,56.869],[-88.879,56.858],[-87.976,56.437],[-87.616,56.003],[-85.129,55.346],[-85.424,54.991],[-85.002,55.297],[-82.341,55.165],[-82.195,54.845],[-82.434,54.209],[-82.13,53.799],[-82.115,53.274],[-82.302,52.961],[-81.478,52.302],[-81.884,52.187],[-81.502,52.233],[-80.599,51.713],[-80.424,51.364],[-81.015,51.028],[-80.392,51.339],[-79.538,50.959]]],[[[-82.879,45.969],[-81.587,45.8],[-81.863,45.521],[-81.761,45.701],[-82.066,45.559],[-83.213,45.874],[-82.879,45.969]]]]},\"properties\":{\"name\":\"Ontario\"}}]};\r\n\r\n  var vheroRawHotspots = [{\"name\": \"Donnie Creek, BC\", \"lon\": -121.2, \"lat\": 57.3, \"fwi\": \"34.2 (Extreme)\"}, {\"name\": \"Fort St. John, BC\", \"lon\": -120.8, \"lat\": 56.2, \"fwi\": \"31.8 (Extreme)\"}, {\"name\": \"Prince George, BC\", \"lon\": -122.7, \"lat\": 53.9, \"fwi\": \"24.5 (Very High)\"}, {\"name\": \"Kamloops, BC\", \"lon\": -120.3, \"lat\": 50.7, \"fwi\": \"28.1 (Very High)\"}, {\"name\": \"Okanagan Valley, BC\", \"lon\": -119.5, \"lat\": 49.9, \"fwi\": \"29.4 (Extreme)\"}, {\"name\": \"High Level, AB\", \"lon\": -117.1, \"lat\": 58.5, \"fwi\": \"35.4 (Extreme)\"}, {\"name\": \"Fort McMurray, AB\", \"lon\": -111.4, \"lat\": 56.7, \"fwi\": \"33.0 (Extreme)\"}, {\"name\": \"Slave Lake, AB\", \"lon\": -114.8, \"lat\": 55.3, \"fwi\": \"26.8 (Very High)\"}, {\"name\": \"Edson \/ Pembina, AB\", \"lon\": -116.4, \"lat\": 53.6, \"fwi\": \"21.2 (High)\"}, {\"name\": \"Buffalo Narrows, SK\", \"lon\": -108.5, \"lat\": 55.9, \"fwi\": \"27.5 (Very High)\"}, {\"name\": \"La Ronge, SK\", \"lon\": -105.3, \"lat\": 55.1, \"fwi\": \"30.1 (Extreme)\"}, {\"name\": \"Prince Albert Boreal, SK\", \"lon\": -105.8, \"lat\": 53.2, \"fwi\": \"22.6 (High)\"}, {\"name\": \"Flin Flon, MB\", \"lon\": -101.8, \"lat\": 54.8, \"fwi\": \"29.8 (Very High)\"}, {\"name\": \"Thompson, MB\", \"lon\": -97.8, \"lat\": 55.7, \"fwi\": \"23.4 (High)\"}, {\"name\": \"Red Lake, ON\", \"lon\": -93.8, \"lat\": 51.0, \"fwi\": \"26.3 (Very High)\"}, {\"name\": \"Kenora Sector, ON\", \"lon\": -94.5, \"lat\": 49.8, \"fwi\": \"20.1 (High)\"}, {\"name\": \"Cochrane \/ Abitibi, ON\", \"lon\": -81.0, \"lat\": 49.1, \"fwi\": \"24.0 (High)\"}, {\"name\": \"Val-d'Or, QC\", \"lon\": -77.8, \"lat\": 48.1, \"fwi\": \"25.2 (Very High)\"}, {\"name\": \"Lebel-sur-Qu\\u00e9villon, QC\", \"lon\": -76.9, \"lat\": 49.0, \"fwi\": \"32.6 (Extreme)\"}, {\"name\": \"Chibougamau, QC\", \"lon\": -74.4, \"lat\": 49.9, \"fwi\": \"28.0 (Very High)\"}, {\"name\": \"Yellowknife, NT\", \"lon\": -114.4, \"lat\": 62.4, \"fwi\": \"36.8 (Extreme)\"}, {\"name\": \"Hay River \/ South Slave, NT\", \"lon\": -115.8, \"lat\": 60.8, \"fwi\": \"34.0 (Extreme)\"}, {\"name\": \"Fort Simpson \/ Dehcho, NT\", \"lon\": -121.3, \"lat\": 61.9, \"fwi\": \"29.1 (Very High)\"}, {\"name\": \"Dawson City, YT\", \"lon\": -139.4, \"lat\": 64.0, \"fwi\": \"24.5 (High)\"}];\r\n\r\n  \/* ============================================================\r\n\r\n     D3 loader \u2014 shared across every instance, no document.write.\r\n\r\n     ============================================================ *\/\r\n\r\n  function vheroLoadD3() {\r\n\r\n    if (window.d3) return Promise.resolve(window.d3);\r\n\r\n    if (window.__vheroD3Promise) return window.__vheroD3Promise;\r\n\r\n    window.__vheroD3Promise = new Promise(function (resolve, reject) {\r\n\r\n      var existing = document.querySelector('script[data-vhero-d3]');\r\n\r\n      if (existing) {\r\n\r\n        existing.addEventListener('load', function () { resolve(window.d3); });\r\n\r\n        existing.addEventListener('error', reject);\r\n\r\n        return;\r\n\r\n      }\r\n\r\n      var s = document.createElement('script');\r\n\r\n      s.src = 'https:\/\/cdn.jsdelivr.net\/npm\/d3@7';\r\n\r\n      s.async = true;\r\n\r\n      s.setAttribute('data-vhero-d3', '1');\r\n\r\n      s.onload = function () { resolve(window.d3); };\r\n\r\n      s.onerror = reject;\r\n\r\n      document.head.appendChild(s);\r\n\r\n    });\r\n\r\n    return window.__vheroD3Promise;\r\n\r\n  }\r\n\r\n  \/* ============================================================\r\n\r\n     Per-instance setup \u2014 every .vhero-wildfire-canada widget on\r\n\r\n     the page gets its own isolated state, so this widget can be\r\n\r\n     duplicated safely.\r\n\r\n     ============================================================ *\/\r\n\r\n  function vheroSetupInstance(container, d3) {\r\n\r\n    var svgEl = container.querySelector('.vhero-canada-svg');\r\n\r\n    var canvas = container.querySelector('.vhero-fx-canvas');\r\n\r\n    var tooltip = container.querySelector('.vhero-tooltip');\r\n\r\n    var ttTitle = container.querySelector('.vhero-tt-title');\r\n\r\n    var ttType = container.querySelector('.vhero-tt-type');\r\n\r\n    var ttStatus = container.querySelector('.vhero-tt-status');\r\n\r\n    var countEl = container.querySelector('.vhero-detected-count');\r\n\r\n    if (!svgEl || !canvas) return;\r\n\r\n    var ctx = canvas.getContext('2d', { alpha: true });\r\n\r\n    var dpr = Math.min(window.devicePixelRatio || 1, 2);\r\n\r\n    var state = {\r\n\r\n      W: 0, H: 0,\r\n\r\n      hotspotTargets: [],\r\n\r\n      sweepStartTime: 0,\r\n\r\n      sweepActive: false,\r\n\r\n      sweepFading: false,\r\n\r\n      sweepFadeStartTime: 0,\r\n\r\n      nextSweepTime: 0,\r\n\r\n      scanY: -1,\r\n\r\n      currentDetectedCount: 0,\r\n\r\n      animTimer: 0,\r\n\r\n      lastFrameTime: performance.now(),\r\n\r\n      startTime: performance.now(),\r\n\r\n      running: true,\r\n\r\n      rafId: null\r\n\r\n    };\r\n\r\n    var projection = d3.geoConicConformal()\r\n\r\n      .parallels([49, 77])\r\n\r\n      .rotate([96, 0])\r\n\r\n      .fitExtent([[60, 40], [SVG_WIDTH - 60, SVG_HEIGHT - 40]], vheroCanadaGeoJSON);\r\n\r\n    var geoPath = d3.geoPath().projection(projection);\r\n\r\n    function showTooltip(e, title, type, status) {\r\n\r\n      if (!tooltip) return;\r\n\r\n      var rect = container.getBoundingClientRect();\r\n\r\n      ttTitle.textContent = title.toUpperCase();\r\n\r\n      ttType.textContent = type;\r\n\r\n      ttStatus.textContent = status;\r\n\r\n      var left = Math.min(rect.width - 200, e.clientX - rect.left + 16);\r\n\r\n      var top = Math.min(rect.height - 100, e.clientY - rect.top + 16);\r\n\r\n      tooltip.style.left = left + 'px';\r\n\r\n      tooltip.style.top = top + 'px';\r\n\r\n      tooltip.style.opacity = '1';\r\n\r\n    }\r\n\r\n    function hideTooltip() { if (tooltip) tooltip.style.opacity = '0'; }\r\n\r\n    function renderMap() {\r\n\r\n      var svg = d3.select(svgEl);\r\n\r\n      var graticule = d3.geoGraticule().step([10, 5]);\r\n\r\n      svg.select('.vhero-graticule-layer')\r\n\r\n        .append('path').datum(graticule).attr('class', 'vhero-geo-graticule').attr('d', geoPath);\r\n\r\n      var centerScreen = projection([-106.3468, 56.1304]);\r\n\r\n      if (centerScreen) {\r\n\r\n        var radarGroup = svg.select('.vhero-radar-rings');\r\n\r\n        [140, 280, 420, 560].forEach(function (r) {\r\n\r\n          radarGroup.append('circle')\r\n\r\n            .attr('cx', centerScreen[0]).attr('cy', centerScreen[1]).attr('r', r)\r\n\r\n            .attr('class', 'vhero-radar-ring');\r\n\r\n        });\r\n\r\n        radarGroup.append('line')\r\n\r\n          .attr('x1', centerScreen[0] - 20).attr('y1', centerScreen[1])\r\n\r\n          .attr('x2', centerScreen[0] + 20).attr('y2', centerScreen[1])\r\n\r\n          .attr('stroke', 'rgba(255,182,1,0.35)').attr('stroke-width', 0.8);\r\n\r\n        radarGroup.append('line')\r\n\r\n          .attr('x1', centerScreen[0]).attr('y1', centerScreen[1] - 20)\r\n\r\n          .attr('x2', centerScreen[0]).attr('y2', centerScreen[1] + 20)\r\n\r\n          .attr('stroke', 'rgba(255,182,1,0.35)').attr('stroke-width', 0.8);\r\n\r\n      }\r\n\r\n      svg.select('.vhero-provinces-layer')\r\n\r\n        .selectAll('path')\r\n\r\n        .data(vheroCanadaGeoJSON.features)\r\n\r\n        .enter()\r\n\r\n        .append('path')\r\n\r\n        .attr('class', 'vhero-province-path')\r\n\r\n        .attr('d', geoPath)\r\n\r\n        .on('mousemove', function (e, d) {\r\n\r\n          var name = d.properties.name || 'Territory';\r\n\r\n          var isTerritory = name.indexOf('Territor') !== -1 || name === 'Nunavut' || name === 'Yukon';\r\n\r\n          showTooltip(e, name, isTerritory ? 'CANADIAN TERRITORY' : 'CANADIAN PROVINCE', 'MONITORED');\r\n\r\n        })\r\n\r\n        .on('mouseleave', hideTooltip);\r\n\r\n      var hitboxesGroup = svg.select('.vhero-hotspot-hitboxes');\r\n\r\n      vheroRawHotspots.forEach(function (spot) {\r\n\r\n        var pos = projection([spot.lon, spot.lat]);\r\n\r\n        if (!pos) return;\r\n\r\n        hitboxesGroup.append('circle')\r\n\r\n          .attr('cx', pos[0]).attr('cy', pos[1]).attr('r', 16)\r\n\r\n          .attr('fill', 'transparent').attr('cursor', 'pointer')\r\n\r\n          .on('mousemove', function (e) { showTooltip(e, spot.name, 'WILDFIRE HAZARD SPOT', spot.fwi); })\r\n\r\n          .on('mouseleave', hideTooltip);\r\n\r\n      });\r\n\r\n    }\r\n\r\n    function updateScreenCoordinates() {\r\n      var containerRect = container.getBoundingClientRect();\r\n      var svgRect = svgEl.getBoundingClientRect();\r\n      if (!svgRect.width || !svgRect.height) return;\r\n\r\n      \/\/ 1. Calculate exact SVG viewBox-to-screen mapping (handles preserveAspectRatio=\"xMidYMid meet\" on mobile)\r\n      var scale = Math.min(svgRect.width \/ SVG_WIDTH, svgRect.height \/ SVG_HEIGHT);\r\n      var renderedW = SVG_WIDTH * scale;\r\n      var renderedH = SVG_HEIGHT * scale;\r\n      var offsetX = (svgRect.width - renderedW) \/ 2;\r\n      var offsetY = (svgRect.height - renderedH) \/ 2;\r\n\r\n      var originX = (svgRect.left - containerRect.left) + offsetX;\r\n      var originY = (svgRect.top - containerRect.top) + offsetY;\r\n\r\n      \/\/ 2. Query rendered SVG hotspot circles for direct browser-verified alignment\r\n      var circles = svgEl.querySelectorAll('.vhero-hotspot-hitboxes circle');\r\n      var useCircles = circles && circles.length === vheroRawHotspots.length;\r\n\r\n      state.hotspotTargets = [];\r\n      vheroRawHotspots.forEach(function (spot, idx) {\r\n        var targetX, targetY;\r\n\r\n        \/\/ Try direct browser DOM element position first\r\n        if (useCircles) {\r\n          var cRect = circles[idx].getBoundingClientRect();\r\n          if (cRect.width > 0 && cRect.height > 0) {\r\n            targetX = (cRect.left + cRect.width \/ 2) - containerRect.left;\r\n            targetY = (cRect.top + cRect.height \/ 2) - containerRect.top;\r\n          }\r\n        }\r\n\r\n        \/\/ Exact geometric fallback\r\n        if (targetX === undefined || targetY === undefined) {\r\n          var pos = projection([spot.lon, spot.lat]);\r\n          if (!pos) return;\r\n          targetX = originX + pos[0] * scale;\r\n          targetY = originY + pos[1] * scale;\r\n        }\r\n\r\n        state.hotspotTargets.push({\r\n          x: targetX,\r\n          y: targetY,\r\n          name: spot.name,\r\n          fwi: spot.fwi,\r\n          detected: false,\r\n          revealProgress: 0,\r\n          pingAge: 0,\r\n          randomOffset: (Math.random() - 0.5) * 12,\r\n          activeInCycle: true\r\n        });\r\n      });\r\n    }\r\n\r\n    function resizeCanvas() {\r\n\r\n      var rect = container.getBoundingClientRect();\r\n\r\n      state.W = Math.max(1, rect.width);\r\n\r\n      state.H = Math.max(1, rect.height);\r\n\r\n      canvas.width = state.W * dpr;\r\n\r\n      canvas.height = state.H * dpr;\r\n\r\n      canvas.style.width = state.W + 'px';\r\n\r\n      canvas.style.height = state.H + 'px';\r\n\r\n      ctx.setTransform(1, 0, 0, 1, 0, 0);\r\n\r\n      ctx.scale(dpr, dpr);\r\n\r\n      updateScreenCoordinates();\r\n\r\n    }\r\n\r\n    \/* ---- Embers ---- *\/\r\n\r\n    var EMBER_COUNT = 50;\r\n\r\n    var embers = [];\r\n\r\n    function resetEmber(e, initial) {\r\n\r\n      e.x = Math.random() * state.W;\r\n\r\n      e.y = initial ? Math.random() * state.H : state.H + Math.random() * 40;\r\n\r\n      e.vx = (Math.random() - 0.5) * 0.2;\r\n\r\n      e.vy = -0.3 - Math.random() * 0.6;\r\n\r\n      e.size = Math.random() * 1.3 + 0.4;\r\n\r\n      e.life = 0;\r\n\r\n      e.maxLife = 200 + Math.random() * 280;\r\n\r\n      e.isSmoke = Math.random() > 0.85;\r\n\r\n      if (e.isSmoke) { e.size = Math.random() * 8 + 3; e.vy = -0.12 - Math.random() * 0.18; }\r\n\r\n      e.flicker = Math.random() * Math.PI * 2;\r\n\r\n    }\r\n\r\n    function makeEmber(initial) { var e = {}; resetEmber(e, initial); return e; }\r\n\r\n    function updateEmber(e) {\r\n\r\n      e.x += e.vx; e.y += e.vy; e.life++; e.flicker += 0.08;\r\n\r\n      if (e.x < -20) e.x = state.W + 20;\r\n\r\n      if (e.x > state.W + 20) e.x = -20;\r\n\r\n      if (e.y < -30 || e.life > e.maxLife) resetEmber(e, false);\r\n\r\n    }\r\n\r\n    function drawEmber(e, c) {\r\n\r\n      var progress = e.life \/ e.maxLife;\r\n\r\n      var fade = Math.sin(progress * Math.PI);\r\n\r\n      if (fade <= 0) return;\r\n\r\n      if (e.isSmoke) {\r\n\r\n        c.fillStyle = 'rgba(130,130,140,' + (fade * 0.05) + ')';\r\n\r\n        c.beginPath(); c.arc(e.x, e.y, e.size, 0, 6.283); c.fill();\r\n\r\n      } else {\r\n\r\n        var flicker = 0.7 + Math.sin(e.flicker) * 0.3;\r\n\r\n        var alpha = fade * flicker;\r\n\r\n        c.fillStyle = 'rgba(255,182,1,' + (alpha * 0.35) + ')';\r\n\r\n        c.beginPath(); c.arc(e.x, e.y, e.size * 3, 0, 6.283); c.fill();\r\n\r\n        c.fillStyle = 'rgba(255,235,170,' + alpha + ')';\r\n\r\n        c.beginPath(); c.arc(e.x, e.y, e.size, 0, 6.283); c.fill();\r\n\r\n      }\r\n\r\n    }\r\n\r\n    for (var i = 0; i < EMBER_COUNT; i++) embers.push(makeEmber(true));\r\n\r\n    var SWEEP_DURATION = 3200;\r\n\r\n    var SWEEP_COOLDOWN = 4200;\r\n\r\n    function startScan(now) {\r\n\r\n      state.sweepActive = true;\r\n\r\n      state.sweepFading = false;\r\n\r\n      state.sweepStartTime = now;\r\n\r\n      state.currentDetectedCount = 0;\r\n\r\n      state.scanY = 0;\r\n\r\n      if (countEl) countEl.textContent = '00 ACTIVE';\r\n\r\n      state.hotspotTargets.forEach(function (t) {\r\n\r\n        t.detected = false;\r\n\r\n        t.pingAge = 0;\r\n\r\n        t.activeInCycle = Math.random() < (0.60 + Math.random() * 0.32);\r\n\r\n      });\r\n\r\n    }\r\n\r\n    function updateSweep(now) {\r\n\r\n      if (state.sweepActive) {\r\n\r\n        var elapsed = now - state.sweepStartTime;\r\n\r\n        var progress = Math.min(1, elapsed \/ SWEEP_DURATION);\r\n\r\n        state.scanY = progress * state.H;\r\n\r\n        state.hotspotTargets.forEach(function (t) {\r\n\r\n          if (!t.detected && t.activeInCycle && state.scanY >= (t.y + t.randomOffset)) {\r\n\r\n            t.detected = true;\r\n\r\n            t.pingAge = 0;\r\n\r\n            state.currentDetectedCount++;\r\n\r\n            if (countEl) countEl.textContent = String(state.currentDetectedCount).padStart(2, '0') + ' ACTIVE';\r\n\r\n          }\r\n\r\n        });\r\n\r\n        if (progress >= 1) {\r\n\r\n          state.sweepActive = false;\r\n\r\n          state.sweepFading = true;\r\n\r\n          state.sweepFadeStartTime = now;\r\n\r\n        }\r\n\r\n      } else if (state.sweepFading) {\r\n\r\n        var fadeElapsed = now - state.sweepFadeStartTime;\r\n\r\n        if (fadeElapsed >= 1400) {\r\n\r\n          state.sweepFading = false;\r\n\r\n          state.nextSweepTime = now + SWEEP_COOLDOWN;\r\n\r\n        }\r\n\r\n      } else if (state.nextSweepTime > 0 && now >= state.nextSweepTime) {\r\n\r\n        startScan(now);\r\n\r\n      }\r\n\r\n    }\r\n\r\n    function drawScene(dt, now) {\r\n\r\n      ctx.clearRect(0, 0, state.W, state.H);\r\n\r\n      state.animTimer += dt * 0.002;\r\n\r\n      for (var i2 = 0; i2 < embers.length; i2++) { updateEmber(embers[i2]); drawEmber(embers[i2], ctx); }\r\n\r\n      state.hotspotTargets.forEach(function (t) {\r\n\r\n        if (t.detected) {\r\n\r\n          t.pingAge += dt * 0.002;\r\n\r\n          var pulse1 = (t.pingAge * 1.5) % 1;\r\n\r\n          var pulse2 = (t.pingAge * 1.5 + 0.5) % 1;\r\n\r\n          var glowGrad = ctx.createRadialGradient(t.x, t.y, 0, t.x, t.y, 14);\r\n\r\n          glowGrad.addColorStop(0, 'rgba(255, 182, 1, 0.7)');\r\n\r\n          glowGrad.addColorStop(0.5, 'rgba(255, 69, 0, 0.3)');\r\n\r\n          glowGrad.addColorStop(1, 'rgba(255, 0, 0, 0)');\r\n\r\n          ctx.fillStyle = glowGrad;\r\n\r\n          ctx.beginPath(); ctx.arc(t.x, t.y, 14, 0, 6.283); ctx.fill();\r\n\r\n          ctx.strokeStyle = 'rgba(255, 182, 1, ' + (Math.max(0, 1 - pulse1) * 0.85) + ')';\r\n\r\n          ctx.lineWidth = 0.8;\r\n\r\n          ctx.beginPath(); ctx.arc(t.x, t.y, 2 + pulse1 * 14, 0, 6.283); ctx.stroke();\r\n\r\n          ctx.strokeStyle = 'rgba(255, 182, 1, ' + (Math.max(0, 1 - pulse2) * 0.85) + ')';\r\n\r\n          ctx.beginPath(); ctx.arc(t.x, t.y, 2 + pulse2 * 14, 0, 6.283); ctx.stroke();\r\n\r\n          ctx.fillStyle = '#FFFFFF';\r\n\r\n          ctx.beginPath(); ctx.arc(t.x, t.y, 2.2, 0, 6.283); ctx.fill();\r\n\r\n          if (state.sweepActive && t.pingAge < 2.5) {\r\n\r\n            ctx.font = '8px JetBrains Mono, monospace';\r\n\r\n            ctx.fillStyle = 'rgba(255, 220, 100, ' + (Math.max(0, 1 - t.pingAge \/ 2.5) * 0.9) + ')';\r\n\r\n            ctx.fillText(t.name.toUpperCase(), t.x + 14, t.y - 3);\r\n\r\n          }\r\n\r\n        }\r\n\r\n      });\r\n\r\n      if (state.sweepActive || state.sweepFading) {\r\n\r\n        ctx.save();\r\n\r\n        var beamAlpha = 1;\r\n\r\n        if (state.sweepFading) {\r\n\r\n          var fadeProgress = (now - state.sweepFadeStartTime) \/ 1400;\r\n\r\n          beamAlpha = Math.max(0, 1 - fadeProgress);\r\n\r\n        }\r\n\r\n        ctx.globalAlpha = beamAlpha;\r\n\r\n        var trailHeight = 45;\r\n\r\n        var trailGrad = ctx.createLinearGradient(0, state.scanY - trailHeight, 0, state.scanY);\r\n\r\n        trailGrad.addColorStop(0, 'rgba(255, 182, 1, 0)');\r\n\r\n        trailGrad.addColorStop(0.7, 'rgba(255, 182, 1, 0.08)');\r\n\r\n        trailGrad.addColorStop(1, 'rgba(255, 182, 1, 0.28)');\r\n\r\n        ctx.fillStyle = trailGrad;\r\n\r\n        ctx.fillRect(0, state.scanY - trailHeight, state.W, trailHeight);\r\n\r\n        var coreGrad = ctx.createLinearGradient(0, state.scanY - 2.5, 0, state.scanY + 2.5);\r\n\r\n        coreGrad.addColorStop(0, 'rgba(255, 182, 1, 0)');\r\n\r\n        coreGrad.addColorStop(0.3, 'rgba(255, 230, 120, 0.85)');\r\n\r\n        coreGrad.addColorStop(0.5, 'rgba(255, 255, 200, 1.0)');\r\n\r\n        coreGrad.addColorStop(0.7, 'rgba(255, 230, 120, 0.85)');\r\n\r\n        coreGrad.addColorStop(1, 'rgba(255, 182, 1, 0)');\r\n\r\n        ctx.fillStyle = coreGrad;\r\n\r\n        ctx.fillRect(0, state.scanY - 1.5, state.W, 3);\r\n\r\n        ctx.fillStyle = 'rgba(255, 220, 100, 0.85)';\r\n\r\n        for (var x = 0; x < state.W; x += 80) {\r\n\r\n          ctx.fillRect(x, state.scanY - 4, 1, 2);\r\n\r\n          ctx.fillRect(x, state.scanY + 2, 1, 2);\r\n\r\n        }\r\n\r\n        ctx.restore();\r\n\r\n      }\r\n\r\n    }\r\n\r\n    function loop(now) {\r\n\r\n      if (!state.running) return;\r\n\r\n      if (!document.body.contains(container)) return; \/\/ widget removed \u2014 stop the loop for good\r\n\r\n      var dt = Math.min(35, now - state.lastFrameTime);\r\n\r\n      state.lastFrameTime = now;\r\n\r\n      if (!state.sweepActive && !state.sweepFading && state.nextSweepTime === 0 && (now - state.startTime) > 1200) {\r\n\r\n        startScan(now);\r\n\r\n      }\r\n\r\n      updateSweep(now);\r\n\r\n      drawScene(dt, now);\r\n\r\n      state.rafId = requestAnimationFrame(loop);\r\n\r\n    }\r\n\r\n    function startLoop() {\r\n\r\n      if (state.rafId) return;\r\n\r\n      state.lastFrameTime = performance.now();\r\n\r\n      state.rafId = requestAnimationFrame(loop);\r\n\r\n    }\r\n\r\n    function stopLoop() {\r\n\r\n      if (state.rafId) { cancelAnimationFrame(state.rafId); state.rafId = null; }\r\n\r\n    }\r\n\r\n    \/* ---- Init ---- *\/\r\n    renderMap();\r\n    resizeCanvas();\r\n\r\n    \/\/ Re-verify after initial mobile font\/layout passes\r\n    setTimeout(updateScreenCoordinates, 100);\r\n    setTimeout(updateScreenCoordinates, 400);\r\n    setTimeout(updateScreenCoordinates, 1000);\r\n\r\n    if (window.ResizeObserver) {\r\n      var ro = new ResizeObserver(function () { resizeCanvas(); });\r\n      ro.observe(container);\r\n      if (svgEl) ro.observe(svgEl);\r\n    }\r\n    window.addEventListener('resize', resizeCanvas);\r\n    window.addEventListener('orientationchange', function () {\r\n      setTimeout(resizeCanvas, 200);\r\n    });\r\n\r\n    \/\/ Pause the RAF loop while the hero is scrolled out of view \u2014\r\n\r\n    \/\/ same offscreen-pause pattern as your other Volatus widgets.\r\n\r\n    if (window.IntersectionObserver) {\r\n\r\n      var io = new IntersectionObserver(function (entries) {\r\n\r\n        entries.forEach(function (entry) {\r\n\r\n          state.running = entry.isIntersecting;\r\n\r\n          if (entry.isIntersecting) startLoop(); else stopLoop();\r\n\r\n        });\r\n\r\n      }, { threshold: 0.01 });\r\n\r\n      io.observe(container);\r\n\r\n    } else {\r\n\r\n      startLoop();\r\n\r\n    }\r\n\r\n  }\r\n\r\n  function vheroInitInstance(container) {\r\n\r\n    if (!container || container.__vheroInit) return;\r\n\r\n    container.__vheroInit = true;\r\n\r\n    vheroLoadD3().then(function (d3) {\r\n\r\n      vheroSetupInstance(container, d3);\r\n\r\n    }).catch(function (err) {\r\n\r\n      console.error('[VHero] Failed to load D3.js \u2014 wildfire hero animation will not render.', err);\r\n\r\n    });\r\n\r\n  }\r\n\r\n  function vheroInitAll(root) {\r\n\r\n    (root || document).querySelectorAll('.vhero-wildfire-canada').forEach(vheroInitInstance);\r\n\r\n  }\r\n\r\n  vheroInitAll(document);\r\n\r\n  document.addEventListener('DOMContentLoaded', function () { vheroInitAll(document); });\r\n\r\n  \/\/ Re-run when Elementor (re)renders this widget in the editor preview\r\n\r\n  if (window.elementorFrontend && window.elementorFrontend.hooks) {\r\n\r\n    window.elementorFrontend.hooks.addAction('frontend\/element_ready\/global', function ($scope) {\r\n\r\n      vheroInitAll($scope && $scope[0] ? $scope[0] : document);\r\n\r\n    });\r\n\r\n  }\r\n\r\n})();\r\n\r\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-f32362a elementor-icon-list--layout-inline elementor-mobile-align-center elementor-tablet-align-center elementor-list-item-link-full_width elementor-widget elementor-widget-icon-list\" data-id=\"f32362a\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"icon-list.default\">\n\t\t\t\t\t\t\t<ul class=\"elementor-icon-list-items elementor-inline-items\">\n\t\t\t\t\t\t\t<li class=\"elementor-icon-list-item elementor-inline-item\">\n\t\t\t\t\t\t\t\t\t\t\t<a href=\"https:\/\/volatusaerospace.com\/\">\n\n\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-text\">Home<\/span>\n\t\t\t\t\t\t\t\t\t\t\t<\/a>\n\t\t\t\t\t\t\t\t\t<\/li>\n\t\t\t\t\t\t\t\t<li class=\"elementor-icon-list-item elementor-inline-item\">\n\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-text\">\/<\/span>\n\t\t\t\t\t\t\t\t\t<\/li>\n\t\t\t\t\t\t\t\t<li class=\"elementor-icon-list-item elementor-inline-item\">\n\t\t\t\t\t\t\t\t\t\t\t<a href=\"https:\/\/volatusaerospace.com\/services\/\">\n\n\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-text\">Services<\/span>\n\t\t\t\t\t\t\t\t\t\t\t<\/a>\n\t\t\t\t\t\t\t\t\t<\/li>\n\t\t\t\t\t\t\t\t<li class=\"elementor-icon-list-item elementor-inline-item\">\n\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-text\">\/<\/span>\n\t\t\t\t\t\t\t\t\t<\/li>\n\t\t\t\t\t\t\t\t<li class=\"elementor-icon-list-item elementor-inline-item\">\n\t\t\t\t\t\t\t\t\t\t\t<a href=\"https:\/\/volatusaerospace.com\/services\/emergency-and-disaster-response\/\">\n\n\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-text\">Emergency &amp; Disaster Response<\/span>\n\t\t\t\t\t\t\t\t\t\t\t<\/a>\n\t\t\t\t\t\t\t\t\t<\/li>\n\t\t\t\t\t\t\t\t<li class=\"elementor-icon-list-item elementor-inline-item\">\n\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-text\">\/<\/span>\n\t\t\t\t\t\t\t\t\t<\/li>\n\t\t\t\t\t\t\t\t<li class=\"elementor-icon-list-item elementor-inline-item\">\n\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-text\"> <span style=\"color: #FFB601\">Wildfire Response <span><\/span>\n\t\t\t\t\t\t\t\t\t<\/li>\n\t\t\t\t\t\t<\/ul>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-39f1aba elementor-widget__width-initial elementor-widget-mobile__width-inherit elementor-widget-tablet__width-inherit elementor-widget elementor-widget-heading\" data-id=\"39f1aba\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Wildfire Response and Aerial Intelligence  <\/h2>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-778660d elementor-widget__width-initial elementor-widget-mobile__width-inherit elementor-widget-tablet__width-initial elementor-widget elementor-widget-heading\" data-id=\"778660d\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Earlier <span style=\"color: #FFB601\"> Detection. <\/span><br>\nFaster  <span style=\"color: #FFB601\">Decisions. <\/span><br>\nStronger  <span style=\"color: #FFB601\">Response.  <\/span>\n<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-2e98599 elementor-widget__width-initial elementor-widget-mobile__width-inherit elementor-widget-tablet__width-initial elementor-widget elementor-widget-text-editor\" data-id=\"2e98599\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p>Real-time aerial intelligence and autonomous capabilities to detect wildfires earlier, accelerate decisions, and strengthen response across Canada.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-fc2e3f9 e-flex e-con-boxed e-con e-parent\" data-id=\"fc2e3f9\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t<div class=\"elementor-element elementor-element-1141ba6 e-con-full e-flex e-con e-child\" data-id=\"1141ba6\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-2533d55 elementor-widget__width-inherit elementor-widget-laptop__width-initial elementor-widget elementor-widget-heading\" data-id=\"2533d55\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Aerial Intelligence for <span style=\"color: #FFB601\">Wildfire Response<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-cfb58e3 elementor-widget-mobile__width-inherit elementor-widget elementor-widget-text-editor\" data-id=\"cfb58e3\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p>Wildfire conditions can change in minutes. The sooner incident commanders can see where a fire is moving, understand emerging risks and track resources in the field, the better positioned they are to protect crews, communities and critical infrastructure.<\/p><p>Volatus Aerospace brings together crewed and uncrewed aircraft, persistent aerial intelligence, resilient communications, heavy-lift autonomous platforms and mission-control expertise to support wildfire preparedness, active response and recovery.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-6b2a071 e-con-full e-flex e-con e-child\" data-id=\"6b2a071\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-54b7e97 elementor-widget elementor-widget-image\" data-id=\"54b7e97\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img fetchpriority=\"high\" decoding=\"async\" width=\"586\" height=\"1024\" src=\"https:\/\/volatusaerospace.com\/wp-content\/uploads\/2026\/09\/flyox_volatus_vertical-586x1024.webp\" class=\"attachment-large size-large wp-image-36851\" alt=\"\" srcset=\"https:\/\/volatusaerospace.com\/wp-content\/uploads\/2026\/09\/flyox_volatus_vertical-586x1024.webp 586w, https:\/\/volatusaerospace.com\/wp-content\/uploads\/2026\/09\/flyox_volatus_vertical-172x300.webp 172w, https:\/\/volatusaerospace.com\/wp-content\/uploads\/2026\/09\/flyox_volatus_vertical-768x1341.webp 768w, https:\/\/volatusaerospace.com\/wp-content\/uploads\/2026\/09\/flyox_volatus_vertical-880x1536.webp 880w, https:\/\/volatusaerospace.com\/wp-content\/uploads\/2026\/09\/flyox_volatus_vertical-1173x2048.webp 1173w, https:\/\/volatusaerospace.com\/wp-content\/uploads\/2026\/09\/flyox_volatus_vertical.webp 1376w\" sizes=\"(max-width: 586px) 100vw, 586px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-9efc427 e-flex e-con-boxed e-con e-parent\" data-id=\"9efc427\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t<div class=\"elementor-element elementor-element-2994550 e-con-full e-flex e-con e-child\" data-id=\"2994550\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t<div class=\"elementor-element elementor-element-c220998 e-con-full e-flex e-con e-child\" data-id=\"c220998\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-22204f3 elementor-widget__width-inherit elementor-widget elementor-widget-image\" data-id=\"22204f3\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img decoding=\"async\" width=\"768\" height=\"1229\" src=\"https:\/\/volatusaerospace.com\/wp-content\/uploads\/2026\/05\/Glen_Speaking-768x1229.webp\" class=\"attachment-medium_large size-medium_large wp-image-29613\" alt=\"Volatus Aerospace\" srcset=\"https:\/\/volatusaerospace.com\/wp-content\/uploads\/2026\/05\/Glen_Speaking-768x1229.webp 768w, https:\/\/volatusaerospace.com\/wp-content\/uploads\/2026\/05\/Glen_Speaking-187x300.webp 187w, https:\/\/volatusaerospace.com\/wp-content\/uploads\/2026\/05\/Glen_Speaking-640x1024.webp 640w, https:\/\/volatusaerospace.com\/wp-content\/uploads\/2026\/05\/Glen_Speaking.webp 937w\" sizes=\"(max-width: 768px) 100vw, 768px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-e571e40 e-con-full e-flex e-con e-child\" data-id=\"e571e40\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-37c74ac elementor-view-default elementor-widget elementor-widget-icon\" data-id=\"37c74ac\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"icon.default\">\n\t\t\t\t\t\t\t<div class=\"elementor-icon-wrapper\">\n\t\t\t<div class=\"elementor-icon\">\n\t\t\t<svg aria-hidden=\"true\" class=\"e-font-icon-svg e-fas-quote-right\" viewBox=\"0 0 512 512\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M464 32H336c-26.5 0-48 21.5-48 48v128c0 26.5 21.5 48 48 48h80v64c0 35.3-28.7 64-64 64h-8c-13.3 0-24 10.7-24 24v48c0 13.3 10.7 24 24 24h8c88.4 0 160-71.6 160-160V80c0-26.5-21.5-48-48-48zm-288 0H48C21.5 32 0 53.5 0 80v128c0 26.5 21.5 48 48 48h80v64c0 35.3-28.7 64-64 64h-8c-13.3 0-24 10.7-24 24v48c0 13.3 10.7 24 24 24h8c88.4 0 160-71.6 160-160V80c0-26.5-21.5-48-48-48z\"><\/path><\/svg>\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-c24351c elementor-widget elementor-widget-text-editor\" data-id=\"c24351c\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t\u201cCanada already operates one of the world\u2019s most respected aerial firefighting fleets. Our objective isn\u2019t to replace it, it\u2019s to strengthen it with a new class of autonomous aircraft capability that can detect earlier, respond faster, operate closer to emerging incidents, and provide governments with new operational options when time matters most\u201d\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-a819a59 elementor-widget elementor-widget-heading\" data-id=\"a819a59\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Glen Lynch<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-adbd15e elementor-widget elementor-widget-text-editor\" data-id=\"adbd15e\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\tCHIEF EXECUTIVE OFFICER, <span class=\"NormalTextRun SpellingErrorV2Themed SCXW133798127 BCX8\">Volatus<\/span><span class=\"NormalTextRun SCXW133798127 BCX8\"> Aerospace.<\/span>\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-a43dceb e-flex e-con-boxed e-con e-parent\" data-id=\"a43dceb\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t<div class=\"elementor-element elementor-element-674f604 e-con-full e-flex e-con e-child\" data-id=\"674f604\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-83f5a3e elementor-widget__width-inherit elementor-widget-laptop__width-initial elementor-widget elementor-widget-heading\" data-id=\"83f5a3e\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Building a Sovereign <span style=\"color: #FFB601\">Canadian Wildfire Capability<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-402823f elementor-widget-mobile__width-inherit elementor-widget elementor-widget-text-editor\" data-id=\"402823f\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\tVolatus\u2019 integrated Canadian capability brings together advanced aircraft, operational services, mission-management technologies, training, lifecycle support and domestic manufacturing. Centred initially on wildfire response, this same architecture supports broader emergency-management, Arctic domain-awareness, public-safety and defence missions.\n\n\t\t\t\t\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-2efba2e e-con-full e-flex e-con e-child\" data-id=\"2efba2e\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-f00aabe elementor-widget elementor-widget-heading\" data-id=\"f00aabe\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Advanced Aircraft\n<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-e9db341 elementor-widget elementor-widget-heading\" data-id=\"e9db341\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Training\n<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-158429e elementor-widget elementor-widget-heading\" data-id=\"158429e\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Lifecycle Support\n<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-300242a elementor-widget elementor-widget-heading\" data-id=\"300242a\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Domestic Manufacturing\n<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-b26c0e7 elementor-widget elementor-widget-heading\" data-id=\"b26c0e7\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Mission-Management Technologies\n<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-64d1925 e-con-full e-flex e-con e-child\" data-id=\"64d1925\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-23e3bc4 elementor-widget elementor-widget-video\" data-id=\"23e3bc4\" data-element_type=\"widget\" data-e-type=\"widget\" data-settings=\"{&quot;video_type&quot;:&quot;hosted&quot;,&quot;autoplay&quot;:&quot;yes&quot;,&quot;play_on_mobile&quot;:&quot;yes&quot;,&quot;mute&quot;:&quot;yes&quot;,&quot;loop&quot;:&quot;yes&quot;}\" data-widget_type=\"video.default\">\n\t\t\t\t\t\t\t<div class=\"e-hosted-video elementor-wrapper elementor-open-inline\">\n\t\t\t\t\t<video class=\"elementor-video\" src=\"https:\/\/volatusaerospace.com\/wp-content\/uploads\/2026\/09\/Wildfire-Web-Video.webm\" autoplay=\"\" loop=\"\" muted=\"muted\" playsinline=\"\" controlsList=\"nodownload\" poster=\"https:\/\/volatusaerospace.com\/wp-content\/uploads\/2026\/08\/Flyox-in-action.webp\"><\/video>\n\t\t\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-f041093 e-flex e-con-boxed e-con e-parent\" data-id=\"f041093\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-600b7c6 elementor-widget__width-initial elementor-widget-laptop__width-initial elementor-widget elementor-widget-heading\" data-id=\"600b7c6\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">An Integrated Capability <span style=\"color: #FFB601\">Across the Wildfire Lifecycle <\/h2>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-184e362 elementor-widget__width-initial elementor-widget-mobile__width-inherit elementor-widget-laptop__width-initial elementor-widget elementor-widget-text-editor\" data-id=\"184e362\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p>Effective wildfire management begins before smoke is visible and continues long after the immediate threat has passed. Volatus supports wildfire agencies across preparedness, detection, active response, and recovery.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-f6cd6e7 e-n-tabs-mobile elementor-widget elementor-widget-n-tabs\" data-id=\"f6cd6e7\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"nested-tabs.default\">\n\t\t\t\t\t\t\t<div class=\"e-n-tabs\" data-widget-number=\"258791143\" aria-label=\"Tabs. Open items with Enter or Space, close with Escape and navigate using the Arrow keys.\">\n\t\t\t<div class=\"e-n-tabs-heading\" role=\"tablist\">\n\t\t\t\t\t<button id=\"e-n-tab-title-2587911431\" data-tab-title-id=\"e-n-tab-title-2587911431\" class=\"e-n-tab-title\" aria-selected=\"true\" data-tab-index=\"1\" role=\"tab\" tabindex=\"0\" aria-controls=\"e-n-tab-content-2587911431\" style=\"--n-tabs-title-order: 1;\">\n\t\t\t\t\t\t<span class=\"e-n-tab-title-text\">\n\t\t\t\t<span class=\"tab-num\">01<\/span> <span class=\"tab-text\">   <span class=\"tab-main\">Prepare &amp; Detect<\/span>   <span class=\"tab-sub\">Early sensing<\/span> <\/span>\t\t\t<\/span>\n\t\t<\/button>\n\t\t\t\t<button id=\"e-n-tab-title-2587911432\" data-tab-title-id=\"e-n-tab-title-2587911432\" class=\"e-n-tab-title\" aria-selected=\"false\" data-tab-index=\"2\" role=\"tab\" tabindex=\"-1\" aria-controls=\"e-n-tab-content-2587911432\" style=\"--n-tabs-title-order: 2;\">\n\t\t\t\t\t\t<span class=\"e-n-tab-title-text\">\n\t\t\t\t<span class=\"tab-num\">02<\/span> <span class=\"tab-text\">   <span class=\"tab-main\">Understand &amp; Coordinate<\/span>   <span class=\"tab-sub\">Persistent intelligence<\/span> <\/span>\t\t\t<\/span>\n\t\t<\/button>\n\t\t\t\t<button id=\"e-n-tab-title-2587911433\" data-tab-title-id=\"e-n-tab-title-2587911433\" class=\"e-n-tab-title\" aria-selected=\"false\" data-tab-index=\"3\" role=\"tab\" tabindex=\"-1\" aria-controls=\"e-n-tab-content-2587911433\" style=\"--n-tabs-title-order: 3;\">\n\t\t\t\t\t\t<span class=\"e-n-tab-title-text\">\n\t\t\t\t<span class=\"tab-num\">03<\/span> <span class=\"tab-text\">   <span class=\"tab-main\">Respond &amp; Resupply<\/span>   <span class=\"tab-sub\">Heavy-lift autonomous<\/span> <\/span>\t\t\t<\/span>\n\t\t<\/button>\n\t\t\t\t<button id=\"e-n-tab-title-2587911434\" data-tab-title-id=\"e-n-tab-title-2587911434\" class=\"e-n-tab-title\" aria-selected=\"false\" data-tab-index=\"4\" role=\"tab\" tabindex=\"-1\" aria-controls=\"e-n-tab-content-2587911434\" style=\"--n-tabs-title-order: 4;\">\n\t\t\t\t\t\t<span class=\"e-n-tab-title-text\">\n\t\t\t\t<span class=\"tab-num\">04<\/span> <span class=\"tab-text\">   <span class=\"tab-main\">Recover &amp; Restore<\/span>   <span class=\"tab-sub\">Post-fire &amp; seeding<\/span> <\/span>\t\t\t<\/span>\n\t\t<\/button>\n\t\t\t\t\t<\/div>\n\t\t\t<div class=\"e-n-tabs-content\">\n\t\t\t\t<div id=\"e-n-tab-content-2587911431\" role=\"tabpanel\" aria-labelledby=\"e-n-tab-title-2587911431\" data-tab-index=\"1\" style=\"--n-tabs-title-order: 1;\" class=\"e-active elementor-element elementor-element-7b8c9dc e-con-full e-flex e-con e-child\" data-id=\"7b8c9dc\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t<div class=\"elementor-element elementor-element-3a4a198 e-flex e-con-boxed e-con e-child\" data-id=\"3a4a198\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-2e53105 elementor-widget-laptop__width-initial elementor-widget elementor-widget-heading\" data-id=\"2e53105\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Prepare and Detect\n<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-0129c65 elementor-widget-mobile__width-inherit elementor-widget elementor-widget-text-editor\" data-id=\"0129c65\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\tMonitor vegetation, terrain and thermal anomalies across large or remote areas. Visual, thermal and geospatial sensing can help identify changing risk conditions and emerging fire activity earlier. \t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-b992295 elementor-widget-laptop__width-initial elementor-widget elementor-widget-heading\" data-id=\"b992295\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Capabilities include:\n<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-0825a42 elementor-icon-list--layout-traditional elementor-list-item-link-full_width elementor-widget elementor-widget-icon-list\" data-id=\"0825a42\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"icon-list.default\">\n\t\t\t\t\t\t\t<ul class=\"elementor-icon-list-items\">\n\t\t\t\t\t\t\t<li class=\"elementor-icon-list-item\">\n\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-icon\">\n\t\t\t\t\t\t\t<svg aria-hidden=\"true\" class=\"e-font-icon-svg e-fas-check\" viewBox=\"0 0 512 512\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M173.898 439.404l-166.4-166.4c-9.997-9.997-9.997-26.206 0-36.204l36.203-36.204c9.997-9.998 26.207-9.998 36.204 0L192 312.69 432.095 72.596c9.997-9.997 26.207-9.997 36.204 0l36.203 36.204c9.997 9.997 9.997 26.206 0 36.204l-294.4 294.401c-9.998 9.997-26.207 9.997-36.204-.001z\"><\/path><\/svg>\t\t\t\t\t\t<\/span>\n\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-text\">Wildfire risk and vegetation assessment<\/span>\n\t\t\t\t\t\t\t\t\t<\/li>\n\t\t\t\t\t\t\t\t<li class=\"elementor-icon-list-item\">\n\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-icon\">\n\t\t\t\t\t\t\t<svg aria-hidden=\"true\" class=\"e-font-icon-svg e-fas-check\" viewBox=\"0 0 512 512\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M173.898 439.404l-166.4-166.4c-9.997-9.997-9.997-26.206 0-36.204l36.203-36.204c9.997-9.998 26.207-9.998 36.204 0L192 312.69 432.095 72.596c9.997-9.997 26.207-9.997 36.204 0l36.203 36.204c9.997 9.997 9.997 26.206 0 36.204l-294.4 294.401c-9.998 9.997-26.207 9.997-36.204-.001z\"><\/path><\/svg>\t\t\t\t\t\t<\/span>\n\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-text\">Thermal anomaly and hotspot detection <\/span>\n\t\t\t\t\t\t\t\t\t<\/li>\n\t\t\t\t\t\t\t\t<li class=\"elementor-icon-list-item\">\n\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-icon\">\n\t\t\t\t\t\t\t<svg aria-hidden=\"true\" class=\"e-font-icon-svg e-fas-check\" viewBox=\"0 0 512 512\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M173.898 439.404l-166.4-166.4c-9.997-9.997-9.997-26.206 0-36.204l36.203-36.204c9.997-9.998 26.207-9.998 36.204 0L192 312.69 432.095 72.596c9.997-9.997 26.207-9.997 36.204 0l36.203 36.204c9.997 9.997 9.997 26.206 0 36.204l-294.4 294.401c-9.998 9.997-26.207 9.997-36.204-.001z\"><\/path><\/svg>\t\t\t\t\t\t<\/span>\n\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-text\">Large-area surveillance and remote monitoring<\/span>\n\t\t\t\t\t\t\t\t\t<\/li>\n\t\t\t\t\t\t<\/ul>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-d1f4452 elementor-widget elementor-widget-spacer\" data-id=\"d1f4452\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"spacer.default\">\n\t\t\t\t\t\t\t<div class=\"elementor-spacer\">\n\t\t\t<div class=\"elementor-spacer-inner\"><\/div>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div id=\"e-n-tab-content-2587911432\" role=\"tabpanel\" aria-labelledby=\"e-n-tab-title-2587911432\" data-tab-index=\"2\" style=\"--n-tabs-title-order: 2;\" class=\" elementor-element elementor-element-4399dc3 e-con-full e-flex e-con e-child\" data-id=\"4399dc3\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t<div class=\"elementor-element elementor-element-8263d3f e-flex e-con-boxed e-con e-child\" data-id=\"8263d3f\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-542e305 elementor-widget-laptop__width-initial elementor-widget elementor-widget-heading\" data-id=\"542e305\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Understand and Coordinate\n<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-b996ec1 elementor-widget-mobile__width-inherit elementor-widget elementor-widget-text-editor\" data-id=\"b996ec1\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\tMaintain a continuously updated operational picture as an incident evolves. Live video, thermal intelligence, perimeter mapping, weather and terrain data, responder locations and communications support help incident command assess conditions.\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-b5c7099 elementor-widget-laptop__width-initial elementor-widget elementor-widget-heading\" data-id=\"b5c7099\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Capabilities include:\n<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-ee97138 elementor-icon-list--layout-traditional elementor-list-item-link-full_width elementor-widget elementor-widget-icon-list\" data-id=\"ee97138\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"icon-list.default\">\n\t\t\t\t\t\t\t<ul class=\"elementor-icon-list-items\">\n\t\t\t\t\t\t\t<li class=\"elementor-icon-list-item\">\n\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-icon\">\n\t\t\t\t\t\t\t<svg aria-hidden=\"true\" class=\"e-font-icon-svg e-fas-check\" viewBox=\"0 0 512 512\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M173.898 439.404l-166.4-166.4c-9.997-9.997-9.997-26.206 0-36.204l36.203-36.204c9.997-9.998 26.207-9.998 36.204 0L192 312.69 432.095 72.596c9.997-9.997 26.207-9.997 36.204 0l36.203 36.204c9.997 9.997 9.997 26.206 0 36.204l-294.4 294.401c-9.998 9.997-26.207 9.997-36.204-.001z\"><\/path><\/svg>\t\t\t\t\t\t<\/span>\n\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-text\">Persistent wildfire monitoring<\/span>\n\t\t\t\t\t\t\t\t\t<\/li>\n\t\t\t\t\t\t\t\t<li class=\"elementor-icon-list-item\">\n\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-icon\">\n\t\t\t\t\t\t\t<svg aria-hidden=\"true\" class=\"e-font-icon-svg e-fas-check\" viewBox=\"0 0 512 512\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M173.898 439.404l-166.4-166.4c-9.997-9.997-9.997-26.206 0-36.204l36.203-36.204c9.997-9.998 26.207-9.998 36.204 0L192 312.69 432.095 72.596c9.997-9.997 26.207-9.997 36.204 0l36.203 36.204c9.997 9.997 9.997 26.206 0 36.204l-294.4 294.401c-9.998 9.997-26.207 9.997-36.204-.001z\"><\/path><\/svg>\t\t\t\t\t\t<\/span>\n\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-text\">Live fire-perimeter and hotspot mapping<\/span>\n\t\t\t\t\t\t\t\t\t<\/li>\n\t\t\t\t\t\t\t\t<li class=\"elementor-icon-list-item\">\n\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-icon\">\n\t\t\t\t\t\t\t<svg aria-hidden=\"true\" class=\"e-font-icon-svg e-fas-check\" viewBox=\"0 0 512 512\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M173.898 439.404l-166.4-166.4c-9.997-9.997-9.997-26.206 0-36.204l36.203-36.204c9.997-9.998 26.207-9.998 36.204 0L192 312.69 432.095 72.596c9.997-9.997 26.207-9.997 36.204 0l36.203 36.204c9.997 9.997 9.997 26.206 0 36.204l-294.4 294.401c-9.998 9.997-26.207 9.997-36.204-.001z\"><\/path><\/svg>\t\t\t\t\t\t<\/span>\n\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-text\">Fire-behaviour, wind and terrain assessment<\/span>\n\t\t\t\t\t\t\t\t\t<\/li>\n\t\t\t\t\t\t\t\t<li class=\"elementor-icon-list-item\">\n\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-icon\">\n\t\t\t\t\t\t\t<svg aria-hidden=\"true\" class=\"e-font-icon-svg e-fas-check\" viewBox=\"0 0 512 512\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M173.898 439.404l-166.4-166.4c-9.997-9.997-9.997-26.206 0-36.204l36.203-36.204c9.997-9.998 26.207-9.998 36.204 0L192 312.69 432.095 72.596c9.997-9.997 26.207-9.997 36.204 0l36.203 36.204c9.997 9.997 9.997 26.206 0 36.204l-294.4 294.401c-9.998 9.997-26.207 9.997-36.204-.001z\"><\/path><\/svg>\t\t\t\t\t\t<\/span>\n\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-text\">Communications relay and responder tracking<\/span>\n\t\t\t\t\t\t\t\t\t<\/li>\n\t\t\t\t\t\t\t\t<li class=\"elementor-icon-list-item\">\n\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-icon\">\n\t\t\t\t\t\t\t<svg aria-hidden=\"true\" class=\"e-font-icon-svg e-fas-check\" viewBox=\"0 0 512 512\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M173.898 439.404l-166.4-166.4c-9.997-9.997-9.997-26.206 0-36.204l36.203-36.204c9.997-9.998 26.207-9.998 36.204 0L192 312.69 432.095 72.596c9.997-9.997 26.207-9.997 36.204 0l36.203 36.204c9.997 9.997 9.997 26.206 0 36.204l-294.4 294.401c-9.998 9.997-26.207 9.997-36.204-.001z\"><\/path><\/svg>\t\t\t\t\t\t<\/span>\n\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-text\">Real-time video, telemetry and geospatial intelligence<\/span>\n\t\t\t\t\t\t\t\t\t<\/li>\n\t\t\t\t\t\t<\/ul>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div id=\"e-n-tab-content-2587911433\" role=\"tabpanel\" aria-labelledby=\"e-n-tab-title-2587911433\" data-tab-index=\"3\" style=\"--n-tabs-title-order: 3;\" class=\" elementor-element elementor-element-ebf34b6 e-con-full e-flex e-con e-child\" data-id=\"ebf34b6\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t<div class=\"elementor-element elementor-element-ba605c2 e-flex e-con-boxed e-con e-child\" data-id=\"ba605c2\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-9f34481 elementor-widget-laptop__width-initial elementor-widget elementor-widget-heading\" data-id=\"9f34481\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Respond and Resupply\n<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-0bb3a0e elementor-widget-mobile__width-inherit elementor-widget elementor-widget-text-editor\" data-id=\"0bb3a0e\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\tExtend operational reach into remote or hazardous environments. Heavy-lift autonomous aircraft can complement conventional aviation by delivering suppressant, equipment and essential supplies closer to an incident without placing an onboard pilot at risk.\n\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-68b3b43 elementor-widget-laptop__width-initial elementor-widget elementor-widget-heading\" data-id=\"68b3b43\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Capabilities include:\n<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-c7e8a32 elementor-icon-list--layout-traditional elementor-list-item-link-full_width elementor-widget elementor-widget-icon-list\" data-id=\"c7e8a32\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"icon-list.default\">\n\t\t\t\t\t\t\t<ul class=\"elementor-icon-list-items\">\n\t\t\t\t\t\t\t<li class=\"elementor-icon-list-item\">\n\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-icon\">\n\t\t\t\t\t\t\t<svg aria-hidden=\"true\" class=\"e-font-icon-svg e-fas-check\" viewBox=\"0 0 512 512\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M173.898 439.404l-166.4-166.4c-9.997-9.997-9.997-26.206 0-36.204l36.203-36.204c9.997-9.998 26.207-9.998 36.204 0L192 312.69 432.095 72.596c9.997-9.997 26.207-9.997 36.204 0l36.203 36.204c9.997 9.997 9.997 26.206 0 36.204l-294.4 294.401c-9.998 9.997-26.207 9.997-36.204-.001z\"><\/path><\/svg>\t\t\t\t\t\t<\/span>\n\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-text\">Aerial delivery of water or fire retardant<\/span>\n\t\t\t\t\t\t\t\t\t<\/li>\n\t\t\t\t\t\t\t\t<li class=\"elementor-icon-list-item\">\n\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-icon\">\n\t\t\t\t\t\t\t<svg aria-hidden=\"true\" class=\"e-font-icon-svg e-fas-check\" viewBox=\"0 0 512 512\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M173.898 439.404l-166.4-166.4c-9.997-9.997-9.997-26.206 0-36.204l36.203-36.204c9.997-9.998 26.207-9.998 36.204 0L192 312.69 432.095 72.596c9.997-9.997 26.207-9.997 36.204 0l36.203 36.204c9.997 9.997 9.997 26.206 0 36.204l-294.4 294.401c-9.998 9.997-26.207 9.997-36.204-.001z\"><\/path><\/svg>\t\t\t\t\t\t<\/span>\n\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-text\">Resupply of pumps, hoses and communications equipment<\/span>\n\t\t\t\t\t\t\t\t\t<\/li>\n\t\t\t\t\t\t\t\t<li class=\"elementor-icon-list-item\">\n\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-icon\">\n\t\t\t\t\t\t\t<svg aria-hidden=\"true\" class=\"e-font-icon-svg e-fas-check\" viewBox=\"0 0 512 512\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M173.898 439.404l-166.4-166.4c-9.997-9.997-9.997-26.206 0-36.204l36.203-36.204c9.997-9.998 26.207-9.998 36.204 0L192 312.69 432.095 72.596c9.997-9.997 26.207-9.997 36.204 0l36.203 36.204c9.997 9.997 9.997 26.206 0 36.204l-294.4 294.401c-9.998 9.997-26.207 9.997-36.204-.001z\"><\/path><\/svg>\t\t\t\t\t\t<\/span>\n\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-text\">Delivery of food, water and medical supplies to fire crews<\/span>\n\t\t\t\t\t\t\t\t\t<\/li>\n\t\t\t\t\t\t\t\t<li class=\"elementor-icon-list-item\">\n\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-icon\">\n\t\t\t\t\t\t\t<svg aria-hidden=\"true\" class=\"e-font-icon-svg e-fas-check\" viewBox=\"0 0 512 512\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M173.898 439.404l-166.4-166.4c-9.997-9.997-9.997-26.206 0-36.204l36.203-36.204c9.997-9.998 26.207-9.998 36.204 0L192 312.69 432.095 72.596c9.997-9.997 26.207-9.997 36.204 0l36.203 36.204c9.997 9.997 9.997 26.206 0 36.204l-294.4 294.401c-9.998 9.997-26.207 9.997-36.204-.001z\"><\/path><\/svg>\t\t\t\t\t\t<\/span>\n\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-text\">Support for remote communities and isolated operating bases<\/span>\n\t\t\t\t\t\t\t\t\t<\/li>\n\t\t\t\t\t\t<\/ul>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-2d864c9 elementor-widget elementor-widget-spacer\" data-id=\"2d864c9\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"spacer.default\">\n\t\t\t\t\t\t\t<div class=\"elementor-spacer\">\n\t\t\t<div class=\"elementor-spacer-inner\"><\/div>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div id=\"e-n-tab-content-2587911434\" role=\"tabpanel\" aria-labelledby=\"e-n-tab-title-2587911434\" data-tab-index=\"4\" style=\"--n-tabs-title-order: 4;\" class=\" elementor-element elementor-element-fd79f8a e-con-full e-flex e-con e-child\" data-id=\"fd79f8a\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t<div class=\"elementor-element elementor-element-29d4c54 e-flex e-con-boxed e-con e-child\" data-id=\"29d4c54\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-860882c elementor-widget-laptop__width-initial elementor-widget elementor-widget-heading\" data-id=\"860882c\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Recover and Restore\n<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-c81e045 elementor-widget-mobile__width-inherit elementor-widget elementor-widget-text-editor\" data-id=\"c81e045\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\tMap burned areas, assess infrastructure and environmental damage, and support recovery planning. Heavy-lift aerial seeding can also help accelerate reforestation where terrain, scale or safety constraints make conventional planting difficult.\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-5fd60b1 elementor-widget-laptop__width-initial elementor-widget elementor-widget-heading\" data-id=\"5fd60b1\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Capabilities include:\n<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-6d1e36a elementor-icon-list--layout-traditional elementor-list-item-link-full_width elementor-widget elementor-widget-icon-list\" data-id=\"6d1e36a\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"icon-list.default\">\n\t\t\t\t\t\t\t<ul class=\"elementor-icon-list-items\">\n\t\t\t\t\t\t\t<li class=\"elementor-icon-list-item\">\n\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-icon\">\n\t\t\t\t\t\t\t<svg aria-hidden=\"true\" class=\"e-font-icon-svg e-fas-check\" viewBox=\"0 0 512 512\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M173.898 439.404l-166.4-166.4c-9.997-9.997-9.997-26.206 0-36.204l36.203-36.204c9.997-9.998 26.207-9.998 36.204 0L192 312.69 432.095 72.596c9.997-9.997 26.207-9.997 36.204 0l36.203 36.204c9.997 9.997 9.997 26.206 0 36.204l-294.4 294.401c-9.998 9.997-26.207 9.997-36.204-.001z\"><\/path><\/svg>\t\t\t\t\t\t<\/span>\n\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-text\">Post-fire mapping and damage assessment<\/span>\n\t\t\t\t\t\t\t\t\t<\/li>\n\t\t\t\t\t\t\t\t<li class=\"elementor-icon-list-item\">\n\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-icon\">\n\t\t\t\t\t\t\t<svg aria-hidden=\"true\" class=\"e-font-icon-svg e-fas-check\" viewBox=\"0 0 512 512\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M173.898 439.404l-166.4-166.4c-9.997-9.997-9.997-26.206 0-36.204l36.203-36.204c9.997-9.998 26.207-9.998 36.204 0L192 312.69 432.095 72.596c9.997-9.997 26.207-9.997 36.204 0l36.203 36.204c9.997 9.997 9.997 26.206 0 36.204l-294.4 294.401c-9.998 9.997-26.207 9.997-36.204-.001z\"><\/path><\/svg>\t\t\t\t\t\t<\/span>\n\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-text\">Critical-infrastructure inspection<\/span>\n\t\t\t\t\t\t\t\t\t<\/li>\n\t\t\t\t\t\t\t\t<li class=\"elementor-icon-list-item\">\n\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-icon\">\n\t\t\t\t\t\t\t<svg aria-hidden=\"true\" class=\"e-font-icon-svg e-fas-check\" viewBox=\"0 0 512 512\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M173.898 439.404l-166.4-166.4c-9.997-9.997-9.997-26.206 0-36.204l36.203-36.204c9.997-9.998 26.207-9.998 36.204 0L192 312.69 432.095 72.596c9.997-9.997 26.207-9.997 36.204 0l36.203 36.204c9.997 9.997 9.997 26.206 0 36.204l-294.4 294.401c-9.998 9.997-26.207 9.997-36.204-.001z\"><\/path><\/svg>\t\t\t\t\t\t<\/span>\n\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-text\">Recovery-zone prioritization<\/span>\n\t\t\t\t\t\t\t\t\t<\/li>\n\t\t\t\t\t\t\t\t<li class=\"elementor-icon-list-item\">\n\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-icon\">\n\t\t\t\t\t\t\t<svg aria-hidden=\"true\" class=\"e-font-icon-svg e-fas-check\" viewBox=\"0 0 512 512\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M173.898 439.404l-166.4-166.4c-9.997-9.997-9.997-26.206 0-36.204l36.203-36.204c9.997-9.998 26.207-9.998 36.204 0L192 312.69 432.095 72.596c9.997-9.997 26.207-9.997 36.204 0l36.203 36.204c9.997 9.997 9.997 26.206 0 36.204l-294.4 294.401c-9.998 9.997-26.207 9.997-36.204-.001z\"><\/path><\/svg>\t\t\t\t\t\t<\/span>\n\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-text\">Precision aerial seeding and reforestation support<\/span>\n\t\t\t\t\t\t\t\t\t<\/li>\n\t\t\t\t\t\t<\/ul>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-a9bfbb2 elementor-widget elementor-widget-spacer\" data-id=\"a9bfbb2\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"spacer.default\">\n\t\t\t\t\t\t\t<div class=\"elementor-spacer\">\n\t\t\t<div class=\"elementor-spacer-inner\"><\/div>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-a65e57d e-flex e-con-boxed e-con e-parent\" data-id=\"a65e57d\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-0c451bc elementor-widget__width-initial elementor-widget-laptop__width-initial elementor-widget elementor-widget-heading\" data-id=\"0c451bc\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">A New Class of <span style=\"color: #FFB601\">Wildfire Response Technology<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-c69dcf3 elementor-widget__width-initial elementor-widget-mobile__width-inherit elementor-widget elementor-widget-text-editor\" data-id=\"c69dcf3\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\tVolatus is bringing together three complementary capabilities: operational aerial services, persistent intelligence and resilient communications, and heavy-lift autonomous response. Together, they help wildfire agencies understand evolving incidents and act with greater speed, reach and flexibility. \t\t\t\t\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-10d1cb9 e-con-full e-flex e-con e-child\" data-id=\"10d1cb9\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t<div class=\"elementor-element elementor-element-ede924f e-con-full e-flex e-con e-child\" data-id=\"ede924f\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t<div class=\"elementor-element elementor-element-131cd8a elementor-widget elementor-widget-html\" data-id=\"131cd8a\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<!-- =========================================================================\r\n     FLYOX I 3D WIREFRAME SPECIFICATION CALLOUTS - ELEMENTOR HTML WIDGET\r\n     (Focus Inspection Mode: Shows Only Hovered Label, Hides Others)\r\n     ========================================================================= -->\r\n\r\n<style>\r\n@import url('https:\/\/fonts.googleapis.com\/css2?family=Space+Grotesk:wght@500;600&family=IBM+Plex+Mono:wght@500&display=swap');\r\n\r\n:root {\r\n  --flyox-amber: #f0a43a;\r\n  --flyox-amber-hi: #ffc670;\r\n  --flyox-ink: #e8f0f7;\r\n  --flyox-line: #222d3a;\r\n  --flyox-bg: #111111;\r\n}\r\n\r\n\/* Scoped root container *\/\r\n.flyox-widget-root {\r\n  position: relative !important;\r\n  width: 100% !important;\r\n  max-width: 100% !important;\r\n  margin: 0 auto !important;\r\n  padding: 0 !important;\r\n  background: #111111 !important;\r\n  border-top: 1px solid #222222 !important;\r\n  border-bottom: 1px solid #222222 !important;\r\n  box-sizing: border-box !important;\r\n  font-family: 'Space Grotesk', -apple-system, BlinkMacSystemFont, sans-serif !important;\r\n  -webkit-font-smoothing: antialiased !important;\r\n  overflow: hidden !important;\r\n}\r\n\r\n.flyox-widget-root *,\r\n.flyox-widget-root *::before,\r\n.flyox-widget-root *::after {\r\n  box-sizing: border-box !important;\r\n}\r\n\r\n\/* Stage & Canvas *\/\r\n.flyox-widget-root .flyox-stage {\r\n  position: relative !important;\r\n  width: 100% !important;\r\n  height: clamp(340px, 50vh, 560px) !important;\r\n  overflow: hidden !important;\r\n  user-select: none !important;\r\n  -webkit-user-select: none !important;\r\n  background: #111111 !important;\r\n}\r\n\r\n.flyox-widget-root canvas.flyox-canvas {\r\n  position: absolute !important;\r\n  inset: 0 !important;\r\n  top: 0 !important;\r\n  left: 0 !important;\r\n  width: 100% !important;\r\n  height: 100% !important;\r\n  max-width: none !important;\r\n  max-height: none !important;\r\n  display: block !important;\r\n  cursor: grab !important;\r\n  touch-action: pan-y !important;\r\n  margin: 0 !important;\r\n  padding: 0 !important;\r\n  border: none !important;\r\n  box-shadow: none !important;\r\n  background: #111111 !important;\r\n}\r\n\r\n.flyox-widget-root canvas.flyox-canvas:active {\r\n  cursor: grabbing !important;\r\n}\r\n\r\n\/* Specification Callouts *\/\r\n.flyox-widget-root .flyox-callout {\r\n  position: absolute !important;\r\n  z-index: 10 !important;\r\n  background: rgba(17, 17, 17, 0.92) !important;\r\n  border: 1px solid var(--flyox-line) !important;\r\n  border-left: 2px solid var(--flyox-amber) !important;\r\n  padding: 9px 12px 10px !important;\r\n  margin: 0 !important;\r\n  opacity: 0 !important;\r\n  transform: translateY(8px) !important;\r\n  transition: opacity 0.35s cubic-bezier(0.2, 0.7, 0.25, 1),\r\n              transform 0.3s cubic-bezier(0.2, 0.7, 0.25, 1),\r\n              border-color 0.2s ease,\r\n              background 0.2s ease,\r\n              box-shadow 0.2s ease !important;\r\n  backdrop-filter: blur(8px) !important;\r\n  -webkit-backdrop-filter: blur(8px) !important;\r\n  cursor: pointer !important;\r\n  pointer-events: auto !important;\r\n  box-shadow: 0 4px 20px rgba(0, 0, 0, 0.6) !important;\r\n}\r\n\r\n.flyox-widget-root .flyox-callout.show {\r\n  opacity: 1 !important;\r\n  transform: none !important;\r\n}\r\n\r\n\/* FOCUS INSPECTION MODE: Hide all non-hovered labels *\/\r\n.flyox-widget-root.has-hover .flyox-callout:not(.active-hover) {\r\n  opacity: 0 !important;\r\n  transform: translateY(6px) scale(0.96) !important;\r\n  pointer-events: none !important;\r\n}\r\n\r\n\/* Spotlight style on the single active hovered label *\/\r\n.flyox-widget-root.has-hover .flyox-callout.active-hover {\r\n  opacity: 1 !important;\r\n  transform: translateY(-2px) scale(1.02) !important;\r\n  border-color: #4a637d !important;\r\n  border-left-color: var(--flyox-amber-hi) !important;\r\n  background: rgba(26, 26, 26, 0.98) !important;\r\n  pointer-events: auto !important;\r\n}\r\n\r\n.flyox-widget-root .flyox-callout h3 {\r\n  margin: 0 !important;\r\n  padding: 0 !important;\r\n  font-family: 'Space Grotesk', sans-serif !important;\r\n  font-weight: 600 !important;\r\n  font-size: 11px !important;\r\n  line-height: 1.3 !important;\r\n  letter-spacing: 0.12em !important;\r\n  text-transform: uppercase !important;\r\n  color: var(--flyox-ink) !important;\r\n  white-space: nowrap !important;\r\n  transition: color 0.2s ease !important;\r\n}\r\n\r\n.flyox-widget-root.has-hover .flyox-callout.active-hover h3 {\r\n  color: #ffffff !important;\r\n}\r\n\r\n.flyox-widget-root .flyox-callout p {\r\n  margin: 4px 0 0 0 !important;\r\n  padding: 0 !important;\r\n  font-family: 'IBM Plex Mono', monospace !important;\r\n  font-weight: 500 !important;\r\n  font-size: 9px !important;\r\n  line-height: 1.35 !important;\r\n  letter-spacing: 0.08em !important;\r\n  color: var(--flyox-amber) !important;\r\n  white-space: nowrap !important;\r\n  transition: color 0.2s ease, text-shadow 0.2s ease !important;\r\n}\r\n\r\n.flyox-widget-root.has-hover .flyox-callout.active-hover p {\r\n  color: var(--flyox-amber-hi) !important;\r\n  text-shadow: 0 0 8px rgba(255, 198, 112, 0.4) !important;\r\n}\r\n\r\n\/* Mobile Screens (< 540px) *\/\r\n@media (max-width: 540px) {\r\n  .flyox-widget-root .flyox-stage {\r\n    height: clamp(320px, 52vh, 460px) !important;\r\n  }\r\n  .flyox-widget-root .flyox-callout {\r\n    padding: 7px 9px 8px !important;\r\n  }\r\n  .flyox-widget-root .flyox-callout h3 {\r\n    font-size: 9.5px !important;\r\n    letter-spacing: 0.08em !important;\r\n    white-space: normal !important;\r\n  }\r\n  .flyox-widget-root .flyox-callout p {\r\n    font-size: 7.5px !important;\r\n    white-space: normal !important;\r\n    margin-top: 2px !important;\r\n  }\r\n}\r\n<\/style>\r\n\r\n<div class=\"flyox-widget-root\" id=\"flyox-root\">\r\n  <div class=\"flyox-stage\" id=\"flyox-stage\">\r\n    <canvas class=\"flyox-canvas\" id=\"flyox-canvas\"><\/canvas>\r\n  <\/div>\r\n<\/div>\r\n\r\n<script>\r\n(function() {\r\n  'use strict';\r\n\r\n  \/* =========================================================================\r\n     MANUAL ADJUSTMENT CONTROLS\r\n     ========================================================================= *\/\r\n  const CONFIG = {\r\n    \/\/ Zoom \/ Size\r\n    zoomDesktop: 0.95,      \/\/ Desktop scale (default: 0.95)\r\n    zoomMobile: 0.88,       \/\/ Mobile scale (default: 0.88)\r\n    \r\n    \/\/ --- EXACT CENTERING OFFSETS ---\r\n    offsetX_desktop: 4,     \/\/ Horizontal shift (+ moves right, - moves left)\r\n    offsetY_desktop: 20,    \/\/ Vertical shift (+ moves down, - moves up)\r\n    \r\n    offsetX_mobile: 2,\r\n    offsetY_mobile: 14,\r\n\r\n    \/\/ --- SHORTENED BOTTOM LABELING LINES ---\r\n    bottomLineLengthDesktop: 48,  \/\/ Distance in px from the wheel\/hull to the bottom cards\r\n    bottomLineLengthMobile: 36,   \/\/ Distance in px on mobile phones\r\n\r\n    \/\/ Camera Angles\r\n    azimuth: 1.92,          \/\/ Horizontal rotation (1.92 = front-facing 3\/4 angle)\r\n    elevation: 0.32,        \/\/ Vertical tilt (0.32 = slightly elevated top-down)\r\n    \r\n    \/\/ 3D Center of Focus [X, Y, Z]\r\n    center: [2.6, 0.0, 1.40],\r\n\r\n    \/\/ 3D Hover Detection Radius (in screen pixels)\r\n    hitThreshold: 32,\r\n\r\n    \/\/ Propeller speed multiplier\r\n    propellerSpeed: 8,\r\n  };\r\n\r\n  \/* ---------------------------------------------------------\r\n     GEOMETRY ENGINE\r\n     --------------------------------------------------------- *\/\r\n  const GEO = {}; \r\n  let BP = 'hull';\r\n  const seg  = (a, b) => GEO[BP].segs.push(a[0], a[1], a[2], b[0], b[1], b[2]);\r\n  const gseg = (a, b) => GEO[BP].grid.push(a[0], a[1], a[2], b[0], b[1], b[2]);\r\n  ['nose', 'hull', 'payload', 'wing', 'prop', 'pylon', 'gear', 'vtail', 'tailwheel']\r\n    .forEach(id => GEO[id] = { segs: [], grid: [] });\r\n\r\n  function loop(pts, close = true, isGrid = false) {\r\n    const fn = isGrid ? gseg : seg;\r\n    for (let i = 0; i < pts.length - 1; i++) fn(pts[i], pts[i + 1]);\r\n    if (close && pts.length > 2) fn(pts[pts.length - 1], pts[0]);\r\n  }\r\n  function circXZ(cx, cy, cz, r, n = 24, isGrid = false) {\r\n    const p = [];\r\n    for (let i = 0; i < n; i++) {\r\n      const a = 2 * Math.PI * i \/ n;\r\n      p.push([cx + r * Math.cos(a), cy, cz + r * Math.sin(a)]);\r\n    }\r\n    loop(p, true, isGrid);\r\n  }\r\n  function circYZ(cx, cy, cz, r, n = 16, isGrid = false) {\r\n    const p = [];\r\n    for (let i = 0; i < n; i++) {\r\n      const a = 2 * Math.PI * i \/ n;\r\n      p.push([cx, cy + r * Math.cos(a), cz + r * Math.sin(a)]);\r\n    }\r\n    loop(p, true, isGrid);\r\n  }\r\n  function circXY(cx, cy, cz, r, n = 16, isGrid = false) {\r\n    const p = [];\r\n    for (let i = 0; i < n; i++) {\r\n      const a = 2 * Math.PI * i \/ n;\r\n      p.push([cx + r * Math.cos(a), cy + r * Math.sin(a), cz]);\r\n    }\r\n    loop(p, true, isGrid);\r\n  }\r\n\r\n  \/* 1. Fuselage \/ Hull *\/\r\n  function getFuselageStation(x) {\r\n    let w = 0.60, zd = 1.70, zc = 0.80, zb = 0.55;\r\n    if (x < 0.95) {\r\n      const t = x \/ 0.95;\r\n      w = 0.10 + 0.48 * Math.pow(t, 0.7);\r\n      zd = 1.15 + 0.55 * Math.pow(t, 0.8);\r\n      zc = 0.98 - 0.18 * t;\r\n      zb = 0.95 - 0.38 * t;\r\n    } else if (x <= 2.45) {\r\n      w = 0.60; zd = 1.70; zc = 0.80; zb = 0.55;\r\n    } else {\r\n      const t = (x - 2.45) \/ (7.25 - 2.45);\r\n      w = 0.58 * (1 - 0.90 * t);\r\n      zd = 1.70;\r\n      zc = 0.80 + 0.76 * t;\r\n      zb = 0.55 + 0.99 * t;\r\n    }\r\n    return { x, w, zd, zc, zb };\r\n  }\r\n\r\n  const numFuseStations = 38, fuseLoops = [];\r\n  for (let i = 0; i <= numFuseStations; i++) {\r\n    const x = 0.15 + (7.25 - 0.15) * (i \/ numFuseStations);\r\n    const st = getFuselageStation(x);\r\n    const w = st.w, zd = st.zd, zc = st.zc, zb = st.zb;\r\n    const pts = [\r\n      [x, -w, zd], [x, -w, zd - (zd - zc) * 0.33], [x, -w, zd - (zd - zc) * 0.66], [x, -w, zc],\r\n      [x, -0.75 * w, zb + (zc - zb) * 0.65], [x, -0.40 * w, zb + (zc - zb) * 0.30], [x, 0, zb],\r\n      [x, 0.40 * w, zb + (zc - zb) * 0.30], [x, 0.75 * w, zb + (zc - zb) * 0.65], [x, w, zc],\r\n      [x, w, zd - (zd - zc) * 0.66], [x, w, zd - (zd - zc) * 0.33], [x, w, zd],\r\n      [x, 0.66 * w, zd], [x, 0.33 * w, zd], [x, 0, zd], [x, -0.33 * w, zd], [x, -0.66 * w, zd]\r\n    ];\r\n    fuseLoops.push(pts);\r\n    loop(pts, true, i % 2 !== 0);\r\n  }\r\n  const bowTip = [0.0, 0.0, 1.02];\r\n  fuseLoops[0].forEach(p => seg(bowTip, p));\r\n  for (let p = 0; p < fuseLoops[0].length; p++) {\r\n    for (let i = 0; i < fuseLoops.length - 1; i++) {\r\n      const isMajor = (p === 0 || p === 3 || p === 6 || p === 9 || p === 12 || p === 15);\r\n      (isMajor ? seg : gseg)(fuseLoops[i][p], fuseLoops[i + 1][p]);\r\n    }\r\n  }\r\n\r\n  \/* 2. Nose details *\/\r\n  BP = 'nose';\r\n  loop([[0.55, -0.22, 1.38], [0.85, -0.22, 1.62], [0.85, 0.22, 1.62], [0.55, 0.22, 1.38]]);\r\n  seg([0.55, 0, 1.38], [0.85, 0, 1.62]);\r\n  loop([[0.35, -0.06, 1.32], [0.50, -0.05, 1.40], [0.50, 0.05, 1.40], [0.35, 0.06, 1.32]]);\r\n  for (const s of [-1, 1]) {\r\n    loop([[0.68, s * 0.45, 0.95], [0.92, s * 0.45, 0.95], [0.92, s * 0.45, 1.35], [0.68, s * 0.45, 1.35]]);\r\n    for (let l = 0; l < 7; l++) {\r\n      const xl = 0.96 + l * 0.045;\r\n      seg([xl, s * 0.52, 0.95], [xl, s * 0.52, 1.35]);\r\n    }\r\n    loop([[0.96, s * 0.52, 0.95], [1.26, s * 0.52, 0.95], [1.26, s * 0.52, 1.35], [0.96, s * 0.52, 1.35]]);\r\n  }\r\n\r\n  \/* 3. Payload Bay *\/\r\n  BP = 'payload';\r\n  for (const s of [-1, 1]) {\r\n    loop([[1.45, s * 0.60, 0.70], [2.45, s * 0.60, 0.70], [2.45, s * 0.60, 1.60], [1.45, s * 0.60, 1.60]]);\r\n    seg([1.95, s * 0.60, 0.70], [1.95, s * 0.60, 1.60]);\r\n    gseg([1.70, s * 0.60, 0.70], [1.70, s * 0.60, 1.60]);\r\n    gseg([2.20, s * 0.60, 0.70], [2.20, s * 0.60, 1.60]);\r\n    gseg([1.45, s * 0.60, 1.15], [2.45, s * 0.60, 1.15]);\r\n    loop([[2.40, s * 0.605, 1.15], [2.44, s * 0.605, 1.15], [2.44, s * 0.605, 1.25], [2.40, s * 0.605, 1.25]]);\r\n    loop([[2.75, s * 0.54, 1.32], [3.00, s * 0.54, 1.32], [3.00, s * 0.54, 1.55], [2.75, s * 0.54, 1.55]]);\r\n    loop([[2.78, s * 0.545, 1.35], [2.97, s * 0.545, 1.35], [2.97, s * 0.545, 1.52], [2.78, s * 0.545, 1.52]]);\r\n  }\r\n\r\n  \/* 4. Hull details *\/\r\n  BP = 'hull';\r\n  seg([4.20, 0, 1.70], [4.20, 0, 2.05]);\r\n  loop([[4.95, -0.04, 1.70], [5.15, -0.04, 1.70], [5.10, -0.04, 1.78], [5.00, -0.04, 1.78]]);\r\n  loop([[4.95, 0.04, 1.70], [5.15, 0.04, 1.70], [5.10, 0.04, 1.78], [5.00, 0.04, 1.78]]);\r\n  seg([5.00, -0.04, 1.78], [5.00, 0.04, 1.78]);\r\n  seg([5.10, -0.04, 1.78], [5.10, 0.04, 1.78]);\r\n  loop([[6.05, 0, 1.70], [6.25, 0, 1.70], [6.20, 0, 1.95], [6.08, 0, 1.95]]);\r\n  loop([[5.30, -0.04, 1.70], [5.60, -0.03, 1.78], [5.60, 0.03, 1.78], [5.30, 0.04, 1.70]]);\r\n  seg([5.30, 0, 1.70], [5.60, 0, 1.78]);\r\n  circXY(5.85, 0, 1.702, 0.06, 16);\r\n  circXY(5.85, 0, 1.702, 0.02, 8);\r\n  for (let r = 0; r < 4; r++) {\r\n    const xr = 7.25 + r * 0.07;\r\n    circYZ(xr, 0, 1.62, 0.08 * (1 - r * 0.28), 14);\r\n  }\r\n  seg([7.25, -0.08, 1.62], [7.48, 0, 1.62]);\r\n  seg([7.25, 0.08, 1.62], [7.48, 0, 1.62]);\r\n  seg([7.25, 0, 1.70], [7.48, 0, 1.62]);\r\n  seg([7.25, 0, 1.54], [7.48, 0, 1.62]);\r\n\r\n  \/* 5. V-tail *\/\r\n  BP = 'vtail';\r\n  const tailSpan = 1.65, tailRootX = 5.95, tailTipX = 6.95, tailChordRoot = 1.10, tailDihedralAngle = 0.72;\r\n  for (const side of [-1, 1]) {\r\n    const sinD = Math.sin(tailDihedralAngle), cosD = Math.cos(tailDihedralAngle) * side;\r\n    const numRibs = 14, ribLoops = [];\r\n    for (let r = 0; r <= numRibs; r++) {\r\n      const t = r \/ numRibs, ribSpan = t * tailSpan;\r\n      const yPos = ribSpan * cosD, zPos = 1.70 + ribSpan * sinD;\r\n      const xLE = tailRootX + t * (tailTipX - tailRootX);\r\n      const chord = tailChordRoot * (1 - t * 0.40);\r\n      const xTE = xLE + chord, xSparMain = xLE + chord * 0.32, xSparMid = xLE + chord * 0.52, xSparRear = xLE + chord * 0.74;\r\n      const maxThick = chord * 0.12;\r\n      const ribPts = [\r\n        [xLE, yPos, zPos],\r\n        [xLE + chord * 0.08, yPos, zPos + maxThick * 0.42 * cosD],\r\n        [xLE + chord * 0.18, yPos, zPos + maxThick * 0.50 * cosD],\r\n        [xSparMain, yPos, zPos + maxThick * 0.50 * cosD],\r\n        [xSparMid, yPos, zPos + maxThick * 0.40 * cosD],\r\n        [xSparRear, yPos, zPos + maxThick * 0.25 * cosD],\r\n        [xTE, yPos, zPos],\r\n        [xSparRear, yPos, zPos - maxThick * 0.25 * cosD],\r\n        [xSparMid, yPos, zPos - maxThick * 0.40 * cosD],\r\n        [xSparMain, yPos, zPos - maxThick * 0.50 * cosD],\r\n        [xLE + chord * 0.18, yPos, zPos - maxThick * 0.50 * cosD],\r\n        [xLE + chord * 0.08, yPos, zPos - maxThick * 0.42 * cosD]\r\n      ];\r\n      ribLoops.push(ribPts);\r\n      loop(ribPts, true, r % 2 !== 0);\r\n      if (r > 0 && r < numRibs) {\r\n        const hRad = maxThick * 0.24;\r\n        [xLE + chord * 0.24, xLE + chord * 0.44, xLE + chord * 0.64].forEach(hx => {\r\n          const holePts = [];\r\n          for (let h = 0; h < 8; h++) {\r\n            const ha = h * Math.PI \/ 4;\r\n            holePts.push([hx + hRad * Math.cos(ha), yPos, zPos + hRad * Math.sin(ha) * cosD]);\r\n          }\r\n          loop(holePts, true, true);\r\n        });\r\n      }\r\n    }\r\n    for (let p = 0; p < ribLoops[0].length; p++) {\r\n      for (let r = 0; r < ribLoops.length - 1; r++) {\r\n        const isMajor = (p === 0 || p === 3 || p === 5 || p === 6 || p === 9);\r\n        (isMajor ? seg : gseg)(ribLoops[r][p], ribLoops[r + 1][p]);\r\n      }\r\n    }\r\n  }\r\n\r\n  \/* 6. Tail Wheel *\/\r\n  BP = 'tailwheel';\r\n  const twPivotX = 6.55, twPivotZ = 1.45, twForkX = 7.32, twForkZ = 0.85, twHubX = 7.45, twHubZ = 0.75;\r\n  loop([[6.40, -0.06, 1.48], [6.60, -0.06, 1.48], [6.60, -0.06, 1.40], [6.40, -0.06, 1.40]]);\r\n  loop([[6.40, 0.06, 1.48], [6.60, 0.06, 1.48], [6.60, 0.06, 1.40], [6.40, 0.06, 1.40]]);\r\n  seg([twPivotX, -0.03, twPivotZ], [twForkX, -0.03, twForkZ]);\r\n  seg([twPivotX, 0.03, twPivotZ], [twForkX, 0.03, twForkZ]);\r\n  seg([twPivotX, 0, twPivotZ + 0.03], [twForkX, 0, twForkZ + 0.03]);\r\n  seg([twPivotX, 0, twPivotZ - 0.03], [twForkX, 0, twForkZ - 0.03]);\r\n  for (let b = 1; b <= 8; b++) {\r\n    const tb = b \/ 9;\r\n    circYZ(twPivotX + (twForkX - twPivotX) * tb * 0.70, 0, twPivotZ + (twForkZ - twPivotZ) * tb * 0.70, 0.055, 14);\r\n  }\r\n  seg([7.20, 0, 1.54], [twForkX, 0, twForkZ]);\r\n  seg([7.20, -0.04, 1.54], [twForkX, -0.04, twForkZ]);\r\n  seg([7.20, 0.04, 1.54], [twForkX, 0.04, twForkZ]);\r\n  seg([twForkX, -0.04, twForkZ], [twHubX, -0.04, twHubZ]);\r\n  seg([twForkX, 0.04, twForkZ], [twHubX, 0.04, twHubZ]);\r\n  seg([twHubX, -0.04, twHubZ], [twHubX, 0.04, twHubZ]);\r\n  const twRadius = 0.22, twHubR = 0.065;\r\n  for (let tr = -3; tr <= 3; tr++) {\r\n    circXZ(twHubX, tr * 0.012, twHubZ, twRadius * (1 - Math.abs(tr) * 0.04), 20, Math.abs(tr) > 1);\r\n  }\r\n  circXZ(twHubX, 0, twHubZ, twRadius * 0.72, 16);\r\n  circXZ(twHubX, 0, twHubZ, twRadius * 0.50, 12, true);\r\n  circXZ(twHubX, 0, twHubZ, twHubR, 12);\r\n  for (let s = 0; s < 16; s++) {\r\n    const sa = s * Math.PI * 2 \/ 16;\r\n    seg([twHubX + twHubR * Math.cos(sa), 0, twHubZ + twHubR * Math.sin(sa)],\r\n        [twHubX + twRadius * 0.72 * Math.cos(sa), 0, twHubZ + twRadius * 0.72 * Math.sin(sa)]);\r\n  }\r\n\r\n  \/* 7. Main Gear *\/\r\n  BP = 'gear';\r\n  for (const s of [-1, 1]) {\r\n    const yg = s * 0.82, xg = 2.05, zg = 0.32;\r\n    loop([[1.80, s * 0.60, 1.35], [2.30, s * 0.60, 1.35], [2.20, s * 0.60, 0.95], [1.90, s * 0.60, 0.95]]);\r\n    loop([[1.83, s * 0.54, 1.32], [2.27, s * 0.54, 1.32], [2.17, s * 0.54, 0.98], [1.93, s * 0.54, 0.98]]);\r\n    seg([1.93, s * 0.54, 1.05], [2.17, s * 0.54, 1.05]);\r\n    seg([2.05, s * 0.54, 1.05], [2.05, s * 0.54, 0.92]);\r\n    seg([xg, s * 0.54, 0.92], [xg, yg, zg]);\r\n    seg([xg - 0.03, s * 0.54, 0.92], [xg - 0.03, yg, zg]);\r\n    seg([xg + 0.03, s * 0.54, 0.92], [xg + 0.03, yg, zg]);\r\n    seg([1.80, s * 0.58, 0.65], [xg, yg, zg]);\r\n    seg([2.30, s * 0.58, 0.65], [xg, yg, zg]);\r\n    seg([1.85, s * 0.62, 0.55], [xg, yg, zg]);\r\n    seg([2.25, s * 0.62, 0.55], [xg, yg, zg]);\r\n    const mwRadius = 0.34, mwHubR = 0.12;\r\n    for (let wr = -3; wr <= 3; wr++) {\r\n      circXZ(xg, yg + s * wr * 0.022, zg, mwRadius * (1 - Math.abs(wr) * 0.03), 24, Math.abs(wr) > 1);\r\n    }\r\n    circXZ(xg, yg, zg, mwRadius * 0.72, 20);\r\n    circXZ(xg, yg, zg, mwRadius * 0.52, 16, true);\r\n    circXZ(xg, yg, zg, mwHubR, 12);\r\n    for (let a = 0; a < 12; a++) {\r\n      const ang = a * Math.PI * 2 \/ 12;\r\n      seg([xg + mwHubR * Math.cos(ang), yg, zg + mwHubR * Math.sin(ang)],\r\n          [xg + mwRadius * 0.72 * Math.cos(ang), yg, zg + mwRadius * 0.72 * Math.sin(ang)]);\r\n    }\r\n  }\r\n\r\n  \/* 8. Main Wing *\/\r\n  BP = 'wing';\r\n  const WX = 1.55, WC = 1.40, WZ = 2.25;\r\n  const foil = (x0, z0, c, y) => [\r\n    [0, 0], [0.06, 0.028], [0.12, 0.042], [0.22, 0.054], [0.35, 0.058], [0.50, 0.046],\r\n    [0.68, 0.028], [0.85, 0.014], [1.00, 0.005], [0.85, -0.008], [0.68, -0.018], [0.50, -0.025],\r\n    [0.35, -0.028], [0.22, -0.024], [0.12, -0.018], [0.06, -0.010]\r\n  ].map(q => [x0 + q[0] * c, y, z0 + q[1] * c]);\r\n  \r\n  const numWingStations = 28, wingFoils = [];\r\n  for (let i = 0; i <= numWingStations; i++) {\r\n    const y = -4.6 + (9.2 * i) \/ numWingStations, absY = Math.abs(y);\r\n    let chord = WC, xStart = WX;\r\n    if (absY > 3.7) {\r\n      const factor = (absY - 3.7) \/ (4.6 - 3.7);\r\n      chord = WC * (1 - factor * 0.35);\r\n      xStart = WX + factor * 0.12;\r\n    }\r\n    const pts = foil(xStart, WZ, chord, y);\r\n    wingFoils.push(pts);\r\n    loop(pts, true, i % 2 !== 0);\r\n  }\r\n  for (let p = 0; p < wingFoils[0].length; p++) {\r\n    for (let i = 0; i < wingFoils.length - 1; i++) {\r\n      const isMajor = (p === 0 || p === 4 || p === 8 || p === 12);\r\n      (isMajor ? seg : gseg)(wingFoils[i][p], wingFoils[i + 1][p]);\r\n    }\r\n  }\r\n  seg([WX + 0.72 * WC, -3.8, WZ + 0.02], [WX + 0.72 * WC, 3.8, WZ + 0.02]);\r\n  for (const y of [-3.2, -2.4, -1.6, -0.8, 0.8, 1.6, 2.4, 3.2]) {\r\n    seg([WX + 0.72 * WC, y, WZ + 0.02], [WX + WC, y, WZ + 0.006]);\r\n  }\r\n\r\n  \/* 9. Pylons & Struts *\/\r\n  BP = 'pylon';\r\n  for (const s of [-1, 1]) {\r\n    const yp = s * 0.20;\r\n    loop([[1.35, yp, 1.70], [1.35, yp, 2.25], [1.75, yp, 2.25], [1.75, yp, 1.70]]);\r\n    seg([1.75, yp, 2.25], [2.45, yp, 1.70]);\r\n  }\r\n  seg([1.35, -0.20, 2.25], [1.35, 0.20, 2.25]);\r\n  seg([1.75, -0.20, 2.25], [1.75, 0.20, 2.25]);\r\n  for (const s of [-1, 1]) {\r\n    const yFuse = s * 0.60, yWing = s * 2.80;\r\n    seg([1.95, yFuse, 0.82], [1.75, yWing, WZ - 0.02]);\r\n    seg([1.95, yFuse, 0.82], [2.25, yWing, WZ - 0.02]);\r\n    seg([1.85, s * 1.70, 1.55], [1.85, s * 1.70, WZ - 0.02]);\r\n  }\r\n\r\n  \/* 10. Nacelles *\/\r\n  BP = 'prop';\r\n  const nacelleY = [-0.85, 0.85];\r\n  nacelleY.forEach(yc => {\r\n    for (let n = 0; n <= 6; n++) {\r\n      const xn = 1.05 + n * 0.13;\r\n      const rY = 0.18 * (1 - Math.abs(n - 3) * 0.08), rZ = 0.14 * (1 - Math.abs(n - 3) * 0.08);\r\n      const pts = [];\r\n      for (let a = 0; a < 14; a++) {\r\n        const ang = a * Math.PI * 2 \/ 14;\r\n        pts.push([xn, yc + rY * Math.cos(ang), 2.32 + rZ * Math.sin(ang)]);\r\n      }\r\n      loop(pts, true, n % 2 !== 0);\r\n    }\r\n    for (let a = 0; a < 14; a++) {\r\n      const ang = a * Math.PI * 2 \/ 14;\r\n      seg([1.05, yc + 0.18 * Math.cos(ang), 2.32 + 0.14 * Math.sin(ang)],\r\n          [1.83, yc + 0.14 * Math.cos(ang), 2.32 + 0.11 * Math.sin(ang)]);\r\n    }\r\n    circYZ(1.00, yc, 2.32, 0.12, 14);\r\n  });\r\n\r\n  \/* ---------------------------------------------------------\r\n     SPECIFICATION CALLOUTS & GROUPS\r\n     --------------------------------------------------------- *\/\r\n  const AMBER = '#f0a43a', AMBER_HI = '#ffc670', TAU = Math.PI * 2, D = 22;\r\n  const LABELS = [\r\n    { key: 'mtow', corner: 'TL', title: 'MAX TAKEOFF WEIGHT', sub: '\u2248 4,000 KG', anchor: [1.90, 2.80, 2.25], group: ['wing', 'pylon', 'prop'] },\r\n    { key: 'payload', corner: 'TR', title: 'PAYLOAD BAY', sub: '1,560 L WATER \/ RETARDANT', anchor: [1.85, -0.60, 1.40], group: ['payload'] },\r\n    { key: 'strip', corner: 'BL', title: 'UNPREPARED AIRSTRIPS', sub: 'ROUGH FIELD COMPLIANT', anchor: [2.05, 0.82, 0.34], group: ['gear', 'tailwheel'] },\r\n    { key: 'hull', corner: 'BR', title: 'AMPHIBIOUS HULL', sub: 'AUTONOMOUS TAKEOFF \/ LANDING', anchor: [1.10, -0.20, 0.68], group: ['hull', 'nose'] }\r\n  ];\r\n  \r\n  const OWNER = {};\r\n  LABELS.forEach(L => L.group.forEach(k => OWNER[k] = L));\r\n  const ORDER = ['hull', 'nose', 'payload', 'vtail', 'tailwheel', 'gear', 'wing', 'pylon', 'prop'];\r\n  let MAIN_TOTAL = 0;\r\n  ORDER.forEach(k => MAIN_TOTAL += GEO[k].segs.length \/ 6);\r\n\r\n  \/* ---------------------------------------------------------\r\n     RENDERER SETUP\r\n     --------------------------------------------------------- *\/\r\n  const root   = document.getElementById('flyox-root');\r\n  const stage  = document.getElementById('flyox-stage');\r\n  const cv     = document.getElementById('flyox-canvas');\r\n  const ctx    = cv.getContext('2d');\r\n  const REDUCED = matchMedia('(prefers-reduced-motion: reduce)').matches;\r\n  const dpr    = Math.min(window.devicePixelRatio || 1, 2);\r\n  const clamp  = (v, a, b) => Math.max(a, Math.min(b, v));\r\n  const lerp   = (a, b, t) => a + (b - a) * t;\r\n  const easeIO = t => t < 0.5 ? 4 * t * t * t : 1 - Math.pow(-2 * t + 2, 3) \/ 2;\r\n  const easeO  = t => 1 - Math.pow(1 - t, 3);\r\n\r\n  \/* Timeline config (ms) *\/\r\n  const T_TRACE = 2400, T_GRID0 = 2200, T_GRID1 = 3200, T_PROP0 = 2300, T_PROP1 = 2900,\r\n        CARD0 = 3000, STAG = 380, LEAD = 450, SWAY0 = 4800;\r\n  const cardAt = i => REDUCED ? 0 : CARD0 + i * STAG;\r\n\r\n  function getBaseZoom() {\r\n    return cw < 540 ? CONFIG.zoomMobile : CONFIG.zoomDesktop;\r\n  }\r\n\r\n  const DEF = {\r\n    az: CONFIG.azimuth,\r\n    el: CONFIG.elevation,\r\n    zoom: CONFIG.zoomDesktop,\r\n    C: [...CONFIG.center]\r\n  };\r\n  const cam = { az: DEF.az, el: DEF.el, zoom: DEF.zoom, cx: DEF.C[0], cy: DEF.C[1], cz: DEF.C[2] };\r\n  let panX = 0, panY = 0, cw = 800, ch = 520, tw = null, hover = null, cardHover = false;\r\n  let propAngle = 0.5;\r\n  const P = { ca: 1, sa: 0, ce: 1, se: 0, sc: 1, ox: 0, oy: 0 };\r\n\r\n  \/* Viewport Trigger State *\/\r\n  let isVisible = false;\r\n  let animElapsed = 0;\r\n  let lastTimestamp = null;\r\n  let rafId = null;\r\n\r\n  \/* PROJECTION MATRIX WITH EXACT CENTERING OFFSETS *\/\r\n  function computeProj(az) {\r\n    P.ca = Math.cos(az); P.sa = Math.sin(az);\r\n    P.ce = Math.cos(cam.el); P.se = Math.sin(cam.el);\r\n    P.sc = (Math.min(cw, ch) \/ 9.5) * cam.zoom;\r\n    \r\n    const isMob = cw < 540;\r\n    const xOffset = isMob ? CONFIG.offsetX_mobile : CONFIG.offsetX_desktop;\r\n    const yOffset = isMob ? CONFIG.offsetY_mobile : CONFIG.offsetY_desktop;\r\n    \r\n    P.ox = cw \/ 2 + xOffset + panX;\r\n    P.oy = ch \/ 2 + yOffset + panY;\r\n  }\r\n\r\n  function project(x, y, z) {\r\n    const dx = x - cam.cx, dy = y - cam.cy, dz = z - cam.cz;\r\n    const x1 = dx * P.ca - dy * P.sa, y1 = dx * P.sa + dy * P.ca;\r\n    const y2 = y1 * P.ce - dz * P.se, z2 = y1 * P.se + dz * P.ce;\r\n    const f = D \/ (D + y2);\r\n    return { x: P.ox + x1 * f * P.sc, y: P.oy - z2 * f * P.sc, f };\r\n  }\r\n\r\n  \/* ---------------------------------------------------------\r\n     BIDIRECTIONAL HOVER & FOCUS SYSTEM\r\n     --------------------------------------------------------- *\/\r\n  function distToSegSq(px, py, x1, y1, x2, y2) {\r\n    const dx = x2 - x1, dy = y2 - y1;\r\n    const l2 = dx * dx + dy * dy;\r\n    if (l2 === 0) return (px - x1) * (px - x1) + (py - y1) * (py - y1);\r\n    const t = Math.max(0, Math.min(1, ((px - x1) * dx + (py - y1) * dy) \/ l2));\r\n    const qx = x1 + t * dx - px, qy = y1 + t * dy - py;\r\n    return qx * qx + qy * qy;\r\n  }\r\n\r\n  function hitTest(mx, my) {\r\n    let bestKey = null;\r\n    let minDSq = CONFIG.hitThreshold * CONFIG.hitThreshold;\r\n\r\n    for (const k of ORDER) {\r\n      const owner = OWNER[k];\r\n      if (!owner) continue;\r\n      const arr = GEO[k].segs;\r\n      const step = arr.length > 300 ? 12 : 6;\r\n      for (let i = 0; i < arr.length; i += step) {\r\n        const p1 = project(arr[i], arr[i + 1], arr[i + 2]);\r\n        const p2 = project(arr[i + 3], arr[i + 4], arr[i + 5]);\r\n        const dSq = distToSegSq(mx, my, p1.x, p1.y, p2.x, p2.y);\r\n        if (dSq < minDSq) {\r\n          minDSq = dSq;\r\n          bestKey = owner.key;\r\n        }\r\n      }\r\n    }\r\n    return bestKey;\r\n  }\r\n\r\n  function setHover(key) {\r\n    if (hover === key) return;\r\n    hover = key;\r\n    \r\n    \/\/ Toggle focus mode: hides all non-hovered labels\r\n    if (hover) {\r\n      root.classList.add('has-hover');\r\n    } else {\r\n      root.classList.remove('has-hover');\r\n    }\r\n\r\n    LABELS.forEach(L => {\r\n      if (L.key === hover) {\r\n        L.el.classList.add('active-hover');\r\n      } else {\r\n        L.el.classList.remove('active-hover');\r\n      }\r\n    });\r\n\r\n    if (!drag) {\r\n      cv.style.cursor = hover ? 'pointer' : 'grab';\r\n    }\r\n  }\r\n\r\n  function strokePart(arr, col, alpha, w, count) {\r\n    if (count <= 0 || alpha <= 0 || !arr.length) return;\r\n    const n = Math.min(arr.length \/ 6, count);\r\n    ctx.strokeStyle = col; ctx.globalAlpha = alpha; ctx.lineWidth = w; ctx.beginPath();\r\n    const { ca, sa, ce, se, sc, ox, oy } = P;\r\n    for (let i = 0; i < n; i++) {\r\n      const o = i * 6;\r\n      let x = arr[o] - cam.cx, y = arr[o + 1] - cam.cy, z = arr[o + 2] - cam.cz;\r\n      let x1 = x * ca - y * sa, y1 = x * sa + y * ca, y2 = y1 * ce - z * se, z2 = y1 * se + z * ce, f = D \/ (D + y2);\r\n      ctx.moveTo(ox + x1 * f * sc, oy - z2 * f * sc);\r\n      x = arr[o + 3] - cam.cx; y = arr[o + 4] - cam.cy; z = arr[o + 5] - cam.cz;\r\n      x1 = x * ca - y * sa; y1 = x * sa + y * ca; y2 = y1 * ce - z * se; z2 = y1 * se + z * ce; f = D \/ (D + y2);\r\n      ctx.lineTo(ox + x1 * f * sc, oy - z2 * f * sc);\r\n    }\r\n    ctx.stroke();\r\n  }\r\n\r\n  function drawProps(col, alpha, w) {\r\n    if (alpha <= 0) return;\r\n    ctx.strokeStyle = col; ctx.globalAlpha = alpha; ctx.lineWidth = w; ctx.beginPath();\r\n    nacelleY.forEach((yc, idx) => {\r\n      const hx = 1.00, hz = 2.32, dir = idx === 0 ? 1 : -1;\r\n      for (let k = 0; k < 5; k++) {\r\n        const a2 = propAngle * dir + k * TAU \/ 5;\r\n        const cs = Math.cos(a2), sn = Math.sin(a2);\r\n        const B = [\r\n          [hx - 0.02, yc + cs * 0.08 - sn * 0.03, hz + sn * 0.08 + cs * 0.03],\r\n          [hx - 0.04, yc + cs * 0.65 - sn * 0.025, hz + sn * 0.65 + cs * 0.025],\r\n          [hx - 0.04, yc + cs * 0.65 + sn * 0.025, hz + sn * 0.65 - cs * 0.025],\r\n          [hx - 0.02, yc + cs * 0.08 + sn * 0.03, hz + sn * 0.08 - cs * 0.03]\r\n        ];\r\n        for (let p = 0; p < 4; p++) {\r\n          const q1 = project(B[p][0], B[p][1], B[p][2]);\r\n          const q2 = project(B[(p + 1) % 4][0], B[(p + 1) % 4][1], B[(p + 1) % 4][2]);\r\n          ctx.moveTo(q1.x, q1.y); ctx.lineTo(q2.x, q2.y);\r\n        }\r\n      }\r\n    });\r\n    ctx.stroke();\r\n  }\r\n\r\n  \/* ---------------------------------------------------------\r\n     DOM CALLOUT ELEMENTS\r\n     --------------------------------------------------------- *\/\r\n  LABELS.forEach(L => {\r\n    const d = document.createElement('div');\r\n    d.className = 'flyox-callout';\r\n    d.innerHTML = `<h3>${L.title}<\/h3>` + (L.sub ? `<p>${L.sub}<\/p>` : '');\r\n    \r\n    \/\/ Hovering directly over cards\r\n    d.addEventListener('pointerenter', () => {\r\n      cardHover = true;\r\n      setHover(L.key);\r\n    });\r\n    d.addEventListener('pointerleave', () => {\r\n      cardHover = false;\r\n      setHover(null);\r\n    });\r\n    \r\n    stage.appendChild(d);\r\n    L.el = d; L.x = null; L.w = 200; L.h = 44; L.y = 16; L.shown = false;\r\n  });\r\n\r\n  function sizeCanvas() {\r\n    const r = stage.getBoundingClientRect();\r\n    cw = Math.max(60, r.width); ch = Math.max(60, r.height);\r\n    cv.width = Math.round(cw * dpr); cv.height = Math.round(ch * dpr);\r\n    \r\n    if (!tw) {\r\n      cam.zoom = getBaseZoom();\r\n    }\r\n\r\n    const cardW = Math.max(120, Math.min(200, Math.floor((cw - 28) \/ 2)));\r\n    LABELS.forEach(L => {\r\n      L.el.style.width = cardW + 'px';\r\n      L.w = L.el.offsetWidth || cardW;\r\n      L.h = L.el.offsetHeight || 44;\r\n    });\r\n  }\r\n\r\n  \/* POSITION CARDS WITH SHORTENED BOTTOM LINES *\/\r\n  function placeCards() {\r\n    const half = cw \/ 2;\r\n    const isMob = cw < 540;\r\n    const marginX = isMob ? 8 : 16;\r\n    const bottomGap = isMob ? CONFIG.bottomLineLengthMobile : CONFIG.bottomLineLengthDesktop;\r\n\r\n    let maxBottomAnchorY = 0;\r\n    for (const L of LABELS) {\r\n      const a = project(L.anchor[0], L.anchor[1], L.anchor[2]);\r\n      L.ax = a.x; L.ay = a.y;\r\n      if (L.corner[0] === 'B' && a.y > maxBottomAnchorY) {\r\n        maxBottomAnchorY = a.y;\r\n      }\r\n    }\r\n\r\n    for (const L of LABELS) {\r\n      const xMin = L.corner[1] === 'L' ? marginX : half + 4;\r\n      const xMax = Math.max(xMin, L.corner[1] === 'L' ? half - L.w - 4 : cw - L.w - marginX);\r\n      const tx = clamp(L.ax - L.w \/ 2, xMin, xMax);\r\n      L.x = L.x === null ? tx : L.x + (tx - L.x) * 0.12;\r\n      \r\n      L.h = L.el.offsetHeight || L.h;\r\n      \r\n      if (L.corner[0] === 'T') {\r\n        L.y = isMob ? 10 : 16;\r\n      } else {\r\n        const targetY = maxBottomAnchorY + bottomGap;\r\n        L.y = Math.min(ch - L.h - (isMob ? 10 : 14), targetY);\r\n      }\r\n\r\n      L.el.style.left = L.x + 'px';\r\n      L.el.style.top  = L.y + 'px';\r\n    }\r\n  }\r\n\r\n  function drawLeader(L, i, t) {\r\n    \/\/ HIDE LEADER LINES FOR NON-HOVERED LABELS WHEN HOVER IS ACTIVE\r\n    if (hover && hover !== L.key) return;\r\n\r\n    const lp = REDUCED ? 1 : easeO(clamp((t - cardAt(i)) \/ LEAD, 0, 1));\r\n    if (lp <= 0) return;\r\n    const top = L.corner[0] === 'T';\r\n    const cy = top ? L.y + L.h - 1 : L.y + 1;\r\n    const cx = clamp(L.ax, L.x + 12, L.x + L.w - 12);\r\n    let pts;\r\n    if (top ? L.ay > cy + 8 : L.ay < cy - 8) pts = [[cx, cy], [L.ax, cy], [L.ax, L.ay]];\r\n    else pts = [[cx, cy], [L.ax, L.ay]];\r\n\r\n    const lens = [0]; let tot = 0;\r\n    for (let k = 0; k < pts.length - 1; k++) {\r\n      tot += Math.hypot(pts[k + 1][0] - pts[k][0], pts[k + 1][1] - pts[k][1]);\r\n      lens.push(tot);\r\n    }\r\n    const d = lp * tot, hov = hover === L.key;\r\n    ctx.strokeStyle = hov ? AMBER_HI : AMBER;\r\n    ctx.globalAlpha = hov ? 1.0 : 0.9;\r\n    ctx.lineWidth = hov ? 1.6 : 1;\r\n    ctx.beginPath();\r\n    ctx.moveTo(pts[0][0], pts[0][1]);\r\n    for (let k = 0; k < pts.length - 1; k++) {\r\n      if (d >= lens[k + 1]) ctx.lineTo(pts[k + 1][0], pts[k + 1][1]);\r\n      else {\r\n        const u = (d - lens[k]) \/ ((lens[k + 1] - lens[k]) || 1);\r\n        ctx.lineTo(pts[k][0] + (pts[k + 1][0] - pts[k][0]) * u, pts[k][1] + (pts[k + 1][1] - pts[k][1]) * u);\r\n        break;\r\n      }\r\n    }\r\n    ctx.stroke();\r\n\r\n    const da = clamp((lp - 0.55) \/ 0.45, 0, 1);\r\n    const r = (hov ? 5.0 : 3.0) * da;\r\n    ctx.globalAlpha = da;\r\n    ctx.fillStyle = '#111111';\r\n    ctx.beginPath(); ctx.arc(L.ax, L.ay, r, 0, TAU); ctx.fill();\r\n    ctx.strokeStyle = hov ? AMBER_HI : AMBER; ctx.lineWidth = hov ? 1.4 : 1.2; ctx.stroke();\r\n    ctx.fillStyle = hov ? AMBER_HI : AMBER;\r\n    ctx.beginPath(); ctx.arc(L.ax, L.ay, 1.4 * da, 0, TAU); ctx.fill();\r\n    if (hov) {\r\n      ctx.globalAlpha = 0.55 * da;\r\n      ctx.beginPath(); ctx.arc(L.ax, L.ay, r + 3.5 + Math.sin(t * 0.006) * 1.4, 0, TAU); ctx.stroke();\r\n    }\r\n  }\r\n\r\n  \/* ---------------------------------------------------------\r\n     INTERACTION: TOUCH \/ ROTATE \/ PINCH-ZOOM \/ DOUBLE-CLICK\r\n     --------------------------------------------------------- *\/\r\n  const ptrs = new Map();\r\n  let drag = null, pinch = null;\r\n  \r\n  cv.addEventListener('contextmenu', e => e.preventDefault());\r\n  \r\n  cv.addEventListener('pointerdown', e => {\r\n    cv.setPointerCapture(e.pointerId);\r\n    tw = null;\r\n    ptrs.set(e.pointerId, { x: e.clientX, y: e.clientY });\r\n    drag = { mode: e.button === 2 ? 'pan' : 'rot' };\r\n    if (ptrs.size === 2) {\r\n      const [a, b] = [...ptrs.values()];\r\n      pinch = { d: Math.hypot(a.x - b.x, a.y - b.y) || 1, z: cam.zoom };\r\n      drag = null;\r\n    }\r\n    cv.style.cursor = 'grabbing';\r\n  });\r\n\r\n  cv.addEventListener('pointermove', e => {\r\n    const r = ptrs.get(e.pointerId);\r\n    if (r) {\r\n      const dx = e.clientX - r.x, dy = e.clientY - r.y;\r\n      r.x = e.clientX; r.y = e.clientY;\r\n      \r\n      if (pinch && ptrs.size === 2) {\r\n        const [a, b] = [...ptrs.values()];\r\n        cam.zoom = clamp(pinch.z * Math.hypot(a.x - b.x, a.y - b.y) \/ pinch.d, 0.40, 2.5);\r\n        return;\r\n      }\r\n      if (drag) {\r\n        if (drag.mode === 'rot') {\r\n          cam.az += dx * 0.005;\r\n          cam.el = clamp(cam.el + dy * 0.005, -1.55, 1.55);\r\n        } else {\r\n          panX += dx; panY += dy;\r\n        }\r\n        return;\r\n      }\r\n    }\r\n\r\n    \/\/ 3D Hit Testing when hovering over canvas\r\n    if (!cardHover && !drag) {\r\n      const rect = cv.getBoundingClientRect();\r\n      const mx = e.clientX - rect.left;\r\n      const my = e.clientY - rect.top;\r\n      const hit = hitTest(mx, my);\r\n      setHover(hit);\r\n    }\r\n  });\r\n\r\n  const endPtr = e => {\r\n    ptrs.delete(e.pointerId);\r\n    if (ptrs.size < 2) pinch = null;\r\n    if (!ptrs.size) {\r\n      drag = null;\r\n      cv.style.cursor = hover ? 'pointer' : 'grab';\r\n    }\r\n  };\r\n  cv.addEventListener('pointerup', endPtr);\r\n  cv.addEventListener('pointercancel', endPtr);\r\n\r\n  cv.addEventListener('pointerleave', () => {\r\n    if (!cardHover) setHover(null);\r\n  });\r\n\r\n  cv.addEventListener('wheel', e => {\r\n    e.preventDefault();\r\n    cam.zoom = clamp(cam.zoom * (e.deltaY > 0 ? 0.92 : 1.08), 0.40, 2.5);\r\n  }, { passive: false });\r\n\r\n  \/\/ Double click to smoothly reset to default centered view\r\n  cv.addEventListener('dblclick', () => {\r\n    panX = panY = 0;\r\n    setHover(null);\r\n    const targetZoom = getBaseZoom();\r\n    tw = {\r\n      t0: performance.now(), dur: 900,\r\n      az0: cam.az, el0: cam.el, z0: cam.zoom,\r\n      cx0: cam.cx, cy0: cam.cy, cz0: cam.cz,\r\n      az1: CONFIG.azimuth, el1: CONFIG.elevation, z1: targetZoom,\r\n      cx1: CONFIG.center[0], cy1: CONFIG.center[1], cz1: CONFIG.center[2]\r\n    };\r\n  });\r\n\r\n  \/* ---------------------------------------------------------\r\n     MAIN ANIMATION LOOP & SCROLL TRIGGER OBSERVER\r\n     --------------------------------------------------------- *\/\r\n  function frame(timestamp) {\r\n    if (!isVisible) {\r\n      lastTimestamp = null;\r\n      return;\r\n    }\r\n    \r\n    if (lastTimestamp === null) {\r\n      lastTimestamp = timestamp;\r\n    }\r\n    const dt = Math.min(50, timestamp - lastTimestamp);\r\n    lastTimestamp = timestamp;\r\n    animElapsed += dt;\r\n    const t = animElapsed;\r\n\r\n    \/\/ Camera reset tween\r\n    if (tw) {\r\n      const k = easeIO(Math.min(1, (performance.now() - tw.t0) \/ tw.dur));\r\n      cam.az = lerp(tw.az0, tw.az1, k);\r\n      cam.el = lerp(tw.el0, tw.el1, k);\r\n      cam.zoom = lerp(tw.z0, tw.z1, k);\r\n      cam.cx = lerp(tw.cx0, tw.cx1, k);\r\n      cam.cy = lerp(tw.cy0, tw.cy1, k);\r\n      cam.cz = lerp(tw.cz0, tw.cz1, k);\r\n      if (k >= 1) tw = null;\r\n    }\r\n\r\n    \/\/ Subtle atmospheric sway\r\n    let azOff = 0;\r\n    if (!REDUCED && t > SWAY0) {\r\n      azOff = 0.14 * Math.sin((t - SWAY0) \/ 26000 * TAU) * clamp((t - SWAY0) \/ 3000, 0, 1);\r\n    }\r\n    computeProj(cam.az + azOff);\r\n\r\n    const gridA = REDUCED ? 1 : clamp((t - T_GRID0) \/ (T_GRID1 - T_GRID0), 0, 1);\r\n    const propA = REDUCED ? 1 : clamp((t - T_PROP0) \/ (T_PROP1 - T_PROP0), 0, 1);\r\n    if (propA > 0 && !REDUCED) propAngle += CONFIG.propellerSpeed * 0.015 * (dt \/ 16.7) * propA;\r\n\r\n    const rem0 = REDUCED ? MAIN_TOTAL : Math.ceil(easeIO(clamp(t \/ T_TRACE, 0, 1)) * MAIN_TOTAL);\r\n\r\n    ctx.setTransform(dpr, 0, 0, dpr, 0, 0);\r\n    ctx.fillStyle = '#111111';\r\n    ctx.fillRect(0, 0, cw, ch);\r\n\r\n    let rem = rem0;\r\n    for (const k of ORDER) {\r\n      const g = GEO[k], owner = OWNER[k];\r\n      let col = '#e2ebf2', a = 0.92, w = 1.05, gc = '#5d7183', ga = 0.42 * gridA;\r\n      if (hover) {\r\n        if (owner && owner.key === hover) { col = AMBER; a = 0.98; w = 1.35; gc = AMBER; ga = 0.38 * gridA; }\r\n        else { col = '#2b3642'; a = 0.18; w = 0.9; ga = 0.06 * gridA; }\r\n      }\r\n      const n = Math.min(g.segs.length \/ 6, rem);\r\n      rem -= n;\r\n      strokePart(g.segs, col, a, w, n);\r\n      if (gridA > 0) strokePart(g.grid, gc, ga, Math.max(0.6, w * 0.75), g.grid.length \/ 6);\r\n    }\r\n\r\n    {\r\n      let col = '#e2ebf2', a = 0.92 * propA;\r\n      if (hover) {\r\n        if (hover === 'mtow') { col = AMBER; a = 0.98 * propA; }\r\n        else { col = '#2b3642'; a = 0.18 * propA; }\r\n      }\r\n      drawProps(col, a, 1.05);\r\n    }\r\n\r\n    placeCards();\r\n    LABELS.forEach((L, i) => {\r\n      if (!L.shown && t >= cardAt(i)) {\r\n        L.shown = true;\r\n        L.el.classList.add('show');\r\n      }\r\n      drawLeader(L, i, t);\r\n    });\r\n\r\n    ctx.globalAlpha = 1;\r\n    rafId = requestAnimationFrame(frame);\r\n  }\r\n\r\n  \/* ---------------------------------------------------------\r\n     RESIZE & VIEWPORT OBSERVERS\r\n     --------------------------------------------------------- *\/\r\n  new ResizeObserver(sizeCanvas).observe(stage);\r\n  sizeCanvas();\r\n  if (document.fonts && document.fonts.ready) document.fonts.ready.then(sizeCanvas);\r\n\r\n  const observer = new IntersectionObserver((entries) => {\r\n    entries.forEach(entry => {\r\n      const wasVisible = isVisible;\r\n      isVisible = entry.isIntersecting;\r\n      \r\n      if (isVisible && !wasVisible) {\r\n        if (rafId) cancelAnimationFrame(rafId);\r\n        rafId = requestAnimationFrame(frame);\r\n      }\r\n    });\r\n  }, { threshold: 0.18 });\r\n\r\n  observer.observe(root);\r\n})();\r\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-97606a3 e-con-full e-flex e-con e-child\" data-id=\"97606a3\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t<div class=\"elementor-element elementor-element-279540b elementor-widget elementor-widget-heading\" data-id=\"279540b\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Heavy-Lift Autonomous Wildfire Response<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-ef212db elementor-widget-laptop__width-initial elementor-widget elementor-widget-heading\" data-id=\"ef212db\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">FlyOx <span style=\"color: #FFB601\">1<\/span> <\/h2>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-6659c1c elementor-widget-mobile__width-inherit elementor-widget elementor-widget-text-editor\" data-id=\"6659c1c\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p>Through its strategic partnership with Singular Aircraft, Volatus is advancing the introduction of the FlyOx 1 as a heavy-lift autonomous aircraft capability for Canadian wildfire response.<\/p><p>Heavy payload capacity, long endurance, amphibious capability, automatic takeoff and landing, and the ability to operate from unprepared airstrips create options for forward deployment closer to emerging incidents.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-23197ce elementor-mobile-align-left elementor-widget elementor-widget-button\" data-id=\"23197ce\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"button.default\">\n\t\t\t\t\t\t\t\t\t\t<a class=\"elementor-button elementor-button-link elementor-size-sm\" href=\"https:\/\/volatusaerospace.com\/equipment\/all-products\/flyox-heavy-lift-drone\/\">\n\t\t\t\t\t\t<span class=\"elementor-button-content-wrapper\">\n\t\t\t\t\t\t\t\t\t<span class=\"elementor-button-text\">Explore the FlyOx 1 heavy-lift aircraft<\/span>\n\t\t\t\t\t<\/span>\n\t\t\t\t\t<\/a>\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-824a850 e-con-full e-flex e-con e-child\" data-id=\"824a850\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t<div class=\"elementor-element elementor-element-8b4b53b e-con-full e-flex e-con e-child\" data-id=\"8b4b53b\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-f197e2e e-con-full e-flex e-con e-child\" data-id=\"f197e2e\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t<div class=\"elementor-element elementor-element-e81f64b elementor-widget elementor-widget-heading\" data-id=\"e81f64b\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Persistent Intelligence &amp; Resilient Communications<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-6956248 elementor-widget-laptop__width-initial elementor-widget elementor-widget-heading\" data-id=\"6956248\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">K1000ULE <span style=\"color: #FFB601\">&amp;<\/span> ATNE++<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-fff4834 elementor-widget-mobile__width-inherit elementor-widget elementor-widget-text-editor\" data-id=\"fff4834\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p>Through its strategic partnership with Kraus Hamdani Aerospace, Volatus is advancing the introduction of the K1000ULE ultra-long-endurance autonomous aircraft and ATNE++ resilient airborne communications architecture to support Canadian wildfire operations.<\/p><p>The fully electric K1000ULE is designed for continuous operations across large and remote environments. Combined with ATNE++, it can support electro-optical and infrared intelligence, live fire-perimeter mapping, thermal hotspot detection, communications relay, responder tracking and unified-command coordination throughout an incident.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-df10e9f e-con-full e-flex e-con e-child\" data-id=\"df10e9f\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-8c934e5 elementor-widget__width-initial elementor-view-default elementor-widget elementor-widget-icon\" data-id=\"8c934e5\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"icon.default\">\n\t\t\t\t\t\t\t<div class=\"elementor-icon-wrapper\">\n\t\t\t<div class=\"elementor-icon\">\n\t\t\t<svg aria-hidden=\"true\" class=\"e-font-icon-svg e-fas-info-circle\" viewBox=\"0 0 512 512\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M256 8C119.043 8 8 119.083 8 256c0 136.997 111.043 248 248 248s248-111.003 248-248C504 119.083 392.957 8 256 8zm0 110c23.196 0 42 18.804 42 42s-18.804 42-42 42-42-18.804-42-42 18.804-42 42-42zm56 254c0 6.627-5.373 12-12 12h-88c-6.627 0-12-5.373-12-12v-24c0-6.627 5.373-12 12-12h12v-64h-12c-6.627 0-12-5.373-12-12v-24c0-6.627 5.373-12 12-12h64c6.627 0 12 5.373 12 12v100h12c6.627 0 12 5.373 12 12v24z\"><\/path><\/svg>\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-b21f851 elementor-widget-mobile__width-inherit elementor-widget elementor-widget-text-editor\" data-id=\"b21f851\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\tCanadian deployment of the K1000ULE, ATNE++ and FlyOx 1 remains subject to applicable regulatory approvals and the successful completion of technical, operational and commercial evaluations.\n\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-4addef3 e-con-full e-flex e-con e-parent\" data-id=\"4addef3\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t<div class=\"elementor-element elementor-element-faef5a2 e-con-full e-flex e-con e-child\" data-id=\"faef5a2\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-0f00b71 elementor-widget__width-initial elementor-widget-laptop__width-initial elementor-widget elementor-widget-heading\" data-id=\"0f00b71\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Watch intelligence\n\n<span style=\"color: #FFB601\">become action.\n\n<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-dfd1d11 e-con-full e-flex e-con e-child\" data-id=\"dfd1d11\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-489ba72 elementor-widget__width-initial elementor-widget-mobile__width-inherit elementor-widget elementor-widget-text-editor\" data-id=\"489ba72\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p>A simulated incident. The gold line is an aerial sensor pass when it physically crosses an emerging hotspot, detection happens. Hover the map for live geo-referenced coordinates.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-549c94e e-con-full e-flex e-con e-parent\" data-id=\"549c94e\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t<div class=\"elementor-element elementor-element-d8705ae elementor-widget__width-inherit elementor-widget elementor-widget-html\" data-id=\"d8705ae\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<!-- =========================================================================\r\n     VOLATUS AEROSPACE - OCC WILDFIRE SIMULATION (MOBILE-OPTIMIZED FULL-WIDTH)\r\n     ========================================================================= -->\r\n\r\n<style>\r\n@import url('https:\/\/fonts.googleapis.com\/css2?family=Montserrat:wght@600;700;800&family=DM+Sans:wght@400;500;700&family=JetBrains+Mono:wght@400;500;600;700&display=swap');\r\n\r\n:root {\r\n  --occ-gold: #FFB601;\r\n  --occ-black: #000000;\r\n  --occ-surface: #0a0a0a;\r\n  --occ-panel-bg: #101010;\r\n  --occ-lgray: #EAEAEA;\r\n  --occ-mgray: #B8B8B8;\r\n  --occ-dgray: #555555;\r\n  --occ-hair: rgba(226, 226, 226, 0.11);\r\n  --occ-head: 'Montserrat', sans-serif;\r\n  --occ-body: 'DM Sans', sans-serif;\r\n  --occ-mono: 'JetBrains Mono', monospace;\r\n}\r\n\r\n\/* Full-Width Scoped Root *\/\r\n.volatus-occ-widget {\r\n  position: relative !important;\r\n  width: 100% !important;\r\n  max-width: 100% !important;\r\n  margin: 0 !important;\r\n  padding: 0 !important;\r\n  background: transparent !important;\r\n  box-sizing: border-box !important;\r\n  font-family: var(--occ-body) !important;\r\n  color: var(--occ-mgray) !important;\r\n  -webkit-font-smoothing: antialiased !important;\r\n}\r\n\r\n.volatus-occ-widget *,\r\n.volatus-occ-widget *::before,\r\n.volatus-occ-widget *::after {\r\n  box-sizing: border-box !important;\r\n}\r\n\r\n\/* Full-Width Shell *\/\r\n.volatus-occ-widget .occ-shell {\r\n  border-top: 1px solid var(--occ-hair) !important;\r\n  border-bottom: 1px solid var(--occ-hair) !important;\r\n  border-left: 1px solid var(--occ-hair) !important;\r\n  border-right: 1px solid var(--occ-hair) !important;\r\n  display: grid !important;\r\n  grid-template-columns: minmax(0, 1fr) clamp(280px, 22vw, 340px) !important;\r\n  background: var(--occ-surface) !important;\r\n  width: 100% !important;\r\n  margin: 0 !important;\r\n  padding: 0 !important;\r\n  box-shadow: 0 16px 40px rgba(0, 0, 0, 0.7) !important;\r\n}\r\n\r\n\/* Map Frame *\/\r\n.volatus-occ-widget .map-frame {\r\n  display: flex !important;\r\n  flex-direction: column !important;\r\n  min-width: 0 !important;\r\n  position: relative !important;\r\n}\r\n\r\n.volatus-occ-widget .map-top {\r\n  display: flex !important;\r\n  justify-content: space-between !important;\r\n  align-items: center !important;\r\n  gap: 12px 16px !important;\r\n  padding: 14px 20px !important;\r\n  border-bottom: 1px solid var(--occ-hair) !important;\r\n  background: var(--occ-panel-bg) !important;\r\n}\r\n\r\n.volatus-occ-widget .map-status {\r\n  display: flex !important;\r\n  align-items: center !important;\r\n  gap: 10px !important;\r\n  font-family: var(--occ-mono) !important;\r\n  font-size: 12px !important;\r\n  letter-spacing: 0.14em !important;\r\n  white-space: nowrap !important;\r\n}\r\n\r\n.volatus-occ-widget .live-dot {\r\n  width: 8px !important;\r\n  height: 8px !important;\r\n  background: var(--occ-gold) !important;\r\n  border-radius: 50% !important;\r\n  animation: occBlink 1.6s ease-in-out infinite !important;\r\n  flex: none !important;\r\n  display: inline-block !important;\r\n}\r\n\r\n@keyframes occBlink {\r\n  0%, 100% { opacity: 1; }\r\n  50% { opacity: 0.25; }\r\n}\r\n\r\n.volatus-occ-widget .live-label {\r\n  color: var(--occ-gold) !important;\r\n  font-weight: 600 !important;\r\n}\r\n\r\n.volatus-occ-widget .label-mob {\r\n  display: none !important;\r\n}\r\n\r\n.volatus-occ-widget .det-badge {\r\n  color: var(--occ-gold) !important;\r\n  border: 1px solid rgba(255, 182, 1, 0.45) !important;\r\n  padding: 4px 10px !important;\r\n  font-size: 11px !important;\r\n  letter-spacing: 0.12em !important;\r\n  font-family: var(--occ-mono) !important;\r\n  white-space: nowrap !important;\r\n  flex-shrink: 0 !important;\r\n}\r\n\r\n.volatus-occ-widget .det-badge b {\r\n  font-weight: 700 !important;\r\n  font-size: 12px !important;\r\n}\r\n\r\n\/* Map Canvas Body *\/\r\n.volatus-occ-widget .map-body {\r\n  position: relative !important;\r\n  height: clamp(380px, 60vh, 680px) !important;\r\n  user-select: none !important;\r\n  -webkit-user-select: none !important;\r\n  background: #090909 !important;\r\n  overflow: hidden !important;\r\n}\r\n\r\n.volatus-occ-widget canvas#map-canvas {\r\n  position: absolute !important;\r\n  inset: 0 !important;\r\n  top: 0 !important;\r\n  left: 0 !important;\r\n  width: 100% !important;\r\n  height: 100% !important;\r\n  max-width: none !important;\r\n  max-height: none !important;\r\n  display: block !important;\r\n  touch-action: pan-y !important;\r\n  margin: 0 !important;\r\n  padding: 0 !important;\r\n  border: none !important;\r\n  background: transparent !important;\r\n}\r\n\r\n@media(pointer:fine) {\r\n  .volatus-occ-widget canvas#map-canvas {\r\n    cursor: crosshair !important;\r\n  }\r\n}\r\n\r\n.volatus-occ-widget .map-hint {\r\n  position: absolute !important;\r\n  right: 16px !important;\r\n  bottom: 13px !important;\r\n  font-family: var(--occ-mono) !important;\r\n  font-size: 11px !important;\r\n  letter-spacing: 0.15em !important;\r\n  color: #666666 !important;\r\n  pointer-events: none !important;\r\n}\r\n\r\n@media(pointer:coarse), (max-width: 600px) {\r\n  .volatus-occ-widget .map-hint {\r\n    display: none !important;\r\n  }\r\n}\r\n\r\n\/* OCC Sidebar Panel *\/\r\n.volatus-occ-widget .occ-panel {\r\n  border-left: 1px solid var(--occ-hair) !important;\r\n  display: flex !important;\r\n  flex-direction: column !important;\r\n  background: var(--occ-panel-bg) !important;\r\n  margin: 0 !important;\r\n  padding: 0 !important;\r\n}\r\n\r\n.volatus-occ-widget .panel-head {\r\n  display: flex !important;\r\n  justify-content: space-between !important;\r\n  align-items: center !important;\r\n  gap: 12px !important;\r\n  padding: 16px 20px !important;\r\n  border-bottom: 1px solid var(--occ-hair) !important;\r\n}\r\n\r\n.volatus-occ-widget .panel-title {\r\n  font-family: var(--occ-head) !important;\r\n  font-weight: 700 !important;\r\n  font-size: 12.5px !important;\r\n  letter-spacing: 0.18em !important;\r\n  color: var(--occ-lgray) !important;\r\n  text-transform: uppercase !important;\r\n}\r\n\r\n.volatus-occ-widget .panel-tag {\r\n  font-family: var(--occ-mono) !important;\r\n  font-size: 9px !important;\r\n  letter-spacing: 0.16em !important;\r\n  color: var(--occ-gold) !important;\r\n  border: 1px solid rgba(255, 182, 1, 0.4) !important;\r\n  padding: 3px 8px !important;\r\n  white-space: nowrap !important;\r\n}\r\n\r\n.volatus-occ-widget .panel-rows {\r\n  flex: 1 !important;\r\n  display: flex !important;\r\n  flex-direction: column !important;\r\n  justify-content: space-evenly !important;\r\n  padding: 12px 20px !important;\r\n  margin: 0 !important;\r\n}\r\n\r\n.volatus-occ-widget .prow {\r\n  display: flex !important;\r\n  justify-content: space-between !important;\r\n  align-items: baseline !important;\r\n  gap: 14px !important;\r\n  padding: 10px 0 !important;\r\n  margin: 0 !important;\r\n  border-bottom: 1px solid rgba(226, 226, 226, 0.06) !important;\r\n}\r\n\r\n.volatus-occ-widget .prow:last-child {\r\n  border-bottom: none !important;\r\n}\r\n\r\n.volatus-occ-widget .prow dt {\r\n  font-family: var(--occ-mono) !important;\r\n  font-size: 11px !important;\r\n  letter-spacing: 0.18em !important;\r\n  color: var(--occ-dgray) !important;\r\n  margin: 0 !important;\r\n  padding: 0 !important;\r\n}\r\n\r\n.volatus-occ-widget .prow dd {\r\n  font-family: var(--occ-mono) !important;\r\n  font-size: 13.5px !important;\r\n  font-weight: 500 !important;\r\n  letter-spacing: 0.05em !important;\r\n  color: var(--occ-lgray) !important;\r\n  display: flex !important;\r\n  align-items: center !important;\r\n  gap: 9px !important;\r\n  text-align: right !important;\r\n  margin: 0 !important;\r\n  padding: 0 !important;\r\n}\r\n\r\n.volatus-occ-widget .prow dd .dot {\r\n  width: 7px !important;\r\n  height: 7px !important;\r\n  background: var(--occ-gold) !important;\r\n  border-radius: 50% !important;\r\n  animation: occBlink 1.6s ease-in-out infinite !important;\r\n  flex: none !important;\r\n  display: inline-block !important;\r\n}\r\n\r\n.volatus-occ-widget .panel-foot {\r\n  padding: 12px 20px !important;\r\n  border-top: 1px solid var(--occ-hair) !important;\r\n  font-family: var(--occ-mono) !important;\r\n  font-size: 10px !important;\r\n  letter-spacing: 0.14em !important;\r\n  color: var(--occ-dgray) !important;\r\n}\r\n\r\n.volatus-occ-widget .map-caption {\r\n  margin: 14px 20px 0 20px !important;\r\n  padding: 0 !important;\r\n  font-family: var(--occ-mono) !important;\r\n  font-size: 10.5px !important;\r\n  letter-spacing: 0.05em !important;\r\n  color: var(--occ-dgray) !important;\r\n}\r\n\r\n\/* Tablet & Large Mobile (< 960px) *\/\r\n@media(max-width: 960px) {\r\n  .volatus-occ-widget .occ-shell {\r\n    grid-template-columns: 1fr !important;\r\n  }\r\n  .volatus-occ-widget .occ-panel {\r\n    border-left: none !important;\r\n    border-top: 1px solid var(--occ-hair) !important;\r\n  }\r\n  .volatus-occ-widget .map-body {\r\n    height: 420px !important;\r\n  }\r\n}\r\n\r\n\/* Smartphone Screen (< 600px) *\/\r\n@media(max-width: 600px) {\r\n  .volatus-occ-widget .map-body {\r\n    height: 360px !important;\r\n  }\r\n  .volatus-occ-widget .map-top {\r\n    padding: 10px 14px !important;\r\n  }\r\n  .volatus-occ-widget .label-desk {\r\n    display: none !important;\r\n  }\r\n  .volatus-occ-widget .label-mob {\r\n    display: inline !important;\r\n  }\r\n  .volatus-occ-widget .map-status {\r\n    font-size: 10.5px !important;\r\n    letter-spacing: 0.10em !important;\r\n  }\r\n  .volatus-occ-widget .det-badge {\r\n    font-size: 9.5px !important;\r\n    padding: 3px 8px !important;\r\n  }\r\n  .volatus-occ-widget .det-badge b {\r\n    font-size: 10.5px !important;\r\n  }\r\n  .volatus-occ-widget .panel-head {\r\n    padding: 12px 14px !important;\r\n  }\r\n  .volatus-occ-widget .panel-title {\r\n    font-size: 11px !important;\r\n  }\r\n  \/* Balanced 2-column grid with AIRCRAFT row spanning full-width at the bottom *\/\r\n  .volatus-occ-widget .panel-rows {\r\n    display: grid !important;\r\n    grid-template-columns: 1fr 1fr !important;\r\n    gap: 0 14px !important;\r\n    padding: 10px 14px !important;\r\n  }\r\n  .volatus-occ-widget .prow {\r\n    padding: 7px 0 !important;\r\n  }\r\n  .volatus-occ-widget .prow:nth-child(5),\r\n  .volatus-occ-widget .prow:nth-child(6) {\r\n    border-bottom: none !important;\r\n  }\r\n  .volatus-occ-widget .prow.prow-aircraft {\r\n    grid-column: 1 \/ -1 !important;\r\n    border-top: 1px solid rgba(226, 226, 226, 0.08) !important;\r\n    border-bottom: none !important;\r\n    padding-top: 8px !important;\r\n    margin-top: 2px !important;\r\n  }\r\n  .volatus-occ-widget .prow dt {\r\n    font-size: 9.5px !important;\r\n    letter-spacing: 0.14em !important;\r\n  }\r\n  .volatus-occ-widget .prow dd {\r\n    font-size: 11.5px !important;\r\n  }\r\n  .volatus-occ-widget .panel-foot {\r\n    padding: 10px 14px !important;\r\n    font-size: 8.5px !important;\r\n  }\r\n  .volatus-occ-widget .map-caption {\r\n    margin: 10px 14px 0 14px !important;\r\n    font-size: 9px !important;\r\n  }\r\n}\r\n\r\n@media(prefers-reduced-motion: reduce) {\r\n  .volatus-occ-widget .live-dot,\r\n  .volatus-occ-widget .prow dd .dot {\r\n    animation: none !important;\r\n  }\r\n}\r\n<\/style>\r\n\r\n<div class=\"volatus-occ-widget\" id=\"volatus-occ-root\">\r\n  <div class=\"occ-shell\">\r\n    <div class=\"map-frame\">\r\n      <div class=\"map-top\">\r\n        <div class=\"map-status\">\r\n          <span class=\"live-dot\"><\/span>\r\n          <span class=\"live-label\">\r\n            <span class=\"label-desk\">LIVE \u00b7 SIMULATED INCIDENT<\/span>\r\n            <span class=\"label-mob\">LIVE INCIDENT<\/span>\r\n          <\/span>\r\n          <span class=\"det-badge\" id=\"det-badge\" hidden>DETECTED \u00b7 <b>0<\/b><\/span>\r\n        <\/div>\r\n      <\/div>\r\n      <div class=\"map-body\">\r\n        <canvas id=\"map-canvas\" role=\"img\" aria-label=\"Wildfire Operations Map with real-time sensor sweep and hotspot detection\"><\/canvas>\r\n        <div class=\"map-hint\">HOVER FOR LIVE COORDINATES<\/div>\r\n      <\/div>\r\n    <\/div>\r\n\r\n    <aside class=\"occ-panel\">\r\n      <div class=\"panel-head\">\r\n        <span class=\"panel-title\">WILDFIRE RESPONSE<\/span>\r\n        <span class=\"panel-tag\">SIMULATED INCIDENT<\/span>\r\n      <\/div>\r\n      <dl class=\"panel-rows\">\r\n        <div class=\"prow\"><dt>STATUS<\/dt><dd><i class=\"dot\"><\/i>ACTIVE<\/dd><\/div>\r\n        <div class=\"prow\"><dt>PERIMETER<\/dt><dd id=\"pv-perim\">86.0 KM<\/dd><\/div>\r\n        <div class=\"prow\"><dt>BURNED AREA<\/dt><dd id=\"pv-area\">24,800 HA<\/dd><\/div>\r\n        <div class=\"prow\"><dt>WIND<\/dt><dd id=\"pv-wind\">NW 32 KM\/H<\/dd><\/div>\r\n        <div class=\"prow\"><dt>TEMP<\/dt><dd id=\"pv-temp\">31\u00b0C<\/dd><\/div>\r\n        <div class=\"prow\"><dt>HUMIDITY<\/dt><dd id=\"pv-hum\">24%<\/dd><\/div>\r\n        <div class=\"prow prow-aircraft\"><dt>AIRCRAFT<\/dt><dd><i class=\"dot\"><\/i>GENERIC UAS \u00b7 ON STATION<\/dd><\/div>\r\n      <\/dl>\r\n      <div class=\"panel-foot\">ILLUSTRATIVE VALUES \u00b7 SIMULATED INCIDENT<\/div>\r\n    <\/aside>\r\n  <\/div>\r\n\r\n  <p class=\"map-caption\">Demonstration interface. Actual missions operate subject to applicable regulatory, airspace, safety and operational requirements.<\/p>\r\n<\/div>\r\n\r\n<script>\r\n(function() {\r\n  'use strict';\r\n  \r\n  const root = document.getElementById('volatus-occ-root');\r\n  const cv = document.getElementById('map-canvas');\r\n  const ctx = cv.getContext('2d');\r\n  const terrain = document.createElement('canvas');\r\n  const RM = window.matchMedia('(prefers-reduced-motion: reduce)').matches;\r\n\r\n  \/* ---------- Geography (Simulated Western Canada) ---------- *\/\r\n  const GEO = { lonW: 123, lonE: 117, latS: 54, latN: 56 };\r\n  const lonAt = fx => GEO.lonW + fx * (GEO.lonE - GEO.lonW);\r\n  const latAt = fy => GEO.latN - fy * (GEO.latN - GEO.latS);\r\n  \r\n  function dms(v, pos, neg) {\r\n    const dir = v >= 0 ? pos : neg, a = Math.abs(v);\r\n    let d = Math.floor(a);\r\n    const mf = (a - d) * 60;\r\n    let m = Math.floor(mf);\r\n    let s = Math.round((mf - m) * 60);\r\n    if (s === 60) { s = 0; m++; }\r\n    if (m === 60) { m = 0; d++; }\r\n    return d + '\\u00B0' + String(m).padStart(2, '0') + '\\u2032' + String(s).padStart(2, '0') + '\\u2033' + dir;\r\n  }\r\n  const coordStr = (lat, lon) => dms(lat, 'N', 'S') + ' ' + dms(lon, 'W', 'E');\r\n\r\n  \/* ---------- Fast-Action Timeline ---------- *\/\r\n  const FIRE = { fx: 0.44, fy: 0.50, rf: 0.21 };\r\n  const PROJ_K = 1.28;\r\n  const SCAN = { start: 1.2, pass: 4.2, cycle: 5.8, margin: 40 };\r\n  const HS_ANGLES = [-0.35, 2.6, 1.35, 4.15, 0.55, 3.5, 5.25, 2.05];\r\n\r\n  let W = 0, H = 0, DPR = 1, cx = 0, cy = 0, baseR = 0, isMobile = false;\r\n  let isVisible = false;\r\n  let lastTime = null;\r\n  let rafId = null;\r\n\r\n  const S = {\r\n    t: 0,\r\n    lastScanX: null,\r\n    hs: [],\r\n    idCounter: 0,\r\n    detCount: 0,\r\n    scripted: [{ t: 0.6, ang: -0.35 }, { t: 4.8, ang: 2.6 }],\r\n    nextSpawn: 10.5,\r\n    spawnIdx: 2,\r\n    mouse: null\r\n  };\r\n\r\n  \/* ---------- Fire shape math ---------- *\/\r\n  function shape(a, t) {\r\n    return 1 + 0.16 * Math.sin(3 * a + 0.7 + 0.18 * t)\r\n             + 0.11 * Math.sin(5 * a - 1.3 - 0.11 * t)\r\n             + 0.20 * Math.sin(2 * a + 1.9 + 0.055 * t)\r\n             + 0.07 * Math.sin(7 * a + 4.0 - 0.14 * t);\r\n  }\r\n  function growth(t) {\r\n    return Math.min(1.25, 1 + 0.05 * (1 - Math.exp(-t \/ 16)) + 0.0012 * Math.max(0, t - 20));\r\n  }\r\n  function firePoint(a, k, t) {\r\n    const r = baseR * shape(a, t) * k * growth(t);\r\n    return [cx + Math.cos(a) * r, cy + Math.sin(a) * r * 0.86];\r\n  }\r\n  function tracePath(k) {\r\n    ctx.beginPath();\r\n    const N = 72;\r\n    for (let i = 0; i <= N; i++) {\r\n      const p = firePoint(i \/ N * Math.PI * 2, k, S.t);\r\n      i ? ctx.lineTo(p[0], p[1]) : ctx.moveTo(p[0], p[1]);\r\n    }\r\n    ctx.closePath();\r\n  }\r\n\r\n  \/* ---------- Scan sweep math ---------- *\/\r\n  function scanState(t) {\r\n    if (t < SCAN.start) return null;\r\n    const u = t - SCAN.start;\r\n    const idx = Math.floor(u \/ SCAN.cycle);\r\n    const ph = u - idx * SCAN.cycle;\r\n    if (ph > SCAN.pass) return null;\r\n    const p = ph \/ SCAN.pass;\r\n    const span = W + SCAN.margin * 2;\r\n    const raw = p * span - SCAN.margin;\r\n    return { x: idx % 2 === 0 ? raw : W - raw, ltr: idx % 2 === 0 };\r\n  }\r\n\r\n  \/* ---------- Static Terrain Texture (Responsive simplification) ---------- *\/\r\n  function renderTerrain() {\r\n    terrain.width = Math.max(1, W * DPR);\r\n    terrain.height = Math.max(1, H * DPR);\r\n    const c = terrain.getContext('2d');\r\n    c.setTransform(DPR, 0, 0, DPR, 0, 0);\r\n    c.fillStyle = '#090909';\r\n    c.fillRect(0, 0, W, H);\r\n    \r\n    c.font = isMobile ? '9.5px \"JetBrains Mono\", monospace' : '10.5px \"JetBrains Mono\", monospace';\r\n    \r\n    \/\/ Halve grid line frequency on mobile to keep map clean\r\n    const lonStep = isMobile ? 2 : 1;\r\n    for (let lon = GEO.lonE; lon <= GEO.lonW; lon += lonStep) {\r\n      const x = (GEO.lonW - lon) \/ (GEO.lonW - GEO.lonE) * W;\r\n      c.strokeStyle = 'rgba(226,226,226,.045)';\r\n      c.beginPath(); c.moveTo(x, 0); c.lineTo(x, H); c.stroke();\r\n      if (lon > GEO.lonE) {\r\n        c.fillStyle = 'rgba(179,179,179,.42)';\r\n        c.fillText(lon + '\\u00B0W', x + 5, 14);\r\n      }\r\n    }\r\n    for (let lat = GEO.latS + 0.5; lat < GEO.latN; lat += (isMobile ? 1.0 : 0.5)) {\r\n      const y = (GEO.latN - lat) \/ (GEO.latN - GEO.latS) * H;\r\n      c.strokeStyle = 'rgba(226,226,226,.045)';\r\n      c.beginPath(); c.moveTo(0, y); c.lineTo(W, y); c.stroke();\r\n      c.fillStyle = 'rgba(179,179,179,.42)';\r\n      c.fillText(lat.toFixed(1) + '\\u00B0N', 8, y + 13);\r\n    }\r\n    \r\n    \/\/ Topo clusters\r\n    const cluster = (fx, fy, n) => {\r\n      for (let i = 1; i <= n; i++) {\r\n        c.beginPath();\r\n        for (let a = 0; a <= 6.32; a += 0.1) {\r\n          const rr = i * 26 * (1 + 0.13 * Math.sin(a * 3 + i * 1.7) + 0.09 * Math.sin(a * 5 - i));\r\n          const x = fx * W + Math.cos(a) * rr, y = fy * H + Math.sin(a) * rr * 0.8;\r\n          a === 0 ? c.moveTo(x, y) : c.lineTo(x, y);\r\n        }\r\n        c.closePath();\r\n        c.strokeStyle = i % 3 === 0 ? 'rgba(179,179,179,.09)' : 'rgba(179,179,179,.045)';\r\n        c.stroke();\r\n      }\r\n    };\r\n    cluster(0.22, 0.24, isMobile ? 3 : 5);\r\n    cluster(0.82, 0.18, isMobile ? 3 : 5);\r\n    if (!isMobile) {\r\n      cluster(0.70, 0.82, 4);\r\n      cluster(0.12, 0.55, 3);\r\n    }\r\n    \r\n    let seed = 20260517;\r\n    const rnd = () => { seed = (seed * 16807) % 2147483647; return seed \/ 2147483647; };\r\n    const numDots = isMobile ? 18 : 45;\r\n    for (let i = 0; i < numDots; i++) {\r\n      c.fillStyle = 'rgba(179,179,179,' + (0.035 + rnd() * 0.05).toFixed(3) + ')';\r\n      c.fillRect(rnd() * W, rnd() * H, 1.4, 1.4);\r\n    }\r\n\r\n    c.beginPath();\r\n    for (let a = 0; a <= 6.32; a += 0.12) {\r\n      const n = 1 + 0.16 * Math.sin(a * 3 + 2.3) + 0.1 * Math.sin(a * 5 + 0.7);\r\n      const x = 0.14 * W + Math.cos(a) * 0.062 * W * n, y = 0.80 * H + Math.sin(a) * 0.075 * H * n;\r\n      a === 0 ? c.moveTo(x, y) : c.lineTo(x, y);\r\n    }\r\n    c.closePath();\r\n    c.fillStyle = 'rgba(226,226,226,.035)'; c.fill();\r\n    c.setLineDash([3, 4]); c.strokeStyle = 'rgba(179,179,179,.18)'; c.stroke(); c.setLineDash([]);\r\n    \r\n    \/\/ Hide vector access route on mobile\r\n    if (!isMobile) {\r\n      const pts = [[0.015, 0.965], [0.09, 0.94], [0.14, 0.89], [0.19, 0.865], [0.235, 0.83], [0.275, 0.785], [0.30, 0.73]];\r\n      c.setLineDash([9, 6]); c.strokeStyle = 'rgba(179,179,179,.28)'; c.lineWidth = 1.1;\r\n      c.beginPath(); pts.forEach((p, i) => { i ? c.lineTo(p[0] * W, p[1] * H) : c.moveTo(p[0] * W, p[1] * H); }); c.stroke();\r\n      c.setLineDash([]);\r\n      \r\n      const ex = 0.30 * W, ey = 0.73 * H;\r\n      c.strokeStyle = 'rgba(179,179,179,.42)'; c.lineWidth = 1;\r\n      c.beginPath(); c.moveTo(ex - 4, ey - 4); c.lineTo(ex + 4, ey + 4); c.moveTo(ex - 4, ey + 4); c.lineTo(ex + 4, ey - 4); c.stroke();\r\n      c.font = '10px \"JetBrains Mono\", monospace';\r\n      c.fillStyle = 'rgba(179,179,179,.55)'; c.fillText('ACCESS ROUTE', 0.055 * W, 0.915 * H);\r\n    }\r\n  }\r\n\r\n  \/* ---------- Hotspots & Detection ---------- *\/\r\n  function spawnHS(ang) {\r\n    S.hs.push({\r\n      ang: ang + (Math.random() * 0.24 - 0.12),\r\n      k: 1.02 + Math.random() * 0.07,\r\n      born: S.t,\r\n      detected: false,\r\n      detT: 0,\r\n      id: ++S.idCounter,\r\n      temp: 380 + Math.round(Math.random() * 240),\r\n      lat: 0,\r\n      lon: 0,\r\n      dying: 0\r\n    });\r\n  }\r\n\r\n  function detect(h, p) {\r\n    h.detected = true;\r\n    h.detT = S.t;\r\n    h.lat = latAt(p[1] \/ H);\r\n    h.lon = lonAt(p[0] \/ W);\r\n    S.detCount++;\r\n    const b = document.getElementById('det-badge');\r\n    if (b) {\r\n      b.hidden = false;\r\n      b.querySelector('b').textContent = S.detCount;\r\n      if (b.animate) b.animate([{ opacity: 0.15 }, { opacity: 1 }], { duration: 450, easing: 'ease-out' });\r\n    }\r\n  }\r\n\r\n  \/* ---------- Update Loop ---------- *\/\r\n  function update() {\r\n    while (S.scripted.length && S.t >= S.scripted[0].t) {\r\n      if (S.hs.some(h => !h.dying && !h.detected)) {\r\n        S.scripted[0].t = S.t + 2;\r\n        break;\r\n      }\r\n      spawnHS(S.scripted.shift().ang);\r\n    }\r\n    if (S.t >= S.nextSpawn) {\r\n      const pending = S.hs.some(h => !h.dying && !h.detected);\r\n      if (!pending) {\r\n        const maxActive = isMobile ? 3 : 5;\r\n        if (S.hs.filter(h => !h.dying).length >= maxActive) {\r\n          S.hs.filter(h => !h.dying).reduce((a, b) => a.born < b.born ? a : b).dying = S.t;\r\n        }\r\n        if (S.hs.filter(h => !h.dying).length < maxActive) {\r\n          spawnHS(HS_ANGLES[S.spawnIdx++ % HS_ANGLES.length]);\r\n          S.nextSpawn = S.t + 9 + Math.random() * 5;\r\n        } else {\r\n          S.nextSpawn = S.t + 5;\r\n        }\r\n      } else {\r\n        S.nextSpawn = S.t + 3;\r\n      }\r\n    }\r\n    for (const h of S.hs) {\r\n      if (!h.dying && h.detected && S.t - h.detT > (isMobile ? 18 : 24)) h.dying = S.t;\r\n    }\r\n    S.hs = S.hs.filter(h => !h.dying || S.t - h.dying < 4);\r\n\r\n    const sc = scanState(S.t);\r\n    for (const h of S.hs) {\r\n      if (h.dying) continue;\r\n      const p = firePoint(h.ang, h.k, S.t);\r\n      if (!h.detected && sc && S.lastScanX != null) {\r\n        const a = S.lastScanX, b = sc.x;\r\n        if ((a - p[0]) * (b - p[0]) <= 0 && Math.abs(b - a) < W * 0.5) {\r\n          detect(h, p);\r\n        }\r\n      }\r\n    }\r\n    S.lastScanX = sc ? sc.x : null;\r\n  }\r\n\r\n  \/* ---------- Render Functions ---------- *\/\r\n  function mapLabel(a, k, txt, color) {\r\n    const p = firePoint(a, k, S.t);\r\n    ctx.font = isMobile ? '600 9.5px \"JetBrains Mono\", monospace' : '600 11px \"JetBrains Mono\", monospace';\r\n    ctx.fillStyle = color;\r\n    ctx.fillText(txt, p[0] + (isMobile ? 7 : 10), p[1] + 3);\r\n  }\r\n\r\n  function drawHSChip(x, y, h, alpha) {\r\n    ctx.globalAlpha = alpha;\r\n    \r\n    if (isMobile) {\r\n      \/\/ 2-line chip on mobile\r\n      const l1 = 'HS-' + String(h.id).padStart(2, '0') + ' \\u00B7 ' + h.temp + '\\u00B0C';\r\n      const l2 = 'THERMAL DETECTED';\r\n      \r\n      ctx.font = '700 10.5px \"JetBrains Mono\", monospace';\r\n      const w1 = ctx.measureText(l1).width;\r\n      ctx.font = '9px \"JetBrains Mono\", monospace';\r\n      const w = Math.max(w1, ctx.measureText(l2).width) + 16;\r\n      const hh = 34;\r\n      \r\n      let bx = x + 12, by = y - hh - 12;\r\n      if (bx + w > W - 6) bx = x - w - 12;\r\n      if (by < 6) by = y + 16;\r\n      \r\n      const leadX = bx > x ? bx : bx + w, leadY = by < y ? by + hh : by;\r\n      ctx.strokeStyle = 'rgba(255,182,1,.55)'; ctx.lineWidth = 1;\r\n      ctx.beginPath(); ctx.moveTo(x, y); ctx.lineTo(leadX, leadY); ctx.stroke();\r\n      \r\n      ctx.fillStyle = 'rgba(8,8,8,.92)'; ctx.fillRect(bx, by, w, hh);\r\n      ctx.strokeStyle = 'rgba(255,182,1,.45)'; ctx.strokeRect(bx + 0.5, by + 0.5, w - 1, hh - 1);\r\n      \r\n      ctx.fillStyle = '#FFB601'; ctx.font = '700 10.5px \"JetBrains Mono\", monospace'; ctx.fillText(l1, bx + 8, by + 14);\r\n      ctx.fillStyle = '#AAAAAA'; ctx.font = '9px \"JetBrains Mono\", monospace'; ctx.fillText(l2, bx + 8, by + 26);\r\n    } else {\r\n      \/\/ 3-line chip on desktop\r\n      const l1 = 'HS-' + String(h.id).padStart(2, '0');\r\n      const l2 = 'THERMAL DETECTED';\r\n      const l3 = coordStr(h.lat, h.lon) + ' \\u00B7 ' + h.temp + '\\u00B0C';\r\n      \r\n      ctx.font = '700 11.5px \"JetBrains Mono\", monospace';\r\n      const w1 = ctx.measureText(l1).width;\r\n      ctx.font = '10.5px \"JetBrains Mono\", monospace';\r\n      const w = Math.max(w1, ctx.measureText(l2).width, ctx.measureText(l3).width) + 24;\r\n      const hh = 48;\r\n      \r\n      let bx = x + 16, by = y - hh - 18;\r\n      if (bx + w > W - 8) bx = x - w - 16;\r\n      if (by < 8) by = y + 20;\r\n      \r\n      const leadX = bx > x ? bx : bx + w, leadY = by < y ? by + hh : by;\r\n      ctx.strokeStyle = 'rgba(255,182,1,.55)'; ctx.lineWidth = 1.2;\r\n      ctx.beginPath(); ctx.moveTo(x, y); ctx.lineTo(leadX, leadY); ctx.stroke();\r\n      \r\n      ctx.fillStyle = 'rgba(8,8,8,.92)'; ctx.fillRect(bx, by, w, hh);\r\n      ctx.strokeStyle = 'rgba(255,182,1,.45)'; ctx.strokeRect(bx + 0.5, by + 0.5, w - 1, hh - 1);\r\n      \r\n      ctx.fillStyle = '#FFB601'; ctx.font = '700 11.5px \"JetBrains Mono\", monospace'; ctx.fillText(l1, bx + 10, by + 16);\r\n      ctx.fillStyle = '#CCCCCC'; ctx.font = '10.5px \"JetBrains Mono\", monospace'; ctx.fillText(l2, bx + 10, by + 30);\r\n      ctx.fillStyle = '#8E8E8E'; ctx.fillText(l3, bx + 10, by + 44);\r\n    }\r\n    \r\n    ctx.globalAlpha = 1;\r\n  }\r\n\r\n  function drawHotspots() {\r\n    for (const h of S.hs) {\r\n      let A = 1;\r\n      if (h.dying) {\r\n        A = 1 - (S.t - h.dying) \/ 4;\r\n        if (A <= 0) continue;\r\n      }\r\n      const p = firePoint(h.ang, h.k, S.t);\r\n      if (!h.detected) {\r\n        const b = 0.5 + 0.5 * Math.sin(S.t * 3 + h.id * 2.1);\r\n        ctx.fillStyle = 'rgba(255,96,24,' + ((0.10 + 0.10 * b) * A).toFixed(3) + ')';\r\n        ctx.beginPath(); ctx.arc(p[0], p[1], (isMobile ? 5.5 : 7) + 2 * b, 0, 7); ctx.fill();\r\n        ctx.fillStyle = 'rgba(255,96,24,' + ((0.35 + 0.30 * b) * A).toFixed(3) + ')';\r\n        ctx.beginPath(); ctx.arc(p[0], p[1], isMobile ? 2.0 : 2.4, 0, 7); ctx.fill();\r\n        continue;\r\n      }\r\n      const age = S.t - h.detT;\r\n      if (age < 0.9) {\r\n        const q = age \/ 0.9, e = 1 - Math.pow(1 - q, 3);\r\n        ctx.strokeStyle = 'rgba(255,182,1,' + (0.85 * (1 - q) * A).toFixed(3) + ')'; ctx.lineWidth = 1.5;\r\n        ctx.beginPath(); ctx.arc(p[0], p[1], 4 + (isMobile ? 36 : 50) * e, 0, 7); ctx.stroke();\r\n      }\r\n      const b = 0.5 + 0.5 * Math.sin(S.t * 2.4 + h.id * 1.7);\r\n      ctx.strokeStyle = 'rgba(255,182,1,' + (0.25 * A).toFixed(3) + ')'; ctx.lineWidth = 1;\r\n      ctx.beginPath(); ctx.arc(p[0], p[1], (isMobile ? 6 : 8) + 2 * b, 0, 7); ctx.stroke();\r\n      let r = isMobile ? 2.4 : 3.0;\r\n      if (age < 0.5) r += 1.6 * Math.sin(Math.PI * age \/ 0.5);\r\n      ctx.fillStyle = 'rgba(255,182,1,' + (0.95 * A).toFixed(3) + ')';\r\n      ctx.beginPath(); ctx.arc(p[0], p[1], r, 0, 7); ctx.fill();\r\n      const ca = Math.max(0, Math.min(1, (age - 0.35) \/ 0.5)) * A;\r\n      if (ca > 0) drawHSChip(p[0], p[1], h, ca);\r\n    }\r\n  }\r\n\r\n  function drawScan(sc) {\r\n    const dir = sc.ltr ? 1 : -1;\r\n    const g = ctx.createLinearGradient(sc.x - dir * (isMobile ? 70 : 100), 0, sc.x, 0);\r\n    g.addColorStop(0, 'rgba(255,182,1,0)');\r\n    g.addColorStop(1, 'rgba(255,182,1,.065)');\r\n    ctx.fillStyle = g;\r\n    ctx.fillRect(Math.min(sc.x, sc.x - dir * (isMobile ? 70 : 100)), 0, isMobile ? 70 : 100, H);\r\n    for (let i = 1; i <= 3; i++) {\r\n      const tx = sc.x - dir * i * (isMobile ? 9 : 12);\r\n      ctx.strokeStyle = 'rgba(255,182,1,' + (0.16 * (1 - i \/ 4)).toFixed(3) + ')'; ctx.lineWidth = 1;\r\n      ctx.beginPath(); ctx.moveTo(tx, 0); ctx.lineTo(tx, H); ctx.stroke();\r\n    }\r\n    ctx.strokeStyle = 'rgba(255,182,1,.65)'; ctx.lineWidth = 1.4;\r\n    ctx.beginPath(); ctx.moveTo(sc.x, 0); ctx.lineTo(sc.x, H); ctx.stroke();\r\n    ctx.fillStyle = 'rgba(255,182,1,.85)';\r\n    [[sc.x, 14], [sc.x, H - 14]].forEach(([px, py]) => {\r\n      ctx.beginPath(); ctx.moveTo(px - dir * 5, py - 6); ctx.lineTo(px - dir * 5, py + 6); ctx.lineTo(px + dir * 7, py);\r\n      ctx.closePath(); ctx.fill();\r\n    });\r\n  }\r\n\r\n  function drawFurniture() {\r\n    \/\/ Compass\r\n    const compX = isMobile ? 22 : 28, compY = isMobile ? 42 : 52;\r\n    ctx.strokeStyle = 'rgba(179,179,179,.55)'; ctx.lineWidth = 1.2;\r\n    ctx.beginPath(); ctx.moveTo(compX, compY + 30); ctx.lineTo(compX, compY + 8); ctx.stroke();\r\n    ctx.fillStyle = 'rgba(179,179,179,.6)';\r\n    ctx.beginPath(); ctx.moveTo(compX, compY); ctx.lineTo(compX - 4, compY + 10); ctx.lineTo(compX + 4, compY + 10); ctx.closePath(); ctx.fill();\r\n    ctx.font = '700 10px \"JetBrains Mono\", monospace'; ctx.fillText('N', compX - 3.5, compY + 42);\r\n    \r\n    \/\/ Scale Bar\r\n    const kmAcross = (GEO.lonW - GEO.lonE) * 111.32 * Math.cos(55 * Math.PI \/ 180);\r\n    const bar = Math.round(25 * W \/ kmAcross), x0 = (W - bar) \/ 2, y = H - (isMobile ? 18 : 24);\r\n    ctx.strokeStyle = 'rgba(179,179,179,.6)';\r\n    ctx.beginPath(); ctx.moveTo(x0, y); ctx.lineTo(x0 + bar, y);\r\n    ctx.moveTo(x0, y - 4); ctx.lineTo(x0, y + 1); ctx.moveTo(x0 + bar, y - 4); ctx.lineTo(x0 + bar, y + 1); ctx.stroke();\r\n    ctx.fillStyle = 'rgba(179,179,179,.7)'; ctx.font = isMobile ? '600 9.5px \"JetBrains Mono\", monospace' : '600 11px \"JetBrains Mono\", monospace';\r\n    ctx.textAlign = 'center'; ctx.fillText('25 KM', W \/ 2, y - (isMobile ? 6 : 9)); ctx.textAlign = 'left';\r\n  }\r\n\r\n  function drawCrosshair() {\r\n    if (!S.mouse) return;\r\n    const { x, y } = S.mouse;\r\n    ctx.strokeStyle = 'rgba(255,182,1,.18)'; ctx.lineWidth = 1;\r\n    ctx.beginPath(); ctx.moveTo(0, y + 0.5); ctx.lineTo(W, y + 0.5); ctx.moveTo(x + 0.5, 0); ctx.lineTo(x + 0.5, H); ctx.stroke();\r\n    \r\n    const txt = coordStr(latAt(y \/ H), lonAt(x \/ W));\r\n    ctx.font = isMobile ? '600 10px \"JetBrains Mono\", monospace' : '600 11.5px \"JetBrains Mono\", monospace';\r\n    const w = ctx.measureText(txt).width + (isMobile ? 14 : 20);\r\n    const hh = isMobile ? 19 : 22;\r\n    let bx = x + 14, by = y + 16;\r\n    if (bx + w > W - 8) bx = x - w - 14;\r\n    if (by + hh + 4 > H - 8) by = y - hh - 14;\r\n    \r\n    ctx.fillStyle = 'rgba(8,8,8,.92)'; ctx.fillRect(bx, by, w, hh);\r\n    ctx.strokeStyle = 'rgba(255,182,1,.4)'; ctx.strokeRect(bx + 0.5, by + 0.5, w - 1, hh - 1);\r\n    ctx.fillStyle = '#FFB601'; ctx.fillText(txt, bx + (isMobile ? 7 : 10), by + (isMobile ? 13 : 15));\r\n  }\r\n\r\n  function draw() {\r\n    ctx.clearRect(0, 0, W, H);\r\n    ctx.drawImage(terrain, 0, 0, W, H);\r\n    \r\n    \/\/ Perimeter & Spread\r\n    ctx.setLineDash([7, 6]); ctx.lineDashOffset = -(S.t * 12) % 13;\r\n    ctx.strokeStyle = 'rgba(226,226,226,.32)'; ctx.lineWidth = 1;\r\n    tracePath(PROJ_K); ctx.stroke(); ctx.setLineDash([]);\r\n    tracePath(1); ctx.fillStyle = 'rgba(255,110,20,.055)'; ctx.fill();\r\n    tracePath(0.55); ctx.fillStyle = 'rgba(38,17,6,.55)'; ctx.fill();\r\n    tracePath(1); ctx.strokeStyle = 'rgba(255,182,1,.95)'; ctx.lineWidth = isMobile ? 1.4 : 1.8; ctx.stroke();\r\n    \r\n    mapLabel(3.9, 1.14, 'ACTIVE PERIMETER', 'rgba(255,182,1,.75)');\r\n    \/\/ Hide secondary \"PROJECTED SPREAD\" label on mobile to avoid overlapping with hotspot alert boxes\r\n    if (!isMobile) {\r\n      mapLabel(0.9, PROJ_K * 1.12, 'PROJECTED SPREAD', 'rgba(226,226,226,.65)');\r\n    }\r\n    \r\n    drawHotspots();\r\n    const sc = scanState(S.t);\r\n    if (sc) drawScan(sc);\r\n    drawFurniture();\r\n    drawCrosshair();\r\n  }\r\n\r\n  \/* ---------- Resize Handling ---------- *\/\r\n  function resize() {\r\n    DPR = Math.min(2, window.devicePixelRatio || 1);\r\n    W = cv.clientWidth; H = cv.clientHeight;\r\n    if (!W || !H) return;\r\n    isMobile = W < 540;\r\n    cv.width = W * DPR; cv.height = H * DPR;\r\n    ctx.setTransform(DPR, 0, 0, DPR, 0, 0);\r\n    cx = FIRE.fx * W; cy = FIRE.fy * H; baseR = FIRE.rf * Math.min(W, H);\r\n    renderTerrain();\r\n    if (RM) draw();\r\n  }\r\n\r\n  window.addEventListener('resize', resize);\r\n  resize();\r\n  if (document.fonts && document.fonts.ready) document.fonts.ready.then(() => { renderTerrain(); if (RM) draw(); });\r\n\r\n  \/* ---------- Interaction: Hover \/ Touch Coordinates ---------- *\/\r\n  function setMouse(px, py) {\r\n    const r = cv.getBoundingClientRect();\r\n    S.mouse = { x: px - r.left, y: py - r.top };\r\n  }\r\n  cv.addEventListener('mousemove', e => { setMouse(e.clientX, e.clientY); if (RM) draw(); });\r\n  cv.addEventListener('mouseleave', () => { S.mouse = null; if (RM) draw(); });\r\n  cv.addEventListener('touchstart', e => setMouse(e.touches[0].clientX, e.touches[0].clientY), { passive: true });\r\n  cv.addEventListener('touchmove', e => setMouse(e.touches[0].clientX, e.touches[0].clientY), { passive: true });\r\n  cv.addEventListener('touchend', () => { S.mouse = null; if (RM) draw(); });\r\n\r\n  \/* ---------- Panel Status Metrics Drift ---------- *\/\r\n  const P = { windDir: 'NW', windSpd: 32, temp: 31, hum: 24 };\r\n  const DIRS = ['NW', 'NNW', 'WNW', 'W', 'N'];\r\n  function tickPanel() {\r\n    if (!isVisible || RM) return;\r\n    const g = growth(S.t);\r\n    const perimEl = document.getElementById('pv-perim');\r\n    const areaEl = document.getElementById('pv-area');\r\n    if (perimEl) perimEl.textContent = (86 * g).toFixed(1) + ' KM';\r\n    if (areaEl) areaEl.textContent = (Math.round(24800 * g * g \/ 10) * 10).toLocaleString('en-CA') + ' HA';\r\n    if (Math.random() < 0.35) P.windDir = DIRS[Math.floor(Math.random() * DIRS.length)];\r\n    if (Math.random() < 0.4) P.windSpd = Math.max(26, Math.min(38, P.windSpd + Math.round(Math.random() * 4 - 2)));\r\n    if (Math.random() < 0.25) P.temp = Math.max(29, Math.min(33, P.temp + (Math.random() < 0.5 ? -1 : 1)));\r\n    if (Math.random() < 0.3) P.hum = Math.max(21, Math.min(27, P.hum + (Math.random() < 0.5 ? -1 : 1)));\r\n    const windEl = document.getElementById('pv-wind');\r\n    const tempEl = document.getElementById('pv-temp');\r\n    const humEl = document.getElementById('pv-hum');\r\n    if (windEl) windEl.textContent = P.windDir + ' ' + P.windSpd + ' KM\/H';\r\n    if (tempEl) tempEl.textContent = P.temp + '\\u00B0C';\r\n    if (humEl) humEl.textContent = P.hum + '%';\r\n  }\r\n  setInterval(tickPanel, 2000);\r\n\r\n  \/* ---------- Viewport Intersection Observer & RAF Loop ---------- *\/\r\n  if (RM) {\r\n    S.t = 3.5;\r\n    const p = firePoint(-0.35, 1.05, S.t);\r\n    S.hs.push({\r\n      ang: -0.35, k: 1.05, born: 0.6, detected: true, detT: 3.0, id: 1, temp: 512, dying: 0,\r\n      lat: latAt(p[1] \/ H), lon: lonAt(p[0] \/ W)\r\n    });\r\n    S.idCounter = 1; S.detCount = 1;\r\n    const b = document.getElementById('det-badge');\r\n    if (b) { b.hidden = false; b.querySelector('b').textContent = '1'; }\r\n    draw();\r\n  } else {\r\n    draw();\r\n    \r\n    function frame(now) {\r\n      if (!isVisible) {\r\n        lastTime = null;\r\n        return;\r\n      }\r\n      if (lastTime === null) {\r\n        lastTime = now;\r\n      }\r\n      const dt = Math.min(0.05, (now - lastTime) \/ 1000);\r\n      lastTime = now;\r\n      \r\n      S.t += dt;\r\n      update();\r\n      draw();\r\n      \r\n      rafId = requestAnimationFrame(frame);\r\n    }\r\n\r\n    const observer = new IntersectionObserver((entries) => {\r\n      entries.forEach(entry => {\r\n        const wasVisible = isVisible;\r\n        isVisible = entry.isIntersecting;\r\n        \r\n        if (isVisible && !wasVisible) {\r\n          if (rafId) cancelAnimationFrame(rafId);\r\n          rafId = requestAnimationFrame(frame);\r\n        }\r\n      });\r\n    }, { threshold: 0.15 });\r\n\r\n    observer.observe(root);\r\n  }\r\n})();\r\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-f27c09f e-con-full elementor-hidden-desktop elementor-hidden-laptop elementor-hidden-tablet elementor-hidden-mobile e-flex e-con e-parent\" data-id=\"f27c09f\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t<div class=\"elementor-element elementor-element-fc3c579 e-con-full e-flex e-con e-child\" data-id=\"fc3c579\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-0765112 elementor-widget__width-inherit elementor-widget-laptop__width-initial elementor-widget elementor-widget-heading\" data-id=\"0765112\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">FLYOX 1-<span style=\"color: #FFB601\">Uncrewed Amphibious Fire Bomber<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-db787db e-con-full elementor-hidden-desktop elementor-hidden-laptop elementor-hidden-tablet elementor-hidden-mobile e-flex e-con e-parent\" data-id=\"db787db\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t<div class=\"elementor-element elementor-element-e72ae65 e-con-full e-flex e-con e-child\" data-id=\"e72ae65\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-663d28f elementor-widget__width-inherit elementor-widget-mobile__width-inherit elementor-widget elementor-widget-html\" data-id=\"663d28f\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<!-- ==========================================================================\r\n     FLYOX 1 \u2014 3D TACTICAL WILDFIRE MISSION (ELEMENTOR COMPATIBLE WIDGET)\r\n     Left-Aligned Clean 3D Viewport with Floating Tactical Pause\/Play Button.\r\n     ========================================================================== -->\r\n\r\n<!-- 1. Fonts & Three.js CDN Engine -->\r\n<link rel=\"preconnect\" href=\"https:\/\/fonts.gstatic.com\" crossorigin>\r\n<link href=\"https:\/\/fonts.googleapis.com\/css2?family=Chakra+Petch:wght@500;600;700&family=JetBrains+Mono:wght@400;500;700&display=swap\" rel=\"stylesheet\">\r\n<script src=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/three.js\/r128\/three.min.js\"><\/script>\r\n\r\n<!-- 2. Scoped CSS (Zero Theme \/ Global Conflict) -->\r\n<style>\r\n.flyox-widget-wrap {\r\n  --fx-bg: #04060a;\r\n  --fx-line2: #2a3345;\r\n  --fx-txt: #e8edf4;\r\n  --fx-mut: #8b95a8;\r\n  --fx-dim: #59637a;\r\n  --fx-gold: #ffb601;\r\n  --fx-ember: #ff3b14;\r\n  --fx-cyan: #3fd8ff;\r\n  --fx-mono: 'JetBrains Mono', monospace;\r\n  --fx-disp: 'Chakra Petch', sans-serif;\r\n  \r\n  width: 100% !important;\r\n  max-width: 100% !important;\r\n  margin: 0 !important;\r\n  box-sizing: border-box !important;\r\n  font-family: var(--fx-disp);\r\n  color: var(--fx-txt);\r\n  background: var(--fx-bg);\r\n  border: 1px solid var(--fx-line2);\r\n  box-shadow: 0 18px 50px rgba(0,0,0,0.65);\r\n  position: relative;\r\n  overflow: hidden;\r\n  text-align: left;\r\n}\r\n\r\n.flyox-widget-wrap * {\r\n  box-sizing: border-box;\r\n}\r\n\r\n.flyox-viewport {\r\n  position: relative !important;\r\n  width: 100% !important;\r\n  height: clamp(520px, 72vh, 800px) !important;\r\n  background: #000 !important;\r\n  overflow: hidden !important;\r\n}\r\n\r\n.flyox-viewport canvas {\r\n  position: absolute !important;\r\n  inset: 0 !important;\r\n  width: 100% !important;\r\n  height: 100% !important;\r\n  display: block !important;\r\n  touch-action: none !important;\r\n}\r\n\r\n.flyox-viewport::after {\r\n  content: '';\r\n  position: absolute;\r\n  inset: 0;\r\n  pointer-events: none;\r\n  z-index: 3;\r\n  background: radial-gradient(ellipse at center, transparent 55%, rgba(0,0,0,0.45) 100%);\r\n}\r\n\r\n.flyox-corner {\r\n  position: absolute;\r\n  width: 14px;\r\n  height: 14px;\r\n  border: 0 solid rgba(255,182,1,0.55);\r\n  pointer-events: none;\r\n  z-index: 6;\r\n}\r\n.flyox-c-tl { top: 6px; left: 6px; border-top-width: 1px; border-left-width: 1px; }\r\n.flyox-c-tr { top: 6px; right: 6px; border-top-width: 1px; border-right-width: 1px; }\r\n.flyox-c-bl { bottom: 6px; left: 6px; border-bottom-width: 1px; border-left-width: 1px; }\r\n.flyox-c-br { bottom: 6px; right: 6px; border-bottom-width: 1px; border-right-width: 1px; }\r\n\r\n.flyox-hud {\r\n  position: absolute;\r\n  font-family: var(--fx-mono);\r\n  font-size: 10.5px;\r\n  background: rgba(5,8,13,0.85);\r\n  border: 1px solid rgba(110,130,160,0.28);\r\n  padding: 9px 11px;\r\n  backdrop-filter: blur(5px);\r\n  pointer-events: none;\r\n  line-height: 1.6;\r\n  z-index: 5;\r\n}\r\n\r\n.flyox-hud b {\r\n  font-weight: 700;\r\n  color: var(--fx-txt);\r\n}\r\n\r\n.flyox-row {\r\n  display: flex;\r\n  justify-content: space-between;\r\n  gap: 10px;\r\n}\r\n\r\n.flyox-row span {\r\n  color: var(--fx-dim);\r\n  letter-spacing: 0.08em;\r\n  font-size: 9.5px;\r\n}\r\n\r\n.flyox-hud-phase {\r\n  position: absolute;\r\n  top: 12px;\r\n  left: 50%;\r\n  transform: translateX(-50%);\r\n  font-family: var(--fx-mono);\r\n  font-size: 10px;\r\n  letter-spacing: 0.18em;\r\n  color: var(--fx-gold);\r\n  background: rgba(5,8,13,0.88);\r\n  border: 1px solid rgba(255,182,1,0.45);\r\n  padding: 4px 14px;\r\n  z-index: 5;\r\n  white-space: nowrap;\r\n  border-radius: 2px;\r\n}\r\n\r\n\/* \u2500\u2500 Floating Controls Bar (Top Right) \u2500\u2500 *\/\r\n.flyox-top-controls {\r\n  position: absolute !important;\r\n  top: 10px !important;\r\n  right: 12px !important;\r\n  z-index: 20 !important;\r\n  display: flex !important;\r\n  align-items: center !important;\r\n  gap: 8px !important;\r\n}\r\n\r\n.flyox-play-btn,\r\n#fxBtnPlay,\r\n.flyox-btn-hud,\r\n#fxBtnHud {\r\n  font-family: 'JetBrains Mono', ui-monospace, monospace !important;\r\n  font-size: 10px !important;\r\n  font-weight: 600 !important;\r\n  letter-spacing: 0.12em !important;\r\n  color: #e8edf4 !important;\r\n  background: rgba(8, 12, 20, 0.90) !important;\r\n  border: 1px solid rgba(255, 182, 1, 0.55) !important;\r\n  padding: 6px 12px !important;\r\n  border-radius: 3px !important;\r\n  cursor: pointer !important;\r\n  display: flex !important;\r\n  align-items: center !important;\r\n  justify-content: center !important;\r\n  gap: 6px !important;\r\n  backdrop-filter: blur(6px) !important;\r\n  -webkit-backdrop-filter: blur(6px) !important;\r\n  transition: all 0.18s ease !important;\r\n  user-select: none !important;\r\n  text-transform: uppercase !important;\r\n  box-shadow: 0 4px 14px rgba(0, 0, 0, 0.5) !important;\r\n  line-height: 1.4 !important;\r\n  outline: none !important;\r\n  margin: 0 !important;\r\n  width: auto !important;\r\n  height: auto !important;\r\n  text-decoration: none !important;\r\n  appearance: none !important;\r\n  -webkit-appearance: none !important;\r\n}\r\n\r\n.flyox-btn-hud,\r\n#fxBtnHud {\r\n  border-color: rgba(63, 216, 255, 0.5) !important;\r\n  color: #3fd8ff !important;\r\n  display: none !important; \/* Hidden on desktop, shown on mobile *\/\r\n}\r\n\r\n.flyox-play-btn:hover,\r\n#fxBtnPlay:hover {\r\n  color: #ffb601 !important;\r\n  border-color: #ffb601 !important;\r\n  background: rgba(255, 182, 1, 0.16) !important;\r\n  box-shadow: 0 0 14px rgba(255, 182, 1, 0.35) !important;\r\n}\r\n\r\n.flyox-btn-hud:hover,\r\n#fxBtnHud:hover {\r\n  color: #fff !important;\r\n  border-color: #3fd8ff !important;\r\n  background: rgba(63, 216, 255, 0.18) !important;\r\n  box-shadow: 0 0 14px rgba(63, 216, 255, 0.35) !important;\r\n}\r\n\r\n.flyox-play-btn:active,\r\n#fxBtnPlay:active,\r\n.flyox-btn-hud:active,\r\n#fxBtnHud:active {\r\n  transform: scale(0.96) !important;\r\n}\r\n\r\n.flyox-hud-ml {\r\n  left: 12px;\r\n  top: 52px;\r\n  width: 205px;\r\n  border-radius: 3px;\r\n  transition: opacity 0.25s ease, transform 0.25s ease;\r\n}\r\n\r\n.flyox-tanks {\r\n  display: flex;\r\n  gap: 12px;\r\n  margin: 9px 0 7px;\r\n}\r\n\r\n.flyox-tank {\r\n  display: flex;\r\n  flex-direction: column;\r\n  align-items: center;\r\n  gap: 3px;\r\n  flex: 1;\r\n}\r\n\r\n.flyox-tbar {\r\n  width: 28px;\r\n  height: 54px;\r\n  border: 1px solid var(--fx-line2);\r\n  position: relative;\r\n  background: rgba(255,255,255,0.03);\r\n  border-radius: 2px;\r\n  overflow: hidden;\r\n}\r\n\r\n.flyox-tbar i {\r\n  position: absolute;\r\n  left: 0;\r\n  right: 0;\r\n  bottom: 0;\r\n  background: linear-gradient(180deg,#00E5FF,#0077B6);\r\n  height: 0%;\r\n  transition: height 0.1s linear;\r\n}\r\n\r\n.flyox-tank em {\r\n  font-style: normal;\r\n  font-size: 8.5px;\r\n  color: var(--fx-dim);\r\n  letter-spacing: 0.1em;\r\n}\r\n\r\n.flyox-tank b {\r\n  font-size: 10px;\r\n}\r\n\r\n.flyox-mtowbar {\r\n  height: 4px;\r\n  background: rgba(255,255,255,0.05);\r\n  border: 1px solid var(--fx-line2);\r\n  margin: 5px 0 4px;\r\n  position: relative;\r\n  border-radius: 1px;\r\n}\r\n\r\n.flyox-mtowbar i {\r\n  position: absolute;\r\n  left: 0;\r\n  top: 0;\r\n  bottom: 0;\r\n  background: var(--fx-gold);\r\n  width: 59%;\r\n}\r\n\r\n.flyox-scoopline {\r\n  margin-top: 7px;\r\n  font-size: 9.5px;\r\n  color: var(--fx-cyan);\r\n  letter-spacing: 0.05em;\r\n  min-height: 14px;\r\n  font-weight: 600;\r\n}\r\n\r\n\/* \u2500\u2500 Sleek Mobile Bottom Telemetry Strip (Zero Obstruction) \u2500\u2500 *\/\r\n.flyox-mobile-strip {\r\n  display: none !important;\r\n  position: absolute !important;\r\n  bottom: 10px !important;\r\n  left: 10px !important;\r\n  right: 10px !important;\r\n  z-index: 12 !important;\r\n  background: rgba(5, 8, 14, 0.88) !important;\r\n  border: 1px solid rgba(110, 130, 160, 0.32) !important;\r\n  backdrop-filter: blur(8px) !important;\r\n  -webkit-backdrop-filter: blur(8px) !important;\r\n  border-radius: 4px !important;\r\n  padding: 6px 12px !important;\r\n  align-items: center !important;\r\n  justify-content: space-between !important;\r\n  font-family: var(--fx-mono) !important;\r\n  font-size: 10px !important;\r\n  color: var(--fx-txt) !important;\r\n  pointer-events: none !important;\r\n  box-shadow: 0 6px 20px rgba(0, 0, 0, 0.65) !important;\r\n}\r\n\r\n.flyox-m-item {\r\n  display: flex !important;\r\n  align-items: center !important;\r\n  gap: 4px !important;\r\n  white-space: nowrap !important;\r\n}\r\n\r\n.flyox-m-lbl {\r\n  color: var(--fx-dim) !important;\r\n  font-size: 8.5px !important;\r\n  letter-spacing: 0.06em !important;\r\n}\r\n\r\n.flyox-m-sep {\r\n  width: 1px !important;\r\n  height: 14px !important;\r\n  background: rgba(255, 255, 255, 0.12) !important;\r\n}\r\n\r\n.flyox-m-status {\r\n  color: var(--fx-cyan) !important;\r\n  font-weight: 700 !important;\r\n}\r\n\r\n.flyox-loader {\r\n  position: absolute;\r\n  inset: 0;\r\n  display: flex;\r\n  align-items: center;\r\n  justify-content: center;\r\n  background: #04060a;\r\n  z-index: 20;\r\n  font-family: var(--fx-mono);\r\n  font-size: 11px;\r\n  letter-spacing: 0.25em;\r\n  color: var(--fx-gold);\r\n  transition: opacity 0.5s;\r\n  text-align: center;\r\n  padding: 20px;\r\n}\r\n\r\n.flyox-loader.off {\r\n  opacity: 0;\r\n  pointer-events: none;\r\n}\r\n\r\n\/* \u2500\u2500 Mobile Responsive Overrides (\u2264 768px) \u2500\u2500 *\/\r\n@media (max-width: 768px) {\r\n  \/* Taller, expansive mobile viewport *\/\r\n  .flyox-viewport {\r\n    height: clamp(480px, 75vh, 640px) !important;\r\n  }\r\n  \r\n  \/* Reposition phase badge to top-left so it doesn't collide with buttons *\/\r\n  .flyox-hud-phase {\r\n    display: block !important;\r\n    top: 10px !important;\r\n    left: 10px !important;\r\n    transform: none !important;\r\n    font-size: 8.5px !important;\r\n    padding: 3px 8px !important;\r\n    letter-spacing: 0.12em !important;\r\n    max-width: 52% !important;\r\n    overflow: hidden !important;\r\n    text-overflow: ellipsis !important;\r\n  }\r\n\r\n  \/* Show HUD toggle button on mobile *\/\r\n  .flyox-btn-hud,\r\n  #fxBtnHud {\r\n    display: flex !important;\r\n  }\r\n\r\n  \/* Show non-intrusive bottom telemetry ribbon *\/\r\n  .flyox-mobile-strip {\r\n    display: flex !important;\r\n  }\r\n\r\n  \/* Hide the large vertical dock by default on mobile so the drone is 100% visible *\/\r\n  .flyox-hud-ml {\r\n    display: none !important;\r\n  }\r\n\r\n  \/* When HUD toggle is active on mobile, display detailed dock as an overlay modal *\/\r\n  .show-mobile-hud .flyox-hud-ml {\r\n    display: block !important;\r\n    position: absolute !important;\r\n    top: 44px !important;\r\n    left: 10px !important;\r\n    right: auto !important;\r\n    width: 220px !important;\r\n    z-index: 25 !important;\r\n    background: rgba(5, 8, 14, 0.95) !important;\r\n    border: 1px solid rgba(255, 182, 1, 0.45) !important;\r\n    box-shadow: 0 12px 36px rgba(0, 0, 0, 0.85) !important;\r\n    pointer-events: auto !important;\r\n  }\r\n}\r\n<\/style>\r\n\r\n<!-- 3. Widget HTML Structure (Mobile-Optimized Clean Viewport) -->\r\n<div class=\"flyox-widget-wrap\" id=\"flyoxWidgetWrap\">\r\n  <div class=\"flyox-viewport\" id=\"flyoxViewport\">\r\n    <canvas id=\"flyoxCanvas\"><\/canvas>\r\n    <div class=\"flyox-corner flyox-c-tl\"><\/div>\r\n    <div class=\"flyox-corner flyox-c-tr\"><\/div>\r\n    <div class=\"flyox-corner flyox-c-bl\"><\/div>\r\n    <div class=\"flyox-corner flyox-c-br\"><\/div>\r\n\r\n    <div class=\"flyox-hud-phase\" id=\"fxHudPhase\">01 \u00b7 ATOL TAKEOFF<\/div>\r\n\r\n    <!-- Floating Top-Right Controls: Mobile HUD Toggle + Pause\/Play -->\r\n    <div class=\"flyox-top-controls\">\r\n      <button class=\"flyox-btn-hud\" id=\"fxBtnHud\" type=\"button\" aria-label=\"Toggle Telemetry Dock\">\r\n        <span id=\"fxHudIcon\">\ud83d\udcca<\/span>\r\n        <span id=\"fxHudText\">HUD<\/span>\r\n      <\/button>\r\n      <button class=\"flyox-play-btn\" id=\"fxBtnPlay\" type=\"button\" aria-label=\"Toggle Play\/Pause\">\r\n        <span id=\"fxPlayIcon\">\u23f8<\/span>\r\n        <span id=\"fxPlayText\">PAUSE<\/span>\r\n      <\/button>\r\n    <\/div>\r\n\r\n    <!-- Cockpit Telemetry Dock (Full view on Desktop, Collapsible Modal on Mobile) -->\r\n    <div class=\"flyox-hud flyox-hud-ml\" id=\"fxHudCockpit\">\r\n      <div class=\"flyox-row\"><span>IAS<\/span><b id=\"fxIas\">0 KT<\/b><\/div>\r\n      <div class=\"flyox-row\"><span>ALT AGL<\/span><b id=\"fxAlt\">0 FT<\/b><\/div>\r\n      <div class=\"flyox-row\"><span>HDG<\/span><b id=\"fxHdg\">360<\/b><\/div>\r\n      <div class=\"flyox-row\"><span>V\/S<\/span><b id=\"fxVs\">+0 FPM<\/b><\/div>\r\n      <div class=\"flyox-tanks\">\r\n        <div class=\"flyox-tank\"><div class=\"flyox-tbar\"><i id=\"fxTanka\"><\/i><\/div><em>TANK A<\/em><b id=\"fxTankav\">0 L<\/b><\/div>\r\n        <div class=\"flyox-tank\"><div class=\"flyox-tbar\"><i id=\"fxTankb\"><\/i><\/div><em>TANK B<\/em><b id=\"fxTankbv\">0 L<\/b><\/div>\r\n      <\/div>\r\n      <div class=\"flyox-row\"><span>GW \/ MTOW<\/span><b id=\"fxGw\">2,380 \/ 4,000 KG<\/b><\/div>\r\n      <div class=\"flyox-mtowbar\"><i id=\"fxGwbar\"><\/i><\/div>\r\n      <div class=\"flyox-row\"><span>FUEL<\/span><b id=\"fxFuel\">540 KG<\/b><\/div>\r\n      <div class=\"flyox-scoopline\" id=\"fxScoop\">VENTRAL DOORS CLOSED<\/div>\r\n    <\/div>\r\n\r\n    <!-- Sleek Mobile Bottom Telemetry Strip (Zero Visual Obstruction of Drone) -->\r\n    <div class=\"flyox-mobile-strip\" id=\"fxMobileStrip\">\r\n      <div class=\"flyox-m-item\"><span class=\"flyox-m-lbl\">IAS<\/span><b id=\"fxMIas\">0 KT<\/b><\/div>\r\n      <div class=\"flyox-m-sep\"><\/div>\r\n      <div class=\"flyox-m-item\"><span class=\"flyox-m-lbl\">ALT<\/span><b id=\"fxMAlt\">0 FT<\/b><\/div>\r\n      <div class=\"flyox-m-sep\"><\/div>\r\n      <div class=\"flyox-m-item\"><span class=\"flyox-m-lbl\">WATER<\/span><b id=\"fxMTank\">0 L<\/b><\/div>\r\n      <div class=\"flyox-m-sep\"><\/div>\r\n      <div class=\"flyox-m-item flyox-m-status\"><b id=\"fxMStatus\">CLOSED<\/b><\/div>\r\n    <\/div>\r\n\r\n    <div class=\"flyox-loader\" id=\"fxLoader\">INITIALIZING 3D FLIGHT SYSTEMS...<\/div>\r\n  <\/div>\r\n<\/div>\r\n\r\n<!-- 4. Self-Contained Isolated JavaScript -->\r\n<script>\r\n(function() {\r\n  \"use strict\";\r\n\r\n  function initFlyox() {\r\n    if (typeof THREE === 'undefined') {\r\n      setTimeout(initFlyox, 100);\r\n      return;\r\n    }\r\n\r\n    var root = document.getElementById('flyoxWidgetWrap');\r\n    if (!root) return;\r\n\r\n    var $ = function(id) { return document.getElementById(id); };\r\n    var clamp = function(v, a, b) { return v < a ? a : v > b ? b : v; };\r\n    var lerp = function(a, b, t) { return a + (b - a) * t; };\r\n    var sstep = function(a, b, x) { var t = clamp((x - a) \/ (b - a), 0, 1); return t * t * (3 - 2 * t); };\r\n    var TAU = Math.PI * 2;\r\n    var angDelta = function(a, b) { var d = (a - b) % TAU; if (d > Math.PI) d -= TAU; if (d < -Math.PI) d += TAU; return d; };\r\n    var V = function(x, y, z) { return new THREE.Vector3(x, y, z); };\r\n\r\n    \/* \u2500\u2500 Deterministic Noise Generator \u2500\u2500 *\/\r\n    var PERM = (function() {\r\n      var p = new Uint8Array(512), a = [];\r\n      for (var i = 0; i < 256; i++) a.push(i);\r\n      var s = 1337;\r\n      var rnd = function() { s = (s * 16807) % 2147483647; return s \/ 2147483647; };\r\n      for (var i = 255; i > 0; i--) { var j = (rnd() * (i + 1)) | 0; var t = a[i]; a[i] = a[j]; a[j] = t; }\r\n      for (var i = 0; i < 512; i++) p[i] = a[i & 255];\r\n      return p;\r\n    })();\r\n\r\n    function vn(x, z) {\r\n      var xi = Math.floor(x), zi = Math.floor(z), xf = x - xi, zf = z - zi;\r\n      var u = xf * xf * (3 - 2 * xf), v = zf * zf * (3 - 2 * zf);\r\n      var h = function(i, k) { return PERM[(PERM[(xi + i) & 255] + ((zi + k) & 255)) & 255] \/ 255; };\r\n      return lerp(lerp(h(0, 0), h(1, 0), u), lerp(h(0, 1), h(1, 1), v), v);\r\n    }\r\n    function fbm(x, z) {\r\n      return 0.5 * vn(x, z) + 0.25 * vn(x * 2.03 + 7.3, z * 2.03 + 3.1) + 0.125 * vn(x * 4.1 + 13, z * 4.1 + 9);\r\n    }\r\n\r\n    \/* \u2500\u2500 World Layout \u2500\u2500 *\/\r\n    var LAKE = { x: -48, z: 18 };\r\n    var lakeR = function(a) { return 26 + Math.sin(a * 3 + 1.7) * 5 + Math.sin(a * 5 + 0.4) * 3; };\r\n    function lakeMask(x, z) {\r\n      var dx = x - LAKE.x, dz = z - LAKE.z, d = Math.hypot(dx, dz), a = Math.atan2(dz, dx);\r\n      return 1 - sstep(lakeR(a) - 2, lakeR(a) + 6, d);\r\n    }\r\n    function rectMask(x, z, cx, cz, hx, hz, m) {\r\n      var dx = Math.max(0, Math.abs(x - cx) - hx), dz = Math.max(0, Math.abs(z - cz) - hz);\r\n      return 1 - sstep(0, m, Math.hypot(dx, dz));\r\n    }\r\n    var stripMask = function(x, z) { return rectMask(x, z, -18, -48, 4.5, 22, 12); };\r\n\r\n    function gh(x, z) {\r\n      var h = fbm(x * 0.02, z * 0.02) * 9 + fbm(x * 0.06 + 37, z * 0.06 + 11) * 2.2 - 3.0;\r\n      h += Math.max(0, x - 35) * 0.12;\r\n      h *= 0.25 + 0.75 * sstep(-25, 40, x);\r\n      var lm = lakeMask(x, z);\r\n      h = h * (1 - lm) - 2.8 * lm;\r\n      return h * (1 - stripMask(x, z));\r\n    }\r\n\r\n    \/* 42 Wildfire Front Cells *\/\r\n    var cells = [];\r\n    for (var gx = 0; gx < 6; gx++) {\r\n      for (var gz = 0; gz < 7; gz++) {\r\n        var u = gx \/ 5, v = gz \/ 6;\r\n        var cx = 20 + u * 36 + Math.sin(v * 3.8 + u * 1.7) * 2.2;\r\n        var cz = 28 - v * 60 + Math.cos(u * 3.2 + v * 2.4) * 2.2;\r\n        cells.push({ x: cx, z: cz, y: gh(cx, cz), i: 1.0, contained: false });\r\n      }\r\n    }\r\n\r\n    \/* \u2500\u2500 Renderer & Camera \u2500\u2500 *\/\r\n    var vp = $('flyoxViewport'), canvas = $('flyoxCanvas');\r\n    var renderer = new THREE.WebGLRenderer({ canvas: canvas, antialias: true, alpha: false });\r\n    renderer.setPixelRatio(Math.min(window.devicePixelRatio || 1, 2));\r\n    renderer.shadowMap.enabled = true;\r\n    renderer.shadowMap.type = THREE.PCFSoftShadowMap;\r\n    renderer.toneMapping = THREE.ACESFilmicToneMapping;\r\n    renderer.toneMappingExposure = 1.0;\r\n\r\n    var scene = new THREE.Scene();\r\n    scene.fog = new THREE.Fog(0x223850, 110, 380);\r\n\r\n    var camera = new THREE.PerspectiveCamera(44, 1, 0.1, 800);\r\n    camera.position.set(-40, 6, -80);\r\n\r\n    function resize() {\r\n      if (!vp) return;\r\n      var w = vp.clientWidth || 800, h = vp.clientHeight || 450;\r\n      renderer.setSize(w, h, false);\r\n      camera.aspect = w \/ h;\r\n      camera.updateProjectionMatrix();\r\n    }\r\n    window.addEventListener('resize', resize);\r\n    if (window.ResizeObserver) {\r\n      new ResizeObserver(resize).observe(vp);\r\n    }\r\n    resize();\r\n\r\n    \/* \u2500\u2500 Lights \u2500\u2500 *\/\r\n    var hemi = new THREE.HemisphereLight(0xb2d5f8, 0x243224, 0.95);\r\n    scene.add(hemi);\r\n\r\n    var sun = new THREE.DirectionalLight(0xfffaed, 2.2);\r\n    sun.castShadow = true;\r\n    sun.shadow.mapSize.set(1024, 1024);\r\n    sun.shadow.camera.left = -55; sun.shadow.camera.right = 55;\r\n    sun.shadow.camera.top = 55; sun.shadow.camera.bottom = -55;\r\n    sun.shadow.camera.near = 15; sun.shadow.camera.far = 300;\r\n    sun.shadow.bias = -0.0005;\r\n    sun.position.set(60, 110, 50);\r\n    scene.add(sun);\r\n    scene.add(sun.target);\r\n\r\n    var fireL = [\r\n      { pos: V(24, gh(24, 22) + 2.5, 22), L: new THREE.PointLight(0xff3a00, 0, 42, 2.0) },\r\n      { pos: V(32, gh(32, 10) + 2.5, 10), L: new THREE.PointLight(0xff2a00, 0, 44, 2.0) },\r\n      { pos: V(40, gh(40, -4) + 2.5, -4), L: new THREE.PointLight(0xff2200, 0, 46, 2.0) },\r\n      { pos: V(48, gh(48, -18) + 2.5, -18), L: new THREE.PointLight(0xff2a00, 0, 44, 2.0) },\r\n      { pos: V(54, gh(54, -28) + 2.5, -28), L: new THREE.PointLight(0xff3a00, 0, 42, 2.0) }\r\n    ];\r\n    fireL.forEach(function(fl) { fl.L.position.copy(fl.pos); scene.add(fl.L); });\r\n\r\n    \/* \u2500\u2500 Sky & Celestial \u2500\u2500 *\/\r\n    var skyU = {\r\n      uZen: { value: new THREE.Color(0x1a5494) },\r\n      uHor: { value: new THREE.Color(0x7da8cf) },\r\n      uSunC: { value: new THREE.Color(0xfff5db) },\r\n      uSunD: { value: V(0.4, 0.8, 0.3).normalize() },\r\n      uGlow: { value: 1.2 }\r\n    };\r\n    var skyGeo = new THREE.SphereGeometry(420, 32, 16);\r\n    var skyMat = new THREE.ShaderMaterial({\r\n      side: THREE.BackSide, depthWrite: false, fog: false, uniforms: skyU,\r\n      vertexShader: 'varying vec3 vD;void main(){vD=normalize(position);gl_Position=projectionMatrix*modelViewMatrix*vec4(position,1.);}',\r\n      fragmentShader: 'varying vec3 vD;uniform vec3 uZen,uHor,uSunC,uSunD;uniform float uGlow;void main(){float h=clamp(vD.y,0.,1.);vec3 c=mix(uHor,uZen,pow(h,.6));float d=max(dot(normalize(vD),normalize(uSunD)),0.);c+=uSunC*pow(d,6.)*uGlow*.4;c+=uSunC*pow(d,80.)*uGlow;gl_FragColor=vec4(c,1.);}'\r\n    });\r\n    scene.add(new THREE.Mesh(skyGeo, skyMat));\r\n\r\n    var sunDisc = new THREE.Mesh(new THREE.SphereGeometry(9, 16, 12), new THREE.MeshBasicMaterial({ color: 0xfff2ce, fog: false }));\r\n    sunDisc.position.set(120, 240, 90);\r\n    scene.add(sunDisc);\r\n\r\n    var PAL_DAY = { zen: new THREE.Color(0x1a5494), hor: new THREE.Color(0x7da8cf), sunC: new THREE.Color(0xfff5db), hemiC: new THREE.Color(0xb2d5f8), fog: new THREE.Color(0x20354c), sunI: 2.2, hemiI: 0.95, exposure: 1.05 };\r\n    var PAL_NIGHT = { zen: new THREE.Color(0x02060e), hor: new THREE.Color(0x06111f), sunC: new THREE.Color(0x2a4460), hemiC: new THREE.Color(0x091422), fog: new THREE.Color(0x040812), sunI: 0.22, hemiI: 0.22, exposure: 0.82 };\r\n\r\n    \/* \u2500\u2500 Terrain \u2500\u2500 *\/\r\n    var terrGeo = new THREE.PlaneGeometry(280, 280, 100, 100);\r\n    terrGeo.rotateX(-Math.PI \/ 2);\r\n    var terrPos = terrGeo.attributes.position, terrCol = new Float32Array(terrPos.count * 3);\r\n    for (var i = 0; i < terrPos.count; i++) {\r\n      var x = terrPos.getX(i), z = terrPos.getZ(i), h = gh(x, z);\r\n      terrPos.setY(i, h);\r\n      var n1 = fbm(x * 0.05 + 50, z * 0.05 + 50);\r\n      var r = lerp(0.09, 0.16, n1), gg = lerp(0.16, 0.24, n1), b = lerp(0.08, 0.14, n1);\r\n      var rk = sstep(4.5, 8, h); r = lerp(r, 0.22, rk); gg = lerp(gg, 0.23, rk); b = lerp(b, 0.25, rk);\r\n      var fireDist = Math.hypot(x - 40, z + 2);\r\n      if (fireDist < 40) {\r\n        var scorch = 1 - sstep(8, 40, fireDist);\r\n        r = lerp(r, 0.035, scorch); gg = lerp(gg, 0.03, scorch); b = lerp(b, 0.03, scorch);\r\n      }\r\n      var lm = lakeMask(x, z); r = lerp(r, 0.02, lm); gg = lerp(gg, 0.32, lm); b = lerp(b, 0.65, lm);\r\n      var sm = stripMask(x, z); r = lerp(r, 0.18, sm); gg = lerp(gg, 0.18, sm); b = lerp(b, 0.20, sm);\r\n      terrCol[i * 3] = r; terrCol[i * 3 + 1] = gg; terrCol[i * 3 + 2] = b;\r\n    }\r\n    terrGeo.setAttribute('color', new THREE.BufferAttribute(terrCol, 3));\r\n    terrGeo.computeVertexNormals();\r\n    var terrMesh = new THREE.Mesh(terrGeo, new THREE.MeshStandardMaterial({ vertexColors: true, roughness: 0.92 }));\r\n    terrMesh.receiveShadow = true;\r\n    scene.add(terrMesh);\r\n\r\n    \/* \u2500\u2500 Lake Water \u2500\u2500 *\/\r\n    var waterU = {\r\n      t: { value: 0 }, uSun: { value: V(0.4, 0.8, 0.3).normalize() }, uSunC: { value: new THREE.Color(1, 1, 1) },\r\n      uSky: { value: new THREE.Color(0.25, 0.72, 0.98) }, uDeep: { value: new THREE.Color(0.01, 0.32, 0.75) }\r\n    };\r\n    var seg = 90, wp = [LAKE.x, 0, LAKE.z], wi = [];\r\n    for (var i = 0; i <= seg; i++) {\r\n      var a = (i \/ seg) * TAU, r = lakeR(a) + 2.0;\r\n      wp.push(LAKE.x + Math.cos(a) * r, 0, LAKE.z + Math.sin(a) * r);\r\n    }\r\n    for (var i = 1; i <= seg; i++) wi.push(0, i + 1, i);\r\n    var waterGeo = new THREE.BufferGeometry();\r\n    waterGeo.setAttribute('position', new THREE.Float32BufferAttribute(wp, 3));\r\n    waterGeo.setIndex(wi); waterGeo.computeVertexNormals();\r\n    var waterMat = new THREE.ShaderMaterial({\r\n      transparent: true, side: THREE.DoubleSide, uniforms: waterU,\r\n      vertexShader: 'varying vec3 vW;void main(){vW=(modelMatrix*vec4(position,1.)).xyz;gl_Position=projectionMatrix*modelViewMatrix*vec4(position,1.);}',\r\n      fragmentShader: 'varying vec3 vW;uniform float t;uniform vec3 uSun,uSunC,uSky,uDeep;void main(){vec3 n=normalize(vec3(sin(vW.x*.8+t*1.8)*.06+sin(vW.z*1.4+t*1.2)*.05,1.,sin(vW.z*.9-t*1.5)*.06+sin(vW.x*1.8+t)*.04));vec3 Vv=normalize(cameraPosition-vW);float fr=pow(1.-max(dot(n,Vv),0.),2.2);float sp=pow(max(dot(reflect(-normalize(uSun),n),Vv),0.),90.);vec3 c=mix(uDeep,uSky,fr*.85)+uSunC*sp*1.8;gl_FragColor=vec4(c,.95);}'\r\n    });\r\n    var waterMesh = new THREE.Mesh(waterGeo, waterMat);\r\n    waterMesh.position.y = 0.05; scene.add(waterMesh);\r\n\r\n    \/* \u2500\u2500 Runway Strip \u2500\u2500 *\/\r\n    function stripTexture() {\r\n      var c = document.createElement('canvas'); c.width = 256; c.height = 1024; var x = c.getContext('2d');\r\n      x.fillStyle = '#2c3036'; x.fillRect(0, 0, 256, 1024);\r\n      for (var i = 0; i < 2200; i++) {\r\n        var g = (20 + Math.random() * 45) | 0;\r\n        x.fillStyle = 'rgba(' + g + ',' + g + ',' + g + ',.5)';\r\n        x.fillRect(Math.random() * 256, Math.random() * 1024, 2, 2);\r\n      }\r\n      x.fillStyle = 'rgba(230,235,240,.75)';\r\n      for (var y = 40; y < 1000; y += 64) x.fillRect(124, y, 8, 34);\r\n      return new THREE.CanvasTexture(c);\r\n    }\r\n    var stripMesh = new THREE.Mesh(new THREE.PlaneGeometry(9, 44), new THREE.MeshStandardMaterial({ map: stripTexture(), roughness: 0.95 }));\r\n    stripMesh.rotation.x = -Math.PI \/ 2; stripMesh.position.set(-18, 0.03, -48); stripMesh.receiveShadow = true; scene.add(stripMesh);\r\n\r\n    \/* \u2500\u2500 GCS Station \u2500\u2500 *\/\r\n    var gcsBeacon, sockG;\r\n    var gcs = new THREE.Group(); gcs.position.set(-28, gh(-28, -36), -36); scene.add(gcs);\r\n    var tr = new THREE.Mesh(new THREE.BoxGeometry(2.4, 1.4, 1.6), new THREE.MeshStandardMaterial({ color: 0xc8d0d8, roughness: 0.5 }));\r\n    tr.position.y = 0.7; tr.castShadow = true; gcs.add(tr);\r\n    var mast = new THREE.Mesh(new THREE.CylinderGeometry(0.05, 0.05, 5.5, 8), new THREE.MeshStandardMaterial({ color: 0x7b8390, roughness: 0.4 }));\r\n    mast.position.set(-1.5, 2.75, 0); gcs.add(mast);\r\n    var dish = new THREE.Mesh(new THREE.SphereGeometry(0.42, 12, 8, 0, TAU, 0, Math.PI \/ 2.4), new THREE.MeshStandardMaterial({ color: 0xdde2e8, roughness: 0.4, side: THREE.DoubleSide }));\r\n    dish.position.set(-1.5, 4.3, 0); dish.rotation.x = -0.6; gcs.add(dish);\r\n    gcsBeacon = new THREE.Mesh(new THREE.SphereGeometry(0.09, 8, 6), new THREE.MeshBasicMaterial({ color: 0xff2200 }));\r\n    gcsBeacon.position.set(-1.5, 5.55, 0); gcs.add(gcsBeacon);\r\n    var pole = new THREE.Mesh(new THREE.CylinderGeometry(0.03, 0.03, 3.4, 6), new THREE.MeshStandardMaterial({ color: 0xa0a8b4, roughness: 0.5 }));\r\n    pole.position.set(-3.0, 1.7, 2.2); gcs.add(pole);\r\n    sockG = new THREE.Group(); sockG.position.set(-3.0, 3.3, 2.2); gcs.add(sockG);\r\n    var sock = new THREE.Mesh(new THREE.ConeGeometry(0.2, 1.4, 8, 1, true), new THREE.MeshStandardMaterial({ color: 0xff6600, roughness: 0.8, side: THREE.DoubleSide }));\r\n    sock.rotation.z = Math.PI \/ 2; sock.position.x = 0.7; sockG.add(sock);\r\n\r\n    \/* \u2500\u2500 Instanced Trees \u2500\u2500 *\/\r\n    var trees = [], tmpC = new THREE.Color();\r\n    var tries = 0;\r\n    while (trees.length < 380 && tries < 5000) {\r\n      tries++;\r\n      var fz = Math.random() < 0.65;\r\n      var x = fz ? (18 + Math.random() * 40) : (-80 + Math.random() * 75);\r\n      var z = fz ? (-34 + Math.random() * 64) : (-80 + Math.random() * 160);\r\n      if (lakeMask(x, z) > 0.03 || stripMask(x, z) > 0.03) continue;\r\n      var y = gh(x, z); if (y < -0.4 || y > 7.5) continue;\r\n      if (Math.hypot(x + 28, z + 36) < 8) continue;\r\n      \r\n      var inFireZone = (x >= 18 && x <= 58 && z >= -34 && z <= 30);\r\n      var cell = -1;\r\n      if (inFireZone) {\r\n        var minD = 999;\r\n        for (var c = 0; c < cells.length; c++) {\r\n          var d = Math.hypot(x - cells[c].x, z - cells[c].z);\r\n          if (d < minD) { minD = d; cell = c; }\r\n        }\r\n        if (minD > 12.0) cell = -1;\r\n      }\r\n      \r\n      var isAblaze = (inFireZone && Math.random() < 0.92);\r\n      var bCr = 0.04 + Math.random() * 0.04;\r\n      var bCg = 0.14 + Math.random() * 0.08;\r\n      var bCb = 0.06 + Math.random() * 0.04;\r\n      var cr = isAblaze ? 0.44 : bCr, cg = isAblaze ? 0.18 : bCg, cb = isAblaze ? 0.035 : bCb;\r\n      \r\n      trees.push({\r\n        x: x, y: y, z: z, cell: cell, state: isAblaze ? 1 : 0, bt: 0,\r\n        cr: cr, cg: cg, cb: cb, baseCr: bCr, baseCg: bCg, baseCb: bCb\r\n      });\r\n    }\r\n\r\n    var trunkIM = new THREE.InstancedMesh(new THREE.CylinderGeometry(0.14, 0.2, 1, 5), new THREE.MeshStandardMaterial({ color: 0x22180f, roughness: 0.95 }), trees.length);\r\n    var canIM = new THREE.InstancedMesh(new THREE.ConeGeometry(1, 1, 6), new THREE.MeshStandardMaterial({ color: 0xffffff, roughness: 0.88 }), trees.length);\r\n    var dum = new THREE.Object3D();\r\n    trees.forEach(function(t, i) {\r\n      var h = 2.2 * Math.sqrt(t.cell >= 0 ? 1.6 : 1) + 1.2; t.h = h;\r\n      dum.position.set(t.x, t.y + h * 0.3, t.z); dum.scale.set(1, h * 0.6, 1); dum.rotation.y = t.x * 7; dum.updateMatrix(); trunkIM.setMatrixAt(i, dum.matrix);\r\n      dum.position.set(t.x, t.y + h * 0.3 + h * 0.55, t.z); dum.scale.set(1.1, h * 0.95, 1.1); dum.updateMatrix(); canIM.setMatrixAt(i, dum.matrix);\r\n      canIM.setColorAt(i, tmpC.setRGB(t.cr, t.cg, t.cb));\r\n    });\r\n    trunkIM.castShadow = canIM.castShadow = true; canIM.receiveShadow = true;\r\n    scene.add(trunkIM); scene.add(canIM);\r\n\r\n    \/* \u2500\u2500 Overlays \u2500\u2500 *\/\r\n    var firePts = [];\r\n    for (var i = 0; i <= 40; i++) {\r\n      var a = i \/ 40; var x = 24 + 28 * a + Math.sin(a * 5.0 + 1.2) * 2.5, z = 28 - 60 * a + Math.cos(a * 3.5) * 2.5;\r\n      firePts.push(V(x, gh(x, z) + 0.6, z));\r\n    }\r\n    var perimLine = new THREE.Line(new THREE.BufferGeometry().setFromPoints(firePts), new THREE.LineBasicMaterial({ color: 0xff3b14, transparent: true, opacity: 0.7 }));\r\n    perimLine.geometry.setDrawRange(0, 0); scene.add(perimLine);\r\n\r\n    var solPts = [];\r\n    for (var i = 0; i <= 30; i++) {\r\n      var a = i \/ 30, x = lerp(26, 48, a), z = lerp(26, -30, a); solPts.push(V(x, gh(x, z) + 0.45, z));\r\n    }\r\n    var solLine = new THREE.Line(new THREE.BufferGeometry().setFromPoints(solPts), new THREE.LineDashedMaterial({ color: 0x3fd8ff, dashSize: 1.4, gapSize: 1, transparent: true, opacity: 0 }));\r\n    solLine.computeLineDistances(); scene.add(solLine);\r\n\r\n    \/* \u2500\u2500 Particle Engine \u2500\u2500 *\/\r\n    function softTex() {\r\n      var c = document.createElement('canvas'); c.width = c.height = 64; var x = c.getContext('2d');\r\n      var g = x.createRadialGradient(32, 32, 2, 32, 32, 30);\r\n      g.addColorStop(0, 'rgba(255,255,255,1)'); g.addColorStop(0.5, 'rgba(255,255,255,.5)'); g.addColorStop(1, 'rgba(255,255,255,0)');\r\n      x.fillStyle = g; x.fillRect(0, 0, 64, 64); return new THREE.CanvasTexture(c);\r\n    }\r\n    var SOFT = softTex();\r\n\r\n    function makeParts(n, size, opts) {\r\n      opts = opts || {};\r\n      var pos = new Float32Array(n * 3), col = new Float32Array(n * 3), vel = new Float32Array(n * 3),\r\n          life = new Float32Array(n), maxL = new Float32Array(n), base = new Float32Array(n * 3);\r\n      for (var i = 0; i < n; i++) pos[i * 3 + 1] = -999;\r\n      var g = new THREE.BufferGeometry();\r\n      g.setAttribute('position', new THREE.BufferAttribute(pos, 3));\r\n      g.setAttribute('color', new THREE.BufferAttribute(col, 3));\r\n      var m = new THREE.PointsMaterial({\r\n        size: size, vertexColors: true, transparent: true, depthWrite: false, map: SOFT,\r\n        blending: opts.add ? THREE.AdditiveBlending : THREE.NormalBlending, opacity: opts.op !== undefined ? opts.op : 1\r\n      });\r\n      var pts = new THREE.Points(g, m); pts.frustumCulled = false; scene.add(pts);\r\n      var idx = 0;\r\n      return {\r\n        spawn: function(x, y, z, vx, vy, vz, L, r, gr, b) {\r\n          var i = idx; idx = (idx + 1) % n;\r\n          pos[i * 3] = x; pos[i * 3 + 1] = y; pos[i * 3 + 2] = z; vel[i * 3] = vx; vel[i * 3 + 1] = vy; vel[i * 3 + 2] = vz;\r\n          life[i] = L; maxL[i] = L; base[i * 3] = r; base[i * 3 + 1] = gr; base[i * 3 + 2] = b;\r\n          col[i * 3] = r; col[i * 3 + 1] = gr; col[i * 3 + 2] = b;\r\n        },\r\n        step: function(dt, grav, drag, groundFn) {\r\n          for (var i = 0; i < n; i++) {\r\n            if (life[i] <= 0) continue;\r\n            life[i] -= dt;\r\n            if (life[i] <= 0) { pos[i * 3 + 1] = -999; continue; }\r\n            vel[i * 3 + 1] -= grav * dt;\r\n            if (drag) { var d = Math.max(0, 1 - drag * dt); vel[i * 3] *= d; vel[i * 3 + 1] *= Math.max(0, 1 - (drag * 0.45) * dt); vel[i * 3 + 2] *= d; }\r\n            pos[i * 3] += vel[i * 3] * dt; pos[i * 3 + 1] += vel[i * 3 + 1] * dt; pos[i * 3 + 2] += vel[i * 3 + 2] * dt;\r\n            if (groundFn && groundFn(i, pos, life)) continue;\r\n            var f = life[i] \/ maxL[i];\r\n            if (opts.add) {\r\n              col[i * 3] = base[i * 3] * f; col[i * 3 + 1] = base[i * 3 + 1] * f; col[i * 3 + 2] = base[i * 3 + 2] * f;\r\n            } else {\r\n              col[i * 3] = base[i * 3]; col[i * 3 + 1] = base[i * 3 + 1]; col[i * 3 + 2] = base[i * 3 + 2];\r\n            }\r\n          }\r\n          g.attributes.position.needsUpdate = true; g.attributes.color.needsUpdate = true;\r\n        }\r\n      };\r\n    }\r\n\r\n    var embers = makeParts(1200, 0.85, { add: true });\r\n    var flames = makeParts(750, 4.8, { add: true });\r\n    var smoke = makeParts(900, 11.5, { op: 0.60, add: true });\r\n    var spray = makeParts(1200, 0.85, { add: true });\r\n    var waterDrop = makeParts(8000, 2.2, { add: true, op: 0.95 }); \/\/ Unified diagonal aerodynamic water salvo\r\n    var puff = makeParts(1200, 4.5, { op: 0.92, add: true });\r\n\r\n    var stainGeo = new THREE.CircleGeometry(1, 16); stainGeo.rotateX(-Math.PI \/ 2);\r\n    function makePool(n, color, baseOp) {\r\n      var arr = [];\r\n      for (var i = 0; i < n; i++) {\r\n        var m = new THREE.Mesh(stainGeo, new THREE.MeshBasicMaterial({ color: color, transparent: true, opacity: 0, depthWrite: false }));\r\n        m.visible = false; m.renderOrder = 2; scene.add(m); arr.push({ m: m, op: baseOp, t: 0, fade: 0 });\r\n      }\r\n      var idx = 0;\r\n      return {\r\n        drop: function(x, z, r, fade) {\r\n          var s = arr[idx]; idx = (idx + 1) % n; s.m.visible = true;\r\n          s.m.position.set(x, 0.052 + idx * 0.0003, z); s.m.scale.setScalar(r); s.fade = fade; s.t = 0; s.m.material.opacity = s.op;\r\n        },\r\n        step: function(dt) {\r\n          for (var i = 0; i < arr.length; i++) {\r\n            var s = arr[i];\r\n            if (!s.m.visible) continue;\r\n            if (s.fade > 0) { s.t += dt; if (s.t >= s.fade) { s.m.visible = false; continue; } s.m.material.opacity = s.op * (1 - s.t \/ s.fade); }\r\n          }\r\n        },\r\n        clear: function() { for (var i = 0; i < arr.length; i++) arr[i].m.visible = false; }\r\n      };\r\n    }\r\n    var foamPool = makePool(96, 0xdcf2ff, 0.75);\r\n    var wetPool = makePool(550, 0x0a141e, 0.85);\r\n\r\n    \/* \u2500\u2500 FLYOX 1 Aircraft Group \u2500\u2500 *\/\r\n    var AC = new THREE.Group(); AC.rotation.order = 'YXZ'; scene.add(AC);\r\n    var droneRoot = new THREE.Group();\r\n    var SCALE_FAC = 1.91;\r\n    droneRoot.scale.set(SCALE_FAC, SCALE_FAC, SCALE_FAC);\r\n    droneRoot.position.set(0, -1.48, 0);\r\n    AC.add(droneRoot);\r\n\r\n    var M = {\r\n      whiteBody:     new THREE.MeshStandardMaterial({ color: 0xfafcff, roughness: 0.32, metalness: 0.08, side: THREE.DoubleSide }),\r\n      redKeel:       new THREE.MeshStandardMaterial({ color: 0xdf1622, roughness: 0.28, metalness: 0.12, side: THREE.DoubleSide }),\r\n      redMetallic:   new THREE.MeshStandardMaterial({ color: 0xb91c1c, roughness: 0.20, metalness: 0.80 }),\r\n      hazardGold:    new THREE.MeshStandardMaterial({ color: 0xffb601, roughness: 0.22, metalness: 0.35, side: THREE.DoubleSide }),\r\n      titaniumLining:new THREE.MeshStandardMaterial({ color: 0xe2e8f0, roughness: 0.18, metalness: 0.85, side: THREE.DoubleSide }),\r\n      darkHullLines: new THREE.MeshStandardMaterial({ color: 0x121720, roughness: 0.65 }),\r\n      glassWindow:   new THREE.MeshStandardMaterial({ color: 0x0f172a, roughness: 0.10, metalness: 0.90 }),\r\n      metalParts:    new THREE.MeshStandardMaterial({ color: 0x828b96, roughness: 0.25, metalness: 0.75 }),\r\n      propCarbon:    new THREE.MeshStandardMaterial({ color: 0x14161a, roughness: 0.30, metalness: 0.25, side: THREE.DoubleSide }),\r\n      propWhiteTip:  new THREE.MeshStandardMaterial({ color: 0xf8fafc, roughness: 0.35, side: THREE.DoubleSide }),\r\n      tireRubber:    new THREE.MeshStandardMaterial({ color: 0x121417, roughness: 0.90 }),\r\n      wheelRim:      new THREE.MeshStandardMaterial({ color: 0xcdd5df, roughness: 0.25, metalness: 0.65 })\r\n    };\r\n\r\n    function toThree(x, y, z) { return new THREE.Vector3(y, z, -(x - 3.6)); }\r\n    function registerMesh(mesh, mat, parent) {\r\n      mesh.castShadow = true; mesh.receiveShadow = true;\r\n      if (mat) mesh.material = mat;\r\n      (parent || droneRoot).add(mesh); return mesh;\r\n    }\r\n    function createBox(x, y, z, wx, wy, wz, mat, parent) {\r\n      var m = new THREE.Mesh(new THREE.BoxGeometry(wy, wz, wx));\r\n      m.position.copy(toThree(x, y, z)); return registerMesh(m, mat || M.whiteBody, parent);\r\n    }\r\n    function createStrut(p1, p2, radius, material, parent) {\r\n      var pt1 = toThree(p1[0], p1[1], p1[2]), pt2 = toThree(p2[0], p2[1], p2[2]);\r\n      var dir = new THREE.Vector3().subVectors(pt2, pt1), len = dir.length();\r\n      var s = new THREE.Mesh(new THREE.CylinderGeometry(radius || 0.035, radius || 0.035, len, 12));\r\n      s.position.copy(pt1).addScaledVector(dir, 0.5);\r\n      s.quaternion.setFromUnitVectors(new THREE.Vector3(0, 1, 0), dir.normalize());\r\n      return registerMesh(s, material || M.whiteBody, parent);\r\n    }\r\n\r\n    \/* Fuselage Lofting *\/\r\n    function getFuselageStation(x) {\r\n      var w = 0.60, zd = 1.70, zc = 0.80, zb = 0.55;\r\n      if (x < 0.95) {\r\n        var t = x \/ 0.95; w = 0.10 + 0.48 * Math.pow(t, 0.7); zd = 1.15 + 0.55 * Math.pow(t, 0.8); zc = 0.98 - 0.18 * t; zb = 0.95 - 0.38 * t;\r\n      } else if (x <= 2.45) {\r\n        w = 0.60; zd = 1.70; zc = 0.80; zb = 0.55;\r\n      } else {\r\n        var t = (x - 2.45) \/ (7.25 - 2.45); w = 0.58 * (1 - 0.90 * t); zd = 1.70; zc = 0.80 + 0.76 * t; zb = 0.55 + 0.99 * t;\r\n      }\r\n      return { x: x, w: w, zd: zd, zc: zc, zb: zb };\r\n    }\r\n\r\n    var numFuseStations = 38, fuseLoops = [];\r\n    for (var i = 0; i <= numFuseStations; i++) {\r\n      var x = 0.15 + (7.25 - 0.15) * (i \/ numFuseStations);\r\n      var st = getFuselageStation(x), w = st.w, zd = st.zd, zc = st.zc, zb = st.zb;\r\n      fuseLoops.push([\r\n        [x, -w, zd], [x, -w, zd - (zd - zc) * 0.33], [x, -w, zd - (zd - zc) * 0.66], [x, -w, zc],\r\n        [x, -0.75 * w, zb + (zc - zb) * 0.65], [x, -0.40 * w, zb + (zc - zb) * 0.30], [x, 0, zb],\r\n        [x, 0.40 * w, zb + (zc - zb) * 0.30], [x, 0.75 * w, zb + (zc - zb) * 0.65], [x, w, zc],\r\n        [x, w, zd - (zd - zc) * 0.66], [x, w, zd - (zd - zc) * 0.33], [x, w, zd], [x, 0.66 * w, zd],\r\n        [x, 0.33 * w, zd], [x, 0, zd], [x, -0.33 * w, zd], [x, -0.66 * w, zd]\r\n      ]);\r\n    }\r\n\r\n    var fuseVerts = [], upperInds = [], keelInds = [];\r\n    for (var s = 0; s < fuseLoops.length; s++) {\r\n      for (var p = 0; p < fuseLoops[s].length; p++) {\r\n        var v = toThree(fuseLoops[s][p][0], fuseLoops[s][p][1], fuseLoops[s][p][2]); fuseVerts.push(v.x, v.y, v.z);\r\n      }\r\n    }\r\n    var numPtsPerLoop = 18;\r\n    for (var s = 0; s < fuseLoops.length - 1; s++) {\r\n      var r0 = s * numPtsPerLoop, r1 = (s + 1) * numPtsPerLoop;\r\n      for (var i = 0; i < numPtsPerLoop; i++) {\r\n        var iNext = (i + 1) % numPtsPerLoop, a = r0 + i, b = r0 + iNext, c = r1 + i, d = r1 + iNext;\r\n        if (i >= 3 && i <= 8) keelInds.push(a, b, d, a, d, c); else upperInds.push(a, b, d, a, d, c);\r\n      }\r\n    }\r\n    var bowV = toThree(0.0, 0.0, 1.02), bowIdx = fuseVerts.length \/ 3;\r\n    fuseVerts.push(bowV.x, bowV.y, bowV.z);\r\n    for (var i = 0; i < numPtsPerLoop; i++) {\r\n      var iNext = (i + 1) % numPtsPerLoop;\r\n      if (i >= 3 && i <= 8) keelInds.push(bowIdx, i, iNext); else upperInds.push(bowIdx, i, iNext);\r\n    }\r\n\r\n    var upperGeom = new THREE.BufferGeometry(); upperGeom.setAttribute('position', new THREE.Float32BufferAttribute(fuseVerts, 3)); upperGeom.setIndex(upperInds); upperGeom.computeVertexNormals(); registerMesh(new THREE.Mesh(upperGeom), M.whiteBody);\r\n    var keelGeom = new THREE.BufferGeometry(); keelGeom.setAttribute('position', new THREE.Float32BufferAttribute(fuseVerts, 3)); keelGeom.setIndex(keelInds); keelGeom.computeVertexNormals(); registerMesh(new THREE.Mesh(keelGeom), M.redKeel);\r\n    var coneGeom = new THREE.ConeGeometry(0.09, 0.24, 16); coneGeom.rotateX(-Math.PI \/ 2); var coneMesh = new THREE.Mesh(coneGeom); coneMesh.position.copy(toThree(7.37, 0, 1.62)); registerMesh(coneMesh, M.whiteBody);\r\n\r\n    \/* Windows & Decals *\/\r\n    var win = createBox(0.70, 0, 1.50, 0.30, 0.44, 0.02, M.glassWindow); win.rotation.x = -0.45;\r\n    createBox(0.425, 0, 1.36, 0.15, 0.12, 0.04, M.whiteBody);\r\n    createBox(0.35, 0, 1.36, 0.02, 0.10, 0.03, M.darkHullLines);\r\n\r\n    [-1, 1].forEach(function(s) {\r\n      createBox(0.80, s * 0.46, 1.15, 0.24, 0.02, 0.40, M.glassWindow);\r\n      for (var l = 0; l < 7; l++) createBox(0.96 + l * 0.045, s * 0.525, 1.15, 0.02, 0.015, 0.38, M.darkHullLines);\r\n      createBox(1.11, s * 0.525, 1.15, 0.30, 0.02, 0.40, M.glassWindow);\r\n      createBox(1.95, s * 0.605, 1.15, 0.98, 0.015, 0.88, M.darkHullLines);\r\n      createBox(2.42, s * 0.61, 1.20, 0.05, 0.02, 0.10, M.metalParts);\r\n      createBox(2.875, s * 0.545, 1.435, 0.24, 0.015, 0.22, M.darkHullLines);\r\n    });\r\n\r\n    createStrut([4.20, 0, 1.70], [4.20, 0, 2.05], 0.012, M.metalParts);\r\n    createBox(5.075, 0, 1.74, 0.18, 0.08, 0.08, M.metalParts);\r\n    createBox(6.15, 0, 1.82, 0.18, 0.02, 0.25, M.metalParts);\r\n    createBox(5.45, 0, 1.74, 0.30, 0.07, 0.08, M.whiteBody);\r\n    createBox(5.85, 0, 1.705, 0.10, 0.10, 0.01, M.metalParts);\r\n\r\n    function decalTex(flip) {\r\n      var c = document.createElement('canvas'); c.width = 512; c.height = 128; var x = c.getContext('2d');\r\n      x.fillStyle = '#202b38'; x.font = '700 62px \"Chakra Petch\",Arial'; x.fillText('FLYOX 1', 18, 58);\r\n      x.font = '500 24px \"JetBrains Mono\",monospace'; x.fillStyle = '#5b6779'; x.fillText('VOLATUS AEROSPACE \u00b7 C-FVOX', 20, 102);\r\n      var t = new THREE.CanvasTexture(c); if (flip) { t.wrapS = THREE.RepeatWrapping; t.repeat.x = -1; } return t;\r\n    }\r\n    [-1, 1].forEach(function(s) {\r\n      var d = new THREE.Mesh(new THREE.PlaneGeometry(1.6, 0.42), new THREE.MeshBasicMaterial({ map: decalTex(s < 0), transparent: true, side: THREE.DoubleSide }));\r\n      d.position.copy(toThree(2.0, s * 0.612, 1.25)); d.rotation.y = (s * Math.PI) \/ 2; droneRoot.add(d);\r\n    });\r\n\r\n    \/* V-Tail *\/\r\n    var tailSpan = 1.65, tailRootX = 5.95, tailTipX = 6.95, tailChordRoot = 1.10, tailDihedralAngle = 0.72;\r\n    [-1, 1].forEach(function(side) {\r\n      var sinD = Math.sin(tailDihedralAngle), cosD = Math.cos(tailDihedralAngle) * side;\r\n      var numRibs = 14, verts = [], inds = [];\r\n      for (var r = 0; r <= numRibs; r++) {\r\n        var t = r \/ numRibs, ribSpan = t * tailSpan, yPos = ribSpan * cosD, zPos = 1.70 + ribSpan * sinD;\r\n        var xLE = tailRootX + t * (tailTipX - tailRootX), chord = tailChordRoot * (1 - t * 0.40), maxThick = chord * 0.12;\r\n        var pts = [\r\n          [xLE, yPos, zPos], [xLE + chord * 0.08, yPos, zPos + maxThick * 0.42 * cosD],\r\n          [xLE + chord * 0.18, yPos, zPos + maxThick * 0.50 * cosD], [xLE + chord * 0.32, yPos, zPos + maxThick * 0.50 * cosD],\r\n          [xLE + chord * 0.52, yPos, zPos + maxThick * 0.40 * cosD], [xLE + chord * 0.74, yPos, zPos + maxThick * 0.25 * cosD],\r\n          [xLE + chord, yPos, zPos], [xLE + chord * 0.74, yPos, zPos - maxThick * 0.25 * cosD],\r\n          [xLE + chord * 0.52, yPos, zPos - maxThick * 0.40 * cosD], [xLE + chord * 0.32, yPos, zPos - maxThick * 0.50 * cosD],\r\n          [xLE + chord * 0.18, yPos, zPos - maxThick * 0.50 * cosD], [xLE + chord * 0.08, yPos, zPos - maxThick * 0.42 * cosD]\r\n        ];\r\n        for (var p = 0; p < pts.length; p++) { var v = toThree(pts[p][0], pts[p][1], pts[p][2]); verts.push(v.x, v.y, v.z); }\r\n      }\r\n      var ptsPerRib = 12;\r\n      for (var r = 0; r < numRibs; r++) {\r\n        var r0 = r * ptsPerRib, r1 = (r + 1) * ptsPerRib;\r\n        for (var i = 0; i < ptsPerRib; i++) { var iNext = (i + 1) % ptsPerRib; inds.push(r0 + i, r0 + iNext, r1 + iNext, r0 + i, r1 + iNext, r1 + i); }\r\n      }\r\n      var rLast = numRibs * ptsPerRib;\r\n      for (var i = 1; i < ptsPerRib - 1; i++) { inds.push(rLast, rLast + i, rLast + i + 1); }\r\n      var finGeom = new THREE.BufferGeometry(); finGeom.setAttribute('position', new THREE.Float32BufferAttribute(verts, 3)); finGeom.setIndex(inds); finGeom.computeVertexNormals(); registerMesh(new THREE.Mesh(finGeom), M.whiteBody);\r\n    });\r\n\r\n    \/* Landing Gear *\/\r\n    var mainWheels = [], tailWheels = [];\r\n    var gearL = new THREE.Group(), gearR = new THREE.Group(), gearTail = new THREE.Group();\r\n    var twPivotPoint = toThree(6.55, 0, 1.45); gearTail.position.copy(twPivotPoint); droneRoot.add(gearTail);\r\n    var twRelFork = toThree(7.32, 0, 0.85).sub(twPivotPoint), twRelHub = toThree(7.45, 0, 0.75).sub(twPivotPoint);\r\n\r\n    function createRelStrut(p1, p2, radius, mat, parent) {\r\n      var dir = new THREE.Vector3().subVectors(p2, p1), len = dir.length();\r\n      var s = new THREE.Mesh(new THREE.CylinderGeometry(radius || 0.035, radius || 0.035, len, 12), mat || M.metalParts);\r\n      s.position.copy(p1).addScaledVector(dir, 0.5); s.quaternion.setFromUnitVectors(new THREE.Vector3(0, 1, 0), dir.normalize()); s.castShadow = true; parent.add(s); return s;\r\n    }\r\n    createRelStrut(new THREE.Vector3(0,0,0), twRelFork, 0.035, M.metalParts, gearTail);\r\n    for (var b = 1; b <= 8; b++) {\r\n      var tb = b \/ 9, bx = twRelFork.x * tb * 0.70, by = twRelFork.y * tb * 0.70, bz = twRelFork.z * tb * 0.70;\r\n      var bootGeom = new THREE.TorusGeometry(0.055, 0.012, 10, 16); bootGeom.rotateY(Math.PI \/ 2);\r\n      var bootMesh = new THREE.Mesh(bootGeom, M.darkHullLines); bootMesh.position.set(bx, by, bz); bootMesh.castShadow = true; gearTail.add(bootMesh);\r\n    }\r\n    createRelStrut(twRelFork, new THREE.Vector3(twRelFork.x - 0.04, twRelFork.y - 0.08, twRelFork.z), 0.02, M.metalParts, gearTail);\r\n    createRelStrut(twRelFork, new THREE.Vector3(twRelFork.x + 0.04, twRelFork.y - 0.08, twRelFork.z), 0.02, M.metalParts, gearTail);\r\n\r\n    var twSpinGroup = new THREE.Group(); twSpinGroup.position.copy(twRelHub);\r\n    var twTire = new THREE.Mesh(new THREE.CylinderGeometry(0.22, 0.22, 0.07, 24), M.tireRubber); twTire.rotation.z = Math.PI \/ 2; twTire.castShadow = true; twSpinGroup.add(twTire);\r\n    var twRim = new THREE.Mesh(new THREE.CylinderGeometry(0.12, 0.12, 0.075, 18), M.wheelRim); twRim.rotation.z = Math.PI \/ 2; twSpinGroup.add(twRim);\r\n    gearTail.add(twSpinGroup); tailWheels.push(twSpinGroup);\r\n\r\n    [[gearL, -1], [gearR, 1]].forEach(function(pair) {\r\n      var g = pair[0], s = pair[1], pivotWorld = toThree(2.05, s * 0.58, 0.92);\r\n      g.position.copy(pivotWorld); droneRoot.add(g);\r\n      createBox(2.05, s * 0.60, 1.15, 0.50, 0.04, 0.40, M.darkHullLines);\r\n      var axleRel = toThree(2.05, s * 0.82, 0.32).sub(pivotWorld);\r\n      createRelStrut(new THREE.Vector3(0, 0, 0), axleRel, 0.045, M.metalParts, g);\r\n      createRelStrut(new THREE.Vector3(0, 0, 0.25), axleRel, 0.026, M.metalParts, g);\r\n      createRelStrut(new THREE.Vector3(0, 0, -0.25), axleRel, 0.026, M.metalParts, g);\r\n      var mwSpinGroup = new THREE.Group(); mwSpinGroup.position.copy(axleRel);\r\n      var mwTire = new THREE.Mesh(new THREE.CylinderGeometry(0.34, 0.34, 0.22, 28), M.tireRubber); mwTire.rotation.z = Math.PI \/ 2; mwTire.castShadow = true; mwSpinGroup.add(mwTire);\r\n      var mwRim = new THREE.Mesh(new THREE.CylinderGeometry(0.18, 0.18, 0.23, 20), M.wheelRim); mwRim.rotation.z = Math.PI \/ 2; mwSpinGroup.add(mwRim);\r\n      g.add(mwSpinGroup); mainWheels.push(mwSpinGroup);\r\n    });\r\n\r\n    \/* Ventral Scoop & Drop Bay *\/\r\n    createBox(2.52, 0, 0.66, 0.52, 0.42, 0.22, M.darkHullLines);\r\n    createBox(2.26, 0, 0.56, 0.05, 0.44, 0.04, M.hazardGold);\r\n    createBox(2.78, 0, 0.56, 0.05, 0.44, 0.04, M.hazardGold);\r\n    [-1, 1].forEach(function(sd) { createBox(2.52, sd * 0.21, 0.56, 0.52, 0.04, 0.04, M.hazardGold); });\r\n\r\n    var scoopDoorGroup = new THREE.Group(); scoopDoorGroup.position.copy(toThree(2.76, 0, 0.55)); droneRoot.add(scoopDoorGroup);\r\n    var scoopDoorMesh = new THREE.Mesh(new THREE.BoxGeometry(0.38, 0.035, 0.46), M.hazardGold); scoopDoorMesh.position.set(0, 0, 0.23); scoopDoorMesh.castShadow = true; scoopDoorGroup.add(scoopDoorMesh);\r\n    var scoopInnerLining = new THREE.Mesh(new THREE.PlaneGeometry(0.36, 0.44), M.titaniumLining); scoopInnerLining.rotation.x = -Math.PI \/ 2; scoopInnerLining.position.set(0, 0.02, 0.23); scoopDoorGroup.add(scoopInnerLining);\r\n    [-1, 1].forEach(function(side) { var baffle = new THREE.Mesh(new THREE.BoxGeometry(0.02, 0.14, 0.42), M.metalParts); baffle.position.set(side * 0.18, 0.07, 0.22); scoopDoorGroup.add(baffle); });\r\n\r\n    createBox(1.92, 0, 0.68, 1.18, 0.58, 0.26, M.darkHullLines);\r\n    createBox(1.32, 0, 0.56, 0.06, 0.60, 0.04, M.hazardGold);\r\n    createBox(2.52, 0, 0.56, 0.06, 0.60, 0.04, M.hazardGold);\r\n    [-1, 1].forEach(function(sd) { createBox(1.92, sd * 0.29, 0.56, 1.18, 0.04, 0.04, M.hazardGold); });\r\n\r\n    var bayLight = new THREE.PointLight(0x00e5ff, 0, 24, 1.8); bayLight.position.copy(toThree(1.92, 0, 0.72)); droneRoot.add(bayLight);\r\n    var dumpDoorL = new THREE.Group(); dumpDoorL.position.copy(toThree(1.92, -0.27, 0.55));\r\n    var dMeshL = new THREE.Mesh(new THREE.BoxGeometry(0.26, 0.035, 1.14), M.hazardGold); dMeshL.position.set(0.13, 0, 0); dMeshL.castShadow = true; dumpDoorL.add(dMeshL);\r\n    var dLiningL = new THREE.Mesh(new THREE.PlaneGeometry(0.24, 1.10), M.titaniumLining); dLiningL.rotation.x = -Math.PI \/ 2; dLiningL.position.set(0.13, 0.02, 0); dumpDoorL.add(dLiningL); droneRoot.add(dumpDoorL);\r\n\r\n    var dumpDoorR = new THREE.Group(); dumpDoorR.position.copy(toThree(1.92, 0.27, 0.55));\r\n    var dMeshR = new THREE.Mesh(new THREE.BoxGeometry(0.26, 0.035, 1.14), M.hazardGold); dMeshR.position.set(-0.13, 0, 0); dMeshR.castShadow = true; dumpDoorR.add(dMeshR);\r\n    var dLiningR = new THREE.Mesh(new THREE.PlaneGeometry(0.24, 1.10), M.titaniumLining); dLiningR.rotation.x = -Math.PI \/ 2; dLiningR.position.set(-0.13, 0.02, 0); dumpDoorR.add(dLiningR); droneRoot.add(dumpDoorR);\r\n\r\n    \/* Main Wing *\/\r\n    var WX = 1.55, WC = 1.40, WZ = 2.25, numWingStations = 28, wingFoils = [];\r\n    var foilPtsRelative = [\r\n      [0, 0], [0.06, 0.028], [0.12, 0.042], [0.22, 0.054], [0.35, 0.058], [0.50, 0.046], [0.68, 0.028], [0.85, 0.014],\r\n      [1.00, 0.005], [0.85, -0.008], [0.68, -0.018], [0.50, -0.025], [0.35, -0.028], [0.22, -0.024], [0.12, -0.018], [0.06, -0.010]\r\n    ];\r\n    for (var i = 0; i <= numWingStations; i++) {\r\n      var y = -4.6 + (9.2 * i) \/ numWingStations, absY = Math.abs(y), chord = WC, xStart = WX;\r\n      if (absY > 3.7) { var factor = (absY - 3.7) \/ (4.6 - 3.7); chord = WC * (1 - factor * 0.35); xStart = WX + factor * 0.12; }\r\n      wingFoils.push(foilPtsRelative.map(function(q) { return [xStart + q[0] * chord, y, WZ + q[1] * chord]; }));\r\n    }\r\n    var wingVerts = [], wingInds = [];\r\n    for (var i = 0; i < wingFoils.length; i++) {\r\n      for (var p = 0; p < wingFoils[i].length; p++) { var v = toThree(wingFoils[i][p][0], wingFoils[i][p][1], wingFoils[i][p][2]); wingVerts.push(v.x, v.y, v.z); }\r\n    }\r\n    var ptsPerFoil = 16;\r\n    for (var i = 0; i < wingFoils.length - 1; i++) {\r\n      var r0 = i * ptsPerFoil, r1 = (i + 1) * ptsPerFoil;\r\n      for (var p = 0; p < ptsPerFoil; p++) { var pNext = (p + 1) % ptsPerFoil; wingInds.push(r0 + p, r0 + pNext, r1 + pNext, r0 + p, r1 + pNext, r1 + p); }\r\n    }\r\n    for (var p = 1; p < ptsPerFoil - 1; p++) { wingInds.push(0, p + 1, p); var lastR = numWingStations * ptsPerFoil; wingInds.push(lastR, lastR + p, lastR + p + 1); }\r\n    var wingGeom = new THREE.BufferGeometry(); wingGeom.setAttribute('position', new THREE.Float32BufferAttribute(wingVerts, 3)); wingGeom.setIndex(wingInds); wingGeom.computeVertexNormals(); registerMesh(new THREE.Mesh(wingGeom), M.whiteBody);\r\n    [-1, 1].forEach(function(s) { createBox(WX + 0.72 * WC, s * 2.30, WZ + 0.015, 0.02, 3.80, 0.02, M.darkHullLines); });\r\n\r\n    \/* 8. Robust \"V\"-Shaped Center Cabane Pylon & Lift Struts *\/\r\n    createBox(2.10, 0, 1.72, 0.96, 0.42, 0.06, M.whiteBody);\r\n    createBox(2.10, 0, 1.74, 0.84, 0.32, 0.04, M.darkHullLines);\r\n\r\n    [-1, 1].forEach(function(side) {\r\n      createStrut([1.75, 0.0, 1.71], [1.75, side * 0.62, 2.25], 0.065, M.whiteBody);\r\n      createStrut([2.45, 0.0, 1.71], [2.45, side * 0.62, 2.25], 0.065, M.whiteBody);\r\n      createStrut([1.75, 0.0, 1.71], [2.45, side * 0.62, 2.25], 0.042, M.whiteBody);\r\n      createStrut([2.45, 0.0, 1.71], [1.75, side * 0.62, 2.25], 0.042, M.whiteBody);\r\n      createStrut([1.65, side * 0.62, 2.25], [2.55, side * 0.62, 2.25], 0.055, M.whiteBody);\r\n\r\n      createStrut([1.95, side * 0.60, 0.82], [1.78, side * 2.80, 2.23], 0.052, M.whiteBody);\r\n      createStrut([1.95, side * 0.60, 0.82], [2.28, side * 2.80, 2.23], 0.052, M.whiteBody);\r\n      createStrut([1.85, side * 1.70, 1.55], [1.85, side * 1.70, 2.23], 0.035, M.whiteBody);\r\n    });\r\n\r\n    var vFwdL = toThree(1.75, -0.62, 2.25), vFwdR = toThree(1.75, 0.62, 2.25), vFwdB = toThree(1.75, 0.0, 1.71);\r\n    var vAftL = toThree(2.45, -0.62, 2.25), vAftR = toThree(2.45, 0.62, 2.25), vAftB = toThree(2.45, 0.0, 1.71);\r\n\r\n    var vPylonGeom = new THREE.BufferGeometry();\r\n    var vVerts = [\r\n      vFwdB.x, vFwdB.y, vFwdB.z,  vFwdL.x, vFwdL.y, vFwdL.z,  vAftL.x, vAftL.y, vAftL.z,\r\n      vFwdB.x, vFwdB.y, vFwdB.z,  vAftL.x, vAftL.y, vAftL.z,  vAftB.x, vAftB.y, vAftB.z,\r\n      vFwdB.x, vFwdB.y, vFwdB.z,  vAftR.x, vAftR.y, vAftR.z,  vFwdR.x, vFwdR.y, vFwdR.z,\r\n      vFwdB.x, vFwdB.y, vFwdB.z,  vAftB.x, vAftB.y, vAftB.z,  vAftR.x, vAftR.y, vAftR.z\r\n    ];\r\n    vPylonGeom.setAttribute('position', new THREE.Float32BufferAttribute(vVerts, 3));\r\n    vPylonGeom.computeVertexNormals();\r\n    var vPylonMesh = new THREE.Mesh(vPylonGeom, M.whiteBody);\r\n    registerMesh(vPylonMesh);\r\n    var propGroups = [], propDiscs = [];\r\n    [-0.85, 0.85].forEach(function(yc, idx) {\r\n      var nacMesh = new THREE.Mesh(new THREE.CylinderGeometry(0.18, 0.16, 0.78, 20)); nacMesh.geometry.rotateX(Math.PI \/ 2); nacMesh.position.copy(toThree(1.44, yc, 2.32)); registerMesh(nacMesh, M.whiteBody);\r\n      var spinnerMesh = new THREE.Mesh(new THREE.ConeGeometry(0.12, 0.35, 18)); spinnerMesh.geometry.rotateX(-Math.PI \/ 2); spinnerMesh.position.copy(toThree(0.85, yc, 2.32)); registerMesh(spinnerMesh, M.redMetallic);\r\n      var hubMesh = new THREE.Mesh(new THREE.CylinderGeometry(0.09, 0.09, 0.08, 16)); hubMesh.geometry.rotateX(Math.PI \/ 2); hubMesh.position.copy(toThree(1.00, yc, 2.32)); registerMesh(hubMesh, M.redMetallic);\r\n      var propGroup = new THREE.Group(); propGroup.position.copy(toThree(1.00, yc, 2.32));\r\n      for (var k = 0; k < 5; k++) {\r\n        var bladeGroup = new THREE.Group(); bladeGroup.rotation.z = (k * Math.PI * 2) \/ 5;\r\n        var bladeShape = new THREE.Shape(); bladeShape.moveTo(-0.02, 0.08); bladeShape.bezierCurveTo(-0.05, 0.25, -0.06, 0.50, -0.015, 0.65); bladeShape.lineTo(0.025, 0.65); bladeShape.bezierCurveTo(0.045, 0.50, 0.035, 0.25, 0.015, 0.08); bladeShape.closePath();\r\n        var bladeGeom = new THREE.ExtrudeGeometry(bladeShape, { depth: 0.012, bevelEnabled: true, bevelThickness: 0.004, bevelSize: 0.004 }); bladeGeom.translate(0, 0, -0.006);\r\n        var bladeMesh = new THREE.Mesh(bladeGeom, M.propCarbon); bladeMesh.rotation.y = 0.22; bladeMesh.castShadow = true; bladeGroup.add(bladeMesh);\r\n        var tipMesh = new THREE.Mesh(new THREE.BoxGeometry(0.045, 0.08, 0.016), M.propWhiteTip); tipMesh.position.set(0, 0.61, 0); tipMesh.castShadow = true; bladeGroup.add(tipMesh); propGroup.add(bladeGroup);\r\n      }\r\n      var disc = new THREE.Mesh(new THREE.CircleGeometry(0.72, 24), new THREE.MeshBasicMaterial({ color: 0x8f97a4, transparent: true, opacity: 0, side: THREE.DoubleSide, depthWrite: false })); disc.position.z = 0.02; propGroup.add(disc); propDiscs.push(disc);\r\n      droneRoot.add(propGroup); propGroups.push(propGroup);\r\n    });\r\n\r\n    var headlightTarget = new THREE.Object3D(); headlightTarget.position.copy(toThree(0.5, 0, -18.0)); droneRoot.add(headlightTarget);\r\n    var droneHeadlight = new THREE.SpotLight(0xedf6ff, 0, 110, Math.PI \/ 3.8, 0.5, 1.2);\r\n    var lightPos = toThree(0.45, 0, 0.95); droneHeadlight.position.copy(lightPos); droneHeadlight.target = headlightTarget; droneHeadlight.castShadow = true; droneRoot.add(droneHeadlight);\r\n    var chinLens = new THREE.Mesh(new THREE.SphereGeometry(0.14, 12, 10), new THREE.MeshBasicMaterial({ color: 0xffffff, transparent: true, opacity: 0 })); chinLens.position.copy(lightPos); droneRoot.add(chinLens);\r\n    var beamGeo = new THREE.ConeGeometry(11.0, 26, 18, 1, true); beamGeo.rotateX(-Math.PI \/ 2); beamGeo.translate(0, 0, 13);\r\n    var headlightBeam = new THREE.Mesh(beamGeo, new THREE.MeshBasicMaterial({ color: 0xdcf2ff, transparent: true, opacity: 0, depthWrite: false, side: THREE.DoubleSide }));\r\n    headlightBeam.position.copy(lightPos); headlightBeam.rotation.x = 0.88; droneRoot.add(headlightBeam);\r\n\r\n    function navL(color, p) { var m = new THREE.Mesh(new THREE.SphereGeometry(0.08, 8, 6), new THREE.MeshBasicMaterial({ color: color })); m.position.copy(p); droneRoot.add(m); return m; }\r\n    navL(0xff2222, toThree(WX + 0.2, -4.6, WZ)); navL(0x22ff44, toThree(WX + 0.2, 4.6, WZ));\r\n    var strobe = navL(0xffffff, toThree(7.35, 0, 1.7)), beacon = navL(0xff3333, toThree(5.075, 0, 1.82));\r\n\r\n    \/* \u2500\u2500 Spline & Flight Sortie Timeline \u2500\u2500 *\/\r\n    var PHASES = [\r\n      { n: 'ATOL TAKEOFF', d: 5 },\r\n      { n: 'LAKE APPROACH', d: 5 },\r\n      { n: 'LAKE SURFACE SCOOP', d: 8 },\r\n      { n: 'CLIMB & INGRESS', d: 6 },\r\n      { n: 'PRECISION WATER DROP', d: 8 },\r\n      { n: 'FIRELINE CONTAINED & EGRESS', d: 5 },\r\n      { n: 'RETURN & TOUCHDOWN', d: 6 },\r\n      { n: 'QUICK TURNAROUND', d: 3 }\r\n    ];\r\n    var T = 46, bounds = [];\r\n    (function() { var a = 0; for (var i = 0; i < PHASES.length; i++) { bounds.push(a); a += PHASES[i].d; } })();\r\n    var phaseIdx = function(t) { var i = 0; while (i < bounds.length - 1 && t >= bounds[i + 1]) i++; return i; };\r\n\r\n    var SPLINE_POINTS = [\r\n      V(-18, 1.55, -60), V(-18, 1.60, -36), V(-24, 18.0, -18), V(-38, 16.0, -12), V(-48, 9.0, -6.0), V(-48, 2.6, 2.0),\r\n      V(-48, 0.52, 10.0), V(-48, 0.52, 20.0), V(-48, 0.52, 28.0), V(-47, 2.8, 36.0), V(-38, 16.0, 44.0), V(-8, 22.0, 32.0),\r\n      V(24, 18.5, 24.0), V(40, 16.5, -10.0), V(46, 22.0, -38.0), V(14, 22.0, -56.0), V(-18, 3.5, -64.0), V(-18, 1.55, -60)\r\n    ];\r\n    var flightSpline = new THREE.CatmullRomCurve3(SPLINE_POINTS, false, 'centripetal');\r\n    var IASKF = [[0, 0], [2.5, 75], [5, 95], [10, 78], [10.5, 68], [18, 68], [22, 100], [28, 105], [32, 105], [36, 115], [39, 95], [42, 65], [45, 0], [46, 0]];\r\n    var TANKKF = [[0, 0], [10.2, 0], [18, 1560], [24.0, 1560], [32.0, 0], [46, 0]];\r\n\r\n    function kf(A, t) {\r\n      if (t <= A[0][0]) return A[0][1];\r\n      for (var i = 0; i < A.length - 1; i++) {\r\n        if (t <= A[i + 1][0]) { var u = (t - A[i][0]) \/ (A[i + 1][0] - A[i][0]); return lerp(A[i][1], A[i + 1][1], u); }\r\n      }\r\n      return A[A.length - 1][1];\r\n    }\r\n\r\n    var SHOTS = [\r\n      { off: [10, 2.5, -16], lk: 6 }, { off: [-14, 4.5, -18], lk: 8 }, { off: [-11, 1.6, -13], lk: 8 }, { off: [-14, 5.5, -22], lk: 10 },\r\n      { fx: -4.0, fz: -8.0, fy: 17.0, blend: 0.50 }, { off: [18, 7.5, -24], lk: 10 }, { fx: -24, fz: -56, fy: 3.0 }, { fx: -20, fz: -46, fy: 2.5 }\r\n    ];\r\n\r\n    \/* \u2500\u2500 Pause \/ Play & Mobile HUD Controllers \u2500\u2500 *\/\r\n    var playing = true;\r\n    var btnPlay = $('fxBtnPlay');\r\n    var iconSpan = $('fxPlayIcon');\r\n    var textSpan = $('fxPlayText');\r\n\r\n    if (btnPlay) {\r\n      btnPlay.addEventListener('click', function(e) {\r\n        e.stopPropagation();\r\n        playing = !playing;\r\n        if (iconSpan) iconSpan.textContent = playing ? '\u23f8' : '\u25b6';\r\n        if (textSpan) textSpan.textContent = playing ? 'PAUSE' : 'RESUME';\r\n      });\r\n    }\r\n\r\n    var btnHud = $('fxBtnHud');\r\n    var hudText = $('fxHudText');\r\n    var hudIcon = $('fxHudIcon');\r\n    var vpEl = $('flyoxViewport');\r\n\r\n    if (btnHud && vpEl) {\r\n      btnHud.addEventListener('click', function(e) {\r\n        e.stopPropagation();\r\n        var isOpen = vpEl.classList.toggle('show-mobile-hud');\r\n        if (hudText) hudText.textContent = isOpen ? 'CLOSE' : 'HUD';\r\n        if (hudIcon) hudIcon.textContent = isOpen ? '\u2715' : '\ud83d\udcca';\r\n      });\r\n    }\r\n\r\n    \/* \u2500\u2500 State variables \u2500\u2500 *\/\r\n    var missionT = 0, tVis = 0, wind = V(0.85, 0, 0.18);\r\n    var dispYaw = 0, dispPitch = 0, dispRoll = 0, tankL = 0, scoopVal = 0, dumpVal = 0;\r\n    var emberB = 0, flameB = 0, smokeB = 0, sprB = 0, waterB = 0, dustB = 0, wetMark = 0, wakeT = 0, avgInt = 0;\r\n    var prevPos = V(0, 0, 0), velVec = V(0, 0, 0), fwdDir = V(0, 0, 1), tmpV1 = V(0, 0, 0), tmpV2 = V(0, 0, 0), tmpV4 = V(0, 0, 0);\r\n    var camPos = V(-38, 5, -75), camTgt = V(-18, 2, -60);\r\n\r\n    function resetSortie() {\r\n      cells.forEach(function(c) { c.i = 1.0; c.contained = false; });\r\n      trees.forEach(function(t, i) {\r\n        var inFireZone = (t.x >= 18 && t.x <= 58 && t.z >= -34 && t.z <= 30);\r\n        t.state = inFireZone ? 1 : 0; t.bt = 0;\r\n        canIM.setColorAt(i, tmpC.setRGB(t.state === 1 ? 0.44 : t.baseCr, t.state === 1 ? 0.18 : t.baseCg, t.state === 1 ? 0.035 : t.baseCb));\r\n      });\r\n      canIM.instanceColor.needsUpdate = true;\r\n      wetPool.clear(); foamPool.clear();\r\n    }\r\n\r\n    function spawnEmberAt(x, y, z) {\r\n      embers.spawn(x, y, z, wind.x * (0.6 + Math.random()) + (Math.random() - 0.5) * 0.8, 2.2 + Math.random() * 3.5, wind.z * (0.6 + Math.random()) + (Math.random() - 0.5) * 0.8, 1.4 + Math.random() * 1.8, 1.0, 0.15 + Math.random() * 0.2, 0.02);\r\n    }\r\n\r\n    function updateFire(dt, darkFactor, t) {\r\n      var sum = 0;\r\n      for (var i = 0; i < cells.length; i++) {\r\n        var c = cells[i];\r\n        if (!c.contained) c.i = 1.0; else c.i = Math.max(0, c.i - dt * 2.5);\r\n        sum += c.i;\r\n      }\r\n      avgInt = sum \/ cells.length;\r\n      var flameScale = lerp(0.35, 1.0, darkFactor), emberScale = lerp(0.25, 1.0, darkFactor), smokeScale = lerp(0.90, 1.0, darkFactor);\r\n      emberB += dt * (50 + 300 * avgInt) * emberScale; flameB += dt * (40 + 240 * avgInt) * flameScale; smokeB += dt * (34 + 85 * avgInt) * smokeScale;\r\n\r\n      while (flameB > 1) {\r\n        flameB--; var c = cells[(Math.random() * cells.length) | 0];\r\n        if (c && c.i > 0.08 && !c.contained) {\r\n          var a = Math.random() * TAU, r = Math.random() * 4.5;\r\n          flames.spawn(c.x + Math.cos(a) * r, c.y + 0.3, c.z + Math.sin(a) * r, (Math.random() - 0.5) * 0.3 + 0.3 * wind.x, 1.8 + Math.random() * 2.2, (Math.random() - 0.5) * 0.3 + 0.3 * wind.z, lerp(0.5, 0.8, darkFactor) + Math.random() * 0.4, lerp(0.80, 1.0, darkFactor), lerp(0.18, 0.08, darkFactor) + Math.random() * 0.10, 0.005);\r\n        }\r\n      }\r\n      while (smokeB > 1) {\r\n        smokeB--; var c = cells[(Math.random() * cells.length) | 0];\r\n        if (c && (c.i > 0.03 || c.contained)) {\r\n          var a = Math.random() * TAU, r = Math.random() * 5.5, g = c.contained ? (0.75 + Math.random() * 0.2) : lerp(0.30 + Math.random() * 0.10, 0.12 + Math.random() * 0.06, darkFactor);\r\n          smoke.spawn(c.x + Math.cos(a) * r, c.y + 1.8 + Math.random() * 2, c.z + Math.sin(a) * r, wind.x * 2.0 + (Math.random() - 0.5) * 0.5, 2.2 + Math.random() * 1.4, wind.z * 2.0 + (Math.random() - 0.5) * 0.5, 4.8 + Math.random() * 3.5, g, g * 0.95, g);\r\n        }\r\n      }\r\n      while (emberB > 1) {\r\n        emberB--; var c = cells[(Math.random() * cells.length) | 0];\r\n        if (c && c.i > 0.08 && !c.contained) {\r\n          var a = Math.random() * TAU, r = Math.random() * 6; spawnEmberAt(c.x + Math.cos(a) * r, c.y + 0.4 + Math.random() * 1.5, c.z + Math.sin(a) * r);\r\n        }\r\n      }\r\n\r\n      var lightPower = lerp(2.5, 18.0, darkFactor);\r\n      fireL.forEach(function(fl, j) {\r\n        var slice = cells.slice(j * 8, (j + 1) * 8 + 4), localAvg = 0;\r\n        for (var k = 0; k < slice.length; k++) localAvg += slice[k].i;\r\n        localAvg \/= Math.max(1, slice.length);\r\n        fl.L.intensity = localAvg > 0.02 ? lightPower * localAvg * (0.8 + 0.2 * Math.sin(tVis * 9 + j * 2.2)) : 0;\r\n      });\r\n    }\r\n\r\n    function treeColors(dt, darkFactor, t) {\r\n      var dirty = false;\r\n      for (var i = 0; i < trees.length; i++) {\r\n        var tr = trees[i], inFireZone = (tr.x >= 18 && tr.x <= 58 && tr.z >= -34 && tr.z <= 30);\r\n        if (inFireZone && tr.state === 0) tr.state = 1;\r\n        if (tr.state === 1) {\r\n          var fl = 0.5 + 0.5 * Math.sin(tVis * 13 + i * 2.7);\r\n          var curR = lerp(0.44 + 0.10 * fl, 0.96 + 0.04 * fl, darkFactor);\r\n          var curG = lerp(0.18 + 0.06 * fl, 0.20 + 0.16 * fl, darkFactor);\r\n          var curB = lerp(0.035, 0.015, darkFactor);\r\n          canIM.setColorAt(i, tmpC.setRGB(curR, curG, curB)); dirty = true;\r\n          if (Math.random() < dt * (0.8 + 2.4 * darkFactor)) spawnEmberAt(tr.x + (Math.random() - 0.5) * 1.5, tr.y + tr.h * 0.85, tr.z + (Math.random() - 0.5) * 1.5);\r\n          if (tr.cell >= 0 && cells[tr.cell].contained) { tr.state = 2; canIM.setColorAt(i, tmpC.setRGB(0.04, 0.03, 0.025)); dirty = true; }\r\n        }\r\n      }\r\n      if (dirty) canIM.instanceColor.needsUpdate = true;\r\n    }\r\n\r\n    function updateEnvironment(t) {\r\n      var darkFactor = 0;\r\n      if (t >= 19.5 && t < 37.0) darkFactor = sstep(19.5, 24.5, t);\r\n      else if (t >= 37.0 && t < 43.0) darkFactor = 1.0 - sstep(37.0, 42.5, t);\r\n      skyU.uZen.value.copy(PAL_DAY.zen).lerp(PAL_NIGHT.zen, darkFactor);\r\n      skyU.uHor.value.copy(PAL_DAY.hor).lerp(PAL_NIGHT.hor, darkFactor);\r\n      skyU.uSunC.value.copy(PAL_DAY.sunC).lerp(PAL_NIGHT.sunC, darkFactor);\r\n      skyU.uGlow.value = lerp(PAL_DAY.sunI > 1 ? 1.2 : 0.6, 0.15, darkFactor);\r\n      hemi.color.copy(PAL_DAY.hemiC).lerp(PAL_NIGHT.hemiC, darkFactor); hemi.intensity = lerp(PAL_DAY.hemiI, PAL_NIGHT.hemiI, darkFactor);\r\n      sun.color.copy(PAL_DAY.sunC).lerp(PAL_NIGHT.sunC, darkFactor); sun.intensity = lerp(PAL_DAY.sunI, PAL_NIGHT.sunI, darkFactor);\r\n      scene.fog.color.copy(PAL_DAY.fog).lerp(PAL_NIGHT.fog, darkFactor);\r\n      renderer.toneMappingExposure = lerp(PAL_DAY.exposure, PAL_NIGHT.exposure, darkFactor);\r\n      droneHeadlight.intensity = 20.0 * darkFactor; headlightBeam.material.opacity = 0.24 * darkFactor; chinLens.material.opacity = darkFactor;\r\n      return darkFactor;\r\n    }\r\n\r\n    function updateCamera(dt) {\r\n      var ph = phaseIdx(missionT), s = SHOTS[ph], ip, it;\r\n      if (s.off) {\r\n        var quat = new THREE.Quaternion().setFromEuler(new THREE.Euler(0, dispYaw, 0));\r\n        var offVec = V(s.off[0], s.off[1], s.off[2]).applyQuaternion(quat);\r\n        ip = tmpV1.copy(AC.position).add(offVec); it = tmpV4.copy(AC.position).addScaledVector(fwdDir, s.lk);\r\n      } else {\r\n        ip = tmpV1.set(s.fx, gh(s.fx, s.fz) + s.fy, s.fz);\r\n        it = s.blend !== undefined ? tmpV4.set(AC.position.x, lerp(gh(AC.position.x, AC.position.z), AC.position.y, s.blend), AC.position.z) : tmpV4.copy(AC.position);\r\n      }\r\n      camPos.lerp(ip, 1 - Math.exp(-2.8 * Math.max(dt, 0.001)));\r\n      camTgt.lerp(it, 1 - Math.exp(-3.6 * Math.max(dt, 0.001)));\r\n      camPos.y = Math.max(camPos.y, gh(camPos.x, camPos.z) + 1.2);\r\n      camera.position.copy(camPos); camera.lookAt(camTgt);\r\n    }\r\n\r\n    function updateHUD(t, ph) {\r\n      var iasVal = Math.round(kf(IASKF, t));\r\n      var altVal = Math.max(0, Math.round((AC.position.y - gh(AC.position.x, AC.position.z)) * 3.28));\r\n      var hdg = Math.round((Math.atan2(fwdDir.x, fwdDir.z) * 180 \/ Math.PI + 360) % 360); if (hdg === 0) hdg = 360;\r\n      var fpm = velVec.y * 196.85;\r\n      var half = tankL \/ 2;\r\n      var fuel = 540 - 0.12 * t, gw = 1840 + tankL + fuel;\r\n\r\n      $('fxHudPhase').textContent = String(ph + 1).padStart(2, '0') + ' \u00b7 ' + PHASES[ph].n;\r\n      $('fxIas').textContent = iasVal + ' KT';\r\n      $('fxAlt').textContent = altVal + ' FT';\r\n      $('fxHdg').textContent = String(hdg).padStart(3, '0');\r\n      $('fxVs').textContent = (fpm >= 0 ? '+' : '') + fpm.toFixed(0) + ' FPM';\r\n      $('fxTanka').style.height = clamp((half \/ 780) * 100, 0, 100) + '%';\r\n      $('fxTankb').style.height = clamp((half \/ 780) * 100, 0, 100) + '%';\r\n      $('fxTankav').textContent = Math.round(half) + ' L';\r\n      $('fxTankbv').textContent = Math.round(half) + ' L';\r\n      $('fxGw').textContent = Math.round(gw).toLocaleString('en-CA') + ' \/ 4,000 KG';\r\n      $('fxGwbar').style.width = clamp((gw \/ 4000) * 100, 0, 100) + '%';\r\n      $('fxFuel').textContent = Math.round(fuel) + ' KG';\r\n      $('fxScoop').textContent = dumpVal > 0.1 ? 'TWIN DROP BAY DOORS OPEN \u00b7 \u2212260 L\/S' : (scoopVal > 0.1 ? 'BOTTOM SCOOP VENT OPEN \u00b7 +195 L\/S' : 'VENTRAL DOORS CLOSED');\r\n\r\n      \/\/ Update Sleek Mobile Telemetry Strip\r\n      var mIas = $('fxMIas'); if (mIas) mIas.textContent = iasVal + ' KT';\r\n      var mAlt = $('fxMAlt'); if (mAlt) mAlt.textContent = altVal + ' FT';\r\n      var mTank = $('fxMTank'); if (mTank) mTank.textContent = Math.round(tankL) + ' L';\r\n      var mStatus = $('fxMStatus');\r\n      if (mStatus) {\r\n        if (dumpVal > 0.1) {\r\n          mStatus.textContent = 'DROPPING';\r\n          mStatus.style.color = '#ff3b14';\r\n        } else if (scoopVal > 0.1) {\r\n          mStatus.textContent = 'SCOOPING';\r\n          mStatus.style.color = '#3fd8ff';\r\n        } else {\r\n          mStatus.textContent = 'CLOSED';\r\n          mStatus.style.color = '#8b95a8';\r\n        }\r\n      }\r\n    }\r\n\r\n    var retGround = function(i, p, life) {\r\n      var x = p[i * 3], y = p[i * 3 + 1], z = p[i * 3 + 2], gy = gh(x, z);\r\n      if (y > gy + 0.28) return false;\r\n      if ((wetMark++) % 2 === 0) wetPool.drop(x + (Math.random() - 0.5) * 2.8, z + (Math.random() - 0.5) * 2.8, 3.8 + Math.random() * 2.6, 0);\r\n      for (var cIdx = 0; cIdx < cells.length; cIdx++) {\r\n        if (Math.hypot(x - cells[cIdx].x, z - cells[cIdx].z) < 13.5) { cells[cIdx].contained = true; cells[cIdx].i = 0; }\r\n      }\r\n      for (var tIdx = 0; tIdx < trees.length; tIdx++) {\r\n        if (Math.hypot(x - trees[tIdx].x, z - trees[tIdx].z) < 12.8 && trees[tIdx].state === 1) {\r\n          trees[tIdx].state = 2; canIM.setColorAt(tIdx, tmpC.setRGB(0.04, 0.03, 0.025)); canIM.instanceColor.needsUpdate = true;\r\n        }\r\n      }\r\n      for (var s = 0; s < 12; s++) {\r\n        puff.spawn(x + (Math.random() - 0.5) * 4.8, gy + 0.5, z + (Math.random() - 0.5) * 4.8, wind.x * 0.7 + (Math.random() - 0.5) * 2.2, 3.2 + Math.random() * 4.5, wind.z * 0.7 + (Math.random() - 0.5) * 2.2, 2.8 + Math.random() * 2.2, 0.90, 0.95, 1.0);\r\n      }\r\n      p[i * 3 + 1] = -999; life[i] = 0; return true;\r\n    };\r\n\r\n    function step(dt) {\r\n      var t = missionT, ph = phaseIdx(t);\r\n      tankL = kf(TANKKF, t);\r\n      scoopVal = sstep(10.0, 10.8, t) - sstep(17.4, 18.2, t);\r\n      dumpVal = sstep(24.0, 24.6, t) - sstep(31.8, 32.5, t);\r\n\r\n      var uSpline = (t \/ T) % 1.0;\r\n      var p = flightSpline.getPointAt(uSpline, tmpV1);\r\n      var dirV = flightSpline.getTangentAt(uSpline, tmpV2);\r\n      fwdDir.copy(dirV); AC.position.copy(p);\r\n\r\n      if (dt > 0) velVec.copy(p).sub(prevPos).divideScalar(Math.max(dt, 0.0001));\r\n      prevPos.copy(p);\r\n\r\n      var tYaw = Math.atan2(dirV.x, dirV.z), climb = Math.atan2(dirV.y, Math.hypot(dirV.x, dirV.z)), tPitch = -climb, tRoll = 0;\r\n      if (dt > 0) { var yr = angDelta(tYaw, dispYaw) \/ dt; tRoll = clamp(-yr * 1.1, -0.75, 0.75); }\r\n      if (ph === 0 && t < 3.2) { tPitch = lerp(-0.06, 0, sstep(1.5, 3.0, t)); tRoll = 0; }\r\n      if (ph === 6 && t > 41.5) { tPitch = lerp(-0.02, -0.06, sstep(42, 44, t)); tRoll = 0; }\r\n      if (ph === 7) { tPitch = -0.06; tRoll = 0; }\r\n      \r\n      var surfBlend = sstep(10.0, 11.2, t) * (1 - sstep(17.2, 18.2, t));\r\n      if (surfBlend > 0.01) {\r\n        tPitch = lerp(tPitch, 0.045 + Math.sin(tVis * 14) * 0.006, surfBlend);\r\n        tRoll = lerp(tRoll, Math.sin(tVis * 10) * 0.010, surfBlend);\r\n      }\r\n\r\n      if (dt > 0) {\r\n        dispYaw += angDelta(tYaw, dispYaw) * (1 - Math.exp(-5.0 * dt));\r\n        dispPitch += (tPitch - dispPitch) * (1 - Math.exp(-4.0 * dt));\r\n        dispRoll += (tRoll - dispRoll) * (1 - Math.exp(-3.2 * dt));\r\n      }\r\n      AC.rotation.set(dispPitch, dispYaw, dispRoll);\r\n      AC.updateMatrixWorld();\r\n\r\n      var gv = clamp(1.0 - sstep(3.5, 5.0, t) + sstep(38.0, 40.5, t), 0, 1);\r\n      if (ph === 1 || ph === 2 || ph === 3 || ph === 4 || ph === 5) gv = 0;\r\n      if (ph === 0 && t < 3.5) gv = 1;\r\n      if (ph === 7) gv = 1;\r\n\r\n      gearL.rotation.z = (1 - gv) * 1.42; gearR.rotation.z = -(1 - gv) * 1.42; gearTail.rotation.x = (1 - gv) * 1.32;\r\n      scoopDoorMesh.rotation.x = -scoopVal * 0.95; dumpDoorL.rotation.z = dumpVal * 1.52; dumpDoorR.rotation.z = -dumpVal * 1.52;\r\n      bayLight.intensity = dumpVal * 24.0;\r\n\r\n      var ias = kf(IASKF, t), ps = 10 + ias * 1.5;\r\n      propGroups.forEach(function(pg, idx) { if (dt > 0) pg.rotation.z += (idx === 0 ? 1 : -1) * ps * dt; });\r\n      propDiscs.forEach(function(disc) { disc.material.opacity = ias > 10 ? clamp((ias - 20) \/ 70, 0, 0.35) + 0.05 : 0; });\r\n\r\n      var onGround = ((ph === 0 && t < 3.6) || (ph === 6 && t > 41.5) || ph === 7) && gv > 0.6;\r\n      if (onGround && dt > 0) {\r\n        var groundSpeed = velVec.length() * dt;\r\n        mainWheels.forEach(function(w) { w.rotation.x += groundSpeed \/ (0.34 * SCALE_FAC); });\r\n        tailWheels.forEach(function(tw) { tw.rotation.x += groundSpeed \/ (0.22 * SCALE_FAC); });\r\n      }\r\n\r\n      strobe.visible = (tVis % 1.1) < 0.07 || ((tVis + 0.12) % 1.1) < 0.05;\r\n      beacon.visible = (tVis % 0.9) < 0.45; gcsBeacon.visible = Math.sin(tVis * 4) > -0.2; sockG.rotation.y = Math.sin(tVis * 1.3) * 0.12;\r\n\r\n      var darkFactor = updateEnvironment(t);\r\n\r\n      if (dt > 0) {\r\n        AC.updateMatrixWorld();\r\n\r\n        \/* Unified Diagonal Aerodynamic Water Drop *\/\r\n        if (dumpVal > 0.05 && tankL > 2) {\r\n          waterB += dt * 1800;\r\n          while (waterB > 1) {\r\n            waterB--;\r\n            var s = (Math.random() - 0.5) * 0.45, longOffset = (Math.random() - 0.5) * 0.85;\r\n            var dropPos = toThree(1.92 + longOffset, s, 0.48).multiplyScalar(SCALE_FAC).applyQuaternion(AC.quaternion).add(AC.position);\r\n            var fwdInherit = 0.68 + Math.random() * 0.15;\r\n            var vx = velVec.x * fwdInherit + (Math.random() - 0.5) * 1.6 + (s * 2.2) + wind.x * 0.5;\r\n            var vy = velVec.y * 0.40 - 1.8 - Math.random() * 2.5;\r\n            var vz = velVec.z * fwdInherit + (Math.random() - 0.5) * 1.6 + wind.z * 0.5;\r\n            var isFoam = Math.random() < 0.28;\r\n            waterDrop.spawn(dropPos.x, dropPos.y, dropPos.z, vx, vy, vz, 2.6 + Math.random() * 1.2, isFoam ? 0.85 : 0.42 + Math.random() * 0.25, isFoam ? 0.95 : 0.80 + Math.random() * 0.18, 1.0);\r\n          }\r\n        }\r\n\r\n        if (scoopVal > 0.1) {\r\n          sprB += dt * 550;\r\n          while (sprB > 1) {\r\n            sprB--; var side = Math.random() < 0.5 ? -1 : 1;\r\n            var spPos = toThree(2.62, side * 0.22, 0.50).multiplyScalar(SCALE_FAC).applyQuaternion(AC.quaternion).add(AC.position);\r\n            spray.spawn(spPos.x, 0.05 + Math.random() * 0.2, spPos.z, velVec.x * 0.25 + side * (3.5 + Math.random() * 4.5), 2.5 + Math.random() * 4.0, velVec.z * 0.25 - (2.0 + Math.random() * 3.0), 0.8 + Math.random() * 0.7, 0.82, 0.94, 1.0);\r\n          }\r\n          wakeT -= dt;\r\n          if (wakeT <= 0) { wakeT = 0.04; foamPool.drop(AC.position.x + (Math.random() - 0.5) * 1.6, AC.position.z - 1.5 - Math.random() * 3.5, 2.2 + Math.random() * 1.2, 3.2); }\r\n        }\r\n\r\n        if (onGround) {\r\n          dustB += dt * 80;\r\n          while (dustB > 1) {\r\n            dustB--; var s = Math.random() < 0.5 ? -1 : 1;\r\n            var dustPos = toThree(2.05, s * 0.82, 0.0).multiplyScalar(SCALE_FAC).applyQuaternion(AC.quaternion).add(AC.position);\r\n            puff.spawn(dustPos.x, dustPos.y, dustPos.z, -velVec.x * 0.25 + (Math.random() - 0.5), 1 + Math.random() * 1.5, -velVec.z * 0.25 + (Math.random() - 0.5), 1 + Math.random() * 0.8, 0.25, 0.22, 0.18);\r\n          }\r\n        }\r\n\r\n        updateFire(dt, darkFactor, t);\r\n        treeColors(dt, darkFactor, t);\r\n\r\n        embers.step(dt, -0.8, 0.4, function(i, pp2, life) {\r\n          if (pp2[i * 3 + 1] > 16 + Math.random() * 5) { pp2[i * 3 + 1] = -999; life[i] = 0; return true; }\r\n          return false;\r\n        });\r\n        flames.step(dt, -4.5, 0.2, null);\r\n        smoke.step(dt, -2.4, 0.15, null);\r\n        spray.step(dt, 24, 0.7, function(i, pp2, life) {\r\n          if (pp2[i * 3 + 1] < 0.04) { pp2[i * 3 + 1] = -999; life[i] = 0; return true; }\r\n          return false;\r\n        });\r\n        waterDrop.step(dt, 16.5, 1.35, retGround);\r\n        puff.step(dt, -1.8, 1.4, function(i, pp2, life) {\r\n          if (pp2[i * 3 + 1] < gh(pp2[i * 3], pp2[i * 3 + 2]) + 0.15) { pp2[i * 3 + 1] = -999; life[i] = 0; return true; }\r\n          return false;\r\n        });\r\n        foamPool.step(dt);\r\n        wetPool.step(0);\r\n      }\r\n\r\n      perimLine.geometry.setDrawRange(0, Math.floor((sstep(19, 36, t)) * firePts.length));\r\n      var sv = (t > 24 && t < 37) ? 0.35 + 0.3 * Math.sin(tVis * 5) : 0;\r\n      solLine.material.opacity = sv; solLine.visible = sv > 0;\r\n      waterU.t.value = tVis; updateHUD(t, ph); updateCamera(dt);\r\n    }\r\n\r\n    \/* \u2500\u2500 Intersection Observer (Auto Pause when Scrolled Off-Screen) \u2500\u2500 *\/\r\n    var isVisible = true;\r\n    if (window.IntersectionObserver) {\r\n      var observer = new IntersectionObserver(function(entries) {\r\n        entries.forEach(function(entry) { isVisible = entry.isIntersecting; });\r\n      }, { threshold: 0.05 });\r\n      observer.observe(root);\r\n    }\r\n\r\n    \/* \u2500\u2500 Animation Loop \u2500\u2500 *\/\r\n    var lastRaf = performance.now();\r\n    function frame(now) {\r\n      requestAnimationFrame(frame);\r\n      var rdt = Math.min(0.05, (now - lastRaf) \/ 1000);\r\n      lastRaf = now;\r\n      if (!isVisible) return;\r\n\r\n      var dt = playing ? rdt : 0;\r\n      if (dt > 0) {\r\n        tVis += rdt;\r\n        missionT += rdt;\r\n        if (missionT >= T) { missionT -= T; resetSortie(); }\r\n      }\r\n      step(dt);\r\n      renderer.render(scene, camera);\r\n      var loader = $('fxLoader');\r\n      if (loader && !loader.classList.contains('off')) loader.classList.add('off');\r\n    }\r\n    requestAnimationFrame(frame);\r\n  }\r\n\r\n  if (document.readyState === 'loading') {\r\n    document.addEventListener('DOMContentLoaded', initFlyox);\r\n  } else {\r\n    initFlyox();\r\n  }\r\n})();\r\n<\/script>\r\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-8efff7c e-flex e-con-boxed e-con e-parent\" data-id=\"8efff7c\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-096cee8 elementor-widget elementor-widget-heading\" data-id=\"096cee8\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Why \n<span style=\"color: #FFB601\"> Volatus Aerospace?\n<\/h2>\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-7a5429e e-grid e-con-full e-con e-child\" data-id=\"7a5429e\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t<div class=\"elementor-element elementor-element-a2bffe2 e-con-full glass-card  e-flex e-con e-child\" data-id=\"a2bffe2\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-470c229 elementor-widget elementor-widget-heading\" data-id=\"470c229\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">01<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-118b70f elementor-widget elementor-widget-icon-box\" data-id=\"118b70f\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"icon-box.default\">\n\t\t\t\t\t\t\t<div class=\"elementor-icon-box-wrapper\">\n\n\t\t\t\n\t\t\t\t\t\t<div class=\"elementor-icon-box-content\">\n\n\t\t\t\t\t\t\t\t\t<h3 class=\"elementor-icon-box-title\">\n\t\t\t\t\t\t<span  >\n\t\t\t\t\t\t\tIntegrated Crewed and Uncrewed Operations \t\t\t\t\t\t<\/span>\n\t\t\t\t\t<\/h3>\n\t\t\t\t\n\t\t\t\t\t\t\t\t\t<p class=\"elementor-icon-box-description\">\n\t\t\t\t\t\tMatch the aircraft, sensor and operating model to the mission\u2014from rapid local assessment to persistent regional monitoring and heavy-lift support. \t\t\t\t\t<\/p>\n\t\t\t\t\n\t\t\t<\/div>\n\t\t\t\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-0934d73 e-con-full glass-card  e-flex e-con e-child\" data-id=\"0934d73\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-043ce84 elementor-widget elementor-widget-heading\" data-id=\"043ce84\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">02<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-fc6ba70 elementor-widget elementor-widget-icon-box\" data-id=\"fc6ba70\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"icon-box.default\">\n\t\t\t\t\t\t\t<div class=\"elementor-icon-box-wrapper\">\n\n\t\t\t\n\t\t\t\t\t\t<div class=\"elementor-icon-box-content\">\n\n\t\t\t\t\t\t\t\t\t<h3 class=\"elementor-icon-box-title\">\n\t\t\t\t\t\t<span  >\n\t\t\t\t\t\t\tDecision-Ready Intelligence \t\t\t\t\t\t<\/span>\n\t\t\t\t\t<\/h3>\n\t\t\t\t\n\t\t\t\t\t\t\t\t\t<p class=\"elementor-icon-box-description\">\n\t\t\t\t\t\tTransform visual, thermal, telemetry and geospatial data into a common operational picture that supports incident-command decisions. \t\t\t\t\t<\/p>\n\t\t\t\t\n\t\t\t<\/div>\n\t\t\t\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-6ef36b1 e-con-full glass-card  e-flex e-con e-child\" data-id=\"6ef36b1\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-ef36371 elementor-widget elementor-widget-heading\" data-id=\"ef36371\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">03<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-f97d65e elementor-widget elementor-widget-icon-box\" data-id=\"f97d65e\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"icon-box.default\">\n\t\t\t\t\t\t\t<div class=\"elementor-icon-box-wrapper\">\n\n\t\t\t\n\t\t\t\t\t\t<div class=\"elementor-icon-box-content\">\n\n\t\t\t\t\t\t\t\t\t<h3 class=\"elementor-icon-box-title\">\n\t\t\t\t\t\t<span  >\n\t\t\t\t\t\t\tMission Control and Operational Expertise \t\t\t\t\t\t<\/span>\n\t\t\t\t\t<\/h3>\n\t\t\t\t\n\t\t\t\t\t\t\t\t\t<p class=\"elementor-icon-box-description\">\n\t\t\t\t\t\tCoordinate aircraft, data and field operations through experienced mission planning, regulatory support and centralized operational oversight. \t\t\t\t\t<\/p>\n\t\t\t\t\n\t\t\t<\/div>\n\t\t\t\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-8fc3eb0 e-con-full glass-card  e-flex e-con e-child\" data-id=\"8fc3eb0\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-834a21d elementor-widget elementor-widget-heading\" data-id=\"834a21d\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">04<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-73c1112 elementor-widget elementor-widget-icon-box\" data-id=\"73c1112\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"icon-box.default\">\n\t\t\t\t\t\t\t<div class=\"elementor-icon-box-wrapper\">\n\n\t\t\t\n\t\t\t\t\t\t<div class=\"elementor-icon-box-content\">\n\n\t\t\t\t\t\t\t\t\t<h3 class=\"elementor-icon-box-title\">\n\t\t\t\t\t\t<span  >\n\t\t\t\t\t\t\tSupport That Scales \t\t\t\t\t\t<\/span>\n\t\t\t\t\t<\/h3>\n\t\t\t\t\n\t\t\t\t\t\t\t\t\t<p class=\"elementor-icon-box-description\">\n\t\t\t\t\t\tDeploy capabilities for a single incident, a regional program or a sustained national requirement while complementing existing wildfire-management resources. \t\t\t\t\t<\/p>\n\t\t\t\t\n\t\t\t<\/div>\n\t\t\t\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-a986a3d elementor-hidden-desktop elementor-hidden-tablet elementor-hidden-mobile elementor-widget elementor-widget-html\" data-id=\"a986a3d\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<style>\r\n\/* Expanded to fill the ENTIRE container *\/\r\n.vts-gravity-module {\r\n  position: absolute;\r\n  top: 0; \r\n  left: 0; \r\n  width: 100%; \r\n  height: 100%; \/* Changed from 50% *\/\r\n  min-height: 250px; \r\n  z-index: 0; \r\n  pointer-events: none; \r\n  background: transparent; \r\n  overflow: hidden; \r\n  font-family: 'Courier New', monospace; \r\n  user-select: none;\r\n}\r\n\r\n.vts-gravity-module canvas {\r\n  width: 100% !important; height: 100% !important; display: block;\r\n}\r\n<\/style>\r\n\r\n<script src=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/three.js\/r128\/three.min.js\"><\/script>\r\n<script src=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/simplex-noise\/2.4.0\/simplex-noise.min.js\"><\/script>\r\n\r\n<div class=\"vts-gravity-module\"><\/div>\r\n\r\n<script>\r\n\/\/ ==========================================\r\n\/\/ EASY CUSTOMIZATION OPTIONS\r\n\/\/ ==========================================\r\nconst VTS_CONFIG = {\r\n  particleColor: 0xFFB601, \/\/ Lighter yellow (Hex format: 0xRRGGBB)\r\n  particleOpacity: 0.3,    \/\/ Lowered opacity (0.0 is invisible, 1.0 is solid)\r\n  particleSize: 3,         \/\/ Size of the individual dots\r\n  particleCount: 2000,     \/\/ Total number of dots in the scene\r\n  flowSpeed: 0.4,          \/\/ How fast the particles flow horizontally\r\n  waveSpeed: 0.002         \/\/ How fast the 3D waves ripple\r\n};\r\n\r\n(function(){\r\n  let bootAttempts = 0;\r\n  \r\n  function bootAllModules(){\r\n    if(bootAttempts > 50) return;\r\n    bootAttempts++;\r\n\r\n    \/\/ Wait for libraries\r\n    if(!window.THREE || !window.SimplexNoise) {\r\n        setTimeout(bootAllModules, 100);\r\n        return;\r\n    }\r\n\r\n    \/\/ Find ALL wrappers on the page that haven't been initialized yet\r\n    const wrappers = document.querySelectorAll('.vts-gravity-module:not(.vts-active)');\r\n    \r\n    wrappers.forEach(wrapper => {\r\n        wrapper.classList.add('vts-active');\r\n\r\n        \/\/ ==========================================\r\n        \/\/ ELEMENTOR DOM RELOCATION FIX \r\n        \/\/ ==========================================\r\n        const parentContainer = wrapper.closest('.e-con, .e-container, .elementor-section');\r\n        if(parentContainer && wrapper.parentElement !== parentContainer) {\r\n            parentContainer.style.position = 'relative';\r\n            parentContainer.style.overflow = 'hidden';\r\n            parentContainer.insertBefore(wrapper, parentContainer.firstChild); \r\n        }\r\n\r\n        let W = wrapper.clientWidth;\r\n        let H = wrapper.clientHeight;\r\n        if (H < 100) H = 250;\r\n\r\n        \/\/ ==========================================\r\n        \/\/ ISOLATED 3D SCENE SETUP\r\n        \/\/ ==========================================\r\n        const scene = new THREE.Scene(); \r\n        const camera = new THREE.PerspectiveCamera(45, W\/H, 1, 2000); \r\n        \r\n        \/\/ Leveled the camera\r\n        camera.position.set(0, 10, 200); \r\n        camera.lookAt(0, 0, 0); \/\/ Adjusted lookAt to center\r\n\r\n        const renderer = new THREE.WebGLRenderer({alpha: true, antialias: true}); \r\n        renderer.setSize(W, H); \r\n        renderer.setPixelRatio(Math.min(window.devicePixelRatio, 2));\r\n        wrapper.appendChild(renderer.domElement);\r\n        \r\n        \/\/ ==========================================\r\n        \/\/ PARTICLE SYSTEM\r\n        \/\/ ==========================================\r\n        const particleCount = VTS_CONFIG.particleCount;\r\n        const geo = new THREE.BufferGeometry();\r\n        const posArray = new Float32Array(particleCount * 3);\r\n        const initialY = new Float32Array(particleCount);\r\n\r\n        for(let i = 0; i < particleCount; i++) {\r\n            posArray[i * 3] = (Math.random() - 0.5) * 1400; \/\/ X spread    \r\n            \/\/ Spreads particles fully across the vertical space\r\n            posArray[i * 3 + 1] = (Math.random() - 0.5) * 600;   \r\n            posArray[i * 3 + 2] = (Math.random() - 0.5) * 800; \/\/ Z spread \r\n            initialY[i] = posArray[i * 3 + 1];\r\n        }\r\n        \r\n        geo.setAttribute('position', new THREE.BufferAttribute(posArray, 3));\r\n\r\n        const canvas = document.createElement('canvas');\r\n        canvas.width = 16; canvas.height = 16;\r\n        const context = canvas.getContext('2d');\r\n        context.beginPath(); context.arc(8, 8, 8, 0, 2 * Math.PI);\r\n        context.fillStyle = '#ffffff'; context.fill();\r\n        const circleTexture = new THREE.CanvasTexture(canvas);\r\n\r\n        const mat = new THREE.PointsMaterial({ \r\n            color: VTS_CONFIG.particleColor, \r\n            size: VTS_CONFIG.particleSize, \r\n            map: circleTexture, \r\n            transparent: true, \r\n            opacity: VTS_CONFIG.particleOpacity, \r\n            alphaTest: 0.1, \r\n            sizeAttenuation: true \r\n        });\r\n        \r\n        const particles = new THREE.Points(geo, mat); \r\n        scene.add(particles);\r\n\r\n        const simplex = new SimplexNoise();\r\n        let localTime = Math.random() * 100; \r\n        \r\n        \/\/ ==========================================\r\n        \/\/ LOCAL ANIMATION LOOP\r\n        \/\/ ==========================================\r\n        function animateGrav() {\r\n            requestAnimationFrame(animateGrav);\r\n            localTime += VTS_CONFIG.waveSpeed; \r\n\r\n            const pos = geo.attributes.position.array;\r\n            \r\n            for(let i = 0; i < particleCount; i++) {\r\n                let index = i * 3;\r\n                pos[index] -= VTS_CONFIG.flowSpeed; \r\n                \r\n                if (pos[index] < -700) { pos[index] = 700; }\r\n\r\n                const x = pos[index], z = pos[index + 2];\r\n                const noiseVal = simplex.noise3D(x * 0.004, z * 0.004, localTime) * 25;\r\n                const dist = Math.sqrt(x*x + z*z);\r\n                const well = dist < 150 ? -30 * Math.cos(dist*Math.PI\/300) : 0;\r\n                \r\n                const slope = x * 0.06; \r\n                \r\n                pos[index + 1] = initialY[i] + noiseVal + well + slope;\r\n            }\r\n            \r\n            geo.attributes.position.needsUpdate = true;\r\n            renderer.render(scene, camera);\r\n        }\r\n        \r\n        animateGrav();\r\n\r\n        \/\/ ==========================================\r\n        \/\/ ISOLATED RESIZE OBSERVER\r\n        \/\/ ==========================================\r\n        let resizeTimer;\r\n        if(window.ResizeObserver) {\r\n            new ResizeObserver(()=>{\r\n              clearTimeout(resizeTimer);\r\n              resizeTimer = setTimeout(() => {\r\n                  if(!wrapper) return;\r\n                  const newW = wrapper.clientWidth;\r\n                  let newH = wrapper.clientHeight;\r\n                  if (newH < 100) newH = 250;\r\n                  \r\n                  if(newW > 0 && newH > 0 && (newW !== W || newH !== H)){\r\n                      W = newW; H = newH;\r\n                      renderer.setSize(W, H);\r\n                      camera.aspect = W \/ H;\r\n                      camera.updateProjectionMatrix();\r\n                  }\r\n              }, 200);\r\n            }).observe(parentContainer || wrapper);\r\n        }\r\n    });\r\n  }\r\n  \r\n  if(document.readyState==='complete'){ bootAllModules(); } \r\n  else { window.addEventListener('load', bootAllModules); }\r\n  document.addEventListener('DOMContentLoaded', bootAllModules);\r\n})();\r\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-a9ec683 e-flex e-con-boxed e-con e-parent\" data-id=\"a9ec683\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t<div class=\"elementor-element elementor-element-2c2865d e-con-full e-flex e-con e-child\" data-id=\"2c2865d\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t<div class=\"elementor-element elementor-element-a75b0a5 e-con-full e-flex e-con e-child\" data-id=\"a75b0a5\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t<div class=\"elementor-element elementor-element-83f3e96 e-con-full e-flex e-con e-child\" data-id=\"83f3e96\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t<div class=\"elementor-element elementor-element-b3f3dfc elementor-widget elementor-widget-icon-box\" data-id=\"b3f3dfc\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"icon-box.default\">\n\t\t\t\t\t\t\t<div class=\"elementor-icon-box-wrapper\">\n\n\t\t\t\n\t\t\t\t\t\t<div class=\"elementor-icon-box-content\">\n\n\t\t\t\t\t\t\t\t\t<h3 class=\"elementor-icon-box-title\">\n\t\t\t\t\t\t<span  >\n\t\t\t\t\t\t\tBuild a Stronger <span style=\"color: #FFB601\">Wildfire Program  \t\t\t\t\t\t<\/span>\n\t\t\t\t\t<\/h3>\n\t\t\t\t\n\t\t\t\t\t\t\t\t\t<p class=\"elementor-icon-box-description\">\n\t\t\t\t\t\tWhether you are preparing for the next fire season, strengthening persistent monitoring or evaluating autonomous aircraft for active response and recovery, Volatus can help define operational requirements, identify the right mix of capabilities and develop a pathway that works within Canada\u2019s regulatory and incident-command environment. \t\t\t\t\t<\/p>\n\t\t\t\t\n\t\t\t<\/div>\n\t\t\t\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-dd30335 elementor-widget elementor-widget-button\" data-id=\"dd30335\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"button.default\">\n\t\t\t\t\t\t\t\t\t\t<a class=\"elementor-button elementor-button-link elementor-size-sm\" href=\"https:\/\/volatusaerospace.com\/fr-ca\/contact-us\/\">\n\t\t\t\t\t\t<span class=\"elementor-button-content-wrapper\">\n\t\t\t\t\t\t\t\t\t<span class=\"elementor-button-text\">Talk to a Wildfire Response Expert<\/span>\n\t\t\t\t\t<\/span>\n\t\t\t\t\t<\/a>\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-0953d29 e-con-full e-flex e-con e-child\" data-id=\"0953d29\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-e57b403 elementor-widget elementor-widget-heading\" data-id=\"e57b403\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Frequently Asked <span style=\"color: #FFB601\">Questions<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-89e61cb va-faq elementor-widget elementor-widget-n-accordion\" data-id=\"89e61cb\" data-element_type=\"widget\" data-e-type=\"widget\" data-settings=\"{&quot;default_state&quot;:&quot;expanded&quot;,&quot;max_items_expended&quot;:&quot;one&quot;,&quot;n_accordion_animation_duration&quot;:{&quot;unit&quot;:&quot;ms&quot;,&quot;size&quot;:400,&quot;sizes&quot;:[]}}\" data-widget_type=\"nested-accordion.default\">\n\t\t\t\t\t\t\t<div class=\"e-n-accordion\" aria-label=\"Accordion. Open links with Enter or Space, close with Escape, and navigate with Arrow Keys\">\n\t\t\t\t\t\t<details id=\"e-n-accordion-item-1440\" class=\"e-n-accordion-item\" open>\n\t\t\t\t<summary class=\"e-n-accordion-item-title\" data-accordion-index=\"1\" tabindex=\"0\" aria-expanded=\"true\" aria-controls=\"e-n-accordion-item-1440\" >\n\t\t\t\t\t<span class='e-n-accordion-item-title-header'><div class=\"e-n-accordion-item-title-text\"> <span class=\"faq-no\">01<\/span>How can drones and autonomous aircraft support wildfire response?  <\/div><\/span>\n\t\t\t\t\t\t\t<span class='e-n-accordion-item-title-icon'>\n\t\t\t<span class='e-opened' ><svg aria-hidden=\"true\" class=\"e-font-icon-svg e-fas-minus\" viewBox=\"0 0 448 512\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M416 208H32c-17.67 0-32 14.33-32 32v32c0 17.67 14.33 32 32 32h384c17.67 0 32-14.33 32-32v-32c0-17.67-14.33-32-32-32z\"><\/path><\/svg><\/span>\n\t\t\t<span class='e-closed'><svg aria-hidden=\"true\" class=\"e-font-icon-svg e-fas-plus\" viewBox=\"0 0 448 512\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M416 208H272V64c0-17.67-14.33-32-32-32h-32c-17.67 0-32 14.33-32 32v144H32c-17.67 0-32 14.33-32 32v32c0 17.67 14.33 32 32 32h144v144c0 17.67 14.33 32 32 32h32c17.67 0 32-14.33 32-32V304h144c17.67 0 32-14.33 32-32v-32c0-17.67-14.33-32-32-32z\"><\/path><\/svg><\/span>\n\t\t<\/span>\n\n\t\t\t\t\t\t<\/summary>\n\t\t\t\t<div role=\"region\" aria-labelledby=\"e-n-accordion-item-1440\" class=\"elementor-element elementor-element-847aec2 e-con-full e-flex e-con e-child\" data-id=\"847aec2\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t<div role=\"region\" aria-labelledby=\"e-n-accordion-item-1440\" class=\"elementor-element elementor-element-9fc410a e-flex e-con-boxed e-con e-child\" data-id=\"9fc410a\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-451dc22 elementor-widget-mobile__width-inherit elementor-widget elementor-widget-text-editor\" data-id=\"451dc22\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\tThey can support risk assessment, early detection, thermal hotspot identification, persistent monitoring, fire-perimeter mapping, communications relay, crew resupply, aerial suppression and post-fire assessment. The appropriate platform depends on the mission, airspace and operating conditions. \t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/details>\n\t\t\t\t\t\t<details id=\"e-n-accordion-item-1441\" class=\"e-n-accordion-item\" >\n\t\t\t\t<summary class=\"e-n-accordion-item-title\" data-accordion-index=\"2\" tabindex=\"-1\" aria-expanded=\"false\" aria-controls=\"e-n-accordion-item-1441\" >\n\t\t\t\t\t<span class='e-n-accordion-item-title-header'><div class=\"e-n-accordion-item-title-text\"> <span class=\"faq-no\">02<\/span>Can Volatus support active wildfire incidents?  <\/div><\/span>\n\t\t\t\t\t\t\t<span class='e-n-accordion-item-title-icon'>\n\t\t\t<span class='e-opened' ><svg aria-hidden=\"true\" class=\"e-font-icon-svg e-fas-minus\" viewBox=\"0 0 448 512\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M416 208H32c-17.67 0-32 14.33-32 32v32c0 17.67 14.33 32 32 32h384c17.67 0 32-14.33 32-32v-32c0-17.67-14.33-32-32-32z\"><\/path><\/svg><\/span>\n\t\t\t<span class='e-closed'><svg aria-hidden=\"true\" class=\"e-font-icon-svg e-fas-plus\" viewBox=\"0 0 448 512\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M416 208H272V64c0-17.67-14.33-32-32-32h-32c-17.67 0-32 14.33-32 32v144H32c-17.67 0-32 14.33-32 32v32c0 17.67 14.33 32 32 32h144v144c0 17.67 14.33 32 32 32h32c17.67 0 32-14.33 32-32V304h144c17.67 0 32-14.33 32-32v-32c0-17.67-14.33-32-32-32z\"><\/path><\/svg><\/span>\n\t\t<\/span>\n\n\t\t\t\t\t\t<\/summary>\n\t\t\t\t<div role=\"region\" aria-labelledby=\"e-n-accordion-item-1441\" class=\"elementor-element elementor-element-c403fcc e-con-full e-flex e-con e-child\" data-id=\"c403fcc\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t<div role=\"region\" aria-labelledby=\"e-n-accordion-item-1441\" class=\"elementor-element elementor-element-6ccdc20 e-flex e-con-boxed e-con e-child\" data-id=\"6ccdc20\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-4c40192 elementor-widget-mobile__width-inherit elementor-widget elementor-widget-text-editor\" data-id=\"4c40192\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\tYes, where applicable regulatory, airspace, safety and operational requirements are met. Active wildfire airspace is complex, and every mission must be coordinated with the responsible authorities and incident-command structure. \t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/details>\n\t\t\t\t\t\t<details id=\"e-n-accordion-item-1442\" class=\"e-n-accordion-item\" >\n\t\t\t\t<summary class=\"e-n-accordion-item-title\" data-accordion-index=\"3\" tabindex=\"-1\" aria-expanded=\"false\" aria-controls=\"e-n-accordion-item-1442\" >\n\t\t\t\t\t<span class='e-n-accordion-item-title-header'><div class=\"e-n-accordion-item-title-text\"> <span class=\"faq-no\">03<\/span>What is persistent aerial intelligence?  <\/div><\/span>\n\t\t\t\t\t\t\t<span class='e-n-accordion-item-title-icon'>\n\t\t\t<span class='e-opened' ><svg aria-hidden=\"true\" class=\"e-font-icon-svg e-fas-minus\" viewBox=\"0 0 448 512\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M416 208H32c-17.67 0-32 14.33-32 32v32c0 17.67 14.33 32 32 32h384c17.67 0 32-14.33 32-32v-32c0-17.67-14.33-32-32-32z\"><\/path><\/svg><\/span>\n\t\t\t<span class='e-closed'><svg aria-hidden=\"true\" class=\"e-font-icon-svg e-fas-plus\" viewBox=\"0 0 448 512\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M416 208H272V64c0-17.67-14.33-32-32-32h-32c-17.67 0-32 14.33-32 32v144H32c-17.67 0-32 14.33-32 32v32c0 17.67 14.33 32 32 32h144v144c0 17.67 14.33 32 32 32h32c17.67 0 32-14.33 32-32V304h144c17.67 0 32-14.33 32-32v-32c0-17.67-14.33-32-32-32z\"><\/path><\/svg><\/span>\n\t\t<\/span>\n\n\t\t\t\t\t\t<\/summary>\n\t\t\t\t<div role=\"region\" aria-labelledby=\"e-n-accordion-item-1442\" class=\"elementor-element elementor-element-e8f127c e-con-full e-flex e-con e-child\" data-id=\"e8f127c\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t<div role=\"region\" aria-labelledby=\"e-n-accordion-item-1442\" class=\"elementor-element elementor-element-ed9551a e-flex e-con-boxed e-con e-child\" data-id=\"ed9551a\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-2a658e8 elementor-widget-mobile__width-inherit elementor-widget elementor-widget-text-editor\" data-id=\"2a658e8\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\tPersistent aerial intelligence combines long-endurance aircraft, sensors, communications, analytics and operational workflows to maintain an updated picture of an incident as conditions change. It helps decision-makers move from periodic observations to continuous awareness. \t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/details>\n\t\t\t\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Prot\u00e9gez les communaut\u00e9s et les \u00e9quipes gr\u00e2ce \u00e0 des solutions avanc\u00e9es de lutte contre les feux de for\u00eat. Alliant d\u00e9tection thermique des points chauds, intelligence persistante et drones lourds.<\/p>","protected":false},"author":3,"featured_media":0,"parent":29062,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"elementor_header_footer","meta":{"footnotes":"","_links_to":"","_links_to_target":""},"class_list":["post-36898","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/volatusaerospace.com\/fr-ca\/wp-json\/wp\/v2\/pages\/36898","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/volatusaerospace.com\/fr-ca\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/volatusaerospace.com\/fr-ca\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/volatusaerospace.com\/fr-ca\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/volatusaerospace.com\/fr-ca\/wp-json\/wp\/v2\/comments?post=36898"}],"version-history":[{"count":21,"href":"https:\/\/volatusaerospace.com\/fr-ca\/wp-json\/wp\/v2\/pages\/36898\/revisions"}],"predecessor-version":[{"id":37171,"href":"https:\/\/volatusaerospace.com\/fr-ca\/wp-json\/wp\/v2\/pages\/36898\/revisions\/37171"}],"up":[{"embeddable":true,"href":"https:\/\/volatusaerospace.com\/fr-ca\/wp-json\/wp\/v2\/pages\/29062"}],"wp:attachment":[{"href":"https:\/\/volatusaerospace.com\/fr-ca\/wp-json\/wp\/v2\/media?parent=36898"}],"curies":[{"name":"Bien jou\u00e9","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}