{"version":3,"sources":["../../../app/constants/math.ts","../../../app/utils/math.ts","../../../app/utils/angle.ts","../../../app/constants/earth.ts","../../../app/constants/units.ts","../../../app/utils/distance.ts","../../../app/utils/sun.ts","../../../app/utils/moon.ts","../../../app/utils/earth.ts","../../../app/utils/apparentPositionCorrections.ts","../../../app/utils/polynoms.ts","../../../app/constants/epoch.ts","../../time/constants/deltaTReference.ts","../../time/utils/deltaT.ts","../../time/utils/dateTime.ts","../utils/besselianElements.ts","../services/shadowGeometry/utils/constants.ts","../../../app/utils/location.ts","../services/shadowGeometry/utils/contourGeometry.ts","../services/shadowGeometry/utils/surface.ts","../services/shadowGeometry/utils/shadowOutline.ts","../../../app/utils/siderealTime.ts","../../../app/utils/coordinateTransformation.ts","../../../app/utils/observation.ts","../../../app/utils/riseSetTransit.ts","../../time/models/TimeOfInterest.ts","../../core/models/models/AstronomicalObject.ts","../../../app/resources/vsop87/vsop87EarthSphericalDateReduced.ts","../../../app/resources/vsop87/vsop87EarthSphericalJ2000Reduced.ts","../../../app/utils/vsop87.ts","../../earth/models/Earth.ts","../../sun/models/Sun.ts","../utils/localCircumstances.ts","../models/LocalEclipseCircumstances.ts","../utils/contacts.ts","../utils/duration.ts","../services/shadowGeometry/utils/umbraPathPolygon.ts","../utils/pathWidth.ts","../models/LocalSolarEclipse.ts","../services/shadowGeometry/utils/centralLine.ts","../services/shadowGeometry/utils/gridContour.ts","../services/shadowGeometry/utils/penumbraVisibility.ts","../services/shadowGeometry/utils/penumbraPathPolygon.ts","../services/shadowGeometry/utils/maxEclipseHorizon.ts","../services/shadowGeometry/utils/shadowBoundary.ts","../services/shadowGeometry/utils/riseSetBoundary.ts","../utils/greatestEclipse.ts","../utils/eclipseType.ts","../models/SolarEclipse.ts"],"sourcesContent":["export const DEG = Math.PI / 180;\nexport const RAD = 180 / Math.PI;\n","export function round(value: number, decimals = 0): number {\n    const p = 10 ** decimals;\n\n    return Math.round(value * p) / p;\n}\n\nexport function pad(num: number | string, size: number): string {\n    let numStr = num.toString();\n\n    while (numStr.length < size) {\n        numStr = `0${numStr}`;\n    }\n\n    return numStr;\n}\n\nexport function sin2(number: number): number {\n    return Math.sin(number) * Math.sin(number);\n}\n\nexport function cos2(number: number): number {\n    return Math.cos(number) * Math.cos(number);\n}\n","import {pad, round} from './math';\n\nexport type AnglePrefixes = {\n    positivePrefix: string;\n    negativePrefix: string;\n};\n\n/**\n * @deprecated use decimal2degreeMinutesSeconds instead\n * @param deg\n * @param short\n */\nexport function deg2angle(deg: number, short = false): string {\n    return decimal2degreeMinutesSeconds(deg, short);\n}\n\nexport function decimal2degreeMinutes(decimal: number, short = false, prefixes?: AnglePrefixes): string {\n    const sign = getSignPrefix(decimal, prefixes);\n\n    decimal = Math.abs(decimal);\n\n    const degPart = Math.floor(decimal);\n    const min = round((decimal - degPart) * 60, 5);\n\n    const degString = `${degPart}° `;\n    const minString = `${pad(min, 2)}'`;\n\n    if (short && degPart === 0.0) {\n        return sign + minString;\n    }\n\n    return sign + degString + minString;\n}\n\nexport function decimal2degreeMinutesSeconds(decimal: number, short = false, prefixes?: AnglePrefixes): string {\n    const sign = getSignPrefix(decimal, prefixes);\n\n    decimal = Math.abs(decimal);\n\n    const degPart = Math.floor(decimal);\n    const min = Math.floor((decimal - degPart) * 60);\n    const sec = round((decimal - degPart - min / 60) * 3600, 3);\n    const secParts = sec.toString().split('.');\n\n    const degString = `${degPart}° `;\n    const minString = `${pad(min, 2)}' `;\n    const secString = `${secParts.length === 1 ? pad(sec, 2) : `${pad(secParts[0], 2)}.${secParts[1]}`}\"`;\n\n    if (short && degPart === 0.0 && min === 0.0) {\n        return sign + secString;\n    }\n\n    if (short && degPart === 0.0) {\n        return sign + minString + secString;\n    }\n\n    return sign + degString + minString + secString;\n}\n\nexport function angle2deg(angle: string): number {\n    const matches = angle.match(/(-?)(\\d+)°.*?(\\d+)'.*?([\\d.]+)\"/);\n\n    if (!matches) {\n        throw new Error('false angle format');\n    }\n\n    const sign = matches[1].trim() === '-' ? -1 : 1;\n    const deg = parseInt(matches[2], 10);\n    const min = parseInt(matches[3], 10);\n    const sec = parseFloat(matches[4]);\n\n    return sign * (deg + min / 60 + sec / 3600);\n}\n\nexport function deg2time(angle: number): string {\n    const sign = angle < 0 ? '-' : '';\n    const time = Math.abs(angle / 15);\n\n    const hour = Math.floor(time);\n    const min = Math.floor((time - hour) * 60);\n    const sec = round((time - hour - min / 60) * 3600, 3);\n    const secParts = sec.toString().split('.');\n\n    const hourString = sign + hour;\n    const minString = pad(min, 2);\n    const secString = secParts.length === 1 ? pad(sec, 2) : `${pad(secParts[0], 2)}.${secParts[1]}`;\n\n    return `${hourString}h ${minString}m ${secString}s`;\n}\n\nexport function time2deg(timeAngle: string): number {\n    const matches = timeAngle.match(/(-?)(\\d+)h.*?(\\d+)m.*?([\\d.]+)s/);\n\n    if (!matches) {\n        throw new Error('false time angle format');\n    }\n\n    const sign = matches[1].trim() === '-' ? -1 : 1;\n    const deg = parseInt(matches[2], 10);\n    const min = parseInt(matches[3], 10);\n    const sec = parseFloat(matches[4]);\n\n    const angleDeg = sign * (deg + min / 60 + sec / 3600);\n\n    return angleDeg * 15;\n}\n\nexport function normalizeAngle(degrees: number, baseAngle = 360.0): number {\n    let angle = degrees % baseAngle;\n\n    if (angle < 0) {\n        angle = angle + baseAngle;\n    }\n\n    return angle;\n}\n\nexport function sec2deg(seconds: number): number {\n    return seconds / 3600;\n}\n\nfunction getSignPrefix(decimal: number, prefixes?: AnglePrefixes): string {\n    if (prefixes) {\n        return decimal < 0 ? prefixes.negativePrefix : prefixes.positivePrefix;\n    }\n\n    return decimal < 0 ? '-' : '';\n}\n","export const EARTH_EQUATORIAL_RADIUS_METERS = 6_378_137;\nexport const EARTH_EQUATORIAL_DIAMETER_METERS = 2 * EARTH_EQUATORIAL_RADIUS_METERS;\nexport const EARTH_EQUATORIAL_RADIUS_KM = EARTH_EQUATORIAL_RADIUS_METERS / 1000;\nexport const EARTH_EQUATORIAL_DIAMETER_KM = 2 * EARTH_EQUATORIAL_RADIUS_KM;\n\nexport const EARTH_AXIS_RATIO = 0.996647189335;\n\nexport const EARTH_FLATTENING = 1 - EARTH_AXIS_RATIO;\nexport const EARTH_POLAR_RADIUS_RATIO = 1 - EARTH_FLATTENING;\nexport const ECCENTRICITY_SQUARED = 2 * EARTH_FLATTENING - EARTH_FLATTENING * EARTH_FLATTENING;\n\nexport const EARTH_ROTATION_DEG_PER_HOUR = 1.002738 * 15;\nexport const EARTH_SIDEREAL_ROTATION_PER_DAY = 360.985647;\n\n// Sun's centre altitude at sunrise/sunset: -(34' refraction + 16' semi-diameter). Meeus, chapter 15.\nexport const SUNRISE_SUNSET_ALTITUDE_DEG = -0.8333;\n\nexport const EARTH_ARGUMENTS_OF_NUTATION = [\n    [0, 0, 0, 0, 1, -171996, -174.2, 92025, 8.9],\n    [0, 0, 2, -2, 2, -13187, -1.6, 5736, -3.1],\n    [0, 0, 2, 0, 2, -2274, -0.2, 977, -0.5],\n    [0, 0, 0, 0, 2, 2062, 0.2, -895, 0.5],\n    [0, 1, 0, 0, 0, 1426, -3.4, 54, -0.1],\n    [1, 0, 0, 0, 0, 712, 0.1, -7, 0.0],\n    [0, 1, 2, -2, 2, -517, 1.2, 224, -0.6],\n    [0, 0, 2, 0, 1, -386, -0.4, 200, 0.0],\n    [1, 0, 2, 0, 2, -301, 0.0, 129, -0.1],\n    [0, -1, 2, -2, 2, 217, -0.5, -95, 0.3],\n    [1, 0, 0, -2, 0, -158, 0.0, -1, 0.0],\n    [0, 0, 2, -2, 1, 129, 0.1, -70, 0.0],\n    [-1, 0, 2, 0, 2, 123, 0.0, -53, 0.0],\n    [0, 0, 0, 2, 0, 63, 0.0, -2, 0.0],\n    [1, 0, 0, 0, 1, 63, 0.1, -33, 0.0],\n    [-1, 0, 2, 2, 2, -59, 0.0, 26, 0.0],\n    [-1, 0, 0, 0, 1, -58, -0.1, 32, 0.0],\n    [1, 0, 2, 0, 1, -51, 0.0, 27, 0.0],\n    [2, 0, 0, -2, 0, 48, 0.0, 1, 0.0],\n    [-2, 0, 2, 0, 1, 46, 0.0, -24, 0.0],\n    [0, 0, 2, 2, 2, -38, 0.0, 16, 0.0],\n    [2, 0, 2, 0, 2, -31, 0.0, 13, 0.0],\n    [2, 0, 0, 0, 0, 29, 0.0, -1, 0.0],\n    [1, 0, 2, -2, 2, 29, 0.0, -12, 0.0],\n    [0, 0, 2, 0, 0, 26, 0.0, -1, 0.0],\n    [0, 0, 2, -2, 0, -22, 0.0, 0, 0.0],\n    [-1, 0, 2, 0, 1, 21, 0.0, -10, 0.0],\n    [0, 2, 0, 0, 0, 17, -0.1, 0, 0.0],\n    [0, 2, 2, -2, 2, -16, 0.1, 7, 0.0],\n    [-1, 0, 0, 2, 1, 16, 0.0, -8, 0.0],\n    [0, 1, 0, 0, 1, -15, 0.0, 9, 0.0],\n    [1, 0, 0, -2, 1, -13, 0.0, 7, 0.0],\n    [0, -1, 0, 0, 1, -12, 0.0, 6, 0.0],\n    [2, 0, -2, 0, 0, 11, 0.0, 0, 0.0],\n    [-1, 0, 2, 2, 1, -10, 0.0, 5, 0.0],\n    [1, 0, 2, 2, 2, -8, 0.0, 3, 0.0],\n    [1, 1, 0, -2, 0, -7, 0.0, 0, 0.0],\n    [0, 1, 2, 0, 2, 7, 0.0, -3, 0.0],\n    [0, -1, 2, 0, 2, -7, 0.0, 3, 0.0],\n    [0, 0, 2, 2, 1, -7, 0.0, 3, 0.0],\n    [-2, 0, 0, 2, 1, -6, 0.0, 3, 0.0],\n    [1, 0, 0, 2, 0, 6, 0.0, 0, 0.0],\n    [2, 0, 2, -2, 2, 6, 0.0, -3, 0.0],\n    [0, 0, 0, 2, 1, -6, 0.0, 3, 0.0],\n    [1, 0, 2, -2, 1, 6, 0.0, -3, 0.0],\n    [0, -1, 2, -2, 1, -5, 0.0, 3, 0.0],\n    [0, 0, 0, -2, 1, -5, 0.0, 3, 0.0],\n    [1, -1, 0, 0, 0, 5, 0.0, 0, 0.0],\n    [2, 0, 2, 0, 1, -5, 0.0, 3, 0.0],\n    [2, 0, 0, -2, 1, 4, 0.0, -2, 0.0],\n    [0, 1, 2, -2, 1, 4, 0.0, -2, 0.0],\n    [1, 0, 0, -1, 0, -4, 0.0, 0, 0.0],\n    [0, 1, 0, -2, 0, -4, 0.0, 0, 0.0],\n    [1, 0, -2, 0, 0, 4, 0.0, 0, 0.0],\n    [0, 0, 0, 1, 0, -4, 0.0, 0, 0.0],\n    [-2, 0, 2, 0, 2, -3, 0.0, 1, 0.0],\n    [1, -1, 0, -1, 0, -3, 0.0, 0, 0.0],\n    [1, 1, 0, 0, 0, -3, 0.0, 0, 0.0],\n    [1, 0, 2, 0, 0, 3, 0.0, 0, 0.0],\n    [1, -1, 2, 0, 2, -3, 0.0, 1, 0.0],\n    [-1, -1, 2, 2, 2, -3, 0.0, 1, 0.0],\n    [3, 0, 2, 0, 2, -3, 0.0, 1, 0.0],\n    [0, -1, 2, 2, 2, -3, 0.0, 1, 0.0],\n    [0, -2, 2, -2, 1, -2, 0.0, 1, 0.0],\n    [-2, 0, 0, 0, 1, -2, 0.0, 1, 0.0],\n    [1, 1, 2, 0, 2, 2, 0.0, -1, 0.0],\n    [-1, 0, 2, -2, 1, -2, 0.0, 1, 0.0],\n    [2, 0, 0, 0, 1, 2, 0.0, -1, 0.0],\n    [1, 0, 0, 0, 2, -2, 0.0, 1, 0.0],\n    [3, 0, 0, 0, 0, 2, 0.0, 0, 0.0],\n    [0, 0, 2, 1, 2, 2, 0.0, -1, 0.0],\n    [-1, 0, 2, 4, 2, -2, 0.0, 1, 0.0],\n    [2, 0, -2, 0, 1, 1, 0.0, 0, 0.0],\n    [2, 1, 0, -2, 0, 1, 0.0, 0, 0.0],\n    [0, 0, -2, 2, 1, 1, 0.0, 0, 0.0],\n    [0, 1, -2, 2, 0, -1, 0.0, 0, 0.0],\n    [0, 1, 0, 0, 2, 1, 0.0, 0, 0.0],\n    [-1, 0, 0, 1, 1, 1, 0.0, 0, 0.0],\n    [0, 1, 2, -2, 0, -1, 0.0, 0, 0.0],\n    [-1, 0, 0, 0, 2, 1, 0.0, -1, 0.0],\n    [1, 0, 0, -4, 0, -1, 0.0, 0, 0.0],\n    [-2, 0, 2, 2, 2, 1, 0.0, -1, 0.0],\n    [2, 0, 0, -4, 0, -1, 0.0, 0, 0.0],\n    [1, 1, 2, -2, 2, 1, 0.0, -1, 0.0],\n    [1, 0, 2, 2, 1, -1, 0.0, 1, 0.0],\n    [-2, 0, 2, 4, 2, -1, 0.0, 1, 0.0],\n    [-1, 0, 4, 0, 2, 1, 0.0, 0, 0.0],\n    [1, -1, 0, -2, 0, 1, 0.0, 0, 0.0],\n    [2, 0, 2, -2, 1, 1, 0.0, -1, 0.0],\n    [2, 0, 2, 2, 2, -1, 0.0, 0, 0.0],\n    [1, 0, 0, 2, 1, -1, 0.0, 0, 0.0],\n    [0, 0, 4, -2, 2, 1, 0.0, 0, 0.0],\n    [3, 0, 2, -2, 2, 1, 0.0, 0, 0.0],\n    [1, 0, 2, -2, 0, -1, 0.0, 0, 0.0],\n    [0, 1, 2, 0, 1, 1, 0.0, 0, 0.0],\n    [-1, -1, 0, 2, 1, 1, 0.0, 0, 0.0],\n    [0, 0, -2, 0, 1, -1, 0.0, 0, 0.0],\n    [0, 0, 2, -1, 2, -1, 0.0, 0, 0.0],\n    [0, 1, 0, 2, 0, -1, 0.0, 0, 0.0],\n    [1, 0, -2, -2, 0, -1, 0.0, 0, 0.0],\n    [0, -1, 2, 0, 1, -1, 0.0, 0, 0.0],\n    [1, 1, 0, -2, 1, -1, 0.0, 0, 0.0],\n    [1, 0, -2, 2, 0, -1, 0.0, 0, 0.0],\n    [2, 0, 0, 2, 0, 1, 0.0, 0, 0.0],\n    [0, 0, 2, 4, 2, -1, 0.0, 0, 0.0],\n    [0, 1, 0, 1, 0, 1, 0.0, 0, 0.0],\n];\n","export const ASTRONOMICAL_UNIT_IN_METERS = 149_597_870_700.0;\nexport const LIGHT_SPEED_KM_PER_SEC = 299_792.458;\n","import {DEG} from '@app/constants/math';\nimport {EARTH_EQUATORIAL_RADIUS_METERS, EARTH_FLATTENING} from '../constants/earth';\nimport {ASTRONOMICAL_UNIT_IN_METERS} from '../constants/units';\nimport type {LatLon} from '../types/LocationTypes';\nimport {cos2, sin2} from './math';\n\nexport function au2km(R: number): number {\n    return R * (ASTRONOMICAL_UNIT_IN_METERS / 1000);\n}\n\nexport function km2au(km: number): number {\n    return km / (ASTRONOMICAL_UNIT_IN_METERS / 1000);\n}\n\nexport function getDistanceInKm(location1: LatLon, location2: LatLon): number {\n    const {lat: lat1, lon: lon1} = location1;\n    const {lat: lat2, lon: lon2} = location2;\n\n    // Meeus 11\n    const F = (lat1 + lat2) / 2;\n    const G = (lat1 - lat2) / 2;\n    const lambda = (lon2 - lon1) / 2;\n\n    const FRad = F * DEG;\n    const GRad = G * DEG;\n    const lambdaRad = lambda * DEG;\n\n    const S = sin2(GRad) * cos2(lambdaRad) + cos2(FRad) * sin2(lambdaRad);\n    const C = cos2(GRad) * cos2(lambdaRad) + sin2(FRad) * sin2(lambdaRad);\n\n    const omegaRad = Math.atan(Math.sqrt(S / C));\n\n    const R = Math.sqrt(S * C) / omegaRad;\n    const D = (2 * omegaRad * EARTH_EQUATORIAL_RADIUS_METERS) / 1000;\n    const H1 = (3 * R - 1) / (2 * C);\n    const H2 = (3 * R + 1) / (2 * S);\n\n    return D * (1 + EARTH_FLATTENING * H1 * sin2(FRad) * cos2(GRad) - EARTH_FLATTENING * H2 * cos2(FRad) * sin2(GRad));\n}\n","import {DEG} from '@app/constants/math';\nimport {normalizeAngle} from '@app/utils/angle';\n\nexport function getMeanAnomaly(T: number): number {\n    // Meeus 47.4\n    const M = 357.5291092 + 35999.0502909 * T - 0.0001536 * T ** 2 + T ** 3 / 2449000;\n\n    return normalizeAngle(M);\n}\n\nexport function getTrueAnomaly(T: number): number {\n    // Meeus 25.4\n    const M = getMeanAnomaly(T);\n    const C = getEquationOfCenter(T);\n\n    return M + C;\n}\n\nexport function getMeanLongitude(T: number): number {\n    const t = T / 10;\n\n    // Meeus 28.2\n    const L0 =\n        280.4664567 + 360007.6982779 * t + 0.03042028 * t ** 2 + t ** 3 / 49931 - t ** 4 / 15300 + t ** 5 / 2000000;\n\n    return normalizeAngle(L0);\n}\n\nexport function getTrueLongitude(T: number): number {\n    // Meeus 25.4\n    const L0 = getMeanLongitude(T);\n    const C = getEquationOfCenter(T);\n\n    return L0 + C;\n}\n\nexport function getApparentLongitude(T: number): number {\n    // Meeus 25.5\n    const o = getTrueLongitude(T);\n\n    const omega = 125.04 - 1934.136 * T;\n    const omegaRad = omega * DEG;\n\n    return o - 0.00569 - 0.00478 * Math.sin(omegaRad);\n}\n\nexport function getEquationOfCenter(T: number): number {\n    const M = getMeanAnomaly(T);\n\n    // Meeus 25.4\n    let C = (1.914602 - 0.004817 * T - 0.000014 * T ** 2) * Math.sin(M * DEG);\n    C += (0.019993 - 0.000101 * T) * Math.sin(2 * M * DEG);\n    C += 0.000289 * Math.sin(3 * M * DEG);\n\n    return C;\n}\n","import {DEG, RAD} from '@app/constants/math';\nimport {MOON_ARGUMENTS_B, MOON_ARGUMENTS_LR} from '@app/constants/moon';\nimport {normalizeAngle} from '@app/utils/angle';\nimport {km2au} from '@app/utils/distance';\nimport * as earth from '@app/utils/earth';\nimport * as sun from '@app/utils/sun';\n\nexport function getMeanElongation(T: number): number {\n    // Meeus 47.2\n    const D = 297.8501921 + 445267.1114034 * T - 0.0018819 * T ** 2 + T ** 3 / 545868 - T ** 4 / 113065000;\n\n    return normalizeAngle(D);\n}\n\nexport function getMeanAnomaly(T: number): number {\n    // Meeus 47.2\n    const Mmoon = 134.9633964 + 477198.8675055 * T + 0.0087414 * T ** 2 + T ** 3 / 69699 - T ** 4 / 1471200;\n\n    return normalizeAngle(Mmoon);\n}\n\nexport function getArgumentOfLatitude(T: number): number {\n    // Meeus 47.5\n    const F = 93.272095 + 483202.0175233 * T - 0.0036539 * T ** 2 - T ** 3 / 352600 + T ** 4 / 86331000;\n\n    return normalizeAngle(F);\n}\n\nexport function getMeanLongitude(T: number): number {\n    // Meeus 47.1\n    const L = 218.3164477 + 481267.88123421 * T - 0.0015786 * T ** 2 + T ** 3 / 538841 - T ** 4 / 65194000;\n\n    return normalizeAngle(L);\n}\n\nexport function getMeanLongitudeOfAscendingNode(T: number): number {\n    return 125.0445479 - 1934.1362891 * T + 0.0020754 * T ** 2 + T ** 3 / 467441 - T ** 4 / 60616000;\n}\n\nexport function getEquatorialHorizontalParallax(T: number): number {\n    const d = getDistanceToEarth(T);\n\n    // Meeus 47\n    return Math.asin(6378.14 / d) * RAD;\n}\n\nexport function getLongitude(T: number): number {\n    const L = getMeanLongitude(T);\n    const sumL = getSumL(T);\n\n    return L + sumL / 1000000;\n}\n\nexport function getLatitude(T: number): number {\n    const sumB = getSumB(T);\n\n    return sumB / 1000000;\n}\n\nexport function getRadiusVector(T: number): number {\n    return km2au(getDistanceToEarth(T));\n}\n\nexport function getDistanceToEarth(T: number): number {\n    const sumR = getSumR(T);\n\n    return 385000.56 + sumR / 1000;\n}\n\nfunction getSumR(T: number): number {\n    // Meeus 47.b\n    const D = getMeanElongation(T);\n    const Msun = sun.getMeanAnomaly(T);\n    const Mmoon = getMeanAnomaly(T);\n    const F = getArgumentOfLatitude(T);\n\n    // Action of jupiter\n    const E = 1 - 0.002516 * T - 0.0000074 * T ** 2;\n\n    let sumR = 0;\n    MOON_ARGUMENTS_LR.forEach((args: Array<number>) => {\n        const argD = args[0];\n        const argMsun = args[1];\n        const argMmoon = args[2];\n        const argF = args[3];\n        const argSumR = args[5];\n\n        let tmpSumR = Math.cos((argD * D + argMsun * Msun + argMmoon * Mmoon + argF * F) * DEG);\n\n        switch (argMsun) {\n            case 1:\n            case -1:\n                tmpSumR = tmpSumR * argSumR * E;\n                break;\n            case 2:\n            case -2:\n                tmpSumR = tmpSumR * argSumR * E * E;\n                break;\n            default:\n                tmpSumR = tmpSumR * argSumR;\n                break;\n        }\n\n        sumR += tmpSumR;\n    });\n\n    return sumR;\n}\n\nfunction getSumL(T: number): number {\n    // Meeus 47.b\n    const L = getMeanLongitude(T);\n    const D = getMeanElongation(T);\n    const Msun = sun.getMeanAnomaly(T);\n    const Mmoon = getMeanAnomaly(T);\n    const F = getArgumentOfLatitude(T);\n\n    // Action of venus\n    const A1 = 119.75 + 131.849 * T;\n    // Action of jupiter\n    const A2 = 53.09 + 479264.29 * T;\n    const E = 1 - 0.002516 * T - 0.0000074 * T ** 2;\n\n    let sumL = 3958 * Math.sin(A1 * DEG) + 1962 * Math.sin((L - F) * DEG) + 318 * Math.sin(A2 * DEG);\n\n    MOON_ARGUMENTS_LR.forEach((args: Array<number>) => {\n        const argD = args[0];\n        const argMsun = args[1];\n        const argMmoon = args[2];\n        const argF = args[3];\n        const argSumL = args[4];\n\n        let tmpSumL = Math.sin((argD * D + argMsun * Msun + argMmoon * Mmoon + argF * F) * DEG);\n\n        switch (argMsun) {\n            case 1:\n            case -1:\n                tmpSumL = tmpSumL * argSumL * E;\n                break;\n            case 2:\n            case -2:\n                tmpSumL = tmpSumL * argSumL * E * E;\n                break;\n            default:\n                tmpSumL = tmpSumL * argSumL;\n                break;\n        }\n\n        sumL += tmpSumL;\n    });\n\n    return sumL;\n}\n\nfunction getSumB(T: number): number {\n    // Meeus 47.B\n    const L = getMeanLongitude(T);\n    const D = getMeanElongation(T);\n    const Msun = sun.getMeanAnomaly(T);\n    const Mmoon = getMeanAnomaly(T);\n    const F = getArgumentOfLatitude(T);\n\n    // Action of venus\n    const A1 = 119.75 + 131.849 * T;\n    // Action of jupiter\n    const A3 = 313.45 + 481266.484 * T;\n    const E = 1 - 0.002516 * T - 0.0000074 * T ** 2;\n\n    let sumB =\n        -2235 * Math.sin(L * DEG)\n        + 382 * Math.sin(A3 * DEG)\n        + 175 * Math.sin((A1 - F) * DEG)\n        + 175 * Math.sin((A1 + F) * DEG)\n        + 127 * Math.sin((L - Mmoon) * DEG)\n        - 115 * Math.sin((L + Mmoon) * DEG);\n\n    MOON_ARGUMENTS_B.forEach((args: Array<number>) => {\n        const argD = args[0];\n        const argMsun = args[1];\n        const argMmoon = args[2];\n        const argF = args[3];\n        const argSumB = args[4];\n\n        let tmpSumB = Math.sin((argD * D + argMsun * Msun + argMmoon * Mmoon + argF * F) * DEG);\n\n        switch (argMsun) {\n            case 1:\n            case -1:\n                tmpSumB = tmpSumB * argSumB * E;\n                break;\n            case 2:\n            case -2:\n                tmpSumB = tmpSumB * argSumB * E ** 2;\n                break;\n            default:\n                tmpSumB = tmpSumB * argSumB;\n                break;\n        }\n\n        sumB += tmpSumB;\n    });\n\n    return sumB;\n}\n\nexport function getOpticalLiberationInLongitude(longitude: number, latitude: number, T: number): number {\n    const latRad = latitude * DEG;\n\n    const i = 1.54242;\n    const iRad = i * DEG;\n\n    const phi = earth.getNutationInLongitude(T);\n    const F = getArgumentOfLatitude(T);\n    const Omega = getMeanLongitudeOfAscendingNode(T);\n\n    // Meeus 53.1\n    const W = normalizeAngle(longitude - phi - Omega);\n    const WRad = W * DEG;\n\n    const ARad = Math.atan2(\n        Math.sin(WRad) * Math.cos(latRad) * Math.cos(iRad) - Math.sin(latRad) * Math.sin(iRad),\n        Math.cos(WRad) * Math.cos(latRad),\n    );\n    const A = normalizeAngle(ARad * RAD);\n\n    return A - F;\n}\n\nexport function getOpticalLiberationInLatitude(longitude: number, latitude: number, T: number): number {\n    const latRad = latitude * DEG;\n\n    const i = 1.54242;\n    const iRad = i * DEG;\n\n    const phi = earth.getNutationInLongitude(T);\n    const Omega = getMeanLongitudeOfAscendingNode(T);\n\n    // Meeus 53.1\n    const W = normalizeAngle(longitude - phi - Omega);\n    const WRad = W * DEG;\n\n    const bRad = Math.asin(-1 * Math.sin(WRad) * Math.cos(latRad) * Math.sin(iRad) - Math.sin(latRad) * Math.cos(iRad));\n\n    return bRad * RAD;\n}\n","import {EARTH_ARGUMENTS_OF_NUTATION} from '@app/constants/earth';\nimport {DEG} from '@app/constants/math';\nimport {normalizeAngle} from '@app/utils/angle';\nimport * as moon from '@app/utils/moon';\nimport * as sun from '@app/utils/sun';\n\nexport function getMeanAnomaly(T: number): number {\n    // Meeus 47.4\n    const M = 357.5291092 + 35999.0502909 * T - 0.0001536 * T ** 2 + T ** 3 / 2449000;\n\n    return normalizeAngle(M);\n}\n\nexport function getEccentricity(T: number): number {\n    // Meeus 25.4\n    return 0.016708634 - 0.000042037 * T - 0.0000001267 * T ** 2;\n}\n\nexport function getLongitudeOfPerihelionOfOrbit(T: number): number {\n    // Meeus 23\n    return 102.93735 + 1.71946 * T + 0.00046 * T ** 2;\n}\n\nexport function getMeanObliquityOfEcliptic(T: number): number {\n    const U = T / 100;\n\n    // Meeus 22.3\n    const eps0 =\n        84381.448\n        - 4680.93 * U\n        - 1.55 * U ** 2\n        + 1999.25 * U ** 3\n        - 51.38 * U ** 4\n        - 249.67 * U ** 5\n        - 39.05 * U ** 6\n        + 7.12 * U ** 7\n        + 27.87 * U ** 8\n        + 5.79 * U ** 9\n        + 2.45 * U ** 10;\n\n    return eps0 / 3600;\n}\n\nexport function getTrueObliquityOfEcliptic(T: number): number {\n    const eps0 = getMeanObliquityOfEcliptic(T);\n    const sumEps = getNutationInObliquity(T);\n\n    // Meeus chapter 22\n    return eps0 + sumEps;\n}\n\nexport function getNutationInLongitude(T: number): number {\n    // Meeus chapter 22\n    const D = moon.getMeanElongation(T);\n    const Msun = sun.getMeanAnomaly(T);\n    const Mmoon = moon.getMeanAnomaly(T);\n    const F = moon.getArgumentOfLatitude(T);\n\n    // Longitude of the ascending node of moon's mean orbit on ecliptic\n    const O = 125.04452 - 1934.136261 * T + 0.0020708 * T ** 2 + T ** 3 / 450000;\n\n    let sumPhi = 0;\n    EARTH_ARGUMENTS_OF_NUTATION.forEach((args) => {\n        const argMmoon = args[0]; // Mean anomaly of moon\n        const argMsun = args[1]; // Mean anomaly of sun\n        const argF = args[2]; // Mean argument of perigee\n        const argD = args[3]; // Mean elongation of moon\n        const argO = args[4]; // Mean length of ascending knot of moon's orbit\n        const argPhi1 = args[5];\n        const argPhi2 = args[6];\n\n        const tmpSum = argD * D + argMsun * Msun + argMmoon * Mmoon + argF * F + argO * O;\n\n        sumPhi += Math.sin(tmpSum * DEG) * (argPhi1 + argPhi2 * T);\n    });\n\n    return (sumPhi * 0.0001) / 3600;\n}\n\nexport function getNutationInObliquity(T: number): number {\n    // Meeus chapter 22\n    const D = moon.getMeanElongation(T);\n    const Msun = sun.getMeanAnomaly(T);\n    const Mmoon = moon.getMeanAnomaly(T);\n    const F = moon.getArgumentOfLatitude(T);\n\n    // Longitude of the ascending node of moon's mean orbit on ecliptic\n    const O = 125.04452 - 1934.136261 * T + 0.0020708 * T ** 2 + T ** 3 / 450000;\n\n    let sumEps = 0;\n    EARTH_ARGUMENTS_OF_NUTATION.forEach((args) => {\n        const argMmoon = args[0]; // Mean anomaly of moon\n        const argMsun = args[1]; // Mean anomaly of sun\n        const argF = args[2]; // Mean argument of perigee\n        const argD = args[3]; // Mean elongation of moon\n        const argO = args[4]; // Mean length of ascending knot of moon's orbit\n        const argEps1 = args[7];\n        const argEps2 = args[8];\n\n        const tmpSum = argD * D + argMsun * Msun + argMmoon * Mmoon + argF * F + argO * O;\n\n        sumEps += Math.cos(tmpSum * DEG) * (argEps1 + argEps2 * T);\n    });\n\n    return (sumEps * 0.0001) / 3600;\n}\n","import {DEG} from '@app/constants/math';\nimport {sec2deg} from '@app/utils/angle';\nimport * as earth from '@app/utils/earth';\nimport * as sun from '@app/utils/sun';\nimport type {EclipticSphericalCoordinates} from '../types/CoordinateTypes';\n\nexport function getLightTimeCorrectedJulianDay(jd: number, d: number): number {\n    // Meeus 33.3\n    const theta = 0.0057755183 * d;\n\n    return jd - theta;\n}\n\nexport function correctEffectOfNutation(coords: EclipticSphericalCoordinates, T: number): EclipticSphericalCoordinates {\n    const phi = earth.getNutationInLongitude(T);\n\n    return {\n        lon: coords.lon + phi,\n        lat: coords.lat,\n        radiusVector: coords.radiusVector,\n    };\n}\n\nexport function correctEffectOfAberration(\n    coords: EclipticSphericalCoordinates,\n    T: number,\n): EclipticSphericalCoordinates {\n    // TODO Better formula with Ron-Vondrak expression\n    const lonSun = sun.getTrueLongitude(T);\n    const e = earth.getEccentricity(T);\n    const pi = earth.getLongitudeOfPerihelionOfOrbit(T);\n    const k = sec2deg(20.49552);\n\n    const lonRad = coords.lon * DEG;\n    const latRad = coords.lat * DEG;\n    const lonSunRad = lonSun * DEG;\n    const piRad = pi * DEG;\n\n    const dLon = (-1 * k * Math.cos(lonSunRad - lonRad) + e * k * Math.cos(piRad - lonRad)) / Math.cos(latRad);\n    const dLat = -1 * k * Math.sin(latRad) * (Math.sin(lonSunRad - lonRad) - e * Math.sin(piRad - lonRad));\n\n    return {\n        lon: coords.lon + dLon,\n        lat: coords.lat + dLat,\n        radiusVector: coords.radiusVector,\n    };\n}\n\nexport function correctEffectOfRefraction(altitude: number): number {\n    if (altitude < -5) {\n        return altitude;\n    }\n\n    // Meeus 16.4\n    const R = 1.02 / Math.tan((altitude + 10.3 / (altitude + 5.11)) * DEG);\n\n    return altitude + R / 60;\n}\n","export function polynomial(coefs: Array<number>, tau: number): number {\n    let value = 0;\n    let power = 1;\n    for (const c of coefs) {\n        value += c * power;\n        power *= tau;\n    }\n\n    return value;\n}\n\nexport function polynomialDerivative(coefs: Array<number>, tau: number): number {\n    let value = 0;\n    let power = 1;\n    for (let i = 1; i < coefs.length; i++) {\n        value += i * coefs[i] * power;\n        power *= tau;\n    }\n\n    return value;\n}\n","export const EPOCH_J1900 = 2415020.0;\nexport const EPOCH_J1950 = 2433282.5;\nexport const EPOCH_J2000 = 2451545.0;\nexport const EPOCH_J2100 = 2488070.0;\n","// Observed and predicted ΔT (TT − UT1) in seconds as [decimalYear, ΔT] nodes, sorted by year.\n// The decimal year of each observed monthly value is its start-of-month instant, so intra-year\n// (monthly) queries interpolate between the true data points instead of between yearly averages.\n// 1657.0-1972.5 historic (½-yearly):  https://maia.usno.navy.mil/ser7/historic_deltat.data\n// 1973.1-2026.2 observed (monthly):   https://maia.usno.navy.mil/ser7/deltat.data\n// 2026.5-2033.8 predicted (¼-yearly): https://maia.usno.navy.mil/ser7/deltat.preds\n// biome-ignore format: dense data table, kept compact for readability\nexport const REFERENCE_DELTA_T: Array<[number, number]> = [\n    [1657, 44], [1657.5, 43], [1658, 43], [1658.5, 41], [1659, 40], [1659.5, 39],\n    [1660, 38], [1660.5, 37], [1661, 37], [1661.5, 36], [1662, 36], [1662.5, 36],\n    [1663, 37], [1663.5, 37], [1664, 38], [1664.5, 37], [1665, 36], [1665.5, 36],\n    [1666, 35], [1666.5, 35], [1667, 34], [1667.5, 33], [1668, 33], [1668.5, 32],\n    [1669, 32], [1669.5, 31], [1670, 31], [1670.5, 30], [1671, 30], [1671.5, 29],\n    [1672, 29], [1672.5, 29], [1673, 29], [1673.5, 29], [1674, 28], [1674.5, 28],\n    [1675, 27], [1675.5, 27], [1676, 26], [1676.5, 26], [1677, 25], [1677.5, 25],\n    [1678, 25], [1678.5, 26], [1679, 26], [1679.5, 26], [1680, 26], [1680.5, 25],\n    [1681, 25], [1681.5, 25], [1682, 24], [1682.5, 24], [1683, 24], [1683.5, 24],\n    [1684, 24], [1684.5, 24], [1685, 24], [1685.5, 24], [1686, 24], [1686.5, 24],\n    [1687, 23], [1687.5, 23], [1688, 23], [1688.5, 23], [1689, 22], [1689.5, 22],\n    [1690, 22], [1690.5, 22], [1691, 22], [1691.5, 21], [1692, 21], [1692.5, 21],\n    [1693, 21], [1693.5, 21], [1694, 21], [1694.5, 21], [1695, 21], [1695.5, 20],\n    [1696, 20], [1696.5, 20], [1697, 20], [1697.5, 20], [1698, 20], [1698.5, 20],\n    [1699, 20], [1699.5, 20], [1700, 21], [1700.5, 21], [1701, 21], [1701.5, 20],\n    [1702, 20], [1702.5, 20], [1703, 20], [1703.5, 20], [1704, 19], [1704.5, 19],\n    [1705, 19], [1705.5, 19], [1706, 19], [1706.5, 20], [1707, 20], [1707.5, 20],\n    [1708, 20], [1708.5, 19], [1709, 20], [1709.5, 20], [1710, 20], [1710.5, 20],\n    [1711, 20], [1711.5, 20], [1712, 21], [1712.5, 21], [1713, 21], [1713.5, 21],\n    [1714, 21], [1714.5, 21], [1715, 21], [1715.5, 21], [1716, 21], [1716.5, 21],\n    [1717, 21], [1717.5, 21], [1718, 21], [1718.5, 21], [1719, 21], [1719.5, 21],\n    [1720, 21.1], [1720.5, 21], [1721, 21], [1721.5, 21], [1722, 20.9], [1722.5, 20.8],\n    [1723, 20.7], [1723.5, 20.6], [1724, 20.4], [1724.5, 20.2], [1725, 20], [1725.5, 19.7],\n    [1726, 19.4], [1726.5, 19.1], [1727, 18.7], [1727.5, 18.3], [1728, 17.8], [1728.5, 17.4],\n    [1729, 17], [1729.5, 16.8], [1730, 16.6], [1730.5, 16.4], [1731, 16.1], [1731.5, 15.9],\n    [1732, 15.7], [1732.5, 15.5], [1733, 15.3], [1733.5, 15], [1734, 14.7], [1734.5, 14.5],\n    [1735, 14.3], [1735.5, 14.2], [1736, 14.1], [1736.5, 14.1], [1737, 14.1], [1737.5, 13.9],\n    [1738, 13.7], [1738.5, 13.6], [1739, 13.5], [1739.5, 13.5], [1740, 13.5], [1740.5, 13.5],\n    [1741, 13.4], [1741.5, 13.4], [1742, 13.4], [1742.5, 13.4], [1743, 13.3], [1743.5, 13.3],\n    [1744, 13.2], [1744.5, 13.2], [1745, 13.2], [1745.5, 13.1], [1746, 13.1], [1746.5, 13.1],\n    [1747, 13], [1747.5, 13.2], [1748, 13.3], [1748.5, 13.4], [1749, 13.5], [1749.5, 13.6],\n    [1750, 13.7], [1750.5, 13.8], [1751, 13.9], [1751.5, 14], [1752, 14], [1752.5, 14.1],\n    [1753, 14.1], [1753.5, 14.1], [1754, 14.1], [1754.5, 14.2], [1755, 14.3], [1755.5, 14.4],\n    [1756, 14.4], [1756.5, 14.5], [1757, 14.6], [1757.5, 14.6], [1758, 14.7], [1758.5, 14.7],\n    [1759, 14.7], [1759.5, 14.8], [1760, 14.8], [1760.5, 14.9], [1761, 14.9], [1761.5, 15],\n    [1762, 15], [1762.5, 15.1], [1763, 15.2], [1763.5, 15.3], [1764, 15.4], [1764.5, 15.5],\n    [1765, 15.6], [1765.5, 15.6], [1766, 15.6], [1766.5, 15.8], [1767, 15.9], [1767.5, 15.9],\n    [1768, 15.9], [1768.5, 15.8], [1769, 15.7], [1769.5, 15.8], [1770, 15.7], [1770.5, 15.7],\n    [1771, 15.7], [1771.5, 15.8], [1772, 15.9], [1772.5, 16.1], [1773, 16.1], [1773.5, 16],\n    [1774, 15.9], [1774.5, 15.9], [1775, 15.7], [1775.5, 15.4], [1776, 15.3], [1776.5, 15.4],\n    [1777, 15.5], [1777.5, 15.6], [1778, 15.6], [1778.5, 15.6], [1779, 15.6], [1779.5, 15.6],\n    [1780, 15.6], [1780.5, 15.6], [1781, 15.5], [1781.5, 15.5], [1782, 15.4], [1782.5, 15.3],\n    [1783, 15.2], [1783.5, 15.1], [1784, 14.9], [1784.5, 14.8], [1785, 14.6], [1785.5, 14.4],\n    [1786, 14.3], [1786.5, 14.2], [1787, 14.1], [1787.5, 14.2], [1788, 14.2], [1788.5, 13.9],\n    [1789, 13.7], [1789.5, 13.5], [1790, 13.3], [1790.5, 13.1], [1791, 13], [1791.5, 13.2],\n    [1792, 13.2], [1792.5, 13.1], [1793, 13.1], [1793.5, 13.2], [1794, 13.3], [1794.5, 13.5],\n    [1795, 13.5], [1795.5, 13.4], [1796, 13.2], [1796.5, 13.2], [1797, 13.1], [1797.5, 13.1],\n    [1798, 13], [1798.5, 12.8], [1799, 12.6], [1799.5, 12.7], [1800, 12.6], [1800.5, 12.3],\n    [1801, 12], [1801.5, 11.9], [1802, 11.8], [1802.5, 11.6], [1803, 11.4], [1803.5, 11.2],\n    [1804, 11.1], [1804.5, 11.1], [1805, 11.1], [1805.5, 11.1], [1806, 11.1], [1806.5, 11.2],\n    [1807, 11.1], [1807.5, 11.1], [1808, 11.2], [1808.5, 11.4], [1809, 11.5], [1809.5, 11.3],\n    [1810, 11.2], [1810.5, 11.4], [1811, 11.7], [1811.5, 11.9], [1812, 11.9], [1812.5, 11.9],\n    [1813, 11.8], [1813.5, 11.7], [1814, 11.8], [1814.5, 11.8], [1815, 11.8], [1815.5, 11.7],\n    [1816, 11.6], [1816.5, 11.6], [1817, 11.5], [1817.5, 11.5], [1818, 11.4], [1818.5, 11.4],\n    [1819, 11.3], [1819.5, 11.3], [1820, 11.13], [1820.5, 11.16], [1821, 10.94], [1821.5, 10.72],\n    [1822, 10.29], [1822.5, 10.04], [1823, 9.94], [1823.5, 9.91], [1824, 9.88], [1824.5, 9.86],\n    [1825, 9.72], [1825.5, 9.67], [1826, 9.66], [1826.5, 9.64], [1827, 9.51], [1827.5, 9.4],\n    [1828, 9.21], [1828.5, 9], [1829, 8.6], [1829.5, 8.29], [1830, 7.95], [1830.5, 7.73],\n    [1831, 7.59], [1831.5, 7.49], [1832, 7.36], [1832.5, 7.26], [1833, 7.1], [1833.5, 7],\n    [1834, 6.89], [1834.5, 6.82], [1835, 6.73], [1835.5, 6.64], [1836, 6.39], [1836.5, 6.28],\n    [1837, 6.25], [1837.5, 6.27], [1838, 6.25], [1838.5, 6.27], [1839, 6.22], [1839.5, 6.24],\n    [1840, 6.22], [1840.5, 6.27], [1841, 6.3], [1841.5, 6.36], [1842, 6.35], [1842.5, 6.37],\n    [1843, 6.32], [1843.5, 6.33], [1844, 6.33], [1844.5, 6.37], [1845, 6.37], [1845.5, 6.41],\n    [1846, 6.4], [1846.5, 6.44], [1847, 6.46], [1847.5, 6.51], [1848, 6.48], [1848.5, 6.51],\n    [1849, 6.53], [1849.5, 6.58], [1850, 6.55], [1850.5, 6.61], [1851, 6.69], [1851.5, 6.8],\n    [1852, 6.84], [1852.5, 6.94], [1853, 7.03], [1853.5, 7.13], [1854, 7.15], [1854.5, 7.22],\n    [1855, 7.26], [1855.5, 7.3], [1856, 7.23], [1856.5, 7.22], [1857, 7.21], [1857.5, 7.2],\n    [1858, 6.99], [1858.5, 6.98], [1859, 7.19], [1859.5, 7.36], [1860, 7.35], [1860.5, 7.39],\n    [1861, 7.41], [1861.5, 7.45], [1862, 7.36], [1862.5, 7.18], [1863, 6.95], [1863.5, 6.72],\n    [1864, 6.45], [1864.5, 6.24], [1865, 5.92], [1865.5, 5.59], [1866, 5.15], [1866.5, 4.67],\n    [1867, 4.11], [1867.5, 3.52], [1868, 2.94], [1868.5, 2.47], [1869, 1.97], [1869.5, 1.52],\n    [1870, 1.04], [1870.5, 0.6], [1871, 0.11], [1871.5, -0.34], [1872, -0.82], [1872.5, -1.25],\n    [1873, -1.7], [1873.5, -2.08], [1874, -2.48], [1874.5, -2.82], [1875, -3.19], [1875.5, -3.5],\n    [1876, -3.84], [1876.5, -4.14], [1877, -4.43], [1877.5, -4.59], [1878, -4.79], [1878.5, -4.92],\n    [1879, -5.09], [1879.5, -5.24], [1880, -5.36], [1880.5, -5.34], [1881, -5.37], [1881.5, -5.32],\n    [1882, -5.34], [1882.5, -5.33], [1883, -5.4], [1883.5, -5.47], [1884, -5.58], [1884.5, -5.66],\n    [1885, -5.74], [1885.5, -5.68], [1886, -5.69], [1886.5, -5.65], [1887, -5.67], [1887.5, -5.68],\n    [1888, -5.73], [1888.5, -5.72], [1889, -5.78], [1889.5, -5.79], [1890, -5.86], [1890.5, -5.89],\n    [1891, -6.01], [1891.5, -6.13], [1892, -6.28], [1892.5, -6.41], [1893, -6.53], [1893.5, -6.49],\n    [1894, -6.5], [1894.5, -6.45], [1895, -6.41], [1895.5, -6.26], [1896, -6.11], [1896.5, -5.9],\n    [1897, -5.63], [1897.5, -5.13], [1898, -4.68], [1898.5, -4.19], [1899, -3.72], [1899.5, -3.21],\n    [1900, -2.7], [1900.5, -2.09], [1901, -1.48], [1901.5, -0.75], [1902, -0.08], [1902.5, 0.62],\n    [1903, 1.26], [1903.5, 1.95], [1904, 2.59], [1904.5, 3.28], [1905, 3.92], [1905.5, 4.61],\n    [1906, 5.2], [1906.5, 5.73], [1907, 6.29], [1907.5, 7], [1908, 7.68], [1908.5, 8.45],\n    [1909, 9.13], [1909.5, 9.78], [1910, 10.38], [1910.5, 10.99], [1911, 11.64], [1911.5, 12.47],\n    [1912, 13.23], [1912.5, 14], [1913, 14.69], [1913.5, 15.38], [1914, 16], [1914.5, 16.64],\n    [1915, 17.19], [1915.5, 17.72], [1916, 18.19], [1916.5, 18.67], [1917, 19.13], [1917.5, 19.69],\n    [1918, 20.14], [1918.5, 20.54], [1919, 20.86], [1919.5, 21.14], [1920, 21.41], [1920.5, 21.78],\n    [1921, 22.06], [1921.5, 22.3], [1922, 22.51], [1922.5, 22.79], [1923, 23.01], [1923.5, 23.29],\n    [1924, 23.46], [1924.5, 23.55], [1925, 23.63], [1925.5, 23.8], [1926, 23.95], [1926.5, 24.25],\n    [1927, 24.39], [1927.5, 24.42], [1928, 24.34], [1928.5, 24.22], [1929, 24.1], [1929.5, 24.08],\n    [1930, 24.02], [1930.5, 24.04], [1931, 23.98], [1931.5, 23.91], [1932, 23.89], [1932.5, 23.95],\n    [1933, 23.93], [1933.5, 23.92], [1934, 23.88], [1934.5, 23.94], [1935, 23.91], [1935.5, 23.82],\n    [1936, 23.76], [1936.5, 23.87], [1937, 23.91], [1937.5, 23.95], [1938, 23.96], [1938.5, 24],\n    [1939, 24.04], [1939.5, 24.2], [1940, 24.35], [1940.5, 24.61], [1941, 24.82], [1941.5, 25.09],\n    [1942, 25.3], [1942.5, 25.56], [1943, 25.77], [1943.5, 26.05], [1944, 26.27], [1944.5, 26.54],\n    [1945, 26.76], [1945.5, 27.04], [1946, 27.27], [1946.5, 27.55], [1947, 27.77], [1947.5, 28.03],\n    [1948, 28.25], [1948.5, 28.5], [1949, 28.7], [1949.5, 28.95], [1950, 29.15], [1950.5, 29.38],\n    [1951, 29.57], [1951.5, 29.8], [1952, 29.97], [1952.5, 30.19], [1953, 30.36], [1953.5, 30.57],\n    [1954, 30.72], [1954.5, 30.93], [1955, 31.07], [1955.5, 31.24], [1956, 31.349], [1956.5, 31.516],\n    [1957, 31.677], [1957.5, 31.923], [1958, 32.166], [1958.5, 32.449], [1959, 32.671], [1959.5, 32.919],\n    [1960, 33.15], [1960.5, 33.397], [1961, 33.584], [1961.5, 33.804], [1962, 33.992], [1962.5, 34.24],\n    [1963, 34.466], [1963.5, 34.731], [1964, 35.03], [1964.5, 35.4], [1965, 35.738], [1965.5, 36.147],\n    [1966, 36.546], [1966.5, 36.995], [1967, 37.429], [1967.5, 37.879], [1968, 38.291], [1968.5, 38.753],\n    [1969, 39.204], [1969.5, 39.707], [1970, 40.182], [1970.5, 40.706], [1971, 41.17], [1971.5, 41.686],\n    [1972, 42.227], [1972.5, 42.825], [1973, 43.373], [1973.0833, 43.4724], [1973.1667, 43.5648], [1973.25, 43.6737],\n    [1973.3333, 43.7782], [1973.4167, 43.8763], [1973.5, 43.9562], [1973.5833, 44.0315], [1973.6667, 44.1132], [1973.75, 44.1982],\n    [1973.8333, 44.2952], [1973.9167, 44.3936], [1974, 44.4841], [1974.0833, 44.5646], [1974.1667, 44.6425], [1974.25, 44.7386],\n    [1974.3333, 44.837], [1974.4167, 44.9302], [1974.5, 44.9986], [1974.5833, 45.0584], [1974.6667, 45.1284], [1974.75, 45.2064],\n    [1974.8333, 45.298], [1974.9167, 45.3897], [1975, 45.4761], [1975.0833, 45.5632], [1975.1667, 45.645], [1975.25, 45.7375],\n    [1975.3333, 45.8284], [1975.4167, 45.9133], [1975.5, 45.982], [1975.5833, 46.0407], [1975.6667, 46.1067], [1975.75, 46.1825],\n    [1975.8333, 46.2789], [1975.9167, 46.3713], [1976, 46.4567], [1976.0833, 46.5445], [1976.1667, 46.6311], [1976.25, 46.7302],\n    [1976.3333, 46.8284], [1976.4167, 46.9247], [1976.5, 46.997], [1976.5833, 47.0709], [1976.6667, 47.1451], [1976.75, 47.2362],\n    [1976.8333, 47.3413], [1976.9167, 47.4319], [1977, 47.5214], [1977.0833, 47.6049], [1977.1667, 47.6837], [1977.25, 47.7781],\n    [1977.3333, 47.8771], [1977.4167, 47.9687], [1977.5, 48.0348], [1977.5833, 48.0942], [1977.6667, 48.1608], [1977.75, 48.246],\n    [1977.8333, 48.3439], [1977.9167, 48.4355], [1978, 48.5344], [1978.0833, 48.6325], [1978.1667, 48.7294], [1978.25, 48.8365],\n    [1978.3333, 48.9353], [1978.4167, 49.0319], [1978.5, 49.1013], [1978.5833, 49.1591], [1978.6667, 49.2286], [1978.75, 49.307],\n    [1978.8333, 49.4018], [1978.9167, 49.4945], [1979, 49.5861], [1979.0833, 49.6805], [1979.1667, 49.7602], [1979.25, 49.8556],\n    [1979.3333, 49.9489], [1979.4167, 50.0347], [1979.5, 50.1019], [1979.5833, 50.1622], [1979.6667, 50.226], [1979.75, 50.2968],\n    [1979.8333, 50.3831], [1979.9167, 50.4599], [1980, 50.5387], [1980.0833, 50.616], [1980.1667, 50.6866], [1980.25, 50.7658],\n    [1980.3333, 50.8454], [1980.4167, 50.9187], [1980.5, 50.9761], [1980.5833, 51.0278], [1980.6667, 51.0843], [1980.75, 51.1538],\n    [1980.8333, 51.2319], [1980.9167, 51.3063], [1981, 51.3808], [1981.0833, 51.4526], [1981.1667, 51.516], [1981.25, 51.5985],\n    [1981.3333, 51.6809], [1981.4167, 51.7573], [1981.5, 51.8133], [1981.5833, 51.8532], [1981.6667, 51.9014], [1981.75, 51.9603],\n    [1981.8333, 52.0328], [1981.9167, 52.0985], [1982, 52.1668], [1982.0833, 52.2316], [1982.1667, 52.2938], [1982.25, 52.368],\n    [1982.3333, 52.4465], [1982.4167, 52.518], [1982.5, 52.5751], [1982.5833, 52.6178], [1982.6667, 52.6668], [1982.75, 52.734],\n    [1982.8333, 52.8056], [1982.9167, 52.8792], [1983, 52.9565], [1983.0833, 53.0445], [1983.1667, 53.1268], [1983.25, 53.2197],\n    [1983.3333, 53.3024], [1983.4167, 53.3747], [1983.5, 53.4335], [1983.5833, 53.4778], [1983.6667, 53.53], [1983.75, 53.5845],\n    [1983.8333, 53.6523], [1983.9167, 53.7256], [1984, 53.7882], [1984.0833, 53.8367], [1984.1667, 53.883], [1984.25, 53.9443],\n    [1984.3333, 54.0042], [1984.4167, 54.0536], [1984.5, 54.0856], [1984.5833, 54.1084], [1984.6667, 54.1463], [1984.75, 54.1914],\n    [1984.8333, 54.2452], [1984.9167, 54.2958], [1985, 54.3427], [1985.0833, 54.3911], [1985.1667, 54.432], [1985.25, 54.4898],\n    [1985.3333, 54.5456], [1985.4167, 54.5977], [1985.5, 54.6355], [1985.5833, 54.6532], [1985.6667, 54.6776], [1985.75, 54.7174],\n    [1985.8333, 54.7741], [1985.9167, 54.8253], [1986, 54.8713], [1986.0833, 54.9161], [1986.1667, 54.9581], [1986.25, 54.9997],\n    [1986.3333, 55.0476], [1986.4167, 55.0912], [1986.5, 55.1132], [1986.5833, 55.1328], [1986.6667, 55.1532], [1986.75, 55.1898],\n    [1986.8333, 55.2416], [1986.9167, 55.2838], [1987, 55.3222], [1987.0833, 55.3613], [1987.1667, 55.4063], [1987.25, 55.4629],\n    [1987.3333, 55.5111], [1987.4167, 55.5524], [1987.5, 55.5812], [1987.5833, 55.6004], [1987.6667, 55.6262], [1987.75, 55.6656],\n    [1987.8333, 55.7168], [1987.9167, 55.7698], [1988, 55.8197], [1988.0833, 55.8615], [1988.1667, 55.913], [1988.25, 55.9663],\n    [1988.3333, 56.022], [1988.4167, 56.07], [1988.5, 56.0939], [1988.5833, 56.1105], [1988.6667, 56.1314], [1988.75, 56.1611],\n    [1988.8333, 56.2068], [1988.9167, 56.2583], [1989, 56.3], [1989.0833, 56.3399], [1989.1667, 56.379], [1989.25, 56.4283],\n    [1989.3333, 56.4804], [1989.4167, 56.5352], [1989.5, 56.5697], [1989.5833, 56.5983], [1989.6667, 56.6328], [1989.75, 56.6739],\n    [1989.8333, 56.7332], [1989.9167, 56.7972], [1990, 56.8553], [1990.0833, 56.9111], [1990.1667, 56.9755], [1990.25, 57.0471],\n    [1990.3333, 57.1136], [1990.4167, 57.1738], [1990.5, 57.2226], [1990.5833, 57.2597], [1990.6667, 57.3073], [1990.75, 57.3643],\n    [1990.8333, 57.4334], [1990.9167, 57.5016], [1991, 57.5653], [1991.0833, 57.6333], [1991.1667, 57.6973], [1991.25, 57.7711],\n    [1991.3333, 57.8407], [1991.4167, 57.9058], [1991.5, 57.9576], [1991.5833, 57.9975], [1991.6667, 58.0426], [1991.75, 58.1043],\n    [1991.8333, 58.1679], [1991.9167, 58.2389], [1992, 58.3092], [1992.0833, 58.3833], [1992.1667, 58.4537], [1992.25, 58.5401],\n    [1992.3333, 58.6228], [1992.4167, 58.6917], [1992.5, 58.741], [1992.5833, 58.7836], [1992.6667, 58.8406], [1992.75, 58.8986],\n    [1992.8333, 58.9714], [1992.9167, 59.0438], [1993, 59.1218], [1993.0833, 59.2003], [1993.1667, 59.2747], [1993.25, 59.3574],\n    [1993.3333, 59.4434], [1993.4167, 59.5242], [1993.5, 59.585], [1993.5833, 59.6343], [1993.6667, 59.6928], [1993.75, 59.7588],\n    [1993.8333, 59.8386], [1993.9167, 59.9111], [1994, 59.9845], [1994.0833, 60.0564], [1994.1667, 60.1231], [1994.25, 60.2042],\n    [1994.3333, 60.2804], [1994.4167, 60.353], [1994.5, 60.4012], [1994.5833, 60.444], [1994.6667, 60.49], [1994.75, 60.5578],\n    [1994.8333, 60.6324], [1994.9167, 60.7059], [1995, 60.7853], [1995.0833, 60.8664], [1995.1667, 60.9387], [1995.25, 61.0277],\n    [1995.3333, 61.1103], [1995.4167, 61.187], [1995.5, 61.2454], [1995.5833, 61.2881], [1995.6667, 61.3378], [1995.75, 61.4036],\n    [1995.8333, 61.476], [1995.9167, 61.5525], [1996, 61.6287], [1996.0833, 61.6846], [1996.1667, 61.7433], [1996.25, 61.8132],\n    [1996.3333, 61.8823], [1996.4167, 61.9497], [1996.5, 61.9969], [1996.5833, 62.0343], [1996.6667, 62.0714], [1996.75, 62.1202],\n    [1996.8333, 62.181], [1996.9167, 62.2382], [1997, 62.295], [1997.0833, 62.3506], [1997.1667, 62.3995], [1997.25, 62.4754],\n    [1997.3333, 62.5463], [1997.4167, 62.6136], [1997.5, 62.6571], [1997.5833, 62.6942], [1997.6667, 62.7383], [1997.75, 62.7926],\n    [1997.8333, 62.8567], [1997.9167, 62.9146], [1998, 62.9659], [1998.0833, 63.0217], [1998.1667, 63.0807], [1998.25, 63.1462],\n    [1998.3333, 63.2053], [1998.4167, 63.2599], [1998.5, 63.2844], [1998.5833, 63.2961], [1998.6667, 63.3126], [1998.75, 63.3422],\n    [1998.8333, 63.3871], [1998.9167, 63.4339], [1999, 63.4673], [1999.0833, 63.4979], [1999.1667, 63.5319], [1999.25, 63.5679],\n    [1999.3333, 63.6104], [1999.4167, 63.6444], [1999.5, 63.6642], [1999.5833, 63.6739], [1999.6667, 63.6926], [1999.75, 63.7147],\n    [1999.8333, 63.7518], [1999.9167, 63.7927], [2000, 63.8285], [2000.0833, 63.8557], [2000.1667, 63.8804], [2000.25, 63.9075],\n    [2000.3333, 63.9393], [2000.4167, 63.9691], [2000.5, 63.9799], [2000.5833, 63.9833], [2000.6667, 63.9938], [2000.75, 64.0093],\n    [2000.8333, 64.04], [2000.9167, 64.067], [2001, 64.0908], [2001.0833, 64.1068], [2001.1667, 64.1282], [2001.25, 64.1584],\n    [2001.3333, 64.1833], [2001.4167, 64.2094], [2001.5, 64.2117], [2001.5833, 64.2073], [2001.6667, 64.2116], [2001.75, 64.2223],\n    [2001.8333, 64.25], [2001.9167, 64.2761], [2002, 64.2998], [2002.0833, 64.3192], [2002.1667, 64.345], [2002.25, 64.3735],\n    [2002.3333, 64.3943], [2002.4167, 64.4151], [2002.5, 64.4132], [2002.5833, 64.4118], [2002.6667, 64.4097], [2002.75, 64.4168],\n    [2002.8333, 64.4329], [2002.9167, 64.4511], [2003, 64.4734], [2003.0833, 64.4893], [2003.1667, 64.5053], [2003.25, 64.5269],\n    [2003.3333, 64.5471], [2003.4167, 64.5597], [2003.5, 64.5512], [2003.5833, 64.5371], [2003.6667, 64.5359], [2003.75, 64.5415],\n    [2003.8333, 64.5544], [2003.9167, 64.5654], [2004, 64.5736], [2004.0833, 64.5891], [2004.1667, 64.6015], [2004.25, 64.6176],\n    [2004.3333, 64.6374], [2004.4167, 64.6549], [2004.5, 64.653], [2004.5833, 64.6379], [2004.6667, 64.6372], [2004.75, 64.64],\n    [2004.8333, 64.6543], [2004.9167, 64.6723], [2005, 64.6876], [2005.0833, 64.7052], [2005.1667, 64.7313], [2005.25, 64.7575],\n    [2005.3333, 64.7811], [2005.4167, 64.8001], [2005.5, 64.7995], [2005.5833, 64.7876], [2005.6667, 64.7831], [2005.75, 64.7921],\n    [2005.8333, 64.8096], [2005.9167, 64.8311], [2006, 64.8452], [2006.0833, 64.8597], [2006.1667, 64.885], [2006.25, 64.9175],\n    [2006.3333, 64.948], [2006.4167, 64.9794], [2006.5, 64.9895], [2006.5833, 65.0028], [2006.6667, 65.0138], [2006.75, 65.0371],\n    [2006.8333, 65.0773], [2006.9167, 65.1122], [2007, 65.1464], [2007.0833, 65.1833], [2007.1667, 65.2145], [2007.25, 65.2494],\n    [2007.3333, 65.2921], [2007.4167, 65.3279], [2007.5, 65.3413], [2007.5833, 65.3452], [2007.6667, 65.3496], [2007.75, 65.3711],\n    [2007.8333, 65.3972], [2007.9167, 65.4296], [2008, 65.4573], [2008.0833, 65.4868], [2008.1667, 65.5152], [2008.25, 65.545],\n    [2008.3333, 65.5781], [2008.4167, 65.6127], [2008.5, 65.6288], [2008.5833, 65.637], [2008.6667, 65.6493], [2008.75, 65.676],\n    [2008.8333, 65.7097], [2008.9167, 65.7461], [2009, 65.7768], [2009.0833, 65.8025], [2009.1667, 65.8237], [2009.25, 65.8595],\n    [2009.3333, 65.8973], [2009.4167, 65.9323], [2009.5, 65.9509], [2009.5833, 65.9534], [2009.6667, 65.9628], [2009.75, 65.9839],\n    [2009.8333, 66.0147], [2009.9167, 66.042], [2010, 66.0699], [2010.0833, 66.0961], [2010.1667, 66.131], [2010.25, 66.1683],\n    [2010.3333, 66.2072], [2010.4167, 66.2356], [2010.5, 66.2409], [2010.5833, 66.2335], [2010.6667, 66.2349], [2010.75, 66.2441],\n    [2010.8333, 66.2751], [2010.9167, 66.3054], [2011, 66.3246], [2011.0833, 66.3406], [2011.1667, 66.3624], [2011.25, 66.3957],\n    [2011.3333, 66.4289], [2011.4167, 66.4619], [2011.5, 66.4749], [2011.5833, 66.4751], [2011.6667, 66.4829], [2011.75, 66.5056],\n    [2011.8333, 66.5383], [2011.9167, 66.5706], [2012, 66.603], [2012.0833, 66.634], [2012.1667, 66.6569], [2012.25, 66.6925],\n    [2012.3333, 66.7289], [2012.4167, 66.7579], [2012.5, 66.7708], [2012.5833, 66.774], [2012.6667, 66.7846], [2012.75, 66.8103],\n    [2012.8333, 66.84], [2012.9167, 66.8779], [2013, 66.9069], [2013.0833, 66.9443], [2013.1667, 66.9763], [2013.25, 67.0258],\n    [2013.3333, 67.0716], [2013.4167, 67.11], [2013.5, 67.1266], [2013.5833, 67.1331], [2013.6667, 67.1458], [2013.75, 67.1717],\n    [2013.8333, 67.2091], [2013.9167, 67.246], [2014, 67.281], [2014.0833, 67.3136], [2014.1667, 67.3457], [2014.25, 67.389],\n    [2014.3333, 67.4318], [2014.4167, 67.4666], [2014.5, 67.4858], [2014.5833, 67.4989], [2014.6667, 67.5111], [2014.75, 67.5353],\n    [2014.8333, 67.5711], [2014.9167, 67.607], [2015, 67.6439], [2015.0833, 67.6765], [2015.1667, 67.7117], [2015.25, 67.7591],\n    [2015.3333, 67.8012], [2015.4167, 67.8402], [2015.5, 67.8606], [2015.5833, 67.8822], [2015.6667, 67.912], [2015.75, 67.9546],\n    [2015.8333, 68.0055], [2015.9167, 68.0514], [2016, 68.1024], [2016.0833, 68.1577], [2016.1667, 68.2044], [2016.25, 68.2665],\n    [2016.3333, 68.3188], [2016.4167, 68.3704], [2016.5, 68.3964], [2016.5833, 68.4094], [2016.6667, 68.4305], [2016.75, 68.463],\n    [2016.8333, 68.5078], [2016.9167, 68.5537], [2017, 68.5927], [2017.0833, 68.6298], [2017.1667, 68.6671], [2017.25, 68.7135],\n    [2017.3333, 68.7623], [2017.4167, 68.8033], [2017.5, 68.8245], [2017.5833, 68.8373], [2017.6667, 68.8477], [2017.75, 68.8689],\n    [2017.8333, 68.9006], [2017.9167, 68.9355], [2018, 68.9676], [2018.0833, 68.9875], [2018.1667, 69.0176], [2018.25, 69.0499],\n    [2018.3333, 69.0823], [2018.4167, 69.107], [2018.5, 69.1134], [2018.5833, 69.1142], [2018.6667, 69.1207], [2018.75, 69.1356],\n    [2018.8333, 69.1646], [2018.9167, 69.1964], [2019, 69.2202], [2019.0833, 69.2452], [2019.1667, 69.2733], [2019.25, 69.3032],\n    [2019.3333, 69.3326], [2019.4167, 69.3541], [2019.5, 69.3582], [2019.5833, 69.3442], [2019.6667, 69.3376], [2019.75, 69.3377],\n    [2019.8333, 69.3432], [2019.9167, 69.354], [2020, 69.3612], [2020.0833, 69.3752], [2020.1667, 69.389], [2020.25, 69.4092],\n    [2020.3333, 69.4265], [2020.4167, 69.4386], [2020.5, 69.4241], [2020.5833, 69.3921], [2020.6667, 69.3693], [2020.75, 69.3575],\n    [2020.8333, 69.3593], [2020.9167, 69.363], [2021, 69.3594], [2021.0833, 69.351], [2021.1667, 69.3538], [2021.25, 69.3582],\n    [2021.3333, 69.3673], [2021.4167, 69.3679], [2021.5, 69.3514], [2021.5833, 69.3273], [2021.6667, 69.3033], [2021.75, 69.2892],\n    [2021.8333, 69.2881], [2021.9167, 69.2908], [2022, 69.2945], [2022.0833, 69.2914], [2022.1667, 69.2861], [2022.25, 69.2835],\n    [2022.3333, 69.2816], [2022.4167, 69.2799], [2022.5, 69.2527], [2022.5833, 69.2213], [2022.6667, 69.1975], [2022.75, 69.1891],\n    [2022.8333, 69.1942], [2022.9167, 69.2036], [2023, 69.2039], [2023.0833, 69.1986], [2023.1667, 69.1993], [2023.25, 69.2084],\n    [2023.3333, 69.2183], [2023.4167, 69.23], [2023.5, 69.2201], [2023.5833, 69.1988], [2023.6667, 69.1814], [2023.75, 69.1723],\n    [2023.8333, 69.1727], [2023.9167, 69.1724], [2024, 69.1752], [2024.0833, 69.1797], [2024.1667, 69.1874], [2024.25, 69.1983],\n    [2024.3333, 69.2018], [2024.4167, 69.2044], [2024.5, 69.1879], [2024.5833, 69.1588], [2024.6667, 69.1322], [2024.75, 69.125],\n    [2024.8333, 69.1304], [2024.9167, 69.1345], [2025, 69.1377], [2025.0833, 69.1366], [2025.1667, 69.1384], [2025.25, 69.1471],\n    [2025.3333, 69.1542], [2025.4167, 69.155], [2025.5, 69.1406], [2025.5833, 69.1219], [2025.6667, 69.0994], [2025.75, 69.0909],\n    [2025.8333, 69.0909], [2025.9167, 69.1042], [2026, 69.1099], [2026.0833, 69.1133], [2026.1667, 69.1168], [2026.25, 69.133],\n    [2026.5, 69.11], [2026.75, 69.09], [2027, 69.14], [2027.25, 69.21], [2027.5, 69.26], [2027.75, 69.26],\n    [2028, 69.34], [2028.25, 69.44], [2028.5, 69.51], [2028.75, 69.54], [2029, 69.63], [2029.25, 69.75],\n    [2029.5, 69.83], [2029.75, 69.87], [2030, 69.97], [2030.25, 70.08], [2030.5, 70.17], [2030.75, 70.21],\n    [2031, 70.32], [2031.25, 70.42], [2031.5, 70.51], [2031.75, 70.53], [2032, 70.62], [2032.25, 70.72],\n    [2032.5, 70.82], [2032.75, 70.86], [2033, 70.98], [2033.25, 71.1], [2033.5, 71.2], [2033.75, 71.25],\n];\n","import {REFERENCE_DELTA_T} from '../constants/deltaTReference';\n\nconst REFERENCE_MIN_YEAR = Math.floor(REFERENCE_DELTA_T[0][0]);\nconst REFERENCE_MAX_YEAR = Math.floor(REFERENCE_DELTA_T[REFERENCE_DELTA_T.length - 1][0]);\n\n// Cubic least-squares fit to the most recent reference years, used to extrapolate ΔT beyond the tabulated years.\nconst FUTURE_FIT_START_YEAR = 2005;\nconst FUTURE_DELTA_T_COEFFICIENTS = fitPolynomial(\n    yearlyReferenceValues(FUTURE_FIT_START_YEAR, REFERENCE_MAX_YEAR).map((deltaT, index) => [\n        FUTURE_FIT_START_YEAR + index - 2000,\n        deltaT,\n    ]),\n    3,\n);\n\nexport function getDeltaT(year: number, month = 0): number {\n    // https://eclipse.gsfc.nasa.gov/SEcat5/deltatpoly.html\n    const y = year + (month - 0.5) / 12;\n\n    if (year >= REFERENCE_MIN_YEAR && year <= REFERENCE_MAX_YEAR) {\n        return getReferenceDeltaT(y);\n    }\n\n    if (year > REFERENCE_MAX_YEAR) {\n        return evaluatePolynomial(FUTURE_DELTA_T_COEFFICIENTS, y - 2000);\n    }\n\n    let t: number;\n    let deltaT = 0;\n\n    if (year < -500) {\n        t = (y - 1820) / 100;\n        deltaT = -20 + 32 * t ** 2;\n    }\n\n    if (year >= -500 && year < 500) {\n        t = y / 100;\n        deltaT =\n            10583.6\n            - 1014.41 * t\n            + 33.78311 * t ** 2\n            - 5.952053 * t ** 3\n            - 0.1798452 * t ** 4\n            + 0.022174192 * t ** 5\n            + 0.0090316521 * t ** 6;\n    }\n\n    if (year >= 500 && year < 1600) {\n        t = (y - 1000) / 100;\n        deltaT =\n            1574.2\n            - 556.01 * t\n            + 71.23472 * t ** 2\n            + 0.319781 * t ** 3\n            - 0.8503463 * t ** 4\n            - 0.005050998 * t ** 5\n            + 0.0083572073 * t ** 6;\n    }\n\n    if (year >= 1600 && year < 1700) {\n        t = y - 1600;\n        deltaT = 120 - 0.9808 * t - 0.01532 * t ** 2 + t ** 3 / 7129;\n    }\n\n    if (year >= 1700 && year < 1800) {\n        t = y - 1700;\n        deltaT = 8.83 + 0.1603 * t - 0.0059285 * t ** 2 + 0.00013336 * t ** 3 - t ** 4 / 1174000;\n    }\n\n    if (year >= 1800 && year < 1860) {\n        t = y - 1800;\n        deltaT =\n            13.72\n            - 0.332447 * t\n            + 0.0068612 * t ** 2\n            + 0.0041116 * t ** 3\n            - 0.00037436 * t ** 4\n            + 0.0000121272 * t ** 5\n            - 0.0000001699 * t ** 6\n            + 0.000000000875 * t ** 7;\n    }\n\n    if (year >= 1860 && year < 1900) {\n        t = y - 1860;\n\n        deltaT = 7.62 + 0.5737 * t - 0.251754 * t ** 2 + 0.01680668 * t ** 3 - 0.0004473624 * t ** 4 + t ** 5 / 233174;\n    }\n\n    if (year >= 1900 && year < 1920) {\n        t = y - 1900;\n        deltaT = -2.79 + 1.494119 * t - 0.0598939 * t ** 2 + 0.0061966 * t ** 3 - 0.000197 * t ** 4;\n    }\n\n    if (year >= 1920 && year < 1941) {\n        t = y - 1920;\n        deltaT = 21.2 + 0.84493 * t - 0.0761 * t ** 2 + 0.0020936 * t ** 3;\n    }\n\n    if (year >= 1941 && year < 1961) {\n        t = y - 1950;\n        deltaT = 29.07 + 0.407 * t - t ** 2 / 233 + t ** 3 / 2547;\n    }\n\n    if (year >= 1961 && year < 1986) {\n        t = y - 1975;\n        deltaT = 45.45 + 1.067 * t - t ** 2 / 260 - t ** 3 / 718;\n    }\n\n    if (year >= 1986 && year < 2005) {\n        t = y - 2000;\n        deltaT =\n            63.86 + 0.3345 * t - 0.060374 * t ** 2 + 0.0017275 * t ** 3 + 0.000651814 * t ** 4 + 0.00002373599 * t ** 5;\n    }\n\n    return deltaT;\n}\n\nfunction getReferenceDeltaT(y: number): number {\n    const first = REFERENCE_DELTA_T[0];\n    const last = REFERENCE_DELTA_T[REFERENCE_DELTA_T.length - 1];\n    const clamped = Math.max(first[0], Math.min(last[0], y));\n\n    let low = 0;\n    let high = REFERENCE_DELTA_T.length - 1;\n    while (high - low > 1) {\n        const mid = (low + high) >> 1;\n        if (REFERENCE_DELTA_T[mid][0] <= clamped) {\n            low = mid;\n        } else {\n            high = mid;\n        }\n    }\n\n    const [year0, deltaT0] = REFERENCE_DELTA_T[low];\n    const [year1, deltaT1] = REFERENCE_DELTA_T[high];\n    const fraction = (clamped - year0) / (year1 - year0);\n\n    return deltaT0 + fraction * (deltaT1 - deltaT0);\n}\n\nfunction yearlyReferenceValues(from: number, to: number): number[] {\n    const values: number[] = [];\n    for (let year = from; year <= to; year++) {\n        values.push(getReferenceDeltaT(year));\n    }\n\n    return values;\n}\n\nfunction evaluatePolynomial(coefficients: number[], x: number): number {\n    return coefficients.reduce((sum, coefficient, power) => sum + coefficient * x ** power, 0);\n}\n\nfunction fitPolynomial(points: Array<[number, number]>, degree: number): number[] {\n    const size = degree + 1;\n    const matrix: number[][] = [];\n    const vector: number[] = [];\n\n    for (let i = 0; i < size; i++) {\n        matrix[i] = [];\n        for (let j = 0; j < size; j++) {\n            matrix[i][j] = points.reduce((sum, [x]) => sum + x ** (i + j), 0);\n        }\n        vector[i] = points.reduce((sum, [x, value]) => sum + value * x ** i, 0);\n    }\n\n    for (let i = 0; i < size; i++) {\n        let pivot = i;\n        for (let row = i + 1; row < size; row++) {\n            if (Math.abs(matrix[row][i]) > Math.abs(matrix[pivot][i])) {\n                pivot = row;\n            }\n        }\n        [matrix[i], matrix[pivot]] = [matrix[pivot], matrix[i]];\n        [vector[i], vector[pivot]] = [vector[pivot], vector[i]];\n\n        for (let row = 0; row < size; row++) {\n            if (row === i) {\n                continue;\n            }\n            const factor = matrix[row][i] / matrix[i][i];\n            for (let col = i; col < size; col++) {\n                matrix[row][col] -= factor * matrix[i][col];\n            }\n            vector[row] -= factor * vector[i];\n        }\n    }\n\n    return matrix.map((_, i) => vector[i] / matrix[i][i]);\n}\n","import {EPOCH_J2000} from '@app/constants/epoch';\nimport {DAYS_PER_JULIAN_CENTURY, HOURS_PER_DAY, MINUTES_PER_DAY, SECONDS_PER_DAY} from '@app/constants/time';\nimport {round} from '@app/utils/math';\nimport type {Time} from '../types/TimeTypes';\nimport {getDeltaT} from './deltaT';\n\nexport function sec2string(sec: number, short = false): string {\n    const sign = sec < 0 ? '-' : '';\n    sec = Math.abs(sec);\n\n    const hour = Math.floor(sec / 3600);\n    const min = Math.floor((sec - hour * 3600) / 60);\n    const secPart = round(sec - hour * 3600 - min * 60, 2);\n\n    if (short && hour === 0.0 && min === 0.0) {\n        return `${sign + secPart}s`;\n    }\n\n    if (short && hour === 0.0) {\n        return `${sign + min}m ${secPart}s`;\n    }\n\n    return `${sign + hour}h ${min}m ${secPart}s`;\n}\n\nexport function time2julianDay(time: Time): number {\n    const tmpYear = parseFloat(`${time.year}.${getDayOfYear(time)}`);\n\n    let Y: number;\n    let M: number;\n\n    if (time.month > 2) {\n        Y = time.year;\n        M = time.month;\n    } else {\n        Y = time.year - 1;\n        M = time.month + 12;\n    }\n\n    const D = time.day;\n    const H = time.hour / HOURS_PER_DAY + time.min / MINUTES_PER_DAY + time.sec / SECONDS_PER_DAY;\n\n    let A: number;\n    let B: number;\n\n    if (tmpYear >= 1582.288) {\n        // YYYY-MM-DD >= 1582-10-15\n        A = Math.floor(Y / 100);\n        B = 2 - A + Math.floor(A / 4);\n    } else if (tmpYear <= 1582.277) {\n        // YY-MM-DD <= 1582-10-04\n        B = 0;\n    } else {\n        throw new Error('Date between 1582-10-04 and 1582-10-15 is not defined.');\n    }\n\n    // Meeus 7.1\n    return Math.floor(365.25 * (Y + 4716)) + Math.floor(30.6001 * (M + 1)) + D + H + B - 1524.5;\n}\n\nexport function dateStringToJulianDay(dateStr: string): number {\n    const isoDate = parseIsoDateString(dateStr);\n\n    if (isoDate !== null) {\n        const {offsetMinutes, ...time} = isoDate;\n        return time2julianDay(time) - offsetMinutes / MINUTES_PER_DAY;\n    }\n\n    const date = new Date(dateStr);\n\n    return time2julianDay({\n        year: date.getUTCFullYear(),\n        month: date.getUTCMonth() + 1,\n        day: date.getUTCDate(),\n        hour: date.getUTCHours(),\n        min: date.getUTCMinutes(),\n        sec: date.getUTCSeconds(),\n    });\n}\n\nfunction parseIsoDateString(dateStr: string): (Time & {offsetMinutes: number}) | null {\n    const match =\n        /^([+-]?\\d+)-(\\d{2})-(\\d{2})(?:[T ](\\d{2})(?::(\\d{2})(?::(\\d{2}(?:\\.\\d+)?))?)?(?:Z|([+-])(\\d{2}):?(\\d{2}))?)?$/.exec(\n            dateStr,\n        );\n\n    if (!match) {\n        return null;\n    }\n\n    const [, year, month, day, hour = '0', min = '0', sec = '0', offsetSign, offsetHour = '0', offsetMin = '0'] = match;\n    const offsetFactor = offsetSign === '-' ? -1 : 1;\n\n    return {\n        year: Number(year),\n        month: Number(month),\n        day: Number(day),\n        hour: Number(hour),\n        min: Number(min),\n        sec: Number(sec),\n        offsetMinutes: offsetSign ? offsetFactor * (Number(offsetHour) * 60 + Number(offsetMin)) : 0,\n    };\n}\n\nexport function julianDay2time(jd: number): Time {\n    jd = jd + 0.5;\n\n    const Z = Math.floor(jd);\n    const F = jd - Z;\n\n    let A = Z;\n    if (Z >= 2299161) {\n        const a = Math.floor((Z - 1867216.25) / 36524.25);\n        A = Z + 1 + a - Math.floor(a / 4);\n    }\n\n    const B = A + 1524;\n    const C = Math.floor((B - 122.1) / 365.25);\n    const D = Math.floor(365.25 * C);\n    const E = Math.floor((B - D) / 30.6001);\n\n    const dayOnMonth = B - D - Math.floor(30.6001 * E) + F;\n    const month = E < 14 ? E - 1 : E - 13;\n    const year = month > 2 ? C - 4716 : C - 4715;\n    const hour = (dayOnMonth - Math.floor(dayOnMonth)) * 24;\n    const min = (hour - Math.floor(hour)) * 60;\n    const sec = (min - Math.floor(min)) * 60;\n\n    return {\n        year: Math.floor(year),\n        month: Math.floor(month),\n        day: Math.floor(dayOnMonth),\n        hour: Math.floor(hour),\n        min: Math.floor(min),\n        sec: Math.floor(sec),\n    };\n}\n\nexport function julianDay2julianDay0(jd: number): number {\n    return Math.floor(jd + 0.5) - 0.5;\n}\n\nexport function julianDay2ModifiedJulianDay(jd: number): number {\n    return jd - 2400000.5;\n}\n\nexport function julianDay2julianCenturiesJ2000(jd: number): number {\n    return (jd - EPOCH_J2000) / DAYS_PER_JULIAN_CENTURY;\n}\n\nexport function julianCenturiesJ20002julianDay(T: number): number {\n    return T * DAYS_PER_JULIAN_CENTURY + EPOCH_J2000;\n}\n\nexport function julianDay2julianMillenniaJ2000(jd: number): number {\n    const T = julianDay2julianCenturiesJ2000(jd);\n\n    return T / 10;\n}\n\nexport function julianMillenniaJ20002julianDay(t: number): number {\n    const T = t * 10;\n\n    return julianCenturiesJ20002julianDay(T);\n}\n\nexport function julianDay2julianDayEphemeris(jd: number): number {\n    const {year, month} = julianDay2time(jd);\n\n    return jd + getDeltaT(year, month) / SECONDS_PER_DAY;\n}\n\nexport function julianDayEphemeris2julianDay(jde: number): number {\n    const {year, month} = julianDay2time(jde);\n\n    return jde - getDeltaT(year, month) / SECONDS_PER_DAY;\n}\n\nexport function dayOfYear2time(year: number, dayOfYear: number): Time {\n    // Meeus 7\n    const K = isLeapYear(year) ? 1 : 2;\n    const month = dayOfYear < 32 ? 1 : Math.floor((9 * (K + dayOfYear)) / 275 + 0.98);\n    const day = Math.floor(dayOfYear - Math.floor((275 * month) / 9) + K * Math.floor((month + 9) / 12) + 30);\n\n    const hourFloat = 24 * (dayOfYear - Math.floor(dayOfYear));\n    const hour = Math.floor(hourFloat);\n    const minFloat = 60 * (hourFloat - hour);\n    const min = Math.floor(minFloat);\n    const sec = round(60 * (minFloat - min));\n\n    return {year, month, day, hour, min, sec};\n}\n\nexport function getDecimalYear(time: Time): number {\n    const daysInYear = isLeapYear(time.year) ? 366 : 365;\n    const dayOfYear =\n        getDayOfYear(time) - 1 + time.hour / HOURS_PER_DAY + time.min / MINUTES_PER_DAY + time.sec / SECONDS_PER_DAY;\n\n    return time.year + dayOfYear / daysInYear;\n}\n\nexport function getDayOfYear(time: Time): number {\n    const K = isLeapYear(time.year) ? 1 : 2;\n    const M = time.month;\n    const D = time.day;\n\n    // Meeus 7.f\n    return Math.floor((275 * M) / 9) - K * Math.floor((M + 9) / 12) + D - 30;\n}\n\nexport function getDayOfWeek(time: Time): number {\n    const jd = time2julianDay(time);\n\n    // Meeus 7.e\n    return Math.floor((jd + 1.5) % 7);\n}\n\nexport function isLeapYear(year: number): boolean {\n    if (year / 4 !== Math.floor(year / 4)) {\n        return false;\n    } else if (year / 100 !== Math.floor(year / 100)) {\n        return true;\n    } else if (year / 400 !== Math.floor(year / 400)) {\n        return false;\n    } else {\n        return true;\n    }\n}\n\nexport function shortYear2longYear(shortYearString: string): number {\n    const currentDate = new Date(Date.now());\n    const currentYear = currentDate.getFullYear();\n    const currentYearStr = currentYear.toString();\n\n    const currentYearFirstDigitsStr = currentYearStr.substr(0, currentYearStr.length - 2);\n    const currentYearFirstDigits = parseInt(currentYearFirstDigitsStr, 10);\n\n    const year1Str = currentYearFirstDigits + shortYearString;\n    const year1 = parseInt(year1Str, 10);\n    const year2Str = (currentYearFirstDigits - 1).toString() + shortYearString;\n    const year2 = parseInt(year2Str, 10);\n\n    return year1 <= currentYear ? year1 : year2;\n}\n","import {DEG} from '@app/constants/math';\nimport {polynomial} from '@app/utils/polynoms';\nimport {julianDay2time} from '@package/time/utils/dateTime';\nimport {getDeltaT} from '@package/time/utils/deltaT';\nimport type {BesselianElements, BesselianElementsAtTime, Catalogue} from '../types/BesselianElementTypes';\n\nexport function getBesselianElementsFromCatalogue(catalogue: Catalogue, julianDay: number): BesselianElements {\n    const raw = catalogue[julianDay];\n\n    if (!raw) {\n        throw new Error(`No Besselian elements found for eclipse on JD ${julianDay}`);\n    }\n\n    return parseBesselianElements(raw);\n}\n\nexport function parseBesselianElements(raw: Array<number>): BesselianElements {\n    if (raw.length !== 29) {\n        throw new Error(`Expected 29 Besselian element values, got ${raw.length}`);\n    }\n\n    return {\n        t0Jde: raw[0],\n        t0Hours: raw[1],\n        tMin: raw[2],\n        tMax: raw[3],\n        x: [raw[6], raw[7], raw[8], raw[9]],\n        y: [raw[10], raw[11], raw[12], raw[13]],\n        d: [raw[14], raw[15], raw[16]],\n        mu: [raw[17], raw[18], raw[19]],\n        l1: [raw[20], raw[21], raw[22]],\n        l2: [raw[23], raw[24], raw[25]],\n        tanF1: raw[26],\n        tanF2: raw[27],\n        saros: raw[28],\n    };\n}\n\nexport function getBesselianElementsAtTime(elements: BesselianElements, tau: number): BesselianElementsAtTime {\n    const d = polynomial(elements.d, tau) * DEG;\n    const mu = polynomial(elements.mu, tau) * DEG;\n\n    return {\n        x: polynomial(elements.x, tau),\n        y: polynomial(elements.y, tau),\n        d,\n        mu,\n        l1: polynomial(elements.l1, tau),\n        l2: polynomial(elements.l2, tau),\n        sinD: Math.sin(d),\n        cosD: Math.cos(d),\n    };\n}\n\nexport function tau2julianDay(elements: BesselianElements, tau: number): number {\n    const polyRefJd = Math.floor(elements.t0Jde - elements.t0Hours / 24) + 0.5 + elements.t0Hours / 24;\n\n    return polyRefJd + (tau - getEclipseDeltaT(elements) / 3600) / 24;\n}\n\nexport function julianDay2tau(elements: BesselianElements, jd: number): number {\n    const polyRefJd = Math.floor(elements.t0Jde - elements.t0Hours / 24) + 0.5 + elements.t0Hours / 24;\n    return (jd - polyRefJd) * 24 + getEclipseDeltaT(elements) / 3600;\n}\n\nexport function getEclipseDeltaT(elements: BesselianElements): number {\n    const {year, month} = julianDay2time(elements.t0Jde);\n\n    return getDeltaT(year, month);\n}\n","import {EARTH_POLAR_RADIUS_RATIO, ECCENTRICITY_SQUARED} from '@app/constants/earth';\nimport {DEG} from '@app/constants/math';\n\nexport {EARTH_ROTATION_DEG_PER_HOUR} from '@app/constants/earth';\nexport {DEG, RAD} from '@app/constants/math';\n\nexport const ONE_MINUS_F = EARTH_POLAR_RADIUS_RATIO;\nexport const E_SQ = ECCENTRICITY_SQUARED;\n\nconst HORIZON_REFRACTION_DEG = 34 / 60;\nconst SUN_SEMIDIAMETER_DEG = 16 / 60;\nconst RISE_SET_SUN_ALTITUDE_DEG = -(HORIZON_REFRACTION_DEG + SUN_SEMIDIAMETER_DEG);\nexport const REFRACTED_HORIZON_SIN_ALTITUDE = Math.sin(RISE_SET_SUN_ALTITUDE_DEG * DEG);\nexport const GEOMETRIC_HORIZON_SIN_ALTITUDE = 0;\n\nexport function horizonSinAltitude(settings?: {refraction?: boolean}): number {\n    return settings?.refraction ? REFRACTED_HORIZON_SIN_ALTITUDE : GEOMETRIC_HORIZON_SIN_ALTITUDE;\n}\n\nexport const CENTRAL_LINE_STEP_HOURS = 1 / (60 * 60);\nexport const UMBRA_REGION_STEP_HOURS = 1 / 720;\n\nexport const RISE_SET_BOUNDARY_STEP_HOURS = 1 / 60;\nexport const RISE_SET_BOUNDARY_Q_SAMPLES = 180;\nexport const RISE_SET_TIP_REFINEMENT_SAMPLES = 16;\nexport const RISE_SET_MAX_CHORD_DEG = 0.75;\nexport const RISE_SET_GAP_SUBDIVISION_DEPTH = 5;\n","export function normalizeLongitude(lon: number): number {\n    let result = lon;\n    while (result > 180) {\n        result -= 360;\n    }\n    while (result < -180) {\n        result += 360;\n    }\n\n    return result;\n}\n","import type {LatLon} from '@app/types/LocationTypes';\nimport {DEG} from './constants';\n\nconst POLE_EDGE_STEP_DEG = 5;\n\nexport function latLonChordDeg(a: LatLon, b: LatLon): number {\n    const dLat = b.lat - a.lat;\n    const dLon = shortestLonDelta(a.lon, b.lon) * Math.cos(((a.lat + b.lat) / 2) * DEG);\n\n    return Math.hypot(dLat, dLon);\n}\n\nexport function shortestLonDelta(from: number, to: number): number {\n    return shortestPeriodicDelta(to - from, 360);\n}\n\nexport function shortestAngleDelta(from: number, to: number): number {\n    return shortestPeriodicDelta(to - from, 2 * Math.PI);\n}\n\nfunction shortestPeriodicDelta(delta: number, period: number): number {\n    let result = delta;\n    while (result > period / 2) {\n        result -= period;\n    }\n    while (result < -period / 2) {\n        result += period;\n    }\n\n    return result;\n}\n\nexport function unwrapPoints(points: Array<LatLon>): Array<LatLon> {\n    if (points.length === 0) {\n        return points;\n    }\n    const result: Array<LatLon> = [points[0]];\n    for (let i = 1; i < points.length; i++) {\n        result.push({lat: points[i].lat, lon: result[i - 1].lon + shortestLonDelta(result[i - 1].lon, points[i].lon)});\n    }\n\n    return result;\n}\n\nexport function lonWinding(path: Array<LatLon>): number {\n    let winding = shortestLonDelta(path[path.length - 1].lon, path[0].lon);\n    for (let i = 1; i < path.length; i++) {\n        winding += shortestLonDelta(path[i - 1].lon, path[i].lon);\n    }\n\n    return winding;\n}\n\nexport function closeContourAroundPole(path: Array<LatLon>, poleLat: number, winding: number): Array<LatLon> {\n    const start = path[0];\n    const closed = [...path, {lat: start.lat, lon: start.lon}, {lat: poleLat, lon: start.lon}];\n    const steps = Math.ceil(Math.abs(winding) / POLE_EDGE_STEP_DEG);\n    for (let k = 1; k <= steps; k++) {\n        closed.push({lat: poleLat, lon: start.lon - (winding * k) / steps});\n    }\n\n    return closed;\n}\n\nexport function signedUnwrappedArea(path: Array<LatLon>): number {\n    const unwrapped = unwrapPoints(path);\n    let area = 0;\n    for (let i = 0; i < unwrapped.length; i++) {\n        const a = unwrapped[i];\n        const b = unwrapped[(i + 1) % unwrapped.length];\n        area += a.lon * b.lat - b.lon * a.lat;\n    }\n\n    return area / 2;\n}\n","import type {LatLon} from '@app/types/LocationTypes';\nimport {normalizeLongitude} from '@app/utils/location';\nimport type {BesselianElements, BesselianElementsAtTime} from '@package/solarEclipse/types/BesselianElementTypes';\nimport {getEclipseDeltaT} from '@package/solarEclipse/utils/besselianElements';\nimport {DEG, E_SQ, EARTH_ROTATION_DEG_PER_HOUR, ONE_MINUS_F, RAD} from './constants';\n\nexport interface FundamentalPoint {\n    xi: number;\n    eta: number;\n    zeta: number;\n}\n\nexport interface SurfaceSolution {\n    lat: number;\n    lon: number;\n    zeta: number;\n    sinU: number;\n}\n\nexport function solveSurfacePoint(\n    elements: BesselianElements,\n    e: BesselianElementsAtTime,\n    xi: number,\n    eta: number,\n    farSide: boolean,\n    deltaT: number = getEclipseDeltaT(elements),\n): SurfaceSolution | null {\n    const {eta1, sinD1, cosD1} = diskTerms(e, eta);\n    const bSq = 1 - xi * xi - eta1 * eta1;\n    if (bSq < 0) {\n        return null;\n    }\n    const sign = farSide ? -1 : 1;\n    const B = sign * Math.sqrt(bSq);\n\n    const sinU = eta1 * cosD1 + B * sinD1;\n\n    const zetaSq = 1 - E_SQ * sinU * sinU - xi * xi - eta * eta;\n    if (zetaSq < 0) {\n        return null;\n    }\n    const zeta = sign * Math.sqrt(zetaSq);\n\n    return finishSolution(e, xi, sinU, zeta, deltaT);\n}\n\n// Like solveSurfacePoint, but clamps a point that misses the ellipsoid onto the limb\n// (B = 0, zeta = 0) instead of failing, always on the sunlit near side.\nexport function solveLimbClampedSurfacePoint(\n    elements: BesselianElements,\n    e: BesselianElementsAtTime,\n    xi: number,\n    eta: number,\n    deltaT: number = getEclipseDeltaT(elements),\n): SurfaceSolution {\n    const {eta1, sinD1, cosD1} = diskTerms(e, eta);\n    const B = Math.sqrt(Math.max(0, 1 - xi * xi - eta1 * eta1));\n\n    const sinU = Math.max(-1, Math.min(1, eta1 * cosD1 + B * sinD1));\n    const zeta = Math.sqrt(Math.max(0, 1 - E_SQ * sinU * sinU - xi * xi - eta * eta));\n\n    return finishSolution(e, xi, sinU, zeta, deltaT);\n}\n\nexport function groundFundamentalPoint(\n    elements: BesselianElements,\n    e: BesselianElementsAtTime,\n    lat: number,\n    lon: number,\n    deltaT: number = getEclipseDeltaT(elements),\n): FundamentalPoint {\n    const deltaTCorrection = (EARTH_ROTATION_DEG_PER_HOUR * deltaT) / 3600;\n    const hourAngle = e.mu + (lon - deltaTCorrection) * DEG;\n    const u = Math.atan(ONE_MINUS_F * Math.tan(lat * DEG));\n    const rhoSinPhi = ONE_MINUS_F * Math.sin(u);\n    const rhoCosPhi = Math.cos(u);\n\n    return {\n        xi: rhoCosPhi * Math.sin(hourAngle),\n        eta: rhoSinPhi * e.cosD - rhoCosPhi * Math.cos(hourAngle) * e.sinD,\n        zeta: rhoSinPhi * e.sinD + rhoCosPhi * Math.cos(hourAngle) * e.cosD,\n    };\n}\n\nexport function fundamentalToLatLon(\n    elements: BesselianElements,\n    e: BesselianElementsAtTime,\n    xi: number,\n    eta: number,\n): LatLon | null {\n    const solution = solveSurfacePoint(elements, e, xi, eta, false);\n\n    return solution !== null ? {lat: solution.lat, lon: solution.lon} : null;\n}\n\nfunction diskTerms(e: BesselianElementsAtTime, eta: number): {eta1: number; sinD1: number; cosD1: number} {\n    const rho1 = Math.sqrt(1 - E_SQ * e.cosD * e.cosD);\n\n    return {eta1: eta / rho1, sinD1: e.sinD / rho1, cosD1: (ONE_MINUS_F * e.cosD) / rho1};\n}\n\nfunction finishSolution(\n    e: BesselianElementsAtTime,\n    xi: number,\n    sinU: number,\n    zeta: number,\n    deltaT: number,\n): SurfaceSolution {\n    const cosU = Math.sqrt(Math.max(0, 1 - sinU * sinU));\n    const theta = Math.atan2(xi, (zeta - ONE_MINUS_F * sinU * e.sinD) / e.cosD);\n    const lat = Math.atan2(sinU, ONE_MINUS_F * cosU) * RAD;\n    const lon = normalizeLongitude((theta - e.mu) * RAD + (EARTH_ROTATION_DEG_PER_HOUR * deltaT) / 3600);\n\n    return {lat, lon, zeta, sinU};\n}\n","import type {LatLon} from '@app/types/LocationTypes';\nimport {normalizeLongitude} from '@app/utils/location';\nimport type {BesselianElements, BesselianElementsAtTime} from '@package/solarEclipse/types/BesselianElementTypes';\nimport {getBesselianElementsAtTime, getEclipseDeltaT} from '@package/solarEclipse/utils/besselianElements';\nimport {DEG, E_SQ, EARTH_ROTATION_DEG_PER_HOUR, ONE_MINUS_F, RAD} from './constants';\nimport {\n    closeContourAroundPole,\n    lonWinding,\n    shortestAngleDelta,\n    shortestLonDelta,\n    signedUnwrappedArea,\n} from './contourGeometry';\nimport {groundFundamentalPoint, solveSurfacePoint} from './surface';\n\nconst PENUMBRA_Q_SAMPLES = 240;\nconst UMBRA_Q_SAMPLES = 64;\n\nconst RING_ARC_STEP = (2 * Math.PI) / 240;\nconst RING_ARC_MAX_CHORD_DEG = 0.1;\nconst RING_ARC_MAX_DEPTH = 10;\n\nconst UMBRA_OUTLINE_SEED_SAMPLES = 96;\nconst UMBRA_OUTLINE_DUPLICATE_CHORD_DEG = 1e-7;\n\nconst MARCH_INITIAL_STEP_DEG = 0.02;\nconst MARCH_MIN_STEP_DEG = 0.001;\nconst MARCH_MAX_STEP_DEG = 0.12;\nconst MARCH_MAX_TURN_DEG = 5;\nconst MARCH_STEP_GROW_FACTOR = 1.4;\nconst MARCH_GRADIENT_STEP_DEG = 1e-4;\nconst MARCH_MARGIN_TOLERANCE = 1e-9;\nconst MARCH_CORRECTOR_ITERATIONS = 12;\nconst MARCH_MAX_POINTS = 20000;\nconst MARCH_CLOSURE_MIN_POINTS = 6;\n\nexport interface EdgeSample {\n    point: LatLon;\n    xi: number;\n    eta: number;\n    zeta: number;\n}\n\nexport interface EdgeAnchor {\n    sample: EdgeSample;\n    q: number;\n}\n\nexport interface RingPoint {\n    point: LatLon;\n    xi: number;\n    eta: number;\n    sinU: number;\n}\n\nexport function getInstantaneousUmbraOutline(\n    elements: BesselianElements,\n    tau: number,\n    z0: number,\n): Array<LatLon> | null {\n    const e = getBesselianElementsAtTime(elements, tau);\n    const outline = traceVisibleUmbraOutline(elements, e, z0);\n    if (outline === null) {\n        return null;\n    }\n\n    const cleaned = dropNearDuplicatePoints(outline);\n    if (cleaned.length < 3) {\n        return null;\n    }\n    if (signedUnwrappedArea(cleaned) < 0) {\n        cleaned.reverse();\n    }\n\n    return cleaned.map(({lat, lon}) => ({lat, lon: normalizeLongitude(lon)}));\n}\n\nfunction traceVisibleUmbraOutline(\n    elements: BesselianElements,\n    e: BesselianElementsAtTime,\n    z0: number,\n): Array<LatLon> | null {\n    const margin = groundMarginFunction(elements, e, z0);\n    const seed = findBoundarySeed(elements, e, z0, margin);\n    if (seed === null) {\n        return null;\n    }\n\n    return marchBoundary(margin, seed);\n}\n\ntype GroundMargin = (lat: number, lon: number) => number;\n\nfunction groundMarginFunction(elements: BesselianElements, e: BesselianElementsAtTime, z0: number): GroundMargin {\n    const deltaT = getEclipseDeltaT(elements);\n\n    return (lat: number, lon: number): number => {\n        const {xi, eta, zeta} = groundFundamentalPoint(elements, e, lat, lon, deltaT);\n        const l2 = e.l2 - zeta * elements.tanF2;\n        const distance = Math.hypot(e.x - xi, e.y - eta);\n\n        return Math.min(Math.abs(l2) - distance, zeta - z0);\n    };\n}\n\nfunction findBoundarySeed(\n    elements: BesselianElements,\n    e: BesselianElementsAtTime,\n    z0: number,\n    margin: GroundMargin,\n): LatLon | null {\n    const qStep = (2 * Math.PI) / UMBRA_OUTLINE_SEED_SAMPLES;\n    let best: EdgeSample | null = null;\n    for (let i = 0; i < UMBRA_OUTLINE_SEED_SAMPLES; i++) {\n        const sample = shadowEdgePoint(elements, e, i * qStep, true, false, z0);\n        if (sample !== null && (best === null || sample.zeta > best.zeta)) {\n            best = sample;\n        }\n    }\n    if (best === null) {\n        return null;\n    }\n\n    return correctOntoBoundary(margin, best.point, MARCH_INITIAL_STEP_DEG);\n}\n\nfunction marchBoundary(margin: GroundMargin, seed: LatLon): Array<LatLon> | null {\n    const points: Array<LatLon> = [seed];\n    let position = seed;\n    let stepDeg = MARCH_INITIAL_STEP_DEG;\n    for (let i = 0; i < MARCH_MAX_POINTS; i++) {\n        const advanced = advanceAlongBoundary(margin, position, stepDeg);\n        if (advanced === null) {\n            return null;\n        }\n        position = advanced.point;\n        stepDeg =\n            advanced.turnDeg < MARCH_MAX_TURN_DEG / 3\n                ? Math.min(advanced.stepDeg * MARCH_STEP_GROW_FACTOR, MARCH_MAX_STEP_DEG)\n                : advanced.stepDeg;\n        if (points.length >= MARCH_CLOSURE_MIN_POINTS && !groundChordTooLong(position, seed, stepDeg)) {\n            return points;\n        }\n        points.push(position);\n    }\n\n    return null;\n}\n\nfunction advanceAlongBoundary(\n    margin: GroundMargin,\n    position: LatLon,\n    stepDeg: number,\n): {point: LatLon; stepDeg: number; turnDeg: number} | null {\n    const tangent = boundaryTangent(margin, position);\n    if (tangent === null) {\n        return null;\n    }\n    let step = stepDeg;\n    while (true) {\n        const predicted = movePoint(position, tangent, step);\n        const corrected = correctOntoBoundary(margin, predicted, step);\n        if (corrected !== null) {\n            const newTangent = boundaryTangent(margin, corrected);\n            if (newTangent !== null) {\n                const turnDeg =\n                    Math.acos(Math.max(-1, Math.min(1, tangent.x * newTangent.x + tangent.y * newTangent.y))) * RAD;\n                if (turnDeg <= MARCH_MAX_TURN_DEG || step <= MARCH_MIN_STEP_DEG) {\n                    return {point: corrected, stepDeg: step, turnDeg};\n                }\n            }\n        }\n        if (step <= MARCH_MIN_STEP_DEG) {\n            return null;\n        }\n        step = Math.max(step / 2, MARCH_MIN_STEP_DEG);\n    }\n}\n\nfunction boundaryTangent(margin: GroundMargin, position: LatLon): {x: number; y: number} | null {\n    const gradient = marginGradient(margin, position);\n    const length = Math.hypot(gradient.x, gradient.y);\n    if (length < 1e-12) {\n        return null;\n    }\n\n    return {x: gradient.y / length, y: -gradient.x / length};\n}\n\nfunction marginGradient(margin: GroundMargin, position: LatLon): {x: number; y: number} {\n    const h = MARCH_GRADIENT_STEP_DEG;\n    const cosLat = Math.cos(position.lat * DEG);\n    const dLon = h / Math.max(cosLat, 1e-6);\n\n    return {\n        x: (margin(position.lat, position.lon + dLon) - margin(position.lat, position.lon - dLon)) / (2 * h),\n        y: (margin(position.lat + h, position.lon) - margin(position.lat - h, position.lon)) / (2 * h),\n    };\n}\n\nfunction correctOntoBoundary(margin: GroundMargin, start: LatLon, maxShiftDeg: number): LatLon | null {\n    let position = start;\n    for (let iter = 0; iter < MARCH_CORRECTOR_ITERATIONS; iter++) {\n        const value = margin(position.lat, position.lon);\n        if (Math.abs(value) < MARCH_MARGIN_TOLERANCE) {\n            return position;\n        }\n        const gradient = marginGradient(margin, position);\n        const lengthSq = gradient.x * gradient.x + gradient.y * gradient.y;\n        if (lengthSq < 1e-24) {\n            return null;\n        }\n        const shift = -value / Math.sqrt(lengthSq);\n        const clamped = Math.max(-2 * maxShiftDeg, Math.min(2 * maxShiftDeg, shift));\n        const direction = {\n            x: gradient.x / Math.sqrt(lengthSq),\n            y: gradient.y / Math.sqrt(lengthSq),\n        };\n        position = movePoint(position, direction, clamped);\n    }\n\n    return null;\n}\n\nfunction movePoint(position: LatLon, direction: {x: number; y: number}, stepDeg: number): LatLon {\n    const cosLat = Math.cos(position.lat * DEG);\n\n    return {\n        lat: position.lat + direction.y * stepDeg,\n        lon: position.lon + (direction.x * stepDeg) / Math.max(cosLat, 1e-6),\n    };\n}\n\nfunction dropNearDuplicatePoints(outline: Array<LatLon>): Array<LatLon> {\n    const cleaned: Array<LatLon> = [];\n    for (const point of outline) {\n        const last = cleaned[cleaned.length - 1];\n        if (last === undefined || groundChordTooLong(last, point, UMBRA_OUTLINE_DUPLICATE_CHORD_DEG)) {\n            cleaned.push(point);\n        }\n    }\n    while (\n        cleaned.length > 1\n        && !groundChordTooLong(cleaned[0], cleaned[cleaned.length - 1], UMBRA_OUTLINE_DUPLICATE_CHORD_DEG)\n    ) {\n        cleaned.pop();\n    }\n\n    return cleaned;\n}\n\nexport function calculateShadowRegionContours(\n    elements: BesselianElements,\n    useUmbra: boolean,\n    stepHours: number,\n    z0: number,\n): Array<Array<LatLon>> {\n    const qSamples = useUmbra ? UMBRA_Q_SAMPLES : PENUMBRA_Q_SAMPLES;\n    const contours: Array<Array<LatLon>> = [];\n    for (let tau = elements.tMin; tau <= elements.tMax; tau += stepHours) {\n        const e = getBesselianElementsAtTime(elements, tau);\n        let outline = instantaneousShadowOutline(elements, e, useUmbra, qSamples, z0);\n        if (outline === null) {\n            continue;\n        }\n\n        const winding = lonWinding(outline);\n        if (Math.abs(winding) >= 180) {\n            const poleLat = isPoleInsideInstantShadow(elements, e, useUmbra, 90, z0)\n                ? 90\n                : isPoleInsideInstantShadow(elements, e, useUmbra, -90, z0)\n                  ? -90\n                  : null;\n            // A contour that winds around the globe without containing a pole is a numerical\n            // artifact; dropping one of hundreds of outlines is invisible, rendering it is not.\n            if (poleLat === null) {\n                continue;\n            }\n            outline = closeContourAroundPole(outline, poleLat, winding);\n        }\n        if (signedUnwrappedArea(outline) < 0) {\n            outline.reverse();\n        }\n        contours.push(outline);\n    }\n\n    return contours;\n}\n\nfunction instantaneousShadowOutline(\n    elements: BesselianElements,\n    e: BesselianElementsAtTime,\n    useUmbra: boolean,\n    qSamples: number,\n    z0: number,\n): Array<LatLon> | null {\n    const qStep = (2 * Math.PI) / qSamples;\n    const samples: Array<EdgeSample | null> = [];\n    let firstAccepted = -1;\n    for (let i = 0; i < qSamples; i++) {\n        const sample = shadowEdgePoint(elements, e, i * qStep, useUmbra, false, z0);\n        samples.push(sample);\n        if (sample !== null && firstAccepted < 0) {\n            firstAccepted = i;\n        }\n    }\n    if (firstAccepted < 0) {\n        return null;\n    }\n\n    const outline: Array<LatLon> = [];\n    let gapStart: EdgeAnchor | null = null;\n    for (let offset = 0; offset <= qSamples; offset++) {\n        const i = (firstAccepted + offset) % qSamples;\n        const q = (firstAccepted + offset) * qStep;\n        const sample = offset === qSamples ? samples[firstAccepted] : samples[i];\n        if (sample === null) {\n            if (gapStart === null && outline.length > 0) {\n                gapStart = bisectEdgeBoundary(elements, e, q - qStep, q, useUmbra, false, z0);\n                if (gapStart !== null) {\n                    outline.push(gapStart.sample.point);\n                }\n            }\n            continue;\n        }\n        if (gapStart !== null) {\n            const gapEnd = bisectEdgeBoundary(elements, e, q, q - qStep, useUmbra, false, z0);\n            const nightIn = nightSheetRun(elements, e, gapStart.q, -1, useUmbra, qStep, z0);\n            const nightOut = gapEnd !== null ? nightSheetRun(elements, e, gapEnd.q, 1, useUmbra, qStep, z0) : [];\n            const arcFrom = nightIn.length > 0 ? nightIn[nightIn.length - 1] : gapStart.sample;\n            const arcTo = nightOut.length > 0 ? nightOut[nightOut.length - 1] : (gapEnd?.sample ?? sample);\n            outline.push(...nightIn.map(({point}) => point));\n            outline.push(...terminatorRingArc(elements, e, arcFrom, arcTo, z0));\n            for (let k = nightOut.length - 1; k >= 0; k--) {\n                outline.push(nightOut[k].point);\n            }\n            if (gapEnd !== null) {\n                outline.push(gapEnd.sample.point);\n            }\n            gapStart = null;\n        }\n        if (offset < qSamples) {\n            outline.push(sample.point);\n        }\n    }\n\n    return outline.length >= 3 ? outline : null;\n}\n\nexport function shadowEdgePoint(\n    elements: BesselianElements,\n    e: BesselianElementsAtTime,\n    q: number,\n    useUmbra: boolean,\n    farSide: boolean,\n    z0: number,\n): EdgeSample | null {\n    const l0 = useUmbra ? e.l2 : e.l1;\n    const tanF = useUmbra ? elements.tanF2 : elements.tanF1;\n    const cosQ = Math.cos(q);\n    const sinQ = Math.sin(q);\n\n    let radius = Math.abs(l0);\n    let xi = 0;\n    let eta = 0;\n    let zeta = 0;\n    let point: LatLon | null = null;\n    for (let iter = 0; iter < 8; iter++) {\n        xi = e.x + radius * cosQ;\n        eta = e.y + radius * sinQ;\n        const solution = solveSurfacePoint(elements, e, xi, eta, farSide);\n        if (solution === null) {\n            return null;\n        }\n        point = {lat: solution.lat, lon: solution.lon};\n        zeta = solution.zeta;\n        const newRadius = Math.abs(l0 - solution.zeta * tanF);\n        if (Math.abs(newRadius - radius) < 1e-9) {\n            break;\n        }\n        radius = newRadius;\n    }\n    if (point === null || zeta < z0) {\n        return null;\n    }\n\n    return {point, xi, eta, zeta};\n}\n\nexport function bisectEdgeBoundary(\n    elements: BesselianElements,\n    e: BesselianElementsAtTime,\n    qGood: number,\n    qBad: number,\n    useUmbra: boolean,\n    farSide: boolean,\n    z0: number,\n): EdgeAnchor | null {\n    let good = qGood;\n    let bad = qBad;\n    for (let iter = 0; iter < 40; iter++) {\n        const qMid = (good + bad) / 2;\n        if (shadowEdgePoint(elements, e, qMid, useUmbra, farSide, z0) !== null) {\n            good = qMid;\n        } else {\n            bad = qMid;\n        }\n        if (Math.abs(bad - good) < 1e-9) {\n            break;\n        }\n    }\n    const sample = shadowEdgePoint(elements, e, good, useUmbra, farSide, z0);\n\n    return sample !== null ? {sample, q: good} : null;\n}\n\nfunction nightSheetRun(\n    elements: BesselianElements,\n    e: BesselianElementsAtTime,\n    qFold: number,\n    direction: number,\n    useUmbra: boolean,\n    qStep: number,\n    z0: number,\n): Array<EdgeSample> {\n    const run: Array<EdgeSample> = [];\n    const nightStep = qStep / 4;\n    const maxSteps = Math.ceil((2 * Math.PI) / nightStep);\n    let qGood = qFold;\n    for (let step = 1; step <= maxSteps; step++) {\n        const q = qFold + direction * step * nightStep;\n        const sample = shadowEdgePoint(elements, e, q, useUmbra, true, z0);\n        if (sample === null) {\n            const crossing = bisectEdgeBoundary(elements, e, qGood, q, useUmbra, true, z0);\n            if (crossing !== null) {\n                run.push(crossing.sample);\n            }\n            break;\n        }\n        run.push(sample);\n        qGood = q;\n    }\n\n    return run;\n}\n\nfunction terminatorRingArc(\n    elements: BesselianElements,\n    e: BesselianElementsAtTime,\n    from: EdgeSample,\n    to: EdgeSample,\n    z0: number,\n): Array<LatLon> {\n    const thetaFrom = Math.atan2(from.eta, from.xi);\n    const thetaTo = Math.atan2(to.eta, to.xi);\n    let sinU = solveSurfacePoint(elements, e, from.xi, from.eta, true)?.sinU ?? 0;\n\n    const distanceToShadowCentre = (theta: number): number => {\n        const ringPoint = terminatorRingPoint(elements, e, theta, sinU, z0);\n\n        return Math.hypot(ringPoint.xi - e.x, ringPoint.eta - e.y);\n    };\n\n    let delta = shortestAngleDelta(thetaFrom, thetaTo);\n    const deltaLong = delta - Math.sign(delta || 1) * 2 * Math.PI;\n    if (distanceToShadowCentre(thetaFrom + deltaLong / 2) < distanceToShadowCentre(thetaFrom + delta / 2)) {\n        delta = deltaLong;\n    }\n\n    const anchors: Array<{theta: number; ring: RingPoint}> = [\n        {theta: thetaFrom, ring: {point: from.point, xi: from.xi, eta: from.eta, sinU}},\n    ];\n    const steps = Math.max(1, Math.ceil(Math.abs(delta) / RING_ARC_STEP));\n    for (let k = 1; k < steps; k++) {\n        const theta = thetaFrom + (delta * k) / steps;\n        const ringPoint = terminatorRingPoint(elements, e, theta, sinU, z0);\n        sinU = ringPoint.sinU;\n        anchors.push({theta, ring: ringPoint});\n    }\n    anchors.push({theta: thetaFrom + delta, ring: {point: to.point, xi: to.xi, eta: to.eta, sinU}});\n\n    const chordTooLong = (a: RingPoint, b: RingPoint): boolean =>\n        groundChordTooLong(a.point, b.point, RING_ARC_MAX_CHORD_DEG);\n\n    const arc: Array<LatLon> = [];\n    const emitBetween = (thetaA: number, a: RingPoint, thetaB: number, b: RingPoint, depth: number): void => {\n        if (depth >= RING_ARC_MAX_DEPTH || !chordTooLong(a, b)) {\n            return;\n        }\n        const thetaMid = (thetaA + thetaB) / 2;\n        const mid = terminatorRingPoint(elements, e, thetaMid, a.sinU, z0);\n        emitBetween(thetaA, a, thetaMid, mid, depth + 1);\n        arc.push(mid.point);\n        emitBetween(thetaMid, mid, thetaB, b, depth + 1);\n    };\n\n    for (let i = 1; i < anchors.length; i++) {\n        if (i > 1) {\n            arc.push(anchors[i - 1].ring.point);\n        }\n        emitBetween(anchors[i - 1].theta, anchors[i - 1].ring, anchors[i].theta, anchors[i].ring, 0);\n    }\n\n    return arc;\n}\n\nexport function terminatorRingPoint(\n    elements: BesselianElements,\n    e: BesselianElementsAtTime,\n    theta: number,\n    sinUSeed: number,\n    z0: number,\n): RingPoint {\n    const cosTheta = Math.cos(theta);\n    const sinTheta = Math.sin(theta);\n\n    let sinU = sinUSeed;\n    let xi = 0;\n    let eta = 0;\n    for (let iter = 0; iter < 4; iter++) {\n        const rho = Math.sqrt(Math.max(0, 1 - E_SQ * sinU * sinU - z0 * z0));\n        xi = rho * cosTheta;\n        eta = rho * sinTheta;\n        sinU = (eta * e.cosD + z0 * e.sinD) / ONE_MINUS_F;\n    }\n\n    const cosU = Math.sqrt(Math.max(0, 1 - sinU * sinU));\n    const lat = Math.atan2(sinU, ONE_MINUS_F * cosU) * RAD;\n    const thetaG = Math.atan2(xi, (z0 - ONE_MINUS_F * sinU * e.sinD) / e.cosD);\n    const lon = normalizeLongitude(\n        (thetaG - e.mu) * RAD + (EARTH_ROTATION_DEG_PER_HOUR * getEclipseDeltaT(elements)) / 3600,\n    );\n\n    return {point: {lat, lon}, xi, eta, sinU};\n}\n\nfunction isPoleInsideInstantShadow(\n    elements: BesselianElements,\n    e: BesselianElementsAtTime,\n    useUmbra: boolean,\n    poleLat: number,\n    z0: number,\n): boolean {\n    const sinU = poleLat > 0 ? 1 : -1;\n    const eta = sinU * ONE_MINUS_F * e.cosD;\n    const zeta = sinU * ONE_MINUS_F * e.sinD;\n    if (zeta < z0) {\n        return false;\n    }\n    const l0 = useUmbra ? e.l2 : e.l1;\n    const tanF = useUmbra ? elements.tanF2 : elements.tanF1;\n\n    return Math.hypot(e.x, e.y - eta) < Math.abs(l0 - zeta * tanF);\n}\n\nfunction groundChordTooLong(a: LatLon, b: LatLon, maxChordDeg: number): boolean {\n    const dLat = b.lat - a.lat;\n    const dLon = shortestLonDelta(a.lon, b.lon) * Math.cos(((a.lat + b.lat) / 2) * DEG);\n\n    return dLat * dLat + dLon * dLon > maxChordDeg * maxChordDeg;\n}\n","import {EPOCH_J2000} from '@app/constants/epoch';\nimport {DEG} from '@app/constants/math';\nimport {normalizeAngle} from '@app/utils/angle';\nimport * as earth from '@app/utils/earth';\nimport {julianCenturiesJ20002julianDay} from '@package/time/utils/dateTime';\n\nexport function getGreenwichMeanSiderealTime(T: number): number {\n    const jd = julianCenturiesJ20002julianDay(T);\n\n    // Meeus 12.4\n    const GMST = 280.46061837 + 360.98564736629 * (jd - EPOCH_J2000) + 0.000387933 * T ** 2 + T ** 3 / 38710000;\n\n    return normalizeAngle(GMST);\n}\n\nexport function getGreenwichApparentSiderealTime(T: number): number {\n    const GMST = getGreenwichMeanSiderealTime(T);\n    const p = earth.getNutationInLongitude(T);\n    const e = earth.getTrueObliquityOfEcliptic(T);\n    const eRad = e * DEG;\n\n    // Meeus 12\n    return GMST + p * Math.cos(eRad);\n}\n\nexport function getLocalMeanSiderealTime(T: number, lon: number): number {\n    const GMST = getGreenwichMeanSiderealTime(T);\n\n    const LMST = GMST + lon;\n\n    return normalizeAngle(LMST);\n}\n\nexport function getLocalApparentSiderealTime(T: number, lon: number): number {\n    const GAST = getGreenwichApparentSiderealTime(T);\n\n    // Meeus 12\n    return GAST + lon;\n}\n\nexport function getLocalHourAngle(T: number, lon: number, rightAscension: number): number {\n    const LAST = getLocalApparentSiderealTime(T, lon);\n\n    return normalizeAngle(LAST - rightAscension);\n}\n","import {EARTH_AXIS_RATIO, EARTH_EQUATORIAL_RADIUS_METERS} from '@app/constants/earth';\nimport {DEG, RAD} from '@app/constants/math';\nimport type {Location} from '@app/types/LocationTypes';\nimport {normalizeAngle, sec2deg} from '@app/utils/angle';\nimport * as earth from '@app/utils/earth';\nimport {correctPrecessionForEclipticCoordinates} from '@app/utils/precession';\nimport {getLocalApparentSiderealTime, getLocalHourAngle} from '@app/utils/siderealTime';\nimport {julianCenturiesJ20002julianDay} from '@package/time/utils/dateTime';\nimport type {\n    EclipticSphericalCoordinates,\n    EquatorialSphericalCoordinates,\n    LocalHorizontalCoordinates,\n    RectangularCoordinates,\n} from '../types/CoordinateTypes';\n\nexport function rectangular2spherical(coords: RectangularCoordinates): EclipticSphericalCoordinates {\n    const {x, y, z} = coords;\n\n    // Meeus 33.2\n    const lonRad = Math.atan2(y, x);\n    const lon = normalizeAngle(lonRad * RAD);\n\n    const latRad = Math.atan(z / Math.sqrt(x ** 2 + y ** 2));\n    const lat = latRad * RAD;\n\n    const radiusVector = Math.sqrt(x ** 2 + y ** 2 + z ** 2);\n\n    return {lon, lat, radiusVector};\n}\n\nexport function spherical2rectangular(coords: EclipticSphericalCoordinates): RectangularCoordinates {\n    const {lon, lat, radiusVector} = coords;\n\n    const lonRad = lon * DEG;\n    const latRad = lat * DEG;\n\n    const x = radiusVector * Math.cos(latRad) * Math.cos(lonRad);\n    const y = radiusVector * Math.cos(latRad) * Math.sin(lonRad);\n    const z = radiusVector * Math.sin(latRad);\n\n    return {x, y, z};\n}\n\nexport function equatorialSpherical2topocentricSpherical(\n    coords: EquatorialSphericalCoordinates,\n    location: Location,\n    T: number,\n): EquatorialSphericalCoordinates {\n    const {rightAscension, declination, radiusVector} = coords;\n    let {lat, lon, elevation} = location;\n\n    const dRad = declination * DEG;\n\n    elevation = elevation || 0.0;\n    const rhoSinLat = getRhoSinLat(lat, elevation);\n    const rhoCosLat = getRhoCosLat(lat, elevation);\n\n    const pi = getEquatorialParallax(radiusVector);\n    const piRad = pi * DEG;\n\n    const LAST = getLocalApparentSiderealTime(T, lon);\n    const H = getLocalHourAngle(T, lon, rightAscension);\n    const HRad = H * DEG;\n\n    // Meeus 40.6\n    const A = Math.cos(dRad) * Math.sin(HRad);\n    const B = Math.cos(dRad) * Math.cos(HRad) - rhoCosLat * Math.sin(piRad);\n    const C = Math.sin(dRad) - rhoSinLat * Math.sin(piRad);\n\n    // Meeus 40.7\n    const q = Math.sqrt(A * A + B * B + C * C);\n\n    const HTopo = Math.atan2(A, B) * RAD;\n    const dTopoRad = Math.asin(C / q);\n\n    return {\n        rightAscension: normalizeAngle(LAST - HTopo),\n        declination: dTopoRad * RAD,\n        radiusVector: q * radiusVector,\n    };\n}\n\nexport function equatorialSpherical2topocentricHorizontal(\n    coords: EquatorialSphericalCoordinates,\n    location: Location,\n    T: number,\n): LocalHorizontalCoordinates {\n    const {lat, lon} = location;\n\n    const topoCoords = equatorialSpherical2topocentricSpherical(coords, location, T);\n    const H = getLocalHourAngle(T, lon, topoCoords.rightAscension);\n\n    return equatorialSpherical2topocentricHorizontalByLocalHourAngle(\n        H,\n        topoCoords.declination,\n        lat,\n        topoCoords.radiusVector,\n    );\n}\n\nexport function equatorialSpherical2topocentricHorizontalByLocalHourAngle(\n    localHourAngle: number,\n    declination: number,\n    lat: number,\n    radiusVector = 0,\n): LocalHorizontalCoordinates {\n    const HRad = localHourAngle * DEG;\n    const dRad = declination * DEG;\n    const latRad = lat * DEG;\n\n    // Meeus 13.5\n    const ARad = Math.atan2(Math.sin(HRad), Math.cos(HRad) * Math.sin(latRad) - Math.tan(dRad) * Math.cos(latRad));\n\n    // Meeus 13.6\n    const hRad = Math.asin(Math.sin(latRad) * Math.sin(dRad) + Math.cos(latRad) * Math.cos(dRad) * Math.cos(HRad));\n\n    return {\n        azimuth: normalizeAngle(ARad * RAD + 180),\n        altitude: hRad * RAD,\n        radiusVector: radiusVector,\n    };\n}\n\nexport function equatorialSpherical2topocentricSphericalByLocalHourAngle(\n    localHourAngle: number,\n    declination: number,\n    radiusVector: number,\n    location: Location,\n): {localHourAngle: number; declination: number; radiusVector: number} {\n    const rhoSinLat = getRhoSinLat(location.lat, location.elevation);\n    const rhoCosLat = getRhoCosLat(location.lat, location.elevation);\n    const piRad = getEquatorialParallax(radiusVector) * DEG;\n\n    const HRad = localHourAngle * DEG;\n    const dRad = declination * DEG;\n\n    const A = Math.cos(dRad) * Math.sin(HRad);\n    const B = Math.cos(dRad) * Math.cos(HRad) - rhoCosLat * Math.sin(piRad);\n    const C = Math.sin(dRad) - rhoSinLat * Math.sin(piRad);\n\n    const q = Math.sqrt(A * A + B * B + C * C);\n\n    return {\n        localHourAngle: normalizeAngle(Math.atan2(A, B) * RAD + 180) - 180,\n        declination: Math.asin(C / q) * RAD,\n        radiusVector: q * radiusVector,\n    };\n}\n\nexport function eclipticSpherical2equatorialSpherical(\n    coords: EclipticSphericalCoordinates,\n    T: number,\n    normalize = true,\n): EquatorialSphericalCoordinates {\n    const {lon, lat, radiusVector} = coords;\n\n    const eps = earth.getTrueObliquityOfEcliptic(T);\n    const epsRad = eps * DEG;\n    const lonRad = lon * DEG;\n    const latRad = lat * DEG;\n\n    // Meeus 13.3\n    const n = Math.sin(lonRad) * Math.cos(epsRad) - (Math.sin(latRad) / Math.cos(latRad)) * Math.sin(epsRad);\n    const d = Math.cos(lonRad);\n    const rightAscensionRad = Math.atan2(n, d);\n    const rightAscension = normalize ? normalizeAngle(rightAscensionRad * RAD) : rightAscensionRad * RAD;\n\n    // Meeus 13.4\n    const declinationRad = Math.asin(\n        Math.sin(latRad) * Math.cos(epsRad) + Math.cos(latRad) * Math.sin(epsRad) * Math.sin(lonRad),\n    );\n    const declination = declinationRad * RAD;\n\n    return {rightAscension, declination, radiusVector};\n}\n\nexport function equatorialSpherical2eclipticSpherical(\n    coords: EquatorialSphericalCoordinates,\n    T: number,\n): EclipticSphericalCoordinates {\n    const {rightAscension, declination, radiusVector} = coords;\n\n    const eps = earth.getTrueObliquityOfEcliptic(T);\n    const epsRad = eps * DEG;\n    const rightAscensionRad = rightAscension * DEG;\n    const declinationRad = declination * DEG;\n\n    // Meeus 13.1\n    const n = Math.sin(rightAscensionRad) * Math.cos(epsRad) + Math.tan(declinationRad) * Math.sin(epsRad);\n    const d = Math.cos(rightAscensionRad);\n    const lonRad = Math.atan2(n, d);\n    const lon = normalizeAngle(lonRad * RAD);\n\n    // Meeus 13.2\n    const latRad = Math.asin(\n        Math.sin(declinationRad) * Math.cos(epsRad)\n            - Math.cos(declinationRad) * Math.sin(epsRad) * Math.sin(rightAscensionRad),\n    );\n    const lat = latRad * RAD;\n\n    return {lon, lat, radiusVector};\n}\n\nexport function rectangularHeliocentric2rectangularGeocentric(\n    heliocentricCoords: RectangularCoordinates,\n    heliocentricCoordsEarth: RectangularCoordinates,\n): RectangularCoordinates {\n    return {\n        x: heliocentricCoords.x - heliocentricCoordsEarth.x,\n        y: heliocentricCoords.y - heliocentricCoordsEarth.y,\n        z: heliocentricCoords.z - heliocentricCoordsEarth.z,\n    };\n}\n\nexport function rectangularGeocentric2rectangularHeliocentric(\n    geocentricCoords: RectangularCoordinates,\n    heliocentricCoordsEarth: RectangularCoordinates,\n): RectangularCoordinates {\n    return {\n        x: geocentricCoords.x + heliocentricCoordsEarth.x,\n        y: geocentricCoords.y + heliocentricCoordsEarth.y,\n        z: geocentricCoords.z + heliocentricCoordsEarth.z,\n    };\n}\n\nexport function earthEclipticSpherical2sunEclipticSpherical(\n    coordsEarth: EclipticSphericalCoordinates,\n): EclipticSphericalCoordinates {\n    const {lon, lat, radiusVector} = coordsEarth;\n\n    return {\n        lon: normalizeAngle(lon + 180),\n        lat: -1 * lat,\n        radiusVector: radiusVector,\n    };\n}\n\n/**\n * @deprecated Use correctPrecessionForEclipticCoordinates()\n */\nexport function eclipticJ20002eclipticDate(\n    lon: number,\n    lat: number,\n    radiusVector: number,\n    T: number,\n): EclipticSphericalCoordinates {\n    const jd = julianCenturiesJ20002julianDay(T);\n\n    return correctPrecessionForEclipticCoordinates({lon, lat, radiusVector}, jd);\n}\n\nexport function getEquatorialParallax(d: number): number {\n    // Meeus 40.1\n    const angle = sec2deg(8.794) * DEG;\n    const piRad = Math.asin(Math.sin(angle) / d);\n\n    return piRad * RAD;\n}\n\nexport function getRhoSinLat(lat: number, elevation: number): number {\n    const latRad = lat * DEG;\n\n    // Meeus 11\n    const uRad = Math.atan(EARTH_AXIS_RATIO * Math.tan(latRad));\n\n    return EARTH_AXIS_RATIO * Math.sin(uRad) + (elevation / EARTH_EQUATORIAL_RADIUS_METERS) * Math.sin(latRad);\n}\n\nexport function getRhoCosLat(lat: number, elevation: number): number {\n    const latRad = lat * DEG;\n\n    // Meeus 11\n    const uRad = Math.atan(EARTH_AXIS_RATIO * Math.tan(latRad));\n\n    return Math.cos(uRad) + (elevation / EARTH_EQUATORIAL_RADIUS_METERS) * Math.cos(latRad);\n}\n","import {DEG, RAD} from '@app/constants/math';\nimport type {EquatorialSphericalCoordinates} from '@app/types/CoordinateTypes';\nimport {normalizeAngle} from '@app/utils/angle';\n\nexport function getElongation(\n    equCoordsObj: EquatorialSphericalCoordinates,\n    equCoordsSun: EquatorialSphericalCoordinates,\n): number {\n    const raObjRad = equCoordsObj.rightAscension * DEG;\n    const dObjRad = equCoordsObj.declination * DEG;\n\n    const raSunRad = equCoordsSun.rightAscension * DEG;\n    const dSunRad = equCoordsSun.declination * DEG;\n\n    // Meeus 48.2\n    const phiRad = Math.acos(\n        Math.sin(dSunRad) * Math.sin(dObjRad) + Math.cos(dSunRad) * Math.cos(dObjRad) * Math.cos(raSunRad - raObjRad),\n    );\n\n    return phiRad * RAD;\n}\n\nexport function getPhaseAngle(\n    equCoordsObj: EquatorialSphericalCoordinates,\n    equCoordsSun: EquatorialSphericalCoordinates,\n): number {\n    const distObj = equCoordsObj.radiusVector;\n    const distSun = equCoordsSun.radiusVector;\n\n    const phi = getElongation(equCoordsObj, equCoordsSun);\n    const phiRad = phi * DEG;\n\n    // Meeus 48.3\n    const i = Math.atan2(distSun * Math.sin(phiRad), distObj - distSun * Math.cos(phiRad));\n\n    return i * RAD;\n}\n\nexport function getIlluminatedFraction(phaseAngle: number): number {\n    const iRad = phaseAngle * DEG;\n\n    // Meeus 48.1\n    return (1 + Math.cos(iRad)) / 2;\n}\n\nexport function getPositionAngleOfBrightLimb(\n    equCoordsObj: EquatorialSphericalCoordinates,\n    equCoordsSun: EquatorialSphericalCoordinates,\n): number {\n    const raObjRad = equCoordsObj.rightAscension * DEG;\n    const dObjRad = equCoordsObj.declination * DEG;\n    const raSunRad = equCoordsSun.rightAscension * DEG;\n    const dSunRad = equCoordsSun.declination * DEG;\n\n    const numerator = Math.cos(dSunRad) * Math.sin(raSunRad - raObjRad);\n    const denominator =\n        Math.sin(dSunRad) * Math.cos(dObjRad) - Math.cos(dSunRad) * Math.sin(dObjRad) * Math.cos(raSunRad - raObjRad);\n\n    const chiRad = Math.atan2(numerator, denominator);\n\n    return normalizeAngle(chiRad * RAD);\n}\n\nexport function isWaxing(chi: number): boolean {\n    return chi >= 180;\n}\n\nexport function getAngularDiameter(distance: number, trueDiameter: number): number {\n    const delta = 2 * Math.atan2(trueDiameter, 2 * distance);\n\n    return delta * RAD;\n}\n\nexport function getAngularSeparation(\n    coords1: EquatorialSphericalCoordinates,\n    coords2: EquatorialSphericalCoordinates,\n): number {\n    const raRad1 = coords1.rightAscension * DEG;\n    const dRad1 = coords1.declination * DEG;\n    const raRad2 = coords2.rightAscension * DEG;\n    const dRad2 = coords2.declination * DEG;\n\n    const dRad = Math.acos(\n        Math.sin(dRad1) * Math.sin(dRad2) + Math.cos(dRad1) * Math.cos(dRad2) * Math.cos(raRad1 - raRad2),\n    );\n\n    return dRad * RAD;\n}\n","import {EARTH_SIDEREAL_ROTATION_PER_DAY} from '@app/constants/earth';\nimport {DEG, RAD} from '@app/constants/math';\nimport {LimbAlignment} from '@app/enums/limb';\nimport type {EquatorialSphericalCoordinates} from '@app/types/CoordinateTypes';\nimport type {EventOptions} from '@app/types/EventTypes';\nimport type {Location} from '@app/types/LocationTypes';\nimport {normalizeAngle} from '@app/utils/angle';\nimport {\n    equatorialSpherical2topocentricHorizontalByLocalHourAngle,\n    equatorialSpherical2topocentricSphericalByLocalHourAngle,\n} from '@app/utils/coordinateTransformation';\nimport {getGreenwichApparentSiderealTime} from '@app/utils/siderealTime';\nimport {julianDay2julianCenturiesJ2000} from '@package/time/utils/dateTime';\n\nexport type EquatorialCoordinatesProvider = (jd: number) => EquatorialSphericalCoordinates;\n\n// Mean atmospheric refraction at the horizon (34'), Meeus chapter 15.\nconst REFRACTION_AT_HORIZON = 0.5667;\n\nconst CONVERGENCE_LIMIT = 0.00001;\nconst MAX_ITERATIONS = 100;\n\nexport function getTransit(location: Location, jd0: number, getCoords: EquatorialCoordinatesProvider): number {\n    const GAST = getGreenwichSiderealTimeAtMidnight(jd0);\n\n    const {rightAscension} = getCoords(jd0);\n\n    // Meeus 15.2\n    let m = normalizeAngle((rightAscension - location.lon - GAST) / 360, 1);\n    let dm = 0;\n\n    let cnt = 0;\n    do {\n        const coords = getCoords(jd0 + m);\n        const H = getLocalHourAngle(coords.rightAscension, location.lon, GAST, m);\n\n        dm = -H / 360;\n        m += dm;\n\n        if (cnt++ > MAX_ITERATIONS) {\n            throw new Error(`Astronomical object has no transit on given day ${jd0}.`);\n        }\n    } while (Math.abs(dm) > CONVERGENCE_LIMIT);\n\n    if (m < 0 || m >= 1) {\n        throw new Error(`Astronomical object has no transit on given day ${jd0}.`);\n    }\n\n    return jd0 + m;\n}\n\nexport function getRise(location: Location, jd0: number, h0: number, getCoords: EquatorialCoordinatesProvider): number {\n    return getRiseSet(location, jd0, h0, getCoords, -1, 'rise');\n}\n\nexport function getSet(location: Location, jd0: number, h0: number, getCoords: EquatorialCoordinatesProvider): number {\n    return getRiseSet(location, jd0, h0, getCoords, 1, 'set');\n}\n\n// Standard altitude h0 of the body's center at the moment of the event, Meeus chapter 15.\nexport function getStandardAltitude(options: EventOptions = {}, angularDiameter = 0): number {\n    const {isRefractionConsidered = true, alignment = LimbAlignment.Center} = options;\n\n    const refraction = isRefractionConsidered ? REFRACTION_AT_HORIZON : 0;\n    const semiDiameter = angularDiameter / 2;\n\n    let h0 = -refraction;\n\n    if (alignment === LimbAlignment.UpperLimb) {\n        h0 -= semiDiameter;\n    } else if (alignment === LimbAlignment.LowerLimb) {\n        h0 += semiDiameter;\n    }\n\n    return h0;\n}\n\nfunction getRiseSet(\n    location: Location,\n    jd0: number,\n    h0: number,\n    getCoords: EquatorialCoordinatesProvider,\n    sign: number,\n    event: 'rise' | 'set',\n): number {\n    const GAST = getGreenwichSiderealTimeAtMidnight(jd0);\n\n    const {rightAscension, declination} = getCoords(jd0);\n\n    const mTransit = normalizeAngle((rightAscension - location.lon - GAST) / 360, 1);\n    const halfDiurnalArc = getHalfDiurnalArc(declination, location.lat, h0);\n\n    if (Number.isNaN(halfDiurnalArc)) {\n        throw new Error(`Astronomical object cannot ${event} on given day ${jd0}.`);\n    }\n\n    let m = normalizeAngle(mTransit + sign * halfDiurnalArc, 1);\n    let dm = 0;\n\n    let cnt = 0;\n    do {\n        const coords = getCoords(jd0 + m);\n        const geocentricH = getLocalHourAngle(coords.rightAscension, location.lon, GAST, m);\n\n        // Reduce the geocentric position to the observer's location. This matters for the\n        // Moon, whose horizontal parallax (~1°) shifts rise and set by several minutes.\n        const {localHourAngle: H, declination} = equatorialSpherical2topocentricSphericalByLocalHourAngle(\n            geocentricH,\n            coords.declination,\n            coords.radiusVector,\n            location,\n        );\n\n        const {altitude} = equatorialSpherical2topocentricHorizontalByLocalHourAngle(H, declination, location.lat);\n\n        // Meeus 15, correction to m\n        dm = (altitude - h0) / (360 * Math.cos(declination * DEG) * Math.cos(location.lat * DEG) * Math.sin(H * DEG));\n        m += dm;\n\n        if (cnt++ > MAX_ITERATIONS) {\n            throw new Error(`Astronomical object cannot ${event} on given day ${jd0}.`);\n        }\n    } while (Math.abs(dm) > CONVERGENCE_LIMIT);\n\n    if (m < 0) {\n        throw new Error(\n            `Astronomical object cannot ${event} on given day ${jd0}. The ${event} happens the day before.`,\n        );\n    }\n\n    if (m >= 1) {\n        throw new Error(`Astronomical object cannot ${event} on given day ${jd0}. The ${event} happens the next day.`);\n    }\n\n    return jd0 + m;\n}\n\nfunction getHalfDiurnalArc(declination: number, lat: number, h0: number): number {\n    const latRad = lat * DEG;\n    const dRad = declination * DEG;\n    const h0Rad = h0 * DEG;\n\n    const cosH0 = (Math.sin(h0Rad) - Math.sin(latRad) * Math.sin(dRad)) / (Math.cos(latRad) * Math.cos(dRad));\n\n    if (Math.abs(cosH0) > 1) {\n        return NaN;\n    }\n\n    const H0 = Math.acos(cosH0) * RAD;\n\n    return H0 / 360;\n}\n\nfunction getLocalHourAngle(rightAscension: number, lon: number, GAST: number, m: number): number {\n    const theta0 = GAST + EARTH_SIDEREAL_ROTATION_PER_DAY * m;\n\n    const H = theta0 + lon - rightAscension;\n\n    return normalizeAngle(H + 180) - 180;\n}\n\nfunction getGreenwichSiderealTimeAtMidnight(jd0: number): number {\n    const T = julianDay2julianCenturiesJ2000(jd0);\n\n    return getGreenwichApparentSiderealTime(T);\n}\n","import type {LatLon} from '@app/types/LocationTypes';\nimport {pad} from '@app/utils/math';\nimport {\n    getGreenwichApparentSiderealTime,\n    getGreenwichMeanSiderealTime,\n    getLocalApparentSiderealTime,\n    getLocalMeanSiderealTime,\n} from '@app/utils/siderealTime';\nimport type {Time} from '../types/TimeTypes';\nimport {\n    dayOfYear2time,\n    getDayOfWeek,\n    getDayOfYear,\n    getDecimalYear,\n    isLeapYear,\n    julianCenturiesJ20002julianDay,\n    julianDay2julianCenturiesJ2000,\n    julianDay2julianDay0,\n    julianDay2julianDayEphemeris,\n    julianDay2julianMillenniaJ2000,\n    julianDay2time,\n    julianDayEphemeris2julianDay,\n    time2julianDay,\n} from '../utils/dateTime';\nimport {getDeltaT} from '../utils/deltaT';\n\nexport default class TimeOfInterest {\n    public readonly jd: number = 0.0;\n\n    public readonly jde: number = 0.0;\n\n    public readonly T: number = 0.0;\n\n    public constructor(public readonly time: Time) {\n        this.jd = time2julianDay(time);\n        this.jde = julianDay2julianDayEphemeris(this.jd);\n        this.T = julianDay2julianCenturiesJ2000(this.jd);\n    }\n\n    public static fromCurrentTime(): TimeOfInterest {\n        const date = new Date(Date.now());\n\n        return new TimeOfInterest({\n            year: date.getUTCFullYear(),\n            month: date.getUTCMonth() + 1,\n            day: date.getUTCDate(),\n            hour: date.getUTCHours(),\n            min: date.getUTCMinutes(),\n            sec: date.getUTCSeconds(),\n        });\n    }\n\n    public static fromTime(year: number, month: number, day: number, hour = 0, min = 0, sec = 0): TimeOfInterest {\n        return new TimeOfInterest({year, month, day, hour, min, sec});\n    }\n\n    public static fromDate(date: Date): TimeOfInterest {\n        return new TimeOfInterest({\n            year: date.getUTCFullYear(),\n            month: date.getUTCMonth() + 1,\n            day: date.getUTCDate(),\n            hour: date.getUTCHours(),\n            min: date.getUTCMinutes(),\n            sec: date.getUTCSeconds(),\n        });\n    }\n\n    public static fromYearOfDay(year: number, dayOfYear: number): TimeOfInterest {\n        const time = dayOfYear2time(year, dayOfYear);\n\n        return new TimeOfInterest(time);\n    }\n\n    public static fromJulianDay(jd: number): TimeOfInterest {\n        const time = julianDay2time(jd);\n\n        return new TimeOfInterest(time);\n    }\n\n    public static fromJulianDayEphemeris(jde: number): TimeOfInterest {\n        return TimeOfInterest.fromJulianDay(julianDayEphemeris2julianDay(jde));\n    }\n\n    public static fromJulianCenturiesJ2000(T: number): TimeOfInterest {\n        const jd = julianCenturiesJ20002julianDay(T);\n        const time = julianDay2time(jd);\n\n        return new TimeOfInterest(time);\n    }\n\n    public getTime(): Time {\n        return this.time;\n    }\n\n    public getString(): string {\n        const {year, month, day, hour, min, sec} = this.time;\n\n        return `${year}-${pad(month, 2)}-${pad(day, 2)} ${pad(hour, 2)}:${pad(min, 2)}:${pad(sec, 2)}`;\n    }\n\n    public getDate(): Date {\n        const {year, month, day, hour, min, sec} = this.time;\n\n        return new Date(Date.UTC(year, month - 1, day, hour, min, sec));\n    }\n\n    public getDecimalYear(): number {\n        return getDecimalYear(this.time);\n    }\n\n    public getDayOfYear(): number {\n        return getDayOfYear(this.time);\n    }\n\n    public getDayOfWeek(): number {\n        return getDayOfWeek(this.time);\n    }\n\n    public isLeapYear(): boolean {\n        return isLeapYear(this.time.year);\n    }\n\n    public getJulianDay(): number {\n        return this.jd;\n    }\n\n    public getJulianDay0(): number {\n        return julianDay2julianDay0(this.jd);\n    }\n\n    public getJulianDayEphemeris(): number {\n        return this.jde;\n    }\n\n    public getJulianCenturiesJ2000(): number {\n        return this.T;\n    }\n\n    public getJulianCenturiesJ2000Ephemeris(): number {\n        return julianDay2julianCenturiesJ2000(this.jde);\n    }\n\n    public getJulianMillenniaJ2000(): number {\n        return julianDay2julianMillenniaJ2000(this.jd);\n    }\n\n    public getJulianMillenniaJ2000Ephemeris(): number {\n        return julianDay2julianMillenniaJ2000(this.jde);\n    }\n\n    public getGreenwichMeanSiderealTime(): number {\n        return getGreenwichMeanSiderealTime(this.T);\n    }\n\n    public getGreenwichApparentSiderealTime(): number {\n        return getGreenwichApparentSiderealTime(this.T);\n    }\n\n    public getLocalMeanSiderealTime(location: LatLon): number {\n        return getLocalMeanSiderealTime(this.T, location.lon);\n    }\n\n    public getLocalApparentSiderealTime(location: LatLon): number {\n        return getLocalApparentSiderealTime(this.T, location.lon);\n    }\n\n    public getDeltaT(): number {\n        const {year, month} = this.time;\n\n        return getDeltaT(year, month);\n    }\n}\n","import {LIGHT_SPEED_KM_PER_SEC} from '@app/constants/units';\nimport {LimbAlignment} from '@app/enums/limb';\nimport type {\n    EclipticSphericalCoordinates,\n    EquatorialSphericalCoordinates,\n    LocalHorizontalCoordinates,\n    RectangularCoordinates,\n} from '@app/types/CoordinateTypes';\nimport type {Location} from '@app/types/LocationTypes';\nimport {correctEffectOfRefraction} from '@app/utils/apparentPositionCorrections';\nimport {\n    eclipticSpherical2equatorialSpherical,\n    equatorialSpherical2topocentricHorizontal,\n    equatorialSpherical2topocentricSpherical,\n    spherical2rectangular,\n} from '@app/utils/coordinateTransformation';\nimport {au2km} from '@app/utils/distance';\nimport {getRise, getSet, getStandardAltitude, getTransit} from '@app/utils/riseSetTransit';\nimport TimeOfInterest from '@package/time/models/TimeOfInterest';\nimport type {AstronomicalObjectInterface} from './AstronomicalObjectInterface';\n\nexport default abstract class AstronomicalObject implements AstronomicalObjectInterface {\n    protected readonly jd0: number = 0.0;\n\n    protected readonly jd: number = 0.0;\n\n    // Julian Centuries J2000 in Dynamical Time (TT), for ephemeris series\n    protected readonly Te: number = 0.0;\n\n    // Julian Millennia J2000 in Dynamical Time (TT), for ephemeris series\n    protected readonly te: number = 0.0;\n\n    // Julian Centuries J2000 in Universal Time (UT), for sidereal time\n    protected readonly T: number = 0.0;\n\n    protected constructor(\n        protected readonly toi: TimeOfInterest = TimeOfInterest.fromCurrentTime(),\n        public readonly name = 'astronomical object',\n    ) {\n        this.jd0 = toi.getJulianDay0();\n        this.jd = toi.getJulianDay();\n        this.T = toi.getJulianCenturiesJ2000();\n        this.Te = toi.getJulianCenturiesJ2000Ephemeris();\n        this.te = toi.getJulianMillenniaJ2000Ephemeris();\n    }\n\n    public getTimeOfInterest(): TimeOfInterest {\n        return this.toi;\n    }\n\n    public abstract getHeliocentricEclipticRectangularJ2000Coordinates(): RectangularCoordinates;\n\n    public abstract getHeliocentricEclipticRectangularDateCoordinates(): RectangularCoordinates;\n\n    public abstract getHeliocentricEclipticSphericalJ2000Coordinates(): EclipticSphericalCoordinates;\n\n    public abstract getHeliocentricEclipticSphericalDateCoordinates(): EclipticSphericalCoordinates;\n\n    public abstract getGeocentricEclipticRectangularJ2000Coordinates(): RectangularCoordinates;\n\n    public abstract getGeocentricEclipticRectangularDateCoordinates(): RectangularCoordinates;\n\n    public abstract getGeocentricEclipticSphericalJ2000Coordinates(): EclipticSphericalCoordinates;\n\n    public abstract getGeocentricEclipticSphericalDateCoordinates(): EclipticSphericalCoordinates;\n\n    public getGeocentricEquatorialSphericalJ2000Coordinates(): EquatorialSphericalCoordinates {\n        const coords = this.getGeocentricEclipticSphericalJ2000Coordinates();\n\n        return eclipticSpherical2equatorialSpherical(coords, this.Te);\n    }\n\n    public getGeocentricEquatorialSphericalDateCoordinates(): EquatorialSphericalCoordinates {\n        const coords = this.getGeocentricEclipticSphericalDateCoordinates();\n\n        return eclipticSpherical2equatorialSpherical(coords, this.Te);\n    }\n\n    public getApparentGeocentricEclipticRectangularCoordinates(): RectangularCoordinates {\n        const coords = this.getApparentGeocentricEclipticSphericalCoordinates();\n\n        return spherical2rectangular(coords);\n    }\n\n    public abstract getApparentGeocentricEclipticSphericalCoordinates(): EclipticSphericalCoordinates;\n\n    public getApparentGeocentricEquatorialSphericalCoordinates(): EquatorialSphericalCoordinates {\n        const coords = this.getApparentGeocentricEclipticSphericalCoordinates();\n\n        return eclipticSpherical2equatorialSpherical(coords, this.Te);\n    }\n\n    public getApparentTopocentricEquatorialSphericalCoordinates(location: Location): EquatorialSphericalCoordinates {\n        const coords = this.getApparentGeocentricEquatorialSphericalCoordinates();\n\n        return equatorialSpherical2topocentricSpherical(coords, location, this.T);\n    }\n\n    public getApparentTopocentricHorizontalCoordinates(location: Location): LocalHorizontalCoordinates {\n        const coords = this.getApparentGeocentricEquatorialSphericalCoordinates();\n\n        return equatorialSpherical2topocentricHorizontal(coords, location, this.T);\n    }\n\n    public getRefractionCorrectedTopocentricHorizontalCoordinates(location: Location): LocalHorizontalCoordinates {\n        const {azimuth, altitude, radiusVector} = this.getApparentTopocentricHorizontalCoordinates(location);\n\n        return {\n            azimuth: azimuth,\n            altitude: correctEffectOfRefraction(altitude),\n            radiusVector: radiusVector,\n        };\n    }\n\n    public getDistanceToEarth(): number {\n        const coords = this.getGeocentricEclipticSphericalDateCoordinates();\n\n        return au2km(coords.radiusVector);\n    }\n\n    public getApparentDistanceToEarth(): number {\n        const coords = this.getApparentGeocentricEclipticSphericalCoordinates();\n\n        return au2km(coords.radiusVector);\n    }\n\n    public getTopocentricDistanceToEarth(location: Location): number {\n        const coords = this.getApparentTopocentricEquatorialSphericalCoordinates(location);\n\n        return au2km(coords.radiusVector);\n    }\n\n    public getLightTime(): number {\n        const {radiusVector} = this.getGeocentricEclipticSphericalDateCoordinates();\n\n        return au2km(radiusVector) / LIGHT_SPEED_KM_PER_SEC;\n    }\n\n    public getAngularDiameter(): number {\n        return 0;\n    }\n\n    public getTransit(location: Location): TimeOfInterest {\n        const jd = getTransit(location, this.jd0, (jd: number) => this.getApparentEquatorialCoordinatesAtJulianDay(jd));\n\n        return TimeOfInterest.fromJulianDay(jd);\n    }\n\n    public getGeometricRise(location: Location, limbAlignment: LimbAlignment = LimbAlignment.Center): TimeOfInterest {\n        return this.getRiseSet(getRise, location, limbAlignment, false);\n    }\n\n    public getApparentRise(location: Location, limbAlignment: LimbAlignment = LimbAlignment.Center): TimeOfInterest {\n        return this.getRiseSet(getRise, location, limbAlignment, true);\n    }\n\n    public getGeometricSet(location: Location, limbAlignment: LimbAlignment = LimbAlignment.Center): TimeOfInterest {\n        return this.getRiseSet(getSet, location, limbAlignment, false);\n    }\n\n    public getApparentSet(location: Location, limbAlignment: LimbAlignment = LimbAlignment.Center): TimeOfInterest {\n        return this.getRiseSet(getSet, location, limbAlignment, true);\n    }\n\n    private getRiseSet(\n        riseSet: typeof getRise,\n        location: Location,\n        limbAlignment: LimbAlignment,\n        isRefractionConsidered: boolean,\n    ): TimeOfInterest {\n        const h0 = getStandardAltitude({isRefractionConsidered, alignment: limbAlignment}, this.getAngularDiameter());\n        const jd = riseSet(location, this.jd0, h0, (jd: number) =>\n            this.getApparentEquatorialCoordinatesAtJulianDay(jd),\n        );\n\n        return TimeOfInterest.fromJulianDay(jd);\n    }\n\n    private getApparentEquatorialCoordinatesAtJulianDay(jd: number): EquatorialSphericalCoordinates {\n        const toi = TimeOfInterest.fromJulianDay(jd);\n        const AstronomicalObjectClass = this.constructor as new (toi: TimeOfInterest) => AstronomicalObject;\n        const object = new AstronomicalObjectClass(toi);\n\n        return object.getApparentGeocentricEquatorialSphericalCoordinates();\n    }\n\n    // public getConjunctionInRightAscensionTo(\n    //     astronomicalObjectConstructor: AstronomicalObjectConstructor,\n    // ): Conjunction {\n    //     return getConjunctionInRightAscension(\n    //         this.constructor as AstronomicalObjectConstructor,\n    //         astronomicalObjectConstructor,\n    //         this.jd0,\n    //     );\n    // }\n    //\n    // public getConjunctionInLongitudeTo(\n    //     astronomicalObjectConstructor: AstronomicalObjectConstructor,\n    // ): Conjunction {\n    //     return getConjunctionInLongitude(\n    //         this.constructor as AstronomicalObjectConstructor,\n    //         astronomicalObjectConstructor,\n    //         this.jd0,\n    //     );\n    // }\n}\n","import type {Vsop87Element, Vsop87Group} from '@app/types/Vsop87Types';\n\nconst VSOP87_L0: Vsop87Element = [\n    [1.75347045673],\n    [0.03341656456, 4.66925680417, 6283.0758499914],\n    [0.00034894275, 4.62610241759, 12566.1516999828],\n    [0.00003497056, 2.74411800971, 5753.3848848968],\n    [0.00003417571, 2.82886579606, 3.523118349],\n    [0.00003135896, 3.62767041758, 77713.7714681205],\n    [0.00002676218, 4.41808351397, 7860.4193924392],\n    [0.00002342687, 6.13516237631, 3930.2096962196],\n    [0.00001324292, 0.74246356352, 11506.7697697936],\n    [0.00001273166, 2.03709655772, 529.6909650946],\n    [0.00001199167, 1.10962944315, 1577.3435424478],\n    [0.0000099025, 5.23268129594, 5884.9268465832],\n    [0.00000901855, 2.04505443513, 26.2983197998],\n    [0.00000857223, 3.50849156957, 398.1490034082],\n    [0.00000779786, 1.17882652114, 5223.6939198022],\n    [0.00000753141, 2.53339053818, 5507.5532386674],\n    [0.00000505264, 4.58292563052, 18849.2275499742],\n    [0.00000492379, 4.20506639861, 775.522611324],\n    [0.00000356655, 2.91954116867, 0.0673103028],\n    [0.00000317087, 5.84901952218, 11790.6290886588],\n    [0.00000284125, 1.89869034186, 796.2980068164],\n    [0.00000271039, 0.31488607649, 10977.078804699],\n    [0.0000024281, 0.34481140906, 5486.777843175],\n    [0.0000020616, 4.80646606059, 2544.3144198834],\n    [0.00000205385, 1.86947813692, 5573.1428014331],\n    [0.00000202261, 2.45767795458, 6069.7767545534],\n    [0.00000155516, 0.83306073807, 213.299095438],\n    [0.00000132212, 3.41118275555, 2942.4634232916],\n    [0.00000126184, 1.0830263021, 20.7753954924],\n    [0.00000115132, 0.64544911683, 0.9803210682],\n    [0.00000102851, 0.63599846727, 4694.0029547076],\n    [0.00000101895, 0.97569221824, 15720.8387848784],\n    [0.00000101724, 4.26679821365, 7.1135470008],\n    [0.00000099206, 6.20992940258, 2146.1654164752],\n    [0.00000097607, 0.6810127227, 155.4203994342],\n    [0.00000085803, 5.98322631256, 161000.6857376741],\n    [0.00000085128, 1.29870743025, 6275.9623029906],\n    [0.00000084711, 3.67080093025, 71430.69561812909],\n    [0.00000079637, 1.807913307, 17260.1546546904],\n    [0.00000078756, 3.03698313141, 12036.4607348882],\n    [0.00000074651, 1.75508916159, 5088.6288397668],\n    [0.00000073874, 3.50319443167, 3154.6870848956],\n    [0.00000073547, 4.67926565481, 801.8209311238],\n    [0.00000069627, 0.83297596966, 9437.762934887],\n    [0.00000062449, 3.97763880587, 8827.3902698748],\n    [0.00000061148, 1.81839811024, 7084.8967811152],\n    [0.00000056963, 2.78430398043, 6286.5989683404],\n    [0.00000056116, 4.38694880779, 14143.4952424306],\n    [0.00000055577, 3.47006009062, 6279.5527316424],\n    [0.00000051992, 0.18914945834, 12139.5535091068],\n    [0.00000051605, 1.33282746983, 1748.016413067],\n    [0.00000051145, 0.28306864501, 5856.4776591154],\n    [0.00000049, 0.48735065033, 1194.4470102246],\n    [0.00000041036, 5.36817351402, 8429.2412664666],\n    [0.00000040938, 2.39850881707, 19651.048481098],\n    [0.000000392, 6.16832995016, 10447.3878396044],\n    [0.0000003677, 6.04133859347, 10213.285546211],\n    [0.00000036596, 2.56955238628, 1059.3819301892],\n    [0.00000035954, 1.70876111898, 2352.8661537718],\n    [0.00000035566, 1.77597314691, 6812.766815086],\n    [0.00000033291, 0.59309499459, 17789.845619785],\n    [0.00000030412, 0.44294464135, 83996.84731811189],\n    [0.00000030047, 2.73975123935, 1349.8674096588],\n    [0.00000025352, 3.16470953405, 4690.4798363586],\n];\n\nconst VSOP87_L1: Vsop87Element = [\n    [6283.31966747491],\n    [0.00206058863, 2.67823455584, 6283.0758499914],\n    [0.0000430343, 2.63512650414, 12566.1516999828],\n    [0.00000425264, 1.59046980729, 3.523118349],\n    [0.00000119261, 5.79557487799, 26.2983197998],\n    [0.00000108977, 2.96618001993, 1577.3435424478],\n    [0.00000093478, 2.59212835365, 18849.2275499742],\n    [0.00000072122, 1.13846158196, 529.6909650946],\n    [0.00000067768, 1.87472304791, 398.1490034082],\n    [0.00000067327, 4.40918235168, 5507.5532386674],\n    [0.00000059027, 2.8879703846, 5223.6939198022],\n    [0.00000055976, 2.17471680261, 155.4203994342],\n    [0.00000045407, 0.39803079805, 796.2980068164],\n    [0.00000036369, 0.46624739835, 775.522611324],\n    [0.00000028958, 2.64707383882, 7.1135470008],\n    [0.00000020844, 5.34138275149, 0.9803210682],\n    [0.00000019097, 1.84628332577, 5486.777843175],\n    [0.00000018508, 4.96855124577, 213.299095438],\n    [0.00000017293, 2.99116864949, 6275.9623029906],\n    [0.00000016233, 0.03216483047, 2544.3144198834],\n    [0.00000015832, 1.43049285325, 2146.1654164752],\n    [0.00000014615, 1.20532366323, 10977.078804699],\n    [0.00000012461, 2.83432285512, 1748.016413067],\n    [0.00000011877, 3.25804815607, 5088.6288397668],\n    [0.00000011808, 5.2737979048, 1194.4470102246],\n    [0.00000011514, 2.07502418155, 4694.0029547076],\n    [0.00000010641, 0.76614199202, 553.5694028424],\n    [0.00000009969, 1.30262991097, 6286.5989683404],\n    [0.00000009721, 4.23925472239, 1349.8674096588],\n    [0.00000009452, 2.69957062864, 242.728603974],\n    [0.00000008577, 5.64475868067, 951.7184062506],\n    [0.00000007576, 5.30062664886, 2352.8661537718],\n    [0.00000006385, 2.65033984967, 9437.762934887],\n    [0.00000006101, 4.66632584188, 4690.4798363586],\n];\n\nconst VSOP87_L2: Vsop87Element = [\n    [0.0005291887],\n    [0.00008719837, 1.07209665242, 6283.0758499914],\n    [0.00000309125, 0.86728818832, 12566.1516999828],\n    [0.00000027339, 0.05297871691, 3.523118349],\n    [0.00000016334, 5.18826691036, 26.2983197998],\n    [0.00000015752, 3.6845788943, 155.4203994342],\n    [0.00000009541, 0.75742297675, 18849.2275499742],\n    [0.00000008937, 2.05705419118, 77713.7714681205],\n    [0.00000006952, 0.8267330541, 775.522611324],\n    [0.00000005064, 4.66284525271, 1577.3435424478],\n    [0.00000004061, 1.03057162962, 7.1135470008],\n    [0.0000000381, 3.4405080349, 5573.1428014331],\n    [0.00000003463, 5.14074632811, 796.2980068164],\n    [0.00000003169, 6.05291851171, 5507.5532386674],\n    [0.0000000302, 1.19246506441, 242.728603974],\n    [0.00000002886, 6.11652627155, 529.6909650946],\n    [0.00000002714, 0.30637881025, 398.1490034082],\n    [0.00000002538, 2.27992810679, 553.5694028424],\n    [0.00000002371, 4.38118838167, 5223.6939198022],\n    [0.00000002079, 3.75435330484, 0.9803210682],\n];\n\nconst VSOP87_L3: Vsop87Element = [\n    [0.00000289226, 5.84384198723, 6283.0758499914],\n    [0.00000034955],\n    [0.00000016819, 5.48766912348, 12566.1516999828],\n    [0.00000002962, 5.19577265202, 155.4203994342],\n    [0.00000001288, 4.72200252235, 3.523118349],\n    [0.00000000714, 5.30045809128, 18849.2275499742],\n    [0.00000000635, 5.96925937141, 242.728603974],\n];\n\nconst VSOP87_L4: Vsop87Element = [\n    [0.00000007717, 4.13446589358, 6283.0758499914],\n    [0.00000000765, 3.83803776214, 12566.1516999828],\n    [0.0000000042, 0.41925861858, 155.4203994342],\n];\n\nconst VSOP87_L5: Vsop87Element = [[0.00000000172, 2.7657906951, 6283.0758499914]];\n\nconst VSOP87_B0: Vsop87Element = [\n    [0.0000027962, 3.19870156017, 84334.66158130829],\n    [0.00000101643, 5.42248619256, 5507.5532386674],\n    [0.00000080445, 3.88013204458, 5223.6939198022],\n    [0.00000043806, 3.70444689758, 2352.8661537718],\n    [0.00000031933, 4.00026369781, 1577.3435424478],\n];\n\nconst VSOP87_B1: Vsop87Element = [\n    [0.0000000903, 3.8972906189, 5507.5532386674],\n    [0.00000006177, 1.73038850355, 5223.6939198022],\n];\n\nconst VSOP87_B2: Vsop87Element = [];\n\nconst VSOP87_B3: Vsop87Element = [];\n\nconst VSOP87_B4: Vsop87Element = [];\n\nconst VSOP87_B5: Vsop87Element = [];\n\nconst VSOP87_R0: Vsop87Element = [\n    [1.00013988799],\n    [0.01670699626, 3.09846350771, 6283.0758499914],\n    [0.00013956023, 3.0552460962, 12566.1516999828],\n    [0.0000308372, 5.19846674381, 77713.7714681205],\n    [0.00001628461, 1.17387749012, 5753.3848848968],\n    [0.00001575568, 2.84685245825, 7860.4193924392],\n    [0.00000924799, 5.45292234084, 11506.7697697936],\n    [0.00000542444, 4.56409149777, 3930.2096962196],\n    [0.0000047211, 3.66100022149, 5884.9268465832],\n    [0.00000345983, 0.96368617687, 5507.5532386674],\n    [0.0000032878, 5.89983646482, 5223.6939198022],\n    [0.00000306784, 0.29867139512, 5573.1428014331],\n    [0.00000243189, 4.27349536153, 11790.6290886588],\n    [0.00000211829, 5.84714540314, 1577.3435424478],\n    [0.00000185752, 5.02194447178, 10977.078804699],\n    [0.00000174844, 3.01193636534, 18849.2275499742],\n    [0.00000109835, 5.05510636285, 5486.777843175],\n    [0.00000098316, 0.88681311277, 6069.7767545534],\n    [0.00000086499, 5.68959778254, 15720.8387848784],\n    [0.00000085825, 1.27083733351, 161000.6857376741],\n    [0.00000064903, 0.27250613787, 17260.1546546904],\n    [0.00000062916, 0.92177108832, 529.6909650946],\n    [0.00000057056, 2.01374292014, 83996.84731811189],\n    [0.00000055736, 5.24159798933, 71430.69561812909],\n    [0.00000049384, 3.24501240359, 2544.3144198834],\n    [0.00000046963, 2.57805070386, 775.522611324],\n    [0.00000044661, 5.53715807302, 9437.762934887],\n    [0.00000042515, 6.01110242003, 6275.9623029906],\n    [0.00000038968, 5.36071738169, 4694.0029547076],\n    [0.00000038245, 2.39255343974, 8827.3902698748],\n    [0.0000003749, 0.82952922332, 19651.048481098],\n    [0.00000036957, 4.90107591914, 12139.5535091068],\n    [0.0000003566, 1.67468058995, 12036.4607348882],\n    [0.00000034537, 1.84270693282, 2942.4634232916],\n    [0.00000033193, 0.24370300098, 7084.8967811152],\n    [0.00000031921, 0.18368229781, 5088.6288397668],\n    [0.00000031846, 1.77775642085, 398.1490034082],\n    [0.00000028464, 1.21344868176, 6286.5989683404],\n    [0.00000027793, 1.89934330904, 6279.5527316424],\n    [0.00000026275, 4.58896850401, 10447.3878396044],\n];\n\nconst VSOP87_R1: Vsop87Element = [\n    [0.00103018608, 1.10748969588, 6283.0758499914],\n    [0.00001721238, 1.06442301418, 12566.1516999828],\n    [0.00000032346, 1.02169059149, 18849.2275499742],\n    [0.00000030799, 2.84353804832, 5507.5532386674],\n    [0.00000024971, 1.31906709482, 5223.6939198022],\n    [0.00000018485, 1.42429748614, 1577.3435424478],\n    [0.00000010078, 5.91378194648, 10977.078804699],\n    [0.00000008654, 1.42046854427, 6275.9623029906],\n    [0.00000008634, 0.27146150602, 5486.777843175],\n    [0.00000005069, 1.68613426734, 5088.6288397668],\n];\n\nconst VSOP87_R2: Vsop87Element = [\n    [0.00004359385, 5.78455133738, 6283.0758499914],\n    [0.00000123633, 5.57934722157, 12566.1516999828],\n    [0.00000008792, 3.62777733395, 77713.7714681205],\n    [0.00000005689, 1.86958905084, 5573.1428014331],\n    [0.00000003301, 5.47027913302, 18849.2275499742],\n    [0.00000001471, 4.48028885617, 5507.5532386674],\n];\n\nconst VSOP87_R3: Vsop87Element = [\n    [0.00000144595, 4.27319435148, 6283.0758499914],\n    [0.00000006729, 3.91697608662, 12566.1516999828],\n];\n\nconst VSOP87_R4: Vsop87Element = [[0.00000003858, 2.56384387339, 6283.0758499914]];\n\nconst VSOP87_R5: Vsop87Element = [];\n\nexport const VSOP87_X: Vsop87Group = [VSOP87_L0, VSOP87_L1, VSOP87_L2, VSOP87_L3, VSOP87_L4, VSOP87_L5];\nexport const VSOP87_Y: Vsop87Group = [VSOP87_B0, VSOP87_B1, VSOP87_B2, VSOP87_B3, VSOP87_B4, VSOP87_B5];\nexport const VSOP87_Z: Vsop87Group = [VSOP87_R0, VSOP87_R1, VSOP87_R2, VSOP87_R3, VSOP87_R4, VSOP87_R5];\n","import type {Vsop87Element, Vsop87Group} from '@app/types/Vsop87Types';\n\nconst VSOP87_L0: Vsop87Element = [\n    [1.75347045673],\n    [0.03341656453, 4.66925680415, 6283.0758499914],\n    [0.00034894275, 4.62610242189, 12566.1516999828],\n    [0.00003497056, 2.74411783405, 5753.3848848968],\n    [0.00003417572, 2.82886579754, 3.523118349],\n    [0.00003135899, 3.62767041756, 77713.7714681205],\n    [0.00002676218, 4.41808345438, 7860.4193924392],\n    [0.00002342691, 6.13516214446, 3930.2096962196],\n    [0.00001324294, 0.74246341673, 11506.7697697936],\n    [0.00001273165, 2.03709657878, 529.6909650946],\n    [0.00001199167, 1.10962946234, 1577.3435424478],\n    [0.0000099025, 5.23268072088, 5884.9268465832],\n    [0.00000901854, 2.04505446477, 26.2983197998],\n    [0.00000857223, 3.50849152283, 398.1490034082],\n    [0.00000779786, 1.17882681962, 5223.6939198022],\n    [0.00000753141, 2.53339052847, 5507.5532386674],\n    [0.00000505267, 4.58292599973, 18849.2275499742],\n    [0.00000492392, 4.20505711826, 775.522611324],\n    [0.00000356672, 2.91954114478, 0.0673103028],\n    [0.00000317087, 5.84901948512, 11790.6290886588],\n    [0.00000284125, 1.89869240932, 796.2980068164],\n    [0.00000271112, 0.31486255375, 10977.078804699],\n    [0.00000242879, 0.34481445893, 5486.777843175],\n    [0.00000206217, 4.80646631478, 2544.3144198834],\n    [0.00000205478, 1.86953770281, 5573.1428014331],\n    [0.00000202318, 2.45767790232, 6069.7767545534],\n    [0.00000155516, 0.83306084617, 213.299095438],\n    [0.00000132212, 3.41118292683, 2942.4634232916],\n    [0.00000126225, 1.08295459501, 20.7753954924],\n    [0.00000115132, 0.64544911683, 0.9803210682],\n    [0.00000102851, 0.63599845579, 4694.0029547076],\n    [0.00000101895, 0.97569280312, 15720.8387848784],\n    [0.00000101724, 4.2667980198, 7.1135470008],\n    [0.00000099206, 6.20992926918, 2146.1654164752],\n    [0.00000097607, 0.68101342359, 155.4203994342],\n    [0.00000085803, 5.9832263126, 161000.6857376741],\n    [0.00000085128, 1.29870764804, 6275.9623029906],\n    [0.00000084711, 3.67080093031, 71430.69561812909],\n    [0.00000079637, 1.80791287082, 17260.1546546904],\n    [0.00000078757, 3.03697458703, 12036.4607348882],\n    [0.00000074651, 1.755089133, 5088.6288397668],\n    [0.00000073874, 3.50319414955, 3154.6870848956],\n    [0.00000073547, 4.67926633877, 801.8209311238],\n    [0.00000069627, 0.83297621398, 9437.762934887],\n    [0.00000062449, 3.97763912806, 8827.3902698748],\n    [0.00000061148, 1.81839892984, 7084.8967811152],\n    [0.00000056963, 2.78430458592, 6286.5989683404],\n    [0.00000056116, 4.38694865354, 14143.4952424306],\n    [0.00000055577, 3.47006059924, 6279.5527316424],\n    [0.00000051992, 0.18914947184, 12139.5535091068],\n    [0.00000051605, 1.33282739866, 1748.016413067],\n    [0.00000051145, 0.28306832879, 5856.4776591154],\n    [0.00000049, 0.48735014197, 1194.4470102246],\n    [0.00000041036, 5.36817592855, 8429.2412664666],\n    [0.00000040938, 2.39850938714, 19651.048481098],\n    [0.000000392, 6.16833020996, 10447.3878396044],\n    [0.0000003677, 6.04133863162, 10213.285546211],\n    [0.00000036596, 2.56957481827, 1059.3819301892],\n    [0.00000035954, 1.70875808777, 2352.8661537718],\n    [0.0000003557, 1.775968892, 6812.766815086],\n    [0.00000033296, 0.59310278598, 17789.845619785],\n    [0.00000030412, 0.44294464169, 83996.84731811189],\n    [0.00000030047, 2.73975124088, 1349.8674096588],\n    [0.00000025352, 3.16470891653, 4690.4798363586],\n];\n\nconst VSOP87_L1: Vsop87Element = [\n    [6283.0758499914],\n    [0.00206058863, 2.67823455808, 6283.0758499914],\n    [0.00004303419, 2.63512233481, 12566.1516999828],\n    [0.00000425264, 1.59046982018, 3.523118349],\n    [0.00000119305, 5.79555765566, 26.2983197998],\n    [0.00000109017, 2.96631010675, 1577.3435424478],\n    [0.00000093479, 2.59211109542, 18849.2275499742],\n    [0.00000072121, 1.13840581212, 529.6909650946],\n    [0.00000067784, 1.87453300345, 398.1490034082],\n    [0.0000006735, 4.40932832004, 5507.5532386674],\n    [0.00000059045, 2.88815790631, 5223.6939198022],\n    [0.00000055976, 2.17471740035, 155.4203994342],\n    [0.00000045411, 0.39799502896, 796.2980068164],\n    [0.00000036298, 0.46875437227, 775.522611324],\n    [0.00000028962, 2.64732254645, 7.1135470008],\n    [0.00000020844, 5.34138275149, 0.9803210682],\n    [0.00000019097, 1.84628376049, 5486.777843175],\n    [0.00000018508, 4.96855179468, 213.299095438],\n    [0.00000017293, 2.9911676063, 6275.9623029906],\n    [0.00000016233, 0.03216587315, 2544.3144198834],\n    [0.00000015832, 1.43049301283, 2146.1654164752],\n    [0.00000014608, 1.2046979369, 10977.078804699],\n    [0.00000012461, 2.83432282119, 1748.016413067],\n    [0.00000011877, 3.25805082007, 5088.6288397668],\n    [0.00000011808, 5.27379760438, 1194.4470102246],\n    [0.00000011514, 2.07502080082, 4694.0029547076],\n    [0.00000010641, 0.76614722966, 553.5694028424],\n    [0.00000009969, 1.30263423409, 6286.5989683404],\n    [0.00000009721, 4.2392586526, 1349.8674096588],\n    [0.00000009452, 2.69956827011, 242.728603974],\n    [0.00000008577, 5.6447608598, 951.7184062506],\n    [0.00000007576, 5.30056172859, 2352.8661537718],\n    [0.00000006385, 2.65034514038, 9437.762934887],\n    [0.00000006101, 4.66633726278, 4690.4798363586],\n];\n\nconst VSOP87_L2: Vsop87Element = [\n    [0.00008721859, 1.07253635559, 6283.0758499914],\n    [0.00000294833, 0.43717350256, 12566.1516999828],\n    [0.00000027338, 0.05295636147, 3.523118349],\n    [0.00000016333, 5.18820215724, 26.2983197998],\n    [0.00000015745, 3.68504712183, 155.4203994342],\n    [0.00000009425, 0.29667114694, 18849.2275499742],\n    [0.00000008938, 2.05706319592, 77713.7714681205],\n    [0.0000000694, 0.82691541038, 775.522611324],\n    [0.00000005061, 4.6624323168, 1577.3435424478],\n    [0.0000000406, 1.03067032318, 7.1135470008],\n    [0.00000003809, 3.44043369494, 5573.1428014331],\n    [0.00000003464, 5.14021224609, 796.2980068164],\n    [0.00000003172, 6.05479318507, 5507.5532386674],\n    [0.0000000302, 1.19240008524, 242.728603974],\n    [0.00000002885, 6.11705865396, 529.6909650946],\n    [0.00000002719, 0.30363248164, 398.1490034082],\n    [0.00000002538, 2.27966434314, 553.5694028424],\n    [0.00000002365, 4.37666117992, 5223.6939198022],\n    [0.00000002078, 3.75435095487, 0.9803210682],\n    [0.00000001675, 0.90149951436, 951.7184062506],\n];\n\nconst VSOP87_L3: Vsop87Element = [\n    [0.00000289058, 5.84173149732, 6283.0758499914],\n    [0.00000020712, 6.0498393902, 12566.1516999828],\n    [0.00000002962, 5.1956057957, 155.4203994342],\n    [0.00000001288, 4.7219761197, 3.523118349],\n    [0.00000000635, 5.96904899168, 242.728603974],\n    [0.0000000057, 5.54182903238, 18849.2275499742],\n    [0.00000000402, 3.78606612895, 553.5694028424],\n];\n\nconst VSOP87_L4: Vsop87Element = [\n    [0.00000007714, 4.14117321449, 6283.0758499914],\n    [0.00000001016, 3.27573644241, 12566.1516999828],\n    [0.0000000042, 0.41892851415, 155.4203994342],\n];\n\nconst VSOP87_L5: Vsop87Element = [[0.00000000172, 2.74854172392, 6283.0758499914]];\n\nconst VSOP87_B0: Vsop87Element = [\n    [0.0000027962, 3.19870156017, 84334.66158130829],\n    [0.00000101643, 5.42248619256, 5507.5532386674],\n    [0.00000080445, 3.88013204458, 5223.6939198022],\n    [0.00000043806, 3.70444689759, 2352.8661537718],\n    [0.00000031933, 4.00026369781, 1577.3435424478],\n];\n\nconst VSOP87_B1: Vsop87Element = [\n    [0.00227777722, 3.4137662053, 6283.0758499914],\n    [0.00003805678, 3.37063423795, 12566.1516999828],\n];\n\nconst VSOP87_B2: Vsop87Element = [];\n\nconst VSOP87_B3: Vsop87Element = [];\n\nconst VSOP87_B4: Vsop87Element = [];\n\nconst VSOP87_B5: Vsop87Element = [];\n\nconst VSOP87_R0: Vsop87Element = [\n    [1.00013988784],\n    [0.01670699632, 3.09846350258, 6283.0758499914],\n    [0.00013956024, 3.05524609456, 12566.1516999828],\n    [0.0000308372, 5.19846674381, 77713.7714681205],\n    [0.00001628463, 1.17387558054, 5753.3848848968],\n    [0.00001575572, 2.84685214877, 7860.4193924392],\n    [0.00000924799, 5.45292236722, 11506.7697697936],\n    [0.00000542439, 4.56409151453, 3930.2096962196],\n    [0.0000047211, 3.66100022149, 5884.9268465832],\n    [0.00000345969, 0.96368627272, 5507.5532386674],\n    [0.0000032878, 5.89983686142, 5223.6939198022],\n    [0.00000306784, 0.29867139512, 5573.1428014331],\n    [0.00000243181, 4.2734953079, 11790.6290886588],\n    [0.00000211836, 5.84714461348, 1577.3435424478],\n    [0.0000018574, 5.02199710705, 10977.078804699],\n    [0.00000174844, 3.01193636733, 18849.2275499742],\n    [0.00000109835, 5.0551063586, 5486.777843175],\n    [0.00000098316, 0.88681311278, 6069.7767545534],\n    [0.000000865, 5.68956418946, 15720.8387848784],\n    [0.00000085831, 1.27079125277, 161000.6857376741],\n    [0.00000064908, 0.27251341435, 17260.1546546904],\n    [0.00000062917, 0.92177053978, 529.6909650946],\n    [0.00000057056, 2.01374292245, 83996.84731811189],\n    [0.00000055736, 5.2415979917, 71430.69561812909],\n    [0.00000049384, 3.24501240359, 2544.3144198834],\n    [0.00000046966, 2.57799853213, 775.522611324],\n    [0.00000044666, 5.53715663816, 9437.762934887],\n    [0.0000004252, 6.01110257982, 6275.9623029906],\n    [0.00000038963, 5.36063832897, 4694.0029547076],\n    [0.00000038245, 2.39255343973, 8827.3902698748],\n    [0.00000037486, 0.82961281844, 19651.048481098],\n    [0.00000036957, 4.90107587287, 12139.5535091068],\n    [0.00000035661, 1.67447135798, 12036.4607348882],\n    [0.00000034537, 1.84270693281, 2942.4634232916],\n    [0.00000033193, 0.24370221704, 7084.8967811152],\n    [0.00000031922, 0.18368299942, 5088.6288397668],\n    [0.00000031846, 1.77775642078, 398.1490034082],\n    [0.00000028468, 1.21344887533, 6286.5989683404],\n    [0.00000027795, 1.89934427832, 6279.5527316424],\n    [0.00000026275, 4.58896863104, 10447.3878396044],\n];\n\nconst VSOP87_R1: Vsop87Element = [\n    [0.00103018607, 1.10748968172, 6283.0758499914],\n    [0.00001721238, 1.06442300386, 12566.1516999828],\n    [0.00000032345, 1.02168583254, 18849.2275499742],\n    [0.00000030801, 2.84358443952, 5507.5532386674],\n    [0.00000024978, 1.31906570344, 5223.6939198022],\n    [0.00000018487, 1.42428709076, 1577.3435424478],\n    [0.00000010077, 5.91385248388, 10977.078804699],\n    [0.00000008654, 1.42046854427, 6275.9623029906],\n    [0.00000008635, 0.27158192945, 5486.777843175],\n    [0.00000005069, 1.68613408916, 5088.6288397668],\n];\n\nconst VSOP87_R2: Vsop87Element = [\n    [0.00004359385, 5.78455133808, 6283.0758499914],\n    [0.00000123633, 5.57935427994, 12566.1516999828],\n    [0.00000008792, 3.62777893099, 77713.7714681205],\n    [0.00000005689, 1.86958905084, 5573.1428014331],\n    [0.00000003302, 5.47034879713, 18849.2275499742],\n    [0.00000001471, 4.47964125007, 5507.5532386674],\n];\n\nconst VSOP87_R3: Vsop87Element = [\n    [0.00000144595, 4.27319433901, 6283.0758499914],\n    [0.00000006729, 3.91706261708, 12566.1516999828],\n];\n\nconst VSOP87_R4: Vsop87Element = [[0.00000003858, 2.56389016346, 6283.0758499914]];\n\nconst VSOP87_R5: Vsop87Element = [];\n\nexport const VSOP87_X: Vsop87Group = [VSOP87_L0, VSOP87_L1, VSOP87_L2, VSOP87_L3, VSOP87_L4, VSOP87_L5];\nexport const VSOP87_Y: Vsop87Group = [VSOP87_B0, VSOP87_B1, VSOP87_B2, VSOP87_B3, VSOP87_B4, VSOP87_B5];\nexport const VSOP87_Z: Vsop87Group = [VSOP87_R0, VSOP87_R1, VSOP87_R2, VSOP87_R3, VSOP87_R4, VSOP87_R5];\n","import {RAD} from '@app/constants/math';\n\nexport function calculateVSOP87Angle(terms: Array<Array<Array<number>>>, t: number): number {\n    const result = calculateVSOP87(terms, t);\n\n    return result * RAD;\n}\n\nexport function calculateVSOP87(terms: Array<Array<Array<number>>>, t: number): number {\n    let result = 0.0;\n\n    terms.forEach((term: Array<Array<number>>, key: number) => {\n        result += sumUpTerm(term, t) * t ** key;\n    });\n\n    return result;\n}\n\nfunction sumUpTerm(terms: Array<Array<number>>, t: number): number {\n    let result = 0.0;\n\n    terms.forEach((term: Array<number>) => {\n        const a = term[0] || 0;\n        const b = term[1] || 0;\n        const c = term[2] || 0;\n\n        result += a * Math.cos(b + c * t);\n    });\n\n    return result;\n}\n","import * as vsop87DateDefault from '@app/resources/vsop87/vsop87EarthSphericalDateReduced';\nimport * as vsop87J2000Default from '@app/resources/vsop87/vsop87EarthSphericalJ2000Reduced';\nimport type {EclipticSphericalCoordinates, RectangularCoordinates} from '@app/types/CoordinateTypes';\nimport type {Vsop87} from '@app/types/Vsop87Types';\nimport {normalizeAngle} from '@app/utils/angle';\nimport {spherical2rectangular} from '@app/utils/coordinateTransformation';\nimport * as earth from '@app/utils/earth';\nimport {calculateVSOP87, calculateVSOP87Angle} from '@app/utils/vsop87';\nimport AstronomicalObject from '@package/core/models/models/AstronomicalObject';\nimport type TimeOfInterest from '@package/time/models/TimeOfInterest';\n\nexport default class Earth extends AstronomicalObject {\n    public constructor(\n        toi?: TimeOfInterest,\n        private readonly vsop87Date: Vsop87 = vsop87DateDefault,\n        private readonly vsop87J2000: Vsop87 = vsop87J2000Default,\n    ) {\n        super(toi, 'earth');\n    }\n\n    public static create(toi?: TimeOfInterest): Earth {\n        return new Earth(toi);\n    }\n\n    public getHeliocentricEclipticRectangularJ2000Coordinates(): RectangularCoordinates {\n        return spherical2rectangular(this.getHeliocentricEclipticSphericalJ2000Coordinates());\n    }\n\n    public getHeliocentricEclipticRectangularDateCoordinates(): RectangularCoordinates {\n        return spherical2rectangular(this.getHeliocentricEclipticSphericalDateCoordinates());\n    }\n\n    public getHeliocentricEclipticSphericalJ2000Coordinates(): EclipticSphericalCoordinates {\n        return {\n            lon: normalizeAngle(calculateVSOP87Angle(this.vsop87J2000.VSOP87_X, this.te)),\n            lat: calculateVSOP87Angle(this.vsop87J2000.VSOP87_Y, this.te),\n            radiusVector: calculateVSOP87(this.vsop87J2000.VSOP87_Z, this.te),\n        };\n    }\n\n    public getHeliocentricEclipticSphericalDateCoordinates(): EclipticSphericalCoordinates {\n        return {\n            lon: normalizeAngle(calculateVSOP87Angle(this.vsop87Date.VSOP87_X, this.te)),\n            lat: calculateVSOP87Angle(this.vsop87Date.VSOP87_Y, this.te),\n            radiusVector: calculateVSOP87(this.vsop87Date.VSOP87_Z, this.te),\n        };\n    }\n\n    public getGeocentricEclipticRectangularJ2000Coordinates(): RectangularCoordinates {\n        return {x: 0, y: 0, z: 0};\n    }\n\n    public getGeocentricEclipticRectangularDateCoordinates(): RectangularCoordinates {\n        return {x: 0, y: 0, z: 0};\n    }\n\n    public getGeocentricEclipticSphericalJ2000Coordinates(): EclipticSphericalCoordinates {\n        return {lon: 0, lat: 0, radiusVector: 0};\n    }\n\n    public getGeocentricEclipticSphericalDateCoordinates(): EclipticSphericalCoordinates {\n        return {lon: 0, lat: 0, radiusVector: 0};\n    }\n\n    public getApparentGeocentricEclipticSphericalCoordinates(): EclipticSphericalCoordinates {\n        return {lon: 0, lat: 0, radiusVector: 0};\n    }\n\n    public getNutationInLongitude(): number {\n        return earth.getNutationInLongitude(this.Te);\n    }\n\n    public getNutationInObliquity(): number {\n        return earth.getNutationInObliquity(this.Te);\n    }\n\n    public getMeanObliquityOfEcliptic(): number {\n        return earth.getMeanObliquityOfEcliptic(this.Te);\n    }\n\n    public getTrueObliquityOfEcliptic(): number {\n        return earth.getTrueObliquityOfEcliptic(this.Te);\n    }\n}\n","import {SUN_DIAMETER_KM} from '@app/constants/sun';\nimport type {EclipticSphericalCoordinates, RectangularCoordinates} from '@app/types/CoordinateTypes';\nimport type {Location} from '@app/types/LocationTypes';\nimport {correctEffectOfAberration, correctEffectOfNutation} from '@app/utils/apparentPositionCorrections';\nimport {earthEclipticSpherical2sunEclipticSpherical, spherical2rectangular} from '@app/utils/coordinateTransformation';\nimport {getAngularDiameter} from '@app/utils/observation';\nimport AstronomicalObject from '@package/core/models/models/AstronomicalObject';\nimport Earth from '@package/earth/models/Earth';\nimport type TimeOfInterest from '@package/time/models/TimeOfInterest';\n\nexport default class Sun extends AstronomicalObject {\n    public constructor(\n        toi?: TimeOfInterest,\n        private readonly earth: Earth = Earth.create(toi),\n    ) {\n        super(toi, 'sun');\n    }\n\n    public static create(toi?: TimeOfInterest): Sun {\n        return new Sun(toi);\n    }\n\n    public getHeliocentricEclipticRectangularJ2000Coordinates(): RectangularCoordinates {\n        return {x: 0, y: 0, z: 0};\n    }\n\n    public getHeliocentricEclipticRectangularDateCoordinates(): RectangularCoordinates {\n        return {x: 0, y: 0, z: 0};\n    }\n\n    public getHeliocentricEclipticSphericalJ2000Coordinates(): EclipticSphericalCoordinates {\n        return {lon: 0, lat: 0, radiusVector: 0};\n    }\n\n    public getHeliocentricEclipticSphericalDateCoordinates(): EclipticSphericalCoordinates {\n        return {lon: 0, lat: 0, radiusVector: 0};\n    }\n\n    public getGeocentricEclipticRectangularJ2000Coordinates(): RectangularCoordinates {\n        return spherical2rectangular(this.getGeocentricEclipticSphericalJ2000Coordinates());\n    }\n\n    public getGeocentricEclipticRectangularDateCoordinates(): RectangularCoordinates {\n        return spherical2rectangular(this.getGeocentricEclipticSphericalDateCoordinates());\n    }\n\n    public getGeocentricEclipticSphericalJ2000Coordinates(): EclipticSphericalCoordinates {\n        return earthEclipticSpherical2sunEclipticSpherical(\n            this.earth.getHeliocentricEclipticSphericalJ2000Coordinates(),\n        );\n    }\n\n    public getGeocentricEclipticSphericalDateCoordinates(): EclipticSphericalCoordinates {\n        return earthEclipticSpherical2sunEclipticSpherical(\n            this.earth.getHeliocentricEclipticSphericalDateCoordinates(),\n        );\n    }\n\n    public getApparentGeocentricEclipticSphericalCoordinates(): EclipticSphericalCoordinates {\n        let coords = this.getGeocentricEclipticSphericalDateCoordinates();\n\n        coords = correctEffectOfAberration(coords, this.Te);\n        coords = correctEffectOfNutation(coords, this.Te);\n\n        return coords;\n    }\n\n    public getAngularDiameter(): number {\n        return getAngularDiameter(this.getApparentDistanceToEarth(), SUN_DIAMETER_KM);\n    }\n\n    public getTopocentricAngularDiameter(location: Location): number {\n        return getAngularDiameter(this.getTopocentricDistanceToEarth(location), SUN_DIAMETER_KM);\n    }\n\n    public getApparentMagnitude(): number {\n        return -26.74;\n    }\n\n    public getTopocentricApparentMagnitude(): number {\n        return -26.74;\n    }\n}\n","import {EARTH_AXIS_RATIO, EARTH_EQUATORIAL_RADIUS_METERS, EARTH_ROTATION_DEG_PER_HOUR} from '@app/constants/earth';\nimport {DEG, RAD} from '@app/constants/math';\nimport type {LocalHorizontalCoordinates} from '@app/types/CoordinateTypes';\nimport type {Location} from '@app/types/LocationTypes';\nimport {normalizeAngle} from '@app/utils/angle';\nimport {correctEffectOfRefraction} from '@app/utils/apparentPositionCorrections';\nimport {LocalSolarEclipseType} from '@package/solarEclipse/enums/SolarEclipseType';\nimport type {LocalEclipseCircumstances} from '@package/solarEclipse/types/EclipseCircumstances';\nimport type {EclipseContacts} from '@package/solarEclipse/types/EclipseContactTypes';\nimport Sun from '@package/sun/models/Sun';\nimport TimeOfInterest from '@package/time/models/TimeOfInterest';\nimport type {BesselianElements} from '../types/BesselianElementTypes';\nimport {getBesselianElementsAtTime, getEclipseDeltaT, tau2julianDay} from './besselianElements';\n\nexport function getLocalEclipseCircumstances(\n    elements: BesselianElements,\n    location: Location,\n    tau: number,\n): LocalEclipseCircumstances {\n    const e = getBesselianElementsAtTime(elements, tau);\n    const deltaTCorrection = (EARTH_ROTATION_DEG_PER_HOUR * getEclipseDeltaT(elements)) / 3600;\n    const hourAngle = e.mu + (location.lon - deltaTCorrection) * DEG;\n\n    const latRad = location.lat * DEG;\n    const h = location.elevation / EARTH_EQUATORIAL_RADIUS_METERS;\n    const u = Math.atan(EARTH_AXIS_RATIO * Math.tan(latRad));\n    const rhoSinPhi = EARTH_AXIS_RATIO * Math.sin(u) + h * Math.sin(latRad);\n    const rhoCosPhi = Math.cos(u) + h * Math.cos(latRad);\n\n    const sinH = Math.sin(hourAngle);\n    const cosH = Math.cos(hourAngle);\n\n    const xi = rhoCosPhi * sinH;\n    const eta = rhoSinPhi * e.cosD - rhoCosPhi * cosH * e.sinD;\n    const zeta = rhoSinPhi * e.sinD + rhoCosPhi * cosH * e.cosD;\n\n    const uVal = e.x - xi;\n    const vVal = e.y - eta;\n\n    return {\n        u: uVal,\n        v: vVal,\n        l1: e.l1 - zeta * elements.tanF1,\n        l2: e.l2 - zeta * elements.tanF2,\n        distance: Math.sqrt(uVal * uVal + vVal * vVal),\n        hourAngle,\n        sinD: e.sinD,\n        cosD: e.cosD,\n    };\n}\n\nexport function isEclipseVisible(\n    elements: BesselianElements,\n    location: Location,\n    contactTaus: EclipseContacts,\n): boolean {\n    const taus = [contactTaus.c1, contactTaus.max, contactTaus.c4];\n    const sunSemiDiameter = getSunSemiDiameter(elements, location, contactTaus.max);\n\n    return taus.some((tau) => {\n        if (tau === null) {\n            return false;\n        }\n\n        const circumstances = getLocalEclipseCircumstances(elements, location, tau);\n        const {altitude} = getLocalHorizontalCoordinates(circumstances, location);\n\n        return getApparentUpperSunLimbAltitude(altitude, sunSemiDiameter) > 0;\n    });\n}\n\nexport function getLocalEclipseType(circumstances: LocalEclipseCircumstances): LocalSolarEclipseType {\n    const {l2, distance} = circumstances;\n    const magnitude = getMagnitude(circumstances);\n\n    if (magnitude <= 0.0) {\n        return LocalSolarEclipseType.None;\n    }\n\n    if (distance < l2 || distance < -1 * l2) {\n        if (l2 < 0.0) {\n            return LocalSolarEclipseType.Total;\n        }\n\n        return LocalSolarEclipseType.Annular;\n    }\n\n    return LocalSolarEclipseType.Partial;\n}\n\nexport function getMaximumEclipse(circumstances: LocalEclipseCircumstances): number {\n    return circumstances.distance;\n}\n\nexport function getMagnitude(circumstances: LocalEclipseCircumstances): number {\n    const {l1, l2, distance} = circumstances;\n\n    return (l1 - distance) / (l1 + l2);\n}\n\nexport function getMoonSunRatio(circumstances: LocalEclipseCircumstances): number {\n    const {l1, l2} = circumstances;\n\n    return (l1 - l2) / (l1 + l2);\n}\n\nexport function getObscuration(circumstances: LocalEclipseCircumstances): number {\n    const {l1, l2, distance} = circumstances;\n\n    const eclipseType = getLocalEclipseType(circumstances);\n    const magnitude = getMagnitude(circumstances);\n    const moonSunRatio = getMoonSunRatio(circumstances);\n\n    if (magnitude <= 0.0) {\n        return 0.0;\n    }\n\n    if (magnitude >= 1.0) {\n        return 1.0;\n    }\n\n    if (eclipseType === LocalSolarEclipseType.Annular) {\n        return moonSunRatio ** 2;\n    }\n\n    const cNumerator = l1 ** 2 + l2 ** 2 - 2 * distance ** 2;\n    const cDenominator = l1 ** 2 - l2 ** 2;\n    const c = Math.acos(cNumerator / cDenominator);\n\n    const bNumerator = (l1 * l2 + distance ** 2) / distance;\n    const bDenominator = l1 + l2;\n    const b = Math.acos(bNumerator / bDenominator);\n\n    const a = Math.PI - b - c;\n\n    const result = moonSunRatio ** 2 * a + b - moonSunRatio * Math.sin(c);\n\n    return result / Math.PI;\n}\n\nexport function getLocalHorizontalCoordinates(\n    circumstances: Pick<LocalEclipseCircumstances, 'hourAngle' | 'sinD' | 'cosD'>,\n    location: Location,\n): LocalHorizontalCoordinates {\n    const {hourAngle, sinD, cosD} = circumstances;\n    const lat = location.lat * DEG;\n    const sinAltitude = Math.sin(lat) * sinD + Math.cos(lat) * cosD * Math.cos(hourAngle);\n    const altitude = Math.asin(Math.max(-1, Math.min(1, sinAltitude))) * RAD;\n    const azimuth = Math.atan2(\n        Math.sin(hourAngle),\n        Math.cos(hourAngle) * Math.sin(lat) - (sinD / cosD) * Math.cos(lat),\n    );\n\n    return {\n        azimuth: normalizeAngle(azimuth * RAD + 180),\n        altitude,\n        radiusVector: 0,\n    };\n}\n\nexport function getSunSemiDiameter(elements: BesselianElements, location: Location, tau: number): number {\n    const toi = TimeOfInterest.fromJulianDay(tau2julianDay(elements, tau));\n\n    return Sun.create(toi).getTopocentricAngularDiameter(location) / 2;\n}\n\nexport function getApparentUpperSunLimbAltitude(altitude: number, sunSemiDiameter: number): number {\n    return correctEffectOfRefraction(altitude + sunSemiDiameter);\n}\n","import type {LocalHorizontalCoordinates} from '@app/types/CoordinateTypes';\nimport type {LatLon, Location} from '@app/types/LocationTypes';\nimport {correctEffectOfRefraction} from '@app/utils/apparentPositionCorrections';\nimport {julianDay2tau} from '@package/solarEclipse/utils/besselianElements';\nimport type TimeOfInterest from '@package/time/models/TimeOfInterest';\nimport type {LocalSolarEclipseType} from '../enums/SolarEclipseType';\nimport type {ShadowPathOptions} from '../services/shadowGeometry/types/ShadowPathTypes';\nimport {horizonSinAltitude} from '../services/shadowGeometry/utils/constants';\nimport {getInstantaneousUmbraOutline} from '../services/shadowGeometry/utils/shadowOutline';\nimport type {BesselianElements} from '../types/BesselianElementTypes';\nimport type {LocalEclipseCircumstances as LocalEclipseCircumstancesType} from '../types/EclipseCircumstances';\nimport {\n    getLocalEclipseCircumstances,\n    getLocalEclipseType,\n    getLocalHorizontalCoordinates,\n    getMagnitude,\n    getObscuration,\n} from '../utils/localCircumstances';\n\nexport default class LocalEclipseCircumstances {\n    private readonly tau: number;\n    private readonly circumstances: LocalEclipseCircumstancesType;\n\n    private constructor(\n        private readonly elements: BesselianElements,\n        private readonly location: Location,\n        toi: TimeOfInterest,\n    ) {\n        this.tau = julianDay2tau(elements, toi.getJulianDay());\n        this.circumstances = getLocalEclipseCircumstances(elements, location, this.tau);\n    }\n\n    public static create(\n        elements: BesselianElements,\n        location: Location,\n        toi: TimeOfInterest,\n    ): LocalEclipseCircumstances {\n        return new LocalEclipseCircumstances(elements, location, toi);\n    }\n\n    public getEclipseType(): LocalSolarEclipseType {\n        return getLocalEclipseType(this.circumstances);\n    }\n\n    public isInEclipse(): boolean {\n        return this.circumstances.distance < this.circumstances.l1;\n    }\n\n    public isInCentralEclipse(): boolean {\n        return this.circumstances.distance < Math.abs(this.circumstances.l2);\n    }\n\n    public getUmbraShadowOutline(options: ShadowPathOptions = {}): Array<LatLon> | null {\n        if (!this.isInCentralEclipse()) {\n            return null;\n        }\n\n        return getInstantaneousUmbraOutline(this.elements, this.tau, horizonSinAltitude(options));\n    }\n\n    public getMagnitude(): number {\n        return getMagnitude(this.circumstances);\n    }\n\n    public getObscuration(): number {\n        return getObscuration(this.circumstances);\n    }\n\n    public getTopocentricHorizontalCoordinates(): LocalHorizontalCoordinates {\n        return getLocalHorizontalCoordinates(this.circumstances, this.location);\n    }\n\n    public getApparentTopocentricHorizontalCoordinates(): LocalHorizontalCoordinates {\n        const {azimuth, altitude, radiusVector} = this.getTopocentricHorizontalCoordinates();\n\n        return {\n            azimuth: azimuth,\n            altitude: correctEffectOfRefraction(altitude),\n            radiusVector: radiusVector,\n        };\n    }\n}\n","import {EARTH_AXIS_RATIO, EARTH_EQUATORIAL_RADIUS_METERS, EARTH_ROTATION_DEG_PER_HOUR} from '@app/constants/earth';\nimport {DEG} from '@app/constants/math';\nimport type {Location} from '@app/types/LocationTypes';\nimport {polynomialDerivative} from '@app/utils/polynoms';\nimport type {BesselianElements} from '../types/BesselianElementTypes';\nimport type {EclipseContacts} from '../types/EclipseContactTypes';\nimport {getBesselianElementsAtTime, getEclipseDeltaT, tau2julianDay} from './besselianElements';\nimport {getApparentUpperSunLimbAltitude, getLocalHorizontalCoordinates, getSunSemiDiameter} from './localCircumstances';\n\nconst ITERATION_TOLERANCE_HOURS = 1e-8;\nconst MAX_ITERATIONS = 30;\nconst TIME_MARGIN_HOURS = 0.5;\nconst SEARCH_RANGE_HOURS = 4;\n\nconst HORIZON_SCAN_SAMPLES = 64;\nconst HORIZON_BISECTION_ITERATIONS = 60;\n\ninterface ObserverGeocentric {\n    rhoSinPhi: number;\n    rhoCosPhi: number;\n    lon: number;\n}\n\ninterface FundamentalSnapshot {\n    u: number;\n    v: number;\n    uDot: number;\n    vDot: number;\n    nSq: number;\n    l1: number;\n    l2: number;\n    hourAngle: number;\n    sinD: number;\n    cosD: number;\n}\n\ninterface VisibleWindow {\n    sunrise: number | null;\n    sunset: number | null;\n}\n\nexport function getContactTaus(elements: BesselianElements, location: Location): EclipseContacts | null {\n    const obs = computeObserverGeocentric(location);\n\n    const max = findMaximum(elements, obs, 0);\n    if (max === null) {\n        return null;\n    }\n\n    const atMax = snapshot(elements, max, obs);\n    const minDistSq = atMax.u * atMax.u + atMax.v * atMax.v;\n    if (minDistSq > atMax.l1 * atMax.l1) {\n        return null;\n    }\n\n    const c1 = findContact(elements, obs, max, false, false);\n    const c4 = findContact(elements, obs, max, false, true);\n    if (c1 === null || c4 === null) {\n        return null;\n    }\n\n    let c2: number | null = null;\n    let c3: number | null = null;\n    if (minDistSq < atMax.l2 * atMax.l2) {\n        const tauC2 = findContact(elements, obs, max, true, false);\n        const tauC3 = findContact(elements, obs, max, true, true);\n        if (tauC2 !== null && tauC3 !== null) {\n            c2 = tauC2;\n            c3 = tauC3;\n        }\n    }\n\n    const window = findVisibleWindow(elements, obs, location, c1, c4);\n    if (window === null) {\n        return null;\n    }\n\n    return {c1, c2, max, c3, c4, sunrise: window.sunrise, sunset: window.sunset};\n}\n\nexport function contactTausToContactJulianDays(\n    elements: BesselianElements,\n    contactTaus: EclipseContacts,\n): EclipseContacts | null {\n    if (!contactTaus) {\n        return null;\n    }\n\n    return {\n        c1: tau2julianDay(elements, contactTaus.c1),\n        c2: contactTaus.c2 ? tau2julianDay(elements, contactTaus.c2) : null,\n        max: tau2julianDay(elements, contactTaus.max),\n        c3: contactTaus.c3 ? tau2julianDay(elements, contactTaus.c3) : null,\n        c4: tau2julianDay(elements, contactTaus.c4),\n        sunrise: contactTaus.sunrise !== null ? tau2julianDay(elements, contactTaus.sunrise) : null,\n        sunset: contactTaus.sunset !== null ? tau2julianDay(elements, contactTaus.sunset) : null,\n    };\n}\n\nexport function clampToVisibleWindow(\n    contacts: EclipseContacts,\n    start: number,\n    end: number,\n): {start: number; end: number} | null {\n    const visibleStart = Math.max(start, contacts.sunrise ?? start);\n    const visibleEnd = Math.min(end, contacts.sunset ?? end);\n\n    return visibleEnd > visibleStart ? {start: visibleStart, end: visibleEnd} : null;\n}\n\nfunction computeObserverGeocentric(location: Location): ObserverGeocentric {\n    const latRad = location.lat * DEG;\n    const h = location.elevation / EARTH_EQUATORIAL_RADIUS_METERS;\n    const u = Math.atan(EARTH_AXIS_RATIO * Math.tan(latRad));\n\n    return {\n        rhoSinPhi: EARTH_AXIS_RATIO * Math.sin(u) + h * Math.sin(latRad),\n        rhoCosPhi: Math.cos(u) + h * Math.cos(latRad),\n        lon: location.lon,\n    };\n}\n\nfunction findMaximum(elements: BesselianElements, obs: ObserverGeocentric, startTau: number): number | null {\n    let tau = startTau;\n    for (let i = 0; i < MAX_ITERATIONS; i++) {\n        const s = snapshot(elements, tau, obs);\n        if (s.nSq === 0) {\n            return null;\n        }\n        const delta = -(s.u * s.uDot + s.v * s.vDot) / s.nSq;\n        tau += delta;\n        if (!inBounds(tau)) {\n            return null;\n        }\n        if (Math.abs(delta) < ITERATION_TOLERANCE_HOURS) {\n            return tau;\n        }\n    }\n\n    return inBounds(tau) ? tau : null;\n}\n\nfunction findContact(\n    elements: BesselianElements,\n    obs: ObserverGeocentric,\n    startTau: number,\n    useUmbra: boolean,\n    isAfterMax: boolean,\n): number | null {\n    let tau = startTau;\n    const sign = isAfterMax ? 1 : -1;\n    for (let i = 0; i < MAX_ITERATIONS; i++) {\n        const s = snapshot(elements, tau, obs);\n        if (s.nSq === 0) {\n            return null;\n        }\n        const l = useUmbra ? s.l2 : s.l1;\n        const cross = s.u * s.vDot - s.v * s.uDot;\n        const discriminant = s.nSq * l * l - cross * cross;\n        if (discriminant < 0) {\n            return null;\n        }\n        const sqrtDisc = Math.sqrt(discriminant);\n        const delta = (-(s.u * s.uDot + s.v * s.vDot) + sign * sqrtDisc) / s.nSq;\n        tau += delta;\n        if (!inBounds(tau)) {\n            return null;\n        }\n        if (Math.abs(delta) < ITERATION_TOLERANCE_HOURS) {\n            return tau;\n        }\n    }\n\n    return inBounds(tau) ? tau : null;\n}\n\nfunction findVisibleWindow(\n    elements: BesselianElements,\n    obs: ObserverGeocentric,\n    location: Location,\n    tauStart: number,\n    tauEnd: number,\n): VisibleWindow | null {\n    const margin = horizonMargin(elements, obs, location, (tauStart + tauEnd) / 2);\n    const tauAt = (i: number): number =>\n        i === HORIZON_SCAN_SAMPLES ? tauEnd : tauStart + ((tauEnd - tauStart) * i) / HORIZON_SCAN_SAMPLES;\n\n    let firstAbove: number | null = null;\n    let lastAbove: number | null = null;\n    for (let i = 0; i <= HORIZON_SCAN_SAMPLES; i++) {\n        if (margin(tauAt(i)) >= 0) {\n            if (firstAbove === null) {\n                firstAbove = i;\n            }\n            lastAbove = i;\n        }\n    }\n\n    if (firstAbove === null || lastAbove === null) {\n        return null;\n    }\n\n    const sunrise = firstAbove > 0 ? bisectHorizon(margin, tauAt(firstAbove - 1), tauAt(firstAbove)) : null;\n    const sunset =\n        lastAbove < HORIZON_SCAN_SAMPLES ? bisectHorizon(margin, tauAt(lastAbove), tauAt(lastAbove + 1)) : null;\n\n    return {sunrise, sunset};\n}\n\nfunction horizonMargin(\n    elements: BesselianElements,\n    obs: ObserverGeocentric,\n    location: Location,\n    tauMiddle: number,\n): (tau: number) => number {\n    const sunSemiDiameter = getSunSemiDiameter(elements, location, tauMiddle);\n\n    return (tau: number): number => {\n        const {altitude} = getLocalHorizontalCoordinates(snapshot(elements, tau, obs), location);\n\n        return getApparentUpperSunLimbAltitude(altitude, sunSemiDiameter);\n    };\n}\n\nfunction bisectHorizon(margin: (tau: number) => number, lo: number, hi: number): number {\n    let low = lo;\n    let high = hi;\n    let lowBelow = margin(low) < 0;\n\n    for (let i = 0; i < HORIZON_BISECTION_ITERATIONS; i++) {\n        const mid = (low + high) / 2;\n        const midBelow = margin(mid) < 0;\n        if (midBelow === lowBelow) {\n            low = mid;\n            lowBelow = midBelow;\n        } else {\n            high = mid;\n        }\n    }\n\n    return (low + high) / 2;\n}\n\nfunction snapshot(elements: BesselianElements, tau: number, obs: ObserverGeocentric): FundamentalSnapshot {\n    const e = getBesselianElementsAtTime(elements, tau);\n    const dMuDt = polynomialDerivative(elements.mu, tau) * DEG;\n    const dDDt = polynomialDerivative(elements.d, tau) * DEG;\n\n    const deltaTCorrection = (EARTH_ROTATION_DEG_PER_HOUR * getEclipseDeltaT(elements)) / 3600;\n    const hourAngle = e.mu + (obs.lon - deltaTCorrection) * DEG;\n    const sinH = Math.sin(hourAngle);\n    const cosH = Math.cos(hourAngle);\n\n    const xi = obs.rhoCosPhi * sinH;\n    const eta = obs.rhoSinPhi * e.cosD - obs.rhoCosPhi * cosH * e.sinD;\n    const zeta = obs.rhoSinPhi * e.sinD + obs.rhoCosPhi * cosH * e.cosD;\n\n    const xiDot = dMuDt * obs.rhoCosPhi * cosH;\n    const etaDot = dMuDt * xi * e.sinD - zeta * dDDt;\n\n    const dx = polynomialDerivative(elements.x, tau);\n    const dy = polynomialDerivative(elements.y, tau);\n\n    const u = e.x - xi;\n    const v = e.y - eta;\n    const uDot = dx - xiDot;\n    const vDot = dy - etaDot;\n\n    return {\n        u,\n        v,\n        uDot,\n        vDot,\n        nSq: uDot * uDot + vDot * vDot,\n        l1: e.l1 - zeta * elements.tanF1,\n        l2: e.l2 - zeta * elements.tanF2,\n        hourAngle,\n        sinD: e.sinD,\n        cosD: e.cosD,\n    };\n}\n\nfunction inBounds(tau: number): boolean {\n    return Math.abs(tau) <= SEARCH_RANGE_HOURS + TIME_MARGIN_HOURS;\n}\n","import type {Location} from '@app/types/LocationTypes';\nimport type {BesselianElements} from '@package/solarEclipse/types/BesselianElementTypes';\nimport {clampToVisibleWindow, getContactTaus} from './contacts';\n\nexport function getDuration(elements: BesselianElements, location: Location): number {\n    const contacts = getContactTaus(elements, location);\n    if (contacts === null) {\n        return 0;\n    }\n\n    const visible = clampToVisibleWindow(contacts, contacts.c1, contacts.c4);\n    if (visible === null) {\n        return 0;\n    }\n\n    return (visible.end - visible.start) * 3600;\n}\n\nexport function getCentralDuration(elements: BesselianElements, location: Location): number {\n    const contacts = getContactTaus(elements, location);\n    if (contacts === null || contacts.c2 === null || contacts.c3 === null) {\n        return 0;\n    }\n\n    const visible = clampToVisibleWindow(contacts, contacts.c2, contacts.c3);\n    if (visible === null) {\n        return 0;\n    }\n\n    return (visible.end - visible.start) * 3600;\n}\n","import {DEG} from '@app/constants/math';\nimport type {LatLon} from '@app/types/LocationTypes';\nimport {polynomialDerivative} from '@app/utils/polynoms';\nimport type {BesselianElements, BesselianElementsAtTime} from '@package/solarEclipse/types/BesselianElementTypes';\nimport {getBesselianElementsAtTime} from '@package/solarEclipse/utils/besselianElements';\nimport type {ShadowPathOptions} from '../types/ShadowPathTypes';\nimport {E_SQ, horizonSinAltitude, ONE_MINUS_F} from './constants';\nimport {latLonChordDeg, shortestAngleDelta, signedUnwrappedArea} from './contourGeometry';\nimport {type EdgeSample, shadowEdgePoint, terminatorRingPoint} from './shadowOutline';\nimport {solveSurfacePoint} from './surface';\n\nconst DEFAULT_STEP_SECONDS = 10;\nconst TANGENT_ITERATIONS = 12;\nconst TANGENT_CONVERGENCE_RAD = 1e-9;\nconst TOUCH_TIME_ITERATIONS = 40;\nconst CAP_PROBE_DOUBLINGS = 18;\nconst CAP_EDGE_ITERATIONS = 40;\nconst CAP_EDGE_SEED_DIVISOR = 1024;\nconst CAP_MAX_CHORD_DEG = 0.05;\nconst CAP_MAX_DEPTH = 12;\nconst CROSSING_ITERATIONS = 40;\n\ninterface SidePoint {\n    tau: number;\n    point: LatLon;\n}\n\n// The path is the region ever covered by the umbra while the Sun stands above the horizon —\n// the same region the map's umbral shading shows. Its boundary has two kinds of pieces: the\n// tangency envelope of the moving umbra (northern and southern limits) and, at each end, a\n// rounded cap traced by the intersections of the umbra's edge with the horizon ring — points\n// whose sunrise/sunset happens exactly on the shadow's edge. Each cap runs from one envelope\n// end around the touch/leave tip to the other envelope end, bulging past the\n// maximum-eclipse-at-horizon curve where the eclipse is already/still in progress at rise/set.\nexport default function calculateUmbraPathPolygon(\n    elements: BesselianElements,\n    options: ShadowPathOptions = {},\n): Array<LatLon> {\n    const z0 = horizonSinAltitude(options);\n    const stepHours = (options.stepsInSeconds ?? DEFAULT_STEP_SECONDS) / 3600;\n\n    const taus: Array<number> = [];\n    for (let tau = elements.tMin; tau <= elements.tMax; tau += stepHours) {\n        taus.push(tau);\n    }\n    const onSurface = taus.map((tau) => umbraTouchesSurface(elements, tau, z0));\n    const first = onSurface.indexOf(true);\n    if (first < 0) {\n        return [];\n    }\n    const last = onSurface.lastIndexOf(true);\n\n    const sideA: Array<SidePoint> = [];\n    const sideB: Array<SidePoint> = [];\n    for (let i = first; i <= last; i++) {\n        const {a, b} = getUmbraLimitPoints(elements, taus[i], z0);\n        if (a !== null) {\n            sideA.push({tau: taus[i], point: a});\n        }\n        if (b !== null) {\n            sideB.push({tau: taus[i], point: b});\n        }\n    }\n\n    const touchStartTau = first > 0 ? touchTau(elements, taus[first - 1], taus[first], z0) : taus[first];\n    const touchEndTau = last < taus.length - 1 ? touchTau(elements, taus[last + 1], taus[last], z0) : taus[last];\n    const capStart =\n        horizonCap(elements, touchStartTau, 1, sideB[0], sideA[0], stepHours, z0)\n        ?? touchPointFallback(elements, touchStartTau, z0);\n    const capEnd =\n        horizonCap(elements, touchEndTau, -1, sideA[sideA.length - 1], sideB[sideB.length - 1], stepHours, z0)\n        ?? touchPointFallback(elements, touchEndTau, z0);\n\n    const ring: Array<LatLon> = [\n        ...capStart,\n        ...sideA.map(({point}) => point),\n        ...capEnd,\n        ...sideB.map(({point}) => point).reverse(),\n    ];\n    if (ring.length < 3) {\n        return [];\n    }\n    if (signedUnwrappedArea(ring) < 0) {\n        ring.reverse();\n    }\n    ring.push({...ring[0]});\n\n    return ring;\n}\n\nexport function getUmbraLimitPoints(\n    elements: BesselianElements,\n    tau: number,\n    z0: number,\n): {a: LatLon | null; b: LatLon | null} {\n    const e = getBesselianElementsAtTime(elements, tau);\n    const derivatives: ShadowDerivatives = {\n        xDot: polynomialDerivative(elements.x, tau),\n        yDot: polynomialDerivative(elements.y, tau),\n        lDot: polynomialDerivative(elements.l2, tau),\n        muDot: polynomialDerivative(elements.mu, tau) * DEG,\n        dDot: polynomialDerivative(elements.d, tau) * DEG,\n    };\n\n    return {\n        a: limitPoint(elements, e, derivatives, 1, z0),\n        b: limitPoint(elements, e, derivatives, -1, z0),\n    };\n}\n\ninterface ShadowDerivatives {\n    xDot: number;\n    yDot: number;\n    lDot: number;\n    muDot: number;\n    dDot: number;\n}\n\nfunction limitPoint(\n    elements: BesselianElements,\n    e: BesselianElementsAtTime,\n    derivatives: ShadowDerivatives,\n    branch: number,\n    z0: number,\n): LatLon | null {\n    let xi = e.x;\n    let eta = e.y;\n    let zeta = solveSurfacePoint(elements, e, e.x, e.y, false)?.zeta ?? 0;\n    let q: number | null = null;\n    let point: LatLon | null = null;\n    for (let iter = 0; iter < TANGENT_ITERATIONS; iter++) {\n        const qNew = tangentPositionAngle(elements, e, derivatives, xi, eta, zeta, branch);\n        const edge = umbraEdgePoint(elements, e, qNew, z0);\n        if (edge === null) {\n            return null;\n        }\n        xi = edge.xi;\n        eta = edge.eta;\n        zeta = edge.zeta;\n        point = edge.point;\n        if (q !== null && Math.abs(shortestAngleDelta(q, qNew)) < TANGENT_CONVERGENCE_RAD) {\n            break;\n        }\n        q = qNew;\n    }\n\n    return point;\n}\n\nfunction tangentPositionAngle(\n    elements: BesselianElements,\n    e: BesselianElementsAtTime,\n    derivatives: ShadowDerivatives,\n    xi: number,\n    eta: number,\n    zeta: number,\n    branch: number,\n): number {\n    const {xDot, yDot, lDot, muDot, dDot} = derivatives;\n    const xiDot = muDot * (zeta * e.cosD - eta * e.sinD);\n    const etaDot = muDot * xi * e.sinD - dDot * zeta;\n    const zetaDot = dDot * eta - muDot * xi * e.cosD;\n\n    const a = xiDot - xDot;\n    const b = etaDot - yDot;\n    const lEffective = e.l2 - zeta * elements.tanF2;\n    const c = Math.sign(lEffective) * (lDot - zetaDot * elements.tanF2);\n    const alpha = Math.acos(Math.max(-1, Math.min(1, c / Math.hypot(a, b))));\n\n    return Math.atan2(b, a) + branch * alpha;\n}\n\nfunction touchTau(elements: BesselianElements, tauOff: number, tauOn: number, z0: number): number {\n    let off = tauOff;\n    let on = tauOn;\n    for (let iter = 0; iter < TOUCH_TIME_ITERATIONS; iter++) {\n        const tauMid = (off + on) / 2;\n        if (umbraTouchesSurface(elements, tauMid, z0)) {\n            on = tauMid;\n        } else {\n            off = tauMid;\n        }\n    }\n\n    return on;\n}\n\n// The rounded end cap: umbra-edge/horizon-ring crossings traced over the interval during\n// which the umbra straddles the ring. The crossing branches merge at both window edges; the\n// cap's outward tip is the merge point where the umbra finally clears the sunrise terminator\n// (tipDirection +1) or first meets the sunset terminator (-1) — the terminator outruns the\n// shadow there, so that is the extreme of the path. Each branch is traced from the envelope\n// end it joins to the tip, subdivided on chord length. The straddle window can be shorter\n// than a second (hybrid eclipses), so it is probed with geometrically growing offsets and\n// its edges are grown and bisected the same way.\nfunction horizonCap(\n    elements: BesselianElements,\n    touchTauValue: number,\n    tipDirection: number,\n    fromJunction: SidePoint | undefined,\n    toJunction: SidePoint | undefined,\n    stepHours: number,\n    z0: number,\n): Array<LatLon> | null {\n    let anchor: number | null = null;\n    for (let k = 0; k <= CAP_PROBE_DOUBLINGS && anchor === null; k++) {\n        const offset = (stepHours / CAP_EDGE_SEED_DIVISOR) * 2 ** k;\n        for (const tau of k === 0 ? [touchTauValue] : [touchTauValue + offset, touchTauValue - offset]) {\n            if (ringCrossingAt(elements, tau, 1, z0) !== null) {\n                anchor = tau;\n                break;\n            }\n        }\n    }\n    if (anchor === null) {\n        return null;\n    }\n\n    const tipTau = crossingWindowEdge(elements, anchor, tipDirection, stepHours, z0);\n    const tip = ringCrossingAt(elements, tipTau, 1, z0);\n    if (tip === null) {\n        return null;\n    }\n    const farTau = crossingWindowEdge(elements, anchor, -tipDirection, stepHours, z0);\n    const fromTau = branchTau(elements, fromJunction, tipTau, farTau, z0);\n    const toTau = branchTau(elements, toJunction, tipTau, farTau, z0);\n    const fromSide = branchSide(elements, fromTau, fromJunction, z0) ?? 1;\n    const toSide = branchSide(elements, toTau, toJunction, z0) ?? -fromSide;\n    const fromPoint = ringCrossingAt(elements, fromTau, fromSide, z0);\n    const toPoint = ringCrossingAt(elements, toTau, toSide, z0);\n    if (fromPoint === null || toPoint === null) {\n        return null;\n    }\n\n    const cap: Array<LatLon> = [fromPoint];\n    subdivideCrossings(elements, fromTau, fromPoint, tipTau, tip, fromSide, z0, 0, cap);\n    cap.push(tip);\n    subdivideCrossings(elements, tipTau, tip, toTau, toPoint, toSide, z0, 0, cap);\n    cap.push(toPoint);\n\n    return cap;\n}\n\n// Where a cap branch leaves the window toward its envelope end. An envelope can die outside\n// the window (extreme grazing ends, where the tangency point drifts into the near-limb zone\n// the Besselian surface inversion cannot reach — 2026-08-12's sunset end): the branch is\n// then clamped to the nearer window edge, collapsing to the tip when the envelope died on\n// the tip side, and the ring closes the remaining gap with a straight edge.\nfunction branchTau(\n    elements: BesselianElements,\n    junction: SidePoint | undefined,\n    tipTau: number,\n    farTau: number,\n    z0: number,\n): number {\n    if (junction === undefined) {\n        return farTau;\n    }\n    if (ringCrossingAt(elements, junction.tau, 1, z0) !== null) {\n        return junction.tau;\n    }\n\n    return Math.abs(junction.tau - tipTau) <= Math.abs(junction.tau - farTau) ? tipTau : farTau;\n}\n\nfunction branchSide(\n    elements: BesselianElements,\n    tau: number,\n    junction: SidePoint | undefined,\n    z0: number,\n): number | null {\n    if (junction === undefined) {\n        return null;\n    }\n    const plus = ringCrossingAt(elements, tau, 1, z0);\n    const minus = ringCrossingAt(elements, tau, -1, z0);\n    if (plus === null || minus === null) {\n        return null;\n    }\n\n    return latLonChordDeg(plus, junction.point) <= latLonChordDeg(minus, junction.point) ? 1 : -1;\n}\n\n// One edge of the straddle window in tau: grown geometrically from a seed far below any\n// window's width, then bisected. Returns the innermost tau still inside the window.\nfunction crossingWindowEdge(\n    elements: BesselianElements,\n    anchor: number,\n    direction: number,\n    stepHours: number,\n    z0: number,\n): number {\n    let inside = anchor;\n    let outside: number | null = null;\n    let step = stepHours / CAP_EDGE_SEED_DIVISOR;\n    for (let iter = 0; iter < CAP_EDGE_ITERATIONS && outside === null; iter++) {\n        const tau = inside + direction * step;\n        if (ringCrossingAt(elements, tau, 1, z0) !== null) {\n            inside = tau;\n            step *= 2;\n        } else {\n            outside = tau;\n        }\n    }\n    if (outside === null) {\n        return inside;\n    }\n\n    let bad = outside;\n    for (let iter = 0; iter < CAP_EDGE_ITERATIONS; iter++) {\n        const tauMid = (bad + inside) / 2;\n        if (ringCrossingAt(elements, tauMid, 1, z0) !== null) {\n            inside = tauMid;\n        } else {\n            bad = tauMid;\n        }\n    }\n\n    return inside;\n}\n\nfunction subdivideCrossings(\n    elements: BesselianElements,\n    tauA: number,\n    pointA: LatLon,\n    tauB: number,\n    pointB: LatLon,\n    side: number,\n    z0: number,\n    depth: number,\n    cap: Array<LatLon>,\n): void {\n    if (depth >= CAP_MAX_DEPTH || latLonChordDeg(pointA, pointB) <= CAP_MAX_CHORD_DEG) {\n        return;\n    }\n    const tauMid = (tauA + tauB) / 2;\n    const pointMid = ringCrossingAt(elements, tauMid, side, z0);\n    if (pointMid === null) {\n        return;\n    }\n    subdivideCrossings(elements, tauA, pointA, tauMid, pointMid, side, z0, depth + 1, cap);\n    cap.push(pointMid);\n    subdivideCrossings(elements, tauMid, pointMid, tauB, pointB, side, z0, depth + 1, cap);\n}\n\n// One of the two intersections of the umbra's edge circle with the horizon ring at zeta = z0,\n// found as a two-circle intersection about the shadow axis in the fundamental plane, iterated\n// for the ellipsoid (the ring radius depends on the latitude of the crossing). The side sign\n// picks the branch relative to the axis direction and stays consistent while the axis drifts.\nfunction ringCrossingAt(elements: BesselianElements, tau: number, side: number, z0: number): LatLon | null {\n    const e = getBesselianElementsAtTime(elements, tau);\n    const radius = Math.abs(e.l2 - z0 * elements.tanF2);\n    const axisDistance = Math.hypot(e.x, e.y);\n    if (axisDistance === 0) {\n        return null;\n    }\n    const ux = e.x / axisDistance;\n    const uy = e.y / axisDistance;\n\n    let xi = ux;\n    let eta = uy;\n    let sinU = (eta * e.cosD + z0 * e.sinD) / ONE_MINUS_F;\n    for (let iter = 0; iter < CROSSING_ITERATIONS; iter++) {\n        const ringRadiusSq = 1 - E_SQ * sinU * sinU - z0 * z0;\n        if (ringRadiusSq < 0) {\n            return null;\n        }\n        const along = (ringRadiusSq - radius * radius + axisDistance * axisDistance) / (2 * axisDistance);\n        const halfChordSq = ringRadiusSq - along * along;\n        if (halfChordSq < 0) {\n            return null;\n        }\n        const halfChord = Math.sqrt(halfChordSq);\n        const nextXi = along * ux - side * halfChord * uy;\n        const nextEta = along * uy + side * halfChord * ux;\n        const moved = (nextXi - xi) ** 2 + (nextEta - eta) ** 2;\n        xi = nextXi;\n        eta = nextEta;\n        sinU = (eta * e.cosD + z0 * e.sinD) / ONE_MINUS_F;\n        if (moved < 1e-18) {\n            break;\n        }\n    }\n\n    return terminatorRingPoint(elements, e, Math.atan2(eta, xi), sinU, z0).point;\n}\n\nfunction touchPointFallback(elements: BesselianElements, tau: number, z0: number): Array<LatLon> {\n    const e = getBesselianElementsAtTime(elements, tau);\n    const point = umbraEdgePoint(elements, e, Math.atan2(-e.y, -e.x), z0)?.point;\n\n    return point !== undefined ? [point] : [];\n}\n\nfunction umbraTouchesSurface(elements: BesselianElements, tau: number, z0: number): boolean {\n    const e = getBesselianElementsAtTime(elements, tau);\n\n    return umbraEdgePoint(elements, e, Math.atan2(-e.y, -e.x), z0) !== null;\n}\n\nfunction umbraEdgePoint(\n    elements: BesselianElements,\n    e: BesselianElementsAtTime,\n    q: number,\n    z0: number,\n): EdgeSample | null {\n    for (const farSide of z0 < 0 ? [false, true] : [false]) {\n        const sample = shadowEdgePoint(elements, e, q, true, farSide, z0);\n        if (sample !== null) {\n            return sample;\n        }\n    }\n\n    return null;\n}\n","import {DEG} from '@app/constants/math';\nimport type {LatLon} from '@app/types/LocationTypes';\nimport {getDistanceInKm} from '@app/utils/distance';\nimport {shortestLonDelta} from '@package/solarEclipse/services/shadowGeometry/utils/contourGeometry';\nimport {solveSurfacePoint} from '@package/solarEclipse/services/shadowGeometry/utils/surface';\nimport {getUmbraLimitPoints} from '@package/solarEclipse/services/shadowGeometry/utils/umbraPathPolygon';\nimport type {BesselianElements} from '../types/BesselianElementTypes';\nimport {getBesselianElementsAtTime} from './besselianElements';\n\nconst MOTION_STEP_HOURS = 1 / 3600;\n\nexport function getUmbraPathWidth(elements: BesselianElements, tau: number): number {\n    const {a, b} = getUmbraLimitPoints(elements, tau, 0);\n    if (a === null || b === null) {\n        return 0;\n    }\n\n    const separation = getDistanceInKm(a, b) * 1000;\n\n    return separation * perpendicularFraction(elements, tau, a, b);\n}\n\nfunction perpendicularFraction(elements: BesselianElements, tau: number, a: LatLon, b: LatLon): number {\n    const before = centralLinePoint(elements, tau - MOTION_STEP_HOURS);\n    const after = centralLinePoint(elements, tau + MOTION_STEP_HOURS);\n    if (before === null || after === null) {\n        return 1;\n    }\n\n    const cosLat = Math.cos(((a.lat + b.lat) / 2) * DEG);\n    const motionEast = shortestLonDelta(before.lon, after.lon) * cosLat;\n    const motionNorth = after.lat - before.lat;\n    const spanEast = shortestLonDelta(b.lon, a.lon) * cosLat;\n    const spanNorth = a.lat - b.lat;\n\n    const motionLength = Math.hypot(motionEast, motionNorth);\n    const spanLength = Math.hypot(spanEast, spanNorth);\n    if (motionLength === 0 || spanLength === 0) {\n        return 1;\n    }\n\n    return Math.abs(spanEast * motionNorth - spanNorth * motionEast) / (motionLength * spanLength);\n}\n\nfunction centralLinePoint(elements: BesselianElements, tau: number): LatLon | null {\n    const e = getBesselianElementsAtTime(elements, tau);\n    const solution = solveSurfacePoint(elements, e, e.x, e.y, false);\n\n    return solution !== null ? {lat: solution.lat, lon: solution.lon} : null;\n}\n","import type {Location} from '@app/types/LocationTypes';\nimport type {LocalEclipseCircumstances as LocalEclipseCircumstancesType} from '@package/solarEclipse/types/EclipseCircumstances';\nimport {getCentralDuration, getDuration} from '@package/solarEclipse/utils/duration';\nimport {\n    getLocalEclipseCircumstances,\n    getLocalEclipseType,\n    getMagnitude,\n    getMoonSunRatio,\n    getObscuration,\n    isEclipseVisible,\n} from '@package/solarEclipse/utils/localCircumstances';\nimport {getUmbraPathWidth} from '@package/solarEclipse/utils/pathWidth';\nimport TimeOfInterest from '@package/time/models/TimeOfInterest';\nimport {LocalSolarEclipseType} from '../enums/SolarEclipseType';\nimport type {BesselianElements} from '../types/BesselianElementTypes';\nimport type {EclipseContacts, EclipseContactsToi} from '../types/EclipseContactTypes';\nimport {contactTausToContactJulianDays, getContactTaus} from '../utils/contacts';\nimport LocalEclipseCircumstances from './LocalEclipseCircumstances';\n\nexport default class LocalSolarEclipse {\n    private readonly greatestEclipseTau: number;\n    private readonly greatestEclipseCircumstances: LocalEclipseCircumstancesType;\n\n    private constructor(\n        private readonly elements: BesselianElements,\n        private readonly location: Location,\n        private readonly contactTaus: EclipseContacts,\n    ) {\n        // Greatest eclipse restricted to the above-horizon part, since max may be below the horizon.\n        const {c1, c4, max, sunrise, sunset} = contactTaus;\n        this.greatestEclipseTau = Math.min(Math.max(max, sunrise ?? c1), sunset ?? c4);\n        this.greatestEclipseCircumstances = getLocalEclipseCircumstances(elements, location, this.greatestEclipseTau);\n    }\n\n    public static create(elements: BesselianElements, location: Location): LocalSolarEclipse {\n        const contactTaus = getContactTaus(elements, location);\n\n        if (!contactTaus || !isEclipseVisible(elements, location, contactTaus)) {\n            throw new Error('No solar eclipse visible at this location');\n        }\n\n        return new LocalSolarEclipse(elements, location, contactTaus);\n    }\n\n    public getCircumstances(toi: TimeOfInterest): LocalEclipseCircumstances {\n        return LocalEclipseCircumstances.create(this.elements, this.location, toi);\n    }\n\n    public getType(): LocalSolarEclipseType {\n        return getLocalEclipseType(this.greatestEclipseCircumstances);\n    }\n\n    public getContactTaus(): EclipseContacts | null {\n        return this.contactTaus;\n    }\n\n    public getContactTimes(): EclipseContactsToi | null {\n        const contactsJd = contactTausToContactJulianDays(this.elements, this.contactTaus);\n\n        if (!contactsJd) {\n            return null;\n        }\n\n        return {\n            c1: TimeOfInterest.fromJulianDay(contactsJd.c1),\n            c2: contactsJd.c2 ? TimeOfInterest.fromJulianDay(contactsJd.c2) : null,\n            max: TimeOfInterest.fromJulianDay(contactsJd.max),\n            c3: contactsJd.c3 ? TimeOfInterest.fromJulianDay(contactsJd.c3) : null,\n            c4: TimeOfInterest.fromJulianDay(contactsJd.c4),\n            sunrise: contactsJd.sunrise !== null ? TimeOfInterest.fromJulianDay(contactsJd.sunrise) : null,\n            sunset: contactsJd.sunset !== null ? TimeOfInterest.fromJulianDay(contactsJd.sunset) : null,\n        };\n    }\n\n    public getMaxMagnitude(): number {\n        return getMagnitude(this.greatestEclipseCircumstances);\n    }\n\n    public getMaxMoonSunRatio(): number {\n        return getMoonSunRatio(this.greatestEclipseCircumstances);\n    }\n\n    public getMaxObscuration(): number {\n        return getObscuration(this.greatestEclipseCircumstances);\n    }\n\n    public getUmbraPathWidth(): number {\n        const type = this.getType();\n        if (type !== LocalSolarEclipseType.Total && type !== LocalSolarEclipseType.Annular) {\n            return 0;\n        }\n\n        return getUmbraPathWidth(this.elements, this.greatestEclipseTau);\n    }\n\n    public getDuration(): number {\n        return getDuration(this.elements, this.location);\n    }\n\n    public getCentralDuration(): number {\n        return getCentralDuration(this.elements, this.location);\n    }\n}\n","import type {LatLon} from '@app/types/LocationTypes';\nimport {normalizeLongitude} from '@app/utils/location';\nimport type {BesselianElements} from '@package/solarEclipse/types/BesselianElementTypes';\nimport {getBesselianElementsAtTime, getEclipseDeltaT} from '@package/solarEclipse/utils/besselianElements';\nimport type {ShadowPathOptions} from '../types/ShadowPathTypes';\nimport {CENTRAL_LINE_STEP_HOURS, DEG, horizonSinAltitude, RAD} from './constants';\nimport {groundFundamentalPoint, solveSurfacePoint} from './surface';\n\nconst DEFAULT_STEP_SECONDS = 10;\n\nconst SEED_SCAN_SAMPLES = 240;\n\nconst TRACE_INITIAL_STEP_DEG = 0.05;\nconst TRACE_MIN_STEP_DEG = 0.0005;\nconst TRACE_MAX_STEP_DEG = 0.5;\nconst TRACE_MAX_TURN_DEG = 4;\nconst TRACE_STEP_GROW_FACTOR = 1.4;\nconst TRACE_JACOBIAN_STEP_DEG = 1e-5;\nconst TRACE_JACOBIAN_STEP_HOURS = 1e-6;\nconst TRACE_RESIDUAL_TOLERANCE = 1e-11;\nconst TRACE_CORRECTOR_ITERATIONS = 12;\nconst TRACE_MAX_POINTS_PER_DIRECTION = 50000;\nconst TRACE_TAU_MARGIN_HOURS = 0.25;\nconst HORIZON_BISECTION_ITERATIONS = 40;\n\ninterface TraceState {\n    lat: number;\n    lon: number;\n    tau: number;\n}\n\ninterface TraceVector {\n    lat: number;\n    lon: number;\n    tau: number;\n}\n\nexport function getCentralLine(elements: BesselianElements, options: ShadowPathOptions = {}): Array<LatLon> {\n    const stepHours = (options.stepsInSeconds ?? DEFAULT_STEP_SECONDS) / 3600;\n\n    return traceCentralLine(elements, horizonSinAltitude(options), stepHours);\n}\n\nexport function calculateCentralLine(elements: BesselianElements, z0: number): Array<LatLon> {\n    return traceCentralLine(elements, z0, CENTRAL_LINE_STEP_HOURS);\n}\n\n// The central line is the solution curve of (xi, eta)(lat, lon, tau) = (x, y)(tau) in\n// (lat, lon, tau) space, traced with pseudo-arclength continuation. Where the shadow axis\n// grazes the Earth's limb the curve simply folds in tau and the tangent keeps pointing along\n// the ground track, so no near/far sheet handling is needed; each end terminates exactly on\n// the horizon zeta = z0 of the requested convention.\nfunction traceCentralLine(elements: BesselianElements, z0: number, stepHours: number): Array<LatLon> {\n    const seed = findSeedState(elements);\n    if (seed === null) {\n        return [];\n    }\n\n    const forward = traceDirection(elements, seed, 1, z0, stepHours);\n    const backward = traceDirection(elements, seed, -1, z0, stepHours);\n\n    return [...backward.reverse(), toLatLon(seed), ...forward].map(({lat, lon}) => ({\n        lat,\n        lon: normalizeLongitude(lon),\n    }));\n}\n\nfunction findSeedState(elements: BesselianElements): TraceState | null {\n    let best: TraceState | null = null;\n    let bestAxisDistance = Number.POSITIVE_INFINITY;\n    for (let i = 0; i <= SEED_SCAN_SAMPLES; i++) {\n        const tau = elements.tMin + ((elements.tMax - elements.tMin) * i) / SEED_SCAN_SAMPLES;\n        const e = getBesselianElementsAtTime(elements, tau);\n        const axisDistance = Math.hypot(e.x, e.y);\n        if (axisDistance >= bestAxisDistance) {\n            continue;\n        }\n        const solution = solveSurfacePoint(elements, e, e.x, e.y, false);\n        if (solution !== null) {\n            best = {lat: solution.lat, lon: solution.lon, tau};\n            bestAxisDistance = axisDistance;\n        }\n    }\n    if (best === null) {\n        return null;\n    }\n\n    return correctOntoCurve(elements, best);\n}\n\nfunction traceDirection(\n    elements: BesselianElements,\n    seed: TraceState,\n    direction: number,\n    z0: number,\n    stepHours: number,\n): Array<LatLon> {\n    const points: Array<LatLon> = [];\n    let state = seed;\n    let previousTangent = curveTangent(elements, seed, null);\n    if (previousTangent === null) {\n        return points;\n    }\n    if (Math.sign(previousTangent.tau || 1) !== direction) {\n        previousTangent = negate(previousTangent);\n    }\n\n    let stepDeg = TRACE_INITIAL_STEP_DEG;\n    for (let i = 0; i < TRACE_MAX_POINTS_PER_DIRECTION; i++) {\n        const advanced = advanceAlongCurve(elements, state, previousTangent, stepDeg, stepHours);\n        if (advanced === null) {\n            return points;\n        }\n        if (groundZeta(elements, advanced.state) < z0) {\n            const endpoint = bisectHorizonEndpoint(elements, state, previousTangent, advanced.usedStepDeg, z0);\n            if (endpoint !== null) {\n                points.push(toLatLon(endpoint));\n            }\n            return points;\n        }\n        if (\n            advanced.state.tau < elements.tMin - TRACE_TAU_MARGIN_HOURS\n            || advanced.state.tau > elements.tMax + TRACE_TAU_MARGIN_HOURS\n        ) {\n            return points;\n        }\n        points.push(toLatLon(advanced.state));\n        state = advanced.state;\n        previousTangent = advanced.tangent;\n        stepDeg =\n            advanced.turnDeg < TRACE_MAX_TURN_DEG / 3\n                ? Math.min(advanced.usedStepDeg * TRACE_STEP_GROW_FACTOR, TRACE_MAX_STEP_DEG)\n                : advanced.usedStepDeg;\n    }\n\n    return points;\n}\n\nfunction advanceAlongCurve(\n    elements: BesselianElements,\n    state: TraceState,\n    previousTangent: TraceVector,\n    stepDeg: number,\n    stepHours: number,\n): {state: TraceState; tangent: TraceVector; usedStepDeg: number; turnDeg: number} | null {\n    let step = stepDeg;\n    while (true) {\n        const predicted = predictState(state, previousTangent, step, stepHours);\n        const corrected = correctOntoCurve(elements, predicted);\n        if (corrected !== null) {\n            const tangent = curveTangent(elements, corrected, previousTangent);\n            if (tangent !== null) {\n                const turnDeg = groundTurnDeg(previousTangent, tangent, corrected.lat);\n                if (turnDeg <= TRACE_MAX_TURN_DEG || step <= TRACE_MIN_STEP_DEG) {\n                    return {state: corrected, tangent, usedStepDeg: step, turnDeg};\n                }\n            }\n        }\n        if (step <= TRACE_MIN_STEP_DEG) {\n            return null;\n        }\n        step = Math.max(step / 2, TRACE_MIN_STEP_DEG);\n    }\n}\n\nfunction predictState(state: TraceState, tangent: TraceVector, stepDeg: number, stepHours: number): TraceState {\n    const groundSpeed = groundMagnitude(tangent, state.lat);\n    let scale = stepDeg / Math.max(groundSpeed, 1e-12);\n    if (Math.abs(tangent.tau) * scale > stepHours) {\n        scale = stepHours / Math.abs(tangent.tau);\n    }\n\n    return {\n        lat: state.lat + tangent.lat * scale,\n        lon: state.lon + tangent.lon * scale,\n        tau: state.tau + tangent.tau * scale,\n    };\n}\n\n// Newton with the minimal-norm pseudoinverse of the 2x3 residual Jacobian: the correction\n// stays perpendicular to the curve, so the continuation parameter is not disturbed.\nfunction correctOntoCurve(elements: BesselianElements, start: TraceState): TraceState | null {\n    let state = start;\n    for (let iter = 0; iter < TRACE_CORRECTOR_ITERATIONS; iter++) {\n        const residual = curveResidual(elements, state);\n        if (Math.hypot(residual.xi, residual.eta) < TRACE_RESIDUAL_TOLERANCE) {\n            return state;\n        }\n        const jacobian = residualJacobian(elements, state);\n        const delta = minimalNormSolution(jacobian, residual);\n        if (delta === null) {\n            return null;\n        }\n        state = {lat: state.lat - delta.lat, lon: state.lon - delta.lon, tau: state.tau - delta.tau};\n    }\n\n    return null;\n}\n\nfunction curveTangent(elements: BesselianElements, state: TraceState, orient: TraceVector | null): TraceVector | null {\n    const jacobian = residualJacobian(elements, state);\n    const tangent = {\n        lat: jacobian.xi.lon * jacobian.eta.tau - jacobian.xi.tau * jacobian.eta.lon,\n        lon: jacobian.xi.tau * jacobian.eta.lat - jacobian.xi.lat * jacobian.eta.tau,\n        tau: jacobian.xi.lat * jacobian.eta.lon - jacobian.xi.lon * jacobian.eta.lat,\n    };\n    const length = Math.hypot(tangent.lat, tangent.lon, tangent.tau);\n    if (length < 1e-18) {\n        return null;\n    }\n    const normalized = {lat: tangent.lat / length, lon: tangent.lon / length, tau: tangent.tau / length};\n    if (orient !== null && dot(normalized, orient) < 0) {\n        return negate(normalized);\n    }\n\n    return normalized;\n}\n\ninterface ResidualJacobian {\n    xi: TraceVector;\n    eta: TraceVector;\n}\n\nfunction residualJacobian(elements: BesselianElements, state: TraceState): ResidualJacobian {\n    const hDeg = TRACE_JACOBIAN_STEP_DEG;\n    const hTau = TRACE_JACOBIAN_STEP_HOURS;\n    const latPlus = curveResidual(elements, {...state, lat: state.lat + hDeg});\n    const latMinus = curveResidual(elements, {...state, lat: state.lat - hDeg});\n    const lonPlus = curveResidual(elements, {...state, lon: state.lon + hDeg});\n    const lonMinus = curveResidual(elements, {...state, lon: state.lon - hDeg});\n    const tauPlus = curveResidual(elements, {...state, tau: state.tau + hTau});\n    const tauMinus = curveResidual(elements, {...state, tau: state.tau - hTau});\n\n    return {\n        xi: {\n            lat: (latPlus.xi - latMinus.xi) / (2 * hDeg),\n            lon: (lonPlus.xi - lonMinus.xi) / (2 * hDeg),\n            tau: (tauPlus.xi - tauMinus.xi) / (2 * hTau),\n        },\n        eta: {\n            lat: (latPlus.eta - latMinus.eta) / (2 * hDeg),\n            lon: (lonPlus.eta - lonMinus.eta) / (2 * hDeg),\n            tau: (tauPlus.eta - tauMinus.eta) / (2 * hTau),\n        },\n    };\n}\n\nfunction minimalNormSolution(jacobian: ResidualJacobian, residual: {xi: number; eta: number}): TraceVector | null {\n    const a = dot(jacobian.xi, jacobian.xi);\n    const b = dot(jacobian.xi, jacobian.eta);\n    const c = dot(jacobian.eta, jacobian.eta);\n    const det = a * c - b * b;\n    if (Math.abs(det) < 1e-24) {\n        return null;\n    }\n    const alpha = (c * residual.xi - b * residual.eta) / det;\n    const beta = (a * residual.eta - b * residual.xi) / det;\n\n    return {\n        lat: alpha * jacobian.xi.lat + beta * jacobian.eta.lat,\n        lon: alpha * jacobian.xi.lon + beta * jacobian.eta.lon,\n        tau: alpha * jacobian.xi.tau + beta * jacobian.eta.tau,\n    };\n}\n\nfunction bisectHorizonEndpoint(\n    elements: BesselianElements,\n    state: TraceState,\n    tangent: TraceVector,\n    stepDeg: number,\n    z0: number,\n): TraceState | null {\n    let above = 0;\n    let below = stepDeg;\n    let endpoint: TraceState | null = null;\n    for (let iter = 0; iter < HORIZON_BISECTION_ITERATIONS; iter++) {\n        const mid = (above + below) / 2;\n        const candidate = correctOntoCurve(elements, predictState(state, tangent, mid, Number.POSITIVE_INFINITY));\n        if (candidate === null) {\n            below = mid;\n            continue;\n        }\n        if (groundZeta(elements, candidate) >= z0) {\n            above = mid;\n            endpoint = candidate;\n        } else {\n            below = mid;\n        }\n    }\n\n    return endpoint;\n}\n\nfunction curveResidual(elements: BesselianElements, state: TraceState): {xi: number; eta: number} {\n    const e = getBesselianElementsAtTime(elements, state.tau);\n    const ground = groundFundamentalPoint(elements, e, state.lat, state.lon, getEclipseDeltaT(elements));\n\n    return {xi: ground.xi - e.x, eta: ground.eta - e.y};\n}\n\nfunction groundZeta(elements: BesselianElements, state: TraceState): number {\n    const e = getBesselianElementsAtTime(elements, state.tau);\n\n    return groundFundamentalPoint(elements, e, state.lat, state.lon, getEclipseDeltaT(elements)).zeta;\n}\n\nfunction groundTurnDeg(previous: TraceVector, next: TraceVector, lat: number): number {\n    const cosLat = Math.cos(lat * DEG);\n    const v1 = {x: previous.lon * cosLat, y: previous.lat};\n    const v2 = {x: next.lon * cosLat, y: next.lat};\n    const l1 = Math.hypot(v1.x, v1.y);\n    const l2 = Math.hypot(v2.x, v2.y);\n    if (l1 < 1e-12 || l2 < 1e-12) {\n        return 0;\n    }\n    const cos = Math.max(-1, Math.min(1, (v1.x * v2.x + v1.y * v2.y) / (l1 * l2)));\n\n    return Math.acos(cos) * RAD;\n}\n\nfunction groundMagnitude(vector: TraceVector, lat: number): number {\n    return Math.hypot(vector.lon * Math.cos(lat * DEG), vector.lat);\n}\n\nfunction dot(a: TraceVector, b: TraceVector): number {\n    return a.lat * b.lat + a.lon * b.lon + a.tau * b.tau;\n}\n\nfunction negate(vector: TraceVector): TraceVector {\n    return {lat: -vector.lat, lon: -vector.lon, tau: -vector.tau};\n}\n\nfunction toLatLon(state: TraceState): LatLon {\n    return {lat: state.lat, lon: state.lon};\n}\n","// Marching squares over a raster mask of pixel centres, returning the inside/outside\n// boundaries as closed loops of edge crossings. The x axis wraps (longitude); the rows above\n// and below the grid (beyond the poles) count as outside, so every boundary closes into a\n// loop even when the region touches a pole or crosses the antimeridian. Crossings keep\n// unwrapped pixel coordinates (x may reach width, y may be -1 or height) so a caller can\n// interpolate positions continuously across the seams.\n\nexport interface GridCrossing {\n    insideX: number;\n    insideY: number;\n    outsideX: number;\n    outsideY: number;\n}\n\nexport default function traceMaskContours(\n    inside: Uint8Array,\n    width: number,\n    height: number,\n): Array<Array<GridCrossing>> {\n    const {adjacency, crossings} = collectCellSegments(inside, width, height);\n\n    const loops: Array<Array<GridCrossing>> = [];\n    const visited = new Set<string>();\n    for (const start of adjacency.keys()) {\n        if (visited.has(start)) {\n            continue;\n        }\n        const loop: Array<GridCrossing> = [];\n        let previous: string | null = null;\n        let current = start;\n        do {\n            visited.add(current);\n            const crossing = crossings.get(current);\n            const neighbors = adjacency.get(current);\n            if (crossing === undefined || neighbors === undefined || neighbors.length !== 2) {\n                break;\n            }\n            loop.push(crossing);\n            const next = neighbors[0] === previous ? neighbors[1] : neighbors[0];\n            previous = current;\n            current = next;\n        } while (current !== start);\n        if (loop.length >= 3) {\n            loops.push(loop);\n        }\n    }\n\n    return loops;\n}\n\ninterface CellSegments {\n    adjacency: Map<string, Array<string>>;\n    crossings: Map<string, GridCrossing>;\n}\n\n// Every cell between four neighbouring pixel centres contributes the marching-squares\n// segments for its corner pattern. Each crossing edge borders exactly two cells and gains\n// one segment from each, so each node's adjacency has degree two and the walk above always\n// returns to its start.\nfunction collectCellSegments(inside: Uint8Array, width: number, height: number): CellSegments {\n    const at = (x: number, y: number): number =>\n        y < 0 || y >= height ? 0 : inside[y * width + (((x % width) + width) % width)];\n\n    const adjacency = new Map<string, Array<string>>();\n    const crossings = new Map<string, GridCrossing>();\n\n    const edge = (horizontal: boolean, x: number, y: number): string => {\n        const key = `${horizontal ? 'h' : 'v'}${((x % width) + width) % width},${y}`;\n        if (!crossings.has(key)) {\n            const x2 = horizontal ? x + 1 : x;\n            const y2 = horizontal ? y : y + 1;\n            crossings.set(\n                key,\n                at(x, y) === 1\n                    ? {insideX: x, insideY: y, outsideX: x2, outsideY: y2}\n                    : {insideX: x2, insideY: y2, outsideX: x, outsideY: y},\n            );\n        }\n\n        return key;\n    };\n    const link = (a: string, b: string): void => {\n        adjacency.set(a, [...(adjacency.get(a) ?? []), b]);\n        adjacency.set(b, [...(adjacency.get(b) ?? []), a]);\n    };\n\n    for (let cy = -1; cy < height; cy++) {\n        for (let cx = 0; cx < width; cx++) {\n            const pattern = at(cx, cy) + at(cx + 1, cy) * 2 + at(cx + 1, cy + 1) * 4 + at(cx, cy + 1) * 8;\n            if (pattern === 0 || pattern === 15) {\n                continue;\n            }\n            const top = (): string => edge(true, cx, cy);\n            const bottom = (): string => edge(true, cx, cy + 1);\n            const left = (): string => edge(false, cx, cy);\n            const right = (): string => edge(false, cx + 1, cy);\n            switch (pattern) {\n                case 1:\n                case 14:\n                    link(left(), top());\n                    break;\n                case 2:\n                case 13:\n                    link(top(), right());\n                    break;\n                case 3:\n                case 12:\n                    link(left(), right());\n                    break;\n                case 4:\n                case 11:\n                    link(right(), bottom());\n                    break;\n                case 6:\n                case 9:\n                    link(top(), bottom());\n                    break;\n                case 7:\n                case 8:\n                    link(bottom(), left());\n                    break;\n                case 5:\n                    link(left(), top());\n                    link(right(), bottom());\n                    break;\n                case 10:\n                    link(top(), right());\n                    link(bottom(), left());\n                    break;\n            }\n        }\n    }\n\n    return {adjacency, crossings};\n}\n","import type {BesselianElements} from '@package/solarEclipse/types/BesselianElementTypes';\nimport {getBesselianElementsAtTime, getEclipseDeltaT} from '@package/solarEclipse/utils/besselianElements';\nimport {DEG, EARTH_ROTATION_DEG_PER_HOUR, ONE_MINUS_F} from './constants';\n\nconst COARSE_STEP_HOURS = 0.25;\n\nconst DEPTH_OUT_SLACK = 0.03;\nconst DEPTH_IN_SLACK = 0.01;\nconst ZETA_SLACK = 0.05;\n\nexport const PENUMBRA_TILE_SIZE = 8;\nconst TILE_SIZE = PENUMBRA_TILE_SIZE;\nconst TILE_SLACK = 0.05;\n\nexport function pixelCenterLon(px: number, width: number): number {\n    return ((px + 0.5) / width) * 360 - 180;\n}\n\nexport function pixelCenterLat(py: number, height: number): number {\n    return 90 - ((py + 0.5) / height) * 180;\n}\n\n// Border pixels are supersampled on an n x n subgrid for antialiasing.\nconst SUBSAMPLES = 3;\n\nexport interface ScanContext {\n    elements: BesselianElements;\n    ghaOffset: number;\n    tanF1: number;\n    z0: number;\n    taus: Float64Array;\n    xs: Float64Array;\n    ys: Float64Array;\n    l1s: Float64Array;\n    sinDs: Float64Array;\n    cosDs: Float64Array;\n    sinGs: Float64Array;\n    cosGs: Float64Array;\n}\n\nexport function buildScanContext(elements: BesselianElements, z0: number): ScanContext {\n    const ghaOffset = ((EARTH_ROTATION_DEG_PER_HOUR * getEclipseDeltaT(elements)) / 3600) * DEG;\n    const count = Math.max(2, Math.ceil((elements.tMax - elements.tMin) / COARSE_STEP_HOURS) + 1);\n    const taus = new Float64Array(count);\n    const xs = new Float64Array(count);\n    const ys = new Float64Array(count);\n    const l1s = new Float64Array(count);\n    const sinDs = new Float64Array(count);\n    const cosDs = new Float64Array(count);\n    const sinGs = new Float64Array(count);\n    const cosGs = new Float64Array(count);\n    for (let i = 0; i < count; i++) {\n        const tau = elements.tMin + ((elements.tMax - elements.tMin) * i) / (count - 1);\n        const e = getBesselianElementsAtTime(elements, tau);\n        const gha = e.mu - ghaOffset;\n        taus[i] = tau;\n        xs[i] = e.x;\n        ys[i] = e.y;\n        l1s[i] = e.l1;\n        sinDs[i] = e.sinD;\n        cosDs[i] = e.cosD;\n        sinGs[i] = Math.sin(gha);\n        cosGs[i] = Math.cos(gha);\n    }\n\n    return {elements, ghaOffset, tanF1: elements.tanF1, z0, taus, xs, ys, l1s, sinDs, cosDs, sinGs, cosGs};\n}\n\nfunction parametricLatitude(latRad: number): {sinU: number; cosU: number} {\n    const sinLat = Math.sin(latRad);\n    const cosLat = Math.cos(latRad);\n    const norm = Math.hypot(cosLat, ONE_MINUS_F * sinLat);\n\n    return {sinU: (ONE_MINUS_F * sinLat) / norm, cosU: cosLat / norm};\n}\n\ninterface MaxEclipseState {\n    m: number;\n    zeta: number;\n    l1Effective: number;\n}\n\nfunction stateAtTau(ctx: ScanContext, tau: number, lonRad: number, sinU: number, cosU: number): MaxEclipseState {\n    const e = getBesselianElementsAtTime(ctx.elements, tau);\n    const H = e.mu - ctx.ghaOffset + lonRad;\n    const sinH = Math.sin(H);\n    const cosH = Math.cos(H);\n    const pSinU = ONE_MINUS_F * sinU;\n    const xi = cosU * sinH;\n    const cosUcosH = cosU * cosH;\n    const zeta = pSinU * e.sinD + cosUcosH * e.cosD;\n    const eta = pSinU * e.cosD - cosUcosH * e.sinD;\n    const m = Math.hypot(xi - e.x, eta - e.y);\n\n    return {m, zeta, l1Effective: e.l1 - zeta * ctx.tanF1};\n}\n\nfunction separationAtTau(ctx: ScanContext, tau: number, lonRad: number, sinU: number, cosU: number): number {\n    const elements = ctx.elements;\n    const tau2 = tau * tau;\n    const tau3 = tau2 * tau;\n    const cd = elements.d;\n    const d = (cd[0] + cd[1] * tau + cd[2] * tau2) * DEG;\n    const cMu = elements.mu;\n    const mu = (cMu[0] + cMu[1] * tau + cMu[2] * tau2) * DEG;\n    const H = mu - ctx.ghaOffset + lonRad;\n    const sinH = Math.sin(H);\n    const cosH = Math.cos(H);\n    const pSinU = ONE_MINUS_F * sinU;\n    const xi = cosU * sinH;\n    const eta = pSinU * Math.cos(d) - cosU * cosH * Math.sin(d);\n    const cx = elements.x;\n    const x = cx[0] + cx[1] * tau + cx[2] * tau2 + cx[3] * tau3;\n    const cy = elements.y;\n    const y = cy[0] + cy[1] * tau + cy[2] * tau2 + cy[3] * tau3;\n\n    return Math.hypot(xi - x, eta - y);\n}\n\nconst GOLDEN = (Math.sqrt(5) - 1) / 2;\n\nfunction refineMaxEclipse(\n    ctx: ScanContext,\n    bestIndex: number,\n    lonRad: number,\n    sinU: number,\n    cosU: number,\n): MaxEclipseState {\n    let a = ctx.taus[Math.max(0, bestIndex - 1)];\n    let b = ctx.taus[Math.min(ctx.taus.length - 1, bestIndex + 1)];\n    let t1 = b - GOLDEN * (b - a);\n    let t2 = a + GOLDEN * (b - a);\n    let m1 = separationAtTau(ctx, t1, lonRad, sinU, cosU);\n    let m2 = separationAtTau(ctx, t2, lonRad, sinU, cosU);\n    for (let iter = 0; iter < 20; iter++) {\n        if (m1 <= m2) {\n            b = t2;\n            t2 = t1;\n            m2 = m1;\n            t1 = b - GOLDEN * (b - a);\n            m1 = separationAtTau(ctx, t1, lonRad, sinU, cosU);\n        } else {\n            a = t1;\n            t1 = t2;\n            m1 = m2;\n            t2 = a + GOLDEN * (b - a);\n            m2 = separationAtTau(ctx, t2, lonRad, sinU, cosU);\n        }\n    }\n\n    return stateAtTau(ctx, (a + b) / 2, lonRad, sinU, cosU);\n}\n\nfunction isMaxEclipseVisible(\n    ctx: ScanContext,\n    lonRad: number,\n    sinLon: number,\n    cosLon: number,\n    sinU: number,\n    cosU: number,\n): boolean {\n    const count = ctx.taus.length;\n    const {sinGs, cosGs, xs, ys, sinDs, cosDs} = ctx;\n    const pSinU = ONE_MINUS_F * sinU;\n    let bestIndex = 0;\n    let bestMSq = Infinity;\n    let bestZeta = 0;\n    for (let i = 0; i < count; i++) {\n        const sinH = sinGs[i] * cosLon + cosGs[i] * sinLon;\n        const cosH = cosGs[i] * cosLon - sinGs[i] * sinLon;\n        const cosUcosH = cosU * cosH;\n        const xi = cosU * sinH - xs[i];\n        const eta = pSinU * cosDs[i] - cosUcosH * sinDs[i] - ys[i];\n        const mSq = xi * xi + eta * eta;\n        if (mSq < bestMSq) {\n            bestMSq = mSq;\n            bestIndex = i;\n            bestZeta = pSinU * sinDs[i] + cosUcosH * cosDs[i];\n        }\n    }\n\n    const m = Math.sqrt(bestMSq);\n    const depth = ctx.l1s[bestIndex] - bestZeta * ctx.tanF1 - m;\n    if (depth < -DEPTH_OUT_SLACK) {\n        return false;\n    }\n    if (depth > DEPTH_IN_SLACK && Math.abs(bestZeta - ctx.z0) > ZETA_SLACK) {\n        return bestZeta > ctx.z0;\n    }\n\n    const state = refineMaxEclipse(ctx, bestIndex, lonRad, sinU, cosU);\n\n    return state.zeta >= ctx.z0 && state.m <= state.l1Effective;\n}\n\nexport function isMaxEclipseVisibleAt(ctx: ScanContext, latDeg: number, lonDeg: number): boolean {\n    const lonRad = lonDeg * DEG;\n    const {sinU, cosU} = parametricLatitude(latDeg * DEG);\n\n    return isMaxEclipseVisible(ctx, lonRad, Math.sin(lonRad), Math.cos(lonRad), sinU, cosU);\n}\n\nexport default function calculatePenumbraVisibilityAlpha(\n    elements: BesselianElements,\n    width: number,\n    height: number,\n    z0: number,\n): Uint8ClampedArray {\n    const inside = new Uint8Array(width * height);\n    computePenumbraInsideBand(elements, width, height, z0, 0, height, inside);\n    const alpha = new Uint8ClampedArray(width * height);\n    computePenumbraAlphaBand(elements, width, height, z0, 0, height, inside, alpha);\n\n    return alpha;\n}\n\nexport function computePenumbraInsideBand(\n    elements: BesselianElements,\n    width: number,\n    height: number,\n    z0: number,\n    yStart: number,\n    yEnd: number,\n    inside: Uint8Array,\n): void {\n    const ctx = buildScanContext(elements, z0);\n    const count = ctx.taus.length;\n\n    const lonRads = new Float64Array(width);\n    const sinLons = new Float64Array(width);\n    const cosLons = new Float64Array(width);\n    for (let px = 0; px < width; px++) {\n        const lonRad = pixelCenterLon(px, width) * DEG;\n        lonRads[px] = lonRad;\n        sinLons[px] = Math.sin(lonRad);\n        cosLons[px] = Math.cos(lonRad);\n    }\n    const sinUs = new Float64Array(height);\n    const cosUs = new Float64Array(height);\n    for (let py = yStart; py < yEnd; py++) {\n        const {sinU, cosU} = parametricLatitude(pixelCenterLat(py, height) * DEG);\n        sinUs[py] = sinU;\n        cosUs[py] = cosU;\n    }\n\n    // Distance of a pixel outside the penumbra, minimized over the coarse instants; used to\n    // discard whole tiles that stay clear of the shadow throughout the eclipse.\n    const clearance = (px: number, py: number): number => {\n        const {sinGs, cosGs, xs, ys, sinDs, cosDs, l1s} = ctx;\n        const absTanF1 = Math.abs(ctx.tanF1);\n        const sinLon = sinLons[px];\n        const cosLon = cosLons[px];\n        const pSinU = ONE_MINUS_F * sinUs[py];\n        const cosU = cosUs[py];\n        let best = Infinity;\n        for (let i = 0; i < count; i++) {\n            const sinH = sinGs[i] * cosLon + cosGs[i] * sinLon;\n            const cosH = cosGs[i] * cosLon - sinGs[i] * sinLon;\n            const xi = cosU * sinH - xs[i];\n            const eta = pSinU * cosDs[i] - cosU * cosH * sinDs[i] - ys[i];\n            const gap = Math.sqrt(xi * xi + eta * eta) - l1s[i] - absTanF1;\n            if (gap < best) {\n                best = gap;\n            }\n        }\n\n        return best;\n    };\n\n    for (let tileY = yStart; tileY < yEnd; tileY += TILE_SIZE) {\n        const tileYEnd = Math.min(height - 1, tileY + TILE_SIZE - 1);\n        for (let tileX = 0; tileX < width; tileX += TILE_SIZE) {\n            const xEnd = Math.min(width - 1, tileX + TILE_SIZE - 1);\n            if (\n                clearance(tileX, tileY) > TILE_SLACK\n                && clearance(xEnd, tileY) > TILE_SLACK\n                && clearance(tileX, tileYEnd) > TILE_SLACK\n                && clearance(xEnd, tileYEnd) > TILE_SLACK\n            ) {\n                continue;\n            }\n            for (let py = tileY; py <= tileYEnd; py++) {\n                const rowOffset = py * width;\n                for (let px = tileX; px <= xEnd; px++) {\n                    if (isMaxEclipseVisible(ctx, lonRads[px], sinLons[px], cosLons[px], sinUs[py], cosUs[py])) {\n                        inside[rowOffset + px] = 1;\n                    }\n                }\n            }\n        }\n    }\n}\n\nexport function computePenumbraAlphaBand(\n    elements: BesselianElements,\n    width: number,\n    height: number,\n    z0: number,\n    yStart: number,\n    yEnd: number,\n    inside: Uint8Array,\n    alpha: Uint8ClampedArray,\n): void {\n    const ctx = buildScanContext(elements, z0);\n    const lonStep = 360 / width;\n    const latStep = 180 / height;\n    for (let py = yStart; py < yEnd; py++) {\n        const rowOffset = py * width;\n        for (let px = 0; px < width; px++) {\n            const value = inside[rowOffset + px];\n            const onBorder =\n                (px > 0 && inside[rowOffset + px - 1] !== value)\n                || (px + 1 < width && inside[rowOffset + px + 1] !== value)\n                || (py > 0 && inside[rowOffset - width + px] !== value)\n                || (py + 1 < height && inside[rowOffset + width + px] !== value);\n            if (!onBorder) {\n                alpha[rowOffset + px] = value === 1 ? 255 : 0;\n                continue;\n            }\n            let covered = 0;\n            for (let sy = 0; sy < SUBSAMPLES; sy++) {\n                const lat = 90 - (py + (sy + 0.5) / SUBSAMPLES) * latStep;\n                for (let sx = 0; sx < SUBSAMPLES; sx++) {\n                    const lon = (px + (sx + 0.5) / SUBSAMPLES) * lonStep - 180;\n                    if (isMaxEclipseVisibleAt(ctx, lat, lon)) {\n                        covered++;\n                    }\n                }\n            }\n            alpha[rowOffset + px] = Math.round((covered / (SUBSAMPLES * SUBSAMPLES)) * 255);\n        }\n    }\n}\n","import type {LatLon} from '@app/types/LocationTypes';\nimport {normalizeLongitude} from '@app/utils/location';\nimport type {BesselianElements} from '@package/solarEclipse/types/BesselianElementTypes';\nimport type {ShadowPathOptions} from '../types/ShadowPathTypes';\nimport {horizonSinAltitude} from './constants';\nimport {closeContourAroundPole, lonWinding, signedUnwrappedArea} from './contourGeometry';\nimport traceMaskContours, {type GridCrossing} from './gridContour';\nimport {\n    buildScanContext,\n    computePenumbraInsideBand,\n    isMaxEclipseVisibleAt,\n    pixelCenterLat,\n    pixelCenterLon,\n    type ScanContext,\n} from './penumbraVisibility';\n\nconst GRID_WIDTH = 720;\nconst GRID_HEIGHT = 360;\nconst REFINEMENT_ITERATIONS = 14;\n\nexport default function calculatePenumbraPathPolygon(\n    elements: BesselianElements,\n    options: ShadowPathOptions = {},\n): Array<LatLon> {\n    const z0 = horizonSinAltitude(options);\n    const inside = new Uint8Array(GRID_WIDTH * GRID_HEIGHT);\n    computePenumbraInsideBand(elements, GRID_WIDTH, GRID_HEIGHT, z0, 0, GRID_HEIGHT, inside);\n\n    const loops = traceMaskContours(inside, GRID_WIDTH, GRID_HEIGHT);\n    if (loops.length === 0) {\n        return [];\n    }\n\n    const ctx = buildScanContext(elements, z0);\n    const rings = loops.map((loop) =>\n        closeAroundEnclosedPole(\n            ctx,\n            loop.map((crossing) => refineCrossing(ctx, crossing)),\n        ),\n    );\n    const ring = rings.reduce((largest, candidate) =>\n        Math.abs(signedUnwrappedArea(candidate)) > Math.abs(signedUnwrappedArea(largest)) ? candidate : largest,\n    );\n\n    if (signedUnwrappedArea(ring) < 0) {\n        ring.reverse();\n    }\n    const normalized = ring.map(({lat, lon}) => ({lat, lon: normalizeLongitude(lon)}));\n    normalized.push({...normalized[0]});\n\n    return normalized;\n}\n\nfunction closeAroundEnclosedPole(ctx: ScanContext, ring: Array<LatLon>): Array<LatLon> {\n    const winding = lonWinding(ring);\n    if (Math.abs(winding) < 180) {\n        return ring;\n    }\n    const poleLat = isMaxEclipseVisibleAt(ctx, 89.999, 0) ? 90 : isMaxEclipseVisibleAt(ctx, -89.999, 0) ? -90 : null;\n    if (poleLat === null) {\n        return ring;\n    }\n\n    return closeContourAroundPole(ring, poleLat, winding);\n}\n\nfunction refineCrossing(ctx: ScanContext, crossing: GridCrossing): LatLon {\n    let inside = gridPointLatLon(crossing.insideX, crossing.insideY);\n    let outside = gridPointLatLon(crossing.outsideX, crossing.outsideY);\n    for (let iter = 0; iter < REFINEMENT_ITERATIONS; iter++) {\n        const mid = {lat: (inside.lat + outside.lat) / 2, lon: (inside.lon + outside.lon) / 2};\n        if (isMaxEclipseVisibleAt(ctx, mid.lat, mid.lon)) {\n            inside = mid;\n        } else {\n            outside = mid;\n        }\n    }\n\n    return {lat: (inside.lat + outside.lat) / 2, lon: (inside.lon + outside.lon) / 2};\n}\n\nfunction gridPointLatLon(x: number, y: number): LatLon {\n    const lat = y < 0 ? 90 : y >= GRID_HEIGHT ? -90 : pixelCenterLat(y, GRID_HEIGHT);\n\n    return {lat, lon: pixelCenterLon(x, GRID_WIDTH)};\n}\n","import type {LatLon} from '@app/types/LocationTypes';\nimport {polynomialDerivative} from '@app/utils/polynoms';\nimport type {BesselianElements, BesselianElementsAtTime} from '@package/solarEclipse/types/BesselianElementTypes';\nimport {getBesselianElementsAtTime, getEclipseDeltaT} from '@package/solarEclipse/utils/besselianElements';\nimport {DEG, EARTH_ROTATION_DEG_PER_HOUR} from './constants';\nimport {type RingPoint, terminatorRingPoint} from './shadowOutline';\n\n// Ring positions sampled per instant when locating the maximum-eclipse-at-horizon root.\nconst MAX_ECLIPSE_RING_SAMPLES = 240;\n\nexport interface MaxEclipseHorizonRoot {\n    point: LatLon;\n    separation: number;\n}\n\n// The maximum-eclipse point on the horizon at one instant: the root of the separation-rate\n// condition (P - S) . (P' - S') = 0 on the horizon ring, inside the penumbra and on the\n// requested terminator side. A fixed location reaches maximum eclipse when its\n// fundamental-plane separation from the shadow axis stops shrinking, i.e. when the separation\n// vector is perpendicular to the relative velocity of location and shadow. The location\n// itself moves with Earth's rotation; for a surface point on the horizon ring at zeta = z0,\n//   xi'  = mu' (z0 cos d - eta sin d)\n//   eta' = mu' xi sin d - z0 d'\n// Only the near-side root can pass the penumbra test, so each tau yields at most one point.\nexport function maxEclipseHorizonRootAtTau(\n    elements: BesselianElements,\n    tau: number,\n    isSunset: boolean,\n    z0: number,\n): MaxEclipseHorizonRoot | null {\n    const e = getBesselianElementsAtTime(elements, tau);\n    const deltaT = getEclipseDeltaT(elements);\n    const dx = polynomialDerivative(elements.x, tau);\n    const dy = polynomialDerivative(elements.y, tau);\n    const muDot = polynomialDerivative(elements.mu, tau) * DEG;\n    const dDot = polynomialDerivative(elements.d, tau) * DEG;\n    const penumbraRadius = Math.abs(e.l1 - z0 * elements.tanF1);\n\n    const separationRate = (ring: RingPoint): number => {\n        const xiDot = muDot * (z0 * e.cosD - ring.eta * e.sinD);\n        const etaDot = muDot * ring.xi * e.sinD - z0 * dDot;\n\n        return (ring.xi - e.x) * (xiDot - dx) + (ring.eta - e.y) * (etaDot - dy);\n    };\n\n    const N = MAX_ECLIPSE_RING_SAMPLES;\n    const rings: Array<RingPoint> = new Array(N);\n    const rates: Array<number> = new Array(N);\n    let sinUSeed = e.sinD;\n    for (let i = 0; i < N; i++) {\n        const ring = terminatorRingPoint(elements, e, (i / N) * 2 * Math.PI, sinUSeed, z0);\n        rings[i] = ring;\n        rates[i] = separationRate(ring);\n        sinUSeed = ring.sinU;\n    }\n\n    let best: MaxEclipseHorizonRoot | null = null;\n    for (let i = 0; i < N; i++) {\n        const j = (i + 1) % N;\n        if (rates[i] * rates[j] > 0) {\n            continue;\n        }\n\n        // Bisect theta to the root of the separation rate.\n        let thetaA = (i / N) * 2 * Math.PI;\n        let thetaB = ((i + 1) / N) * 2 * Math.PI;\n        let rateA = rates[i];\n        let root = rings[i];\n        for (let iter = 0; iter < 40; iter++) {\n            const thetaMid = (thetaA + thetaB) / 2;\n            root = terminatorRingPoint(elements, e, thetaMid, root.sinU, z0);\n            const rate = separationRate(root);\n            if (rateA * rate <= 0) {\n                thetaB = thetaMid;\n            } else {\n                thetaA = thetaMid;\n                rateA = rate;\n            }\n            if (thetaB - thetaA < 1e-10) {\n                break;\n            }\n        }\n\n        const separation = Math.hypot(root.xi - e.x, root.eta - e.y);\n        if (separation > penumbraRadius) {\n            continue;\n        }\n        if (isOnSunsetSide(root.point, e, deltaT) !== isSunset) {\n            continue;\n        }\n        if (best === null || separation < best.separation) {\n            best = {point: root.point, separation};\n        }\n    }\n\n    return best;\n}\n\nexport function isOnSunsetSide(point: LatLon, e: BesselianElementsAtTime, deltaT: number): boolean {\n    const lonRad = point.lon * DEG;\n    const gha = e.mu - ((EARTH_ROTATION_DEG_PER_HOUR * deltaT) / 3600) * DEG;\n    const H = gha + lonRad;\n\n    // H ∈ (0, π): sun is west of zenith (setting); H ∈ (-π, 0) or (π, 2π): sun is rising\n    return Math.sin(H) > 0;\n}\n","import type {LatLon} from '@app/types/LocationTypes';\nimport type {BesselianElements, BesselianElementsAtTime} from '@package/solarEclipse/types/BesselianElementTypes';\nimport {E_SQ, ONE_MINUS_F} from './constants';\nimport {fundamentalToLatLon, solveSurfacePoint} from './surface';\n\nexport function calculateShadowBoundaryPoint(\n    elements: BesselianElements,\n    e: BesselianElementsAtTime,\n    q: number,\n    useUmbra: boolean,\n): LatLon | null {\n    const l0 = useUmbra ? e.l2 : e.l1;\n    const tanF = useUmbra ? elements.tanF2 : elements.tanF1;\n    const sinQ = Math.sin(q);\n    const cosQ = Math.cos(q);\n\n    let radius = Math.abs(l0);\n    let result: LatLon | null = null;\n\n    for (let iter = 0; iter < 6; iter++) {\n        const xi = e.x + radius * cosQ;\n        const eta = e.y + radius * sinQ;\n\n        const rho1 = Math.sqrt(1 - E_SQ * e.cosD * e.cosD);\n        const eta1 = eta / rho1;\n        const bSq = 1 - xi * xi - eta1 * eta1;\n        if (bSq < 0) {\n            return null;\n        }\n        const B = Math.sqrt(bSq);\n        const sinD1 = e.sinD / rho1;\n        const cosD1 = (ONE_MINUS_F * e.cosD) / rho1;\n        const sinU = eta1 * cosD1 + B * sinD1;\n\n        const zetaSq = 1 - E_SQ * sinU * sinU - xi * xi - eta * eta;\n        if (zetaSq < 0) {\n            return null;\n        }\n        const zeta = Math.sqrt(zetaSq);\n\n        const newRadius = Math.abs(l0 - zeta * tanF);\n        if (Math.abs(newRadius - radius) < 1e-8) {\n            result = fundamentalToLatLon(elements, e, xi, eta);\n            break;\n        }\n        radius = newRadius;\n    }\n\n    if (result === null) {\n        const xi = e.x + radius * cosQ;\n        const eta = e.y + radius * sinQ;\n        result = fundamentalToLatLon(elements, e, xi, eta);\n    }\n\n    return result;\n}\n\nexport function penumbraBoundaryFundamental(\n    elements: BesselianElements,\n    e: BesselianElementsAtTime,\n    q: number,\n): {xi: number; eta: number} | null {\n    const l0 = e.l1;\n    const tanF = elements.tanF1;\n    const sinQ = Math.sin(q);\n    const cosQ = Math.cos(q);\n\n    let radius = Math.abs(l0);\n    for (let iter = 0; iter < 6; iter++) {\n        const xi = e.x + radius * cosQ;\n        const eta = e.y + radius * sinQ;\n        const solution = solveSurfacePoint(elements, e, xi, eta, false);\n        if (solution === null) {\n            return null;\n        }\n        const newRadius = Math.abs(l0 - solution.zeta * tanF);\n        if (Math.abs(newRadius - radius) < 1e-8) {\n            return {xi, eta};\n        }\n        radius = newRadius;\n    }\n\n    return {xi: e.x + radius * cosQ, eta: e.y + radius * sinQ};\n}\n","import type {LatLon} from '@app/types/LocationTypes';\nimport {polynomialDerivative} from '@app/utils/polynoms';\nimport type {BesselianElements, BesselianElementsAtTime} from '@package/solarEclipse/types/BesselianElementTypes';\nimport {getBesselianElementsAtTime, getEclipseDeltaT} from '@package/solarEclipse/utils/besselianElements';\nimport {\n    DEG,\n    E_SQ,\n    ONE_MINUS_F,\n    RISE_SET_BOUNDARY_Q_SAMPLES,\n    RISE_SET_BOUNDARY_STEP_HOURS,\n    RISE_SET_GAP_SUBDIVISION_DEPTH,\n    RISE_SET_MAX_CHORD_DEG,\n    RISE_SET_TIP_REFINEMENT_SAMPLES,\n} from './constants';\nimport {isOnSunsetSide} from './maxEclipseHorizon';\nimport {calculateShadowBoundaryPoint, penumbraBoundaryFundamental} from './shadowBoundary';\nimport {terminatorRingPoint} from './shadowOutline';\n\nexport function calculateSunriseBoundary(elements: BesselianElements, z0: number): Array<LatLon> {\n    return calculateRiseSetBoundary(elements, false, z0);\n}\n\nexport function calculateSunsetBoundary(elements: BesselianElements, z0: number): Array<LatLon> {\n    return calculateRiseSetBoundary(elements, true, z0);\n}\n\nexport function calculateRiseSetBoundary(elements: BesselianElements, isSunset: boolean, z0: number): Array<LatLon> {\n    let best: Array<LatLon> = [];\n    for (const run of calculateRiseSetRuns(elements, z0)) {\n        const cycle = assembleRunCycle(run);\n        const sunsetCount = cycle.filter((p) => p.isSunset).length;\n        const runIsSunset = sunsetCount * 2 > cycle.length;\n        if (runIsSunset === isSunset && cycle.length > best.length) {\n            best = cycle.map((p) => p.point);\n        }\n    }\n    if (best.length > 0) {\n        best.push({...best[0]});\n    }\n\n    return best;\n}\n\ninterface SidedPoint {\n    point: LatLon;\n    isSunset: boolean;\n}\n\ninterface RiseSetRun {\n    leadingEdge: Array<SidedPoint>;\n    trailingEdge: Array<SidedPoint>;\n    startTip: SidedPoint | null;\n    endTip: SidedPoint | null;\n}\n\nfunction calculateRiseSetRuns(elements: BesselianElements, z0: number): Array<RiseSetRun> {\n    const deltaT = getEclipseDeltaT(elements);\n    const runs: Array<RiseSetRun> = [];\n    let current: RiseSetRun | null = null;\n\n    let prevCount = 0;\n    let lastSingleBranch: 'leading' | 'trailing' | null = null;\n\n    const feed = (crossings: Array<TerminatorCrossing>): void => {\n        if (current === null || crossings.length === 0) {\n            return;\n        }\n        const {leadingEdge, trailingEdge} = current;\n        const leadingLast = leadingEdge.length > 0 ? leadingEdge[leadingEdge.length - 1].point : null;\n        const trailingLast = trailingEdge.length > 0 ? trailingEdge[trailingEdge.length - 1].point : null;\n\n        if (crossings.length >= 2) {\n            const c0 = {point: crossings[0].point, isSunset: crossings[0].isSunset};\n            const c1 = {point: crossings[1].point, isSunset: crossings[1].isSunset};\n            if (leadingLast === null && trailingLast === null) {\n                if (crossings[0].qCos >= crossings[1].qCos) {\n                    leadingEdge.push(c0);\n                    trailingEdge.push(c1);\n                } else {\n                    leadingEdge.push(c1);\n                    trailingEdge.push(c0);\n                }\n            } else if (leadingLast !== null && trailingLast !== null) {\n                const dLL0 = latLonDistSq(c0.point, leadingLast);\n                const dLL1 = latLonDistSq(c1.point, leadingLast);\n                const dTL0 = latLonDistSq(c0.point, trailingLast);\n                const dTL1 = latLonDistSq(c1.point, trailingLast);\n                if (dLL0 + dTL1 <= dLL1 + dTL0) {\n                    leadingEdge.push(c0);\n                    trailingEdge.push(c1);\n                } else {\n                    leadingEdge.push(c1);\n                    trailingEdge.push(c0);\n                }\n            } else if (leadingLast !== null) {\n                // Trailing branch hasn't started yet — continue leading with the closer\n                // crossing, fork the other into a fresh trailing branch.\n                if (latLonDistSq(c0.point, leadingLast) <= latLonDistSq(c1.point, leadingLast)) {\n                    leadingEdge.push(c0);\n                    trailingEdge.push(c1);\n                } else {\n                    leadingEdge.push(c1);\n                    trailingEdge.push(c0);\n                }\n            } else {\n                // Mirror of the previous case.\n                if (latLonDistSq(c0.point, trailingLast as LatLon) <= latLonDistSq(c1.point, trailingLast as LatLon)) {\n                    trailingEdge.push(c0);\n                    leadingEdge.push(c1);\n                } else {\n                    trailingEdge.push(c1);\n                    leadingEdge.push(c0);\n                }\n            }\n            lastSingleBranch = null;\n        } else {\n            const c = crossings[0];\n            let target: 'leading' | 'trailing';\n            if (lastSingleBranch !== null) {\n                target = lastSingleBranch;\n            } else if (leadingLast !== null && trailingLast !== null) {\n                target =\n                    latLonDistSq(c.point, leadingLast) <= latLonDistSq(c.point, trailingLast) ? 'leading' : 'trailing';\n            } else if (leadingLast !== null) {\n                target = 'leading';\n            } else if (trailingLast !== null) {\n                target = 'trailing';\n            } else {\n                target = c.qCos >= 0 ? 'leading' : 'trailing';\n            }\n            if (target === 'leading') {\n                leadingEdge.push({point: c.point, isSunset: c.isSunset});\n            } else {\n                trailingEdge.push({point: c.point, isSunset: c.isSunset});\n            }\n            lastSingleBranch = target;\n        }\n    };\n\n    const feedTipNeighborhood = (tangentTau: number, gridTau: number): void => {\n        const span = gridTau - tangentTau;\n        const N = RISE_SET_TIP_REFINEMENT_SAMPLES;\n        for (let i = 1; i < N; i++) {\n            const k = span > 0 ? i : N - i;\n            feed(crossingsAtTau(elements, tangentTau + span * (k / N) ** 2, z0, deltaT));\n        }\n    };\n\n    const needsSubdivision = (crossings: Array<TerminatorCrossing>): boolean => {\n        if (current === null) {\n            return false;\n        }\n        const ends: Array<LatLon> = [];\n        if (current.leadingEdge.length > 0) {\n            ends.push(current.leadingEdge[current.leadingEdge.length - 1].point);\n        }\n        if (current.trailingEdge.length > 0) {\n            ends.push(current.trailingEdge[current.trailingEdge.length - 1].point);\n        }\n        if (ends.length === 0) {\n            return false;\n        }\n\n        return crossings.some((c) =>\n            ends.every((end) => {\n                let dLon = Math.abs(c.point.lon - end.lon);\n                if (dLon > 180) {\n                    dLon = 360 - dLon;\n                }\n                dLon *= Math.cos(((c.point.lat + end.lat) / 2) * DEG);\n                const dLat = c.point.lat - end.lat;\n\n                return dLat * dLat + dLon * dLon > RISE_SET_MAX_CHORD_DEG ** 2;\n            }),\n        );\n    };\n\n    const feedRefined = (tauA: number, tauB: number, crossingsB: Array<TerminatorCrossing>, depth: number): void => {\n        if (depth > 0 && needsSubdivision(crossingsB)) {\n            const mid = (tauA + tauB) / 2;\n            feedRefined(tauA, mid, crossingsAtTau(elements, mid, z0, deltaT), depth - 1);\n            feedRefined(mid, tauB, crossingsB, depth - 1);\n\n            return;\n        }\n        feed(crossingsB);\n    };\n\n    for (let tau = elements.tMin; tau <= elements.tMax; tau += RISE_SET_BOUNDARY_STEP_HOURS) {\n        const crossings = crossingsAtTau(elements, tau, z0, deltaT);\n\n        if (crossings.length === 0) {\n            if (current !== null) {\n                // Close the run; a 2 → 0 transition is a true tangent, 1 → 0 is not.\n                if (prevCount >= 2) {\n                    const tangent = bisectEndTangent(elements, tau - RISE_SET_BOUNDARY_STEP_HOURS, tau, z0, deltaT);\n                    if (tangent !== null) {\n                        feedTipNeighborhood(tangent.tau, tau - RISE_SET_BOUNDARY_STEP_HOURS);\n                        current.endTip = tangent.tip;\n                    }\n                }\n                runs.push(current);\n                current = null;\n            }\n            lastSingleBranch = null;\n            prevCount = 0;\n            continue;\n        }\n\n        if (current === null) {\n            current = {leadingEdge: [], trailingEdge: [], startTip: null, endTip: null};\n            lastSingleBranch = null;\n            // A 0 → 2 transition is a true tangent; skip when the sweep starts mid-run at tMin.\n            if (crossings.length >= 2 && tau > elements.tMin) {\n                const tangent = bisectEndTangent(elements, tau, tau - RISE_SET_BOUNDARY_STEP_HOURS, z0, deltaT);\n                if (tangent !== null) {\n                    current.startTip = tangent.tip;\n                    feedTipNeighborhood(tangent.tau, tau);\n                }\n            }\n        }\n\n        feedRefined(tau - RISE_SET_BOUNDARY_STEP_HOURS, tau, crossings, RISE_SET_GAP_SUBDIVISION_DEPTH);\n        prevCount = crossings.length;\n    }\n    if (current !== null) {\n        runs.push(current);\n    }\n\n    return runs;\n}\n\nfunction assembleRunCycle(run: RiseSetRun): Array<SidedPoint> {\n    const cycle: Array<SidedPoint> = [];\n    if (run.startTip !== null) {\n        cycle.push(run.startTip);\n    }\n    cycle.push(...run.leadingEdge);\n    if (run.endTip !== null) {\n        cycle.push(run.endTip);\n    }\n    for (let i = run.trailingEdge.length - 1; i >= 0; i--) {\n        cycle.push(run.trailingEdge[i]);\n    }\n\n    return cycle;\n}\n\ninterface TerminatorCrossing {\n    point: LatLon;\n    qCos: number;\n    isSunset: boolean;\n}\n\nfunction bisectEndTangent(\n    elements: BesselianElements,\n    tauWithTwo: number,\n    tauWithLess: number,\n    z0: number,\n    deltaT: number,\n): {tip: SidedPoint; tau: number} | null {\n    let twoSide = tauWithTwo;\n    let lessSide = tauWithLess;\n    for (let iter = 0; iter < 40; iter++) {\n        const mid = (twoSide + lessSide) / 2;\n        const c = crossingsAtTau(elements, mid, z0, deltaT);\n        if (c.length >= 2) {\n            twoSide = mid;\n        } else {\n            lessSide = mid;\n        }\n        if (Math.abs(lessSide - twoSide) < 1e-8) {\n            break;\n        }\n    }\n    const c = crossingsAtTau(elements, twoSide, z0, deltaT);\n    if (c.length === 0) {\n        return null;\n    }\n    if (c.length === 1) {\n        return {tip: {point: c[0].point, isSunset: c[0].isSunset}, tau: twoSide};\n    }\n\n    const e = getBesselianElementsAtTime(elements, twoSide);\n    const tangencyPoint = refineTangentToHorizon(elements, e, z0);\n    if (tangencyPoint !== null) {\n        return {tip: {point: tangencyPoint, isSunset: c[0].isSunset}, tau: twoSide};\n    }\n\n    const dlon = ((c[1].point.lon - c[0].point.lon + 540) % 360) - 180;\n    let avgLon = c[0].point.lon + dlon / 2;\n    while (avgLon > 180) {\n        avgLon -= 360;\n    }\n    while (avgLon < -180) {\n        avgLon += 360;\n    }\n\n    return {\n        tip: {point: {lat: (c[0].point.lat + c[1].point.lat) / 2, lon: avgLon}, isSunset: c[0].isSunset},\n        tau: twoSide,\n    };\n}\n\nfunction crossingsAtTau(\n    elements: BesselianElements,\n    tau: number,\n    z0: number,\n    deltaT: number,\n): Array<TerminatorCrossing> {\n    const e = getBesselianElementsAtTime(elements, tau);\n    const dx = polynomialDerivative(elements.x, tau);\n    const dy = polynomialDerivative(elements.y, tau);\n    const qVelocity = Math.atan2(dy, dx);\n\n    return collectCrossings(elements, e, qVelocity, z0, deltaT);\n}\n\nfunction collectCrossings(\n    elements: BesselianElements,\n    e: BesselianElementsAtTime,\n    qVelocity: number,\n    z0: number,\n    deltaT: number,\n): Array<TerminatorCrossing> {\n    const N = RISE_SET_BOUNDARY_Q_SAMPLES;\n    const pts: Array<LatLon | null> = new Array(N);\n    for (let i = 0; i < N; i++) {\n        pts[i] = calculateShadowBoundaryPoint(elements, e, (i / N) * 2 * Math.PI, false);\n    }\n\n    const result: Array<TerminatorCrossing> = [];\n    for (let i = 0; i < N; i++) {\n        const j = (i + 1) % N;\n        const p1 = pts[i];\n        const p2 = pts[j];\n        if ((p1 === null) === (p2 === null)) {\n            continue;\n        }\n\n        const q1 = (i / N) * 2 * Math.PI;\n        const q2 = ((i + 1) / N) * 2 * Math.PI;\n        const crossing = p1 !== null ? findNullBoundary(elements, e, q1, q2) : findNullBoundary(elements, e, q2, q1);\n        if (crossing === null) {\n            continue;\n        }\n\n        const point = refineCrossingToHorizon(elements, e, crossing.xi, crossing.eta, z0) ?? crossing.geometric;\n        const qCrossing = (q1 + q2) / 2;\n        result.push({\n            point,\n            qCos: Math.cos(qCrossing - qVelocity),\n            isSunset: isOnSunsetSide(crossing.geometric, e, deltaT),\n        });\n    }\n\n    return result;\n}\n\nfunction findNullBoundary(\n    elements: BesselianElements,\n    e: BesselianElementsAtTime,\n    qNonNull: number,\n    qNull: number,\n): {geometric: LatLon; xi: number; eta: number} | null {\n    let nonNullSide = qNonNull;\n    let nullSide = qNull;\n\n    for (let iter = 0; iter < 50; iter++) {\n        const qMid = (nonNullSide + nullSide) / 2;\n        const p = calculateShadowBoundaryPoint(elements, e, qMid, false);\n        if (p !== null) {\n            nonNullSide = qMid;\n        } else {\n            nullSide = qMid;\n        }\n        if (Math.abs(nullSide - nonNullSide) < 1e-9) {\n            break;\n        }\n    }\n\n    const geometric = calculateShadowBoundaryPoint(elements, e, nonNullSide, false);\n    const fundamental = penumbraBoundaryFundamental(elements, e, nonNullSide);\n    if (geometric === null || fundamental === null) {\n        return null;\n    }\n\n    return {geometric, xi: fundamental.xi, eta: fundamental.eta};\n}\n\nfunction refineCrossingToHorizon(\n    elements: BesselianElements,\n    e: BesselianElementsAtTime,\n    xiSeed: number,\n    etaSeed: number,\n    z0: number,\n): LatLon | null {\n    const penumbraRadius = Math.abs(e.l1 - z0 * elements.tanF1);\n    const axisDistance = Math.hypot(e.x, e.y);\n    if (axisDistance === 0) {\n        return null;\n    }\n    const ux = e.x / axisDistance;\n    const uy = e.y / axisDistance;\n\n    let xi = xiSeed;\n    let eta = etaSeed;\n    // On the ring sinU follows linearly from eta: (1 - f) sinU = eta cos d + zeta sin d.\n    let sinU = (etaSeed * e.cosD + z0 * e.sinD) / ONE_MINUS_F;\n    for (let iter = 0; iter < 40; iter++) {\n        // Radius (about the axis) of the terminator ring at zeta = z0 on the ellipsoid.\n        const ringRadiusSq = 1 - E_SQ * sinU * sinU - z0 * z0;\n        if (ringRadiusSq < 0) {\n            return null;\n        }\n        const ringRadius = Math.sqrt(ringRadiusSq);\n        const along =\n            (ringRadius * ringRadius - penumbraRadius * penumbraRadius + axisDistance * axisDistance)\n            / (2 * axisDistance);\n        const halfChordSq = ringRadius * ringRadius - along * along;\n        if (halfChordSq < 0) {\n            return null;\n        }\n        const halfChord = Math.sqrt(halfChordSq);\n        const baseXi = along * ux;\n        const baseEta = along * uy;\n        const candidate1Xi = baseXi - halfChord * uy;\n        const candidate1Eta = baseEta + halfChord * ux;\n        const candidate2Xi = baseXi + halfChord * uy;\n        const candidate2Eta = baseEta - halfChord * ux;\n        const dist1 = (candidate1Xi - xi) ** 2 + (candidate1Eta - eta) ** 2;\n        const dist2 = (candidate2Xi - xi) ** 2 + (candidate2Eta - eta) ** 2;\n        const nextXi = dist1 <= dist2 ? candidate1Xi : candidate2Xi;\n        const nextEta = dist1 <= dist2 ? candidate1Eta : candidate2Eta;\n        const moved = (nextXi - xi) ** 2 + (nextEta - eta) ** 2;\n        xi = nextXi;\n        eta = nextEta;\n        sinU = (eta * e.cosD + z0 * e.sinD) / ONE_MINUS_F;\n        if (moved < 1e-18) {\n            break;\n        }\n    }\n\n    return terminatorRingPoint(elements, e, Math.atan2(eta, xi), sinU, z0).point;\n}\n\nfunction refineTangentToHorizon(elements: BesselianElements, e: BesselianElementsAtTime, z0: number): LatLon | null {\n    const penumbraRadius = Math.abs(e.l1 - z0 * elements.tanF1);\n    const axisDistance = Math.hypot(e.x, e.y);\n    if (axisDistance === 0) {\n        return null;\n    }\n    const ux = e.x / axisDistance;\n    const uy = e.y / axisDistance;\n\n    let xi = ux;\n    let eta = uy;\n    let sinU = (uy * e.cosD + z0 * e.sinD) / ONE_MINUS_F;\n    for (let iter = 0; iter < 40; iter++) {\n        const ringRadiusSq = 1 - E_SQ * sinU * sinU - z0 * z0;\n        if (ringRadiusSq < 0) {\n            return null;\n        }\n        const along =\n            (ringRadiusSq - penumbraRadius * penumbraRadius + axisDistance * axisDistance) / (2 * axisDistance);\n        xi = along * ux;\n        eta = along * uy;\n        const next = (eta * e.cosD + z0 * e.sinD) / ONE_MINUS_F;\n        const moved = (next - sinU) ** 2;\n        sinU = next;\n        if (moved < 1e-18) {\n            break;\n        }\n    }\n\n    return terminatorRingPoint(elements, e, Math.atan2(eta, xi), sinU, z0).point;\n}\n\nfunction latLonDistSq(a: LatLon, b: LatLon): number {\n    let dLon = b.lon - a.lon;\n    while (dLon > 180) {\n        dLon -= 360;\n    }\n    while (dLon < -180) {\n        dLon += 360;\n    }\n    const dLat = b.lat - a.lat;\n\n    return dLat * dLat + dLon * dLon;\n}\n","import {SECONDS_PER_DAY} from '@app/constants/time';\nimport type {LatLon} from '@app/types/LocationTypes';\nimport {polynomialDerivative} from '@app/utils/polynoms';\nimport {solveLimbClampedSurfacePoint} from '@package/solarEclipse/services/shadowGeometry/utils/surface';\nimport type {BesselianElements} from '@package/solarEclipse/types/BesselianElementTypes';\nimport {getBesselianElementsAtTime, getEclipseDeltaT} from '@package/solarEclipse/utils/besselianElements';\n\nconst MAX_ITERATIONS = 30;\nconst ITERATION_TOLERANCE_HOURS = 1e-8;\nconst ECLIPSE_SEARCH_RANGE_HOURS = 4;\n\nexport function getLocationOfGreatestEclipse(elements: BesselianElements): LatLon {\n    const tau = getTauOfGreatestEclipse(elements);\n    const e = getBesselianElementsAtTime(elements, tau);\n\n    // If the shadow axis misses Earth, project it onto the limb\n    const dist = Math.sqrt(e.x * e.x + e.y * e.y);\n    const xi = dist > 1 ? e.x / dist : e.x;\n    const eta = dist > 1 ? e.y / dist : e.y;\n\n    const {lat, lon} = solveLimbClampedSurfacePoint(elements, e, xi, eta, getEclipseDeltaT(elements));\n\n    return {lat, lon};\n}\n\nexport function getJulianDayOfGreatestEclipse(elements: BesselianElements): number {\n    return elements.t0Jde - getEclipseDeltaT(elements) / SECONDS_PER_DAY;\n}\n\nexport function getGamma(elements: BesselianElements): number {\n    const tau = getTauOfGreatestEclipse(elements);\n    const e = getBesselianElementsAtTime(elements, tau);\n    const distance = Math.sqrt(e.x * e.x + e.y * e.y);\n\n    return e.y < 0 ? -distance : distance;\n}\n\nexport function getTauOfGreatestEclipse(elements: BesselianElements): number {\n    let tau = 0;\n\n    for (let i = 0; i < MAX_ITERATIONS; i++) {\n        const e = getBesselianElementsAtTime(elements, tau);\n        const xp = polynomialDerivative(elements.x, tau);\n        const yp = polynomialDerivative(elements.y, tau);\n        const nSq = xp * xp + yp * yp;\n\n        if (nSq < 1e-20) {\n            return 0;\n        }\n\n        const delta = -(e.x * xp + e.y * yp) / nSq;\n        tau += delta;\n\n        if (Math.abs(tau) > ECLIPSE_SEARCH_RANGE_HOURS) {\n            return 0;\n        }\n\n        if (Math.abs(delta) < ITERATION_TOLERANCE_HOURS) {\n            return tau;\n        }\n    }\n\n    return 0;\n}\n","import {polynomial} from '@app/utils/polynoms';\nimport {LocalSolarEclipseType, SolarEclipseType} from '@package/solarEclipse/enums/SolarEclipseType';\nimport type {BesselianElements} from '@package/solarEclipse/types/BesselianElementTypes';\nimport {getLocationOfGreatestEclipse, getTauOfGreatestEclipse} from '@package/solarEclipse/utils/greatestEclipse';\nimport {getLocalEclipseCircumstances, getLocalEclipseType} from '@package/solarEclipse/utils/localCircumstances';\n\nconst ECLIPSE_SEARCH_RANGE_HOURS = 4;\n\nexport function getEclipseType(elements: BesselianElements): SolarEclipseType {\n    const tau = getTauOfGreatestEclipse(elements);\n    const location = getLocationOfGreatestEclipse(elements);\n    const circumstances = getLocalEclipseCircumstances(elements, {...location, elevation: 0}, tau);\n    const localType = getLocalEclipseType(circumstances);\n\n    if (localType !== LocalSolarEclipseType.Total && localType !== LocalSolarEclipseType.Annular) {\n        return SolarEclipseType.Partial;\n    }\n\n    if (isHybridEclipse(elements)) {\n        return SolarEclipseType.Hybrid;\n    }\n\n    return localType === LocalSolarEclipseType.Total ? SolarEclipseType.Total : SolarEclipseType.Annular;\n}\n\nfunction isHybridEclipse(elements: BesselianElements): boolean {\n    let hasUmbra = false;\n    let hasAntumbra = false;\n    for (let tau = -ECLIPSE_SEARCH_RANGE_HOURS; tau <= ECLIPSE_SEARCH_RANGE_HOURS; tau += 0.01) {\n        const x = polynomial(elements.x, tau);\n        const y = polynomial(elements.y, tau);\n        const r2 = x * x + y * y;\n\n        if (r2 >= 1) {\n            continue;\n        }\n\n        const l2 = polynomial(elements.l2, tau);\n        const zeta = Math.sqrt(1 - r2);\n\n        if (l2 - zeta * elements.tanF2 < 0) {\n            hasUmbra = true;\n        }\n\n        if (l2 > 0) {\n            hasAntumbra = true;\n        }\n\n        if (hasUmbra && hasAntumbra) {\n            return true;\n        }\n    }\n\n    return false;\n}\n","import type {LatLon, Location} from '@app/types/LocationTypes';\nimport type {ShadowPathOptions} from '@package/solarEclipse/services/shadowGeometry/types/ShadowPathTypes';\nimport {getCentralLine} from '@package/solarEclipse/services/shadowGeometry/utils/centralLine';\nimport {horizonSinAltitude} from '@package/solarEclipse/services/shadowGeometry/utils/constants';\nimport calculatePenumbraPathPolygon from '@package/solarEclipse/services/shadowGeometry/utils/penumbraPathPolygon';\nimport {\n    calculateSunriseBoundary,\n    calculateSunsetBoundary,\n} from '@package/solarEclipse/services/shadowGeometry/utils/riseSetBoundary';\nimport calculateUmbraPathPolygon from '@package/solarEclipse/services/shadowGeometry/utils/umbraPathPolygon';\nimport type {LocalEclipseCircumstances} from '@package/solarEclipse/types/EclipseCircumstances';\nimport {getCentralDuration, getDuration} from '@package/solarEclipse/utils/duration';\nimport {getEclipseType} from '@package/solarEclipse/utils/eclipseType';\nimport {\n    getGamma,\n    getJulianDayOfGreatestEclipse,\n    getLocationOfGreatestEclipse,\n    getTauOfGreatestEclipse,\n} from '@package/solarEclipse/utils/greatestEclipse';\nimport {\n    getLocalEclipseCircumstances,\n    getMagnitude,\n    getMoonSunRatio,\n    getObscuration,\n} from '@package/solarEclipse/utils/localCircumstances';\nimport {getUmbraPathWidth} from '@package/solarEclipse/utils/pathWidth';\nimport TimeOfInterest from '@package/time/models/TimeOfInterest';\nimport type {SolarEclipseType} from '../enums/SolarEclipseType';\nimport type {BesselianElements} from '../types/BesselianElementTypes';\nimport LocalSolarEclipse from './LocalSolarEclipse';\n\nexport default class SolarEclipse {\n    private readonly elements: BesselianElements;\n    private readonly locationOfGreatestEclipse: LatLon;\n    private readonly tauOfGreatestEclipse: number;\n    private readonly greatestEclipseCircumstances: LocalEclipseCircumstances;\n\n    private constructor(elements: BesselianElements) {\n        this.elements = elements;\n        this.locationOfGreatestEclipse = getLocationOfGreatestEclipse(this.elements);\n        this.tauOfGreatestEclipse = getTauOfGreatestEclipse(this.elements);\n        this.greatestEclipseCircumstances = getLocalEclipseCircumstances(\n            this.elements,\n            {...this.locationOfGreatestEclipse, elevation: 0},\n            this.tauOfGreatestEclipse,\n        );\n    }\n\n    public static createFromBesselianElements(elements: BesselianElements): SolarEclipse {\n        return new SolarEclipse(elements);\n    }\n\n    public getLocalEclipse(location: Location): LocalSolarEclipse {\n        return LocalSolarEclipse.create(this.elements, location);\n    }\n\n    public getType(): SolarEclipseType {\n        return getEclipseType(this.elements);\n    }\n\n    public getSaros(): number {\n        return this.elements.saros;\n    }\n\n    public getLocationOfGreatestEclipse(): LatLon {\n        return this.locationOfGreatestEclipse;\n    }\n\n    public getTimeOfGreatestEclipse(): TimeOfInterest {\n        const jd = getJulianDayOfGreatestEclipse(this.elements);\n\n        return TimeOfInterest.fromJulianDay(jd);\n    }\n\n    public getGamma(): number {\n        return getGamma(this.elements);\n    }\n\n    public getMaxMagnitude(): number {\n        return getMagnitude(this.greatestEclipseCircumstances);\n    }\n\n    public getMaxMoonSunRatio(): number {\n        return getMoonSunRatio(this.greatestEclipseCircumstances);\n    }\n\n    public getMaxObscuration(): number {\n        return getObscuration(this.greatestEclipseCircumstances);\n    }\n\n    public getUmbraPathWidth(): number {\n        return getUmbraPathWidth(this.elements, this.tauOfGreatestEclipse);\n    }\n\n    public getMaxDuration(): number {\n        return getDuration(this.elements, {\n            ...this.locationOfGreatestEclipse,\n            elevation: 0,\n        });\n    }\n\n    public getMaxCentralDuration(): number {\n        return getCentralDuration(this.elements, {\n            ...this.locationOfGreatestEclipse,\n            elevation: 0,\n        });\n    }\n\n    public getCentralLine(options: ShadowPathOptions = {}): Array<LatLon> {\n        return getCentralLine(this.elements, options);\n    }\n\n    public getUmbraPathPolygon(options: ShadowPathOptions = {}): Array<LatLon> {\n        return calculateUmbraPathPolygon(this.elements, options);\n    }\n\n    public getPenumbraPathPolygon(options: ShadowPathOptions = {}): Array<LatLon> {\n        return calculatePenumbraPathPolygon(this.elements, options);\n    }\n\n    public getSunriseBoundaryPolygon(options: ShadowPathOptions = {}): Array<LatLon> {\n        return calculateSunriseBoundary(this.elements, horizonSinAltitude(options));\n    }\n\n    public getSunsetBoundaryPolygon(options: ShadowPathOptions = {}): Array<LatLon> {\n        return calculateSunsetBoundary(this.elements, horizonSinAltitude(options));\n    }\n}\n"],"mappings":"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I,EAAG,GAAI,EAAK,EAAG,CAAG,EAChC,CAAC,EAAG,EAAG,EAAG,GAAI,EAAG,GAAI,EAAK,EAAG,CAAG,EAChC,CAAC,EAAG,EAAG,GAAI,EAAG,EAAG,EAAG,EAAK,EAAG,CAAG,EAC/B,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,EAAK,EAAG,CAAG,EAC/B,CAAC,GAAI,EAAG,EAAG,EAAG,EAAG,GAAI,EAAK,EAAG,CAAG,EAChC,CAAC,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAK,EAAG,CAAG,EACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,EAAK,EAAG,CAAG,EAC/B,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAK,EAAG,CAAG,EAC9B,CAAC,EAAG,GAAI,EAAG,EAAG,EAAG,GAAI,EAAK,EAAG,CAAG,EAChC,CAAC,GAAI,GAAI,EAAG,EAAG,EAAG,GAAI,EAAK,EAAG,CAAG,EACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,EAAK,EAAG,CAAG,EAC/B,CAAC,EAAG,GAAI,EAAG,EAAG,EAAG,GAAI,EAAK,EAAG,CAAG,EAChC,CAAC,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAK,EAAG,CAAG,EACjC,CAAC,GAAI,EAAG,EAAG,EAAG,EAAG,GAAI,EAAK,EAAG,CAAG,EAChC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAK,GAAI,CAAG,EAC/B,CAAC,GAAI,EAAG,EAAG,GAAI,EAAG,GAAI,EAAK,EAAG,CAAG,EACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAK,GAAI,CAAG,EAC/B,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,EAAK,EAAG,CAAG,EAC/B,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAK,EAAG,CAAG,EAC9B,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAK,GAAI,CAAG,EAC/B,CAAC,GAAI,EAAG,EAAG,EAAG,EAAG,GAAI,EAAK,EAAG,CAAG,EAChC,CAAC,EAAG,EAAG,GAAI,EAAG,EAAG,EAAG,EAAK,EAAG,CAAG,EAC/B,CAAC,EAAG,EAAG,EAAG,GAAI,EAAG,EAAG,EAAK,EAAG,CAAG,EAC/B,CAAC,EAAG,EAAG,GAAI,EAAG,EAAG,EAAG,EAAK,EAAG,CAAG,EAC/B,CAAC,EAAG,EAAG,GAAI,EAAG,EAAG,GAAI,EAAK,EAAG,CAAG,EAChC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAK,EAAG,CAAG,EAC9B,CAAC,GAAI,EAAG,EAAG,EAAG,EAAG,EAAG,EAAK,EAAG,CAAG,EAC/B,CAAC,EAAG,EAAG,EAAG,GAAI,EAAG,GAAI,EAAK,EAAG,CAAG,EAChC,CAAC,GAAI,EAAG,EAAG,EAAG,EAAG,EAAG,EAAK,GAAI,CAAG,EAChC,CAAC,EAAG,EAAG,EAAG,GAAI,EAAG,GAAI,EAAK,EAAG,CAAG,EAChC,CAAC,GAAI,EAAG,EAAG,EAAG,EAAG,EAAG,EAAK,GAAI,CAAG,EAChC,CAAC,EAAG,EAAG,EAAG,GAAI,EAAG,GAAI,EAAK,EAAG,CAAG,EAChC,CAAC,EAAG,EAAG,EAAG,GAAI,EAAG,EAAG,EAAK,GAAI,CAAG,EAChC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,EAAK,EAAG,CAAG,EAC/B,CAAC,GAAI,EAAG,EAAG,EAAG,EAAG,GAAI,EAAK,EAAG,CAAG,EAChC,CAAC,GAAI,EAAG,EAAG,EAAG,EAAG,EAAG,EAAK,EAAG,CAAG,EAC/B,CAAC,EAAG,GAAI,EAAG,GAAI,EAAG,EAAG,EAAK,EAAG,CAAG,EAChC,CAAC,EAAG,EAAG,EAAG,GAAI,EAAG,EAAG,EAAK,GAAI,CAAG,EAChC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,EAAK,EAAG,CAAG,EAC/B,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,EAAK,EAAG,CAAG,EAC/B,CAAC,EAAG,EAAG,EAAG,GAAI,EAAG,EAAG,EAAK,EAAG,CAAG,EAC/B,CAAC,EAAG,EAAG,EAAG,GAAI,EAAG,EAAG,EAAK,EAAG,CAAG,EAC/B,CAAC,EAAG,EAAG,EAAG,GAAI,EAAG,GAAI,EAAK,EAAG,CAAG,EAChC,CAAC,EAAG,EAAG,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,OAAQ,EAAE,EAAG,CAAC,KAAM,EAAE,EAAG,CAAC,OAAQ,EAAE,EAC3E,CAAC,KAAM,EAAE,EAAG,CAAC,OAAQ,EAAE,EAAG,CAAC,KAAM,EAAE,EAAG,CAAC,OAAQ,EAAE,EAAG,CAAC,KAAM,EAAE,EAAG,CAAC,OAAQ,EAAE,EAC3E,CAAC,KAAM,EAAE,EAAG,CAAC,OAAQ,EAAE,EAAG,CAAC,KAAM,EAAE,EAAG,CAAC,OAAQ,EAAE,EAAG,CAAC,KAAM,EAAE,EAAG,CAAC,OAAQ,EAAE,EAC3E,CAAC,KAAM,EAAE,EAAG,CAAC,OAAQ,EAAE,EAAG,CAAC,KAAM,EAAE,EAAG,CAAC,OAAQ,EAAE,EAAG,CAAC,KAAM,EAAE,EAAG,CAAC,OAAQ,EAAE,EAC3E,CAAC,KAAM,EAAE,EAAG,CAAC,OAAQ,EAAE,EAAG,CAAC,KAAM,EAAE,EAAG,CAAC,OAAQ,EAAE,EAAG,CAAC,KAAM,EAAE,EAAG,CAAC,OAAQ,EAAE,EAC3E,CAAC,KAAM,EAAE,EAAG,CAAC,OAAQ,EAAE,EAAG,CAAC,KAAM,EAAE,EAAG,CAAC,OAAQ,EAAE,EAAG,CAAC,KAAM,EAAE,EAAG,CAAC,OAAQ,EAAE,EAC3E,CAAC,KAAM,EAAE,EAAG,CAAC,OAAQ,EAAE,EAAG,CAAC,KAAM,EAAE,EAAG,CAAC,OAAQ,EAAE,EAAG,CAAC,KAAM,EAAE,EAAG,CAAC,OAAQ,EAAE,EAC3E,CAAC,KAAM,EAAE,EAAG,CAAC,OAAQ,EAAE,EAAG,CAAC,KAAM,EAAE,EAAG,CAAC,OAAQ,EAAE,EAAG,CAAC,KAAM,EAAE,EAAG,CAAC,OAAQ,EAAE,EAC3E,CAAC,KAAM,EAAE,EAAG,CAAC,OAAQ,EAAE,EAAG,CAAC,KAAM,EAAE,EAAG,CAAC,OAAQ,EAAE,EAAG,CAAC,KAAM,EAAE,EAAG,CAAC,OAAQ,EAAE,EAC3E,CAAC,KAAM,EAAE,EAAG,CAAC,OAAQ,EAAE,EAAG,CAAC,KAAM,EAAE,EAAG,CAAC,OAAQ,EAAE,EAAG,CAAC,KAAM,EAAE,EAAG,CAAC,OAAQ,EAAE,EAC3E,CAAC,KAAM,EAAE,EAAG,CAAC,OAAQ,EAAE,EAAG,CAAC,KAAM,EAAE,EAAG,CAAC,OAAQ,EAAE,EAAG,CAAC,KAAM,EAAE,EAAG,CAAC,OAAQ,EAAE,EAC3E,CAAC,KAAM,EAAE,EAAG,CAAC,OAAQ,EAAE,EAAG,CAAC,KAAM,EAAE,EAAG,CAAC,OAAQ,EAAE,EAAG,CAAC,KAAM,EAAE,EAAG,CAAC,OAAQ,EAAE,EAC3E,CAAC,KAAM,EAAE,EAAG,CAAC,OAAQ,EAAE,EAAG,CAAC,KAAM,EAAE,EAAG,CAAC,OAAQ,EAAE,EAAG,CAAC,KAAM,EAAE,EAAG,CAAC,OAAQ,EAAE,EAC3E,CAAC,KAAM,EAAE,EAAG,CAAC,OAAQ,EAAE,EAAG,CAAC,KAAM,EAAE,EAAG,CAAC,OAAQ,EAAE,EAAG,CAAC,KAAM,EAAE,EAAG,CAAC,OAAQ,EAAE,EAC3E,CAAC,KAAM,IAAI,EAAG,CAAC,OAAQ,EAAE,EAAG,CAAC,KAAM,EAAE,EAAG,CAAC,OAAQ,EAAE,EAAG,CAAC,KAAM,IAAI,EAAG,CAAC,OAAQ,IAAI,EACjF,CAAC,KAAM,IAAI,EAAG,CAAC,OAAQ,IAAI,EAAG,CAAC,KAAM,IAAI,EAAG,CAAC,OAAQ,IAAI,EAAG,CAAC,KAAM,EAAE,EAAG,CAAC,OAAQ,IAAI,EACrF,CAAC,KAAM,IAAI,EAAG,CAAC,OAAQ,IAAI,EAAG,CAAC,KAAM,IAAI,EAAG,CAAC,OAAQ,IAAI,EAAG,CAAC,KAAM,IAAI,EAAG,CAAC,OAAQ,IAAI,EACvF,CAAC,KAAM,EAAE,EAAG,CAAC,OAAQ,IAAI,EAAG,CAAC,KAAM,IAAI,EAAG,CAAC,OAAQ,IAAI,EAAG,CAAC,KAAM,IAAI,EAAG,CAAC,OAAQ,IAAI,EACrF,CAAC,KAAM,IAAI,EAAG,CAAC,OAAQ,IAAI,EAAG,CAAC,KAAM,IAAI,EAAG,CAAC,OAAQ,EAAE,EAAG,CAAC,KAAM,IAAI,EAAG,CAAC,OAAQ,IAAI,EACrF,CAAC,KAAM,IAAI,EAAG,CAAC,OAAQ,IAAI,EAAG,CAAC,KAAM,IAAI,EAAG,CAAC,OAAQ,IAAI,EAAG,CAAC,KAAM,IAAI,EAAG,CAAC,OAAQ,IAAI,EACvF,CAAC,KAAM,IAAI,EAAG,CAAC,OAAQ,IAAI,EAAG,CAAC,KAAM,IAAI,EAAG,CAAC,OAAQ,IAAI,EAAG,CAAC,KAAM,IAAI,EAAG,CAAC,OAAQ,IAAI,EACvF,CAAC,KAAM,IAAI,EAAG,CAAC,OAAQ,IAAI,EAAG,CAAC,KAAM,IAAI,EAAG,CAAC,OAAQ,IAAI,EAAG,CAAC,KAAM,IAAI,EAAG,CAAC,OAAQ,IAAI,EACvF,CAAC,KAAM,IAAI,EAAG,CAAC,OAAQ,IAAI,EAAG,CAAC,KAAM,IAAI,EAAG,CAAC,OAAQ,IAAI,EAAG,CAAC,KAAM,IAAI,EAAG,CAAC,OAAQ,IAAI,EACvF,CAAC,KAAM,EAAE,EAAG,CAAC,OAAQ,IAAI,EAAG,CAAC,KAAM,IAAI,EAAG,CAAC,OAAQ,IAAI,EAAG,CAAC,KAAM,IAAI,EAAG,CAAC,OAAQ,IAAI,EACrF,CAAC,KAAM,IAAI,EAAG,CAAC,OAAQ,IAAI,EAAG,CAAC,KAAM,IAAI,EAAG,CAAC,OAAQ,EAAE,EAAG,CAAC,KAAM,EAAE,EAAG,CAAC,OAAQ,IAAI,EACnF,CAAC,KAAM,IAAI,EAAG,CAAC,OAAQ,IAAI,EAAG,CAAC,KAAM,IAAI,EAAG,CAAC,OAAQ,IAAI,EAAG,CAAC,KAAM,IAAI,EAAG,CAAC,OAAQ,IAAI,EACvF,CAAC,KAAM,IAAI,EAAG,CAAC,OAAQ,IAAI,EAAG,CAAC,KAAM,IAAI,EAAG,CAAC,OAAQ,IAAI,EAAG,CAAC,KAAM,IAAI,EAAG,CAAC,OAAQ,IAAI,EACvF,CAAC,KAAM,IAAI,EAAG,CAAC,OAAQ,IAAI,EAAG,CAAC,KAAM,IAAI,EAAG,CAAC,OAAQ,IAAI,EAAG,CAAC,KAAM,IAAI,EAAG,CAAC,OAAQ,EAAE,EACrF,CAAC,KAAM,EAAE,EAAG,CAAC,OAAQ,IAAI,EAAG,CAAC,KAAM,IAAI,EAAG,CAAC,OAAQ,IAAI,EAAG,CAAC,KAAM,IAAI,EAAG,CAAC,OAAQ,IAAI,EACrF,CAAC,KAAM,IAAI,EAAG,CAAC,OAAQ,IAAI,EAAG,CAAC,KAAM,IAAI,EAAG,CAAC,OAAQ,IAAI,EAAG,CAAC,KAAM,IAAI,EAAG,CAAC,OAAQ,IAAI,EACvF,CAAC,KAAM,IAAI,EAAG,CAAC,OAAQ,IAAI,EAAG,CAAC,KAAM,IAAI,EAAG,CAAC,OAAQ,IAAI,EAAG,CAAC,KAAM,IAAI,EAAG,CAAC,OAAQ,IAAI,EACvF,CAAC,KAAM,IAAI,EAAG,CAAC,OAAQ,IAAI,EAAG,CAAC,KAAM,IAAI,EAAG,CAAC,OAAQ,IAAI,EAAG,CAAC,KAAM,IAAI,EAAG,CAAC,OAAQ,EAAE,EACrF,CAAC,KAAM,IAAI,EAAG,CAAC,OAAQ,IAAI,EAAG,CAAC,KAAM,IAAI,EAAG,CAAC,OAAQ,IAAI,EAAG,CAAC,KAAM,IAAI,EAAG,CAAC,OAAQ,IAAI,EACvF,CAAC,KAAM,IAAI,EAAG,CAAC,OAAQ,IAAI,EAAG,CAAC,KAAM,IAAI,EAAG,CAAC,OAAQ,IAAI,EAAG,CAAC,KAAM,IAAI,EAAG,CAAC,OAAQ,IAAI,EACvF,CAAC,KAAM,IAAI,EAAG,CAAC,OAAQ,IAAI,EAAG,CAAC,KAAM,IAAI,EAAG,CAAC,OAAQ,IAAI,EAAG,CAAC,KAAM,IAAI,EAAG,CAAC,OAAQ,IAAI,EACvF,CAAC,KAAM,IAAI,EAAG,CAAC,OAAQ,IAAI,EAAG,CAAC,KAAM,IAAI,EAAG,CAAC,OAAQ,IAAI,EAAG,CAAC,KAAM,IAAI,EAAG,CAAC,OAAQ,IAAI,EACvF,CAAC,KAAM,IAAI,EAAG,CAAC,OAAQ,IAAI,EAAG,CAAC,KAAM,IAAI,EAAG,CAAC,OAAQ,IAAI,EAAG,CAAC,KAAM,IAAI,EAAG,CAAC,OAAQ,IAAI,EACvF,CAAC,KAAM,IAAI,EAAG,CAAC,OAAQ,IAAI,EAAG,CAAC,KAAM,IAAI,EAAG,CAAC,OAAQ,IAAI,EAAG,CAAC,KAAM,EAAE,EAAG,CAAC,OAAQ,IAAI,EACrF,CAAC,KAAM,IAAI,EAAG,CAAC,OAAQ,IAAI,EAAG,CAAC,KAAM,IAAI,EAAG,CAAC,OAAQ,IAAI,EAAG,CAAC,KAAM,IAAI,EAAG,CAAC,OAAQ,IAAI,EACvF,CAAC,KAAM,IAAI,EAAG,CAAC,OAAQ,IAAI,EAAG,CAAC,KAAM,IAAI,EAAG,CAAC,OAAQ,IAAI,EAAG,CAAC,KAAM,IAAI,EAAG,CAAC,OAAQ,IAAI,EACvF,CAAC,KAAM,EAAE,EAAG,CAAC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","names":["DEG","RAD","round","value","decimals","p","pad","num","size","numStr","sin2","number","cos2","normalizeAngle","degrees","baseAngle","angle","sec2deg","seconds","EARTH_AXIS_RATIO","EARTH_FLATTENING","EARTH_POLAR_RADIUS_RATIO","ECCENTRICITY_SQUARED","EARTH_ROTATION_DEG_PER_HOUR","EARTH_SIDEREAL_ROTATION_PER_DAY","EARTH_ARGUMENTS_OF_NUTATION","LIGHT_SPEED_KM_PER_SEC","au2km","R","getDistanceInKm","location1","location2","lat1","lon1","lat2","lon2","F","G","lambda","FRad","DEG","GRad","lambdaRad","S","sin2","cos2","C","omegaRad","R","D","H1","H2","EARTH_FLATTENING","getMeanAnomaly","T","M","normalizeAngle","getMeanLongitude","T","t","L0","normalizeAngle","getTrueLongitude","C","getEquationOfCenter","getEquationOfCenter","T","M","getMeanAnomaly","C","DEG","getMeanElongation","T","D","normalizeAngle","getMeanAnomaly","Mmoon","getArgumentOfLatitude","F","getEccentricity","T","getLongitudeOfPerihelionOfOrbit","getMeanObliquityOfEcliptic","U","getTrueObliquityOfEcliptic","eps0","sumEps","getNutationInObliquity","getNutationInLongitude","D","getMeanElongation","Msun","getMeanAnomaly","Mmoon","F","getArgumentOfLatitude","O","sumPhi","EARTH_ARGUMENTS_OF_NUTATION","args","argMmoon","argMsun","argF","argD","argO","argPhi1","argPhi2","tmpSum","DEG","argEps1","argEps2","correctEffectOfNutation","coords","T","phi","getNutationInLongitude","correctEffectOfAberration","lonSun","getTrueLongitude","e","getEccentricity","pi","getLongitudeOfPerihelionOfOrbit","k","sec2deg","lonRad","DEG","latRad","lonSunRad","piRad","dLon","dLat","correctEffectOfRefraction","altitude","R","polynomial","coefs","tau","value","power","c","polynomialDerivative","i","EPOCH_J2000","REFERENCE_DELTA_T","REFERENCE_MIN_YEAR","REFERENCE_DELTA_T","REFERENCE_MAX_YEAR","FUTURE_FIT_START_YEAR","FUTURE_DELTA_T_COEFFICIENTS","fitPolynomial","yearlyReferenceValues","deltaT","index","getDeltaT","year","month","y","getReferenceDeltaT","evaluatePolynomial","t","first","last","clamped","low","high","mid","year0","deltaT0","year1","deltaT1","fraction","from","to","values","coefficients","x","sum","coefficient","power","points","degree","size","matrix","vector","j","value","pivot","row","factor","col","_","i","time2julianDay","time","tmpYear","getDayOfYear","Y","M","D","H","A","B","dateStringToJulianDay","dateStr","isoDate","parseIsoDateString","offsetMinutes","date","match","year","month","day","hour","min","sec","offsetSign","offsetHour","offsetMin","offsetFactor","julianDay2time","jd","Z","F","a","C","E","dayOnMonth","julianDay2julianDay0","julianDay2julianCenturiesJ2000","jd","EPOCH_J2000","julianCenturiesJ20002julianDay","T","julianDay2julianMillenniaJ2000","julianDay2julianDayEphemeris","jd","year","month","julianDay2time","getDeltaT","julianDayEphemeris2julianDay","jde","dayOfYear2time","dayOfYear","K","isLeapYear","day","hourFloat","hour","minFloat","min","sec","round","getDecimalYear","time","daysInYear","getDayOfYear","M","D","getDayOfWeek","time2julianDay","parseBesselianElements","raw","getBesselianElementsAtTime","elements","tau","d","polynomial","DEG","mu","tau2julianDay","getEclipseDeltaT","julianDay2tau","jd","polyRefJd","year","month","julianDay2time","getDeltaT","ONE_MINUS_F","EARTH_POLAR_RADIUS_RATIO","E_SQ","ECCENTRICITY_SQUARED","HORIZON_REFRACTION_DEG","SUN_SEMIDIAMETER_DEG","RISE_SET_SUN_ALTITUDE_DEG","REFRACTED_HORIZON_SIN_ALTITUDE","DEG","GEOMETRIC_HORIZON_SIN_ALTITUDE","horizonSinAltitude","settings","CENTRAL_LINE_STEP_HOURS","UMBRA_REGION_STEP_HOURS","RISE_SET_BOUNDARY_STEP_HOURS","RISE_SET_BOUNDARY_Q_SAMPLES","RISE_SET_TIP_REFINEMENT_SAMPLES","RISE_SET_MAX_CHORD_DEG","RISE_SET_GAP_SUBDIVISION_DEPTH","normalizeLongitude","lon","result","POLE_EDGE_STEP_DEG","latLonChordDeg","a","b","dLat","dLon","shortestLonDelta","DEG","from","to","shortestPeriodicDelta","shortestAngleDelta","delta","period","result","unwrapPoints","points","i","lonWinding","path","winding","closeContourAroundPole","poleLat","start","closed","steps","k","signedUnwrappedArea","unwrapped","area","solveSurfacePoint","elements","e","xi","eta","farSide","deltaT","getEclipseDeltaT","eta1","sinD1","cosD1","diskTerms","bSq","sign","B","sinU","zetaSq","E_SQ","zeta","finishSolution","solveLimbClampedSurfacePoint","groundFundamentalPoint","lat","lon","deltaTCorrection","EARTH_ROTATION_DEG_PER_HOUR","hourAngle","DEG","u","ONE_MINUS_F","rhoSinPhi","rhoCosPhi","fundamentalToLatLon","solution","rho1","cosU","theta","RAD","normalizeLongitude","RING_ARC_STEP","UMBRA_OUTLINE_SEED_SAMPLES","UMBRA_OUTLINE_DUPLICATE_CHORD_DEG","MARCH_INITIAL_STEP_DEG","MARCH_MIN_STEP_DEG","MARCH_MAX_STEP_DEG","MARCH_MAX_TURN_DEG","MARCH_STEP_GROW_FACTOR","MARCH_GRADIENT_STEP_DEG","MARCH_MARGIN_TOLERANCE","MARCH_CORRECTOR_ITERATIONS","MARCH_MAX_POINTS","MARCH_CLOSURE_MIN_POINTS","getInstantaneousUmbraOutline","elements","tau","z0","e","getBesselianElementsAtTime","outline","traceVisibleUmbraOutline","cleaned","dropNearDuplicatePoints","signedUnwrappedArea","lat","lon","normalizeLongitude","margin","groundMarginFunction","seed","findBoundarySeed","marchBoundary","deltaT","getEclipseDeltaT","xi","eta","zeta","groundFundamentalPoint","l2","distance","qStep","best","i","sample","shadowEdgePoint","correctOntoBoundary","points","position","stepDeg","advanced","advanceAlongBoundary","groundChordTooLong","tangent","boundaryTangent","step","predicted","movePoint","corrected","newTangent","turnDeg","RAD","gradient","marginGradient","length","h","cosLat","DEG","dLon","start","maxShiftDeg","iter","value","lengthSq","shift","clamped","direction","point","last","shadowEdgePoint","elements","e","q","useUmbra","farSide","z0","l0","tanF","cosQ","sinQ","radius","xi","eta","zeta","point","iter","solution","solveSurfacePoint","newRadius","terminatorRingPoint","elements","e","theta","sinUSeed","z0","cosTheta","sinTheta","sinU","xi","eta","iter","rho","E_SQ","ONE_MINUS_F","cosU","lat","RAD","thetaG","lon","normalizeLongitude","EARTH_ROTATION_DEG_PER_HOUR","getEclipseDeltaT","groundChordTooLong","a","b","maxChordDeg","dLat","dLon","shortestLonDelta","DEG","getGreenwichMeanSiderealTime","T","GMST","julianCenturiesJ20002julianDay","EPOCH_J2000","normalizeAngle","getGreenwichApparentSiderealTime","p","getNutationInLongitude","eRad","getTrueObliquityOfEcliptic","DEG","getLocalMeanSiderealTime","lon","LMST","getLocalApparentSiderealTime","getLocalHourAngle","rightAscension","LAST","spherical2rectangular","coords","lon","lat","radiusVector","lonRad","DEG","latRad","x","y","z","equatorialSpherical2topocentricSpherical","location","T","rightAscension","declination","elevation","dRad","rhoSinLat","getRhoSinLat","rhoCosLat","getRhoCosLat","piRad","getEquatorialParallax","LAST","getLocalApparentSiderealTime","HRad","getLocalHourAngle","A","B","C","q","HTopo","RAD","dTopoRad","normalizeAngle","equatorialSpherical2topocentricHorizontal","topoCoords","H","equatorialSpherical2topocentricHorizontalByLocalHourAngle","localHourAngle","ARad","hRad","equatorialSpherical2topocentricSphericalByLocalHourAngle","eclipticSpherical2equatorialSpherical","normalize","epsRad","getTrueObliquityOfEcliptic","n","d","rightAscensionRad","earthEclipticSpherical2sunEclipticSpherical","coordsEarth","lon","lat","radiusVector","normalizeAngle","getEquatorialParallax","d","angle","sec2deg","DEG","RAD","getRhoSinLat","lat","elevation","latRad","uRad","EARTH_AXIS_RATIO","getRhoCosLat","getAngularDiameter","distance","trueDiameter","RAD","REFRACTION_AT_HORIZON","CONVERGENCE_LIMIT","MAX_ITERATIONS","getTransit","location","jd0","getCoords","GAST","getGreenwichSiderealTimeAtMidnight","rightAscension","m","normalizeAngle","dm","cnt","coords","getLocalHourAngle","getRise","h0","getRiseSet","getSet","getStandardAltitude","options","angularDiameter","isRefractionConsidered","alignment","refraction","semiDiameter","sign","event","declination","mTransit","halfDiurnalArc","getHalfDiurnalArc","geocentricH","H","equatorialSpherical2topocentricSphericalByLocalHourAngle","altitude","equatorialSpherical2topocentricHorizontalByLocalHourAngle","DEG","lat","latRad","dRad","h0Rad","cosH0","RAD","lon","EARTH_SIDEREAL_ROTATION_PER_DAY","T","julianDay2julianCenturiesJ2000","getGreenwichApparentSiderealTime","TimeOfInterest","_TimeOfInterest","time","time2julianDay","julianDay2julianDayEphemeris","julianDay2julianCenturiesJ2000","date","year","month","day","hour","min","sec","dayOfYear","dayOfYear2time","jd","julianDay2time","jde","julianDayEphemeris2julianDay","T","julianCenturiesJ20002julianDay","pad","getDecimalYear","getDayOfYear","getDayOfWeek","isLeapYear","julianDay2julianDay0","julianDay2julianMillenniaJ2000","getGreenwichMeanSiderealTime","getGreenwichApparentSiderealTime","location","getLocalMeanSiderealTime","getLocalApparentSiderealTime","getDeltaT","AstronomicalObject","toi","TimeOfInterest","name","coords","eclipticSpherical2equatorialSpherical","spherical2rectangular","location","equatorialSpherical2topocentricSpherical","equatorialSpherical2topocentricHorizontal","azimuth","altitude","radiusVector","correctEffectOfRefraction","au2km","LIGHT_SPEED_KM_PER_SEC","jd","getTransit","limbAlignment","getRise","getSet","riseSet","isRefractionConsidered","h0","getStandardAltitude","AstronomicalObjectClass","vsop87EarthSphericalDateReduced_exports","__export","VSOP87_X","VSOP87_Y","VSOP87_Z","VSOP87_L0","VSOP87_L1","VSOP87_L2","VSOP87_L3","VSOP87_L4","VSOP87_L5","VSOP87_B0","VSOP87_B1","VSOP87_B2","VSOP87_B3","VSOP87_B4","VSOP87_B5","VSOP87_R0","VSOP87_R1","VSOP87_R2","VSOP87_R3","VSOP87_R4","VSOP87_R5","vsop87EarthSphericalJ2000Reduced_exports","__export","VSOP87_X","VSOP87_Y","VSOP87_Z","VSOP87_L0","VSOP87_L1","VSOP87_L2","VSOP87_L3","VSOP87_L4","VSOP87_L5","VSOP87_B0","VSOP87_B1","VSOP87_B2","VSOP87_B3","VSOP87_B4","VSOP87_B5","VSOP87_R0","VSOP87_R1","VSOP87_R2","VSOP87_R3","VSOP87_R4","VSOP87_R5","calculateVSOP87Angle","terms","t","calculateVSOP87","RAD","result","term","key","sumUpTerm","a","b","c","Earth","_Earth","AstronomicalObject","toi","vsop87Date","vsop87EarthSphericalDateReduced_exports","vsop87J2000","vsop87EarthSphericalJ2000Reduced_exports","spherical2rectangular","normalizeAngle","calculateVSOP87Angle","calculateVSOP87","getNutationInLongitude","getNutationInObliquity","getMeanObliquityOfEcliptic","getTrueObliquityOfEcliptic","Sun","_Sun","AstronomicalObject","toi","earth","Earth","spherical2rectangular","earthEclipticSpherical2sunEclipticSpherical","coords","correctEffectOfAberration","correctEffectOfNutation","getAngularDiameter","location","getLocalEclipseCircumstances","elements","location","tau","e","getBesselianElementsAtTime","deltaTCorrection","EARTH_ROTATION_DEG_PER_HOUR","getEclipseDeltaT","hourAngle","DEG","latRad","h","u","EARTH_AXIS_RATIO","rhoSinPhi","rhoCosPhi","sinH","cosH","xi","eta","zeta","uVal","vVal","isEclipseVisible","contactTaus","taus","sunSemiDiameter","getSunSemiDiameter","circumstances","altitude","getLocalHorizontalCoordinates","getApparentUpperSunLimbAltitude","getLocalEclipseType","l2","distance","getMagnitude","getMagnitude","circumstances","l1","l2","distance","getMoonSunRatio","getObscuration","eclipseType","getLocalEclipseType","magnitude","moonSunRatio","cNumerator","cDenominator","c","bNumerator","bDenominator","b","a","getLocalHorizontalCoordinates","location","hourAngle","sinD","cosD","lat","DEG","sinAltitude","altitude","RAD","azimuth","normalizeAngle","getSunSemiDiameter","elements","tau","toi","TimeOfInterest","tau2julianDay","Sun","getApparentUpperSunLimbAltitude","sunSemiDiameter","correctEffectOfRefraction","LocalEclipseCircumstances","_LocalEclipseCircumstances","elements","location","toi","julianDay2tau","getLocalEclipseCircumstances","getLocalEclipseType","options","getInstantaneousUmbraOutline","horizonSinAltitude","getMagnitude","getObscuration","getLocalHorizontalCoordinates","azimuth","altitude","radiusVector","correctEffectOfRefraction","ITERATION_TOLERANCE_HOURS","MAX_ITERATIONS","TIME_MARGIN_HOURS","SEARCH_RANGE_HOURS","HORIZON_SCAN_SAMPLES","HORIZON_BISECTION_ITERATIONS","getContactTaus","elements","location","obs","computeObserverGeocentric","max","findMaximum","atMax","snapshot","minDistSq","c1","findContact","c4","c2","c3","tauC2","tauC3","window","findVisibleWindow","contactTausToContactJulianDays","contactTaus","tau2julianDay","clampToVisibleWindow","contacts","start","end","visibleStart","visibleEnd","latRad","DEG","h","u","EARTH_AXIS_RATIO","startTau","tau","i","s","delta","inBounds","useUmbra","isAfterMax","sign","cross","discriminant","sqrtDisc","tauStart","tauEnd","margin","horizonMargin","tauAt","firstAbove","lastAbove","sunrise","bisectHorizon","sunset","tauMiddle","sunSemiDiameter","getSunSemiDiameter","altitude","getLocalHorizontalCoordinates","getApparentUpperSunLimbAltitude","lo","hi","low","high","lowBelow","mid","midBelow","e","getBesselianElementsAtTime","dMuDt","polynomialDerivative","dDDt","deltaTCorrection","EARTH_ROTATION_DEG_PER_HOUR","getEclipseDeltaT","hourAngle","sinH","cosH","xi","eta","zeta","xiDot","etaDot","dx","dy","v","uDot","vDot","getDuration","elements","location","contacts","getContactTaus","visible","clampToVisibleWindow","getCentralDuration","DEFAULT_STEP_SECONDS","TANGENT_ITERATIONS","TANGENT_CONVERGENCE_RAD","TOUCH_TIME_ITERATIONS","CAP_PROBE_DOUBLINGS","CAP_EDGE_ITERATIONS","CAP_EDGE_SEED_DIVISOR","CAP_MAX_CHORD_DEG","CAP_MAX_DEPTH","CROSSING_ITERATIONS","calculateUmbraPathPolygon","elements","options","z0","horizonSinAltitude","stepHours","taus","tau","onSurface","umbraTouchesSurface","first","last","sideA","sideB","i","a","b","getUmbraLimitPoints","touchStartTau","touchTau","touchEndTau","capStart","horizonCap","touchPointFallback","capEnd","ring","point","signedUnwrappedArea","e","getBesselianElementsAtTime","derivatives","polynomialDerivative","DEG","limitPoint","branch","xi","eta","zeta","solveSurfacePoint","q","iter","qNew","tangentPositionAngle","edge","umbraEdgePoint","shortestAngleDelta","xDot","yDot","lDot","muDot","dDot","xiDot","etaDot","zetaDot","lEffective","c","alpha","tauOff","tauOn","off","on","tauMid","touchTauValue","tipDirection","fromJunction","toJunction","anchor","k","offset","ringCrossingAt","tipTau","crossingWindowEdge","tip","farTau","fromTau","branchTau","toTau","fromSide","branchSide","toSide","fromPoint","toPoint","cap","subdivideCrossings","junction","plus","minus","latLonChordDeg","direction","inside","outside","step","bad","tauA","pointA","tauB","pointB","side","depth","pointMid","radius","axisDistance","ux","uy","sinU","ONE_MINUS_F","ringRadiusSq","E_SQ","along","halfChordSq","halfChord","nextXi","nextEta","moved","terminatorRingPoint","farSide","sample","shadowEdgePoint","MOTION_STEP_HOURS","getUmbraPathWidth","elements","tau","a","b","getUmbraLimitPoints","getDistanceInKm","perpendicularFraction","before","centralLinePoint","after","cosLat","DEG","motionEast","shortestLonDelta","motionNorth","spanEast","spanNorth","motionLength","spanLength","getBesselianElementsAtTime","solution","solveSurfacePoint","LocalSolarEclipse","_LocalSolarEclipse","elements","location","contactTaus","c1","c4","max","sunrise","sunset","getLocalEclipseCircumstances","getContactTaus","isEclipseVisible","toi","LocalEclipseCircumstances","getLocalEclipseType","contactsJd","contactTausToContactJulianDays","TimeOfInterest","getMagnitude","getMoonSunRatio","getObscuration","type","getUmbraPathWidth","getDuration","getCentralDuration","DEFAULT_STEP_SECONDS","SEED_SCAN_SAMPLES","TRACE_INITIAL_STEP_DEG","TRACE_MIN_STEP_DEG","TRACE_MAX_STEP_DEG","TRACE_MAX_TURN_DEG","TRACE_STEP_GROW_FACTOR","TRACE_JACOBIAN_STEP_DEG","TRACE_JACOBIAN_STEP_HOURS","TRACE_RESIDUAL_TOLERANCE","TRACE_CORRECTOR_ITERATIONS","TRACE_MAX_POINTS_PER_DIRECTION","TRACE_TAU_MARGIN_HOURS","HORIZON_BISECTION_ITERATIONS","getCentralLine","elements","options","stepHours","traceCentralLine","horizonSinAltitude","traceCentralLine","elements","z0","stepHours","seed","findSeedState","forward","traceDirection","toLatLon","lat","lon","normalizeLongitude","best","bestAxisDistance","i","SEED_SCAN_SAMPLES","tau","e","getBesselianElementsAtTime","axisDistance","solution","solveSurfacePoint","correctOntoCurve","direction","points","state","previousTangent","curveTangent","negate","stepDeg","TRACE_INITIAL_STEP_DEG","TRACE_MAX_POINTS_PER_DIRECTION","advanced","advanceAlongCurve","groundZeta","endpoint","bisectHorizonEndpoint","TRACE_TAU_MARGIN_HOURS","TRACE_MAX_TURN_DEG","TRACE_STEP_GROW_FACTOR","TRACE_MAX_STEP_DEG","step","predicted","predictState","corrected","tangent","turnDeg","groundTurnDeg","TRACE_MIN_STEP_DEG","groundSpeed","groundMagnitude","scale","start","iter","TRACE_CORRECTOR_ITERATIONS","residual","curveResidual","TRACE_RESIDUAL_TOLERANCE","jacobian","residualJacobian","delta","minimalNormSolution","orient","length","normalized","dot","hDeg","TRACE_JACOBIAN_STEP_DEG","hTau","TRACE_JACOBIAN_STEP_HOURS","latPlus","latMinus","lonPlus","lonMinus","tauPlus","tauMinus","a","b","c","det","alpha","beta","above","below","HORIZON_BISECTION_ITERATIONS","mid","candidate","ground","groundFundamentalPoint","getEclipseDeltaT","previous","next","cosLat","DEG","v1","v2","l1","l2","cos","RAD","vector","traceMaskContours","inside","width","height","adjacency","crossings","collectCellSegments","loops","visited","start","loop","previous","current","crossing","neighbors","next","at","x","y","edge","horizontal","key","x2","y2","link","a","b","cy","cx","pattern","top","bottom","left","right","COARSE_STEP_HOURS","DEPTH_OUT_SLACK","DEPTH_IN_SLACK","ZETA_SLACK","PENUMBRA_TILE_SIZE","TILE_SIZE","TILE_SLACK","pixelCenterLon","px","width","pixelCenterLat","py","height","buildScanContext","elements","z0","ghaOffset","EARTH_ROTATION_DEG_PER_HOUR","getEclipseDeltaT","DEG","count","COARSE_STEP_HOURS","taus","xs","ys","l1s","sinDs","cosDs","sinGs","cosGs","i","tau","e","getBesselianElementsAtTime","gha","parametricLatitude","latRad","sinLat","cosLat","norm","ONE_MINUS_F","stateAtTau","ctx","lonRad","sinU","cosU","H","sinH","cosH","pSinU","xi","cosUcosH","zeta","eta","separationAtTau","tau2","tau3","cd","d","cMu","cx","x","cy","y","GOLDEN","refineMaxEclipse","bestIndex","a","b","t1","t2","m1","m2","iter","isMaxEclipseVisible","sinLon","cosLon","bestMSq","bestZeta","mSq","m","depth","DEPTH_OUT_SLACK","DEPTH_IN_SLACK","ZETA_SLACK","state","isMaxEclipseVisibleAt","latDeg","lonDeg","computePenumbraInsideBand","elements","width","height","z0","yStart","yEnd","inside","ctx","buildScanContext","count","lonRads","sinLons","cosLons","px","lonRad","pixelCenterLon","DEG","sinUs","cosUs","py","sinU","cosU","parametricLatitude","pixelCenterLat","clearance","sinGs","cosGs","xs","ys","sinDs","cosDs","l1s","absTanF1","sinLon","cosLon","pSinU","ONE_MINUS_F","best","i","sinH","cosH","xi","eta","gap","tileY","TILE_SIZE","tileYEnd","tileX","xEnd","TILE_SLACK","rowOffset","isMaxEclipseVisible","GRID_WIDTH","GRID_HEIGHT","REFINEMENT_ITERATIONS","calculatePenumbraPathPolygon","elements","options","z0","horizonSinAltitude","inside","computePenumbraInsideBand","loops","traceMaskContours","ctx","buildScanContext","ring","loop","closeAroundEnclosedPole","crossing","refineCrossing","largest","candidate","signedUnwrappedArea","normalized","lat","lon","normalizeLongitude","winding","lonWinding","poleLat","isMaxEclipseVisibleAt","closeContourAroundPole","gridPointLatLon","outside","iter","mid","x","y","pixelCenterLat","pixelCenterLon","isOnSunsetSide","point","e","deltaT","lonRad","DEG","H","EARTH_ROTATION_DEG_PER_HOUR","calculateShadowBoundaryPoint","elements","e","q","useUmbra","l0","tanF","sinQ","cosQ","radius","result","iter","xi","eta","rho1","E_SQ","eta1","bSq","B","sinD1","cosD1","ONE_MINUS_F","sinU","zetaSq","zeta","newRadius","fundamentalToLatLon","penumbraBoundaryFundamental","solution","solveSurfacePoint","calculateSunriseBoundary","elements","z0","calculateRiseSetBoundary","calculateSunsetBoundary","isSunset","best","run","calculateRiseSetRuns","cycle","assembleRunCycle","p","deltaT","getEclipseDeltaT","runs","current","prevCount","lastSingleBranch","feed","crossings","leadingEdge","trailingEdge","leadingLast","trailingLast","c0","c1","dLL0","latLonDistSq","dLL1","dTL0","dTL1","c","target","feedTipNeighborhood","tangentTau","gridTau","span","N","RISE_SET_TIP_REFINEMENT_SAMPLES","i","k","crossingsAtTau","needsSubdivision","ends","end","dLon","DEG","dLat","RISE_SET_MAX_CHORD_DEG","feedRefined","tauA","tauB","crossingsB","depth","mid","tau","RISE_SET_BOUNDARY_STEP_HOURS","tangent","bisectEndTangent","RISE_SET_GAP_SUBDIVISION_DEPTH","tauWithTwo","tauWithLess","twoSide","lessSide","iter","e","getBesselianElementsAtTime","tangencyPoint","refineTangentToHorizon","dlon","avgLon","dx","polynomialDerivative","dy","qVelocity","collectCrossings","RISE_SET_BOUNDARY_Q_SAMPLES","pts","calculateShadowBoundaryPoint","result","j","p1","p2","q1","q2","crossing","findNullBoundary","point","refineCrossingToHorizon","qCrossing","isOnSunsetSide","qNonNull","qNull","nonNullSide","nullSide","qMid","geometric","fundamental","penumbraBoundaryFundamental","xiSeed","etaSeed","penumbraRadius","axisDistance","ux","uy","xi","eta","sinU","ONE_MINUS_F","ringRadiusSq","E_SQ","ringRadius","along","halfChordSq","halfChord","baseXi","baseEta","candidate1Xi","candidate1Eta","candidate2Xi","candidate2Eta","dist1","dist2","nextXi","nextEta","moved","terminatorRingPoint","next","a","b","MAX_ITERATIONS","ITERATION_TOLERANCE_HOURS","ECLIPSE_SEARCH_RANGE_HOURS","getLocationOfGreatestEclipse","elements","tau","getTauOfGreatestEclipse","getBesselianElementsAtTime","dist","xi","eta","lat","lon","solveLimbClampedSurfacePoint","getEclipseDeltaT","getJulianDayOfGreatestEclipse","getGamma","distance","i","e","xp","polynomialDerivative","yp","nSq","delta","ECLIPSE_SEARCH_RANGE_HOURS","getEclipseType","elements","tau","getTauOfGreatestEclipse","location","getLocationOfGreatestEclipse","circumstances","getLocalEclipseCircumstances","localType","getLocalEclipseType","isHybridEclipse","hasUmbra","hasAntumbra","x","polynomial","y","r2","l2","zeta","SolarEclipse","_SolarEclipse","elements","getLocationOfGreatestEclipse","getTauOfGreatestEclipse","getLocalEclipseCircumstances","location","LocalSolarEclipse","getEclipseType","jd","getJulianDayOfGreatestEclipse","TimeOfInterest","getGamma","getMagnitude","getMoonSunRatio","getObscuration","getUmbraPathWidth","getDuration","getCentralDuration","options","getCentralLine","calculateUmbraPathPolygon","calculatePenumbraPathPolygon","calculateSunriseBoundary","horizonSinAltitude","calculateSunsetBoundary"]}